inputs.hpp array vector mfem/fem/fespace.hpp serif/discretization/domain/schema/schemas.hpp serif/discretization/domain/schema/concepts.hpp serif/geometry/deformation/models.hpp serif/geometry/deformation/backend/mfem/detail/reference_tracking.hpp serif/geometry/deformation/computations.hpp serif/utils/dependencies/dependency_context.hpp src/compile_time_checks/serif/geometry/deformation_meanfield.cpp src/include/serif/geometry/deformation/backend/mfem/computations.hpp src/include/serif/geometry/deformation/backend/mfem/volume_displacement.hpp src/lib/serif/geometry/deformation/backend/mfem/inputs.cpp serif::geometry::deformation::backend::mfem::ReferenceDiscretization serif::geometry::deformation::backend::mfem::SurfaceDiscretization serif::geometry::deformation::backend::mfem::DeformationValueTracking serif::geometry::deformation::backend::mfem::SurfaceDiscretizationTracking serif::geometry::deformation::backend::mfem::SurfaceDiscretizationTracking::Snapshot serif::geometry::deformation::backend::mfem::ReferenceDiscretizationTracking serif::geometry::deformation::backend::mfem::ReferenceDiscretizationTracking::Snapshot serif serif::geometry serif::geometry::deformation serif::geometry::deformation::backend serif::geometry::deformation::backend::mfem #pragmaonce #include<array> #include<vector> #include"mfem/fem/fespace.hpp" #include"serif/discretization/domain/schema/schemas.hpp" #include"serif/discretization/domain/schema/concepts.hpp" #include"serif/geometry/deformation/models.hpp" #include"serif/geometry/deformation/backend/mfem/detail/reference_tracking.hpp" #include"serif/geometry/deformation/computations.hpp" #include"serif/utils/dependencies/dependency_context.hpp" namespaceserif::geometry::deformation::backend::mfem { structReferenceDiscretization { const::mfem::FiniteElementSpace&scalar_space; const::mfem::FiniteElementSpace&displacement_space; ::mfem::Mesh&logical_mesh; std::vector<int>stellar_attributes; std::vector<int>vacuum_attributes; intsurface_attribute; intinfinity_attribute; }; structSurfaceDiscretization { const::mfem::FiniteElementSpace&scalar_space; intsurface_attribute; }; structDeformationValueTracking:utils::dependencies::ValueSnapshot { template<typenameValue> [[nodiscard]]constvoid*identity(constValue&)constnoexcept { returnnullptr; } }; structSurfaceDiscretizationTracking:DeformationValueTracking { structSnapshot { detail::ReferenceMeshSnapshotmesh; detail::ReferenceSpaceSnapshotspace; intsurface_attribute; }; [[nodiscard]]Snapshotcapture(constSurfaceDiscretization&input)const; [[nodiscard]]boolmatches(constSnapshot&snapshot,constSurfaceDiscretization&input)const; }; structReferenceDiscretizationTracking:DeformationValueTracking { structSnapshot { std::array<detail::ReferenceMeshSnapshot,2>meshes; std::array<detail::ReferenceSpaceSnapshot,2>spaces; std::vector<int>stellar_attributes; std::vector<int>vacuum_attributes; intsurface_attribute; intinfinity_attribute; }; [[nodiscard]]Snapshotcapture(constReferenceDiscretization&input)const; [[nodiscard]]boolmatches(constSnapshot&snapshot,constReferenceDiscretization&input)const; }; template<discretization::domain::schema::IsSchemaSchema=discretization::domain::schema::CoreEnvelopeVacuumDomainSchema> requires(Schema::templatecontains_domain<discretization::domain::StellarDomains>()&&Schema::templatecontains_domain<discretization::domain::VacuumDomain>()&&Schema::templatecontains_boundary<discretization::domain::StellarSurfaceBoundary>()&&Schema::templatecontains_boundary<discretization::domain::InfinitySurfaceBoundary>()) [[nodiscard]]ReferenceDiscretizationdeformation_discretization(const::mfem::FiniteElementSpace&scalar_space,const::mfem::FiniteElementSpace&displacement_space,::mfem::Mesh&logical_mesh) { ReferenceDiscretizationresult{ .scalar_space=scalar_space, .displacement_space=displacement_space, .logical_mesh=logical_mesh, .stellar_attributes={}, .vacuum_attributes={}, .surface_attribute=Schema::templateboundary_id<discretization::domain::StellarSurfaceBoundary>(), .infinity_attribute=Schema::templateboundary_id<discretization::domain::InfinitySurfaceBoundary>()}; for(constauto&domain:Schema::domain_descriptors()) { if(Schema::templatedomain_id_belongs_to<discretization::domain::StellarDomains>(domain.ID)) { result.stellar_attributes.push_back(domain.ID); } if(Schema::templatedomain_id_belongs_to<discretization::domain::VacuumDomain>(domain.ID)) { result.vacuum_attributes.push_back(domain.ID); } } returnresult; } template<typenameSurface,typenameInterior,typenameVacuum> [[nodiscard]]automake_deformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&model,constReferenceDiscretization&discretization,conststd::vector<double>&coefficients) { usingnamespaceutils::dependencies; returnmake_dependency_context( own<keys::ReferenceDiscretization>(discretization,ReferenceDiscretizationTracking{}), own<keys::SurfaceDiscretization>(SurfaceDiscretization{.scalar_space=discretization.scalar_space,.surface_attribute=discretization.surface_attribute},SurfaceDiscretizationTracking{}), borrow<keys::ReferenceCoordinates>(discretization.scalar_space,track_by([](const::mfem::FiniteElementSpace&space) { const::mfem::Mesh*mesh=space.GetMesh(); returnstd::pair{mesh,mesh?mesh->GetNodesSequence():-1L}; })), own<keys::SurfaceModel>(model.surface,DeformationValueTracking{}), own<keys::InteriorModel>(model.stellar_interior,DeformationValueTracking{}), own<keys::VacuumModel>(model.vacuum,DeformationValueTracking{}), borrow<keys::ShapeCoefficients>(coefficients,DeformationValueTracking{})); } template<typenameSurface,typenameInterior,typenameVacuum> voidmake_deformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&,constReferenceDiscretization&,conststd::vector<double>&&)=delete; }//namespaceserif::geometry::deformation::backend::mfem