Esempio n. 1
0
 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
Esempio n. 2
0
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()))