TrioCFD 1.9.9_beta
TrioCFD documentation
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 * @brief PolyMAC_CDO evaluator for convection with a scalar convected field (Champ_Elem_PolyMAC_CDO),
25 * using an upwind convection scheme.
26 * Note: convective flux evaluators actually compute the convective term that appears on the
27 * right-hand side of the evolution equation, i.e., the opposite of the convective flux
28 * for the EXPLICIT method.
29 *
30 * For the IMPLICIT method, the evaluators compute the quantity that appears on the left-hand
31 * side of the equation. Consequently, we do not take the opposite for the matrix terms,
32 * but for the right-hand side we proceed as in the explicit case, involving only the values
33 * provided by the boundary conditions.
34 *
35 *
36 */
38{
39
40public:
42
43 inline int calculer_flux_faces_echange_externe_impose() const override { return 0; }
44 inline int calculer_flux_faces_echange_global_impose() const override { return 0; }
45 inline int calculer_flux_faces_entree_fluide() const override { return 1; }
46 inline int calculer_flux_faces_paroi() const override { return 0; }
47 inline int calculer_flux_faces_paroi_adiabatique() const override { return 0; }
48 inline int calculer_flux_faces_paroi_defilante() const override { return 0; }
49 inline int calculer_flux_faces_paroi_fixe() const override { return 0; }
50 inline int calculer_flux_faces_sortie_libre() const override { return 1; }
51 inline int calculer_flux_faces_symetrie() const override { return 0; }
52 inline int calculer_flux_faces_periodique() const override { return 1; }
53
54 // Functions that compute the flux of scalar quantities
55 // They return a double representing the flux
56
57 inline double flux_face(const DoubleTab&, int, const Dirichlet_entree_fluide&, int) const override;
58 inline double flux_face(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
59 inline double flux_face(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
60 inline double flux_face(const DoubleTab&, int, int, int, const Echange_externe_impose&, int) const override { return 0; }
61 inline double flux_face(const DoubleTab&, int, const Echange_global_impose&, int) const override { return 0; }
62 inline double flux_face(const DoubleTab&, int, const Neumann_paroi&, int) const override { return 0; }
63 inline double flux_face(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
64 inline double flux_face(const DoubleTab&, int, const Neumann_sortie_libre&, int) const override;
65 inline double flux_face(const DoubleTab&, int, const Symetrie&, int) const override { return 0; }
66 inline double flux_face(const DoubleTab&, int, const Periodique&, int) const override;
67 inline double flux_faces_interne(const DoubleTab&, int) const override;
68
69 // Functions that compute the flux of vector quantities
70 // They are void and fill the flux array
71
72 inline void flux_face(const DoubleTab&, int, const Symetrie&, int, DoubleVect& flux) const override { }
73 inline void flux_face(const DoubleTab&, int, const Periodique&, int, DoubleVect& flux) const override;
74 inline void flux_face(const DoubleTab&, int, const Neumann_sortie_libre&, int, DoubleVect& flux) const override;
75 inline void flux_face(const DoubleTab&, int, const Dirichlet_entree_fluide&, int, DoubleVect& flux) const override;
76 inline void flux_face(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int, DoubleVect& flux) const override { }
77 inline void flux_face(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int, DoubleVect& flux) const override { }
78 inline void flux_face(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int, DoubleVect& flux) const override { }
79 inline void flux_face(const DoubleTab&, int, const Neumann_paroi&, int, DoubleVect& flux) const override { }
80 inline void flux_face(const DoubleTab&, int, int, int, const Echange_externe_impose&, int, DoubleVect& flux) const override { }
81 inline void flux_face(const DoubleTab&, int, const Echange_global_impose&, int, DoubleVect& flux) const override { }
82
83 inline void flux_faces_interne(const DoubleTab&, int, DoubleVect& flux) const override;
84
85 // Functions that compute the matrix coefficients for scalar quantities
86 // in the implicit case.
87
88 inline void coeffs_face(int, int, const Symetrie&, double& aii, double& ajj) const override { }
89 inline void coeffs_face(int, int, const Neumann_sortie_libre&, double& aii, double& ajj) const override;
90 inline void coeffs_face(int, int, const Dirichlet_entree_fluide&, double& aii, double& ajj) const override;
91 inline void coeffs_face(int, int, const Dirichlet_paroi_fixe&, double& aii, double& ajj) const override { }
92 inline void coeffs_face(int, int, const Dirichlet_paroi_defilante&, double& aii, double& ajj) const override { }
93 inline void coeffs_face(int, int, const Neumann_paroi_adiabatique&, double& aii, double& ajj) const override { }
94 inline void coeffs_face(int, int, const Neumann_paroi&, double& aii, double& ajj) const override { }
95 inline void coeffs_face(int, int, int, int, const Echange_externe_impose&, double& aii, double& ajj) const override { }
96 inline void coeffs_face(int, int, const Echange_global_impose&, double& aii, double& ajj) const override { }
97 inline void coeffs_face(int, int, const Periodique&, double& aii, double& ajj) const override;
98 inline void coeffs_faces_interne(int, double& aii, double& ajj) const override;
99
100 // contribution of the velocity derivative to a scalar equation
101 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_entree_fluide&, int) const override;
102 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
103 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
104 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, int, int, const Echange_externe_impose&, int) const override { return 0; }
105 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Echange_global_impose&, int) const override { return 0; }
106 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_paroi&, int) const override { return 0; }
107 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
108 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Neumann_sortie_libre&, int) const override;
109 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Symetrie&, int) const override { return 0; }
110 inline double coeffs_face_bloc_vitesse(const DoubleTab&, int, const Periodique&, int) const override;
111 inline double coeffs_faces_interne_bloc_vitesse(const DoubleTab&, int) const override;
112
113 // Functions that compute the boundary condition contribution
114 // to the right-hand side for implicit scalar quantities.
115
116 inline double secmem_face(int, const Symetrie&, int) const override { return 0; }
117 inline double secmem_face(int, const Neumann_sortie_libre&, int) const override;
118 inline double secmem_face(int, const Dirichlet_entree_fluide&, int) const override;
119 inline double secmem_face(int, const Dirichlet_paroi_fixe&, int) const override { return 0; }
120 inline double secmem_face(int, const Dirichlet_paroi_defilante&, int) const override { return 0; }
121 inline double secmem_face(int, const Neumann_paroi_adiabatique&, int) const override { return 0; }
122 inline double secmem_face(int, const Neumann_paroi&, int) const override { return 0; }
123 inline double secmem_face(int, int, int, const Echange_externe_impose&, int) const override { return 0; }
124 inline double secmem_face(int, const Echange_global_impose&, int) const override { return 0; }
125 inline double secmem_face(int, const Periodique&, int) const override { return 0; }
126 inline double secmem_faces_interne(int) const override { return 0; }
127
128 // Functions that compute the matrix coefficients for vector quantities
129 // in the implicit case.
130
131 inline void coeffs_face(int, int, const Symetrie&, DoubleVect& aii, DoubleVect& ajj) const override { }
132 inline void coeffs_face(int, int, const Neumann_sortie_libre&, DoubleVect& aii, DoubleVect& ajj) const override;
133 inline void coeffs_face(int, int, const Dirichlet_entree_fluide&, DoubleVect& aii, DoubleVect& ajj) const override;
134 inline void coeffs_face(int, int, const Dirichlet_paroi_fixe&, DoubleVect& aii, DoubleVect& ajj) const override { }
135 inline void coeffs_face(int, int, const Dirichlet_paroi_defilante&, DoubleVect& aii, DoubleVect& ajj) const override { }
136 inline void coeffs_face(int, int, const Neumann_paroi_adiabatique&, DoubleVect& aii, DoubleVect& ajj) const override { }
137 inline void coeffs_face(int, int, const Neumann_paroi&, DoubleVect& aii, DoubleVect& ajj) const override { }
138 inline void coeffs_face(int, int, int, int, const Echange_externe_impose&, DoubleVect& aii, DoubleVect& ajj) const override { }
139 inline void coeffs_face(int, int, const Echange_global_impose&, DoubleVect& aii, DoubleVect& ajj) const override { }
140 inline void coeffs_face(int, int, const Periodique&, DoubleVect& aii, DoubleVect& ajj) const override;
141
142 inline void coeffs_faces_interne(int, DoubleVect& aii, DoubleVect& ajj) const override;
143
144 // Functions that compute the boundary condition contribution
145 // to the right-hand side for implicit vector quantities.
146
147 inline void secmem_face(int, const Symetrie&, int, DoubleVect&) const override { }
148 inline void secmem_face(int, const Neumann_sortie_libre&, int, DoubleVect&) const override;
149 inline void secmem_face(int, const Dirichlet_entree_fluide&, int, DoubleVect&) const override;
150 inline void secmem_face(int, const Dirichlet_paroi_fixe&, int, DoubleVect&) const override { }
151 inline void secmem_face(int, const Dirichlet_paroi_defilante&, int, DoubleVect&) const override { }
152 inline void secmem_face(int, const Neumann_paroi_adiabatique&, int, DoubleVect&) const override { }
153 inline void secmem_face(int, const Neumann_paroi&, int, DoubleVect&) const override { }
154 inline void secmem_face(int, int, int, const Echange_externe_impose&, int, DoubleVect&) const override { }
155 inline void secmem_face(int, const Echange_global_impose&, int, DoubleVect&) const override { }
156 inline void secmem_face(int, const Periodique&, int, DoubleVect&) const override { }
157 inline void secmem_faces_interne(int, DoubleVect& flux) const override { }
158};
159
160inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1) const
161{
162 int n0 = elem_(face, 0);
163 int n1 = elem_(face, 1);
164 double psc = dt_vitesse[face] * surface[face] * porosite[face];
165 double flux;
166
167 double val_imp = la_cl.val_imp(face - num1);
168
169 if (n0 != -1)
170 {
171 if (psc > 0)
172 flux = psc * inco[n0];
173 else
174 flux = psc * val_imp;
175 }
176 else // n1 != -1
177 {
178 if (psc > 0)
179 flux = psc * val_imp;
180 else
181 flux = psc * inco[n1];
182 }
183 return -flux;
184}
185
186inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Dirichlet_entree_fluide& la_cl, double& aii, double& ajj) const
187{
188 int i = elem_(face, 0);
189 // int j = elem(face,1);
190 double psc = dt_vitesse[face] * surface[face] * porosite[face];
191
192 if (i != -1)
193 {
194 if (psc > 0)
195 {
196 aii = psc;
197 ajj = 0;
198 }
199 else
200 {
201 aii = 0;
202 ajj = 0;
203 }
204 }
205 else // j != -1
206 {
207 if (psc < 0)
208 {
209 ajj = -psc;
210 aii = 0;
211 }
212 else
213 {
214 aii = 0;
215 ajj = 0;
216 }
217 }
218}
219
220inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1) const
221{
222 int n0 = elem_(face, 0);
223 int n1 = elem_(face, 1);
224 double psc = surface[face] * porosite[face];
225 double flux;
226
227 double val_imp = la_cl.val_imp(face - num1);
228
229 if (n0 != -1)
230 {
231 if (dt_vitesse[face] > 0)
232 flux = psc * inco[n0];
233 else
234 flux = psc * val_imp;
235 }
236 else // n1 != -1
237 {
238 if (dt_vitesse[face] > 0)
239 flux = psc * val_imp;
240 else
241 flux = psc * inco[n1];
242 }
243 return flux;
244}
245
246inline double Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Dirichlet_entree_fluide& la_cl, int num1) const
247{
248 int i = elem_(face, 0);
249 // int j = elem(face,1);
250 double psc = dt_vitesse[face] * surface[face] * porosite[face];
251 double flux;
252
253 if (i != -1)
254 {
255 if (psc < 0)
256 flux = psc * la_cl.val_imp(face - num1);
257 else
258 flux = 0;
259 }
260 else // j != -1
261 {
262 if (psc > 0)
263 flux = psc * la_cl.val_imp(face - num1);
264 else
265 flux = 0;
266 }
267 return -flux;
268}
269
270inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1) const
271{
272 double flux;
273 int n0 = elem_(face, 0);
274 int n1 = elem_(face, 1);
275 double psc = dt_vitesse[face] * surface(face) * porosite(face);
276
277 double val_ext = la_cl.val_ext(face - num1);
278
279 if (n0 != -1)
280 {
281 if (psc > 0)
282 flux = psc * inco[n0];
283 else
284 flux = psc * val_ext;
285 }
286 else // n1 != -1
287 {
288 if (psc > 0)
289 flux = psc * val_ext;
290 else
291 flux = psc * inco[n1];
292 }
293 return -flux;
294}
295
296inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Neumann_sortie_libre& la_cl, double& aii, double& ajj) const
297{
298 int i = elem_(face, 0);
299 // int j = elem(face,1);
300 double psc = dt_vitesse[face] * surface(face) * porosite(face);
301
302 if (i != -1)
303 {
304 if (psc > 0)
305 {
306 aii = psc;
307 ajj = 0;
308 }
309 else
310 {
311 aii = 0;
312 ajj = 0;
313 }
314 }
315 else // j != -1
316 {
317 if (psc < 0)
318 {
319 ajj = -psc;
320 aii = 0;
321 }
322 else
323 {
324 aii = 0;
325 ajj = 0;
326 }
327 }
328}
329
330inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1) const
331{
332 double flux;
333 int n0 = elem_(face, 0);
334 int n1 = elem_(face, 1);
335 double psc = surface(face) * porosite(face);
336
337 double val_ext = la_cl.val_ext(face - num1);
338
339 if (n0 != -1)
340 {
341 if (dt_vitesse[face] > 0)
342 flux = psc * inco[n0];
343 else
344 flux = psc * val_ext;
345 }
346 else // n1 != -1
347 {
348 if (dt_vitesse[face] > 0)
349 flux = psc * val_ext;
350 else
351 flux = psc * inco[n1];
352 }
353 return flux;
354}
355
356inline double Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Neumann_sortie_libre& la_cl, int num1) const
357{
358 double flux;
359 int i = elem_(face, 0);
360 // int j = elem(face,1);
361 double psc = dt_vitesse[face] * surface(face) * porosite(face);
362 if (i != -1)
363 {
364 if (psc < 0)
365 flux = psc * la_cl.val_ext(face - num1);
366 else
367 flux = 0;
368 }
369 else // n1 != -1
370 {
371 if (psc > 0)
372 flux = psc * la_cl.val_ext(face - num1);
373 else
374 flux = 0;
375 }
376 return -flux;
377}
378
379inline double Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Periodique& la_cl, int) const
380{
381 double psc = dt_vitesse[face] * surface(face) * porosite(face);
382 double flux;
383 if (psc > 0)
384 flux = psc * inco(elem_(face, 0));
385 else
386 flux = psc * inco(elem_(face, 1));
387 return -flux;
388}
389
390inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Periodique& la_cl, double& aii, double& ajj) const
391{
392 double psc = dt_vitesse[face] * surface[face] * porosite[face];
393
394 if (psc > 0)
395 {
396 aii = psc;
397 ajj = 0;
398 }
399
400 else
401 {
402 ajj = -psc;
403 aii = 0;
404 }
405}
406
407inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_face_bloc_vitesse(const DoubleTab& inco, int face, const Periodique& la_cl, int) const
408{
409 double psc = surface(face) * porosite(face);
410 double flux;
411 if (dt_vitesse[face] > 0)
412 flux = psc * inco(elem_(face, 0));
413 else
414 flux = psc * inco(elem_(face, 1));
415 return flux;
416}
417
418inline double Eval_Amont_PolyMAC_CDO_Elem::flux_faces_interne(const DoubleTab& inco, int face) const
419{
420 double psc = dt_vitesse[face] * surface(face) * porosite(face);
421 double flux;
422 if (psc > 0)
423 flux = psc * inco(elem_(face, 0));
424 else
425 flux = psc * inco(elem_(face, 1));
426 return -flux;
427}
428
429inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne(int face, double& aii, double& ajj) const
430{
431 double psc = dt_vitesse[face] * surface[face] * porosite[face];
432 if (psc > 0)
433 {
434 aii = psc;
435 ajj = 0;
436 }
437 else
438 {
439 ajj = -psc;
440 aii = 0;
441 }
442}
443
444inline double Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne_bloc_vitesse(const DoubleTab& inco, int face) const
445{
446 double psc = surface(face) * porosite(face);
447 double flux;
448 if (dt_vitesse[face] > 0)
449 flux = psc * inco(elem_(face, 0));
450 else
451 flux = psc * inco(elem_(face, 1));
452 return flux;
453}
454
455inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Periodique& la_cl, int num1, DoubleVect& flux) const
456{
457 int k;
458 double psc = dt_vitesse[face] * surface(face) * porosite(face);
459 int elem1 = elem_(face, 0);
460 int elem2 = elem_(face, 1);
461
462 if (psc > 0)
463 for (k = 0; k < flux.size(); k++)
464 flux(k) = -psc * inco(elem1, k);
465 else
466 for (k = 0; k < flux.size(); k++)
467 flux(k) = -psc * inco(elem2, k);
468}
469
470inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Periodique& la_cl, DoubleVect& aii, DoubleVect& ajj) const
471{
472 int k;
473 double psc = dt_vitesse[face] * surface(face) * porosite(face);
474 if (psc > 0)
475 {
476 for (k = 0; k < aii.size(); k++)
477 aii(k) = psc;
478 for (k = 0; k < ajj.size(); k++)
479 ajj(k) = 0;
480 }
481 else
482 {
483 for (k = 0; k < ajj.size(); k++)
484 ajj(k) = -psc;
485 for (k = 0; k < aii.size(); k++)
486 aii(k) = 0;
487 }
488}
489
490inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Neumann_sortie_libre& la_cl, int num1, DoubleVect& flux) const
491{
492 int k;
493 int n0 = elem_(face, 0);
494 int n1 = elem_(face, 1);
495 double psc = dt_vitesse[face] * surface(face) * porosite(face);
496 if (n0 != -1)
497 {
498 if (psc > 0)
499 for (k = 0; k < flux.size(); k++)
500 flux(k) = -psc * inco(n0, k);
501 else
502 for (k = 0; k < flux.size(); k++)
503 flux(k) = -psc * la_cl.val_ext(face - num1, k);
504 }
505 else // n1 != -1
506 {
507 if (psc > 0)
508 for (k = 0; k < flux.size(); k++)
509 flux(k) = -psc * la_cl.val_ext(face - num1, k);
510 else
511 for (k = 0; k < flux.size(); k++)
512 flux(k) = -psc * inco(n1, k);
513 }
514}
515
516inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Neumann_sortie_libre& la_cl, DoubleVect& aii, DoubleVect& ajj) const
517{
518 int k;
519 int i = elem_(face, 0);
520 double psc = dt_vitesse[face] * surface(face) * porosite(face);
521
522 if (i != -1)
523 {
524 if (psc > 0)
525 {
526 for (k = 0; k < aii.size(); k++)
527 aii(k) = psc;
528 for (k = 0; k < ajj.size(); k++)
529 ajj(k) = 0;
530 }
531 else
532 {
533 for (k = 0; k < aii.size(); k++)
534 aii(k) = 0;
535 for (k = 0; k < ajj.size(); k++)
536 ajj(k) = 0;
537 }
538 }
539 else // j != -1
540 {
541 if (psc < 0)
542 {
543 for (k = 0; k < ajj.size(); k++)
544 ajj(k) = -psc;
545 for (k = 0; k < aii.size(); k++)
546 aii(k) = 0;
547 }
548 else
549 {
550 for (k = 0; k < ajj.size(); k++)
551 ajj(k) = 0;
552 for (k = 0; k < aii.size(); k++)
553 aii(k) = 0;
554 }
555 }
556}
557
558inline void Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Neumann_sortie_libre& la_cl, int num1, DoubleVect& flux) const
559{
560 int k;
561 int i = elem_(face, 0);
562 double psc = dt_vitesse[face] * surface(face) * porosite(face);
563 if (i != -1)
564 {
565 if (psc < 0)
566 for (k = 0; k < flux.size(); k++)
567 flux(k) = -psc * la_cl.val_ext(face - num1, k);
568 else
569 for (k = 0; k < flux.size(); k++)
570 flux(k) = 0;
571 }
572 else // n1 != -1
573 {
574 if (psc > 0)
575 for (k = 0; k < flux.size(); k++)
576 flux(k) = -psc * la_cl.val_ext(face - num1, k);
577 else
578 for (k = 0; k < flux.size(); k++)
579 flux(k) = 0;
580 }
581}
582
583inline void Eval_Amont_PolyMAC_CDO_Elem::flux_face(const DoubleTab& inco, int face, const Dirichlet_entree_fluide& la_cl, int num1, DoubleVect& flux) const
584{
585 int k;
586 int n0 = elem_(face, 0);
587 int n1 = elem_(face, 1);
588 double psc = dt_vitesse[face] * surface[face] * porosite[face];
589 if (n0 != -1)
590 {
591 if (psc > 0)
592 for (k = 0; k < flux.size(); k++)
593 flux(k) = -psc * inco(n0, k);
594 else
595 for (k = 0; k < flux.size(); k++)
596 flux(k) = -psc * la_cl.val_imp(face - num1, k);
597 }
598 else // n1 != -1
599 {
600 if (psc > 0)
601 for (k = 0; k < flux.size(); k++)
602 flux(k) = -psc * la_cl.val_imp(face - num1, k);
603 else
604 for (k = 0; k < flux.size(); k++)
605 flux(k) = -psc * inco(n1, k);
606 }
607}
608
609inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_face(int face, int, const Dirichlet_entree_fluide& la_cl, DoubleVect& aii, DoubleVect& ajj) const
610{
611 int k;
612 int i = elem_(face, 0);
613 double psc = dt_vitesse[face] * surface(face) * porosite(face);
614 if (i != -1)
615 {
616 if (psc > 0)
617 {
618 for (k = 0; k < aii.size(); k++)
619 aii(k) = psc;
620 for (k = 0; k < ajj.size(); k++)
621 ajj(k) = 0;
622 }
623 else
624 {
625 for (k = 0; k < aii.size(); k++)
626 aii(k) = 0;
627 for (k = 0; k < ajj.size(); k++)
628 ajj(k) = 0;
629 }
630 }
631 else // j != -1
632 {
633 if (psc < 0)
634 {
635 for (k = 0; k < ajj.size(); k++)
636 ajj(k) = -psc;
637 for (k = 0; k < aii.size(); k++)
638 aii(k) = 0;
639 }
640 else
641 {
642 for (k = 0; k < ajj.size(); k++)
643 ajj(k) = 0;
644 for (k = 0; k < aii.size(); k++)
645 aii(k) = 0;
646 }
647 }
648}
649
650inline void Eval_Amont_PolyMAC_CDO_Elem::secmem_face(int face, const Dirichlet_entree_fluide& la_cl, int num1, DoubleVect& flux) const
651{
652 int k;
653 int i = elem_(face, 0);
654 double psc = dt_vitesse[face] * surface(face) * porosite(face);
655 if (i != -1)
656 {
657 if (psc < 0)
658 for (k = 0; k < flux.size(); k++)
659 flux(k) = -psc * la_cl.val_imp(face - num1, k);
660 else
661 for (k = 0; k < flux.size(); k++)
662 flux(k) = 0;
663 }
664 else // n1 != -1
665 {
666 if (psc > 0)
667 for (k = 0; k < flux.size(); k++)
668 flux(k) = -psc * la_cl.val_imp(face - num1, k);
669 else
670 for (k = 0; k < flux.size(); k++)
671 flux(k) = 0;
672 }
673}
674
675inline void Eval_Amont_PolyMAC_CDO_Elem::flux_faces_interne(const DoubleTab& inco, int face, DoubleVect& flux) const
676{
677 int k;
678 int n0 = elem_(face, 0);
679 int n1 = elem_(face, 1);
680 double psc = dt_vitesse[face] * surface(face) * porosite(face);
681 if (psc > 0)
682 for (k = 0; k < flux.size(); k++)
683 flux(k) = -psc * inco(n0, k);
684 else
685 for (k = 0; k < flux.size(); k++)
686 flux(k) = -psc * inco(n1, k);
687}
688
689inline void Eval_Amont_PolyMAC_CDO_Elem::coeffs_faces_interne(int face, DoubleVect& aii, DoubleVect& ajj) const
690{
691 int k;
692 double psc = dt_vitesse[face] * surface[face] * porosite[face];
693 if (psc > 0)
694 {
695 for (k = 0; k < aii.size(); k++)
696 aii(k) = psc;
697 for (k = 0; k < ajj.size(); k++)
698 ajj(k) = 0;
699 }
700 else
701 {
702 for (k = 0; k < ajj.size(); k++)
703 ajj(k) = -psc;
704 for (k = 0; k < aii.size(); k++)
705 aii(k) = 0;
706 }
707}
708
709#endif /* Eval_Amont_PolyMAC_CDO_Elem_included */
Dirichlet_entree_fluide This class represents a boundary condition imposing a quantity.
Dirichlet_paroi_defilante Imposes the wall velocity in an equation of type Navier_Stokes.
Dirichlet_paroi_fixe Represents a fixed wall in a Navier-Stokes type equation.
virtual double val_imp(int i) const
Returns the imposed value on the i-th component of the field at the boundary at the default time of c...
Definition Dirichlet.cpp:35
Classe Echange_externe_impose: This class represents the special case of the class.
Classe Echange_global_impose This class represents the special case of the class.
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()
Default constructor.
Classe Neumann_paroi_adiabatique This boundary condition corresponds to an adiabatic wall in a.
Classe Neumann_paroi This boundary condition corresponds to an imposed flux for the.
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
double val_ext(int i) const override
Returns the value of the i-th component of the field imposed on the exterior of the boundary.
class Periodique This class represents a periodic boundary condition.
Definition Periodique.h:31
Symetrie On symmetry faces, the following properties hold:
Definition Symetrie.h:37
_SIZE_ size() const
Definition TRUSTVect.tpp:45