def write_force_constants(self, fc_format='hdf5'): if self.fc is not None: if fc_format == 'hdf5': p2s_map = self.primitive.get_primitive_to_supercell_map() write_force_constants_to_hdf5(self.fc, p2s_map=p2s_map) else: write_FORCE_CONSTANTS(self.fc)
def create_FORCE_CONSTANTS(filename, options, log_level): fc_and_atom_types = read_force_constant_vasprun_xml(filename) if not fc_and_atom_types: print('') print("\'%s\' dones not contain necessary information." % filename) return 1 force_constants, atom_types = fc_and_atom_types if options.is_hdf5: try: import h5py except ImportError: print('') print("You need to install python-h5py.") return 1 write_force_constants_to_hdf5(force_constants) if log_level > 0: print("force_constants.hdf5 has been created from vasprun.xml.") else: write_FORCE_CONSTANTS(force_constants) if log_level > 0: print("FORCE_CONSTANTS has been created from vasprun.xml.") if log_level > 0: print("Atom types: %s" % (" ".join(atom_types))) return 0
def create_FORCE_CONSTANTS(filename, options, log_level): fc_and_atom_types = read_force_constant_vasprun_xml(filename) if not fc_and_atom_types: print print "\'%s\' dones not contain necessary information." % filename return 1 force_constants, atom_types = fc_and_atom_types if options.is_hdf5: try: import h5py except ImportError: print print "You need to install python-h5py." return 1 write_force_constants_to_hdf5(force_constants) if log_level > 0: print "force_constants.hdf5 has been created from vasprun.xml." else: write_FORCE_CONSTANTS(force_constants) if log_level > 0: print "FORCE_CONSTANTS has been created from vasprun.xml." if log_level > 0: print "Atom types:", atom_types return 0
def create_FORCE_CONSTANTS(filename, is_hdf5, log_level): fc_and_atom_types = parse_force_constants(filename) if not fc_and_atom_types: print('') print("\'%s\' dones not contain necessary information." % filename) return 1 force_constants, atom_types = fc_and_atom_types if is_hdf5: try: import h5py except ImportError: print('') print("You need to install python-h5py.") return 1 write_force_constants_to_hdf5(force_constants) if log_level > 0: print("force_constants.hdf5 has been created from vasprun.xml.") else: write_FORCE_CONSTANTS(force_constants) if log_level > 0: print("FORCE_CONSTANTS has been created from vasprun.xml.") if log_level > 0: print("Atom types: %s" % (" ".join(atom_types))) return 0
def create_FORCE_CONSTANTS(filename, is_hdf5, log_level): """Parse vasprun.xml and write it into force constants file.""" force_constants, atom_types = parse_force_constants(filename) if force_constants is None: print("") print("'%s' dones not contain necessary information." % filename) return 1 if is_hdf5: try: import h5py # noqa F401 except ImportError: print("") print("You need to install python-h5py.") return 1 write_force_constants_to_hdf5(force_constants) if log_level > 0: print("force_constants.hdf5 has been created from vasprun.xml.") else: write_FORCE_CONSTANTS(force_constants) if log_level > 0: print("FORCE_CONSTANTS has been created from vasprun.xml.") if log_level > 0: print("Atom types: %s" % (" ".join(atom_types))) return 0
def write_force_constants(self, fc_format="hdf5"): """Write force constatns to file in hdf5.""" if self.fc is not None: if fc_format == "hdf5": write_force_constants_to_hdf5(self.fc, p2s_map=self.primitive.p2s_map) else: write_FORCE_CONSTANTS(self.fc)
def write_force_constants(self, filename='FORCE_CONSTANTS', hdf5=False): """ Write the force constants in a file in phonopy plain text format :param filename: Force constants filename """ force_constants = self.get_force_constants() if hdf5: write_force_constants_to_hdf5(force_constants, filename=filename) else: write_FORCE_CONSTANTS(force_constants, filename=filename)
def load_phonopy(filename, structure, dim, symprec=0.01, primitive_matrix=None, factor=VaspToTHz, symmetrise=True, born=None, write_fc=False): """Load phonopy output and return an ``phonopy.Phonopy`` object. Args: filename (str): Path to phonopy output. Can be any of ``FORCE_SETS``, ``FORCE_CONSTANTS``, or ``force_constants.hdf5``. structure (:obj:`~pymatgen.core.structure.Structure`): The unitcell structure. dim (list): The supercell size, as a :obj:`list` of :obj:`float`. symprec (:obj:`float`, optional): The tolerance for determining the crystal symmetry. primitive_matrix (:obj:`list` or :obj:`str`, optional): The transformation matrix from the conventional to primitive cell. Only required when the conventional cell was used as the starting structure. Should be provided as a 3x3 :obj:`list` of :obj:`float`. Alternatively the str 'auto' may be provided. factor (:obj:`float`, optional): The conversion factor for phonon frequency. Defaults to :obj:`phonopy.units.VaspToTHz`. symmetrise (:obj:`bool`, optional): Symmetrise the force constants. Defaults to ``True``. born (:obj:`str`, optional): Path to file containing Born effective charges. Should be in the same format as the file produced by the ``phonopy-vasp-born`` script provided by phonopy. write_fc (:obj:`bool` or :obj:`str`, optional): Write the force constants to disk. If ``True``, a ``FORCE_CONSTANTS`` file will be written. Alternatively, if set to ``"hdf5"``, a ``force_constants.hdf5`` file will be written. Defaults to ``False`` (force constants not written). """ unitcell = get_phonopy_structure(structure) num_atom = unitcell.get_number_of_atoms() num_satom = determinant(dim) * num_atom phonon = Phonopy(unitcell, dim, primitive_matrix=primitive_matrix, factor=factor, symprec=symprec) if 'FORCE_CONSTANTS' == filename or '.hdf5' in filename: # if force constants exist, use these to avoid recalculating them if '.hdf5' in filename: fc = file_IO.read_force_constants_hdf5(filename) elif 'FORCE_CONSTANTS' == filename: fc = file_IO.parse_FORCE_CONSTANTS(filename=filename) if fc.shape[0] != num_satom: msg = ("\nNumber of atoms in supercell is not consistent with the " "matrix shape of\nforce constants read from {}.\nPlease" "carefully check --dim.") logging.error(msg.format(filename)) sys.exit() phonon.set_force_constants(fc) elif 'FORCE_SETS' == filename: # load the force sets from file and calculate force constants fs = file_IO.parse_FORCE_SETS() if fs['natom'] != num_satom: msg = ("\nNumber of atoms in supercell is not consistent with the " "the data in FORCE_SETS\nPlease carefully check --dim.") logging.error(msg.format(filename)) sys.exit() phonon.set_displacement_dataset(fs) logging.info("Calculating force constants...") phonon.produce_force_constants() if born: # load born parameters from a file nac_params = file_IO.parse_BORN(phonon._primitive, symprec=symprec, filename=born) # set the nac unit conversion factor manual, specific to VASP nac_params['factor'] = Hartree * Bohr phonon.set_nac_params(nac_params) if symmetrise: phonon.symmetrize_force_constants() if write_fc == 'hdf5': file_IO.write_force_constants_to_hdf5(phonon.get_force_constants()) logging.info("Force constants written to force_constants.hdf5.") elif write_fc: file_IO.write_FORCE_CONSTANTS(phonon.get_force_constants()) logging.info("Force constants written to FORCE_CONSTANTS.") return phonon
file_IO.write_FORCE_CONSTANTS(phonon.get_force_constants(), filename='FORCE_CONSTANTS_SPG') if log_level > 0: print( "Symmetrized force constants are written into " "FORCE_CONSTANTS_SPG.") # Imporse translational invariance and index permulation symmetry to # force constants if settings.get_fc_symmetry_iteration() > 0: phonon.symmetrize_force_constants(settings.get_fc_symmetry_iteration()) # Write FORCE_CONSTANTS if settings.get_is_force_constants() == "write": if settings.get_is_hdf5(): file_IO.write_force_constants_to_hdf5(phonon.get_force_constants()) if log_level > 0: print("Force constants are written into force_constants.hdf5.") else: file_IO.write_FORCE_CONSTANTS(phonon.get_force_constants()) if log_level > 0: print("Force constants are written into FORCE_CONSTANTS.") # Show the rotational invariance condition (just show!) if settings.get_is_rotational_invariance(): phonon.get_rotational_condition_of_fc() # Atomic species without mass case symbols_with_no_mass = [] if primitive.get_masses() is None: for s in primitive.get_chemical_symbols():
def write_fc2_to_hdf5(force_constants, filename='fc2.hdf5', p2s_map=None): write_force_constants_to_hdf5(force_constants, filename=filename, p2s_map=p2s_map)