GEOS
PrismUtilities.hpp
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 Total, S.A
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
16 #ifndef GEOS_MESH_GENERATORS_PRISMUTILITIES_HPP_
17 #define GEOS_MESH_GENERATORS_PRISMUTILITIES_HPP_
18 
19 #include "common/DataTypes.hpp"
20 #include "common/Span.hpp"
21 
22 namespace geos
23 {
24 
36 template< localIndex N >
39  Span< localIndex > const faceNodes )
40 {
41  static_assert( N > 4,
42  "Function getFaceNodePrism can be called for a prism with N-sided polygon base where N > 5." );
43  static constexpr auto nodeCountError = "Not enough nodes for {} element (face index = {}).\n";
44 
45  if( faceNum == 0 )
46  {
47  GEOS_ERROR_IF_LT_MSG( faceNodes.size(), 4, GEOS_FMT( nodeCountError, N, faceNum ) << generalMeshErrorAdvice );
48  faceNodes[0] = elemNodes[0];
49  faceNodes[1] = elemNodes[1];
50  faceNodes[2] = elemNodes[N+1];
51  faceNodes[3] = elemNodes[N];
52  return 4;
53  }
54  else if( faceNum == 1 )
55  {
56  GEOS_ERROR_IF_LT_MSG( faceNodes.size(), N, GEOS_FMT( nodeCountError, N, faceNum ) << generalMeshErrorAdvice );
57  faceNodes[0] = elemNodes[0];
58  for( localIndex i = 1; i < N; ++i )
59  {
60  faceNodes[i] = elemNodes[N-i];
61  }
62  return N;
63  }
64  else if( faceNum == 2 )
65  {
66  GEOS_ERROR_IF_LT_MSG( faceNodes.size(), 4, GEOS_FMT( nodeCountError, N, faceNum ) << generalMeshErrorAdvice );
67  faceNodes[0] = elemNodes[0];
68  faceNodes[1] = elemNodes[N];
69  faceNodes[2] = elemNodes[N*2-1];
70  faceNodes[3] = elemNodes[N-1];
71  return 4;
72  }
73  else if( faceNum >= 3 && faceNum <= N )
74  {
75  GEOS_ERROR_IF_LT_MSG( faceNodes.size(), 4, GEOS_FMT( nodeCountError, N, faceNum ) << generalMeshErrorAdvice );
76  faceNodes[0] = elemNodes[faceNum-2];
77  faceNodes[1] = elemNodes[faceNum-1];
78  faceNodes[2] = elemNodes[N+faceNum-1];
79  faceNodes[3] = elemNodes[N+faceNum-2];
80  return 4;
81  }
82  else if( faceNum == N + 1 )
83  {
84  GEOS_ERROR_IF_LT_MSG( faceNodes.size(), N, GEOS_FMT( nodeCountError, N, faceNum ) << generalMeshErrorAdvice );
85  for( localIndex i = 0; i < N; ++i )
86  {
87  faceNodes[i] = elemNodes[i+N];
88  }
89  return N;
90  }
91  else
92  {
93  GEOS_ERROR( GEOS_FMT( "Local face index out of range for Prism{} element: face index = {}.\n{}",
94  N, faceNum, generalMeshErrorAdvice ) );
95  return 0;
96  }
97 
98 }
99 
100 }
101 
102 #endif // GEOS_MESH_GENERATORS_PRISMUTILITIES_HPP_
#define GEOS_ERROR(msg)
Raise a hard error and terminate the program.
Definition: Logger.hpp:157
#define GEOS_ERROR_IF_LT_MSG(lhs, rhs, msg)
Raise a hard error if one value compares less than the other.
Definition: Logger.hpp:339
Lightweight non-owning wrapper over a contiguous range of elements.
Definition: Span.hpp:42
constexpr size_type size() const noexcept
Definition: Span.hpp:107
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:85
ArraySlice< T, 1, USD > arraySlice1d
Alias for 1D array slice.
Definition: DataTypes.hpp:184
localIndex getFaceNodesPrism(localIndex const faceNum, arraySlice1d< localIndex const, cells::NODE_MAP_USD - 1 > const &elemNodes, Span< localIndex > const faceNodes)
Get the local indices of the nodes in a face of the prism with N-sided polygon base.
constexpr auto generalMeshErrorAdvice
String available for mesh errors.