def test_output_variance(): w = np.arange(0, 5, 0.5) # Zero variance with zero transfer function H = np.zeros((10, 3, 3)) # frequency, another parameter, xyz S = np.ones(10) assert_array_equal(utils.output_variance(w, H, S), np.zeros((3,3,3))) # Zero variance with zero spectrum H = np.ones((10, 3, 3)) # frequency, another parameter, xyz S = np.zeros(10) assert_array_equal(utils.output_variance(w, H, S), np.zeros((3,3,3))) # White noise spectrum, single peak in transfer function H = np.zeros((10, 3, 3)) S = np.ones(10) # Put the peaks at various frequencies, amplitudes and coordinates H[1,0,:] = 1.1 H[4,1,2] = 2.3 H[6,2,0] = 3.4 s1 = utils.output_variance(w, H, S) # Expected: dw = 0.5 s = np.zeros((3,3,3)) s[0,:,:] = 1.1**2 * dw s[1,2,2] = 2.3**2 * dw s[2,0,0] = 3.4**2 * dw assert_allclose(s1[0], s[0]) assert_allclose(s1[1], s[1]) assert_allclose(s1[2], s[2])
def test_output_variance(): w = np.arange(0, 5, 0.5) # Zero variance with zero transfer function H = np.zeros((10, 3, 3)) # frequency, another parameter, xyz S = np.ones(10) assert_array_equal(utils.output_variance(w, H, S), np.zeros((3, 3, 3))) # Zero variance with zero spectrum H = np.ones((10, 3, 3)) # frequency, another parameter, xyz S = np.zeros(10) assert_array_equal(utils.output_variance(w, H, S), np.zeros((3, 3, 3))) # White noise spectrum, single peak in transfer function H = np.zeros((10, 3, 3)) S = np.ones(10) # Put the peaks at various frequencies, amplitudes and coordinates H[1, 0, :] = 1.1 H[4, 1, 2] = 2.3 H[6, 2, 0] = 3.4 s1 = utils.output_variance(w, H, S) # Expected: dw = 0.5 s = np.zeros((3, 3, 3)) s[0, :, :] = 1.1**2 * dw s[1, 2, 2] = 2.3**2 * dw s[2, 0, 0] = 3.4**2 * dw assert_allclose(s1[0], s[0]) assert_allclose(s1[1], s[1]) assert_allclose(s1[2], s[2])
def linearised_drag_force(self, w, H_wave, S_wave, vc=None): """Calculate coefficients A & b so F = A w_v + b. w_v is the local perpendicular varying relative velocity. - w are the frequencies used to calculate H_wave and S_wave - vc is the steady current velocity in global coordinates. It can be given for all elements or else one value for all. """ # Calculate standard deviations of relative velocity # Ref: Langley1984 H_rel = (self.wave_velocity_transfer_function(w) - self.structural_velocity_transfer_function(w, H_wave)) H_rel_local = self.resolve_perpendicular_to_elements(H_rel) wv_sigma = np.sqrt(output_variance(w, H_rel_local, S_wave)) # Assume current is equal everywhere unless specified otherwise # Resolve into local perpendicular velocities if vc is None: vc = np.zeros(3) wc = self.resolve_perpendicular_to_elements(vc) # Calculate the local linearised drag force A_local, b_local = self.local_linearised_drag_force(wc, wv_sigma) # Transform results back to global coordinates P = self.element_axes[:,:,0:2] # transformation matrix [n1 n2] b = np.einsum('eip,ep->ei', P, b_local) A = np.einsum('eip,epq,ejq->eij', P, A_local, P) return A, b