Пример #1
0
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])
Пример #2
0
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])
Пример #3
0
    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