def test_imaginary_fail_geometry(sisl_tmp): fr = sisl_tmp('GRID_real.cube', _dir) fi = sisl_tmp('GRID_imag.cube', _dir) geom = Geometry(np.random.rand(10, 3), np.random.randint(1, 70, 10), sc=[10, 10, 10, 45, 60, 90]) grid = Grid(0.2, geometry=geom, dtype=np.complex128) grid.grid = np.random.rand(*grid.shape) + 1j*np.random.rand(*grid.shape) grid.write(fr) # Assert it fails on geometry grid2 = Grid(0.3, dtype=np.complex128) grid2.write(fi, imag=True) grid.read(fr, imag=fi)
def test_read_write_grid(self, sisl_tmp, sisl_system, sile): g = sisl_system.g.rotate(-30, sisl_system.g.cell[2, :]) G = Grid([10, 11, 12]) G[:, :, :] = np.random.rand(10, 11, 12) f = sisl_tmp("test_read_write_grid.win", _dir) # Write try: with sile(f, mode="w") as s: s.write_grid(G) except SileError: with sile(f, mode="wb") as s: s.write_grid(G) # Read 1 try: with sile(f, mode="r") as s: g = s.read_grid() assert np.allclose(g.grid, G.grid, atol=1e-5) except UnicodeDecodeError as e: pass # Read 2 try: with sile(f, mode='r') as s: g = Grid.read(s) assert np.allclose(g.grid, G.grid, atol=1e-5) except UnicodeDecodeError as e: pass
def test_default_size(sisl_tmp): f = sisl_tmp('GRID.cube', _dir) grid = Grid(0.2, sc=2.0) grid.grid = np.random.rand(*grid.shape) grid.write(f) read = grid.read(f) assert np.allclose(grid.grid, read.grid) assert grid.geometry is None assert len(read.geometry) == 1
def test_geometry(sisl_tmp): f = sisl_tmp('GRID.cube', _dir) geom = Geometry(np.random.rand(10, 3), np.random.randint(1, 70, 10), sc=[10, 10, 10, 45, 60, 90]) grid = Grid(0.2, geometry=geom) grid.grid = np.random.rand(*grid.shape) grid.write(f) read = grid.read(f) assert np.allclose(grid.grid, read.grid) assert not grid.geometry is None assert not read.geometry is None assert grid.geometry == read.geometry
def test_imaginary(sisl_tmp): fr = sisl_tmp('GRID_real.cube', _dir) fi = sisl_tmp('GRID_imag.cube', _dir) geom = Geometry(np.random.rand(10, 3), np.random.randint(1, 70, 10), sc=[10, 10, 10, 45, 60, 90]) grid = Grid(0.2, geometry=geom, dtype=np.complex128) grid.grid = np.random.rand(*grid.shape) + 1j*np.random.rand(*grid.shape) grid.write(fr) grid.write(fi, imag=True) read = grid.read(fr) read_i = grid.read(fi) read.grid = read.grid + 1j*read_i.grid assert np.allclose(grid.grid, read.grid) assert not grid.geometry is None assert not read.geometry is None assert grid.geometry == read.geometry read = grid.read(fr, imag=fi) assert np.allclose(grid.grid, read.grid) read = grid.read(fr, imag=read_i) assert np.allclose(grid.grid, read.grid)
def test_read_write_grid(self, sisl_tmp, sisl_system, sile): g = sisl_system.g.rotatec(-30) G = Grid([10, 11, 12]) G[:, :, :] = np.random.rand(10, 11, 12) f = sisl_tmp('test_read_write_grid.win', _dir) # Write try: sile(f, mode='w').write_grid(G) except SileError: sile(f, mode='wb').write_grid(G) # Read 1 try: g = sile(f, mode='r').read_grid() assert np.allclose(g.grid, G.grid, atol=1e-5) except UnicodeDecodeError as e: pass # Read 2 try: g = Grid.read(sile(f, mode='r')) assert np.allclose(g.grid, G.grid, atol=1e-5) except UnicodeDecodeError as e: pass
def read_grid(self, imag=None): """ Returns `Grid` object from the CUBE file Parameters ---------- imag : str or Sile or Grid the imaginary part of the grid. If the geometries does not match an error will be raised. """ if not imag is None: if not isinstance(imag, Grid): imag = Grid.read(imag) geom = self.read_geometry() if geom is None: self.fh.seek(0) sc = self.read_supercell() else: sc = geom.sc # Now seek behind to read grid sizes self.fh.seek(0) # Skip headers and origin self.readline() self.readline() na = int(self.readline().split()[0]) ngrid = [0] * 3 for i in [0, 1, 2]: tmp = self.readline().split() ngrid[i] = int(tmp[0]) # Read past the atoms for i in range(na): self.readline() if geom is None: grid = Grid(ngrid, dtype=np.float64, sc=sc) else: grid = Grid(ngrid, dtype=np.float64, geometry=geom) grid.grid.shape = (-1, ) # TODO check performance of this # We are currently doing this to enable reading # 1-column data and 6-column data. lines = [ item for sublist in self.fh.readlines() for item in sublist.split() ] grid.grid[:] = np.array(lines).astype(grid.dtype) grid.grid.shape = ngrid if imag is None: return grid # We are expecting an imaginary part if not grid.geometry.equal(imag.geometry): raise SislError( str(self) + ' and its imaginary part does not have the same ' 'geometry. Hence a combined complex Grid cannot be formed.') if grid != imag: raise SislError( str(self) + ' and its imaginary part does not have the same ' 'shape. Hence a combined complex Grid cannot be formed.') # Now we have a complex grid grid.grid = grid.grid + 1j * imag.grid return grid