def CT_from_pt(SA, pt): r"""Calculates Conservative Temperature of seawater from potential temperature (whose reference sea pressure is zero dbar). Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] pt : array_like potential temperature referenced to a sea pressure of zero dbar [:math:`^\circ` C (ITS-90)] Returns ------- CT : array_like Conservative Temperature [:math:`^\circ` C (ITS-90)] See Also -------- TODO Notes ----- TODO Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> pt = [28.7832, 28.4209, 22.7850, 10.2305, 6.8292, 4.3245] >>> gsw.CT_from_pt(SA, pt) array([ 28.80992302, 28.43914426, 22.78624661, 10.22616561, 6.82718342, 4.32356518]) References ---------- .. [1] IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of seawater - 2010: Calculation and use of thermodynamic properties. Intergovernmental Oceanographic Commission, Manuals and Guides No. 56, UNESCO (English), 196 pp. See section 3.3. Modifications: 2011-03-29. David Jackett, Trevor McDougall and Paul Barker. """ SA, pt, mask = strip_mask(SA, pt) pot_enthalpy = pot_enthalpy_from_pt(SA, pt) CT = pot_enthalpy / cp0 return np.ma.array(CT, mask=mask, copy=False)
def pt_from_CT(SA, CT): r"""Calculates potential temperature (with a reference sea pressure of zero dbar) from Conservative Temperature. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] CT : array_like Conservative Temperature [:math:`^\circ` C (ITS-90)] Returns ------- pt : array_like potential temperature referenced to a sea pressure of zero dbar [:math:`^\circ` C (ITS-90)] See Also -------- specvol_anom Notes ----- This function uses 1.5 iterations through a modified Newton-Raphson (N-R) iterative solution procedure, starting from a rational-function-based initial condition for both pt and dCT_dpt. Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> CT = [28.8099, 28.4392, 22.7862, 10.2262, 6.8272, 4.3236] >>> gsw.pt_from_CT(SA, CT) array([ 28.78317705, 28.4209556 , 22.78495347, 10.23053439, 6.82921659, 4.32453484]) References ---------- .. [1] IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of seawater - 2010: Calculation and use of thermodynamic properties. Intergovernmental Oceanographic Commission, Manuals and Guides No. 56, UNESCO (English), 196 pp. See sections 3.1 and 3.3. .. [2] McDougall T. J., D. R. Jackett, P. M. Barker, C. Roberts-Thomson, R. Feistel and R. W. Hallberg, 2010: A computationally efficient 25-term expression for the density of seawater in terms of Conservative Temperature, and related properties of seawater. Modifications: 2011-03-29. Trevor McDougall, David Jackett, Claire Roberts-Thomson and Paul Barker. """ SA, CT, mask = strip_mask(SA, CT) s1 = SA * 35. / SSO a0 = -1.446013646344788e-2 a1 = -3.305308995852924e-3 a2 = 1.062415929128982e-4 a3 = 9.477566673794488e-1 a4 = 2.166591947736613e-3 a5 = 3.828842955039902e-3 b0 = 1.000000000000000e+0 b1 = 6.506097115635800e-4 b2 = 3.830289486850898e-3 b3 = 1.247811760368034e-6 a5CT = a5 * CT b3CT = b3 * CT CT_factor = (a3 + a4 * s1 + a5CT) pt_num = a0 + s1 * (a1 + a2 * s1) + CT * CT_factor pt_den = b0 + b1 * s1 + CT * (b2 + b3CT) pt = pt_num / pt_den dCT_dpt = pt_den / (CT_factor + a5CT - (b2 + b3CT + b3CT) * pt) # 1.5 iterations through the modified Newton-Rapshon iterative method CT_diff = CT_from_pt(SA, pt) - CT pt_old = pt pt = pt_old - CT_diff / dCT_dpt # 1/2-way through the 1st modified N-R. ptm = 0.5 * (pt + pt_old) # This routine calls gibbs_pt0_pt0(SA,pt0) to get the second derivative of # the Gibbs function with respect to temperature at zero sea pressure. dCT_dpt = -(ptm + Kelvin) * gibbs_pt0_pt0(SA, ptm) / cp0 pt = pt_old - CT_diff / dCT_dpt # End of 1st full modified N-R iteration. CT_diff = CT_from_pt(SA, pt) - CT pt_old = pt pt = pt_old - CT_diff / dCT_dpt # 1.5 iterations of the modified N-R. return np.ma.array(pt, mask=mask, copy=False)
def pot_enthalpy_from_pt(SA, pt): r"""Calculates the potential enthalpy of seawater from potential temperature (whose reference sea pressure is zero dbar). Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] pt : array_like potential temperature referenced to a sea pressure of zero dbar [:math:`^\circ` C (ITS-90)] Returns ------- pot_enthalpy : array_like potential enthalpy [J kg :sup:`-1`] See Also -------- TODO Notes ----- TODO Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> pt = [28.7832, 28.4209, 22.7850, 10.2305, 6.8292, 4.3245] >>> gsw.pot_enthalpy_from_pt(SA, pt) array([ 115005.40853458, 113525.30870246, 90959.68769935, 40821.50280454, 27253.21472227, 17259.10131183]) References ---------- .. [1] IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of seawater - 2010: Calculation and use of thermodynamic properties. Intergovernmental Oceanographic Commission, Manuals and Guides No. 56, UNESCO (English), 196 pp. See section 3.2. Modifications: 2011-03-29. David Jackett, Trevor McDougall and Paul Barker """ SA, pt, mask = strip_mask(SA, pt) x2 = sfac * SA x = np.sqrt(x2) y = pt * 0.025 # Normalize for F03 and F08 pot_enthalpy = (61.01362420681071 + y * (168776.46138048015 + y * (-2735.2785605119625 + y * (2574.2164453821433 + y * (-1536.6644434977543 + y * (545.7340497931629 + (-50.91091728474331 - 18.30489878927802 * y) * y))))) + x2 * (268.5520265845071 + y * (-12019.028203559312 + y * (3734.858026725145 + y * (-2046.7671145057618 + y * (465.28655623826234 + (-0.6370820302376359 - 10.650848542359153 * y) * y)))) + x * (937.2099110620707 + y * (588.1802812170108 + y * (248.39476522971285 + (-3.871557904936333 - 2.6268019854268356 * y) * y)) + x * (-1687.914374187449 + x * (246.9598888781377 + x * (123.59576582457964 - 48.5891069025409 * x)) + y * (936.3206544460336 + y * (-942.7827304544439 + y * (369.4389437509002 + (-33.83664947895248 - 9.987880382780322 * y) * y))))))) """The above polynomial for pot_enthalpy is the full expression for potential enthalpy in terms of SA and pt, obtained from the Gibbs function as below. It has simply collected like powers of x and y so that it is computationally faster than calling the Gibbs function twice as is done in the commented code below. When this code below is run, the results are identical to calculating pot_enthalpy as above, to machine precision. n0, n1 = 0, 1 g000 = gibbs(n0, n0, n0, SA, pt, 0) g010 = gibbs(n0, n1, n0, SA, pt, 0) pot_enthalpy = g000 - (Kelvin + pt) * g010 This is the end of the alternative code %timeit gsw.CT_from_pt(SA, pt) 1000 loops, best of 3: 1.34 ms per loop <- calling gibbs 1000 loops, best of 3: 254 us per loop <- standard """ return np.ma.array(pot_enthalpy, mask=mask, copy=False)
def pt_from_CT(SA, CT): r"""Calculates potential temperature (with a reference sea pressure of zero dbar) from Conservative Temperature. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] CT : array_like Conservative Temperature [:math:`^\circ` C (ITS-90)] Returns ------- pt : array_like potential temperature referenced to a sea pressure of zero dbar [:math:`^\circ` C (ITS-90)] See Also -------- specvol_anom Notes ----- This function uses 1.5 iterations through a modified Newton-Raphson (N-R) iterative solution procedure, starting from a rational-function-based initial condition for both pt and dCT_dpt. Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> CT = [28.8099, 28.4392, 22.7862, 10.2262, 6.8272, 4.3236] >>> gsw.pt_from_CT(SA, CT) array([ 28.78317705, 28.4209556 , 22.78495347, 10.23053439, 6.82921659, 4.32453484]) References ---------- .. [1] IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of seawater - 2010: Calculation and use of thermodynamic properties. Intergovernmental Oceanographic Commission, Manuals and Guides No. 56, UNESCO (English), 196 pp. See sections 3.1 and 3.3. .. [2] McDougall T. J., D. R. Jackett, P. M. Barker, C. Roberts-Thomson, R. Feistel and R. W. Hallberg, 2010: A computationally efficient 25-term expression for the density of seawater in terms of Conservative Temperature, and related properties of seawater. Modifications: 2011-03-29. Trevor McDougall, David Jackett, Claire Roberts-Thomson and Paul Barker. """ SA, CT, mask = strip_mask(SA, CT) SA = np.maximum(SA, 0) s1 = SA * 35. / SSO a0 = -1.446013646344788e-2 a1 = -3.305308995852924e-3 a2 = 1.062415929128982e-4 a3 = 9.477566673794488e-1 a4 = 2.166591947736613e-3 a5 = 3.828842955039902e-3 b0 = 1.000000000000000e+0 b1 = 6.506097115635800e-4 b2 = 3.830289486850898e-3 b3 = 1.247811760368034e-6 a5CT = a5 * CT b3CT = b3 * CT CT_factor = (a3 + a4 * s1 + a5CT) pt_num = a0 + s1 * (a1 + a2 * s1) + CT * CT_factor pt_den = b0 + b1 * s1 + CT * (b2 + b3CT) pt = pt_num / pt_den dCT_dpt = pt_den / (CT_factor + a5CT - (b2 + b3CT + b3CT) * pt) # 1.5 iterations through the modified Newton-Rapshon iterative method CT_diff = CT_from_pt(SA, pt) - CT pt_old = pt pt = pt_old - CT_diff / dCT_dpt # 1/2-way through the 1st modified N-R. ptm = 0.5 * (pt + pt_old) # This routine calls gibbs_pt0_pt0(SA, pt0) to get the second derivative of # the Gibbs function with respect to temperature at zero sea pressure. dCT_dpt = -(ptm + Kelvin) * gibbs_pt0_pt0(SA, ptm) / cp0 pt = pt_old - CT_diff / dCT_dpt # End of 1st full modified N-R iteration. CT_diff = CT_from_pt(SA, pt) - CT pt_old = pt pt = pt_old - CT_diff / dCT_dpt # 1.5 iterations of the modified N-R. # Abs max error of result is 1.42e-14 deg C. return np.ma.array(pt, mask=mask, copy=False)
def pot_enthalpy_from_pt(SA, pt): r"""Calculates the potential enthalpy of seawater from potential temperature (whose reference sea pressure is zero dbar). Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] pt : array_like potential temperature referenced to a sea pressure of zero dbar [:math:`^\circ` C (ITS-90)] Returns ------- pot_enthalpy : array_like potential enthalpy [J kg :sup:`-1`] See Also -------- TODO Notes ----- TODO Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> pt = [28.7832, 28.4209, 22.7850, 10.2305, 6.8292, 4.3245] >>> gsw.pot_enthalpy_from_pt(SA, pt) array([ 115005.40853458, 113525.30870246, 90959.68769935, 40821.50280454, 27253.21472227, 17259.10131183]) References ---------- .. [1] IOC, SCOR and IAPSO, 2010: The international thermodynamic equation of seawater - 2010: Calculation and use of thermodynamic properties. Intergovernmental Oceanographic Commission, Manuals and Guides No. 56, UNESCO (English), 196 pp. See section 3.2. Modifications: 2011-03-29. David Jackett, Trevor McDougall and Paul Barker """ SA, pt, mask = strip_mask(SA, pt) SA = np.maximum(SA, 0) x2 = sfac * SA x = np.sqrt(x2) y = pt * 0.025 # Normalize for F03 and F08 pot_enthalpy = ( 61.01362420681071 + y * (168776.46138048015 + y * (-2735.2785605119625 + y * (2574.2164453821433 + y * (-1536.6644434977543 + y * (545.7340497931629 + (-50.91091728474331 - 18.30489878927802 * y) * y))))) + x2 * (268.5520265845071 + y * (-12019.028203559312 + y * (3734.858026725145 + y * (-2046.7671145057618 + y * (465.28655623826234 + (-0.6370820302376359 - 10.650848542359153 * y) * y)))) + x * (937.2099110620707 + y * (588.1802812170108 + y * (248.39476522971285 + (-3.871557904936333 - 2.6268019854268356 * y) * y)) + x * (-1687.914374187449 + x * (246.9598888781377 + x * (123.59576582457964 - 48.5891069025409 * x)) + y * (936.3206544460336 + y * (-942.7827304544439 + y * (369.4389437509002 + (-33.83664947895248 - 9.987880382780322 * y) * y))))))) """The above polynomial for pot_enthalpy is the full expression for potential enthalpy in terms of SA and pt, obtained from the Gibbs function as below. It has simply collected like powers of x and y so that it is computationally faster than calling the Gibbs function twice as is done in the commented code below. When this code below is run, the results are identical to calculating pot_enthalpy as above, to machine precision. g000 = gibbs(n0, n0, n0, SA, pt, 0) g010 = gibbs(n0, n1, n0, SA, pt, 0) pot_enthalpy = g000 - (Kelvin + pt) * g010 This is the end of the alternative code %timeit gsw.CT_from_pt(SA, pt) 1000 loops, best of 3: 1.34 ms per loop <- calling gibbs 1000 loops, best of 3: 254 us per loop <- standard """ return np.ma.array(pot_enthalpy, mask=mask, copy=False)