0001 function Mobj = interp_sst_assimilation(Mobj, conf, output_file)
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 [~, subname] = fileparts(mfilename('fullpath'));
0042 global ftbverbose
0043 if ftbverbose
0044 fprintf('\nbegin : %s \n', subname)
0045 end
0046
0047 year = conf.year;
0048
0049 sst_dir = conf.sst_dir;
0050 sst_pattern = conf.sst_pattern;
0051
0052 time_span = datenum(year-1,12,31):datenum(year+1,01,01);
0053 file_list = cell(length(time_span), 1);
0054
0055
0056 for aa = 1:length(time_span)
0057 file_list{aa} = fullfile(sst_dir, ...
0058 datestr(time_span(aa),'yyyy'), ...
0059 sprintf(sst_pattern, ...
0060 str2num(datestr(time_span(aa), 'yyyy')), ...
0061 str2num(datestr(time_span(aa), 'mm')), ...
0062 str2num(datestr(time_span(aa), 'dd'))));
0063 if ~exist(file_list{aa}, 'file')
0064 error('We are missing a file (%s) from this year (%04d)', ...
0065 file_list{aa}, datestr(time_span(aa),'yyyy'))
0066 end
0067 end
0068
0069
0070 lon = ncread(file_list{1},'lon');
0071 lat = ncread(file_list{1},'lat');
0072 mask = ncread(file_list{1},'mask');
0073 [lonm,latm]=meshgrid(lon,lat);
0074 lonm=lonm';
0075 latm=latm';
0076 lonm = lonm(mask==1);
0077 latm = latm(mask==1);
0078 time = zeros(length(file_list),1);
0079 sst = zeros(Mobj.nVerts,length(file_list),1,'single');
0080 fvcomlon = Mobj.lon;
0081 fvcomlat = Mobj.lat;
0082
0083 if license('test', 'Distrib_Computing_Toolbox')
0084 if isempty(gcp('nocreate'))
0085
0086 parpool('local');
0087 end
0088 end
0089
0090 if ftbverbose
0091 fprintf('Progress:\n');
0092 fprintf([repmat('.', 1, length(file_list)), '\n']);
0093 end
0094 parfor ff = 1:length(file_list)
0095 if ftbverbose
0096 fprintf('|');
0097 end
0098 sst_eo = ncread(file_list{ff}, 'analysed_sst') - 273.15;
0099 mask = ncread(file_list{ff}, 'mask');
0100 lon = ncread(file_list{ff}, 'lon');
0101 lat = ncread(file_list{ff}, 'lat');
0102 [lonm, latm] = meshgrid(lon, lat);
0103 lonm = lonm';
0104 latm = latm';
0105 lonm = lonm(mask == 1);
0106 latm = latm(mask == 1);
0107
0108 time_eo = ncread(file_list{ff}, 'time');
0109 time_eo_units = ncreadatt(file_list{ff}, 'time', 'units');
0110 t0str = textscan(time_eo_units, 'seconds since %s%s');
0111
0112 t0 = datenum([strtrim(t0str{1}{1}), strtrim(t0str{2}{1})], 'yyyy-mm-ddHH:MM:SS');
0113 time_out = (t0 + double(time_eo/(60*60*24)));
0114 sst_eo = sst_eo(mask == 1);
0115
0116
0117 ft = scatteredInterpolant(double(lonm), double(latm), sst_eo, 'nearest', 'linear');
0118
0119 sst(:,ff) = ft(fvcomlon, fvcomlat);
0120 time(ff) = time_out + 0.5;
0121 end
0122
0123 ntimes = length(time);
0124
0125
0126 [sYr, sMon, sDay, sHr, sMin, sSec] = datevec(time);
0127 MJDtime = greg2mjulian(sYr, sMon, sDay, sHr, sMin, sSec);
0128
0129
0130 nc = netcdf.create(output_file, 'clobber');
0131
0132 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'year', num2str(year))
0133 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'title','FVCOM SST 1km merged product File')
0134 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'institution','Plymouth Marine Laboratory')
0135 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'source','FVCOM grid (unstructured) surface forcing')
0136 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'history', sprintf('File created with %s from the MATLAB fvcom-toolbox', subname))
0137 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'references','http://fvcom.smast.umassd.edu, http://codfish.smast.umassd.edu')
0138 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'Conventions','CF-1.0')
0139 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'CoordinateSystem',Mobj.nativeCoords)
0140 netcdf.putAtt(nc,netcdf.getConstant('NC_GLOBAL'),'CoordinateProjection','init=WGS84')
0141
0142
0143 nele_dimid=netcdf.defDim(nc,'nele',Mobj.nElems);
0144 node_dimid=netcdf.defDim(nc,'node',Mobj.nVerts);
0145 three_dimid=netcdf.defDim(nc,'three',3);
0146 time_dimid=netcdf.defDim(nc,'time',netcdf.getConstant('NC_UNLIMITED'));
0147 datestrlen_dimid=netcdf.defDim(nc,'DateStrLen',26);
0148
0149
0150 lon_varid=netcdf.defVar(nc,'lon','NC_FLOAT',node_dimid);
0151 netcdf.putAtt(nc,lon_varid,'long_name','nodal longitude');
0152 netcdf.putAtt(nc,lon_varid,'units','degrees_easdt');
0153
0154 lat_varid=netcdf.defVar(nc,'lat','NC_FLOAT',node_dimid);
0155 netcdf.putAtt(nc,lat_varid,'long_name','nodal latitude');
0156 netcdf.putAtt(nc,lat_varid,'units','degrees_north');
0157
0158 lonc_varid=netcdf.defVar(nc,'lonc','NC_FLOAT',nele_dimid);
0159 netcdf.putAtt(nc,lonc_varid,'long_name','zonal longitude');
0160 netcdf.putAtt(nc,lonc_varid,'units','meters');
0161
0162 latc_varid=netcdf.defVar(nc,'latc','NC_FLOAT',nele_dimid);
0163 netcdf.putAtt(nc,latc_varid,'long_name','zonal latitude');
0164 netcdf.putAtt(nc,latc_varid,'units','meters');
0165
0166 nv_varid=netcdf.defVar(nc,'nv','NC_INT',[nele_dimid, three_dimid]);
0167 netcdf.putAtt(nc,nv_varid,'long_name','nodes surrounding element');
0168
0169
0170 time_varid=netcdf.defVar(nc,'time','NC_FLOAT',time_dimid);
0171 netcdf.putAtt(nc,time_varid,'long_name','time');
0172 netcdf.putAtt(nc,time_varid,'units','days since 1858-11-17 00:00:00');
0173 netcdf.putAtt(nc,time_varid,'delta_t','0000-00-00 01:00:00')
0174
0175 netcdf.putAtt(nc,time_varid,'format','modified julian day (MJD)');
0176 netcdf.putAtt(nc,time_varid,'time_zone','UTC');
0177
0178 times_varid=netcdf.defVar(nc,'Times','NC_CHAR',[datestrlen_dimid,time_dimid]);
0179 netcdf.putAtt(nc,times_varid,'long_name','Calendar Date');
0180 netcdf.putAtt(nc,times_varid,'format','String: Calendar Time');
0181 netcdf.putAtt(nc,times_varid,'time_zone','UTC');
0182
0183 sst_varid = netcdf.defVar(nc, 'sst', 'NC_FLOAT', [node_dimid, time_dimid]);
0184 netcdf.putAtt(nc, sst_varid, 'long_name', 'sea surface Temperature');
0185 netcdf.putAtt(nc, sst_varid, 'units', 'Celsius Degree');
0186 netcdf.putAtt(nc, sst_varid, 'grid', 'fvcom_grid');
0187 netcdf.putAtt(nc, sst_varid, 'coordinates', Mobj.nativeCoords);
0188 netcdf.putAtt(nc, sst_varid, 'type', 'data');
0189
0190
0191 netcdf.endDef(nc);
0192
0193
0194 netcdf.putVar(nc, nv_varid, Mobj.tri);
0195 netcdf.putVar(nc,lon_varid,Mobj.lon);
0196 netcdf.putVar(nc,lat_varid,Mobj.lat);
0197 netcdf.putVar(nc,lonc_varid,Mobj.lonc);
0198 netcdf.putVar(nc,latc_varid,Mobj.latc);
0199 netcdf.putVar(nc,time_varid,0,ntimes,MJDtime);
0200
0201 nStringOut = char();
0202 [nYr, nMon, nDay, nHour, nMin, nSec] = mjulian2greg(MJDtime);
0203 for i=1:ntimes
0204 nDate = [nYr(i), nMon(i), nDay(i), nHour(i), nMin(i), nSec(i)];
0205 nStringOut = [nStringOut, sprintf('%04i/%02i/%02i %02i:%02i:%09.6f', nDate)];
0206 end
0207 netcdf.putVar(nc,times_varid,[0, 0], [26, ntimes], nStringOut);
0208
0209 netcdf.putVar(nc, sst_varid, [0, 0], [Mobj.nVerts, ntimes], sst)
0210 fprintf('done.\n')
0211
0212
0213 netcdf.close(nc);
0214
0215 Mobj.assim.sst.data = sst;
0216 Mobj.assim.sst.time = time;
0217
0218
0219
0220
0221
0222
0223
0224 if ftbverbose
0225 fprintf('end : %s \n', subname)
0226 end