16#include <Connectivite_som_elem.h>
17#include <Static_Int_Lists.h>
18#include <Extruder_en20.h>
19#include <Faces_builder.h>
24Implemente_instanciable_sans_constructeur(
Extruder_en20,
"Extruder_en20", Interprete_geometrique_base);
75 Cerr <<
" The extrusion of quadrangle is made by Extruder and not by Extruder_en20 " << finl;
78 else if( dom.type_elem()->
que_suis_je() ==
"Triangle")
80 int oldnbsom = dom.
nb_som();
91 Type_Face type_face = dom.type_elem()->type_face(0);
92 les_faces.
typer(type_face);
95 Static_Int_Lists connectivite_som_elem;
99 construire_connectivite_som_elem(nb_sommets_tot,
101 connectivite_som_elem,
104 Faces_builder faces_builder;
107 connectivite_som_elem,
111 const int nbfaces2D = les_faces.
nb_faces();
114 int newnbsom = oldnbsom*(
NZ+1)+
NZ*oldsz+nbfaces2D*
NZ+oldnbsom*
NZ;
115 DoubleTab new_soms(newnbsom, 3);
121 for (
int i=0; i<oldnbsom; i++)
123 double x = coord_sommets(i,0);
124 double y = coord_sommets(i,1);
127 z=coord_sommets(i,2);
128 for (
int k=0; k<=
NZ; k++)
130 new_soms(k*oldnbsom+i,0)=x;
131 new_soms(k*oldnbsom+i,1)=y;
132 new_soms(k*oldnbsom+i,2)=z;
142 for (
int i=0; i<oldsz; i++)
144 int i0=les_elems(i,0);
145 int i1=les_elems(i,1);
146 int i2=les_elems(i,2);
148 double xg = 1./3.*(coord_sommets(i0,0)+coord_sommets(i1,0)+coord_sommets(i2,0))+0.5*dx;
149 double yg = 1./3.*(coord_sommets(i0,1)+coord_sommets(i1,1)+coord_sommets(i2,1))+0.5*dy;
152 z = 1./3.*(coord_sommets(i0,2)+coord_sommets(i1,2)+coord_sommets(i2,2))+0.5*dz;
153 for (
int k=0; k<
NZ; k++)
156 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,0)=xg;
157 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,1)=yg;
158 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,2)=z;
168 for (
int i=0; i<nbfaces2D; i++)
170 int i0=les_faces.
sommet(i,0);
171 int i1=les_faces.
sommet(i,1);
173 double x01 = 0.5*(coord_sommets(i0,0)+coord_sommets(i1,0))+0.5*dx;
174 double y01 = 0.5*(coord_sommets(i0,1)+coord_sommets(i1,1))+0.5*dy;
177 z = 0.5*(coord_sommets(i0,2)+coord_sommets(i1,2))+0.5*dz;
178 for (
int k=0; k<
NZ; k++)
180 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,0)=x01;
181 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,1)=y01;
182 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,2)=z;
190 for (
int i=0; i<oldnbsom; i++)
192 double x = coord_sommets(i,0)+0.5*dx;
193 double y = coord_sommets(i,1)+ 0.5*dy;
196 z=coord_sommets(i,2)+0.5*dz;
197 for (
int k=0; k<
NZ; k++)
199 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,0)=x;
200 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,1)=y;
201 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,2)=z;
209 coord_sommets.
reset();
212 int newnbelem = 20*
NZ*oldsz;
213 IntTab new_elems(newnbelem, 4);
218 for (
int i=0; i<oldsz; i++)
220 int i0=les_elems(i,0);
221 int i1=les_elems(i,1);
222 int i2=les_elems(i,2);
224 int ig=oldnbsom*(
NZ+1)+i;
226 for (
int k=0; k<
NZ; k++)
228 new_elems(2*k*oldsz+2*i,0) = i0;
229 new_elems(2*k*oldsz+2*i,1) = i1;
230 new_elems(2*k*oldsz+2*i,2) = i2;
231 new_elems(2*k*oldsz+2*i,3) = ig;
234 new_elems(2*k*oldsz+2*i+1,0) = i0+oldnbsom;
235 new_elems(2*k*oldsz+2*i+1,1) = i1+oldnbsom;
236 new_elems(2*k*oldsz+2*i+1,2) = i2+oldnbsom;
237 new_elems(2*k*oldsz+2*i+1,3) = ig;
252 for (
int i=0; i<nbfaces2D; i++)
254 for (
int ivois=0; ivois<2; ivois++)
256 int elem = les_faces.
voisin(i,ivois);
260 int i0=les_faces.
sommet(i,0);
261 int i1=les_faces.
sommet(i,1);
262 int i01=oldnbsom*(
NZ+1)+
NZ*oldsz+i;
264 for (
int k=0; k<
NZ; k++)
266 int ig=oldnbsom*(
NZ+1)+k*oldsz+elem;
268 int i00=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i0;
269 int i11=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i1;
273 new_elems(cpt,0) = i0;
274 new_elems(cpt,1) = i1;
275 new_elems(cpt,2) = i01;
276 new_elems(cpt++,3) = ig;
278 new_elems(cpt,0) = i0+oldnbsom;
279 new_elems(cpt,1) = i1+oldnbsom;
280 new_elems(cpt,2) = i01;
281 new_elems(cpt++,3) = ig;
283 new_elems(cpt,0) = i1;
284 new_elems(cpt,1) = i11;
285 new_elems(cpt,2) = i01;
286 new_elems(cpt++,3) = ig;
288 new_elems(cpt,0) = i11;
289 new_elems(cpt,1) = i1+oldnbsom;
290 new_elems(cpt,2) = i01;
291 new_elems(cpt++,3) = ig;
293 new_elems(cpt,0) = i0;
294 new_elems(cpt,1) = i00;
295 new_elems(cpt,2) = i01;
296 new_elems(cpt++,3) = ig;
298 new_elems(cpt,0) = i00;
299 new_elems(cpt,1) = i0+oldnbsom;
300 new_elems(cpt,2) = i01;
301 new_elems(cpt++,3) = ig;
313 les_elems.
ref(new_elems);
317 dom.
typer(
"Tetraedre");
324 Cerr <<
"It is not known yet how to extrude "
332void Extruder_en20::traiter_faces_dvt(Faces& les_faces_bord, Faces& les_faces,
int oldnbsom,
int oldsz,
int nbfaces2D )
334 int size_2D = les_faces_bord.
nb_faces();
336 IntTab les_sommets(6*size_2D*
NZ, 3);
338 for (
int i=0; i<size_2D; i++)
340 int i0=les_faces_bord.
sommet(i,0);
341 int i1=les_faces_bord.
sommet(i,1);
348 for (
int iface=0; iface<nbfaces2D; iface++)
350 int j0=les_faces.
sommet(iface,0);
351 int j1=les_faces.
sommet(iface,1);
353 if (((i0==j0) &&(i1==j1)) || ((i0==j1) &&(i1==j0)))
361 for (
int k=0; k<
NZ; k++)
365 int j01 = oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+jface;
367 int i00=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i0;
368 int i11=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i1;
372 les_sommets(k*6*size_2D+6*i,0) = i0;
373 les_sommets(k*6*size_2D+6*i,1) = i1;
374 les_sommets(k*6*size_2D+6*i,2) = j01;
376 les_sommets(k*6*size_2D+6*i+1,0) = j01;
377 les_sommets(k*6*size_2D+6*i+1,1) = i1;
378 les_sommets(k*6*size_2D+6*i+1,2) = i11;
380 les_sommets(k*6*size_2D+6*i+2,0) = j01;
381 les_sommets(k*6*size_2D+6*i+2,1) = i11;
382 les_sommets(k*6*size_2D+6*i+2,2) = i1+oldnbsom;
384 les_sommets(k*6*size_2D+6*i+3,0) = j01;
385 les_sommets(k*6*size_2D+6*i+3,1) = i0+oldnbsom;
386 les_sommets(k*6*size_2D+6*i+3,2) = i1+oldnbsom;
388 les_sommets(k*6*size_2D+6*i+4,0) = j01;
389 les_sommets(k*6*size_2D+6*i+4,1) = i0+oldnbsom;
390 les_sommets(k*6*size_2D+6*i+4,2) = i00;
392 les_sommets(k*6*size_2D+6*i+5,0) = j01;
393 les_sommets(k*6*size_2D+6*i+5,1) = i00;
394 les_sommets(k*6*size_2D+6*i+5,2) = i0;
401 les_faces_bord.
typer(Type_Face::triangle_3D);
411 const int nbfaces2D = les_faces.
nb_faces();
416 Faces& les_faces_bord = itr.faces();
417 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
422 Faces& les_faces_bord = itr->faces();
423 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
428 Faces& les_faces_dvt=devant.
faces();
429 les_faces_dvt.
typer(Type_Face::triangle_3D);
431 IntTab som_dvt(oldsz, 3);
435 Bord& derriere = dom.
faces_bord().add(Bord());
436 derriere.
nommer(
"derriere");
437 Faces& les_faces_der=derriere.
faces();
438 les_faces_der.
typer(Type_Face::triangle_3D);
440 IntTab som_der(oldsz, 3);
444 for (
int i=0; i<oldsz; i++)
446 int i0=les_elems(2*i,0);
447 int i1=les_elems(2*i,1);
448 int i2=les_elems(2*i,2);
454 som_der(i,0) = i0+oldnbsom*
NZ;
455 som_der(i,1) = i1+oldnbsom*
NZ;
456 som_der(i,2) = i2+oldnbsom*
NZ;
DoubleTab_t & les_sommets()
Raccords_t & faces_raccord()
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
void ajouter(const DoubleTab_t &soms)
Ajoute des noeuds (ou sommets) au domaine (sans verifier les doublons).
Class defining operators and methods for all reading operation in an input flow (file,...
Classe Extruder_en20 Cette classe est un interprete qui sert a lire et executer.
virtual void extruder_dvt(Domaine &, Faces &, int, int)
Entree & interpreter_(Entree &) override
Fonction principale de l'interprete Extruder_en20 Triangule tout le domaine.
void extruder(Domaine &)
Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles...
void typer(const Motcle &)
Type les faces.
void associer_domaine(const Domaine_t &z)
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
int_t voisin(int_t, int) const
Renvoie le numero du i-ieme voisin de face.
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
void creer_faces_reeles(Domaine_t &domaine, const Static_Int_Lists_t &connect_som_elem, Faces_t &les_faces, IntTab_t &elem_faces)
A partir de la description des elements du domaine et des frontieres (bords, raccords,...
void nommer(const Nom &) override
Donne un nom a la frontiere.
const Faces_t & faces() const
void mettre_a_jour_sous_domaine(Domaine_t &domaine, int_t &elem, int_t num_premier_elem, int_t nb_elem) const
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.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
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.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
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.
virtual void ref(const TRUSTTab &)
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const