16#include <Reordonner_faces_periodiques.h>
17#include <Partitionneur_Tranche.h>
18#include <TRUSTArray.h>
36template <
typename _SIZE_>
39 Cerr <<
"Partitionneur_Tranche_32_64<_SIZE_>::printOn invalid\n" << finl;
46template <
typename _SIZE_>
51 Cerr <<
" Error: the domain has not been associated" << finl;
60template <
typename _SIZE_>
65 if (min_array(nb_tranches_)<1)
67 Cerr <<
"Error for the cutting domain tool (Tranche) specifications : " <<finl;
68 Cerr<<
" the number of slice must be greater than 0 for each direction. " << finl;
76template <
typename _SIZE_>
79 ref_domaine_ = domaine;
80 nb_tranches_.resize(domaine.dimension);
89template <
typename _SIZE_>
94 assert(nb_tranches.
size_array() == nb_tranches_.size_array());
95 assert(min_array(nb_tranches) > 0);
97 nb_tranches_ = nb_tranches;
106template <
typename _SIZE_>
108 ArrOfInt& directions_perio)
110 Cerr <<
"Search of periodic directions of domain " << domaine.
le_nom() << finl;
112 const Noms& liste_bords_perio = domaine.bords_perio();
115 directions_perio = 0;
116 for (
auto& itr : liste_bords_perio)
119 const Nom& nom_bord = itr;
120 const int nb_bords = domaine.nb_bords();
121 while (num_bord < nb_bords)
123 if (domaine.bord(num_bord).le_nom() == nom_bord)
127 if (num_bord == nb_bords)
129 Cerr <<
"Error in Partitionneur_Tranche_32_64<_SIZE_>::chercher_direction_perio\n"
130 <<
" boundary not found : " << nom_bord << finl;
138 for (
int j = 0; j < dim; j++)
140 if (std::abs(delta[j]) > epsilon)
142 directions_perio[j]++;
143 Cerr <<
" Boundary : " << nom_bord <<
" periodic direction : " << j << finl;
149 Cerr <<
"Error in Partitionneur_Tranche_32_64<_SIZE_>::chercher_direction_perio" << finl;
150 Cerr <<
" periodic direction not found for the boundary " << nom_bord << finl;
151 Cerr <<
" Vector delta found between faces twin : " << delta << finl;
152 Cerr <<
" with a maximum error : " << erreur << finl;
153 Cerr <<
"TIP: Try to add 'declare_only' flag into declare_bord_perio block or switch to metis tool" << finl;
157 if (max_array(directions_perio) > 1)
159 Cerr <<
"Error in Partitionneur_Tranche_32_64<_SIZE_>::chercher_direction_perio" << finl;
160 Cerr <<
" several boundaries have the same periodic direction" << finl;
165template <
typename _SIZE_>
168 using DoubleTab_t = DoubleTab_T<_SIZE_>;
170 assert(ref_domaine_);
171 assert(nb_tranches_[0] > 0);
173 const Domaine_t& dom = ref_domaine_.valeur();
179 ArrOfInt directions_perio;
183 Cerr <<
"Calculation of centers of gravity of the elements" << finl;
186 assert(coord_g.dimension(0) == nb_elem);
187 assert(coord_g.dimension(1) == dim);
189 Cerr <<
"Moving of centers of gravity" << finl;
193 for (
int_t i = 0; i < nb_elem; i++)
195 double x = coord_g(i,0);
196 double y = coord_g(i,1);
197 double z = (dim == 3) ? coord_g(i,2) : 0.;
198 coord_g(i,0) = x + y*1e-6 + z*1e-12;
199 coord_g(i,1) = y + x*1e-6 + z*1e-12;
201 coord_g(i,2) = z + x*1e-6 + y*1e-12;
207 SmallArrOfTID_T<_SIZE_> nb_elem_part(1);
208 nb_elem_part= nb_elem;
217 for (
int_t i = 0; i < nb_elem; i++)
220 SmallArrOfTID_T<_SIZE_> new_nb_elem_part;
239 for (
int direction = 0; direction < dim; direction++)
242 const int nb_tranches = nb_tranches_[direction];
244 int_t index_debut_partie = 0;
246 const int nb_parts = nb_elem_part.
size_array();
248 Cerr <<
"The mesh contains " << nb_parts <<
" parts. ";
249 Cerr <<
"Splitting in the direction " << direction << finl;
253 for (
int part = 0; part < nb_parts; part++)
255 Cerr <<
" Splitting of subpart " << part << finl;
258 const int_t nb_elem_partie = nb_elem_part[part];
259 assert(index_debut_partie >= 0 && index_debut_partie + nb_elem_partie <= nb_elem);
260 index.
ref_data(listes_elem.
addr()+index_debut_partie, nb_elem_partie);
266 return ( coord_g(a,direction)<coord_g(b,direction) );
272 if (directions_perio[direction])
276 int_t j = nb_elem_partie/(nb_tranches*2);
277 for (
int i = 0; i < nb_elem_partie; i++)
279 index[j++] = copie[i];
280 if (j >= nb_elem_partie)
288 for (
int i = 0; i < nb_tranches; i++)
291 const long long new_n0 = (
long long)nb_elem_partie * (
long long)(i+1) / (
long long)nb_tranches;
292 assert(new_n0 < std::numeric_limits<_SIZE_>::max());
298 index_debut_partie += nb_elem_partie;
301 nb_elem_part = new_nb_elem_part;
305 elem_part.
resize(nb_elem);
308 const int nb_parts = nb_elem_part.
size_array();
309 int_t index_fin = 0, i = 0;
310 for (
int part = 0; part < nb_parts; part++)
312 index_fin += nb_elem_part[part];
313 for (; i < index_fin; i++)
315 const int_t elem = listes_elem[i];
316 elem_part[elem] = part;
320 if (ref_domaine_->bords_perio().size() > 0)
323 Cerr <<
"Correction elem0 on processor 0" << finl;
void calculer_centres_gravite(DoubleTab_t &xp) const
Calculates the centers of gravity of the domain elements.
class Nom: a character string for naming TRUST objects.
An array of character strings (VECT(Nom)).
virtual void set_param(Param &) const
static double precision_geom
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_arr_size_predefinie(const char *keyword, const ArrOfInt *value, Param::Nature nat=Param::OPTIONAL)
Register an ArrOfInt whose size has already been fixed.
Domain partitioner that splits the domain into slabs parallel to the coordinate directions.
void validate_params() const override
The syntax is { Tranches nx ny [ nz ] }.
static void chercher_direction_perio(const Domaine_t &domaine, ArrOfInt &directions_perio)
Fills the directions_perio array from the names of the periodic boundaries.
void associer_domaine(const Domaine_t &domaine) override
First initialization step of the partitioner: associates a domain.
Domaine_32_64< _SIZE_ > Domaine_t
void construire_partition(BigIntVect_ &elem_part, int &nb_parts_tot) const override
void initialiser(const ArrOfInt &nb_tranches)
Second initialization step: defines the number of slabs.
ArrOfInt_T< _SIZE_ > ArrOfInt_t
TRUSTVect< int, _SIZE_ > BigIntVect_
Base class for domain partitioners (for splitting a mesh before a parallel computation).
static void corriger_bords_avec_liste(const Domaine_t &dom, const int_t my_offset, BigIntVect_ &elem_part)
Computes the periodic element connectivity graphs and calls corriger_periodique_avec_graphe.
static void corriger_elem0_sur_proc0(BigIntVect_ &elem_part)
Corrects the partition so that element 0 of the initial domain is on the first sub-domain of the part...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static int check_faces_periodiques(const Frontiere_32_64< _SIZE_ > &frontiere, ArrOfDouble &vecteur_delta, ArrOfDouble &erreur, bool verbose=false)
Tries to verify whether the faces on boundary num_bord are ordered according to the periodic face con...
Base class for output streams.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
TRUSTArray & inject_array(const TRUSTArray &source, _SIZE_ nb_elements=-1, _SIZE_ first_element_dest=0, _SIZE_ first_element_source=0)
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void ref_data(_TYPE_ *ptr, _SIZE_ size)
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)