setplot_kml.py.html | |
Source file: setplot_kml.py | |
Directory: /Users/rjl/clawpack_src/clawpack_master/geoclaw/examples/storm-surge/isaac | |
Converted: Mon Feb 19 2024 at 14:28:49 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
""" Set up the plot figures, axes, and items to be done for each frame. This module is imported by the plotting routines and then the function setplot is called to set the plot parameters. """ from __future__ import absolute_import article = False import os import numpy # Plot customization import matplotlib import matplotlib.pyplot as plt import datetime from clawpack.visclaw import colormaps, geoplot import clawpack.clawutil.data as clawutil import clawpack.amrclaw.data as amrclaw import clawpack.geoclaw.data as geodata import clawpack.geoclaw.surge.plot as surgeplot import clawpack.geoclaw.surge.data as surgedata try: from setplotfg import setplotfg except: setplotfg = None # Gauge support days2seconds = lambda days: days * 60.0**2 * 24.0 date2seconds = lambda date: days2seconds(date.days) + date.seconds seconds2days = lambda secs: secs / (24.0 * 60.0**2) min2deg = lambda minutes: minutes / 60.0 ft2m = lambda x:0.3048 * x # Gauge name translation gauge_name_trans = {1:"W", 2:"X", 3:"Y", 4:"Z"} gauge_surface_offset = [0.0, 0.0] gauge_landfall = [] gauge_landfall.append(datetime.datetime(2008,9,13 + 1,7) - datetime.datetime(2008,1,1,0)) gauge_landfall.append(datetime.datetime(2008,9,13 - 1,7) - datetime.datetime(2008,1,1,0)) gauge_landfall.append(days2seconds(4.25)) def setplot(plotdata): r"""Setplot function for surge plotting""" plotdata.clearfigures() # clear any old figures,axes,items data plotdata.format = 'binary' fig_num_counter = surgeplot.figure_counter() # Load data from output clawdata = clawutil.ClawInputData(2) clawdata.read(os.path.join(plotdata.outdir,'claw.data')) amrdata = amrclaw.AmrclawInputData(clawdata) amrdata.read(os.path.join(plotdata.outdir,'amr.data')) physics = geodata.GeoClawData() physics.read(os.path.join(plotdata.outdir,'geoclaw.data')) surge_data = surgedata.SurgeData() surge_data.read(os.path.join(plotdata.outdir,'surge.data')) friction_data = surgedata.FrictionData() friction_data.read(os.path.join(plotdata.outdir,'friction.data')) # Load storm track track = surgeplot.track_data(os.path.join(plotdata.outdir,'fort.track')) # Calculate landfall time, off by a day, maybe leap year issue? landfall_dt = datetime.datetime(2008,9,13,7) - datetime.datetime(2008,1,1,0) landfall = (landfall_dt.days - 1.0) * 24.0 * 60**2 + landfall_dt.seconds # Color limits surface_range = 5.0 speed_range = 3.0 eta = physics.sea_level if not isinstance(eta,list): eta = [eta] surface_limits = [eta[0]-surface_range,eta[0]+surface_range] # surface_contours = numpy.linspace(-surface_range, surface_range,11) surface_contours = [-5,-4.5,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.5,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5] speed_limits = [0.0,speed_range] speed_contours = numpy.linspace(0.0,speed_range,13) wind_limits = [0,64] # wind_limits = [-0.002,0.002] pressure_limits = [935,1013] friction_bounds = [0.01,0.04] # vorticity_limits = [-1.e-2,1.e-2] # ========================================================================== # ========================================================================== # Plot specifications # ========================================================================== # ========================================================================== #----------------------------------------- # Some global kml flags #----------------------------------------- plotdata.kml_name = "Ike" plotdata.kml_starttime = [2008,9,3,15,0,0] # Time of event in UTC [None] plotdata.kml_tz_offset = 5 # Time zone offset (in hours) of event. [None] plotdata.kml_index_fname = "Ike" # name for .kmz and .kml files ["_GoogleEarth"] # Set to path where KMZ files will be stored; KML file will then # link to this path. # plotdata.kml_publish = 'http://www.domain.edu/path/to/kmz/files' # ======================================================================== # Entire Gulf # ======================================================================== gulf_xlimits = [clawdata.lower[0],clawdata.upper[0]] gulf_ylimits = [clawdata.lower[1],clawdata.upper[1]] gulf_shrink = 1.0 # -------------------------- # Surface - entire gulf # -------------------------- plotfigure = plotdata.new_plotfigure(name='Surface - Entire Domain', figno=0) plotfigure.show = True plotfigure.use_for_kml = True plotfigure.kml_use_for_initial_view = True # These override axes limits set below in plotitems plotfigure.kml_xlimits = gulf_xlimits plotfigure.kml_ylimits = gulf_ylimits # Resolution - needs to be set carefully for the transparent colormap rcl = 40 plotfigure.kml_dpi = rcl*2 plotfigure.kml_figsize = [11.6, 9.6] plotfigure.kml_tile_images = False # Tile images for faster loading. Requires GDAL [False] plotaxes = plotfigure.new_plotaxes() plotitem = plotaxes.new_plotitem(name='surface',plot_type='2d_pcolor') plotitem.plot_var = geoplot.surface_or_depth plotitem.pcolor_cmap = geoplot.googleearth_transparent plotitem.pcolor_cmin = -surface_range plotitem.pcolor_cmax = surface_range def kml_colorbar(filename): cmin = -surface_range cmax = surface_range geoplot.kml_build_colorbar(filename, geoplot.googleearth_transparent, cmin,cmax) plotfigure.kml_colorbar = kml_colorbar # -------------------------- # Water Speed - entire gulf # -------------------------- plotfigure = plotdata.new_plotfigure(name='Currents - Entire Domain', figno=1) plotfigure.show = True plotfigure.use_for_kml = True plotfigure.kml_use_for_initial_view = False # These override axes limits set below in plotitems plotfigure.kml_xlimits = gulf_xlimits plotfigure.kml_ylimits = gulf_ylimits plotfigure.kml_figsize = [11.6,9.6] plotfigure.kml_dpi = 80 # size not so important with contourf plotfigure.kml_tile_images = False # Tile images for faster loading. Requires GDAL [False] # Set up for axes in this figure: plotaxes = plotfigure.new_plotaxes() plotitem = plotaxes.new_plotitem(name='surface', plot_type='2d_contourf') plotitem.plot_var = geoplot.surface_or_depth plotitem.contour_levels = speed_contours plotitem.fill_cmin = min(speed_contours) plotitem.fill_cmax = max(speed_contours) cmap= plt.get_cmap('OrRd') cmap._rgba_under = (0.0,0.0,0.0,0.0) plotitem.fill_cmap = cmap def cbar_speeds(filename): cmin = min(speed_contours) cmax = max(speed_contours) geoplot.kml_build_colorbar(filename,cmap,cmin,cmax) plotfigure.kml_colorbar = cbar_speeds # ======================================================================== # Houston/Galveston # ======================================================================== houston_xlimits = [-(95.0 + 26.0 / 60.0), -(94.0 + 25.0 / 60.0)] houston_ylimits = [29.1, 29.0 + 55.0 / 60.0] houston_shrink = 0.9 #No need to worry about fitting the plot exactly if we are not using # the transparent colormap with pcolor. #num_cells = [116, 96] #dx = (gulf_xlimits[1] - float(gulf_xlimits[0]))/num_cells[0] # = 0.25 #dy = (gulf_ylimits[1] - float(gulf_ylimits[0]))/num_cells[1] # = 0.25 #houston_xlimits = [gulf_xlimits[0] + 14*dx, gulf_xlimits[0] + 21*dx] # [-95.25, -94.5] #houston_ylimits = [gulf_ylimits[0] + 82*dy, gulf_ylimits[0] + 88*dy] # [-95.25, -94.5] #figsize = [(21-14)*dx,(88-82)*dy] # relative to [11.6, 9.6] occupied by larger grid figsize = [houston_xlimits[1]-houston_xlimits[0],houston_ylimits[1]-houston_ylimits[0]] dpi = 400 # -------------------------------------- # Surface Elevations - Houston/Galveston # -------------------------------------- plotfigure = plotdata.new_plotfigure(name='Surface - Houston/Galveston', figno=2) plotfigure.show = True plotfigure.use_for_kml = True plotfigure.kml_xlimits = houston_xlimits plotfigure.kml_ylimits = houston_ylimits plotfigure.kml_dpi = dpi # data is not more resolve than this plotfigure.kml_figsize = figsize plotfigure.kml_tile_images = False # pcolor for water. plotaxes = plotfigure.new_plotaxes() plotitem = plotaxes.new_plotitem(name='surface',plot_type='2d_contourf') plotitem.contour_levels = surface_contours plotitem.fill_cmin = min(surface_contours) plotitem.fill_cmax = max(surface_contours) # what is the colormap used here? #plotfigure.kml_colorbar = cbar_houston # -------------------------------- # Water Speed - Houston/Galveston # -------------------------------- plotfigure = plotdata.new_plotfigure(name='Currents - Houston/Galveston', figno=3) plotfigure.show = True plotfigure.use_for_kml = True # These override axes limits set below in plotitems plotfigure.kml_xlimits = houston_xlimits plotfigure.kml_ylimits = houston_ylimits plotfigure.kml_figsize = figsize plotfigure.kml_dpi = dpi # data is not more resolve than this plotfigure.kml_tile_images = False # Tile images for faster loading. Requires GDAL [False] # Water plotaxes = plotfigure.new_plotaxes() plotitem = plotaxes.new_plotitem(name='surface', plot_type='2d_contourf') plotitem.plot_var = geoplot.surface_or_depth plotitem.contour_levels = speed_contours plotitem.fill_cmin = min(speed_contours) plotitem.fill_cmax = max(speed_contours) cmap= plt.get_cmap('OrRd') cmap._rgba_under = (0.0,0.0,0.0,0.0) plotitem.fill_cmap = cmap # ======================================================================== # Figures for gauges # ======================================================================== plotfigure = plotdata.new_plotfigure(name='Surface & topo', figno=300, \ type='each_gauge') plotfigure.show = True plotfigure.clf_each_gauge = True # plotfigure.kwargs['figsize'] = (16,10) def gauge_after_axes(cd): if cd.gaugeno in [1,2,3,4]: axes = plt.gca() # # Add Kennedy gauge data # kennedy_gauge = kennedy_gauges[gauge_name_trans[cd.gaugeno]] # axes.plot(kennedy_gauge['t'] - seconds2days(date2seconds(gauge_landfall[0])), # kennedy_gauge['mean_water'] + kennedy_gauge['depth'], 'k-', # label='Gauge Data') # Add GeoClaw gauge data geoclaw_gauge = cd.gaugesoln axes.plot(seconds2days(geoclaw_gauge.t - date2seconds(gauge_landfall[1])), geoclaw_gauge.q[3,:] + gauge_surface_offset[0], 'b--', label="GeoClaw") # Add ADCIRC gauge data # ADCIRC_gauge = ADCIRC_gauges[kennedy_gauge['gauge_no']] # axes.plot(seconds2days(ADCIRC_gauge[:,0] - gauge_landfall[2]), # ADCIRC_gauge[:,1] + gauge_surface_offset[1], 'r-.', label="ADCIRC") # Fix up plot axes.set_title('Station %s' % cd.gaugeno) axes.set_xlabel('Days relative to landfall') axes.set_ylabel('Surface (m)') axes.set_xlim([-2,1]) axes.set_ylim([-1,5]) axes.set_xticks([-2,-1,0,1]) axes.set_xticklabels([r"$-2$",r"$-1$",r"$0$",r"$1$"]) axes.grid(True) axes.legend() plt.hold(False) surgeplot.gauge_afteraxes(cd) # Set up for axes in this figure: plotaxes = plotfigure.new_plotaxes() plotaxes.xlimits = [-2,1] #plotaxes.xlabel = "Days from landfall" #plotaxes.ylabel = "Surface (m)" plotaxes.ylimits = [-1,5] plotaxes.title = 'Surface' plotaxes.afteraxes = gauge_after_axes # Plot surface as blue curve: plotitem = plotaxes.new_plotitem(plot_type='1d_plot') plotitem.plot_var = 3 plotitem.plotstyle = 'b-' #----------------------------------------- # Parameters used only when creating html and/or latex hardcopy # e.g., via pyclaw.plotters.frametools.printframes: plotdata.printfigs = True # print figures plotdata.print_format = 'png' # file format plotdata.print_framenos = 'all' # list of frames to print plotdata.print_gaugenos = 'all' # list of gauges to print plotdata.print_fignos = [0,1,2,3] # list of figures to print plotdata.html_homelink = '../README.html' # pointer for top of index plotdata.latex_figsperline = 2 # layout of plots plotdata.latex_framesperline = 1 # layout of plots plotdata.latex_makepdf = False # also run pdflatex? plotdata.html = False # create html files of plots? plotdata.latex = False # create latex file of plots? plotdata.kml = True return plotdata