예제 #1
0
    def test_dist_nldas_file(self):
        test = PFData(('NLDAS.APCP.000001_to_000024.pfb'))
        test.distFile(P=2,
                      Q=2,
                      R=1,
                      outFile=('NLDAS.APCP.000001_to_000024.pfb.tmp'))

        out_file = PFData(('NLDAS.APCP.000001_to_000024.pfb.tmp'))
        dist_file = open(('NLDAS.APCP.000001_to_000024.pfb.tmp.dist'), 'r')
        dist_lines = dist_file.readlines()
        [
            self.assertEqual(int(line.rstrip('\n')), val) for line, val in zip(
                dist_lines, [0, 84772, 165448, 246124, 322960])
        ]
        self.assertEqual(0, out_file.loadHeader(),
                         'should load distributed file header')
        self.assertEqual(0, out_file.loadData(),
                         'should load distributed data')
        self.assertIsNone(
            np.testing.assert_array_equal(test.viewDataArray(),
                                          out_file.viewDataArray()),
            'should find matching data values in original and distributed files'
        )
        test.close()
        out_file.close()
        dist_file.close()
        os.remove(('NLDAS.APCP.000001_to_000024.pfb.tmp'))
        os.remove(('NLDAS.APCP.000001_to_000024.pfb.tmp.dist'))
예제 #2
0
    def test_dist_file(self):
        test = PFData(('press.init.pfb'))
        test.distFile(P=2, Q=2, R=1, outFile=('press.init.pfb.tmp'))

        out_file = PFData(('press.init.pfb.tmp'))
        dist_file = open(('press.init.pfb.tmp.dist'), 'r')
        dist_lines = dist_file.readlines()
        [
            self.assertEqual(int(line.rstrip('\n')), val) for line, val in zip(
                dist_lines, [0, 176500, 344536, 512572, 672608])
        ]
        self.assertEqual(0, out_file.loadHeader(),
                         'should load distributed file header')
        self.assertEqual(0, out_file.loadData(),
                         'should load distributed data')
        self.assertIsNone(
            np.testing.assert_array_equal(test.viewDataArray(),
                                          out_file.viewDataArray()),
            'should find matching data values in original and distributed files'
        )
        test.close()
        out_file.close()
        dist_file.close()
        os.remove(('press.init.pfb.tmp'))
        os.remove(('press.init.pfb.tmp.dist'))
예제 #3
0
 def test_view(self):
     data = np.random.random_sample((50, 49, 31))
     test = PFData(data)
     view = test.viewDataArray()
     self.assertTrue(
         np.array_equal(data, view),
         'Data obtained from PFData::viewDataArray must match given data')
예제 #4
0
 def test_create_from_data(self):
     data = np.random.random_sample((50, 49, 31))
     test = PFData(data)
     self.assertEqual(50, test.getNZ())
     self.assertEqual(49, test.getNY())
     self.assertEqual(31, test.getNX())
     self.assertEqual(1, test.getR())
     self.assertEqual(1, test.getQ())
     self.assertEqual(1, test.getP())
     self.assertEqual(0, test.getZ())
     self.assertEqual(0, test.getY())
     self.assertEqual(0, test.getX())
     test.writeFile(('test_write_raw.pfb'))
     test_read = PFData(('test_write_raw.pfb'))
     test_read.loadHeader()
     test_read.loadData()
     self.assertEqual(0, test_read.getZ())
     self.assertEqual(0, test_read.getY())
     self.assertEqual(0, test_read.getX())
     self.assertEqual(50, test_read.getNZ())
     self.assertEqual(49, test_read.getNY())
     self.assertEqual(31, test_read.getNX())
     self.assertEqual(1, test_read.getR())
     self.assertEqual(1, test_read.getQ())
     self.assertEqual(1, test_read.getP())
     test_data = test_read.viewDataArray()
     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'))
예제 #5
0
    def test_compare(self):
        test1 = PFData(('press.init.pfb'))
        test1.loadHeader()
        test1.loadData()

        test2 = PFData(('press.init.pfb'))
        test2.loadHeader()
        test2.loadData()

        self.assertEqual(PFData.differenceType_none,
                         test1.compare(test2)[0],
                         "test1 and test2 are the same")

        test1.setX(test1.getX() + 1.0)
        self.assertEqual(PFData.differenceType_x,
                         test1.compare(test2)[0], "The x values differ")
        test1.setX(test1.getX() - 1.0)

        arr = test1.viewDataArray()
        arr[1][2][3] += 1.0
        ret, zyx = test1.compare(test2)
        self.assertEqual(PFData.differenceType_data, ret,
                         "The data values differ")
        self.assertEqual((1, 2, 3), zyx,
                         "The differing data's coordinates are correct")
        arr[1][2][3] -= 1.0

        test1.close()
        test2.close()
예제 #6
0
 def test_move(self):
     data = np.random.random_sample((50, 49, 31))
     test = PFData(data)
     move = test.moveDataArray()
     self.assertTrue(
         np.array_equal(data, move),
         'Data obtained from PFData::moveDataArray must match given data')
     self.assertIsNone(
         test.viewDataArray(),
         'Calling PFData::moveDataArray must invalidate the internal data pointer'
     )
예제 #7
0
    def test_read_write_data(self):
        test = PFData(('press.init.pfb'))
        retval = test.loadHeader()
        self.assertEqual(0, retval, 'should load header of file that exists')
        retval = test.loadPQR()
        self.assertEqual(0, retval, 'should load PQR of file that exists')
        retval = test.loadData()
        self.assertEqual(0, retval, 'should load data from valid file')
        retval = test.writeFile(('press.init.pfb.tmp'))
        self.assertEqual(0, retval,
                         'should write data from previously loaded file')

        data2 = PFData(('press.init.pfb.tmp'))
        data2.loadHeader()
        data2.loadData()
        data2.loadPQR()
        self.assertIsNone(
            np.testing.assert_array_equal(
                test.viewDataArray(), data2.viewDataArray(),
                'should read back same values we wrote'))
        in_file_hash = calculate_sha1_hash(('press.init.pfb'))
        out_file_hash = calculate_sha1_hash(('press.init.pfb.tmp'))

        # This assertion (that the files are identical) is failing in Python and in C++
        # because the original test input file was written by a tool that incorrectly set the value
        self.assertNotEqual(
            in_file_hash, out_file_hash,
            'sha1 hash of input and output files should not match')

        same, byte_diff = byte_compare_files(('press.init.pfb'),
                                             ('press.init.pfb.tmp'))

        self.assertFalse(
            same, 'press.init.pfb should differ from version just written')
        self.assertEqual(92, byte_diff, 'first byte difference at byte 92')

        test.close()
        data2.close()
        os.remove(('press.init.pfb.tmp'))
예제 #8
0
def load_patch_matrix_from_pfb_file(file_name, layer=None):
    from parflowio.pyParflowio import PFData
    data = PFData(file_name)
    data.loadHeader()
    data.loadData()
    data_array = data.viewDataArray()

    if data_array.ndim == 3:
        nlayer, nrows, ncols = data_array.shape
        if layer:
            nlayer = layer
        return data_array[nlayer - 1, :, :]
    elif data_array.ndim == 2:
        return data_array
    else:
        raise Exception(f'invalid PFB file: {file_name}')
예제 #9
0
 def test_validate_cell_values(self):
     test = PFData(('press.init.pfb'))
     retval = test.loadHeader()
     self.assertEqual(0, retval, 'should load header of file that exists')
     retval = test.loadData()
     self.assertEqual(0, retval, 'should load data from valid file')
     data = test.viewDataArray()
     self.assertIsNotNone(
         data, 'data from object should be available as python object')
     self.assertSequenceEqual((50, 41, 41), data.shape)
     self.assertAlmostEqual(98.003604098773, test(0, 0, 0), 12,
                            'valid data in cell ZYX(0,0,0)')
     self.assertAlmostEqual(97.36460429313328, test(0, 0, 40), 12,
                            'data in cell ZYX(0,0,40)')
     self.assertAlmostEqual(98.0043134691891, test(0, 1, 0), 12,
                            'data in cell ZYX(0, 1, 0)')
     self.assertAlmostEqual(98.00901307022781, test(0, 0, 1), 12,
                            'data in cell ZYX(0, 0, 1)')
     self.assertAlmostEqual(92.61370155558751, test(2, 1, 21), 12,
                            'data in cell ZYX(2, 1, 21)')
     self.assertAlmostEqual(7.98008728357588, test(45, 1, 0), 12,
                            'data in cell ZYX(45, 1, 0)')
     self.assertAlmostEqual(97.30205516102234, test(0, 1, 22), 12,
                            'valid data in cell ZYX(0,1,22)')
     self.assertEqual(test(0, 0, 0), data[0, 0, 0],
                      'data array and c array match values at ZYX(0,0,0)')
     self.assertEqual(test(0, 0, 40), data[0, 0, 40],
                      'data array and c array match values at ZYX(0,0,40)')
     self.assertEqual(test(0, 1, 0), data[0, 1, 0],
                      'data array and c array match values at ZYX(0,1,0)')
     self.assertEqual(test(0, 0, 1), data[0, 0, 1],
                      'data array and c array match values at ZYX(0,0,1)')
     self.assertEqual(test(2, 1, 21), data[2, 1, 21],
                      'data array and c array match values at ZYX(2,1,21)')
     self.assertEqual(test(45, 1, 0), data[45, 1, 0],
                      'data array and c array match values at ZYX(45,1,0)')
     self.assertEqual(test(0, 1, 22), data[0, 1, 22],
                      'data array and c array match values at ZYX(0,1,22)')
     test.close()
예제 #10
0
 def test_manipulate_data(self):
     test = PFData(('press.init.pfb'))
     retval = test.loadHeader()
     self.assertEqual(0, retval, 'should load header of file that exists')
     retval = test.loadData()
     self.assertEqual(0, retval, 'should load data from valid file')
     test_data = test.viewDataArray()
     self.assertSequenceEqual(
         (50, 41, 41), test_data.shape,
         'test file array should have shape RQP(50,41,41)')
     self.assertAlmostEqual(98.003604098773, test(0, 0, 0), 12,
                            'valid data in cell (0,0,0)')
     test_data[0, 0, 0] = 1
     test_data[0, 0, 40] = 1
     test_data[2, 1, 21] = 1
     self.assertEqual(1, test(0, 0, 0),
                      'data update affects underlying array')
     self.assertEqual(1, test(0, 0, 40),
                      'data update affects underlying array')
     self.assertEqual(1, test(2, 1, 21),
                      'data update affects underlying array')
     retval = test.writeFile(('press.init.pfb.tmp'))
     self.assertEqual(0, retval,
                      'able to write updated data to output file')
     test_read = PFData(('press.init.pfb.tmp'))
     test_read.loadHeader()
     test_read.loadData()
     self.assertEqual(1, test_read(0, 0, 0),
                      'updates to data written to file can be read back')
     self.assertEqual(1, test_read(0, 0, 40),
                      'updates to data written to file can be read back')
     self.assertEqual(1, test_read(2, 1, 21),
                      'updates to data written to file can be read back')
     test.close()
     test_read.close()
     os.remove(('press.init.pfb.tmp'))