15#include <Convection_Diffusion_Temperature_FT_Disc.h>
16#include <Transport_Interfaces_FT_Disc.h>
17#include <Domaine_VF.h>
18#include <Discretisation_base.h>
19#include <Probleme_FT_Disc_gen.h>
20#include <Fluide_Diphasique.h>
21#include <Fluide_Incompressible.h>
23#include <Sous_Domaine.h>
25#include <Champ_Uniforme.h>
26#include <Echange_impose_base.h>
27#include <Echange_contact_VDF_FT_Disc.h>
28#include <Domaine_Cl_VDF.h>
29#include <Neumann_paroi.h>
30#include <Neumann_paroi_adiabatique.h>
34#include <Interprete_bloc.h>
35#include <Domaine_VDF.h>
36#include <Perf_counters.h>
38#include <Parametre_implicite.h>
39#include <Dirichlet_paroi_fixe.h>
40#include <Dirichlet_paroi_defilante.h>
42static const double TSAT_CONSTANTE = 0.;
75 solveur_masse->set_name_of_coefficient_temporel(
"rho_cp_comme_T");
77 num.
suffix(
"temperature_thermique");
78 Nom nom=
"Convection_chaleur";
81 terme_convectif.set_description((Nom)
"Convective heat transfer rate=Integral(-rho*cp*T*u*ndS) [W] if SI units used");
82 nom=
"Diffusion_chaleur";
85 terme_diffusif.set_description((Nom)
"Conduction heat transfer rate=Integral(lambda*grad(T)*ndS) [W] if SI units used");
90 Cerr <<
"We account for no energy correction!!" << finl;
103 param.
ajouter_condition(
"(value_of_phase_eq_0)_or_(value_of_phase_eq_1)",
"phase must be set to 0 or 1");
125 if (mot==
"equation_interface")
131 Cerr <<
" Interface equation for the temperature convection diffusion equation :"
136 else if (mot==
"solveur_pression_fictive")
139 Cerr <<
"Reading and typing of fictitious pressure solver (for velocity extension) : " << finl;
145 else if (mot==
"diffusion")
148 Cerr <<
" "<<
que_suis_je() <<
"::lire diffusivite" << finl;
153 Cerr <<
" Error: phase must be specified before diffusion" << finl;
159 else if (mot==
"convection")
162 Cerr <<
" "<<
que_suis_je() <<
"::lire convection" << finl;
166 Cerr <<
" Error: equation_navier_stokes must be specified before convection" << finl;
172 else if (mot==
"maintien_temperature")
175 Cerr <<
" Equation_Concentration_FT::lire maintien_temperature" << finl;
181 else if (mot==
"prescribed_mpoint")
184 Cerr <<
que_suis_je() <<
"::lire prescribed_mpoint" << finl;
189 else if (mot==
"equation_navier_stokes")
195 Cerr <<
" Navier_stokes equation for the temperature convection diffusion equation :"
211 return vitesse_convection_;
227static void extrapolate(
const Domaine_VF& domaine_vf,
228 const DoubleTab& interfacial_area,
229 const int stencil_width,
230 const DoubleTab& distance,
233 const double invalid_test = -1.e30;
234 const IntTab& elem_faces = domaine_vf.
elem_faces();
236 const int nb_faces_elem = elem_faces.
dimension(1);
237 const int nb_elem = elem_faces.
dimension(0);
241 const double n_iterations = 5*stencil_width;
242 for (
int iteration = 0; iteration < n_iterations; iteration++)
247 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
251 const double d = distance[i_elem];
252 if (( d > invalid_test) && (interfacial_area[i_elem]<DMINFLOAT))
256 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
258 const int face = elem_faces(i_elem, i_face);
259 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
263 double mp = field_old[voisin];
264 const double dvois = distance[voisin];
265 if (dvois > invalid_test)
268 if (fabs(dvois)<DMINFLOAT)
270 Cerr <<
"distance is very much at zero whereas interfacial_area is zero too... Pathological case to be looked into closely. " << finl;
271 Cerr <<
"Is it from a Break-up or coalescence? " << finl;
272 Cerr <<
"see Convection_Diffusion_Temperature_FT_Disc and static void extrapolate" << finl;
273 Cerr <<
"Contact TRUST support." << finl;
276 const double inv_d2 = 1./(dvois*dvois);
283 field[i_elem] = somme / coeff;
290static void extrapoler_dans_phase(DoubleTab& gradient,
291 const DoubleTab& indicatrice,
293 const double invalid_test,
294 const double indic_phase,
const int nb_iter)
296 DoubleTab gradient_old;
297 for (
int iteration = 0; iteration < nb_iter; iteration++)
301 gradient_old = gradient;
303 for (
int i_elem = 0; i_elem < domaine_vf.
elem_faces().dimension(0); i_elem++)
305 if (indicatrice[i_elem] != indic_phase)
311 for (
int i_face = 0; i_face < domaine_vf.
elem_faces().dimension(1); i_face++)
313 const int face = domaine_vf.
elem_faces(i_elem, i_face);
318 const double grad = gradient_old[voisin];
319 if (grad > invalid_test)
327 gradient[i_elem] = somme / coeff;
330 gradient.echange_espace_virtuel();
337static void extrapoler_champ_elem(
const Domaine_VF& domaine_vf,
338 const DoubleTab& indicatrice,
339 const DoubleTab& distance_interface,
340 const DoubleTab& normale_interface,
341 const DoubleTab& champ_div_n,
342 const int correction_gradt_ordre_,
344 const int stencil_width,
345 const double interfacial_value,
350 const IntTab& elem_faces = domaine_vf.
elem_faces();
352 const int nb_faces_elem = elem_faces.
dimension(1);
353 const int nb_elem = elem_faces.
dimension(0);
355 const DoubleTab& centre_gravite_elem = domaine_vf.
xp();
356 const DoubleTab& centre_gravite_face = domaine_vf.
xv();
357 const double invalid_test = -1.e30;
358 const double invalid_value = -2.e30;
361 assert(gradient.dimension(0) == distance_interface.
dimension(0));
362 gradient = invalid_value;
363 const double indic_phase = (phase == 0) ? 0. : 1.;
366 for (i_elem = 0; i_elem < nb_elem; i_elem++)
368 double d = distance_interface[i_elem];
369 if (indicatrice[i_elem] == indic_phase && d > invalid_test)
385 double dist_elem_face_min = 1e30;
386 for (
int face_loc=0; face_loc<nb_faces_elem; face_loc++)
388 double dist_elem_face = 0;
389 const int face_glob = elem_faces(i_elem,face_loc);
392 double centre_elem_i = centre_gravite_elem(i_elem,i_dim);
393 double centre_face_i = centre_gravite_face(face_glob,i_dim);
394 dist_elem_face += (centre_elem_i-centre_face_i)*(centre_elem_i-centre_face_i);
396 dist_elem_face = sqrt(dist_elem_face);
397 dist_elem_face_min = (dist_elem_face < dist_elem_face_min) ? dist_elem_face : dist_elem_face_min;
413 if (std::fabs(d) < dist_elem_face_min)
415 Cerr <<
"Time = " << temps <<
"; extrapoler_champ_elem: distance lower than dx/2" << finl;
416 Cerr <<
" Element position:" << finl;
419 Cerr <<
" x(" << i_dim <<
") = " << centre_gravite_elem(i_elem,i_dim) << finl;
422 d = (phase == 0) ? -dist_elem_face_min : dist_elem_face_min;
426 const double v = champ[i_elem];
429 const double grad = (v - interfacial_value) / d;
433 const double div_n = champ_div_n[i_elem];
435 switch (correction_gradt_ordre_)
439 gradient[i_elem] = grad;
443 gradient[i_elem] = grad * (1. - (-div_n) * d / 2.);
447 gradient[i_elem] = grad * (1. - (-div_n) * d / 2. + (-div_n) * (-div_n) * d * d / 6.);
450 Cerr <<
"Error for the method Convection_Diffusion_Temperature_FT_Disc::extrapoler_champ_elem correction_gradt_ordre_" << finl;
456 Cerr <<
"extrapoler_champ_elem: errcount=" << err_count << finl;
457 gradient.echange_espace_virtuel();
461 extrapoler_dans_phase(gradient, indicatrice, domaine_vf, invalid_test, indic_phase, stencil_width );
464 const double autre_phase = 1.-indic_phase;
465 extrapoler_dans_phase(gradient, indicatrice, domaine_vf, invalid_test, autre_phase, stencil_width );
468 for (i_elem = 0; i_elem < nb_elem; i_elem++)
470 const double d = distance_interface[i_elem];
471 const double grad = gradient[i_elem];
472 if (indicatrice[i_elem] != indic_phase
474 && grad > invalid_test)
477 const double div_n = champ_div_n[i_elem];
478 champ[i_elem] = d * grad * (1. - 0.5 * div_n * d) + interfacial_value;
484 champ.echange_espace_virtuel();
502 const double interfacial_value = TSAT_CONSTANTE;
515 extrapoler_champ_elem(domaine_vf, indicatrice, distance_interface, normale_interface, div_n,
517 phase_, stencil_width, interfacial_value,
530 const double invalid_test = -1.e25;
538 mpoint.
valeurs() = grad_t_->valeurs();
540 DoubleTab& val = mpoint.
valeurs();
541 const int n = val.
size();
542 for (
int i = 0; i < n; i++)
543 if (val[i] < invalid_test)
546 const double k = fluide_dipha_->fluide_phase(
phase_).conductivite().valeurs()(0,0);
547 const double L = fluide_dipha_->chaleur_latente();
575static void collect_into_unique_occurence(ArrOfInt& mixed_elems, ArrOfDouble& lost_fluxes)
577 const int nb_elem_with_duplicates = mixed_elems.
size_array();
581 for (
int i=0; i<nb_elem_with_duplicates; i++)
583 const int elemi = mixed_elems[i];
588 const int elemj = mixed_elems[j];
599 lost_fluxes[nb_elem] = lost_fluxes[i];
600 for (j=i+1; j<nb_elem_with_duplicates; j++)
602 const int elemj = mixed_elems[j];
605 lost_fluxes[nb_elem] += lost_fluxes[j];
608 mixed_elems[nb_elem] = elemi;
617 Cerr <<
"Work in progress and widly incorrect. " << finl;
618 Cerr <<
"Wait and see for further improvements. Exit" << finl;
620 if (
inconnue().nb_valeurs_temporelles() == 1)
622 Cerr <<
"You need at least 2 positions to the wheel... Contact TRUST support. " << finl;
629 const DoubleTab& indicatrice_passe = eq_interface_.
inconnue().
passe();
634 const double rhocp = fluide_dipha_->fluide_phase(
phase_).masse_volumique().valeurs()(0,0)
635 * fluide_dipha_->fluide_phase(
phase_).capacite_calorifique().valeurs()(0,0);
642 for(
int i=0; i<nb_elem; i++)
645 derivee_energy_[i] = (temperature[elemi] * indicatrice[elemi] - temperature_passe[elemi] * indicatrice_passe[elemi])* rhocp;
649 const double Lvap = fluide_dipha_->chaleur_latente();
651 DoubleTab& mp = mpoint_->valeurs();
655 double total_flux_lost = 0.;
656 double total_derivee_energy = 0.;
657 double mpai_tot = 0.;
658 double mp_sum_before = 0.;
659 double int_ai_before = 0.;
660 for (
int nd=0 ; nd<nb_elem ; nd++)
663 int_ai_before += ai[elembe];
668 mpai_tot += mp[elembe]*ai[elembe]*Lvap;
669 mp_sum_before += mp[elembe]*ai[elembe];
671 if (int_ai_before>DMINFLOAT)
673 const double mean_mp_before = mp_sum_before/int_ai_before;
674 Cerr <<
" mp_sum_before= " << mp_sum_before <<
" mean_mp_before= " << mean_mp_before <<
" time= " << temps << finl;
676 total_flux_lost =
mp_sum(total_flux_lost);
677 mpai_tot =
mp_sum(mpai_tot);
678 total_derivee_energy =
mp_sum(total_derivee_energy)/dt;
679 Cerr <<
"[Basic-Mixed-cells-Energy-Balance] Time= " << temps <<
" nb_elems= " << nb_elem
680 <<
" phi(positive if towards mixed cells)= " << total_flux_lost
681 <<
" mp*ai*Lvap= " << mpai_tot
682 <<
" dE/dt= " << total_derivee_energy
683 <<
" imbalance= " << total_derivee_energy-total_flux_lost+mpai_tot << finl;
692 double int_dmp_ai = 0.;
694 double int_mp_ai = 0.;
695 for(
int i=0; i<nb_elem; i++)
702 double phi_conv_lost_by_mixed_cell = 0.;
703 double phi_diffu_added_to_mixed_cell = 0.;
706 Cerr <<
"Search for a solution? What case is it? diffu, BC? " << finl;
716 phi_conv_lost_by_mixed_cell =0.;
728 Cerr <<
"conv. The end of the list is reached, "
729 <<
"mixed_elems_["<< i<<
"]= " << elem <<
" was not found in mixed_elem_conv_"<< finl;
732 Cerr <<
"WE ASSUME IT IS BECAUSE IT IS A BC? any solution? WE IGNORE IT"<< finl;
743 double VdrhocpT_dt = 0.;
744 if (account_for_mixed_cell_energy)
746 VdrhocpT_dt=(rhocp*volume[elem])*(temperature[elem] * indicatrice[elem] - temperature_passe[elem] * indicatrice_passe[elem])/dt;
753 const double value_before = temperature[elem];
754 temperature[elem] = 1/indicatrice[elem] * (temperature_passe[elem] * indicatrice_passe[elem] + dt/(rhocp*volume[elem])*(mp[elem]*ai[elem]*Lvap - phi_in_mixed_cell*rhocp));
756 Cerr <<
"[Delta-T-due-to-Energy-correction] elem "<< elem <<
" Tnew-Tuncorrected " << temperature[elem]-value_before << finl;
758 const double tmp = (temperature[elem] * indicatrice[elem] - temperature_passe[elem] * indicatrice_passe[elem])* rhocp;
761 Cerr <<
"New derivee_energy after correction (before/after) : ( "<<
derivee_energy_[i] <<
" / " << tmp <<
" )." << finl;
768 if (ai[elem]>DMINFLOAT)
770 const double old_mp = mp[elem];
772 double delta_mp = 0. ;
773 if (account_for_diff)
775 delta_mp += (1/(ai[elem]*Lvap))*((mp[elem]*ai[elem]*Lvap + phi_diffu_added_to_mixed_cell));
777 Cerr <<
" delta-mp-diff= " << delta_mp << finl;
779 if (account_for_conv)
788 delta_mp += (1/(ai[elem]*Lvap))*(-phi_conv_lost_by_mixed_cell);
790 Cerr <<
" delta-mp-conv= " << delta_mp << finl;
792 if (account_for_mixed_cell_energy)
793 delta_mp += (1/(ai[elem]*Lvap))*(VdrhocpT_dt);
796 Cerr <<
" delta_mp= " << delta_mp <<
" old_mp= " << old_mp <<
" new_mp= " << mp[elem] << finl;
797 if (fabs(old_mp)>DMINFLOAT)
798 Cerr <<
"relative correction of mp at time "<< temps <<
" elem= " << elem <<
" delta= " <<delta_mp/old_mp*100. <<
"%." <<finl;
804 if ((ai[elem]>DMINFLOAT) and (temps>DMINFLOAT))
807 int_mp_ai += mp[elem]*ai[elem];
811 double delta_mp = 0. ;
812 if (account_for_diff)
815 delta_mp += (-1/Lvap)*((mp[elem]*ai[elem]*Lvap - phi_diffu_added_to_mixed_cell));
822 if (account_for_conv)
835 delta_mp += (-1/Lvap)*(phi_conv_lost_by_mixed_cell);
839 if (account_for_mixed_cell_energy)
841 delta_mp += (1/Lvap)*(VdrhocpT_dt);
844 int_dmp_ai += delta_mp;
850 if ((
option==3) and (int_ai>DMINFLOAT))
853 const double mean_dmp = int_dmp_ai/int_ai;
854 const double mean_mp = int_mp_ai/int_ai;
856 if (fabs(mean_mp)>DMINFLOAT)
857 rel=mean_dmp/mean_mp*100.;
858 Cerr <<
"correction of mp at time "<< temps <<
" mean_mp= " << mean_mp <<
" relative= " << rel <<
"%." <<finl;
880 double total_flux_lost = 0.;
881 double total_derivee_energy = 0.;
882 double mpai_tot = 0.;
884 for (
int nd=0 ; nd<nb_elem ; nd++)
889 mpai_tot += mp[elem]*ai[elem]*Lvap;
892 if ((
option==3) and (int_ai>DMINFLOAT))
894 const double mean_mp_corr = mpai_tot/(int_ai*Lvap);
895 Cerr <<
" mean_mp_corr= " << mean_mp_corr <<
" time= " << temps << finl;
897 total_flux_lost =
mp_sum(total_flux_lost);
898 mpai_tot =
mp_sum(mpai_tot);
899 total_derivee_energy =
mp_sum(total_derivee_energy)/dt;
900 Cerr <<
"[Corrected-balance] Time= " << temps <<
" nb_elems= " << nb_elem
901 <<
" phi(positive if towards mixed cells)= " << total_flux_lost
902 <<
" mp*ai*Lvap= " << mpai_tot
903 <<
" dE/dt= " << total_derivee_energy
904 <<
" imbalance= " << total_derivee_energy-total_flux_lost+mpai_tot << finl;
913 for(
int i=0; i<n; i++)
915 if ((ai[i]>DMINFLOAT) && (fabs(mp[i])>mmax))
924 extrapolate(domaine_vf, ai,
stencil_width_, distance_interface, mp);
939 vitesse_convection_->valeurs() += val_vitesse_ns;
944 solveur_masse_fictitious->set_name_of_coefficient_temporel(
"no_coeff");
956 Cerr <<
"[Conv_diff_FT_Disc] div_tmp recieved the type " << div_tmp.
type() << finl;
957 Cerr <<
"[Conv_diff_FT_Disc] div_tmp que suis je " << div_tmp.que_suis_je() << finl;
966 Cerr <<
"[Conv_diff_FT_Disc] Velocity correction. Construction of the divergence operator type : " << nom_type << finl;
990 DoubleTab& secmem = divergence_delta_U->valeurs();
992 div_tmp->
calculer(vitesse_convection_->valeurs(),secmem);
1000 const IntTab& elem_faces = domaine_vf.
elem_faces();
1002 const int nb_faces_elem = elem_faces.
dimension(1);
1007 for (
int elem = 0; elem < nb_elem; elem++)
1009 const double dist = distance(elem);
1020 for (i_face = 0; i_face < nb_faces_elem; i_face++)
1022 const int face = elem_faces(elem, i_face);
1023 const int voisin = face_voisins(face, 0) + face_voisins(face, 1) - elem;
1026 const double d = distance(voisin);
1039 assembleur_pression_->modifier_secmem(secmem);
1041 la_pression->changer_temps(
schema_temps().temps_courant());
1046 la_pression->valeurs()
1048 assembleur_pression_->modifier_solution(la_pression->valeurs());
1051 DoubleTab& gradP = gradient_pression_->valeurs();
1055 gradient_tmp.
typer();
1061 gradient_tmp.
calculer(la_pression->valeurs(), gradP);
1063 solveur_masse_fictitious->appliquer(gradP);
1068 DoubleTab& vc = vitesse_convection_->valeurs();
1073 for (i = 0; i < n; i++)
1080 for (i = 0; i < n; i++)
1081 for (j = 0; j < m; j++)
1082 vc(i,j) += gradP(i,j);
1093 statistics().create_custom_counter(
"calculer_mpoint",3,
"FrontTracking");
1094 statistics().begin_count(
"calculer_mpoint",statistics().get_last_opened_counter_level()+1);
1096 statistics().end_count(
"calculer_mpoint");
1109 statistics().create_custom_counter(
"extend_ui",3,
"FrontTracking");
1110 statistics().begin_count(
"extend_ui", statistics().get_last_opened_counter_level()+1);
1120 vitesse_convection_->valeurs() += val_vitesse_ns;
1129 statistics().end_count(
"extend_ui");
1142 bool calcul_explicite =
false;
1149 if (
schema_temps().diffusion_implicite() && !calcul_explicite)
1162 double total_flux_lost = 0.;
1163 for (
int nd=0 ; nd<nb_diffu ; nd++)
1169 total_flux_lost =
mp_sum(total_flux_lost);
1177 DoubleTab derivee_tmp(derivee);
1180 derivee_tmp *= rhoCp;
1181 derivee += derivee_tmp;
1186 double total_flux_conv_lost = 0.;
1187 for (
int nd=0 ; nd<nb_conv ; nd++)
1190 const double flux =
lost_fluxes_(nb_diffu+nd)*rhoCp[elem];
1191 total_flux_conv_lost += flux;
1196 total_flux_conv_lost =
mp_sum(total_flux_conv_lost);
1202 solveur_masse->appliquer(derivee);
1203 if (
schema_temps().diffusion_implicite() && !calcul_explicite)
1222 double total_flux_lost = 0.;
1223 for (
int nd=0 ; nd<nb ; nd++)
1226 total_flux_lost =
mp_sum(total_flux_lost);
1235 mpoint_uncorrected_->valeurs() = mpoint_->valeurs();
1236 DoubleTab& mp = mpoint_->valeurs();
1240 double mp_sum_before_corr = 0.;
1241 double int_ai_before = 0.;
1242 for (
int nd=0 ; nd<nb_elemi ; nd++)
1245 int_ai_before += ai[elembi];
1250 mp_sum_before_corr += mp[elembi]*ai[elembi];
1252 if (int_ai_before>DMINFLOAT)
1254 const double mean_mp_before_corr = mp_sum_before_corr/int_ai_before;
1255 Cerr <<
" mp_sum_before_corr= " << mp_sum_before_corr <<
" mean_mp_before_corr= " << mean_mp_before_corr <<
" time= " << temps << finl;
1277 toto ce code n est pas lu
1305 vitesse_convection_->mettre_a_jour(temps);
1313 const Domaine& dom = domaine_vf.
domaine();
1314 const Sous_Domaine& ss_domaine = dom.
ss_domaine(nom_sous_domaine);
1322 double temp_moy_ss_domaine = 0.;
1323 double vol_liq = 0.;
1326 int index = ss_domaine[i];
1328 if (index < nb_elem)
1330 temp_moy_ss_domaine += temperature[index] * indicatrice[index] * volume[index];
1331 vol_liq += indicatrice[index] * volume[index];
1334 vol_liq =
mp_sum(vol_liq);
1335 temp_moy_ss_domaine =
mp_sum(temp_moy_ss_domaine);
1336 if (vol_liq == 0. || temp_moy_ss_domaine == 0.)
1342 temp_moy_ss_domaine /= vol_liq ;
1343 double fac = temp_moy_ini / temp_moy_ss_domaine;
1369 int nbwall_found = 0;
1373 const Nom& bc_name = la_cl-> frontiere_dis().le_nom();
1380 Cerr <<
"[Convection_Diffusion_Temperature_FT_Disc]: Reinjection bubble: Wall-type BC found at " << bc_name <<finl;
1382 nbwall_found = nbwall_found +1;
1385 if (nbwall_found != 1)
1386 Process::exit(
Nom(nbwall_found) +
" wall-type BC found!!!!! Check JDD, pls" );
1388 Process::exit(
"[Convection_Diffusion_Temperature_FT_Disc]: !!! NO WALL-TYPE BOUNDARY WAS FOUND IN THE DOMAINE, PLESEASE CHECK JDD" );
1391 const IntTab& face_voisins = domaine_vf.
face_voisins();
1393 const DoubleTab& centre_gravite_face = domaine_vf.
xv();
1404 for (
int ii = 0; ii < nb_face; ii++)
1406 const int num_face = ii + nb_first_face;
1407 const int elemi = face_voisins (num_face, 0)
1408 + face_voisins (num_face, 1) + 1;
1410 if (!est_egal (indica(elemi,0), 1.))
1418 if (BC_has_vap == 0)
1421 double sum_surface = 0;
1422 for (
int ii = 0; ii < nb_face; ii++)
1424 const int num_face = ii + nb_first_face;
1428 sum_surface += surface (num_face);
1435 sum_T = (sum_surface > DMINFLOAT) ? sum_T / sum_surface : 0;
1453 dis.
discretiser_champ(
"temperature", un_domaine_dis, nom,
"K", 1 , nb_valeurs_temps, temps, la_temperature);
1454 champs_compris.add(la_temperature.valeur());
1457 nom =
Nom(
"temperature_grad_") +
le_nom();
1458 dis.
discretiser_champ(
"temperature", un_domaine_dis, nom,
"K/m", 1 , temps, grad_t_);
1459 champs_compris.add(grad_t_.valeur());
1463 dis.
discretiser_champ(
"temperature", un_domaine_dis, nom,
"kg/(m2s)", 1 , temps, mpoint_);
1464 champs_compris.add(mpoint_.valeur());
1467 nom =
Nom(
"mpoint_uncorrected_") +
le_nom();
1468 dis.
discretiser_champ(
"temperature", un_domaine_dis, nom,
"kg/(m2s)", 1 , temps, mpoint_uncorrected_);
1469 champs_compris.add(mpoint_uncorrected_.valeur());
1473 dis.
discretiser_champ(
"vitesse", un_domaine_dis, nom,
"m/s", -1 , 1 , temps, vitesse_convection_);
1474 champs_compris.add(vitesse_convection_.valeur());
1480 Cerr <<
"Fake Pressure gradient discretization" << finl;
1481 nom =
Nom(
"gradient_pression_") +
le_nom();
1485 gradient_pression_);
1486 champs_compris.add(gradient_pression_.valeur());
1489 Cerr <<
"Fake Pressure discretization" << finl;
1491 dis.
discretiser_champ(
"pression",un_domaine_dis,nom,
"Pa.m3/kg",1,1,temps,la_pression);
1492 champs_compris.add(la_pression.valeur());
1495 Cerr <<
"Velocity (delta_u) divergence discretization" << finl;
1496 nom =
Nom(
"divergence_delta_U_") +
le_nom();
1497 dis.
discretiser_champ(
"divergence_vitesse" ,un_domaine_dis, nom,
"m3/s", 1,1,temps,divergence_delta_U);
1498 champs_compris.add(divergence_delta_U.valeur());
1508 Nom type =
"Assembleur_P_";
1511 Cerr <<
"Navier_Stokes_std::discretiser_assembleur_pression : type="<< type << finl;
1512 assembleur_pression_.typer(type);
1513 assembleur_pression_->associer_domaine_dis_base(
domaine_dis());
1523 Cerr <<
"The value of the stencil to compute mpoint should at least be strictly larger than "
1524 <<
"the width on which the distance is computed (given by n_iterations_distance in " << ft.
que_suis_je() <<
")" << finl;
1525 Cerr <<
"Current options : stencil= " <<
stencil_width_ <<
" and n_iterations_distance= " << ndist <<
" are invalid! Exiting." << finl;
1532 Cerr <<
"You are trying to make the extension of velocity divergence free. " << finl;
1533 Cerr <<
"A poisson solver is then required and should be defined in your equation by the addition of the optional keyword solveur_pression_fictive " << finl;
1534 Cerr <<
"as in e.g.: solveur_pression_fictive GCP { precond ssor { omega 1.5 } seuil 1e-15 impr } " << finl;
1544 instructions <<
"{" << finl;
1549 for (
int ifront=0; ifront<nfront; ifront++)
1553 instructions <<
" " <<nom_front <<
" sortie_libre_rho_variable champ_front_uniforme 1 0" << finl;
1555 instructions <<
" " <<nom_front <<
" symetrie" << finl;
1557 instructions <<
"}" << finl;
1558 Cerr <<
"Interpretation de la chaine suivante:" << finl << instructions.
get_str();
1562 Cerr <<
"Discretisation of fictitious CL ..." << finl;
1563 zcl_fictitious_.typer(
"Domaine_Cl_VDF");
1566 zcl_fictitious_vdf.
associer(domaine_vdf);
1567 zcl_fictitious_->associer_eqn(ns);
1571 Cerr <<
"Interpreting input string ..." << finl;
1572 is >> zcl_fictitious_vdf ;
1575 Cerr <<
"Completing fictitious CL ..." << finl;
1580 assembleur_pression_->associer_domaine_cl_dis_base(zcl_fictitious_.valeur());
1581 assembleur_pression_->completer(ns);
1591 Cerr <<
"Check your datafile. Rc_GridN and Rc_inject should not but used simultaneously." << finl;
1592 Cerr <<
"Rc_tcl_GridN = " <<
Rc_GridN_ << finl;
1616 Process::exit(
"[Convection_Diffusion_Temperature_FT_Disc]: !!! NO WALL-TYPE BOUNDARY WAS FOUND IN THE DOMAINE, PLESEASE CHECK JDD" );
1626 const double cell_height = 2.*std::fabs(zvdf.
dist_face_elem0(num_face,elem_voisin));
1630 Cerr <<
"[Convection_Diffusion_Temperature_FT_Disc] Rc_inject_ is set to " <<
Rc_inject_ <<
" according to provided Rc_GridN_ " <<
Rc_GridN_ << finl;
1641 Cerr <<
"You forgot to associate the diphasic fluid to the problem named " <<
probleme().
le_nom() << finl;
1651 Cerr <<
"You forgot to associate the diphasic fluid to the problem named " <<
probleme().
le_nom() << finl;
1654 return fluide_dipha_->fluide_phase(
phase_);
1661 Cerr <<
"Erreur dans Convection_Diffusion_Temperature_FT_Disc::associer_milieu_base\n"
1662 <<
" On attendait un fluide diphasique" << finl;
1663 Cerr <<
"Error for Convection_Diffusion_Temperature_FT_Disc::associer_milieu_base\n"
1664 <<
"A Fluide_Diphasique medium was expected." << finl;
1677 const ArrOfInt& flags_compo_a_supprimer,
1681 if (nouvelle_phase !=
phase_)
1685 assert(num_compo.
size() == n);
1691 for (
int t = 0; t < nb_valeurs_temporelles; t++)
1694 for (
int i = 0; i < n; i++)
1696 const int c = num_compo[i];
1697 if (c >= 0 && flags_compo_a_supprimer[c])
1698 temp[i] = TSAT_CONSTANTE;
1708 ref_eq_interface_.valeur().associate_temp_equation_post_processing(*
this);
1717 double interfacial_flux = 0.;
1721 Cerr <<
"Woops! Not VDF";
1727 const Nom& bc_name = la_cl->frontiere_dis().le_nom();
1733 Cerr <<
"paroi_adiabatique" << finl;
1734 return interfacial_flux;
1738 Cerr <<
"paroi_flux_impose" << finl;
1745 Cerr <<
"paroi_temperature_imposee (among other possibilities)" << finl;
1752 const double h = la_cl_typee.
h_imp(num_face-ndeb);
1753 const double T_imp = la_cl_typee.
T_ext(num_face-ndeb);
1756 interfacial_flux = h*(T_imp - TSAT_CONSTANTE);
1758 return interfacial_flux;
1770 Cerr <<
que_suis_je() <<
"::get_flux_to_face(). " ;
1771 Cerr <<
"The BC type " << la_cl.valeur() <<
" for boundary "<< bc_name
1772 <<
" is not supported yet."<< finl;
1775 return interfacial_flux;
1780 double flux=0., Twall=0.;
1790 const IntTab& elem_faces = domaine_vf.
elem_faces();
1792 const int nb_faces_voisins = elem_faces.
dimension(1);
1796 for (i=0; i<nb_faces_voisins; i++)
1798 num_face = elem_faces(elem,i);
1801 const int elemb = faces_elem(num_face, 0) + faces_elem(num_face, 1) +1;
1808 if (i==nb_faces_voisins)
1810 Cerr <<
"Error. No boundary face found in this element "<< elem << finl;
1813 double flux=0., Twall=0.;
1820 double& flux,
double& Twall)
const
1826 Cerr <<
"Woops! Not VDF";
1832 const Nom& bc_name = la_cl->frontiere_dis().le_nom();
1838 Cerr <<
"paroi_adiabatique" << finl;
1841 Cerr <<
"How can we set Twall when temperature(elem) is not valid? Or is it?" << finl;
1846 Cerr <<
"paroi_flux_impose" << finl;
1850 Cerr <<
"How can we set Twall when temperature(elem) is not valid? Or is it?" << finl;
1865 const double h = la_cl_typee.
h_imp(num_face-ndeb);
1866 const double T_imp = la_cl_typee.
Ti_wall(num_face-ndeb);
1875 Cerr <<
"paroi_temperature_imposee (among other possibilities)" << finl;
1882 const double h = la_cl_typee.
h_imp(num_face-ndeb);
1883 const double T_imp = la_cl_typee.
T_ext(num_face-ndeb);
1887 flux = h*(T_imp - TSAT_CONSTANTE);
1903 Cerr <<
que_suis_je() <<
"::get_flux_and_Twall(). " ;
1904 Cerr <<
"The BC type " << la_cl.valeur() <<
" for boundary "<< bc_name
1905 <<
" is not supported yet."<< finl;
1916 const int elem = faces_elem(num_face, 0) + faces_elem(num_face, 1) +1;
1919 double P[3] = {0.,0.,0.}, xyz_face[3] = {0.,0.,0.};
1920 xyz_face[0] = domaine_vf.
xv(num_face,0);
1921 xyz_face[1] = domaine_vf.
xv(num_face,1);
1922 P[0] = domaine_vf.
xp(elem, 0);
1923 P[1] = domaine_vf.
xp(elem, 1);
1926 xyz_face[2] = domaine_vf.
xv(num_face,2);
1927 P[2] = domaine_vf.
xp(elem, 2);
1931 for (
int i=0; i<3; i++)
1932 d += (xyz_face[i] - P[i])*(xyz_face[i] - P[i]);
1935 const double k = fluide_dipha_->fluide_phase(
phase_).conductivite().valeurs()(0,0);
1938 const double Twall = temperature(elem) - d/k*flux;
1945 return TSAT_CONSTANTE;
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
virtual int nb_valeurs_temporelles() const
Renvoie le nombre de valeurs temporelles actuellement conservees.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
double get_Twall_at_face(const int num_face) const
const double & get_tempC() const
void compute_divergence_free_velocity_extension()
bool is_reinject_activated() 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.
SolveurSys solveur_pression_
Matrice matrice_pression_
void set_param(Param &titi) const override
const double & get_tsat_constant() const
bool divergence_free_velocity_extension_
void associer_milieu_base(const Milieu_base &milieu) override
Associe un milieu physique a l'equation, le milieu est en fait caste en Fluide_base.
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
virtual void corriger_pas_de_temps(double dt)
void completer() override
Complete la construction (initialisation) des objets associes a l'equation.
const double & get_Rc_inject() const
void get_flux_and_Twall(const int num_face, double &flux, double &Twall) const
int correction_courbure_ordre_
void discretiser_assembleur_pression()
Milieu_base & milieu() override
Convection_Diffusion_Temperature_FT_Disc()
ArrOfInt correction_mpoint_diff_conv_energy_
void set_is_solid_particle(const bool is_solid_particle)
double get_Twall_at_elem(const int elem) const
void calculer_grad_t()
met a jour le champ grad_t en fonction du champ inconnue.
virtual void preparer_pas_de_temps()
bool maintien_temperature_
double get_flux_to_face(const int num_face) const
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
ArrOfInt mixed_elems_conv_
ArrOfDouble lost_fluxes_conv_
Noms name_bc_opening_pressure_
OWN_PTR(Champ_Fonc_base) grad_t_
LIST(OBS_PTR(Champ_base)) liste_champs_compris_
ArrOfDouble derivee_energy_
void mettre_a_jour(double temps) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
int correction_gradt_ordre_
OBS_PTR(Fluide_Diphasique) fluide_dipha_
virtual void suppression_interfaces(const IntVect &num_compo, const ArrOfInt &flags_compo_a_supprimer, int nouvelle_phase)
Methode appelee par Transport_Interfaces_xxx::test_suppression_interfaces_sous_domaine() lorqu'une in...
void discretiser() override
Discretise l'equation.
const Champ_base & vitesse_pour_transport() const override
bool is_prescribed_mpoint_
ArrOfInt mixed_elems_diffu_
ArrOfDouble lost_fluxes_diffu_
double prescribed_mpoint_
double get_Twall(const int num_face) const
classe Convection_Diffusion_Temperature Cas particulier de Convection_Diffusion_std
const Champ_Inc_base & inconnue() const override
const Champ_base & get_champ(const Motcle &nom) const override
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
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 set_param(Param &titi) const override
Operateur_Diff terme_diffusif
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.
Operateur_Conv terme_convectif
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
virtual Nom get_name_of_type_for(const Nom &class_operateur, const Nom &type_operteur, const Equation_base &eqn, const OBS_PTR(Champ_base)&champ_supp=OBS_PTR(Champ_base)()) const
remplit le Nom type en focntion de la classe de operateur, du type de l'operateur et de l'equation
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
const Sous_Domaine_t & ss_domaine(int i) const
const Frontiere_t & frontiere(int i) const
void completer(const Domaine_dis_base &) override
const Cond_lim & la_cl_de_la_face(int numfa) const override
A partir d'un indice de face de bord dans le Domaine_VF, renvoie la condition aux limites a laquelle ...
void associer(const Domaine_dis_base &) override
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
double dist_face_elem0(int, int) const override
Fonction de calcul utilisable uniquement en coordonnees cartesiennes de la distance entre le centre d...
virtual const DoubleVect & face_surfaces() const
double xv(int num_face, int k) const
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
double xp(int num_elem, int k) const
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
Une entree dont la source est une chaine de caracteres.
virtual double flux_exterieur_impose(int i) const
classe Echange_impose_base: Cette condition limite sert uniquement pour l'equation d'energie.
virtual double h_imp(int num) const
Renvoie la valeur du coefficient d'echange de chaleur impose sur la i-eme composante.
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de 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....
const Nom & le_nom() const override
Renvoie le nom de l'equation.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
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 void discretiser()
Discretise l'equation.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
int num_premiere_face() const
int_t 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.
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
: class Maillage_FT_Disc Cette classe decrit un maillage:
int get_mesh_tag() const
return mesh_state_tag_
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
void associer_eqn(const Equation_base &)
Associe une equation a l'objet.
Une chaine de caractere (Nom) en majuscules.
void calculer_delta_u_interface(Champ_base &u0, int phase_pilote, int ordre, const bool future_or_past=false)
Calcul du saut de vitesse a l'interface du au changement de phase.
const DoubleTab & get_interfacial_area() const
virtual const Champ_base & calculer_div_normale_interface()
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Classe Neumann_paroi_adiabatique Cette condition limite correspond a une paroi adiabatique dans une.
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
Nom & suffix(const char *const)
Extraction de suffixe : Nom x("azerty");.
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.
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
Operateur_base & l_op_base() override
Renvoie l'objet sous-jacent upcaste en Operateur_base.
void typer() override
Type l'operateur: se type "Op_div_"+discretisation()+.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
Operateur_base & l_op_base() override
Renvoie l'objet sous-jacent upcaste en Operateur_base.
void typer() override
Type l'operateur: se type "Op_Grad_"+discretisation()+.
virtual void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &inco)=0
void associer_eqn(const Equation_base &)
Associe une equation a l'operateur.
const Nom & type() const
Renvoie le (nom du) type de l'operateur a creer.
virtual void completer()
Met a jour les references des objets associes a l'operateur.
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.
classe Parametre_implicite Un objet Parametre_implicite est un objet regroupant les differentes
bool & calcul_explicite()
virtual const Transport_Interfaces_FT_Disc & equation_interfaces(const Motcle &nom) const
virtual const Navier_Stokes_FT_Disc & equation_hydraulique(const Motcle &nom) const
const Triple_Line_Model_FT_Disc & tcl() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
static double mp_max(double)
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
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 derivee de Sortie empile ce qu'on lui envoie dans une chaine de caracteres.
const char * get_str() const
returns a copy of the string stored by the SChaine
double temps_courant() const
Renvoie le temps courant.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual int nb_valeurs_temporelles() const =0
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
Classe de base des flux de sortie.
int_t nb_elem_tot() const
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Champ_Inc_base & inconnue() const override
const Champ_base & get_indicatrice() override
getter champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
virtual const Champ_base & get_normale_interface() const
const Maillage_FT_Disc & maillage_interface() const
virtual const Champ_base & get_distance_interface() const
virtual const int & get_n_iterations_distance() const
bool is_activated() const
const int & tag_tcl() const
void corriger_mpoint(DoubleTab &mpoint) const