/[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.4 - (hide annotations) (download)
Mon Feb 1 14:32:05 2016 UTC (9 years, 5 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65t
Changes since 1.3: +2 -1 lines
- add loc_tile.point output

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     tileCount=tileCount+1;
52     tmp_i=[1:ni]+ni*(ii-1);
53     tmp_j=[1:nj]+nj*(jj-1);
54     tmp_XC=face_XC(tmp_i,tmp_j);
55     tmp_YC=face_YC(tmp_i,tmp_j);
56     XC11{iF}(tmp_i,tmp_j)=tmp_XC(1,1);
57     YC11{iF}(tmp_i,tmp_j)=tmp_YC(1,1);
58     XCNINJ{iF}(tmp_i,tmp_j)=tmp_XC(end,end);
59     YCNINJ{iF}(tmp_i,tmp_j)=tmp_YC(end,end);
60     iTile{iF}(tmp_i,tmp_j)=[1:ni]'*ones(1,nj);
61     jTile{iF}(tmp_i,tmp_j)=ones(ni,1)*[1:nj];
62     tileNo{iF}(tmp_i,tmp_j)=tileCount*ones(ni,nj);
63     end;
64     end;
65     end;
66    
67     for iF=1:length(loc_arrays);
68     eval(['mytiles.' loc_arrays{iF} '=convert2array(' loc_arrays{iF} ');']);
69     eval(['clear ' loc_arrays{iF} ';']);
70     end;
71     end;
72    
73     %3) decide what is needed based on the number or arguments
74     % (this needs to happen after mytiles is computed, since
75     % I use the same variable names in that bloc and below)
76 gforget 1.2 if nargin==2;
77     %simply return mytiles as loc_tile
78     tileNo=convert2array(mytiles.tileNo);
79     varargout={tileNo};
80     return;
81     elseif nargin==4;
82 gforget 1.1 XC=varargin{1}; YC=varargin{2};
83     tmp1=find(XC>180); XC(tmp1)=XC(tmp1)-360;
84     iTile=[]; jTile=[]; tileNo=[];
85     XC11=[]; YC11=[]; XCNINJ=[]; YCNINJ=[];
86     elseif nargin==5;
87     XC=[]; YC=[];
88     iTile=varargin{1}; jTile=varargin{2}; tileNo=varargin{3};
89     XC11=[]; YC11=[]; XCNINJ=[]; YCNINJ=[];
90     elseif nargin==8;
91     XC=[]; YC=[];
92     iTile=varargin{1}; jTile=varargin{2}; tileNo=[];
93     XC11=varargin{3}; YC11=varargin{4}; XCNINJ=varargin{5}; YCNINJ=varargin{6};
94     else;
95     error('wrong argument list');
96     end;
97    
98     %3) find the grid points indices in array format
99     if ~isempty(XC);
100 gforget 1.3 %identify nearest neighbor on the sphere
101     XCgrid=convert2array(mygrid.XC);
102     YCgrid=convert2array(mygrid.YC);
103     x=sin(pi/2-YCgrid*pi/180).*cos(XCgrid*pi/180);
104     y=sin(pi/2-YCgrid*pi/180).*sin(XCgrid*pi/180);
105     z=cos(pi/2-YCgrid*pi/180);
106     xx=sin(pi/2-YC*pi/180).*cos(XC*pi/180);
107     yy=sin(pi/2-YC*pi/180).*sin(XC*pi/180);
108     zz=cos(pi/2-YC*pi/180);
109     kk=find(~isnan(x));
110     ik = knnsearch([x(kk) y(kk) z(kk)],[xx yy zz]);
111     ik=kk(ik);
112     %
113     %(old method that uses longitude, latitude directly)
114     %tmp1=find(XC>180); XC(tmp1)=XC(tmp1)-360;
115     %ik=gcmfaces_bindata(XC,YC);
116 gforget 1.1 else;
117     %use mytiles as a look up table
118     ik=zeros(size(iTile));
119     for ikk=1:length(iTile);
120     if ~isempty(tileNo);
121     tmp1=find(mytiles.iTile==iTile(ikk)&mytiles.jTile==jTile(ikk)&mytiles.tileNo==tileNo(ikk));
122     else;
123     tmp1=find(mytiles.iTile==iTile(ikk)&mytiles.jTile==jTile(ikk)&...
124     abs(mytiles.XC-XC(ikk))<1e-4&...
125     abs(mytiles.YC-YC(ikk))<1e-4&...
126     abs(mytiles.XC11-XC11(ikk))<1e-4&...
127     abs(mytiles.YC11-YC11(ikk))<1e-4&...
128     abs(mytiles.XCNINJ-XCNINJ(ikk))<1e-4&...
129     abs(mytiles.YCNINJ-YCNINJ(ikk))<1e-4);
130     end;
131     if isempty(tmp1); error('grid point could not be identified from inputs'); end;
132     ik(ikk)=tmp1(1);
133     end;
134     end;
135    
136 gforget 1.4 loc_tile.point=ik;
137    
138 gforget 1.1 %4) complement location arrays and prepare output
139     for iF=1:length(loc_arrays);
140     eval(['loc_tile.' loc_arrays{iF} '=mytiles.' loc_arrays{iF} '(ik);']);
141     end;
142    
143 gforget 1.2 %5) output result
144     varargout={loc_tile};
145    
146    
147    

  ViewVC Help
Powered by ViewVC 1.1.22