displacement_mapping.hpp optional serif/backend/mfem/discretization/dof_map.hpp src/include/serif/backend/mfem/model/volume_displacement.hpp src/lib/serif/backend/mfem/model/deformation.cpp serif serif::geometry serif::geometry::deformation serif::geometry::deformation::backend serif::geometry::deformation::backend::mfem #pragmaonce #include<optional> #include"serif/backend/mfem/discretization/dof_map.hpp" namespaceserif::geometry::deformation::backend::mfem{ template<typenameFunction> voidfor_each_displacement_coefficient(constdiscretization::backend::mfem::DofMap&binding,Function&&visit){ const::mfem::FiniteElementSpace&space=binding.space(); constintnodes=space.GetNDofs(); if(binding.constrained()){ //Restrictionselectsonelocalrepresentativeperindependentcoefficient. //Visitingeveryidentityrowofprolongationcouldcountthesamecoefficienttwice. for(introw=0;row<binding.size();++row){ constintlocal=binding.full_dof(row); constintcomponent=space.GetOrdering()==::mfem::Ordering::byNODES?local/nodes:local%space.GetVDim(); constintnode=space.GetOrdering()==::mfem::Ordering::byNODES?local%nodes:local/space.GetVDim(); visit(row,node+component*nodes); } return; } for(intcomponent=0;component<space.GetVDim();++component){ for(intnode=0;node<nodes;++node){ conststd::optional<int>row=binding.reduced_dof(space.DofToVDof(node,component)); if(row){ visit(*row,node+component*nodes); } } } } }//namespaceserif::geometry::deformation::backend::mfem