Back to home page

MITgcm

 
 

    


Warning, /utils/matlab/rdmeta.m is written in an unsupported language. File is not indexed.

view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
a15d675b90 Alis*0001 function [AA] = rdmds(fname,varargin)
                0002 %
                0003 % Read MITgcmUV Meta/Data files
                0004 %
                0005 % A = RDMDS(FNAME) reads data described by meta/data file format.
                0006 % FNAME is a string containing the "head" of the file names.
                0007 %
                0008 % eg. To load the meta-data files
                0009 %     T.0000002880.000.000.meta, T.0000002880.000.000.data
                0010 %     T.0000002880.001.000.meta, T.0000002880.001.000.data
                0011 %     T.0000002880.002.000.meta, T.0000002880.002.000.data
                0012 %     T.0000002880.003.000.meta, T.0000002880.003.000.data
                0013 % use
                0014 %    >> A=rdmds('T.0000002880');
                0015 %
                0016 % A = RDMDS(FNAME,MACHINEFORMAT) allows the machine format to be specified
                0017 % which MACHINEFORMAT is on of the following strings:
                0018 %
                0019 %   'native'      or 'n' - local machine format - the default
                0020 %   'ieee-le'     or 'l' - IEEE floating point with little-endian
                0021 %                          byte ordering
                0022 %   'ieee-be'     or 'b' - IEEE floating point with big-endian
                0023 %                          byte ordering
                0024 %   'vaxd'        or 'd' - VAX D floating point and VAX ordering
                0025 %   'vaxg'        or 'g' - VAX G floating point and VAX ordering
                0026 %   'cray'        or 'c' - Cray floating point with big-endian
                0027 %                          byte ordering
                0028 %   'ieee-le.l64' or 'a' - IEEE floating point with little-endian
                0029 %                          byte ordering and 64 bit long data type
                0030 %   'ieee-be.l64' or 's' - IEEE floating point with big-endian byte
                0031 %                          ordering and 64 bit long data type.
7f0effbc3a Jean*0032 
a15d675b90 Alis*0033 % Default options
                0034 ieee='b';
                0035 
                0036 % Check optional arguments
                0037 args=char(varargin);
                0038 while (size(args,1) > 0)
                0039  if deblank(args(1,:)) == 'n' | deblank(args(1,:)) == 'native'
                0040   ieee='n';
                0041  elseif deblank(args(1,:)) == 'l' | deblank(args(1,:)) == 'ieee-le'
                0042   ieee='l';
                0043  elseif deblank(args(1,:)) == 'b' | deblank(args(1,:)) == 'ieee-be'
                0044   ieee='b';
                0045  elseif deblank(args(1,:)) == 'c' | deblank(args(1,:)) == 'cray'
                0046   ieee='c';
                0047  elseif deblank(args(1,:)) == 'a' | deblank(args(1,:)) == 'ieee-le.l64'
                0048   ieee='a';
                0049  elseif deblank(args(1,:)) == 's' | deblank(args(1,:)) == 'ieee-be.l64'
                0050   ieee='s';
                0051  else
                0052   error(['Optional argument ' args(1,:) ' is unknown'])
                0053  end
                0054  args=args(2:end,:);
                0055 end
                0056 
                0057 % Match name of all meta-files
                0058 eval(['ls ' fname '*.meta;']);
                0059 allfiles=ans;
                0060 
                0061 % Beginning and end of strings
                0062 Iend=findstr(allfiles,'.meta')+4;
                0063 Ibeg=[1 Iend(1:end-1)+2];
                0064 
                0065 % Loop through allfiles
                0066 for j=1:prod(size(Ibeg)),
                0067 
                0068 % Read meta- and data-file
                0069 [A,N] = localrdmds(allfiles(Ibeg(j):Iend(j)),ieee);
                0070 
                0071 bdims=N(1,:);
                0072 r0=N(2,:);
                0073 rN=N(3,:);
                0074 ndims=prod(size(bdims));
                0075 if     (ndims == 1)
                0076  AA(r0(1):rN(1))=A;
                0077 elseif (ndims == 2)
                0078  AA(r0(1):rN(1),r0(2):rN(2))=A;
                0079 elseif (ndims == 3)
                0080  AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3))=A;
                0081 elseif (ndims == 4)
                0082  AA(r0(1):rN(1),r0(2):rN(2),r0(3):rN(3),r0(4):rN(4))=A;
                0083 else
                0084  error('Dimension of data set is larger than currently coded. Sorry!')
                0085 end
                0086 
                0087 end
                0088 
                0089 %-------------------------------------------------------------------------------
                0090 
                0091 function [A,N] = localrdmds(fname,ieee)
                0092 
                0093 mname=strrep(fname,' ','');
                0094 dname=strrep(mname,'.meta','.data');
                0095 
                0096 % Read and interpret Meta file
                0097 fid = fopen(mname,'r');
                0098 if (fid == -1)
                0099  error(['File' mname ' could not be opened'])
                0100 end
                0101 
                0102 % Scan each line of the Meta file
                0103 allstr=' ';
                0104 keepgoing = 1;
                0105 while keepgoing > 0,
                0106  line = fgetl(fid);
                0107  if (line == -1)
                0108   keepgoing=-1;
                0109  else
                0110 % Strip out "(PID.TID *.*)" by finding first ")"
                0111 %old  ind=findstr([line ')'],')'); line=line(ind(1)+1:end);
                0112   ind=findstr(line,')');
                0113   if size(ind) ~= 0
                0114     line=line(ind(1)+1:end);
                0115   end
                0116 % Remove comments of form //
                0117   line=[line ' //']; ind=findstr(line,'//'); line=line(1:ind(1)-1);
                0118 % Add to total string
                0119   allstr=[allstr line];
                0120  end
                0121 end
                0122 
                0123 % Close meta file
                0124 fclose(fid);
                0125 
                0126 % Strip out comments of form /* ... */
                0127 ind1=findstr(allstr,'/*'); ind2=findstr(allstr,'*/');
                0128 if size(ind1) ~= size(ind2)
                0129  error('The /* ... */ comments are not properly paired')
                0130 end
                0131 while size(ind1,2) > 0
                0132  allstr=[allstr(1:ind1(1)-1) allstr(ind2(1)+3:end)];
                0133  ind1=findstr(allstr,'/*'); ind2=findstr(allstr,'*/');
                0134 end
                0135 
                0136 % This is a kludge to catch whether the meta-file is of the
                0137 % old or new type. nrecords does not exist in the old type.
                0138 nrecords = -987;
                0139 
                0140 % Everything in lower case
                0141 allstr=lower(allstr);
                0142 
                0143 % Fix the unfortunate choice of 'format'
                0144 allstr=strrep(allstr,'format','dataprec');
                0145 
                0146 % Evaluate meta information
                0147 eval(allstr);
                0148 
                0149 N=reshape( dimlist , 3 , prod(size(dimlist))/3 );
                0150 
                0151 if nrecords == -987
                0152 % This is the old 'meta' method that used sequential access
                0153 
                0154 A=allstr;
                0155 % Open data file
                0156 fid=fopen(dname,'r',ieee);
                0157 
                0158 % Read record size in bytes
                0159 recsz=fread(fid,1,'uint32');
                0160 ldims=N(3,:)-N(2,:)+1;
                0161 numels=prod(ldims);
                0162 
                0163 rat=recsz/numels;
                0164 if rat == 4
                0165  A=fread(fid,numels,'real*4');
                0166 elseif rat == 8
                0167  A=fread(fid,numels,'real*8');
                0168 else
                0169  sprintf(' Implied size in meta-file = %d', numels )
                0170  sprintf(' Record size in data-file = %d', recsz )
                0171  error('Ratio between record size and size in meta-file inconsistent')
                0172 end
                0173 
                0174 erecsz=fread(fid,1,'uint32');
                0175 if erecsz ~= recsz
                0176  sprintf('WARNING: Record sizes at beginning and end of file are inconsistent')
                0177 end
                0178 
                0179 fclose(fid);
                0180 
                0181 A=reshape(A,ldims);
                0182 
                0183 else
                0184 % This is the new MDS format that uses direct access
                0185 
                0186  ldims=N(3,:)-N(2,:)+1;
                0187  if dataprec == 'float32'
                0188   A=myrdda(dname,ldims,1,'real*4',ieee);
                0189  elseif dataprec == 'float64'
                0190   A=myrdda(dname,ldims,1,'real*8',ieee);
                0191  else
0dd8ddbe21 Jean*0192   error(['Unrecognized dataprec in meta-file = ' dataprec]);
a15d675b90 Alis*0193  end
                0194 
                0195 end
                0196 
                0197 %-------------------------------------------------------------------------------
                0198 
                0199 % result = RDDA( file, dim, irec [options] )
                0200 %
                0201 % This routine reads the irec'th record of shape 'dim' from the
                0202 % direct-access binary file (float or double precision) 'file'.
                0203 %
                0204 % Required arguments:
                0205 %
                0206 %   file  - string  - name of file to read from
                0207 %   dim   - vector  - dimensions of the file records and the resulting array
                0208 %   irec  - integer - record number in file in which to write data
                0209 %
                0210 % Optional arguments (must appear after the required arguments):
                0211 %   prec  - string  - precision of storage in file. Default = 'real*8'.
                0212 %   ieee  - string  - IEEE bit-wise representation in file. Default = 'b'.
                0213 %
                0214 % 'prec' may take the values:
                0215 %       'real*4' - floating point, 32 bits.
                0216 %       'real*8' - floating point, 64 bits - the efault.
                0217 %
                0218 % 'ieee' may take values:
                0219 %    'ieee-be'     or 'b' - IEEE floating point with big-endian
                0220 %                           byte ordering - the default
                0221 %    'ieee-le'     or 'l' - IEEE floating point with little-endian
                0222 %                           byte ordering
                0223 %    'native'      or 'n' - local machine format
                0224 %    'cray'        or 'c' - Cray floating point with big-endian
                0225 %                           byte ordering
                0226 %    'ieee-le.l64' or 'a' - IEEE floating point with little-endian
                0227 %                           byte ordering and 64 bit long data type
                0228 %    'ieee-be.l64' or 's' - IEEE floating point with big-endian byte
                0229 %                           ordering and 64 bit long data type.
                0230 %
                0231 % eg.   T=rdda('t.data',[64 64 32],1);
                0232 %       T=rdda('t.data',[256],4,'real*4');
                0233 %       T=rdda('t.data',[128 64],2,'real*4','b');
                0234 function [arr] = myrdda(file,N,k,varargin)
                0235 
                0236 % Defaults
                0237 WORDLENGTH=8;
                0238 rtype='real*8';
                0239 ieee='b';
                0240 
                0241 % Check optional arguments
                0242 args=char(varargin);
                0243 while (size(args,1) > 0)
                0244  if deblank(args(1,:)) == 'real*4'
                0245   WORDLENGTH=4;
                0246   rtype='real*4';
                0247  elseif deblank(args(1,:)) == 'real*8'
                0248   WORDLENGTH=8;
                0249   rtype='real*8';
                0250  elseif deblank(args(1,:)) == 'n' | deblank(args(1,:)) == 'native'
                0251   ieee='n';
                0252  elseif deblank(args(1,:)) == 'l' | deblank(args(1,:)) == 'ieee-le'
                0253   ieee='l';
                0254  elseif deblank(args(1,:)) == 'b' | deblank(args(1,:)) == 'ieee-be'
                0255   ieee='b';
                0256  elseif deblank(args(1,:)) == 'c' | deblank(args(1,:)) == 'cray'
                0257   ieee='c';
                0258  elseif deblank(args(1,:)) == 'a' | deblank(args(1,:)) == 'ieee-le.l64'
                0259   ieee='a';
                0260  elseif deblank(args(1,:)) == 's' | deblank(args(1,:)) == 'ieee-be.l64'
                0261   ieee='s';
                0262  else
                0263   error(['Optional argument ' args(1,:) ' is unknown'])
                0264  end
                0265  args=args(2:end,:);
                0266 end
                0267 
                0268 nnn=prod(N);
                0269 
                0270 [fid mess]=fopen(file,'r',ieee);
                0271 if fid == -1
                0272  error('Error while opening file:\n%s',mess)
                0273 end
                0274 st=fseek(fid,nnn*(k-1)*WORDLENGTH,'bof');
                0275 if st ~= 0
                0276  mess=ferror(fid);
                0277  error('There was an error while positioning the file pointer:\n%s',mess)
                0278 end
                0279 [arr count]=fread(fid,nnn,rtype);
                0280 if count ~= nnn
                0281  error('Not enough data was available to be read: off EOF?')
                0282 end
                0283 st=fclose(fid);
                0284 arr=reshape(arr,N);