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

Contents 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 - (show 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 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 %input : ni,nj is the MITgcm tile size (2 numbers total)
5 % (optional)
6 % 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 %output : (nargin==2) tileNo is the map of tile numbers
17 % (nargin >3) loc_tile incl. XC,YC, tileNo, XC11, YC11, XCNINJ, YCNINJ
18 %
19 %notes : - if XC, YC are provided as input, then loc_tile.XC, YC is nearest neighbor
20 % - by assumption tile numbers increase from w to e (2nd dim),
21 % then from s to n (1st dim), then with face number
22
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 mytiles.ni=-1; mytiles.nj=-1;
32 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 test2=(mytiles.ni==ni)&(mytiles.nj==nj);
37
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 %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 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 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 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 %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 if size(xx,1)==1; xx=xx'; yy=yy'; zz=zz'; end;
114 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 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 loc_tile.point=ik;
141
142 %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 %5) output result
148 varargout={loc_tile};
149
150
151

  ViewVC Help
Powered by ViewVC 1.1.22