agrif_lim2_interp.F90 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. MODULE agrif_lim2_interp
  2. !!======================================================================
  3. !! *** MODULE agrif_lim2_update ***
  4. !! Nesting module : update surface ocean boundary condition over ice
  5. !! from a child grif
  6. !! Sea-Ice model : LIM 2.0 Sea ice model time-stepping
  7. !!======================================================================
  8. !! History : 2.0 ! 04-2008 (F. Dupont) initial version
  9. !! 3.4 ! 09-2012 (R. Benshila, C. Herbaut) update and EVP
  10. !!----------------------------------------------------------------------
  11. #if defined key_agrif && defined key_lim2
  12. !!----------------------------------------------------------------------
  13. !! 'key_lim2' : LIM 2.0 sea-ice model
  14. !! 'key_agrif' : AGRIF library
  15. !!----------------------------------------------------------------------
  16. !! agrif_interp_lim2 : update sea-ice model on boundaries or total
  17. !! sea-ice area
  18. !! agrif_rhg_lim2_load : interpolcation of ice velocities using Agrif
  19. !! agrif_rhg_lim2 : sub-interpolation of ice velocities for both
  20. !! splitting time and sea-ice time step
  21. !! agrif_interp_u_ice : atomic routine to interpolate u_ice
  22. !! agrif_interp_u_ice : atomic routine to interpolate v_ice
  23. !! agrif_trp_lim2_load : interpolcation of ice properties using Agrif
  24. !! agrif_trp_lim2 : sub-interpolation of ice properties for
  25. !! sea-ice time step
  26. !! agrif_interp_u_ice : atomic routine to interpolate ice properties
  27. !!----------------------------------------------------------------------
  28. USE par_oce
  29. USE dom_oce
  30. USE sbc_oce
  31. USE ice_2
  32. USE dom_ice_2
  33. USE agrif_ice
  34. IMPLICIT NONE
  35. PRIVATE
  36. PUBLIC agrif_rhg_lim2_load, agrif_rhg_lim2
  37. PUBLIC agrif_trp_lim2_load, agrif_trp_lim2
  38. PUBLIC interp_u_ice, interp_v_ice
  39. PUBLIC interp_adv_ice
  40. REAL(wp), DIMENSION(:,:) , ALLOCATABLE, PRIVATE :: uice_agr, vice_agr
  41. REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, PRIVATE :: tabice_agr
  42. !!----------------------------------------------------------------------
  43. !! NEMO/NST 3.4 , NEMO Consortium (2012)
  44. !! $Id: agrif_lim2_interp.F90 3680 2012-11-27 14:42:24Z rblod $
  45. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  46. !!----------------------------------------------------------------------
  47. CONTAINS
  48. # if defined key_lim2_vp
  49. SUBROUTINE agrif_rhg_lim2_load
  50. !!-----------------------------------------------------------------------
  51. !! *** ROUTINE agrif_rhg_lim2_load ***
  52. !!
  53. !! ** Method : need a special routine for dealing with exchanging data
  54. !! between the child and parent grid during ice step
  55. !!
  56. !!-----------------------------------------------------------------------
  57. !
  58. IF (Agrif_Root()) RETURN
  59. Agrif_SpecialValue=0.
  60. Agrif_UseSpecialValue = .FALSE.
  61. u_ice_nst(:,:) = 0.
  62. v_ice_nst(:,:) = 0.
  63. CALL Agrif_Bc_variable( u_ice_id ,procname=interp_u_ice, calledweight=1. )
  64. CALL Agrif_Bc_variable( v_ice_id ,procname=interp_v_ice, calledweight=1. )
  65. Agrif_SpecialValue=0.
  66. Agrif_UseSpecialValue = .FALSE.
  67. !
  68. END SUBROUTINE agrif_rhg_lim2_load
  69. SUBROUTINE agrif_rhg_lim2(pu_n,pv_n)
  70. !!-----------------------------------------------------------------------
  71. !! *** ROUTINE agrif_rhg_lim2 ***
  72. !!
  73. !! ** Method : we feel the boundaries with values stored above
  74. !!-----------------------------------------------------------------------
  75. REAL(wp), DIMENSION(jpi,0:jpj+1), INTENT(inout) :: pu_n, pv_n
  76. !!
  77. REAL(wp) :: zrhox, zrhoy
  78. INTEGER :: ji,jj
  79. !!-----------------------------------------------------------------------
  80. !
  81. IF (Agrif_Root()) RETURN
  82. zrhox = Agrif_Rhox()
  83. zrhoy = Agrif_Rhoy()
  84. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  85. DO jj=2,jpj
  86. pu_n(3,jj) = u_ice_nst(3,jj)/(zrhoy*e2f(2,jj-1))*tmu(3,jj)
  87. END DO
  88. DO jj=2,jpj
  89. pv_n(3,jj) = v_ice_nst(3,jj)/(zrhox*e1f(2,jj-1))*tmu(3,jj)
  90. END DO
  91. ENDIF
  92. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  93. DO jj=2,jpj
  94. pu_n(nlci-1,jj) = u_ice_nst(nlci-1,jj)/(zrhoy*e2f(nlci-2,jj-1))*tmu(nlci-1,jj)
  95. END DO
  96. DO jj=2,jpj
  97. pv_n(nlci-1,jj) = v_ice_nst(nlci-1,jj)/(zrhox*e1f(nlci-2,jj-1))*tmu(nlci-1,jj)
  98. END DO
  99. ENDIF
  100. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  101. DO ji=2,jpi
  102. pv_n(ji,3) = v_ice_nst(ji,3)/(zrhox*e1f(ji-1,2))*tmu(ji,3)
  103. END DO
  104. DO ji=2,jpi
  105. pu_n(ji,3) = u_ice_nst(ji,3)/(zrhoy*e2f(ji-1,2))*tmu(ji,3)
  106. END DO
  107. ENDIF
  108. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  109. DO ji=2,jpi
  110. pv_n(ji,nlcj-1) = v_ice_nst(ji,nlcj-1)/(zrhox*e1f(ji-1,nlcj-2))*tmu(ji,nlcj-1)
  111. END DO
  112. DO ji=2,jpi
  113. pu_n(ji,nlcj-1) = u_ice_nst(ji,nlcj-1)/(zrhoy*e2f(ji-1,nlcj-2))*tmu(ji,nlcj-1)
  114. END DO
  115. ENDIF
  116. !
  117. END SUBROUTINE agrif_rhg_lim2
  118. #else
  119. SUBROUTINE agrif_rhg_lim2_load
  120. !!-----------------------------------------------------------------------
  121. !! *** ROUTINE agrif_rhg_lim2_load ***
  122. !!
  123. !! ** Method : need a special routine for dealing with exchanging data
  124. !! between the child and parent grid during ice step
  125. !! we interpolate and store the boundary if needed, ie if
  126. !! we are in inside a new parent ice time step
  127. !!-----------------------------------------------------------------------
  128. INTEGER :: ji,jj
  129. REAL(wp) :: zrhox, zrhoy
  130. !!-----------------------------------------------------------------------
  131. !
  132. IF (Agrif_Root()) RETURN
  133. IF( lim_nbstep == 1. ) THEN
  134. !
  135. ! switch old values by hand
  136. u_ice_oe(:,:,1) = u_ice_oe(:,:,2)
  137. v_ice_oe(:,:,1) = v_ice_oe(:,:,2)
  138. u_ice_sn(:,:,1) = u_ice_sn(:,:,2)
  139. v_ice_sn(:,:,1) = v_ice_sn(:,:,2)
  140. ! interpolation of boundaries (called weight prevents AGRIF interpolation)
  141. Agrif_SpecialValue=-9999.
  142. Agrif_UseSpecialValue = .TRUE.
  143. IF( .NOT. ALLOCATED(uice_agr) )THEN
  144. ALLOCATE(uice_agr(jpi,jpj), vice_agr(jpi,jpj))
  145. ENDIF
  146. uice_agr = 0.
  147. vice_agr = 0.
  148. CALL Agrif_Bc_variable(u_ice_id,procname=interp_u_ice, calledweight=1.)
  149. CALL Agrif_Bc_variable(v_ice_id,procname=interp_v_ice, calledweight=1.)
  150. Agrif_SpecialValue=0.
  151. Agrif_UseSpecialValue = .FALSE.
  152. !
  153. zrhox = agrif_rhox() ; zrhoy = agrif_rhoy()
  154. uice_agr(:,:) = uice_agr(:,:)/(zrhoy*e2u(:,:))*umask(:,:,1)
  155. vice_agr(:,:) = vice_agr(:,:)/(zrhox*e1v(:,:))*vmask(:,:,1)
  156. ! fill boundaries
  157. DO jj = 1, jpj
  158. DO ji = 1, 2
  159. u_ice_oe(ji, jj,2) = uice_agr(ji ,jj)
  160. u_ice_oe(ji+2,jj,2) = uice_agr(nlci+ji-3,jj)
  161. END DO
  162. END DO
  163. DO jj = 1, jpj
  164. v_ice_oe(2,jj,2) = vice_agr(2 ,jj)
  165. v_ice_oe(4,jj,2) = vice_agr(nlci-1,jj)
  166. END DO
  167. DO ji = 1, jpi
  168. u_ice_sn(ji,2,2) = uice_agr(ji,2 )
  169. u_ice_sn(ji,4,2) = uice_agr(ji,nlcj-1)
  170. END DO
  171. DO jj = 1, 2
  172. DO ji = 1, jpi
  173. v_ice_sn(ji,jj ,2) = vice_agr(ji,jj )
  174. v_ice_sn(ji,jj+2,2) = vice_agr(ji,nlcj+jj-3)
  175. END DO
  176. END DO
  177. !
  178. ENDIF
  179. !
  180. END SUBROUTINE agrif_rhg_lim2_load
  181. SUBROUTINE agrif_rhg_lim2( kiter, kitermax, cd_type)
  182. !!-----------------------------------------------------------------------
  183. !! *** ROUTINE agrif_rhg_lim2 ***
  184. !!
  185. !! ** Method : simple call to atomic routines using stored values to
  186. !! fill the boundaries depending of the position of the point and
  187. !! computing factor for time interpolation
  188. !!-----------------------------------------------------------------------
  189. INTEGER, INTENT(in) :: kiter, kitermax
  190. CHARACTER(len=1), INTENT( in ) :: cd_type
  191. !!
  192. REAL(wp) :: zalpha, zbeta
  193. !!-----------------------------------------------------------------------
  194. !
  195. IF (Agrif_Root()) RETURN
  196. zalpha = REAL(lim_nbstep,wp) / (Agrif_Rhot()*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc))
  197. zbeta = REAL(kiter,wp) / kitermax
  198. zbeta = zalpha * zbeta
  199. SELECT CASE(cd_type)
  200. CASE('U')
  201. CALL ParcoursU( zbeta )
  202. CASE('V')
  203. CALL ParcoursV( zbeta )
  204. END SELECT
  205. !
  206. END SUBROUTINE agrif_rhg_lim2
  207. SUBROUTINE ParcoursU( pbeta )
  208. !!-----------------------------------------------------------------------
  209. !! *** ROUTINE parcoursU ***
  210. !!
  211. !! ** Method : time and spatial interpolation for U-point using values
  212. !! interpolated from the coarse grid and inside dvalues
  213. !!-----------------------------------------------------------------------
  214. REAL(wp), INTENT(in) :: pbeta
  215. !!
  216. INTEGER :: ji, jj
  217. !!-----------------------------------------------------------------------
  218. !
  219. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  220. DO jj=1,jpj
  221. DO ji=1,2
  222. u_ice(ji,jj) = (1-pbeta) * u_ice_oe(ji,jj,1) + pbeta * u_ice_oe(ji,jj,2)
  223. END DO
  224. END DO
  225. DO jj=1,jpj
  226. u_ice(2,jj) = 0.25*(u_ice(1,jj)+2.*u_ice(2,jj)+u_ice(3,jj))
  227. u_ice(2,jj) = u_ice(2,jj) * umask(2,jj,1)
  228. END DO
  229. ENDIF
  230. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  231. DO jj=1,jpj
  232. DO ji=1,2
  233. u_ice(nlci+ji-3,jj) = (1-pbeta) * u_ice_oe(ji+2,jj,1) + pbeta * u_ice_oe(ji+2,jj,2)
  234. END DO
  235. END DO
  236. DO jj=1,jpj
  237. u_ice(nlci-2,jj) = 0.25*(u_ice(nlci-3,jj)+2.*u_ice(nlci-2,jj)+u_ice(nlci-1,jj))
  238. u_ice(nlci-2,jj) = u_ice(nlci-2,jj) * umask(nlci-2,jj,1)
  239. END DO
  240. ENDIF
  241. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  242. DO ji=1,jpi
  243. u_ice(ji,2) = (1-pbeta) * u_ice_sn(ji,2,1) + pbeta * u_ice_sn(ji,2,2)
  244. u_ice(ji,2) = u_ice(ji,2)*umask(ji,2,1)
  245. END DO
  246. ENDIF
  247. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  248. DO ji=1,jpi
  249. u_ice(ji,nlcj-1) = (1-pbeta) * u_ice_sn(ji,4,1) + pbeta * u_ice_sn(ji,4,2)
  250. u_ice(ji,nlcj-1) = u_ice(ji,nlcj-1)*umask(ji,nlcj-1,1)
  251. END DO
  252. ENDIF
  253. !
  254. END SUBROUTINE ParcoursU
  255. SUBROUTINE ParcoursV( pbeta )
  256. !!-----------------------------------------------------------------------
  257. !! *** ROUTINE parcoursV ***
  258. !!
  259. !! ** Method : time and spatial interpolation for V-point using values
  260. !! interpolated from the coarse grid and inside dvalues
  261. !!-----------------------------------------------------------------------
  262. REAL(wp), INTENT(in) :: pbeta
  263. !!
  264. INTEGER :: ji, jj
  265. !!-----------------------------------------------------------------------
  266. !
  267. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  268. DO jj=1,jpj
  269. v_ice(2,jj) = (1-pbeta) * v_ice_oe(2,jj,1) + pbeta * v_ice_oe(2,jj,2)
  270. v_ice(2,jj) = v_ice(2,jj) * vmask(2,jj,1)
  271. END DO
  272. ENDIF
  273. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  274. DO jj=1,jpj
  275. v_ice(nlci-1,jj) = (1-pbeta) * v_ice_oe(4,jj,1) + pbeta * v_ice_oe(4,jj,2)
  276. v_ice(nlci-1,jj) = v_ice(nlci-1,jj)*vmask(nlci-1,jj,1)
  277. END DO
  278. ENDIF
  279. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  280. DO jj=1,2
  281. DO ji=1,jpi
  282. v_ice(ji,jj) = (1-pbeta) * v_ice_sn(ji,jj,1) + pbeta * v_ice_sn(ji,jj,2)
  283. END DO
  284. END DO
  285. DO ji=1,jpi
  286. v_ice(ji,2)=0.25*(v_ice(ji,1)+2.*v_ice(ji,2)+v_ice(ji,3))
  287. v_ice(ji,2)=v_ice(ji,2)*vmask(ji,2,1)
  288. END DO
  289. ENDIF
  290. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  291. DO jj=1,2
  292. DO ji=1,jpi
  293. v_ice(ji,nlcj+jj-3) = (1-pbeta) * v_ice_sn(ji,jj+2,1) + pbeta * v_ice_sn(ji,jj+2,2)
  294. END DO
  295. END DO
  296. DO ji=1,jpi
  297. v_ice(ji,nlcj-2)=0.25*(v_ice(ji,nlcj-3)+2.*v_ice(ji,nlcj-2)+v_ice(ji,nlcj-1))
  298. v_ice(ji,nlcj-2) = v_ice(ji,nlcj-2) * vmask(ji,nlcj-2,1)
  299. END DO
  300. ENDIF
  301. !
  302. END SUBROUTINE ParcoursV
  303. # endif
  304. SUBROUTINE agrif_trp_lim2_load
  305. !!-----------------------------------------------------------------------
  306. !! *** ROUTINE agrif_trp_lim2_load ***
  307. !!
  308. !! ** Method : need a special routine for dealing with exchanging data
  309. !! between the child and parent grid during ice step
  310. !! we interpolate and store the boundary if needed, ie if
  311. !! we are in inside a new parent ice time step
  312. !!-----------------------------------------------------------------------
  313. INTEGER :: ji,jj,jn
  314. !!-----------------------------------------------------------------------
  315. !
  316. IF (Agrif_Root()) RETURN
  317. IF( lim_nbstep == 1. ) THEN
  318. !
  319. ! switch old values
  320. adv_ice_oe(:,:,:,1) = adv_ice_oe(:,:,:,2)
  321. adv_ice_sn(:,:,:,1) = adv_ice_sn(:,:,:,2)
  322. ! interpolation of boundaries
  323. IF(.NOT.ALLOCATED(tabice_agr))THEN
  324. ALLOCATE(tabice_agr(jpi,jpj,7))
  325. ENDIF
  326. tabice_agr(:,:,:) = 0.
  327. Agrif_SpecialValue=-9999.
  328. Agrif_UseSpecialValue = .TRUE.
  329. CALL Agrif_Bc_variable( adv_ice_id ,procname=interp_adv_ice,calledweight=1. )
  330. Agrif_SpecialValue=0.
  331. Agrif_UseSpecialValue = .FALSE.
  332. !
  333. ! fill boundaries
  334. DO jn =1,7
  335. DO jj = 1, jpj
  336. DO ji=1,2
  337. adv_ice_oe(ji ,jj,jn,2) = tabice_agr(ji ,jj,jn)
  338. adv_ice_oe(ji+2,jj,jn,2) = tabice_agr(nlci-2+ji,jj,jn)
  339. END DO
  340. END DO
  341. END DO
  342. Do jn =1,7
  343. Do jj =1,2
  344. DO ji = 1, jpi
  345. adv_ice_sn(ji,jj ,jn,2) = tabice_agr(ji,jj ,jn)
  346. adv_ice_sn(ji,jj+2,jn,2) = tabice_agr(ji,nlcj-2+jj,jn)
  347. END DO
  348. END DO
  349. END DO
  350. !
  351. ENDIF
  352. !
  353. END SUBROUTINE agrif_trp_lim2_load
  354. SUBROUTINE agrif_trp_lim2
  355. !!-----------------------------------------------------------------------
  356. !! *** ROUTINE agrif_trp_lim2 ***
  357. !!
  358. !! ** Method : time coefficient and call to atomic routines
  359. !!-----------------------------------------------------------------------
  360. INTEGER :: ji,jj,jn
  361. REAL(wp) :: zalpha
  362. !!-----------------------------------------------------------------------
  363. !
  364. IF (Agrif_Root()) RETURN
  365. zalpha = REAL(lim_nbstep,wp) / (Agrif_Rhot()*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc))
  366. !
  367. tabice_agr(:,:,:) = 0.e0
  368. DO jn =1,7
  369. DO jj =1,2
  370. DO ji = 1, jpi
  371. tabice_agr(ji,jj ,jn) = (1-zalpha)*adv_ice_sn(ji,jj ,jn,1) + zalpha*adv_ice_sn(ji,jj ,jn,2)
  372. tabice_agr(ji,nlcj-2+jj ,jn) = (1-zalpha)*adv_ice_sn(ji,jj+2,jn,1) + zalpha*adv_ice_sn(ji,jj+2,jn,2)
  373. END DO
  374. END DO
  375. END DO
  376. DO jn =1,7
  377. DO jj = 1, jpj
  378. DO ji=1,2
  379. tabice_agr(ji ,jj,jn) = (1-zalpha)*adv_ice_oe(ji ,jj,jn,1) + zalpha*adv_ice_oe(ji ,jj,jn,2)
  380. tabice_agr(nlci-2+ji,jj,jn) = (1-zalpha)*adv_ice_oe(ji+2,jj,jn,1) + zalpha*adv_ice_oe(ji+2,jj,jn,2)
  381. END DO
  382. END DO
  383. END DO
  384. !
  385. CALL parcoursT( tabice_agr(:,:, 1), frld )
  386. CALL parcoursT( tabice_agr(:,:, 2), hicif )
  387. CALL parcoursT( tabice_agr(:,:, 3), hsnif )
  388. CALL parcoursT( tabice_agr(:,:, 4), tbif(:,:,1) )
  389. CALL parcoursT( tabice_agr(:,:, 5), tbif(:,:,2) )
  390. CALL parcoursT( tabice_agr(:,:, 6), tbif(:,:,3) )
  391. CALL parcoursT( tabice_agr(:,:, 7), qstoif )
  392. !
  393. END SUBROUTINE agrif_trp_lim2
  394. SUBROUTINE parcoursT ( pinterp, pfinal )
  395. !!-----------------------------------------------------------------------
  396. !! *** ROUTINE parcoursT ***
  397. !!
  398. !! ** Method : fill boundaries for T points
  399. !!-----------------------------------------------------------------------
  400. REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pinterp
  401. REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pfinal
  402. !!
  403. REAL(wp) :: zbound, zvbord
  404. REAL(wp), DIMENSION(jpi,jpj) :: zui_u, zvi_v
  405. INTEGER :: ji, jj
  406. !!-----------------------------------------------------------------------
  407. !
  408. zui_u = 0.e0
  409. zvi_v = 0.e0
  410. ! zvbord factor between 1 and 2 to take into account slip or no-slip boundary conditions.
  411. zbound=0.
  412. zvbord = 1.0 + ( 1.0 - zbound )
  413. #if defined key_lim2_vp
  414. DO jj = 1, jpjm1
  415. DO ji = 1, jpim1
  416. zui_u(ji,jj) = ( u_ice(ji+1,jj ) + u_ice(ji+1,jj+1) ) / ( MAX( tmu(ji+1,jj ) + tmu(ji+1,jj+1), zvbord ) )
  417. zvi_v(ji,jj) = ( v_ice(ji ,jj+1) + v_ice(ji+1,jj+1) ) / ( MAX( tmu(ji ,jj+1) + tmu(ji+1,jj+1), zvbord ) )
  418. END DO
  419. END DO
  420. #else
  421. zui_u(:,:) = u_ice(:,:)
  422. zvi_v(:,:) = v_ice(:,:)
  423. #endif
  424. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  425. DO jj=1,jpj
  426. ! IF (zui_u(2,jj).EQ.0.) THEN
  427. ! pfinal (2,jj) = pfinal (1,jj) * tms(2,jj)
  428. ! ELSE
  429. pfinal(2,jj) = 0.25* pinterp(1,jj) + 0.5 * pinterp(2,jj) + 0.25 *pfinal(3,jj)
  430. ! ENDIF
  431. END DO
  432. ENDIF
  433. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  434. DO ji=1,jpi
  435. ! IF (zvi_v(ji,2).EQ.0.) THEN
  436. ! pfinal (ji,2) = pfinal (ji,1) * tms(ji,2)
  437. ! ELSE
  438. pfinal(ji,2) = 0.25* pinterp(ji,1) + 0.5 * pinterp(ji,2) + 0.25 *pfinal(ji,3)
  439. ! ENDIF
  440. END DO
  441. ENDIF
  442. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  443. DO jj=1,jpj
  444. ! IF (zui_u(nlci-2,jj).EQ.0.) THEN
  445. ! pfinal(nlci-1,jj) = pfinal (nlci,jj) * tms(nlci-1,jj)
  446. ! ELSE
  447. pfinal(nlci-1,jj) = 0.25* pinterp(nlci,jj) + 0.5 * pinterp(nlci-1,jj) + 0.25 *pfinal(nlci-2,jj)
  448. ! ENDIF
  449. END DO
  450. ENDIF
  451. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  452. DO ji=1,jpi
  453. ! IF (zvi_v(ji,nlcj-2).EQ.0.) THEN
  454. ! pfinal (ji,nlcj-1) = pfinal(ji,nlcj) * tms(ji,nlcj-1)
  455. ! ELSE
  456. pfinal(ji,nlcj-1) = 0.25* pinterp(ji,nlcj) + 0.5 * pinterp(ji,nlcj-1) + 0.25 *pfinal(ji,nlcj-2)
  457. ! ENDIF
  458. END DO
  459. ENDIF
  460. pfinal (:,:) = pfinal (:,:) * tms(:,:)
  461. !
  462. END SUBROUTINE parcoursT
  463. SUBROUTINE interp_u_ice( tabres, i1, i2, j1, j2, before )
  464. !!-----------------------------------------------------------------------
  465. !! *** ROUTINE interp_u_ice ***
  466. !!-----------------------------------------------------------------------
  467. INTEGER, INTENT(in) :: i1, i2, j1, j2
  468. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  469. LOGICAL, INTENT(in) :: before
  470. !!
  471. INTEGER :: ji,jj
  472. !!-----------------------------------------------------------------------
  473. !
  474. #if defined key_lim2_vp
  475. IF( before ) THEN
  476. DO jj=MAX(j1,2),j2
  477. DO ji=MAX(i1,2),i2
  478. IF( tmu(ji,jj) == 0. ) THEN
  479. tabres(ji,jj) = -9999.
  480. ELSE
  481. tabres(ji,jj) = e2f(ji-1,jj-1) * u_ice(ji,jj)
  482. ENDIF
  483. END DO
  484. END DO
  485. ELSE
  486. DO jj=MAX(j1,2),j2
  487. DO ji=MAX(i1,2),i2
  488. u_ice_nst(ji,jj) = tabres(ji,jj)
  489. END DO
  490. END DO
  491. ENDIF
  492. #else
  493. IF( before ) THEN
  494. DO jj= j1, j2
  495. DO ji= i1, i2
  496. IF( umask(ji,jj,1) == 0. ) THEN
  497. tabres(ji,jj) = -9999.
  498. ELSE
  499. tabres(ji,jj) = e2u(ji,jj) * u_ice(ji,jj)
  500. ENDIF
  501. END DO
  502. END DO
  503. ELSE
  504. DO jj= j1, j2
  505. DO ji= i1, i2
  506. uice_agr(ji,jj) = tabres(ji,jj)
  507. END DO
  508. END DO
  509. ENDIF
  510. #endif
  511. END SUBROUTINE interp_u_ice
  512. SUBROUTINE interp_v_ice( tabres, i1, i2, j1, j2, before )
  513. !!-----------------------------------------------------------------------
  514. !! *** ROUTINE interp_v_ice ***
  515. !!-----------------------------------------------------------------------
  516. INTEGER, INTENT(in) :: i1, i2, j1, j2
  517. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  518. LOGICAL, INTENT(in) :: before
  519. !!
  520. INTEGER :: ji, jj
  521. !!-----------------------------------------------------------------------
  522. !
  523. #if defined key_lim2_vp
  524. IF( before ) THEN
  525. DO jj=MAX(j1,2),j2
  526. DO ji=MAX(i1,2),i2
  527. IF( tmu(ji,jj) == 0. ) THEN
  528. tabres(ji,jj) = -9999.
  529. ELSE
  530. tabres(ji,jj) = e1f(ji-1,jj-1) * v_ice(ji,jj)
  531. ENDIF
  532. END DO
  533. END DO
  534. ELSE
  535. DO jj=MAX(j1,2),j2
  536. DO ji=MAX(i1,2),i2
  537. v_ice_nst(ji,jj) = tabres(ji,jj)
  538. END DO
  539. END DO
  540. ENDIF
  541. #else
  542. IF( before ) THEN
  543. DO jj= j1 ,j2
  544. DO ji = i1, i2
  545. IF( vmask(ji,jj,1) == 0. ) THEN
  546. tabres(ji,jj) = -9999.
  547. ELSE
  548. tabres(ji,jj) = e1v(ji,jj) * v_ice(ji,jj)
  549. ENDIF
  550. END DO
  551. END DO
  552. ELSE
  553. DO jj= j1 ,j2
  554. DO ji = i1, i2
  555. vice_agr(ji,jj) = tabres(ji,jj)
  556. END DO
  557. END DO
  558. ENDIF
  559. #endif
  560. END SUBROUTINE interp_v_ice
  561. SUBROUTINE interp_adv_ice( tabres, i1, i2, j1, j2, k1, k2, before )
  562. !!-----------------------------------------------------------------------
  563. !! *** ROUTINE interp_adv_ice ***
  564. !!
  565. !! ** Purpose : fill an array with ice variables
  566. !! to be advected
  567. !! put -9999 where no ice for correct extrapolation
  568. !!-----------------------------------------------------------------------
  569. INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
  570. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres
  571. LOGICAL, INTENT(in) :: before
  572. !!
  573. INTEGER :: ji, jj, jk
  574. !!-----------------------------------------------------------------------
  575. !
  576. IF( before ) THEN
  577. DO jj=j1,j2
  578. DO ji=i1,i2
  579. IF( tms(ji,jj) == 0. ) THEN
  580. tabres(ji,jj,:) = -9999
  581. ELSE
  582. tabres(ji,jj, 1) = frld (ji,jj)
  583. tabres(ji,jj, 2) = hicif (ji,jj)
  584. tabres(ji,jj, 3) = hsnif (ji,jj)
  585. tabres(ji,jj, 4) = tbif (ji,jj,1)
  586. tabres(ji,jj, 5) = tbif (ji,jj,2)
  587. tabres(ji,jj, 6) = tbif (ji,jj,3)
  588. tabres(ji,jj, 7) = qstoif(ji,jj)
  589. ENDIF
  590. END DO
  591. END DO
  592. ELSE
  593. DO jj=j1,j2
  594. DO ji=i1,i2
  595. DO jk=k1, k2
  596. tabice_agr(ji,jj,jk) = tabres(ji,jj,jk)
  597. END DO
  598. END DO
  599. END DO
  600. ENDIF
  601. !
  602. END SUBROUTINE interp_adv_ice
  603. #else
  604. CONTAINS
  605. SUBROUTINE agrif_lim2_interp_empty
  606. !!---------------------------------------------
  607. !! *** ROUTINE agrif_lim2_interp_empty ***
  608. !!---------------------------------------------
  609. WRITE(*,*) 'agrif_lim2_interp : You should not have seen this print! error?'
  610. END SUBROUTINE agrif_lim2_interp_empty
  611. #endif
  612. END MODULE agrif_lim2_interp