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.");
143 if (mot==
"diffusion")
145 Cerr <<
"Reading and typing of the diffusion operator : " << finl;
152 else if (mot==
"convection")
154 Cerr <<
"Reading and typing of the convection operator : " << finl;
160 else if (mot==
"solveur_pression")
162 Cerr <<
"Reading and typing of pressure solver : " << finl;
168 else if (mot==
"dt_projection")
170 Cerr <<
"Reading projection time step " << finl;
175 else if (mot==
"Traitement_particulier")
177 Cerr <<
"Reading and typing of Traitement_particulier considered : " << finl;
178 Nom type=
"Traitement_particulier_NS_";
180 Motcle accouverte =
"{" , accfermee =
"}" ;
182 if (motbidon == accouverte)
186 if (le_cas == accfermee)
194 if (discr ==
"VEFPreP1B")
197 Cerr << type << finl;
198 le_traitement_particulier.typer(type);
199 le_traitement_particulier->associer_eqn(*
this);
200 le_traitement_particulier->lire(is);
204 Cerr <<
"Error while reading Traitement_particulier for Navier_Stokes_standard equation";
205 Cerr <<
"A { was expected." << finl;
210 else if (mot==
"Erreur_max_DivU")
212 Cerr <<
"Reading DivU maximum" << finl;
217 else if (mot==
"seuil_divU")
219 Cerr <<
"Reading the threshold value for the velocity divergence " << finl;
224 else if (mot==
"solveur_bar")
227 Motcle accouverte =
"{" , accfermee =
"}" ;
231 while (acc!=0 || !ok)
234 if (motlu==accouverte)
239 if (motlu==accfermee) acc--;
251 else if (mot==
"methode_calcul_pression_initiale")
256 compris[0]=
"avec_les_cl";
257 compris[1]=
"avec_sources";
258 compris[2]=
"avec_sources_et_operateurs";
259 compris[3]=
"sans_rien";
263 Cerr<<methode<<
" is not understood."<<finl;
264 Cerr<<
" Allowed keywords are :"<<compris<<finl;
318 Cerr <<
"Centrifuge force term creation for Axi case."<< finl;
319 Nom type_so =
"Force_Centrifuge_";
328 so->associer_eqn(*
this);
339 la_pression->associer_domaine_cl_dis(le_dom_Cl_dis);
348 assembleur_pression_->associer_domaine_cl_dis_base(
domaine_Cl_dis());
349 assembleur_pression_->completer(*
this);
351 if (distance_paroi_globale)
354 domaine.init_dist_paroi_globale(
domaine_Cl_dis().les_conditions_limites());
355 Cerr <<
"Initializing distance_paroi_globale ... " << finl;
356 const DoubleTab& dist_calc = domaine.y_elem();
357 for (
int e = 0 ; e < domaine.nb_elem() ; e++) distance_paroi_globale->valeurs()(e, 0) = dist_calc(e);
373 Cerr <<
"Hydraulic equation discretization (Navier_Stokes_std::discretiser)" << finl;
377 la_vitesse->add_synonymous(
Nom(
"velocity"));
394 gradient.l_op_base().associer_eqn(*
this);
430 Nom type =
"Assembleur_P_";
432 Cerr <<
"Navier_Stokes_std::discretiser_assembleur_pression : type="<< type << finl;
433 assembleur_pression_.typer(type);
434 assembleur_pression_->associer_domaine_dis_base(
domaine_dis());
439 if (!
probleme().domaine().mesh_update_required())
return;
481 Cerr <<
"Error for Navier_Stokes_std::operateur(int i)" << finl;
483 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
507 Cerr <<
"Error for Navier_Stokes_std::operateur(int i)" << finl;
509 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
525 Cerr <<
"Error for Navier_Stokes_std::operateur_fonctionnel(int i)" << finl;
526 Cerr <<
"Navier_Stokes_std has " <<
nombre_d_operateurs() <<
" functional operators "<<finl;
527 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
543 Cerr <<
"Error for Navier_Stokes_std::operateur_fonctionnel(int i)" << finl;
544 Cerr <<
"Navier_Stokes_std has " <<
nombre_d_operateurs() <<
" functional operators "<<finl;
545 Cerr <<
"and you are trying to access the " << i <<
" th one."<< finl;
610 return la_vitesse.valeur();
619 return la_vitesse.valeur();
639 return le_fluide.valeur();
649 return le_fluide.valeur();
654 Cerr <<
"Reading of initial conditions\n";
661 Cerr <<
"We expected a { while reading " <<
que_suis_je() << finl;
662 Cerr <<
"and not : " << nom << finl;
667 compris[1]=
"vitesse";
668 compris[2]=
"pression";
674 ind = compris.
rang(motlu);
691 Cerr << nom <<
" is not understood. Keywords are:" << finl;
692 Cerr << compris << finl;
704 if (assembleur_pression_->get_resoudre_increment_pression())
710 const DoubleTab& tab_pression =
la_pression->valeurs();
712 gradient.calculer(tab_pression, gradP);
732 DoubleTrav secmemP(tab_pression);
743 DoubleTab derivee2(derivee);
745 derivee2+=la_vitesse->passe();
759 DoubleTab derivee2(derivee);
769 assembleur_pression_->modifier_secmem(secmemP);
774 if (assembleur_pression_->get_resoudre_increment_pression())
777 DoubleTrav Cp(tab_pression);
782 assembleur_pression_->modifier_solution(tab_pression);
785 solveur_masse->appliquer(gradP);
792 assembleur_pression_->modifier_solution(tab_pression);
802 gradient.calculer(tab_pression, gradP);
806 DoubleTrav Mmoins1gradP(gradP);
807 Mmoins1gradP = gradP;
808 solveur_masse->appliquer(Mmoins1gradP);
811 derivee -= Mmoins1gradP;
829 Cerr <<
"WARNING: Quasi compressible model --> no projection (except the first time step)." << finl;
832 Cerr <<
"Projection of initial and boundaries conditions " << finl;
833 DoubleTab& tab_vitesse = la_vitesse->valeurs();
837 double normal_seuil = 0.;
850 dt = std::min(dt, le_schema_en_temps->pas_temps_max());
855 double bilan=mp_norme_vect(secmem);
856 Cout <<
"------------- Projection -----------------" << finl;
857 Cout <<
"--------------------------------------------" << finl;
858 Cout <<
"Bilan de masse avant projection : " << bilan << finl;
873 assembleur_pression_->modifier_solution(lagrange);
878 gradient->multvect(lagrange, gradP);
881 solveur_masse->appliquer(gradP);
885 tab_vitesse.
ajoute(-dt,gradP);
888 DoubleTab_parts partv(tab_vitesse);
889 partv[0].ajoute(-dt,gradP);
892 solveur_masse->corriger_solution(tab_vitesse, tab_vitesse);
900 bilan=mp_norme_vect(secmem);
901 Cout <<
"Bilan de masse apres projection : " << bilan << finl;
902 Cout <<
"------------- Projection OK---------------" << finl;
903 Cout <<
"--------------------------------------------" << finl;
919 double temps = le_schema_en_temps->temps_courant()+le_schema_en_temps->pas_de_temps();
923 static double nb_proj = nb_proj_int;
952 Cerr <<
"Assembling for quasi-compressible" << finl;
966 le_dom_Cl_dis->mettre_a_jour(temps);
973 Cout <<
"Estimation du champ de pression au demarrage:" << finl;
985 if (le_schema_en_temps->pas_de_temps() == 0)
988 dt = std::min(dt, le_schema_en_temps->pas_temps_max());
989 le_schema_en_temps->set_dt() = (dt);
994 le_schema_en_temps->set_dt() = 0;
997 solveur_masse->appliquer(vpoint);
1003 assembleur_pression_->modifier_secmem_pour_incr_p(
la_pression->valeurs(), 1, secmem);
1006 Cerr <<
"Pressure increment computed successfully" << finl;
1009 operator_add(
la_pression->valeurs(), inc_pre, VECT_ALL_ITEMS);
1025 if (le_traitement_particulier)
1026 le_traitement_particulier->preparer_calcul_particulier();
1061 if (postraitement_gradient_P_)
1065 solveur_masse->appliquer(
gradient_P->valeurs());
1080 double seuil_dyn_max = 1.e-10;
1081 seuil_dyn=std::max(seuil_dyn,seuil_dyn_max);
1089 if (le_traitement_particulier)
1090 le_traitement_particulier->post_traitement_particulier();
1092 Debog::verifier(
"Navier_Stokes_std::mettre_a_jour : vitesse", la_vitesse->valeurs());
1094 if (la_vorticite) la_vorticite->mettre_a_jour(temps);
1101double Navier_Stokes_std::LocalFlowRateRelativeError()
const
1137 if (i <=
pression().nb_valeurs_temporelles())
1167 ConstDoubleTab_parts ppart(tab_pression);
1223 ident_pression +=
Nom(temps,
probleme().reprise_format_temps());
1227 avancer_fichier_with_syno(is,ident_pression,field_tag_syno);
1231 avancer_fichier(is,ident_pression);
1235 if (le_traitement_particulier)
1236 le_traitement_particulier->reprendre_stat();
1256 Cerr <<
"Error of fluid type for the method Navier_Stokes_std::associer_milieu_base" << finl;
1269 Cerr <<
"You forgot to associate a fluid to the problem named " <<
probleme().
le_nom() << finl;
1272 return le_fluide.valeur();
1285 Cerr <<
"You forgot to associate a fluid to the problem named " <<
probleme().
le_nom() << finl;
1288 return le_fluide.valeur();
1295 if (motlu ==
"vorticite")
1304 else if (motlu ==
"critere_Q")
1313 else if (motlu ==
"y_plus")
1322 else if (motlu ==
"distance_paroi_globale")
1324 if (!distance_paroi_globale)
1331 else if (motlu ==
"reynolds_maille")
1340 else if (motlu ==
"courant_maille")
1349 else if (motlu ==
"taux_cisaillement")
1358 else if (motlu ==
"pression_hydrostatique")
1368 else if (motlu ==
"gradient_vitesse")
1378 if (le_traitement_particulier)
1379 le_traitement_particulier->creer_champ(motlu);
1387 DoubleTab& val= pression_hydro.
valeurs();
1389 if (!
milieu().a_gravite())
1391 Cerr<<
"postprocessing of presion_hydrostatique needs gravity"<<finl;
1397 Cerr<<
"postprocessing of presion_hydrostatique availabe only for incompressible flow"<<finl;
1405 for (
int som=0; som<nb_som; som++)
1409 gz+=coords(som,dir)*gravite(0,dir);
1417 if (nom ==
"gradient_pression")
1423 if (nom ==
"vorticite" && la_vorticite)
1435 if (nom ==
"y_plus" &&
y_plus)
1459 if (nom ==
"gradient_vitesse" &&
grad_u)
1474 if (le_traitement_particulier)
1475 if (le_traitement_particulier->has_champ(nom, ref_champ))
1483 if (nom ==
"gradient_pression")
1486 if (nom ==
"vorticite" && la_vorticite)
1492 if (nom ==
"y_plus" &&
y_plus)
1504 if (nom ==
"gradient_vitesse" &&
grad_u)
1513 if (le_traitement_particulier)
1514 if (le_traitement_particulier->has_champ(nom))
1523 if (nom ==
"gradient_pression")
1524 postraitement_gradient_P_ = 1;
1526 if (nom ==
"vorticite")
1529 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1532 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1537 if (nom ==
"critere_Q")
1540 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1543 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1548 if (nom ==
"y_plus")
1551 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1554 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1559 if (nom ==
"reynolds_maille")
1562 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1565 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1570 if (nom ==
"courant_maille")
1573 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1576 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1581 if (nom ==
"taux_cisaillement")
1584 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1587 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1592 if (nom ==
"gradient_vitesse")
1595 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1598 if ((ch.
temps() == temps_init) && (la_vitesse->mon_equation_non_nul()))
1603 if (nom ==
"pression_hydrostatique")
1606 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1609 if (((ch.
temps() != la_vitesse->temps()) || (ch.
temps() == temps_init)) && (la_vitesse->mon_equation_non_nul()))
1622 if (le_traitement_particulier)
1623 if (le_traitement_particulier->has_champ(nom, ref_champ))
1626 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
1633 if (le_traitement_particulier)
1634 le_traitement_particulier->get_noms_champs_postraitables(nom, opt);
1637 noms_compris.add(
"vorticite");
1638 noms_compris.add(
"critere_Q");
1639 noms_compris.add(
"y_plus");
1640 noms_compris.add(
"reynolds_maille");
1641 noms_compris.add(
"courant_maille");
1642 noms_compris.add(
"taux_cisaillement");
1643 noms_compris.add(
"pression_hydrostatique");
1644 noms_compris.add(
"gradient_vitesse");
1646 if (opt == DESCRIPTION)
1647 Cerr <<
" Navier_Stokes_std : " << noms_compris << finl;
1649 nom.add(noms_compris);
1667 double LocalFlowRateError=mp_max_abs_vect(
divergence_U->valeurs());
1669 os <<
"Cell balance flow rate control for the problem " <<
probleme().
le_nom() <<
" : " << finl;
1670 os <<
"Absolute value : " << LocalFlowRateError <<
" m"<<
dimension+
bidim_axi<<
"/s" << finl;
1671 os <<
"Relative value : " << LocalFlowRateRelativeError() << finl;
1678 os <<
"time step continuity errors : sum local = " << local <<
", global = " << global <<
", cumulative = " <<
cumulative_ << finl;
1684 Cerr <<
"The mass balance is too bad (relative value>1%)." << finl;
1685 Cerr <<
"Please check and lower the convergence value of the pressure solver." << finl;
1689#ifndef TRUST_USE_GPU
1694 Cerr << finl <<
"********************** Advice (printed only on the first " << nw <<
" time steps) *********************" << finl;
1695 Cerr <<
"You should use PETSc Cholesky solver instead of an iterative method for the pressure solver." << finl;
1696 Cerr <<
"For the caracteristics of your problem, it will be faster and give a better mass flow balance." << finl;
1697 Cerr <<
"**********************************************************************************************" << finl << finl;
1705 os <<
" seuil de convergence du solveur iteratif : " << solv_iter.
get_seuil() << finl;
1720 static Motcle domaine =
"Hydraulique";
1725 const DoubleTab& valeurs_inconnue,
1731 mat.typer(
"Matrice_Morse");
1744 if(type_solveur ==
"Solv_Cholesky" || type_solveur ==
"Solv_GCP")
1747 new_mat.set_est_definie(1);
1761 if (
gradient->has_interface_blocs())
1762 gradient->dimensionner_blocs({{
"vitesse", &matrice }});
1774 gradient->dimensionner_blocs(matrices, semi_impl);
1780 gradient->ajouter_blocs(matrices, secmem, semi_impl);
1804 static double dt_old=dt;
1831 DoubleTrav secmem(derivee);
1844 Cerr <<
"To be developped ... " << finl;
1869 DoubleTrav grad0(U);
1871 DoubleTrav residu(P);
1873 double dold,dnew,alfa;
1877 Cerr <<
"Begining Uzawa, secmem norm value : " << mp_norme_vect(secmem) << finl;
1880 solveur.
nommer(
"uzawa_solver");
1896 dold = mp_norme_vect(residu);
1903 Cerr <<
"Uzawa, initial residue : " << dnew << finl;
1905 while ( ( dnew > seuil ) && (niter++ < nmax) )
1915 s = mp_prodscal(resu, Cp);
1918 residu.
ajoute(alfa,resu);
1920 dnew = mp_norme_vect(residu);
1932 Cerr <<
"######## Uzawa, No convergence after : " << niter <<
" iterations\n";
1933 Cerr <<
"######## Uzawa, Residue : "<< dnew <<
"\n";
1939 Cerr << finl <<
"Uzawa, convergence reached after " << niter <<
" iterations" << finl;
1949 DoubleTrav F(secmem);
1958 double R_carre = local_carre_norme_vect(R);
1959 double UU_carre = local_carre_norme_vect(UU);
1961 Cerr <<
"Ending Uzawa : mass residue : " << sqrt(R_carre) <<finl;
1962 Cerr <<
"Ending Uzawa : Qdm residue : " << sqrt(UU_carre)<<finl;
1968 if (le_traitement_particulier)
1969 le_traitement_particulier->sauver_stat();
1974 Cerr<<
" Navier_Stokes_std::rho_la_vitesse() must be overloaded "<<finl;
1983 DoubleTab& tab_y_p =
y_plus->valeurs();
1986 for (
int n = 0 ; n < tab_y_p.
dimension_tot(1) ; n++) tab_y_p(i,n) = tab(i,n);
1989 for (
int n = 0 ; n < tab_y_p.
dimension_tot(1) ; n++) tab_y_p(i,n) = tab(i,0,n);
1994 if(
probleme().domaine().getCouplingMethod())
2009 if(
probleme().domaine().getCouplingMethod())
2011 Cout<<
" Implicit coupling: Navier_Stokes_std_ALE::updateFluidForce "<<finl;
2013 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()