diff --git a/Solver/solverAlgorithms.h b/Solver/solverAlgorithms.h index 78d5a8472b5f892cbb37cb3a031c6c9f78dd526f..0e74adc5a321d695c7d3e5fae424b4987fccecd9 100644 --- a/Solver/solverAlgorithms.h +++ b/Solver/solverAlgorithms.h @@ -36,6 +36,27 @@ template<class Iterator, class Assembler> void Assemble(BilinearTermBase &term, } } +template<class Iterator, class Assembler> void Assemble(BilinearTermBase &term, FunctionSpaceBase &space, + Iterator itbegin, Iterator itend, + QuadratureBase &integrator, Assembler &assembler, + elementFilter& efilter) + // symmetric +{ + fullMatrix<typename Assembler::dataMat> localMatrix; + std::vector<Dof> R; + for (Iterator it = itbegin; it != itend; ++it){ + MElement *e = *it; + if (efilter(e)){ + R.clear(); + IntPt *GP; + int npts = integrator.getIntPoints(e, &GP); + term.get(e, npts, GP, localMatrix); //localMatrix.print(); + space.getKeys(e, R); + assembler.assemble(R, localMatrix); + } + } +} + template<class Assembler> void Assemble(BilinearTermBase &term, FunctionSpaceBase &space, MElement *e, QuadratureBase &integrator, Assembler &assembler) // symmetric { @@ -110,6 +131,26 @@ template<class Iterator, class Assembler> void Assemble(LinearTermBase<double> & } } +template<class Iterator, class Assembler> void Assemble(LinearTermBase<double> &term, FunctionSpaceBase &space, + Iterator itbegin, Iterator itend, + QuadratureBase &integrator, Assembler &assembler, + elementFilter& efilter) +{ + fullVector<typename Assembler::dataMat> localVector; + std::vector<Dof> R; + for (Iterator it = itbegin; it != itend; ++it){ + MElement *e = *it; + if (efilter(e)){ + R.clear(); + IntPt *GP; + int npts = integrator.getIntPoints(e, &GP); + term.get(e, npts, GP, localVector); //localVector.print(); + space.getKeys(e, R); + assembler.assemble(R, localVector); + } + } +} + template<class Assembler> void Assemble(LinearTermBase<double> &term, FunctionSpaceBase &space, MElement *e, QuadratureBase &integrator, Assembler &assembler) { @@ -136,6 +177,23 @@ template<class Iterator, class dataMat> void Assemble(ScalarTermBase<double> &te } } +template<class Iterator, class dataMat> void Assemble(ScalarTermBase<double> &term, + Iterator itbegin, Iterator itend, + QuadratureBase &integrator, dataMat & val, + elementFilter& efilter) +{ + dataMat localval; + for (Iterator it = itbegin; it != itend; ++it){ + MElement *e = *it; + if (efilter(e)){ + IntPt *GP; + int npts = integrator.getIntPoints(e, &GP); + term.get(e, npts, GP, localval); + val += localval; + } + } +} + template<class Iterator, class dataMat> void Assemble(ScalarTermBase<double> &term, MElement *e, QuadratureBase &integrator, dataMat & val) {