module; #include #include #include export module mean_field:deformation.interior_extension; export import :deformation.descriptors; export namespace mean_field::deformation { template concept PreparedInteriorDeformationExtension = requires( const std::remove_cvref_t &preparedExtension, const mfem::Vector &surfaceDisplacement, const mfem::Vector &surfaceDisplacementDirection, const mfem::Vector &interiorDisplacementDual, mfem::Vector &interiorDisplacement, mfem::Vector &surfaceDisplacementDual ) { { preparedExtension.descriptor() } noexcept -> std::same_as; { preparedExtension.surfaceDisplacementSize() } noexcept -> std::same_as; { preparedExtension.interiorDisplacementSize() } noexcept -> std::same_as; { preparedExtension.scalarTrueDofCount() } noexcept -> std::same_as; { preparedExtension.hasStellarSupport(0) } -> std::same_as; { preparedExtension.buildInteriorDisplacement(surfaceDisplacement, interiorDisplacement) } -> std::same_as; { preparedExtension.applyJacobian(surfaceDisplacement, surfaceDisplacementDirection, interiorDisplacement) } -> std::same_as; { preparedExtension.applyJacobianTranspose( surfaceDisplacement, interiorDisplacementDual, surfaceDisplacementDual ) } -> std::same_as; { preparedExtension.applyPullbackDerivative( surfaceDisplacement, surfaceDisplacementDirection, interiorDisplacementDual, surfaceDisplacementDual ) } -> std::same_as; }; template concept InteriorDeformationExtension = requires(const std::remove_cvref_t &extension) { typename std::remove_cvref_t::PreparedType; requires PreparedInteriorDeformationExtension::PreparedType>; { extension.descriptor() } noexcept -> std::same_as; { extension.validate() } -> std::same_as; }; template concept InteriorDeformationExtensionCompilable = InteriorDeformationExtension && requires( const std::remove_cvref_t &extension, const std::remove_cvref_t &context ) { { compileInteriorDeformationExtension(extension, context) } -> std::same_as::PreparedType>; }; } // namespace mean_field::deformation