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

Last change on this file since 19816 was 19816, checked in by Eric.Larour, 9 years ago

CHG: finished loading results from the issm module, using an output memory buffer.
Also finished test101.html, providing results identical to test101.m

File size: 4.0 KB
Line 
1function 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} // }}}
62function 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} // }}}
Note: See TracBrowser for help on using the repository browser.