LISFLOOD-FP and MATLAB

From SourceWiki
(Redirected from Lisflood in matlab)
Jump to navigation Jump to search

This page contains various Matlab functions that may be useful for analysing results from the LISFLOOD-FP model.

File import and export

Importing ascii raster files

This function will import an ascii raster file using the string filename. To use it, copy and past text into a textfile called ascii_reader.m

function [dem, ncols, nrows, xllcorner, yllcorner, cellsize] = ascii_reader (filename) 

% [DEM, ncols, nrows, xllcorner, yllcorner, cellsize] = ascii_reader (filename) 

% This function reads arc .asc files
% requires filename string as input

% j neal
% 18/6/07
%% read an ascii file
fin = fopen(filename,'r');
A = fscanf(fin,'%s',1); ncols = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); nrows = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); xllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); yllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); cellsize = fscanf(fin,'%f',1);        %#ok<NASGU>
A = fscanf(fin,'%s',1); nodata = fscanf(fin,'%f',1);          %#ok<NASGU>
dem = fscanf(fin,'%f',[ncols, nrows]);
dem = dem';
fclose('all');

You can view the imported file using the command:

imagesc(dem);

Exporting ascii raster files

This function will create an ascii raster file called filename from the 2D matrix DEM. To use it, copy and past text into a textfile called ascii_write.m

function ascii_write (filename, DEM, xllcorner, yllcorner, cellsize, nodata)

% ascii_write (filename, DEM, xllcorner, yllcorner, cellsize, nodata)
% only filename (string) and DEM (2D matrix) are essential
% this function writes ascii raster files for arc
% j neal
% 6/3/2008

if nargin < 2, 
    error('Requires at least two input arguments'); 
end
if nargin < 4, 
    xllcorner = 0;
    yllcorner = 0;
end
if nargin < 5,
    cellsize = 1;
end
if nargin < 6
    nodata = -9999;
end
A = size(DEM);
fout = fopen (filename,'w');
fprintf(fout, 'ncols         %.0f\n', A(2));  
fprintf(fout, 'nrows         %.0f\n', A(1));
fprintf(fout, 'xllcorner     %f\n', xllcorner);
fprintf(fout, 'yllcorner     %f\n', yllcorner);
fprintf(fout, 'cellsize      %f\n', cellsize);
fprintf(fout, 'NODATA_value  %f\n', nodata); 
for ii = 1:A(1)
    B = DEM(ii,:);
    fprintf(fout, '%1.3f ', B);
    fprintf(fout, '\n');
end
fclose('all');

Importing .profile files

This function imports .profile files

function [data, M] = profileread (resroot, numfiles, t, string1, string2)

% This function reads LISFLOOD-FP .profile files
%
% DATA = PROFILEREAD (RESROOT)
%   where RESROOT is a string containing the resroot from the LISFLOOD-FP
%   .par file. Absolute path names can also be used e.g. 'C:\LISFLOOD\resroot'
%   DATA is a structure containing .header {cell aray}
%                                  .segmentN (numerical array for segment N)
%
% DATA = PROFILEREAD (RESROOT, NUMFILES)
%   NUMFILES = number of files to read. Reads m files assuming that the files 
%   are numbered such that resroot-000m.profile. 
%   DATA(m) is a structure containing m files
% 
% DATA = PROFILEREAD (RESROOT, NUMFILES, 1)
%   specifies the profiles were exported a user specified time such that
%   resroot-000x-t.profile
%
% [DATA, M] = PROFILEREAD (RESROOT, NUMFILES, 1, string1, string2)
%   instructs the function to plot string1 or sting1 against string2... these
%   strings muct match the headernames in the .profile file e.g. 'Flow'
%   returns movieframes in the structure M. Also plots the data.
%
% Note: LISFLOOD-FP will name multiple files 0 to m-1 but DATA(m) will count from 1 to m
%
% j.neal
% 12/5/2008
%%
if nargin < 1, 
   error('Requires filename'); 
end
if nargin < 2,
   % only one file
   numfiles = 0;
end
if nargin < 2,
   t = 0;
end
if nargin < 4,
   % no plotting required
   plotting = 0;
   M = 0;
elseif nargin < 5,
   % use plotter
   plotting = 1;
elseif nargin < 6,
   plotting = 2;
end
%% Arrange data read
if t == 1
   fileex = '-t.profile';
else
   fileex = '.profile';
end
if numfiles == 0
   % read in a single .profile file
   filename = [resroot,fileex];
   data = read_profile (filename);
elseif numfiles < 9999
   % read a series of .profile files
   for i = 1:numfiles
       ii = i-1;
       if ii < 10
           resroot2 = [resroot,'-000',num2str(ii),fileex];
       elseif ii < 100
           resroot2 = [resroot,'-00',num2str(ii),fileex];
       elseif ii < 1000
           resroot2 = [resroot,'-0',num2str(ii),fileex];
       else
           resroot2 = [resroot,'-',num2str(ii),fileex];
       end
       %returnes structure with format data(i).segmentX... also includes .header 
       [data(i), seg_num] = read_profile (resroot2); %#ok<AGROW>
   end
else
   error ('Too many files or incorrect input to numfiles'); 
end
%% Plotting under development
% account for 0 seg num
seg_num = seg_num +1;
% if plotting == 0 % do nothing... no plots
if plotting == 1
   % find the column you want to plot
   I = strmatch(string1 , data(1).header);
   % plot a single variable
   A = size(data);
   for i = 1:A(2)
       figure(i);
       for j = 1:seg_num
           k = j-1;
           subplot(1,seg_num,j);
           eval(['plot(data(i).segment',num2str(k),'(:,',num2str(I),'));']);
           tstring = ['Plot of ',resroot,num2str(i),' segment ',num2str(k)];  
           title(tstring);
           % get movie frame
           M(i,j) = getframe(gcf); %#ok<AGROW>
       end
   end
elseif plotting == 2
   % find the columns you want to plot
   I = strmatch(string1 , data(1).header);
   I2 = strmatch(string2 , data(1).header);
   A = size(data);
   for i = 1:A(2)
       figure(i);
       for j = 1:seg_num
           k = j-1;
           subplot(1,seg_num,j);
           eval(['plot(data(i).segment',num2str(k),'(:,',num2str(I),'),data(i).segment',num2str(k),'(:,',num2str(I2),'));']);
           % get movie frame
           tstring = ['Plot of ',resroot,num2str(i),' segment ',num2str(k)];  
           title(tstring);
           M(i,j) = getframe(gcf); %#ok<AGROW>
       end
   end
end
%% read .profile file
function [data, seg_num] = read_profile (filename) 
fin = fopen(filename,'r');
more_segs = 1;
% read 'Channel_segment:' from file
temp = fscanf(fin,'%s',1); %#ok<NASGU>
while more_segs == 1
   % read filename
   seg_num = fscanf(fin,'%f',1);
   for i = 1:11
       data.header{i} = fscanf(fin,'%s',1);
   end
   testline = 1;
   j = 0;
   while testline == 1
       j = j+1;
       % reads the first bit of the line as a string
       A = fscanf(fin, '%s',1);
       % this string is either a numer of a new channel sgment of the end
       % of the file
       % if end of file
       ST = feof (fin);
       if ST == 1
           % reached the end of the file exit both while loops
           testline = 0;
           more_segs = 0;
       else
           TF = strcmp('Channel_segment:', A);
           if TF == 1
               % new segment has been found
               testline = 0;
           else
               % read rest for line into data
               B(j,1) = str2double(A); %#ok<AGROW>
               for k = 2:11
                   B(j,k) = fscanf(fin, '%f',1); %#ok<AGROW>
                end
            end
        end
    end
    eval(['data.segment',num2str(seg_num),' = B;']);
    clear B
end
fclose('all');

Importing .stage files

This function imports .stage files and allows for checkpointing restarts

function [metadata, stagedata] = stage_read (filename, num_locations, checkpoint)

% This function reads lisflood .stage files
% [metadata, stagedata] = stage_read (filename, num_locations)
%
% if checkpointing was used an additional argument is required to look for
%  checkpointed data
% [metadata, stagedata] = stage_read (filename, num_locations,
% checkpoint=1);
%
% The code will also check for repetition and remove duplicate lines
%
% J Neal
% 26/6/09

if nargin < 2, 
   error('Requires at least two input arguments'); 
end
if nargin < 3, 
   checkpoint = 0;
end

fin = fopen(filename, 'r');

header1 = fgets(fin);  %#ok<NASGU>
header2 = fgets(fin);  %#ok<NASGU>
header3 = fgets(fin);  %#ok<NASGU>
% reads the metadata
metadata = fscanf (fin, '%f', [4, num_locations]);
metadata = metadata';

header4 = fgets(fin);  %#ok<NASGU>
header5 = fgets(fin);  %#ok<NASGU>
header6 = fgets(fin);  %#ok<NASGU>
header7 = fgets(fin);  %#ok<NASGU>

if checkpoint == 0
% reads stage data
stagedata = fscanf (fin, '%f', [num_locations+1,inf]);
stagedata = stagedata';
else
  % scan for checkpointing lines
  line = 1;
  checks = 0;
  checkpoint = 0;
  while 1
      tline = fgetl(fin);
      % this will return -1 at end of file
      if tline == -1
          checks = checks+1;
          checkpoint(checks+1) = line; %#ok<AGROW>
          line = line-1;
          break;
      end
      TF = strcmp (tline, '####################################################### Checkpoint restart ########################################################');
      if TF == 1
          % this line is a checkpoint line
          checks = checks+1;
          checkpoint(checks+1) = line; %#ok<AGROW>
      end
      % the data could be read in at this point but this could be very
      % slow for large stage files
      line = line+1;
  end
  %now we know how may times it has checkpointed and where
  disp (['Number of checkpoints = ',num2str(checks)]);
  fclose('all');
   
  % re open file and read header again!
  fin = fopen(filename, 'r');
  header1 = fgets(fin);  %#ok<NASGU>
  header2 = fgets(fin);  %#ok<NASGU>
  header3 = fgets(fin);  %#ok<NASGU>
  % reads the metadata
  metadata = fscanf (fin, '%f', [4, num_locations]);
  metadata = metadata';
  header4 = fgets(fin);  %#ok<NASGU>
  header5 = fgets(fin);  %#ok<NASGU>
  header6 = fgets(fin);  %#ok<NASGU>
  header7 = fgets(fin);  %#ok<NASGU>
   
  % read stage data
  if checks == 2
      % reads stage data as there are no checkpoints
      stagedata = fscanf (fin, '%f', [num_locations+1,line]);
      stagedata = stagedata';
  else
      stagedata = [];
      for i = 2:checks
          tempstagedata = fscanf (fin, '%f', [num_locations+1,checkpoint(i-1)-checkpoint(i)-1]);
          tempstagedata = tempstagedata';
          % this is not efficient but shjould only happen a few time
          stagedata = [stagdata;tempstagedata];
          % read the checkpoint line
          tline = fgetl(fin); %#ok<NASGU>
      end
      % we now have lots of data that may overlap so we only need unique
      % rows
      stagedata = unique(stagedata,'rows');
  end
       
end
fclose('all');

Writing parameter files

This function can be used to write many LISFLOOD-FP parameter files with N different channel and floodplain roughness, using your own N-by-2 matrix called roughness. You will need to edit the code for your application by commenting unwanted lines with a percentage symbol.

function prm_writer (roughness) 

% This function writes LISFLOOD-FP parameter files numbered 1 to n using
% the roughness values in the n-by-2 matrix roughness. yuo will need to
% edit the code for your application.

[num_sims] = size(roughness);
for i = 1:num_sims(1)
a = ['mymodel', num2str(i),'.par']; b = num2str(i);
fout = fopen(a,'w');
fprintf(fout,'DEMfile                  mydem.dem.ascii\n');
fprintf(fout,'resroot                  myres%s\n',b);
fprintf(fout,'dirroot                  mydir\n');
fprintf(fout,'sim_time                 245000.0\n');
fprintf(fout,'initial_tstep            10.0\n');
fprintf(fout,'massint                  300.0\n');
fprintf(fout,'saveint                  10000.0\n');
%fprintf(fout,'overpass                 135000.0\n');
fprintf(fout,'fpfric                   %1.3f\n',roughness(i,2));
fprintf(fout,'nch                      %1.3f\n',roughness(i,1));
%fprintf(fout,'manningfile              mymanfile%s.n.ascii\n',b);
fprintf(fout,'riverfile                myriver.river\n');
fprintf(fout,'bdyfile                  mybdy.bdy\n');
fprintf(fout,'stagefile                mystage.stage\n');
fprintf(fout,'bcifile                  mybci.bci\n');
%fprintf(fout,'startfile                mystart.old\n');
%fprintf(fout,'checkpoint               2\n');
%fprintf(fout,'checkfile                mycheck.chkpnt\n');
fprintf(fout,'elevoff\n');
fprintf(fout,'qoutput\n');
fprintf(fout,'diffusive\n');
fclose('all');
end

Plotting flow vectors from .Qx and .Qy files

This function will plot flow vectors from a .Qx and .Qy over a dem using the matlab functions image and quiver

function lisflood_flow_plotter (qxfile, qyfile, demfile, north, east, south, west, scaling)

% This function plots flow vectors from LISFLOOD_FP Qx and QY files
%
% lisflood_flow_plotter (qxfile, qyfile, demfile);
%
% these input variables are strings containing the relative of full
% pathnames of the .Qx .Qy and ascii dem files to be plotted.
%
% lisflood_flow_plotter (qxfile, qyfile, demfile, N, E, S, W);
%
% N, E, W and S are optional they specify the northernmost, southeernmost
% ect cell to be displayed. this can be used to crop the domain.
%
% lisflood_flow_plotter (qxfile, qyfile, demfile, N, E, S, W, scaling);
% 
% scaling is an optional term used to manually scale the vector lengthes
% drawn by quiver (the arrow plotting function).
%
% J Neal
% 20/02/2008 

%% decide if crop is required and give imput error message
if nargin < 3, 
    error('Requires at least three input arguments'); 
end
if nargin < 7, 
    crop = 0;
else
    crop = 1;
end
if nargin < 7,
    scaling = 1;
end 
% Note don't do this for large areas ?
%% Task 1: read ascii files
% read Qx file
[QX, ncolsqx, nrowsqx, xllcornerqx, yllcornerqx, cellsizeqx] = read_file (qxfile); %#ok<NASGU>
% read Qy file
[QY, ncolsqy, nrowsqy, xllcornerqy, yllcornerqy, cellsizeqy] = read_file (qyfile); %#ok<NASGU>
% read DEM
[DEM, ncolsdem, nrowsdem, xllcornerdem, yllcornerdem, cellsizedem] = read_file (demfile);
%% crop data if required
if crop == 1;
    DEM = DEM(north:south,west:east);
    QX = QX(north:south,west:east+1);
    QY = QY(north:south+1,west:east);
    xllcornerdem = xllcornerdem + west*cellsizedem - cellsizedem;
    yllcornerdem = yllcornerdem + (nrowsdem - south) * cellsizedem;
    [nrowsqx, ncolsqx] = size(QX); [nrowsqy, ncolsqy] = size(QY); [nrowsdem, ncolsdem] = size(DEM);
end
%% Taks 2: Plot dem and generate figure
figure1 = figure('PaperSize',[20.98 29.68],'Color',[1 1 1]);
colormap('gray');
% Create axes
axes1 = axes('Parent',figure1,'YTickLabel',{yllcornerdem + nrowsdem*cellsizedem ,yllcornerdem},...
    'YTick',[0.5,nrowsdem+0.5],...
    'YDir','reverse',...
    'XTickLabel',{xllcornerdem,xllcornerdem+ncolsdem*cellsizedem},...
    'XTick',[0.5, ncolsdem + 0.5],...
    'Layer','top',...
    'DataAspectRatio',[1 1 1]...
    %,'Clim',[13 30]... % uncomment to set colourmap limits manually
    );

box('on');
hold('all');
image(DEM,'Parent',axes1,'CDataMapping','scaled');
axis('image');
xlabel('Easting (m)');
ylabel('Northing (m)');
%% Task 3: calculate flow vectors
% pre allocate memory for loop... it will run faster this way
xlocs = zeros(ncolsqx*nrowsqx+ncolsqy*nrowsqy,1);
ylocs = xlocs;
U = xlocs;
V = xlocs;
%work out X and Y locations
for i = 1:nrowsqx
    for j = 1:ncolsqx
        xlocs((i-1)*ncolsqx+j,1) = j - 0.5;
        ylocs((i-1)*ncolsqx+j,1) = i;
        U((i-1)*ncolsqx+j,1) = QX(i,j);
    end
end
for i = 1:nrowsqy
    for j = 1:ncolsqy
        xlocs(ncolsqx*nrowsqx + (i-1)*ncolsqy +j,1) = j;
        ylocs(ncolsqx*nrowsqx + (i-1)*ncolsqy +j,1) = i - 0.5;
        V(ncolsqx*nrowsqx+(i-1)*ncolsqy+j,1) = QY(i,j);
    end
end
% work out number of nonzeros elements
num_flows = nnz(U+V);
xlocs2 = zeros(num_flows,1);
ylocs2 = xlocs2;
U2 = xlocs2;
V2 = xlocs2;
% remover zero flow locations
k = 1;
for i = 1:ncolsqx*nrowsqx+ncolsqy*nrowsqy
    if (U(i,1) == 0) && (V(i,1) == 0)
        % do nothing
    else
        xlocs2(k,1) = xlocs(i,1);
        ylocs2(k,1) = ylocs(i,1);
        U2(k,1) = U(i,1);
        V2(k,1) = V(i,1);
        k = k+1;
    end
end
% check numbers are correct
if k == num_flows + 1
    % all is ok
else
    disp('Problem with flows');
end
%% Task 4: overlay flow vectors
disp('Plotting data... if this is taking a long time you may need fewer locations');
quiver (xlocs2,ylocs2,U2,V2, scaling);
% quiver (xloc2,yloc2,U2,V2,'Parent',figure1);
disp('Done');
%% function to read LISFLOOD ascii files using filename
function [OUT, ncols, nrows, xllcorner, yllcorner, cellsize] = read_file (filename)
% read an ascii file
fin = fopen(filename,'r');
A = fscanf(fin,'%s',1); ncols = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); nrows = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); xllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); yllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); cellsize = fscanf(fin,'%f',1);        %#ok<NASGU>
A = fscanf(fin,'%s',1); nodata = fscanf(fin,'%f',1);          %#ok<NASGU>
OUT = fscanf(fin,'%f',[ncols, nrows]);
OUT = OUT';
fclose('all');

Making movies from .wd files

This function will convert a series of .wd .Qx or .Qy file into a .avi movie with the same filename

function LISFLOOD_mov (resroot,fileex,vartype,num_snaps,snapint,dem,demCS,depthCS,framesPS,movQ) 

% LISFLOOD_mov generates movies of LISFLOOD-FP output
%
% LISFLOOD_mov (resroot,fileex,vartype,num_snaps,snapint,dem,demCS,depthCS,framesPS,movQ)
% 
% where 
% resroot is the LISFLOOD resroot (relative to m file or absolute)(string)
% fileex is the file extension '.wd' (can be chaned to plot WSE and flows)
% vartype is the name of the variable being plotted e.g. 'Depth'
% num_snaps is the number of snapshot times
% snapint is the time interval between each LISFLOOD-FP snapshot (seconds)
% dem is the name of the demfile (relative or absolute)
% demCS is the range of dem hights to be plotted e.g. demCS = [0,20];
% depthCS is the range of depth values to be plotted e.g. depthCS = [0,10];
% framesPS number of frames per second (each plot is a simgle frame)
% movQ is the movie quality between 1 and 100 (100 is best)
% 
% 8/11/2007. J Neal.
%
% EXAMPLE:
% LISFLOOD_mov ('C:\Experiment1\res22','.wd','Water depth',24,10000,...
% 'C:\Experiment1\dem10m.dem.ascii',[0,60], [0,10],1,100);
%% Movie maker
% read dem filenam is filename and 1 specifies the 0.00 should not be NaN's
[DEM, ncols, nrows, xllcorner, yllcorner, cellsize] = read_file (dem); %#ok<NASGU>
% generate empty .avi file
% A = [resroot,'.avi'];
% mov = avifile(A);
% loop through snapshots
for i = 1:num_snaps
    if i < 10
        resfile = [resroot,'-000',num2str(i),fileex];
    elseif i < 100
        resfile = [resroot,'-00',num2str(i),fileex];
    elseif i < 1000
        resfile = [resroot,'-0',num2str(i),fileex];
    else
        resfile = [resroot,'-',num2str(i),fileex];
    end
    % read in deoth file for resfile i (2 specifies the 0.00 should be NaN
    [DEPTH, ncols, nrows, xllcorner, yllcorner, cellsize] = read_file (resfile);
    % plot data as figure 1
    plotter (DEPTH, DEM, nrows, ncols, cellsize, xllcorner, yllcorner,demCS,depthCS,snapint,i,vartype);
    % get movie frame
    M(i) = getframe(gcf); %#ok<AGROW>
    hold off;
%     mov = addframe(mov,M(i));
    % close the figure
    close all
end 
% % close .avi file
% mov = close(mov);
% generate empty .avi file
disp('Generating .avi movie file');
A = [resroot,fileex,'.avi'];
movie2avi(M,A,'fps',framesPS,'quality',movQ);
disp(A);
%% Read LISFLOOD ascii files using filename
function [OUT, ncols, nrows, xllcorner, yllcorner, cellsize] = read_file (filename)
% read an ascii file
fin = fopen(filename,'r');
A = fscanf(fin,'%s',1); ncols = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); nrows = fscanf(fin,'%f',1);           %#ok<NASGU>
A = fscanf(fin,'%s',1); xllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); yllcorner = fscanf(fin,'%f',1);       %#ok<NASGU>
A = fscanf(fin,'%s',1); cellsize = fscanf(fin,'%f',1);        %#ok<NASGU>
A = fscanf(fin,'%s',1); nodata = fscanf(fin,'%f',1);          %#ok<NASGU>
OUT = fscanf(fin,'%f',[ncols, nrows]);
OUT = OUT';
fclose('all');
% convert nodata to NaN;
for ii = 1:nrows
    for jj = 1:ncols
        if OUT(ii,jj) == nodata
            OUT(ii,jj) = NaN;
        elseif OUT(ii,jj) == -99.000
            % lisflood uses -99.000 as nodat so will also remove these
            OUT(ii,jj) = NaN;
        else
            % do nothing
        end
    end
end
%% Plotter data for movie slide
function plotter (DEPTH, DEM, nrows, ncols, cellsize, xllcorner, yllcorner,demCS,depthCS,snapint,i,vartype)
% number of colors in colormap
num_colors = 64;
% DEM and variable color map
cmap = [gray(num_colors); jet(num_colors)];
% scale DEM and DEPTH data to fit with new colormap
demCS2 = demCS(2)-demCS(1);
dem_scalar = num_colors/demCS2;
DEM2 = DEM*dem_scalar;
depthCS2 = depthCS(2)-depthCS(1);
depth_scalar = num_colors/depthCS2;
DEPTH2 = (DEPTH*depth_scalar)+num_colors+1;
%Plot the DEM
figure1 = figure('PaperSize',[20.98 29.68],'Color',[1 1 1]);
colormap(cmap);
axes1 = axes('Parent',figure1,'YTickLabel',{yllcorner+(nrows*cellsize),yllcorner+cellsize},...
    'YTick', [1,nrows],...
    'YDir','reverse',...
    'XTickLabel',{xllcorner,xllcorner+(ncols*cellsize)-cellsize},...
    'XTick',[1,ncols],...
    'Layer','top');
box('on');
hold('all');
image(DEM2,'Parent',axes1);
axis('equal');axis('tight');
% Overlay the water depth (or other variable)
H = image(DEPTH2);
% code to make depth plot layer transparent
OP = ones(nrows,ncols);
for ii = 1:nrows
    for jj = 1:ncols
        if DEPTH(ii,jj) > 0
        else
            OP(ii,jj) = 0;
        end
    end
end
% make transparent. depth layer must be H
set(H,'AlphaData',OP);
% label colourbar
color_breaks = 5;
colorbreak = num_colors/color_breaks;
SCALE = zeros(color_breaks*2,1);
SCALE(1) = 0.0001;
for j = 1:color_breaks*2
    SCALE(j+1) = colorbreak*j;
end
SCALE(color_breaks+1) = num_colors+1;
VIS_SCALE = zeros(color_breaks*2,1);
VIS_SCALE(1) = demCS(1);
for j = 1:color_breaks-1
    VIS_SCALE(j+1) = ((demCS2/color_breaks)*j)+demCS(1);
end
VIS_SCALE(color_breaks+1) = depthCS(1);
for j = 1:color_breaks
    VIS_SCALE(j+1+color_breaks) = ((depthCS2/color_breaks)*j)+depthCS(1);
end
colorbar('YTick',SCALE,'YTickLabel',VIS_SCALE);
% Label axis
xlabel('BNG easting (m)');
ylabel('BNG northing (m)');
A = [vartype,' over DEM at time ',num2str((i*snapint)),'s'];
title(A);