16#include <Echange_contact_Correlation_VDF.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 <Domaine_VDF.h>
24#include <Conduction.h>
44 param.lire_avec_accolades_depuis(is);
46 le_champ_front.typer(
"Champ_front_fonc");
48 h_imp_.typer(
"Champ_front_fonc");
49 h_imp_->fixer_nb_comp(1);
57 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");
104 rho_T.setString(tmp);
117 else if (mot==
"volume")
171 for (
int i=0; i<
N; i++)
174 DoubleTab& mon_h= h_imp_->valeurs();
179 const int nb_faces_bord = ma_front_vf.
nb_faces();
181 Text_valeurs.
resize(nb_faces_bord,1);
183 mon_h.
resize(nb_faces_bord,1);
185 for (
int ii=0; ii<nb_faces_bord; ii++)
206 DoubleVect y_envoye(2);
207 DoubleVect y_recu(2);
208 y_envoye(0) =
coord(1);
213 const int nb_voisins = joints.size();
218 for (
int i=0; i<nb_voisins; i++)
220 int mon_voisin = joints[i].PEvoisin();
221 Cerr <<
" Echange_contact_Correlation_VDF::init_tab_echange() A verifier pour envoi blocant" << finl;
223 envoyer(y_envoye,ME,mon_voisin,ME);
225 recevoir(y_recu,mon_voisin,ME,mon_voisin);
226 if (y_recu(1)<
coord(1))
230 else if (y_recu(0)>
coord(
N-2))
243 for (
int i=0; i<
N; i++)
246 mu_T.setVar(
"T",
T(i));
275 const int nb_faces_bord = ma_front_vf.
nb_faces();
279 DoubleTab& Ts = inco.
valeurs();
280 DoubleTab& mon_h= h_imp_->valeurs();
284 for(
int iface=0; iface<nb_faces_bord; iface++)
287 int elem = face_voisins(ndeb+iface,0);
289 elem = face_voisins(ndeb+iface,1);
290 Qvol(corresp)+=mon_h(iface,0)*(Ts(elem)-
T(corresp))*surfaces(ndeb+iface);
292 for (
int i=0; i<
N; i++)
305 const int nb_faces_bord = ma_front_vf.
nb_faces();
307 IntVect face_triee(nb_faces_bord);
308 const DoubleTab& xv = ma_zvdf.
xv();
314 for(i=0; i<nb_faces_bord; i++)
315 face_triee(i) = ndeb+i;
317 for(i=1; i<nb_faces_bord; i++)
321 while ( j>=0 && xv(face_triee(j),
dir)>xv(tmp,
dir))
323 face_triee(j+1) = face_triee(j);
326 face_triee(j+1) = tmp;
334 for(i=1; i<nb_faces_bord; i++)
336 if (xv(face_triee(i),
dir) != xv(face_triee(i-1),
dir))
357 surf(0) = surf(
N-1) = 0.;
358 for(
int iface=0; iface<nb_faces_bord; iface++)
361 surf(corresp)+=surfaces(ndeb+iface);
362 coord(corresp) = xv(ndeb+iface,
dir);
366 for (i=1; i<
N-1; i++)
395 const int nb_voisins = joints.size();
397 DoubleVect les_cl_envoyees(2);
398 DoubleVect les_cl_recues(2);
399 les_cl_envoyees(0) =
T(1);
400 les_cl_envoyees(1) =
T(
N-2);
404 for (
int i=0; i<nb_voisins; i++)
406 int mon_voisin = joints[i].PEvoisin();
408 Cerr <<
" Echange_contact_Correlation_VDF::calculer_CL() A verifier pour envoi blocant" << finl;
410 envoyer(les_cl_envoyees,ME,mon_voisin,ME);
412 recevoir(les_cl_recues,mon_voisin,ME,mon_voisin);
413 if (
tab_ech(mon_voisin,ME) == 1)
415 T_CL0 = 0.5*(les_cl_recues(1)+
T(1));
418 else if (
tab_ech(mon_voisin,ME) == 0)
420 T_CL1 = 0.5*(les_cl_recues(0)+
T(
N-2));
425 Cerr <<
"Erreur de communication entre les processeurs " <<ME<<
" et " <<mon_voisin << finl;
426 Cerr <<
"dans Echange_contact_Correlation_VDF::calculer_CL" << finl;
427 if (
Process::is_parallel()) Cerr <<
"Verifier que votre decoupage est bien en tranches selon l'axe du modele 1D." << finl;
440 for (
int i=0; i<
N; i++)
456 const int sgn = (
debit>0) ? 1 : -1;
466 for (i=1; i<
N-1; i++)
468 const double dtrhoCp = dt/
rho(i)/
Cp;
474 ma(i)=1+dtrhoCp*(sgn*
Cp*
debit/dz1+2*(l1/dz1+l2/dz2)/(dz1+dz2));
476 sm(i) =
T(i)+dtrhoCp*
Qvol(i);
478 mc(i) = dtrhoCp*(0.5*(1-sgn)*
Cp*
debit/dz1-2*l1/dz1/(dz1+dz2));
480 mb(i-1) = dtrhoCp*(-2*l2/dz2/(dz1+dz2));
481 mb(i-1) += dtrhoCp*(-0.5*(1+sgn)*
Cp*
debit/dz1);
505 Fichier_sauv_nom+=
"_";
507 Fichier_sauv_nom+=
".sauv";
517 Cerr <<
"A verifier pour envoi blocant" << finl;
522 double temps_lu=0., Temperature_reprise=0.;
525 Fichier_sauv=fopen(Fichier_sauv_nom,
"r");
526 if (Fichier_sauv!=
nullptr)
528 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
529 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
530 if (!fscanf(Fichier_sauv,
"%lf",&temps_lu))
exit();
533 for (
int p=0; p<nbproc; p++)
535 Cerr <<
"Reprise du champs de temperature (" << Fichier_sauv_nom <<
") pour la correlation sur le processeur " << p <<
"...";
537 recevoir(T_tmp,p,0,p);
538 for (
int i=0; i<T_tmp.
size(); i++)
540 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
541 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
542 if (!fscanf(Fichier_sauv,
"%lf",&Temperature_reprise))
exit();
543 T_tmp(i) = Temperature_reprise;
545 envoyer(T_tmp,0,p,0);
546 Cerr <<
" OK!" << finl;
548 fclose(Fichier_sauv);
552 Cerr <<
"\nLe temps indique dans le fichier \""<< Fichier_sauv_nom <<
"\" "<< temps_lu << finl;
553 Cerr <<
"est different du temps de reprise du calcul "<< temps <<
" !!!" << finl << finl;
554 Cerr <<
"Vous ne pouvez pas faire de reprise pour la correlation. Supprimez" << finl;
555 Cerr <<
"dans la correlation le mot clef \"Reprise\". La phase transitoire" << finl;
556 Cerr <<
"du calcul sera fausse, mais l'etat stationnaire sera juste." << finl << finl;
557 fclose(Fichier_sauv);
563 Cerr <<
"\nLa reprise ne peut pas etre faite : Le fichier \"" << Fichier_sauv_nom <<
"\" est manquant !!!" << finl << finl;
571 Fichier_sauv=fopen(Fichier_sauv_nom,
"r");
572 double temps_lu=0., Temperature_reprise=0.;
575 if (Fichier_sauv!=
nullptr)
577 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
578 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
579 if (!fscanf(Fichier_sauv,
"%lf",&temps_lu))
exit();
582 Cerr <<
"Reprise du champs de temperature (" << Fichier_sauv_nom <<
") pour la correlation...";
583 for (
int i=0; i<
N; i++)
585 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
586 if (!fscanf(Fichier_sauv,
"%s",&tmp_lu))
exit();
587 if (!fscanf(Fichier_sauv,
"%lf",&Temperature_reprise))
exit();
588 T(i) = Temperature_reprise;
590 fclose(Fichier_sauv);
591 Cerr <<
" OK!" << finl;
595 Cerr <<
"\nLe temps indique dans le fichier \""<< Fichier_sauv_nom <<
"\" "<< temps_lu << finl;
596 Cerr <<
"est different du temps de reprise du calcul "<< temps <<
" !!!" << finl << finl;
597 Cerr <<
"Vous ne pouvez pas faire de reprise pour la correlation. Supprimez" << finl;
598 Cerr <<
"dans la correlation le mot clef \"Reprise\". La phase transitoire" << finl;
599 Cerr <<
"du calcul sera fausse, mais l'etat stationnaire sera juste." << finl << finl;
600 fclose(Fichier_sauv);
606 Cerr <<
"\nLa reprise ne peut pas etre faite : Le fichier \"" << Fichier_sauv_nom <<
"\" est manquant !!!" << finl << finl;
621 for (
int i=0; i<
N; i++)
627 DoubleTab& mon_h= h_imp_->valeurs();
632 for (
int ii=0; ii<taille; ii++)
650 Fichier_sauv=fopen(Fichier_sauv_nom,
"w");
651 fprintf(Fichier_sauv,
"Temps\t=\t%f\n",temps);
653 for (
int p=0; p<nbproc; p++)
656 recevoir(T_tmp,p,0,p);
657 for (
int i=0; i<T_tmp.
size(); i++)
659 fprintf(Fichier_sauv,
"T(%i)\t=\t%f\n",(
int)j,T_tmp(i));
663 fclose(Fichier_sauv);
668 Fichier_sauv=fopen(Fichier_sauv_nom,
"w");
669 fprintf(Fichier_sauv,
"Temps\t=\t%f\n",temps);
670 for (
int i=0; i<
N; i++)
672 fprintf(Fichier_sauv,
"T(%i)\t=\t%f\n",(
int)i,
T(i));
674 fclose(Fichier_sauv);
685 int nfin = ndeb + front_vf.
nb_faces();
689 for (
int face=ndeb; face<nfin; face++)
697 for (
int face=ndeb; face<nfin; face++)
699 int elem = face_voisins(face,0);
701 elem = face_voisins(face,1);
702 for(i=0; i<nb_comp; i++)
705 tab(face-ndeb,i) = tab_lambda(elem,i)/e(face-ndeb);
711 for (
int face=ndeb; face<nfin; face++)
713 for(i=0; i<nb_comp; i++)
735 static const double epsilon = 1.e-9;
737 modf(temps_courant/
dt_impr + epsilon, &i);
738 modf((temps_courant-dt)/
dt_impr + epsilon, &j);
754 envoyer(
coord,ME,0,ME);
758 envoyer(
rho,ME,0,ME);
761 envoyer(
Qvol,ME,0,ME);
762 envoyer(
vol,ME,0,ME);
768 nom_bord+=
Nom(temps);
772 fic.
setf(ios::scientific);
774 fic <<
"# X T U h rho mu lambda Q[W]" << finl;
776 for (
int p=0; p<nbproc; p++)
778 DoubleVect coord_tmp;
784 DoubleVect lambda_tmp;
788 recevoir(coord_tmp,p,0,p);
789 recevoir(T_tmp,p,0,p);
790 recevoir(U_tmp,p,0,p);
791 recevoir(h_tmp,p,0,p);
792 recevoir(rho_tmp,p,0,p);
793 recevoir(mu_tmp,p,0,p);
794 recevoir(lambda_tmp,p,0,p);
795 recevoir(Qvol_tmp,p,0,p);
796 recevoir(vol_tmp,p,0,p);
798 for (
int i =0; i<coord_tmp.
size(); i++)
800 fic << coord_tmp(i) <<
" \t" << T_tmp(i) <<
" \t" << U_tmp(i) <<
" \t" << h_tmp(i) <<
" \t" << rho_tmp(i);
801 fic <<
" \t" << mu_tmp(i) <<
" \t" << lambda_tmp(i) <<
" \t" << Qvol_tmp(i)*vol_tmp(i) << finl;
802 Qt+=Qvol_tmp(i)*vol_tmp(i);
808 fic <<
"# Q total[W] = " << Qt << finl;
816 nom_bord+=
Nom(temps);
820 fic.
setf(ios::scientific);
822 fic <<
"# X T U h rho mu lambda Q[W]" << finl;
823 for (
int i =0; i<
N; i++)
826 fic <<
" \t" <<
mu(i) <<
" \t" <<
lambda(i) <<
" \t" <<
Qvol(i)*
vol(i) << finl;
829 fic <<
"# Q total[W] = " << Qt << finl;
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.
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
virtual void completer()
NE FAIT RIEN A surcharger dans les classes derivees.
std::vector< Motcle > app_domains
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
double dist_norm_bord(int num_face) const override
virtual const DoubleVect & face_surfaces() const
double xv(int num_face, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de la condition aux limites.
virtual Champ_front_base & T_ext()
Renvoie le champ T_ext de temperature imposee a la frontiere.
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.
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 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...
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)
_SIZE_ dimension(int d) const
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)