module; #include #include #include export module mean_field:deformation.vacuum_extension; export import :deformation.descriptors; export namespace mean_field::deformation { template concept PreparedVacuumDeformationExtension = requires( const std::remove_cvref_t &preparedExtension, const mfem::Vector &surfaceDisplacement, const mfem::Vector &surfaceDisplacementDirection, const mfem::Vector &vacuumDisplacementDual, mfem::Vector &vacuumDisplacement, mfem::Vector &surfaceDisplacementDual ) { { preparedExtension.descriptor() } noexcept -> std::same_as; { preparedExtension.surfaceDisplacementSize() } noexcept -> std::same_as; { preparedExtension.vacuumDisplacementSize() } noexcept -> std::same_as; { preparedExtension.scalarTrueDofCount() } noexcept -> std::same_as; { preparedExtension.hasVacuumSupport(0) } -> std::same_as; { preparedExtension.buildVacuumDisplacement(surfaceDisplacement, vacuumDisplacement) } -> std::same_as; { preparedExtension.applyJacobian(surfaceDisplacement, surfaceDisplacementDirection, vacuumDisplacement) } -> std::same_as; { preparedExtension.applyJacobianTranspose( surfaceDisplacement, vacuumDisplacementDual, surfaceDisplacementDual ) } -> std::same_as; { preparedExtension.applyPullbackDerivative( surfaceDisplacement, surfaceDisplacementDirection, vacuumDisplacementDual, surfaceDisplacementDual ) } -> std::same_as; }; template concept VacuumDeformationExtension = requires(const std::remove_cvref_t &extension) { typename std::remove_cvref_t::PreparedType; requires PreparedVacuumDeformationExtension::PreparedType>; { extension.descriptor() } noexcept -> std::same_as; { extension.validate() } -> std::same_as; }; template concept VacuumDeformationExtensionCompilable = VacuumDeformationExtension && requires( const std::remove_cvref_t &extension, const std::remove_cvref_t &context ) { { compileVacuumDeformationExtension(extension, context) } -> std::same_as::PreparedType>; }; } // namespace mean_field::deformation