TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Point_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 <Point_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// Tri pour voire si champ_P1...
23Implemente_instanciable(Point_EF,"Point_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
38
39/*! @brief remplit le tableau face_normales dans le Domaine_EF
40 *
41 */
42void Point_EF::normale(int num_Face,DoubleTab& Face_normales,
43 const IntTab& Face_sommets,
44 const IntTab& Face_voisins,
45 const IntTab& elem_faces,
46 const Domaine& domaine_geom) const
47{
48 abort();
49 // pas de sens simple a normale
50 Face_normales(num_Face,0) = 1;
51
52 {
53
54 //int n0 = Face_sommets(num_Face,0);
55
56 int elem1 = Face_voisins(num_Face,0);
57 // int elem2 = Face_voisins(num_Face,1);
58
59 int n2=elem_faces(elem1,0);
60 if (n2==num_Face) Face_normales(num_Face,0) = -1;
61 /*
62 const DoubleTab& les_coords = domaine_geom.domaine().coord_sommets();
63 // const IntTab& elem = domaine_geom.elems();
64
65 {
66 int n2=elem_faces(elem1,0);
67 if ( n2 == num_Face )
68 n2 = elem_faces(elem1,1);
69 n2=Face_sommets(n2,0);
70 for (int i=0;i<dim;i++)
71 d(i) =les_coords(n0,i)- les_coords(n2,i);
72 d/=d.norm();
73
74 Face_normales(num_Face,0) = -1;
75
76 }
77
78 //int n1 = Face_sommets(num_Face,1);
79
80 // Orientation de la normale de elem1 vers elem2
81 // pour cela recherche du sommet de elem1 qui n'est pas sur la Face
82 int f0,no3;
83 int elem1 = Face_voisins(num_Face,0);
84 Cerr<<num_Face<<" iii "<<elem1<< " "<<Face_voisins(num_Face,1)<<" "<<(Face_voisins(num_Face,0)==elem1) <<finl;
85 if ( (f0 = elem_faces(elem1,0)) == num_Face )
86 f0 = elem_faces(elem1,1);
87 if ( (no3 = Face_sommets(f0,0)) != n0 )
88 Cerr<<"oo "<<finl;
89 else
90 {
91 Cerr<<"ii"<<finl;
92 no3 = Face_sommets(f0,1);
93 }
94 Cerr<<n0 << " "<<finl;
95 */
96 }
97 return;
98 /*
99
100
101 double x1,y1;
102 double nx,ny;
103 int no3; int f0;
104 int n0 = Face_sommets(num_Face,0);
105 int n1 = Face_sommets(num_Face,1);
106 x1 = les_coords(n0,0)-les_coords(n1,0);
107 y1 = les_coords(n0,1)-les_coords(n1,1);
108 nx = -y1;
109 ny = x1;
110
111 // Orientation de la normale de elem1 vers elem2
112 // pour cela recherche du sommet de elem1 qui n'est pas sur la Face
113 int elem1 = Face_voisins(num_Face,0);
114 if ( (f0 = elem_faces(elem1,0)) == num_Face )
115 f0 = elem_faces(elem1,1);
116 if ( (no3 = Face_sommets(f0,0)) != n0 && no3 != n1 )
117 ;
118 else
119 no3 = Face_sommets(f0,1);
120
121 x1 = les_coords(no3,0) - les_coords(n0,0);
122 y1 = les_coords(no3,1) - les_coords(n0,1);
123
124 if ( (nx*x1+ny*y1) > 0 ) {
125 Face_normales(num_Face,0) = - nx;
126 Face_normales(num_Face,1) = - ny;
127 }
128 else {
129 Face_normales(num_Face,0) = nx;
130 Face_normales(num_Face,1) = ny;
131 }
132 */
133}
134
135/*! @brief
136 *
137 */
138void Point_EF::calcul_vc(const ArrOfInt& Face,ArrOfDouble& vc,
139 const ArrOfDouble& vs,const DoubleTab& vsom,
140 const Champ_Inc_base& vitesse,int type_cl) const
141{
142 abort();
143 const DoubleVect& porosite_face = vitesse.equation().milieu().porosite_face();
144 //Cerr << " type_cl " << type_cl << finl;
145 switch(type_cl)
146 {
147 case 0: // le triangle n'a pas de Face de Dirichlet
148 {
149 vc[0] = vs[0]/3;
150 vc[1] = vs[1]/3;
151 break;
152 }
153
154 case 1: // le triangle a une Face de Dirichlet :la Face 2
155 {
156 vc[0]= vitesse.valeurs()(Face[2],0)*porosite_face[Face[2]];
157 vc[1]= vitesse.valeurs()(Face[2],1)*porosite_face[Face[2]];
158 //vc[0]= vitesse.valeurs()(Face[2],0);
159 //vc[1]= vitesse.valeurs()(Face[2],1);
160 break;
161 }
162
163 case 2: // le triangle a une Face de Dirichlet :la Face 1
164 {
165 vc[0]= vitesse.valeurs()(Face[1],0)*porosite_face[Face[1]];
166 vc[1]= vitesse.valeurs()(Face[1],1)*porosite_face[Face[1]];
167 //vc[0]= vitesse.valeurs()(Face[1],0);
168 //vc[1]= vitesse.valeurs()(Face[1],1);
169 break;
170 }
171
172 case 4: // le triangle a une Face de Dirichlet :la Face 0
173 {
174 vc[0]= vitesse.valeurs()(Face[0],0)*porosite_face[Face[0]];
175 vc[1]= vitesse.valeurs()(Face[0],1)*porosite_face[Face[0]];
176 // vc[0]= vitesse.valeurs()(Face[0],0);
177 //vc[1]= vitesse.valeurs()(Face[0],1);
178 break;
179 }
180
181 case 3: // le triangle a deux faces de Dirichlet :les faces 1 et 2
182 {
183 vc[0]= vsom(0,0);
184 vc[1]= vsom(0,1);
185 break;
186 }
187
188 case 5: // le triangle a deux faces de Dirichlet :les faces 0 et 2
189 {
190 vc[0]= vsom(1,0);
191 vc[1]= vsom(1,1);
192 break;
193 }
194
195 case 6: // le triangle a deux faces de Dirichlet :les faces 0 et 1
196 {
197 vc[0]= vsom(2,0);
198 vc[1]= vsom(2,1);
199 break;
200 }
201
202 } // fin du switch
203
204}
205
206/*! @brief calcule les coord xg du centre d'un element non standard calcule aussi idirichlet=nb de faces de Dirichlet de l'element
207 *
208 * si idirichlet=2, n1 est le numero du sommet confondu avec G
209 *
210 */
211void Point_EF::calcul_xg(DoubleVect& xg, const DoubleTab& x,
212 const int type_elem_Cl,int& idirichlet,int& n1,int& ,int& ) const
213{
214 abort();
215 int j,dim=xg.size();
216 switch(type_elem_Cl)
217 {
218
219 case 0: // le triangle n'a pas de Face de dirichlet: il a 3 Facettes
220 // le point G est le barycentre des sommets du triangle
221 {
222 for (j=0; j<dim; j++)
223 xg[j]=(x(0,j)+x(1,j)+x(2,j))/3;
224
225 idirichlet=0;
226 break;
227 }
228
229 case 1: // le triangle a une Face de dirichlet: la Face 2
230 // le point G est le barycentre des sommets de la Face 2
231
232 {
233 for (j=0; j<dim; j++)
234 xg[j]=(x(0,j)+x(1,j))/2;
235
236 idirichlet=1;
237 break;
238 }
239
240 case 2: // le triangle a une Face de dirichlet: la Face 1
241 // le point G est le barycentre des sommets de la Face 1
242
243 {
244 for (j=0; j<dim; j++)
245 xg[j]=(x(0,j)+x(2,j))/2;
246
247 idirichlet=1;
248 break;
249 }
250
251 case 4: // le triangle a une Face de dirichlet: la Face 0
252 // le point G est le barycentre des sommets de la Face 0
253
254 {
255 for (j=0; j<dim; j++)
256 xg[j]=(x(1,j)+x(2,j))/2;
257
258 idirichlet=1;
259 break;
260 }
261
262 case 6 : // le triangle a deux faces de Dirichlet : les faces 0,1
263 // le point G est le sommet 2 du triangle
264
265 {
266 for (j=0; j<dim; j++)
267 xg[j]=x(2,j);
268
269 idirichlet=2;
270 n1 = 2;
271 break;
272
273 }
274
275 case 5 : // le triangle a deux faces de Dirichlet : les faces 0,2
276 // le point G est le sommet 1 du triangle
277
278 {
279 for (j=0; j<dim; j++)
280 xg[j]=x(1,j);
281
282 idirichlet=2;
283 n1 = 1;
284 break;
285
286 }
287
288 case 3 : // le triangle a deux faces de Dirichlet : les faces 1,2
289 // le point G est le sommet 0 du triangle
290
291 {
292 for (j=0; j<dim; j++)
293 xg[j]=x(0,j);
294
295 idirichlet=2;
296 n1 = 0;
297 break;
298
299 }
300
301 } // fin du switch
302
303}
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
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
void normale(int, DoubleTab &, const IntTab &, const IntTab &, const IntTab &, const Domaine &) const override
remplit le tableau face_normales dans le Domaine_EF
Definition Point_EF.cpp:42
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 Point_EF.cpp:211
void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int) const override
Definition Point_EF.cpp:138
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45