def get_phonon(structure, NAC=False): force_atoms_file = structure.get_force_set()['natom'] force_atoms_input = np.product(np.diagonal(structure.get_super_cell_phonon()))*structure.get_number_of_atoms() if force_atoms_file != force_atoms_input: print("Error: FORCE_SETS file does not match with SUPERCELL MATRIX") exit() #Preparing the bulk type object bulk = PhonopyAtoms(symbols=structure.get_atomic_types(), scaled_positions=structure.get_scaled_positions(), cell=structure.get_cell().T) phonon = Phonopy(bulk, structure.get_super_cell_phonon(), primitive_matrix=structure.get_primitive_matrix(), is_auto_displacements=False) #Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if NAC: print("Phonopy warning: Using Non Analytical Corrections") get_is_symmetry = True #from phonopy: settings.get_is_symmetry() primitive = phonon.get_primitive() nac_params = parse_BORN(primitive, get_is_symmetry) phonon.set_nac_params(nac_params=nac_params) phonon.set_displacement_dataset(structure.get_force_set()) phonon.produce_force_constants(computation_algorithm="svd") return phonon
def get_phonon(structure, NAC=False, setup_forces=True, custom_supercell=None): super_cell_phonon = structure.get_supercell_phonon() if not(isinstance(custom_supercell, type(None))): super_cell_phonon = custom_supercell #Preparing the bulk type object bulk = PhonopyAtoms(symbols=structure.get_atomic_types(), scaled_positions=structure.get_scaled_positions(), cell=structure.get_cell().T) phonon = Phonopy(bulk, super_cell_phonon, primitive_matrix=structure.get_primitive_matrix()) # Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if NAC: print("Phonopy warning: Using Non Analytical Corrections") get_is_symmetry = True #from phonopy: settings.get_is_symmetry() primitive = phonon.get_primitive() nac_params = parse_BORN(primitive, get_is_symmetry) phonon.set_nac_params(nac_params=nac_params) if setup_forces: if not structure.forces_available(): # if not np.array(structure.get_force_constants()).any() and not np.array(structure.get_force_sets()).any(): print('No force sets/constants available!') exit() if np.array(structure.get_force_constants()).any(): phonon.set_force_constants(structure.get_force_constants()) else: phonon.set_displacement_dataset(structure.get_force_sets()) phonon.produce_force_constants(computation_algorithm="svd") return phonon
def get_phonon(structure, NAC=False, setup_forces=True, super_cell_phonon=np.identity(3), primitive_axis=np.identity(3)): phonon = Phonopy(structure, super_cell_phonon, primitive_matrix=primitive_axis, symprec=1e-5) # Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if setup_forces: if structure.get_force_constants() is not None: phonon.set_force_constants(structure.get_force_constants().get_array()) elif structure.get_force_sets() is not None: phonon.set_displacement_dataset(structure.get_force_sets().get_dict()) phonon.produce_force_constants(computation_algorithm="svd") structure.set_force_constants(ForceConstants(phonon.get_force_constants(), supercell=structure.get_force_sets().get_supercell())) else: print('No force sets/constants available!') exit() if NAC: print("Using non-analytical corrections") primitive = phonon.get_primitive() nac_params = parse_BORN(primitive, is_symmetry=True) phonon.set_nac_params(nac_params=nac_params) return phonon
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_phonon(structure, NAC=False, setup_forces=True, super_cell_phonon=np.identity(3), primitive_matrix=np.identity(3), symmetrize=True): """ Return a phonopy phonon object (instance of the class Phonon) :param structure: unit cell matrix (lattice vectors in rows) :param NAC: (Bool) activate/deactivate Non-analytic corrections :param setup_forces: (Bool) decide if pre-calculate harmonic forces in phonon object :param super_cell_phonon: 3x3 array containing the supercell to be used to calculate the force constants :param primitive_matrix: 3x3 array containing the primitive axis (in rows) which define the primitive cell :param symmetrize: decide if symmetrize the force constants :return: phonopy phonon object """ phonon = Phonopy(structure, super_cell_phonon, primitive_matrix=primitive_matrix, symprec=1e-5, is_symmetry=symmetrize) # Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if setup_forces: if structure.get_force_constants() is not None: phonon.set_force_constants( structure.get_force_constants().get_array()) elif structure.get_force_sets() is not None: phonon.set_displacement_dataset( structure.get_force_sets().get_dict()) phonon.produce_force_constants(computation_algorithm="svd") structure.set_force_constants( ForceConstants( phonon.get_force_constants(), supercell=structure.get_force_sets().get_supercell())) else: print('No force sets/constants available!') exit() if NAC: print("Using non-analytical corrections") primitive = phonon.get_primitive() try: nac_params = parse_BORN(primitive, is_symmetry=True) phonon.set_nac_params(nac_params=nac_params) except OSError: print('Required BORN file not found!') exit() return phonon
def _get_phonon(self): cell = read_vasp(os.path.join(data_dir, "..", "POSCAR_NaCl")) phonon = Phonopy(cell, np.diag([2, 2, 2]), primitive_matrix=[[0, 0.5, 0.5], [0.5, 0, 0.5], [0.5, 0.5, 0]]) filename = os.path.join(data_dir, "..", "FORCE_SETS_NaCl") force_sets = parse_FORCE_SETS(filename=filename) phonon.set_displacement_dataset(force_sets) phonon.produce_force_constants() phonon.symmetrize_force_constants() filename_born = os.path.join(data_dir, "..", "BORN_NaCl") nac_params = parse_BORN(phonon.get_primitive(), filename=filename_born) phonon.set_nac_params(nac_params) return phonon
def get_phonon(structure, NAC=False, setup_forces=True, custom_supercell=None, symprec=1e-5): if custom_supercell is None: super_cell_phonon = structure.get_supercell_phonon() else: super_cell_phonon = custom_supercell # Preparing the bulk type object bulk = PhonopyAtoms(symbols=structure.get_atomic_elements(), scaled_positions=structure.get_scaled_positions(), cell=structure.get_cell()) phonon = Phonopy(bulk, super_cell_phonon, primitive_matrix=structure.get_primitive_matrix(), symprec=symprec) # Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if setup_forces: if structure.get_force_constants() is not None: phonon.set_force_constants( structure.get_force_constants().get_array()) elif structure.get_force_sets() is not None: phonon.set_displacement_dataset( structure.get_force_sets().get_dict()) phonon.produce_force_constants() structure.set_force_constants( ForceConstants( phonon.get_force_constants(), supercell=structure.get_force_sets().get_supercell())) else: print('No force sets/constants available!') exit() if NAC: print("Warning: Using Non Analytical Corrections") primitive = phonon.get_primitive() nac_params = parse_BORN(primitive, is_symmetry=True) phonon.set_nac_params(nac_params=nac_params) return phonon
def get_phonon(structure, NAC=False, setup_forces=True, custom_supercell=None): if custom_supercell is None: super_cell_phonon = structure.get_supercell_phonon() else: super_cell_phonon = custom_supercell # Preparing the bulk type object bulk = PhonopyAtoms(symbols=structure.get_atomic_elements(), scaled_positions=structure.get_scaled_positions(), cell=structure.get_cell()) phonon = Phonopy(bulk, super_cell_phonon, primitive_matrix=structure.get_primitive_matrix(), symprec=1e-5) # Non Analytical Corrections (NAC) from Phonopy [Frequencies only, eigenvectors no affected by this option] if setup_forces: if structure.get_force_constants() is not None: phonon.set_force_constants(structure.get_force_constants().get_array()) elif structure.get_force_sets() is not None: phonon.set_displacement_dataset(structure.get_force_sets().get_dict()) phonon.produce_force_constants() structure.set_force_constants(ForceConstants(phonon.get_force_constants(), supercell=structure.get_force_sets().get_supercell())) else: print('No force sets/constants available!') exit() if NAC: print("Warning: Using Non Analytical Corrections") primitive = phonon.get_primitive() nac_params = parse_BORN(primitive, is_symmetry=True) phonon.set_nac_params(nac_params=nac_params) return phonon