deformation_meanfield.cpp array concepts cstddef span utility vector serif/geometry/deformation/actions.hpp serif/backend/mfem/geometry/deformation/inputs.hpp #include<array> #include<concepts> #include<cstddef> #include<span> #include<utility> #include<vector> #include"serif/geometry/deformation/actions.hpp" #include"serif/backend/mfem/geometry/deformation/inputs.hpp" namespace { namespacedeformation=serif::geometry::deformation; namespacespaces=deformation::spaces; namespacebackend=deformation::backend::mfem; namespacedomain=serif::discretization::domain; usingSchema=domain::schema::CoreEnvelopeVacuumDomainSchema; usingAlternateBoundarySchema=domain::schema::DomainSchema<typenameSchema::domain_ids_type,domain::ids::lists::BoundaryIDList<domain::ids::BoundaryID<domain::StellarSurfaceBoundary,2>,domain::ids::BoundaryID<domain::InfinitySurfaceBoundary,1>>,domain::relation::lists::RelationList<>>; usingMissingSurfaceSchema=domain::schema::DomainSchema<typenameSchema::domain_ids_type,domain::ids::lists::BoundaryIDList<domain::ids::BoundaryID<domain::InfinitySurfaceBoundary,2>>,domain::relation::lists::RelationList<>>; template<typenameCandidate> conceptCanResolveDeformation=requires(constmfem::FiniteElementSpace&scalar,constmfem::FiniteElementSpace&vector,mfem::Mesh&logical) { backend::deformation_discretization<Candidate>(scalar,vector,logical); }; static_assert(CanResolveDeformation<Schema>); static_assert(CanResolveDeformation<AlternateBoundarySchema>); static_assert(!CanResolveDeformation<MissingSurfaceSchema>); template<typenameCoefficients> conceptCanBindShape=requires(constdeformation::DomainDeformation<deformation::SphericalHarmonicSurface>&model, constbackend::ReferenceDiscretization&reference,Coefficients&&coefficients){ backend::make_deformation_inputs(model,reference,std::forward<Coefficients>(coefficients)); }; static_assert(CanBindShape<std::span<const double>>); static_assert(CanBindShape<std::span<double>>); static_assert(CanBindShape<std::span<const double, 4>>); static_assert(CanBindShape<std::vector<double>&>); static_assert(CanBindShape<const std::vector<double>&>); static_assert(CanBindShape<std::array<double, 4>&>); static_assert(!CanBindShape<std::vector<double>>); static_assert(!CanBindShape<const std::vector<double>>); static_assert(!CanBindShape<std::array<double, 4>>); static_assert(!CanBindShape<const std::array<double, 4>>); template<typenameInput,typenameOutput,boolBuild=true,boolJacobian=true,boolTranspose=true,boolCurvature=true> structMapCapabilities { usingInputSpace=Input; usingOutputSpace=Output; usingWorkspace=deformation::EmptyDeformationWorkspace; [[nodiscard]]std::size_tinput_size()const; [[nodiscard]]std::size_toutput_size()const; [[nodiscard]]Workspacemake_workspace()const; [[nodiscard]]deformation::DeformationStatusbuild_displacement(std::span<constdouble>,std::span<double>,Workspace&)constrequiresBuild; [[nodiscard]]deformation::DeformationStatusapply_jacobian(std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)constrequiresJacobian; [[nodiscard]]deformation::DeformationStatusapply_jacobian_transpose(std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)constrequiresTranspose; [[nodiscard]]deformation::DeformationStatusapply_pullback_derivative(std::span<constdouble>,std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)constrequiresCurvature; }; template<typenameInput,typenameOutput> constevalboolcomplete_contract_is_required() { static_assert(deformation::DeformationMap<MapCapabilities<Input,Output>>); static_assert(!deformation::DeformationMap<MapCapabilities<Input,Output,false>>); static_assert(!deformation::DeformationMap<MapCapabilities<Input,Output,true,false>>); static_assert(!deformation::DeformationMap<MapCapabilities<Input,Output,true,true,false>>); static_assert(!deformation::DeformationMap<MapCapabilities<Input,Output,true,true,true,false>>); returntrue; } static_assert(complete_contract_is_required<spaces::ShapeParameters,spaces::SurfaceDisplacement>()); //Interiorandvacuumbehaviornowshareoneextensionmapwiththesamecompletederivativecontract. static_assert(complete_contract_is_required<spaces::SurfaceDisplacement,spaces::VolumeDisplacement>()); static_assert(complete_contract_is_required<spaces::ShapeParameters,spaces::VolumeDisplacement>()); }//namespace