TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Terme_Boussinesq_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 <Terme_Boussinesq_VDF_Face.h>
17#include <Fluide_Incompressible.h>
18#include <Champ_Uniforme.h>
19#include <Neumann_sortie_libre.h>
20#include <Dirichlet.h>
21#include <Domaine_VDF.h>
22#include <Domaine_Cl_VDF.h>
23#include <Convection_Diffusion_Concentration.h>
24#include <Synonyme_info.h>
25
26Implemente_instanciable(Terme_Boussinesq_VDF_Face,"Boussinesq_VDF_Face",Terme_Boussinesq_base);
27Add_synonym(Terme_Boussinesq_VDF_Face,"Boussinesq_temperature_VDF_Face");
28Add_synonym(Terme_Boussinesq_VDF_Face,"Boussinesq_concentration_VDF_Face");
29
30//// printOn
32{
34}
35
36//// readOn
38{
40}
41
43 const Domaine_Cl_dis_base& domaine_Cl_dis)
44{
45 le_dom_VDF = ref_cast(Domaine_VDF, domaine_dis);
46 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF, domaine_Cl_dis);
47}
48
49void Terme_Boussinesq_VDF_Face::ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl) const
50{
51 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
52 const Domaine_Cl_VDF& domaine_Cl_VDF_hyd = le_dom_Cl_VDF.valeur();
53 const Domaine_Cl_dis_base& domaine_Cl_scal = equation_scalaire().domaine_Cl_dis();
54 const Domaine_Cl_VDF& domaine_Cl_VDF_scal = ref_cast(Domaine_Cl_VDF,domaine_Cl_scal);
55 const DoubleTab& param = equation_scalaire().inconnue().valeurs();
56 const DoubleTab& beta_valeurs = beta().valeurs();
57 const DoubleVect& grav = gravite().valeurs();
58 const IntTab& face_voisins = domaine_VDF.face_voisins();
59 const IntVect& orientation = domaine_VDF.orientation();
60 const DoubleTab& xv = domaine_VDF.xv();
61 const DoubleVect& porosite_surf = equation().milieu().porosite_face();
62 const DoubleVect& volumes_entrelaces = domaine_VDF.volumes_entrelaces();
63 const DoubleTab& vitesse = equation().inconnue().valeurs();
64
65 DoubleVect g(dimension);
66 g = grav;
67
68 int nb_dim = param.line_size();
69
70 // Verifie la validite de T0:
71 check();
72
73 // Boucle sur les conditions limites pour traiter les faces de bord
74 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
75 {
76 // pour chaque Condition Limite on regarde son type
77 const Cond_lim& la_cl = domaine_Cl_VDF_hyd.les_conditions_limites(n_bord);
78 const Cond_lim& la_cl_scal = domaine_Cl_VDF_scal.les_conditions_limites(n_bord);
79 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
80 int ndeb = le_bord.num_premiere_face();
81 int nfin = ndeb + le_bord.nb_faces();
82
83 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
84 {
85 if (sub_type(Neumann_sortie_libre,la_cl_scal.valeur()))
86 {
87 const Neumann_sortie_libre& la_cl_neumann_scal = ref_cast(Neumann_sortie_libre, la_cl_scal.valeur());
88 for (int num_face=ndeb; num_face<nfin; num_face++)
89 {
90 int outlet;
91 int elem = face_voisins(num_face,0);
92 if (elem==-1)
93 {
94 outlet = (vitesse(num_face)<0?1:0);
95 elem = face_voisins(num_face,1);
96 }
97 else
98 outlet = (vitesse(num_face)>0?1:0);
99 double coef=0;
100 for (int dim=0; dim<nb_dim; dim++)
101 {
102 double param_face = (outlet ? valeur(param,elem,dim) : 0.5*(valeur(param,elem,dim)+la_cl_neumann_scal.val_ext(num_face-ndeb,dim)));
103 coef += valeur(beta_valeurs,elem,elem,dim)*(Scalaire0(dim)-param_face);
104 }
105
106 if (axi)
107 {
108 double cos_teta = cos(xv(num_face,1));
109 double sin_teta = sin(xv(num_face,1));
110 g(0) = grav(0)*cos_teta + grav(1)*sin_teta;
111 g(1) = grav(1)*cos_teta - grav(0)*sin_teta;
112 }
113 double vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
114 int ncomp = orientation(num_face);
115 secmem(num_face)+= coef*g(ncomp)*vol;
116 }
117 }
118 else if (sub_type(Dirichlet,la_cl_scal.valeur()))
119 {
120 const Dirichlet& la_cl_diri_scal = ref_cast(Dirichlet,la_cl_scal.valeur());
121 for (int num_face=ndeb; num_face<nfin; num_face++)
122 {
123 int outlet;
124 int elem = face_voisins(num_face,0);
125 if (elem==-1)
126 {
127 outlet = (vitesse(num_face)<0?1:0);
128 elem = face_voisins(num_face,1);
129 }
130 else
131 outlet = (vitesse(num_face)>0?1:0);
132
133 double coef=0;
134 for (int dim=0; dim<nb_dim; dim++)
135 {
136 double param_face = (outlet ? valeur(param,elem,dim) : 0.5*(valeur(param,elem,dim)+la_cl_diri_scal.val_imp(num_face-ndeb,dim)));
137 coef += valeur(beta_valeurs,elem,elem,dim)*(Scalaire0(dim)-param_face);
138 }
139 if (axi)
140 {
141 double cos_teta = cos(xv(num_face,1));
142 double sin_teta = sin(xv(num_face,1));
143 g(0) = grav(0)*cos_teta + grav(1)*sin_teta;
144 g(1) = grav(1)*cos_teta - grav(0)*sin_teta;
145 }
146 double vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
147 int ncomp = orientation(num_face);
148 secmem(num_face)+= coef*g(ncomp)*vol;
149 }
150 }
151 }
152 else
153 {
154 for (int num_face=ndeb; num_face<nfin; num_face++)
155 {
156 int elem = face_voisins(num_face,0);
157 if (elem == -1) elem = face_voisins(num_face,1);
158 double coef = 0;
159 for (int dim=0; dim<nb_dim; dim++)
160 {
161 double param_face = valeur(param,elem,dim);
162 coef += valeur(beta_valeurs,elem,elem,dim)*(Scalaire0(dim)-param_face);
163 }
164 if (axi)
165 {
166 double cos_teta = cos(xv(num_face,1));
167 double sin_teta = sin(xv(num_face,1));
168 g(0) = grav(0)*cos_teta + grav(1)*sin_teta;
169 g(1) = grav(1)*cos_teta - grav(0)*sin_teta;
170 }
171 int ncomp = orientation(num_face);
172 double vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
173 secmem(num_face) += coef*g(ncomp)*vol;
174 }
175 }
176 }
177
178 // Boucle sur les faces internes
179 int ndeb = domaine_VDF.premiere_face_int();
180 int nb_faces = domaine_VDF.nb_faces();
181 for (int num_face=ndeb; num_face<nb_faces; num_face++)
182 {
183 int elem1 = face_voisins(num_face,0);
184 int elem2 = face_voisins(num_face,1);
185 double coef = 0;
186 for (int dim=0; dim<nb_dim; dim++)
187 {
188 double param_face = 0.5*(valeur(param,elem1,dim)+valeur(param,elem2,dim));
189 coef += valeur(beta_valeurs,elem1,elem2,dim)*(Scalaire0(dim)-param_face);
190 }
191 if (axi)
192 {
193 double cos_teta = cos(xv(num_face,1));
194 double sin_teta = sin(xv(num_face,1));
195 g(0) = grav(0)*cos_teta + grav(1)*sin_teta;
196 g(1) = grav(1)*cos_teta - grav(0)*sin_teta;
197 }
198 int ncomp = orientation(num_face);
199 double vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
200 secmem(num_face) += coef*g(ncomp)*vol;
201 }
202
203}
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.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
const Champ_Inc_base & inconnue() const override=0
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
virtual double val_imp(int i) const
Renvoie la valeur imposee sur la i-eme composante du champ a la frontiere au temps par defaut du cham...
Definition Dirichlet.cpp:35
class Domaine_Cl_VDF
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.
class Domaine_VDF
Definition Domaine_VDF.h:64
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
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
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_front_Cl() 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 const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
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
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
double val_ext(int i) const override
Renvoie la valeur de la i-eme composante du champ impose a l'exterieur de la frontiere.
static int dimension
Definition Objet_U.h:99
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
static int axi
Definition Objet_U.h:101
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52
int line_size() const
Definition TRUSTVect.tpp:67
class Terme_Boussinesq_scalaire_VDF_Face
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
Classe Terme_Boussinesq_base Cette classe represente le terme de gravite qui figure dans l'equation.
double Scalaire0(int i) const
const Convection_Diffusion_std & equation_scalaire() const
const Champ_Don_base & gravite() const
const Champ_Don_base & beta() const