TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Domaine_VDF.h
1/****************************************************************************
2* Copyright (c) 2026, 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 Domaine_VDF_included
17#define Domaine_VDF_included
18
19
20#include <math.h>
21#include <map>
22#include <array>
23#include <Domaine_VF.h>
24#include <Domaine.h>
25class Geometrie;
26
27/*! @brief class Domaine_VDF
28 *
29 * Classe instanciable qui derive de Domaine_VF.
30 * Cette classe contient les informations geometriques que demande
31 * la methode des Volumes Differences Finis.
32 * La classe porte un certain nombre d'informations concernant les faces
33 * L'ensemble des faces est numerote comme suit:
34 * - les faces qui sont sur un Domaine_joint apparaissent en premier
35 * (dans l'ordre du vecteur les_joints)
36 * - les faces qui sont sur un Domaine_bord apparaissent ensuite
37 * (dans l'ordre du vecteur les_bords)
38 * - les faces internes apparaissent ensuite
39 * A chaque face on fait correspondre un int qui indique son orientation.
40 * On suppose qu'a l'interieur de chaque famille de faces (bord,joint,interne)
41 * on trouve:
42 * - le bloc des faces d'equation x = cte (faces d'orientation 0)
43 * - le bloc des faces d'equation y = cte (faces d'orientation 1)
44 * - le bloc des faces d'equation z = cte (faces d'orientation 2)
45 * Pour le bloc des faces de bord on conserve les sous-blocs constitues par
46 * les faces d'un meme bord.
47 * On n'a pas besoin d'une numerotation particuliere des elements.
48 * On a introduit la notion d'arete pour le calcul des flux diffusifs et
49 * convectifs dans la conservation de la quantite de mouvement.
50 * Le tableau Qdm contient la connectivite arete/faces. Dans le tableau
51 * Qdm les aretes apparaissent dans l'ordre suivant:
52 * - bloc des aretes joints
53 * - bloc des aretes bord
54 * - bloc des aretes mixtes
55 * - bloc des aretes internes
56 * A l'interieur de chaque bloc les aretes apparaissent dans l'ordre
57 * suivant: aretes XY, aretes XZ et aretes YZ.
58 *
59 *
60 *
61 */
62
63class Domaine_VDF : public Domaine_VF
64{
65
66 Declare_instanciable(Domaine_VDF);
67
68public :
69
70 void discretiser() override;
71 Faces* creer_faces() override;
72 inline int nb_faces_X() const;
73 inline int nb_faces_Y() const;
74 inline int nb_faces_Z() const;
75 inline int nb_aretes() const;
76 inline int nb_aretes_joint() const;
77 inline int nb_aretes_coin() const;
78 inline int premiere_arete_coin() const;
79 inline int nb_aretes_bord() const;
80 inline int premiere_arete_bord() const;
81 inline int nb_aretes_mixtes() const;
82 inline int premiere_arete_mixte() const;
83 inline int nb_aretes_internes() const;
84 inline int premiere_arete_interne() const;
85 inline double h_x() const;
86 inline double h_y() const;
87 inline double h_z() const;
88
89 inline int Qdm(int num_arete,int ) const;
90 //inline double porosite_face(int ) const;
91 //inline double porosite_elem(int i) const;
93 inline double face_normales(int , int ) const override;
94 inline int orientation(int ) const override;
95 inline double dist_face(int , int , int k) const;
96 inline double dist_norm(int num_face) const override;
97 inline double dist_norm_bord(int num_face) const override;
98 inline double dist_face_elem0(int ,int ) const override;
99 inline double dist_face_elem1(int ,int ) const override;
100 inline double dist_face_axi(int , int , int k) const;
101 inline double dist_face_period(int , int , int ) const;
102 inline double dist_norm_period(int ,double ) const;
103 inline double dist_face_elem0_period(int ,int ,double ) const override;
104 inline double dist_face_elem1_period(int ,int ,double ) const override;
105 inline double dist_norm_axi(int num_face) const ;
106 inline double dist_norm_bord_axi(int num_face) const;
107 inline double dist_face_elem0_axi(int ,int ) const;
108 inline double dist_face_elem1_axi(int ,int ) const;
109 inline double distance_face(int , int , int k) const;
110 inline double distance_normale(int num_face) const;
111 inline double dist_elem(int ,int ,int ) const;
112 inline double dist_elem_period(int ,int ,int ) const;
113 inline double dim_elem(int ,int ) const;
114 inline double dim_face(int ,int ) const;
115 inline double delta_C(int ) const;
116 inline int amont_amont(int, int ) const;
117 inline int face_amont_princ(int ,int ) const;
118 inline int face_amont_conj(int ,int ,int ) const;
119 inline int face_bord_amont(int ,int ,int ) const;
120 inline int elem_voisin(int , int , int ) const;
121
122 inline IntVect& orientation();
123 inline const IntVect& orientation() const override;
124
125 // inline DoubleVect& porosite_face();
126 // inline const DoubleVect& porosite_face() const;
127 // inline DoubleVect& porosite_elem();
128 // inline const DoubleVect& porosite_elem() const;
129
130 inline IntTab& Qdm();
131 inline const IntTab& Qdm() const;
133 void modifier_pour_Cl(const Conds_lim& cl) override;
134 void creer_elements_fictifs(const Domaine_Cl_dis_base& ) override;
135 DoubleVect& dist_norm_bord(DoubleVect& , const Nom& nom_bord) const;
136
137 //std::map permettant de retrouver le couple (proc, item local) associe a un item virtuel pour le mdv_elem
138 void init_virt_e_map() const;
139 mutable std::map<std::array<int, 2>, int> virt_e_map;
140
141protected:
142 void prepare_elem_non_std(Faces&) override;
143 void compute_sort_key(Faces&, IntTab& sort_key) override;
144 void renumber_faces(Faces& les_faces, IntTab& sort_key) override;
145
146private:
147
148 IntVect orientation_; // orientation des faces
149 // 0 si face perpendiculaire a l'axe des X
150 // 1 si face perpendiculaire a l'axe des Y
151 // 2 si face perpendiculaire a l'axe des Z
152 int nb_faces_X_ = -1; // nombre de faces perpendiculaires a l'axe des X
153 int nb_faces_Y_ = -1; // nombre de faces perpendiculaires a l'axe des Y
154 int nb_faces_Z_ = -1; // nombre de faces perpendiculaires a l'axe des Z
155 int nb_aretes_ = -1; // nombre d'aretes tous types confondus
156 int nb_aretes_joint_ = -1; // nombre d'aretes joint
157 int nb_aretes_coin_ = -1; // nombre d'aretes coin
158 int nb_aretes_bord_ = -1; // nombre d'aretes bord
159 int nb_aretes_mixtes_ = -1; // nombre d'aretes mixtes
160 int nb_aretes_internes_ = -1; // nombre d'aretes internes
161 IntTab Qdm_; // connectivites aretes/faces
162 // DoubleVect porosite_elem_; // Porosites volumiques pour les volumes de
163 // controle de masse
164 // DoubleVect porosite_face_; // Porosites surfaciques en masse et volumiques
165 // en quantite de mouvement
166 double h_x_ = 1.e30 , h_y_ = 1.e30 ,h_z_ = 1.e30; // pas du maillage dans les trois directions
167 // d'espace;h_x_ (resp h_y_) est la plus petite
168 // distance entre deux centres de faces d'equation
169 // X = cte (resp Y= cte)
170
171 // void calculer_porosites();
172 void genere_aretes();
173 void calcul_h();
174 void remplir_face_normales();
175};
176
177// Fonctions inline
178
179/*! @brief
180 *
181 */
182inline IntTab& Domaine_VDF::Qdm()
183{
184 return Qdm_;
185}
186
187inline double Domaine_VDF::face_normales(int num_face,int k) const
188{
189 int ori = orientation(num_face);
190 double surf=0;
191 if (ori == k)
192 surf=face_surfaces(num_face);
193 return surf;
194}
195
196/*! @brief
197 *
198 */
199inline const IntTab& Domaine_VDF::Qdm() const
200{
201 return Qdm_;
202}
203
204/*! @brief
205 *
206 */
207inline int Domaine_VDF::nb_faces_X() const
208{
209 return nb_faces_X_;
210}
211
212/*! @brief
213 *
214 */
215inline int Domaine_VDF::nb_faces_Y() const
216{
217 return nb_faces_Y_;
218}
219
220/*! @brief
221 *
222 */
223inline int Domaine_VDF::nb_faces_Z() const
224{
225 return nb_faces_Z_;
226}
227
228/*! @brief
229 *
230 */
231inline int Domaine_VDF::Qdm(int num_arete,int i) const
232{
233 return Qdm_(num_arete,i);
234}
235
236/*! @brief inline double Domaine_VDF::porosite_face(int i) const {
237 *
238 * return porosite_face_[i];
239 * }
240 *
241 */
242
243/*! @brief
244 *
245 */
247{
248 return orientation_;
249}
250
251/*! @brief
252 *
253 */
254inline const IntVect& Domaine_VDF::orientation() const
255{
256 return orientation_;
257}
258
259/*! @brief inline DoubleVect& Domaine_VDF::porosite_face() {
260 *
261 * return porosite_face_;
262 * }
263 *
264 */
265
266/*! @brief inline const DoubleVect& Domaine_VDF::porosite_face() const {
267 *
268 * return porosite_face_;
269 * }
270 *
271 */
272
273/*! @brief inline DoubleVect& Domaine_VDF::porosite_elem() {
274 *
275 * return porosite_elem_;
276 * }
277 *
278 */
279
280/*! @brief inline const DoubleVect& Domaine_VDF::porosite_elem() const {
281 *
282 * return porosite_elem_;
283 * }
284 *
285 */
286
287/*! @brief inline double Domaine_VDF::porosite_elem(int i) const {
288 *
289 * return porosite_elem_[i];
290 * }
291 *
292 */
293
294/*! @brief
295 *
296 */
297inline int Domaine_VDF::orientation(int i) const
298{
299 return orientation_[i];
300}
301
302// Fonction de calcul utilisable uniquement en coordonnees cartesiennes
303// de la distance entre les centres de 2 faces dans la direction k
304
305/*! @brief
306 *
307 */
308inline double Domaine_VDF::dist_face(int fac1, int fac2, int k) const
309{
310 // Attention cette methode n'est plus appelee par les methodes dist_face de
311 // Eval_Diff_VDF_Multi_inco_const.cpp et Eval_Diff_VDF_const.cpp pour optimiser les evaluateurs
312 return xv_(fac2,k) - xv_(fac1,k);
313}
314
315// Fonction de calcul utilisable uniquement en coordonnees cylindriques
316// de la distance entre les centres de 2 faces dans la direction k
317
318/*! @brief
319 *
320 */
321inline double Domaine_VDF::dist_face_axi(int fac1, int fac2, int k) const
322{
323 if (k != 1)
324 return xv_(fac2,k) - xv_(fac1,k);
325 else
326 {
327 double d_teta = xv_(fac2,1) - xv_(fac1,1);
328 if (d_teta < 0)
329 d_teta += 2.0*M_PI;
330 return d_teta*xv_(fac1,0);
331 }
332}
333
334// Fonction de calcul utilisable uniquement en coordonnees cartesiennes
335// de la distance normale pour une face interne
336// Pour une face interne distance normale = distance entre les centres des
337// deux mailles voisines.
338
339/*! @brief
340 *
341 */
342inline double Domaine_VDF::dist_norm(int num_face) const
343{
344 int n1 = face_voisins_(num_face,0);
345 int n2 = face_voisins_(num_face,1);
346 int k = orientation_[num_face];
347 return (xp_(n2,k) - xp_(n1,k));
348}
349
350// Fonction de calcul utilisable uniquement en coordonnees cylindriques
351// de la distance normale pour une face interne
352
353/*! @brief
354 *
355 */
356inline double Domaine_VDF::dist_norm_axi(int num_face) const
357{
358 int n1 = face_voisins_(num_face,0);
359 int n2 = face_voisins_(num_face,1);
360 int k = orientation_[num_face];
361 double dist;
362 if (k != 1)
363 dist = xp_(n2,k) - xp_(n1,k);
364 else
365 {
366 double d_teta = xp_(n2,1) - xp_(n1,1);
367 if (d_teta < 0)
368 d_teta += 2.0*M_PI;
369 dist = d_teta*xp_(n1,0);
370 }
371 return dist;
372}
373
374// Fonction de calcul utilisable uniquement en coordonnees cartesiennes
375// de la distance normale pour une face de bord
376// Pour une face de bord distance normale est egale a la distance entre le
377// centre de la maille voisine et le bord.
378
379/*! @brief
380 *
381 */
382inline double Domaine_VDF::dist_norm_bord(int num_face) const
383{
384 int n1 = face_voisins_(num_face,0);
385 int n2 = face_voisins_(num_face,1);
386 assert(num_face<nb_faces_bord() || n1==-1 || n2==-1); // Verifie que num_face est bien une face de bord reelle ou virtuelle
387 int k = orientation_[num_face];
388 if (n1!=-1)
389 return (xv_(num_face,k) - xp_(n1,k));
390 else
391 return (xp_(n2,k) - xv_(num_face,k));
392}
393
394// Fonction de calcul utilisable uniquement en coordonnees cylindriques
395// de la distance normale pour une face de bord
396
397/*! @brief
398 *
399 */
400inline double Domaine_VDF::dist_norm_bord_axi(int num_face) const
401{
402 int n1 = face_voisins_(num_face,0);
403 int n2 = face_voisins_(num_face,1);
404 assert(num_face<nb_faces_bord() || n1==-1 || n2==-1); // Verifie que num_face est bien une face de bord reelle ou virtuelle
405 int k = orientation_[num_face];
406 double dist;
407 if (n1!=-1)
408 if (k != 1)
409 dist = xv_(num_face,k) - xp_(n1,k);
410 else
411 {
412 double d_teta = xv_(num_face,1) - xp_(n1,1);
413 if (d_teta < 0)
414 d_teta += 2.0*M_PI;
415 dist = d_teta*xp_(n1,0);
416 }
417 else if (k != 1)
418 dist = xp_(n2,k) - xv_(num_face,k);
419 else
420 {
421 double d_teta = xp_(n2,1) - xv_(num_face,1);
422 if (d_teta < 0)
423 d_teta += 2.0*M_PI;
424 dist = d_teta*xp_(n2,0);
425 }
426 return dist;
427}
428
429// Fonction de calcul de la distance entre les centres de 2 faces
430// de meme orientation utilisable en coordonnees cylindriques et cartesiennes
431
432/*! @brief
433 *
434 */
435inline double Domaine_VDF::distance_face(int n1, int n2, int k) const
436{
437 double dist,d_teta;
438 assert ( (orientation_[n1]==orientation_[n2]) );
439 if ( (axi!=1) || (k!=1) )
440 dist = xv_(n2,k) - xv_(n1,k);
441 else
442 {
443 d_teta = xv_(n2,1) - xv_(n1,1);
444 if (d_teta < 0)
445 d_teta += 2.0*M_PI;
446 dist = d_teta*xv_(n1,0);
447 }
448 return dist;
449}
450
451// Fonction de calcul de la distance normale pour une face quelconque
452// utilisable en coordonnees cylindriques et cartesiennes
453
454/*! @brief
455 *
456 */
457inline double Domaine_VDF::distance_normale(int num_face) const
458{
459
460 double dist,d_teta;
461 int n1 = face_voisins_(num_face,0);
462 int n2 = face_voisins_(num_face,1);
463 int k = orientation_[num_face];
464 if ((n1!=-1) && (n2!=-1))
465 {
466 if ( (k!=1) || (axi!=1) )
467 dist = xp_(n2,k) - xp_(n1,k);
468 else
469 {
470 d_teta = xp_(n2,1) - xp_(n1,1);
471 if (d_teta < 0)
472 d_teta += 2.0*M_PI;
473 dist = d_teta*xp_(n1,0);
474 }
475 }
476 else if (n1!=-1)
477 {
478 if ( (k!=1) || (axi!=1) )
479 dist = (xv_(num_face,k) - xp_(n1,k));
480 else
481 {
482 d_teta = xv_(num_face,1) - xp_(n1,1);
483 if (d_teta < 0)
484 d_teta += 2.0*M_PI;
485 dist = d_teta*xp_(n1,0);
486 }
487 }
488 else
489 {
490 if ( (k!=1) || (axi!=1) )
491 dist = (xp_(n2,k) - xv_(num_face,k));
492 else
493 {
494 d_teta = xp_(n2,1) - xv_(num_face,1);
495 if (d_teta < 0)
496 d_teta += 2.0*M_PI;
497 dist = d_teta*xp_(n2,0);
498 }
499 }
500 return dist;
501}
502
503/*! @brief
504 *
505 */
507{
508 return nb_aretes_joint_;
509}
510
511/*! @brief
512 *
513 */
515{
516 return nb_aretes_coin_;
517}
518
519/*! @brief
520 *
521 */
523{
524 return nb_aretes_joint_;
525}
526
527/*! @brief
528 *
529 */
531{
532 return nb_aretes_bord_;
533}
534
535/*! @brief
536 *
537 */
539{
540 return nb_aretes_joint_+ nb_aretes_coin_;
541}
542
543/*! @brief
544 *
545 */
547{
548 return nb_aretes_mixtes_;
549}
550
551/*! @brief
552 *
553 */
555{
556 return nb_aretes_ - nb_aretes_mixtes_ - nb_aretes_internes_;
557}
558
559/*! @brief
560 *
561 */
563{
564 return nb_aretes_internes_;
565}
566
567/*! @brief
568 *
569 */
570inline int Domaine_VDF::nb_aretes() const
571{
572 return nb_aretes_;
573}
574
575/*! @brief
576 *
577 */
579{
580 return nb_aretes_ - nb_aretes_internes_;
581}
582
583/*! @brief
584 *
585 */
586inline double Domaine_VDF::h_x() const
587{
588 return h_x_;
589}
590
591/*! @brief
592 *
593 */
594inline double Domaine_VDF::h_y() const
595{
596 return h_y_;
597}
598
599/*! @brief
600 *
601 */
602inline double Domaine_VDF::h_z() const
603{
604 return h_z_;
605}
606
607/*! @brief
608 *
609 */
610inline double Domaine_VDF::dist_elem(int n1, int n2, int k) const
611{
612 return xp_(n2,k)-xp_(n1,k);
613}
614
615/*! @brief
616 *
617 */
618inline double Domaine_VDF::dist_elem_period(int n1, int n2, int k) const
619{
620 return xp_(n2,k) - xv_(elem_faces(n2,k),k)
621 + xv_(elem_faces(n1,k+dimension),k) - xp_(n1,k);
622}
623
624/*! @brief
625 *
626 */
627inline double Domaine_VDF::dim_elem(int n1, int k) const
628{
629 return xv_(elem_faces_(n1,k+dimension),k)-xv_(elem_faces_(n1,k),k);
630}
631
632/*! @brief
633 *
634 */
635inline double Domaine_VDF::dim_face(int n1, int k) const
636{
637 int elem = std::max(face_voisins_(n1,0), face_voisins_(n1,1));
638 return dim_elem(elem, k);
639}
640
641/*! @brief
642 *
643 */
644inline double Domaine_VDF::delta_C(int elem) const
645{
646 double dist= 1;
647 for (int i=0; i<dimension; i++)
648 dist *= dim_elem(elem,i);
649 return pow(dist,1./3.);
650}
651
652/*! @brief
653 *
654 */
655inline int Domaine_VDF::amont_amont(int num_face, int i) const
656{
657 int k=orientation_[num_face];
658 int num_elem = face_voisins_(num_face,i);
659 int face = elem_faces_(num_elem,k+i*dimension);
660 return face_voisins_(face,i);
661}
662
663/*! @brief
664 *
665 */
666inline int Domaine_VDF::face_amont_princ(int num_face, int i) const
667{
668 int ori=orientation(num_face);
669 int elem=face_voisins_(num_face,i);
670 if(elem !=-1)
671 elem=elem_faces_(elem,ori+i*dimension);
672 return elem;
673}
674
675/*! @brief
676 *
677 */
678inline int Domaine_VDF::face_amont_conj(int num_face, int k, int i) const
679{
680 int ori = orientation(num_face);
681 int elem = face_voisins_(num_face,1);
682 int face_conj=-2,face,elem_bis=-2;
683
684 if(elem != -1)
685 {
686 face = elem_faces_(elem, k+i*dimension);
687 elem_bis = face_voisins_(face,i);
688 if (elem_bis != -1)
689 face_conj = elem_faces_(elem_bis, ori);
690 else
691 face_conj = -1;
692 }
693 if ((elem==-1) || (elem_bis==-1))
694 {
695 elem = face_voisins_(num_face,0);
696 if(elem != -1)
697 {
698 face = elem_faces_(elem, k+i*dimension);
699 elem_bis = face_voisins_(face,i);
700 if (elem_bis != -1)
701 face_conj = elem_faces_(elem_bis, ori+dimension);
702 else
703 face_conj = -1;
704 }
705 }
706 assert(face_conj!=-2);
707 return face_conj;
708}
709
710/*! @brief Determine la face voisine de notre face en prevoyant que cette derniere puisse etre de type bord.
711 *
712 */
713inline int Domaine_VDF::face_bord_amont(int num_face, int k, int i) const
714{
715 int ori = orientation(num_face);
716 int elem = face_voisins_(num_face,1);
717 if(elem != -1)
718 {
719 int face = elem_faces_(elem, k+i*dimension);
720 int elem_bis = face_voisins_(face,i);
721 if (elem_bis != -1)
722 elem = elem_faces_(elem_bis, ori);
723 else
724 elem = -1;
725 }
726 if (elem == -1)
727 {
728 elem = face_voisins_(num_face,0);
729 if(elem != -1)
730 {
731 int face = elem_faces_(elem, k+i*dimension);
732 int elem_bis = face_voisins_(face,i);
733 if (elem_bis != -1)
734 elem = elem_faces_(elem_bis, ori+dimension);
735 else
736 elem = -1;
737 }
738 }
739 return elem;
740}
741
742/*! @brief
743 *
744 */
745inline int Domaine_VDF::elem_voisin(int elem, int face , int indic) const
746{
747 int ori = orientation_(face);
748 return face_voisins_(elem_faces_(elem,ori+indic*dimension),indic);
749}
750
751/*! @brief Fonction de calcul utilisable uniquement en coordonnees cartesiennes de la distance entre le centre d'une face et
752 *
753 * le centre de face_voisins(face,0)
754 *
755 */
756inline double Domaine_VDF::dist_face_elem0(int num_face,int n0) const
757
758{
759 int ori = orientation_[num_face];
760 return xv_(num_face,ori) - xp_(n0,ori);
761}
762
763/*! @brief Fonction de calcul utilisable uniquement en coordonnees cartesiennes de la distance entre le centre d'une face et
764 *
765 * le centre de face_voisins(face,1)
766 *
767 */
768inline double Domaine_VDF::dist_face_elem1(int num_face,int n1) const
769{
770 int ori = orientation_[num_face];
771 return xp_(n1,ori) - xv_(num_face,ori);
772}
773
774/*! @brief Fonction de calcul utilisable uniquement en coordonnees cylindriques de la distance entre le centre d'une face et
775 *
776 * le centre de face_voisins(face,0)
777 *
778 */
779inline double Domaine_VDF::dist_face_elem0_axi(int num_face,int n0) const
780{
781 int ori = orientation_[num_face];
782 double dist;
783 if (ori!=1)
784 dist = xv_(num_face,ori) - xp_(n0,ori);
785 else
786 {
787 double d_teta = xv_(num_face,1) - xp_(n0,1);
788 if (d_teta < 0)
789 d_teta += 2.0*M_PI;
790 dist = d_teta*xp_(n0,0);
791 }
792 return dist;
793}
794
795/*! @brief Fonction de calcul utilisable uniquement en coordonnees cylindriques de la distance entre le centre d'une face et le centre
796 *
797 * de face_voisins(face,1)
798 *
799 */
800inline double Domaine_VDF::dist_face_elem1_axi(int num_face,int n1) const
801{
802 int ori = orientation_[num_face];
803 double dist;
804 if (ori!=1)
805 dist = xp_(n1,ori) - xv_(num_face,ori);
806 else
807 {
808 double d_teta = xp_(n1,1) - xv_(num_face,1);
809 if (d_teta < 0)
810 d_teta += 2.0*M_PI;
811 dist = d_teta*xp_(n1,0);
812 }
813 return dist;
814}
815
816inline double Domaine_VDF::dist_norm_period(int num_face,double l) const
817{
818 int n1 = face_voisins_(num_face,0);
819 int n2 = face_voisins_(num_face,1);
820 int k = orientation_[num_face];
821 return (xp_(n2,k) + l - xp_(n1,k));
822}
823
824inline double Domaine_VDF::dist_face_elem0_period(int num_face,int n0,double l) const
825{
826 int ori = orientation_[num_face];
827 double dist = xv_(num_face,ori) - xp_(n0,ori);
828 if (dist > 0)
829 return dist;
830 else
831 return dist + l;
832}
833
834inline double Domaine_VDF::dist_face_elem1_period(int num_face,int n1,double l) const
835{
836 int ori = orientation_[num_face];
837 double dist = xp_(n1,ori) - xv_(num_face,ori);
838 if (dist > 0)
839 return dist;
840 else
841 return dist + l;
842}
843
844inline double Domaine_VDF::dist_face_period(int fac1 , int fac2, int k) const
845{
846 const Domaine& le_domaine = domaine();
847 const DoubleTab& coord_sommets = le_domaine.coord_sommets();
848 double dist= std::fabs(coord_sommets(face_sommets(fac1,1),k)-xv_(fac1,k));
849 dist += std::fabs(xv_(fac2,k) - coord_sommets(face_sommets(fac2,0),k));
850 return dist;
851
852}
853
854#endif
855
856
857
858
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VDF
Definition Domaine_VDF.h:64
double h_y() const
int nb_aretes_coin() const
void compute_sort_key(Faces &, IntTab &sort_key) override
Override. Compute sorting key so that internal faces are sorted by their orientation first (X,...
double dist_norm(int num_face) const override
double dist_norm_bord_axi(int num_face) const
IntVect & orientation()
inline double Domaine_VDF::porosite_face(int i) const {
double delta_C(int) const
Faces * creer_faces() override
renvoie un Faces_VDF* !
int nb_aretes_joint() const
void prepare_elem_non_std(Faces &) override
double dist_face_period(int, int, int) const
int nb_faces_Z() const
int nb_aretes() const
double dim_elem(int, int) const
int nb_faces_Y() const
std::map< std::array< int, 2 >, int > virt_e_map
void creer_elements_fictifs(const Domaine_Cl_dis_base &) override
remplit le tableau face_voisins_fictifs_ ne CREE PAS d elts fictifs!!!
int premiere_arete_bord() const
double distance_face(int, int, int k) const
void discretiser() override
appel a Domaine_VF::discretiser() calcul des centres de gravite des elements
double h_x() const
double h_z() const
int premiere_arete_coin() const
int face_bord_amont(int, int, int) const
Determine la face voisine de notre face en prevoyant que cette derniere puisse etre de type bord.
double dist_face_elem1_period(int, int, double) const override
double dist_face_elem0(int, int) const override
Fonction de calcul utilisable uniquement en coordonnees cartesiennes de la distance entre le centre d...
int nb_aretes_internes() const
int premiere_arete_interne() const
double dist_face_elem1_axi(int, int) const
Fonction de calcul utilisable uniquement en coordonnees cylindriques de la distance entre le centre d...
int nb_aretes_bord() const
int nb_aretes_mixtes() const
double dim_face(int, int) const
void modifier_pour_Cl(const Conds_lim &cl) override
int nb_faces_X() const
double dist_face(int, int, int k) const
double dist_face_elem0_axi(int, int) const
Fonction de calcul utilisable uniquement en coordonnees cylindriques de la distance entre le centre d...
double dist_elem_period(int, int, int) const
double dist_norm_period(int, double) const
int amont_amont(int, int) const
double dist_face_axi(int, int, int k) const
IntTab & Qdm()
int face_amont_conj(int, int, int) const
void init_virt_e_map() const
void renumber_faces(Faces &les_faces, IntTab &sort_key) override
Override to also renumber orientation_ member.
int premiere_arete_mixte() const
double dist_norm_axi(int num_face) const
double dist_face_elem1(int, int) const override
Fonction de calcul utilisable uniquement en coordonnees cartesiennes de la distance entre le centre d...
double distance_normale(int num_face) const
void calculer_volumes_entrelaces()
remplissage des volumes entrelaces
int elem_voisin(int, int, int) const
double dist_norm_bord(int num_face) const override
double dist_face_elem0_period(int, int, double) const override
int face_amont_princ(int, int) const
virtual DoubleTab & face_normales()
Definition Domaine_VF.h:48
double dist_elem(int, int, int) const
class Domaine_VF
Definition Domaine_VF.h:44
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
DoubleTab xp_
Definition Domaine_VF.h:218
IntTab & face_sommets() override
renvoie le tableau de connectivite faces/sommets.
Definition Domaine_VF.h:591
DoubleTab xv_
Definition Domaine_VF.h:219
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
Definition Domaine_VF.h:551
IntTab face_voisins_
Definition Domaine_VF.h:216
IntTab elem_faces_
Definition Domaine_VF.h:222
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
Definition Domaine_VF.h:513
const Domaine & domaine() const
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
static int dimension
Definition Objet_U.h:99
static int axi
Definition Objet_U.h:101