[20900] | 1 | function 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] | 59 | function 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)
|
---|
| 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 | } // }}}
|
---|