Example #1
0
 def test_all_masked(self):
     """Handle totally masked arrays"""
     SA = np.ma.MaskedArray([-99, 33], mask=[True, True])
     t = 10
     p = 100
     g001 = _gibbs(0, 0, 1, SA, t, p)
     g110 = _gibbs(1, 1, 0, SA, t, p)
     self.assertTrue(np.all(g001.mask))
     self.assertTrue(np.all(g110.mask))
Example #2
0
 def test_nan(self):
     """Accept and return not-a-number, do not mess up finite values"""
     SA = np.array([34.0, np.nan, 35.0])
     t = 10.0
     p = 0
     g101 = _gibbs(1, 0, 1, SA, t, p)
     # Should return NaN for NaN
     self.assertTrue(np.isnan(g101[1]))
     # Should return correct value for not NaN
     self.assertEqual(g101[0], _gibbs(1, 0, 1, SA[0], t, p))
Example #3
0
 def test_masked(self):
     """Accept and return correctly masked arrays"""
     SA = np.array([33, 34, -99, 35])  # One salinity value missing
     t  = [18, 17,  12, 8]
     p  = [0, 10, 50, 100]
     SA = np.ma.masked_less(SA, 0) # Make masked array
     g020 = _gibbs(0, 2, 0, SA, t, p)
     g101 = _gibbs(1, 0, 1, SA, t, p)
     # Return array should have the same mask
     self.assertTrue(np.all(g020.mask == SA.mask))
     self.assertTrue(np.all(g101.mask == SA.mask))
     # Correct value for non-masked entries
     self.assertEqual(g020[0], _gibbs(0, 2, 0, SA[0], t[0], p[0]))
Example #4
0
    def test_zero_salinity(self):
        """Handle zero salinity correctly"""

        # If ns > 0, SA = 0 should be masked
        #   at least matlab explicitly puts a NaN in this case
        SA, t, p = [30, 0], 10, 100
        g110 = _gibbs(1, 1, 0, SA, t, p)
        self.assertTrue(g110.mask[1])    
        
        # If ns = 0, SA = 0 should return an unmasked value
        #   according to matlab
        SA, t, p = 0, 10, 100
        g011 = _gibbs(0, 1, 1, SA, t, p)
        self.assertFalse(np.all(g011.mask))   
        self.assertTrue(np.isfinite(g011[0])) 
Example #5
0
 def test_broadcasting(self):
     """Handle 2D array and broadcasting correctly"""
     SA = np.array([[31,33],[34, 34.5]])
     t  = [10, 15]
     p = 100
     g100 = _gibbs(1, 0, 0, SA, t, p)
     self.assertEqual(g100.shape, (2,2))
Example #6
0
 def test_legal_derivatives(self):
     """Test that derivatives up to second order are accepted"""
     SA, t, p = 35, 10, 100
     # Zeroth order
     g000 = _gibbs(0, 0, 0, SA, t, p)
     # First order
     g100 = _gibbs(1, 0, 0, SA, t, p)
     g010 = _gibbs(0, 1, 0, SA, t, p)
     g001 = _gibbs(0, 0, 1, SA, t, p)
     # Second order
     g110 = _gibbs(1, 1, 0, SA, t, p)
     g101 = _gibbs(1, 0, 1, SA, t, p)
     g011 = _gibbs(0, 1, 1, SA, t, p)
     g200 = _gibbs(2, 0, 0, SA, t, p)
     g020 = _gibbs(0, 2, 0, SA, t, p)
     g002 = _gibbs(0, 0, 2, SA, t, p)
Example #7
0
    def test_return_masked(self):
        """Return values should be masked arrays of rank >= 1"""
        # Scalar input
        SA, t, p = 35, 10, 100
        g101 = _gibbs(1, 0, 1, SA, t, p)
        self.assertTrue(np.ma.isMaskedArray(g101))
        self.assertTrue(g101.ndim > 0)

        # 0D arrays
        SA = np.array(35.0)
        t = np.array(10)
        p = np.array(100)
        g101 = _gibbs(1, 0, 1, SA, t, p)
        self.assertTrue(np.ma.isMaskedArray(g101))
        self.assertTrue(g101.ndim > 0)

        # Array and list input
        SA = np.array([31, 33, 35, 35.2])
        t = [12, 11, 8, 7.7]
        p = 100
        g002 = _gibbs(0, 0, 2, SA, t, p)
        self.assertTrue(np.ma.isMaskedArray(g002))
Example #8
0
    def test_correct(self):
        """Test against octave output of the matlab toolbox"""
        SA, t, p = 35.0, 10.0, 1000.0
        # Values calculated by GSW toolbox in octave
        g_octave = {(0,0,0) : 8985.19461006389,
                    (1,0,0) :   60.3635304254037,
                    (0,1,0) : -141.765747745325,
                    (0,0,1) :    9.69644671046863e-04,
                    (1,1,0) :    0.516204397082431,
                    (1,0,1) :   -7.24288070187722e-07,
                    (0,1,1) :    1.78194974215707e-07,
                    (2,0,0) :    2.10625015682819,
                    (0,2,0) :  -14.0011829989402,
                    (0,0,2) :   -4.16851449226714e-13}

        for k in g_octave:
            args = k + (SA,t,p)  # 6 element argument tuple
            g = _gibbs(*args)
            v = g_octave[k]
            self.assertTrue(abs((g-v)/v) < 1.0e-14)