TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Source_WC_Chaleur_VDF.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 <Convection_Diffusion_Chaleur_WC.h>
17#include <Source_WC_Chaleur_VDF.h>
18#include <Neumann_sortie_libre.h>
19#include <Domaine_Cl_dis_base.h>
20#include <Navier_Stokes_WC.h>
21#include <Probleme_base.h>
22#include <Domaine_VF.h>
23
24Implemente_instanciable(Source_WC_Chaleur_VDF,"Source_WC_Chaleur_VDF",Source_WC_Chaleur);
25
27{
28 os <<que_suis_je()<< finl;
29 return os;
30}
31
33
39
40void Source_WC_Chaleur_VDF::compute_interpolate_gradP(DoubleTab& UgradP_elem, const DoubleTab& Ptot) const
41{
42 /*
43 * NOTA BENE :
44 * On a discretise P_EOS avec une directive = temperature qui donne en VDF :
45 * Ptot => aux elems
46 * la_vitesse => faces car vdf
47 * grad_Ptot => faces car vdf
48 *
49 * Donc u*grad(P_tot) => faces
50 * L'equation est une equation de scalaire => aux elems car vdf
51 * On a d P_tot / d t = del P / del t + u.grad(P_tot)
52 *
53 * del P / del t => aux elem
54 * u.grad(P_tot) !!! faut l'interpoler aux elems
55 */
56
57 const Navier_Stokes_WC& eqHyd = ref_cast(Navier_Stokes_WC,mon_equation->probleme().equation(0));
58 const DoubleTab& la_vitesse = eqHyd.vitesse().valeurs();
59 DoubleTab grad_Ptot(eqHyd.grad_P().valeurs()); // initialise avec grad(P) car face
60 const Convection_Diffusion_Chaleur_WC& eq_chal = ref_cast(Convection_Diffusion_Chaleur_WC,mon_equation.valeur());
61 const Operateur_Grad& Op_Grad = eq_chal.operateur_gradient_WC();
62 Op_Grad.calculer(Ptot,grad_Ptot); // compute grad(P_tot)
63
64 const Domaine_dis_base& domaine_dis = mon_equation->inconnue().domaine_dis_base();
65 const Domaine_VF& domaine = ref_cast(Domaine_VF, domaine_dis);
66 assert (domaine_dis.que_suis_je() == "Domaine_VDF");
67
68 // grad should be zero at boundary
69 correct_grad_boundary(domaine,grad_Ptot);
70
71 // We compute u*grad(P_tot) on each face
72 DoubleTab UgradP(grad_Ptot); // field on faces
73 const int n = la_vitesse.dimension_tot(0);
74 assert ( n == domaine.nb_faces_tot() && la_vitesse.line_size() == 1);
75 assert ( Ptot.dimension_tot(0) == domaine.nb_elem_tot() );
76
77 for (int i=0 ; i <n ; i++) UgradP(i,0) = la_vitesse(i,0) * grad_Ptot(i,0);
78 face_to_elem(domaine,UgradP,UgradP_elem);
79}
80
81// On peut utiliser les methodes statics de Discretisation_tools... mais faut creer de Champ_base ...
82void Source_WC_Chaleur_VDF::face_to_elem(const Domaine_VF& domaine, const DoubleTab& UgradP,DoubleTab& UgradP_elem) const
83{
84 const IntTab& elem_faces = domaine.elem_faces();
85 const int nb_face_elem = elem_faces.line_size(), nb_elem_tot= domaine.nb_elem_tot();
86 assert (UgradP_elem.dimension_tot(0) == nb_elem_tot && UgradP.dimension_tot(0) == domaine.nb_faces_tot());
87
88 UgradP_elem = 0.;
89 for (int ele=0; ele<nb_elem_tot; ele++)
90 for (int s=0; s<nb_face_elem; s++) UgradP_elem(ele,0) += UgradP(elem_faces(ele,s),0);
91
92 UgradP_elem *= 0.5;
93}
94
95// marche bien mais pas bon pour le vef ... P en vef est partout, grad sur les faces mais pas bon pour nous
96void Source_WC_Chaleur_VDF::compute_interpolate_gradP_old(DoubleTab& UgradP_elem, const DoubleTab& Ptot) const
97{
98 // compute the grad
99 const Navier_Stokes_WC& eqHyd = ref_cast(Navier_Stokes_WC,mon_equation->probleme().equation(0));
100 const DoubleTab& la_vitesse = eqHyd.vitesse().valeurs();
101 DoubleTab grad_Ptot(eqHyd.grad_P().valeurs()); // initialise avec grad(P) car face
102 const Operateur_Grad& gradient = eqHyd.operateur_gradient(); // recuperer op grad de NS
103 gradient.calculer(Ptot,grad_Ptot); // compute grad(P_tot)
104
105 // XXX : very important : sinon we have values * V !
106 eqHyd.solv_masse().appliquer(grad_Ptot);
107
108 /*
109 * XXX XXX XXX
110 * READ CAREFULLY : We use the grad operator from Navier_Stokes_std
111 * => created for the pressure normally
112 * There is a special treatement for Neumann bc (Neumann_sortie_libre)
113 * because we use explicitly the prescribed pressure.
114 * So if we calculate the grad of Ptot or rho for example, we will use
115 * P_ext defined in data file which is wrong !
116 *
117 * Now we do the following : we assume open bd as a wall => null gradient
118 */
119
120 // We use that of NS because we test the CL too (attention mon_equation is Chaleur...)
121 const Domaine_dis_base& domaine_dis = eqHyd.inconnue().domaine_dis_base();
122 const Domaine_VF& domaine = ref_cast(Domaine_VF, domaine_dis);
123 const Domaine_Cl_dis_base& domaine_cl = eqHyd.domaine_Cl_dis();
124 assert (domaine_dis.que_suis_je() == "Domaine_VDF");
125
126 for (int n_bord=0; n_bord<domaine.nb_front_Cl(); n_bord++)
127 {
128 const Cond_lim& la_cl = domaine_cl.les_conditions_limites(n_bord);
129 // corrige si Neumann_sortie_libre
130 if ( sub_type(Neumann_sortie_libre,la_cl.valeur()) )
131 {
132 // recuperer face et remplace gradient par 0
133 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
134 const int ndeb = le_bord.num_premiere_face(), nfin = ndeb + le_bord.nb_faces();
135
136 for (int num_face=ndeb; num_face<nfin; num_face++) grad_Ptot(num_face,0) = 0.;
137 }
138 }
139
140 // We compute u*grad(P_tot) on each face
141 DoubleTab UgradP(grad_Ptot); // field on faces
142 const int n = la_vitesse.dimension(0);
143 assert ( n == domaine.nb_faces() );
144 assert ( Ptot.dimension(0) == domaine.nb_elem() );
145 for (int i=0 ; i <n ; i++) UgradP(i,0) = la_vitesse(i,0) * grad_Ptot(i,0);
146 face_to_elem(domaine,UgradP,UgradP_elem);
147}
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Convection_Diffusion_Chaleur_WC Cas particulier de Convection_Diffusion_Chaleur_Fluide_Dilatab...
const Operateur_Grad & operateur_gradient_WC() const
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_VF
Definition Domaine_VF.h:44
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
classe Navier_Stokes_WC Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
virtual const Champ_Inc_base & vitesse() const
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Champ_Inc_base & grad_P()
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 Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
virtual const Equation_base & equation(int) const =0
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
Definition Sortie.h:52
void associer_volume_porosite_impl(const Domaine_dis_base &domaine, DoubleVect &volumes, DoubleVect &porosites)
void associer_domaines_impl(const Domaine_dis_base &domaine, const Domaine_Cl_dis_base &domaine_cl)
class Source_WC_Chaleur_VDF
void compute_interpolate_gradP(DoubleTab &gradP, const DoubleTab &Ptot) const override
void associer_domaines(const Domaine_dis_base &domaine, const Domaine_Cl_dis_base &zcl) override
class Source_WC_Chaleur
const DoubleTab & correct_grad_boundary(const Domaine_VF &domaine, DoubleTab &grad_Ptot) const
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
int line_size() const
Definition TRUSTVect.tpp:67