48 #ifndef Intrepid2_Intrepid2_PyramidCoords_h
49 #define Intrepid2_Intrepid2_PyramidCoords_h
51 #include <Kokkos_DynRankView.hpp>
53 #include <Intrepid2_config.h>
58 template<
class Po
intScalar>
59 KOKKOS_INLINE_FUNCTION
60 void affinePyramid(Kokkos::Array<PointScalar,5> &lambda,
61 Kokkos::Array<Kokkos::Array<PointScalar,3>,5> &lambdaGrad,
62 Kokkos::Array<Kokkos::Array<PointScalar,3>,2> &mu,
63 Kokkos::Array<Kokkos::Array<Kokkos::Array<PointScalar,3>,3>,2> &muGrad,
64 Kokkos::Array<Kokkos::Array<PointScalar,2>,3> &nu,
65 Kokkos::Array<Kokkos::Array<Kokkos::Array<PointScalar,3>,2>,3> &nuGrad,
66 Kokkos::Array<PointScalar,3> &coords)
68 const auto & x = coords[0];
69 const auto & y = coords[1];
70 const auto & z = coords[2];
71 nu[0][0] = 1. - x - z;
72 nu[0][1] = 1. - y - z;
78 nuGrad[0][0][0] = -1. ;
79 nuGrad[0][0][1] = 0. ;
80 nuGrad[0][0][2] = -1. ;
82 nuGrad[0][1][0] = 0. ;
83 nuGrad[0][1][1] = -1. ;
84 nuGrad[0][1][2] = -1. ;
86 nuGrad[1][0][0] = 1. ;
87 nuGrad[1][0][1] = 0. ;
88 nuGrad[1][0][2] = 0. ;
90 nuGrad[1][1][0] = 0. ;
91 nuGrad[1][1][1] = 1. ;
92 nuGrad[1][1][2] = 0. ;
94 nuGrad[2][0][0] = 0. ;
95 nuGrad[2][0][1] = 0. ;
96 nuGrad[2][0][2] = 1. ;
98 nuGrad[2][1][0] = 0. ;
99 nuGrad[2][1][1] = 0. ;
100 nuGrad[2][1][2] = 1. ;
103 auto & muZ_0 = mu[0][2];
104 auto & muZ_1 = mu[1][2];
105 const double epsilon = 1e-12;
106 muZ_0 = (fabs(1.-z) > epsilon) ? 1. - z : epsilon;
107 muZ_1 = (fabs(1.-z) > epsilon) ? z : 1. - epsilon;
108 PointScalar scaling = 1. / muZ_0;
109 mu[0][0] = 1. - x * scaling;
110 mu[0][1] = 1. - y * scaling;
111 mu[1][0] = x * scaling;
112 mu[1][1] = y * scaling;
114 PointScalar scaling2 = scaling * scaling;
115 muGrad[0][0][0] = -scaling ;
116 muGrad[0][0][1] = 0. ;
117 muGrad[0][0][2] = - x * scaling2;
119 muGrad[0][1][0] = 0. ;
120 muGrad[0][1][1] = -scaling ;
121 muGrad[0][1][2] = -y * scaling2;
123 muGrad[0][2][0] = 0. ;
124 muGrad[0][2][1] = 0. ;
125 muGrad[0][2][2] = -1. ;
127 muGrad[1][0][0] = scaling ;
128 muGrad[1][0][1] = 0. ;
129 muGrad[1][0][2] = x * scaling2;
131 muGrad[1][1][0] = 0. ;
132 muGrad[1][1][1] = scaling ;
133 muGrad[1][1][2] = y * scaling2;
135 muGrad[1][2][0] = 0. ;
136 muGrad[1][2][1] = 0. ;
137 muGrad[1][2][2] = 1. ;
139 lambda[0] = nu[0][0] * mu[0][1];
140 lambda[1] = nu[0][1] * mu[1][0];
141 lambda[2] = nu[1][0] * mu[1][1];
142 lambda[3] = nu[1][1] * mu[0][0];
145 for (
int d=0; d<3; d++)
147 lambdaGrad[0][d] = nu[0][0] * muGrad[0][1][d] + nuGrad[0][0][d] * mu[0][1];
148 lambdaGrad[1][d] = nu[0][1] * muGrad[1][0][d] + nuGrad[0][1][d] * mu[1][0];
149 lambdaGrad[2][d] = nu[1][0] * muGrad[1][1][d] + nuGrad[1][0][d] * mu[1][1];
150 lambdaGrad[3][d] = nu[1][1] * muGrad[0][0][d] + nuGrad[1][1][d] * mu[0][0];
152 lambdaGrad[4][0] = 0;
153 lambdaGrad[4][1] = 0;
154 lambdaGrad[4][2] = 1;
158 template<
class Po
intScalar>
159 KOKKOS_INLINE_FUNCTION
160 void transformToESEASPyramid( PointScalar &x_eseas, PointScalar &y_eseas, PointScalar &z_eseas,
161 const PointScalar &x_int2,
const PointScalar &y_int2,
const PointScalar &z_int2)
163 x_eseas = (x_int2 + 1. - z_int2) / 2.;
164 y_eseas = (y_int2 + 1. - z_int2) / 2.;
169 template<
class OutputScalar>
170 KOKKOS_INLINE_FUNCTION
171 void transformFromESEASPyramidGradient( OutputScalar &dx_int2, OutputScalar &dy_int2, OutputScalar &dz_int2,
172 const OutputScalar &dx_eseas,
const OutputScalar &dy_eseas,
const OutputScalar &dz_eseas)
174 dx_int2 = dx_eseas / 2.;
175 dy_int2 = dy_eseas / 2.;
176 dz_int2 = dz_eseas - dx_int2 - dy_int2;