示例#1
0
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)
示例#2
0
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)
示例#3
0
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())
示例#4
0
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)
示例#5
0
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)
示例#7
0
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)
示例#8
0
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)
示例#9
0
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(
示例#13
0
}

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')
示例#14
0
# 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
示例#16
0
    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')
示例#17
0
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))))
示例#18
0
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()
示例#19
0
# -- 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}$')
示例#20
0
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))
示例#21
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))
示例#22
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)