16#include <Implicit_steady.h>
17#include <Schema_Euler_Implicite_Stationnaire.h>
18#include <Domaine_VF.h>
19#include <Domaine_Cl_VEF.h>
20#include <Navier_Stokes_std.h>
23#include <Matrice_Bloc.h>
24#include <Assembleur_base.h>
25#include <Schema_Temps_base.h>
27#include <Fluide_Quasi_Compressible.h>
29#include <Probleme_base.h>
47void test_impose_bound_cond(
Equation_base& eqn,DoubleTab& current2,
const char * msg,
int flag)
51 DoubleTab sauv(present);
55 double ecart_max=mp_max_abs_vect(present);
56 Cout<<msg <<
" "<<ecart_max<<finl;
58 if ((ecart_max>1e-10))
68 Matrice_Morse& matrice,
double seuil_resol,DoubleTrav& secmem,
int nb_iter,
int& converge,
int& ok)
77 Cerr <<
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << finl;
78 Cerr <<
"Implicit_steady solveur can be used only with the Implicit_Euler_Steady_Scheme or Schema_Euler_Implicite_Stationnaire scheme!" << finl;
79 Cerr <<
"Please, contact TRUST support." << finl;
83 DoubleTrav gradP(current);
84 DoubleTrav correction_en_pression(pression);
85 DoubleTrav resu(current);
103 bool need_reassembly = (dt_loc.
size() == 0);
107 if (!need_reassembly)
109 for (
int i = 0; i < dt_loc_new.
size(); i++)
111 double var = std::abs(dt_loc_new[i] - dt_loc[i]) / (dt_loc[i] + 1.e-30);
112 max_var = std::max(max_var, var);
122 if (max_var == 0. && need_reassembly)
123 Cout <<
"Implicit_steady: first iteration -> dt_loc_ initialised, pressure matrix reassembled" << finl;
127 Cout <<
"Implicit_steady: dt_loc max relative variation: " << max_var
128 << (need_reassembly ?
" -> dt_loc_ updated, pressure matrix reassembled"
129 :
" -> dt_loc_ unchanged, pressure matrix reused") << finl;
135 gradient.calculer(pression,gradP);
139 le_solveur_->reinit();
140 Debog::verifier(
"Implicit_steady::iterer_NS resu apres assembler_avec_inertie",resu);
146 Cout <<
"Compute U* :" << finl;
148 test_impose_bound_cond(eqn,current,
"apres resolution ",0);
149 Debog::verifier(
"Implicit_steady::iterer_NS current apres CL",current);
156 Cerr<<
"Steady option is not compatible with the quasi/weakly compressible models !"<<finl;
157 Cerr <<
"Please, contact TRUST support." << finl;
162 divergence.calculer(current,secmem);
169 Cout <<
"Implicit_steady: solving mass equation :" << finl;
172 DoubleVect m_dt(dt_loc);
178 eqnNS.assembleur_pression()->assembler_mat(matrice_en_pression_2, m_dt, 1, 1);
179 solveur_pression_->reinit();
184 secmem,correction_en_pression);
187 gradient->multvect(correction_en_pression,gradP);
190 int size=gradP.
size();
193 DoubleVect dt_loc_velocity(current);
195 assert(dt_loc.
size() * nb_dim == dt_loc_velocity.
size());
197 for (
int i = 0; i < dt_loc_velocity.
size(); i++)
199 if (i != 0 && i % nb_dim == 0) j++;
200 dt_loc_velocity[i] = dt_loc[j];
204 for(
int i=0; i<size; i++)
206 gradP.
addr()[i] *=dt_loc_velocity[i];
211 test_impose_bound_cond(eqn,current,
"apres resolution ",0);
214 divergence.calculer(current,secmem);
217 pression += correction_en_pression;
219 eqnNS.assembleur_pression()->modifier_solution(pression);
220 pression.echange_espace_virtuel();
234 for (
int f = 0; f < volumes_cl.
size(); f++)
235 if (volumes_cl(f) != 0)
236 volumes(f) = volumes_cl(f);
242 const bool has_porosity = (porosite.
size_totale() == size);
244 const bool rho_per_face = (rho.
size_totale() == size);
245 for (
int face = 0; face < size; face++)
247 const double rho_f = rho_per_face ? rho(face) : 1.0;
248 const double por_f = has_porosity ? porosite(face) : 1.0;
249 m_dt(face) = volumes(face) * por_f * rho_f / dt_loc(face);
DoubleTab & futur(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.
virtual DoubleTab & valeurs()=0
static void verifier(const char *const msg, double)
virtual void imposer_cond_lim(Champ_Inc_base &, double)=0
DoubleVect & volumes_entrelaces()
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
virtual void assembler_avec_inertie(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
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.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
void iterer_NS(Equation_base &, DoubleTab ¤t, DoubleTab &pression, double, Matrice_Morse &, double, DoubleTrav &, int nb_iter, int &converge, int &ok) override
double seuil_variation_dt_
void calcul_mat_masse_diviser_par_dt(Navier_Stokes_std &eqnNS, DoubleVect &m_dt, const DoubleVect &dt_loc)
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
DoubleVect & porosite_face()
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
Operateur_Div & operateur_divergence()
Renvoie l'operateur de calcul de la divergence associe a l'equation.
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Matrice & matrice_pression()
SolveurSys & solveur_pression()
Renvoie le solveur en pression (version const).
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
classe Parametre_implicite Un objet Parametre_implicite est un objet regroupant les differentes
bool is_dilatable() const
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static double mp_max(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
DoubleVect & get_dt_loc()
int limpr() const
Renvoie 1 s'il y a lieu d'effectuer une impression (cf dt_impr) Renvoie 0 sinon.
double temps_courant() const
Renvoie le temps courant.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
const DoubleTab & pas_de_temps_locaux() const
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Parametre_implicite & get_and_set_parametre_implicite(Equation_base &eqn)
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")