cmake_minimum_required(VERSION 3.28) project(MeanField C CXX) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) option(MEAN_FIELD_ENABLE_PROFILING "Enable low-overhead scoped profiling instrumentation" OFF) option(MEAN_FIELD_ENABLE_IPO "Enable interprocedural optimization in release builds" ON) set(MEAN_FIELD_UNIFORM_POLYNOMIAL_ORDER_INCREMENT 0 CACHE STRING "Uniform increment applied to every registered finite-element family order") if (NOT MEAN_FIELD_UNIFORM_POLYNOMIAL_ORDER_INCREMENT MATCHES "^[0-9]+$") message(FATAL_ERROR "MEAN_FIELD_UNIFORM_POLYNOMIAL_ORDER_INCREMENT must be a non-negative integer") endif () add_compile_options( -gdwarf-4 -Wno-unused-parameter -Wno-unused-function -Wno-unused-variable -Wno-unused-const-variable -Wno-unused-private-field -Wno-unused-but-set-variable -Wno-unused-local-typedefs -Wno-unused-value -Wno-unused-label -Wno-unused-lambda-capture ) find_package(MPI REQUIRED COMPONENTS CXX) find_package(XAD REQUIRED) find_package(mfem REQUIRED) find_package(UMFPACK REQUIRED) find_package(hypre REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(stroid REQUIRED IMPORTED_TARGET stroid) pkg_check_modules(eigen3 REQUIRED IMPORTED_TARGET eigen3) add_library(mean_field) target_compile_definitions(mean_field PUBLIC MEAN_FIELD_UNIFORM_POLYNOMIAL_ORDER_INCREMENT=${MEAN_FIELD_UNIFORM_POLYNOMIAL_ORDER_INCREMENT} MEAN_FIELD_ENABLE_PROFILING=$ ) target_include_directories(mean_field PUBLIC $ ) target_sources(mean_field PRIVATE libmeanfield/impl/profile.cpp libmeanfield/impl/analysis/integral.cpp libmeanfield/impl/fem.cpp libmeanfield/impl/fem/reference_tables.cpp libmeanfield/impl/mapping/prepared_cache.cpp libmeanfield/impl/mapping/coefficients.cpp libmeanfield/impl/mapping/compactification/kelvin.cpp libmeanfield/impl/physics/gravity.cpp libmeanfield/impl/physics/solid.cpp libmeanfield/impl/utils/domain.cpp libmeanfield/impl/utils/misc.cpp libmeanfield/impl/integrators/advection.cpp libmeanfield/impl/integrators/centrifugal.cpp libmeanfield/impl/integrators/coriolis.cpp libmeanfield/impl/integrators/gravity.cpp libmeanfield/impl/integrators/mass_continuity.cpp libmeanfield/impl/integrators/viscosity.cpp libmeanfield/impl/mapping/domain_mapper.cpp libmeanfield/impl/mapping/transformations.cpp libmeanfield/impl/deformation/nodal_radial_surface.cpp libmeanfield/impl/deformation/radial_extensions.cpp libmeanfield/impl/deformation/safe_newton_step.cpp libmeanfield/impl/operators/gravity_field.cpp libmeanfield/impl/operators/gravity_field_jacobian.cpp libmeanfield/impl/operators/kernels/gravity_kernels.cpp libmeanfield/impl/operators/prepared_hdiv_mass.cpp libmeanfield/impl/operators/prepared_gravity_source.cpp libmeanfield/impl/operators/contexts/gravity_field_context.cpp libmeanfield/impl/operators/kernels/barotropic_closure_kernels.cpp libmeanfield/impl/operators/prepared_barotropic_closure.cpp libmeanfield/impl/operators/contexts/barotropic_closure_linearization_context.cpp libmeanfield/impl/operators/kernels/hydrostatic_equilibrium_kernels.cpp libmeanfield/impl/operators/contexts/hydrostatic_equilibrium_context.cpp libmeanfield/impl/operators/prepared_hydrostatic_equilibrium.cpp libmeanfield/impl/operators/kernels/pressure_force_kernels.cpp libmeanfield/impl/operators/contexts/pressure_force_context.cpp libmeanfield/impl/operators/prepared_pressure_force.cpp libmeanfield/impl/operators/kernels/gravity_displacement_force_kernels.cpp libmeanfield/impl/operators/prepared_gravity_displacement_force.cpp libmeanfield/impl/operators/contexts/rotation_displacement_force_context.cpp libmeanfield/impl/operators/kernels/rotation_displacement_force_kernels.cpp libmeanfield/impl/operators/prepared_rotation_displacement_force.cpp libmeanfield/impl/operators/prepared_displacement_operator.cpp libmeanfield/impl/models/polytropic.cpp libmeanfield/impl/seed/lane_emden.cpp libmeanfield/impl/seed/stellar_equilibrium_projection.cpp libmeanfield/impl/solver/preconditioning_diagnostics.cpp libmeanfield/impl/preconditioning/gravity_field.cpp libmeanfield/impl/operators/prepared_mass_normalization.cpp libmeanfield/impl/operators/prepared_angular_momentum.cpp libmeanfield/impl/operators/prepared_stellar_equilibrium.cpp ) if (MEAN_FIELD_ENABLE_IPO) include(CheckIPOSupported) check_ipo_supported(RESULT mean_field_ipo_supported OUTPUT mean_field_ipo_error LANGUAGES CXX) if (NOT mean_field_ipo_supported) message(FATAL_ERROR "MEAN_FIELD_ENABLE_IPO was requested, but the compiler does not support it: ${mean_field_ipo_error}") endif () set_property(TARGET mean_field PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) endif () target_sources(mean_field PUBLIC FILE_SET CXX_MODULES FILES libmeanfield/interface/mean_field.cppm libmeanfield/interface/fem.cppm libmeanfield/interface/fem/reference_tables.cppm libmeanfield/interface/mapping/prepared_cache.cppm libmeanfield/interface/analysis/integral.cppm libmeanfield/interface/boundary/context.cppm libmeanfield/interface/mapping/coefficients.cppm libmeanfield/interface/mapping/domain_mapper.cppm libmeanfield/interface/mapping/types.cppm libmeanfield/interface/mapping/transformations.cppm libmeanfield/interface/mapping/compactification/compactification.cppm libmeanfield/interface/mapping/compactification/kelvin.cppm libmeanfield/interface/mapping/compactification/options.cppm libmeanfield/interface/physics/gravity.cppm libmeanfield/interface/physics/solid.cppm libmeanfield/interface/utils/domain.cppm libmeanfield/interface/utils/misc.cppm libmeanfield/interface/utils/user.cppm libmeanfield/interface/integrators/advection.cppm libmeanfield/interface/integrators/centrifugal.cppm libmeanfield/interface/integrators/coriolis.cppm libmeanfield/interface/integrators/gravity.cppm libmeanfield/interface/integrators/mass_continuity.cppm libmeanfield/interface/integrators/pressure_gradient.cppm libmeanfield/interface/integrators/viscosity.cppm libmeanfield/interface/quadrature/policy.cppm libmeanfield/interface/quadrature/mfem.cppm libmeanfield/interface/solver/fields.cppm libmeanfield/interface/solver/linear_backend.cppm libmeanfield/interface/solver/newton.cppm libmeanfield/interface/solver/preconditioning_diagnostics.cppm libmeanfield/interface/solver/stellar_equilibrium_types.cppm libmeanfield/interface/solver/stellar_structure.cppm libmeanfield/interface/solver/stellar_context.cppm libmeanfield/interface/solver/stellar_equilibrium.cppm libmeanfield/interface/preconditioning/backend.cppm libmeanfield/interface/preconditioning/backend_implementations.cppm libmeanfield/interface/preconditioning/gravity_field.cppm libmeanfield/interface/preconditioning/material_surface.cppm libmeanfield/interface/preconditioning/plan.cppm libmeanfield/interface/preconditioning/stellar_equilibrium.cppm libmeanfield/interface/preconditioning/stellar_structure.cppm libmeanfield/interface/preconditioning/specification_border.cppm libmeanfield/interface/preconditioning/equilibrium_coordinates.cppm libmeanfield/interface/preconditioning/stellar_recipe.cppm libmeanfield/interface/preconditioning/preconditioning.cppm libmeanfield/interface/normalization/plan.cppm libmeanfield/interface/normalization/physical_riesz.cppm libmeanfield/interface/normalization/operators.cppm libmeanfield/interface/normalization/stellar_equilibrium.cppm libmeanfield/interface/normalization/normalization.cppm libmeanfield/interface/operators/gravity_field.cppm libmeanfield/interface/operators/gravity_field_jacobian.cppm libmeanfield/interface/operators/kernels/gravity_kernels.cppm libmeanfield/interface/operators/kernels/barotropic_closure_kernels.cppm libmeanfield/interface/utils/blocks.cppm libmeanfield/interface/operators/contexts/gravity_field_context.cppm libmeanfield/interface/operators/prepared_gravity_source.cppm libmeanfield/interface/operators/prepared_hdiv_mass.cppm libmeanfield/interface/operators/prepared_hydrostatic_equilibrium_operator.cppm libmeanfield/interface/field/field_base.cppm libmeanfield/interface/field/field_registry.cppm libmeanfield/interface/field/field_mfem.cppm libmeanfield/interface/operators/prepared_barotropic_closure_operator.cppm libmeanfield/interface/operators/contexts/barotropic_closure_linearization_context.cppm libmeanfield/interface/physics/rigid_rotation.cppm libmeanfield/interface/operators/kernels/hydrostatic_equilibrium_kernels.cppm libmeanfield/interface/operators/contexts/hydrostatic_equilibrium_context.cppm libmeanfield/interface/operators/kernels/pressure_force_kernels.cppm libmeanfield/interface/operators/contexts/pressure_force_context.cppm libmeanfield/interface/operators/prepared_pressure_force.cppm libmeanfield/interface/operators/kernels/gravity_displacement_force_kernels.cppm libmeanfield/interface/operators/prepared_gravity_displacement_force.cppm libmeanfield/interface/operators/contexts/rotation_displacement_force_context.cppm libmeanfield/interface/operators/kernels/rotation_displacement_force_kernels.cppm libmeanfield/interface/operators/prepared_rotation_displacement_force.cppm libmeanfield/interface/operators/prepared_displacement_operator.cppm libmeanfield/interface/dimensions/quantities.cppm libmeanfield/interface/eos/quantities.cppm libmeanfield/interface/eos/relations.cppm libmeanfield/interface/eos/concepts.cppm libmeanfield/interface/eos/evaluation.cppm libmeanfield/interface/eos/pressure_surface.cppm libmeanfield/interface/eos/runtime.cppm libmeanfield/interface/eos/polytropic.cppm libmeanfield/interface/seed/lane_emden.cppm libmeanfield/interface/models/structure/structure_base.cppm libmeanfield/interface/models/structure/polytropic.cppm libmeanfield/interface/models/structure_profile.cppm libmeanfield/interface/models/specifications.cppm libmeanfield/interface/models/typed_stellar_model.cppm libmeanfield/interface/models/compiled_fixed_mass.cppm libmeanfield/interface/models/compiled_fixed_angular_momentum.cppm libmeanfield/interface/models/compiled_fixed_central_density.cppm libmeanfield/interface/surface/constant.cppm libmeanfield/interface/surface/dependencies.cppm libmeanfield/interface/surface/compiled.cppm libmeanfield/interface/surface/compiler.cppm libmeanfield/interface/material/thermodynamic_equations.cppm libmeanfield/interface/deformation/descriptors.cppm libmeanfield/interface/deformation/surface_prescription.cppm libmeanfield/interface/deformation/nodal_radial_surface.cppm libmeanfield/interface/deformation/interior_extension.cppm libmeanfield/interface/deformation/vacuum_extension.cppm libmeanfield/interface/deformation/radial_extensions.cppm libmeanfield/interface/deformation/domain_deformation.cppm libmeanfield/interface/deformation/safe_newton_step.cppm libmeanfield/interface/models/stellar_model.cppm libmeanfield/interface/operators/root_manifest.cppm libmeanfield/interface/operators/prepared_constraint.cppm libmeanfield/interface/operators/prepared_mass_normalization.cppm libmeanfield/interface/operators/prepared_angular_momentum.cppm libmeanfield/interface/operators/prepared_central_density.cppm libmeanfield/interface/operators/prepared_centering_constraint.cppm libmeanfield/interface/operators/prepared_surface_constraint.cppm libmeanfield/interface/operators/prepared_stellar_equilibrium.cppm libmeanfield/interface/operators/stellar_equilibrium_compiler.cppm libmeanfield/interface/operators/prepared_variadic_stellar_equilibrium.cppm libmeanfield/interface/equilibrium/stellar_discretization.cppm libmeanfield/interface/operators/stellar_equilibrium_problem.cppm libmeanfield/interface/seed/stellar_equilibrium_projection.cppm libmeanfield/interface/operators/stellar_equilibrium_system.cppm ) target_link_libraries(mean_field PUBLIC MPI::MPI_CXX XAD::xad mfem PkgConfig::stroid ) target_link_libraries(mean_field PRIVATE PkgConfig::eigen3) add_library(test_mod) target_sources(test_mod PUBLIC FILE_SET CXX_MODULES FILES tests/test_helpers.cppm ) target_link_libraries(test_mod PUBLIC mean_field ) find_package(Catch2 3 REQUIRED) cmake_policy(SET CMP0167 NEW) find_package(Boost REQUIRED) pkg_check_modules(fourdst_config REQUIRED IMPORTED_TARGET fourdst_config) add_executable(tests tests/test_main.cpp tests/physics/gravity.cpp tests/physics/dimensional_quantities.cpp tests/seed/lane_emden.cpp tests/seed/stellar_equilibrium_projection.cpp tests/geometry/volume.cpp tests/quadrature/policy.cpp tests/integrators/centrifugal.cpp tests/integrators/gravity.cpp tests/mapping/domain_mapper.cpp tests/fem/reference_tables.cpp tests/mapping/prepared_cache.cpp tests/mapping/compactification/kelvin.cpp tests/utils/blocks.cpp tests/utils/profiling.cpp tests/operators/gravity_field.cpp tests/mapping/hdiv_mass_tensor.cpp tests/operators/prepared_hdiv_mass.cpp tests/operators/prepared_gravity_source.cpp tests/operators/contexts/gravity_field_context.cpp tests/physics/gravity_monopole_accuracy.cpp tests/physics/barotrope.cpp tests/physics/polytropic_eos_characterization.cpp tests/physics/equation_of_state_type_system.cpp tests/physics/equation_of_state_consumer_contracts.cpp tests/physics/polytropic_eos_relations.cpp tests/physics/equation_of_state_runtime_view.cpp tests/material/thermodynamic_equation_compilation.cpp tests/surface/constant_surface_compilation.cpp tests/operators/kernels/barotropic_closure_kernels.cpp tests/operators/prepared_barotropic_closure.cpp tests/operators/contexts/barotropic_closure_linearization_context.cpp tests/operators/kernels/hydrostatic_equilibrium_kernels.cpp tests/operators/contexts/hydrostatic_equilibrium_context.cpp tests/operators/prepared_hydrostatic_equilibrium.cpp tests/operators/prepared_hydrostatic_equilibrium_jacobian.cpp tests/operators/prepared_hydrostatic_equilibrium_displacement_jacobian.cpp tests/operators/prepared_hydrostatic_equilibrium_complete_jacobian.cpp tests/operators/prepared_hydrostatic_equilibrium_analytic_accuracy.cpp tests/physics/barotrope_pressure.cpp tests/operators/kernels/pressure_force_kernels.cpp tests/operators/contexts/pressure_force_context.cpp tests/operators/prepared_pressure_force.cpp tests/operators/gravity_displacement_force.cpp tests/operators/gravity_displacement_force_analytic_comparisons.cpp tests/operators/contexts/rotation_displacement_force_context.cpp tests/operators/prepared_rotation_displacement_force.cpp tests/operators/prepared_rotation_displacement_force_analytic.cpp tests/operators/prepared_rotation_displacement_force_affine_deformation.cpp tests/operators/prepared_displacement_operator.cpp tests/operators/root_manifest.cpp tests/operators/stellar_equilibrium_compiler.cpp tests/operators/prepared_central_density.cpp tests/operators/prepared_central_density_stellar_equilibrium.cpp tests/models/model_specifications.cpp tests/models/typed_stellar_model.cpp tests/models/physics_specification_frontend.cpp tests/models/stellar_model.cpp tests/operators/stellar_equilibrium_system.cpp tests/deformation/contracts.cpp tests/deformation/surface_scalar_dof_map.cpp tests/deformation/nodal_radial_surface.cpp tests/deformation/radial_extensions.cpp tests/deformation/domain_deformation.cpp tests/deformation/safe_newton_step.cpp tests/operators/prepared_mass_normalization.cpp tests/operators/prepared_angular_momentum.cpp tests/operators/prepared_stellar_equilibrium.cpp tests/utils/domain.cpp tests/field/field_base.cpp tests/field/field_registry.cpp tests/field/field_mfem.cpp tests/field/field_dof_map.cpp tests/preconditioning/plan.cpp tests/preconditioning/backends.cpp tests/preconditioning/gravity_field.cpp tests/preconditioning/material_surface.cpp tests/preconditioning/stellar_structure.cpp tests/preconditioning/specification_border.cpp tests/extensions/fixed_magnetic_specific_energy.cpp tests/preconditioning/equilibrium_coordinates.cpp tests/preconditioning/stellar_equilibrium.cpp tests/normalization/plan.cpp tests/normalization/physical_riesz.cpp tests/normalization/stellar_equilibrium.cpp tests/user-api/stellar_equilibrium.cpp tests/solver/preconditioning_diagnostics.cpp tests/solver/stellar_equilibrium_architecture.cpp tests/solver/stellar_equilibrium_architecture_internal.cpp tests/solver/stellar_equilibrium_runtime.cpp ) target_link_libraries(tests PRIVATE mean_field test_mod Catch2::Catch2 Boost::boost) # A deliberately opt-in API workbench. It is compiled explicitly during API # verification but temporary user experiments do not break the default build. add_executable(sandbox EXCLUDE_FROM_ALL sandbox.cpp) target_link_libraries(sandbox PRIVATE mean_field) # Opt-in diagnostics using the same context and operators as the sandbox. add_executable(geometry_quality_experiment EXCLUDE_FROM_ALL experiments/geometry_quality_experiment.cpp) target_link_libraries(geometry_quality_experiment PRIVATE mean_field) # Independent n=1 reference and physical checks; does not change sandbox defaults. add_executable(polytrope_validation_experiment EXCLUDE_FROM_ALL experiments/polytrope_validation_experiment.cpp) target_link_libraries(polytrope_validation_experiment PRIVATE mean_field) add_executable(mpi_tests tests/mpi/mpi_test_main.cpp tests/mpi/distributed_execution.cpp tests/mpi/profiling.cpp tests/deformation/safe_newton_step.cpp ) target_link_libraries(mpi_tests PRIVATE mean_field test_mod Catch2::Catch2 Boost::boost) if (MEAN_FIELD_ENABLE_IPO) set_property(TARGET tests PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) set_property(TARGET mpi_tests PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) endif () add_library(experiment_mod) target_sources(experiment_mod PUBLIC FILE_SET CXX_MODULES FILES experiments/experiment_results.cppm experiments/stellar_null_space.cppm ) target_link_libraries(experiment_mod PUBLIC mean_field test_mod ) add_executable(experiments experiments/experiment_main.cpp experiments/full_stellar_preconditioning.cpp experiments/gravity_accuracy_budget.cpp experiments/gravity_preconditioning.cpp experiments/material_surface_preconditioning.cpp experiments/preconditioning_diagnostics.cpp ) target_link_libraries(experiments PRIVATE mean_field test_mod experiment_mod Catch2::Catch2 Boost::boost) add_executable(stellar_null_space_experiments experiments/experiment_main.cpp experiments/rigid_motion_null_space.cpp experiments/gravity_completed_rigid_motion.cpp experiments/coupled_gauge_modes.cpp ) target_link_libraries(stellar_null_space_experiments PRIVATE mean_field test_mod experiment_mod Catch2::Catch2 Boost::boost ) if (MEAN_FIELD_ENABLE_IPO) foreach (mean_field_ipo_target IN ITEMS test_mod experiment_mod experiments stellar_null_space_experiments) set_property(TARGET ${mean_field_ipo_target} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) endforeach () endif () include (CTest) include (Catch) catch_discover_tests( tests experiments WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) add_test( NAME mpi_single_rank_stellar_root COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 1 ${MPIEXEC_PREFLAGS} $ ${MPIEXEC_POSTFLAGS} "[single-rank]" ) set_tests_properties( mpi_single_rank_stellar_root PROPERTIES LABELS "mpi;single-rank" PROCESSORS 1 RESOURCE_LOCK mean_field_mpi TIMEOUT 600 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) foreach (mean_field_mpi_ranks IN ITEMS 2 4) add_test( NAME mpi_${mean_field_mpi_ranks}_ranks COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${mean_field_mpi_ranks} ${MPIEXEC_PREFLAGS} $ ${MPIEXEC_POSTFLAGS} "[mpi]~[single-rank]" ) set_tests_properties( mpi_${mean_field_mpi_ranks}_ranks PROPERTIES LABELS "mpi;distributed" PROCESSORS ${mean_field_mpi_ranks} RESOURCE_LOCK mean_field_mpi TIMEOUT 180 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) endforeach () add_custom_target( check_mpi COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure --label-regex "mpi" DEPENDS mpi_tests USES_TERMINAL ) # A deliberately separate, physics-developer-facing example. Its targets # depend on MeanField, but none of its sources are part of the mean_field # library or the main regression-test executable. add_subdirectory(extension_example)