def test2(self):
        bathymetry = read_bot_data()
        bathymetry = numpy.array(bathymetry, dtype="float32")

        s = Swan(redirection="none")

        mxc = 98
        myc = 88
        msc = 32
        mdc = 36

        s.parameters.grid_origin_x = 6960.2 | units.m
        s.parameters.grid_origin_y = 0. | units.m
        s.parameters.grid_orientation = 0. | units.deg
        s.parameters.grid_length_x = 14789.8 | units.m
        s.parameters.grid_length_y = 22000. | units.m
        s.parameters.grid_nmesh_x = mxc
        s.parameters.grid_nmesh_y = myc
        s.parameters.number_of_directions = mdc
        s.parameters.number_of_frequencies = msc
        s.parameters.lowest_frequency = 2 * numpy.pi * 0.0521 | units.rad / units.s
        s.parameters.highest_frequency = 2 * numpy.pi | units.rad / units.s

        s.parameters.input_grid_origin_x = 0. | units.m
        s.parameters.input_grid_origin_y = 0. | units.m
        s.parameters.input_grid_orientation = 0. | units.deg
        s.parameters.input_grid_dx = 250. | units.m
        s.parameters.input_grid_dy = 250. | units.m
        s.parameters.input_grid_nmesh_x = 87
        s.parameters.input_grid_nmesh_y = 116

        s.parameters.constant_water_level = 0.3 | units.m

        s.parameters.uniform_wind_velocity = 12. | units.m / units.s
        s.parameters.uniform_wind_direction = 8.8 | units.deg

        s.parameters.west_boundary_spec_file = "f31har01.bnd"

        s.parameters.use_gen3_parameters = True
        s.parameters.use_breaking_parameters = True
        s.parameters.use_triads_parameters = True
        s.parameters.use_friction_parameters = True

        exc = s.get_exc_value(1)

        bathymetry[bathymetry == -99.] = exc

        input_shape = bathymetry.shape
        ii, jj = numpy.mgrid[1:input_shape[0] + 1, 1:input_shape[1] + 1]

        #~ s.commit_parameters()
        print s.forcings

        s.forcings.depth = bathymetry | units.m

        s.evolve_model(0. | units.s)

        write_set_to_file(s.grid, "grid.amuse", "amuse", append_to_file=False)
Exemple #2
0
def rectangle(**kwargs):
    print "calculating..."

    L = kwargs.get("L", 100 | units.km)
    N = kwargs.get("N", 100)
    flow = kwargs.get("flow", 0.0521 | units.rev / units.s)
    fhigh = kwargs.get("fhigh", 1. | units.rev / units.s)
    u10 = kwargs.get("u10", 10. | units.m / units.s)
    aspect = kwargs.get("aspect", 0.2)
    depth = kwargs.get("depth", 100 | units.m)
    msc = kwargs.get("msc", 32)
    mdc = kwargs.get("mdc", 36)

    s = Swan()

    s.parameters.grid_origin_x = 0. | units.m
    s.parameters.grid_origin_y = 0. | units.m
    s.parameters.grid_orientation = 0. | units.deg
    s.parameters.grid_length_x = aspect * L
    s.parameters.grid_length_y = L
    s.parameters.grid_nmesh_x = int(aspect * N)
    s.parameters.grid_nmesh_y = N
    s.parameters.number_of_directions = mdc
    s.parameters.number_of_frequencies = msc
    s.parameters.lowest_frequency = flow
    s.parameters.highest_frequency = fhigh

    s.parameters.input_grid_origin_x = 0. | units.m
    s.parameters.input_grid_origin_y = 0. | units.m
    s.parameters.input_grid_orientation = 0. | units.deg
    s.parameters.input_grid_dx = L / N
    s.parameters.input_grid_dy = L / N
    s.parameters.input_grid_nmesh_x = int(aspect * N)
    s.parameters.input_grid_nmesh_y = N

    s.parameters.uniform_wind_velocity = u10
    s.parameters.uniform_wind_direction = 90. | units.deg

    s.parameters.wrap_x_coordinate = True

    s.parameters.use_gen3_parameters = True
    s.parameters.use_breaking_parameters = True
    s.parameters.use_triads_parameters = True
    s.parameters.use_friction_parameters = True

    s.forcings.depth = depth

    s.evolve_model(0. | units.s)

    label = str(abs(hash(str(kwargs))))
    with open(label + ".args", "w") as f:
        cPickle.dump(kwargs, f)
    write_set_to_file(s.grid, label + ".amuse", "amuse", append_to_file=False)
    print "done"
Exemple #3
0
    def test4(self):
        options = dict(coordinates="spherical")
        options.update(default_options)
        s = Swan(**options)
        u = s.parameters.grid_origin_x
        v = s.parameters.grid_length_x
        self.assertEqual(u, 0 | units.deg)
        self.assertEqual(v, 0 | units.deg)

        s.parameters.grid_origin_x = 0. | units.deg
        s.parameters.grid_origin_y = 0. | units.deg
        s.parameters.grid_orientation = 0. | units.deg
        s.parameters.grid_length_x = 1. | units.deg
        s.parameters.grid_length_y = 1. | units.deg
        s.parameters.grid_nmesh_x = 10
        s.parameters.grid_nmesh_y = 10
        s.parameters.number_of_directions = 36
        s.parameters.number_of_frequencies = 32
        s.parameters.lowest_frequency = 2 * numpy.pi * 0.0521 | units.rad / units.s
        s.parameters.highest_frequency = 2 * numpy.pi | units.rad / units.s

        s.parameters.input_grid_origin_x = 0. | units.deg
        s.parameters.input_grid_origin_y = 0. | units.deg
        s.parameters.input_grid_orientation = 0. | units.deg
        s.parameters.input_grid_dx = 0.1 | units.deg
        s.parameters.input_grid_dy = 0.1 | units.deg
        s.parameters.input_grid_nmesh_x = 10
        s.parameters.input_grid_nmesh_y = 10

        self.assertEqual(s.grid.lat.unit, units.deg)
        self.assertEqual(s.forcings.lat.unit, units.deg)
Exemple #4
0
 def test3(self):
     options = dict(coordinates="spherical")
     options.update(default_options)
     s = Swan(**options)
     u = s.parameters.grid_origin_x
     v = s.parameters.grid_length_x
     self.assertEqual(u, 0 | units.deg)
     self.assertEqual(v, 0 | units.deg)
    def initialize_swan(self):
        swan = Swan(grid_type="unstructured",
                    input_grid_type="unstructured",
                    mode="dynamic",
                    coordinates="spherical")

        swan.parameters.number_of_cells = len(self.elements)
        swan.parameters.number_of_vertices = len(self.nodes)
        swan.parameters.number_of_directions = self._mdc
        swan.parameters.number_of_frequencies = self._msc
        swan.parameters.lowest_frequency = self._flow
        swan.parameters.highest_frequency = self._fhigh

        swan.parameters.use_gen3_parameters = True
        swan.parameters.use_breaking_parameters = True
        swan.parameters.use_triads_parameters = True
        swan.parameters.use_friction_parameters = True

        swan.parameters.use_input_wind = True
        swan.parameters.use_input_current = False
        swan.parameters.use_input_water_level = False

        swan.parameters.use_csigma_cfl_limiter = True
        swan.parameters.use_ctheta_cfl_limiter = True

        swan.parameters.timestep = self._dt

        channel = self.nodes.new_channel_to(swan.nodes)
        channel.copy_attributes(["lon", "lat", "vmark"])
        channel = self.elements.new_channel_to(swan.elements)
        channel.copy_attributes(["n1", "n2", "n3"])

        forcings = swan.forcings.empty_copy()

        forcings.depth = self.nodes.depth
        forcings.wind_vx = 0. | units.m / units.s
        forcings.wind_vy = 0. | units.m / units.s

        channel = forcings.new_channel_to(swan.forcings)
        channel.copy_attributes(["depth", "wind_vx", "wind_vy"])

        self.swan = swan

        self.meteo_to_swan = self.meteo.grid.new_remapping_channel_to(
            self.swan.forcings, interpolating_lonlat_remapper)
        self.meteo_to_nodes = self.meteo.grid.new_remapping_channel_to(
            self.nodes, interpolating_lonlat_remapper)
Exemple #6
0
def swan_eq(**kwargs):

    grav = kwargs["grav"]
    rho_air = kwargs["rho_air"]
    rho_water = kwargs["rho_water"]
    flow = kwargs["flow"]
    fhigh = kwargs["fhigh"]
    u10 = kwargs["u10"]
    udir = kwargs["udir"]
    gridname = kwargs["gridname"]
    coord = kwargs["coord"]
    depth = kwargs["depth"]
    visc = kwargs["viscosity"]
    planetary_radius = kwargs["planetary_radius"]
    pixel_scale = kwargs["pixel_scale"]
    under_relaxation_factor = kwargs["under_relaxation_factor"]
    msc = kwargs["msc"]
    mdc = kwargs["mdc"]

    print(kwargs)

    nodes = read_set_from_file("kraken_nodes", "amuse", close_file=True)
    elements = read_set_from_file("kraken_elements", "amuse", close_file=True)

    s = Swan(grid_type="unstructured",
             input_grid_type="unstructured",
             redirection="none",
             coordinates=coord)

    s.parameters.gravitational_acceleration = grav
    s.parameters.air_density = rho_air
    s.parameters.water_density = rho_water
    s.parameters.planetary_radius = planetary_radius
    s.parameters.maximum_error_level = 2
    s.parameters.under_relaxation_factor = under_relaxation_factor

    ncells = len(elements)
    nverts = len(nodes)

    s.parameters.number_of_cells = ncells
    s.parameters.number_of_vertices = nverts
    s.parameters.number_of_directions = mdc
    s.parameters.number_of_frequencies = msc
    s.parameters.lowest_frequency = flow
    s.parameters.highest_frequency = fhigh
    s.parameters.minimum_wind_speed = 0.1 | units.m / units.s
    s.parameters.max_iterations_stationary = 50
    s.parameters.use_gen3_parameters = True
    s.parameters.use_breaking_parameters = True
    s.parameters.use_triads_parameters = True
    s.parameters.use_friction_parameters = True
    s.parameters.use_input_wind = True

    if visc.number > 0:
        s.parameters.use_input_turbulent_visc = True
        s.parameters.turbulent_viscosity_factor = 1.

    #~ s.parameters.uniform_wind_velocity=u10
    #~ s.parameters.uniform_wind_direction=udir

    print(s.parameters)
    #~ raise

    channel = nodes.new_channel_to(s.nodes)
    if coord == "spherical":
        channel.copy_attributes(["lon", "lat", "vmark"])
    else:
        channel.transform(["x", "y", "vmark"], lambda x, y, z:
                          (x * pixel_scale, y * pixel_scale, z),
                          ["x", "y", "vmark"])
        #~ channel.copy_attributes(["x","y","vmark"])
    channel = elements.new_channel_to(s.elements)
    channel.copy_attributes(["n1", "n2", "n3"])

    #~ print abs(s.nodes.lon-nodes.lon).max()
    #~ print abs(s.nodes.lat-nodes.lat).max()

    forcings = s.forcings.empty_copy()

    if depth == "default":
        forcings.depth = nodes.depth
    elif depth == "x2":
        forcings.depth = nodes.depth * 2
    elif depth == "x10":
        forcings.depth = nodes.depth * 10
    elif depth == "sqrt":
        maxdepth = nodes.depth.max()
        forcings.depth = maxdepth * (nodes.depth / maxdepth)**0.5
    else:
        raise Exception("unknown depth option")

    wind_vx = u10 * cos(udir)
    wind_vy = u10 * sin(udir)

    if coord == "spherical":
        forcings.wind_vx = wind_vx
        forcings.wind_vy = wind_vy
    else:
        forcings.wind_vx = wind_vx * sin(nodes.lon) + wind_vy * cos(nodes.lon)
        forcings.wind_vy = -wind_vx * cos(nodes.lon) + wind_vy * sin(nodes.lon)

        #~ pyplot.quiver(s.forcings.x.number,s.forcings.y.number,
        #~ forcings.wind_vx.number,forcings.wind_vy.number, scale=50)
        #~ pyplot.show()
        #~ raise

    if visc.number > 0:
        forcings.visc = visc
        forcings.new_channel_to(s.forcings).copy_attributes(
            ["depth", "wind_vx", "wind_vy", "visc"])
    else:
        forcings.new_channel_to(s.forcings).copy_attributes(
            ["depth", "wind_vx", "wind_vy"])

    s.evolve_model(0. | units.s)

    label = runlabel(**kwargs)
    print("label:", label)
    with open("args_" + label + ".pkl", "w") as f:
        pickle.dump(kwargs, f)
    write_set_to_file(s.nodes,
                      gridname + "_nodes_eq_" + label + ".amuse",
                      "amuse",
                      append_to_file=False)
Exemple #7
0
    def test2(self):
        bathymetry = read_bot_data()
        bathymetry = numpy.array(bathymetry, dtype="float32")

        rt = read_triangle_mesh("f32hari")
        rt.read_grid()
        nodes, elements = rt.get_sets()

        s = Swan(grid_type="unstructured", redirection="none")

        ncells = len(elements)
        nverts = len(nodes)
        msc = 32
        mdc = 36

        s.parameters.number_of_cells = ncells
        s.parameters.number_of_vertices = nverts
        s.parameters.number_of_directions = mdc
        s.parameters.number_of_frequencies = msc
        s.parameters.lowest_frequency = 2 * numpy.pi * 0.0521 | units.rad / units.s
        s.parameters.highest_frequency = 2 * numpy.pi | units.rad / units.s

        s.parameters.input_grid_origin_x = 0. | units.m
        s.parameters.input_grid_origin_y = 0. | units.m
        s.parameters.input_grid_orientation = 0. | units.deg
        s.parameters.input_grid_dx = 250. | units.m
        s.parameters.input_grid_dy = 250. | units.m
        s.parameters.input_grid_nmesh_x = 87
        s.parameters.input_grid_nmesh_y = 116

        s.parameters.constant_water_level = 0.3 | units.m

        s.parameters.unstructured_boundary_spec_file = "f31har01.bnd"
        s.parameters.boundary_marker = 2

        s.parameters.use_gen3_parameters = True
        s.parameters.use_breaking_parameters = True
        s.parameters.use_triads_parameters = True
        s.parameters.use_friction_parameters = True
        s.parameters.use_input_wind = True

        exc = s.get_exc_value(1)

        bathymetry[bathymetry == -99.] = exc
        input_shape = bathymetry.shape
        ii, jj = numpy.mgrid[1:input_shape[0] + 1, 1:input_shape[1] + 1]

        channel = nodes.new_channel_to(s.nodes)
        channel.copy_attributes(["x", "y", "vmark"])
        channel = elements.new_channel_to(s.elements)
        channel.copy_attributes(["n1", "n2", "n3"])

        u10 = 12. | units.m / units.s
        wdir = 8.8 | units.deg

        forcings = s.forcings.empty_copy()

        forcings.depth = bathymetry | units.m
        forcings.wind_vx = u10 * numpy.cos(wdir.value_in(units.rad))
        forcings.wind_vy = u10 * numpy.sin(wdir.value_in(units.rad))

        forcings.new_channel_to(s.forcings).copy_attributes(
            ["depth", "wind_vx", "wind_vy"])

        print s.forcings

        s.evolve_model(0. | units.s)

        write_set_to_file(s.nodes,
                          "nodes.amuse",
                          "amuse",
                          append_to_file="False")
        write_set_to_file(s.elements,
                          "elements.amuse",
                          "amuse",
                          append_to_file="False")
Exemple #8
0
def rectangle(**kwargs):
    print("kwargs:", kwargs)
    label = runlabel(**kwargs)
    print("label:", label)

    grav = kwargs["grav"]
    rho_air = kwargs["rho_air"]
    rho_water = kwargs["rho_water"]
    L = kwargs["L"]
    N = kwargs["N"]
    flow = kwargs["flow"]
    fhigh = kwargs["fhigh"]
    u10 = kwargs["u10"]
    aspect = kwargs["aspect"]
    depth = kwargs["depth"]
    under_relaxation_factor = kwargs["under_relaxation_factor"]
    msc = kwargs["msc"]
    mdc = kwargs["mdc"]
    visc = kwargs["viscosity"]

    s = Swan(redirection="none")

    s.parameters.gravitational_acceleration = grav
    s.parameters.air_density = rho_air
    s.parameters.water_density = rho_water
    #~ s.parameters.maximum_error_level=2
    s.parameters.under_relaxation_factor = under_relaxation_factor

    s.parameters.grid_origin_x = 0. | units.m
    s.parameters.grid_origin_y = 0. | units.m
    s.parameters.grid_orientation = 0. | units.deg
    s.parameters.grid_length_x = aspect * L
    s.parameters.grid_length_y = L
    s.parameters.grid_nmesh_x = int(aspect * N)
    s.parameters.grid_nmesh_y = N
    s.parameters.number_of_directions = mdc
    s.parameters.number_of_frequencies = msc
    s.parameters.lowest_frequency = flow
    s.parameters.highest_frequency = fhigh
    s.parameters.minimum_wind_speed = 0.1 | units.m / units.s

    s.parameters.input_grid_origin_x = 0. | units.m
    s.parameters.input_grid_origin_y = 0. | units.m
    s.parameters.input_grid_orientation = 0. | units.deg
    s.parameters.input_grid_dx = L / N
    s.parameters.input_grid_dy = L / N
    s.parameters.input_grid_nmesh_x = int(aspect * N)
    s.parameters.input_grid_nmesh_y = N

    s.parameters.uniform_wind_velocity = u10
    s.parameters.uniform_wind_direction = 90. | units.deg

    s.parameters.wrap_x_coordinate = True

    if visc.number > 0:
        s.parameters.use_input_turbulent_visc = True
        s.parameters.turbulent_viscosity_factor = 1.

    s.parameters.use_gen3_parameters = True
    s.parameters.use_breaking_parameters = True
    s.parameters.use_triads_parameters = True
    s.parameters.use_friction_parameters = True

    s.forcings.depth = depth
    if visc.number > 0:
        s.forcings.visc = visc

    s.evolve_model(0. | units.s)

    with open(label + ".args", "w") as f:
        pickle.dump(kwargs, f)
    write_set_to_file(s.grid.copy(),
                      label + ".amuse",
                      "amuse",
                      append_to_file=False)
Exemple #9
0
 def test2(self):
     options = dict(coordinates="cartesian")
     options.update(default_options)
     s = Swan(**options)
     u = s.parameters.grid_origin_x
     self.assertEqual(u, 0 | units.m)
Exemple #10
0
 def test1(self):
     s = Swan(**default_options)
     print s.parameters
def TestHaringvliet_Zijlema2010(flow=0.0521 | units.rev / units.s,
                                fhigh=1. | units.rev / units.s,
                                msc=32,
                                mdc=36):

    bathymetry = read_bot_data()
    bathymetry = numpy.array(bathymetry, dtype="float32")

    rt = read_triangle_mesh("f32hari")
    rt.read_grid()
    nodes, elements = rt.get_sets()

    ncells = len(elements)
    nverts = len(nodes)

    s = Swan(grid_type="unstructured", redirection="none")

    s.parameters.number_of_cells = ncells
    s.parameters.number_of_vertices = nverts
    s.parameters.number_of_directions = mdc
    s.parameters.number_of_frequencies = msc
    s.parameters.lowest_frequency = flow
    s.parameters.highest_frequency = fhigh

    s.parameters.input_grid_origin_x = 0. | units.m
    s.parameters.input_grid_origin_y = 0. | units.m
    s.parameters.input_grid_orientation = 0. | units.deg
    s.parameters.input_grid_dx = 250. | units.m
    s.parameters.input_grid_dy = 250. | units.m
    s.parameters.input_grid_nmesh_x = 87
    s.parameters.input_grid_nmesh_y = 116

    s.parameters.constant_water_level = 1.7 | units.m

    s.parameters.uniform_wind_velocity = 14. | units.m / units.s
    s.parameters.uniform_wind_direction = 8.8 | units.deg

    s.parameters.unstructured_boundary_spec_file = "f31har03.bnd"
    s.parameters.boundary_marker = 2

    s.parameters.use_gen3_parameters = True
    s.parameters.use_breaking_parameters = True
    s.parameters.use_triads_parameters = True
    s.parameters.use_friction_parameters = True
    s.parameters.use_input_wind = False

    exc = s.get_exc_value(1)
    bathymetry[bathymetry == -99.] = exc

    channel = nodes.new_channel_to(s.nodes)
    channel.copy_attributes(["x", "y", "vmark"])
    channel = elements.new_channel_to(s.elements)
    channel.copy_attributes(["n1", "n2", "n3"])

    s.forcings.depth = bathymetry | units.m

    print "calculating equilibrium...(this may take a while)"
    s.evolve_model(0. | units.s)

    write_set_to_file(s.nodes, "nodes.amuse", "amuse", append_to_file=False)
    write_set_to_file(s.elements,
                      "elements.amuse",
                      "amuse",
                      append_to_file=False)

    s.stop()