17#include <Connectivite_som_elem.h>
18#include <Static_Int_Lists.h>
19#include <Faces_builder.h>
29template <
typename _SIZE_>
32template <
typename _SIZE_>
35template <
typename _SIZE_>
50template <
typename _SIZE_>
68inline void check_boundary_name(
const Nom& name)
71 if (name==
"devant" || name==
"derriere")
73 Cerr <<
"Problem : you must change the name of the boundary : " <<name<<finl;
74 Cerr <<
"because the extrusion keyword is going to create new boundaries named derriere and devant" << finl;
75 Cerr <<
"which will create a conflict." << finl;
86template <
typename _SIZE_>
109 Type_Face type_face = dom.type_elem()->type_face(0);
110 les_faces.
typer(type_face);
117 construire_connectivite_som_elem(nb_sommets_tot,
119 connectivite_som_elem,
125 connectivite_som_elem,
132 int_t newnbsom = (oldnbsom*(
NZ+1)+
NZ*oldsz+nbfaces2D*
NZ);
139 for (
int i=0; i<oldnbsom; i++)
141 double x = coord_sommets(i,0);
142 double y = coord_sommets(i,1);
145 z=coord_sommets(i,2);
147 for (
int k=0; k<=
NZ; k++)
149 new_soms(k*oldnbsom+i,0)=x;
150 new_soms(k*oldnbsom+i,1)=y;
151 new_soms(k*oldnbsom+i,2)=z;
161 for (
int_t i=0; i<oldsz; i++)
163 int_t i0=les_elems(i,0);
164 int_t i1=les_elems(i,1);
165 int_t i2=les_elems(i,2);
167 double xg = 1./3.*(coord_sommets(i0,0)+coord_sommets(i1,0)+coord_sommets(i2,0))+0.5*dx;
168 double yg = 1./3.*(coord_sommets(i0,1)+coord_sommets(i1,1)+coord_sommets(i2,1))+0.5*dy;
171 z = 1./3.*(coord_sommets(i0,2)+coord_sommets(i1,2)+coord_sommets(i2,2))+0.5*dz;
172 for (
int k=0; k<
NZ; k++)
175 new_soms((oldnbsom*(
NZ+1)+k*oldsz+i),0)=xg;
176 new_soms((oldnbsom*(
NZ+1)+k*oldsz+i),1)=yg;
177 new_soms((oldnbsom*(
NZ+1)+k*oldsz+i),2)=z;
187 for (
int i=0; i<nbfaces2D; i++)
192 double x01 = 0.5*(coord_sommets(i0,0)+coord_sommets(i1,0))+0.5*dx;
193 double y01 = 0.5*(coord_sommets(i0,1)+coord_sommets(i1,1))+0.5*dy;
196 z = 0.5*(coord_sommets(i0,2)+coord_sommets(i1,2))+0.5*dz;
198 for (
int k=0; k<
NZ; k++)
200 new_soms((oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i),0)=x01;
201 new_soms((oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i),1)=y01;
202 new_soms((oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i),2)=z;
219 for (
int_t i=0; i<oldsz; i++)
221 int_t i0=les_elems(i,0);
222 int_t i1=les_elems(i,1);
223 int_t i2=les_elems(i,2);
227 for (
int k=0; k<
NZ; k++)
229 new_elems(2*k*oldsz+2*i,0) = i0;
230 new_elems(2*k*oldsz+2*i,1) = i1;
231 new_elems(2*k*oldsz+2*i,2) = i2;
232 new_elems(2*k*oldsz+2*i,3) = ig;
235 new_elems(2*k*oldsz+2*i+1,0) = i0+oldnbsom;
236 new_elems(2*k*oldsz+2*i+1,1) = i1+oldnbsom;
237 new_elems(2*k*oldsz+2*i+1,2) = i2+oldnbsom;
238 new_elems(2*k*oldsz+2*i+1,3) = ig;
253 for (
int_t i=0; i<nbfaces2D; i++)
255 for (
int ivois=0; ivois<2; ivois++)
267 int_t ig=oldnbsom*(
NZ+1)+k*oldsz+elem;
269 new_elems(cpt,0) = i0;
270 new_elems(cpt,1) = i1;
271 new_elems(cpt,2) = i01;
272 new_elems(cpt++,3) = ig;
274 new_elems(cpt,0) = i0+oldnbsom;
275 new_elems(cpt,1) = i1+oldnbsom;
276 new_elems(cpt,2) = i01;
277 new_elems(cpt++,3) = ig;
279 new_elems(cpt,0) = i1;
280 new_elems(cpt,1) = i1+oldnbsom;
281 new_elems(cpt,2) = i01;
282 new_elems(cpt++,3) = ig;
284 new_elems(cpt,0) = i0;
285 new_elems(cpt,1) = i0+oldnbsom;
286 new_elems(cpt,2) = i01;
287 new_elems(cpt++,3) = ig;
299 les_elems.
ref(new_elems);
303 dom.
typer(
"Tetraedre");
310 Cerr <<
"It is not known yet how to extrude "
317template <
typename _SIZE_>
318void Extruder_32_64<_SIZE_>::traiter_faces_dvt(Faces_t& les_faces_bord, Faces_t& les_faces, int_t oldnbsom, int_t oldsz, int_t nbfaces2D )
320 int_t size_2D = les_faces_bord.nb_faces();
322 IntTab_t les_sommets(4*size_2D*NZ, 3);
324 for (int_t i=0; i<size_2D; i++)
326 int_t i0=les_faces_bord.sommet(i,0);
327 int_t i1=les_faces_bord.sommet(i,1);
334 for (int_t iface=0; iface<nbfaces2D; iface++)
336 int_t j0=les_faces.sommet(iface,0);
337 int_t j1=les_faces.sommet(iface,1);
339 if (((i0==j0) &&(i1==j1)) || ((i0==j1) &&(i1==j0)))
347 for (int_t k=0; k<NZ; k++)
351 int_t j01 = oldnbsom*(NZ+1)+NZ*oldsz+k*nbfaces2D+jface;
353 les_sommets(k*4*size_2D+4*i,0) = i0;
354 les_sommets(k*4*size_2D+4*i,1) = i1;
355 les_sommets(k*4*size_2D+4*i,2) = j01;
357 les_sommets(k*4*size_2D+4*i+1,0) = j01;
358 les_sommets(k*4*size_2D+4*i+1,1) = i1;
359 les_sommets(k*4*size_2D+4*i+1,2) = i1+oldnbsom;
362 les_sommets(k*4*size_2D+4*i+2,0) = j01;
363 les_sommets(k*4*size_2D+4*i+2,1) = i0+oldnbsom;
364 les_sommets(k*4*size_2D+4*i+2,2) = i1+oldnbsom;
367 les_sommets(k*4*size_2D+4*i+3,0) = j01;
368 les_sommets(k*4*size_2D+4*i+3,1) = i0+oldnbsom;
369 les_sommets(k*4*size_2D+4*i+3,2) = i0;
376 les_faces_bord.typer(Type_Face::triangle_3D);
377 les_faces_bord.les_sommets().ref(les_sommets);
378 les_faces_bord.voisins().resize(4*size_2D*NZ, 2);
379 les_faces_bord.voisins()=-1;
383template <
typename _SIZE_>
392 check_boundary_name(itr.le_nom());
393 Faces_t& les_faces_bord = itr.faces();
394 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
399 check_boundary_name(itr->le_nom());
400 Faces_t& les_faces_bord = itr->faces();
401 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
407 les_faces_dvt.
typer(Type_Face::triangle_3D);
414 derriere.
nommer(
"derriere");
416 les_faces_der.
typer(Type_Face::triangle_3D);
422 for (
int_t i=0; i<oldsz; i++)
424 int_t i0=les_elems(2*i,0);
425 int_t i1=les_elems(2*i,1);
426 int_t i2=les_elems(2*i,2);
432 som_der(i,0) = i0+oldnbsom*
NZ;
433 som_der(i,1) = i1+oldnbsom*
NZ;
434 som_der(i,2) = i2+oldnbsom*
NZ;
443template <
typename _SIZE_>
457 Type_Face type_face = dom.type_elem()->type_face(0);
458 les_faces.
typer(type_face);
465 construire_connectivite_som_elem(nb_sommets_tot,
467 connectivite_som_elem,
473 connectivite_som_elem,
478 int_t newnbsom = oldnbsom*(
NZ+1);
485 for (i=0; i<oldnbsom; i++)
487 double x = coord_sommets(i,0);
488 double y = coord_sommets(i,1);
491 z=coord_sommets(i,2);
492 for (
int k=0; k<=
NZ; k++)
494 new_soms(k*oldnbsom+i,0)=x;
495 new_soms(k*oldnbsom+i,1)=y;
496 new_soms(k*oldnbsom+i,2)=z;
513 for (i=0; i<oldsz; i++)
515 int_t i0=les_elems(i,0);
516 int_t i1=les_elems(i,1);
517 int_t i2=les_elems(i,2);
518 int_t i3=les_elems(i,3);
523 new_elems(k*oldsz+i,0) = i0;
524 new_elems(k*oldsz+i,1) = i1;
525 new_elems(k*oldsz+i,2) = i2;
526 new_elems(k*oldsz+i,3) = i3;
527 new_elems(k*oldsz+i,4) = i0+oldnbsom;
528 new_elems(k*oldsz+i,5) = i1+oldnbsom;
529 new_elems(k*oldsz+i,6) = i2+oldnbsom;
530 new_elems(k*oldsz+i,7) = i3+oldnbsom;
540 les_elems.
ref(new_elems);
544 if ((dom.type_elem()->
que_suis_je()) ==
"Quadrangle")
545 dom.
typer(
"Hexaedre_VEF");
547 dom.
typer(
"Hexaedre");
551template <
typename _SIZE_>
552void Extruder_32_64<_SIZE_>::traiter_faces_dvt_hexa(Faces_t& les_faces_bord, int_t oldnbsom)
554 int_t size_2D = les_faces_bord.nb_faces();
556 IntTab_t les_sommets(size_2D*NZ, 4);
558 for (int_t i=0; i<size_2D; i++)
560 int_t i0=les_faces_bord.sommet(i,0);
561 int_t i1=les_faces_bord.sommet(i,1);
564 for (int_t k=0; k<NZ; k++)
566 les_sommets(k*size_2D+i,0) = i0;
567 les_sommets(k*size_2D+i,1) = i1;
568 les_sommets(k*size_2D+i,2) = i0+oldnbsom;
569 les_sommets(k*size_2D+i,3) = i1+oldnbsom;
576 les_faces_bord.typer(Type_Face::quadrangle_3D);
577 les_faces_bord.les_sommets().ref(les_sommets);
578 les_faces_bord.voisins().resize(size_2D*NZ, 2);
579 les_faces_bord.voisins()=-1;
581template <
typename _SIZE_>
589 check_boundary_name(itr.le_nom());
590 Faces_t& les_faces_bord = itr.faces();
591 traiter_faces_dvt_hexa(les_faces_bord, oldnbsom);
596 check_boundary_name(itr->le_nom());
599 traiter_faces_dvt_hexa(les_faces_bord, oldnbsom);
605 les_faces_dvt.
typer(Type_Face::quadrangle_3D);
612 derriere.
nommer(
"derriere");
614 les_faces_der.
typer(Type_Face::quadrangle_3D);
620 for (
int_t i=0; i<oldsz; i++)
622 int_t i0=les_elems(i,0);
623 int_t i1=les_elems(i,1);
624 int_t i2=les_elems(i,2);
625 int_t i3=les_elems(i,3);
632 som_der(i,0) = i0+oldnbsom*
NZ;
633 som_der(i,1) = i1+oldnbsom*
NZ;
634 som_der(i,2) = i2+oldnbsom*
NZ;
635 som_der(i,3) = i3+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 Cette classe est un interprete qui sert a lire et executer.
DoubleTab_T< _SIZE_ > DoubleTab_t
Faces_builder_32_64< _SIZE_ > Faces_builder_t
Faces_32_64< _SIZE_ > Faces_t
Bord_32_64< _SIZE_ > Bord_t
IntTab_T< _SIZE_ > IntTab_t
Static_Int_Lists_32_64< _SIZE_ > Static_Int_Lists_t
Domaine_32_64< _SIZE_ > Domaine_t
Entree & interpreter_(Entree &) override
Fonction principale de l'interprete Extruder Triangule 1 a 1 toutes les domaines du domaine.
virtual void extruder_dvt_hexa(Domaine_t &, Faces_t &, int_t, int_t)
virtual void extruder_dvt(Domaine_t &, Faces_t &, int_t, int_t)
void extruder(Domaine_t &)
Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles...
void extruder_hexa(Domaine_t &)
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
classe Interprete_geometrique_base .
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