16#include <Champ_front_instationnaire_base.h>
17#include <Champ_front_var_instationnaire.h>
18#include <Dirichlet_entree_fluide_leaves.h>
19#include <Dirichlet_paroi_defilante.h>
20#include <Navier_Stokes_phase_field.h>
21#include <Dirichlet_paroi_fixe.h>
22#include <Neumann_sortie_libre.h>
23#include <Champ_Fonc_Face_VDF.h>
24#include <Matrice_Morse_Sym.h>
25#include <AssembleurPVDF_PF.h>
26#include <Domaine_Cl_VDF.h>
27#include <Matrice_Bloc.h>
28#include <Milieu_base.h>
29#include <Domaine_VDF.h>
30#include <Periodique.h>
60 const int nb_faces_bord = le_dom_VDF_->nb_faces_bord();
64 const Conds_lim& les_cl = le_dom_Cl_VDF_->les_conditions_limites();
65 const int nb_cl = les_cl.size();
66 int nb_faces_periodiques = 0;
67 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
75 const int nb_faces_cl = frontiere.
nb_faces();
77 for (
int i = 0; i < nb_faces_cl; i++)
81 if (face_associee > i)
83 const int num_face_global = num_premiere_face + i;
84 faces[nb_faces_periodiques] = num_face_global;
85 nb_faces_periodiques++;
92 return nb_faces_periodiques;
108 const Domaine_VDF& domaine_vdf = le_dom_VDF_.valeur();
109 const IntTab& face_voisins = domaine_vdf.
face_voisins();
120 const int nb_elem = domaine_vdf.
nb_elem();
122 ArrOfInt carre_nb_non_zero(nb_elem);
124 ArrOfInt rect_nb_non_zero(nb_elem);
126 carre_nb_non_zero = 1;
127 rect_nb_non_zero = 0;
128 int carre_nb_non_zero_tot = nb_elem;
129 int rect_nb_non_zero_tot = 0;
134 ArrOfInt liste_faces_perio;
138 for (i = 0; i < nb_faces_internes + nb_faces_periodiques; i++)
141 if (i < nb_faces_internes)
142 face = premiere_face_interne + i;
144 face = liste_faces_perio[i - nb_faces_internes];
146 int elem0 = face_voisins(face,0);
147 int elem1 = face_voisins(face,1);
158 carre_nb_non_zero[elem0] ++;
159 carre_nb_non_zero_tot ++;
163 rect_nb_non_zero[elem0] ++;
164 rect_nb_non_zero_tot ++;
170 la_matrice.typer(
"Matrice_Bloc");
173 matrice.
get_bloc(0,0).typer(
"Matrice_Morse_Sym");
174 matrice.
get_bloc(0,1).typer(
"Matrice_Morse");
178 carre.dimensionner(nb_elem, carre_nb_non_zero_tot);
179 rect.
dimensionner(nb_elem, nb_elem_tot - nb_elem, rect_nb_non_zero_tot);
185 auto& carre_tab1 = carre.get_set_tab1();
201 for (i = 0; i < nb_elem; i++)
203 carre_tab1[i] = indice;
204 indice += carre_nb_non_zero[i];
206 carre_tab1[i] = indice;
209 for (i = 0; i < nb_elem; i++)
211 rect_tab1[i] = indice;
212 indice += rect_nb_non_zero[i];
214 rect_tab1[i] = indice;
219 auto& carre_tab2 = carre.get_set_tab2();
226 for (i = 1; i <= nb_elem; i++)
227 carre_tab2[carre_tab1[i-1]-1] = i;
229 carre_nb_non_zero = 1;
230 rect_nb_non_zero = 0;
233 for (
int i_face = 0; i_face < nb_faces_internes + nb_faces_periodiques; i_face++)
237 const int face = (i_face < nb_faces_internes)
238 ? premiere_face_interne + i_face
239 : liste_faces_perio[i_face - nb_faces_internes];
241 int elem0 = face_voisins(face,0);
242 int elem1 = face_voisins(face,1);
252 const int ligne = elem0 + 1;
255 const int colonne = elem1 + 1;
256 const int n = carre_nb_non_zero[ligne-1]++;
257 const int index = carre_tab1[ligne-1] + n;
258 carre_tab2[index - 1] = colonne;
262 const int colonne = elem1 - nb_elem + 1;
263 const int n = rect_nb_non_zero[ligne-1]++;
264 const int index = rect_tab1[ligne-1] + n;
265 rect_tab2[index - 1] = colonne;
281 const Domaine_VDF& domaine_vdf = le_dom_VDF_.valeur();
282 const IntTab& face_voisins = domaine_vdf.
face_voisins();
283 const DoubleVect& face_surfaces = domaine_vdf.
face_surfaces();
285 const DoubleVect& porosite_face = le_dom_Cl_VDF_->equation().milieu().porosite_face();
288 const DoubleVect * valeurs_rho = 0;
292 valeurs_rho = & (rho_ptr->
valeurs());
301 const int nb_elem = domaine_vdf.
nb_elem();
302 ArrOfInt carre_nb_non_zero(nb_elem);
303 ArrOfInt rect_nb_non_zero(nb_elem);
304 carre_nb_non_zero = 1;
305 rect_nb_non_zero = 0;
307 auto& carre_tab1 = carre.get_set_tab1();
309 auto& carre_coeff = carre.get_set_coeff();
323 ArrOfInt liste_faces_perio;
327 for (
int i_face = 0; i_face < nb_faces_internes + nb_faces_periodiques; i_face++)
331 const int num_face = (i_face < nb_faces_internes)
332 ? premiere_face_interne + i_face
333 : liste_faces_perio[i_face - nb_faces_internes];
335 const double rho_face = (valeurs_rho) ? (*valeurs_rho)[num_face] : 1.;
337 const double surface = face_surfaces[num_face];
338 const double volume = volumes_entrelaces[num_face];
339 const double porosite = porosite_face[num_face];
340 const double coefficient = surface * surface * porosite / (volume * rho_face);
342 int elem0 = face_voisins(num_face,0);
343 int elem1 = face_voisins(num_face,1);
353 const int ligne = elem0 + 1;
355 const int index_diag = carre_tab1[ligne-1];
356 carre_coeff[index_diag - 1] += coefficient;
361 const int index_diag1 = carre_tab1[elem1];
363 const int n = carre_nb_non_zero[ligne-1]++;
364 const int index = index_diag + n;
366 carre_coeff[index_diag1 - 1] += coefficient;
368 carre_coeff[index - 1] = - coefficient;
369 assert(carre.get_set_tab2()[index - 1] == elem1 + 1);
374 const int n = rect_nb_non_zero[ligne-1]++;
375 const int index = rect_tab1[ligne-1] + n;
377 rect_coeff[index - 1] = - coefficient;
378 assert(rect.
get_set_tab2()[index - 1] == elem1 - nb_elem + 1);
384 const Conds_lim& les_cl = le_dom_Cl_VDF_->les_conditions_limites();
385 const int nb_cl = les_cl.size();
386 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
398 carre.set_est_definie(1);
401 const int nfin = ndeb + la_front_dis.
nb_faces();
403 for (
int num_face = ndeb; num_face < nfin; num_face++)
406 const double rho_face = (valeurs_rho) ? (*valeurs_rho)[num_face] : 1.;
408 const double surface = face_surfaces[num_face];
411 const double volume = volumes_entrelaces[num_face];
412 const double porosite = porosite_face[num_face];
413 const double coefficient = surface * surface * porosite / (volume * rho_face);
414 assert(coefficient > 0.);
416 const int elem0 = face_voisins(num_face, 0);
417 const int elem1 = face_voisins(num_face, 1);
418 assert(elem0 == -1 || elem1 == -1);
419 const int elem = elem0 + elem1 + 1;
421 assert(elem < nb_elem);
422 const int index = carre_tab1[elem];
423 carre_coeff[index - 1] += coefficient;
436 for (
int i = 0; i < nb_elem; i++)
438 const int index = carre_tab1[i];
439 const double coeff_diagonal = carre_coeff[index - 1];
440 if (coeff_diagonal == 0.)
443 carre_coeff[index - 1] = 1.;
464 for (
int indice_cl = 0; indice_cl < nb_cond_lim; indice_cl++)
491 else if (sub_type(
Symetrie, la_cl_base))
501 Cerr <<
"Erreur dans Assembleur_P_VDF::modifier_secmem\n la condition aux limites ";
502 Cerr << la_cl_base.
que_suis_je() <<
" n'est pas prise en charge." << finl;
534 Cerr <<
"Erreur dans Assembleur_P_VDF::modifier_secmem_pression_imposee\n ";
536 Cerr <<
" + resoudre_increment_pression non code" << finl;
548 const int nb_faces = frontiere_vf.
nb_faces();
550 for (
int i = 0; i < nb_faces; i++)
552 const int num_face = num_premiere_face + i;
555 const int elem = face_voisins(num_face, 0) + face_voisins(num_face, 1) + 1;
556 secmem[elem] += coef;
581 bool ch_unif = (tab_gpoint.
nb_dim()==1);
582 const int nb_faces = frontiere_vf.
nb_faces();
584 for (
int i = 0; i < nb_faces; i++)
586 const int num_face = num_premiere_face + i;
587 const double surface = face_surfaces(num_face);
588 const int elem0 = face_voisins(num_face, 0);
589 const int elem1 = face_voisins(num_face, 1);
592 const double signe = (elem0 < 0) ? 1. : -1.;
594 const int elem = elem0 + elem1 + 1;
596 const double gpoint = ch_unif ? tab_gpoint(ori) : tab_gpoint(i, ori);
598 secmem[elem] += signe * surface * gpoint;
621 int nb_elem=le_dom_VDF_->domaine().nb_elem();
622 for(
int n=0; n<nb_elem; n++)
623 if (pression[n] < press_0)
624 press_0 = pression[n];
625 press_0 =
mp_min(press_0);
627 pression.echange_espace_virtuel();
666 Cerr <<
"Assemblage de la matrice pression : ";
667 Cerr <<
"Assembleur_P_VDF_PF::assembler_rho_variable" << finl;
694 Cerr <<
"Assemblage de la matrice pression : ";
695 Cerr <<
"Assembleur_P_VDF::assembler_QC" << finl;
707 Cerr<<
"Pressure matrix will not be defined."<<finl;
712 Cerr<<
"la_matrice(0,0)"<<la_matrice(0,0)<<finl;
714 Cerr<<
"Pas de pression imposee --> P(0)=0"<<finl;
725 return le_dom_VDF_.valeur();
730 return le_dom_Cl_VDF_.valeur();
const Domaine_dis_base & domaine_dis_base() const override
int liste_faces_periodiques(ArrOfInt &faces)
Remplit le tableau faces avec la liste des indices des faces periodiques dans le tableau faces_voisin...
void completer(const Equation_base &) override
ArrOfDouble les_coeff_pression_
int assembler_rho_variable(Matrice &, const Champ_Don_base &rho) override
Assemblage de la matrice de pression M telle que M*P = div(porosite/rho * grad (P)).
const Domaine_Cl_dis_base & domaine_Cl_dis_base() const override
int assembler_QC(const DoubleTab &, Matrice &) override
Assemble la matrice de pression pour un fluide quasi compressible.
int assembler(Matrice &) override
Assemblage de la matrice de pression M telle que M*P = div(porosite * grad (P)).
void modifier_secmem_pression_imposee(const Neumann_sortie_libre &cond_lim, const Front_VF &frontiere_vf, DoubleTab &secmem)
Modification du second membre du solveur en pression pour une condition "Neumann_sortie_libre".
void modifier_secmem_vitesse_imposee(const Entree_fluide_vitesse_imposee &cond_lim, const Front_VF &frontiere_vf, DoubleTab &secmem)
Modification du second membre du systeme en pression pour une condition aux limites de vitesse impose...
void associer_domaine_dis_base(const Domaine_dis_base &) override
int modifier_secmem(DoubleTab &) override
Modification du second membre pour appliquer les conditions aux limites.
int construire(Matrice &la_matrice)
Determine les elements non nuls de la matrice et prepare le stockage.
int modifier_solution(DoubleTab &) override
int remplir(Matrice &la_matrice, const Champ_Don_base *rho_ptr)
Calcul des coefficients de la matrice de pression avec un champ de rho.
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
int get_resoudre_increment_pression() const
Renvoie la valeur du drapeau resoudre_increment_pression_ (0 ou 1) Renvoie -1 si le drapeau n'a pas e...
int set_resoudre_increment_pression(int flag)
Definit la valeur du drapeau resoudre_increment_pression_.
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_Face_VDF
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
classe Champ_front_base Classe de base pour les Champs aux frontieres instationnaires,
classe Champ_front_var_instationnaire Classe derivee de Champ_front_var qui represente les champs aux
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
virtual const DoubleVect & face_surfaces() const
DoubleVect & volumes_entrelaces()
int nb_faces_internes() const
une face est interne ssi elle separe deux elements.
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
classe Entree_fluide_vitesse_imposee Cas particulier de la classe Dirichlet_entree_fluide
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....
int num_premiere_face() const
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
int nb_lignes() const override
Return local number of lines (=size on the current proc).
void set_est_definie(int)
int get_est_definie() const
Classe Matrice Classe generique de la hierarchie des matrices.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static double mp_min(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Classe de base des flux de sortie.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")