evaluator.hpp memory mfem/fem/gridfunc.hpp mfem/fem/eltrans.hpp mfem/fem/intrules.hpp mfem/linalg/vector.hpp mfem/general/array.hpp serif/backend/mfem/mapping/domain_mapper.hpp serif/backend/mfem/mapping/context.hpp serif/backend/mfem/mapping/status.hpp src/include/serif/backend/mfem/solver/seed/state.hpp src/lib/serif/backend/mfem/mapping/evaluator.cpp src/lib/serif/backend/mfem/projection/radial.cpp serif::mapping::GridFunctionMappingEvaluator serif serif::mapping #pragmaonce #include<memory> #include"mfem/fem/gridfunc.hpp" #include"mfem/fem/eltrans.hpp" #include"mfem/fem/intrules.hpp" #include"mfem/linalg/vector.hpp" #include"mfem/general/array.hpp" #include"serif/backend/mfem/mapping/domain_mapper.hpp" #include"serif/backend/mfem/mapping/context.hpp" #include"serif/backend/mfem/mapping/status.hpp" namespaceserif::mapping{ //NotethisisNOTthreadsafe. classGridFunctionMappingEvaluator{ public: /* *Theevaluatorreferencesthesuppliedgridfunctionsandcachescopiesof *theirelement-localDOFs.YouneedtomakesureyoucallInvalidateCache()orRefresh()aftereither *gridfunction'svaluesaremodified.Changestothefinite-element-spacesequence *shouldbedetectedautomatically. * *Thisobjectownsmutableworkspaceandcachestateand*isnot*thread-safe. */ GridFunctionMappingEvaluator( constDomainMapper&mapper, constmfem::GridFunction&displacement, constmfem::GridFunction&compactification_coordinate ); [[nodiscard]]constmfem::Mesh*mesh()constnoexcept{ constmfem::FiniteElementSpace*space=m_displacement.FESpace(); returnspace==nullptr?nullptr:space->GetMesh(); } voidinvalidate_cache()noexcept; voidrefresh(); [[nodiscard]]MappingStatusevaluate_point( mfem::ElementTransformation&transformation, constmfem::IntegrationPoint&integration_point, MappingPointContext&context ); [[nodiscard]]MappingStatusevaluate_volume( mfem::ElementTransformation&transformation, constmfem::IntegrationPoint&integration_point, VolumeMappingContext&context ); [[nodiscard]]MappingStatusevaluate_face( mfem::FaceElementTransformations&transformation, FaceElementSideside, constmfem::IntegrationPoint&integration_point, FaceMappingContext&context ); private: voidvalidate_field_bindings()const; [[nodiscard]]boolinvalidate_for_changed_spaces(); voidload_element(intelement_id); private: constDomainMapper&m_mapper; constmfem::GridFunction&m_displacement; constmfem::GridFunction&m_compactification_coordinate; constmfem::FiniteElementSpace*m_displacement_space; constmfem::FiniteElementSpace*m_compactification_space; longm_displacement_space_sequence; longm_compactification_space_sequence; DMWorkspacem_workspace; mfem::Array<int>m_displacement_dofs; mfem::Array<int>m_compactification_dofs; mfem::Vectorm_element_displacement; mfem::Vectorm_element_compactification; std::unique_ptr<ElementDisplacementData>m_displacement_data; std::unique_ptr<ElementCompactificationData>m_compactification_data; intm_cached_element_id{-1}; }; }