XGCa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
grid_weights.hpp
Go to the documentation of this file.
1 #ifndef GRID_WEIGHTS_HPP
2 #define GRID_WEIGHTS_HPP
3 
4 #include "globals.hpp"
5 #include "grid_structs.hpp"
6 #include "linear_weights.hpp"
7 
8 // phi weight struct - empty if phi weights are not needed
9 enum PhiWtUsage{
13 };
14 
16 
17 template<PhiWtUsage PWU>
19  KOKKOS_INLINE_FUNCTION void set(const Simd<double>& phi_in, double inv_delta_phi, int nplanes){}
20 
21  KOKKOS_INLINE_FUNCTION void set_to_midplane(){}
22 };
23 
24 template<>
27 
28  //KOKKOS_INLINE_FUNCTION void set(const Simd<double>& phi_in, double inv_delta_phi, int nplanes){}
29 };
30 
31 template<>
34 
35  KOKKOS_INLINE_FUNCTION void set(const Simd<double>& phi_in, double inv_delta_phi, int nplanes){
36  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
37  phi[i_simd].set(phi_in[i_simd], inv_delta_phi, nplanes);
38  }
39  }
40 
41  KOKKOS_INLINE_FUNCTION void set_to_midplane(){
42  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
43  phi[i_simd].w[0] = 0.5;
44  phi[i_simd].w[1] = 0.5;
45  }
46  }
47 };
48 
49 
50 template<Order OT, PhiInterpType PIT>
51 struct SimdGridWeights{};
52 
53 
54 // Weights for zero-order interpolation: just the node index
55 template<PhiInterpType PIT>
56 struct SimdGridWeights<Order::Zero, PIT>{
58 
59  // Checks whether node index is >= 0
60  KOKKOS_INLINE_FUNCTION bool is_valid(int i_simd) const{
61  return (node[i_simd]>=0);
62  }
63 
64  // Checks whether node index is >= 0
65  KOKKOS_INLINE_FUNCTION bool is_invalid(int i_simd) const{
66  return (node[i_simd]<0);
67  }
68 
69  KOKKOS_INLINE_FUNCTION void mark_as_invalid(int i_simd){
70  node[i_simd] = -1;
71  }
72 };
73 
74 
75 // Weights for first-order interpolation: the triangle index and barycentric weights
76 template<PhiInterpType PIT>
77 struct SimdGridWeights<Order::One, PIT>{
80 
81  //SimdPhiWeights<get_phi_wt_usage(PIT)> phi_wts;
82 
83  KOKKOS_INLINE_FUNCTION SimdGridWeights()
84  : itr(-1) // Initialize SimdGridWeights to invalid
85  {}
86 
87  // Checks whether itr index is >= 0
88  KOKKOS_INLINE_FUNCTION bool is_valid(int i_simd) const{
89  return (itr[i_simd]>0);
90  }
91 
92  KOKKOS_INLINE_FUNCTION bool is_invalid(int i_simd) const{
93  return (itr[i_simd]<=0);
94  }
95 
96  KOKKOS_INLINE_FUNCTION void is_not_in_grid(Simd<bool>& is_not_valid) const{
97  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
98  is_not_valid[i_simd] = is_invalid(i_simd);
99  }
100  }
101 
102  KOKKOS_INLINE_FUNCTION void mark_as_invalid(){
103  itr = -1;
104  }
105 
106  // From the provided SimdGridWeights object, use its triangle as a hint for the triangle at the next grid search
107  KOKKOS_INLINE_FUNCTION void add_hint(const SimdGridWeights<Order::One, PIT>& grid_wts){
108  itr = grid_wts.itr;
109  }
110 
111  // From the provided SimdGridWeights object, use its triangle as a hint for the triangle at the next grid search
112  KOKKOS_INLINE_FUNCTION void add_hint(const SimdGridWeights<Order::One, PIT>& grid_wts, int i_simd){
113  itr[i_simd] = grid_wts.itr[i_simd];
114  }
115 };
116 
117 #endif
Definition: grid_weights.hpp:12
KOKKOS_INLINE_FUNCTION SimdGridWeights()
Definition: grid_weights.hpp:83
Simd< LinearWeights > phi
Definition: grid_weights.hpp:33
Simd< int > itr
Definition: grid_weights.hpp:78
Definition: grid_weights.hpp:77
Simd< int > node
Definition: grid_weights.hpp:57
Definition: grid_weights.hpp:51
KOKKOS_INLINE_FUNCTION bool is_invalid(int i_simd) const
Definition: grid_weights.hpp:92
KOKKOS_INLINE_FUNCTION bool is_invalid(int i_simd) const
Definition: grid_weights.hpp:65
KOKKOS_INLINE_FUNCTION void is_not_in_grid(Simd< bool > &is_not_valid) const
Definition: grid_weights.hpp:96
KOKKOS_INLINE_FUNCTION void set(const Simd< double > &phi_in, double inv_delta_phi, int nplanes)
Definition: grid_weights.hpp:19
KOKKOS_INLINE_FUNCTION void set(const Simd< double > &phi_in, double inv_delta_phi, int nplanes)
Definition: grid_weights.hpp:35
constexpr KOKKOS_INLINE_FUNCTION PhiWtUsage get_phi_wt_usage(PhiInterpType PIT)
Definition: grid_weights.hpp:15
Definition: grid_weights.hpp:18
Simd< int > i_phi
Definition: grid_weights.hpp:26
PhiInterpType
Definition: globals.hpp:95
Order
Definition: globals.hpp:77
KOKKOS_INLINE_FUNCTION void mark_as_invalid(int i_simd)
Definition: grid_weights.hpp:69
Definition: grid_structs.hpp:7
KOKKOS_INLINE_FUNCTION void set_to_midplane()
Definition: grid_weights.hpp:21
KOKKOS_INLINE_FUNCTION void add_hint(const SimdGridWeights< Order::One, PIT > &grid_wts)
Definition: grid_weights.hpp:107
KOKKOS_INLINE_FUNCTION void set_to_midplane()
Definition: grid_weights.hpp:41
Definition: grid_weights.hpp:11
SimdGridVec p
Definition: grid_weights.hpp:79
KOKKOS_INLINE_FUNCTION void add_hint(const SimdGridWeights< Order::One, PIT > &grid_wts, int i_simd)
Definition: grid_weights.hpp:112
KOKKOS_INLINE_FUNCTION bool is_valid(int i_simd) const
Definition: grid_weights.hpp:88
KOKKOS_INLINE_FUNCTION bool is_valid(int i_simd) const
Definition: grid_weights.hpp:60
PhiWtUsage
Definition: grid_weights.hpp:9
Definition: grid_weights.hpp:10
KOKKOS_INLINE_FUNCTION void mark_as_invalid()
Definition: grid_weights.hpp:102