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,...
class Equation_base The role of an equation is the calculation of one or more fields....
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()
Returns the problem associated with the equation.
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication of a vector by the matrix.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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
Matrice class - Generic class in the matrix hierarchy.
Navier_Stokes_std This class carries the terms of the momentum equation.
Operateur_Div & operateur_divergence()
Returns the divergence operator associated with the equation.
Operateur_Grad & operateur_gradient()
Returns the gradient operator associated with the equation.
int has_interface_blocs() const override
void reassembler_pression_si_necessaire()
Matrice & matrice_pression()
SolveurSys & solveur_pression()
Returns the pressure solver (const version).
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Operateur_Div Generic class of the hierarchy of operators computing the divergence.
Classe Operateur_Grad Generic class of the hierarchy of operators computing the gradient.
class Parametre_implicite A Parametre_implicite object groups together the various
bool is_dilatable() const
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
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 A SolveurSys represents any class
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Parametre_implicite & get_and_set_parametre_implicite(Equation_base &eqn)
Base class for output streams.
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")