def test_reflective(self): model = models.Stockdon2006(Hs=4, Tp=11, beta=0.1) assert model.R2 == approx(2.54, abs=0.01) assert model.setup == approx(0.96, abs=0.01) assert model.sig == approx(1.65, abs=0.01) assert model.sinc == approx(2.06, abs=0.01) assert model.swash == approx(2.64, abs=0.01)
def test_list_input(self): model = models.Stockdon2006(Hs=[1, 2], Lp=[100, 200], beta=[0.05, 0.1]) assert model.R2 == approx((0.59, 1.84), abs=0.1) assert model.setup == approx((0.17, 0.70), abs=0.1) assert model.sig == approx((0.6, 1.2), abs=0.1) assert model.sinc == approx((0.37, 1.5), abs=0.1) assert model.swash == approx((0.71, 1.92), abs=0.01)
def test_dissipative(self): model = models.Stockdon2006(Hs=4, Tp=11, beta=0.001) assert model.R2 == approx(1.18, abs=0.01) assert model.setup == approx(0.0096, abs=0.01) assert model.sig == approx(1.65, abs=0.01) assert model.sinc == approx(0.02, abs=0.01) assert model.swash == approx(1.65, abs=0.01)
def load_random_sto06( seed=12345, t_start=datetime(2000, 1, 1), t_end=datetime(2000, 1, 2), dt=timedelta(hours=1), hs_range=(1, 3), tp_range=(6, 10), beta_range=(0.08, 0.1), noise_std=0.3, ): """ Loads a randomly generated wave runup dataframe. This function returns a randomly generated :obj:`pandas.DataFrame` containing wave parameters and noisey runup values calculated using the Stockdon et al (2006) runup model. This random data is intended to be used to demonstrate runup analysis without having to use actual data Args: seed (:obj:`int`): Seed the random number generator t_start (:obj:`datetime.datetime`): Start time of the dataframe t_end (:obj:`datetime.datetime`): End time of the dataframe dt (:obj:`datetime.timedelta`): Time interval of the dataframe hs_range (:obj:`tuple`): Range (`min`, `max`) of the significant wave height tp_range (:obj:`tuple`): Range (`min`, `max`) of the peak wave period beta_range (:obj:`tuple`): Range (`min`, `max`) of the nearshore slope noise_std (:obj:`float`): Standard deviation (in meters) of the wave runup statistics. Returns: A :obj:`pandas.DataFrame` Examples: Get >>> from py_wave_runup import datasets >>> df = datasets.load_random_sto06() >>> df.head() hs tp beta ... swash sig sinc 2000-01-01 00:00:00 3.000000 6.000000 0.098110 ... 1.171474 0.717714 0.894084 2000-01-01 01:00:00 2.850109 6.128432 0.099052 ... 1.378190 0.919351 1.104072 2000-01-01 02:00:00 2.865462 6.461471 0.099766 ... 1.154970 0.664189 0.866796 2000-01-01 03:00:00 2.942888 6.750824 0.100000 ... 1.223142 0.701520 0.918580 2000-01-01 04:00:00 2.906808 6.937742 0.099069 ... 2.001251 1.476527 1.687905 <BLANKLINE> [5 rows x 8 columns] """ # Create the time index for our dataframe index = pd.date_range(start=t_start, end=t_end, freq=dt) df = pd.DataFrame(index=index) # Create some random noise random.seed(seed) np.random.seed(seed) pn = PerlinNoise(num_octaves=7, persistence=0.5) # Generate input parameters. Note that we offset the noise value by the length of # the index to avoid having the same timeseries shape for each parameter. l = len(index) hs = minmax_scale([pn.noise(i) for i, _ in enumerate(index)], hs_range) tp = minmax_scale([pn.noise(i + l) for i, _ in enumerate(index)], tp_range) beta = minmax_scale([pn.noise(i + 2 * l) for i, _ in enumerate(index)], beta_range) # Generate wave parameters based on Stockdon model = models.Stockdon2006(Hs=hs, Tp=tp, beta=beta) # Generate additional noise noise = np.random.normal(0, noise_std, l) # Combine into a dataframe df["hs"] = hs df["tp"] = tp df["beta"] = beta df["r2"] = model.R2 + noise df["setup"] = model.setup + noise df["swash"] = model.swash + noise df["sig"] = model.sig + noise df["sinc"] = model.sinc + noise return df
def test_different_list_input(self): with raises(ValueError): models.Stockdon2006(Hs=[1, 2], Lp=[100, 200], beta=[0.1])
def test_no_wave_length(self): with raises(ValueError): models.Stockdon2006(Hs=1, beta=0.1)
def test_depth_and_wavelength(self): model = models.Stockdon2006(Hs=4, Lp=200, h=15, beta=0.05) assert model.R2 == approx(1.69, 0.1)
def test_depth_and_period(self): model = models.Stockdon2006(Hs=4, Tp=12, h=15, beta=0.05) assert model.R2 == approx(1.00, 0.1)
def test_wave_length(self): model = models.Stockdon2006(Hs=4, Lp=200, beta=0.05) assert model.R2 == approx(1.69, 0.1)