1 #ifndef PANZER_CONVERT_NORMAL_TO_ROTATION_MATRIX_HPP
2 #define PANZER_CONVERT_NORMAL_TO_ROTATION_MATRIX_HPP
6 template <
typename Scalar>
13 const T n = sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
18 transverse[0]=0.;transverse[1]=1.;transverse[2]=0.;
19 if(Kokkos::fabs(normal[0]*transverse[0]+normal[1]*transverse[1])>0.9){
20 transverse[0]=1.;transverse[1]=0.;
23 const T nt = normal[0]*transverse[0]+normal[1]*transverse[1]+normal[2]*transverse[2];
26 const T mult = nt/(n*n);
29 for(
int dim=0;dim<3;++dim){
30 transverse[dim] = transverse[dim] - mult * normal[dim];
33 const T t = sqrt(transverse[0]*transverse[0]+transverse[1]*transverse[1]+transverse[2]*transverse[2]);
34 KOKKOS_ASSERT(t != 0.);
35 for(
int dim=0;dim<3;++dim){
40 binormal[0] = (normal[1] * transverse[2] - normal[2] * transverse[1]);
41 binormal[1] = (normal[2] * transverse[0] - normal[0] * transverse[2]);
42 binormal[2] = (normal[0] * transverse[1] - normal[1] * transverse[0]);
45 const T b = sqrt(binormal[0]*binormal[0]+binormal[1]*binormal[1]+binormal[2]*binormal[2]);
46 for(
int dim=0;dim<3;++dim){
KOKKOS_INLINE_FUNCTION void convertNormalToRotationMatrix(const Scalar normal[3], Scalar transverse[3], Scalar binormal[3])