getfieldfromgrib_old.m

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· M 代码 · 共 140 行

M
140
字号
function [TZH,dmn]=getFieldfromGRIB(ctl,dmn,varargin)

if(nargin<2 | isempty(dmn))
   [archivo,Camino2]=uigetfile('*.cfg','Selecciona un Dominio');
   dmn=readDomain([Camino2 archivo]);
end

startDate=datenum(dmn.startDate);
endDate=datenum(dmn.endDate);
if nargin>2,
   for i=1:2:length(varargin)
      switch lower(varargin{i}),
      case 'dates', 
         dates=varargin{i+1};
         if (datenum(dates{1})<startDate),
            warning(['no existen los datos correspondientes a la fecha ' dates{1}])
         else
            startDate = datenum(dates{1}); 
         end
         if (datenum(dates{2})>endDate),
            warning(['no existen los datos correspondientes a la fecha' dates{2}])
         else
            endDate= datenum(dates{2}); 
         end 
      end
   end
end


disp(dmn);
nP=size(dmn.par,2);
nH=size(dmn.tim,2);
nN=size(dmn.lvl,2);
%diamax=fix(dmn.tim(nH)/24);
diamax=max(fix(dmn.tim/24));

fcDate=datevec(startDate:endDate+diamax);
fcDate=fcDate(:,1:3);

ctlname=[ctl.cam ctl.fil]
fid=fopen(ctlname,'rb');
k=1;
while ~feof(fid)
   name{k}=[ctl.cam fgetl(fid)];
   k=k+1;
end
fclose(fid);
idxname=[ctlname '.idx'];
idxS=dir(idxname);
ctlS=dir(ctlname);


if (isempty(idxS) | datenum(idxS.date)<datenum(ctlS.date))
   buildIndex('make,sort,write',ctl.cam,ctl.fil,[ctl.fil '.idx']);   
else
   buildIndex('read',ctl.cam,ctl.fil,[ctl.fil '.idx']);
end

%buildIndex('read',ctl.cam,'','era.ctl.idx');

ndias=size(fcDate,1)-diamax;
%ndias=size(fcDate,1);
zona=dmn.nod;
nopun=size(zona,2);
disp(['Size(TZH)=' num2str([ndias nP*nH*nN*size(dmn.nod,2)])])
TZH(ndias,nP*nH*nN*size(dmn.nod,2))=0;
%DATA(size(fcDate,2),length(dmn.lon)*length(dmn.lat))=0;
size(TZH)
[xi,yi]=meshgrid(dmn.lon,dmn.lat);
for P=1:nP
   for H=1:nH
      hora=mod(dmn.tim(H),24);
      dia=fix(dmn.tim(H)/24);
      for N=1:nN
         disp([num2str([hora,dmn.par(P),0,dmn.lvl(N)])]);
         DATA=[];
         for D=1:size(fcDate,1)
            if(fcDate(D,2)==1 & fcDate(D,3)==1),fprintf(1,'%d\n',fcDate(D,1)),end
            mess=sprintf('%04d%02d%02d%02d%04d_%03d%03d%04d',fcDate(D,:),hora,0,dmn.par(P),0,dmn.lvl(N));
            F=buildIndex('find',mess,'1','');
            if F(1)
               [A,info]=readmessage(name{F(1)},F(2));
            else
               error(['No se ha encontrado un campo: ',mess]);
            end
            %if (info.PDS.Parameter==dmn.par(P) & info.PDS.Height1==dmn.lvl(N)& info.PDS.Hour==hora & info.PDS.Year==mod(fcDate(D,1),100) & info.PDS.Month==fcDate(D,2)& info.PDS.Day==fcDate(D,3))
            if (info.PDS.Parameter==dmn.par(P) & info.PDS.Height1==dmn.lvl(N)& info.PDS.Hour==hora & (info.PDS.Year+(info.PDS.Century-1)*100)==fcDate(D,1) & info.PDS.Month==fcDate(D,2)& info.PDS.Day==fcDate(D,3))
               %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
               if isempty(DATA)
                  
                  scanmode=info.GDS.LatLon.ScanMode;
                  dx=(1-2*bitget(scanmode,1))*info.GDS.LatLon.Di;
                  dy=(-1+2*bitget(scanmode,2))*info.GDS.LatLon.Dj;
                  
                  x=info.GDS.LatLon.Lon1:dx:info.GDS.LatLon.Lon2;
                  y=info.GDS.LatLon.Lat1:dy:info.GDS.LatLon.Lat2;
                  x=x/1000;y=y/1000;
                  i=find(x>180);
                  x(i)=x(i)-360;
                  [X,Y]=meshgrid(x,y);   
                  if bitget(scanmode,3)
                     X=X';Y=Y';
                  end
                  DATA=zeros([size(fcDate,2),length(dmn.lon)*length(dmn.lat)])*NaN;
               end
               %  if (size(DATA,2) == prod(size(A)))
               %DATA(D,:)=A(:)';
               zi=interp2(X,Y,A,xi,yi,'linear')';
               DATA(D,:)=zi(:)';
               %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
               %               A=A';
               %               if (size(DATA,2) == prod(size(A)))
               %                  DATA(D,:)=A(:)';
               %               else
               %                  error(sprintf('dim(A)=%d & dim(DATA,2)=%d are differents in mess: %s',prod(size(A)),size(DATA,2),mess));
               %               end
            else
              error('Problems reading message');
            end
            %DATA=load([dmn.src 'tim' num2str(hora,'%02d') '\par' num2str(dmn.par(P),'%03d') '_' num2str(dmn.lvl(N),'%04d')]);
         end
         
         %if (info.PDS.Parameter==dmn.par(kp) & info.PDS.Height1==dmn.lvl(kl) & info.PDS.PeriodTime==P1 & info.PDS.TimeInterval==P2)
         %   A=A';
         %   VC(kd,(1:nn)+nn*((kl-1)+nl*((kt-1)+nt*(kp-1))))=A(dmn.nod);
         %else
         %   error('Problems reading message');
         %end
         campo=DATA((1+dia):(end+dia-diamax),zona);
         %campo=DATA((1+dia):(end+dia-diamax),zona);
         %VC(1,(1:nn)+nn*(kl+nl*(kt+nt*kp)))=A(dmn.nod);
         ind=findVarPosition(dmn.par(P),dmn.tim(H),dmn.lvl(N),dmn);
         %ind=((P-1)*(nH*nN*nopun)+(H-1)*nN*nopun+(N-1)*nopun+1):((P-1)*(nH*nN*nopun)+(H-1)*nN*nopun+(N-1)*nopun+nopun);
         %ind=((H-1)*nN*nopun+(N-1)*nopun+1):((H-1)*nN*nopun+(N-1)*nopun+nopun);
         TZH(:,ind)=campo;
      end
   end
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?