aboutsummaryrefslogtreecommitdiff
path: root/src/AMRwriter.hh
blob: 61114caacee1fe45cf4c17313d7506e0d8364d6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
// AMRwriter
#ifndef __AMRWRITER_HH_
#define __AMRWRITER_HH_

#include "Arch.h"
#include "IO.hh"
#include "Writer.hh"
#include "FlexArrayTmpl.H"

class AMRwriter : public Writer{
protected:
  struct LevelParams {
    int srefine[3]; // grid refinement
    int prefine[3]; // placement refinement
    int trefine; // time refinement
  };
  double basetimestep,currentorigin[3],currentdelta[3];
  FlexArray<LevelParams> levels;
  int iorigin[3];
  int currentlevel,currentstep;
	
  void writeAMRattributes();
private:
  virtual void setOrigin(int *origin); // logical origin
  virtual void setOrigin(float *origin); // real origin
  virtual void setOrigin(double *origin); // real origin
  // virtual void setDelta(double *delta) { Writer::setOrigin(delta); }
  virtual void setDims(int *dims) { Writer::setDims(dims);}
  virtual void setDims(int rank, int *dims) { Writer::setDims(rank,dims); }
  virtual void write(void *data);
  virtual void setRank(int rank) {Writer::setRank(rank); } 
public: //====================================================
  enum Flags {MaxDepth=-1};
  AMRwriter(IObase &descriptor);
  virtual ~AMRwriter();
  //------------Initialization Methods------------------
  virtual void setType(IObase::DataType numbertype) { Writer::setType(numbertype); }
  virtual void setTopLevelParameters(int rank,double *origin,
				     double *delta,double timestep,int maxdepth);
  virtual void setRefinement(int timerefinement,
			     int *spatialrefinement,
			     int *gridplacementrefinement=0);  
  virtual void setRefinement(int timerefinement,
			     int spatialrefinement,
			     int gridplacementrefinement=1);
  virtual void setLevelRefinement(int level,
				  int timerefinement,
				  int *spatialrefinement,
				  int *gridplacementrefinement=0);
  virtual void setLevelRefinement(int level,
				  int timerefinement,
				  int spatialrefinement,
				  int gridplacementrefinement=1);
  //-----------Stepping Parameters------------------
  virtual void setLevel(int level) { currentlevel=level; }
  virtual void setTime(int timestep) { currentstep=timestep;}
  virtual void incrementTime() {currentstep++;}
  // virtual void setDeltaTime(double dt) {deltatime=dt;}
  virtual void write(int *origin,int *dims,void *data){
    setOrigin(origin);
    setDims(dims);
    write(data);
  } 
  virtual void write(float *origin,int *dims,void *data){
    setOrigin(origin);
    setDims(dims);
    write(data);
  }
  virtual void write(double *origin,int *dims,void *data){
    // create iorigin from origin...
    setOrigin(origin);
    setDims(dims);
    write(data);
  }
};


class FrameworkAMRwriter : protected AMRwriter {
  int nlevels;
  int maxrefinement;
  int refinement;
public:
   /*@@
   @routine    FrameworkAMRwriter::FrameworkAMRwriter
   @date       Tue Apr 15 14:23:32 1997
   @author     John Shalf
   @desc 
   Constructor for the FrameworkAMRwriter.  It makes many assumptions about the
   way that users of the framework would like to store their data.  This eliminates
   or hides most of the calls that AMRwriter:: would need to describe the AMR grid
   heirarchy.
   @enddesc 
   @calls     
   @calledby   
   @history 
 
   @endhistory 

@@*/

  FrameworkAMRwriter(IObase &descriptor):AMRwriter(descriptor),
    nlevels(1),maxrefinement(1),refinement(2){}
  virtual ~FrameworkAMRwriter() {}
  /*
    This is set ONCE right after you open your AMR file.  It is not
    built into the constructor because you may not have the information
    necessary to do this at the time of construction...
  */
   /*@@
   @routine    FrameworkAMRwriter::setParameters
   @date       Tue Apr 15 14:00:40 1997
   @author     John Shalf
   @desc   This is set ONCE right after you open your AMR file.  It is not
    built into the constructor because you may not have the information
    necessary to do this at the time of construction...
    This sets parameters necessary do define the AMR heirarchy, namely
    the refinement between levels and the floating-point parameters that
    form the basis for locating the grids in 3-space in a visualization system.
   @enddesc 
      @par     rank
   @pdesc   The number of dimensions for the dataset
   @ptype   int
   @pvalues 1-5
   @pcomment 
   This calls setRank() in the base Writer() class
   @endpar 

      @par     origin
   @pdesc   The origin of the toplevel (coarsest) grid in REAL coordinates
   @ptype   double*
   @endpar 
   
      @par     delta
   @pdesc   The inter-grid spacing at the toplevel (coarsest level) in REAL coordinates.
   @ptype   double
   @pcomment 
   The inter-grid spacing is divided by the refinement factor for a particular level
   to determine the real grid spacing for that nested grid.
   This assumes you have a uniform grid delta (same delta in all spatial directions).
   @endpar 

      @par     timestep
   @pdesc   The REAL size of a toplevel (coarsest) timestep
   @ptype   double
   @pvalues 
   @endpar 

      @par     interlevelRefinementRatio
   @pdesc   The integer ratio of time refinement and spatial refinement between levels.
   @ptype   int
   @pvalues Any positive integer > 0
   @pcomment 
   This ratio is used to determine the spatial refinement for a level.
   So spatialrefinement_on_this_level = toplevel_delta / interlevelRefinementRatio^level
   Where the levels are numbered from 0:nlevels-1.
   This assumes that you have the same refinement factor in all spatial directions as
   well as in time.
   @endpar 

      @par     numLevels
   @pdesc   The maximum number of levels in the AMR heirarchy.
   @ptype   int
   @pvalues Any positive integer > 0
   @pcomment 
   This is necessary to find out the resolution of the finest-grid for the 
   purposes of grid-placement in the AMR file.  Otherwise we wouldn't be able
   to interpret the above parameters.
   @endpar 

   @calls     AMRwriter::setTopLevelParameters
   @calledby   
   @history 
   @endhistory 

@@*/

  virtual void init(int rank, // number of dimensions in the dataset
		    double *origin, // REAL origin or coarsest level grid
		    double *delta, // float grid spacing at coarsest level
		    double timestep, // float timestep at coarsest level
		    int interlevelRefinementRatio, //refinement ratio with
		    // between levels.  This covers refinement of time stepping
		    // as well
		    int numLevels); // the maximum depth of the AMR grid heirarchy
  virtual void init(  IObase::DataType dt, // type for all data
		      int rank, // number of dimensions in the dataset
		      double *origin, // REAL origin or coarsest level grid
		      double *delta, // float grid spacing at coarsest level
		      double timestep, // float timestep at coarsest level
		      int interlevelRefinementRatio, //refinement ratio with
		      // between levels.  This covers refinement of time stepping
		      // as well
		      int numLevels);
  // This is called on every write
  /*@@
    @routine    FrameworkAMRwriter::write
    @date       Tue Apr 15 14:14:48 1997
   @author     John Shalf
   @desc 
   This is called on every write to set the parameters for a particular grid.
   @enddesc 
   @calls  AMRwriter::setGrid AMRwriter::write 
   @calledby
      @par     level
   @pdesc   The current AMR level for this grid
   @ptype   int
   @pvalues 0 to nlevels-1
   @endpar 

      @par     globaltimestep
   @pdesc   The current global timestep (stepping at the finest resolution level)
   @ptype   int
   @pvalues Any positive integer
   @pcomment 
   So we step at finest time resolution instead of resolution relative to this level.
   @endpar 

      @par     origin
   @pdesc   The integer origin of the grid using coordinates relative to the finest resolution grid in the heirarchy.
   @ptype   int*
   @pvalues Any positive integer > 0
   @pcomment 
   So grid placement is with respect to the finest level integer coordinates.
   @endpar 

      @par     dims
   @pdesc   The dimensions of the array (dims of the grid).
   @ptype   int*
   @endpar 

      @par     data
   @pdesc   Pointer to the data array for the grid.
   @ptype   void*
   @endpar 


   @history 
 
   @endhistory 

@@*/

  virtual void write(int level,
	     int globaltimestep,
	     int *origin,
	     int *dims,
	     void *data) {
    AMRwriter::setLevel(level);
    AMRwriter::setTime(globaltimestep);
    AMRwriter::write(origin,dims,data);
  }
  
};

#define f_amr_begin F77NAME(amr_begin_,amr_begin,AMR_BEGIN)
#define f_amr_end F77NAME(amr_end_,amr_end,AMR_END)
#define f_amr_settype F77NAME(amr_settype_,amr_settype,AMR_SETTYPE)
#define f_amr_setparams F77NAME(amr_setparams_,amr_setparams,AMR_SETPARAMS)
#define f_amr_setref F77NAME(amr_setref_,amr_setref,AMR_SETREF)
#define f_amr_setlref F77NAME(amr_setlref_,amr_setlref,AMR_SETLREF)
#define f_amr_setdims F77NAME(amr_setdims_,amr_setdims,AMR_SETDIMS)
#define f_amr_setlevel F77NAME(amr_setlevel_,amr_setlevel,AMR_SETLEVEL)
#define f_amr_settime F77NAME(amr_settime_,amr_settime,AMR_SETTIME)
#define f_amr_incrtime F77NAME(amr_incrtime_,amr_incrtime,AMR_INCRTIME)
#define f_amr_write F77NAME(amr_write_,amr_write,AMR_WRITE)

extern "C" {
#include "AMRwriter.h"
Long8 f_amr_begin (Long8 *descriptor);
int f_amr_end (Long8 *afile);
int f_amr_settype (Long8 *afile,int *numbertype);
int f_amr_setparams (Long8 *afile,int *rank,double *origin,
				   double *delta, double *timestep,int maxdepth);
int f_amr_setref (Long8 *afile,int veclen,
		      int *timerefinement,
		      int *spatialrefinement,int *gridplacementrefinement);
int f_amr_setlref (Long8 *afile,int *level,int *veclen,
			 int *timerefinement,
			 int *spatialrefinement,int *gridplacementrefinement);
int f_amr_setlevel (Long8 *afile,int *level);
int f_amr_settime (Long8 *afile,int *timestep);
int f_amr_incrtime (Long8 *afile);
int f_amr_write (Long8 *afile,int *origin,int *dims,void *data);
  int f_amr_writef (Long8 *afile,float *origin,int *dims,void *data);
  int f_amr_writed (Long8 *afile,double *origin,int *dims,void *data);
}

#endif