PageRenderTime 40ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/external/RSL_LITE/f_xpose.F90

http://github.com/jbeezley/wrf-fire
FORTRAN Modern | 363 lines | 330 code | 21 blank | 12 comment | 28 complexity | 30c38062be8fd847afcb5bac7d0692b2 MD5 | raw file
Possible License(s): AGPL-1.0
  1. subroutine trans_z2x ( np, comm, dir, r_wordsize, i_wordsize, memorder, &
  2. a, &
  3. sd1, ed1, sd2, ed2, sd3, ed3, &
  4. sp1, ep1, sp2, ep2, sp3, ep3, &
  5. sm1, em1, sm2, em2, sm3, em3, &
  6. ax, &
  7. sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
  8. sm1x, em1x, sm2x, em2x, sm3x, em3x )
  9. USE duplicate_of_driver_constants
  10. implicit none
  11. integer, intent(in) :: sd1, ed1, sd2, ed2, sd3, ed3, &
  12. sp1, ep1, sp2, ep2, sp3, ep3, &
  13. sm1, em1, sm2, em2, sm3, em3, &
  14. sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
  15. sm1x, em1x, sm2x, em2x, sm3x, em3x
  16. integer, intent(in) :: np, comm, r_wordsize, i_wordsize
  17. integer, intent(in) :: dir ! 1 is a->ax, otherwise ax->a
  18. integer, intent(in) :: memorder
  19. integer, dimension((ep1-sp1+1)*(ep2-sp2+1)*(ep3-sp3+1)*max(1,(r_wordsize/i_wordsize))) :: a
  20. integer, dimension((ep1x-sp1x+1)*(ep2x-ep2x+1)*(ep3x-sp3x+1)*max(1,(r_wordsize/i_wordsize))) :: ax
  21. #ifndef STUBMPI
  22. include 'mpif.h'
  23. !local
  24. integer :: ids, ide, jds, jde, kds, kde, &
  25. ips, ipe, jps, jpe, kps, kpe, &
  26. ims, ime, jms, jme, kms, kme, &
  27. ipsx, ipex, jpsx, jpex, kpsx, kpex, &
  28. imsx, imex, jmsx, jmex, kmsx, kmex
  29. integer, dimension(0:(ep1-sp1+1)*(ep2-sp2+1)*(ep3-sp3+1)*max(1,(r_wordsize/i_wordsize))) :: zbuf
  30. integer, dimension(0:(ep1x-sp1x+1)*(ep2x-sp2x+1)*(ep3x-sp3x+1)*max(1,(r_wordsize/i_wordsize))) :: xbuf
  31. integer pencil(4), allpencils(4,np)
  32. integer sendcnts(np), sdispls(np), recvcnts(np), rdispls(np)
  33. integer allsendcnts(np+2,np), is(np), ie(np), ks(np),ke(np)
  34. integer sendcurs(np), recvcurs(np)
  35. integer i,j,k,p,sc,sp,rp,yp,zp,curs,zbufsz,cells,nkcells,ivectype,ierr
  36. SELECT CASE ( memorder )
  37. CASE ( DATA_ORDER_XYZ )
  38. ids = sd1 ; ide = ed1 ; jds = sd2 ; jde = ed2 ; kds = sd3 ; kde = ed3
  39. ips = sp1 ; ipe = ep1 ; jps = sp2 ; jpe = ep2 ; kps = sp3 ; kpe = ep3
  40. ims = sm1 ; ime = em1 ; jms = sm2 ; jme = em2 ; kms = sm3 ; kme = em3
  41. ipsx = sp1x ; ipex = ep1x ; jpsx = sp2x ; jpex = ep2x ; kpsx = sp3x ; kpex = ep3x
  42. imsx = sm1x ; imex = em1x ; jmsx = sm2x ; jmex = em2x ; kmsx = sm3x ; kmex = em3x
  43. CASE ( DATA_ORDER_YXZ )
  44. ids = sd2 ; ide = ed2 ; jds = sd1 ; jde = ed1 ; kds = sd3 ; kde = ed3
  45. ips = sp2 ; ipe = ep2 ; jps = sp1 ; jpe = ep1 ; kps = sp3 ; kpe = ep3
  46. ims = sm2 ; ime = em2 ; jms = sm1 ; jme = em1 ; kms = sm3 ; kme = em3
  47. ipsx = sp2x ; ipex = ep2x ; jpsx = sp1x ; jpex = ep1x ; kpsx = sp3x ; kpex = ep3x
  48. imsx = sm2x ; imex = em2x ; jmsx = sm1x ; jmex = em1x ; kmsx = sm3x ; kmex = em3x
  49. CASE ( DATA_ORDER_XZY )
  50. ids = sd1 ; ide = ed1 ; jds = sd3 ; jde = ed3 ; kds = sd2 ; kde = ed2
  51. ips = sp1 ; ipe = ep1 ; jps = sp3 ; jpe = ep3 ; kps = sp2 ; kpe = ep2
  52. ims = sm1 ; ime = em1 ; jms = sm3 ; jme = em3 ; kms = sm2 ; kme = em2
  53. ipsx = sp1x ; ipex = ep1x ; jpsx = sp3x ; jpex = ep3x ; kpsx = sp2x ; kpex = ep2x
  54. imsx = sm1x ; imex = em1x ; jmsx = sm3x ; jmex = em3x ; kmsx = sm2x ; kmex = em2x
  55. CASE ( DATA_ORDER_YZX )
  56. ids = sd3 ; ide = ed3 ; jds = sd1 ; jde = ed1 ; kds = sd2 ; kde = ed2
  57. ips = sp3 ; ipe = ep3 ; jps = sp1 ; jpe = ep1 ; kps = sp2 ; kpe = ep2
  58. ims = sm3 ; ime = em3 ; jms = sm1 ; jme = em1 ; kms = sm2 ; kme = em2
  59. ipsx = sp3x ; ipex = ep3x ; jpsx = sp1x ; jpex = ep1x ; kpsx = sp2x ; kpex = ep2x
  60. imsx = sm3x ; imex = em3x ; jmsx = sm1x ; jmex = em1x ; kmsx = sm2x ; kmex = em2x
  61. CASE ( DATA_ORDER_ZXY )
  62. ids = sd2 ; ide = ed2 ; jds = sd3 ; jde = ed3 ; kds = sd1 ; kde = ed1
  63. ips = sp2 ; ipe = ep2 ; jps = sp3 ; jpe = ep3 ; kps = sp1 ; kpe = ep1
  64. ims = sm2 ; ime = em2 ; jms = sm3 ; jme = em3 ; kms = sm1 ; kme = em1
  65. ipsx = sp2x ; ipex = ep2x ; jpsx = sp3x ; jpex = ep3x ; kpsx = sp1x ; kpex = ep1x
  66. imsx = sm2x ; imex = em2x ; jmsx = sm3x ; jmex = em3x ; kmsx = sm1x ; kmex = em1x
  67. CASE ( DATA_ORDER_ZYX )
  68. ids = sd3 ; ide = ed3 ; jds = sd2 ; jde = ed2 ; kds = sd1 ; kde = ed1
  69. ips = sp3 ; ipe = ep3 ; jps = sp2 ; jpe = ep2 ; kps = sp1 ; kpe = ep1
  70. ims = sm3 ; ime = em3 ; jms = sm2 ; jme = em2 ; kms = sm1 ; kme = em1
  71. ipsx = sp3x ; ipex = ep3x ; jpsx = sp2x ; jpex = ep2x ; kpsx = sp1x ; kpex = ep1x
  72. imsx = sm3x ; imex = em3x ; jmsx = sm2x ; jmex = em2x ; kmsx = sm1x ; kmex = em1x
  73. END SELECT
  74. sendcnts = 0 ; recvcnts = 0
  75. xbuf = 0
  76. zbuf = 0
  77. ! work out send/recv sizes to each processor in X dimension
  78. pencil(1) = ips
  79. pencil(2) = ipe
  80. pencil(3) = kpsx
  81. pencil(4) = kpex
  82. call mpi_allgather( pencil, 4, MPI_INTEGER, allpencils, 4, MPI_INTEGER, comm, ierr )
  83. do p = 1, np
  84. is(p) = allpencils(1,p)
  85. ie(p) = allpencils(2,p)
  86. ks(p) = allpencils(3,p)
  87. ke(p) = allpencils(4,p)
  88. enddo
  89. ! pack send buffer
  90. sendcurs = 0
  91. sdispls = 0
  92. sc = 0
  93. do p = 1, np
  94. if ( r_wordsize .eq. i_wordsize ) then
  95. if ( dir .eq. 1 ) then
  96. call f_pack_int ( a, zbuf(sc), memorder, &
  97. & jps, jpe, ks(p), ke(p), ips, ipe, &
  98. & jms, jme, kms, kme, ims, ime, sendcurs(p) )
  99. else
  100. call f_pack_int ( ax, xbuf(sc), memorder, &
  101. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  102. & jmsx, jmex, kmsx, kmex, imsx, imex, sendcurs(p) )
  103. endif
  104. else if ( r_wordsize .eq. 8 ) THEN
  105. if ( dir .eq. 1 ) then
  106. call f_pack_lint ( a, zbuf(sc), memorder, &
  107. & jps, jpe, ks(p), ke(p), ips, ipe, &
  108. & jms, jme, kms, kme, ims, ime, sendcurs(p) )
  109. else
  110. call f_pack_lint ( ax, xbuf(sc), memorder, &
  111. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  112. & jmsx, jmex, kmsx, kmex, imsx, imex, sendcurs(p) )
  113. endif
  114. sendcurs(p) = sendcurs(p) * max(1,(r_wordsize/i_wordsize))
  115. else
  116. write(0,*)'RSL_LITE internal error: type size mismatch ',__FILE__,__LINE__
  117. call mpi_abort(ierr)
  118. endif
  119. sc = sc + sendcurs(p)
  120. sendcnts(p) = sendcurs(p)
  121. if ( p .GT. 1 ) sdispls(p) = sdispls(p-1) + sendcnts(p-1)
  122. enddo
  123. ! work out receive counts and displs
  124. rdispls = 0
  125. recvcnts = 0
  126. do p = 1, np
  127. if ( dir .eq. 1 ) then
  128. recvcnts(p) = (ie(p)-is(p)+1)*(kpex-kpsx+1)*(jpex-jpsx+1) * max(1,(r_wordsize/i_wordsize))
  129. else
  130. recvcnts(p) = (ke(p)-ks(p)+1)*(ipe-ips+1)*(jpe-jps+1) * max(1,(r_wordsize/i_wordsize))
  131. endif
  132. if ( p .GT. 1 ) rdispls(p) = rdispls(p-1) + recvcnts(p-1)
  133. enddo
  134. ! do the transpose
  135. if ( dir .eq. 1 ) then
  136. call mpi_alltoallv(zbuf, sendcnts, sdispls, MPI_INTEGER, &
  137. xbuf, recvcnts, rdispls, MPI_INTEGER, comm, ierr )
  138. else
  139. call mpi_alltoallv(xbuf, sendcnts, sdispls, MPI_INTEGER, &
  140. zbuf, recvcnts, rdispls, MPI_INTEGER, comm, ierr )
  141. endif
  142. ! unpack
  143. do p = 1, np
  144. if ( r_wordsize .eq. i_wordsize ) then
  145. if ( dir .eq. 1 ) then
  146. call f_unpack_int ( xbuf(rdispls(p)), ax, memorder, &
  147. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  148. & jmsx, jmex, kmsx, kmex, imsx, imex, curs )
  149. else
  150. call f_unpack_int ( zbuf(rdispls(p)), a, memorder, &
  151. & jps, jpe, ks(p), ke(p), ips, ipe, &
  152. & jms, jme, kms, kme, ims, ime, curs )
  153. endif
  154. else if ( r_wordsize .eq. 8 ) THEN
  155. if ( dir .eq. 1 ) then
  156. call f_unpack_lint ( xbuf(rdispls(p)), ax, memorder, &
  157. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  158. & jmsx, jmex, kmsx, kmex, imsx, imex, curs )
  159. else
  160. call f_unpack_lint ( zbuf(rdispls(p)), a, memorder, &
  161. & jps, jpe, ks(p), ke(p), ips, ipe, &
  162. & jms, jme, kms, kme, ims, ime, curs )
  163. endif
  164. else
  165. write(0,*)'RSL_LITE internal error: type size mismatch ',__FILE__,__LINE__
  166. call mpi_abort(ierr)
  167. endif
  168. enddo
  169. #endif
  170. return
  171. end subroutine trans_z2x
  172. subroutine trans_x2y ( np, comm, dir, r_wordsize, i_wordsize, memorder, &
  173. ax, &
  174. sd1, ed1, sd2, ed2, sd3, ed3, &
  175. sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
  176. sm1x, em1x, sm2x, em2x, sm3x, em3x, &
  177. ay, &
  178. sp1y, ep1y, sp2y, ep2y, sp3y, ep3y, &
  179. sm1y, em1y, sm2y, em2y, sm3y, em3y )
  180. USE duplicate_of_driver_constants
  181. implicit none
  182. integer, intent(in) :: memorder
  183. integer, intent(in) :: sd1, ed1, sd2, ed2, sd3, ed3, &
  184. sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
  185. sm1x, em1x, sm2x, em2x, sm3x, em3x, &
  186. sp1y, ep1y, sp2y, ep2y, sp3y, ep3y, &
  187. sm1y, em1y, sm2y, em2y, sm3y, em3y
  188. integer, intent(in) :: np, comm, r_wordsize, i_wordsize
  189. integer, intent(in) :: dir ! 1 is a->ax, otherwise ax->a
  190. integer, dimension((ep1x-sp1x+1)*(ep2x-ep2x+1)*(ep3x-sp3x+1)*max(1,(r_wordsize/i_wordsize))) :: ax
  191. integer, dimension((ep1y-sp1y+1)*(ep2y-sp2y+1)*(ep3y-sp3y+1)*max(1,(r_wordsize/i_wordsize))) :: ay
  192. #ifndef STUBMPI
  193. include 'mpif.h'
  194. integer, dimension(0:(ep1x-sp1x+1)*(ep2x-sp2x+1)*(ep3x-sp3x+1)*max(1,(r_wordsize/i_wordsize))) :: xbuf
  195. integer, dimension(0:(ep1y-sp1y+1)*(ep2y-sp2y+1)*(ep3y-sp3y+1)*max(1,(r_wordsize/i_wordsize))) :: ybuf
  196. !local
  197. integer ids, ide, jds, jde, kds, kde, &
  198. ipsx, ipex, jpsx, jpex, kpsx, kpex, &
  199. imsx, imex, jmsx, jmex, kmsx, kmex, &
  200. ipsy, ipey, jpsy, jpey, kpsy, kpey, &
  201. imsy, imey, jmsy, jmey, kmsy, kmey
  202. integer pencil(4), allpencils(4,np)
  203. integer sendcnts(np), sdispls(np), recvcnts(np), rdispls(np)
  204. integer allsendcnts(np+2,np), is(np), ie(np), js(np), je(np)
  205. integer sendcurs(np), recvcurs(np)
  206. integer i,j,k,p,sc,sp,rp,yp,zp,curs,xbufsz,cells,nkcells,ivectype,ierr
  207. SELECT CASE ( memorder )
  208. CASE ( DATA_ORDER_XYZ )
  209. ids = sd1 ; ide = ed1 ; jds = sd2 ; jde = ed2 ; kds = sd3 ; kde = ed3
  210. ipsx = sp1x ; ipex = ep1x ; jpsx = sp2x ; jpex = ep2x ; kpsx = sp3x ; kpex = ep3x
  211. imsx = sm1x ; imex = em1x ; jmsx = sm2x ; jmex = em2x ; kmsx = sm3x ; kmex = em3x
  212. ipsy = sp1y ; ipey = ep1y ; jpsy = sp2y ; jpey = ep2y ; kpsy = sp3y ; kpey = ep3y
  213. imsy = sm1y ; imey = em1y ; jmsy = sm2y ; jmey = em2y ; kmsy = sm3y ; kmey = em3y
  214. CASE ( DATA_ORDER_YXZ )
  215. ids = sd2 ; ide = ed2 ; jds = sd1 ; jde = ed1 ; kds = sd3 ; kde = ed3
  216. ipsx = sp2x ; ipex = ep2x ; jpsx = sp1x ; jpex = ep1x ; kpsx = sp3x ; kpex = ep3x
  217. imsx = sm2x ; imex = em2x ; jmsx = sm1x ; jmex = em1x ; kmsx = sm3x ; kmex = em3x
  218. ipsy = sp2y ; ipey = ep2y ; jpsy = sp1y ; jpey = ep1y ; kpsy = sp3y ; kpey = ep3y
  219. imsy = sm2y ; imey = em2y ; jmsy = sm1y ; jmey = em1y ; kmsy = sm3y ; kmey = em3y
  220. CASE ( DATA_ORDER_XZY )
  221. ids = sd1 ; ide = ed1 ; jds = sd3 ; jde = ed3 ; kds = sd2 ; kde = ed2
  222. ipsx = sp1x ; ipex = ep1x ; jpsx = sp3x ; jpex = ep3x ; kpsx = sp2x ; kpex = ep2x
  223. imsx = sm1x ; imex = em1x ; jmsx = sm3x ; jmex = em3x ; kmsx = sm2x ; kmex = em2x
  224. ipsy = sp1y ; ipey = ep1y ; jpsy = sp3y ; jpey = ep3y ; kpsy = sp2y ; kpey = ep2y
  225. imsy = sm1y ; imey = em1y ; jmsy = sm3y ; jmey = em3y ; kmsy = sm2y ; kmey = em2y
  226. CASE ( DATA_ORDER_YZX )
  227. ids = sd3 ; ide = ed3 ; jds = sd1 ; jde = ed1 ; kds = sd2 ; kde = ed2
  228. ipsx = sp3x ; ipex = ep3x ; jpsx = sp1x ; jpex = ep1x ; kpsx = sp2x ; kpex = ep2x
  229. imsx = sm3x ; imex = em3x ; jmsx = sm1x ; jmex = em1x ; kmsx = sm2x ; kmex = em2x
  230. ipsy = sp3y ; ipey = ep3y ; jpsy = sp1y ; jpey = ep1y ; kpsy = sp2y ; kpey = ep2y
  231. imsy = sm3y ; imey = em3y ; jmsy = sm1y ; jmey = em1y ; kmsy = sm2y ; kmey = em2y
  232. CASE ( DATA_ORDER_ZXY )
  233. ids = sd2 ; ide = ed2 ; jds = sd3 ; jde = ed3 ; kds = sd1 ; kde = ed1
  234. ipsx = sp2x ; ipex = ep2x ; jpsx = sp3x ; jpex = ep3x ; kpsx = sp1x ; kpex = ep1x
  235. imsx = sm2x ; imex = em2x ; jmsx = sm3x ; jmex = em3x ; kmsx = sm1x ; kmex = em1x
  236. ipsy = sp2y ; ipey = ep2y ; jpsy = sp3y ; jpey = ep3y ; kpsy = sp1y ; kpey = ep1y
  237. imsy = sm2y ; imey = em2y ; jmsy = sm3y ; jmey = em3y ; kmsy = sm1y ; kmey = em1y
  238. CASE ( DATA_ORDER_ZYX )
  239. ids = sd3 ; ide = ed3 ; jds = sd2 ; jde = ed2 ; kds = sd1 ; kde = ed1
  240. ipsx = sp3x ; ipex = ep3x ; jpsx = sp2x ; jpex = ep2x ; kpsx = sp1x ; kpex = ep1x
  241. imsx = sm3x ; imex = em3x ; jmsx = sm2x ; jmex = em2x ; kmsx = sm1x ; kmex = em1x
  242. ipsy = sp3y ; ipey = ep3y ; jpsy = sp2y ; jpey = ep2y ; kpsy = sp1y ; kpey = ep1y
  243. imsy = sm3y ; imey = em3y ; jmsy = sm2y ; jmey = em2y ; kmsy = sm1y ; kmey = em1y
  244. END SELECT
  245. sendcnts = 0 ; recvcnts = 0
  246. xbuf = 0
  247. ybuf = 0
  248. ! work out send/recv sizes to each processor in X dimension
  249. pencil(1) = jpsx
  250. pencil(2) = jpex
  251. pencil(3) = ipsy
  252. pencil(4) = ipey
  253. call mpi_allgather( pencil, 4, MPI_INTEGER, allpencils, 4, MPI_INTEGER, comm, ierr )
  254. do p = 1, np
  255. js(p) = allpencils(1,p)
  256. je(p) = allpencils(2,p)
  257. is(p) = allpencils(3,p)
  258. ie(p) = allpencils(4,p)
  259. enddo
  260. ! pack send buffer
  261. sendcurs = 0
  262. sdispls = 0
  263. sc = 0
  264. do p = 1, np
  265. if ( r_wordsize .eq. i_wordsize ) then
  266. if ( dir .eq. 1 ) then
  267. call f_pack_int ( ax, xbuf(sc), memorder, &
  268. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  269. & jmsx, jmex, kmsx, kmex, imsx, imex, sendcurs(p) )
  270. else
  271. call f_pack_int ( ay, ybuf(sc), memorder, &
  272. & js(p), je(p), kpsy, kpey, ipsy, ipey, &
  273. & jmsy, jmey, kmsy, kmey, imsy, imey, sendcurs(p) )
  274. endif
  275. else if ( r_wordsize .eq. 8 ) THEN
  276. if ( dir .eq. 1 ) then
  277. call f_pack_lint ( ax, xbuf(sc), memorder, &
  278. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  279. & jmsx, jmex, kmsx, kmex, imsx, imex, sendcurs(p) )
  280. else
  281. call f_pack_lint ( ay, ybuf(sc), memorder, &
  282. & js(p), je(p), kpsy, kpey, ipsy, ipey, &
  283. & jmsy, jmey, kmsy, kmey, imsy, imey, sendcurs(p) )
  284. endif
  285. sendcurs(p) = sendcurs(p) * max(1,(r_wordsize/i_wordsize))
  286. else
  287. write(0,*)'RSL_LITE internal error: type size mismatch ',__FILE__,__LINE__
  288. call mpi_abort(ierr)
  289. endif
  290. sc = sc + sendcurs(p)
  291. sendcnts(p) = sendcurs(p)
  292. if ( p .GT. 1 ) sdispls(p) = sdispls(p-1) + sendcnts(p-1)
  293. enddo
  294. ! work out receive counts and displs
  295. rdispls = 0
  296. recvcnts = 0
  297. do p = 1, np
  298. if ( dir .eq. 1 ) then
  299. recvcnts(p) = (je(p)-js(p)+1)*(kpey-kpsy+1)*(ipey-ipsy+1) * max(1,(r_wordsize/i_wordsize))
  300. else
  301. recvcnts(p) = (ie(p)-is(p)+1)*(kpex-kpsx+1)*(jpex-jpsx+1) * max(1,(r_wordsize/i_wordsize))
  302. endif
  303. if ( p .GT. 1 ) rdispls(p) = rdispls(p-1) + recvcnts(p-1)
  304. enddo
  305. ! do the transpose
  306. if ( dir .eq. 1 ) then
  307. call mpi_alltoallv(xbuf, sendcnts, sdispls, MPI_INTEGER, &
  308. ybuf, recvcnts, rdispls, MPI_INTEGER, comm, ierr )
  309. else
  310. call mpi_alltoallv(ybuf, sendcnts, sdispls, MPI_INTEGER, &
  311. xbuf, recvcnts, rdispls, MPI_INTEGER, comm, ierr )
  312. endif
  313. ! unpack
  314. do p = 1, np
  315. if ( r_wordsize .eq. i_wordsize ) then
  316. if ( dir .eq. 1 ) then
  317. call f_unpack_int ( ybuf(rdispls(p)), ay, memorder, &
  318. & js(p), je(p), kpsy, kpey, ipsy, ipey, &
  319. & jmsy, jmey, kmsy, kmey, imsy, imey, curs )
  320. else
  321. call f_unpack_int ( xbuf(rdispls(p)), ax, memorder, &
  322. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  323. & jmsx, jmex, kmsx, kmex, imsx, imex, curs )
  324. endif
  325. else if ( r_wordsize .eq. 8 ) THEN
  326. if ( dir .eq. 1 ) then
  327. call f_unpack_lint ( ybuf(rdispls(p)), ay, memorder, &
  328. & js(p), je(p), kpsy, kpey, ipsy, ipey, &
  329. & jmsy, jmey, kmsy, kmey, imsy, imey, curs )
  330. else
  331. call f_unpack_lint ( xbuf(rdispls(p)), ax, memorder, &
  332. & jpsx, jpex, kpsx, kpex, is(p), ie(p), &
  333. & jmsx, jmex, kmsx, kmex, imsx, imex, curs )
  334. endif
  335. else
  336. write(0,*)'RSL_LITE internal error: type size mismatch ',__FILE__,__LINE__
  337. call mpi_abort(ierr)
  338. endif
  339. enddo
  340. #endif
  341. return
  342. end subroutine trans_x2y