discretization.hpp memory utility serif/backend/mfem/operators/volume_data.hpp serif/backend/mfem/geometry/deformation/inputs.hpp serif/utils/error/errors.hpp src/include/serif/backend/mfem/model/equilibrium.hpp src/include/serif/backend/mfem/model/finite_elements.hpp src/include/serif/backend/mfem/serialize/discretization.hpp serif::model::backend::mfem::NoDeformation serif::model::backend::mfem::DeformationDiscretization serif::model::backend::mfem::StellarDiscretization serif serif::model serif::model::backend serif::model::backend::mfem #pragmaonce #include<memory> #include<utility> #include"serif/backend/mfem/operators/volume_data.hpp" #include"serif/backend/mfem/geometry/deformation/inputs.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::model::backend::mfem { structNoDeformation { }; template<typenameDomainModel> structDeformationDiscretization { DomainModelmodel; geometry::deformation::backend::mfem::ReferenceDiscretizationreference; }; template<typenameOwner,utils::dependencies::IsDependencyContextBindings,typenameDeformation=NoDeformation> structStellarDiscretizationfinal { std::shared_ptr<constOwner>owner; Bindingsterm_bindings; const::mfem::GridFunction&compactification; constmapping::DomainMapper&mapper; Deformationdeformation{}; template<typenameTerm> [[nodiscard]]constauto&binding()const { returnterm_bindings.templateget<Term>(); } template<typenameRow> [[nodiscard]]autoequation_discretization()const { usingBinding=std::remove_cvref_t<decltype(binding<Row>())>; usingSchema=typenameBinding::Schema; returnoperators::backend::mfem::VolumeDiscretization<Row, Schema>{ .residual_binding=binding<Row>(), .displacement_binding=binding<discretization::blocks::displacement::vector>(), .compactification=compactification, .mapper=mapper }; } }; template<typenameOwner,utils::dependencies::IsDependencyContextBindings> [[nodiscard]]automake_stellar_discretization(std::shared_ptr<Owner>owner,Bindingsbindings, const::mfem::GridFunction&compactification,constmapping::DomainMapper&mapper) { usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT>(owner!=nullptr,"Astellardiscretizationrequiresanownerforitsborrowedfinite-elementresources."); returnStellarDiscretization<std::remove_const_t<Owner>,Bindings>{ .owner=std::move(owner),.term_bindings=std::move(bindings), .compactification=compactification,.mapper=mapper }; } template<typenameOwner,typenameBindings,typenameDomainModel> [[nodiscard]]autowith_deformation(StellarDiscretization<Owner,Bindings>discretization,DomainModelmodel, geometry::deformation::backend::mfem::ReferenceDiscretizationreference) { returnStellarDiscretization<Owner,Bindings,DeformationDiscretization<DomainModel>>{ .owner=std::move(discretization.owner),.term_bindings=std::move(discretization.term_bindings), .compactification=discretization.compactification,.mapper=discretization.mapper, .deformation={.model=std::move(model),.reference=std::move(reference)} }; } }