16#include <Convection_Diffusion_Temperature.h>
17#include <Navier_Stokes_std.h>
18#include <Probleme_base.h>
19#include <Fluide_reel_base.h>
20#include <Discret_Thyd.h>
21#include <Frontiere_dis_base.h>
23#include <Transport_Interfaces_base.h>
26#include <Domaine_VF.h>
27#include <Matrice_Morse.h>
28#include <Champ_Uniforme.h>
29#include <Perf_counters.h>
41 assert(la_temperature);
49 Nom nom=
"Convection_chaleur";
53 terme_convectif.set_description((Nom)
"Convective heat transfer rate=Integral(-rho*cp*T*u*ndS) [W] if SI units used");
54 nom=
"Diffusion_chaleur";
58 terme_diffusif.set_description((Nom)
"Conduction heat transfer rate=Integral(lambda*grad(T)*ndS) [W] if SI units used");
59 solveur_masse->set_name_of_coefficient_temporel(
"rho_cp_comme_T");
71 if (un_mot==
"penalisation_L2_FTD")
75 Cerr <<
" Equation_base :: penalisation_L2_FTD" << finl;
76 Cerr <<
"Equation_base: modele penalisation ibc = "<<
choix_pena << finl;
77 Nom mot, nom_equation;
80 Motcle accolade_fermee=
"}", accolade_ouverte=
"{";
81 if (mot == accolade_ouverte)
84 while (mot != accolade_fermee)
88 Cerr <<
"penalisation_L2_FTD equation: "<< nom_equation << finl;
90 ref_penalisation_L2_FTD.add(eq);
93 DoubleTab tab = DoubleTab();
95 for (
int i = 0 ; i<dim ; i++)
98 Cerr <<
"Lecture de la valeur de la penalisation suivant la direction " << i+1 <<
" :" << tab(i) << finl;
106 Cerr <<
"Erreur a la lecture des parametres de la penalisation L2 " << finl;
107 Cerr <<
"On attendait : " << accolade_ouverte << finl;
133 if (!le_fluide->has_conductivite() || !le_fluide->has_capacite_calorifique() || !le_fluide->has_beta_t())
135 Cerr <<
"You have not defined the following physical properties of the fluid " << finl;
136 Cerr <<
"needed to solve the energy equation: " <<
que_suis_je() << finl;
137 if (!le_fluide->has_conductivite()) Cerr <<
" Thermal conductivity (lambda)"<< finl;
138 if (!le_fluide->has_capacite_calorifique()) Cerr <<
" Specific heat capacity (Cp)"<< finl;
139 if (!le_fluide->has_beta_t()) Cerr <<
" Thermal expansion coefficient (beta_th)"<< finl;
144 Cerr <<
"Energy equation discretization" << finl;
150 Cerr <<
"Convection_Diffusion_Temperature::discretiser() ok" << finl;
158inline int string2int(
const char* digit,
int& result)
163 while (*digit >=
'0' && *digit <=
'9')
165 result = (result * 10) + (*digit -
'0');
183 noms_compris.add(
"gradient_temperature");
184 noms_compris.add(
"h_echange_");
186 if (opt == DESCRIPTION)
187 Cerr <<
que_suis_je() <<
" : " << noms_compris << finl;
189 nom.add(noms_compris);
196 if (motlu ==
"gradient_temperature")
198 if (!gradient_temperature)
206 Motcle nom_mot(motlu),temp_mot(nom_mot);
207 if (nom_mot.debute_par(
"H_ECHANGE"))
212 temp_mot.
suffix(
"H_ECHANGE_");
214 string2int(temp_mot,temperature);
223 if (nom ==
"gradient_temperature")
244 if (nom ==
"gradient_temperature")
259 if (nom ==
"gradient_temperature")
263 if (((ch_gt.
temps() != la_temperature->temps()) || (ch_gt.
temps() == temps_init)) && (la_temperature->mon_equation_non_nul()))
273 if (((ch_hconv.
temps() != la_temperature->temps()) || (ch_hconv.
temps() == temps_init)) && (la_temperature->mon_equation_non_nul()))
289 static Motcle domaine =
"Thermique";
310 DoubleTrav secmem(derivee);
319 DoubleTrav secmem_conv_vr(derivee);
323 secmem -= secmem_conv_vr;
325 DoubleTab derivee_conv;
326 derivee_conv.
copy(secmem, RESIZE_OPTIONS::COPY_INIT);
341 solveur_masse->appliquer(secmem);
377 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
379 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
389 Cerr <<
"VIA_CONTRIBUER_AU_SECOND_MEMBRE pas code pour " <<
que_suis_je() <<
":assembler" << finl;
414 if (op == 1) mat *= rhoCp;
416 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
418 DoubleTab resu_tmp(resu);
421 if (op == 1) resu_tmp *= rhoCp;
424 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
428 statistics().end_count(STD_COUNTERS::matrix_assembly,0,0);
430 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
438 Cerr <<
"Unknown value in Equation_base::assembler for " << (int)type_codage << finl;
453 for (
auto &&i_m : matrices) i_m.second->get_set_coeff() = 0;
455 for (
auto &&i_m : matrices)
459 mats2[i_m.first] = mat2;
465 DoubleTab secmem_tmp(secmem);
467 for (
auto &&i_m : mats2)
468 mats2[i_m.first]->get_set_coeff() = 0;
475 for (
auto &&i_m : mats2) *i_m.second *= rhoCp;
478 for (
auto &&i_m : matrices) *i_m.second += *mats2[i_m.first];
479 secmem += secmem_tmp;
482 statistics().end_count(STD_COUNTERS::ajouter_blocs,0,0);
484 statistics().begin_count(STD_COUNTERS::source_terms,statistics().get_last_opened_counter_level()+1);
486 les_sources(i)->ajouter_blocs(matrices, secmem, semi_impl);
487 statistics().end_count(STD_COUNTERS::source_terms);
489 statistics().begin_count(STD_COUNTERS::ajouter_blocs,statistics().get_last_opened_counter_level()+1);
492 Matrice_Morse *mat = matrices.count(nom_inco)?matrices.at(nom_inco):
nullptr;
495 for (
auto &&i_m : mats2)
504 for (
int w = 0; w<ref_penalisation_L2_FTD.size() ; ++w)
518 for (
int w = 0; w<ref_penalisation_L2_FTD.size() ; ++w)
559 const int voisin_0 = faces_elem(i_face, 0);
560 if (voisin_0 >= 0) indic_pena_global_fat(voisin_0) = 1;
561 const int voisin_1 = faces_elem(i_face, 1);
562 if (voisin_1 >= 0) indic_pena_global_fat(voisin_1) = 1;
566 const IntTab& elem_faces = domaine_vf.
elem_faces();
567 const int nb_faces_elem = elem_faces.
dimension(1);
569 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
571 if (indic_pena_global_fat(i_elem) == 0)
574 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
576 const int face = elem_faces(i_elem, i_face);
577 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
580 if (indic_pena_global_fat(voisin) != 0)
586 if (coeff > 1) indic_pena_global_fat(i_elem) = 1;
615 secmem_conv_vr *= rhoCp;
619 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
621 if (indic_pena_global_fat(i_elem) == 0) secmem_conv_vr(i_elem) = 0.;
628 if (maj == 1)
return;
633 Cerr <<
"Convection_Diffusion_Temperature::mise_en_place_domaine_fantome Facteur securite doit etre <= 1"<<finl;
638 IntTrav indicatrice_totale;
639 IntTrav indicatrice_face_totale ;
642 const int nb_elem = indicatrice_totale.
dimension(0);
645 for (
int k_elem =0 ; k_elem <nb_elem; ++k_elem) ((indicatrice_totale(k_elem)!=0) ? ++x : ++j);
649 const IntTab& elem_faces = domaine_vf.
elem_faces();
651 const int nb_faces_elem = elem_faces.
dimension(1);
656 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
659 double somme_inc = 0.;
665 IntTrav stok_vois(nb_faces_elem);
666 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
668 const int face = elem_faces(i_elem, i_face);
669 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
674 somme_inc += solution(voisin);
679 stok_vois(i_face) = voisin;
686 for (
int i_vois = 0; i_vois < nb_faces_elem; i_vois++)
688 for (
int ii_face = 0; ii_face < nb_faces_elem; ii_face++)
690 const int face_v = elem_faces(stok_vois(i_vois), ii_face);
691 const int voisin_v = faces_elem(face_v, 0) + faces_elem(face_v, 1) - stok_vois(i_vois);
692 if ((voisin_v >= 0) && (voisin_v != i_elem) )
696 somme_inc += solution(voisin_v);
706 solution(i_elem) = somme_inc / coeff;
715 IntTrav stok_vois(nb_faces_elem);
716 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
718 const int face = elem_faces(i_elem, i_face);
719 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
725 somme_inc += solution(voisin);
730 stok_vois(i_face) = voisin;
737 for (
int i_vois = 0; i_vois < nb_faces_elem; i_vois++)
739 for (
int ii_face = 0; ii_face < nb_faces_elem; ii_face++)
741 const int face_v = elem_faces(stok_vois(i_vois), ii_face);
742 const int voisin_v = faces_elem(face_v, 0) + faces_elem(face_v, 1) - stok_vois(i_vois);
743 if ((voisin_v >= 0) && (voisin_v != i_elem) )
747 somme_inc += solution(voisin_v);
757 solution(i_elem) = somme_inc / coeff;
769 Cout <<
"Mise_en_place_domaine_fantome : fluide -> ibc : "<<u<<
" elem. (dont "<<k_cor2<<
" corrigees) et ibc -> fluide : ";
770 Cout<<k<<
" elem.(dont "<<k_cor<<
" corrigees)"<<finl;
771 Cout <<
" nb elem. ibc : "<<x<<
" et nb elem fluide : "<<j<<
" sur un total de : "<<nb_elem<<finl;
772 if ((u != k_cor2) || (k !=k_cor))
774 Cerr <<
"Mise_en_place_domaine_fantome : Les cellules fantomes ne sont pas toutes corrigees"<<finl;
803 indicatrice_totale = 0;
804 indicatrice_face_totale = 0;
810 for (
int w = 0 ; w<ref_penalisation_L2_FTD.size() ; ++w)
816 for (
int k_elem =0 ; k_elem <nb_elem; ++k_elem)
818 if (indicatrice(k_elem)>0.)
820 if(indicatrice_totale(k_elem) != 0)
822 Cerr<<
"calcul_indic_pena_global : Attention: les elements des indicatrices se chevauchent "<<finl;
825 indicatrice_totale(k_elem) = w+1;
832 for (
int i = 0; i < nfaces ; i++)
834 const int elem0 = face_voisins(i, 0);
835 const int elem1 = face_voisins(i, 1);
837 if (elem0 >= 0) indi = indicatrice(elem0);
838 if (elem1 >= 0) indi += indicatrice(elem1);
841 if(indicatrice_face_totale(i) != 0)
843 Cerr<<
"calcul_indic_pena_global : Attention: les faces des indicatrices se chevauchent "<<finl;
846 indicatrice_face_totale(i) = w+1;
851 Cout<<
"Calcul_indic_pena_global : Nb d elements de l indicatrice globale des IBCs: "<<x;
852 Cout<<
" et nb de faces : "<<xf<<finl;
862 assert(ref_penalisation_L2_FTD.size() != 0);
873 const IntTab& elem_faces = domaine_vf.
elem_faces();
875 const int nb_faces_elem = elem_faces.
dimension(1);
879 DoubleTrav t_voisinage(inc);
880 DoubleTrav u_voisinage(u);
882 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
885 double somme_deriv = 0.;
891 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
893 const int face = elem_faces(i_elem, i_face);
894 const int voisin = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
899 somme += inc(voisin);
900 somme_deriv += u(voisin);
909 t_voisinage(i_elem) = somme / coeff;
910 u_voisinage(i_elem) = somme_deriv / coeff;
915 t_voisinage(i_elem) = inc(i_elem);
916 u_voisinage(i_elem) = u(i_elem);
923 DoubleTrav pena_glob(inc);
924 DoubleTrav tab_(inc);
925 DoubleTrav denom(inc);
928 for (
int i = 0 ; i < ref_penalisation_L2_FTD.size() ; ++i)
935 Cerr <<
" penalisation_L2: Les champs de temperature impose et calcule n'ont pas les memes dimensions" <<finl;
936 Cerr <<
" Dimension du champ de temperature impose "<< tab.
dimension(0) << finl;
937 Cerr <<
" Dimension du champ de temperature calcule par TRUST "<<inc.
line_size() <<finl;
938 Cerr <<
" Nombre d'elements stockes au dans l'iconnue " <<inc.
size() <<finl;
944 DoubleTrav pena_loc(indicatrice);
947 for (
int j = 0; j<nb_elem ; ++j)
950 if (indicatrice(j) > 0.)
953 pena_loc(j) = coeff_p;
967 tref_j = inc(j) + dt*u_old(j);
972 tref_j = (indicatrice(j)*tab(0)+(1.-indicatrice(j))*(t_voisinage(j)+dt*u_voisinage(j)));
977 tref_j = ((1.-indicatrice(j))*(t_voisinage(j)+dt*u_voisinage(j))+0.5*tab(0))/(1.5-indicatrice(j));
981 if (indicatrice(j) == 1.)
987 tref_j = (t_voisinage(j)+dt*u_voisinage(j));
991 Cerr <<
"Penalisation_L2: choix_pena invalide "<<
choix_pena <<finl;
998 pena_loc(j) *= (tref_j-inc(j));
1000 pena_glob(j) += pena_loc(j);
1007 for (
int j = 0 ; j<nb_elem ; ++j)
1009 u(j) = u_old(j) + pena_glob(j);
1010 u(j) /= (1. + denom(j)*dt/
eta);
1030 fichier+=equation.
le_nom();
1040 fic << (
Nom)
"# Impression puissance thermique";
1041 fic <<
" interface " << equation.
le_nom();
1042 fic <<
" en W" <<
"." << finl;
1043 fic << finl <<
"# Temps";
1052 os.
ouvrir(fichier,ios::app);
1055 os.
setf(ios::scientific);
1061 if (le_schema_en_temps->limpr())
1065 const DoubleVect& vol_maille = domaine_vf.
volumes();
1068 const double rho = tab_rho(0,0);
1070 const double cp = tab_cp(0,0);
1078 DoubleTab tkp1(inc);
1079 for (
int k = 0 ; k<nb_elem ; ++k) tkp1(k) += u(k)*dt;
1083 for (
int j = 0; j<nb_elem; ++j) F(j) = (tref(j)-denom(j)*tkp1(j))/
eta;
1087 DoubleTrav filtre(nb_elem);
1088 DoubleTrav filtre_glob(nb_elem);
1089 const double temps_flux = le_schema_en_temps->temps_courant();
1092 for (
int i = 0 ; i < ref_penalisation_L2_FTD.size() ; ++i)
1096 double Flux_pena= 0.;
1097 double Flux_pena_old= 0.;
1098 double Flux_temp_interne= 0.;
1101 for (
int j = 0 ; j<nb_elem ; ++j)
1103 if (indicatrice(j) > 0.)
1110 Flux_pena_old += u_old(j) * filtre(j) *rho *cp *vol_maille(j);
1111 Flux_pena += F(j) * filtre(j) * vol_maille(j) *rho *cp;
1112 Flux_temp_interne += filtre(j)*rho*cp*vol_maille(j)*u(j);
1116 Flux_pena_old =
mp_sum(Flux_pena_old);
1117 Flux_pena =
mp_sum(Flux_pena);
1118 Flux_temp_interne =
mp_sum(Flux_temp_interne);
1124 ouvrir_fichier_pena_th(FTE,
"Puissance_penalisation_thermique_ibc",1,nom_eq);
1126 FTE << espace << Flux_pena;
1130 ouvrir_fichier_pena_th(FTI,
"Puissance_thermique_ibc",1,nom_eq);
1132 FTI << espace << Flux_pena_old;
1136 ouvrir_fichier_pena_th(FTTI,
"Derivee_temps_temperature_ibc",1,nom_eq);
1138 FTTI << espace << Flux_temp_interne;
1145 double Flux_temp_externe= 0.;
1146 for (
int j = 0; j<nb_elem; ++j)
1148 Flux_temp_externe += (1.-filtre_glob(j)) *rho *cp *vol_maille(j) * u(j);
1152 Flux_temp_externe =
mp_sum(Flux_temp_externe);
1160 fichier_nom+=
"Derivee_temps_temperature_fluide.out";
1161 if (le_schema_en_temps->nb_impr()==1 && !
probleme().reprise_effectuee())
1163 fichier.
ouvrir(fichier_nom);
1167 fichier.
ouvrir(fichier_nom,ios::app);
1171 (fichier) <<temps_flux<<
" \t"<<Flux_temp_externe<<finl;
1190 for (
int i = 0; i < Nl; i++)
1191 for (
int n = 0; n < N; n++) val(i, n) = rho(0, n) * cp(!cCp * i, n) * T(i, n);
1197 for (
int i = 0; i < Nb; i++)
1198 for (
int n = 0; n < N; n++) bval(i, n) = b_cp(!cCp * i, n) * rho(0, n) * b_T(i, n);
1200 DoubleTab& d_T = deriv[
"temperature"];
1202 for (
int i = 0; i < Nl; i++)
1203 for (
int n = 0; n < N; n++) d_T(i, n) = rho(0, n) * cp(!cCp * i, n);
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
DoubleTab valeur_aux_bords() const override
renvoie la valeur du champ aux faces de bord
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
virtual DoubleTab valeur_aux_bords() const
renvoie la valeur du champ aux faces de bord
double temps() const
Renvoie le temps du champ.
void creer_champ(const Motcle &motlu) override
const Milieu_base & milieu() const override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
const Champ_base & get_champ(const Motcle &nom) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void associer_fluide(const Fluide_base &un_fluide)
classe Convection_Diffusion_Temperature Cas particulier de Convection_Diffusion_std
void ecrire_fichier_pena_th(DoubleTab &, DoubleTab &, DoubleTab &, DoubleTab &)
static void calculer_rho_cp_T(const Objet_U &obj, DoubleTab &val, DoubleTab &bval, tabs_t &deriv)
void set_indic_pena_globale()
DoubleTab & penalisation_L2(DoubleTab &)
DoubleTabs tab_penalisation_L2_FTD
void mise_en_place_domaine_fantome(DoubleTab &)
const Champ_Inc_base & inconnue() const override
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application de l'equation.
const Champ_base & get_champ(const Motcle &nom) const override
void associer_milieu_base(const Milieu_base &) override
Associe un milieu physique a l'equation, le milieu est en fait caste en Fluide_base.
void calcul_indic_pena_global(IntTab &, IntTab &)
int verifier_tag_indicatrice_pena_glob()
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...
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
double get_time_factor() const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void discretiser() override
Discretise l'equation.
void transport_ibc(DoubleTrav &, DoubleTab &)
DoubleTab & filtrage_si_appart_ibc(DoubleTab &, DoubleTab &)
int tag_indic_pena_global
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 creer_champ(const Motcle &motlu) override
IntTab indic_face_pena_global
void set_param(Param &titi) const override
void assembler_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
int mise_a_jour_tag_indicatrice_pena_glob()
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
Operateur_Diff terme_diffusif
const Operateur & operateur(int) const override
Renvoie l'operateur specifie par son index: renvoie terme_diffusif si i = 0.
int nombre_d_operateurs() const override
Renvoie le nombre d'operateurs de l'equation: 2 pour une equation de diffusion.
Operateur_Conv terme_convectif
void temperature(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
virtual void h_conv(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &eqn, OWN_PTR(Champ_Fonc_base)&ch, Motcle &nom, int temp_ref) const
virtual void grad_T(const Domaine_dis_base &z, const Domaine_Cl_dis_base &zcl, const Champ_Inc_base &eqn, OWN_PTR(Champ_Fonc_base)&ch) const
virtual type_calcul_du_residu codage_du_calcul_du_residu() const
@ VIA_CONTRIBUER_AU_SECOND_MEMBRE
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
double volumes(int i) 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
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
const Domaine & domaine() const
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 void set_param(Param &titi) const override
const Nom & le_nom() const override
Renvoie le nom de l'equation.
virtual const Milieu_base & milieu() const =0
DoubleTab & derivee_en_temps_conv(DoubleTab &, const DoubleTab &)
Add convection term In: solution is the unknown I.
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
int calculate_time_derivative() const
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
virtual DoubleTab & derivee_en_temps_inco(DoubleTab &)
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual const Champ_Inc_base & derivee_en_temps() const
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
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.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
void Gradient_conjugue_diff_impl(DoubleTrav &secmem, DoubleTab &solution)
virtual void discretiser()
Discretise l'equation.
Champs_compris champs_compris_
virtual void assembler_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Classe Fluide_reel_base Cette classe represente un fluide reel ainsi que.
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom & suffix(const char *const)
Extraction de suffixe : Nom x("azerty");.
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
classe Objet_U Cette classe est la classe de base des 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.
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
void tester_contribuer_a_avec(const DoubleTab &, const Matrice_Morse &)
virtual void contribuer_au_second_membre(DoubleTab &) const
DOES NOTHING - to override in derived classes.
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
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_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 Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
bool & reprise_effectuee()
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
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),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
int nb_impr() const
Renvoie le nombre d'impressions effectuees.
int precision_impr() const
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual void modifier_second_membre(const Equation_base &eqn, DoubleTab &secmem)
double temps_init() const
Renvoie le temps initial.
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
contribution a la matrice implicite des termes sources par defaut pas de contribution
DoubleTab & ajouter(DoubleTab &) const
Ajoute la contribution de toutes les sources de la liste au tableau passe en parametre,...
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
void copy(const TRUSTTab &, 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")
classe Transport_Interfaces_base Cette classe constitue la classe de base des equations de transport ...
virtual void check_indicatrice_is_up_to_date()=0
virtual const Champ_base & get_indicatrice()=0
virtual int get_mesh_tag() const =0