agrif_top_update.F90 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #define TWO_WAY
  2. #undef DECAL_FEEDBACK
  3. MODULE agrif_top_update
  4. #if defined key_agrif && defined key_top
  5. USE par_oce
  6. USE oce
  7. USE dom_oce
  8. USE agrif_oce
  9. USE par_trc
  10. USE trc
  11. USE wrk_nemo
  12. IMPLICIT NONE
  13. PRIVATE
  14. PUBLIC Agrif_Update_Trc
  15. INTEGER, PUBLIC :: nbcline_trc = 0
  16. !!----------------------------------------------------------------------
  17. !! NEMO/NST 3.3 , NEMO Consortium (2010)
  18. !! $Id: agrif_top_update.F90 4491 2014-02-06 16:47:57Z jchanut $
  19. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  20. !!----------------------------------------------------------------------
  21. CONTAINS
  22. SUBROUTINE Agrif_Update_Trc( kt )
  23. !!---------------------------------------------
  24. !! *** ROUTINE Agrif_Update_Trc ***
  25. !!---------------------------------------------
  26. INTEGER, INTENT(in) :: kt
  27. !!---------------------------------------------
  28. !
  29. IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN
  30. #if defined TWO_WAY
  31. Agrif_UseSpecialValueInUpdate = .TRUE.
  32. Agrif_SpecialValueFineGrid = 0.
  33. !
  34. IF (MOD(nbcline_trc,nbclineupdate) == 0) THEN
  35. # if ! defined DECAL_FEEDBACK
  36. CALL Agrif_Update_Variable(trn_id, procname=updateTRC)
  37. # else
  38. CALL Agrif_Update_Variable(trn_id, locupdate=(/1,0/),procname=updateTRC)
  39. # endif
  40. ELSE
  41. # if ! defined DECAL_FEEDBACK
  42. CALL Agrif_Update_Variable(trn_id,locupdate=(/0,2/), procname=updateTRC)
  43. # else
  44. CALL Agrif_Update_Variable(trn_id,locupdate=(/1,2/), procname=updateTRC)
  45. # endif
  46. ENDIF
  47. !
  48. Agrif_UseSpecialValueInUpdate = .FALSE.
  49. nbcline_trc = nbcline_trc + 1
  50. #endif
  51. !
  52. END SUBROUTINE Agrif_Update_Trc
  53. SUBROUTINE updateTRC( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before )
  54. !!---------------------------------------------
  55. !! *** ROUTINE updateT ***
  56. !!---------------------------------------------
  57. # include "domzgr_substitute.h90"
  58. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  59. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab
  60. LOGICAL, INTENT(in) :: before
  61. !!
  62. INTEGER :: ji,jj,jk,jn
  63. !!---------------------------------------------
  64. !
  65. IF (before) THEN
  66. DO jn = n1,n2
  67. DO jk=k1,k2
  68. DO jj=j1,j2
  69. DO ji=i1,i2
  70. ptab(ji,jj,jk,jn) = trn(ji,jj,jk,jn)
  71. END DO
  72. END DO
  73. END DO
  74. END DO
  75. ELSE
  76. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
  77. ! Add asselin part
  78. DO jn = n1,n2
  79. DO jk=k1,k2
  80. DO jj=j1,j2
  81. DO ji=i1,i2
  82. IF( ptab(ji,jj,jk,jn) .NE. 0. ) THEN
  83. trb(ji,jj,jk,jn) = trb(ji,jj,jk,jn) &
  84. & + atfp * ( ptab(ji,jj,jk,jn) &
  85. & - trn(ji,jj,jk,jn) ) * tmask(ji,jj,jk)
  86. ENDIF
  87. ENDDO
  88. ENDDO
  89. ENDDO
  90. ENDDO
  91. ENDIF
  92. DO jn = n1,n2
  93. DO jk=k1,k2
  94. DO jj=j1,j2
  95. DO ji=i1,i2
  96. IF( ptab(ji,jj,jk,jn) .NE. 0. ) THEN
  97. trn(ji,jj,jk,jn) = ptab(ji,jj,jk,jn) * tmask(ji,jj,jk)
  98. END IF
  99. END DO
  100. END DO
  101. END DO
  102. END DO
  103. ENDIF
  104. !
  105. END SUBROUTINE updateTRC
  106. #else
  107. CONTAINS
  108. SUBROUTINE agrif_top_update_empty
  109. !!---------------------------------------------
  110. !! *** ROUTINE agrif_Top_update_empty ***
  111. !!---------------------------------------------
  112. WRITE(*,*) 'agrif_top_update : You should not have seen this print! error?'
  113. END SUBROUTINE agrif_top_update_empty
  114. #endif
  115. END MODULE agrif_top_update