16#include <Transport_Interfaces_base.h>
17#include <MD_Vector_composite.h>
18#include <Matrice_Morse_Sym.h>
19#include <Navier_Stokes_std.h>
20#include <Frontiere_dis_base.h>
21#include <Schema_Temps_base.h>
22#include <MD_Vector_tools.h>
23#include <Assembleur_base.h>
24#include <TRUSTTab_parts.h>
25#include <communications.h>
26#include <Champ_Uniforme.h>
27#include <MD_Vector_std.h>
28#include <solv_iteratif.h>
29#include <Probleme_base.h>
30#include <Discret_Thyd.h>
31#include <Fluide_base.h>
32#include <Domaine_VF.h>
40#include <TRUST_2_PDI.h>
86 terme_convectif.set_description(
"Momentum flow rate=Integral(rho*u*u*ndS) [N] if SI units used");
88 terme_diffusif.set_description(
"Friction drag exerted by the fluid=Integral(-mu*(grad(u) +grad(u)^T)*ndS) [N] if SI units used");
91 gradient.set_fichier(
"Force_pression");
92 gradient.set_description(
"Pressure drag exerted by the fluid=Integral(P*ndS) [N] if SI units used");
102 param.
ajouter_condition(
"is_read_diffusion",
"The diffusion operator must be read, select negligeable type if you want to neglect it.");
103 param.
ajouter_condition(
"is_read_convection",
"The convection operator must be read, select negligeable type if you want to neglect it.");
134 if (mot==
"diffusion")
136 Cerr <<
"Reading and typing of the diffusion operator : " << finl;
143 else if (mot==
"convection")
145 Cerr <<
"Reading and typing of the convection operator : " << finl;
151 else if (mot==
"solveur_pression")
153 Cerr <<
"Reading and typing of pressure solver : " << finl;
159 else if (mot==
"dt_projection")
161 Cerr <<
"Reading projection time step " << finl;
166 else if (mot==
"Traitement_particulier")
168 Cerr <<
"Reading and typing of Traitement_particulier considered : " << finl;
169 Nom type=
"Traitement_particulier_NS_";
171 Motcle accouverte =
"{" , accfermee =
"}" ;
173 if (motbidon == accouverte)
177 if (le_cas == accfermee)
185 if (discr ==
"VEFPreP1B")
188 Cerr << type << finl;
189 le_traitement_particulier.typer(type);
190 le_traitement_particulier->associer_eqn(*
this);
191 le_traitement_particulier->lire(is);
195 Cerr <<
"Error while reading Traitement_particulier for Navier_Stokes_standard equation";
196 Cerr <<
"A { was expected." << finl;
201 else if (mot==
"Erreur_max_DivU")
203 Cerr <<
"Reading DivU maximum" << finl;
208 else if (mot==
"seuil_divU")
210 Cerr <<
"Reading the threshold value for the velocity divergence " << finl;
215 else if (mot==
"solveur_bar")
218 Motcle accouverte =
"{" , accfermee =
"}" ;
222 while (acc!=0 || !ok)
225 if (motlu==accouverte)
230 if (motlu==accfermee) acc--;
242 else if (mot==
"methode_calcul_pression_initiale")
247 compris[0]=
"avec_les_cl";
248 compris[1]=
"avec_sources";
249 compris[2]=
"avec_sources_et_operateurs";
250 compris[3]=
"sans_rien";
254 Cerr<<methode<<
" is not understood."<<finl;
255 Cerr<<
" Allowed keywords are :"<<compris<<finl;
309 Cerr <<
"Centrifuge force term creation for Axi case."<< finl;
310 Nom type_so =
"Force_Centrifuge_";
319 so->associer_eqn(*
this);
330 la_pression->associer_domaine_cl_dis(le_dom_Cl_dis);
339 assembleur_pression_->associer_domaine_cl_dis_base(
domaine_Cl_dis());
340 assembleur_pression_->completer(*
this);
342 if (distance_paroi_globale)
345 domaine.init_dist_paroi_globale(
domaine_Cl_dis().les_conditions_limites());
346 Cerr <<
"Initializing distance_paroi_globale ... " << finl;
347 const DoubleTab& dist_calc = domaine.y_elem();
348 for (
int e = 0 ; e < domaine.nb_elem() ; e++) distance_paroi_globale->valeurs()(e, 0) = dist_calc(e);
364 Cerr <<
"Hydraulic equation discretization (Navier_Stokes_std::discretiser)" << finl;
368 la_vitesse->add_synonymous(
Nom(
"velocity"));
385 gradient.l_op_base().associer_eqn(*
this);
421 Nom type =
"Assembleur_P_";
423 Cerr <<
"Navier_Stokes_std::discretiser_assembleur_pression : type="<< type << finl;
424 assembleur_pression_.typer(type);
425 assembleur_pression_->associer_domaine_dis_base(
domaine_dis());
430 if (!
probleme().domaine().mesh_update_required())
return;
472 Cerr <<
"Error for Navier_Stokes_std::operateur(int i)" << finl;
474 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
498 Cerr <<
"Error for Navier_Stokes_std::operateur(int i)" << finl;
500 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
516 Cerr <<
"Error for Navier_Stokes_std::operateur_fonctionnel(int i)" << finl;
517 Cerr <<
"Navier_Stokes_std has " <<
nombre_d_operateurs() <<
" functional operators "<<finl;
518 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
534 Cerr <<
"Error for Navier_Stokes_std::operateur_fonctionnel(int i)" << finl;
535 Cerr <<
"Navier_Stokes_std has " <<
nombre_d_operateurs() <<
" functional operators "<<finl;
536 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
601 return la_vitesse.valeur();
610 return la_vitesse.valeur();
630 return le_fluide.valeur();
640 return le_fluide.valeur();
645 Cerr <<
"Reading of initial conditions\n";
652 Cerr <<
"We expected a { while reading " <<
que_suis_je() << finl;
653 Cerr <<
"and not : " << nom << finl;
658 compris[1]=
"vitesse";
659 compris[2]=
"pression";
665 ind = compris.
rang(motlu);
682 Cerr << nom <<
" is not understood. Keywords are:" << finl;
683 Cerr << compris << finl;
695 if (assembleur_pression_->get_resoudre_increment_pression())
701 const DoubleTab& tab_pression =
la_pression->valeurs();
703 gradient.calculer(tab_pression, gradP);
723 DoubleTrav secmemP(tab_pression);
734 DoubleTab derivee2(derivee);
736 derivee2+=la_vitesse->passe();
750 DoubleTab derivee2(derivee);
760 assembleur_pression_->modifier_secmem(secmemP);
765 if (assembleur_pression_->get_resoudre_increment_pression())
768 DoubleTrav Cp(tab_pression);
773 assembleur_pression_->modifier_solution(tab_pression);
776 solveur_masse->appliquer(gradP);
783 assembleur_pression_->modifier_solution(tab_pression);
793 gradient.calculer(tab_pression, gradP);
797 DoubleTrav Mmoins1gradP(gradP);
798 Mmoins1gradP = gradP;
799 solveur_masse->appliquer(Mmoins1gradP);
802 derivee -= Mmoins1gradP;
820 Cerr <<
"WARNING: Quasi compressible model --> no projection (except the first time step)." << finl;
823 Cerr <<
"Projection of initial and boundaries conditions " << finl;
824 DoubleTab& tab_vitesse = la_vitesse->valeurs();
828 double normal_seuil = 0.;
841 dt = std::min(dt, le_schema_en_temps->pas_temps_max());
846 double bilan=mp_norme_vect(secmem);
847 Cout <<
"------------- Projection -----------------" << finl;
848 Cout <<
"--------------------------------------------" << finl;
849 Cout <<
"Bilan de masse avant projection : " << bilan << finl;
864 assembleur_pression_->modifier_solution(lagrange);
869 gradient->multvect(lagrange, gradP);
872 solveur_masse->appliquer(gradP);
876 tab_vitesse.
ajoute(-dt,gradP);
879 DoubleTab_parts partv(tab_vitesse);
880 partv[0].ajoute(-dt,gradP);
883 solveur_masse->corriger_solution(tab_vitesse, tab_vitesse);
891 bilan=mp_norme_vect(secmem);
892 Cout <<
"Bilan de masse apres projection : " << bilan << finl;
893 Cout <<
"------------- Projection OK---------------" << finl;
894 Cout <<
"--------------------------------------------" << finl;
910 double temps = le_schema_en_temps->temps_courant()+le_schema_en_temps->pas_de_temps();
914 static double nb_proj = nb_proj_int;
943 Cerr <<
"Assembling for quasi-compressible" << finl;
957 le_dom_Cl_dis->mettre_a_jour(temps);
964 Cout <<
"Estimation du champ de pression au demarrage:" << finl;
976 if (le_schema_en_temps->pas_de_temps() == 0)
979 dt = std::min(dt, le_schema_en_temps->pas_temps_max());
980 le_schema_en_temps->set_dt() = (dt);
985 le_schema_en_temps->set_dt() = 0;
988 solveur_masse->appliquer(vpoint);
994 assembleur_pression_->modifier_secmem_pour_incr_p(
la_pression->valeurs(), 1, secmem);
997 Cerr <<
"Pressure increment computed successfully" << finl;
1000 operator_add(
la_pression->valeurs(), inc_pre, VECT_ALL_ITEMS);
1016 if (le_traitement_particulier)
1017 le_traitement_particulier->preparer_calcul_particulier();
1052 if (postraitement_gradient_P_)
1056 solveur_masse->appliquer(
gradient_P->valeurs());
1071 double seuil_dyn_max = 1.e-10;
1072 seuil_dyn=std::max(seuil_dyn,seuil_dyn_max);
1080 if (le_traitement_particulier)
1081 le_traitement_particulier->post_traitement_particulier();
1083 Debog::verifier(
"Navier_Stokes_std::mettre_a_jour : vitesse", la_vitesse->valeurs());
1085 if (la_vorticite) la_vorticite->mettre_a_jour(temps);
1092double Navier_Stokes_std::LocalFlowRateRelativeError()
const
1128 if (i <=
pression().nb_valeurs_temporelles())
1158 ConstDoubleTab_parts ppart(tab_pression);
1214 ident_pression +=
Nom(temps,
probleme().reprise_format_temps());
1218 avancer_fichier_with_syno(is,ident_pression,field_tag_syno);
1222 avancer_fichier(is,ident_pression);
1226 if (le_traitement_particulier)
1227 le_traitement_particulier->reprendre_stat();
1247 Cerr <<
"Error of fluid type for the method Navier_Stokes_std::associer_milieu_base" << finl;
1260 Cerr <<
"You forgot to associate a fluid to the problem named " <<
probleme().
le_nom() << finl;
1263 return le_fluide.valeur();
1276 Cerr <<
"You forgot to associate a fluid to the problem named " <<
probleme().
le_nom() << finl;
1279 return le_fluide.valeur();
1286 if (motlu ==
"vorticite")
1295 else if (motlu ==
"critere_Q")
1304 else if (motlu ==
"y_plus")
1313 else if (motlu ==
"distance_paroi_globale")
1315 if (!distance_paroi_globale)
1322 else if (motlu ==
"reynolds_maille")
1331 else if (motlu ==
"courant_maille")
1340 else if (motlu ==
"taux_cisaillement")
1349 else if (motlu ==
"pression_hydrostatique")
1359 else if (motlu ==
"gradient_vitesse")
1369 if (le_traitement_particulier)
1370 le_traitement_particulier->creer_champ(motlu);
1378 DoubleTab& val= pression_hydro.
valeurs();
1380 if (!
milieu().a_gravite())
1382 Cerr<<
"postprocessing of presion_hydrostatique needs gravity"<<finl;
1388 Cerr<<
"postprocessing of presion_hydrostatique availabe only for incompressible flow"<<finl;
1396 for (
int som=0; som<nb_som; som++)
1400 gz+=coords(som,dir)*gravite(0,dir);
1408 if (nom ==
"gradient_pression")
1414 if (nom ==
"vorticite" && la_vorticite)
1426 if (nom ==
"y_plus" &&
y_plus)
1450 if (nom ==
"gradient_vitesse" &&
grad_u)
1465 if (le_traitement_particulier)
1466 if (le_traitement_particulier->has_champ(nom, ref_champ))
1474 if (nom ==
"gradient_pression")
1477 if (nom ==
"vorticite" && la_vorticite)
1483 if (nom ==
"y_plus" &&
y_plus)
1495 if (nom ==
"gradient_vitesse" &&
grad_u)
1504 if (le_traitement_particulier)
1505 if (le_traitement_particulier->has_champ(nom))
1514 if (nom ==
"gradient_pression")
1515 postraitement_gradient_P_ = 1;
1517 if (nom ==
"vorticite")
1520 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1523 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1528 if (nom ==
"critere_Q")
1531 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1534 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1539 if (nom ==
"y_plus")
1542 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1545 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1550 if (nom ==
"reynolds_maille")
1553 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1556 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1561 if (nom ==
"courant_maille")
1564 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1567 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1572 if (nom ==
"taux_cisaillement")
1575 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1578 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1583 if (nom ==
"gradient_vitesse")
1586 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1589 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1594 if (nom ==
"pression_hydrostatique")
1597 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1600 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1613 if (le_traitement_particulier)
1614 if (le_traitement_particulier->has_champ(nom, ref_champ))
1617 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1624 if (le_traitement_particulier)
1625 le_traitement_particulier->get_noms_champs_postraitables(nom, opt);
1628 noms_compris.add(
"vorticite");
1629 noms_compris.add(
"critere_Q");
1630 noms_compris.add(
"y_plus");
1631 noms_compris.add(
"reynolds_maille");
1632 noms_compris.add(
"courant_maille");
1633 noms_compris.add(
"taux_cisaillement");
1634 noms_compris.add(
"pression_hydrostatique");
1635 noms_compris.add(
"gradient_vitesse");
1637 if (opt == DESCRIPTION)
1638 Cerr <<
" Navier_Stokes_std : " << noms_compris << finl;
1640 nom.add(noms_compris);
1658 double LocalFlowRateError=mp_max_abs_vect(
divergence_U->valeurs());
1660 os <<
"Cell balance flow rate control for the problem " <<
probleme().
le_nom() <<
" : " << finl;
1661 os <<
"Absolute value : " << LocalFlowRateError <<
" m"<<
dimension+
bidim_axi<<
"/s" << finl;
1662 os <<
"Relative value : " << LocalFlowRateRelativeError() << finl;
1669 os <<
"time step continuity errors : sum local = " << local <<
", global = " << global <<
", cumulative = " <<
cumulative_ << finl;
1675 Cerr <<
"The mass balance is too bad (relative value>1%)." << finl;
1676 Cerr <<
"Please check and lower the convergence value of the pressure solver." << finl;
1680#ifndef TRUST_USE_GPU
1685 Cerr << finl <<
"********************** Advice (printed only on the first " << nw <<
" time steps) *********************" << finl;
1686 Cerr <<
"You should use PETSc Cholesky solver instead of an iterative method for the pressure solver." << finl;
1687 Cerr <<
"For the caracteristics of your problem, it will be faster and give a better mass flow balance." << finl;
1688 Cerr <<
"**********************************************************************************************" << finl << finl;
1696 os <<
" seuil de convergence du solveur iteratif : " << solv_iter.
get_seuil() << finl;
1711 static Motcle domaine =
"Hydraulique";
1716 const DoubleTab& valeurs_inconnue,
1722 mat.typer(
"Matrice_Morse");
1735 if(type_solveur ==
"Solv_Cholesky" || type_solveur ==
"Solv_GCP")
1738 new_mat.set_est_definie(1);
1752 if (
gradient->has_interface_blocs())
1753 gradient->dimensionner_blocs({{
"vitesse", &matrice }});
1765 gradient->dimensionner_blocs(matrices, semi_impl);
1771 gradient->ajouter_blocs(matrices, secmem, semi_impl);
1795 static double dt_old=dt;
1822 DoubleTrav secmem(derivee);
1835 Cerr <<
"To be developped ... " << finl;
1860 DoubleTrav grad0(U);
1862 DoubleTrav residu(P);
1864 double dold,dnew,alfa;
1868 Cerr <<
"Begining Uzawa, secmem norm value : " << mp_norme_vect(secmem) << finl;
1871 solveur.
nommer(
"uzawa_solver");
1887 dold = mp_norme_vect(residu);
1894 Cerr <<
"Uzawa, initial residue : " << dnew << finl;
1896 while ( ( dnew > seuil ) && (niter++ < nmax) )
1906 s = mp_prodscal(resu, Cp);
1909 residu.
ajoute(alfa,resu);
1911 dnew = mp_norme_vect(residu);
1923 Cerr <<
"######## Uzawa, No convergence after : " << niter <<
" iterations\n";
1924 Cerr <<
"######## Uzawa, Residue : "<< dnew <<
"\n";
1930 Cerr << finl <<
"Uzawa, convergence reached after " << niter <<
" iterations" << finl;
1940 DoubleTrav F(secmem);
1949 double R_carre = local_carre_norme_vect(R);
1950 double UU_carre = local_carre_norme_vect(UU);
1952 Cerr <<
"Ending Uzawa : mass residue : " << sqrt(R_carre) <<finl;
1953 Cerr <<
"Ending Uzawa : Qdm residue : " << sqrt(UU_carre)<<finl;
1959 if (le_traitement_particulier)
1960 le_traitement_particulier->sauver_stat();
1965 Cerr<<
" Navier_Stokes_std::rho_la_vitesse() must be overloaded "<<finl;
1974 DoubleTab& tab_y_p =
y_plus->valeurs();
1977 for (
int n = 0 ; n < tab_y_p.
dimension_tot(1) ; n++) tab_y_p(i,n) = tab(i,n);
1980 for (
int n = 0 ; n < tab_y_p.
dimension_tot(1) ; n++) tab_y_p(i,n) = tab(i,0,n);
1985 if(
probleme().domaine().getCouplingMethod())
2000 if(
probleme().domaine().getCouplingMethod())
2002 Cout<<
" Implicit coupling: Navier_Stokes_std_ALE::updateFluidForce "<<finl;
2004 DoubleTab field_value = velocity;
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 & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
void resetTime(double time) override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
double changer_temps_futur(double, int i=1)
Fixe le temps du ieme champ futur.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
Champ_base & affecter(const Champ_base &)
Affecter un champ dans un autre.
double temps() const
Renvoie le temps du champ.
static void verifier(const char *const msg, double)
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void gradient_P(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
void pression_en_pa(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&) const
void pression(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&) const
virtual void courant_maille(const Domaine_dis_base &, const Schema_Temps_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void y_plus(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void taux_cisaillement(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void creer_champ_vorticite(const Schema_Temps_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void grad_u(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
void divergence_U(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&) const
virtual void distance_paroi_globale(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
void vitesse(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) const
virtual void reynolds_maille(const Domaine_dis_base &, const Fluide_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void critere_Q(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &, OWN_PTR(Champ_Fonc_base)&) const
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
double volume_total() const
DoubleTab_t & les_sommets()
virtual void ajouter_correctif_volumique(const DoubleTab &, const DoubleTab &, double, DoubleTab &) const
virtual bool getCouplingMethod() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
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
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
virtual void dimensionner_matrice_sans_mem(Matrice_Morse &mat_morse)
virtual int verif_Cl() const
Verifie la compatibilite des conditions limites avec l'equation.
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the data to save/restore. This has to be overrode f...
virtual void associer_pb_base(const Probleme_base &)
S'associe au Probleme passe en parametre.
Sources & sources()
Renvoie les termes sources asssocies a 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.
Nom create_polymacfamily_syno(const Nom &field_tag) const
Create a synonym of a field name in order to ensure backward compatibility with old names of the Poly...
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual int impr(Sortie &os) const
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
virtual void abortTimeStep()
Reinitialiser ce qui doit l'etre.
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void initialise_residu(int=0)
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...
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
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.
virtual void verifie_ch_init_nb_comp(const Champ_Inc_base &ch_ref, const int nb_comp) const
Verification du nombre de composantes lues pour la specification d un champ.
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.
int limpr() const
Demande au schema en temps si il faut effectuer une impression.
void creer_champ(const Motcle &motlu) override
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
virtual void discretiser()
Discretise l'equation.
virtual int has_interface_blocs() const
virtual void resetTime(double time)
Reset current time of the equation. Used from ICoCo. See documentation of Problem_base::resetTime().
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.
virtual double calculer_pas_de_temps() const
Calcul du prochain pas de temps.
virtual int nb_comp() const
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
const Champ_Don_base & viscosite_cinematique() const
Classe Matrice_Base Classe de base de la hierarchie des matrices.
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int rang(const char *const ch) const
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
Operateur_Diff terme_diffusif
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
virtual const Champ_Inc_base & rho_la_vitesse() const
virtual void updateFluidForce(DoubleTab &)
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application: "Hydraulique".
virtual void modify_initial_variable()
void resetTime(double time) override
Reset current time of the equation. Used from ICoCo. See documentation of Problem_base::resetTime().
int reprendre(Entree &) override
Effectue une reprise a partir d'un flot d'entree.
Operateur_Conv terme_convectif
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
void creer_champ(const Motcle &motlu) override
virtual const Champ_base & vitesse_pour_transport() 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.
Entree & lire_cond_init(Entree &) override
Lecture des conditions initiales dans un flot d'entree.
DoubleTab & corriger_derivee_impl(DoubleTab &) override
Resolution de la pression, inconnue implicitee de Navier Stokes.
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
virtual void projeter()
Calcule la solution U des equations: | M(U-V)/dt + BtP = 0.
Operateur_Div & operateur_divergence()
Renvoie l'operateur de calcul de la divergence associe a l'equation.
void completer() override
Complete l'equation base, associe la pression a l'equation,.
Matrice matrice_pression_
int sauvegarder(Sortie &) const override
Appelle Equation_base::sauvegarder(Sortie&) et sauvegarde la pression sur un flot de sortie.
const Champ_base & get_champ(const Motcle &nom) const override
Champ_Inc_base & pression_pa()
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
void abortTimeStep() override
Reinitialiser ce qui doit l'etre.
int impr(Sortie &os) const override
Effectue quelques impressions sur un flot de sortie: - maximum de div U.
virtual void calculer_pression_hydrostatique(Champ_base &pression_hydro) const
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
void associer_pb_base(const Probleme_base &) override
S'associe au probleme: apelle Equation_base::associer_pb_base(const Probleme_base&).
virtual void sauver() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
virtual void discretiser_grad_p()
bool postraiter_gradient_pression_sans_masse_
void update_y_plus(const DoubleTab &tab)
virtual void discretiser_assembleur_pression()
Typage de l'assembleur pression.
virtual void modify_initial_gradP(DoubleTrav &)
DoubleTab & corriger_derivee_expl(DoubleTab &) override
Add a specific term for Navier Stokes (-gradP(n)) if necessary.
int has_interface_blocs() const override
void set_param(Param &titi) const override
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
int verif_Cl() const override
Verifie la compatibilite des conditions limites avec l'equation.
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...
virtual int projection_a_faire()
int div_u_nul_et_non_dsurdt_divu_
virtual void discretiser_vitesse()
void discretiser() override
Dicretise l'equation.
void uzawa(const DoubleTab &, const Matrice_Base &, SolveurSys &, DoubleTab &, DoubleTab &)
virtual bool getCouplingInfoForFiltering() const
virtual const Champ_Don_base & diffusivite_pour_transport() const
OWN_PTR(Assembleur_base) &assembleur_pression()
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
Operateur_Diff & operateur_diff()
const Operateur & operateur_fonctionnel(int) const override
void reassembler_pression_si_necessaire()
const Operateur & operateur(int) const override
Renvoie le i-eme operateur de l'equation: - le terme_diffusif si i = 0.
int nombre_d_operateurs_tot() const override
void associer_milieu_base(const Milieu_base &) override
Associe un mileu physique a l'equation en construisant dynamiquement (cast) un objet de type Fluide_b...
void assembler_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
SolveurSys & solveur_pression()
Renvoie le solveur en pression (version const).
SolveurSys solveur_pression_
OBS_PTR(Fluide_base) le_fluide
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void calculer_la_pression_en_pa()
Calcul de "la_pression_en_pa" en fonction de "la_pression".
int nombre_d_operateurs() const override
Renvoie le nombre d'operateurs de l'equation: Pour Navier Stokes Standard c'est 2.
int methode_calcul_pression_initiale_
Champ_Inc_base & pression()
void associer_fluide(const Fluide_base &un_fluide)
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)).
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_Diff Classe generique de la hierarchie des operateurs representant un terme
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
Appel a l'objet sous-jacent.
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
void volumique(DoubleTab &) const
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.
classe Operateur_base Classe est la base de la hierarchie des objets representant un
const SolveurSys & get_solveur() const
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
SolveurSys & set_solveur()
int get_decal_temps() const
virtual void dimensionner(Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
const Matrice & get_matrice() const
classe Operateur Classe generique de la hierarchie des operateurs.
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_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool is_dilatable() const
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void mp_sum_for_each(T &arg1, T &arg2)
C++14 compatible mp_sum_for_each: combine multiple mp_sum calls into one collective operation Usage: ...
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
virtual int nb_valeurs_futures() const =0
double temps_init() const
Renvoie le temps initial.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
void nommer(const Nom &nom) override
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
virtual Matrice_Base & ajouter_masse(double dt, Matrice_Base &matrice, int penalisation=1) const
virtual DoubleTab & corriger_solution(DoubleTab &x, const DoubleTab &y, int incr=0) const
Classe de base des flux de sortie.
classe Source Classe generique de la hierarchie des sources, un objet Source peut
void typer_direct(const Nom &)
void mettre_a_jour(double temps)
Mise a jour en temps, de toute les sources de la liste.
DoubleTab & ajouter(DoubleTab &) const
Ajoute la contribution de toutes les sources de la liste au tableau passe en parametre,...
_SIZE_ dimension_tot(int) const override
void copy(const TRUSTTab &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
void ajoute(_SCALAR_TYPE_ alpha, const TRUSTVect &y, Mp_vect_options opt=VECT_ALL_ITEMS)
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
static int is_PDI_restart()