TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Injection_QDM_nulle_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2021, 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 <Injection_QDM_nulle_VDF.h>
17#include <Source_Flux_interfacial_base.h>
18#include <Masse_ajoutee_base.h>
19#include <Milieu_composite.h>
20#include <Neumann_val_ext.h>
21#include <Saturation_base.h>
22#include <Champ_Face_VDF.h>
23#include <Neumann_paroi.h>
24#include <Pb_Multiphase.h>
25#include <Champ_P0_VDF.h>
26#include <Matrix_tools.h>
27#include <Array_tools.h>
28#include <Domaine_VF.h>
29#include <Conds_lim.h>
30#include <cfloat>
31#include <math.h>
32
33Implemente_instanciable(Injection_QDM_nulle_VDF, "Injection_QDM_nulle_VDF_Face", Source_injection_QDM_base);
34// XD Injection_QDM_nulle source_base Injection_QDM_nulle BRACE not_set
35
36
37Sortie& Injection_QDM_nulle_VDF::printOn(Sortie& os) const { return os; }
38
40
41void Injection_QDM_nulle_VDF::ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl) const
42{
43 const Champ_Face_VDF& ch = ref_cast(Champ_Face_VDF, equation().inconnue());
44 const Champ_P0_VDF& cha= ref_cast(Champ_P0_VDF, equation().probleme().equation(1).inconnue()); // volume fraction
45 const Domaine_VF& domaine = ref_cast(Domaine_VF, equation().domaine_dis());
47 const Milieu_composite& milc = ref_cast(Milieu_composite, equation().milieu());
48
49 const IntTab& fcl = ch.fcl(),
50 &fcla = cha.fcl(),
51 &f_e = domaine.face_voisins(),
52 &e_f = domaine.elem_faces();
53 const DoubleVect& vf = domaine.volumes_entrelaces(),
54 &fs = domaine.face_surfaces();
55 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir();
56
57 const DoubleTab& vit = ch.valeurs(),
58 &rho = equation().milieu().masse_volumique().passe(), // passe car qdm
59 &alpha = cha.passe();
60
61 Matrice_Morse *mat = matrices.count(ch.le_nom().getString()) ? matrices.at(ch.le_nom().getString()) : nullptr; // Derivee locale/QDM
62
63 const Pb_Multiphase *pbm = sub_type(Pb_Multiphase, equation().probleme()) ? &ref_cast(Pb_Multiphase, equation().probleme()) : nullptr;
64 const Masse_ajoutee_base *corr = pbm && pbm->has_correlation("masse_ajoutee") ? &ref_cast(Masse_ajoutee_base, pbm->get_correlation("masse_ajoutee")) : nullptr;
65
66 int N = vit.line_size(), nf_tot = domaine.nb_faces_tot(), nf = domaine.nb_faces(), ne_tot = domaine.nb_elem_tot();
67
68 // Cas adiabatique : injection de bulles a la paroi (manip de Gabillet et al.)
69 for (int f = 0 ; f< nf_tot ; f ++)
70 if (fcla(f, 0) == 4) // Neumann_paroi
71 {
72 int e = f_e(f, 0)>-1 ? f_e(f, 0) : f_e(f, 1) ;
73 if (e>=0)
74 {
75 DoubleTrav f_a_masse(N, N) ;
76 DoubleTrav f_a(1, N);
77 for (int n = 0 ; n<N ; n++)
78 {
79 f_a_masse(n, n) = ref_cast(Neumann_paroi, clsa[fcla(f, 1)].valeur()).flux_impose(fcla(f, 2), n) * rho(e, n) ; // Pas de porosite ; unite : kg/m3 m/s
80 f_a(0, n) = ref_cast(Neumann_paroi, clsa[fcla(f, 1)].valeur()).flux_impose(fcla(f, 2), n) ; // Pas de porosite ; unite : m/s
81 }
82 corr->ajouter_inj( &f_a(0,0) , &alpha(e, 0), &rho(e, 0) , f_a_masse );
83
84 for (int i=0 ; i < e_f.line_size() ; i++)
85 {
86 int f2 = e_f(e, i);
87 if ( (f2 >= 0) && (f2<nf) && (fcl(f2, 0) < 2) ) // Si pas face de bord
88 {
89 int c = ( e == f_e(f2, 0) ) ? 0 : 1 ;
90 for (int n = 0 ; n<N ; n++)
91 for (int m = 0 ; m<N ; m++)
92 {
93 secmem(f2, n) -= fs(f) * f_a_masse(n, m) * vf_dir(f2, c) / vf(f2) * vit( f2, m) * beta_;
94 if (mat)
95 (*mat)( N * f2 + n , N * f2 + m ) += fs(f) * f_a_masse(n, m) * vf_dir(f2, c) / vf(f2) * beta_;
96 }
97 }
98 }
99 }
100 }
101
102 // Cas bouillant : on passe par qpi
103 if ( (pbm) && pbm->has_correlation("flux_parietal") )
104 {
105 const DoubleTab& qpi = ref_cast(Source_Flux_interfacial_base, pbm->equation_energie().sources().dernier().valeur()).qpi(),
106 &press = ref_cast(QDM_Multiphase, pbm->equation_qdm()).pression().passe();
107 int nb_max_sat = N*(N-1)/2;
108
109 /* limiteur de changement de phase : pas mis dans la V0 de cette force */
110
111 // On a besoin juste de l'enthalpie de changement d'etat
112 DoubleTrav Lvap_tab(ne_tot,nb_max_sat);
113 DoubleTrav f_a_masse(N, N) ;
114 DoubleTrav f_a(1, N);
115
116 for (int k = 0; k < N; k++)
117 for (int l = k + 1; l < N; l++)
118 if (milc.has_saturation(k, l))
119 {
120 Saturation_base& z_sat = milc.get_saturation(k, l);
121 const int ind_trav = (k*(N-1)-(k-1)*(k)/2) + (l-k-1); // Et oui ! matrice triang sup !
122 assert (press.line_size() == 1);
123
124 z_sat.Lvap(press.get_span_tot(), Lvap_tab.get_span_tot(), nb_max_sat, ind_trav);
125 }
126
127 for (int f = 0 ; f< nf_tot ; f ++)
128 if ( (f_e(f, 0)<= 0) || (f_e(f, 1)<= 0)) // Si face de bord
129 if ( fs(f) > DBL_MIN ) // Si pas dans le milieu d'un bidim_axi
130 {
131 int e = f_e(f, 0)>-1 ? f_e(f, 0) : f_e(f, 1) ;
132 f_a_masse = 0;
133 f_a = 0;
134 double G=0;
135
136 for (int k = 0; k < N; k++)
137 for (int l = k + 1; l < N; l++)
138 if (milc.has_saturation(k, l)) //flux phase k <-> phase l si saturation
139 {
140 const int i_sat = (k*(N-1)-(k-1)*(k)/2) + (l-k-1); // Et oui ! matrice triang sup !
141
142 G = qpi(e, k, l) / Lvap_tab(e, i_sat) ; // Flux de matiere de la phase k vers l ; attention : qpi est en W, donc G en kgs-1 : il n'est pas volumique !
143
144 f_a(0, k) -= G/(fs(f)*rho(e, k)) ;
145 f_a_masse(k, k) -= G/fs(f) ;
146 f_a(0, l) += G/(fs(f)*rho(e, l)) ;
147 f_a_masse(l, l) += G/fs(f) ;
148
149 }
150
151 corr->ajouter_inj( &f_a(0,0) , &alpha(e, 0), &rho(e, 0) , f_a_masse );
152
153 for (int i=0 ; i < e_f.line_size() ; i++)
154 {
155 int f2 = e_f(e, i);
156 if ( (f2 >= 0) && (f2<nf) && (fcl(f2, 0) < 2) ) // Si pas face de bord
157 {
158 int c = ( e == f_e(f2, 0) ) ? 0 : 1 ;
159 for (int n = 0 ; n<N ; n++)
160 for (int m = 0 ; m<N ; m++)
161 {
162 secmem(f2, n) -= fs(f) * f_a_masse(n, m) * vf_dir(f2, c) / vf(f2) * vit( f2, m) * beta_ ;
163 if (mat)
164 (*mat)( N * f2 + n , N * f2 + m ) += fs(f) * f_a_masse(n, m) * vf_dir(f2, c) / vf(f2) * beta_ ;
165 }
166 }
167 }
168 }
169 }
170}
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
const IntTab & fcl() const
const IntTab & fcl() const
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_P0_VDF Classe qui represente un champ discret P0 par element associe a un domaine discre...
virtual DoubleTab & passe(int i=1)
Definition Champ_Proto.h:50
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VF
Definition Domaine_VF.h:44
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
Sources & sources()
Renvoie les termes sources asssocies a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Injection_QDM_nulle_VDF Correction de la QDM d'un fluide de l'écoulement quand on en injecte
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
classe Masse_ajoutee_base masse ajoutee de la forme
virtual void ajouter_inj(const double *flux_alpha, const double *alpha, const double *rho, DoubleTab &f_a_r) const =0
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
bool has_saturation(int k, int l) const
Saturation_base & get_saturation(int k, int l) const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
const std::string & getString() const
Definition Nom.h:92
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 Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
virtual Equation_base & equation_qdm()
virtual Equation_base & equation_energie()
int has_correlation(std::string nom_correlation) const
const Correlation_base & get_correlation(std::string nom_correlation) const
classe QDM_Multiphase Cette classe porte les termes de l'equation de la dynamique
void Lvap(const SpanD P, SpanD res, int ncomp=1, int ind=0) const
Classe de base des flux de sortie.
Definition Sortie.h:52
Classe Source_Flux_interfacial_base.
classe Injection_QDM_nulle_VDF Correction de la QDM d'un fluide de l'écoulement quand on en injecte
int line_size() const
Definition TRUSTVect.tpp:67