diff --git a/res/cmake/dep.cmake b/res/cmake/dep.cmake index 027cfe5ef..58c1f13f9 100644 --- a/res/cmake/dep.cmake +++ b/res/cmake/dep.cmake @@ -1,4 +1,6 @@ +include("${PHARE_PROJECT_DIR}/res/cmake/dep/cppdict.cmake") +add_subdirectory(subprojects/cppdict) # SAMRAI build option include("${PHARE_PROJECT_DIR}/res/cmake/dep/samrai.cmake") @@ -15,6 +17,3 @@ include("${PHARE_PROJECT_DIR}/res/cmake/dep/pybind.cmake") # HighFive include("${PHARE_PROJECT_DIR}/res/cmake/dep/highfive.cmake") - - -add_subdirectory(subprojects/cppdict) diff --git a/res/cmake/dep/cppdict.cmake b/res/cmake/dep/cppdict.cmake new file mode 100644 index 000000000..c471a5043 --- /dev/null +++ b/res/cmake/dep/cppdict.cmake @@ -0,0 +1,14 @@ + + +set(CPPDICT_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/subprojects/cppdict) + +if (NOT EXISTS ${CPPDICT_SRCDIR}) + execute_process( + COMMAND ${Git} clone https://github.com/LaboratoryOfPlasmaPhysics/cppdict ${CPPDICT_SRCDIR} -b master --recursive --depth 10 + ) +else() + if(devMode) + message("downloading latest cppdict updates") + execute_process(COMMAND ${Git} pull origin master WORKING_DIRECTORY ${CPPDICT_SRCDIR}) + endif(devMode) +endif() diff --git a/src/amr/load_balancing/concrete_load_balancer_hybrid_strategy_homogeneous.hpp b/src/amr/load_balancing/concrete_load_balancer_hybrid_strategy_homogeneous.hpp index 53df0047f..24a0f9dd2 100644 --- a/src/amr/load_balancing/concrete_load_balancer_hybrid_strategy_homogeneous.hpp +++ b/src/amr/load_balancing/concrete_load_balancer_hybrid_strategy_homogeneous.hpp @@ -15,7 +15,6 @@ - namespace PHARE::amr { template @@ -46,9 +45,6 @@ template void ConcreteLoadBalancerHybridStrategyHomogeneous::compute( level_t& level, PHARE::solver::IPhysicalModel& model) { - auto static constexpr dimension = HybridModel::dimension; - bool static constexpr c_ordering = false; - auto& hybridModel = dynamic_cast(model); auto& resourcesManager = hybridModel.resourcesManager; auto& ions = hybridModel.state.ions; @@ -58,8 +54,6 @@ void ConcreteLoadBalancerHybridStrategyHomogeneous::compute( auto const& layout = layoutFromPatch(*patch); auto patch_data_lb = dynamic_cast(patch->getPatchData(this->id_).get()); auto load_balancer_val = patch_data_lb->getPointer(); - auto lb_view = core::make_array_view(load_balancer_val, layout.nbrCells()); - auto _ = resourcesManager->setOnPatch(*patch, ions); // The view on "load_balancer_val" do not have any ghost cells, meaning that this patch // data lies on a box defind by the nbr of cells in the physical domain @@ -71,14 +65,7 @@ void ConcreteLoadBalancerHybridStrategyHomogeneous::compute( // The lb_view is a CellData, meaning that it is dual as the index of an amr box - // todo replace below with std::fill/std::fill_n data, size = 1 - core::Box local_box{ - core::Point{core::ConstArray()}, - core::Point{ - core::generate([](auto const& nCell) { return nCell - 1; }, layout.nbrCells())}}; - - for (auto const& idx : local_box) - lb_view(idx) = 1; + std::fill(load_balancer_val, load_balancer_val + core::product(layout.nbrCells()), 1); } } diff --git a/src/amr/multiphysics_integrator.hpp b/src/amr/multiphysics_integrator.hpp index bf5a5e1dd..7c9c81a1b 100644 --- a/src/amr/multiphysics_integrator.hpp +++ b/src/amr/multiphysics_integrator.hpp @@ -49,7 +49,6 @@ namespace solver int solverIndex = NOT_SET; int resourcesManagerIndex = NOT_SET; int taggerIndex = NOT_SET; - // int loadBalancerIndex = NOT_SET; std::string messengerName; }; diff --git a/src/amr/wrappers/integrator.hpp b/src/amr/wrappers/integrator.hpp index 609499ee1..bd7ad91f6 100644 --- a/src/amr/wrappers/integrator.hpp +++ b/src/amr/wrappers/integrator.hpp @@ -33,22 +33,21 @@ class Integrator bool static _rebalance_coarsest(initializer::PHAREDict const& dict) { - return initializer::dict_get(dict, "simulation/advanced/integrator/rebalance_coarsest", 0) - > 0; + return cppdict::get_value(dict, "simulation/advanced/integrator/rebalance_coarsest", 0) > 0; } bool static _rebalance_coarsest_on_init(initializer::PHAREDict const& dict) { - return initializer::dict_get(dict, - "simulation/advanced/integrator/rebalance_coarsest_on_init", 0) + return cppdict::get_value(dict, "simulation/advanced/integrator/rebalance_coarsest_on_init", + 0) > 0; } std::size_t static _rebalance_coarsest_every(initializer::PHAREDict const& dict) { auto in - = initializer::dict_get(dict, "simulation/advanced/integrator/rebalance_coarsest_every", - rebalance_coarsest_every_default); + = cppdict::get_value(dict, "simulation/advanced/integrator/rebalance_coarsest_every", + rebalance_coarsest_every_default); if (in < 0) throw std::runtime_error("rebalance_coarsest_every must be positive"); return static_cast(in); @@ -56,8 +55,8 @@ class Integrator bool static _is_tagging_refinement(initializer::PHAREDict const& dict) { - return initializer::dict_get(dict, "simulation/AMR/refinement/tagging/method", - std::string{"none"}) + return cppdict::get_value(dict, "simulation/AMR/refinement/tagging/method", + std::string{"none"}) == std::string{"auto"}; } diff --git a/src/core/data/ions/particle_initializers/particle_initializer_factory.hpp b/src/core/data/ions/particle_initializers/particle_initializer_factory.hpp index eb1359177..ca324311f 100644 --- a/src/core/data/ions/particle_initializers/particle_initializer_factory.hpp +++ b/src/core/data/ions/particle_initializers/particle_initializer_factory.hpp @@ -47,9 +47,9 @@ namespace core auto charge = dict["charge"].template to(); - auto nbrPartPerCell = initializer::dict_get(dict, "nbr_part_per_cell", int{0}); + auto nbrPartPerCell = cppdict::get_value(dict, "nbr_part_per_cell", int{0}); FunctionType nbrPartPerCellFn - = initializer::dict_get(dict, "nbr_part_per_cell_fn", FunctionType{nullptr}); + = cppdict::get_value(dict, "nbr_part_per_cell_fn", FunctionType{nullptr}); if (not nbrPartPerCellFn and nbrPartPerCell == 0) { throw std::runtime_error("PPC cannot be 0"); diff --git a/src/initializer/data_provider.hpp b/src/initializer/data_provider.hpp index b1a99ee2f..da5d244fa 100644 --- a/src/initializer/data_provider.hpp +++ b/src/initializer/data_provider.hpp @@ -92,53 +92,5 @@ namespace initializer } // namespace initializer } // namespace PHARE -namespace PHARE::initializer -{ - -template -std::optional _traverse_to_node(Dict const& dict, Paths const& paths, std::size_t idx = 0) -{ - if (dict.contains(paths[idx])) - { - auto const& next = dict[paths[idx]]; - if (idx == paths.size() - 1) - return next; - return _traverse_to_node(next, paths, ++idx); - } - return std::nullopt; -} - -template -std::optional traverse_to_node(Dict const& dict, std::string const& path) -{ - char delimiter = '/'; - std::string tmp = ""; - std::vector paths; - std::istringstream iss(path); - while (std::getline(iss, tmp, delimiter)) - paths.push_back(tmp); - return _traverse_to_node(dict, paths); -} - -template -T const& dict_get(Dict const& dict, std::string const& path) -{ - // error if not found - auto leaf = traverse_to_node(dict, path); - if (leaf) - return leaf->template to(); - throw std::runtime_error("Dict contains no path " + path); -} - -template -T dict_get(Dict const& dict, std::string const& path, T const default_value) -{ - auto leaf = traverse_to_node(dict, path); - if (leaf) - return leaf->template to(); - return default_value; -} - -} // namespace PHARE::initializer #endif // DATA_PROVIDER_HPP diff --git a/src/simulator/simulator.hpp b/src/simulator/simulator.hpp index 0ec21cdde..7cf44e4d0 100644 --- a/src/simulator/simulator.hpp +++ b/src/simulator/simulator.hpp @@ -268,7 +268,7 @@ void Simulator::hybrid_init(initializer::PHAREDict auto loadBalancer_db = std::make_shared("LoadBalancerDB"); double flexible_load_tolerance - = initializer::dict_get(dict, "simulation/advanced/integrator/flexible_load_tolerance", .5); + = cppdict::get_value(dict, "simulation/advanced/integrator/flexible_load_tolerance", .5); loadBalancer_db->putDouble("flexible_load_tolerance", flexible_load_tolerance); auto loadBalancer = std::make_shared( diff --git a/subprojects/cppdict b/subprojects/cppdict deleted file mode 160000 index 6b02756b9..000000000 --- a/subprojects/cppdict +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6b02756b9646811c65b5df83497b82ba75f1270e diff --git a/tests/simulator/test_load_balancing.py b/tests/simulator/test_load_balancing.py index be6234a71..c11bed819 100644 --- a/tests/simulator/test_load_balancing.py +++ b/tests/simulator/test_load_balancing.py @@ -1,7 +1,10 @@ #!/usr/bin/env python3 + +import unittest import pyphare.pharein as ph from pyphare.simulator.simulator import Simulator, startMPI +from tests.simulator import SimulatorTest import numpy as np import matplotlib as mpl @@ -166,30 +169,23 @@ def _parse_rank(patch_id): return per_rank -def assert_has_balanced(sim): - t0 = time_info(sim) - tend = time_info(sim, timestamps[-1]) - - t0_sdev = np.std(list(t0.values())) - tend_sdev = np.std(list(tend.values())) - - print("init sdev", t0_sdev) - print("end sdev", tend_sdev) - assert tend_sdev < t0_sdev * 0.1 # empirical - +class LoadBalancingTest(SimulatorTest): + def test_has_balanced(self): + if mpi_size == 1: # doesn't make sense + return -def main(): - if mpi_size == 1: - return # doesn't make sense + sim = config() + self.register_diag_dir_for_cleanup(diag_outputs) + Simulator(sim).run() - sim = config() - Simulator(sim).run() + if cpp.mpi_rank() > 0: + return - if cpp.mpi_rank() > 0: - return + t0_sdev = np.std(list(time_info(sim).values())) + tend_sdev = np.std(list(time_info(sim, timestamps[-1]).values())) - assert_has_balanced(sim) + assert tend_sdev < t0_sdev * 0.1 # empirical if __name__ == "__main__": - main() + unittest.main()