1 | function parseresultsfrombuffer(buffer,buffersize){ //{{{
|
---|
2 | //PARSERESULTSFROMDISK - ...
|
---|
3 | //
|
---|
4 | // Usage:
|
---|
5 | // results=parseresultsfrombuffer(buffer,buffersize);
|
---|
6 |
|
---|
7 | //Open file
|
---|
8 | results=[];
|
---|
9 |
|
---|
10 | var fid = new fileptr('mode','r','buffer',buffer,'buffersize',buffersize);
|
---|
11 |
|
---|
12 | //Read fields until the end of the file.
|
---|
13 | result = ReadData(fid);
|
---|
14 |
|
---|
15 | if (MapIsEmpty(result))throw Error('no results found in binary memory buffer');
|
---|
16 |
|
---|
17 | var counter = 0;
|
---|
18 | var check_nomoresteps=0;
|
---|
19 | var step = result['step'];
|
---|
20 |
|
---|
21 | while (!MapIsEmpty(result)){
|
---|
22 |
|
---|
23 | if (check_nomoresteps){
|
---|
24 | //check that the new result does not add a step, which would be an error:
|
---|
25 | if (result['step']>=1)throw Error('parsing results for a steady-state core, which incorporates transient results!');
|
---|
26 | }
|
---|
27 |
|
---|
28 | //Check step, increase counter if this is a new step
|
---|
29 | if(step!=result['step'] & result['step']>1){
|
---|
30 | counter = counter + 1;
|
---|
31 | step = result['step'];
|
---|
32 | }
|
---|
33 |
|
---|
34 | //Add result
|
---|
35 | if(result['step']==0){
|
---|
36 | //if we have a step = 0, this is a steady state solutoin, don't expect more steps.
|
---|
37 | index = 0;
|
---|
38 | check_nomoresteps=1;
|
---|
39 | }
|
---|
40 | else if(result['step']==1){
|
---|
41 | index = 0;
|
---|
42 | }
|
---|
43 | else index = counter;
|
---|
44 |
|
---|
45 | if(index>results.length-1)results.push({});
|
---|
46 | for(var i=results.length-1;i<index-1;i++)results[i]={};
|
---|
47 | results[index][result['fieldname']]=result['field'];
|
---|
48 |
|
---|
49 | //Get time and step
|
---|
50 | if(result['time']!=-9999){
|
---|
51 | results[index]['step']=result['step'];
|
---|
52 | }
|
---|
53 | if(result['time']!=-9999){
|
---|
54 | results[index]['time']=result['time'];
|
---|
55 | }
|
---|
56 |
|
---|
57 | //read next result
|
---|
58 | result = ReadData(fid);
|
---|
59 | }
|
---|
60 | return results;
|
---|
61 | } // }}}
|
---|
62 | function ReadData(fid){ //{{{
|
---|
63 | //READDATA - ...
|
---|
64 | //
|
---|
65 | // Usage:
|
---|
66 | // field=ReadData(fid)
|
---|
67 |
|
---|
68 | //read field
|
---|
69 | var length=fid.fread(1,'int');
|
---|
70 |
|
---|
71 | var result={};
|
---|
72 |
|
---|
73 | if (length!==-1){
|
---|
74 | fieldname=fid.fread(length,'char');
|
---|
75 | time=fid.fread(1,'double');
|
---|
76 | step=fid.fread(1,'int');
|
---|
77 | type=fid.fread(1,'int');
|
---|
78 | M=fid.fread(1,'int');
|
---|
79 |
|
---|
80 | if (type==1) field=fid.fread(M,'double');
|
---|
81 | else if (type==2) field=fid.fread(M,'char');
|
---|
82 | else if (type==3) {
|
---|
83 | N=fid.fread(1,'int');
|
---|
84 | field=fid.fread(N*M,'double');
|
---|
85 | }
|
---|
86 | else throw Error(sprintf("%s%i",'ReadData error message: cannot read data of type ',type));
|
---|
87 |
|
---|
88 | //Process units here FIXME: this should not be done here!
|
---|
89 | var yts=365.0*24.0*3600.0;
|
---|
90 | if (fieldname == 'BalancethicknessThickeningRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
91 | else if (fieldname == 'HydrologyWaterVx') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
92 | else if (fieldname == 'HydrologyWaterVy') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
93 | else if (fieldname == 'Vx') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
94 | else if (fieldname == 'Vy') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
95 | else if (fieldname == 'Vz') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
96 | else if (fieldname == 'Vel') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
97 | else if (fieldname == 'BasalforcingsGroundediceMeltingRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
98 | else if (fieldname == 'BasalforcingsFloatingiceMeltingRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
99 | else if (fieldname == 'TotalSmb') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
|
---|
100 | else if (fieldname == 'SmbMassBalance') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
101 | else if (fieldname == 'SmbPrecipitation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
102 | else if (fieldname == 'SmbRunoff') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
103 | else if (fieldname == 'SmbCondensation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
104 | else if (fieldname == 'SmbAccumulation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
105 | else if (fieldname == 'SmbMelt') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
106 | else if (fieldname == 'CalvingCalvingrate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
|
---|
107 |
|
---|
108 | result['fieldname']=fieldname;
|
---|
109 | result['time']=time;
|
---|
110 | if (result['time']!=-9999) result['time']=time/yts;
|
---|
111 | result['step']=step;
|
---|
112 | result['field']=field;
|
---|
113 | }
|
---|
114 | return result;
|
---|
115 |
|
---|
116 | } // }}}
|
---|