Browse Source

Fixed issues found during unit testing

main
Bill Ladwig 7 years ago
parent
commit
76a2565764
  1. 5
      fortran/wrf_user.f90
  2. 4
      src/wrf/extension.py
  3. 10
      test/comp_utest.py
  4. 21
      test/test_omp.py

5
fortran/wrf_user.f90

@ -386,8 +386,9 @@ SUBROUTINE DCOMPUTESEAPRS(nx, ny, nz, z, t, p, q, sea_level_pressure, & @@ -386,8 +386,9 @@ SUBROUTINE DCOMPUTESEAPRS(nx, ny, nz, z, t, p, q, sea_level_pressure, &
! Get temperature PCONST Pa above surface. Use this to extrapolate
! the temperature at the surface and down to sea level.
!$OMP PARALLEL DO COLLAPSE(2) PRIVATE(i,j,klo,khi) REDUCTION(+:errcnt) &
!$OMP SCHEDULE(runtime)
!$OMP PARALLEL DO COLLAPSE(2) PRIVATE(i,j,klo,khi,plo, &
!$OMP phi,tlo,thi,zlo,zhi,p_at_pconst,t_at_pconst,z_at_pconst) &
!$OMP REDUCTION(+:errcnt) SCHEDULE(runtime)
DO j = 1,ny
DO i = 1,nx

4
src/wrf/extension.py

@ -28,7 +28,7 @@ from wrf._wrffortran import (dcomputetk, dinterp3dz, dinterp2dxy, dinterp1d, @@ -28,7 +28,7 @@ from wrf._wrffortran import (dcomputetk, dinterp3dz, dinterp2dxy, dinterp1d,
fomp_set_lock, fomp_set_nest_lock,
fomp_unset_lock, fomp_unset_nest_lock,
fomp_test_lock, fomp_test_nest_lock,
fomp_get_wtime, fomp_get_wtick)
fomp_get_wtime, fomp_get_wtick, fomp_enabled)
from .decorators import (left_iteration, cast_type,
extract_and_transpose, check_args)
@ -946,7 +946,7 @@ def omp_set_num_threads(num_threads): @@ -946,7 +946,7 @@ def omp_set_num_threads(num_threads):
None.
"""
if num_threads < 0:
if num_threads < 0 and fomp_enabled():
raise ValueError("'num_threads' must be a positive integer.")
fomp_set_num_threads(num_threads)

10
test/comp_utest.py

@ -498,6 +498,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -498,6 +498,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (u, v, lat, lon, cen_lon, cone)
if varname == "cloudfrac":
from wrf.g_geoht import get_height
vars = extract_vars(wrfnc, timeidx, ("P", "PB", "QVAPOR", "T"),
method, squeeze, cache=None, meta=True)
@ -506,13 +507,16 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -506,13 +507,16 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
qv = vars["QVAPOR"]
t = vars["T"]
geoht_agl = get_height(wrfnc, timeidx, method, squeeze,
cache=None, meta=True, msl=False)
full_p = p + pb
full_t = t + Constants.T_BASE
tkel = tk(full_p, full_t)
relh = rh(qv, full_p, tkel)
return (full_p, relh, 0, 97000., 80000., 45000.)
return (geoht_agl, relh, 1, 300., 2000., 6000.)
class WRFVarsTest(ut.TestCase):
@ -607,6 +611,10 @@ if __name__ == "__main__": @@ -607,6 +611,10 @@ if __name__ == "__main__":
"omg", "pw", "rh", "slp", "td", "tk", "tv", "twb", "uvmet",
"cloudfrac"]
omp_set_num_threads(omp_get_num_procs()-1)
omp_set_schedule(OMP_SCHED_STATIC, 0)
omp_set_dynamic(False)
# Turn this one off when not needed, since it's slow
#varnames += ["cape_2d", "cape_3d"]

21
test/test_omp.py

@ -19,8 +19,9 @@ from wrf import (omp_set_num_threads, omp_get_num_threads, @@ -19,8 +19,9 @@ from wrf import (omp_set_num_threads, omp_get_num_threads,
omp_set_lock, omp_set_nest_lock,
omp_unset_lock, omp_unset_nest_lock,
omp_test_lock, omp_test_nest_lock,
omp_get_wtime, omp_get_wtick)
from wrf import Constants
omp_get_wtime, omp_get_wtick,
OMP_SCHED_STATIC, OMP_SCHED_DYNAMIC,
OMP_SCHED_GUIDED, OMP_SCHED_AUTO)
class OmpTest(ut.TestCase):
@ -77,24 +78,24 @@ class OmpTest(ut.TestCase): @@ -77,24 +78,24 @@ class OmpTest(ut.TestCase):
def test_schedule(self):
omp_set_schedule(Constants.OMP_SCHED_STATIC, 100000)
omp_set_schedule(OMP_SCHED_STATIC, 100000)
kind, modifier = omp_get_schedule()
self.assertEqual(kind, Constants.OMP_SCHED_STATIC)
self.assertEqual(kind, OMP_SCHED_STATIC)
self.assertEqual(modifier, 100000)
omp_set_schedule(Constants.OMP_SCHED_DYNAMIC, 10000)
omp_set_schedule(OMP_SCHED_DYNAMIC, 10000)
kind, modifier = omp_get_schedule()
self.assertEqual(kind, Constants.OMP_SCHED_DYNAMIC)
self.assertEqual(kind, OMP_SCHED_DYNAMIC)
self.assertEqual(modifier, 10000)
omp_set_schedule(Constants.OMP_SCHED_GUIDED, 100)
omp_set_schedule(OMP_SCHED_GUIDED, 100)
kind, modifier = omp_get_schedule()
self.assertEqual(kind, Constants.OMP_SCHED_GUIDED)
self.assertEqual(kind, OMP_SCHED_GUIDED)
self.assertEqual(modifier, 100)
omp_set_schedule(Constants.OMP_SCHED_AUTO, 10)
omp_set_schedule(OMP_SCHED_AUTO, 10)
kind, modifier = omp_get_schedule()
self.assertEqual(kind, Constants.OMP_SCHED_AUTO)
self.assertEqual(kind, OMP_SCHED_AUTO)
self.assertNotEqual(modifier, 10) # The modifier argument is ignored,
# so it will be set to the previous
# value of 100.

Loading…
Cancel
Save