TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Perte_Charge_Reguliere_VDF_Face.cpp
1/****************************************************************************
2* Copyright (c) 2024, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Perte_Charge_Reguliere_VDF_Face.h>
17#include <Domaine_VDF.h>
18#include <Sous_Domaine.h>
19#include <Champ_Face_VDF.h>
20#include <Fluide_Incompressible.h>
21#include <Probleme_base.h>
22#include <Champ_Uniforme.h>
23
24Implemente_instanciable(Perte_Charge_Reguliere_VDF_Face,"Perte_Charge_Reguliere_VDF_Face",Perte_Charge_VDF_Face);
25
26
28{
29 return s << que_suis_je() ;
30}
31
32
34{
36 Nom nom_sous_domaine;
37 s >> nom_sous_domaine;
38 Cerr << " nom du sous domaine " << nom_sous_domaine << finl ;
39 remplir_num_faces(nom_sous_domaine);
40 return s ;
41}
42
43
44/////////////////////////////////////////////////////////////////////
45//
46// Implementation des fonctions
47//
48// de la classe Perte_Charge_Reguliere_VDF_Face
49//
50////////////////////////////////////////////////////////////////////
51
53{
54 const Domaine& le_domaine = equation().probleme().domaine();
55 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF,equation().domaine_dis());
56 const IntTab& elem_faces = domaine_VDF.elem_faces();
57 const IntTab& face_voisins = domaine_VDF.face_voisins();
58 const DoubleVect& volumes = domaine_VDF.volumes();
59 const DoubleTab& xv = domaine_VDF.xv() ;
60 const Sous_Domaine& le_sous_domaine = le_domaine.ss_domaine(nom_sous_domaine);
61 int nb_poly_ss_domaine = le_sous_domaine.nb_elem_tot();
62 int k = direction_perte_charge();
63 DoubleVect xv_(dimension) ;
64 int dir_a_faire ;
65 int face_associee,nfac;
66 int num_poly;
67 num_faces.resize(nb_poly_ss_domaine*6);
68 corr_front_ss.resize(nb_poly_ss_domaine*6);
69
70 corr_front_ss = 1. ;
71
72 nfac = 0 ;
73
74
75 IntVect num_loc(domaine_VDF.nb_elem_tot());
76 num_loc = -1;
77 int num_elem,num_face;
78 for (num_elem=0; num_elem<nb_poly_ss_domaine; num_elem++)
79 num_loc[le_sous_domaine(num_elem)] = num_elem;
80
81 for (int direction = 0; direction<dimension; direction++)
82 {
83 Cerr << " Perte_Charge_Reguliere_VDF_Face::remplir num_face en direction " << direction << finl ;
84
85 if ((direction == k) || (dir[direction] == 1 ))
86 {
87 dir_a_faire = k ;
88 if (dir[direction] == 1 ) dir_a_faire = direction ;
89 for (num_elem=0; num_elem<nb_poly_ss_domaine; num_elem++)
90 {
91 num_poly = le_sous_domaine(num_elem);
92 num_face = elem_faces(num_poly,dir_a_faire);
93 num_faces[nfac++] = num_face;
94 for (int ifa=0; ifa<dimension; ifa++) xv_(ifa)= xv(num_face,ifa) ;
95 corr_front_ss[nfac-1] *= correction_direction( xv_ , dir_a_faire );
96
97 int num_poly_vois0 = face_voisins(num_face,0);
98 if (num_poly_vois0 != -1)
99 if (num_loc[num_poly_vois0] == -1) // le poly voisin n'est pas dans la sous_domaine
100 {
101 corr_front_ss[nfac-1]*= volumes(num_poly)/(volumes(num_poly)+volumes(num_poly_vois0)) ;
102 }
103 face_associee = elem_faces(num_poly,dir_a_faire+dimension);
104 int num_poly_vois1 = face_voisins(face_associee,1);
105 if (num_poly_vois1 != -1)
106 {
107 if (num_loc[num_poly_vois1] == -1) // le poly voisin n'est pas dans la sous_domaine
108 {
109 num_faces[nfac++] = face_associee;
110 for (int ifa=0; ifa<dimension; ifa++) xv_(ifa) = xv(face_associee,ifa) ;
111 corr_front_ss[nfac-1] *= correction_direction( xv_, dir_a_faire);
112 corr_front_ss[nfac-1] *= volumes(num_poly)/(volumes(num_poly)+volumes(num_poly_vois1)) ;
113 }
114 }
115 else
116 {
117 num_faces[nfac++]=face_associee;
118 }
119 }
120 }
121 }
122 num_faces.resize(nfac);
123 corr_front_ss.resize(nfac);
124
125}
126
127DoubleTab& Perte_Charge_Reguliere_VDF_Face::ajouter_(const DoubleTab& inco,DoubleTab& resu) const
128{
129
130 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
131 const IntTab& face_voisins = domaine_VDF.face_voisins();
132 const DoubleVect& volumes_entrelaces = domaine_VDF.volumes_entrelaces();
133 const IntTab& elem_faces = domaine_VDF.elem_faces();
134 const DoubleVect& porosite_surf = equation().milieu().porosite_face();
135 const DoubleTab& vit = la_vitesse->valeurs();
136 int ndeb_faces_int = domaine_VDF.premiere_face_int();
137 // on prend nu et non mu
138 const Champ_Don_base& nu = le_fluide->viscosite_cinematique();
139
140
141 double d_visco=-1;
142 int l_visco_unif=0;
143
144 if (sub_type(Champ_Uniforme,nu))
145 {
146 const Champ_Uniforme& ch_nu = ref_cast(Champ_Uniforme,nu);
147 d_visco = ch_nu.valeurs()(0,0);
148 l_visco_unif = 1;
149 }
150
151 {
152 int nb_faces,numfa;
153
154 double Cf,CK,U,U_abs,Reynolds;
155 const DoubleTab& visco = nu.valeurs();
156 {
157 nb_faces = num_faces.size();
158 for (int i=0; i<nb_faces; i++)
159 {
160 numfa = num_faces[i];
161 U = inco[numfa];
162 U_abs = std::fabs(vit[numfa]);
163
164 if (!l_visco_unif)
165 {
166 if (numfa < ndeb_faces_int)
167 {
168 int n0 = face_voisins(numfa,0);
169 if (n0 != -1)
170 d_visco = visco[n0];
171 else
172 d_visco = visco[face_voisins(numfa,1)];
173 }
174 else
175 d_visco = 0.5*(visco[face_voisins(numfa,0)]+visco[face_voisins(numfa,1)]);
176
177 }
178 if (couronne_tube == 1)
179 {
180 if (vit!=inco)
181 {
182 Cerr<<"not implemented " <<finl;
183 exit();
184 }
185 double U_res=0.,vit1,vit2,div,corr_sign=1.0;
186 int ori,el,fa1,fa2,fa3,fa4 ;
187 // modifications ajoutees par fabio :
188 ori = domaine_VDF.orientation(numfa);
189 vit1 = 0;
190 vit2 = 0;
191 div = 4.;
192 for (int ind=0; ind <2; ind++)
193 {
194 el = face_voisins(numfa,ind);
195 if (el!=-1)
196 {
197 fa1 = elem_faces(el,(ori+1));
198 fa2 = elem_faces(el,(ori+1+dimension)%(2*dimension));
199 vit1 += vit[fa1] + vit[fa2] ;
200 if (dimension == 3)
201 {
202 fa3 = elem_faces(el,(ori+2));
203 fa4 = elem_faces(el,(ori+2+dimension)%(2*dimension));
204 vit2 += vit[fa3] + vit[fa4];
205 }
206 }
207 else div = 2.;
208 }
209 vit1 = vit1/div;
210 U_res = U*U+vit1*vit1;
211 if (dimension == 3)
212 {
213 vit2 = vit2/div;
214 U_res += vit2*vit2;
215 }
216 // U_res = sqrt(U_res)/rasu();
217 U_res = sqrt(U_res);
218 Reynolds = U_res*d()/d_visco;
219 if (!Cf_utilisateur)
220 Cf = calculer_Cf_blasius(Reynolds);
221 else
222 Cf = CF();
223 CK = -0.5*Cf/D();
224 if (U != 0)
225 {
226 corr_sign = U/std::fabs(U);
227 }
228 resu[numfa] += CK*U_res*U_res*volumes_entrelaces[numfa]*porosite_surf[numfa]*corr_front_ss[i]*corr_sign;
229 }
230 else
231 {
232 Reynolds = U_abs*d()/d_visco;
233 if (!Cf_utilisateur)
234 Cf = calculer_Cf_blasius(Reynolds);
235 else
236 Cf = CF();
237 CK = -0.5*Cf/D();
238 resu[numfa] += CK*U*U_abs*volumes_entrelaces[numfa]*porosite_surf[numfa]*corr_front_ss[i];
239 }
240 }
241 }
242
243 }
244 return resu;
245}
246
247
248
249
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_Uniforme Represente un champ constant dans l'espace et dans le temps.
const Sous_Domaine_t & ss_domaine(int i) const
Definition Domaine.h:290
class Domaine_VDF
Definition Domaine_VDF.h:64
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
double volumes(int i) const
Definition Domaine_VF.h:113
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
Definition Domaine_VF.h:543
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
int nb_elem_tot() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Milieu_base & milieu() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
DoubleVect & porosite_face()
Definition Milieu_base.h:62
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
class Perte_Charge_Reguliere_VDF_Face
DoubleTab & ajouter_(const DoubleTab &, DoubleTab &) const override
double calculer_Cf_blasius(double) const
Entree & lire_donnees(Entree &)
Lit les specifications d'une perte de charge reguliere a partir d'un flot d'entree.
double correction_direction(DoubleVect &, int) const
int direction_perte_charge() const
Renvoie la direction de perte de charge.
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
int_t nb_elem_tot() const