Difference between revisions of "LISFLOOD-FP and MATLAB"
Jump to navigation
Jump to search
| Line 71: | Line 71: | ||
end | end | ||
fclose('all'); | 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); | ||
Revision as of 15:26, 18 March 2008
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');
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);