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
ScratchViews.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 ScratchViews_h
10 #define ScratchViews_h
11 
12 #include <stk_mesh/base/Field.hpp>
13 #include <stk_mesh/base/FieldBase.hpp>
14 #include <stk_mesh/base/MetaData.hpp>
15 #include <stk_mesh/base/BulkData.hpp>
16 
17 #include <ElemDataRequests.h>
19 #include <KokkosInterface.h>
20 
21 #include <set>
22 #include <type_traits>
23 
24 namespace sierra{
25 namespace nalu{
26 
27 struct ViewHolder {
28  virtual ~ViewHolder() {}
29  int dim_;
30 };
31 
32 template<typename T>
33 struct ViewT : public ViewHolder {
34  ViewT(T view, int dim) : view_(view) {dim_ = dim;}
35  virtual ~ViewT(){}
36  T view_;
37 };
38 
39 template<typename T>
41 {
42 public:
43  typedef T value_type;
44 
45  MasterElementViews() = default;
46  virtual ~MasterElementViews() = default;
47 
48  int create_master_element_views(
49  const TeamHandleType& team,
50  const std::set<ELEM_DATA_NEEDED>& dataEnums,
51  int nDim, int nodesPerElem,
52  int numScsIp, int numScvIp, int numFemIp);
53 
55  const std::set<ELEM_DATA_NEEDED>& dataEnums,
56  SharedMemView<double**>* coordsView,
57  MasterElement* meSCS,
58  MasterElement* meSCV,
59  MasterElement* meFEM);
60 
61  void fill_master_element_views_new_me(
62  const std::set<ELEM_DATA_NEEDED>& dataEnums,
63  SharedMemView<DoubleType**>* coordsView,
64  MasterElement* meSCS,
65  MasterElement* meSCV,
66  MasterElement* meFEM);
67 
79 };
80 
81 template<typename T>
83 {
84 public:
85  typedef T value_type;
86 
87  ScratchViews(const TeamHandleType& team,
88  const stk::mesh::BulkData& bulkData,
89  stk::topology topo,
90  ElemDataRequests& dataNeeded);
91 
92  virtual ~ScratchViews() {
93  for(ViewHolder* vh : fieldViews) {
94  delete vh;
95  }
96  }
97 
98  inline
99  SharedMemView<T*>& get_scratch_view_1D(const stk::mesh::FieldBase& field);
100 
101  inline
102  SharedMemView<T**>& get_scratch_view_2D(const stk::mesh::FieldBase& field);
103 
104  inline
105  SharedMemView<T***>& get_scratch_view_3D(const stk::mesh::FieldBase& field);
106 
107  inline
108  SharedMemView<T****>& get_scratch_view_4D(const stk::mesh::FieldBase& field);
109 
110  inline
112  {
113  ThrowRequire(hasCoordField[cType] == true);
114  return meViews[cType];
115  }
116  inline bool has_coord_field(const COORDS_TYPES cType) const { return hasCoordField[cType]; }
117 
118  inline int total_bytes() const { return num_bytes_required; }
119 
120  const stk::mesh::Entity* elemNodes;
121 
122  inline const std::vector<ViewHolder*>& get_field_views() const { return fieldViews; }
123 
124 private:
125  void create_needed_field_views(const TeamHandleType& team,
126  const ElemDataRequests& dataNeeded,
127  const stk::mesh::BulkData& bulkData,
128  int nodesPerElem);
129 
130  void create_needed_master_element_views(const TeamHandleType& team,
131  const ElemDataRequests& dataNeeded,
132  int nDim, int nodesPerElem,
133  int numScsIp, int numScvIp, int numFemIp);
134 
135  std::vector<ViewHolder*> fieldViews;
137  bool hasCoordField[MAX_COORDS_TYPES] = {false, false};
138  int num_bytes_required{0};
139 };
140 
141 template<typename T>
142 SharedMemView<T*>& ScratchViews<T>::get_scratch_view_1D(const stk::mesh::FieldBase& field)
143 {
144  ThrowAssertMsg(fieldViews[field.mesh_meta_data_ordinal()] != nullptr, "ScratchViews ERROR, trying to get 1D scratch-view for field "<<field.name()<<" which wasn't declared as pre-req field.");
145  ViewT<SharedMemView<T*>>* vt = static_cast<ViewT<SharedMemView<T*>>*>(fieldViews[field.mesh_meta_data_ordinal()]);
146  return vt->view_;
147 }
148 
149 template<typename T>
150 SharedMemView<T**>& ScratchViews<T>::get_scratch_view_2D(const stk::mesh::FieldBase& field)
151 {
152  ThrowAssertMsg(fieldViews[field.mesh_meta_data_ordinal()] != nullptr, "ScratchViews ERROR, trying to get 2D scratch-view for field "<<field.name()<<" which wasn't declared as pre-req field.");
153  ViewT<SharedMemView<T**>>* vt = static_cast<ViewT<SharedMemView<T**>>*>(fieldViews[field.mesh_meta_data_ordinal()]);
154  return vt->view_;
155 }
156 
157 template<typename T>
159 {
160  ThrowAssertMsg(fieldViews[field.mesh_meta_data_ordinal()] != nullptr, "ScratchViews ERROR, trying to get 3D scratch-view for field "<<field.name()<<" which wasn't declared as pre-req field.");
161  ViewT<SharedMemView<T***>>* vt = static_cast<ViewT<SharedMemView<T***>>*>(fieldViews[field.mesh_meta_data_ordinal()]);
162  return vt->view_;
163 }
164 
165 template<typename T>
167 {
168  ThrowAssertMsg(fieldViews[field.mesh_meta_data_ordinal()] != nullptr, "ScratchViews ERROR, trying to get 4D scratch-view for field "<<field.name()<<" which wasn't declared as pre-req field.");
169  ViewT<SharedMemView<T****>>* vt = static_cast<ViewT<SharedMemView<T****>>*>(fieldViews[field.mesh_meta_data_ordinal()]);
170  return vt->view_;
171 }
172 
173 template<typename T>
175  const TeamHandleType& team,
176  const std::set<ELEM_DATA_NEEDED>& dataEnums,
177  int nDim, int nodesPerElem,
178  int numScsIp, int numScvIp, int numFemIp)
179 {
180  int numScalars = 0;
181  bool needDeriv = false; bool needDerivFem = false;
182  bool needDetj = false; bool needDetjFem = false;
183  bool femGradOp = false; bool femShiftedGradOp = false;
184  for(ELEM_DATA_NEEDED data : dataEnums) {
185  switch(data)
186  {
187  case SCS_AREAV:
188  ThrowRequireMsg(numScsIp > 0, "ERROR, meSCS must be non-null if SCS_AREAV is requested.");
189  scs_areav = get_shmem_view_2D<T>(team, numScsIp, nDim);
190  numScalars += numScsIp * nDim;
191  break;
192 
193  case SCS_GRAD_OP:
194  ThrowRequireMsg(numScsIp > 0, "ERROR, meSCS must be non-null if SCS_GRAD_OP is requested.");
195  dndx = get_shmem_view_3D<T>(team, numScsIp, nodesPerElem, nDim);
196  numScalars += nodesPerElem * numScsIp * nDim;
197  needDeriv = true;
198  needDetj = true;
199  break;
200 
201  case SCS_SHIFTED_GRAD_OP:
202  ThrowRequireMsg(numScsIp > 0, "ERROR, meSCS must be non-null if SCS_SHIFTED_GRAD_OP is requested.");
203  dndx_shifted = get_shmem_view_3D<T>(team, numScsIp, nodesPerElem, nDim);
204  numScalars += nodesPerElem * numScsIp * nDim;
205  needDeriv = true;
206  needDetj = true;
207  break;
208 
209  case SCS_GIJ:
210  ThrowRequireMsg(numScsIp > 0, "ERROR, meSCS must be non-null if SCS_GIJ is requested.");
211  gijUpper = get_shmem_view_3D<T>(team, numScsIp, nDim, nDim);
212  gijLower = get_shmem_view_3D<T>(team, numScsIp, nDim, nDim);
213  numScalars += 2 * numScsIp * nDim * nDim;
214  needDeriv = true;
215  break;
216 
217  case SCV_VOLUME:
218  ThrowRequireMsg(numScvIp > 0, "ERROR, meSCV must be non-null if SCV_VOLUME is requested.");
219  scv_volume = get_shmem_view_1D<T>(team, numScvIp);
220  numScalars += numScvIp;
221  break;
222 
223  case FEM_GRAD_OP:
224  ThrowRequireMsg(numFemIp > 0, "ERROR, meFEM must be non-null if FEM_GRAD_OP is requested.");
225  dndx_fem = get_shmem_view_3D<T>(team, numFemIp, nodesPerElem, nDim);
226  numScalars += nodesPerElem * numFemIp * nDim;
227  needDerivFem = true;
228  needDetjFem = true;
229  femGradOp = true;
230  break;
231 
232  case FEM_SHIFTED_GRAD_OP:
233  ThrowRequireMsg(numFemIp > 0, "ERROR, meFEM must be non-null if FEM_SHIFTED_GRAD_OP is requested.");
234  dndx_fem = get_shmem_view_3D<T>(team, numFemIp, nodesPerElem, nDim);
235  numScalars += nodesPerElem * numFemIp * nDim;
236  needDerivFem = true;
237  needDetjFem = true;
238  femShiftedGradOp = true;
239  break;
240 
241  default: break;
242  }
243  }
244 
245  if (needDeriv) {
246  deriv = get_shmem_view_3D<T>(team, numScsIp,nodesPerElem,nDim);
247  numScalars += numScsIp * nodesPerElem * nDim;
248  }
249 
250  if (needDetj) {
251  det_j = get_shmem_view_1D<T>(team, numScsIp);
252  numScalars += numScsIp;
253  }
254 
255  if (needDerivFem) {
256  deriv_fem = get_shmem_view_3D<T>(team, numFemIp,nodesPerElem,nDim);
257  numScalars += numFemIp * nodesPerElem * nDim;
258  }
259 
260  if (needDetjFem) {
261  det_j_fem = get_shmem_view_1D<T>(team, numFemIp);
262  numScalars += numFemIp;
263  }
264 
265  // error check
266  if ( femGradOp && femShiftedGradOp )
267  ThrowRequireMsg(numFemIp > 0, "ERROR, femGradOp and femShiftedGradOp both requested.");
268 
269  return numScalars;
270 }
271 
272 template<typename T>
274  const std::set<ELEM_DATA_NEEDED>& dataEnums,
275  SharedMemView<double**>* coordsView,
276  MasterElement* meSCS,
277  MasterElement* meSCV,
278  MasterElement* meFEM)
279 {
280  // Guard against calling MasterElement methods on SIMD data structures
281  static_assert(std::is_same<T, double>::value,
282  "Cannot populate MasterElement Views for non-double data types");
283 
284  double error = 0.0;
285  for(ELEM_DATA_NEEDED data : dataEnums) {
286  switch(data)
287  {
288  case SCS_AREAV:
289  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_AREAV is requested.");
290  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_AREAV requested.");
291  meSCS->determinant(1, &((*coordsView)(0,0)), &scs_areav(0,0), &error);
292  break;
293  case SCS_GRAD_OP:
294  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GRAD_OP is requested.");
295  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GRAD_OP requested.");
296  meSCS->grad_op(1, &((*coordsView)(0,0)), &dndx(0,0,0), &deriv(0,0,0), &det_j(0), &error);
297  break;
298  case SCS_SHIFTED_GRAD_OP:
299  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GRAD_OP is requested.");
300  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GRAD_OP requested.");
301  meSCS->shifted_grad_op(1, &((*coordsView)(0,0)), &dndx_shifted(0,0,0), &deriv(0,0,0), &det_j(0), &error);
302  break;
303  case SCS_GIJ:
304  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GIJ is requested.");
305  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GIJ requested.");
306  meSCS->gij(&((*coordsView)(0,0)), &gijUpper(0,0,0), &gijLower(0,0,0), &deriv(0,0,0));
307  break;
308  case SCV_VOLUME:
309  ThrowRequireMsg(meSCV != nullptr, "ERROR, meSCV needs to be non-null if SCV_VOLUME is requested.");
310  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCV_VOLUME requested.");
311  meSCV->determinant(1, &((*coordsView)(0,0)), &scv_volume(0), &error);
312  break;
313  case FEM_GRAD_OP:
314  ThrowRequireMsg(meFEM != nullptr, "ERROR, meFEM needs to be non-null if FEM_GRAD_OP is requested.");
315  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but FEM_GRAD_OP requested.");
316  meFEM->grad_op(1, &((*coordsView)(0,0)), &dndx_fem(0,0,0), &deriv_fem(0,0,0), &det_j_fem(0), &error);
317  break;
318  case FEM_SHIFTED_GRAD_OP:
319  ThrowRequireMsg(meFEM != nullptr, "ERROR, meFEM needs to be non-null if FEM_SHIFTED_GRAD_OP is requested.");
320  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but FEM_GRAD_OP requested.");
321  meFEM->shifted_grad_op(1, &((*coordsView)(0,0)), &dndx_fem(0,0,0), &deriv_fem(0,0,0), &det_j_fem(0), &error);
322  break;
323 
324  default: break;
325  }
326  }
327 }
328 
329 template<typename T>
331  const std::set<ELEM_DATA_NEEDED>& dataEnums,
332  SharedMemView<DoubleType**>* coordsView,
333  MasterElement* meSCS,
334  MasterElement* meSCV,
335  MasterElement* meFEM)
336 {
337  for(ELEM_DATA_NEEDED data : dataEnums) {
338  switch(data)
339  {
340  case SCS_AREAV:
341  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_AREAV is requested.");
342  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_AREAV requested.");
343  meSCS->determinant(*coordsView, scs_areav);
344  break;
345  case SCS_GRAD_OP:
346  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GRAD_OP is requested.");
347  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GRAD_OP requested.");
348  meSCS->grad_op(*coordsView, dndx, deriv);
349  break;
350  case SCS_SHIFTED_GRAD_OP:
351  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GRAD_OP is requested.");
352  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GRAD_OP requested.");
353  meSCS->shifted_grad_op(*coordsView, dndx_shifted, deriv);
354  break;
355  case SCS_GIJ:
356  ThrowRequireMsg(meSCS != nullptr, "ERROR, meSCS needs to be non-null if SCS_GIJ is requested.");
357  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCS_GIJ requested.");
358  meSCS->gij(*coordsView, gijUpper, gijLower, deriv);
359  break;
360  case SCV_VOLUME:
361  ThrowRequireMsg(meSCV != nullptr, "ERROR, meSCV needs to be non-null if SCV_VOLUME is requested.");
362  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but SCV_VOLUME requested.");
363  meSCV->determinant(*coordsView, scv_volume);
364  break;
365  case FEM_GRAD_OP:
366  ThrowRequireMsg(meFEM != nullptr, "ERROR, meFEM needs to be non-null if FEM_GRAD_OP is requested.");
367  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but FEM_GRAD_OP requested.");
368  meFEM->grad_op_fem(*coordsView, dndx_fem, deriv_fem, det_j_fem);
369  break;
370  case FEM_SHIFTED_GRAD_OP:
371  ThrowRequireMsg(meFEM != nullptr, "ERROR, meFEM needs to be non-null if FEM_SHIFTED_GRAD_OP is requested.");
372  ThrowRequireMsg(coordsView != nullptr, "ERROR, coords null but FEM_GRAD_OP requested.");
373  meFEM->shifted_grad_op_fem(*coordsView, dndx_fem, deriv_fem, det_j_fem);
374  break;
375 
376  default: break;
377  }
378  }
379 }
380 
381 template<typename T>
383  const stk::mesh::BulkData& bulkData,
384  stk::topology topo,
385  ElemDataRequests& dataNeeded)
386 {
387  /* master elements are allowed to be null if they are not required */
388  MasterElement *meSCS = dataNeeded.get_cvfem_surface_me();
389  MasterElement *meSCV = dataNeeded.get_cvfem_volume_me();
390  MasterElement *meFEM = dataNeeded.get_fem_volume_me();
391 
392  int nDim = bulkData.mesh_meta_data().spatial_dimension();
393  int nodesPerElem = topo.num_nodes();
394  int numScsIp = meSCS != nullptr ? meSCS->numIntPoints_ : 0;
395  int numScvIp = meSCV != nullptr ? meSCV->numIntPoints_ : 0;
396  int numFemIp = meFEM != nullptr ? meFEM->numIntPoints_ : 0;
397 
398  create_needed_field_views(team, dataNeeded, bulkData, nodesPerElem);
399 
400  create_needed_master_element_views(team, dataNeeded, nDim, nodesPerElem, numScsIp, numScvIp, numFemIp);
401 }
402 
403 template<typename T>
405  const ElemDataRequests& dataNeeded,
406  const stk::mesh::BulkData& bulkData,
407  int nodesPerElem)
408 {
409  int numScalars = 0;
410  const stk::mesh::MetaData& meta = bulkData.mesh_meta_data();
411  unsigned numFields = meta.get_fields().size();
412  fieldViews.resize(numFields, nullptr);
413 
414  const FieldSet& neededFields = dataNeeded.get_fields();
415  for(const FieldInfo& fieldInfo : neededFields) {
416  stk::mesh::EntityRank fieldEntityRank = fieldInfo.field->entity_rank();
417  ThrowAssertMsg(fieldEntityRank == stk::topology::NODE_RANK || fieldEntityRank == stk::topology::ELEM_RANK, "Currently only node and element fields are supported.");
418  unsigned scalarsDim1 = fieldInfo.scalarsDim1;
419  unsigned scalarsDim2 = fieldInfo.scalarsDim2;
420 
421  if (fieldEntityRank==stk::topology::ELEM_RANK) {
422  if (scalarsDim2 == 0) {
423  fieldViews[fieldInfo.field->mesh_meta_data_ordinal()] = new ViewT<SharedMemView<T*>>(get_shmem_view_1D<T>(team, scalarsDim1), 1);
424  numScalars += scalarsDim1;
425  }
426  else {
427  fieldViews[fieldInfo.field->mesh_meta_data_ordinal()] = new ViewT<SharedMemView<T**>>(get_shmem_view_2D<T>(team, scalarsDim1, scalarsDim2),2);
428  numScalars += scalarsDim1 * scalarsDim2;
429  }
430  }
431  else if (fieldEntityRank==stk::topology::NODE_RANK) {
432  if (scalarsDim2 == 0) {
433  if (scalarsDim1 == 1) {
434  fieldViews[fieldInfo.field->mesh_meta_data_ordinal()] = new ViewT<SharedMemView<T*>>(get_shmem_view_1D<T>(team, nodesPerElem),1);
435  numScalars += nodesPerElem;
436  }
437  else {
438  fieldViews[fieldInfo.field->mesh_meta_data_ordinal()] = new ViewT<SharedMemView<T**>>(get_shmem_view_2D<T>(team, nodesPerElem, scalarsDim1),2);
439  numScalars += nodesPerElem * scalarsDim1;
440  }
441  }
442  else {
443  fieldViews[fieldInfo.field->mesh_meta_data_ordinal()] = new ViewT<SharedMemView<T***>>(get_shmem_view_3D<T>(team, nodesPerElem, scalarsDim1, scalarsDim2),3);
444  numScalars += nodesPerElem * scalarsDim1 * scalarsDim2;
445  }
446  }
447  else {
448  ThrowRequireMsg(false,"Only elem-rank and node-rank fields supported for scratch-views currently.");
449  }
450  }
451 
452  // Track total bytes required for field allocations
453  num_bytes_required += numScalars * sizeof(T);
454 }
455 
456 template<typename T>
458  const ElemDataRequests& dataNeeded,
459  int nDim, int nodesPerElem,
460  int numScsIp, int numScvIp, int numFemIp)
461 {
462  int numScalars = 0;
463 
464  for (auto it = dataNeeded.get_coordinates_map().begin();
465  it != dataNeeded.get_coordinates_map().end(); ++it) {
466  hasCoordField[it->first] = true;
467  numScalars += meViews[it->first].create_master_element_views(
468  team, dataNeeded.get_data_enums(it->first),
469  nDim, nodesPerElem, numScsIp, numScvIp, numFemIp);
470  }
471 
472  num_bytes_required += numScalars * sizeof(T);
473 }
474 
475 int get_num_scalars_pre_req_data( ElemDataRequests& dataNeededBySuppAlgs, int nDim);
476 
477 void fill_pre_req_data(ElemDataRequests& dataNeeded,
478  const stk::mesh::BulkData& bulkData,
479  stk::topology topo,
480  stk::mesh::Entity elem,
481  ScratchViews<double>& prereqData,
482  bool fillMEViews = true);
483 
485  const stk::mesh::BulkData& bulkData,
486  stk::topology topo,
487  stk::mesh::Entity elem,
488  ScratchViews<DoubleType>& prereqData);
489 
490 template<typename T = double>
491 int get_num_bytes_pre_req_data(ElemDataRequests& dataNeededBySuppAlgs, int nDim)
492 {
493  return sizeof(T) * get_num_scalars_pre_req_data(dataNeededBySuppAlgs, nDim);
494 }
495 
496 } // namespace nalu
497 } // namespace Sierra
498 
499 #endif
Definition: ScratchViews.h:40
const stk::mesh::Entity * elemNodes
Definition: ScratchViews.h:120
SharedMemView< T * > scv_volume
Definition: ScratchViews.h:76
Definition: ElemDataRequests.h:27
bool has_coord_field(const COORDS_TYPES cType) const
Definition: ScratchViews.h:116
Definition: ElemDataRequests.h:28
Definition: ABLForcingAlgorithm.C:26
Definition: ElemDataRequests.h:25
Definition: MasterElement.h:53
int get_num_scalars_pre_req_data(ElemDataRequests &dataNeededBySuppAlgs, int nDim)
Definition: ScratchViews.C:88
Definition: ElemDataRequests.h:31
MasterElement * get_cvfem_volume_me()
Definition: ElemDataRequests.h:139
SharedMemView< T * > & get_scratch_view_1D(const stk::mesh::FieldBase &field)
Definition: ScratchViews.h:142
SharedMemView< T *** > gijUpper
Definition: ScratchViews.h:77
const FieldSet & get_fields() const
Definition: ElemDataRequests.h:138
SharedMemView< T ** > scs_areav
Definition: ScratchViews.h:68
int numIntPoints_
Definition: MasterElement.h:247
void fill_master_element_views(ElemDataRequests &dataNeeded, const stk::mesh::BulkData &bulkData, stk::topology topo, stk::mesh::Entity elem, ScratchViews< DoubleType > &prereqData)
Definition: ScratchViews.C:257
Definition: ElemDataRequests.h:66
SharedMemView< T * > det_j
Definition: ScratchViews.h:74
Definition: ElemDataRequests.h:37
void create_needed_master_element_views(const TeamHandleType &team, const ElemDataRequests &dataNeeded, int nDim, int nodesPerElem, int numScsIp, int numScvIp, int numFemIp)
Definition: ScratchViews.h:457
const std::vector< ViewHolder * > & get_field_views() const
Definition: ScratchViews.h:122
int create_master_element_views(const TeamHandleType &team, const std::set< ELEM_DATA_NEEDED > &dataEnums, int nDim, int nodesPerElem, int numScsIp, int numScvIp, int numFemIp)
Definition: ScratchViews.h:174
virtual ~ViewHolder()
Definition: ScratchViews.h:28
SharedMemView< T *** > & get_scratch_view_3D(const stk::mesh::FieldBase &field)
Definition: ScratchViews.h:158
Definition: ElemDataRequests.h:29
virtual void determinant(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType ** > &areav)
Definition: MasterElement.h:94
SharedMemView< T *** > deriv_fem
Definition: ScratchViews.h:73
MasterElement * get_cvfem_surface_me()
Definition: ElemDataRequests.h:140
SharedMemView< T *** > dndx
Definition: ScratchViews.h:69
SharedMemView< T **** > & get_scratch_view_4D(const stk::mesh::FieldBase &field)
Definition: ScratchViews.h:166
Definition: ScratchViews.h:33
void fill_master_element_views_new_me(const std::set< ELEM_DATA_NEEDED > &dataEnums, SharedMemView< DoubleType ** > *coordsView, MasterElement *meSCS, MasterElement *meSCV, MasterElement *meFEM)
Definition: ScratchViews.h:330
virtual void grad_op_fem(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv, SharedMemView< DoubleType * > &det_j)
Definition: MasterElement.h:80
void fill_master_element_views(const std::set< ELEM_DATA_NEEDED > &dataEnums, SharedMemView< double ** > *coordsView, MasterElement *meSCS, MasterElement *meSCV, MasterElement *meFEM)
Definition: ScratchViews.h:273
T value_type
Definition: ScratchViews.h:85
MasterElement * get_fem_volume_me()
Definition: ElemDataRequests.h:141
const std::map< COORDS_TYPES, const stk::mesh::FieldBase * > & get_coordinates_map() const
Definition: ElemDataRequests.h:135
int total_bytes() const
Definition: ScratchViews.h:118
T view_
Definition: ScratchViews.h:36
SharedMemView< T *** > gijLower
Definition: ScratchViews.h:78
virtual ~ViewT()
Definition: ScratchViews.h:35
int dim_
Definition: ScratchViews.h:29
ELEM_DATA_NEEDED
Definition: ElemDataRequests.h:24
ScratchViews(const TeamHandleType &team, const stk::mesh::BulkData &bulkData, stk::topology topo, ElemDataRequests &dataNeeded)
Definition: ScratchViews.h:382
virtual void grad_op(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv)
Definition: MasterElement.h:68
void create_needed_field_views(const TeamHandleType &team, const ElemDataRequests &dataNeeded, const stk::mesh::BulkData &bulkData, int nodesPerElem)
Definition: ScratchViews.h:404
MasterElementViews< T > & get_me_views(const COORDS_TYPES cType)
Definition: ScratchViews.h:111
std::vector< ViewHolder * > fieldViews
Definition: ScratchViews.h:135
SharedMemView< T *** > dndx_shifted
Definition: ScratchViews.h:70
Kokkos::View< T, Kokkos::LayoutRight, DeviceShmem, Kokkos::MemoryUnmanaged > SharedMemView
Definition: KokkosInterface.h:25
Definition: ElemDataRequests.h:45
std::set< FieldInfo, FieldInfoLess > FieldSet
Definition: ElemDataRequests.h:64
COORDS_TYPES
Definition: ElemDataRequests.h:34
Definition: ScratchViews.h:27
Definition: ElemDataRequests.h:26
SharedMemView< T * > det_j_fem
Definition: ScratchViews.h:75
virtual void gij(SharedMemView< DoubleType ** > coords, SharedMemView< DoubleType *** > gupper, SharedMemView< DoubleType *** > glower, SharedMemView< DoubleType *** > deriv)
Definition: MasterElement.h:99
virtual ~ScratchViews()
Definition: ScratchViews.h:92
Definition: ElemDataRequests.h:30
T value_type
Definition: ScratchViews.h:43
Kokkos::TeamPolicy< DeviceSpace, DynamicScheduleType >::member_type TeamHandleType
Definition: KokkosInterface.h:22
SharedMemView< T *** > dndx_fem
Definition: ScratchViews.h:71
virtual void shifted_grad_op(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv)
Definition: MasterElement.h:74
ViewT(T view, int dim)
Definition: ScratchViews.h:34
virtual void shifted_grad_op_fem(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv, SharedMemView< DoubleType * > &det_j)
Definition: MasterElement.h:87
void fill_pre_req_data(ElemDataRequests &dataNeeded, const stk::mesh::BulkData &bulkData, stk::topology topo, stk::mesh::Entity elem, ScratchViews< double > &prereqData, bool fillMEViews)
Definition: ScratchViews.C:180
SharedMemView< T ** > & get_scratch_view_2D(const stk::mesh::FieldBase &field)
Definition: ScratchViews.h:150
Definition: ScratchViews.h:82
const std::set< ELEM_DATA_NEEDED > & get_data_enums(const COORDS_TYPES cType) const
Definition: ElemDataRequests.h:118
SharedMemView< T *** > deriv
Definition: ScratchViews.h:72
int get_num_bytes_pre_req_data(ElemDataRequests &dataNeededBySuppAlgs, int nDim)
Definition: ScratchViews.h:491