You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.0 KiB
Matlab

% SBEACH toolbox - fsbeach_genbathy
% Written by Joshua Simmons 11/2017
% Syntax:
% bathyout = fsbeach_genbathy(varargin)
%
% Input:
% varargin = x: x-coordinates of bathymetry
% z: z-coordinates of bathymetry
% hbz: z-coordinates of hard bottom
% ne: vector or matrix of the size of z containing
% either booleans indicating if a cell is
% non-erodable or a numeric value indicating the
% thickness of the erodable layer on top of a
% non-erodable layer
%
% Output:
% bathyout = stucture of x and z
function bathyout = fsbeach_genbathy(outpath,name,settings,varargin)
OPT = struct( ...
'x', [0 100 200 300 400 500]', ...
'z', [-10 -5 0 1 3 10]', ...
'hbz', NaN, ...
'ne', [] ...
);
OPT = setproperty(OPT, varargin{:});
%transpose them if needed
OPT = fsbeach_makecolumn(OPT,{'x','z','ne'});
%check they can be zipped
if length(OPT.x) ~= length(OPT.z)
error('x is of length %d, while z is of length %d...',length(OPT.x),length(OPT.z))
end
xin = OPT.x; %store x input
%check that constant grid is provided as required by SBEACH
diffx = diff(OPT.x);
dx = diffx(1);
if any(diffx~=dx)
dx = mode(diffx);
fprintf('\n')
warning('SBEACH requires constant spacing - interpolating to a regular grid with spacing of %d...',dx)
newx = [OPT.x(1):dx:OPT.x(end)]';
newz = interp1(OPT.x,OPT.z,newx);
OPT.x = newx;
OPT.z = newz;
clear newx newz
end
if settings.NGRID
tempdx = [0];
for ii = 1:settings.NGRID
tempdx = [tempdx; ones(settings.NDXV(ii),1).*settings.DXV(ii)];
end
newx = OPT.x(1) + cumsum(tempdx);
if newx(end) ~= OPT.x(end)
error(['Variable grid is wrong, please adjust DXV and NDXV so that'...
'xstart = %d and xend = %d. Currently xend = %d.'],newx(1),OPT.x(end),newx(end))
end
newz = interp1(OPT.x,OPT.z,newx);
OPT.x = newx;
OPT.z = newz;
clear newx newz
end
if ~isnan(OPT.hbz)
OPT.hbz = interp1(xin,OPT.hbz,OPT.x);
end
%check they are in the right direction
if mean(diff(OPT.x)) < 0
OPT.x = flip(OPT.x);
OPT.z = flip(OPT.z);
if ~isnan(OPT.hbz)
OPT.hbz = flip(OPT.hbz);
end
end
if mean(diff(OPT.z)) > 0
fprintf('\n')
error('Please ensure x coordinate system is increasing offshore')
end
%zip
prifile = [OPT.x OPT.z]; %initial pf
%and write
writetofilepri(prifile, outpath, name)
if ~isnan(OPT.hbz)
hdbfile = [OPT.x OPT.hbz]; %hard bottom pf
writetofilehdb(hdbfile, outpath, name);
end
bathyout.x = OPT.x;
bathyout.z = OPT.z;
bathyout.hbz = OPT.hbz;
end