Code covered by the BSD License  

Highlights from
a Coriolis tutorial

image thumbnail

a Coriolis tutorial

by

 

16 Feb 2003 (Updated )

Scripts that demonstrate aspects of rotating reference frames, Coriolis force and geostrophy.

geoadj_1d_uic.m
%  geoadj_1d_uic.m; adjustment to gravity, rotation and friction in 1-D
%
%  A 1-D numerical ocean model of a single
%  shallow layer of rotating, incompressible fluid.
%  Useful for showing the numerical version of geostrophic
%  adjustment. The numerical methods used here are adequate
%  but not great:  an A-grid (velocity and height at the
%  same grid points) and upwind differencing on advection
%  terms help preserve a shock, but at the expense of high 
%  numerical viscosity (poor energy conservation). High frequency ripples  
%  on ridge height should not be taken literally. Time-stepping is by the  
%  leap-frog/trapezoidal time method.  In all, this may be about the 
%  simplest PE model that works reasonably well for non-linear
%  cases, i.e., you can recognize the major features of the 
%  solution, including a fairly reasonable shock (or bore) in
%  the case of low latitude adjustment to a large initial ridge.  
%
%  by Jim Price,  January, 2001.  
%  Revised in June 2004 to refine the plotting.
%  In March, 2010 to add linear drag and gui interface.
%  September 2010 to fix an error in input of eta0.
%  February 2011,January 2012 to allow more complete variation of the 
%     initial conditions, e.g., zero initial potential vorticity. 
%

clear all
close all
format compact
set(0,'DefaultLineLineWidth',1.5)
set(0,'DefaultTextFontSize',14)
set(0,'DefaultAxesLineWidth',1.4)
set(0,'DefaultAxesFontSize',14)

%  text to display: 
str2(1) =  {'geoadj\_1d\_uic.m '  };
str2(2) =  {'geostrophic adjustment in one dimension  '};
str2(3) =  {'solved by a shallow water, numerical model. '};
str2(4) =  {'You may modify the following variables: '}
str2(5) =  {'latitude, -90 -- 90 degrees'}; 
str2(6) =  {'nominal layer thickness, H = 50 -- 5000 meters'}; 
str2(7) =  {'thickness anomaly, eta0 = 1 -- 200 (< H)'};
str2(8) =  {'half-width of the anomaly, 20 -- 300 kilometers'};
str2(9) =  {'There are three options for the initial current:  '};
str2(10) = {'  Vic = -1 for zero anomaly of potential vorticity, '}; 
str2(11) = {'  Vic =  0 for no current,'};
str2(12) = {'  Vic =  1 for a geostrophic current'};
str2(13) = {'setetato0 = 1 sets eta = 0 after velocity is defined'};
str2(14)=  {'days to integrate, 1 - 20 days. '};

hf3 = figure(9);
clf
set(hf3,'Position',[50 200 600 800])
set(gca,'Visible','off')
text(-.05, 0.80, str2,'FontSize',14,'HorizontalAlignment','left');

latitude = 30.;
hlat = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.44 0.45 0.06], ...
	'FontSize', 14,'fontweight', 'demi', ...
	'Callback', 'eval(get(hlat,''string''))', ...
	'String', 'latitude  = 30 ');

thickness = 500.;
hthick = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.37 0.45 0.06], ...
	'FontSize', 14, 'fontweight', 'demi',...
	'Callback', 'eval(get(hthick,''string''))', ...
	'String', 'nominal thickness  = 500  ');

delrho = 2.0;

eta0 = 50.;
hH = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.30 0.45 0.06], ...
	'FontSize', 14, 'fontweight', 'demi',...
	'Callback', 'eval(get(hH,''string''))', ...
	'String', 'eta0 = 50');

width = 150.;
hwid = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.23 0.45 0.06], ...
	'FontSize', 14, 'fontweight', 'demi',...
	'Callback', 'eval(get(hwid,''string''))', ...
	'String', 'width  = 150  ');

Vic = 0;
hVic = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.16 0.45 0.06], ...
    'FontSize', 14,'fontweight', 'demi', ...
	'Callback', 'eval(get(hVic,''string''))', ...
	'String', 'Vic = 0 ');

setetato0 = 0;
hsetetato0 = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.09 0.45 0.06], ...
	'Callback', 'eval(get(hsetetato0,''string''))', ...
	'FontSize', 14,'fontweight', 'demi', ...
	'String', 'setetato0 = 0 ');

ndays = 4;
hndays = uicontrol('Style', 'Edit', 'Units', 'Normalized', ...
	'Position',  [0.05 0.02 0.45 0.06], ...
	'Callback', 'eval(get(hndays,''string''))', ...
	'FontSize', 14,'fontweight', 'demi', ...
	'String', 'ndays = 4 ');

hgo = uicontrol('Style', 'Pushbutton', 'Units', 'Normalized', ...
	'Position',  [0.80 0.18 0.1 0.06], ...
	'Callback', 'uiresume(9)', ...
	'FontSize', 14,'fontweight', 'demi', ...
	'String', 'start');
hquit = uicontrol('Style', 'Pushbutton', 'Units', 'Normalized', ...
	'Position',  [0.80 0.10 0.1 0.06], ...
	'Callback', 'lquit = 1; uiresume(9)', ...
	'FontSize', 14,'fontweight', 'demi', ...
	'String', 'end');

lquit = 0;
while (lquit == 0)
disp  ('  ... waiting for control panel action.')
uiwait(9)
if lquit == 1; break; end;


clear h u 

%  define the basic statification
H = thickness;
g = 9.8;
delr = delrho/1000.;      %  normalized density difference
c = sqrt(delr*g*H);       %  shallow water phase speed
disp(' the non-disersive phase speed, m/s is ')
disp(c)

% lat = input(' Enter the latitude (degrees, 0 < lat < 90) '); 
f = 2*7.29e-5*sin(latitude*pi/180);
IP = 2*pi/(f + eps);   % an inertial period, seconds

%  set a flag to indicate whether rotation is 'on'
rota = 1;
if abs(latitude) <= 0.00001
   rota = 0;
end

%  calculate the Radius of deformation
Rd = Inf;
if rota == 1
Rd = c/abs((f + eps));        %  Rossby radius of deformation
disp(' the Rossby radius of deformation, km  ')
disp(Rd/1000)
end

W = width*1000/Rd
disp(' the non-d width, L/Rd')
disp(W)

Usc = delr*g*eta0/(f*width*1000);

Mach = Usc/c
disp(' the Mach number, Usc/c ')
disp(Mach)

%  define the grid in x
% dx = Rd/10;               %  grid interval, in units of Rd
% L = 20.*Rd;               %  domain half-width, Rd  (the larger, the better)

%  in general, probably better to do this.....
% if rota == 0
    dx = 3.e3;
    L = 2100.e3;     %  calculate on this domain, 2xL    
    Ld = 500.e3;     %  plot and diagnose on this domain
% end
xu = -L:dx:L;            %  grid points for u,v,h
nx = length(xu);
n1e =  round((L - Ld)/dx);
n2e = nx - round((L - Ld)/dx);

for k=1:nx
    Ldindex(k) = 1;
    if k <= n1e;  Ldindex(k) = 0; end
    if k >= n2e;  Ldindex(k) = 0; end
end

%  define the Rayleigh drag from the given efolding time
efold = 99.e10;
udecay = (1./(efold*8.64e4));  %  Rayleigh drag
E = udecay/abs(f);
disp(' The Ekman number    ')
disp(E)

% use CFL to set the time step
CFL = 0.05;                 %  specify the CFL number
dt = CFL*dx/c;              %  the time step, seconds
if dt >= 30.;               %  but not less than this
    dt = 30.
end

nstep = round(ndays*8.64e4/dt);  %  number of time steps to take

%  store and plot the data at this interval 
nplot = 100;

%  set a flag to make a movie (1) or not (0)
mov = 0;
if mov == 1 
M = moviein(round(nstep/30));
end

% define horizontal diffusion;  helps reduce small scale numerical noise
K = 30;   %  horizontal diffusion, mks, keep as small as possible 
disp('  the diffusion length scale (ndays), km   ') 
Kd = sqrt(K*ndays*8.64e4)/1000.;
disp(Kd)

nonlinu = 1.;     %  set these both to 0 to get a linear model
nonlinh = 1.;     %   having no advection of momentum and thickness

[m nu] = size(xu);
xh = ones(1,nu-1);
xh = cumsum(xh)*dx;
nh = nu - 1;

%  pre-allocate some arrays 
u = zeros(1,nu); unew = u; uold = u; uold2 = u;  ut = u;
v = u; vnew = u; vold = u; vold2 = u; vt = u;
h = u; ht = u; hnew = u; holda = u; hold2 = u; 
na = 0; ha = u; ua = u; va = u;

%  pre-allocate some arrays for storage of diagncostics
uc = zeros(1,nstep);
hc = uc; vc = uc; he = uc; ue = uc; ve = vc; ts = uc;
hf = he; uf = ue; vf = ue; ke = ue; pe = ue; fw = pe; rw = pe;
ns9 = floor(nstep/nplot) + 1;    % for data that are decimated in time
ts9 = zeros(1, ns9);
hs = zeros(nu, ns9); 
% vs = hs; 
ns = 0;    %  a counter used to keep track of how many stored 
nsp = 0;   %   another counter for the movie storage

%  Specify the IC

xl = width*1000.;    %  convert width to m 

for m = 1:nh
    h(m) = 0;
    u(m) = 0.;
    v(m) = 0.;
    xp = xh(m) - L;
   if abs(xp/xl) <= 1;
       h(m) = eta0*sin(pi*xp/xl);
   end
end

for m=2:nh-1
      if Vic == -1; 
         v(m) = v(m-1) - dx*f*(1 - (h(m) + H)/H);
         u(m) = 0;
      end
      if Vic == 0
         u(m) = 0;
         v(m) = 0.;
      end
      if Vic == 1
       v(m) = (delr*g)*(h(m+1) - h(m-1))/(2*dx*f);
       u(m) = 0.;
      end
end

for m=1:nh
    if setetato0 == 1
          h(m) = 0.;
    end
end


%  now smooth the ridge and any initial u,v a little

for jj=1:6
a4 = 0*h;
a5 = a4;
a6 = a4;
 for m=2:nh        
    a4(m) = 0.33*(h(m-1) + h(m+1) + h(m));
    a6(m) = 0.33*(u(m-1) + u(m) + u(m+1));  
    a5(m) = 0.33*(v(m-1) + v(m) + v(m+1));
 end
 a4(1) = h(1);  a4(nh+1) = h(nh+1);
 h = a4;
 v = a5;
 u = a6;
end    %   loop on smoothing the IC
 

%  initialize time levels
holda = h;
hold2 = h;
h0 = h;
vold = v;
vold2 = v;
v0 = v;
uold = u;
uold2 = u;
u0 = u;


%  store the initial h and PV
hi = h;
dv = 0.5*(diff([0 v]) + diff([v 0]));
dv(1) = 0.; dv(nu) = 0.; 
rvort = dv/dx;
PVi = (rvort + f)./(H + h);

%
%  now we are ready to start time stepping
%  the first step has to be Euler forward

   du = 0.5*(diff([0 u]) + diff([u 0]));
   dv = 0.5*(diff([0 v]) + diff([v 0]));
   dh = 0.5*(diff([0 h]) + diff([h 0]));

   du(1) = 0.; du(nu) = 0.; 
   dv(1) = 0.; dv(nu) = 0.; 
   dh(1) = 0.; dh(nu) = 0.;
   
   ut = f*v - (delr*g*dh/dx + udecay*u + nonlinu*u.*du/dx);
   vt = -(f*u + udecay*v + nonlinu*u.*dv/dx);
   ht = -(H*du/dx + nonlinh*h.*du/dx + nonlinh*u.*dh/dx);
  
   uold = u;
   vold = v;
   holda = h;
  
   u = uold + dt*ut;
   v = vold + dt*vt;
   h = holda + dt*ht;  
 
hf1 = figure(1);
clf reset  
     
%  now for the real integration.....
for m = 1:nstep   

%  use a leap-frog method with an occasional 
%   trapezoidal correction to supress time splitting

   trap = 20;
   mtype = mod(m,trap);  %  decide whether to do a trapezoidal step (20 - 100)
   
   if mtype >= 1       %  come here for a simple leap frog 
          
   du = 0.5*(diff([0 u]) + diff([u 0]));
   dv = 0.5*(diff([0 v]) + diff([v 0]));
   dh = 0.5*(diff([0 h]) + diff([h 0]));
   du(1) = 0.; du(nu) = 0.; 
   dv(1) = 0.; dv(nu) = 0.; 
   dh(1) = 0.; dh(nu) = 0.;

%  velocity and derivatives needed for an upwind difference

   ul = 0.5*(u + abs(u));
   ur = 0.5*(u - abs(u));

   dhl = diff([0 h]); dhl(1) = 0.; dhl(nu) = 0.;
   dhr = diff([h 0]); dhr(1) = 0.; dhr(nu) = 0.;
   dul = diff([0 u]); dul(1) = 0.; dul(nu) = 0.;
   dur = diff([u 0]); dur(1) = 0.; dur(nu) = 0.;
   dvl = diff([0 v]); dvl(1) = 0.; dvl(nu) = 0.;
   dvr = diff([v 0]); dvr(1) = 0.; dvr(nu) = 0.;


   du2 = [0 diff(u,2) 0]/dx^2;
   dv2 = [0 diff(v,2) 0]/dx^2;
   dh2 = [0 diff(h,2) 0]/dx^2;
      
   ut = f*v + K*du2 - (delr*g*dh/dx + udecay*u + ...
           nonlinu*(ur.*dur/dx + ul.*dul/dx));

   vt = K*dv2 - (f*u + udecay*v + ...
           nonlinu*(ur.*dvr/dx + ul.*dvl/dx));

   ht = K*dh2 - (H*du/dx + nonlinh*h.*du/dx + ...
           nonlinh*(ur.*dhr/dx + ul.*dhl/dx));
   
   uold2 = uold;
   vold2 = vold;
   hold2 = holda;
   
   uold = u;
   vold = v;
   holda = h;
  
   u = uold2 + 2*dt*ut;
   v = vold2 + 2*dt*vt;
   h = hold2 + 2*dt*ht;   
   
   else    %  do a leap-frog/trapezoidal time step
    
   du = 0.5*(diff([0 u]) + diff([u 0]));
   dv = 0.5*(diff([0 v]) + diff([v 0]));
   dh = 0.5*(diff([0 h]) + diff([h 0])); 
   du(1) = 0.; du(nu) = 0.; 
   dv(1) = 0.; dv(nu) = 0.; 
   dh(1) = 0.; dh(nu) = 0.;

%  velocity and derivatives needed for an upwind difference

   ul = 0.5*(u + abs(u));
   ur = 0.5*(u - abs(u));

   dhl = diff([0 h]); dhl(1) = 0.; dhl(nu) = 0.;
   dhr = diff([h 0]); dhr(1) = 0.; dhr(nu) = 0.;
   dul = diff([0 u]); dul(1) = 0.; dul(nu) = 0.;
   dur = diff([u 0]); dur(1) = 0.; dur(nu) = 0.;
   dvl = diff([0 v]); dvl(1) = 0.; dvl(nu) = 0.;
   dvr = diff([v 0]); dvr(1) = 0.; dvr(nu) = 0.;

   du2 = [0 diff(u,2) 0]/dx^2;
   dv2 = [0 diff(v,2) 0]/dx^2;
   dh2 = [0 diff(h,2) 0]/dx^2;
      
   ut = f*v + K*du2 - (delr*g*dh/dx + udecay*u + ...
           nonlinu*(ur.*dur/dx + ul.*dul/dx));

   vt = K*dv2 - (f*u + udecay*v + ...
           nonlinu*(ur.*dvr/dx + ul.*dvl/dx));

   ht = K*dh2 - (H*du/dx + nonlinh*h.*du/dx + ...
           nonlinh*(ur.*dhr/dx + ul.*dhl/dx));
 
   u1 = u + 0.5*dt*ut;
   v1 = v + 0.5*dt*vt;
   h1 = h + 0.5*dt*ht; 
  
   
   du = 0.5*(diff([0 u1]) + diff([u1 0]));
   dv = 0.5*(diff([0 v1]) + diff([v1 0]));
   dh = 0.5*(diff([0 h1]) + diff([h1 0]));
   du(1) = 0.; du(nu) = 0.; 
   dv(1) = 0.; dv(nu) = 0.; 
   dh(1) = 0.; dh(nu) = 0.;

%  velocity and derivatives needed for an upwind difference

   ul = 0.5*(u1 + abs(u1));
   ur = 0.5*(u1 - abs(u1));

   dhl = diff([0 h1]); dhl(1) = 0.; dhl(nu) = 0.;
   dhr = diff([h1 0]); dhr(1) = 0.; dhr(nu) = 0.;
   dul = diff([0 u1]); dul(1) = 0.; dul(nu) = 0.;
   dur = diff([u1 0]); dur(1) = 0.; dur(nu) = 0.;
   dvl = diff([0 v1]); dvl(1) = 0.; dvl(nu) = 0.;
   dvr = diff([v1 0]); dvr(1) = 0.; dvr(nu) = 0.;
 
   du2 = [0 diff(u1,2) 0]/dx^2;
   dv2 = [0 diff(v1,2) 0]/dx^2;
   dh2 = [0 diff(h1,2) 0]/dx^2;
      
   ut = f*v + K*du2 - (delr*g*dh/dx + udecay*u + ...
           nonlinu*(ur.*dur/dx + ul.*dul/dx));

   vt = K*dv2 - (f*u + udecay*v + ...
           nonlinu*(ur.*dvr/dx + ul.*dvl/dx));

   ht = K*dh2 - (H*du/dx + nonlinh*h.*du/dx + ...
           nonlinh*(ur.*dhr/dx + ul.*dhl/dx));
       
 
  
   u = uold + dt*ut;
   v = vold + dt*vt;
   h = holda + dt*ht;
    
   uold = u;
   vold = v;
   holda = h;
 
   ut = 0.*ut;
   vt = 0.*vt;
   ht = 0.*ht;
   
end  %  if on mtype (whether leap or trap)

%  Apply a radiation BC to the grid ends.  This is only moderately 
%   succesful because the phase speed changes in time.
   
   bcfactor = 1.1;     % an ad hoc 'correction' for the radiation BC
   rbc = bcfactor*c*dt/dx;
   
   u(1) = u(1) + rbc*(u(2) - u(1));
   v(1) = v(1) + rbc*(v(2) - v(1));
   h(1) = h(1) + rbc*(h(2) - h(1));
   u(nu) = u(nu) + rbc*(u(nu-1) - u(nu));
   v(nu) = v(nu) + rbc*(v(nu-1) - v(nu));
   h(nu) = h(nu) + rbc*(h(nu-1) - h(nu));
   
% store some data for plotting later
   
 
   ts(m) = m*dt/8.64e4;       %  the time (days)

% store data from several points.......
%
%  a far field point
   np = length(u);
   nf = round(np/2 + (Ld - 100*1000)/dx);
   hf(m) = h(nf); 
   uf(m) = u(nf);
   vf(m) = v(nf);
   
% a point on the edge of the initial ridge   
   ne = round(np/2 + xl/dx);
   he(m) = h(ne);  %  h,u,v at a point near the edge of the front
   ue(m) = u(ne);
   ve(m) = v(ne);

   na = na + 1;               %  sum for averages
   ha = ha + h;
   ua = ua + u;
   va = va + v;

%  evaluate the energy balance at each time step over the
%      interval -Ld to Ld

keall = 0.5*(H + h).*(u.^2 + v.^2);
peall = 0.5*g*delr*(h.^2); 
ke(m) = dx*sum(Ldindex.*keall);
pe(m) = dx*sum(Ldindex.*peall);
fw3 =  udecay*(u.^2 + v.^2).*(H + h);
fs1 = -dt*dx*sum(Ldindex.*fw3);

%  the radiation (pressure work) evaluated at +-Ld.
%   note that the h shown here is eta of the paper........
rad = dt*g*delr*( u(n1e)*h(n1e)*(H + h(n1e)) ...
    - u(n2e)*h(n2e)*(H + h(n2e)) );

% sum the friction and radiation
if m==1  
    fw(m) = fs1;
    rw(m) = rad;   
else
    fw(m) = fw(m-1) + fs1;
    rw(m) = rw(m-1) + rad;  
end

% other diagnostic data are decimated in time

if mod(m,nplot) == 1    %  save the entire grid occasionally
   ns = ns+1;
  
   hs(:,ns) = h(:);
%  vs(:,ns) = sqrt(v(:).^2 + u(:).^2);
   ts9(ns) = ts(m);

% plot the solution, every 2*nplot steps
figure(1)
clf 

set(gcf,'DoubleBuffer','on')
set(gcf, 'position', [250 250 800 400])
axis([-Ld/1000. Ld/1000. -1.25 4.75])

vv = axis;
xyscale = (vv(2) - vv(1))/(vv(4) - vv(3));
for q=1:2:nu
   hold on
   % xa = xu(q)/1000.; 
   if rota == 1
   xa = xu(q)/1000.;
else 
    xa = xu(q)/1.e3;
   end
   Lplot = Ld;    % this is the scale of the plot
   ya = 2.5;
   xb = xa + (Lplot/(1000*4))*uold(q)/(2.5*Usc);
   yb = ya + vold(q)/(2.5*Usc);
   
if rota == 0            %  switch the components if there is no rotation
   xb = xa + 2*vold(q)/Usc;
   yb = ya + uold(q)/Usc;
end
   plot([xa xb], [ya yb], 'LineWidth', 1.0)
end

plot(xu/1000., hi/abs(eta0),  'g', 'linewidth', 1.0)   % the IC

if rota == 0
    text(-425., 3.0, 'these currents are rotated 90^o ccw')
end

if rota == 0
 %   title(['gravitational adjustment, latitude = ', num2str(latitude,2)])
else
% title(['geostrophic adjustment; latitude = ', num2str(latitude,2), ...
 %     ', Ekman = ', num2str(Ekman,2)]) 
end

%  add the Rd scale
if abs(latitude) >= 0.1
plot([-300 (-300 + Rd/1000)], [1.5 1.5], 'k')
text(-370., 1.5, 'Rd')
end

hold on


if rota == 0
    E = NaN;
end
abseta0 = abs(eta0);

if rota == 1
 plot(xu/1000, holda/abseta0); 
 fill([xu(1)/1000 xu/1000 max(xu)/1000], [-9 holda/abseta0 -9], [0.6 0.6 0.8]);
else
   plot(xu/1.e3, holda/abseta0, 'EraseMode', 'none'); 
 fill([xu(1)/1.e3 xu/1.e3 max(xu)/1.e3], [-9 holda/abseta0 -9], [0.6 0.6 0.8]);
end
   ylabel('\eta/\eta_0  and  U/(C \eta_0/H)')
   if rota == 1
      ylabel('\eta/\eta_0  and  V/(C \eta_0/H)') 
  end

xlabel('X distance, km', 'EraseMode', 'none')

timed = (floor(100*m*dt/8.64e4))/100.;
if rota == 1
	text(200., 1.7, ['time, days  = ', num2str(timed,2)])
   tIP = timed*8.64e4/IP;
   timeIP = (floor(100*tIP))/100.;
   text(200., 1.2, ['time, IP = ', num2str(timeIP,2)])
else 
	text(200., 1.7, ['time, days = ', num2str(timed,2)])
end

plot(xu/1000., hi/abseta0,  'g', 'linewidth', 1.0)   % the IC

% title1 = ['geoadj\_1d:  lat = ', num2str(latitude,2), '^o,  C = ', ...
%      num2str(c,2), ...
%      ' m s^{-1},   R_d = ', num2str(Rd/1000, 2), ...
%      ' km, H = ',num2str(thickness,3), ' m,  \eta_0 = ', ...
%      num2str(eta0, 2), ' m'];
%  
W = width*1000/Rd;
title2 =  ['C \eta_0/H = ', num2str(Usc, 2), ' m s^{-1},' ...
    ' L/R_d = ', num2str(W,2), ',  Mach no. = ', ...
    num2str(Mach,2), ',  Ekman no. = ',  num2str(E,2)]; 

% title([{title1, title2}]) 

if Vic == -1; title('IC: uniform potential vorticity'); end
if Vic == 0; title('IC: zero initial velocity'); end
if Vic == 1; title('IC: geostrophic balance'); end
if setetato0 == 1;
if Vic == -1; title('IC: uniform potential vorticity, then eta = 0'); end
if Vic == 0; title('IC: zero initial velocity, then eta = 0'); end
if Vic == 1; title('IC: geostrophic balance, then eta = 0'); end
end

drawnow
if m == 1;  pause(2.0); 
    text(250., 2.7, 'start', 'color', 'r');
    drawnow; pause(0.6);   
end
    

mov = 1;
if mov == 1 
nsp = nsp + 1;
M(:,nsp) = getframe(gcf, [0 0 800 400]);

end


end    %  if on plot this time step ot not
   
end    %  end of the time stepping loop



%  compute time averages

ha = ha/na;
ua = ua/na;
va = va/na;

%  plot some things


%  plot some current components
figure(2)
clf reset

tip = ts;
subplot(2,1,1)
plot(ts, uf/Usc, 'b', ts, vf/Usc, '--r')
ylabel('U far/(C \eta_0/H)')
legend('U','V')
title('Currents in the far field, x = 400 km, and on the ridge edge')

subplot(2,1,2)
plot(ts, ue/Usc, 'b', ts, ve/Usc, '--r')
xlabel('time, days'); ylabel('Uedge/(C \eta_0/H)')
legend('U','V')


%  3-d plot of eta
figure(3)
clf reset
set(gcf, 'paperposition', [1 1 6 6])

%  interpolate eta onto a reasonably-sized grid before plotting

nt9 = length(ts9);
xd9 = -Ld:2000.:Ld;
nxd9 = length(xd9);
clear etas9 eta9
etas9 = zeros(nxd9, nt9);

for j=1:nt9
bc = hs(:,j);    
eta9(:,j) = interp1(xu, bc', xd9);
end

mesh(ts9, xd9/1000., eta9/abseta0);

xlabel('time, days')
ylabel('X distance, km')
zlabel('\eta/\eta_0')
axis([0 ndays -Ld/1000 Ld/1000 -1.1 1.1])
% title('geostrophic/gravitational adjustment in 1-d') 
view([-70 60])
% add the gravity wave speed 
t4 = (Ld/c)/8.64e4;
tx = 0:0.1:t4;
cx = tx*8.64e4*c;
zx = 0.55*ones(1,length(tx));
hold on
plot3(tx, cx/1000., zx, 'r', tx, -cx/1000., zx, 'r')


%  energy budget
figure(8)
clf reset
set(gcf, 'paperposition', [0 0 5 5])
Esc = ke(1) + pe(1); 
plot(ts, ke/Esc, 'r', ts, pe/Esc, 'b', ts, (ke + pe)/Esc, 'g', ...
    ts, fw/Esc, 'r--', ts, rw/Esc, 'm')
hl = legend('KE', 'PE','KE + PE', 'FW', 'PW', ...
       'Location', 'SouthWest')
legend boxoff
set(hl, 'fontsize', 14)
xlabel('time, days')
ylabel('energy/PE_0')
hold on
plot([0 max(ts)], [0 0], 'k--')
axis([0 max(ts) -1.2 1.2])

if rota == 1;    %  if latitude approx 0, skip the things below
    
%  PV budget....
%  compute the final PV

dv = 0.5*(diff([0 va]) + diff([va 0]));
dv(1) = 0.; dv(nu) = 0.; 
rvort = dv/dx;
PVf = (f + rvort)./(H + h);
PVflin = (f + 0*rvort)./(H + h);
%
% figure(4)
% clf reset
% subplot(2,1,1)
% plot(xu/1000., hi/eta0, 'g', xu/1000., h/eta0,'r'); 
% axis([-Ld/1000. Ld/1000 -1.2 1.2]);
% ylabel('h/\eta_0')
% legend('initial', 'final')
% legend boxoff
% title('Initial and final thickness and PV')
% 
% subplot(2,1,2)
% plot(xu/1000., PVi,'g', xu/1000., PVf, 'r', xu/1000., PVflin, 'b'); 
% axis([-L/1000 L/1000  0.95e-7 1.02e-7]); 
% xlabel('distance, km')
% ylabel('Potential Vorticity')
% legend('initial', 'final','f/ H + \eta')
% legend boxoff
% end

%  plot some average currents
% average current and rel vorticity

figure(5)
clf reset
subplot(2,1,1)
plot(xu/1000., ua/Usc, xu/1000., va/Usc, 'g')
ylabel('U, V avg speeds/(C \eta_0/H)')
legend('Uavg', 'Vavg')
axis([-L/1000 L/1000 -0.5 0.5]) 
title('Time average currents, etc.')

subplot(2,1,2)
plot(xu/1000., rvort/f)
xlabel('distance, km')
ylabel('rel vorticity/f')
axis([-L/1000 L/1000 -abseta0/H abseta0/H])


%  plot the PV budget here
L = 500000;



%  radius of deformation
% g = 9.8;
% dr = 2.;
% r0 = 1000.;
% H = thickness;
% lat = latitude;
% f = 2.*7.292e-5*sin(lat*pi/180);
% 
% C = sqrt(g*dr*H/r0);
% Rd = C/abs(f);
% 
% Ly = width;
% y = -2.5*Ly:2:2.5*Ly;
% y = 1000*y;
% Ly = Ly*1000.;
% 
% for j=1:length(y)
% 
% if y(j) >= 0    
% eta(j) = (eta0/2)*(1 - exp((y(j) - Ly)/Rd));
% if (y(j) - Ly) >= 0
% eta(j) = eta0/2*(exp(-(y(j) - Ly)/Rd) - 1);
% end
% end
% 
% if y(j) <= 0
% eta(j) = (eta0/2)*(exp((y(j) + Ly)/Rd) - 1);
% if (y(j) + Ly) >= 0
% eta(j) = eta0/2*(1 - exp(-(y(j) + Ly)/Rd));
% end
% end
% 
% end
% eta = eta + eta0/2;
% 
% 
% subplot(3,1,1) 
% plot(xu/1000, hi/abseta0, 'g',  xu/1000, h/abseta0, 'b', y/1000, eta/abseta0, 'r')
% hl = legend('\eta_0', '\eta_{final}', '\eta_{q conserv}'); 
% set(hl,'fontsize', 14)
% legend boxoff
% axis([-L/2000 L/2000 -1.2 1.2])
% grid on
% ylabel('\eta/\eta_0')


end    % if on rotation or not

% figure(9)

% % if you want to see the movie again
% replayn = 0;
% replayn = input('  To replay the movie, enter 1, 2 or 3 (0 = no)  ');
% if replayn >= 1
%     figure(1); 
%     set(gcf, 'paperposition', [0 0 850 400])
%     set(gca, 'position', [0 0 1 1])
%     movie(M,replayn,6)
% end

end    %  end of the function

aviobj = avifile('mymovie.avi') 
aviobj = addframe(aviobj,M);
aviobj = close(aviobj)



Contact us