Subversion Repositories lagranto.ecmwf

Rev

Blame | Last modification | View Log | Download | RSS feed

% ------------------------------------------------------------------------
% Preparations
% ------------------------------------------------------------------------

% Add some matlab paths
addpath('/usr/local/matlabtools/mexnc/');
addpath('/usr/local/matlabtools/snctools/');
addpath('/usr/local/matlabtools/cdf_io/');
addpath('/home/sprenger/lagranto/matlab/');

% Set the datadirectories
cdfdir   = '/lhome/sprenger/lagranto/test/cdf/';
tradir   = '/home/sprenger/lagranto/matlab/';

% Read a trajectory file
tra = read_trajectory( [ tradir '/trajectory2.lsl' ]);

% Set the tabel for input files
filelist.n = 4;
filelist.date(1) = cellstr('19891020_00'); filelist.time(1) =  0;
filelist.date(2) = cellstr('19891020_06'); filelist.time(2) =  6;
filelist.date(3) = cellstr('19891020_12'); filelist.time(3) = 12;
filelist.date(4) = cellstr('19891020_18'); filelist.time(4) = 18; 

% Get the grid parameters from first data file
inp                     = ncget([ cdfdir 'P' char(filelist.date(1)) ],'U','PS');
grid.nx                 = size(inp.U.data,3);
grid.ny                 = size(inp.U.data,2);
grid.nz                 = size(inp.U.data,1);
grid.xmin               = inp.cstfile.lonmin;
grid.ymin               = inp.cstfile.latmin;
grid.dx                 = inp.cstfile.dellon;
grid.dy                 = inp.cstfile.dellat;
grid.xmax               = grid.xmin + double(grid.nx-1) * grid.dx;
grid.ymax               = grid.ymin + double(grid.ny-1) * grid.dy;
grid.mdv                = -999.
grid.lon1               = grid.xmin + double(0:grid.nx-1) * grid.dx;
grid.lat1               = grid.ymin + double(0:grid.ny-1) * grid.dy;
[ grid.lon2 grid.lat2 ] = meshgrid(grid.lon1,grid.lat1);
grid.aklay              = inp.cstfile.aklay;
grid.aklev              = inp.cstfile.aklev;
grid.bklay              = inp.cstfile.bklay;
grid.bklev              = inp.cstfile.bklev;

% ------------------------------------------------------------------------
% Loop over al trajectory times
% ------------------------------------------------------------------------

% Set flags for load manager
load0 = -1;
load1 = -1;

% No trajectories are selected
select = zeros(tra.ntra,1);

% Init the textlines
for j=1:tra.nfield
    textline(j) = cellstr(' ');
end
first = 1;

% Loop over all trajectory times
i     = 1;
stat  = 1;
while ( stat ~= 0 )

    % Get the time 
    time    = tra.time(i);
    
    % Decide which data files are needed
    need0 = find( time <= filelist.time , 1 );
    need1 = need0 + 1;
    if ( need1 > filelist.n ) 
       need1 = need0;
    end
       
    % Load files if not yet done
    if ( need0 == load1 )
        inp0  = inp1;
        load0 = need0;
    end
    if ( need1 == load0 )
        inp1  = inp0;
        load1 = need1;
    end
    if ( need0 ~= load0 ) 
        inps        = ncget([ cdfdir 'S' char(filelist.date(need0)) ],'TH','PV','RH');
        inpp        = ncget([ cdfdir 'P' char(filelist.date(need0)) ],'Q','U','V','T','PS');
        inp0        = inpp;
        inp0.TH     = inps.TH;
        inp0.PV     = inps.PV;
        inp0.RH     = inps.RH;
        inp0.P      = inp.PS;
        inp0.P.data = kron(inp0.PS.data,grid.bklay) + kron(ones(grid.ny,grid.nx),grid.aklay);
        inp0.P.data = reshape(inp0.P.data,grid.nz,grid.ny,grid.nx);
        load0       = need0;
    end
    if ( need1 ~= load1 ) 
        inps        = ncget([ cdfdir 'S' char(filelist.date(need1)) ],'TH','PV','RH');
        inpp        = ncget([ cdfdir 'P' char(filelist.date(need1)) ],'Q','U','V','T','PS');
        inp1        = inpp;
        inp1.TH     = inps.TH;
        inp1.PV     = inps.PV;
        inp1.RH     = inps.RH;
        inp1.P      = inp.PS;
        inp1.P.data = kron(inp1.PS.data,grid.bklay) + kron(ones(grid.ny,grid.nx),grid.aklay);
        inp1.P.data = reshape(inp1.P.data,grid.nz,grid.ny,grid.nx);
        load1       = need1;
    end

    % Get the mean pressure of the trajectory sample
    if ( any(select) )
        mask = ( find(select) - 1) * tra.ntime + i;
    else
        mask = ( (1:tra.ntra) -1 ) * tra.ntime + i;
    end
    hori.level = mean ( tra.p ( mask ) );
    
    % Interpolate fields to a pressure surface
    [ xpos  ypos zpos ] = meshgrid( grid.lon1, grid.lat1, hori.level );
    ind                 = get_index(inp0.P.data,[ zpos(:) ypos(:) xpos(:) ],grid);
    hori0.U             = reshape( int_index(inp0.U.data,ind,grid.mdv), 1,grid.ny,grid.nx);
    hori0.V             = reshape( int_index(inp0.V.data,ind,grid.mdv), 1,grid.ny,grid.nx);
    hori0.VEL           = sqrt(hori0.U .^ 2 + hori0.V .^ 2);

    [ xpos  ypos zpos ] = meshgrid( grid.lon1, grid.lat1, hori.level );
    ind                 = get_index(inp1.P.data,[ zpos(:) ypos(:) xpos(:) ],grid);
    hori1.U             = reshape( int_index(inp1.U.data,ind,grid.mdv), 1,grid.ny,grid.nx);
    hori1.V             = reshape( int_index(inp1.V.data,ind,grid.mdv), 1,grid.ny,grid.nx);
    hori1.VEL           = sqrt(hori1.U .^ 2 + hori1.V .^ 2);

    % Do a time interpolation (and get rid of 1-dimensions) 
    if ( need1 ~= need0 )
        frac     = ( time - filelist.time(need0) ) / ( filelist.time(need1) - filelist.time(need0) );
        hori.U   = squeeze( (1-frac) * hori0.U   + frac * hori1.U   );
        hori.V   = squeeze( (1-frac) * hori0.V   + frac * hori1.V   );
        hori.VEL = squeeze( (1-frac) * hori0.VEL + frac * hori1.VEL );
    else
        hori.U   = squeeze( hori0.U   );
        hori.V   = squeeze( hori0.V   );
        hori.VEL = squeeze( hori0.VEL );
    end
    
    % Open a new figure ans set the geographical projection
    figure(1);
    clf;
    load coast
    %h=axesm('MapProjection','stereo','origin',[ 90 0 ]);
    h=axesm( 'eqdcylin','MapLatLimit',[ 20 80 ], 'MapLonLimit', [ -100 40 ] );
    gridm;
    h=plotm(lat,long,'Color','k','LineWidth',1.5);
    %axis([-0.6 0.67 -1.2 -0.1]);
    axis([ -1.0    1.0    0.4000    1.4000 ]);
    daspect([ 1 0.75 1] );
    title ( [ 'P = ' num2str(round(hori.level)) ' hPa / T = ' num2str(time) ' h'],...
           'FontSize',22)

    % Plot velocity and overlay wind vectors
    c_map = col_scale([0:2.5:50 ],hori.VEL);
    [C,h] = contourfm(grid.lat1,grid.lon1,c_map.data,c_map.xtick);
    colormap('default');
    col_load( [ pwd '/col_table.txt' ],c_map.xtick,44); 
    caxis(c_map.caxis)
    q=colorbar('vert');
    set(q,'ytick',c_map.xtick,'YTickLabel',c_map.label,'FontSize',15); 
    [ c_map.x c_map.y ] = meshgrid(grid.lon1,grid.lat1);
    c_map.u             = squeeze(hori.U);
    c_map.v             = squeeze(hori.V);
    maskx               = 1:2:size(grid.lon2,2);        
    masky               = 1:2:size(grid.lon2,1);
    hold on
    q=quiverm(grid.lat2(masky,maskx),grid.lon2(masky,maskx),...
              hori.V   (masky,maskx),hori.U   (masky,maskx),'k');
    set(q,'Linewidth',1,'Color','k')
    hold off  
    
    % Handle user commands
    stat = 2;
    while ( stat == 2 )
        
        % Show the positions of the trajectory points
        hold on
        for j=1:tra.ntra
            if select(j) 
                mask = ( tra.time == time ) & ( tra.label == j );
                plotm(tra.lat(mask),tra.lon(mask),'o','markersize',10,'color','r',...
                      'MarkerEdgeColor','k','MarkerFaceColor','r');
            else
                mask = ( tra.time == time ) & ( tra.label == j );
                plotm(tra.lat(mask),tra.lon(mask),'o','markersize',10,'color','k',...
                      'MarkerEdgeColor','k','MarkerFaceColor','k');
            end
        end
        hold off
      
        % Get the cursor position
        [ x y ] = ginput(1)
        plotdom = axis;

       % Step backward
       if ( x < plotdom(1) ) 
           i = i - 1;
           if ( i < 1)
               i = tra.ntime;
           end
           stat = 1;
           
       % Step forward
       elseif ( x > plotdom(2) ) 
           i = i + 1;
           if ( i > tra.ntime )
               i = 1;
           end
           stat = 1;
           
       % Exit
       elseif ( y > plotdom(4) )
           stat = 0;
        
       % Write trajectory info
       elseif ( (y < plotdom(3)) & any(select) )
           for j=1:tra.nfield
              mask = ( find(select) - 1) * tra.ntime + i;
              val  = tra.(char(tra.field(j)));
              val  = mean( val(mask) );
              if ( first == 0 ) 
                 text(plotdom(1),plotdom(3)-0.04*j,char(textline(j)),...
                      'FontSize',15,'Color','g' );
              end
              textline(j) = cellstr([ char(tra.field(j)) ' = ' num2str(val)]);
              text(plotdom(1),plotdom(3)-0.04*j,char(textline(j)),...
                   'FontSize',15,'Color','b' );
              first = 0;
           end
        
       % Select trajectory points
       else
           [ lat0, lon0 ] = minvtran(x,y);
           mask           = (tra.time == time );
           lon1           = tra.lon(mask);
           lat1           = tra.lat(mask);
           dist           = distance(lat0,lon0,lat1,lon1);
           label          = find( min(dist) == dist );
           if  ( dist(label) < 5 ) 
              if ( select(label) == 0 ) 
                 select(label) = 1;
              elseif ( select(label) == 1 )
                 select(label) = 0;
              end
           else
               stat = 1;
           end
       end
       
    end

% End loop 
end