PageRenderTime 80ms CodeModel.GetById 38ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/share/interp_fcn.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 4745 lines | 2932 code | 628 blank | 1185 comment | 18 complexity | dc16ac86532aa48d91fa387825e5a956 MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. !WRF:MEDIATION_LAYER:INTERPOLATIONFUNCTION
  2. !
  3. #if (DA_CORE != 1)
  4. #define MM5_SINT
  5. #endif
  6. !#define DUMBCOPY
  7. ! Note, NMM-specific routines moved to end. 20080612. JM
  8. SUBROUTINE interp_fcn ( cfld, & ! CD field
  9. cids, cide, ckds, ckde, cjds, cjde, &
  10. cims, cime, ckms, ckme, cjms, cjme, &
  11. cits, cite, ckts, ckte, cjts, cjte, &
  12. nfld, & ! ND field
  13. nids, nide, nkds, nkde, njds, njde, &
  14. nims, nime, nkms, nkme, njms, njme, &
  15. nits, nite, nkts, nkte, njts, njte, &
  16. shw, & ! stencil half width for interp
  17. imask, & ! interpolation mask
  18. xstag, ystag, & ! staggering of field
  19. ipos, jpos, & ! Position of lower left of nest in CD
  20. nri, nrj ) ! nest ratios
  21. USE module_timing
  22. USE module_configure
  23. IMPLICIT NONE
  24. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  25. cims, cime, ckms, ckme, cjms, cjme, &
  26. cits, cite, ckts, ckte, cjts, cjte, &
  27. nids, nide, nkds, nkde, njds, njde, &
  28. nims, nime, nkms, nkme, njms, njme, &
  29. nits, nite, nkts, nkte, njts, njte, &
  30. shw, &
  31. ipos, jpos, &
  32. nri, nrj
  33. LOGICAL, INTENT(IN) :: xstag, ystag
  34. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
  35. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
  36. INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
  37. ! Local
  38. !logical first
  39. INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, nioff, njoff
  40. #ifdef MM5_SINT
  41. INTEGER nfx, ior
  42. PARAMETER (ior=2)
  43. INTEGER nf
  44. REAL psca(cims:cime,cjms:cjme,nri*nrj)
  45. LOGICAL icmask( cims:cime, cjms:cjme )
  46. INTEGER i,j,k
  47. INTEGER nrio2, nrjo2
  48. #endif
  49. ! Iterate over the ND tile and compute the values
  50. ! from the CD tile.
  51. #ifdef MM5_SINT
  52. ioff = 0 ; joff = 0
  53. nioff = 0 ; njoff = 0
  54. IF ( xstag ) THEN
  55. ioff = (nri-1)/2
  56. nioff = nri
  57. ENDIF
  58. IF ( ystag ) THEN
  59. joff = (nrj-1)/2
  60. njoff = nrj
  61. ENDIF
  62. nrio2 = nri/2
  63. nrjo2 = nrj/2
  64. nfx = nri * nrj
  65. !$OMP PARALLEL DO &
  66. !$OMP PRIVATE ( i,j,k,ni,nj,ci,cj,ip,jp,nk,ck,nf,icmask,psca )
  67. DO k = ckts, ckte
  68. icmask = .FALSE.
  69. DO nf = 1,nfx
  70. DO j = cjms,cjme
  71. nj = (j-jpos) * nrj + ( nrjo2 + 1 ) ! j point on nest
  72. DO i = cims,cime
  73. ni = (i-ipos) * nri + ( nrio2 + 1 ) ! i point on nest
  74. if ( ni .ge. nits-nioff-nrio2 .and. &
  75. ni .le. nite+nioff+nrio2 .and. &
  76. nj .ge. njts-njoff-nrjo2 .and. &
  77. nj .le. njte+njoff+nrjo2 ) then
  78. ! if ( imask(ni,nj) .eq. 1 .or. imask(ni-nioff,nj-njoff) .eq. 1 ) then
  79. ! icmask( i, j ) = .TRUE.
  80. ! endif
  81. if ( ni.ge.nims.and.ni.le.nime.and.nj.ge.njms.and.nj.le.njme) then
  82. if ( imask(ni,nj) .eq. 1 ) then
  83. icmask( i, j ) = .TRUE.
  84. endif
  85. endif
  86. if ( ni-nioff.ge.nims.and.ni.le.nime.and.nj-njoff.ge.njms.and.nj.le.njme) then
  87. if (ni .ge. nits-nioff .and. nj .ge. njts-njoff ) then
  88. if ( imask(ni-nioff,nj-njoff) .eq. 1) then
  89. icmask( i, j ) = .TRUE.
  90. endif
  91. endif
  92. endif
  93. endif
  94. psca(i,j,nf) = cfld(i,k,j)
  95. ENDDO
  96. ENDDO
  97. ENDDO
  98. ! tile dims in this call to sint are 1-over to account for the fact
  99. ! that the number of cells on the nest local subdomain is not
  100. ! necessarily a multiple of the nest ratio in a given dim.
  101. ! this could be a little less ham-handed.
  102. !call start_timing
  103. CALL sint( psca, &
  104. cims, cime, cjms, cjme, icmask, &
  105. cits-1, cite+1, cjts-1, cjte+1, nrj*nri, xstag, ystag )
  106. !call end_timing( ' sint ' )
  107. DO nj = njts, njte+joff
  108. cj = jpos + (nj-1) / nrj ! j coord of CD point
  109. jp = mod ( nj-1 , nrj ) ! coord of ND w/i CD point
  110. nk = k
  111. ck = nk
  112. DO ni = nits, nite+ioff
  113. ci = ipos + (ni-1) / nri ! i coord of CD point
  114. ip = mod ( ni-1 , nri ) ! coord of ND w/i CD point
  115. if ( imask ( ni, nj ) .eq. 1 .or. imask ( ni-ioff, nj-joff ) .eq. 1 ) then
  116. nfld( ni-ioff, nk, nj-joff ) = psca( ci , cj, ip+1 + (jp)*nri )
  117. endif
  118. ENDDO
  119. ENDDO
  120. ENDDO
  121. !$OMP END PARALLEL DO
  122. #endif
  123. #ifdef DUMBCOPY
  124. !write(0,'(") cims:cime, ckms:ckme, cjms:cjme ",6i4)')cims,cime, ckms,ckme, cjms,cjme
  125. !write(0,'(") nims:nime, nkms:nkme, njms:njme ",6i4)')nims,nime, nkms,nkme, njms,njme
  126. !write(0,'(") cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte
  127. !write(0,'(") nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte
  128. DO nj = njts, njte
  129. cj = jpos + (nj-1) / nrj ! j coord of CD point
  130. jp = mod ( nj , nrj ) ! coord of ND w/i CD point
  131. DO nk = nkts, nkte
  132. ck = nk
  133. DO ni = nits, nite
  134. ci = ipos + (ni-1) / nri ! j coord of CD point
  135. ip = mod ( ni , nri ) ! coord of ND w/i CD point
  136. ! This is a trivial implementation of the interp_fcn; just copies
  137. ! the values from the CD into the ND
  138. if ( imask ( ni, nj ) .eq. 1 ) then
  139. nfld( ni, nk, nj ) = cfld( ci , ck , cj )
  140. endif
  141. ENDDO
  142. ENDDO
  143. ENDDO
  144. #endif
  145. RETURN
  146. END SUBROUTINE interp_fcn
  147. !==================================
  148. ! this is the default function used in feedback.
  149. SUBROUTINE copy_fcn ( cfld, & ! CD field
  150. cids, cide, ckds, ckde, cjds, cjde, &
  151. cims, cime, ckms, ckme, cjms, cjme, &
  152. cits, cite, ckts, ckte, cjts, cjte, &
  153. nfld, & ! ND field
  154. nids, nide, nkds, nkde, njds, njde, &
  155. nims, nime, nkms, nkme, njms, njme, &
  156. nits, nite, nkts, nkte, njts, njte, &
  157. shw, & ! stencil half width for interp
  158. imask, & ! interpolation mask
  159. xstag, ystag, & ! staggering of field
  160. ipos, jpos, & ! Position of lower left of nest in CD
  161. nri, nrj ) ! nest ratios
  162. USE module_configure
  163. IMPLICIT NONE
  164. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  165. cims, cime, ckms, ckme, cjms, cjme, &
  166. cits, cite, ckts, ckte, cjts, cjte, &
  167. nids, nide, nkds, nkde, njds, njde, &
  168. nims, nime, nkms, nkme, njms, njme, &
  169. nits, nite, nkts, nkte, njts, njte, &
  170. shw, &
  171. ipos, jpos, &
  172. nri, nrj
  173. LOGICAL, INTENT(IN) :: xstag, ystag
  174. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
  175. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ),INTENT(IN) :: nfld
  176. INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask
  177. ! Local
  178. INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
  179. INTEGER :: icmin,icmax,jcmin,jcmax
  180. INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
  181. INTEGER , PARAMETER :: passes = 2
  182. INTEGER spec_zone
  183. ! Loop over the coarse grid in the area of the fine mesh. Do not
  184. ! process the coarse grid values that are along the lateral BC
  185. ! provided to the fine grid. Since that is in the specified zone
  186. ! for the fine grid, it should not be used in any feedback to the
  187. ! coarse grid as it should not have changed.
  188. ! Due to peculiarities of staggering, it is simpler to handle the feedback
  189. ! for the staggerings based upon whether it is a even ratio (2::1, 4::1, etc.) or
  190. ! an odd staggering ratio (3::1, 5::1, etc.).
  191. ! Though there are separate grid ratios for the i and j directions, this code
  192. ! is not general enough to handle aspect ratios .NE. 1 for the fine grid cell.
  193. ! These are local integer increments in the looping. Basically, istag=1 means
  194. ! that we will assume one less point in the i direction. Note that ci and cj
  195. ! have a maximum value that is decreased by istag and jstag, respectively.
  196. ! Horizontal momentum feedback is along the face, not within the cell. For a
  197. ! 3::1 ratio, temperature would use 9 pts for feedback, while u and v use
  198. ! only 3 points for feedback from the nest to the parent.
  199. CALL nl_get_spec_zone( 1 , spec_zone )
  200. istag = 1 ; jstag = 1
  201. IF ( xstag ) istag = 0
  202. IF ( ystag ) jstag = 0
  203. IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
  204. IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN
  205. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  206. nj = (cj-jpos)*nrj + jstag + 1
  207. DO ck = ckts, ckte
  208. nk = ck
  209. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  210. ni = (ci-ipos)*nri + istag + 1
  211. cfld( ci, ck, cj ) = 0.
  212. DO ijpoints = 1 , nri * nrj
  213. ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
  214. jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
  215. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  216. 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints )
  217. END DO
  218. ! cfld( ci, ck, cj ) = 1./9. * &
  219. ! ( nfld( ni-1, nk , nj-1) + &
  220. ! nfld( ni , nk , nj-1) + &
  221. ! nfld( ni+1, nk , nj-1) + &
  222. ! nfld( ni-1, nk , nj ) + &
  223. ! nfld( ni , nk , nj ) + &
  224. ! nfld( ni+1, nk , nj ) + &
  225. ! nfld( ni-1, nk , nj+1) + &
  226. ! nfld( ni , nk , nj+1) + &
  227. ! nfld( ni+1, nk , nj+1) )
  228. ENDDO
  229. ENDDO
  230. ENDDO
  231. ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN
  232. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  233. nj = (cj-jpos)*nrj + jstag + 1
  234. DO ck = ckts, ckte
  235. nk = ck
  236. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  237. ni = (ci-ipos)*nri + istag + 1
  238. cfld( ci, ck, cj ) = 0.
  239. DO ijpoints = (nri+1)/2 , (nri+1)/2 + nri*(nri-1) , nri
  240. ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
  241. jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
  242. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  243. 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
  244. END DO
  245. ! cfld( ci, ck, cj ) = 1./3. * &
  246. ! ( nfld( ni , nk , nj-1) + &
  247. ! nfld( ni , nk , nj ) + &
  248. ! nfld( ni , nk , nj+1) )
  249. ENDDO
  250. ENDDO
  251. ENDDO
  252. ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN
  253. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  254. nj = (cj-jpos)*nrj + jstag + 1
  255. DO ck = ckts, ckte
  256. nk = ck
  257. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  258. ni = (ci-ipos)*nri + istag + 1
  259. cfld( ci, ck, cj ) = 0.
  260. DO ijpoints = ( nrj*nrj +1 )/2 - nrj/2 , ( nrj*nrj +1 )/2 - nrj/2 + nrj-1
  261. ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
  262. jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
  263. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  264. 1./REAL( nrj) * nfld( ni+ipoints , nk , nj+jpoints )
  265. END DO
  266. ! cfld( ci, ck, cj ) = 1./3. * &
  267. ! ( nfld( ni-1, nk , nj ) + &
  268. ! nfld( ni , nk , nj ) + &
  269. ! nfld( ni+1, nk , nj ) )
  270. ENDDO
  271. ENDDO
  272. ENDDO
  273. END IF
  274. ! Even refinement ratio
  275. ELSE IF ( MOD(nrj,2) .EQ. 0) THEN
  276. IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN
  277. ! This is a simple schematic of the feedback indexing used in the even
  278. ! ratio nests. For simplicity, a 2::1 ratio is depicted. Only the
  279. ! mass variable staggering is shown.
  280. ! Each of
  281. ! the boxes with a "T" and four small "t" represents a coarse grid (CG)
  282. ! cell, that is composed of four (2::1 ratio) fine grid (FG) cells.
  283. ! Shown below is the area of the CG that is in the area of the FG. The
  284. ! first grid point of the depicted CG is the starting location of the nest
  285. ! in the parent domain (ipos,jpos - i_parent_start and j_parent_start from
  286. ! the namelist).
  287. ! For each of the CG points, the feedback loop is over each of the FG points
  288. ! within the CG cell. For a 2::1 ratio, there are four total points (this is
  289. ! the ijpoints loop). The feedback value to the CG is the arithmetic mean of
  290. ! all of the FG values within each CG cell.
  291. ! |-------------||-------------| |-------------||-------------|
  292. ! | t t || t t | | t t || t t |
  293. ! jpos+ | || | | || |
  294. ! (njde-njds)- | T || T | | T || T |
  295. ! jstag | || | | || |
  296. ! | t t || t t | | t t || t t |
  297. ! |-------------||-------------| |-------------||-------------|
  298. ! |-------------||-------------| |-------------||-------------|
  299. ! | t t || t t | | t t || t t |
  300. ! | || | | || |
  301. ! | T || T | | T || T |
  302. ! | || | | || |
  303. ! | t t || t t | | t t || t t |
  304. ! |-------------||-------------| |-------------||-------------|
  305. !
  306. ! ...
  307. ! ...
  308. ! ...
  309. ! ...
  310. ! ...
  311. ! |-------------||-------------| |-------------||-------------|
  312. ! jpoints = 1 | t t || t t | | t t || t t |
  313. ! | || | | || |
  314. ! | T || T | | T || T |
  315. ! | || | | || |
  316. ! jpoints = 0, | t t || t t | | t t || t t |
  317. ! nj=3 |-------------||-------------| |-------------||-------------|
  318. ! |-------------||-------------| |-------------||-------------|
  319. ! jpoints = 1 | t t || t t | | t t || t t |
  320. ! | || | | || |
  321. ! jpos | T || T | ... | T || T |
  322. ! | || | ... | || |
  323. ! jpoints = 0, | t t || t t | ... | t t || t t |
  324. ! nj=1 |-------------||-------------| |-------------||-------------|
  325. ! ^ ^
  326. ! | |
  327. ! | |
  328. ! ipos ipos+
  329. ! ni = 1 3 (nide-nids)/nri
  330. ! ipoints= 0 1 0 1 -istag
  331. !
  332. ! For performance benefits, users can comment out the inner most loop (and cfld=0) and
  333. ! hardcode the loop feedback. For example, it is set up to run a 2::1 ratio
  334. ! if uncommented. This lacks generality, but is likely to gain timing benefits
  335. ! with compilers unable to unroll inner loops that do not have parameterized sizes.
  336. ! The extra +1 ---------/ and the extra -1 ----\ (both for ci and cj)
  337. ! / \ keeps the feedback out of the
  338. ! / \ outer row/col, since that CG data
  339. ! / \ specified the nest boundary originally
  340. ! / \ This
  341. ! / \ is just
  342. ! / \ a sentence to not end a line
  343. ! / \ with a stupid backslash
  344. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  345. nj = (cj-jpos)*nrj + jstag
  346. DO ck = ckts, ckte
  347. nk = ck
  348. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  349. ni = (ci-ipos)*nri + istag
  350. cfld( ci, ck, cj ) = 0.
  351. DO ijpoints = 1 , nri * nrj
  352. ipoints = MOD((ijpoints-1),nri)
  353. jpoints = (ijpoints-1)/nri
  354. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  355. 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints )
  356. END DO
  357. ! cfld( ci, ck, cj ) = 1./4. * &
  358. ! ( nfld( ni , nk , nj ) + &
  359. ! nfld( ni+1, nk , nj ) + &
  360. ! nfld( ni , nk , nj+1) + &
  361. ! nfld( ni+1, nk , nj+1) )
  362. END DO
  363. END DO
  364. END DO
  365. ! U
  366. ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN
  367. ! |---------------|
  368. ! | |
  369. ! jpoints = 1 u u |
  370. ! | |
  371. ! U |
  372. ! | |
  373. ! jpoints = 0, u u |
  374. ! nj=3 | |
  375. ! |---------------|
  376. ! |---------------|
  377. ! | |
  378. ! jpoints = 1 u u |
  379. ! | |
  380. ! jpos U |
  381. ! | |
  382. ! jpoints = 0, u u |
  383. ! nj=1 | |
  384. ! |---------------|
  385. !
  386. ! ^
  387. ! |
  388. ! |
  389. ! ipos
  390. ! ni = 1 3
  391. ! ipoints= 0 1 0
  392. !
  393. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  394. nj = (cj-jpos)*nrj + 1
  395. DO ck = ckts, ckte
  396. nk = ck
  397. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  398. ni = (ci-ipos)*nri + 1
  399. cfld( ci, ck, cj ) = 0.
  400. DO ijpoints = 1 , nri*nrj , nri
  401. ipoints = MOD((ijpoints-1),nri)
  402. jpoints = (ijpoints-1)/nri
  403. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  404. 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
  405. END DO
  406. ! cfld( ci, ck, cj ) = 1./2. * &
  407. ! ( nfld( ni , nk , nj ) + &
  408. ! nfld( ni , nk , nj+1) )
  409. ENDDO
  410. ENDDO
  411. ENDDO
  412. ! V
  413. ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN
  414. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  415. nj = (cj-jpos)*nrj + 1
  416. DO ck = ckts, ckte
  417. nk = ck
  418. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  419. ni = (ci-ipos)*nri + 1
  420. cfld( ci, ck, cj ) = 0.
  421. DO ijpoints = 1 , nri
  422. ipoints = MOD((ijpoints-1),nri)
  423. jpoints = (ijpoints-1)/nri
  424. cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
  425. 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
  426. END DO
  427. ! cfld( ci, ck, cj ) = 1./2. * &
  428. ! ( nfld( ni , nk , nj ) + &
  429. ! nfld( ni+1, nk , nj ) )
  430. ENDDO
  431. ENDDO
  432. ENDDO
  433. END IF
  434. END IF
  435. RETURN
  436. END SUBROUTINE copy_fcn
  437. !==================================
  438. ! this is the 1pt function used in feedback.
  439. SUBROUTINE copy_fcnm ( cfld, & ! CD field
  440. cids, cide, ckds, ckde, cjds, cjde, &
  441. cims, cime, ckms, ckme, cjms, cjme, &
  442. cits, cite, ckts, ckte, cjts, cjte, &
  443. nfld, & ! ND field
  444. nids, nide, nkds, nkde, njds, njde, &
  445. nims, nime, nkms, nkme, njms, njme, &
  446. nits, nite, nkts, nkte, njts, njte, &
  447. shw, & ! stencil half width for interp
  448. imask, & ! interpolation mask
  449. xstag, ystag, & ! staggering of field
  450. ipos, jpos, & ! Position of lower left of nest in CD
  451. nri, nrj ) ! nest ratios
  452. USE module_configure
  453. USE module_wrf_error
  454. IMPLICIT NONE
  455. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  456. cims, cime, ckms, ckme, cjms, cjme, &
  457. cits, cite, ckts, ckte, cjts, cjte, &
  458. nids, nide, nkds, nkde, njds, njde, &
  459. nims, nime, nkms, nkme, njms, njme, &
  460. nits, nite, nkts, nkte, njts, njte, &
  461. shw, &
  462. ipos, jpos, &
  463. nri, nrj
  464. LOGICAL, INTENT(IN) :: xstag, ystag
  465. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
  466. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld
  467. INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
  468. ! Local
  469. INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
  470. INTEGER :: icmin,icmax,jcmin,jcmax
  471. INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
  472. INTEGER , PARAMETER :: passes = 2
  473. INTEGER spec_zone
  474. CALL nl_get_spec_zone( 1, spec_zone )
  475. istag = 1 ; jstag = 1
  476. IF ( xstag ) istag = 0
  477. IF ( ystag ) jstag = 0
  478. IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
  479. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  480. nj = (cj-jpos)*nrj + jstag + 1
  481. DO ck = ckts, ckte
  482. nk = ck
  483. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  484. ni = (ci-ipos)*nri + istag + 1
  485. cfld( ci, ck, cj ) = nfld( ni , nk , nj )
  486. ENDDO
  487. ENDDO
  488. ENDDO
  489. ELSE ! even refinement ratio, pick nearest neighbor on SW corner
  490. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  491. nj = (cj-jpos)*nrj + 1
  492. DO ck = ckts, ckte
  493. nk = ck
  494. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  495. ni = (ci-ipos)*nri + 1
  496. ipoints = nri/2 -1
  497. jpoints = nrj/2 -1
  498. cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints )
  499. END DO
  500. END DO
  501. END DO
  502. END IF
  503. RETURN
  504. END SUBROUTINE copy_fcnm
  505. !==================================
  506. ! this is the 1pt function used in feedback for integers
  507. SUBROUTINE copy_fcni ( cfld, & ! CD field
  508. cids, cide, ckds, ckde, cjds, cjde, &
  509. cims, cime, ckms, ckme, cjms, cjme, &
  510. cits, cite, ckts, ckte, cjts, cjte, &
  511. nfld, & ! ND field
  512. nids, nide, nkds, nkde, njds, njde, &
  513. nims, nime, nkms, nkme, njms, njme, &
  514. nits, nite, nkts, nkte, njts, njte, &
  515. shw, & ! stencil half width for interp
  516. imask, & ! interpolation mask
  517. xstag, ystag, & ! staggering of field
  518. ipos, jpos, & ! Position of lower left of nest in CD
  519. nri, nrj ) ! nest ratios
  520. USE module_configure
  521. USE module_wrf_error
  522. IMPLICIT NONE
  523. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  524. cims, cime, ckms, ckme, cjms, cjme, &
  525. cits, cite, ckts, ckte, cjts, cjte, &
  526. nids, nide, nkds, nkde, njds, njde, &
  527. nims, nime, nkms, nkme, njms, njme, &
  528. nits, nite, nkts, nkte, njts, njte, &
  529. shw, &
  530. ipos, jpos, &
  531. nri, nrj
  532. LOGICAL, INTENT(IN) :: xstag, ystag
  533. INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
  534. INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld
  535. INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
  536. ! Local
  537. INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
  538. INTEGER :: icmin,icmax,jcmin,jcmax
  539. INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
  540. INTEGER , PARAMETER :: passes = 2
  541. INTEGER spec_zone
  542. CALL nl_get_spec_zone( 1, spec_zone )
  543. istag = 1 ; jstag = 1
  544. IF ( xstag ) istag = 0
  545. IF ( ystag ) jstag = 0
  546. IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
  547. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  548. nj = (cj-jpos)*nrj + jstag + 1
  549. DO ck = ckts, ckte
  550. nk = ck
  551. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  552. ni = (ci-ipos)*nri + istag + 1
  553. cfld( ci, ck, cj ) = nfld( ni , nk , nj )
  554. ENDDO
  555. ENDDO
  556. ENDDO
  557. ELSE ! even refinement ratio
  558. DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
  559. nj = (cj-jpos)*nrj + 1
  560. DO ck = ckts, ckte
  561. nk = ck
  562. DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
  563. ni = (ci-ipos)*nri + 1
  564. ipoints = nri/2 -1
  565. jpoints = nrj/2 -1
  566. cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints )
  567. END DO
  568. END DO
  569. END DO
  570. END IF
  571. RETURN
  572. END SUBROUTINE copy_fcni
  573. !==================================
  574. SUBROUTINE p2c ( cfld, & ! CD field
  575. cids, cide, ckds, ckde, cjds, cjde, &
  576. cims, cime, ckms, ckme, cjms, cjme, &
  577. cits, cite, ckts, ckte, cjts, cjte, &
  578. nfld, & ! ND field
  579. nids, nide, nkds, nkde, njds, njde, &
  580. nims, nime, nkms, nkme, njms, njme, &
  581. nits, nite, nkts, nkte, njts, njte, &
  582. shw, & ! stencil half width
  583. imask, & ! interpolation mask
  584. xstag, ystag, & ! staggering of field
  585. ipos, jpos, & ! Position of lower left of nest in CD
  586. nri, nrj & ! nest ratios
  587. )
  588. USE module_configure
  589. IMPLICIT NONE
  590. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  591. cims, cime, ckms, ckme, cjms, cjme, &
  592. cits, cite, ckts, ckte, cjts, cjte, &
  593. nids, nide, nkds, nkde, njds, njde, &
  594. nims, nime, nkms, nkme, njms, njme, &
  595. nits, nite, nkts, nkte, njts, njte, &
  596. shw, &
  597. ipos, jpos, &
  598. nri, nrj
  599. LOGICAL, INTENT(IN) :: xstag, ystag
  600. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
  601. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
  602. INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
  603. CALL interp_fcn (cfld, & ! CD field
  604. cids, cide, ckds, ckde, cjds, cjde, &
  605. cims, cime, ckms, ckme, cjms, cjme, &
  606. cits, cite, ckts, ckte, cjts, cjte, &
  607. nfld, & ! ND field
  608. nids, nide, nkds, nkde, njds, njde, &
  609. nims, nime, nkms, nkme, njms, njme, &
  610. nits, nite, nkts, nkte, njts, njte, &
  611. shw, & ! stencil half width for interp
  612. imask, & ! interpolation mask
  613. xstag, ystag, & ! staggering of field
  614. ipos, jpos, & ! Position of lower left of nest in CD
  615. nri, nrj ) ! nest ratios
  616. END SUBROUTINE p2c
  617. !==================================
  618. SUBROUTINE bdy_interp ( cfld, & ! CD field
  619. cids, cide, ckds, ckde, cjds, cjde, &
  620. cims, cime, ckms, ckme, cjms, cjme, &
  621. cits, cite, ckts, ckte, cjts, cjte, &
  622. nfld, & ! ND field
  623. nids, nide, nkds, nkde, njds, njde, &
  624. nims, nime, nkms, nkme, njms, njme, &
  625. nits, nite, nkts, nkte, njts, njte, &
  626. shw, & ! stencil half width
  627. imask, & ! interpolation mask
  628. xstag, ystag, & ! staggering of field
  629. ipos, jpos, & ! Position of lower left of nest in CD
  630. nri, nrj, & ! nest ratios
  631. cbdy_xs, nbdy_xs, &
  632. cbdy_xe, nbdy_xe, &
  633. cbdy_ys, nbdy_ys, &
  634. cbdy_ye, nbdy_ye, &
  635. cbdy_txs, nbdy_txs, &
  636. cbdy_txe, nbdy_txe, &
  637. cbdy_tys, nbdy_tys, &
  638. cbdy_tye, nbdy_tye, &
  639. cdt, ndt &
  640. ) ! boundary arrays
  641. USE module_configure
  642. IMPLICIT NONE
  643. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  644. cims, cime, ckms, ckme, cjms, cjme, &
  645. cits, cite, ckts, ckte, cjts, cjte, &
  646. nids, nide, nkds, nkde, njds, njde, &
  647. nims, nime, nkms, nkme, njms, njme, &
  648. nits, nite, nkts, nkte, njts, njte, &
  649. shw, &
  650. ipos, jpos, &
  651. nri, nrj
  652. LOGICAL, INTENT(IN) :: xstag, ystag
  653. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
  654. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
  655. INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
  656. REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs, nbdy_xs, nbdy_txs
  657. REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe, nbdy_xe, nbdy_txe
  658. REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys, nbdy_ys, nbdy_tys
  659. REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye, nbdy_ye, nbdy_tye
  660. REAL cdt, ndt
  661. ! Local
  662. INTEGER nijds, nijde, spec_bdy_width
  663. nijds = min(nids, njds)
  664. nijde = max(nide, njde)
  665. CALL nl_get_spec_bdy_width( 1, spec_bdy_width )
  666. CALL bdy_interp1( cfld, & ! CD field
  667. cids, cide, ckds, ckde, cjds, cjde, &
  668. cims, cime, ckms, ckme, cjms, cjme, &
  669. cits, cite, ckts, ckte, cjts, cjte, &
  670. nfld, & ! ND field
  671. nijds, nijde , spec_bdy_width , &
  672. nids, nide, nkds, nkde, njds, njde, &
  673. nims, nime, nkms, nkme, njms, njme, &
  674. nits, nite, nkts, nkte, njts, njte, &
  675. shw, imask, &
  676. xstag, ystag, & ! staggering of field
  677. ipos, jpos, & ! Position of lower left of nest in CD
  678. nri, nrj, &
  679. cbdy_xs, nbdy_xs, &
  680. cbdy_xe, nbdy_xe, &
  681. cbdy_ys, nbdy_ys, &
  682. cbdy_ye, nbdy_ye, &
  683. cbdy_txs, nbdy_txs, &
  684. cbdy_txe, nbdy_txe, &
  685. cbdy_tys, nbdy_tys, &
  686. cbdy_tye, nbdy_tye, &
  687. cdt, ndt &
  688. )
  689. RETURN
  690. END SUBROUTINE bdy_interp
  691. SUBROUTINE bdy_interp1( cfld, & ! CD field
  692. cids, cide, ckds, ckde, cjds, cjde, &
  693. cims, cime, ckms, ckme, cjms, cjme, &
  694. cits, cite, ckts, ckte, cjts, cjte, &
  695. nfld, & ! ND field
  696. nijds, nijde, spec_bdy_width , &
  697. nids, nide, nkds, nkde, njds, njde, &
  698. nims, nime, nkms, nkme, njms, njme, &
  699. nits, nite, nkts, nkte, njts, njte, &
  700. shw1, &
  701. imask, & ! interpolation mask
  702. xstag, ystag, & ! staggering of field
  703. ipos, jpos, & ! Position of lower left of nest in CD
  704. nri, nrj, &
  705. cbdy_xs, bdy_xs, &
  706. cbdy_xe, bdy_xe, &
  707. cbdy_ys, bdy_ys, &
  708. cbdy_ye, bdy_ye, &
  709. cbdy_txs, bdy_txs, &
  710. cbdy_txe, bdy_txe, &
  711. cbdy_tys, bdy_tys, &
  712. cbdy_tye, bdy_tye, &
  713. cdt, ndt &
  714. )
  715. USE module_configure
  716. use module_state_description
  717. IMPLICIT NONE
  718. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  719. cims, cime, ckms, ckme, cjms, cjme, &
  720. cits, cite, ckts, ckte, cjts, cjte, &
  721. nids, nide, nkds, nkde, njds, njde, &
  722. nims, nime, nkms, nkme, njms, njme, &
  723. nits, nite, nkts, nkte, njts, njte, &
  724. shw1, & ! ignore
  725. ipos, jpos, &
  726. nri, nrj
  727. INTEGER, INTENT(IN) :: nijds, nijde, spec_bdy_width
  728. LOGICAL, INTENT(IN) :: xstag, ystag
  729. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld
  730. REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(INOUT) :: nfld
  731. INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
  732. REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs ! not used
  733. REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe ! not used
  734. REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys ! not used
  735. REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye ! not used
  736. REAL :: cdt, ndt
  737. REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xs, bdy_txs
  738. REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xe, bdy_txe
  739. REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ys, bdy_tys
  740. REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ye, bdy_tye
  741. ! Local
  742. REAL*8 rdt
  743. INTEGER ci, cj, ck, ni, nj, nk, ni1, nj1, nk1, ip, jp, ioff, joff
  744. #ifdef MM5_SINT
  745. INTEGER nfx, ior
  746. PARAMETER (ior=2)
  747. INTEGER nf
  748. REAL psca1(cims:cime,cjms:cjme,nri*nrj)
  749. REAL psca(cims:cime,cjms:cjme,nri*nrj)
  750. LOGICAL icmask( cims:cime, cjms:cjme )
  751. INTEGER i,j,k
  752. #endif
  753. INTEGER shw
  754. INTEGER spec_zone
  755. INTEGER relax_zone
  756. INTEGER sz
  757. INTEGER n2ci,n
  758. INTEGER n2cj
  759. ! statement functions for converting a nest index to coarse
  760. n2ci(n) = (n+ipos*nri-1)/nri
  761. n2cj(n) = (n+jpos*nrj-1)/nrj
  762. rdt = 1.D0/cdt
  763. shw = 0
  764. ioff = 0 ; joff = 0
  765. IF ( xstag ) THEN
  766. ioff = (nri-1)/2
  767. ENDIF
  768. IF ( ystag ) THEN
  769. joff = (nrj-1)/2
  770. ENDIF
  771. ! Iterate over the ND tile and compute the values
  772. ! from the CD tile.
  773. #ifdef MM5_SINT
  774. CALL nl_get_spec_zone( 1, spec_zone )
  775. CALL nl_get_relax_zone( 1, relax_zone )
  776. sz = MIN(MAX( spec_zone, relax_zone + 1 ),spec_bdy_width)
  777. nfx = nri * nrj
  778. !$OMP PARALLEL DO &
  779. !$OMP PRIVATE ( i,j,k,ni,nj,ni1,nj1,ci,cj,ip,jp,nk,ck,nf,icmask,psca,psca1 )
  780. DO k = ckts, ckte
  781. DO nf = 1,nfx
  782. DO j = cjms,cjme
  783. nj = (j-jpos) * nrj + ( nrj / 2 + 1 ) ! j point on nest
  784. DO i = cims,cime
  785. ni = (i-ipos) * nri + ( nri / 2 + 1 ) ! i point on nest
  786. psca1(i,j,nf) = cfld(i,k,j)
  787. ENDDO
  788. ENDDO
  789. ENDDO
  790. ! hopefully less ham handed but still correct and more efficient
  791. ! sintb ignores icmask so it does not matter that icmask is not set
  792. !
  793. ! SOUTH BDY
  794. IF ( njts .ge. njds .and. njts .le. njds + sz + joff ) THEN
  795. CALL sintb( psca1, psca, &
  796. cims, cime, cjms, cjme, icmask, &
  797. n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njds)), n2cj(MIN(njte,njds+sz+joff)), nrj*nri, xstag, ystag )
  798. ENDIF
  799. ! NORTH BDY
  800. IF ( njte .le. njde .and. njte .ge. njde - sz - joff ) THEN
  801. CALL sintb( psca1, psca, &
  802. cims, cime, cjms, cjme, icmask, &
  803. n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njde-sz-joff)), n2cj(MIN(njte,njde-1+joff)), nrj*nri, xstag, ystag )
  804. ENDIF
  805. ! WEST BDY
  806. IF ( nits .ge. nids .and. nits .le. nids + sz + ioff ) THEN
  807. CALL sintb( psca1, psca, &
  808. cims, cime, cjms, cjme, icmask, &
  809. n2ci(MAX(nits,nids)), n2ci(MIN(nite,nids+sz+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag )
  810. ENDIF
  811. ! EAST BDY
  812. IF ( nite .le. nide .and. nite .ge. nide - sz - ioff ) THEN
  813. CALL sintb( psca1, psca, &
  814. cims, cime, cjms, cjme, icmask, &
  815. n2ci(MAX(nits,nide-sz-ioff)), n2ci(MIN(nite,nide-1+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag )
  816. ENDIF
  817. DO nj1 = MAX(njds,njts-1), MIN(njde+joff,njte+joff+1)
  818. cj = jpos + (nj1-1) / nrj ! j coord of CD point
  819. jp = mod ( nj1-1 , nrj ) ! coord of ND w/i CD point
  820. nk = k
  821. ck = nk
  822. DO ni1 = MAX(nids,nits-1), MIN(nide+ioff,nite+ioff+1)
  823. ci = ipos + (ni1-1) / nri ! j coord of CD point
  824. ip = mod ( ni1-1 , nri ) ! coord of ND w/i CD point
  825. ni = ni1-ioff
  826. nj = nj1-joff
  827. IF ( ( ni.LT.nids) .OR. (nj.LT.njds) ) THEN
  828. CYCLE
  829. END IF
  830. !bdy contains the value at t-dt. psca contains the value at t
  831. !compute dv/dt and store in bdy_t
  832. !afterwards store the new value of v at t into bdy
  833. ! WEST
  834. IF ( ni .ge. nids .and. ni .lt. nids + sz ) THEN
  835. bdy_txs( nj,k,ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  836. bdy_xs( nj,k,ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  837. ENDIF
  838. ! SOUTH
  839. IF ( nj .ge. njds .and. nj .lt. njds + sz ) THEN
  840. bdy_tys( ni,k,nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  841. bdy_ys( ni,k,nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  842. ENDIF
  843. ! EAST
  844. IF ( xstag ) THEN
  845. IF ( ni .ge. nide - sz + 1 .AND. ni .le. nide ) THEN
  846. bdy_txe( nj,k,nide-ni+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  847. bdy_xe( nj,k,nide-ni+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  848. ENDIF
  849. ELSE
  850. IF ( ni .ge. nide - sz .AND. ni .le. nide-1 ) THEN
  851. bdy_txe( nj,k,nide-ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  852. bdy_xe( nj,k,nide-ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  853. ENDIF
  854. ENDIF
  855. ! NORTH
  856. IF ( ystag ) THEN
  857. IF ( nj .ge. njde - sz + 1 .AND. nj .le. njde ) THEN
  858. bdy_tye( ni,k,njde-nj+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  859. bdy_ye( ni,k,njde-nj+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  860. ENDIF
  861. ELSE
  862. IF ( nj .ge. njde - sz .AND. nj .le. njde-1 ) THEN
  863. bdy_tye(ni,k,njde-nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
  864. bdy_ye( ni,k,njde-nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
  865. ENDIF
  866. ENDIF
  867. ENDDO
  868. ENDDO
  869. ENDDO
  870. !$OMP END PARALLEL DO
  871. #endif
  872. RETURN
  873. END SUBROUTINE bdy_interp1
  874. SUBROUTINE interp_fcni( cfld, & ! CD field
  875. cids, cide, ckds, ckde, cjds, cjde, &
  876. cims, cime, ckms, ckme, cjms, cjme, &
  877. cits, cite, ckts, ckte, cjts, cjte, &
  878. nfld, & ! ND field
  879. nids, nide, nkds, nkde, njds, njde, &
  880. nims, nime, nkms, nkme, njms, njme, &
  881. nits, nite, nkts, nkte, njts, njte, &
  882. shw, & ! stencil half width
  883. imask, & ! interpolation mask
  884. xstag, ystag, & ! staggering of field
  885. ipos, jpos, & ! Position of lower left of nest in CD
  886. nri, nrj ) ! nest ratios
  887. USE module_configure
  888. IMPLICIT NONE
  889. INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
  890. cims, cime, ckms, ckme, cjms, cjme, &
  891. cits, cite, ckts, ckte, cjts, cjte, &
  892. nids, nide, nkds, nkde, njds, njde, &
  893. nims, nime, nkms, nkme, njms, njme, &
  894. nits, nite, nkts, nkte, njts, njte, &
  895. shw, &
  896. ipos, jpos, &
  897. nri, nrj
  898. LOGICAL, INTENT(IN) :: xstag, ystag
  899. INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
  900. INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
  901. INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
  902. ! Local
  903. INTEGER ci, cj, ck, ni, nj, nk, ip, jp
  904. ! Iterate over the ND tile and compute the values
  905. ! from the CD tile.
  906. !write(0,'("cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte
  907. !write(0,'("nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte
  908. DO nj = njts, njte
  909. cj = jpos + (nj-1) / nrj ! j coord of CD point
  910. jp = mod ( nj , nrj ) ! coord of ND w/i CD point
  911. DO n

Large files files are truncated, but you can click here to view the full file