Browse Source

Fixed wrf_monotonic performance issues caused by an accidental revert

lon0
Bill Ladwig 8 years ago
parent
commit
d66a81a98a
  1. 17
      fortran/wrf_vinterp.f90
  2. 14
      src/wrf/interp.py

17
fortran/wrf_vinterp.f90

@ -20,13 +20,13 @@ SUBROUTINE wrf_monotonic(out, in, lvprs, cor, idir, delta, ew, ns, nz, icorsw)
!NCLEND !NCLEND
INTEGER :: i, j, k, ripk, k300 INTEGER :: i, j, k, k300
k300 = 1 ! removes the warning !$OMP PARALLEL DO COLLAPSE(2) PRIVATE(i, j, k, k300)
!$OMP PARALLEL DO COLLAPSE(2) PRIVATE(i, j, k, ripk) FIRSTPRIVATE(k300)
DO j=1,ns DO j=1,ns
DO i=1,ew DO i=1,ew
k300 = -1
IF (icorsw .EQ. 1 .AND. cor(i,j) .LT. 0.) THEN IF (icorsw .EQ. 1 .AND. cor(i,j) .LT. 0.) THEN
DO k=1,nz DO k=1,nz
in(i,j,k) = -in(i,j,k) in(i,j,k) = -in(i,j,k)
@ -35,14 +35,19 @@ SUBROUTINE wrf_monotonic(out, in, lvprs, cor, idir, delta, ew, ns, nz, icorsw)
! First find k index that is at or below (height-wise) ! First find k index that is at or below (height-wise)
! the 300 hPa level. ! the 300 hPa level.
DO k = 1,nz DO k = 1,nz-1
ripk = nz-k+1
IF (lvprs(i,j,k) .LE. 300.D0) THEN IF (lvprs(i,j,k) .LE. 300.D0) THEN
k300 = k k300 = k
EXIT EXIT
END IF END IF
END DO END DO
! If the search fails for some reason, use the second to last
! k index
IF (k300 .EQ. -1) THEN
k300 = nz-1
END IF
DO k = k300,1,-1 DO k = k300,1,-1
IF (idir .EQ. 1) THEN IF (idir .EQ. 1) THEN
out(i,j,k) = MIN(in(i,j,k), in(i,j,k+1) + delta) out(i,j,k) = MIN(in(i,j,k), in(i,j,k+1) + delta)

14
src/wrf/interp.py

@ -584,9 +584,6 @@ def vinterp(wrfin, field, vert_coord, interp_levels, extrapolate=False,
terht = get_terrain(wrfin, timeidx, units="m", terht = get_terrain(wrfin, timeidx, units="m",
method=method, squeeze=squeeze, cache=cache, method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key) meta=False, _key=_key)
t = get_theta(wrfin, timeidx, units="k",
method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key)
tk = get_temp(wrfin, timeidx, units="k", tk = get_temp(wrfin, timeidx, units="k",
method=method, squeeze=squeeze, cache=cache, method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key) meta=False, _key=_key)
@ -596,9 +593,6 @@ def vinterp(wrfin, field, vert_coord, interp_levels, extrapolate=False,
ght = get_height(wrfin, timeidx, msl=True, units="m", ght = get_height(wrfin, timeidx, msl=True, units="m",
method=method, squeeze=squeeze, cache=cache, method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key) meta=False, _key=_key)
ht_agl = get_height(wrfin, timeidx, msl=False, units="m",
method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key)
smsfp = _smooth2d(sfp, 3) smsfp = _smooth2d(sfp, 3)
@ -613,10 +607,18 @@ def vinterp(wrfin, field, vert_coord, interp_levels, extrapolate=False,
vcord_array = np.exp(-ght/sclht) vcord_array = np.exp(-ght/sclht)
elif vert_coord == "ght_agl": elif vert_coord == "ght_agl":
ht_agl = get_height(wrfin, timeidx, msl=False, units="m",
method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key)
vcor = 3 vcor = 3
vcord_array = np.exp(-ht_agl/sclht) vcord_array = np.exp(-ht_agl/sclht)
elif vert_coord in ("theta", "th"): elif vert_coord in ("theta", "th"):
t = get_theta(wrfin, timeidx, units="k",
method=method, squeeze=squeeze, cache=cache,
meta=False, _key=_key)
vcor = 4 vcor = 4
idir = 1 idir = 1
icorsw = 0 icorsw = 0

Loading…
Cancel
Save