16#include <Echange_contact_Correlation_VEF.h>
17#include <Domaine_Cl_dis_base.h>
18#include <Champ_front_calc.h>
19#include <communications.h>
20#include <Champ_Uniforme.h>
21#include <Probleme_base.h>
22#include <Milieu_base.h>
23#include <Schema_Comm.h>
24#include <Domaine_VEF.h>
42 if (
supp_discs.size() == 0)
supp_discs = { Nom(
"VEF"), Nom(
"EF"), Nom(
"EF_axi"), Nom(
"VEF_P1_P1"), Nom(
"VEFPreP1B"), Nom(
"PolyMAC_CDO"), Nom(
"PolyMAC_HFV"), Nom(
"PolyMAC_MPFA") };
49 param.lire_avec_accolades_depuis(is);
51 le_champ_front.typer(
"Champ_front_fonc");
60 param.
ajouter_condition(
"(value_of_dir_ge_0)_AND_(value_of_dir_le_2)",
"La direction doit etre 0, 1 ou 2 dans Echange_contact_Correlation_VDF");
91 param.
ajouter_non_std(
"emissivite_pour_rayonnement_entre_deux_plaques_quasi_infinies",(
this));
115 rho_T.setString(tmp);
128 else if (mot ==
"Dh")
137 else if (mot==
"surface")
157 else if (mot==
"emissivite_pour_rayonnement_entre_deux_plaques_quasi_infinies")
184 const int nb_faces_bord = ma_front_vf.
nb_faces();
187 const int nfin = ndeb + nb_faces_bord;
195 for (
int face=ndeb; face<nfin; face++)
197 int elem = face_voisins(face,0);
199 elem = face_voisins(face,1);
201 for(
int i=0; i<nb_comp; i++)
209 for (
int face=ndeb; face<nfin; face++)
211 int elem = face_voisins(face,0);
213 elem = face_voisins(face,1);
216 for(
int i=0; i<nb_comp; i++)
245 const int nb_faces_bord = ma_front_vf.
nb_faces();
247 h_solide.resize(nb_faces_bord,nb_comp);
251 for (
int i=0; i<
N; i++)
261 Tparoi.
resize(nb_faces_bord,nb_comp);
266 for (
int ii=0; ii<nb_faces_bord; ii++)
270 int elem = face_voisins(face,0);
272 elem = face_voisins(face,1);
280 else if (face3 == face)
283 Tint +=
pdt_scal(zvef,face,face2,elem,
dimension,1.)*Ts(face2) +
pdt_scal(zvef,face,face3,elem,
dimension,1.)*Ts(face3);
321 const int nb_voisins = joints.size();
322 ArrOfInt send_pe_list(nb_voisins);
324 for (i = 0; i < nb_voisins; i++)
325 send_pe_list[i] = joints[i].PEvoisin();
328 const double ymin =
coord(1);
329 const double ymax =
coord(
N-2);
330 const double Tmin =
T(1);
331 const double Tmax =
T(
N-2);
337 for (i = 0; i < nb_voisins; i++)
339 const int pe = send_pe_list[i];
340 schema_comm.
send_buffer(pe) << ymin << ymax << Tmin << Tmax;
343 for (i = 0; i < nb_voisins; i++)
345 const int pe = send_pe_list[i];
346 double ymin_voisin, ymax_voisin, Tmin_voisin, Tmax_voisin;
347 schema_comm.
recv_buffer(pe) >> ymin_voisin >> ymax_voisin >> Tmin_voisin >> Tmax_voisin;
348 if (ymax_voisin < ymin)
349 T(0) =
T_CL0 = 0.5 * (Tmax_voisin + Tmin);
350 else if (ymin_voisin > ymax)
351 T(
N-1) =
T_CL1 = 0.5 * (Tmin_voisin + Tmax);
354 Cerr <<
"Erreur dans Echange_contact_Correlation_VEF::calculer_CL() (decoupage incompatible ?)";
366 for (
int i=0; i<
N; i++)
369 mu_T.setVar(
"T",
T(i));
399 const int nb_faces_bord = ma_front_vf.
nb_faces();
406 for(
int iface=0; iface<nb_faces_bord; iface++)
408 int face = ndeb+iface;
410 int elem = face_voisins(face,0);
412 elem = face_voisins(face,1);
415 for (
int i=0; i<
N; i++)
426 const DoubleTab& xv = ma_zvef.
xv();
431 const int nb_faces_bord = ma_front_vf.
nb_faces();
457 for(
int i=1; i<
N-1; i++)
464 for(
int i=0; i<nb_faces_bord; i++)
466 double min=std::fabs(xv(i+ndeb,
dir)-
coord(1));
469 for (
int j=2; j<
N-1; j++)
471 if ((tmp=std::fabs(xv(i+ndeb,
dir)-
coord(j))) < min)
485 const double precision = 1.e-6;
486 const int MAX_FACES_PATCH = 500;
487 int nb_patches = 2*(
N-2);
488 patches_rayo.resize(nb_patches,MAX_FACES_PATCH);
489 nb_faces_patch.resize(nb_patches);
490 IntVect traite(nb_faces_bord);
491 correspondance_fluide_patch.resize(
N,2);
492 correspondance_face_patch.resize(nb_faces_bord);
494 correspondance_fluide_patch=-1;
495 int compteur_patches = 0;
496 for(
int i=0; i<nb_faces_bord; i++)
503 if (compteur_patches==nb_patches)
505 Cerr <<
"Erreur dans Echange_contact_Correlation_VEF::initialiser" << finl;
506 Cerr <<
"Le nombre de patches est depasse." << finl;
507 Cerr <<
"Contacter le support TRUST." << finl;
510 patches_rayo(compteur_patches,0) = i;
511 correspondance_face_patch(i)=compteur_patches;
512 if (correspondance_fluide_patch(face_corresp,0) == -1)
513 correspondance_fluide_patch(face_corresp,0) = compteur_patches;
515 correspondance_fluide_patch(face_corresp,1) = compteur_patches;
517 int s0 = face_sommets(ndeb+i,0);
518 int s1 = face_sommets(ndeb+i,1);
519 int s2 = face_sommets(ndeb+i,2);
524 v01[idim] = coord_som(s1,idim)-coord_som(s0,idim);
525 v02[idim] = coord_som(s2,idim)-coord_som(s0,idim);
528 normale[0] = v01[1]*v02[2]-v01[2]*v02[1];
529 normale[1] = -v01[0]*v02[2]+v01[2]*v02[0];
530 normale[2] = v01[0]*v02[1]-v01[1]*v02[0];
532 for(
int j=0; j<nb_faces_bord; j++)
536 int sj_0 = face_sommets(ndeb+j,0);
540 pscal += normale[idim]*(coord_som(sj_0,idim)-coord_som(s0,idim));
542 if (std::fabs(pscal) < precision)
545 if (compteur_face==MAX_FACES_PATCH)
547 Cerr <<
"Erreur dans Echange_contact_Correlation_VEF::initialiser" << finl;
548 Cerr <<
"Le nombre maximal de faces de patches est depasse." << finl;
549 Cerr <<
"Contacter le support TRUST." << finl;
552 patches_rayo(compteur_patches,compteur_face++) = j;
553 correspondance_face_patch(j)=compteur_patches;
557 nb_faces_patch(compteur_patches) = compteur_face;
565 for (
int i=0; i<
N; i++)
573 for (
int i=1; i<
N-1; i++)
588 for (
int i=0; i<
N; i++)
605 const int sgn = (
debit>0) ? 1 : -1;
615 for (i=1; i<
N-1; i++)
617 const double dtrhoCp = dt/
rho(i)/
Cp;
623 ma(i)=1+dtrhoCp*(sgn*
Cp*
debit/dz1+2*(l1/dz1+l2/dz2)/(dz1+dz2));
625 sm(i) =
T(i)+dtrhoCp*
Qvol(i);
627 mc(i) = dtrhoCp*(0.5*(1-sgn)*
Cp*
debit/dz1-2*l1/dz1/(dz1+dz2));
629 mb(i-1) = dtrhoCp*(-2*l2/dz2/(dz1+dz2));
630 mb(i-1) += dtrhoCp*(-0.5*(1+sgn)*
Cp*
debit/dz1);
643void Echange_contact_Correlation_VEF_sauvegarder(
const Nom& filename,
const double temps,
const DoubleVect& T)
645 const int canal = 56;
649 Process::Journal() <<
"Echange_contact_Correlation_VEF::mettre_a_jour: sauvegarde dans le fichier "
652 file <<
"Temps = " << temps << finl;
655 for (
int pe = 0; pe < nproc; pe++)
657 recevoir(tmp, pe, canal);
658 const int sz = tmp.size();
659 for (
int i = 0; i < sz; i++)
661 file <<
"T(" << count <<
")\t = " << tmp[i] << finl;
668 envoyer(T, 0, canal);
672void Echange_contact_Correlation_VEF_reprendre(
const Nom& filename,
const double temps, DoubleVect& T)
674 const int canal = 56;
678 Cerr <<
"Echange_contact_Correlation_VEF::mettre_a_jour: reprise dans le fichier "
682 file.set_check_types(1);
683 Nom bidon1, bidon2, temps_lu;
685 file >> bidon1 >> bidon2 >> temps_lu;
686 if (bidon1 !=
"Temps" || bidon2 !=
"=" || temps_lu != temps)
688 Cerr <<
"Erreur dans Echange_contact_Correlation_VEF::mettre_a_jour() :\n"
689 <<
" On attendait l'entet suivante dans le fichier " << filename
690 <<
"\n Temps = " << temps << finl;
691 if (temps_lu != temps)
693 Cerr <<
"Le temps indique dans le fichierest different du temps de reprise du calcul " << temps
694 <<
"Vous ne pouvez pas faire de reprise pour la correlation.\n"
695 <<
"Supprimez dans la correlation le mot clef \"Reprise\".\n"
696 <<
"La phase transitoire du calcul sera fausse, mais l'etat stationnaire sera juste." << finl;
702 for (
int pe = 0; pe < nproc; pe++)
704 recevoir(tmp, pe, canal);
705 const int sz = tmp.size();
706 for (
int i = 0; i < sz; i++)
709 file >> bidon1 >> bidon2 >> valeur;
712 envoyer(tmp, pe, canal);
719 envoyer(T, 0, canal);
720 recevoir(T, 0, canal);
732 Fichier_sauv_nom+=
"_";
734 Fichier_sauv_nom+=
".sauv";
739 Echange_contact_Correlation_VEF_reprendre(Fichier_sauv_nom, temps,
T);
751 for (
int i=0; i<
N; i++)
756 const int taille =
h_solide.dimension(0);
764 const double sigma = 5.67e-8;
766 int nb_patches=2*(
N-2);
769 IntVect patch_calcule(nb_patches);
771 for (
int ii=0; ii<taille; ii++)
775 int elem = face_voisins(face,0);
777 elem = face_voisins(face,1);
785 else if (face3 == face)
788 Tint +=
pdt_scal(zvef,face,face2,elem,
dimension,1.)*Ts(face2) +
pdt_scal(zvef,face,face3,elem,
dimension,1.)*Ts(face3);
800 int patch_courant = 0;
803 patch_courant = correspondance_face_patch(ii);
804 if (!patch_calcule(patch_courant))
807 if (patch_en_face == patch_courant)
811 double surf1_tot = 0.;
812 for (
int face_patch=0; face_patch<nb_faces_patch(patch_courant); face_patch++)
814 int f = ndeb+patches_rayo(patch_courant,face_patch);
815 double surf = face_surfaces(f);
816 Tp14 += surf*pow(Ts(f),4);
821 double surf2_tot = 0.;
822 for (
int face_patch=0; face_patch<nb_faces_patch(patch_en_face); face_patch++)
824 int f = ndeb+patches_rayo(patch_en_face,face_patch);
825 double surf = face_surfaces(f);
826 Tp24 += surf*pow(Ts(f),4);
831 flux_radiatif(patch_courant) = sigma*emissivite/(2-emissivite)*(Tp24-Tp14);
832 patch_calcule(patch_courant) = 1;
837 Cout << ma_front_vf.
le_nom() <<
" patch " << patch_courant;
838 Cout <<
" : flux radiatif=sigma*eps/(2-eps)*(TP2^4-TP1^4)= " <<
flux_radiatif(patch_courant) <<
" W/m2";
839 Cout <<
" TP2= " << pow(Tp24,0.25) <<
" K";
840 Cout <<
" TP1= " << pow(Tp14,0.25) <<
" K" << finl;
852 Echange_contact_Correlation_VEF_sauvegarder(Fichier_sauv_nom, temps,
T);
868 static const double epsilon = 1.e-9;
870 modf(temps_courant/
dt_impr + epsilon, &i);
871 modf((temps_courant-dt)/
dt_impr + epsilon, &j);
887 envoyer(
coord,ME,0,ME);
891 envoyer(
rho,ME,0,ME);
894 envoyer(
Qvol,ME,0,ME);
895 envoyer(
vol,ME,0,ME);
902 nom_bord+=
Nom(temps);
906 fic.
setf(ios::scientific);
908 fic <<
"# X T U h rho mu lambda Q[W]";
909 if (avec_rayo) fic <<
" Flux_radiatif(W/m2)";
912 for (
int p=0; p<nbproc; p++)
914 DoubleVect coord_tmp;
920 DoubleVect lambda_tmp;
923 DoubleVect flux_radiatif_tmp;
925 recevoir(coord_tmp,p,0,p);
926 recevoir(T_tmp,p,0,p);
927 recevoir(U_tmp,p,0,p);
928 recevoir(h_tmp,p,0,p);
929 recevoir(rho_tmp,p,0,p);
930 recevoir(mu_tmp,p,0,p);
931 recevoir(lambda_tmp,p,0,p);
932 recevoir(Qvol_tmp,p,0,p);
933 recevoir(vol_tmp,p,0,p);
934 recevoir(flux_radiatif_tmp,p,0,p);
936 for (
int i=0; i<coord_tmp.
size(); i++)
938 fic << coord_tmp(i) <<
" \t" << T_tmp(i) <<
" \t" << U_tmp(i) <<
" \t" << h_tmp(i) <<
" \t" ;
939 fic << rho_tmp(i) <<
" \t" << mu_tmp(i) <<
" \t" << lambda_tmp(i) <<
" \t" << Qvol_tmp(i)*vol_tmp(i);
940 if (avec_rayo && i>0 && i<coord_tmp.
size()-1) fic <<
" \t" << flux_radiatif_tmp(i-1);
942 Qt+=Qvol_tmp(i)*vol_tmp(i);
946 fic <<
"# Q total[W] = " << Qt << finl;
954 nom_bord+=
Nom(temps);
958 fic.
setf(ios::scientific);
960 fic <<
"# X T U h rho mu lambda Q[W]";
961 if (avec_rayo) fic <<
" Flux_radiatif(W/m2)";
964 for (
int i =0; i<
N; i++)
968 if (avec_rayo && i>0 && i<
N-1) fic <<
" \t" <<
flux_radiatif(i-1);
972 fic <<
"# Q total[W] = " << Qt << finl;
983 int num_elem,
int dim,
double diffu)
991 pscal = sqrt(std::fabs(pscal));
993 return (pscal*diffu)/le_dom.
volumes(num_elem);
1000 int num_elem,
int dim,
double diffu)
1010 if ( (face_voisinsF(num_face,0) == face_voisinsF(num2,0)) ||
1011 (face_voisinsF(num_face,1) == face_voisinsF(num2,1))) pscal = -pscal;
1013 return (pscal*diffu)/le_dom.
volumes(num_elem);
1023 pscal = sqrt(pscal);
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
std::vector< Nom > supp_discs
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de la condition aux limites.
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
std::vector< Motcle > app_domains
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
const DoubleTab_t & coord_sommets() const
virtual const DoubleVect & face_surfaces() const
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
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
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
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 Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
virtual int nb_comp() const
int num_premiere_face() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
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.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
static bool is_parallel()
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static int me()
renvoie mon rang dans le groupe de communication 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),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
void echange_taille_et_messages() const
Cette methode lance l'echange de donnees entre tous les processeurs.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
void begin_comm() const
Reserve les buffers de comm pour une nouvelle communication.
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
double temps_courant() const
Renvoie le temps courant.
double temps_max() const
Renvoie une reference sur le temps maximum.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
int nb_pas_dt_max() const
Renvoie une reference sur le nombre de pas maxi.
static void resoudre(const DoubleVect &ma, const DoubleVect &mb, const DoubleVect &mc, const DoubleVect &sm, DoubleVect &vi, int M)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
classe Temperature_imposee_paroi Impose la temperature de la paroi dans une equation de type Convecti...