16#include <Rectify_Mesh.h>
19#include <Synonyme_info.h>
22Implemente_instanciable(
Rectify_Mesh,
"Rectify_Mesh",Interprete_geometrique_base) ;
62 Cerr <<
"Rectification... OK" << finl;
69 Cerr <<
"Error in 'Rectify_Mesh::check_dimension()':" << finl;
71 Cerr <<
" Rectify_Mesh can only deal 2D or 3D domains" << finl;
80 if ( ! ( (cell_type ==
Motcle(
"Triangle")) || (cell_type ==
Motcle(
"Tetraedre")) ) )
82 Cerr <<
"Error in 'Rectify_Mesh::check_cell_type()':" << finl;
83 Cerr <<
" Invalid cell type: " << cell_type << finl;
84 Cerr <<
" Rectify_Mesh can only deal with triangles and tetrahedrons" << finl;
124 for (
int c=0; c<nb_cells; ++c)
126 const int n0 = cells(c,0);
127 const int n1 = cells(c,1);
128 const int n2 = cells(c,2);
130 const double x0 = nodes(n0,0);
131 const double x1 = nodes(n1,0);
132 const double x2 = nodes(n2,0);
134 const double y0 = nodes(n0,1);
135 const double y1 = nodes(n1,1);
136 const double y2 = nodes(n2,1);
138 const double area = (x1-x0)*(y2-y0) - (x2-x0)*(y1-y0);
146 Cerr <<
"************************************************" << finl;
147 Cerr <<
"Rectify_Mesh::check_cell_orientation_2D report :" << finl;
148 Cerr <<
" " << nb_swaps <<
" swap" << ((nb_swaps ==1) ?
"" :
"s") <<
" were performed" << finl;
149 Cerr <<
"************************************************" << finl;
161 for (
int c=0; c<nb_cells; ++c)
163 const int n0 = cells(c,0);
164 const int n1 = cells(c,1);
165 const int n2 = cells(c,2);
166 const int n3 = cells(c,3);
168 const double x0 = nodes(n0,0);
169 const double x1 = nodes(n1,0);
170 const double x2 = nodes(n2,0);
171 const double x3 = nodes(n3,0);
173 const double y0 = nodes(n0,1);
174 const double y1 = nodes(n1,1);
175 const double y2 = nodes(n2,1);
176 const double y3 = nodes(n3,1);
178 const double z0 = nodes(n0,2);
179 const double z1 = nodes(n1,2);
180 const double z2 = nodes(n2,2);
181 const double z3 = nodes(n3,2);
183 const double volume = (x1-x0) * (y2-y0) * (z3-z0)
184 + (x2-x0) * (y3-y0) * (z1-z0)
185 + (x3-x0) * (y1-y0) * (z2-z0)
186 - (z1-z0) * (y2-y0) * (x3-x0)
187 - (x2-x0) * (z3-z0) * (y1-y0)
188 - (y3-y0) * (x1-x0) * (z2-z0);
196 Cerr <<
"************************************************" << finl;
197 Cerr <<
"Rectify_Mesh::check_cell_orientation_3D report :" << finl;
198 Cerr <<
" " << nb_swaps <<
" swap" << ((nb_swaps ==1) ?
"" :
"s") <<
" were performed" << finl;
199 Cerr <<
"************************************************" << finl;
210 ArrOfDouble lengths(3);
214 for (
int c=0; c<nb_cells; ++c)
216 const int n0 = cells(c,0);
217 const int n1 = cells(c,1);
218 const int n2 = cells(c,2);
219 const int n3 = cells(c,3);
221 const double x0 = nodes(n0,0);
222 const double x1 = nodes(n1,0);
223 const double x2 = nodes(n2,0);
224 const double x3 = nodes(n3,0);
226 const double y0 = nodes(n0,1);
227 const double y1 = nodes(n1,1);
228 const double y2 = nodes(n2,1);
229 const double y3 = nodes(n3,1);
231 const double z0 = nodes(n0,2);
232 const double z1 = nodes(n1,2);
233 const double z2 = nodes(n2,2);
234 const double z3 = nodes(n3,2);
236 lengths[0] = ((x0+x1)-(x2+x3))*((x0+x1)-(x2+x3))
237 + ((y0+y1)-(y2+y3))*((y0+y1)-(y2+y3))
238 + ((z0+z1)-(z2+z3))*((z0+z1)-(z2+z3));
240 lengths[1] = ((x0+x2)-(x1+x3))*((x0+x2)-(x1+x3))
241 + ((y0+y2)-(y1+y3))*((y0+y2)-(y1+y3))
242 + ((z0+z2)-(z1+z3))*((z0+z2)-(z1+z3));
244 lengths[2] = ((x0+x3)-(x1+x2))*((x0+x3)-(x1+x2))
245 + ((y0+y3)-(y1+y2))*((y0+y3)-(y1+y2))
246 + ((z0+z3)-(z1+z2))*((z0+z3)-(z1+z2));
248 const int id = imin_array(lengths);
251 if ( (
id == 0) && (lengths[0] < lengths[1]) )
263 if ( (
id == 2) && (lengths[2] < lengths[1]) )
271 Cerr <<
"************************************************" << finl;
272 Cerr <<
"Rectify_Mesh::check_cell_enumeration_3D report :" << finl;
273 Cerr <<
" " << nb_swaps <<
" swap" << ((nb_swaps ==1) ?
"" :
"s") <<
" were performed" << finl;
274 Cerr <<
"************************************************" << finl;
280 const int tmp = cells(cell,node0);
281 cells(cell,node0) = cells(cell,node1);
282 cells(cell,node1) = tmp;
DoubleTab_t & les_sommets()
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void check_cell_type() const
void check_cell_orientation_2D()
void check_dimension() const
Entree & interpreter_(Entree &is) override
void swap_nodes(IntTab &cells, int cell, int node0, int node1)
void check_cell_orientation_3D()
void check_cell_enumeration_3D()
static void init_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
Create parallel descriptors for the vertex and element arrays of the domain (necessary because Scatte...
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const