17#include <Navier_Stokes_std.h>
20#include <Matrice_Bloc.h>
21#include <Assembleur_base.h>
22#include <Schema_Temps_base.h>
25#include <Probleme_base.h>
65int inverser_par_diagonale(
const Matrice_Morse& matrice,
const DoubleTrav& resu,
const DoubleTab& current,DoubleTrav& correction_en_vitesse)
67 const auto& tab1 = matrice.
get_tab1();
68 const auto& tab2 = matrice.
get_tab2();
78 ConstDoubleTab_parts part(correction_en_vitesse);
79 int nb_ligne_reel=part[0].dimension(0);
83 for(
int i=0; i<nb_ligne_reel; i++)
85 for(
int j=0; j<nb_comp; j++)
88 for (
auto k=tab1(i*nb_comp+j); k<tab1(i*nb_comp+j+1)-1; k++)
89 t -= coeff(k)*current(tab2(k)-1);
91 correction_en_vitesse(i) = t/matrice(i*nb_comp+j,i*nb_comp+j);
97 for(
int i=0; i<nb_ligne_reel; i++)
99 for (
int j=0; j<nb_comp; j++)
107 tmp -= matrice(ii,k)*current((k/nb_comp));
110 double test=tmp/matrice(ii,ii);
111 if (!est_egal(test,correction_en_vitesse(i),1e-5))
113 Cerr<<i<<
" "<<j<<
" "<<resu(i)<<finl;
114 Cerr<<test<<
" ici "<<correction_en_vitesse(i)-test<<finl;
123 for(
int i=0; i<nb_ligne_reel; i++)
125 for(
int j=0; j<nb_comp; j++)
128 for (
auto k=tab1(i*nb_comp+j); k<tab1(i*nb_comp+j+1)-1; k++)
130 int i1 = (tab2(k)-1)/nb_comp;
131 int j1 = (tab2(k)-1)-i1*nb_comp;
132 t -= coeff(k)*current(i1,j1);
134 const double diagonal_coefficient = matrice(i*nb_comp+j,i*nb_comp+j);
135 assert(diagonal_coefficient!=0);
136 correction_en_vitesse(i,j) = t/diagonal_coefficient;
142 Cerr<<
"milieu"<<finl;
143 DoubleTrav corr2(correction_en_vitesse);
145 for(
int i=0; i<nb_ligne_reel; i++)
147 for (
int j=0; j<nb_comp; j++)
149 int ii = i*nb_comp+j;
150 corr2(i,j) = (resu(i,j)-corr2(i,j)+matrice(ii,ii)*current(i,j))/matrice(ii,ii);
151 double test = corr2(i,j);
152 if (!est_egal(test,correction_en_vitesse(i,j)))
154 Cerr<<i<<
" "<<j<<
" "<<resu(i,j)<<finl;
155 Cerr<<test<<
" ici "<<correction_en_vitesse(i,j)<<
" "<<current(i,j)<<
" "<<matrice(ii,ii) <<finl;
176 Cerr<<
" Simpler cannot be used with a quasi-compressible fluid."<<finl;
177 Cerr<<__FILE__<<(int)__LINE__<<
" non code" <<finl;
186 DoubleTrav gradP(current);
187 DoubleTrav correction_en_pression(pression);
188 DoubleTrav correction_en_vitesse(current);
189 DoubleTrav resu(current);
205 gradient.calculer(pression,gradP);
214 le_solveur_->reinit();
219 int status = inverser_par_diagonale(matrice,resu,current,correction_en_vitesse);
220 if (status!=0)
exit();
221 Debog::verifier(
"Simpler::iterer_NS correction_en_vitesse",correction_en_vitesse);
227 solveur_pression_->reinit();
230 divergence.calculer(correction_en_vitesse,secmem);
234 eqnNS.assembleur_pression()->modifier_secmem(secmem);
239 secmem,correction_en_pression);
242 operator_add(pression, correction_en_pression, VECT_ALL_ITEMS);
244 eqnNS.assembleur_pression()->modifier_solution(pression);
247 gradient->multvect(correction_en_pression,gradP);
257 divergence.calculer(current,secmem);
264 correction_en_pression = 0;
266 secmem,correction_en_pression);
274 Cerr<<
" rr "<<mp_max_abs_vect(secmem)<<finl;
277 divergence.ajouter(correction_en_vitesse, secmem);
278 Cerr<<
" rr2 "<<mp_max_abs_vect(secmem)<<finl;
283 current += correction_en_vitesse;
289 divergence.calculer(current, secmem);
290 Cerr<<
" apresdiv "<<mp_max_abs_vect(secmem)<<finl;;
static void verifier(const char *const msg, double)
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 assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={})
virtual void assembler_avec_inertie(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
const auto & get_coeff() const
Classe Matrice Classe generique de la hierarchie des matrices.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
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.
int has_interface_blocs() const override
void reassembler_pression_si_necessaire()
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
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void calculer_correction_en_vitesse(const DoubleTrav &correction_en_pression, DoubleTrav &gradP, DoubleTrav &correction_en_vitesse, const Matrice_Morse &matrice, const Operateur_Grad &gradient)
void assembler_matrice_pression_implicite(Equation_base &eqn_NS, const Matrice_Morse &matrice, Matrice &matrice_en_pression_2)
void iterer_NS(Equation_base &, DoubleTab ¤t, DoubleTab &pression, double, Matrice_Morse &, double, DoubleTrav &, int nb_iter, int &converge, int &ok) override
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)
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")