diff --git a/fortran/wrf_user.f90 b/fortran/wrf_user.f90 index 1bfc82c..e0bfac8 100644 --- a/fortran/wrf_user.f90 +++ b/fortran/wrf_user.f90 @@ -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 diff --git a/src/wrf/extension.py b/src/wrf/extension.py index 3862c85..a3357a3 100755 --- a/src/wrf/extension.py +++ b/src/wrf/extension.py @@ -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): 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) diff --git a/test/comp_utest.py b/test/comp_utest.py index 6af64d2..55448a8 100644 --- a/test/comp_utest.py +++ b/test/comp_utest.py @@ -498,21 +498,25 @@ 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) - + p = vars["P"] pb = vars["PB"] 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__": "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"] diff --git a/test/test_omp.py b/test/test_omp.py index ab239c9..5c621a9 100644 --- a/test/test_omp.py +++ b/test/test_omp.py @@ -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): 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. diff --git a/test/utests.py b/test/utests.py index a4e3013..4962ef5 100644 --- a/test/utests.py +++ b/test/utests.py @@ -300,8 +300,10 @@ def make_interp_test(varname, wrf_in, referent, multi=False, lats = hts.coords["XLAT"] lons = hts.coords["XLONG"] ll_point = ll_points(lats, lons) - pivot = CoordPair(lat=lats[lats.shape[-2]/2, lats.shape[-1]/2], - lon=lons[lons.shape[-2]/2, lons.shape[-1]/2]) + pivot = CoordPair(lat=lats[int(lats.shape[-2]/2), + int(lats.shape[-1]/2)], + lon=lons[int(lons.shape[-2]/2), + int(lons.shape[-1]/2)]) v1 = vertcross(hts,p,wrfin=in_wrfnc,pivot_point=pivot_point, angle=90.0) v2 = vertcross(hts,p,projection=hts.attrs["projection"], @@ -348,8 +350,10 @@ def make_interp_test(varname, wrf_in, referent, multi=False, lats = t2.coords["XLAT"] lons = t2.coords["XLONG"] ll_point = ll_points(lats, lons) - pivot = CoordPair(lat=lats[lats.shape[-2]/2, lats.shape[-1]/2], - lon=lons[lons.shape[-2]/2, lons.shape[-1]/2]) + pivot = CoordPair(lat=lats[int(lats.shape[-2]/2), + int(lats.shape[-1]/2)], + lon=lons[int(lons.shape[-2]/2), + int(lons.shape[-1]/2)]) l1 = interpline(t2,wrfin=in_wrfnc,pivot_point=pivot_point, angle=90.0) l2 = interpline(t2,projection=t2.attrs["projection"],