source: issm/trunk-jpl/src/m/solve/parseresultsfrombuffer.js@ 23889

Last change on this file since 23889 was 23889, checked in by Mathieu Morlighem, 6 years ago

CHG: output results in Gt/yr instead

File size: 4.4 KB
RevLine 
[20900]1function parseresultsfrombuffer(md,buffer,buffersize){ //{{{
[19816]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.
[20900]9 result = ReadData(fid,md);
[19816]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'];
[19831]16 var index;
[19816]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
[20900]55 result = ReadData(fid,md);
[19816]56 }
57 return results;
58} // }}}
[20900]59function ReadData(fid,md){ //{{{
[19816]60//READDATA - ...
61//
62// Usage:
[20900]63// field=ReadData(fid,md)
[19816]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 }
[21674]83 else if (type==4) {
84 N=fid.fread(1,'int');
85 field=fid.fread(N*M,'int');
86 }
[19816]87 else throw Error(sprintf("%s%i",'ReadData error message: cannot read data of type ',type));
88
89 //Process units here FIXME: this should not be done here!
[20900]90 var yts=md.constants.yts;
[19816]91 if (fieldname == 'BalancethicknessThickeningRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
92 else if (fieldname == 'HydrologyWaterVx') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
93 else if (fieldname == 'HydrologyWaterVy') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
94 else if (fieldname == 'Vx') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
95 else if (fieldname == 'Vy') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
96 else if (fieldname == 'Vz') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
97 else if (fieldname == 'Vel') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
98 else if (fieldname == 'BasalforcingsGroundediceMeltingRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
99 else if (fieldname == 'BasalforcingsFloatingiceMeltingRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
100 else if (fieldname == 'TotalSmb') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
[22330]101 else if (fieldname == 'TotalSmbScaled') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
[23889]102 else if (fieldname == 'GroundinglineMassFlux') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
103 else if (fieldname == 'IcefrontMassFlux') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
[19816]104 else if (fieldname == 'SmbMassBalance') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
105 else if (fieldname == 'SmbPrecipitation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
106 else if (fieldname == 'SmbRunoff') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
107 else if (fieldname == 'SmbCondensation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
108 else if (fieldname == 'SmbAccumulation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
109 else if (fieldname == 'SmbMelt') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
110 else if (fieldname == 'CalvingCalvingrate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
111
112 result['fieldname']=fieldname;
113 result['time']=time;
114 if (result['time']!=-9999) result['time']=time/yts;
115 result['step']=step;
116 result['field']=field;
117 }
118 return result;
119
120} // }}}
Note: See TracBrowser for help on using the repository browser.