def run_one_step(self): """Calculate the tidal flow field and water-surface elevation.""" # Tidal mean water depth and water surface elevation at nodes # (Note: mean water surf elev only used for boundary conditions in # matrix construction; should be mean sea level) self._calc_effective_water_depth() self._boundary_mean_water_surf_elev[:] = self._mean_sea_level # Map water depth to links map_min_of_link_nodes_to_link(self.grid, self._water_depth, out=self._water_depth_at_links) # Calculate velocity and diffusion coefficients on links velocity_coef = self._water_depth_at_links**_FOUR_THIRDS / ( (self.roughness**2) * self._scale_velocity) self._diffusion_coef_at_links[:] = self._water_depth_at_links * velocity_coef # Calculate inundation / drainage rate at nodes tidal_inundation_rate = self.calc_tidal_inundation_rate() # Set up right-hand-side (RHS) vector for both ebb and flood tides (only # difference is in the sign) cores = self.grid.core_nodes # For flood tide, set up matrix and add boundary info to RHS vector # mat, rhs = make_core_node_matrix_var_coef( mat, rhs = get_core_node_matrix( self.grid, self._boundary_mean_water_surf_elev, coef_at_link=self._diffusion_coef_at_links, ) rhs[:, 0] += self._grid_multiplier * tidal_inundation_rate[cores] # Solve for flood tide water-surface elevation tidal_wse = np.zeros(self.grid.number_of_nodes) tidal_wse[self.grid.core_nodes] = spsolve(mat, rhs) # Calculate flood-tide water-surface gradient at links tidal_wse_grad = np.zeros(self.grid.number_of_links) self.grid.calc_grad_at_link(tidal_wse, out=tidal_wse_grad) # Calculate flow velocity field at links for flood tide, and assign # negative of the flood tide values to ebb tide self._flood_tide_vel[self.grid.active_links] = ( -velocity_coef[self.grid.active_links] * tidal_wse_grad[self.grid.active_links]) self._ebb_tide_vel[:] = -self._flood_tide_vel
def test_min(self): rmg = RasterModelGrid(4, 5) rmg.add_empty('node', 'values') node_values = rmg.at_node['values'] node_values[:] = np.arange(rmg.number_of_nodes) values_at_links = maps.map_min_of_link_nodes_to_link(rmg, 'values') assert_array_equal( values_at_links, np.array([ 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 13, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]))
def test_min(self): rmg = RasterModelGrid(4, 5) rmg.add_empty('node', 'values') node_values = rmg.at_node['values'] node_values[:] = np.arange(rmg.number_of_nodes) values_at_links = maps.map_min_of_link_nodes_to_link(rmg, 'values') assert_array_equal( values_at_links, np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18 ]))
def test_min(self): rmg = RasterModelGrid((4, 5)) rmg.add_empty("node", "values") node_values = rmg.at_node["values"] node_values[:] = np.arange(rmg.number_of_nodes) values_at_links = maps.map_min_of_link_nodes_to_link(rmg, "values") assert_array_equal( values_at_links, np.array( [ 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 13, 10, 11, 12, 13, 14, 15, 16, 17, 18, ] ), )
def test_min(self): rmg = RasterModelGrid((4, 5)) rmg.add_empty("values", at="node") node_values = rmg.at_node["values"] node_values[:] = np.arange(rmg.number_of_nodes) values_at_links = maps.map_min_of_link_nodes_to_link(rmg, "values") assert_array_equal( values_at_links, np.array([ 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 13, 10, 11, 12, 13, 14, 15, 16, 17, 18, ]), )