5#ifndef DUNE_GRID_YASPGRID_BACKUPRESTORE_HH
6#define DUNE_GRID_YASPGRID_BACKUPRESTORE_HH
13#include <dune/common/exceptions.hh>
14#include <dune/common/fvector.hh>
15#include <dune/grid/common/backuprestore.hh>
20#define YASPGRID_BACKUPRESTORE_FORMAT_VERSION 2
25 template<
class Coordinates>
26 struct MaybeHaveOrigin
30 static void writeOrigin(S& ,
const Coordinates& )
34 static void readOrigin(S& , Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& )
37 template<
typename... A>
39 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& , A... args)
45 template<
class ctype,
int dim>
46 struct MaybeHaveOrigin<
Dune::EquidistantOffsetCoordinates<ctype, dim> >
51 static void writeOrigin(S& s,
const Coordinates& coord)
54 for (
int i=0; i<dim; i++)
55 s << coord.
origin(i) <<
" ";
60 static void readOrigin(S& s, Dune::FieldVector<ctype, dim>& coord)
64 for (
int i=0; i<dim; i++)
68 template<
typename... A>
70 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& lowerleft,
71 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& extension, A... args)
73 Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension> upperright(lowerleft);
74 upperright += extension;
80 template<
int dim,
class Coordinates>
86 typedef typename Grid::Traits::Communication Comm;
89 static void backup (
const Grid &grid,
const std::string &filename )
91 if (grid.
comm().rank() == 0)
93 std::ofstream file(filename);
100 std::cerr <<
"ERROR: BackupRestoreFacility::backup: couldn't open file `" << filename <<
"'" << std::endl;
105 static void backup (
const Grid &grid, std::ostream &stream )
107 stream <<
"YaspGrid BackupRestore Format Version: " << YASPGRID_BACKUPRESTORE_FORMAT_VERSION << std::endl;
108 stream <<
"Torus structure: ";
109 for (
int i=0; i<dim; i++)
111 stream << std::endl <<
"Refinement level: " << grid.
maxLevel() << std::endl;
112 stream <<
"Periodicity: ";
113 for (
int i=0; i<dim; i++)
115 stream << std::endl <<
"Overlap: " << grid.
overlapSize(0,0) << std::endl;
116 stream <<
"KeepPhysicalOverlap: ";
118 stream << (i->keepOverlap ?
"1" :
"0") <<
" ";
120 stream <<
"Coarse Size: ";
121 for (
int i=0; i<dim; i++)
124 stream <<
"Meshsize: " ;
125 for (
int i=0; i<dim; i++)
126 stream << grid.
begin()->coords.meshsize(i,0) <<
" ";
128 MaybeHaveOrigin<Coordinates>::writeOrigin(stream, grid.
begin()->coords);
134 static Grid *
restore (
const std::string &filename, Comm comm = Comm())
136 std::ifstream file(filename);
141 std::cerr <<
"ERROR: BackupRestoreFacility::restore: couldn't open file `" << filename <<
"'" << std::endl;
154 stream >> input >> input >> input >> input;
156 if (version != YASPGRID_BACKUPRESTORE_FORMAT_VERSION)
157 DUNE_THROW(Dune::Exception,
"Your YaspGrid backup file is written in an outdated format!");
159 std::array<int,dim> torus_dims;
160 stream >> input >> input;
161 for (
int i=0; i<dim; i++)
162 stream >> torus_dims[i];
165 stream >> input >> input;
166 stream >> refinement;
168 std::bitset<dim> periodic;
171 for (
int i=0; i<dim; i++)
181 std::vector<bool> physicalOverlapSize;
182 physicalOverlapSize.resize(refinement);
184 for (
int i=0; i<refinement; ++i)
187 physicalOverlapSize[i] = b;
190 std::array<int,dim> coarseSize;
191 stream >> input >> input;
192 for (
int i=0; i<dim; i++)
193 stream >> coarseSize[i];
195 Dune::FieldVector<ctype,dim> h;
197 for (
int i=0; i<dim; i++)
200 Dune::FieldVector<ctype,dim> origin;
201 MaybeHaveOrigin<Coordinates>::readOrigin(stream, origin);
204 Dune::FieldVector<ctype,dim> length(h);
205 for (
int i=0; i<dim; i++)
206 length[i] *= coarseSize[i];
210 Grid* grid = MaybeHaveOrigin<Coordinates>::createGrid(origin, length, coarseSize, periodic, overlap, comm, &lb);
212 for (
int i=0; i<refinement; ++i)
223 template<
int dim,
class ctype>
228 typedef typename Grid::Traits::Communication Comm;
231 static void backup (
const Grid &grid,
const std::string &filename )
233 std::ostringstream filename_str;
234 filename_str << filename << grid.
comm().rank();
235 std::ofstream file( filename_str.str() );
242 std::cerr <<
"ERROR: BackupRestoreFacility::backup: couldn't open file `" << filename_str.str() <<
"'" << std::endl;
246 static void backup (
const Grid &grid, std::ostream &stream )
248 stream <<
"YaspGrid BackupRestore Format Version: " << YASPGRID_BACKUPRESTORE_FORMAT_VERSION << std::endl;
249 stream <<
"Torus structure: ";
250 for (
int i=0; i<dim; i++)
252 stream << std::endl <<
"Refinement level: " << grid.
maxLevel() << std::endl;
253 stream <<
"Periodicity: ";
254 for (
int i=0; i<dim; i++)
256 stream << std::endl <<
"Overlap: " << grid.
overlapSize(0,0) << std::endl;
257 stream <<
"KeepPhysicalOverlap: ";
259 stream << (i->keepOverlap ?
"1" :
"0") <<
" ";
261 stream <<
"Coarse Size: ";
262 for (
int i=0; i<dim; i++)
266 grid.
begin()->coords.print(stream);
273 static Grid *
restore (
const std::string &filename, Comm comm = Comm())
275 std::ostringstream filename_str;
276 filename_str << filename;
277 filename_str << comm.rank();
278 std::ifstream file(filename_str.str());
283 std::cerr <<
"ERROR: BackupRestoreFacility::restore: couldn't open file `" << filename_str.str() <<
"'" << std::endl;
297 stream >> input >> input >> input >> input;
299 if (version != YASPGRID_BACKUPRESTORE_FORMAT_VERSION)
300 DUNE_THROW(Dune::Exception,
"Your YaspGrid backup file is written in an outdated format!");
302 std::array<int,dim> torus_dims;
303 stream >> input >> input;
304 for (
int i=0; i<dim; i++)
305 stream >> torus_dims[i];
308 stream >> input >> input;
309 stream >> refinement;
311 std::bitset<dim> periodic;
314 for (
int i=0; i<dim; i++)
324 std::vector<bool> physicalOverlapSize;
325 physicalOverlapSize.resize(refinement);
327 for (
int i=0; i<refinement; ++i)
330 physicalOverlapSize[i] = b;
334 std::array<int,dim> coarseSize;
335 stream >> input >> input;
336 for (
int i=0; i<dim; i++)
337 stream >> coarseSize[i];
339 std::array<std::vector<ctype>,dim> coords;
340 stream >> input >> input >> input >> input;
341 for (
int d=0; d<dim; d++)
343 stream >> input >> input;
348 coords[d].resize(size);
349 for (
int i=0; i<size; i++)
357 Grid* grid =
new Grid(coords, periodic, overlap, comm, coarseSize, &lb);
359 for (
int i=0; i<refinement; ++i)
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition: coordinates.hh:131
ct origin(int d) const
Definition: coordinates.hh:185
Coordinate container for a tensor product YaspGrid.
Definition: coordinates.hh:245
const iTupel & dims() const
return dimensions of torus
Definition: torus.hh:112
[ provides Dune::Grid ]
Definition: yaspgrid.hh:166
const Torus< Communication, dim > & torus() const
return reference to torus
Definition: yaspgrid.hh:246
void globalRefine(int refCount)
refine the grid refCount times.
Definition: yaspgrid.hh:1216
YGridLevelIterator end() const
return iterator pointing to one past the finest level
Definition: yaspgrid.hh:307
int maxLevel() const
Definition: yaspgrid.hh:1210
int overlapSize(int level, int codim) const
return size (= distance in graph) of overlap region
Definition: yaspgrid.hh:1399
bool isPeriodic(int i) const
return whether the grid is periodic in direction i
Definition: yaspgrid.hh:279
void refineOptions(bool keepPhysicalOverlap)
set options for refinement
Definition: yaspgrid.hh:1270
ReservedVector< YGridLevel, 32 >::const_iterator YGridLevelIterator
Iterator over the grid levels.
Definition: yaspgrid.hh:290
const Communication & comm() const
return a communication object
Definition: yaspgrid.hh:1756
Coordinates::ctype ctype
Type used for coordinates.
Definition: yaspgrid.hh:179
int levelSize(int l, int i) const
return size of the grid (in cells) on level l in direction i
Definition: yaspgrid.hh:264
YGridLevelIterator begin() const
return iterator pointing to coarsest level
Definition: yaspgrid.hh:293
Implement partitioner that gets a fixed partitioning from an array If the given partitioning doesn't ...
Definition: partitioning.hh:147
Include standard header files.
Definition: agrid.hh:60
static void backup(const Grid &grid, std::ostream &stream)
write a hierarchic grid to disk
Definition: backuprestore.hh:105
static Grid * restore(std::istream &stream, Comm comm=Comm())
read a hierarchic grid from a stream
Definition: backuprestore.hh:149
static Grid * restore(const std::string &filename, Comm comm=Comm())
read a hierarchic grid from disk
Definition: backuprestore.hh:134
static void backup(const Grid &grid, const std::string &filename)
write a hierarchic grid to disk
Definition: backuprestore.hh:89
static void backup(const Grid &grid, const std::string &filename)
write a hierarchic grid to disk
Definition: backuprestore.hh:231
static Grid * restore(std::istream &stream, Comm comm=Comm())
read a hierarchic grid from disk
Definition: backuprestore.hh:292
static Grid * restore(const std::string &filename, Comm comm=Comm())
read a hierarchic grid from disk
Definition: backuprestore.hh:273
static void backup(const Grid &grid, std::ostream &stream)
write a hierarchic grid to disk
Definition: backuprestore.hh:246
facility for writing and reading grids
Definition: backuprestore.hh:43
static Grid * restore(const std::string &)
read a hierarchic grid from disk
Definition: backuprestore.hh:78
static void backup(const Grid &, const std::string &)
write a hierarchic grid to disk
Definition: backuprestore.hh:51