0001 function write_FVCOM_tsobc(basename,time,nSiglay,in_temp,in_salt,Mobj)
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 if nargin == 5
0043 warning(['Assuming uniform terrain-following sigma coordinates. ',...
0044 'To specify different sigma coordintes, supply a MATLAB mesh ',...
0045 'structure with fields siglay and siglev.'])
0046 end
0047
0048 subname = 'write_FVCOM_tsobc';
0049 global ftbverbose;
0050 if(ftbverbose);
0051 fprintf('\n')
0052 fprintf(['begin : ' subname '\n'])
0053 end;
0054
0055 fvcom_bathy = [basename, '_dep.dat'];
0056 fvcom_obc = [basename, '_obc.dat'];
0057 tsOBCFile = [basename, '_tsobc.nc'];
0058
0059
0060
0061
0062 fid = fopen(fvcom_obc,'r');
0063 if(fid < 0)
0064 error(['file: ' fvcom_obc ' does not exist']);
0065 end;
0066 C = textscan(fid, '%s %s %s %s %d', 1);
0067 nObc = C{5};
0068 obc_nodes = zeros(nObc,1);
0069 if(ftbverbose); fprintf('reading obc file\n'); end;
0070 if(ftbverbose); fprintf('# nodes %d\n',nObc); end;
0071 for i=1:nObc
0072 C = textscan(fid, '%d %d %d', 1);
0073 obc_nodes(i) = C{2};
0074 end;
0075
0076 if(ftbverbose); fprintf('obc reading complete\n');end;
0077
0078
0079
0080
0081 fid = fopen(fvcom_bathy,'r');
0082 if(fid < 0)
0083 error(['file: ' fvcom_bathy ' does not exist']);
0084 end;
0085 C = textscan(fid, '%s %s %s %d', 1);
0086 Nverts = C{4};
0087 h = zeros(Nverts,1);
0088 if(ftbverbose); fprintf('reading bathymetry file\n');end;
0089 if(ftbverbose); fprintf('# nodes %d\n',Nverts);end;
0090 for i=1:Nverts
0091 C = textscan(fid, '%f %f %f', 1);
0092 h(i) = C{3};
0093 end;
0094 if(ftbverbose); fprintf('min depth %f max depth %f\n',min(h),max(h));end;
0095 if(ftbverbose); fprintf('bathymetry reading complete\n');end;
0096 fclose(fid);
0097
0098
0099
0100
0101
0102
0103 obc_h = h(obc_nodes);
0104
0105
0106
0107 nTimes = numel(time);
0108
0109 nSiglev = nSiglay + 1;
0110
0111
0112 if max(size(in_temp)) == 1
0113 inc = 1/real(nSiglay);
0114 siglev = 0:-inc:-1;
0115 siglay = nan(1, nSiglay);
0116 for i=1:nSiglay
0117 siglay(i) = mean(siglev(i:i+1));
0118 end
0119
0120 temp = zeros(nObc,nSiglay,nTimes);
0121 salt = zeros(nObc,nSiglay,nTimes);
0122
0123
0124 obc_temp = repmat(in_temp, 1, nTimes);
0125 obc_salt = repmat(in_salt, 1, nTimes);
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 for i=1:nObc
0137 for j=1:nSiglay
0138 temp(i,j,:) = obc_temp;
0139 salt(i,j,:) = obc_salt;
0140 end
0141 end
0142 else
0143
0144 temp = in_temp;
0145 salt = in_salt;
0146
0147 if nargin == 6 && isfield(Mobj, 'siglay') && isfield(Mobj, 'siglev')
0148 siglev = Mobj.siglev;
0149 siglay = Mobj.siglay;
0150 else
0151 warning('Assuming uniform terrain-following sigma coordinates')
0152 inc = 1/real(nSiglay);
0153 siglev = 0:-inc:-1;
0154 siglay = nan(1, nSiglay);
0155 end
0156
0157 if nSiglev ~= size(in_temp, 2) + 1 || length(siglev) ~= size(in_temp, 2) + 1 || length(siglev) ~= size(in_salt, 2) + 1
0158 error('Specified number sigma levels does not match supplied data')
0159 end
0160 if nSiglay ~= size(in_temp, 2) || length(siglay) ~= size(in_temp, 2) || length(siglay) ~= size(in_salt, 2)
0161 error('Specified number of sigma layers does not match supplied data')
0162 end
0163 end
0164
0165
0166
0167
0168
0169
0170 nc = netcdf.create(tsOBCFile, 'clobber');
0171
0172
0173 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'type','FVCOM RIVER FORCING FILE')
0174 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'title','simple open boundary hydrography test')
0175 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'type','FVCOM TIME SERIES OBC TS FILE')
0176 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'history','generated using the fvcom-toolbox')
0177
0178
0179
0180 nobc_dimid=netcdf.defDim(nc,'nobc',nObc);
0181 datestrlen_dimid=netcdf.defDim(nc,'Datestrln',26);
0182 time_dimid=netcdf.defDim(nc,'time',netcdf.getConstant('NC_UNLIMITED'));
0183 siglay_dimid=netcdf.defDim(nc,'siglay',nSiglay);
0184 siglev_dimid=netcdf.defDim(nc,'siglev',nSiglev);
0185
0186
0187
0188
0189 time_varid=netcdf.defVar(nc,'time','NC_FLOAT',time_dimid);
0190 netcdf.putAtt(nc,time_varid,'long_name','time');
0191 netcdf.putAtt(nc,time_varid,'units','days since 1858-11-17 00:00:00');
0192 netcdf.putAtt(nc,time_varid,'time_zone','UTC');
0193
0194 itime_varid=netcdf.defVar(nc,'Itime','NC_INT',time_dimid);
0195 netcdf.putAtt(nc,itime_varid,'units','days since 1858-11-17 00:00:00');
0196 netcdf.putAtt(nc,itime_varid,'format','modified julian day (MJD)');
0197 netcdf.putAtt(nc,itime_varid,'time_zone','UTC');
0198
0199 itime2_varid=netcdf.defVar(nc,'Itime2','NC_INT',time_dimid);
0200 netcdf.putAtt(nc,itime2_varid,'units','msec since 00:00:00');
0201 netcdf.putAtt(nc,itime2_varid,'time_zone','UTC');
0202
0203 nobc_varid=netcdf.defVar(nc,'obc_nodes','NC_INT',nobc_dimid);
0204 netcdf.putAtt(nc,nobc_varid,'long_name','Open Boundary Node Number');
0205 netcdf.putAtt(nc,nobc_varid,'grid','obc_grid');
0206 netcdf.putAtt(nc,nobc_varid,'type','data');
0207
0208 obc_h_varid=netcdf.defVar(nc,'obc_h','NC_FLOAT',nobc_dimid);
0209 netcdf.putAtt(nc,obc_h_varid,'long_name','Open Boundary Depth');
0210 netcdf.putAtt(nc,obc_h_varid,'units','m');
0211 netcdf.putAtt(nc,obc_h_varid,'grid','obc_grid');
0212 netcdf.putAtt(nc,obc_h_varid,'type','data');
0213
0214 obc_siglev_varid=netcdf.defVar(nc,'siglev','NC_FLOAT',siglev_dimid);
0215 netcdf.putAtt(nc,obc_siglev_varid,'long_name','ocean_sigma/general_coordinate');
0216 netcdf.putAtt(nc,obc_siglev_varid,'grid','obc_grid');
0217
0218 obc_siglay_varid=netcdf.defVar(nc,'siglay','NC_FLOAT',siglay_dimid);
0219 netcdf.putAtt(nc,obc_siglay_varid,'long_name','ocean_sigma/general_coordinate');
0220 netcdf.putAtt(nc,obc_siglay_varid,'grid','obc_grid');
0221
0222 obc_temp_varid=netcdf.defVar(nc,'obc_temp','NC_FLOAT',[nobc_dimid,siglay_dimid,time_dimid]);
0223 netcdf.putAtt(nc,obc_temp_varid,'long_name','sea_water_temperature');
0224 netcdf.putAtt(nc,obc_temp_varid,'units','Celcius');
0225 netcdf.putAtt(nc,obc_temp_varid,'grid','obc_grid');
0226
0227 obc_salinity_varid=netcdf.defVar(nc,'obc_salinity','NC_FLOAT',[nobc_dimid,siglay_dimid,time_dimid]);
0228 netcdf.putAtt(nc,obc_salinity_varid,'long_name','sea_water_salinity');
0229 netcdf.putAtt(nc,obc_salinity_varid,'units','PSU');
0230 netcdf.putAtt(nc,obc_salinity_varid,'grid','obc_grid');
0231
0232
0233 netcdf.endDef(nc);
0234
0235
0236 netcdf.putVar(nc,nobc_varid,obc_nodes);
0237 netcdf.putVar(nc,obc_h_varid,obc_h);
0238 netcdf.putVar(nc,obc_siglev_varid,siglev);
0239 netcdf.putVar(nc,obc_siglay_varid,siglay);
0240 netcdf.putVar(nc,time_varid,0,numel(time),time);
0241 netcdf.putVar(nc,itime_varid,floor(time));
0242 netcdf.putVar(nc,itime2_varid,0,numel(time),mod(time,1)*24*3600*1000);
0243
0244 netcdf.putVar(nc,obc_temp_varid,temp);
0245 netcdf.putVar(nc,obc_salinity_varid,salt);
0246
0247
0248 netcdf.close(nc);
0249
0250 if(ftbverbose); fprintf(['end : ' subname '\n']);end;