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

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

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


Revision 1.5 - (hide annotations) (download)
Mon Feb 3 19:47:50 2014 UTC (11 years, 5 months ago) by gforget
Branch: MAIN
Changes since 1.4: +23 -3 lines
- process2nctiles.m : fix CF-1.6 compliance
- write2nctiles.m : fix CF-1.6 compliance
- write2nc.m : retired

1 gforget 1.1 function [dimOut]=write2nctiles(fileOut,fldIn,doCreate,varargin);
2     %object : write gcmfaces object to netcdf files (tiled)
3     %inputs : fileOut is the name of the file to be created
4     % fldIn is the array to write to disk
5     % doCreate is a 0/1 switch; 1 => create file ; 0 => append to file.
6     %optional paramaters :
7     % can be provided in the form {'name',value}
8     % those that are currently active are
9     % 'descr' is the file description (default '').
10 gforget 1.2 % 'rdm' is the extended estimate description (default '').
11 gforget 1.1 % 'fldName' is the nc variable name for fld (default : the outside name of fldIn).
12     % 'longName' is the corresponding long name (default : '').
13     % 'units' is the unit of fld (default : '(unknown)').
14     % 'missval' is the missing value (default : NaN).
15     % 'fillval' is the fill value (default : NaN).
16 gforget 1.4 % 'tileNo' is a map of tile indices (default is face number)
17 gforget 1.5 % 'coord' is auxilliary coordinates attribute (e.g. 'lon lat dep')
18 gforget 1.1 %netcdf dimensions : array dimensions are simply set to 'i1,i2,...'
19    
20     gcmfaces_global;
21 gforget 1.5 if ~(myenv.useNativeMatlabNetcdf);
22     error('only native matlab nectdf is supported in write2nctiles');
23     end;
24 gforget 1.1
25     doCheck=0;%set to one to print stuff to screen
26    
27     %set more optional paramaters to default values
28     descr='';
29 gforget 1.2 rdm='';
30 gforget 1.1 fldName=inputname(2); longName='';
31 gforget 1.4 units='(unknown)'; missval=NaN; fillval=NaN; dimIn=[];
32     tileNo=mygrid.XC; for ff=1:mygrid.nFaces; tileNo{ff}(:)=ff; end;
33 gforget 1.5 coord='';
34 gforget 1.1
35     %set more optional paramaters to user defined values
36     for ii=1:nargin-3;
37     if ~iscell(varargin{ii});
38     warning('inputCheck:write2nctiles_1',...
39     ['write2nctiles expects \n'...
40     ' its optional parameters as cell arrays. \n'...
41     ' Argument no. ' num2str(ii+1) ' was ignored \n'...
42     ' Type ''help write2nctiles'' for details.']);
43     elseif ~ischar(varargin{ii}{1});
44     warning('inputCheck:write2nctiles_2',...
45     ['write2nctiles expects \n'...
46     ' its optional parameters cell arrays \n'...
47     ' to start with character string. \n'...
48     ' Argument no. ' num2str(ii+1) ' was ignored \n'...
49     ' Type ''help write2nctiles'' for details.']);
50     else;
51     if strcmp(varargin{ii}{1},'descr')|...
52 gforget 1.2 strcmp(varargin{ii}{1},'rdm')|...
53 gforget 1.1 strcmp(varargin{ii}{1},'fldName')|...
54     strcmp(varargin{ii}{1},'longName')|...
55     strcmp(varargin{ii}{1},'units')|...
56     strcmp(varargin{ii}{1},'missval')|...
57     strcmp(varargin{ii}{1},'fillval')|...
58 gforget 1.4 strcmp(varargin{ii}{1},'tileNo')|...
59 gforget 1.5 strcmp(varargin{ii}{1},'coord')|...
60 gforget 1.1 strcmp(varargin{ii}{1},'dimIn');
61     eval([varargin{ii}{1} '=varargin{ii}{2};']);
62     else;
63     warning('inputCheck:write2nctiles_3',...
64     ['unknown option ''' varargin{ii}{1} ''' was ignored']);
65     end;
66     end;
67     end;
68    
69 gforget 1.4 %split fldIn (if isa gcmfaces) into tiles
70     tileList=unique(convert2vector(tileNo));
71     tileList=tileList(~isnan(tileList));
72     ntile=length(tileList);
73     %
74     if isa(fldIn,'gcmfaces');
75     for ff=1:ntile;
76     tmp1=[];
77     for gg=1:mygrid.nFaces;
78     [tmpi,tmpj]=find(tileNo{gg}==ff);
79     if ~isempty(tmpi);
80     tmpi=[min(tmpi(:)):max(tmpi(:))];
81     tmpj=[min(tmpj(:)):max(tmpj(:))];
82     tmp1=fldIn{gg}(tmpi,tmpj,:,:);
83     end;
84     end;
85     fldTiles{ff}=tmp1;
86     end;
87     end;
88    
89     %start processing loop
90     for ff=1:ntile;
91 gforget 1.1
92     if isa(fldIn,'gcmfaces');
93 gforget 1.4 fldTile=fldTiles{ff};
94 gforget 1.1 %reverse order of dimensions
95     nn=length(size(fldTile));
96     fldTile=permute(fldTile,[nn:-1:1]);
97     else;
98     fldTile=fldIn;
99     end;
100 gforget 1.4 fileTile=[fileOut sprintf('.%04d.nc',ff)];
101 gforget 1.1
102     %select dimensions of relevance:
103     nDim=length(size(fldTile));
104     dimsize=size(fldTile);
105     for iDim=1:nDim;
106     if size(fldTile,iDim)~=1;
107     dimlist{iDim}=['i' num2str(iDim)];
108     dimName{iDim}=['array index ' num2str(iDim)];
109     eval(['dimvec.i' num2str(iDim) '=[1:size(fldTile,iDim)];']);
110     end;
111     end;
112    
113     %omit singleton dimensions:
114     ii=find(dimsize~=1);
115     dimsize=dimsize(ii);
116     dimlist={dimlist{ii}};
117     dimName={dimName{ii}};
118    
119     %check :
120     if doCheck;
121     whos fldTile
122     descr
123     fldName
124     longName
125     units
126     missval
127     fillval
128     dimlist
129     dimName
130     dimsize
131     dimvec
132     keyboard;
133     end;
134    
135     %output dimension information
136     dimOut{ff}=dimlist;
137    
138     if doCreate;
139     %create netcdf file:
140     %-------------------
141 gforget 1.4 % ncid=nccreate(fileTile,'NETCDF4');%to allow for big files
142     ncid=nccreate(fileTile,'clobber');
143 gforget 1.1
144 gforget 1.3 if ~isempty(rdm);
145     descr2=[descr ' -- ' rdm{1}];
146     else;
147     descr2=descr;
148     end;
149 gforget 1.4 ncputAtt(ncid,'','description',descr2);
150 gforget 1.2 for pp=2:length(rdm);
151     tmp1=char(pp+63);
152     netcdf.putAtt(ncid,nc_global,tmp1,rdm{pp});
153     end;
154     %append readme
155     pp=length(rdm)+1;
156     netcdf.putAtt(ncid,nc_global,tmp1,'file created using gcmfaces_IO/write2nctiles.m');
157 gforget 1.1 ncputAtt(ncid,'','date',date);
158 gforget 1.5 netcdf.putAtt(ncid,nc_global,'Conventions','CF-1.6')
159    
160     ncputAtt(ncid,'','_FillValue',fillval);
161     ncputAtt(ncid,'','missing_value',missval);
162 gforget 1.1
163     ncdefDim(ncid,'itxt',30);
164     for dd=1:length(dimlist); ncdefDim(ncid,dimlist{dd},dimsize(dd)); end;
165    
166     for dd=1:length(dimlist);
167     ncdefVar(ncid,dimlist{dd},'double',{dimlist{dd}});
168     ncputAtt(ncid,dimlist{dd},'long_name',dimName{dd});
169 gforget 1.5 ncputAtt(ncid,dimlist{dd},'units','1');
170 gforget 1.1 end;
171     ncclose(ncid);
172    
173     %fill in the dimensions dimensions values vectors:
174     %-------------------------------------------------
175     ncid=ncopen(fileTile,'write');
176     for dd=1:length(dimlist);
177     ncputvar(ncid,dimlist{dd},getfield(dimvec,dimlist{dd}));
178     end;
179     ncclose(ncid);
180     end;
181    
182     %use dimentsion specified by user
183     if ~isempty(dimIn); dimlist=dimIn{ff}; end;
184    
185     %define and fill field:
186     %----------------------
187     ncid=ncopen(fileTile,'write');
188 gforget 1.5 %
189     netcdf.reDef(ncid);
190 gforget 1.1 ncdefVar(ncid,fldName,'double',flipdim(dimlist,2));%note the direction flip
191     if ~isempty(longName); ncputAtt(ncid,fldName,'long_name',longName); end;
192     if ~isempty(units); ncputAtt(ncid,fldName,'units',units); end;
193 gforget 1.5 if ~isempty(coord); ncputAtt(ncid,fldName,'coordinates',coord); end;
194     if strcmp(fldName,'lon'); ncputAtt(ncid,fldName,'standard_name','longitude'); end;
195     if strcmp(fldName,'lat'); ncputAtt(ncid,fldName,'standard_name','latitude'); end;
196     if strcmp(fldName,'dep'); ncputAtt(ncid,fldName,'standard_name','depth'); end;
197     if strcmp(fldName,'tim'); ncputAtt(ncid,fldName,'standard_name','time'); end;
198     if strcmp(fldName,'land'); ncputAtt(ncid,fldName,'standard_name','land_binary_mask'); end;
199     if strcmp(fldName,'area'); ncputAtt(ncid,fldName,'standard_name','cell_area'); end;
200     if strcmp(fldName,'thic'); ncputAtt(ncid,fldName,'standard_name','cell_thickness'); end;
201     netcdf.endDef(ncid);
202     %
203 gforget 1.1 ncputvar(ncid,fldName,fldTile);
204     ncclose(ncid);
205    
206 gforget 1.4 end;%for ff=1:ntile;
207 gforget 1.1

  ViewVC Help
Powered by ViewVC 1.1.22