16#include <Op_Dift_VDF_Face_Axi_base.h>
17#include <Modele_turbulence_hyd_base.h>
35 porosite.ref(la_zcl_vdf->equation().milieu().porosite_face());
50 const RefObjU& modele_turbulence = eqn_hydr.
get_modele(TURBULENCE);
62 if (le_modele_turbulence->has_loi_paroi_hyd())
tau_tan.ref(le_modele_turbulence->loi_paroi().Cisaillement_paroi());
68 le_modele_turbulence = mod;
73void Op_Dift_VDF_Face_Axi_base::ajouter_elem(
const DoubleVect& visco_turb,
const DoubleTab& tau_diag, DoubleTab& resu)
const
75 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
78 const double visc_elem =
nu_(num_elem) + 2*visco_turb(num_elem);
79 const double flux_X = (visc_elem*tau_diag(num_elem,0))*0.5*(
surface(fx0)+
surface(fx1)), flux_Y = (visc_elem*tau_diag(num_elem,1))*0.5*(
surface(fy0)+
surface(fy1));
86 const double coef_laplacien_axi = -0.5*(tau_diag(num_elem,1)*visc_elem);
92void Op_Dift_VDF_Face_Axi_base::ajouter_elem_3D(
const DoubleVect& visco_turb,
const DoubleTab& tau_diag, DoubleTab& resu)
const
94 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
97 const double visc_elem =
nu_(num_elem) + 2*visco_turb(num_elem), flux_Z = (visc_elem*tau_diag(num_elem,2))*0.5*(
surface(fz0)+
surface(fz1));
103void Op_Dift_VDF_Face_Axi_base::ajouter_aretes_bords(
const DoubleVect& visco_turb,
const DoubleTab& tau_croises, DoubleTab& resu)
const
105 const int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
106 double d_visco_turb, d_visco_lam;
107 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
114 const int fac1 =
Qdm(n_arete,0), fac2 =
Qdm(n_arete,1), fac3 =
Qdm(n_arete,2), ori3 =
orientation(fac3);
115 const int rang1 = (fac1 - le_dom_vdf->premiere_face_bord()), rang2 = (fac2-le_dom_vdf->premiere_face_bord());
120 const double tau_tan_1 =
tau_tan(rang1,ori3), tau_tan_2 =
tau_tan(rang2,ori3) ;
121 double tau = 0.5*(tau_tan_1 + tau_tan_2 ), surf = 0.5*(
surface(fac1)+
surface(fac2));
145 const double tau12 = tau_croises(n_arete,0), tau21 = tau_croises(n_arete,1);
150 assert (ori3b == 2) ;
151 const double tau13 = tau_croises(n_arete,0), tau31 = tau_croises(n_arete,1);
155 resu[fac3] += signe*flux1;
162 const double tau21 = tau_croises(n_arete,0), tau12 = tau_croises(n_arete,1);
166 const double coef_laplacien_axi = 0.5*(d_visco_lam*tau21 + d_visco_turb*(tau12+tau21));
173 const double tau23 = tau_croises(n_arete,0), tau32 = tau_croises(n_arete,1);
177 resu[fac3] += signe*flux2;
184 const double tau31 = tau_croises(n_arete,0), tau13 = tau_croises(n_arete,1);
190 const double tau32 = tau_croises(n_arete,0), tau23 = tau_croises(n_arete,1);
194 resu[fac3] += signe*flux3;
202 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
210void Op_Dift_VDF_Face_Axi_base::fill_resu_aretes_mixtes(
const int i ,
const int j ,
const int k ,
const int l ,
const double d_visco_lam ,
const double tau , DoubleTab& resu)
const
218void Op_Dift_VDF_Face_Axi_base::ajouter_aretes_mixtes(
const DoubleTab& tau_croises, DoubleTab& resu)
const
221 const int ndeb = le_dom_vdf->premiere_arete_mixte(), nfin = le_dom_vdf->premiere_arete_interne();
222 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
229 const double tau12 = tau_croises(n_arete,0), tau21 = tau_croises(n_arete,1);
230 fill_resu_aretes_mixtes(fac1,fac2,fac3,fac4,d_visco_lam,tau21,resu);
233 const double coef_laplacien_axi = 0.5*d_visco_lam*tau21;
237 fill_resu_aretes_mixtes(fac3,fac4,fac1,fac2,d_visco_lam,tau12,resu);
241 const double tau23 = tau_croises(n_arete,0), tau32 = tau_croises(n_arete,1);
242 fill_resu_aretes_mixtes(fac1,fac2,fac3,fac4,d_visco_lam,tau32,resu);
243 fill_resu_aretes_mixtes(fac3,fac4,fac1,fac2,d_visco_lam,tau23,resu);
247 const double tau13 = tau_croises(n_arete,0), tau31 = tau_croises(n_arete,1);
248 fill_resu_aretes_mixtes(fac1,fac2,fac3,fac4,d_visco_lam,tau31,resu);
249 fill_resu_aretes_mixtes(fac3,fac4,fac1,fac2,d_visco_lam,tau13,resu);
254void Op_Dift_VDF_Face_Axi_base::fill_resu_aretes_internes(
const int i,
const int j,
const int k,
const int l,
const double v_lam,
const double v_turb,
const double tau1,
const double tau2, DoubleTab& resu)
const
262void Op_Dift_VDF_Face_Axi_base::ajouter_aretes_internes(
const DoubleVect& visco_turb,
const DoubleTab& tau_croises, DoubleTab& resu)
const
264 const int ndeb = le_dom_vdf->premiere_arete_interne(), nfin = le_dom_vdf->nb_aretes();
265 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
275 const double tau12 = tau_croises(n_arete,0), tau21 = tau_croises(n_arete,1);
276 fill_resu_aretes_internes(fac1,fac2,fac3,fac4,d_visco_lam,d_visco_turb,tau12,tau21,resu);
279 const double coef_laplacien_axi = 0.5*(d_visco_lam*tau21 + d_visco_turb*(tau21+tau12));
283 fill_resu_aretes_internes(fac3,fac4,fac1,fac2,d_visco_lam,d_visco_turb,tau21,tau12,resu);
287 const double tau23 = tau_croises(n_arete,0), tau32 = tau_croises(n_arete,1);
288 fill_resu_aretes_internes(fac1,fac2,fac3,fac4,d_visco_lam,d_visco_turb,tau23,tau32,resu);
289 fill_resu_aretes_internes(fac3,fac4,fac1,fac2,d_visco_lam,d_visco_turb,tau32,tau23,resu);
293 const double tau13 = tau_croises(n_arete,0), tau31 = tau_croises(n_arete,1);
294 fill_resu_aretes_internes(fac1,fac2,fac3,fac4,d_visco_lam,d_visco_turb,tau13,tau31,resu);
295 fill_resu_aretes_internes(fac3,fac4,fac1,fac2,d_visco_lam,d_visco_turb,tau31,tau13,resu);
300DoubleTab& Op_Dift_VDF_Face_Axi_base::ajouter(
const DoubleTab& inco, DoubleTab& resu)
const
302 if (inco.
line_size() > 1) not_implemented(__func__);
306 const Domaine_Cl_VDF& zclvdf = la_zcl_vdf.valeur();
308 const DoubleTab& tau_diag = inconnue->tau_diag(), &tau_croises = inconnue->tau_croises();
309 ref_cast_non_const(Champ_Face_VDF,inconnue.valeur()).calculer_dercov_axi(zclvdf);
311 ajouter_elem(visco_turb,tau_diag,resu);
312 if (
dimension == 3) ajouter_elem_3D(visco_turb,tau_diag,resu);
313 ajouter_aretes_bords(visco_turb,tau_croises,resu);
314 ajouter_aretes_mixtes(tau_croises,resu);
315 ajouter_aretes_internes(visco_turb,tau_croises,resu);
323 return ajouter(inco,resu);
326void Op_Dift_VDF_Face_Axi_base::fill_coeff_matrice_morse(
const int fac1,
const int fac2,
const double flux,
Matrice_Morse& matrice)
const
331 for (
auto k = tab1[fac1]-1; k < tab1[fac1+1]-1; k++)
333 if (tab2[k]-1 == fac1) coeff[k] += flux;
334 if (tab2[k]-1 == fac2) coeff[k] -= flux;
336 for (
auto k = tab1[fac2]-1; k < tab1[fac2+1]-1; k++)
338 if (tab2[k]-1 == fac1) coeff[k] -= flux;
339 if (tab2[k]-1 == fac2) coeff[k] += flux;
343void Op_Dift_VDF_Face_Axi_base::ajouter_contribution_elem(
const DoubleVect& visco_turb,
const DoubleTab& tau_diag,
Matrice_Morse& matrice)
const
348 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
351 const double visc_elem =
nu_(num_elem) + 2*visco_turb(num_elem);
352 double flux_X, flux_Y;
356 flux_X = (visc_elem*tau_diag(num_elem,0))*0.5*(
surface(fx0)+
surface(fx1));
357 flux_Y = (visc_elem*tau_diag(num_elem,1))*0.5*(
surface(fy0)+
surface(fy1));
365 fill_coeff_matrice_morse(fx0,fx1,flux_X,matrice);
366 fill_coeff_matrice_morse(fy0,fy1,flux_Y,matrice);
369 double coef_laplacien_axi;
370 if (
is_var()) coef_laplacien_axi = -0.5*(tau_diag(num_elem,1)*visc_elem);
371 else coef_laplacien_axi = -0.5*visc_elem;
373 for (
auto l = tab1[fx0]-1; l < tab1[fx0+1]-1; l++)
376 for (
auto l = tab1[fx1]-1; l < tab1[fx1+1]-1; l++)
381void Op_Dift_VDF_Face_Axi_base::ajouter_contribution_elem_3D(
const DoubleVect& visco_turb,
const DoubleTab& tau_diag,
Matrice_Morse& matrice)
const
383 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
386 const double visc_elem =
nu_(num_elem) + 2*visco_turb(num_elem);
392 fill_coeff_matrice_morse(fz0,fz1,flux_Z,matrice);
396void Op_Dift_VDF_Face_Axi_base::ajouter_contribution_aretes_bords(
const DoubleVect& visco_turb,
const DoubleTab& tau_diag,
Matrice_Morse& matrice)
const
401 int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
402 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
420 for (
auto l = tab1[fac3]-1; l < tab1[fac3+1]-1; l++)
421 if (tab2[l]-1 == fac3) coeff[l] += signe*flux1;
428 for (
auto l = tab1[fac3]-1; l < tab1[fac3+1]-1; l++)
429 if (tab2[l]-1 == fac3) coeff[l] += signe*flux2;
432 const double coef_laplacien_axi = 0.5*(d_visco_lam + d_visco_turb);
434 for (
auto l = tab1[fac1]-1; l < tab1[fac1+1]-1; l++)
437 for (
auto l = tab1[fac2]-1; l < tab1[fac2+1]-1; l++)
443 for (
auto l = tab1[fac3]-1; l < tab1[fac3+1]-1; l++)
444 if (tab2[l]-1 == fac3) coeff[l] += signe*flux3;
450 for (
auto l = tab1[fac3]-1; l < tab1[fac3+1]-1; l++)
451 if (tab2[l]-1 == fac3) coeff[l] += signe*flux4;
459 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
467void Op_Dift_VDF_Face_Axi_base::ajouter_contribution_aretes_mixtes(
Matrice_Morse& matrice)
const
473 const int ndeb = le_dom_vdf->premiere_arete_mixte(), nfin = le_dom_vdf->premiere_arete_interne();
474 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
476 const int fac1 =
Qdm(n_arete,0), fac2 =
Qdm(n_arete,1), fac3 =
Qdm(n_arete,2), fac4 =
Qdm(n_arete,3), ori1 =
orientation(fac1);
484 fill_coeff_matrice_morse(fac3,fac4,flux1,matrice);
487 const double coef_laplacien_axi = 0.5*d_visco_lam;
489 for (
auto l = tab1[fac1]-1; l < tab1[fac1+1]-1; l++)
492 for (
auto l = tab1[fac2]-1; l < tab1[fac2+1]-1; l++)
497 fill_coeff_matrice_morse(fac1,fac2,flux1,matrice);
506 fill_coeff_matrice_morse(fac3,fac4,flux2,matrice);
511 fill_coeff_matrice_morse(fac1,fac2,flux2,matrice);
516void Op_Dift_VDF_Face_Axi_base::ajouter_contribution_aretes_internes(
const DoubleVect& visco_turb,
Matrice_Morse& matrice)
const
521 const int ndeb = le_dom_vdf->premiere_arete_interne(), nfin = le_dom_vdf->nb_aretes();
522 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
524 const int fac1 =
Qdm(n_arete,0), fac2 =
Qdm(n_arete,1), fac3 =
Qdm(n_arete,2), fac4 =
Qdm(n_arete,3), ori1 =
orientation(fac1);
534 fill_coeff_matrice_morse(fac3,fac4,flux1,matrice);
537 const double coef_laplacien_axi = 0.5*(d_visco_lam + d_visco_turb);
539 for (
auto l = tab1[fac1]-1; l < tab1[fac1+1]-1; l++)
542 for (
auto l = tab1[fac2]-1; l < tab1[fac2+1]-1; l++)
547 fill_coeff_matrice_morse(fac1,fac2,flux1,matrice);
554 fill_coeff_matrice_morse(fac3,fac4,flux2,matrice);
558 fill_coeff_matrice_morse(fac1,fac2,flux2,matrice);
563void Op_Dift_VDF_Face_Axi_base::ajouter_contribution(
const DoubleTab& inco,
Matrice_Morse& matrice )
const
565 if (inco.
line_size() > 1) not_implemented(__func__);
569 const Domaine_Cl_VDF& zclvdf = la_zcl_vdf.valeur();
571 const DoubleTab& tau_diag = inconnue->tau_diag();
572 ref_cast_non_const(Champ_Face_VDF,inconnue.valeur()).calculer_dercov_axi(zclvdf);
574 ajouter_contribution_elem(visco_turb,tau_diag,matrice);
575 if (
dimension == 3) ajouter_contribution_elem_3D(visco_turb,tau_diag,matrice);
576 ajouter_contribution_aretes_bords(visco_turb,tau_diag,matrice);
577 ajouter_contribution_aretes_mixtes(matrice);
578 ajouter_contribution_aretes_internes(visco_turb,matrice);
583 if (resu.
line_size() > 1) not_implemented(__func__);
587 const int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
588 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
595 const int fac1 =
Qdm(n_arete,0), fac2 =
Qdm(n_arete,1), fac3 =
Qdm(n_arete,2), ori3 =
orientation(fac3);
596 const int rang1 = (fac1 - le_dom_vdf->premiere_face_bord()), rang2 = (fac2 - le_dom_vdf->premiere_face_bord());
619 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
void dimensionner_tenseur_Grad()
int type_arete_bord(int num_arete) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int Qdm(int num_arete, int) const
virtual const DoubleVect & face_surfaces() const
DoubleVect & volumes_entrelaces()
double xv(int num_face, int k) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
double xp(int num_elem, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
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.
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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.
const Champ_Fonc_base & diffusivite_turbulente() const
void associer_modele_turbulence(const Modele_turbulence_hyd_base &)
virtual double nu_mean_4_pts_(const int, const int) const =0
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
virtual double nu_(const int) const =0
double calculer_dt_stab() const override
Calcul dt_stab.
DoubleVect volumes_entrelaces
void associer_diffusivite_turbulente(const Champ_Fonc_base &visc_turb)
void mettre_a_jour(double) override
DOES NOTHING - to override in derived classes.
void associer_loipar(const Turbulence_paroi_base &)
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
calcule la contribution de la diffusion, la range dans resu
virtual double nu_mean_2_pts_(const int, const int) const =0
virtual bool is_var() const =0
void contribue_au_second_membre(DoubleTab &) const
virtual void mettre_a_jour_var(double) const =0
double calculer_dt_stab() const override
Calcul dt_stab.
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
const Objet_U & valeur() const