TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Tri_EF.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 <Tri_EF.h>
17#include <Domaine.h>
18#include <Domaine_EF.h>
19#include <Champ_P1_EF.h>
20#include <Equation_base.h>
21#include <Milieu_base.h>
22
23Implemente_instanciable_sans_constructeur(Tri_EF,"Tri_EF",Elem_EF_base);
24
25// printOn et readOn
26
27
29{
30 return s << que_suis_je() << finl;
31}
32
34{
35 return s ;
36}
37
41
42/*! @brief remplit le tableau face_normales dans le Domaine_EF
43 *
44 */
45void Tri_EF::normale(int num_Face,DoubleTab& Face_normales,
46 const IntTab& Face_sommets,
47 const IntTab& Face_voisins,
48 const IntTab& elem_faces,
49 const Domaine& domaine_geom) const
50{
51 const DoubleTab& les_coords = domaine_geom.coord_sommets();
52
53 double x1,y1;
54 double nx,ny;
55 int no3;
56 int f0;
57 int n0 = Face_sommets(num_Face,0);
58 int n1 = Face_sommets(num_Face,1);
59 x1 = les_coords(n0,0)-les_coords(n1,0);
60 y1 = les_coords(n0,1)-les_coords(n1,1);
61 nx = -y1;
62 ny = x1;
63
64 // Orientation de la normale de elem1 vers elem2
65 // pour cela recherche du sommet de elem1 qui n'est pas sur la Face
66 int elem1 = Face_voisins(num_Face,0);
67 if ( (f0 = elem_faces(elem1,0)) == num_Face )
68 f0 = elem_faces(elem1,1);
69 if ( (no3 = Face_sommets(f0,0)) != n0 && no3 != n1 )
70 { /* Do nothing */}
71 else
72 no3 = Face_sommets(f0,1);
73
74 x1 = les_coords(no3,0) - les_coords(n0,0);
75 y1 = les_coords(no3,1) - les_coords(n0,1);
76
77 if ( (nx*x1+ny*y1) > 0 )
78 {
79 Face_normales(num_Face,0) = - nx;
80 Face_normales(num_Face,1) = - ny;
81 }
82 else
83 {
84 Face_normales(num_Face,0) = nx;
85 Face_normales(num_Face,1) = ny;
86 }
87}
88
89/*! @brief
90 *
91 */
92void Tri_EF::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
93 const ArrOfDouble& vs,const DoubleTab& vsom,
94 const Champ_Inc_base& vitesse,int type_cl) const
95{
96 const DoubleVect& porosite_face = vitesse.equation().milieu().porosite_face();
97 //Cerr << " type_cl " << type_cl << finl;
98 switch(type_cl)
99 {
100 case 0: // le triangle n'a pas de Face de Dirichlet
101 {
102 vc[0] = vs[0]/3;
103 vc[1] = vs[1]/3;
104 break;
105 }
106
107 case 1: // le triangle a une Face de Dirichlet :la Face 2
108 {
109 vc[0]= vitesse.valeurs()(Face[2],0)*porosite_face[Face[2]];
110 vc[1]= vitesse.valeurs()(Face[2],1)*porosite_face[Face[2]];
111 //vc[0]= vitesse.valeurs()(Face[2],0);
112 //vc[1]= vitesse.valeurs()(Face[2],1);
113 break;
114 }
115
116 case 2: // le triangle a une Face de Dirichlet :la Face 1
117 {
118 vc[0]= vitesse.valeurs()(Face[1],0)*porosite_face[Face[1]];
119 vc[1]= vitesse.valeurs()(Face[1],1)*porosite_face[Face[1]];
120 //vc[0]= vitesse.valeurs()(Face[1],0);
121 //vc[1]= vitesse.valeurs()(Face[1],1);
122 break;
123 }
124
125 case 4: // le triangle a une Face de Dirichlet :la Face 0
126 {
127 vc[0]= vitesse.valeurs()(Face[0],0)*porosite_face[Face[0]];
128 vc[1]= vitesse.valeurs()(Face[0],1)*porosite_face[Face[0]];
129 // vc[0]= vitesse.valeurs()(Face[0],0);
130 //vc[1]= vitesse.valeurs()(Face[0],1);
131 break;
132 }
133
134 case 3: // le triangle a deux faces de Dirichlet :les faces 1 et 2
135 {
136 vc[0]= vsom(0,0);
137 vc[1]= vsom(0,1);
138 break;
139 }
140
141 case 5: // le triangle a deux faces de Dirichlet :les faces 0 et 2
142 {
143 vc[0]= vsom(1,0);
144 vc[1]= vsom(1,1);
145 break;
146 }
147
148 case 6: // le triangle a deux faces de Dirichlet :les faces 0 et 1
149 {
150 vc[0]= vsom(2,0);
151 vc[1]= vsom(2,1);
152 break;
153 }
154
155 } // fin du switch
156
157}
158
159/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
160 *
161 * si idirichlet=2, n1 est le numero du sommet confondu avec G
162 *
163 */
164void Tri_EF::calcul_xg(DoubleVect& xg, const DoubleTab& x,
165 const int type_elem_Cl,int& idirichlet,int& n1,int& ,int& ) const
166{
167 int j,dim=xg.size();
168 switch(type_elem_Cl)
169 {
170
171 case 0: // le triangle n'a pas de Face de dirichlet: il a 3 Facettes
172 // le point G est le barycentre des sommets du triangle
173 {
174 for (j=0; j<dim; j++)
175 xg[j]=(x(0,j)+x(1,j)+x(2,j))/3;
176
177 idirichlet=0;
178 break;
179 }
180
181 case 1: // le triangle a une Face de dirichlet: la Face 2
182 // le point G est le barycentre des sommets de la Face 2
183
184 {
185 for (j=0; j<dim; j++)
186 xg[j]=(x(0,j)+x(1,j))/2;
187
188 idirichlet=1;
189 break;
190 }
191
192 case 2: // le triangle a une Face de dirichlet: la Face 1
193 // le point G est le barycentre des sommets de la Face 1
194
195 {
196 for (j=0; j<dim; j++)
197 xg[j]=(x(0,j)+x(2,j))/2;
198
199 idirichlet=1;
200 break;
201 }
202
203 case 4: // le triangle a une Face de dirichlet: la Face 0
204 // le point G est le barycentre des sommets de la Face 0
205
206 {
207 for (j=0; j<dim; j++)
208 xg[j]=(x(1,j)+x(2,j))/2;
209
210 idirichlet=1;
211 break;
212 }
213
214 case 6 : // le triangle a deux faces de Dirichlet : les faces 0,1
215 // le point G est le sommet 2 du triangle
216
217 {
218 for (j=0; j<dim; j++)
219 xg[j]=x(2,j);
220
221 idirichlet=2;
222 n1 = 2;
223 break;
224
225 }
226
227 case 5 : // le triangle a deux faces de Dirichlet : les faces 0,2
228 // le point G est le sommet 1 du triangle
229
230 {
231 for (j=0; j<dim; j++)
232 xg[j]=x(1,j);
233
234 idirichlet=2;
235 n1 = 1;
236 break;
237
238 }
239
240 case 3 : // le triangle a deux faces de Dirichlet : les faces 1,2
241 // le point G est le sommet 0 du triangle
242
243 {
244 for (j=0; j<dim; j++)
245 xg[j]=x(0,j);
246
247 idirichlet=2;
248 n1 = 0;
249 break;
250
251 }
252
253 } // fin du switch
254
255}
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
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
DoubleVect & porosite_face()
Definition Milieu_base.h:62
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
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 de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45
Tri_EF()
Definition Tri_EF.cpp:38
void calcul_xg(DoubleVect &, const DoubleTab &, const int, int &, int &, int &, int &) const override
calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Diri...
Definition Tri_EF.cpp:164
void normale(int, DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
remplit le tableau face_normales dans le Domaine_EF
Definition Tri_EF.cpp:45
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int) const override
Definition Tri_EF.cpp:92