https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
20using ContiguousElementID = dof_id_type;
21using ContiguousNodeID = dof_id_type;
22
23class MooseMesh;
24
25namespace Moose::Kokkos
26{
27
34{
46 ContiguousSubdomainID subdomain = std::numeric_limits<ContiguousSubdomainID>::max();
47};
48
52class Mesh
53{
54public:
59 Mesh(MooseMesh & mesh) : _mesh(mesh) {}
64 const MooseMesh & getMesh() { return _mesh; }
68 [[nodiscard]] bool initialized() const { return _initialized; }
72 void update();
73
79
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; }
109 dof_id_type getNumLocalElements() const { return _num_local_elems; }
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;
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
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 {
231 return _side_area(side, elem);
232 }
239 KOKKOS_FUNCTION Real3 getSideCentroid(ContiguousElementID elem, unsigned int side) const
240 {
242 return _side_centroid(side, elem);
243 }
250 KOKKOS_FUNCTION Real3 getSideNormal(ContiguousElementID elem, unsigned int side) const
251 {
253 return _side_normal(side, elem);
254 }
262 unsigned int side) const
263 {
265 return _elem_centroid_to_side_centroid(side, elem);
266 }
274 unsigned int side) const
275 {
278 }
287 unsigned int side) const
288 {
290 return _elem_centroid_to_neighbor_centroid(side, elem);
291 }
300 unsigned int side) const
301 {
304 }
309 KOKKOS_FUNCTION BoundaryID getSideBoundaryID(ContiguousElementID elem, unsigned int side) const
310 {
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
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 }
395 KOKKOS_FUNCTION dof_id_type getStartingContiguousElementID(ContiguousSubdomainID subdomain) const
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
438private:
442 void initMap();
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
518 dof_id_type _num_local_elems = 0;
522 dof_id_type _num_ghost_elems = 0;
526 dof_id_type _num_local_nodes = 0;
571
600};
601
602#ifdef MOOSE_KOKKOS_SCOPE
603KOKKOS_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
617inline dof_id_type
622
630{
631public:
640 MeshHolder(const MeshHolder & holder)
642 {
643 }
644
645#ifdef MOOSE_KOKKOS_SCOPE
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
665private:
674};
675
676} // namespace Moose::Kokkos
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
BoundaryID ContiguousBoundaryID
Definition KokkosMesh.h:19
dof_id_type ContiguousElementID
Definition KokkosMesh.h:20
dof_id_type ContiguousNodeID
Definition KokkosMesh.h:21
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition MooseMesh.h:95
KOKKOS_FUNCTION index_type size() const
Get the total array size.
The Kokkos array class.
The Kokkos interface that holds the host reference of the Kokkos mesh and copies it to device during ...
Definition KokkosMesh.h:630
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
const Mesh & _mesh_host
Host reference of the Kokkos mesh.
Definition KokkosMesh.h:669
const Mesh _mesh_device
Device copy of the Kokkos mesh.
Definition KokkosMesh.h:673
MeshHolder(const Mesh &mesh)
Constructor.
Definition KokkosMesh.h:636
The Kokkos mesh object.
Definition KokkosMesh.h:53
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
KOKKOS_FUNCTION Real3 getSideCentroid(ContiguousElementID elem, unsigned int side) const
Get the centroid of an element side.
Definition KokkosMesh.h:239
KOKKOS_FUNCTION dof_id_type getStartingContiguousElementID(ContiguousSubdomainID subdomain) const
Get the starting contiguous element ID of a subdomain.
Definition KokkosMesh.h:395
Array< ElementInfo > _elem_info
Element information.
Definition KokkosMesh.h:530
void initMap()
Initialize host maps.
Array2D< Real > _elem_centroid_to_side_centroid_distance
Element-centroid to side-centroid distances indexed by (side, contiguous element ID)
Definition KokkosMesh.h:593
ContiguousNodeID getContiguousNodeID(const Node *node) const
Get the contiguous node ID of a node.
Array< ContiguousElementID > _starting_elem_id
Starting contiguous element ID of each subdomain.
Definition KokkosMesh.h:538
void setNeedsElementSideGeometry()
Mark that element-side geometry data is needed; initElementSideGeometry() will be called on the next ...
Definition KokkosMesh.h:84
bool _needs_element_geometry
Whether initElementGeometry() should be called on the next update()
Definition KokkosMesh.h:575
Array2D< Real > _elem_centroid_to_neighbor_centroid_distance
Element-centroid to neighbor-centroid distances indexed by (side, contiguous element ID)
Definition KokkosMesh.h:597
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 ContiguousNodeID getContiguousNodeID(ElementInfo info, unsigned int side, unsigned int node) const
Get the contiguous node ID for a side.
Definition KokkosMesh.h:417
auto getNumLocalNodes() const
Get the number of local nodes including semi-local nodes.
Definition KokkosMesh.h:129
Array< Array< ContiguousNodeID > > _boundary_nodes
Contiguous node IDs on each boundary.
Definition KokkosMesh.h:570
Array2D< ContiguousElementID > _elem_neighbor
Neighbor contiguous element IDs of each element.
Definition KokkosMesh.h:534
KOKKOS_FUNCTION dof_id_type getExtraElementID(ContiguousElementID elem, unsigned int index) const
Get the extra element ID of an element.
Definition KokkosMesh.h:383
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.
dof_id_type _num_local_nodes
Number of local nodes including semi-local nodes.
Definition KokkosMesh.h:526
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
void setNeedsElementGeometry()
Mark that element geometry data is needed; initElementGeometry() will be called on the next update()
Definition KokkosMesh.h:78
Array2D< Real3 > _side_centroid
Cached side centroids indexed by (side, contiguous element ID)
Definition KokkosMesh.h:587
bool _element_geometry_initialized
Whether initElementGeometry() has been called and the element geometry cache is populated.
Definition KokkosMesh.h:573
auto getNumSubdomains() const
Get the number of subdomains.
Definition KokkosMesh.h:94
Array< Real3 > _points
Node coordinates.
Definition KokkosMesh.h:562
KOKKOS_FUNCTION unsigned int getNumNodes(unsigned int elem_type) const
Get the number of nodes of an element type.
Definition KokkosMesh.h:363
Array2D< Real3 > _elem_centroid_to_neighbor_centroid
Element-centroid to neighbor-centroid vectors indexed by (side, contiguous element ID)
Definition KokkosMesh.h:595
const auto & getElementTypeMap() const
Get the element type ID map.
Definition KokkosMesh.h:104
Array< Array< unsigned int > > _num_side_nodes
Number of nodes per side of each element side.
Definition KokkosMesh.h:554
Mesh(MooseMesh &mesh)
Constructor.
Definition KokkosMesh.h:59
KOKKOS_FUNCTION const auto & getElementInfo(ContiguousElementID elem) const
Get the element information object.
Definition KokkosMesh.h:206
Array2D< ContiguousNodeID > _nodes
Contiguous node IDs of each element.
Definition KokkosMesh.h:566
auto getNumLocalElementTypes() const
Get the number of local elements types.
Definition KokkosMesh.h:99
Array2D< Real > _side_area
Cached coordinate-weighted side areas indexed by (side, local contiguous element ID)
Definition KokkosMesh.h:585
Array2D< Real3 > _side_normal
Cached side normals indexed by (side, contiguous element ID)
Definition KokkosMesh.h:589
ContiguousElementID getContiguousElementID(const Elem *elem) const
Get the contiguous element ID of an element.
const MooseMesh & getMesh()
Get the underyling MOOSE mesh.
Definition KokkosMesh.h:64
bool _element_side_geometry_initialized
Whether initElementSideGeometry() has been called and the side geometry cache is populated.
Definition KokkosMesh.h:577
KOKKOS_FUNCTION Real3 getNodePoint(ContiguousNodeID node) const
Get the coordinate of a node.
Definition KokkosMesh.h:428
KOKKOS_FUNCTION unsigned int getNumSides(unsigned int elem_type) const
Get the number of sides of an element type.
Definition KokkosMesh.h:354
Array< unsigned int > _num_nodes
Number of nodes of each element type.
Definition KokkosMesh.h:550
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::shared_ptr< MeshMap > _maps
A shared pointer holding all the host maps to avoid deep copy.
Definition KokkosMesh.h:505
unsigned int _elem_id_integer
Element integer for Kokkos contiguous element ID.
Definition KokkosMesh.h:510
Array< Real > _elem_volume
Cached coordinate-weighted local element volumes indexed by contiguous element ID.
Definition KokkosMesh.h:581
dof_id_type getNumLocalElements() const
Get the number of local elements.
Definition KokkosMesh.h:109
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
bool _initialized
Flag whether the mesh was initialized.
Definition KokkosMesh.h:455
MooseMesh & _mesh
Reference of the MOOSE mesh.
Definition KokkosMesh.h:451
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 _num_ghost_elems
Number of ghost (off-process neighbor) elements.
Definition KokkosMesh.h:522
void initElement()
Initialize device element data.
KOKKOS_FUNCTION BoundaryID getSideBoundaryID(ContiguousElementID elem, unsigned int side) const
Definition KokkosMesh.h:309
KOKKOS_FUNCTION Real getElementVolume(ContiguousElementID elem) const
Get the coordinate-weighted volume of a local element.
Definition KokkosMesh.h:319
Array2D< dof_id_type > _extra_elem_ids
Extra element IDs.
Definition KokkosMesh.h:542
auto getSubdomainContiguousElementIDRange(const SubdomainID subdomain) const
Get the range of contiguous element IDs for a subdomain.
Definition KokkosMesh.h:169
unsigned int _node_id_integer
Node integer for Kokkos contiguous node ID.
Definition KokkosMesh.h:514
KOKKOS_FUNCTION ContiguousElementID getNeighbor(ContiguousElementID elem, unsigned int side) const
Get the neighbor contiguous element ID.
Definition KokkosMesh.h:218
KOKKOS_FUNCTION bool isBoundaryNode(ContiguousNodeID node, ContiguousBoundaryID boundary) const
Get whether a node is on a boundary.
Definition KokkosMesh.h:604
dof_id_type getNumLocalAndPossiblyOneNeighborLayerGhostElements() const
Get the total number of elements, i.e.
Definition KokkosMesh.h:618
void initElementGeometry()
Allocate and populate local element centroids and coordinate-weighted volumes.
Array< Array2D< unsigned int > > _local_side_node
Map from local side node index to local element node index.
Definition KokkosMesh.h:558
Array< Real3 > _elem_centroid
Cached local element centroids indexed by contiguous element ID.
Definition KokkosMesh.h:583
auto getNumSubdomainLocalElements(const SubdomainID subdomain) const
Get the number of local elements in a MOOSE subdomain.
Definition KokkosMesh.h:120
const auto & getGhostElemIdMapping() const
Get the ghost element ID map (host-side only)
Definition KokkosMesh.h:163
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 Real3 getElementCentroid(ContiguousElementID elem) const
Get the centroid of a local element.
Definition KokkosMesh.h:330
ContiguousSubdomainID getContiguousSubdomainID(const SubdomainID subdomain) const
Get the contiguous subdomain ID of a MOOSE subdomain.
const auto & getLocalNodes() const
Get the list of local nodes including semi-local nodes.
Definition KokkosMesh.h:134
KOKKOS_FUNCTION Real getSideArea(ContiguousElementID elem, unsigned int side) const
Get the coordinate-weighted area of an element side.
Definition KokkosMesh.h:228
bool initialized() const
Get whether the mesh was initialized.
Definition KokkosMesh.h:68
void initElementSideGeometry()
Allocate and populate cached side geometry: side areas, centroids, normals, element-centroid to side-...
bool _needs_element_side_geometry
Whether initElementSideGeometry() should be called on the next update()
Definition KokkosMesh.h:579
dof_id_type _num_local_elems
Number of local elements.
Definition KokkosMesh.h:518
Array2D< BoundaryID > _side_boundary_id
Boundary IDs for each side indexed by (side, contiguous element ID)
Definition KokkosMesh.h:599
KOKKOS_FUNCTION ContiguousNodeID getContiguousNodeID(ContiguousElementID elem, unsigned int node) const
Get the contiguous node ID for an element.
Definition KokkosMesh.h:405
unsigned int getElementTypeID(const Elem *elem) const
Get the element type ID of an element.
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
KOKKOS_FUNCTION Real3 getSideNormal(ContiguousElementID elem, unsigned int side) const
Get the outward unit normal of an element side.
Definition KokkosMesh.h:250
void update()
Update the mesh.
static constexpr dof_id_type invalid_id
MeshBase & mesh
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
const unsigned int invalid_uint
IntRange< T > make_range(T beg, T end)
The Kokkos object that contains the information of an element The IDs used in Kokkos are different fr...
Definition KokkosMesh.h:34
unsigned int type
Element type ID.
Definition KokkosMesh.h:38
ContiguousSubdomainID subdomain
Contiguous subdomain ID.
Definition KokkosMesh.h:46
The wrapper of host maps.
Definition KokkosMesh.h:461
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
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
std::unordered_map< SubdomainID, ContiguousSubdomainID > subdomain_id_mapping
Map from the MOOSE subdomain ID to the contiguous subdomain ID.
Definition KokkosMesh.h:465
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
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
std::vector< Node * > local_nodes
List of local nodes including semi-local nodes.
Definition KokkosMesh.h:477
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
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
std::unordered_map< BoundaryID, ContiguousBoundaryID > boundary_id_mapping
Map from the MOOSE boundary ID to the contiguous boundary ID.
Definition KokkosMesh.h:469