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

Contents 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.4 - (show annotations) (download)
Mon Feb 3 14:28:52 2014 UTC (11 years, 5 months ago) by gforget
Branch: MAIN
Changes since 1.3: +32 -8 lines
- process2nctiles.m :
   allow for tileSize specification, using
     gcmfaces_loc_tile.m to map of tile indices
   create on subdirectory per field
   revise handling of dimensions
- write2nctiles.m :
   allow for tileNo (map of tile indices) specification
   revise loops accordingly
   fix readme treatment
   switch from NETCDF4 to classic nectdf
   add one digit in file names

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

  ViewVC Help
Powered by ViewVC 1.1.22