lbcnfd.F90 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. MODULE lbcnfd
  2. !!======================================================================
  3. !! *** MODULE lbcnfd ***
  4. !! Ocean : north fold boundary conditions
  5. !!======================================================================
  6. !! History : 3.2 ! 2009-03 (R. Benshila) Original code
  7. !! 3.5 ! 2013-07 (I. Epicoco, S. Mocavero - CMCC) MPP optimization
  8. !!----------------------------------------------------------------------
  9. !!----------------------------------------------------------------------
  10. !! lbc_nfd : generic interface for lbc_nfd_3d and lbc_nfd_2d routines
  11. !! lbc_nfd_3d : lateral boundary condition: North fold treatment for a 3D arrays (lbc_nfd)
  12. !! lbc_nfd_2d : lateral boundary condition: North fold treatment for a 2D arrays (lbc_nfd)
  13. !! mpp_lbc_nfd_3d : North fold treatment for a 3D arrays optimized for MPP
  14. !! mpp_lbc_nfd_2d : North fold treatment for a 2D arrays optimized for MPP
  15. !!----------------------------------------------------------------------
  16. USE dom_oce ! ocean space and time domain
  17. USE in_out_manager ! I/O manager
  18. IMPLICIT NONE
  19. PRIVATE
  20. INTERFACE lbc_nfd
  21. MODULE PROCEDURE lbc_nfd_3d, lbc_nfd_2d
  22. END INTERFACE
  23. PUBLIC lbc_nfd ! north fold conditions
  24. INTERFACE mpp_lbc_nfd
  25. MODULE PROCEDURE mpp_lbc_nfd_3d, mpp_lbc_nfd_2d
  26. END INTERFACE
  27. PUBLIC mpp_lbc_nfd ! north fold conditions in parallel case
  28. INTEGER, PUBLIC, PARAMETER :: jpmaxngh = 3
  29. INTEGER, PUBLIC :: nsndto, nfsloop, nfeloop
  30. INTEGER, PUBLIC, DIMENSION (jpmaxngh) :: isendto ! processes to which communicate
  31. !!----------------------------------------------------------------------
  32. !! NEMO/OPA 3.3 , NEMO Consortium (2010)
  33. !! $Id: lbcnfd.F90 4686 2014-06-24 11:03:50Z epico $
  34. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  35. !!----------------------------------------------------------------------
  36. CONTAINS
  37. SUBROUTINE lbc_nfd_3d( pt3d, cd_type, psgn )
  38. !!----------------------------------------------------------------------
  39. !! *** routine lbc_nfd_3d ***
  40. !!
  41. !! ** Purpose : 3D lateral boundary condition : North fold treatment
  42. !! without processor exchanges.
  43. !!
  44. !! ** Method :
  45. !!
  46. !! ** Action : pt3d with updated values along the north fold
  47. !!----------------------------------------------------------------------
  48. CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points
  49. ! ! = T , U , V , F , W points
  50. REAL(wp) , INTENT(in ) :: psgn ! control of the sign change
  51. ! ! = -1. , the sign is changed if north fold boundary
  52. ! ! = 1. , the sign is kept if north fold boundary
  53. REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pt3d ! 3D array on which the boundary condition is applied
  54. !
  55. INTEGER :: ji, jk
  56. INTEGER :: ijt, iju, ijpj, ijpjm1
  57. !!----------------------------------------------------------------------
  58. SELECT CASE ( jpni )
  59. CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction
  60. CASE DEFAULT ; ijpj = 4 ! several proc along the i-direction
  61. END SELECT
  62. ijpjm1 = ijpj-1
  63. DO jk = 1, jpk
  64. !
  65. SELECT CASE ( npolj )
  66. !
  67. CASE ( 3 , 4 ) ! * North fold T-point pivot
  68. !
  69. SELECT CASE ( cd_type )
  70. CASE ( 'T' , 'W' ) ! T-, W-point
  71. DO ji = 2, jpiglo
  72. ijt = jpiglo-ji+2
  73. pt3d(ji,ijpj,jk) = psgn * pt3d(ijt,ijpj-2,jk)
  74. END DO
  75. pt3d(1,ijpj,jk) = psgn * pt3d(3,ijpj-2,jk)
  76. DO ji = jpiglo/2+1, jpiglo
  77. ijt = jpiglo-ji+2
  78. pt3d(ji,ijpjm1,jk) = psgn * pt3d(ijt,ijpjm1,jk)
  79. END DO
  80. CASE ( 'U' ) ! U-point
  81. DO ji = 1, jpiglo-1
  82. iju = jpiglo-ji+1
  83. pt3d(ji,ijpj,jk) = psgn * pt3d(iju,ijpj-2,jk)
  84. END DO
  85. pt3d( 1 ,ijpj,jk) = psgn * pt3d( 2 ,ijpj-2,jk)
  86. pt3d(jpiglo,ijpj,jk) = psgn * pt3d(jpiglo-1,ijpj-2,jk)
  87. DO ji = jpiglo/2, jpiglo-1
  88. iju = jpiglo-ji+1
  89. pt3d(ji,ijpjm1,jk) = psgn * pt3d(iju,ijpjm1,jk)
  90. END DO
  91. CASE ( 'V' ) ! V-point
  92. DO ji = 2, jpiglo
  93. ijt = jpiglo-ji+2
  94. pt3d(ji,ijpj-1,jk) = psgn * pt3d(ijt,ijpj-2,jk)
  95. pt3d(ji,ijpj ,jk) = psgn * pt3d(ijt,ijpj-3,jk)
  96. END DO
  97. pt3d(1,ijpj,jk) = psgn * pt3d(3,ijpj-3,jk)
  98. CASE ( 'F' ) ! F-point
  99. DO ji = 1, jpiglo-1
  100. iju = jpiglo-ji+1
  101. pt3d(ji,ijpj-1,jk) = psgn * pt3d(iju,ijpj-2,jk)
  102. pt3d(ji,ijpj ,jk) = psgn * pt3d(iju,ijpj-3,jk)
  103. END DO
  104. pt3d( 1 ,ijpj,jk) = psgn * pt3d( 2 ,ijpj-3,jk)
  105. pt3d(jpiglo,ijpj,jk) = psgn * pt3d(jpiglo-1,ijpj-3,jk)
  106. END SELECT
  107. !
  108. CASE ( 5 , 6 ) ! * North fold F-point pivot
  109. !
  110. SELECT CASE ( cd_type )
  111. CASE ( 'T' , 'W' ) ! T-, W-point
  112. DO ji = 1, jpiglo
  113. ijt = jpiglo-ji+1
  114. pt3d(ji,ijpj,jk) = psgn * pt3d(ijt,ijpj-1,jk)
  115. END DO
  116. CASE ( 'U' ) ! U-point
  117. DO ji = 1, jpiglo-1
  118. iju = jpiglo-ji
  119. pt3d(ji,ijpj,jk) = psgn * pt3d(iju,ijpj-1,jk)
  120. END DO
  121. pt3d(jpiglo,ijpj,jk) = psgn * pt3d(1,ijpj-1,jk)
  122. CASE ( 'V' ) ! V-point
  123. DO ji = 1, jpiglo
  124. ijt = jpiglo-ji+1
  125. pt3d(ji,ijpj,jk) = psgn * pt3d(ijt,ijpj-2,jk)
  126. END DO
  127. DO ji = jpiglo/2+1, jpiglo
  128. ijt = jpiglo-ji+1
  129. pt3d(ji,ijpjm1,jk) = psgn * pt3d(ijt,ijpjm1,jk)
  130. END DO
  131. CASE ( 'F' ) ! F-point
  132. DO ji = 1, jpiglo-1
  133. iju = jpiglo-ji
  134. pt3d(ji,ijpj ,jk) = psgn * pt3d(iju,ijpj-2,jk)
  135. END DO
  136. pt3d(jpiglo,ijpj,jk) = psgn * pt3d(1,ijpj-2,jk)
  137. DO ji = jpiglo/2+1, jpiglo-1
  138. iju = jpiglo-ji
  139. pt3d(ji,ijpjm1,jk) = psgn * pt3d(iju,ijpjm1,jk)
  140. END DO
  141. END SELECT
  142. !
  143. CASE DEFAULT ! * closed : the code probably never go through
  144. !
  145. SELECT CASE ( cd_type)
  146. CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points
  147. pt3d(:, 1 ,jk) = 0.e0
  148. pt3d(:,ijpj,jk) = 0.e0
  149. CASE ( 'F' ) ! F-point
  150. pt3d(:,ijpj,jk) = 0.e0
  151. END SELECT
  152. !
  153. END SELECT ! npolj
  154. !
  155. END DO
  156. !
  157. END SUBROUTINE lbc_nfd_3d
  158. SUBROUTINE lbc_nfd_2d( pt2d, cd_type, psgn, pr2dj )
  159. !!----------------------------------------------------------------------
  160. !! *** routine lbc_nfd_2d ***
  161. !!
  162. !! ** Purpose : 2D lateral boundary condition : North fold treatment
  163. !! without processor exchanges.
  164. !!
  165. !! ** Method :
  166. !!
  167. !! ** Action : pt2d with updated values along the north fold
  168. !!----------------------------------------------------------------------
  169. CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points
  170. ! ! = T , U , V , F , W points
  171. REAL(wp) , INTENT(in ) :: psgn ! control of the sign change
  172. ! ! = -1. , the sign is changed if north fold boundary
  173. ! ! = 1. , the sign is kept if north fold boundary
  174. REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt2d ! 2D array on which the boundary condition is applied
  175. INTEGER , OPTIONAL , INTENT(in ) :: pr2dj ! number of additional halos
  176. !
  177. INTEGER :: ji, jl, ipr2dj
  178. INTEGER :: ijt, iju, ijpj, ijpjm1
  179. !!----------------------------------------------------------------------
  180. SELECT CASE ( jpni )
  181. CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction
  182. CASE DEFAULT ; ijpj = 4 ! several proc along the i-direction
  183. END SELECT
  184. !
  185. IF( PRESENT(pr2dj) ) THEN ! use of additional halos
  186. ipr2dj = pr2dj
  187. IF( jpni > 1 ) ijpj = ijpj + ipr2dj
  188. ELSE
  189. ipr2dj = 0
  190. ENDIF
  191. !
  192. ijpjm1 = ijpj-1
  193. SELECT CASE ( npolj )
  194. !
  195. CASE ( 3, 4 ) ! * North fold T-point pivot
  196. !
  197. SELECT CASE ( cd_type )
  198. !
  199. CASE ( 'T' , 'W' ) ! T- , W-points
  200. DO jl = 0, ipr2dj
  201. DO ji = 2, jpiglo
  202. ijt=jpiglo-ji+2
  203. pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-2-jl)
  204. END DO
  205. END DO
  206. pt2d(1,ijpj) = psgn * pt2d(3,ijpj-2)
  207. DO ji = jpiglo/2+1, jpiglo
  208. ijt=jpiglo-ji+2
  209. pt2d(ji,ijpj-1) = psgn * pt2d(ijt,ijpj-1)
  210. END DO
  211. CASE ( 'U' ) ! U-point
  212. DO jl = 0, ipr2dj
  213. DO ji = 1, jpiglo-1
  214. iju = jpiglo-ji+1
  215. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-2-jl)
  216. END DO
  217. END DO
  218. pt2d( 1 ,ijpj ) = psgn * pt2d( 2 ,ijpj-2)
  219. pt2d(jpiglo,ijpj ) = psgn * pt2d(jpiglo-1,ijpj-2)
  220. pt2d(1 ,ijpj-1) = psgn * pt2d(jpiglo ,ijpj-1)
  221. DO ji = jpiglo/2, jpiglo-1
  222. iju = jpiglo-ji+1
  223. pt2d(ji,ijpjm1) = psgn * pt2d(iju,ijpjm1)
  224. END DO
  225. CASE ( 'V' ) ! V-point
  226. DO jl = -1, ipr2dj
  227. DO ji = 2, jpiglo
  228. ijt = jpiglo-ji+2
  229. pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-3-jl)
  230. END DO
  231. END DO
  232. pt2d( 1 ,ijpj) = psgn * pt2d( 3 ,ijpj-3)
  233. CASE ( 'F' ) ! F-point
  234. DO jl = -1, ipr2dj
  235. DO ji = 1, jpiglo-1
  236. iju = jpiglo-ji+1
  237. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-3-jl)
  238. END DO
  239. END DO
  240. pt2d( 1 ,ijpj) = psgn * pt2d( 2 ,ijpj-3)
  241. pt2d(jpiglo,ijpj) = psgn * pt2d(jpiglo-1,ijpj-3)
  242. pt2d(jpiglo,ijpj-1) = psgn * pt2d(jpiglo-1,ijpj-2)
  243. pt2d( 1 ,ijpj-1) = psgn * pt2d( 2 ,ijpj-2)
  244. CASE ( 'I' ) ! ice U-V point (I-point)
  245. DO jl = 0, ipr2dj
  246. pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)
  247. DO ji = 3, jpiglo
  248. iju = jpiglo - ji + 3
  249. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)
  250. END DO
  251. END DO
  252. CASE ( 'J' ) ! first ice U-V point
  253. DO jl =0, ipr2dj
  254. pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)
  255. DO ji = 3, jpiglo
  256. iju = jpiglo - ji + 3
  257. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)
  258. END DO
  259. END DO
  260. CASE ( 'K' ) ! second ice U-V point
  261. DO jl =0, ipr2dj
  262. pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)
  263. DO ji = 3, jpiglo
  264. iju = jpiglo - ji + 3
  265. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)
  266. END DO
  267. END DO
  268. END SELECT
  269. !
  270. CASE ( 5, 6 ) ! * North fold F-point pivot
  271. !
  272. SELECT CASE ( cd_type )
  273. CASE ( 'T' , 'W' ) ! T-, W-point
  274. DO jl = 0, ipr2dj
  275. DO ji = 1, jpiglo
  276. ijt = jpiglo-ji+1
  277. pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-1-jl)
  278. END DO
  279. END DO
  280. CASE ( 'U' ) ! U-point
  281. DO jl = 0, ipr2dj
  282. DO ji = 1, jpiglo-1
  283. iju = jpiglo-ji
  284. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)
  285. END DO
  286. END DO
  287. pt2d(jpiglo,ijpj) = psgn * pt2d(1,ijpj-1)
  288. CASE ( 'V' ) ! V-point
  289. DO jl = 0, ipr2dj
  290. DO ji = 1, jpiglo
  291. ijt = jpiglo-ji+1
  292. pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-2-jl)
  293. END DO
  294. END DO
  295. DO ji = jpiglo/2+1, jpiglo
  296. ijt = jpiglo-ji+1
  297. pt2d(ji,ijpjm1) = psgn * pt2d(ijt,ijpjm1)
  298. END DO
  299. CASE ( 'F' ) ! F-point
  300. DO jl = 0, ipr2dj
  301. DO ji = 1, jpiglo-1
  302. iju = jpiglo-ji
  303. pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-2-jl)
  304. END DO
  305. END DO
  306. pt2d(jpiglo,ijpj) = psgn * pt2d(1,ijpj-2)
  307. DO ji = jpiglo/2+1, jpiglo-1
  308. iju = jpiglo-ji
  309. pt2d(ji,ijpjm1) = psgn * pt2d(iju,ijpjm1)
  310. END DO
  311. CASE ( 'I' ) ! ice U-V point (I-point)
  312. pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0
  313. DO jl = 0, ipr2dj
  314. DO ji = 2 , jpiglo-1
  315. ijt = jpiglo - ji + 2
  316. pt2d(ji,ijpj+jl)= 0.5 * ( pt2d(ji,ijpj-1-jl) + psgn * pt2d(ijt,ijpj-1-jl) )
  317. END DO
  318. END DO
  319. CASE ( 'J' ) ! first ice U-V point
  320. pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0
  321. DO jl = 0, ipr2dj
  322. DO ji = 2 , jpiglo-1
  323. ijt = jpiglo - ji + 2
  324. pt2d(ji,ijpj+jl)= pt2d(ji,ijpj-1-jl)
  325. END DO
  326. END DO
  327. CASE ( 'K' ) ! second ice U-V point
  328. pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0
  329. DO jl = 0, ipr2dj
  330. DO ji = 2 , jpiglo-1
  331. ijt = jpiglo - ji + 2
  332. pt2d(ji,ijpj+jl)= pt2d(ijt,ijpj-1-jl)
  333. END DO
  334. END DO
  335. END SELECT
  336. !
  337. CASE DEFAULT ! * closed : the code probably never go through
  338. !
  339. SELECT CASE ( cd_type)
  340. CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points
  341. pt2d(:, 1:1-ipr2dj ) = 0.e0
  342. pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0
  343. CASE ( 'F' ) ! F-point
  344. pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0
  345. CASE ( 'I' ) ! ice U-V point
  346. pt2d(:, 1:1-ipr2dj ) = 0.e0
  347. pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0
  348. CASE ( 'J' ) ! first ice U-V point
  349. pt2d(:, 1:1-ipr2dj ) = 0.e0
  350. pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0
  351. CASE ( 'K' ) ! second ice U-V point
  352. pt2d(:, 1:1-ipr2dj ) = 0.e0
  353. pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0
  354. END SELECT
  355. !
  356. END SELECT
  357. !
  358. END SUBROUTINE lbc_nfd_2d
  359. SUBROUTINE mpp_lbc_nfd_3d( pt3dl, pt3dr, cd_type, psgn )
  360. !!----------------------------------------------------------------------
  361. !! *** routine mpp_lbc_nfd_3d ***
  362. !!
  363. !! ** Purpose : 3D lateral boundary condition : North fold treatment
  364. !! without processor exchanges.
  365. !!
  366. !! ** Method :
  367. !!
  368. !! ** Action : pt3d with updated values along the north fold
  369. !!----------------------------------------------------------------------
  370. CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points
  371. ! ! = T , U , V , F , W points
  372. REAL(wp) , INTENT(in ) :: psgn ! control of the sign change
  373. ! ! = -1. , the sign is changed if north fold boundary
  374. ! ! = 1. , the sign is kept if north fold boundary
  375. REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pt3dl ! 3D array on which the boundary condition is applied
  376. REAL(wp), DIMENSION(:,:,:), INTENT(in) :: pt3dr ! 3D array on which the boundary condition is applied
  377. !
  378. INTEGER :: ji, jk
  379. INTEGER :: ijt, iju, ijpj, ijpjm1, ijta, ijua, jia, startloop, endloop
  380. !!----------------------------------------------------------------------
  381. SELECT CASE ( jpni )
  382. CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction
  383. CASE DEFAULT ; ijpj = 4 ! several proc along the i-direction
  384. END SELECT
  385. ijpjm1 = ijpj-1
  386. !
  387. SELECT CASE ( npolj )
  388. !
  389. CASE ( 3 , 4 ) ! * North fold T-point pivot
  390. !
  391. SELECT CASE ( cd_type )
  392. CASE ( 'T' , 'W' ) ! T-, W-point
  393. IF (nimpp .ne. 1) THEN
  394. startloop = 1
  395. ELSE
  396. startloop = 2
  397. ENDIF
  398. DO jk = 1, jpk
  399. DO ji = startloop, nlci
  400. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  401. pt3dl(ji,ijpj,jk) = psgn * pt3dr(ijt,ijpj-2,jk)
  402. END DO
  403. IF(nimpp .eq. 1) THEN
  404. pt3dl(1,ijpj,jk) = psgn * pt3dl(3,ijpj-2,jk)
  405. ENDIF
  406. END DO
  407. IF(nimpp .ge. (jpiglo/2+1)) THEN
  408. startloop = 1
  409. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  410. startloop = jpiglo/2+1 - nimpp + 1
  411. ELSE
  412. startloop = nlci + 1
  413. ENDIF
  414. IF(startloop .le. nlci) THEN
  415. DO jk = 1, jpk
  416. DO ji = startloop, nlci
  417. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  418. jia = ji + nimpp - 1
  419. ijta = jpiglo - jia + 2
  420. IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN
  421. pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijta-nimpp+1,ijpjm1,jk)
  422. ELSE
  423. pt3dl(ji,ijpjm1,jk) = psgn * pt3dr(ijt,ijpjm1,jk)
  424. ENDIF
  425. END DO
  426. END DO
  427. ENDIF
  428. CASE ( 'U' ) ! U-point
  429. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  430. endloop = nlci
  431. ELSE
  432. endloop = nlci - 1
  433. ENDIF
  434. DO jk = 1, jpk
  435. DO ji = 1, endloop
  436. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  437. pt3dl(ji,ijpj,jk) = psgn * pt3dr(iju,ijpj-2,jk)
  438. END DO
  439. IF(nimpp .eq. 1) THEN
  440. pt3dl( 1 ,ijpj,jk) = psgn * pt3dl( 2 ,ijpj-2,jk)
  441. ENDIF
  442. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  443. pt3dl(nlci,ijpj,jk) = psgn * pt3dl(nlci-1,ijpj-2,jk)
  444. ENDIF
  445. END DO
  446. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  447. endloop = nlci
  448. ELSE
  449. endloop = nlci - 1
  450. ENDIF
  451. IF(nimpp .ge. (jpiglo/2)) THEN
  452. startloop = 1
  453. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN
  454. startloop = jpiglo/2 - nimpp + 1
  455. ELSE
  456. startloop = endloop + 1
  457. ENDIF
  458. IF (startloop .le. endloop) THEN
  459. DO jk = 1, jpk
  460. DO ji = startloop, endloop
  461. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  462. jia = ji + nimpp - 1
  463. ijua = jpiglo - jia + 1
  464. IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN
  465. pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijua-nimpp+1,ijpjm1,jk)
  466. ELSE
  467. pt3dl(ji,ijpjm1,jk) = psgn * pt3dr(iju,ijpjm1,jk)
  468. ENDIF
  469. END DO
  470. END DO
  471. ENDIF
  472. CASE ( 'V' ) ! V-point
  473. IF (nimpp .ne. 1) THEN
  474. startloop = 1
  475. ELSE
  476. startloop = 2
  477. ENDIF
  478. DO jk = 1, jpk
  479. DO ji = startloop, nlci
  480. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  481. pt3dl(ji,ijpj-1,jk) = psgn * pt3dr(ijt,ijpj-2,jk)
  482. pt3dl(ji,ijpj ,jk) = psgn * pt3dr(ijt,ijpj-3,jk)
  483. END DO
  484. IF(nimpp .eq. 1) THEN
  485. pt3dl(1,ijpj,jk) = psgn * pt3dl(3,ijpj-3,jk)
  486. ENDIF
  487. END DO
  488. CASE ( 'F' ) ! F-point
  489. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  490. endloop = nlci
  491. ELSE
  492. endloop = nlci - 1
  493. ENDIF
  494. DO jk = 1, jpk
  495. DO ji = 1, endloop
  496. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  497. pt3dl(ji,ijpj-1,jk) = psgn * pt3dr(iju,ijpj-2,jk)
  498. pt3dl(ji,ijpj ,jk) = psgn * pt3dr(iju,ijpj-3,jk)
  499. END DO
  500. IF(nimpp .eq. 1) THEN
  501. pt3dl( 1 ,ijpj,jk) = psgn * pt3dl( 2 ,ijpj-3,jk)
  502. ENDIF
  503. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  504. pt3dl(nlci,ijpj,jk) = psgn * pt3dl(nlci-1,ijpj-3,jk)
  505. ENDIF
  506. END DO
  507. END SELECT
  508. !
  509. CASE ( 5 , 6 ) ! * North fold F-point pivot
  510. !
  511. SELECT CASE ( cd_type )
  512. CASE ( 'T' , 'W' ) ! T-, W-point
  513. DO jk = 1, jpk
  514. DO ji = 1, nlci
  515. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  516. pt3dl(ji,ijpj,jk) = psgn * pt3dr(ijt,ijpj-1,jk)
  517. END DO
  518. END DO
  519. CASE ( 'U' ) ! U-point
  520. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  521. endloop = nlci
  522. ELSE
  523. endloop = nlci - 1
  524. ENDIF
  525. DO jk = 1, jpk
  526. DO ji = 1, endloop
  527. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  528. pt3dl(ji,ijpj,jk) = psgn * pt3dr(iju,ijpj-1,jk)
  529. END DO
  530. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  531. pt3dl(nlci,ijpj,jk) = psgn * pt3dr(1,ijpj-1,jk)
  532. ENDIF
  533. END DO
  534. CASE ( 'V' ) ! V-point
  535. DO jk = 1, jpk
  536. DO ji = 1, nlci
  537. ijt = jpiglo - ji- nimpp - nfiimpp(isendto(1),jpnj) + 3
  538. pt3dl(ji,ijpj,jk) = psgn * pt3dr(ijt,ijpj-2,jk)
  539. END DO
  540. END DO
  541. IF(nimpp .ge. (jpiglo/2+1)) THEN
  542. startloop = 1
  543. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  544. startloop = jpiglo/2+1 - nimpp + 1
  545. ELSE
  546. startloop = nlci + 1
  547. ENDIF
  548. IF(startloop .le. nlci) THEN
  549. DO jk = 1, jpk
  550. DO ji = startloop, nlci
  551. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  552. pt3dl(ji,ijpjm1,jk) = psgn * pt3dr(ijt,ijpjm1,jk)
  553. END DO
  554. END DO
  555. ENDIF
  556. CASE ( 'F' ) ! F-point
  557. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  558. endloop = nlci
  559. ELSE
  560. endloop = nlci - 1
  561. ENDIF
  562. DO jk = 1, jpk
  563. DO ji = 1, endloop
  564. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  565. pt3dl(ji,ijpj ,jk) = psgn * pt3dr(iju,ijpj-2,jk)
  566. END DO
  567. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  568. pt3dl(nlci,ijpj,jk) = psgn * pt3dr(1,ijpj-2,jk)
  569. ENDIF
  570. END DO
  571. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  572. endloop = nlci
  573. ELSE
  574. endloop = nlci - 1
  575. ENDIF
  576. IF(nimpp .ge. (jpiglo/2+1)) THEN
  577. startloop = 1
  578. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  579. startloop = jpiglo/2+1 - nimpp + 1
  580. ELSE
  581. startloop = endloop + 1
  582. ENDIF
  583. IF (startloop .le. endloop) THEN
  584. DO jk = 1, jpk
  585. DO ji = startloop, endloop
  586. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  587. pt3dl(ji,ijpjm1,jk) = psgn * pt3dr(iju,ijpjm1,jk)
  588. END DO
  589. END DO
  590. ENDIF
  591. END SELECT
  592. CASE DEFAULT ! * closed : the code probably never go through
  593. !
  594. SELECT CASE ( cd_type)
  595. CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points
  596. pt3dl(:, 1 ,jk) = 0.e0
  597. pt3dl(:,ijpj,jk) = 0.e0
  598. CASE ( 'F' ) ! F-point
  599. pt3dl(:,ijpj,jk) = 0.e0
  600. END SELECT
  601. !
  602. END SELECT ! npolj
  603. !
  604. !
  605. END SUBROUTINE mpp_lbc_nfd_3d
  606. SUBROUTINE mpp_lbc_nfd_2d( pt2dl, pt2dr, cd_type, psgn )
  607. !!----------------------------------------------------------------------
  608. !! *** routine mpp_lbc_nfd_2d ***
  609. !!
  610. !! ** Purpose : 2D lateral boundary condition : North fold treatment
  611. !! without processor exchanges.
  612. !!
  613. !! ** Method :
  614. !!
  615. !! ** Action : pt2d with updated values along the north fold
  616. !!----------------------------------------------------------------------
  617. CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points
  618. ! ! = T , U , V , F , W points
  619. REAL(wp) , INTENT(in ) :: psgn ! control of the sign change
  620. ! ! = -1. , the sign is changed if north fold boundary
  621. ! ! = 1. , the sign is kept if north fold boundary
  622. REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt2dl ! 2D array on which the boundary condition is applied
  623. REAL(wp), DIMENSION(:,:), INTENT(in) :: pt2dr ! 2D array on which the boundary condition is applied
  624. !
  625. INTEGER :: ji
  626. INTEGER :: ijt, iju, ijpj, ijpjm1, ijta, ijua, jia, startloop, endloop
  627. !!----------------------------------------------------------------------
  628. SELECT CASE ( jpni )
  629. CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction
  630. CASE DEFAULT ; ijpj = 4 ! several proc along the i-direction
  631. END SELECT
  632. !
  633. ijpjm1 = ijpj-1
  634. SELECT CASE ( npolj )
  635. !
  636. CASE ( 3, 4 ) ! * North fold T-point pivot
  637. !
  638. SELECT CASE ( cd_type )
  639. !
  640. CASE ( 'T' , 'W' ) ! T- , W-points
  641. IF (nimpp .ne. 1) THEN
  642. startloop = 1
  643. ELSE
  644. startloop = 2
  645. ENDIF
  646. DO ji = startloop, nlci
  647. ijt=jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  648. pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1)
  649. END DO
  650. IF (nimpp .eq. 1) THEN
  651. pt2dl(1,ijpj) = psgn * pt2dl(3,ijpj-2)
  652. ENDIF
  653. IF(nimpp .ge. (jpiglo/2+1)) THEN
  654. startloop = 1
  655. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  656. startloop = jpiglo/2+1 - nimpp + 1
  657. ELSE
  658. startloop = nlci + 1
  659. ENDIF
  660. DO ji = startloop, nlci
  661. ijt=jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  662. jia = ji + nimpp - 1
  663. ijta = jpiglo - jia + 2
  664. IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN
  665. pt2dl(ji,ijpjm1) = psgn * pt2dl(ijta-nimpp+1,ijpjm1)
  666. ELSE
  667. pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1)
  668. ENDIF
  669. END DO
  670. CASE ( 'U' ) ! U-point
  671. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  672. endloop = nlci
  673. ELSE
  674. endloop = nlci - 1
  675. ENDIF
  676. DO ji = 1, endloop
  677. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  678. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-1)
  679. END DO
  680. IF (nimpp .eq. 1) THEN
  681. pt2dl( 1 ,ijpj ) = psgn * pt2dl( 2 ,ijpj-2)
  682. pt2dl(1 ,ijpj-1) = psgn * pt2dr(jpiglo - nfiimpp(isendto(1), jpnj) + 1, ijpj-1)
  683. ENDIF
  684. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  685. pt2dl(nlci,ijpj ) = psgn * pt2dl(nlci-1,ijpj-2)
  686. ENDIF
  687. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  688. endloop = nlci
  689. ELSE
  690. endloop = nlci - 1
  691. ENDIF
  692. IF(nimpp .ge. (jpiglo/2)) THEN
  693. startloop = 1
  694. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN
  695. startloop = jpiglo/2 - nimpp + 1
  696. ELSE
  697. startloop = endloop + 1
  698. ENDIF
  699. DO ji = startloop, endloop
  700. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  701. jia = ji + nimpp - 1
  702. ijua = jpiglo - jia + 1
  703. IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN
  704. pt2dl(ji,ijpjm1) = psgn * pt2dl(ijua-nimpp+1,ijpjm1)
  705. ELSE
  706. pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1)
  707. ENDIF
  708. END DO
  709. CASE ( 'V' ) ! V-point
  710. IF (nimpp .ne. 1) THEN
  711. startloop = 1
  712. ELSE
  713. startloop = 2
  714. ENDIF
  715. DO ji = startloop, nlci
  716. ijt=jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  717. pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1-1)
  718. pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-2)
  719. END DO
  720. IF (nimpp .eq. 1) THEN
  721. pt2dl( 1 ,ijpj) = psgn * pt2dl( 3 ,ijpj-3)
  722. ENDIF
  723. CASE ( 'F' ) ! F-point
  724. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  725. endloop = nlci
  726. ELSE
  727. endloop = nlci - 1
  728. ENDIF
  729. DO ji = 1, endloop
  730. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  731. pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1-1)
  732. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-2)
  733. END DO
  734. IF (nimpp .eq. 1) THEN
  735. pt2dl( 1 ,ijpj) = psgn * pt2dl( 2 ,ijpj-3)
  736. pt2dl( 1 ,ijpj-1) = psgn * pt2dl( 2 ,ijpj-2)
  737. ENDIF
  738. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  739. pt2dl(nlci,ijpj) = psgn * pt2dl(nlci-1,ijpj-3)
  740. pt2dl(nlci,ijpj-1) = psgn * pt2dl(nlci-1,ijpj-2)
  741. ENDIF
  742. CASE ( 'I' ) ! ice U-V point (I-point)
  743. IF (nimpp .ne. 1) THEN
  744. startloop = 1
  745. ELSE
  746. startloop = 3
  747. pt2dl(2,ijpj) = psgn * pt2dr(3,ijpjm1)
  748. ENDIF
  749. DO ji = startloop, nlci
  750. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5
  751. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1)
  752. END DO
  753. CASE ( 'J' ) ! first ice U-V point
  754. IF (nimpp .ne. 1) THEN
  755. startloop = 1
  756. ELSE
  757. startloop = 3
  758. pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1)
  759. ENDIF
  760. DO ji = startloop, nlci
  761. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5
  762. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1)
  763. END DO
  764. CASE ( 'K' ) ! second ice U-V point
  765. IF (nimpp .ne. 1) THEN
  766. startloop = 1
  767. ELSE
  768. startloop = 3
  769. pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1)
  770. ENDIF
  771. DO ji = startloop, nlci
  772. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5
  773. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1)
  774. END DO
  775. END SELECT
  776. !
  777. CASE ( 5, 6 ) ! * North fold F-point pivot
  778. !
  779. SELECT CASE ( cd_type )
  780. CASE ( 'T' , 'W' ) ! T-, W-point
  781. DO ji = 1, nlci
  782. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  783. pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1)
  784. END DO
  785. CASE ( 'U' ) ! U-point
  786. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  787. endloop = nlci
  788. ELSE
  789. endloop = nlci - 1
  790. ENDIF
  791. DO ji = 1, endloop
  792. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  793. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1)
  794. END DO
  795. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  796. pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-1)
  797. ENDIF
  798. CASE ( 'V' ) ! V-point
  799. DO ji = 1, nlci
  800. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  801. pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1)
  802. END DO
  803. IF(nimpp .ge. (jpiglo/2+1)) THEN
  804. startloop = 1
  805. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  806. startloop = jpiglo/2+1 - nimpp + 1
  807. ELSE
  808. startloop = nlci + 1
  809. ENDIF
  810. DO ji = startloop, nlci
  811. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3
  812. pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1)
  813. END DO
  814. CASE ( 'F' ) ! F-point
  815. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  816. endloop = nlci
  817. ELSE
  818. endloop = nlci - 1
  819. ENDIF
  820. DO ji = 1, endloop
  821. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  822. pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-1)
  823. END DO
  824. IF((nimpp + nlci - 1) .eq. jpiglo) THEN
  825. pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-2)
  826. ENDIF
  827. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  828. endloop = nlci
  829. ELSE
  830. endloop = nlci - 1
  831. ENDIF
  832. IF(nimpp .ge. (jpiglo/2+1)) THEN
  833. startloop = 1
  834. ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN
  835. startloop = jpiglo/2+1 - nimpp + 1
  836. ELSE
  837. startloop = endloop + 1
  838. ENDIF
  839. DO ji = startloop, endloop
  840. iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2
  841. pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1)
  842. END DO
  843. CASE ( 'I' ) ! ice U-V point (I-point)
  844. IF (nimpp .ne. 1) THEN
  845. startloop = 1
  846. ELSE
  847. startloop = 2
  848. ENDIF
  849. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  850. endloop = nlci
  851. ELSE
  852. endloop = nlci - 1
  853. ENDIF
  854. DO ji = startloop , endloop
  855. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  856. pt2dl(ji,ijpj)= 0.5 * (pt2dl(ji,ijpjm1) + psgn * pt2dr(ijt,ijpjm1))
  857. END DO
  858. CASE ( 'J' ) ! first ice U-V point
  859. IF (nimpp .ne. 1) THEN
  860. startloop = 1
  861. ELSE
  862. startloop = 2
  863. ENDIF
  864. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  865. endloop = nlci
  866. ELSE
  867. endloop = nlci - 1
  868. ENDIF
  869. DO ji = startloop , endloop
  870. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  871. pt2dl(ji,ijpj) = pt2dl(ji,ijpjm1)
  872. END DO
  873. CASE ( 'K' ) ! second ice U-V point
  874. IF (nimpp .ne. 1) THEN
  875. startloop = 1
  876. ELSE
  877. startloop = 2
  878. ENDIF
  879. IF ((nimpp + nlci - 1) .ne. jpiglo) THEN
  880. endloop = nlci
  881. ELSE
  882. endloop = nlci - 1
  883. ENDIF
  884. DO ji = startloop, endloop
  885. ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4
  886. pt2dl(ji,ijpj) = pt2dr(ijt,ijpjm1)
  887. END DO
  888. END SELECT
  889. !
  890. CASE DEFAULT ! * closed : the code probably never go through
  891. !
  892. SELECT CASE ( cd_type)
  893. CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points
  894. pt2dl(:, 1 ) = 0.e0
  895. pt2dl(:,ijpj) = 0.e0
  896. CASE ( 'F' ) ! F-point
  897. pt2dl(:,ijpj) = 0.e0
  898. CASE ( 'I' ) ! ice U-V point
  899. pt2dl(:, 1 ) = 0.e0
  900. pt2dl(:,ijpj) = 0.e0
  901. CASE ( 'J' ) ! first ice U-V point
  902. pt2dl(:, 1 ) = 0.e0
  903. pt2dl(:,ijpj) = 0.e0
  904. CASE ( 'K' ) ! second ice U-V point
  905. pt2dl(:, 1 ) = 0.e0
  906. pt2dl(:,ijpj) = 0.e0
  907. END SELECT
  908. !
  909. END SELECT
  910. !
  911. END SUBROUTINE mpp_lbc_nfd_2d
  912. END MODULE lbcnfd