0001 function write_FVCOM_tsobcERSEM(tsOBCFile,FileExists,time,nSiglay,Mobj,ERSEMdata,varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 [~, subname] = fileparts(mfilename('fullpath'));
0076 global ftbverbose
0077 if ftbverbose
0078 fprintf('\nbegin : %s\n', subname)
0079 end
0080 NNuts=length(ERSEMdata);
0081
0082 strtime = true;
0083 inttime = false;
0084 floattime = false;
0085 for vv = 1:2:length(varargin)
0086 switch varargin{vv}
0087 case 'strtime'
0088 strtime = true;
0089 case 'inttime'
0090 inttime = true;
0091 case 'floattime'
0092 floattime = true;
0093 end
0094 end
0095
0096 obc_nodes = [Mobj.read_obc_nodes{:}]';
0097 obc_h = Mobj.h(obc_nodes);
0098 siglev = Mobj.siglev(obc_nodes, :);
0099 siglay = Mobj.siglay(obc_nodes, :);
0100
0101 nTimes = length(time);
0102 nObc = length(obc_nodes);
0103 nSiglev = nSiglay + 1;
0104
0105 if ftbverbose; fprintf('obc reading complete\n'); end
0106
0107
0108
0109
0110
0111
0112
0113
0114 if isvector(siglev)
0115 siglev = repmat(siglev, [nObc, 1]);
0116 end
0117 if isvector(siglay)
0118 siglay = repmat(siglay, [nObc, 1]);
0119 end
0120
0121
0122 if nSiglev ~= size(Mobj.(ERSEMdata(1).name), 2) + 1 || size(siglev, 2) ~= size(Mobj.(ERSEMdata(1).name), 2) + 1 || size(siglev, 2) ~= size(Mobj.(ERSEMdata(2).name), 2) + 1
0123 error('Specified number sigma levels does not match supplied data')
0124 end
0125 if nSiglay ~= size(Mobj.(ERSEMdata(1).name), 2) || size(siglay, 2) ~= size(Mobj.(ERSEMdata(1).name), 2) || size(siglay, 2) ~= size(Mobj.(ERSEMdata(2).name), 2)
0126 error('Specified number of sigma layers does not match supplied data')
0127 end
0128
0129
0130
0131
0132
0133 if FileExists
0134
0135 nc = netcdf.open(tsOBCFile, 'WRITE');
0136
0137
0138 dimids = netcdf.inqDimIDs(nc);
0139 for dd =1:length(dimids)
0140 dimidname=netcdf.inqDim(nc,dimids(dd));
0141 switch dimidname
0142 case{'node'}
0143
0144 nobc_dimid=netcdf.inqDimID(nc,dimidname);
0145 case{'DateStrLen'}
0146 datestrlen_dimid=netcdf.inqDimID(nc,dimidname);
0147 case{'time'}
0148
0149 time_dimid=netcdf.inqDimID(nc,dimidname);
0150
0151 file_times = netcdf.getVar(nc,netcdf.inqVarID(nc,'Times'))';
0152 file_timem = datenum(file_times,'yyyy-mm-dd HH:MM:SS.FFF');
0153 case{'siglay'}
0154
0155 siglay_dimid=netcdf.inqDimID(nc,dimidname);
0156 case{'siglev'}
0157 siglev_dimid=netcdf.inqDimID(nc,dimidname);
0158 end
0159 end
0160 netcdf.reDef(nc)
0161 else
0162
0163 nc = netcdf.create(tsOBCFile, 'clobber');
0164
0165
0166 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'title','Open boundary ERSEM nudging')
0167 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'type','FVCOM TIME SERIES OBC FABM FILE')
0168 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'history', sprintf('File created with %s from the MATLAB fvcom-toolbox', subname))
0169
0170
0171
0172 nobc_dimid=netcdf.defDim(nc,'nobc',nObc);
0173 datestrlen_dimid=netcdf.defDim(nc,'DateStrLen',26);
0174 time_dimid=netcdf.defDim(nc,'time',netcdf.getConstant('NC_UNLIMITED'));
0175 siglay_dimid=netcdf.defDim(nc,'siglay',nSiglay);
0176 siglev_dimid=netcdf.defDim(nc,'siglev',nSiglev);
0177
0178
0179 if strtime
0180 Times_varid=netcdf.defVar(nc,'Times','NC_CHAR',[datestrlen_dimid, time_dimid]);
0181 netcdf.putAtt(nc,Times_varid,'time_zone','UTC');
0182 end
0183
0184 if floattime
0185 time_varid=netcdf.defVar(nc,'time','NC_FLOAT',time_dimid);
0186 netcdf.putAtt(nc,time_varid,'long_name','time');
0187 netcdf.putAtt(nc,time_varid,'units','days since 1858-11-17 00:00:00');
0188 netcdf.putAtt(nc,time_varid,'time_zone','UTC');
0189 end
0190
0191 if inttime
0192 itime_varid=netcdf.defVar(nc,'Itime','NC_INT',time_dimid);
0193 netcdf.putAtt(nc,itime_varid,'units','days since 1858-11-17 00:00:00');
0194 netcdf.putAtt(nc,itime_varid,'format','modified julian day (MJD)');
0195 netcdf.putAtt(nc,itime_varid,'time_zone','UTC');
0196
0197 itime2_varid=netcdf.defVar(nc,'Itime2','NC_INT',time_dimid);
0198 netcdf.putAtt(nc,itime2_varid,'units','msec since 00:00:00');
0199 netcdf.putAtt(nc,itime2_varid,'time_zone','UTC');
0200 end
0201
0202 nobc_varid=netcdf.defVar(nc,'obc_nodes','NC_INT',nobc_dimid);
0203 netcdf.putAtt(nc,nobc_varid,'long_name','Open Boundary Node Number');
0204 netcdf.putAtt(nc,nobc_varid,'grid','obc_grid');
0205 netcdf.putAtt(nc,nobc_varid,'type','data');
0206
0207 obc_h_varid=netcdf.defVar(nc,'obc_h','NC_FLOAT',nobc_dimid);
0208 netcdf.putAtt(nc,obc_h_varid,'long_name','Open Boundary Depth');
0209 netcdf.putAtt(nc,obc_h_varid,'units','m');
0210 netcdf.putAtt(nc,obc_h_varid,'grid','obc_grid');
0211 netcdf.putAtt(nc,obc_h_varid,'type','data');
0212
0213 obc_siglev_varid=netcdf.defVar(nc,'siglev','NC_FLOAT',[nobc_dimid,siglev_dimid]);
0214 netcdf.putAtt(nc,obc_siglev_varid,'long_name','ocean_sigma/general_coordinate');
0215 netcdf.putAtt(nc,obc_siglev_varid,'grid','obc_grid');
0216
0217 obc_siglay_varid=netcdf.defVar(nc,'siglay','NC_FLOAT',[nobc_dimid,siglay_dimid]);
0218 netcdf.putAtt(nc,obc_siglay_varid,'long_name','ocean_sigma/general_coordinate');
0219 netcdf.putAtt(nc,obc_siglay_varid,'grid','obc_grid');
0220 end
0221
0222
0223
0224 for nuts=1:NNuts
0225 varidN{nuts}=['obc_',ERSEMdata(nuts).name,'_varid'];
0226 eval([varidN{nuts},'=netcdf.defVar(nc,''',ERSEMdata(nuts).name,''',''NC_FLOAT'',[nobc_dimid,siglay_dimid,time_dimid]);'])
0227 eval(['netcdf.putAtt(nc,',varidN{nuts},',''long_name'',''',ERSEMdata(nuts).long_name,''');'])
0228 eval(['netcdf.putAtt(nc,',varidN{nuts},',''units'',''',ERSEMdata(nuts).units,''');'])
0229 eval(['netcdf.putAtt(nc,',varidN{nuts},',''grid'',''obc_grid'');'])
0230
0231 eval(['netcdf.defVarDeflate(nc, ',varidN{nuts},', true, true, 7);'])
0232
0233
0234
0235
0236
0237 end
0238
0239
0240
0241
0242
0243
0244 netcdf.endDef(nc);
0245
0246 if ~FileExists
0247
0248
0249 netcdf.putVar(nc,nobc_varid,obc_nodes);
0250 netcdf.putVar(nc,obc_h_varid,obc_h);
0251 netcdf.putVar(nc,obc_siglev_varid,siglev);
0252 netcdf.putVar(nc,obc_siglay_varid,siglay);
0253 if strtime
0254 nStringOut = char();
0255 [nYr, nMon, nDay, nHour, nMin, nSec] = mjulian2greg(time);
0256 for i=1:nTimes
0257 nDate = [nYr(i), nMon(i), nDay(i), nHour(i), nMin(i), nSec(i)];
0258 nStringOut = [nStringOut, sprintf('%04i/%02i/%02i %02i:%02i:%09.6f', nDate)];
0259 end
0260 netcdf.putVar(nc,Times_varid,[0, 0],[26, nTimes],nStringOut);
0261 end
0262 if floattime
0263 netcdf.putVar(nc,time_varid,0,numel(time),time);
0264 end
0265 if inttime
0266 netcdf.putVar(nc,itime_varid,floor(time));
0267
0268
0269
0270 netcdf.putVar(nc,itime2_varid,0,numel(time),round((mod(time,1)*24*3600*1000)/(3600*1000))*(3600*1000));
0271 end
0272 for nuts=1:NNuts
0273 eval(['netcdf.putVar(nc,',varidN{nuts},',Mobj.(ERSEMdata(nuts).name));'])
0274 disp(['Finished with variable, ',ERSEMdata(nuts).name])
0275 end
0276
0277 else
0278 if length(time) < length(file_timem)
0279 for nuts=1:NNuts
0280 data= Mobj.(ERSEMdata(nuts).name);
0281 dataint = nan(size(data, 1),size(data, 2),length(file_timem));
0282 for nn=1:size(data, 1)
0283 [X1,Y1]=meshgrid(file_timem- 678942,siglay(nn,:));
0284 [X,Y]=meshgrid(time,siglay(nn,:));
0285
0286 dataint(nn,:,:) = interp2(X,Y,squeeze(data(nn,:,:)),X1,Y1);
0287 end
0288 Nut_id= netcdf.inqVarID(nc,ERSEMdata(nuts).name);
0289
0290 netcdf.putVar(nc,Nut_id,dataint);
0291 disp(['Finished with variable, ',ERSEMdata(nuts).name])
0292 end
0293 else
0294
0295 for nuts=1:NNuts
0296 eval(['netcdf.putVar(nc,',varidN{nuts},',Mobj.(ERSEMdata(nuts).name));'])
0297 disp(['We have reversed the Z dimension of variable , ',ERSEMdata(nuts).name])
0298 disp(['Finished with variable, ',ERSEMdata(nuts).name])
0299 end
0300
0301 end
0302 end
0303
0304 netcdf.close(nc);
0305
0306 if ftbverbose
0307 fprintf('end : %s\n', subname)
0308 end