def energy_dissipation_rate(self, H, U): ''' c_ub = 100 = dimensionless empirical coefficient to correct for non-Law-of-the-Wall results (Umlauf and Burchard, 2003) u_c = water friction velocity (m/s) sqrt(rho_air / rho_w) * u_a ~ .03 * u_a u_a = air friction velocity (m/s) z_0 = surface roughness (m) (Taylor and Yelland) c_p = peak wave speed for Pierson-Moskowitz spectrum w_p = peak angular frequency for Pierson-Moskowitz spectrum (1/s) TODO: This implementation should be in a utility function. It should not be part of the Waves management object itself. ''' if H is 0 or U is 0: return 0 c_ub = 100 c_p = PiersonMoskowitz.peak_wave_speed(U) w_p = PiersonMoskowitz.peak_angular_frequency(U) z_0 = 1200 * H * ((H / (2*np.pi*c_p)) * w_p)**4.5 u_a = .4 * U / np.log(10 / z_0) u_c = .03 * u_a eps = c_ub * u_c**3 / H return eps
def test_delvigne_sweeney(): wind_speed = 10.0 T_w = PiersonMoskowitz.peak_wave_period(wind_speed) assert np.isclose(DelvigneSweeney.breaking_waves_frac(wind_speed, 10.0), 0.016) assert np.isclose(DelvigneSweeney.breaking_waves_frac(wind_speed, T_w), 0.0213333)
def peak_wave_period(self, time): ''' :param time: the time you want the wave data for :type time: datetime.datetime object :returns: peak wave period (s) ''' U = self.wind.get_value(time)[0] return PiersonMoskowitz.peak_wave_period(U)
def peak_wave_period(self, points, time): ''' :param time: the time you want the wave data for :type time: datetime.datetime object :returns: peak wave period (s) ''' U = self.get_wind_speed(points, time) # only need velocity return PiersonMoskowitz.peak_wave_period(U)
def test_ding_farmer(): wind_speed = 10.0 # m/s rdelta = 200.0 # oil/water density difference (kg / m^3) droplet_diameter = 0.0002 # 200 microns wave_height = PiersonMoskowitz.significant_wave_height(wind_speed) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) k_w = Stokes.water_phase_xfer_velocity(rdelta, droplet_diameter) assert np.isclose(DingFarmer.calm_between_wave_breaks(0.5, 10), 15.0) assert np.isclose(DingFarmer.calm_between_wave_breaks(f_bw, wave_period), 347.8125) assert np.isclose(DingFarmer.refloat_time(wave_height, k_w), 386.0328) assert np.isclose( DingFarmer.water_column_time_fraction(f_bw, wave_period, wave_height, k_w), 1.0)
def calm_between_wave_breaks(self, model_time, time_step, time_spent_in_wc=0.0): wind_speed = max(.1, self.waves.wind.get_value(model_time)[0]) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) T_calm = DingFarmer.calm_between_wave_breaks(f_bw, wave_period) return np.clip(T_calm, 0.0, float(time_step) - time_spent_in_wc)
def water_column_time_fraction(self, points, model_time, water_phase_xfer_velocity): wave_height = self.waves.get_value(points, model_time)[0] wind_speed = np.clip(self.get_wind_speed(points, model_time), 0.01, None) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) return DingFarmer.water_column_time_fraction( f_bw, wave_period, wave_height, water_phase_xfer_velocity)
def water_column_time_fraction(self, model_time, water_phase_xfer_velocity): wave_height = self.waves.get_value(model_time)[0] wind_speed = max(.1, self.waves.wind.get_value(model_time)[0]) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) return DingFarmer.water_column_time_fraction(f_bw, wave_period, wave_height, water_phase_xfer_velocity)
def water_column_time_fraction(self, points, model_time, water_phase_xfer_velocity): wave_height = self.waves.get_value(points, model_time)[0] wind_speed = np.clip(self.get_wind_speed(points, model_time), 0.01, None) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) return DingFarmer.water_column_time_fraction(f_bw, wave_period, wave_height, water_phase_xfer_velocity)
def test_ding_farmer(): wind_speed = 10.0 # m/s rdelta = 0.2 # oil/water density difference droplet_diameter = 0.0002 # 200 microns wave_height = PiersonMoskowitz.significant_wave_height(wind_speed) wave_period = PiersonMoskowitz.peak_wave_period(wind_speed) f_bw = DelvigneSweeney.breaking_waves_frac(wind_speed, wave_period) k_w = Stokes.water_phase_xfer_velocity(rdelta, droplet_diameter) assert np.isclose(DingFarmer.calm_between_wave_breaks(0.5, 10), 15.0) assert np.isclose(DingFarmer.calm_between_wave_breaks(f_bw, wave_period), 347.8125) assert np.isclose(DingFarmer.refloat_time(wave_height, k_w), 385.90177) assert np.isclose(DingFarmer.water_column_time_fraction(f_bw, wave_period, wave_height, k_w), 1.1095)
def percent_whitecap_coverage(cls, wind_speed): ''' percent whitecap coverage drag coefficient reduces linearly with wind speed for winds less than 2.4 m/s ''' if wind_speed is 0: return 0 if wind_speed > 2.4: C_D = .0008 + .000065 * wind_speed else: C_D = (.0008 + 2.4 * .000065) * wind_speed / 2.4 visc_air = 1.5 * 10**(-5) # m2/s peak_ang_freq = PiersonMoskowitz.peak_angular_frequency(wind_speed) R_Bw = C_D * wind_speed**2 / (visc_air * peak_ang_freq) Wc = 3.88 * 10**(-5) * R_Bw**(1.09) return Wc
def test_pierson_moskowitz(): assert np.isclose(PiersonMoskowitz.significant_wave_height(10.0), 2.24337) assert np.isclose(PiersonMoskowitz.peak_wave_period(10.0), 7.5)