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
|
#include "AMRwriter.hh"
#include "AMRgridPlus.h"
/*
* AMRwriterPlus:
* A subclass of AMRwriter which adds a scalar range attribute
* to each dataset. The AMRwriter interface is unchanged, however
* for convenience, you can:
*
* Set the top level parameters or write a dataset by passing a
* pointer to an AMRgridPlus datastructure to ::setTopLevelParameters
* or ::write respectively
*
* Set the scalar range of the dataset explicitly (before writing)
* with ::setScalarRange. If this is not called, the scalar range will
* be computed from within ::write. Useful (and timesaving) if you
* have already computed the range.
*/
class AMRwriterPlus : public AMRwriter{
public:
AMRwriterPlus(IObase &descriptor);
virtual void setTopLevelParameters(AMRgridPlus *g){
AMRwriter::setTopLevelParameters(g->rank, g->origin, g->delta, \
g->timestep, g->maxlevel);
}
// CC forces me to re-overload this inherited method!
virtual void setTopLevelParameters(int rank,double *origin,
double *delta,double timestep,int maxdepth){
AMRwriter::setTopLevelParameters(rank, origin, delta, timestep, maxdepth);
}
void setScalarRange(double smin,double smax){
curscalarmin=smin;curscalarmax=smax;scalarFlag=1;}
void write(int *origin,int *dims,void *data){
AMRwriter::write(origin, dims, data);
if (!scalarFlag) calcScalarRange(data);
writePlusattributes();
}
void write(float *origin,int *dims,void *data){
AMRwriter::write(origin, dims, data);
if (!scalarFlag) calcScalarRange(data);
writePlusattributes();
}
void write(double *origin,int *dims,void *data){
AMRwriter::write(origin, dims, data);
if (!scalarFlag) calcScalarRange(data);
writePlusattributes();
}
virtual void write(AMRgridPlus *g, int calcscalars=0){
setType((IObase::DataType)g->datatype);
setLevel(g->level);
setTime(g->timestep);
write(g->origin, g->dims, g->data);
}
protected:
void writePlusattributes();
private:
void calcScalarRange(void *data);
double curscalarmin, curscalarmax;
int scalarFlag;
};
|