16#include <Terme_Source_Acceleration_VDF_Face.h>
17#include <Navier_Stokes_std.h>
18#include <Champ_Fonc_P0_VDF.h>
19#include <Milieu_base.h>
21#include <Domaine_Cl_VDF.h>
22#include <Periodique.h>
23#include <Domaine_VDF.h>
50 Cerr <<
"Terme_Source_Acceleration_VDF_Face::associer_domaines" << finl;
66static void TSAVDF_ajouter_liste_faces(
const int premiere_face,
const int derniere_face,
67 const DoubleVect& volumes_entrelaces,
68 const DoubleVect& volumes_elements,
69 const DoubleVect& porosite_surf,
70 const IntVect& orientation,
71 const IntTab& face_voisins,
73 const DoubleTab& terme_source,
80 const DoubleTab *
const rho_elem =
81 (bool(ref_rho)) ? &(ref_rho->
valeurs()) : 0;
83 for (num_face=premiere_face; num_face<derniere_face; num_face++)
85 const double vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
86 const int ncomp = orientation(num_face);
87 const double src = terme_source(num_face, ncomp);
94 const int elem0 = face_voisins(num_face,0);
95 const int elem1 = face_voisins(num_face,1);
96 double rho0 = 0, rho1 = 0, vol0 = 0, vol1 = 0;
99 rho0 = (*rho_elem)(elem0);
100 vol0 = volumes_elements(elem0);
104 rho1 = (*rho_elem)(elem1);
105 vol1 = volumes_elements(elem1);
107 rho = (rho0 * vol0 + rho1 * vol1) / (vol0 + vol1);
110 double a = src * rho;
111 s_face(num_face) = a;
113 resu(num_face) += a * vol;
126 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
128 const IntTab& face_voisins = domaine_VDF.
face_voisins();
129 const IntVect& orientation = domaine_VDF.
orientation();
139 const int nb_faces = secmem.
dimension(0);
140 DoubleTab acceleration_aux_faces(nb_faces, dim);
145 for (
int n_bord=0; n_bord<domaine_VDF.
nb_front_Cl(); n_bord++)
153 const int nfin = ndeb + le_bord.
nb_faces();
154 TSAVDF_ajouter_liste_faces(ndeb, nfin,
156 le_dom_VDF_->volumes(),
161 acceleration_aux_faces,
170 const int nfin = domaine_VDF.
nb_faces();
171 TSAVDF_ajouter_liste_faces(ndeb, nfin,
173 le_dom_VDF_->volumes(),
178 acceleration_aux_faces,
184 for (
int n_bord=0; n_bord<domaine_VDF.
nb_front_Cl(); n_bord++)
191 int nb_faces_bord=le_bord.
nb_faces();
192 ArrOfInt fait(nb_faces_bord);
194 for (
int ind_face=0; ind_face<nb_faces_bord; ind_face++)
196 if (fait[ind_face] == 0)
200 fait[ind_face_associee] = 1;
201 int face = le_bord.
num_face(ind_face);
202 int face_associee = le_bord.
num_face(ind_face_associee);
203 double val = 0.5*(secmem(face_associee)+secmem(face));
204 secmem(face)=secmem(face_associee) = val;
226 DoubleTab& v_faces_stockage)
const
228 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
229 const IntVect& orientation = domaine_VDF.
orientation();
230 const IntTab& faces_voisins = domaine_VDF.
face_voisins();
231 const DoubleVect& volumes = domaine_VDF.
volumes();
232 const IntTab& elem_faces = domaine_VDF.
elem_faces();
235 const int nb_faces = v_faces.
dimension(0);
236 v_faces_stockage.
resize(nb_faces, dim);
238 ArrOfDouble composante_vitesse(3);
239 for (i_face = 0; i_face < nb_faces; i_face++)
241 const int orientation_face = orientation(i_face);
242 composante_vitesse=0;
247 elem[0] = faces_voisins(i_face, 0);
248 elem[1] = faces_voisins(i_face, 1);
251 double volume_elem[2] = {0., 0.};
253 volume_elem[0] = volumes(elem[0]);
255 volume_elem[1] = volumes(elem[1]);
257 const double i_volume_total = 1. / (volume_elem[0] + volume_elem[1]);
259 for (composante = 0; composante < dim; composante++)
261 if (composante == orientation_face)
263 composante_vitesse[composante] = v_faces(i_face);
269 composante_vitesse[composante] = 0.;
271 for (i_elem = 0; i_elem < 2; i_elem++)
273 if (elem[i_elem] >= 0)
275 const int element = elem[i_elem];
276 const int face1 = elem_faces(element, composante);
277 const int face2 = elem_faces(element, composante + dim);
278 const double v1 = v_faces(face1);
279 const double v2 = v_faces(face2);
280 const double p = volume_elem[i_elem];
281 composante_vitesse[composante] += (v1 + v2) * 0.5 * p;
284 composante_vitesse[composante] *= i_volume_total;
287 for (composante = 0; composante < dim; composante++)
289 v_faces_stockage(i_face, composante) = composante_vitesse[composante];
292 return v_faces_stockage;
307 Cerr <<
"Erreur dans Terme_Source_Acceleration_VDF_Face::associer_champ_rho" << finl;
308 Cerr <<
" Le champ de masse volumique doit etre de type Champ_Fonc_P0_VDF" << finl;
309 Cerr <<
" Type du champ associe : " << champ_rho.
que_suis_je() << finl;
310 Cerr <<
" Nom du champ associe : " << champ_rho.
le_nom() << finl;
314 ref_rho_ = champ_rho;
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les 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() {
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
double volumes(int i) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
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.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
int num_premiere_face() const
int num_face(const int) const
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version 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 Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
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.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
Terme source d'acceleration specialise pour la discretisation VDF.
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
Ajoute le terme (la_source_ * rho * volume_entrelace) au champ resu.
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
Methode appelee par Source_base::completer() apres associer_domaines Remplit les ref.
const DoubleTab & calculer_vitesse_faces(DoubleTab &v_faces_stockage) const override
Calcul des trois composantes du champ de vitesse fluide au centre de chaque face.
void associer_champ_rho(const Champ_base &champ_rho) override
Associe le champ de masse volumique=> Le terme source calcule sera alors homogene a d/dt(integrale(rh...
virtual const Navier_Stokes_std & get_eq_hydraulique() const
Renvoie eq_hydraulique_ !
const DoubleTab & calculer_la_source(DoubleTab &src_faces) const
Calcul de la valeur du champ la_source aux faces en fonction de - calculer_vitesse_faces().
virtual Champ_Fonc_base & get_set_terme_source_post() const
virtual void lire_data(Entree &s)
Methode appelee par readOn des classes derivees Terme_Source_Acceleration_VDF_Face,...