3#ifndef DUNE_GRID_YASPGRID_BACKUPRESTORE_HH
4#define DUNE_GRID_YASPGRID_BACKUPRESTORE_HH
10#include <dune/common/exceptions.hh>
11#include <dune/common/fvector.hh>
12#include <dune/grid/common/backuprestore.hh>
17#define YASPGRID_BACKUPRESTORE_FORMAT_VERSION 2
22 template<
class Coordinates>
23 struct MaybeHaveOrigin
27 static void writeOrigin(S& ,
const Coordinates& )
31 static void readOrigin(S& , Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& )
34 template<
typename... A>
36 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& , A... args)
42 template<
class ctype,
int dim>
43 struct MaybeHaveOrigin<
Dune::EquidistantOffsetCoordinates<ctype, dim> >
48 static void writeOrigin(S& s,
const Coordinates& coord)
51 for (
int i=0; i<dim; i++)
52 s << coord.
origin(i) <<
" ";
57 static void readOrigin(S& s, Dune::FieldVector<ctype, dim>& coord)
61 for (
int i=0; i<dim; i++)
65 template<
typename... A>
67 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& lowerleft,
68 const Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension>& extension, A... args)
70 Dune::FieldVector<typename Coordinates::ctype,Coordinates::dimension> upperright(lowerleft);
71 upperright += extension;
77 template<
int dim,
class Coordinates>
86 static void backup (
const Grid &grid,
const std::string &filename )
88 if (grid.
comm().rank() == 0)
90 std::ofstream file(filename);
97 std::cerr <<
"ERROR: BackupRestoreFacility::backup: couldn't open file `" << filename <<
"'" << std::endl;
102 static void backup (
const Grid &grid, std::ostream &stream )
104 stream <<
"YaspGrid BackupRestore Format Version: " << YASPGRID_BACKUPRESTORE_FORMAT_VERSION << std::endl;
105 stream <<
"Torus structure: ";
106 for (
int i=0; i<dim; i++)
108 stream << std::endl <<
"Refinement level: " << grid.
maxLevel() << std::endl;
109 stream <<
"Periodicity: ";
110 for (
int i=0; i<dim; i++)
112 stream << std::endl <<
"Overlap: " << grid.
overlapSize(0,0) << std::endl;
113 stream <<
"KeepPhysicalOverlap: ";
115 stream << (i->keepOverlap ?
"1" :
"0") <<
" ";
117 stream <<
"Coarse Size: ";
118 for (
int i=0; i<dim; i++)
121 stream <<
"Meshsize: " ;
122 for (
int i=0; i<dim; i++)
123 stream << grid.
begin()->coords.meshsize(i,0) <<
" ";
125 MaybeHaveOrigin<Coordinates>::writeOrigin(stream, grid.
begin()->coords);
129 static Grid *
restore (
const std::string &filename, Comm comm = Comm())
131 std::ifstream file(filename);
136 std::cerr <<
"ERROR: BackupRestoreFacility::restore: couldn't open file `" << filename <<
"'" << std::endl;
147 stream >> input >> input >> input >> input;
149 if (version != YASPGRID_BACKUPRESTORE_FORMAT_VERSION)
150 DUNE_THROW(Dune::Exception,
"Your YaspGrid backup file is written in an outdated format!");
152 std::array<int,dim> torus_dims;
153 stream >> input >> input;
154 for (
int i=0; i<dim; i++)
155 stream >> torus_dims[i];
158 stream >> input >> input;
159 stream >> refinement;
161 std::bitset<dim> periodic;
164 for (
int i=0; i<dim; i++)
174 std::vector<bool> physicalOverlapSize;
175 physicalOverlapSize.resize(refinement);
177 for (
int i=0; i<refinement; ++i)
180 physicalOverlapSize[i] = b;
183 std::array<int,dim> coarseSize;
184 stream >> input >> input;
185 for (
int i=0; i<dim; i++)
186 stream >> coarseSize[i];
188 Dune::FieldVector<ctype,dim> h;
190 for (
int i=0; i<dim; i++)
193 Dune::FieldVector<ctype,dim> origin;
194 MaybeHaveOrigin<Coordinates>::readOrigin(stream, origin);
197 Dune::FieldVector<ctype,dim> length(h);
198 for (
int i=0; i<dim; i++)
199 length[i] *= coarseSize[i];
203 Grid* grid = MaybeHaveOrigin<Coordinates>::createGrid(origin, length, coarseSize, periodic, overlap, comm, &lb);
205 for (
int i=0; i<refinement; ++i)
216 template<
int dim,
class ctype>
224 static void backup (
const Grid &grid,
const std::string &filename )
226 std::ostringstream filename_str;
227 filename_str << filename << grid.
comm().rank();
228 std::ofstream file( filename_str.str() );
235 std::cerr <<
"ERROR: BackupRestoreFacility::backup: couldn't open file `" << filename_str.str() <<
"'" << std::endl;
239 static void backup (
const Grid &grid, std::ostream &stream )
241 stream <<
"YaspGrid BackupRestore Format Version: " << YASPGRID_BACKUPRESTORE_FORMAT_VERSION << std::endl;
242 stream <<
"Torus structure: ";
243 for (
int i=0; i<dim; i++)
245 stream << std::endl <<
"Refinement level: " << grid.
maxLevel() << std::endl;
246 stream <<
"Periodicity: ";
247 for (
int i=0; i<dim; i++)
249 stream << std::endl <<
"Overlap: " << grid.
overlapSize(0,0) << std::endl;
250 stream <<
"KeepPhysicalOverlap: ";
252 stream << (i->keepOverlap ?
"1" :
"0") <<
" ";
254 stream <<
"Coarse Size: ";
255 for (
int i=0; i<dim; i++)
259 grid.
begin()->coords.print(stream);
263 static Grid *
restore (
const std::string &filename, Comm comm = Comm())
265 std::ostringstream filename_str;
266 filename_str << filename;
267 filename_str << comm.rank();
268 std::ifstream file(filename_str.str());
273 std::cerr <<
"ERROR: BackupRestoreFacility::restore: couldn't open file `" << filename_str.str() <<
"'" << std::endl;
284 stream >> input >> input >> input >> input;
286 if (version != YASPGRID_BACKUPRESTORE_FORMAT_VERSION)
287 DUNE_THROW(Dune::Exception,
"Your YaspGrid backup file is written in an outdated format!");
289 std::array<int,dim> torus_dims;
290 stream >> input >> input;
291 for (
int i=0; i<dim; i++)
292 stream >> torus_dims[i];
295 stream >> input >> input;
296 stream >> refinement;
298 std::bitset<dim> periodic;
301 for (
int i=0; i<dim; i++)
311 std::vector<bool> physicalOverlapSize;
312 physicalOverlapSize.resize(refinement);
314 for (
int i=0; i<refinement; ++i)
317 physicalOverlapSize[i] = b;
321 std::array<int,dim> coarseSize;
322 stream >> input >> input;
323 for (
int i=0; i<dim; i++)
324 stream >> coarseSize[i];
326 std::array<std::vector<ctype>,dim> coords;
327 stream >> input >> input >> input >> input;
328 for (
int d=0; d<dim; d++)
330 stream >> input >> input;
335 coords[d].resize(size);
336 for (
int i=0; i<size; i++)
344 Grid* grid =
new Grid(coords, periodic, overlap, comm, coarseSize, &lb);
346 for (
int i=0; i<refinement; ++i)
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition: coordinates.hh:129
ct origin(int d) const
Definition: coordinates.hh:183
GridFamily::Traits::CollectiveCommunication CollectiveCommunication
A type that is a model of Dune::CollectiveCommunication. It provides a portable way for collective co...
Definition: grid.hh:518
Coordinate container for a tensor product YaspGrid.
Definition: coordinates.hh:243
const iTupel & dims() const
return dimensions of torus
Definition: torus.hh:110
Implement partitioner that gets a fixed partitioning from an array If the given partitioning doesn't ...
Definition: partitioning.hh:116
[ provides Dune::Grid ]
Definition: yaspgrid.hh:160
void globalRefine(int refCount)
refine the grid refCount times.
Definition: yaspgrid.hh:1207
const Torus< CollectiveCommunicationType, dim > & torus() const
return reference to torus
Definition: yaspgrid.hh:238
YGridLevelIterator end() const
return iterator pointing to one past the finest level
Definition: yaspgrid.hh:299
int maxLevel() const
Definition: yaspgrid.hh:1201
int overlapSize(int level, int codim) const
return size (= distance in graph) of overlap region
Definition: yaspgrid.hh:1390
const CollectiveCommunicationType & comm() const
return a collective communication object
Definition: yaspgrid.hh:1748
bool isPeriodic(int i) const
return whether the grid is periodic in direction i
Definition: yaspgrid.hh:271
void refineOptions(bool keepPhysicalOverlap)
set options for refinement
Definition: yaspgrid.hh:1261
ReservedVector< YGridLevel, 32 >::const_iterator YGridLevelIterator
Iterator over the grid levels.
Definition: yaspgrid.hh:282
Coordinates::ctype ctype
Type used for coordinates.
Definition: yaspgrid.hh:172
int levelSize(int l, int i) const
return size of the grid (in cells) on level l in direction i
Definition: yaspgrid.hh:256
YGridLevelIterator begin() const
return iterator pointing to coarsest level
Definition: yaspgrid.hh:285
Include standard header files.
Definition: agrid.hh:58
static void backup(const Grid &grid, std::ostream &stream)
Definition: backuprestore.hh:102
static Grid * restore(std::istream &stream, Comm comm=Comm())
Definition: backuprestore.hh:142
static Grid * restore(const std::string &filename, Comm comm=Comm())
Definition: backuprestore.hh:129
static void backup(const Grid &grid, const std::string &filename)
Definition: backuprestore.hh:86
static void backup(const Grid &grid, const std::string &filename)
Definition: backuprestore.hh:224
static Grid * restore(std::istream &stream, Comm comm=Comm())
Definition: backuprestore.hh:279
static Grid * restore(const std::string &filename, Comm comm=Comm())
Definition: backuprestore.hh:263
static void backup(const Grid &grid, std::ostream &stream)
Definition: backuprestore.hh:239
facility for writing and reading grids
Definition: backuprestore.hh:41
static Grid * restore(const std::string &filename)
read a hierarchic grid from disk
Definition: backuprestore.hh:76
static void backup(const Grid &grid, const std::string &filename)
write a hierarchic grid to disk
Definition: backuprestore.hh:49