def load(supercell_matrix, primitive_matrix=None, nac_params=None, unitcell=None, calculator="vasp", unitcell_filename=None, born_filename=None, force_sets_filename=None, force_constants_filename=None, factor=VaspToTHz, frequency_scale_factor=None, symprec=1e-5, is_symmetry=True, log_level=0): if unitcell is None: _unitcell, _ = read_crystal_structure(filename=unitcell_filename, interface_mode=calculator) else: _unitcell = unitcell # units keywords: factor, nac_factor, distance_to_A units = get_default_physical_units(calculator) phonon = Phonopy(_unitcell, supercell_matrix, primitive_matrix=primitive_matrix, factor=units['factor']) if nac_params is None: if born_filename is None: _nac_params = None else: _nac_params = parse_BORN(phonon.primitive, filename=born_filename) else: _nac_params = nac_params if _nac_params is not None: if _nac_params['factor'] is None: _nac_params['factor'] = units['nac_factor'] phonon.set_nac_params(_nac_params) if force_constants_filename is not None: dot_split = force_constants_filename.split('.') p2s_map = phonon.primitive.get_primitive_to_supercell_map() if len(dot_split) > 1 and dot_split[-1] == 'hdf5': fc = read_force_constants_hdf5(filename=force_constants_filename, p2s_map=p2s_map) else: fc = parse_FORCE_CONSTANTS(filename=force_constants_filename, p2s_map=p2s_map) phonon.set_force_constants(fc) elif force_sets_filename is not None: force_sets = parse_FORCE_SETS(filename=force_sets_filename) phonon.set_displacement_dataset(force_sets) phonon.produce_force_constants() return phonon
def get_BORN_txt(structure, parameters, nac_data, symprec=1.e-5): from phonopy.structure.cells import get_primitive, get_supercell from phonopy.structure.symmetry import Symmetry from phonopy.interface import get_default_physical_units from phonopy.structure.atoms import Atoms as PhonopyAtoms born_charges = nac_data.get_array('born_charges') epsilon = nac_data.get_array('epsilon') print ('inside born parameters') pmat = parameters['primitive'] smat = parameters['supercell'] ucell = PhonopyAtoms(symbols=[site.kind_name for site in structure.sites], positions=[site.position for site in structure.sites], cell=structure.cell) num_atom = len(born_charges) assert num_atom == ucell.get_number_of_atoms(), \ "num_atom %d != len(borns) %d" % (ucell.get_number_of_atoms(), len(born_charges)) inv_smat = np.linalg.inv(smat) scell = get_supercell(ucell, smat, symprec=symprec) pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec) p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc') p_sym = Symmetry(pcell, is_symmetry=True, symprec=symprec) s_indep_atoms = p2s[p_sym.get_independent_atoms()] u2u = scell.get_unitcell_to_unitcell_map() u_indep_atoms = [u2u[x] for x in s_indep_atoms] reduced_borns = born_charges[u_indep_atoms].copy() factor = get_default_physical_units('vasp')['nac_factor'] # born charges in VASP units born_txt = ('{}\n'.format(factor)) for num in epsilon.flatten(): born_txt += ('{0:4.8f}'.format(num)) born_txt += ('\n') for atom in reduced_borns: for num in atom: born_txt += ('{0:4.8f}'.format(num)) born_txt += ('\n') born_txt += ('{}\n'.format(factor)) return born_txt
def get_phonopy_instance(structure, phonon_settings_dict, params): from phonopy import Phonopy phonon = Phonopy(phonopy_atoms_from_structure(structure), phonon_settings_dict['supercell_matrix'], primitive_matrix='auto', symprec=phonon_settings_dict['symmetry_tolerance']) if 'nac_params' in params: from phonopy.interface import get_default_physical_units units = get_default_physical_units('vasp') factor = units['nac_factor'] nac_params = { 'born': params['nac_params'].get_array('born_charges'), 'dielectric': params['nac_params'].get_array('epsilon'), 'factor': factor } phonon.set_nac_params(nac_params) return phonon
def get_born_parameters(phonon, born_charges, epsilon, symprec=1e-5): from phonopy.structure.cells import get_primitive, get_supercell from phonopy.structure.symmetry import Symmetry from phonopy.interface import get_default_physical_units print('inside born parameters') pmat = phonon.get_primitive_matrix() smat = phonon.get_supercell_matrix() ucell = phonon.get_unitcell() print pmat print smat print ucell num_atom = len(born_charges) assert num_atom == ucell.get_number_of_atoms(), \ "num_atom %d != len(borns) %d" % (ucell.get_number_of_atoms(), len(born_charges)) inv_smat = np.linalg.inv(smat) scell = get_supercell(ucell, smat, symprec=symprec) pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec) p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc') p_sym = Symmetry(pcell, is_symmetry=True, symprec=symprec) s_indep_atoms = p2s[p_sym.get_independent_atoms()] u2u = scell.get_unitcell_to_unitcell_map() u_indep_atoms = [u2u[x] for x in s_indep_atoms] reduced_borns = born_charges[u_indep_atoms].copy() factor = get_default_physical_units('vasp')[ 'nac_factor'] # born charges in VASP units born_dict = { 'born': reduced_borns, 'dielectric': epsilon, 'factor': factor } print('final born dict', born_dict) return born_dict
def load(phonopy_yaml=None, # phonopy.yaml-like must be the first argument. supercell_matrix=None, primitive_matrix=None, is_nac=True, calculator=None, unitcell=None, supercell=None, nac_params=None, unitcell_filename=None, supercell_filename=None, born_filename=None, force_sets_filename=None, force_constants_filename=None, use_alm=False, factor=None, frequency_scale_factor=None, symprec=1e-5, is_symmetry=True, log_level=0): """Create Phonopy instance from parameters and/or input files. When unitcell and unitcell_filename are not given, file name that is default for the chosen calculator is looked for in the current directory as the default behaviour. When force_sets_filename and force_constants_filename are not given, 'FORCE_SETS' is looked for in the current directory as the default behaviour. Parameters ---------- phonopy_yaml : str, optional Filename of "phonopy.yaml"-like file. If this is given, the data in the file are parsed. Default is None. supercell_matrix : array_like, optional Supercell matrix multiplied to input cell basis vectors. shape=(3, ) or (3, 3), where the former is considered a diagonal matrix. Default is the unit matrix. dtype=int primitive_matrix : array_like or str, optional Primitive matrix multiplied to input cell basis vectors. Default is the identity matrix. shape=(3, 3) dtype=float When 'F', 'I', 'A', 'C', or 'R' is given instead of a 3x3 matrix, the primitive matrix defined at https://atztogo.github.io/spglib/definition.html is used. is_nac : bool, optional If True, look for 'BORN' file. If False, NAS is turned off. The priority for NAC is nac_params > born_filename > is_nac ('BORN'). Default is True. calculator : str, optional. Calculator used for computing forces. This is used to switch the set of physical units. Default is None, which is equivalent to "vasp". unitcell : PhonopyAtoms, optional Input unit cell. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. supercell : PhonopyAtoms, optional Input supercell cell. Default value of primitive_matrix is set to 'auto' (can be overwitten). supercell_matrix is ignored. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. nac_params : dict, optional Parameters required for non-analytical term correction. Default is None. The priority for NAC is nac_params > born_filename > is_nac. {'born': Born effective charges (array_like, shape=(primitive cell atoms, 3, 3), dtype=float), 'dielectric': Dielectric constant matrix (array_like, shape=(3, 3), dtype=float), 'factor': unit conversion facotr (float)} unitcell_filename : str, optional Input unit cell filename. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. supercell_filename : str, optional Input supercell filename. Default value of primitive_matrix is set to 'auto' (can be overwitten). supercell_matrix is ignored. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. born_filename : str, optional Filename corresponding to 'BORN', a file contains non-analytical term correction parameters. The priority for NAC is nac_params > born_filename > is_nac ('BORN'). force_sets_filename : str, optional Filename of a file corresponding to 'FORCE_SETS', a file contains sets of forces and displacements. Default is None. The priority for force constants is force_constants_filename > force_sets_filename > 'FORCE_SETS'. force_constants_filename : str, optional Filename of a file corresponding to 'FORCE_CONSTANTS' or 'force_constants.hdf5', a file contains force constants. Default is None. The priority for force constants is force_constants_filename > force_sets_filename > 'FORCE_SETS'. use_alm : bool, optional Default is False. factor : float, optional Phonon frequency unit conversion factor. Unless specified, default unit conversion factor for each calculator is used. frequency_scale_factor : float, optional Factor multiplied to calculated phonon frequency. Default is None, i.e., effectively 1. symprec : float, optional Tolerance used to find crystal symmetry. Default is 1e-5. is_symmetry : bool, optional Setting False, crystal symmetry except for lattice translation is not considered. Default is True. log_level : int, optional Verbosity control. Default is 0. """ if phonopy_yaml is None: cell, smat, pmat = load_helper.get_cell_settings( supercell_matrix=supercell_matrix, primitive_matrix=primitive_matrix, unitcell=unitcell, supercell=supercell, unitcell_filename=unitcell_filename, supercell_filename=supercell_filename, calculator=calculator, symprec=symprec) _nac_params = nac_params _dataset = None _fc = None else: phpy_yaml = PhonopyYaml() phpy_yaml.read(phonopy_yaml) cell = phpy_yaml.unitcell smat = phpy_yaml.supercell_matrix if smat is None: smat = np.eye(3, dtype='intc', order='C') if primitive_matrix is 'auto': pmat = 'auto' else: pmat = phpy_yaml.primitive_matrix if is_nac: _nac_params = phpy_yaml.nac_params else: _nac_params = None _dataset = phpy_yaml.dataset _fc = phpy_yaml.force_constants # units keywords: factor, nac_factor, distance_to_A units = get_default_physical_units(calculator) if factor is None: _factor = units['factor'] else: _factor = factor phonon = Phonopy(cell, smat, primitive_matrix=pmat, factor=_factor, frequency_scale_factor=frequency_scale_factor, symprec=symprec, is_symmetry=is_symmetry, calculator=calculator, log_level=log_level) load_helper.set_nac_params(phonon, _nac_params, born_filename, is_nac, units['nac_factor']) if _fc is None: load_helper.set_force_constants( phonon, dataset=_dataset, force_constants_filename=force_constants_filename, force_sets_filename=force_sets_filename, calculator=calculator, use_alm=use_alm) else: phonon.force_constants = _fc return phonon
def load(phonopy_yaml=None, # phonopy.yaml-like must be the first argument. supercell_matrix=None, primitive_matrix=None, is_nac=True, calculator=None, unitcell=None, supercell=None, nac_params=None, unitcell_filename=None, supercell_filename=None, born_filename=None, force_sets_filename=None, force_constants_filename=None, use_alm=False, factor=None, frequency_scale_factor=None, symprec=1e-5, is_symmetry=True, log_level=0): """Create Phonopy instance from parameters and/or input files. When unitcell and unitcell_filename are not given, file name that is default for the chosen calculator is looked for in the current directory as the default behaviour. When force_sets_filename and force_constants_filename are not given, 'FORCE_SETS' is looked for in the current directory as the default behaviour. Parameters ---------- phonopy_yaml : str, optional Filename of "phonopy.yaml"-like file. If this is given, the data in the file are parsed. Default is None. supercell_matrix : array_like, optional Supercell matrix multiplied to input cell basis vectors. shape=(3, ) or (3, 3), where the former is considered a diagonal matrix. Default is the unit matrix. dtype=int primitive_matrix : array_like or str, optional Primitive matrix multiplied to input cell basis vectors. Default is the identity matrix. shape=(3, 3) dtype=float When 'F', 'I', 'A', 'C', or 'R' is given instead of a 3x3 matrix, the primitive matrix defined at https://atztogo.github.io/spglib/definition.html is used. is_nac : bool, optional If True, look for 'BORN' file. If False, NAS is turned off. The priority for NAC is nac_params > born_filename > is_nac ('BORN'). Default is True. calculator : str, optional. Calculator used for computing forces. This is used to switch the set of physical units. Default is None, which is equivalent to "vasp". unitcell : PhonopyAtoms, optional Input unit cell. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. supercell : PhonopyAtoms, optional Input supercell cell. Default value of primitive_matrix is set to 'auto' (can be overwitten). supercell_matrix is ignored. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. nac_params : dict, optional Parameters required for non-analytical term correction. Default is None. The priority for NAC is nac_params > born_filename > is_nac. {'born': Born effective charges (array_like, shape=(primitive cell atoms, 3, 3), dtype=float), 'dielectric': Dielectric constant matrix (array_like, shape=(3, 3), dtype=float), 'factor': unit conversion facotr (float)} unitcell_filename : str, optional Input unit cell filename. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. supercell_filename : str, optional Input supercell filename. Default value of primitive_matrix is set to 'auto' (can be overwitten). supercell_matrix is ignored. Default is None. The priority for cell is unitcell_filename > supercell_filename > unitcell > supercell. born_filename : str, optional Filename corresponding to 'BORN', a file contains non-analytical term correction parameters. The priority for NAC is nac_params > born_filename > is_nac ('BORN'). force_sets_filename : str, optional Filename of a file corresponding to 'FORCE_SETS', a file contains sets of forces and displacements. Default is None. The priority for force constants is force_constants_filename > force_sets_filename > 'FORCE_SETS'. force_constants_filename : str, optional Filename of a file corresponding to 'FORCE_CONSTANTS' or 'force_constants.hdf5', a file contains force constants. Default is None. The priority for force constants is force_constants_filename > force_sets_filename > 'FORCE_SETS'. use_alm : bool, optional Default is False. factor : float, optional Phonon frequency unit conversion factor. Unless specified, default unit conversion factor for each calculator is used. frequency_scale_factor : float, optional Factor multiplied to calculated phonon frequency. Default is None, i.e., effectively 1. symprec : float, optional Tolerance used to find crystal symmetry. Default is 1e-5. is_symmetry : bool, optional Setting False, crystal symmetry except for lattice translation is not considered. Default is True. log_level : int, optional Verbosity control. Default is 0. """ if phonopy_yaml is None: cell, smat, pmat = load_helper.get_cell_settings( supercell_matrix=supercell_matrix, primitive_matrix=primitive_matrix, unitcell=unitcell, supercell=supercell, unitcell_filename=unitcell_filename, supercell_filename=supercell_filename, calculator=calculator, symprec=symprec) _nac_params = nac_params _dataset = None _fc = None else: phpy_yaml = PhonopyYaml() phpy_yaml.read(phonopy_yaml) cell = phpy_yaml.unitcell smat = phpy_yaml.supercell_matrix if smat is None: raise RuntimeError("%s could not be parsed.") if primitive_matrix is 'auto': pmat = 'auto' else: pmat = phpy_yaml.primitive_matrix if is_nac: _nac_params = phpy_yaml.nac_params else: _nac_params = None _dataset = phpy_yaml.dataset _fc = phpy_yaml.force_constants # units keywords: factor, nac_factor, distance_to_A units = get_default_physical_units(calculator) if factor is None: _factor = units['factor'] else: _factor = factor phonon = Phonopy(cell, smat, primitive_matrix=pmat, factor=_factor, frequency_scale_factor=frequency_scale_factor, symprec=symprec, is_symmetry=is_symmetry, calculator=calculator, log_level=log_level) load_helper.set_nac_params(phonon, _nac_params, born_filename, is_nac, units['nac_factor']) if _fc is None: load_helper.set_force_constants( phonon, dataset=_dataset, force_constants_filename=force_constants_filename, force_sets_filename=force_sets_filename, calculator=calculator, use_alm=use_alm) else: phonon.force_constants = _fc return phonon