TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Op_Curl_VEFP1B.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <Op_Curl_VEFP1B.h>
17#include <Domaine_Cl_VEF.h>
18#include <Domaine_VEF.h>
19
20Implemente_instanciable(Op_Curl_VEFP1B, "Op_Curl_VEFPreP1B_P1NC", Operateur_base);
21
22Sortie& Op_Curl_VEFP1B::printOn(Sortie& s) const { return s << que_suis_je(); }
23Entree& Op_Curl_VEFP1B::readOn(Entree& is) { return is; }
24
25inline void add_curl_som(int nps, int sommet, int face, double flux, DoubleTab& curl, const Domaine& domaine)
26{
27 curl(nps + domaine.get_renum_som_perio(sommet)) += flux;
28}
29
30inline void traiter_flux(DoubleTab& curl, double flux, int element1, int element2, int npe)
31{
32 curl(npe + element1) += flux;
33 curl(npe + element2) -= flux;
34}
35
36void Op_Curl_VEFP1B::associer(const Domaine_dis_base& domaine_dis, const Domaine_Cl_dis_base& domaine_Cl_dis, const Champ_Inc_base& inco)
37{
38 le_dom_vef = ref_cast(Domaine_VEF, domaine_dis);
39 la_zcl_vef = ref_cast(Domaine_Cl_VEF, domaine_Cl_dis);
41}
42
43DoubleTab& Op_Curl_VEFP1B::calculer(const DoubleTab& vitesse, DoubleTab& curl) const
44{
45 curl = 0;
46 return ajouter(vitesse, curl);
47}
48
49DoubleTab& Op_Curl_VEFP1B::ajouter(const DoubleTab& vitesse, DoubleTab& curl) const
50{
51 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
52 const Domaine& domaine = domaine_VEF.domaine();
53 //int prems=domaine_VEF.premiere_face_int();
54 if (dimension != 2)
55 {
56 Cerr << "Pour l'instant seule la 2D est etudiee. " << finl;
58 }
59
60 int face0 = 0, face1 = 0, face2 = 0;
61 int numero_triangle = 0;
62 int face_globale = 0, face_opp = 0;
63
64 DoubleTab vecteur_normal0(dimension);
65 DoubleTab vecteur_normal1(dimension);
66 DoubleTab vecteur_normal2(dimension);
67
68 // On traite les faces internes i.e. sans conditions aux limites
69 // ATTENTION: la base de la vorticite c'est: l'ensemble des
70 // fonctions indicatrices des elements + l'ensemble des fonctions
71 // chapeaux du P1 moins la derniere de ces fonctions de forme
72
73 //Partie P0 de la vorticite
74 for (int numero_elem = 0; numero_elem < domaine.nb_elem(); numero_elem++)
75 {
76
77 //REM: on peut generaliser cette partie a la 3D en
78 //faisant une boucle avec domaine.nb_faces_element()
79
80 //Il nous faut d'abord les numeros des 3 faces
81 //qui appartiennent a cet element K
82 face0 = domaine_VEF.elem_faces(numero_elem, 0);
83 face1 = domaine_VEF.elem_faces(numero_elem, 1);
84 face2 = domaine_VEF.elem_faces(numero_elem, 2);
85
86 //Ensuite, il nous faut les vecteurs tangents de
87 //ces trois faces.
88 vecteur_normal0 = vecteur_normal(face0, numero_elem);
89 vecteur_normal1 = vecteur_normal(face1, numero_elem);
90 vecteur_normal2 = vecteur_normal(face2, numero_elem);
91
92 int modulo;
93 for (int composante = 0; composante < dimension; composante++)
94 {
95 //La partie P0 a ete teste avec les fonctions (1,0);
96 //(0,1);(x,0) et (0,x).
97 //Tous les resultats sont corrects
98
99 modulo = (composante + 1) % 2;
100 curl(numero_elem) += pow(-1., modulo)
101 * (vitesse(face0, composante) * vecteur_normal0(modulo) + vitesse(face1, composante) * vecteur_normal1(modulo) + vitesse(face2, composante) * vecteur_normal2(modulo));
102
103 }
104
105// Cerr << "Element curl(" << numero_elem << ") " << curl(numero_elem) << finl;
106 }
107
108 //Partie P1 de la vorticite
109
110 for (int numero_som = 0; numero_som < domaine.nb_som() - 1; numero_som++)
111 {
112 for (int num_loc_elem = 0; num_loc_elem < elem_som_size(numero_som); num_loc_elem++)
113
114 {
115 // for num_loc_elem
116
117 //On recupere le numero global du triangle
118 numero_triangle = elements_pour_sommet(numero_som, num_loc_elem);
119
120 //On recupere le numero global de la face opposee a "numero_som"
121 //dans le triangle "numero_triangle"
122 face_opp = domaine_VEF.numero_sommet_local(numero_som, numero_triangle);
123 face_opp = domaine_VEF.elem_faces(numero_triangle, face_opp);
124
125 //On recupere le vecteur normal de cette face opposee.
126 vecteur_normal1 = vecteur_normal(face_opp, numero_triangle);
127
128 for (int num_loc_face = 0; num_loc_face < domaine.nb_faces_elem(); num_loc_face++)
129
130 {
131 // for num_loc_face
132
133 //On recupere le numero global de la face "num_loc_face"
134 face_globale = domaine_VEF.elem_faces(numero_triangle, num_loc_face);
135
136 // //Si "face_globale" est une arete interne alors on effectue le bon
137 // //traitement
138 // if (face_globale >= domaine_VEF.premiere_face_int() )
139 {
140 //On calcule les vecteurs normaux associes a ces faces.
141 vecteur_normal0 = vecteur_normal(face_globale, numero_triangle);
142
143 //Enfin on calcule la contribution au curl de chacune de
144 //ces faces pour chacun des 2 triangles.
145 int modulo;
146 for (int composante = 0; composante < dimension; composante++)
147 {
148 //Partie P1 teste avec les fonctions (1,0);(0,1)
149 //(x,0) et (0,x).
150 //Tous les tests sont corrects
151
152 modulo = (composante + 1) % 2;
153
154 //Partie (lambda_s,curl u)
155 curl(domaine.nb_elem() + numero_som) += -pow(-1., modulo) * 1. / (dimension + 1) * vitesse(face_globale, composante) * vecteur_normal0(modulo);
156
157 //Partie (rot lambda_s, u)
158 curl(domaine.nb_elem() + numero_som) += pow(-1., modulo) * 1. / (dimension * (dimension + 1)) * vitesse(face_globale, composante) * vecteur_normal1(modulo);
159 }
160
161 } // fin du if
162
163 } // fin du for num_loc_face
164
165 /* Pour le moment, on ne travaille que sur des vitesse H10 */
166 /* C'est le travail de these */
167 /* Par consequent, inutile de traiter les faces du bord */
168
169 } // fin du for num_loc_elem
170
171 Cerr << "Sommet curl(" << numero_som << ") " << curl(domaine.nb_elem() + numero_som) << finl;
172
173 } // fin du for sur les sommets
174
175 Cerr << "je sors de OpCurl" << finl;
176
177 return curl;
178}
179
180DoubleTab Op_Curl_VEFP1B::vecteur_normal(const int face, const int elem) const
181{
182 assert(dimension == 2);
183
184 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
185 DoubleTab le_vecteur_normal(dimension);
186
187 for (int composante = 0; composante < dimension; composante++)
188
189 le_vecteur_normal(composante) = domaine_VEF.face_normales(face, composante) * domaine_VEF.oriente_normale(face, elem);
190
191 return le_vecteur_normal;
192}
193
194// Tableau qui stocke a la place "i", tous les elements du maillage qui contiennent le sommet de numero global "i"
196{
197 const Domaine& domaine = le_dom_vef->domaine();
198 int numero_global_som;
199 elements_pour_sommet_.dimensionner(domaine.nb_som());
200
201 for (int numero_elem = 0; numero_elem < domaine.nb_elem(); numero_elem++)
202 for (int numero_som_loc = 0; numero_som_loc < domaine.nb_som_elem(); numero_som_loc++)
203 {
204 numero_global_som = domaine.sommet_elem(numero_elem, numero_som_loc);
205 elements_pour_sommet_[numero_global_som].add_if_not(numero_elem);
206 }
207
208 return 1;
209}
210
211// Fonction qui renvoie le numero global de l'element qui contient "sommet" et qui est situe a la place "indice" de la liste "elements_pour_sommet_"
212int Op_Curl_VEFP1B::elements_pour_sommet(const int sommet, const int indice) const
213{
214 return elements_pour_sommet_[sommet][indice];
215}
216
217// Fonction qui renvoie la taille de la liste situe a l'emplacement "sommet" du tableau "elements_pour_sommet_"
218int Op_Curl_VEFP1B::elem_som_size(const int sommet) const
219{
220 return elements_pour_sommet_[sommet].size();
221}
Classe Champ_Inc_base.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VEF
Definition Domaine_VEF.h:54
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
int numero_sommet_local(int som, int elem) const
Definition Domaine_VF.h:395
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
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
DoubleTab vecteur_normal(const int face, const int elem) const
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
int elem_som_size(const int sommet) const
IntLists elements_pour_sommet_
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
classe Operateur_base Classe est la base de la hierarchie des objets representant un
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