agrif_top_sponge.F90 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #define SPONGE_TOP
  2. MODULE agrif_top_sponge
  3. #if defined key_agrif && defined key_top
  4. USE par_oce
  5. USE par_trc
  6. USE oce
  7. USE dom_oce
  8. USE in_out_manager
  9. USE agrif_oce
  10. USE agrif_opa_sponge
  11. USE trc
  12. USE lib_mpp
  13. USE wrk_nemo
  14. IMPLICIT NONE
  15. PRIVATE
  16. PUBLIC Agrif_Sponge_trc, interptrn_sponge
  17. !! * Substitutions
  18. # include "domzgr_substitute.h90"
  19. !!----------------------------------------------------------------------
  20. !! NEMO/NST 3.6 , NEMO Consortium (2010)
  21. !! $Id: agrif_top_sponge.F90 3680 2012-11-27 14:42:24Z rblod $
  22. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  23. !!----------------------------------------------------------------------
  24. CONTAINS
  25. SUBROUTINE Agrif_Sponge_trc
  26. !!---------------------------------------------
  27. !! *** ROUTINE Agrif_Sponge_Trc ***
  28. !!---------------------------------------------
  29. !!
  30. REAL(wp) :: timecoeff
  31. #if defined SPONGE_TOP
  32. timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot()
  33. CALL Agrif_sponge
  34. Agrif_SpecialValue=0.
  35. Agrif_UseSpecialValue = .TRUE.
  36. tabspongedone_trn = .FALSE.
  37. CALL Agrif_Bc_Variable(trn_sponge_id,calledweight=timecoeff,procname=interptrn_sponge)
  38. Agrif_UseSpecialValue = .FALSE.
  39. #endif
  40. END SUBROUTINE Agrif_Sponge_Trc
  41. SUBROUTINE interptrn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before)
  42. !!---------------------------------------------
  43. !! *** ROUTINE interptrn_sponge ***
  44. !!---------------------------------------------
  45. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  46. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
  47. LOGICAL, INTENT(in) :: before
  48. INTEGER :: ji, jj, jk, jn ! dummy loop indices
  49. REAL(wp) :: ztra, zabe1, zabe2, zbtr
  50. REAL(wp), DIMENSION(i1:i2,j1:j2) :: ztu, ztv
  51. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::trbdiff
  52. !
  53. IF (before) THEN
  54. tabres(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2)
  55. ELSE
  56. trbdiff(:,:,:,:) = trb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)
  57. DO jn = 1, jptra
  58. DO jk = 1, jpkm1
  59. DO jj = j1,j2-1
  60. DO ji = i1,i2-1
  61. zabe1 = fsaht_spu(ji,jj) * umask(ji,jj,jk) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,jk)
  62. zabe2 = fsaht_spv(ji,jj) * vmask(ji,jj,jk) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,jk)
  63. ztu(ji,jj) = zabe1 * ( trbdiff(ji+1,jj ,jk,jn) - trbdiff(ji,jj,jk,jn) )
  64. ztv(ji,jj) = zabe2 * ( trbdiff(ji ,jj+1,jk,jn) - trbdiff(ji,jj,jk,jn) )
  65. ENDDO
  66. ENDDO
  67. DO jj = j1+1,j2-1
  68. DO ji = i1+1,i2-1
  69. IF (.NOT. tabspongedone_trn(ji,jj)) THEN
  70. zbtr = r1_e12t(ji,jj) / fse3t(ji,jj,jk)
  71. ! horizontal diffusive trends
  72. ztra = zbtr * ( ztu(ji,jj) - ztu(ji-1,jj ) + ztv(ji,jj) - ztv(ji ,jj-1) )
  73. ! add it to the general tracer trends
  74. tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra
  75. ENDIF
  76. ENDDO
  77. ENDDO
  78. ENDDO
  79. ENDDO
  80. tabspongedone_trn(i1+1:i2-1,j1+1:j2-1) = .TRUE.
  81. ENDIF
  82. !
  83. END SUBROUTINE interptrn_sponge
  84. #else
  85. CONTAINS
  86. SUBROUTINE agrif_top_sponge_empty
  87. !!---------------------------------------------
  88. !! *** ROUTINE agrif_top_sponge_empty ***
  89. !!---------------------------------------------
  90. WRITE(*,*) 'agrif_top_sponge : You should not have seen this print! error?'
  91. END SUBROUTINE agrif_top_sponge_empty
  92. #endif
  93. END MODULE agrif_top_sponge