TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Elem_geom_base.cpp
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#include <Elem_geom_base.h>
17#include <Domaine.h>
18
19Implemente_base_32_64(Elem_geom_base_32_64,"Elem_geom_base",Objet_U);
20
21/*! @brief NE FAIT RIEN
22 *
23 * @param (Sortie& s) un flot de sortie
24 * @return (Sortie&) le flot de sortie
25 */
26template<class _SIZE_>
28{
29 return s;
30}
31
32/*! @brief NE FAIT RIEN
33 *
34 * @param (Entree& s) un flot d'entree
35 * @return (Entree&) le flot d'entree
36 */
37template<class _SIZE_>
39{
40 return s;
41}
42
43
44/*! @brief Renvoie le parametre face si le type de face specifie est le meme que celui de l'element geometrique.
45 *
46 * @param (int face)
47 * @param (Type_Face& type) un type de face
48 * @throws mauvais type de face specifie
49 */
50template <typename _SIZE_>
51int Elem_geom_base_32_64<_SIZE_>::num_face(int face, Type_Face& type) const
52{
53 assert(type==type_face());
54 return face;
55}
56
57/*! @brief Cree les faces de l'element geometrique specifie du domaine en precisant le type de face a creer.
58 *
59 * @param (Faces_t& les_faces) les faces a creer
60 * @param (int num_elem) le numero de l'element dont on veut creer les faces
61 * @param (Type_Face type) le type de face a creer
62 */
63template <typename _SIZE_>
65 _SIZE_ num_elem,
66 Type_Face type) const
67{
68 int type_id=0;
69 for(; ((type_id<nb_type_face())
70 &&(type!=type_face(type_id))); type_id++)
71 ;
72 const IntTab_t& les_Polys = mon_dom->les_elems();
73 assert(les_Polys.dimension_tot(0) > num_elem);
74 int face, i;
75 les_faces.dimensionner(nb_faces(type_id));
76 les_faces.associer_domaine(mon_dom.valeur());
77
78 for(face=0; face<nb_faces(type_id); face++)
79 {
80 int face_id=num_face(face, type);
81 for (i=0; i<nb_som_face(type_id); i++)
82 les_faces.sommet(face_id,i) = les_Polys(num_elem,face_sommet(face_id, i));
83 les_faces.completer(face_id, num_elem);
84 }
85}
86
87
88/*! @brief Calcule les centres de gravites de tous les elements du domaine associe a l'element goemetrique.
89 *
90 * @param (DoubleTab& xp) le tableau contenant les coordonnees des centres de gravite
91 */
92template <typename _SIZE_>
94{
95 int_t nb_elem;
96 if(tab_xp.dimension(0)==0)
97 {
98 nb_elem = mon_dom->nb_elem_tot();
99 tab_xp.resize(nb_elem,dimension);
100 }
101 else
102 nb_elem=tab_xp.dimension(0);
103
104 int nb_som_elem = nb_som();
105 int dim = Objet_U::dimension;
106 // ToDo create a type in View_Types.h ?
107 ConstView<_SIZE_,2> les_Polys = mon_dom->les_elems().view_ro();
108 //CIntTabView les_Polys = mon_dom->les_elems().view_ro();
109 CDoubleTabView coord = mon_dom->coord_sommets().view_ro();
110 DoubleTabView xp = tab_xp.view_wo();
111 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(const int_t num_elem)
112 {
113 for (int i = 0; i < dim; i++)
114 xp(num_elem, i) = 0;
115 int nb_som_reel = nb_som_elem;
116 while (les_Polys(num_elem, nb_som_reel - 1) == -1) nb_som_reel--;
117 for (int s = 0; s < nb_som_reel; s++)
118 {
119 int_t num_som = les_Polys(num_elem, s);
120 for (int i = 0; i < dim; i++)
121 xp(num_elem, i) += coord(num_som, i) / nb_som_reel;
122 }
123 });
124 end_gpu_timer(__KERNEL_NAME__);
125}
126
127/*! @brief Sort en erreur.
128 *
129 * Cette methode n'est pas virtuelle pure pour des raisons de commodite
130 *
131 * @param (DoubleTab& xp) le tableau contenant les coordonnees des centres de gravite
132 */
133template <typename _SIZE_>
134void Elem_geom_base_32_64<_SIZE_>::calculer_normales(const IntTab_t& faces_sommets , DoubleTab_t& face_normales) const
135{
136 Cerr << "calculer_normales method is not coded for an element " << finl;
137 Cerr << "of type que_suis_je() " << finl;
138 exit();
139}
140
141/*! @brief Renvoie le nombre de type de face de l'element geometrique.
142 *
143 * Par exemple un prisme (Classe Prisme)
144 * a 2 types de faces: un triangle ou un quadrangle.
145 *
146 * @return (int) renvoie toujours 1
147 */
148template <typename _SIZE_>
150{
151 return 1;
152}
153
154/*! @brief remplit le tableau faces_som_local(i,j) qui donne pour 0 <= i < nb_faces() et 0 <= j < nb_som_face(i) le numero local du sommet
155 *
156 * sur l'element.
157 * On a 0 <= faces_sommets_locaux(i,j) < nb_som()
158 * Si toutes les faces de l'element n'ont pas le meme nombre de sommets, le nombre
159 * de colonnes du tableau est le plus grand nombre de sommets, et les cases inutilisees
160 * du tableau sont mises a -1
161 * On renvoie 1 si toutes les faces ont le meme nombre d'elements, 0 sinon.
162 */
163template <typename _SIZE_>
165{
166 Cerr << "Elem_geom_base::faces_sommets_locaux : error.\n"
167 << " Method not implemented for the object "
168 << que_suis_je() << finl;
169 exit();
170 return 0;
171}
172
173/*! @brief idem que Elem_geom_base::get_tab_faces_sommets_locaux mais pour les aretes: aretes_som_local.
174 *
175 * dimension(0) = nombre d'aretes sur l'element de reference
176 * aretes_som_local.dimension(1) = 2 (nombre de sommets par arete)
177 * aretes_som_local(i,j) = numero d'un sommet de l'element (0 <= n < nb_sommets_par_element)
178 *
179 */
180template <typename _SIZE_>
182{
183 Cerr << "Elem_geom_base::aretes_sommets_locaux : error.\n"
184 << " Method not implemented for the object "
185 << que_suis_je() << finl;
186 exit();
187}
188
189
190template class Elem_geom_base_32_64<int>;
191#if INT_is_64_ == 2
193#endif
194
Classe Elem_geom_base Cette classe est la classe de base pour la definition d'elements.
virtual int face_sommet(int i, int j) const =0
Renvoie le numero du j-ieme sommet de la i-ieme face de l'element.
virtual void calculer_normales(const IntTab_t &faces_sommets, DoubleTab_t &face_normales) const
Sort en erreur.
Faces_32_64< _SIZE_ > Faces_t
virtual int num_face(int face, Type_Face &type) const
Renvoie le parametre face si le type de face specifie est le meme que celui de l'element geometrique.
virtual void calculer_centres_gravite(DoubleTab_t &) const
Compute all centers of mass of all elements in the domain.
DoubleTab_T< _SIZE_ > DoubleTab_t
virtual Type_Face type_face(int face_typ=0) const =0
Type of the face of the element - face_typ < nb_type_face().
virtual void creer_faces_elem(Faces_t &, int_t, Type_Face) const
Cree les faces de l'element geometrique specifie du domaine en precisant le type de face a creer.
virtual int nb_type_face() const
Nb of face types of the elemnt (for example 2 for a prism).
virtual int nb_som_face(int=0) const =0
Nb of vertices for one face of the element.
virtual int nb_faces(int=0) const =0
Nb of faces for the element.
virtual int nb_som() const =0
Nb of vertices for the element.
IntTab_T< _SIZE_ > IntTab_t
virtual void get_tab_aretes_sommets_locaux(IntTab &aretes_som_local) const
idem que Elem_geom_base::get_tab_faces_sommets_locaux mais pour les aretes: aretes_som_local.
virtual int get_tab_faces_sommets_locaux(IntTab &faces_som_local) const
remplit le tableau faces_som_local(i,j) qui donne pour 0 <= i < nb_faces() et 0 <= j < nb_som_face(i)...
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void associer_domaine(const Domaine_t &z)
Definition Faces.h:94
void completer(int_t face, int_t num_elem)
Complete la face specifie: met a jour ses voisins.
Definition Faces.cpp:466
int_t dimensionner(int_t)
(Re-)dimensionne les faces On redimensionne les voisins en consequence.
Definition Faces.cpp:344
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
Definition Faces.h:130
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
Definition TRUSTTab.h:276
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133