agrif_opa_update.F90 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. #define TWO_WAY /* TWO WAY NESTING */
  2. #undef DECAL_FEEDBACK /* SEPARATION of INTERFACES*/
  3. MODULE agrif_opa_update
  4. #if defined key_agrif && ! defined key_offline
  5. USE par_oce
  6. USE oce
  7. USE dom_oce
  8. USE agrif_oce
  9. USE in_out_manager ! I/O manager
  10. USE lib_mpp
  11. USE wrk_nemo
  12. USE dynspg_oce
  13. USE zdf_oce ! vertical physics: ocean variables
  14. IMPLICIT NONE
  15. PRIVATE
  16. PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales
  17. # if defined key_zdftke
  18. PUBLIC Agrif_Update_Tke
  19. # endif
  20. !!----------------------------------------------------------------------
  21. !! NEMO/NST 3.6 , NEMO Consortium (2010)
  22. !! $Id: agrif_opa_update.F90 4491 2014-02-06 16:47:57Z jchanut $
  23. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  24. !!----------------------------------------------------------------------
  25. CONTAINS
  26. RECURSIVE SUBROUTINE Agrif_Update_Tra( )
  27. !!---------------------------------------------
  28. !! *** ROUTINE Agrif_Update_Tra ***
  29. !!---------------------------------------------
  30. !
  31. IF (Agrif_Root()) RETURN
  32. !
  33. #if defined TWO_WAY
  34. IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers from grid Number',Agrif_Fixed(), 'nbcline', nbcline
  35. Agrif_UseSpecialValueInUpdate = .TRUE.
  36. Agrif_SpecialValueFineGrid = 0.
  37. !
  38. IF (MOD(nbcline,nbclineupdate) == 0) THEN
  39. # if ! defined DECAL_FEEDBACK
  40. CALL Agrif_Update_Variable(tsn_id, procname=updateTS)
  41. # else
  42. CALL Agrif_Update_Variable(tsn_id, locupdate=(/1,0/),procname=updateTS)
  43. # endif
  44. ELSE
  45. # if ! defined DECAL_FEEDBACK
  46. CALL Agrif_Update_Variable(tsn_id,locupdate=(/0,2/), procname=updateTS)
  47. # else
  48. CALL Agrif_Update_Variable(tsn_id,locupdate=(/1,2/), procname=updateTS)
  49. # endif
  50. ENDIF
  51. !
  52. Agrif_UseSpecialValueInUpdate = .FALSE.
  53. !
  54. IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update:
  55. CALL Agrif_ChildGrid_To_ParentGrid()
  56. CALL Agrif_Update_Tra()
  57. CALL Agrif_ParentGrid_To_ChildGrid()
  58. ENDIF
  59. !
  60. #endif
  61. !
  62. END SUBROUTINE Agrif_Update_Tra
  63. RECURSIVE SUBROUTINE Agrif_Update_Dyn( )
  64. !!---------------------------------------------
  65. !! *** ROUTINE Agrif_Update_Dyn ***
  66. !!---------------------------------------------
  67. !
  68. IF (Agrif_Root()) RETURN
  69. !
  70. #if defined TWO_WAY
  71. IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed(), 'nbcline', nbcline
  72. Agrif_UseSpecialValueInUpdate = .FALSE.
  73. Agrif_SpecialValueFineGrid = 0.
  74. !
  75. IF (mod(nbcline,nbclineupdate) == 0) THEN
  76. # if ! defined DECAL_FEEDBACK
  77. CALL Agrif_Update_Variable(un_update_id,procname = updateU)
  78. CALL Agrif_Update_Variable(vn_update_id,procname = updateV)
  79. # else
  80. CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU)
  81. CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV)
  82. # endif
  83. ELSE
  84. # if ! defined DECAL_FEEDBACK
  85. CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU)
  86. CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV)
  87. # else
  88. CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU)
  89. CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV)
  90. # endif
  91. ENDIF
  92. # if ! defined DECAL_FEEDBACK
  93. CALL Agrif_Update_Variable(e1u_id,procname = updateU2d)
  94. CALL Agrif_Update_Variable(e2v_id,procname = updateV2d)
  95. # else
  96. CALL Agrif_Update_Variable(e1u_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU2d)
  97. CALL Agrif_Update_Variable(e2v_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV2d)
  98. # endif
  99. # if defined key_dynspg_ts
  100. IF (ln_bt_fw) THEN
  101. ! Update time integrated transports
  102. IF (mod(nbcline,nbclineupdate) == 0) THEN
  103. # if ! defined DECAL_FEEDBACK
  104. CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b)
  105. CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b)
  106. # else
  107. CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateub2b)
  108. CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updatevb2b)
  109. # endif
  110. ELSE
  111. # if ! defined DECAL_FEEDBACK
  112. CALL Agrif_Update_Variable(ub2b_update_id,locupdate=(/0,1/),procname = updateub2b)
  113. CALL Agrif_Update_Variable(vb2b_update_id,locupdate=(/0,1/),procname = updatevb2b)
  114. # else
  115. CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateub2b)
  116. CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updatevb2b)
  117. # endif
  118. ENDIF
  119. END IF
  120. # endif
  121. !
  122. nbcline = nbcline + 1
  123. !
  124. Agrif_UseSpecialValueInUpdate = .TRUE.
  125. Agrif_SpecialValueFineGrid = 0.
  126. # if ! defined DECAL_FEEDBACK
  127. CALL Agrif_Update_Variable(sshn_id,procname = updateSSH)
  128. # else
  129. CALL Agrif_Update_Variable(sshn_id,locupdate=(/1,0/),procname = updateSSH)
  130. # endif
  131. Agrif_UseSpecialValueInUpdate = .FALSE.
  132. !
  133. #endif
  134. !
  135. ! Do recursive update:
  136. IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update:
  137. CALL Agrif_ChildGrid_To_ParentGrid()
  138. CALL Agrif_Update_Dyn()
  139. CALL Agrif_ParentGrid_To_ChildGrid()
  140. ENDIF
  141. !
  142. END SUBROUTINE Agrif_Update_Dyn
  143. # if defined key_zdftke
  144. SUBROUTINE Agrif_Update_Tke( kt )
  145. !!---------------------------------------------
  146. !! *** ROUTINE Agrif_Update_Tke ***
  147. !!---------------------------------------------
  148. !!
  149. INTEGER, INTENT(in) :: kt
  150. !
  151. IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN
  152. # if defined TWO_WAY
  153. Agrif_UseSpecialValueInUpdate = .TRUE.
  154. Agrif_SpecialValueFineGrid = 0.
  155. CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN )
  156. CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT )
  157. CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM )
  158. Agrif_UseSpecialValueInUpdate = .FALSE.
  159. # endif
  160. END SUBROUTINE Agrif_Update_Tke
  161. # endif /* key_zdftke */
  162. SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before )
  163. !!---------------------------------------------
  164. !! *** ROUTINE updateT ***
  165. !!---------------------------------------------
  166. # include "domzgr_substitute.h90"
  167. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  168. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
  169. LOGICAL, INTENT(in) :: before
  170. !!
  171. INTEGER :: ji,jj,jk,jn
  172. !!---------------------------------------------
  173. !
  174. IF (before) THEN
  175. DO jn = n1,n2
  176. DO jk=k1,k2
  177. DO jj=j1,j2
  178. DO ji=i1,i2
  179. tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn)
  180. END DO
  181. END DO
  182. END DO
  183. END DO
  184. ELSE
  185. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
  186. ! Add asselin part
  187. DO jn = n1,n2
  188. DO jk=k1,k2
  189. DO jj=j1,j2
  190. DO ji=i1,i2
  191. IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
  192. tsb(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) &
  193. & + atfp * ( tabres(ji,jj,jk,jn) &
  194. & - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk)
  195. ENDIF
  196. ENDDO
  197. ENDDO
  198. ENDDO
  199. ENDDO
  200. ENDIF
  201. DO jn = n1,n2
  202. DO jk=k1,k2
  203. DO jj=j1,j2
  204. DO ji=i1,i2
  205. IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN
  206. tsn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) * tmask(ji,jj,jk)
  207. END IF
  208. END DO
  209. END DO
  210. END DO
  211. END DO
  212. ENDIF
  213. !
  214. END SUBROUTINE updateTS
  215. SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before )
  216. !!---------------------------------------------
  217. !! *** ROUTINE updateu ***
  218. !!---------------------------------------------
  219. # include "domzgr_substitute.h90"
  220. !!
  221. INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
  222. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres
  223. LOGICAL, INTENT(in) :: before
  224. !!
  225. INTEGER :: ji, jj, jk
  226. REAL(wp) :: zrhoy
  227. !!---------------------------------------------
  228. !
  229. IF (before) THEN
  230. zrhoy = Agrif_Rhoy()
  231. DO jk=k1,k2
  232. DO jj=j1,j2
  233. DO ji=i1,i2
  234. tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk)
  235. tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u_n(ji,jj,jk)
  236. END DO
  237. END DO
  238. END DO
  239. tabres = zrhoy * tabres
  240. ELSE
  241. DO jk=k1,k2
  242. DO jj=j1,j2
  243. DO ji=i1,i2
  244. tabres(ji,jj,jk) = tabres(ji,jj,jk) / e2u(ji,jj) / fse3u_n(ji,jj,jk)
  245. !
  246. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
  247. ub(ji,jj,jk) = ub(ji,jj,jk) &
  248. & + atfp * ( tabres(ji,jj,jk) - un(ji,jj,jk) ) * umask(ji,jj,jk)
  249. ENDIF
  250. !
  251. un(ji,jj,jk) = tabres(ji,jj,jk) * umask(ji,jj,jk)
  252. END DO
  253. END DO
  254. END DO
  255. ENDIF
  256. !
  257. END SUBROUTINE updateu
  258. SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before )
  259. !!---------------------------------------------
  260. !! *** ROUTINE updatev ***
  261. !!---------------------------------------------
  262. # include "domzgr_substitute.h90"
  263. !!
  264. INTEGER :: i1,i2,j1,j2,k1,k2
  265. INTEGER :: ji,jj,jk
  266. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres
  267. LOGICAL :: before
  268. !!
  269. REAL(wp) :: zrhox
  270. !!---------------------------------------------
  271. !
  272. IF (before) THEN
  273. zrhox = Agrif_Rhox()
  274. DO jk=k1,k2
  275. DO jj=j1,j2
  276. DO ji=i1,i2
  277. tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk)
  278. tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v_n(ji,jj,jk)
  279. END DO
  280. END DO
  281. END DO
  282. tabres = zrhox * tabres
  283. ELSE
  284. DO jk=k1,k2
  285. DO jj=j1,j2
  286. DO ji=i1,i2
  287. tabres(ji,jj,jk) = tabres(ji,jj,jk) / e1v(ji,jj) / fse3v_n(ji,jj,jk)
  288. !
  289. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
  290. vb(ji,jj,jk) = vb(ji,jj,jk) &
  291. & + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk)
  292. ENDIF
  293. !
  294. vn(ji,jj,jk) = tabres(ji,jj,jk) * vmask(ji,jj,jk)
  295. END DO
  296. END DO
  297. END DO
  298. ENDIF
  299. !
  300. END SUBROUTINE updatev
  301. SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before )
  302. !!---------------------------------------------
  303. !! *** ROUTINE updateu2d ***
  304. !!---------------------------------------------
  305. # include "domzgr_substitute.h90"
  306. !!
  307. INTEGER, INTENT(in) :: i1, i2, j1, j2
  308. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  309. LOGICAL, INTENT(in) :: before
  310. !!
  311. INTEGER :: ji, jj, jk
  312. REAL(wp) :: zrhoy
  313. REAL(wp) :: zcorr
  314. !!---------------------------------------------
  315. !
  316. IF (before) THEN
  317. zrhoy = Agrif_Rhoy()
  318. DO jj=j1,j2
  319. DO ji=i1,i2
  320. tabres(ji,jj) = un_b(ji,jj) * hu(ji,jj) * e2u(ji,jj)
  321. END DO
  322. END DO
  323. tabres = zrhoy * tabres
  324. ELSE
  325. DO jj=j1,j2
  326. DO ji=i1,i2
  327. tabres(ji,jj) = tabres(ji,jj) * hur(ji,jj) / e2u(ji,jj)
  328. !
  329. ! Update "now" 3d velocities:
  330. spgu(ji,jj) = 0.e0
  331. DO jk=1,jpkm1
  332. spgu(ji,jj) = spgu(ji,jj) + fse3u_n(ji,jj,jk) * un(ji,jj,jk)
  333. END DO
  334. spgu(ji,jj) = spgu(ji,jj) * hur(ji,jj)
  335. !
  336. zcorr = tabres(ji,jj) - spgu(ji,jj)
  337. DO jk=1,jpkm1
  338. un(ji,jj,jk) = un(ji,jj,jk) + zcorr * umask(ji,jj,jk)
  339. END DO
  340. !
  341. ! Update barotropic velocities:
  342. #if defined key_dynspg_ts
  343. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
  344. zcorr = tabres(ji,jj) - un_b(ji,jj)
  345. ub_b(ji,jj) = ub_b(ji,jj) + atfp * zcorr * umask(ji,jj,1)
  346. END IF
  347. #endif
  348. un_b(ji,jj) = tabres(ji,jj) * umask(ji,jj,1)
  349. !
  350. ! Correct "before" velocities to hold correct bt component:
  351. spgu(ji,jj) = 0.e0
  352. DO jk=1,jpkm1
  353. spgu(ji,jj) = spgu(ji,jj) + fse3u_b(ji,jj,jk) * ub(ji,jj,jk)
  354. END DO
  355. spgu(ji,jj) = spgu(ji,jj) * hur_b(ji,jj)
  356. !
  357. zcorr = ub_b(ji,jj) - spgu(ji,jj)
  358. DO jk=1,jpkm1
  359. ub(ji,jj,jk) = ub(ji,jj,jk) + zcorr * umask(ji,jj,jk)
  360. END DO
  361. !
  362. END DO
  363. END DO
  364. ENDIF
  365. !
  366. END SUBROUTINE updateu2d
  367. SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before )
  368. !!---------------------------------------------
  369. !! *** ROUTINE updatev2d ***
  370. !!---------------------------------------------
  371. INTEGER, INTENT(in) :: i1, i2, j1, j2
  372. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  373. LOGICAL, INTENT(in) :: before
  374. !!
  375. INTEGER :: ji, jj, jk
  376. REAL(wp) :: zrhox
  377. REAL(wp) :: zcorr
  378. !!---------------------------------------------
  379. !
  380. IF (before) THEN
  381. zrhox = Agrif_Rhox()
  382. DO jj=j1,j2
  383. DO ji=i1,i2
  384. tabres(ji,jj) = vn_b(ji,jj) * hv(ji,jj) * e1v(ji,jj)
  385. END DO
  386. END DO
  387. tabres = zrhox * tabres
  388. ELSE
  389. DO jj=j1,j2
  390. DO ji=i1,i2
  391. tabres(ji,jj) = tabres(ji,jj) * hvr(ji,jj) / e1v(ji,jj)
  392. !
  393. ! Update "now" 3d velocities:
  394. spgv(ji,jj) = 0.e0
  395. DO jk=1,jpkm1
  396. spgv(ji,jj) = spgv(ji,jj) + fse3v_n(ji,jj,jk) * vn(ji,jj,jk)
  397. END DO
  398. spgv(ji,jj) = spgv(ji,jj) * hvr(ji,jj)
  399. !
  400. zcorr = tabres(ji,jj) - spgv(ji,jj)
  401. DO jk=1,jpkm1
  402. vn(ji,jj,jk) = vn(ji,jj,jk) + zcorr * vmask(ji,jj,jk)
  403. END DO
  404. !
  405. ! Update barotropic velocities:
  406. #if defined key_dynspg_ts
  407. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part
  408. zcorr = tabres(ji,jj) - vn_b(ji,jj)
  409. vb_b(ji,jj) = vb_b(ji,jj) + atfp * zcorr * vmask(ji,jj,1)
  410. END IF
  411. #endif
  412. vn_b(ji,jj) = tabres(ji,jj) * vmask(ji,jj,1)
  413. !
  414. ! Correct "before" velocities to hold correct bt component:
  415. spgv(ji,jj) = 0.e0
  416. DO jk=1,jpkm1
  417. spgv(ji,jj) = spgv(ji,jj) + fse3v_b(ji,jj,jk) * vb(ji,jj,jk)
  418. END DO
  419. spgv(ji,jj) = spgv(ji,jj) * hvr_b(ji,jj)
  420. !
  421. zcorr = vb_b(ji,jj) - spgv(ji,jj)
  422. DO jk=1,jpkm1
  423. vb(ji,jj,jk) = vb(ji,jj,jk) + zcorr * vmask(ji,jj,jk)
  424. END DO
  425. !
  426. END DO
  427. END DO
  428. ENDIF
  429. !
  430. END SUBROUTINE updatev2d
  431. SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before )
  432. !!---------------------------------------------
  433. !! *** ROUTINE updateSSH ***
  434. !!---------------------------------------------
  435. INTEGER, INTENT(in) :: i1, i2, j1, j2
  436. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  437. LOGICAL, INTENT(in) :: before
  438. !!
  439. INTEGER :: ji, jj
  440. !!---------------------------------------------
  441. !
  442. IF (before) THEN
  443. DO jj=j1,j2
  444. DO ji=i1,i2
  445. tabres(ji,jj) = sshn(ji,jj)
  446. END DO
  447. END DO
  448. ELSE
  449. #if ! defined key_dynspg_ts
  450. IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN
  451. DO jj=j1,j2
  452. DO ji=i1,i2
  453. sshb(ji,jj) = sshb(ji,jj) &
  454. & + atfp * ( tabres(ji,jj) - sshn(ji,jj) ) * tmask(ji,jj,1)
  455. END DO
  456. END DO
  457. ENDIF
  458. #endif
  459. DO jj=j1,j2
  460. DO ji=i1,i2
  461. sshn(ji,jj) = tabres(ji,jj) * tmask(ji,jj,1)
  462. END DO
  463. END DO
  464. ENDIF
  465. !
  466. END SUBROUTINE updateSSH
  467. SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before )
  468. !!---------------------------------------------
  469. !! *** ROUTINE updateub2b ***
  470. !!---------------------------------------------
  471. INTEGER, INTENT(in) :: i1, i2, j1, j2
  472. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  473. LOGICAL, INTENT(in) :: before
  474. !!
  475. INTEGER :: ji, jj
  476. REAL(wp) :: zrhoy
  477. !!---------------------------------------------
  478. !
  479. IF (before) THEN
  480. zrhoy = Agrif_Rhoy()
  481. DO jj=j1,j2
  482. DO ji=i1,i2
  483. tabres(ji,jj) = ub2_i_b(ji,jj) * e2u(ji,jj)
  484. END DO
  485. END DO
  486. tabres = zrhoy * tabres
  487. ELSE
  488. DO jj=j1,j2
  489. DO ji=i1,i2
  490. ub2_b(ji,jj) = tabres(ji,jj) / e2u(ji,jj)
  491. END DO
  492. END DO
  493. ENDIF
  494. !
  495. END SUBROUTINE updateub2b
  496. SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before )
  497. !!---------------------------------------------
  498. !! *** ROUTINE updatevb2b ***
  499. !!---------------------------------------------
  500. INTEGER, INTENT(in) :: i1, i2, j1, j2
  501. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
  502. LOGICAL, INTENT(in) :: before
  503. !!
  504. INTEGER :: ji, jj
  505. REAL(wp) :: zrhox
  506. !!---------------------------------------------
  507. !
  508. IF (before) THEN
  509. zrhox = Agrif_Rhox()
  510. DO jj=j1,j2
  511. DO ji=i1,i2
  512. tabres(ji,jj) = vb2_i_b(ji,jj) * e1v(ji,jj)
  513. END DO
  514. END DO
  515. tabres = zrhox * tabres
  516. ELSE
  517. DO jj=j1,j2
  518. DO ji=i1,i2
  519. vb2_b(ji,jj) = tabres(ji,jj) / e1v(ji,jj)
  520. END DO
  521. END DO
  522. ENDIF
  523. !
  524. END SUBROUTINE updatevb2b
  525. SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before )
  526. ! currently not used
  527. !!---------------------------------------------
  528. !! *** ROUTINE updateT ***
  529. !!---------------------------------------------
  530. # include "domzgr_substitute.h90"
  531. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  532. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres
  533. LOGICAL, iNTENT(in) :: before
  534. INTEGER :: ji,jj,jk
  535. REAL(wp) :: ztemp
  536. IF (before) THEN
  537. DO jk=k1,k2
  538. DO jj=j1,j2
  539. DO ji=i1,i2
  540. tabres(ji,jj,jk,1) = e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
  541. tabres(ji,jj,jk,2) = e1t(ji,jj)*tmask(ji,jj,jk)
  542. tabres(ji,jj,jk,3) = e2t(ji,jj)*tmask(ji,jj,jk)
  543. END DO
  544. END DO
  545. END DO
  546. tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy()
  547. tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox()
  548. tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy()
  549. ELSE
  550. DO jk=k1,k2
  551. DO jj=j1,j2
  552. DO ji=i1,i2
  553. IF( tabres(ji,jj,jk,1) .NE. 0. ) THEN
  554. print *,'VAL = ',ji,jj,jk,tabres(ji,jj,jk,1),e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk)
  555. print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk)
  556. print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk)
  557. ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3)))
  558. print *,'CORR = ',ztemp-1.
  559. print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, &
  560. tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp
  561. e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp
  562. e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp
  563. END IF
  564. END DO
  565. END DO
  566. END DO
  567. ENDIF
  568. !
  569. END SUBROUTINE update_scales
  570. # if defined key_zdftke
  571. SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before )
  572. !!---------------------------------------------
  573. !! *** ROUTINE updateen ***
  574. !!---------------------------------------------
  575. INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
  576. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  577. LOGICAL, INTENT(in) :: before
  578. !!---------------------------------------------
  579. !
  580. IF (before) THEN
  581. ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2)
  582. ELSE
  583. en(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)
  584. ENDIF
  585. !
  586. END SUBROUTINE updateEN
  587. SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before )
  588. !!---------------------------------------------
  589. !! *** ROUTINE updateavt ***
  590. !!---------------------------------------------
  591. INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
  592. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  593. LOGICAL, INTENT(in) :: before
  594. !!---------------------------------------------
  595. !
  596. IF (before) THEN
  597. ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2)
  598. ELSE
  599. avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)
  600. ENDIF
  601. !
  602. END SUBROUTINE updateAVT
  603. SUBROUTINE updateAVM( ptab, i1, i2, j1, j2, k1, k2, before )
  604. !!---------------------------------------------
  605. !! *** ROUTINE updateavm ***
  606. !!---------------------------------------------
  607. INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
  608. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  609. LOGICAL, INTENT(in) :: before
  610. !!---------------------------------------------
  611. !
  612. IF (before) THEN
  613. ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2)
  614. ELSE
  615. avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)
  616. ENDIF
  617. !
  618. END SUBROUTINE updateAVM
  619. # endif /* key_zdftke */
  620. #else
  621. CONTAINS
  622. SUBROUTINE agrif_opa_update_empty
  623. !!---------------------------------------------
  624. !! *** ROUTINE agrif_opa_update_empty ***
  625. !!---------------------------------------------
  626. WRITE(*,*) 'agrif_opa_update : You should not have seen this print! error?'
  627. END SUBROUTINE agrif_opa_update_empty
  628. #endif
  629. END MODULE agrif_opa_update