TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Domaine_VF.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_VF_included
17#define Domaine_VF_included
18
19#include <Domaine_dis_base.h>
20#include <Domaine_forward.h>
21#include <TRUSTArrays.h>
22#include <Front_VF.h>
23
24#include <medcoupling++.h>
25
26#ifdef MEDCOUPLING_
27#include <MEDCouplingFieldTemplate.hxx>
28#include <MEDCouplingCMesh.hxx>
29using MEDCoupling::MEDCouplingCMesh;
30using MEDCoupling::MCAuto;
31using MEDCoupling::MEDCouplingFieldDouble;
32#endif
33
35
36/*! @brief class Domaine_VF
37 *
38 * Cette classe abstraite contient les informations geometriques
39 * communes aux methodes de Volumes Finis (methodes VDF et VEF par exemple)
40 *
41 * @sa Domaine_dis_base
42 */
44{
45 Declare_base(Domaine_VF);
46public :
47 virtual double face_normales(int face, int comp) const { return face_normales_(face,comp); }
48 virtual DoubleTab& face_normales() { return face_normales_; }
49 virtual const DoubleTab& face_normales() const { return face_normales_; }
50 void calculer_face_surfaces(const DoubleVect& surfaces) { face_surfaces_ = surfaces; }
51 virtual const DoubleVect& face_surfaces() const { return face_surfaces_; }
52 virtual inline double face_surfaces(int i) const { return face_surfaces_(i); }
53 virtual inline double surface(int i) const { return face_surfaces(i); }
54
55 void discretiser() override;
56 void discretiser_no_face() override;
57 void typer_discretiser_ss_domaine(int i) override;
58 void infobord();
59 void info_elem_som();
61 virtual void typer_elem(Domaine&) {}
62
64 virtual Faces* creer_faces();
65 inline int nb_joints() const { return domaine().nb_joints(); }
66 inline int premiere_face_int() const;
67 inline int nb_faces() const;
68 inline int nb_faces_tot() const;
69 inline int nb_som_face() const;
70 inline int nb_arete_face() const;
71 inline int nb_faces_bord() const;
72 inline int nb_faces_bord_tot() const;
73 inline int premiere_face_bord() const;
74 inline int nb_faces_internes() const;
75
76 inline double xv(int num_face,int k) const { return xv_(num_face,k); }
77 inline double xp(int num_elem,int k) const { return xp_(num_elem,k); }
78 inline double xa(int num_arete,int k) const { return xa_(num_arete,k); }
79
80 inline int face_numero_bord(int num_face) const;
81 inline IntTab& face_numero_bord() { return face_numero_bord_; }
82 inline const IntTab& face_numero_bord() const { return face_numero_bord_; }
84
85 inline ArrOfInt& est_face_bord() { return est_face_bord_; }
86 inline const ArrOfInt& est_face_bord() const { return est_face_bord_; }
87
88 inline virtual const IntVect& orientation() const;
89 inline virtual int orientation(int ) const;
90 inline virtual int orientation_si_definie(int) const;
91
92 DoubleTab normalized_boundaries_outward_vector(int global_face_number, double scale_factor) const;
93 inline DoubleTab& xv() { return xv_;}
94 inline const DoubleTab& xv() const { return xv_;}
95 inline DoubleTab& xp() { return xp_; }
96 inline const DoubleTab& xp() const { return xp_; }
97 inline DoubleTab& xa() { return xa_; }
98 inline const DoubleTab& xa() const { return xa_; }
99 inline DoubleVect& volumes_entrelaces() { return volumes_entrelaces_; }
100 inline const DoubleVect& volumes_entrelaces() const { return volumes_entrelaces_; }
101 inline double volumes_entrelaces(int num_face) const { return volumes_entrelaces_[num_face]; }
102 inline const DoubleTab& volumes_entrelaces_dir() const { return volumes_entrelaces_dir_; }
103 inline DoubleTab& volumes_entrelaces_dir() { return volumes_entrelaces_dir_; } // renvoie le tableau des volumes entrelaces par cote.
104
105 inline const Joint& joint(int i) const { return domaine().joint(i); }
106 inline Joint& joint(int i) { return domaine().joint(i); }
107
108 inline Frontiere_dis_base& frontiere_dis(int ) override;
109 inline const Frontiere_dis_base& frontiere_dis(int ) const override;
110
111 inline int nb_frontiere_dis() const { return les_bords_.size(); }
112 inline const Front_VF& front_VF(int i) const { return les_bords_[i]; } // renvoie la ieme frontiere_discrete.
113 inline double volumes(int i) const { return volumes_[i]; }
114 inline double inverse_volumes(int i) const { return inverse_volumes_[i]; }
115 inline int face_voisins(int num_face,int i) const;
116 inline int elem_faces(int i,int j) const;
117 inline int face_sommets(int i,int j) const;
118
119 inline DoubleVect& volumes() { return volumes_; }
120 inline DoubleVect& inverse_volumes() { return inverse_volumes_; } // Tableau pour optimiser le code
121 inline const DoubleVect& volumes() const { return volumes_; }
122 inline const DoubleVect& inverse_volumes() const { return inverse_volumes_; } // Tableau pour optimiser le code
123 inline IntTab& face_voisins() override;
124 inline const IntTab& face_voisins() const override;
125 inline const IntTab& face_voisins_fictifs() const { return face_voisins_fictifs_; }
126 inline void face_voisins_reel_fictif(int face,int& el0,int& elf) const;
127 inline IntTab& elem_faces();
128 inline const IntTab& elem_faces() const;
129 inline ArrOfInt& faces_doubles();
130 inline const ArrOfInt& faces_doubles() const;
131 inline IntTab& face_sommets() override;
132 inline const IntTab& face_sommets() const override;
133 inline IntTab& face_aretes() override;
134 inline const IntTab& face_aretes() const override;
135 void modifier_pour_Cl(const Conds_lim&) override;
136
137 int numero_face_local(int face, int elem) const;
138 inline int numero_sommet_local(int som, int elem) const;
139
140 inline const IntTab& get_num_fac_loc() const { return num_fac_loc_; }
141 inline int get_num_fac_loc(int, int) const;
143
144 inline const ArrOfInt& ind_faces_virt_bord() const { return domaine().ind_faces_virt_bord(); }
145 inline int est_une_face_virt_bord(int) const;
146 inline int fbord(int f) const //renvoie l'indice de face de bord de f si f est de bord, -1 sinon
147 {
148 return f < premiere_face_int() ? f : f < nb_faces() ? -1 : ind_faces_virt_bord()[f - nb_faces()];
149 }
150
152 const IntTab& face_virt_pe_num() const;
153
154 void creer_tableau_faces(Array_base&, RESIZE_OPTIONS opt = RESIZE_OPTIONS::COPY_INIT) const;
155 void creer_tableau_aretes(Array_base&, RESIZE_OPTIONS opt = RESIZE_OPTIONS::COPY_INIT) const;
156 void creer_tableau_faces_bord(Array_base&, RESIZE_OPTIONS opt = RESIZE_OPTIONS::COPY_INIT) const;
158 const MD_Vector& md_vector_faces() const { return md_vector_faces_; }
159 // Attention, si les aretes ne sont pas remplies, le md_vector_ est nul
161
162 virtual const DoubleTab& xv_bord() const;
163 DoubleTab calculer_xgr() const;
164
165 virtual void get_position(DoubleTab& positions) const;
166 virtual double compute_L1_norm(const DoubleVect& val_source, const bool basis_function, const int order) const;
167 virtual double compute_L2_norm(const DoubleVect& val_source, const bool basis_function, const int order) const;
168 virtual void compute_average(const DoubleVect& val_source, double& sum, double& volume, const bool basis_function, const int order) const;
169 virtual void compute_average_porosity(const DoubleVect& val_source, const DoubleVect& porosity, double& sum, double& volume, const bool basis_function, const int order) const;
170 virtual void get_nb_integ_points(IntTab& nelem) const;
171 virtual void get_ind_integ_points(IntTab& nelem) const;
172 virtual int get_max_nb_integ_points() const;
173
174 //produit scalaire (a - ma).(b - mb)
175 inline double dot (const double *a, const double *b, const double *ma = nullptr, const double *mb = nullptr) const;
176
177 //produit vectoriel
178 inline std::array<double, 3> cross(int dima, int dimb, const double *a, const double *b, const double *ma = nullptr, const double *mb = nullptr) const;
179
180 inline virtual double dist_norm(int ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
181 inline virtual double dist_norm_bord(int ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
182 inline virtual double dist_face_elem0(int ,int ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
183 inline virtual double dist_face_elem1(int ,int ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
184 inline virtual double dist_face_elem0_period(int ,int ,double ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
185 inline virtual double dist_face_elem1_period(int ,int ,double ) const { Cerr << __func__ << " method should be overrided in a derived class !! " << finl; throw; }
186
187// Methodes pour le calcul et l'appel de la distance au bord solide le plus proche ; en entree on met le tableau des CL de la QDM
188 void init_dist_paroi_globale(const Conds_lim& conds_lim) override;
189 const DoubleTab& normale_paroi_elem() const {return n_y_elem_;}
190 const DoubleTab& normale_paroi_faces() const {return n_y_faces_;}
191
192 void build_mc_face_mesh() const;
193 void build_mc_dual_mesh() const;
194 inline int oriente_normale(int f, int e) const { return (face_voisins(f, 0) == e) ? 1 : -1; }
195 inline const IntTab& get_face_voisins_dual() const { return face_dual_; }
196 inline int get_face_voisins_dual(const int i, const int j) const { return face_dual_(i,j); }
197
198#ifdef MEDCOUPLING_
199 inline const MEDCouplingUMesh* get_mc_face_mesh() const;
200 inline const MEDCouplingUMesh* get_mc_dual_mesh() const;
201#endif
202
203private:
204 DoubleVect face_surfaces_; // surface des faces
205
206protected:
207
208 DoubleVect volumes_; // volumes des elements
209 DoubleVect inverse_volumes_; // inverse du volumes des elements
210 DoubleVect volumes_entrelaces_; // volumes entrelaces pour l'integration des Qdm
211 DoubleTab volumes_entrelaces_dir_; // volumes entrelaces par cote
212 DoubleTab face_normales_; // normales aux faces
213
214 inline double volume_entrelace_axi(double r_face, double r_elem, double axis_length) const;
215
216 IntTab face_voisins_; // connectivite face/elements
217 IntTab face_voisins_fictifs_; // connectivite face/elements fictifs
218 DoubleTab xp_; // centres de gravite des elements
219 DoubleTab xv_; // centres de gravite des faces
220 mutable DoubleTab xv_bord_; //xv_, mais faces de bord seulement (creation sur demande)
221
222 IntTab elem_faces_; // connectivite element/faces
223 IntTab face_sommets_; // sommets des faces
224 IntTab face_aretes_; // aretes des faces
225 DoubleTab xa_; // centres de gravite des aretes
226 IntTab face_numero_bord_; // connectivite face/numero_bord
227
228 // Descripteur parallele pour les tableaux aux faces (size() == nb_faces())
230 // Idem pour les faces frontiere (size() == nb_faces_front())
232 // Celui pour les aretes
234
235 VECT(Front_VF) les_bords_;
236
237 IntTab num_fac_loc_; // renvoie pour une face son numero local dans l'element
238 //ArrOfInt faces_perio_; // faces periodiques (utile si on boucle de 0 a nb_faces_tot)
239 ArrOfInt faces_doubles_; // faces a double contribution (faces periodiques et items communs). Utile si on boucle de 0 a nb_faces pour une reduction ensuite
240 ArrOfInt est_face_bord_; // renvoie pour une face reelle ou virtuelle: 0 si interne, 1 si face de bord non periodique, 2 si face de bord periodique
241
242 // Pour chaque face virtuelle i avec nb_faces_<=i<nb_faces_tot on a :
243 // face_virt_pe_num_(i-nb_faces_,0) = numero du PE qui possede la face
244 // face_virt_pe_num_(i-nb_faces_,1) = numero local de cette face sur le PE qui le possede
246
247 DoubleTab n_y_elem_ ; // vecteur normal entre le bord le plus proche et l'element
248 DoubleTab n_y_faces_; // vecteur normal entre le bord le plus proche et la face
249
250 int nb_elem_std_=-10; // nombre d'elements standard
251 int nb_faces_std_=-10; // nombre de faces standard
252 IntVect rang_elem_non_std_; // rang_elem_non_std_= -1 si l'element est standard
253 // rang_elem_non_std_= rang de l'element dans les tableaux
254 // relatifs aux elements non standards
255
256 //
257 // Dual mesh management:
258 //
259#ifdef MEDCOUPLING_
260 ///! MEDCoupling version of the face domain - stored in Domaine_dis since faces are built here:
261 mutable MCAuto<MEDCouplingUMesh> mc_face_mesh_;
262 mutable MCAuto<MEDCouplingUMesh> mc_dual_mesh_;
263 mutable bool mc_face_mesh_ready_ = false;
264 mutable bool mc_dual_mesh_ready_ = false;
265#endif
266
267 mutable IntTab face_dual_; ///< For each face f, face_dual_(f, j) returns the element built on the left and right of the face in the dual mesh. Same sorting as face_voisins_
268
269 void order_faces(Faces& les_faces);
270 virtual void prepare_elem_non_std(Faces& les_faces);
271 virtual void compute_sort_key(Faces& les_faces, IntTab& sort_key);
272 void sort_along_zcurve(const Faces& les_faces, IntTab& sort_key) const;
273 virtual void renumber_faces(Faces& les_faces, IntTab& sort_key);
274
275 /*
276 * XXX Elie Saikali
277 *
278 * Si demande, on construit un maillage structure de type MEDCouplingCMesh et les maps elems/faces/noeuds qui vont avec (CART -> TRUST) !
279 *
280 */
281public:
282 void build_map_mc_Cmesh(const bool with_faces) override;
283
284
285#ifdef MEDCOUPLING_
286private:
287 MCAuto<MEDCouplingCMesh> mc_Cmesh_;
288 std::vector<int> mc_Cmesh_elemCorrespondence_, mc_Cmesh_nodesCorrespondence_;
289 std::vector<int> mc_Cmesh_facesXCorrespondence_, mc_Cmesh_facesYCorrespondence_, mc_Cmesh_facesZCorrespondence_;
290 std::vector<double> mc_Cmesh_x_coords_, mc_Cmesh_y_coords_, mc_Cmesh_z_coords_;
291
292 bool mc_Cmesh_ready_ = false, mc_Cmesh_with_faces_corr_ = false;
293
294 void build_mc_Cmesh();
295 void build_mc_Cmesh_nodesCorrespondence();
296 void build_mc_Cmesh_correspondence(bool withFace);
297
298 template <typename TYPE>
299 TYPE Cmesh_error(const char * nom_funct) const
300 {
301 cerr << "Domaine_VF::" << nom_funct << " should not be called since the MEDCouplingCMesh of Domaine_VF is not yet filled !!!" << endl;
302 Cerr << "Add the interpret Build_Map_to_Structured in your data file !!!" << finl;
303 throw;
304 }
305
306public:
307
308 inline const MEDCouplingCMesh* get_mc_CMesh() const
309 {
310 if (mc_Cmesh_ready_) return mc_Cmesh_;
311 else return Cmesh_error<MEDCouplingCMesh*>(__func__);
312 }
313
314 const std::vector<int>& get_mc_Cmesh_elemCorrespondence() const
315 {
316 if (mc_Cmesh_ready_) return mc_Cmesh_elemCorrespondence_;
317 else return Cmesh_error<std::vector<int>&>(__func__);
318 }
319
320 const std::vector<int>& get_mc_Cmesh_facesXCorrespondence() const
321 {
322 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_) return mc_Cmesh_facesXCorrespondence_;
323 else return Cmesh_error<std::vector<int>&>(__func__);
324 }
325
326 const std::vector<int>& get_mc_Cmesh_facesYCorrespondence() const
327 {
328 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_) return mc_Cmesh_facesYCorrespondence_;
329 else return Cmesh_error<std::vector<int>&>(__func__);
330 }
331
332 const std::vector<int>& get_mc_Cmesh_facesZCorrespondence() const
333 {
334 if (mc_Cmesh_ready_ && mc_Cmesh_with_faces_corr_) return mc_Cmesh_facesZCorrespondence_;
335 else return Cmesh_error<std::vector<int>&>(__func__);
336 }
337
338 const std::vector<int>& get_mc_Cmesh_nodesCorrespondence() const
339 {
340 if (mc_Cmesh_ready_) return mc_Cmesh_nodesCorrespondence_;
341 else return Cmesh_error<std::vector<int>&>(__func__);
342 }
343
344 const std::vector<double>& get_mc_Cmesh_x_coords() const
345 {
346 if (mc_Cmesh_ready_) return mc_Cmesh_x_coords_;
347 else return Cmesh_error<std::vector<double>&>(__func__);
348 }
349
350 const std::vector<double>& get_mc_Cmesh_y_coords() const
351 {
352 if (mc_Cmesh_ready_) return mc_Cmesh_y_coords_;
353 else return Cmesh_error<std::vector<double>&>(__func__);
354 }
355
356 const std::vector<double>& get_mc_Cmesh_z_coords() const
357 {
358 if (mc_Cmesh_ready_) return mc_Cmesh_z_coords_;
359 else return Cmesh_error<std::vector<double>&>(__func__);
360 }
361
362 // Attention : n_som i pas elem !
363 int get_mc_Cmesh_ni() const
364 {
365 if (mc_Cmesh_ready_) return static_cast<int>(mc_Cmesh_x_coords_.size());
366 else return Cmesh_error<int>(__func__);
367 }
368
369 // Attention : n_som j pas elem !
370 int get_mc_Cmesh_nj() const
371 {
372 if (mc_Cmesh_ready_) return static_cast<int>(mc_Cmesh_y_coords_.size());
373 else return Cmesh_error<int>(__func__);
374 }
375
376 // Attention : n_som k pas elem !
377 int get_mc_Cmesh_nk() const
378 {
379 if (mc_Cmesh_ready_) return static_cast<int>(mc_Cmesh_z_coords_.size());
380 else return Cmesh_error<int>(__func__);
381 }
382
383#endif
384
385};
386
387// Renvoie le numero local de face a partir d'un numero de face global et de elem local (0 ou 1)
388// Methode beaucoup plus rapide que Domaine_VF::numero_face_local(face,elem)
389inline int Domaine_VF::get_num_fac_loc(int face,int voisin) const
390{
391 assert(voisin==0 || voisin==1);
392 return num_fac_loc_(face,voisin);
393}
394
395inline int Domaine_VF::numero_sommet_local(int som, int elem) const
396{
397 int nse=domaine().nb_som_elem();
398 const IntTab& les_elems=domaine().les_elems();
399 for(int som_loc=0; som_loc<nse; som_loc++)
400 {
401 if(les_elems(elem, som_loc)==som)
402 return som_loc;
403 }
404 return -1;
405}
406
407/*! @brief renvoie l'element voisin de numface dans la direction i.
408 *
409 * i=0 : dans le sens oppose de l'axe orthogonal a la face numface.
410 * i=1 : dans le sens de l'axe orthogonal a la face numface.
411 * exemple :
412 *
413 * | 0 | 1 |
414 * numface
415 * renvoie -1 si l'element n'existe pas (au bord).
416 *
417 */
418inline int Domaine_VF::face_voisins(int num_face,int i) const
419{
420 return face_voisins_(num_face,i);
421}
422
423/*! @brief renvoie le tableaux des volumes des connectivites face elements cf au dessus.
424 *
425 */
427{
428 return face_voisins_;
429}
430
431/*! @brief cf au dessus.
432 *
433 */
434inline const IntTab& Domaine_VF::face_voisins() const
435{
436 return face_voisins_;
437}
438
439/*! @brief renvoie dans el0 le numero de l'elt a l'interieur renvoie dans elf le numero de l'elt fictif (-1 si il n'existe pas)
440 *
441 *
442 *
443 */
444inline void Domaine_VF::face_voisins_reel_fictif(int face,int& el0,int& elf) const
445{
446 assert(face<premiere_face_int());
447 el0 = face_voisins(face,0);
448 elf = face_voisins(face,1);
449 if (el0==-1)
450 {
451 el0=elf;
452 elf=face_voisins_fictifs_(face,0);
453 }
454 if (elf==-1) elf=face_voisins_fictifs_(face,1);
455
456}
457
458/*! @brief une face est interne ssi elle separe deux elements.
459 *
460 * renvoie le numero de la premiere face interne.
461 *
462 */
464{
465 return nb_faces_bord();
466}
467
468/*! @brief renvoie le nombre global de faces.
469 *
470 */
471inline int Domaine_VF::nb_faces() const
472{
473 return face_sommets_.dimension(0);
474}
475
476/*! @brief renvoie le nombre total de faces.
477 *
478 * C'est-a-dire faces reelles + faces virtuelles
479 *
480 */
481inline int Domaine_VF::nb_faces_tot() const
482{
483 return face_sommets_.dimension_tot(0);
484}
485
486
487/*! @brief renvoie le nombre de sommets par face.
488 *
489 * Rque : on a suppose que toutes les faces avait
490 * le meme nombre de sommet ce qui exclue des elements
491 * comme le prisme.
492 *
493 */
494inline int Domaine_VF::nb_som_face() const
495{
496 return face_sommets_.dimension(1);
497}
498
499/*! @brief renvoie le nombre d'aretes par face.
500 *
501 *
502 */
504{
505 return face_aretes_.dimension(1);
506}
507
508/*! @brief renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
509 *
510 * bords, raccords, plaques.
511 *
512 */
514{
515 return domaine().nb_faces_frontiere();
516}
517
518/*! @brief renvoie le numero de la premiere des faces sur lesquelles sont appliquees les conditions limites :
519 *
520 * bords, raccords, plaques.
521 *
522 */
524{
525 return 0;
526}
527
528/*! @brief une face est interne ssi elle separe deux elements.
529 *
530 * renvoie le nombre de faces internes.
531 *
532 */
534{
535 return nb_faces()- nb_faces_bord();
536}
537
538/*! @brief renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
539 *
540 * laisse a la responsabilite des classes derivees
541 *
542 */
543inline int Domaine_VF::elem_faces(int num_elem, int i) const
544{
545 return elem_faces_(num_elem, i);
546}
547
548/*! @brief renvoie le tableau de connectivite element/faces
549 *
550 */
552{
553 return elem_faces_;
554}
555
556/*! @brief cf au dessus.
557 *
558 */
559inline const IntTab& Domaine_VF::elem_faces() const
560{
561 return elem_faces_;
562}
563
564/*! @brief renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
565 *
566 */
568{
569 return faces_doubles_;
570}
571
572/*! @brief cf au dessus
573 *
574 */
575inline const ArrOfInt& Domaine_VF::faces_doubles() const
576{
577 return faces_doubles_;
578}
579
580/*! @brief renvoie le numero du ieme sommet de la face num_face.
581 *
582 */
583inline int Domaine_VF::face_sommets(int num_face, int i) const
584{
585 return face_sommets_(num_face, i);
586}
587
588/*! @brief renvoie le tableau de connectivite faces/sommets.
589 *
590 */
592{
593 return face_sommets_;
594}
595
596/*! @brief cf au dessus.
597 *
598 */
599inline const IntTab& Domaine_VF::face_sommets() const
600{
601 return face_sommets_;
602}
603
604/*! @brief renvoie le tableau de connectivite faces/aretes.
605 *
606 */
608{
609 return face_aretes_;
610}
611
612/*! @brief cf au dessus.
613 *
614 */
615inline const IntTab& Domaine_VF::face_aretes() const
616{
617 return face_aretes_;
618}
619
620/*! @brief renvoie la ieme frontiere_discrete.
621 *
622 */
624{
625 return les_bords_[i];
626}
627
628/*! @brief renvoie la ieme frontiere_discrete.
629 *
630 */
632{
633 return les_bords_[i];
634}
635
636/*! @brief renvoie le nombre total de faces sur lesquelles sont appliquees les conditions limites :
637 *
638 * bords, raccords, plaques.
639 *
640 */
642{
644}
645
646inline const IntVect& Domaine_VF::orientation() const
647{
648 Cerr<<"Try using orientation(num_face) instead of orientation() if the mesh is axis oriented."<< finl;
649 exit();
650 throw;
651 //return orientation();
652}
653
654inline int Domaine_VF::orientation_si_definie(int num_face) const
655{
656 for (int dir=0; dir<dimension; dir++)
657 {
658 if (est_egal(std::fabs(face_normales(num_face, dir)), face_surfaces(num_face)))
659 return dir;
660 }
661 return -1;
662}
663
664inline int Domaine_VF::orientation(int num_face) const
665{
666 for (int dir=0; dir<dimension; dir++)
667 {
668 if (est_egal(std::fabs(face_normales(num_face, dir)), face_surfaces(num_face)))
669 return dir;
670 }
671 Cerr<<"Your mesh is not axis oriented."<<finl;
672 Cerr<<"Try recoding using face_normales(). Example for g(face)=gravite[orientation[face]];" << finl;
673 Cerr<<"Compute something like: g(face)=Sum(i=0;i<gravite.size();i++) of gravite[i]*face_normales(face,i)/surface(face);" << finl;
674 exit();
675 return -1;
676}
677
678/*! @brief renvoie 1 si face est une face virtuelle de bord, 0 sinon
679 *
680 */
681inline int Domaine_VF::est_une_face_virt_bord(int face) const
682{
683 if (face<nb_faces() || ind_faces_virt_bord()[face-nb_faces()]==-1)
684 return 0;
685 else
686 return 1;
687}
688
689inline int Domaine_VF::face_numero_bord(int num_face) const
690{
691 assert(num_face < nb_faces());
692 return face_numero_bord_(num_face);
693}
694
695/* produit scalaire de deux vecteurs */
696inline double Domaine_VF::dot(const double *a, const double *b, const double *ma, const double *mb) const
697{
698 double res = 0;
699 for (int i = 0; i < dimension; i++) res += (a[i] - (ma ? ma[i] : 0)) * (b[i] - (mb ? mb[i] : 0));
700 return res;
701}
702
703inline double Domaine_VF::volume_entrelace_axi(double r_face, double r_elem, double axis_length) const
704{
705 const double dr = std::fabs(r_elem - r_face);
706 const double r = (r_elem < r_face) ? r_elem : r_face;
707 return 2. * M_PI * (r * dr + 0.5 * dr * dr) * axis_length;
708}
709
710/* produit vectoriel de deux vecteurs (toujours 3D, meme en 2D) */
711inline std::array<double, 3> Domaine_VF::cross(int dima, int dimb, const double *a, const double *b, const double *ma, const double *mb) const
712{
713 std::array<double, 3> va = {{ 0, 0, 0 }}, vb = {{ 0, 0, 0 }}, res;
714 for (int i = 0; i < dima; i++) va[i] = a[i] - (ma ? ma[i] : 0);
715 for (int i = 0; i < dimb; i++) vb[i] = b[i] - (mb ? mb[i] : 0);
716 for (int i = 0; i < 3; i++) res[i] = va[(i + 1) % 3] * vb[(i + 2) % 3] - va[(i + 2) % 3] * vb[(i + 1) % 3];
717 // note : in 2D, the relevant results corresponding to the determinant is res[2]
718 return res;
719}
720
721#ifdef MEDCOUPLING_
722
723inline const MEDCouplingUMesh* Domaine_VF::get_mc_face_mesh() const
724{
725 if (!mc_face_mesh_ready_) build_mc_face_mesh();
726 return mc_face_mesh_;
727}
728
729inline const MEDCouplingUMesh* Domaine_VF::get_mc_dual_mesh() const
730{
731 if (!mc_dual_mesh_ready_) build_mc_dual_mesh();
732 return mc_dual_mesh_;
733}
734
735#endif
736
737#endif /* Domaine_VF_included */
Empty class used as a base for all the arrays.
Definition Array_base.h:41
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
Definition Domaine.h:474
int_t nb_faces_frontiere() const
Renvoie le nombre de faces frontiere du domaine (somme des nombres de bords, de raccords et de bords ...
Definition Domaine.h:488
const ArrOfInt_t & ind_faces_virt_bord() const
Definition Domaine.h:362
int nb_joints() const
Definition Domaine.h:259
IntTab_t & les_elems()
Definition Domaine.h:129
Joint_t & joint(int i)
Definition Domaine.h:261
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VF
Definition Domaine_VF.h:44
int premiere_face_bord() const
renvoie le numero de la premiere des faces sur lesquelles sont appliquees les conditions limites :
Definition Domaine_VF.h:523
IntTab face_virt_pe_num_
Definition Domaine_VF.h:245
void info_elem_som()
IntVect rang_elem_non_std_
Definition Domaine_VF.h:252
void creer_tableau_aretes(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
DoubleTab xp_
Definition Domaine_VF.h:218
virtual double compute_L1_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
void build_mc_face_mesh() const
Build the MEDCoupling face mesh. It is always made of polygons (in 3D) for simplicity purposes....
void build_map_mc_Cmesh(const bool with_faces) override
IntTab & face_sommets() override
renvoie le tableau de connectivite faces/sommets.
Definition Domaine_VF.h:591
virtual const DoubleTab & xv_bord() const
virtual double dist_face_elem1(int, int) const
Definition Domaine_VF.h:183
const IntTab & face_numero_bord() const
Definition Domaine_VF.h:82
virtual double compute_L2_norm(const DoubleVect &val_source, const bool basis_function, const int order) const
IntTab face_numero_bord_
Definition Domaine_VF.h:226
void init_dist_paroi_globale(const Conds_lim &conds_lim) override
DoubleVect volumes_entrelaces_
Definition Domaine_VF.h:210
const MD_Vector & md_vector_faces() const
Definition Domaine_VF.h:158
void order_faces(Faces &les_faces)
This method (that may be overriden in various discretisations) is used to order faces according to th...
const MD_Vector & md_vector_aretes() const
Definition Domaine_VF.h:160
DoubleTab xa_
Definition Domaine_VF.h:225
virtual void get_ind_integ_points(IntTab &nelem) const
int nb_faces_bord_tot() const
renvoie le nombre total de faces sur lesquelles sont appliquees les conditions limites :
Definition Domaine_VF.h:641
const DoubleTab & xv() const
Definition Domaine_VF.h:94
const DoubleVect & volumes() const
Definition Domaine_VF.h:121
const DoubleTab & xa() const
Definition Domaine_VF.h:98
double volume_entrelace_axi(double r_face, double r_elem, double axis_length) const
Definition Domaine_VF.h:703
const IntTab & get_face_voisins_dual() const
Definition Domaine_VF.h:195
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
int nb_faces_tot() const
renvoie le nombre total de faces.
Definition Domaine_VF.h:481
void face_voisins_reel_fictif(int face, int &el0, int &elf) const
renvoie dans el0 le numero de l'elt a l'interieur renvoie dans elf le numero de l'elt fictif (-1 si i...
Definition Domaine_VF.h:444
virtual Faces * creer_faces()
renvoie new(Faces) ! elle est surchargee par Domaine_VDF par ex.
double xa(int num_arete, int k) const
Definition Domaine_VF.h:78
double dot(const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
Definition Domaine_VF.h:696
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
void sort_along_zcurve(const Faces &les_faces, IntTab &sort_key) const
Tweak the face sorting keys so that internal faces (=standard faces) follow a Z-curve indexing scheme...
int nb_arete_face() const
renvoie le nombre d'aretes par face.
Definition Domaine_VF.h:503
IntTab face_dual_
For each face f, face_dual_(f, j) returns the element built on the left and right of the face in the ...
Definition Domaine_VF.h:267
DoubleTab xv_
Definition Domaine_VF.h:219
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
int nb_elem_std_
Definition Domaine_VF.h:250
const DoubleTab & volumes_entrelaces_dir() const
Definition Domaine_VF.h:102
IntTab face_sommets_
Definition Domaine_VF.h:223
int nb_faces_internes() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:533
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
virtual double dist_face_elem1_period(int, int, double) const
Definition Domaine_VF.h:185
void infobord()
MD_Vector md_vector_faces_
Definition Domaine_VF.h:229
void discretiser_no_face() override
int nb_faces_std_
Definition Domaine_VF.h:251
virtual void prepare_elem_non_std(Faces &les_faces)
Identify non-standard elements (will be used later to identify non standard faces) Some discretisatio...
int nb_joints() const
Definition Domaine_VF.h:65
int nb_frontiere_dis() const
Definition Domaine_VF.h:111
const Joint & joint(int i) const
Definition Domaine_VF.h:105
ArrOfInt & faces_doubles()
renvoie 1 pour les faces appartenant a un bord perio ou un item commun, 0 par defaut
Definition Domaine_VF.h:567
DoubleTab & xa()
Definition Domaine_VF.h:97
double volumes(int i) const
Definition Domaine_VF.h:113
const DoubleTab & normale_paroi_elem() const
Definition Domaine_VF.h:189
void remplir_face_numero_bord()
virtual void compute_sort_key(Faces &les_faces, IntTab &sort_key)
Generate an IntTab (sort_key) with two columns allowing to sort the faces along a specific order....
virtual int get_max_nb_integ_points() const
virtual double dist_face_elem0_period(int, int, double) const
Definition Domaine_VF.h:184
void creer_tableau_faces_bord(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
DoubleVect inverse_volumes_
Definition Domaine_VF.h:209
const IntTab & get_num_fac_loc() const
Definition Domaine_VF.h:140
Joint & joint(int i)
Definition Domaine_VF.h:106
void discretiser() override
Genere les faces construits les frontieres.
void modifier_pour_Cl(const Conds_lim &) override
DoubleTab & xv()
Definition Domaine_VF.h:93
int numero_sommet_local(int som, int elem) const
Definition Domaine_VF.h:395
void build_mc_dual_mesh() const
Build the dual mesh of the domain for post-processing of face fields.
DoubleTab n_y_elem_
Definition Domaine_VF.h:247
VECT(Front_VF) les_bords_
const ArrOfInt & ind_faces_virt_bord() const
Definition Domaine_VF.h:144
DoubleTab n_y_faces_
Definition Domaine_VF.h:248
IntTab & face_numero_bord()
Definition Domaine_VF.h:81
void construire_face_virt_pe_num()
Remplissage du tableau face_virt_pe_num_ (voir commentaire dans Domaine_VF.
IntTab & elem_faces()
renvoie le tableau de connectivite element/faces
Definition Domaine_VF.h:551
IntTab & face_aretes() override
renvoie le tableau de connectivite faces/aretes.
Definition Domaine_VF.h:607
int get_face_voisins_dual(const int i, const int j) const
Definition Domaine_VF.h:196
ArrOfInt est_face_bord_
Definition Domaine_VF.h:240
virtual void typer_elem(Domaine &)
Definition Domaine_VF.h:61
virtual void get_position(DoubleTab &positions) const
int numero_face_local(int face, int elem) const
virtual double surface(int i) const
Definition Domaine_VF.h:53
const DoubleVect & inverse_volumes() const
Definition Domaine_VF.h:122
int est_une_face_virt_bord(int) const
renvoie 1 si face est une face virtuelle de bord, 0 sinon
Definition Domaine_VF.h:681
virtual double dist_norm(int) const
Definition Domaine_VF.h:180
IntTab num_fac_loc_
Definition Domaine_VF.h:237
int nb_som_face() const
renvoie le nombre de sommets par face.
Definition Domaine_VF.h:494
DoubleVect volumes_
Definition Domaine_VF.h:208
Frontiere_dis_base & frontiere_dis(int) override
renvoie la ieme frontiere_discrete.
Definition Domaine_VF.h:631
DoubleTab normalized_boundaries_outward_vector(int global_face_number, double scale_factor) const
Compute the normalized boundary outward vector associated to the face global_face_number and eventual...
virtual double face_surfaces(int i) const
Definition Domaine_VF.h:52
virtual const IntVect & orientation() const
Definition Domaine_VF.h:646
IntTab face_voisins_
Definition Domaine_VF.h:216
const IntTab & face_virt_pe_num() const
IntTab elem_faces_
Definition Domaine_VF.h:222
const ArrOfInt & est_face_bord() const
Definition Domaine_VF.h:86
DoubleTab xv_bord_
Definition Domaine_VF.h:220
IntTab face_aretes_
Definition Domaine_VF.h:224
const IntTab & face_voisins_fictifs() const
Definition Domaine_VF.h:125
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
DoubleVect & volumes()
Definition Domaine_VF.h:119
ArrOfInt & est_face_bord()
Definition Domaine_VF.h:85
virtual void renumber_faces(Faces &les_faces, IntTab &sort_key)
Re-index faces according to the new order given by 'sort_key'.
std::array< double, 3 > cross(int dima, int dimb, const double *a, const double *b, const double *ma=nullptr, const double *mb=nullptr) const
Definition Domaine_VF.h:711
void calculer_face_surfaces(const DoubleVect &surfaces)
Definition Domaine_VF.h:50
virtual void remplir_face_voisins_fictifs(const Domaine_Cl_dis_base &)
DoubleTab face_normales_
Definition Domaine_VF.h:212
const DoubleTab & normale_paroi_faces() const
Definition Domaine_VF.h:190
virtual int orientation_si_definie(int) const
Definition Domaine_VF.h:654
IntTab face_voisins_fictifs_
Definition Domaine_VF.h:217
DoubleTab & volumes_entrelaces_dir()
Definition Domaine_VF.h:103
int oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
void construire_num_fac_loc()
MD_Vector md_vector_faces_front_
Definition Domaine_VF.h:231
DoubleTab calculer_xgr() const
calcul le tableau xgr pour le calcul des moments des forces aux bords :
int fbord(int f) const
Definition Domaine_VF.h:146
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
virtual const DoubleTab & face_normales() const
Definition Domaine_VF.h:49
MD_Vector md_vector_aretes_
Definition Domaine_VF.h:233
DoubleTab volumes_entrelaces_dir_
Definition Domaine_VF.h:211
DoubleTab & xp()
Definition Domaine_VF.h:95
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
Definition Domaine_VF.h:513
virtual void compute_average_porosity(const DoubleVect &val_source, const DoubleVect &porosity, double &sum, double &volume, const bool basis_function, const int order) const
const DoubleTab & xp() const
Definition Domaine_VF.h:96
const MD_Vector & md_vector_faces_bord() const
Definition Domaine_VF.h:157
virtual void compute_average(const DoubleVect &val_source, double &sum, double &volume, const bool basis_function, const int order) const
virtual double dist_face_elem0(int, int) const
Definition Domaine_VF.h:182
DoubleVect & inverse_volumes()
Definition Domaine_VF.h:120
ArrOfInt faces_doubles_
Definition Domaine_VF.h:239
virtual double dist_norm_bord(int) const
Definition Domaine_VF.h:181
virtual DoubleTab & face_normales()
Definition Domaine_VF.h:48
virtual void get_nb_integ_points(IntTab &nelem) const
const DoubleVect & volumes_entrelaces() const
Definition Domaine_VF.h:100
const Front_VF & front_VF(int i) const
Definition Domaine_VF.h:112
void typer_discretiser_ss_domaine(int i) override
double volumes_entrelaces(int num_face) const
Definition Domaine_VF.h:101
IntTab & face_voisins() override
renvoie le tableaux des volumes des connectivites face elements cf au dessus.
Definition Domaine_VF.h:426
double inverse_volumes(int i) const
Definition Domaine_VF.h:114
void marquer_faces_double_contrib(const Conds_lim &)
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
class Front_VF
Definition Front_VF.h:36
classe Frontiere_dis_base Classe representant une frontiere discretisee.
virtual int get_nb_items_tot() const
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
Definition MD_Vector.h:48
static int dimension
Definition Objet_U.h:99
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455