16#include <Connectivite_som_elem.h>
17#include <Static_Int_Lists.h>
18#include <Faces_builder.h>
19#include <Extruder_en3.h>
24Implemente_instanciable_sans_constructeur(
Extruder_en3,
"Extruder_en3",Interprete_geometrique_base);
36 direction_.resize(3,RESIZE_OPTIONS::NOCOPY_NOINIT);
59 Cerr <<
" We only can extruder_en3 the 2D meshes ! " << finl;
74 nb_dom=noms_dom.size();
86 for(
int i=0; i<nb_dom; i++)
111 int oldnbsom = dom.
nb_som();
121 Type_Face type_face = dom.type_elem()->type_face(0);
122 les_faces.
typer(type_face);
125 Static_Int_Lists connectivite_som_elem;
126 const IntTab& elements = dom.
les_elems();
129 construire_connectivite_som_elem(nb_sommets_tot,
131 connectivite_som_elem,
134 Faces_builder faces_builder;
137 connectivite_som_elem,
142 int newnbsom = oldnbsom*(
NZ_+1);
143 DoubleTab new_soms(newnbsom, 3);
148 for (
int i=0; i<oldnbsom; i++)
150 double x = coord_sommets(i,0);
151 double y = coord_sommets(i,1);
154 z=coord_sommets(i,2);
155 for (
int k=0; k<=
NZ_; k++)
157 new_soms(k*oldnbsom+i,0)=x;
158 new_soms(k*oldnbsom+i,1)=y;
159 new_soms(k*oldnbsom+i,2)=z;
170 int newnbelem = 3*
NZ_*oldsz;
171 IntTab new_elems(newnbelem, 4);
172 for (
int i=0; i<oldsz; i++)
174 int i1=les_elems(i,0);
175 int i2=les_elems(i,1);
176 int i3=les_elems(i,2);
185 for (
int k=0; k<
NZ_; k++)
188 if (ii1>ii2 && ii1>ii3)
196 new_elems(j+1,0) = i2;
197 new_elems(j+1,1) = i3;
198 new_elems(j+1,2) = i4;
199 new_elems(j+1,3) = i6;
201 new_elems(j+2,0) = i2;
202 new_elems(j+2,1) = i4;
203 new_elems(j+2,2) = i5;
204 new_elems(j+2,3) = i6;
208 new_elems(j+1,0) = i2;
209 new_elems(j+1,1) = i3;
210 new_elems(j+1,2) = i4;
211 new_elems(j+1,3) = i5;
213 new_elems(j+2,0) = i3;
214 new_elems(j+2,1) = i4;
215 new_elems(j+2,2) = i5;
216 new_elems(j+2,3) = i6;
220 if (ii2>ii1 && ii2>ii3)
228 new_elems(j+1,0) = i1;
229 new_elems(j+1,1) = i3;
230 new_elems(j+1,2) = i4;
231 new_elems(j+1,3) = i5;
233 new_elems(j+2,0) = i3;
234 new_elems(j+2,1) = i4;
235 new_elems(j+2,2) = i5;
236 new_elems(j+2,3) = i6;
240 new_elems(j+1,0) = i1;
241 new_elems(j+1,1) = i3;
242 new_elems(j+1,2) = i5;
243 new_elems(j+1,3) = i6;
245 new_elems(j+2,0) = i1;
246 new_elems(j+2,1) = i4;
247 new_elems(j+2,2) = i5;
248 new_elems(j+2,3) = i6;
252 if (ii3>ii1 && ii3>ii2)
260 new_elems(j+1,0) = i1;
261 new_elems(j+1,1) = i2;
262 new_elems(j+1,2) = i5;
263 new_elems(j+1,3) = i6;
265 new_elems(j+2,0) = i1;
266 new_elems(j+2,1) = i4;
267 new_elems(j+2,2) = i5;
268 new_elems(j+2,3) = i6;
272 new_elems(j+1,0) = i1;
273 new_elems(j+1,1) = i2;
274 new_elems(j+1,2) = i4;
275 new_elems(j+1,3) = i6;
277 new_elems(j+2,0) = i2;
278 new_elems(j+2,1) = i4;
279 new_elems(j+2,2) = i5;
280 new_elems(j+2,3) = i6;
295 dom.
typer(
"Tetraedre");
297 les_elems.
ref(new_elems);
301 Cerr <<
"TRUST doesn't know how to extrude " << dom.type_elem()->
que_suis_je() <<
"s"<<finl;
313 Faces& les_faces_du_bord = itr.faces();
320 Faces& les_faces_du_bord = itr->faces();
327 Cerr <<
"We don't associate any boundary to the front of the domain " << dom.
le_nom() << finl;
333 Faces& les_faces_dvt=devant.
faces();
334 les_faces_dvt.
typer(Type_Face::triangle_3D);
336 IntTab som_dvt(oldsz, 3);
340 for (
int i=0; i<oldsz; i++)
342 int i0=les_elems(3*i,0);
343 int i1=les_elems(3*i,1);
344 int i2=les_elems(3*i,2);
356 Cerr <<
"We don't associate any boundary to the back of the domain " << dom.
le_nom() << finl;
360 Bord& derriere = dom.
faces_bord().add(Bord());
362 Faces& les_faces_der=derriere.
faces();
363 les_faces_der.
typer(Type_Face::triangle_3D);
365 IntTab som_der(oldsz, 3);
369 for (
int i=0; i<oldsz; i++)
371 int i0=les_elems(3*i,0);
372 int i1=les_elems(3*i,1);
373 int i2=les_elems(3*i,2);
375 som_der(i,0) = i0+oldnbsom*
NZ_;
376 som_der(i,1) = i1+oldnbsom*
NZ_;
377 som_der(i,2) = i2+oldnbsom*
NZ_;
389 int nb_faces = les_faces_du_bord.
nb_faces();
390 IntTab les_sommets(2*nb_faces*
NZ_,3);
391 for (
int i=0; i<nb_faces; i++)
393 int i0=les_faces_du_bord.
sommet(i,0);
394 int i1=les_faces_du_bord.
sommet(i,1);
397 for (
int k=0; k<
NZ_; k++)
399 int j=2*nb_faces*k+2*i;
403 les_sommets(j,0) = i0;
404 les_sommets(j,1) = i1;
405 les_sommets(j,2) = i0+oldnbsom;
407 les_sommets(j+1,0) = i1;
408 les_sommets(j+1,1) = i0+oldnbsom;
409 les_sommets(j+1,2) = i1+oldnbsom;
413 les_sommets(j,0) = i0;
414 les_sommets(j,1) = i1;
415 les_sommets(j,2) = i1+oldnbsom;
417 les_sommets(j+1,0) = i0;
418 les_sommets(j+1,1) = i0+oldnbsom;
419 les_sommets(j+1,2) = i1+oldnbsom;
426 les_faces_du_bord.
typer(Type_Face::triangle_3D);
429 les_faces_du_bord.
voisins()=-1;
DoubleTab_t & les_sommets()
Raccords_t & faces_raccord()
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
const DoubleTab_t & coord_sommets() const
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).
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,...
Classe Extruder_en3 Cette classe est un interprete qui sert a lire et executer.
void construire_bord_lateral(Faces &, Faces &, int, const IntVect &)
Creation d'un bord lateral.
void extruder(Domaine &, const IntVect &)
Extrusion d'un domaine surfacique.
void construire_bords(Domaine &, Faces &, int, int, const IntVect &)
Creation des bords du domaine extrude.
Entree & interpreter_(Entree &) override
Fonction principale de l'interprete Extruder_en3.
void typer(const Motcle &)
Type les faces.
void associer_domaine(const Domaine_t &z)
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
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)
Un tableau de chaine de caracteres (VECT(Nom)).
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