feat(libmeanfield): variadic refactor

also added normaliztion operator
This commit is contained in:
2026-09-06 10:15:00 -04:00
parent 71423d543f
commit 76818f2f82
63 changed files with 28794 additions and 1119 deletions

View File

@@ -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