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

Last change on this file since 21674 was 21674, checked in by tsantos, 8 years ago

CHG: changes to add AMR capability; new class (amr.m) and new results (mesh). AMR capability in test.

File size: 4.0 KB
Line 
1function 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} // }}}
59function 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 if (type==4) {
84 N=fid.fread(1,'int');
85 field=fid.fread(N*M,'int');
86 }
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!
90 var yts=md.constants.yts;
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)
101 else if (fieldname == 'SmbMassBalance') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
102 else if (fieldname == 'SmbPrecipitation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
103 else if (fieldname == 'SmbRunoff') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
104 else if (fieldname == 'SmbCondensation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
105 else if (fieldname == 'SmbAccumulation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
106 else if (fieldname == 'SmbMelt') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
107 else if (fieldname == 'CalvingCalvingrate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
108
109 result['fieldname']=fieldname;
110 result['time']=time;
111 if (result['time']!=-9999) result['time']=time/yts;
112 result['step']=step;
113 result['field']=field;
114 }
115 return result;
116
117} // }}}
Note: See TracBrowser for help on using the repository browser.