module; #include export module mean_field:integrators.mass_continuity; import :mapping.domain_mapper; export namespace mean_field::integrators { class ContinuityVolumeIntegrator : public mfem::BlockNonlinearFormIntegrator { public: ContinuityVolumeIntegrator( const mapping::DomainMapper &mapper, const mfem::GridFunction &displacement, const mfem::GridFunction &compactification_coordinate ); void AssembleElementVector( const mfem::Array &el, mfem::ElementTransformation &Tr, const mfem::Array &elfun, const mfem::Array &elvec ) override; void AssembleElementGrad( const mfem::Array &el, mfem::ElementTransformation &Tr, const mfem::Array &elfun, const mfem::Array2D &elmats ) override; private: mapping::GridFunctionMappingEvaluator m_mapping; }; class ContinuityFaceIntegrator : public mfem::BlockNonlinearFormIntegrator { public: ContinuityFaceIntegrator( const mapping::DomainMapper &mapper, const mfem::GridFunction &displacement, const mfem::GridFunction &compactification_coordinate ); void AssembleFaceVector( const mfem::Array &el1, const mfem::Array &el2, mfem::FaceElementTransformations &Tr, const mfem::Array &elfun, const mfem::Array &elvect ) override; void AssembleFaceGrad( const mfem::Array &el1, const mfem::Array &el2, mfem::FaceElementTransformations &Tr, const mfem::Array &elfun, const mfem::Array2D &elmats ) override; private: static bool skip_face(const mfem::FaceElementTransformations &Tr); static double compute_u_n( const mfem::Vector &v_dofs, const mfem::Vector &shape_v_minus, const mfem::Vector &n_unit, int dof_v_minus, int dim ); private: mapping::GridFunctionMappingEvaluator m_mapping; }; } // namespace mean_field::integrators