TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Intersections_Elem_Facettes_Data.h
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 Intersections_Elem_Facettes_Data_included
17#define Intersections_Elem_Facettes_Data_included
18#include <TRUSTTabFT.h>
19// ====================================================================
21{
22public:
23#ifdef AVEC_BUG_SURFACES
24 // Surface de l'intersection facette/element
25 // !!!!! gros bug : en fait, quand on remplit la structure, on y met la fraction
26 // de surface.
27 double surface_intersection_;
28#else
29 // Fraction surface_intersection_facette_element / surface_totale_facette:
31#endif
33 double contrib_barycentre_phase1_[3]; // Coordinate of the barycenter of phase 1 in the cell. En 2D, on a barycentre_phase1_[2] = 0.;
36 // Coordonnees barycentriques du centre de gravite de l'intersection
37 // par rapport aux trois sommets de la facette. On a toujours
38 // barycentre[0] + barycentre[1] + barycentre[2] = 1.
39 // En 2D, on a barycentre_[2] = 0.;
40 double barycentre_[3];
41
42
43 int index_element_suivant_; // -1 si dernier element de la liste
47};
48
49/*! @brief : class Intersections_Elem_Facettes
50 *
51 * Cette classe contient les donnees des intersections entre les facettes
52 * de l'interface et les elements euleriens sous la forme d'une liste
53 * doublement chainee.
54 * Pour parcourir les facettes qui coupent un element "elem", on fait:
55 *
56 * int index=index_elem()[elem];
57 * while (index >= 0) {
58 * const Intersections_Elem_Facettes_Data & data = data_intersection(index);
59 * ... // faire quelque chose avec data
60 * index = data.index_facette_suivante_;
61 * }
62 *
63 * Pour parcourir les elements qui sont coupes par une facette "facette":
64 *
65 * int index=index_facette()[facette];
66 * while (index >= 0) {
67 * const Intersections_Elem_Facettes_Data & data = data_intersection(index);
68 * ... // faire quelque chose avec data
69 * index = data.index_element_suivant_;
70 * }
71 *
72 */
74{
75public:
78 void get_liste_elements_traverses(int num_facette,
79 ArrOfInt& liste_elements) const;
80 void get_liste_facettes_traversantes(int num_element,
81 ArrOfInt& liste_facettes) const;
82 void ajoute_intersection(int num_facette,
83 int num_element,
84 double surface_intersection,
85 double contrib_volume_phase1,
86 double contrib_barycentre_phase1[3],
87 double contrib_aire_faces_phase1[3],
88 double contrib_barycentre_faces_phase1[3][2],
89 double barycentre_u,
90 double barycentre_v,
91 double barycentre_w);
92
93 // A faire avant la premiere utilisation et pour remettre a zero
94 // nb_elements_euleriens doit etre correct.
95 // nb_facettes peut etre une estimation seulement (en pratique lors du
96 // parcours on ne peut pas prevoir le nombre final de facettes)
97 void reset(int nb_elements_euleriens=0, int nb_facettes=0);
98
99 const ArrOfInt& index_elem() const;
100 const ArrOfInt& index_facette() const;
101 inline const Intersections_Elem_Facettes_Data& data_intersection(int index) const;
103
104 //operateur de copie
106
107private:
108 // Tableau de taille "nombre d'elements euleriens"
109 // Pour chaque element, index de l'entree correspondant a la premiere facette
110 // dans data.
111 // -1 si l'element ne contient pas de facette
112 ArrOfIntFT index_elem_facette_;
113 // pour chaque facette, index de l'entree correspondant au premier element
114 // -1 si la facette ne traverse aucun element (facette qui devrait etre effacee)
115 ArrOfIntFT index_facette_element_;
116
117 //
118 // Les donnees : un element par couple facette/element traverse.
119 // (politique d'allocation : on agrandit d'un facteur 2, on ne diminue jamais).
120 int data_allocated_size; // Le nombre d'elements alloues
121 int data_real_size; // Le nombre d'elements reellement utilises
123};
124
125/*! @brief Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index < data_real_size_ )
126 *
127 */
129{
130 assert(index >= 0 && index < data_real_size);
131 return data[index];
132}
133/*! @brief Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index < data_real_size_ )
134 *
135 * ATTENTION A SON UTILISATION !!!
136 *
137 */
139{
140 assert(index >= 0 && index < data_real_size);
141 return data[index];
142}
143#endif
void ajoute_intersection(int num_facette, int num_element, double surface_intersection, double contrib_volume_phase1, double contrib_barycentre_phase1[3], double contrib_aire_faces_phase1[3], double contrib_barycentre_faces_phase1[3][2], double barycentre_u, double barycentre_v, double barycentre_w)
Ajoute une entree a la liste doublement chainee d'intersections entre la facette d'interface num_face...
void reset(int nb_elements_euleriens=0, int nb_facettes=0)
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
void get_liste_elements_traverses(int num_facette, ArrOfInt &liste_elements) const
const ArrOfInt & index_facette() const
Renvoie un tableau de taille "nombre de facettes de l'interface" pour un element 0 <= facette < nb_fa...
const Intersections_Elem_Facettes_Data & data_intersection(int index) const
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
Intersections_Elem_Facettes_Data & get_set_data_intersection(int index)
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
const Intersections_Elem_Facettes & operator=(const Intersections_Elem_Facettes &ief)
operateur de copie
void get_liste_facettes_traversantes(int num_element, ArrOfInt &liste_facettes) const