def test_get_velocity_in_surface_layer_on_a_boundary(self): x1 = self.deg_to_radians * 2.0 x2 = self.deg_to_radians * 13.0 host_elements = {'arakawa_a': 5} # Test #1 x3 = 0.0 # Surface time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) test.assert_equal(flag, 0) vel = np.empty(3, dtype=DTYPE_FLOAT) self.data_reader.get_velocity_wrapper(time, particle, vel) test.assert_array_almost_equal(vel, [1., 1., 1.]) # Test #2 x3 = -5.0 # Half way down the surface layer time = 1800.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) vel = np.empty(3, dtype=DTYPE_FLOAT) self.data_reader.get_velocity_wrapper(time, particle, vel) test.assert_equal(flag, 0) test.assert_array_almost_equal(vel, [0.5, 0.5, 0.5])
def test_find_host_when_particle_is_in_the_domain(self): particle_old = ParticleSmartPtr( x1=self.deg_to_radians * 2.25 - self.xmin, x2=self.deg_to_radians * 12.6 - self.ymin, host_elements={ 'grid_psi': 0, 'grid_rho': 6, 'grid_u': 3, 'grid_v': 3 }) particle_new = ParticleSmartPtr( x1=self.deg_to_radians * 1.75 - self.xmin, x2=self.deg_to_radians * 12.6 - self.ymin, host_elements={ 'grid_psi': -999, 'grid_rho': -999, 'grid_u': -999, 'grid_v': -999 }) flag = self.data_reader.find_host_wrapper(particle_old, particle_new) test.assert_equal(flag, 0) test.assert_equal(particle_new.get_host_horizontal_elem('grid_psi'), 0) test.assert_equal(particle_new.get_host_horizontal_elem('grid_rho'), 2) test.assert_equal(particle_new.get_host_horizontal_elem('grid_u'), 3) test.assert_equal(particle_new.get_host_horizontal_elem('grid_v'), 0)
def test_get_velocity_in_middle_layer(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} # Test #1 x3 = -2.6 time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) vel = np.empty(3, dtype=DTYPE_FLOAT) self.data_reader.get_velocity_wrapper(time, particle, vel) test.assert_equal(flag, 0) test.assert_array_almost_equal(vel, [1.5, 1.5, 1.5]) # Test #2 x3 = -2.25 time = 1800.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) vel = np.empty(3, dtype=DTYPE_FLOAT) self.data_reader.get_velocity_wrapper(time, particle, vel) test.assert_equal(flag, 0) test.assert_array_almost_equal(vel, [2.25, 2.25, 2.25])
def test_reflect_particle_that_undergoes_a_double_reflection_while_on_a_southeast_trajectory(self): particle_old = ParticleSmartPtr(x1=1.8 - self.xmin, x2=1.1 - self.ymin, host_elements={'fvcom': 1}) particle_new = ParticleSmartPtr(x1=2.1 - self.xmin, x2=0.8 - self.ymin, host_elements={'fvcom': 1}) flag = self.horiz_boundary_condition_calculator.apply_wrapper(self.data_reader, particle_old, particle_new) test.assert_equal(flag, 0) test.assert_equal(particle_new.x1 + self.xmin, 1.9) test.assert_equal(particle_new.x2 + self.ymin, 1.2) test.assert_equal(particle_new.get_host_horizontal_elem('fvcom'), 1)
def test_reflect_particle_that_sits_on_the_boundary(self): particle_old = ParticleSmartPtr(x1=1.5 - self.xmin, x2=1.0 - self.ymin, host_elements={'fvcom': 1}) particle_new = ParticleSmartPtr(x1=1.6 - self.xmin, x2=0.9 - self.ymin, host_elements={'fvcom': 1}) flag = self.horiz_boundary_condition_calculator.apply_wrapper(self.data_reader, particle_old, particle_new) test.assert_equal(flag, 0) test.assert_equal(particle_new.x1 + self.xmin, 1.6) test.assert_equal(particle_new.x2 + self.ymin, 1.1) test.assert_equal(particle_new.get_host_horizontal_elem('fvcom'), 1)
def test_find_host_using_global_search(self): particle = ParticleSmartPtr(x1=self.deg_to_radians * 2.25 - self.xmin, x2=self.deg_to_radians * 12.6 - self.ymin) flag = self.data_reader.find_host_using_global_search_wrapper(particle) test.assert_equal(flag, 0) test.assert_equal(particle.get_host_horizontal_elem('grid_psi'), 0) test.assert_equal(particle.get_host_horizontal_elem('grid_rho'), 6) test.assert_equal(particle.get_host_horizontal_elem('grid_u'), 3) test.assert_equal(particle.get_host_horizontal_elem('grid_v'), 3)
def test_get_boundary_intersection_when_a_particle_has_moved_to_an_external_elements_edge(self): particle_old = ParticleSmartPtr(x1=1.5-self.xmin, x2=1.1-self.ymin, host_elements={'fvcom': 1}) particle_new = ParticleSmartPtr(x1=1.5-self.xmin, x2=1.0-self.ymin, host_elements={'fvcom': 1}) start_point, end_point, intersection = self.data_reader.get_boundary_intersection_wrapper(particle_old, particle_new) test.assert_almost_equal(start_point[0]+self.xmin, 2.0) test.assert_almost_equal(start_point[1]+self.ymin, 1.0) test.assert_almost_equal(end_point[0]+self.xmin, 1.0) test.assert_almost_equal(end_point[1]+self.ymin, 1.0) test.assert_almost_equal(intersection[0]+self.xmin, 1.5) test.assert_almost_equal(intersection[1]+self.ymin, 1.0)
def test_get_boundary_intersection(self): particle_old = ParticleSmartPtr(x1=1.6666666667, x2=1.3333333333, host_elements={'test_grid': 1}) particle_new = ParticleSmartPtr(x1=1.6666666667, x2=0.9, host_elements={'test_grid': 1}) start_point, end_point, intersection = self.unstructured_grid.get_boundary_intersection_wrapper(particle_old, particle_new) test.assert_almost_equal(start_point[0], 2.0) test.assert_almost_equal(start_point[1], 1.0) test.assert_almost_equal(end_point[0], 1.0) test.assert_almost_equal(end_point[1], 1.0) test.assert_almost_equal(intersection[0], 1.6666666667) test.assert_almost_equal(intersection[1], 1.0)
def test_get_boundary_intersection_when_a_particle_has_moved_to_an_external_elements_edge(self): particle_old = ParticleSmartPtr(x1=1.5, x2=1.1, host_elements={'test_grid': 1}) particle_new = ParticleSmartPtr(x1=1.5, x2=1.0, host_elements={'test_grid': 1}) start_point, end_point, intersection = self.unstructured_grid.get_boundary_intersection_wrapper(particle_old, particle_new) test.assert_almost_equal(start_point[0], 2.0) test.assert_almost_equal(start_point[1], 1.0) test.assert_almost_equal(end_point[0], 1.0) test.assert_almost_equal(end_point[1], 1.0) test.assert_almost_equal(intersection[0], 1.5) test.assert_almost_equal(intersection[1], 1.0)
def test_get_boundary_intersection(self): particle_old = ParticleSmartPtr(x1=1.6666666667-self.xmin, x2=1.3333333333-self.ymin, host_elements={'fvcom': 1}) particle_new = ParticleSmartPtr(x1=1.6666666667-self.xmin, x2=0.9-self.ymin, host_elements={'fvcom': 1}) start_point, end_point, intersection = self.data_reader.get_boundary_intersection_wrapper(particle_old, particle_new) test.assert_almost_equal(start_point[0]+self.xmin, 2.0) test.assert_almost_equal(start_point[1]+self.ymin, 1.0) test.assert_almost_equal(end_point[0]+self.xmin, 1.0) test.assert_almost_equal(end_point[1]+self.ymin, 1.0) test.assert_almost_equal(intersection[0]+self.xmin, 1.6666666667) test.assert_almost_equal(intersection[1]+self.ymin, 1.0)
def test_find_host_when_particle_is_in_the_domain(self): particle_old = ParticleSmartPtr(x1=self.deg_to_radians * 2.666666667, x2=self.deg_to_radians * 11.333333333, host_elements={'arakawa_a': 7}) particle_new = ParticleSmartPtr(x1=self.deg_to_radians * 2.333333333, x2=self.deg_to_radians * 11.6666666667, host_elements={'arakawa_a': -999}) flag = self.data_reader.find_host_wrapper(particle_old, particle_new) test.assert_equal(flag, 0) test.assert_equal(particle_new.get_host_horizontal_elem('arakawa_a'), 6)
def test_find_host_when_particle_has_crossed_a_land_boundary(self): particle_old = ParticleSmartPtr(x1=self.deg_to_radians * 2.333333333, x2=self.deg_to_radians * 12.666666667, host_elements={'arakawa_a': 10}) particle_new = ParticleSmartPtr(x1=self.deg_to_radians * 2.333333333, x2=self.deg_to_radians * 13.1, host_elements={'arakawa_a': -999}) flag = self.data_reader.find_host_wrapper(particle_old, particle_new) test.assert_equal(flag, -1) test.assert_equal(particle_new.get_host_horizontal_elem('arakawa_a'), 10)
def test_get_boundary_intersection(self): particle_old = ParticleSmartPtr(x1 = self.deg_to_radians * 1.99, x2 = self.deg_to_radians * 12.9, host_elements={'test_grid': 5}) particle_new = ParticleSmartPtr(x1 = self.deg_to_radians * 1.99, x2 = self.deg_to_radians * 13.1, host_elements={'test_grid': 5}) start_point, end_point, intersection = self.unstructured_grid.get_boundary_intersection_wrapper(particle_old, particle_new) test.assert_almost_equal(start_point[0], np.radians(1.0)) test.assert_almost_equal(start_point[1], np.radians(13.0)) test.assert_almost_equal(end_point[0], np.radians(2.0)) test.assert_almost_equal(end_point[1], np.radians(13.0)) test.assert_almost_equal(intersection[0], np.radians(1.99), decimal=4) test.assert_almost_equal(intersection[1], np.radians(13.0), decimal=4)
def test_get_zmax(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) zeta = self.data_reader.get_zmax_wrapper(time, particle) test.assert_almost_equal(zeta, 1.0) time = 1800.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) zeta = self.data_reader.get_zmax_wrapper(time, particle) test.assert_almost_equal(zeta, 1.5)
def test_get_zmax(self): x1 = self.deg_to_radians * 2.0 x2 = self.deg_to_radians * 12.0 host_elements = {'arakawa_a': 0} time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) zeta = self.data_reader.get_zmax_wrapper(time, particle) test.assert_almost_equal(zeta, 0.0) time = 1800.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) zeta = self.data_reader.get_zmax_wrapper(time, particle) test.assert_almost_equal(zeta, 0.0)
def test_reflect_particle_on_a_normal_trajectory(self): particle_old = ParticleSmartPtr(x1=1.99 * self.deg_to_radians, x2=12.8 * self.deg_to_radians, host_elements={'arakawa_a': 5}) particle_new = ParticleSmartPtr(x1=1.99 * self.deg_to_radians, x2=13.1 * self.deg_to_radians, host_elements={'arakawa_a': 5}) flag = self.horiz_boundary_condition_calculator.apply_wrapper( self.data_reader, particle_old, particle_new) test.assert_equal(flag, 0) test.assert_almost_equal(particle_new.x1, 1.99 * self.deg_to_radians, decimal=2) test.assert_almost_equal(particle_new.x2, 12.9 * self.deg_to_radians, decimal=2) test.assert_equal(particle_new.get_host_horizontal_elem('arakawa_a'), 5)
def test_element_is_wet(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) status = self.data_reader.is_wet_wrapper(time, particle) test.assert_equal(status, 1)
def test_element_is_dry(self): x1 = self.deg_to_radians * 1.6666666667 x2 = self.deg_to_radians * 11.6666666667 host_elements = {'arakawa_a': 0} time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) status = self.data_reader.is_wet_wrapper(time, particle) test.assert_equal(status, 0)
def test_interpolate_in_space_on_a_boundary_element(self): h_grid = np.array([25., 10., 999., 999., 25., 10., 999., 999., 25., 10., 999., 999.], dtype=DTYPE_FLOAT) # Set the particle at the element's centroid x1 = self.deg_to_radians * 2. x2 = self.deg_to_radians * 13. host_elements = {'test_grid': 5} particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.unstructured_grid.set_local_coordinates_wrapper(particle) h = self.unstructured_grid.interpolate_in_space_wrapper(h_grid, particle) test.assert_almost_equal(h, 10.)
def test_interpolate_in_space(self): h_grid = np.array([25., 10., 999., 999., 25., 10., 999., 999., 25., 10., 999., 999.], dtype=DTYPE_FLOAT) # Set the particle at the element's centroid x1 = self.deg_to_radians * 1.6670652236426569 x2 = self.deg_to_radians * 11.667054258869966 host_elements = {'test_grid': 0} particle = ParticleSmartPtr(x1=x1, x2=x2, host_elements=host_elements) self.unstructured_grid.set_local_coordinates_wrapper(particle) h = self.unstructured_grid.interpolate_in_space_wrapper(h_grid, particle) test.assert_almost_equal(h, 15.)
def test_get_so(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} x3 = -0.1 time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) so = self.data_reader.get_environmental_variable_wrapper('so', time, particle) test.assert_equal(flag, 0) test.assert_almost_equal(so, 0.01)
def test_get_horizontal_eddy_diffusivity(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} x3 = -0.1 time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) diffusivity = self.data_reader.get_horizontal_eddy_diffusivity_wrapper(time, particle) test.assert_equal(flag, 0) test.assert_almost_equal(diffusivity, 0.01)
def test_apply_reflecting_boundary_condition_for_a_particle_that_has_just_pierced_the_free_surface(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin x3 = -11.0 - 1.e-14 host_elements={'fvcom': 0} time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.vert_boundary_condition_calculator.apply_wrapper(self.data_reader, time, particle) test.assert_equal(flag, 0) test.assert_almost_equal(particle.x3, -11.0)
def test_set_vertical_grid_vars_for_a_particle_in_the_bottom_boundary_layer(self): time = 0.0 x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin x3 = -10.4 host_elements={'fvcom': 0} particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) test.assert_equal(flag, 0) test.assert_equal(particle.k_layer, 2) test.assert_equal(particle.in_vertical_boundary_layer, True) test.assert_almost_equal(particle.omega_interfaces, 0.25)
def test_get_horizontal_eddy_diffusivity_derivative(self): x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin host_elements={'fvcom': 0} x3 = -0.1 time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) Ah_prime = np.empty(2, dtype=DTYPE_FLOAT) self.data_reader.get_horizontal_eddy_diffusivity_derivative_wrapper(time, particle, Ah_prime) test.assert_equal(flag, 0) test.assert_array_almost_equal(Ah_prime, [0.0, 0.0])
def test_get_so(self): x1 = self.deg_to_radians * 2.0 x2 = self.deg_to_radians * 12.0 host_elements = {'arakawa_a': 0} x3 = -5. time = 0.0 particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) so = self.data_reader.get_environmental_variable_wrapper( 'so', time, particle) test.assert_equal(flag, 0) test.assert_almost_equal(so, 0.5)
def test_set_vertical_grid_vars_for_a_particle_in_the_middle_of_the_water_column(self): time = 0.0 x1 = 1.3333333333-self.xmin x2 = 1.6666666667-self.ymin x3 = -2.6 host_elements={'fvcom': 0} particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) test.assert_equal(flag, 0) test.assert_equal(particle.k_layer, 1) test.assert_equal(particle.in_vertical_boundary_layer, False) test.assert_equal(particle.k_upper_layer, 0) test.assert_equal(particle.k_lower_layer, 1) test.assert_almost_equal(particle.omega_interfaces, 0.83333333333) test.assert_almost_equal(particle.omega_layers, 0.5)
def test_set_vertical_grid_vars_for_a_particle_in_the_surface_layer(self): time = 0.0 x1 = self.deg_to_radians * 2.0 x2 = self.deg_to_radians * 12.0 x3 = -5.0 # 1 m below the moving free surface host_elements = {'arakawa_a': 0} particle = ParticleSmartPtr(x1=x1, x2=x2, x3=x3, host_elements=host_elements) self.data_reader.set_local_coordinates_wrapper(particle) flag = self.data_reader.set_vertical_grid_vars_wrapper(time, particle) test.assert_equal(flag, 0) test.assert_equal(particle.k_layer, 0) test.assert_equal(particle.in_vertical_boundary_layer, False) test.assert_almost_equal(particle.omega_interfaces, 0.5)
def test_set_default_location(self): particle = ParticleSmartPtr(x1=1.5, x2=1.0, host_elements={'test_grid': 1}) self.unstructured_grid.set_default_location_wrapper(particle) test.assert_almost_equal(particle.x1, 1.66666666667) test.assert_almost_equal(particle.x2, 1.33333333333) test.assert_array_almost_equal(particle.get_phi('test_grid'), [0.3333333333, 0.3333333333, 0.3333333333])
def test_find_host_using_global_search_when_a_particle_is_in_an_element_with_two_land_boundaries(self): particle = ParticleSmartPtr(x1=0.6666666667, x2=1.3333333333, host_elements={'test_grid': -1}) flag = self.unstructured_grid.find_host_using_global_search_wrapper(particle) test.assert_equal(particle.get_host_horizontal_elem('test_grid'), -1)