16#include <Equation_base.h>
17#include <Probleme_base.h>
18#include <Probleme_Couple.h>
19#include <Milieu_base.h>
22#include <LecFicDiffuse.h>
23#include <communications.h>
25#include <Schema_Euler_Implicite_Stationnaire.h>
60 Cerr <<
"A solver must be selected." << finl;
61 Cerr <<
"Syntax : " << finl
62 <<
"Solveur solver_name [ solver parameters ] " << finl;
67 Cerr <<
"diffusion_implicite option cannot be used with an implicit time scheme." << finl;
71 if (le_solveur->le_nom()!=
"Implicit_steady")
73 Cerr <<
"You can only select the Implicit_steady solver" << finl;
74 Cerr <<
"Syntax : " << finl
75 <<
"Solveur Implicit_steady [ solver parameters ] " << finl;
127 if(dt_loc.
size()* nb_dim == secmem.
size())
129 DoubleVect dt_loc_velocity(secmem);
131 for(
int i=0; i<dt_loc_velocity.
size(); i++)
133 if(i != 0 && i%nb_dim == 0) j++;
134 dt_loc_velocity[i]= dt_loc[j];
140 else if (dt_loc.
size()*2==secmem.
size())
143 DoubleVect dt_loc_velocity(secmem);
145 for(
int i=0; i<dt_loc_velocity.
size(); i++)
147 if(i != 0 && i%2 == 0) j++;
148 dt_loc_velocity[i]= dt_loc[j];
165 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
166 Cerr <<
"Implicit_Euler_Steady_Scheme: incompatible equation detected." << finl;
167 Cerr <<
" Equation : " << eqn.
que_suis_je() << finl;
168 Cerr <<
" dt_loc.size() = " << dt_loc.
size() <<
" (face-sized, from NS convection operator)" << finl;
169 Cerr <<
" secmem.size() = " << secmem.
size() <<
" (unknown DOF count for this equation)" << finl;
171 Cerr <<
"This scheme is ONLY compatible with VEF discretization when used" << finl;
172 Cerr <<
"with RANS turbulence (k-eps, k-omega) or temperature equations." << finl;
173 Cerr <<
"In VDF, turbulence and scalar unknowns are element-centered (nb_elem)" << finl;
174 Cerr <<
"while dt_loc is face-centered (nb_faces), which are incompatible." << finl;
175 Cerr <<
"Please switch to a VEF discretization or use a different time scheme." << finl;
176 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
195 for (
int count=0; count<
dt_locaux_.size(); count++)
212 if (
pb_base().discretisation().is_vdf())
219 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
220 Cerr <<
"Implicit_Euler_Steady_Scheme is NOT compatible with VDF" << finl;
221 Cerr <<
"for turbulent or multi-equation problems." << finl;
222 Cerr <<
" Discretization : VDF" << finl;
225 Cerr <<
"RANS turbulence (k-eps, k-omega) and temperature equations are" << finl;
226 Cerr <<
"not supported with this scheme in VDF: the local time-step" << finl;
227 Cerr <<
"coupling diverges due to inconsistent DOF layout." << finl;
228 Cerr <<
"Please switch to VEF discretization or use a standard time scheme." << finl;
229 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
254 double dt_loc_sum = mp_somme_vect(
dt_locaux_);
256 Cout <<
"dt_loc stats: min=" << dt_loc_min
257 <<
" max=" << dt_loc_max
258 <<
" mean=" << dt_loc_sum / dt_loc_n
259 <<
" ratio_max/min=" << dt_loc_max / (dt_loc_min + 1.e-300) << finl;
282 const double norm_un = mp_norme_vect(un);
283 DoubleTab tab_critere(unp1);
285 tab_critere /= std::max(norm_un, 1.e-10);
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
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....
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
void calculer_pas_de_temps_locaux(DoubleTab &) const
Classe Matrice_Base Classe de base de la hierarchie des matrices.
bool contient(const Nom &nom) const
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.
Helper class to factorize the readOn method of Objet_U classes.
virtual double calculer_pas_de_temps() const
Calcul la valeur du prochain pas de temps du probleme.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void imprimer_ram_totale(int all_process=0)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void initialize() override
bool isStationary() const override
Retourne 1 si lors du dernier pas de temps, le probleme n'a pas evolue.
void calculer_pas_de_temps_local_pb()
void mettre_a_jour_dt_stab() override
bool iterateTimeStep(bool &converged) override
Calculate the U(n+1) unknown for each equation (if solved) of the problem with the selected time sche...
double steady_security_factor_
int mettre_a_jour() override
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
bool corriger_dt_calcule(double &dt_calc) const override
Corrige le pas de temps calcule que l'on passe en parametre et verifie qu'il n'est pas "trop" petit (...
void ajouter_inertie(Matrice_Base &mat_morse, DoubleTab &secmem, const Equation_base &eqn) const override
int reprendre(Entree &) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
void set_param(Param &) const override
int reprendre(Entree &) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
void set_param(Param &) const override
bool iterateTimeStep(bool &converged) override
Calculate the U(n+1) unknown for each equation (if solved) of the problem with the selected time sche...
void calcul_fac_sec(double &residu_, double &residu_old, double &facsec_)
int diffusion_implicite() const
Renvoie 1 si le schema en temps a ete lu diffusion_implicite.
int limpr() const
Renvoie 1 s'il y a lieu d'effectuer une impression (cf dt_impr) Renvoie 0 sinon.
int & set_stationnaire_atteint()
virtual bool isStationary() const
Retourne 1 si lors du dernier pas de temps, le probleme n'a pas evolue.
Probleme_base & pb_base()
DoubleTab dt_locaux_
Local time steps: Vector of size nb faces of the mesh.
virtual void imprimer(Sortie &os) const
Imprime le pas de temps sur un flot de sortie s'il y a lieu.
virtual void initialize()
virtual int mettre_a_jour()
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
double dt_stab_
Pas de temps de stabilite.
void update_critere_statio(const DoubleTab &tab_critere, Equation_base &equation)
//Actualisation de stationnaire_atteint_ et residu_ (critere residu_<seuil_statio_)
virtual Matrice_Base & ajouter_masse_dt_local(DoubleVect &dt_locaux, Matrice_Base &matrice, int penalisation=1) const
Classe de base des flux de sortie.
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")