feat(field-support): added field support system, mid migration

currently the barotope and the pressure force operator are migrated to the new support system
This commit is contained in:
2026-08-23 10:13:53 -04:00
parent dc912fd15e
commit 0f3ca8050b
137 changed files with 29975 additions and 16389 deletions

View File

@@ -1,5 +1,6 @@
module;
#include <compare>
#include <cstdint>
#include <mfem.hpp>
@@ -7,18 +8,66 @@ module;
export module mean_field:operators.context.barotropic_closure_linearization;
export import :fem;
export import :field.mfem;
export import :mapping.domain_mapper;
export import :operators.prepared_barotropic_closure;
export import :physics.barotrope;
export namespace mean_field::operators::context::barotropic {
struct BarotropicClosureRevisions final {
std::uint64_t density = 0;
std::uint64_t enthalpy = 0;
std::uint64_t displacement = 0;
template <typename Tag> struct DependencyStamp {
std::uint64_t identity{0};
std::uint64_t revision{0};
[[nodiscard]] bool
operator==(const BarotropicClosureRevisions &) const noexcept = default;
[[nodiscard]] constexpr bool CanFollow(const DependencyStamp &prepared) const noexcept {
return identity != prepared.identity || revision >= prepared.revision;
}
constexpr auto operator<=>(const DependencyStamp &) const = default;
};
struct DiscretizationDependencyTag { };
struct DensityDependencyTag { };
struct EnthalpyDependencyTag { };
struct DisplacementDependencyTag { };
using DiscretizationDependency = DependencyStamp<DiscretizationDependencyTag>;
using DensityDependency = DependencyStamp<DensityDependencyTag>;
using EnthalpyDependency = DependencyStamp<EnthalpyDependencyTag>;
using DisplacementDependency = DependencyStamp<DisplacementDependencyTag>;
struct BarotropicClosureDependencies final {
DiscretizationDependency discretization;
DensityDependency density;
EnthalpyDependency enthalpy;
DisplacementDependency displacement;
constexpr auto operator<=>(const BarotropicClosureDependencies &) const = default;
};
struct BarotropicClosureStateView final {
const mfem::Vector &density;
const mfem::Vector &enthalpy;
const mfem::Vector &displacement;
};
struct BarotropicClosurePreparationReport final {
bool preparedStaticDependencies{false};
bool preparedGeometryState{false};
bool preparedBaseState{false};
bool updatedDensity{false};
bool updatedEnthalpy{false};
bool updatedDisplacement{false};
[[nodiscard]] bool DidAnyWork() const noexcept {
return preparedStaticDependencies || preparedGeometryState || preparedBaseState;
}
};
struct BarotropicClosurePreparationStatistics final {
std::uint64_t staticPreparations{0};
std::uint64_t geometryPreparations{0};
std::uint64_t baseStatePreparations{0};
constexpr auto operator<=>(const BarotropicClosurePreparationStatistics &) const = default;
};
class BarotropicClosureLinearizationContext final {
@@ -26,51 +75,46 @@ export namespace mean_field::operators::context::barotropic {
BarotropicClosureLinearizationContext(
const fem::FEM &f,
const mapping::DomainMapperStateless &domainMapper,
const physics::PolytropicBarotrope &barotrope
const field::FieldDofMap &densityMap,
const field::FieldDofMap &enthalpyMap,
const field::FieldDofMap &displacementMap
);
void Prepare(
const mfem::Vector &baseDensityTrue,
const mfem::Vector &baseEnthalpyTrue,
const mfem::Vector &displacementTrue,
const BarotropicClosureRevisions &revisions
BarotropicClosureLinearizationContext(const BarotropicClosureLinearizationContext &) = delete;
BarotropicClosureLinearizationContext &operator=(const BarotropicClosureLinearizationContext &) = delete;
BarotropicClosureLinearizationContext(BarotropicClosureLinearizationContext &&) = delete;
BarotropicClosureLinearizationContext &operator=(BarotropicClosureLinearizationContext &&) = delete;
BarotropicClosurePreparationReport Prepare(
const BarotropicClosureStateView &state,
const BarotropicClosureDependencies &dependencies
);
[[nodiscard]] bool IsPrepared() const noexcept;
[[nodiscard]] bool MatchesDependencies(const BarotropicClosureDependencies &dependencies) const noexcept;
[[nodiscard]] const BarotropicClosureDependencies &GetDependencies() const;
[[nodiscard]] const BarotropicClosurePreparationStatistics &GetPreparationStatistics() const noexcept;
[[nodiscard]] bool MatchesRevisions(
const BarotropicClosureRevisions &revisions
) const noexcept;
[[nodiscard]] std::uint64_t GetPreparationCount() const noexcept;
[[nodiscard]] const BarotropicClosureRevisions &GetRevisions() const;
[[nodiscard]] const mfem::Vector &GetBaseDensityTrue() const;
[[nodiscard]] const mfem::Vector &GetBaseEnthalpyTrue() const;
[[nodiscard]] const mfem::Vector &GetDisplacementTrue() const;
[[nodiscard]]
const PreparedBarotropicClosureOperator &GetOperator() const noexcept;
void BuildResidual(mfem::Vector &residual) const;
[[nodiscard]] const mfem::Vector &GetBaseDensity() const;
[[nodiscard]] const mfem::Vector &GetBaseEnthalpy() const;
[[nodiscard]] const mfem::Vector &GetDisplacement() const;
private:
void VerifyPrepared() const;
const fem::FEM &m_f;
const mapping::DomainMapperStateless &m_domainMapper;
PreparedBarotropicClosureOperator m_operator;
int m_densitySize{0};
int m_enthalpySize{0};
int m_displacementSize{0};
mfem::Vector m_baseDensityTrue;
mfem::Vector m_baseEnthalpyTrue;
mfem::Vector m_displacementTrue;
mfem::Vector m_baseDensity;
mfem::Vector m_baseEnthalpy;
mfem::Vector m_displacement;
BarotropicClosureRevisions m_revisions;
std::uint64_t m_preparationCount = 0;
bool m_isPrepared = false;
BarotropicClosureDependencies m_dependencies;
BarotropicClosurePreparationStatistics m_statistics;
bool m_isPrepared{false};
};
} // namespace mean_field::operators::context::barotropic
} // namespace mean_field::operators::context::barotropic