/[MITgcm]/MITgcm_contrib/mlosch/interp_llc/findocean.m
ViewVC logotype

Contents of /MITgcm_contrib/mlosch/interp_llc/findocean.m

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Thu May 3 21:07:20 2007 UTC (17 years ago) by mlosch
Branch: MAIN
CVS Tags: HEAD
initial checkin of topography and hydrography interpolation scripts for
the llc-grid, based on old matlab scripts by Alistair Adcroft
Let's hope, they are useful.

1 function [newmsk] = findocean( oldmsk, nstartpts, periodic );
2
3 [nx ny]=size(oldmsk);
4 if periodic
5 xp=[2:nx 1];
6 xm=[nx 1:nx-1];
7 yp=[2:ny ny];
8 ym=[1 1:ny-1];
9 else
10 xp=[2:nx nx];
11 xm=[1 1:nx-1];
12 yp=[2:ny ny];
13 ym=[1 1:ny-1];
14 end
15
16 msk=0*oldmsk;
17 i=0;
18 npts=nstartpts;
19 for k=1:floor(ny/npts):ny;
20 for j=1:floor(nx/npts):nx;
21 if oldmsk(j,k)==1
22 i=i+1;
23 msk(j,k)=i;
24 end
25 end;
26 end;
27
28 nmsk=i;
29
30 nnz=size(find(msk==0),1);
31 nnzo=nnz+1;
32 nnzoo=nnzo+1;
33
34 iter=0;
35 while nnz ~= nnzoo & iter < max(nx,ny)/npts
36
37 nnzoo=nnzo;
38 nnzo=nnz;
39
40 iter=iter+1;
41 disp( sprintf('Findocean: iter=%i, num. points in ocean=%i',iter,nnz) );
42 pcol(sq(msk)'); drawnow;
43 % Loop over all masks values
44 k=1;
45 while k<=nmsk
46
47 % Procreate right
48 ii=find(msk(xm,:)==k & msk==0 & oldmsk==1);
49 msk(ii)=k;
50 ii=find(msk(xm,:)==k & msk==0 & oldmsk==1);
51 msk(ii)=k;
52 ii=find(msk(xm,:)==k & msk==0 & oldmsk==1);
53 msk(ii)=k;
54 % Procreate up
55 ii=find(msk(:,ym)==k & msk==0 & oldmsk==1);
56 msk(ii)=k;
57 ii=find(msk(:,ym)==k & msk==0 & oldmsk==1);
58 msk(ii)=k;
59 ii=find(msk(:,ym)==k & msk==0 & oldmsk==1);
60 msk(ii)=k;
61 % Procreate left
62 ii=find(msk(xp,:)==k & msk==0 & oldmsk==1);
63 msk(ii)=k;
64 ii=find(msk(xp,:)==k & msk==0 & oldmsk==1);
65 msk(ii)=k;
66 ii=find(msk(xp,:)==k & msk==0 & oldmsk==1);
67 msk(ii)=k;
68 % Procreate down
69 ii=find(msk(:,yp)==k & msk==0 & oldmsk==1);
70 msk(ii)=k;
71 ii=find(msk(:,yp)==k & msk==0 & oldmsk==1);
72 msk(ii)=k;
73 ii=find(msk(:,yp)==k & msk==0 & oldmsk==1);
74 msk(ii)=k;
75
76 for j=1:nmsk;
77 if k~=j
78 % Join left
79 ii=find(msk(xm,:)==j & msk==k);
80 if ~isempty(ii)
81 msk(find(msk==j))=k;
82 end
83 % Join down
84 ii=find(msk(:,ym)==j & msk==k);
85 if ~isempty(ii)
86 msk(find(msk==j))=k;
87 end
88 end
89 end
90
91 k=k+1;
92 end
93
94 nnz=size(find(msk==0),1);
95 end % while
96
97 % Find largest patch
98 for k=1:nmsk;
99 np(k)=prod(size(find(msk==k)));
100 end
101 [NP,I]=sort(np);
102
103 disp('Number of points in each region:')
104 disp( sprintf('%7i',NP') );
105
106 newmsk=0*msk;
107 newmsk( find(msk==I(end)) )=1;
108 if NP(end-1) > NP(end)/4
109 newmsk( find(msk==I(end-1)) )=1;
110 end

  ViewVC Help
Powered by ViewVC 1.1.22