16#include <Check_espace_virtuel.h>
17#include <Domaine_Cl_PolyMAC_family.h>
18#include <Navier_Stokes_std.h>
19#include <Schema_Temps_base.h>
20#include <Op_Div_PolyMAC_CDO.h>
21#include <Probleme_base.h>
22#include <EcrFicPartage.h>
23#include <Matrice_Morse.h>
24#include <Matrix_tools.h>
25#include <Array_tools.h>
47 const DoubleVect& surface = domaine_PolyMAC_CDO.
face_surfaces();
48 const IntTab& face_voisins = domaine_PolyMAC_CDO.
face_voisins();
53 declare_espace_virtuel_invalide(div);
61 const int nb_faces = domaine_PolyMAC_CDO.
nb_faces();
63 for (
int face = 0; face < premiere_face_int; face++)
65 const double flux = porosite_surf[face] * vit[face] * surface[face];
66 tab_flux_bords(face, 0) += flux;
68 const int elem1 = face_voisins(face, 0);
72 const int elem2 = face_voisins(face, 1);
77 for (
int face = premiere_face_int; face < nb_faces; face++)
79 const double flux = porosite_surf[face] * vit[face] * surface[face];
81 const int elem1 = face_voisins(face, 0);
85 const int elem2 = face_voisins(face, 1);
101 const DoubleVect& surface = domaine_PolyMAC_CDO.
face_surfaces();
102 const IntTab& face_voisins = domaine_PolyMAC_CDO.
face_voisins();
105 const int nb_faces = domaine_PolyMAC_CDO.
nb_faces();
107 for (
int face = 0; face < nb_faces; face++)
110 const double flux = -porosite_surf[face] * surface[face];
112 const int elem1 = face_voisins(face, 0);
114 matrice(elem1, face) += flux;
116 const int elem2 = face_voisins(face, 1);
118 matrice(elem2, face) -= flux;
131 int nb_faces = domaine_PolyMAC_CDO.
nb_faces();
133 int nb_elem_tot = domaine_PolyMAC_CDO.
nb_elem_tot();
134 Stencil stencyl(0, 2);
136 const IntTab& face_voisins = domaine_PolyMAC_CDO.
face_voisins();
139 for (
int face = 0; face < nb_faces; face++)
141 for (
int dir = 0; dir < 2; dir++)
143 const int elem = face_voisins(face, dir);
146 stencyl.
resize(nb_coef + 1, 2);
147 stencyl(nb_coef, 0) = elem;
148 stencyl(nb_coef, 1) = face;
153 tableau_trier_retirer_doublons(stencyl);
165 const int impr_bord = (le_dom_PolyMAC_CDO->domaine().bords_a_imprimer().est_vide() ? 0 : 1);
177 DoubleVect flux_bord(nb_compo);
178 DoubleVect bilan(nb_compo);
181 for (
int num_cl = 0; num_cl < le_dom_PolyMAC_CDO->nb_front_Cl(); num_cl++)
184 const Cond_lim& la_cl = le_dcl_PolyMAC_CDO->les_conditions_limites(num_cl);
187 const int nfin = ndeb + frontiere_dis.
nb_faces();
188 for (
int face = ndeb; face < nfin; face++)
189 for (
int k = 0; k < nb_compo; k++)
192 for (
int k = 0; k < nb_compo; k++)
197 for (
int k = 0; k < nb_compo; k++)
201 bilan(k) += flux_bord(k);
208 for (
int k = 0; k < nb_compo; k++)
214 for (
int num_cl = 0; num_cl < le_dom_PolyMAC_CDO->nb_front_Cl(); num_cl++)
216 const Frontiere_dis_base& la_fr = le_dcl_PolyMAC_CDO->les_conditions_limites(num_cl)->frontiere_dis();
217 const Cond_lim& la_cl = le_dcl_PolyMAC_CDO->les_conditions_limites(num_cl);
220 int nfin = ndeb + frontiere_dis.
nb_faces();
221 if (le_dom_PolyMAC_CDO->domaine().bords_a_imprimer().contient(la_fr.
le_nom()))
223 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps " << temps <<
" : " << finl;
224 for (
int face = ndeb; face < nfin; face++)
227 Flux_face <<
"# Face a x= " << le_dom_PolyMAC_CDO->xv(face, 0) <<
" y= " << le_dom_PolyMAC_CDO->xv(face, 1) <<
" flux=";
229 Flux_face <<
"# Face a x= " << le_dom_PolyMAC_CDO->xv(face, 0) <<
" y= " << le_dom_PolyMAC_CDO->xv(face, 1) <<
" z= " << le_dom_PolyMAC_CDO->xv(face, 2) <<
" flux=";
230 for (
int k = 0; k < nb_compo; k++)
244 const DoubleVect& vol = domaine_PolyMAC_CDO.
volumes();
247 for (
int num_elem = 0; num_elem < nb_elem; num_elem++)
248 div(num_elem) /= vol(num_elem);
classe Cond_lim Classe generique servant a representer n'importe quelle classe
static void verifier(const char *const msg, double)
int_t nb_elem_tot() const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
int nb_faces_tot() const
renvoie le nombre total de faces.
double volumes(int i) const
int oriente_normale(int f, int e) const
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.
const Domaine & domaine() const
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
int num_premiere_face() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
int impr(Sortie &os) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void volumique(DoubleTab &) const override
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
void dimensionner(Matrice_Morse &matrice) const override
DOES NOTHING - to override in derived classes.
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
Classe Operateur_Div_base Cette classe est la base de la hierarchie des operateurs representant.
DoubleTab & ajouter(const DoubleTab &vit, DoubleTab &div) const override
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual int has_interface_blocs() const
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
virtual void dimensionner(Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")