Nalu
Nalu: a generalized unstructured massively parallel low Mach flow code designed to support a variety of energy applications of interest (most notably Wind ECP) built on the Sierra Toolkit and Trilinos solver Tpetra/Epetra stack. The open source BSD, clause 3 license model has been chosen for the code base. See LICENSE for more information. http://NaluCFD.org
CopyAndInterleave.h
Go to the documentation of this file.
1 /*------------------------------------------------------------------------*/
2 /* Copyright 2014 Sandia Corporation. */
3 /* This software is released under the license detailed */
4 /* in the file, LICENSE, which is located in the top-level Nalu */
5 /* directory structure */
6 /*------------------------------------------------------------------------*/
7 
8 
9 #ifndef CopyAndInterleave_h
10 #define CopyAndInterleave_h
11 
12 #include <ElemDataRequests.h>
13 #include <KokkosInterface.h>
14 #include <SimdInterface.h>
15 #include <ScratchViews.h>
16 
17 namespace sierra{
18 namespace nalu{
19 
20 template<typename DTYPE>
21 void interleave_3D(SharedMemView<DTYPE***>& dview, const SharedMemView<double***>& sview, int simdIndex)
22 {
23  int dim0 = dview.dimension(0);
24  int dim1 = dview.dimension(1);
25  int dim2 = dview.dimension(2);
26 
27  for(int i=0; i<dim0; ++i) {
28  for(int j=0; j<dim1; ++j) {
29  for(int k=0; k<dim2; ++k) {
30  stk::simd::set_data(dview(i,j,k), simdIndex, sview(i,j,k));
31  }
32  }
33  }
34 }
35 
36 template<typename DTYPE>
37 void interleave_2D(SharedMemView<DTYPE**>& dview, const SharedMemView<double**>& sview, int simdIndex)
38 {
39  int dim0 = dview.dimension(0);
40  int dim1 = dview.dimension(1);
41  for(int i=0; i<dim0; ++i) {
42  for(int j=0; j<dim1; ++j) {
43  stk::simd::set_data(dview(i,j), simdIndex, sview(i,j));
44  }
45  }
46 }
47 
48 template<typename DTYPE>
49 void interleave_1D(SharedMemView<DTYPE*>& dview, const SharedMemView<double*>& sview, int simdIndex)
50 {
51  int dim = dview.dimension(0);
52 
53  for(int i=0; i<dim; ++i) {
54  stk::simd::set_data(dview(i), simdIndex, sview(i));
55  }
56 }
57 
58 template<typename DTYPE>
59 void interleave_1D(SharedMemView<DTYPE*>& dview, const double* sviews[], int simdElems)
60 {
61  int dim = dview.dimension(0);
62  DoubleType* dptr = dview.data();
63  for(int i=0; i<dim; ++i) {
64  DoubleType& d = dptr[i];
65  for(int simdIndex=0; simdIndex<simdElems; ++simdIndex) {
66  stk::simd::set_data(d, simdIndex, sviews[simdIndex][i]);
67  }
68  }
69 }
70 
71 template<typename DTYPE>
72 void interleave_2D(SharedMemView<DTYPE**>& dview, const double* sviews[], int simdElems)
73 {
74  int len = dview.dimension(0)*dview.dimension(1);
75  DoubleType* d = dview.data();
76  for(int idx=0; idx<len; ++idx) {
77  DoubleType& dv = d[idx];
78  for(int simdIndex=0; simdIndex<simdElems; ++simdIndex) {
79  stk::simd::set_data(dv, simdIndex, sviews[simdIndex][idx]);
80  }
81  }
82 }
83 
84 template<typename DTYPE>
85 void interleave_3D(SharedMemView<DTYPE***>& dview, const double* sviews[], int simdElems)
86 {
87  int len = dview.dimension(0)*dview.dimension(1)*dview.dimension(2);
88  DoubleType* d = dview.data();
89  for(int idx=0; idx<len; ++idx) {
90  DoubleType& dv = d[idx];
91  for(int simdIndex=0; simdIndex<simdElems; ++simdIndex) {
92  stk::simd::set_data(dv, simdIndex, sviews[simdIndex][idx]);
93  }
94  }
95 }
96 
97 inline
98 void interleave_1D(ViewHolder* dest, const ViewHolder* sviews[], int simdElems)
99 {
100  const double* smemviews[stk::simd::ndoubles];
101  SharedMemView<DoubleType*>& dmemview = static_cast<ViewT<SharedMemView<DoubleType*>>*>(dest)->view_;
102  for(int i=0; i<simdElems; ++i) {
103  smemviews[i] = static_cast<const ViewT<SharedMemView<double*>>*>(sviews[i])->view_.data();
104  }
105 
106  interleave_1D(dmemview, smemviews, simdElems);
107 }
108 
109 inline
110 void interleave_2D(ViewHolder* dest, const ViewHolder* sviews[], int simdElems)
111 {
112  const double* smemviews[stk::simd::ndoubles];
113  SharedMemView<DoubleType**>& dmemview = static_cast<ViewT<SharedMemView<DoubleType**>>*>(dest)->view_;
114  for(int i=0; i<simdElems; ++i) {
115  smemviews[i] = static_cast<const ViewT<SharedMemView<double**>>*>(sviews[i])->view_.data();
116  }
117 
118  interleave_2D(dmemview, smemviews, simdElems);
119 }
120 
121 inline
122 void interleave_3D(ViewHolder* dest, const ViewHolder* sviews[], int simdElems)
123 {
124  const double* smemviews[stk::simd::ndoubles];
125  SharedMemView<DoubleType***>& dmemview = static_cast<ViewT<SharedMemView<DoubleType***>>*>(dest)->view_;
126  for(int i=0; i<simdElems; ++i) {
127  smemviews[i] = static_cast<const ViewT<SharedMemView<double***>>*>(sviews[i])->view_.data();
128  }
129 
130  interleave_3D(dmemview, smemviews, simdElems);
131 }
132 
133 inline
135  const MasterElementViews<double>& src,
136  int simdIndex)
137 {
138  interleave_2D(dest.scs_areav, src.scs_areav, simdIndex);
139  interleave_3D(dest.dndx, src.dndx, simdIndex);
140  interleave_3D(dest.dndx_shifted, src.dndx_shifted, simdIndex);
141  interleave_3D(dest.dndx_fem, src.dndx_fem, simdIndex);
142  interleave_3D(dest.deriv, src.deriv, simdIndex);
143  interleave_3D(dest.deriv_fem, src.deriv_fem, simdIndex);
144  interleave_1D(dest.det_j, src.det_j, simdIndex);
145  interleave_1D(dest.det_j_fem, src.det_j_fem, simdIndex);
146  interleave_1D(dest.scv_volume, src.scv_volume, simdIndex);
147  interleave_3D(dest.gijUpper, src.gijUpper, simdIndex);
148  interleave_3D(dest.gijLower, src.gijLower, simdIndex);
149 }
150 
151 inline
152 void copy_and_interleave(const std::vector<ScratchViews<double>*>& data,
153  int simdElems,
154  ScratchViews<DoubleType>& simdData,
155  bool copyMEViews = true)
156 {
157  const std::vector<ViewHolder*>& simdFieldViews = simdData.get_field_views();
158  const ViewHolder* fViews[stk::simd::ndoubles] = {nullptr};
159 
160  for(size_t fieldViewsIndex=0; fieldViewsIndex<simdFieldViews.size(); ++fieldViewsIndex) {
161  if (simdFieldViews[fieldViewsIndex] != nullptr) {
162  for(int simdIndex=0; simdIndex<simdElems; ++simdIndex) {
163  fViews[simdIndex] = data[simdIndex]->get_field_views()[fieldViewsIndex];
164  }
165  switch(simdFieldViews[fieldViewsIndex]->dim_) {
166  case 1: interleave_1D(simdFieldViews[fieldViewsIndex], fViews, simdElems); break;
167  case 2: interleave_2D(simdFieldViews[fieldViewsIndex], fViews, simdElems); break;
168  case 3: interleave_3D(simdFieldViews[fieldViewsIndex], fViews, simdElems); break;
169  default: ThrowRequireMsg(simdFieldViews[fieldViewsIndex]->dim_ > 0 &&
170  simdFieldViews[fieldViewsIndex]->dim_ < 4,
171  "ERROR, view dim out of range: "<<simdFieldViews[fieldViewsIndex]->dim_);
172  break;
173  }
174  }
175  }
176 
177  if (copyMEViews)
178  {
179  for(int simdIndex=0; simdIndex<simdElems; ++simdIndex) {
180  if (simdData.has_coord_field(CURRENT_COORDINATES)) {
181  interleave_me_views(simdData.get_me_views(CURRENT_COORDINATES), data[simdIndex]->get_me_views(CURRENT_COORDINATES), simdIndex);
182  }
183  if (simdData.has_coord_field(MODEL_COORDINATES)) {
184  interleave_me_views(simdData.get_me_views(MODEL_COORDINATES), data[simdIndex]->get_me_views(MODEL_COORDINATES), simdIndex);
185  }
186  }
187  }
188 }
189 
190 inline
192 {
193  int dim = simdrhs.dimension(0);
194  const DoubleType* sr = simdrhs.data();
195  double* r = rhs.data();
196  for(int i=0; i<dim; ++i) {
197  r[i] = stk::simd::get_data(sr[i], simdIndex);
198  }
199 }
200 
201 inline
203 {
204  int len = simdlhs.dimension(0)*simdlhs.dimension(1);
205  const DoubleType* sl = simdlhs.data();
206  double* l = lhs.data();
207  for(int i=0; i<len; ++i) {
208  l[i] = stk::simd::get_data(sl[i], simdIndex);
209  }
210 }
211 
212 } // namespace nalu
213 } // namespace Sierra
214 
215 #endif
Definition: ScratchViews.h:40
SharedMemView< T * > scv_volume
Definition: ScratchViews.h:76
bool has_coord_field(const COORDS_TYPES cType) const
Definition: ScratchViews.h:116
Definition: ABLForcingAlgorithm.C:26
SharedMemView< T *** > gijUpper
Definition: ScratchViews.h:77
SharedMemView< T ** > scs_areav
Definition: ScratchViews.h:68
void interleave_me_views(MasterElementViews< DoubleType > &dest, const MasterElementViews< double > &src, int simdIndex)
Definition: CopyAndInterleave.h:134
SharedMemView< T * > det_j
Definition: ScratchViews.h:74
void copy_and_interleave(const std::vector< ScratchViews< double > * > &data, int simdElems, ScratchViews< DoubleType > &simdData, bool copyMEViews=true)
Definition: CopyAndInterleave.h:152
Definition: ElemDataRequests.h:36
const std::vector< ViewHolder * > & get_field_views() const
Definition: ScratchViews.h:122
STK SIMD Interface.
SharedMemView< T *** > deriv_fem
Definition: ScratchViews.h:73
SharedMemView< T *** > dndx
Definition: ScratchViews.h:69
Definition: ScratchViews.h:33
static constexpr double lhs[8][8]
Definition: UnitTestContinuityAdvElem.C:25
void extract_vector_lane(const SharedMemView< DoubleType * > &simdrhs, int simdIndex, SharedMemView< double * > &rhs)
Definition: CopyAndInterleave.h:191
void interleave_2D(SharedMemView< DTYPE ** > &dview, const SharedMemView< double ** > &sview, int simdIndex)
Definition: CopyAndInterleave.h:37
static constexpr double rhs[8]
Definition: UnitTestContinuityAdvElem.C:18
void interleave_1D(SharedMemView< DTYPE * > &dview, const SharedMemView< double * > &sview, int simdIndex)
Definition: CopyAndInterleave.h:49
Definition: ElemDataRequests.h:35
SharedMemView< T *** > gijLower
Definition: ScratchViews.h:78
SimdDouble DoubleType
Definition: SimdInterface.h:27
MasterElementViews< T > & get_me_views(const COORDS_TYPES cType)
Definition: ScratchViews.h:111
SharedMemView< T *** > dndx_shifted
Definition: ScratchViews.h:70
Kokkos::View< T, Kokkos::LayoutRight, DeviceShmem, Kokkos::MemoryUnmanaged > SharedMemView
Definition: KokkosInterface.h:25
Definition: ScratchViews.h:27
void interleave_3D(SharedMemView< DTYPE *** > &dview, const SharedMemView< double *** > &sview, int simdIndex)
Definition: CopyAndInterleave.h:21
SharedMemView< T * > det_j_fem
Definition: ScratchViews.h:75
SharedMemView< T *** > dndx_fem
Definition: ScratchViews.h:71
Definition: ScratchViews.h:82
SharedMemView< T *** > deriv
Definition: ScratchViews.h:72