16#include <Terme_Source_Canal_perio.h>
19#include <Probleme_base.h>
20#include <communications.h>
21#include <Domaine_VF.h>
22#include <Domaine_Cl_dis_base.h>
23#include <Periodique.h>
24#include <Neumann_paroi.h>
25#include <Convection_Diffusion_std.h>
26#include <Fluide_Incompressible.h>
27#include <Operateur_Diff_base.h>
28#include <Navier_Stokes_std.h>
43Terme_Source_Canal_perio::Terme_Source_Canal_perio():
44 direction_ecoulement_(-1),
45 velocity_weighting_(0),
48 h(0.0), coeff(0.0), u_etoile(0.0),
53 dernier_temps_calc_(-1.0),
59Terme_Source_Canal_perio::~Terme_Source_Canal_perio()
83 param.lire_avec_accolades_depuis(is);
109 if (mot==
"direction_ecoulement")
111 Cerr <<
"The direction_ecoulement option is obsolete, you must now use the bord option to specify the boundary where periodicity is applied."<<finl;
114 else if (mot==
"debit_impose")
119 else if (mot==
"velocity_weighting")
124 Cerr <<
"velocity_weighting value should be 0 or 1." << finl;
129 Cerr <<
"velocity_weighting option is available only for a Canal_perio source term in the energy equation." << finl;
147 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
176 Cerr <<
"********************************************************" << finl;
177 Cerr <<
"Error for the definition of the Canal_perio source term." << finl;
180 Cerr <<
"It seems the channel is not parallel to an axis. Direction_ecoulement keyword is useless in this case." << finl;
181 Cerr <<
"So try to use the following syntax to specify the name of the periodic boundary:" << finl;
182 Cerr <<
"Canal_perio { bord name }" << finl;
186 Cerr <<
bord_periodique_ <<
" is not a boundary with a periodic boundary condition." << finl;
200 filename+=
"_Channel_Flow_Rate_";
201 filename+=ext_nom_source_ ;
202 if (!flow_rate_file_.is_open())
204 flow_rate_file_.ouvrir(filename, (premiere_ecriture?ios::out:ios::app));
205 flow_rate_file_.setf(ios::scientific);
208 if ((tps <= (tps_init+dt)) && premiere_ecriture)
210 if (
equation().probleme().is_dilatable()==1)
211 flow_rate_file_ <<
"# Time t Flow rate Q(t) in [kg.s-1] if SI units used" << finl;
213 flow_rate_file_ <<
"# Time t Flow rate Q(t) in [m3.s-1] if SI units used" << finl;
215 flow_rate_file_ << tps+dt <<
" " << debit_e << finl;
228 if (
equation().probleme().reprise_effectuee())
231 filename2+=
"_Channel_Flow_Rate_repr_";
232 filename2+=ext_nom_source_ ;
234 if (!fichier_reprise.
ouvrir(filename2))
236 Cerr <<
"File " << filename2 <<
" not found !" << finl;
237 Cerr <<
"Since the 1.6.8 version, you absolutly need this file to restart the calculation." << finl;
238 Cerr <<
"Look for a file named *Channel_Flow_Rate_repr* and renamed it for example." << finl;
245 fichier_reprise >> str;
255 fichier_reprise.
ouvrir(filename);
259 while (!fichier_reprise.
eof() && !time_found)
262 fichier_reprise >> temps_ecrit;
267 if (est_egal(temps_ecrit,tps_init,1e-5))
269 Cerr <<
"Source canal_perio read values in the file " << filename <<
" for the time t= " << temps_ecrit << finl;
275 Cerr <<
"Sorry, we didn't find the time " << tps_init <<
" in the file " << filename << finl;
276 Cerr <<
"We can't restart the calculation." << finl;
289 const DoubleTab& flux_bords = op_base.
flux_bords();
291 if (flux_bords.
size()==0)
293 DoubleTab dummy(
equation().inconnue().valeurs());
299 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
307 int nfin = ndeb + frontiere_dis.
nb_faces();
308 for (
int num_face=ndeb; num_face<nfin; num_face++)
309 heat_flux += flux_bords(num_face,0);
312 heat_flux=
mp_sum(heat_flux);
333 for (
int num_face=0; num_face<size; num_face++)
341 s[num_face]=-velocity*heat_flux/(volume*debit_e/
surface_bord_);
349 for (
int num_face=0; num_face<size; num_face++)
350 s[num_face]=-heat_flux/volume;
365 ext_nom_source_ +=
"_" ;
386 if (
equation().probleme().is_dilatable())
388 Cerr <<
"Source term not validated yet for Quasi Compressible formulation." << finl;
389 Cerr <<
"Contact TRUST support." << finl;
392 if(
equation().schema_temps().pas_de_temps_locaux().size()>0)
394 Cerr <<
"Source term not validated yet for steady option for the Convection_Diffusion_std equation." << finl;
395 Cerr <<
"Contact TRUST support." << finl;
413 if (sup_ou_egal(dt,dt_min))
416 if( dt_locaux.
size()>0)
421 double local_sum = 0.;
422 for (
int i = 0; i < dt_locaux.
size(); i++) local_sum += dt_locaux[i];
441 filename+=
"_Pressure_Gradient_";
442 filename+= ext_nom_source_ ;
443 if (!pressure_gradient_file_.is_open())
445 pressure_gradient_file_.ouvrir(filename, (premiere_ecriture?ios::out:ios::app));
446 pressure_gradient_file_.setf(ios::scientific);
448 if ((tps <= (tps_init+dt)) && premiere_ecriture)
450 if (
equation().probleme().is_dilatable()==1)
451 pressure_gradient_file_ <<
"# Time t gradP(t) gradP(t)-gradP(t-dt) in [kg.s-2.m-2] if SI units used" << finl;
453 pressure_gradient_file_ <<
"# Time t gradP(t) gradP(t)-gradP(t-dt) in [m.s-2] if SI units used" << finl;
455 pressure_gradient_file_ << tps+dt <<
" " <<
source_ <<
" " << si << finl;
459 filename+=
"_Channel_Flow_Rate_repr_";
460 filename+=ext_nom_source_;
461 if (!restart_file_.is_open())
463 restart_file_.ouvrir(filename, (premiere_ecriture?ios::out:ios::app));
464 restart_file_.setf(ios::scientific);
466 if ((tps <= (tps_init+dt)) && premiere_ecriture)
468 if (
equation().probleme().is_dilatable()==1)
469 restart_file_ <<
"# Time t Flow rate Q(t) Flow rate Q(0) in [kg.s-1] gradP(t) in [kg.s-2.m-2] if SI units used" << finl;
471 restart_file_ <<
"# Time t Flow rate Q(t) Flow rate Q(0) in [m3.s-1] gradP(t) in [m.s-2] if SI units used" << finl;
473 restart_file_ << tps+dt <<
" " << debit_e <<
" " <<
debit_ref_ <<
" " <<
source_ << finl;
484 Cerr <<
"Error! Contact TRUST support." << finl;
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
double volume_total() const
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.
const Domaine & domaine() const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
ifstream & get_ifstream()
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in)
Class defining operators and methods for all reading operation in an input flow (file,...
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
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 const Operateur & operateur(int) const =0
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
int num_premiere_face() const
const double & get_aire() const
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
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.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
virtual Operateur_base & l_op_base()=0
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const =0
Helper class to factorize the readOn method of Objet_U classes.
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.
classe Periodique Cette classe represente une condition aux limites periodique.
int est_periodique_selon_un_axe() const
int direction_periodicite() const
const ArrOfDouble & direction_perio() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool & reprise_effectuee()
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),...
double temps_courant() const
Renvoie le temps courant.
double pas_temps_min() const
Renvoie le pas de temps minimum.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
const DoubleTab & pas_de_temps_locaux() const
double temps_init() const
Renvoie le temps initial.
Classe de base des flux de sortie.
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
void set_fichier(const Nom &)
void set_description(const Nom &nom)
virtual void completer()
Met a jour les references internes a l'objet Source_base.
virtual DoubleTab & ajouter(DoubleTab &) const
void resize(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Source term to keep a constant flow rate in a channel with periodic boundary conditions.
virtual void calculer_debit(double &) const =0
double compute_heat_flux() const
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void associer_pb(const Probleme_base &) override
void completer() override
Met a jour les references internes a l'objet Source_base.
int direction_ecoulement_
DoubleTab & calculer(DoubleTab &resu) const override
virtual ArrOfDouble source_convection_diffusion(double debit_e) const
ArrOfDouble source() const
Term source calculation (called by VDF and VEF implementations) TODO: returning an ArrOfDouble is baa...
void set_param(Param ¶m) const override
double dernier_temps_calc_
void write_flow_rate(const Nom &ext_nom_source, double debit) const