## Wave transmission through a Breakwater # Author: AJMR # December 14, 2021 # %% Setup Project from mikeio import Dfs0, Dfs1 from mikeio.eum import ItemInfo, EUMUnit, EUMType import pandas as pd import pathlib as pl import numpy as np import geopandas as gp import math import matplotlib.pyplot as plt import contextily as ctx # %% Read Model Log pth = pl.Path("//srv-mad3.baird.com/", "Projects", "13632.101 South Shore Breakwater", "06_Models", "13632.101.W.zzAJMR.Rev0_ModelLog.xlsx") runLog = pd.read_excel(pth.as_posix(), "ModelLog") # %% Read in Point Sh breakwaterPTS = gp.read_file("//srv-mad3.baird.com/Projects/" "13632.101 South Shore Breakwater/08_CADD/Outgoing/" "20211211_Toe Extents (to Alexander)/" "20211211_Toe_Extents_NAD83_WISStatePlaneSZn_USFt_Lines_OffshoreClipSimple_10m_vertexUTM.shp") # %% Read in Breakwater crest breakCrest = pd.read_csv( '//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/08_CADD/Outgoing/20211214_Crest Points (to Alexander)/20211214_Crest_Points_m.csv', header=None, names=['x', 'y', 'z']) breakCrest_gdf = gp.GeoDataFrame(breakCrest, crs='EPSG:32154', geometry=gp.points_from_xy(breakCrest.x, breakCrest.y)) breakCrest_gdf.to_crs('EPSG:32616', inplace=True) breakwaterPTS_Crest = breakwaterPTS.sjoin_nearest(breakCrest_gdf) breakwaterPTS_Crest.rename(columns={'x': 'breakCrest_x', 'y': 'breakCrest_y', 'z': 'Crest'}, inplace=True) # %% Read Model Results modelPlot = [8] for i in modelPlot: dfsIN = Dfs0(pl.Path(runLog['Run Location'][i], runLog['Run Name'][i] + '.sw - Result Files', 'BreakPts.dfs0').as_posix()) dfsIN_read = dfsIN.read() MIKEds = dfsIN_read.to_dataframe() # %% Merge with dataframe breakwaterPTS_times = None for t in range(0, MIKEds.shape[0]): breakwaterPTS_merge = None breakwaterPTS_merge = breakwaterPTS_Crest for i in range(0, MIKEds.shape[1]): paramName = MIKEds.columns.values[i][MIKEds.columns.values[i].find('"', 5, -1) + 3:] if paramName not in breakwaterPTS_merge.columns: breakwaterPTS_merge[paramName] = np.full([breakwaterPTS_merge.shape[0], 1], np.nan) # MIKEds_dict[paramName] = [] # MIKEid_dict[paramName] = [] tmpFID = int(MIKEds.columns.values[i][1:MIKEds.columns.values[i].find('"', 1)]) tmpIND = int(MIKEds.columns.values[i][5:MIKEds.columns.values[i].find('"', 5)]) breakwaterPTS_merge.loc[((breakwaterPTS_merge.FID == tmpFID) & (breakwaterPTS_merge.vertex_ind == tmpIND)), paramName] = MIKEds.iloc[t, i] breakwaterPTS_merge['Time'] = MIKEds.index[t] breakwaterPTS_times = pd.concat([breakwaterPTS_times, breakwaterPTS_merge], ignore_index=True) breakwaterPTS_times.rename(columns={'index_right': 'index_right_old'}, inplace=True) # %% Conversion breakwaterPTS_times['transmitted'] = np.full([breakwaterPTS_times.shape[0], 1], np.nan) gamma = 1.2 transmit_paramA = 0.81 * gamma transmit_paramB = 0.45 * gamma - 0.3 * gamma * \ (breakwaterPTS_times['Crest'] - breakwaterPTS_times['Surface elevation']) / \ breakwaterPTS_times['Sign. Wave Height'] # Identify different overtopping regimes breakMask_A = (breakwaterPTS_times['Crest'] - breakwaterPTS_times['Surface elevation']) / \ breakwaterPTS_times['Sign. Wave Height'] >= 1.2 breakMask_B = (((breakwaterPTS_times['Crest'] - breakwaterPTS_times['Surface elevation']) / breakwaterPTS_times['Sign. Wave Height'] < 1.2) & (transmit_paramA < transmit_paramB)) breakMask_C = (((breakwaterPTS_times['Crest'] - breakwaterPTS_times['Surface elevation']) / breakwaterPTS_times['Sign. Wave Height'] < 1.2) & (transmit_paramA > transmit_paramB)) # breakMask_B = (breakwaterPTS_times['Crest']-breakwaterPTS_times['Surface elevation'])/ \ # breakwaterPTS_times['Sign. Wave Height']<=-1.2 # breakMask_C = (((breakwaterPTS_times['Crest']-breakwaterPTS_times['Surface elevation'])/ # breakwaterPTS_times['Sign. Wave Height']>=-1.2) & # ((breakwaterPTS_times['Crest']-breakwaterPTS_times['Surface elevation'])/ # breakwaterPTS_times['Sign. Wave Height']<1.2)) # breakwaterPTS_times['transmitted'][breakMask_A] = breakwaterPTS_times['Sign. Wave Height'][breakMask_A]* 0.1 # breakwaterPTS_times['transmitted'][breakMask_B] = breakwaterPTS_times['Sign. Wave Height'][breakMask_B]* 0.82 # breakwaterPTS_times['transmitted'][breakMask_C] = breakwaterPTS_times['Sign. Wave Height'][breakMask_C]* \ # (0.46-0.3*(breakwaterPTS_times['Crest'][breakMask_C] # -breakwaterPTS_times['Surface elevation'][breakMask_C])/ # breakwaterPTS_times['Sign. Wave Height'][breakMask_C]) # Updated approach breakwaterPTS_times['transmitted'][breakMask_A] = breakwaterPTS_times['Sign. Wave Height'][breakMask_A] * 0.09 * gamma breakwaterPTS_times['transmitted'][breakMask_B] = breakwaterPTS_times['Sign. Wave Height'][breakMask_B] *\ transmit_paramA breakwaterPTS_times['transmitted'][breakMask_C] = breakwaterPTS_times['Sign. Wave Height'][breakMask_C] * \ transmit_paramB[breakMask_C] # %% Merge with breakwater transformed waves breakwaterPTS_end = breakwaterPTS_times['Time'] == breakwaterPTS_times['Time'].max() # innerBound_gdf = innerBound_gdf.sjoin_nearest(breakwaterPTS_times.loc[breakwaterPTS_end,:]) # %% Read Inner Boundary Points North innerBoundNorth = pd.read_csv( '//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/InnerBound_North.txt', delimiter='\s+', header=None, names=['x', 'y']) innerBoundNorth.sort_values(by=['x'], inplace=True) innerBoundNorth_gdf = gp.GeoDataFrame(innerBoundNorth, crs='EPSG:32616', geometry=gp.points_from_xy(innerBoundNorth.x, innerBoundNorth.y)) innerBoundNorth_gdf = innerBoundNorth_gdf.sjoin_nearest(breakwaterPTS_times.loc[breakwaterPTS_end, :]) # %% Read Inner Boundary Points Mid innerBoundMid = pd.read_csv( '//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/InnerBound_Mid.txt', delimiter='\s+', header=None, names=['x', 'y']) innerBoundMid.sort_values(by=['x'], inplace=True) innerBoundMid_gdf = gp.GeoDataFrame(innerBoundMid, crs='EPSG:32616', geometry=gp.points_from_xy(innerBoundMid.x, innerBoundMid.y)) innerBoundMid_gdf = innerBoundMid_gdf.sjoin_nearest(breakwaterPTS_times.loc[breakwaterPTS_end, :]) # %% Read Inner Boundary Points North innerBoundSouth = pd.read_csv( '//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/InnerBound_South.txt', delimiter='\s+', header=None, names=['x', 'y']) innerBoundSouth.sort_values(by=['x'], inplace=True) innerBoundSouth_gdf = gp.GeoDataFrame(innerBoundSouth, crs='EPSG:32616', geometry=gp.points_from_xy(innerBoundSouth.x, innerBoundSouth.y)) innerBoundSouth_gdf = innerBoundSouth_gdf.sjoin_nearest(breakwaterPTS_times.loc[breakwaterPTS_end, :]) # %% Save as DFS1 boundDataNorth = pd.DataFrame( innerBoundNorth_gdf.loc[:, ['Time', 'transmitted', 'Peak Wave Period', 'Mean Wave Direction']]) boundDataNorth.set_index('Time', inplace=True) boundDataNorth.rename(columns={'transmitted': 'Significant wave height', 'Peak Wave Period': 'Peak wave period', 'Mean Wave Direction': 'Mean wave direction'}, inplace=True) dfsfilename = '//oak-spillway.baird.com/F/13632.101 South Shore Breakwater/SetupFiles/InnerBounds/' + \ runLog['Run Name'][modelPlot[0]] + 'ProdInnerNorth1.dfs1' items = [ItemInfo("Significant wave height", EUMType.Significant_wave_height, EUMUnit.meter), ItemInfo("Peak wave period", EUMType.Wave_period, EUMUnit.second), ItemInfo("Mean wave direction", EUMType.Mean_Wave_Direction, EUMUnit.degree), ItemInfo("Directional Standard Deviation, n", EUMType.Directional_Standard_Deviation, EUMUnit.degree)] dfs = Dfs1() dfs.write(filename=dfsfilename, data=[np.array((boundDataNorth['Significant wave height'], boundDataNorth['Significant wave height'])), np.array((boundDataNorth['Peak wave period'], boundDataNorth['Peak wave period'])), np.array((boundDataNorth['Mean wave direction'], boundDataNorth['Mean wave direction'])), np.ones((2, boundDataNorth.shape[0])) * 23.28], start_time=breakwaterPTS_times['Time'].min(), dt=86400, datetimes=None, items=items, title=None) # %% Save as DFS1- Mid boundDataMid = pd.DataFrame( innerBoundMid_gdf.loc[:, ['Time', 'transmitted', 'Peak Wave Period', 'Mean Wave Direction']]) boundDataMid.set_index('Time', inplace=True) boundDataMid.rename(columns={'transmitted': 'Significant wave height', 'Peak Wave Period': 'Peak wave period', 'Mean Wave Direction': 'Mean wave direction'}, inplace=True) dfsfilename = '//oak-spillway.baird.com/F/13632.101 South Shore Breakwater/SetupFiles/InnerBounds/' + \ runLog['Run Name'][modelPlot[0]] + 'ProdInnerMid.dfs1' items = [ItemInfo("Significant wave height", EUMType.Significant_wave_height, EUMUnit.meter), ItemInfo("Peak wave period", EUMType.Wave_period, EUMUnit.second), ItemInfo("Mean wave direction", EUMType.Mean_Wave_Direction, EUMUnit.degree), ItemInfo("Directional Standard Deviation, n", EUMType.Directional_Standard_Deviation, EUMUnit.degree)] dfs = Dfs1() dfs.write(filename=dfsfilename, data=[np.array((boundDataMid['Significant wave height'], boundDataMid['Significant wave height'])), np.array((boundDataMid['Peak wave period'], boundDataMid['Peak wave period'])), np.array((boundDataMid['Mean wave direction'], boundDataMid['Mean wave direction'])), np.ones((2, boundDataMid.shape[0])) * 23.28], start_time=breakwaterPTS_times['Time'].min(), dt=86400, items=items) # %% Save as DFS1- South boundDataSouth = pd.DataFrame( innerBoundSouth_gdf.loc[:, ['Time', 'transmitted', 'Peak Wave Period', 'Mean Wave Direction']]) boundDataSouth.set_index('Time', inplace=True) boundDataSouth.rename(columns={'transmitted': 'Significant wave height', 'Peak Wave Period': 'Peak wave period', 'Mean Wave Direction': 'Mean wave direction'}, inplace=True) dfsfilename = '//oak-spillway.baird.com/F/13632.101 South Shore Breakwater/SetupFiles/InnerBounds/' + \ runLog['Run Name'][modelPlot[0]] + 'ProdInnerSouth.dfs1' items = [ItemInfo("Significant wave height", EUMType.Significant_wave_height, EUMUnit.meter), ItemInfo("Peak wave period", EUMType.Wave_period, EUMUnit.second), ItemInfo("Mean wave direction", EUMType.Mean_Wave_Direction, EUMUnit.degree), ItemInfo("Directional Standard Deviation, n", EUMType.Directional_Standard_Deviation, EUMUnit.degree)] dfs = Dfs1() dfs.write(filename=dfsfilename, data=[np.array((boundDataSouth['Significant wave height'], boundDataSouth['Significant wave height'])), np.array((boundDataSouth['Peak wave period'], boundDataSouth['Peak wave period'])), np.array((boundDataSouth['Mean wave direction'], boundDataSouth['Mean wave direction'])), np.ones((2, boundDataSouth.shape[0])) * 23.28], start_time=breakwaterPTS_times['Time'].min(), dt=86400, items=items) # %% Test Plot mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckemxgtk51fgp19nybfmdcb1e/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(9, 9), constrained_layout=True) breakwaterPTS_merge.plot(ax=axes, column='Sign. Wave Height', cmap='viridis') # breakwaterPTS_merge.plot(ax=axes, column='Crest', cmap='viridis', legend=True) innerBound_gdf.plot(ax=axes, column='transmitted', cmap='viridis') ctx.add_basemap(axes, source=mapbox, crs='EPSG:32616') plt.show()