TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Terme_Boussinesq_Sensibility_VEFPreP1B_Face.cpp
1/****************************************************************************
2* Copyright (c) 2023, 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 <Terme_Boussinesq_Sensibility_VEFPreP1B_Face.h>
17#include <Terme_Boussinesq_VEFPreP1B_Face.h>
18#include <Convection_Diffusion_Temperature_sensibility.h>
19#include <Fluide_Incompressible.h>
20#include <Champ_Uniforme.h>
21#include <Periodique.h>
22#include <Domaine_VEF.h>
23#include <Domaine_Cl_VEF.h>
24#include <Domaine_VEF.h>
25#include <Synonyme_info.h>
26
27extern double calculer_coef_som(int rang_elem, int dimension, int& nb_face_diri, int *indice_diri);
28
29Implemente_instanciable(Terme_Boussinesq_Sensibility_VEFPreP1B_Face, "Terme_Boussinesq_Sensibility_VEFPreP1B_Face", Terme_Boussinesq_VEFPreP1B_Face) ;
30Add_synonym(Terme_Boussinesq_Sensibility_VEFPreP1B_Face,"Boussinesq_temperature_sensibility_VEFPreP1B_P1NC");
31
32//// printOn
34{
36}
37
38//// readOn
40{
42}
43
44
45
47{
48 Cerr<<"Terme_Boussinesq_Sensibility_VEFPreP1B_Face::ajouter, equation_scalaire() = "<<equation_scalaire().que_suis_je()<<finl;
49 assert(equation_scalaire().que_suis_je()=="Convection_Diffusion_Temperature_sensibility");
50
51 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_VEF.valeur());
52 if (domaine_VEF.get_alphaE() && !domaine_VEF.get_alphaS() && !domaine_VEF.get_alphaA())
54
55 const DoubleVect& volumes = domaine_VEF.volumes();
56 const DoubleVect& porosite_surf = equation().milieu().porosite_face();
57 const Champ_Inc_base& le_scalaire = equation_scalaire().inconnue();
58 const DoubleVect& g = gravite().valeurs();
59 const Domaine_Cl_VEF& domaine_Cl_VEF = le_dom_Cl_VEF.valeur();
60 const IntTab& elem_sommets = domaine_VEF.domaine().les_elems();
61 const IntTab& elem_faces = domaine_VEF.elem_faces();
62 const DoubleTab& coord_sommets=domaine_VEF.domaine().les_sommets();
63 ArrOfDouble T0 = getScalaire0();
64 double beta_a=0;
65 // Verifie la validite de T0:
66 check();
67 ArrOfDouble T0_etat=T0;
68 OWN_PTR(Champ_Inc_base) T_etat = le_scalaire;
69 T_etat->valeurs()=0.;
70
72 if (eqn_conv_diff_temp_sens.get_uncertain_variable_name()=="BOUSSINESQ_TEMPERATURE")
73 T0=1.;
74 else
75 T0=0.;
76 if (eqn_conv_diff_temp_sens.get_uncertain_variable_name()=="BETA_TH")
77 {
78 const DoubleTab& val_T_etat = eqn_conv_diff_temp_sens.get_temperature_state_field();
79 T_etat->valeurs().reset();
80 T_etat->valeurs()=val_T_etat;
81 beta_a=1.;
82 }
83 else
84 T0_etat=0.;
85
86
87
88 int nbpts=-1; // nombre de points d'integration
89
90 if(dimension==2)
91 {
92 nbpts=3; // ordre 2
93 }
94 else if(dimension==3)
95 {
96 nbpts=4; // ordre 2
97 }
98 else
99 assert(0);
100
101 // On remplit les Poids et les coord_bary :
102 ArrOfDouble Poids(nbpts);
103 DoubleTab coord_bary(nbpts,dimension+1); // lambda_i des points
104 if(dimension==2)
105 {
106 double tiers=0.333333333333333;
107 Poids[0]=tiers;
108 Poids[1]=Poids[2]=Poids[0];
109
110 coord_bary(0,0)=0.5;
111 coord_bary(0,1)=0.;
112 coord_bary(0,2)=0.5;
113
114 coord_bary(1,0)=0.;
115 coord_bary(1,1)=0.5;
116 coord_bary(1,2)=0.5;
117
118 coord_bary(2,0)=0.5;
119 coord_bary(2,1)=0.5;
120 coord_bary(2,2)=0.;
121 }
122 else if(dimension==3)
123 {
124 Poids[0]=0.25;
125 Poids[1]=Poids[2]=Poids[3]=Poids[0];
126
127 double a = 0.5854101966249685;
128 double b = 0.1381966011250105;
129
130 coord_bary(0,0)=a;
131 coord_bary(0,1)=b;
132 coord_bary(0,2)=b;
133 coord_bary(0,3)=b;
134
135 coord_bary(1,0)=b;
136 coord_bary(1,1)=a;
137 coord_bary(1,2)=b;
138 coord_bary(1,3)=b;
139
140 coord_bary(2,1)=b;
141 coord_bary(2,0)=b;
142 coord_bary(2,2)=a;
143 coord_bary(2,3)=b;
144
145 coord_bary(3,2)=b;
146 coord_bary(3,0)=b;
147 coord_bary(3,1)=b;
148 coord_bary(3,3)=a;
149 }
150 else
151 assert(0);
152
153 int nb_comp = le_scalaire.nb_comp(); // Vaut 1 si temperature, nb_constituents si concentration
154 IntVect les_polygones(nbpts);
155 DoubleTab les_positions(nbpts,dimension);
156 DoubleTab valeurs_scalaire(nbpts,nb_comp);
157 DoubleTab valeurs_scalaire_etat(nbpts,nb_comp);
158 DoubleTab valeurs_beta(nbpts,nb_comp);
159 DoubleVect valeurs_Psi(nbpts);
160 ArrOfDouble somme(dimension);
161 ArrOfDouble a0(dimension),a0a1(dimension),a0a2(dimension),a0a3(dimension);
162
163 // Extension possible des volumes de controle:
164 int modif_traitement_diri=( sub_type(Domaine_VEF,domaine_VEF) ? ref_cast(Domaine_VEF,domaine_VEF).get_modif_div_face_dirichlet() : 0);
165 modif_traitement_diri = 0; // Forcee a 0 car ne marche pas d'apres essais Ulrich&Thomas
166 int nb_face_diri=0;
167 int indice_diri[4];
168
169 // Boucle sur les elements:
170 int nb_elem_tot=domaine_VEF.nb_elem_tot();
171 for (int elem=0; elem<nb_elem_tot; elem++)
172 {
173 if (modif_traitement_diri)
174 {
175 int rang_elem = domaine_VEF.rang_elem_non_std()(elem);
176 int type_elem = (int)rang_elem < 0 ? 0 : domaine_Cl_VEF.type_elem_Cl(rang_elem);
177 calculer_coef_som(type_elem, dimension, nb_face_diri, indice_diri);
178 }
179 double volume=volumes(elem);
180 for (int i=0; i<nbpts; i++)
181 les_polygones(i)=elem;
182
183 //On remplit la matrice de changement d'element :
184 const int som_glob = elem_sommets(elem,0);
185 for (int dim=0; dim<dimension; dim++)
186 a0[dim]=coord_sommets(som_glob,dim);
187
188 const int som_glob1 = elem_sommets(elem,1);
189 for (int dim=0; dim<dimension; dim++)
190 a0a1[dim]=coord_sommets(som_glob1,dim)-a0[dim];
191
192 const int som_glob2 = elem_sommets(elem,2);
193 for (int dim=0; dim<dimension; dim++)
194 a0a2[dim]=coord_sommets(som_glob2,dim)-a0[dim];
195
196 if(dimension == 3)
197 {
198 const int som_glob3 = elem_sommets(elem,3);
199 for (int dim=0; dim<dimension; dim++)
200 a0a3[dim]=coord_sommets(som_glob3,dim)-a0[dim];
201 }
202
203 //On remplit les_positions :
204 if(dimension == 2)
205 {
206 for (int pt=0; pt<nbpts; pt++)
207 {
208 for (int dim=0; dim<dimension; dim++)
209 les_positions(pt,dim)=a0[dim]
210 +coord_bary(pt,1)* a0a1[dim]
211 +coord_bary(pt,2)* a0a2[dim];
212 }
213 }
214 else if(dimension == 3)
215 {
216 for (int pt=0; pt<nbpts; pt++)
217 {
218 for (int dim=0; dim<dimension; dim++)
219 les_positions(pt,dim)=a0[dim]
220 +coord_bary(pt,1)* a0a1[dim]
221 +coord_bary(pt,2)* a0a2[dim]
222 +coord_bary(pt,3)* a0a3[dim];
223 }
224 }
225 else
226 assert(0);
227
228 // Calcul du terme source aux points d'integration :
229 le_scalaire.valeur_aux_elems(les_positions,les_polygones,valeurs_scalaire);
230 T_etat->valeur_aux_elems(les_positions,les_polygones,valeurs_scalaire_etat);
231 beta().valeur_aux_elems(les_positions,les_polygones,valeurs_beta);
232
233 // Boucle sur les faces de l'element:
234 for(int face=0; face<=dimension; face++)
235 {
236 int num_face=elem_faces(elem, face);
237
238 // Calcul des Psi aux points d'integration :
239 for (int pt=0; pt<nbpts; pt++)
240 // valeurs_Psi(pt)=(1-dimension*coord_bary(pt,face))*porosite_surf(face); // Fixed bug
241 valeurs_Psi(pt)=(1-dimension*coord_bary(pt,face))*porosite_surf(num_face);
242
243 // Integration sur les nbpts points:
244 for (int pt=0; pt<nbpts; pt++)
245 {
246 for (int dim=0; dim<dimension; dim++)
247 {
248 double contrib=0;
249 for (int comp=0; comp<nb_comp; comp++)
250 {
251 contrib+=Poids[pt]*volume*(T0[comp]-valeurs_scalaire(pt,comp))*valeurs_beta(pt,comp)*g(dim)*valeurs_Psi(pt);
252 contrib+=Poids[pt]*volume*(T0_etat[comp]- valeurs_scalaire_etat(pt,comp))*beta_a*g(dim)*valeurs_Psi(pt);
253 }
254 resu(num_face,dim)+=contrib;
255 somme[dim]+=contrib;
256 if (modif_traitement_diri)
257 {
258 for (int fdiri=0; fdiri<nb_face_diri; fdiri++)
259 {
260 int indice=indice_diri[fdiri];
261 int facel = elem_faces(elem,indice);
262 if (num_face==facel)
263 {
264 resu(facel,dim)-=contrib;
265 double contrib2=contrib/(dimension+1-nb_face_diri);
266 for (int f2=0; f2<dimension+1; f2++)
267 {
268 int face2=elem_faces(elem,f2);
269 resu(face2,dim)+=contrib2;
270 }
271 }
272 }
273 }
274 }
275 }
276 }
277 }
278 {
279 // modif pour periodique
280 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
281 {
282 const Cond_lim& la_cl = domaine_Cl_VEF.les_conditions_limites(n_bord);
283 if (sub_type(Periodique,la_cl.valeur()))
284 {
285 const Periodique& la_cl_perio = ref_cast(Periodique,la_cl.valeur());
286 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
287 int nb_faces_bord=le_bord.nb_faces();
288 IntVect fait(nb_faces_bord);
289 fait = 0;
290 for (int ind_face=0; ind_face<nb_faces_bord; ind_face++)
291 {
292 if (fait(ind_face) == 0)
293 {
294 int ind_face_associee = la_cl_perio.face_associee(ind_face);
295 fait(ind_face) = 1;
296 fait(ind_face_associee) = 1;
297 int face = le_bord.num_face(ind_face);
298 int face_associee = le_bord.num_face(ind_face_associee);
299 for (int dim=0; dim<dimension; dim++)
300 resu(face, dim)=(resu(face_associee, dim)+=resu(face, dim));
301 }// if fait
302 }// for face
303 }// sub_type Perio
304 }
305 }
306
307 // Verification:
308 if (0)
309 {
310 Cout <<"Integrale : (";
311 for (int dim=0; dim<dimension; ++dim)
312 {
313 Cout<<somme[dim];
314 if (dim<(dimension-1))
315 Cout<<",";
316 }
317 Cout<<")"<<finl;
319 }
320 return resu;
321}
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
provoque une erreur ! doit etre surchargee par les classes derivees
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
: class Convection_Diffusion_Temperature_sensibility
const Champ_Inc_base & inconnue() const override=0
DoubleTab_t & les_sommets()
Definition Domaine.h:113
IntTab_t & les_elems()
Definition Domaine.h:129
int type_elem_Cl(int i) const
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VEF
Definition Domaine_VEF.h:54
IntVect & rang_elem_non_std()
Definition Domaine_VEF.h:86
int get_alphaA() const
Definition Domaine_VEF.h:94
int get_alphaS() const
Definition Domaine_VEF.h:93
int get_alphaE() const
Definition Domaine_VEF.h:92
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 nb_elem_tot() const
int nb_front_Cl() const
const Domaine & domaine() 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
virtual int nb_comp() const
Definition Field_base.h:56
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_face(const int) const
Definition Front_VF.h:68
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
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
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
int face_associee(int i) const
Definition Periodique.h:35
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
void reset() override
Definition TRUSTTab.tpp:362
class Terme_Boussinesq_scalaire_VEFPreP1B_Face Terme Source de Boussinesq pour une dicretisation VEFP...
DoubleTab & ajouter(DoubleTab &) const override
const Convection_Diffusion_std & equation_scalaire() const
const Champ_Don_base & gravite() const
const ArrOfDouble & getScalaire0() const
const Champ_Don_base & beta() const