16#include <Perte_Charge_Singuliere_VDF_Face.h>
17#include <Champ_Face_VDF.h>
18#include <Equation_base.h>
19#include <Pb_Multiphase.h>
20#include <Matrice_Morse.h>
21#include <Matrix_tools.h>
22#include <Array_tools.h>
23#include <Domaine_VDF.h>
51 ref_cast(
Pb_Multiphase, mon_equation->probleme()).equation_masse().init_champ_conserve();
58 int taille_bloc = domaine_VDF.
nb_elem();
65 Cerr <<
"Erreur a la lecture des donnees de la perte de charge singuliere :" << finl;
66 Cerr <<
" la surface sur laquelle vous avez defini une perte de charge" << finl;
67 Cerr <<
" ne contient entierement aucune des faces de la geometrie " << finl;
76 Cerr <<
"Erreur a la lecture des donnees de la perte de charge singuliere : " << finl;
77 Cerr <<
" l'orientation de la surface est differente de la direction" << finl;
78 Cerr <<
" de la perte de charge" << finl;
88 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr, mat2;
90 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
91 Stencil stencil(0, 2);
93 for (
int f = 0; f < domaine_VDF.
nb_faces(); f++)
95 tableau_trier_retirer_doublons(stencil);
108 Matrice_Morse *mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
111 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
125 for (
int i=0; i<nb_faces; i++)
132 for (
int j = 0; j < 2; j++)
134 const int e = f_e(numfa, j);
136 if (e < 0 )
continue;
138 for (
int n = 0; n < N; n++)
139 aar_f(n) += vfd(numfa, j) / volumes_entrelaces(numfa) * (*a_r)(e, n) * (*alpha)(e, n);
145 if (numfa < ndeb_faces_int)
146 Ck = -0.5*
K()/le_dom_VDF->dist_norm_bord_axi(numfa);
148 Ck = -0.5*
K()/le_dom_VDF->dist_norm_axi(numfa);
149 for (
int n = 0; n < N; n++)
151 const double U = vit(numfa, n);
152 secmem(numfa, n) += aar_f(n) * Ck*U*std::fabs(U)*volumes_entrelaces[numfa]*porosite_surf[numfa];
156 for (
int i=0; i<nb_faces; i++)
162 for (
int j = 0; j < 2; j++)
164 const int e = f_e(numfa, j);
166 if (e < 0 )
continue;
168 for (
int n = 0; n < N; n++)
169 aar_f(n) += vfd(numfa, j) / volumes_entrelaces(numfa) * (*a_r)(e, n) * (*alpha)(e, n);
174 if (numfa < ndeb_faces_int)
175 Ck = -0.5 *
K() / le_dom_VDF->dist_norm_bord(numfa);
177 Ck = -0.5 *
K() / le_dom_VDF->dist_norm(numfa);
179 for (
int n = 0; n < N; n++)
181 const double Ud = vit(numfa, n) * porosite_surf[numfa];
182 const double U = inco(numfa, n) * porosite_surf[numfa];
184 secmem(numfa,n) += aar_f(n) * Ck * U * std::fabs(Ud) * volumes_entrelaces[numfa] * porosite_surf[numfa];
186 (*mat)(N * numfa + n, N * numfa + n) -= aar_f(n) * Ck * porosite_surf[numfa] * std::fabs(Ud) * volumes_entrelaces[numfa] * porosite_surf[numfa];
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
const DoubleTab & volumes_entrelaces_dir() 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.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Champ_Inc_base & champ_conserve() const
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
const std::string & getString() const
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.
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
virtual Equation_base & equation_masse()
class Perte_Charge_Singuliere_VDF_Face
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl) const override
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
void mettre_a_jour(double temps) override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_(const DoubleTab &, DoubleTab &) const override
void completer() override
Met a jour les references internes a l'objet Source_base.
void remplir_num_faces(Entree &)
void update_K(const Equation_base &eqn, double deb, DoubleVect &bilan)
double calculate_Q(const Equation_base &eqn, const IntVect &num_faces, const IntVect &sgn) const
virtual void lire_surfaces(Entree &, const Domaine &, const Domaine_dis_base &, IntVect &, IntVect &, int lire_derniere_accolade=1)
Entree & lire_donnees(Entree &)
void mettre_a_jour(double temps) override
DOES NOTHING - to override in derived classes.
int direction_perte_charge() const
Renvoie la direction de perte de charge.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
void set_fichier(const Nom &)
void set_description(const Nom &nom)
virtual void completer()
Met a jour les references internes a l'objet Source_base.
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)