## Plotting Mike21 SW results for SouthShore # Author: AJMR # December 22, 2021 # %% Setup Project from mikeio import Dfsu, Mesh, Dfs2, Dfs0, Dfs1 import pandas as pd import pathlib as pl import numpy as np import geopandas as gp import datetime as datetime import matplotlib as mpl import matplotlib.pyplot as plt import time import matplotlib.animation as animation import contextily as ctx import matplotlib.font_manager as fm # %% Read Model Log pth = pl.Path("//srv-ott3.baird.com/", "Projects", "13539.101 L'Ansecoy Bay, Mustique", "06_Models", "Model Log Mustique.xlsx") runLog = pd.read_excel(pth.as_posix(), "ModelLog") # %% Read Map Model Results modelPlot = [8, 10, 11, 12, 13, 14] modelPlot = [15, 16, 17] modelPlot = [18] dfs_list = [None] * (max(modelPlot) + 1) ds_list = [None] * (max(modelPlot) + 1) for m in modelPlot: dfsIN = Dfsu(pl.Path(runLog['Run Location'][m], 'fullDomain3D.dfsu').as_posix()) dfs_list[m] = dfsIN ds_list[m] = dfs_list[m].read() # %% Read Model Results at point modelPlot = [4, 10, 12, 13] dfs2d_list = [None] * (max(modelPlot) + 1) dfs3d_list = [None] * (max(modelPlot) + 1) z_list = [None] * (max(modelPlot) + 1) z_profile_list = [None] * (max(modelPlot) + 1) elm_list = [None] * (max(modelPlot) + 1) elm_df_list = [None] * (max(modelPlot) + 1) elm2d_list = [None] * (max(modelPlot) + 1) elm2d_df_list = [None] * (max(modelPlot) + 1) readPointsName = pd.read_csv("//srv-ott3.baird.com/Projects/13539.101 L'Ansecoy Bay, Mustique/03_Data/03_Field/01_September 2021 trip/Dataset locations_RevF.csv", delimiter=",") readPoints = pd.read_csv("//srv-ott3.baird.com/Projects/13539.101 L'Ansecoy Bay, Mustique/03_Data/03_Field/01_September 2021 trip/Dataset locations_RevF.csv", delimiter=",").iloc[0:, 2:-2].values for m in modelPlot: dfsIN = Dfsu(pl.Path(runLog['Run Location'][m], 'fullDomain2D.dfsu').as_posix()) dfs2d_list[m] = dfsIN # Read Map # ds_list[m] = dfs_list[m].read() # curU_list[m] = ds_list[m]["Depth averaged U velocity"] # curV_list[m] = ds_list[m]["Depth averaged V velocity"] # curElm_list[m] = dfs_list[m].element_coordinates # wl_list[m] = ds_list[m]["Surface elevation"] # z_list[m] = ds_list[m]["Z coordinate"] ## Read specific points in 2D # Find nearest elements elem_ids = dfs2d_list[m].find_nearest_elements(readPoints[:, 0], readPoints[:, 1]) # Read in data from nearest elements elm2d_list[m] = dfs2d_list[m].read(elements=elem_ids) # Convert to Pandas DataFrame elm2d_df_list[m] = [None] * readPoints.shape[0] for p in range(0, readPoints.shape[0]): elm2d_df_list[m][p] = elm2d_list[m].isel(idx=p).to_dataframe() ## Read specific points 3D # Setup MIKE object dfsIN = Dfsu(pl.Path(runLog['Run Location'][m], 'fullDomain3D.dfsu').as_posix()) dfs3d_list[m] = dfsIN # Find nearest elements elem_ids = dfs3d_list[m].find_nearest_profile_elements(readPoints[:, 0], readPoints[:, 1]) # Read from elements- flatten 2d element array (xy and z) to 1d for reading elm_list[m] = dfs3d_list[m].read(elements=elem_ids.flatten().astype(int)) elm_df_list[m] = [None] * readPoints.shape[0] z_profile_list[m] = [None] * readPoints.shape[0] # Convert to Pandas DataFrame # Loop through points, selecting corresponding depths for p in range(0, readPoints.shape[0]): z_profile_list[m][p] = dfs3d_list[m].element_coordinates[elem_ids[p, :].astype(int), 2] # Convert to Pandas and add zidx for z in range(0, z_profile_list[m][p].shape[0]): df_tmp = elm_list[m].isel(idx=p * 5 + z).to_dataframe() df_tmp['Z'] = z_profile_list[m][p][z] df_tmp['Z_IDX'] = z if z == 0: elm_df_list[m][p] = df_tmp else: elm_df_list[m][p] = elm_df_list[m][p].append(df_tmp) del df_tmp # %% Import RBR data rbr_path = "C:/Users/arey/files/Projects/Mustique/041279_20211203_1541Ruskin.xlsx" rbr_pd = pd.read_excel(rbr_path, sheet_name='Wave', parse_dates=True, header=1, index_col=0) rbr_pd['WL'] = rbr_pd['Depth'] - rbr_pd['Depth'].mean() - 0.2 # Correct time zone rbr_pd.index = rbr_pd.index + datetime.timedelta(hours=4) # %% Import Nortek Eco data eco_path_1 = "//srv-ott3/Projects/13539.101 L'Ansecoy Bay, Mustique/03_Data/03_Field/01_September 2021 trip/02_Nortek ECO/Eco61_20210910184606.csv" eco_path_2 = "//srv-ott3/Projects/13539.101 L'Ansecoy Bay, Mustique/03_Data/03_Field/01_September 2021 trip/02_Nortek ECO/Eco214_20210902120703.csv" eco1_pd = pd.read_csv(eco_path_1, sep=',', header=[28], index_col=0, parse_dates=False) eco2_pd = pd.read_csv(eco_path_2, sep=',', header=[28], index_col=0, parse_dates=False) # Drop first row eco1_pd.drop(eco1_pd.index[0], inplace=True) eco2_pd.drop(eco2_pd.index[0], inplace=True) eco1_pd.index = pd.to_datetime(eco1_pd.index, format='%m/%d/%Y %I:%M:%S %p') eco2_pd.index = pd.to_datetime(eco2_pd.index, format='%m/%d/%Y %I:%M:%S %p') # Set water level to zero eco1_pd['WL'] = eco1_pd['Depth'].astype(float) - eco1_pd['Depth'].astype(float).mean(skipna=True) + 0.2 eco2_pd['WL'] = eco2_pd['Depth'].astype(float) - eco2_pd['Depth'].astype(float).mean(skipna=True) + 0.2 # Correct time zone eco1_pd.index = eco1_pd.index + datetime.timedelta(hours=4) eco2_pd.index = eco2_pd.index + datetime.timedelta(hours=4) # %% Read in boundary conditions ds_wl = [] dfs1 = Dfs1("//oak-spillway.baird.com/D/13539.101 L'Ansecoy Bay, Mustique/MIKE3/02_Bounds/NCOM2_EastBound.dfs1") ds_wl.append(dfs1.read()) dfs1 = Dfs1("//oak-spillway.baird.com/D/13539.101 L'Ansecoy Bay, Mustique/MIKE3/02_Bounds/NCOM2_NorthBound.dfs1") ds_wl.append(dfs1.read()) dfs1 = Dfs1("//oak-spillway.baird.com/D/13539.101 L'Ansecoy Bay, Mustique/MIKE3/02_Bounds/NCOM2_SouthBound.dfs1") ds_wl.append(dfs1.read()) dfs1 = Dfs1("//oak-spillway.baird.com/D/13539.101 L'Ansecoy Bay, Mustique/MIKE3/02_Bounds/NCOM2_WestBound.dfs1") ds_wl.append(dfs1.read()) # %% Plot Water Level at a point fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 8), sharex=True) plotstart = '2021-10-01 00:00:00' plotend = '2021-10-15 00:00:00' # plotstart = '2021-10-05 00:00:00' # plotend = '2021-10-07 00:00:00' modelPlot = [13] for m in modelPlot: for sub, p in enumerate([5, 9, 6]): if p == 9: rbr_pd['WL'].plot(ax=axes[sub], color='k', label='Nearshore East Obervations') elif p == 5: eco1_pd['WL'].plot(ax=axes[sub], color='k', label='Offshore Obervations') elif p == 6: eco2_pd['WL'].plot(ax=axes[sub], color='k', label='Nearshore West Obervations') elm2d_df_list[m][p].plot(y='Surface elevation', ax=axes[sub], label='Model') axes[sub].legend(loc="upper left") axes[sub].set_xlim(pd.Timestamp(plotstart), pd.Timestamp(plotend)) axes[sub].set_ylim(-1.0, 1.0) axes[sub].set_ylabel('Water Level (m)') axes[sub].set_xlabel('Date') plt.show() fig.savefig('//srv-ott3.baird.com/Projects/13539.101 L\'Ansecoy Bay, Mustique/06_Models/01_MIKE3/00_Figures/' + '/wl_TS_RevB.png', bbox_inches='tight') # %% Velocity point U and V # Z_IDX = 4 # ecoVar1 = 'Upper speed U' # ecoVar2 = 'Upper speed V' # ecoVar3 = 'Upper speed' # ecoVar4 = 'Upper direction' # plotstart = '2021-09-14 00:00:00' # # plotend = '2021-09-16 00:00:00' # plotend = '2021-10-03 00:00:00' plotstart = '2021-10-01 00:00:00' # plotend = '2021-09-16 00:00:00' plotend = '2021-10-21 00:00:00' # plotstart = '2021-10-05 00:00:00' # plotend = '2021-10-07 00:00:00' Z_IDX = 2 ecoVar1 = 'Middle speed U' ecoVar2 = 'Middle speed V' ecoVar3 = 'Middle speed' ecoVar4 = 'Middle direction' # Z_IDX = 1 # ecoVar1 = 'Lower speed U' # ecoVar2 = 'Lower speed V' # ecoVar3 = 'Lower speed' # ecoVar4 = 'Lower direction' fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(8, 4), sharex=True) modelPlot = [13] for m in modelPlot: eco1_pd[ecoVar1] = eco1_pd[ecoVar3].astype(float) * \ np.sin(np.radians(eco1_pd[ecoVar4].astype(float).to_numpy())) eco1_pd[ecoVar1].astype(float).plot(ax=axes[0], color='k', label='Observations') elm_df_list[m][3].loc[elm_df_list[m][5]['Z_IDX'] == Z_IDX, :].plot( y='U velocity', ax=axes[0], label='Model') axes[0].set_ylim(-0.5, 0.5) axes[0].set_xlim(pd.Timestamp(plotstart), pd.Timestamp(plotend)) axes[0].set_ylabel('Nearshore U (m/s)') axes[0].legend(bbox_to_anchor=(0.90, 1), loc="upper left") eco1_pd[ecoVar2] = eco1_pd[ecoVar3].astype(float) * \ np.cos(np.radians(eco1_pd[ecoVar4].astype(float).to_numpy())) eco1_pd[ecoVar2].astype(float).plot(ax=axes[1], color='k', label='Observations') elm_df_list[m][5].loc[elm_df_list[m][5]['Z_IDX'] == Z_IDX, :].plot( y='V velocity', ax=axes[1], label='Model') axes[1].set_ylim(-0.5, 0.5) axes[1].set_xlim(pd.Timestamp(plotstart), pd.Timestamp(plotend)) axes[1].set_ylabel('Nearshore V (m/s)') axes[1].legend(bbox_to_anchor=(0.90, 1), loc="upper left") # eco2_pd[ecoVar1] = eco2_pd[ecoVar3].astype(float) * \ # np.sin(np.radians(eco2_pd[ecoVar4].astype(float).to_numpy())) # eco2_pd[ecoVar1].astype(float).plot(ax=axes[2], color='k', label='Observations') # elm_df_list[m][6].loc[elm_df_list[m][6]['Z_IDX'] == Z_IDX, :].plot( # y='U velocity', ax=axes[2], label='Model') # axes[2].set_ylim(-1.5, 1.5) # axes[2].set_xlim(pd.Timestamp(plotstart), pd.Timestamp(plotend)) # axes[2].set_ylabel('Offshore U (m/s)') # axes[2].legend(bbox_to_anchor=(0.90, 1), loc="upper left") # # eco2_pd[ecoVar2] = eco2_pd[ecoVar3].astype(float) * \ # np.cos(np.radians(eco2_pd[ecoVar4].astype(float).to_numpy())) # eco2_pd[ecoVar2].astype(float).plot(ax=axes[3], color='k', label='Observations') # elm_df_list[m][5].loc[elm_df_list[m][6]['Z_IDX'] == Z_IDX, :].plot( # y='V velocity', ax=axes[3], label='Model') # # axes[3].set_ylim(-1.00, 1.00) # axes[3].set_xlim(pd.Timestamp(plotstart), pd.Timestamp(plotend)) # axes[3].set_ylabel('Offshore V (m/s)') # axes[3].legend(bbox_to_anchor=(0.90, 1), loc="upper left") axes[1].set_xlabel('Date') plt.show() fig.savefig('//srv-ott3.baird.com/Projects/13539.101 L\'Ansecoy Bay, Mustique/06_Models/01_MIKE3/00_Figures/' + '/uVel_TS_RevC.png', bbox_inches='tight') # %% Subplot Map Plotting mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckex9vtri0o6619p55sl5qiyv/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' x, y, arrow_length = 0.93, 0.95, 0.12 fontprops = fm.FontProperties(size=12) modelPlot = [18] tStepsPlot = np.zeros((5, 6)) tStepsPlot[0, :] = range(110, 116) tStepsPlot[1, :] = range(158, 164) tStepsPlot[2, :] = range(206, 212) tStepsPlot[3, :] = range(255, 261) tStepsPlot[4, :] = range(138, 144) for m in modelPlot: vmax = 34.0 vmin = 33.7 cmap = 'inferno' if m == 8 or m == 17: disPlot = 7 elif m == 11 or m == 15 or m == 18: disPlot = 13 elif m == 14 or m == 16: disPlot = 8 for a in range(0, 5): fig, axes = plt.subplots(nrows=2, ncols=3, sharey=True, sharex=True, figsize=(16, 9)) ax = axes.flatten() for t in range(0, 6): # Plot salinity # Select salinity data at selected time step plotDat = ds_list[m]['Salinity'][int(tStepsPlot[a, t]), :] # Identify nan values plot_nan = np.isnan(plotDat) # Add additional nan values to show bed plot_nan = plot_nan | (plotDat < 33.725) # Plot all selected values at a given later and not nan axDHI = dfs_list[m].plot(plotDat[(dfs_list[m].layer_ids == 0) & (~plot_nan)], plot_type='contourf', show_mesh=False, cmap=cmap, ax=ax[t], add_colorbar=False, vmin=vmin, vmax=vmax, elements=dfs_list[m].element_ids[(dfs_list[m].layer_ids == 0) & (~plot_nan)]) # Add discharge point ax[t].scatter(readPoints[disPlot, 0], readPoints[disPlot, 1], marker='^', color='r', s=20) # ax[t].set_xlim(left=696680.7, right=698252.7) # ax[t].set_ylim(bottom=1425547.5, top=1426681.8) ax[t].set_xlim(left=696508.3, right=698252.7) ax[t].set_ylim(bottom=1425267.0, top=1426681.8) ctx.add_basemap(ax[t], source=mapbox, crs='EPSG:32620') ax[t].title.set_text(str(ds_list[m].time[int(tStepsPlot[a, t])])) ax[t].xaxis.set_major_locator(plt.MaxNLocator(4)) # axes.titlesize = 'x-large' # fig.suptitle(runLog['Short Description'][m], fontsize=18) # ax[t].set_xlabel('Easting [m]') # ax[t].set_ylabel('Northing [m]') fig.subplots_adjust(right=0.8) cmap = mpl.cm.inferno norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) cax = plt.axes([0.85, 0.2, 0.05, 0.6]) cb1 = mpl.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm, orientation='vertical') cb1.set_label('Salinity (PSU)') plt.show() fig.savefig('//srv-ott3.baird.com/Projects/13539.101 L\'Ansecoy Bay, Mustique/06_Models/01_MIKE3/00_Figures/' + '/Plume_6_Plot_' + runLog['Run'][m][0:-20] +'_Alt' + str(a) + '.png', bbox_inches='tight') # %% Map Plotting mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckex9vtri0o6619p55sl5qiyv/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' x, y, arrow_length = 0.93, 0.95, 0.12 fontprops = fm.FontProperties(size=12) modelPlot = range(8, 9) for m in modelPlot: vmax = 34.2 vmin = 34 fig, axes = plt.subplots(figsize=(8, 8)) # Plot salinity # Select salinity data at last time step plotDat = ds_list[m]['Salinity'][-1, :] # Identify nan values plot_nan = np.isnan(plotDat) # Add additional nan values to show bed plot_nan = plot_nan | (plotDat<34.05) # Plot all selected values at a given later and not nan axDHI = dfs_list[m].plot(plotDat[(dfs_list[m].layer_ids == 1) & (~plot_nan)], plot_type='contourf', show_mesh=False, cmap='inferno', ax=axes, vmin=vmin, vmax=vmax, label='Salinity (PSU)', elements=dfs_list[m].element_ids[(dfs_list[m].layer_ids == 1) & (~plot_nan)]) axes.set_xlim(left=696680.7, right=698252.7) axes.set_ylim(bottom=1425547.5, top=1426681.8) ctx.add_basemap(axes, source=mapbox, crs='EPSG:32620') # axes.title.set_text(runLog['Short Description'][m]) # axes.titlesize = 'x-large' # fig.suptitle(runLog['Short Description'][m], fontsize=18) axes.set_xlabel('Easting [m]') axes.set_ylabel('Northing [m]') plt.show() # %% Animated map plt.rcParams['animation.ffmpeg_path'] = 'C:/Users/arey/Local/ffmpeg-2022-02-14-git-59c647bcf3-full_build/bin/ffmpeg.exe' mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckex9vtri0o6619p55sl5qiyv/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' x, y, arrow_length = 0.93, 0.95, 0.12 fontprops = fm.FontProperties(size=12) # Set model to plot modelPlot = [15, 16, 17] m = 16 # m = 11 vmax = 34.0 vmin = 33.7 cmap = 'inferno' metadata = dict(title='Movie Test', artist='Matplotlib', comment='Movie support') writer = animation.FFMpegWriter(fps=2, metadata=metadata, codec='h264') fig, axes = plt.subplots(figsize=(8, 8)) writer.setup(fig, 'C:/Users/arey/files/Projects/Mustique/' + runLog['Run'][m][0:-20] + 'Intake.mp4') # Animation function for i in np.arange(1, 384, 1): #384 if m == 8 or m == 17: disPlot = 7 elif m == 11 or m == 15: disPlot = 13 elif m == 14 or m == 16: disPlot = 8 # fig, axes = plt.subplots(figsize=(8, 8)) axes.cla() # Plot salinity # Select salinity data at last time step plotDat = ds_list[m]['Salinity'][i, :] # Identify nan values plot_nan = np.isnan(plotDat) # Add additional nan values to show bed plot_nan = plot_nan | (plotDat<33.725) # Plot all selected values at a given later and not nan axDHI = dfs_list[m].plot(plotDat[(dfs_list[m].layer_ids == 0) & (~plot_nan)], plot_type='contourf', show_mesh=False, cmap='inferno', ax=axes, add_colorbar=False, vmin=vmin, vmax=vmax, label='Salinity (PSU)', levels=24, elements=dfs_list[m].element_ids[(dfs_list[m].layer_ids == 0) & (~plot_nan)]) axes.scatter(readPoints[disPlot, 0], readPoints[disPlot, 1], marker='^', color='r', s=20) # axes.set_xlim(left=696680.7, right=698252.7) # axes.set_ylim(bottom=1425547.5, top=1426681.8) axes.set_xlim(left=696508.3, right=698252.7) axes.set_ylim(bottom=1425267.0, top=1426681.8) ctx.add_basemap(axes, source=mapbox, crs='EPSG:32620') axes.set_xlabel('Easting [m]') axes.set_ylabel('Northing [m]') axes.title.set_text(str(ds_list[m].time[i])) if i == 1: fig.subplots_adjust(right=0.8) cmap = mpl.cm.inferno norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) cax = plt.axes([0.82, 0.25, 0.04, 0.5]) cb1 = mpl.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm, orientation='vertical') cb1.set_label('Salinity (PSU)') writer.grab_frame() # plt.show() print(i) writer.finish() # %% Plot Bathymetry fig, axes = plt.subplots(figsize=(8, 8)) # Convert to feet and ignore missing axDHI = dfs_list[m].plot(bed_plot[~bed_nan], plot_type='contourf', show_mesh=False, cmap='magma_r', ax=axes, levels=9, vmin=-80, vmax=0, label='Bed Elevation (ft)', elements=dfs_list[m].element_ids[~bed_nan]) axes.set_xlim(left=427800, right=431000) axes.set_ylim(bottom=4758000, top=4762500) ctx.add_basemap(axes, source=mapbox, crs='EPSG:32620') fig.suptitle('Bed Elevation', fontsize=18) axes.set_xlabel('Easting [m]') axes.set_ylabel('Northing [m]') plt.show() # fig.savefig( # '//srv-mad3/Projects/13632.101 South Shore Breakwater/10_Reports&Pres/13632.101.R3 Ph I BOD/Support files/' + # 'Bed_Elevation.png', bbox_inches='tight', dpi=300) # %% Read time series MIKEds_list = [None] * (max(modelPlot) + 1) MIKEdsT_list = [None] * (max(modelPlot) + 1) for m in modelPlot: dfsIN = Dfs0(pl.Path(runLog['Run Location'][m], str(runLog['Number'][m]) + '_' + runLog['Run Name'][m] + '.sw - Result Files', 'BreakPts.dfs0').as_posix()) dfsIN_read = dfsIN.read() MIKEds_list[m] = dfsIN_read.to_dataframe() dfsTIN = Dfs0(pl.Path(runLog['Run Location'][m], str(runLog['Number'][m]) + '_' + runLog['Run Name'][m] + '.sw - Result Files', 'TransectPTS.dfs0').as_posix()) dfsTIN_read = dfsTIN.read() MIKEdsT_list[m] = dfsTIN_read.to_dataframe() # Cleanup unnecessary variables del dfsIN_read del dfsIN del dfsTIN_read del dfsTIN # %% Read in Toe and Crest Shapefiles 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") 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) # %% Merge with data breakPointsOut = [None] * (max(modelPlot) + 1) breakTimesOut = [None] * (max(modelPlot) + 1) for m in modelPlot: breakwaterPTS_times = None for t in range(0, MIKEds_list[m].shape[0]): breakwaterPTS_merge = None breakwaterPTS_merge = breakwaterPTS_Crest for i in range(0, MIKEds_list[m].shape[1]): paramName = MIKEds_list[m].columns.values[i][MIKEds_list[m].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) tmpFID = int(MIKEds_list[m].columns.values[i][1:MIKEds_list[m].columns.values[i].find('"', 1)]) tmpIND = int(MIKEds_list[m].columns.values[i][5:MIKEds_list[m].columns.values[i].find('"', 5)]) breakwaterPTS_merge.loc[((breakwaterPTS_merge.FID == tmpFID) & (breakwaterPTS_merge.vertex_ind == tmpIND)), paramName] = MIKEds_list[m].iloc[t, i] breakwaterPTS_merge['Time'] = MIKEds_list[m].index[t] breakwaterPTS_times = pd.concat([breakwaterPTS_times, breakwaterPTS_merge], ignore_index=True) breakTimesOut[m] = breakwaterPTS_times # %% Read in Breakwater Transect Points Sh breakwaterT = pd.read_csv("C:/Users/arey/files/Projects/SouthShore/Bathy/BreakTransectPTS_Names.csv", sep='\t') breakwaterT_PTS = gp.GeoDataFrame(breakwaterT, geometry=gp.points_from_xy(breakwaterT.X, breakwaterT.Y), crs='EPSG:32616') # %% Merge with data breakPoints_TOut = [None] * (max(modelPlot) + 1) breakTimes_TOut = [None] * (max(modelPlot) + 1) for m in modelPlot: breakwaterPTS_times = None for t in range(0, MIKEdsT_list[m].shape[0]): breakwaterPTS_merge = None breakwaterPTS_merge = breakwaterT_PTS for i in range(0, MIKEdsT_list[m].shape[1]): paramName = MIKEdsT_list[m].columns.values[i][MIKEdsT_list[m].columns.values[i].find(':', 5, -1) + 2:] if paramName not in breakwaterPTS_merge.columns: breakwaterPTS_merge[paramName] = np.full([breakwaterPTS_merge.shape[0], 1], np.nan) tmpName = MIKEdsT_list[m].columns.values[i][0:MIKEdsT_list[m].columns.values[i].find(':', 1)] breakwaterPTS_merge.loc[(breakwaterPTS_merge.Name == tmpName), paramName] = MIKEdsT_list[m].iloc[t, i] breakwaterPTS_merge['Time'] = MIKEdsT_list[m].index[t] breakwaterPTS_times = pd.concat([breakwaterPTS_times, breakwaterPTS_merge], ignore_index=True) breakTimes_TOut[m] = breakwaterPTS_times # %% Format and save for m in modelPlot: saveTmp = breakTimesOut[m].copy() saveTmp['X'] = saveTmp.geometry.x saveTmp['Y'] = saveTmp.geometry.y saveTmp.drop(['vertex_par', 'vertex_p_1', 'angle', 'geometry', 'index_right', 'breakCrest_x', 'breakCrest_y', 'Length'], axis=1, inplace=True) saveTmp.sort_values(by=['FID', 'vertex_ind'], inplace=True, ignore_index=True) # Reorder columns colNames = saveTmp.columns.values saveTmp = saveTmp[['X', 'Y', *colNames[0:-2]]] saveTmpT = saveTmp.transpose(copy=True) # Transect points saveTmp2 = breakTimes_TOut[m].copy() saveTmp2.drop(['geometry'], axis=1, inplace=True) saveTmp2T = saveTmp2.transpose(copy=True) saveTmpT.to_csv('//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/Results/' + 'Toe' + runLog['Short Description'][m] + '.csv') saveTmp2T.to_csv('//srv-mad3.baird.com/Projects/13632.101 South Shore Breakwater/06_Models/02_Mike21SW/Results/' + 'Transect' + runLog['Short Description'][m] + '.csv')