예제 #1
0
def convert_storm_track(atcf_path):
    output_path = os.path.join(os.getcwd(), 'katrina.storm')
    katrina = Storm(path=atcf_path, file_format='ATCF')
    # Landfall of hurricane 1110 UTC (6:10 a.m. CDT) on Monday, August 29, 2005
    katrina.time_offset = datetime.datetime(2005, 8, 29, 11, 10)
    katrina.write(output_path, file_format='geoclaw')
    return output_path
예제 #2
0
def convert_storm_track(atcf_path):
    output_path = os.path.join(os.getcwd(), 'katrina.storm')
    katrina = Storm(path=atcf_path, file_format='ATCF')
    # Landfall of hurricane 1110 UTC (6:10 a.m. CDT) on Monday, August 29, 2005
    katrina.time_offset = datetime.datetime(2005, 8, 29, 11, 10)
    katrina.write(output_path, file_format='geoclaw')
    return output_path
예제 #3
0
def set_storm(rundata):

    data = rundata.surge_data

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True
    
    # Source term algorithm parameters
    # data.wind_tolerance = 1e-4
    # data.pressure_tolerance = 1e-4 # Pressure source term tolerance

    # AMR parameters
    data.wind_refine = [20.0,40.0,60.0] # m/s
    data.R_refine = [60.0e3,40e3,20e3]  # m
    
    # Storm parameters
    data.storm_specification_type = "holland80" # Type of storm
#    data.landfall = days2seconds(irene_landfall.days) + irene_landfall.seconds
    data.display_landfall_time = True

    # Storm type 1 - Idealized storm track
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),'IRENE.storm'))
    irene = Storm("irene.storm", file_format='ATCF')
    irene.time_offset = datetime.datetime(2011,8,27,7,30)
    irene.write(data.storm_file, file_format="geoclaw")

    return data
예제 #4
0
def set_storm(rundata):

    data = rundata.surge_data

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True
    
    # Source term algorithm parameters
    # data.wind_tolerance = 1e-4
    # data.pressure_tolerance = 1e-4 # Pressure source term tolerance

    # AMR parameters
    data.wind_refine = [20.0,40.0,60.0] # m/s
    data.R_refine = [60.0e3,40e3,20e3]  # m
    
    # Storm parameters
    data.storm_specification_type = "holland80" # Type of storm
#    data.landfall = days2seconds(irene_landfall.days) + irene_landfall.seconds
    data.display_landfall_time = True

    # Storm type 1 - Idealized storm track
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),'IRENE.storm'))
    irene = Storm("irene.storm", file_format='ATCF')
    irene.time_offset = datetime.datetime(2011,8,27,7,30)
    irene.write(data.storm_file, file_format="geoclaw")

    return data
예제 #5
0
def set_storm(rundata):

    data = rundata.surge_data

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True
    
    # Source term algorithm parameters
    # data.wind_tolerance = 1e-4
    # data.pressure_tolerance = 1e-4 # Pressure source term tolerance

    # AMR parameters
    data.wind_refine = [20.0,40.0,60.0] # m/s
    data.R_refine = [60.0e3,40e3,20e3]  # m
    
    # Storm parameters
    data.storm_specification_type = "holland80" # Type of storm
    data.display_landfall_time = True

    # Storm type 1 - Idealized storm track
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(), 'florence.storm'))
    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file('http://ftp.nhc.noaa.gov/atcf/archive/2018/bal062018.dat.gz')
    atcf_path = os.path.join(scratch_dir, 'bal062018.dat')
    florence = Storm(path=atcf_path, file_format="ATCF")
    
    florence.time_offset = datetime.datetime(2018,9,14,7,15)
    florence.write(data.storm_file, file_format="geoclaw")

    return data
예제 #6
0
def set_storm(rundata):

    data = rundata.surge_data

    # Physics parameters
    data.rho_air = 1.15
    data.ambient_pressure = 101.3e3  # Nominal atmos pressure

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    # Source term algorithm parameters
    # data.wind_tolerance = 1e-4
    # data.pressure_tolerance = 1e-4 # Pressure source term tolerance

    # AMR parameters
    data.wind_refine = [20.0, 40.0, 60.0]  # m/s
    data.R_refine = [60.0e3, 40e3, 20e3]  # m

    # Storm parameters
    data.storm_type = 1  # Type of storm
    data.landfall = days2seconds(ike_landfall.days) + ike_landfall.seconds
    data.display_landfall_time = True

    # Storm type 1 - Idealized storm track
    #data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),'ike.storm'))

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                                      'ike.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "http://ftp.nhc.noaa.gov/atcf/archive/2008/bal092008.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal092008.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Uncomment/comment out to use the old version of the Ike storm file
    # ike = Storm(path="old_ike.storm", file_format="ATCF")
    ike = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    ike.time_offset = datetime.datetime(2008, 9, 13, 7)

    ike.write(data.storm_file, file_format='geoclaw')

    return rundata
예제 #7
0
파일: setrun.py 프로젝트: see-on/apps
def set_storm(rundata):

    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.pressure_forcing = True
    data.drag_law = 2

    data.display_landfall_time = True

    # AMR parameters - m/s for wind refinement and (m) for radius
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Storm Type 1 is Holland parameterized
    data.storm_specification_type = 'holland80'
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'katrina.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        'http://ftp.nhc.noaa.gov/atcf/archive/2005/bal122005.dat.gz')
    atcf_path = os.path.join(scratch_dir, "bal122005.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Read in the newly downloaded and decompressed file
    katrina = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time
    katrina.time_offset = datetime.datetime(2005, 8, 29, 11, 10)

    # Write out the storm data into the GeoClaw format
    katrina.write(data.storm_file, file_format='geoclaw')

    return data
예제 #8
0
def return_gauge_points(rundata, storm_path, storm_file_format):
    
    ## replace with your storm
    storm = Storm(path=storm_path, file_format=storm_file_format)
    
    points_gauges = []    

    if(storm_file_format == "ATCF"):
        points_coast = points_on_shoreline_atcf(storm)
        
    elif(storm_file_format == "geoclaw"):
        points_coast = points_on_shoreline_geo(storm)
        
    else:
        print("Unrecognizable storm file format. Please use ATCF or geoclaw format.")
    
    for n in points_coast:
        
        rundata.regiondata.regions.append([15,15,rundata.clawdata.t0,rundata.clawdata.tfinal, \
        n[0] + 0.01, n[0] -0.01, n[1] + 0.01, n[1] -0.01]) ## refine data as much as possible
       
        topo = topofiles[which_topo(topofiles, n)]
    
        integral = equation_from_bilinear_interpolation(n[0], n[1], topo.x, topo.y, topo.Z, \
                                                       n[0] - 0.008, n[0] + 0.008, n[1] - 0.008, n[1] + 0.008)  
    
        z_predicted = integral/((0.008*2)**2)
    
        if (z_predicted < 0):
            points_gauges.append(n)
   
    for k, n in enumerate(points_gauges):

        rundata.gaugedata.gauges.append([(k+1), n[0] , n[1],
                                         rundata.clawdata.t0,
                                         rundata.clawdata.tfinal])
예제 #9
0
def run_storm_job(first_storm=0,
                  last_storm=0,
                  wind_model='holland80',
                  amr_level=2):
    r"""
    Setup jobs to run at specific storm start and end.  
    """

    # Path to file containing log of storms run
    path = os.path.join(os.environ.get('DATA_PATH',
                                       os.getcwd()), "square_basin",
                        "square-basin-storm-%i-%i" % (first_storm, last_storm),
                        "run_log.txt")

    if not os.path.exists(path):
        os.makedirs(os.path.dirname(path))

    # File to tracy synthetic storm in atcf format
    tracy_atcf_path = 'data/tracy_synthetic_atcf.storm'

    # Establish a control form of tracy
    control = Storm(path=tracy_atcf_path, file_format='ATCF')
    control.read_atcf(path=tracy_atcf_path)

    # Change tracy to piece wise constant wind curve
    u0 = control.max_wind_speed[1]
    control.max_wind_speed = piecewise_wind_curve(u0, control.max_wind_speed)
    control.write("data/tracy_geoclaw.storm", file_format="geoclaw")

    # Get a general storm path
    #data_path = os.path.join(os.getcwd(), "../../../data")
    #storms_path = os.path.join(data_path, "storms")
    #tracks = os.path.join(storms_path, "geoclaw-mumbai-tracks")
    tracks = os.path.join(os.getcwd(), "data", "synthetic_storm_files")

    num_storms = 1000

    #storm_gauges = [(72.811790, 18.936508), (72.972316, 18.997762),
    #                (72.819311, 18.818044)]
    #regions_data = []

    #regions_data.append([2, 5, 70, 75, 17, 22])
    ## Mumbai
    #regions_data.append([4, 7, 72.6, 73, 18.80, 19.15])

    storm_gauges = None
    regions_data = None

    num_storms = 1000

    with open(path, 'w') as run_log_file:
        jobs = []

        for n in range(0, num_storms):

            storm = copy.copy(control)
            mws = copy.copy(control.max_wind_speed)
            mws = perturb_wind(mws)
            C0 = 218.3784 * numpy.ones(len(mws))
            mwr = C0 - 1.2014 * mws + (mws / 10.9884)**2 - (
                mws / 35.3052)**3 - 145.5090 * numpy.cos(
                    control.eye_location[:, 1] * 0.0174533)

            storm.max_wind_speed = mws
            #storm.max_wind_radius = mwr

            # Name storm file and write to log
            storm_name = 'SquareBasin_%s.storm' % str(n)
            run_log_file.write("%s %s\n" % (n, '%s' % storm_name))

            # Add job to queue
            jobs.append(
                StormJob(run_number=n,
                         storm_directory=tracks,
                         storm_object=storm,
                         wind_model=wind_model,
                         amr_level=amr_level,
                         storm_ensemble_type="Synthetic",
                         region="SquareBasin",
                         gauges=storm_gauges,
                         regions=regions_data))
            #num_storms = 1

            if n == num_storms - 1:
                #controller = StormHabaneroBatchController(jobs)
                controller = batch.HabaneroBatchController(jobs)
                controller.email = '*****@*****.**'
                print(controller)
                controller.run()
                jobs = []
                break
    return jobs
예제 #10
0
    for i in range(0, max_wind_speed.shape[0]):
        error = numpy.random.normal(loc=1)
        max_wind_speed[i] = max_wind_speed[i] + error

    return max_wind_speed


directory = "data/synthetic_storm_files"
if not os.path.exists(os.path.join(os.getcwd(), directory)):
    os.makedirs(directory)

# File to tracy synthetic storm in atcf format
tracy_atcf_path = 'data/tracy_synthetic_atcf.storm'

# Establish a control form of tracy
control = Storm(path=tracy_atcf_path, file_format='ATCF')
control.read_atcf(path=tracy_atcf_path)

# Change tracy to piece wise constant wind curve
u0 = control.max_wind_speed[1]
control.max_wind_speed = piecewise_wind_curve(u0, control.max_wind_speed)
control.write("data/tracy_geoclaw.storm", file_format="geoclaw")

perturbed_radii = []
perturbed_winds = []

# Create storm objects with perturbed wind data
for i in range(0, 1000):
    storm = copy.copy(control)
    mws = copy.copy(control.max_wind_speed)
    mws = perturb_wind(mws)
예제 #11
0
def setgeo(rundata):
#-------------------
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    try:
        geo_data = rundata.geo_data
    except:
        print("*** Error, this rundata has no geodata attribute")
        raise AttributeError("Missing geodata attribute")
       
    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, minlevel, maxlevel, t1, t2, fname]
    topo_path = os.path.join(os.environ["DATA_PATH"], "topography")
    topo_data.topofiles.append([3, 1, 3, rundata.clawdata.t0, 
                                         rundata.clawdata.tfinal, 
                                         os.path.join(topo_path, 'atlantic',
                                                      'full_1min.tt3')])
    topo_data.topofiles.append([4, 1, 5, rundata.clawdata.t0, 
                                         rundata.clawdata.tfinal, 
                                         os.path.join(topo_path, 
                                                      'new_york_area_3second.nc')])

    # == setqinit.data values ==
    rundata.qinit_data.qinit_type = 0
    rundata.qinit_data.qinitfiles = []
    # for qinit perturbations, append lines of the form: (<= 1 allowed for now!)
    #   [minlev, maxlev, fname]

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters
    data.wind_refine = [20.0,40.0,60.0] # m/s
    data.R_refine = [60.0e3,40e3,20e3]  # m
    
    # Storm parameters
    data.storm_specification_type = "holland80" # Set type of storm field
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                                      'sandy.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
                   "http://ftp.nhc.noaa.gov/atcf/archive/2012/bal182012.dat.gz",
                   output_dir=os.getcwd())
    atcf_path = os.path.join(os.getcwd(), "bal182012.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    sandy = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    sandy.time_offset = datetime.datetime(2012,10,30,0,0)

    sandy.write(data.storm_file, file_format='geoclaw')
    
    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain - seems high on land...
    data.friction_regions.append([rundata.clawdata.lower, 
                                  rundata.clawdata.upper,
                                  [np.infty,0.0,-np.infty],
                                  [0.050, 0.025]])

    
    return rundata
예제 #12
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    # See regions for control over these regions, need better bathy data for
    # the smaller domains

    for n in range(1, 13):
        world_path = os.path.join(DATAWORLD, 'world_' + str(n) + '.tt3')
        topo_data.topofiles.append([
            3, 1, 5, rundata.clawdata.t0, rundata.clawdata.tfinal, world_path
        ])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), './Storm/00000.storm'))

    #Storm Object
    ensemble = Storm(path='./Storm/00000.storm', file_format="geoclaw")

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    # La-Tex Shelf
    data.friction_regions.append([(-98, 25.25), (-90, 30),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata
예제 #13
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    # See regions for control over these regions, need better bathy data for
    # the smaller domains
    irene_path = os.path.join(DATA, 'irenetopo.tt3')
    topo_data.topofiles.append(
        [3, 1, 5, rundata.clawdata.t0, rundata.clawdata.tfinal, irene_path])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'irene.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "http://ftp.nhc.noaa.gov/atcf/archive/2011/bal092011.dat.gz")
    atcf_path = os.path.join(DATA, "bal092011.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    irene = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    irene.time_offset = datetime.datetime(2011, 8, 27, 12)

    irene.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    # La-Tex Shelf
    data.friction_regions.append([(-98, 25.25), (-90, 30),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata
def load_emanuel_storms(path,
                        mask_distance=None,
                        mask_coordinate=(0.0, 0.0),
                        mask_category=None,
                        categorization="NHC"):
    r"""Load storms from a Matlab file containing storms

    This format is based on the format Prof. Emmanuel uses to generate storms.

    :Input:
     - *path* (string) Path to the file to be read in
     - *mask_distance* (float) Distance from *mask_coordinate* at which a storm
       needs to in order to be returned in the list of storms.  If
       *mask_distance* is *None* then no masking is used.  Default is to
       use no *mask_distance*.
     - *mask_coordinate* (tuple) Longitude and latitude coordinates to measure
       the distance from.  Default is *(0.0, 0.0)*.
     - *mask_category* (int) Category or highter a storm needs to be to be
       included in the returned list of storms.  If *mask_category* is *None*
       then no masking occurs.  The categorization used is controlled by
       *categorization*.  Default is to use no *mask_category*.
     - *categorization* (string) Categorization to be used for the
       *mask_category* filter.  Default is "NHC".

    :Output:
     - (list) List of Storm objects that have been read in and were not
       filtered out.
    """

    # Load the mat file and extract pertinent data
    import scipy.io
    mat = scipy.io.loadmat(path)

    lon = mat['longstore']
    lat = mat['latstore']
    hour = mat['hourstore']
    day = mat['daystore']
    month = mat['monthstore']
    year = mat['yearstore']
    max_wind_radius = mat['rmstore']
    max_wind_speed = mat['vstore']
    central_pressure = mat['pstore']

    # Convert into storms and truncate zeros
    storms = []
    for n in range(lon.shape[0]):
        m = len(lon[n].nonzero()[0])

        storm = Storm()
        storm.ID = n

        storm.t = [
            datetime.datetime(year[0, n], month[n, i], day[n, i], hour[n, i])
            for i in range(m)
        ]

        storm.time_offset = storm.t[0]

        storm.eye_location = numpy.empty((m, 2))
        storm.max_wind_speed = numpy.empty(m)
        storm.max_wind_radius = numpy.empty(m)
        storm.central_pressure = numpy.empty(m)

        storm.eye_location[:, 0] = lon[n, :m]
        storm.eye_location[:, 1] = lat[n, :m]
        storm.max_wind_speed = max_wind_speed[n, :m]
        storm.max_wind_speed = units.convert(max_wind_speed[n, :m], 'knots',
                                             'm/s')
        storm.max_wind_radius = units.convert(max_wind_radius[n, :m], 'km',
                                              'm')
        storm.central_pressure = units.convert(central_pressure[n, :m], 'hPa',
                                               'Pa')
        storm.storm_radius = numpy.ones(m) * 300e3

        include_storm = True
        if mask_distance is not None:
            distance = numpy.sqrt((storm.eye_location[:, 0] - \
                         mask_coordinate[0])**2 + (storm.eye_location[:, 1] - \
                         mask_coordinate[1])**2)
            inlcude_storm = numpy.any(distance < mask_distance)
        if mask_category is not None:
            category = storm.category(categorization=categorization)
            include_storm = numpy.any(category > mask_category)

        if include_storm:
            storms.append(storm)

    #print("Length of storms:", len(storms))
    return storms
예제 #15
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    try:
        geo_data = rundata.geo_data
    except:
        print("*** Error, this rundata has no geo_data attribute")
        raise AttributeError("Missing geo_data attribute")

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, fname]
    # See regions for control over these regions, need better bathy data for
    # the smaller domains
    clawutil.data.get_remote_file(
        "http://www.columbia.edu/~ktm2132/bathy/gulf_caribbean.tt3.tar.bz2")
    topo_path = os.path.join(scratch_dir, 'gulf_caribbean.tt3')
    topo_data.topofiles.append([3, topo_path])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'isaac.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "http://ftp.nhc.noaa.gov/atcf/archive/2012/bal092012.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal092012.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Uncomment/comment out to use the old version of the Ike storm file
    isaac = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (~2345 UTC - 6:45 p.m. CDT - on August 28)
    isaac.time_offset = datetime.datetime(2012, 8, 29, 0)

    isaac.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    # La-Tex Shelf
    data.friction_regions.append([(-98, 25.25), (-90, 30),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata
예제 #16
0
## directory where your data is
DATA = os.path.join(os.environ.get('DATA_DIR', os.getcwd()))

####
# make topography file(s) into topo objects (topotools.Topography()) and
# add to topofiles list
####
topofiles = []

for n in range(1,13):
    topo = topotools.Topography()
    topo.read('../topofilesagain/world_' + str(n) + '.tt3', topo_type=3)
    topofiles.append(topo)

## replace with your storm
storm=Storm('./00009.storm', file_format='geoclaw')

## finds the nearest points to the storm on the shoreline by using topotools 
## makeshoreline method and finding the minimum distance from the eyelocation 
## of the storm and the shoreline

## if read in storm as atcf file, use this method:
# def points_on_shoreline(storm):
    
#     shoreline = []
    
#     for n in topofiles:
#         for i in n.make_shoreline_xy():
#             shoreline.append(i)
    
#     sub_sample_storm = storm.eye_location[::3] 
예제 #17
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.28
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, minlevel, maxlevel, t1, t2, fname]
    # See regions for control over these regions, need better bathy data for
    # the smaller domains
    clawutil.data.get_remote_file(
        "http://www.columbia.edu/~ktm2132/bathy/gulf_caribbean.tt3.tar.bz2")
    topo_path = os.path.join(scratch_dir, 'gulf_caribbean.tt3')
    topo_data.topofiles.append(
        [3, 1, 5, rundata.clawdata.t0, rundata.clawdata.tfinal, topo_path])
    topo = topotools.Topography()
    topo.read(topo_path, topo_type=2)

    # Create the Flag Region data file
    filter_region = (-100, -92, 25, 30)
    topotex = topo.crop(filter_region)

    pts_chosen = marching_front.select_by_flooding(topotex.Z,
                                                   Z1=0,
                                                   Z2=15.,
                                                   max_iters=None)

    Zmasked = ma.masked_array(topotex.Z, np.logical_not(pts_chosen))

    pts_chosen = marching_front.select_by_flooding(topotex.Z,
                                                   Z1=0,
                                                   Z2=1e6,
                                                   max_iters=20)

    Zmasked = ma.masked_array(topotex.Z, np.logical_not(pts_chosen))

    pts_chosen = marching_front.select_by_flooding(topotex.Z,
                                                   Z1=0,
                                                   Z2=15.,
                                                   prev_pts_chosen=pts_chosen,
                                                   max_iters=None)

    Zmasked = ma.masked_array(topotex.Z, np.logical_not(pts_chosen))

    pts_chosen_shallow = marching_front.select_by_flooding(topotex.Z,
                                                           Z1=0,
                                                           Z2=-15.,
                                                           max_iters=None)

    Zshallow = ma.masked_array(topotex.Z, np.logical_not(pts_chosen_shallow))

    pts_chosen_nearshore = np.logical_and(pts_chosen, pts_chosen_shallow)
    Znearshore = ma.masked_array(topotex.Z,
                                 np.logical_not(pts_chosen_nearshore))

    fname_fgmax_mask = 'fgmax_pts_topostyle.data'
    topo_fgmax_mask = topotools.Topography()
    topo_fgmax_mask._x = topotex.x
    topo_fgmax_mask._y = topotex.y
    topo_fgmax_mask._Z = np.where(pts_chosen_nearshore, 1,
                                  0)  # change boolean to 1/0
    topo_fgmax_mask.generate_2d_coordinates()

    topo_fgmax_mask.write(fname_fgmax_mask, topo_type=3, Z_format='%1i')

    rr = region_tools.ruledrectangle_covering_selected_points(
        topotex.X,
        topotex.Y,
        pts_chosen_nearshore,
        ixy='y',
        method=0,
        padding=0,
        verbose=True)
    xv, yv = rr.vertices()
    rr.write('texcoastrr.data')

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'harvey.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "http://ftp.nhc.noaa.gov/atcf/archive/2017/bal092017.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal092017.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Uncomment/comment out to use the old version of the Ike storm file
    # ike = Storm(path="old_ike.storm", file_format="ATCF")
    harvey = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    harvey.time_offset = datetime.datetime(2017, 8, 25, 10)

    harvey.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    # Texas gulf coast
    data.friction_regions.append([(-99.2, 26.4), (-94.2, 30.4),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata
예제 #18
0
def setgeo(rundata):
#-------------------
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    try:
        geo_data = rundata.geo_data
    except:
        print("*** Error, this rundata has no geodata attribute")
        raise AttributeError("Missing geodata attribute")
       
    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    geo_data.sea_level = 0.33
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, minlevel, maxlevel, t1, t2, fname]
    topo_path = '../bathy'

    topo_data.topofiles.append([3, 1, 3, days2seconds(-2), days2seconds(1), os.path.join(topo_path,'atlantic_1min.tt3')])
    topo_data.topofiles.append([3, 1, 3, days2seconds(-2), days2seconds(1), os.path.join(topo_path,'newyork_3s.tt3')])
    # restrict these make max lower and for all time
   # for file in glob.glob("../bathy/*.nc"):
    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x00_74x00.nc')])
    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x75_74x00.nc')])
   
    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x50_74x00.nc')])
    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x75_73x75.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x75_73x50.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x00_73x25.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'montauk_13.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x75_73x25.nc')])
    
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x25_74x00.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x25_73x75.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x25_73x50.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x25_73x25.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x00_73x75.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x00_73x50.nc')])
    
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc40x75_73x00.nc')])
#    topo_data.topofiles.append([4, 1, 6, days2seconds(-0.45),days2seconds(0.46),os.path.join(topo_path,'nc41x00_73x00.nc')])
 
    #print(topo_data.topofiles)

    
    # == setqinit.data values ==
    rundata.qinit_data.qinit_type = 0
    rundata.qinit_data.qinitfiles = []
    # for qinit perturbations, append lines of the form: (<= 1 allowed for now!)
    #   [minlev, maxlev, fname]

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters
    data.wind_refine = [20.0,40.0,60.0] # m/s
    data.R_refine = [60.0e3,40e3,20e3]  # m
    
    # Storm parameters
    data.storm_specification_type = "holland80" # Set type of storm field
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                                      'sandy.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
                   "http://ftp.nhc.noaa.gov/atcf/archive/2012/bal182012.dat.gz",
                   output_dir=os.getcwd())
    atcf_path = os.path.join(os.getcwd(), "bal182012.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file:
        with open(atcf_path, 'w') as atcf_unzipped_file:
            atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    sandy = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    sandy.time_offset = datetime.datetime(2012,10,30,0,0)

    sandy.write(data.storm_file, file_format='geoclaw')
    
    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain - seems high on land...
    data.friction_regions.append([rundata.clawdata.lower, 
                                  rundata.clawdata.upper,
                                  [np.infty,0.0,-np.infty],
                                  [0.050, 0.025]])

    
    return rundata
예제 #19
0
def setgeo(rundata):
    #-------------------
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    try:
        geo_data = rundata.geo_data
    except:
        print("*** Error, this rundata has no geo_data attribute")
        raise AttributeError("Missing geo_data attribute")

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 1
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = [1025.0 * 0.9, 1025.0]
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.theta_0 = 25.0  # Beta-plane approximation center
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement settings
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    # for topography, append lines of the form
    #    [topotype, minlevel, maxlevel, t1, t2, fname]
    topo_data.topofiles.append([2, 1, 5, -RAMP_UP_TIME, 1e10, 'topo.tt2'])

    # == setdtopo.data values ==
    dtopo_data = rundata.dtopo_data
    # for moving topography, append lines of the form :   (<= 1 allowed for now!)
    #   [topotype, minlevel,maxlevel,fname]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.wind_index = 2
    data.pressure_index = 4

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'fake.storm'))

    # Contruct storm
    forward_velocity = units.convert(20, 'km/h', 'm/s')
    theta = 0.0 * numpy.pi / 180.0  # degrees from horizontal to radians

    my_storm = Storm()

    # Take seconds and time period of 30 minutes and turn them into datatimes
    t_ref = datetime.datetime.now()
    t_sec = numpy.arange(-RAMP_UP_TIME, rundata.clawdata.tfinal, 30.0 * 60.0)
    my_storm.t = [t_ref + datetime.timedelta(seconds=t) for t in t_sec]

    ramp_func = lambda t: (t + (2 * RAMP_UP_TIME)) * (t < 0) / (2 * RAMP_UP_TIME) \
                          + numpy.ones(t_sec.shape) * (t >= 0)

    my_storm.time_offset = t_ref
    my_storm.eye_location = numpy.empty((t_sec.shape[0], 2))
    my_storm.eye_location[:, 0] = forward_velocity * t_sec * numpy.cos(theta)
    my_storm.eye_location[:, 1] = forward_velocity * t_sec * numpy.sin(theta)
    my_storm.max_wind_speed = units.convert(56, 'knots',
                                            'm/s') * ramp_func(t_sec)
    my_storm.central_pressure = units.convert(1024, "mbar", "Pa")  \
                                - (units.convert(1024, "mbar", "Pa")  \
                                   - units.convert(950, 'mbar', 'Pa'))  \
                                       * ramp_func(t_sec)
    my_storm.max_wind_radius = [units.convert(8, 'km', 'm')] * t_sec.shape[0]
    my_storm.storm_radius = [units.convert(100, 'km', 'm')] * t_sec.shape[0]

    my_storm.write(data.storm_file, file_format="geoclaw")

    # ======================
    #  Multi-layer settings
    # ======================
    data = rundata.multilayer_data

    # Physics parameters
    data.num_layers = 2
    data.eta = [0.0, -300.0]

    # Algorithm parameters
    data.eigen_method = 2
    data.inundation_method = 2
    data.richardson_tolerance = 1e10
    data.wave_tolerance = [0.1, 0.5]
    data.layer_index = 1

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = False
    data.friction_index = 1

    return rundata
예제 #20
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    topo_data.topofiles.append([3, 1, 3, rundata.clawdata.t0,
                                         rundata.clawdata.tfinal,
                                         '../bathy/atlantic_2min.tt3'])
    topo_data.topofiles.append([3, 1, 5, rundata.clawdata.t0,
                                         rundata.clawdata.tfinal,
                                         '../bathy/newyork_3s.tt3'])

    # == setqinit.data values ==
    rundata.qinit_data.qinit_type = 0

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls - These are currently not respected
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                         'sandy.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
                   "http://ftp.nhc.noaa.gov/atcf/archive/2012/bal182012.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal182012.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    sandy = Storm(path=atcf_path, file_format="ATCF", single_storm=True)

    # Calculate landfall time - Need to specify as the file above does not
    sandy.time_offset = datetime.datetime(2012, 10, 29, 8, 0)

    sandy.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([rundata.clawdata.lower,
                                  rundata.clawdata.upper,
                                  [np.infty, 0.0, -np.infty],
                                  [0.050, 0.025]])

    return rundata
예제 #21
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form:[topotype, minlevel, maxlevel, t1, t2, fname]
    # See regions for control over these regions, need better bathy data for the smaller domains
    # !!!!!!!!!!!!!!!!NEED TO MODIFY PATH HERE IF TESTING EXAMPLE!!!!!!!!!!!!!
    topo_path = os.path.join(
        "/home/socoyjonathan/clawpack_src/clawpack-v5.7.1/geoclaw/topograpy",
        "topography.asc")
    topo_data.topofiles.append(
        [3, 1, 5, rundata.clawdata.t0, rundata.clawdata.tfinal, topo_path])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True
    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'ophelia.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "https://ftp.nhc.noaa.gov/atcf/archive/2017/bal172017.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal172017.dat")

    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')),
                   'rb') as atcf_file, open(atcf_path,
                                            'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # ophelia = Storm(path="old_ophelia.storm", file_format="ATCF")
    ophelia = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # Ophelia landfall: 10/16/2017 ~ 1100 UTC
    ophelia.time_offset = datetime.datetime(2017, 10, 16, 11)

    ophelia.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    # UK
    data.friction_regions.append([(-10.5, 51.5), (0, 60),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata
예제 #22
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    topo_data.topo_missing = -32768
    # for topography, append lines of the form
    #   [topotype, minlevel, maxlevel, t1, t2, fname]
    # See regions for control over these regions, need better bathy data for
    # the smaller domains

    # Entire domain
    minlon = rundata.clawdata.lower[0]
    maxlon = rundata.clawdata.upper[0]
    minlat = rundata.clawdata.lower[1]
    maxlat = rundata.clawdata.upper[1]
    # ERDDAP Data Access Form call
    # ETOPO - 1 arcminute resolution
    topo_filename = f'etopo180.esriAscii?altitude[({minlat}):1:({maxlat})][({minlon}):1:({maxlon})]'
    topo_url = 'http://coastwatch.pfeg.noaa.gov/erddap/griddap/' + topo_filename
    clawutil.data.get_remote_file(topo_url)
    topo_path = os.path.join(scratch_dir, topo_filename)
    topo_data.topofiles.append(
        [3, 1, 5, rundata.clawdata.t0, rundata.clawdata.tfinal, topo_path])
    # Caribbean region
    # minlat = 9
    # maxlat = 28
    # minlon = -86
    # maxlon = -58
    # Break up into two regions

    # Caribbean region (NW)
    minlat = 16
    maxlat = 28
    minlon = -86
    maxlon = -68
    # ERDDAP Data Access Form call
    # SRTM15 - 15 arcsecond resolution
    # topo_filename = f'srtm15plus.esriAscii?z[({minlat}):1:({maxlat})][({minlon}):1:({maxlon})]'
    # GEBCO_2020 Grid - 15 arcsecond resolution
    topo_filename = f'GEBCO_2020.esriAscii?elevation[({minlat}):1:({maxlat})][({minlon}):1:({maxlon})]'
    topo_url = 'http://coastwatch.pfeg.noaa.gov/erddap/griddap/' + topo_filename
    clawutil.data.get_remote_file(topo_url)
    topo_path = os.path.join(scratch_dir, topo_filename)
    topo_data.topofiles.append([
        3, 1, rundata.amrdata.amr_levels_max, rundata.clawdata.t0,
        rundata.clawdata.tfinal, topo_path
    ])
    # Caribbean region (SE)
    minlat = 9
    maxlat = 21
    minlon = -69
    maxlon = -58
    # ERDDAP Data Access Form call
    # SRTM15 - 15 arcsecond resolution
    # topo_filename = f'srtm15plus.esriAscii?z[({minlat}):1:({maxlat})][({minlon}):1:({maxlon})]'
    # GEBCO_2020 Grid - 15 arcsecond resolution
    topo_filename = f'GEBCO_2020.esriAscii?elevation[({minlat}):1:({maxlat})][({minlon}):1:({maxlon})]'
    topo_url = 'http://coastwatch.pfeg.noaa.gov/erddap/griddap/' + topo_filename
    clawutil.data.get_remote_file(topo_url)
    topo_path = os.path.join(scratch_dir, topo_filename)
    topo_data.topofiles.append([
        3, 1, rundata.amrdata.amr_levels_max, rundata.clawdata.t0,
        rundata.clawdata.tfinal, topo_path
    ])
    # Virgin Islands High resolution
    # # High resolution (1 arcsec / 30m) Virgin Islands topo-bathy (roughly 2^-11 deg)
    # VI_highres_filename = 'usvi_1_mhw_2014.nc'
    # VI_highres_url = 'https://www.ngdc.noaa.gov/thredds/ncss/regional/' + VI_highres_filename
    # clawutil.data.get_remote_file(VI_highres_url)
    # # Note: for faster performance, crop this file to 17.5N to 18.5N x -65.1W to -64.3W
    # # gdal_translate -projwin -65.1 18.5 -64.3 17.5 usvi_1_mhw_2014.nc usvi_1_mhw_2014_crop.nc
    # # Note 2: for even faster performance, subsample to 60m resolution:
    # # gdalwarp -tr 0.00056 0.00056 -r cubic usvi_1_mhw_2014_crop.nc usvi_1_mhw_2014_crop_subsample.nc
    # # Then update the filename:
    # # VI_highres_filename = 'usvi_1_mhw_2014_crop_subsample.nc'
    # topo_path = os.path.join(scratch_dir, VI_highres_filename)
    # topo_data.topofiles.append([4, 1, 7, rundata.clawdata.t0,
    # rundata.clawdata.tfinal,
    # topo_path])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(
        os.path.join(os.getcwd(), 'tomas.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
        "http://ftp.nhc.noaa.gov/atcf/archive/2010/bal212010.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal212010.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    storm = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    #ike.time_offset = datetime.datetime(YYYY, MM, DD, HH in UTC)
    # "Landfall" for Irma at Virgin Islands was Sept 6, at ~ 18:00 UTC (2pm EST)
    # storm.time_offset = datetime.datetime(1979, 9, 6, 18)
    # Tomas developed from a tropical wave east of the Windward Islands on October 29
    # Data starts at 2010-10-29-06
    storm.time_offset = datetime.datetime(2010, 10, 30, 6)

    storm.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([
        rundata.clawdata.lower, rundata.clawdata.upper,
        [np.infty, 0.0, -np.infty], [0.030, 0.022]
    ])

    return rundata
예제 #23
0
파일: setrun.py 프로젝트: RunxinNi/geoclaw
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 1
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.theta_0 = 25.0 # Beta-plane approximation center
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, fname]
    topo_data.topofiles.append([2, 'topo.tt2'])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.wind_index = 2
    data.pressure_index = 4

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                         'fake.storm'))

    # Contruct storm
    forward_velocity = units.convert(20, 'km/h', 'm/s')
    theta = 0.0 * numpy.pi / 180.0 # degrees from horizontal to radians

    my_storm = Storm()
    
    # Take seconds and time period of 30 minutes and turn them into datatimes
    t_ref = datetime.datetime.now()
    t_sec = numpy.arange(-RAMP_UP_TIME, rundata.clawdata.tfinal, 30.0 * 60.0)
    my_storm.t = [t_ref + datetime.timedelta(seconds=t) for t in t_sec]

    ramp_func = lambda t: (t + (2 * RAMP_UP_TIME)) * (t < 0) / (2 * RAMP_UP_TIME) \
                          + numpy.ones(t_sec.shape) * (t >= 0)

    my_storm.time_offset = t_ref
    my_storm.eye_location = numpy.empty((t_sec.shape[0], 2))
    my_storm.eye_location[:, 0] = forward_velocity * t_sec * numpy.cos(theta)
    my_storm.eye_location[:, 1] = forward_velocity * t_sec * numpy.sin(theta)
    my_storm.max_wind_speed = units.convert(56, 'knots', 'm/s') * ramp_func(t_sec)
    my_storm.central_pressure = units.convert(1024, "mbar", "Pa")  \
                                - (units.convert(1024, "mbar", "Pa")  \
                                   - units.convert(950, 'mbar', 'Pa'))  \
                                       * ramp_func(t_sec)
    my_storm.max_wind_radius = [units.convert(8, 'km', 'm')] * t_sec.shape[0]
    my_storm.storm_radius = [units.convert(100, 'km', 'm')] * t_sec.shape[0]

    my_storm.write(data.storm_file, file_format="geoclaw")


    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = False
    data.friction_index = 1

    return rundata
예제 #24
0
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3

    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.manning_coefficient = 0.025 # Overridden below
    geo_data.friction_depth = 1e6

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.0
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 5e-1
    refine_data.speed_tolerance = [0.25,0.5,1.0,2.0,3.0,4.0]
    refine_data.deep_depth = 2e2
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.test_topography = 2
    topo_data.topofiles = []

    # Based on approximately 100 km = 1 degree of long
    # Based on approximately 110 km = 1 degree of lat
    # geodata.x0 = rundata.clawdata.lower[0] + 3.5
    # geodata.x1 = rundata.clawdata.lower[0] + 4.5
    # geodata.x2 = rundata.clawdata.lower[0] + 4.8
    topo_data.x0 = rundata.clawdata.lower[0] + 10
    topo_data.x1 = rundata.clawdata.lower[0] + 10.65
    topo_data.x2 = rundata.clawdata.lower[0] + 10.85

    topo_data.basin_depth = -3000.0
    # geodata.basin_depth = -100.0
    topo_data.shelf_depth = -200.0
    beach_height = 300.0
    topo_data.beach_slope = -(beach_height + topo_data.shelf_depth) / (rundata.clawdata.upper[0] - topo_data.x2)
    #topo_data.beach_slope = 0.05

    # == setqinit.data values ==
    rundata.qinit_data.qinit_type = 0

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 2
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                         'tracy.storm'))

    # Convert ATCF data to GeoClaw format
    #clawutil.data.get_remote_file(
    #               "http://ftp.nhc.noaa.gov/atcf/archive/2008/bal092008.dat.gz")
    #atcf_path = os.path.join(scratch_dir, "bal092008.dat")
    #atcf_path = os.path.join(os.getcwd(), 'tracy_atcf.storm')
    atcf_path = os.path.join(os.getcwd(), 'tracy_atcf_mwrx2.storm')
    ## Note that the get_remote_file function does not support gzip files which
    ## are not also tar files.  The following code handles this
    #with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
    #        open(atcf_path, 'w') as atcf_unzipped_file:
    #    atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Uncomment/comment out to use the old version of the Ike storm file
    tracy = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    tracy.time_offset = datetime.datetime(2008, 8, 1, 12)

    tracy.write(data.storm_file, file_format='geoclaw')
    
    ## Storm parameters, not written out but used to write the tracy.data file
    #data.ramp_up_t = days2seconds(RAMP_UP_TIME)
    ## Convert from 5.0 m/s to degrees/s at lat 25N
    #data.velocity = [4.9603e-05, 0.0]
    ## Assume domain (-90, 20) to (-85, 25) (W and N respectively)
    #data.R_eye_init = [-89, 22.5]
    #data.A = 23.0
    #data.B = 1.5
    #data.Pc = 950.0 * 1e2 # Have to convert this to Pa instead of millibars

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([rundata.clawdata.lower, 
                                  rundata.clawdata.upper,
                                  [np.infty,0.0,-np.infty],
                                  [0.030, 0.022]])

    return rundata
예제 #25
0
파일: setrun.py 프로젝트: rjleveque/geoclaw
def setgeo(rundata):
    """
    Set GeoClaw specific runtime parameters.
    For documentation see ....
    """

    geo_data = rundata.geo_data

    # == Physics ==
    geo_data.gravity = 9.81
    geo_data.coordinate_system = 2
    geo_data.earth_radius = 6367.5e3
    geo_data.rho = 1025.0
    geo_data.rho_air = 1.15
    geo_data.ambient_pressure = 101.3e3

    # == Forcing Options
    geo_data.coriolis_forcing = True
    geo_data.friction_forcing = True
    geo_data.friction_depth = 1e10

    # == Algorithm and Initial Conditions ==
    # Due to seasonal swelling of gulf we set sea level higher
    geo_data.sea_level = 0.28
    geo_data.dry_tolerance = 1.e-2

    # Refinement Criteria
    refine_data = rundata.refinement_data
    refine_data.wave_tolerance = 1.0
    refine_data.speed_tolerance = [1.0, 2.0, 3.0, 4.0]
    refine_data.deep_depth = 300.0
    refine_data.max_level_deep = 4
    refine_data.variable_dt_refinement_ratios = True

    # == settopo.data values ==
    topo_data = rundata.topo_data
    topo_data.topofiles = []
    # for topography, append lines of the form
    #   [topotype, minlevel, maxlevel, t1, t2, fname]
    # See regions for control over these regions, need better bathy data for
    # the smaller domains
    clawutil.data.get_remote_file(
           "http://www.columbia.edu/~ktm2132/bathy/gulf_caribbean.tt3.tar.bz2")
    topo_path = os.path.join(scratch_dir, 'gulf_caribbean.tt3')
    topo_data.topofiles.append([3, 1, 5, rundata.clawdata.t0,
                                rundata.clawdata.tfinal,
                                topo_path])

    # == setfixedgrids.data values ==
    rundata.fixed_grid_data.fixedgrids = []
    # for fixed grids append lines of the form
    # [t1,t2,noutput,x1,x2,y1,y2,xpoints,ypoints,\
    #  ioutarrivaltimes,ioutsurfacemax]

    # ================
    #  Set Surge Data
    # ================
    data = rundata.surge_data

    # Source term controls
    data.wind_forcing = True
    data.drag_law = 1
    data.pressure_forcing = True

    data.display_landfall_time = True

    # AMR parameters, m/s and m respectively
    data.wind_refine = [20.0, 40.0, 60.0]
    data.R_refine = [60.0e3, 40e3, 20e3]

    # Storm parameters - Parameterized storm (Holland 1980)
    data.storm_specification_type = 'holland80'  # (type 1)
    data.storm_file = os.path.expandvars(os.path.join(os.getcwd(),
                                         'ike.storm'))

    # Convert ATCF data to GeoClaw format
    clawutil.data.get_remote_file(
                   "http://ftp.nhc.noaa.gov/atcf/archive/2008/bal092008.dat.gz")
    atcf_path = os.path.join(scratch_dir, "bal092008.dat")
    # Note that the get_remote_file function does not support gzip files which
    # are not also tar files.  The following code handles this
    with gzip.open(".".join((atcf_path, 'gz')), 'rb') as atcf_file,    \
            open(atcf_path, 'w') as atcf_unzipped_file:
        atcf_unzipped_file.write(atcf_file.read().decode('ascii'))

    # Uncomment/comment out to use the old version of the Ike storm file
    # ike = Storm(path="old_ike.storm", file_format="ATCF")
    ike = Storm(path=atcf_path, file_format="ATCF")

    # Calculate landfall time - Need to specify as the file above does not
    # include this info (9/13/2008 ~ 7 UTC)
    ike.time_offset = datetime.datetime(2008, 9, 13, 7)

    ike.write(data.storm_file, file_format='geoclaw')

    # =======================
    #  Set Variable Friction
    # =======================
    data = rundata.friction_data

    # Variable friction
    data.variable_friction = True

    # Region based friction
    # Entire domain
    data.friction_regions.append([rundata.clawdata.lower,
                                  rundata.clawdata.upper,
                                  [np.infty, 0.0, -np.infty],
                                  [0.030, 0.022]])

    # La-Tex Shelf
    data.friction_regions.append([(-98, 25.25), (-90, 30),
                                  [np.infty, -10.0, -200.0, -np.infty],
                                  [0.030, 0.012, 0.022]])

    return rundata