aboutsummaryrefslogtreecommitdiff
path: root/src/AMRPlus/AMRreaderPlus.h
blob: 6bd338721f8936e76b7474e4634ac78748300432 (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
#ifndef __AMRREADERPLUS_HH_
#define __AMRREADERPLUS_HH_

#include <set>
#include <vector>
#include <IO.hh>
#include "AMRgridreaderPlus.h"
#include "IEEEIO.hh"

#include "flexmatrix.h"
#include "flexset.h"
#define kNoData 0
#define kHasData 1

/* Method for calculating scalar range - the global range,
range per fine timestep, per coarse, or per (current) root. */
typedef enum {kGlobal,kFine,kCoarse,kRoot} ScalarMode;

using namespace std;



typedef flexarray<int> IntArray;



typedef flexarray<int> IdxArray;


class AMRreaderPlus : public AMRgridreaderPlus {
    public:
    int datatype;
    int numgrids;
    int maxlevel,maxtimeres,maxtime;
    double smin,smax;
    int modflag;
    
    IdxSet activeset;
    flexset<float> realtimes;
    flexmatrix<IdxArray> *leveltimes;
    GridArray grids;
    IntArray levelmask, timemask;
    
    void init();
    void build_info();
    void build_active();
    void modify();	//Flag that tells when active set has changed
public:
    AMRreaderPlus(IObase &f);
    ~AMRreaderPlus();
    
    int getNumLevels(){return maxlevel+1;}
    int getNumTimesteps(){return maxtime+1;}
    int getNumGrids(){return numgrids;}
    int getDataType(){return datatype;}
    
    void showTimeStep(int ts){
	if (ts>=0 && ts<=maxtime) {timemask[ts]=1; modify();}
	else cout<<"Timestep out of range: "<<ts<<endl;
    }
    void hideTimeStep(int ts){
	if (ts>=0 && ts<=maxtime) {timemask[ts]=0; modify();}
	else cout<<"Timestep out of range: "<<ts<<endl;
    }
    void selectTimeStep(int ts) //Shortcut- hides all times but ts
    { for (int ii=0;ii<=maxtime;ii++) timemask[ii]=(ii==ts)?1:0;modify();}
    
    void showLevel(int lev){
	if (lev>=0 && lev<=maxlevel) {levelmask[lev]=1; modify();}
	else cout<<"Level out of range: "<<lev<<endl;
    }
    void hideLevel(int lev){
	if (lev>=0 && lev<=maxlevel) {levelmask[lev]=0; modify();}
	else cout<<"Level out of range: "<<lev<<endl;
    }
    
    GridArray *getGridSet(){return &grids;}
    void getActive(IdxSet &grids);
    void loadData(IdxSet &loadset);
    void loadData(){loadData(activeset);}
    
};


#endif