16#include <ExtrudeBord.h>
18#include <TroisDto2D.h>
19#include <Transformer.h>
22#include <Extruder_en3.h>
23#include <Extruder_en20.h>
26#include <TRUSTVects.h>
28Implemente_instanciable(
ExtrudeBord,
"ExtrudeBord",Interprete_geometrique_base);
50 Nom nom_dom_volumique;
51 Nom nom_front,nom_dom_surfacique;
52 DoubleVect vect_dir(3);
57 Cerr <<
"Interpreter "<<
que_suis_je()<<
" can be used only in 3 dimensions." <<finl;
77 param.
ajouter(
"sans_passer_par_le2D",&en3D_);
86 extruder_hexa_old(nom_front, nom_dom_surfacique, vect_dir, nbpas);
88 extruder_bord(nom_front, nom_dom_surfacique, vect_dir, nbpas);
90 Domaine& dom_surfacique=ref_cast(Domaine,
objet(nom_dom_surfacique));
95void ExtrudeBord::extruder_bord(
Nom& nom_front,
Nom& nom_dom_surfacique, DoubleVect& vect_dir,
int nbpas)
99 const Bord& front=dom.
bord(nom_front);
101 Domaine& dom_surfacique=ref_cast(Domaine,
objet(nom_dom_surfacique));
105 int& coupe=tD2dD.
coupe();
109 tD2dD.
extraire_2D(dom,dom_surfacique,front,nom_front,0);
111 double xa = tD2dD.
getXa();
112 double ya = tD2dD.
getYa();
113 double za = tD2dD.
getZa();
114 double Ix = tD2dD.
getIx();
115 double Iy = tD2dD.
getIy();
116 double Iz = tD2dD.
getIz();
117 double Jx = tD2dD.
getJx();
118 double Jy = tD2dD.
getJy();
119 double Jz = tD2dD.
getJz();
120 double Kx = tD2dD.
getKx();
121 double Ky = tD2dD.
getKy();
122 double Kz = tD2dD.
getKz();
146 extr3.
setDirection(vect_dir(0)*Ix+vect_dir(1)*Iy+vect_dir(2)*Iz,
147 vect_dir(0)*Jx+vect_dir(1)*Jy+vect_dir(2)*Jz,
148 vect_dir(0)*Kx+vect_dir(1)*Ky+vect_dir(2)*Kz);
154 if ((dom_surfacique.type_elem()->
que_suis_je())==
"Rectangle")
156 Cerr <<
"It is not possible to apply ExtrudeBord with 3Tetra option to : " << dom_surfacique.type_elem()->
que_suis_je() <<
" mesh cells" << finl;
160 else if (Vingt_Tetra)
164 extr.
setDirection(vect_dir(0)*Ix+vect_dir(1)*Iy+vect_dir(2)*Iz,
165 vect_dir(0)*Jx+vect_dir(1)*Jy+vect_dir(2)*Jz,
166 vect_dir(0)*Kx+vect_dir(1)*Ky+vect_dir(2)*Kz);
173 extr.
setDirection(vect_dir(0)*Ix+vect_dir(1)*Iy+vect_dir(2)*Iz,
174 vect_dir(0)*Jx+vect_dir(1)*Jy+vect_dir(2)*Jz,
175 vect_dir(0)*Kx+vect_dir(1)*Ky+vect_dir(2)*Kz);
187 les_fcts[0] = Nom(xa,
"%.16e")+Nom(
"+x*(")+Nom(Ix,
"%.16e")+Nom(
")+y*(")+Nom(Jx,
"%.16e")+Nom(
")+z*(")+Nom(Kx,
"%.16e")+Nom(
")");
188 les_fcts[1] = Nom(ya,
"%.16e")+Nom(
"+x*(")+Nom(Iy,
"%.16e")+Nom(
")+y*(")+Nom(Jy,
"%.16e")+Nom(
")+z*(")+Nom(Ky,
"%.16e")+Nom(
")");
189 les_fcts[2] = Nom(za,
"%.16e")+Nom(
"+x*(")+Nom(Iz,
"%.16e")+Nom(
")+y*(")+Nom(Jz,
"%.16e")+Nom(
")+z*(")+Nom(Kz,
"%.16e")+Nom(
")");
203 for (
int j=0; j<nb_faces; j++)
204 for (
int k=0; k<nb_som_faces; k++)
206 int som = faces.
sommet(j,k);
207 int som2 = faces2.
sommet(j,k);
208 int som3 = faces3.
sommet(j,k);
209 for (
int i=0; i<3; i++)
211 dom_surfacique.
coord(som2,i) = dom.
coord(som,i);
212 dom_surfacique.
coord(som3,i) = dom.
coord(som,i) + vect_dir(i);
215 Cerr <<
"ExtrudeBord does not create any more PERIO boundary." << finl;
216 Cerr <<
"Use RegroupeBord if you want to create periodic boundary condition..." << finl;
219void ExtrudeBord::extruder_hexa_old(
Nom& nom_front,
Nom& nom_dom_surfacique, DoubleVect& vect_dir,
int nbpas)
227 Domaine& dom_surfacique=ref_cast(Domaine,
objet(nom_dom_surfacique));
229 dom_surfacique.
typer(
"Hexaedre");
231 IntTab& les_elems2=dom_surfacique.
les_elems();
234 for (
int l=0; l<nbfr; l++)
237 const Nom& nomfr=fr.
le_nom();
243 IntTab newsom(4*nbfaces);
244 IntTab compt(4*nbfaces);
248 int nbsombord,trouve;
253 for (i=0; i<nbfaces; i++)
254 for (
int j=0; j<4; j++)
259 for (
int k=0; k<nbsombord+1; k++)
261 if(sommet==newsom(k))
271 newsom[nbsombord]=sommet;
276 newsom.resize(nbsombord);
277 compt.resize(nbsombord);
278 sommets2.
resize((nbpas+1)*nbsombord,3);
282 for (
int j=0; j<nbpas+1; j++)
283 for (i=0; i<nbsombord; i++)
285 sommets2(i+j*nbsombord,0)=dom.
coord(newsom(i),0)+j*vect_dir(0)/nbpas;
286 sommets2(i+j*nbsombord,1)=dom.
coord(newsom(i),1)+j*vect_dir(1)/nbpas;
287 sommets2(i+j*nbsombord,2)=dom.
coord(newsom(i),2)+j*vect_dir(2)/nbpas;
293 les_elems2.
resize(nbpas*nbfaces,8);
295 int sommet0,sommet1,sommet2,sommet3;
296 int newsom0=-1,newsom1=-1,newsom2=-1,newsom3=-1;
298 for (i=0; i<nbfaces; i++)
306 for(
int j=0; j<nbsombord; j++)
308 if(newsom[j]==sommet0) newsom0=j;
309 if(newsom[j]==sommet1) newsom1=j;
310 if(newsom[j]==sommet2) newsom2=j;
311 if(newsom[j]==sommet3) newsom3=j;
314 for(
int k=0; k<nbpas; k++)
316 les_elems2(i+k*nbfaces,0)=newsom0+k*nbsombord;
317 les_elems2(i+k*nbfaces,1)=newsom1+k*nbsombord;
318 les_elems2(i+k*nbfaces,2)=newsom2+k*nbsombord;
319 les_elems2(i+k*nbfaces,3)=newsom3+k*nbsombord;
320 les_elems2(i+k*nbfaces,4)=newsom0+(k+1)*nbsombord;
321 les_elems2(i+k*nbfaces,5)=newsom1+(k+1)*nbsombord;
322 les_elems2(i+k*nbfaces,6)=newsom2+(k+1)*nbsombord;
323 les_elems2(i+k*nbfaces,7)=newsom3+(k+1)*nbsombord;
332 Bord& bordperio=dom_surfacique.
faces_bord().add(Bord());
333 bordperio.
nommer(
"PERIO");
336 IntTab faces_perio(2*nbfaces,4);
338 for (i=0; i<nbfaces; i++)
346 for(
int j=0; j<nbsombord; j++)
348 if(newsom[j]==sommet0) newsom0=j;
349 if(newsom[j]==sommet1) newsom1=j;
350 if(newsom[j]==sommet2) newsom2=j;
351 if(newsom[j]==sommet3) newsom3=j;
354 faces_perio(i,0)=newsom0;
355 faces_perio(i,1)=newsom1;
356 faces_perio(i,2)=newsom2;
357 faces_perio(i,3)=newsom3;
359 faces_perio(i+nbfaces,0)=newsom0+nbpas*nbsombord;
360 faces_perio(i+nbfaces,1)=newsom1+nbpas*nbsombord;
361 faces_perio(i+nbfaces,2)=newsom2+nbpas*nbsombord;
362 faces_perio(i+nbfaces,3)=newsom3+nbpas*nbsombord;
374 Bord& bordparoi=dom_surfacique.
faces_bord().add(Bord());
375 bordparoi.
nommer(
"PAROI");
380 int nbsombordparoi=0;
384 for (i=0; i<nbfaces; i++)
385 for (
int j=0; j<4; j++)
386 for (
int k=0; k<nbsombord; k++)
387 if(som(i,j)==newsom(k)) compt(k)++;
389 for (
int k=0; k<nbsombord; k++)
390 if(compt(k)<3) nbsombordparoi++;
400 IntTab faces_paroi(nbsombordparoi*nbpas,4);
403 for (i=0; i<nbfaces; i++)
410 int compt0=4,compt1=4,compt2=4,compt3=4;
412 for(
int j=0; j<nbsombord; j++)
414 if(newsom[j]==sommet0)
419 if(newsom[j]==sommet1)
424 if(newsom[j]==sommet2)
429 if(newsom[j]==sommet3)
437 if( (compt0<3) && (compt1<3) )
439 for(
int k=0; k<nbpas; k++)
441 faces_paroi(ip+k,0)=newsom0+k*nbsombord;
442 faces_paroi(ip+k,1)=newsom0+(k+1)*nbsombord;
443 faces_paroi(ip+k,2)=newsom1+k*nbsombord;
444 faces_paroi(ip+k,3)=newsom1+(k+1)*nbsombord;
450 if( (compt1<3) && (compt3<3) )
452 for(
int k=0; k<nbpas; k++)
454 faces_paroi(ip+k,0)=newsom1+k*nbsombord;
455 faces_paroi(ip+k,1)=newsom1+(k+1)*nbsombord;
456 faces_paroi(ip+k,2)=newsom3+k*nbsombord;
457 faces_paroi(ip+k,3)=newsom3+(k+1)*nbsombord;
463 if( (compt3<3) && (compt2<3) )
465 for(
int k=0; k<nbpas; k++)
467 faces_paroi(ip+k,0)=newsom3+k*nbsombord;
468 faces_paroi(ip+k,1)=newsom3+(k+1)*nbsombord;
469 faces_paroi(ip+k,2)=newsom2+k*nbsombord;
470 faces_paroi(ip+k,3)=newsom2+(k+1)*nbsombord;
476 if( (compt2<3) && (compt0<3) )
478 for(
int k=0; k<nbpas; k++)
480 faces_paroi(ip+k,0)=newsom2+k*nbsombord;
481 faces_paroi(ip+k,1)=newsom2+(k+1)*nbsombord;
482 faces_paroi(ip+k,2)=newsom0+k*nbsombord;
483 faces_paroi(ip+k,3)=newsom0+(k+1)*nbsombord;
493 Nom mfile=nom_dom_surfacique;
497 SFichier file(mfile);
498 file<<dom_surfacique;
502 EFichier file(mfile);
503 file>>dom_surfacique;
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
DoubleTab_t & les_sommets()
int rang_frontiere(const Nom &) const
const Frontiere_t & frontiere(int i) const
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
const DoubleTab_t & coord_sommets() const
double coord(int_t i, int j) const
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,...
Entree & interpreter_(Entree &) override
void setNbTranches(int n)
void setDirection(double lx, double ly, double lz)
void extruder(Domaine_t &)
Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles...
void setNbTranches(int n)
void setDirection(double lx, double ly, double lz)
void extruder(Domaine &)
Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles...
void setNbTranches(int n)
void setDirection(double lx, double ly, double lz)
void extruder(Domaine &, const IntVect &)
Extrusion d'un domaine surfacique.
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
int nb_som_faces() const
Renvoie le nombre de sommet par face.
void ajouter_faces(const IntTab_t &)
Ajoute une (ou plusieurs) face(s) a la frontiere, la (les) face(s) est (sont) specifiee(s) par un tab...
void nommer(const Nom &) override
Donne un nom a la frontiere.
void dimensionner(int_t i)
Dimensionne la frontiere, i.e. fixe son nombre de faces.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
void typer_faces(const Motcle &)
Type les faces de la frontiere.
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
IntTab_t & les_sommets_des_faces()
Renvoie les sommets des faces de la frontiere.
const Faces_t & faces() const
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
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_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
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...
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
void extraire_2D(const Domaine_t &, Domaine_t &, const Bord_t &, const Nom &, int)