https://mooseframework.inl.gov
KokkosMesh.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "KokkosTypes.h"
13 
14 #ifdef MOOSE_KOKKOS_SCOPE
15 #include "KokkosUtils.h"
16 #endif
17 
22 
23 class MooseMesh;
24 
25 namespace Moose::Kokkos
26 {
27 
34 {
38  unsigned int type = libMesh::invalid_uint;
47 };
48 
52 class Mesh
53 {
54 public:
59  Mesh(MooseMesh & mesh) : _mesh(mesh) {}
64  const MooseMesh & getMesh() { return _mesh; }
68  [[nodiscard]] bool initialized() const { return _initialized; }
72  void update();
73 
79 
85  {
88  }
89 
94  auto getNumSubdomains() const { return _maps->subdomain_id_mapping.size(); }
99  auto getNumLocalElementTypes() const { return _maps->elem_type_id_mapping.size(); }
104  const auto & getElementTypeMap() const { return _maps->elem_type_id_mapping; }
120  auto getNumSubdomainLocalElements(const SubdomainID subdomain) const
121  {
122  auto range = libmesh_map_find(_maps->subdomain_elem_id_ranges, subdomain);
123  return range.second - range.first;
124  }
129  auto getNumLocalNodes() const { return _num_local_nodes; }
134  const auto & getLocalNodes() const { return _maps->local_nodes; }
152  unsigned int getElementTypeID(const Elem * elem) const;
158  ContiguousElementID getContiguousElementID(const Elem * elem) const;
163  const auto & getGhostElemIdMapping() const { return _maps->ghost_elem_id_mapping; }
170  {
171  const auto & range = libmesh_map_find(_maps->subdomain_elem_id_ranges, subdomain);
172  return libMesh::make_range(range.first, range.second);
173  }
179  ContiguousNodeID getContiguousNodeID(const Node * node) const;
186  const auto & getSubdomainContiguousNodeIDs(const SubdomainID subdomain) const
187  {
188  return libmesh_map_find(_maps->subdomain_node_ids, subdomain);
189  }
196  const auto & getBoundaryContiguousNodeIDs(const BoundaryID boundary) const
197  {
198  return libmesh_map_find(_maps->boundary_node_ids, boundary);
199  }
200 #ifdef MOOSE_KOKKOS_SCOPE
201 
206  KOKKOS_FUNCTION const auto & getElementInfo(ContiguousElementID elem) const
207  {
208  KOKKOS_ASSERT(elem < _elem_info.size());
209 
210  return _elem_info[elem];
211  }
218  KOKKOS_FUNCTION ContiguousElementID getNeighbor(ContiguousElementID elem, unsigned int side) const
219  {
220  return _elem_neighbor(side, elem);
221  }
228  KOKKOS_FUNCTION Real getSideArea(ContiguousElementID elem, unsigned int side) const
229  {
230  KOKKOS_ASSERT(_element_side_geometry_initialized);
231  return _side_area(side, elem);
232  }
239  KOKKOS_FUNCTION Real3 getSideCentroid(ContiguousElementID elem, unsigned int side) const
240  {
241  KOKKOS_ASSERT(_element_side_geometry_initialized);
242  return _side_centroid(side, elem);
243  }
250  KOKKOS_FUNCTION Real3 getSideNormal(ContiguousElementID elem, unsigned int side) const
251  {
252  KOKKOS_ASSERT(_element_side_geometry_initialized);
253  return _side_normal(side, elem);
254  }
262  unsigned int side) const
263  {
264  KOKKOS_ASSERT(_element_side_geometry_initialized);
265  return _elem_centroid_to_side_centroid(side, elem);
266  }
274  unsigned int side) const
275  {
276  KOKKOS_ASSERT(_element_side_geometry_initialized);
277  return _elem_centroid_to_side_centroid_distance(side, elem);
278  }
287  unsigned int side) const
288  {
289  KOKKOS_ASSERT(_element_side_geometry_initialized);
290  return _elem_centroid_to_neighbor_centroid(side, elem);
291  }
300  unsigned int side) const
301  {
302  KOKKOS_ASSERT(_element_side_geometry_initialized);
304  }
309  KOKKOS_FUNCTION BoundaryID getSideBoundaryID(ContiguousElementID elem, unsigned int side) const
310  {
311  KOKKOS_ASSERT(_element_side_geometry_initialized);
312  return _side_boundary_id(side, elem);
313  }
319  KOKKOS_FUNCTION Real getElementVolume(ContiguousElementID elem) const
320  {
321  KOKKOS_ASSERT(_element_geometry_initialized);
322  KOKKOS_ASSERT(elem < _elem_volume.size());
323  return _elem_volume[elem];
324  }
330  KOKKOS_FUNCTION Real3 getElementCentroid(ContiguousElementID elem) const
331  {
332  KOKKOS_ASSERT(_element_geometry_initialized);
333  KOKKOS_ASSERT(elem < _elem_centroid.size());
334  return _elem_centroid[elem];
335  }
336 
340  void initElementGeometry();
341 
348 
354  KOKKOS_FUNCTION unsigned int getNumSides(unsigned int elem_type) const
355  {
356  return _num_sides[elem_type];
357  }
363  KOKKOS_FUNCTION unsigned int getNumNodes(unsigned int elem_type) const
364  {
365  return _num_nodes[elem_type];
366  }
373  KOKKOS_FUNCTION unsigned int getNumNodes(unsigned int elem_type, unsigned int side) const
374  {
375  return _num_side_nodes[elem_type][side];
376  }
383  KOKKOS_FUNCTION dof_id_type getExtraElementID(ContiguousElementID elem, unsigned int index) const
384  {
385  KOKKOS_ASSERT(elem < _extra_elem_ids.n(0));
386  KOKKOS_ASSERT(index < _extra_elem_ids.n(1));
387 
388  return _extra_elem_ids(elem, index);
389  }
396  {
397  return _starting_elem_id[subdomain];
398  }
406  unsigned int node) const
407  {
408  return _nodes(node, elem);
409  }
418  unsigned int side,
419  unsigned int node) const
420  {
421  return _nodes(_local_side_node[info.type](node, side), info.id);
422  }
428  KOKKOS_FUNCTION Real3 getNodePoint(ContiguousNodeID node) const { return _points[node]; }
435  KOKKOS_FUNCTION bool isBoundaryNode(ContiguousNodeID node, ContiguousBoundaryID boundary) const;
436 #endif
437 
438 private:
442  void initMap();
446  void initElement();
447 
455  bool _initialized = false;
456 
460  struct MeshMap
461  {
465  std::unordered_map<SubdomainID, ContiguousSubdomainID> subdomain_id_mapping;
469  std::unordered_map<BoundaryID, ContiguousBoundaryID> boundary_id_mapping;
473  std::unordered_map<ElemType, unsigned int> elem_type_id_mapping;
477  std::vector<Node *> local_nodes;
481  std::unordered_map<const Node *, ContiguousNodeID> ghost_node_id_mapping;
485  std::unordered_map<const Elem *, ContiguousElementID> ghost_elem_id_mapping;
489  std::unordered_map<SubdomainID, std::pair<ContiguousElementID, ContiguousElementID>>
495  std::unordered_map<SubdomainID, std::vector<ContiguousNodeID>> subdomain_node_ids;
500  std::unordered_map<BoundaryID, std::set<ContiguousNodeID>> boundary_node_ids;
501  };
505  std::shared_ptr<MeshMap> _maps;
506 
571 
600 };
601 
602 #ifdef MOOSE_KOKKOS_SCOPE
603 KOKKOS_FUNCTION inline bool
605 {
606  if (!_boundary_nodes[boundary].size())
607  return false;
608 
609  auto begin = &_boundary_nodes[boundary].begin();
610  auto end = &_boundary_nodes[boundary].end();
611  auto target = Utils::find(node, begin, end);
612 
613  return target != end;
614 }
615 #endif
616 
617 inline dof_id_type
619 {
621 }
622 
630 {
631 public:
640  MeshHolder(const MeshHolder & holder)
641  : _mesh_host(holder._mesh_host), _mesh_device(holder._mesh_host)
642  {
643  }
644 
645 #ifdef MOOSE_KOKKOS_SCOPE
646 
651  KOKKOS_FUNCTION const Mesh & kokkosMesh() const
652  {
653  KOKKOS_IF_ON_HOST(
655  "kokkosMesh() was called too early. Kokkos mesh is available after problem "
656  "initialization. Override initialSetup() if you need to setup your object data "
657  "using the Kokkos mesh.");
658 
659  return _mesh_host;)
660 
661  return _mesh_device;
662  }
663 #endif
664 
665 private:
669  const Mesh & _mesh_host;
674 };
675 
676 } // namespace Moose::Kokkos
Array2D< dof_id_type > _extra_elem_ids
Extra element IDs.
Definition: KokkosMesh.h:542
auto getNumSubdomainLocalElements(const SubdomainID subdomain) const
Get the number of local elements in a MOOSE subdomain.
Definition: KokkosMesh.h:120
const auto & getElementTypeMap() const
Get the element type ID map.
Definition: KokkosMesh.h:104
The Kokkos array class.
Definition: KokkosArray.h:65
KOKKOS_FUNCTION Real getElementVolume(ContiguousElementID elem) const
Get the coordinate-weighted volume of a local element.
Definition: KokkosMesh.h:319
const auto & getGhostElemIdMapping() const
Get the ghost element ID map (host-side only)
Definition: KokkosMesh.h:163
The Kokkos mesh object.
Definition: KokkosMesh.h:52
Array< Array2D< unsigned int > > _local_side_node
Map from local side node index to local element node index.
Definition: KokkosMesh.h:558
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
The Kokkos object that contains the information of an element The IDs used in Kokkos are different fr...
Definition: KokkosMesh.h:33
The wrapper of host maps.
Definition: KokkosMesh.h:460
bool _needs_element_geometry
Whether initElementGeometry() should be called on the next update()
Definition: KokkosMesh.h:575
Array< ContiguousElementID > _starting_elem_id
Starting contiguous element ID of each subdomain.
Definition: KokkosMesh.h:538
KOKKOS_FUNCTION Real3 getElementCentroid(ContiguousElementID elem) const
Get the centroid of a local element.
Definition: KokkosMesh.h:330
const unsigned int invalid_uint
std::unordered_map< BoundaryID, ContiguousBoundaryID > boundary_id_mapping
Map from the MOOSE boundary ID to the contiguous boundary ID.
Definition: KokkosMesh.h:469
void initElement()
Initialize device element data.
bool _initialized
Flag whether the mesh was initialized.
Definition: KokkosMesh.h:455
Array< Real > _elem_volume
Cached coordinate-weighted local element volumes indexed by contiguous element ID.
Definition: KokkosMesh.h:581
MPI_Info info
dof_id_type ContiguousElementID
Definition: KokkosMesh.h:20
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
KOKKOS_FUNCTION dof_id_type getStartingContiguousElementID(ContiguousSubdomainID subdomain) const
Get the starting contiguous element ID of a subdomain.
Definition: KokkosMesh.h:395
KOKKOS_FUNCTION Real3 getSideNormal(ContiguousElementID elem, unsigned int side) const
Get the outward unit normal of an element side.
Definition: KokkosMesh.h:250
void initMap()
Initialize host maps.
MeshBase & mesh
BoundaryID ContiguousBoundaryID
Definition: KokkosMesh.h:19
unsigned int _elem_id_integer
Element integer for Kokkos contiguous element ID.
Definition: KokkosMesh.h:510
KOKKOS_FUNCTION BoundaryID getSideBoundaryID(ContiguousElementID elem, unsigned int side) const
Definition: KokkosMesh.h:309
void initElementGeometry()
Allocate and populate local element centroids and coordinate-weighted volumes.
const auto & getSubdomainContiguousNodeIDs(const SubdomainID subdomain) const
Get the list of local contiguous node IDs for a subdomain NOTE: This list excludes semi-local nodes...
Definition: KokkosMesh.h:186
const auto & getBoundaryContiguousNodeIDs(const BoundaryID boundary) const
Get the list of local contiguous node IDs for a boundary NOTE: This list excludes semi-local nodes...
Definition: KokkosMesh.h:196
bool _element_side_geometry_initialized
Whether initElementSideGeometry() has been called and the side geometry cache is populated.
Definition: KokkosMesh.h:577
std::vector< Node * > local_nodes
List of local nodes including semi-local nodes.
Definition: KokkosMesh.h:477
The Kokkos interface that holds the host reference of the Kokkos mesh and copies it to device during ...
Definition: KokkosMesh.h:629
dof_id_type _num_local_elems
Number of local elements.
Definition: KokkosMesh.h:518
KOKKOS_FUNCTION bool isBoundaryNode(ContiguousNodeID node, ContiguousBoundaryID boundary) const
Get whether a node is on a boundary.
Definition: KokkosMesh.h:604
Array2D< Real3 > _side_centroid
Cached side centroids indexed by (side, contiguous element ID)
Definition: KokkosMesh.h:587
auto max(const L &left, const R &right)
auto getNumSubdomains() const
Get the number of subdomains.
Definition: KokkosMesh.h:94
ContiguousNodeID getContiguousNodeID(const Node *node) const
Get the contiguous node ID of a node.
Array< Array< ContiguousNodeID > > _boundary_nodes
Contiguous node IDs on each boundary.
Definition: KokkosMesh.h:570
KOKKOS_FUNCTION unsigned int getNumNodes(unsigned int elem_type) const
Get the number of nodes of an element type.
Definition: KokkosMesh.h:363
Mesh(MooseMesh &mesh)
Constructor.
Definition: KokkosMesh.h:59
KOKKOS_FUNCTION ContiguousNodeID getContiguousNodeID(ElementInfo info, unsigned int side, unsigned int node) const
Get the contiguous node ID for a side.
Definition: KokkosMesh.h:417
const MooseMesh & getMesh()
Get the underyling MOOSE mesh.
Definition: KokkosMesh.h:64
bool initialized() const
Get whether the mesh was initialized.
Definition: KokkosMesh.h:68
static constexpr dof_id_type invalid_id
dof_id_type ContiguousNodeID
Definition: KokkosMesh.h:21
const Mesh _mesh_device
Device copy of the Kokkos mesh.
Definition: KokkosMesh.h:673
std::unordered_map< ElemType, unsigned int > elem_type_id_mapping
Map from the MOOSE element type to the element type ID.
Definition: KokkosMesh.h:473
void setNeedsElementGeometry()
Mark that element geometry data is needed; initElementGeometry() will be called on the next update() ...
Definition: KokkosMesh.h:78
boundary_id_type BoundaryID
KOKKOS_FUNCTION Real getElementCentroidToSideCentroidDistance(ContiguousElementID elem, unsigned int side) const
Get the element-centroid to side-centroid distance for an element side.
Definition: KokkosMesh.h:273
std::unordered_map< SubdomainID, ContiguousSubdomainID > subdomain_id_mapping
Map from the MOOSE subdomain ID to the contiguous subdomain ID.
Definition: KokkosMesh.h:465
dof_id_type _num_local_nodes
Number of local nodes including semi-local nodes.
Definition: KokkosMesh.h:526
KOKKOS_FUNCTION ContiguousElementID getNeighbor(ContiguousElementID elem, unsigned int side) const
Get the neighbor contiguous element ID.
Definition: KokkosMesh.h:218
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:94
std::unordered_map< const Elem *, ContiguousElementID > ghost_elem_id_mapping
Map from off-process ghost Elem* to its contiguous element ID on this process.
Definition: KokkosMesh.h:485
unsigned int type
Element type ID.
Definition: KokkosMesh.h:38
MeshHolder(const Mesh &mesh)
Constructor.
Definition: KokkosMesh.h:636
std::unordered_map< SubdomainID, std::pair< ContiguousElementID, ContiguousElementID > > subdomain_elem_id_ranges
Range of the contiguous element IDs in each subdomain.
Definition: KokkosMesh.h:490
KOKKOS_FUNCTION unsigned int getNumNodes(unsigned int elem_type, unsigned int side) const
Get the number of nodes on a side of an element type.
Definition: KokkosMesh.h:373
KOKKOS_FUNCTION index_type size() const
Get the total array size.
Definition: KokkosArray.h:294
KOKKOS_FUNCTION const auto & getElementInfo(ContiguousElementID elem) const
Get the element information object.
Definition: KokkosMesh.h:206
subdomain_id_type SubdomainID
Array2D< ContiguousNodeID > _nodes
Contiguous node IDs of each element.
Definition: KokkosMesh.h:566
std::unordered_map< BoundaryID, std::set< ContiguousNodeID > > boundary_node_ids
List of the contiguous node IDs on each boundary NOTE: This list excludes semi-local nodes...
Definition: KokkosMesh.h:500
KOKKOS_FUNCTION dof_id_type getExtraElementID(ContiguousElementID elem, unsigned int index) const
Get the extra element ID of an element.
Definition: KokkosMesh.h:383
Array2D< ContiguousElementID > _elem_neighbor
Neighbor contiguous element IDs of each element.
Definition: KokkosMesh.h:534
KOKKOS_FUNCTION Real3 getSideCentroid(ContiguousElementID elem, unsigned int side) const
Get the centroid of an element side.
Definition: KokkosMesh.h:239
void setNeedsElementSideGeometry()
Mark that element-side geometry data is needed; initElementSideGeometry() will be called on the next ...
Definition: KokkosMesh.h:84
auto getNumLocalElementTypes() const
Get the number of local elements types.
Definition: KokkosMesh.h:99
bool _needs_element_side_geometry
Whether initElementSideGeometry() should be called on the next update()
Definition: KokkosMesh.h:579
KOKKOS_FUNCTION Real3 getNodePoint(ContiguousNodeID node) const
Get the coordinate of a node.
Definition: KokkosMesh.h:428
Array2D< Real > _elem_centroid_to_side_centroid_distance
Element-centroid to side-centroid distances indexed by (side, contiguous element ID) ...
Definition: KokkosMesh.h:593
KOKKOS_FUNCTION const Mesh & kokkosMesh() const
Get the const reference of the Kokkos mesh.
Definition: KokkosMesh.h:651
MeshHolder(const MeshHolder &holder)
Copy constructor.
Definition: KokkosMesh.h:640
ContiguousSubdomainID subdomain
Contiguous subdomain ID.
Definition: KokkosMesh.h:46
Array2D< Real3 > _side_normal
Cached side normals indexed by (side, contiguous element ID)
Definition: KokkosMesh.h:589
auto getNumLocalNodes() const
Get the number of local nodes including semi-local nodes.
Definition: KokkosMesh.h:129
Array2D< Real3 > _elem_centroid_to_neighbor_centroid
Element-centroid to neighbor-centroid vectors indexed by (side, contiguous element ID) ...
Definition: KokkosMesh.h:595
KOKKOS_FUNCTION Real getSideArea(ContiguousElementID elem, unsigned int side) const
Get the coordinate-weighted area of an element side.
Definition: KokkosMesh.h:228
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Array< Real3 > _points
Node coordinates.
Definition: KokkosMesh.h:562
Array< unsigned int > _num_sides
Number of sides of each element type.
Definition: KokkosMesh.h:546
ContiguousBoundaryID getContiguousBoundaryID(const BoundaryID boundary) const
Get the contiguous boundary ID of a boundary.
Array2D< Real3 > _elem_centroid_to_side_centroid
Element-centroid to side-centroid vectors indexed by (side, contiguous element ID) ...
Definition: KokkosMesh.h:591
dof_id_type getNumLocalElements() const
Get the number of local elements.
Definition: KokkosMesh.h:109
KOKKOS_FUNCTION unsigned int getNumSides(unsigned int elem_type) const
Get the number of sides of an element type.
Definition: KokkosMesh.h:354
IntRange< T > make_range(T beg, T end)
MooseMesh & _mesh
Reference of the MOOSE mesh.
Definition: KokkosMesh.h:451
Array< Real3 > _elem_centroid
Cached local element centroids indexed by contiguous element ID.
Definition: KokkosMesh.h:583
Array2D< Real > _elem_centroid_to_neighbor_centroid_distance
Element-centroid to neighbor-centroid distances indexed by (side, contiguous element ID) ...
Definition: KokkosMesh.h:597
const auto & getLocalNodes() const
Get the list of local nodes including semi-local nodes.
Definition: KokkosMesh.h:134
Array2D< Real > _side_area
Cached coordinate-weighted side areas indexed by (side, local contiguous element ID) ...
Definition: KokkosMesh.h:585
unsigned int _node_id_integer
Node integer for Kokkos contiguous node ID.
Definition: KokkosMesh.h:514
const Mesh & _mesh_host
Host reference of the Kokkos mesh.
Definition: KokkosMesh.h:669
ContiguousElementID getContiguousElementID(const Elem *elem) const
Get the contiguous element ID of an element.
std::unordered_map< const Node *, ContiguousNodeID > ghost_node_id_mapping
Map from off-process ghost node to the contiguous node ID.
Definition: KokkosMesh.h:481
void update()
Update the mesh.
KOKKOS_FUNCTION Real3 getElementCentroidToNeighborCentroidVector(ContiguousElementID elem, unsigned int side) const
Get the element-centroid to neighbor-centroid vector for an element side with a neighbor.
Definition: KokkosMesh.h:286
ContiguousSubdomainID getContiguousSubdomainID(const SubdomainID subdomain) const
Get the contiguous subdomain ID of a MOOSE subdomain.
void initElementSideGeometry()
Allocate and populate cached side geometry: side areas, centroids, normals, element-centroid to side-...
KOKKOS_FUNCTION ContiguousNodeID getContiguousNodeID(ContiguousElementID elem, unsigned int node) const
Get the contiguous node ID for an element.
Definition: KokkosMesh.h:405
dof_id_type getNumLocalAndPossiblyOneNeighborLayerGhostElements() const
Get the total number of elements, i.e.
Definition: KokkosMesh.h:618
Array2D< BoundaryID > _side_boundary_id
Boundary IDs for each side indexed by (side, contiguous element ID)
Definition: KokkosMesh.h:599
std::shared_ptr< MeshMap > _maps
A shared pointer holding all the host maps to avoid deep copy.
Definition: KokkosMesh.h:505
Array< ElementInfo > _elem_info
Element information.
Definition: KokkosMesh.h:530
bool _element_geometry_initialized
Whether initElementGeometry() has been called and the element geometry cache is populated.
Definition: KokkosMesh.h:573
KOKKOS_FUNCTION Real3 getElementCentroidToSideCentroidVector(ContiguousElementID elem, unsigned int side) const
Get the element-centroid to side-centroid vector for an element side.
Definition: KokkosMesh.h:261
KOKKOS_FUNCTION Real getElementCentroidToNeighborCentroidDistance(ContiguousElementID elem, unsigned int side) const
Get the element-centroid to neighbor-centroid distance for an element side with a neighbor...
Definition: KokkosMesh.h:299
unsigned int getElementTypeID(const Elem *elem) const
Get the element type ID of an element.
Array< Array< unsigned int > > _num_side_nodes
Number of nodes per side of each element side.
Definition: KokkosMesh.h:554
auto getSubdomainContiguousElementIDRange(const SubdomainID subdomain) const
Get the range of contiguous element IDs for a subdomain.
Definition: KokkosMesh.h:169
Array< unsigned int > _num_nodes
Number of nodes of each element type.
Definition: KokkosMesh.h:550
dof_id_type _num_ghost_elems
Number of ghost (off-process neighbor) elements.
Definition: KokkosMesh.h:522
uint8_t dof_id_type
std::unordered_map< SubdomainID, std::vector< ContiguousNodeID > > subdomain_node_ids
List of the contiguous node IDs in each subdomain NOTE: This list excludes semi-local nodes...
Definition: KokkosMesh.h:495