feat(libmeanfield): variadic refactor
also added normaliztion operator
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
module;
|
||||
|
||||
#include <concepts>
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
#include <mfem.hpp>
|
||||
|
||||
export module mean_field:model.compiled_fixed_angular_momentum;
|
||||
|
||||
export import :field.registry;
|
||||
export import :model.compiled_fixed_mass;
|
||||
export import :physics.rigid_rotation;
|
||||
export import :utils.blocks;
|
||||
|
||||
export namespace mean_field::models {
|
||||
using FixedAngularMomentumLayoutRequest = ConstraintLayoutRequest<
|
||||
FixedAngularMomentum,
|
||||
PhysicalCoordinateFor<FixedAngularMomentum>,
|
||||
ResidualFor<FixedAngularMomentum>,
|
||||
utils::blocks::fixed_angular_momentum::angular_velocity::value,
|
||||
utils::blocks::fixed_angular_momentum::angular_velocity::residual,
|
||||
utils::blocks::fixed_angular_momentum::angular_velocity,
|
||||
utils::blocks::density::mass::value,
|
||||
utils::blocks::surface_deformation::parameters::value,
|
||||
utils::blocks::fixed_angular_momentum::angular_velocity::value>;
|
||||
|
||||
class CompiledFixedAngularMomentum final {
|
||||
public:
|
||||
using SpecificationType = FixedAngularMomentum;
|
||||
using LayoutRequest = FixedAngularMomentumLayoutRequest;
|
||||
using AngularVelocityType = typename LayoutRequest::GeneratedValueType;
|
||||
using ResidualType = typename LayoutRequest::GeneratedResidualType;
|
||||
using AngularVelocityField = field::AngularVelocity;
|
||||
|
||||
explicit CompiledFixedAngularMomentum(const FixedAngularMomentum specification) noexcept
|
||||
: m_specification(specification) {
|
||||
}
|
||||
|
||||
[[nodiscard]] const FixedAngularMomentum &specification() const noexcept {
|
||||
return m_specification;
|
||||
}
|
||||
|
||||
[[nodiscard]] dimensions::AngularMomentumValue targetAngularMomentum() const noexcept {
|
||||
return m_specification.targetAngularMomentum();
|
||||
}
|
||||
|
||||
[[nodiscard]] physics::RigidRotation makeRotation(const double angularVelocity) const {
|
||||
mfem::Vector velocity(3);
|
||||
mfem::Vector center(3);
|
||||
for (int component = 0; component < 3; ++component) {
|
||||
velocity(component) = angularVelocity * m_specification.axis()[static_cast<std::size_t>(component)];
|
||||
center(component) = m_specification.center()[static_cast<std::size_t>(component)];
|
||||
}
|
||||
return {velocity, center};
|
||||
}
|
||||
|
||||
[[nodiscard]] static consteval LayoutRequest layoutRequest() noexcept {
|
||||
return {};
|
||||
}
|
||||
|
||||
private:
|
||||
FixedAngularMomentum m_specification;
|
||||
};
|
||||
|
||||
[[nodiscard]] inline CompiledFixedAngularMomentum compileConstraint(
|
||||
const FixedAngularMomentum specification
|
||||
) noexcept {
|
||||
return CompiledFixedAngularMomentum{specification};
|
||||
}
|
||||
|
||||
static_assert(ConstraintLayoutRequestType<FixedAngularMomentumLayoutRequest>);
|
||||
static_assert(CompiledConstraint<CompiledFixedAngularMomentum>);
|
||||
} // namespace mean_field::models
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14,21 +14,41 @@ export namespace mean_field::model {
|
||||
template <typename SpecificationSet> class StellarModel;
|
||||
|
||||
template <models::ModelSpecification... CanonicalSpecifications>
|
||||
requires models::ValidModelSpecificationPack<CanonicalSpecifications...> &&
|
||||
models::SpecificationOperatorSignature<
|
||||
models::detail::SpecificationSetStorage<CanonicalSpecifications...>>::symbolicallySquare
|
||||
class StellarModel<models::detail::SpecificationSetStorage<CanonicalSpecifications...>> final {
|
||||
public:
|
||||
using SpecificationTypes = models::detail::SpecificationSetStorage<CanonicalSpecifications...>;
|
||||
using OperatorSignature = models::SpecificationOperatorSignature<SpecificationTypes>;
|
||||
using Storage = models::Model<CanonicalSpecifications...>;
|
||||
using EquationOfStateType =
|
||||
models::SpecificationForRoleT<models::SpecificationRole::constitutive_law, SpecificationTypes>;
|
||||
|
||||
static constexpr std::size_t specificationCount = sizeof...(CanonicalSpecifications);
|
||||
static constexpr bool symbolicallySquare = Storage::symbolicallySquare;
|
||||
static constexpr bool hasCompleteEquilibriumCompiler = Storage::hasCompleteRootCompiler;
|
||||
static constexpr models::EquilibriumSystemCompilation compilationClass = Storage::compilationClass;
|
||||
static constexpr std::size_t specificationCount = sizeof...(CanonicalSpecifications);
|
||||
static constexpr bool symbolicallySquare = Storage::symbolicallySquare;
|
||||
static constexpr bool hasCompleteEquilibriumDeclaration =
|
||||
Storage::hasCompleteEquilibriumDeclaration;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
using SpecificationsForRole = models::SpecificationsForRoleT<Role, SpecificationTypes>;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
requires models::HasUniqueSpecificationForRole<Role, SpecificationTypes>
|
||||
using SpecificationForRole = models::SpecificationForRoleT<Role, SpecificationTypes>;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
static constexpr std::size_t specificationRoleCount = models::specificationRoleCount<Role, SpecificationTypes>;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
static constexpr bool hasSpecificationsForRole = models::HasSpecificationsForRole<Role, SpecificationTypes>;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
static constexpr bool hasUniqueSpecificationForRole =
|
||||
models::HasUniqueSpecificationForRole<Role, SpecificationTypes>;
|
||||
|
||||
template <typename... Arguments>
|
||||
requires std::constructible_from<
|
||||
Storage,
|
||||
Arguments...>
|
||||
requires std::constructible_from<Storage, Arguments...>
|
||||
explicit StellarModel(Arguments &&...arguments) : m_specifications(std::forward<Arguments>(arguments)...) {
|
||||
}
|
||||
|
||||
@@ -41,6 +61,25 @@ export namespace mean_field::model {
|
||||
template <models::ModelSpecification Specification>
|
||||
static constexpr bool containsSpecification = Storage::template containsSpecification<Specification>;
|
||||
|
||||
template <models::SpecificationRole Role>
|
||||
requires models::HasUniqueSpecificationForRole<Role, SpecificationTypes>
|
||||
[[nodiscard]] const models::SpecificationForRoleT<Role, SpecificationTypes> &
|
||||
specificationForRole() const noexcept {
|
||||
using Specification = models::SpecificationForRoleT<Role, SpecificationTypes>;
|
||||
return specification<Specification>();
|
||||
}
|
||||
|
||||
[[nodiscard]] const EquationOfStateType &equationOfState() const noexcept {
|
||||
return specificationForRole<models::SpecificationRole::constitutive_law>();
|
||||
}
|
||||
|
||||
template <typename = void>
|
||||
requires models::HasUniqueSpecificationForRole<models::SpecificationRole::boundary_condition,
|
||||
SpecificationTypes>
|
||||
[[nodiscard]] const auto &surfaceCondition() const noexcept {
|
||||
return specificationForRole<models::SpecificationRole::boundary_condition>();
|
||||
}
|
||||
|
||||
[[nodiscard]] static constexpr std::span<const models::RuntimeSpecificationDescriptor>
|
||||
runtimeSpecificationDescriptors() noexcept {
|
||||
return Storage::runtimeSpecificationDescriptors();
|
||||
@@ -56,11 +95,69 @@ export namespace mean_field::model {
|
||||
-> StellarModel<models::SpecificationSet<std::remove_cvref_t<Specifications>...>>;
|
||||
|
||||
namespace detail {
|
||||
template <typename Candidate> struct IsStellarModel : std::false_type { };
|
||||
template <typename Candidate, typename = void> struct IsStellarModel : std::false_type {};
|
||||
|
||||
template <typename SpecificationSet> struct IsStellarModel<StellarModel<SpecificationSet>> : std::true_type { };
|
||||
template <typename SpecificationSet>
|
||||
struct IsStellarModel<
|
||||
StellarModel<SpecificationSet>,
|
||||
std::void_t<typename StellarModel<SpecificationSet>::SpecificationTypes,
|
||||
typename StellarModel<SpecificationSet>::OperatorSignature,
|
||||
decltype(StellarModel<SpecificationSet>::specificationCount),
|
||||
decltype(StellarModel<SpecificationSet>::hasCompleteEquilibriumDeclaration)>>
|
||||
: std::true_type {};
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate, bool = IsStellarModel<Candidate>::value>
|
||||
struct StellarModelRoleSelection {
|
||||
using Types = models::ModelTypeList<>;
|
||||
|
||||
static constexpr std::size_t count = 0;
|
||||
};
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
struct StellarModelRoleSelection<Role, Candidate, true> {
|
||||
using Types = models::SpecificationsForRoleT<Role, typename Candidate::SpecificationTypes>;
|
||||
|
||||
static constexpr std::size_t count =
|
||||
models::specificationRoleCount<Role, typename Candidate::SpecificationTypes>;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
template <typename Candidate>
|
||||
concept StellarModelType = detail::IsStellarModel<std::remove_cvref_t<Candidate>>::value;
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
inline constexpr std::size_t specificationRoleCount =
|
||||
detail::StellarModelRoleSelection<Role, std::remove_cvref_t<Candidate>>::count;
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
concept HasSpecificationsForRole = StellarModelType<Candidate> && specificationRoleCount<Role, Candidate> > 0;
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
concept HasUniqueSpecificationForRole = StellarModelType<Candidate> && specificationRoleCount<Role, Candidate> == 1;
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
requires StellarModelType<Candidate>
|
||||
using SpecificationsForRoleT =
|
||||
typename detail::StellarModelRoleSelection<Role, std::remove_cvref_t<Candidate>>::Types;
|
||||
|
||||
template <models::SpecificationRole Role, typename Candidate>
|
||||
requires HasUniqueSpecificationForRole<Role, Candidate>
|
||||
using SpecificationForRoleT =
|
||||
models::SpecificationForRoleT<Role, typename std::remove_cvref_t<Candidate>::SpecificationTypes>;
|
||||
|
||||
template <typename Candidate>
|
||||
concept HasEquationOfState = HasUniqueSpecificationForRole<models::SpecificationRole::constitutive_law, Candidate>;
|
||||
|
||||
template <typename Candidate>
|
||||
concept HasSurfaceCondition = HasSpecificationsForRole<models::SpecificationRole::boundary_condition, Candidate>;
|
||||
|
||||
template <typename Candidate>
|
||||
concept HasUniqueSurfaceCondition =
|
||||
HasUniqueSpecificationForRole<models::SpecificationRole::boundary_condition, Candidate>;
|
||||
|
||||
template <HasEquationOfState Candidate>
|
||||
using EquationOfStateType = SpecificationForRoleT<models::SpecificationRole::constitutive_law, Candidate>;
|
||||
|
||||
template <HasUniqueSurfaceCondition Candidate>
|
||||
using SurfaceConditionType = SpecificationForRoleT<models::SpecificationRole::boundary_condition, Candidate>;
|
||||
} // namespace mean_field::model
|
||||
|
||||
Reference in New Issue
Block a user