Difference between revisions of "LISFLOOD-FP and MATLAB"
Tim-fewtrell (talk | contribs) |
Tim-fewtrell (talk | contribs) |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
This page contains various Matlab functions that may be useful for analysing results from the [http://www.ggy.bris.ac.uk/research/hydrology/models/lisflood LISFLOOD-FP] model. | This page contains various Matlab functions that may be useful for analysing results from the [http://www.ggy.bris.ac.uk/research/hydrology/models/lisflood LISFLOOD-FP] model. | ||
− | ==File import and export | + | ==File import and export== |
===Importing ascii raster files=== | ===Importing ascii raster files=== | ||
Line 69: | Line 69: | ||
fprintf(fout, '%1.3f ', B); | fprintf(fout, '%1.3f ', B); | ||
fprintf(fout, '\n'); | 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 | end | ||
fclose('all'); | fclose('all'); |
Latest revision as of 09:42, 26 June 2009
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);