computation_owners.cpp concepts string_view type_traits utility serif/discretization/domain/schema/schemas.hpp serif/equations/contributions.hpp serif/equations/point.hpp serif/backend/mfem/operators/jacobian_operator.hpp serif/backend/mfem/operators/volume_computations.hpp serif::operators::backend::mfem::Closure serif serif::operators serif::operators::backend serif::operators::backend::mfem #include<concepts> #include<string_view> #include<type_traits> #include<utility> #include"serif/discretization/domain/schema/schemas.hpp" #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" #include"serif/backend/mfem/operators/jacobian_operator.hpp" #include"serif/backend/mfem/operators/volume_computations.hpp" namespaceserif::operators::backend::mfem{ usingSchema=discretization::domain::schema::CoreEnvelopeVacuumDomainSchema; structClosurefinal:equations::Contribution<discretization::forms::Operand<discretization::blocks::density::mass>>{ usingOperands=utils::types::TypeList<TestOperand>; usingResidualQuantity=dimensions::MassDensity; staticconstexprstd::string_viewname="densityvalue"; staticequations::PointLinearization<Operands>evaluate(constequations::EquationPoint<Operands>&); staticintadditional_order(TestOperand,int); }; usingDensity=discretization::forms::Operand<discretization::blocks::density::mass>; usingDensityBinding=discretization::backend::mfem::TermBinding<Closure::Test, Schema>; usingVector=::mfem::Vector; usingVolumeCoefficients=decltype(make_term_coefficients( bind(std::declval<constDensityBinding&>(),std::declval<constVector&>()) )); usingVolumeMesh=VolumeDiscretization<Closure::Test, Schema>; usingVolumeInputs=decltype(make_volume_inputs<Closure>( std::declval<constVolumeMesh&>(),std::declval<constVolumeCoefficients&>(),std::declval<constVector&>() )); usingVolumeCache=decltype(make_volume_equation_cache( std::declval<Closure>(),std::declval<VolumeMesh>(),std::declval<constVolumeInputs&>() )); template<typenameKeyT> conceptClosureResult=requires(constVolumeCache&cache){ cache.templateget<KeyT>(); }; template<typenameDisplacementT> conceptClosureInputsAccept=requires( constVolumeMesh&discretization, constVolumeCoefficients&coefficients, DisplacementT&&displacement ){ make_volume_inputs<Closure>(discretization,coefficients,std::forward<DisplacementT>(displacement)); }; static_assert(ClosureInputsAccept<Vector&>); static_assert(ClosureInputsAccept<const Vector&>); static_assert(!ClosureInputsAccept<Vector>); static_assert(!ClosureInputsAccept<const Vector>); //Cachesowntheirgraphsandaremovable;assignmentcannotinvalidateborrowedadapteraddresses. static_assert(std::move_constructible<VolumeCache>&&!std::copy_constructible<VolumeCache>); static_assert(!std::is_move_assignable_v<VolumeCache>); static_assert(std::constructible_from<JacobianOperator<VolumeCache>,VolumeCache&>); static_assert(!std::constructible_from<JacobianOperator<VolumeCache>,VolumeCache&&>); static_assert(ClosureResult<volume_keys::Basis<0>>); static_assert(ClosureResult<volume_keys::Geometry<0>>); static_assert(ClosureResult<volume_keys::ReferenceValues<0, Density>>); static_assert(ClosureResult<volume_keys::QuadratureLinearization<0>>); static_assert(ClosureResult<volume_keys::Linearization>); static_assert(!ClosureResult<volume_keys::Basis<1>>); static_assert(!ClosureResult<volume_keys::PhysicalValues<0, Density>>); }