def __init__(self, filename): from Scientific.IO.NetCDF import NetCDFFile self.nc = NetCDFFile(filename, 'w') self.nc.file_format = 'ETSF Nanoquanta' self.nc.file_format_version = np.array([3.3], dtype=np.float32) self.nc.Conventions = 'http://www.etsf.eu/fileformats/' self.nc.history = 'File generated by ASE'
def read_dacapo(filename): from ase.io.pupynere import NetCDFFile nc = NetCDFFile(filename) vars = nc.variables cell = vars['UnitCell'][-1] try: magmoms = vars['InitialAtomicMagneticMoment'][:] except KeyError: magmoms = None try: tags = vars['AtomTags'][:] except KeyError: tags = None atoms = Atoms(scaled_positions=vars['DynamicAtomPositions'][-1], symbols=[(a + b).strip() for a, b in vars['DynamicAtomSpecies'][:]], cell=cell, magmoms=magmoms, tags=tags, pbc=True) try: energy = vars['TotalEnergy'][-1] force = vars['DynamicAtomForces'][-1] except KeyError: energy = None force = None calc = SinglePointCalculator(atoms, energy=energy, forces=force) ### Fixme magmoms atoms.set_calculator(calc) return atoms
class Reader: def __init__(self, filename, comm): self.nc = NetCDFFile(filename) def dimension(self, name): return self.nc.dimensions[name] def __getitem__(self, name): value = getattr(self.nc, name) if isinstance(value, str): try: value = eval(value) except (SyntaxError, NameError): pass return value else: return value[0] def has_array(self, name): return name in self.nc.variables def get(self, name, *indices): var = self.nc.variables[name] if var.shape == (): return var.getValue() else: if var.dimensions[-1] == 'two': x = var[indices] array = np.empty(x.shape[:-1], complex) array.real = x[..., 0] array.imag = x[..., 1] return array else: return var[indices] def get_reference(self, name, *indices): return NetCDFReference(self.nc.variables[name], indices) def close(self): self.nc.close()
def filetype(filename): """Try to guess the type of the file.""" if os.path.isdir(filename): # Potentially a BundleTrajectory if BundleTrajectory.is_bundle(filename): return 'bundle' elif os.path.normpath(filename) == 'states': return 'eon' else: raise IOError('Directory: ' + filename) if filename.startswith('pg://'): return 'postgresql' fileobj = open(filename, 'rU') s3 = fileobj.read(3) if len(s3) == 0: raise IOError('Empty file: ' + filename) if s3.startswith('{"'): return 'json' if filename.endswith('.db'): return 'db' if filename.lower().endswith('.cmr'): return 'cmr' if is_tarfile(filename): return 'gpw' if s3 == 'CDF': from ase.io.pupynere import NetCDFFile nc = NetCDFFile(filename) if 'number_of_dynamic_atoms' in nc.dimensions: return 'dacapo' history = nc.history if history == 'GPAW restart file': return 'gpw-nc' if history == 'ASE trajectory': return 'nc' if history == 'Dacapo': return 'dacapo' if hasattr(nc, 'file_format') and nc.file_format.startswith('ETSF'): return 'etsf' raise IOError('Unknown netCDF file!') if is_zipfile(filename): return 'vnl' fileobj.seek(0) lines = fileobj.readlines(1000) if lines[0].startswith('PickleTrajectory'): return 'traj' if (lines[1].startswith('OUTER LOOP:') or filename.lower().endswith('.cube')): return 'cube' if ' ___ ___ ___ _ _ _ \n' in lines: return 'gpaw-text' if (' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n' in lines[:90]): return 'dacapo-text' for line in lines: if line[0] != '#': word = line.strip() if word in ['ANIMSTEPS', 'CRYSTAL', 'SLAB', 'POLYMER', 'MOLECULE']: return 'xsf' filename_v = os.path.basename(filename) if 'POSCAR' in filename_v or 'CONTCAR' in filename_v: return 'vasp' if 'OUTCAR' in filename_v: return 'vasp_out' if filename.lower().endswith('.exi'): return 'exi' if filename.lower().endswith('.mol'): return 'mol' if filename.lower().endswith('.pdb'): return 'pdb' if filename.lower().endswith('.cif'): return 'cif' if filename.lower().endswith('.struct'): return 'struct' if filename.lower().endswith('.struct_out'): return 'struct_out' fileobj.seek(0) while True: line = fileobj.readline() if not line: break if 'Invoking FHI-aims ...' in line: return 'aims_out' if 'atom' in line: data = line.split() try: Atoms(symbols=[data[4]], positions=[[ float(data[1]), float(data[2]), float(data[3]) ]]) return 'aims' except: pass if filename.lower().endswith('.in'): fileobj.seek(0) while True: line = fileobj.readline() if not line: break if ('&system' in line) or ('&SYSTEM' in line): return 'esp_in' return 'aims' if filename.lower().endswith('.cfg'): return 'cfg' if os.path.split(filename)[1] == 'atoms.dat': return 'iwm' if filename.endswith('I_info'): return 'Cmdft' if lines[0].startswith('$coord') or os.path.basename(filename) == 'coord': return 'tmol' if (lines[0].startswith('$grad') or os.path.basename(filename) == 'gradient'): return 'tmol-gradient' if lines[0].startswith('Geometry'): return 'dftb' if filename.lower().endswith('.geom'): return 'castep_geom' if filename.lower().endswith('.castep'): return 'castep' if filename.lower().endswith('.cell'): return 'castep_cell' if s3 == '<?x': from ase.io.vtkxml import probe_vtkxml xmltype = probe_vtkxml(filename) if xmltype == 'ImageData': return 'vti' elif xmltype == 'StructuredGrid': return 'vts' elif xmltype == 'UnstructuredGrid': return 'vtu' elif xmltype is not None: raise IOError('Unknown VTK XML file!') if filename.lower().endswith('.sdf'): return 'sdf' if filename.lower().endswith('.gen'): return 'gen' if filename.lower().endswith('.con'): return 'eon' if 'ITEM: TIMESTEP\n' in lines: return 'lammps' if filename.lower().endswith('.gro'): return 'gromacs' if filename.lower().endswith('.log'): return 'gaussian_out' if filename.lower().endswith('.com'): return 'gaussian' if filename.lower().endswith('.g96'): return 'gromos' if filename.lower().endswith('.out'): return 'esp_out' if filename.endswith('.nw'): return 'nw' return 'xyz'
def read_netcdf(filename, index=-1): nc = NetCDFFile(filename) dims = nc.dimensions vars = nc.variables positions = vars['CartesianPositions'] numbers = vars['AtomicNumbers'][:] pbc = vars['BoundaryConditions'][:] cell = vars['UnitCell'] tags = vars['Tags'][:] if not tags.any(): tags = None magmoms = vars['MagneticMoments'][:] if not magmoms.any(): magmoms = None nimages = positions.shape[0] attach_calculator = False if 'PotentialEnergy' in vars: energy = vars['PotentialEnergy'] attach_calculator = True else: energy = nimages * [None] if 'CartesianForces' in vars: forces = vars['CartesianForces'] attach_calculator = True else: forces = nimages * [None] if 'Stress' in vars: stress = vars['Stress'] attach_calculator = True else: stress = nimages * [None] if isinstance(index, int): indices = [index] else: indices = range(nimages)[index] images = [] for i in indices: atoms = Atoms(positions=positions[i], numbers=numbers, cell=cell[i], pbc=pbc, tags=tags, magmoms=magmoms) if attach_calculator: calc = SinglePointCalculator(atoms, energy=energy[i], forces=forces[i], stress=stress[i]) # Fixme magmoms atoms.set_calculator(calc) images.append(atoms) if isinstance(index, int): return images[0] else: return images
def saveNetcdf(fileName,data): # NetCDF package try: from ase.io.pupynere import NetCDFFile except ImportError: print "ase.io.pupynere not installed on this computer." # get input data shape nx,ny,nz = data.shape print 'data type '+str(data.dtype) # open file f = NetCDFFile(fileName,'w') # create netcdf dimensions f.createDimension('x',nx) f.createDimension('y',ny) f.createDimension('z',nz) rho = f.createVariable('rho','d',('x','y','z')) rho[:] = np.ones((nx,ny,nz)) E = f.createVariable('E','d',('x','y','z')) E[:] = np.zeros((nx,ny,nz)) rho_vx = f.createVariable('rho_vx','d',('x','y','z')) rho_vx[:] = data rho_vy = f.createVariable('rho_vy','d',('x','y','z')) rho_vy[:] = np.zeros((nx,ny,nz)) rho_vz = f.createVariable('rho_vz','d',('x','y','z')) rho_vz[:] = np.zeros((nx,ny,nz)) Bx = f.createVariable('Bx','d',('x','y','z')) Bx[:] = np.zeros((nx,ny,nz)) By = f.createVariable('By','d',('x','y','z')) By[:] = np.zeros((nx,ny,nz)) Bz = f.createVariable('Bz','d',('x','y','z')) Bz[:] = np.zeros((nx,ny,nz)) f.sync() f.close()
def saveNetcdf(fileName, data): # NetCDF package try: from ase.io.pupynere import NetCDFFile except ImportError: print "ase.io.pupynere not installed on this computer." # get input data shape nx, ny, nz = data.shape print 'data type ' + str(data.dtype) # open file f = NetCDFFile(fileName, 'w') # create netcdf dimensions f.createDimension('x', nx) f.createDimension('y', ny) f.createDimension('z', nz) rho = f.createVariable('rho', 'd', ('x', 'y', 'z')) rho[:] = np.ones((nx, ny, nz)) E = f.createVariable('E', 'd', ('x', 'y', 'z')) E[:] = np.zeros((nx, ny, nz)) rho_vx = f.createVariable('rho_vx', 'd', ('x', 'y', 'z')) rho_vx[:] = data rho_vy = f.createVariable('rho_vy', 'd', ('x', 'y', 'z')) rho_vy[:] = np.zeros((nx, ny, nz)) rho_vz = f.createVariable('rho_vz', 'd', ('x', 'y', 'z')) rho_vz[:] = np.zeros((nx, ny, nz)) Bx = f.createVariable('Bx', 'd', ('x', 'y', 'z')) Bx[:] = np.zeros((nx, ny, nz)) By = f.createVariable('By', 'd', ('x', 'y', 'z')) By[:] = np.zeros((nx, ny, nz)) Bz = f.createVariable('Bz', 'd', ('x', 'y', 'z')) Bz[:] = np.zeros((nx, ny, nz)) f.sync() f.close()
def __init__(self, filename, comm): self.nc = NetCDFFile(filename)
import numpy as np from ase.io.pupynere import NetCDFFile # Write array a1 = np.random.rand(5, 5) a2 = a1 * 2 - 5 nc = NetCDFFile('test.nc', 'w') nc.createDimension('dimx', a1.shape[0]) nc.createDimension('dimy', a1.shape[1]) nc.createVariable('matrix1', 'd', ('dimx', 'dimy'))[:] = a1 nc.createVariable('matrix2', 'd', ('dimx', 'dimy'))[:] = a2 nc.sync() nc.close() # Read array nc = NetCDFFile('test.nc', 'r') b1 = nc.variables['matrix1'][:] b2 = nc.variables['matrix2'][:] assert np.all(a1 == b1) and np.all(a2 == b2)
def filetype(filename): """Try to guess the type of the file.""" if os.path.isdir(filename): # Potentially a BundleTrajectory if BundleTrajectory.is_bundle(filename): return 'bundle' else: raise IOError('Directory: ' + filename) fileobj = open(filename) s3 = fileobj.read(3) if len(s3) == 0: raise IOError('Empty file: ' + filename) if is_tarfile(filename): return 'gpw' if s3 == 'CDF': from ase.io.pupynere import NetCDFFile nc = NetCDFFile(filename) if 'number_of_dynamic_atoms' in nc.dimensions: return 'dacapo' history = nc.history if history == 'GPAW restart file': return 'gpw-nc' if history == 'ASE trajectory': return 'nc' if history == 'Dacapo': return 'dacapo' if hasattr(nc, 'file_format') and nc.file_format.startswith('ETSF'): return 'etsf' raise IOError('Unknown netCDF file!') if is_zipfile(filename): return 'vnl' fileobj.seek(0) lines = fileobj.readlines(1000) if lines[0].startswith('PickleTrajectory'): return 'traj' if lines[1].startswith('OUTER LOOP:') or filename.lower().endswith( '.cube'): return 'cube' if ' ___ ___ ___ _ _ _ \n' in lines: return 'gpaw-text' if (' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n' in lines[:90]): return 'dacapo-text' for line in lines: if line[0] != '#': word = line.strip() if word in ['ANIMSTEPS', 'CRYSTAL', 'SLAB', 'POLYMER', 'MOLECULE']: return 'xsf' filename_v = basename(filename) if 'POSCAR' in filename_v or 'CONTCAR' in filename_v: return 'vasp' if 'OUTCAR' in filename_v: return 'vasp_out' if filename.lower().endswith('.exi'): return 'exi' if filename.lower().endswith('.mol'): return 'mol' if filename.lower().endswith('.pdb'): return 'pdb' if filename.lower().endswith('.cif'): return 'cif' if filename.lower().endswith('.struct'): return 'struct' if filename.lower().endswith('.in'): return 'aims' if filename.lower().endswith('.out'): return 'aims_out' if filename.lower().endswith('.cfg'): return 'cfg' if os.path.split(filename)[1] == 'atoms.dat': return 'iwm' if filename.endswith('I_info'): return 'Cmdft' if lines[0].startswith('$coord'): return 'tmol' if lines[0].startswith('Geometry'): return 'dftb' if s3 == '<?x': from ase.io.vtkxml import probe_vtkxml xmltype = probe_vtkxml(filename) if xmltype == 'ImageData': return 'vti' elif xmltype == 'StructuredGrid': return 'vts' elif xmltype == 'UnstructuredGrid': return 'vtu' elif xmltype is not None: raise IOError('Unknown VTK XML file!') if filename.lower().endswith('.sdf'): return 'sdf' return 'xyz'
def __init__(self, filename): self.nc = NetCDFFile(filename, 'r')
class ETSFWriter: def __init__(self, filename): from Scientific.IO.NetCDF import NetCDFFile self.nc = NetCDFFile(filename, 'w') self.nc.file_format = 'ETSF Nanoquanta' self.nc.file_format_version = np.array([3.3], dtype=np.float32) self.nc.Conventions = 'http://www.etsf.eu/fileformats/' self.nc.history = 'File generated by ASE' def write_atoms(self, atoms): specie_a = np.empty(len(atoms), np.int32) nspecies = 0 species = {} numbers = [] for a, Z in enumerate(atoms.get_atomic_numbers()): if Z not in species: species[Z] = nspecies nspecies += 1 numbers.append(Z) specie_a[a] = species[Z] dimensions = [ ('character_string_length', 80), ('number_of_atoms', len(atoms)), ('number_of_atom_species', nspecies), ('number_of_cartesian_directions', 3), ('number_of_reduced_dimensions', 3), ('number_of_vectors', 3)] for name, size in dimensions: self.nc.createDimension(name, size) var = self.add_variable var('primitive_vectors', ('number_of_vectors', 'number_of_cartesian_directions'), atoms.cell / Bohr, units='atomic units') var('atom_species', ('number_of_atoms',), specie_a + 1) var('reduced_atom_positions', ('number_of_atoms', 'number_of_reduced_dimensions'), atoms.get_scaled_positions()) var('atomic_numbers', ('number_of_atom_species',), np.array(numbers, dtype=float)) def close(self): self.nc.close() def add_variable(self, name, dims, data=None, **kwargs): if data is None: char = 'd' else: if isinstance(data, np.ndarray): char = data.dtype.char elif isinstance(data, float): char = 'd' elif isinstance(data, int): char = 'i' else: char = 'c' var = self.nc.createVariable(name, char, dims) for attr, value in kwargs.items(): setattr(var, attr, value) if data is not None: if len(dims) == 0: var.assignValue(data) else: if char == 'c': if len(dims) == 1: var[:len(data)] = data else: for i, x in enumerate(data): var[i, :len(x)] = x else: var[:] = data return var