16#ifndef CABANA_GRID_GLOBALMESH_HPP
17#define CABANA_GRID_GLOBALMESH_HPP
35template <
class MeshType>
47template <
class MeshType>
62 const std::array<scalar_type, num_space_dim>& global_low_corner,
63 const std::array<scalar_type, num_space_dim>& global_high_corner,
65 : _global_low_corner( global_low_corner )
66 , _global_high_corner( global_high_corner )
72 _cell_size[d] = cell_size;
74 if ( std::abs( ext -
extent( d ) ) >
76 std::numeric_limits<scalar_type>::epsilon() )
77 throw std::logic_error(
78 "Extent not evenly divisible by uniform cell size" );
84 const std::array<scalar_type, num_space_dim>& global_low_corner,
85 const std::array<scalar_type, num_space_dim>& global_high_corner,
86 const std::array<scalar_type, num_space_dim>& cell_size )
87 : _global_low_corner( global_low_corner )
88 , _global_high_corner( global_high_corner )
89 , _cell_size( cell_size )
96 if ( std::abs( ext -
extent( d ) ) >
98 std::numeric_limits<scalar_type>::epsilon() )
99 throw std::logic_error(
100 "Extent not evenly divisible by uniform cell size" );
106 const std::array<scalar_type, num_space_dim>& global_low_corner,
107 const std::array<scalar_type, num_space_dim>& global_high_corner,
108 const std::array<int, num_space_dim>& global_num_cell )
109 : _global_low_corner( global_low_corner )
110 , _global_high_corner( global_high_corner )
114 _cell_size[d] = ( _global_high_corner[d] - _global_low_corner[d] ) /
123 if ( std::abs( ext -
extent( d ) ) >
125 std::numeric_limits<scalar_type>::epsilon() )
126 throw std::logic_error(
127 "Extent not evenly divisible by uniform cell size" );
129 throw std::logic_error(
"Global number of cells mismatch" );
139 return _global_low_corner[dim];
146 return _global_high_corner[dim];
160 return std::rint(
extent( dim ) / _cell_size[dim] );
169 return _cell_size[dim];
173 std::array<scalar_type, num_space_dim> _global_low_corner;
174 std::array<scalar_type, num_space_dim> _global_high_corner;
175 std::array<scalar_type, num_space_dim> _cell_size;
188template <
class Scalar, std::
size_t NumSpaceDim>
189std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
191 const std::array<Scalar, NumSpaceDim>& global_low_corner,
192 const std::array<Scalar, NumSpaceDim>& global_high_corner,
193 const Scalar cell_size )
195 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
196 global_low_corner, global_high_corner, cell_size );
209template <
class Scalar, std::
size_t NumSpaceDim>
210std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
212 const std::array<Scalar, NumSpaceDim>& global_low_corner,
213 const std::array<Scalar, NumSpaceDim>& global_high_corner,
214 const std::array<Scalar, NumSpaceDim>& cell_size )
216 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
217 global_low_corner, global_high_corner, cell_size );
230template <
class Scalar, std::
size_t NumSpaceDim>
231std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
233 const std::array<Scalar, NumSpaceDim>& global_low_corner,
234 const std::array<Scalar, NumSpaceDim>& global_high_corner,
235 const std::array<int, NumSpaceDim>& global_num_cell )
237 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
238 global_low_corner, global_high_corner, global_num_cell );
252template <
class Scalar, std::
size_t NumSpaceDim>
253std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
255 const std::array<Scalar, NumSpaceDim>& global_low_corner,
256 const std::array<Scalar, NumSpaceDim>& global_high_corner,
257 const Scalar cell_size )
259 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
260 global_low_corner, global_high_corner, cell_size );
273template <
class Scalar, std::
size_t NumSpaceDim>
274std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
276 const std::array<Scalar, NumSpaceDim>& global_low_corner,
277 const std::array<Scalar, NumSpaceDim>& global_high_corner,
278 const std::array<Scalar, NumSpaceDim>& cell_size )
280 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
281 global_low_corner, global_high_corner, cell_size );
294template <
class Scalar, std::
size_t NumSpaceDim>
295std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
297 const std::array<Scalar, NumSpaceDim>& global_low_corner,
298 const std::array<Scalar, NumSpaceDim>& global_high_corner,
299 const std::array<int, NumSpaceDim>& global_num_cell )
301 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
302 global_low_corner, global_high_corner, global_num_cell );
315template <
class Scalar>
331 const std::vector<Scalar>& j_edges,
332 const std::vector<Scalar>& k_edges )
333 : _edges( { i_edges, j_edges, k_edges } )
343 return _edges[dim].front();
350 return _edges[dim].back();
355 Scalar
extent(
const std::size_t dim )
const
364 return _edges[dim].size() - 1;
377 std::array<std::vector<Scalar>, 3> _edges;
386template <
class Scalar>
387std::shared_ptr<GlobalMesh<NonUniformMesh<Scalar, 3>>>
389 const std::vector<Scalar>& j_edges,
390 const std::vector<Scalar>& k_edges )
392 return std::make_shared<GlobalMesh<NonUniformMesh<Scalar, 3>>>(
393 i_edges, j_edges, k_edges );
406template <
class Scalar>
422 const std::vector<Scalar>& j_edges )
423 : _edges( { i_edges, j_edges } )
433 return _edges[dim].front();
440 return _edges[dim].back();
445 Scalar
extent(
const std::size_t dim )
const
454 return _edges[dim].size() - 1;
467 std::array<std::vector<Scalar>, 2> _edges;
476template <
class Scalar>
477std::shared_ptr<GlobalMesh<NonUniformMesh<Scalar, 2>>>
479 const std::vector<Scalar>& j_edges )
481 return std::make_shared<GlobalMesh<NonUniformMesh<Scalar, 2>>>( i_edges,
std::shared_ptr< GlobalMesh< SparseMesh< Scalar, NumSpaceDim > > > createSparseGlobalMesh(const std::array< Scalar, NumSpaceDim > &global_low_corner, const std::array< Scalar, NumSpaceDim > &global_high_corner, const Scalar cell_size)
Create sparse mesh with uniform cell size.
Definition Cabana_Grid_GlobalMesh.hpp:254
std::shared_ptr< GlobalMesh< NonUniformMesh< Scalar, 3 > > > createNonUniformGlobalMesh(const std::vector< Scalar > &i_edges, const std::vector< Scalar > &j_edges, const std::vector< Scalar > &k_edges)
Create a non-uniform 3D mesh.
Definition Cabana_Grid_GlobalMesh.hpp:388
std::shared_ptr< GlobalMesh< UniformMesh< Scalar, NumSpaceDim > > > createUniformGlobalMesh(const std::array< Scalar, NumSpaceDim > &global_low_corner, const std::array< Scalar, NumSpaceDim > &global_high_corner, const Scalar cell_size)
Create uniform mesh with uniform cell size.
Definition Cabana_Grid_GlobalMesh.hpp:190
Global mesh partial specialization for uniform mesh.
Definition Cabana_Grid_GlobalMesh.hpp:49
scalar_type lowCorner(const std::size_t dim) const
Get the global low corner of the mesh.
Definition Cabana_Grid_GlobalMesh.hpp:137
static constexpr std::size_t num_space_dim
Spatial dimension.
Definition Cabana_Grid_GlobalMesh.hpp:58
GlobalMesh(const std::array< scalar_type, num_space_dim > &global_low_corner, const std::array< scalar_type, num_space_dim > &global_high_corner, const std::array< int, num_space_dim > &global_num_cell)
Number of global cells constructor.
Definition Cabana_Grid_GlobalMesh.hpp:105
scalar_type extent(const std::size_t dim) const
Get the extent of a given dimension.
Definition Cabana_Grid_GlobalMesh.hpp:151
scalar_type highCorner(const std::size_t dim) const
Get the global high corner of the mesh.
Definition Cabana_Grid_GlobalMesh.hpp:144
MeshType mesh_type
Mesh type.
Definition Cabana_Grid_GlobalMesh.hpp:52
GlobalMesh(const std::array< scalar_type, num_space_dim > &global_low_corner, const std::array< scalar_type, num_space_dim > &global_high_corner, const scalar_type cell_size)
Cell size constructor where all cell dimensions are the same.
Definition Cabana_Grid_GlobalMesh.hpp:61
scalar_type cellSize(const std::size_t dim) const
Get the uniform cell size in a given dimension.
Definition Cabana_Grid_GlobalMesh.hpp:167
GlobalMesh(const std::array< scalar_type, num_space_dim > &global_low_corner, const std::array< scalar_type, num_space_dim > &global_high_corner, const std::array< scalar_type, num_space_dim > &cell_size)
Cell size constructor - each cell dimension can be different.
Definition Cabana_Grid_GlobalMesh.hpp:83
typename mesh_type::scalar_type scalar_type
Scalar type.
Definition Cabana_Grid_GlobalMesh.hpp:55
int globalNumCell(const std::size_t dim) const
Get the global number of cells in a given dimension.
Definition Cabana_Grid_GlobalMesh.hpp:158
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36