1
- __version__ = '1.11 '
1
+ __version__ = '1.12 '
2
2
3
3
4
4
import numpy as np
15
15
import dynaphopy .analysis .coordinates as trajdist
16
16
import dynaphopy .analysis .thermal_properties as thm
17
17
18
+ from scipy import integrate
19
+
18
20
power_spectrum_functions = {
19
21
0 : [power_spectrum .get_fourier_spectra_par_openmp , 'Fourier transform' ],
20
22
1 : [power_spectrum .get_mem_spectra_par_openmp , 'Maximum entropy method' ],
@@ -282,7 +284,7 @@ def get_vc(self):
282
284
283
285
def get_vq (self ):
284
286
if self ._vq is None :
285
- print ("Projecting into phonon" )
287
+ print ("Projecting into phonon mode " )
286
288
self ._vq = projection .project_onto_phonon (self .get_vc (),self .get_eigenvectors ())
287
289
return self ._vq
288
290
@@ -318,9 +320,9 @@ def plot_vc(self,atoms=None,coordinates=None):
318
320
plt .legend ()
319
321
plt .show ()
320
322
321
- def save_vc (self ,file_name ):
323
+ def save_vc (self ,file_name , atom = 0 ):
322
324
print ("Saving wave vector projection to file" )
323
- np .savetxt (file_name , self .get_vc ()[:, 0 , :].real )
325
+ np .savetxt (file_name , self .get_vc ()[:, atom , :].real )
324
326
325
327
def save_vq (self ,file_name ):
326
328
print ("Saving phonon projection to file" )
@@ -355,8 +357,8 @@ def get_power_spectrum_phonon(self):
355
357
self .dynamic ,
356
358
self .parameters ))
357
359
360
+ self .set_reduced_q_vector (initial_reduced_q_point )
358
361
self ._power_spectrum_phonon = np .average (power_spectrum_phonon , axis = 0 )
359
- self .parameters .reduced_q_vector = initial_reduced_q_point
360
362
else :
361
363
self ._power_spectrum_phonon = (
362
364
power_spectrum_functions [self .parameters .power_spectra_algorithm ])[0 ](self .get_vq (),
@@ -383,8 +385,9 @@ def get_power_spectrum_wave_vector(self):
383
385
self .parameters ))
384
386
385
387
power_spectrum_wave_vector = np .array (power_spectrum_wave_vector )
388
+ self .set_reduced_q_vector (initial_reduced_q_point )
386
389
self ._power_spectrum_wave_vector = np .average (power_spectrum_wave_vector , axis = 0 )
387
- self . parameters . reduced_q_vector = initial_reduced_q_point
390
+
388
391
else :
389
392
self ._power_spectrum_wave_vector = (
390
393
power_spectrum_functions [self .parameters .power_spectra_algorithm ])[0 ](self .get_vc ().swapaxes (1 , 2 ).reshape (- 1 , size ),
@@ -439,21 +442,26 @@ def phonon_individual_analysis(self):
439
442
440
443
def plot_power_spectrum_full (self ):
441
444
442
- phonopy_dos = pho_interface .obtain_phonopy_dos (self .dynamic .structure ,
443
- mesh = self .parameters .mesh_phonopy ,
444
- freq_min = self .get_frequency_range ()[0 ],
445
- freq_max = self .get_frequency_range ()[- 1 ],
446
- projected_on_atom = self .parameters .project_on_atom )
445
+ print (self .dynamic .structure .get_force_constants ())
447
446
448
447
fig , ax1 = plt .subplots ()
449
448
450
449
ax1 .plot (self .get_frequency_range (), self .get_power_spectrum_direct (), 'r-' , label = 'Power spectrum (MD)' )
451
450
ax1 .set_xlabel ('Frequency [THz]' )
452
451
ax1 .set_ylabel ('eV * ps' )
453
-
454
452
ax2 = ax1 .twinx ()
455
- ax2 .plot (phonopy_dos [0 ], phonopy_dos [1 ],'b-' ,label = 'DoS (Lattice dynamics)' )
456
- ax2 .set_ylabel ('Density of states' )
453
+
454
+ if self .dynamic .structure .forces_available ():
455
+ phonopy_dos = pho_interface .obtain_phonopy_dos (self .dynamic .structure ,
456
+ mesh = self .parameters .mesh_phonopy ,
457
+ freq_min = self .get_frequency_range ()[0 ],
458
+ freq_max = self .get_frequency_range ()[- 1 ],
459
+ projected_on_atom = self .parameters .project_on_atom )
460
+
461
+
462
+
463
+ ax2 .plot (phonopy_dos [0 ], phonopy_dos [1 ],'b-' ,label = 'DoS (Lattice dynamics)' )
464
+ ax2 .set_ylabel ('Density of states' )
457
465
458
466
if self ._renormalized_force_constants is not None :
459
467
phonopy_dos_r = pho_interface .obtain_phonopy_dos (self .dynamic .structure ,
@@ -475,7 +483,7 @@ def plot_power_spectrum_full(self):
475
483
# plt.legend()
476
484
plt .show ()
477
485
478
- total_integral = np . trapz (self .get_power_spectrum_direct (), x = self .get_frequency_range ())/ (2 * np .pi )
486
+ total_integral = integrate . simps (self .get_power_spectrum_direct (), x = self .get_frequency_range ())/ (2 * np .pi )
479
487
print ("Total Area (1/2 Kinetic energy <K>): {0} eV" .format (total_integral ))
480
488
481
489
def plot_power_spectrum_wave_vector (self ):
@@ -484,7 +492,7 @@ def plot_power_spectrum_wave_vector(self):
484
492
plt .xlabel ('Frequency [THz]' )
485
493
plt .ylabel ('eV * ps' )
486
494
plt .show ()
487
- total_integral = np . trapz (self .get_power_spectrum_wave_vector (), x = self .get_frequency_range ())/ (2 * np .pi )
495
+ total_integral = integrate . simps (self .get_power_spectrum_wave_vector (), x = self .get_frequency_range ())/ (2 * np .pi )
488
496
print ("Total Area (1/2 Kinetic energy <K>): {0} eV" .format (total_integral ))
489
497
490
498
@@ -571,14 +579,14 @@ def write_power_spectrum_full(self, file_name):
571
579
reading .write_correlation_to_file (self .get_frequency_range (),
572
580
self .get_power_spectrum_direct ()[None ].T ,
573
581
file_name )
574
- total_integral = np . trapz (self .get_power_spectrum_direct (), x = self .get_frequency_range ())/ (2 * np .pi )
582
+ total_integral = integrate . simps (self .get_power_spectrum_direct (), x = self .get_frequency_range ())/ (2 * np .pi )
575
583
print ("Total Area (1/2 Kinetic energy <K>): {0} eV" .format (total_integral ))
576
584
577
585
def write_power_spectrum_wave_vector (self , file_name ):
578
586
reading .write_correlation_to_file (self .get_frequency_range (),
579
587
self .get_power_spectrum_wave_vector ()[None ].T ,
580
588
file_name )
581
- total_integral = np . trapz (self .get_power_spectrum_wave_vector (), x = self .get_frequency_range ())/ (2 * np .pi )
589
+ total_integral = integrate . simps (self .get_power_spectrum_wave_vector (), x = self .get_frequency_range ())/ (2 * np .pi )
582
590
print ("Total Area (1/2 Kinetic energy <K>): {0} eV" .format (total_integral ))
583
591
584
592
def write_power_spectrum_phonon (self ,file_name ):
@@ -755,7 +763,7 @@ def display_thermal_properties(self, from_power_spectrum=False, normalize_dos=Fa
755
763
free_energy = thm .get_free_energy (temperature , phonopy_dos [0 ], phonopy_dos [1 ])
756
764
entropy = thm .get_entropy (temperature , phonopy_dos [0 ], phonopy_dos [1 ])
757
765
c_v = thm .get_cv (temperature , phonopy_dos [0 ], phonopy_dos [1 ])
758
- integration = np . trapz (phonopy_dos [1 ], x = phonopy_dos [0 ])/ (self .dynamic .structure .get_number_of_atoms ()*
766
+ integration = integrate . simps (phonopy_dos [1 ], x = phonopy_dos [0 ])/ (self .dynamic .structure .get_number_of_atoms ()*
759
767
self .dynamic .structure .get_number_of_dimensions ())
760
768
total_energy = thm .get_total_energy (temperature , phonopy_dos [0 ], phonopy_dos [1 ])
761
769
@@ -769,7 +777,7 @@ def display_thermal_properties(self, from_power_spectrum=False, normalize_dos=Fa
769
777
total_energy = thm .get_total_energy (temperature , phonopy_dos_r [0 ], phonopy_dos_r [1 ]) + \
770
778
thm .get_free_energy_correction_dos (temperature , phonopy_dos [0 ], phonopy_dos [1 ], phonopy_dos_r [1 ])
771
779
772
- integration = np . trapz (phonopy_dos_r [1 ], x = phonopy_dos_r [0 ])/ (self .dynamic .structure .get_number_of_atoms ()*
780
+ integration = integrate . simps (phonopy_dos_r [1 ], x = phonopy_dos_r [0 ])/ (self .dynamic .structure .get_number_of_atoms ()*
773
781
self .dynamic .structure .get_number_of_dimensions ())
774
782
renormalized_properties = [free_energy , entropy , c_v , total_energy , integration ]
775
783
print ('Free energy/total energy correction: {0:12.4f} KJ/mol' .format (thm .get_free_energy_correction_dos (temperature , phonopy_dos [0 ], phonopy_dos [1 ], phonopy_dos_r [1 ])))
@@ -778,7 +786,7 @@ def display_thermal_properties(self, from_power_spectrum=False, normalize_dos=Fa
778
786
normalization = np .prod (self .dynamic .get_super_cell_matrix ())
779
787
780
788
power_spectrum_dos = thm .get_dos (temperature , frequency_range , self .get_power_spectrum_direct (), normalization )
781
- integration = np . trapz (power_spectrum_dos , x = frequency_range )/ (self .dynamic .structure .get_number_of_atoms ()*
789
+ integration = integrate . simps (power_spectrum_dos , x = frequency_range )/ (self .dynamic .structure .get_number_of_atoms ()*
782
790
self .dynamic .structure .get_number_of_dimensions ())
783
791
784
792
if normalize_dos :
@@ -823,7 +831,7 @@ def display_thermal_properties(self, from_power_spectrum=False, normalize_dos=Fa
823
831
plt .plot (phonopy_dos [0 ], phonopy_dos [1 ], 'b-' , label = 'Harmonic' )
824
832
plt .plot (phonopy_dos_r [0 ], phonopy_dos_r [1 ], 'g-' , label = 'Renormalized' )
825
833
826
- plt .title ('Density of states' )
834
+ plt .title ('Density of states (Normalized to unit cell) ' )
827
835
plt .xlabel ('Frequency [THz]' )
828
836
plt .ylabel ('Density of states' )
829
837
plt .legend ()
0 commit comments