fc_and_freq_selected_atoms_02112024
esta.phonon.fc_and_freq_selected_atoms_02112024
¶
get_forces_dict(atommove)
¶
get forces fron qe output files with + and - displacements and store them in dictionary with indices indication atoms moving index, atom shift index, and displacemet(+ or -)
get_forces_dict_parta(atommove)
¶
get forces fron qe output files with + and - displacements and store them in dictionary with indices indication atoms moving index, atom shift index, and displacemet(+ or -)
get_idatm_iddir_iddispl(atommove)
¶
get a list of 'idatm-iddir-iddispl' idatm: atom id iddir : atom move direction index iddispl: + or - shift of atoms
atom_direction_shift ==> id atom, id direction, id shift
get_forces_minus(atommove, forces_dict, atom_direction_shift)
¶
extract forces from forces_dict for minus (id=0) displacement
Returns:
fc0: array forces for -ve (id=0) direction
get_forces_plus(atommove, forces_dict, atom_direction_shift)
¶
extract forces from forces_dict for plus (id=1) displacement
Returns:
fc1: array forces for +ve (id=1) direction
get_forces_central(force_c0, force_c1)
¶
Note: difference of force4 +ve disp and force4 -ve disp, and then divide to get the average
sum of forces cannot be taken because that way you are cancelling the forces bcz one force is almost equal but negative of other
get_forceconstant_matrix(atommove, forces, deltax, sign_deltax='plus')
¶
sign_deltax has impact on the values of force-constant: values are reflection of each other therefore choose plus or minus after checking the magnitude of force-constant matrix **after checking: plus MUST be the default value **
get_symmetrized_force_constant_matrix(fcMatrx, atommove)
¶
symmetrize force constant matrix fc(iat, ia, jat, ja)
return (fc(iat, ia, jat, ja) + fc(jat, ja, iat, ia))/2 ??? ia and ja .. no need to change; on;y atom indices??? ONLY ATOMS INDICES MUST BE FLIPPED ... CHECK FOR THE 1 MOLECULE CASE .. GOOD*** 02102024
get_asr(fcMatrix, atommove)
¶
apply accoustic sum rule on the force constant matrix
see Xavier gonze PRB paper:
XAVIER GONZE AND CHANGYOL LEE PHYSICAL REVIEW B VOLUME 55, NUMBER 16 15 APRIL 1997-I
specifically see equations: 44 and 45.. good luck ..read whole paper..sk!!
WARNING: asr is applied only on the part of the force constant matrix defined by the list of moving atoms .. is it ok? .. sk!
write_forces(force_row, ldisp)
¶
may be you need to add ... atoms parameter in the call ..
write forces rows to a file NOTE: only for - and + displacement
todo : for writing central diff force constant .. no need of ldisp tag
get_sqrt_mass_array(label)
¶
for given atomic symbols, return correspoinding masses in amu
get_dynamical_matrix(atommove, sqrt_mass_array, forceconstant)
¶
getting dynamical matrix from force constant matrix at q=0 point
NOTE: for q=0
1. dynmat = fc matric/ sqrt(mass1)/ sqrt(mass2)
2. dynmat in q space = dynmat in R space; see equation 7 in
paper of Ab initio calculation of phonon dispersions in semiconductors
prb. Paolo Giannozzi et al. 1991
reshape_dyn(dynmatrix, atommove)
¶
reshape dynamical matrix
get_eigen(dynamatical_matrix)
¶
dynamical matrix is hermitian matrix .. try taking it Hermitian matrix instead of general matrix
input:
array: array of rank 2 of shape (3*natoms, 3*natoms)
output:
array: 1d array of size 3natoms; it is eigen value
array: 2d array of shape (natoms, 3natoms); it is eigen
vector for each eigval
..note: the eigen vector from the diagonalization oof the Dynamical matrix is different from the eigen displacement. eigen-displacement of atm k (real displacement of atoms)= eign vector / sqrt(mass of atm k)
get_eigen_(dynamatical_matrix)
¶
dynamical matrix is hermitian matrix .. try taking it Hermitian matrix instead of general matrix
input:
array: array of rank 2 of shape (3*natoms, 3*natoms)
output:
array: 1d array of size 3natoms; it is eigen value
array: 2d array of shape (natoms, 3natoms); it is eigen
vector for each eigval
..note: the eigen vector from the diagonalization oof the Dynamical matrix is different from the eigen displacement. eigen-displacement of atm k (real displacement of atoms)= eign vector / sqrt(mass of atm k)