TrioCFD 1.9.9_beta
TrioCFD documentation
Loading...
Searching...
No Matches
Op_Conv_AmontNew_VEF_Face.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 <Op_Conv_AmontNew_VEF_Face.h>
17#include <Neumann_sortie_libre.h>
18#include <Hexaedre_VEF.h>
19#include <Milieu_base.h>
20#include <Periodique.h>
21
22Implemente_base(Op_Conv_AmontNew_VEF_Face,"Op_Conv_AmontNew_VEF_P1NC",Op_Conv_VEF_base);
23
25{
26 return s << que_suis_je() ;
27}
28
30{
31 return s ;
32}
33
34//// convbis corresponds to the calculation of -1*convection_term
35//
36static inline void convbis(const double psc,const int num1,const int num2,
37 double T1, double T2 , int comp, int ncomp,
38 DoubleTab& resu, DoubleVect& fluent)
39{
40 int amont;
41 double flux;
42
43 if (psc >= 0)
44 {
45 amont = num1;
46 if(comp==0)
47 fluent[num2] += psc;
48 }
49 else
50 {
51 amont = num2;
52 if(comp==0)
53 fluent[num1] -= psc;
54 }
55
56 if(amont==num1)
57 flux = T1*psc;
58 else
59 flux = T2*psc;
60 if(ncomp>1)
61 {
62 resu(num1,comp) -= flux;
63 resu(num2,comp) += flux;
64 }
65 else
66 {
67 resu(num1) -= flux;
68 resu(num2) += flux;
69 }
70}
71
72DoubleTab& Op_Conv_AmontNew_VEF_Face::ajouter(const DoubleTab& transporte, DoubleTab& resu) const
73{
74 const Domaine_Cl_VEF& domaine_Cl_VEF = la_zcl_vef.valeur();
75 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
76 const Champ_Inc_base& la_vitesse=vitesse_.valeur();
77 const IntTab& elem_faces=domaine_VEF.elem_faces();
78 const IntTab& face_voisins = domaine_VEF.face_voisins();
79 const DoubleTab& face_normales = domaine_VEF.face_normales();
80 const auto& facette_normales = domaine_VEF.facette_normales();
81 const DoubleVect& porosite_face = equation().milieu().porosite_face();
82 const Domaine& domaine = domaine_VEF.domaine();
83 const Elem_VEF_base& type_elem=domaine_VEF.type_elem();
84 const int nfa7 = type_elem.nb_facette();
85 int nb_faces_tot=domaine_VEF.nb_faces_tot();
86 int nb_elem_tot = domaine_VEF.nb_elem_tot();
87 const DoubleVect& volumes=domaine_VEF.volumes();
88 const IntVect& rang_elem_non_std = domaine_VEF.rang_elem_non_std();
89 const DoubleTab& normales_facettes_Cl = domaine_Cl_VEF.normales_facettes_Cl();
90 int ncomp_ch_transporte;
91
92 if (transporte.nb_dim() == 1)
93 ncomp_ch_transporte=1;
94 else
95 ncomp_ch_transporte= transporte.dimension(1);
96
97 DoubleTab TbarK(nb_elem_tot, ncomp_ch_transporte);
98 DoubleTab Ttilde1(nb_faces_tot, ncomp_ch_transporte);
99 DoubleTab Ttilde2(nb_faces_tot, ncomp_ch_transporte);
100 int f, j=0;
101 //
102 // compute Ttilde:
103 //
104 for(f=0; f<nb_faces_tot; f++)
105 {
106 int elem=face_voisins(f,0);
107 if(ncomp_ch_transporte>1)
108 for(j=0; j<ncomp_ch_transporte; j++)
109 TbarK(elem, j)+=transporte(f, j);
110 else
111 TbarK(elem, 0)+=transporte(f);
112 elem=face_voisins(f,1);
113 if(elem>-1)
114 {
115 if(ncomp_ch_transporte>1)
116 for(j=0; j<ncomp_ch_transporte; j++)
117 TbarK(elem, j)+=transporte(f, j);
118 else
119 TbarK(elem, 0)+=transporte(f);
120 }
121 }
122 double x=1./(dimension+1);
123 for(f=0; f<nb_faces_tot; f++)
124 {
125 int elem=face_voisins(f,0);
126 if(ncomp_ch_transporte>1)
127 for(j=0; j<ncomp_ch_transporte; j++)
128 Ttilde1(f, j)=x*(TbarK(elem, j)-transporte(f, j));
129 else
130 Ttilde1(f, j)=x*(TbarK(elem, j)-transporte(f));
131 elem=face_voisins(f,1);
132 if(elem>-1)
133 if(ncomp_ch_transporte>1)
134 for(j=0; j<ncomp_ch_transporte; j++)
135 Ttilde2(f, j)+=x*(TbarK(elem, j)-transporte(f, j));
136 else
137 Ttilde2(f, j)+=x*(TbarK(elem, j)-transporte(f));
138 else if(ncomp_ch_transporte>1)
139 Ttilde2(f, j)=transporte(f, j);
140 else
141 Ttilde2(f, j)=transporte(f);
142 }
143 // Recreate shocks ...
144 for(f=0; f<nb_faces_tot; f++)
145 {
146 int elem2=face_voisins(f,1);
147 if(elem2>-1)
148 {
149 int elem1=face_voisins(f,0);
150 double alpha=volumes(elem1)/(volumes(elem1)+volumes(elem2));
151 for(j=0; j<ncomp_ch_transporte; j++)
152 {
153 double epsilon;
154 double Tfj;
155 {
156 if(ncomp_ch_transporte>1)
157 Tfj=transporte(f, j);
158 else
159 Tfj=transporte(f);
160 if( ( (Tfj<Ttilde1(f, j)) &&
161 (Tfj<Ttilde2(f, j)) ) ||
162 ( (Tfj>Ttilde1(f, j)) &&
163 (Tfj>Ttilde2(f, j)) ) )
164 {
165 Ttilde1(f, j)=Ttilde2(f, j)=Tfj;
166 }
167 else
168 {
169 if(Ttilde1(f, j)<Ttilde2(f, j))
170 {
171 epsilon=(Tfj-alpha*Ttilde1(f, j)+
172 (1-alpha)*Ttilde2(f, j))/alpha;
173 Ttilde2(f, j)-=epsilon;
174 Ttilde1(f, j)=(Tfj-(1-alpha)*Ttilde2(f, j))
175 /alpha;
176 }
177 else
178 {
179 epsilon=(Tfj-(1-alpha)*Ttilde2(f, j)+
180 alpha*Ttilde1(f, j))/(1-alpha);
181 Ttilde1(f, j)-=epsilon;
182 Ttilde2(f, j)=(Tfj-alpha*Ttilde1(f, j))
183 /(1-alpha);
184 }
185 Cerr << "!!" << finl;
186 }
187 }
188 }
189 }
190 else if(ncomp_ch_transporte>1)
191 for(j=0; j<ncomp_ch_transporte; j++)
192 Ttilde1(f, j)=Ttilde2(f, j)=transporte(f, j);
193 else
194 Ttilde1(f, 0)=Ttilde2(f, 0)=transporte(f);
195
196 }
197 // no slope inversion:
198
199 for(int elem=0; elem<nb_elem_tot; elem++)
200 {
201 for(int f1=0; f1<dimension; f1++)
202 {
203 int face1=elem_faces(elem,f1);
204 int i1=0;
205 if(face_voisins(face1,0)!=elem)
206 i1=1;
207 for(int f2=f1; f2<dimension+1; f2++)
208 {
209 int face2=elem_faces(elem,f2);
210 int i2=0;
211 if(face_voisins(face2,0)!=elem)
212 i2=1;
213 for(j=0; j<ncomp_ch_transporte; j++)
214 {
215 double Tfj1;
216 if(ncomp_ch_transporte>1)
217 Tfj1=transporte(face1, j);
218 else
219 Tfj1=transporte(face1);
220 double Tfj2;
221 if(ncomp_ch_transporte>1)
222 Tfj2=transporte(face2, j);
223 else
224 Tfj2=transporte(face2);
225 double T1=Ttilde1(face1, j);
226 if (i1==1)
227 T1=Ttilde2(face1, j);
228 double T2=Ttilde1(face2, j);
229 if (i2==1)
230 T2=Ttilde2(face2, j);
231 //double Tbar=0.5*(Tfj1+Tfj2);
232 if((T1-T2)*(Tfj1-Tfj2)<1.e-12)
233 {
234 if (i1==0)
235 Ttilde1(face1, j)=Tfj1;
236 else
237 Ttilde2(face1, j)=Tfj1;
238 if (i2==0)
239 Ttilde1(face2, j)=Tfj2;
240 else
241 Ttilde2(face2, j)=Tfj2;
242 }
243 }
244 }
245 }
246 }
247 // compute fluxes ...
248 int nfac = domaine.nb_faces_elem();
249 int nsom = domaine.nb_som_elem();
250 int nb_som_facette = domaine.type_elem()->nb_som_face();
251 const Elem_geom_base& elem_geom = domaine.type_elem().valeur();
252 if ( sub_type(Hexaedre_VEF,elem_geom))
253 {
255 }
256 const Elem_VEF_base& type_elemvef= domaine_VEF.type_elem();
257 int istetra=0;
258 Nom nom_elem=type_elemvef.que_suis_je();
259 if ((nom_elem=="Tetra_VEF")||(nom_elem=="Tri_VEF"))
260 istetra=1;
261 double psc;
262 int poly,face_adj,fa7,i,n_bord;
263 int num_face, rang ,itypcl;
264 int num10,num20,num_som;
265
266 if (transporte.nb_dim() == 1)
267 ncomp_ch_transporte=1;
268 else
269 ncomp_ch_transporte= transporte.dimension(1);
270
271 IntVect face(nfac);
272 DoubleVect vs(dimension);
273 DoubleVect vc(dimension);
274 DoubleTab vsom(nsom,dimension);
275 DoubleVect cc(dimension);
276
277
278 // Reset the array used for stability time step computation
279 fluent_ = 0;
280
281 // Special treatment for periodic faces
282
283 int nb_faces_perio = 0;
284 // Loop to count the number of periodic faces
285 for (n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
286 {
287 const Cond_lim& la_cl = domaine_Cl_VEF.les_conditions_limites(n_bord);
288 if (sub_type(Periodique,la_cl.valeur()))
289 {
290 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
291 nb_faces_perio += le_bord.nb_faces();
292 }
293 }
294
295 DoubleTab tab;
296 if (ncomp_ch_transporte == 1)
297 tab.resize(nb_faces_perio);
298 else
299 tab.resize(nb_faces_perio,ncomp_ch_transporte);
300
301 // Loop to fill tab
302 nb_faces_perio=0;
303 for (n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
304 {
305 const Cond_lim& la_cl = domaine_Cl_VEF.les_conditions_limites(n_bord);
306 if (sub_type(Periodique,la_cl.valeur()))
307 {
308 // const Periodique& la_cl_perio = (Periodique&) la_cl.valeur();
309 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
310 int num1 = le_bord.num_premiere_face();
311 int num2 = num1 + le_bord.nb_faces();
312 for (num_face=num1; num_face<num2; num_face++)
313 {
314 if (ncomp_ch_transporte == 1)
315 tab(nb_faces_perio) = resu(num_face);
316 else
317 for (int comp=0; comp<ncomp_ch_transporte; comp++)
318 tab(nb_faces_perio,comp) = resu(num_face,comp);
319 nb_faces_perio++;
320 }
321 }
322 }
323
324 IntVect compteur(nsom);
325 compteur = 0;
326 vsom=0.;
327
328 // Non-standard polyhedra are grouped in 2 categories in Domaine_VEF:
329 // - boundary and joint polyhedra
330 // - boundary and non-joint polyhedra
331 // Process polyhedra following the order in which they appear
332 // in the domain
333
334 // loop over polyhedra
335
336 for (poly=0; poly<nb_elem_tot; poly++)
337 {
338
339 rang = rang_elem_non_std(poly);
340 if (rang==-1)
341 itypcl=0;
342 else
343 itypcl=domaine_Cl_VEF.type_elem_Cl(rang);
344
345 // compute face indices of the polyhedron
346 for (face_adj=0; face_adj<nfac; face_adj++)
347 face[face_adj]= elem_faces(poly,face_adj);
348 // keep this part
349 for (j=0; j<dimension; j++)
350 {
351 vs[j] = la_vitesse.valeurs()(face[0],j)*porosite_face(face[0]);
352 for (i=1; i<nfac; i++)
353 vs[j]+= la_vitesse.valeurs()(face[i],j)*porosite_face(face[i]);
354 }
355
356 // compute velocity at the vertices of the polyhedra
357
358 //int ncomp;
359 if (istetra==1)
360 {
361 for (j=0; j<nsom; j++)
362 {
363 for (int ncomp=0; ncomp<Objet_U::dimension; ncomp++)
364 vsom(j,ncomp) =vs[ncomp] - Objet_U::dimension*la_vitesse.valeurs()(face[j],ncomp)*porosite_face(face[j]);
365 }
366 }
367 else
368 {
369 // to make this valid for hexahedral elements
370 // Use the shape functions implemented in the class Champs_P1_impl or Champs_Q1_impl
371 int ncomp;
372 for (j=0; j<nsom; j++)
373 {
374 num_som = domaine.sommet_elem(poly,j);
375 for (ncomp=0; ncomp<dimension; ncomp++)
376 {
377 vsom(j,ncomp) = la_vitesse.valeur_a_sommet_compo(num_som,poly,ncomp);
378 }
379 }
380 }
381 // compute vc
382 domaine_VEF.type_elem().calcul_vc(face,vc,vs,vsom,vitesse(), itypcl,porosite_face);
383
384 //for (j=0; j<dimension; j++) vc(j) = vs(j)/nfac ;
385 type_elem.calcul_vc(face,vc,vs,vsom,vitesse(),
386 itypcl,porosite_face);
387
388 // Loop over facets of the polyhedron
389
390 for (fa7=0; fa7<nfa7; fa7++)
391 {
392 if (rang==-1)
393 for (i=0; i<dimension; i++)
394 cc[i] = facette_normales(poly,fa7,i);
395 else
396 for (i=0; i<dimension; i++)
397 cc[i] = normales_facettes_Cl(rang,fa7,i);
398 // Apply the convection scheme to each vertex of the facet
399
400 // Process the vertex or vertices that are also vertices of the polyhedron
401
402 const IntTab& KEL=type_elem.KEL();
403 for (i=0; i<nb_som_facette-1; i++)
404 {
405 psc =0;
406 for (j=0; j<dimension; j++)
407 {
408 psc+= vsom(KEL(i+2,fa7),j)*cc[j];
409 }
410 type_elem.calcul_vc(face,vc,vs,vsom,vitesse(),itypcl,porosite_face);
411 // Loop over the facets of the polyhedron
412 psc /= nb_som_facette;
413 num10 = face[KEL(0,fa7)];
414 num20 = face[KEL(1,fa7)];
415 double T1, T2;
416 for(int comp=0; comp<ncomp_ch_transporte; comp++)
417 {
418 if(face_voisins(num10,0)==poly)
419 T1 = Ttilde1(num10, comp);
420 else
421 T1 = Ttilde2(num10, comp);
422 if(face_voisins(num20,0)==poly)
423 T2 = Ttilde1(num20, comp);
424 else
425 T2 = Ttilde2(num20, comp);
426 if( (transporte(num20)-transporte(num10)) * (T1-transporte(num10)) < 0)
427 convbis(psc,num10,num20,T1, T2, comp,
428 ncomp_ch_transporte,
429 resu,fluent_);
430 }
431 }
432 // Process the vertex coinciding with the center of gravity of the polyhedron
433 psc=0;
434 for (j=0; j<dimension; j++)
435 psc += vc[j]*cc[j];
436 psc /= nb_som_facette;
437 num10 = face[KEL(0,fa7)];
438 num20 = face[KEL(1,fa7)];
439
440 double T1, T2;
441 for(int comp=0; comp<ncomp_ch_transporte; comp++)
442 {
443 if(face_voisins(num10,0)==poly)
444 T1 = Ttilde1(num10, comp);
445 else
446 T1 = Ttilde2(num10, comp);
447 if(face_voisins(num20,0)==poly)
448 T2 = Ttilde1(num20, comp);
449 else
450 T2 = Ttilde2(num20, comp);
451 convbis(psc,num10,num20,T1, T2, comp,
452 ncomp_ch_transporte,
453 resu,fluent_);
454 }
455 }
456
457 } // end of loop
458
459 int voisine;
460 nb_faces_perio = 0;
461 double diff1,diff2;
462
463 // Size the array of convective fluxes at the domain boundary
464 DoubleTab& flux_b = flux_bords_;
465 flux_b.resize(domaine_VEF.nb_faces_bord(),ncomp_ch_transporte);
466 flux_b = 0.;
467
468 // Loop over boundary conditions
469 // a convection term is accounted for only for
470 // Neumann_sortie_libre boundary conditions
471
472 for (n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
473 {
474
475 const Cond_lim& la_cl = domaine_Cl_VEF.les_conditions_limites(n_bord);
476
477 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
478 {
479 const Neumann_sortie_libre& la_sortie_libre =
480 ref_cast(Neumann_sortie_libre, la_cl.valeur());
481 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
482 int num1 = le_bord.num_premiere_face();
483 int num2 = num1 + le_bord.nb_faces();
484 for (num_face=num1; num_face<num2; num_face++)
485 {
486 psc =0;
487 for (i=0; i<dimension; i++)
488 psc += la_vitesse.valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
489 if (psc>0)
490 if (ncomp_ch_transporte == 1)
491 {
492 resu(num_face) -= psc*transporte(num_face);
493 flux_b(num_face,0) -= psc*transporte(num_face);
494 }
495 else
496 for (i=0; i<ncomp_ch_transporte; i++)
497 {
498 resu(num_face,i) -= psc*transporte(num_face,i);
499 flux_b(num_face,i) -= psc*transporte(num_face,i);
500 }
501 else
502 {
503 if (ncomp_ch_transporte == 1)
504 {
505 resu(num_face) -= psc*la_sortie_libre.val_ext(num_face-num1);
506 flux_b(num_face,0) -= psc*la_sortie_libre.val_ext(num_face-num1);
507 }
508 else
509 for (i=0; i<ncomp_ch_transporte; i++)
510 {
511 resu(num_face,i) -= psc*la_sortie_libre.val_ext(num_face-num1,i);
512 flux_b(num_face,i) -= psc*la_sortie_libre.val_ext(num_face-num1,i);
513 }
514 fluent_[num_face] -= psc;
515 }
516 }
517 }
518 else if (sub_type(Periodique,la_cl.valeur()))
519 {
520 const Periodique& la_cl_perio = ref_cast(Periodique, la_cl.valeur());
521 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
522 int num1 = le_bord.num_premiere_face();
523 int num2 = num1 + le_bord.nb_faces();
524 IntVect fait(le_bord.nb_faces());
525 fait = 0;
526 for (num_face=num1; num_face<num2; num_face++)
527 {
528 if (fait[num_face-num1] == 0)
529 {
530 voisine = la_cl_perio.face_associee(num_face-num1) + num1;
531
532 if (ncomp_ch_transporte == 1)
533 {
534 diff1 = resu(num_face)-tab(nb_faces_perio);
535 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
536 resu(voisine) += diff1;
537 resu(num_face) += diff2;
538 flux_b(voisine,0) += diff1;
539 flux_b(num_face,0) += diff2;
540 }
541 else
542 for (int comp=0; comp<ncomp_ch_transporte; comp++)
543 {
544 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
545 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
546 resu(voisine,comp) += diff1;
547 resu(num_face,comp) += diff2;
548 flux_b(voisine,comp) += diff1;
549 flux_b(num_face,comp) += diff2;
550 }
551
552 fait[num_face-num1]= 1;
553 fait[voisine-num1] = 1;
554 }
555 nb_faces_perio++;
556 }
557 }
558 }
559 modifier_flux(*this);
560 return resu;
561}
Class Champ_Inc_base.
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual double valeur_a_sommet_compo(int, int, int) const
Returns the compo-th coordinate of the values at the element le_poly at the vertex sommet.
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
int type_elem_Cl(int i) const
DoubleTab & normales_facettes_Cl()
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_VEF
Definition Domaine_VEF.h:53
IntVect & rang_elem_non_std()
Definition Domaine_VEF.h:85
const Elem_VEF_base & type_elem() const
Definition Domaine_VEF.h:74
auto & facette_normales()
Definition Domaine_VEF.h:83
int nb_faces_tot() const
Returns the total number of faces.
Definition Domaine_VF.h:481
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double volumes(int i) const
Definition Domaine_VF.h:113
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
Definition Domaine_VF.h:542
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
Definition Domaine_VF.h:512
int nb_elem_tot() const
int nb_front_Cl() const
const Domaine & domaine() const
virtual void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int, const DoubleVect &) const =0
const IntTab & KEL() const
virtual int nb_facette() const =0
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Milieu_base & milieu() const =0
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
DoubleVect & porosite_face()
Definition Milieu_base.h:62
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
double val_ext(int i) const override
Returns the value of the i-th component of the field imposed on the exterior of the boundary.
class Nom: a character string for naming TRUST objects.
Definition Nom.h:31
static int dimension
Definition Objet_U.h:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
class Op_Conv_AmontNew_VEF_Face
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
class Op_Conv_VEF_base
const Champ_Inc_base & vitesse() const
void modifier_flux(const Operateur_base &) const
DoubleTab flux_bords_
class Periodique This class represents a periodic boundary condition.
Definition Periodique.h:31
int face_associee(int i) const
Definition Periodique.h:35
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
Base class for output streams.
Definition Sortie.h:52
int nb_dim() const
Definition TRUSTTab.h:199
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133