TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Op_Conv_EF.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 <Schema_Temps_base.h>
17#include <Op_Conv_EF.h>
18#include <Param.h>
19
20Implemente_instanciable_sans_constructeur(Op_Conv_EF,"Op_Conv_Generic_EF",Op_Conv_EF_base);
21
22Op_Conv_EF::Op_Conv_EF(): hourglass(0.),hourglass_impl_(0),btd_impl_(0),centre_impl_(0), hourglass_hors_conv_(0),btd_hors_conv_(0),f_lu_(-1.),calcul_dt_stab_(0) { }
23
24Implemente_instanciable_sans_constructeur(Op_Conv_BTD_EF,"Op_Conv_BTD_EF",Op_Conv_EF);
25Op_Conv_BTD_EF::Op_Conv_BTD_EF() : Op_Conv_EF()
26{
27 calcul_dt_stab_=2;
28 type_op = amont;
29 hourglass=1;
30 hourglass_impl_=1;
31 btd_impl_=1;
32 centre_impl_=1;
33 btd_hors_conv_=1;
34 hourglass_hors_conv_=1;
35}
37{
38 // pour ne pas mettre les flags automatiquement
40
41}
43{
44 return s << que_suis_je() ;
45}
47{
48 Param param(que_suis_je()); // XD convection_btd convection_deriv btd BRACE Only for EF discretization.
49 param.ajouter("btd",&btd_,Param::REQUIRED); // XD_ADD_P double
50 // XD_CONT not_set
51 param.ajouter("facteur",&facteur_,Param::REQUIRED); // XD_ADD_P double
52 // XD_CONT not_set
53
54 param.lire_avec_accolades(s);
55 return s;
56}
57
59{
60 if (equation().equation_non_resolue())
62 double f=dt_stab_conv()*facteur_*btd_/2.;
63 return f;
64}
65
67{
68 return s << que_suis_je() ;
69}
70
72{
73 btd_=3.;
74 Motcle type_op_lu;
75 s >> type_op_lu;
76
77 if (!(type_op_lu=="amont") && !(type_op_lu=="centre") && !(type_op_lu=="amont3")&&!(type_op_lu=="btd"))
78 {
79 Cerr << type_op_lu << " n'est pas compris par " << que_suis_je() << finl;
80 Cerr << " choisir parmi : amont -btd - centre " << finl;
81 exit();
82 }
83
84
85 if (type_op_lu=="centre")
86 {
88
89 }
90
91 if ((type_op_lu=="amont")||(type_op_lu=="amont3")||(type_op_lu=="btd"))
92 {
93 type_op = amont;
94 }
95
96
97 if ((type_op==amont)
98 && (type_op_lu!="amont2"))
99 {
100 f_lu_=0.036585;
101 hourglass=1;
103 btd_impl_=1;
104 centre_impl_=1;
105 }
106 if (type_op_lu=="amont3")
107 {
108 s >> f_lu_;
109 // decommente les 2 lognes
110 // centre_impl_=0;
111 // calcul_dt_stab_=1;
112 }
113 if (type_op_lu=="btd")
114 f_lu_=-1;
115
116
117 return s ;
118}
120{
122 if (sub_type(Op_Diff_EF,equation().operateur(0).l_op_base()))
123 {
124 if (equation().schema_temps().diffusion_implicite())
125 {
129 }
130 }
131 else
132 {
135 }
136
137}
138
139DoubleTab& Op_Conv_EF::ajouter(const DoubleTab& transporte, DoubleTab& resu) const
140{
141 return ajouter_sous_cond(transporte, resu, btd_hors_conv_, hourglass_hors_conv_, 0);
142}
143
144DoubleTab& Op_Conv_EF::ajouter_a_la_diffusion(const DoubleTab& transporte, DoubleTab& resu) const
145{
146 return ajouter_sous_cond(transporte, resu, !btd_hors_conv_, !hourglass_hors_conv_, 1);
147}
148
150{
151 double dt=equation().schema_temps().pas_de_temps();
152 double f=(dimension)*dt/(dimension-1);
153 if (f_lu_>=0) f=f_lu_;
154 return f;
155}
156
157DoubleTab& Op_Conv_EF::ajouter_sous_cond_gen(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
158{
159 return ajouter_sous_cond_template<AJOUTE_COND::GEN>(transporte,resu,btd_impl,hourglass_impl,centre_impl);
160}
161
162DoubleTab& Op_Conv_EF::ajouter_sous_cond_dim3_nbn8_nbdim2(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
163{
164 return ajouter_sous_cond_template<AJOUTE_COND::D3_82>(transporte,resu,btd_impl,hourglass_impl,centre_impl);
165}
166
167DoubleTab& Op_Conv_EF::ajouter_sous_cond_dim3_nbn8_nbdim1(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
168{
169 return ajouter_sous_cond_template<AJOUTE_COND::D3_81>(transporte,resu,btd_impl,hourglass_impl,centre_impl);
170}
171
172DoubleTab& Op_Conv_EF::ajouter_sous_cond_dim2_nbn4_nbdim2(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
173{
174 return ajouter_sous_cond_template<AJOUTE_COND::D2_42>(transporte,resu,btd_impl,hourglass_impl,centre_impl);
175}
176
177DoubleTab& Op_Conv_EF::ajouter_sous_cond_dim2_nbn4_nbdim1(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
178{
179 return ajouter_sous_cond_template<AJOUTE_COND::D2_41>(transporte,resu,btd_impl,hourglass_impl,centre_impl);
180}
181
182DoubleTab& Op_Conv_EF::ajouter_sous_cond(const DoubleTab& transporte, DoubleTab& resu, int btd_impl, int hourglass_impl, int centre_impl) const
183{
184 const Domaine_EF& domaine_ef = ref_cast(Domaine_EF, equation().domaine_dis());
185 int nb_som_elem = domaine_ef.domaine().nb_som_elem();
186 int nb_compo = transporte.line_size();
187
188 if ((dimension == 3) && (nb_som_elem == 8))
189 {
190 if (nb_compo == 1)
191 return ajouter_sous_cond_dim3_nbn8_nbdim1(transporte, resu, btd_impl, hourglass_impl, centre_impl);
192 else
193 return ajouter_sous_cond_dim3_nbn8_nbdim2(transporte, resu, btd_impl, hourglass_impl, centre_impl);
194 }
195 return ajouter_sous_cond_gen(transporte, resu, btd_impl, hourglass_impl, centre_impl);
196}
197
198void Op_Conv_EF::ajouter_contribution_sous_cond(const DoubleTab& transporte, Matrice_Morse& matrice,int btd_impl,int hourglass_impl,int centre_impl ) const
199{
200
201 const Champ_Inc_base& la_vitesse=vitesse_.valeur();
202 const DoubleTab& G=la_vitesse.valeurs();
203
204 int transport_rhou=0;
205 if (vitesse_->le_nom()=="rho_u") transport_rhou=1;
206
207 const DoubleTab& rho_elem=(transport_rhou==1 ? equation().probleme().get_champ("masse_volumique_melange").valeurs() : \
208 equation().probleme().get_champ("masse_volumique").valeurs());
209 int is_not_rho_unif = (rho_elem.size() == 1 ? 0 : 1);
210
211 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
212 int nb_comp = transporte.line_size();
213 const DoubleVect& volumes_thilde= domaine_ef.volumes_thilde();
214 const DoubleVect& volumes= domaine_ef.volumes();
215 const DoubleTab& IPhi_thilde=domaine_ef.IPhi_thilde();
216
217 const DoubleTab& bij=domaine_ef.Bij();
218 int nb_elem_tot=domaine_ef.domaine().nb_elem_tot();
219 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
220 const IntTab& elems=domaine_ef.domaine().les_elems() ;
221 ArrOfDouble G_e(dimension);
222
223 double f=coefficient_btd();
224 // DoubleTab transp_loc(nb_som_elem,nb_comp);
225 // A DEPLACER !!!!!
226 const DoubleTab& lambda=ref_cast(Operateur_Diff_base,equation().operateur(0).l_op_base()).diffusivite().valeurs();
227 int is_not_lambda_unif=1;
228 if (lambda.size()==1)
229 is_not_lambda_unif=0;
230
231 int mcoef3d[8]= {1,-1,-1,1,-1,1,1,-1};
232 int sommetoppose[8]= {7,6,5,4,3,2,1,0};
233 for (int elem=0; elem<nb_elem_tot; elem++)
234 if (elem_contribue(elem))
235 {
236 G_e=0;
237 for (int i1=0; i1<nb_som_elem; i1++)
238 {
239 int glob=elems(elem,i1);
240 for (int b=0; b<dimension; b++)
241 G_e[b]+=G(glob,b);
242 }
243 G_e/=nb_som_elem;
244
245 double pond2=volumes_thilde(elem)/volumes(elem)/volumes(elem);
246
247 if (transport_rhou) pond2 /= (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
248
249 if ((hourglass)&&(nb_som_elem==8)&&(hourglass_impl==1))
250 {
251 double pond3=f*dotproduct_array(G_e,G_e);
252 if (transport_rhou) pond3 /= (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
253 if (is_not_lambda_unif)
254 pond3+=lambda(elem);
255 else
256 pond3+=lambda(0,0);
257 pond3*=volumes_thilde(elem)/volumes(elem)*pow(volumes(elem),0.3333333333333333);
258 pond3*=hourglass;
259
260 for (int a=0; a<nb_comp; a++)
261 {
262 double coef2d=0.042*pond3;
263 double coef3d=coef2d*0.5;
264
265 for (int i1=0; i1<8; i1++)
266 {
267 int n1=elems(elem,i1)*nb_comp+a;
268 for (int i2=0; i2<8; i2++)
269 {
270 int n2=elems(elem,i2)*nb_comp+a;
271 matrice.coef(n1,n2)+=mcoef3d[i1]*mcoef3d[i2]*coef3d-coef2d;
272 }
273 matrice.coef(n1,n1)+=coef2d*4.;
274 matrice.coef(n1,elems(elem,sommetoppose[i1])*nb_comp+a)+=coef2d*4.;
275 }
276 }
277 }
278
279 for (int i1=0; i1<nb_som_elem; i1++)
280 {
281 int glob=elems(elem,i1);
282
283 if (((btd_impl==1)&&(type_op==amont))||(centre_impl==1))
284 {
285 double cb=0;
286 for (int b=0; b<dimension; b++)
287 cb+=G_e[b]*bij(elem,i1,b);
288 cb*=(f*pond2);
289 for (int i2=0; i2<nb_som_elem; i2++)
290 {
291 int glob2=elems(elem,i2);
292
293 double ca=0;
294 if (centre_impl==1)
295 {
296 for (int b=0; b<dimension; b++)
297 ca+=G_e[b]*bij(elem,i2,b);
298 double pond=IPhi_thilde(elem,i1)/volumes(elem);
299
300 ca*=pond;
301 }
302 double cc=0;
303 if ((btd_impl==1)&&(type_op==amont))
304 {
305 for (int c=0; c<dimension; c++)
306 cc+=G_e[c]*bij(elem,i2,c);
307 cc*=cb;
308 }
309 //resu(glob)-=cc*cb*transp_loc(i2,0);
310 for (int a=0; a<nb_comp; a++)
311 {
312 int n1=glob*nb_comp+a;
313 int n2=glob2*nb_comp+a;
314 matrice.coef(n1,n2)+=cc+ca;
315
316 }
317 }
318 }
319 }
320 }
321 return;
322}
323
324void Op_Conv_EF::ajouter_contribution(const DoubleTab& transporte, Matrice_Morse& matrice ) const
325{
327}
328
329void Op_Conv_EF::ajouter_contribution_a_la_diffusion(const DoubleTab& transporte, Matrice_Morse& matrice ) const
330{
332}
333
335{
337
338 const Champ_Inc_base& la_vitesse=vitesse_.valeur();
339 const DoubleTab& G=la_vitesse.valeurs();
340
341 int transport_rhou=0;
342 if (vitesse_->le_nom()=="rho_u") transport_rhou=1;
343
344 const DoubleTab& rho_elem=(transport_rhou==1 ? equation().probleme().get_champ("masse_volumique_melange").valeurs() : \
345 equation().probleme().get_champ("masse_volumique").valeurs());
346 int is_not_rho_unif = (rho_elem.size() == 1 ? 0 : 1);
347
348 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
349 const DoubleVect& valeurs_diffusivite = ref_cast(Operateur_Diff_base,equation().operateur(0).l_op_base()).diffusivite().valeurs();
350 int is_not_lambda_unif = (valeurs_diffusivite.size() == 1 ? 0 : 1);
351
352 int autre_eq=0;
353 const DoubleVect& valeurs_diffusivite_p = ref_cast(Operateur_Diff_base,equation().probleme().equation(autre_eq).operateur(0).l_op_base()).diffusivite().valeurs();
354 if (calcul_dt_stab_==2)
355 {
356 if (&valeurs_diffusivite_p == &valeurs_diffusivite)
357 autre_eq=1;
358 if (equation().probleme().nombre_d_equations() <= 1) autre_eq=0;
359 }
360 const DoubleVect& valeurs_diffusivite_2 = ref_cast(Operateur_Diff_base,equation().probleme().equation(autre_eq).operateur(0).l_op_base()).diffusivite().valeurs();
361
362 const DoubleTab& coord=domaine_ef.domaine().les_sommets();
363
364 int nb_elem_tot=domaine_ef.domaine().nb_elem_tot();
365 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
366 const IntTab& elems=domaine_ef.domaine().les_elems() ;
367 ArrOfDouble G_e(dimension);
368 double Max=0;
369 double dt_l=0,dt2=0;
370 for (int elem=0; elem<nb_elem_tot; elem++)
371 if (elem_contribue(elem))
372 {
373 G_e=0;
374 for (int i1=0; i1<nb_som_elem; i1++)
375 {
376 int glob=elems(elem,i1);
377 for (int b=0; b<dimension; b++)
378 G_e[b]+=G(glob,b);
379 }
380 G_e/=nb_som_elem;
381 //if (transport_rhou) G_e/=rho_elem(elem);
382 double ml=0;
383 double dx2;
384 // pas de temps de diffusion !!
385 double ml2=0;
386 double vx[3];
387 for (int d=0; d<3; d++)
388 {
389 dx2=std::fabs(coord(elems(elem,0),d)-coord(elems(elem,7),d));
390 dx2+=std::fabs(coord(elems(elem,1),d)-coord(elems(elem,6),d));
391 dx2+=std::fabs(coord(elems(elem,2),d)-coord(elems(elem,5),d));
392 dx2+=std::fabs(coord(elems(elem,3),d)-coord(elems(elem,4),d));
393 dx2*=0.25;
394 dx2*=dx2;
395
396 ml2+=dx2;
397 //double p=G_e(d)*G_e(d)/dx2;
398 ml+=G_e[d]*G_e[d]/dx2;
399 vx[d]=G_e[d]*G_e[d];
400 }
401
402 double diffu=(is_not_lambda_unif?valeurs_diffusivite(elem):valeurs_diffusivite(0));
403
404 if (calcul_dt_stab_==2)
405 {
406 double diffu2=(is_not_lambda_unif?valeurs_diffusivite_2(elem):valeurs_diffusivite_2(0));
407 if (diffu2<diffu)
408 diffu=diffu2;
409 }
410 diffu /= (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
411
412 // horreur pour NR G2 cas clotaire
413 // diffu*=0.5;
414 //if (elem==0) Cerr<<"uu "<<diffu<<finl;
415 if (transport_rhou)
416 {
417 double rho_e = (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
418 double inv_rho2= rho_e*rho_e;
419 inv_rho2=1./inv_rho2;
420 ml*=inv_rho2;
421 for (int d=0; d<dimension; d++)
422 vx[d]*=inv_rho2;
423 }
424 // le .5* c'est pour avoir le meme dt que g2 mais faux
425 double dxe=sqrt(ml2);
426 if (dxe<min_dx_)
427 min_dx_=dxe;
428 ml2=diffu/ml2;
429 ml*=btd_;
430 ml=sqrt(ml2*ml2+ml)+ml2+DMINFLOAT;
431 /* if (ml2>0)
432 ml=ml/(sqrt(ml2*ml2+ml)-ml2);
433 else ml=-1.;
434 */
435 if (ml > Max) Max=ml;
436 double ue=sqrt(vx[0]+vx[1]+vx[2]);
437 if (ue>max_ue_) max_ue_=ue;
438
439 dt_l= 1./(Max+DMINFLOAT);
440
441 if (elem==0) dt2=dt_l;
442 if (btd_!=3.)
443 {
444 double dt0=dt2;
445 double s=1.;
446 while(s>0)
447 {
448 s=-1;
449 for (int d=0; d<dimension; d++)
450 {
451 double c=vx[d]*dt0;
452 if (std::fabs(c)>1e-16)
453 s+=c/(2.*diffu +c*btd_);
454 }
455 if (s>0)
456 {
457 dt0*=0.9;
458 Cout<<elem<<" " <<dt_l<<" "<<s<<" "<<dt0<<finl;
459 exit();
460 }
461 }
462 dt2=std::min(dt2,dt0);
463 dt_l=std::min(dt2,dt_l);
464 }
465 }
468 coefficient_correcteur_supg_.dimensionner(1,1);
470 double dt_stab=dt_l;
471 dt_stab = Process::mp_min(dt_stab);
472 // astuce pour contourner le type const de la methode
473 Op_Conv_EF_base& op = ref_cast_non_const(Op_Conv_EF_base,*this);
474 op.fixer_dt_stab_conv(dt_stab);
475
476 return dt_stab;
477}
478
479void Op_Conv_EF::contribue_au_second_membre(DoubleTab& resu ) const
480{
481 // on a rien implicite
483}
484
486{
487 ajouter_sous_cond(equation().inconnue().valeurs(),resu,((btd_hors_conv_==0)||btd_impl_),((hourglass_hors_conv_==0)||hourglass_impl_),1);
488}
489
491{
492 if (nom == "coefficient_correcteur_supg")
494 return Op_Conv_EF_base::get_champ(nom);
495}
496
497bool Op_Conv_EF::has_champ(const Motcle& nom, OBS_PTR(Champ_base) &ref_champ) const
498{
499 if (nom == "coefficient_correcteur_supg")
500 {
502 return true;
503 }
504 return Op_Conv_EF_base::has_champ(nom, ref_champ);
505}
506
507bool Op_Conv_EF::has_champ(const Motcle& nom) const
508{
509 if (nom == "coefficient_correcteur_supg")
510 return true;
511 return Op_Conv_EF_base::has_champ(nom);
512}
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual const Champ_base & get_champ(const Motcle &nom) const =0
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const =0
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
Definition Domaine.h:474
int_t nb_elem_tot() const
Definition Domaine.h:132
DoubleTab_t & les_sommets()
Definition Domaine.h:113
IntTab_t & les_elems()
Definition Domaine.h:129
class Domaine_EF
Definition Domaine_EF.h:59
const DoubleTab & IPhi_thilde() const
Definition Domaine_EF.h:95
const DoubleTab & Bij() const
Definition Domaine_EF.h:92
const DoubleVect & volumes_thilde() const
Definition Domaine_EF.h:85
double volumes(int i) const
Definition Domaine_VF.h:113
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
double coef(int i, int j) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
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
double facteur_
Definition Op_Conv_EF.h:99
class Op_Conv_EF_base
OBS_PTR(Domaine_EF) le_dom_EF
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
class Op_Conv_EF Cette classe represente l'operateur de convection associe a une equation de
Definition Op_Conv_EF.h:39
void contribue_au_second_membre(DoubleTab &) const
int centre_impl_
Definition Op_Conv_EF.h:70
DoubleTab & ajouter_sous_cond_dim3_nbn8_nbdim1(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
double hourglass
Definition Op_Conv_EF.h:69
int hourglass_hors_conv_
Definition Op_Conv_EF.h:71
int calcul_dt_stab_
Definition Op_Conv_EF.h:74
DoubleTab & ajouter_sous_cond_gen(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
DoubleTab & ajouter_sous_cond_template(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
Definition Op_Conv_EF.h:103
double f_lu_
Definition Op_Conv_EF.h:72
double calculer_dt_stab() const override
Calcul dt_stab.
Champ_Uniforme coefficient_correcteur_supg_
Definition Op_Conv_EF.h:79
void contribue_au_second_membre_a_la_diffusion(DoubleTab &resu) const
virtual double coefficient_btd() const
double min_dx_
Definition Op_Conv_EF.h:78
DoubleTab & ajouter_a_la_diffusion(const DoubleTab &, DoubleTab &) const
const Champ_base & get_champ(const Motcle &nom) const override
void ajouter_contribution_a_la_diffusion(const DoubleTab &, Matrice_Morse &) const
DoubleTab & ajouter_sous_cond_dim3_nbn8_nbdim2(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
int btd_hors_conv_
Definition Op_Conv_EF.h:71
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
double btd_
Definition Op_Conv_EF.h:87
DoubleTab & ajouter_sous_cond(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
int btd_impl_
Definition Op_Conv_EF.h:70
DoubleTab & ajouter_sous_cond_dim2_nbn4_nbdim2(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
void ajouter_contribution_sous_cond(const DoubleTab &transporte, Matrice_Morse &matrice, int btd_impl, int hourglass_impl, int centre_impl) const
DoubleTab & ajouter_sous_cond_dim2_nbn4_nbdim1(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
int hourglass_impl_
Definition Op_Conv_EF.h:70
double max_ue_
Definition Op_Conv_EF.h:78
type_operateur type_op
Definition Op_Conv_EF.h:75
class Op_Diff_EF Cette classe represente l'operateur de diffusion
Definition Op_Diff_EF.h:37
int elem_contribue(const int elem) const
double dt_stab_conv() const
void fixer_dt_stab_conv(double dt)
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
virtual double calculer_dt_stab() const
Calcul dt_stab.
@ REQUIRED
Definition Param.h:115
const Champ_base & get_champ(const Motcle &nom) const override
static double mp_min(double)
Definition Process.cpp:386
static double mp_max(double)
Definition Process.cpp:376
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67