From fab7edbff8f313f625ad54dc5bda1f4879303d04 Mon Sep 17 00:00:00 2001 From: PhilipDeegan Date: Mon, 21 Jul 2025 18:36:33 +0200 Subject: [PATCH 1/3] Simulator template struct --- CMakeLists.txt | 3 +- src/amr/data/particles/refine/split.hpp | 4 +- src/amr/data/particles/refine/splitter.hpp | 1 - src/core/utilities/meta/meta_utilities.hpp | 26 +++-- src/phare_amr.hpp | 45 ++++---- src/phare_core.hpp | 68 ++++++------ src/phare_simulator_options.hpp | 24 +++++ src/phare_solver.hpp | 55 +++++----- src/python3/cpp_simulator.hpp | 55 ++++++---- src/python3/data_wrangler.hpp | 49 +++++---- src/python3/patch_level.hpp | 21 ++-- src/simulator/phare_types.hpp | 73 ++++++------- src/simulator/simulator.hpp | 102 +++++++++--------- tests/amr/messengers/test_messengers.cpp | 21 ++-- tests/amr/tagging/test_tagging.cpp | 15 +-- .../test_ion_population_fixtures.hpp | 47 ++++---- .../test_particle_array_consistency.cpp | 2 +- .../core/numerics/interpolator/test_main.cpp | 37 ++++--- .../numerics/ion_updater/test_updater.cpp | 17 +-- tests/simulator/per_test.hpp | 55 +++++----- tools/bench/amr/data/particles/CMakeLists.txt | 2 +- tools/bench/amr/data/particles/copy_data.cpp | 9 +- .../bench/core/data/particles/CMakeLists.txt | 2 +- .../core/numerics/interpolator/CMakeLists.txt | 2 +- .../core/numerics/interpolator/bench_main.cpp | 15 +-- .../core/numerics/ion_updater/CMakeLists.txt | 2 +- .../ion_updater/bench_ion_updater.cpp | 9 +- .../bench/core/numerics/pusher/CMakeLists.txt | 4 +- .../bench/core/numerics/pusher/push_bench.hpp | 6 +- .../core/numerics/pusher/push_raw_use.cpp | 7 +- tools/bench/core/numerics/pusher/pusher.cpp | 9 +- tools/bench/hi5/CMakeLists.txt | 2 +- 32 files changed, 421 insertions(+), 368 deletions(-) create mode 100644 src/phare_simulator_options.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f89a6d74b..a346249d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,8 @@ if(PHARE_WITH_CCACHE) endif() #### +include("${PHARE_PROJECT_DIR}/res/cmake/test.cmake") + #******************************************************************************* # PHARE source code add_subdirectory(src/core) @@ -56,7 +58,6 @@ add_subdirectory(src/python3) add_subdirectory(src/phare) #******************************************************************************* -include("${PHARE_PROJECT_DIR}/res/cmake/test.cmake") include("${PHARE_PROJECT_DIR}/res/cmake/bench.cmake") print_phare_options() diff --git a/src/amr/data/particles/refine/split.hpp b/src/amr/data/particles/refine/split.hpp index 1d70a7689..4771cc13d 100644 --- a/src/amr/data/particles/refine/split.hpp +++ b/src/amr/data/particles/refine/split.hpp @@ -1,8 +1,8 @@ #ifndef PHARE_SPLIT_HPP #define PHARE_SPLIT_HPP -#include "amr/data/particles/refine/split_1d.hpp" -#include "amr/data/particles/refine/split_2d.hpp" +#include "amr/data/particles/refine/split_1d.hpp" // IWYU pragma: keep +#include "amr/data/particles/refine/split_2d.hpp" // IWYU pragma: keep #endif // endif PHARE_SPLIT_HPP diff --git a/src/amr/data/particles/refine/splitter.hpp b/src/amr/data/particles/refine/splitter.hpp index 76dc21c36..f199eac41 100644 --- a/src/amr/data/particles/refine/splitter.hpp +++ b/src/amr/data/particles/refine/splitter.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/src/core/utilities/meta/meta_utilities.hpp b/src/core/utilities/meta/meta_utilities.hpp index 7007a130c..0bcad7fb4 100644 --- a/src/core/utilities/meta/meta_utilities.hpp +++ b/src/core/utilities/meta/meta_utilities.hpp @@ -78,11 +78,17 @@ namespace core SimulatorOption, InterpConst<1>, 4, 5, 8, 9>, SimulatorOption, InterpConst<2>, 4, 5, 8, 9, 16>, - SimulatorOption, InterpConst<3>, 4, 5, 8, 9, 25>>{}; + SimulatorOption, InterpConst<3>, 4, 5, 8, 9, 25>, + + SimulatorOption, InterpConst<1>, 6, 12>, + SimulatorOption, InterpConst<2>, 6, 12>, + SimulatorOption, InterpConst<3>, 6, 12> + + >{}; } - template - constexpr auto defaultNbrRefinedParts() + + constexpr std::size_t defaultNbrRefinedParts(std::size_t dim, std::size_t interp) { auto sims = possibleSimulators(); using SimsTuple_t = decltype(sims); @@ -93,8 +99,8 @@ namespace core for_N([&](auto i) { using SimOption = std::tuple_element_t; - if constexpr (std::tuple_element_t<0, SimOption>{}() == dim - and std::tuple_element_t<1, SimOption>{}() == interp) + if (std::tuple_element_t<0, SimOption>{}() == dim + and std::tuple_element_t<1, SimOption>{}() == interp) { nbRefinedPart = std::tuple_element_t<2, SimOption>{}; } @@ -116,8 +122,9 @@ namespace core using SimuType = std::decay_t; using _dim = typename std::tuple_element<0, SimuType>::type; - if (!p) - p = maker(dim, _dim{}); + if constexpr (_dim{}() < 3) // TORM + if (!p) + p = maker(dim, _dim{}); }); return p; @@ -144,7 +151,10 @@ namespace core Ptr_t p = nullptr; core::apply(possibleSimulators(), [&](auto const& simType) { - _makeAtRuntime(maker, p, dim, interpOrder, nbRefinedPart, simType); + using SimuType = std::decay_t; // TORM + using _dim = typename std::tuple_element<0, SimuType>::type; // TORM + if constexpr (_dim{}() < 3) // TORM + _makeAtRuntime(maker, p, dim, interpOrder, nbRefinedPart, simType); }); return p; diff --git a/src/phare_amr.hpp b/src/phare_amr.hpp index b492e9ea3..2279be68d 100644 --- a/src/phare_amr.hpp +++ b/src/phare_amr.hpp @@ -2,45 +2,42 @@ #define PHARE_AMR_INCLUDE_HPP -#include "core/def/phare_mpi.hpp" +#include "core/def/phare_mpi.hpp" // IWYU pragma: keep + +#include "phare_core.hpp" +#include "amr/wrappers/hierarchy.hpp" +#include "amr/data/particles/refine/splitter.hpp" +#include "amr/data/particles/refine/particles_data_split.hpp" -#include -#include #include -#include +#include #include +#include +#include +#include +#include #include #include #include -#include #include -#include -#include -#include -#include - - +#include +#include +#include -#include "phare_core.hpp" -#include "amr/amr_constants.hpp" -#include "amr/types/amr_types.hpp" -#include "amr/wrappers/hierarchy.hpp" -#include "amr/wrappers/integrator.hpp" -#include "amr/messengers/messenger_factory.hpp" -#include "amr/data/particles/refine/splitter.hpp" -#include "amr/data/particles/refine/particles_data_split.hpp" namespace PHARE::amr { -template +template struct PHARE_Types { - static auto constexpr dimension = dimension_; - static auto constexpr interp_order = interp_order_; - static auto constexpr nbRefinedPart = nbRefinedPart_; + auto static constexpr dimension = opts.dimension; + auto static constexpr interp_order = opts.interp_order; + auto static constexpr nbRefinedPart = opts.nbRefinedPart; + + using core_types = PHARE::core::PHARE_Types; using hierarchy_t = PHARE::amr::Hierarchy; @@ -48,8 +45,6 @@ struct PHARE_Types PHARE::core::InterpConst, PHARE::core::RefinedParticlesConst>; - using core_types = PHARE::core::PHARE_Types; - using RefinementParams = PHARE::amr::RefinementParams; }; diff --git a/src/phare_core.hpp b/src/phare_core.hpp index 0d6ef0d83..0db049e7e 100644 --- a/src/phare_core.hpp +++ b/src/phare_core.hpp @@ -1,63 +1,57 @@ #ifndef PHARE_CORE_INCLUDE_HPP #define PHARE_CORE_INCLUDE_HPP +#include "core/data/ions/ions.hpp" #include "core/data/grid/grid.hpp" -#include "core/data/electromag/electromag.hpp" -#include "core/data/electrons/electrons.hpp" #include "core/data/grid/gridlayout.hpp" +#include "core/data/vecfield/vecfield.hpp" +#include "core/data/electrons/electrons.hpp" +#include "core/data/electromag/electromag.hpp" #include "core/data/grid/gridlayoutimplyee.hpp" -#include "core/data/ions/ion_population/ion_population.hpp" -#include "core/data/ions/ions.hpp" -#include "core/data/ions/particle_initializers/maxwellian_particle_initializer.hpp" #include "core/data/ndarray/ndarray_vector.hpp" #include "core/data/particles/particle_array.hpp" -#include "core/data/vecfield/vecfield.hpp" -#include "core/models/physical_state.hpp" -#include "core/models/physical_state.hpp" -#include "core/utilities/meta/meta_utilities.hpp" -#include "core/utilities/algorithm.hpp" -#include "core/logger.hpp" +#include "core/data/ions/ion_population/ion_population.hpp" +#include "core/data/ions/particle_initializers/maxwellian_particle_initializer.hpp" + +#include "phare_simulator_options.hpp" + +#include "cppdict/include/dict.hpp" #include -#include -#include #include #include -#include "cppdict/include/dict.hpp" - namespace PHARE::core { -template + +template struct PHARE_Types { - static auto constexpr dimension = dimension_; - static auto constexpr interp_order = interp_order_; + auto static constexpr dimension = opts.dimension; + auto static constexpr interp_order = opts.interp_order; - using Array_t = PHARE::core::NdArrayVector; - using ArrayView_t = PHARE::core::NdArrayView; - using Grid_t = PHARE::core::Grid; - using Field_t = PHARE::core::Field; - using VecField_t = PHARE::core::VecField; - using SymTensorField_t = PHARE::core::SymTensorField; - using Electromag_t = PHARE::core::Electromag; - using YeeLayout_t = PHARE::core::GridLayoutImplYee; - using GridLayout_t = PHARE::core::GridLayout; + using Array_t = NdArrayVector; + using ArrayView_t = NdArrayView; + using Grid_t = Grid; + using Field_t = Field; + using VecField_t = VecField; + using SymTensorField_t = SymTensorField; + using Electromag_t = Electromag; + using YeeLayout_t = GridLayoutImplYee; + using GridLayout_t = GridLayout; - using Particle_t = PHARE::core::Particle; - using ParticleAoS_t = PHARE::core::ParticleArray; + using Particle_t = Particle; + using ParticleAoS_t = ParticleArray; using ParticleArray_t = ParticleAoS_t; - using ParticleSoA_t = PHARE::core::ContiguousParticles; + using ParticleSoA_t = ContiguousParticles; using MaxwellianParticleInitializer_t - = PHARE::core::MaxwellianParticleInitializer; - using IonPopulation_t - = PHARE::core::IonPopulation; - using Ions_t = PHARE::core::Ions; - using Electrons_t = PHARE::core::Electrons; + = MaxwellianParticleInitializer; + using IonPopulation_t = IonPopulation; + using Ions_t = Ions; + using Electrons_t = Electrons; - using ParticleInitializerFactory - = PHARE::core::ParticleInitializerFactory; + using ParticleInitializerFactory_t = ParticleInitializerFactory; }; struct PHARE_Sim_Types diff --git a/src/phare_simulator_options.hpp b/src/phare_simulator_options.hpp new file mode 100644 index 000000000..666144650 --- /dev/null +++ b/src/phare_simulator_options.hpp @@ -0,0 +1,24 @@ +#ifndef PHARE_SIMULATOR_OPTIONS_HPP +#define PHARE_SIMULATOR_OPTIONS_HPP + +#include "core/utilities/meta/meta_utilities.hpp" + +#include + +namespace PHARE +{ + + +struct SimOpts +{ + std::size_t dimension = 1; + std::size_t interp_order = 1; + + std::size_t nbRefinedPart = core::defaultNbrRefinedParts(dimension, interp_order); +}; + + + +} // namespace PHARE + +#endif // PHARE_SIMULATOR_OPTIONS_HPP diff --git a/src/phare_solver.hpp b/src/phare_solver.hpp index 04b1abbd4..51c8ccd09 100644 --- a/src/phare_solver.hpp +++ b/src/phare_solver.hpp @@ -2,57 +2,54 @@ #ifndef PHARE_SOLVER_INCLUDE_HPP #define PHARE_SOLVER_INCLUDE_HPP -#include "phare_amr.hpp" +#include "phare_amr.hpp" // IWYU pragma: keep -#include "amr/solvers/solver.hpp" #include "amr/solvers/solver_mhd.hpp" #include "amr/solvers/solver_ppc.hpp" -#include "amr/level_initializer/level_initializer.hpp" -#include "amr/level_initializer/level_initializer_factory.hpp" #include "amr/multiphysics_integrator.hpp" -#include "amr/physical_models/hybrid_model.hpp" #include "amr/physical_models/mhd_model.hpp" +#include "amr/messengers/messenger_factory.hpp" +#include "amr/physical_models/hybrid_model.hpp" #include "amr/physical_models/physical_model.hpp" +#include "amr/level_initializer/level_initializer_factory.hpp" namespace PHARE::solver { -template +template struct PHARE_Types { - static auto constexpr dimension = dimension_; - static auto constexpr interp_order = interp_order_; - static auto constexpr nbRefinedPart = nbRefinedPart_; + auto static constexpr dimension = opts.dimension; + auto static constexpr interp_order = opts.interp_order; + auto static constexpr nbRefinedPart = opts.nbRefinedPart; // core deps - using core_types = PHARE::core::PHARE_Types; - using VecField_t = typename core_types::VecField_t; - using Grid_t = typename core_types::Grid_t; - using Electromag_t = typename core_types::Electromag_t; - using Ions_t = typename core_types::Ions_t; - using GridLayout_t = typename core_types::GridLayout_t; - using Electrons_t = typename core_types::Electrons_t; + using core_types = PHARE::core::PHARE_Types; + using VecField_t = core_types::VecField_t; + using Grid_t = core_types::Grid_t; + using Electromag_t = core_types::Electromag_t; + using Ions_t = core_types::Ions_t; + using GridLayout_t = core_types::GridLayout_t; + using Electrons_t = core_types::Electrons_t; // core deps - using IPhysicalModel = PHARE::solver::IPhysicalModel; - using HybridModel_t = PHARE::solver::HybridModel; - using MHDModel_t - = PHARE::solver::MHDModel; - using SolverPPC_t = PHARE::solver::SolverPPC; - using SolverMHD_t = PHARE::solver::SolverMHD; - using LevelInitializerFactory_t = PHARE::solver::LevelInitializerFactory; + using HybridModel_t = HybridModel; + using MHDModel_t = MHDModel; + using SolverPPC_t = SolverPPC; + using SolverMHD_t = SolverMHD; + using LevelInitializerFactory_t = LevelInitializerFactory; // amr deps - using amr_types = PHARE::amr::PHARE_Types; - using RefinementParams = typename amr_types::RefinementParams; + using amr_types = PHARE::amr::PHARE_Types; + using RefinementParams = amr_types::RefinementParams; using MessengerFactory // = amr/solver bidirectional dependency = PHARE::amr::MessengerFactory; // amr deps - using MultiPhysicsIntegrator - = PHARE::solver::MultiPhysicsIntegrator; + using MultiPhysicsIntegrator_t + = MultiPhysicsIntegrator; }; } // namespace PHARE::solver diff --git a/src/python3/cpp_simulator.hpp b/src/python3/cpp_simulator.hpp index 7b78094bb..8e5ef490e 100644 --- a/src/python3/cpp_simulator.hpp +++ b/src/python3/cpp_simulator.hpp @@ -1,30 +1,27 @@ #ifndef PHARE_PYTHON_CPP_SIMULATOR_HPP #define PHARE_PYTHON_CPP_SIMULATOR_HPP -#include -#include - -#include "core/def/phare_mpi.hpp" +#include "phare/phare.hpp" +#include "core/def/phare_mpi.hpp" // IWYU pragma: keep #include "core/utilities/mpi_utils.hpp" -#include "core/data/particles/particle.hpp" -#include "core/utilities/meta/meta_utilities.hpp" + #include "amr/wrappers/hierarchy.hpp" -#include "phare/phare.hpp" + #include "simulator/simulator.hpp" -#include "python3/pybind_def.hpp" -#include "pybind11/stl.h" -#include "pybind11/numpy.h" -#include "pybind11/chrono.h" -#include "pybind11/complex.h" -#include "pybind11/functional.h" +#include "pybind11/stl.h" // IWYU pragma: keep +#include "pybind11/numpy.h" // IWYU pragma: keep +#include "pybind11/chrono.h" // IWYU pragma: keep +#include "pybind11/complex.h" // IWYU pragma: keep +#include "pybind11/functional.h" // IWYU pragma: keep #include "python3/particles.hpp" #include "python3/patch_data.hpp" #include "python3/patch_level.hpp" #include "python3/data_wrangler.hpp" +#include namespace py = pybind11; @@ -83,12 +80,13 @@ void declare_etc(py::module& m) constexpr auto dim = _dim{}(); constexpr auto interp = _interp{}(); constexpr auto nbRefinedPart = _nbRefinedPart{}(); + constexpr auto opts = SimOpts{dim, interp, nbRefinedPart}; std::string type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" + std::to_string(nbRefinedPart); - using Sim = Simulator; - using DW = DataWrangler; + using Sim = Simulator; + using DW = DataWrangler; std::string name = "DataWrangler" + type_string; py::class_>(m, name.c_str()) .def(py::init const&, std::shared_ptr const&>()) @@ -97,7 +95,7 @@ void declare_etc(py::module& m) .def("getPatchLevel", &DW::getPatchLevel) .def("getNumberOfLevels", &DW::getNumberOfLevels); - using PL = PatchLevel; + using PL = PatchLevel; name = "PatchLevel_" + type_string; py::class_>(m, name.c_str()) @@ -140,11 +138,12 @@ void declare_sim(py::module& m) constexpr auto dim = _dim{}(); constexpr auto interp = _interp{}(); constexpr auto nbRefinedPart = _nbRefinedPart{}(); + constexpr auto opts = SimOpts{dim, interp, nbRefinedPart}; std::string type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" + std::to_string(nbRefinedPart); - using Sim = Simulator; + using Sim = Simulator; std::string name = "Simulator" + type_string; declareSimulator( py::class_>(m, name.c_str()) @@ -156,20 +155,32 @@ void declare_sim(py::module& m) name = "make_simulator" + type_string; m.def(name.c_str(), [](std::shared_ptr const& hier) { - return std::shared_ptr{std::move(makeSimulator(hier))}; + return std::shared_ptr{std::move(makeSimulator(hier))}; }); } +template +constexpr bool valid_simulator() +{ + return dim{}() < 3; +} + template void declare_all(py::module& m, std::tuple const&) { core::apply(std::tuple{}, [&](auto& nbRefinedPart) { - declare_sim>(m); - declare_etc>(m); + using NbRefinedPart_t = std::decay_t; + + if constexpr (valid_simulator()) + { + declare_sim(m); + declare_etc(m); + } }); } -void declare_essential(py::module& m) + +void inline declare_essential(py::module& m) { py::class_>(m, "SamraiLifeCycle") .def(py::init<>()) @@ -189,7 +200,7 @@ void declare_essential(py::module& m) // https://stackoverflow.com/a/51061314/795574 // ASAN detects leaks by default, even in system/third party libraries -inline const char* __asan_default_options() +inline char const* __asan_default_options() { return "detect_leaks=0"; } diff --git a/src/python3/data_wrangler.hpp b/src/python3/data_wrangler.hpp index 9baf06d0f..660dd8f94 100644 --- a/src/python3/data_wrangler.hpp +++ b/src/python3/data_wrangler.hpp @@ -1,31 +1,36 @@ #ifndef PHARE_PYTHON_DATA_WRANGLER_HPP #define PHARE_PYTHON_DATA_WRANGLER_HPP - -#include -#include -#include -#include -#include -#include -#include -#include "amr/wrappers/hierarchy.hpp" -#include "core/utilities/meta/meta_utilities.hpp" #include "core/utilities/mpi_utils.hpp" #include "core/utilities/point/point.hpp" -#include "cppdict/include/dict.hpp" +#include "core/utilities/meta/meta_utilities.hpp" + +#include "amr/wrappers/hierarchy.hpp" + #include "initializer/data_provider.hpp" + #include "python3/patch_data.hpp" #include "python3/patch_level.hpp" + #include "simulator/simulator.hpp" +#include "cppdict/include/dict.hpp" + +#include +#include +#include +#include +#include +#include +#include + namespace PHARE::pydata { -template +template class SimulatorCaster { public: - using Simulator_t = Simulator; + using Simulator_t = Simulator; SimulatorCaster(std::shared_ptr const& _simulator) : simulator{_simulator} @@ -45,7 +50,8 @@ class SimulatorCaster std::size_t constexpr nb = nbRefinedPart_fn(); // extra if constexpr as cast is templated and not generic interface - if constexpr (d == dimension and io == interp_order and nb == nbRefinedPart) + if constexpr (d == opts.dimension and io == opts.interp_order + and nb == opts.nbRefinedPart) return dynamic_cast(simulator.get()); } return nullptr; @@ -57,16 +63,14 @@ class SimulatorCaster -template +template class __attribute__((visibility("hidden"))) DataWrangler { public: - static constexpr std::size_t dimension = _dimension; - static constexpr std::size_t interp_order = _interp_order; - static constexpr std::size_t nbRefinedPart = _nbRefinedPart; + static constexpr std::size_t dimension = opts.dimension; - using Simulator = PHARE::Simulator; - using HybridModel = typename Simulator::HybridModel; + using Simulator = PHARE::Simulator; + using HybridModel = Simulator::HybridModel; DataWrangler(std::shared_ptr const& simulator, std::shared_ptr const& hierarchy) @@ -81,8 +85,7 @@ class __attribute__((visibility("hidden"))) DataWrangler auto getPatchLevel(size_t lvl) { - return PatchLevel<_dimension, _interp_order, _nbRefinedPart>{ - *hierarchy_, *simulator_.getHybridModel(), lvl}; + return PatchLevel{*hierarchy_, *simulator_.getHybridModel(), lvl}; } auto sort_merge_1d(std::vector, dimension>> const&& input, @@ -167,7 +170,7 @@ class __attribute__((visibility("hidden"))) DataWrangler static Simulator& cast_simulator(std::shared_ptr const& simulator) { - using SimulatorCaster = SimulatorCaster; + using SimulatorCaster = SimulatorCaster; auto const& simDict = initializer::PHAREDictHandler::INSTANCE().dict()["simulation"]; diff --git a/src/python3/patch_level.hpp b/src/python3/patch_level.hpp index 40a672ed1..45076a0fb 100644 --- a/src/python3/patch_level.hpp +++ b/src/python3/patch_level.hpp @@ -1,28 +1,25 @@ #ifndef PHARE_PYTHON_PATCH_LEVEL_HPP #define PHARE_PYTHON_PATCH_LEVEL_HPP -#include +#include "patch_data.hpp" +#include "phare_solver.hpp" + +#include #include #include -#include -#include -#include "phare_solver.hpp" namespace PHARE::pydata { -template +template class __attribute__((visibility("hidden"))) PatchLevel { public: - static constexpr std::size_t dimension = dim; - static constexpr std::size_t interp_order = interpOrder; - static constexpr std::size_t nbRefinedPart = nbrRefPart; - - using PHARESolverTypes = solver::PHARE_Types; - using HybridModel = typename PHARESolverTypes::HybridModel_t; + static constexpr std::size_t dimension = opts.dimension; - using GridLayout = typename HybridModel::gridlayout_type; + using PHARESolverTypes = solver::PHARE_Types; + using HybridModel = PHARESolverTypes::HybridModel_t; + using GridLayout = HybridModel::gridlayout_type; PatchLevel(amr::Hierarchy& hierarchy, HybridModel& model, std::size_t lvl) : lvl_(lvl) diff --git a/src/simulator/phare_types.hpp b/src/simulator/phare_types.hpp index 08d2c7707..85b5aa406 100644 --- a/src/simulator/phare_types.hpp +++ b/src/simulator/phare_types.hpp @@ -3,53 +3,42 @@ #include "phare_solver.hpp" -#include "initializer/data_provider.hpp" -#include "diagnostic/diagnostics.hpp" -#include "restarts/restarts.hpp" + namespace PHARE { -template +template struct PHARE_Types { - static auto constexpr dimension = dimension_; - static auto constexpr interp_order = interp_order_; - static auto constexpr nbRefinedPart = nbRefinedPart_; - - using core_types = PHARE::core::PHARE_Types; - using Array_t = typename core_types::Array_t; - using Grid_t = typename core_types::Grid_t; - using Field_t = typename core_types::Field_t; - using VecField_t = typename core_types::VecField_t; - using Electromag_t = typename core_types::Electromag_t; - using Ions_t = typename core_types::Ions_t; - using YeeLayout_t = typename core_types::YeeLayout_t; - using GridLayout_t = typename core_types::GridLayout_t; - using ParticleArray_t = typename core_types::ParticleArray_t; - using MaxwellianParticleInitializer_t = typename core_types::MaxwellianParticleInitializer_t; - using IonPopulation_t = typename core_types::IonPopulation_t; - using Electrons_t = typename core_types::Electrons_t; - using ParticleInitializerFactory = typename core_types::ParticleInitializerFactory; - - - - using amr_types = PHARE::amr::PHARE_Types; - using hierarchy_t = typename amr_types::hierarchy_t; - using Splitter = typename amr_types::Splitter_t; - using RefinementParams = typename amr_types::RefinementParams; - - - - - using solver_types = PHARE::solver::PHARE_Types; - using IPhysicalModel = typename solver_types::IPhysicalModel; - using HybridModel_t = typename solver_types::HybridModel_t; - using MHDModel_t = typename solver_types::MHDModel_t; - using SolverPPC_t = typename solver_types::SolverPPC_t; - using SolverMHD_t = typename solver_types::SolverMHD_t; - using MessengerFactory = typename solver_types::MessengerFactory; - using LevelInitializerFactory_t = typename solver_types::LevelInitializerFactory_t; - using MultiPhysicsIntegrator = typename solver_types::MultiPhysicsIntegrator; + static auto constexpr dimension = opts.dimension; + static auto constexpr interp_order = opts.interp_order; + static auto constexpr nbRefinedPart = opts.nbRefinedPart; + + using core_types = core::PHARE_Types; + using Array_t = core_types::Array_t; + using Grid_t = core_types::Grid_t; + using Field_t = core_types::Field_t; + using VecField_t = core_types::VecField_t; + using Electromag_t = core_types::Electromag_t; + using Ions_t = core_types::Ions_t; + using GridLayout_t = core_types::GridLayout_t; + using ParticleArray_t = core_types::ParticleArray_t; + using IonPopulation_t = core_types::IonPopulation_t; + using Electrons_t = core_types::Electrons_t; + using ParticleInitializerFactory = core_types::ParticleInitializerFactory_t; + + using amr_types = amr::PHARE_Types; + using hierarchy_t = amr_types::hierarchy_t; + using Splitter = amr_types::Splitter_t; + using RefinementParams = amr_types::RefinementParams; + + using solver_types = solver::PHARE_Types; + using HybridModel_t = solver_types::HybridModel_t; + using MHDModel_t = solver_types::MHDModel_t; + using SolverPPC_t = solver_types::SolverPPC_t; + using SolverMHD_t = solver_types::SolverMHD_t; + using MessengerFactory = solver_types::MessengerFactory; + using MultiPhysicsIntegrator = solver_types::MultiPhysicsIntegrator_t; }; } // namespace PHARE diff --git a/src/simulator/simulator.hpp b/src/simulator/simulator.hpp index 84439cea6..3937f09cc 100644 --- a/src/simulator/simulator.hpp +++ b/src/simulator/simulator.hpp @@ -1,9 +1,6 @@ #ifndef PHARE_SIMULATOR_SIMULATOR_HPP #define PHARE_SIMULATOR_SIMULATOR_HPP -#include -#include - #include "phare_core.hpp" #include "phare_types.hpp" @@ -12,11 +9,21 @@ #include "core/utilities/types.hpp" #include "core/utilities/mpi_utils.hpp" #include "core/utilities/timestamps.hpp" + +#include "amr/wrappers/integrator.hpp" #include "amr/tagging/tagger_factory.hpp" #include "amr/load_balancing/load_balancer_details.hpp" #include "amr/load_balancing/load_balancer_manager.hpp" #include "amr/load_balancing/load_balancer_estimator_hybrid.hpp" +#include "diagnostic/diagnostics.hpp" + +#include "restarts/restarts.hpp" + +#include +#include + + namespace PHARE { class ISimulator @@ -42,10 +49,28 @@ class ISimulator virtual bool dump(double timestamp, double timestep) { return false; } // overriding optional }; -template +template class Simulator : public ISimulator { public: + std::size_t static constexpr dimension = opts.dimension; + std::size_t static constexpr interp_order = opts.interp_order; + std::size_t static constexpr nbRefinedPart = opts.nbRefinedPart; + + using SAMRAITypes = PHARE::amr::SAMRAI_Types; + using PHARETypes = PHARE_Types; + using IPhysicalModel = PHARE::solver::IPhysicalModel; + using HybridModel = PHARETypes::HybridModel_t; + using MHDModel = PHARETypes::MHDModel_t; + using SolverMHD = PHARETypes::SolverMHD_t; + using SolverPPC = PHARETypes::SolverPPC_t; + using MessengerFactory = PHARETypes::MessengerFactory; + using MultiPhysicsIntegrator = PHARETypes::MultiPhysicsIntegrator; + using SimFunctorParams = core::PHARE_Sim_Types::SimFunctorParams; + using SimFunctors = core::PHARE_Sim_Types::SimulationFunctors; + using Integrator = PHARE::amr::Integrator; + + NO_DISCARD double startTime() override { return startTime_; } NO_DISCARD double endTime() override { return finalTime_; } NO_DISCARD double timeStep() override { return dt_; } @@ -87,27 +112,7 @@ class Simulator : public ISimulator std::cout.rdbuf(coutbuf); } - static constexpr std::size_t dimension = _dimension; - static constexpr std::size_t interp_order = _interp_order; - static constexpr std::size_t nbRefinedPart = _nbRefinedPart; - - using SAMRAITypes = PHARE::amr::SAMRAI_Types; - using PHARETypes = PHARE_Types; - - using IPhysicalModel = PHARE::solver::IPhysicalModel; - using HybridModel = typename PHARETypes::HybridModel_t; - using MHDModel = typename PHARETypes::MHDModel_t; - using SolverMHD = typename PHARETypes::SolverMHD_t; - using SolverPPC = typename PHARETypes::SolverPPC_t; - - using MessengerFactory = typename PHARETypes::MessengerFactory; - using MultiPhysicsIntegrator = typename PHARETypes::MultiPhysicsIntegrator; - - using SimFunctorParams = typename core::PHARE_Sim_Types::SimFunctorParams; - using SimFunctors = typename core::PHARE_Sim_Types::SimulationFunctors; - - using Integrator = PHARE::amr::Integrator; protected: // provided to force flush for diags @@ -207,8 +212,8 @@ namespace // Definitions //----------------------------------------------------------------------------- -template -double Simulator::restarts_init(initializer::PHAREDict const& dict) +template +double Simulator::restarts_init(initializer::PHAREDict const& dict) { rMan = restarts::RestartsManagerResolver::make_unique(*hierarchy_, *hybridModel_, dict); @@ -224,8 +229,8 @@ double Simulator::restarts_init(initializer::PHARED -template -void Simulator::diagnostics_init(initializer::PHAREDict const& dict) +template +void Simulator::diagnostics_init(initializer::PHAREDict const& dict) { dMan = PHARE::diagnostic::DiagnosticsManagerResolver::make_unique(*hierarchy_, *hybridModel_, dict); @@ -250,8 +255,8 @@ void Simulator::diagnostics_init(initializer::PHARE -template -void Simulator::hybrid_init(initializer::PHAREDict const& dict) +template +void Simulator::hybrid_init(initializer::PHAREDict const& dict) { hybridModel_ = std::make_shared( dict["simulation"], std::make_shared()); @@ -283,7 +288,7 @@ void Simulator::hybrid_init(initializer::PHAREDict amr::LoadBalancerDetails lb_info = amr::LoadBalancerDetails::FROM(dict["simulation"]["AMR"]["loadbalancing"]); - auto lbm_ = std::make_unique>(dict); + auto lbm_ = std::make_unique>(dict); auto lbe_ = std::make_shared>(lb_info.mode, lbm_->getId()); @@ -323,10 +328,9 @@ void Simulator::hybrid_init(initializer::PHAREDict -template -Simulator<_dimension, _interp_order, _nbRefinedPart>::Simulator( - PHARE::initializer::PHAREDict const& dict, - std::shared_ptr const& hierarchy) +template +Simulator::Simulator(PHARE::initializer::PHAREDict const& dict, + std::shared_ptr const& hierarchy) : coutbuf{logging(log_out)} , hierarchy_{hierarchy} , modelNames_{"HybridModel"} @@ -347,8 +351,8 @@ Simulator<_dimension, _interp_order, _nbRefinedPart>::Simulator( -template -std::string Simulator<_dimension, _interp_order, _nbRefinedPart>::to_str() +template +std::string Simulator::to_str() { std::stringstream ss; ss << "PHARE SIMULATOR\n"; @@ -364,8 +368,8 @@ std::string Simulator<_dimension, _interp_order, _nbRefinedPart>::to_str() -template -void Simulator<_dimension, _interp_order, _nbRefinedPart>::initialize() +template +void Simulator::initialize() { PHARE_LOG_SCOPE(1, "Simulator::initialize"); @@ -405,8 +409,8 @@ void Simulator<_dimension, _interp_order, _nbRefinedPart>::initialize() -template -double Simulator<_dimension, _interp_order, _nbRefinedPart>::advance(double dt) +template +double Simulator::advance(double dt) { PHARE_LOG_SCOPE(1, "Simulator::advance"); double dt_new = 0; @@ -442,8 +446,8 @@ double Simulator<_dimension, _interp_order, _nbRefinedPart>::advance(double dt) -template -auto Simulator<_dimension, _interp_order, _nbRefinedPart>::find_model(std::string name) +template +auto Simulator::find_model(std::string name) { return std::find(std::begin(modelNames_), std::end(modelNames_), name) != std::end(modelNames_); } @@ -473,7 +477,8 @@ struct SimulatorMaker PHARE::initializer::PHAREDict& theDict = PHARE::initializer::PHAREDictHandler::INSTANCE().dict(); - return std::make_unique>(theDict, hierarchy_); + SimOpts constexpr static opts{.dimension = d, .interp_order = io, .nbRefinedPart = nb}; + return std::make_unique>(theDict, hierarchy_); } else { @@ -483,15 +488,14 @@ struct SimulatorMaker }; -template -std::unique_ptr> -makeSimulator(std::shared_ptr const& hierarchy) +template +std::unique_ptr makeSimulator(std::shared_ptr const& hierarchy) { - return std::make_unique>( - initializer::PHAREDictHandler::INSTANCE().dict(), hierarchy); + return std::make_unique(initializer::PHAREDictHandler::INSTANCE().dict(), hierarchy); } + } // namespace PHARE #endif /*PHARE_SIMULATOR_SIMULATOR_H*/ diff --git a/tests/amr/messengers/test_messengers.cpp b/tests/amr/messengers/test_messengers.cpp index e6d858580..0d5b56f47 100644 --- a/tests/amr/messengers/test_messengers.cpp +++ b/tests/amr/messengers/test_messengers.cpp @@ -198,15 +198,15 @@ PHARE::initializer::PHAREDict createDict() namespace test_1d { -static constexpr std::size_t dim = 1; -static constexpr std::size_t interpOrder = 1; -static constexpr std::size_t nbRefinePart = 2; +static constexpr std::size_t dim = 1; +static constexpr std::size_t interpOrder = 1; +static constexpr PHARE::SimOpts opts{dim, interpOrder}; -using Simulator = PHARE::Simulator; +using Simulator = PHARE::Simulator; using HybridModelT = Simulator::HybridModel; using MHDModelT = Simulator::MHDModel; using ResourcesManagerT = typename HybridModelT::resources_manager_type; -using Phare_Types = PHARE::PHARE_Types; +using Phare_Types = PHARE::PHARE_Types; @@ -443,12 +443,13 @@ template struct AfullHybridBasicHierarchy { static constexpr std::size_t interpOrder = 1; + static constexpr PHARE::SimOpts opts{dimension, interpOrder, nbRefinePart}; - using Simulator = typename PHARE::Simulator; - using HybridModelT = typename Simulator::HybridModel; - using MHDModelT = typename Simulator::MHDModel; - using ResourcesManagerT = typename HybridModelT::resources_manager_type; - using Phare_Types = PHARE::PHARE_Types; + using Simulator = PHARE::Simulator; + using HybridModelT = Simulator::HybridModel; + using MHDModelT = Simulator::MHDModel; + using ResourcesManagerT = HybridModelT::resources_manager_type; + using Phare_Types = PHARE::PHARE_Types; int const firstHybLevel{0}; int const ratio{2}; diff --git a/tests/amr/tagging/test_tagging.cpp b/tests/amr/tagging/test_tagging.cpp index 7474303ec..e5b280f51 100644 --- a/tests/amr/tagging/test_tagging.cpp +++ b/tests/amr/tagging/test_tagging.cpp @@ -23,7 +23,8 @@ using namespace PHARE::amr; TEST(test_tagger, fromFactoryValid) { - using phare_types = PHARE::solver::PHARE_Types<1, 1, 2>; + auto static constexpr opts = PHARE::SimOpts{1ul, 1ul, 2ul}; + using phare_types = PHARE::solver::PHARE_Types; PHARE::initializer::PHAREDict dict; dict["model"] = std::string{"HybridModel"}; dict["method"] = std::string{"default"}; @@ -34,7 +35,8 @@ TEST(test_tagger, fromFactoryValid) TEST(test_tagger, fromFactoryInvalid) { - using phare_types = PHARE::solver::PHARE_Types<1, 1, 2>; + auto static constexpr opts = PHARE::SimOpts{1ul, 1ul, 2ul}; + using phare_types = PHARE::solver::PHARE_Types; PHARE::initializer::PHAREDict dict; dict["model"] = std::string{"invalidModel"}; dict["method"] = std::string{"invalidStrat"}; @@ -168,11 +170,12 @@ struct TestTagger : public ::testing::Test auto static constexpr dim = TaggingTestInfo_t::dim; auto static constexpr interp_order = TaggingTestInfo_t::interp; auto static constexpr refinedPartNbr = TaggingTestInfo_t::refinedPartNbr; + auto static constexpr opts = PHARE::SimOpts{dim, interp_order, refinedPartNbr}; - using phare_types = PHARE::solver::PHARE_Types; - using Electromag = typename phare_types::Electromag_t; - using Ions = typename phare_types::Ions_t; - using Electrons = typename phare_types::Electrons_t; + using phare_types = PHARE::solver::PHARE_Types; + using Electromag = phare_types::Electromag_t; + using Ions = phare_types::Ions_t; + using Electrons = phare_types::Electrons_t; using GridLayoutT = GridLayout>; struct SinglePatchHybridModel diff --git a/tests/core/data/ion_population/test_ion_population_fixtures.hpp b/tests/core/data/ion_population/test_ion_population_fixtures.hpp index 1fe25487d..f8317268c 100644 --- a/tests/core/data/ion_population/test_ion_population_fixtures.hpp +++ b/tests/core/data/ion_population/test_ion_population_fixtures.hpp @@ -23,16 +23,17 @@ struct UsableIonsDefaultTypes public: auto static constexpr dim = ParticleArray_::dimension; auto static constexpr interp = interp_; + SimOpts static constexpr opts{dim, interp_}; - using PHARE_Types = PHARE::core::PHARE_Types; + using PHARE_Types = PHARE::core::PHARE_Types; using ParticleArray_t = ParticleArray_; using Array_t = NdArrayVector; using Grid_t = Grid; using UsableVecField_t = UsableVecField; using UsableTensorField_t = UsableTensorField; - using GridLayout_t = typename PHARE_Types::GridLayout_t; - using VecField_t = typename UsableVecField_t::Super; - using TensorField_t = typename UsableTensorField_t::Super; + using GridLayout_t = PHARE_Types::GridLayout_t; + using VecField_t = UsableVecField_t::Super; + using TensorField_t = UsableTensorField_t::Super; using IonPopulation_t = IonPopulation; }; @@ -41,24 +42,26 @@ struct UsableIonsDefaultTypes template class UsableIonsPopulation : public _defaults::IonPopulation_t { - using GridLayout_t = typename _defaults::GridLayout_t; - using VecField_t = typename _defaults::VecField_t; - using TensorField_t = typename _defaults::TensorField_t; - using ParticleArray_t = typename _defaults::ParticleArray_t; + using GridLayout_t = _defaults::GridLayout_t; + using VecField_t = _defaults::VecField_t; + using TensorField_t = _defaults::TensorField_t; + using ParticleArray_t = _defaults::ParticleArray_t; using Super = IonPopulation; public: UsableIonsPopulation(initializer::PHAREDict const& dict, GridLayout_t const& layout) : Super{dict} - , rho{this->name() + "_particleDensity", layout, HybridQuantity::Scalar::rho} + , particleDensity{this->name() + "_particleDensity", layout, HybridQuantity::Scalar::rho} + , chargeDensity{this->name() + "_chargeDensity", layout, HybridQuantity::Scalar::rho} , F{this->name() + "_flux", layout, HybridQuantity::Vector::V} , M{this->name() + "_momentumTensor", layout, HybridQuantity::Tensor::M} , particles{this->name(), layout.AMRBox()} { - auto&& [_F, _M, _d, _particles] = Super::getCompileTimeResourcesViewList(); + auto&& [_F, _M, _pd, _cd, _particles] = Super::getCompileTimeResourcesViewList(); F.set_on(_F); M.set_on(_M); - _d.setBuffer(&rho); + _pd.setBuffer(&particleDensity); + _cd.setBuffer(&chargeDensity); _particles.setBuffer(&particles.pack()); } @@ -68,9 +71,9 @@ class UsableIonsPopulation : public _defaults::IonPopulation_t auto& operator*() { return view(); } auto& operator*() const { return view(); } - typename _defaults::Grid_t rho; - typename _defaults::UsableVecField_t F; - typename _defaults::UsableTensorField_t M; + _defaults::Grid_t particleDensity, chargeDensity; + _defaults::UsableVecField_t F; + _defaults::UsableTensorField_t M; UsableParticlesPopulation particles; }; @@ -79,7 +82,7 @@ template class UsableIons : public Ions { - using GridLayout_t = typename _defaults::GridLayout_t; + using GridLayout_t = _defaults::GridLayout_t; using Super = Ions; auto static pop_dict(std::string name) @@ -104,14 +107,16 @@ class UsableIons public: UsableIons(GridLayout_t const& layout, std::vector const& pop_names) : Super{super(pop_names)} - , rho{"rho", HybridQuantity::Scalar::rho, layout.allocSize(HybridQuantity::Scalar::rho)} + , massDensity{"massDensity", layout, HybridQuantity::Scalar::rho} + , chargeDensity{"chargeDensity", layout, HybridQuantity::Scalar::rho} , Vi{"bulkVel", layout, HybridQuantity::Vector::V} , M{"momentumTensor", layout, HybridQuantity::Tensor::M} { - auto&& [_bV, _M, _d, _md] = Super::getCompileTimeResourcesViewList(); + auto&& [_bV, _M, _cd, _md] = Super::getCompileTimeResourcesViewList(); Vi.set_on(_bV); M.set_on(_M); - _d.setBuffer(&rho); + _cd.setBuffer(&chargeDensity); + _md.setBuffer(&massDensity); for (std::size_t i = 0; i < pop_names.size(); ++i) populations.emplace_back(pop_dict(pop_names[i]), layout); @@ -130,9 +135,9 @@ class UsableIons auto& operator*() { return view(); } auto& operator*() const { return view(); } - typename _defaults::Grid_t rho; - typename _defaults::UsableVecField_t Vi; - typename _defaults::UsableTensorField_t M; + _defaults::Grid_t massDensity, chargeDensity; + _defaults::UsableVecField_t Vi; + _defaults::UsableTensorField_t M; std::vector> populations; }; diff --git a/tests/core/data/particles/test_particle_array_consistency.cpp b/tests/core/data/particles/test_particle_array_consistency.cpp index 4a49ed8db..e46062374 100644 --- a/tests/core/data/particles/test_particle_array_consistency.cpp +++ b/tests/core/data/particles/test_particle_array_consistency.cpp @@ -42,7 +42,7 @@ struct ParticleArrayConsistencyTest : public ::testing::Test auto constexpr static dim = ParticleArray_::dimension; auto constexpr static interp = 1; - using GridLayout_t = TestGridLayout::GridLayout_t>; + using GridLayout_t = TestGridLayout::GridLayout_t>; using ParticleArray_t = ParticleArray_; GridLayout_t layout{cells}; diff --git a/tests/core/numerics/interpolator/test_main.cpp b/tests/core/numerics/interpolator/test_main.cpp index 524b4c7bf..b8bc9c471 100644 --- a/tests/core/numerics/interpolator/test_main.cpp +++ b/tests/core/numerics/interpolator/test_main.cpp @@ -219,13 +219,14 @@ class A1DInterpolator : public ::testing::Test public: static constexpr auto dimension = InterpolatorT::dimension; static constexpr auto interp_order = InterpolatorT::interp_order; + constexpr static PHARE::SimOpts opts{dimension, interp_order}; // arbitrary number of cells static constexpr std::uint32_t nx = 50; - using PHARE_TYPES = PHARE::core::PHARE_Types; - using GridLayout_t = typename PHARE_TYPES::GridLayout_t; - using ParticleArray_t = typename PHARE_TYPES::ParticleArray_t; - using Electromag_t = typename PHARE_TYPES::Electromag_t; + using PHARE_TYPES = PHARE::core::PHARE_Types; + using GridLayout_t = PHARE_TYPES::GridLayout_t; + using ParticleArray_t = PHARE_TYPES::ParticleArray_t; + using Electromag_t = PHARE_TYPES::Electromag_t; using UsableVecFieldND = UsableVecField; Electromag_t em; @@ -305,14 +306,15 @@ class A2DInterpolator : public ::testing::Test public: static constexpr auto dimension = InterpolatorT::dimension; static constexpr auto interp_order = InterpolatorT::interp_order; + constexpr static PHARE::SimOpts opts{dimension, interp_order}; // arbitrary number of cells static constexpr std::uint32_t nx = 50; static constexpr std::uint32_t ny = 50; - using PHARE_TYPES = PHARE::core::PHARE_Types; + using PHARE_TYPES = PHARE::core::PHARE_Types; using GridLayoutImpl = GridLayoutImplYee; - using ParticleArray_t = typename PHARE_TYPES::ParticleArray_t; - using Electromag_t = typename PHARE_TYPES::Electromag_t; + using ParticleArray_t = PHARE_TYPES::ParticleArray_t; + using Electromag_t = PHARE_TYPES::Electromag_t; using UsableVecFieldND = UsableVecField; Electromag_t em; @@ -395,15 +397,16 @@ class A3DInterpolator : public ::testing::Test public: static constexpr auto dimension = InterpolatorT::dimension; static constexpr auto interp_order = InterpolatorT::interp_order; + constexpr static PHARE::SimOpts opts{dimension, interp_order}; // arbitrary number of cells static constexpr std::uint32_t nx = 50; static constexpr std::uint32_t ny = 50; static constexpr std::uint32_t nz = 50; - using PHARE_TYPES = PHARE::core::PHARE_Types; - using GridLayout_t = typename PHARE_TYPES::GridLayout_t; - using ParticleArray_t = typename PHARE_TYPES::ParticleArray_t; - using Electromag_t = typename PHARE_TYPES::Electromag_t; + using PHARE_TYPES = PHARE::core::PHARE_Types; + using GridLayout_t = PHARE_TYPES::GridLayout_t; + using ParticleArray_t = PHARE_TYPES::ParticleArray_t; + using Electromag_t = PHARE_TYPES::Electromag_t; using UsableVecFieldND = UsableVecField; Electromag_t em; @@ -494,8 +497,9 @@ class ACollectionOfParticles_1d : public ::testing::Test { static constexpr auto dimension = Interpolator::dimension; static constexpr auto interp_order = Interpolator::interp_order; + constexpr static PHARE::SimOpts opts{dimension, interp_order}; - using PHARE_TYPES = PHARE::core::PHARE_Types; + using PHARE_TYPES = PHARE::core::PHARE_Types; using ParticleArray_t = typename PHARE_TYPES::ParticleArray_t; using GridLayout_t = typename PHARE_TYPES::GridLayout_t; using Grid_t = typename PHARE_TYPES::Grid_t; @@ -686,11 +690,12 @@ struct ACollectionOfParticles_2d : public ::testing::Test static constexpr std::uint32_t nx = 15, ny = 15; static constexpr int start = 0, end = 5; static constexpr auto safeLayer = static_cast(1 + ghostWidthForParticles()); + constexpr static PHARE::SimOpts opts{dim, interp_order}; - using PHARE_TYPES = PHARE::core::PHARE_Types; - using ParticleArray_t = typename PHARE_TYPES::ParticleArray_t; - using GridLayout_t = typename PHARE_TYPES::GridLayout_t; - using Grid_t = typename PHARE_TYPES::Grid_t; + using PHARE_TYPES = PHARE::core::PHARE_Types; + using ParticleArray_t = PHARE_TYPES::ParticleArray_t; + using GridLayout_t = PHARE_TYPES::GridLayout_t; + using Grid_t = PHARE_TYPES::Grid_t; using UsableVecFieldND = UsableVecField; GridLayout_t layout{ConstArray(.1), {nx, ny}, ConstArray(0)}; diff --git a/tests/core/numerics/ion_updater/test_updater.cpp b/tests/core/numerics/ion_updater/test_updater.cpp index e41c42ab8..64bc558a1 100644 --- a/tests/core/numerics/ion_updater/test_updater.cpp +++ b/tests/core/numerics/ion_updater/test_updater.cpp @@ -168,7 +168,8 @@ struct DimInterp template struct ElectromagBuffers { - using PHARETypes = PHARE::core::PHARE_Types; + constexpr static PHARE::SimOpts opts{dim, interp_order}; + using PHARETypes = PHARE::core::PHARE_Types; using Grid = typename PHARETypes::Grid_t; using GridLayout = typename PHARETypes::GridLayout_t; using Electromag = typename PHARETypes::Electromag_t; @@ -203,13 +204,14 @@ struct ElectromagBuffers template struct IonsBuffers { - using PHARETypes = PHARE::core::PHARE_Types; + constexpr static PHARE::SimOpts opts{dim, interp_order}; + using PHARETypes = PHARE::core::PHARE_Types; using UsableVecFieldND = UsableVecField; using Grid = typename PHARETypes::Grid_t; using GridLayout = typename PHARETypes::GridLayout_t; using Ions = typename PHARETypes::Ions_t; using ParticleArray = typename PHARETypes::ParticleArray_t; - using ParticleInitializerFactory = typename PHARETypes::ParticleInitializerFactory; + using ParticleInitializerFactory = typename PHARETypes::ParticleInitializerFactory_t; Grid ionChargeDensity; Grid ionMassDensity; @@ -361,12 +363,13 @@ struct IonUpdaterTest : public ::testing::Test { static constexpr auto dim = DimInterpT::dimension; static constexpr auto interp_order = DimInterpT::interp_order; - using PHARETypes = PHARE::core::PHARE_Types; - using Ions = typename PHARETypes::Ions_t; - using Electromag = typename PHARETypes::Electromag_t; + constexpr static PHARE::SimOpts opts{dim, interp_order}; + using PHARETypes = PHARE::core::PHARE_Types; + using Ions = typename PHARETypes::Ions_t; + using Electromag = typename PHARETypes::Electromag_t; using GridLayout = typename PHARE::core::GridLayout>; using ParticleArray = typename PHARETypes::ParticleArray_t; - using ParticleInitializerFactory = typename PHARETypes::ParticleInitializerFactory; + using ParticleInitializerFactory = typename PHARETypes::ParticleInitializerFactory_t; using IonUpdater = typename PHARE::core::IonUpdater; using Boxing_t = PHARE::core::UpdaterSelectionBoxing; diff --git a/tests/simulator/per_test.hpp b/tests/simulator/per_test.hpp index d4a8be4e0..ec4498367 100644 --- a/tests/simulator/per_test.hpp +++ b/tests/simulator/per_test.hpp @@ -5,13 +5,13 @@ #include "initializer/python_data_provider.hpp" #include "tests/core/data/field/test_field.hpp" -#include "gmock/gmock.h" #include "gtest/gtest.h" +using SimOpts = PHARE::SimOpts; struct __attribute__((visibility("hidden"))) StaticIntepreter { - static std::shared_ptr input; + static inline std::shared_ptr input{nullptr}; static StaticIntepreter& INSTANCE() { @@ -19,7 +19,6 @@ struct __attribute__((visibility("hidden"))) StaticIntepreter return i; } }; -std::shared_ptr StaticIntepreter::input{nullptr}; template @@ -34,19 +33,16 @@ struct HierarchyMaker -template -struct SimulatorTestParam : private HierarchyMaker<_dim>, - public PHARE::Simulator<_dim, _interp, _nbRefinePart> +template +struct SimulatorTestParam : private HierarchyMaker, public PHARE::Simulator { - static constexpr std::size_t dim = _dim; - static constexpr std::size_t interp = _interp; - static constexpr std::size_t nbRefinePart = _nbRefinePart; + static constexpr std::size_t dim = opts.dimension; - using Simulator = PHARE::Simulator; - using PHARETypes = PHARE::PHARE_Types; + using Simulator = PHARE::Simulator; + using PHARETypes = PHARE::PHARE_Types; using Hierarchy = PHARE::amr::Hierarchy; - using HybridModel = typename PHARETypes::HybridModel_t; - using MHDModel = typename PHARETypes::MHDModel_t; + using HybridModel = PHARETypes::HybridModel_t; + using MHDModel = PHARETypes::MHDModel_t; using HierarchyMaker::hierarchy; auto& dict(std::string job_py) @@ -62,7 +58,7 @@ struct SimulatorTestParam : private HierarchyMaker<_dim>, } SimulatorTestParam(std::string job_py = "job") - : HierarchyMaker<_dim>{dict(job_py)} + : HierarchyMaker{dict(job_py)} , Simulator{dict(job_py), this->hierarchy} { Simulator::initialize(); @@ -71,12 +67,13 @@ struct SimulatorTestParam : private HierarchyMaker<_dim>, void reset_dman() { Simulator::reset_dman(); } }; + template struct SimulatorTest : public ::testing::Test { }; -using Simulators = testing::Types>; +using Simulators = testing::Types>; TYPED_TEST_SUITE(SimulatorTest, Simulators); @@ -85,11 +82,15 @@ struct Simulator1dTest : public ::testing::Test { }; - +// clang-format off using Simulators1d = testing::Types< - SimulatorTestParam<1, 1, 2>, SimulatorTestParam<1, 1, 3>, SimulatorTestParam<1, 2, 2>, - SimulatorTestParam<1, 2, 3>, SimulatorTestParam<1, 2, 4>, SimulatorTestParam<1, 3, 2>, - SimulatorTestParam<1, 3, 3>, SimulatorTestParam<1, 3, 4>, SimulatorTestParam<1, 3, 5>>; + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam +>; + TYPED_TEST_SUITE(Simulator1dTest, Simulators1d); @@ -100,13 +101,17 @@ struct Simulator2dTest : public ::testing::Test using Simulators2d = testing::Types< - SimulatorTestParam<2, 1, 4>, SimulatorTestParam<2, 1, 5>, SimulatorTestParam<2, 1, 8>, - SimulatorTestParam<2, 1, 9>, SimulatorTestParam<2, 2, 4>, SimulatorTestParam<2, 2, 5>, - SimulatorTestParam<2, 2, 8>, SimulatorTestParam<2, 2, 9>, SimulatorTestParam<2, 2, 16>, - SimulatorTestParam<2, 3, 4>, SimulatorTestParam<2, 3, 5>, SimulatorTestParam<2, 3, 8>, - SimulatorTestParam<2, 3, 25>>; -TYPED_TEST_SUITE(Simulator2dTest, Simulators2d); + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam, SimulatorTestParam, + SimulatorTestParam +>; +TYPED_TEST_SUITE(Simulator2dTest, Simulators2d); +// clang-format on diff --git a/tools/bench/amr/data/particles/CMakeLists.txt b/tools/bench/amr/data/particles/CMakeLists.txt index 2d864257e..d982a100a 100644 --- a/tools/bench/amr/data/particles/CMakeLists.txt +++ b/tools/bench/amr/data/particles/CMakeLists.txt @@ -2,5 +2,5 @@ cmake_minimum_required (VERSION 3.20.1) project(phare_bench_particles) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} copy_data ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} copy_data ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tools/bench/amr/data/particles/copy_data.cpp b/tools/bench/amr/data/particles/copy_data.cpp index de7dc2476..071142f54 100644 --- a/tools/bench/amr/data/particles/copy_data.cpp +++ b/tools/bench/amr/data/particles/copy_data.cpp @@ -12,10 +12,11 @@ namespace PHARE::amr::bench template class ParticleDataCopy : public benchmark::Fixture { - using PHARE_Types = PHARE::core::PHARE_Types; - using GridLayout_t = typename PHARE_Types::GridLayout_t; - using ParticleArray = typename PHARE_Types::ParticleArray_t; - using ParticlesData = PHARE::amr::ParticlesData; + auto static constexpr opts = PHARE::SimOpts{dim, interp}; + using PHARE_Types = PHARE::core::PHARE_Types; + using GridLayout_t = PHARE_Types::GridLayout_t; + using ParticleArray = PHARE_Types::ParticleArray_t; + using ParticlesData = PHARE::amr::ParticlesData; public: void SetUp(::benchmark::State const& state) override diff --git a/tools/bench/core/data/particles/CMakeLists.txt b/tools/bench/core/data/particles/CMakeLists.txt index 709012370..0024cdb61 100644 --- a/tools/bench/core/data/particles/CMakeLists.txt +++ b/tools/bench/core/data/particles/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required (VERSION 3.20.1) project(phare_bench_particles) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} interop ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} interop ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tools/bench/core/numerics/interpolator/CMakeLists.txt b/tools/bench/core/numerics/interpolator/CMakeLists.txt index 8b3229860..ef62a3113 100644 --- a/tools/bench/core/numerics/interpolator/CMakeLists.txt +++ b/tools/bench/core/numerics/interpolator/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required (VERSION 3.20.1) project(phare_bench_interpolator) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} bench_main ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} bench_main ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tools/bench/core/numerics/interpolator/bench_main.cpp b/tools/bench/core/numerics/interpolator/bench_main.cpp index 7218f1ed5..66ebc8ba5 100644 --- a/tools/bench/core/numerics/interpolator/bench_main.cpp +++ b/tools/bench/core/numerics/interpolator/bench_main.cpp @@ -8,11 +8,12 @@ void interpolate(benchmark::State& state) { constexpr std::uint32_t cells = 30; constexpr std::uint32_t n_parts = 1e7; + auto static constexpr opts = PHARE::SimOpts{dim, interp}; - using PHARE_Types = PHARE::core::PHARE_Types; + using PHARE_Types = PHARE::core::PHARE_Types; using GridLayout_t = TestGridLayout; - using ParticleArray = typename PHARE_Types::ParticleArray_t; - using Grid_t = typename PHARE_Types::Grid_t; + using ParticleArray = PHARE_Types::ParticleArray_t; + using Grid_t = PHARE_Types::Grid_t; GridLayout_t layout{cells}; PHARE::core::Interpolator interpolator; @@ -20,8 +21,10 @@ void interpolate(benchmark::State& state) particles.vector().resize(n_parts, PHARE::core::bench::particle()); PHARE::core::UsableElectromag em{layout}; PHARE::core::UsableVecField flux{"F", layout, PHARE::core::HybridQuantity::Vector::V}; - Grid_t rho{"rho", PHARE::core::HybridQuantity::Scalar::rho, - layout.allocSize(PHARE::core::HybridQuantity::Scalar::rho)}; + Grid_t particleDensity{"particleDensity", PHARE::core::HybridQuantity::Scalar::rho, + layout.allocSize(PHARE::core::HybridQuantity::Scalar::rho)}; + Grid_t chargeDensity{"chargeDensity", PHARE::core::HybridQuantity::Scalar::rho, + layout.allocSize(PHARE::core::HybridQuantity::Scalar::rho)}; PHARE::core::bench::disperse(particles, 0, cells - 1); @@ -32,7 +35,7 @@ void interpolate(benchmark::State& state) interpolator(particle, em, layout); // particleToMesh - interpolator(particles, rho, flux, layout); + interpolator(particles, particleDensity, chargeDensity, flux, layout); } } diff --git a/tools/bench/core/numerics/ion_updater/CMakeLists.txt b/tools/bench/core/numerics/ion_updater/CMakeLists.txt index 07bcfa16d..c033de426 100644 --- a/tools/bench/core/numerics/ion_updater/CMakeLists.txt +++ b/tools/bench/core/numerics/ion_updater/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required (VERSION 3.20.1) project(phare_bench_ion_updater) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} bench_ion_updater ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} bench_ion_updater ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp b/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp index c3be54f13..e4b30b375 100644 --- a/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp +++ b/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp @@ -10,12 +10,13 @@ void updater_routine(benchmark::State& state) { constexpr std::uint32_t cells = 30; constexpr std::uint32_t n_parts = 1e7; + auto static constexpr opts = PHARE::SimOpts{dim, interp}; - using PHARE_Types = core::PHARE_Types; + using PHARE_Types = core::PHARE_Types; using GridLayout_t = TestGridLayout; using Electromag_t = core::UsableElectromag; - using ParticleArray = typename PHARE_Types::ParticleArray_t; - using Particle_t = typename ParticleArray::value_type; + using ParticleArray = PHARE_Types::ParticleArray_t; + using Particle_t = ParticleArray::value_type; using Ions = PHARE::core::UsableIons_t; using IonUpdater = core::IonUpdater; using Boxing_t = PHARE::core::UpdaterSelectionBoxing; @@ -46,7 +47,7 @@ void updater_routine(benchmark::State& state) patch_particles.domain_particles = particles_copy; auto& pack - = std::get<3>(ions.getRunTimeResourcesViewList()[0].getCompileTimeResourcesViewList()); + = std::get<4>(ions.getRunTimeResourcesViewList()[0].getCompileTimeResourcesViewList()); pack.setBuffer(&patch_particles.pack()); ionUpdater_.updatePopulations(ions, em, boxing, dt, core::UpdaterMode::all); diff --git a/tools/bench/core/numerics/pusher/CMakeLists.txt b/tools/bench/core/numerics/pusher/CMakeLists.txt index 50f13ad34..c7413cca5 100644 --- a/tools/bench/core/numerics/pusher/CMakeLists.txt +++ b/tools/bench/core/numerics/pusher/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.20.1) project(phare_bench_pusher) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} pusher ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} pusher ${CMAKE_CURRENT_BINARY_DIR}) add_executable(push_raw_particle_gen push_raw_gen.cpp) target_include_directories(push_raw_particle_gen PRIVATE ${PHARE_PROJECT_DIR}) @@ -14,4 +14,4 @@ add_custom_command( DEPENDS pusher ) -add_phare_cpp_benchmark(11 ${PROJECT_NAME} push_raw_use ${CMAKE_CURRENT_BINARY_DIR}) +add_phare_cpp_benchmark(10 ${PROJECT_NAME} push_raw_use ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tools/bench/core/numerics/pusher/push_bench.hpp b/tools/bench/core/numerics/pusher/push_bench.hpp index 8af6abf89..354f88e0c 100644 --- a/tools/bench/core/numerics/pusher/push_bench.hpp +++ b/tools/bench/core/numerics/pusher/push_bench.hpp @@ -20,10 +20,10 @@ void write_raw_unsorted_particles_to_file(std::size_t const n_parts = 1e7) { constexpr std::uint32_t cells = 65; - using PHARE_Types = PHARE::core::PHARE_Types; + using PHARE_Types = core::PHARE_Types; using GridLayout_t = TestGridLayout; - using ParticleArray_t = typename PHARE_Types::ParticleArray_t; - using Particle_t = typename ParticleArray_t::value_type; + using ParticleArray_t = PHARE_Types::ParticleArray_t; + using Particle_t = ParticleArray_t::value_type; GridLayout_t layout{cells}; diff --git a/tools/bench/core/numerics/pusher/push_raw_use.cpp b/tools/bench/core/numerics/pusher/push_raw_use.cpp index 408667f94..3a3e4e738 100644 --- a/tools/bench/core/numerics/pusher/push_raw_use.cpp +++ b/tools/bench/core/numerics/pusher/push_raw_use.cpp @@ -5,16 +5,17 @@ template void push() { + auto static constexpr opts = PHARE::SimOpts{dim, interp}; constexpr std::uint32_t cells = 65; // constexpr std::uint32_t n_parts = 1e7; - using PHARE_Types = PHARE::core::PHARE_Types; + using PHARE_Types = PHARE::core::PHARE_Types; using GridLayout_t = TestGridLayout; using Interpolator = PHARE::core::Interpolator; using BoundaryCondition = PHARE::core::BoundaryCondition; using Electromag_t = PHARE::core::UsableElectromag; - using Ions_t = typename PHARE_Types::Ions_t; - using ParticleArray = typename Ions_t::particle_array_type; + using Ions_t = PHARE_Types::Ions_t; + using ParticleArray = Ions_t::particle_array_type; using ParticleRange = PHARE::core::IndexRange; using BorisPusher_t = PHARE::core::BorisPusher; diff --git a/tools/bench/core/numerics/pusher/pusher.cpp b/tools/bench/core/numerics/pusher/pusher.cpp index 43ac1ed72..64880205b 100644 --- a/tools/bench/core/numerics/pusher/pusher.cpp +++ b/tools/bench/core/numerics/pusher/pusher.cpp @@ -3,17 +3,18 @@ template void push(benchmark::State& state) { + auto static constexpr opts = PHARE::SimOpts{dim, interp}; constexpr std::uint32_t cells = 65; constexpr std::uint32_t n_parts = 1e7; - using PHARE_Types = PHARE::core::PHARE_Types; + using PHARE_Types = PHARE::core::PHARE_Types; using GridLayout_t = TestGridLayout; using Interpolator = PHARE::core::Interpolator; using BoundaryCondition = PHARE::core::BoundaryCondition; using Electromag_t = PHARE::core::UsableElectromag; - using Ions_t = typename PHARE_Types::Ions_t; - using ParticleArray = typename Ions_t::particle_array_type; - using Particle_t = typename ParticleArray::value_type; + using Ions_t = PHARE_Types::Ions_t; + using ParticleArray = Ions_t::particle_array_type; + using Particle_t = ParticleArray::value_type; using ParticleRange = PHARE::core::IndexRange; using BorisPusher_t = PHARE::core::BorisPusher Date: Mon, 25 Aug 2025 13:31:01 +0200 Subject: [PATCH 2/3] ++ --- tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp b/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp index e4b30b375..0b92fd889 100644 --- a/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp +++ b/tools/bench/core/numerics/ion_updater/bench_ion_updater.cpp @@ -24,7 +24,7 @@ void updater_routine(benchmark::State& state) GridLayout_t layout{cells}; Electromag_t em{layout}; Ions ions{layout, "protons"}; - Boxing_t const boxing{layout, grow(layout.AMRBox(), GridLayout_t::nbrParticleGhosts())}; + Boxing_t const boxing{layout, {grow(layout.AMRBox(), GridLayout_t::nbrParticleGhosts())}}; auto& patch_particles = ions.populations[0].particles; patch_particles.domain_particles.vector() From 428b6fcabdb4be22f5cd21d8cffc169c60c7ecb2 Mon Sep 17 00:00:00 2001 From: deegan Date: Wed, 17 Sep 2025 10:24:51 +0200 Subject: [PATCH 3/3] ++ --- src/core/utilities/meta/meta_utilities.hpp | 8 ++++---- src/python3/cpp_simulator.hpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/utilities/meta/meta_utilities.hpp b/src/core/utilities/meta/meta_utilities.hpp index 0bcad7fb4..50a4a265a 100644 --- a/src/core/utilities/meta/meta_utilities.hpp +++ b/src/core/utilities/meta/meta_utilities.hpp @@ -122,7 +122,7 @@ namespace core using SimuType = std::decay_t; using _dim = typename std::tuple_element<0, SimuType>::type; - if constexpr (_dim{}() < 3) // TORM + if constexpr (_dim{}() < 3) // TORM on 3D PR if (!p) p = maker(dim, _dim{}); }); @@ -151,9 +151,9 @@ namespace core Ptr_t p = nullptr; core::apply(possibleSimulators(), [&](auto const& simType) { - using SimuType = std::decay_t; // TORM - using _dim = typename std::tuple_element<0, SimuType>::type; // TORM - if constexpr (_dim{}() < 3) // TORM + using SimuType = std::decay_t; // TORM on 3D PR + using _dim = typename std::tuple_element<0, SimuType>::type; // TORM on 3D PR + if constexpr (_dim{}() < 3) // TORM on 3D PR _makeAtRuntime(maker, p, dim, interpOrder, nbRefinedPart, simType); }); diff --git a/src/python3/cpp_simulator.hpp b/src/python3/cpp_simulator.hpp index 8e5ef490e..47a9e6166 100644 --- a/src/python3/cpp_simulator.hpp +++ b/src/python3/cpp_simulator.hpp @@ -82,8 +82,8 @@ void declare_etc(py::module& m) constexpr auto nbRefinedPart = _nbRefinedPart{}(); constexpr auto opts = SimOpts{dim, interp, nbRefinedPart}; - std::string type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" - + std::to_string(nbRefinedPart); + std::string const type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" + + std::to_string(nbRefinedPart); using Sim = Simulator; using DW = DataWrangler; @@ -140,8 +140,8 @@ void declare_sim(py::module& m) constexpr auto nbRefinedPart = _nbRefinedPart{}(); constexpr auto opts = SimOpts{dim, interp, nbRefinedPart}; - std::string type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" - + std::to_string(nbRefinedPart); + std::string const type_string = "_" + std::to_string(dim) + "_" + std::to_string(interp) + "_" + + std::to_string(nbRefinedPart); using Sim = Simulator; std::string name = "Simulator" + type_string; @@ -159,7 +159,7 @@ void declare_sim(py::module& m) }); } -template +template // possibly TORM on 3d PR constexpr bool valid_simulator() { return dim{}() < 3;