agrif_opa_interp.F90 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  1. MODULE agrif_opa_interp
  2. !!======================================================================
  3. !! *** MODULE agrif_opa_interp ***
  4. !! AGRIF: interpolation package
  5. !!======================================================================
  6. !! History : 2.0 ! 2002-06 (XXX) Original cade
  7. !! - ! 2005-11 (XXX)
  8. !! 3.2 ! 2009-04 (R. Benshila)
  9. !! 3.6 ! 2014-09 (R. Benshila)
  10. !!----------------------------------------------------------------------
  11. #if defined key_agrif && ! defined key_offline
  12. !!----------------------------------------------------------------------
  13. !! 'key_agrif' AGRIF zoom
  14. !! NOT 'key_offline' NO off-line tracers
  15. !!----------------------------------------------------------------------
  16. !! Agrif_tra :
  17. !! Agrif_dyn :
  18. !! interpu :
  19. !! interpv :
  20. !!----------------------------------------------------------------------
  21. USE par_oce
  22. USE oce
  23. USE dom_oce
  24. USE sol_oce
  25. USE agrif_oce
  26. USE phycst
  27. USE in_out_manager
  28. USE agrif_opa_sponge
  29. USE lib_mpp
  30. USE wrk_nemo
  31. USE dynspg_oce
  32. USE zdf_oce
  33. IMPLICIT NONE
  34. PRIVATE
  35. INTEGER :: bdy_tinterp = 0
  36. PUBLIC Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts
  37. PUBLIC interpun, interpvn, interpun2d, interpvn2d
  38. PUBLIC interptsn, interpsshn
  39. PUBLIC interpunb, interpvnb, interpub2b, interpvb2b
  40. PUBLIC interpe3t, interpumsk, interpvmsk
  41. # if defined key_zdftke
  42. PUBLIC Agrif_tke, interpavm
  43. # endif
  44. # include "domzgr_substitute.h90"
  45. # include "vectopt_loop_substitute.h90"
  46. !!----------------------------------------------------------------------
  47. !! NEMO/NST 3.6 , NEMO Consortium (2010)
  48. !! $Id: agrif_opa_interp.F90 4486 2014-02-05 11:23:56Z jchanut $
  49. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  50. !!----------------------------------------------------------------------
  51. CONTAINS
  52. SUBROUTINE Agrif_tra
  53. !!----------------------------------------------------------------------
  54. !! *** ROUTINE Agrif_tra ***
  55. !!----------------------------------------------------------------------
  56. !
  57. IF( Agrif_Root() ) RETURN
  58. Agrif_SpecialValue = 0.e0
  59. Agrif_UseSpecialValue = .TRUE.
  60. CALL Agrif_Bc_variable( tsn_id, procname=interptsn )
  61. Agrif_UseSpecialValue = .FALSE.
  62. !
  63. END SUBROUTINE Agrif_tra
  64. SUBROUTINE Agrif_dyn( kt )
  65. !!----------------------------------------------------------------------
  66. !! *** ROUTINE Agrif_DYN ***
  67. !!----------------------------------------------------------------------
  68. !!
  69. INTEGER, INTENT(in) :: kt
  70. !!
  71. INTEGER :: ji,jj,jk, j1,j2, i1,i2
  72. REAL(wp) :: timeref
  73. REAL(wp) :: z2dt, znugdt
  74. REAL(wp) :: zrhox, zrhoy
  75. REAL(wp), POINTER, DIMENSION(:,:) :: spgv1, spgu1
  76. !!----------------------------------------------------------------------
  77. IF( Agrif_Root() ) RETURN
  78. CALL wrk_alloc( jpi, jpj, spgv1, spgu1 )
  79. Agrif_SpecialValue=0.
  80. Agrif_UseSpecialValue = ln_spc_dyn
  81. CALL Agrif_Bc_variable(un_interp_id,procname=interpun)
  82. CALL Agrif_Bc_variable(vn_interp_id,procname=interpvn)
  83. #if defined key_dynspg_flt
  84. CALL Agrif_Bc_variable(e1u_id,calledweight=1., procname=interpun2d)
  85. CALL Agrif_Bc_variable(e2v_id,calledweight=1., procname=interpvn2d)
  86. #endif
  87. Agrif_UseSpecialValue = .FALSE.
  88. zrhox = Agrif_Rhox()
  89. zrhoy = Agrif_Rhoy()
  90. timeref = 1.
  91. ! time step: leap-frog
  92. z2dt = 2. * rdt
  93. ! time step: Euler if restart from rest
  94. IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt
  95. ! coefficients
  96. znugdt = grav * z2dt
  97. ! prevent smoothing in ghost cells
  98. i1=1
  99. i2=jpi
  100. j1=1
  101. j2=jpj
  102. IF((nbondj == -1).OR.(nbondj == 2)) j1 = 3
  103. IF((nbondj == +1).OR.(nbondj == 2)) j2 = nlcj-2
  104. IF((nbondi == -1).OR.(nbondi == 2)) i1 = 3
  105. IF((nbondi == +1).OR.(nbondi == 2)) i2 = nlci-2
  106. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  107. #if defined key_dynspg_flt
  108. DO jk=1,jpkm1
  109. DO jj=j1,j2
  110. ua(2,jj,jk) = (ua(2,jj,jk) - z2dt * znugdt * laplacu(2,jj))*umask(2,jj,jk)
  111. END DO
  112. END DO
  113. spgu(2,:)=0.
  114. DO jk=1,jpkm1
  115. DO jj=1,jpj
  116. spgu(2,jj)=spgu(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk)
  117. END DO
  118. END DO
  119. DO jj=1,jpj
  120. IF (umask(2,jj,1).NE.0.) THEN
  121. spgu(2,jj)=spgu(2,jj)/hu(2,jj)
  122. ENDIF
  123. END DO
  124. #else
  125. spgu(2,:) = ua_b(2,:)
  126. #endif
  127. DO jk=1,jpkm1
  128. DO jj=j1,j2
  129. ua(2,jj,jk) = 0.25*(ua(1,jj,jk)+2.*ua(2,jj,jk)+ua(3,jj,jk))
  130. ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk)
  131. END DO
  132. END DO
  133. spgu1(2,:)=0.
  134. DO jk=1,jpkm1
  135. DO jj=1,jpj
  136. spgu1(2,jj)=spgu1(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk)
  137. END DO
  138. END DO
  139. DO jj=1,jpj
  140. IF (umask(2,jj,1).NE.0.) THEN
  141. spgu1(2,jj)=spgu1(2,jj)/hu(2,jj)
  142. ENDIF
  143. END DO
  144. DO jk=1,jpkm1
  145. DO jj=j1,j2
  146. ua(2,jj,jk) = (ua(2,jj,jk)+spgu(2,jj)-spgu1(2,jj))*umask(2,jj,jk)
  147. END DO
  148. END DO
  149. #if defined key_dynspg_ts
  150. ! Set tangential velocities to time splitting estimate
  151. spgv1(2,:)=0.
  152. DO jk=1,jpkm1
  153. DO jj=1,jpj
  154. spgv1(2,jj)=spgv1(2,jj)+fse3v_a(2,jj,jk)*va(2,jj,jk)
  155. END DO
  156. END DO
  157. DO jj=1,jpj
  158. spgv1(2,jj)=spgv1(2,jj)*hvr_a(2,jj)
  159. END DO
  160. DO jk=1,jpkm1
  161. DO jj=1,jpj
  162. va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-spgv1(2,jj))*vmask(2,jj,jk)
  163. END DO
  164. END DO
  165. #endif
  166. ENDIF
  167. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  168. #if defined key_dynspg_flt
  169. DO jk=1,jpkm1
  170. DO jj=j1,j2
  171. ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)- z2dt * znugdt * laplacu(nlci-2,jj))*umask(nlci-2,jj,jk)
  172. END DO
  173. END DO
  174. spgu(nlci-2,:)=0.
  175. DO jk=1,jpkm1
  176. DO jj=1,jpj
  177. spgu(nlci-2,jj)=spgu(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk)
  178. ENDDO
  179. ENDDO
  180. DO jj=1,jpj
  181. IF (umask(nlci-2,jj,1).NE.0.) THEN
  182. spgu(nlci-2,jj)=spgu(nlci-2,jj)/hu(nlci-2,jj)
  183. ENDIF
  184. END DO
  185. #else
  186. spgu(nlci-2,:) = ua_b(nlci-2,:)
  187. #endif
  188. DO jk=1,jpkm1
  189. DO jj=j1,j2
  190. ua(nlci-2,jj,jk) = 0.25*(ua(nlci-3,jj,jk)+2.*ua(nlci-2,jj,jk)+ua(nlci-1,jj,jk))
  191. ua(nlci-2,jj,jk) = ua(nlci-2,jj,jk) * umask(nlci-2,jj,jk)
  192. END DO
  193. END DO
  194. spgu1(nlci-2,:)=0.
  195. DO jk=1,jpkm1
  196. DO jj=1,jpj
  197. spgu1(nlci-2,jj)=spgu1(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk)*umask(nlci-2,jj,jk)
  198. END DO
  199. END DO
  200. DO jj=1,jpj
  201. IF (umask(nlci-2,jj,1).NE.0.) THEN
  202. spgu1(nlci-2,jj)=spgu1(nlci-2,jj)/hu(nlci-2,jj)
  203. ENDIF
  204. END DO
  205. DO jk=1,jpkm1
  206. DO jj=j1,j2
  207. ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)+spgu(nlci-2,jj)-spgu1(nlci-2,jj))*umask(nlci-2,jj,jk)
  208. END DO
  209. END DO
  210. #if defined key_dynspg_ts
  211. ! Set tangential velocities to time splitting estimate
  212. spgv1(nlci-1,:)=0._wp
  213. DO jk=1,jpkm1
  214. DO jj=1,jpj
  215. spgv1(nlci-1,jj)=spgv1(nlci-1,jj)+fse3v_a(nlci-1,jj,jk)*va(nlci-1,jj,jk)*vmask(nlci-1,jj,jk)
  216. END DO
  217. END DO
  218. DO jj=1,jpj
  219. spgv1(nlci-1,jj)=spgv1(nlci-1,jj)*hvr_a(nlci-1,jj)
  220. END DO
  221. DO jk=1,jpkm1
  222. DO jj=1,jpj
  223. va(nlci-1,jj,jk) = (va(nlci-1,jj,jk)+va_b(nlci-1,jj)-spgv1(nlci-1,jj))*vmask(nlci-1,jj,jk)
  224. END DO
  225. END DO
  226. #endif
  227. ENDIF
  228. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  229. #if defined key_dynspg_flt
  230. DO jk=1,jpkm1
  231. DO ji=1,jpi
  232. va(ji,2,jk) = (va(ji,2,jk) - z2dt * znugdt * laplacv(ji,2))*vmask(ji,2,jk)
  233. END DO
  234. END DO
  235. spgv(:,2)=0.
  236. DO jk=1,jpkm1
  237. DO ji=1,jpi
  238. spgv(ji,2)=spgv(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk)
  239. END DO
  240. END DO
  241. DO ji=1,jpi
  242. IF (vmask(ji,2,1).NE.0.) THEN
  243. spgv(ji,2)=spgv(ji,2)/hv(ji,2)
  244. ENDIF
  245. END DO
  246. #else
  247. spgv(:,2)=va_b(:,2)
  248. #endif
  249. DO jk=1,jpkm1
  250. DO ji=i1,i2
  251. va(ji,2,jk)=0.25*(va(ji,1,jk)+2.*va(ji,2,jk)+va(ji,3,jk))
  252. va(ji,2,jk)=va(ji,2,jk)*vmask(ji,2,jk)
  253. END DO
  254. END DO
  255. spgv1(:,2)=0.
  256. DO jk=1,jpkm1
  257. DO ji=1,jpi
  258. spgv1(ji,2)=spgv1(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk)*vmask(ji,2,jk)
  259. END DO
  260. END DO
  261. DO ji=1,jpi
  262. IF (vmask(ji,2,1).NE.0.) THEN
  263. spgv1(ji,2)=spgv1(ji,2)/hv(ji,2)
  264. ENDIF
  265. END DO
  266. DO jk=1,jpkm1
  267. DO ji=1,jpi
  268. va(ji,2,jk) = (va(ji,2,jk)+spgv(ji,2)-spgv1(ji,2))*vmask(ji,2,jk)
  269. END DO
  270. END DO
  271. #if defined key_dynspg_ts
  272. ! Set tangential velocities to time splitting estimate
  273. spgu1(:,2)=0._wp
  274. DO jk=1,jpkm1
  275. DO ji=1,jpi
  276. spgu1(ji,2)=spgu1(ji,2)+fse3u_a(ji,2,jk)*ua(ji,2,jk)*umask(ji,2,jk)
  277. END DO
  278. END DO
  279. DO ji=1,jpi
  280. spgu1(ji,2)=spgu1(ji,2)*hur_a(ji,2)
  281. END DO
  282. DO jk=1,jpkm1
  283. DO ji=1,jpi
  284. ua(ji,2,jk) = (ua(ji,2,jk)+ua_b(ji,2)-spgu1(ji,2))*umask(ji,2,jk)
  285. END DO
  286. END DO
  287. #endif
  288. ENDIF
  289. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  290. #if defined key_dynspg_flt
  291. DO jk=1,jpkm1
  292. DO ji=1,jpi
  293. va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)-z2dt * znugdt * laplacv(ji,nlcj-2))*vmask(ji,nlcj-2,jk)
  294. END DO
  295. END DO
  296. spgv(:,nlcj-2)=0.
  297. DO jk=1,jpkm1
  298. DO ji=1,jpi
  299. spgv(ji,nlcj-2)=spgv(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk)
  300. END DO
  301. END DO
  302. DO ji=1,jpi
  303. IF (vmask(ji,nlcj-2,1).NE.0.) THEN
  304. spgv(ji,nlcj-2)=spgv(ji,nlcj-2)/hv(ji,nlcj-2)
  305. ENDIF
  306. END DO
  307. #else
  308. spgv(:,nlcj-2)=va_b(:,nlcj-2)
  309. #endif
  310. DO jk=1,jpkm1
  311. DO ji=i1,i2
  312. va(ji,nlcj-2,jk)=0.25*(va(ji,nlcj-3,jk)+2.*va(ji,nlcj-2,jk)+va(ji,nlcj-1,jk))
  313. va(ji,nlcj-2,jk) = va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk)
  314. END DO
  315. END DO
  316. spgv1(:,nlcj-2)=0.
  317. DO jk=1,jpkm1
  318. DO ji=1,jpi
  319. spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk)
  320. END DO
  321. END DO
  322. DO ji=1,jpi
  323. IF (vmask(ji,nlcj-2,1).NE.0.) THEN
  324. spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)/hv(ji,nlcj-2)
  325. ENDIF
  326. END DO
  327. DO jk=1,jpkm1
  328. DO ji=1,jpi
  329. va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)+spgv(ji,nlcj-2)-spgv1(ji,nlcj-2))*vmask(ji,nlcj-2,jk)
  330. END DO
  331. END DO
  332. #if defined key_dynspg_ts
  333. ! Set tangential velocities to time splitting estimate
  334. spgu1(:,nlcj-1)=0._wp
  335. DO jk=1,jpkm1
  336. DO ji=1,jpi
  337. spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)+fse3u_a(ji,nlcj-1,jk)*ua(ji,nlcj-1,jk)
  338. END DO
  339. END DO
  340. DO ji=1,jpi
  341. spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)*hur_a(ji,nlcj-1)
  342. END DO
  343. DO jk=1,jpkm1
  344. DO ji=1,jpi
  345. ua(ji,nlcj-1,jk) = (ua(ji,nlcj-1,jk)+ua_b(ji,nlcj-1)-spgu1(ji,nlcj-1))*umask(ji,nlcj-1,jk)
  346. END DO
  347. END DO
  348. #endif
  349. ENDIF
  350. !
  351. CALL wrk_dealloc( jpi, jpj, spgv1, spgu1 )
  352. !
  353. END SUBROUTINE Agrif_dyn
  354. SUBROUTINE Agrif_dyn_ts( jn )
  355. !!----------------------------------------------------------------------
  356. !! *** ROUTINE Agrif_dyn_ts ***
  357. !!----------------------------------------------------------------------
  358. !!
  359. INTEGER, INTENT(in) :: jn
  360. !!
  361. INTEGER :: ji, jj
  362. !!----------------------------------------------------------------------
  363. IF( Agrif_Root() ) RETURN
  364. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  365. DO jj=1,jpj
  366. va_e(2,jj) = vbdy_w(jj) * hvr_e(2,jj)
  367. ! Specified fluxes:
  368. ua_e(2,jj) = ubdy_w(jj) * hur_e(2,jj)
  369. ! Characteristics method:
  370. !alt ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) &
  371. !alt & - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) )
  372. END DO
  373. ENDIF
  374. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  375. DO jj=1,jpj
  376. va_e(nlci-1,jj) = vbdy_e(jj) * hvr_e(nlci-1,jj)
  377. ! Specified fluxes:
  378. ua_e(nlci-2,jj) = ubdy_e(jj) * hur_e(nlci-2,jj)
  379. ! Characteristics method:
  380. !alt ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) &
  381. !alt & + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) )
  382. END DO
  383. ENDIF
  384. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  385. DO ji=1,jpi
  386. ua_e(ji,2) = ubdy_s(ji) * hur_e(ji,2)
  387. ! Specified fluxes:
  388. va_e(ji,2) = vbdy_s(ji) * hvr_e(ji,2)
  389. ! Characteristics method:
  390. !alt va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) &
  391. !alt & - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) )
  392. END DO
  393. ENDIF
  394. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  395. DO ji=1,jpi
  396. ua_e(ji,nlcj-1) = ubdy_n(ji) * hur_e(ji,nlcj-1)
  397. ! Specified fluxes:
  398. va_e(ji,nlcj-2) = vbdy_n(ji) * hvr_e(ji,nlcj-2)
  399. ! Characteristics method:
  400. !alt va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2) + va_e(ji,nlcj-3) &
  401. !alt & + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) )
  402. END DO
  403. ENDIF
  404. !
  405. END SUBROUTINE Agrif_dyn_ts
  406. SUBROUTINE Agrif_dta_ts( kt )
  407. !!----------------------------------------------------------------------
  408. !! *** ROUTINE Agrif_dta_ts ***
  409. !!----------------------------------------------------------------------
  410. !!
  411. INTEGER, INTENT(in) :: kt
  412. !!
  413. INTEGER :: ji, jj
  414. LOGICAL :: ll_int_cons
  415. REAL(wp) :: zrhot, zt
  416. !!----------------------------------------------------------------------
  417. IF( Agrif_Root() ) RETURN
  418. ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in
  419. ! the forward case only
  420. zrhot = Agrif_rhot()
  421. ! "Central" time index for interpolation:
  422. IF (ln_bt_fw) THEN
  423. zt = REAL(Agrif_NbStepint()+0.5_wp,wp) / zrhot
  424. ELSE
  425. zt = REAL(Agrif_NbStepint(),wp) / zrhot
  426. ENDIF
  427. ! Linear interpolation of sea level
  428. Agrif_SpecialValue = 0.e0
  429. Agrif_UseSpecialValue = .TRUE.
  430. CALL Agrif_Bc_variable(sshn_id,calledweight=zt, procname=interpsshn )
  431. Agrif_UseSpecialValue = .FALSE.
  432. ! Interpolate barotropic fluxes
  433. Agrif_SpecialValue=0.
  434. Agrif_UseSpecialValue = ln_spc_dyn
  435. IF (ll_int_cons) THEN ! Conservative interpolation
  436. ! orders matters here !!!!!!
  437. CALL Agrif_Bc_variable(ub2b_interp_id,calledweight=1._wp, procname=interpub2b) ! Time integrated
  438. CALL Agrif_Bc_variable(vb2b_interp_id,calledweight=1._wp, procname=interpvb2b)
  439. bdy_tinterp = 1
  440. CALL Agrif_Bc_variable(unb_id ,calledweight=1._wp, procname=interpunb) ! After
  441. CALL Agrif_Bc_variable(vnb_id ,calledweight=1._wp, procname=interpvnb)
  442. bdy_tinterp = 2
  443. CALL Agrif_Bc_variable(unb_id ,calledweight=0._wp, procname=interpunb) ! Before
  444. CALL Agrif_Bc_variable(vnb_id ,calledweight=0._wp, procname=interpvnb)
  445. ELSE ! Linear interpolation
  446. bdy_tinterp = 0
  447. ubdy_w(:) = 0.e0 ; vbdy_w(:) = 0.e0
  448. ubdy_e(:) = 0.e0 ; vbdy_e(:) = 0.e0
  449. ubdy_n(:) = 0.e0 ; vbdy_n(:) = 0.e0
  450. ubdy_s(:) = 0.e0 ; vbdy_s(:) = 0.e0
  451. CALL Agrif_Bc_variable(unb_id,calledweight=zt, procname=interpunb)
  452. CALL Agrif_Bc_variable(vnb_id,calledweight=zt, procname=interpvnb)
  453. ENDIF
  454. Agrif_UseSpecialValue = .FALSE.
  455. !
  456. END SUBROUTINE Agrif_dta_ts
  457. SUBROUTINE Agrif_ssh( kt )
  458. !!----------------------------------------------------------------------
  459. !! *** ROUTINE Agrif_DYN ***
  460. !!----------------------------------------------------------------------
  461. INTEGER, INTENT(in) :: kt
  462. !!
  463. !!----------------------------------------------------------------------
  464. IF( Agrif_Root() ) RETURN
  465. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  466. ssha(2,:)=ssha(3,:)
  467. sshn(2,:)=sshn(3,:)
  468. ENDIF
  469. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  470. ssha(nlci-1,:)=ssha(nlci-2,:)
  471. sshn(nlci-1,:)=sshn(nlci-2,:)
  472. ENDIF
  473. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  474. ssha(:,2)=ssha(:,3)
  475. sshn(:,2)=sshn(:,3)
  476. ENDIF
  477. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  478. ssha(:,nlcj-1)=ssha(:,nlcj-2)
  479. sshn(:,nlcj-1)=sshn(:,nlcj-2)
  480. ENDIF
  481. END SUBROUTINE Agrif_ssh
  482. SUBROUTINE Agrif_ssh_ts( jn )
  483. !!----------------------------------------------------------------------
  484. !! *** ROUTINE Agrif_ssh_ts ***
  485. !!----------------------------------------------------------------------
  486. INTEGER, INTENT(in) :: jn
  487. !!
  488. INTEGER :: ji,jj
  489. !!----------------------------------------------------------------------
  490. IF((nbondi == -1).OR.(nbondi == 2)) THEN
  491. DO jj=1,jpj
  492. ssha_e(2,jj) = hbdy_w(jj)
  493. END DO
  494. ENDIF
  495. IF((nbondi == 1).OR.(nbondi == 2)) THEN
  496. DO jj=1,jpj
  497. ssha_e(nlci-1,jj) = hbdy_e(jj)
  498. END DO
  499. ENDIF
  500. IF((nbondj == -1).OR.(nbondj == 2)) THEN
  501. DO ji=1,jpi
  502. ssha_e(ji,2) = hbdy_s(ji)
  503. END DO
  504. ENDIF
  505. IF((nbondj == 1).OR.(nbondj == 2)) THEN
  506. DO ji=1,jpi
  507. ssha_e(ji,nlcj-1) = hbdy_n(ji)
  508. END DO
  509. ENDIF
  510. END SUBROUTINE Agrif_ssh_ts
  511. # if defined key_zdftke
  512. SUBROUTINE Agrif_tke
  513. !!----------------------------------------------------------------------
  514. !! *** ROUTINE Agrif_tke ***
  515. !!----------------------------------------------------------------------
  516. REAL(wp) :: zalpha
  517. !
  518. zalpha = REAL( Agrif_NbStepint() + Agrif_IRhot() - 1, wp ) / REAL( Agrif_IRhot(), wp )
  519. IF( zalpha > 1. ) zalpha = 1.
  520. Agrif_SpecialValue = 0.e0
  521. Agrif_UseSpecialValue = .TRUE.
  522. CALL Agrif_Bc_variable(avm_id ,calledweight=zalpha, procname=interpavm)
  523. Agrif_UseSpecialValue = .FALSE.
  524. !
  525. END SUBROUTINE Agrif_tke
  526. # endif
  527. SUBROUTINE interptsn(ptab,i1,i2,j1,j2,k1,k2,n1,n2,before,nb,ndir)
  528. !!---------------------------------------------
  529. !! *** ROUTINE interptsn ***
  530. !!---------------------------------------------
  531. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab
  532. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2
  533. LOGICAL, INTENT(in) :: before
  534. INTEGER, INTENT(in) :: nb , ndir
  535. !
  536. INTEGER :: ji, jj, jk, jn ! dummy loop indices
  537. INTEGER :: imin, imax, jmin, jmax
  538. REAL(wp) :: zrhox , zalpha1, zalpha2, zalpha3
  539. REAL(wp) :: zalpha4, zalpha5, zalpha6, zalpha7
  540. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  541. IF (before) THEN
  542. ptab(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2)
  543. ELSE
  544. !
  545. western_side = (nb == 1).AND.(ndir == 1)
  546. eastern_side = (nb == 1).AND.(ndir == 2)
  547. southern_side = (nb == 2).AND.(ndir == 1)
  548. northern_side = (nb == 2).AND.(ndir == 2)
  549. !
  550. zrhox = Agrif_Rhox()
  551. !
  552. zalpha1 = ( zrhox - 1. ) * 0.5
  553. zalpha2 = 1. - zalpha1
  554. !
  555. zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. )
  556. zalpha4 = 1. - zalpha3
  557. !
  558. zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. )
  559. zalpha7 = - ( zrhox - 1. ) / ( zrhox + 3. )
  560. zalpha5 = 1. - zalpha6 - zalpha7
  561. !
  562. imin = i1
  563. imax = i2
  564. jmin = j1
  565. jmax = j2
  566. !
  567. ! Remove CORNERS
  568. IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3
  569. IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2
  570. IF((nbondi == -1).OR.(nbondi == 2)) imin = 3
  571. IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2
  572. !
  573. IF( eastern_side) THEN
  574. DO jn = 1, jpts
  575. tsa(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn)
  576. DO jk = 1, jpkm1
  577. DO jj = jmin,jmax
  578. IF( umask(nlci-2,jj,jk) == 0.e0 ) THEN
  579. tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk)
  580. ELSE
  581. tsa(nlci-1,jj,jk,jn)=(zalpha4*tsa(nlci,jj,jk,jn)+zalpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk)
  582. IF( un(nlci-2,jj,jk) > 0.e0 ) THEN
  583. tsa(nlci-1,jj,jk,jn)=( zalpha6*tsa(nlci-2,jj,jk,jn)+zalpha5*tsa(nlci,jj,jk,jn) &
  584. + zalpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk)
  585. ENDIF
  586. ENDIF
  587. END DO
  588. END DO
  589. ENDDO
  590. ENDIF
  591. !
  592. IF( northern_side ) THEN
  593. DO jn = 1, jpts
  594. tsa(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn)
  595. DO jk = 1, jpkm1
  596. DO ji = imin,imax
  597. IF( vmask(ji,nlcj-2,jk) == 0.e0 ) THEN
  598. tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk)
  599. ELSE
  600. tsa(ji,nlcj-1,jk,jn)=(zalpha4*tsa(ji,nlcj,jk,jn)+zalpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)
  601. IF (vn(ji,nlcj-2,jk) > 0.e0 ) THEN
  602. tsa(ji,nlcj-1,jk,jn)=( zalpha6*tsa(ji,nlcj-2,jk,jn)+zalpha5*tsa(ji,nlcj,jk,jn) &
  603. + zalpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk)
  604. ENDIF
  605. ENDIF
  606. END DO
  607. END DO
  608. ENDDO
  609. ENDIF
  610. !
  611. IF( western_side) THEN
  612. DO jn = 1, jpts
  613. tsa(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn)
  614. DO jk = 1, jpkm1
  615. DO jj = jmin,jmax
  616. IF( umask(2,jj,jk) == 0.e0 ) THEN
  617. tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk)
  618. ELSE
  619. tsa(2,jj,jk,jn)=(zalpha4*tsa(1,jj,jk,jn)+zalpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk)
  620. IF( un(2,jj,jk) < 0.e0 ) THEN
  621. tsa(2,jj,jk,jn)=(zalpha6*tsa(3,jj,jk,jn)+zalpha5*tsa(1,jj,jk,jn)+zalpha7*tsa(4,jj,jk,jn))*tmask(2,jj,jk)
  622. ENDIF
  623. ENDIF
  624. END DO
  625. END DO
  626. END DO
  627. ENDIF
  628. !
  629. IF( southern_side ) THEN
  630. DO jn = 1, jpts
  631. tsa(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn)
  632. DO jk=1,jpk
  633. DO ji=imin,imax
  634. IF( vmask(ji,2,jk) == 0.e0 ) THEN
  635. tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk)
  636. ELSE
  637. tsa(ji,2,jk,jn)=(zalpha4*tsa(ji,1,jk,jn)+zalpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk)
  638. IF( vn(ji,2,jk) < 0.e0 ) THEN
  639. tsa(ji,2,jk,jn)=(zalpha6*tsa(ji,3,jk,jn)+zalpha5*tsa(ji,1,jk,jn)+zalpha7*tsa(ji,4,jk,jn))*tmask(ji,2,jk)
  640. ENDIF
  641. ENDIF
  642. END DO
  643. END DO
  644. ENDDO
  645. ENDIF
  646. !
  647. ! Treatment of corners
  648. !
  649. ! East south
  650. IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN
  651. tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:)
  652. ENDIF
  653. ! East north
  654. IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN
  655. tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:)
  656. ENDIF
  657. ! West south
  658. IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN
  659. tsa(2,2,:,:) = ptab(2,2,:,:)
  660. ENDIF
  661. ! West north
  662. IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN
  663. tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:)
  664. ENDIF
  665. !
  666. ENDIF
  667. !
  668. END SUBROUTINE interptsn
  669. SUBROUTINE interpsshn(ptab,i1,i2,j1,j2,before,nb,ndir)
  670. !!----------------------------------------------------------------------
  671. !! *** ROUTINE interpsshn ***
  672. !!----------------------------------------------------------------------
  673. INTEGER, INTENT(in) :: i1,i2,j1,j2
  674. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  675. LOGICAL, INTENT(in) :: before
  676. INTEGER, INTENT(in) :: nb , ndir
  677. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  678. !!----------------------------------------------------------------------
  679. !
  680. IF( before) THEN
  681. ptab(i1:i2,j1:j2) = sshn(i1:i2,j1:j2)
  682. ELSE
  683. western_side = (nb == 1).AND.(ndir == 1)
  684. eastern_side = (nb == 1).AND.(ndir == 2)
  685. southern_side = (nb == 2).AND.(ndir == 1)
  686. northern_side = (nb == 2).AND.(ndir == 2)
  687. IF(western_side) hbdy_w(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1)
  688. IF(eastern_side) hbdy_e(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1)
  689. IF(southern_side) hbdy_s(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1)
  690. IF(northern_side) hbdy_n(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1)
  691. ENDIF
  692. !
  693. END SUBROUTINE interpsshn
  694. SUBROUTINE interpun(ptab,i1,i2,j1,j2,k1,k2, before)
  695. !!---------------------------------------------
  696. !! *** ROUTINE interpun ***
  697. !!---------------------------------------------
  698. !!
  699. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  700. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  701. LOGICAL, INTENT(in) :: before
  702. !!
  703. INTEGER :: ji,jj,jk
  704. REAL(wp) :: zrhoy
  705. !!---------------------------------------------
  706. !
  707. IF (before) THEN
  708. DO jk=1,jpkm1
  709. DO jj=j1,j2
  710. DO ji=i1,i2
  711. ptab(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk)
  712. ptab(ji,jj,jk) = ptab(ji,jj,jk) * fse3u(ji,jj,jk)
  713. END DO
  714. END DO
  715. END DO
  716. ELSE
  717. zrhoy = Agrif_Rhoy()
  718. DO jk=1,jpkm1
  719. DO jj=j1,j2
  720. ua(i1:i2,jj,jk) = (ptab(i1:i2,jj,jk)/(zrhoy*e2u(i1:i2,jj)))
  721. ua(i1:i2,jj,jk) = ua(i1:i2,jj,jk) / fse3u(i1:i2,jj,jk)
  722. END DO
  723. END DO
  724. ENDIF
  725. !
  726. END SUBROUTINE interpun
  727. SUBROUTINE interpun2d(ptab,i1,i2,j1,j2,before)
  728. !!---------------------------------------------
  729. !! *** ROUTINE interpun ***
  730. !!---------------------------------------------
  731. !
  732. INTEGER, INTENT(in) :: i1,i2,j1,j2
  733. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  734. LOGICAL, INTENT(in) :: before
  735. !
  736. INTEGER :: ji,jj
  737. REAL(wp) :: ztref
  738. REAL(wp) :: zrhoy
  739. !!---------------------------------------------
  740. !
  741. ztref = 1.
  742. IF (before) THEN
  743. DO jj=j1,j2
  744. DO ji=i1,MIN(i2,nlci-1)
  745. ptab(ji,jj) = e2u(ji,jj) * ((gcx(ji+1,jj) - gcx(ji,jj))/e1u(ji,jj))
  746. END DO
  747. END DO
  748. ELSE
  749. zrhoy = Agrif_Rhoy()
  750. DO jj=j1,j2
  751. laplacu(i1:i2,jj) = ztref * (ptab(i1:i2,jj)/(zrhoy*e2u(i1:i2,jj))) !*umask(i1:i2,jj,1)
  752. END DO
  753. ENDIF
  754. !
  755. END SUBROUTINE interpun2d
  756. SUBROUTINE interpvn(ptab,i1,i2,j1,j2,k1,k2, before)
  757. !!---------------------------------------------
  758. !! *** ROUTINE interpvn ***
  759. !!---------------------------------------------
  760. !
  761. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  762. REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  763. LOGICAL, INTENT(in) :: before
  764. !
  765. INTEGER :: ji,jj,jk
  766. REAL(wp) :: zrhox
  767. !!---------------------------------------------
  768. !
  769. IF (before) THEN
  770. !interpv entre 1 et k2 et interpv2d en jpkp1
  771. DO jk=1,jpkm1
  772. DO jj=j1,j2
  773. DO ji=i1,i2
  774. ptab(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk)
  775. ptab(ji,jj,jk) = ptab(ji,jj,jk) * fse3v(ji,jj,jk)
  776. END DO
  777. END DO
  778. END DO
  779. ELSE
  780. zrhox= Agrif_Rhox()
  781. DO jk=1,jpkm1
  782. DO jj=j1,j2
  783. va(i1:i2,jj,jk) = (ptab(i1:i2,jj,jk)/(zrhox*e1v(i1:i2,jj)))
  784. va(i1:i2,jj,jk) = va(i1:i2,jj,jk) / fse3v(i1:i2,jj,jk)
  785. END DO
  786. END DO
  787. ENDIF
  788. !
  789. END SUBROUTINE interpvn
  790. SUBROUTINE interpvn2d(ptab,i1,i2,j1,j2,before)
  791. !!---------------------------------------------
  792. !! *** ROUTINE interpvn ***
  793. !!---------------------------------------------
  794. !
  795. INTEGER, INTENT(in) :: i1,i2,j1,j2
  796. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  797. LOGICAL, INTENT(in) :: before
  798. !
  799. INTEGER :: ji,jj
  800. REAL(wp) :: zrhox
  801. REAL(wp) :: ztref
  802. !!---------------------------------------------
  803. !
  804. ztref = 1.
  805. IF (before) THEN
  806. !interpv entre 1 et k2 et interpv2d en jpkp1
  807. DO jj=j1,MIN(j2,nlcj-1)
  808. DO ji=i1,i2
  809. ptab(ji,jj) = e1v(ji,jj) * ((gcx(ji,jj+1) - gcx(ji,jj))/e2v(ji,jj)) * vmask(ji,jj,1)
  810. END DO
  811. END DO
  812. ELSE
  813. zrhox = Agrif_Rhox()
  814. DO ji=i1,i2
  815. laplacv(ji,j1:j2) = ztref * (ptab(ji,j1:j2)/(zrhox*e1v(ji,j1:j2)))
  816. END DO
  817. ENDIF
  818. !
  819. END SUBROUTINE interpvn2d
  820. SUBROUTINE interpunb(ptab,i1,i2,j1,j2,before,nb,ndir)
  821. !!----------------------------------------------------------------------
  822. !! *** ROUTINE interpunb ***
  823. !!----------------------------------------------------------------------
  824. INTEGER, INTENT(in) :: i1,i2,j1,j2
  825. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  826. LOGICAL, INTENT(in) :: before
  827. INTEGER, INTENT(in) :: nb , ndir
  828. !!
  829. INTEGER :: ji,jj
  830. REAL(wp) :: zrhoy, zrhot, zt0, zt1, ztcoeff
  831. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  832. !!----------------------------------------------------------------------
  833. !
  834. IF (before) THEN
  835. DO jj=j1,j2
  836. DO ji=i1,i2
  837. ptab(ji,jj) = un_b(ji,jj) * e2u(ji,jj) * hu(ji,jj)
  838. END DO
  839. END DO
  840. ELSE
  841. western_side = (nb == 1).AND.(ndir == 1)
  842. eastern_side = (nb == 1).AND.(ndir == 2)
  843. southern_side = (nb == 2).AND.(ndir == 1)
  844. northern_side = (nb == 2).AND.(ndir == 2)
  845. zrhoy = Agrif_Rhoy()
  846. zrhot = Agrif_rhot()
  847. ! Time indexes bounds for integration
  848. zt0 = REAL(Agrif_NbStepint() , wp) / zrhot
  849. zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
  850. ! Polynomial interpolation coefficients:
  851. IF( bdy_tinterp == 1 ) THEN
  852. ztcoeff = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) &
  853. & - zt0**2._wp * ( zt0 - 1._wp) )
  854. ELSEIF( bdy_tinterp == 2 ) THEN
  855. ztcoeff = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp &
  856. & - zt0 * ( zt0 - 1._wp)**2._wp )
  857. ELSE
  858. ztcoeff = 1
  859. ENDIF
  860. !
  861. IF(western_side) THEN
  862. ubdy_w(j1:j2) = ubdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)
  863. ENDIF
  864. IF(eastern_side) THEN
  865. ubdy_e(j1:j2) = ubdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)
  866. ENDIF
  867. IF(southern_side) THEN
  868. ubdy_s(i1:i2) = ubdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1)
  869. ENDIF
  870. IF(northern_side) THEN
  871. ubdy_n(i1:i2) = ubdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)
  872. ENDIF
  873. !
  874. IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN
  875. IF(western_side) THEN
  876. ubdy_w(j1:j2) = ubdy_w(j1:j2) / (zrhoy*e2u(i1,j1:j2)) &
  877. & * umask(i1,j1:j2,1)
  878. ENDIF
  879. IF(eastern_side) THEN
  880. ubdy_e(j1:j2) = ubdy_e(j1:j2) / (zrhoy*e2u(i1,j1:j2)) &
  881. & * umask(i1,j1:j2,1)
  882. ENDIF
  883. IF(southern_side) THEN
  884. ubdy_s(i1:i2) = ubdy_s(i1:i2) / (zrhoy*e2u(i1:i2,j1)) &
  885. & * umask(i1:i2,j1,1)
  886. ENDIF
  887. IF(northern_side) THEN
  888. ubdy_n(i1:i2) = ubdy_n(i1:i2) / (zrhoy*e2u(i1:i2,j1)) &
  889. & * umask(i1:i2,j1,1)
  890. ENDIF
  891. ENDIF
  892. ENDIF
  893. !
  894. END SUBROUTINE interpunb
  895. SUBROUTINE interpvnb(ptab,i1,i2,j1,j2,before,nb,ndir)
  896. !!----------------------------------------------------------------------
  897. !! *** ROUTINE interpvnb ***
  898. !!----------------------------------------------------------------------
  899. INTEGER, INTENT(in) :: i1,i2,j1,j2
  900. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  901. LOGICAL, INTENT(in) :: before
  902. INTEGER, INTENT(in) :: nb , ndir
  903. !!
  904. INTEGER :: ji,jj
  905. REAL(wp) :: zrhox, zrhot, zt0, zt1, ztcoeff
  906. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  907. !!----------------------------------------------------------------------
  908. !
  909. IF (before) THEN
  910. DO jj=j1,j2
  911. DO ji=i1,i2
  912. ptab(ji,jj) = vn_b(ji,jj) * e1v(ji,jj) * hv(ji,jj)
  913. END DO
  914. END DO
  915. ELSE
  916. western_side = (nb == 1).AND.(ndir == 1)
  917. eastern_side = (nb == 1).AND.(ndir == 2)
  918. southern_side = (nb == 2).AND.(ndir == 1)
  919. northern_side = (nb == 2).AND.(ndir == 2)
  920. zrhox = Agrif_Rhox()
  921. zrhot = Agrif_rhot()
  922. ! Time indexes bounds for integration
  923. zt0 = REAL(Agrif_NbStepint() , wp) / zrhot
  924. zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
  925. IF( bdy_tinterp == 1 ) THEN
  926. ztcoeff = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) &
  927. & - zt0**2._wp * ( zt0 - 1._wp) )
  928. ELSEIF( bdy_tinterp == 2 ) THEN
  929. ztcoeff = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp &
  930. & - zt0 * ( zt0 - 1._wp)**2._wp )
  931. ELSE
  932. ztcoeff = 1
  933. ENDIF
  934. !
  935. IF(western_side) THEN
  936. vbdy_w(j1:j2) = vbdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)
  937. ENDIF
  938. IF(eastern_side) THEN
  939. vbdy_e(j1:j2) = vbdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)
  940. ENDIF
  941. IF(southern_side) THEN
  942. vbdy_s(i1:i2) = vbdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1)
  943. ENDIF
  944. IF(northern_side) THEN
  945. vbdy_n(i1:i2) = vbdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)
  946. ENDIF
  947. !
  948. IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN
  949. IF(western_side) THEN
  950. vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i1,j1:j2)) &
  951. & * vmask(i1,j1:j2,1)
  952. ENDIF
  953. IF(eastern_side) THEN
  954. vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2)) &
  955. & * vmask(i1,j1:j2,1)
  956. ENDIF
  957. IF(southern_side) THEN
  958. vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j1)) &
  959. & * vmask(i1:i2,j1,1)
  960. ENDIF
  961. IF(northern_side) THEN
  962. vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1)) &
  963. & * vmask(i1:i2,j1,1)
  964. ENDIF
  965. ENDIF
  966. ENDIF
  967. !
  968. END SUBROUTINE interpvnb
  969. SUBROUTINE interpub2b(ptab,i1,i2,j1,j2,before,nb,ndir)
  970. !!----------------------------------------------------------------------
  971. !! *** ROUTINE interpub2b ***
  972. !!----------------------------------------------------------------------
  973. INTEGER, INTENT(in) :: i1,i2,j1,j2
  974. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  975. LOGICAL, INTENT(in) :: before
  976. INTEGER, INTENT(in) :: nb , ndir
  977. !!
  978. INTEGER :: ji,jj
  979. REAL(wp) :: zrhot, zt0, zt1,zat
  980. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  981. !!----------------------------------------------------------------------
  982. IF( before ) THEN
  983. DO jj=j1,j2
  984. DO ji=i1,i2
  985. ptab(ji,jj) = ub2_b(ji,jj) * e2u(ji,jj)
  986. END DO
  987. END DO
  988. ELSE
  989. western_side = (nb == 1).AND.(ndir == 1)
  990. eastern_side = (nb == 1).AND.(ndir == 2)
  991. southern_side = (nb == 2).AND.(ndir == 1)
  992. northern_side = (nb == 2).AND.(ndir == 2)
  993. zrhot = Agrif_rhot()
  994. ! Time indexes bounds for integration
  995. zt0 = REAL(Agrif_NbStepint() , wp) / zrhot
  996. zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
  997. ! Polynomial interpolation coefficients:
  998. zat = zrhot * ( zt1**2._wp * (-2._wp*zt1 + 3._wp) &
  999. & - zt0**2._wp * (-2._wp*zt0 + 3._wp) )
  1000. !
  1001. IF(western_side ) ubdy_w(j1:j2) = zat * ptab(i1,j1:j2)
  1002. IF(eastern_side ) ubdy_e(j1:j2) = zat * ptab(i1,j1:j2)
  1003. IF(southern_side) ubdy_s(i1:i2) = zat * ptab(i1:i2,j1)
  1004. IF(northern_side) ubdy_n(i1:i2) = zat * ptab(i1:i2,j1)
  1005. ENDIF
  1006. !
  1007. END SUBROUTINE interpub2b
  1008. SUBROUTINE interpvb2b(ptab,i1,i2,j1,j2,before,nb,ndir)
  1009. !!----------------------------------------------------------------------
  1010. !! *** ROUTINE interpvb2b ***
  1011. !!----------------------------------------------------------------------
  1012. INTEGER, INTENT(in) :: i1,i2,j1,j2
  1013. REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab
  1014. LOGICAL, INTENT(in) :: before
  1015. INTEGER, INTENT(in) :: nb , ndir
  1016. !!
  1017. INTEGER :: ji,jj
  1018. REAL(wp) :: zrhot, zt0, zt1,zat
  1019. LOGICAL :: western_side, eastern_side,northern_side,southern_side
  1020. !!----------------------------------------------------------------------
  1021. !
  1022. IF( before ) THEN
  1023. DO jj=j1,j2
  1024. DO ji=i1,i2
  1025. ptab(ji,jj) = vb2_b(ji,jj) * e1v(ji,jj)
  1026. END DO
  1027. END DO
  1028. ELSE
  1029. western_side = (nb == 1).AND.(ndir == 1)
  1030. eastern_side = (nb == 1).AND.(ndir == 2)
  1031. southern_side = (nb == 2).AND.(ndir == 1)
  1032. northern_side = (nb == 2).AND.(ndir == 2)
  1033. zrhot = Agrif_rhot()
  1034. ! Time indexes bounds for integration
  1035. zt0 = REAL(Agrif_NbStepint() , wp) / zrhot
  1036. zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
  1037. ! Polynomial interpolation coefficients:
  1038. zat = zrhot * ( zt1**2._wp * (-2._wp*zt1 + 3._wp) &
  1039. & - zt0**2._wp * (-2._wp*zt0 + 3._wp) )
  1040. !
  1041. IF(western_side ) vbdy_w(j1:j2) = zat * ptab(i1,j1:j2)
  1042. IF(eastern_side ) vbdy_e(j1:j2) = zat * ptab(i1,j1:j2)
  1043. IF(southern_side) vbdy_s(i1:i2) = zat * ptab(i1:i2,j1)
  1044. IF(northern_side) vbdy_n(i1:i2) = zat * ptab(i1:i2,j1)
  1045. ENDIF
  1046. !
  1047. END SUBROUTINE interpvb2b
  1048. SUBROUTINE interpe3t(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir)
  1049. !!----------------------------------------------------------------------
  1050. !! *** ROUTINE interpe3t ***
  1051. !!----------------------------------------------------------------------
  1052. !
  1053. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  1054. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  1055. LOGICAL :: before
  1056. INTEGER, INTENT(in) :: nb , ndir
  1057. !
  1058. INTEGER :: ji, jj, jk
  1059. LOGICAL :: western_side, eastern_side, northern_side, southern_side
  1060. REAL(wp) :: ztmpmsk
  1061. !!----------------------------------------------------------------------
  1062. !
  1063. IF (before) THEN
  1064. DO jk=k1,k2
  1065. DO jj=j1,j2
  1066. DO ji=i1,i2
  1067. ptab(ji,jj,jk) = tmask(ji,jj,jk) * e3t_0(ji,jj,jk)
  1068. END DO
  1069. END DO
  1070. END DO
  1071. ELSE
  1072. western_side = (nb == 1).AND.(ndir == 1)
  1073. eastern_side = (nb == 1).AND.(ndir == 2)
  1074. southern_side = (nb == 2).AND.(ndir == 1)
  1075. northern_side = (nb == 2).AND.(ndir == 2)
  1076. DO jk=k1,k2
  1077. DO jj=j1,j2
  1078. DO ji=i1,i2
  1079. ! Get velocity mask at boundary edge points:
  1080. IF (western_side) ztmpmsk = umask(ji ,jj ,1)
  1081. IF (eastern_side) ztmpmsk = umask(nlci-2,jj ,1)
  1082. IF (northern_side) ztmpmsk = vmask(ji ,nlcj-2,1)
  1083. IF (southern_side) ztmpmsk = vmask(ji ,2 ,1)
  1084. IF (ABS(ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk))*ztmpmsk > 1.D-2) THEN
  1085. IF (western_side) THEN
  1086. WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1087. ELSEIF (eastern_side) THEN
  1088. WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1089. ELSEIF (southern_side) THEN
  1090. WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk
  1091. ELSEIF (northern_side) THEN
  1092. WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk
  1093. ENDIF
  1094. WRITE(numout,*) ' ptab(ji,jj,jk), fse3t(ji,jj,jk) ', ptab(ji,jj,jk), e3t_0(ji,jj,jk)
  1095. kindic_agr = kindic_agr + 1
  1096. ENDIF
  1097. END DO
  1098. END DO
  1099. END DO
  1100. ENDIF
  1101. !
  1102. END SUBROUTINE interpe3t
  1103. SUBROUTINE interpumsk(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir)
  1104. !!----------------------------------------------------------------------
  1105. !! *** ROUTINE interpumsk ***
  1106. !!----------------------------------------------------------------------
  1107. !
  1108. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  1109. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  1110. LOGICAL :: before
  1111. INTEGER, INTENT(in) :: nb , ndir
  1112. !
  1113. INTEGER :: ji, jj, jk
  1114. LOGICAL :: western_side, eastern_side
  1115. !!----------------------------------------------------------------------
  1116. !
  1117. IF (before) THEN
  1118. DO jk=k1,k2
  1119. DO jj=j1,j2
  1120. DO ji=i1,i2
  1121. ptab(ji,jj,jk) = umask(ji,jj,jk)
  1122. END DO
  1123. END DO
  1124. END DO
  1125. ELSE
  1126. western_side = (nb == 1).AND.(ndir == 1)
  1127. eastern_side = (nb == 1).AND.(ndir == 2)
  1128. DO jk=k1,k2
  1129. DO jj=j1,j2
  1130. DO ji=i1,i2
  1131. ! Velocity mask at boundary edge points:
  1132. IF (ABS(ptab(ji,jj,jk) - umask(ji,jj,jk)) > 1.D-2) THEN
  1133. IF (western_side) THEN
  1134. WRITE(numout,*) 'ERROR with umask at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1135. WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk)
  1136. kindic_agr = kindic_agr + 1
  1137. ELSEIF (eastern_side) THEN
  1138. WRITE(numout,*) 'ERROR with umask at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1139. WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk)
  1140. kindic_agr = kindic_agr + 1
  1141. ENDIF
  1142. ENDIF
  1143. END DO
  1144. END DO
  1145. END DO
  1146. ENDIF
  1147. !
  1148. END SUBROUTINE interpumsk
  1149. SUBROUTINE interpvmsk(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir)
  1150. !!----------------------------------------------------------------------
  1151. !! *** ROUTINE interpvmsk ***
  1152. !!----------------------------------------------------------------------
  1153. !
  1154. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  1155. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  1156. LOGICAL :: before
  1157. INTEGER, INTENT(in) :: nb , ndir
  1158. !
  1159. INTEGER :: ji, jj, jk
  1160. LOGICAL :: northern_side, southern_side
  1161. !!----------------------------------------------------------------------
  1162. !
  1163. IF (before) THEN
  1164. DO jk=k1,k2
  1165. DO jj=j1,j2
  1166. DO ji=i1,i2
  1167. ptab(ji,jj,jk) = vmask(ji,jj,jk)
  1168. END DO
  1169. END DO
  1170. END DO
  1171. ELSE
  1172. southern_side = (nb == 2).AND.(ndir == 1)
  1173. northern_side = (nb == 2).AND.(ndir == 2)
  1174. DO jk=k1,k2
  1175. DO jj=j1,j2
  1176. DO ji=i1,i2
  1177. ! Velocity mask at boundary edge points:
  1178. IF (ABS(ptab(ji,jj,jk) - vmask(ji,jj,jk)) > 1.D-2) THEN
  1179. IF (southern_side) THEN
  1180. WRITE(numout,*) 'ERROR with vmask at the southern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1181. WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk)
  1182. kindic_agr = kindic_agr + 1
  1183. ELSEIF (northern_side) THEN
  1184. WRITE(numout,*) 'ERROR with vmask at the northern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk
  1185. WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk)
  1186. kindic_agr = kindic_agr + 1
  1187. ENDIF
  1188. ENDIF
  1189. END DO
  1190. END DO
  1191. END DO
  1192. ENDIF
  1193. !
  1194. END SUBROUTINE interpvmsk
  1195. # if defined key_zdftke
  1196. SUBROUTINE interpavm(ptab,i1,i2,j1,j2,k1,k2,before)
  1197. !!----------------------------------------------------------------------
  1198. !! *** ROUTINE interavm ***
  1199. !!----------------------------------------------------------------------
  1200. INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2
  1201. REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
  1202. LOGICAL, INTENT(in) :: before
  1203. !!----------------------------------------------------------------------
  1204. !
  1205. IF( before) THEN
  1206. ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2)
  1207. ELSE
  1208. avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)
  1209. ENDIF
  1210. !
  1211. END SUBROUTINE interpavm
  1212. # endif /* key_zdftke */
  1213. #else
  1214. !!----------------------------------------------------------------------
  1215. !! Empty module no AGRIF zoom
  1216. !!----------------------------------------------------------------------
  1217. CONTAINS
  1218. SUBROUTINE Agrif_OPA_Interp_empty
  1219. WRITE(*,*) 'agrif_opa_interp : You should not have seen this print! error?'
  1220. END SUBROUTINE Agrif_OPA_Interp_empty
  1221. #endif
  1222. !!======================================================================
  1223. END MODULE agrif_opa_interp