TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Extruder.cpp
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Frontiere.h>
17#include <Connectivite_som_elem.h>
18#include <Static_Int_Lists.h>
19#include <Faces_builder.h>
20#include <Extruder.h>
21#include <Domaine.h>
22#include <Scatter.h>
23#include <Param.h>
24
25Implemente_instanciable_sans_constructeur_32_64(Extruder_32_64, "Extruder", Interprete_geometrique_base_32_64<_T_>);
26// XD extruder interprete extruder BRACE Class to create a 3D tetrahedral/hexahedral mesh (a prism is cut in 14) from a
27// XD_CONT 2D triangular/quadrangular mesh.
28
29template <typename _SIZE_>
30Extruder_32_64<_SIZE_>::Extruder_32_64() { direction.resize(3, RESIZE_OPTIONS::NOCOPY_NOINIT); }
31
32template <typename _SIZE_>
34
35template <typename _SIZE_>
37
38/*! @brief Fonction principale de l'interprete Extruder Triangule 1 a 1 toutes les domaines du domaine
39 *
40 * specifie par la directive.
41 * On triangule le domaine grace a la methode:
42 * void Extruder_32_64<_SIZE_>::extruder(Domaine_t& domaine) const
43 * Extruder signifie ici transformer en triangle des
44 * elements geometrique d'un domaine.
45 *
46 * @param (Entree& is) un flot d'entree
47 * @return (Entree&) le flot d'entree
48 * @throws l'objet a mailler n'est pas du type Domaine
49 */
50template <typename _SIZE_>
52{
53 Nom nom_dom;
54 Param param(this->que_suis_je());
55 param.ajouter("domaine",&nom_dom,Param::REQUIRED); // XD attr domaine ref_domaine domain_name REQ Name of the domain.
56 param.ajouter("nb_tranches",&NZ,Param::REQUIRED); // XD attr nb_tranches entier nb_tranches REQ Number of elements
57 // XD_CONT in the extrusion direction.
58 param.ajouter_arr_size_predefinie("direction",&direction,Param::REQUIRED); // XD attr direction troisf direction REQ
59 // XD_CONT Direction of the extrude operation.
61 this->associer_domaine(nom_dom);
63 extruder(this->domaine());
65 return is;
66}
67
68inline void check_boundary_name(const Nom& name)
69{
70// On verifie que le bord ne se nomme pas deja devant ou derriere
71 if (name=="devant" || name=="derriere")
72 {
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;
77 }
78}
79/*! @brief Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles.
80 *
81 * Pour l'instant on ne sait raffiner que des Rectangles
82 * (on les coupe en 4).
83 *
84 * @param (Domaine_t& domaine) le domaine dont on veut raffiner les elements
85 */
86template <typename _SIZE_>
88{
89
90
91 if(dom.type_elem()->que_suis_je() == "Rectangle" || dom.type_elem()->que_suis_je() == "Quadrangle"
92 || dom.type_elem()->que_suis_je() == "Rectangle_64" || dom.type_elem()->que_suis_je() == "Quadrangle_64" )
93 {
94 extruder_hexa(dom);
95 }
96 else if( dom.type_elem()->que_suis_je() == "Triangle" || dom.type_elem()->que_suis_je() == "Triangle_64")
97 {
98 int_t oldnbsom = dom.nb_som();
99 IntTab_t& les_elems=dom.les_elems();
100 int_t oldsz=les_elems.dimension(0);
101 double dx = direction[0]/NZ;
102 double dy = direction[1]/NZ;
103 double dz = direction[2]/NZ;
104
105 Faces_t les_faces;
106 //domaine.creer_faces(les_faces);
107 {
108 // bloc a factoriser avec Domaine_VF.cpp :
109 Type_Face type_face = dom.type_elem()->type_face(0);
110 les_faces.typer(type_face);
111 les_faces.associer_domaine(dom);
112
113 Static_Int_Lists_t connectivite_som_elem;
114 const int_t nb_sommets_tot = dom.nb_som_tot();
115 const IntTab_t& elements = dom.les_elems();
116
117 construire_connectivite_som_elem(nb_sommets_tot,
118 elements,
119 connectivite_som_elem,
120 1 /* include virtual elements */);
121
122 Faces_builder_t faces_builder;
123 IntTab_t elem_faces; // Tableau dont on aura pas besoin
124 faces_builder.creer_faces_reeles(dom,
125 connectivite_som_elem,
126 les_faces,
127 elem_faces);
128 }
129 const int_t nbfaces2D = les_faces.nb_faces();
130
131
132 int_t newnbsom = (oldnbsom*(NZ+1)+NZ*oldsz+nbfaces2D*NZ);
133 DoubleTab_t new_soms(newnbsom, 3);
134 DoubleTab_t& coord_sommets=dom.les_sommets();
136
137
138 // les sommets du maillage 2D sont translates en premier
139 for (int i=0; i<oldnbsom; i++)
140 {
141 double x = coord_sommets(i,0);
142 double y = coord_sommets(i,1);
143 double z=0.;
144 if (coord_sommets.dimension(1)>2)
145 z=coord_sommets(i,2);
146
147 for (int k=0; k<=NZ; k++)
148 {
149 new_soms(k*oldnbsom+i,0)=x;
150 new_soms(k*oldnbsom+i,1)=y;
151 new_soms(k*oldnbsom+i,2)=z;
152
153 x += dx;
154 y += dy;
155 z += dz;
156 }
157 }
158
159
160 // puis on cree les centres de gravite des elements 2D puis translation de ces points
161 for (int_t i=0; i<oldsz; i++)
162 {
163 int_t i0=les_elems(i,0);
164 int_t i1=les_elems(i,1);
165 int_t i2=les_elems(i,2);
166
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;
169 double z = 0.5*dz;
170 if (coord_sommets.dimension(1)>2)
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++)
173 {
174
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;
178
179 xg += dx;
180 yg += dy;
181 z += dz;
182 }
183 }
184
185
186 // enfin, on cree les centres des faces du maillage 2D puis translation de ces points
187 for (int i=0; i<nbfaces2D; i++)
188 {
189 int_t i0=les_faces.sommet(i,0);
190 int_t i1=les_faces.sommet(i,1);
191
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;
194 double z = 0.5*dz;
195 if (coord_sommets.dimension(1)>2)
196 z = 0.5*(coord_sommets(i0,2)+coord_sommets(i1,2))+0.5*dz;
197
198 for (int k=0; k<NZ; k++)
199 {
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;
203 x01 += dx;
204 y01 += dy;
205 z += dz;
206 }
207 }
208
209
210 coord_sommets.resize(0);
211 dom.ajouter(new_soms);
212
213 int_t newnbelem = 14*NZ*oldsz;
214 IntTab_t new_elems(newnbelem, 4); // les nouveaux elements
215 int_t cpt=0;
216
217
218 // en premier, on stocke les tetra du haut et du bas : NZ*nb_triangle*2 tetra
219 for (int_t i=0; i<oldsz; i++)
220 {
221 int_t i0=les_elems(i,0);
222 int_t i1=les_elems(i,1);
223 int_t i2=les_elems(i,2);
224
225 int_t ig=oldnbsom*(NZ+1)+i;
226
227 for (int k=0; k<NZ; k++)
228 {
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;
233 cpt++;
234
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;
239 cpt++;
240
241 this->mettre_a_jour_sous_domaine(dom,i,(2*k*oldsz+2*i),2);
242
243 i0+=oldnbsom;
244 i1+=oldnbsom;
245 i2+=oldnbsom;
246 ig+=oldsz;
247 }
248 }
249
250
251
252 // puis les autres tetras
253 for (int_t i=0; i<nbfaces2D; i++)
254 {
255 for (int ivois=0; ivois<2; ivois++)
256 {
257 int_t elem = les_faces.voisin(i,ivois);
258
259 if (elem>=0)
260 {
261 int_t i0=les_faces.sommet(i,0);
262 int_t i1=les_faces.sommet(i,1);
263 int_t i01=oldnbsom*(NZ+1)+NZ*oldsz+i;
264
265 for (int_t k=0; k<NZ; k++)
266 {
267 int_t ig=oldnbsom*(NZ+1)+k*oldsz+elem;
268
269 new_elems(cpt,0) = i0;
270 new_elems(cpt,1) = i1;
271 new_elems(cpt,2) = i01;
272 new_elems(cpt++,3) = ig;
273
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;
278
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;
283
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;
288
289
290 i0+=oldnbsom;
291 i1+=oldnbsom;
292 i01+=nbfaces2D;
293 ig+=oldsz;
294 }
295 }
296 }
297 }
298
299 les_elems.ref(new_elems);
300
301 // Reconstruction de l'octree
302 dom.invalide_octree();
303 dom.typer("Tetraedre");
304
305 extruder_dvt(dom, les_faces,oldnbsom, oldsz);
306
307 }
308 else
309 {
310 Cerr << "It is not known yet how to extrude "
311 << dom.type_elem()->que_suis_je() <<"s"<<finl;
312 this->exit();
313 }
314}
315
316
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 )
319{
320 int_t size_2D = les_faces_bord.nb_faces();
321
322 IntTab_t les_sommets(4*size_2D*NZ, 3);
323
324 for (int_t i=0; i<size_2D; i++)
325 {
326 int_t i0=les_faces_bord.sommet(i,0);
327 int_t i1=les_faces_bord.sommet(i,1);
328
329 //double x01 = 0.5*(coord_sommets(i0,0)+coord_sommets(i1,0));
330 //double y01 = 0.5*(coord_sommets(i0,1)+coord_sommets(i1,1));
331
332 // on recherche le numero de cette face de bord: pas top!
333 int_t jface=-1;
334 for (int_t iface=0; iface<nbfaces2D; iface++)
335 {
336 int_t j0=les_faces.sommet(iface,0);
337 int_t j1=les_faces.sommet(iface,1);
338
339 if (((i0==j0) &&(i1==j1)) || ((i0==j1) &&(i1==j0)))
340 {
341 jface=iface;
342 break;
343 }
344 }
345 assert(jface>=0);
346
347 for (int_t k=0; k<NZ; k++)
348 {
349 //double z = (k+0.5)*dz;
350 //int i01 = domaine.chercher_sommets(x01, y01, z);
351 int_t j01 = oldnbsom*(NZ+1)+NZ*oldsz+k*nbfaces2D+jface;
352
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;
356
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;
360
361
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;
365
366
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;
370
371 i0+=oldnbsom;
372 i1+=oldnbsom;
373 }
374 }
375
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;
380}
381
382
383template <typename _SIZE_>
384void Extruder_32_64<_SIZE_>::extruder_dvt(Domaine_t& dom, Faces_t& les_faces, int_t oldnbsom, int_t oldsz)
385{
386
387 const int_t nbfaces2D = les_faces.nb_faces();
388 IntTab_t& les_elems=dom.les_elems();
389
390 for (auto &itr : dom.faces_bord())
391 {
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);
395 }
396
397 for (auto &itr : dom.faces_raccord())
398 {
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);
402 }
403
404 Bord_t& devant = dom.faces_bord().add(Bord_t());
405 devant.nommer("devant");
406 Faces_t& les_faces_dvt=devant.faces();
407 les_faces_dvt.typer(Type_Face::triangle_3D);
408
409 IntTab_t som_dvt(oldsz, 3);
410 les_faces_dvt.voisins().resize(oldsz, 2);
411 les_faces_dvt.voisins()=-1;
412
413 Bord_t& derriere = dom.faces_bord().add(Bord_t());
414 derriere.nommer("derriere");
415 Faces_t& les_faces_der=derriere.faces();
416 les_faces_der.typer(Type_Face::triangle_3D);
417
418 IntTab_t som_der(oldsz, 3);
419 les_faces_der.voisins().resize(oldsz, 2);
420 les_faces_der.voisins()=-1;
421
422 for (int_t i=0; i<oldsz; i++)
423 {
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);
427
428 som_dvt(i,0) = i0;
429 som_dvt(i,1) = i1;
430 som_dvt(i,2) = i2;
431
432 som_der(i,0) = i0+oldnbsom*NZ;
433 som_der(i,1) = i1+oldnbsom*NZ;
434 som_der(i,2) = i2+oldnbsom*NZ;
435
436 }
437
438
439 les_faces_dvt.les_sommets().ref(som_dvt);
440 les_faces_der.les_sommets().ref(som_der);
441
442}
443template <typename _SIZE_>
445{
446
447 int_t oldnbsom = dom.nb_som();
448 IntTab_t& les_elems=dom.les_elems();
449 int_t oldsz=les_elems.dimension(0);
450 double dx = direction[0]/NZ;
451 double dy = direction[1]/NZ;
452 double dz = direction[2]/NZ;
453
454 Faces_t les_faces;
455 {
456 // bloc a factoriser avec Domaine_VF.cpp :
457 Type_Face type_face = dom.type_elem()->type_face(0);
458 les_faces.typer(type_face);
459 les_faces.associer_domaine(dom);
460
461 Static_Int_Lists_t connectivite_som_elem;
462 const int_t nb_sommets_tot = dom.nb_som_tot();
463 const IntTab_t& elements = dom.les_elems();
464
465 construire_connectivite_som_elem(nb_sommets_tot,
466 elements,
467 connectivite_som_elem,
468 1 /* include virtual elements */);
469
470 Faces_builder_t faces_builder;
471 IntTab_t elem_faces; // Tableau dont on aura pas besoin
472 faces_builder.creer_faces_reeles(dom,
473 connectivite_som_elem,
474 les_faces,
475 elem_faces);
476 }
477
478 int_t newnbsom = oldnbsom*(NZ+1);
479 DoubleTab_t new_soms(newnbsom, 3);
480 DoubleTab_t& coord_sommets=dom.les_sommets();
482
483 int_t i;
484 // les sommets du maillage 2D sont translates
485 for (i=0; i<oldnbsom; i++)
486 {
487 double x = coord_sommets(i,0);
488 double y = coord_sommets(i,1);
489 double z=0.;
490 if (coord_sommets.dimension(1)>2)
491 z=coord_sommets(i,2);
492 for (int k=0; k<=NZ; k++)
493 {
494 new_soms(k*oldnbsom+i,0)=x;
495 new_soms(k*oldnbsom+i,1)=y;
496 new_soms(k*oldnbsom+i,2)=z;
497
498 x += dx;
499 y += dy;
500 z += dz;
501 }
502 }
503
504
505 coord_sommets.resize(0);
506 dom.ajouter(new_soms);
507
508 int_t newnbelem = NZ*oldsz;
509 IntTab_t new_elems(newnbelem, 8); // les nouveaux elements
510
511
512 // definition des nouveaux hexas
513 for (i=0; i<oldsz; i++)
514 {
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);
519
520
521 for (int_t k=0; k<NZ; k++)
522 {
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;
531
532
533 i0+=oldnbsom;
534 i1+=oldnbsom;
535 i2+=oldnbsom;
536 i3+=oldnbsom;
537 }
538 }
539
540 les_elems.ref(new_elems);
541
542 // Reconstruction de l'octree
543 dom.invalide_octree();
544 if ((dom.type_elem()->que_suis_je()) == "Quadrangle")
545 dom.typer("Hexaedre_VEF");
546 else
547 dom.typer("Hexaedre");
548
549 extruder_dvt_hexa(dom, les_faces,oldnbsom, oldsz);
550}
551template <typename _SIZE_>
552void Extruder_32_64<_SIZE_>::traiter_faces_dvt_hexa(Faces_t& les_faces_bord, int_t oldnbsom)
553{
554 int_t size_2D = les_faces_bord.nb_faces();
555
556 IntTab_t les_sommets(size_2D*NZ, 4);
557
558 for (int_t i=0; i<size_2D; i++)
559 {
560 int_t i0=les_faces_bord.sommet(i,0);
561 int_t i1=les_faces_bord.sommet(i,1);
562
563
564 for (int_t k=0; k<NZ; k++)
565 {
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;
570
571 i0+=oldnbsom;
572 i1+=oldnbsom;
573 }
574 }
575
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;
580}
581template <typename _SIZE_>
583{
584
585 IntTab_t& les_elems=dom.les_elems();
586
587 for (auto &itr : dom.faces_bord())
588 {
589 check_boundary_name(itr.le_nom());
590 Faces_t& les_faces_bord = itr.faces();
591 traiter_faces_dvt_hexa(les_faces_bord, oldnbsom);
592 }
593
594 for (auto &itr : dom.faces_raccord())
595 {
596 check_boundary_name(itr->le_nom());
597 Frontiere_32_64<_SIZE_>& f = dynamic_cast<Frontiere_32_64<_SIZE_>&>(itr);
598 Faces_t& les_faces_bord = f.faces();
599 traiter_faces_dvt_hexa(les_faces_bord, oldnbsom);
600 }
601
602 Bord_t& devant = dom.faces_bord().add(Bord_t());
603 devant.nommer("devant");
604 Faces_t& les_faces_dvt=devant.faces();
605 les_faces_dvt.typer(Type_Face::quadrangle_3D);
606
607 IntTab_t som_dvt(oldsz, 4);
608 les_faces_dvt.voisins().resize(oldsz, 2);
609 les_faces_dvt.voisins()=-1;
610
611 Bord_t& derriere = dom.faces_bord().add(Bord_t());
612 derriere.nommer("derriere");
613 Faces_t& les_faces_der=derriere.faces();
614 les_faces_der.typer(Type_Face::quadrangle_3D);
615
616 IntTab_t som_der(oldsz, 4);
617 les_faces_der.voisins().resize(oldsz, 2);
618 les_faces_der.voisins()=-1;
619
620 for (int_t i=0; i<oldsz; i++)
621 {
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);
626
627 som_dvt(i,0) = i0;
628 som_dvt(i,1) = i1;
629 som_dvt(i,2) = i2;
630 som_dvt(i,3) = i3;
631
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;
636
637 }
638
639
640 les_faces_dvt.les_sommets().ref(som_dvt);
641 les_faces_der.les_sommets().ref(som_der);
642
643}
644
645template class Extruder_32_64<int>;
646#if INT_is_64_ == 2
647template class Extruder_32_64<trustIdType>;
648#endif
DoubleTab_t & les_sommets()
Definition Domaine.h:113
Bords_t & faces_bord()
Definition Domaine.h:198
Raccords_t & faces_raccord()
Definition Domaine.h:253
IntTab_t & les_elems()
Definition Domaine.h:129
void invalide_octree()
Definition Domaine.cpp:810
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
Definition Domaine.h:457
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...
Definition Domaine.h:123
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
Definition Domaine.h:121
void ajouter(const DoubleTab_t &soms)
Ajoute des noeuds (ou sommets) au domaine (sans verifier les doublons).
Definition Domaine.cpp:909
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Classe Extruder Cette classe est un interprete qui sert a lire et executer.
Definition Extruder.h:38
DoubleTab_T< _SIZE_ > DoubleTab_t
Definition Extruder.h:47
Faces_builder_32_64< _SIZE_ > Faces_builder_t
Definition Extruder.h:48
Faces_32_64< _SIZE_ > Faces_t
Definition Extruder.h:44
ArrOfDouble direction
Definition Extruder.h:70
Bord_32_64< _SIZE_ > Bord_t
Definition Extruder.h:45
IntTab_T< _SIZE_ > IntTab_t
Definition Extruder.h:46
Static_Int_Lists_32_64< _SIZE_ > Static_Int_Lists_t
Definition Extruder.h:49
Domaine_32_64< _SIZE_ > Domaine_t
Definition Extruder.h:43
Entree & interpreter_(Entree &) override
Fonction principale de l'interprete Extruder Triangule 1 a 1 toutes les domaines du domaine.
Definition Extruder.cpp:51
virtual void extruder_dvt_hexa(Domaine_t &, Faces_t &, int_t, int_t)
Definition Extruder.cpp:582
virtual void extruder_dvt(Domaine_t &, Faces_t &, int_t, int_t)
Definition Extruder.cpp:384
void extruder(Domaine_t &)
Triangule tous les element d'un domaine: transforme les elements goemetriques du domaine en triangles...
Definition Extruder.cpp:87
_SIZE_ int_t
Definition Extruder.h:42
void extruder_hexa(Domaine_t &)
Definition Extruder.cpp:444
void typer(const Motcle &)
Type les faces.
Definition Faces.cpp:390
void associer_domaine(const Domaine_t &z)
Definition Faces.h:94
IntTab_t & voisins()
Renvoie le tableau des voisins (des faces).
Definition Faces.h:89
int_t nb_faces() const
Definition Faces.h:66
int_t voisin(int_t, int) const
Renvoie le numero du i-ieme voisin de face.
Definition Faces.h:165
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
Definition Faces.h:74
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
Definition Faces.h:130
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,...
Classe Frontiere.
Definition Frontiere.h:32
void nommer(const Nom &) override
Donne un nom a la frontiere.
Definition Frontiere.cpp:74
const Faces_t & faces() const
Definition Frontiere.h:54
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
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
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.
Definition Param.cpp:411
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
Definition Param.cpp:32
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
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...
Definition Scatter.cpp:2742
static void uninit_sequential_domain(Domaine_32_64< _SIZE_ > &dom)
methode utilisee par les interpretes qui modifient le domaine (sequentiel), detruit les descripteurs ...
Definition Scatter.cpp:2757
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual void ref(const TRUSTTab &)
Definition TRUSTTab.tpp:308
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133