1 !WRF:MEDIATION_LAYER:INTERPOLATIONFUNCTION
9 ! Note, NMM-specific routines moved to end. 20080612. JM
11 SUBROUTINE interp_fcn ( cfld, & ! CD field
12 cids, cide, ckds, ckde, cjds, cjde, &
13 cims, cime, ckms, ckme, cjms, cjme, &
14 cits, cite, ckts, ckte, cjts, cjte, &
16 nids, nide, nkds, nkde, njds, njde, &
17 nims, nime, nkms, nkme, njms, njme, &
18 nits, nite, nkts, nkte, njts, njte, &
19 shw, & ! stencil half width for interp
20 imask, & ! interpolation mask
21 xstag, ystag, & ! staggering of field
22 ipos, jpos, & ! Position of lower left of nest in CD
23 nri, nrj ) ! nest ratios
29 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
30 cims, cime, ckms, ckme, cjms, cjme, &
31 cits, cite, ckts, ckte, cjts, cjte, &
32 nids, nide, nkds, nkde, njds, njde, &
33 nims, nime, nkms, nkme, njms, njme, &
34 nits, nite, nkts, nkte, njts, njte, &
38 LOGICAL, INTENT(IN) :: xstag, ystag
40 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
41 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
42 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
48 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, nioff, njoff
53 REAL psca(cims:cime,cjms:cjme,nri*nrj)
54 LOGICAL icmask( cims:cime, cjms:cjme )
59 ! Iterate over the ND tile and compute the values
80 !$OMP PRIVATE ( i,j,k,ni,nj,ci,cj,ip,jp,nk,ck,nf,icmask,psca )
85 nj = (j-jpos) * nrj + ( nrjo2 + 1 ) ! j point on nest
87 ni = (i-ipos) * nri + ( nrio2 + 1 ) ! i point on nest
88 if ( ni .ge. nits-nioff-nrio2 .and. &
89 ni .le. nite+nioff+nrio2 .and. &
90 nj .ge. njts-njoff-nrjo2 .and. &
91 nj .le. njte+njoff+nrjo2 ) then
92 ! if ( imask(ni,nj) .eq. 1 .or. imask(ni-nioff,nj-njoff) .eq. 1 ) then
93 ! icmask( i, j ) = .TRUE.
95 if ( ni.ge.nims.and.ni.le.nime.and.nj.ge.njms.and.nj.le.njme) then
96 if ( imask(ni,nj) .eq. 1 ) then
97 icmask( i, j ) = .TRUE.
100 if ( ni-nioff.ge.nims.and.ni.le.nime.and.nj-njoff.ge.njms.and.nj.le.njme) then
101 if (ni .ge. nits-nioff .and. nj .ge. njts-njoff ) then
102 if ( imask(ni-nioff,nj-njoff) .eq. 1) then
103 icmask( i, j ) = .TRUE.
108 psca(i,j,nf) = cfld(i,k,j)
113 ! tile dims in this call to sint are 1-over to account for the fact
114 ! that the number of cells on the nest local subdomain is not
115 ! necessarily a multiple of the nest ratio in a given dim.
116 ! this could be a little less ham-handed.
121 cims, cime, cjms, cjme, icmask, &
122 cits-1, cite+1, cjts-1, cjte+1, nrj*nri, xstag, ystag )
124 !call end_timing( ' sint ' )
126 DO nj = njts, njte+joff
127 cj = jpos + (nj-1) / nrj ! j coord of CD point
128 jp = mod ( nj-1 , nrj ) ! coord of ND w/i CD point
131 DO ni = nits, nite+ioff
132 ci = ipos + (ni-1) / nri ! i coord of CD point
133 ip = mod ( ni-1 , nri ) ! coord of ND w/i CD point
134 if ( imask ( ni, nj ) .eq. 1 .or. imask ( ni-ioff, nj-joff ) .eq. 1 ) then
135 nfld( ni-ioff, nk, nj-joff ) = psca( ci , cj, ip+1 + (jp)*nri )
140 !$OMP END PARALLEL DO
144 !write(0,'(") cims:cime, ckms:ckme, cjms:cjme ",6i4)')cims,cime, ckms,ckme, cjms,cjme
145 !write(0,'(") nims:nime, nkms:nkme, njms:njme ",6i4)')nims,nime, nkms,nkme, njms,njme
146 !write(0,'(") cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte
147 !write(0,'(") nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte
150 cj = jpos + (nj-1) / nrj ! j coord of CD point
151 jp = mod ( nj , nrj ) ! coord of ND w/i CD point
155 ci = ipos + (ni-1) / nri ! j coord of CD point
156 ip = mod ( ni , nri ) ! coord of ND w/i CD point
157 ! This is a trivial implementation of the interp_fcn; just copies
158 ! the values from the CD into the ND
159 if ( imask ( ni, nj ) .eq. 1 ) then
160 nfld( ni, nk, nj ) = cfld( ci , ck , cj )
169 END SUBROUTINE interp_fcn
171 !==================================
172 ! this is the default function used in feedback.
174 SUBROUTINE copy_fcn ( cfld, & ! CD field
175 cids, cide, ckds, ckde, cjds, cjde, &
176 cims, cime, ckms, ckme, cjms, cjme, &
177 cits, cite, ckts, ckte, cjts, cjte, &
179 nids, nide, nkds, nkde, njds, njde, &
180 nims, nime, nkms, nkme, njms, njme, &
181 nits, nite, nkts, nkte, njts, njte, &
182 shw, & ! stencil half width for interp
183 imask, & ! interpolation mask
184 xstag, ystag, & ! staggering of field
185 ipos, jpos, & ! Position of lower left of nest in CD
186 nri, nrj ) ! nest ratios
191 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
192 cims, cime, ckms, ckme, cjms, cjme, &
193 cits, cite, ckts, ckte, cjts, cjte, &
194 nids, nide, nkds, nkde, njds, njde, &
195 nims, nime, nkms, nkme, njms, njme, &
196 nits, nite, nkts, nkte, njts, njte, &
200 LOGICAL, INTENT(IN) :: xstag, ystag
202 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
203 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ),INTENT(IN) :: nfld
204 INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask
208 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
209 INTEGER :: icmin,icmax,jcmin,jcmax
210 INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
211 INTEGER , PARAMETER :: passes = 2
214 ! Loop over the coarse grid in the area of the fine mesh. Do not
215 ! process the coarse grid values that are along the lateral BC
216 ! provided to the fine grid. Since that is in the specified zone
217 ! for the fine grid, it should not be used in any feedback to the
218 ! coarse grid as it should not have changed.
220 ! Due to peculiarities of staggering, it is simpler to handle the feedback
221 ! for the staggerings based upon whether it is a even ratio (2::1, 4::1, etc.) or
222 ! an odd staggering ratio (3::1, 5::1, etc.).
224 ! Though there are separate grid ratios for the i and j directions, this code
225 ! is not general enough to handle aspect ratios .NE. 1 for the fine grid cell.
227 ! These are local integer increments in the looping. Basically, istag=1 means
228 ! that we will assume one less point in the i direction. Note that ci and cj
229 ! have a maximum value that is decreased by istag and jstag, respectively.
231 ! Horizontal momentum feedback is along the face, not within the cell. For a
232 ! 3::1 ratio, temperature would use 9 pts for feedback, while u and v use
233 ! only 3 points for feedback from the nest to the parent.
235 CALL nl_get_spec_zone( 1 , spec_zone )
236 istag = 1 ; jstag = 1
237 IF ( xstag ) istag = 0
238 IF ( ystag ) jstag = 0
240 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
242 IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN
243 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
244 nj = (cj-jpos)*nrj + jstag + 1
247 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
248 ni = (ci-ipos)*nri + istag + 1
249 cfld( ci, ck, cj ) = 0.
250 DO ijpoints = 1 , nri * nrj
251 ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
252 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
253 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
254 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints )
256 ! cfld( ci, ck, cj ) = 1./9. * &
257 ! ( nfld( ni-1, nk , nj-1) + &
258 ! nfld( ni , nk , nj-1) + &
259 ! nfld( ni+1, nk , nj-1) + &
260 ! nfld( ni-1, nk , nj ) + &
261 ! nfld( ni , nk , nj ) + &
262 ! nfld( ni+1, nk , nj ) + &
263 ! nfld( ni-1, nk , nj+1) + &
264 ! nfld( ni , nk , nj+1) + &
265 ! nfld( ni+1, nk , nj+1) )
270 ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN
271 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
272 nj = (cj-jpos)*nrj + jstag + 1
275 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
276 ni = (ci-ipos)*nri + istag + 1
277 cfld( ci, ck, cj ) = 0.
278 DO ijpoints = (nri+1)/2 , (nri+1)/2 + nri*(nri-1) , nri
279 ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
280 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
281 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
282 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
284 ! cfld( ci, ck, cj ) = 1./3. * &
285 ! ( nfld( ni , nk , nj-1) + &
286 ! nfld( ni , nk , nj ) + &
287 ! nfld( ni , nk , nj+1) )
292 ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN
293 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
294 nj = (cj-jpos)*nrj + jstag + 1
297 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
298 ni = (ci-ipos)*nri + istag + 1
299 cfld( ci, ck, cj ) = 0.
300 DO ijpoints = ( nrj*nrj +1 )/2 - nrj/2 , ( nrj*nrj +1 )/2 - nrj/2 + nrj-1
301 ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1
302 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1
303 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
304 1./REAL( nrj) * nfld( ni+ipoints , nk , nj+jpoints )
306 ! cfld( ci, ck, cj ) = 1./3. * &
307 ! ( nfld( ni-1, nk , nj ) + &
308 ! nfld( ni , nk , nj ) + &
309 ! nfld( ni+1, nk , nj ) )
316 ! Even refinement ratio
318 ELSE IF ( MOD(nrj,2) .EQ. 0) THEN
319 IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN
321 ! This is a simple schematic of the feedback indexing used in the even
322 ! ratio nests. For simplicity, a 2::1 ratio is depicted. Only the
323 ! mass variable staggering is shown.
325 ! the boxes with a "T" and four small "t" represents a coarse grid (CG)
326 ! cell, that is composed of four (2::1 ratio) fine grid (FG) cells.
328 ! Shown below is the area of the CG that is in the area of the FG. The
329 ! first grid point of the depicted CG is the starting location of the nest
330 ! in the parent domain (ipos,jpos - i_parent_start and j_parent_start from
333 ! For each of the CG points, the feedback loop is over each of the FG points
334 ! within the CG cell. For a 2::1 ratio, there are four total points (this is
335 ! the ijpoints loop). The feedback value to the CG is the arithmetic mean of
336 ! all of the FG values within each CG cell.
338 ! |-------------||-------------| |-------------||-------------|
339 ! | t t || t t | | t t || t t |
340 ! jpos+ | || | | || |
341 ! (njde-njds)- | T || T | | T || T |
342 ! jstag | || | | || |
343 ! | t t || t t | | t t || t t |
344 ! |-------------||-------------| |-------------||-------------|
345 ! |-------------||-------------| |-------------||-------------|
346 ! | t t || t t | | t t || t t |
348 ! | T || T | | T || T |
350 ! | t t || t t | | t t || t t |
351 ! |-------------||-------------| |-------------||-------------|
359 ! |-------------||-------------| |-------------||-------------|
360 ! jpoints = 1 | t t || t t | | t t || t t |
362 ! | T || T | | T || T |
364 ! jpoints = 0, | t t || t t | | t t || t t |
365 ! nj=3 |-------------||-------------| |-------------||-------------|
366 ! |-------------||-------------| |-------------||-------------|
367 ! jpoints = 1 | t t || t t | | t t || t t |
369 ! jpos | T || T | ... | T || T |
371 ! jpoints = 0, | t t || t t | ... | t t || t t |
372 ! nj=1 |-------------||-------------| |-------------||-------------|
377 ! ni = 1 3 (nide-nids)/nri
378 ! ipoints= 0 1 0 1 -istag
381 ! For performance benefits, users can comment out the inner most loop (and cfld=0) and
382 ! hardcode the loop feedback. For example, it is set up to run a 2::1 ratio
383 ! if uncommented. This lacks generality, but is likely to gain timing benefits
384 ! with compilers unable to unroll inner loops that do not have parameterized sizes.
386 ! The extra +1 ---------/ and the extra -1 ----\ (both for ci and cj)
387 ! / \ keeps the feedback out of the
388 ! / \ outer row/col, since that CG data
389 ! / \ specified the nest boundary originally
392 ! / \ a sentence to not end a line
393 ! / \ with a stupid backslash
394 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
395 nj = (cj-jpos)*nrj + jstag
398 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
399 ni = (ci-ipos)*nri + istag
400 cfld( ci, ck, cj ) = 0.
401 DO ijpoints = 1 , nri * nrj
402 ipoints = MOD((ijpoints-1),nri)
403 jpoints = (ijpoints-1)/nri
404 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
405 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints )
407 ! cfld( ci, ck, cj ) = 1./4. * &
408 ! ( nfld( ni , nk , nj ) + &
409 ! nfld( ni+1, nk , nj ) + &
410 ! nfld( ni , nk , nj+1) + &
411 ! nfld( ni+1, nk , nj+1) )
418 ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN
446 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
447 nj = (cj-jpos)*nrj + 1
450 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
451 ni = (ci-ipos)*nri + 1
452 cfld( ci, ck, cj ) = 0.
453 DO ijpoints = 1 , nri*nrj , nri
454 ipoints = MOD((ijpoints-1),nri)
455 jpoints = (ijpoints-1)/nri
456 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
457 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
459 ! cfld( ci, ck, cj ) = 1./2. * &
460 ! ( nfld( ni , nk , nj ) + &
461 ! nfld( ni , nk , nj+1) )
468 ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN
469 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
470 nj = (cj-jpos)*nrj + 1
473 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
474 ni = (ci-ipos)*nri + 1
475 cfld( ci, ck, cj ) = 0.
476 DO ijpoints = 1 , nri
477 ipoints = MOD((ijpoints-1),nri)
478 jpoints = (ijpoints-1)/nri
479 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + &
480 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints )
482 ! cfld( ci, ck, cj ) = 1./2. * &
483 ! ( nfld( ni , nk , nj ) + &
484 ! nfld( ni+1, nk , nj ) )
493 END SUBROUTINE copy_fcn
495 !==================================
496 ! this is the 1pt function used in feedback.
498 SUBROUTINE copy_fcnm ( cfld, & ! CD field
499 cids, cide, ckds, ckde, cjds, cjde, &
500 cims, cime, ckms, ckme, cjms, cjme, &
501 cits, cite, ckts, ckte, cjts, cjte, &
503 nids, nide, nkds, nkde, njds, njde, &
504 nims, nime, nkms, nkme, njms, njme, &
505 nits, nite, nkts, nkte, njts, njte, &
506 shw, & ! stencil half width for interp
507 imask, & ! interpolation mask
508 xstag, ystag, & ! staggering of field
509 ipos, jpos, & ! Position of lower left of nest in CD
510 nri, nrj ) ! nest ratios
516 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
517 cims, cime, ckms, ckme, cjms, cjme, &
518 cits, cite, ckts, ckte, cjts, cjte, &
519 nids, nide, nkds, nkde, njds, njde, &
520 nims, nime, nkms, nkme, njms, njme, &
521 nits, nite, nkts, nkte, njts, njte, &
525 LOGICAL, INTENT(IN) :: xstag, ystag
527 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
528 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld
529 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
533 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
534 INTEGER :: icmin,icmax,jcmin,jcmax
535 INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
536 INTEGER , PARAMETER :: passes = 2
539 CALL nl_get_spec_zone( 1, spec_zone )
540 istag = 1 ; jstag = 1
541 IF ( xstag ) istag = 0
542 IF ( ystag ) jstag = 0
544 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
546 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
547 nj = (cj-jpos)*nrj + jstag + 1
550 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
551 ni = (ci-ipos)*nri + istag + 1
552 cfld( ci, ck, cj ) = nfld( ni , nk , nj )
557 ELSE ! even refinement ratio, pick nearest neighbor on SW corner
558 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
559 nj = (cj-jpos)*nrj + 1
562 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
563 ni = (ci-ipos)*nri + 1
566 cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints )
575 END SUBROUTINE copy_fcnm
577 !==================================
578 ! this is the 1pt function used in feedback for integers
580 SUBROUTINE copy_fcni ( cfld, & ! CD field
581 cids, cide, ckds, ckde, cjds, cjde, &
582 cims, cime, ckms, ckme, cjms, cjme, &
583 cits, cite, ckts, ckte, cjts, cjte, &
585 nids, nide, nkds, nkde, njds, njde, &
586 nims, nime, nkms, nkme, njms, njme, &
587 nits, nite, nkts, nkte, njts, njte, &
588 shw, & ! stencil half width for interp
589 imask, & ! interpolation mask
590 xstag, ystag, & ! staggering of field
591 ipos, jpos, & ! Position of lower left of nest in CD
592 nri, nrj ) ! nest ratios
598 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
599 cims, cime, ckms, ckme, cjms, cjme, &
600 cits, cite, ckts, ckte, cjts, cjte, &
601 nids, nide, nkds, nkde, njds, njde, &
602 nims, nime, nkms, nkme, njms, njme, &
603 nits, nite, nkts, nkte, njts, njte, &
607 LOGICAL, INTENT(IN) :: xstag, ystag
609 INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
610 INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld
611 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
615 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
616 INTEGER :: icmin,icmax,jcmin,jcmax
617 INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
618 INTEGER , PARAMETER :: passes = 2
621 CALL nl_get_spec_zone( 1, spec_zone )
622 istag = 1 ; jstag = 1
623 IF ( xstag ) istag = 0
624 IF ( ystag ) jstag = 0
626 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio
628 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
629 nj = (cj-jpos)*nrj + jstag + 1
632 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
633 ni = (ci-ipos)*nri + istag + 1
634 cfld( ci, ck, cj ) = nfld( ni , nk , nj )
639 ELSE ! even refinement ratio
640 DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte)
641 nj = (cj-jpos)*nrj + 1
644 DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite)
645 ni = (ci-ipos)*nri + 1
648 cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints )
657 END SUBROUTINE copy_fcni
659 !==================================
661 SUBROUTINE p2c ( cfld, & ! CD field
662 cids, cide, ckds, ckde, cjds, cjde, &
663 cims, cime, ckms, ckme, cjms, cjme, &
664 cits, cite, ckts, ckte, cjts, cjte, &
666 nids, nide, nkds, nkde, njds, njde, &
667 nims, nime, nkms, nkme, njms, njme, &
668 nits, nite, nkts, nkte, njts, njte, &
669 shw, & ! stencil half width
670 imask, & ! interpolation mask
671 xstag, ystag, & ! staggering of field
672 ipos, jpos, & ! Position of lower left of nest in CD
673 nri, nrj & ! nest ratios
678 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
679 cims, cime, ckms, ckme, cjms, cjme, &
680 cits, cite, ckts, ckte, cjts, cjte, &
681 nids, nide, nkds, nkde, njds, njde, &
682 nims, nime, nkms, nkme, njms, njme, &
683 nits, nite, nkts, nkte, njts, njte, &
688 LOGICAL, INTENT(IN) :: xstag, ystag
690 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
691 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
692 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
694 CALL interp_fcn (cfld, & ! CD field
695 cids, cide, ckds, ckde, cjds, cjde, &
696 cims, cime, ckms, ckme, cjms, cjme, &
697 cits, cite, ckts, ckte, cjts, cjte, &
699 nids, nide, nkds, nkde, njds, njde, &
700 nims, nime, nkms, nkme, njms, njme, &
701 nits, nite, nkts, nkte, njts, njte, &
702 shw, & ! stencil half width for interp
703 imask, & ! interpolation mask
704 xstag, ystag, & ! staggering of field
705 ipos, jpos, & ! Position of lower left of nest in CD
706 nri, nrj ) ! nest ratios
710 !==================================
712 SUBROUTINE bdy_interp ( cfld, & ! CD field
713 cids, cide, ckds, ckde, cjds, cjde, &
714 cims, cime, ckms, ckme, cjms, cjme, &
715 cits, cite, ckts, ckte, cjts, cjte, &
717 nids, nide, nkds, nkde, njds, njde, &
718 nims, nime, nkms, nkme, njms, njme, &
719 nits, nite, nkts, nkte, njts, njte, &
720 shw, & ! stencil half width
721 imask, & ! interpolation mask
722 xstag, ystag, & ! staggering of field
723 ipos, jpos, & ! Position of lower left of nest in CD
724 nri, nrj, & ! nest ratios
729 cbdy_txs, nbdy_txs, &
730 cbdy_txe, nbdy_txe, &
731 cbdy_tys, nbdy_tys, &
732 cbdy_tye, nbdy_tye, &
738 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
739 cims, cime, ckms, ckme, cjms, cjme, &
740 cits, cite, ckts, ckte, cjts, cjte, &
741 nids, nide, nkds, nkde, njds, njde, &
742 nims, nime, nkms, nkme, njms, njme, &
743 nits, nite, nkts, nkte, njts, njte, &
748 LOGICAL, INTENT(IN) :: xstag, ystag
750 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
751 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
752 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
753 REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs, nbdy_xs, nbdy_txs
754 REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe, nbdy_xe, nbdy_txe
755 REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys, nbdy_ys, nbdy_tys
756 REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye, nbdy_ye, nbdy_tye
761 INTEGER nijds, nijde, spec_bdy_width
763 nijds = min(nids, njds)
764 nijde = max(nide, njde)
765 CALL nl_get_spec_bdy_width( 1, spec_bdy_width )
767 CALL bdy_interp1( cfld, & ! CD field
768 cids, cide, ckds, ckde, cjds, cjde, &
769 cims, cime, ckms, ckme, cjms, cjme, &
770 cits, cite, ckts, ckte, cjts, cjte, &
772 nijds, nijde , spec_bdy_width , &
773 nids, nide, nkds, nkde, njds, njde, &
774 nims, nime, nkms, nkme, njms, njme, &
775 nits, nite, nkts, nkte, njts, njte, &
777 xstag, ystag, & ! staggering of field
778 ipos, jpos, & ! Position of lower left of nest in CD
784 cbdy_txs, nbdy_txs, &
785 cbdy_txe, nbdy_txe, &
786 cbdy_tys, nbdy_tys, &
787 cbdy_tye, nbdy_tye, &
793 END SUBROUTINE bdy_interp
795 SUBROUTINE bdy_interp1( cfld, & ! CD field
796 cids, cide, ckds, ckde, cjds, cjde, &
797 cims, cime, ckms, ckme, cjms, cjme, &
798 cits, cite, ckts, ckte, cjts, cjte, &
800 nijds, nijde, spec_bdy_width , &
801 nids, nide, nkds, nkde, njds, njde, &
802 nims, nime, nkms, nkme, njms, njme, &
803 nits, nite, nkts, nkte, njts, njte, &
805 imask, & ! interpolation mask
806 xstag, ystag, & ! staggering of field
807 ipos, jpos, & ! Position of lower left of nest in CD
821 use module_state_description
824 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
825 cims, cime, ckms, ckme, cjms, cjme, &
826 cits, cite, ckts, ckte, cjts, cjte, &
827 nids, nide, nkds, nkde, njds, njde, &
828 nims, nime, nkms, nkme, njms, njme, &
829 nits, nite, nkts, nkte, njts, njte, &
833 INTEGER, INTENT(IN) :: nijds, nijde, spec_bdy_width
834 LOGICAL, INTENT(IN) :: xstag, ystag
836 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld
837 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(INOUT) :: nfld
838 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
839 REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs ! not used
840 REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe ! not used
841 REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys ! not used
842 REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye ! not used
844 REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xs, bdy_txs
845 REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xe, bdy_txe
846 REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ys, bdy_tys
847 REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ye, bdy_tye
852 INTEGER ci, cj, ck, ni, nj, nk, ni1, nj1, nk1, ip, jp, ioff, joff
857 REAL psca1(cims:cime,cjms:cjme,nri*nrj)
858 REAL psca(cims:cime,cjms:cjme,nri*nrj)
859 LOGICAL icmask( cims:cime, cjms:cjme )
869 ! statement functions for converting a nest index to coarse
870 n2ci(n) = (n+ipos*nri-1)/nri
871 n2cj(n) = (n+jpos*nrj-1)/nrj
885 ! Iterate over the ND tile and compute the values
889 CALL nl_get_spec_zone( 1, spec_zone )
890 CALL nl_get_relax_zone( 1, relax_zone )
891 sz = MIN(MAX( spec_zone, relax_zone + 1 ),spec_bdy_width)
896 !$OMP PRIVATE ( i,j,k,ni,nj,ni1,nj1,ci,cj,ip,jp,nk,ck,nf,icmask,psca,psca1 )
901 nj = (j-jpos) * nrj + ( nrj / 2 + 1 ) ! j point on nest
903 ni = (i-ipos) * nri + ( nri / 2 + 1 ) ! i point on nest
904 psca1(i,j,nf) = cfld(i,k,j)
908 ! hopefully less ham handed but still correct and more efficient
909 ! sintb ignores icmask so it does not matter that icmask is not set
912 IF ( njts .ge. njds .and. njts .le. njds + sz + joff ) THEN
913 CALL sintb( psca1, psca, &
914 cims, cime, cjms, cjme, icmask, &
915 n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njds)), n2cj(MIN(njte,njds+sz+joff)), nrj*nri, xstag, ystag )
918 IF ( njte .le. njde .and. njte .ge. njde - sz - joff ) THEN
919 CALL sintb( psca1, psca, &
920 cims, cime, cjms, cjme, icmask, &
921 n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njde-sz-joff)), n2cj(MIN(njte,njde-1+joff)), nrj*nri, xstag, ystag )
924 IF ( nits .ge. nids .and. nits .le. nids + sz + ioff ) THEN
925 CALL sintb( psca1, psca, &
926 cims, cime, cjms, cjme, icmask, &
927 n2ci(MAX(nits,nids)), n2ci(MIN(nite,nids+sz+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag )
930 IF ( nite .le. nide .and. nite .ge. nide - sz - ioff ) THEN
931 CALL sintb( psca1, psca, &
932 cims, cime, cjms, cjme, icmask, &
933 n2ci(MAX(nits,nide-sz-ioff)), n2ci(MIN(nite,nide-1+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag )
936 DO nj1 = MAX(njds,njts-1), MIN(njde+joff,njte+joff+1)
937 cj = jpos + (nj1-1) / nrj ! j coord of CD point
938 jp = mod ( nj1-1 , nrj ) ! coord of ND w/i CD point
941 DO ni1 = MAX(nids,nits-1), MIN(nide+ioff,nite+ioff+1)
942 ci = ipos + (ni1-1) / nri ! j coord of CD point
943 ip = mod ( ni1-1 , nri ) ! coord of ND w/i CD point
948 IF ( ( ni.LT.nids) .OR. (nj.LT.njds) ) THEN
952 !bdy contains the value at t-dt. psca contains the value at t
953 !compute dv/dt and store in bdy_t
954 !afterwards store the new value of v at t into bdy
956 IF ( ni .ge. nids .and. ni .lt. nids + sz ) THEN
957 bdy_txs( nj,k,ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
958 bdy_xs( nj,k,ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
962 IF ( nj .ge. njds .and. nj .lt. njds + sz ) THEN
963 bdy_tys( ni,k,nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
964 bdy_ys( ni,k,nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
969 IF ( ni .ge. nide - sz + 1 .AND. ni .le. nide ) THEN
970 bdy_txe( nj,k,nide-ni+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
971 bdy_xe( nj,k,nide-ni+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
974 IF ( ni .ge. nide - sz .AND. ni .le. nide-1 ) THEN
975 bdy_txe( nj,k,nide-ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
976 bdy_xe( nj,k,nide-ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
982 IF ( nj .ge. njde - sz + 1 .AND. nj .le. njde ) THEN
983 bdy_tye( ni,k,njde-nj+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
984 bdy_ye( ni,k,njde-nj+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
987 IF ( nj .ge. njde - sz .AND. nj .le. njde-1 ) THEN
988 bdy_tye(ni,k,njde-nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj))
989 bdy_ye( ni,k,njde-nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri )
996 !$OMP END PARALLEL DO
1001 END SUBROUTINE bdy_interp1
1005 SUBROUTINE interp_fcni( cfld, & ! CD field
1006 cids, cide, ckds, ckde, cjds, cjde, &
1007 cims, cime, ckms, ckme, cjms, cjme, &
1008 cits, cite, ckts, ckte, cjts, cjte, &
1010 nids, nide, nkds, nkde, njds, njde, &
1011 nims, nime, nkms, nkme, njms, njme, &
1012 nits, nite, nkts, nkte, njts, njte, &
1013 shw, & ! stencil half width
1014 imask, & ! interpolation mask
1015 xstag, ystag, & ! staggering of field
1016 ipos, jpos, & ! Position of lower left of nest in CD
1017 nri, nrj ) ! nest ratios
1018 USE module_configure
1022 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1023 cims, cime, ckms, ckme, cjms, cjme, &
1024 cits, cite, ckts, ckte, cjts, cjte, &
1025 nids, nide, nkds, nkde, njds, njde, &
1026 nims, nime, nkms, nkme, njms, njme, &
1027 nits, nite, nkts, nkte, njts, njte, &
1031 LOGICAL, INTENT(IN) :: xstag, ystag
1033 INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1034 INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
1035 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
1039 INTEGER ci, cj, ck, ni, nj, nk, ip, jp
1041 ! Iterate over the ND tile and compute the values
1044 !write(0,'("cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte
1045 !write(0,'("nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte
1048 cj = jpos + (nj-1) / nrj ! j coord of CD point
1049 jp = mod ( nj , nrj ) ! coord of ND w/i CD point
1053 ci = ipos + (ni-1) / nri ! j coord of CD point
1054 ip = mod ( ni , nri ) ! coord of ND w/i CD point
1055 ! This is a trivial implementation of the interp_fcn; just copies
1056 ! the values from the CD into the ND
1057 nfld( ni, nk, nj ) = cfld( ci , ck , cj )
1064 END SUBROUTINE interp_fcni
1066 SUBROUTINE interp_fcnm( cfld, & ! CD field
1067 cids, cide, ckds, ckde, cjds, cjde, &
1068 cims, cime, ckms, ckme, cjms, cjme, &
1069 cits, cite, ckts, ckte, cjts, cjte, &
1071 nids, nide, nkds, nkde, njds, njde, &
1072 nims, nime, nkms, nkme, njms, njme, &
1073 nits, nite, nkts, nkte, njts, njte, &
1074 shw, & ! stencil half width
1075 imask, & ! interpolation mask
1076 xstag, ystag, & ! staggering of field
1077 ipos, jpos, & ! Position of lower left of nest in CD
1078 nri, nrj ) ! nest ratios
1079 USE module_configure
1083 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1084 cims, cime, ckms, ckme, cjms, cjme, &
1085 cits, cite, ckts, ckte, cjts, cjte, &
1086 nids, nide, nkds, nkde, njds, njde, &
1087 nims, nime, nkms, nkme, njms, njme, &
1088 nits, nite, nkts, nkte, njts, njte, &
1092 LOGICAL, INTENT(IN) :: xstag, ystag
1094 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1095 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
1096 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
1100 INTEGER ci, cj, ck, ni, nj, nk, ip, jp
1102 ! Iterate over the ND tile and compute the values
1105 !write(0,'("mask cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte
1106 !write(0,'("mask nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte
1109 cj = jpos + (nj-1) / nrj ! j coord of CD point
1110 jp = mod ( nj , nrj ) ! coord of ND w/i CD point
1114 ci = ipos + (ni-1) / nri ! j coord of CD point
1115 ip = mod ( ni , nri ) ! coord of ND w/i CD point
1116 ! This is a trivial implementation of the interp_fcn; just copies
1117 ! the values from the CD into the ND
1118 nfld( ni, nk, nj ) = cfld( ci , ck , cj )
1125 END SUBROUTINE interp_fcnm
1127 SUBROUTINE interp_mask_land_field ( enable, & ! says whether to allow interpolation or just the bcasts
1129 cids, cide, ckds, ckde, cjds, cjde, &
1130 cims, cime, ckms, ckme, cjms, cjme, &
1131 cits, cite, ckts, ckte, cjts, cjte, &
1133 nids, nide, nkds, nkde, njds, njde, &
1134 nims, nime, nkms, nkme, njms, njme, &
1135 nits, nite, nkts, nkte, njts, njte, &
1136 shw, & ! stencil half width
1137 imask, & ! interpolation mask
1138 xstag, ystag, & ! staggering of field
1139 ipos, jpos, & ! Position of lower left of nest in CD
1140 nri, nrj, & ! nest ratios
1143 USE module_configure
1144 USE module_wrf_error
1149 LOGICAL, INTENT(IN) :: enable
1150 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1151 cims, cime, ckms, ckme, cjms, cjme, &
1152 cits, cite, ckts, ckte, cjts, cjte, &
1153 nids, nide, nkds, nkde, njds, njde, &
1154 nims, nime, nkms, nkme, njms, njme, &
1155 nits, nite, nkts, nkte, njts, njte, &
1159 LOGICAL, INTENT(IN) :: xstag, ystag
1161 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1162 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
1163 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
1165 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu
1166 REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu
1170 INTEGER ci, cj, ck, ni, nj, nk, ip, jp
1171 INTEGER :: icount , ii , jj , ist , ien , jst , jen , iswater
1172 REAL :: avg , sum , dx , dy
1173 INTEGER , PARAMETER :: max_search = 5
1174 CHARACTER*120 message
1176 ! Find out what the water value is.
1178 CALL nl_get_iswater(1,iswater)
1180 ! Right now, only mass point locations permitted.
1182 IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN
1184 ! Loop over each i,k,j in the nested domain.
1189 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1190 cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1192 cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1197 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1198 ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1200 ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1207 ! (ci,cj+1) (ci+1,cj+1)
1221 ! For odd ratios, at (nri+1)/2, we are on the coarse grid point, so dx = 0
1223 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1224 dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri )
1226 dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri )
1228 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1229 dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj )
1231 dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj )
1234 ! This is a "land only" field. If this is a water point, no operations required.
1236 IF ( ( NINT(nlu(ni ,nj )) .EQ. iswater ) ) THEN
1237 nfld(ni,nk,nj) = cfld(ci ,ck,cj )
1239 ! If this is a nested land point, and the surrounding coarse values are all land points,
1240 ! then this is a simple 4-pt interpolation.
1242 ELSE IF ( ( NINT(nlu(ni ,nj )) .NE. iswater ) .AND. &
1243 ( NINT(clu(ci ,cj )) .NE. iswater ) .AND. &
1244 ( NINT(clu(ci+1,cj )) .NE. iswater ) .AND. &
1245 ( NINT(clu(ci ,cj+1)) .NE. iswater ) .AND. &
1246 ( NINT(clu(ci+1,cj+1)) .NE. iswater ) ) THEN
1247 nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + &
1248 dy * cfld(ci ,ck,cj+1) ) + &
1249 dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + &
1250 dy * cfld(ci+1,ck,cj+1) )
1252 ! If this is a nested land point and there are NO coarse land values surrounding,
1253 ! we temporarily punt.
1255 ELSE IF ( ( NINT(nlu(ni ,nj )) .NE. iswater ) .AND. &
1256 ( NINT(clu(ci ,cj )) .EQ. iswater ) .AND. &
1257 ( NINT(clu(ci+1,cj )) .EQ. iswater ) .AND. &
1258 ( NINT(clu(ci ,cj+1)) .EQ. iswater ) .AND. &
1259 ( NINT(clu(ci+1,cj+1)) .EQ. iswater ) ) THEN
1262 ! If there are some water points and some land points, take an average.
1264 ELSE IF ( NINT(nlu(ni ,nj )) .NE. iswater ) THEN
1267 IF ( NINT(clu(ci ,cj )) .NE. iswater ) THEN
1269 sum = sum + cfld(ci ,ck,cj )
1271 IF ( NINT(clu(ci+1,cj )) .NE. iswater ) THEN
1273 sum = sum + cfld(ci+1,ck,cj )
1275 IF ( NINT(clu(ci ,cj+1)) .NE. iswater ) THEN
1277 sum = sum + cfld(ci ,ck,cj+1)
1279 IF ( NINT(clu(ci+1,cj+1)) .NE. iswater ) THEN
1281 sum = sum + cfld(ci+1,ck,cj+1)
1283 nfld(ni,nk,nj) = sum / REAL ( icount )
1290 ! Get an average of the whole domain for problem locations.
1297 IF ( nfld(ni,nk,nj) .NE. -1 ) THEN
1299 sum = sum + nfld(ni,nk,nj)
1308 CALL wrf_dm_bcast_real( sum, 1 )
1309 CALL wrf_dm_bcast_integer( icount, 1 )
1311 IF ( icount .GT. 0 ) THEN
1312 avg = sum / REAL ( icount )
1314 ! OK, if there were any of those island situations, we try to search a bit broader
1315 ! of an area in the coarse grid.
1320 IF ( nfld(ni,nk,nj) .EQ. -1 ) THEN
1321 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1322 cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1324 cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1326 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1327 ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1329 ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1331 ist = MAX (ci-max_search,cits)
1332 ien = MIN (ci+max_search,cite,cide-1)
1333 jst = MAX (cj-max_search,cjts)
1334 jen = MIN (cj+max_search,cjte,cjde-1)
1339 IF ( NINT(clu(ii,jj)) .NE. iswater ) THEN
1341 sum = sum + cfld(ii,nk,jj)
1345 IF ( icount .GT. 0 ) THEN
1346 nfld(ni,nk,nj) = sum / REAL ( icount )
1348 ! CALL wrf_error_fatal ( "horizontal interp error - island" )
1349 write(message,*) 'horizontal interp error - island, using average ', avg
1350 CALL wrf_message ( message )
1351 nfld(ni,nk,nj) = avg
1360 CALL wrf_error_fatal ( "only unstaggered fields right now" )
1363 END SUBROUTINE interp_mask_land_field
1365 SUBROUTINE interp_mask_water_field ( enable, & ! says whether to allow interpolation or just the bcasts
1367 cids, cide, ckds, ckde, cjds, cjde, &
1368 cims, cime, ckms, ckme, cjms, cjme, &
1369 cits, cite, ckts, ckte, cjts, cjte, &
1371 nids, nide, nkds, nkde, njds, njde, &
1372 nims, nime, nkms, nkme, njms, njme, &
1373 nits, nite, nkts, nkte, njts, njte, &
1374 shw, & ! stencil half width
1375 imask, & ! interpolation mask
1376 xstag, ystag, & ! staggering of field
1377 ipos, jpos, & ! Position of lower left of nest in CD
1378 nri, nrj, & ! nest ratios
1379 clu, nlu, cflag, nflag )
1381 USE module_configure
1382 USE module_wrf_error
1387 LOGICAL, INTENT(IN) :: enable
1388 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1389 cims, cime, ckms, ckme, cjms, cjme, &
1390 cits, cite, ckts, ckte, cjts, cjte, &
1391 nids, nide, nkds, nkde, njds, njde, &
1392 nims, nime, nkms, nkme, njms, njme, &
1393 nits, nite, nkts, nkte, njts, njte, &
1396 nri, nrj, cflag, nflag
1397 LOGICAL, INTENT(IN) :: xstag, ystag
1399 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1400 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
1401 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
1403 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu
1404 REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu
1408 INTEGER ci, cj, ck, ni, nj, nk, ip, jp
1409 INTEGER :: icount , ii , jj , ist , ien , jst , jen
1410 REAL :: avg , sum , dx , dy
1411 INTEGER , PARAMETER :: max_search = 5
1413 ! Right now, only mass point locations permitted.
1415 IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN
1418 ! Loop over each i,k,j in the nested domain.
1421 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1422 cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1424 cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1429 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1430 ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1432 ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1439 ! (ci,cj+1) (ci+1,cj+1)
1453 ! At ni=2, we are on the coarse grid point, so dx = 0
1455 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1456 dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri )
1458 dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri )
1460 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1461 dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj )
1463 dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj )
1466 ! This is a "water only" field. If this is a land point, no operations required.
1468 IF ( ( NINT(nlu(ni ,nj )) .NE. nflag ) ) THEN
1469 nfld(ni,nk,nj) = cfld(ci ,ck,cj )
1471 ! If this is a nested water point, and the surrounding coarse values are all water points,
1472 ! then this is a simple 4-pt interpolation.
1474 ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. nflag ) .AND. &
1475 ( NINT(clu(ci ,cj )) .EQ. nflag ) .AND. &
1476 ( NINT(clu(ci+1,cj )) .EQ. nflag ) .AND. &
1477 ( NINT(clu(ci ,cj+1)) .EQ. nflag ) .AND. &
1478 ( NINT(clu(ci+1,cj+1)) .EQ. nflag ) ) THEN
1479 nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + &
1480 dy * cfld(ci ,ck,cj+1) ) + &
1481 dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + &
1482 dy * cfld(ci+1,ck,cj+1) )
1484 ! If this is a nested water point and there are NO coarse water values surrounding,
1485 ! we temporarily punt.
1487 ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. nflag ) .AND. &
1488 ( NINT(clu(ci ,cj )) .NE. nflag ) .AND. &
1489 ( NINT(clu(ci+1,cj )) .NE. nflag ) .AND. &
1490 ( NINT(clu(ci ,cj+1)) .NE. nflag ) .AND. &
1491 ( NINT(clu(ci+1,cj+1)) .NE. nflag ) ) THEN
1494 ! If there are some land points and some water points, take an average.
1496 ELSE IF ( NINT(nlu(ni ,nj )) .EQ. nflag ) THEN
1499 IF ( NINT(clu(ci ,cj )) .EQ. nflag ) THEN
1501 sum = sum + cfld(ci ,ck,cj )
1503 IF ( NINT(clu(ci+1,cj )) .EQ. nflag ) THEN
1505 sum = sum + cfld(ci+1,ck,cj )
1507 IF ( NINT(clu(ci ,cj+1)) .EQ. nflag ) THEN
1509 sum = sum + cfld(ci ,ck,cj+1)
1511 IF ( NINT(clu(ci+1,cj+1)) .EQ. nflag ) THEN
1513 sum = sum + cfld(ci+1,ck,cj+1)
1515 nfld(ni,nk,nj) = sum / REAL ( icount )
1521 ! Get an average of the whole domain for problem locations.
1528 IF ( nfld(ni,nk,nj) .NE. -1 ) THEN
1530 sum = sum + nfld(ni,nk,nj)
1539 CALL wrf_dm_bcast_real( sum, 1 )
1540 CALL wrf_dm_bcast_integer( icount, 1 )
1542 IF ( icount .NE. 0 ) THEN
1543 avg = sum / REAL ( icount )
1546 ! OK, if there were any of those lake situations, we try to search a bit broader
1547 ! of an area in the coarse grid.
1552 IF ( nfld(ni,nk,nj) .EQ. -1 ) THEN
1553 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1554 cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1556 cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1558 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1559 ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1561 ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1563 ist = MAX (ci-max_search,cits)
1564 ien = MIN (ci+max_search,cite,cide-1)
1565 jst = MAX (cj-max_search,cjts)
1566 jen = MIN (cj+max_search,cjte,cjde-1)
1571 IF ( NINT(clu(ii,jj)) .EQ. nflag ) THEN
1573 sum = sum + cfld(ii,nk,jj)
1577 IF ( icount .GT. 0 ) THEN
1578 nfld(ni,nk,nj) = sum / REAL ( icount )
1580 ! CALL wrf_error_fatal ( "horizontal interp error - lake" )
1581 print *,'horizontal interp error - lake, using average ',avg
1582 nfld(ni,nk,nj) = avg
1591 CALL wrf_error_fatal ( "only unstaggered fields right now" )
1594 END SUBROUTINE interp_mask_water_field
1596 SUBROUTINE p2c_mask ( cfld, & ! CD field
1597 cids, cide, ckds, ckde, cjds, cjde, &
1598 cims, cime, ckms, ckme, cjms, cjme, &
1599 cits, cite, ckts, ckte, cjts, cjte, &
1601 nids, nide, nkds, nkde, njds, njde, &
1602 nims, nime, nkms, nkme, njms, njme, &
1603 nits, nite, nkts, nkte, njts, njte, &
1604 shw, & ! stencil half width
1605 imask, & ! interpolation mask
1606 xstag, ystag, & ! staggering of field
1607 ipos, jpos, & ! Position of lower left of nest in CD
1608 nri, nrj, & ! nest ratios
1609 clu, nlu, & ! land use categories
1610 ctslb,ntslb, & ! soil temps
1611 cnum_soil_layers,nnum_soil_layers, & ! number of soil layers for tslb
1612 ciswater, niswater ) ! iswater category
1614 USE module_configure
1615 USE module_wrf_error
1619 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1620 cims, cime, ckms, ckme, cjms, cjme, &
1621 cits, cite, ckts, ckte, cjts, cjte, &
1622 nids, nide, nkds, nkde, njds, njde, &
1623 nims, nime, nkms, nkme, njms, njme, &
1624 nits, nite, nkts, nkte, njts, njte, &
1628 cnum_soil_layers, nnum_soil_layers, &
1631 LOGICAL, INTENT(IN) :: xstag, ystag
1633 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1634 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
1635 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
1637 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu
1638 REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu
1640 REAL, DIMENSION ( cims:cime, 1:cnum_soil_layers, cjms:cjme ) :: ctslb
1641 REAL, DIMENSION ( nims:nime, 1:nnum_soil_layers, njms:njme ) :: ntslb
1645 INTEGER ci, cj, ck, ni, nj, nk
1647 REAL :: sum , dx , dy
1649 ! Right now, only mass point locations permitted.
1651 IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN
1653 ! Loop over each i,k,j in the nested domain.
1655 DO nj = njts, MIN(njde-1,njte)
1656 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1657 cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1659 cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point
1663 DO ni = nits, MIN(nide-1,nite)
1664 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1665 ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1667 ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point
1671 ! (ci,cj+1) (ci+1,cj+1)
1685 ! At ni=2, we are on the coarse grid point, so dx = 0
1687 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN
1688 dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri )
1690 dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri )
1692 IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN
1693 dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj )
1695 dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj )
1698 ! This is a "water only" field. If this is a land point, no operations required.
1700 IF ( ( NINT(nlu(ni ,nj )) .NE. niswater ) ) THEN
1701 nfld(ni,nk,nj) = 273.18
1703 ! If this is a nested water point, and the surrounding coarse values are all water points,
1704 ! then this is a simple 4-pt interpolation.
1706 ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. niswater ) .AND. &
1707 ( NINT(clu(ci ,cj )) .EQ. niswater ) .AND. &
1708 ( NINT(clu(ci+1,cj )) .EQ. niswater ) .AND. &
1709 ( NINT(clu(ci ,cj+1)) .EQ. niswater ) .AND. &
1710 ( NINT(clu(ci+1,cj+1)) .EQ. niswater ) ) THEN
1711 nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + &
1712 dy * cfld(ci ,ck,cj+1) ) + &
1713 dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + &
1714 dy * cfld(ci+1,ck,cj+1) )
1716 ! If this is a nested water point and there are NO coarse water values surrounding,
1717 ! we manufacture something from the deepest CG soil temp.
1719 ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. niswater ) .AND. &
1720 ( NINT(clu(ci ,cj )) .NE. niswater ) .AND. &
1721 ( NINT(clu(ci+1,cj )) .NE. niswater ) .AND. &
1722 ( NINT(clu(ci ,cj+1)) .NE. niswater ) .AND. &
1723 ( NINT(clu(ci+1,cj+1)) .NE. niswater ) ) THEN
1724 nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * ctslb(ci ,cnum_soil_layers,cj ) + &
1725 dy * ctslb(ci ,cnum_soil_layers,cj+1) ) + &
1726 dx * ( ( 1. - dy ) * ctslb(ci+1,cnum_soil_layers,cj ) + &
1727 dy * ctslb(ci+1,cnum_soil_layers,cj+1) )
1729 ! If there are some land points and some water points, take an average of the water points.
1731 ELSE IF ( NINT(nlu(ni ,nj )) .EQ. niswater ) THEN
1734 IF ( NINT(clu(ci ,cj )) .EQ. niswater ) THEN
1736 sum = sum + cfld(ci ,ck,cj )
1738 IF ( NINT(clu(ci+1,cj )) .EQ. niswater ) THEN
1740 sum = sum + cfld(ci+1,ck,cj )
1742 IF ( NINT(clu(ci ,cj+1)) .EQ. niswater ) THEN
1744 sum = sum + cfld(ci ,ck,cj+1)
1746 IF ( NINT(clu(ci+1,cj+1)) .EQ. niswater ) THEN
1748 sum = sum + cfld(ci+1,ck,cj+1)
1750 nfld(ni,nk,nj) = sum / REAL ( icount )
1757 CALL wrf_error_fatal ( "only unstaggered fields right now" )
1760 END SUBROUTINE p2c_mask
1765 SUBROUTINE smoother ( cfld , &
1766 cids, cide, ckds, ckde, cjds, cjde, &
1767 cims, cime, ckms, ckme, cjms, cjme, &
1768 cits, cite, ckts, ckte, cjts, cjte, &
1769 nids, nide, nkds, nkde, njds, njde, &
1770 nims, nime, nkms, nkme, njms, njme, &
1771 nits, nite, nkts, nkte, njts, njte, &
1772 xstag, ystag, & ! staggering of field
1773 ipos, jpos, & ! Position of lower left of nest in
1777 USE module_configure
1780 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1781 cims, cime, ckms, ckme, cjms, cjme, &
1782 cits, cite, ckts, ckte, cjts, cjte, &
1783 nids, nide, nkds, nkde, njds, njde, &
1784 nims, nime, nkms, nkme, njms, njme, &
1785 nits, nite, nkts, nkte, njts, njte, &
1788 LOGICAL, INTENT(IN) :: xstag, ystag
1789 INTEGER :: smooth_option, feedback , spec_zone
1791 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1793 ! If there is no feedback, there can be no smoothing.
1795 CALL nl_get_feedback ( 1, feedback )
1796 IF ( feedback == 0 ) RETURN
1797 CALL nl_get_spec_zone ( 1, spec_zone )
1799 ! These are the 2d smoothers used on the fedback data. These filters
1800 ! are run on the coarse grid data (after the nested info has been
1801 ! fedback). Only the area of the nest in the coarse grid is filtered.
1803 CALL nl_get_smooth_option ( 1, smooth_option )
1805 IF ( smooth_option == 0 ) THEN
1807 ELSE IF ( smooth_option == 1 ) THEN
1808 CALL sm121 ( cfld , &
1809 cids, cide, ckds, ckde, cjds, cjde, &
1810 cims, cime, ckms, ckme, cjms, cjme, &
1811 cits, cite, ckts, ckte, cjts, cjte, &
1812 xstag, ystag, & ! staggering of field
1813 nids, nide, nkds, nkde, njds, njde, &
1814 nims, nime, nkms, nkme, njms, njme, &
1815 nits, nite, nkts, nkte, njts, njte, &
1817 ipos, jpos & ! Position of lower left of nest in
1819 ELSE IF ( smooth_option == 2 ) THEN
1820 CALL smdsm ( cfld , &
1821 cids, cide, ckds, ckde, cjds, cjde, &
1822 cims, cime, ckms, ckme, cjms, cjme, &
1823 cits, cite, ckts, ckte, cjts, cjte, &
1824 xstag, ystag, & ! staggering of field
1825 nids, nide, nkds, nkde, njds, njde, &
1826 nims, nime, nkms, nkme, njms, njme, &
1827 nits, nite, nkts, nkte, njts, njte, &
1829 ipos, jpos & ! Position of lower left of nest in
1833 END SUBROUTINE smoother
1835 SUBROUTINE sm121 ( cfld , &
1836 cids, cide, ckds, ckde, cjds, cjde, &
1837 cims, cime, ckms, ckme, cjms, cjme, &
1838 cits, cite, ckts, ckte, cjts, cjte, &
1839 xstag, ystag, & ! staggering of field
1840 nids, nide, nkds, nkde, njds, njde, &
1841 nims, nime, nkms, nkme, njms, njme, &
1842 nits, nite, nkts, nkte, njts, njte, &
1844 ipos, jpos & ! Position of lower left of nest in
1847 USE module_configure
1850 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1851 cims, cime, ckms, ckme, cjms, cjme, &
1852 cits, cite, ckts, ckte, cjts, cjte, &
1853 nids, nide, nkds, nkde, njds, njde, &
1854 nims, nime, nkms, nkme, njms, njme, &
1855 nits, nite, nkts, nkte, njts, njte, &
1858 LOGICAL, INTENT(IN) :: xstag, ystag
1860 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1861 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfldnew
1863 INTEGER :: i , j , k , loop
1864 INTEGER :: istag,jstag
1866 INTEGER, PARAMETER :: smooth_passes = 1 ! More passes requires a larger stencil (currently 48 pt)
1868 istag = 1 ; jstag = 1
1869 IF ( xstag ) istag = 0
1870 IF ( ystag ) jstag = 0
1872 ! Simple 1-2-1 smoother.
1874 smoothing_passes : DO loop = 1 , smooth_passes
1878 ! Initialize dummy cfldnew
1880 DO i = MAX(ipos,cits-3) , MIN(ipos+(nide-nids)/nri,cite+3)
1881 DO j = MAX(jpos,cjts-3) , MIN(jpos+(njde-njds)/nrj,cjte+3)
1882 cfldnew(i,j) = cfld(i,k,j)
1886 ! 1-2-1 smoothing in the j direction first,
1888 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1889 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1890 cfldnew(i,j) = 0.25 * ( cfld(i,k,j+1) + 2.*cfld(i,k,j) + cfld(i,k,j-1) )
1894 ! then 1-2-1 smoothing in the i direction last
1896 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1897 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1898 cfld(i,k,j) = 0.25 * ( cfldnew(i+1,j) + 2.*cfldnew(i,j) + cfldnew(i-1,j) )
1904 END DO smoothing_passes
1906 END SUBROUTINE sm121
1908 SUBROUTINE smdsm ( cfld , &
1909 cids, cide, ckds, ckde, cjds, cjde, &
1910 cims, cime, ckms, ckme, cjms, cjme, &
1911 cits, cite, ckts, ckte, cjts, cjte, &
1912 xstag, ystag, & ! staggering of field
1913 nids, nide, nkds, nkde, njds, njde, &
1914 nims, nime, nkms, nkme, njms, njme, &
1915 nits, nite, nkts, nkte, njts, njte, &
1917 ipos, jpos & ! Position of lower left of nest in
1920 USE module_configure
1923 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
1924 cims, cime, ckms, ckme, cjms, cjme, &
1925 cits, cite, ckts, ckte, cjts, cjte, &
1926 nids, nide, nkds, nkde, njds, njde, &
1927 nims, nime, nkms, nkme, njms, njme, &
1928 nits, nite, nkts, nkte, njts, njte, &
1931 LOGICAL, INTENT(IN) :: xstag, ystag
1933 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
1934 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfldnew
1936 REAL , DIMENSION ( 2 ) :: xnu
1937 INTEGER :: i , j , k , loop , n
1938 INTEGER :: istag,jstag
1940 INTEGER, PARAMETER :: smooth_passes = 1 ! More passes requires a larger stencil (currently 48 pt)
1942 xnu = (/ 0.50 , -0.52 /)
1944 istag = 1 ; jstag = 1
1945 IF ( xstag ) istag = 0
1946 IF ( ystag ) jstag = 0
1948 ! The odd number passes of this are the "smoother", the even
1949 ! number passes are the "de-smoother" (note the different signs on xnu).
1951 smoothing_passes : DO loop = 1 , smooth_passes * 2
1953 n = 2 - MOD ( loop , 2 )
1957 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1958 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1959 cfldnew(i,j) = cfld(i,k,j) + xnu(n) * ((cfld(i,k,j+1) + cfld(i,k,j-1)) * 0.5-cfld(i,k,j))
1963 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1964 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1965 cfld(i,k,j) = cfldnew(i,j)
1969 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1970 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1971 cfldnew(i,j) = cfld(i,k,j) + xnu(n) * ((cfld(i+1,k,j) + cfld(i-1,k,j)) * 0.5-cfld(i,k,j))
1975 DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2)
1976 DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2)
1977 cfld(i,k,j) = cfldnew(i,j)
1983 END DO smoothing_passes
1985 END SUBROUTINE smdsm
1987 !==================================
1988 ! this is used to modify a field over the nest so we can see where the nest is
1990 SUBROUTINE mark_domain ( cfld, & ! CD field
1991 cids, cide, ckds, ckde, cjds, cjde, &
1992 cims, cime, ckms, ckme, cjms, cjme, &
1993 cits, cite, ckts, ckte, cjts, cjte, &
1995 nids, nide, nkds, nkde, njds, njde, &
1996 nims, nime, nkms, nkme, njms, njme, &
1997 nits, nite, nkts, nkte, njts, njte, &
1998 shw, & ! stencil half width for interp
1999 imask, & ! interpolation mask
2000 xstag, ystag, & ! staggering of field
2001 ipos, jpos, & ! Position of lower left of nest in CD
2002 nri, nrj ) ! nest ratios
2003 USE module_configure
2004 USE module_wrf_error
2008 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
2009 cims, cime, ckms, ckme, cjms, cjme, &
2010 cits, cite, ckts, ckte, cjts, cjte, &
2011 nids, nide, nkds, nkde, njds, njde, &
2012 nims, nime, nkms, nkme, njms, njme, &
2013 nits, nite, nkts, nkte, njts, njte, &
2017 LOGICAL, INTENT(IN) :: xstag, ystag
2019 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld
2020 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld
2021 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
2025 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
2026 INTEGER :: icmin,icmax,jcmin,jcmax
2027 INTEGER :: istag,jstag, ipoints,jpoints,ijpoints
2029 istag = 1 ; jstag = 1
2030 IF ( xstag ) istag = 0
2031 IF ( ystag ) jstag = 0
2033 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-jstag-1,cjte)
2034 nj = (cj-jpos)*nrj + jstag + 1
2037 DO ci = MAX(ipos+1,cits),MIN(ipos+(nide-nids)/nri-istag-1,cite)
2038 ni = (ci-ipos)*nri + istag + 1
2039 cfld( ci, ck, cj ) = 9021000. !magic number: Beverly Hills * 100.
2044 END SUBROUTINE mark_domain
2046 #if ( NMM_CORE == 1 )
2047 !=======================================================================================
2048 ! E grid interpolation for mass with addition of terrain adjustments. First routine
2049 ! pertains to initial conditions and the next one corresponds to boundary conditions
2050 ! This is gopal's doing
2051 !=======================================================================================
2053 SUBROUTINE interp_mass_nmm (cfld, & ! CD field
2054 cids, cide, ckds, ckde, cjds, cjde, &
2055 cims, cime, ckms, ckme, cjms, cjme, &
2056 cits, cite, ckts, ckte, cjts, cjte, &
2058 nids, nide, nkds, nkde, njds, njde, &
2059 nims, nime, nkms, nkme, njms, njme, &
2060 nits, nite, nkts, nkte, njts, njte, &
2061 shw, & ! stencil half width for interp
2062 imask, & ! interpolation mask
2063 xstag, ystag, & ! staggering of field
2064 ipos, jpos, & ! Position of lower left of nest in CD
2065 nri, nrj, & ! nest ratios
2066 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
2067 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
2068 CBWGT4, HBWGT4, & ! dummys for weights
2069 CZ3d, Z3d, & ! Z3d interpolated from CZ3d
2070 CFIS,FIS, & ! CFIS dummy on fine domain
2071 CSM,SM, & ! CSM is dummy
2077 USE MODULE_MODEL_CONSTANTS
2081 LOGICAL,INTENT(IN) :: xstag, ystag
2082 INTEGER,INTENT(IN) :: ckzmax,kzmax
2083 INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
2084 cims, cime, ckms, ckme, cjms, cjme, &
2085 cits, cite, ckts, ckte, cjts, cjte, &
2086 nids, nide, nkds, nkde, njds, njde, &
2087 nims, nime, nkms, nkme, njms, njme, &
2088 nits, nite, nkts, nkte, njts, njte, &
2089 shw,ipos,jpos,nri,nrj
2091 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK
2095 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
2096 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3
2097 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT4,CFIS,CSM
2098 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD
2099 REAL,DIMENSION(cims:cime,cjms:cjme,1:KZMAX), INTENT(IN) :: CZ3d
2100 REAL,DIMENSION(1:KZMAX), INTENT(IN) :: CPSTD
2101 REAL,INTENT(IN) :: CPDTOP,CPTOP
2105 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH
2106 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3
2107 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT4
2108 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: FIS,SM
2109 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: NFLD
2110 REAL,DIMENSION(1:KZMAX), INTENT(IN) :: PSTD
2111 REAL,DIMENSION(nims:nime,njms:njme,1:KZMAX), INTENT(OUT) :: Z3d
2112 REAL,INTENT(IN) :: PDTOP,PTOP
2116 INTEGER,PARAMETER :: JTB=134
2117 REAL, PARAMETER :: LAPSR=6.5E-3,GI=1./G, D608=0.608
2118 REAL, PARAMETER :: COEF3=R_D*GI*LAPSR
2119 INTEGER :: I,J,K,IDUM
2120 REAL :: dlnpdz,tvout,pmo
2121 REAL,DIMENSION(nims:nime,njms:njme) :: ZS,DUM2d
2122 REAL,DIMENSION(JTB) :: PIN,ZIN,Y2,PIO,ZOUT,DUM1,DUM2
2123 !-----------------------------------------------------------------------------------------------------
2125 !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION
2127 DO J=NJTS,MIN(NJTE,NJDE-1)
2128 DO I=NITS,MIN(NITE,NIDE-1)
2129 IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) &
2130 CALL wrf_error_fatal ('mass points:check domain bounds along x' )
2131 IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) &
2132 CALL wrf_error_fatal ('mass points:check domain bounds along y' )
2136 IF(KZMAX .GT. (JTB-10)) &
2137 CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm')
2139 ! WRITE(21,*)'------------- MED NEST INITIAL 1 ----------------'
2140 ! DO J=NJTS,MIN(NJTE,NJDE-1)
2141 ! DO I=NITS,MIN(NITE,NIDE-1)
2142 ! WRITE(21,*)I,J,IMASK(I,J),NFLD(I,1,J)
2148 !*** DEFINE LOCAL TOPOGRAPHY ON THE BASIS OF FIS. ALSO CHECK IF SM IS LAND (SM=0) OVER TOPO
2149 !*** YOU DON'T WANT MOUNTAINS INSIDE WATER BODIES!
2152 DO J=NJTS,MIN(NJTE,NJDE-1)
2153 DO I=NITS,MIN(NITE,NIDE-1)
2159 !*** Interpolate GPMs DERIVED FROM STANDARD ATMOSPHERIC LAPSE RATE FROM THE PARENT TO
2160 !*** THE NESTED DOMAIN
2162 !*** INDEX CONVENTIONS
2177 DO K=NKTS,KZMAX ! Please note that we are still in isobaric surfaces
2178 DO J=NJTS,MIN(NJTE,NJDE-1)
2179 DO I=NITS,MIN(NITE,NIDE-1)
2181 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
2182 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2183 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2184 + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) &
2185 + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K)
2187 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2188 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2189 + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2190 + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K)
2198 ! RECONSTRUCT PDs ON THE BASIS OF TOPOGRAPHY AND THE INTERPOLATED HEIGHTS
2200 DO J=NJTS,MIN(NJTE,NJDE-1)
2201 DO I=NITS,MIN(NITE,NIDE-1)
2203 IF (ZS(I,J) .LT. Z3d(I,J,1)) THEN
2204 dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(i,j,1)-Z3d(i,j,2))
2205 dum2d(i,j) = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(i,j,1)))
2206 dum2d(i,j) = dum2d(i,j) - PDTOP -PTOP
2207 ELSE ! target level bounded by input levels
2208 DO K =NKTS,KZMAX-1 ! still in the isobaric surfaces
2209 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN
2210 dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1))
2211 dum2d(i,j) = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K)))
2212 dum2d(i,j) = dum2d(i,j) - PDTOP -PTOP
2216 IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN
2217 WRITE(0,*)'I=',I,'J=',J,'K=',KZMAX,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX)
2218 CALL wrf_error_fatal3 ( "interp_fcn.b" , 176 , "MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH")
2224 DO K=NKDS,NKDE ! NKTE is 1, nevertheless let us pretend religious
2225 DO J=NJTS,MIN(NJTE,NJDE-1)
2226 DO I=NITS,MIN(NITE,NIDE-1)
2227 IF(IMASK(I,J) .NE. 1)THEN
2228 NFLD(I,J,K)= dum2d(i,j) ! PD defined in the nested domain
2235 END SUBROUTINE interp_mass_nmm
2237 !--------------------------------------------------------------------------------------
2239 SUBROUTINE nmm_bdymass_hinterp ( cfld, & ! CD field
2240 cids, cide, ckds, ckde, cjds, cjde, &
2241 cims, cime, ckms, ckme, cjms, cjme, &
2242 cits, cite, ckts, ckte, cjts, cjte, &
2244 nids, nide, nkds, nkde, njds, njde, &
2245 nims, nime, nkms, nkme, njms, njme, &
2246 nits, nite, nkts, nkte, njts, njte, &
2247 shw, & ! stencil half width
2248 imask, & ! interpolation mask
2249 xstag, ystag, & ! staggering of field
2250 ipos, jpos, & ! Position of lower left of nest in CD
2251 nri, nrj, & ! nest ratios
2260 CTEMP_B,NTEMP_B, & ! These temp arrays should be removed
2261 CTEMP_BT,NTEMP_BT, & ! later on
2262 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
2263 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
2264 CBWGT4, HBWGT4, & ! dummys
2265 CZ3d, Z3d, & ! Z3d dummy on nested domain
2266 CFIS,FIS, & ! CFIS dummy on fine domain
2267 CSM,SM, & ! CSM is dummy
2274 USE MODULE_MODEL_CONSTANTS
2275 USE module_configure
2276 USE module_wrf_error
2281 INTEGER, INTENT(IN) :: ckzmax,kzmax
2282 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
2283 cims, cime, ckms, ckme, cjms, cjme, &
2284 cits, cite, ckts, ckte, cjts, cjte, &
2285 nids, nide, nkds, nkde, njds, njde, &
2286 nims, nime, nkms, nkme, njms, njme, &
2287 nits, nite, nkts, nkte, njts, njte, &
2293 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: ctemp_b,ctemp_bt
2294 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(OUT) :: ntemp_b,ntemp_bt
2295 LOGICAL, INTENT(IN) :: xstag, ystag
2296 REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye
2297 REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye
2301 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK
2302 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
2303 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3
2304 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT4,CFIS,CSM
2305 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD
2306 REAL,DIMENSION(cims:cime,cjms:cjme,1:KZMAX), INTENT(IN) :: CZ3d
2307 REAL,DIMENSION(1:KZMAX), INTENT(IN) :: CPSTD
2308 REAL,INTENT(IN) :: CPDTOP,CPTOP
2312 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH
2313 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3
2314 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT4
2315 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: FIS,SM
2316 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: NFLD
2317 REAL,DIMENSION(1:KZMAX), INTENT(IN) :: PSTD
2318 REAL,DIMENSION(nims:nime,njms:njme,1:KZMAX), INTENT(OUT) :: Z3d
2319 REAL,INTENT(IN) :: PDTOP,PTOP
2323 INTEGER :: nijds, nijde, spec_bdy_width,i,j,k
2324 REAL :: dlnpdz,dum2d
2325 REAL,DIMENSION(nims:nime,njms:njme) :: zs
2327 INTEGER,PARAMETER :: JTB=134
2329 REAL, DIMENSION (nims:nime,njms:njme) :: CWK1,CWK2,CWK3,CWK4
2331 nijds = min(nids, njds)
2332 nijde = max(nide, njde)
2333 CALL nl_get_spec_bdy_width( 1, spec_bdy_width )
2336 !*** DEFINE LOCAL TOPOGRAPHY ON THE BASIS OF FIS. ASLO CHECK IF SM IS LAND (SM=0) OVER TOPO
2337 !*** YOU DON'T WANT MOUNTAINS INSIDE WATER BODIES!
2339 DO J=NJTS,MIN(NJTE,NJDE-1)
2340 DO I=NITS,MIN(NITE,NIDE-1)
2347 NMM_XS: IF(NITS .EQ. NIDS)THEN
2348 ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1)
2352 DO J = NJTS,MIN(NJTE,NJDE-1)
2353 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
2354 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2355 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2356 + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) &
2357 + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K)
2359 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2360 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2361 + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2362 + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K)
2367 DO J = NJTS,MIN(NJTE,NJDE-1)
2368 IF(MOD(J,2) .NE. 0)THEN
2369 IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed
2370 dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2))
2371 dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1)))
2372 CWK1(I,J) = dum2d -PDTOP -PTOP
2373 ELSE ! target level bounded by input levels
2375 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN
2376 dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1))
2377 dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K)))
2378 CWK1(I,J) = dum2d -PDTOP -PTOP
2382 IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN
2383 WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX)
2384 CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH")
2391 DO J = NJTS,MIN(NJTE,NJDE-1)
2393 ntemp_b(i,j,k) = CWK1(I,J)
2394 ntemp_bt(i,j,k) = 0.0
2401 NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN
2402 ! WRITE(0,*)'ENTERING X END BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1)
2407 DO J=NJTS,MIN(NJTE,NJDE-1)
2408 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
2409 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2410 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2411 + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) &
2412 + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K)
2414 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2415 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2416 + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2417 + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K)
2422 DO J = NJTS,MIN(NJTE,NJDE-1)
2423 IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of nested domain
2424 IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed
2425 dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2))
2426 dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1)))
2427 CWK2(I,J) = dum2d -PDTOP -PTOP
2428 ELSE ! target level bounded by input levels
2430 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN
2431 dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1))
2432 dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K)))
2433 CWK2(I,J) = dum2d -PDTOP -PTOP
2437 IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN
2438 WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX)
2439 CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH")
2446 DO J = NJTS,MIN(NJTE,NJDE-1)
2448 ntemp_b(i,j,k) = CWK2(I,J)
2449 ntemp_bt(i,j,k) = 0.0
2456 NMM_YS: IF(NJTS .EQ. NJDS)THEN
2457 ! WRITE(20,*)'ENTERING Y START BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1)
2460 DO I = NITS,MIN(NITE,NIDE-1)
2461 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
2462 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2463 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2464 + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) &
2465 + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K)
2467 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2468 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2469 + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2470 + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K)
2475 DO I = NITS,MIN(NITE,NIDE-1)
2476 IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed
2477 dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2))
2478 dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1)))
2479 CWK3(I,J) = dum2d -PDTOP -PTOP
2480 ELSE ! target level bounded by input levels
2482 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN
2483 dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1))
2484 dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K)))
2485 CWK3(I,J) = dum2d -PDTOP -PTOP
2489 IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN
2490 WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX)
2491 CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH")
2496 DO I = NITS,MIN(NITE,NIDE-1)
2497 ntemp_b(i,j,k) = CWK3(I,J)
2498 ntemp_bt(i,j,k) = 0.0
2505 NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN
2506 ! WRITE(20,*)'ENTERING Y END BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1)
2510 DO I = NITS,MIN(NITE,NIDE-1)
2511 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
2512 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2513 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2514 + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) &
2515 + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K)
2517 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) &
2518 + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) &
2519 + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2520 + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K)
2525 DO I = NITS,MIN(NITE,NIDE-1)
2526 IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed
2527 dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2))
2528 dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1)))
2529 CWK4(I,J) = dum2d -PDTOP -PTOP
2530 ELSE ! target level bounded by input levels
2532 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN
2533 dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1))
2534 dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K)))
2535 CWK4(I,J) = dum2d -PDTOP -PTOP
2539 IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN
2540 WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX)
2541 CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH")
2546 DO I = NITS,MIN(NITE,NIDE-1)
2547 ntemp_b(i,j,k) = CWK4(I,J)
2548 ntemp_bt(i,j,k) = 0.0
2555 END SUBROUTINE nmm_bdymass_hinterp
2557 !=======================================================================================
2559 ! ADDED FOR INCLUDING MOISTURE AND THERMODYNAMIC ENERGY BALANCE
2561 !=======================================================================================
2563 SUBROUTINE interp_scalar_nmm (cfld, & ! CD field
2564 cids,cide,ckds,ckde,cjds,cjde, &
2565 cims,cime,ckms,ckme,cjms,cjme, &
2566 cits,cite,ckts,ckte,cjts,cjte, &
2568 nids,nide,nkds,nkde,njds,njde, &
2569 nims,nime,nkms,nkme,njms,njme, &
2570 nits,nite,nkts,nkte,njts,njte, &
2571 shw, & ! stencil half width for interp
2572 imask, & ! interpolation mask
2573 xstag,ystag, & ! staggering of field
2574 ipos,jpos, & ! Position of lower left of nest in CD
2575 nri,nrj, & ! nest ratios
2576 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
2577 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
2578 CBWGT4, HBWGT4, & ! dummys for weights
2584 CETA1,ETA1,CETA2,ETA2 )
2586 USE MODULE_MODEL_CONSTANTS
2590 LOGICAL,INTENT(IN) :: xstag, ystag
2591 INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
2592 cims, cime, ckms, ckme, cjms, cjme, &
2593 cits, cite, ckts, ckte, cjts, cjte, &
2594 nids, nide, nkds, nkde, njds, njde, &
2595 nims, nime, nkms, nkme, njms, njme, &
2596 nits, nite, nkts, nkte, njts, njte, &
2597 shw,ipos,jpos,nri,nrj
2599 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK
2603 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
2604 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2
2605 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT3,CBWGT4
2607 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD
2608 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CC3d ! scalar input on constant pressure levels
2609 REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CPSTD
2610 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CPD
2611 REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CETA1,CETA2
2612 REAL, INTENT(IN) :: CPDTOP,CPTOP
2616 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH
2617 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2
2618 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT3,HBWGT4
2620 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: NFLD ! This is scalar on hybrid levels
2621 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: C3d ! Scalar on constant pressure levels
2622 REAL,DIMENSION(nkms:nkme), INTENT(IN) :: PSTD
2623 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: PD
2624 REAL,DIMENSION(nkms:nkme), INTENT(IN) :: ETA1,ETA2
2625 REAL,INTENT(IN) :: PDTOP,PTOP
2629 INTEGER,PARAMETER :: JTB=134
2631 REAL,DIMENSION(JTB) :: PIN,CIN,Y2,PIO,PTMP,COUT,DUM1,DUM2
2633 !-----------------------------------------------------------------------------------------------------
2636 ! *** CHECK VERTICAL BOUNDS BEFORE USING SPLINE OR LINEAR INTERPOLATION
2638 IF(nkme .GT. (JTB-10) .OR. NKDE .GT. (JTB-10)) &
2639 CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm')
2642 ! FIRST, HORIZONTALLY INTERPOLATE MOISTURE NOW AVAILABLE ON CONSTANT PRESSURE SURFACE (LEVELS) FROM THE
2643 ! PARENT TO THE NESTED DOMAIN
2645 !*** INDEX CONVENTIONS
2660 DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces
2661 DO J=NJTS,MIN(NJTE,NJDE-1)
2662 DO I=NITS,MIN(NITE,NIDE-1)
2663 IF(IMASK(I,J) .NE. 1)THEN
2664 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
2665 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2666 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2667 + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) &
2668 + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K)
2671 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2672 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2673 + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2674 + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K)
2683 ! RECOVER THE SCALARS FROM CONSTANT PRESSURE SURFACES (LEVELS) ON TO HYBRID SURFACES
2685 DO J=NJTS,MIN(NJTE,NJDE-1)
2686 DO I=NITS,MIN(NITE,NIDE-1)
2687 IF(IMASK(I,J) .NE. 1)THEN
2689 ! clean local array before use of spline or linear interpolation
2691 CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0.
2693 DO K=NKDS+1,NKDE ! inputs at standard levels
2694 PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5)
2695 CIN(K-1) = C3d(I,J,NKDE-K+1)
2701 DO K=NKDS,NKDE ! target points in model interface levels (pint)
2702 PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP
2705 DO K=NKDS,NKDE-1 ! target points in model levels
2706 PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5)
2709 IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary
2710 PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all
2711 WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD'
2712 WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1)
2715 CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate
2718 NFLD(I,J,K)= COUT(K) ! scalar in the nested domain
2725 END SUBROUTINE interp_scalar_nmm
2727 !===========================================================================================
2729 SUBROUTINE nmm_bdy_scalar (cfld, & ! CD field
2730 cids,cide,ckds,ckde,cjds,cjde, &
2731 cims,cime,ckms,ckme,cjms,cjme, &
2732 cits,cite,ckts,ckte,cjts,cjte, &
2734 nids,nide,nkds,nkde,njds,njde, &
2735 nims,nime,nkms,nkme,njms,njme, &
2736 nits,nite,nkts,nkte,njts,njte, &
2737 shw, & ! stencil half width for interp
2738 imask, & ! interpolation mask
2739 xstag,ystag, & ! staggering of field
2740 ipos,jpos, & ! Position of lower left of nest in CD
2741 nri,nrj, & ! nest ratios
2751 CTEMP_B,NTEMP_B, & ! to be removed
2752 CTEMP_BT,NTEMP_BT, &
2753 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
2754 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
2755 CBWGT4, HBWGT4, & ! dummys for weights
2761 CETA1,ETA1,CETA2,ETA2 )
2762 USE MODULE_MODEL_CONSTANTS
2766 LOGICAL,INTENT(IN) :: xstag, ystag
2767 REAL, INTENT(INOUT) :: cdt, ndt
2768 INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
2769 cims, cime, ckms, ckme, cjms, cjme, &
2770 cits, cite, ckts, ckte, cjts, cjte, &
2771 nids, nide, nkds, nkde, njds, njde, &
2772 nims, nime, nkms, nkme, njms, njme, &
2773 nits, nite, nkts, nkte, njts, njte, &
2774 shw,ipos,jpos,nri,nrj
2775 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: ctemp_b,ctemp_bt
2776 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(OUT) :: ntemp_b,ntemp_bt
2777 REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye
2778 REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye
2781 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK
2785 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
2786 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2
2787 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT3,CBWGT4
2788 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD
2789 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CC3d ! scalar input on constant pressure levels
2790 REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CPSTD
2791 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CPD
2792 REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CETA1,CETA2
2793 REAL, INTENT(IN) :: CPDTOP,CPTOP
2797 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH
2798 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2
2799 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT3,HBWGT4
2800 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: NFLD
2801 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: C3d !Scalar on constant pressure levels
2802 REAL,DIMENSION(nkms:nkme), INTENT(IN) :: PSTD
2803 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: PD
2804 REAL,DIMENSION(nkms:nkme), INTENT(IN) :: ETA1,ETA2
2805 REAL,INTENT(IN) :: PDTOP,PTOP
2809 INTEGER,PARAMETER :: JTB=134
2810 INTEGER :: I,J,K,II,JJ
2811 REAL,DIMENSION(JTB) :: PIN,CIN,Y2,PIO,PTMP,COUT,DUM1,DUM2
2812 REAL, DIMENSION (nims:nime,njms:njme,nkms:nkme) :: CWK1,CWK2,CWK3,CWK4
2813 !-----------------------------------------------------------------------------------------------------
2816 ! *** CHECK VERTICAL BOUNDS BEFORE USING SPLINE INTERPOLATION
2818 IF(nkme .GT. (JTB-10) .OR. NKDE .GT. (JTB-10)) &
2819 CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm')
2823 NMM_XS: IF(NITS .EQ. NIDS)THEN
2824 ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT T POINTS',NJTS,MIN(NJTE,NJDE-1)
2826 DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces
2827 DO J = NJTS,MIN(NJTE,NJDE-1)
2828 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
2829 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2830 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2831 + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) &
2832 + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K)
2834 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2835 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2836 + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2837 + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K)
2842 DO J=NJTS,MIN(NJTE,NJDE-1)
2843 IF(MOD(J,2) .NE. 0)THEN
2844 CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array
2845 DO K=NKDS+1,NKDE ! inputs at standard levels
2846 PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5)
2847 CIN(K-1) = C3d(I,J,NKDE-K+1)
2851 DO K=NKDS,NKDE ! target points in model interface levels (pint)
2852 PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP
2854 DO K=NKDS,NKDE-1 ! target points in model levels
2855 PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5)
2857 IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary
2858 PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all
2859 WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD'
2860 WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1)
2863 CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate
2866 CWK1(I,J,K)= COUT(K) ! scalar in the nested domain
2875 DO J = NJTS,MIN(NJTE,NJDE-1)
2877 ntemp_b(i,j,k) = CWK1(I,J,K)
2878 ntemp_bt(i,j,k) = 0.0
2887 NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN
2888 ! WRITE(0,*)'ENTERING X END BOUNDARY AT T POINTS',NJTS,MIN(NJTE,NJDE-1)
2890 DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces
2891 DO J = NJTS,MIN(NJTE,NJDE-1)
2892 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
2893 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2894 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2895 + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) &
2896 + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K)
2898 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2899 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2900 + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2901 + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K)
2906 DO J=NJTS,MIN(NJTE,NJDE-1)
2907 IF(MOD(J,2) .NE. 0)THEN
2908 CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array
2909 DO K=NKDS+1,NKDE ! inputs at standard levels
2910 PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5)
2911 CIN(K-1) = C3d(I,J,NKDE-K+1)
2915 DO K=NKDS,NKDE ! target points in model interface levels (pint)
2916 PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP
2918 DO K=NKDS,NKDE-1 ! target points in model levels
2919 PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5)
2921 IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary
2922 PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all
2923 WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD'
2924 WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1)
2927 CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate
2930 CWK2(I,J,K)= COUT(K) ! scalar in the nested domain
2939 DO J = NJTS,MIN(NJTE,NJDE-1)
2940 DO K = NKDS,MIN(NKTE,NKDE-1)
2941 ntemp_b(i,j,k) = CWK2(I,J,K)
2942 ntemp_bt(i,j,k) = 0.0
2950 NMM_YS: IF(NJTS .EQ. NJDS)THEN
2951 ! WRITE(0,*)'ENTERING Y START BOUNDARY AT T POINTS',NITS,MIN(NITE,NIDE-1)
2954 DO I = NITS,MIN(NITE,NIDE-1)
2955 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
2956 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2957 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2958 + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) &
2959 + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K)
2961 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
2962 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
2963 + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) &
2964 + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K)
2970 DO I=NITS,MIN(NITE,NIDE-1)
2971 CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array
2972 DO K=NKDS+1,NKDE ! inputs at standard levels
2973 PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5)
2974 CIN(K-1) = C3d(I,J,NKDE-K+1)
2978 DO K=NKDS,NKDE ! target points in model interface levels (pint)
2979 PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP
2981 DO K=NKDS,NKDE-1 ! target points in model levels
2982 PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5)
2984 IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary
2985 PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all
2986 WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD'
2987 WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1)
2990 CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate
2993 CWK3(I,J,K)= COUT(K) ! scalar in the nested domain
2998 DO I = NITS,MIN(NITE,NIDE-1)
2999 ntemp_b(i,J,K) = CWK3(I,J,K)
3000 ntemp_bt(i,J,K) = 0.0
3008 NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN
3009 ! WRITE(0,*)'ENTERING Y END BOUNDARY AT T POINTS',NITS,MIN(NITE,NIDE-1)
3012 DO I = NITS,MIN(NITE,NIDE-1)
3013 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
3014 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
3015 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
3016 + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) &
3017 + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K)
3019 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) &
3020 + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) &
3021 + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) &
3022 + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K)
3028 DO I=NITS,MIN(NITE,NIDE-1)
3029 CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array
3030 DO K=NKDS+1,NKDE ! inputs at standard levels
3031 PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5)
3032 CIN(K-1) = C3d(I,J,NKDE-K+1)
3036 DO K=NKDS,NKDE ! target points in model interface levels (pint)
3037 PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP
3039 DO K=NKDS,NKDE-1 ! target points in model levels
3040 PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5)
3042 IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary
3043 PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all
3044 WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD'
3045 WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1)
3048 CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate
3051 CWK4(I,J,K)= COUT(K) ! scalar in the nested domain
3056 DO I = NITS,MIN(NITE,NIDE-1)
3057 ntemp_b(i,J,K) = CWK4(I,J,K)
3058 ntemp_bt(i,J,K) = 0.0
3064 END SUBROUTINE nmm_bdy_scalar
3067 !=======================================================================================
3068 SUBROUTINE SPLINE2(I,J,JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
3070 ! ******************************************************************
3072 ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE *
3073 ! * PROGRAMED FOR A SMALL SCALAR MACHINE. *
3075 ! * PROGRAMER Z. JANJIC *
3077 ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. *
3078 ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
3079 ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. *
3080 ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. *
3081 ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL *
3082 ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE *
3084 ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. *
3085 ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
3086 ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) *
3087 ! * AND LE XOLD(NOLD). *
3088 ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. *
3089 ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. *
3091 ! ******************************************************************
3092 !---------------------------------------------------------------------
3094 !---------------------------------------------------------------------
3095 INTEGER,INTENT(IN) :: I,J,JTBX,NNEW,NOLD
3096 REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD
3097 REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2
3098 REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW
3100 INTEGER :: II,JJ,K,K1,K2,KOLD,NOLDM1
3101 REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR &
3102 ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
3103 !---------------------------------------------------------------------
3109 IF(I.eq.II.and.J.eq.JJ)THEN
3110 WRITE(0,*)'DEBUG in SPLINE2: I,J',I,J
3111 WRITE(0,*)'DEBUG in SPLINE2:HSO= ',xnew(1:nold)
3113 WRITE(0,*)'DEBUG in SPLINE2:L,ZETAI,PINTI= ' &
3122 DYDXL=(YOLD(2)-YOLD(1))/DXL
3123 DYDXR=(YOLD(3)-YOLD(2))/DXR
3126 P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
3129 IF(NOLD.EQ.3)GO TO 150
3130 !---------------------------------------------------------------------
3135 DXR=XOLD(K+1)-XOLD(K)
3136 DYDXR=(YOLD(K+1)-YOLD(K))/DXR
3138 DEN=1./(DXL*Q(K-2)+DXC+DXC)
3140 P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
3144 IF(K.LT.NOLD)GO TO 100
3145 !-----------------------------------------------------------------------
3148 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
3152 !-----------------------------------------------------------------------
3159 IF(XOLD(K2).GT.XK)THEN
3169 450 IF(K1.EQ.1)GO TO 500
3170 IF(K.EQ.KOLD)GO TO 550
3176 DX=XOLD(K+1)-XOLD(K)
3179 AK=.1666667*RDX*(Y2KP1-Y2K)
3181 CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
3186 YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
3190 IF(I.eq.II.and.J.eq.JJ)THEN
3191 WRITE(0,*) 'DEBUG:: k1,xnew(k1),ynew(k1): ', K1,XNEW(k1),YNEW(k1)
3196 IF(K1.LE.NNEW)GO TO 300
3200 END SUBROUTINE SPLINE2
3202 !=======================================================================================
3203 ! E grid interpolation for H and V points
3204 !=======================================================================================
3206 SUBROUTINE interp_h_nmm (cfld, & ! CD field
3207 cids, cide, ckds, ckde, cjds, cjde, &
3208 cims, cime, ckms, ckme, cjms, cjme, &
3209 cits, cite, ckts, ckte, cjts, cjte, &
3211 nids, nide, nkds, nkde, njds, njde, &
3212 nims, nime, nkms, nkme, njms, njme, &
3213 nits, nite, nkts, nkte, njts, njte, &
3214 shw, & ! stencil half width for interp
3215 imask, & ! interpolation mask
3216 xstag, ystag, & ! staggering of field
3217 ipos, jpos, & ! Position of lower left of nest in CD
3218 nri, nrj, & ! nest ratios
3219 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
3220 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3221 CBWGT4, HBWGT4 ) ! dummys for weights
3225 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3226 cims, cime, ckms, ckme, cjms, cjme, &
3227 cits, cite, ckts, ckte, cjts, cjte, &
3228 nids, nide, nkds, nkde, njds, njde, &
3229 nims, nime, nkms, nkme, njms, njme, &
3230 nits, nite, nkts, nkte, njts, njte, &
3234 LOGICAL, INTENT(IN) :: xstag, ystag
3236 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
3237 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
3238 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3239 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3240 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3241 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3242 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3247 !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION
3249 DO J=NJTS,MIN(NJTE,NJDE-1)
3250 DO I=NITS,MIN(NITE,NIDE-1)
3251 IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) &
3252 CALL wrf_error_fatal ('hpoints:check domain bounds along x' )
3253 IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) &
3254 CALL wrf_error_fatal ('hpoints:check domain bounds along y' )
3258 !*** INDEX CONVENTIONS
3273 DO J=NJTS,MIN(NJTE,NJDE-1)
3274 DO I=NITS,MIN(NITE,NIDE-1)
3275 IF(IMASK(I,J) .NE. 1)THEN
3277 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
3278 NFLD(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3279 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3280 + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
3281 + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
3283 NFLD(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3284 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3285 + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
3286 + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
3294 END SUBROUTINE interp_h_nmm
3296 SUBROUTINE interp_v_nmm (cfld, & ! CD field
3297 cids, cide, ckds, ckde, cjds, cjde, &
3298 cims, cime, ckms, ckme, cjms, cjme, &
3299 cits, cite, ckts, ckte, cjts, cjte, &
3301 nids, nide, nkds, nkde, njds, njde, &
3302 nims, nime, nkms, nkme, njms, njme, &
3303 nits, nite, nkts, nkte, njts, njte, &
3304 shw, & ! stencil half width for interp
3305 imask, & ! interpolation mask
3306 xstag, ystag, & ! staggering of field
3307 ipos, jpos, & ! Position of lower left of nest in CD
3308 nri, nrj, & ! nest ratios
3309 CII, IIV, CJJ, JJV, CBWGT1, VBWGT1, & ! south-western grid locs and weights
3310 CBWGT2, VBWGT2, CBWGT3, VBWGT3, & ! note that "C"ourse grid ones are
3311 CBWGT4, VBWGT4 ) ! dummys
3315 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3316 cims, cime, ckms, ckme, cjms, cjme, &
3317 cits, cite, ckts, ckte, cjts, cjte, &
3318 nids, nide, nkds, nkde, njds, njde, &
3319 nims, nime, nkms, nkme, njms, njme, &
3320 nits, nite, nkts, nkte, njts, njte, &
3324 LOGICAL, INTENT(IN) :: xstag, ystag
3326 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
3327 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
3328 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3329 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
3330 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3331 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIV,JJV
3332 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3339 !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION
3341 DO J=NJTS,MIN(NJTE,NJDE-1)
3342 DO I=NITS,MIN(NITE,NIDE-1)
3343 IF(IIV(i,j).LT.(CIDS-shw) .OR. IIV(i,j).GT.(CIDE+shw)) &
3344 CALL wrf_error_fatal ('vpoints:check domain bounds along x' )
3345 IF(JJV(i,j).LT.(CJDS-shw) .OR. JJV(i,j).GT.(CJDE+shw)) &
3346 CALL wrf_error_fatal ('vpoints:check domain bounds along y' )
3350 !*** INDEX CONVENTIONS
3365 DO J=NJTS,MIN(NJTE,NJDE-1)
3366 DO I=NITS,MIN(NITE,NIDE-1)
3367 IF(IMASK(I,J) .NE. 1)THEN
3369 IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7
3370 NFLD(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
3371 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
3372 + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) &
3373 + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K)
3375 NFLD(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
3376 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
3377 + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) &
3378 + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K)
3386 END SUBROUTINE interp_v_nmm
3388 !=======================================================================================
3389 ! E grid nearest neighbour interpolation for H points.
3390 ! This routine assumes cfld and nfld are in IJK
3391 !=======================================================================================
3393 SUBROUTINE interp_hnear_nmm (cfld, & ! CD field
3394 cids, cide, ckds, ckde, cjds, cjde, &
3395 cims, cime, ckms, ckme, cjms, cjme, &
3396 cits, cite, ckts, ckte, cjts, cjte, &
3398 nids, nide, nkds, nkde, njds, njde, &
3399 nims, nime, nkms, nkme, njms, njme, &
3400 nits, nite, nkts, nkte, njts, njte, &
3401 shw, & ! stencil half width for interp
3402 imask, & ! interpolation mask
3403 xstag, ystag, & ! staggering of field
3404 ipos, jpos, & ! Position of lower left of nest in CD
3405 nri, nrj, & ! nest ratios
3406 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
3407 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3408 CBWGT4, HBWGT4 ) ! just dummys
3412 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3413 cims, cime, ckms, ckme, cjms, cjme, &
3414 cits, cite, ckts, ckte, cjts, cjte, &
3415 nids, nide, nkds, nkde, njds, njde, &
3416 nims, nime, nkms, nkme, njms, njme, &
3417 nits, nite, nkts, nkte, njts, njte, &
3421 LOGICAL, INTENT(IN) :: xstag, ystag
3423 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
3424 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
3425 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3426 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3427 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3428 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3429 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3436 REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT
3439 !*** INDEX CONVENTIONS
3447 !*** NBWGT1=1 NBWGT2=0
3453 DO J=NJTS,MIN(NJTE,NJDE-1)
3454 DO I=NITS,MIN(NITE,NIDE-1)
3455 IF(IMASK(I,J) .NE. 1)THEN
3456 NBWGT(1,I,J)=HBWGT1(I,J)
3457 NBWGT(2,I,J)=HBWGT2(I,J)
3458 NBWGT(3,I,J)=HBWGT3(I,J)
3459 NBWGT(4,I,J)=HBWGT4(I,J)
3464 DO J=NJTS,MIN(NJTE,NJDE-1)
3465 DO I=NITS,MIN(NITE,NIDE-1)
3466 IF(IMASK(I,J) .NE. 1)THEN
3470 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL)
3476 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN
3482 SUM=SUM+NBWGT(N,I,J)
3483 IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" )
3491 DO J=NJTS,MIN(NJTE,NJDE-1)
3492 DO I=NITS,MIN(NITE,NIDE-1)
3493 IF(IMASK(I,J) .NE. 1)THEN
3494 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
3495 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3496 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3497 + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
3498 + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
3500 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3501 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3502 + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
3503 + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
3510 END SUBROUTINE interp_hnear_nmm
3511 SUBROUTINE force_sst_nmm (cfld, & ! CD field
3512 cids, cide, ckds, ckde, cjds, cjde, &
3513 cims, cime, ckms, ckme, cjms, cjme, &
3514 cits, cite, ckts, ckte, cjts, cjte, &
3516 nids, nide, nkds, nkde, njds, njde, &
3517 nims, nime, nkms, nkme, njms, njme, &
3518 nits, nite, nkts, nkte, njts, njte, &
3519 shw, & ! stencil half width for interp
3520 imask, & ! interpolation mask
3521 xstag, ystag, & ! staggering of field
3522 ipos, jpos, & ! Position of lower left of nest in CD
3523 nri, nrj, & ! nest ratios
3524 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
3525 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3526 CBWGT4, HBWGT4, CCSST, CSST ) ! just dummys
3530 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3531 cims, cime, ckms, ckme, cjms, cjme, &
3532 cits, cite, ckts, ckte, cjts, cjte, &
3533 nids, nide, nkds, nkde, njds, njde, &
3534 nims, nime, nkms, nkme, njms, njme, &
3535 nits, nite, nkts, nkte, njts, njte, &
3539 LOGICAL, INTENT(IN) :: xstag, ystag
3541 REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfld
3542 REAL, DIMENSION ( nims:nime, njms:njme ) :: nfld
3543 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3544 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3545 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3546 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3547 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3548 INTEGER , INTENT(IN) :: csst(*), ccsst(*)
3554 REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT
3556 if(csst(1) /= 1) return
3559 !*** INDEX CONVENTIONS
3567 !*** NBWGT1=1 NBWGT2=0
3573 DO J=NJTS,MIN(NJTE,NJDE-1)
3574 DO I=NITS,MIN(NITE,NIDE-1)
3575 NBWGT(1,I,J)=HBWGT1(I,J)
3576 NBWGT(2,I,J)=HBWGT2(I,J)
3577 NBWGT(3,I,J)=HBWGT3(I,J)
3578 NBWGT(4,I,J)=HBWGT4(I,J)
3582 DO J=NJTS,MIN(NJTE,NJDE-1)
3583 DO I=NITS,MIN(NITE,NIDE-1)
3586 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL)
3592 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN
3598 SUM=SUM+NBWGT(N,I,J)
3599 IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" )
3604 DO J=NJTS,MIN(NJTE,NJDE-1)
3605 DO I=NITS,MIN(NITE,NIDE-1)
3606 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
3607 NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) &
3608 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) &
3609 + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1) &
3610 + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1)
3612 NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) &
3613 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) &
3614 + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1) &
3615 + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1)
3621 END SUBROUTINE force_sst_nmm
3622 !=======================================================================================
3623 ! E grid nearest neighbour interpolation for H points.
3624 ! This routine assumes cfld and nfld are in IKJ or ILJ
3625 !=======================================================================================
3627 SUBROUTINE interp_hnear_ikj_nmm (cfld, & ! CD field
3628 cids, cide, ckds, ckde, cjds, cjde, &
3629 cims, cime, ckms, ckme, cjms, cjme, &
3630 cits, cite, ckts, ckte, cjts, cjte, &
3632 nids, nide, nkds, nkde, njds, njde, &
3633 nims, nime, nkms, nkme, njms, njme, &
3634 nits, nite, nkts, nkte, njts, njte, &
3635 shw, & ! stencil half width for interp
3636 imask, & ! interpolation mask
3637 xstag, ystag, & ! staggering of field
3638 ipos, jpos, & ! Position of lower left of nest in CD
3639 nri, nrj, & ! nest ratios
3640 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
3641 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3642 CBWGT4, HBWGT4 ) ! just dummys
3646 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3647 cims, cime, ckms, ckme, cjms, cjme, &
3648 cits, cite, ckts, ckte, cjts, cjte, &
3649 nids, nide, nkds, nkde, njds, njde, &
3650 nims, nime, nkms, nkme, njms, njme, &
3651 nits, nite, nkts, nkte, njts, njte, &
3655 LOGICAL, INTENT(IN) :: xstag, ystag
3657 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld
3658 REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld
3659 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3660 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3661 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3662 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3663 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3670 REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT
3673 !*** INDEX CONVENTIONS
3681 !*** NBWGT1=1 NBWGT2=0
3687 DO J=NJTS,MIN(NJTE,NJDE-1)
3688 DO I=NITS,MIN(NITE,NIDE-1)
3689 IF(IMASK(I,J) .NE. 1)THEN
3690 NBWGT(1,I,J)=HBWGT1(I,J)
3691 NBWGT(2,I,J)=HBWGT2(I,J)
3692 NBWGT(3,I,J)=HBWGT3(I,J)
3693 NBWGT(4,I,J)=HBWGT4(I,J)
3698 DO J=NJTS,MIN(NJTE,NJDE-1)
3699 DO I=NITS,MIN(NITE,NIDE-1)
3700 IF(IMASK(I,J) .NE. 1)THEN
3704 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL)
3710 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN
3716 SUM=SUM+NBWGT(N,I,J)
3717 IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" )
3724 DO J=NJTS,MIN(NJTE,NJDE-1)
3726 DO I=NITS,MIN(NITE,NIDE-1)
3727 IF(IMASK(I,J) .NE. 1)THEN
3728 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
3729 NFLD(I,K,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), K,JJH(I,J) ) &
3730 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J) ) &
3731 + NBWGT(3,I,J)*CFLD(IIH(I,J), K,JJH(I,J)-1) &
3732 + NBWGT(4,I,J)*CFLD(IIH(I,J), K,JJH(I,J)+1)
3734 NFLD(I,K,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), K,JJH(I,J) ) &
3735 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J) ) &
3736 + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J)-1) &
3737 + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J)+1)
3744 END SUBROUTINE interp_hnear_ikj_nmm
3746 !=======================================================================================
3747 ! E grid nearest neighbour interpolation for integer H points
3748 !=======================================================================================
3750 SUBROUTINE interp_int_hnear_nmm (cfld, & ! CD field; integers
3751 cids, cide, ckds, ckde, cjds, cjde, &
3752 cims, cime, ckms, ckme, cjms, cjme, &
3753 cits, cite, ckts, ckte, cjts, cjte, &
3754 nfld, & ! ND field; integers
3755 nids, nide, nkds, nkde, njds, njde, &
3756 nims, nime, nkms, nkme, njms, njme, &
3757 nits, nite, nkts, nkte, njts, njte, &
3758 shw, & ! stencil half width for interp
3759 imask, & ! interpolation mask
3760 xstag, ystag, & ! staggering of field
3761 ipos, jpos, & ! lower left of nest in CD
3762 nri, nrj, & ! nest ratios
3763 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! s-w grid locs and weights
3764 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3765 CBWGT4, HBWGT4 ) ! just dummys
3769 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3770 cims, cime, ckms, ckme, cjms, cjme, &
3771 cits, cite, ckts, ckte, cjts, cjte, &
3772 nids, nide, nkds, nkde, njds, njde, &
3773 nims, nime, nkms, nkme, njms, njme, &
3774 nits, nite, nkts, nkte, njts, njte, &
3778 LOGICAL, INTENT(IN) :: xstag, ystag
3780 INTEGER, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
3781 INTEGER, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
3782 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3783 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3784 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3785 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3786 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3793 REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT
3796 !*** INDEX CONVENTIONS
3804 !*** NBWGT1=1 NBWGT2=0
3810 DO J=NJTS,MIN(NJTE,NJDE-1)
3811 DO I=NITS,MIN(NITE,NIDE-1)
3812 IF(IMASK(I,J) .NE. 1)THEN
3813 NBWGT(1,I,J)=HBWGT1(I,J)
3814 NBWGT(2,I,J)=HBWGT2(I,J)
3815 NBWGT(3,I,J)=HBWGT3(I,J)
3816 NBWGT(4,I,J)=HBWGT4(I,J)
3821 DO J=NJTS,MIN(NJTE,NJDE-1)
3822 DO I=NITS,MIN(NITE,NIDE-1)
3823 IF(IMASK(I,J) .NE. 1)THEN
3827 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL)
3833 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN
3839 SUM=SUM+NBWGT(N,I,J)
3840 IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" )
3847 DO J=NJTS,MIN(NJTE,NJDE-1)
3849 DO I=NITS,MIN(NITE,NIDE-1)
3850 IF(IMASK(I,J) .NE. 1)THEN
3851 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
3852 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3853 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3854 + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
3855 + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
3857 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3858 + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3859 + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
3860 + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
3867 END SUBROUTINE interp_int_hnear_nmm
3869 !--------------------------------------------------------------------------------------
3871 SUBROUTINE nmm_bdy_hinterp (cfld, & ! CD field
3872 cids, cide, ckds, ckde, cjds, cjde, &
3873 cims, cime, ckms, ckme, cjms, cjme, &
3874 cits, cite, ckts, ckte, cjts, cjte, &
3876 nids, nide, nkds, nkde, njds, njde, &
3877 nims, nime, nkms, nkme, njms, njme, &
3878 nits, nite, nkts, nkte, njts, njte, &
3879 shw, & ! stencil half width
3880 imask, & ! interpolation mask
3881 xstag, ystag, & ! staggering of field
3882 ipos, jpos, & ! Position of lower left of nest in CD
3883 nri, nrj, & ! nest ratios
3892 CTEMP_B,NTEMP_B, & ! These temp arrays should be removed
3893 CTEMP_BT,NTEMP_BT, & ! later on
3894 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
3895 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
3896 CBWGT4, HBWGT4 ) ! dummys
3898 ! use module_state_description
3899 USE module_configure
3900 USE module_wrf_error
3905 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
3906 cims, cime, ckms, ckme, cjms, cjme, &
3907 cits, cite, ckts, ckte, cjts, cjte, &
3908 nids, nide, nkds, nkde, njds, njde, &
3909 nims, nime, nkms, nkme, njms, njme, &
3910 nits, nite, nkts, nkte, njts, njte, &
3915 LOGICAL, INTENT(IN) :: xstag, ystag
3917 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
3918 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
3920 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: ctemp_b,ctemp_bt
3921 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: ntemp_b,ntemp_bt
3923 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
3924 REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye
3925 REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye
3926 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
3927 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
3928 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
3929 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
3934 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: cwk1,cwk2,cwk3,cwk4
3938 NMM_XS: IF(NITS .EQ. NIDS)THEN
3939 ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1)
3942 DO J = NJTS,MIN(NJTE,NJDE-1)
3943 IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of nested domain
3944 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
3945 CWK1(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3946 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3947 + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
3948 + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
3952 CWK1(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3953 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3954 + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
3955 + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
3958 CWK1(I,J,K) = 0.0 ! even rows at mass points of the nested domain
3960 ntemp_b(i,J,K) = CWK1(I,J,K)
3961 ntemp_bt(i,J,K) = 0.0
3968 NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN
3969 ! WRITE(0,*)'ENTERING X END BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1)
3972 DO J = NJTS,MIN(NJTE,NJDE-1)
3973 IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of the nested domain
3974 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
3975 CWK2(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3976 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3977 + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
3978 + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
3980 CWK2(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
3981 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
3982 + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
3983 + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
3986 CWK2(I,J,K) = 0.0 ! even rows at mass points
3988 ntemp_b(i,J,K) = CWK2(I,J,K)
3989 ntemp_bt(i,J,K) = 0.0
3996 NMM_YS: IF(NJTS .EQ. NJDS)THEN
3997 ! WRITE(0,*)'ENTERING Y START BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1)
4000 DO I = NITS,MIN(NITE,NIDE-1)
4001 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
4002 CWK3(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
4003 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
4004 + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
4005 + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
4007 CWK3(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
4008 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
4009 + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
4010 + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
4012 ntemp_b(i,J,K) = CWK3(I,J,K)
4013 ntemp_bt(i,J,K) = 0.0
4020 NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN
4021 ! WRITE(0,*)'ENTERING Y END BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1)
4024 DO I = NITS,MIN(NITE,NIDE-1)
4025 IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
4026 CWK4(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
4027 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
4028 + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) &
4029 + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K)
4031 CWK4(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) &
4032 + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) &
4033 + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) &
4034 + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K)
4037 ntemp_b(i,J,K) = CWK4(I,J,K)
4038 ntemp_bt(i,J,K) = 0.0
4045 END SUBROUTINE nmm_bdy_hinterp
4047 !--------------------------------------------------------------------------------------
4049 SUBROUTINE nmm_bdy_vinterp ( cfld, & ! CD field
4050 cids, cide, ckds, ckde, cjds, cjde, &
4051 cims, cime, ckms, ckme, cjms, cjme, &
4052 cits, cite, ckts, ckte, cjts, cjte, &
4054 nids, nide, nkds, nkde, njds, njde, &
4055 nims, nime, nkms, nkme, njms, njme, &
4056 nits, nite, nkts, nkte, njts, njte, &
4057 shw, & ! stencil half width
4058 imask, & ! interpolation mask
4059 xstag, ystag, & ! staggering of field
4060 ipos, jpos, & ! Position of lower left of nest in CD
4061 nri, nrj, & ! nest ratios
4070 CTEMP_B,NTEMP_B, & ! These temp arrays should be removed
4071 CTEMP_BT,NTEMP_BT, & ! later on
4072 CII, IIV, CJJ, JJV, CBWGT1, VBWGT1, & ! south-western grid locs and weights
4073 CBWGT2, VBWGT2, CBWGT3, VBWGT3, & ! note that "C"ourse grid ones are
4074 CBWGT4, VBWGT4 ) ! dummys
4076 ! use module_state_description
4077 USE module_configure
4078 USE module_wrf_error
4083 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4084 cims, cime, ckms, ckme, cjms, cjme, &
4085 cits, cite, ckts, ckte, cjts, cjte, &
4086 nids, nide, nkds, nkde, njds, njde, &
4087 nims, nime, nkms, nkme, njms, njme, &
4088 nits, nite, nkts, nkte, njts, njte, &
4093 LOGICAL, INTENT(IN) :: xstag, ystag
4095 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
4096 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
4098 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: ctemp_b,ctemp_bt
4099 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: ntemp_b,ntemp_bt
4101 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
4102 REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye
4103 REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye
4104 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
4105 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
4106 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
4107 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIV,JJV
4112 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: cwk1,cwk2,cwk3,cwk4
4116 NMM_XS: IF(NITS .EQ. NIDS)THEN
4117 ! WRITE(0,*)'ENTERING X START BOUNDARY AT VELOCITY POINTS',NITS,NIDS,NJTS,MIN(NJTE,NJDE-1)
4120 DO J = NJTS,MIN(NJTE,NJDE-1)
4121 IF(MOD(J,2) .EQ.0)THEN ! 1,3,5,7 of nested domain
4122 IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
4123 CWK1(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4124 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4125 + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) &
4126 + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K)
4128 CWK1(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4129 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4130 + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) &
4131 + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K)
4134 CWK1(I,J,K) = 0.0 ! odd rows along J, at mass points have zero velocity
4136 ntemp_b(i,J,K) = CWK1(I,J,K)
4137 ntemp_bt(i,J,K) = 0.0
4144 NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN
4145 ! WRITE(0,*)'ENTERING X END BOUNDARY AT VELOCITY POINTS',NITE-1,NIDE-1,NJTS,MIN(NJTE,NJDE-1)
4148 DO J = NJTS,MIN(NJTE,NJDE-1)
4149 IF(MOD(J,2) .EQ.0)THEN ! 1,3,5,7 of the nested domain
4150 IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain
4151 CWK2(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4152 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4153 + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) &
4154 + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K)
4156 CWK2(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4157 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4158 + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) &
4159 + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K)
4162 CWK2(I,J,K) = 0.0 ! odd rows at mass points
4164 ntemp_b(i,J,K) = CWK2(I,J,K)
4165 ntemp_bt(i,J,K) = 0.0
4172 NMM_YS: IF(NJTS .EQ. NJDS)THEN
4173 ! WRITE(0,*)'ENTERING Y START BOUNDARY AT VELOCITY POINTS',NJTS,NJDS,NITS,MIN(NITE,NIDE-1)
4176 DO I = NITS,MIN(NITE,NIDE-2) ! NIDE-1 SHOULD NOT MATTER IF WE FILL UP PHANTOM CELL
4177 IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7
4178 CWK3(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4179 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4180 + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) &
4181 + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K)
4183 CWK3(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4184 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4185 + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) &
4186 + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K)
4188 ntemp_b(i,J,K) = CWK3(I,J,K)
4189 ntemp_bt(i,J,K) = 0.0
4196 NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN
4197 ! WRITE(0,*)'ENTERING Y END BOUNDARY AT VELOCITY POINTS',NJTE-1,NJDE-1,NITS,MIN(NITE,NIDE-1)
4200 DO I = NITS,MIN(NITE,NIDE-2) ! NIDE-1 SHOULD NOT MATTER IF WE FILL UP PHANTOM CELL
4201 IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7
4202 CWK4(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4203 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4204 + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) &
4205 + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K)
4207 CWK4(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) &
4208 + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) &
4209 + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) &
4210 + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K)
4212 ntemp_b(i,J,K) = CWK4(I,J,K)
4213 ntemp_bt(i,J,K) = 0.0
4220 END SUBROUTINE nmm_bdy_vinterp
4223 !=======================================================================================
4224 ! E grid interpolation: simple copy from parent to mother domain
4225 !=======================================================================================
4228 SUBROUTINE nmm_copy ( cfld, & ! CD field
4229 cids, cide, ckds, ckde, cjds, cjde, &
4230 cims, cime, ckms, ckme, cjms, cjme, &
4231 cits, cite, ckts, ckte, cjts, cjte, &
4233 nids, nide, nkds, nkde, njds, njde, &
4234 nims, nime, nkms, nkme, njms, njme, &
4235 nits, nite, nkts, nkte, njts, njte, &
4236 shw, & ! stencil half width
4237 imask, & ! interpolation mask
4238 xstag, ystag, & ! staggering of field
4239 ipos, jpos, & ! Position of lower left of nest in CD
4240 nri, nrj, & ! nest ratios
4241 CII, IIH, CJJ, JJH )
4246 LOGICAL, INTENT(IN) :: xstag, ystag
4247 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4248 cims, cime, ckms, ckme, cjms, cjme, &
4249 cits, cite, ckts, ckte, cjts, cjte, &
4250 nids, nide, nkds, nkde, njds, njde, &
4251 nims, nime, nkms, nkme, njms, njme, &
4252 nits, nite, nkts, nkte, njts, njte, &
4256 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(IN) :: cfld
4257 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(INOUT) :: nfld
4258 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask
4259 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
4260 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
4265 DO J=NJTS,MIN(NJTE,NJDE-1)
4267 DO I=NITS,MIN(NITE,NIDE-1)
4268 NFLD(I,J,K) = CFLD(IIH(I,J),JJH(I,J),K)
4275 END SUBROUTINE nmm_copy
4277 !=======================================================================================
4278 ! E grid test for mass point coincidence
4279 !=======================================================================================
4281 SUBROUTINE test_nmm (cfld, & ! CD field
4282 cids, cide, ckds, ckde, cjds, cjde, &
4283 cims, cime, ckms, ckme, cjms, cjme, &
4284 cits, cite, ckts, ckte, cjts, cjte, &
4286 nids, nide, nkds, nkde, njds, njde, &
4287 nims, nime, nkms, nkme, njms, njme, &
4288 nits, nite, nkts, nkte, njts, njte, &
4289 shw, & ! stencil half width for interp
4290 imask, & ! interpolation mask
4291 xstag, ystag, & ! staggering of field
4292 ipos, jpos, & ! Position of lower left of nest in CD
4293 nri, nrj, & ! nest ratios
4294 CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights
4295 CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are
4296 CBWGT4, HBWGT4 ) ! dummys for weights
4300 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4301 cims, cime, ckms, ckme, cjms, cjme, &
4302 cits, cite, ckts, ckte, cjts, cjte, &
4303 nids, nide, nkds, nkde, njds, njde, &
4304 nims, nime, nkms, nkme, njms, njme, &
4305 nits, nite, nkts, nkte, njts, njte, &
4309 LOGICAL, INTENT(IN) :: xstag, ystag
4311 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld
4312 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld
4313 REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy
4314 REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
4315 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy
4316 INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH
4317 INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask
4321 REAL,PARAMETER :: error=0.0001,error1=1.0
4324 !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION
4326 DO J=NJTS,MIN(NJTE,NJDE-1)
4327 DO I=NITS,MIN(NITE,NIDE-1)
4328 IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) &
4329 CALL wrf_error_fatal ('hpoints:check domain bounds along x' )
4330 IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) &
4331 CALL wrf_error_fatal ('hpoints:check domain bounds along y' )
4336 !*** INDEX CONVENTIONS
4351 ! WRITE(0,*)NITS,MIN(NITE,NIDE-1),CITS,CITE
4352 DO J=NJTS,MIN(NJTE,NJDE-1)
4354 DO I=NITS,MIN(NITE,NIDE-1)
4355 IF(ABS(1.0-HBWGT1(I,J)) .LE. ERROR)THEN
4356 DIFF=ABS(NFLD(I,J,K)-CFLD(IIH(I,J),JJH(I,J),K))
4357 IF(DIFF .GT. ERROR)THEN
4358 CALL wrf_debug(1,"dyn_nmm: NON-COINCIDENT, NESTED MASS POINT")
4359 WRITE(0,*)I,IIH(I,J),J,JJH(I,J),HBWGT1(I,J),NFLD(I,J,K),CFLD(IIH(I,J),JJH(I,J),K),DIFF
4361 IF(DIFF .GT. ERROR1)THEN
4362 WRITE(0,*)I,IIH(I,J),J,JJH(I,J),HBWGT1(I,J),NFLD(I,J,K),CFLD(IIH(I,J),JJH(I,J),K),DIFF
4363 CALL wrf_error_fatal ('dyn_nmm: NON-COINCIDENT, NESTED MASS POINT')
4370 END SUBROUTINE test_nmm
4372 !==================================
4373 ! this is the default function used in nmm feedback at mass points.
4375 SUBROUTINE nmm_feedback ( cfld, & ! CD field
4376 cids, cide, ckds, ckde, cjds, cjde, &
4377 cims, cime, ckms, ckme, cjms, cjme, &
4378 cits, cite, ckts, ckte, cjts, cjte, &
4380 nids, nide, nkds, nkde, njds, njde, &
4381 nims, nime, nkms, nkme, njms, njme, &
4382 nits, nite, nkts, nkte, njts, njte, &
4383 shw, & ! stencil half width for interp
4384 imask, & ! interpolation mask
4385 xstag, ystag, & ! staggering of field
4386 ipos, jpos, & ! Position of lower left of nest in CD
4387 nri, nrj, & ! nest ratios
4388 CII, IIH, CJJ, JJH, &
4389 CBWGT1, HBWGT1, CBWGT2, HBWGT2, &
4390 CBWGT3, HBWGT3, CBWGT4, HBWGT4 )
4391 USE module_configure
4395 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4396 cims, cime, ckms, ckme, cjms, cjme, &
4397 cits, cite, ckts, ckte, cjts, cjte, &
4398 nids, nide, nkds, nkde, njds, njde, &
4399 nims, nime, nkms, nkme, njms, njme, &
4400 nits, nite, nkts, nkte, njts, njte, &
4404 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
4405 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH
4406 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4
4407 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
4408 LOGICAL, INTENT(IN) :: xstag, ystag
4410 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: cfld
4411 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(IN) :: nfld
4412 INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask
4416 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
4417 INTEGER :: icmin,icmax,jcmin,jcmax
4418 INTEGER :: is, ipoints,jpoints,ijpoints
4419 INTEGER , PARAMETER :: passes = 2
4422 !=====================================================================================
4425 IF(nri .ne. 3 .OR. nrj .ne. 3) &
4426 CALL wrf_error_fatal ('Feedback works for only 1:3 ratios, currently. Modify the namelist' )
4428 ! WRITE(0,*)'SIMPLE FEED BACK IS SWITCHED ON FOR MASS'
4434 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4435 nj = (cj-jpos)*nrj + 1
4436 if(mod(cj,2) .eq. 0)THEN
4437 is=0 ! even rows for mass points (2,4,6,8)
4439 is=1 ! odd rows for mass points (1,3,5,7)
4441 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4442 ni = (ci-ipos)*nri + 2 -is
4443 IF(IS==0)THEN ! (2,4,6,8)
4444 ! AVGH = NFLD(NI,NJ+1,NK) + NFLD(NI,NJ-1,NK) + NFLD(NI+1,NJ+1,NK)+ NFLD(NI+1,NJ-1,NK) &
4445 ! + NFLD(NI+1,NJ,NK) + NFLD(NI-1,NJ,NK) + NFLD(NI,NJ+2,NK) + NFLD(NI,NJ-2,NK) &
4446 ! + NFLD(NI+1,NJ+2,NK)+ NFLD(NI-1,NJ+2,NK)+ NFLD(NI+1,NJ-2,NK)+ NFLD(NI-1,NJ-2,NK)
4448 AVGH = NFLD(NI,NJ+2,NK) &
4449 + NFLD(NI ,NJ+1,NK) + NFLD(NI+1,NJ+1,NK) &
4450 + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) &
4451 + NFLD(NI ,NJ-1,NK) + NFLD(NI+1,NJ-1,NK) &
4455 ! AVGH = NFLD(NI,NJ+1,NK) + NFLD(NI,NJ-1,NK) + NFLD(NI-1,NJ+1,NK)+ NFLD(NI-1,NJ-1,NK) &
4456 ! + NFLD(NI+1,NJ,NK) + NFLD(NI-1,NJ,NK) + NFLD(NI,NJ+2,NK) + NFLD(NI,NJ-2,NK) &
4457 ! + NFLD(NI+1,NJ+2,NK)+ NFLD(NI-1,NJ+2,NK)+ NFLD(NI+1,NJ-2,NK)+ NFLD(NI-1,NJ-2,NK)
4459 AVGH = NFLD(NI,NJ+2,NK) &
4460 + NFLD(NI-1,NJ+1,NK) + NFLD(NI,NJ+1,NK) &
4461 + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) &
4462 + NFLD(NI-1,NJ-1,NK) + NFLD(NI,NJ-1,NK) &
4466 !dusan CFLD(CI,CK,CJ) = 0.5*CFLD(CI,CK,CJ) + 0.5*(NFLD(NI,NK,NJ)+AVGH)/13.0
4467 ! CFLD(CI,CJ,CK) = (NFLD(NI,NJ,NK)+AVGH)/13.0
4468 CFLD(CI,CJ,CK) = AVGH/9.0
4473 END SUBROUTINE nmm_feedback
4475 !===========================================================================================
4477 SUBROUTINE nmm_vfeedback ( cfld, & ! CD field
4478 cids, cide, ckds, ckde, cjds, cjde, &
4479 cims, cime, ckms, ckme, cjms, cjme, &
4480 cits, cite, ckts, ckte, cjts, cjte, &
4482 nids, nide, nkds, nkde, njds, njde, &
4483 nims, nime, nkms, nkme, njms, njme, &
4484 nits, nite, nkts, nkte, njts, njte, &
4485 shw, & ! stencil half width for interp
4486 imask, & ! interpolation mask
4487 xstag, ystag, & ! staggering of field
4488 ipos, jpos, & ! Position of lower left of nest in CD
4489 nri, nrj, & ! nest ratios
4490 CII, IIV, CJJ, JJV, &
4491 CBWGT1, VBWGT1, CBWGT2, VBWGT2, &
4492 CBWGT3, VBWGT3, CBWGT4, VBWGT4 )
4493 USE module_configure
4497 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4498 cims, cime, ckms, ckme, cjms, cjme, &
4499 cits, cite, ckts, ckte, cjts, cjte, &
4500 nids, nide, nkds, nkde, njds, njde, &
4501 nims, nime, nkms, nkme, njms, njme, &
4502 nits, nite, nkts, nkte, njts, njte, &
4506 INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy
4507 INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIV,JJV
4508 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4
4509 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
4510 LOGICAL, INTENT(IN) :: xstag, ystag
4512 REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: cfld
4513 REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(IN) :: nfld
4514 INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask
4518 INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa
4519 INTEGER :: icmin,icmax,jcmin,jcmax
4520 INTEGER :: is, ipoints,jpoints,ijpoints
4521 INTEGER , PARAMETER :: passes = 2
4524 !=====================================================================================
4527 IF(nri .ne. 3 .OR. nrj .ne. 3) &
4528 CALL wrf_error_fatal ('Feedback works for only 1:3 ratios, currently. Modify the namelist')
4530 ! WRITE(0,*)'SIMPLE FEED BACK IS SWITCHED ON FOR VELOCITY'
4536 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4537 nj = (cj-jpos)*nrj + 1
4538 if(mod(cj,2) .eq. 0)THEN
4539 is=1 ! even rows for velocity points (2,4,6,8)
4541 is=0 ! odd rows for velocity points (1,3,5,7)
4543 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4544 ni = (ci-ipos)*nri + 2 -is
4545 IF(IS==0)THEN ! (1,3,5,7)
4546 ! AVGV = NFLD(NI,NK,NJ+1) + NFLD(NI,NK,NJ-1) + NFLD(NI+1,NK,NJ+1)+ NFLD(NI+1,NK,NJ-1) &
4547 ! + NFLD(NI+1,NK,NJ) + NFLD(NI-1,NK,NJ) + NFLD(NI,NK,NJ+2) + NFLD(NI,NK,NJ-2) &
4548 ! + NFLD(NI+1,NK,NJ+2)+ NFLD(NI-1,NK,NJ+2)+ NFLD(NI+1,NK,NJ-2)+ NFLD(NI-1,NK,NJ-2)
4550 AVGV = NFLD(NI,NJ+2,NK) &
4551 + NFLD(NI ,NJ+1,NK) + NFLD(NI+1,NJ+1,NK) &
4552 + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) &
4553 + NFLD(NI ,NJ-1,NK) + NFLD(NI+1,NJ-1,NK) &
4557 ! AVGV = NFLD(NI,NK,NJ+1) + NFLD(NI,NK,NJ-1) + NFLD(NI-1,NK,NJ+1)+ NFLD(NI-1,NK,NJ-1) &
4558 ! + NFLD(NI+1,NK,NJ) + NFLD(NI-1,NK,NJ) + NFLD(NI,NK,NJ+2) + NFLD(NI,NK,NJ-2) &
4559 ! + NFLD(NI+1,NK,NJ+2)+ NFLD(NI-1,NK,NJ+2)+ NFLD(NI+1,NK,NJ-2)+ NFLD(NI-1,NK,NJ-2)
4561 AVGV = NFLD(NI,NJ+2,NK) &
4562 + NFLD(NI-1,NJ+1,NK) + NFLD(NI,NJ+1,NK) &
4563 + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) &
4564 + NFLD(NI-1,NJ-1,NK) + NFLD(NI,NJ-1,NK) &
4568 !dusan CFLD(CI,CK,CJ) = 0.5*CFLD(CI,CK,CJ) + 0.5*(NFLD(NI,NK,NJ)+AVGV)/13.0
4569 ! CFLD(CI,CK,CJ) = (NFLD(NI,NK,NJ)+AVGV)/13.0
4570 CFLD(CI,CJ,CK) = AVGV/9.0
4575 END SUBROUTINE nmm_vfeedback
4578 SUBROUTINE nmm_smoother ( cfld , &
4579 cids, cide, ckds, ckde, cjds, cjde, &
4580 cims, cime, ckms, ckme, cjms, cjme, &
4581 cits, cite, ckts, ckte, cjts, cjte, &
4582 nids, nide, nkds, nkde, njds, njde, &
4583 nims, nime, nkms, nkme, njms, njme, &
4584 nits, nite, nkts, nkte, njts, njte, &
4590 USE module_configure
4593 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4594 cims, cime, ckms, ckme, cjms, cjme, &
4595 cits, cite, ckts, ckte, cjts, cjte, &
4596 nids, nide, nkds, nkde, njds, njde, &
4597 nims, nime, nkms, nkme, njms, njme, &
4598 nits, nite, nkts, nkte, njts, njte, &
4601 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld
4602 LOGICAL, INTENT(IN) :: xstag, ystag
4608 INTEGER, PARAMETER :: smooth_passes = 5
4610 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew
4611 INTEGER :: ci, cj, ck
4612 INTEGER :: is, npass
4616 ! If there is no feedback, there can be no smoothing.
4618 CALL nl_get_feedback ( 1, feedback )
4619 IF ( feedback == 0 ) RETURN
4621 WRITE(0,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR HEIGHT'
4623 DO npass = 1, smooth_passes
4625 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4626 if(mod(cj,2) .eq. 0)THEN
4627 is=0 ! even rows for mass points (2,4,6,8)
4629 is=1 ! odd rows for mass points (1,3,5,7)
4632 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4633 IF(IS==0)THEN ! (2,4,6,8)
4634 AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1)
4636 AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1)
4638 CFLDNEW(CI,CK,CJ) = (AVGH + 4*CFLD(CI,CK,CJ)) / 8.0
4643 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4644 if(mod(cj,2) .eq. 0)THEN
4645 is=0 ! even rows for mass points (2,4,6,8)
4647 is=1 ! odd rows for mass points (1,3,5,7)
4650 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4651 CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ)
4658 END SUBROUTINE nmm_smoother
4661 SUBROUTINE nmm_vsmoother ( cfld , &
4662 cids, cide, ckds, ckde, cjds, cjde, &
4663 cims, cime, ckms, ckme, cjms, cjme, &
4664 cits, cite, ckts, ckte, cjts, cjte, &
4665 nids, nide, nkds, nkde, njds, njde, &
4666 nims, nime, nkms, nkme, njms, njme, &
4667 nits, nite, nkts, nkte, njts, njte, &
4673 USE module_configure
4676 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, &
4677 cims, cime, ckms, ckme, cjms, cjme, &
4678 cits, cite, ckts, ckte, cjts, cjte, &
4679 nids, nide, nkds, nkde, njds, njde, &
4680 nims, nime, nkms, nkme, njms, njme, &
4681 nits, nite, nkts, nkte, njts, njte, &
4684 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld
4685 LOGICAL, INTENT(IN) :: xstag, ystag
4691 INTEGER, PARAMETER :: smooth_passes = 5
4693 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew
4694 INTEGER :: ci, cj, ck
4695 INTEGER :: is, npass
4699 ! If there is no feedback, there can be no smoothing.
4701 CALL nl_get_feedback ( 1, feedback )
4702 IF ( feedback == 0 ) RETURN
4704 WRITE(0,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR VELOCITY'
4706 DO npass = 1, smooth_passes
4708 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4709 if(mod(cj,2) .eq. 0)THEN
4710 is=1 ! even rows for mass points (2,4,6,8)
4712 is=0 ! odd rows for mass points (1,3,5,7)
4715 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4716 IF(IS==0)THEN ! (2,4,6,8)
4717 AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1)
4719 AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1)
4721 CFLDNEW(CI,CK,CJ) = (AVGV + 4*CFLD(CI,CK,CJ)) / 8.0
4726 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs
4727 if(mod(cj,2) .eq. 0)THEN
4728 is=1 ! even rows for mass points (2,4,6,8)
4730 is=0 ! odd rows for mass points (1,3,5,7)
4733 DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs
4734 CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ)
4741 END SUBROUTINE nmm_vsmoother
4742 !======================================================================================
4743 ! End of gopal's doing
4744 !======================================================================================