TrioCFD 1.9.9_beta
TrioCFD documentation
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 // Verify the validity of T0:
71 check();
72
73 // Loop over boundary conditions to process boundary faces
74 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
75 {
76 // for each boundary condition, check its 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 // Loop over internal faces
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
Overrides Champ_base::valeurs() Returns the array of values.
DoubleTab & valeurs() override
Returns the array of field values at the current time.
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
const Champ_Inc_base & inconnue() const override=0
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
Definition Dirichlet.h:31
virtual double val_imp(int i) const
Returns the imposed value on the i-th component of the field at the boundary at the default time of c...
Definition Dirichlet.cpp:35
class Domaine_Cl_VDF
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_VDF
Definition Domaine_VDF.h:61
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int nb_faces() const
Returns the total number of 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
A face is internal if and only if it separates two elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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()
Returns the discretized boundary condition domain associated with the 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
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
double val_ext(int i) const override
Returns the value of the i-th component of the field imposed on the exterior of the boundary.
static int dimension
Definition Objet_U.h:94
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
static int axi
Definition Objet_U.h:96
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
Base class for output streams.
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 This class represents the gravity term appearing in the momentum equatio...
double Scalaire0(int i) const
const Convection_Diffusion_std & equation_scalaire() const
const Champ_Don_base & gravite() const
const Champ_Don_base & beta() const