def get_frequencies(self): if self._frequencies is None: print("Getting frequencies & eigenvectors from Phonopy") self._eigenvectors, self._frequencies = ( pho_interface.obtain_eigenvectors_from_phonopy(self.dynamic.structure, self.parameters.reduced_q_vector, NAC=self.parameters.use_NAC)) return self._frequencies
def generate_test_trajectory(structure, reduced_q_vector, super_cell=(4,4,4)): print('Generating ideal harmonic data for testing') kb_boltzmann = 0.831446 # u * A^2 / ( ps^2 * K ) #Getting data from file instead of calculating (has to be the same object type generated by this function) if False: dump_file = open( "trajectory.save", "r" ) trajectory = pickle.load(dump_file) return trajectory number_of_atoms = structure.get_number_of_cell_atoms() number_of_primitive_atoms = structure.get_number_of_primitive_atoms() positions = structure.get_positions(super_cell=super_cell) masses = structure.get_masses(super_cell=super_cell) #Parameters used to generate harmonic trajectory total_time = 2 time_step = 0.002 amplitude = 7.0 temperature = 1200 # print('Freq Num',number_of_frequencies) for i in range(structure.get_number_of_dimensions()): number_of_atoms *= super_cell[i] # print('At Num',number_of_atoms) number_of_primitive_cells = number_of_atoms/number_of_primitive_atoms atom_type = structure.get_atom_type_index(super_cell=super_cell) # print('At type',atom_type) #print(structure.get_atomic_types(super_cell=super_cell)) #Generate an xyz file for checking xyz_file = open('test.xyz','w') #Generate additional random wave vectors sample for further testing number_of_additional_wave_vectors = 0 q_vector_list=np.random.random([number_of_additional_wave_vectors, 3]) q_vector_list=np.concatenate((q_vector_list, [reduced_q_vector]),axis=0) print('test wave vectors') print(q_vector_list) #Generate frequencies and eigenvectors for the testing wave vector samples eigenvectors_r = [] frequencies_r = [] for i in range(len(q_vector_list)): print(q_vector_list[i]) eigenvectors, frequencies = pho_interface.obtain_eigenvectors_from_phonopy(structure, q_vector_list[i]) eigenvectors_r.append(eigenvectors) frequencies_r.append(frequencies) number_of_frequencies = len(frequencies_r[0]) print('obtained frequencies') print(frequencies_r) print(np.pi*2.0*np.linalg.inv(structure.get_primitive_cell()).T) #Generating trajectory trajectory = [] for time in np.arange(total_time,step=time_step): print(time) xyz_file.write(str(number_of_atoms) + '\n\n') coordinates = [] for i_atom in range(number_of_atoms): # coordinate = map(complex,positions[i_atom]) coordinate = np.array(positions[i_atom,:], dtype=complex) for i_freq in range(number_of_frequencies): for i_long in range(q_vector_list.shape[0]): q_vector = np.dot(q_vector_list[i_long,:], 2*np.pi*np.linalg.inv(structure.get_primitive_cell())) # Beware in the testing amplitude!! Normalized for all phonons to have the same height!! if abs(frequencies_r[i_long][i_freq]) > 0.01: #Prevent dividing by 0 amplitude = 2 * np.sqrt(kb_boltzmann * temperature / (pow(frequencies_r[i_long][i_freq] * 2 * np.pi,2)) / number_of_primitive_cells) + random.uniform(-1,1)*0.05 # normal_mode_coordinate = 1/(2*np.pi*frequencies_r[i_long][i_freq]) *amplitude * np.exp(np.complex(0, -1) * frequencies_r[i_long][i_freq] * 2.0 * np.pi * time) normal_mode_coordinate = amplitude * np.exp(np.complex(0, -1) * frequencies_r[i_long][i_freq] * 2.0 * np.pi * time) phase = np.exp(np.complex(0, 1) * np.dot(q_vector, positions[i_atom, :])) coordinate += (1.0 / np.sqrt(masses[i_atom]) * eigenvectors_r[i_long][i_freq, atom_type[i_atom]] * phase * normal_mode_coordinate) coordinate = coordinate.real xyz_file.write(structure.get_atomic_types(super_cell=super_cell)[i_atom]+'\t' + '\t'.join([str(item) for item in coordinate.real]) + '\n') coordinates.append(coordinate) trajectory.append(coordinates) xyz_file.close() trajectory = np.array(trajectory) print(trajectory.shape[0]) time = np.array([ i*time_step for i in range(trajectory.shape[0])],dtype=float) energy = np.array([ 0*i for i in range(trajectory.shape[0])],dtype=float) #Save a trajectory object to file for later recovery dump_file = open("trajectory.save", "w") pickle.dump(dyn.Dynamics(structure=structure, trajectory=np.array(trajectory, dtype=complex), energy=np.array(energy), time=time, super_cell=np.dot(np.diagflat(super_cell),structure.get_cell())), dump_file) dump_file.close() print(np.dot(np.diagflat(super_cell),structure.get_cell())) return dyn.Dynamics(structure=structure, trajectory=np.array(trajectory,dtype=complex), energy=np.array(energy), time=time, super_cell=np.dot(np.diagflat(super_cell),structure.get_cell()))