94 OBS_PTR(Domaine) ref_domaine_calcul_ = ref_cast(Domaine,
Interprete::objet(dom_calcul_));
95 assert(ref_domaine_interpol_);
96 assert(ref_domaine_calcul_);
99 const Domaine& dom_interpol = ref_domaine_interpol_.valeur();
100 if(dom_interpol.
nb_som()==0)
102 Cerr <<
"The domain \"" << dom_interpol.
le_nom() <<
"\" to be split is empty !" << finl;
105 const int nb_elem_interpol = dom_interpol.
nb_elem_tot();
106 const int dim_interpol = dom_interpol.
dimension;
109 const Domaine dom_calcul = ref_domaine_calcul_.valeur();
110 if(dom_calcul.
nb_som()==0)
112 Cerr <<
"The reference domain \"" << dom_calcul.
le_nom() <<
"\" is empty !" << finl;
115 const int nb_elem_calcul = dom_calcul.
nb_elem();
116 const int dim_calcul = dom_calcul.
dimension;
118 IntVect elem_part_calcul;
119 int nb_parts_tot_calcul;
126 Cerr <<
"Error in Partitionneur_Partition::construire_partition\n";
127 Cerr <<
" Failed to open file " << nom_fichier << finl;
128 Cerr <<
"To use the partitioner Partition, you must check" << finl;
129 Cerr <<
"that you use the option:" << finl;
130 Cerr <<
"Ecrire_decoupage " << nom_fichier << finl;
131 Cerr <<
"In the splitting block of the computational domain " << dom_calcul.
le_nom() << finl;
134 file >> elem_part_calcul;
135 file >> nb_parts_tot_calcul;
139 if (nb_elem_calcul != sz)
141 Cerr <<
"Error in Partitionneur_Partition::construire_partition\n";
142 Cerr <<
" The file " << nom_fichier <<
" contains an array of " << sz <<
" values.\n";
143 Cerr <<
" The area contains " << nb_elem_calcul <<
" elements" << finl;
148 DoubleTab coord_g_interpol;
151 assert(coord_g_interpol.
dimension(0) == nb_elem_interpol);
152 assert(coord_g_interpol.
dimension(1) == dim_interpol);
155 DoubleTab coord_g_calcul;
158 assert(coord_g_calcul.
dimension(0) == nb_elem_calcul);
159 assert(coord_g_calcul.
dimension(1) == dim_calcul);
161 elem_part.
resize(nb_elem_interpol);
166 double distance_min,distance;
167 for (i = 0; i < nb_elem_interpol; i++)
170 double x_interpol = coord_g_interpol(i,0);
171 double y_interpol = coord_g_interpol(i,1);
172 double z_interpol = (dim_interpol == 3) ? coord_g_interpol(i,2) : 0.;
173 for (j = 0; j < nb_elem_calcul; j++)
175 double x_calcul = coord_g_calcul(j,0);
176 double y_calcul = coord_g_calcul(j,1);
177 double z_calcul = (dim_calcul == 3) ? coord_g_calcul(j,2) : 0.;
178 distance=sqrt((x_calcul-x_interpol)*(x_calcul-x_interpol)+(y_calcul-y_interpol)*(y_calcul-y_interpol)+(z_calcul-z_interpol)*(z_calcul-z_interpol));
179 if (distance < distance_min)
181 distance_min=distance;
182 elem_part[i]=elem_part_calcul[j];
188 int nb_parties_interpol, nb_parties_calcul;
189 nb_parties_interpol=0;
193 nb_parties_interpol = max_array(elem_part) + 1;
196 nb_parties_calcul = max_array(elem_part_calcul) + 1;
198 if (nb_parties_calcul < nb_parts_tot_calcul)
199 nb_parties_calcul = nb_parts_tot_calcul;
201 nb_parts_tot_calcul = nb_parties_calcul;
204 if ((nb_parties_interpol < nb_parties_calcul) && nb_parts_tot==-1)
205 nb_parts_tot=nb_parties_calcul;
206 if (nb_parts_tot_calcul < nb_parts_tot)
207 nb_parts_tot=nb_parts_tot_calcul;
int_t nb_elem_tot() const
void calculer_centres_gravite(DoubleTab_t &xp) const
Calcule les centres de gravites des elements du domaine.
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.