ldfeiv.F90 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. MODULE ldfeiv
  2. !!======================================================================
  3. !! *** MODULE ldfeiv ***
  4. !! Ocean physics: variable eddy induced velocity coefficients
  5. !!======================================================================
  6. !! History : OPA ! 1999-03 (G. Madec, A. Jouzeau) Original code
  7. !! NEMO 1.0 ! 2002-06 (G. Madec) Free form, F90
  8. !!----------------------------------------------------------------------
  9. #if defined key_traldf_eiv && defined key_traldf_c2d
  10. !!----------------------------------------------------------------------
  11. !! 'key_traldf_eiv' and eddy induced velocity
  12. !! 'key_traldf_c2d' 2D tracer lateral mixing coef.
  13. !!----------------------------------------------------------------------
  14. !! ldf_eiv : compute the eddy induced velocity coefficients
  15. !!----------------------------------------------------------------------
  16. USE oce ! ocean dynamics and tracers
  17. USE dom_oce ! ocean space and time domain
  18. USE sbc_oce ! surface boundary condition: ocean
  19. USE sbcrnf ! river runoffs
  20. USE ldftra_oce ! ocean tracer lateral physics
  21. USE phycst ! physical constants
  22. USE ldfslp ! iso-neutral slopes
  23. USE in_out_manager ! I/O manager
  24. USE lbclnk ! ocean lateral boundary conditions (or mpp link)
  25. USE prtctl ! Print control
  26. USE iom ! I/O library
  27. USE wrk_nemo ! work arrays
  28. USE timing ! Timing
  29. IMPLICIT NONE
  30. PRIVATE
  31. PUBLIC ldf_eiv ! routine called by step.F90
  32. !! * Substitutions
  33. # include "domzgr_substitute.h90"
  34. # include "vectopt_loop_substitute.h90"
  35. !!----------------------------------------------------------------------
  36. !! NEMO/OPA 3.3 , NEMO Consortium (2010)
  37. !! $Id: ldfeiv.F90 4990 2014-12-15 16:42:49Z timgraham $
  38. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  39. !!----------------------------------------------------------------------
  40. CONTAINS
  41. SUBROUTINE ldf_eiv( kt )
  42. !!----------------------------------------------------------------------
  43. !! *** ROUTINE ldf_eiv ***
  44. !!
  45. !! ** Purpose : Compute the eddy induced velocity coefficient from the
  46. !! growth rate of baroclinic instability.
  47. !!
  48. !! ** Method :
  49. !!
  50. !! ** Action : - uslp , vslp : i- and j-slopes of neutral surfaces at u- & v-points
  51. !! - wslpi, wslpj : i- and j-slopes of neutral surfaces at w-points.
  52. !!----------------------------------------------------------------------
  53. INTEGER, INTENT(in) :: kt ! ocean time-step inedx
  54. !
  55. INTEGER :: ji, jj, jk ! dummy loop indices
  56. REAL(wp) :: zfw, ze3w, zn2, zf20, zaht, zaht_min ! temporary scalars
  57. REAL(wp), DIMENSION(:,:), POINTER :: zn, zah, zhw, zross ! 2D workspace
  58. !!----------------------------------------------------------------------
  59. !
  60. IF( nn_timing == 1 ) CALL timing_start('ldf_eiv')
  61. !
  62. CALL wrk_alloc( jpi,jpj, zn, zah, zhw, zross )
  63. IF( kt == nit000 ) THEN
  64. IF(lwp) WRITE(numout,*)
  65. IF(lwp) WRITE(numout,*) 'ldf_eiv : eddy induced velocity coefficients'
  66. IF(lwp) WRITE(numout,*) '~~~~~~~'
  67. ENDIF
  68. ! 0. Local initialization
  69. ! -----------------------
  70. zn (:,:) = 0._wp
  71. zhw (:,:) = 5._wp
  72. zah (:,:) = 0._wp
  73. zross(:,:) = 0._wp
  74. ! 1. Compute lateral diffusive coefficient
  75. ! ----------------------------------------
  76. IF( ln_traldf_grif ) THEN
  77. DO jk = 1, jpk
  78. DO jj = 2, jpjm1
  79. DO ji = 2, jpim1
  80. ! Take the max of N^2 and zero then take the vertical sum
  81. ! of the square root of the resulting N^2 ( required to compute
  82. ! internal Rossby radius Ro = .5 * sum_jpk(N) / f
  83. zn2 = MAX( rn2b(ji,jj,jk), 0._wp )
  84. zn(ji,jj) = zn(ji,jj) + SQRT( zn2 ) * fse3w(ji,jj,jk)
  85. ! Compute elements required for the inverse time scale of baroclinic
  86. ! eddies using the isopycnal slopes calculated in ldfslp.F :
  87. ! T^-1 = sqrt(m_jpk(N^2*(r1^2+r2^2)*e3w))
  88. ze3w = fse3w(ji,jj,jk) * tmask(ji,jj,jk)
  89. zah(ji,jj) = zah(ji,jj) + zn2 * wslp2(ji,jj,jk) * ze3w
  90. zhw(ji,jj) = zhw(ji,jj) + ze3w
  91. END DO
  92. END DO
  93. END DO
  94. ELSE
  95. DO jk = 1, jpk
  96. DO jj = 2, jpjm1
  97. DO ji = 2, jpim1
  98. ! Take the max of N^2 and zero then take the vertical sum
  99. ! of the square root of the resulting N^2 ( required to compute
  100. ! internal Rossby radius Ro = .5 * sum_jpk(N) / f
  101. zn2 = MAX( rn2b(ji,jj,jk), 0._wp )
  102. zn(ji,jj) = zn(ji,jj) + SQRT( zn2 ) * fse3w(ji,jj,jk)
  103. ! Compute elements required for the inverse time scale of baroclinic
  104. ! eddies using the isopycnal slopes calculated in ldfslp.F :
  105. ! T^-1 = sqrt(m_jpk(N^2*(r1^2+r2^2)*e3w))
  106. ze3w = fse3w(ji,jj,jk) * tmask(ji,jj,jk)
  107. zah(ji,jj) = zah(ji,jj) + zn2 * ( wslpi(ji,jj,jk) * wslpi(ji,jj,jk) &
  108. & + wslpj(ji,jj,jk) * wslpj(ji,jj,jk) ) * ze3w
  109. zhw(ji,jj) = zhw(ji,jj) + ze3w
  110. END DO
  111. END DO
  112. END DO
  113. END IF
  114. DO jj = 2, jpjm1
  115. DO ji = fs_2, fs_jpim1 ! vector opt.
  116. zfw = MAX( ABS( 2. * omega * SIN( rad * gphit(ji,jj) ) ) , 1.e-10 )
  117. ! Rossby radius at w-point taken < 40km and > 2km
  118. zross(ji,jj) = MAX( MIN( .4 * zn(ji,jj) / zfw, 40.e3 ), 2.e3 )
  119. ! Compute aeiw by multiplying Ro^2 and T^-1
  120. aeiw(ji,jj) = zross(ji,jj) * zross(ji,jj) * SQRT( zah(ji,jj) / zhw(ji,jj) ) * ssmask(ji,jj)
  121. END DO
  122. END DO
  123. IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA R2
  124. DO jj = 2, jpjm1
  125. !CDIR NOVERRCHK
  126. DO ji = fs_2, fs_jpim1 ! vector opt.
  127. ! Take the minimum between aeiw and 1000 m2/s over shelves (depth shallower than 650 m)
  128. IF( mbkt(ji,jj) <= 20 ) aeiw(ji,jj) = MIN( aeiw(ji,jj), 1000. )
  129. END DO
  130. END DO
  131. ENDIF
  132. ! Decrease the coefficient in the tropics (20N-20S)
  133. zf20 = 2._wp * omega * sin( rad * 20._wp )
  134. DO jj = 2, jpjm1
  135. DO ji = fs_2, fs_jpim1 ! vector opt.
  136. aeiw(ji,jj) = MIN( 1., ABS( ff(ji,jj) / zf20 ) ) * aeiw(ji,jj)
  137. END DO
  138. END DO
  139. ! ORCA R05: Take the minimum between aeiw and aeiv0
  140. IF( cp_cfg == "orca" .AND. jp_cfg == 05 ) THEN
  141. DO jj = 2, jpjm1
  142. DO ji = fs_2, fs_jpim1 ! vector opt.
  143. aeiw(ji,jj) = MIN( aeiw(ji,jj), aeiv0 )
  144. END DO
  145. END DO
  146. ENDIF
  147. ! ORCA R1: Take the minimum between aeiw and aeiv0
  148. IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN
  149. DO jj = 2, jpjm1
  150. DO ji = fs_2, fs_jpim1 ! vector opt.
  151. aeiw(ji,jj) = MIN( aeiw(ji,jj), aeiv0 )
  152. END DO
  153. END DO
  154. ENDIF
  155. CALL lbc_lnk( aeiw, 'W', 1. ) ! lateral boundary condition on aeiw
  156. ! Average the diffusive coefficient at u- v- points
  157. DO jj = 2, jpjm1
  158. DO ji = fs_2, fs_jpim1 ! vector opt.
  159. aeiu(ji,jj) = 0.5_wp * ( aeiw(ji,jj) + aeiw(ji+1,jj ) )
  160. aeiv(ji,jj) = 0.5_wp * ( aeiw(ji,jj) + aeiw(ji ,jj+1) )
  161. END DO
  162. END DO
  163. CALL lbc_lnk( aeiu, 'U', 1. ) ; CALL lbc_lnk( aeiv, 'V', 1. ) ! lateral boundary condition
  164. IF(ln_ctl) THEN
  165. CALL prt_ctl(tab2d_1=aeiu, clinfo1=' eiv - u: ', ovlap=1)
  166. CALL prt_ctl(tab2d_1=aeiv, clinfo1=' eiv - v: ', ovlap=1)
  167. ENDIF
  168. ! ORCA R05: add a space variation on aht (=aeiv except at the equator and river mouth)
  169. IF( cp_cfg == "orca" .AND. jp_cfg == 05 ) THEN
  170. zf20 = 2._wp * omega * SIN( rad * 20._wp )
  171. zaht_min = 100._wp ! minimum value for aht
  172. DO jj = 1, jpj
  173. DO ji = 1, jpi
  174. zaht = ( 1._wp - MIN( 1._wp , ABS( ff(ji,jj) / zf20 ) ) ) * ( aht0 - zaht_min ) &
  175. & + aht0 * rnfmsk(ji,jj) ! enhanced near river mouths
  176. ahtu(ji,jj) = MAX( MAX( zaht_min, aeiu(ji,jj) ) + zaht, aht0 )
  177. ahtv(ji,jj) = MAX( MAX( zaht_min, aeiv(ji,jj) ) + zaht, aht0 )
  178. ahtw(ji,jj) = MAX( MAX( zaht_min, aeiw(ji,jj) ) + zaht, aht0 )
  179. END DO
  180. END DO
  181. IF(ln_ctl) THEN
  182. CALL prt_ctl(tab2d_1=ahtu, clinfo1=' aht - u: ', ovlap=1)
  183. CALL prt_ctl(tab2d_1=ahtv, clinfo1=' aht - v: ', ovlap=1)
  184. CALL prt_ctl(tab2d_1=ahtw, clinfo1=' aht - w: ', ovlap=1)
  185. ENDIF
  186. ENDIF
  187. IF( aeiv0 == 0._wp ) THEN
  188. aeiu(:,:) = 0._wp
  189. aeiv(:,:) = 0._wp
  190. aeiw(:,:) = 0._wp
  191. ENDIF
  192. CALL iom_put( "aht2d" , ahtw ) ! lateral eddy diffusivity
  193. CALL iom_put( "aht2d_eiv", aeiw ) ! EIV lateral eddy diffusivity
  194. !
  195. CALL wrk_dealloc( jpi,jpj, zn, zah, zhw, zross )
  196. !
  197. IF( nn_timing == 1 ) CALL timing_stop('ldf_eiv')
  198. !
  199. END SUBROUTINE ldf_eiv
  200. #else
  201. !!----------------------------------------------------------------------
  202. !! Default option Dummy module
  203. !!----------------------------------------------------------------------
  204. CONTAINS
  205. SUBROUTINE ldf_eiv( kt ) ! Empty routine
  206. INTEGER :: kt
  207. WRITE(*,*) 'ldf_eiv: You should not have seen this print! error?', kt
  208. END SUBROUTINE ldf_eiv
  209. #endif
  210. !!======================================================================
  211. END MODULE ldfeiv