TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Fluide_Dilatable_base.cpp
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Navier_Stokes_Fluide_Dilatable_base.h>
17#include <Fluide_Dilatable_base.h>
18#include <Neumann_sortie_libre.h>
19#include <Loi_Etat_Multi_GP_QC.h>
20#include <Discretisation_base.h>
21#include <Champ_Fonc_Fonction.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <Domaine_VF.h>
25#include <Param.h>
26
27Implemente_base(Fluide_Dilatable_base,"Fluide_Dilatable_base",Fluide_base);
28
30{
31 os << que_suis_je() << finl;
33 return os;
34}
35
37{
38 return Fluide_base::readOn(is);
39}
40
42{
43 Cerr<<"Fluide_Dilatable_base::discretiser"<<finl;
44 if (!le_probleme_) le_probleme_ = pb;
45
46 const Domaine_dis_base& domaine_dis=pb.equation(0).domaine_dis();
47 double temps=pb.schema_temps().temps_courant();
48
49 // les champs seront nommes par le milieu_base
50 OWN_PTR(Champ_Don_base) ch_rho;
51 dis.discretiser_champ("temperature",domaine_dis,"masse_volumique_p","neant",1,temps,ch_rho);
52 ch_rho_ = ch_rho.valeur();
53
54 if (!ch_Cp_ || !sub_type(Champ_Uniforme,ch_Cp_.valeur())) //ie Cp non constant : gaz reels
55 {
56 Cerr<<"Heat capacity Cp is discretized once more for space variable case."<<finl;
57 dis.discretiser_champ("temperature",domaine_dis,"cp_prov","neant",1,temps,ch_Cp_);
58 }
59
60 if (!ch_lambda_ || ((!sub_type(Champ_Uniforme,ch_lambda_.valeur())) && (!sub_type(Champ_Fonc_Tabule,ch_lambda_.valeur()))))
61 {
62 // cas particulier etait faux en VEF voir quand cela sert (FM slt) : sera nomme par milieu_base
63 dis.discretiser_champ("champ_elem",domaine_dis,"neant","neant",1,temps,ch_lambda_);
64 }
65
66 dis.discretiser_champ("vitesse", domaine_dis,"rho_comme_v","kg/m3",1,temps,ch_rho_comme_v_);
67 champs_compris_.ajoute_champ(ch_rho_comme_v_);
68
69 dis.discretiser_champ("champ_elem",domaine_dis,"mu_sur_Schmidt","kg/(m.s)",1,temps,ch_mu_sur_Sc);
70 champs_compris_.ajoute_champ(ch_mu_sur_Sc);
71
72 dis.discretiser_champ("champ_elem",domaine_dis,"nu_sur_Schmidt","m2/s",1,temps,ch_nu_sur_Sc);
73 champs_compris_.ajoute_champ(ch_nu_sur_Sc);
74
75 dis.discretiser_champ("champ_elem",domaine_dis,"pression_tot","Pa",1,temps,ch_pression_tot_);
76 champs_compris_.ajoute_champ(ch_pression_tot_.valeur());
77
78 dis.discretiser_champ("temperature",domaine_dis,"rho_gaz","kg/m3",1,temps,ch_rho_gaz_);
79 champs_compris_.ajoute_champ(ch_rho_gaz_);
80
82}
83
85{
87 param.ajouter_non_std("loi_etat",(this),Param::REQUIRED);
88 param.ajouter_non_std("Traitement_PTh",(this));
89 // Lecture de mu et lambda pas specifiee obligatoire car option sutherland possible
90 // On supprime.. et on ajoute non-standard
91 param.supprimer("mu");
92 param.ajouter_non_std("mu",(this));
93 param.ajouter_non_std("sutherland",(this));
94 param.supprimer("beta_th");
95 param.ajouter_non_std("beta_th",(this));
96 param.supprimer("beta_co");
97 param.ajouter_non_std("beta_co",(this));
98}
99
101{
102 Motcle motlu;
103 if (mot=="loi_etat")
104 {
105 loi_etat_.typer_lire(is,"Loi_Etat_", "Lecture et typage de la loi d'etat ...");
106 loi_etat_->associer_fluide(*this);
107 return 1;
108 }
109 else if (mot=="Traitement_PTh")
110 {
111 Motcle trait;
112 is >> trait;
113 Motcles les_options(3);
114 {
115 les_options[0] = "edo";
116 les_options[1] = "conservation_masse";
117 les_options[2] = "constant";
118 }
119 traitement_PTh_=les_options.search(trait);
120 if (traitement_PTh_ == -1)
121 {
122 Cerr<< trait << " is not understood as an option of the keyword " << mot <<finl;
123 Cerr<< "One of the following options was expected : " << les_options << finl;
125 }
126 return 1;
127 }
128 else if (mot=="mu")
129 {
130 is>>ch_mu_;
131 ch_mu_->nommer("mu");
132 return 1;
133 }
134 else if (mot=="sutherland")
135 {
136 double mu0,T0,C=-1,Slambda=-1;
137 Nom prob;
138 is>>prob;
139 is>>motlu;
140 if (motlu!="MU0") warn_syntax_Sutherland();
141 is>>mu0;
142 is>>motlu;
143 if (motlu!="T0") warn_syntax_Sutherland();
144 is>>T0;
145 is>>motlu;
146 if (motlu=="SLAMBDA")
147 {
148 is >> Slambda;
149 is >> motlu;
150 }
151 if (motlu!="C") warn_syntax_Sutherland();
152 is>>C;
153
154 ch_mu_.typer("Sutherland");
155 Sutherland& mu_suth = ref_cast(Sutherland,ch_mu_.valeur());
156 mu_suth.set_val_params(prob,mu0,C,T0);
157 mu_suth.lire_expression();
158
159 //On stocke la valeur de C (ici Slambda) pour construire(cf creer_champs_non_lus())
160 //la loi de Sutherland qui concerne la conductivite
161 if (Slambda!=-1)
162 {
163 ch_lambda_.typer("Sutherland");
164 Sutherland& lambda_suth = ref_cast(Sutherland,ch_lambda_.valeur());
165 lambda_suth.set_prob(prob);
166 lambda_suth.set_Tref(T0);
167 lambda_suth.set_C(Slambda);
168 }
169 return 1;
170 }
171 else if ((mot=="beta_th") || (mot=="beta_co"))
172 {
173 Cerr<<"The keyword "<<mot<<" has not to be read for a "<<que_suis_je()<<" type medium."<<finl;
174 Cerr<<"Please remove it from your data set."<<finl;
176 return -1;
177 }
178 else return Fluide_base::lire_motcle_non_standard(mot,is);
179}
180
181/*
182 * traitement_PTh=0 => resolution classique de l'edo
183 * traitement_PTh=1 => pression calculee pour conserver la masse
184 * traitement_PTh=2 => pression laissee cste.
185 */
187{
188 if (traitement_PTh_==0)
189 {
190 /* Do nothing*/
191 }
192 else
193 {
194 int pression_imposee=0;
195 int size=domaine_cl.les_conditions_limites().size();
196 assert(size!=0);
197 for (int n=0; n<size; n++)
198 {
199 const Cond_lim& la_cl = domaine_cl.les_conditions_limites(n);
200 if (sub_type(Neumann_sortie_libre, la_cl.valeur())) pression_imposee=1;
201 }
202
203 if (pression_imposee && traitement_PTh_!=2)
204 {
205 Cerr << "The Traitement_Pth option selected is not coherent with the boundaries conditions." << finl;
206 Cerr << "Traitement_Pth constant must be used for the case of free outlet." << finl;
208 }
209
210 if (!pression_imposee && traitement_PTh_!=1)
211 {
212 Cerr << "The Traitement_Pth option selected is not coherent with the boundaries conditions." << finl;
213 Cerr << "Traitement_Pth conservation_masse must be used for the case without free outlet." << finl;
215 }
216 }
217}
218
220{
221 Cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
222 Cerr << "Error in call to Sutherland function :" << finl;
223 Cerr << "The syntax has changed in version 1.8.4." << finl;
224 Cerr << finl << " A specification of kind : sutherland problem_name mu0 1.85e-5 T0 300 [Slambda 10] C 10 was expected. "<<finl;
225 Cerr << finl << "Please update your dataset or contact TRUST support team." << finl;
227}
228
229/*! @brief Verifie que les champs lus l'ont ete correctement.
230 *
231 * @throws l'une des proprietes (rho mu Cp ou lambda) du fluide n'a pas ete definie
232 */
234{
235 msg="";
236 if (ch_rho_) { }
237 else
238 {
239 msg += "The density rho has not been specified. \n";
240 err = 1;
241 }
242 if (ch_mu_)
243 {
244 if (sub_type(Champ_Uniforme,ch_mu_.valeur()))
245 {
246 if (ch_mu_->valeurs()(0,0) <= 0)
247 {
248 msg += "The dynamical viscosity mu is not striclty positive. \n";
249 err = 1;
250 }
251 }
252 }
253 else
254 {
255 msg += "The dynamical viscosity mu has not been specified. \n";
256 err = 1;
257 }
258 if (ch_lambda_) { }
259 else
260 {
261 msg += "The conductivity lambda has not been specified. \n";
262 err = 1;
263 }
264 if (ch_Cp_) { }
265 else
266 {
267 msg += "The heat capacity Cp has not been specified. \n";
268 err = 1;
269 }
270
272}
273
274/*! @brief Complete le fluide avec un Cp constant
275 *
276 * @param (double Cp) le cp du fluide
277 */
279{
280 ch_Cp_.typer("Champ_Uniforme");
281 Champ_Uniforme& ch_Cp = ref_cast(Champ_Uniforme,ch_Cp_.valeur());
282 ch_Cp.dimensionner(1,1);
283 DoubleTab& tab_Cp = ch_Cp_->valeurs();
284 tab_Cp(0,0) = Cp_;
285}
286
288{
289 // Si l'inconnue est sur le device, on copie les donnees aussi:
290 if (equation_.size() && (*(equation_.begin()->second)).inconnue().valeurs().isDataOnDevice())
291 {
292 // ToDo_Kokkos deplacer tout cela dans Milieu_base::initialiser ?
293 mapToDevice(ch_rho_->valeurs());
294 mapToDevice(ch_rho_Cp_elem_->valeurs());
295 mapToDevice(ch_rho_Cp_comme_T_->valeurs());
296 }
297 ch_rho_Cp_comme_T_->changer_temps(temps);
298 ch_rho_Cp_comme_T_->changer_temps(temps);
299 DoubleTab& rho_cp = ch_rho_Cp_comme_T_->valeurs();
300 if (sub_type(Champ_Uniforme,ch_rho_.valeur()))
301 rho_cp = ch_rho_->valeurs()(0, 0);
302 else
303 {
304 // AB: rho_cp = rho->valeurs() turns rho_cp into a 2 dimensional array with 1 compo. We want to stay mono-dim:
305 rho_cp = 1.;
306 tab_multiply_any_shape(rho_cp, ch_rho_->valeurs());
307 }
308 if (sub_type(Champ_Uniforme, ch_Cp_.valeur()))
309 rho_cp *= ch_Cp_->valeurs()(0, 0);
310 else
311 tab_multiply_any_shape(rho_cp,ch_Cp_->valeurs());
312}
313
314/*! @brief Renvoie le tableau des valeurs de le temperature
315 *
316 */
318{
319 return ch_temperature().valeurs();
320}
321
322/*! @brief Renvoie le champ de le temperature
323 *
324 */
326{
327 return loi_etat_->ch_temperature();
328}
329
331{
332 return loi_etat_->ch_temperature();
333}
334
335/*! @brief Prepare le pas de temps
336 *
337 */
339{
340 loi_etat_->mettre_a_jour(le_probleme_->schema_temps().temps_courant());
341 eos_tools_->mettre_a_jour(le_probleme_->schema_temps().temps_courant());
342 if (traitement_PTh_ != 2 ) EDO_Pth_->mettre_a_jour_CL(Pth_);
343}
344
346{
347 loi_etat()->abortTimeStep();
348 Pth_=Pth_n_;
349}
350
352{
353 // on s'occupe de lamda si mu uniforme et CP uniforme
354 // on type lambda en champ uniforme et on met lambda=mu*Cp/Pr
355 //
356 if (ch_mu_)
357 {
358 if ((!ch_lambda_)||(!sub_type(Champ_Fonc_Tabule,ch_lambda_.valeur())))
359 if ((sub_type(Champ_Uniforme,ch_mu_.valeur()))&&(sub_type(Loi_Etat_GP_base,loi_etat_.valeur())))
360 {
361 if (!sub_type(Loi_Etat_Multi_GP_QC,loi_etat_.valeur()))
362 {
363 // Si mu uniforme et si la loi d'etat est celle d'un gaz parfait
364 double lold=-1;
365 if (ch_lambda_)
366 lold=ch_lambda_->valeurs()(0,0);
367 ch_lambda_.typer(ch_mu_->le_type());
368 ch_lambda_=ch_mu_;
369
370 loi_etat_->calculer_lambda();
371 double lo=ch_lambda_->valeurs()(0,0);
372 if (lold!=-1)
373 {
374 if (!est_egal(lold,lo))
375 {
376 Cerr << "Error : mu, lambda, Cp and Prandtl are all specified in your data set." << finl;
377 Cerr << "It is observed that your imput values leads to :" << finl;
378 Cerr.precision(20);
379 Cerr << "mu/(lambda*Cp)=" << loi_etat_->Prandt()*(lo/lold) << " and Prandtl=" << loi_etat_->Prandt() << finl;
380 Cerr<<"Please modify your data set by specifying for instance Prandtl = "<<loi_etat_->Prandt()*(lo/lold)<<finl;
382 }
383 }
384 }
385 }
386
387 if (ch_lambda_)
388 {
389 if (sub_type(Sutherland,ch_lambda_.valeur()))
390 {
391 if (!sub_type(Champ_Uniforme,ch_Cp_.valeur()))
392 {
393 Cerr << "A sutherland law cannot be requested for the conductivity "<<finl;
394 Cerr << "by indicating Slambda if the heat capacity (Cp) is not uniform."<<finl;
396 }
397 Sutherland& mu_suth = ref_cast(Sutherland,ch_mu_.valeur());
398 const double mu0 = mu_suth.get_A();
399 Sutherland& lambda_suth = ref_cast(Sutherland,ch_lambda_.valeur());
400 double lambda0 = mu0/loi_etat_->Prandt()*ch_Cp_->valeurs()(0,0);
401 lambda_suth.set_A(lambda0);
402 lambda_suth.lire_expression();
403 }
404 }
405 }
406}
407
408/*! @brief Initialise les parametres du fluide.
409 *
410 */
412{
413 Cerr << "Fluide_Dilatable_base::initialiser()" << finl;
414 if (sub_type(Champ_Don_base, ch_rho_.valeur()))
415 ref_cast(Champ_Don_base, ch_rho_.valeur()).initialiser(temps);
416
417 ch_mu_->initialiser(temps);
418 ch_lambda_->initialiser(temps);
419 ch_Cp_->initialiser(temps);
420 update_rho_cp(temps);
421
422 if (coeff_absorption_ && indice_refraction_)
424
425 if (equation_.size() && (*(equation_.begin()->second)).inconnue().valeurs().isDataOnDevice())
426 {
427 // ToDo_Kokkos deplacer tout cela dans Milieu_base::initialiser ?
428 mapToDevice(ch_rho_->valeurs());
429 mapToDevice(ch_rho_Cp_elem_->valeurs());
430 mapToDevice(ch_rho_Cp_comme_T_->valeurs());
431 }
432 return 1;
433}
434
435// Initialisation des proprietes radiatives du fluide incompressible
436// (Pour un fluide incompressible semi transparent).
438{
439 coeff_absorption_->initialiser(temps);
440 indice_refraction_->initialiser(temps);
441 longueur_rayo_->initialiser(temps);
442 if (sub_type(Champ_Uniforme,kappa()))
443 longueur_rayo().valeurs()(0,0)=1/(3*kappa().valeurs()(0,0));
444 else
445 {
446 DoubleTab& l_rayo = longueur_rayo_->valeurs();
447 const DoubleTab& K = kappa().valeurs();
448 for (int i=0; i<kappa().nb_valeurs_nodales(); i++)
449 l_rayo[i] = 1/(3*K[i]);
450 }
451}
452
453/*! @brief Calcule la pression totale : pression thermodynamique + pression hydrodynamique
454 *
455 */
457{
458 DoubleTab& tab_Ptot = ch_pression_tot_->valeurs();
459 const int n = tab_Ptot.dimension_tot(0);
460 DoubleTrav tab_PHyd(n, 1);
461 if( n != ch_pression_->valeurs().dimension_tot(0) )
462 {
463 // Interpolation de pression_ aux elements (ex: P1P0)
464 const Domaine_dis_base& domaine_dis= ch_pression_->domaine_dis_base();
465 const Domaine_VF& domaine = ref_cast(Domaine_VF, domaine_dis);
466 const DoubleTab& centres_de_gravites=domaine.xp();
467 ch_pression_->valeur_aux(centres_de_gravites,tab_PHyd);
468 }
469 else tab_PHyd = ch_pression_->valeurs();
470 // impl dans les classes filles
471 remplir_champ_pression_tot(n,tab_PHyd,tab_Ptot);
472}
473
475{
476 if(motlu == "source_masse_espece")
477 {
478 if (!ch_source_masse_esp_)
479 {
480 double temps = le_probleme_->schema_temps().temps_courant();
481
482 le_probleme_->discretisation().discretiser_champ("champ_elem", le_probleme_->equation(0).domaine_dis(), "source_masse_espece", "Kg/m3/s", 1, temps, ch_source_masse_esp_);
483 champs_compris_.ajoute_champ(ch_source_masse_esp_);
484 }
485 }
486 else if (motlu == "source_masse_projection")
487 {
489 {
490 double temps = le_probleme_->schema_temps().temps_courant();
491
492 le_probleme_->discretisation().discretiser_champ("pression", le_probleme_->equation(0).domaine_dis(), "source_masse_projection", "Kg/m3/s", 1, temps, ch_source_masse_proj_);
494 }
495 }
496 else
498}
499
500bool Fluide_Dilatable_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
501{
502 if (Fluide_base::has_champ(nom, ref_champ))
503 return true;
504
505 if (loi_etat_->has_champ(nom, ref_champ))
506 return true;
507
508 return false; /* rien trouve */
509}
510
512{
513 if (Fluide_base::has_champ(nom))
514 return true;
515
516 if (loi_etat_->has_champ(nom))
517 return true;
518
519 return false; /* rien trouve */
520}
521
523{
524 OBS_PTR(Champ_base) ref_champ;
525
526 if (Fluide_base::has_champ(nom, ref_champ))
527 return ref_champ;
528
529 if (loi_etat_->has_champ(nom, ref_champ))
530 return ref_champ;
531
532 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
533}
534
536{
538 loi_etat_->get_noms_champs_postraitables(nom,opt);
539}
540
542{
543 ch_rho_->mettre_a_jour(temps);
544 ch_temperature().mettre_a_jour(temps); // Note : it denotes the species Y1 for Pb_Hydraulique_Melange_Binaire_QC
545 ch_rho_->changer_temps(temps);
547 ch_mu_->changer_temps(temps);
548 ch_lambda_->changer_temps(temps);
549 ch_Cp_->mettre_a_jour(temps);
550 update_rho_cp(temps);
551 write_mean_edo(temps); // si besoin (i.e. QC)
552}
553
554/*! @brief Prepare le fluide au calcul.
555 *
556 */
558{
559 Cerr << "Fluide_Dilatable_base::preparer_calcul()" << finl;
560 //Milieu_base::preparer_calcul(); // Ne fait rien!!
561 Fluide_Dilatable_base::update_pressure_fields(le_probleme_->schema_temps().temps_courant()); // Child can have an overload
562 loi_etat_->preparer_calcul();
563 prepare_pressure_edo(); // si besoin (i.e. QC)
565}
566
568{
570 ch_pression_tot_->mettre_a_jour(temps);
571}
572
573/*! @brief Complete le fluide avec les champs inconnus associes au probleme
574 *
575 * @param (Pb_Thermohydraulique& pb) le probleme a resoudre
576 */
578{
579 if (!le_probleme_) le_probleme_ = pb;
580 ch_inco_chaleur_ = pb.equation(1).inconnue();
581 ch_vitesse_ = pb.equation(0).inconnue();
582 ch_pression_ = ref_cast(Navier_Stokes_std, pb.equation(0)).pression();
583
584 Nom typ = pb.equation(0).discretisation().que_suis_je();
585 if (typ == "VEFPreP1B")
586 typ = "VEF";
587
588 eos_tools_.typer(Nom("EOS_Tools_") + typ);
589 eos_tools_->associer_domaines(pb.equation(0).domaine_dis(), pb.equation(0).domaine_Cl_dis());
590 eos_tools_->associer_fluide(*this);
591 loi_etat_->assoscier_probleme(pb);
593 eos_tools_->mettre_a_jour(pb.schema_temps().temps_courant());
594 loi_etat_->initialiser();
595
596 if (traitement_PTh_ != 2) completer_edo(pb);
597}
598
600{
601 assert(traitement_PTh_ != 2);
602 Nom typ = pb.equation(0).discretisation().que_suis_je();
603 if (typ=="VEFPreP1B") typ = "VEF";
604 typ += "_";
605
606 // EDO_Pression_th_VDF/VEF_Melange_Binaire not implemented yet
607 // typer Gaz_Parfait instead to use when traitement_PTh=1...
608 if (pb.que_suis_je().debute_par("Pb_Hydraulique_Melange_Binaire_"))
609 typ +="Gaz_Parfait";
610 else
611 typ += loi_etat_->type_fluide();
612
613 typ = Nom("EDO_Pression_th_") + typ;
614 Cerr << "Typage de l'EDO sur la pression : " << typ << finl;
615 EDO_Pth_.typer(typ);
616 EDO_Pth_->associer_domaines(pb.equation(0).domaine_dis(),pb.equation(0).domaine_Cl_dis());
617 EDO_Pth_->associer_fluide(*this);
618 EDO_Pth_->mettre_a_jour_CL(Pth_);
619
620 // Write in file
622 output_file_ += "_";
623 output_file_ += pb.le_nom();
624 output_file_ += ".evol_glob";
625
626 Cerr << "Warning! evol_glob file renamed " << output_file_ << finl;
628}
629
631{
632 if (traitement_PTh_ != 2) EDO_Pth_->completer();
633
634 eos_tools_->mettre_a_jour(le_probleme_->schema_temps().temps_courant());
635}
636
638{
639 if (je_suis_maitre())
640 {
642 fic << "# Time sum(T*dv)/sum(dv)[K] sum(rho*dv)/sum(dv)[kg/m3] Pth[Pa]" << finl;
643 }
644}
645
647{
648 const double Ch_m = eos_tools_->moyenne_vol(ch_inco_chaleur_->valeurs());
649 const double rhom = eos_tools_->moyenne_vol(ch_rho_->valeurs());
650
651 if (je_suis_maitre() && traitement_PTh_ != 2)
652 {
653 SFichier fic(output_file_, ios::app);
654 fic << temps << " " << Ch_m << " " << rhom << " " << Pth_ << finl;
655 }
656}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
void mettre_a_jour(double temps) override
Mise a jour en temps.
void dimensionner(int, int)
Fixe le nombre de composantes et le nombre de valeurs nodales.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
int nb_valeurs_nodales() const override
Renvoie le nombre de degre de liberte par composante: le nombre de noeuds.
Classe Champ_Fonc_Tabule Classe derivee de Champ_Fonc_base qui represente les.
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
virtual void creer_champ(const Motcle &motlu)=0
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const =0
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VF
Definition Domaine_VF.h:44
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,...
Definition Entree.h:42
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
const Champ_Don_base & ch_temperature() const
Renvoie le champ de le temperature.
const Champ_base & get_champ(const Motcle &nom) const override
void creer_champ(const Motcle &motlu) override
int initialiser(const double temps) override
Initialise les parametres du fluide.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
OBS_PTR(Champ_Inc_base) ch_inco_chaleur_
const DoubleTab & temperature() const
Renvoie le tableau des valeurs de le temperature.
void mettre_a_jour(double) override
Effectue une mise a jour en temps du milieu, et donc de ses parametres caracteristiques.
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.
virtual void calculer_pression_tot()
Calcule la pression totale : pression thermodynamique + pression hydrodynamique.
virtual void checkTraitementPth(const Domaine_Cl_dis_base &)
void completer_edo(const Probleme_base &)
virtual void remplir_champ_pression_tot(int n, const DoubleTab &PHydro, DoubleTab &PTot)=0
virtual void update_pressure_fields(double)
virtual void write_mean_edo(double)
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
void preparer_calcul() override
Prepare le fluide au calcul.
void preparer_pas_temps()
Prepare le pas de temps.
const OWN_PTR(Loi_Etat_base) &loi_etat() const
void update_rho_cp(double temps) override
void initialiser_radiatives(const double temps)
void set_Cp(double)
Complete le fluide avec un Cp constant.
void verifier_coherence_champs(int &err, Nom &message) override
Verifie que les champs lus l'ont ete correctement.
void set_param(Param &param) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void completer(const Probleme_base &)
Complete le fluide avec les champs inconnus associes au probleme.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
void set_param(Param &param) const override
Champ_Don_base & kappa()
Definition Fluide_base.h:70
Champ_Don_base & longueur_rayo()
Definition Fluide_base.h:79
void discretiser(const Probleme_base &pb, const Discretisation_base &dis) override
classe Loi_Etat_GP_base Cette classe represente la loi d'etat base pour les gaz parfaits.
classe Loi_Etat_Multi_GP_QC Cette classe represente la loi d'etat pour un melange de gaz parfaits.
void ecrire(Sortie &) const
Ecrit un objet milieu sur un flot de sortie.
virtual void verifier_coherence_champs(int &err, Nom &message)
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.
Champs_compris champs_compris_
std::map< std::string, const Equation_base * > equation_
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual int debute_par(const char *const n) const
Definition Nom.cpp:319
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
friend class Entree
Definition Objet_U.h:76
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
Definition Objet_U.cpp:146
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
@ REQUIRED
Definition Param.h:115
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.
Definition Param.cpp:489
void supprimer(const char *keyword)
Remove a previously-registered keyword from this Param.
Definition Param.cpp:339
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
void set_A(const double A)
const double & get_A() const
void set_C(const double C)
void set_Tref(const double Tref)
void set_prob(const Nom &prob)
void set_val_params(const Nom &prob, const double A, const double C, const double Tref)
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160