!WRF:MEDIATION_LAYER:INTERPOLATIONFUNCTION ! #if (DA_CORE != 1) #define MM5_SINT #endif !#define DUMBCOPY ! Note, NMM-specific routines moved to end. 20080612. JM SUBROUTINE interp_fcn ( cfld, & ! CD field 1,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_timing USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Local !logical first INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, nioff, njoff #ifdef MM5_SINT INTEGER nfx, ior PARAMETER (ior=2) INTEGER nf REAL psca(cims:cime,cjms:cjme,nri*nrj) LOGICAL icmask( cims:cime, cjms:cjme ) INTEGER i,j,k INTEGER nrio2, nrjo2 #endif ! Iterate over the ND tile and compute the values ! from the CD tile. #ifdef MM5_SINT ioff = 0 ; joff = 0 nioff = 0 ; njoff = 0 IF ( xstag ) THEN ioff = (nri-1)/2 nioff = nri ENDIF IF ( ystag ) THEN joff = (nrj-1)/2 njoff = nrj ENDIF nrio2 = nri/2 nrjo2 = nrj/2 nfx = nri * nrj !$OMP PARALLEL DO & !$OMP PRIVATE ( i,j,k,ni,nj,ci,cj,ip,jp,nk,ck,nf,icmask,psca ) DO k = ckts, ckte icmask = .FALSE. DO nf = 1,nfx DO j = cjms,cjme nj = (j-jpos) * nrj + ( nrjo2 + 1 ) ! j point on nest DO i = cims,cime ni = (i-ipos) * nri + ( nrio2 + 1 ) ! i point on nest if ( ni .ge. nits-nioff-nrio2 .and. & ni .le. nite+nioff+nrio2 .and. & nj .ge. njts-njoff-nrjo2 .and. & nj .le. njte+njoff+nrjo2 ) then ! if ( imask(ni,nj) .eq. 1 .or. imask(ni-nioff,nj-njoff) .eq. 1 ) then ! icmask( i, j ) = .TRUE. ! endif if ( ni.ge.nims.and.ni.le.nime.and.nj.ge.njms.and.nj.le.njme) then if ( imask(ni,nj) .eq. 1 ) then icmask( i, j ) = .TRUE. endif endif if ( ni-nioff.ge.nims.and.ni.le.nime.and.nj-njoff.ge.njms.and.nj.le.njme) then if (ni .ge. nits-nioff .and. nj .ge. njts-njoff ) then if ( imask(ni-nioff,nj-njoff) .eq. 1) then icmask( i, j ) = .TRUE. endif endif endif endif psca(i,j,nf) = cfld(i,k,j) ENDDO ENDDO ENDDO ! tile dims in this call to sint are 1-over to account for the fact ! that the number of cells on the nest local subdomain is not ! necessarily a multiple of the nest ratio in a given dim. ! this could be a little less ham-handed. !call start_timing CALL sint( psca, & cims, cime, cjms, cjme, icmask, & cits-1, cite+1, cjts-1, cjte+1, nrj*nri, xstag, ystag ) !call end_timing( ' sint ' ) DO nj = njts, njte+joff cj = jpos + (nj-1) / nrj ! j coord of CD point jp = mod ( nj-1 , nrj ) ! coord of ND w/i CD point nk = k ck = nk DO ni = nits, nite+ioff ci = ipos + (ni-1) / nri ! i coord of CD point ip = mod ( ni-1 , nri ) ! coord of ND w/i CD point if ( imask ( ni, nj ) .eq. 1 .or. imask ( ni-ioff, nj-joff ) .eq. 1 ) then nfld( ni-ioff, nk, nj-joff ) = psca( ci , cj, ip+1 + (jp)*nri ) endif ENDDO ENDDO ENDDO !$OMP END PARALLEL DO #endif #ifdef DUMBCOPY !write(0,'(") cims:cime, ckms:ckme, cjms:cjme ",6i4)')cims,cime, ckms,ckme, cjms,cjme !write(0,'(") nims:nime, nkms:nkme, njms:njme ",6i4)')nims,nime, nkms,nkme, njms,njme !write(0,'(") cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte !write(0,'(") nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte DO nj = njts, njte cj = jpos + (nj-1) / nrj ! j coord of CD point jp = mod ( nj , nrj ) ! coord of ND w/i CD point DO nk = nkts, nkte ck = nk DO ni = nits, nite ci = ipos + (ni-1) / nri ! j coord of CD point ip = mod ( ni , nri ) ! coord of ND w/i CD point ! This is a trivial implementation of the interp_fcn; just copies ! the values from the CD into the ND if ( imask ( ni, nj ) .eq. 1 ) then nfld( ni, nk, nj ) = cfld( ci , ck , cj ) endif ENDDO ENDDO ENDDO #endif RETURN END SUBROUTINE interp_fcn !========================================================================= SUBROUTINE interp_fcn_bl ( cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! Nest ratio, i- and j-directions cht, nht, & ! topography for CG and FG ct_max_p,nt_max_p, & ! temperature (K) at max press, want CG value cght_max_p,nght_max_p, & ! height (m) at max press, want CG value cmax_p,nmax_p, & ! max pressure (Pa) in column, want CG value ct_min_p,nt_min_p, & ! temperature (K) at min press, want CG value cght_min_p,nght_min_p, & ! height (m) at min press, want CG value cmin_p,nmin_p, & ! min pressure (Pa) in column, want CG value zn, p_top ) ! eta levels USE module_timing USE module_configure USE module_model_constants , ONLY : g , r_d, cp, p1000mb, t0 IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cht, ct_max_p, cght_max_p, cmax_p, ct_min_p, cght_min_p, cmin_p REAL, DIMENSION ( nims:nime, njms:njme ) :: nht, nt_max_p, nght_max_p, nmax_p, nt_min_p, nght_min_p, nmin_p REAL, DIMENSION ( ckms:ckme ) :: zn REAL :: p_top REAL, EXTERNAL :: v_interp_col ! Local INTEGER ci, cj, ni, nj, nk, istag, jstag, i, j, k REAL :: wx, wy, nprs, cfld_ll, cfld_lr, cfld_ul, cfld_ur REAL , DIMENSION(ckms:ckme) :: cprs REAL :: p00 , t00 , a , tiso , p_surf ! Yes, memory sized to allow "outside the tile" indexing for horiz interpolation. This ! is really an intermediate domain that has quite a bit of usable real estate surrounding ! the tile dimensions. REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cpb ! A bit larger than tile sized to allow horizontal interpolation on the CG. REAL, DIMENSION ( cits-2:cite+2, cjts-2:cjte+2 ) :: cfld_max_p, cfld_min_p ! The usual tile size for the FG local array. REAL, DIMENSION ( nits:nite, nkts:nkte, njts:njte ) :: npb ! Get base state constants CALL nl_get_base_pres ( 1 , p00 ) CALL nl_get_base_temp ( 1 , t00 ) CALL nl_get_base_lapse ( 1 , a ) CALL nl_get_iso_temp ( 1 , tiso ) ! This stag stuff is to keep us away from the outer most row ! and column for the unstaggered directions. We are going to ! consider "U" an xstag variable and "V" a ystag variable. The ! vertical staggering is handled in the actual arguments. The ! ckte and nkte are the ending vertical dimensions for computations ! for this particular variable. IF ( xstag ) THEN istag = 0 ELSE istag = 1 END IF IF ( ystag ) THEN jstag = 0 ELSE jstag = 1 END IF ! Compute the reference pressure for the CG, function only of constants and elevation. ! We extend the i,j range to allow us to do horizontal interpolation. We only need ! one extra grid cell surrounding the nest, and the intermediate domain has plenty of ! room with the halos set up for higher-order interpolations. For intermediate domains, ! it turns out that the "domain" size actually fits within the "tile" size. Yeppers, ! that is backwards from what usually happens. That intermediate domain size is a couple ! grid points larger than necessary, and the tile is a couple of grid cells larger still. ! For our low-order interpolation, we can use the tile size for the CG, and we will have ! plenty of data on our boundaries. DO j = cjts-2 , cjte+2 DO i = cits-2 , cite+2 p_surf = p00 * EXP ( -t00/a + ( (t00/a)**2 - 2.*g*cht(i,j)/a/r_d ) **0.5 ) DO k = ckts , ckte cpb(i,k,j) = zn(k)*(p_surf - p_top) + p_top END DO IF ( ckte .EQ. ckme ) THEN cfld_max_p(i,j) = cght_max_p(i,j) * g cfld_min_p(i,j) = cght_min_p(i,j) * g ELSE cfld_max_p(i,j) = ct_max_p(i,j) * (p1000mb/cmax_p(i,j))**(r_d/cp) - t0 cfld_min_p(i,j) = ct_min_p(i,j) * (p1000mb/cmin_p(i,j))**(r_d/cp) - t0 END IF END DO END DO ! Compute the reference pressure for the FG. This is actually the size of the entire ! domain, not some chopped down piece of intermediate domain, as in the parent ! grid. We do the traditional MAX(dom end -1,tile end), since we know a priori that the ! pressure is a mass point field (because the topo elevation is a mass point field). DO j = njts , MIN(njde-1,njte) DO i = nits , MIN(nide-1,nite) p_surf = p00 * EXP ( -t00/a + ( (t00/a)**2 - 2.*g*nht(i,j)/a/r_d ) **0.5 ) DO k = nkts , nkte npb(i,k,j) = zn(k)*(p_surf - p_top) + p_top END DO END DO END DO ! Loop over each j-index on this tile for the nested domain. j_loop : DO nj = njts, MIN(njde-jstag,njte) ! This is the lower-left j-index of the CG. ! Example is 3:1 ratio, mass-point staggering. We have listed six CG values ! as an example: A, B, C, D, E, F. For a 3:1 ratio, each of these CG cells has ! nine associated FG points. ! |=========|=========|=========| ! | - - - | - - - | - - - | ! | | | | ! | - D - | - E - | - F - | ! | | | | ! | 1 2 3 | 4 5 6 | 7 8 9 | ! |=========|=========|=========| ! | - - - | - - - | - - - | ! | | | | ! | - A - | - B - | - C - | ! | | | | ! | - - - | - - - | - - - | ! |=========|=========|=========| ! To interpolate to FG point 4, we will use CG points: A, B, D, E. It is adequate to ! find the lower left point. The lower left (LL) point for "4" is "A". Below ! are a few more points. ! 2 => A ! 3 => A ! 4 => A ! 5 => B ! 6 => B ! 7 => B ! We want an equation that returns the CG LL: ! CG LL = ipos (the starting point of the nest in the CG) ! + (ni-1)/nri (gives us the CG cell, based on the nri-groups of FG cells ! - istag (a correction term, this is either zero for u in the x-dir, ! since we are doing an "i" example, or 1 for anything else) ! + (MOD(ni-1,nri)+1 + nri/2)/nri (gives us specifically related CG point for each of the nri ! FG points, for example, we want points "1", "4", and "7" all ! to point to the CG at the left for the LL point) ! For grid points 4, 5, 6, we want the CG LL (sans the first two terms) to be -1, 0, 0 (which ! means that the CG point for "4" is to the left, and the CG LL point for "5" and "6" ! is in the current CG index. cj = jpos + (nj-1)/nrj - jstag + (MOD(nj-1,nrj)+1 + nrj/2)/nrj ! What is the weighting for this CG point to the FG point, j-weight only. IF ( ystag ) THEN wy = 1. - ( REAL(MOD(nj+(nrj-1)/2,nrj)) / REAL(nrj) + 1. / REAL (2 * nrj) ) ELSE wy = 1. - ( REAL(MOD(nj+(nrj-1)/2,nrj)) / REAL(nrj) ) END IF ! Vertical dim of the nest domain. k_loop : DO nk = nkts, nkte ! Loop over each i-index on this tile for the nested domain. i_loop : DO ni = nits, MIN(nide-istag,nite) ! The coarse grid location that is to the lower left of the FG point. ci = ipos + (ni-1)/nri - istag + (MOD(ni-1,nri)+1 + nri/2)/nri ! Weights in the x-direction. IF ( xstag ) THEN wx = 1. - ( REAL(MOD(ni+(nri-1)/2,nri)) / REAL(nri) + 1. / REAL (2 * nri) ) ELSE wx = 1. - ( REAL(MOD(ni+(nri-1)/2,nri)) / REAL(nri) ) END IF ! The pressure of the FG point. IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN nprs = npb( ni , nk , nj ) ELSE IF ( xstag ) THEN nprs = ( npb( ni-1, nk , nj ) + npb( ni , nk , nj ) ) * 0.5 ELSE IF ( ystag ) THEN nprs = ( npb( ni , nk , nj-1) + npb( ni , nk , nj ) ) * 0.5 END IF ! The four surrounding CG values. IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN cprs(:) = cpb(ci ,:,cj ) cfld_ll = v_interp_col ( cfld(ci ,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj , cfld_max_p(ci ,cj ) , cmax_p(ci ,cj ) , cfld_min_p(ci ,cj ) , cmin_p(ci ,cj ) ) cprs(:) = cpb(ci+1,:,cj ) cfld_lr = v_interp_col ( cfld(ci+1,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj , cfld_max_p(ci+1,cj ) , cmax_p(ci+1,cj ) , cfld_min_p(ci+1,cj ) , cmin_p(ci+1,cj ) ) cprs(:) = cpb(ci ,:,cj+1) cfld_ul = v_interp_col ( cfld(ci ,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj+1, cfld_max_p(ci ,cj+1) , cmax_p(ci ,cj+1) , cfld_min_p(ci ,cj+1) , cmin_p(ci ,cj+1) ) cprs(:) = cpb(ci+1,:,cj+1) cfld_ur = v_interp_col ( cfld(ci+1,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj+1, cfld_max_p(ci+1,cj+1) , cmax_p(ci+1,cj+1) , cfld_min_p(ci+1,cj+1) , cmin_p(ci+1,cj+1) ) ELSE IF ( xstag ) THEN cprs(:) = ( cpb(ci ,:,cj ) + cpb(ci-1,:,cj ) )*0.5 cfld_ll = v_interp_col ( cfld(ci ,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj , cfld_max_p(ci ,cj ) , cmax_p(ci ,cj ) , cfld_min_p(ci ,cj ) , cmin_p(ci ,cj ) ) cprs(:) = ( cpb(ci+1,:,cj ) + cpb(ci ,:,cj ) )*0.5 cfld_lr = v_interp_col ( cfld(ci+1,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj , cfld_max_p(ci+1,cj ) , cmax_p(ci+1,cj ) , cfld_min_p(ci+1,cj ) , cmin_p(ci+1,cj ) ) cprs(:) = ( cpb(ci ,:,cj+1) + cpb(ci-1,:,cj+1) )*0.5 cfld_ul = v_interp_col ( cfld(ci ,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj+1, cfld_max_p(ci ,cj+1) , cmax_p(ci ,cj+1) , cfld_min_p(ci ,cj+1) , cmin_p(ci ,cj+1) ) cprs(:) = ( cpb(ci+1,:,cj+1) + cpb(ci ,:,cj+1) )*0.5 cfld_ur = v_interp_col ( cfld(ci+1,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj+1, cfld_max_p(ci+1,cj+1) , cmax_p(ci+1,cj+1) , cfld_min_p(ci+1,cj+1) , cmin_p(ci+1,cj+1) ) ELSE IF ( ystag ) THEN cprs(:) = ( cpb(ci ,:,cj ) + cpb(ci ,:,cj-1) )*0.5 cfld_ll = v_interp_col ( cfld(ci ,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj , cfld_max_p(ci ,cj ) , cmax_p(ci ,cj ) , cfld_min_p(ci ,cj ) , cmin_p(ci ,cj ) ) cprs(:) = ( cpb(ci+1,:,cj ) + cpb(ci+1,:,cj-1) )*0.5 cfld_lr = v_interp_col ( cfld(ci+1,:,cj ) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj , cfld_max_p(ci+1,cj ) , cmax_p(ci+1,cj ) , cfld_min_p(ci+1,cj ) , cmin_p(ci+1,cj ) ) cprs(:) = ( cpb(ci ,:,cj+1) + cpb(ci ,:,cj ) )*0.5 cfld_ul = v_interp_col ( cfld(ci ,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci , cj+1, cfld_max_p(ci ,cj+1) , cmax_p(ci ,cj+1) , cfld_min_p(ci ,cj+1) , cmin_p(ci ,cj+1) ) cprs(:) = ( cpb(ci+1,:,cj+1) + cpb(ci+1,:,cj ) )*0.5 cfld_ur = v_interp_col ( cfld(ci+1,:,cj+1) , cprs(:) , ckms , ckme , ckte, nprs, ni, nj, nk, ci+1, cj+1, cfld_max_p(ci+1,cj+1) , cmax_p(ci+1,cj+1) , cfld_min_p(ci+1,cj+1) , cmin_p(ci+1,cj+1) ) END IF ! Bilinear interpolation in horizontal with vertically corrected CG field values. nfld( ni , nk , nj ) = wy * ( cfld_ll * wx + cfld_lr * (1.-wx) ) + & (1.-wy) * ( cfld_ul * wx + cfld_ur * (1.-wx) ) END DO i_loop END DO k_loop END DO j_loop ! If this is ph_2, make the values at k=1 all zero IF ( ckme .EQ. ckte ) THEN DO nj = njts,njte DO ni = nits, nite nfld(ni,nkts,nj) = 0.0 END DO END DO END IF END SUBROUTINE interp_fcn_bl !================================== FUNCTION v_interp_col ( cfld_orig , cprs_orig , ckms , ckme , ckte , nprs, ni, nj, nk, ci, cj, cfld_max_p , cmax_p , cfld_min_p , cmin_p ) RESULT ( cfld_interp ),1 IMPLICIT NONE INTEGER , INTENT(IN) :: ni, nj, nk, ci, cj INTEGER , INTENT(IN) :: ckms , ckme , ckte REAL , DIMENSION(ckms:ckme) , INTENT(IN) :: cfld_orig , cprs_orig REAL , INTENT(IN) :: cfld_max_p , cmax_p , cfld_min_p , cmin_p REAL , INTENT(IN) :: nprs REAL :: cfld_interp ! Local INTEGER :: ck LOGICAL :: found CHARACTER(LEN=256) :: joe_mess REAL , DIMENSION(ckms:ckme+1+1) :: cfld , cprs ! Fill input arrays cfld(1) = cfld_max_p cprs(1) = cmax_p cfld(ckte+2) = cfld_min_p cprs(ckte+2) = cmin_p DO ck = ckms , ckte cfld(ck+1) = cfld_orig(ck) cprs(ck+1) = cprs_orig(ck) END DO found = .FALSE. IF ( cprs(ckms) .LT. nprs ) THEN cfld_interp = cfld(ckms) RETURN ELSE IF ( cprs(ckte+2) .GE. nprs ) THEN cfld_interp = cfld(ckte+2) RETURN END IF DO ck = ckms , ckte+1 IF ( ( cprs(ck ) .GE. nprs ) .AND. & ( cprs(ck+1) .LT. nprs ) ) THEN cfld_interp = ( cfld(ck ) * ( nprs - cprs(ck+1) ) + & cfld(ck+1) * ( cprs(ck) - nprs ) ) / & ( cprs(ck) - cprs(ck+1) ) RETURN END IF END DO print *,'Hey we should not be here' print *,'nest pres to find = ',nprs print *,'column of cg pres = ',cprs CALL wrf_error_fatal ( 'ERROR -- vertical interpolation for nest interp cannot find trapping pressures' ) END FUNCTION v_interp_col !================================== ! this is the default function used in feedback. SUBROUTINE copy_fcn ( cfld, & ! CD field,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ),INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: istag,jstag, ipoints,jpoints,ijpoints INTEGER , PARAMETER :: passes = 2 INTEGER spec_zone ! Loop over the coarse grid in the area of the fine mesh. Do not ! process the coarse grid values that are along the lateral BC ! provided to the fine grid. Since that is in the specified zone ! for the fine grid, it should not be used in any feedback to the ! coarse grid as it should not have changed. ! Due to peculiarities of staggering, it is simpler to handle the feedback ! for the staggerings based upon whether it is a even ratio (2::1, 4::1, etc.) or ! an odd staggering ratio (3::1, 5::1, etc.). ! Though there are separate grid ratios for the i and j directions, this code ! is not general enough to handle aspect ratios .NE. 1 for the fine grid cell. ! These are local integer increments in the looping. Basically, istag=1 means ! that we will assume one less point in the i direction. Note that ci and cj ! have a maximum value that is decreased by istag and jstag, respectively. ! Horizontal momentum feedback is along the face, not within the cell. For a ! 3::1 ratio, temperature would use 9 pts for feedback, while u and v use ! only 3 points for feedback from the nest to the parent. CALL nl_get_spec_zone( 1 , spec_zone ) istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = 0. DO ijpoints = 1 , nri * nrj ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./9. * & ! ( nfld( ni-1, nk , nj-1) + & ! nfld( ni , nk , nj-1) + & ! nfld( ni+1, nk , nj-1) + & ! nfld( ni-1, nk , nj ) + & ! nfld( ni , nk , nj ) + & ! nfld( ni+1, nk , nj ) + & ! nfld( ni-1, nk , nj+1) + & ! nfld( ni , nk , nj+1) + & ! nfld( ni+1, nk , nj+1) ) ENDDO ENDDO ENDDO ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = 0. DO ijpoints = (nri+1)/2 , (nri+1)/2 + nri*(nri-1) , nri ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./3. * & ! ( nfld( ni , nk , nj-1) + & ! nfld( ni , nk , nj ) + & ! nfld( ni , nk , nj+1) ) ENDDO ENDDO ENDDO ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = 0. DO ijpoints = ( nrj*nrj +1 )/2 - nrj/2 , ( nrj*nrj +1 )/2 - nrj/2 + nrj-1 ipoints = MOD((ijpoints-1),nri) + 1 - nri/2 - 1 jpoints = (ijpoints-1)/nri + 1 - nrj/2 - 1 cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL( nrj) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./3. * & ! ( nfld( ni-1, nk , nj ) + & ! nfld( ni , nk , nj ) + & ! nfld( ni+1, nk , nj ) ) ENDDO ENDDO ENDDO END IF ! Even refinement ratio ELSE IF ( MOD(nrj,2) .EQ. 0) THEN IF ( ( .NOT. xstag ) .AND. ( .NOT. ystag ) ) THEN ! This is a simple schematic of the feedback indexing used in the even ! ratio nests. For simplicity, a 2::1 ratio is depicted. Only the ! mass variable staggering is shown. ! Each of ! the boxes with a "T" and four small "t" represents a coarse grid (CG) ! cell, that is composed of four (2::1 ratio) fine grid (FG) cells. ! Shown below is the area of the CG that is in the area of the FG. The ! first grid point of the depicted CG is the starting location of the nest ! in the parent domain (ipos,jpos - i_parent_start and j_parent_start from ! the namelist). ! For each of the CG points, the feedback loop is over each of the FG points ! within the CG cell. For a 2::1 ratio, there are four total points (this is ! the ijpoints loop). The feedback value to the CG is the arithmetic mean of ! all of the FG values within each CG cell. ! |-------------||-------------| |-------------||-------------| ! | t t || t t | | t t || t t | ! jpos+ | || | | || | ! (njde-njds)- | T || T | | T || T | ! jstag | || | | || | ! | t t || t t | | t t || t t | ! |-------------||-------------| |-------------||-------------| ! |-------------||-------------| |-------------||-------------| ! | t t || t t | | t t || t t | ! | || | | || | ! | T || T | | T || T | ! | || | | || | ! | t t || t t | | t t || t t | ! |-------------||-------------| |-------------||-------------| ! ! ... ! ... ! ... ! ... ! ... ! |-------------||-------------| |-------------||-------------| ! jpoints = 1 | t t || t t | | t t || t t | ! | || | | || | ! | T || T | | T || T | ! | || | | || | ! jpoints = 0, | t t || t t | | t t || t t | ! nj=3 |-------------||-------------| |-------------||-------------| ! |-------------||-------------| |-------------||-------------| ! jpoints = 1 | t t || t t | | t t || t t | ! | || | | || | ! jpos | T || T | ... | T || T | ! | || | ... | || | ! jpoints = 0, | t t || t t | ... | t t || t t | ! nj=1 |-------------||-------------| |-------------||-------------| ! ^ ^ ! | | ! | | ! ipos ipos+ ! ni = 1 3 (nide-nids)/nri ! ipoints= 0 1 0 1 -istag ! ! For performance benefits, users can comment out the inner most loop (and cfld=0) and ! hardcode the loop feedback. For example, it is set up to run a 2::1 ratio ! if uncommented. This lacks generality, but is likely to gain timing benefits ! with compilers unable to unroll inner loops that do not have parameterized sizes. ! The extra +1 ---------/ and the extra -1 ----\ (both for ci and cj) ! / \ keeps the feedback out of the ! / \ outer row/col, since that CG data ! / \ specified the nest boundary originally ! / \ This ! / \ is just ! / \ a sentence to not end a line ! / \ with a stupid backslash DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag cfld( ci, ck, cj ) = 0. DO ijpoints = 1 , nri * nrj ipoints = MOD((ijpoints-1),nri) jpoints = (ijpoints-1)/nri cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL(nri*nrj) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./4. * & ! ( nfld( ni , nk , nj ) + & ! nfld( ni+1, nk , nj ) + & ! nfld( ni , nk , nj+1) + & ! nfld( ni+1, nk , nj+1) ) END DO END DO END DO ! U ELSE IF ( ( xstag ) .AND. ( .NOT. ystag ) ) THEN ! |---------------| ! | | ! jpoints = 1 u u | ! | | ! U | ! | | ! jpoints = 0, u u | ! nj=3 | | ! |---------------| ! |---------------| ! | | ! jpoints = 1 u u | ! | | ! jpos U | ! | | ! jpoints = 0, u u | ! nj=1 | | ! |---------------| ! ! ^ ! | ! | ! ipos ! ni = 1 3 ! ipoints= 0 1 0 ! DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + 1 cfld( ci, ck, cj ) = 0. DO ijpoints = 1 , nri*nrj , nri ipoints = MOD((ijpoints-1),nri) jpoints = (ijpoints-1)/nri cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./2. * & ! ( nfld( ni , nk , nj ) + & ! nfld( ni , nk , nj+1) ) ENDDO ENDDO ENDDO ! V ELSE IF ( ( .NOT. xstag ) .AND. ( ystag ) ) THEN DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + 1 cfld( ci, ck, cj ) = 0. DO ijpoints = 1 , nri ipoints = MOD((ijpoints-1),nri) jpoints = (ijpoints-1)/nri cfld( ci, ck, cj ) = cfld( ci, ck, cj ) + & 1./REAL(nri ) * nfld( ni+ipoints , nk , nj+jpoints ) END DO ! cfld( ci, ck, cj ) = 1./2. * & ! ( nfld( ni , nk , nj ) + & ! nfld( ni+1, nk , nj ) ) ENDDO ENDDO ENDDO END IF END IF RETURN END SUBROUTINE copy_fcn !================================== ! this is the 1pt function used in feedback. SUBROUTINE copy_fcnm ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: istag,jstag, ipoints,jpoints,ijpoints INTEGER , PARAMETER :: passes = 2 INTEGER spec_zone CALL nl_get_spec_zone( 1, spec_zone ) istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = nfld( ni , nk , nj ) ENDDO ENDDO ENDDO ELSE ! even refinement ratio, pick nearest neighbor on SW corner DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + 1 ipoints = nri/2 -1 jpoints = nrj/2 -1 cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints ) END DO END DO END DO END IF RETURN END SUBROUTINE copy_fcnm !================================== ! this is the 1pt function used in feedback for integers SUBROUTINE copy_fcni ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: istag,jstag, ipoints,jpoints,ijpoints INTEGER , PARAMETER :: passes = 2 INTEGER spec_zone CALL nl_get_spec_zone( 1, spec_zone ) istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 IF( MOD(nrj,2) .NE. 0) THEN ! odd refinement ratio DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = nfld( ni , nk , nj ) ENDDO ENDDO ENDDO ELSE ! even refinement ratio DO cj = MAX(jpos+spec_zone,cjts),MIN(jpos+(njde-njds)/nrj-jstag-spec_zone,cjte) nj = (cj-jpos)*nrj + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+spec_zone,cits),MIN(ipos+(nide-nids)/nri-istag-spec_zone,cite) ni = (ci-ipos)*nri + 1 ipoints = nri/2 -1 jpoints = nrj/2 -1 cfld( ci, ck, cj ) = nfld( ni+ipoints , nk , nj+jpoints ) END DO END DO END DO END IF RETURN END SUBROUTINE copy_fcni !================================== SUBROUTINE p2c ( cfld, & ! CD field 36,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj & ! nest ratios ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask CALL interp_fcn (cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios END SUBROUTINE p2c !================================== SUBROUTINE c2f_interp ( cfld, & ! CD field,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios ! cbdy_xs, nbdy_xs, & ! cbdy_xe, nbdy_xe, & ! cbdy_ys, nbdy_ys, & ! cbdy_ye, nbdy_ye, & ! cbdy_txs, nbdy_txs, & ! cbdy_txe, nbdy_txe, & ! cbdy_tys, nbdy_tys, & ! cbdy_tye, nbdy_tye, & parent_id,nest_id &!cyl ) ! boundary arrays USE module_configure IMPLICIT NONE !------------------------------------------------------------ ! Subroutine c2f_interp interpolate field from coarse resolution domain ! to its nested domain. It is written by Dave Gill in NCAR for the purpose ! running phys/module_sf_oml.F-DPWP in only d01 and d02 ! Chiaying Lee RSMAS/UM !------------------------------------------------------------ INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj,parent_id,nest_id !cyl LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs, nbdy_xs, nbdy_txs ! REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe, nbdy_xe, nbdy_txe ! REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys, nbdy_ys, nbdy_tys ! REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye, nbdy_ye, nbdy_tye REAL cdt, ndt ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp ! Iterate over the ND tile and compute the values ! from the CD tile. !write(0,'("mask cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte !write(0,'("mask nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte ! write(0,*)'cyl parentid',parent_id ! write(0,*)'cyl nestid',nest_id ! If ( nest_id .le. 2 .and. (1.0/rdx .ge. 3000.0 .and. 1.0/rdy .ge. 3000.0) ) then ! cyl: only run it in the nest domain with dx, dy < 3 km If ( nest_id .eq. 3 ) then DO nj = njts, njte cj = jpos + (nj-1) / nrj ! j coord of CD point jp = mod ( nj , nrj ) ! coord of ND w/i CD point DO nk = nkts, nkte ck = nk DO ni = nits, nite ci = ipos + (ni-1) / nri ! j coord of CD point ip = mod ( ni , nri ) ! coord of ND w/i CD point ! This is a trivial implementation of the interp_fcn; just copies ! the values from the CD into the ND nfld( ni, nk, nj ) = cfld( ci , ck , cj ) ENDDO ENDDO ENDDO ENDIF ! cyl RETURN END SUBROUTINE c2f_interp !================================== SUBROUTINE bdy_interp ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios cbdy_xs, nbdy_xs, & cbdy_xe, nbdy_xe, & cbdy_ys, nbdy_ys, & cbdy_ye, nbdy_ye, & cbdy_txs, nbdy_txs, & cbdy_txe, nbdy_txe, & cbdy_tys, nbdy_tys, & cbdy_tye, nbdy_tye, & cdt, ndt & ) ! boundary arrays USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs, nbdy_xs, nbdy_txs REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe, nbdy_xe, nbdy_txe REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys, nbdy_ys, nbdy_tys REAL, DIMENSION( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye, nbdy_ye, nbdy_tye REAL cdt, ndt ! Local INTEGER nijds, nijde, spec_bdy_width nijds = min(nids, njds) nijde = max(nide, njde) CALL nl_get_spec_bdy_width( 1, spec_bdy_width ) CALL bdy_interp1( cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nijds, nijde , spec_bdy_width , & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, imask, & xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & cbdy_xs, nbdy_xs, & cbdy_xe, nbdy_xe, & cbdy_ys, nbdy_ys, & cbdy_ye, nbdy_ye, & cbdy_txs, nbdy_txs, & cbdy_txe, nbdy_txe, & cbdy_tys, nbdy_tys, & cbdy_tye, nbdy_tye, & cdt, ndt & ) RETURN END SUBROUTINE bdy_interp SUBROUTINE bdy_interp1( cfld, & ! CD field 1,5 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nijds, nijde, spec_bdy_width , & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw1, & imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & cbdy_xs, bdy_xs, & cbdy_xe, bdy_xe, & cbdy_ys, bdy_ys, & cbdy_ye, bdy_ye, & cbdy_txs, bdy_txs, & cbdy_txe, bdy_txe, & cbdy_tys, bdy_tys, & cbdy_tye, bdy_tye, & cdt, ndt & ) USE module_configure use module_state_description IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw1, & ! ignore ipos, jpos, & nri, nrj INTEGER, INTENT(IN) :: nijds, nijde, spec_bdy_width LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(INOUT) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xs, cbdy_txs ! not used REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_xe, cbdy_txe ! not used REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ys, cbdy_tys ! not used REAL, DIMENSION ( * ), INTENT(INOUT) :: cbdy_ye, cbdy_tye ! not used REAL :: cdt, ndt REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xs, bdy_txs REAL, DIMENSION ( njms:njme, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_xe, bdy_txe REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ys, bdy_tys REAL, DIMENSION ( nims:nime, nkms:nkme, spec_bdy_width ), INTENT(INOUT) :: bdy_ye, bdy_tye ! Local REAL*8 rdt INTEGER ci, cj, ck, ni, nj, nk, ni1, nj1, nk1, ip, jp, ioff, joff #ifdef MM5_SINT INTEGER nfx, ior PARAMETER (ior=2) INTEGER nf REAL psca1(cims:cime,cjms:cjme,nri*nrj) REAL psca(cims:cime,cjms:cjme,nri*nrj) LOGICAL icmask( cims:cime, cjms:cjme ) INTEGER i,j,k #endif INTEGER shw INTEGER spec_zone INTEGER relax_zone INTEGER sz INTEGER n2ci,n INTEGER n2cj ! statement functions for converting a nest index to coarse n2ci(n) = (n+ipos*nri-1)/nri n2cj(n) = (n+jpos*nrj-1)/nrj rdt = 1.D0/cdt shw = 0 ioff = 0 ; joff = 0 IF ( xstag ) THEN ioff = (nri-1)/2 ENDIF IF ( ystag ) THEN joff = (nrj-1)/2 ENDIF ! Iterate over the ND tile and compute the values ! from the CD tile. #ifdef MM5_SINT CALL nl_get_spec_zone( 1, spec_zone ) CALL nl_get_relax_zone( 1, relax_zone ) sz = MIN(MAX( spec_zone, relax_zone + 1 ),spec_bdy_width) nfx = nri * nrj !$OMP PARALLEL DO & !$OMP PRIVATE ( i,j,k,ni,nj,ni1,nj1,ci,cj,ip,jp,nk,ck,nf,icmask,psca,psca1 ) DO k = ckts, ckte DO nf = 1,nfx DO j = cjms,cjme nj = (j-jpos) * nrj + ( nrj / 2 + 1 ) ! j point on nest DO i = cims,cime ni = (i-ipos) * nri + ( nri / 2 + 1 ) ! i point on nest psca1(i,j,nf) = cfld(i,k,j) ENDDO ENDDO ENDDO ! hopefully less ham handed but still correct and more efficient ! sintb ignores icmask so it does not matter that icmask is not set ! ! SOUTH BDY IF ( njts .ge. njds .and. njts .le. njds + sz + joff ) THEN CALL sintb( psca1, psca, & cims, cime, cjms, cjme, icmask, & n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njds)), n2cj(MIN(njte,njds+sz+joff)), nrj*nri, xstag, ystag ) ENDIF ! NORTH BDY IF ( njte .le. njde .and. njte .ge. njde - sz - joff ) THEN CALL sintb( psca1, psca, & cims, cime, cjms, cjme, icmask, & n2ci(nits)-1, n2ci(nite)+1, n2cj(MAX(njts,njde-sz-joff)), n2cj(MIN(njte,njde-1+joff)), nrj*nri, xstag, ystag ) ENDIF ! WEST BDY IF ( nits .ge. nids .and. nits .le. nids + sz + ioff ) THEN CALL sintb( psca1, psca, & cims, cime, cjms, cjme, icmask, & n2ci(MAX(nits,nids)), n2ci(MIN(nite,nids+sz+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag ) ENDIF ! EAST BDY IF ( nite .le. nide .and. nite .ge. nide - sz - ioff ) THEN CALL sintb( psca1, psca, & cims, cime, cjms, cjme, icmask, & n2ci(MAX(nits,nide-sz-ioff)), n2ci(MIN(nite,nide-1+ioff)), n2cj(njts)-1, n2cj(njte)+1, nrj*nri, xstag, ystag ) ENDIF DO nj1 = MAX(njds,njts-1), MIN(njde+joff,njte+joff+1) cj = jpos + (nj1-1) / nrj ! j coord of CD point jp = mod ( nj1-1 , nrj ) ! coord of ND w/i CD point nk = k ck = nk DO ni1 = MAX(nids,nits-1), MIN(nide+ioff,nite+ioff+1) ci = ipos + (ni1-1) / nri ! j coord of CD point ip = mod ( ni1-1 , nri ) ! coord of ND w/i CD point ni = ni1-ioff nj = nj1-joff IF ( ( ni.LT.nids) .OR. (nj.LT.njds) ) THEN CYCLE END IF !bdy contains the value at t-dt. psca contains the value at t !compute dv/dt and store in bdy_t !afterwards store the new value of v at t into bdy ! WEST IF ( ni .ge. nids .and. ni .lt. nids + sz ) THEN bdy_txs( nj,k,ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_xs( nj,k,ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ! SOUTH IF ( nj .ge. njds .and. nj .lt. njds + sz ) THEN bdy_tys( ni,k,nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_ys( ni,k,nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ! EAST IF ( xstag ) THEN IF ( ni .ge. nide - sz + 1 .AND. ni .le. nide ) THEN bdy_txe( nj,k,nide-ni+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_xe( nj,k,nide-ni+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ELSE IF ( ni .ge. nide - sz .AND. ni .le. nide-1 ) THEN bdy_txe( nj,k,nide-ni ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_xe( nj,k,nide-ni ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ENDIF ! NORTH IF ( ystag ) THEN IF ( nj .ge. njde - sz + 1 .AND. nj .le. njde ) THEN bdy_tye( ni,k,njde-nj+1 ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_ye( ni,k,njde-nj+1 ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ELSE IF ( nj .ge. njde - sz .AND. nj .le. njde-1 ) THEN bdy_tye(ni,k,njde-nj ) = rdt*(psca(ci+shw,cj+shw,ip+1+(jp)*nri)-nfld(ni,k,nj)) bdy_ye( ni,k,njde-nj ) = psca(ci+shw,cj+shw,ip+1+(jp)*nri ) ENDIF ENDIF ENDDO ENDDO ENDDO !$OMP END PARALLEL DO #endif RETURN END SUBROUTINE bdy_interp1 SUBROUTINE interp_fcni( cfld, & ! CD field,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag INTEGER, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld INTEGER, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp ! Iterate over the ND tile and compute the values ! from the CD tile. !write(0,'("cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte !write(0,'("nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte DO nj = njts, njte cj = jpos + (nj-1) / nrj ! j coord of CD point jp = mod ( nj , nrj ) ! coord of ND w/i CD point DO nk = nkts, nkte ck = nk DO ni = nits, nite ci = ipos + (ni-1) / nri ! j coord of CD point ip = mod ( ni , nri ) ! coord of ND w/i CD point ! This is a trivial implementation of the interp_fcn; just copies ! the values from the CD into the ND nfld( ni, nk, nj ) = cfld( ci , ck , cj ) ENDDO ENDDO ENDDO RETURN END SUBROUTINE interp_fcni SUBROUTINE interp_fcnm( cfld, & ! CD field,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp ! Iterate over the ND tile and compute the values ! from the CD tile. !write(0,'("mask cits:cite, ckts:ckte, cjts:cjte ",6i4)')cits,cite, ckts,ckte, cjts,cjte !write(0,'("mask nits:nite, nkts:nkte, njts:njte ",6i4)')nits,nite, nkts,nkte, njts,njte DO nj = njts, njte cj = jpos + (nj-1) / nrj ! j coord of CD point jp = mod ( nj , nrj ) ! coord of ND w/i CD point DO nk = nkts, nkte ck = nk DO ni = nits, nite ci = ipos + (ni-1) / nri ! j coord of CD point ip = mod ( ni , nri ) ! coord of ND w/i CD point ! This is a trivial implementation of the interp_fcn; just copies ! the values from the CD into the ND nfld( ni, nk, nj ) = cfld( ci , ck , cj ) ENDDO ENDDO ENDDO RETURN END SUBROUTINE interp_fcnm SUBROUTINE interp_mask_land_field ( enable, & ! says whether to allow interpolation or just the bcasts,6 cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios clu, nlu ) USE module_configure USE module_wrf_error IMPLICIT NONE LOGICAL, INTENT(IN) :: enable INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp INTEGER :: icount , ii , jj , ist , ien , jst , jen , iswater REAL :: avg , sum , dx , dy INTEGER , PARAMETER :: max_search = 5 CHARACTER*120 message ! Find out what the water value is. CALL nl_get_iswater(1,iswater) ! Right now, only mass point locations permitted. IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN ! Loop over each i,k,j in the nested domain. IF ( enable ) THEN DO nj = njts, njte IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point ELSE cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point END IF DO nk = nkts, nkte ck = nk DO ni = nits, nite IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point ELSE ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point END IF ! ! (ci,cj+1) (ci+1,cj+1) ! - ------------- ! 1-dy | | | ! | | | ! - | * | ! dy | | (ni,nj) | ! | | | ! - ------------- ! (ci,cj) (ci+1,cj) ! ! |--|--------| ! dx 1-dx ! For odd ratios, at (nri+1)/2, we are on the coarse grid point, so dx = 0 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri ) ELSE dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri ) END IF IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj ) ELSE dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj ) END IF ! This is a "land only" field. If this is a water point, no operations required. IF ( ( NINT(nlu(ni ,nj )) .EQ. iswater ) ) THEN nfld(ni,nk,nj) = cfld(ci ,ck,cj ) ! If this is a nested land point, and the surrounding coarse values are all land points, ! then this is a simple 4-pt interpolation. ELSE IF ( ( NINT(nlu(ni ,nj )) .NE. iswater ) .AND. & ( NINT(clu(ci ,cj )) .NE. iswater ) .AND. & ( NINT(clu(ci+1,cj )) .NE. iswater ) .AND. & ( NINT(clu(ci ,cj+1)) .NE. iswater ) .AND. & ( NINT(clu(ci+1,cj+1)) .NE. iswater ) ) THEN nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + & dy * cfld(ci ,ck,cj+1) ) + & dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + & dy * cfld(ci+1,ck,cj+1) ) ! If this is a nested land point and there are NO coarse land values surrounding, ! we temporarily punt. ELSE IF ( ( NINT(nlu(ni ,nj )) .NE. iswater ) .AND. & ( NINT(clu(ci ,cj )) .EQ. iswater ) .AND. & ( NINT(clu(ci+1,cj )) .EQ. iswater ) .AND. & ( NINT(clu(ci ,cj+1)) .EQ. iswater ) .AND. & ( NINT(clu(ci+1,cj+1)) .EQ. iswater ) ) THEN nfld(ni,nk,nj) = -1 ! If there are some water points and some land points, take an average. ELSE IF ( NINT(nlu(ni ,nj )) .NE. iswater ) THEN icount = 0 sum = 0 IF ( NINT(clu(ci ,cj )) .NE. iswater ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj ) END IF IF ( NINT(clu(ci+1,cj )) .NE. iswater ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj ) END IF IF ( NINT(clu(ci ,cj+1)) .NE. iswater ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj+1) END IF IF ( NINT(clu(ci+1,cj+1)) .NE. iswater ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj+1) END IF nfld(ni,nk,nj) = sum / REAL ( icount ) END IF END DO END DO END DO ! Get an average of the whole domain for problem locations. sum = 0 icount = 0 DO nj = njts, njte DO nk = nkts, nkte DO ni = nits, nite IF ( nfld(ni,nk,nj) .NE. -1 ) THEN icount = icount + 1 sum = sum + nfld(ni,nk,nj) END IF END DO END DO END DO ELSE sum = 0. icount = 0 ENDIF CALL wrf_dm_bcast_real( sum, 1 ) CALL wrf_dm_bcast_integer( icount, 1 ) IF ( enable ) THEN IF ( icount .GT. 0 ) THEN avg = sum / REAL ( icount ) ! OK, if there were any of those island situations, we try to search a bit broader ! of an area in the coarse grid. DO nj = njts, njte DO nk = nkts, nkte DO ni = nits, nite IF ( nfld(ni,nk,nj) .EQ. -1 ) THEN IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point ELSE cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point END IF IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point ELSE ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point END IF ist = MAX (ci-max_search,cits) ien = MIN (ci+max_search,cite,cide-1) jst = MAX (cj-max_search,cjts) jen = MIN (cj+max_search,cjte,cjde-1) icount = 0 sum = 0 DO jj = jst,jen DO ii = ist,ien IF ( NINT(clu(ii,jj)) .NE. iswater ) THEN icount = icount + 1 sum = sum + cfld(ii,nk,jj) END IF END DO END DO IF ( icount .GT. 0 ) THEN nfld(ni,nk,nj) = sum / REAL ( icount ) ELSE ! CALL wrf_error_fatal ( "horizontal interp error - island" ) write(message,*) 'horizontal interp error - island, using average ', avg CALL wrf_message ( message ) nfld(ni,nk,nj) = avg END IF END IF END DO END DO END DO ENDIF ENDIF ELSE CALL wrf_error_fatal ( "only unstaggered fields right now" ) END IF END SUBROUTINE interp_mask_land_field SUBROUTINE interp_mask_water_field ( enable, & ! says whether to allow interpolation or just the bcasts,5 cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios clu, nlu, cflag, nflag ) USE module_configure USE module_wrf_error IMPLICIT NONE LOGICAL, INTENT(IN) :: enable INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj, cflag, nflag LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp INTEGER :: icount , ii , jj , ist , ien , jst , jen REAL :: avg , sum , dx , dy INTEGER , PARAMETER :: max_search = 5 ! Right now, only mass point locations permitted. IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN IF ( enable ) THEN ! Loop over each i,k,j in the nested domain. DO nj = njts, njte IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point ELSE cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point END IF DO nk = nkts, nkte ck = nk DO ni = nits, nite IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point ELSE ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point END IF ! ! (ci,cj+1) (ci+1,cj+1) ! - ------------- ! 1-dy | | | ! | | | ! - | * | ! dy | | (ni,nj) | ! | | | ! - ------------- ! (ci,cj) (ci+1,cj) ! ! |--|--------| ! dx 1-dx ! At ni=2, we are on the coarse grid point, so dx = 0 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri ) ELSE dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri ) END IF IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj ) ELSE dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj ) END IF ! This is a "water only" field. If this is a land point, no operations required. IF ( ( NINT(nlu(ni ,nj )) .NE. nflag ) ) THEN nfld(ni,nk,nj) = cfld(ci ,ck,cj ) ! If this is a nested water point, and the surrounding coarse values are all water points, ! then this is a simple 4-pt interpolation. ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. nflag ) .AND. & ( NINT(clu(ci ,cj )) .EQ. nflag ) .AND. & ( NINT(clu(ci+1,cj )) .EQ. nflag ) .AND. & ( NINT(clu(ci ,cj+1)) .EQ. nflag ) .AND. & ( NINT(clu(ci+1,cj+1)) .EQ. nflag ) ) THEN nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + & dy * cfld(ci ,ck,cj+1) ) + & dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + & dy * cfld(ci+1,ck,cj+1) ) ! If this is a nested water point and there are NO coarse water values surrounding, ! we temporarily punt. ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. nflag ) .AND. & ( NINT(clu(ci ,cj )) .NE. nflag ) .AND. & ( NINT(clu(ci+1,cj )) .NE. nflag ) .AND. & ( NINT(clu(ci ,cj+1)) .NE. nflag ) .AND. & ( NINT(clu(ci+1,cj+1)) .NE. nflag ) ) THEN nfld(ni,nk,nj) = -1 ! If there are some land points and some water points, take an average. ELSE IF ( NINT(nlu(ni ,nj )) .EQ. nflag ) THEN icount = 0 sum = 0 IF ( NINT(clu(ci ,cj )) .EQ. nflag ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj ) END IF IF ( NINT(clu(ci+1,cj )) .EQ. nflag ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj ) END IF IF ( NINT(clu(ci ,cj+1)) .EQ. nflag ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj+1) END IF IF ( NINT(clu(ci+1,cj+1)) .EQ. nflag ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj+1) END IF nfld(ni,nk,nj) = sum / REAL ( icount ) END IF END DO END DO END DO ! Get an average of the whole domain for problem locations. sum = 0 icount = 0 DO nj = njts, njte DO nk = nkts, nkte DO ni = nits, nite IF ( nfld(ni,nk,nj) .NE. -1 ) THEN icount = icount + 1 sum = sum + nfld(ni,nk,nj) END IF END DO END DO END DO ELSE sum = 0. icount = 0 ENDIF CALL wrf_dm_bcast_real( sum, 1 ) CALL wrf_dm_bcast_integer( icount, 1 ) IF ( enable ) THEN IF ( icount .NE. 0 ) THEN avg = sum / REAL ( icount ) ! OK, if there were any of those lake situations, we try to search a bit broader ! of an area in the coarse grid. DO nj = njts, njte DO nk = nkts, nkte DO ni = nits, nite IF ( nfld(ni,nk,nj) .EQ. -1 ) THEN IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point ELSE cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point END IF IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point ELSE ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point END IF ist = MAX (ci-max_search,cits) ien = MIN (ci+max_search,cite,cide-1) jst = MAX (cj-max_search,cjts) jen = MIN (cj+max_search,cjte,cjde-1) icount = 0 sum = 0 DO jj = jst,jen DO ii = ist,ien IF ( NINT(clu(ii,jj)) .EQ. nflag ) THEN icount = icount + 1 sum = sum + cfld(ii,nk,jj) END IF END DO END DO IF ( icount .GT. 0 ) THEN nfld(ni,nk,nj) = sum / REAL ( icount ) ELSE ! CALL wrf_error_fatal ( "horizontal interp error - lake" ) print *,'horizontal interp error - lake, using average ',avg nfld(ni,nk,nj) = avg END IF END IF END DO END DO END DO ENDIF ENDIF ELSE CALL wrf_error_fatal ( "only unstaggered fields right now" ) END IF END SUBROUTINE interp_mask_water_field SUBROUTINE p2c_mask ( cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios clu, nlu, & ! land use categories ctslb,ntslb, & ! soil temps cnum_soil_layers,nnum_soil_layers, & ! number of soil layers for tslb ciswater, niswater ) ! iswater category USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj, & cnum_soil_layers, nnum_soil_layers, & ciswater, niswater LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION ( cims:cime, cjms:cjme ) :: clu REAL, DIMENSION ( nims:nime, njms:njme ) :: nlu REAL, DIMENSION ( cims:cime, 1:cnum_soil_layers, cjms:cjme ) :: ctslb REAL, DIMENSION ( nims:nime, 1:nnum_soil_layers, njms:njme ) :: ntslb ! Local INTEGER ci, cj, ck, ni, nj, nk INTEGER :: icount REAL :: sum , dx , dy ! Right now, only mass point locations permitted. IF ( ( .NOT. xstag) .AND. ( .NOT. ystag ) ) THEN ! Loop over each i,k,j in the nested domain. DO nj = njts, MIN(njde-1,njte) IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN cj = ( nj + (nrj/2)-1 ) / nrj + jpos -1 ! first coarse position equal to or below nest point ELSE cj = ( nj + (nrj-1)/2 ) / nrj + jpos -1 ! first coarse position equal to or below nest point END IF DO nk = nkts, nkte ck = nk DO ni = nits, MIN(nide-1,nite) IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN ci = ( ni + (nri/2)-1 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point ELSE ci = ( ni + (nri-1)/2 ) / nri + ipos -1 ! first coarse position equal to or to the left of nest point END IF ! ! (ci,cj+1) (ci+1,cj+1) ! - ------------- ! 1-dy | | | ! | | | ! - | * | ! dy | | (ni,nj) | ! | | | ! - ------------- ! (ci,cj) (ci+1,cj) ! ! |--|--------| ! dx 1-dx ! At ni=2, we are on the coarse grid point, so dx = 0 IF ( MOD ( nri , 2 ) .EQ. 0 ) THEN dx = ( REAL ( MOD ( ni+(nri-1)/2 , nri ) ) + 0.5 ) / REAL ( nri ) ELSE dx = REAL ( MOD ( ni+(nri-1)/2 , nri ) ) / REAL ( nri ) END IF IF ( MOD ( nrj , 2 ) .EQ. 0 ) THEN dy = ( REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) + 0.5 ) / REAL ( nrj ) ELSE dy = REAL ( MOD ( nj+(nrj-1)/2 , nrj ) ) / REAL ( nrj ) END IF ! This is a "water only" field. If this is a land point, no operations required. IF ( ( NINT(nlu(ni ,nj )) .NE. niswater ) ) THEN nfld(ni,nk,nj) = 273.18 ! If this is a nested water point, and the surrounding coarse values are all water points, ! then this is a simple 4-pt interpolation. ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. niswater ) .AND. & ( NINT(clu(ci ,cj )) .EQ. niswater ) .AND. & ( NINT(clu(ci+1,cj )) .EQ. niswater ) .AND. & ( NINT(clu(ci ,cj+1)) .EQ. niswater ) .AND. & ( NINT(clu(ci+1,cj+1)) .EQ. niswater ) ) THEN nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * cfld(ci ,ck,cj ) + & dy * cfld(ci ,ck,cj+1) ) + & dx * ( ( 1. - dy ) * cfld(ci+1,ck,cj ) + & dy * cfld(ci+1,ck,cj+1) ) ! If this is a nested water point and there are NO coarse water values surrounding, ! we manufacture something from the deepest CG soil temp. ELSE IF ( ( NINT(nlu(ni ,nj )) .EQ. niswater ) .AND. & ( NINT(clu(ci ,cj )) .NE. niswater ) .AND. & ( NINT(clu(ci+1,cj )) .NE. niswater ) .AND. & ( NINT(clu(ci ,cj+1)) .NE. niswater ) .AND. & ( NINT(clu(ci+1,cj+1)) .NE. niswater ) ) THEN nfld(ni,nk,nj) = ( 1. - dx ) * ( ( 1. - dy ) * ctslb(ci ,cnum_soil_layers,cj ) + & dy * ctslb(ci ,cnum_soil_layers,cj+1) ) + & dx * ( ( 1. - dy ) * ctslb(ci+1,cnum_soil_layers,cj ) + & dy * ctslb(ci+1,cnum_soil_layers,cj+1) ) ! If there are some land points and some water points, take an average of the water points. ELSE IF ( NINT(nlu(ni ,nj )) .EQ. niswater ) THEN icount = 0 sum = 0 IF ( NINT(clu(ci ,cj )) .EQ. niswater ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj ) END IF IF ( NINT(clu(ci+1,cj )) .EQ. niswater ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj ) END IF IF ( NINT(clu(ci ,cj+1)) .EQ. niswater ) THEN icount = icount + 1 sum = sum + cfld(ci ,ck,cj+1) END IF IF ( NINT(clu(ci+1,cj+1)) .EQ. niswater ) THEN icount = icount + 1 sum = sum + cfld(ci+1,ck,cj+1) END IF nfld(ni,nk,nj) = sum / REAL ( icount ) END IF END DO END DO END DO ELSE CALL wrf_error_fatal ( "only unstaggered fields right now" ) END IF END SUBROUTINE p2c_mask SUBROUTINE none END SUBROUTINE none SUBROUTINE smoother ( cfld , &,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in nri, nrj & ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos LOGICAL, INTENT(IN) :: xstag, ystag INTEGER :: smooth_option, feedback , spec_zone REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld ! If there is no feedback, there can be no smoothing. CALL nl_get_feedback ( 1, feedback ) IF ( feedback == 0 ) RETURN CALL nl_get_spec_zone ( 1, spec_zone ) ! These are the 2d smoothers used on the fedback data. These filters ! are run on the coarse grid data (after the nested info has been ! fedback). Only the area of the nest in the coarse grid is filtered. CALL nl_get_smooth_option ( 1, smooth_option ) IF ( smooth_option == 0 ) THEN ! no op ELSE IF ( smooth_option == 1 ) THEN CALL sm121 ( cfld , & cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & xstag, ystag, & ! staggering of field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos & ! Position of lower left of nest in ) ELSE IF ( smooth_option == 2 ) THEN CALL smdsm ( cfld , & cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & xstag, ystag, & ! staggering of field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos & ! Position of lower left of nest in ) END IF END SUBROUTINE smoother SUBROUTINE sm121 ( cfld , & 1,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & xstag, ystag, & ! staggering of field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos & ! Position of lower left of nest in ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfldnew INTEGER :: i , j , k , loop INTEGER :: istag,jstag INTEGER, PARAMETER :: smooth_passes = 1 ! More passes requires a larger stencil (currently 48 pt) istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 ! Simple 1-2-1 smoother. smoothing_passes : DO loop = 1 , smooth_passes DO k = ckts , ckte ! Initialize dummy cfldnew DO i = MAX(ipos,cits-3) , MIN(ipos+(nide-nids)/nri,cite+3) DO j = MAX(jpos,cjts-3) , MIN(jpos+(njde-njds)/nrj,cjte+3) cfldnew(i,j) = cfld(i,k,j) END DO END DO ! 1-2-1 smoothing in the j direction first, DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) cfldnew(i,j) = 0.25 * ( cfld(i,k,j+1) + 2.*cfld(i,k,j) + cfld(i,k,j-1) ) END DO END DO ! then 1-2-1 smoothing in the i direction last DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) cfld(i,k,j) = 0.25 * ( cfldnew(i+1,j) + 2.*cfldnew(i,j) + cfldnew(i-1,j) ) END DO END DO END DO END DO smoothing_passes END SUBROUTINE sm121 SUBROUTINE smdsm ( cfld , & 1,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & xstag, ystag, & ! staggering of field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos & ! Position of lower left of nest in ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfldnew REAL , DIMENSION ( 2 ) :: xnu INTEGER :: i , j , k , loop , n INTEGER :: istag,jstag INTEGER, PARAMETER :: smooth_passes = 1 ! More passes requires a larger stencil (currently 48 pt) xnu = (/ 0.50 , -0.52 /) istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 ! The odd number passes of this are the "smoother", the even ! number passes are the "de-smoother" (note the different signs on xnu). smoothing_passes : DO loop = 1 , smooth_passes * 2 n = 2 - MOD ( loop , 2 ) DO k = ckts , ckte DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) 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)) END DO END DO DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) cfld(i,k,j) = cfldnew(i,j) END DO END DO DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) 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)) END DO END DO DO j = MAX(jpos+2,cjts-2) , MIN(jpos+(njde-njds)/nrj-2-jstag,cjte+2) DO i = MAX(ipos+2,cits-2) , MIN(ipos+(nide-nids)/nri-2-istag,cite+2) cfld(i,k,j) = cfldnew(i,j) END DO END DO END DO END DO smoothing_passes END SUBROUTINE smdsm !================================== ! this is used to modify a field over the nest so we can see where the nest is SUBROUTINE mark_domain ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj ) ! nest ratios USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(OUT) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ), INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: istag,jstag, ipoints,jpoints,ijpoints istag = 1 ; jstag = 1 IF ( xstag ) istag = 0 IF ( ystag ) jstag = 0 DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-jstag-1,cjte) nj = (cj-jpos)*nrj + jstag + 1 DO ck = ckts, ckte nk = ck DO ci = MAX(ipos+1,cits),MIN(ipos+(nide-nids)/nri-istag-1,cite) ni = (ci-ipos)*nri + istag + 1 cfld( ci, ck, cj ) = 9021000. !magic number: Beverly Hills * 100. ENDDO ENDDO ENDDO END SUBROUTINE mark_domain #if ( NMM_CORE == 1 ) !======================================================================================= ! E grid interpolation for mass with addition of terrain adjustments. First routine ! pertains to initial conditions and the next one corresponds to boundary conditions ! This is gopal's doing !======================================================================================= SUBROUTINE interp_mass_nmm (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4, & ! dummys for weights CZ3d, Z3d, & ! Z3d interpolated from CZ3d CFIS,FIS, & ! CFIS dummy on fine domain CSM,SM, & ! CSM is dummy CPDTOP,PDTOP, & CPTOP,PTOP, & CPSTD,PSTD, & CKZMAX,KZMAX ) USE MODULE_MODEL_CONSTANTS USE module_timing IMPLICIT NONE LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: ckzmax,kzmax INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK ! parent domain INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT4,CFIS,CSM REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(cims:cime,cjms:cjme,1:KZMAX), INTENT(IN) :: CZ3d REAL,DIMENSION(1:KZMAX), INTENT(IN) :: CPSTD REAL,INTENT(IN) :: CPDTOP,CPTOP ! nested domain INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT4 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: FIS,SM REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: NFLD REAL,DIMENSION(1:KZMAX), INTENT(IN) :: PSTD REAL,DIMENSION(nims:nime,njms:njme,1:KZMAX), INTENT(OUT) :: Z3d REAL,INTENT(IN) :: PDTOP,PTOP ! local INTEGER,PARAMETER :: JTB=134 REAL, PARAMETER :: LAPSR=6.5E-3,GI=1./G, D608=0.608 REAL, PARAMETER :: COEF3=R_D*GI*LAPSR INTEGER :: I,J,K,IDUM REAL :: dlnpdz,tvout,pmo REAL,DIMENSION(nims:nime,njms:njme) :: ZS,DUM2d REAL,DIMENSION(JTB) :: PIN,ZIN,Y2,PIO,ZOUT,DUM1,DUM2 !----------------------------------------------------------------------------------------------------- ! !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) & CALL wrf_error_fatal ('mass points:check domain bounds along x' ) IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) & CALL wrf_error_fatal ('mass points:check domain bounds along y' ) ENDDO ENDDO IF(KZMAX .GT. (JTB-10)) & CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm') ! WRITE(21,*)'------------- MED NEST INITIAL 1 ----------------' ! DO J=NJTS,MIN(NJTE,NJDE-1) ! DO I=NITS,MIN(NITE,NIDE-1) ! WRITE(21,*)I,J,IMASK(I,J),NFLD(I,1,J) ! ENDDO ! ENDDO ! WRITE(21,*) ! !*** DEFINE LOCAL TOPOGRAPHY ON THE BASIS OF FIS. ALSO CHECK IF SM IS LAND (SM=0) OVER TOPO !*** YOU DON'T WANT MOUNTAINS INSIDE WATER BODIES! ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) ZS(I,J)=FIS(I,J)/G ENDDO ENDDO ! !*** Interpolate GPMs DERIVED FROM STANDARD ATMOSPHERIC LAPSE RATE FROM THE PARENT TO !*** THE NESTED DOMAIN ! !*** INDEX CONVENTIONS !*** HBWGT4 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** HBWGT1 HBWGT2 !*** !*** !*** 3 !*** HBWGT3 Z3d=0.0 DO K=NKTS,KZMAX ! Please note that we are still in isobaric surfaces DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) ! IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K) ELSE Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ! ENDDO ENDDO ENDDO ! RECONSTRUCT PDs ON THE BASIS OF TOPOGRAPHY AND THE INTERPOLATED HEIGHTS DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) ! IF (ZS(I,J) .LT. Z3d(I,J,1)) THEN dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(i,j,1)-Z3d(i,j,2)) dum2d(i,j) = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(i,j,1))) dum2d(i,j) = dum2d(i,j) - PDTOP -PTOP ELSE ! target level bounded by input levels DO K =NKTS,KZMAX-1 ! still in the isobaric surfaces IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1)) dum2d(i,j) = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K))) dum2d(i,j) = dum2d(i,j) - PDTOP -PTOP ENDIF ENDDO ENDIF IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN WRITE(0,*)'I=',I,'J=',J,'K=',KZMAX,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX) CALL wrf_error_fatal3 ( "interp_fcn.b" , 176 , "MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH") ENDIF ! ENDDO ENDDO DO K=NKDS,NKDE ! NKTE is 1, nevertheless let us pretend religious DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN NFLD(I,J,K)= dum2d(i,j) ! PD defined in the nested domain ENDIF ENDDO ENDDO ENDDO ! END SUBROUTINE interp_mass_nmm ! !-------------------------------------------------------------------------------------- SUBROUTINE nmm_bdymass_hinterp ( cfld, & ! CD field,7 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye, & CTEMP_B,NTEMP_B, & ! These temp arrays should be removed CTEMP_BT,NTEMP_BT, & ! later on CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4, & ! dummys CZ3d, Z3d, & ! Z3d dummy on nested domain CFIS,FIS, & ! CFIS dummy on fine domain CSM,SM, & ! CSM is dummy CPDTOP,PDTOP, & CPTOP,PTOP, & CPSTD,PSTD, & CKZMAX,KZMAX ) USE MODULE_MODEL_CONSTANTS USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: ckzmax,kzmax INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: ctemp_b,ctemp_bt REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(OUT) :: ntemp_b,ntemp_bt LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye ! parent domain INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT4,CFIS,CSM REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(cims:cime,cjms:cjme,1:KZMAX), INTENT(IN) :: CZ3d REAL,DIMENSION(1:KZMAX), INTENT(IN) :: CPSTD REAL,INTENT(IN) :: CPDTOP,CPTOP ! nested domain INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT4 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: FIS,SM REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: NFLD REAL,DIMENSION(1:KZMAX), INTENT(IN) :: PSTD REAL,DIMENSION(nims:nime,njms:njme,1:KZMAX), INTENT(OUT) :: Z3d REAL,INTENT(IN) :: PDTOP,PTOP ! Local INTEGER :: nijds, nijde, spec_bdy_width,i,j,k REAL :: dlnpdz,dum2d REAL,DIMENSION(nims:nime,njms:njme) :: zs INTEGER,PARAMETER :: JTB=134 INTEGER :: ii,jj REAL, DIMENSION (nims:nime,njms:njme) :: CWK1,CWK2,CWK3,CWK4 nijds = min(nids, njds) nijde = max(nide, njde) CALL nl_get_spec_bdy_width( 1, spec_bdy_width ) ! !*** DEFINE LOCAL TOPOGRAPHY ON THE BASIS OF FIS. ASLO CHECK IF SM IS LAND (SM=0) OVER TOPO !*** YOU DON'T WANT MOUNTAINS INSIDE WATER BODIES! ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) ZS(I,J)=FIS(I,J)/G ENDDO ENDDO ! X start boundary NMM_XS: IF(NITS .EQ. NIDS)THEN ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDS DO K=NKTS,KZMAX DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K) ELSE Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF END DO END DO DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE. 0)THEN IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2)) dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1))) CWK1(I,J) = dum2d -PDTOP -PTOP ELSE ! target level bounded by input levels DO K =NKTS,KZMAX-1 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1)) dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K))) CWK1(I,J) = dum2d -PDTOP -PTOP ENDIF ENDDO ENDIF IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX) CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH") ENDIF ELSE CWK1(I,J)=0. ENDIF ENDDO DO J = NJTS,MIN(NJTE,NJDE-1) DO K = NKDS,NKDE ntemp_b(i,j,k) = CWK1(I,J) ntemp_bt(i,j,k) = 0.0 END DO END DO ENDIF NMM_XS ! X end boundary NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN ! WRITE(0,*)'ENTERING X END BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDE-1 II = NIDE - I DO K=NKTS,KZMAX DO J=NJTS,MIN(NJTE,NJDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K) ELSE Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDDO ENDDO DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of nested domain IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2)) dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1))) CWK2(I,J) = dum2d -PDTOP -PTOP ELSE ! target level bounded by input levels DO K =NKTS,KZMAX-1 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1)) dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K))) CWK2(I,J) = dum2d -PDTOP -PTOP ENDIF ENDDO ENDIF IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX) CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH") ENDIF ELSE CWK2(I,J) = 0.0 ENDIF ENDDO DO J = NJTS,MIN(NJTE,NJDE-1) DO K = NKDS,NKDE ntemp_b(i,j,k) = CWK2(I,J) ntemp_bt(i,j,k) = 0.0 END DO END DO ENDIF NMM_XE ! Y start boundary NMM_YS: IF(NJTS .EQ. NJDS)THEN ! WRITE(20,*)'ENTERING Y START BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1) J = NJDS DO K=NKTS,KZMAX DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K) ELSE Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF END DO END DO DO I = NITS,MIN(NITE,NIDE-1) IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2)) dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1))) CWK3(I,J) = dum2d -PDTOP -PTOP ELSE ! target level bounded by input levels DO K =NKTS,KZMAX-1 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1)) dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K))) CWK3(I,J) = dum2d -PDTOP -PTOP ENDIF ENDDO ENDIF IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX) CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH") ENDIF ENDDO DO K = NKDS, NKDE DO I = NITS,MIN(NITE,NIDE-1) ntemp_b(i,j,k) = CWK3(I,J) ntemp_bt(i,j,k) = 0.0 END DO END DO END IF NMM_YS ! Y end boundary NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN ! WRITE(20,*)'ENTERING Y END BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1) J = NJDE-1 JJ = NJDE - J DO K=NKTS,KZMAX DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J), JJH(I,J)+1,K) ELSE Z3d(I,J,K) = HBWGT1(I,J)*CZ3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CZ3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF END DO END DO DO I = NITS,MIN(NITE,NIDE-1) IF (ZS(I,J) .LT. Z3d(I,J,2)) THEN ! level 2 has to be changed dlnpdz = (log(PSTD(1))-log(PSTD(2)) )/(Z3d(I,J,1)-Z3d(I,J,2)) dum2d = exp(log(PSTD(1)) + dlnpdz*(ZS(I,J) - Z3d(I,J,1))) CWK4(I,J) = dum2d -PDTOP -PTOP ELSE ! target level bounded by input levels DO K =NKTS,KZMAX-1 IF(ZS(I,J) .GE. Z3d(I,J,K) .AND. ZS(I,J) .LT. Z3d(I,J,K+1))THEN dlnpdz = (log(PSTD(K))-log(PSTD(K+1)) ) /(Z3d(I,J,K)-Z3d(I,J,K+1)) dum2d = exp(log(PSTD(K)) + dlnpdz*(ZS(I,J)- Z3d(I,J,K))) CWK4(I,J) = dum2d -PDTOP -PTOP ENDIF ENDDO ENDIF IF(ZS(I,J) .GE. Z3d(I,J,KZMAX))THEN WRITE(0,*)'I=',I,'J=',J,'K=',K,'TERRAIN HEIGHT',ZS(I,J),'Z3d',Z3d(I,J,KZMAX) CALL wrf_error_fatal("BC:MOUNTAIN TOO HIGH TO FIT THE MODEL DEPTH") ENDIF ENDDO DO K = NKDS,NKDE DO I = NITS,MIN(NITE,NIDE-1) ntemp_b(i,j,k) = CWK4(I,J) ntemp_bt(i,j,k) = 0.0 END DO END DO END IF NMM_YE RETURN END SUBROUTINE nmm_bdymass_hinterp ! !======================================================================================= ! ! ADDED FOR INCLUDING MOISTURE AND THERMODYNAMIC ENERGY BALANCE ! !======================================================================================= SUBROUTINE interp_scalar_nmm (cfld, & ! CD field,11 cids,cide,ckds,ckde,cjds,cjde, & cims,cime,ckms,ckme,cjms,cjme, & cits,cite,ckts,ckte,cjts,cjte, & nfld, & ! ND field nids,nide,nkds,nkde,njds,njde, & nims,nime,nkms,nkme,njms,njme, & nits,nite,nkts,nkte,njts,njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag,ystag, & ! staggering of field ipos,jpos, & ! Position of lower left of nest in CD nri,nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4, & ! dummys for weights CC3d,C3d, & CPD,PD, & CPSTD,PSTD, & CPDTOP,PDTOP, & CPTOP,PTOP, & CETA1,ETA1,CETA2,ETA2 ) USE MODULE_MODEL_CONSTANTS USE module_timing IMPLICIT NONE LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK ! parent domain INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT3,CBWGT4 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CC3d ! scalar input on constant pressure levels REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CPSTD REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CPD REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CETA1,CETA2 REAL, INTENT(IN) :: CPDTOP,CPTOP ! nested domain INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT3,HBWGT4 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: NFLD ! This is scalar on hybrid levels REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: C3d ! Scalar on constant pressure levels REAL,DIMENSION(nkms:nkme), INTENT(IN) :: PSTD REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: PD REAL,DIMENSION(nkms:nkme), INTENT(IN) :: ETA1,ETA2 REAL,INTENT(IN) :: PDTOP,PTOP ! local INTEGER,PARAMETER :: JTB=134 INTEGER :: I,J,K REAL,DIMENSION(JTB) :: PIN,CIN,Y2,PIO,PTMP,COUT,DUM1,DUM2 !----------------------------------------------------------------------------------------------------- ! ! ! *** CHECK VERTICAL BOUNDS BEFORE USING SPLINE OR LINEAR INTERPOLATION ! IF(nkme .GT. (JTB-10) .OR. NKDE .GT. (JTB-10)) & CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm') ! ! FIRST, HORIZONTALLY INTERPOLATE MOISTURE NOW AVAILABLE ON CONSTANT PRESSURE SURFACE (LEVELS) FROM THE ! PARENT TO THE NESTED DOMAIN ! !*** INDEX CONVENTIONS !*** HBWGT4 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** HBWGT1 HBWGT2 !*** !*** !*** 3 !*** HBWGT3 C3d=0.0 DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K) ELSE C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDIF ENDDO ENDDO ENDDO ! ! RECOVER THE SCALARS FROM CONSTANT PRESSURE SURFACES (LEVELS) ON TO HYBRID SURFACES ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN ! clean local array before use of spline or linear interpolation CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. DO K=NKDS+1,NKDE ! inputs at standard levels PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5) CIN(K-1) = C3d(I,J,NKDE-K+1) ENDDO Y2(1 )=0. Y2(NKDE-1)=0. DO K=NKDS,NKDE ! target points in model interface levels (pint) PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP ENDDO DO K=NKDS,NKDE-1 ! target points in model levels PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5) ENDDO IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD' WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1) ENDIF CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate DO K=1,NKDE-1 NFLD(I,J,K)= COUT(K) ! scalar in the nested domain ENDDO ENDIF ENDDO ENDDO END SUBROUTINE interp_scalar_nmm ! !=========================================================================================== ! SUBROUTINE nmm_bdy_scalar (cfld, & ! CD field cids,cide,ckds,ckde,cjds,cjde, & cims,cime,ckms,ckme,cjms,cjme, & cits,cite,ckts,ckte,cjts,cjte, & nfld, & ! ND field nids,nide,nkds,nkde,njds,njde, & nims,nime,nkms,nkme,njms,njme, & nits,nite,nkts,nkte,njts,njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag,ystag, & ! staggering of field ipos,jpos, & ! Position of lower left of nest in CD nri,nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye, & cdt, ndt, & CTEMP_B,NTEMP_B, & ! to be removed CTEMP_BT,NTEMP_BT, & CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4, & ! dummys for weights CC3d,C3d, & CPD,PD, & CPSTD,PSTD, & CPDTOP,PDTOP, & CPTOP,PTOP, & CETA1,ETA1,CETA2,ETA2 ) USE MODULE_MODEL_CONSTANTS USE module_timing IMPLICIT NONE LOGICAL,INTENT(IN) :: xstag, ystag REAL, INTENT(INOUT) :: cdt, ndt INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: ctemp_b,ctemp_bt REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(OUT) :: ntemp_b,ntemp_bt REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK ! parent domain INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2 REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT3,CBWGT4 REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CC3d ! scalar input on constant pressure levels REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CPSTD REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CPD REAL,DIMENSION(ckms:ckme), INTENT(IN) :: CETA1,CETA2 REAL, INTENT(IN) :: CPDTOP,CPTOP ! nested domain INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT3,HBWGT4 REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: NFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(OUT):: C3d !Scalar on constant pressure levels REAL,DIMENSION(nkms:nkme), INTENT(IN) :: PSTD REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: PD REAL,DIMENSION(nkms:nkme), INTENT(IN) :: ETA1,ETA2 REAL,INTENT(IN) :: PDTOP,PTOP ! local INTEGER,PARAMETER :: JTB=134 INTEGER :: I,J,K,II,JJ REAL,DIMENSION(JTB) :: PIN,CIN,Y2,PIO,PTMP,COUT,DUM1,DUM2 REAL, DIMENSION (nims:nime,njms:njme,nkms:nkme) :: CWK1,CWK2,CWK3,CWK4 !----------------------------------------------------------------------------------------------------- ! ! ! *** CHECK VERTICAL BOUNDS BEFORE USING SPLINE INTERPOLATION ! IF(nkme .GT. (JTB-10) .OR. NKDE .GT. (JTB-10)) & CALL wrf_error_fatal ('mass points: increase JTB in interp_mass_nmm') ! X start boundary NMM_XS: IF(NITS .EQ. NIDS)THEN ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT T POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDS DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K) ELSE C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDDO ENDDO ! DO J=NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE. 0)THEN CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array DO K=NKDS+1,NKDE ! inputs at standard levels PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5) CIN(K-1) = C3d(I,J,NKDE-K+1) ENDDO Y2(1 )=0. Y2(NKDE-1)=0. DO K=NKDS,NKDE ! target points in model interface levels (pint) PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP ENDDO DO K=NKDS,NKDE-1 ! target points in model levels PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5) ENDDO IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD' WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1) ENDIF CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate DO K=1,NKDE-1 CWK1(I,J,K)= COUT(K) ! scalar in the nested domain ENDDO ELSE DO K=NKDS,NKDE-1 CWK1(I,J,K)=0.0 ENDDO ENDIF ENDDO DO J = NJTS,MIN(NJTE,NJDE-1) DO K = NKDS,NKDE-1 ntemp_b(i,j,k) = CWK1(I,J,K) ntemp_bt(i,j,k) = 0.0 END DO END DO ENDIF NMM_XS ! X end boundary NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN ! WRITE(0,*)'ENTERING X END BOUNDARY AT T POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDE-1 DO K=NKDS,NKDE-1 ! Please note that we are still in isobaric surfaces DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K) ELSE C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE. 0)THEN CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array DO K=NKDS+1,NKDE ! inputs at standard levels PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5) CIN(K-1) = C3d(I,J,NKDE-K+1) ENDDO Y2(1 )=0. Y2(NKDE-1)=0. DO K=NKDS,NKDE ! target points in model interface levels (pint) PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP ENDDO DO K=NKDS,NKDE-1 ! target points in model levels PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5) ENDDO IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD' WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1) ENDIF CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate DO K=1,NKDE-1 CWK2(I,J,K)= COUT(K) ! scalar in the nested domain ENDDO ELSE DO K=NKDS,NKDE-1 CWK2(I,J,K)=0.0 ENDDO ENDIF ENDDO DO J = NJTS,MIN(NJTE,NJDE-1) DO K = NKDS,MIN(NKTE,NKDE-1) ntemp_b(i,j,k) = CWK2(I,J,K) ntemp_bt(i,j,k) = 0.0 END DO END DO ENDIF NMM_XE ! Y start boundary NMM_YS: IF(NJTS .EQ. NJDS)THEN ! WRITE(0,*)'ENTERING Y START BOUNDARY AT T POINTS',NITS,MIN(NITE,NIDE-1) J = NJDS DO K=NKDS,NKDE-1 DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K) ELSE C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDDO ENDDO ! DO I=NITS,MIN(NITE,NIDE-1) CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array DO K=NKDS+1,NKDE ! inputs at standard levels PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5) CIN(K-1) = C3d(I,J,NKDE-K+1) ENDDO Y2(1 )=0. Y2(NKDE-1)=0. DO K=NKDS,NKDE ! target points in model interface levels (pint) PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP ENDDO DO K=NKDS,NKDE-1 ! target points in model levels PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5) ENDDO IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD' WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1) ENDIF CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate DO K=1,NKDE-1 CWK3(I,J,K)= COUT(K) ! scalar in the nested domain ENDDO ENDDO DO K = NKDS,NKDE-1 DO I = NITS,MIN(NITE,NIDE-1) ntemp_b(i,J,K) = CWK3(I,J,K) ntemp_bt(i,J,K) = 0.0 ENDDO ENDDO ENDIF NMM_YS ! Y end boundary NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN ! WRITE(0,*)'ENTERING Y END BOUNDARY AT T POINTS',NITS,MIN(NITE,NIDE-1) J = NJDE-1 DO K=NKDS,NKDE-1 DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J), JJH(I,J)+1,K) ELSE C3d(I,J,K) = HBWGT1(I,J)*CC3d(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CC3d(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CC3d(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDDO ENDDO DO I=NITS,MIN(NITE,NIDE-1) CIN=0.;PIN=0.;Y2=0;PIO=0.;PTMP=0.;COUT=0.;DUM1=0.;DUM2=0. ! clean up local array DO K=NKDS+1,NKDE ! inputs at standard levels PIN(K-1) = EXP((ALOG(PSTD(NKDE-K+1))+ALOG(PSTD(NKDE-K+2)))*0.5) CIN(K-1) = C3d(I,J,NKDE-K+1) ENDDO Y2(1 )=0. Y2(NKDE-1)=0. DO K=NKDS,NKDE ! target points in model interface levels (pint) PTMP(K) = ETA1(K)*PDTOP + ETA2(K)*PD(I,J) + PTOP ENDDO DO K=NKDS,NKDE-1 ! target points in model levels PIO(K) = EXP((ALOG(PTMP(K))+ALOG(PTMP(K+1)))*0.5) ENDDO IF(PTMP(1) .GE. PSTD(1))THEN ! if lower boundary is higher than PMSL(1) re-set lower boundary PIN(NKDE-1) = PIO(1) ! be consistent with target. This may not happen at all WRITE(0,*)'WARNING: NESTED DOMAIN PRESSURE AT LOWEST LEVEL HIGHER THAN PSTD' WRITE(0,*)'I,J,PIO(1),PSTD(1)',I,J,PIO(1),PSTD(1) ENDIF CALL SPLINE2(I,J,JTB,NKDE-1,PIN,CIN,Y2,NKDE-1,PIO,COUT,DUM1,DUM2) ! interpolate DO K=1,NKDE-1 CWK4(I,J,K)= COUT(K) ! scalar in the nested domain ENDDO ENDDO DO K = NKDS,NKDE-1 DO I = NITS,MIN(NITE,NIDE-1) ntemp_b(i,J,K) = CWK4(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO ENDIF NMM_YE END SUBROUTINE nmm_bdy_scalar ! ! !======================================================================================= SUBROUTINE SPLINE2(I,J,JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q) 5 ! ! ****************************************************************** ! * * ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * ! * PROGRAMED FOR A SMALL SCALAR MACHINE. * ! * * ! * PROGRAMER Z. JANJIC * ! * * ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * ! * SPECIFIED. * ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * ! * AND LE XOLD(NOLD). * ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * ! * * ! ****************************************************************** !--------------------------------------------------------------------- IMPLICIT NONE !--------------------------------------------------------------------- INTEGER,INTENT(IN) :: I,J,JTBX,NNEW,NOLD REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2 REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW ! INTEGER :: II,JJ,K,K1,K2,KOLD,NOLDM1 REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1 !--------------------------------------------------------------------- ! debug II=9999 JJ=9999 IF(I.eq.II.and.J.eq.JJ)THEN WRITE(0,*)'DEBUG in SPLINE2: I,J',I,J WRITE(0,*)'DEBUG in SPLINE2:HSO= ',xnew(1:nold) DO K=1,NOLD WRITE(0,*)'DEBUG in SPLINE2:L,ZETAI,PINTI= ' & ,K,YOLD(K),XOLD(K) ENDDO ENDIF ! NOLDM1=NOLD-1 ! DXL=XOLD(2)-XOLD(1) DXR=XOLD(3)-XOLD(2) DYDXL=(YOLD(2)-YOLD(1))/DXL DYDXR=(YOLD(3)-YOLD(2))/DXR RTDXC=0.5/(DXL+DXR) ! P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1)) Q(1)=-RTDXC*DXR ! IF(NOLD.EQ.3)GO TO 150 !--------------------------------------------------------------------- K=3 ! 100 DXL=DXR DYDXL=DYDXR DXR=XOLD(K+1)-XOLD(K) DYDXR=(YOLD(K+1)-YOLD(K))/DXR DXC=DXL+DXR DEN=1./(DXL*Q(K-2)+DXC+DXC) ! P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2)) Q(K-1)=-DEN*DXR ! K=K+1 IF(K.LT.NOLD)GO TO 100 !----------------------------------------------------------------------- 150 K=NOLDM1 ! 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1) ! K=K-1 IF(K.GT.1)GO TO 200 !----------------------------------------------------------------------- K1=1 ! 300 XK=XNEW(K1) ! DO 400 K2=2,NOLD ! IF(XOLD(K2).GT.XK)THEN KOLD=K2-1 GO TO 450 ENDIF ! 400 CONTINUE ! YNEW(K1)=YOLD(NOLD) GO TO 600 ! 450 IF(K1.EQ.1)GO TO 500 IF(K.EQ.KOLD)GO TO 550 ! 500 K=KOLD ! Y2K=Y2(K) Y2KP1=Y2(K+1) DX=XOLD(K+1)-XOLD(K) RDX=1./DX ! AK=.1666667*RDX*(Y2KP1-Y2K) BK=0.5*Y2K CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K) ! 550 X=XK-XOLD(K) XSQ=X*X ! YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K) ! debug IF(I.eq.II.and.J.eq.JJ)THEN WRITE(0,*) 'DEBUG:: k1,xnew(k1),ynew(k1): ', K1,XNEW(k1),YNEW(k1) ENDIF ! 600 K1=K1+1 IF(K1.LE.NNEW)GO TO 300 RETURN END SUBROUTINE SPLINE2 !======================================================================================= ! E grid interpolation for H and V points !======================================================================================= SUBROUTINE interp_h_nmm (cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! dummys for weights USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local INTEGER i,j,k ! !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) & CALL wrf_error_fatal ('hpoints:check domain bounds along x' ) IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) & CALL wrf_error_fatal ('hpoints:check domain bounds along y' ) ENDDO ENDDO ! !*** INDEX CONVENTIONS !*** HBWGT4 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** HBWGT1 HBWGT2 !*** !*** !*** 3 !*** HBWGT3 DO K=NKDS,NKDE DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN ! IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE NFLD(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ! ENDIF ENDDO ENDDO ENDDO END SUBROUTINE interp_h_nmm ! SUBROUTINE interp_v_nmm (cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIV, CJJ, JJV, CBWGT1, VBWGT1, & ! south-western grid locs and weights CBWGT2, VBWGT2, CBWGT3, VBWGT3, & ! note that "C"ourse grid ones are CBWGT4, VBWGT4 ) ! dummys USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIV,JJV INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local INTEGER i,j,k ! !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IIV(i,j).LT.(CIDS-shw) .OR. IIV(i,j).GT.(CIDE+shw)) & CALL wrf_error_fatal ('vpoints:check domain bounds along x' ) IF(JJV(i,j).LT.(CJDS-shw) .OR. JJV(i,j).GT.(CJDE+shw)) & CALL wrf_error_fatal ('vpoints:check domain bounds along y' ) ENDDO ENDDO ! !*** INDEX CONVENTIONS !*** VBWGT4 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** VBWGT1 VBWGT2 !*** !*** !*** 3 !*** VBWGT3 DO K=NKDS,NKDE DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K) ELSE NFLD(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K) ENDIF ENDIF ENDDO ENDDO ENDDO END SUBROUTINE interp_v_nmm ! !======================================================================================= ! E grid nearest neighbour interpolation for H points. ! This routine assumes cfld and nfld are in IJK !======================================================================================= ! SUBROUTINE interp_hnear_nmm (cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! just dummys USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local LOGICAL FLIP INTEGER i,j,k,n REAL SUM,AMAXVAL REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT ! !*** INDEX CONVENTIONS !*** NBWGT4=0 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** NBWGT1=1 NBWGT2=0 !*** !*** !*** 3 !*** NBWGT3=0 DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN NBWGT(1,I,J)=HBWGT1(I,J) NBWGT(2,I,J)=HBWGT2(I,J) NBWGT(3,I,J)=HBWGT3(I,J) NBWGT(4,I,J)=HBWGT4(I,J) ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN AMAXVAL=0. DO N=1,4 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) ENDDO FLIP=.TRUE. SUM=0.0 DO N=1,4 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN NBWGT(N,I,J)=1.0 FLIP=.FALSE. ELSE NBWGT(N,I,J)=0.0 ENDIF SUM=SUM+NBWGT(N,I,J) IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) ENDDO ENDIF ENDDO ENDDO DO K=NKDS,NKDE DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDIF ENDDO ENDDO ENDDO END SUBROUTINE interp_hnear_nmm SUBROUTINE force_sst_nmm (cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4, CCSST, CSST ) ! just dummys USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask INTEGER , INTENT(IN) :: csst(*), ccsst(*) ! local LOGICAL FLIP INTEGER i,j,k,n REAL SUM,AMAXVAL REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT if(csst(1) /= 1) return ! !*** INDEX CONVENTIONS !*** NBWGT4=0 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** NBWGT1=1 NBWGT2=0 !*** !*** !*** 3 !*** NBWGT3=0 DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) NBWGT(1,I,J)=HBWGT1(I,J) NBWGT(2,I,J)=HBWGT2(I,J) NBWGT(3,I,J)=HBWGT3(I,J) NBWGT(4,I,J)=HBWGT4(I,J) ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) AMAXVAL=0. DO N=1,4 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) ENDDO FLIP=.TRUE. SUM=0.0 DO N=1,4 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN NBWGT(N,I,J)=1.0 FLIP=.FALSE. ELSE NBWGT(N,I,J)=0.0 ENDIF SUM=SUM+NBWGT(N,I,J) IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) ENDDO ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) & + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1) & + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1) ELSE NFLD(I,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ) & + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1) & + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1) ENDIF ENDDO ENDDO END SUBROUTINE force_sst_nmm !======================================================================================= ! E grid nearest neighbour interpolation for H points. ! This routine assumes cfld and nfld are in IKJ or ILJ !======================================================================================= ! SUBROUTINE interp_hnear_ikj_nmm (cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! just dummys USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, nkms:nkme, njms:njme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local LOGICAL FLIP INTEGER i,j,k,n REAL SUM,AMAXVAL REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT ! !*** INDEX CONVENTIONS !*** NBWGT4=0 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** NBWGT1=1 NBWGT2=0 !*** !*** !*** 3 !*** NBWGT3=0 DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN NBWGT(1,I,J)=HBWGT1(I,J) NBWGT(2,I,J)=HBWGT2(I,J) NBWGT(3,I,J)=HBWGT3(I,J) NBWGT(4,I,J)=HBWGT4(I,J) ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN AMAXVAL=0. DO N=1,4 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) ENDDO FLIP=.TRUE. SUM=0.0 DO N=1,4 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN NBWGT(N,I,J)=1.0 FLIP=.FALSE. ELSE NBWGT(N,I,J)=0.0 ENDIF SUM=SUM+NBWGT(N,I,J) IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) ENDDO ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO K=NKDS,NKDE DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,K,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), K,JJH(I,J) ) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J) ) & + NBWGT(3,I,J)*CFLD(IIH(I,J), K,JJH(I,J)-1) & + NBWGT(4,I,J)*CFLD(IIH(I,J), K,JJH(I,J)+1) ELSE NFLD(I,K,J) = NBWGT(1,I,J)*CFLD(IIH(I,J), K,JJH(I,J) ) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J) ) & + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J)-1) & + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,K,JJH(I,J)+1) ENDIF ENDIF ENDDO ENDDO ENDDO END SUBROUTINE interp_hnear_ikj_nmm ! !======================================================================================= ! E grid nearest neighbour interpolation for integer H points !======================================================================================= ! SUBROUTINE interp_int_hnear_nmm (cfld, & ! CD field; integers,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field; integers nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! s-w grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! just dummys USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag INTEGER, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld INTEGER, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local LOGICAL FLIP INTEGER i,j,k,n REAL SUM,AMAXVAL REAL, DIMENSION (4, nims:nime, njms:njme ) :: NBWGT ! !*** INDEX CONVENTIONS !*** NBWGT4=0 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** NBWGT1=1 NBWGT2=0 !*** !*** !*** 3 !*** NBWGT3=0 DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN NBWGT(1,I,J)=HBWGT1(I,J) NBWGT(2,I,J)=HBWGT2(I,J) NBWGT(3,I,J)=HBWGT3(I,J) NBWGT(4,I,J)=HBWGT4(I,J) ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN AMAXVAL=0. DO N=1,4 AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL) ENDDO FLIP=.TRUE. SUM=0.0 DO N=1,4 IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN NBWGT(N,I,J)=1.0 FLIP=.FALSE. ELSE NBWGT(N,I,J)=0.0 ENDIF SUM=SUM+NBWGT(N,I,J) IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" ) ENDDO ! ENDIF ENDDO ENDDO DO J=NJTS,MIN(NJTE,NJDE-1) DO K=NKTS,NKTS DO I=NITS,MIN(NITE,NIDE-1) IF(IMASK(I,J) .NE. 1)THEN IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + NBWGT(3,I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + NBWGT(4,I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE NFLD(I,J,K) = NBWGT(1,I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + NBWGT(2,I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + NBWGT(3,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + NBWGT(4,I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ENDIF ENDDO ENDDO ENDDO END SUBROUTINE interp_int_hnear_nmm ! !-------------------------------------------------------------------------------------- ! SUBROUTINE nmm_bdy_hinterp (cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye, & CTEMP_B,NTEMP_B, & ! These temp arrays should be removed CTEMP_BT,NTEMP_BT, & ! later on CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! dummys ! use module_state_description USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld ! REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: ctemp_b,ctemp_bt REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: ntemp_b,ntemp_bt ! INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH ! Local INTEGER :: i,j,k REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: cwk1,cwk2,cwk3,cwk4 ! X start boundary NMM_XS: IF(NITS .EQ. NIDS)THEN ! WRITE(0,*)'ENTERING X1 START BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDS DO K = NKDS,NKDE DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of nested domain IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain CWK1(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE CWK1(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ELSE CWK1(I,J,K) = 0.0 ! even rows at mass points of the nested domain ENDIF ntemp_b(i,J,K) = CWK1(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO ENDIF NMM_XS ! X end boundary NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN ! WRITE(0,*)'ENTERING X END BOUNDARY AT MASS POINTS',NJTS,MIN(NJTE,NJDE-1) I = NIDE-1 DO K = NKDS,NKDE DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .NE.0)THEN ! 1,3,5,7 of the nested domain IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain CWK2(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE CWK2(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ELSE CWK2(I,J,K) = 0.0 ! even rows at mass points ENDIF ntemp_b(i,J,K) = CWK2(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO ENDIF NMM_XE ! Y start boundary NMM_YS: IF(NJTS .EQ. NJDS)THEN ! WRITE(0,*)'ENTERING Y START BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1) J = NJDS DO K = NKDS, NKDE DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 CWK3(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE CWK3(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ntemp_b(i,J,K) = CWK3(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO END IF NMM_YS ! Y end boundary NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN ! WRITE(0,*)'ENTERING Y END BOUNDARY AT MASS POINTS',NITS,MIN(NITE,NIDE-1) J = NJDE-1 DO K = NKDS,NKDE DO I = NITS,MIN(NITE,NIDE-1) IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7 CWK4(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J), JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J), JJH(I,J)+1,K) ELSE CWK4(I,J,K) = HBWGT1(I,J)*CFLD(IIH(I,J), JJH(I,J) ,K) & + HBWGT2(I,J)*CFLD(IIH(I,J)+1,JJH(I,J) ,K) & + HBWGT3(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)-1,K) & + HBWGT4(I,J)*CFLD(IIH(I,J)+1,JJH(I,J)+1,K) ENDIF ntemp_b(i,J,K) = CWK4(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO END IF NMM_YE RETURN END SUBROUTINE nmm_bdy_hinterp !-------------------------------------------------------------------------------------- SUBROUTINE nmm_bdy_vinterp ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye, & CTEMP_B,NTEMP_B, & ! These temp arrays should be removed CTEMP_BT,NTEMP_BT, & ! later on CII, IIV, CJJ, JJV, CBWGT1, VBWGT1, & ! south-western grid locs and weights CBWGT2, VBWGT2, CBWGT3, VBWGT3, & ! note that "C"ourse grid ones are CBWGT4, VBWGT4 ) ! dummys ! use module_state_description USE module_configure USE module_wrf_error IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld ! REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: ctemp_b,ctemp_bt REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: ntemp_b,ntemp_bt ! INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,n_bxs,c_bxe,n_bxe,c_bys,n_bys,c_bye,n_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIV,JJV ! Local INTEGER :: i,j,k REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: cwk1,cwk2,cwk3,cwk4 ! X start boundary NMM_XS: IF(NITS .EQ. NIDS)THEN ! WRITE(0,*)'ENTERING X START BOUNDARY AT VELOCITY POINTS',NITS,NIDS,NJTS,MIN(NJTE,NJDE-1) I = NIDS DO K = NKDS,NKDE DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .EQ.0)THEN ! 1,3,5,7 of nested domain IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain CWK1(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K) ELSE CWK1(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K) ENDIF ELSE CWK1(I,J,K) = 0.0 ! odd rows along J, at mass points have zero velocity ENDIF ntemp_b(i,J,K) = CWK1(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO ENDIF NMM_XS ! X end boundary NMM_XE: IF(NITE-1 .EQ. NIDE-1)THEN ! WRITE(0,*)'ENTERING X END BOUNDARY AT VELOCITY POINTS',NITE-1,NIDE-1,NJTS,MIN(NJTE,NJDE-1) I = NIDE-1 DO K = NKDS,NKDE DO J = NJTS,MIN(NJTE,NJDE-1) IF(MOD(J,2) .EQ.0)THEN ! 1,3,5,7 of the nested domain IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 of the parent domain CWK2(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K) ELSE CWK2(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K) ENDIF ELSE CWK2(I,J,K) = 0.0 ! odd rows at mass points ENDIF ntemp_b(i,J,K) = CWK2(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO ENDIF NMM_XE ! Y start boundary NMM_YS: IF(NJTS .EQ. NJDS)THEN ! WRITE(0,*)'ENTERING Y START BOUNDARY AT VELOCITY POINTS',NJTS,NJDS,NITS,MIN(NITE,NIDE-1) J = NJDS DO K = NKDS, NKDE DO I = NITS,MIN(NITE,NIDE-2) ! NIDE-1 SHOULD NOT MATTER IF WE FILL UP PHANTOM CELL IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 CWK3(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K) ELSE CWK3(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K) ENDIF ntemp_b(i,J,K) = CWK3(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO END IF NMM_YS ! Y end boundary NMM_YE: IF(NJTE-1 .EQ. NJDE-1)THEN ! WRITE(0,*)'ENTERING Y END BOUNDARY AT VELOCITY POINTS',NJTE-1,NJDE-1,NITS,MIN(NITE,NIDE-1) J = NJDE-1 DO K = NKDS,NKDE DO I = NITS,MIN(NITE,NIDE-2) ! NIDE-1 SHOULD NOT MATTER IF WE FILL UP PHANTOM CELL IF(MOD(JJV(I,J),2) .NE. 0)THEN ! 1,3,5,7 CWK4(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J)+1,JJV(I,J)+1,K) ELSE CWK4(I,J,K) = VBWGT1(I,J)*CFLD(IIV(I,J), JJV(I,J) ,K) & + VBWGT2(I,J)*CFLD(IIV(I,J)+1,JJV(I,J) ,K) & + VBWGT3(I,J)*CFLD(IIV(I,J), JJV(I,J)-1,K) & + VBWGT4(I,J)*CFLD(IIV(I,J), JJV(I,J)+1,K) ENDIF ntemp_b(i,J,K) = CWK4(I,J,K) ntemp_bt(i,J,K) = 0.0 END DO END DO END IF NMM_YE RETURN END SUBROUTINE nmm_bdy_vinterp ! !======================================================================================= ! E grid interpolation: simple copy from parent to mother domain !======================================================================================= ! SUBROUTINE nmm_copy ( cfld, & ! CD field,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH ) USE module_timing IMPLICIT NONE LOGICAL, INTENT(IN) :: xstag, ystag INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(IN) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(INOUT) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: imask INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH ! local INTEGER i,j,k DO J=NJTS,MIN(NJTE,NJDE-1) DO K=NKTS,NKTE DO I=NITS,MIN(NITE,NIDE-1) NFLD(I,J,K) = CFLD(IIH(I,J),JJH(I,J),K) ENDDO ENDDO ENDDO RETURN END SUBROUTINE nmm_copy ! !======================================================================================= ! E grid test for mass point coincidence !======================================================================================= ! SUBROUTINE test_nmm (cfld, & ! CD field,5 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, CBWGT1, HBWGT1, & ! south-western grid locs and weights CBWGT2, HBWGT2, CBWGT3, HBWGT3, & ! note that "C"ourse grid ones are CBWGT4, HBWGT4 ) ! dummys for weights USE module_timing IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld REAL, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 ! dummy REAL, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 INTEGER, DIMENSION ( cims:cime, cjms:cjme ), INTENT(IN) :: CII,CJJ ! dummy INTEGER, DIMENSION ( nims:nime, njms:njme ), INTENT(IN) :: IIH,JJH INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! local INTEGER i,j,k REAL,PARAMETER :: error=0.0001,error1=1.0 REAL :: diff ! !*** CHECK DOMAIN BOUNDS BEFORE INTERPOLATION ! DO J=NJTS,MIN(NJTE,NJDE-1) DO I=NITS,MIN(NITE,NIDE-1) IF(IIH(i,j).LT.(CIDS-shw) .OR. IIH(i,j).GT.(CIDE+shw)) & CALL wrf_error_fatal ('hpoints:check domain bounds along x' ) IF(JJH(i,j).LT.(CJDS-shw) .OR. JJH(i,j).GT.(CJDE+shw)) & CALL wrf_error_fatal ('hpoints:check domain bounds along y' ) ENDDO ENDDO ! !*** INDEX CONVENTIONS !*** HBWGT4 !*** 4 !*** !*** !*** !*** h !*** 1 2 !*** HBWGT1 HBWGT2 !*** !*** !*** 3 !*** HBWGT3 ! WRITE(0,*)NITS,MIN(NITE,NIDE-1),CITS,CITE DO J=NJTS,MIN(NJTE,NJDE-1) DO K=NKDS,NKDE DO I=NITS,MIN(NITE,NIDE-1) IF(ABS(1.0-HBWGT1(I,J)) .LE. ERROR)THEN DIFF=ABS(NFLD(I,J,K)-CFLD(IIH(I,J),JJH(I,J),K)) IF(DIFF .GT. ERROR)THEN CALL wrf_debug(1,"dyn_nmm: NON-COINCIDENT, NESTED MASS POINT") 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 ENDIF IF(DIFF .GT. ERROR1)THEN 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 CALL wrf_error_fatal ('dyn_nmm: NON-COINCIDENT, NESTED MASS POINT') ENDIF ENDIF ENDDO ENDDO ENDDO END SUBROUTINE test_nmm !================================== ! this is the default function used in nmm feedback at mass points. SUBROUTINE nmm_feedback ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIH, CJJ, JJH, & CBWGT1, HBWGT1, CBWGT2, HBWGT2, & CBWGT3, HBWGT3, CBWGT4, HBWGT4 ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIH,JJH REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4 LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: is, ipoints,jpoints,ijpoints INTEGER , PARAMETER :: passes = 2 REAL :: AVGH !===================================================================================== ! IF(nri .ne. 3 .OR. nrj .ne. 3) & CALL wrf_error_fatal ('Feedback works for only 1:3 ratios, currently. Modify the namelist' ) ! WRITE(0,*)'SIMPLE FEED BACK IS SWITCHED ON FOR MASS' CFLD = 9999.0 DO ck = ckts, ckte nk = ck DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs nj = (cj-jpos)*nrj + 1 if(mod(cj,2) .eq. 0)THEN is=0 ! even rows for mass points (2,4,6,8) else is=1 ! odd rows for mass points (1,3,5,7) endif DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs ni = (ci-ipos)*nri + 2 -is IF(IS==0)THEN ! (2,4,6,8) ! AVGH = NFLD(NI,NJ+1,NK) + NFLD(NI,NJ-1,NK) + NFLD(NI+1,NJ+1,NK)+ NFLD(NI+1,NJ-1,NK) & ! + NFLD(NI+1,NJ,NK) + NFLD(NI-1,NJ,NK) + NFLD(NI,NJ+2,NK) + NFLD(NI,NJ-2,NK) & ! + NFLD(NI+1,NJ+2,NK)+ NFLD(NI-1,NJ+2,NK)+ NFLD(NI+1,NJ-2,NK)+ NFLD(NI-1,NJ-2,NK) AVGH = NFLD(NI,NJ+2,NK) & + NFLD(NI ,NJ+1,NK) + NFLD(NI+1,NJ+1,NK) & + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) & + NFLD(NI ,NJ-1,NK) + NFLD(NI+1,NJ-1,NK) & + NFLD(NI,NJ-2,NK) ELSE ! AVGH = NFLD(NI,NJ+1,NK) + NFLD(NI,NJ-1,NK) + NFLD(NI-1,NJ+1,NK)+ NFLD(NI-1,NJ-1,NK) & ! + NFLD(NI+1,NJ,NK) + NFLD(NI-1,NJ,NK) + NFLD(NI,NJ+2,NK) + NFLD(NI,NJ-2,NK) & ! + NFLD(NI+1,NJ+2,NK)+ NFLD(NI-1,NJ+2,NK)+ NFLD(NI+1,NJ-2,NK)+ NFLD(NI-1,NJ-2,NK) AVGH = NFLD(NI,NJ+2,NK) & + NFLD(NI-1,NJ+1,NK) + NFLD(NI,NJ+1,NK) & + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) & + NFLD(NI-1,NJ-1,NK) + NFLD(NI,NJ-1,NK) & + NFLD(NI,NJ-2,NK) ENDIF !dusan CFLD(CI,CK,CJ) = 0.5*CFLD(CI,CK,CJ) + 0.5*(NFLD(NI,NK,NJ)+AVGH)/13.0 ! CFLD(CI,CJ,CK) = (NFLD(NI,NJ,NK)+AVGH)/13.0 CFLD(CI,CJ,CK) = AVGH/9.0 ENDDO ENDDO ENDDO END SUBROUTINE nmm_feedback !=========================================================================================== SUBROUTINE nmm_vfeedback ( cfld, & ! CD field,2 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios CII, IIV, CJJ, JJV, & CBWGT1, VBWGT1, CBWGT2, VBWGT2, & CBWGT3, VBWGT3, CBWGT4, VBWGT4 ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CII,CJJ ! dummy INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IIV,JJV REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CBWGT1,CBWGT2,CBWGT3,CBWGT4 REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4 LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ), INTENT(OUT) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ), INTENT(IN) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ),INTENT(IN) :: imask ! Local INTEGER ci, cj, ck, ni, nj, nk, ip, jp, ioff, joff, ioffa, joffa INTEGER :: icmin,icmax,jcmin,jcmax INTEGER :: is, ipoints,jpoints,ijpoints INTEGER , PARAMETER :: passes = 2 REAL :: AVGV !===================================================================================== ! IF(nri .ne. 3 .OR. nrj .ne. 3) & CALL wrf_error_fatal ('Feedback works for only 1:3 ratios, currently. Modify the namelist') ! WRITE(0,*)'SIMPLE FEED BACK IS SWITCHED ON FOR VELOCITY' CFLD = 9999.0 DO ck = ckts, ckte nk = ck DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs nj = (cj-jpos)*nrj + 1 if(mod(cj,2) .eq. 0)THEN is=1 ! even rows for velocity points (2,4,6,8) else is=0 ! odd rows for velocity points (1,3,5,7) endif DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs ni = (ci-ipos)*nri + 2 -is IF(IS==0)THEN ! (1,3,5,7) ! AVGV = NFLD(NI,NK,NJ+1) + NFLD(NI,NK,NJ-1) + NFLD(NI+1,NK,NJ+1)+ NFLD(NI+1,NK,NJ-1) & ! + NFLD(NI+1,NK,NJ) + NFLD(NI-1,NK,NJ) + NFLD(NI,NK,NJ+2) + NFLD(NI,NK,NJ-2) & ! + NFLD(NI+1,NK,NJ+2)+ NFLD(NI-1,NK,NJ+2)+ NFLD(NI+1,NK,NJ-2)+ NFLD(NI-1,NK,NJ-2) AVGV = NFLD(NI,NJ+2,NK) & + NFLD(NI ,NJ+1,NK) + NFLD(NI+1,NJ+1,NK) & + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) & + NFLD(NI ,NJ-1,NK) + NFLD(NI+1,NJ-1,NK) & + NFLD(NI,NJ-2,NK) ELSE ! AVGV = NFLD(NI,NK,NJ+1) + NFLD(NI,NK,NJ-1) + NFLD(NI-1,NK,NJ+1)+ NFLD(NI-1,NK,NJ-1) & ! + NFLD(NI+1,NK,NJ) + NFLD(NI-1,NK,NJ) + NFLD(NI,NK,NJ+2) + NFLD(NI,NK,NJ-2) & ! + NFLD(NI+1,NK,NJ+2)+ NFLD(NI-1,NK,NJ+2)+ NFLD(NI+1,NK,NJ-2)+ NFLD(NI-1,NK,NJ-2) AVGV = NFLD(NI,NJ+2,NK) & + NFLD(NI-1,NJ+1,NK) + NFLD(NI,NJ+1,NK) & + NFLD(NI-1,NJ ,NK) + NFLD(NI,NJ ,NK) + NFLD(NI+1,NJ ,NK) & + NFLD(NI-1,NJ-1,NK) + NFLD(NI,NJ-1,NK) & + NFLD(NI,NJ-2,NK) ENDIF !dusan CFLD(CI,CK,CJ) = 0.5*CFLD(CI,CK,CJ) + 0.5*(NFLD(NI,NK,NJ)+AVGV)/13.0 ! CFLD(CI,CK,CJ) = (NFLD(NI,NK,NJ)+AVGV)/13.0 CFLD(CI,CJ,CK) = AVGV/9.0 ENDDO ENDDO ENDDO END SUBROUTINE nmm_vfeedback SUBROUTINE nmm_smoother ( cfld , &,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & xstag, ystag, & ipos, jpos, & nri, nrj & ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld LOGICAL, INTENT(IN) :: xstag, ystag ! Local INTEGER :: feedback INTEGER, PARAMETER :: smooth_passes = 5 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew INTEGER :: ci, cj, ck INTEGER :: is, npass REAL :: AVGH RETURN ! If there is no feedback, there can be no smoothing. CALL nl_get_feedback ( 1, feedback ) IF ( feedback == 0 ) RETURN WRITE(0,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR HEIGHT' DO npass = 1, smooth_passes DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs if(mod(cj,2) .eq. 0)THEN is=0 ! even rows for mass points (2,4,6,8) else is=1 ! odd rows for mass points (1,3,5,7) endif DO ck = ckts, ckte DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs IF(IS==0)THEN ! (2,4,6,8) AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1) ELSE AVGH = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1) ENDIF CFLDNEW(CI,CK,CJ) = (AVGH + 4*CFLD(CI,CK,CJ)) / 8.0 ENDDO ENDDO ENDDO DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs if(mod(cj,2) .eq. 0)THEN is=0 ! even rows for mass points (2,4,6,8) else is=1 ! odd rows for mass points (1,3,5,7) endif DO ck = ckts, ckte DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ) ENDDO ENDDO ENDDO ENDDO ! do npass END SUBROUTINE nmm_smoother SUBROUTINE nmm_vsmoother ( cfld , &,1 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & xstag, ystag, & ipos, jpos, & nri, nrj & ) USE module_configure IMPLICIT NONE INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & nri, nrj, & ipos, jpos REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ), INTENT(INOUT) :: cfld LOGICAL, INTENT(IN) :: xstag, ystag ! Local INTEGER :: feedback INTEGER, PARAMETER :: smooth_passes = 5 REAL, DIMENSION ( cims:cime, ckms:ckme, cjms:cjme ) :: cfldnew INTEGER :: ci, cj, ck INTEGER :: is, npass REAL :: AVGV RETURN ! If there is no feedback, there can be no smoothing. CALL nl_get_feedback ( 1, feedback ) IF ( feedback == 0 ) RETURN WRITE(0,*)'SIMPLE SMOOTHER IS SWITCHED ON FOR VELOCITY' DO npass = 1, smooth_passes DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs if(mod(cj,2) .eq. 0)THEN is=1 ! even rows for mass points (2,4,6,8) else is=0 ! odd rows for mass points (1,3,5,7) endif DO ck = ckts, ckte DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs IF(IS==0)THEN ! (2,4,6,8) AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI+1,CK,CJ+1) + CFLD(CI+1,CK,CJ-1) ELSE AVGV = CFLD(CI,CK,CJ+1) + CFLD(CI,CK,CJ-1) + CFLD(CI-1,CK,CJ+1) + CFLD(CI-1,CK,CJ-1) ENDIF CFLDNEW(CI,CK,CJ) = (AVGV + 4*CFLD(CI,CK,CJ)) / 8.0 ENDDO ENDDO ENDDO DO cj = MAX(jpos+1,cjts),MIN(jpos+(njde-njds)/nrj-1,cjte) ! exclude top and bottom BCs if(mod(cj,2) .eq. 0)THEN is=1 ! even rows for mass points (2,4,6,8) else is=0 ! odd rows for mass points (1,3,5,7) endif DO ck = ckts, ckte DO ci = MAX(ipos+is,cits),MIN(ipos+(nide-nids)/nri-1,cite) ! excludes LBCs CFLD(CI,CK,CJ) = CFLDNEW(CI,CK,CJ) ENDDO ENDDO ENDDO ENDDO END SUBROUTINE nmm_vsmoother !====================================================================================== ! End of gopal's doing !====================================================================================== !====================================================================================== ! New NMM Interpolation Routines; wrappers around module_interp_nmm (Sam's doing) !====================================================================================== !-------------------------------------------------------------------------------------- subroutine NoInterpMany(cfld, & ! CD field cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios cpint,npint, cpd,npd, cq,nq, ct,nt, & cfis,nfis) LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK ! parent domain REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD,cpint,ct,cq REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: cpd,cfis ! nested domain REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nFIS,npd REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: NFLD,npint,nt,nq end subroutine NoInterpMany subroutine ForceNearSST (cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & cactivate, nactivate) use module_interp_nmm, only: c2n_sst use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj integer, intent(In), dimension(*) :: cactivate, nactivate INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld if(nactivate(1)/=1) return call c2n_sst(hnear_i,hnear_j, & cfld,nfld, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) end subroutine ForceNearSST subroutine DownNear (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_nmm, only: c2n_near2d, c2n_near3d use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld if(nkts==nkte) then call c2n_near2d(hnear_i,hnear_j, & cfld,nfld,imask, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) else call c2n_near3d(hnear_i,hnear_j, & cfld,nfld,imask, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) endif end subroutine DownNear subroutine DownNearIKJ (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_nmm, only: c2n_near3dikj use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(INOUT) :: nfld if(nkts==nkte) & call wrf_error_fatal('IJ interpolation of an IKJ variable is not supported and makes no sense anyway. Use DownNear instead.') call c2n_near3dikj(hnear_i,hnear_j, & cfld,nfld,imask, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) end subroutine DownNearIKJ subroutine UpNear(cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_store use module_interp_nmm, only: n2c_near2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme), INTENT(OUT) :: CFLD REAL,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nfld if(nkts/=nkte) & call wrf_error_fatal('Up nearest neighbor interpolation is not implemented.') call n2c_near2d( cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) end subroutine UpNear subroutine DownINear (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_nmm, only: c2n_inear2d use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(IN) :: CFLD INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(INOUT) :: nfld if(nkts/=nkte) & call wrf_error_fatal('3D integer nearest neighbor interpolation is not implemented.') call c2n_inear2d(hnear_i,hnear_j, & cfld,nfld,imask, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) end subroutine DownINear subroutine UpINear (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_store use module_interp_nmm, only: n2c_inear2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK INTEGER,DIMENSION(cims:cime,cjms:cjme), INTENT(OUT) :: CFLD INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: nfld if(nkts/=nkte) & call wrf_error_fatal('3D integer nearest neighbor interpolation is not implemented.') call n2c_inear2d( cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) end subroutine UpINear subroutine DownMass (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios emethod, evalue) ! extrapolation method use module_interp_nmm, only: c2n_mass, c2n_copy2d use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj, emethod real, intent(in) :: evalue INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld if(nkts==nkte) then call c2n_copy2d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & cfld,nfld,imask, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .true.) else call c2n_mass(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & cfld,nfld,iinfo,winfo,imask, & emethod,evalue, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) endif end subroutine DownMass subroutine DownMassIKJ (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios emethod, evalue) ! extrapolation method use module_interp_nmm, only: c2n_massikj use module_interp_store implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj,emethod real, intent(in) :: evalue INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(INOUT) :: nfld if(nkts==nkte) & call wrf_error_fatal('IKJ 2D interpolation of an IJ array is not implemented (and makes no sense anyway). Use DownCopy instead.') call c2n_massikj(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & cfld,nfld,iinfo,winfo,imask, & emethod, evalue, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) end subroutine DownMassIKJ subroutine UpMassIKJ (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios emethod, evalue) ! extrapolation method use module_interp_store use module_interp_nmm, only: n2c_massikj, n2c_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj, emethod real, intent(in) :: evalue INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,ckms:ckme,cjms:cjme), INTENT(OUT) :: CFLD REAL,DIMENSION(nims:nime,nkms:nkme,njms:njme), INTENT(IN) :: nfld if(nkts==nkte) then call n2c_copy2d(& cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .true.) else call n2c_massikj(& cfld,nfld,parent_iinfo,parent_winfo, & ipos,jpos,emethod, evalue, & cids, cide, cjds, cjde, ckds, ckde, & cims, cime, cjms, cjme, ckms, ckme, & cits, cite, cjts, cjte, ckts, ckte, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) endif end subroutine UpMassIKJ subroutine UpMass (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios emethod, evalue) ! extrapolation method use module_interp_store use module_interp_nmm, only: n2c_mass, n2c_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj, emethod real, intent(in) :: evalue INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld if(nkts==nkte) then call n2c_copy2d(& cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .true.) else call n2c_mass(& cfld,nfld,parent_iinfo,parent_winfo, & ipos,jpos,emethod, evalue, & cids, cide, cjds, cjde, ckds, ckde, & cims, cime, cjms, cjme, ckms, ckme, & cits, cite, cjts, cjte, ckts, ckte, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) endif end subroutine UpMass subroutine UpCopy (cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_nmm, only: n2c_copy3d, n2c_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld if(nkts==nkte) then call n2c_copy2d(& cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .true.) else call n2c_copy3d(& cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, ckds, ckde, & cims, cime, cjms, cjme, ckms, ckme, & cits, cite, cjts, cjte, ckts, ckte, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .true.) endif end subroutine UpCopy subroutine DownCopy (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_store use module_interp_nmm, only: c2n_copy3d, c2n_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld if(nkts==nkte) then call c2n_copy2d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & cfld,nfld,imask, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .true.) else call c2n_copy3d(IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, & cfld,nfld,imask, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .true.) endif end subroutine DownCopy subroutine UpVel (cfld, & ! CD field,3 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_nmm, only: n2c_copy3d, n2c_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(OUT) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(IN) :: nfld if(nkts==nkte) then call n2c_copy2d( cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, & cims, cime, cjms, cjme, & cits, cite, cjts, cjte, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .false.) else call n2c_copy3d(& cfld,nfld,ipos,jpos, & cids, cide, cjds, cjde, ckds, ckde, & cims, cime, cjms, cjme, ckms, ckme, & cits, cite, cjts, cjte, ckts, ckte, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .false.) endif end subroutine UpVel subroutine DownVel (cfld, & ! CD field,4 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width for interp imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj) ! nest ratios use module_interp_store use module_interp_nmm, only: c2n_copy3d, c2n_copy2d implicit none LOGICAL,INTENT(IN) :: xstag, ystag INTEGER,INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw,ipos,jpos,nri,nrj INTEGER,DIMENSION(nims:nime,njms:njme), INTENT(IN) :: IMASK REAL,DIMENSION(cims:cime,cjms:cjme,ckms:ckme), INTENT(IN) :: CFLD REAL,DIMENSION(nims:nime,njms:njme,nkms:nkme), INTENT(INOUT) :: nfld if(nkts==nkte) then call c2n_copy2d(IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & cfld,nfld,imask, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .false.) else call c2n_copy3d(IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, & cfld,nfld,imask, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .false.) endif end subroutine DownVel SUBROUTINE BdyMass (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye, & emethod,evalue) ! Extrapolation information ! use module_state_description USE module_configure USE module_wrf_error use module_interp_store use module_interp_nmm, only: c2b_mass, c2b_copy2d IMPLICIT NONE integer, parameter :: bdyw = 1 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj, emethod real, intent(in) :: evalue LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld,ccwm REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld,ncwm ! INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Output field boundary info: real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe ! Unused parameters: REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye if(nkts==nkte) then call c2b_copy2d(iih,jjh, & hbwgt1,hbwgt2,hbwgt3,hbwgt4, & cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, & .true.) else call c2b_mass(iih,jjh, & hbwgt1,hbwgt2,hbwgt3,hbwgt4, & cfld, & iinfo_bxs,iinfo_bxe,iinfo_bys,iinfo_bye, & winfo_bxs,winfo_bxe,winfo_bys,winfo_bye, & n_bxs, n_bxe, n_bys, n_bye, & emethod, evalue, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte) endif END SUBROUTINE BdyMass ! !-------------------------------------------------------------------------------------- ! SUBROUTINE BdyCopy (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye) ! use module_state_description USE module_configure USE module_wrf_error use module_interp_nmm, only: c2b_copy3d, c2b_copy2d use module_interp_store IMPLICIT NONE integer, parameter :: bdyw = 1 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld ! INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Output field boundary info: real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe ! Nest-parent horizontal interpolation information: ! Unused parameters: REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye if(nkts==nkte) then call c2b_copy2d(iiv,jjv, & vbwgt1,vbwgt2,vbwgt3,vbwgt4, & cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .false.) else call c2b_copy3d(iih,jjh, & hbwgt1,hbwgt2,hbwgt3,hbwgt4, & cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .false.) endif END SUBROUTINE BdyCopy ! !-------------------------------------------------------------------------------------- ! subroutine NoInterp() end subroutine NoInterp ! !-------------------------------------------------------------------------------------- ! SUBROUTINE BdyVel (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye) ! use module_state_description USE module_configure USE module_wrf_error use module_interp_nmm, only: c2b_copy3d, c2b_copy2d use module_interp_store IMPLICIT NONE integer, parameter :: bdyw = 1 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme, ckms:ckme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme, nkms:nkme ) :: nfld ! INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Output field boundary info: real,dimension(nims:nime,nkms:nkme,bdyw) :: n_bys,n_bye real,dimension(njms:njme,nkms:nkme,bdyw) :: n_bxs,n_bxe ! Nest-parent horizontal interpolation information: ! Unused parameters: REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye if(nkts==nkte) then call c2b_copy2d(iiv,jjv, & vbwgt1,vbwgt2,vbwgt3,vbwgt4, & cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte, .false.) else call c2b_copy3d(iiv,jjv, & vbwgt1,vbwgt2,vbwgt3,vbwgt4, & cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, ckms, ckme, & nids, nide, njds, njde, nkds, nkde, & nims, nime, njms, njme, nkms, nkme, & nits, nite, njts, njte, nkts, nkte, .false.) endif END SUBROUTINE BdyVel ! !-------------------------------------------------------------------------------------- ! SUBROUTINE BdyNear (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye) ! use module_state_description USE module_configure USE module_wrf_error use module_interp_nmm, only: c2b_near2d use module_interp_store IMPLICIT NONE integer, parameter :: bdyw = 1 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag REAL, DIMENSION ( cims:cime, cjms:cjme ) :: cfld REAL, DIMENSION ( nims:nime, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Output field boundary info: real,dimension(nims:nime,1,bdyw) :: n_bys,n_bye real,dimension(njms:njme,1,bdyw) :: n_bxs,n_bxe ! Unused parameters: REAL, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye REAL, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye if(nkts/=nkte) & call wrf_error_fatal('3D boundary nearest neighbor interpolation is not implemented.') call c2b_near2d(hnear_i,hnear_j,cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) END SUBROUTINE BdyNear SUBROUTINE BdyINear (cfld, & ! CD field,6 cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nfld, & ! ND field nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ! stencil half width imask, & ! interpolation mask xstag, ystag, & ! staggering of field ipos, jpos, & ! Position of lower left of nest in CD nri, nrj, & ! nest ratios c_bxs,n_bxs, & c_bxe,n_bxe, & c_bys,n_bys, & c_bye,n_bye, & c_btxs,n_btxs, & c_btxe,n_btxe, & c_btys,n_btys, & c_btye,n_btye) ! use module_state_description USE module_configure USE module_wrf_error use module_interp_nmm, only: c2b_inear2d use module_interp_store IMPLICIT NONE integer, parameter :: bdyw = 1 INTEGER, INTENT(IN) :: cids, cide, ckds, ckde, cjds, cjde, & cims, cime, ckms, ckme, cjms, cjme, & cits, cite, ckts, ckte, cjts, cjte, & nids, nide, nkds, nkde, njds, njde, & nims, nime, nkms, nkme, njms, njme, & nits, nite, nkts, nkte, njts, njte, & shw, & ipos, jpos, & nri, nrj LOGICAL, INTENT(IN) :: xstag, ystag INTEGER, DIMENSION ( cims:cime, cjms:cjme ) :: cfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: nfld INTEGER, DIMENSION ( nims:nime, njms:njme ) :: imask ! Output field boundary info: integer,dimension(nims:nime,1,bdyw) :: n_bys,n_bye integer,dimension(njms:njme,1,bdyw) :: n_bxs,n_bxe ! Unused parameters: integer, DIMENSION( * ), INTENT(INOUT) :: c_bxs,c_bxe,c_bys,c_bye integer, DIMENSION( * ), INTENT(INOUT) :: c_btxs,n_btxs,c_btxe,n_btxe,c_btys,n_btys,c_btye,n_btye if(nkts/=nkte) & call wrf_error_fatal('3D boundary nearest neighbor interpolation is not implemented.') call c2b_inear2d(hnear_i,hnear_j,cfld, & n_bxs, n_bxe, n_bys, n_bye, & cims, cime, cjms, cjme, & nids, nide, njds, njde, & nims, nime, njms, njme, & nits, nite, njts, njte) END SUBROUTINE BdyINear !-------------------------------------------------------------------------------------- ! End of Sam's doing !-------------------------------------------------------------------------------------- #endif