aboutsummaryrefslogtreecommitdiff
path: root/src/AMRPlus/AMRwriterPlus.h
blob: a3c47ffca319371f036b144376d7e66d8d41a20e (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
#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;
};