TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
T_paroi_Champ_P0_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Champ_front_calc_interne.h>
17#include <Echange_interne_impose.h>
18#include <T_paroi_Champ_P0_VDF.h>
19#include <Echange_impose_base.h>
20#include <Dirichlet_homogene.h>
21#include <Iterateur_VDF_Elem.h>
22#include <Neumann_homogene.h>
23#include <Op_Diff_VDF_base.h>
24#include <Equation_base.h>
25#include <Neumann_paroi.h>
26#include <Eval_Diff_VDF.h>
27#include <Champ_P0_VDF.h>
28#include <Periodique.h>
29#include <Operateur.h>
30#include <Dirichlet.h>
31#include <Navier.h>
32
33Implemente_instanciable(T_paroi_Champ_P0_VDF, "T_paroi_Champ_P0_VDF", Champ_Fonc_P0_VDF);
34
35Sortie& T_paroi_Champ_P0_VDF::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
36
38
45
47{
48 mon_champ_ = un_champ;
49}
50
52{
53 const Domaine_VDF& dvdf = ref_cast(Domaine_VDF, le_dom_VF.valeur());
54 const IntTab& face_voisins = dvdf.face_voisins();
55 const DoubleVect& vol = dvdf.volumes();
56
57 const Op_Diff_VDF_base& op_diff_vdf = ref_cast(Op_Diff_VDF_base, mon_champ_->equation().operateur(0).l_op_base());
58 const Eval_Diff_VDF& eval = dynamic_cast<const Eval_Diff_VDF&>( op_diff_vdf.get_iter()->evaluateur());
59
60 const DoubleTab& temp = mon_champ_->valeurs();
61 DoubleTab& val = valeurs(tps);
62 val = 0.; // interne ou cl pas traitees
63
64 /*
65 * Traitement bord/coin :-)
66 *
67 * On moyenne la contribution ... comment tu fais sinon ?
68 */
69
70 const int N = temp.line_size(), n_elem = temp.dimension(0);
71 IntTrav indx_pond(n_elem, N);
72
73 for (int n_bord = 0; n_bord < dvdf.nb_front_Cl(); n_bord++)
74 for (int k = 0; k < N; k++) // pour multiphase
75 {
76 const Cond_lim& la_cl = le_dom_Cl_VDF->les_conditions_limites(n_bord);
77 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
78 const int ndeb = le_bord.num_premiere_face(), nfin = ndeb + le_bord.nb_faces();
79
80 if (sub_type(Periodique, la_cl.valeur()))
81 {
82 for (int num_face = ndeb; num_face < nfin; num_face++)
83 {
84 const int elem1 = face_voisins(num_face, 0), elem2 = face_voisins(num_face, 1);
85
86 val(elem1, k) += (vol(elem1) * temp(elem1, k) + vol(elem2) * temp(elem2, k)) / (vol(elem1) + vol(elem2)); // moyenne volumique
87 val(elem2, k) = val(elem1, k);
88
89 indx_pond(elem1, k)++;
90 indx_pond(elem1, k)++;
91 }
92 }
93 else if (sub_type(Dirichlet, la_cl.valeur()))
94 {
95 for (int num_face = ndeb, num_face_cl = 0; num_face < nfin; num_face++, num_face_cl++)
96 {
97 int elem = face_voisins(num_face, 0);
98 if (elem < 0)
99 elem = face_voisins(num_face, 1);
100
101 val(elem, k) += ref_cast(Dirichlet, la_cl.valeur()).val_imp(num_face_cl, k);
102
103 indx_pond(elem, k)++;
104 }
105 }
106 else if (sub_type(Dirichlet_homogene, la_cl.valeur()))
107 {
108 for (int num_face = ndeb; num_face < nfin; num_face++)
109 {
110 int elem = face_voisins(num_face, 0);
111 if (elem < 0)
112 elem = face_voisins(num_face, 1);
113
114 val(elem, k) += 0.;
115 indx_pond(elem, k)++;
116 }
117 }
118 else if (sub_type(Neumann_homogene, la_cl.valeur()) || sub_type(Navier, la_cl.valeur())) // grad nulle
119 {
120 for (int num_face = ndeb; num_face < nfin; num_face++)
121 {
122 int elem = face_voisins(num_face, 0);
123 if (elem < 0)
124 elem = face_voisins(num_face, 1);
125
126 val(elem, k) += temp(elem, k);
127 indx_pond(elem, k)++;
128 }
129 }
130 else if (sub_type(Echange_externe_impose, la_cl.valeur()))
131 {
132 const Echange_externe_impose& la_cl_ext = ref_cast(Echange_externe_impose, la_cl.valeur());
133 for (int num_face = ndeb, num_face_cl = 0; num_face < nfin; num_face++, num_face_cl++)
134 {
135 const int elem1 = face_voisins(num_face, 0), elem2 = face_voisins(num_face, 1);
136 int elem_opp = -1; // si Echange_interne_impose
137
138 if (sub_type(Echange_interne_impose, la_cl_ext))
139 {
140 const Echange_interne_impose& la_cl_int = ref_cast(Echange_interne_impose, la_cl_ext);
141 const Champ_front_calc_interne& Text_int = ref_cast(Champ_front_calc_interne, la_cl_int.T_ext());
142 const IntVect& fmap = Text_int.face_map();
143 int opp_face = fmap[num_face_cl]+ num_face - num_face_cl ; // num1 is the index of the first face
144 int e1 = face_voisins(opp_face, 0);
145 elem_opp = (e1 != -1) ? e1 : face_voisins(opp_face, 1);
146 }
147
148 const bool is_radiatif = la_cl_ext.has_emissivite();
149
150 const int elem = elem1 > -1 ? elem1 : elem2;
151 const double e = Objet_U::axi ? dvdf.dist_norm_bord_axi(num_face) : dvdf.dist_norm_bord(num_face);
152 const double h_imp = la_cl_ext.h_imp(num_face_cl, k) , T_ext = (elem_opp == -1) ? la_cl_ext.T_ext(num_face_cl, k) : temp(elem_opp, k);
153 const double nu = eval.nu_2_impl(elem, k), t_elem = temp(elem, k);
154 const double eps = is_radiatif ? la_cl_ext.emissivite(num_face_cl, k) : 0;
155
156 val(elem, k) += newton_T_paroi_VDF(eps, h_imp, T_ext, nu, e, t_elem);
157 indx_pond(elem, k)++;
158 }
159 }
160 else if (sub_type(Echange_global_impose, la_cl.valeur()))
161 {
162 const Echange_global_impose& la_cl_glob = ref_cast(Echange_global_impose, la_cl.valeur());
163 for (int num_face = ndeb, num_face_cl = 0; num_face < nfin; num_face++, num_face_cl++)
164 {
165 const int elem1 = face_voisins(num_face, 0), elem2 = face_voisins(num_face, 1);
166 const int elem = elem1 > -1 ? elem1 : elem2;
167 const double e = Objet_U::axi ? dvdf.dist_norm_bord_axi(num_face) : dvdf.dist_norm_bord(num_face);
168 const double h_imp = la_cl_glob.h_imp(num_face_cl, k) , T_ext = la_cl_glob.T_ext(num_face_cl, k);
169 const double nu = eval.nu_2_impl(elem, k), t_elem = temp(elem, k);
170 const double phi_ext = la_cl_glob.has_phi_ext() ? la_cl_glob.flux_exterieur_impose(num_face_cl,k) : 0;
171 const double phi = phi_ext + h_imp * (T_ext - t_elem);
172
173 val(elem, k) += e * phi / nu + t_elem;
174 indx_pond(elem, k)++;
175 }
176 }
177 else if (sub_type(Neumann_paroi, la_cl.valeur()))
178 for (int num_face = ndeb, num_face_cl = 0; num_face < nfin; num_face++, num_face_cl++)
179 {
180 const int elem1 = face_voisins(num_face, 0), elem2 = face_voisins(num_face, 1);
181 const double signe = elem1 > -1 ? -1.0 : 1.0;
182 const int elem = elem1 > -1 ? elem1 : elem2;
183 const double e = Objet_U::axi ? dvdf.dist_norm_bord_axi(num_face) : dvdf.dist_norm_bord(num_face);
184 const double nu = eval.nu_2_impl(elem, k), t_elem = temp(elem, k);
185
186 val(elem, k) += signe * e * ref_cast(Neumann_paroi, la_cl.valeur()).flux_impose(num_face_cl, k) / nu + t_elem;
187 indx_pond(elem, k)++;
188 }
189 }
190
191 // On moyenne la contribution
192 for (int elem = 0; elem < n_elem; elem++)
193 for (int k = 0; k < N; k++) // pour multiphase
194 if (indx_pond(elem, k) > 0)
195 val(elem, k) /= (double)indx_pond(elem, k);
196}
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_P0_VDF
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
classe Champ_P0_VDF Classe qui represente un champ discret P0 par element associe a un domaine discre...
virtual double changer_temps(const double t)
Fixe le temps auquel se situe le champ.
classe Champ_front_calc_interne Classe derivee de Champ_front_calc qui represente
const IntVect & face_map() const
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
class Domaine_VDF
Definition Domaine_VDF.h:64
double dist_norm_bord_axi(int num_face) const
double dist_norm_bord(int num_face) const override
double volumes(int i) const
Definition Domaine_VF.h:113
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_front_Cl() const
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
virtual double flux_exterieur_impose(int i) const
const bool & has_phi_ext() const
virtual double h_imp(int num) const
Renvoie la valeur du coefficient d'echange de chaleur impose sur la i-eme composante.
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de frontiere.
double emissivite(int num) const
Renvoie la valeur de l'emissivite impose sur la i-eme composante.
Classe Echange_interne_impose: Cette classe represente le cas particulier de la classe.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Operateur & operateur(int) const =0
double nu_2_impl(int i, int compo) const
const Nom & le_nom() const override
Renvoie le nom du champ.
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
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Navier Condition aux limites sur la vitesse de type "Navier" :
Definition Navier.h:31
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
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
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
class Op_Diff_VDF_base Classe de base des operateurs de diffusion VDF
virtual Operateur_base & l_op_base()=0
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
int line_size() const
Definition TRUSTVect.tpp:67
void associer_champ(const Champ_P0_VDF &)
void mettre_a_jour(double) override
Mise a jour en temps du champ.