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);
72 Cerr <<
" The extrusion of quadrangle is made by Extruder and not by Extruder_en20 " << finl;
75 else if( dom.type_elem()->
que_suis_je() ==
"Triangle")
77 int oldnbsom = dom.
nb_som();
88 Type_Face type_face = dom.type_elem()->type_face(0);
89 les_faces.
typer(type_face);
92 Static_Int_Lists connectivite_som_elem;
96 construire_connectivite_som_elem(nb_sommets_tot,
98 connectivite_som_elem,
101 Faces_builder faces_builder;
104 connectivite_som_elem,
108 const int nbfaces2D = les_faces.
nb_faces();
111 int newnbsom = oldnbsom*(
NZ+1)+
NZ*oldsz+nbfaces2D*
NZ+oldnbsom*
NZ;
112 DoubleTab new_soms(newnbsom, 3);
118 for (
int i=0; i<oldnbsom; i++)
120 double x = coord_sommets(i,0);
121 double y = coord_sommets(i,1);
124 z=coord_sommets(i,2);
125 for (
int k=0; k<=
NZ; k++)
127 new_soms(k*oldnbsom+i,0)=x;
128 new_soms(k*oldnbsom+i,1)=y;
129 new_soms(k*oldnbsom+i,2)=z;
139 for (
int i=0; i<oldsz; i++)
141 int i0=les_elems(i,0);
142 int i1=les_elems(i,1);
143 int i2=les_elems(i,2);
145 double xg = 1./3.*(coord_sommets(i0,0)+coord_sommets(i1,0)+coord_sommets(i2,0))+0.5*dx;
146 double yg = 1./3.*(coord_sommets(i0,1)+coord_sommets(i1,1)+coord_sommets(i2,1))+0.5*dy;
149 z = 1./3.*(coord_sommets(i0,2)+coord_sommets(i1,2)+coord_sommets(i2,2))+0.5*dz;
150 for (
int k=0; k<
NZ; k++)
153 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,0)=xg;
154 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,1)=yg;
155 new_soms(oldnbsom*(
NZ+1)+k*oldsz+i,2)=z;
165 for (
int i=0; i<nbfaces2D; i++)
167 int i0=les_faces.
sommet(i,0);
168 int i1=les_faces.
sommet(i,1);
170 double x01 = 0.5*(coord_sommets(i0,0)+coord_sommets(i1,0))+0.5*dx;
171 double y01 = 0.5*(coord_sommets(i0,1)+coord_sommets(i1,1))+0.5*dy;
174 z = 0.5*(coord_sommets(i0,2)+coord_sommets(i1,2))+0.5*dz;
175 for (
int k=0; k<
NZ; k++)
177 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,0)=x01;
178 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,1)=y01;
179 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+i,2)=z;
187 for (
int i=0; i<oldnbsom; i++)
189 double x = coord_sommets(i,0)+0.5*dx;
190 double y = coord_sommets(i,1)+ 0.5*dy;
193 z=coord_sommets(i,2)+0.5*dz;
194 for (
int k=0; k<
NZ; k++)
196 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,0)=x;
197 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,1)=y;
198 new_soms(oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+k*oldnbsom+i,2)=z;
206 coord_sommets.
reset();
209 int newnbelem = 20*
NZ*oldsz;
210 IntTab new_elems(newnbelem, 4);
215 for (
int i=0; i<oldsz; i++)
217 int i0=les_elems(i,0);
218 int i1=les_elems(i,1);
219 int i2=les_elems(i,2);
221 int ig=oldnbsom*(
NZ+1)+i;
223 for (
int k=0; k<
NZ; k++)
225 new_elems(2*k*oldsz+2*i,0) = i0;
226 new_elems(2*k*oldsz+2*i,1) = i1;
227 new_elems(2*k*oldsz+2*i,2) = i2;
228 new_elems(2*k*oldsz+2*i,3) = ig;
231 new_elems(2*k*oldsz+2*i+1,0) = i0+oldnbsom;
232 new_elems(2*k*oldsz+2*i+1,1) = i1+oldnbsom;
233 new_elems(2*k*oldsz+2*i+1,2) = i2+oldnbsom;
234 new_elems(2*k*oldsz+2*i+1,3) = ig;
249 for (
int i=0; i<nbfaces2D; i++)
251 for (
int ivois=0; ivois<2; ivois++)
253 int elem = les_faces.
voisin(i,ivois);
257 int i0=les_faces.
sommet(i,0);
258 int i1=les_faces.
sommet(i,1);
259 int i01=oldnbsom*(
NZ+1)+
NZ*oldsz+i;
261 for (
int k=0; k<
NZ; k++)
263 int ig=oldnbsom*(
NZ+1)+k*oldsz+elem;
265 int i00=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i0;
266 int i11=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i1;
270 new_elems(cpt,0) = i0;
271 new_elems(cpt,1) = i1;
272 new_elems(cpt,2) = i01;
273 new_elems(cpt++,3) = ig;
275 new_elems(cpt,0) = i0+oldnbsom;
276 new_elems(cpt,1) = i1+oldnbsom;
277 new_elems(cpt,2) = i01;
278 new_elems(cpt++,3) = ig;
280 new_elems(cpt,0) = i1;
281 new_elems(cpt,1) = i11;
282 new_elems(cpt,2) = i01;
283 new_elems(cpt++,3) = ig;
285 new_elems(cpt,0) = i11;
286 new_elems(cpt,1) = i1+oldnbsom;
287 new_elems(cpt,2) = i01;
288 new_elems(cpt++,3) = ig;
290 new_elems(cpt,0) = i0;
291 new_elems(cpt,1) = i00;
292 new_elems(cpt,2) = i01;
293 new_elems(cpt++,3) = ig;
295 new_elems(cpt,0) = i00;
296 new_elems(cpt,1) = i0+oldnbsom;
297 new_elems(cpt,2) = i01;
298 new_elems(cpt++,3) = ig;
310 les_elems.
ref(new_elems);
314 dom.
typer(
"Tetraedre");
321 Cerr <<
"It is not known yet how to extrude "
329void Extruder_en20::traiter_faces_dvt(Faces& les_faces_bord, Faces& les_faces,
int oldnbsom,
int oldsz,
int nbfaces2D )
331 int size_2D = les_faces_bord.
nb_faces();
333 IntTab les_sommets(6*size_2D*
NZ, 3);
335 for (
int i=0; i<size_2D; i++)
337 int i0=les_faces_bord.
sommet(i,0);
338 int i1=les_faces_bord.
sommet(i,1);
345 for (
int iface=0; iface<nbfaces2D; iface++)
347 int j0=les_faces.
sommet(iface,0);
348 int j1=les_faces.
sommet(iface,1);
350 if (((i0==j0) &&(i1==j1)) || ((i0==j1) &&(i1==j0)))
358 for (
int k=0; k<
NZ; k++)
362 int j01 = oldnbsom*(
NZ+1)+
NZ*oldsz+k*nbfaces2D+jface;
364 int i00=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i0;
365 int i11=oldnbsom*(
NZ+1)+
NZ*oldsz+
NZ*nbfaces2D+i1;
369 les_sommets(k*6*size_2D+6*i,0) = i0;
370 les_sommets(k*6*size_2D+6*i,1) = i1;
371 les_sommets(k*6*size_2D+6*i,2) = j01;
373 les_sommets(k*6*size_2D+6*i+1,0) = j01;
374 les_sommets(k*6*size_2D+6*i+1,1) = i1;
375 les_sommets(k*6*size_2D+6*i+1,2) = i11;
377 les_sommets(k*6*size_2D+6*i+2,0) = j01;
378 les_sommets(k*6*size_2D+6*i+2,1) = i11;
379 les_sommets(k*6*size_2D+6*i+2,2) = i1+oldnbsom;
381 les_sommets(k*6*size_2D+6*i+3,0) = j01;
382 les_sommets(k*6*size_2D+6*i+3,1) = i0+oldnbsom;
383 les_sommets(k*6*size_2D+6*i+3,2) = i1+oldnbsom;
385 les_sommets(k*6*size_2D+6*i+4,0) = j01;
386 les_sommets(k*6*size_2D+6*i+4,1) = i0+oldnbsom;
387 les_sommets(k*6*size_2D+6*i+4,2) = i00;
389 les_sommets(k*6*size_2D+6*i+5,0) = j01;
390 les_sommets(k*6*size_2D+6*i+5,1) = i00;
391 les_sommets(k*6*size_2D+6*i+5,2) = i0;
398 les_faces_bord.
typer(Type_Face::triangle_3D);
408 const int nbfaces2D = les_faces.
nb_faces();
413 Faces& les_faces_bord = itr.faces();
414 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
419 Faces& les_faces_bord = itr->faces();
420 traiter_faces_dvt(les_faces_bord, les_faces, oldnbsom, oldsz, nbfaces2D);
425 Faces& les_faces_dvt=devant.
faces();
426 les_faces_dvt.
typer(Type_Face::triangle_3D);
428 IntTab som_dvt(oldsz, 3);
432 Bord& derriere = dom.
faces_bord().add(Bord());
433 derriere.
nommer(
"derriere");
434 Faces& les_faces_der=derriere.
faces();
435 les_faces_der.
typer(Type_Face::triangle_3D);
437 IntTab som_der(oldsz, 3);
441 for (
int i=0; i<oldsz; i++)
443 int i0=les_elems(2*i,0);
444 int i1=les_elems(2*i,1);
445 int i2=les_elems(2*i,2);
451 som_der(i,0) = i0+oldnbsom*
NZ;
452 som_der(i,1) = i1+oldnbsom*
NZ;
453 som_der(i,2) = i2+oldnbsom*
NZ;
DoubleTab_t & les_sommets()
Raccords_t & faces_raccord()
void typer(const Nom &)
Sets the element type of the domain using the name passed as parameter.
int_t nb_som_tot() const
Returns the total number of vertices of the domain i.e. the number of real and virtual vertices on th...
int_t nb_som() const
Returns the number of vertices of the domain.
void ajouter(const DoubleTab_t &soms)
Adds nodes (or vertices) to the domain (without checking for duplicates).
Class defining operators and methods for all reading operation in an input flow (file,...
Extruder_en20 class — interpreter that reads and executes the Extruder_en20 directive:
virtual void extruder_dvt(Domaine &, Faces &, int, int)
Entree & interpreter_(Entree &) override
Main function of the Extruder_en20 interpreter. Extrudes the domain specified by the directive.
void extruder(Domaine &)
Extrudes all elements of a domain: transforms the geometric elements of the domain.
void typer(const Motcle &)
Sets the type of the faces.
void associer_domaine(const Domaine_t &z)
IntTab_t & voisins()
Returns the array of neighbors (of the faces).
int_t voisin(int_t, int) const
Returns the number of the i-th neighbor of face.
const IntTab_t & les_sommets() const
Returns the array of vertices of all faces.
int_t sommet(int_t, int) const
Returns the number of the j-th vertex of the i-th face.
void creer_faces_reeles(Domaine_t &domaine, const Static_Int_Lists_t &connect_som_elem, Faces_t &les_faces, IntTab_t &elem_faces)
From the description of the domain elements and boundaries (borders, connections, face groups,...
void nommer(const Nom &) override
Gives a name to the boundary.
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: a character string for naming TRUST objects.
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
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)
Exit routine for TRUST within a Kokkos region.
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)
Method used by interpreters that modify the domain (sequential), destroys the descriptors of vertices...
Base class for output streams.
virtual void ref(const TRUSTTab &)
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const