def test_af_conductivity_without_antiresonant_gauss(phonons): cond = Conductivity(phonons=phonons, method='qhgk', storage='memory') cond.diffusivity_shape = 'gauss' cond.diffusivity_bandwidth = phonons.bandwidth.reshape( (phonons.n_k_points, phonons.n_modes)) cond = (cond.conductivity.sum(axis=0).diagonal().mean()) np.testing.assert_approx_equal(cond, 0.8305, significant=3)
def test_diffusivity_large_threshold(phonons): cond = Conductivity(phonons=phonons, method='qhgk', storage='memory') cond.diffusivity_threshold = 20 cond.diffusivity_bandwidth = phonons.bandwidth.reshape( (phonons.n_k_points, phonons.n_modes)) cond.conductivity np.testing.assert_array_almost_equal(cond.diffusivity.flatten().real[:10], calculated_diffusivities_full, decimal=3)
def phononics(ge_concentration='0'): # Set up Forceconstants Object folder_string = 'structures/1728_atom/aSiGe_C' + ge_concentration + '/' atoms = read(folder_string + 'replicated_atoms.xyz', format='xyz') forceconstants = ForceConstants(atoms=atoms, folder=folder_string + '/ald') # Calculate the 2nd + 3rd Forceconstant matrices lammps_inputs = { 'lmpcmds': [ "pair_style tersoff", "pair_coeff * * forcefields/SiCGe.tersoff Si(D) Ge" ], "log_file": "min.log", "keep_alive": True } calc = LAMMPSlib(**lammps_inputs) second = forceconstants.second second.load(folder=folder_string + '/ald') print('Third') # second.calculate(calculator=calc) third = forceconstants.third third.calculate(calculator=calc, is_verbose=True) # Create Phonon Object phonons = Phonons( forceconstants=forceconstants, is_classic=False, # quantum stats temperature=300, # 300 K folder=folder_string, third_bandwidth=0.5 / 4.135, # 0.5 eV smearing broadening_shape='gauss') # shape of smearing # Phononic Data ## These save files to help us look at phononic properties ## with our plotter (4_plotting.py). These properties are "lazy" which ## means they won't be calculated unless explicitly called, or required ## by another calculation. np.save('frequency', phonons.frequency) np.save('bandwidth', phonons.bandwidth) np.save('diffusivity', phonons.diffusivity) #np.save('participation', phonons.participation_ratio) # Conductivity Object # This will print out the total conductivity and save the contribution per mode conductivity = Conductivity(phonons=phonons, method='qhgk').conductivity np.save('conductivity', 1 / 3 * np.einsum('iaa->i', conductivity)) print("Thermal Conductivity (W/m/K): %.3f" % conductivity.sum(axis=0).diagonal().mean())
def test_inverse_conductivity(phonons): cond = np.abs( np.mean( Conductivity( phonons=phonons, method='inverse', storage='memory').conductivity.sum(axis=0).diagonal())) np.testing.assert_approx_equal(cond, 256, significant=3)
def test_detailed_balance(phonons): cond = Conductivity(phonons=phonons, method='inverse', storage='memory').conductivity.sum(axis=0) cond_ref = np.array([[531.17210271, 2.04926525, -2.42778198], [2.04926665, 530.92668135, -3.18903786], [-2.4277473, -3.18902935, 537.86321364]]) np.testing.assert_array_almost_equal(cond, cond_ref, decimal=3)
def test_inverse_finite_size_conductivity_ms(phonons): cond_ms = np.abs( Conductivity(phonons=phonons, method='inverse', storage='memory', length=(1e4, 0, 0), finite_length_method='ms').conductivity.sum(axis=0)[0, 0]) np.testing.assert_approx_equal(cond_ms, 180.718, significant=3)
def test_inverse_finite_size_conductivity_caltech(phonons): cond_c = np.abs( Conductivity( phonons=phonons, method='inverse', storage='memory', length=(1e4, 0, 0), finite_length_method='caltech').conductivity.sum(axis=0)[0, 0]) np.testing.assert_approx_equal(cond_c, 162.985, significant=3)
def test_rta_finite_size_conductivity_matthiessen(phonons): cond_m = np.abs( Conductivity( phonons=phonons, method='rta', storage='memory', length=(1e4, 0, 0), finite_length_method='matthiessen').conductivity.sum(axis=0)[0, 0]) np.testing.assert_approx_equal(cond_m, 187.157, significant=3)
def test_sc_conductivity(phonons): cond = np.abs( np.mean( Conductivity( phonons=phonons, method='sc', max_n_iterations=71, storage='memory').conductivity.sum(axis=0).diagonal())) np.testing.assert_approx_equal(cond, 255, significant=3)
def test_af_conductivity_300(phonons): phonons.temperature = 300 cond = Conductivity(phonons=phonons, method='qhgk', storage='memory', diffusivity_bandwidth=0.025).conductivity.sum( axis=0).diagonal().mean() expected_cond = 0.532 np.testing.assert_approx_equal(cond, expected_cond, significant=2)
def test_sc_finite_size_conductivity_ms(phonons): cond_ms = np.abs( Conductivity(phonons=phonons, method='sc', max_n_iterations=71, storage='memory', length=(1e4, 0, 0), finite_length_method='ms').conductivity.sum(axis=0)[0, 0]) np.testing.assert_approx_equal(cond_ms, 185.96, significant=3)
temperature = 300 # Create a phonon object phonons = Phonons(forceconstants=forceconstants, kpts=kpts, is_classic=False, temperature=temperature, is_nw=True, folder='ALD_CNT', storage='numpy') # Compute conductivity from direct inversion of # scattering matrix for infinite size samples # 29.92 is the rescale factor between # the volume of the simulation box and the # volume of the 10,0 Carbon Nanotube inverse_conductivity = Conductivity(phonons=phonons, method='inverse').conductivity inverse_conductivity_matrix = inverse_conductivity.sum(axis=0) print('Infinite size conductivity from inversion (W/m-K): %.3f' % (29.92 * inverse_conductivity_matrix[2, 2])) # Config finite size conductivity from direct inversion of scattering matrix # Specific finite size length, in angstrom, # along the direction of transport (z-axis) # finite_length_method ='ms' for the Mckelvey-Schockley method finite_size_conductivity_config = { 'method': 'inverse', 'length': (0, 0, 1000000000), 'finite_length_method': 'ms', 'storage': 'numpy' } finite_size_inverse_conductivity = Conductivity(
} forceconstants = ForceConstants(atoms=atoms, supercell=supercell, folder='forceconstant') forceconstants.second.calculate(calculator=LAMMPSlib(**lammps_inputs)) forceconstants.third.calculate(calculator=LAMMPSlib(**lammps_inputs)) n_replicas = np.prod(supercell) kpts = [5, 5, 5] temperature = 300 # # Create a phonon object phonons = Phonons(forceconstants=forceconstants, kpts=kpts, is_classic=is_classic, temperature=temperature, folder='ald_out') plotter.plot_dispersion(phonons) print('Inverse conductivity in W/m/K') print(Conductivity(phonons=phonons, method='inverse').conductivity.sum(axis=0)) print('RTA conductivity in W/m/K') print(Conductivity(phonons=phonons, method='rta').conductivity.sum(axis=0)) plotter.plot_dos(phonons) plotter.plot_vs_frequency(phonons, phonons.heat_capacity, 'cv') plotter.plot_vs_frequency(phonons, phonons.bandwidth, 'gamma_THz') plotter.plot_vs_frequency(phonons, phonons.phase_space, 'phase_space')
# Set up phonon object by passing in configuration details and the force constants object computed above phonons = Phonons(forceconstants=forceconstants, **phonons_config) ### Set up the Conductivity object and thermal conductivity calculations #### # Compute thermal conductivity (t.c.) by solving Boltzmann Transport # Equation (BTE) with various of methods # 'phonons': phonon object obtained from the above calculations # 'method': specify methods to solve for BTE # ('rta' for RTA,'sc' for self-consistent and 'inverse' for direct inversion of the scattering matrix) print('\n') inv_cond_matrix = (Conductivity(phonons=phonons, method='inverse', storage='formatted').conductivity.sum(axis=0)) print('Conductivity from inversion (W/m-K): %.3f' % (np.mean(np.diag(inv_cond_matrix)))) print(inv_cond_matrix) print('\n') sc_cond_matrix = Conductivity(phonons=phonons, method='sc', n_iterations=20, storage='formatted').conductivity.sum(axis=0) print('Conductivity from self-consistent (W/m-K): %.3f' % (np.mean(np.diag(sc_cond_matrix)))) print(sc_cond_matrix) print('\n')
} # Set up phonon object by passing in configuration details and the forceconstants object computed above phonons = Phonons(forceconstants=forceconstants, **phonons_config) ### Set up the Conductivity object and thermal conductivity calculations #### # Compute thermal conductivity (t.c.) by solving Boltzmann Transport # Equation (BTE) with various of methods # 'phonons': phonon object obtained from the above calculations # 'method': specify methods to solve for BTE # ('rta' for Relaxiation Time Approxmiation (RTA)) print('\n') rta_cond_matrix = Conductivity(phonons=phonons, method='rta').conductivity.sum(axis=0) print('Conductivity from RTA (W/m-K): %.3f' % (np.mean(np.diag(rta_cond_matrix)))) print(rta_cond_matrix) # Define the base folder to contain plots # 'base_folder':name of the base folder folder = get_folder_from_label(phonons, base_folder='plots') if not os.path.exists(folder): os.makedirs(folder) # Define a Boolean flag to specify if figure window pops during simulation is_show_fig = False # Plot cumulative conductivity from RTA method rta_full_cond = Conductivity(phonons=phonons, method='rta').conductivity
plt.show() ### Set up the Conductivity object and thermal conductivity calculations #### # Compute thermal conductivity (t.c.) by solving Boltzmann Transport # Equation (BTE) with various of methods. # 'phonons': phonon object obtained from the above calculations # 'method': specify methods to solve for BTE # ('rta' for RTA,'sc' for self-consistent and 'inverse' for direct inversion of the scattering matrix) # 'storage': Format to storage conductivity and mean free path data ('formatted' for ASCII format data, 'numpy' # for python numpy array and 'memory' for quick calculations, no data stored) print('\n') inv_cond_matrix = (Conductivity(phonons=phonons, method='inverse', storage='memory').conductivity.sum(axis=0)) print('Inverse conductivity (W/m-K): %.3f' % (np.mean(np.diag(inv_cond_matrix)))) print(inv_cond_matrix) print('\n') sc_cond_matrix = Conductivity(phonons=phonons, method='sc', n_iterations=20, storage='memory').conductivity.sum(axis=0) print('Self-consistent conductivity (W/m-K): %.3f' % (np.mean(np.diag(sc_cond_matrix)))) print(sc_cond_matrix) print('\n')
k = 5 # Config phonon object phonons_config = { 'kpts': [k, k, k], 'is_classic': False, 'temperature': 300, 'folder': 'ald_si_hiphive', 'is_tf_backend': False, 'storage': 'numpy' } phonons = Phonons(forceconstants=forceconstants, **phonons_config) # Compute thermal conductivity with various methods print('\n') rta_cond_matrix = Conductivity(phonons=phonons, method='rta').conductivity.sum(axis=0) print('Rta conductivity (W/mK): %.3f' % (np.mean(np.diag(rta_cond_matrix)))) print(rta_cond_matrix) print('\n') sc_cond_matrix = Conductivity(phonons=phonons, method='sc', n_iterations=20).conductivity.sum(axis=0) print('Self-consistent conductivity (W/mK): %.3f' % (np.mean(np.diag(sc_cond_matrix)))) print(sc_cond_matrix) print('\n') qhgk_cond_matrix = Conductivity(phonons=phonons, method='qhgk').conductivity.sum(axis=0) print('Qhgk conductivity (W/mK): %.3f' % (-1 * np.mean(np.diag(qhgk_cond_matrix))))
supercell = np.array([3, 3, 3]) # forceconstants = ForceConstants.import_from_dlpoly_folder('si-dlpoly', supercell) forceconstants = ForceConstants.from_folder('structures', supercell=supercell, format='lammps') k = 5 kpts = [k, k, k] is_classic = False temperature = 300 # # Create a phonon object phonons = Phonons(forceconstants=forceconstants, kpts=kpts, is_classic=is_classic, temperature=temperature) print('AF conductivity') print(Conductivity(phonons=phonons, method='qhgk').conductivity.sum(axis=0)) plt.scatter(phonons.frequency.flatten()[3:], phonons.bandwidth.flatten()[3:], s=5) plt.ylabel('gamma_THz', fontsize=16, fontweight='bold') plt.xlabel("$\\nu$ (Thz)", fontsize=16, fontweight='bold') plt.show() plt.scatter(phonons.frequency.flatten()[3:], phonons.phase_space.flatten()[3:], s=5) plt.ylabel('ps', fontsize=16, fontweight='bold') plt.xlabel("$\\nu$ (Thz)", fontsize=16, fontweight='bold') plt.show()
# -- Compare phonon life times at different level of theory -- # # The following shows a comparison of phonon life times # computed using Relaxation Time Approximation (RTA) and at direct inversion # of scattering matrix (inverse) methods. # 'n_phonons': number of phonons in the simulation # 'band_width': phonon bandwdith (THz) computed from diagonal elements # of scattering matrix band_width = phonons.bandwidth.flatten(order='C') tau_RTA = (band_width[3:]) ** (-1) # Compute life times from direct inversion by dividing # the mean free path from inversion by the group velocities velocity = phonons.velocity.real.reshape((phonons.n_phonons, 3)) mean_free_path_inversion = Conductivity(phonons=phonons, method='inverse', storage='numpy').mean_free_path tau_inversion = np.zeros_like(mean_free_path_inversion) for alpha in range(3): for mu in range(len(velocity)): if velocity[mu, alpha] != 0: tau_inversion[mu, alpha] = np.abs(np.divide(mean_free_path_inversion[mu, alpha], velocity[mu, alpha])) else: # phonon life times remain zero at zero group velocities tau_inversion[mu, alpha] = 0 plt.figure() plt.plot(frequency[3:], tau_inversion[3:, 0], 'r.', label=r'$\tau_{inv,x}$') plt.plot(frequency[3:], tau_inversion[3:, 1], 'b.', label=r'$\tau_{inv,y}$') plt.plot(frequency[3:], tau_inversion[3:, 2], 'k.', label=r'$\tau_{inv,z}$')
from kaldo.controllers import plotter from kaldo.forceconstants import ForceConstants from kaldo.conductivity import Conductivity from kaldo.phonons import Phonons fold = 'ald' kpts = [5, 5, 5] supercell = [5, 5, 5] temperature = 300 folder = 'fc' forceconstant = ForceConstants.from_folder(folder=folder, supercell=[5, 5, 5], format='shengbte-qe') for k in [5]: kpts = [k, k, k] phonons = Phonons(forceconstants=forceconstant, kpts=kpts, is_classic=False, temperature=300, folder='ald', is_tf_backend=True, grid_type='C') print('Inverse conductivity W/m/K') print( Conductivity(phonons=phonons, method='inverse', storage='memory').conductivity.sum(axis=0))
# 'folder': name of folder containing phonon property and thermal conductivity calculations # 'storage': Format to storage phonon properties ('formatted' for ASCII format data, 'numpy' # for python numpy array and 'memory' for quick calculations, no data stored) phonons_config = {'is_classic': False, 'temperature': 300, #'temperature'=300K 'folder': 'ALD_aSi512', 'third_bandwidth':0.5/4.135, # 0.5 eV is used here. 'broadening_shape':'triangle', 'storage': 'numpy'} # Set up phonon object by passing in configuration details and the forceconstants object computed above phonons = Phonons(forceconstants=forceconstants, **phonons_config) ### Set up the Conductivity object and thermal conductivity calculations #### # Compute thermal conductivity (t.c.) by solving Boltzmann Transport # Equation (BTE) with various of methods # 'phonons': phonon object obtained from the above calculations # 'method': specify methods to solve for BTE # ('qhgk' for Quasi-Harmonic Green Kubo (QHGK)) # 'storage': Format to storage phonon properties ('formatted' for ASCII format data, 'numpy' # for python numpy array and 'memory' for quick calculations, no data stored) print('\n') qhgk_cond = Conductivity(phonons=phonons, method='qhgk', storage='numpy') qhgk_cond.diffusivity_bandwidth = phonons.bandwidth print('Conductivity from QHGK (W/m-K): %.3f' % (np.mean(np.diag(qhgk_cond.conductivity.sum(axis=0))))) print(qhgk_cond.conductivity.sum(axis=0))
def test_qhgk_conductivity(phonons): cond = Conductivity(phonons=phonons, method='qhgk', storage='memory').conductivity.sum(axis=0) cond = np.abs(np.mean(cond.diagonal())) np.testing.assert_approx_equal(cond, 0.996, significant=2)