10 #define ScratchViews_h 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> 22 #include <type_traits> 48 int create_master_element_views(
50 const std::set<ELEM_DATA_NEEDED>& dataEnums,
51 int nDim,
int nodesPerElem,
52 int numScsIp,
int numScvIp,
int numFemIp);
55 const std::set<ELEM_DATA_NEEDED>& dataEnums,
61 void fill_master_element_views_new_me(
62 const std::set<ELEM_DATA_NEEDED>& dataEnums,
88 const stk::mesh::BulkData& bulkData,
113 ThrowRequire(hasCoordField[cType] ==
true);
114 return meViews[cType];
127 const stk::mesh::BulkData& bulkData,
130 void create_needed_master_element_views(
const TeamHandleType& team,
132 int nDim,
int nodesPerElem,
133 int numScsIp,
int numScvIp,
int numFemIp);
138 int num_bytes_required{0};
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.");
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.");
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.");
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.");
176 const std::set<ELEM_DATA_NEEDED>& dataEnums,
177 int nDim,
int nodesPerElem,
178 int numScsIp,
int numScvIp,
int numFemIp)
181 bool needDeriv =
false;
bool needDerivFem =
false;
182 bool needDetj =
false;
bool needDetjFem =
false;
183 bool femGradOp =
false;
bool femShiftedGradOp =
false;
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;
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;
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;
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;
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;
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;
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;
238 femShiftedGradOp =
true;
246 deriv = get_shmem_view_3D<T>(team, numScsIp,nodesPerElem,nDim);
247 numScalars += numScsIp * nodesPerElem * nDim;
251 det_j = get_shmem_view_1D<T>(team, numScsIp);
252 numScalars += numScsIp;
256 deriv_fem = get_shmem_view_3D<T>(team, numFemIp,nodesPerElem,nDim);
257 numScalars += numFemIp * nodesPerElem * nDim;
261 det_j_fem = get_shmem_view_1D<T>(team, numFemIp);
262 numScalars += numFemIp;
266 if ( femGradOp && femShiftedGradOp )
267 ThrowRequireMsg(numFemIp > 0,
"ERROR, femGradOp and femShiftedGradOp both requested.");
274 const std::set<ELEM_DATA_NEEDED>& dataEnums,
281 static_assert(std::is_same<T, double>::value,
282 "Cannot populate MasterElement Views for non-double data types");
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);
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);
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);
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));
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);
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);
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);
331 const std::set<ELEM_DATA_NEEDED>& dataEnums,
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.");
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);
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.");
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);
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.");
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);
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.");
383 const stk::mesh::BulkData& bulkData,
392 int nDim = bulkData.mesh_meta_data().spatial_dimension();
393 int nodesPerElem = topo.num_nodes();
398 create_needed_field_views(team, dataNeeded, bulkData, nodesPerElem);
400 create_needed_master_element_views(team, dataNeeded, nDim, nodesPerElem, numScsIp, numScvIp, numFemIp);
406 const stk::mesh::BulkData& bulkData,
410 const stk::mesh::MetaData& meta = bulkData.mesh_meta_data();
411 unsigned numFields = meta.get_fields().size();
412 fieldViews.resize(numFields,
nullptr);
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;
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;
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;
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;
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;
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;
448 ThrowRequireMsg(
false,
"Only elem-rank and node-rank fields supported for scratch-views currently.");
453 num_bytes_required += numScalars *
sizeof(T);
459 int nDim,
int nodesPerElem,
460 int numScsIp,
int numScvIp,
int numFemIp)
466 hasCoordField[it->first] =
true;
467 numScalars += meViews[it->first].create_master_element_views(
469 nDim, nodesPerElem, numScsIp, numScvIp, numFemIp);
472 num_bytes_required += numScalars *
sizeof(T);
478 const stk::mesh::BulkData& bulkData,
480 stk::mesh::Entity elem,
482 bool fillMEViews =
true);
485 const stk::mesh::BulkData& bulkData,
487 stk::mesh::Entity elem,
490 template<
typename T =
double>
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