TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_Face_VDF.h
1
2/****************************************************************************
3* Copyright (c) 2023, CEA
4* All rights reserved.
5*
6* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
8* 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.
9* 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.
10*
11* 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.
12* 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;
13* 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.
14*
15*****************************************************************************/
16
17#ifndef Champ_Face_VDF_included
18#define Champ_Face_VDF_included
19
20#include <Champ_Face_VDF_implementation.h>
21#include <Champ_Face_base.h>
22#include <Domaine_VDF.h>
23
24class Domaine_Cl_VDF;
25
26/*! @brief class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
27 *
28 * que les composantes normales aux faces en VDF.Il n'y a donc qu'un degre de
29 * liberte par face et l'attribut nb_comp_ d'un objet de type Champ_Face
30 * vaut 1. On peut neammoins imposer toutes les composantes du champ sur
31 * le bord. Si n est le nombre de faces total du domaine et nb_faces_bord
32 * le nombre de faces de bord le tableau de valeurs associe au champ
33 * est construit comme suit:
34 * - n valeurs pour representer les composantes normales aux faces
35 * - nb_faces_bord*dimension pour stocker les valeurs imposees
36 * sur les faces de bord
37 * Rq : cette classe est specifique au module VDF
38 *
39 * @sa Champ_Inc_base
40 */
42{
43 Declare_instanciable(Champ_Face_VDF);
44public:
45 int fixer_nb_valeurs_nodales(int) override;
46
47 inline const Domaine_VDF& domaine_vdf() const override { return ref_cast(Domaine_VDF, le_dom_VF.valeur()); }
48 Champ_base& affecter_(const Champ_base&) override;
49 virtual const Champ_Proto& affecter(const double x1, const double x2);
50 virtual const Champ_Proto& affecter(const double x1, const double x2, const double x3);
51 virtual const Champ_Proto& affecter(const DoubleTab&);
52 void verifie_valeurs_cl() override;
53 int compo_normale_sortante(int) const;
54
55 inline const DoubleTab& tau_diag() const { return tau_diag_; }
56 inline const DoubleTab& tau_croises() const { return tau_croises_; }
57 inline DoubleTab& tau_diag() { return tau_diag_; }
58 inline DoubleTab& tau_croises() { return tau_croises_; }
60 void calculer_rotationnel_ordre2_centre_element(DoubleTab&) const;
61 int imprime(Sortie&, int) const override;
62 DoubleTab& trace(const Frontiere_dis_base&, DoubleTab&, double, int distant) const override;
63 void mettre_a_jour(double temps) override;
64
65 void calculer_dscald_centre_element(DoubleTab&) const;
66
67 void calcul_critere_Q(DoubleTab&, const Domaine_Cl_VDF&);
68 void calcul_grad_u(const DoubleTab&, DoubleTab&, const Domaine_Cl_VDF&);
69 void calcul_y_plus(DoubleTab&, const Domaine_Cl_VDF&);
70 void calcul_y_plus_diphasique(DoubleTab& , const Domaine_Cl_VDF& );
71
72 DoubleTab& calcul_duidxj(const DoubleTab&, DoubleTab&) const;
73 DoubleTab& calcul_duidxj(const DoubleTab&, DoubleTab&, const Domaine_Cl_VDF&) const;
74 DoubleVect& calcul_S_barre(const DoubleTab&, DoubleVect&, const Domaine_Cl_VDF&) const;
75 DoubleTab& calcul_S_barre_Multiphase(const DoubleTab&, DoubleTab&, const Domaine_Cl_VDF&) const;
76 DoubleVect& calcul_S_barre_sans_contrib_paroi(const DoubleTab&, DoubleVect&, const Domaine_Cl_VDF&) const;
78
79 // methodes inlines
80 inline DoubleTab& valeur_aux_faces_post(DoubleTab& result) const override
81 {
83 }
84
85 inline DoubleVect& valeur_a_elem(const DoubleVect& position, DoubleVect& val, int le_poly) const override
86 {
87 return Champ_Face_VDF_implementation::valeur_a_elem(position, val, le_poly);
88 }
89
90 inline double valeur_a_elem_compo(const DoubleVect& position, int le_poly, int ncomp) const override
91 {
92 return Champ_Face_VDF_implementation::valeur_a_elem_compo(position, le_poly, ncomp);
93 }
94
95 inline DoubleTab& valeur_aux_elems(const DoubleTab& positions, const IntVect& les_polys, DoubleTab& tab_valeurs) const override
96 {
97 return Champ_Face_VDF_implementation::valeur_aux_elems(positions, les_polys, tab_valeurs);
98 }
99
100 inline DoubleTab& valeur_aux_elems_passe(const DoubleTab& positions, const IntVect& les_polys, DoubleTab& tab_valeurs) const override
101 {
102 return Champ_Face_VDF_implementation::valeur_aux_elems_passe(positions, les_polys, tab_valeurs);
103 }
104
105 inline DoubleVect& valeur_aux_elems_compo(const DoubleTab& positions, const IntVect& les_polys, DoubleVect& tab_valeurs, int ncomp) const override
106 {
107 return Champ_Face_VDF_implementation::valeur_aux_elems_compo(positions, les_polys, tab_valeurs, ncomp);
108 }
109
110 inline DoubleTab& valeur_aux_sommets(const Domaine& dom, DoubleTab& val) const override
111 {
113 }
114
115 inline DoubleVect& valeur_aux_sommets_compo(const Domaine& dom, DoubleVect& val, int comp) const override
116 {
118 }
119
120 inline DoubleTab& remplir_coord_noeuds(DoubleTab& positions) const override
121 {
123 }
124
125 inline int remplir_coord_noeuds_et_polys(DoubleTab& positions, IntVect& polys) const override
126 {
128 }
129
130 /* utilitaire pour le calcul des termes sources : calcule le vecteur v_e + n_f (v_f - v_e. n_f)
131 retour : le vecteur, sa norme et les derivees de celle-ci selon v_e et v_f
132 */
133 inline double v_norm(const DoubleTab& val, const DoubleTab& val_f, int e, int f, int k, int l, double *v_ext, double *dnv) const
134 {
136 int d, D = dimension, N = val_f.line_size();
137 const DoubleTab& nf = domaine.face_normales();
138 const DoubleVect& fs = domaine.face_surfaces();
139
140 double scal = 0, vf = f >= 0 ? val_f(f, k) - (l >= 0 ? val_f(f, l) : 0) : 0, v_temp[3], *v = v_ext ? v_ext : v_temp;
141 for (d = 0; d < D; d++)
142 v[d] = val(e, N*d+k ) - (l >= 0 ? val(e, N*d+l ) : 0);
143
144 if (f >= 0)
145 for (d = 0, scal = domaine.dot(v, &nf(f, 0)) / fs(f); d < D; d++) v[d] += (vf - scal) * nf(f, d) / fs(f);
146
147 double nv = sqrt(domaine.dot(v, v));
148
149 if (dnv)
150 for (d = 0; d < D; d++) dnv[d] = nv ? (v[d] - (f >= 0 ? vf * nf(f, d) / fs(f) : 0)) / nv : 0;
151
152#ifdef _COMPILE_AVEC_PGCC
153 if (dnv) dnv[3] = f >= 0 && nv ? vf / (nv+DMINFLOAT) : 0; // nvc++ sucks
154#else
155 if (dnv) dnv[3] = f >= 0 && nv ? vf / nv : 0;
156#endif
157 return nv;
158 }
159
160private:
161 double val_imp_face_bord_private(int face, int comp) const;
162 double val_imp_face_bord_private(int face, int comp1, int comp2) const;
163 inline const Champ_base& le_champ() const override { return *this; }
164 inline Champ_base& le_champ() override { return *this; }
165
166 DoubleTab tau_diag_; // termes diagonaux du tenseur Grad
167 DoubleTab tau_croises_; // termes extradiagonaux du tenseur Grad
168};
169
170double Champ_Face_coeff_frottement_face_bord(const int, const int , const Domaine_Cl_VDF& zclo);
171double Champ_Face_coeff_frottement_grad_face_bord(const int, const int , const Domaine_Cl_VDF& zclo);
172double Champ_Face_get_val_imp_face_bord_sym(const DoubleTab& tab_valeurs, const double temp,int face,int comp, const Domaine_Cl_VDF& zclo);
173double Champ_Face_get_val_imp_face_bord( const double temp,int face,int comp, const Domaine_Cl_VDF& zclo) ;
174double Champ_Face_get_val_imp_face_bord( const double temp,int face,int comp, int comp2, const Domaine_Cl_VDF& zclo) ;
175
176#endif /* Champ_Face_VDF_included */
double valeur_a_elem_compo(const DoubleVect &position, int le_poly, int ncomp) const override
DoubleTab & valeur_aux_faces_post_impl(const Domaine_VDF &, DoubleTab &result) const
DoubleTab & valeur_aux_sommets(const Domaine &, DoubleTab &) const override
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp) const override
DoubleVect & valeur_a_elem(const DoubleVect &position, DoubleVect &val, int le_poly) const override
int remplir_coord_noeuds_et_polys(DoubleTab &positions, IntVect &polys) const override
DoubleTab & valeur_aux_elems_passe(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const
DoubleVect & valeur_aux_sommets_compo(const Domaine &, DoubleVect &, int) const override
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const override
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
DoubleTab & valeur_aux_elems_passe(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &tab_valeurs) const override
DoubleVect & calcul_S_barre(const DoubleTab &, DoubleVect &, const Domaine_Cl_VDF &) const
int imprime(Sortie &, int) const override
int compo_normale_sortante(int) const
void calcul_critere_Q(DoubleTab &, const Domaine_Cl_VDF &)
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
DoubleVect & valeur_a_elem(const DoubleVect &position, DoubleVect &val, int le_poly) const override
provoque une erreur ! doit etre surchargee par les classes derivees
DoubleVect & calcul_S_barre_sans_contrib_paroi(const DoubleTab &, DoubleVect &, const Domaine_Cl_VDF &) const
Methode qui renvoie SMA_barre aux elements a partir de la vitesse aux faces.
double valeur_a_elem_compo(const DoubleVect &position, int le_poly, int ncomp) const override
provoque une erreur ! doit etre surchargee par les classes derivees
DoubleTab & tau_croises()
DoubleTab & valeur_aux_faces_post(DoubleTab &result) const override
void calculer_dercov_axi(const Domaine_Cl_VDF &)
void mettre_a_jour(double temps) override
mettre_a_jour de la classe de base Champ_base :ne fait rien !
double v_norm(const DoubleTab &val, const DoubleTab &val_f, int e, int f, int k, int l, double *v_ext, double *dnv) const
void calculer_dscald_centre_element(DoubleTab &) const
void calcul_y_plus(DoubleTab &, const Domaine_Cl_VDF &)
void verifie_valeurs_cl() override
void calcul_grad_u(const DoubleTab &, DoubleTab &, const Domaine_Cl_VDF &)
DoubleTab & valeur_aux_sommets(const Domaine &dom, DoubleTab &val) const override
renvoie les valeurs aux sommets du Domaine dom
int remplir_coord_noeuds_et_polys(DoubleTab &positions, IntVect &polys) const override
NE FAIT RIEN Methode a surcharger.
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &tab_valeurs, int ncomp) const override
provoque une erreur ! doit etre surchargee par les classes derivees
DoubleTab & tau_diag()
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &tab_valeurs) const override
provoque une erreur ! doit etre surchargee par les classes derivees
virtual const Champ_Proto & affecter(const double x1, const double x2)
const Domaine_VDF & domaine_vdf() const override
int fixer_nb_valeurs_nodales(int) override
const DoubleTab & tau_croises() const
DoubleTab & calcul_duidxj(const DoubleTab &, DoubleTab &) const
Methode qui renvoie gij aux elements a partir de la vitesse aux elements (gij represente la derivee p...
void calculer_rotationnel_ordre2_centre_element(DoubleTab &) const
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
Calcule la trace d'un champ sur une frontiere au temps tps.
DoubleVect & valeur_aux_sommets_compo(const Domaine &dom, DoubleVect &val, int comp) const override
renvoie la compo eme valeur aux sommets de dom.
Champ_base & affecter_(const Champ_base &) override
DoubleTab & calcul_S_barre_Multiphase(const DoubleTab &, DoubleTab &, const Domaine_Cl_VDF &) const
void dimensionner_tenseur_Grad()
void calcul_y_plus_diphasique(DoubleTab &, const Domaine_Cl_VDF &)
const DoubleTab & tau_diag() const
const Domaine & domaine() const
classe Champ_Proto Classe representant un prototype de Champ.
Definition Champ_Proto.h:37
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
Champ_base()
Constructeur par defaut d'un Champ_base.
virtual Champ_base & le_champ()=0
class Domaine_Cl_VDF
class Domaine_VDF
Definition Domaine_VDF.h:64
classe Frontiere_dis_base Classe representant une frontiere discretisee.
static int dimension
Definition Objet_U.h:99
Classe de base des flux de sortie.
Definition Sortie.h:52
int line_size() const
Definition TRUSTVect.tpp:67