/[MITgcm]/MITgcm_contrib/heimbach/OpenAD/code_regress/loopwrapper.C
ViewVC logotype

Annotation of /MITgcm_contrib/heimbach/OpenAD/code_regress/loopwrapper.C

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Tue Nov 20 15:20:58 2007 UTC (17 years, 8 months ago) by utke
Branch: MAIN
CVS Tags: HEAD
File MIME type: text/plain
adding regression test code

1 utke 1.1 #include <iostream>
2    
3     class CP {
4     public:
5     static const int levels=4; // the number of levels
6     int maxIter; // maximal iteration
7     int aL[levels]; // allowed per level
8     int uL[levels]; // used per level
9     int iL[levels]; // current iteration per level
10     int changedLevel; // level changed due to increment or decrement
11     int topLevel; // the top Level
12     int cpLevel; // current checkpoint level
13     int tapeLevel; // current taping level
14     int adjointLevel; // current adjoint level
15    
16     CP() {
17     maxIter=0;
18     for (int i=0;i<levels;i++) {
19     iL[i]=aL[i]=uL[i]=ufL[i]=0;
20     }
21     topLevel=0;
22     cpLevel=0;
23     tapeLevel=0;
24     adjointLevel=0;
25     }
26    
27     void init(){
28     // determine top level
29     topLevel=0;
30     int steps=1;
31     for(int i=0;i<levels;i++) {
32     steps*=aL[i];
33     if (steps<maxIter)
34     topLevel++;
35     else
36     break;
37     }
38     if (topLevel>=levels) {
39     std::cerr << "insufficient checkpoints" << std::endl;
40     }
41     for(int i=0;i<topLevel;i++) {
42     iL[i]=1;
43     }
44     // determine uses:
45     steps/=aL[topLevel];
46     uL[topLevel]=1+maxIter/steps;
47     for(int i=topLevel-1;i>=0;i--) {
48     uL[i]=aL[i];
49     }
50     // determine final uses:
51     ufL[topLevel]=uL[topLevel];
52     steps=maxIter%steps;
53     for(int i=topLevel-1;i>=0;i--) {
54     // determine top level for the rest
55     int rTopLevel=0;
56     int rsteps=1;
57     for(int j=0;j<=i;j++) {
58     rsteps*=aL[j];
59     if (rsteps<steps)
60     rTopLevel++;
61     else
62     break;
63     }
64     rsteps/=aL[rTopLevel];
65     ufL[rTopLevel]=steps/rsteps;
66     steps%=rsteps;
67     }
68     for(int i=0;i<levels;i++) {
69     std::cout << "level " << i << " aL: " << aL[i] << " uL: " << uL[i] << " ufL: " << ufL[i] << std::endl;
70     }
71     }
72    
73     void operator++() {
74     for(changedLevel=0;changedLevel<topLevel;changedLevel++) {
75     if (iL[changedLevel]==uL[changedLevel])
76     iL[changedLevel]=1;
77     else {
78     il[changedLevel]++;
79     break;
80     }
81     }
82     }
83    
84     void operator--() {
85     for(changedLevel=0;changedLevel<levels;changedLevel++) {
86     if (iL[changedLevel]==1) {
87     iL[changedLevel]=uL[iLc];
88     for (int i=changedLevel;i<levels; i++) {
89    
90     }
91     }
92     else {
93     il[changedLevel]--;
94     break;
95     }
96     }
97     }
98    
99    
100     };
101    
102     void cpscheme(int iter,
103     bool adjoint,
104     CP& cp) {
105     int i;
106     if (!adjoint) {
107     // increment a level and remember which level changes:
108     int iLc; // the level that changes:
109     for(iLc=0;iLc<levels;iLc++) {
110     if (iL[iLc]==uL[iLc])
111     iL[iLc]=1;
112     else {
113     il[iLc]++;
114     break;
115     }
116     }
117     if (iLc==cpLevel) {
118     // do checkpoint
119     }
120     }
121     else { // do the adjoint
122     // decrement a level and remember which level changes:
123     int iLc; // the level that changes:
124     for(iLc=0;iLc<levels;iLc++) {
125     if (iL[iLc]==1)
126     iL[iLc]=ul;
127     else {
128     il[iLc]++;
129     break;
130     }
131     }
132     if (iLc==cpLevel) {
133     // do checkpoint
134     }
135     }
136     }
137    
138     int main(void) {
139     CP cp;
140     std::cout << "maxIter: ";
141     std::cin >> cp.maxIter;
142     cp.aL[0]=3;
143     cp.aL[1]=4;
144     cp.aL[2]=5;
145     cp.aL[3]=6;
146     cp.init();
147    
148     for (int i=0;i<maxIter;i++) {
149     cpscheme(i, cp);
150     }
151     }
152    

  ViewVC Help
Powered by ViewVC 1.1.22