From d5afdfbb66d8ceb87b8917d316715d61dc6db5a8 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" <tasmith4@illinois.edu> Date: Mon, 17 Jun 2019 12:26:51 -0500 Subject: [PATCH] put setup fixtures in test.py --- test.py | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 143 insertions(+), 11 deletions(-) diff --git a/test.py b/test.py index 3db55b6..dbc6261 100644 --- a/test.py +++ b/test.py @@ -16,7 +16,6 @@ from pyopencl.tools import ( # noqa pytest_generate_tests_for_pyopencl as pytest_generate_tests) -import setup_fixtures as setup import kernel_fixtures as kernel @@ -53,6 +52,139 @@ def get_weno_program(): return _WENO_PRG[0] +class RoeParams: + def __init__(self, nvars, ndim, d): + self.nvars = nvars + self.ndim = ndim + self.d = d + + def mat_bounds(self): + return self.nvars, self.nvars + + def vec_bounds(self): + return self.nvars + + +class FluxDerivativeParams: + def __init__(self, nvars, ndim, nx, ny, nz): + self.nvars = nvars + self.ndim = ndim + + self.nx = nx + self.ny = ny + self.nz = nz + + self.nhalo = 3 + self.nx_halo = self.nx + 2*self.nhalo + self.ny_halo = self.ny + 2*self.nhalo + self.nz_halo = self.nz + 2*self.nhalo + + def state_bounds(self): + return self.nvars, self.nx_halo, self.ny_halo, self.nz_halo + + def flux_bounds(self): + return self.nvars, self.ndim, self.nx_halo, self.ny_halo, self.nz_halo + + def metric_bounds(self): + return self.ndim, self.ndim, self.nx_halo, self.ny_halo, self.nz_halo + + def jacobian_bounds(self): + return self.nx_halo, self.ny_halo, self.nz_halo + + +class FluxDerivativeArrays: + def __init__(self, states, fluxes, metrics, metric_jacobians): + self.states = states + self.fluxes = fluxes + self.metrics = metrics + self.metric_jacobians = metric_jacobians + + +def setup_roe_params(nvars, ndim, direction): + dirs = {"x" : 1, "y" : 2, "z" : 3} + return RoeParams(nvars, ndim, dirs[direction]) + + +def setup_flux_derivative_params(nvars, ndim, n): + return FluxDerivativeParams(nvars, ndim, n, n, n) + + +def setup_empty_array_on_device(queue, shape): + return cl.array.empty(queue, shape, dtype=np.float32, order="F") + + +def setup_identity(n): + return np.identity(n).astype(np.float32).copy(order="F") + + +def setup_random_array(*shape): + return np.random.random_sample(shape).astype(np.float32).copy(order="F") + + +def setup_random_array_on_device(queue, *shape): + return cl.array.to_device(queue, setup_random_array(*shape)) + + +def setup_random_flux_derivative_arrays(params): + states = setup_random_array(*params.state_bounds()) + fluxes = setup_random_array(*params.flux_bounds()) + metrics = setup_random_array(*params.metric_bounds()) + metric_jacobians = setup_random_array(*params.jacobian_bounds()) + + return FluxDerivativeArrays(states, fluxes, metrics, metric_jacobians) + + +def setup_random_flux_derivative_arrays_on_device(ctx_factory, params): + queue = get_queue(ctx_factory) + + states = setup_random_array_on_device(queue, *params.state_bounds()) + fluxes = setup_random_array_on_device(queue, *params.flux_bounds()) + metrics = setup_random_array_on_device(queue, *params.metric_bounds()) + metric_jacobians = setup_random_array_on_device(queue, *params.jacobian_bounds()) + + return FluxDerivativeArrays(states, fluxes, metrics, metric_jacobians) + + +def arrays_from_string(string_arrays): + return split_map_to_list(string_arrays, array_from_string, ":") + + +def array_from_string(string_array): + if ";" not in string_array: + if "," not in string_array: + array = array_from_string_1d(string_array) + else: + array = array_from_string_2d(string_array) + else: + array = array_from_string_3d(string_array) + return array.copy(order="F") + + +def array_from_string_3d(string_array): + if string_array[0] == ";": + return array_from_string_1d(string_array[1:]).reshape((-1, 1, 1)) + else: + return np.array(split_map_to_list(string_array, array_from_string_2d, ";")) + + +def array_from_string_2d(string_array): + if string_array[0] == ",": + return array_from_string_1d(string_array[1:]).reshape((-1, 1)) + else: + return np.array(split_map_to_list(string_array, array_from_string_1d, ",")) + + +def array_from_string_1d(string_array): + if string_array[0] == "i": + return np.array(split_map_to_list(string_array[1:], int, " ")) + else: + return np.array(split_map_to_list(string_array, float, " "), dtype=np.float32) + + +def split_map_to_list(string, map_func, splitter): + return list(map(map_func, string.split(splitter))) + + def compare_arrays(a, b): assert a == approx(b) @@ -151,14 +283,14 @@ def test_roe_uniform_grid(ctx_factory, states_str, fluxes_str, direction): queue = get_queue(ctx_factory) prg = get_weno_program() - params = setup.roe_params(nvars=5, ndim=3, direction=direction) - states = setup.array_from_string(states_str) - metrics_frozen = setup.identity(params.ndim) + params = setup_roe_params(nvars=5, ndim=3, direction=direction) + states = array_from_string(states_str) + metrics_frozen = setup_identity(params.ndim) R, Rinv, lam = kernel.roe_eigensystem(queue, prg, params, states, metrics_frozen) compare_roe_identity(states, R, Rinv) - fluxes = setup.array_from_string(fluxes_str) + fluxes = array_from_string(fluxes_str) compare_roe_property(states, fluxes, R, Rinv, lam) @@ -166,8 +298,8 @@ def test_matvec(ctx_factory): queue = get_queue(ctx_factory) prg = get_weno_program() - a = setup.random_array(10, 10) - b = setup.random_array(10) + a = setup_random_array(10, 10) + b = setup_random_array(10) c = kernel.mult_mat_vec(queue, prg, alpha=1.0, a=a, b=b) @@ -180,8 +312,8 @@ def test_compute_flux_derivatives(ctx_factory): prg = get_weno_program() prg = transform_compute_flux_derivative_basic(prg) - params = setup.flux_derivative_params(ndim=3, nvars=5, n=10) - arrays = setup.random_flux_derivative_arrays(params) + params = setup_flux_derivative_params(ndim=3, nvars=5, n=10) + arrays = setup_random_flux_derivative_arrays(params) kernel.compute_flux_derivatives(queue, prg, params, arrays) @@ -192,8 +324,8 @@ def test_compute_flux_derivatives_gpu(ctx_factory): prg = get_weno_program() prg = transform_compute_flux_derivative_gpu(queue, prg) - params = setup.flux_derivative_params(ndim=3, nvars=5, n=10) - arrays = setup.random_flux_derivative_arrays_on_device(ctx_factory, params) + params = setup_flux_derivative_params(ndim=3, nvars=5, n=10) + arrays = setup_random_flux_derivative_arrays_on_device(ctx_factory, params) kernel.compute_flux_derivatives(queue, prg, params, arrays) -- GitLab