mountain-waves / tlwplot.m
snesbitt's picture
Mountain Waves — deploy to Hugging Face Space
7c3bfa9
Raw
History Blame Contribute Delete
5.76 kB
function[]=tlwplot(Lupper,Llower,U,H,a,ho,xdom,zdom,mink,maxk);
%-------------------------------------------------------------
% Matlab Subroutine tlwplot.M
% Called from tlwmenu.M--interactive menu system.
%
% By Robert Hart for Meteo 574 / Fall 1995
% Penn State University Meteorology
% Updated 1 March 2018 to increase npts given faster cpus
%
% Program which analyzes and simulates the flow over
% an isolated mountain in the presence of a two-
% layer atmosphere.
%
% Parameters received from menu:
%-------------------------------
% Lupper - Scorer parameter of upper layer
% Llower - Scorer parameter of lower layer
% U - Surface wind speed (in m/s)
% H - Height above ground of 2-layer interface (in m)
% a - Half-width of mountain (in m)
% ho - maximum height of mountain
% xdom - Horizontal extent of domain (m)
% zdom - Vertical extent of domain (m)
% mink - Minimum wavenumber in Fourier analysis of flow
% maxk - Maximum wavenumber in Fourier analysis of flow
%
%--------------------------------------------------------------
npts=100; % # cells in each direction
dk=0.367/a; % wavenumber interval size
% (smaller the better, but
% need to watch calc. time!)
nk=(maxk-mink)/dk; % # loops for wave# integration
minx=-.25*xdom; % leftmost limit of domain
maxx=.75*xdom; % rightmost limit of domain
minz=0; % lower limit of domain
maxz=zdom; % upper limit of domain
matrix1=zeros(npts+1,npts+1); % temp matrix used in integration
matrix2=zeros(npts+1,npts+1); % temp matrix used in integration
matrix3=zeros(npts+1,npts+1); % sum matrix used in integration
dx=(maxx-minx)/npts; % grid cell size in horizontal
dz=(maxz-minz)/npts; % grid cell size in vertical
x=[minx:dx:maxx]; % array of x gridpoints
z=[minz:dz:maxz]; % array of z gridpoints
k=[mink:dk:maxk]; % array of wavenumbers
% mesh arrays into 2-d matrix
[x,z]=meshgrid(minx:dx:maxx,minz:dz:maxz);
ht=0; % initialize weighting for transform
for kloop=1:nk; % wavenumber loop
kk=k(kloop); % horiz wavenumber
m=sqrt(Llower*Llower-kk*kk); % vert wave# in lower layer
n=sqrt(kk*kk-Lupper*Lupper); % vert wave# in upper layer
if (m+i*n==0) % check for divide by zero
r=9e99;
else
r=(m-i*n)/(m+i*n); % reflection coefficient
end;
R=r*exp(2*i*m*H); % reflection calculation
A=(1+r)*exp(H*n+i*H*m)/(1+R); % calculate coefficients
C=1/(1+R);
D=R.*C;
hs=pi*a*ho*exp(-a*abs(kk)); % kk-component of Fourier trans.
ht=ht+pi*dk*a*exp(-a*abs(kk)); % sum Fourier weighting. if
% integrating over 0<k<oo
% ht will end up as pi.
% hence, ht represents the
% fraction, in radians, of
% the spectral interval considered.
aboveH=A*exp(-z.*n).*(z>H); % calculate w in each layer
belowH=(C*exp(i*z.*m)+D*exp(-i*z.*m)).*(z<=H);
% combine layers, and multiply by
% transform of kk-component of topo.
matrix2=((-i*kk*hs*U*(aboveH+belowH)).*exp(-i*x.*kk));
if kloop > 1 % trapezoidal integration/summation
matrix3=matrix3+.5*(matrix1+matrix2).*dk;
end;
matrix1=matrix2; % current w matrix becomes previous
end; % end of integration loop.
w=real(matrix3./ht); % only interested in real comp.
figure; % create new figure window
axis([minx maxx minz maxz]); % define axes
grid; % graw grid
xlabel('X (m)'); % X-axis title
ylabel('Height (m)'); % Z-axis title
title(['Streamline Analysis']); % figure title
stream(x,z,U,w,10); % perform streamline analysis
Hline=H*ones(1,npts+1); % create interface line
plot(x(1,:),Hline,'m--'); % draw interface line in magenta!
figure; % create new figure window
colormap(jet); % set colormap (red=high;blue=low)
axis([minx maxx minz maxz]); % define axes
xlabel('X (m)'); % X-axis title
ylabel('Height (m)'); % Z-axis title
title(['Vertical Velocity (m/s)']); % figure title
hold on; % hold current figure
plot(x(1,:),Hline,'m--'); % draw interface line
caxis([-10 10]); % define color contouring extrema
surface(x,z,w); % 2-d surface contour plot
shading interp; % interpolate between gridpoints
colorbar; % add contour legend
hold off; % remove hold on figure