def write_pfb(data, outfile, x0=0, y0=0, z0=0, dx=1000, dz=1000): """Write a 3d numpy array to a PFB output file Parameters ---------- data : ndarray 3d numpy data array to write to pfb !(x,y,z)! outfile : str filename and path to write output x0 : int, optional initial x location (Default value = 0) y0 : int, optional initial y location (Default value = 0) z0 : int, optional initial z location (Default value = 0) dx : int, optional horizontal resolution (Default value = 1000) dz : int, optional vertical resolution (Default value = 1000) Returns ------- None """ logging.info(f'wrote pfb file {outfile}, (z,y,x)={data.shape}') pf_data = PFData() pf_data.setDataArray(data) pf_data.setDX(dx) pf_data.setDY(dx) pf_data.setDZ(dz) pf_data.setX(x0) pf_data.setY(y0) pf_data.setZ(z0) pf_data.writeFile(outfile)
def write_array_pfb(file_name, array): # Ensure this is 3 dimensions, since parflowio requires 3 dimensions. while array.ndim < 3: array = array[np.newaxis, :] if array.ndim > 3: raise Exception(f'Too many dimensions: {array.ndim}') from parflowio.pyParflowio import PFData data = PFData() data.setDataArray(array) return data.writeFile(file_name)
def pfwrite(arr, pfbfile, dx=1, dy=1, dz=1, overwrite=False): """ Save an ndarray to a pfb file :param arr: ndarray to save (must be 3-dimensional) :param pfbfile: path to pfb file :param overwrite: whether to overwrite the file if it exists :return: None on success. Raises Exception on failure. """ if os.path.exists(pfbfile) and not overwrite: raise RuntimeError(f'{pfbfile} already exists') assert arr.ndim == 3, 'Only 3D arrays are supported' pfb_data = PFData() pfb_data.setDataArray(arr) pfb_data.setDX(dx) pfb_data.setDY(dy) pfb_data.setDZ(dz) pfb_data.writeFile(pfbfile) pfb_data.close()
def test_assign_data(self): test = PFData() data = np.random.random_sample((50, 49, 31)) test.setDataArray(data) self.assertEqual(31, test.getNX()) self.assertEqual(49, test.getNY()) self.assertEqual(50, test.getNZ()) test.setDX(1) test.setDY(1) test.setDZ(1) test.setX(0) test.setY(0) test.setZ(0) test.setP(1) test.setQ(1) test.setR(1) test.writeFile(('test_write_raw.pfb')) test_read = PFData(('test_write_raw.pfb')) test_read.loadHeader() test_read.loadData() self.assertEqual(0, test_read.getX()) self.assertEqual(0, test_read.getY()) self.assertEqual(0, test_read.getZ()) self.assertEqual(31, test_read.getNX()) self.assertEqual(49, test_read.getNY()) self.assertEqual(50, test_read.getNZ()) self.assertEqual(1, test_read.getP()) self.assertEqual(1, test_read.getQ()) self.assertEqual(1, test_read.getR()) test_data = test_read.getDataAsArray() self.assertIsNone( np.testing.assert_array_equal(data, test_data), 'Data written to array should exist in ' 'written PFB file.') del data test.close() test_read.close() os.remove(('test_write_raw.pfb'))