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