agrif_top_interp.F90 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. MODULE agrif_top_interp
  2. #if defined key_agrif && defined key_top
  3. USE par_oce
  4. USE oce
  5. USE dom_oce
  6. USE sol_oce
  7. USE agrif_oce
  8. USE agrif_top_sponge
  9. USE par_trc
  10. USE trc
  11. USE lib_mpp
  12. USE wrk_nemo
  13. IMPLICIT NONE
  14. PRIVATE
  15. PUBLIC Agrif_trc, interptrn
  16. # include "domzgr_substitute.h90"
  17. # include "vectopt_loop_substitute.h90"
  18. !!----------------------------------------------------------------------
  19. !! NEMO/NST 3.6 , NEMO Consortium (2010)
  20. !! $Id: agrif_top_interp.F90 3680 2012-11-27 14:42:24Z rblod $
  21. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  22. !!----------------------------------------------------------------------
  23. CONTAINS
  24. SUBROUTINE Agrif_trc
  25. !!----------------------------------------------------------------------
  26. !! *** ROUTINE Agrif_trc ***
  27. !!----------------------------------------------------------------------
  28. !
  29. IF( Agrif_Root() ) RETURN
  30. Agrif_SpecialValue = 0.e0
  31. Agrif_UseSpecialValue = .TRUE.
  32. CALL Agrif_Bc_variable( trn_id, procname=interptrn )
  33. Agrif_UseSpecialValue = .FALSE.
  34. !
  35. END SUBROUTINE Agrif_trc
  36. SUBROUTINE interptrn(ptab,i1,i2,j1,j2,k1,k2,n1,n2,before,nb,ndir)
  37. !!---------------------------------------------
  38. !! *** ROUTINE interptrn ***
  39. !!---------------------------------------------
  40. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab
  41. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  42. LOGICAL, INTENT(in) :: before
  43. INTEGER, INTENT(in) :: nb , ndir
  44. !
  45. INTEGER :: ji, jj, jk, jn ! dummy loop indices
  46. INTEGER :: imin, imax, jmin, jmax
  47. REAL(wp) :: zrhox , zalpha1, zalpha2, zalpha3
  48. REAL(wp) :: zalpha4, zalpha5, zalpha6, zalpha7
  49. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  50. IF (before) THEN
  51. ptab(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2)
  52. ELSE
  53. !
  54. western_side = (nb == 1).AND.(ndir == 1)
  55. eastern_side = (nb == 1).AND.(ndir == 2)
  56. southern_side = (nb == 2).AND.(ndir == 1)
  57. northern_side = (nb == 2).AND.(ndir == 2)
  58. !
  59. zrhox = Agrif_Rhox()
  60. !
  61. zalpha1 = ( zrhox - 1. ) * 0.5
  62. zalpha2 = 1. - zalpha1
  63. !
  64. zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. )
  65. zalpha4 = 1. - zalpha3
  66. !
  67. zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. )
  68. zalpha7 = - ( zrhox - 1. ) / ( zrhox + 3. )
  69. zalpha5 = 1. - zalpha6 - zalpha7
  70. !
  71. imin = i1
  72. imax = i2
  73. jmin = j1
  74. jmax = j2
  75. !
  76. ! Remove CORNERS
  77. IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3
  78. IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2
  79. IF((nbondi == -1).OR.(nbondi == 2)) imin = 3
  80. IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2
  81. !
  82. IF( eastern_side) THEN
  83. DO jn = 1, jptra
  84. tra(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn)
  85. DO jk = 1, jpkm1
  86. DO jj = jmin,jmax
  87. IF( umask(nlci-2,jj,jk) == 0.e0 ) THEN
  88. tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk)
  89. ELSE
  90. tra(nlci-1,jj,jk,jn)=(zalpha4*tra(nlci,jj,jk,jn)+zalpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk)
  91. IF( un(nlci-2,jj,jk) > 0.e0 ) THEN
  92. tra(nlci-1,jj,jk,jn)=( zalpha6*tra(nlci-2,jj,jk,jn)+zalpha5*tra(nlci,jj,jk,jn) &
  93. + zalpha7*tra(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk)
  94. ENDIF
  95. ENDIF
  96. END DO
  97. END DO
  98. ENDDO
  99. ENDIF
  100. !
  101. IF( northern_side ) THEN
  102. DO jn = 1, jptra
  103. tra(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn)
  104. DO jk = 1, jpkm1
  105. DO ji = imin,imax
  106. IF( vmask(ji,nlcj-2,jk) == 0.e0 ) THEN
  107. tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk)
  108. ELSE
  109. tra(ji,nlcj-1,jk,jn)=(zalpha4*tra(ji,nlcj,jk,jn)+zalpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)
  110. IF (vn(ji,nlcj-2,jk) > 0.e0 ) THEN
  111. tra(ji,nlcj-1,jk,jn)=( zalpha6*tra(ji,nlcj-2,jk,jn)+zalpha5*tra(ji,nlcj,jk,jn) &
  112. + zalpha7*tra(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk)
  113. ENDIF
  114. ENDIF
  115. END DO
  116. END DO
  117. ENDDO
  118. ENDIF
  119. !
  120. IF( western_side) THEN
  121. DO jn = 1, jptra
  122. tra(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn)
  123. DO jk = 1, jpkm1
  124. DO jj = jmin,jmax
  125. IF( umask(2,jj,jk) == 0.e0 ) THEN
  126. tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk)
  127. ELSE
  128. tra(2,jj,jk,jn)=(zalpha4*tra(1,jj,jk,jn)+zalpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)
  129. IF( un(2,jj,jk) < 0.e0 ) THEN
  130. tra(2,jj,jk,jn)=(zalpha6*tra(3,jj,jk,jn)+zalpha5*tra(1,jj,jk,jn)+zalpha7*tra(4,jj,jk,jn))*tmask(2,jj,jk)
  131. ENDIF
  132. ENDIF
  133. END DO
  134. END DO
  135. END DO
  136. ENDIF
  137. !
  138. IF( southern_side ) THEN
  139. DO jn = 1, jptra
  140. tra(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn)
  141. DO jk=1,jpk
  142. DO ji=imin,imax
  143. IF( vmask(ji,2,jk) == 0.e0 ) THEN
  144. tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk)
  145. ELSE
  146. tra(ji,2,jk,jn)=(zalpha4*tra(ji,1,jk,jn)+zalpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk)
  147. IF( vn(ji,2,jk) < 0.e0 ) THEN
  148. tra(ji,2,jk,jn)=(zalpha6*tra(ji,3,jk,jn)+zalpha5*tra(ji,1,jk,jn)+zalpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk)
  149. ENDIF
  150. ENDIF
  151. END DO
  152. END DO
  153. ENDDO
  154. ENDIF
  155. !
  156. ! Treatment of corners
  157. !
  158. ! East south
  159. IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN
  160. tra(nlci-1,2,:,:) = ptab(nlci-1,2,:,:)
  161. ENDIF
  162. ! East north
  163. IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN
  164. tra(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:)
  165. ENDIF
  166. ! West south
  167. IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN
  168. tra(2,2,:,:) = ptab(2,2,:,:)
  169. ENDIF
  170. ! West north
  171. IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN
  172. tra(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:)
  173. ENDIF
  174. !
  175. ENDIF
  176. !
  177. END SUBROUTINE interptrn
  178. #else
  179. CONTAINS
  180. SUBROUTINE Agrif_TOP_Interp_empty
  181. !!---------------------------------------------
  182. !! *** ROUTINE agrif_Top_Interp_empty ***
  183. !!---------------------------------------------
  184. WRITE(*,*) 'agrif_top_interp : You should not have seen this print! error?'
  185. END SUBROUTINE Agrif_TOP_Interp_empty
  186. #endif
  187. END MODULE agrif_top_interp