def pt_from_entropy(SA, entropy): r"""Calculates potential temperature with reference pressure p_ref = 0 dbar and with entropy as an input variable. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] entropy : array_like specific entropy [J kg :sup:`-1` K :sup:`-1`] Returns ------- pt : array_like potential temperature [:math:`^\circ` C (ITS-90)] with reference sea pressure (p_ref) = 0 dbar. See Also -------- TODO Notes ----- TODO Examples -------- >>> import seawater.gibbs as gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> entropy = [400.3892, 395.4378, 319.8668, 146.7910, 98.6471, 62.7919] >>> gsw.pt_from_entropy(SA, entropy) array([ 28.78317983, 28.42095483, 22.78495274, 10.23053207, 6.82921333, 4.32453778]) 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 appendix A.10. Modifications: 2011-04-03. Trevor McDougall and Paul Barker. """ SA = np.maximum(SA, 0) part1 = 1 - SA / SSO part2 = 1 - 0.05 * part1 ent_SA = (cp0 / Kelvin) * part1 * (1 - 1.01 * part1) c = (entropy - ent_SA) * part2 / cp0 pt = Kelvin * (np.exp(c) - 1) dentropy_dt = cp0 / ((Kelvin + pt) * part2) # Initial dentropy_dt. for Number_of_iterations in range(0, 3): pt_old = pt dentropy = entropy_from_pt(SA, pt_old) - entropy # This is half way through the modified method # (McDougall and Wotherspoon, 2012) pt = pt_old - dentropy / dentropy_dt ptm = 0.5 * (pt + pt_old) dentropy_dt = -gibbs_pt0_pt0(SA, ptm) pt = pt_old - dentropy / dentropy_dt """maximum error of 2.2x10^-6 degrees C for one iteration. maximum error is 1.4x10^-14 degrees C for two iterations (two iterations is the default, "for Number_of_iterations = 1:2").""" return pt
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 pt0_from_t(SA, t, p): r"""Calculates potential temperature with reference pressure, pr = 0 dbar. The present routine is computationally faster than the more general function "pt_from_t(SA, t, p, pr)" which can be used for any reference pressure value. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] t : array_like in situ temperature [:math:`^\circ` C (ITS-90)] p : array_like pressure [dbar] Returns ------- pt0 : array_like potential temperature relative to 0 dbar [:math:`^\circ` C (ITS-90)] See Also -------- entropy_part, gibbs_pt0_pt0, entropy_part_zerop Notes ----- pt_from_t has the same result (only slower) Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> t = [28.7856, 28.4329, 22.8103, 10.2600, 6.8863, 4.4036] >>> p = [10, 50, 125, 250, 600, 1000] >>> gsw.pt0_from_t(SA, t, p) array([ 28.78319682, 28.42098334, 22.7849304 , 10.23052366, 6.82923022, 4.32451057]) 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.1. .. [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 = np.maximum(SA, 0) s1 = SA * (35. / SSO) pt0 = t + p * (8.65483913395442e-6 - s1 * 1.41636299744881e-6 - p * 7.38286467135737e-9 + t * (-8.38241357039698e-6 + s1 * 2.83933368585534e-8 + t * 1.77803965218656e-8 + p * 1.71155619208233e-10)) dentropy_dt = cp0 / ((Kelvin + pt0) * (1 - 0.05 * (1 - SA / SSO))) true_entropy_part = entropy_part(SA, t, p) for Number_of_iterations in range(0, 2, 1): pt0_old = pt0 dentropy = entropy_part_zerop(SA, pt0_old) - true_entropy_part # Half way the mod. method (McDougall and Wotherspoon, 2012). pt0 = pt0_old - dentropy / dentropy_dt pt0m = 0.5 * (pt0 + pt0_old) dentropy_dt = -gibbs_pt0_pt0(SA, pt0m) pt0 = pt0_old - dentropy / dentropy_dt """maximum error of 6.3x10^-9 degrees C for one iteration. maximum error is 1.8x10^-14 degrees C for two iterations (two iterations is the default, "for Number_of_iterations = 1:2"). These errors are over the full "oceanographic funnel" of McDougall et al. (2010), which reaches down to p = 8000 dbar.""" return pt0
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 pt_from_entropy(SA, entropy): r"""Calculates potential temperature with reference pressure p_ref = 0 dbar and with entropy as an input variable. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] entropy : array_like specific entropy [J kg :sup:`-1` K :sup:`-1`] Returns ------- pt : array_like potential temperature [:math:`^\circ` C (ITS-90)] with reference sea pressure (p_ref) = 0 dbar. See Also -------- TODO Notes ----- TODO Examples -------- >>> import seawater.gibbs as gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> entropy = [400.3892, 395.4378, 319.8668, 146.7910, 98.6471, 62.7919] >>> gsw.pt_from_entropy(SA, entropy) array([ 28.78317983, 28.42095483, 22.78495274, 10.23053207, 6.82921333, 4.32453778]) 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 appendix A.10. Modifications: 2011-04-03. Trevor McDougall and Paul Barker. """ SA.clip(0, np.inf) n0, n1 = 0, 1 part1 = 1 - SA / SSO part2 = 1 - 0.05 * part1 ent_SA = (cp0 / Kelvin) * part1 * (1 - 1.01 * part1) c = (entropy - ent_SA) * part2 / cp0 pt = Kelvin * (np.exp(c) - 1) dentropy_dt = cp0 / ((Kelvin + pt) * part2) # Initial dentropy_dt. for Number_of_iterations in range(0, 3): pt_old = pt dentropy = entropy_from_pt(SA, pt_old) - entropy pt = pt_old - dentropy / dentropy_dt # Half way through mod. method. ptm = 0.5 * (pt + pt_old) dentropy_dt = -gibbs_pt0_pt0(SA, ptm) pt = pt_old - dentropy / dentropy_dt """maximum error of 2.2x10^-6 degrees C for one iteration. maximum error is 1.4x10^-14 degrees C for two iterations (two iterations is the default, "for Number_of_iterations = 1:2").""" return pt
def pt0_from_t(SA, t, p): r"""Calculates potential temperature with reference pressure, pr = 0 dbar. The present routine is computationally faster than the more general function "pt_from_t(SA, t, p, pr)" which can be used for any reference pressure value. Parameters ---------- SA : array_like Absolute salinity [g kg :sup:`-1`] t : array_like in situ temperature [:math:`^\circ` C (ITS-90)] p : array_like pressure [dbar] Returns ------- pt0 : array_like potential temperature relative to 0 dbar [:math:`^\circ` C (ITS-90)] See Also -------- entropy_part, gibbs_pt0_pt0, entropy_part_zerop Notes ----- pt_from_t has the same result (only slower) Examples -------- >>> import gsw >>> SA = [34.7118, 34.8915, 35.0256, 34.8472, 34.7366, 34.7324] >>> t = [28.7856, 28.4329, 22.8103, 10.2600, 6.8863, 4.4036] >>> p = [10, 50, 125, 250, 600, 1000] >>> gsw.pt0_from_t(SA, t, p) array([ 28.78319682, 28.42098334, 22.7849304 , 10.23052366, 6.82923022, 4.32451057]) 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.1. .. [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. """ s1 = SA * (35. / SSO) pt0 = t + p * (8.65483913395442e-6 - s1 * 1.41636299744881e-6 - p * 7.38286467135737e-9 + t * (-8.38241357039698e-6 + s1 * 2.83933368585534e-8 + t * 1.77803965218656e-8 + p * 1.71155619208233e-10)) dentropy_dt = cp0 / ((Kelvin + pt0) * (1 - 0.05 * (1 - SA / SSO))) true_entropy_part = entropy_part(SA, t, p) for Number_of_iterations in range(0, 2, 1): pt0_old = pt0 dentropy = entropy_part_zerop(SA, pt0_old) - true_entropy_part pt0 = pt0_old - dentropy / dentropy_dt # Half way through mod. method. pt0m = 0.5 * (pt0 + pt0_old) dentropy_dt = -gibbs_pt0_pt0(SA, pt0m) pt0 = pt0_old - dentropy / dentropy_dt """maximum error of 6.3x10^-9 degrees C for one iteration. maximum error is 1.8x10^-14 degrees C for two iterations (two iterations is the default, "for Number_of_iterations = 1:2"). These errors are over the full "oceanographic funnel" of McDougall et al. (2010), which reaches down to p = 8000 dbar.""" return pt0