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

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

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


Revision 1.1 - (hide 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 mlosch 1.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