%% NC DUNEX Realtime script % Alexander Rey, August 12, 2019 % Moved to COASTLINES Feb 29, 2020 clear all cd D:\DUNEX_RT\Operation echo off; % addpath('NCtoolbox') addpath('m_map') % setup_nctoolbox flowGrid = load('Cone7W_100.mat'); waveGrid = load('Cone7W_250.mat'); load('LMSL_RT.mat') addpath('D:\DUNEX_RT\Operation\abogaard-matlab2gsheets-6d76271') setenv('PATH', [getenv('PATH') ';D:\DUNEX_RT\Windows_64']); %% Details for e-mail server setpref('Internet','SMTP_Server','smtp.sendgrid.net'); setpref('Internet','E_mail','mail@alexanderrey.ca'); setpref('Internet','SMTP_Username','apikey'); setpref('Internet','SMTP_Password','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'); props = java.lang.System.getProperties; props.setProperty('mail.smtp.auth','true'); props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory'); props.setProperty('mail.smtp.socketFactory.port','465'); props.setProperty('mail.smtp.starttls.enable','true'); %% Master Model Time Step % Every 6 hours nistTime = datetime(datevec(now())) - tzoffset(datetime(datevec(now()),'TimeZone','local')); masterTime = dateshift(nistTime,'start','hour')-hours(2) % Assume script will run at 5 and a half hours after model start clear nistTime masterDate = datetime(year(masterTime),month(masterTime),day(masterTime)); if exist(['tri-rst.rt_run.' datestr(masterTime,'yyyymmdd.HH') '0000'])==2 FIRST_RUN = 0; else FIRST_RUN = 1; end %% Import try Import=0; %% Clean files from previous run system('taskkill /IM "d_hydro.exe" /F') system('taskkill /IM "wave.exe" /F') delete com-* delete hot* delete rt_run.prt* delete tri-diag.* delete TMP_* delete trim-* delete wavm-* delete trih-* delete obs.loct00* delete WNDNOW delete swan.inp delete PRINT* delete hot* delete SWANOUT* delete Errfile* delete WAVE2FLOW* delete FLOW2WAVE* clear HRRR_UTM while Import==0 try %% Import data from NOMADS %% Extratropical Surge and Tide Operational Forecast System for the Atlantic % (ESTOFS Atlantic) for water levels options = weboptions; options.Timeout = 90; try % url = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/estofs/prod/estofs.'... % datestr(masterTime-hours(6),'yyyymmdd')... % '/estofs.t' datestr(masterTime-hours(6),'hh') 'z.conus.east.f000.grib2']; url = ['https://noaa-gestofs-pds.s3.amazonaws.com/estofs.'... datestr(masterTime-hours(6),'yyyymmdd')... '/estofs.t' datestr(masterTime-hours(6),'hh') 'z.conus.east.f000.grib2']; websave('ESTOFS.grib',url,options) ESTOFS = ncgeodataset('ESTOFS.grib'); m_proj('lambert conformal conic','ori',[-95 25.0],'clo',-95,'par',[25 25],'ell','sphere'); [meshX,meshY] = meshgrid(ESTOFS{'x'}(:),ESTOFS{'y'}(:)); [lonESTOFS,latESTOFS] = m_xy2ll(meshX.*1000,meshY.*1000); clear meshX meshY ESTstart = 6; %7 ESTrun = 6; catch % url = ['http://nomads.ncep.noaa.gov/dods/estofs_atl/'... % datestr(masterTime-days(1),'yyyymmdd')... % '/estofs_atl_conus_' datestr(masterTime-days(1),'hh') 'z']; % ESTOFS = ncgeodataset(url); % lonESTOFS=ESTOFS{'lon'}(:); % latESTOFS=ESTOFS{'lat'}(:); % ESTstart = 24+ESTstart; % url = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/estofs/prod/estofs.'... % datestr(masterTime-days(1),'yyyymmdd')... % '/estofs.t' datestr(masterTime-days(1),'hh') 'z.conus.east.f000.grib2']; url = ['https://noaa-gestofs-pds.s3.amazonaws.com/estofs.'... datestr(masterTime-days(1),'yyyymmdd')... '/estofs.t' datestr(masterTime-days(1),'hh') 'z.conus.east.f000.grib2']; websave('ESTOFS.grib',url,options) ESTOFS = ncgeodataset('ESTOFS.grib'); m_proj('lambert conformal conic','ori',[-95 25.0],'clo',-95,'par',[25 25],'ell','sphere'); [meshX,meshY] = meshgrid(ESTOFS{'x'}(:),ESTOFS{'y'}(:)); [lonESTOFS,latESTOFS] = m_xy2ll(meshX.*1000,meshY.*1000); clear meshX meshY ESTstart = 24; %25 ESTrun = 24; end clear url % Find ESTOFS index for grid points along boundry idxCount=1; for i = 2:10:length(flowGrid.data.Y)-1 % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(1081,i),flowGrid.data.Y(1081,i),'18 S'); [idxESTOFS(idxCount,:)] = ... NearestValue([gridDeg(idxCount,:)],latESTOFS,lonESTOFS); %Lat wlIDX(idxCount,:) = [1082,i]; idxCount = idxCount + 1; end wlBoundCount(1) = 0; wlBoundCount(2) = idxCount -1; for i = 750:11:1080 % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,1321),flowGrid.data.Y(i,1321),'18 S'); % [idxESTOFS(idxCount,1)] = NearestValue(gridDeg(idxCount,1),latESTOFS); %Lat % [idxESTOFS(idxCount,2)] = NearestValue(gridDeg(idxCount,2),lonESTOFS); %Lon [idxESTOFS(idxCount,:)] = ... NearestValue([gridDeg(idxCount,:)],latESTOFS,lonESTOFS); wlIDX(idxCount,:) = [i,1322]; idxCount = idxCount + 1; end wlBoundCount(3) = idxCount -1; for i = 475:5:1080 % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,1),flowGrid.data.Y(i,1),'18 S'); % [idxESTOFS(idxCount,1)] = NearestValue(gridDeg(idxCount,1),latESTOFS); %Lat % [idxESTOFS(idxCount,2)] = NearestValue(gridDeg(idxCount,2),lonESTOFS); %Lon [idxESTOFS(idxCount,:)] = ... NearestValue([gridDeg(idxCount,:)],latESTOFS,lonESTOFS); wlIDX(idxCount,:) = [i,1]; idxCount = idxCount + 1; end wlBoundCount(4) = idxCount -1; clear idxCount gridDeg % Extract ESTOFS Water Levels for 36 hours at indexes % waterLevelsGRID = ESTOFS{'Ocean_Surface_Elevation_Relative_to_Geoid_surface'}(ESTstart:ESTstart+36,min(idxESTOFS(:,1)):max(idxESTOFS(:,1)),... % min(idxESTOFS(:,2)):max(idxESTOFS(:,2))); % Extract small grid % Find ESTOFS values from small grid idxCount=1; errorET = 0; for i = ESTstart:ESTstart+96 if errorET<10 try % url = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/estofs/prod/estofs.'... % datestr(masterTime-hours(ESTrun),'yyyymmdd')... % '/estofs.t' datestr(masterTime-hours(ESTrun),'hh') 'z.conus.east.f'... % num2str(i,'%03d') '.grib2']; url = ['https://noaa-gestofs-pds.s3.amazonaws.com/estofs.'... datestr(masterTime-hours(ESTrun),'yyyymmdd')... '/estofs.t' datestr(masterTime-hours(ESTrun),'hh') 'z.conus.east.f'... num2str(i,'%03d') '.grib2']; websave(['D:\DUNEX_RT\Archive\ESTOFS\ESTOFS_' ... datestr(masterTime,'YYYY-mm-DD_HH') '_f' num2str(idxCount-1,'%03d') '.grib'],url,options) if i<=ESTstart+48 ESTOFS = ncgeodataset(['D:\DUNEX_RT\Archive\ESTOFS\ESTOFS_' ... datestr(masterTime,'YYYY-mm-DD_HH') '_f' num2str(idxCount-1,'%03d') '.grib']); waterLevelsGRID(idxCount,:,:) = ESTOFS{'Ocean_Surface_Elevation_Relative_to_Geoid_surface'}(1,min(idxESTOFS(:,1)):max(idxESTOFS(:,1)),... min(idxESTOFS(:,2)):max(idxESTOFS(:,2))); % Extract small grid end idxCount = idxCount + 1; catch errorET = errorET+1; end else error('ESTOFS ERROR') end end idxCount=1; for i = 1:length(idxESTOFS) waterLevels(:,idxCount) = waterLevelsGRID(:,idxESTOFS(idxCount,1)-min(idxESTOFS(:,1))+1,... idxESTOFS(idxCount,2)-min(idxESTOFS(:,2))+1); idxCount = idxCount + 1; end % Save ESTOFS Points % url = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/estofs/prod/estofs.'... % datestr(masterTime-hours(ESTrun),'yyyymmdd')... % '/estofs.t' datestr(masterTime-hours(ESTrun),'hh') 'z.points.cwl.nc']; url = ['https://noaa-gestofs-pds.s3.amazonaws.com/estofs.'... datestr(masterTime-hours(ESTrun),'yyyymmdd')... '/estofs.t' datestr(masterTime-hours(ESTrun),'hh') 'z.points.cwl.nc']; websave(['D:\DUNEX_RT\Archive\ESTOFS\ESTOFS_' ... datestr(masterTime,'YYYY-mm-DD_HH') '_points.nc'],url,options) % fprintf(fileID,[boundryNames{Boundry} ' N T 750 1322 1081 1322 0.0000000e+000\n']); % fprintf(fileID,[boundryNames{Boundry} ' N T 475 1 1081 1 0.0000000e+000\n']); clear idxCount disp('Loaded ESTOFS') %% Multi-grid Wave model (WAVEWATCH III) % 4 arc minute US East Coast grid for waves url = ['https://nomads.ncep.noaa.gov/dods/wave/gfswave/'... datestr(masterTime-hours(6),'yyyymmdd')... '/gfswave.atlocn.0p16_' datestr(masterTime-hours(6),'hh') 'z']; MWW3 = ncgeodataset(url); clear url lonMWW3=wrapTo180(MWW3{'lon'}(:)); latMWW3=MWW3{'lat'}(:); % Find MWW3 index for grid points along boundry idxCount=1; for i = 1:25:length(waveGrid.data.Y)-25 % Every ~200 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(waveGrid.data.X(end-2,i),waveGrid.data.Y(end-2,i),'18 S'); waveDistAlong(idxCount) = sum(sqrt(diff(waveGrid.data.X(end-2,1:i)).^2+... diff(waveGrid.data.Y(end-2,1:i)).^2)); waveUTM(idxCount,1) = waveGrid.data.X(end-2,i); waveUTM(idxCount,2) = waveGrid.data.Y(end-2,i); [idxMWW3(idxCount,1)] = NearestValue(gridDeg(idxCount,1),latMWW3); %Lat [idxMWW3(idxCount,2)] = NearestValue(gridDeg(idxCount,2),lonMWW3); %Lon idxCount = idxCount + 1; end waveBoundCount(1) = 0; waveBoundCount(2) = idxCount -1; for i = size(waveGrid.data.X,1)-25:-25:350% Every ~200 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(waveGrid.data.X(i,end-2),waveGrid.data.Y(i,end-2),'18 S'); waveDistAlong(idxCount) = sum(sqrt(diff(waveGrid.data.X(i:end-2,end-2)).^2+... diff(waveGrid.data.Y(i:end-2,end-2)).^2)); waveUTM(idxCount,1) = waveGrid.data.X(i,end-2); waveUTM(idxCount,2) = waveGrid.data.Y(i,end-2); [idxMWW3(idxCount,1)] = NearestValue(gridDeg(idxCount,1),latMWW3); %Lat [idxMWW3(idxCount,2)] = NearestValue(gridDeg(idxCount,2),lonMWW3); %Lon idxCount = idxCount + 1; end % 0 132 163 285 waveBoundCount(3) = idxCount -1; for i = size(waveGrid.data.X,1)-25:-25:240 % Every ~200 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(waveGrid.data.X(i,2),waveGrid.data.Y(i,2),'18 S'); waveDistAlong(idxCount) = sum(sqrt(diff(waveGrid.data.X(i:end-2,1)).^2+... diff(waveGrid.data.Y(i:end-2,1)).^2)); waveUTM(idxCount,1) = waveGrid.data.X(i,2); waveUTM(idxCount,2) = waveGrid.data.Y(i,2); [idxMWW3(idxCount,1)] = NearestValue(gridDeg(idxCount,1),latMWW3); %Lat [idxMWW3(idxCount,2)] = NearestValue(gridDeg(idxCount,2),lonMWW3); %Lon idxCount = idxCount + 1; end waveBoundCount(4) = idxCount -1; clear idxCount % Extract WW3 Hs for 36 hours at indexes wavesGRID_Hs = MWW3{'htsgwsfc'}(7:23,min(idxMWW3(:,1)):max(idxMWW3(:,1)),... min(idxMWW3(:,2)):max(idxMWW3(:,2))); % Extract small grid htsgwsfc %swell_1 % Period wavesGRID_P = MWW3{'perpwsfc'}(7:23,min(idxMWW3(:,1)):max(idxMWW3(:,1)),... % min(idxMWW3(:,2)):max(idxMWW3(:,2))); % Extract small grid perpwsfc %swper_1 % Direction wavesGRID_Dir = MWW3{'dirpwsfc'}(7:23,min(idxMWW3(:,1)):max(idxMWW3(:,1)),... min(idxMWW3(:,2)):max(idxMWW3(:,2))); % Extract small grid dirpwsfc %swdir_1 % Find WW3 values from small grid idxCount=1; for i = 1:length(idxMWW3) waves(:,idxCount,1) = wavesGRID_Hs(:,idxMWW3(idxCount,1)-min(idxMWW3(:,1))+1,... idxMWW3(idxCount,2)-min(idxMWW3(:,2))+1); %Hs waves(:,idxCount,2) = wavesGRID_P(:,idxMWW3(idxCount,1)-min(idxMWW3(:,1))+1,... idxMWW3(idxCount,2)-min(idxMWW3(:,2))+1); %Tp waves(:,idxCount,3) = wavesGRID_Dir(:,idxMWW3(idxCount,1)-min(idxMWW3(:,1))+1,... idxMWW3(idxCount,2)-min(idxMWW3(:,2))+1); %Dir idxCount = idxCount + 1; end clear idxCount disp('Loaded WW3') %% HRRR (High-Resolution Rapid Refresh) % Wind Speeds, Directions, Pressures, Precipitations % url = ['http://nomads.ncep.noaa.gov/dods/hrrr/hrrr'... % datestr(masterTime,'yyyymmdd')... % '/hrrr_sfc.t' datestr(masterTime,'hh') 'z']; % delete(gcp('nocreate')) % parpool(8); for ForcastHour = 0:48 % url = ['http://nomads.ncep.noaa.gov/pub/data/nccf/com/hrrr/prod/'... % 'hrrr.' datestr(masterTime,'yyyymmdd')... % '/conus/hrrr.t' num2str(hour(masterTime),'%02d') 'z.'... % 'wrfsfcf' num2str(ForcastHour,'%02d') '.grib2']; url = ['https://nomads.ncep.noaa.gov/cgi-bin/filter_hrrr_2d.pl?file=hrrr.'... 't' num2str(hour(masterTime),'%02d') 'z.wrfsfc'... 'f' num2str(ForcastHour,'%02d') '.grib2&'... 'lev_10_m_above_ground=on&lev_surface=on&var_APCP=on&var_PRES=on&var_UGRD=on&var_VGRD=on&var_TMP=on&subregion=&leftlon=-78&rightlon=-74&toplat=38&bottomlat=32.5&dir=%2F'... 'hrrr.' datestr(masterTime,'yyyymmdd') '%2Fconus']; websave(['D:\DUNEX_RT\Operation\HRRR\hrrrT' num2str(ForcastHour,'%02d') '.grib2'],url,options) [pCheck,gridParams] = system(['perl "D:\DUNEX_RT\Windows_64\grid_defn.pl" '... 'D:\DUNEX_RT\Operation\HRRR\hrrrT' num2str(ForcastHour,'%02d') '.grib2']); [wCheck,gridParams] = system(['wgrib2 D:\DUNEX_RT\Operation\HRRR\hrrrT' ... num2str(ForcastHour,'%02d') '.grib2 -new_grid_winds earth -new_grid ' ... gridParams ' D:\DUNEX_RT\Operation\HRRR\hrrrT'... num2str(ForcastHour,'%02d') '.grib2.regrid']); end % delete(gcp('nocreate')) HRRR = ncgeodataset(['D:\DUNEX_RT\Operation\HRRR\hrrrT' num2str(0,'%02d') '.grib2.regrid']); clear url m_proj('lambert conformal conic','ori',[262.5 38.5],'clo',262.5,'par',[38.5 38.5],'ell','sphere');%,'lat',[20 55],'lon',[-60 -130] [meshX,meshY] = meshgrid(HRRR{'x'}(:),HRRR{'y'}(:)); [windGridLON,windGridLAT] = m_xy2ll(meshX.*1000,meshY.*1000); windGridLON=wrapTo180(windGridLON); clear meshX meshY % Extract MWW3 Hs for 48 hours at indexes for ForcastHour = 0:48 HRRR = ncgeodataset(['D:\DUNEX_RT\Operation\HRRR\hrrrT' num2str(ForcastHour,'%02d') '.grib2.regrid']); windU(ForcastHour+1,:,:) = HRRR{'u-component_of_wind_height_above_ground'}(:,:,:); %U Winds @ 10m [m/s] windV(ForcastHour+1,:,:) = HRRR{'v-component_of_wind_height_above_ground'}(:,:,:); %V Winds @ 10m [m/s] HRRR = ncgeodataset(['D:\DUNEX_RT\Operation\HRRR\hrrrT' num2str(ForcastHour,'%02d') '.grib2']); pressure(ForcastHour+1,:,:) = HRRR{'Pressure_surface'}(:,:,:); %Surface Pressure [pa] if ForcastHour==0 rain(ForcastHour+1,:,:) = HRRR{'Total_precipitation_surface_0_Hour_Accumulation'}(1,:,:); %Surface precipitation [kg/m^2] elseif ForcastHour==1 rain(ForcastHour+1,:,:) = HRRR{'Total_precipitation_surface_1_Hour_Accumulation'}(1,:,:); %Surface precipitation [kg/m^2] else rain(ForcastHour+1,:,:) = HRRR{'Total_precipitation_surface_Mixed_intervals_Accumulation'}(2,:,:); %Surface precipitation [kg/m^2] end temperature(ForcastHour+1) = squeeze(nanmean(nanmean(HRRR{'Temperature_surface'}(:,:,:)- 273.15,2),3)); %Surface Temperature [C] end % Extract Temp disp('Loaded HRRR') %% IMPORT NCOM try nComDate=masterDate; % ncomeURL = ['http://nomads.ncep.noaa.gov:80/dods/ncom/ncom' datestr(nComDate,'YYYYmmDD') '/ncom_useast_']; % ncomeURL = ['https://www.ncei.noaa.gov/thredds-coastal/dodsC/us_east/us_east_20201218_to_current/20201220/coamps_ncom_useast_u_1_2020122000_00000000.nc']; % ncomeURL = ['https://www.ncei.noaa.gov/thredds-coastal/dodsC/us_east/us_east_20201218_to_current/' datestr(nComDate,'YYYYmmDD')... % '/coamps_ncom_useast_u_1_']; % mget(ncom_ftp,['grids/operational/NCOM/regional/GRIB2/ncom_useast_' datestr(nComDate,'YYYYmmDD') '00.grb2'],['D:\DUNEX_RT\Operation\NCOM\']); ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0025-0048.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0049-0072.tgz']; if exist(ncom_downloadPath) ~= 2 mkdir(['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0025-0048.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0000-0024.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0000-0024.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0049-0072.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0049-0072.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0073-0096.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0073-0096.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) end if exist(['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate-days(2),'YYYYmmDD')]) == 7 rmdir(['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate-days(2),'YYYYmmDD')], 's') end ncom_filePath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\coamps_ncom_useast_u_1_' datestr(nComDate,'YYYYmmDD') '00_00']; % NCOM.Lat = ncread([ncomeURL datestr(nComDate,'YYYYmmDD')],'lat',[331],[240]); % NCOM.Lat = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00000000.nc'],'lat',[331],[240]); NCOM.Lat = ncread([ncom_filePath '48' '0000.nc'],'lat',[331],[240]); NCOM.Lon = ncread([ncom_filePath '48' '0000.nc'],'lon',91,180); % NCOM.Lat = ncom_grib{'lat',[331],[240]}; % NCOM.Lon = ncom_grib{'lon',91,180}; catch try if hour(masterTime) ~= 18 nComDate=masterDate-days(1); else nComDate=masterDate; end % ncomeURL = ['http://nomads.ncep.noaa.gov:80/dods/ncom/ncom' datestr(nComDate,'YYYYmmDD') '/ncom_useast_']; % ncomeURL = ['https://www.ncei.noaa.gov/thredds-coastal/dodsC/us_east/us_east_20201218_to_current/' datestr(nComDate,'YYYYmmDD')... % '/coamps_ncom_useast_u_1_']; % mget(ncom_ftp,['grids/operational/NCOM/regional/GRIB2/ncom_useast_' datestr(nComDate,'YYYYmmDD') '00.grb2'],['D:\DUNEX_RT\Operation\NCOM\']); % ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\grids\operational\NCOM\regional\GRIB2\ncom_useast_' datestr(nComDate,'YYYYmmDD') '00.grb2']; % ncom_grib = ncgeodataset(ncom_downloadPath); ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0049-0072.tgz']; if exist(ncom_downloadPath) ~= 2 ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0025-0048.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '00.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0000-0024.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0000-0024.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0049-0072.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0049-0072.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) ncomURL = ['https://nomads.ncep.noaa.gov/pub/data/nccf/com/ncom/prod/ncom.' datestr(nComDate,'YYYYmmDD') '/' 'useast_u_ocn_ncout_grid1_'... datestr(nComDate,'YYYYmmDD') '00_t0073-0096.tgz']; ncom_downloadPath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\ncom_useast_' datestr(nComDate,'YYYYmmDD') '0073-0096.tgz']; websave(ncom_downloadPath,ncomURL,options) untar(ncom_downloadPath,['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD')]) end if exist(['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate-days(2),'YYYYmmDD')]) == 7 rmdir(['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate-days(2),'YYYYmmDD')], 's') end ncom_filePath = ['D:\DUNEX_RT\Operation\NCOM\' datestr(masterDate,'YYYYmmDD') '\coamps_ncom_useast_u_1_' datestr(nComDate,'YYYYmmDD') '00_00']; % NCOM.Lat = ncread([ncomeURL datestr(nComDate,'YYYYmmDD')],'lat',[331],[240]); % NCOM.Lat = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00000000.nc'],'lat',[331],[240]); NCOM.Lat = ncread([ncom_filePath '48' '0000.nc'],'lat',[331],[240]); NCOM.Lon = ncread([ncom_filePath '48' '0000.nc'],'lon',91,180); % NCOM.Lat = ncom_grib{'lat',[331],[240]}; % NCOM.Lon = ncom_grib{'lon',91,180}; catch load(['ModelOut_03-Mar-2020_18Z'],'NCOM'); fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'%s : %s\n',datestr(masterTime),'NCOM Fallback'); sendmail('alexander.rey@queensu.ca',[datestr(masterTime) ': NCOM Fallback']) ; % close file fclose(fid) end end if FIRST_RUN == 1 NCOM.depth = ncread('D:\Alexander\NCOM\2019090500_t000.nc','depth'); end Noffset = hours(masterTime - nComDate); tStep = Noffset; tCount = 1; try for Ni = masterTime:hours(3):masterTime+hours(48) noData=1; while noData==1 try % NCOMstep = tStep./3+1; NCOMstep = 1; % NCOM.water_u(:,:,:,tCount) = ncread([ncomeURL datestr(masterDate,'YYYYmmDD')],... % 'water_u',[NCOMstep 1 331 91],[1 40 240 180],[1 1 1 1]); % NCOM.water_u(:,:,:,tCount) = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00' num2str(tStep) '0000.nc'],... % 'water_u',[91 331 1 NCOMstep],[180 240 inf 1],[1 1 1 1]); % NCOM.water_v(:,:,:,tCount) = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00' num2str(tStep) '0000.nc'],... % 'water_v',[91 331 1 NCOMstep],[180 240 inf 1],[1 1 1 1]); % NCOM.surf_el(:,:,tCount) = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00' num2str(tStep) '0000.nc'],... % 'surf_el',[91 331 NCOMstep],[180 240 1],[1 1 1]); % NCOM.salinity(:,:,:,tCount) = ncread([ncomeURL datestr(nComDate,'YYYYmmDD') '00_00' num2str(tStep) '0000.nc'],... % 'salinity',[91 331 1 NCOMstep],[180 240 inf 1],[1 1 1 1]); NCOM.water_u(:,:,:,tCount) = ncread([ncom_filePath num2str(tStep,'%02d') '0000.nc'],... 'water_u',[91 331 1 1],[180 240 inf 1],[1 1 1 1]); NCOM.water_v(:,:,:,tCount) = ncread([ncom_filePath num2str(tStep,'%02d') '0000.nc'],... 'water_v',[91 331 1 1],[180 240 inf 1],[1 1 1 1]); NCOM.surf_el(:,:,tCount) = ncread([ncom_filePath num2str(tStep,'%02d') '0000.nc'],... 'surf_el',[91 331 1],[180 240 1],[1 1 1]); NCOM.salinity(:,:,:,tCount) =ncread([ncom_filePath num2str(tStep,'%02d') '0000.nc'],... 'salinity',[91 331 1 1],[180 240 inf 1],[1 1 1 1]); if (squeeze(NCOM.water_v(100,100,1,end))==0|squeeze(NCOM.water_u(100,100,1,end))==0|squeeze(NCOM.surf_el(100,100,end))==0|squeeze(NCOM.salinity(100,100,1,end))==0)==1 noData=1; else noData=0; end catch noData=1; end disp(Ni) end NCOM.time(tCount) = Ni; tStep=tStep+3; tCount = tCount+1; end catch load(['ModelOut_03-Mar-2020_18Z'],'NCOM'); fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'%s : %s\n',datestr(masterTime),'NCOM Fallback'); sendmail('alexander.rey@queensu.ca',[datestr(masterTime) ': NCOM Fallback']) ; % close file fclose(fid) end %% NCOM Process NCOM.mag = vecmag(NCOM.water_u,NCOM.water_v); if FIRST_RUN == 1 depthWeight = [diff(NCOM.depth)' 0]; for Layer = 1:40 DAVfac(:,:,Layer,:) = ones(180,240,1,17).*depthWeight(Layer); end DAVtrue = DAVfac; N_depth = NCOM.depth; save('NCOMstuff.mat','DAVtrue','DAVfac','N_depth') else load('NCOMstuff.mat') NCOM.depth = N_depth; clear N_depth; end DAVtrue(isnan(NCOM.mag(:,:,1:40,:))==1) = 0; DAVfac(isnan(NCOM.mag(:,:,1:40,:))==1) = nan; DAVFac2 = sum(DAVtrue,3); clear DAVtrue NCOM.dav = nansum(DAVfac.*NCOM.mag(:,:,1:40,:),3)./DAVFac2; NCOM.davX = nansum(DAVfac.*NCOM.water_u(:,:,1:40,:),3)./DAVFac2; NCOM.davY = nansum(DAVfac.*NCOM.water_v(:,:,1:40,:),3)./DAVFac2; Import=1 catch err clear waterLevels %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); sendmail('alexander.rey@queensu.ca',['DUNEX-RT: ' datestr(masterTime) err.message]) ; % close file fclose(fid) disp('FAILED TO IMPORT FROM NOMADS') pause(600) end end load('shoreline.mat'); %% Format data for Delft3D %% Evap fileID=fopen('TemperatureRT.eva','w'); refTime=minutes(masterTime-masterDate); records=49; for i = 1 : records fprintf(fileID,'%d. 0. 0. %2.2f\n',refTime,temperature(i)); refTime = refTime + 60;% 1 hour time steps for temperature end fclose(fileID); %% NCOM ESTOFS % Currents from NCOM idxCount=1; for i = 2:10:length(flowGrid.data.Y)-1 % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(1081,i),flowGrid.data.Y(1081,i),'18 S'); % [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(2161,i),flowGrid.data.Y(2161,i),'18 S'); [idxNCOM(idxCount,1)] = NearestValue(gridDeg(idxCount,1),NCOM.Lat); %Lat [idxNCOM(idxCount,2)] = NearestValue(gridDeg(idxCount,2),wrapTo180(NCOM.Lon)); %Lon crIDX(idxCount,:) = [1081,i]; % crIDX(idxCount,:) = [2161,i]; idxCount = idxCount + 1; end crBoundCount(1) = 0; crBoundCount(2) = idxCount -1; for i = 750:11:1080 % Every 5 km % for i = round(linspace(1488,2161,14)) % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,1321),flowGrid.data.Y(i,1321),'18 S'); % [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,2641),flowGrid.data.Y(i,2641),'18 S'); [idxNCOM(idxCount,1)] = NearestValue(gridDeg(idxCount,1),NCOM.Lat); %Lat [idxNCOM(idxCount,2)] = NearestValue(gridDeg(idxCount,2),wrapTo180(NCOM.Lon)); %Lon crIDX(idxCount,:) = [i,1320]; % crIDX(idxCount,:) = [i,2641]; idxCount = idxCount + 1; end crBoundCount(3) = idxCount -1; for i = 475:5:1080 % Every 5 km % for i = round(linspace(910,2161,26)) % Every 5 km [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,1),flowGrid.data.Y(i,1),'18 S'); % [gridDeg(idxCount,1),gridDeg(idxCount,2)] = utm2deg(flowGrid.data.X(i,1),flowGrid.data.Y(i,1),'18 S'); [idxNCOM(idxCount,1)] = NearestValue(gridDeg(idxCount,1),NCOM.Lat); %Lat [idxNCOM(idxCount,2)] = NearestValue(gridDeg(idxCount,2),wrapTo180(NCOM.Lon)); %Lon crIDX(idxCount,:) = [i,1]; % crIDX(idxCount,:) = [i,1]; idxCount = idxCount + 1; end crBoundCount(4) = idxCount -1; clear idxCount %% Interpolate Water Level % for tStep = 1:length(tideOutN) % wlO(tStep,1:crBoundCount(2)) = linspace(tideOutS(tStep),tideOutN(tStep),crBoundCount(2)); % wlO(tStep,crBoundCount(2)+1:crBoundCount(3)) = linspace(tideOutN(tStep),tideOutN(tStep),crBoundCount(3)-crBoundCount(2)); % wlO(tStep,crBoundCount(3)+1:crBoundCount(4)) = linspace(tideOutS(tStep),tideOutS(tStep),crBoundCount(4)-crBoundCount(3)); % end vDatOrder = [crBoundCount(3)+1:1:crBoundCount(4) ... crBoundCount(1)+1:1:crBoundCount(2) ... crBoundCount(3):-1:crBoundCount(2)+1]; crBoundCountOld = [0 27 34 46]; vDatOrderOld = [crBoundCountOld(3)+1:1:crBoundCountOld(4) ... crBoundCountOld(1)+1:1:crBoundCountOld(2) ... crBoundCountOld(3):-1:crBoundCountOld(2)+1]; vDatNavD = LMSL_RT(:,3); vDatNavD(vDatNavD==-999999)=nan; % interp1(vDatNavD(vDatOrder),1:46) vDatNavDInter(vDatOrder) = naninterp(interp1(... linspace(1,length(vDatOrder),length(vDatOrderOld)),... vDatNavD(vDatOrderOld),1:length(vDatOrder))); for i = 1:length(idxNCOM) wlO(:,i) = interp1(masterTime:hours(1):masterTime+hours(48),waterLevels(:,i)+0,masterTime:minutes(10):masterTime+hours(48),'pchip'); end %% Match to grid flowBed = load('Dec6_100Bed.mat'); clear wlN mag DM dirGrid currents RN_1 currents_2 currents_40 currDir currDir40 idxCount=1; for i = 1:length(idxNCOM) currX = squeeze(NCOM.davX(idxNCOM(idxCount,2),idxNCOM(idxCount,1),1,:)); currY = squeeze(NCOM.davY(idxNCOM(idxCount,2),idxNCOM(idxCount,1),1,:)); currX40 = squeeze(NCOM.water_u(idxNCOM(idxCount,2),idxNCOM(idxCount,1),:,:)); currY40 = squeeze(NCOM.water_v(idxNCOM(idxCount,2),idxNCOM(idxCount,1),:,:)); currDir(i,:) = wrapTo360(atan2d(-currY,currX)+90); currDir40(i,:,:) = wrapTo360(atan2d(-currY40,currX40)+90); xGridDir(i,:) = ([flowGrid.data.X(crIDX(idxCount,1)-2,crIDX(idxCount,2)-0) flowGrid.data.X(crIDX(idxCount,1)-1,crIDX(idxCount,2)-0)]); yGridDir(i,:) = ([flowGrid.data.Y(crIDX(idxCount,1)-2,crIDX(idxCount,2)-0) flowGrid.data.Y(crIDX(idxCount,1)-1,crIDX(idxCount,2)-0)]); wlN(:,idxCount) = squeeze(NCOM.surf_el(idxNCOM(idxCount,2),idxNCOM(idxCount,1),:))+vDatNavDInter(i); mag(:,idxCount) = vecmag(currX,currY); % if idxCount==1 % DM(idxCount) = -squeeze(flowBed.data.Val(crIDX(idxCount+1,1)-1,crIDX(idxCount+1,2))); % else DM(idxCount) = -squeeze(flowBed.data.Val(crIDX(idxCount,1)-1,crIDX(idxCount,2))); % end if i>crBoundCount(2) && i<=crBoundCount(3) dirGrid(i) = wrapTo360(atan2d(-diff(yGridDir(i,:)),diff(xGridDir(i,:)))+90); currents(:,idxCount) = sind(dirGrid(i)-currDir(i,:))'.*vecmag(currX,currY); RN_1(:,idxCount) = currents(:,idxCount) - wlN(:,idxCount).*sqrt(9.81./DM(idxCount)); currents_2(:,idxCount) = currY; for j=1:40 currents_40(:,j,idxCount) = squeeze(sind(dirGrid(i)-squeeze(currDir40(i,j,:))).*vecmag(currX40(j,:),currY40(j,:))'); end elseif i>crBoundCount(3) dirGrid(i) = wrapTo360(atan2d(-diff(yGridDir(i,:)),diff(xGridDir(i,:)))+90); currents(:,idxCount) = sind(dirGrid(i)-currDir(i,:))'.*vecmag(currX,currY); RN_1(:,idxCount) = currents(:,idxCount) + wlN(:,idxCount).*sqrt(9.81./DM(idxCount)); currents_2(:,idxCount) = currY; for j=1:40 currents_40(:,j,idxCount) = squeeze(sind(dirGrid(i)-squeeze(currDir40(i,j,:))).*vecmag(currX40(j,:),currY40(j,:))'); end else dirGrid(i) = wrapTo360(atan2d(-diff(yGridDir(i,:)),diff(xGridDir(i,:)))); currents(:,idxCount) = -sind(dirGrid(i)-currDir(i,:))'.*vecmag(currX,currY); % currents(:,idxCount) = sind(dirGrid(i)-0)'.*vecmag(currY); RN_1(:,idxCount) = -currents(:,idxCount) - wlN(:,idxCount).*sqrt(9.81./DM(idxCount)); currents_2(:,idxCount) = currX; for j=1:40 currents_40(:,j,idxCount) = squeeze(-sind(dirGrid(i)-squeeze(currDir40(i,j,:))).*vecmag(currX40(j,:),currY40(j,:))'); end end % disp(idxCount) idxCount = idxCount + 1; end % fprintf(fileID,[boundryNames{Boundry} ' N T 750 1322 1081 1322 0.0000000e+000\n']); % fprintf(fileID,[boundryNames{Boundry} ' N T 475 1 1081 1 0.0000000e+000\n']); clear idxCount %% interpolate Currents clear currentsOut for i = 1:3 [xIN,yIN] = meshgrid([crBoundCount(i)+1:crBoundCount(i+1)],... datenum(NCOM.time)); [xOut,yOut] = meshgrid([crBoundCount(i)+1:crBoundCount(i+1)],... datenum(masterTime:minutes(10):masterTime+hours(48))); currentsOut(:,crBoundCount(i)+1:crBoundCount(i+1)) = ... interp2(xIN,yIN,... currents(:,crBoundCount(i)+1:crBoundCount(i+1)),... xOut,yOut); currents2Out(:,crBoundCount(i)+1:crBoundCount(i+1)) = ... interp2(xIN,yIN,... currents_2(:,crBoundCount(i)+1:crBoundCount(i+1)),... xOut,yOut); wlNOut(:,crBoundCount(i)+1:crBoundCount(i+1)) = ... interp2(xIN,yIN,... wlN(:,crBoundCount(i)+1:crBoundCount(i+1)),... xOut,yOut); RNOut_1(:,crBoundCount(i)+1:crBoundCount(i+1)) = ... interp2(xIN,yIN,... RN_1(:,crBoundCount(i)+1:crBoundCount(i+1)),... xOut,yOut); % for j = 1:length(idxNCOM) % currents40Out(:,crBoundCount(i)+1:crBoundCount(i+1)) = ... % interp2(xIN,yIN,... % squeeze(currents_40(:,j,crBoundCount(i)+1:crBoundCount(i+1))),... % xOut,yOut); % end end idxCount=1; for i = 1:length(idxNCOM) if i>crBoundCount(2) && i<=crBoundCount(3) RNOut_2(:,i) = 1.0.*currentsOut(:,idxCount) - wlO(:,idxCount).*sqrt(9.81./DM(idxCount)); % RNOut_2(:,i) = 1.0.*currentsOut(:,idxCount) - 0.*sqrt(9.81./DM(idxCount)); elseif i>crBoundCount(3) if i<230 RNOut_2(:,i) = 1.0.*currentsOut(:,idxCount) + wlO(:,idxCount).*sqrt(9.81./DM(idxCount)); % RNOut_2(:,i) = 1.0.*currentsOut(:,idxCount) + 1.*sqrt(9.81./DM(idxCount)); else RNOut_2(:,i) = 0.0.*currentsOut(:,idxCount) + wlO(:,idxCount).*sqrt(9.81./DM(idxCount)); % RNOut_2(:,i) = 1.0.*currentsOut(:,idxCount) + 0.*sqrt(9.81./DM(idxCount)); end else RNOut_2(:,i) = 0.0.*currentsOut(:,idxCount) - wlO(:,idxCount).*sqrt(9.81./DM(idxCount)); % RNOut_2(:,i) = -1.0.*currentsOut(:,idxCount) - 0.*sqrt(9.81./DM(idxCount)); end idxCount = idxCount+1; end %% R Boundry Files records=size(RNOut_2,1); for i = 1:crBoundCount(4) boundryNames(i) = {['NCOM' num2str(i)]}; end % boundryTypes(1) = {'water elevation (z)'}; boundryTypes(1:crBoundCount(4)) = {'riemann (r)'}; boundryUnits(1:crBoundCount(4)) = {'[m/s]'}; fileID=fopen('NCOM_R2.bct','w'); for Boundry = [2:length(boundryNames)] refTime=minutes(masterTime-masterDate); if Boundry==1 elseif ismember(Boundry-1,crBoundCount)==1 continue end header=[... 'table-name ''Boundary Section : %d''\n'... 'contents ''Uniform ''\n'... 'location ''' boundryNames{Boundry} ' ''\n'... 'time-function ''non-equidistant''\n'... 'reference-time %d\n'... 'time-unit ''minutes''\n'... 'interpolation ''linear''\n'... 'parameter ''time '' unit ''[min]''\n'... 'parameter ''' boundryTypes{Boundry} ' end A'' unit ''' boundryUnits{Boundry} '''\n'... 'parameter ''' boundryTypes{Boundry} ' end B'' unit ''' boundryUnits{Boundry} '''\n'... 'records-in-table %d\n'... ]; fprintf(fileID,header,Boundry,str2num(datestr(masterDate,'yyyymmdd')),records); for line = 1:records fprintf(fileID,'%d %1.4f %1.4f\n',refTime,RNOut_2(line,Boundry-1),RNOut_2(line,Boundry)); refTime=refTime+10; end end fclose(fileID); %% Boundry definition file-R fileID=fopen('NCOM_R.bnd','w'); crIDX2=crIDX; crIDX2(crBoundCount(2)+1:crBoundCount(3),2) = crIDX(crBoundCount(2)+1:crBoundCount(3),2)+2; crIDX2(crBoundCount(1)+1:crBoundCount(2),1) = 1082; for Boundry = [2:length(boundryNames)] if ismember(Boundry-1,crBoundCount)==1 continue else boundStart = crIDX2(Boundry-1,:); boundEnd = crIDX2(Boundry,:); fprintf(fileID,[boundryNames{Boundry} ' R T ' num2str(boundStart(1)) ' ' num2str(boundStart(2)) ' '... num2str(boundEnd(1)) ' ' num2str(boundEnd(2)) ' 0.0000000e+000 Uniform \n']); end end fclose(fileID); %% Waves records = size(waves,1); fileID=fopen('WW3.bcw','w'); for i = 1:3 boundryNames(i) = {['East' num2str(i)]}; end for Boundry = 1:3 refTime=minutes(masterTime-masterDate); header=[... 'location ''East%d''\n'... 'time-function ''non-equidistant''\n'... 'reference-time %d\n'... 'time-unit ''minutes''\n'... 'interpolation ''linear''\n'... 'parameter ''time '' unit ''[min]''\n'... ]; fprintf(fileID,header,Boundry,str2num(datestr(masterTime,'yyyymmdd'))); for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'parameter ''WaveHeight '' unit ''[m]''\n'); end for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'parameter ''Period '' unit ''[s]''\n'); end for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'parameter ''Direction '' unit ''[N^o]''\n'); end for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'parameter ''DirSpreading '' unit ''[-]''\n'); end for line = 1:records fprintf(fileID,'%d ',refTime); for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'%1.4f ',waves(line,Segment,1)); %Hs end fprintf(fileID,'\n '); for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'%1.4f ',waves(line,Segment,2)); %Period end fprintf(fileID,'\n '); for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'%1.4f ',waves(line,Segment,3)); %Direction end fprintf(fileID,'\n '); for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'%1.4f ',4); %Spread end fprintf(fileID,'\n'); % fprintf(fileID,'%.2f %1.4f %1.4f %1.4f %1.4f\n',refTime,... % waves(line,Boundry,1),waves(line,Boundry,2),waves(line,Boundry,3),4); refTime=refTime+180; end end fclose(fileID); %% Modify MDF file to change reference date fileID = fopen('rt_base.mdf'); cac = textscan( fileID, '%s', 'Delimiter','\n', 'CollectOutput',true ); fclose( fileID ); fileID = fopen('rt_run.mdf', 'w' ); refTime=minutes(masterTime-masterDate); for i = 1 : 15 fprintf( fileID, '%s\n', cac{1}{i} ); end fprintf( fileID, 'Itdate = #%04d-%02d-%02d#\n',... year(masterTime),month(masterTime),day(masterTime)); for i = 17 fprintf( fileID, '%s\n', cac{1}{i} ); end fprintf( fileID,['Tstart = %#.7e \n','Tstop = %#.7e \n'],refTime,refTime+2880); for i = 20:29 fprintf( fileID, '%s\n', cac{1}{i} ); end if FIRST_RUN == 0 restID = ['tri-rst.rt_run.' datestr(masterTime,'yyyymmdd.HH') '0000']; if exist(restID)==2 eval(['movefile ' restID ' tri-rst.6h_restart']) end fprintf( fileID,['Commnt = initial conditions from restart file\n'... 'Restid = #6h_restart#\n']); % delete tri-rst.rt* else % fprintf( fileID,['Commnt = initial conditions from map file\n'... % 'Restid = #Jan16_06#\n']); % fprintf( fileID,'Zeta0 = %#.7e \n',nanmean(nanmean(squeeze(wlO(1,:))))); fprintf( fileID,'Zeta0 = %#.7e \n',0); end for i = 31:53 fprintf( fileID, '%s\n', cac{1}{i} ); end % if FIRST_RUN==1 % fprintf( fileID, 'Vicouv = 1.0000000e+002 \n'); % else fprintf( fileID, '%s\n', cac{1}{54} ); % end for i = 55:64 fprintf( fileID, '%s\n', cac{1}{i} ); end if FIRST_RUN==1 fprintf( fileID, 'Tlfsmo = 0.0000000e+001 \n'); else fprintf( fileID, 'Tlfsmo = 0.0000000e+000 \n'); end for i = 66:94 fprintf( fileID, '%s\n', cac{1}{i} ); end fprintf( fileID,[... 'Flmap = %#.7e 60 %#.7e\n',... 'Flhis = %#.7e 10 %#.7e\n',... 'Flpp = %#.7e 60 %#.7e\n'],... refTime,refTime+2880,refTime,refTime+2880,refTime,refTime+2880); for i = 98:109 fprintf( fileID, '%s\n', cac{1}{i} ); end clear cac %% Modify MDW file to add times and change reference date fileID = fopen('rt_base.mdw'); cac = textscan( fileID, '%s', 'Delimiter','\n', 'CollectOutput',true ); fclose( fileID ); fileID = fopen('rt_run.mdw', 'w' ); refTime=minutes(masterTime-masterDate); for i = 1 : 7 fprintf( fileID, '%s\n', cac{1}{i} ); end fprintf( fileID, 'ReferenceDate = %04d-%02d-%02d\n',... year(masterTime),month(masterTime),day(masterTime)); for i = 9 : 71 fprintf( fileID, '%s\n', cac{1}{i} ); end % for i = 1 : records % fprintf( fileID,'[TimePoint] \n Time = %#.7e \n',(i-1).*180); % end bounOri{1}='East'; bounOri{2}='North'; bounOri{3}='South'; bounRot{1}='counter-clockwise'; bounRot{2}='counter-clockwise'; bounRot{3}='clockwise'; bounDef{1}='grid-coordinates'; bounDef{2}='orientation'; bounDef{3}='orientation'; for Boundry = 1 : 3 if Boundry ==1 fprintf(fileID,['[Boundary]\n'... 'Name = East%d\n'... 'Definition = %s\n'... 'StartCoordM = %d\n'... 'EndCoordM = %d\n'... 'StartCoordN = %d\n'... 'EndCoordN = %d\n'... 'SpectrumSpec = parametric\n'... 'SpShapeType = pierson-moskowitz\n'... 'GaussSpread = 9.9999998e-003\n'... 'PeriodType = peak\n'... 'DirSpreadType = power\n'... 'PeakEnhanceFac = 3.3000000e+000\n'... ],Boundry,bounDef{Boundry},432,432,2,528); else fprintf(fileID,['[Boundary]\n'... 'Name = East%d\n'... 'Definition = %s\n'... 'Orientation = %s\n'... 'SpectrumSpec = parametric\n'... 'SpShapeType = pierson-moskowitz\n'... 'GaussSpread = 9.9999998e-003\n'... 'PeriodType = peak\n'... 'DirSpreadType = power\n'... 'PeakEnhanceFac = 3.3000000e+000\n'... 'DistanceDir = %s\n'... ],Boundry,bounDef{Boundry},bounOri{Boundry},bounRot{Boundry}); end for Segment = waveBoundCount(Boundry)+1:waveBoundCount(Boundry+1) fprintf(fileID,'CondSpecAtDist = %d\n',waveDistAlong(Segment)); end end clear cac fclose( fileID ); %% Met Files % Create new UTM grid of the HRRR Data [UTM1D(:,1),UTM1D(:,2)] = wgs2utm(reshape(windGridLAT,1,[]),reshape(windGridLON,1,[]),... 18,'N'); HRRR_UTM(:,:,1) = double(reshape(UTM1D(:,1),size(windGridLON,1),size(windGridLON,2))); HRRR_UTM(:,:,2) = double(reshape(UTM1D(:,2),size(windGridLON,1),size(windGridLON,2))); clear UTM1D G7LR = load('C7_1400_V2_C.mat'); G7bath = load('C7_1400_V2_D.mat'); % Remove land rainfall % if FIRST_RUN == 1 landmask=zeros(size(G7LR.data.X(1:end-1,1:end-1)',1),size(G7LR.data.X(1:end-1,1:end-1)',2)); % [HR_deg(:,1),HR_deg(:,2)] = utm2deg(reshape(G7LR.data.X(1:end-1,1:end-1)',1,[]),reshape(G7LR.data.Y(1:end-1,1:end-1)',1,[]),repmat('18 S',length(reshape(G7LR.data.X(1:end-1,1:end-1)',1,[])),1)); % for ShoreLevel = 1:length(shoreline) % landmask_Temp(:,:) = reshape(inpolygon(HR_deg(:,1),HR_deg(:,2),shoreline(ShoreLevel).Lat,shoreline(ShoreLevel).Lon),size(G7LR.data.X(1:end-1,1:end-1)',1),size(G7LR.data.X(1:end-1,1:end-1)',2)); % % landmask = landmask|landmask_Temp; % clear landmask_Temp % % [shoreTempX,shoreTempY,shoreTempCell] = deg2utm(shoreline(ShoreLevel).Lat,shoreline(ShoreLevel).Lon); % shoreUTM{ShoreLevel}(:,1) = shoreTempX(all((shoreTempCell==repmat('18 S',length(shoreTempCell),1))')); % shoreUTM{ShoreLevel}(:,2) = shoreTempY(all((shoreTempCell==repmat('18 S',length(shoreTempCell),1))')); % clear shoreTempX shoreTempY shoreTempCell % disp(ShoreLevel) % end % save('shorelineInfo.mat','landmask','shoreUTM'); % else % load('shorelineInfo.mat'); % end clear HR_deg ShoreLevel landmask(G7bath.data.Val'<0)=1; landmask=logical(landmask); if masterTime>=datetime(2019,09,05,00,00,00) runSteps = 49; else runSteps = 8; end % Zero out met array HRRR_INTER = zeros(4,runSteps,size(G7LR.data.X(1:end-1,1:end-1),2),size(G7LR.data.X(1:end-1,1:end-1),1)); % Interpolate against flowGrid for each time step for TS = 1:runSteps HRRR_INTER(1,TS,:,:) = griddata(HRRR_UTM(:,:,1),HRRR_UTM(:,:,2),... double(squeeze(windU(TS,:,:))),G7LR.data.X(1:end-1,1:end-1)',G7LR.data.Y(1:end-1,1:end-1)','natural'); HRRR_INTER(2,TS,:,:) = griddata(HRRR_UTM(:,:,1),HRRR_UTM(:,:,2),... double(squeeze(windV(TS,:,:))),G7LR.data.X(1:end-1,1:end-1)',G7LR.data.Y(1:end-1,1:end-1)','natural'); rainTemp = griddata(HRRR_UTM(:,:,1),HRRR_UTM(:,:,2),... double(squeeze(rain(TS,:,:))),G7LR.data.X(1:end-1,1:end-1)',G7LR.data.Y(1:end-1,1:end-1)','natural'); rainTemp(landmask)=rainTemp(landmask)*0; % 100% infiltration HRRR_INTER(3,TS,:,:) = rainTemp; % Convert to hours clear rainTemp HRRR_INTER(4,TS,:,:) = griddata(HRRR_UTM(:,:,1),HRRR_UTM(:,:,2),... double(squeeze(pressure(TS,:,:))),G7LR.data.X(1:end-1,1:end-1)',G7LR.data.Y(1:end-1,1:end-1)','natural'); end % Set nan to Delft3D zero value HRRR_INTER(isnan(HRRR_INTER)==1)=-999.000; % Create input files m = size(HRRR_INTER,3); n = size(HRRR_INTER,4); d3ddx = 5000; d3ddy = 5000; disp(m) d3d_input_uvpFieldsCL_FUN(masterTime,m,n,... squeeze(HRRR_INTER(4,:,:,:)),squeeze(HRRR_INTER(1,:,:,:)),squeeze(HRRR_INTER(2,:,:,:)),squeeze(HRRR_INTER(3,:,:,:)),1,'hrrr',runSteps) save(['ModelIn_6_HRRR' datestr(masterTime,'YYYY-mm-DD_HH') '.mat'],'windU','windV','pressure','rain','temperature','waves','waterLevels','NCOM','-v7.3') %% Run Delft3D FLOW/WAVE! % system('. /home/cluster/D7545/enviorment.sh' system('runcoast_flow2d3d_parallel_wave.bat') if exist('wavm-rt_run.dat')~=2 fid = fopen('errorFile.log','a+'); fprintf(fid,'Delft Batch File Fallback\n'); % close file fclose(fid) disp('Run Fallback') pause(60) delete com-* delete hot* delete rt_run.prt* delete tri-diag.* delete TMP_* delete trim-* delete wavm-* delete trih-* delete obs.loct00* delete WNDNOW delete swan.inp delete PRINT* delete hot* delete SWANOUT* delete Errfile* delete WAVE2FLOW* delete FLOW2WAVE* delete swn-diag.* system('runcoast_flow2d3d_parallel_wave.bat') end %% Move things pause(60) eval(['copyfile trih-rt_run.dat D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_histOut7.dat']) eval(['copyfile trih-rt_run.def D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_histOut7.def']) eval(['movefile ModelIn_6_HRRR' datestr(masterTime,'YYYY-mm-DD_HH') '.mat D:\DUNEX_RT\Archive\ModelIn_7' datestr(masterTime,'YYYY-mm-DD_HH') '.mat']) % eval(['copyfile tri-rst.rt* D:\Alexander\RealtimeHRRR\']) % eval(['copyfile hrrr.amu D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_hrrr7.amu']) % eval(['copyfile hrrr.amv D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_hrrr7.amv']) % eval(['copyfile hrrr.ampr D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_hrrr7.ampr']) % eval(['copyfile hrrr.amp D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_hrrr7.amp']) % eval(['copyfile trim-rt_run.dat D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_mapOut7.dat']) % eval(['copyfile trim-rt_run.def D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_mapOut7.def']) % eval(['copyfile wavm-rt_run.dat D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_waveOut7.dat']) % eval(['copyfile wavm-rt_run.def D:\DUNEX_RT\Archive\' datestr(masterTime,'YYYY-mm-DD_HH') '_waveOut7.def']) %% Clear things not needed for plotting clear HRRR_INTER flowGrid lonHRRR_Mesh windU windV rain pressure waveGrid delete(gcp('nocreate')) parpool(3); %% Import Model Results addpath(genpath('matlab/applications/delft3d_matlab'),'-begin') modelWater = qpread(qpfopen('trim-rt_run.dat'),1,'water level','griddata',0,0,0); flowGrid = load('Cone7W_100.mat'); waveGrid = load('Cone7W_250.mat'); flowBed = load('Dec6_100Bed.mat'); waveBed = load('Dec6_250Bed.mat'); %% Create GeoTIFF for water levels clear X Y Val geoDat geoMeshX geoMeshY R xWorldLimits yWorldLimits rasterSize % timeIDX = [1 4 7 13 25 37]; timeIDX = [1 7 13 25 37 49]; timeIDXNames = [1 4 7 13 25 37]; % For Geoserver yMinOffset = 75; yMaxOffset = 25; parfor Time = 1:6 % X{Time} = modelWater.X; % Y{Time} = modelWater.Y; X{Time} = flowGrid.data.X; Y{Time} = flowGrid.data.Y; modelPlot_1 = squeeze(modelWater.Val(timeIDX(Time),1:end-1,1:end-1)); xWorldLimits{Time} = [min(min(X{Time}(1:end,1:end))) max(max(X{Time}(1:end,1:end)))]; yWorldLimits{Time} = [min(min(Y{Time}(1:end,1:end))) max(max(Y{Time}(1:end,1:end)))]; % rasterSize = [(size(data.X,1)-2).*2 (size(data.X,2)-2).*2]; rasterSize{Time} = [length(xWorldLimits{Time}(1):100:xWorldLimits{Time}(2)) length(yWorldLimits{Time}(1):100:yWorldLimits{Time}(2))]; R{Time} = maprefpostings(xWorldLimits{Time},yWorldLimits{Time},[rasterSize{Time}(2) rasterSize{Time}(1)]) [geoMeshX{Time},geoMeshY{Time}] = meshgrid(R{Time}.XWorldLimits(1):100:R{Time}.XWorldLimits(2),... R{Time}.YWorldLimits(1):100:R{Time}.YWorldLimits(2)); modelMask = squeeze(flowBed.data.Val>1); modelPlot_1(modelMask)=nan; modelPlot_1(400:520,525:620)=nan; modelPlot_1(:,1:yMinOffset)=nan; modelPlot_1(:,size(modelMask,2)-yMaxOffset:size(modelMask,2))=nan; geoDat{Time} = -griddata(reshape(X{Time}(1:end-1,1:end-1),1,[]),... reshape(Y{Time}(1:end-1,1:end-1),1,[]),... reshape(modelPlot_1,1,[]),... geoMeshX{Time},geoMeshY{Time},'natural'); geoDat{Time}(isnan(geoDat{Time})==1) = -999; geotiffwrite(['WL_' num2str(timeIDXNames(Time)) '.tif'],geoDat{Time},... R{Time},'CoordRefSysCode',32618) disp(Time) % clear X Y Val geoDat geoMeshX geoMeshY end clear modelWater modelWaterDAV = qpread(qpfopen('trim-rt_run.dat'),1,'depth averaged velocity','griddata',0,0,0); %% Create GeoTIFF for DAVs clear X Y Val geoDat geoMeshX geoMeshY R xWorldLimits yWorldLimits rasterSize geoDat modelPlot_1 % timeIDX = [1 4 7 13 25 37]; timeIDX = [1 7 13 25 37 49]; if FIRST_RUN == 1 Times = 2:6; else Times = 1:6; end parfor Time = Times X{Time} = flowGrid.data.X; Y{Time} = flowGrid.data.Y; modelPlot_1 = sqrt(squeeze(modelWaterDAV.XComp(timeIDX(Time),1:end-1,1:end-1)).^2+... squeeze(modelWaterDAV.YComp(timeIDX(Time),1:end-1,1:end-1)).^2); xWorldLimits{Time} = [min(min(X{Time}(1:end,1:end))) max(max(X{Time}(1:end,1:end)))]; yWorldLimits{Time} = [min(min(Y{Time}(1:end,1:end))) max(max(Y{Time}(1:end,1:end)))]; % rasterSize = [(size(data.X,1)-2).*2 (size(data.X,2)-2).*2]; rasterSize{Time} = [length(xWorldLimits{Time}(1):100:xWorldLimits{Time}(2)) length(yWorldLimits{Time}(1):100:yWorldLimits{Time}(2))]; R{Time} = maprefpostings(xWorldLimits{Time},yWorldLimits{Time},[rasterSize{Time}(2) rasterSize{Time}(1)]) [geoMeshX{Time},geoMeshY{Time}] = meshgrid(R{Time}.XWorldLimits(1):100:R{Time}.XWorldLimits(2),... R{Time}.YWorldLimits(1):100:R{Time}.YWorldLimits(2)); modelPlot_1(modelPlot_1==0)=nan; modelMask = squeeze(flowBed.data.Val>1); modelPlot_1(modelMask)=nan; modelPlot_1(400:520,525:620)=nan; modelPlot_1(:,1:yMinOffset)=nan; modelPlot_1(:,size(modelMask,2)-yMaxOffset:size(modelMask,2))=nan; geoDat{Time} = -griddata(reshape(X{Time}(1:end-1,1:end-1),1,[]),... reshape(Y{Time}(1:end-1,1:end-1),1,[]),... reshape(modelPlot_1,1,[]),... geoMeshX{Time},geoMeshY{Time},'natural'); geoDat{Time}(isnan(geoDat{Time})==1) = -999; geotiffwrite(['DAV_' num2str(timeIDXNames(Time)) '.tif'],geoDat{Time},... R{Time},'CoordRefSysCode',32618) disp(Time) % clear X Y Val geoDat geoMeshX geoMeshY end %% Quiver for DAV clear X Y ValX ValY XXd YYd geoS XdatE YdatE Xdat Ydat Udat Vdat geoDat vecScale(4) = 100000; vecScale(3) = 50000; vecScale(2) = 2500; vecScale(1) = 1000; for Time = Times X{Time} = flowGrid.data.X(2:end,2:end); Y{Time} = flowGrid.data.Y(2:end,2:end); modelPlot_1 = squeeze(modelWaterDAV.XComp(timeIDX(Time),2:end,2:end)); modelPlot_2 = squeeze(modelWaterDAV.YComp(timeIDX(Time),2:end,2:end)); modelMask = squeeze(flowBed.data.Val>1); modelPlot_1(modelMask)=nan; modelPlot_1(400:520,525:620)=nan; modelPlot_2(modelMask)=nan; modelPlot_2(400:520,525:620)=nan; modelPlot_1(:,1:yMinOffset)=nan; modelPlot_1(:,size(modelMask,2)-yMaxOffset:size(modelMask,2))=nan; modelPlot_2(:,1:yMinOffset)=nan; modelPlot_2(:,size(modelMask,2)-yMaxOffset:size(modelMask,2))=nan; qSpace = [4 16 50 100] Count{Time}=1; for Detail = 1:4 q{Time} = quiver(X{Time}(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0),Y{Time}(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0),... squeeze(modelPlot_1(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0)),squeeze(modelPlot_2(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0)),'color','k'); Xdat{Time} = reshape(q{Time}.XData,1,[]); Ydat{Time} = reshape(q{Time}.YData,1,[]); Udat{Time} = reshape(q{Time}.UData,1,[]); Vdat{Time} = reshape(q{Time}.VData,1,[]); for i = 1:length(Xdat{Time}) if ((Udat{Time}(i))==0 && (Vdat{Time}(i))==0) ||... (isnan(Xdat{Time}(i))==1 || isnan(Ydat{Time}(i))==1) ||... ((isnan(Udat{Time}(i)))==1 && isnan(Vdat{Time}(i))==1) continue end geoS{Time}(Count{Time}).Geometry = 'Line'; geoS{Time}(Count{Time}).Detail = Detail; XdatE{Time} = Xdat{Time}(i)+Udat{Time}(i).*vecScale(Detail); YdatE{Time} = Ydat{Time}(i)+Vdat{Time}(i).*vecScale(Detail); [XXd{Time}(1),YYd{Time}(1)] = utm2deg(Xdat{Time}(i),Ydat{Time}(i),'18 S'); [XXd{Time}(2),YYd{Time}(2)] = utm2deg(XdatE{Time}',YdatE{Time}','18 S'); geoS{Time}(Count{Time}).BoundingBox = [min(XXd{Time}) min(YYd{Time});... max(XXd{Time}) max(YYd{Time})]; geoS{Time}(Count{Time}).Lat = [XXd{Time}(1) XXd{Time}(2)]; geoS{Time}(Count{Time}).Lon = [YYd{Time}(1) YYd{Time}(2)]; Count{Time}=Count{Time}+1; end close all Xdat{Time}=[]; Ydat{Time}=[]; Udat{Time}=[]; Vdat{Time}=[]; q{Time}=[]; end disp(Time) shapewrite(geoS{Time}(1:end-1),['DAV_' num2str(timeIDXNames(Time)) '_D.shp']) eval(['copyfile vector.prj DAV_' num2str(timeIDXNames(Time)) '_D.prj']) end clear modelWaterDAV %% Create GeoTIFF for HS modelWaves = qpread(qpfopen('wavm-rt_run.dat'),1,'hsig wave height','griddata',0,0,0); modelWavesDir = qpread(qpfopen('wavm-rt_run.dat'),1,'hsig wave vector (mean direction)','griddata',0,0,0); clear X Y Val geoDat geoMeshX geoMeshY R xWorldLimits yWorldLimits rasterSize GeoS % timeIDX = [1 4 7 13 25 37]; timeIDX = [1 7 13 25 37 49]; parfor Time = 1:6 X{Time} = waveGrid.data.X(1:end-1,1:end-1); Y{Time} = waveGrid.data.Y(1:end-1,1:end-1); modelPlot_1 = (squeeze(modelWaves.Val(timeIDX(Time),:,:))); xWorldLimits{Time} = [min(min(X{Time}(1:end,1:end))) max(max(X{Time}(1:end,1:end)))]; yWorldLimits{Time} = [min(min(Y{Time}(1:end,1:end))) max(max(Y{Time}(1:end,1:end)))]; % rasterSize = [(size(data.X,1)-2).*2 (size(data.X,2)-2).*2]; rasterSize{Time} = [length(xWorldLimits{Time}(1):250:xWorldLimits{Time}(2)) length(yWorldLimits{Time}(1):250:yWorldLimits{Time}(2))]; R{Time} = maprefpostings(xWorldLimits{Time},yWorldLimits{Time},[rasterSize{Time}(2) rasterSize{Time}(1)]) [geoMeshX{Time},geoMeshY{Time}] = meshgrid(R{Time}.XWorldLimits(1):250:R{Time}.XWorldLimits(2),... R{Time}.YWorldLimits(1):250:R{Time}.YWorldLimits(2)); modelPlot_1(modelPlot_1==0)=nan; modelMask = squeeze(waveBed.data.Val<-1); modelPlot_1(modelMask)=nan; modelPlot_1(155:205,210:265)=nan; geoDat{Time} = -griddata(reshape(X{Time}(1:end-0,1:end-0),1,[]),... reshape(Y{Time}(1:end-0,1:end-0),1,[]),... reshape(modelPlot_1,1,[]),... geoMeshX{Time},geoMeshY{Time},'natural'); geoDat{Time}(isnan(geoDat{Time})==1) = -999; geotiffwrite(['HS_' num2str(timeIDXNames(Time)) '.tif'],geoDat{Time},... R{Time},'CoordRefSysCode',32618) disp(Time) % clear X Y Val geoDat geoMeshX geoMeshY end %% Quiver for HS clear X Y ValX ValY XXd YYd geoS XdatE YdatE Xdat Ydat Udat Vdat geoDat vecScale(4) = 15000; vecScale(3) = 5000; vecScale(2) = 1000; vecScale(1) = 500; for Time = 1:6 X{Time} = waveGrid.data.X(1:end-1,1:end-1); Y{Time} = waveGrid.data.Y(1:end-1,1:end-1); modelPlot_1 = squeeze(modelWavesDir.XComp(timeIDX(Time),:,:)); modelPlot_2 = squeeze(modelWavesDir.YComp(timeIDX(Time),:,:)); modelMask = squeeze(waveBed.data.Val<-1); modelPlot_1(modelMask)=nan; modelPlot_1(155:205,210:265)=nan; modelPlot_2(modelMask)=nan; modelPlot_2(155:205,210:265)=nan; qSpace = [2 10 20 40] Count{Time}=1; for Detail = 1:4 q{Time} = quiver(X{Time}(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0),Y{Time}(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0),... squeeze(modelPlot_1(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0)),squeeze(modelPlot_2(1:qSpace(Detail):end-0,1:qSpace(Detail):end-0)),'color','k'); Xdat{Time} = reshape(q{Time}.XData,1,[]); Ydat{Time} = reshape(q{Time}.YData,1,[]); Udat{Time} = reshape(q{Time}.UData,1,[]); Vdat{Time} = reshape(q{Time}.VData,1,[]); for i = 1:length(Xdat{Time}) if (Udat{Time}(i))==0 && (Vdat{Time}(i))==0 continue elseif isnan(Xdat{Time}(i))==1 || isnan(Ydat{Time}(i))==1 continue elseif isnan(Udat{Time}(i))==1 && isnan(Vdat{Time}(i))==1 continue end geoS{Time}(Count{Time}).Geometry = 'Line'; geoS{Time}(Count{Time}).Detail = Detail; XdatE{Time} = Xdat{Time}(i)+Udat{Time}(i).*vecScale(Detail); YdatE{Time} = Ydat{Time}(i)+Vdat{Time}(i).*vecScale(Detail); [XXd{Time}(1),YYd{Time}(1)] = utm2deg(Xdat{Time}(i),Ydat{Time}(i),'18 S'); [XXd{Time}(2),YYd{Time}(2)] = utm2deg(XdatE{Time}',YdatE{Time}','18 S'); geoS{Time}(Count{Time}).BoundingBox = [min(XXd{Time}) min(YYd{Time});... max(XXd{Time}) max(YYd{Time})]; geoS{Time}(Count{Time}).Lat = [XXd{Time}(1) XXd{Time}(2)]; geoS{Time}(Count{Time}).Lon = [YYd{Time}(1) YYd{Time}(2)]; Count{Time}=Count{Time}+1; end close all end disp(Time) shapewrite(geoS{Time}(1:end-1),['HS_' num2str(timeIDXNames(Time)) '_D.shp']) eval(['copyfile vector.prj HS_' num2str(timeIDXNames(Time)) '_D.prj']) end clear modelWaves clear modelWavesDIR %% Create GeoTIFF for Wind modelWaterWind = qpread(qpfopen('trim-rt_run.dat'),1,'wind speed','griddata',0,0,0); clear X Y Val geoDat geoMeshX geoMeshY R xWorldLimits yWorldLimits rasterSize geoS ValX ValY % timeIDX = [1 4 7 13 25 37]; timeIDX = [1 7 13 25 37 49]; parfor Time = 1:6 X{Time} = flowGrid.data.X; Y{Time} = flowGrid.data.Y; Val{Time} = sqrt(squeeze(modelWaterWind.XComp(timeIDX(Time),:,:)).^2+... squeeze(modelWaterWind.YComp(timeIDX(Time),:,:)).^2); xWorldLimits{Time} = [min(min(X{Time}(1:end,1:end))) max(max(X{Time}(1:end,1:end)))]; yWorldLimits{Time} = [min(min(Y{Time}(1:end,1:end))) max(max(Y{Time}(1:end,1:end)))]; % rasterSize = [(size(data.X,1)-2).*2 (size(data.X,2)-2).*2]; rasterSize{Time} = [length(xWorldLimits{Time}(1):1000:xWorldLimits{Time}(2)) length(yWorldLimits{Time}(1):1000:yWorldLimits{Time}(2))]; R{Time} = maprefpostings(xWorldLimits{Time},yWorldLimits{Time},[rasterSize{Time}(2) rasterSize{Time}(1)]) [geoMeshX{Time},geoMeshY{Time}] = meshgrid(R{Time}.XWorldLimits(1):1000:R{Time}.XWorldLimits(2),... R{Time}.YWorldLimits(1):1000:R{Time}.YWorldLimits(2)); Val{Time}(Val{Time}==0)=nan; geoDat{Time} = -griddata(reshape(X{Time}(2:end-2,2:end-2),1,[]),... reshape(Y{Time}(2:end-2,2:end-2),1,[]),... reshape(Val{Time}(2:end-2,2:end-2),1,[]),... geoMeshX{Time},geoMeshY{Time},'natural'); geoDat{Time}(isnan(geoDat{Time})==1) = -999; geotiffwrite(['Uw_' num2str(timeIDXNames(Time)) '.tif'],geoDat{Time},... R{Time},'CoordRefSysCode',32618) disp(Time) % clear X Y Val geoDat geoMeshX geoMeshY end %% Quiver for Wind clear X Y ValX ValY XXd YYd geoS XdatE YdatE Xdat Ydat Udat Vdat geoDat vecScale(4) = 3000; vecScale(3) = 500; vecScale(2) = 100; vecScale(1) = 40; for Time = 1:6 X{Time} = flowGrid.data.X; Y{Time} = flowGrid.data.Y; ValX{Time} = squeeze(modelWaterWind.XComp(timeIDX(Time),:,:)); ValY{Time} = squeeze(modelWaterWind.YComp(timeIDX(Time),:,:)); qSpace = [5 25 50 100] Count{Time}=1; for Detail = 1:4 q{Time} = quiver(X{Time}(2:qSpace(Detail):end-0,2:qSpace(Detail):end-0),Y{Time}(2:qSpace(Detail):end-0,2:qSpace(Detail):end-0),... squeeze(ValX{Time}(2:qSpace(Detail):end-0,2:qSpace(Detail):end-0)),squeeze(ValY{Time}(2:qSpace(Detail):end-0,2:qSpace(Detail):end-0)),'color','k'); Xdat{Time} = reshape(q{Time}.XData,1,[]); Ydat{Time} = reshape(q{Time}.YData,1,[]); Udat{Time} = reshape(q{Time}.UData,1,[]); Vdat{Time} = reshape(q{Time}.VData,1,[]); for i = 1:length(Xdat{Time}) if (Udat{Time}(i))==0 && (Vdat{Time}(i))==0 continue elseif isnan(Xdat{Time}(i))==1 || isnan(Ydat{Time}(i))==1 continue end geoS{Time}(Count{Time}).Geometry = 'Line'; geoS{Time}(Count{Time}).Detail = Detail; XdatE{Time} = Xdat{Time}(i)+Udat{Time}(i).*vecScale(Detail); YdatE{Time} = Ydat{Time}(i)+Vdat{Time}(i).*vecScale(Detail); [XXd{Time}(1),YYd{Time}(1)] = utm2deg(Xdat{Time}(i),Ydat{Time}(i),'18 S'); [XXd{Time}(2),YYd{Time}(2)] = utm2deg(XdatE{Time}',YdatE{Time}','18 S'); geoS{Time}(Count{Time}).BoundingBox = [min(XXd{Time}) min(YYd{Time});... max(XXd{Time}) max(YYd{Time})]; geoS{Time}(Count{Time}).Lat = [XXd{Time}(1) XXd{Time}(2)]; geoS{Time}(Count{Time}).Lon = [YYd{Time}(1) YYd{Time}(2)]; Count{Time}=Count{Time}+1; end close all end disp(Time) shapewrite(geoS{Time}(1:end-1),['Uw_' num2str(timeIDXNames(Time)) '_D.shp']) eval(['copyfile vector.prj Uw_' num2str(timeIDXNames(Time)) '_D.prj']) end clear modelWaterWind %% Create GeoTIFF for Prep modelWaterPrep = qpread(qpfopen('trim-rt_run.dat'),1,'precipitation rate','griddata',0,0,0); clear X Y Val geoDat geoMeshX geoMeshY R xWorldLimits yWorldLimits rasterSize geoS % timeIDX = [1 4 7 13 25 37]; timeIDX = [1 7 13 25 37 49]; parfor Time = 1:6 X{Time} = flowGrid.data.X; Y{Time} = flowGrid.data.Y; Val{Time} = (squeeze(modelWaterPrep.Val(timeIDX(Time),:,:))); xWorldLimits{Time} = [min(min(X{Time}(1:end,1:end))) max(max(X{Time}(1:end,1:end)))]; yWorldLimits{Time} = [min(min(Y{Time}(1:end,1:end))) max(max(Y{Time}(1:end,1:end)))]; % rasterSize = [(size(data.X,1)-2).*2 (size(data.X,2)-2).*2]; rasterSize{Time} = [length(xWorldLimits{Time}(1):10000:xWorldLimits{Time}(2)) length(yWorldLimits{Time}(1):10000:yWorldLimits{Time}(2))]; R{Time} = maprefpostings(xWorldLimits{Time},yWorldLimits{Time},[rasterSize{Time}(2) rasterSize{Time}(1)]) [geoMeshX{Time},geoMeshY{Time}] = meshgrid(R{Time}.XWorldLimits(1):10000:R{Time}.XWorldLimits(2),... R{Time}.YWorldLimits(1):10000:R{Time}.YWorldLimits(2)); geoDat{Time} = -griddata(reshape(X{Time}(2:end-2,2:end-2),1,[]),... reshape(Y{Time}(2:end-2,2:end-2),1,[]),... reshape(Val{Time}(2:end-2,2:end-2),1,[]),... geoMeshX{Time},geoMeshY{Time},'natural'); geotiffwrite(['Prep_' num2str(timeIDXNames(Time)) '.tif'],geoDat{Time},... R{Time},'CoordRefSysCode',32618) disp(Time) % clear X Y Val geoDat geoMeshX geoMeshY end clear modelWaterPrep %% Export to GEOSERVER try copyfile *.tif \\geoserver.engineering.queensu.ca\TIFFS\ copyfile *.dbf \\geoserver.engineering.queensu.ca\TIFFS\ copyfile *.shx \\geoserver.engineering.queensu.ca\TIFFS\ copyfile *.shp \\geoserver.engineering.queensu.ca\TIFFS\ copyfile *.prj \\geoserver.engineering.queensu.ca\TIFFS\ catch end %% Import Model forecast % modelWaterHist = qpread(qpfopen('D:\DUNEX_RT\Archive\2022-01-31_12_histOut7.dat'),1,'water level','data',0,0); % modelCurHist = qpread(qpfopen('D:\DUNEX_RT\Archive\2022-01-31_12_histOut7.dat'),1,'depth averaged velocity','data',0,0); modelWaterHist = qpread(qpfopen('trih-rt_run.dat'),1,'water level','data',0,0); modelCurHist = qpread(qpfopen('trih-rt_run.dat'),1,'depth averaged velocity','data',0,0); %% Validation import ESTOFS %load('DUNEX_Nov20.mat') load('DUNEX_Sept7.mat') %hohonu pts clear ESTOFS lonESTOFS lonESTOFS wLIDX=[6 7 8 38]; wlGrid = [5000 -4000 0 -2000]; wlGridY = [0 0 2000 5000]; %7500 ESTOFStimeOffset = [0 12 24 48]; ESTOFSrunLength = [48 60 72 96]; for e = [1 4] try clear meshX meshY m_proj('lambert conformal conic','ori',[-95 25.0],'clo',-95,'par',[25 25],'ell','sphere'); ESTOFS = ncgeodataset(['D:\DUNEX_RT\Archive\ESTOFS\ESTOFS_' ... datestr(masterTime-hours(ESTOFStimeOffset(e)),'YYYY-mm-DD_HH') '_f' num2str(0,'%03d') '.grib']); [meshX,meshY] = meshgrid(ESTOFS{'x'}(:),ESTOFS{'y'}(:)); [lonESTOFS,latESTOFS] = m_xy2ll(meshX.*1000,meshY.*1000); clear meshX meshY ESTOFS_Val{e} = 1; catch ESTOFS_Val{e} = 0; end end clear waterLevelsESTOFSINTER waterLevelsESTOFS for e = [1 4] try for Stat = 1:4 if ESTOFS_Val{e} == 0 estofsWL(:,Stat,e) = zeros(49,1); else [wlDeg(2),wlDeg(1)] = utm2deg(pointsCS{wLIDX(Stat),2}+wlGrid(Stat),pointsCS{wLIDX(Stat),3}+wlGridY(Stat),'18 S'); [estofIDX] = NearestValue(wlDeg,lonESTOFS,latESTOFS); %Lat for i = 1:ESTOFSrunLength(e)+1 ESTOFS = ncgeodataset(['D:\DUNEX_RT\Archive\ESTOFS\ESTOFS_' ... datestr(masterTime-hours(ESTOFStimeOffset(e)),'YYYY-mm-DD_HH') '_f' num2str(i-1,'%03d') '.grib']); waterLevelsESTOFS{e}(i,Stat) = squeeze(ESTOFS{'Ocean_Surface_Elevation_Relative_to_Geoid_surface'}(1,estofIDX(1),estofIDX(2))); end waterLevelsESTOFSINTER{e}(:,Stat) = interp1(masterTime-hours(ESTOFStimeOffset(e)):minutes(60):masterTime+hours(48),... waterLevelsESTOFS{e}(:,Stat),masterTime-hours(ESTOFStimeOffset(e)):minutes(15):masterTime+hours(48),'spline'); end end catch waterLevelsESTOFSINTER{e}(:,Stat) = zeros(1,385); end end %% Validation import WL % Duck % Oregon Inlet % Hatteras % Beaufort clear stations statWL options = weboptions; options.Timeout = 30; stations = {8651370,8652587,8654467,8656483}; dateStartM = masterTime-hours(48); dateEndM = masterTime+hours(5); for Stat = 1:4 try url = ['https://tidesandcurrents.noaa.gov/api/datagetter?product=water_level&application=NOS.COOPS.TAC.WL&'... 'begin_date=' datestr(dateStartM,'yyyymmdd') '&end_date=' datestr(dateEndM,'yyyymmdd') '&datum=NAVD' '&station=' num2str(stations{Stat})... '&time_zone=GMT&units=metric&format=csv']; wlIN = webread(url,options); statWL(:,Stat) = interp1(wlIN.DateTime,wlIN.WaterLevel,dateStartM:minutes(15):dateEndM); catch err %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); sendmail('alexander.rey@queensu.ca',['Ext-DUNEX-RT: ' datestr(masterTime) err.message]) ; % close file fclose(fid) statWL(:,Stat) = 0; end clear wlIN end %% Validate Import Hohonu hohonuBase = 'https://dashboard.hohonu.io/api/stations/node-'; options = weboptions; options.Timeout = 90; hohonuStation(5:10) = [ 10015; %Duck, Dare County, NC 10020; %Southern Shores, NC 10011; %Collington Creek Inn Dock, Kill Devil Hills 10012; %Jennette's Pier, Nags Head 10009; %Hwy 64, Little Bridge 10010]; %Coastal Studies Institute, Wanchese, NC hohonuDatums(5:10) = [ 6.03; 6.41; 5.777; 25.742; 6.889; 8.3]*304.8; % In feet, convert to mm for Stat = 5:10 fname = ['D:\DUNEX_RT\Operation\Hohonu\' num2str(hohonuStation(Stat)) '.json']; try % websave(fname,... % [hohonuBase num2str(hohonuStation(Stat)) '/statistic/?cleaned=false&format=json&from='... % datestr(dateStartM,'yyyy-mm-dd') '+00%3A00&to=' datestr(dateEndM,'yyyy-mm-dd')... % '+23%3A59']); websave(fname,... [hohonuBase num2str(hohonuStation(Stat)) '/statistic/?datum=NAVD&from='... datestr(dateStartM,'yyyy-mm-dd') '%' datestr(dateStartM,'HHMM:SS') '&to='... datestr(dateEndM,'yyyy-mm-dd') '%' datestr(dateEndM,'HHMM:SS')... '&cleaned=false&format=json&station_type=Hohonu&tz=000000'], options); fid = fopen(fname); raw = fread(fid,inf); str = char(raw'); fclose(fid); hohonuIN = jsondecode(str); % Filter out data more than 1 standard deviation % hmean = mean((hohonuDatums(Stat) - hohonuIN.data{2}) * 0.001); % hstd = std((hohonuDatums(Stat) - hohonuIN.data{2}) * 0.001); % hohonuFilt = abs((hohonuDatums(Stat) - hohonuIN.data{2}) * 0.001)>(abs(hmean)+hstd*1.5); hmean = mean(hohonuIN.data{2} * 0.3048, 'omitnan'); hstd = std(hohonuIN.data{2} * 0.3048, 'omitnan'); % Standard deviation filter- greater than 1.5x the standard % deviation hohonuFilt1 = abs((hohonuIN.data{2} * 0.3048))>(abs(hmean)+hstd*1.5); % Sharp jump filter- if a jump is greater than 10x the average % jump hohonuFilt2 = [0;abs(diff(hohonuIN.data{2} * 0.3048))>... (mean(diff(hohonuIN.data{2} * 0.3048),'omitnan')*10)]; dateStartMtz = datetime(dateStartM,'TimeZone','UTC'); dateEndMtz = datetime(dateEndM,'TimeZone','UTC'); % statWL(:,Stat) = interp1(... % datetime(hohonuIN.data{1}(~hohonuFilt),'InputFormat','yyyy-MM-dd''T''HH:mm:SSZ','TimeZone','UTC'),... % (hohonuDatums(Stat) - hohonuIN.data{2}(~hohonuFilt)) * 0.001,dateStartMtz:minutes(15):dateEndMtz); statWL(:,Stat) = interp1(... datetime(hohonuIN.data{1}(~hohonuFilt1 & hohonuFilt2),'InputFormat','yyyy-MM-dd''T''HH:mm:SSZ','TimeZone','UTC'),... hohonuIN.data{2}(~hohonuFilt1 & hohonuFilt2) * 0.3048,dateStartMtz:minutes(15):dateEndMtz); catch err %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); sendmail('alexander.rey@queensu.ca',['Ext-DUNEX-RT: ' datestr(masterTime) err.message]) ; % close file fclose(fid) statWL(:,Stat) = 0; end clear fid raw str hohonuIN fname end %% Validation import Currents % Duck clear statCur for Stat = 1 % url = 'https://chlthredds.erdc.dren.mil/thredds/dodsC/frf/oceanography/currents/awac-11m/awac-11m.ncml'; % curTime = ncread(url,'time'); % curVal = ncread(url,'currentSpeed'); try if day(masterTime)<2 websave('statCNC.nc',['https://chlthredds.erdc.dren.mil/thredds/fileServer/frf/oceanography/currents/awac-11m/' datestr(masterTime-days(3),'YYYY') '/FRF-ocean_currents_awac-11m_' ... datestr(masterTime-days(3),'YYYYmm') '.nc'],options); curTime = ncread('statCNC.nc','time'); curVal = ncread('statCNC.nc','currentSpeed'); websave('statCNC.nc',['https://chlthredds.erdc.dren.mil/thredds/fileServer/frf/oceanography/currents/awac-11m/' datestr(masterTime,'YYYY') '/FRF-ocean_currents_awac-11m_' ... datestr(masterTime,'YYYYmm') '.nc'],options); curTime = vertcat(curTime,ncread('statCNC.nc','time')); curVal = vertcat(curVal,ncread('statCNC.nc','currentSpeed')); else websave('statCNC.nc',['https://chlthredds.erdc.dren.mil/thredds/fileServer/frf/oceanography/currents/awac-11m/' datestr(masterTime,'YYYY') '/FRF-ocean_currents_awac-11m_' ... datestr(masterTime,'YYYYmm') '.nc'],options); curTime = ncread('statCNC.nc','time'); curVal = ncread('statCNC.nc','currentSpeed'); end statCur(:) = interp1(datetime(curTime,'convertFrom','POSIX'),curVal,dateStartM:minutes(15):dateEndM); clear wlIN catch err %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); % sendmail('alexander.rey@queensu.ca',['Ext-DUNEX-RT: ' datestr(masterTime) err.message]) ; % close file fclose(fid) statCur(:) = zeros(length(dateStartM:minutes(15):dateEndM),1); end end %% Validation import Waves % Virginia Beach % Duck 26 % Nages Head % Oregon Inlet % Diamond Shoals clear stations stations = {44014,44100,44086,44095,41025}; dateStartM = masterTime-hours(48); dateEndM = masterTime+hours(5); clear statWave for Stat = 1:5 try if ismember(Stat,[1,5]) == 1 url = ['https://www.ndbc.noaa.gov/data/5day2/' num2str(stations{Stat}) '_5day.txt']; websave('NDBCdata.txt',url,options); opts = delimitedTextImportOptions("NumVariables", 39); % Specify range and delimiter opts.DataLines = [3, Inf]; opts.Delimiter = " "; % Specify column names and types opts.VariableNames = ["YY", "MM", "DD", "hh", "mm", "WDIR", "WSPD", "GST", "WVHT", "DPD", "APD", "MWD", "PRES", "ATMP", "WTMP", "DEWP", "VIS", "PTDY", "TIDE", "Var20", "Var21", "Var22", "Var23", "Var24", "Var25", "Var26", "Var27", "Var28", "Var29", "Var30", "Var31", "Var32", "Var33", "Var34", "Var35", "Var36", "Var37", "Var38", "Var39"]; opts.SelectedVariableNames = ["YY", "MM", "DD", "hh", "mm", "WDIR", "WSPD", "GST", "WVHT", "DPD", "APD", "MWD", "PRES", "ATMP", "WTMP", "DEWP", "VIS", "PTDY", "TIDE"]; opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "double", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string"]; opts = setvaropts(opts, [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "WhitespaceRule", "preserve"); opts = setvaropts(opts, 15, "TrimNonNumeric", true); opts = setvaropts(opts, 15, "ThousandsSeparator", ","); opts = setvaropts(opts, [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "EmptyFieldRule", "auto"); opts.ExtraColumnsRule = "ignore"; opts.EmptyLineRule = "read"; opts.ConsecutiveDelimitersRule = "join"; opts.LeadingDelimitersRule = "ignore"; else url = ['https://www.ndbc.noaa.gov/data/realtime2/' num2str(stations{Stat}) '.txt']; websave('NDBCdata.txt',url); opts = delimitedTextImportOptions("NumVariables", 52); % Specify range and delimiter opts.DataLines = [3, Inf]; opts.Delimiter = " "; % Specify column names and types opts.VariableNames = ["YY", "MM", "DD", "hh", "mm", "WDIR", "WSPD", "GST", "WVHT", "DPD", "APD", "MWD", "PRES", "ATMP", "WTMP", "DEWP", "VIS", "PTDY", "TIDE", "Var20", "Var21", "Var22", "Var23", "Var24", "Var25", "Var26", "Var27", "Var28", "Var29", "Var30", "Var31", "Var32", "Var33", "Var34", "Var35", "Var36", "Var37", "Var38", "Var39", "Var40", "Var41", "Var42", "Var43", "Var44", "Var45", "Var46", "Var47", "Var48", "Var49", "Var50", "Var51", "Var52"]; opts.SelectedVariableNames = ["YY", "MM", "DD", "hh", "mm", "WDIR", "WSPD", "GST", "WVHT", "DPD", "APD", "MWD", "PRES", "ATMP", "WTMP", "DEWP", "VIS", "PTDY", "TIDE"]; opts.VariableTypes = ["double", "double", "double", "double", "double", "categorical", "categorical", "categorical", "double", "double", "double", "double", "categorical", "categorical", "double", "double", "categorical", "categorical", "categorical", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string", "string"]; opts = setvaropts(opts, [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "WhitespaceRule", "preserve"); opts = setvaropts(opts, [9, 10, 11, 12, 15], "TrimNonNumeric", true); opts = setvaropts(opts, [9, 10, 11, 12, 15], "ThousandsSeparator", ","); opts = setvaropts(opts, [6, 7, 8, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "EmptyFieldRule", "auto"); opts.ExtraColumnsRule = "ignore"; opts.EmptyLineRule = "read"; opts.ConsecutiveDelimitersRule = "join"; opts.LeadingDelimitersRule = "ignore"; end % Import the data waveIN = readtable("NDBCdata.txt", opts); waveNAN = isnan(waveIN.WVHT)==0; % Hs statWave(:,1,Stat) = interp1(datetime(waveIN.YY(waveNAN),(waveIN.MM(waveNAN)),(waveIN.DD(waveNAN)),... (waveIN.hh(waveNAN)),(waveIN.mm(waveNAN)),zeros(length(waveIN.YY(waveNAN)),1)),... (waveIN.WVHT(waveNAN)),dateStartM:minutes(15):dateEndM); % DPD % statWave(:,2,Stat) = interp1(datetime(waveIN.YY(waveNAN),(waveIN.MM(waveNAN)),(waveIN.DD(waveNAN)),... % (waveIN.hh(waveNAN)),(waveIN.mm(waveNAN)),zeros(length(waveIN.YY(waveNAN)),1)),... % (waveIN.DPD(waveNAN)),dateStartM:minutes(10):dateEndM); % APD statWave(:,3,Stat) = interp1(datetime(waveIN.YY(waveNAN),(waveIN.MM(waveNAN)),(waveIN.DD(waveNAN)),... (waveIN.hh(waveNAN)),(waveIN.mm(waveNAN)),zeros(length(waveIN.YY(waveNAN)),1)),... (waveIN.APD(waveNAN)),dateStartM:minutes(15):dateEndM); %MWD statWave(:,4,Stat) = interp1(datetime(waveIN.YY(waveNAN),(waveIN.MM(waveNAN)),(waveIN.DD(waveNAN)),... (waveIN.hh(waveNAN)),(waveIN.mm(waveNAN)),zeros(length(waveIN.YY(waveNAN)),1)),... (waveIN.MWD(waveNAN)),dateStartM:minutes(15):dateEndM); clear waveIN opts catch err %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message %fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); %sendmail('alexander.rey@queensu.ca',['Ext-DUNEX-RT: ' datestr(masterTime) err.message]); % close file fclose(fid) statWave(:,:,Stat) = zeros(size(dateStartM:minutes(15):dateEndM,2),4,1); end end statWave(isnan(statWave))=0; %% Import Model Waves for i = 1:49 startRow = 8; formatSpec = '%13f%14f%14f%14f%14f%14f%14f%14f%14f%14f%14f%14f%f%[^\n\r]'; fileID = fopen(['Sept7.loct00000' num2str(i,'%02d') '.tab'],'r'); % This call is based on the structure of the file used to generate this % code. If an error occurs for a different file, try regenerating the code % from the Import Tool. dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'TextType', 'string', 'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n'); fclose(fileID); modelWaveIN= table(dataArray{1:end-1}, 'VariableNames', {'Xp','Yp','Depth','Hsig','Dir','RTpea','kTm01','Dspr','Ubot','XWindv','YWindv','XVel','YVel'}); modelWave(:,1,i) = modelWaveIN.Hsig; modelWave(:,3,i) = modelWaveIN.RTpea; modelWave(:,4,i) = modelWaveIN.Dir; clearvars filename startRow formatSpec fileID dataArray ans modelWaveIN; end %% Import Model WL modelWL = modelWaterHist.Val; modelCur = sqrt(modelCurHist.XComp.^2+modelCurHist.YComp.^2); for idx = 1:size(modelWL,2) modelWLInter(:,idx) = interp1(modelWaterHist.Time,modelWL(:,idx),datenum(masterTime:minutes(15):masterTime+hours(48))); end for idx = 1:size(modelCur,2) modelCurInter(:,idx) = sqrt(interp1(modelCurHist.Time,modelCurHist.XComp(:,idx),datenum(masterTime:minutes(15):masterTime+hours(48))).^2+... interp1(modelCurHist.Time,modelCurHist.YComp(:,idx),datenum(masterTime:minutes(15):masterTime+hours(48))).^2); end save(['ModelOut_' datestr(masterTime,'dd-mmm-yyyy_HH') 'Z.mat'],'modelWL','modelWave','statWL','statWave','modelCur','statCur','modelWLInter','modelCurInter','-v7.3'); %% Import Historic Model WL if masterTime>=datetime(2021,07,08) try H12 = load(['ModelOut_' datestr(masterTime-hours(12),'dd-mmm-yyyy_HH') 'Z.mat']); catch end try H24 = load(['ModelOut_' datestr(masterTime-hours(24),'dd-mmm-yyyy_HH') 'Z.mat']); catch end try H48 = load(['ModelOut_' datestr(masterTime-hours(48),'dd-mmm-yyyy_HH') 'Z.mat']); catch end end %% Save html for Currents googleDates = days(masterTime-hours(48)+minutes((0:384)*15)-datetime(1899,12,30,00,00,00)); % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1763350398',[2,1],googleDates') googleDatesCell(2:length(googleDates)+1) = num2cell(googleDates); googleDatesCell{1} = 'Time'; locLine = 1:5:67; locationsWave ={'FRF 11 m AWAC '}; % % for i = 1:433 % % for j = 1:100 % % modelDavDel(i,j)={''}; % % end % % end % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1763350398',[2,2],modelDavDel) davIDX=[17 161:172]; clear modelCurPlot curValLoc for Loc = 1:13 for Line=1:5 switch Line case 1 curValLoc{Line} = ['Forecast']; if exist('modelCur','var') ==0 modelCurPlot(1:385,locLine(Loc)+0) = num2cell(zeros(385,1)); continue end modelCurPlot(1:192,locLine(Loc)+0) = {''}; modelCurPlot(193:1:385,locLine(Loc)+0) = num2cell(modelCurInter(:,davIDX(Loc))); case 2 curValLoc{Line} = ['-12 Hour: ' datestr(masterTime-hours(12),'mm/dd HH') 'Z Run']; if exist('H12','var') ==0 modelCurPlot(1:385,locLine(Loc)+1) = num2cell(zeros(385,1)); continue end modelCurPlot(1:143,locLine(Loc)+1) = {''}; modelCurPlot(337:385,locLine(Loc)+1) = {''}; modelCurPlot(144:1:336,locLine(Loc)+1) = num2cell(H12.modelCurInter(:,davIDX(Loc))); case 3 curValLoc{Line} = ['-24 Hour: ' datestr(masterTime-hours(24),'mm/dd HH') 'Z Run']; if exist('H24','var') ==0 modelCurPlot(1:385,locLine(Loc)+2) = num2cell(zeros(385,1)); continue end modelCurPlot(1:96,locLine(Loc)+2) = {''}; modelCurPlot(290:385,locLine(Loc)+2) = {''}; modelCurPlot(97:1:289,locLine(Loc)+2) = num2cell(H24.modelCurInter(:,davIDX(Loc))); case 4 curValLoc{Line} = ['-48 Hour: ' datestr(masterTime-hours(48),'mm/dd HH') 'Z Run']; if exist('H48','var') ==0 modelCurPlot(1:385,locLine(Loc)+3) = num2cell(zeros(385,1)); continue end modelCurPlot(194:385,locLine(Loc)+3) = {''}; modelCurPlot(1:1:193,locLine(Loc)+3) = num2cell(H48.modelCurInter(:,davIDX(Loc))); case 5 curValLoc{Line} = ['Observed Velocity']; if Loc> 1 || isnan(statCur(1,Loc)) modelCurPlot(1:385,locLine(Loc)+4) = num2cell(zeros(385,1)); continue end modelCurPlot(214:385,locLine(Loc)+4) = {''}; modelCurPlot(1:213,locLine(Loc)+4) = num2cell(statCur); end end end % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1763350398',... % [1,locLine(Loc)],modelCurPlot) % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1763350398',... % [1,locLine(Loc)],curValLoc) curValLoc = repmat(curValLoc,1,Loc); mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1763350398',... [1,1],horzcat(googleDatesCell',vertcat(curValLoc(1:size(modelCurPlot,2)),modelCurPlot))) %% Save html for WL googleDates = days(masterTime-hours(48)+minutes((0:384)*15)-datetime(1899,12,30,00,00,00)); % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1102090436',[2,1],googleDates') googleDatesCell(2:length(googleDates)+1) = num2cell(googleDates); googleDatesCell{1} = 'Time'; clear wlValLoc % locLine = [2 7 12 17 22 27]; % locLine = [2 9 16 23 30 37]; % locLine = 1:7:114; locLine = 1:7:156; % Hohonu locations locationsWl ={'FRF Pier',... 'Oregon Inlet',... 'Hatteras',... 'Beaufort'}; % % for i = 1:433 % % for j = 1:121 % % modelWlDel(i,j)={''}; % % end % % end % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1102090436',[2,2],modelWlDel) wLIDX=[6 7 8 38 161:172 181:186]; clear modelWlPlot wlValLoc for Loc = 1:length(wLIDX) % modelwlPlot = cell(432,4); for Line=[1:5 6 9] switch Line case 1 wlValLoc{Line} = ['Forecast']; if exist('modelCur','var') ==0 modelwlPlot(1:385,locLine(Loc)+0) = num2cell(zeros(385,1)); continue end modelwlPlot(1:192,locLine(Loc)+0) = {''}; modelwlPlot(193:1:385,locLine(Loc)+0) = num2cell(modelWLInter(:,wLIDX(Loc))); case 2 wlValLoc{Line} = ['-12 Hour: ' datestr(masterTime-hours(12),'mm/dd HH') 'Z Run']; if exist('H12','var') ==0 modelwlPlot(1:385,locLine(Loc)+1) = num2cell(zeros(385,1)); continue end modelwlPlot(1:143,locLine(Loc)+1) = {''}; modelwlPlot(337:385,locLine(Loc)+1) = {''}; modelwlPlot(144:1:336,locLine(Loc)+1) = num2cell(H12.modelWLInter(:,wLIDX(Loc))); case 3 wlValLoc{Line} = ['-24 Hour: ' datestr(masterTime-hours(24),'mm/dd HH') 'Z Run']; if exist('H24','var') ==0 modelwlPlot(1:385,locLine(Loc)+2) = num2cell(zeros(385,1)); continue end modelwlPlot(1:96,locLine(Loc)+2) = {''}; modelwlPlot(290:385,locLine(Loc)+2) = {''}; modelwlPlot(97:1:289,locLine(Loc)+2) = num2cell(H24.modelWLInter(:,wLIDX(Loc))); case 4 wlValLoc{Line} = ['-48 Hour: ' datestr(masterTime-hours(48),'mm/dd HH') 'Z Run']; if exist('H48','var') ==0 modelwlPlot(1:385,locLine(Loc)+3) = num2cell(zeros(385,1)); continue end modelwlPlot(194:385,locLine(Loc)+3) = {''}; modelwlPlot(1:1:193,locLine(Loc)+3) = num2cell(H48.modelWLInter(:,wLIDX(Loc))); case 5 wlValLoc{Line} = ['Observed Water Level']; modelwlPlot(214:385,locLine(Loc)+4) = {''}; if Loc <5 if isnan(statWL(1,Loc)) modelwlPlot(1:385,locLine(Loc)+4) = num2cell(zeros(385,1)); else modelwlPlot(1:213,locLine(Loc)+4) = num2cell(statWL(:,Loc)); end elseif Loc>=17 % Hohonu starts at 17 if isnan(statWL(1,Loc-12)) %-12 to get to Hohonu IDX modelwlPlot(1:385,locLine(Loc)+4) = num2cell(zeros(385,1)); else modelwlPlot(1:213,locLine(Loc)+4) = num2cell(statWL(:,Loc-12)); end else modelwlPlot(1:385,locLine(Loc)+4) = num2cell(zeros(385,1)); end case 6 wlValLoc{Line} = ['ESTOFS Forecast']; % % if Loc>4 || ESTOFS_Val{1} == 0 modelwlPlot(1:385,locLine(Loc)+5) = num2cell(zeros(385,1)); % % continue % % end % % modelwlPlot(1:192,locLine(Loc)+5) = {''}; % % modelwlPlot(193:385,locLine(Loc)+5) = num2cell(waterLevelsESTOFSINTER{1}(:,Loc)); case 9 wlValLoc{7} = ['-48 Hour ESTOFS']; % if Loc>4 || ESTOFS_Val{4} == 0 modelwlPlot(1:385,locLine(Loc)+6) = num2cell(zeros(385,1)); % % continue % % end % % modelwlPlot(1:1:385,locLine(Loc)+6) = num2cell(waterLevelsESTOFSINTER{4}(:,Loc)); end end disp(Loc) end % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1102090436',... % [2,locLine(Loc)],modelwlPlot) % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1102090436',... % [1,locLine(Loc)],wlValLoc) wlValLoc = repmat(wlValLoc,1,Loc); mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','1102090436',... [1,1],horzcat(googleDatesCell',vertcat(wlValLoc(1:size(modelwlPlot,2)),modelwlPlot))) %% Save html for Waves googleDates = days(masterTime-hours(48)+minutes((0:384)*15)-datetime(1899,12,30,00,00,00)); googleDatesCell(2:length(googleDates)+1) = num2cell(googleDates); googleDatesCell{1} = 'Time'; % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','319734265',[2,1],googleDates') % locLine = [2 7 12 17 22 27]; locLine = 1:5:114; locationsWave ={'Virginia Beach',... 'FRF 26 m',... 'Nags Head',... 'Oregon Inlet',... 'Diamond Shoals'}; clear waveValLoc modelwavePlot for i = 1:385 for j = 1:85 modelwavePlot(i,j)={''}; end end % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','319734265',[2,2],modelWaveDel) waveIDX = [12 13 14 15 16 161:172]; for Loc = 1:length(waveIDX) % modelwavePlot = cell(432,5); for Line=1:5 switch Line case 1 waveValLoc{Line} = ['Forecast']; if exist('modelWave','var') ==0 modelwavePlot(1:385,locLine(Loc)+0) = num2cell(zeros(433,1)); continue end modelwavePlot(1:191,locLine(Loc)+0) = {''}; modelwavePlot(192,locLine(Loc)+0) = {0}; modelwavePlot(193:4:385,locLine(Loc)+0) = num2cell(modelWave(waveIDX(Loc),1,:)); case 2 waveValLoc{Line} = ['-12 Hour: ' datestr(masterTime-hours(12),'mm/dd HH') 'Z Run']; if exist('H12','var') ==0 || size(H12.modelWave,1)5 || isnan(statWave(1,1,Loc)) modelwavePlot(1:385,locLine(Loc)+4) = num2cell(zeros(385,1)); continue end modelwavePlot(215:385,locLine(Loc)+4) = {''}; modelwavePlot(214,locLine(Loc)+4) = {0}; modelwavePlot(1:1:213,locLine(Loc)+4) = num2cell(statWave(:,1,Loc)); end end % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','319734265',... % [2,locLine(Loc)],modelwavePlot) % % mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','319734265',... % [1,locLine(Loc)],waveValLoc) end waveValLoc = repmat(waveValLoc,1,Loc); mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','319734265',... [1,1],horzcat(googleDatesCell',vertcat(waveValLoc(1:size(modelwavePlot,2)),modelwavePlot))) %% Import and modify times % modelHour = [0 3 6 12 24 48]; modelHour = [0 6 12 24 36 48]; for i = 1:6 dateText(i) = {[datestr(masterTime+hours(modelHour(i)),'mmm dd, HH:MM') ' UTC (Hour '... num2str(modelHour(i),'%d') ')']}; end mat2sheets('1K6toMh7L8nL3rtoPLJxD1Ebfqaty0wkPJSUGXNAbhoU','0',[1,1],... dateText) catch err %open file fid = fopen('errorFile.log','a+'); % write the error to file % first line: message fprintf(fid,'Line %d on %s : %s\n',err.stack.line,datestr(masterTime),err.message); sendmail('alexander.rey@queensu.ca',['ALL-DUNEX-RT: ' datestr(masterTime) err.message]) ; % close file fclose(fid) end %% quit