16#include <Traitement_particulier_NS_Brech_VEF.h>
17#include <Navier_Stokes_std.h>
18#include <Fluide_Incompressible.h>
19#include <Probleme_base.h>
21#include <Periodique.h>
22#include <Champ_P1NC.h>
64 Motcle accouverte =
"{" , accfermee =
"}" ;
71 les_mots[0] =
"calcul_flux";
72 les_mots[1] =
"Richardson";
73 les_mots[2] =
"Pression_porosite";
77 if (motbidon == accouverte)
81 while(motlu != accfermee)
84 int rang=les_mots.
search(motlu);
90 if (motbidon != accouverte)
92 Cerr <<
" on attent { et pas " << motbidon << finl ;
97 C_trans.resize(nb,3) ;
102 delta_teta.resize(nb);
104 for (
int i=0; i<nb; i++)
107 Cerr <<
" Lire plan de coupe en x " << finl;
127 is >> delta_teta(i) ;
133 if (motbidon != accfermee)
135 Cerr <<
" on attent } et pas " << motbidon << finl ;
142 Cerr <<
" Lire Richardson " << finl;
146 const int nb_faces = domaine_VEF.
nb_faces() ;
148 ch_ri.associer_domaine_dis_base(zdis);
149 ch_ri.nommer(
"Richardson");
150 ch_ri.fixer_nb_comp(1);
151 ch_ri.fixer_nb_valeurs_nodales(nb_faces);
152 ch_ri.fixer_unite(
"-");
160 Cerr <<
" Lire Pression_porosite " << finl;
164 const int nb_elem = domaine_VEF.
nb_elem() ;
166 ch_p.associer_domaine_dis_base(zdis);
167 ch_p.nommer(
"Pression_porosite");
168 ch_p.fixer_nb_comp(1);
169 ch_p.fixer_nb_valeurs_nodales(nb_elem);
170 ch_p.fixer_unite(
"Pa.m3/kg");
177 if (motlu == accfermee)
183 Cerr <<
"Erreur dans la lecture de Traitement_particulier_Brech_VEF" << finl;
184 Cerr <<
"Les mots cles possibles sont : calcul_flux ou Richardson " << finl;
185 Cerr <<
"Vous avez lu :" << motlu << finl;
193 if (motlu != accfermee)
195 Cerr <<
"Erreur dans la lecture de Traitement_particulier_NS_Brech_VEF 1 ";
196 Cerr <<
"On attendait une } et pas " << motlu << finl;
222 if (c_flux == 1 ) post_traitement_particulier_calcul_flux() ;
223 if (c_Richardson == 1 ) post_traitement_particulier_Richardson() ;
224 if (c_pression == 1 ) post_traitement_particulier_calcul_pression() ;
227void Traitement_particulier_NS_Brech_VEF::post_traitement_particulier_calcul_flux()
230 for (
int ii =0; ii<nb; ii++)
233 DoubleTab coord_trace (taille,3) ;
234 DoubleTab Surf_trace(taille,3) ;
235 DoubleTab valeurs_(taille,3) ;
250 DoubleTab temper_(taille,1);
251 DoubleTab rho_(taille,1) ;
252 DoubleTab cp_(taille,1) ;
256 double dr = ( r_out(ii) - r_int(ii) ) /delta_r(ii) ;
257 double dteta = 2.*3.14159/delta_teta(ii) ;
259 taille = (int)(delta_r(ii)) * (int)(delta_teta(ii)) ;
260 coord_trace.resize(taille,3) ;
261 Surf_trace.resize(taille,3) ;
262 valeurs_.resize(taille,3);
265 rho_.resize(taille,1) ;
266 temper_.resize(taille,1);
267 cp_.resize(taille,1);
274 double anglex = acos(C_trans(ii,0)/sqrt( C_trans(ii,0) * C_trans(ii,0)
275 + C_trans(ii,1) * C_trans(ii,1)
276 + C_trans(ii,2) * C_trans(ii,2) )) ;
281 for ( rad = (r_int(ii)+(dr/2.)) ; rad < r_out(ii) ; rad += dr )
282 for (teta = dteta/2. ; teta < 2.*3.14159 ; teta += dteta )
288 a = - rad * cos(teta) * sin(anglex) ;
289 b = rad * cos(teta) * cos(anglex) ;
291 c = rad * sin(teta) ;
292 coord_trace(i,0) = a + R_loc(ii,0) ;
293 coord_trace(i,1) = b + R_loc(ii,1) ;
294 coord_trace(i,2) = c + R_loc(ii,2) ;
295 double ra = (dr/2.+rad) * (dr/2.+rad) ;
296 double ri = (rad - (dr/2.))* (rad - (dr/2.)) ;
297 Surf_trace(i,0) = 3.14159 * (ra -ri) / delta_teta(ii) ;
300 double flux_pos = 0. ;
301 double flux_neg = 0. ;
304 double tempmoy = 0. ;
305 double massvol = 0. ;
306 double fluxE_pos = 0. ;
307 double fluxE_neg = 0. ;
311 const Domaine_dis_base& zdis=mon_equation->inconnue().domaine_dis_base();
312 const Domaine& domaine=zdis.
domaine();
313 IntVect les_polys(coord_trace.dimension(0));
314 domaine.chercher_elements(coord_trace, les_polys);
315 mon_equation->inconnue().valeur_aux_elems(coord_trace, les_polys, valeurs_);
318 mon_equation->fluide().masse_volumique().valeur_aux_elems(coord_trace, les_polys, rho_);
319 mon_equation->fluide().capacite_calorifique().valeur_aux_elems(coord_trace, les_polys, cp_);
324 for (i=0 ; i<taille; i++)
325 if (les_polys(i)>=domaine.nb_elem())
336 for (i=0 ; i<taille; i++ )
341 tempmoy += temper_(i) ;
342 flux = ( valeurs_(i,0)*cos(anglex) + valeurs_(i,1)*sin(anglex) )
343 * Surf_trace(i,0)*rho_(i) ;
344 fluxE = ( valeurs_(i,0)*cos(anglex) + valeurs_(i,1)*sin(anglex) )
345 * Surf_trace(i,0)*rho_(i)*cp_(i)*temper_(i) ;
348 if ( flux > 0. ) flux_pos += flux ;
349 if ( flux < 0. ) flux_neg += flux ;
350 if ( fluxE > 0. ) fluxE_pos += fluxE ;
351 if ( fluxE < 0. ) fluxE_neg += fluxE ;
362 Cout <<
" ----------------------- " << finl ;
363 Cout <<
" Traitement_particulier flux en x (Plan Oyz) a: "<< R_loc(ii,0) <<
" "
364 << R_loc(ii,1) <<
" "
365 << R_loc(ii,2) << finl ;
366 Cout <<
" angle de la normale du plan par rapport a x = " << anglex/3.1415*180. <<
" (deg) " << finl ;
367 Cout <<
" flux_pos = " << flux_pos <<
" flux_neg = " << flux_neg <<
" (kg/s) " << finl ;
368 Cout <<
" fluxEnthalpique_pos = " << fluxE_pos <<
" fluxEnthalpique_neg = " << fluxE_neg <<
" (Watts) " << finl ;
369 Cout <<
" masse volumique moyenne sur le plan de coupe : " << massvol << finl ;
370 Cout <<
" temperature moyenne sur le plan de coupe : " << tempmoy << finl ;
376void Traitement_particulier_NS_Brech_VEF::post_traitement_particulier_Richardson()
378 const Domaine_dis_base& zdis=mon_equation->domaine_dis();
379 const Domaine_VEF& domaine_VEF=ref_cast(Domaine_VEF, zdis);
380 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF,mon_equation->domaine_Cl_dis() );
383 OBS_PTR(Champ_Inc_base) l_inco ;
385 const Probleme_base& pb = mon_equation->probleme();
392 l_inco = ref_cast(Champ_Inc_base, rch1.valeur()) ;
394 const Champ_Inc_base& temp = l_inco.valeur();
395 const DoubleTab& temperature = temp.
valeurs();
397 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
398 const DoubleVect& gravite = mon_equation->fluide().gravite().valeurs();
399 const DoubleVect& beta = mon_equation->fluide().beta_t().valeurs();
401 const int nb_faces = domaine_VEF.
nb_faces();
403 DoubleVect P(nb_faces) ;
404 DoubleVect G(nb_faces) ;
406 DoubleVect beta_i(nb_faces) ;
409 calculer_terme_production_K( domaine_VEF, domaine_Cl_VEF,
412 calculer_terme_destruction_K( domaine_VEF, domaine_Cl_VEF,
416 DoubleVect& richard_loc =
ch_ri.valeurs();
419 for (
int i=0; i<nb_faces; i++ )
421 if (std::fabs (P[i]) > 1.e-9 )richard_loc [i] = -G[i]/P[i] ;
422 else richard_loc [i] = 0. ;
425 ch_ri.changer_temps(mon_equation->inconnue().temps());
429void Traitement_particulier_NS_Brech_VEF::post_traitement_particulier_calcul_pression()
431 const Domaine_VEF& zvef=ref_cast(Domaine_VEF, mon_equation->domaine_dis());
432 const DoubleVect& porosite_face = mon_equation->milieu().porosite_face();
435 Operateur_Div divergence = mon_equation->operateur_divergence();
436 Operateur_Grad gradient = mon_equation->operateur_gradient();
437 SolveurSys solveur_pression_ = mon_equation->solveur_pression();
439 DoubleTab& pression=mon_equation->pression().valeurs();
440 DoubleTab& vitesse=mon_equation->vitesse().valeurs();
444 DoubleTab gradP(vitesse);
445 DoubleTab inc_pre(pression);
450 DoubleTab secmem(pression);
452 gradient.calculer(mon_equation->pression().valeurs(),gradP);
456 mon_equation->solv_masse().appliquer(gradP);
458 DoubleTab grad_temp(vitesse);
459 for(i=0; i<nb_face; i++)
462 grad_temp(i,comp) = gradP(i,comp)/porosite_face(i);
465 divergence.calculer(grad_temp, secmem);
467 solveur_pression_.
resoudre_systeme(mon_equation->matrice_pression().valeur(),secmem, inc_pre);
469 DoubleVect& la_pression_porosite =
ch_p.valeurs();
470 la_pression_porosite = inc_pre ;
471 Cerr <<
"la_pression " << mon_equation->pression().valeurs() << finl;
472 Cerr <<
"ch_p.valeurs() " <<
ch_p.valeurs() << finl;
483void Traitement_particulier_NS_Brech_VEF::
486 const DoubleTab& vit)
const
506 int nb_elem = domaine_VEF.
nb_elem();
508 const IntTab& face_voisins = domaine_VEF.
face_voisins();
510 const DoubleVect& volumes = domaine_VEF.
volumes();
514 int fac=0, poly1, poly2;
515 int nb_faces_ = domaine_VEF.
nb_faces();
549 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
552 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
554 int nfin = ndeb + le_bord.
nb_faces();
556 if (sub_type(Periodique,la_cl.valeur()))
558 for (fac=ndeb; fac<nfin; fac++)
560 poly1 = face_voisins(fac,0);
561 poly2 = face_voisins(fac,1);
562 double a=volumes(poly1)/(volumes(poly1)+volumes(poly2));
563 double b=volumes(poly2)/(volumes(poly1)+volumes(poly2));
565 du_dx =a*gradient_elem(poly1,0,0) + b*gradient_elem(poly2,0,0);
566 du_dy =a*gradient_elem(poly1,0,1) + b*gradient_elem(poly2,0,1);
567 dv_dx =a*gradient_elem(poly1,1,0) + b*gradient_elem(poly2,1,0);
568 dv_dy =a*gradient_elem(poly1,1,1) + b*gradient_elem(poly2,1,1);
572 P(fac) = ( 2*(du_dx *du_dx + dv_dy *dv_dy) + ((du_dy+dv_dx)*(du_dy+dv_dx)));
576 du_dz=a*gradient_elem(poly1,0,2) + b*gradient_elem(poly2,0,2);
577 dv_dz=a*gradient_elem(poly1,1,2) + b*gradient_elem(poly2,1,2);
578 dw_dx=a*gradient_elem(poly1,2,0) + b*gradient_elem(poly2,2,0);
579 dw_dy=a*gradient_elem(poly1,2,1) + b*gradient_elem(poly2,2,1);
580 dw_dz=a*gradient_elem(poly1,2,2) + b*gradient_elem(poly2,2,2);
584 P(fac) = (2*( du_dx*du_dx + dv_dy*dv_dy + dw_dz*dw_dz )
585 + ( (du_dy+dv_dx)*(du_dy+dv_dx)
586 + (du_dz+dw_dx)*(du_dz+dw_dx)
587 + (dw_dy+dv_dz)*(dw_dy+dv_dz)));
593 for (fac=ndeb; fac<nfin; fac++)
595 poly1 = face_voisins(fac,0);
597 du_dx=gradient_elem(poly1,0,0);
598 du_dy=gradient_elem(poly1,0,1);
599 dv_dx=gradient_elem(poly1,1,0);
600 dv_dy=gradient_elem(poly1,1,1);
602 P(fac) = ( 2*(du_dx*du_dx + dv_dy*dv_dy) + ((du_dy+dv_dx)*(du_dy+dv_dx)));
607 du_dz=gradient_elem(poly1,0,2);
608 dv_dz=gradient_elem(poly1,1,2);
609 dw_dx=gradient_elem(poly1,2,0);
610 dw_dy=gradient_elem(poly1,2,1);
611 dw_dz=gradient_elem(poly1,2,2);
615 P(fac) = (2*( du_dx*du_dx + dv_dy*dv_dy + dw_dz*dw_dz )
616 + ( (du_dy+dv_dx)*(du_dy+dv_dx)
617 + (du_dz+dw_dx)*(du_dz+dw_dx)
618 + (dw_dy+dv_dz)*(dw_dy+dv_dz)));
627 for (; fac<nb_faces_; fac++)
629 poly1 = face_voisins(fac,0);
630 poly2 = face_voisins(fac,1);
631 double a=volumes(poly1)/(volumes(poly1)+volumes(poly2));
632 double b=volumes(poly2)/(volumes(poly1)+volumes(poly2));
634 du_dx=a*gradient_elem(poly1,0,0) + b*gradient_elem(poly2,0,0);
635 du_dy=a*gradient_elem(poly1,0,1) + b*gradient_elem(poly2,0,1);
636 dv_dx=a*gradient_elem(poly1,1,0) + b*gradient_elem(poly2,1,0);
637 dv_dy=a*gradient_elem(poly1,1,1) + b*gradient_elem(poly2,1,1);
641 P(fac) = ( 2*(du_dx*du_dx + dv_dy*dv_dy) + ((du_dy+dv_dx)*(du_dy+dv_dx)));
645 du_dz=a*gradient_elem(poly1,0,2) + b*gradient_elem(poly2,0,2);
646 dv_dz=a*gradient_elem(poly1,1,2) + b*gradient_elem(poly2,1,2);
647 dw_dx=a*gradient_elem(poly1,2,0) + b*gradient_elem(poly2,2,0);
648 dw_dy=a*gradient_elem(poly1,2,1) + b*gradient_elem(poly2,2,1);
649 dw_dz=a*gradient_elem(poly1,2,2) + b*gradient_elem(poly2,2,2);
653 P(fac) = (2*( du_dx*du_dx + dv_dy*dv_dy + dw_dz*dw_dz )
654 + ( (du_dy+dv_dx)*(du_dy+dv_dx)
655 + (du_dz+dw_dx)*(du_dz+dw_dx)
656 + (dw_dy+dv_dz)*(dw_dy+dv_dz)));
662void Traitement_particulier_NS_Brech_VEF::
663calculer_terme_destruction_K(
const Domaine_VEF& domaine_VEF,
665 DoubleVect& G,
const DoubleTab& temper,
666 const DoubleVect& beta,
const DoubleVect& gravite)
const
674 int nb_elem = domaine_VEF.
nb_elem();
675 int nb_faces= domaine_VEF.
nb_faces();
677 DoubleTrav gradient_elem(nb_elem,
dimension);
684 const IntTab& face_voisins = domaine_VEF.
face_voisins();
685 const DoubleTab& face_normales = domaine_VEF.
face_normales();
687 const DoubleVect& volumes = domaine_VEF.
volumes();
688 int nb_faces_ = domaine_VEF.
nb_faces();
698 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
701 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
703 int nfin = ndeb + le_bord.
nb_faces();
705 if (sub_type(Periodique,la_cl.valeur()))
707 for (fac=ndeb; fac<nfin; fac++)
709 elem1=face_voisins(fac,0);
710 elem2=face_voisins(fac,1);
713 gradient_elem(elem1,i) += 0.5*face_normales(fac,i)*temper(fac);
714 gradient_elem(elem2,i) -= 0.5*face_normales(fac,i)*temper(fac);
720 for (
int fac2=ndeb; fac2<nfin; fac2++)
722 elem1=face_voisins(fac2,0);
724 gradient_elem(elem1,i) += face_normales(fac2,i)*temper(fac2);
730 for (fac = premiere_face_entier ; fac<nb_faces_; fac++)
732 elem1=face_voisins(fac,0);
733 elem2=face_voisins(fac,1);
736 gradient_elem(elem1,i) += face_normales(fac,i)*temper(fac);
737 gradient_elem(elem2,i) -= face_normales(fac,i)*temper(fac);
741 for (
int elem=0; elem<nb_elem; elem++)
743 gradient_elem(elem,i) /= volumes(elem);
749 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
752 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
754 int nfin = ndeb + le_bord.
nb_faces();
756 if (sub_type(Periodique,la_cl.valeur()))
758 for (fac=ndeb; fac<nfin; fac++)
760 elem1 = face_voisins(fac,0);
761 elem2 = face_voisins(fac,1);
762 double a=volumes(elem1)/(volumes(elem1)+volumes(elem2));
763 double b=volumes(elem2)/(volumes(elem1)+volumes(elem2));
765 u_teta(fac,i)=a*beta(elem1)*gradient_elem(elem1,i)
766 +b*beta(elem2)*gradient_elem(elem2,i);
771 for (fac=ndeb; fac< nfin; fac++)
773 elem1 = face_voisins(fac,0);
775 u_teta(fac,i)=beta(elem1)*gradient_elem(elem1,i);
780 for (; fac<nb_faces_; fac++)
782 elem1 = face_voisins(fac,0);
783 elem2 = face_voisins(fac,1);
784 double a=volumes(elem1)/(volumes(elem1)+volumes(elem2));
785 double b=volumes(elem2)/(volumes(elem1)+volumes(elem2));
787 u_teta(fac,i)=a*beta(elem1)*gradient_elem(elem1,i)+b*beta(elem2)*gradient_elem(elem2,i);
793 for (fac=0; fac< nb_faces_; fac++)
796 G[fac] = gravite(0)*u_teta(fac,0) + gravite(1)*u_teta(fac,1);
798 G[fac] = gravite(0)*u_teta(fac,0) + gravite(1)*u_teta(fac,1) + gravite(2)*u_teta(fac,2);
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
static DoubleTab & calcul_gradient(const DoubleTab &, DoubleTab &, const Domaine_Cl_VEF &)
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
provoque une erreur ! doit etre surchargee par les classes derivees
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int nb_faces() const
renvoie le nombre global de faces.
virtual double face_normales(int face, int comp) const
double volumes(int i) const
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
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.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
int num_premiere_face() const
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
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.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Champ_base & get_champ(const Motcle &nom) const override
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Classe de base des flux de sortie.
classe Traitement_particulier_Brech_VEF Cette classe permet de faire les traitements particuliers
Entree & lire(Entree &) override
Traitement_particulier_NS_Brech_VEF()
void post_traitement_particulier() override
classe Traitement_particulier_VEF Cette classe permet de ne faire aucyun traitement particulier
OBS_PTR(Navier_Stokes_std) mon_equation
Champs_compris champs_compris_