TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
distances_VEF.h
1/****************************************************************************
2* Copyright (c) 2025, 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 distances_VEF_inclus
17#define distances_VEF_inclus
18#include <Domaine_VEF.h>
19// Kokkos
20KOKKOS_INLINE_FUNCTION
21double distance(int dim,int fac,int elem,CDoubleTabView xp, CDoubleTabView xv, CDoubleTabView face_normale);
22KOKKOS_INLINE_FUNCTION
23double norm_vit1(int dim, CDoubleTabView vit, int fac, int nfac, const int* num, CDoubleTabView face_normale, double* val);
24//double norm_2D_vit1(const DoubleTab& vit,int elem,int num1,int num2,const Domaine_VEF& domaine,double& val1);
25double norm_2D_vit1(const DoubleTab& vit,int elem,int num1,int num2,const Domaine_VEF& domaine,double& val1, double& val2);
26double norm_2D_vit1_lp(const DoubleTab& vit,int elem,int num1,int num2,const Domaine_VEF& domaine,double& val1,double& val2);
27double norm_2D_vit1(const DoubleTab& vit,int elem,int num1,int num2,int num3,const Domaine_VEF& domaine,double& val1);
28double norm_2D_vit1(const DoubleTab& vit,int elem,int num1,int num2,int num3,int num4,const Domaine_VEF& domaine,double& val1);
29//double norm_2D_vit2(const DoubleTab& vit,int elem,int num1,const Domaine_VEF& domaine,double& val1);
30double norm_2D_vit2(const DoubleTab& vit,int elem,int num1,int num2,const Domaine_VEF& domaine,double& val1);
31double norm_2D_vit2(const DoubleTab& vit,int elem,int num1,int num2,int num3,const Domaine_VEF& domaine,double& val1);
32double distance_2D(int fac,int elem,const Domaine_VEF& domaine);
33
34double norm_3D_vit1(const DoubleTab& vit,int elem,int num1,const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
35double norm_3D_vit1(const DoubleTab& vit,int elem,int num1,int num2,int num3,const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
36double norm_3D_vit1(const DoubleTab& vit,int fac,int num1,int num2,int num3,int num4,const Domaine_VEF& domaine,double& val1,double& val2,double& val3);
37//double norm_3D_vit2(const DoubleTab& vit,int elem,int num1,const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
38double norm_3D_vit2(const DoubleTab& vit,int elem,int num1,int num2,int num3,const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
39double norm_3D_vit1_lp(const DoubleTab& vit,int elem,int num1,int num2,int num3,
40 const Domaine_VEF& domaine,
41 double& val1 ,double& val2,double& val3);
42double norm_2D_vit2(const DoubleTab& vit,int elem,int num1,int num2,int num3,int num4,const Domaine_VEF& domaine,double& val1);
43double norm_3D_vit1(const DoubleTab& vit,int elem,int num1,int num2,int num3,int num4,int num5, const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
44double norm_3D_vit2(const DoubleTab& vit,int elem,int num1,int num2,int num3,int num4,int num5, const Domaine_VEF& domaine,double& val1 ,double& val2,double& val3);
45double norm_3D_vit2(const DoubleTab& vit,int fac,int num1,int num2,int num3,int num4,const Domaine_VEF& domaine,double& val1,double& val2,double& val3);
46double distance_3D(int fac,int elem,const Domaine_VEF& domaine);
47double distance_face_elem(int fac,int elem,const Domaine_VEF& domaine);
48double norm_vit_lp_k(const DoubleTab& vit,int face,int face_b,const Domaine_VEF& domaine,ArrOfDouble& val,int is_defilante);
49
50DoubleVect& calcul_longueur_filtre(DoubleVect& longueur_filtre, const Motcle& methode, const Domaine_VEF& domaine);
51double distance_sommets(const int , const int , const Domaine_VEF& );
52double som_pscal(const int , const int , const int , const int , const Domaine_VEF& );
53
54// Fonctions inlinees pour optimisation
55inline double vitesse_tangentielle(const double v0,const double v1,const double r0,const double r1)
56{
57 // On prend std::fabs car mathematiquement la valeur est >=0
58 return sqrt(std::fabs(carre(v0)+carre(v1)-carre(v0*r0+v1*r1)));
59}
60inline double vitesse_tangentielle(const double v0,const double v1,const double v2,const double r0,const double r1,const double r2)
61{
62 // On prend std::fabs car mathematiquement la valeur est >=0
63 return sqrt(std::fabs(carre(v0)+carre(v1)+carre(v2)-carre(v0*r0+v1*r1+v2*r2)));
64}
65
66inline void calcule_r0r1(const DoubleTab& face_normale, int& fac, double& r0, double& r1)
67{
68 r0=face_normale(fac,0);
69 r1=face_normale(fac,1);
70 double tmp=1/sqrt(r0*r0+r1*r1);
71 r0*=tmp;
72 r1*=tmp;
73}
74
75inline void calcule_r0r1r2(const DoubleTab& face_normale, int& fac, double& r0, double& r1, double& r2)
76{
77 r0=face_normale(fac,0);
78 r1=face_normale(fac,1);
79 r2=face_normale(fac,2);
80 double tmp=1/sqrt(r0*r0+r1*r1+r2*r2);
81 r0*=tmp;
82 r1*=tmp;
83 r2*=tmp;
84}
85
86/*!
87 * @brief Calculates the projected distance between the centroids of two faces along the normal of the first face.
88 * @param fac Index of the first face.
89 * @param fac1 Index of the second face.
90 * @param domaine Reference to the Domaine_VEF object containing mesh geometry.
91 * @return The absolute value of the projected distance.
92 */
93inline double distance_face(int fac,int fac1,const Domaine_VEF& domaine)
94{
95 int dimension=Objet_U::dimension;
96 const DoubleTab& xv = domaine.xv(); // centre de gravite des faces
97 const DoubleTab& face_normale = domaine.face_normales();
98 double a = 0;
99 double b = 0;
100 for (int i=0; i<dimension; i++)
101 {
102 double ni = face_normale(fac,i);
103 a += ni * (xv(fac1,i) - xv(fac,i));
104 b += ni * ni;
105 }
106 return std::fabs(a / sqrt(b));
107}
108
109KOKKOS_INLINE_FUNCTION
110double distance_face(int dim, int fac, int fac1, CDoubleTabView xv, CDoubleTabView face_normale)
111{
112 double a = 0;
113 double b = 0;
114 for (int i=0; i<dim; i++)
115 {
116 double ni = face_normale(fac,i);
117 a += ni * (xv(fac1,i) - xv(fac,i));
118 b += ni * ni;
119 }
120 return std::fabs(a / sqrt(b));
121}
122
123// Kokkos function (factorize distance_2D and distance_3D functions)
124KOKKOS_INLINE_FUNCTION
125double distance(int dim,int fac,int elem, CDoubleTabView xp, CDoubleTabView xv, CDoubleTabView face_normale)
126{
127 double norme=0;
128 double ps=0;
129 for (int i=0; i<dim; i++)
130 {
131 double fn_i = face_normale(fac, i);
132 norme += fn_i * fn_i;
133 ps += fn_i * (xp(elem, i) - xv(fac, i));
134 }
135 return std::fabs(ps/sqrt(norme));
136}
137// Kokkos function (factorize norm_2D_vit1 and norm_3D_vit1)
138KOKKOS_INLINE_FUNCTION
139double norm_vit1(int dim, CDoubleTabView vit, int fac, int nfac, const int* num,
140 CDoubleTabView face_normale,
141 double* val)
142{
143 // fac numero de la face a paroi fixe
144 double r[3];
145 double norme = 0;
146 for (int i=0; i<dim; i++)
147 {
148 r[i] = face_normale(fac, i);
149 norme += r[i] * r[i];
150 }
151 norme = sqrt(norme);
152 for(int i = 0; i < dim; i++)
153 r[i] /= norme;
154
155 double v[3];
156 for (int i=0; i<dim; i++)
157 {
158 v[i] = 0;
159 for (int j = 0; j < dim; j++)
160 v[i] += vit(num[j], i);
161 v[i] /= nfac;
162 }
163
164 double sum_carre=0;
165 double psc=0;
166 for (int i=0; i<dim; i++)
167 {
168 sum_carre += carre(v[i]);
169 psc += v[i] * r[i];
170 }
171 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
172
173 // val1,val2 val3 sont les vitesses tangentielles
174 for (int i=0; i<dim; i++)
175 val[i]=(v[i] - psc*r[i])/(norm_vit + DMINFLOAT);
176
177 return norm_vit;
178}
179
180KOKKOS_INLINE_FUNCTION
181double norm_vit1_lp(int dim, CDoubleTabView vit, int fac, int nfac, const int* num,
182 CDoubleTabView face_normale,
183 double* val)
184{
185 // fac numero de la face a paroi fixe
186 double r[3];
187 double norme = 0;
188 for (int i=0; i<dim; i++)
189 {
190 r[i] = face_normale(fac, i);
191 norme += r[i] * r[i];
192 }
193 norme = sqrt(norme);
194 for(int i = 0; i < dim; i++)
195 r[i] /= norme;
196
197 double v[3];
198 for (int i=0; i<dim; i++)
199 {
200 v[i] = 0;
201 for (int j = 0; j < dim; j++)
202 v[i] += vit(num[j], i);
203 v[i] /= dim;
204 }
205
206 double sum_carre=0;
207 double psc=0;
208 for (int i=0; i<dim; i++)
209 {
210 sum_carre += carre(v[i]);
211 psc += v[i] * r[i];
212 }
213 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
214
215 // val1,val2 val3 sont les vitesses tangentielles
216 for (int i=0; i<dim; i++)
217 val[i]=(v[i] - psc*r[i])/(norm_vit + DMINFLOAT);
218
219 return norm_vit;
220}
221
222KOKKOS_INLINE_FUNCTION
223double norm_vit_lp_k(int dim, CDoubleTabView vit, int num1, int fac, CDoubleTabView face_normale, double* val, int is_defilante)
224{
225 // fac numero de la face paroi
226 double r[3];
227 double norme = 0;
228 for (int i=0; i<dim; i++)
229 {
230 r[i] = face_normale(fac, i);
231 norme += r[i] * r[i];
232 }
233 norme = sqrt(norme);
234 for(int i = 0; i < dim; i++)
235 r[i] /= norme;
236
237 double v[3];
238 for (int i=0; i<dim; i++)
239 v[i] = vit(num1, i) - is_defilante * vit(fac, i);
240
241 double sum_carre=0;
242 double psc=0;
243 for (int i=0; i<dim; i++)
244 {
245 sum_carre += carre(v[i]);
246 psc += v[i] * r[i];
247 }
248 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
249
250 // val1,val2 val3 sont les vitesses tangentielles
251 for (int i=0; i<dim; i++)
252 val[i] = (v[i]-psc*r[i])/(norm_vit+DMINFLOAT);
253 return norm_vit;
254}
255// ToDo factorize norm_vit1, norm_vit1_lp, norm_vit_lp_k ?
256
257#endif
class Domaine_VEF
Definition Domaine_VEF.h:54
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
static int dimension
Definition Objet_U.h:99