@@ -23,33 +23,23 @@ namespace mpi = boost::mpi;
2323
2424#ifdef SAMURAI_WITH_MPI
2525// Résolution d'un bug : S'il y a trop de rangs MPI et un min_level trop faible, alors il est parfois
26- // impossible de décomposer le problème. Il faut alors imposer un min_level limite
27- bool check_size_min_level (std::size_t min_level)
26+ // impossible de décomposer le problème (--> segfault) . Il faut alors imposer un min_level limite le temps d'un fix
27+ bool is_invalid_mpi_size (std::size_t min_level)
2828{
2929 boost::mpi::communicator world;
30- int size = world.size ();
30+ int mpi_size = world.size ();
3131
3232 // à vérifier :
3333 // - en 1d ?
34- // - inférieur ou égal ? i.e. si min_level est à 0 alors j'ai une seule case ?
35- // valable sur un domaine [0,1] mais quid sur [1, b] ?
36- if (size <= pow (2 , min_level))
37- {
38- return false ;
39- }
40- else
41- {
42- return true ;
43- }
44- return true ;
34+ return (mpi_size > std::pow (2 , min_level));
4535}
4636
47- void error_on_mpi_min_level (std::size_t min_level)
37+ void validate_mpi_min_level (std::size_t min_level)
4838{
49- auto error = check_size_min_level (min_level);
50- if (error)
39+ if (is_invalid_mpi_size (min_level))
5140 {
52- std::cout << " ERROR: Please reduce MPI Size or increase min_value according to the rule mpi_size <= 2^min_level." << std::endl;
41+ std::cerr << " ERROR: MPI size (" << boost::mpi::communicator ().size () << " ) is too large for min_level = " << min_level
42+ << " . Please ensure that mpi_size <= 2^min_level." << std::endl;
5343 MPI_Abort (MPI_COMM_WORLD, 1 );
5444 }
5545}
@@ -280,9 +270,7 @@ namespace samurai
280270#ifdef SAMURAI_WITH_MPI
281271 partition_mesh (start_level, b);
282272 // load_balancing();
283-
284- // resolve MPI issue when too lot MPI rank for 2^min_level
285- error_on_mpi_min_level (min_level);
273+ validate_mpi_min_level (min_level);
286274#else
287275 this ->m_cells [mesh_id_t ::cells][start_level] = {start_level, b, approx_box_tol, scaling_factor_};
288276#endif
@@ -315,7 +303,7 @@ namespace samurai
315303 partition_mesh (start_level, b);
316304 // load_balancing();
317305
318- error_on_mpi_min_level (min_level);
306+ validate_mpi_min_level (min_level);
319307#else
320308 this ->m_cells [mesh_id_t ::cells][start_level] = {start_level, b, approx_box_tol, scaling_factor_};
321309#endif
0 commit comments