/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_calc/gcmfaces_loc_tile.m
ViewVC logotype

Annotation of /MITgcm_contrib/gael/matlab_class/gcmfaces_calc/gcmfaces_loc_tile.m

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


Revision 1.6 - (hide annotations) (download)
Fri Dec 30 22:22:02 2016 UTC (8 years, 6 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66o, HEAD
Changes since 1.5: +3 -0 lines
- add comment wrt ordering conventions

1 gforget 1.2 function [varargout]=gcmfaces_loc_tile(ni,nj,varargin);
2     %object : compute map of tile indices and (optional) associate
3     % select location (1D vectors) with tile indices etc.
4 gforget 1.1 %input : ni,nj is the MITgcm tile size (2 numbers total)
5 gforget 1.2 % (optional)
6 gforget 1.1 % AND XC,YC (vectors)
7     % OR iTile, jTile, tileNo (vectors)
8     % OR iTile, jTile, XC11, YC11, XCNINJ, YCNINJ (vectors)
9     %where :
10     % XC, YC are lon/lat of the grid point
11     % tileNo is the grid point s tile number (assuming no blank tiles)
12     % iTile, jTile is the grid point tile index
13     % XC11, YC11 is lat/lon for the tile SE corner
14     % XCNINJ, YCNINJ is lat/lon for the tile NW corner
15     %
16 gforget 1.2 %output : (nargin==2) tileNo is the map of tile numbers
17     % (nargin >3) loc_tile incl. XC,YC, tileNo, XC11, YC11, XCNINJ, YCNINJ
18 gforget 1.1 %
19     %notes : - if XC, YC are provided as input, then loc_tile.XC, YC is nearest neighbor
20 gforget 1.2 % - by assumption tile numbers increase from w to e (2nd dim),
21     % then from s to n (1st dim), then with face number
22 gforget 1.1
23     gcmfaces_global;
24     global mytiles;
25     loc_arrays={'XC','YC','XC11','YC11','XCNINJ','YCNINJ','iTile','jTile','tileNo'};
26    
27     %1) check that tile arrays are up to date
28     if isempty(mytiles);
29     mytiles.dirGrid=mygrid.dirGrid; mytiles.nFaces=mygrid.nFaces;
30     mytiles.fileFormat=mygrid.fileFormat; mytiles.ioSize=mygrid.ioSize;
31 gforget 1.2 mytiles.ni=-1; mytiles.nj=-1;
32 gforget 1.1 end;
33    
34     test1=strcmp(mytiles.dirGrid,mygrid.dirGrid)&(mytiles.nFaces==mygrid.nFaces)&...
35     strcmp(mytiles.fileFormat,mygrid.fileFormat)&(sum(mytiles.ioSize~=mygrid.ioSize)==0);
36 gforget 1.2 test2=(mytiles.ni==ni)&(mytiles.nj==nj);
37 gforget 1.1
38     %2) update tile arrays if not up to date
39     if ~test1|~test2;
40     %
41     mytiles.dirGrid=mygrid.dirGrid; mytiles.nFaces=mygrid.nFaces;
42     mytiles.fileFormat=mygrid.fileFormat; mytiles.ioSize=mygrid.ioSize;
43     %
44     XC=mygrid.XC; YC=mygrid.YC;
45     XC11=XC; YC11=XC; XCNINJ=XC; YCNINJ=XC; iTile=XC; jTile=XC; tileNo=XC;
46     tileCount=0;
47     for iF=1:XC11.nFaces;
48     face_XC=XC{iF}; face_YC=YC{iF};
49     for ii=1:size(face_XC,1)/ni;
50     for jj=1:size(face_XC,2)/nj;
51 gforget 1.6 %the MITgcm exch2 package proceeds this way instead:
52     % for jj=1:size(face_XC,2)/nj;
53     % for ii=1:size(face_XC,1)/ni;
54 gforget 1.1 tileCount=tileCount+1;
55     tmp_i=[1:ni]+ni*(ii-1);
56     tmp_j=[1:nj]+nj*(jj-1);
57     tmp_XC=face_XC(tmp_i,tmp_j);
58     tmp_YC=face_YC(tmp_i,tmp_j);
59     XC11{iF}(tmp_i,tmp_j)=tmp_XC(1,1);
60     YC11{iF}(tmp_i,tmp_j)=tmp_YC(1,1);
61     XCNINJ{iF}(tmp_i,tmp_j)=tmp_XC(end,end);
62     YCNINJ{iF}(tmp_i,tmp_j)=tmp_YC(end,end);
63     iTile{iF}(tmp_i,tmp_j)=[1:ni]'*ones(1,nj);
64     jTile{iF}(tmp_i,tmp_j)=ones(ni,1)*[1:nj];
65     tileNo{iF}(tmp_i,tmp_j)=tileCount*ones(ni,nj);
66     end;
67     end;
68     end;
69    
70     for iF=1:length(loc_arrays);
71     eval(['mytiles.' loc_arrays{iF} '=convert2array(' loc_arrays{iF} ');']);
72     eval(['clear ' loc_arrays{iF} ';']);
73     end;
74     end;
75    
76     %3) decide what is needed based on the number or arguments
77     % (this needs to happen after mytiles is computed, since
78     % I use the same variable names in that bloc and below)
79 gforget 1.2 if nargin==2;
80     %simply return mytiles as loc_tile
81     tileNo=convert2array(mytiles.tileNo);
82     varargout={tileNo};
83     return;
84     elseif nargin==4;
85 gforget 1.1 XC=varargin{1}; YC=varargin{2};
86     tmp1=find(XC>180); XC(tmp1)=XC(tmp1)-360;
87     iTile=[]; jTile=[]; tileNo=[];
88     XC11=[]; YC11=[]; XCNINJ=[]; YCNINJ=[];
89     elseif nargin==5;
90     XC=[]; YC=[];
91     iTile=varargin{1}; jTile=varargin{2}; tileNo=varargin{3};
92     XC11=[]; YC11=[]; XCNINJ=[]; YCNINJ=[];
93     elseif nargin==8;
94     XC=[]; YC=[];
95     iTile=varargin{1}; jTile=varargin{2}; tileNo=[];
96     XC11=varargin{3}; YC11=varargin{4}; XCNINJ=varargin{5}; YCNINJ=varargin{6};
97     else;
98     error('wrong argument list');
99     end;
100    
101     %3) find the grid points indices in array format
102     if ~isempty(XC);
103 gforget 1.3 %identify nearest neighbor on the sphere
104     XCgrid=convert2array(mygrid.XC);
105     YCgrid=convert2array(mygrid.YC);
106     x=sin(pi/2-YCgrid*pi/180).*cos(XCgrid*pi/180);
107     y=sin(pi/2-YCgrid*pi/180).*sin(XCgrid*pi/180);
108     z=cos(pi/2-YCgrid*pi/180);
109     xx=sin(pi/2-YC*pi/180).*cos(XC*pi/180);
110     yy=sin(pi/2-YC*pi/180).*sin(XC*pi/180);
111     zz=cos(pi/2-YC*pi/180);
112     kk=find(~isnan(x));
113 gforget 1.5 if size(xx,1)==1; xx=xx'; yy=yy'; zz=zz'; end;
114 gforget 1.3 ik = knnsearch([x(kk) y(kk) z(kk)],[xx yy zz]);
115     ik=kk(ik);
116     %
117     %(old method that uses longitude, latitude directly)
118     %tmp1=find(XC>180); XC(tmp1)=XC(tmp1)-360;
119     %ik=gcmfaces_bindata(XC,YC);
120 gforget 1.1 else;
121     %use mytiles as a look up table
122     ik=zeros(size(iTile));
123     for ikk=1:length(iTile);
124     if ~isempty(tileNo);
125     tmp1=find(mytiles.iTile==iTile(ikk)&mytiles.jTile==jTile(ikk)&mytiles.tileNo==tileNo(ikk));
126     else;
127     tmp1=find(mytiles.iTile==iTile(ikk)&mytiles.jTile==jTile(ikk)&...
128     abs(mytiles.XC-XC(ikk))<1e-4&...
129     abs(mytiles.YC-YC(ikk))<1e-4&...
130     abs(mytiles.XC11-XC11(ikk))<1e-4&...
131     abs(mytiles.YC11-YC11(ikk))<1e-4&...
132     abs(mytiles.XCNINJ-XCNINJ(ikk))<1e-4&...
133     abs(mytiles.YCNINJ-YCNINJ(ikk))<1e-4);
134     end;
135     if isempty(tmp1); error('grid point could not be identified from inputs'); end;
136     ik(ikk)=tmp1(1);
137     end;
138     end;
139    
140 gforget 1.4 loc_tile.point=ik;
141    
142 gforget 1.1 %4) complement location arrays and prepare output
143     for iF=1:length(loc_arrays);
144     eval(['loc_tile.' loc_arrays{iF} '=mytiles.' loc_arrays{iF} '(ik);']);
145     end;
146    
147 gforget 1.2 %5) output result
148     varargout={loc_tile};
149    
150    
151    

  ViewVC Help
Powered by ViewVC 1.1.22