volume_displacement.hpp algorithm tuple serif/geometry/deformation/computations.hpp serif/backend/mfem/geometry/deformation/inputs.hpp serif/backend/mfem/geometry/deformation/displacement_mapping.hpp serif/backend/mfem/geometry/deformation/reference_geometry.hpp serif/backend/mfem/operators/volume_inputs.hpp src/include/serif/backend/mfem/model/graph.hpp serif::geometry::deformation::backend::mfem::volume_displacement_keys::CheckedBinding serif::geometry::deformation::backend::mfem::volume_displacement_keys::Coefficients serif serif::geometry serif::geometry::deformation serif::geometry::deformation::backend serif::geometry::deformation::backend::mfem serif::geometry::deformation::backend::mfem::volume_displacement_keys #pragmaonce #include<algorithm> #include<tuple> #include"serif/geometry/deformation/computations.hpp" #include"serif/backend/mfem/geometry/deformation/inputs.hpp" #include"serif/backend/mfem/geometry/deformation/displacement_mapping.hpp" #include"serif/backend/mfem/geometry/deformation/reference_geometry.hpp" #include"serif/backend/mfem/operators/volume_inputs.hpp" namespaceserif::geometry::deformation::backend::mfem{ namespacevolume_displacement_keys{ structCheckedBinding{ }; structCoefficients{ }; }//namespacevolume_displacement_keys template<typenameMetadataKey=operators::backend::mfem::MeshAndCoefficientBindings,discretization::domain::schema::IsSchemaSchema> [[nodiscard]]automake_volume_displacement_computations(constdiscretization::backend::mfem::TermBinding<discretization::blocks::displacement::vector, Schema>&binding){ usingnamespaceutils::dependencies; usingBinding=discretization::backend::mfem::TermBinding<discretization::blocks::displacement::vector, Schema>; namespaceequations_backend=operators::backend::mfem; constautochecked_binding=make_computation<volume_displacement_keys::CheckedBinding,InputList<deformation::keys::ReferenceDiscretization,MetadataKey>>( [&binding](constReferenceDiscretization&reference,constauto&metadata)->std::expected<constBinding*,DeformationFailure>{ binding.validate(); if(metadata.displacement_binding!=&binding){ returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::incompatible_discretization,.message="Thedeformation-to-equationconnectionrequiresthedisplacementbindingusedwhenconstructingit."}); } const::mfem::FiniteElementSpace&space=binding.space(); if(space.GetVDim()!=3||reference.displacement_space.GetVDim()!=3||reference.scalar_space.GetVDim()!=1){ returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::incompatible_discretization,.message="Thedeformationconnectionrequiresthree-componentdisplacementsandascalarreferencecompanion."}); } if(constDeformationStatusnumbering=validate_companion_numbering(reference.scalar_space,space);!numbering){ returnstd::unexpected(numbering.error()); } if(constDeformationStatusnumbering=validate_companion_numbering(reference.displacement_space,space);!numbering){ returnstd::unexpected(numbering.error()); } return&binding; }); constautocoefficients=make_computation<volume_displacement_keys::Coefficients,InputList<deformation::keys::VolumeDisplacement,volume_displacement_keys::CheckedBinding>>( [](conststd::vector<double>&displacement,constBinding*binding)->std::expected<::mfem::Vector,DeformationFailure>{ const::mfem::FiniteElementSpace&space=binding->space(); if(constautovalidation=validate_deformation_values(displacement,static_cast<std::size_t>(binding->full_size()));!validation){ returnstd::unexpected(validation.error()); } ::mfem::Vectorvalues(binding->size()); if(space.GetOrdering()==::mfem::Ordering::byNODES&&binding->size()==binding->full_size()){ std::ranges::copy(displacement,values.GetData()); returnvalues; } for_each_displacement_coefficient(*binding,[&](constintrow,constintcolumn){ values[row]=displacement[static_cast<std::size_t>(column)]; }); returnvalues; }); constautoview=make_computation<equations_backend::DisplacementCoefficients,InputList<volume_displacement_keys::Coefficients,volume_displacement_keys::CheckedBinding>>( [](const::mfem::Vector&values,constBinding*binding)->equations_backend::CoefficientView<Binding>{ returnequations_backend::bind(*binding,values); }); returnstd::tuple{checked_binding,coefficients,view}; } template<typenameMetadataKey=operators::backend::mfem::MeshAndCoefficientBindings,discretization::domain::schema::IsSchemaSchema> voidmake_volume_displacement_computations(constdiscretization::backend::mfem::TermBinding<discretization::blocks::displacement::vector,Schema>&&)=delete; }//namespaceserif::geometry::deformation::backend::mfem