/[MITgcm]/MITgcm_contrib/gael/matlab_class/gcmfaces_IO/grid_load.m
ViewVC logotype

Annotation of /MITgcm_contrib/gael/matlab_class/gcmfaces_IO/grid_load.m

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


Revision 1.16 - (hide annotations) (download)
Mon Jan 11 17:28:25 2016 UTC (9 years, 6 months ago) by gforget
Branch: MAIN
Changes since 1.15: +6 -2 lines
- use full path, point to nctiles_grid if no grid was found

1 gforget 1.13 function []=grid_load(dirGrid,nFaces,fileFormat,memoryLimit,omitNativeGrid);
2 gforget 1.5 %object: load grid information, convert it to gcmfaces format
3     % and encapsulate it in the global mygrid structure.
4     %inputs: dirGrid is the directory where the grid files (gcm output) can be found.
5     % nFaces is the number of faces in this gcm set-up of current interest.
6     % fileFormat is the file format ('straight','cube','compact')
7 gforget 1.9 %optional: memoryLimit is a flag that allows the user to omit secondary
8     % grid fields in case memory/storage become an issue. It
9     % takes 3 values : (0; the default) includes everything
10     % (1) omits all 3D fields but hFacC (2) only loads XC & YC.
11 gforget 1.13 % omitNativeGrid is a flag (0 by default) to bypass (when flag 1)
12     % grid_load_native and grid_load_native_RAZ calls (that can
13     % complement mygrid based upon e.g. tile*.mitgrid files)
14 gforget 1.1
15 gforget 1.9 if isempty(whos('memoryLimit')); memoryLimit=0; end;
16 gforget 1.13 if isempty(whos('omitNativeGrid')); omitNativeGrid=0; end;
17 gforget 1.9
18 gforget 1.7 gcmfaces_global; mygrid=[];
19    
20 gforget 1.15 if nargin==0;%assume that LLC90 grid is used
21     if ~isempty(dir('nctiles_grid'));
22 gforget 1.16 mygrid.dirGrid=[pwd filesep 'nctiles_grid' filesep];
23 gforget 1.15 mygrid.fileFormat='nctiles';
24     elseif ~isempty(dir('GRID'));
25 gforget 1.16 mygrid.dirGrid=[pwd filesep 'GRID' filesep];
26 gforget 1.15 mygrid.fileFormat='compact';
27     else;
28 gforget 1.16 fprintf('\n The ECCO v4 grid can be obtained as follows: \n');
29     fprintf([' wget --recursive ftp://mit.ecco-group.org/ecco_for_las/' ...
30     'version_4/release1/nctiles_grid \n']);
31     fprintf(' mv mit.ecco-group.org/ecco_for_las/version_4/release1/nctiles_grid . \n\n');
32 gforget 1.15 error('could not find either ''nctiles_grid/'' or ''GRID/''');
33     end;
34     mygrid.nFaces=5;
35     mygrid.gcm2facesFast=false;
36     mygrid.memoryLimit=0;
37     omitNativeGrid=isempty(dir([mygrid.dirGrid 'tile001.mitgrid']));
38     %place holders:
39     tmp1=NaN*zeros(90,270);
40     tmp2=NaN*zeros(90,90);
41     tmp3=NaN*zeros(270,90);
42     mygrid.XC=gcmfaces({tmp1,tmp1,tmp2,tmp3,tmp3});
43     mygrid.YC=gcmfaces({tmp1,tmp1,tmp2,tmp3,tmp3});
44     mygrid.RC=NaN*zeros(50,1);
45     clear tmp?;
46     else;%user specified settings
47     mygrid.dirGrid=dirGrid;
48     mygrid.nFaces=nFaces;
49     mygrid.fileFormat=fileFormat;
50     mygrid.gcm2facesFast=false;
51     mygrid.memoryLimit=memoryLimit;
52     end;
53 gforget 1.9
54     if mygrid.memoryLimit>0;
55     gcmfaces_msg(['* Warning from grid_load : memoryLimit>0 ' ...
56     'may precludes advanced gmcfaces functions.'],'');
57     end;
58     if mygrid.memoryLimit>1;
59     gcmfaces_msg(['* Warning from grid_load : memoryLimit>1 ' ...
60     'may only allow for basic fields displays.'],'');
61     end;
62    
63 gforget 1.15 if strcmp(mygrid.fileFormat,'nctiles');
64     mygrid.ioSize=[90 1170];
65     mygrid.facesSize=[[90 270];[90 270];[90 90];[270 90];[270 90];[90 90]];
66     mygrid.facesExpand=[];
67     elseif ~isempty(dir([mygrid.dirGrid 'grid.specs.mat']));
68     specs=open([mygrid.dirGrid 'grid.specs.mat']);
69 gforget 1.9 mygrid.ioSize=specs.ioSize;
70     mygrid.facesSize=specs.facesSize;
71     mygrid.facesExpand=specs.facesExpand;
72     %example for creating grid.specs.mat, to put in dirGrid :
73     %ioSize=[364500 1];
74     %facesSize=[[270 450];[0 0];[270 270];[180 270];[450 270]];
75     %facesExpand=[270 450];
76     %save grid.specs.mat ioSize facesSize facesExpand;
77 gforget 1.15 elseif strcmp(mygrid.fileFormat,'compact');
78     v0=rdmds([mygrid.dirGrid 'XC']);
79 gforget 1.9 mygrid.ioSize=size(v0);
80     nn=size(v0,1); pp=size(v0,2)/nn;
81     mm=(pp+4-mygrid.nFaces)/4*nn;
82 gforget 1.10 mygrid.facesSize=[[nn mm];[nn mm];[nn nn];[mm nn];[mm nn];[nn nn]];
83     mygrid.facesExpand=[];
84 gforget 1.15 elseif strcmp(mygrid.fileFormat,'cube');
85     v0=rdmds([mygrid.dirGrid 'XC']);
86 gforget 1.10 mygrid.ioSize=size(v0);
87     nn=size(v0,2);
88     mygrid.facesSize=[[nn nn];[nn nn];[nn nn];[nn nn];[nn nn];[nn nn]];
89     mygrid.facesExpand=[];
90 gforget 1.15 elseif strcmp(mygrid.fileFormat,'straight');
91     v0=rdmds([mygrid.dirGrid 'XC']);
92 gforget 1.10 mygrid.ioSize=size(v0);
93     mygrid.facesSize=mygrid.ioSize;
94 gforget 1.9 mygrid.facesExpand=[];
95     end;
96 gforget 1.15
97 gforget 1.12 mygrid.missVal=NaN;%will be set to 0 once the grid has been loaded.
98 gforget 1.1
99 gforget 1.15 if ~(mygrid.nFaces==1&strcmp(mygrid.fileFormat,'straight'))&...
100     ~(mygrid.nFaces==6&strcmp(mygrid.fileFormat,'cube'))&...
101     ~(mygrid.nFaces==6&strcmp(mygrid.fileFormat,'compact'))&...
102     ~(mygrid.nFaces==5&strcmp(mygrid.fileFormat,'compact'))&...
103     ~(mygrid.nFaces==5&strcmp(mygrid.fileFormat,'nctiles'));
104     error('non-supported grid topology');
105 gforget 1.1 end;
106    
107 gforget 1.6 %the various grid fields:
108 gforget 1.9 if mygrid.memoryLimit==0;
109     list0={'XC','XG','YC','YG','RAC','RAZ','DXC','DXG','DYC','DYG','hFacC','hFacS','hFacW','Depth'};
110     elseif mygrid.memoryLimit==1;
111     list0={'XC','XG','YC','YG','RAC','RAZ','DXC','DXG','DYC','DYG','hFacC','Depth'};
112     elseif mygrid.memoryLimit==2;
113     list0={'XC','YC'};
114     end;
115    
116 gforget 1.1 for iFld=1:length(list0);
117 gforget 1.15 if ~strcmp(mygrid.fileFormat,'nctiles');
118     eval(['mygrid.' list0{iFld} '=rdmds2gcmfaces([mygrid.dirGrid ''' list0{iFld} '*'']);']);
119     else;
120     eval(['mygrid.' list0{iFld} '=read_nctiles([mygrid.dirGrid ''GRID''],''' list0{iFld} ''');']);
121     end;
122 gforget 1.1 end;
123    
124 gforget 1.9 %the vertical grid
125     list0={'RC','RF','DRC','DRF'};
126     for iFld=1:length(list0);
127 gforget 1.15 if ~strcmp(mygrid.fileFormat,'nctiles');
128     eval(['mygrid.' list0{iFld} '=squeeze(rdmds([mygrid.dirGrid ''' list0{iFld} '*'']));']);
129     else;
130     eval(['ncload ' mygrid.dirGrid 'GRID.0001.nc ' list0{iFld} ';']);
131     eval(['mygrid.' list0{iFld} '=' list0{iFld} ''';']);
132     if strcmp(list0{iFld},'RF'); mygrid.RF=[mygrid.RF;NaN]; end;
133     end;
134 gforget 1.9 end;
135    
136     %grid orientation
137     if mygrid.memoryLimit<2;
138     list0={'AngleCS','AngleSN'};
139 gforget 1.15 test0=~isempty(dir([mygrid.dirGrid 'AngleCS*']));
140     if strcmp(mygrid.fileFormat,'nctiles');
141     for iFld=1:length(list0);
142     eval(['mygrid.' list0{iFld} '=read_nctiles([mygrid.dirGrid ''GRID''],''' list0{iFld} ''');']);
143     end;
144     elseif test0;
145 gforget 1.9 for iFld=1:length(list0);
146 gforget 1.15 eval(['mygrid.' list0{iFld} '=rdmds2gcmfaces([mygrid.dirGrid ''' list0{iFld} '*'']);']);
147 gforget 1.9 end;
148     else;
149     warning('\n AngleCS/AngleSN not found; set to 1/0 assuming lat/lon grid.\n');
150     mygrid.AngleCS=mygrid.XC; mygrid.AngleCS(:)=1;
151     mygrid.AngleSN=mygrid.XC; mygrid.AngleSN(:)=0;
152 gforget 1.8 end;
153 gforget 1.4 end;
154    
155 gforget 1.12 %if grid is incomplete (blank tiles) then try to get
156     %additional info from native grid, or apply missing value.
157     test0=sum(isnan(mygrid.XC))>0;
158     test1=prod(mygrid.ioSize)~=sum(isnan(NaN*mygrid.XC(:)));
159 gforget 1.13 if (test0|test1)&~omitNativeGrid;
160 gforget 1.12 %treat fields that are part of the native grid
161     mygrid1=mygrid; mygrid=[];
162 gforget 1.15 grid_load_native(mygrid.dirGrid,nFaces,0);
163 gforget 1.12 mygrid1.XC=mygrid.XC; mygrid1.YC=mygrid.YC;
164 gforget 1.14 mygrid1.XG=mygrid.XG; mygrid1.YG=mygrid.YG;
165 gforget 1.12 mygrid1.RAC=mygrid.RAC;
166     mygrid=mygrid1;
167     %apply missing value for fields that aren't
168     list0={'hFacC','hFacS','hFacW','Depth','AngleCS','AngleSN'};
169     for ii=1:length(list0);
170     eval(['tmp1=mygrid.' list0{ii} ';']);
171     tmp1(isnan(tmp1))=0;
172     eval(['mygrid.' list0{ii} '=tmp1;']);
173     end;
174     %and fix angles if needed
175     tmp1=mygrid.AngleCS.^2+mygrid.AngleSN.^2;
176     tmp1=1*(tmp1>0.999&tmp1<1.001);
177     mygrid.AngleCS(tmp1==0)=1;
178     mygrid.AngleSN(tmp1==0)=0;
179     end;
180    
181 gforget 1.11 %get full RAZ (incl. 'extra line and column') needed for e.g. rotational computations
182 gforget 1.13 if mygrid.memoryLimit<2&~omitNativeGrid;
183 gforget 1.11 grid_load_native_RAZ;
184     end;
185    
186 gforget 1.9 %grid masks
187     if mygrid.memoryLimit<1;
188     mygrid.hFacCsurf=mygrid.hFacC;
189     for ff=1:mygrid.hFacC.nFaces; mygrid.hFacCsurf{ff}=mygrid.hFacC{ff}(:,:,1); end;
190    
191     mskC=mygrid.hFacC; mskC(mskC==0)=NaN; mskC(mskC>0)=1; mygrid.mskC=mskC;
192     mskW=mygrid.hFacW; mskW(mskW==0)=NaN; mskW(mskW>0)=1; mygrid.mskW=mskW;
193     mskS=mygrid.hFacS; mskS(mskS==0)=NaN; mskS(mskS>0)=1; mygrid.mskS=mskS;
194 gforget 1.1 end;
195    
196 gforget 1.9 %zonal mean and sections needed for transport computations
197     if mygrid.memoryLimit<1;
198     if ~isfield(mygrid,'mygrid.LATS_MASKS');
199     gcmfaces_lines_zonal;
200     mygrid.LATS=[mygrid.LATS_MASKS.lat]';
201     end;
202     if ~isfield(mygrid,'LINES_MASKS');
203     [lonPairs,latPairs,names]=line_greatC_TUV_MASKS_v4;
204     gcmfaces_lines_transp(lonPairs,latPairs,names);
205     end;
206     end;
207 gforget 1.2
208 gforget 1.8 %to allow convert2gcmfaces/doFast:
209 gforget 1.9 if isempty(mygrid.facesExpand)&mygrid.memoryLimit<2;
210     tmp1=convert2gcmfaces(mygrid.XC);
211     tmp1(:)=[1:length(tmp1(:))];
212     nn=length(tmp1(:));
213     mygrid.gcm2faces=convert2gcmfaces(tmp1);
214     mygrid.faces2gcmSize=size(tmp1);
215     mygrid.faces2gcm=convert2gcmfaces(tmp1);
216     for iFace=1:mygrid.nFaces;
217     n=length(mygrid.gcm2faces{iFace}(:));
218     mygrid.faces2gcm{iFace}=mygrid.gcm2faces{iFace}(:);
219     mygrid.gcm2faces{iFace}=sparse([1:n],mygrid.gcm2faces{iFace}(:),ones(1,n),n,nn);
220     end;
221     mygrid.gcm2facesFast=true;
222 gforget 1.6 end;
223    
224 gforget 1.12 %reset missVal parameter to 0.
225     %Note : this is only used by convert2widefaces, for runs with cropped grids.
226     %Note : 0 should not be used as a fill for the grid itself (NaN was used).
227     mygrid.missVal=0;
228 gforget 1.1

  ViewVC Help
Powered by ViewVC 1.1.22