Files
MeanField/libmeanfield/interface/operators/prepared_constraint.cppm

38 lines
1.8 KiB
C++

module;
#include <concepts>
#include <type_traits>
#include <mfem.hpp>
export module mean_field:operators.prepared_constraint;
export import :model.compiled_fixed_mass;
export namespace mean_field::operators {
template <typename Candidate>
concept PreparedConstraint = requires(
std::remove_cvref_t<Candidate> &prepared,
const std::remove_cvref_t<Candidate> &constPrepared,
const typename std::remove_cvref_t<Candidate>::CompiledConstraintType &constraint,
const typename std::remove_cvref_t<Candidate>::Dependencies &dependencies,
const typename std::remove_cvref_t<Candidate>::JacobianInput &jacobianInput,
typename std::remove_cvref_t<Candidate>::JacobianTransposeOutput transposeOutput,
const mfem::Vector &residualDual,
mfem::Vector &result
) {
typename std::remove_cvref_t<Candidate>::SpecificationType;
typename std::remove_cvref_t<Candidate>::CompiledConstraintType;
typename std::remove_cvref_t<Candidate>::Dependencies;
typename std::remove_cvref_t<Candidate>::Report;
typename std::remove_cvref_t<Candidate>::JacobianInput;
typename std::remove_cvref_t<Candidate>::JacobianTransposeOutput;
requires models::CompiledConstraint<typename std::remove_cvref_t<Candidate>::CompiledConstraintType>;
{ prepared.Prepare(constraint, dependencies) } -> std::same_as<typename std::remove_cvref_t<Candidate>::Report>;
{ constPrepared.BuildResidual(result) } -> std::same_as<void>;
{ constPrepared.ApplyJacobian(jacobianInput, result) } -> std::same_as<void>;
{ constPrepared.ApplyJacobianTranspose(residualDual, transposeOutput) } -> std::same_as<void>;
{ constPrepared.IsPrepared() } noexcept -> std::same_as<bool>;
};
} // namespace mean_field::operators