16#include <Op_Diff_VDF_Face_Axi_base.h>
34 porosite.ref(la_zcl_vdf->equation().milieu().porosite_face());
48void Op_Diff_VDF_Face_Axi_base::ajouter_elem(
const DoubleTab& inco, DoubleTab& resu)
const
50 if (inco.
line_size() > 1) not_implemented(__func__);
51 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
55 const double tau11 = (inco[fx1]-inco[fx0])/(
xv(fx1,0) -
xv(fx0,0));
57 double R =
xp(num_elem,0), d_teta =
xv(fy1,1) -
xv(fy0,1);
58 if (d_teta < 0) d_teta +=
deux_pi;
59 double tau22 = (inco[fy1]-inco[fy0])/(R*d_teta);
60 tau22 += 0.5*(inco[fx0]+inco[fx1])/R;
69 const double coef_laplacien_axi = +0.5*tau22*
nu_(num_elem);
75void Op_Diff_VDF_Face_Axi_base::ajouter_elem_3D(
const DoubleTab& inco, DoubleTab& resu)
const
77 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
81 const double tau33 = (inco[fz1]-inco[fz0])/(
xv(fz1,2) -
xv(fz0,2)), flux_Z = tau33*
nu_(num_elem)*0.5*(
surface(fz0)+
surface(fz1));
87void Op_Diff_VDF_Face_Axi_base::ajouter_aretes_bords(
const DoubleTab& inco, DoubleTab& resu)
const
89 int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
90 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
101 const int rang1 = fac1 - le_dom_vdf->premiere_face_bord(), rang2 = fac2 - le_dom_vdf->premiere_face_bord();
102 double vit_imp, dist3, tps = inconnue->temps();
106 if (est_egal(inco[fac1],0)) vit_imp = Champ_Face_get_val_imp_face_bord(tps,rang2,ori3,la_zcl_vdf.valeur());
107 else vit_imp = Champ_Face_get_val_imp_face_bord(tps,rang1,ori3,la_zcl_vdf.valeur());
109 else vit_imp = 0.5*(Champ_Face_get_val_imp_face_bord(tps,rang1,ori3,la_zcl_vdf.valeur())+Champ_Face_get_val_imp_face_bord(tps,rang2,ori3,la_zcl_vdf.valeur()));
118 dist3 =
xv(fac3,0)-
xv(fac1,0);
121 const double tau12 = (inco[fac3]-vit_imp)/dist3;
127 dist3 =
xv(fac3,0)-
xv(fac1,0);
129 const double tau13 = (inco[fac3]-vit_imp)/dist3;
132 resu[fac3] += signe*flux1;
136 double R =
xv(fac3,0), d_teta =
xv(fac3,1) -
xv(fac1,1);
137 if (d_teta < 0) d_teta +=
deux_pi;
143 double tau21 = (inco[fac3]-vit_imp)/dist3;
144 tau21 -= 0.5*(inco[fac1]+inco[fac2])/R;
146 resu[fac3]+=signe*flux2;
150 const double coef_laplacien_axi = 0.5*db_diffusivite*tau21;
157 const double tau23 = (inco[fac3]-vit_imp)/dist3;
159 resu[fac3] += signe*flux3;
167 dist3 =
xv(fac3,2)-
xv(fac1,2);
170 const double tau31 = (inco[fac3]-vit_imp)/dist3;
176 dist3 =
xv(fac3,2)-
xv(fac1,2);
179 const double tau32 = (inco[fac3]-vit_imp)/dist3;
182 resu[fac3] += signe*flux4;
190 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
198void Op_Diff_VDF_Face_Axi_base::ajouter_aretes_mixtes_internes(
const DoubleTab& inco, DoubleTab& resu)
const
200 const int ndeb = le_dom_vdf->premiere_arete_mixte(), nfin = le_dom_vdf->nb_aretes();
201 for (
int n_arete=ndeb; n_arete<nfin; n_arete++)
210 const double R =
xv(fac3,0);
211 double d_teta =
xv(fac4,1) -
xv(fac3,1);
212 if (d_teta < 0) d_teta +=
deux_pi;
213 double tau21 = (inco(fac4)-inco(fac3))/(R*d_teta);
216 tau21 -= 0.5*(inco[fac1]+inco[fac2])/R;
224 const double coef_laplacien_axi = 0.5*db_diffusivite*tau21;
229 const double tau12 = (inco(fac2)-inco(fac1))/(
xv(fac2,0) -
xv(fac1,0));
239 const double tau32 = (inco(fac4)-inco(fac3))/(
xv(fac4,2) -
xv(fac3,2));
247 const double R =
xv(fac1,0);
248 double d_teta =
xv(fac2,1) -
xv(fac1,1);
249 if (d_teta < 0) d_teta +=
deux_pi;
250 const double tau23 = (inco(fac2)-inco(fac1))/(R*d_teta);
260 const double tau31 = (inco(fac4)-inco(fac3))/(
xv(fac4,2) -
xv(fac3,2));
268 const double tau13 = (inco(fac2)-inco(fac1))/(
xv(fac2,0) -
xv(fac1,0));
277DoubleTab& Op_Diff_VDF_Face_Axi_base::ajouter(
const DoubleTab& inco, DoubleTab& resu)
const
279 ajouter_elem(inco,resu);
280 if (
dimension == 3) ajouter_elem_3D(inco,resu);
281 ajouter_aretes_bords(inco, resu);
282 ajouter_aretes_mixtes_internes(inco, resu);
289 return ajouter(inco,resu);
292void Op_Diff_VDF_Face_Axi_base::fill_coeff_matrice_morse(
const int fac1,
const int fac2,
const double flux,
Matrice_Morse& matrice)
const
297 for (
auto k = tab1[fac1]-1; k < tab1[fac1+1]-1; k++)
299 if (tab2[k]-1 == fac1) coeff[k] += flux;
300 if (tab2[k]-1 == fac2) coeff[k] -= flux;
302 for (
auto k = tab1[fac2]-1; k < tab1[fac2+1]-1; k++)
304 if (tab2[k]-1 == fac1) coeff[k] -= flux;
305 if (tab2[k]-1 == fac2) coeff[k] += flux;
309void Op_Diff_VDF_Face_Axi_base::ajouter_contribution_elem(
const DoubleTab& inco,
Matrice_Morse& matrice)
const
311 if (inco.
line_size() > 1) not_implemented(__func__);
316 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
320 const double tau11 = 1/(
xv(fx1,0) -
xv(fx0,0));
323 const double R =
xp(num_elem,0);
324 double d_teta =
xv(fy1,1) -
xv(fy0,1);
325 if (d_teta < 0) d_teta +=
deux_pi;
327 double tau22 = 1/(R*d_teta);
332 fill_coeff_matrice_morse(fx0,fx1,flux_X,matrice);
333 fill_coeff_matrice_morse(fy0,fy1,flux_Y,matrice);
336 const double coef_laplacien_axi = +0.5*tau22*
nu_(num_elem);
338 for (
auto k = tab1[fx0]-1; k < tab1[fx0+1]-1; k++)
341 for (
auto k=tab1[fx1]-1; k<tab1[fx1+1]-1; k++)
346void Op_Diff_VDF_Face_Axi_base::ajouter_contribution_elem_3D(
Matrice_Morse& matrice)
const
348 for (
int num_elem = 0; num_elem < le_dom_vdf->nb_elem(); num_elem++)
352 const double tau33 = 1/(
xv(fz1,2) -
xv(fz0,2));
354 fill_coeff_matrice_morse(fz0,fz1,flux_Z,matrice);
358void Op_Diff_VDF_Face_Axi_base::ajouter_contribution_aretes_bords(
Matrice_Morse& matrice)
const
363 const int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
364 for (
int n_arete=ndeb; n_arete<nfin; n_arete++)
381 double dist3 =
xv(fac3,0)-
xv(fac1,0);
383 const double tau12 = 1/dist3;
389 double dist3 =
xv(fac3,0)-
xv(fac1,0);
391 const double tau13 = 1/dist3;
395 for (
auto k = tab1[fac3]-1; k < tab1[fac3+1]-1; k++)
396 if (tab2[k]-1 == fac3) coeff[k] += signe*flux1;
400 const double R =
xv(fac3,0);
401 double d_teta =
xv(fac3,1) -
xv(fac1,1);
402 if (d_teta < 0) d_teta +=
deux_pi;
404 double dist3 = R*d_teta;
409 double tau21 = 1/dist3;
416 for (
auto k = tab1[fac3]-1; k < tab1[fac3+1]-1; k++)
417 if (tab2[k]-1 == fac3) coeff[k] += signe*flux2;
420 const double coef_laplacien_axi = 0.5*db_diffusivite*tau21;
422 for (
auto k = tab1[fac1]-1; k < tab1[fac1+1]-1; k++)
425 for (
auto k = tab1[fac2]-1; k < tab1[fac2+1]-1; k++)
431 const double tau23 = 1/dist3;
433 for (
auto k = tab1[fac3]-1; k < tab1[fac3+1]-1; k++)
434 if (tab2[k]-1 == fac3) coeff[k] += signe*flux3;
442 double dist3 =
xv(fac3,2)-
xv(fac1,2);
444 const double tau31 = 1/dist3;
450 double dist3 =
xv(fac3,2)-
xv(fac1,2);
452 const double tau32 = 1/dist3;
456 for (
auto k = tab1[fac3]-1; k < tab1[fac3+1]-1; k++)
457 if (tab2[k]-1 == fac3) coeff[k] += signe*flux4;
465 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
473void Op_Diff_VDF_Face_Axi_base::ajouter_contribution_aretes_mixtes_internes(
Matrice_Morse& matrice)
const
478 const int ndeb = le_dom_vdf->premiere_arete_mixte(), nfin = le_dom_vdf->nb_aretes();
479 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
488 const double R =
xv(fac3,0);
489 double d_teta =
xv(fac4,1) -
xv(fac3,1);
490 if (d_teta < 0) d_teta +=
deux_pi;
491 double tau21 = 1/(R*d_teta);
497 fill_coeff_matrice_morse(fac3,fac4,flux1,matrice);
500 const double coef_laplacien_axi = 0.5*db_diffusivite*tau21;
501 for (
auto k = tab1[fac1]-1; k < tab1[fac1+1]-1; k++)
504 for (
auto k = tab1[fac2]-1; k < tab1[fac2+1]-1; k++)
508 const double tau12 = 1/(
xv(fac2,0) -
xv(fac1,0));
512 fill_coeff_matrice_morse(fac1,fac2,flux1,matrice);
518 const double tau32 = 1/(
xv(fac4,2) -
xv(fac3,2));
522 fill_coeff_matrice_morse(fac3,fac4,flux2,matrice);
525 const double R =
xv(fac1,0);
526 double d_teta =
xv(fac2,1) -
xv(fac1,1);
527 if (d_teta < 0) d_teta +=
deux_pi;
528 const double tau23 = 1/(R*d_teta);
532 fill_coeff_matrice_morse(fac1,fac2,flux2,matrice);
538 const double tau31 = 1/(
xv(fac4,2) -
xv(fac3,2));
542 fill_coeff_matrice_morse(fac3,fac4,flux3,matrice);
545 const double tau13 = 1/(
xv(fac2,0) -
xv(fac1,0));
549 fill_coeff_matrice_morse(fac1,fac2,flux3,matrice);
554void Op_Diff_VDF_Face_Axi_base::ajouter_contribution(
const DoubleTab& inco,
Matrice_Morse& matrice )
const
556 ajouter_contribution_elem(inco,matrice);
557 if (
dimension == 3) ajouter_contribution_elem_3D(matrice);
558 ajouter_contribution_aretes_bords(matrice);
559 ajouter_contribution_aretes_mixtes_internes(matrice);
562void Op_Diff_VDF_Face_Axi_base::contribue_au_second_membre(DoubleTab& resu)
const
564 const int ndeb = le_dom_vdf->premiere_arete_bord(), nfin = ndeb + le_dom_vdf->nb_aretes_bord();
565 for (
int n_arete = ndeb; n_arete < nfin; n_arete++)
574 const int fac1 =
Qdm(n_arete,0), fac2 =
Qdm(n_arete,1), fac3 =
Qdm(n_arete,2), signe =
Qdm(n_arete,3);
575 const int ori1 =
orientation(fac1), ori3 =
orientation(fac3), rang1 = fac1 - le_dom_vdf->premiere_face_bord(), rang2 = fac2 - le_dom_vdf->premiere_face_bord();
576 double vit_imp, tps = inconnue->temps();
580 if (est_egal(inconnue->valeurs()(fac1), 0))
581 vit_imp = Champ_Face_get_val_imp_face_bord(tps, rang2, ori3, la_zcl_vdf.valeur());
583 vit_imp = Champ_Face_get_val_imp_face_bord(tps, rang1, ori3, la_zcl_vdf.valeur());
585 else vit_imp = 0.5*(Champ_Face_get_val_imp_face_bord(tps,rang1,ori3,la_zcl_vdf.valeur())+Champ_Face_get_val_imp_face_bord(tps,rang2,ori3,la_zcl_vdf.valeur()));
594 double dist3 =
xv(fac3,0)-
xv(fac1,0);
596 const double tau12 = (-vit_imp)/dist3;
602 double dist3 =
xv(fac3,0)-
xv(fac1,0);
604 const double tau13 = (-vit_imp)/dist3;
607 resu[fac3] += signe*flux1;
611 const double R =
xv(fac3,0);
612 double d_teta =
xv(fac3,1) -
xv(fac1,1);
613 if (d_teta < 0) d_teta +=
deux_pi;
614 double dist3 = R*d_teta;
619 const double tau21 = (-vit_imp)/dist3;
621 resu[fac3] += signe*flux2;
624 const double coef_laplacien_axi = 0.5*db_diffusivite*tau21;
630 const double tau23 = (-vit_imp)/dist3;
632 resu[fac3] += signe*flux3;
640 double dist3 =
xv(fac3,2) -
xv(fac1,2);
642 const double tau31 = (-vit_imp)/dist3;
648 double dist3 =
xv(fac3,2)-
xv(fac1,2);
650 const double tau32 = (-vit_imp)/dist3;
653 resu[fac3] += signe*flux4;
661 Cerr <<
"On a rencontre un type d'arete non prevu : [ num arete : " << n_arete <<
" ], [ type : " << n_type <<
" ]" << finl;
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
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 Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
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.
static constexpr double deux_pi
DoubleVect volumes_entrelaces
virtual double nu_mean_4_pts_(const int, const int) const =0
virtual double nu_(const int) const =0
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
double calculer_dt_stab() const override
Calcul dt_stab.
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
double calculer_dt_stab_(const Domaine_VDF &zone_VDF) const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.