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 "Cabana::Grid::GlobalMesh: Extent not evenly divisible by "
79 "uniform cell size" );
85 const std::array<scalar_type, num_space_dim>& global_low_corner,
86 const std::array<scalar_type, num_space_dim>& global_high_corner,
87 const std::array<scalar_type, num_space_dim>& cell_size )
88 : _global_low_corner( global_low_corner )
89 , _global_high_corner( global_high_corner )
90 , _cell_size( cell_size )
97 if ( std::abs( ext -
extent( d ) ) >
99 std::numeric_limits<scalar_type>::epsilon() )
100 throw std::logic_error(
101 "Cabana::Grid::GlocalMesh: Extent not evenly divisible by "
102 "uniform cell size" );
108 const std::array<scalar_type, num_space_dim>& global_low_corner,
109 const std::array<scalar_type, num_space_dim>& global_high_corner,
110 const std::array<int, num_space_dim>& global_num_cell )
111 : _global_low_corner( global_low_corner )
112 , _global_high_corner( global_high_corner )
116 _cell_size[d] = ( _global_high_corner[d] - _global_low_corner[d] ) /
125 if ( std::abs( ext -
extent( d ) ) >
127 std::numeric_limits<scalar_type>::epsilon() )
128 throw std::logic_error(
129 "Cabana::Grid::GlocalMesh: Extent not evenly divisible by "
130 "uniform cell size" );
132 throw std::logic_error(
"Cabana::Grid::GlocalMesh: Global "
133 "number of cells mismatch" );
143 return _global_low_corner[dim];
150 return _global_high_corner[dim];
164 return std::rint(
extent( dim ) / _cell_size[dim] );
173 return _cell_size[dim];
177 std::array<scalar_type, num_space_dim> _global_low_corner;
178 std::array<scalar_type, num_space_dim> _global_high_corner;
179 std::array<scalar_type, num_space_dim> _cell_size;
192template <
class Scalar, std::
size_t NumSpaceDim>
193std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
195 const std::array<Scalar, NumSpaceDim>& global_low_corner,
196 const std::array<Scalar, NumSpaceDim>& global_high_corner,
197 const Scalar cell_size )
199 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
200 global_low_corner, global_high_corner, cell_size );
213template <
class Scalar, std::
size_t NumSpaceDim>
214std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
216 const std::array<Scalar, NumSpaceDim>& global_low_corner,
217 const std::array<Scalar, NumSpaceDim>& global_high_corner,
218 const std::array<Scalar, NumSpaceDim>& cell_size )
220 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
221 global_low_corner, global_high_corner, cell_size );
234template <
class Scalar, std::
size_t NumSpaceDim>
235std::shared_ptr<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>
237 const std::array<Scalar, NumSpaceDim>& global_low_corner,
238 const std::array<Scalar, NumSpaceDim>& global_high_corner,
239 const std::array<int, NumSpaceDim>& global_num_cell )
241 return std::make_shared<GlobalMesh<UniformMesh<Scalar, NumSpaceDim>>>(
242 global_low_corner, global_high_corner, global_num_cell );
256template <
class Scalar, std::
size_t NumSpaceDim>
257std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
259 const std::array<Scalar, NumSpaceDim>& global_low_corner,
260 const std::array<Scalar, NumSpaceDim>& global_high_corner,
261 const Scalar cell_size )
263 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
264 global_low_corner, global_high_corner, cell_size );
277template <
class Scalar, std::
size_t NumSpaceDim>
278std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
280 const std::array<Scalar, NumSpaceDim>& global_low_corner,
281 const std::array<Scalar, NumSpaceDim>& global_high_corner,
282 const std::array<Scalar, NumSpaceDim>& cell_size )
284 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
285 global_low_corner, global_high_corner, cell_size );
298template <
class Scalar, std::
size_t NumSpaceDim>
299std::shared_ptr<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>
301 const std::array<Scalar, NumSpaceDim>& global_low_corner,
302 const std::array<Scalar, NumSpaceDim>& global_high_corner,
303 const std::array<int, NumSpaceDim>& global_num_cell )
305 return std::make_shared<GlobalMesh<SparseMesh<Scalar, NumSpaceDim>>>(
306 global_low_corner, global_high_corner, global_num_cell );
319template <
class Scalar>
335 const std::vector<Scalar>& j_edges,
336 const std::vector<Scalar>& k_edges )
337 : _edges( { i_edges, j_edges, k_edges } )
347 return _edges[dim].front();
354 return _edges[dim].back();
359 Scalar
extent(
const std::size_t dim )
const
368 return _edges[dim].size() - 1;
381 std::array<std::vector<Scalar>, 3> _edges;
390template <
class Scalar>
391std::shared_ptr<GlobalMesh<NonUniformMesh<Scalar, 3>>>
393 const std::vector<Scalar>& j_edges,
394 const std::vector<Scalar>& k_edges )
396 return std::make_shared<GlobalMesh<NonUniformMesh<Scalar, 3>>>(
397 i_edges, j_edges, k_edges );
410template <
class Scalar>
426 const std::vector<Scalar>& j_edges )
427 : _edges( { i_edges, j_edges } )
437 return _edges[dim].front();
444 return _edges[dim].back();
449 Scalar
extent(
const std::size_t dim )
const
458 return _edges[dim].size() - 1;
471 std::array<std::vector<Scalar>, 2> _edges;
480template <
class Scalar>
481std::shared_ptr<GlobalMesh<NonUniformMesh<Scalar, 2>>>
483 const std::vector<Scalar>& j_edges )
485 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:258
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:392
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:194
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:141
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:107
scalar_type extent(const std::size_t dim) const
Get the extent of a given dimension.
Definition Cabana_Grid_GlobalMesh.hpp:155
scalar_type highCorner(const std::size_t dim) const
Get the global high corner of the mesh.
Definition Cabana_Grid_GlobalMesh.hpp:148
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:171
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:84
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:162
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36