TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Triangle.cpp
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#include <Triangle.h>
17#include <Domaine.h>
18
19Implemente_instanciable_32_64(Triangle_32_64,"Triangle",Elem_geom_base_32_64<_T_>);
20
21/*! @brief des faces du triangle de reference: 3 faces de deux sommets.
22 *
23 * La face i est la face opposee au sommet i
24 * (voir get_tab_faces_sommets_locaux)
25 *
26 */
27static int faces_sommets_triangle[3][2] =
28{
29 { 1, 2 },
30 { 2, 0 },
31 { 0, 1 }
32};
33
34template <typename _SIZE_>
36{
37 return s;
38}
39
40template <typename _SIZE_>
42{
43 return s;
44}
45
46
47/*! @brief Renvoie le nom LML d'un triangle = "PRISM6".
48 *
49 * @return (Nom&) toujours egal a "PRISM6"
50 */
51template <typename _SIZE_>
53{
54 static Nom nom="PRISM6";
55 if (dimension==3) nom="TRIANGLE_3D";
56 return nom;
57}
58
59
60/*! @brief Renvoie 1 si l'element ielem du domaine associe a l'element geometrique contient le point
61 *
62 * de coordonnees specifiees par le parametre "pos".
63 * Renvoie 0 sinon.
64 *
65 * @param (DoubleVect& pos) coordonnees du point que l'on cherche a localiser
66 * @param (int ielem) le numero de l'element du domaine dans lequel on cherche le point.
67 * @return (int) 1 si le point de coordonnees specifiees appartient a l'element ielem 0 sinon
68 */
69template <typename _SIZE_>
70int Triangle_32_64<_SIZE_>::contient(const ArrOfDouble& pos, int_t ielem) const
71{
72 assert(pos.size_array()==2);
73 const Domaine_t& dom=this->mon_dom.valeur();
74 assert(ielem<dom.nb_elem_tot());
75 int_t som0 = dom.sommet_elem(ielem,0);
76 int_t som1 = dom.sommet_elem(ielem,1);
77 int_t som2 = dom.sommet_elem(ielem,2);
78 assert((som0>=0) && (som0<dom.nb_som_tot()));
79 assert((som1>=0) && (som1<dom.nb_som_tot()));
80 assert((som2>=0) && (som2<dom.nb_som_tot()));
81 double prod,p0,p1,p2;
82
83 // On regarde tout d'abord si le point cherche n'est pas un des
84 // sommets du triangle
85 // GF on retire le test pour etre coherent avec tetraedre contient et pour eviter des erreurs dans Champ_implementation_P1::form_function, ou il n'y a pas ce test
86 /*
87 if( (est_egal(dom.coord(som0,0),pos(0)) && est_egal(dom.coord(som0,1),pos(1)))
88 || (est_egal(dom.coord(som1,0),pos(0)) && est_egal(dom.coord(som1,1),pos(1)))
89 || (est_egal(dom.coord(som2,0),pos(0)) && est_egal(dom.coord(som2,1),pos(1))) )
90 return 1;
91
92 */
93 // Attention les sommets sont ranges de facon quelconque.
94 // Il faut donc determiner le sens (trigo ou anti trigo) pour la numerotation :
95 // Calcul de prod = 01 vectoriel 02 selon z
96 // prod > 0 : sens trigo
97 // prod < 0 : sens anti trigo
98 prod = (dom.coord(som1,0)-dom.coord(som0,0))*(dom.coord(som2,1)-dom.coord(som0,1))
99 - (dom.coord(som1,1)-dom.coord(som0,1))*(dom.coord(som2,0)-dom.coord(som0,0));
100 double signe;
101 if (prod >= 0)
102 signe = 1;
103 else
104 signe = -1;
105 // Calcul de p0 = 0M vectoriel 1M selon z
106 p0 = (pos[0]-dom.coord(som0,0))*(pos[1]-dom.coord(som1,1))
107 - (pos[1]-dom.coord(som0,1))*(pos[0]-dom.coord(som1,0));
108 p0 *= signe;
109 // Calcul de p1 = 1M vectoriel 2M selon z
110 p1 = (pos[0]-dom.coord(som1,0))*(pos[1]-dom.coord(som2,1))
111 - (pos[1]-dom.coord(som1,1))*(pos[0]-dom.coord(som2,0));
112 p1 *= signe;
113 // Calcul de p2 = 2M vectoriel 0M selon z
114 p2 = (pos[0]-dom.coord(som2,0))*(pos[1]-dom.coord(som0,1))
115 - (pos[1]-dom.coord(som2,1))*(pos[0]-dom.coord(som0,0));
116 p2 *= signe;
117 double epsilon=std::fabs(prod)*Objet_U::precision_geom;
118 if ((p0>-epsilon) && (p1>-epsilon) && (p2>-epsilon))
119 return 1;
120 else
121 return 0;
122}
123
124
125/*! @brief Renvoie 1 si les sommets specifies par le parametre "pos" sont les sommets de l'element "element" du domaine associe a
126 *
127 * l'element geometrique.
128 *
129 * @param (IntVect& pos) les numeros des sommets a comparer avec ceux de l'elements "element"
130 * @param (int element) le numero de l'element du domaine dont on veut comparer les sommets
131 * @return (int) 1 si les sommets passes en parametre sont ceux de l'element specifie, 0 sinon
132 */
133template <typename _SIZE_>
135{
136 const Domaine_t& domaine=this->mon_dom.valeur();
137 if((domaine.sommet_elem(element,0)==som[0])&&
138 (domaine.sommet_elem(element,1)==som[1])&&
139 (domaine.sommet_elem(element,2)==som[2]))
140 return 1;
141 else
142 return 0;
143}
144
145/*! @brief Calcule les volumes des elements du domaine associe.
146 *
147 * @param (DoubleVect& volumes) le vecteur contenant les valeurs des des volumes des elements du domaine
148 */
149template <typename _SIZE_>
151{
152 const Domaine_t& domaine=this->mon_dom.valeur();
153 const DoubleTab_t& coord = domaine.coord_sommets();
154 DoubleTab pos(3,dimension);
155 int_t size_tot = domaine.nb_elem_tot();
156 assert(volumes.size_totale()==size_tot);
157 for (int_t num_poly=0; num_poly<size_tot; num_poly++)
158 {
159 for (int i=0; i<3; i++)
160 {
161 int_t Si = domaine.sommet_elem(num_poly,i);
162 for (int j=0; j<dimension; j++)
163 pos(i,j) = coord(Si,j);
164 }
165 volumes[num_poly] = aire_triangle(pos);
166 }
167}
168
169/*! @brief Calcule les normales aux faces des elements du domaine associe.
170 *
171 * @param (IntTab& face_sommets) les numeros des sommets des faces dans la liste des sommets du domaine associe
172 * @param (DoubleTab& face_normales)
173 */
174template <typename _SIZE_>
175void Triangle_32_64<_SIZE_>::calculer_normales(const IntTab_t& Face_sommets, DoubleTab_t& face_normales) const
176{
177 const Domaine_t& domaine_geom = this->mon_dom.valeur();
178 const DoubleTab_t& les_coords = domaine_geom.coord_sommets();
179 int_t nbfaces = Face_sommets.dimension(0);
180 double x1,y1;
181 int_t n0,n1;
182 for (int_t numface=0; numface<nbfaces; numface++)
183 {
184 n0 = Face_sommets(numface,0);
185 n1 = Face_sommets(numface,1);
186 x1 = les_coords(n0,0)-les_coords(n1,0);
187 y1 = les_coords(n0,1)-les_coords(n1,1);
188 face_normales(numface,0) = -y1;
189 face_normales(numface,1) = x1;
190 }
191}
192
193/*! @brief voir ElemGeomBase::get_tab_faces_sommets_locaux
194 *
195 */
196template <typename _SIZE_>
198{
199 faces_som_local.resize(3,2);
200 for (int i=0; i<3; i++)
201 for (int j=0; j<2; j++)
202 faces_som_local(i,j) = faces_sommets_triangle[i][j];
203 return 1;
204}
205
206
207template class Triangle_32_64<int>;
208#if INT_is_64_ == 2
209template class Triangle_32_64<trustIdType>;
210#endif
211
int_t nb_elem_tot() const
Definition Domaine.h:132
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
Definition Domaine.h:123
double coord(int_t i, int j) const
Definition Domaine.h:110
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme element.
Definition Domaine.h:136
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
static double precision_geom
Definition Objet_U.h:86
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61
Classe Triangle Cette classe represente l'element geometrique Triangle.
Definition Triangle.h:31
Domaine_32_64< _SIZE_ > Domaine_t
Definition Triangle.h:42
SmallArrOfTID_T< _SIZE_ > SmallArrOfTID_t
Definition Triangle.h:39
IntTab_T< _SIZE_ > IntTab_t
Definition Triangle.h:38
static int dimension
Definition Objet_U.h:99
int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const override
voir ElemGeomBase::get_tab_faces_sommets_locaux
Definition Triangle.cpp:197
DoubleVect_T< _SIZE_ > DoubleVect_t
Definition Triangle.h:40
DoubleTab_T< _SIZE_ > DoubleTab_t
Definition Triangle.h:41
void calculer_normales(const IntTab_t &faces_sommets, DoubleTab_t &face_normales) const override
Calcule les normales aux faces des elements du domaine associe.
Definition Triangle.cpp:175
void calculer_volumes(DoubleVect_t &vols) const override
Calcule les volumes des elements du domaine associe.
Definition Triangle.cpp:150
_SIZE_ int_t
Definition Triangle.h:37
int contient(const ArrOfDouble &pos, int_t elem) const override
Renvoie 1 si l'element ielem du domaine associe a l'element geometrique contient le point.
Definition Triangle.cpp:70
const Nom & nom_lml() const override
Renvoie le nom LML d'un triangle = "PRISM6".
Definition Triangle.cpp:52