inputs.hpp algorithm array ranges span utility vector mfem/fem/fespace.hpp serif/discretization/domain/schema/schemas.hpp serif/discretization/domain/schema/concepts.hpp serif/geometry/deformation/models.hpp serif/backend/mfem/shared/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/backend/mfem/geometry/deformation/computations.hpp src/include/serif/backend/mfem/model/binding.hpp src/include/serif/backend/mfem/model/discretization.hpp src/include/serif/backend/mfem/model/surface_potential.hpp src/include/serif/backend/mfem/model/volume_displacement.hpp src/include/serif/backend/mfem/serialize/resources.hpp src/include/serif/backend/mfem/solver/continuation/detail/physical_transfer.hpp src/lib/serif/backend/mfem/geometry/deformation/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::ShapeCoefficientTracking 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 serif::geometry::deformation::backend::mfem::detail #pragmaonce #include<algorithm> #include<array> #include<ranges> #include<span> #include<utility> #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/backend/mfem/shared/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; } }; structShapeCoefficientTracking:DeformationValueTracking{ [[nodiscard]]std::vector<double>capture(std::span<constdouble>coefficients)const{ return{coefficients.begin(),coefficients.end()}; } [[nodiscard]]boolmatches(conststd::vector<double>&captured,std::span<constdouble>coefficients)const{ returnstd::ranges::equal(captured,coefficients); } }; structSurfaceDiscretizationTracking:DeformationValueTracking{ structSnapshot{ ::serif::backend::mfem::shared::ReferenceMeshSnapshotmesh; ::serif::backend::mfem::shared::ReferenceSpaceSnapshotspace; intsurface_attribute; }; [[nodiscard]]Snapshotcapture(constSurfaceDiscretization&input)const; [[nodiscard]]boolmatches(constSnapshot&snapshot,constSurfaceDiscretization&input)const; }; structReferenceDiscretizationTracking:DeformationValueTracking{ structSnapshot{ std::array<::serif::backend::mfem::shared::ReferenceMeshSnapshot,2>meshes; std::array<::serif::backend::mfem::shared::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; } namespacedetail{ template<typenameSurface,typenameInterior,typenameVacuum,utils::dependencies::IsResourceShapeResource> [[nodiscard]]autodeformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&model,constReferenceDiscretization&discretization,ShapeResourcecoefficients){ 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{}), std::move(coefficients)); } }//namespacedetail template<typenameSurface,typenameInterior,typenameVacuum> [[nodiscard]]automake_deformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&model,constReferenceDiscretization&discretization,conststd::vector<double>&coefficients){ returndetail::deformation_inputs(model,discretization,utils::dependencies::borrow<keys::ShapeCoefficients>(coefficients,DeformationValueTracking{})); } template<typenameSurface,typenameInterior,typenameVacuum> [[nodiscard]]automake_deformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&model,constReferenceDiscretization&discretization,std::span<constdouble>coefficients){ returndetail::deformation_inputs(model,discretization,utils::dependencies::own<keys::ShapeCoefficients>(coefficients,ShapeCoefficientTracking{})); } template<typenameSurface,typenameInterior,typenameVacuum,std::ranges::rangeCoefficients> requires(!std::ranges::borrowed_range<Coefficients>) voidmake_deformation_inputs(constDomainDeformation<Surface,Interior,Vacuum>&,constReferenceDiscretization&,Coefficients&&)=delete; }//namespaceserif::geometry::deformation::backend::mfem