diff --git a/src/problem/Formulation.cpp b/src/problem/Formulation.cpp index b539e1b7e274ac74ec62b571f775cecd83f68e95..f4982bbeefeb4446e83c0c3adae7199527dc78b1 100644 --- a/src/problem/Formulation.cpp +++ b/src/problem/Formulation.cpp @@ -1031,35 +1031,6 @@ namespace gmshddm _artificialCommutator = true; togglePhysicalAndArtificialSourceTerms(); - auto deactivateBilinear = [=](const unsigned long long idom) { - for(auto formulation : *_volume[idom]) { - if(formulation->isBilinear()) { - formulation->deactivate(); - } - } - for(auto formulation : _surface[idom]) { - for(auto term : *formulation.second) { - if(term->isBilinear()) { - term->deactivate(); - } - } - } - }; - - auto activateBilinear = [=](const unsigned long long idom) { - for(auto formulation : *_volume[idom]) { - if(formulation->isBilinear()) { - formulation->activate(); - } - } - for(auto formulation : _surface[idom]) { - for(auto term : *formulation.second) { - if(term->isBilinear()) { - term->activate(); - } - } - } - }; // Assemble the volumic systems for each subdomain for(auto idom = 0ULL; idom < _volume.size(); ++idom) { @@ -1068,7 +1039,7 @@ namespace gmshddm _volume[idom]->setAttribute("ddm::artificialCommutator", _artificialCommutator); gmshfem::common::Options::instance()->verbose = innerVerbosity; if(sameMatrixWithArtificialAndPhysicalSources) { - deactivateBilinear(idom); + _deactivateBilinear(idom); _volume[idom]->setRHSToZero(); _volume[idom]->assemble(); } @@ -1077,7 +1048,7 @@ namespace gmshddm _volume[idom]->initSystem(); _volume[idom]->pre(); _volume[idom]->assemble(); - deactivateBilinear(idom); + _deactivateBilinear(idom); } gmshfem::common::Options::instance()->verbose = outerVerbosity; } @@ -1125,12 +1096,12 @@ namespace gmshddm if(mpi::isItMySubdomain(idom)) { gmshfem::common::Options::instance()->verbose = innerVerbosity; if(!sameMatrixWithArtificialAndPhysicalSources) { - activateBilinear(idom); + _activateBilinear(idom); } _volume[idom]->assemble(); _volume[idom]->solve(true); if(sameMatrixWithArtificialAndPhysicalSources) { - activateBilinear(idom); + _activateBilinear(idom); } gmshfem::common::Options::instance()->verbose = outerVerbosity; } @@ -1175,35 +1146,7 @@ namespace gmshddm _artificialCommutator = true; togglePhysicalAndArtificialSourceTerms(); - auto deactivateBilinear = [=](const unsigned long long idom) { - for(auto formulation : *_volume[idom]) { - if(formulation->isBilinear()) { - formulation->deactivate(); - } - } - for(auto formulation : _surface[idom]) { - for(auto term : *formulation.second) { - if(term->isBilinear()) { - term->deactivate(); - } - } - } - }; - auto activateBilinear = [=](const unsigned long long idom) { - for(auto formulation : *_volume[idom]) { - if(formulation->isBilinear()) { - formulation->activate(); - } - } - for(auto formulation : _surface[idom]) { - for(auto term : *formulation.second) { - if(term->isBilinear()) { - term->activate(); - } - } - } - }; for(auto idom = 0ULL; idom < _volume.size(); ++idom) { _volume[idom]->setAttribute("ddm::physicalCommutator", _physicalCommutator); @@ -1213,7 +1156,7 @@ namespace gmshddm _volume[idom]->initSystem(); _volume[idom]->pre(); _volume[idom]->assemble(); - deactivateBilinear(idom); + _deactivateBilinear(idom); gmshfem::common::Options::instance()->verbose = outerVerbosity; } @@ -1250,7 +1193,7 @@ namespace gmshddm } for(auto idom = 0ULL; idom < _volume.size(); ++idom) { - activateBilinear(idom); + _activateBilinear(idom); } @@ -1415,6 +1358,40 @@ namespace gmshddm } } + template< class T_Scalar > + void Formulation< T_Scalar >::_activateBilinear(const unsigned long long idom) + { + for(auto formulation : *_volume[idom]) { + if(formulation->isBilinear()) { + formulation->activate(); + } + } + for(auto formulation : _surface[idom]) { + for(auto term : *formulation.second) { + if(term->isBilinear()) { + term->activate(); + } + } + } + } + + template< class T_Scalar > + void Formulation< T_Scalar >::_deactivateBilinear(const unsigned long long idom) + { + for(auto formulation : *_volume[idom]) { + if(formulation->isBilinear()) { + formulation->deactivate(); + } + } + for(auto formulation : _surface[idom]) { + for(auto term : *formulation.second) { + if(term->isBilinear()) { + term->deactivate(); + } + } + } + } + template< class T_Scalar > int MatVectProductImpl(Mat A, Vec X, Vec Y, bool IA) diff --git a/src/problem/Formulation.h b/src/problem/Formulation.h index a20579ec482b612a173e835f8ef227a5c096eabb..9b98c67e8d657c6628ac932beac30df0634862e5 100644 --- a/src/problem/Formulation.h +++ b/src/problem/Formulation.h @@ -79,6 +79,9 @@ namespace gmshddm void _assembleAndSolveSurface(); void _extractRHS(); + void _activateBilinear (const unsigned long long idom); + void _deactivateBilinear (const unsigned long long idom); + public: Formulation(const std::string &name, const std::vector< std::vector< unsigned int > > &topology); Formulation(const std::string &name, const std::vector< gmshfem::problem::Formulation< T_Scalar > * > &volume, const std::vector< std::unordered_map< unsigned int, gmshfem::problem::Formulation< T_Scalar > * > > &surface);