/[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.15 - (hide annotations) (download)
Sun Jan 10 17:05:58 2016 UTC (9 years, 6 months ago) by gforget
Branch: MAIN
Changes since 1.14: +68 -31 lines
- convert2gcmfaces.m: treat case when mygrid.fileFormat is 'nctiles'
- grid_load.m: assume llc90 is used if no input parameters; treat case
  when mygrid.fileFormat is 'nctiles' (when nctiles_grid is found).
- check_mygrid.m: compare two versions of mygrid.

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

  ViewVC Help
Powered by ViewVC 1.1.22