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)
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"
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)
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)
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)
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")
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)
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)
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()