16#include <Orienter_Simplexes.h>
21Implemente_instanciable(
Orienter_Simplexes,
"Orienter_Simplexes_old",Interprete_geometrique_base) ;
35static void choose_internal_diagonal_for_triangle(Domaine& domain)
40static void choose_internal_diagonal_for_tetrahedron(Domaine& domain)
45 ArrOfDouble lengths(3);
48 for (
int cell=0; cell<nb_cells; ++cell)
50 const int s0 = cells(cell,0);
51 const int s1 = cells(cell,1);
52 const int s2 = cells(cell,2);
53 const int s3 = cells(cell,3);
55 const double x0 = nodes(s0,0);
56 const double x1 = nodes(s1,0);
57 const double x2 = nodes(s2,0);
58 const double x3 = nodes(s3,0);
60 const double y0 = nodes(s0,1);
61 const double y1 = nodes(s1,1);
62 const double y2 = nodes(s2,1);
63 const double y3 = nodes(s3,1);
65 const double z0 = nodes(s0,2);
66 const double z1 = nodes(s1,2);
67 const double z2 = nodes(s2,2);
68 const double z3 = nodes(s3,2);
70 const double x01 = 0.5 * (x0+x1);
71 const double x02 = 0.5 * (x0+x2);
72 const double x03 = 0.5 * (x0+x3);
73 const double x12 = 0.5 * (x1+x2);
74 const double x13 = 0.5 * (x1+x3);
75 const double x23 = 0.5 * (x2+x3);
77 const double y01 = 0.5 * (y0+y1);
78 const double y02 = 0.5 * (y0+y2);
79 const double y03 = 0.5 * (y0+y3);
80 const double y12 = 0.5 * (y1+y2);
81 const double y13 = 0.5 * (y1+y3);
82 const double y23 = 0.5 * (y2+y3);
84 const double z01 = 0.5 * (z0+z1);
85 const double z02 = 0.5 * (z0+z2);
86 const double z03 = 0.5 * (z0+z3);
87 const double z12 = 0.5 * (z1+z2);
88 const double z13 = 0.5 * (z1+z3);
89 const double z23 = 0.5 * (z2+z3);
91 lengths[0] = (x23-x01)*(x23-x01) + (y23-y01)*(y23-y01) + (z23-z01)*(z23-z01);
92 lengths[1] = (x13-x02)*(x13-x02) + (y13-y02)*(y13-y02) + (z13-z02)*(z13-z02);
93 lengths[2] = (x12-x03)*(x12-x03) + (y12-y03)*(y12-y03) + (z12-z03)*(z12-z03);
95 Cerr<<
"ici" <<lengths<<finl;
96 const int id = imin_array(lengths);
116 Cerr <<
"Error in Orienter_Simplexes 'choose_internal_diagonal_for_tetrahedron()'" << finl;
117 Cerr <<
" Internal error in 'imin_array()'" << finl;
123static void choose_internal_diagonal(Domaine& domain)
127 Motcles understood_keywords(2);
128 understood_keywords[0] =
"Triangle";
129 understood_keywords[1] =
"Tetraedre";
131 int rank = understood_keywords.search(cell_type);
135 choose_internal_diagonal_for_triangle(domain);
138 choose_internal_diagonal_for_tetrahedron(domain);
141 Cerr <<
"Error in Orienter_Simplexes.cpp 'choose_internal_diagonal()'" << finl;
142 Cerr <<
" Unknown cell type : " << cell_type << finl;
143 Cerr <<
" Orienter_Simplexes can only orient Triangles and Tetrahedrons" << finl;
148static void ensure_positive_volumes_for_triangle(Domaine& domain)
154 for (
int cell=0; cell<nb_cells; ++cell)
156 const int s0 = cells(cell,0);
157 const int s1 = cells(cell,1);
158 const int s2 = cells(cell,2);
160 const double x0 = nodes(s0,0);
161 const double x1 = nodes(s1,0);
162 const double x2 = nodes(s2,0);
164 const double y0 = nodes(s0,1);
165 const double y1 = nodes(s1,1);
166 const double y2 = nodes(s2,1);
168 const double area = 0.5 * ((x1-x0)*(y2-y0) - (x2-x0)*(y1-y0));
178static void ensure_positive_volumes_for_tetrahedron(Domaine& domain)
184 for (
int cell=0; cell<nb_cells; ++cell)
186 const int s0 = cells(cell,0);
187 const int s1 = cells(cell,1);
188 const int s2 = cells(cell,2);
189 const int s3 = cells(cell,3);
191 const double x0 = nodes(s0,0);
192 const double x1 = nodes(s1,0);
193 const double x2 = nodes(s2,0);
194 const double x3 = nodes(s3,0);
196 const double y0 = nodes(s0,1);
197 const double y1 = nodes(s1,1);
198 const double y2 = nodes(s2,1);
199 const double y3 = nodes(s3,1);
201 const double z0 = nodes(s0,2);
202 const double z1 = nodes(s1,2);
203 const double z2 = nodes(s2,2);
204 const double z3 = nodes(s3,2);
206 const double volume = (1./6.) * ( (x1-x0) * (y2-y0) * (z3-z0) +
207 (x2-x0) * (y3-y0) * (z1-z0) +
208 (x3-x0) * (y1-y0) * (z2-z0) -
209 (z1-z0) * (y2-y0) * (x3-x0) -
210 (x2-x0) * (z3-z0) * (y1-y0) -
211 (y3-y0) * (x1-x0) * (z2-z0) );
223static void ensure_positive_volumes(Domaine& domain)
227 Motcles understood_keywords(2);
228 understood_keywords[0] =
"Triangle";
229 understood_keywords[1] =
"Tetraedre";
231 int rank = understood_keywords.search(cell_type);
235 ensure_positive_volumes_for_triangle(domain);
238 ensure_positive_volumes_for_tetrahedron(domain);
241 Cerr <<
"Error in Orienter_Simplexes.cpp 'ensure_positive_volumes()'" << finl;
242 Cerr <<
" Unknown cell type : " << cell_type << finl;
243 Cerr <<
" Orienter_Simplexes can only orient Triangles and Tetrahedrons" << finl;
250 choose_internal_diagonal(domain);
251 ensure_positive_volumes(domain);
DoubleTab_t & les_sommets()
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)
Un tableau d'objets de la classe Motcle.
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.
: class Orienter_Simplexes
Entree & interpreter_(Entree &is) override
static void orient_domain(Domaine &domaine)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
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