TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Eval_Amont_PolyMAC_CDO_Elem.h
1/****************************************************************************
2* Copyright (c) 2023, 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#ifndef Eval_Amont_PolyMAC_CDO_Elem_included
17#define Eval_Amont_PolyMAC_CDO_Elem_included
18
19#include <Eval_Conv_PolyMAC_CDO.h>
20#include <Eval_PolyMAC_CDO_Elem.h>
21
22/*! @brief class Eval_Amont_PolyMAC_CDO_Elem
23 *
24 * Evaluateur PolyMAC_CDO pour la convection
25 * Le champ convecte est scalaire (Champ_Elem_PolyMAC_CDO)
26 * Schema de convection Amont
27 * Rq:Les evaluateurs de flux convectifs calculent en fait le terme
28 * convectif qui figure au second membre de l'equation d'evolution
29 * c.a.d l'oppose du flux convectif pour la methode EXPLICITE.
30 *
31 * Dans le cas de la methode IMPLICITE les evaluateurs calculent la quantite qui figure
32 * dans le premier membre de l'equation, nous ne prenons pas par consequent l'oppose en
33 * ce qui concerne les termes pour la matrice, par contre pour le second membre nous
34 * procedons comme en explicite mais en ne fesant intervenir que les valeurs fournies
35 * par les conditions limites.
36 *
37 *
38 */
40{
41
42public:
44
45 inline int calculer_flux_faces_echange_externe_impose() const override { return 0; }
46 inline int calculer_flux_faces_echange_global_impose() const override { return 0; }
47 inline int calculer_flux_faces_entree_fluide() const override { return 1; }
48 inline int calculer_flux_faces_paroi() const override { return 0; }
49 inline int calculer_flux_faces_paroi_adiabatique() const override { return 0; }
50 inline int calculer_flux_faces_paroi_defilante() const override { return 0; }
51 inline int calculer_flux_faces_paroi_fixe() const override { return 0; }
52 inline int calculer_flux_faces_sortie_libre() const override { return 1; }
53 inline int calculer_flux_faces_symetrie() const override { return 0; }
54 inline int calculer_flux_faces_periodique() const override { return 1; }
55
56 // Fonctions qui servent a calculer le flux de grandeurs scalaires
57 // Elles sont de type double et renvoient le flux
58
59 inline double flux_face(const DoubleTab&, int, const Dirichlet_entree_fluide&, int) const override;
60 inline double flux_face(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
61 inline double flux_face(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
62 inline double flux_face(const DoubleTab&, int, int, int, const Echange_externe_impose&, int) const override { return 0; }
63 inline double flux_face(const DoubleTab&, int, const Echange_global_impose&, int) const override { return 0; }
64 inline double flux_face(const DoubleTab&, int, const Neumann_paroi&, int) const override { return 0; }
65 inline double flux_face(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
66 inline double flux_face(const DoubleTab&, int, const Neumann_sortie_libre&, int) const override;
67 inline double flux_face(const DoubleTab&, int, const Symetrie&, int) const override { return 0; }
68 inline double flux_face(const DoubleTab&, int, const Periodique&, int) const override;
69 inline double flux_faces_interne(const DoubleTab&, int) const override;
70
71 // Fonctions qui servent a calculer le flux de grandeurs vectorielles
72 // Elles sont de type void et remplissent le tableau flux
73
74 inline void flux_face(const DoubleTab&, int, const Symetrie&, int, DoubleVect& flux) const override { }
75 inline void flux_face(const DoubleTab&, int, const Periodique&, int, DoubleVect& flux) const override;
76 inline void flux_face(const DoubleTab&, int, const Neumann_sortie_libre&, int, DoubleVect& flux) const override;
77 inline void flux_face(const DoubleTab&, int, const Dirichlet_entree_fluide&, int, DoubleVect& flux) const override;
78 inline void flux_face(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int, DoubleVect& flux) const override { }
79 inline void flux_face(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int, DoubleVect& flux) const override { }
80 inline void flux_face(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int, DoubleVect& flux) const override { }
81 inline void flux_face(const DoubleTab&, int, const Neumann_paroi&, int, DoubleVect& flux) const override { }
82 inline void flux_face(const DoubleTab&, int, int, int, const Echange_externe_impose&, int, DoubleVect& flux) const override { }
83 inline void flux_face(const DoubleTab&, int, const Echange_global_impose&, int, DoubleVect& flux) const override { }
84
85 inline void flux_faces_interne(const DoubleTab&, int, DoubleVect& flux) const override;
86
87 // Fonctions qui servent a calculer les coefficients de la matrice pour des grandeurs
88 // scalaires dans le cas implicite.
89
90 inline void coeffs_face(int, int, const Symetrie&, double& aii, double& ajj) const override { }
91 inline void coeffs_face(int, int, const Neumann_sortie_libre&, double& aii, double& ajj) const override;
92 inline void coeffs_face(int, int, const Dirichlet_entree_fluide&, double& aii, double& ajj) const override;
93 inline void coeffs_face(int, int, const Dirichlet_paroi_fixe&, double& aii, double& ajj) const override { }
94 inline void coeffs_face(int, int, const Dirichlet_paroi_defilante&, double& aii, double& ajj) const override { }
95 inline void coeffs_face(int, int, const Neumann_paroi_adiabatique&, double& aii, double& ajj) const override { }
96 inline void coeffs_face(int, int, const Neumann_paroi&, double& aii, double& ajj) const override { }
97 inline void coeffs_face(int, int, int, int, const Echange_externe_impose&, double& aii, double& ajj) const override { }
98 inline void coeffs_face(int, int, const Echange_global_impose&, double& aii, double& ajj) const override { }
99 inline void coeffs_face(int, int, const Periodique&, double& aii, double& ajj) const override;
100 inline void coeffs_faces_interne(int, double& aii, double& ajj) const override;
101
102 // contribution de la derivee en vitesse d'une equation scalaire
103 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_entree_fluide&, int) const override;
104 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
105 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
106 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, int, int, const Echange_externe_impose&, int) const override { return 0; }
107 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Echange_global_impose&, int) const override { return 0; }
108 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_paroi&, int) const override { return 0; }
109 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
110 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_sortie_libre&, int) const override;
111 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Symetrie&, int) const override { return 0; }
112 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Periodique&, int) const override;
113 inline double coeffs_faces_interne_bloc_vitesse(const DoubleTab&, int) const override;
114
115 // Fonctions qui servent a calculer la contribution des conditions limites
116 // au second membre pour l'implicite pour les grandeurs scalaires.
117
118 inline double secmem_face(int, const Symetrie&, int) const override { return 0; }
119 inline double secmem_face(int, const Neumann_sortie_libre&, int) const override;
120 inline double secmem_face(int, const Dirichlet_entree_fluide&, int) const override;
121 inline double secmem_face(int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
122 inline double secmem_face(int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
123 inline double secmem_face(int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
124 inline double secmem_face(int, const Neumann_paroi&, int) const override { return 0; }
125 inline double secmem_face(int, int, int, const Echange_externe_impose&, int) const override { return 0; }
126 inline double secmem_face(int, const Echange_global_impose&, int) const override { return 0; }
127 inline double secmem_face(int, const Periodique&, int) const override { return 0; }
128 inline double secmem_faces_interne(int) const override { return 0; }
129
130 // Fonctions qui servent a calculer les coefficients de la matrice pour des grandeurs
131 // vectorielles dans le cas implicite.
132
133 inline void coeffs_face(int, int, const Symetrie&, DoubleVect& aii, DoubleVect& ajj) const override { }
134 inline void coeffs_face(int, int, const Neumann_sortie_libre&, DoubleVect& aii, DoubleVect& ajj) const override;
135 inline void coeffs_face(int, int, const Dirichlet_entree_fluide&, DoubleVect& aii, DoubleVect& ajj) const override;
136 inline void coeffs_face(int, int, const Dirichlet_paroi_fixe&, DoubleVect& aii, DoubleVect& ajj) const override { }
137 inline void coeffs_face(int, int, const Dirichlet_paroi_defilante&, DoubleVect& aii, DoubleVect& ajj) const override { }
138 inline void coeffs_face(int, int, const Neumann_paroi_adiabatique&, DoubleVect& aii, DoubleVect& ajj) const override { }
139 inline void coeffs_face(int, int, const Neumann_paroi&, DoubleVect& aii, DoubleVect& ajj) const override { }
140 inline void coeffs_face(int, int, int, int, const Echange_externe_impose&, DoubleVect& aii, DoubleVect& ajj) const override { }
141 inline void coeffs_face(int, int, const Echange_global_impose&, DoubleVect& aii, DoubleVect& ajj) const override { }
142 inline void coeffs_face(int, int, const Periodique&, DoubleVect& aii, DoubleVect& ajj) const override;
143
144 inline void coeffs_faces_interne(int, DoubleVect& aii, DoubleVect& ajj) const override;
145
146 // Fonctions qui servent a calculer la contribution des conditions limites
147 // au second membre pour l'implicite pour les grandeurs vectorielles.
148
149 inline void secmem_face(int, const Symetrie&, int, DoubleVect&) const override { }
150 inline void secmem_face(int, const Neumann_sortie_libre&, int, DoubleVect&) const override;
151 inline void secmem_face(int, const Dirichlet_entree_fluide&, int, DoubleVect&) const override;
152 inline void secmem_face(int, const Dirichlet_paroi_fixe&, int, DoubleVect&) const override { }
153 inline void secmem_face(int, const Dirichlet_paroi_defilante&, int, DoubleVect&) const override { }
154 inline void secmem_face(int, const Neumann_paroi_adiabatique&, int, DoubleVect&) const override { }
155 inline void secmem_face(int, const Neumann_paroi&, int, DoubleVect&) const override { }
156 inline void secmem_face(int, int, int, const Echange_externe_impose&, int, DoubleVect&) const override { }
157 inline void secmem_face(int, const Echange_global_impose&, int, DoubleVect&) const override { }
158 inline void secmem_face(int, const Periodique&, int, DoubleVect&) const override { }
159 inline void secmem_faces_interne(int, DoubleVect& flux) const override { }
160};
161
162inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1) const
163{
164 int n0 = elem_(face, 0);
165 int n1 = elem_(face, 1);
166 double psc = dt_vitesse[face] * surface[face] * porosite[face];
167 double flux;
168
169 double val_imp = la_cl.val_imp(face - num1);
170
171 if (n0 != -1)
172 {
173 if (psc > 0)
174 flux = psc * inco[n0];
175 else
176 flux = psc * val_imp;
177 }
178 else // n1 != -1
179 {
180 if (psc > 0)
181 flux = psc * val_imp;
182 else
183 flux = psc * inco[n1];
184 }
185 return -flux;
186}
187
188inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Dirichlet_entree_fluide& la_cl, double& aii, double& ajj) const
189{
190 int i = elem_(face, 0);
191 // int j = elem(face,1);
192 double psc = dt_vitesse[face] * surface[face] * porosite[face];
193
194 if (i != -1)
195 {
196 if (psc > 0)
197 {
198 aii = psc;
199 ajj = 0;
200 }
201 else
202 {
203 aii = 0;
204 ajj = 0;
205 }
206 }
207 else // j != -1
208 {
209 if (psc < 0)
210 {
211 ajj = -psc;
212 aii = 0;
213 }
214 else
215 {
216 aii = 0;
217 ajj = 0;
218 }
219 }
220}
221
222inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1) const
223{
224 int n0 = elem_(face, 0);
225 int n1 = elem_(face, 1);
226 double psc = surface[face] * porosite[face];
227 double flux;
228
229 double val_imp = la_cl.val_imp(face - num1);
230
231 if (n0 != -1)
232 {
233 if (dt_vitesse[face] > 0)
234 flux = psc * inco[n0];
235 else
236 flux = psc * val_imp;
237 }
238 else // n1 != -1
239 {
240 if (dt_vitesse[face] > 0)
241 flux = psc * val_imp;
242 else
243 flux = psc * inco[n1];
244 }
245 return flux;
246}
247
248inline double Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Dirichlet_entree_fluide& la_cl, int num1) const
249{
250 int i = elem_(face, 0);
251 // int j = elem(face,1);
252 double psc = dt_vitesse[face] * surface[face] * porosite[face];
253 double flux;
254
255 if (i != -1)
256 {
257 if (psc < 0)
258 flux = psc * la_cl.val_imp(face - num1);
259 else
260 flux = 0;
261 }
262 else // j != -1
263 {
264 if (psc > 0)
265 flux = psc * la_cl.val_imp(face - num1);
266 else
267 flux = 0;
268 }
269 return -flux;
270}
271
272inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1) const
273{
274 double flux;
275 int n0 = elem_(face, 0);
276 int n1 = elem_(face, 1);
277 double psc = dt_vitesse[face] * surface(face) * porosite(face);
278
279 double val_ext = la_cl.val_ext(face - num1);
280
281 if (n0 != -1)
282 {
283 if (psc > 0)
284 flux = psc * inco[n0];
285 else
286 flux = psc * val_ext;
287 }
288 else // n1 != -1
289 {
290 if (psc > 0)
291 flux = psc * val_ext;
292 else
293 flux = psc * inco[n1];
294 }
295 return -flux;
296}
297
298inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Neumann_sortie_libre& la_cl, double& aii, double& ajj) const
299{
300 int i = elem_(face, 0);
301 // int j = elem(face,1);
302 double psc = dt_vitesse[face] * surface(face) * porosite(face);
303
304 if (i != -1)
305 {
306 if (psc > 0)
307 {
308 aii = psc;
309 ajj = 0;
310 }
311 else
312 {
313 aii = 0;
314 ajj = 0;
315 }
316 }
317 else // j != -1
318 {
319 if (psc < 0)
320 {
321 ajj = -psc;
322 aii = 0;
323 }
324 else
325 {
326 aii = 0;
327 ajj = 0;
328 }
329 }
330}
331
332inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1) const
333{
334 double flux;
335 int n0 = elem_(face, 0);
336 int n1 = elem_(face, 1);
337 double psc = surface(face) * porosite(face);
338
339 double val_ext = la_cl.val_ext(face - num1);
340
341 if (n0 != -1)
342 {
343 if (dt_vitesse[face] > 0)
344 flux = psc * inco[n0];
345 else
346 flux = psc * val_ext;
347 }
348 else // n1 != -1
349 {
350 if (dt_vitesse[face] > 0)
351 flux = psc * val_ext;
352 else
353 flux = psc * inco[n1];
354 }
355 return flux;
356}
357
358inline double Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Neumann_sortie_libre& la_cl, int num1) const
359{
360 double flux;
361 int i = elem_(face, 0);
362 // int j = elem(face,1);
363 double psc = dt_vitesse[face] * surface(face) * porosite(face);
364 if (i != -1)
365 {
366 if (psc < 0)
367 flux = psc * la_cl.val_ext(face - num1);
368 else
369 flux = 0;
370 }
371 else // n1 != -1
372 {
373 if (psc > 0)
374 flux = psc * la_cl.val_ext(face - num1);
375 else
376 flux = 0;
377 }
378 return -flux;
379}
380
381inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Periodique& la_cl, int) const
382{
383 double psc = dt_vitesse[face] * surface(face) * porosite(face);
384 double flux;
385 if (psc > 0)
386 flux = psc * inco(elem_(face, 0));
387 else
388 flux = psc * inco(elem_(face, 1));
389 return -flux;
390}
391
392inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Periodique& la_cl, double& aii, double& ajj) const
393{
394 double psc = dt_vitesse[face] * surface[face] * porosite[face];
395
396 if (psc > 0)
397 {
398 aii = psc;
399 ajj = 0;
400 }
401
402 else
403 {
404 ajj = -psc;
405 aii = 0;
406 }
407}
408
409inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Periodique& la_cl, int) const
410{
411 double psc = surface(face) * porosite(face);
412 double flux;
413 if (dt_vitesse[face] > 0)
414 flux = psc * inco(elem_(face, 0));
415 else
416 flux = psc * inco(elem_(face, 1));
417 return flux;
418}
419
420inline double Eval_Amont_PolyMAC_CDO_Elem::flux_faces_interne(const DoubleTab& inco, int face) const
421{
422 double psc = dt_vitesse[face] * surface(face) * porosite(face);
423 double flux;
424 if (psc > 0)
425 flux = psc * inco(elem_(face, 0));
426 else
427 flux = psc * inco(elem_(face, 1));
428 return -flux;
429}
430
431inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne(int face, double& aii, double& ajj) const
432{
433 double psc = dt_vitesse[face] * surface[face] * porosite[face];
434 if (psc > 0)
435 {
436 aii = psc;
437 ajj = 0;
438 }
439 else
440 {
441 ajj = -psc;
442 aii = 0;
443 }
444}
445
446inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne_bloc_vitesse(const DoubleTab& inco, int face) const
447{
448 double psc = surface(face) * porosite(face);
449 double flux;
450 if (dt_vitesse[face] > 0)
451 flux = psc * inco(elem_(face, 0));
452 else
453 flux = psc * inco(elem_(face, 1));
454 return flux;
455}
456
457inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Periodique& la_cl, int num1, DoubleVect& flux) const
458{
459 int k;
460 double psc = dt_vitesse[face] * surface(face) * porosite(face);
461 int elem1 = elem_(face, 0);
462 int elem2 = elem_(face, 1);
463
464 if (psc > 0)
465 for (k = 0; k < flux.size(); k++)
466 flux(k) = -psc * inco(elem1, k);
467 else
468 for (k = 0; k < flux.size(); k++)
469 flux(k) = -psc * inco(elem2, k);
470}
471
472inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Periodique& la_cl, DoubleVect& aii, DoubleVect& ajj) const
473{
474 int k;
475 double psc = dt_vitesse[face] * surface(face) * porosite(face);
476 if (psc > 0)
477 {
478 for (k = 0; k < aii.size(); k++)
479 aii(k) = psc;
480 for (k = 0; k < ajj.size(); k++)
481 ajj(k) = 0;
482 }
483 else
484 {
485 for (k = 0; k < ajj.size(); k++)
486 ajj(k) = -psc;
487 for (k = 0; k < aii.size(); k++)
488 aii(k) = 0;
489 }
490}
491
492inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1, DoubleVect& flux) const
493{
494 int k;
495 int n0 = elem_(face, 0);
496 int n1 = elem_(face, 1);
497 double psc = dt_vitesse[face] * surface(face) * porosite(face);
498 if (n0 != -1)
499 {
500 if (psc > 0)
501 for (k = 0; k < flux.size(); k++)
502 flux(k) = -psc * inco(n0, k);
503 else
504 for (k = 0; k < flux.size(); k++)
505 flux(k) = -psc * la_cl.val_ext(face - num1, k);
506 }
507 else // n1 != -1
508 {
509 if (psc > 0)
510 for (k = 0; k < flux.size(); k++)
511 flux(k) = -psc * la_cl.val_ext(face - num1, k);
512 else
513 for (k = 0; k < flux.size(); k++)
514 flux(k) = -psc * inco(n1, k);
515 }
516}
517
518inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Neumann_sortie_libre& la_cl, DoubleVect& aii, DoubleVect& ajj) const
519{
520 int k;
521 int i = elem_(face, 0);
522 double psc = dt_vitesse[face] * surface(face) * porosite(face);
523
524 if (i != -1)
525 {
526 if (psc > 0)
527 {
528 for (k = 0; k < aii.size(); k++)
529 aii(k) = psc;
530 for (k = 0; k < ajj.size(); k++)
531 ajj(k) = 0;
532 }
533 else
534 {
535 for (k = 0; k < aii.size(); k++)
536 aii(k) = 0;
537 for (k = 0; k < ajj.size(); k++)
538 ajj(k) = 0;
539 }
540 }
541 else // j != -1
542 {
543 if (psc < 0)
544 {
545 for (k = 0; k < ajj.size(); k++)
546 ajj(k) = -psc;
547 for (k = 0; k < aii.size(); k++)
548 aii(k) = 0;
549 }
550 else
551 {
552 for (k = 0; k < ajj.size(); k++)
553 ajj(k) = 0;
554 for (k = 0; k < aii.size(); k++)
555 aii(k) = 0;
556 }
557 }
558}
559
560inline void Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Neumann_sortie_libre& la_cl, int num1, DoubleVect& flux) const
561{
562 int k;
563 int i = elem_(face, 0);
564 double psc = dt_vitesse[face] * surface(face) * porosite(face);
565 if (i != -1)
566 {
567 if (psc < 0)
568 for (k = 0; k < flux.size(); k++)
569 flux(k) = -psc * la_cl.val_ext(face - num1, k);
570 else
571 for (k = 0; k < flux.size(); k++)
572 flux(k) = 0;
573 }
574 else // n1 != -1
575 {
576 if (psc > 0)
577 for (k = 0; k < flux.size(); k++)
578 flux(k) = -psc * la_cl.val_ext(face - num1, k);
579 else
580 for (k = 0; k < flux.size(); k++)
581 flux(k) = 0;
582 }
583}
584
585inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1, DoubleVect& flux) const
586{
587 int k;
588 int n0 = elem_(face, 0);
589 int n1 = elem_(face, 1);
590 double psc = dt_vitesse[face] * surface[face] * porosite[face];
591 if (n0 != -1)
592 {
593 if (psc > 0)
594 for (k = 0; k < flux.size(); k++)
595 flux(k) = -psc * inco(n0, k);
596 else
597 for (k = 0; k < flux.size(); k++)
598 flux(k) = -psc * la_cl.val_imp(face - num1, k);
599 }
600 else // n1 != -1
601 {
602 if (psc > 0)
603 for (k = 0; k < flux.size(); k++)
604 flux(k) = -psc * la_cl.val_imp(face - num1, k);
605 else
606 for (k = 0; k < flux.size(); k++)
607 flux(k) = -psc * inco(n1, k);
608 }
609}
610
611inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Dirichlet_entree_fluide& la_cl, DoubleVect& aii, DoubleVect& ajj) const
612{
613 int k;
614 int i = elem_(face, 0);
615 double psc = dt_vitesse[face] * surface(face) * porosite(face);
616 if (i != -1)
617 {
618 if (psc > 0)
619 {
620 for (k = 0; k < aii.size(); k++)
621 aii(k) = psc;
622 for (k = 0; k < ajj.size(); k++)
623 ajj(k) = 0;
624 }
625 else
626 {
627 for (k = 0; k < aii.size(); k++)
628 aii(k) = 0;
629 for (k = 0; k < ajj.size(); k++)
630 ajj(k) = 0;
631 }
632 }
633 else // j != -1
634 {
635 if (psc < 0)
636 {
637 for (k = 0; k < ajj.size(); k++)
638 ajj(k) = -psc;
639 for (k = 0; k < aii.size(); k++)
640 aii(k) = 0;
641 }
642 else
643 {
644 for (k = 0; k < ajj.size(); k++)
645 ajj(k) = 0;
646 for (k = 0; k < aii.size(); k++)
647 aii(k) = 0;
648 }
649 }
650}
651
652inline void Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Dirichlet_entree_fluide& la_cl, int num1, DoubleVect& flux) const
653{
654 int k;
655 int i = elem_(face, 0);
656 double psc = dt_vitesse[face] * surface(face) * porosite(face);
657 if (i != -1)
658 {
659 if (psc < 0)
660 for (k = 0; k < flux.size(); k++)
661 flux(k) = -psc * la_cl.val_imp(face - num1, k);
662 else
663 for (k = 0; k < flux.size(); k++)
664 flux(k) = 0;
665 }
666 else // n1 != -1
667 {
668 if (psc > 0)
669 for (k = 0; k < flux.size(); k++)
670 flux(k) = -psc * la_cl.val_imp(face - num1, k);
671 else
672 for (k = 0; k < flux.size(); k++)
673 flux(k) = 0;
674 }
675}
676
677inline void Eval_Amont_PolyMAC_CDO_Elem::flux_faces_interne(const DoubleTab& inco, int face, DoubleVect& flux) const
678{
679 int k;
680 int n0 = elem_(face, 0);
681 int n1 = elem_(face, 1);
682 double psc = dt_vitesse[face] * surface(face) * porosite(face);
683 if (psc > 0)
684 for (k = 0; k < flux.size(); k++)
685 flux(k) = -psc * inco(n0, k);
686 else
687 for (k = 0; k < flux.size(); k++)
688 flux(k) = -psc * inco(n1, k);
689}
690
691inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne(int face, DoubleVect& aii, DoubleVect& ajj) const
692{
693 int k;
694 double psc = dt_vitesse[face] * surface[face] * porosite[face];
695 if (psc > 0)
696 {
697 for (k = 0; k < aii.size(); k++)
698 aii(k) = psc;
699 for (k = 0; k < ajj.size(); k++)
700 ajj(k) = 0;
701 }
702 else
703 {
704 for (k = 0; k < ajj.size(); k++)
705 ajj(k) = -psc;
706 for (k = 0; k < aii.size(); k++)
707 aii(k) = 0;
708 }
709}
710
711#endif /* Eval_Amont_PolyMAC_CDO_Elem_included */
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
virtual double val_imp(int i) const
Renvoie la valeur imposee sur la i-eme composante du champ a la frontiere au temps par defaut du cham...
Definition Dirichlet.cpp:35
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
int calculer_flux_faces_paroi_fixe() const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Neumann_paroi &, int) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Neumann_paroi_adiabatique &, int) const override
double secmem_face(int, const Neumann_paroi_adiabatique &, int) const override
void flux_face(const DoubleTab &, int, const Dirichlet_paroi_defilante &, int, DoubleVect &flux) const override
void coeffs_face(int, int, const Neumann_paroi &, double &aii, double &ajj) const override
double secmem_face(int, const Echange_global_impose &, int) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, int, int, const Echange_externe_impose &, int) const override
int calculer_flux_faces_symetrie() const override
double flux_faces_interne(const DoubleTab &, int) const override
void coeffs_face(int, int, const Echange_global_impose &, double &aii, double &ajj) const override
double secmem_face(int, const Neumann_paroi &, int) const override
void flux_face(const DoubleTab &, int, const Neumann_paroi_adiabatique &, int, DoubleVect &flux) const override
double flux_face(const DoubleTab &, int, int, int, const Echange_externe_impose &, int) const override
void secmem_face(int, const Periodique &, int, DoubleVect &) const override
double secmem_face(int, const Dirichlet_paroi_defilante &, int) const override
void flux_face(const DoubleTab &, int, const Dirichlet_paroi_fixe &, int, DoubleVect &flux) const override
void flux_face(const DoubleTab &, int, const Symetrie &, int, DoubleVect &flux) const override
void coeffs_face(int, int, const Dirichlet_paroi_fixe &, double &aii, double &ajj) const override
void coeffs_face(int, int, const Dirichlet_paroi_defilante &, DoubleVect &aii, DoubleVect &ajj) const override
void coeffs_face(int, int, int, int, const Echange_externe_impose &, double &aii, double &ajj) const override
int calculer_flux_faces_echange_externe_impose() const override
double coeffs_faces_interne_bloc_vitesse(const DoubleTab &, int) const override
double flux_face(const DoubleTab &, int, const Dirichlet_paroi_fixe &, int) const override
void secmem_face(int, const Dirichlet_paroi_fixe &, int, DoubleVect &) const override
void secmem_faces_interne(int, DoubleVect &flux) const override
int calculer_flux_faces_echange_global_impose() const override
void coeffs_face(int, int, const Symetrie &, double &aii, double &ajj) const override
double flux_face(const DoubleTab &, int, const Neumann_paroi &, int) const override
int calculer_flux_faces_entree_fluide() const override
void secmem_face(int, const Neumann_paroi &, int, DoubleVect &) const override
void secmem_face(int, const Echange_global_impose &, int, DoubleVect &) const override
double secmem_face(int, int, int, const Echange_externe_impose &, int) const override
int calculer_flux_faces_paroi_defilante() const override
void coeffs_face(int, int, const Echange_global_impose &, DoubleVect &aii, DoubleVect &ajj) const override
void coeffs_face(int, int, const Neumann_paroi &, DoubleVect &aii, DoubleVect &ajj) const override
double flux_face(const DoubleTab &, int, const Neumann_paroi_adiabatique &, int) const override
double flux_face(const DoubleTab &, int, const Dirichlet_entree_fluide &, int) const override
void coeffs_face(int, int, const Symetrie &, DoubleVect &aii, DoubleVect &ajj) const override
double flux_face(const DoubleTab &, int, const Symetrie &, int) const override
void coeffs_faces_interne(int, double &aii, double &ajj) const override
void flux_face(const DoubleTab &, int, int, int, const Echange_externe_impose &, int, DoubleVect &flux) const override
void coeffs_face(int, int, const Neumann_paroi_adiabatique &, DoubleVect &aii, DoubleVect &ajj) const override
int calculer_flux_faces_sortie_libre() const override
double secmem_face(int, const Dirichlet_paroi_fixe &, int) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Dirichlet_paroi_fixe &, int) const override
void flux_face(const DoubleTab &, int, const Neumann_paroi &, int, DoubleVect &flux) const override
void coeffs_face(int, int, const Dirichlet_paroi_fixe &, DoubleVect &aii, DoubleVect &ajj) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Dirichlet_entree_fluide &, int) const override
double secmem_face(int, const Periodique &, int) const override
int calculer_flux_faces_paroi_adiabatique() const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Echange_global_impose &, int) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Symetrie &, int) const override
void coeffs_face(int, int, int, int, const Echange_externe_impose &, DoubleVect &aii, DoubleVect &ajj) const override
void coeffs_face(int, int, const Neumann_paroi_adiabatique &, double &aii, double &ajj) const override
void secmem_face(int, int, int, const Echange_externe_impose &, int, DoubleVect &) const override
double secmem_face(int, const Symetrie &, int) const override
double flux_face(const DoubleTab &, int, const Dirichlet_paroi_defilante &, int) const override
void secmem_face(int, const Symetrie &, int, DoubleVect &) const override
void secmem_face(int, const Dirichlet_paroi_defilante &, int, DoubleVect &) const override
void flux_face(const DoubleTab &, int, const Echange_global_impose &, int, DoubleVect &flux) const override
void secmem_face(int, const Neumann_paroi_adiabatique &, int, DoubleVect &) const override
double flux_face(const DoubleTab &, int, const Echange_global_impose &, int) const override
double coeffs_face_bloc_vitesse(const DoubleTab &, int, const Dirichlet_paroi_defilante &, int) const override
void coeffs_face(int, int, const Dirichlet_paroi_defilante &, double &aii, double &ajj) const override
int calculer_flux_faces_periodique() const override
double secmem_faces_interne(int) const override
Eval_Conv_PolyMAC_CDO()
constructeur par defaut
Classe Neumann_paroi_adiabatique Cette condition limite correspond a une paroi adiabatique dans une.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
double val_ext(int i) const override
Renvoie la valeur de la i-eme composante du champ impose a l'exterieur de la frontiere.
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
Definition Symetrie.h:37
_SIZE_ size() const
Definition TRUSTVect.tpp:45