eosbn2.f90 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. MODULE eosbn2
  2. !!==============================================================================
  3. !! *** MODULE eosbn2 ***
  4. !! Ocean diagnostic variable : equation of state - in situ and potential density
  5. !! - Brunt-Vaisala frequency
  6. !!==============================================================================
  7. !! History : OPA ! 1989-03 (O. Marti) Original code
  8. !! 6.0 ! 1994-07 (G. Madec, M. Imbard) add bn2
  9. !! 6.0 ! 1994-08 (G. Madec) Add Jackett & McDougall eos
  10. !! 7.0 ! 1996-01 (G. Madec) statement function for e3
  11. !! 8.1 ! 1997-07 (G. Madec) density instead of volumic mass
  12. !! - ! 1999-02 (G. Madec, N. Grima) semi-implicit pressure gradient
  13. !! 8.2 ! 2001-09 (M. Ben Jelloul) bugfix on linear eos
  14. !! NEMO 1.0 ! 2002-10 (G. Madec) add eos_init
  15. !! - ! 2002-11 (G. Madec, A. Bozec) partial step, eos_insitu_2d
  16. !! - ! 2003-08 (G. Madec) F90, free form
  17. !! 3.0 ! 2006-08 (G. Madec) add tfreez function
  18. !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA
  19. !! - ! 2010-10 (G. Nurser, G. Madec) add eos_alpbet used in ldfslp
  20. !!----------------------------------------------------------------------
  21. !!----------------------------------------------------------------------
  22. !! eos : generic interface of the equation of state
  23. !! eos_insitu : Compute the in situ density
  24. !! eos_insitu_pot : Compute the insitu and surface referenced potential
  25. !! volumic mass
  26. !! eos_insitu_2d : Compute the in situ density for 2d fields
  27. !! eos_bn2 : Compute the Brunt-Vaisala frequency
  28. !! eos_alpbet : calculates the in situ thermal and haline expansion coeff.
  29. !! tfreez : Compute the surface freezing temperature
  30. !! eos_init : set eos parameters (namelist)
  31. !!----------------------------------------------------------------------
  32. ! USE dom_oce ! ocean space and time domain
  33. ! USE phycst ! physical constants
  34. ! USE zdfddm ! vertical physics: double diffusion
  35. ! USE in_out_manager ! I/O manager
  36. ! USE lib_mpp ! MPP library
  37. ! USE prtctl ! Print control
  38. IMPLICIT NONE
  39. ! !! * Interface
  40. ! !!* Namelist (nameos) *
  41. INTEGER :: nn_eos = 0 !: = 0/1/2 type of eq. of state and Brunt-Vaisala frequ.
  42. DOUBLE PRECISION :: rn_alpha = 2.0e-4 !: thermal expension coeff. (linear equation of state)
  43. DOUBLE PRECISION :: rn_beta = 7.7e-4 !: saline expension coeff. (linear equation of state)
  44. DOUBLE PRECISION :: ralpbet !: alpha / beta ratio
  45. INTEGER, PARAMETER :: jpi=1442, jpj=1021, jpk=46, jpts=2
  46. DOUBLE PRECISION :: rau0 = 1035
  47. CONTAINS
  48. SUBROUTINE eos_insitu_pot( pt, ps, pd, pmask, prhop )
  49. !!----------------------------------------------------------------------
  50. !! *** ROUTINE eos_insitu_pot ***
  51. !!
  52. !! ** Purpose : Compute the in situ density (ratio rho/rau0) and the
  53. !! potential volumic mass (Kg/m3) from potential temperature and
  54. !! salinity fields using an equation of state defined through the
  55. !! namelist parameter nn_eos.
  56. !!
  57. !! ** Method :
  58. !! nn_eos = 0 : Jackett and McDougall (1994) equation of state.
  59. !! the in situ density is computed directly as a function of
  60. !! potential temperature relative to the surface (the opa t
  61. !! variable), salt and pressure (assuming no pressure variation
  62. !! along geopotential surfaces, i.e. the pressure p in decibars
  63. !! is approximated by the depth in meters.
  64. !! prd(t,s,p) = ( rho(t,s,p) - rau0 ) / rau0
  65. !! rhop(t,s) = rho(t,s,0)
  66. !! with pressure p decibars
  67. !! potential temperature t deg celsius
  68. !! salinity s psu
  69. !! reference volumic mass rau0 kg/m**3
  70. !! in situ volumic mass rho kg/m**3
  71. !! in situ density anomalie prd no units
  72. !!
  73. !! Check value: rho = 1060.93298 kg/m**3 for p=10000 dbar,
  74. !! t = 40 deg celcius, s=40 psu
  75. !!
  76. !! nn_eos = 1 : linear equation of state function of temperature only
  77. !! prd(t) = ( rho(t) - rau0 ) / rau0 = 0.028 - rn_alpha * t
  78. !! rhop(t,s) = rho(t,s)
  79. !!
  80. !! nn_eos = 2 : linear equation of state function of temperature and
  81. !! salinity
  82. !! prd(t,s) = ( rho(t,s) - rau0 ) / rau0
  83. !! = rn_beta * s - rn_alpha * tn - 1.
  84. !! rhop(t,s) = rho(t,s)
  85. !! Note that no boundary condition problem occurs in this routine
  86. !! as (tn,sn) or (ta,sa) are defined over the whole domain.
  87. !!
  88. !! ** Action : - prd , the in situ density (no units)
  89. !! - prhop, the potential volumic mass (Kg/m3)
  90. !!
  91. !! References : Jackett and McDougall, J. Atmos. Ocean. Tech., 1994
  92. !! Brown and Campana, Mon. Weather Rev., 1978
  93. !!----------------------------------------------------------------------
  94. !!
  95. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ), INTENT( in) :: pt ! potential temperature [Celcius]
  96. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ), INTENT( in) :: ps ! salinity [psu]
  97. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ), INTENT( in) :: pmask
  98. DOUBLE PRECISION, DIMENSION(jpk ), INTENT( in) :: pd
  99. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ), INTENT( out) :: prhop ! potential density (surface referenced)
  100. !
  101. INTEGER :: ji, jj, jk ! dummy loop indices
  102. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ) :: zrd ! in situ density [-]
  103. DOUBLE PRECISION, DIMENSION(jpi,jpj,jpk ) :: zws
  104. DOUBLE PRECISION :: zt, zs, zh, zsr, zr1, zr2, zr3, zr4, zrhop, ze, zbw ! local scalars
  105. DOUBLE PRECISION :: zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zrau0r ! - -
  106. !!----------------------------------------------------------------------
  107. SELECT CASE ( nn_eos )
  108. !
  109. CASE( 0 ) !== Jackett and McDougall (1994) formulation ==!
  110. zrau0r = 1.e0 / rau0
  111. !CDIR NOVERRCHK
  112. zws(:,:,:) = SQRT( ABS( ps(:,:,:) ) )
  113. !
  114. DO jk = 1, (jpk-1)
  115. DO jj = 1, jpj
  116. DO ji = 1, jpi
  117. zt = pt (ji,jj,jk)
  118. zs = ps (ji,jj,jk)
  119. zh = pd (jk) ! depth
  120. zsr= zws (ji,jj,jk) ! square root salinity
  121. !
  122. ! compute volumic mass pure water at atm pressure
  123. zr1= ( ( ( ( 6.536332e-9*zt-1.120083e-6 )*zt+1.001685e-4 )*zt &
  124. & -9.095290e-3 )*zt+6.793952e-2 )*zt+999.842594
  125. ! seawater volumic mass atm pressure
  126. zr2= ( ( ( 5.3875e-9*zt-8.2467e-7 ) *zt+7.6438e-5 ) *zt &
  127. & -4.0899e-3 ) *zt+0.824493
  128. zr3= ( -1.6546e-6*zt+1.0227e-4 ) *zt-5.72466e-3
  129. zr4= 4.8314e-4
  130. !
  131. ! potential volumic mass (reference to the surface)
  132. zrhop= ( zr4*zs + zr3*zsr + zr2 ) *zs + zr1
  133. !
  134. ! save potential volumic mass
  135. prhop(ji,jj,jk) = zrhop * pmask(ji,jj,jk)
  136. !
  137. ! add the compression terms
  138. ze = ( -3.508914e-8*zt-1.248266e-8 ) *zt-2.595994e-6
  139. zbw= ( 1.296821e-6*zt-5.782165e-9 ) *zt+1.045941e-4
  140. zb = zbw + ze * zs
  141. !
  142. zd = -2.042967e-2
  143. zc = (-7.267926e-5*zt+2.598241e-3 ) *zt+0.1571896
  144. zaw= ( ( 5.939910e-6*zt+2.512549e-3 ) *zt-0.1028859 ) *zt - 4.721788
  145. za = ( zd*zsr + zc ) *zs + zaw
  146. !
  147. zb1= ( -0.1909078 *zt+7.390729 ) *zt-55.87545
  148. za1= ( ( 2.326469e-3*zt+1.553190 ) *zt-65.00517 ) *zt + 1044.077
  149. zkw= ( ( (-1.361629e-4*zt-1.852732e-2 ) *zt-30.41638 ) *zt + 2098.925 ) *zt+190925.6
  150. zk0= ( zb1*zsr + za1 )*zs + zkw
  151. !
  152. ! masked in situ density anomaly
  153. zrd(ji,jj,jk) = ( zrhop / ( 1.0 - zh / ( zk0 - zh * ( za - zh * zb ) ) ) &
  154. & - rau0 ) * zrau0r * pmask(ji,jj,jk)
  155. END DO
  156. END DO
  157. END DO
  158. !
  159. CASE( 1 ) !== Linear formulation = F( temperature ) ==!
  160. DO jk = 1, (jpk-1)
  161. zrd (:,:,jk) = ( 0.0285 - rn_alpha * pt (:,:,jk) ) * pmask(:,:,jk)
  162. prhop(:,:,jk) = ( 1.e0 + zrd (:,:,jk) ) * rau0 * pmask(:,:,jk)
  163. END DO
  164. !
  165. CASE( 2 ) !== Linear formulation = F( temperature , salinity ) ==!
  166. DO jk = 1, (jpk-1)
  167. zrd (:,:,jk) = ( rn_beta * ps(:,:,jk) - rn_alpha * pt(:,:,jk) ) * pmask(:,:,jk)
  168. prhop(:,:,jk) = ( 1.e0 + zrd (:,:,jk) ) * rau0 * pmask(:,:,jk)
  169. END DO
  170. !
  171. END SELECT
  172. !
  173. !
  174. END SUBROUTINE eos_insitu_pot
  175. !!======================================================================
  176. END MODULE eosbn2