agrif_lim2_update.F90 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #define TWO_WAY
  2. MODULE agrif_lim2_update
  3. !!======================================================================
  4. !! *** MODULE agrif_lim2_update ***
  5. !! Nesting module : update surface ocean boundary condition over ice
  6. !! from a child grif
  7. !! Sea-Ice model : LIM 2.0 Sea ice model time-stepping
  8. !!======================================================================
  9. !! History : 2.0 ! 04-2008 (F. Dupont) initial version
  10. !! 3.4 ! 08-2012 (R. Benshila, C. Herbaut) update and EVP
  11. !!----------------------------------------------------------------------
  12. #if defined key_agrif && defined key_lim2
  13. !!----------------------------------------------------------------------
  14. !! 'key_lim2' : LIM 2.0 sea-ice model
  15. !! 'key_agrif' : AGRIF library
  16. !!----------------------------------------------------------------------
  17. !! agrif_update_lim2 : update sea-ice model on boundaries or total
  18. !! sea-ice area for velocities and ice properties
  19. !! update_adv_ice : sea-ice properties
  20. !! update_u_ice : zonal ice velocity
  21. !! update_v_ice : meridional ice velocity
  22. !!----------------------------------------------------------------------
  23. USE ice_2
  24. USE dom_ice_2
  25. USE sbc_oce
  26. USE dom_oce
  27. USE agrif_oce
  28. USE agrif_ice
  29. IMPLICIT NONE
  30. PRIVATE
  31. PUBLIC agrif_update_lim2
  32. !!----------------------------------------------------------------------
  33. !! NEMO/NST 3.4 , LOCEAN-IPSL (2012)
  34. !! $Id: agrif_lim2_update.F90 3680 2012-11-27 14:42:24Z rblod $
  35. !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
  36. !!----------------------------------------------------------------------
  37. CONTAINS
  38. SUBROUTINE agrif_update_lim2 ( kt )
  39. !!----------------------------------------------------------------------
  40. !! *** ROUTINE agrif_update_lim2 ***
  41. !! ** Method : Call the hydrostaticupdate pressure at the boundary or
  42. !! the entire domain
  43. !!
  44. !! ** Action : - Update (u_ice,v_ice) and ice tracers
  45. !!----------------------------------------------------------------------
  46. INTEGER, INTENT(in) :: kt
  47. !!
  48. !!----------------------------------------------------------------------
  49. !
  50. IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN
  51. Agrif_UseSpecialValueInUpdate = .TRUE.
  52. Agrif_SpecialValueFineGrid = 0.
  53. # if defined TWO_WAY
  54. IF( MOD(nbcline,nbclineupdate) == 0) THEN
  55. CALL Agrif_Update_Variable( adv_ice_id , procname = update_adv_ice )
  56. CALL Agrif_Update_Variable( u_ice_id , procname = update_u_ice )
  57. CALL Agrif_Update_Variable( v_ice_id , procname = update_v_ice )
  58. ELSE
  59. CALL Agrif_Update_Variable( adv_ice_id , locupdate=(/0,2/), procname = update_adv_ice )
  60. CALL Agrif_Update_Variable( u_ice_id , locupdate=(/0,1/), procname = update_u_ice )
  61. CALL Agrif_Update_Variable( v_ice_id , locupdate=(/0,1/), procname = update_v_ice )
  62. ENDIF
  63. # endif
  64. !
  65. END SUBROUTINE agrif_update_lim2
  66. SUBROUTINE update_adv_ice( tabres, i1, i2, j1, j2, before )
  67. !!-----------------------------------------------------------------------
  68. !! *** ROUTINE update_adv_ice ***
  69. !! ** Method : Compute the mass properties on the fine grid and recover
  70. !! the properties per mass on the coarse grid
  71. !!-----------------------------------------------------------------------
  72. INTEGER, INTENT(in) :: i1, i2, j1, j2
  73. REAL(wp), DIMENSION(i1:i2,j1:j2,7), INTENT(inout) :: tabres
  74. LOGICAL, INTENT(in) :: before
  75. !!
  76. INTEGER :: ji, jj
  77. REAL(wp) :: zrhox, zrhoy
  78. REAL(wp) :: z1_area
  79. !!-----------------------------------------------------------------------
  80. !
  81. IF( before ) THEN
  82. zrhox = Agrif_Rhox()
  83. zrhoy = Agrif_Rhoy()
  84. DO jj=j1,j2
  85. DO ji=i1,i2
  86. tabres(ji,jj, 1) = frld (ji,jj ) * area(ji,jj)
  87. tabres(ji,jj, 2) = hicif (ji,jj ) * area(ji,jj)
  88. tabres(ji,jj, 3) = hsnif (ji,jj ) * area(ji,jj)
  89. tabres(ji,jj, 4) = tbif (ji,jj,1) * area(ji,jj)
  90. tabres(ji,jj, 5) = tbif (ji,jj,2) * area(ji,jj)
  91. tabres(ji,jj, 6) = tbif (ji,jj,3) * area(ji,jj)
  92. tabres(ji,jj, 7) = qstoif(ji,jj ) * area(ji,jj)
  93. END DO
  94. END DO
  95. tabres = zrhox * zrhoy * tabres
  96. ELSE
  97. DO jj=j1,j2
  98. DO ji=i1,i2
  99. z1_area = 1. / area(ji,jj) * tms(ji,jj)
  100. frld (ji,jj) = tabres(ji,jj, 1) * z1_area
  101. hicif (ji,jj) = tabres(ji,jj, 2) * z1_area
  102. hsnif (ji,jj) = tabres(ji,jj, 3) * z1_area
  103. tbif (ji,jj,1) = tabres(ji,jj, 4) * z1_area
  104. tbif (ji,jj,2) = tabres(ji,jj, 5) * z1_area
  105. tbif (ji,jj,3) = tabres(ji,jj, 6) * z1_area
  106. qstoif(ji,jj) = tabres(ji,jj, 7) * z1_area
  107. END DO
  108. END DO
  109. ENDIF
  110. !
  111. END SUBROUTINE update_adv_ice
  112. # if defined key_lim2_vp
  113. SUBROUTINE update_u_ice( tabres, i1, i2, j1, j2, before )
  114. !!-----------------------------------------------------------------------
  115. !! *** ROUTINE update_u_ice ***
  116. !! ** Method : Update the fluxes and recover the properties (B-grid)
  117. !!-----------------------------------------------------------------------
  118. INTEGER, INTENT(in) :: i1, i2, j1, j2
  119. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  120. LOGICAL, INTENT(in) :: before
  121. !!
  122. INTEGER :: ji, jj
  123. REAL(wp) :: zrhoy
  124. !!-----------------------------------------------------------------------
  125. !
  126. IF( before ) THEN
  127. zrhoy = Agrif_Rhoy()
  128. DO jj=MAX(j1,2),j2
  129. DO ji=MAX(i1,2),i2
  130. tabres(ji,jj) = e2f(ji-1,jj-1) * u_ice(ji,jj)
  131. END DO
  132. END DO
  133. tabres = zrhoy * tabres
  134. ELSE
  135. DO jj= MAX(j1,2),j2
  136. DO ji=MAX(i1,2),i2
  137. u_ice(ji,jj) = tabres(ji,jj) / (e2f(ji-1,jj-1))
  138. u_ice(ji,jj) = u_ice(ji,jj) * tmu(ji,jj)
  139. END DO
  140. END DO
  141. ENDIF
  142. !
  143. END SUBROUTINE update_u_ice
  144. SUBROUTINE update_v_ice( tabres, i1, i2, j1, j2, before )
  145. !!-----------------------------------------------------------------------
  146. !! *** ROUTINE update_v_ice ***
  147. !! ** Method : Update the fluxes and recover the properties (B-grid)
  148. !!-----------------------------------------------------------------------
  149. INTEGER, INTENT(in) :: i1,i2,j1,j2
  150. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  151. LOGICAL, INTENT(in) :: before
  152. !!
  153. INTEGER :: ji, jj
  154. REAL(wp) :: zrhox
  155. !!-----------------------------------------------------------------------
  156. !
  157. IF( before ) THEN
  158. zrhox = Agrif_Rhox()
  159. DO jj=MAX(j1,2),j2
  160. DO ji=MAX(i1,2),i2
  161. tabres(ji,jj) = e1f(ji-1,jj-1) * v_ice(ji,jj)
  162. END DO
  163. END DO
  164. tabres = zrhox * tabres
  165. ELSE
  166. DO jj=MAX(j1,2),j2
  167. DO ji=MAX(i1,2),i2
  168. v_ice(ji,jj) = tabres(ji,jj) / (e1f(ji-1,jj-1))
  169. v_ice(ji,jj) = v_ice(ji,jj) * tmu(ji,jj)
  170. END DO
  171. END DO
  172. ENDIF
  173. !
  174. END SUBROUTINE update_v_ice
  175. # else
  176. SUBROUTINE update_u_ice( tabres, i1, i2, j1, j2, before )
  177. !!-----------------------------------------------------------------------
  178. !! *** ROUTINE update_u_ice ***
  179. !! ** Method : Update the fluxes and recover the properties (C-grid)
  180. !!-----------------------------------------------------------------------
  181. INTEGER, INTENT(in) :: i1, i2, j1, j2
  182. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  183. LOGICAL, INTENT(in) :: before
  184. !!
  185. INTEGER :: ji, jj
  186. REAL(wp) :: zrhoy
  187. !!-----------------------------------------------------------------------
  188. !
  189. IF( before ) THEN
  190. zrhoy = Agrif_Rhoy()
  191. DO jj=j1,j2
  192. DO ji=i1,i2
  193. tabres(ji,jj) = e2u(ji,jj) * u_ice(ji,jj)
  194. END DO
  195. END DO
  196. tabres = zrhoy * tabres
  197. ELSE
  198. DO jj=j1,j2
  199. DO ji=i1,i2
  200. u_ice(ji,jj) = tabres(ji,jj) / (e2u(ji,jj))
  201. u_ice(ji,jj) = u_ice(ji,jj) * tmu(ji,jj)
  202. END DO
  203. END DO
  204. ENDIF
  205. !
  206. END SUBROUTINE update_u_ice
  207. SUBROUTINE update_v_ice( tabres, i1, i2, j1, j2, before )
  208. !!-----------------------------------------------------------------------
  209. !! *** ROUTINE update_v_ice ***
  210. !! ** Method : Update the fluxes and recover the properties (C-grid)
  211. !!-----------------------------------------------------------------------
  212. INTEGER, INTENT(in) :: i1,i2,j1,j2
  213. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  214. LOGICAL, INTENT(in) :: before
  215. !!
  216. INTEGER :: ji, jj
  217. REAL(wp) :: zrhox
  218. !!-----------------------------------------------------------------------
  219. !
  220. IF( before ) THEN
  221. zrhox = Agrif_Rhox()
  222. DO jj=j1,j2
  223. DO ji=i1,i2
  224. tabres(ji,jj) = e1v(ji,jj) * v_ice(ji,jj)
  225. END DO
  226. END DO
  227. tabres = zrhox * tabres
  228. ELSE
  229. DO jj=j1,j2
  230. DO ji=i1,i2
  231. v_ice(ji,jj) = tabres(ji,jj) / (e1v(ji,jj))
  232. v_ice(ji,jj) = v_ice(ji,jj) * tmv(ji,jj)
  233. END DO
  234. END DO
  235. ENDIF
  236. !
  237. END SUBROUTINE update_v_ice
  238. # endif
  239. #else
  240. CONTAINS
  241. SUBROUTINE agrif_lim2_update_empty
  242. !!---------------------------------------------
  243. !! *** ROUTINE agrif_lim2_update_empty ***
  244. !!---------------------------------------------
  245. WRITE(*,*) 'agrif_lim2_update : You should not have seen this print! error?'
  246. END SUBROUTINE agrif_lim2_update_empty
  247. #endif
  248. END MODULE agrif_lim2_update