Circumpolar grid

Discussion about analysis, visualization, and collaboration tools and techniques

Moderators: arango, robertson

Post Reply
Message
Author
vmeccia
Posts: 2
Joined: Fri Nov 13, 2009 6:21 pm
Location: Instituto Oceanográfico - University of Sao Paulo

Circumpolar grid

#1 Post by vmeccia » Wed Dec 09, 2009 9:44 pm

Hi!
I'm a new Roms user. I'm planning to implement the model in the Southern Ocean. So I would like to construct a circumpolar grid with variable horizontal resolution. I'm dealing with Seagrid but I'm not sure that it is the best tool for constructing such a grid since it doesn't use an azimuthal projection (or I didn't find it?).
Does anybody know about an adequate tool for doing that? Does anybody have a suggestion?
Please accept my apologies if it is not the correct place to post my doubt, but your opinion will be very valuable for me.
Cheers.

User avatar
kate
Posts: 3780
Joined: Wed Jul 02, 2003 5:29 pm
Location: CFOS/UAF, USA

Re: Circumpolar grid

#2 Post by kate » Mon Dec 14, 2009 5:12 pm

How do you want your resolution to vary? What I would do is create an analytic polar coordinate grid then use editmask to mask out the land. There is a LAB_CANYON example in ROMS to do something similar, though you would have to make an external grid file to use editmask.

vmeccia
Posts: 2
Joined: Fri Nov 13, 2009 6:21 pm
Location: Instituto Oceanográfico - University of Sao Paulo

Re: Circumpolar grid

#3 Post by vmeccia » Tue Dec 15, 2009 10:13 am

Many thanks Kate to reply!!! I finally could reach the grid I wanted (I think....)
Cheers,
Virna

User avatar
susonic
Posts: 160
Joined: Tue Aug 21, 2007 5:44 pm
Location: Jeju National University
Contact:

Re: Circumpolar grid

#4 Post by susonic » Tue Apr 22, 2014 10:49 pm

Hi,

Is there a toolbox to generate attached figure like domain?
Attachments
grid.jpg

Pysh
Posts: 30
Joined: Tue Nov 29, 2011 3:51 pm
Location: Hydrometcenter of Russia

Re: Circumpolar grid

#5 Post by Pysh » Wed Apr 23, 2014 6:35 am

Hi

May be this script? Sometimes it works normally :)

(Gurvan Madec, Maurice Imbard; A global ocean mesh to overcome the North Pole singularity; Climate Dynamics (1996) 12:381-388)

Cheers
Boris

Code: Select all

function glob_grid

global Jeq JM dd

% ---- net parameters ------------

IM = 280;   % number of longitudes (without additional overlappimg point for periodic variant)
JM = 275;   % number of latitudes from pole to pole
Jeq = 115;  % South-North latitude number 
Lan = 40;   % latitude of north pole
Lon = 80;   % longitude of north pole
Lae = 0;    % South-North bourder latitude
a2b = 2.5;  % maximum axis relation in the north pole
a_fr_fg = 0;  % 1 - minimum axis calculate from f and g, else maximum axis
Jel = 200;  % Start number of ellipse

%  ----- parameters for correction longitudes on 180 meridian (smoothing)
dnl = 6;  % --- numbers of longidudes from 180 meridian --------
dns = 3;   % ---- width od smoothing window ------------ 

%  ----- parameters of grid for latitudes limits -------------
nlan = 25;   % number of the last latitude in the grid from north pole
nlas = 9;    % number of first latitude in the grid from south pole
batmax = 0;  % maximum of depth in bathymetry data

% --------- steps for grid picture ---------------
lastp = 1;
lostp = 1;

%  ------- constraction of f and g functions for cicles on stereographic projection --------------------
% ((x/a)^2 + ((y-b-f)/b)^2 = 1)

for j = 1:Jeq
 af(j) = -pi + (pi / 2 + Lae * pi / 180) / (Jeq - 1) * (j - 1);   
 ag(j) = pi + (-Lae * pi / 180 - pi / 2 )/ (Jeq - 1) * (j - 1);  
end

alf_to = pi / 2 - Lan * pi / 180;  
alff_fr = -pi / 2 + Lae * pi / 180;  
alfg_fr = pi / 2 - Lae * pi / 180;  

delaf = alf_to - alff_fr;
df = (alff_fr - (-pi)) / (Jeq - 1);
dd = delaf / df;
cef = fzero(@cc, 1 / dd + 0.001);
bef = delaf / (exp(cef * JM) - exp(cef * Jeq));
aef = alff_fr - bef * exp(cef * Jeq);

delag = alf_to - alfg_fr;
dg = (alfg_fr - pi) / (Jeq - 1);
dd = delag / dg;
ceg = fzero(@cc, -1 / dd + 0.001);
beg = delag / (exp(ceg * JM) - exp(ceg * Jeq));
aeg = alfg_fr - beg * exp(ceg * Jeq);

for j = Jeq+1:JM
 af(j) = aef + bef * exp(cef * j);   
 ag(j) = aeg + beg * exp(ceg * j);   
end

k(1:Jel) = 1;
for j = Jel+1:JM
 k(j) = 1 + ((a2b - 1) / (JM - Jel) * (j - Jel))^2; 
end

f = sin(af);
g = sin(ag);

if a_fr_fg  == 0
 b = (g - f) / 2;
 a = b .* k;
else
 a = (g - f) / 2;
 b = a ./ k;
end    

% ---- points on equatorial cicle --------------
dx = 2 * pi / IM;
for i = 1:IM
 x(i,Jeq) = cos(-pi / 2 + (i - 1) * dx);
 y(i,Jeq) = sin(-pi / 2 + (i - 1) * dx);
end

% ------ points on initial longitude line ----------
for j = Jeq+1:JM-1
 x(1,j) = 0;
 y(1,j) = f(j);
 x(IM/2+1,j) = 0;
 y(IM/2+1,j) = g(j);
end

% ---- points coordinates constraction from condition of  
% ( {x4-x1,y4-y1} . {x-x4,y-y4}) = 0   (scalar production of the
% perpendicular vectors) and equation for ellipse{x,y} x^2/a^2 + (y^2 - (f +
% b))^2/b^2 = 1

for j = Jeq+1:JM-1
 for i = 1:IM/2
  x1 = x(i,j-1);
  x4 = x(i+1,j-1);
  y1 = y(i,j-1);
  y4 = y(i+1,j-1);
  dx = x1 - x4;
  dy = y1 - y4;
  a1 = y4 + x4 * dx / dy;
  b1 = -dx / dy;
  c1 = b(j)^2 + a(j)^2 * b1^2;
  c2 = 2 * a(j)^2 * b1 * (a1 - f(j) - b(j));
  c3 = a(j)^2 * (a1 - f(j) - b(j))^2 - (a(j)* b(j))^2;
  det = max(0, c2 * c2 - 4 * c1 * c3); 
  x(i+1,j) = (-c2 + det^0.5) / 2 / c1;
  y(i+1,j) = a1 + b1 * x(i+1,j);
 end    
end

% --------- simmetrics for longitudes -----------
for j = Jeq+1:JM-1
 for i = IM/2+2:IM
  ifr = IM - i + 2;  
  x(i,j) = -x(ifr,j); 
  y(i,j) = y(ifr,j); 
 end    
end    

% ----------- south hemisphere (not disturbed) -----------------
dla2e = (Lae + 90) / (Jeq - 1);
for j = 1:Jeq
 for i = 1:IM   
  lon(i,j) = (i - 1) * 360 / IM; 
  lat(i,j) = -90 + (j - 1) * dla2e;
 end
end

for j = Jeq+1:JM-1
 for i = 1:IM
  if x(i,j) == 0 && y(i,j) < 0    
   lon(i,j) = 0; 
  elseif x(i,j) == 0 && y(i,j) > 0    
   lon(i,j) = 180; 
  elseif x(i,j) > 0     
   lon(i,j) = 90 + 180 / pi .* atan(y(i,j)/x(i,j)); 
  elseif x(i,j) < 0    
   lon(i,j) = 270 + 180 / pi .* atan(y(i,j)/x(i,j)); 
  end
 end
end

% ---------- projection from stereograpthic plate onto sphere -----------
lat(:,Jeq+1:JM-1) = 90 - 180 / pi .* asin((x(:,Jeq+1:JM-1).^2 +y(:,Jeq+1:JM-1).^2).^0.5); 

for j = Jeq+1:JM-1
 if lon(1,j) == 0
  lon(2,j) = lon(3,j) / 2;
  lon(IM,j) = (360 + lon(IM-1,j)) / 2;
 else
  lon(2,j) = (180 + lon(3,j)) / 2;
  lon(IM,j) = (180 + lon(IM-1,j)) / 2;
 end
 lat(2,j) = correct_lat(lon(2,j), a(j), b(j), f(j), y(2,j));
 lat(IM,j) = correct_lat(lon(IM,j), a(j), b(j), f(j), y(IM,j));
end


% ----- additional point for periodic variant --------------
lon(IM+1:IM+2,:) = lon(1:2,:);
lat(IM+1:IM+2,:) = lat(1:2,:);

% ------- smoothing longitudes near 180 meridian to correct algorithm
% accumulated error
lon1 = lon;
lons = lon;
sdns = 2 * dns + 1;
for j = Jeq:JM-1
 for i = IM/2-dnl:IM/2+dnl
  lon1(i,j) = sum(lons(i-dns:i+dns,j)) / sdns;
  lat1(i,j) = correct_lat(lon1(i,j), a(j), b(j), f(j), y(i,j));
 end
end 

% -------- shift longitudes in order to initial longidute will be 0 ----
lon1 = mod(lon1+Lon+180,360);
lat1 = lat;

%nl = floor(Lon / 360 * IM);
nl = ceil(Lon / 360 * IM);
dn = IM / 2 - nl;
for i = 1:IM-dn
 lon2(i,:) = mod(lon1(i+dn,:),360);   
 lat2(i,:) = lat1(i+dn,:);    
end
for i = IM-dn+1:IM+1
 lon2(i,:) = mod(lon1(i-IM+dn,:),360);    
 lat2(i,:) = lat1(i-IM+dn,:);    
end    

lon3 = lon2(:,nlas:JM-nlan);
lat3 = lat2(:,nlas:JM-nlan);

samplefactor = 1;
[bat, refvec] = etopo('ETOPO5.dat', samplefactor);

dloe = 360 / 4320 / samplefactor;
dlae = 180 / 2160 / samplefactor;

[m, n] = size(lat3);

for i = 1:m
 for j = 1:n
  ii = max(floor(lon3(i,j) / dloe),1);
  jj = max(floor((lat3(i,j) + 90) / dlae),1);
  bat3(i,j) = bat(jj,ii);
 end
end 

for i = 1:m
 for j = 1:n
  if isnan(bat3(i,j))
   i1 = i + 1;
   if i1 == m + 1; i1 = 1; end 
   i2 = i - 1;
   if i2 == 0; i2 = m; end;
   j1 = min(n,j+1);
   j2 = max(1,j-1);
   si = 0; sb = 0;
   if ~isnan(bat3(i1,j1)); si = si + 1; sb = sb + bat3(i1,j1); end 
   if ~isnan(bat3(i2,j2)); si = si + 1; sb = sb + bat3(i2,j2); end 
   if ~isnan(bat3(i1,j2)); si = si + 1; sb = sb + bat3(i1,j2); end 
   if ~isnan(bat3(i2,j1)); si = si + 1; sb = sb + bat3(i2,j1); end 
   if si > 0
    bat3(i,j) = sb / si;
   else
    bat3(i,j) = NaN;   
   end    
   astop = 1;   
  end    
 end
end 

bat3(bat3 > batmax) = 10000; 

% ------- saving grid to file -------------

rho.lon = lon3;
rho.lat = lat3;
rho.depth = bat3;
save toroms_glob.mat rho

%  ------- pictures of grid with bathymetry -------------
figure
axesm ('MaPprojection','glob','Meridianlabel','on','Parallellabel','on');
hold on
surfm(lat3,lon3,bat3);

for j = 1:lastp:n
 plotm(lat3(:,j), lon3(:,j),'w');
 astop = 1;
end
for i = 1:lostp:m
 plotm(lat3(i,:), lon3(i,:),'w');
 astop = 1;
end
astop = 1;

function lat = correct_lat(lon, a, b, f, yo)
 b1 = -1 / tan(lon * pi / 180);
 c1 = b^2 + a^2 * b1^2;
 c2 = -2 * a^2 * b1 * (f + b);
 c3 = a^2 * (f^2 + 2 * f * b);
 det = max(0, c2 * c2 - 4 * c1 * c3); 
 dy1 = yo - b1 * (-c2 + det^0.5) / 2 / c1;
 dy2 = yo - b1 * (-c2 - det^0.5) / 2 / c1;
 if abs(dy1) > abs(dy2)
  x = (-c2 - det^0.5) / 2 / c1;
 else
  x = (-c2 + det^0.5) / 2 / c1;
 end    
 y = b1 * x;
 lat = 90 - 180 / pi * asin((x^2 +y^2)^0.5); 

function cf = cc(x)
global Jeq JM dd 
cf = x - log(1 + x * dd) / (JM - Jeq); 
Attachments
glob_grid.m
(7.21 KiB) Downloaded 82 times

User avatar
susonic
Posts: 160
Joined: Tue Aug 21, 2007 5:44 pm
Location: Jeju National University
Contact:

Re: Circumpolar grid

#6 Post by susonic » Wed Apr 23, 2014 8:05 am

I sincerely appreciate your file.
It will be very helpful.
Thank you so much.

Best,
-JH

Post Reply