0001 function write_FVCOM_tsobc(basename,time,nSiglay,in_temp,in_salt,Mobj,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 if nargin == 5
0061 warning(['Assuming uniform terrain-following sigma coordinates. ', ...
0062 'To specify different sigma coordintes, supply a MATLAB mesh ', ...
0063 'structure with fields siglay and siglev.'])
0064 end
0065
0066 subname = 'write_FVCOM_tsobc';
0067 global ftbverbose;
0068 if ftbverbose
0069 fprintf('\nbegin : %s\n', subname)
0070 end
0071
0072
0073 strtime = true;
0074 inttime = false;
0075 floattime = false;
0076 for vv = 1:2:length(varargin)
0077 switch varargin{vv}
0078 case 'strtime'
0079 strtime = true;
0080 case 'inttime'
0081 inttime = true;
0082 case 'floattime'
0083 floattime = true;
0084 end
0085 end
0086
0087 fvcom_bathy = [basename, '_dep.dat'];
0088 fvcom_obc = [basename, '_obc.dat'];
0089 tsOBCFile = [basename, '_tsobc.nc'];
0090
0091
0092
0093
0094 fid = fopen(fvcom_obc,'r');
0095 if(fid < 0)
0096 error(['file: ' fvcom_obc ' does not exist']);
0097 end
0098 C = textscan(fid, '%s %s %s %s %d', 1);
0099 nObc = C{5};
0100 obc_nodes = zeros(nObc,1);
0101 if(ftbverbose); fprintf('reading obc file\n'); end;
0102 if(ftbverbose); fprintf('# nodes %d\n',nObc); end;
0103 for i=1:nObc
0104 C = textscan(fid, '%d %d %d', 1);
0105 obc_nodes(i) = C{2};
0106 end
0107
0108 if(ftbverbose); fprintf('obc reading complete\n');end;
0109
0110
0111
0112
0113 fid = fopen(fvcom_bathy,'r');
0114 if(fid < 0)
0115 error(['file: ' fvcom_bathy ' does not exist']);
0116 end
0117 C = textscan(fid, '%s %s %s %d', 1);
0118 Nverts = C{4};
0119 h = zeros(Nverts,1);
0120 if(ftbverbose); fprintf('reading bathymetry file\n');end;
0121 if(ftbverbose); fprintf('# nodes %d\n',Nverts);end;
0122 for i=1:Nverts
0123 C = textscan(fid, '%f %f %f', 1);
0124 h(i) = C{3};
0125 end
0126 if(ftbverbose); fprintf('min depth %f max depth %f\n',min(h),max(h));end;
0127 if(ftbverbose); fprintf('bathymetry reading complete\n');end;
0128 fclose(fid);
0129
0130
0131
0132
0133
0134
0135 obc_h = h(obc_nodes);
0136
0137
0138
0139 nTimes = numel(time);
0140
0141 nSiglev = nSiglay + 1;
0142
0143
0144 if max(size(in_temp)) == 1
0145 inc = 1/real(nSiglay);
0146 siglev = 0:-inc:-1;
0147 siglay = nan(1, nSiglay);
0148 for i=1:nSiglay
0149 siglay(i) = mean(siglev(i:i+1));
0150 end
0151
0152 temp = zeros(nObc,nSiglay,nTimes);
0153 salt = zeros(nObc,nSiglay,nTimes);
0154
0155
0156 obc_temp = repmat(in_temp, 1, nTimes);
0157 obc_salt = repmat(in_salt, 1, nTimes);
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 for i=1:nObc
0169 for j=1:nSiglay
0170 temp(i,j,:) = obc_temp;
0171 salt(i,j,:) = obc_salt;
0172 end
0173 end
0174 else
0175
0176 temp = in_temp;
0177 salt = in_salt;
0178
0179 if nargin == 6 && isfield(Mobj, 'siglay') && isfield(Mobj, 'siglev')
0180 siglev = Mobj.siglev(obc_nodes, :);
0181 siglay = Mobj.siglay(obc_nodes, :);
0182 else
0183 warning('Assuming uniform terrain-following sigma coordinates')
0184 inc = 1/real(nSiglay);
0185 siglev = 0:-inc:-1;
0186 siglay = nan(1, nSiglay);
0187 end
0188
0189 if nSiglev ~= size(in_temp, 2) + 1 || size(siglev, 2) ~= size(in_temp, 2) + 1 || size(siglev, 2) ~= size(in_salt, 2) + 1
0190 error('Specified number sigma levels does not match supplied data')
0191 end
0192 if nSiglay ~= size(in_temp, 2) || size(siglay, 2) ~= size(in_temp, 2) || size(siglay, 2) ~= size(in_salt, 2)
0193 error('Specified number of sigma layers does not match supplied data')
0194 end
0195 end
0196
0197
0198
0199
0200
0201
0202 nc = netcdf.create(tsOBCFile, 'clobber');
0203
0204
0205 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'title','Open boundary temperature and salinity nudging')
0206 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'type','FVCOM TIME SERIES OBC TS FILE')
0207 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'history', sprintf('File created with %s from the MATLAB fvcom-toolbox', subname))
0208
0209
0210
0211 nobc_dimid=netcdf.defDim(nc,'nobc',nObc);
0212 datestrlen_dimid=netcdf.defDim(nc,'DateStrLen',26);
0213 time_dimid=netcdf.defDim(nc,'time',netcdf.getConstant('NC_UNLIMITED'));
0214 siglay_dimid=netcdf.defDim(nc,'siglay',nSiglay);
0215 siglev_dimid=netcdf.defDim(nc,'siglev',nSiglev);
0216
0217
0218 if strtime
0219 Times_varid=netcdf.defVar(nc,'Times','NC_CHAR',[datestrlen_dimid, time_dimid]);
0220 netcdf.putAtt(nc,Times_varid,'time_zone','UTC');
0221 end
0222
0223 if floattime
0224 time_varid=netcdf.defVar(nc,'time','NC_FLOAT',time_dimid);
0225 netcdf.putAtt(nc,time_varid,'long_name','time');
0226 netcdf.putAtt(nc,time_varid,'units','days since 1858-11-17 00:00:00');
0227 netcdf.putAtt(nc,time_varid,'time_zone','UTC');
0228 end
0229
0230 if inttime
0231 itime_varid=netcdf.defVar(nc,'Itime','NC_INT',time_dimid);
0232 netcdf.putAtt(nc,itime_varid,'units','days since 1858-11-17 00:00:00');
0233 netcdf.putAtt(nc,itime_varid,'format','modified julian day (MJD)');
0234 netcdf.putAtt(nc,itime_varid,'time_zone','UTC');
0235
0236 itime2_varid=netcdf.defVar(nc,'Itime2','NC_INT',time_dimid);
0237 netcdf.putAtt(nc,itime2_varid,'units','msec since 00:00:00');
0238 netcdf.putAtt(nc,itime2_varid,'time_zone','UTC');
0239 end
0240
0241 nobc_varid=netcdf.defVar(nc,'obc_nodes','NC_INT',nobc_dimid);
0242 netcdf.putAtt(nc,nobc_varid,'long_name','Open Boundary Node Number');
0243 netcdf.putAtt(nc,nobc_varid,'grid','obc_grid');
0244 netcdf.putAtt(nc,nobc_varid,'type','data');
0245
0246 obc_h_varid=netcdf.defVar(nc,'obc_h','NC_FLOAT',nobc_dimid);
0247 netcdf.putAtt(nc,obc_h_varid,'long_name','Open Boundary Depth');
0248 netcdf.putAtt(nc,obc_h_varid,'units','m');
0249 netcdf.putAtt(nc,obc_h_varid,'grid','obc_grid');
0250 netcdf.putAtt(nc,obc_h_varid,'type','data');
0251
0252 obc_siglev_varid=netcdf.defVar(nc,'siglev','NC_FLOAT',[nobc_dimid,siglev_dimid]);
0253 netcdf.putAtt(nc,obc_siglev_varid,'long_name','ocean_sigma/general_coordinate');
0254 netcdf.putAtt(nc,obc_siglev_varid,'grid','obc_grid');
0255
0256 obc_siglay_varid=netcdf.defVar(nc,'siglay','NC_FLOAT',[nobc_dimid,siglay_dimid]);
0257 netcdf.putAtt(nc,obc_siglay_varid,'long_name','ocean_sigma/general_coordinate');
0258 netcdf.putAtt(nc,obc_siglay_varid,'grid','obc_grid');
0259
0260 obc_temp_varid=netcdf.defVar(nc,'obc_temp','NC_FLOAT',[nobc_dimid,siglay_dimid,time_dimid]);
0261 netcdf.putAtt(nc,obc_temp_varid,'long_name','sea_water_temperature');
0262 netcdf.putAtt(nc,obc_temp_varid,'units','Celcius');
0263 netcdf.putAtt(nc,obc_temp_varid,'grid','obc_grid');
0264
0265 obc_salinity_varid=netcdf.defVar(nc,'obc_salinity','NC_FLOAT',[nobc_dimid,siglay_dimid,time_dimid]);
0266 netcdf.putAtt(nc,obc_salinity_varid,'long_name','sea_water_salinity');
0267 netcdf.putAtt(nc,obc_salinity_varid,'units','PSU');
0268 netcdf.putAtt(nc,obc_salinity_varid,'grid','obc_grid');
0269
0270
0271 netcdf.endDef(nc);
0272
0273
0274 netcdf.putVar(nc,nobc_varid,obc_nodes);
0275 netcdf.putVar(nc,obc_h_varid,obc_h);
0276 netcdf.putVar(nc,obc_siglev_varid,siglev);
0277 netcdf.putVar(nc,obc_siglay_varid,siglay);
0278 if strtime
0279 nStringOut = char();
0280 [nYr, nMon, nDay, nHour, nMin, nSec] = mjulian2greg(time);
0281 for i=1:nTimes
0282 nDate = [nYr(i), nMon(i), nDay(i), nHour(i), nMin(i), nSec(i)];
0283 nStringOut = [nStringOut, sprintf('%04i/%02i/%02i %02i:%02i:%09.6f', nDate)];
0284 end
0285 netcdf.putVar(nc,Times_varid,[0, 0], [26, nTimes],nStringOut);
0286 end
0287 if floattime
0288 netcdf.putVar(nc,time_varid,0,numel(time),time);
0289 end
0290 if inttime
0291 netcdf.putVar(nc,itime_varid,floor(time));
0292
0293
0294
0295 netcdf.putVar(nc,itime2_varid,0,numel(time),round((mod(time,1)*24*3600*1000)/(3600*1000))*(3600*1000));
0296 end
0297 netcdf.putVar(nc,obc_temp_varid,temp);
0298 netcdf.putVar(nc,obc_salinity_varid,salt);
0299
0300
0301 netcdf.close(nc);
0302
0303 if ftbverbose; fprintf('end : %s\n', subname); end