module; #include #include #include export module mean_field:deformation.surface_prescription; export import :deformation.descriptors; export namespace mean_field::deformation { template concept PreparedSurfaceDeformationPrescription = requires( const std::remove_cvref_t &preparedPrescription, const mfem::Vector ¶meters, const mfem::Vector ¶meterDirection, const mfem::Vector &surfaceDisplacementDual, mfem::Vector &surfaceDisplacement, mfem::Vector ¶meterDual ) { { preparedPrescription.descriptor() } noexcept -> std::same_as; { preparedPrescription.parameterCount() } noexcept -> std::same_as; { preparedPrescription.surfaceDisplacementSize() } noexcept -> std::same_as; { preparedPrescription.buildSurfaceDisplacement(parameters, surfaceDisplacement) } -> std::same_as; { preparedPrescription.applyJacobian(parameters, parameterDirection, surfaceDisplacement) } -> std::same_as; { preparedPrescription.applyJacobianTranspose(parameters, surfaceDisplacementDual, parameterDual) } -> std::same_as; { preparedPrescription.applyPullbackDerivative( parameters, parameterDirection, surfaceDisplacementDual, parameterDual ) } -> std::same_as; }; template concept SurfaceDeformationPrescription = requires(const std::remove_cvref_t &prescription) { typename std::remove_cvref_t::PreparedType; requires PreparedSurfaceDeformationPrescription::PreparedType>; { prescription.descriptor() } noexcept -> std::same_as; { prescription.validate() } -> std::same_as; }; template concept SurfaceDeformationCompilable = SurfaceDeformationPrescription && requires( const std::remove_cvref_t &prescription, const std::remove_cvref_t &context ) { { compileSurfaceDeformationPrescription(prescription, context) } -> std::same_as::PreparedType>; }; } // namespace mean_field::deformation