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