16#include <Neumann_sortie_libre.h>
17#include <MD_Vector_composite.h>
18#include <Discretisation_base.h>
19#include <Matrice_Diagonale.h>
20#include <Navier_Stokes_std.h>
21#include <Schema_Temps_base.h>
22#include <Assembleur_base.h>
23#include <MD_Vector_tools.h>
24#include <TRUSTTab_parts.h>
25#include <Probleme_base.h>
26#include <MD_Vector_std.h>
27#include <Matrice_Bloc.h>
28#include <Solveur_U_P.h>
50 Cerr<<
" Solveur_U_P cannot be used with a quasi-compressible fluid."<<finl;
51 Cerr<<__FILE__<<(int)__LINE__<<
" non code" <<finl;
65 DoubleTab_parts ppart(pression);
69 mds.
add_part(ppart[0].get_md_vector(), ppart[0].line_size());
71 mds.
add_part(pression.get_md_vector(), pression.line_size());
75 DoubleTab Inconnues,residu;
79 DoubleTab_parts residu_parts(residu);
80 DoubleTab_parts Inconnues_parts(Inconnues);
82 Inconnues_parts[0] = current;
83 Inconnues_parts[1] = is_PolyMAC_CDO ? ppart[0] : pression;
88 Matrice_global.
get_bloc(0,0).typer(
"Matrice_Morse");
90 Matrice_global.
get_bloc(0,1).typer(
"Matrice_Morse");
104 gradient->dimensionner( mat_grad);
105 gradient->contribuer_a_avec(pression, mat_grad);
110 gradient->ajouter(pression,residu_parts[0]);
118 Matrice_global.
get_bloc(1,0).typer(
"Matrice_Morse");
120 divergence->dimensionner(mat_div);
121 divergence->contribuer_a_avec( current,mat_div);
122 divergence.calculer(current, residu_parts[1]);
124 Matrice_global.
get_bloc(1,1).typer(
"Matrice_Diagonale");
131 for (
int n_bord=0; n_bord < cls.size(); n_bord++)
137 int n = matrice.
get_tab1().size_array();
139 for (
int i = mat_grad.
get_tab1().size_array(); i < n; i++)
143 le_solveur_->reinit();
147 current += Inconnues_parts[0];
148 ppart[0] += Inconnues_parts[1];
152 eqnNS.assembleur_pression()->modifier_solution(pression);
156 divergence.calculer(current, secmem);
157 Cerr<<
" apresdiv "<<mp_max_abs_vect(secmem)<<finl;;
166 for (
int n_bord=0; n_bord < cls.size(); n_bord++)
172 Matrice_global.
get_bloc(1,0).typer(
"Matrice_Morse");
174 if (divergence.has_interface_blocs())
176 Matrice_global.
get_bloc(1,1).typer(
"Matrice_Morse");
178 divergence.dimensionner_blocs({ {
"vitesse", &mat_div_v } , {
"pression", &mat_div_p}});
179 divergence.ajouter_blocs({ {
"vitesse", &mat_div_v } , {
"pression", &mat_div_p}}, residu_parts[1]);
180 if (!has_P_ref && !
Process::me()) mat_div_p(0, 0) += 1;
184 divergence.dimensionner(mat_div_v);
185 divergence.contribuer_a_avec(current, mat_div_v);
186 divergence.calculer(current, residu_parts[1]);
187 Matrice_global.
get_bloc(1,1).typer(
"Matrice_Diagonale");
192 le_solveur_->reinit();
196 current += Inconnues_parts[0];
197 pression += Inconnues_parts[1];
201 eqnNS.assembleur_pression()->modifier_solution(pression);
206 divergence.calculer(current, secmem);
207 Cerr<<
" apresdiv "<<mp_max_abs_vect(secmem)<<finl;;
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
static void verifier(const char *const msg, double)
virtual bool is_PolyMAC_CDO() const
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
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={})
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.
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.
virtual void dimensionner_matrice(Matrice_Morse &mat_morse)
Metadata for a distributed composite vector.
void add_part(const MD_Vector &part, int shape=0, Nom name="")
Append the "part" descriptor to the composite vector.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
void copy(const MD_Vector_base &)
construction d'un objet MD_Vector par copie d'un objet existant.
virtual DoubleVect & ajouter_multvect(const DoubleVect &x, DoubleVect &r) const
Operation de multiplication-accumulation (saxpy) matrice vecteur.
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Diagonale Represente une matrice diagonale.
void dimensionner(int size)
double coeff(int i, int j) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab1() const
void set_nb_columns(const int)
int nb_lignes() const override
Return local number of lines (=size on the current proc).
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 dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
void reassembler_pression_si_necessaire()
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
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_base Cette classe est la base de la hierarchie des operateurs representant.
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 int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
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 & corriger_solution(DoubleTab &x, const DoubleTab &y, int incr=0) const
void iterer_NS(Equation_base &, DoubleTab ¤t, DoubleTab &pression, double, Matrice_Morse &, double, DoubleTrav &, int nb_iter, int &converge, int &ok) override
Classe de base des flux de sortie.
virtual const MD_Vector & get_md_vector() const