16#include <OrienteFacesBord.h>
27template <
typename _SIZE_>
33template <
typename _SIZE_>
39template <
typename _SIZE_>
48template <
typename _SIZE_>
49void OrienteFacesBord_32_64<_SIZE_>::oriente_faces_bord(
const Nom& nom_dom)
51 Domaine_t& dom=ref_cast(Domaine_t, this->objet(nom_dom));
53 constexpr double e=0.001;
54 SmallArrOfTID_t elem(1);
55 DoubleTab pos(1,this->dimension);
56 const DoubleTab_t& coords=dom.coord_sommets();
57 const int nombre_faces_rayonnantes=dom.nb_bords()+dom.nb_raccords();
58 for (
int iface=0; iface<nombre_faces_rayonnantes; iface++)
60 const IntTab_t& som=(iface<dom.nb_bords()?dom.bord(iface).faces().les_sommets():dom.raccord(iface-dom.nb_bords())->faces().les_sommets());
61 const int_t nb_faces=som.dimension(0);
62 IntTab_t new_faces(nb_faces,som.dimension_int(1));
64 for (int_t j=0; j<nb_faces; j++)
66 if (this->dimension==2)
70 const double r0=coords(som(j,0),0);
71 const double t0=coords(som(j,0),1);
72 const double r1=coords(som(j,1),0);
73 double t1=coords(som(j,1),1);
74 if (t1<t0) t1+=2*M_PI;
83 else if (est_egal(t0,t1))
94 const double x0=coords(som(j,0),0);
95 const double y0=coords(som(j,0),1);
96 const double x1=coords(som(j,1),0);
97 const double y1=coords(som(j,1),1);
98 const double nx=y0-y1;
99 const double ny=x1-x0;
101 pos(0,0)=0.5*(x0+x1)+alpha*nx;
102 pos(0,1)=0.5*(y0+y1)+alpha*ny;
104 dom.chercher_elements(pos,elem);
107 new_faces(j,0) = som(j,0);
108 new_faces(j,1) = som(j,1);
112 new_faces(j,0) = som(j,1);
113 new_faces(j,1) = som(j,0);
120 const double r0=coords(som(j,0),0);
121 const double t0=coords(som(j,0),1);
122 const double z0=coords(som(j,0),2);
123 const double r3=coords(som(j,3),0);
124 const double z3=coords(som(j,3),2);
125 double t3=coords(som(j,3),1);
127 if (t3<t0) t3+=2*M_PI;
131 pos(0,1)=0.5*(t0+t3);
136 pos(0,2)=0.5*(z0+z3);
138 else if (est_egal(z0,z3))
140 pos(0,0)=0.5*(r0+r3);
141 pos(0,1)=0.5*(t0+t3);
147 else if (est_egal(t0,t3))
149 pos(0,0)=0.5*(r0+r3);
150 pos(0,2)=0.5*(z0+z3);
156 dom.chercher_elements(pos,elem);
159 new_faces(j,0) = som(j,0);
160 new_faces(j,1) = som(j,2);
161 new_faces(j,2) = som(j,3);
162 new_faces(j,3) = som(j,1);
166 new_faces(j,0) = som(j,0);
167 new_faces(j,1) = som(j,1);
168 new_faces(j,2) = som(j,3);
169 new_faces(j,3) = som(j,2);
174 const double x0=coords(som(j,0),0);
175 const double y0=coords(som(j,0),1);
176 const double z0=coords(som(j,0),2);
177 const double x1=coords(som(j,1),0);
178 const double y1=coords(som(j,1),1);
179 const double z1=coords(som(j,1),2);
180 const double x2=coords(som(j,2),0);
181 const double y2=coords(som(j,2),1);
182 const double z2=coords(som(j,2),2);
183 const double nx=(y1-y0)*(z2-z0)-(z1-z0)*(y2-y0);
184 const double ny=(z1-z0)*(x2-x0)-(x1-x0)*(z2-z0);
185 const double nz=(x1-x0)*(y2-y0)-(y1-y0)*(x2-x0);
187 pos(0,0)=(x0+x1+x2)/3.+alpha*nx;
188 pos(0,1)=(y0+y1+y2)/3.+alpha*ny;
189 pos(0,2)=(z0+z1+z2)/3.+alpha*nz;
190 dom.chercher_elements(pos,elem);
201 if (type==
"Tetraedre")
203 new_faces(j,0) = som(j,0);
204 new_faces(j,1) = som(j,1);
205 new_faces(j,2) = som(j,2);
210 new_faces(j,0) = som(j,0);
211 new_faces(j,1) = som(j,1);
212 new_faces(j,2) = som(j,3);
213 new_faces(j,3) = som(j,2);
219 if (type==
"Tetraedre")
221 new_faces(j,0) = som(j,0);
222 new_faces(j,1) = som(j,2);
223 new_faces(j,2) = som(j,1);
227 new_faces(j,0) = som(j,0);
228 new_faces(j,1) = som(j,2);
229 new_faces(j,2) = som(j,3);
230 new_faces(j,3) = som(j,1);
235 const int_t el=elem(0);
236 pos(0,0)=(x0+x1+x2)/3.-alpha*nx;
237 pos(0,1)=(y0+y1+y2)/3.-alpha*ny;
238 pos(0,2)=(z0+z1+z2)/3.-alpha*nz;
239 dom.chercher_elements(pos,elem);
242 Cerr <<
"Case not implemented in the OrienteFacesBord algorithm! " << finl;
243 Cerr <<
"The face " << j <<
" is surrounded by the two elements " << el <<
" " << elem(0) << finl;
244 Cerr << alpha*nx << finl;
245 Cerr << alpha*ny << finl;
246 Cerr << alpha*nz << finl;
247 Cerr <<
"Contact TRUST support." <<finl;
254 if (iface<dom.nb_bords())
255 dom.bord(iface).faces().les_sommets().ref(new_faces);
257 dom.raccord(iface-dom.nb_bords())->faces().les_sommets().ref(new_faces);
Class defining operators and methods for all reading operation in an input flow (file,...
classe Interprete_geometrique_base .
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
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.
static double precision_geom
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Entree & interpreter_(Entree &) override
Classe de base des flux de sortie.