#%% Plotting script for LSU D3D data # Alexander Rey, 2022 import os import pandas as pd import geopandas as gp import netCDF4 as nc import math import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.cm as cm import datetime as datetime from scipy.interpolate import LinearNDInterpolator, interp1d from dfm_tools.get_nc import get_netdata, get_ncmodeldata, plot_netmapdata from dfm_tools.get_nc_helpers import get_timesfromnc, get_ncfilelist, get_hisstationlist, get_ncvardimlist, get_timesfromnc import cartopy.crs as ccrs import contextily as ctx from dfm_tools.regulargrid import scatter_to_regulargrid import pathlib as pl from shapely.geometry import Point, MultiPoint import alphashape import rasterio from rasterio.plot import show as rioshow from osgeo import osr #Spatial reference module from os import listdir from os.path import isfile, join #%% Read Model Log pth = pl.Path("//srv-mad3.baird.com/", "Projects", "13522.101 LSU Lakes", "06_Models", "Delft3DFM", "13522.678.W.SBV.Rev0_LSU Lakes D3D Model Log.xlsx") runLog = pd.read_excel(pth.as_posix(), "ModelLog") dataPath = "FlowFM_map.nc" #%% Import using DFM functions # modelPlot = range(53, 55) #30 # modelPlot = [66, 67, 68, 69, 70, 71] # modelPlot = [44, 45] modelPlot = [64, 65] # stormTime = [datetime.datetime(2005, 8, 29, 14, 0, 0), # datetime.datetime(2005, 9, 24, 14, 0, 0), # datetime.datetime(2005, 12, 28, 14, 0, 0)] # stormTime = [datetime.datetime(2005, 1, 14, 18, 0, 0), # datetime.datetime(2005, 2, 3, 18, 0, 0), # datetime.datetime(2005, 2, 10, 18, 0, 0)] #stormTime = [datetime.datetime(2005, 12, 31, 18, 0, 0)] #stormTime = [datetime.datetime(2005, 8, 7, 0, 0, 0)] ugrid_all = [None] * (max(modelPlot)+1) X = [None] * (max(modelPlot)+1) Y = [None] * (max(modelPlot)+1) U = [None] * (max(modelPlot)+1) V = [None] * (max(modelPlot)+1) Xt = [None] * (max(modelPlot)+1) Yt = [None] * (max(modelPlot)+1) Ut = [None] * (max(modelPlot)+1) Vt = [None] * (max(modelPlot)+1) facex = [None] * (max(modelPlot)+1) facey = [None] * (max(modelPlot)+1) ux_mean = [None] * (max(modelPlot)+1) uy_mean = [None] * (max(modelPlot)+1) ux = [None] * (max(modelPlot)+1) uy = [None] * (max(modelPlot)+1) sed = [None] * (max(modelPlot)+1) area = [None] * (max(modelPlot)+1) wd = [None] * (max(modelPlot)+1) regularMask = [None] * (max(modelPlot)+1) regularMask_t = [None] * (max(modelPlot)+1) meshMask = [None] * (max(modelPlot)+1) alphaPolyList = [None] * (max(modelPlot)+1) for i in modelPlot: file_nc_map = os.path.join(runLog['Run Location'][i], 'FlowFM', 'output', 'FlowFM_map.nc') # file_nc_map = os.path.join(runLog['Run Location'][i], 'FlowFM', 'dflowfm', 'output', 'FlowFM_map.nc') # file_nc_map = os.path.join(runLog['Run Location'][i], 'dflowfm', 'output', 'FlowFM_map.nc') tSteps = get_timesfromnc(file_nc=file_nc_map, varname='time') # Find nearest time step to desired time # stormTime = [runLog['End Date'][i]] # tStep = [] # for s in stormTime: # abs_deltas_from_target_date = np.absolute(tSteps - s) # tStep.append(np.argmin(abs_deltas_from_target_date)) # tStep = len(tSteps) - 1 # tStep = 107 # Peak discharge tstep #40 # Get Var info vars_pd, dims_pd = get_ncvardimlist(file_nc=file_nc_map) ugrid_all[i] = get_netdata(file_nc=file_nc_map)#,multipart=False) facex[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_face_x') facey[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_face_y') # ux_mean[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_ucxa', timestep=tStep) # uy_mean[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_ucya', timestep=tStep) ux[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_ucx', timestep=tStep, layer='all') uy[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_ucy', timestep=tStep, layer='all') sed[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_bodsed', timestep=tStep, station='all') area[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_flowelem_ba') wd[i] = get_ncmodeldata(file_nc=file_nc_map, varname='mesh2d_waterdepth', timestep=tStep) ux_mean[i] = ux[i].mean(axis=2) uy_mean[i] = uy[i].mean(axis=2) X[i],Y[i],U[i] = scatter_to_regulargrid(xcoords=facex[i], ycoords=facey[i], ncellx=50, ncelly=70, values=ux_mean[i][0, :], maskland_dist=25, method='linear') X[i],Y[i],V[i] = scatter_to_regulargrid(xcoords=facex[i], ycoords=facey[i], ncellx=50, ncelly=70, values=uy_mean[i][0, :], maskland_dist=25, method='linear') Xt[i],Yt[i],Ut[i] = scatter_to_regulargrid(xcoords=facex[i], ycoords=facey[i], ncellx=75, ncelly=115, values=ux[i][0, :, 4], maskland_dist=25, method='linear') Xt[i],Yt[i],Vt[i] = scatter_to_regulargrid(xcoords=facex[i], ycoords=facey[i], ncellx=75, ncelly=115, values=uy[i][0, :, 4], maskland_dist=25, method='linear') # Find convex hull of pcolor data # Convert grid to multipoint # Create a list of grid points # alphaPoints = list(map(tuple, np.column_stack((facex[i][:], facey[i][:])).data)) alphaPoints = list(map(tuple, np.column_stack((facex[i][wd[i][0, :] != 0], facey[i][wd[i][0, :] != 0])).data)) # Find the concave hull alphaPoly = alphashape.alphashape(alphaPoints, 0.05) alphaPolyList[i] = alphaPoly # Create mask of regular grid inside concave hull regularMask[i] = [alphaPoly.contains(Point(i[0], i[1])) for i in np.array([X[i].flatten(), Y[i].flatten()]).T] # Create mask of mesh grid points inside concave hull meshMask[i] = [alphaPoly.contains(Point(i[0], i[1])) for i in np.array([facex[i], facey[i]]).T] # Reshape back to regular grid for mask regularMask[i] = np.array(regularMask[i]).reshape(X[i].shape) # Create mask of regular grid inside concave hull of top later regularMask_t[i] = [alphaPoly.contains(Point(i[0], i[1])) for i in np.array([Xt[i].flatten(), Yt[i].flatten()]).T] # Reshape back to regular grid for mask regularMask_t[i] = np.array(regularMask_t[i]).reshape(Xt[i].shape) #%% Plot using DFM functions modelPlot = [66, 67, 68, 69, 70, 71] # stormDirs = [306, 135, 250] windCount = 0 # fig, axes = plt.subplots(nrows=1, ncols=3,subplot_kw={'projection': ccrs.epsg(26915)}, figsize=(13, 6)) vmin = 0 # Legend min vmax = 0.05 # Legend max scale = 100 # Size of arrows, smaller is bigger #25 qmax = 0.02 # Scaling threshold. Above this value, arrows are scaled to 1 #0.1 amin = 1 # Minimum arrow length. A dot is used below this value for tPlot in range(0, 1): for i in modelPlot: fig, axes = plt.subplots(nrows=1, ncols=2, subplot_kw={'projection': ccrs.epsg(26915)}, figsize=(10, 6)) fig.patch.set_facecolor('white') plt.tight_layout() plotCount = 1 vel_mask = meshMask[i] # pc = plot_netmapdata(ugrid_all[i].verts[vel_mask], # values=np.sqrt(ux_mean[i][tPlot, :][vel_mask]**2 +\ # uy_mean[i][tPlot, :][vel_mask]**2), # ax=axes[plotCount], linewidth=0.5, cmap="viridis") pc = plot_netmapdata(ugrid_all[i].verts[vel_mask], values=np.sqrt(ux[i][tPlot, :, 4][vel_mask]**2 +\ uy[i][tPlot, :, 4][vel_mask]**2), ax=axes[plotCount], linewidth=0.5, cmap="viridis") axes[plotCount].set_xlim(675524, 677027) axes[plotCount].set_ylim(3365191, 3367182) # axes[plotCount].set_xlim(676470, 677021) # axes[plotCount].set_ylim(3365939, 3366617) # axes.quiver(X[i], Y[i], U[i], V[i], color='w', scale=8) # Normalize velocity above limit # Using fixed grid overGrid_U_Scale = Ut[i] overGrid_V_Scale = Vt[i] # Using model grid # overGrid_U_Scale = ux_mean[i][tPlot, :] # overGrid_V_Scale = uy_mean[i][tPlot, :] r = np.power(np.add(np.power(overGrid_U_Scale, 2), np.power(overGrid_V_Scale, 2)), 0.5) curPlotMask = np.sqrt((overGrid_U_Scale) ** 2 + (overGrid_V_Scale) ** 2) > qmax overGrid_U_Plot = np.zeros(overGrid_U_Scale.shape) overGrid_V_Plot = np.zeros(overGrid_V_Scale.shape) # Normalize arrows to 1 where not zero overGrid_U_Plot[r != 0] = overGrid_U_Scale[r != 0] / r[r != 0] overGrid_V_Plot[r != 0] = overGrid_V_Scale[r != 0] / r[r != 0] # Scale arrows below qmax overGrid_U_Plot[~curPlotMask] = overGrid_U_Plot[~curPlotMask] * (r[~curPlotMask] / qmax) overGrid_V_Plot[~curPlotMask] = overGrid_V_Plot[~curPlotMask] * (r[~curPlotMask] / qmax) # Using fixed grid # Remove arrows outside of convex hull overGrid_U_Plot[~regularMask_t[i]] = np.nan overGrid_V_Plot[~regularMask_t[i]] = np.nan qv = axes[plotCount].quiver(Xt[i], Yt[i], overGrid_U_Plot, overGrid_V_Plot, scale=scale, color='k', headlength=3.5, headwidth=3.5, headaxislength=3.5, width=0.0015, minlength=amin) #200 # # Using model grid # # Remove arrows outside convex hull # overGrid_U_Plot[~np.array(meshMask[i])] = np.nan # overGrid_V_Plot[~np.array(meshMask[i])] = np.nan # qv = axes[plotCount].quiver(facex[i], facey[i], overGrid_U_Plot, overGrid_V_Plot, scale=scale, # color='k', headlength=3.5, headwidth=3.5, headaxislength=3.5, width=0.0015, minlength=amin) #200 mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckemxgtk51fgp19nybfmdcb1e/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' ctx.add_basemap(axes[plotCount], source=mapbox, crs='EPSG:26915') # extent = ax[plotCount].get_extent() # ax[plotCount].set_xticks(np.linspace(extent[0], extent[1], 4)) # ax[plotCount].set_yticks(np.linspace(extent[2], extent[3], 4)) # Add model bounds line # axes[plotCount].plot(*alphaPoly.exterior.xy, color='k', linewidth=1) pc.set_clim([vmin, vmax]) if plotCount == 1: cbar = fig.colorbar(pc, ax=axes, shrink=0.95) cbar.set_label('Surface Velocity [m/s]') axes[plotCount].set_title(runLog['Bathymetry'][i] + ' Bathymetry; Wind from ' + str(runLog['Wind Dir'][i]) + ' Degrees') # Add rectangle to show storm arrow xLimDist = axes[plotCount].get_xlim()[1] - axes[plotCount].get_xlim()[0] yLimDist = axes[plotCount].get_ylim()[1] - axes[plotCount].get_ylim()[0] axes[plotCount].add_patch(patches.Rectangle((axes[plotCount].get_xlim()[0] + 0.7 * xLimDist, axes[plotCount].get_ylim()[0] + 0.8 * yLimDist - xLimDist * 0.1), xLimDist * 0.2, xLimDist * 0.2, facecolor='white', edgecolor='w', linewidth=5)) # Add wind arrow # Set at 80% of axis limits axes[plotCount].arrow(axes[plotCount].get_xlim()[0] + 0.8 * xLimDist, axes[plotCount].get_ylim()[0] + 0.8 * yLimDist, xLimDist * 0.03 * math.sin(math.radians(runLog['Wind Dir'][i]+180)), xLimDist * 0.03 * math.cos(math.radians(runLog['Wind Dir'][i]+180)), width=xLimDist * 0.015, color='k') plotCount = plotCount + 1 windCount = windCount + 1 plt.show() fig.savefig( 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/Wide_' + runLog['Short Description'][i] + '.png', bbox_inches='tight', dpi=400) # %% Setup forebay polygon # forebayPoly = gp.read_file('C:/Users/arey/files/Projects/LSU/ForebayPoly.shp') forebayPoly = gp.read_file('C:/Users/arey/files/Projects/LSU/ForebayPolyExpand.shp') # Setup mask. Can only do this once if grids are the same vol_FB = [None] * (max(modelPlot)+1) i = 64 forebayPolyMask = [forebayPoly.iloc[0, 1].contains(Point(i[0], i[1])) for i in np.array([facex[i], facey[i]]).T] # Forebay volume vol_FB[44] = np.sum(wd[i][0, forebayPolyMask] \ * area[i][forebayPolyMask]) cityParkPoly = gp.read_file('C:/Users/arey/files/Projects/LSU/CityParkMaskNorth.shp') cityParkMask = [cityParkPoly.iloc[0, 1].contains(Point(i[0], i[1])) for i in np.array([facex[i], facey[i]]).T] # %% Read in hist file # modelPlot = [44, 45] cumSedCS = [None] * (max(modelPlot)+1) cumSedCS_B = [None] * (max(modelPlot)+1) SedCS_B = [None] * (max(modelPlot)+1) cs_Names = [None] * (max(modelPlot)+1) cumDis = [None] * (max(modelPlot)+1) cumDisVol = [None] * (max(modelPlot)+1) cumVol = [None] * (max(modelPlot)+1) disVol = [None] * (max(modelPlot)+1) for i in modelPlot: file_nc_hist = os.path.join(runLog['Run Location'][i], 'FlowFM', 'dflowfm', 'output', 'FlowFM_his.nc') # file_nc_hist = os.path.join(runLog['Run Location'][i], 'FlowFM', 'output', 'FlowFM_his.nc') # Get Var info vars_pd, dims_pd = get_ncvardimlist(file_nc=file_nc_hist) # Get station list station_list = get_hisstationlist(file_nc=file_nc_hist, varname='cross_section_discharge') # cumSedCS[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='cross_section_cumulative_Sediment', # timestep='all', station='all') # SedCS_B[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='cross_section_suspended_sediment_transport', # timestep='all', station='all') # cumSedCS_B[i] = SedCS_B[i].cumsum(axis=1) # # cs_Names[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='cross_section_name', # station='all') # cumDis[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='source_sink_prescribed_discharge', # timestep='all', station='all') disVol[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='cross_section_discharge', timestep='all', station='all') cumVol[i] = get_ncmodeldata(file_nc=file_nc_hist, varname='cross_section_cumulative_discharge', timestep='all', station='all') # cumDisVol[i] = cumDis[i] * 5 * 60 * 129.6 # cumDisVol[i] = cumDisVol[i].sum() # cumDisVol[i] = cumDis[i] * 5 * 60 * 757.2 # cumDisVol[i] = cumDisVol[i].sum() # Get Time info tStepsHist = get_timesfromnc(file_nc=file_nc_hist, varname='time') # %% Calculate 24h exchange modelPlot = [44, 45] fig = plt.figure(figsize=(10, 5)) dis24hRolling = [] for i in modelPlot: disVol_pd = pd.DataFrame(disVol[i], columns=station_list['cross_section_name']) disVol_pd['Time'] = tStepsHist disVol_pd.set_index('Time', inplace=True) # Multiple by 300 to go from m3/s to m3/ 5 minutes, then take the 24h rolling sum dis24hRolling.append(disVol_pd['Forebay1'].multiply(300).abs().rolling(window='24h').sum()) # Calculate average exchange rate avgExchage = dis24hRolling[-1].divide(vol_FB[i]).multiply(100).mean() dis24hRolling[-1].divide(vol_FB[i]).multiply(100).plot( label=runLog['Short Description'][i] + '. Average Exchange: ' + str(round(avgExchage,2)) + '%') # plt.ylim(0, 100) plt.ylim(0, 2) plt.ylabel('Percent of Forebay Volume Exchanged over 24h') plt.legend() plt.show() # fig.savefig( # 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + # 'ForebayExchange_LT.png', bbox_inches='tight', dpi=400) fig.savefig( 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + 'ForebayExchange_LT_0-2.png', bbox_inches='tight', dpi=400) # Scatterplot fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(6, 6)) ax.scatter(dis24hRolling[1].divide(vol_FB[45]).multiply(100), dis24hRolling[0].divide(vol_FB[44]).multiply(100), s=10, c='r') ax.set_xlabel('Percent of Forebay Volume Exchanged over 24h: Existing') ax.set_ylabel('Percent of Forebay Volume Exchanged over 24h: Concept') ax.plot([0, 100], [0, 100], 'k--') plt.show() fig.savefig( 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + 'ForebayExchange_Scatter.png', bbox_inches='tight', dpi=400) #%% Plot Sediment DFM functions # modelPlot = [30, 31, 32, 33, 34, 35] #modelPlot = [30, 35] # modelPlot = [35] # stormDirs = [306, 135, 250] modelPlot = [64] sedIDX = 2 # modelPlot = [65] # sedIDX = 1 plotCount = 0 # fig, axes = plt.subplots(nrows=1, ncols=3,subplot_kw={'projection': ccrs.epsg(26915)}, figsize=(13, 6)) # fig, axes = plt.subplots(nrows=1, ncols=3, # subplot_kw={'projection': ccrs.epsg(26915)}, # figsize=(6, 6)) # fig.patch.set_facecolor('white') # plt.tight_layout() Trapping_List = [None] * (max(modelPlot)+1) for tPlot in range(0, 1): for i in modelPlot: # Plot as seperate figures fig, axes = plt.subplots(nrows=1, ncols=1, subplot_kw={'projection': ccrs.epsg(26915)}, figsize=(6, 9.5)) fig.patch.set_facecolor('white') vel_mask = meshMask[i] pc = plot_netmapdata(ugrid_all[i].verts[vel_mask], values=sed[i][tPlot, :, sedIDX][vel_mask], ax=axes, linewidth=0.5, cmap="viridis") # pc = plot_netmapdata(ugrid_all[i].verts[vel_mask], # values=area[i][:][vel_mask], # ax=axes, linewidth=0.5, # cmap="viridis") # axes.set_xlim(675524, 677027) # axes.set_ylim(3365191, 3367182) # axes.set_xlim(676470, 677021) # axes.set_ylim(3365939, 3366617) axes.set_xlim(675524, 677027) axes.set_ylim(3365191, 3368135) mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckemxgtk51fgp19nybfmdcb1e/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' ctx.add_basemap(axes, source=mapbox, crs='EPSG:26915') # extent = ax[plotCount].get_extent() # ax[plotCount].set_xticks(np.linspace(extent[0], extent[1], 4)) # ax[plotCount].set_yticks(np.linspace(extent[2], extent[3], 4)) # Add model bounds line # alphaPoly = alphaPolyList[i] # axes.plot(*alphaPoly.exterior.xy, color='k', linewidth=1) # Add forebay bounds line # forebayPoly.plot(ax=axes, linewidth=2, # facecolor='none', edgecolor='r') # Add City Park bounds line cityParkPoly.plot(ax=axes, linewidth=2, facecolor='none', edgecolor='r') if i in [44, 45, 36, 37]: pc.set_clim([0, 2000]) elif i < 15: pc.set_clim([0, 100]) else: pc.set_clim([0, 100]) cbar = fig.colorbar(pc, ax=axes, shrink=0.95) cbar.set_label('Available mass of sediment [$kg/m^2$]') # Calculate sediment in polygon massSed = sed[i][0, :, sedIDX] * area[i] massSedSum = np.sum(massSed) # massSed_FB = sed[i][0, forebayPolyMask, 0]\ # * area[i][forebayPolyMask] # massSedSum_FB = np.sum(massSed_FB) massSed_CP = sed[i][0, cityParkMask, sedIDX]\ * area[i][cityParkMask] massSedSum_CP = np.sum(massSed_CP) # Add title # axes.set_title('Existing Condition: ' + "{:0.1f}".format( # (massSedSum_FB / massSedSum) * 100) + '% Trapping') # axes.set_title(runLog['Short Description'][i] + ': ' + "{:0.1f}".format( # (massSedSum_FB / massSedSum) * 100) + '% Trapping') # plt.title(runLog['Short Description'][i] + ": {:0.1f}".format( # (massSedSum_FB / cumDisVol[i]) * 100) + '% Trapping') plt.tight_layout() # Trapping_List[i] = (massSedSum_FB / cumDisVol[i]) Trapping_List[i] = (massSedSum_CP / cumDisTimVol) plt.title(runLog['Short Description'][i] + ": {:0.1f}".format( (Trapping_List[i] * 100)) + '% Trapping') # # Add rectangle to show storm arrow # xLimDist = axes.get_xlim()[1] - axes.get_xlim()[0] # yLimDist = axes.get_ylim()[1] - axes.get_ylim()[0] # # axes.add_patch(patches.Rectangle((axes.get_xlim()[0] + 0.7 * xLimDist, # axes.get_ylim()[0] + 0.8 * yLimDist - xLimDist * 0.1), # xLimDist * 0.2, xLimDist * 0.2, # facecolor='white', edgecolor='w', linewidth=5)) # # # # Add wind arrow # # Set at 80% of axis limits # axes.arrow(axes.get_xlim()[0] + 0.8 * xLimDist, # axes.get_ylim()[0] + 0.8 * yLimDist, # xLimDist * 0.03 * math.sin(math.radians(stormDirs[tPlot])), # xLimDist * 0.03 * math.cos(math.radians(stormDirs[tPlot])), # width=xLimDist * 0.015, # color='k') plotCount = plotCount + 1 plt.show() fig.savefig( 'C:/Users/arey/files/Projects/LSU/Modelling/FiguresExpand/' + runLog['Run Name'][i] + '_RevB.png', bbox_inches='tight', dpi=400) # plt.show() # fig.savefig( # 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + # 'SedZoomPercent.png', bbox_inches='tight', dpi=400) # %% Create summary table modelPlot = range(30, 46) trappingSumTable = pd.DataFrame() trappingSumTable['Description'] = runLog['Short Description'][modelPlot] trappingSumTable['Trapping'] = np.array(Trapping_List)[modelPlot] # %% Calculate the total sediment discharged City Park Lake fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6,6)) modelPlot = [64] sourceSinkTimDat = [] for i in modelPlot: inputFiles = [f for f in listdir(os.path.join(runLog['Run Location'][i], 'FlowFM', 'input')) if isfile(join(os.path.join(runLog['Run Location'][i], 'FlowFM', 'input'), f))] for inputFile in inputFiles: if '.pli' in inputFile and 'source' in inputFile: # Read pli to find location sourceLocation_df = pd.read_csv(os.path.join(runLog['Run Location'][i], 'FlowFM', 'input', inputFile), skiprows=1, delim_whitespace=True) sourcePoint = Point(sourceLocation_df.iloc[0, 0], sourceLocation_df.iloc[0, 1]) # If point in City Park Area if sourcePoint.within(cityParkPoly.iloc[0, 1]): # Read in the sediment discharge file (.tim) sourceSinkTimFile = os.path.join(runLog['Run Location'][i], 'FlowFM', 'input', inputFile[0:-4] + '.tim') # sourceSinkTimDat.append( # pd.read_csv(sourceSinkTimFile, sep='\s+', header=None, names=['time', 'Q', 'conc_sed', 'conc_fluff', 'conc_sec01'])) sourceSinkTimDat.append( pd.read_csv(sourceSinkTimFile, sep='\s+', header=None, names=['time', 'Q', 'conc_sed', 'conc_sec01'])) # Add datetimes sourceSinkTimDat[-1].index = pd.to_datetime(sourceSinkTimDat[-1].time, unit='m', origin=pd.Timestamp('2005-01-01')) # Vol sediment at each time step, multiplied by the time step sourceSinkTimDat[-1]['SedVol'] = sourceSinkTimDat[-1]['Q'] *\ sourceSinkTimDat[-1].loc[:, 'time'].diff() * 60 *\ sourceSinkTimDat[-1]['conc_sec01'] # Fix first time step sourceSinkTimDat[-1].iloc[0, -1] = 0 # Sediment cumlative sum sourceSinkTimDat[-1].loc[:, 'CumSed'] = sourceSinkTimDat[-1].loc[:, 'SedVol'].cumsum() # sourceSinkTimDat[-1].loc[:, 'Q'].rolling(24*4).sum().plot() sourceSinkTimDat[-1].loc[:, 'Q'].multiply( sourceSinkTimDat[-1].loc[:, 'conc_sec01']).multiply( sourceSinkTimDat[-1].loc[:, 'time'].diff()).multiply( 60).cumsum().plot() plt.show() # %% Sum up city park lake cumDisTimVol = 0 for s in range(0, len(sourceSinkTimDat)): cumDisTimVol = cumDisTimVol + sourceSinkTimDat[s].CumSed[-1] # %% Calculate the total sediment discharged # fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6,6)) modelPlot = [58] sourceSinkDat = [] for i in modelPlot: for sourceSink in range(1, 5): # Read in the sediment discharge file (.tim) sourceSinkFile = os.path.join(runLog['Run Location'][i], 'FlowFM', 'input', 'SourceSink0' + str(sourceSink) + '.tim') sourceSinkDat.append(pd.read_csv(sourceSinkFile, sep='\s+', header=None, names=['time', 'Q', 'conc_sed', 'conc_fluff', 'conc_sed01'])) # Add datetimes sourceSinkDat[-1].index = pd.to_datetime(sourceSinkDat[-1].time, unit='m', origin=pd.Timestamp('2020-01-01')) # Vol sediment at each time step, multiplied by the time step sourceSinkDat[-1]['SedVol'] = sourceSinkDat[-1]['Q'] *\ sourceSinkDat[-1].loc[:, 'time'].diff() * 60 *\ sourceSinkDat[-1]['conc_sed01'] # Fix first time step sourceSinkDat[-1].iloc[0, -1] = 0 # Sediment cumlative sum sourceSinkDat[-1].loc[:, 'CumSed'] = sourceSinkDat[-1].loc[:, 'SedVol'].cumsum() # sourceSinkDat[-1].loc[:, 'Q'].rolling(24*4).sum().plot() sourceSinkDat[-1].loc[:, 'Q'].sum().plot() plt.show() # %% Read in 15 minute precipitation data prep_data = pd.read_excel('//srv-mad3/Projects/13522.101 LSU Lakes/06_Models/PCSWMM Model/DataforHistoricRuns/15min_precip_formatted.xlsx', sheet_name='Sheet2') prep_data['DateTime'] = pd.to_datetime(prep_data['DT']) prep_data.set_index('DateTime', inplace=True) # %% Plot 24h precipitationto find events fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(12, 6)) prep_data.loc[:, 'per 15min'].rolling(24 * 4).sum().plot() axes.set_ylabel('24h Precipiation (in)') axes.set_xlim((pd.to_datetime('20050701'), pd.to_datetime('20060101'))) plt.show() # fig.savefig(('//srv-mad3/Projects/13522.101 LSU Lakes/06_Models/PCSWMM Model/DataforHistoricRuns/24h_PrecpSum.png') # %% Plot the sediment discharge and cumlative transport fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6,6)) csIDX = 3 # Calculate the total sediment discharged # SS 1/2 is SouthWest, 3/4 is SouthEast sourceSinkDat[0].loc[:, 'CumSed'].multiply(2).plot( label='Discharged Sediment SW') # in kg sourceSinkDat[2].loc[:, 'CumSed'].multiply(2).plot( label='Discharged Sediment NE') # in kg totalSedDis = sourceSinkDat[0].loc[:, 'CumSed'].multiply(2) +\ sourceSinkDat[2].loc[:, 'CumSed'].multiply(2) # Plot the total sediment discharge totalSedDis.plot(label='Total Discharged Sediment') axes.plot(tStepsHist, cumSedCS[i][:, csIDX]*2650, label='Cross Section Sediment Transport', color='k') # In M3. Multiple by 2650 to get kg # axes.plot(tStepsHist, cumSedCS_B[i][:, csIDX], # label='Cross Section Sediment Transport B', color='r') # In M3. Multiple by 2650 to get kg axes.set_xlabel('Date') axes.set_ylabel('Sediment [kg]') trappedSed = (1 - (cumSedCS[i][-1, csIDX]*2650) / totalSedDis[-1])*100 trappedSedB = (1 - (cumSedCS_B[i][-1, csIDX]) / totalSedDis[-1])*100 axes.set_title('Sediment Transport: ' + "{:0.1f}".format(trappedSed) + '% Trapping') plt.legend() plt.show() # fig.savefig( # 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + # 'SedTrap_Concept_NE.png', bbox_inches='tight', dpi=400) # fig.savefig( # 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + # 'SedTrap_Concept.png', bbox_inches='tight', dpi=400) #%% Plot Circulation DFM functions modelPlot = range(53, 55) plotCount = 1 plotLayer = 0 stormDirs = [157.5, 157.5] for tPlot in range(0, 1): for i in modelPlot: # Plot as seperate figures fig, axes = plt.subplots(nrows=1, ncols=1, subplot_kw={'projection': ccrs.epsg(26915)}, figsize=(6, 6)) fig.patch.set_facecolor('white') vel_mask = meshMask[i] pc = plot_netmapdata(ugrid_all[i].verts[vel_mask], values=np.sqrt(ux[i][0, vel_mask, plotLayer] ** 2 + uy[i][0, vel_mask, plotLayer] ** 2), ax=axes, linewidth=0.5, cmap="viridis") # axes.set_xlim(675524, 677027) # axes.set_ylim(3365191, 3367182) axes.set_xlim(676470, 677021) axes.set_ylim(3365939, 3366617) mapbox = 'https://api.mapbox.com/styles/v1/alexander0042/ckemxgtk51fgp19nybfmdcb1e/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiYWxleGFuZGVyMDA0MiIsImEiOiJjazVmdG4zbncwMHY4M2VrcThwZGUzZDFhIn0.w6oDHoo1eCeRlSBpwzwVtw' ctx.add_basemap(axes, source=mapbox, crs='EPSG:26915') # extent = ax[plotCount].get_extent() # ax[plotCount].set_xticks(np.linspace(extent[0], extent[1], 4)) # ax[plotCount].set_yticks(np.linspace(extent[2], extent[3], 4)) # Add quiver arrows U_plot = ux[i][0, vel_mask, plotLayer] / np.sqrt(ux[i][0, vel_mask, plotLayer] ** 2 + uy[i][0, vel_mask, plotLayer] ** 2) V_plot = uy[i][0, vel_mask, plotLayer] / np.sqrt(ux[i][0, vel_mask, plotLayer] ** 2 + uy[i][0, vel_mask, plotLayer] ** 2) Q = plt.quiver(facex[i][vel_mask], facey[i][vel_mask], U_plot, V_plot, scale=55) # Add quiverkey qk = plt.quiverkey(Q, 0.8, 0.88, 2, r'$2 \frac{m}{s}$', labelpos='E', coordinates='figure') # Add model bounds line alphaPoly = alphaPolyList[i] axes.plot(*alphaPoly.exterior.xy, color='k', linewidth=1) pc.set_clim([0, 0.1]) cbar = fig.colorbar(pc, ax=axes, shrink=0.95) cbar.set_label('Surface Velocity [m/s]') # Add title plt.title(runLog['Short Description'][i]) plt.tight_layout() # # Add rectangle to show storm arrow xLimDist = axes.get_xlim()[1] - axes.get_xlim()[0] yLimDist = axes.get_ylim()[1] - axes.get_ylim()[0] axes.add_patch(patches.Rectangle((axes.get_xlim()[0] + 0.7 * xLimDist, axes.get_ylim()[0] + 0.8 * yLimDist - xLimDist * 0.1), xLimDist * 0.2, xLimDist * 0.2, facecolor='white', edgecolor='w', linewidth=5)) # Add wind arrow # Set at 80% of axis limits axes.arrow(axes.get_xlim()[0] + 0.8 * xLimDist, axes.get_ylim()[0] + 0.8 * yLimDist, xLimDist * 0.03 * math.sin(math.radians(stormDirs[tPlot])), xLimDist * 0.03 * math.cos(math.radians(stormDirs[tPlot])), width=xLimDist * 0.015, color='k') plotCount = plotCount + 1 plt.show() fig.savefig( 'C:/Users/arey/files/Projects/LSU/Modelling/FiguresExpand/Circ_Fig' + runLog['Run Name'][i] + '.png', bbox_inches='tight', dpi=400) # plt.show() # fig.savefig( # 'C:/Users/arey/files/Projects/LSU/Modelling/Figures/' + # 'SedZoomPercent.png', bbox_inches='tight', dpi=400)