Extension: Json and NetCDF utilities
#include "dg/file/file.h"
Loading...
Searching...
No Matches
nc_hyperslab.h
Go to the documentation of this file.
1#pragma once
2#include <vector>
3#include <netcdf.h>
4
5namespace dg{
6namespace file{
27{
34 NcHyperslab( size_t start, size_t count = 1)
35 : m_start( 1, start), m_count( 1, count)
36 {
37 }
38
45 NcHyperslab(std::vector<size_t> start, std::vector<size_t> count)
46 : m_start(start), m_count(count)
47 {
48 assert( start.size() == count.size());
49 }
50
58 template<class File>
59 NcHyperslab( const File& file, std::string name)
60 {
61 auto dims = file.get_var_dims(name);
62 m_count = std::vector<size_t>( file.get_dims_shape( dims));
63 m_start = std::vector<size_t>( dims.size(), 0);
64 }
65
73 template<class ContainerType, std::enable_if_t< dg::is_vector_v<
74 ContainerType, dg::SharedVectorTag>, bool> = true>
75 NcHyperslab( const ContainerType& data)
76 : NcHyperslab( 0, data.size())
77 {
78 }
86 template<class Topology, std::enable_if_t<
87 !dg::is_vector_v<Topology>, bool> = true>
88 NcHyperslab( const Topology& grid)
89 {
90 auto ss = grid.start();
91 auto cc = grid.count();
92 m_start = std::vector<size_t>( ss.begin(), ss.end());
93 m_count = std::vector<size_t>( cc.begin(), cc.end());
94 }
95
97 template<class T, std::enable_if_t<!dg::is_scalar_v<T>, bool> = true>
98 NcHyperslab( size_t start0, const T& param)
99 : NcHyperslab( start0, 1, param)
100 {
101 }
102
113 template<class T>
114 NcHyperslab( size_t start0, size_t count0, const T& param)
115 : NcHyperslab( param)
116 {
117 m_start.insert( m_start.begin(), start0);
118 m_count.insert( m_count.begin(), count0);
119 }
120
122 unsigned ndim() const { return m_start.size();}
123
125 const std::vector<size_t>& start() const { return m_start;}
127 const std::vector<size_t>& count() const { return m_count;}
129 std::vector<size_t>& start() { return m_start;}
131 std::vector<size_t>& count() { return m_count;}
133 const size_t* startp() const { return &m_start[0];}
135 const size_t* countp() const { return &m_count[0];}
136 private:
137 std::vector<size_t> m_start, m_count;
138};
139
140#ifdef MPI_VERSION
152{
153
161 MPINcHyperslab( size_t local_start, size_t local_count, MPI_Comm comm)
162 : m_slab( local_start, local_count), m_comm(comm)
163 {
164 }
165
166
174 MPINcHyperslab(std::vector<size_t> local_start,
175 std::vector<size_t> local_count, MPI_Comm comm)
176 : m_slab( local_start, local_count), m_comm(comm)
177 {
178 }
179
192 template<class ContainerType, std::enable_if_t< dg::is_vector_v<
193 ContainerType, dg::MPIVectorTag>, bool> = true>
194 MPINcHyperslab( const ContainerType& data)
195 : m_slab ( 0) // "default" construct
196 {
197 int count = data.size();
198 MPI_Comm comm = data.communicator();
199 int rank, size;
200 MPI_Comm_rank( comm, &rank);
201 MPI_Comm_size( comm, &size);
202 std::vector<int> counts ( size);
203 MPI_Allgather( &count, 1, MPI_INT, &counts[0], 1, MPI_INT, comm);
204 size_t start = 0;
205 for( int r=0; r<rank; r++)
206 start += counts[r];
207
208 *this = MPINcHyperslab{ start, (size_t)count, comm};
209 }
210
220 template<class MPITopology, std::enable_if_t<!dg::is_vector_v<MPITopology>,
221 bool> = true>
222 MPINcHyperslab( const MPITopology& grid)
223 : m_slab( grid), m_comm(grid.communicator())
224 {
225 }
226
228 template<class T>
229 MPINcHyperslab( size_t start0, const T& param)
230 : MPINcHyperslab( start0, 1, param)
231 {
232 }
245 template<class T>
246 MPINcHyperslab( size_t start0, size_t count0, const T& param)
247 : MPINcHyperslab( param)
248 {
249 m_slab.start().insert( m_slab.start().begin(), start0);
250 m_slab.count().insert( m_slab.count().begin(), count0);
251 }
252
254 unsigned ndim() const { return m_slab.ndim();}
255
257 const std::vector<size_t>& start() const { return m_slab.start();}
259 const std::vector<size_t>& count() const { return m_slab.count();}
261 std::vector<size_t>& start() { return m_slab.start();}
263 std::vector<size_t>& count() { return m_slab.count();}
265 MPI_Comm communicator() const { return m_comm;}
267 const size_t* startp() const { return m_slab.startp();}
269 const size_t* countp() const { return m_slab.countp();}
270 private:
271 NcHyperslab m_slab;
272 MPI_Comm m_comm;
273};
274
276namespace detail
277{
297inline int mpi_comm_global2local_rank( MPI_Comm comm, int global_rank = 0, MPI_Comm global_comm = MPI_COMM_WORLD )
298{
299 MPI_Group local_group, global_group;
300 MPI_Comm_group( comm, &local_group);//local call
301 MPI_Comm_group( global_comm, &global_group);//local call
302 int local_root_rank;
303 MPI_Group_translate_ranks(global_group, 1, &global_rank, local_group, &local_root_rank);
304 return local_root_rank;
305}
306} // namespace detail
308#endif
309
310}//namespace file
311}//namespace dg
Definition easy_atts.h:15
A NetCDF Hyperslab for MPINcFile.
Definition nc_hyperslab.h:152
const size_t * countp() const
Definition nc_hyperslab.h:269
MPINcHyperslab(const MPITopology &grid)
grid.start(), grid.count(), grid.communicator()
Definition nc_hyperslab.h:222
MPINcHyperslab(size_t start0, const T &param)
Same as MPINcHyperslab{ start0, 1, grid}
Definition nc_hyperslab.h:229
const size_t * startp() const
Definition nc_hyperslab.h:267
MPINcHyperslab(const ContainerType &data)
{local_start(data) , local_size(data), data.communicator()}
Definition nc_hyperslab.h:194
MPI_Comm communicator() const
Definition nc_hyperslab.h:265
MPINcHyperslab(size_t start0, size_t count0, const T &param)
{start0, MPINcHyperslab( param).start()}, {count0, MPINcHyperslab(param).count(), MPINcHyperslab....
Definition nc_hyperslab.h:246
std::vector< size_t > & count()
Definition nc_hyperslab.h:263
MPINcHyperslab(size_t local_start, size_t local_count, MPI_Comm comm)
{local_start}, {local_count}
Definition nc_hyperslab.h:161
const std::vector< size_t > & count() const
Definition nc_hyperslab.h:259
const std::vector< size_t > & start() const
Definition nc_hyperslab.h:257
unsigned ndim() const
Definition nc_hyperslab.h:254
MPINcHyperslab(std::vector< size_t > local_start, std::vector< size_t > local_count, MPI_Comm comm)
local_start, local_count, comm
Definition nc_hyperslab.h:174
std::vector< size_t > & start()
Definition nc_hyperslab.h:261
A NetCDF Hyperslab for SerialNcFile.
Definition nc_hyperslab.h:27
const size_t * countp() const
Definition nc_hyperslab.h:135
std::vector< size_t > & count()
Definition nc_hyperslab.h:131
NcHyperslab(std::vector< size_t > start, std::vector< size_t > count)
start, count
Definition nc_hyperslab.h:45
std::vector< size_t > & start()
Definition nc_hyperslab.h:129
const std::vector< size_t > & count() const
Definition nc_hyperslab.h:127
const size_t * startp() const
Definition nc_hyperslab.h:133
const std::vector< size_t > & start() const
Definition nc_hyperslab.h:125
unsigned ndim() const
Definition nc_hyperslab.h:122
NcHyperslab(const Topology &grid)
grid.start(), grid.count()
Definition nc_hyperslab.h:88
NcHyperslab(size_t start0, size_t count0, const T &param)
{start0, NcHyperslab( param).start()}, {count0, NcHyperslab(param).count()}
Definition nc_hyperslab.h:114
NcHyperslab(size_t start0, const T &param)
Same as NcHyperslab{ start0, 1, param}
Definition nc_hyperslab.h:98
NcHyperslab(const ContainerType &data)
{0 , data.size()}
Definition nc_hyperslab.h:75
NcHyperslab(const File &file, std::string name)
{0}, {file.get_dims_shape( file.get_var_dims(name))}
Definition nc_hyperslab.h:59
NcHyperslab(size_t start, size_t count=1)
{start}, {count}
Definition nc_hyperslab.h:34