module; #include #include #include #include export module mean_field:fem; export import :physics.contexts; export import :boundary.contexts; export import :mapping.domain_mapper; export import :utils.misc; export import :utils.user; export import :quadrature.mfem; export import :field.mfem; export namespace mean_field::fem { using GravityField = field::Field; using DisplacementField = field::Field; using DensityField = field::Field; using EnthalpyField = field::Field; struct FEM { // ===================================================================== // Mesh // ===================================================================== stroid::StroidMesh smesh; std::unique_ptr mesh; // ===================================================================== // Compile-time field descriptors // ===================================================================== GravityField gravityField; DisplacementField displacementField; DensityField densityField; EnthalpyField enthalpyField; // ===================================================================== // Gravity field // // Collection members are declared before their corresponding spaces so // that the spaces are destroyed first. // ===================================================================== std::unique_ptr gravityPotentialFec; std::unique_ptr gravityPotentialFes; std::unique_ptr gravityFluxFec; std::unique_ptr gravityFluxFes; // ===================================================================== // Displacement field // ===================================================================== std::unique_ptr displacementFec; std::unique_ptr displacementFes; std::unique_ptr displacement; // ===================================================================== // Density field // ===================================================================== std::unique_ptr densityFec; std::unique_ptr densityFes; // ===================================================================== // Specific-enthalpy field // ===================================================================== std::unique_ptr enthalpyFec; std::unique_ptr enthalpyFes; // ===================================================================== // Compactification coordinate // ===================================================================== std::unique_ptr compactificationFec; std::unique_ptr compactificationFes; std::unique_ptr compactificationCoordinate; // ===================================================================== // Domain mapping // // These are declared after displacement so that they are destroyed // before the displacement grid function to which mapping may refer. // DomainMapper is retained only for legacy integrators. New operators // use DomainMapperStateless exclusively. // ===================================================================== std::unique_ptr mapping; std::unique_ptr domainMapperStateless; // ===================================================================== // Block layouts // // These arrays are retained only for legacy code. Canonical operator // layouts are defined by the compile-time forms in :utils.blocks. // // Main system: [Displacement | Density] // Gravity system: [Flux | Potential] // ===================================================================== mfem::Array blockTrueOffsets; mfem::Array gravityBlockTrueOffsets; // ===================================================================== // Boundary conditions and domain masks // ===================================================================== mfem::Array essentialDisplacementTdofs; mfem::Array vacuumDensityTdofs; mfem::Array vacuumEnthalpyTdofs; mfem::Array vacuumDisplacementTdofs; // ===================================================================== // Global diagnostics // ===================================================================== mfem::Vector com; mfem::DenseMatrix Q; // ===================================================================== // Physics and boundary contexts // ===================================================================== physics::GravityContext gravityContext; boundary::BoundaryContext boundaryContext; std::unique_ptr quadratureFactory; // ===================================================================== // Validation // ===================================================================== [[nodiscard]] bool okay() const { return mesh != nullptr && gravityPotentialFec != nullptr && gravityPotentialFes != nullptr && gravityFluxFec != nullptr && gravityFluxFes != nullptr && displacementFec != nullptr && displacementFes != nullptr && displacement != nullptr && densityFec != nullptr && densityFes != nullptr && enthalpyFec != nullptr && enthalpyFes != nullptr && compactificationFec != nullptr && compactificationFes != nullptr && compactificationCoordinate != nullptr && mapping != nullptr && domainMapperStateless != nullptr && quadratureFactory != nullptr && blockTrueOffsets.Size() == 3 && gravityBlockTrueOffsets.Size() == 3; } [[nodiscard]] bool has_mapping() const { return mapping != nullptr; } }; FEM setup_fem( const std::string &filename, const utils::Args &args, int extraRefine = 0 ); } // namespace mean_field::fem