stopts.F90 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. MODULE stopts
  2. !!==============================================================================
  3. !! *** MODULE stopts ***
  4. !! Stochastic parameterization: compute stochastic tracer fluctuations
  5. !!==============================================================================
  6. !! History : 3.3 ! 2011-12 (J.-M. Brankart) Original code
  7. !!----------------------------------------------------------------------
  8. !!----------------------------------------------------------------------
  9. !! sto_pts : compute current stochastic tracer fluctuations
  10. !! sto_pts_init : initialisation for stochastic tracer fluctuations
  11. !!----------------------------------------------------------------------
  12. USE dom_oce ! ocean space and time domain
  13. USE lbclnk ! lateral boundary conditions (or mpp link)
  14. USE phycst ! physical constants
  15. USE stopar ! stochastic parameterization
  16. IMPLICIT NONE
  17. PRIVATE
  18. PUBLIC sto_pts ! called by step.F90
  19. PUBLIC sto_pts_init ! called by nemogcm.F90
  20. ! Public array with random tracer fluctuations
  21. REAL(wp), PUBLIC, DIMENSION(:,:,:,:,:), ALLOCATABLE :: pts_ran
  22. !! * Substitutions
  23. # include "vectopt_loop_substitute.h90"
  24. !!----------------------------------------------------------------------
  25. !! NEMO/OPA 3.3 , NEMO Consortium (2010)
  26. !! $Id: eosbn2.F90 2528 2010-12-27 17:33:53Z rblod $
  27. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  28. !!----------------------------------------------------------------------
  29. CONTAINS
  30. SUBROUTINE sto_pts( pts )
  31. !!----------------------------------------------------------------------
  32. !! *** ROUTINE sto_pts ***
  33. !!
  34. !! ** Purpose : Compute current stochastic tracer fluctuations
  35. !!
  36. !! ** Method : Compute tracer differences from a random walk
  37. !! around every model grid point
  38. !!
  39. !!----------------------------------------------------------------------
  40. REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) :: pts ! 1 : potential temperature [Celsius]
  41. ! ! 2 : salinity [psu]
  42. INTEGER :: ji, jj, jk, jts, jdof ! dummy loop indices
  43. INTEGER :: jim1, jjm1, jkm1 ! incremented indices
  44. INTEGER :: jip1, jjp1, jkp1 ! - -
  45. REAL(wp) :: zdtsim, zdtsjm, zdtskm ! temporary scalars
  46. REAL(wp) :: zdtsip, zdtsjp, zdtskp, zdts ! - -
  47. !!----------------------------------------------------------------------
  48. DO jts = 1, jpts
  49. CALL lbc_lnk( pts(:,:,:,jts), 'T' , 1._wp )
  50. ENDDO
  51. DO jdof = 1, nn_sto_eos
  52. DO jts = 1, jpts
  53. DO jk = 1, jpkm1
  54. jkm1 = MAX(jk-1,1) ; jkp1 = MIN(jk+1,jpkm1)
  55. DO jj = 1, jpj
  56. jjm1 = MAX(jj-1,1) ; jjp1 = MIN(jj+1,jpj)
  57. DO ji = 1, jpi
  58. jim1 = MAX(ji-1,1) ; jip1 = MIN(ji+1,jpi)
  59. !
  60. ! compute tracer gradient
  61. zdtsip = ( pts(jip1,jj,jk,jts) - pts(ji,jj,jk,jts) ) * tmask(jip1,jj,jk)
  62. zdtsim = ( pts(ji,jj,jk,jts) - pts(jim1,jj,jk,jts) ) * tmask(jim1,jj,jk)
  63. zdtsjp = ( pts(ji,jjp1,jk,jts) - pts(ji,jj,jk,jts) ) * tmask(ji,jjp1,jk)
  64. zdtsjm = ( pts(ji,jj,jk,jts) - pts(ji,jjm1,jk,jts) ) * tmask(ji,jjm1,jk)
  65. zdtskp = ( pts(ji,jj,jkp1,jts) - pts(ji,jj,jk,jts) ) * tmask(ji,jj,jkp1)
  66. zdtskm = ( pts(ji,jj,jk,jts) - pts(ji,jj,jkm1,jts) ) * tmask(ji,jj,jkm1)
  67. !
  68. ! compute random tracer fluctuation (zdts)
  69. zdts = ( zdtsip + zdtsim ) * sto2d(ji,jj,jsto_eosi(jdof)) + &
  70. & ( zdtsjp + zdtsjm ) * sto2d(ji,jj,jsto_eosj(jdof)) + &
  71. & ( zdtskp + zdtskm ) * sto2d(ji,jj,jsto_eosk(jdof))
  72. ! zdts = zdtsip * MAX(sto2d(ji,jj,jsto_eosi),0._wp) + &
  73. ! & zdtsim * MIN(sto2d(ji,jj,jsto_eosi),0._wp) + &
  74. ! & zdtsjp * MAX(sto2d(ji,jj,jsto_eosj),0._wp) + &
  75. ! & zdtsjm * MIN(sto2d(ji,jj,jsto_eosj),0._wp) + &
  76. ! & zdtskp * MAX(sto2d(ji,jj,jsto_eosk),0._wp) + &
  77. ! & zdtskm * MIN(sto2d(ji,jj,jsto_eosk),0._wp)
  78. zdts = zdts * tmask(ji,jj,jk) *SIN( gphit(ji,jj) * rad )
  79. pts_ran(ji,jj,jk,jts,jdof) = zdts * 0.5_wp
  80. !
  81. END DO
  82. END DO
  83. END DO
  84. END DO
  85. END DO
  86. ! Eliminate any possible negative salinity
  87. DO jdof = 1, nn_sto_eos
  88. DO jk = 1, jpkm1
  89. DO jj = 1, jpj
  90. DO ji = 1, jpi
  91. pts_ran(ji,jj,jk,jp_sal,jdof) = MIN( ABS(pts_ran(ji,jj,jk,jp_sal,jdof)) , &
  92. & MAX(pts(ji,jj,jk,jp_sal),0._wp) ) &
  93. & * SIGN(1._wp,pts_ran(ji,jj,jk,jp_sal,jdof))
  94. END DO
  95. END DO
  96. END DO
  97. END DO
  98. ! Eliminate any temperature lower than -2 degC
  99. ! DO jdof = 1, nn_sto_eos
  100. ! DO jk = 1, jpkm1
  101. ! DO jj = 1, jpj
  102. ! DO ji = 1, jpi
  103. ! pts_ran(ji,jj,jk,jp_tem,jdof) = MIN( ABS(pts_ran(ji,jj,jk,jp_tem,jdof)) , &
  104. ! & MAX(pts(ji,jj,jk,jp_tem)+2._wp,0._wp) ) &
  105. ! & * SIGN(1._wp,pts_ran(ji,jj,jk,jp_tem,jdof))
  106. ! END DO
  107. ! END DO
  108. ! END DO
  109. ! END DO
  110. ! Lateral boundary conditions on pts_ran
  111. DO jdof = 1, nn_sto_eos
  112. DO jts = 1, jpts
  113. CALL lbc_lnk( pts_ran(:,:,:,jts,jdof), 'T' , 1._wp )
  114. END DO
  115. END DO
  116. END SUBROUTINE sto_pts
  117. SUBROUTINE sto_pts_init
  118. !!----------------------------------------------------------------------
  119. !! *** ROUTINE sto_pts_init ***
  120. !!
  121. !! ** Purpose : Initialisation for stochastic tracer fluctuations
  122. !!
  123. !! ** Method : Allocate required array
  124. !!
  125. !!----------------------------------------------------------------------
  126. ALLOCATE(pts_ran(jpi,jpj,jpk,jpts,nn_sto_eos))
  127. END SUBROUTINE sto_pts_init
  128. END MODULE stopts