16#include <Schema_Temps_base.h>
17#include <Op_Conv_EF.h>
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) { }
34 hourglass_hors_conv_=1;
54 param.lire_avec_accolades(s);
60 if (
equation().equation_non_resolue())
77 if (!(type_op_lu==
"amont") && !(type_op_lu==
"centre") && !(type_op_lu==
"amont3")&&!(type_op_lu==
"btd"))
79 Cerr << type_op_lu <<
" n'est pas compris par " <<
que_suis_je() << finl;
80 Cerr <<
" choisir parmi : amont -btd - centre " << finl;
85 if (type_op_lu==
"centre")
91 if ((type_op_lu==
"amont")||(type_op_lu==
"amont3")||(type_op_lu==
"btd"))
98 && (type_op_lu!=
"amont2"))
106 if (type_op_lu==
"amont3")
113 if (type_op_lu==
"btd")
124 if (
equation().schema_temps().diffusion_implicite())
188 if ((
dimension == 3) && (nb_som_elem == 8))
202 const DoubleTab& G=la_vitesse.
valeurs();
204 int transport_rhou=0;
205 if (vitesse_->le_nom()==
"rho_u") transport_rhou=1;
208 equation().probleme().get_champ(
"masse_volumique").valeurs());
209 int is_not_rho_unif = (rho_elem.
size() == 1 ? 0 : 1);
214 const DoubleVect& volumes= domaine_ef.
volumes();
215 const DoubleTab& IPhi_thilde=domaine_ef.
IPhi_thilde();
217 const DoubleTab& bij=domaine_ef.
Bij();
227 int is_not_lambda_unif=1;
228 if (lambda.
size()==1)
229 is_not_lambda_unif=0;
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++)
237 for (
int i1=0; i1<nb_som_elem; i1++)
239 int glob=elems(elem,i1);
245 double pond2=volumes_thilde(elem)/volumes(elem)/volumes(elem);
247 if (transport_rhou) pond2 /= (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
249 if ((
hourglass)&&(nb_som_elem==8)&&(hourglass_impl==1))
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)
257 pond3*=volumes_thilde(elem)/volumes(elem)*pow(volumes(elem),0.3333333333333333);
260 for (
int a=0; a<nb_comp; a++)
262 double coef2d=0.042*pond3;
263 double coef3d=coef2d*0.5;
265 for (
int i1=0; i1<8; i1++)
267 int n1=elems(elem,i1)*nb_comp+a;
268 for (
int i2=0; i2<8; i2++)
270 int n2=elems(elem,i2)*nb_comp+a;
271 matrice.
coef(n1,n2)+=mcoef3d[i1]*mcoef3d[i2]*coef3d-coef2d;
273 matrice.
coef(n1,n1)+=coef2d*4.;
274 matrice.
coef(n1,elems(elem,sommetoppose[i1])*nb_comp+a)+=coef2d*4.;
279 for (
int i1=0; i1<nb_som_elem; i1++)
281 int glob=elems(elem,i1);
283 if (((btd_impl==1)&&(
type_op==
amont))||(centre_impl==1))
287 cb+=G_e[b]*bij(elem,i1,b);
289 for (
int i2=0; i2<nb_som_elem; i2++)
291 int glob2=elems(elem,i2);
297 ca+=G_e[b]*bij(elem,i2,b);
298 double pond=IPhi_thilde(elem,i1)/volumes(elem);
306 cc+=G_e[c]*bij(elem,i2,c);
310 for (
int a=0; a<nb_comp; a++)
312 int n1=glob*nb_comp+a;
313 int n2=glob2*nb_comp+a;
314 matrice.
coef(n1,n2)+=cc+ca;
339 const DoubleTab& G=la_vitesse.
valeurs();
341 int transport_rhou=0;
342 if (vitesse_->le_nom()==
"rho_u") transport_rhou=1;
345 equation().probleme().get_champ(
"masse_volumique").valeurs());
346 int is_not_rho_unif = (rho_elem.
size() == 1 ? 0 : 1);
350 int is_not_lambda_unif = (valeurs_diffusivite.
size() == 1 ? 0 : 1);
356 if (&valeurs_diffusivite_p == &valeurs_diffusivite)
358 if (
equation().probleme().nombre_d_equations() <= 1) autre_eq=0;
370 for (
int elem=0; elem<nb_elem_tot; elem++)
374 for (
int i1=0; i1<nb_som_elem; i1++)
376 int glob=elems(elem,i1);
387 for (
int d=0; d<3; d++)
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));
398 ml+=G_e[d]*G_e[d]/dx2;
402 double diffu=(is_not_lambda_unif?valeurs_diffusivite(elem):valeurs_diffusivite(0));
406 double diffu2=(is_not_lambda_unif?valeurs_diffusivite_2(elem):valeurs_diffusivite_2(0));
410 diffu /= (is_not_rho_unif ? rho_elem(elem) : rho_elem(0,0));
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;
425 double dxe=sqrt(ml2);
430 ml=sqrt(ml2*ml2+ml)+ml2+DMINFLOAT;
435 if (ml > Max) Max=ml;
436 double ue=sqrt(vx[0]+vx[1]+vx[2]);
439 dt_l= 1./(Max+DMINFLOAT);
441 if (elem==0) dt2=dt_l;
452 if (std::fabs(c)>1e-16)
453 s+=c/(2.*diffu +c*
btd_);
458 Cout<<elem<<
" " <<dt_l<<
" "<<s<<
" "<<dt0<<finl;
462 dt2=std::min(dt2,dt0);
463 dt_l=std::min(dt2,dt_l);
492 if (nom ==
"coefficient_correcteur_supg")
499 if (nom ==
"coefficient_correcteur_supg")
509 if (nom ==
"coefficient_correcteur_supg")
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.
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.
int_t nb_elem_tot() const
DoubleTab_t & les_sommets()
const DoubleTab & IPhi_thilde() const
const DoubleTab & Bij() const
const DoubleVect & volumes_thilde() const
double volumes(int i) const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
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.
Une chaine de caractere (Nom) en majuscules.
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.
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
void contribue_au_second_membre(DoubleTab &) const
DoubleTab & ajouter_sous_cond_dim3_nbn8_nbdim1(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
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
double calculer_dt_stab() const override
Calcul dt_stab.
Champ_Uniforme coefficient_correcteur_supg_
void contribue_au_second_membre_a_la_diffusion(DoubleTab &resu) const
virtual double coefficient_btd() const
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
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
DoubleTab & ajouter_sous_cond(const DoubleTab &transporte, DoubleTab &resu, int btd_impl, int hourglass_impl, int centre_impl) const
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.
class Op_Diff_EF Cette classe represente l'operateur de diffusion
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.
const Champ_base & get_champ(const Motcle &nom) const override
static double mp_min(double)
static double mp_max(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.