def set_data(self, data, memtype=MEM_HOST, cmode=COPY_VALUES): """Set the data used by a QFunction Context, freeing any previously allocated data if applicable. Args: *data: Numpy or Numba array to be used **memtype: memory type of the array being passed, default CEED_MEM_HOST **cmode: copy mode for the array, default CEED_COPY_VALUES""" # Store array reference if needed if cmode == USE_POINTER: self._array_reference = data else: self._array_reference = None # Setup the numpy array for the libCEED call data_pointer = ffi.new("CeedScalar *") if memtype == MEM_HOST: data_pointer = ffi.cast("void *", data.__array_interface__['data'][0]) else: array_pointer = ffi.cast("void *", data.__cuda_array_interface__['data'][0]) # libCEED call err_code = lib.CeedQFunctionContextSetData( self._pointer[0], memtype, cmode, len(data) * ffi.sizeof("CeedScalar"), data_pointer) self._ceed._check_error(err_code)
def get_grad_1d(self): """Return 1D gradient matrix of a tensor product Basis. Returns: *array: Numpy array""" # Compute the length of the array nnodes_pointer = ffi.new("CeedInt *") lib.CeedBasisGetNumNodes1D(self._pointer[0], nnodes_pointer) nqpts_pointer = ffi.new("CeedInt *") lib.CeedBasisGetNumQuadraturePoints1D(self._pointer[0], nqpts_pointer) length = nnodes_pointer[0] * nqpts_pointer[0] # Setup the pointer's pointer array_pointer = ffi.new("CeedScalar **") # libCEED call lib.CeedBasisGetGrad1D(self._pointer[0], array_pointer) # Return array created from buffer # Create buffer object from returned pointer buff = ffi.buffer(array_pointer[0], ffi.sizeof("CeedScalar") * length) # return read only Numpy array ret = np.frombuffer(buff, dtype="float64") ret.flags['WRITEABLE'] = False return ret
def get_array_read(self, memtype=MEM_HOST): """Get read-only access to a Vector via the specified memory type. Args: **memtype: memory type of the array being passed, default CEED_MEM_HOST Returns: *array: Numpy array""" # Retrieve the length of the array length_pointer = ffi.new("CeedInt *") lib.CeedVectorGetLength(self._pointer[0], length_pointer) # Setup the pointer's pointer array_pointer = ffi.new("CeedScalar **") # libCEED call lib.CeedVectorGetArrayRead(self._pointer[0], memtype, array_pointer) # Create buffer object from returned pointer buff = ffi.buffer(array_pointer[0], ffi.sizeof("CeedScalar") * length_pointer[0]) # Create numpy array from buffer ret = np.frombuffer(buff, dtype="float64") # Make the numpy array read-only ret.flags['WRITEABLE'] = False return ret
def get_data(self, memtype=MEM_HOST): """Get read/write access to a QFunction Context via the specified memory type. Args: **memtype: memory type of the array being passed, default CEED_MEM_HOST Returns: *data: Numpy or Numba array""" # Retrieve the length of the array size_pointer = ffi.new("size_t *") err_code = lib.CeedQFunctionContextGetContextSize( self._pointer[0], size_pointer) self._ceed._check_error(err_code) # Setup the pointer's pointer data_pointer = ffi.new("CeedScalar **") # libCEED call err_code = lib.CeedQFunctionContextGetData(self._pointer[0], memtype, data_pointer) self._ceed._check_error(err_code) # Return array created from buffer if memtype == MEM_HOST: # Create buffer object from returned pointer buff = ffi.buffer(data_pointer[0], size_pointer[0]) # return Numpy array return np.frombuffer(buff, dtype=scalar_types[lib.CEED_SCALAR_TYPE]) else: # CUDA array interface # https://numba.pydata.org/numba-doc/latest/cuda/cuda_array_interface.html import numba.cuda as nbcuda if lib.CEED_SCALAR_TYPE == lib.CEED_SCALAR_FP32: scalar_type_str = '>f4' else: scalar_type_str = '>f8' desc = { 'shape': (size_pointer[0] / ffi.sizeof("CeedScalar")), 'typestr': scalar_type_str, 'data': (int(ffi.cast("intptr_t", data_pointer[0])), False), 'version': 2 } # return Numba array return nbcuda.from_cuda_array_interface(desc)
def get_array_read(self, memtype=MEM_HOST): """Get read-only access to a Vector via the specified memory type. Args: **memtype: memory type of the array being passed, default CEED_MEM_HOST Returns: *array: Numpy or Numba array""" # Retrieve the length of the array length_pointer = ffi.new("CeedInt *") err_code = lib.CeedVectorGetLength(self._pointer[0], length_pointer) self._ceed._check_error(err_code) # Setup the pointer's pointer array_pointer = ffi.new("CeedScalar **") # libCEED call err_code = lib.CeedVectorGetArrayRead(self._pointer[0], memtype, array_pointer) self._ceed._check_error(err_code) # Return array created from buffer if memtype == MEM_HOST: # Create buffer object from returned pointer buff = ffi.buffer(array_pointer[0], ffi.sizeof("CeedScalar") * length_pointer[0]) # return read only Numpy array ret = np.frombuffer(buff, dtype="float64") ret.flags['WRITEABLE'] = False return ret else: # CUDA array interface # https://numba.pydata.org/numba-doc/latest/cuda/cuda_array_interface.html import numba.cuda as nbcuda desc = { 'shape': (length_pointer[0]), 'typestr': '>f8', 'data': (int(ffi.cast("intptr_t", array_pointer[0])), False), 'version': 2 } # return read only Numba array return nbcuda.from_cuda_array_interface(desc)
def get_array_write(self, memtype=MEM_HOST): """Get write-only access to a Vector via the specified memory type. All old values should be considered invalid. Args: **memtype: memory type of the array being passed, default CEED_MEM_HOST Returns: *array: Numpy or Numba array""" # Retrieve the length of the array length_pointer = ffi.new("CeedSize *") err_code = lib.CeedVectorGetLength(self._pointer[0], length_pointer) self._ceed._check_error(err_code) # Setup the pointer's pointer array_pointer = ffi.new("CeedScalar **") # libCEED call err_code = lib.CeedVectorGetArrayWrite(self._pointer[0], memtype, array_pointer) self._ceed._check_error(err_code) # Return array created from buffer if memtype == MEM_HOST: # Create buffer object from returned pointer buff = ffi.buffer(array_pointer[0], ffi.sizeof("CeedScalar") * length_pointer[0]) # return Numpy array return np.frombuffer(buff, dtype=scalar_types[lib.CEED_SCALAR_TYPE]) else: # CUDA array interface # https://numba.pydata.org/numba-doc/latest/cuda/cuda_array_interface.html import numba.cuda as nbcuda desc = { 'shape': (length_pointer[0]), 'typestr': '>f8', 'data': (int(ffi.cast("intptr_t", array_pointer[0])), False), 'version': 2 } # return Numba array return nbcuda.from_cuda_array_interface(desc)