def test_variable_sized_fields(): src_field = Field.create_generic('src', spatial_dimensions=2) dst_field = Field.create_generic('dst', spatial_dimensions=2) update_rule = Assignment(dst_field[0, 0], (src_field[0, 1] + src_field[0, -1] + src_field[1, 0] + src_field[-1, 0]) / 4) ast = create_cuda_kernel(sympy_cse_on_assignment_list([update_rule])) kernel = make_python_function(ast) size = (3, 3) src_arr = np.random.rand(*size) src_arr = add_ghost_layers(src_arr) dst_arr = np.zeros_like(src_arr) gpu_src_arr = gpuarray.to_gpu(src_arr) gpu_dst_arr = gpuarray.to_gpu(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) gpu_dst_arr.get(dst_arr) stencil = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) / 4.0 reference = convolve(remove_ghost_layers(src_arr), stencil, mode='constant', cval=0.0) reference = add_ghost_layers(reference) np.testing.assert_almost_equal(reference, dst_arr)
def gather_array(self, name, slice_obj=None, ghost_layers=False, **kwargs): gl_to_remove = self._field_information[name]['ghost_layers'] if isinstance(ghost_layers, int): gl_to_remove -= ghost_layers if ghost_layers is True: gl_to_remove = 0 arr = self.cpu_arrays[name] ind_dimensions = self.fields[name].index_dimensions spatial_dimensions = self.fields[name].spatial_dimensions arr = remove_ghost_layers(arr, index_dimensions=ind_dimensions, ghost_layers=gl_to_remove) if slice_obj is not None: normalized_slice = normalize_slice(slice_obj[:spatial_dimensions], arr.shape[:spatial_dimensions]) normalized_slice = tuple( s if type(s) is slice else slice(s, s + 1, None) for s in normalized_slice) normalized_slice += slice_obj[spatial_dimensions:] arr = arr[normalized_slice] else: arr = arr.view() arr.flags.writeable = False return arr
def iterate(self, slice_obj=None, gpu=False, ghost_layers=True, inner_ghost_layers=True): if ghost_layers is True: ghost_layers = self.default_ghost_layers elif ghost_layers is False: ghost_layers = 0 elif isinstance(ghost_layers, str): ghost_layers = self.ghost_layers_of_field(ghost_layers) if slice_obj is None: slice_obj = (slice(None, None, None), ) * self.dim slice_obj = normalize_slice( slice_obj, tuple(s + 2 * ghost_layers for s in self._domainSize)) slice_obj = tuple(s if type(s) is slice else slice(s, s + 1, None) for s in slice_obj) arrays = self.gpu_arrays if gpu else self.cpu_arrays custom_data_dict = self.custom_data_gpu if gpu else self.custom_data_cpu iter_dict = custom_data_dict.copy() for name, arr in arrays.items(): field_gls = self._field_information[name]['ghost_layers'] if field_gls < ghost_layers: continue arr = remove_ghost_layers(arr, index_dimensions=len(arr.shape) - self.dim, ghost_layers=field_gls - ghost_layers) iter_dict[name] = arr offset = tuple(s.start - ghost_layers for s in slice_obj) yield SerialBlock(iter_dict, offset, slice_obj)
def _get_field_with_given_number_of_ghost_layers(self, name, ghost_layers): actual_ghost_layers = self.ghost_layers_of_field(name) if ghost_layers is True: ghost_layers = actual_ghost_layers gl_to_remove = actual_ghost_layers - ghost_layers ind_dims = len(self._field_information[name]['values_per_cell']) return remove_ghost_layers(self.cpu_arrays[name], ind_dims, gl_to_remove)