├── .gitignore ├── electron_phonon.py ├── environment.py ├── gf.py ├── gf_numba.py ├── gf_sparse.py ├── phonon-transport.py └── two_lead ├── 1d-kappa.ipynb ├── one_atom_line.py ├── phonon_GF.py ├── random_line.py ├── skeleton-parrallel.py ├── skeleton.py └── two_atom_line.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.db 3 | *.npy 4 | .* 5 | *.jugdata/* 6 | *.dot 7 | *.stats -------------------------------------------------------------------------------- /electron_phonon.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | from gf_sparse import Lead, Coupling, System 3 | import datetime 4 | start_time = datetime.datetime.now() 5 | 6 | #ele-phonon coupling 7 | ''' 8 | N = 10 9 | lam = 0.5 10 | t = 1 11 | t0 = 0.2 12 | couplings = [] 13 | D = {'on_site': [], 'couple': []} 14 | for i in range(N): 15 | for j in range(2): 16 | couplings.append(Coupling(Lead(matrix([i]), matrix([-t]), matrix([i])), i, matrix([-t0]))) 17 | D['on_site'].append(matrix([i])) 18 | if i == 0: 19 | continue 20 | D['couple'].append(matrix([sqrt(i)*lam])) 21 | T = [] 22 | E_range = linspace(-2, 2, 1000) 23 | for E in E_range: 24 | system = System(D, couplings, E, 1) 25 | system.cal_diag_gf() 26 | [system.cal_T(0, i) for i in [1, 3, 5, 7, 9, 11, 13, 15]] 27 | T.append(sum(system.T[0, i] for i in [1, 3, 5, 7, 9, 11, 13, 15])) 28 | plt.plot(E_range, T) 29 | plt.show() 30 | ''' 31 | #ele-phonon coupling, using matrix 32 | ''' 33 | lam = 0.5 34 | t = 1 35 | t0 = 0.2 36 | couplings = [] 37 | couplings.append(Coupling(Lead(matrix([0]), matrix([-t]), matrix([0])), 0, matrix([-t0]))) 38 | couplings.append(Coupling(Lead(matrix([0]), matrix([-t]), matrix([0])), 0, matrix([-t0]))) 39 | couplings.append(Coupling(Lead(matrix([[1, 0], [0, 2]]), matrix([[-t, 0], [0, -t]]), matrix([[1, 0], [0, 2]])), 1, matrix([[-t0, 0],[0,-t0]]))) 40 | couplings.append(Coupling(Lead(matrix([[1, 0], [0, 2]]), matrix([[-t, 0], [0, -t]]), matrix([[1, 0], [0, 2]])), 1, matrix([[-t0, 0],[0,-t0]]))) 41 | couplings.append(Coupling(Lead(matrix([[3, 0], [0, 4]]), matrix([[-t, 0], [0, -t]]), matrix([[3, 0], [0, 4]])), 2, matrix([[-t0, 0],[0,-t0]]))) 42 | couplings.append(Coupling(Lead(matrix([[3, 0], [0, 4]]), matrix([[-t, 0], [0, -t]]), matrix([[3, 0], [0, 4]])), 2, matrix([[-t0, 0],[0,-t0]]))) 43 | couplings.append(Coupling(Lead(matrix([[5, 0], [0, 6]]), matrix([[-t, 0], [0, -t]]), matrix([[5, 0], [0, 6]])), 3, matrix([[-t0, 0],[0,-t0]]))) 44 | couplings.append(Coupling(Lead(matrix([[5, 0], [0, 6]]), matrix([[-t, 0], [0, -t]]), matrix([[5, 0], [0, 6]])), 3, matrix([[-t0, 0],[0,-t0]]))) 45 | couplings.append(Coupling(Lead(matrix([7]), matrix([-t]), matrix([7])), 4, matrix([-t0]))) 46 | couplings.append(Coupling(Lead(matrix([7]), matrix([-t]), matrix([7])), 4, matrix([-t0]))) 47 | D = {'on_site': [matrix([0]), matrix([[1, sqrt(2)*lam], [sqrt(2)*lam, 2]]), matrix([[3, 2*lam], [2*lam, 4]]), matrix([[5, sqrt(6)*lam], [sqrt(6)*lam, 6]]), matrix([7])], 48 | 'couple': [matrix([[lam, 0]]), matrix([[0, 0], [sqrt(3)*lam, 0]]), matrix([[0, 0], [sqrt(5)*lam, 0]]), matrix([[sqrt(7)*lam], [0]])]} 49 | T = [] 50 | E_range = linspace(-2, 2, 500) 51 | for E in E_range: 52 | system = System(D, couplings, E, 1) 53 | system.cal_diag_gf() 54 | system.cal_T(0, 1) 55 | system.cal_T(0, 3) 56 | system.cal_T(0, 5) 57 | system.cal_T(0, 7) 58 | system.cal_T(0, 9) 59 | T.append(system.T[0, 1]+system.T[0, 3]+system.T[0, 5]+system.T[0, 7]+system.T[0, 9]) 60 | plt.plot(E_range, T, 'o-') 61 | plt.show() 62 | ''' 63 | #weak coupling blockade 64 | ''' 65 | N = 1 66 | t = 1.0 67 | t0 = 0.5 68 | couplings = [] 69 | D = {'on_site': [], 'couple': []} 70 | couplings.append(Coupling(Lead(matrix([0.]), matrix([-t]), matrix([0.])), 0, matrix([-t]))) 71 | couplings.append(Coupling(Lead(matrix([0.]), matrix([-t]), matrix([0.])), 4, matrix([-t]))) 72 | D['on_site'].append(matrix([0.])) 73 | D['on_site'].append(matrix([0.])) 74 | D['on_site'].append(matrix([1])) 75 | D['on_site'].append(matrix([0.])) 76 | D['on_site'].append(matrix([0.])) 77 | D['couple'].append(matrix([-t])) 78 | D['couple'].append(matrix([-t0])) 79 | D['couple'].append(matrix([-t0])) 80 | D['couple'].append(matrix([-t])) 81 | T = [] 82 | E_range = linspace(0.5, 1.5, 1000) 83 | for E in E_range: 84 | system = System(D, couplings, E, 1., 0.000000000000000001, 0.000000000000000001) 85 | system.cal_diag_gf() 86 | system.cal_T(0, 1) 87 | T.append(system.T[0, 1]) 88 | plt.plot(E_range, T, 'o-') 89 | plt.show() 90 | ''' 91 | #weak coupling pedestrian one line 92 | ''' 93 | t = 1 94 | t0 = 0.2 95 | couplings = [] 96 | D = {'on_site': [], 'couple': []} 97 | couplings.append(Coupling(Lead(matrix([0]), matrix([-t]), matrix([0])), 0, matrix([-t]))) 98 | couplings.append(Coupling(Lead(matrix([0]), matrix([-t]), matrix([0])), 4, matrix([-t]))) 99 | D['on_site'].append(matrix([0])) 100 | D['on_site'].append(matrix([0])) 101 | D['on_site'].append(matrix([[0, -t0], [-t0, 0]])) 102 | D['on_site'].append(matrix([0])) 103 | D['on_site'].append(matrix([0])) 104 | D['couple'].append(matrix([-t])) 105 | D['couple'].append(matrix([[-t, 0]])) 106 | D['couple'].append(matrix([[-t], [0]])) 107 | D['couple'].append(matrix([-t])) 108 | T = [] 109 | E_range = linspace(-2, 1.99, 1000) 110 | for E in E_range: 111 | system = System(D, couplings, E, 1) 112 | system.cal_diag_gf() 113 | system.cal_T(0, 1) 114 | T.append(system.T[0, 1]) 115 | plt.plot(E_range, T, 'o-') 116 | plt.show() 117 | ''' 118 | # weak coupling pedestrian several dangling atoms and several line 119 | N = 2 120 | M = 100 121 | t = 1 122 | t0 = 0.2 123 | couplings = [] 124 | D_couple_lead = matrix(zeros((N, N))) 125 | for i in range(N-1): 126 | D_couple_lead[i+1,i]= -t 127 | D_couple_lead[i,i+1]= -t 128 | D_couple = matrix(zeros((N+M, N))) 129 | for i in range(N): 130 | D_couple[i+M,i] = -t 131 | D_on_site = matrix(zeros((N+M, N+M))) 132 | for i in range(N+M-1): 133 | if i == M-1: 134 | D_on_site[i+1, i] = -t0 135 | D_on_site[i, i+1] = -t0 136 | else: 137 | D_on_site[i+1, i] = -t 138 | D_on_site[i, i+1] = -t 139 | D = {'on_site': [D_on_site], 'couple': []} 140 | coupling1 = Coupling(Lead(D_couple_lead, matrix(eye(N))*-t, D_couple_lead), 0, D_couple) 141 | coupling2 = Coupling(Lead(D_couple_lead, matrix(eye(N))*-t, D_couple_lead), 0, D_couple) 142 | couplings.append(coupling1) 143 | couplings.append(coupling2) 144 | T = [] 145 | E_range = linspace(-2, 2, 1000) 146 | for E in E_range: 147 | system = System(D, couplings, E, 1) 148 | system.cal_diag_gf() 149 | system.cal_T(0, 1) 150 | T.append(system.T[0, 1]) 151 | plt.plot(E_range, T, 'o-') 152 | print((datetime.datetime.now() - start_time).total_seconds()) 153 | #plt.show() 154 | -------------------------------------------------------------------------------- /environment.py: -------------------------------------------------------------------------------- 1 | # This is basic environment setup for python numerical calculation 2 | 3 | # array and matrix creation and manipulation 4 | from numpy import matrix, array, zeros, eye, concatenate 5 | # common math functions 6 | from numpy import sqrt, trace, linspace 7 | from numpy.random import rand, uniform 8 | # constants 9 | from numpy import e, pi 10 | 11 | 12 | 13 | 14 | # scipy 15 | from scipy.integrate import simps 16 | 17 | 18 | 19 | 20 | 21 | # matplotlib 22 | from matplotlib import pyplot as plt 23 | 24 | 25 | 26 | 27 | 28 | # functional programming 29 | from functools import reduce -------------------------------------------------------------------------------- /gf.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | 3 | 4 | class Lead(object): 5 | 6 | def __init__(self, D00, D01, D11): 7 | self.D00 = D00 8 | self.D01 = D01 9 | self.D11 = D11 10 | self.size = D00.shape[0] 11 | self.gf = None 12 | 13 | def cal_surface_gf(self, E, order=2, delta=0.000001, epsilon=0.000001): 14 | I = matrix(eye(self.size)) 15 | if order == 1: 16 | ws = (E + 1j*delta)*I - self.D00 17 | wb = (E + 1j*delta)*I - self.D11 18 | else: 19 | ws = ((E + 1j*delta)**2)*I - self.D00 20 | wb = ((E + 1j*delta)**2)*I - self.D11 21 | tau1 = self.D01 22 | tau2 = tau1.H 23 | while abs(tau1).max() > epsilon: 24 | wb_I = wb.I 25 | ws = ws - tau1*wb_I*tau2 26 | wb = wb - tau1*wb_I*tau2 - tau2*wb_I*tau1 27 | tau1 = tau1*wb_I*tau1 28 | tau2 = tau2*wb_I*tau2 29 | self.gf= ws.I 30 | 31 | 32 | class Coupling(object): 33 | 34 | def __init__(self, lead, position, D_couple): 35 | self.lead = lead 36 | self.position = position 37 | self.D_couple = D_couple 38 | self.self_energy = None 39 | 40 | def cal_self_engergy(self, E, order=2, delta=0.000001, epsilon=0.000001): 41 | lead = self.lead 42 | lead.cal_surface_gf(E, order, delta, epsilon) 43 | D_couple = self.D_couple 44 | self.self_energy = D_couple*lead.gf*D_couple.H 45 | 46 | 47 | class System(object): 48 | 49 | def __init__(self, D, couplings, E, order=2, delta=0.000001, epsilon=0.000001): 50 | """ 51 | :param D: should be something like {'on_site': [D00, D11, ...], 'couple': [D01, D12, ...]} 52 | :param leads: should be something like [coupling, ..] 53 | """ 54 | # store values 55 | self.D = D 56 | self.E = E 57 | self.couplings = couplings 58 | self.delta = delta 59 | self.epsilon = epsilon 60 | self.order = order 61 | 62 | # initializing 63 | self.length = len(D['on_site']) 64 | self.self_energy = [0]*self.length 65 | self.gf = [[None]*self.length for i in range(self.length)] 66 | self.T = matrix(zeros((len(couplings), len(couplings)))) 67 | self.g = [0]*self.length 68 | 69 | for coupling in couplings: 70 | coupling.cal_self_engergy(E, order, delta, epsilon) 71 | self.self_energy[coupling.position] += coupling.self_energy 72 | 73 | 74 | def M(self, i, j): 75 | """ 76 | return M matrices according to indices 77 | """ 78 | if i == j: 79 | size = self.D['on_site'][i].shape[0] 80 | if self.order == 1: 81 | return (self.E + 1j*self.delta)*matrix(eye(size)) - self.D['on_site'][i] - self.self_energy[i] 82 | else: 83 | return (self.E + 1j*self.delta)**2*matrix(eye(size)) - self.D['on_site'][i] - self.self_energy[i] 84 | if i + 1 == j: 85 | return -self.D['couple'][i] 86 | if i == j + 1: 87 | return -self.D['couple'][j].H 88 | 89 | def cal_diag_gf(self): 90 | """ 91 | calculate diagonal green's function for center area. 92 | """ 93 | length = self.length 94 | g = self.g 95 | # forward iterating 96 | g[0] = self.M(0, 0).I 97 | for j in range(1, length): 98 | g[j] = (self.M(j, j) - 99 | self.M(j, j-1)*g[j-1]*self.M(j-1, j)).I 100 | 101 | G = self.gf 102 | G[self.length - 1][self.length - 1] = g[self.length - 1] 103 | # calculate more green's function according to the flag 104 | # backward iterating 105 | for j in list(range(self.length - 1))[::-1]: 106 | G[j][j] = g[j] + g[j]*self.M(j, j+1)*G[j+1][j+1]*self.M(j+1, j)*g[j] 107 | 108 | def cal_gf(self, i, j): 109 | """ 110 | calculate G_ij for center area 111 | """ 112 | from operator import mul 113 | G = self.gf 114 | if i == j or G[i][j] is not None: 115 | return None 116 | if i > j: 117 | i, j = j, i 118 | g = self.g 119 | G[i][j] = reduce(mul, [g[k]*-self.M(k, k+1) for k in range(i, j)], 1)*G[j][j] 120 | G[j][i] = G[i][j] 121 | 122 | 123 | def cal_T(self, i, j): 124 | """ 125 | calculating transmission probability from lead i to lead j 126 | """ 127 | ic= self.couplings[i].position 128 | jc= self.couplings[j].position 129 | self.cal_gf(ic, jc) 130 | gamma_i = 1j*(self.couplings[i].self_energy - self.couplings[i].self_energy.H) 131 | gamma_j = 1j*(self.couplings[j].self_energy - self.couplings[j].self_energy.H) 132 | self.T[i, j] = trace(gamma_j*self.gf[ic][jc].H*gamma_i*self.gf[ic][jc]).real 133 | self.T[j, i] = self.T[i, j] 134 | -------------------------------------------------------------------------------- /gf_numba.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | 3 | 4 | class Lead(object): 5 | 6 | def __init__(self, D00, D01, D11): 7 | self.D00 = D00 8 | self.D01 = D01 9 | self.D11 = D11 10 | self.size = D00.shape[0] 11 | self.gf = None 12 | 13 | def cal_surface_gf(self, E, order=2, delta=0.000001, epsilon=0.000001): 14 | I = matrix(eye(self.size)) 15 | if order == 1: 16 | ws = (E + 1j*delta)*I - self.D00 17 | wb = (E + 1j*delta)*I - self.D11 18 | else: 19 | ws = ((E + 1j*delta)**2)*I - self.D00 20 | wb = ((E + 1j*delta)**2)*I - self.D11 21 | tau1 = self.D01 22 | tau2 = tau1.T 23 | while abs(tau1).max() > epsilon: 24 | wb_I = wb.I 25 | ws = ws - tau1*wb_I*tau2 26 | wb = wb - tau1*wb_I*tau2 - tau2*wb_I*tau1 27 | tau1 = tau1*wb_I*tau1 28 | tau2 = tau1.T 29 | self.gf= ws.I 30 | 31 | 32 | class Coupling(object): 33 | 34 | def __init__(self, lead, position, D_couple): 35 | self.lead = lead 36 | self.position = position 37 | self.D_couple = D_couple 38 | self.self_energy = None 39 | 40 | def cal_self_engergy(self, E, order=2, delta=0.000001, epsilon=0.000001): 41 | lead = self.lead 42 | lead.cal_surface_gf(E, order, delta, epsilon) 43 | D_couple = self.D_couple 44 | self.self_energy = D_couple*lead.gf*D_couple.T 45 | 46 | 47 | class System(object): 48 | 49 | def __init__(self, D, couplings, E, order=2, delta=0.000001, epsilon=0.000001): 50 | """ 51 | :param D: should be something like {'on_site': [D00, D11, ...], 'couple': [D01, D12, ...]} 52 | :param leads: should be something like [coupling, ..] 53 | """ 54 | # store values 55 | self.D = D 56 | self.E = E 57 | self.couplings = couplings 58 | self.delta = delta 59 | self.epsilon = epsilon 60 | self.order = order 61 | 62 | # initializing 63 | self.length = len(D['on_site']) 64 | self.self_energy = [0]*self.length 65 | self.gf = [[None]*self.length for i in range(self.length)] 66 | self.T = matrix(zeros((len(couplings), len(couplings)))) 67 | self.g = [0]*self.length 68 | 69 | for coupling in couplings: 70 | coupling.cal_self_engergy(E, order, delta, epsilon) 71 | self.self_energy[coupling.position] += coupling.self_energy 72 | 73 | 74 | def M(self, i, j): 75 | """ 76 | return M matrices according to indices 77 | """ 78 | if i == j: 79 | size = self.D['on_site'][i].shape[0] 80 | if self.order == 1: 81 | return (self.E + 1j*self.delta)*matrix(eye(size)) - self.D['on_site'][i] - self.self_energy[i] 82 | else: 83 | return (self.E + 1j*self.delta)**2*matrix(eye(size)) - self.D['on_site'][i] - self.self_energy[i] 84 | if i + 1 == j: 85 | return -self.D['couple'][i] 86 | if i == j + 1: 87 | return -self.D['couple'][j].H 88 | 89 | def cal_diag_gf(self): 90 | """ 91 | calculate diagonal green's function for center area. 92 | """ 93 | length = self.length 94 | g = self.g 95 | # forward iterating 96 | g[0] = self.M(0, 0).I 97 | for j in range(1, length): 98 | g[j] = (self.M(j, j) - 99 | self.M(j, j-1)*g[j-1]*self.M(j-1, j)).I 100 | 101 | G = self.gf 102 | G[self.length - 1][self.length - 1] = g[self.length - 1] 103 | # calculate more green's function according to the flag 104 | # backward iterating 105 | for j in list(range(self.length - 1))[::-1]: 106 | G[j][j] = g[j] + g[j]*self.M(j, j+1)*G[j+1][j+1]*self.M(j+1, j)*g[j] 107 | 108 | def cal_gf(self, i, j): 109 | """ 110 | calculate G_ij for center area 111 | """ 112 | from operator import mul 113 | G = self.gf 114 | if i == j or G[i][j] is not None: 115 | return None 116 | if i > j: 117 | i, j = j, i 118 | g = self.g 119 | G[i][j] = reduce(mul, [g[k]*-self.M(k, k+1) for k in range(i, j)], 1)*G[j][j] 120 | G[j][i] = G[i][j] 121 | 122 | 123 | def cal_T(self, i, j): 124 | """ 125 | calculating transmission probability from lead i to lead j 126 | """ 127 | ic= self.couplings[i].position 128 | jc= self.couplings[j].position 129 | self.cal_gf(ic, jc) 130 | gamma_i = 1j*(self.couplings[i].self_energy - self.couplings[i].self_energy.H) 131 | gamma_j = 1j*(self.couplings[j].self_energy - self.couplings[j].self_energy.H) 132 | self.T[i, j] = trace(gamma_j*self.gf[ic][jc].H*gamma_i*self.gf[ic][jc]).real 133 | self.T[j, i] = self.T[i, j] 134 | -------------------------------------------------------------------------------- /gf_sparse.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | from scipy.sparse import csc_matrix 3 | from scipy.sparse import eye as sparse_eye 4 | from scipy.sparse.linalg import inv as sparse_inv 5 | 6 | 7 | class Lead(object): 8 | 9 | def __init__(self, D00, D01, D11): 10 | self.D00 = csc_matrix(D00) 11 | self.D01 = csc_matrix(D01) 12 | self.D11 = csc_matrix(D11) 13 | self.size = D00.shape[0] 14 | self.gf = None 15 | 16 | def cal_surface_gf(self, E, order=2, delta=0.000001, epsilon=0.000001): 17 | I = sparse_eye(self.size).tocsc() 18 | if order == 1: 19 | ws = (E + 1j*delta)*I - self.D00 20 | wb = (E + 1j*delta)*I - self.D11 21 | else: 22 | ws = ((E + 1j*delta)**2)*I - self.D00 23 | wb = ((E + 1j*delta)**2)*I - self.D11 24 | tau1 = self.D01 25 | tau2 = tau1.H 26 | while abs(tau1).max() > epsilon: 27 | wb_I = sparse_inv(wb) 28 | ws = ws - tau1*wb_I*tau2 29 | wb = wb - tau1*wb_I*tau2 - tau2*wb_I*tau1 30 | tau1 = tau1*wb_I*tau1 31 | tau2 = tau2*wb_I*tau2 32 | self.gf= sparse_inv(ws) 33 | 34 | 35 | class Coupling(object): 36 | 37 | def __init__(self, lead, position, D_couple): 38 | self.lead = lead 39 | self.position = position 40 | self.D_couple = csc_matrix(D_couple) 41 | self.self_energy = None 42 | 43 | def cal_self_engergy(self, E, order=2, delta=0.000001, epsilon=0.000001): 44 | lead = self.lead 45 | lead.cal_surface_gf(E, order, delta, epsilon) 46 | D_couple = self.D_couple 47 | self.self_energy = D_couple*lead.gf*D_couple.H 48 | 49 | 50 | class System(object): 51 | 52 | def __init__(self, D, couplings, E, order=2, delta=0.000001, epsilon=0.000001): 53 | """ 54 | :param D: should be something like {'on_site': [D00, D11, ...], 'couple': [D01, D12, ...]} 55 | :param leads: should be something like [coupling, ..] 56 | """ 57 | # store values 58 | self.D = {'on_site': [], 'couple': []} 59 | for D_on_site in D['on_site']: 60 | self.D['on_site'].append(csc_matrix(D_on_site)) 61 | for D_couple in D['on_site']: 62 | self.D['couple'].append(csc_matrix(D_on_site)) 63 | self.E = E 64 | self.couplings = couplings 65 | self.delta = delta 66 | self.epsilon = epsilon 67 | self.order = order 68 | 69 | # initializing 70 | self.length = len(D['on_site']) 71 | self.size = [D['on_site'][i].shape[0] for i in range(self.length)] 72 | self.self_energy = [0]*self.length 73 | self.gf = [[None]*self.length for i in range(self.length)] 74 | self.T = matrix(zeros((len(couplings), len(couplings)))) 75 | self.g = [0]*self.length 76 | 77 | for coupling in couplings: 78 | coupling.cal_self_engergy(E, order, delta, epsilon) 79 | self.self_energy[coupling.position] += coupling.self_energy 80 | 81 | 82 | def M(self, i, j): 83 | """ 84 | return M matrices according to indices 85 | """ 86 | if i == j: 87 | size = self.size[i] 88 | if self.order == 1: 89 | return (self.E + 1j*self.delta)*sparse_eye(size).tocsc() - self.D['on_site'][i] - self.self_energy[i] 90 | else: 91 | return (self.E + 1j*self.delta)**2*sparse_eye(size).tocsc() - self.D['on_site'][i] - self.self_energy[i] 92 | if i + 1 == j: 93 | return -self.D['couple'][i] 94 | if i == j + 1: 95 | return -self.D['couple'][j].H 96 | ''' 97 | def get_index(self, i): 98 | return sum(self.size[0:i]) 99 | 100 | def gen_sparse_M(self): 101 | from scipy import sparse 102 | sparse_M = sparse.lil_matrix((self.total_length, self.total_length)) 103 | for i in range(self.length): 104 | sparse_M[sum(self.size[0:i]):sum(self.size[0:i + 1]), sum(self.size[0:i]):sum(self.size[0:i + 1])] = \ 105 | self.M(i, i) 106 | if i != self.length - 1: 107 | sparse_M[sum(self.size[0:i]):sum(self.size[0:i + 1]), sum(self.size[0:i + 1]):sum(self.size[0:i + 2])] \ 108 | = self.M(i, i + 1) 109 | sparse_M[sum(self.size[0:i+1]):sum(self.size[0:i + 2]), sum(self.size[0:i]):sum(self.size[0:i + 1])] \ 110 | = self.M(i + 1, i) 111 | self.sparse_M = sparse_M.tocsc() 112 | 113 | 114 | def cal_sparse_gf(self): 115 | from scipy.linalg import inv 116 | self.sparse_gf = inv(self.sparse_M) 117 | ''' 118 | 119 | def cal_diag_gf(self): 120 | """ 121 | calculate diagonal green's function for center area. 122 | """ 123 | length = self.length 124 | g = self.g 125 | # forward iterating 126 | g[0] = sparse_inv(self.M(0, 0)) 127 | for j in range(1, length): 128 | g[j] = sparse_inv(self.M(j, j) - 129 | self.M(j, j-1)*g[j-1]*self.M(j-1, j)) 130 | 131 | G = self.gf 132 | G[self.length - 1][self.length - 1] = g[self.length - 1] 133 | # calculate more green's function according to the flag 134 | # backward iterating 135 | for j in list(range(self.length - 1))[::-1]: 136 | G[j][j] = g[j] + g[j]*self.M(j, j+1)*G[j+1][j+1]*self.M(j+1, j)*g[j] 137 | 138 | 139 | def cal_gf(self, i, j): 140 | """ 141 | calculate G_ij for center area 142 | """ 143 | from operator import mul 144 | G = self.gf 145 | if i == j or G[i][j] is not None: 146 | return None 147 | if i > j: 148 | i, j = j, i 149 | g = self.g 150 | G[i][j] = reduce(mul, [g[k]*-self.M(k, k+1) for k in range(i, j)], 1)*G[j][j] 151 | G[j][i] = G[i][j] 152 | 153 | 154 | def cal_T(self, i, j): 155 | """ 156 | calculating transmission probability from lead i to lead j 157 | """ 158 | ic= self.couplings[i].position 159 | jc= self.couplings[j].position 160 | self.cal_gf(ic, jc) 161 | gamma_i = 1j*(self.couplings[i].self_energy - self.couplings[i].self_energy.H) 162 | gamma_j = 1j*(self.couplings[j].self_energy - self.couplings[j].self_energy.H) 163 | self.T[i, j] = trace((gamma_j*self.gf[ic][jc].H*gamma_i*self.gf[ic][jc]).todense()).real 164 | self.T[j, i] = self.T[i, j] 165 | -------------------------------------------------------------------------------- /phonon-transport.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | from gf import Lead, Coupling, System 3 | ''' 4 | # two atom line 5 | f = 1.0 6 | omega = 1.5 7 | Dl00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 8 | Dl01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 9 | Dl11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 10 | Dr00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 11 | Dr01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 12 | Dr11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 13 | Dlcl = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 14 | Dlcr = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 15 | 16 | D00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 17 | D11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 18 | D22 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 19 | D33 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 20 | D44 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 21 | D55 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 22 | D66 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 23 | D77 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 24 | D01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 25 | D12 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 26 | D23 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 27 | D34 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 28 | D45 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 29 | D56 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 30 | D67 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 31 | D = {'on_site': [D00, D11, D22, D33, D44, D55, D66, D77], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 32 | 'couple': [D01, D12, D23, D34, D45, D56, D67], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 33 | lead1 = Lead(Dl00, Dl01, Dl11) 34 | lead2 = Lead(Dr00, Dr01, Dr11) 35 | 36 | coupling1 = Coupling(lead1, 0, Dlcl) 37 | coupling2 = Coupling(lead2, 7, Dlcr) 38 | test = System(D, [coupling1, coupling2], 1.5, 2) 39 | test.cal_diag_gf() 40 | test.cal_T(0, 0) 41 | test.cal_T(0, 1) 42 | test.cal_T(1, 1) 43 | gamma = matrix([[2,0,0,0],[0,0,0,0],[0,0,2,0],[0,0,0,0]]) 44 | print(gamma*test.gf[7][7].H*gamma*test.gf[7][7]) 45 | print('------------------') 46 | print(test.gf[7][7]) 47 | print('------------------') 48 | print(gamma*test.gf[0][7].H*gamma*test.gf[0][7]) 49 | print('------------------') 50 | print(test.gf[0][7]) 51 | print(test.T) 52 | ''' 53 | ''' 54 | # one atom line 3 leads 55 | from environment import * 56 | from gf import Lead, Coupling, System 57 | f = 1.0 58 | omega = 1.5 59 | D00 = matrix([2*f]) 60 | D11 = matrix([2*f]) 61 | D22 = matrix([2*f]) 62 | D33 = matrix([2*f]) 63 | D44 = matrix([2*f]) 64 | D55 = matrix([2*f]) 65 | D66 = matrix([2*f]) 66 | D77 = matrix([2*f]) 67 | D000 = matrix([2*f]) 68 | D001 = matrix([-f]) 69 | D011 = matrix([2*f]) 70 | D100 = matrix([2*f]) 71 | D101 = matrix([-f]) 72 | D111 = matrix([2*f]) 73 | D200 = matrix([2*f]) 74 | D201 = matrix([-f]) 75 | D211 = matrix([2*f]) 76 | D01 = matrix([-f]) 77 | D12 = matrix([-f]) 78 | D23 = matrix([-f]) 79 | D34 = matrix([-f]) 80 | D45 = matrix([-f]) 81 | D56 = matrix([-f]) 82 | D67 = matrix([-f]) 83 | Dlc0 = matrix([-f]) 84 | Dlc1 = matrix([-f]) 85 | Dlc2 = matrix([-1*f]) 86 | D = {'on_site': [D00, D11, D22, D33, D44, D55, D66, D77], 'couple': [D01, D12, D23, D34, D45, D56, D67]} 87 | lead1 = Lead(D000, D001, D011) 88 | lead2 = Lead(D100, D101, D111) 89 | lead3 = Lead(D200, D201, D211) 90 | 91 | coupling1 = Coupling(lead1, 0, Dlc0) 92 | coupling2 = Coupling(lead2, 7, Dlc1) 93 | coupling3 = Coupling(lead3, 7, Dlc2) 94 | test = System(D, [coupling1, coupling2, coupling3], 1.5, 2) 95 | test.cal_diag_gf() 96 | test.cal_T(0, 1) 97 | test.cal_T(0, 2) 98 | print('------------------') 99 | print(test.gf[7][7]) 100 | print('------------------') 101 | print(test.couplings[0].self_energy) 102 | print('------------------') 103 | print(test.gf[0][7]) 104 | print(test.T) 105 | ''' 106 | 107 | # one atom line two leads 108 | from environment import * 109 | from gf import Lead, Coupling, System 110 | f = 1.0 111 | omega = 1.5 112 | D00 = matrix([2*f]) 113 | D11 = matrix([2*f]) 114 | D22 = matrix([2*f]) 115 | D33 = matrix([2*f]) 116 | D44 = matrix([2*f]) 117 | D55 = matrix([2*f]) 118 | D66 = matrix([2*f]) 119 | D77 = matrix([2*f]) 120 | Dl00 = matrix([2*f]) 121 | Dl01 = matrix([-f]) 122 | Dl11 = matrix([2*f]) 123 | Dr00 = matrix([2*f]) 124 | Dr01 = matrix([-f]) 125 | Dr11 = matrix([2*f]) 126 | D01 = matrix([-f]) 127 | D12 = matrix([-f]) 128 | D23 = matrix([-f]) 129 | D34 = matrix([-f]) 130 | D45 = matrix([-f]) 131 | D56 = matrix([-f]) 132 | D67 = matrix([-f]) 133 | Dlcl = matrix([-f]) 134 | Dlcr = matrix([-f]) 135 | D = {'on_site': [D00, D11, D22, D33, D44, D55, D66, D77], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 136 | 'couple': [D01, D12, D23, D34, D45, D56, D67], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 137 | lead1 = Lead(Dl00, Dl01, Dl11) 138 | lead2 = Lead(Dr00, Dr01, Dr11) 139 | 140 | coupling1 = Coupling(lead1, 0, Dlcl) 141 | coupling2 = Coupling(lead2, 7, Dlcr) 142 | test = System(D, [coupling1, coupling2], 1.5, 2) 143 | test.cal_diag_gf() 144 | test.cal_T(0, 1) 145 | T = [] 146 | omega_range = linspace(-2, 2, 1000) 147 | for omega in omega_range: 148 | system = System(D, [coupling1, coupling2], omega, 2) 149 | system.cal_diag_gf() 150 | system.cal_T(0, 1) 151 | T.append(system.T[0, 1]) 152 | plt.plot(omega_range, T, 'o-') 153 | plt.show() 154 | -------------------------------------------------------------------------------- /two_lead/1d-kappa.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "ename": "ImportError", 10 | "evalue": "No module named 'numba'", 11 | "output_type": "error", 12 | "traceback": [ 13 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 14 | "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", 15 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mphonon_GF\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPhonon\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0menvironment\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mdatetime\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'matplotlib inline'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 16 | "\u001b[1;32m/home/wangc/FILES/Workspace/jupyter/NEGF/phonon_GF.py\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0menvironment\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mnumba\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mjit\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mclass\u001b[0m \u001b[0mPhonon\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 17 | "\u001b[1;31mImportError\u001b[0m: No module named 'numba'" 18 | ] 19 | } 20 | ], 21 | "source": [ 22 | "from phonon_GF import Phonon\n", 23 | "from environment import *\n", 24 | "from datetime import datetime\n", 25 | "%matplotlib inline" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "def cal_T(n, m, upper_omega, lower_f, upper_f, N=1000, lower_omega=0):\n", 35 | " f_0 = 1.0\n", 36 | " f = [matrix(matrix(uniform(lower_f,upper_f,1))) for i in range(m+1)]\n", 37 | " D_self = matrix([2*f_0])\n", 38 | " D_couple = matrix([-f_0])\n", 39 | " Dl00 = matrix([2*f_0])\n", 40 | " Dl01 = matrix([-f_0])\n", 41 | " Dl11 = matrix([2*f_0])\n", 42 | " Dr00 = matrix([2*f_0])\n", 43 | " Dr01 = matrix([-f_0])\n", 44 | " Dr11 = matrix([2*f_0])\n", 45 | " Dlcl = matrix([-f_0])\n", 46 | " Dlcr = matrix([-f_0])\n", 47 | " D = {'on_site': [D_self for i in range(n-1)] + [f[0] + f_0] + [f[i] + f[i+1] for i in range(m)] + [f[m] + f_0] + [D_self for i in range(n-1)], \n", 48 | " 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]},\n", 49 | " 'couple': [D_couple for i in range(n-1)] + [-f[i] for i in range(m+1)] + [D_couple for i in range(n-1)],\n", 50 | " 'lead_center':{'l': Dlcl, 'r': Dlcr}}\n", 51 | " omega_range = linspace(lower_omega, upper_omega, N + 1)[1:]\n", 52 | " T = zeros(N)\n", 53 | " for i in range(N):\n", 54 | " omega = omega_range[i]\n", 55 | " system = Phonon(D, omega)\n", 56 | " system.cal_surface_GF()\n", 57 | " system.cal_self_energy()\n", 58 | " system.cal_GF(flag='all')\n", 59 | " system.cal_T()\n", 60 | " T[i] = system.T.real\n", 61 | " fig = plt.figure(1)\n", 62 | " fig.set_size_inches(26, 10)\n", 63 | " plt.plot(omega_range, T, 'ro-')\n", 64 | " return (T, omega_range)" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "def sigma(T, omega_range, t):\n", 74 | " hbar = 1\n", 75 | " kB = 1\n", 76 | " def bose(omega, t):\n", 77 | " ebar = 1/(e**(-hbar*omega/(kB*t)))\n", 78 | " return (ebar*(hbar*omega)/(kB*t**2))/(ebar-1)**2\n", 79 | " return simps([T[i]*hbar*omega_range[i]*bose(omega_range[i], t) for i in range(len(omega_range))], omega_range)" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 4, 85 | "metadata": {}, 86 | "outputs": [ 87 | { 88 | "name": "stdout", 89 | "output_type": "stream", 90 | "text": [ 91 | "CPU times: user 11.5 s, sys: 3.33 ms, total: 11.5 s\n", 92 | "Wall time: 11.5 s\n" 93 | ] 94 | }, 95 | { 96 | "data": { 97 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABdUAAAJPCAYAAACadT3NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3V+Mpud51/Hf9dQY1DYJ/4vkJD1obAeFStlYhCChdqCV\n7CA3IUJAjJDSprWgxU1TVMk9QMq6nKRF6h9kqqaoREBBrhAVCVQtQTSTqmpjR8k6AXft3VKw7CRU\naWhVCRUUeW4OdpJuN+vMZHfea/a+5/ORop135nnf584czMHXl66nxhgBAAAAAACOtp32AQAAAAAA\nYBaiOgAAAAAAHJOoDgAAAAAAxySqAwAAAADAMYnqAAAAAABwTKI6AAAAAAAc05FRvap+qqp+s6o+\n8SWu+SdVdbmqnqyq157sEQEAAAAA4NZwnEn19ya598V+WFVvTPJ1Y4w7k/zdJD9xQmcDAAAAAIBb\nypFRfYzxy0l++0tc8uYk//Lw2seTvKyqvuZkjgcAAAAAALeOk9ipfkeS5656/cnD7wEAAAAAwFI8\nqBQAAAAAAI7pthP4jE8mecVVr19++L0vUlXjBO4HAAAAAAA3ZYxRN/K+40b1Ovzf9bw/yd9P8jNV\n9YYkvzPG+M0X+6CHkvxIku89fH3U1+Pwxl/Oe077/e55677fPW/d93fd8/Ekv+L35J6LnNnvac57\nXv13aJYzr3TPGc98Vu4545lnvucfy+8/OGuWM9/q95zxzGflnjOeecXf04/l99clHCR5w9d8TT78\nqU9l2yxRAE5H1Q319CvvHeNLD49X1b9JspfkTyT5zSTvSnJ7kjHG+MnDax5Ncl+S/5Pk28YYH3uR\nzxp/LclXJzmX5JeSvOQYX+eY191K73fPW/f97nnrvr/jnj+Z5M/7PbnnQmf2e5rvntf+HZrhzKvd\nc8Yzn5V7znjmWe/5G0m+dbIzz3DPGc98Vu4545lX/D3dn+SFJB+86678ob29/Ph73hOA01JVNzyp\nfmRUP0lVNZ544olcvHgxSXL33XcnSS5fvpw777zzS379zDPPfNnvOe33u+et+373vHXfv+t77u/v\n58EHHzz1/5+3+u/pLN9zxjP7Pc11z+v9HbrVz7ziPWc881m554xnnvGe7373u/OWt7xlqjPPcs8Z\nz3xW7jnjmZf7Pf3cz+Xun/3Z3POJT+QHfuAHcv78+QCclqmieuf9AK61v7+fvb290z4GcIb5OwTc\nCvwtAk7Fhz+cfM/3JI8/7u8QcOpEdQAAAABubY8/nnz3dydPPHHaJwG4qai+nfRhAAAAAOCLVCWG\nLYEFiOoAAAAA7F5VcnBw2qcAuGmiOgAAAAC7Z1IdWISoDgAAAMDubZuoDixBVAcAAABg90yqA4sQ\n1QEAAADYPVEdWISoDgAAAMDueVApsAhRHQAAAIDds1MdWISoDgAAAMDuWf8CLEJUBwAAAGD3RHVg\nEaI6AAAAALtnpzqwCFEdAAAAgN2zUx1YhKgOAAAAwO5Z/wIsQlQHAAAAYPdEdWARojoAAAAAu2en\nOrAIUR0AAACA3bNTHViEqA4AAADA7ln/AixCVAcAAABg90R1YBGiOgAAAAC7Z6c6sAhRHQAAAIDd\nM6kOLEJUBwAAAGD3PKgUWISoDgAAAMDumVQHFiGqAwAAALB7ojqwCFEdAAAAgN3zoFJgEaI6AAAA\nALtnpzqwCFEdAAAAgN2z/gVYhKgOAAAAwO6J6sAiRHUAAAAAds9OdWARojoAAAAAu2enOrAIUR0A\nAACA3bP+BViEqA4AAADA7onqwCJEdQAAAAB2z051YBGiOgAAAAC7Z1IdWISoDgAAAMDueVApsAhR\nHQAAAIDdM6kOLEJUBwAAAGD3RHVgEaI6AAAAALvnQaXAIkR1AAAAAHbPTnVgEaI6AAAAALtn/Quw\nCFEdAAAAgN0T1YFFiOoAAAAA7J6d6sAiRHUAAAAAds9OdWARojoAAAAAu2f9C7AIUR0AAACA3au6\n8q+wDkxOVAcAAABg90R1YBGiOgAAAAA9rIABFiCqAwAAANBDVAcWIKoDAAAA0ENUBxYgqgMAAADQ\nQ1QHFiCqAwAAANCjKjk4OO1TANwUUR0AAACAHttmUh2YnqgOAAAAQA/rX4AFiOoAAAAA9BDVgQWI\n6gAAAAD0sFMdWICoDgAAAEAPO9WBBYjqAAAAAPSw/gVYgKgOAAAAQA9RHViAqA4AAABADzvVgQWI\n6gAAAAD0sFMdWICoDgAAAEAP61+ABYjqAAAAAPQQ1YEFiOoAAAAA9BDVgQWI6gAAAAD02DYPKgWm\nJ6oDAAAA0MOkOrAAUR0AAACAHqI6sABRHQAAAIAeojqwAFEdAAAAgB5VdqoD0xPVAQAAAOixbSbV\ngemJ6gAAAAD0sP4FWICoDgAAAEAPUR1YgKgOAAAAQA871YEFiOoAAAAA9LBTHViAqA4AAABAD+tf\ngAWI6gAAAAD0ENWBBYjqAAAAAPSwUx1YgKgOAAAAQA871YEFiOoAAAAA9LD+BViAqA4AAABAD1Ed\nWICoDgAAAEAPUR1YgKgOAAAAQI9t86BSYHqiOgAAAAA9TKoDCxDVAQAAAOghqgMLENUBAAAA6CGq\nAwsQ1QEAAADoUWWnOjA9UR0AAACAHttmUh2YnqgOAAAAQA/rX4AFiOoAAAAA9BDVgQWI6gAAAAD0\nsFMdWICoDgAAAEAPO9WBBYjqAAAAAPSw/gVYgKgOAAAAQA9RHViAqA4AAABAD1EdWICoDgAAAECP\nbfOgUmB6ojoAAAAAPUyqAwsQ1QEAAADoIaoDCxDVAQAAAOghqgMLENUBAAAA6FFlpzowPVEdAAAA\ngB7bZlIdmJ6oDgAAAEAP61+ABYjqAAAAAPQQ1YEFiOoAAAAA9LBTHVjAsaJ6Vd1XVU9X1aWqevg6\nP39FVf1iVX2sqp6sqjee/FEBAAAAmJqd6sACjozqVbUleTTJvUlek+SBqnr1NZf9wyQ/M8Z4XZIH\nkvz4SR8UAAAAgMlZ/wIs4DiT6q9PcnmM8ewY43NJHkvy5muuOUjy0sOv/2iST57cEQEAAABYgqgO\nLOC2Y1xzR5Lnrnr9fK6E9qs9kuQDVfWOJF+Z5JtP5ngAAAAALENUBxZwnKh+HA8kee8Y40eq6g1J\nfjpXVsV8kfPnz3/h6729vezt7Z3QEQAAAAC4pW2bB5UCp2J/fz/7+/sn8lk1jvivg4eR/PwY477D\n19+fZIwxfvCqa/5bknvHGJ88fP3fk/yFMcZvXfNZ46j7AQAAALCob/mW5MEHkze96bRPApxxVZUx\nRt3Ie4+zU/0jSV5VVV9bVbcneWuS919zzbM5XPlSVX82yR++NqgDAAAAcMZZ/wIs4MioPsZ4IclD\nST6Q5Kkkj40xLlbVI1V1/+Fl35fkwap6Msm/TvK2XR0YAAAAgEmJ6sACjrVTfYzxC0nuvuZ777rq\n64tJ/tLJHg0AAACApdipDizgOOtfAAAAAODmmVQHFiCqAwAAANBDVAcWIKoDAAAA0ENUBxYgqgMA\nAADQo8pOdWB6ojoAAAAAPbbNpDowPVEdAAAAgB7WvwALENUBAAAA6CGqAwsQ1QEAAADoYac6sABR\nHQAAAIAedqoDCxDVAQAAAOhh/QuwAFEdAAAAgB6iOrAAUR0AAACAHqI6sABRHQAAAIAe2+ZBpcD0\nRHUAAAAAephUBxYgqgMAAADQQ1QHFiCqAwAAANBDVAcWIKoDAAAA0MNOdWABojoAAAAAPUyqAwsQ\n1QEAAADoIaoDCxDVAQAAAOghqgMLENUBAAAA6FFlpzowPVEdAAAAgB7bZlIdmJ6oDgAAAEAP61+A\nBYjqAAAAAPQQ1YEFiOoAAAAA9BDVgQWI6gAAAAD02DYPKgWmJ6oDAAAA0MOkOrAAUR0AAACAHqI6\nsABRHQAAAIAeojqwAFEdAAAAgB52qgMLENUBAAAA6GFSHViAqA4AAABAD1EdWICoDgAAAEAPUR1Y\ngKgOAAAAQA871YEFiOoAAAAA9DCpDixAVAcAAACgh6gOLEBUBwAAAKCHqA4sQFQHAAAAoIeoDixA\nVAcAAACghweVAgsQ1QEAAADoYVIdWICoDgAAAEAPUR1YgKgOAAAAQA9RHViAqA4AAABADzvVgQWI\n6gAAAAD0MKkOLEBUBwAAAKCHqA4sQFQHAAAAoIeoDixAVAcAAACgh53qwAJEdQAAAAB6mFQHFiCq\nAwAAANBDVAcWIKoDAAAA0ENUBxYgqgMAAADQo8pOdWB6ojoAAAAAPbbNpDowPVEdAAAAgB7WvwAL\nENUBAAAA6CGqAwsQ1QEAAADoIaoDCxDVAQAAAOixbR5UCkxPVAcAAACgh0l1YAGiOgAAAAA9RHVg\nAaI6AAAAAD1EdWABojoAAAAAPexUBxYgqgMAAADQw6Q6sABRHQAAAIAeojqwAFEdAAAAgB6iOrAA\nUR0AAACAHnaqAwsQ1QEAAADoYVIdWICoDgAAAEAPUR1YgKgOAAAAQA9RHViAqA4AAABAD1EdWICo\nDgAAAEAPDyoFFiCqAwAAANDDpDqwAFEdAAAAgB6iOrAAUR0AAACAHqI6sABRHQAAAIAedqoDCxDV\nAQAAAOhhUh1YgKgOAAAAQA9RHViAqA4AAABAD1EdWICoDgAAAEAPO9WBBYjqAAAAAPQwqQ4sQFQH\nAAAAoIeoDixAVAcAAACgh6gOLEBUBwAAAKDHtonqwPREdQAAAAB6VHlQKTA9UR0AAACAHta/AAsQ\n1QEAAADoIaoDCxDVAQAAAOghqgMLENUBAAAA6LFtdqoD0xPVAQAAAOhhUh1YgKgOAAAAQA9RHViA\nqA4AAABAD1EdWICoDgAAAEAPO9WBBYjqAAAAAPQwqQ4sQFQHAAAAoIeoDixAVAcAAACgh6gOLEBU\nBwAAAKCHnerAAkR1AAAAAHqYVAcWIKoDAAAA0ENUBxYgqgMAAADQQ1QHFiCqAwAAANBDVAcWIKoD\nAAAA0MODSoEFiOoAAAAA9DCpDixAVAcAAACgh6gOLEBUBwAAAKCHqA4s4FhRvaruq6qnq+pSVT38\nItf8zap6qqr+a1X99MkeEwAAAIDp2akOLOC2oy6oqi3Jo0m+Kcmnknykqt43xnj6qmteleThJH9x\njPG7VfUnd3VgAAAAACZlUh1YwHEm1V+f5PIY49kxxueSPJbkzddc82CSfzrG+N0kGWP81skeEwAA\nAIDpierAAo4T1e9I8txVr58//N7V7kpyd1X9clX9SlXde1IHBAAAAGARojqwgCPXv3wZn/OqJN+Q\n5JVJfqmq/tznJ9cBAAAAwE51YAXHieqfzJVQ/nkvP/ze1Z5P8uExxkGS/1lVl5LcmeSj137Y+fPn\nv/D13t5e9vb2vrwTAwAAADAnk+rAKdnf38/+/v6JfFaNI/6QVdVXJHkmVx5U+ukkTyR5YIxx8apr\n7j383rcePqT0o0leO8b47Ws+axx1PwAAAAAWdfFi8pa3JE8/fdonAc64qsoYo27kvUfuVB9jvJDk\noSQfSPJUksfGGBer6pGquv/wmv+U5LNV9VSS/5Lk+64N6gAAAACccSbVgQUcOal+ojczqQ4AAABw\ndl26lNx//5V/AU7RTifVAQAAAOBEVHlQKTA9UR0AAACAHta/AAsQ1QEAAADoIaoDCxDVAQAAAOgh\nqgMLENUBAAAA6LFtdqoD0xPVAQAAAOhhUh1YgKgOAAAAQA9RHViAqA4AAABAD1EdWICoDgAAAEAP\nO9WBBYjqAAAAAPQwqQ4sQFQHAAAAoIeoDixAVAcAAACgh6gOLEBUBwAAAKDHtonqwPREdQAAAAB6\nVHlQKTA9UR0AAACAHta/AAsQ1QEAAADoIaoDCxDVAQAAAOhhpzqwAFEdAAAAgB52qgMLENUBAAAA\n6GH9C7AAUR0AAACAHqI6sABRHQAAAIAeojqwAFEdAAAAgB7bZqc6MD1RHQAAAIAeJtWBBYjqAAAA\nAPQQ1YEFiOoAAAAA9BDVgQWI6gAAAAD02DZRHZieqA4AAABAjyoPKgWmJ6oDAAAA0MP6F2ABojoA\nAAAAPUR1YAGiOgAAAAA97FQHFiCqAwAAANCj6sq/wjowMVEdAAAAgF6iOjAxUR0AAACAPvaqA5MT\n1QEAAADoY686MDlRHQAAAIA+VcnBwWmfAuCGieoAAAAA9LH+BZicqA4AAABAH1EdmJyoDgAAAEAf\nUR2YnKgOAAAAQJ9ts1MdmJqoDgAAAEAfk+rA5ER1AAAAAPqI6sDkRHUAAAAA+ojqwOREdQAAAAD6\nbJuoDkxNVAcAAACgT5UHlQJTE9UBAAAA6GP9CzA5UR0AAACAPqI6MDlRHQAAAIA+dqoDkxPVAQAA\nAOhjpzowOVEdAAAAgD7WvwCTE9UBAAAA6COqA5MT1QEAAADoI6oDkxPVAQAAAOizbXaqA1MT1QEA\nAADoY1IdmJyoDgAAAEAfUR2YnKgOAAAAQB9RHZicqA4AAABAn20T1YGpieoAAAAA9KnyoFJgaqI6\nAAAAAH2sfwEmJ6oDAAAA0EdUByYnqgMAAADQx051YHKiOgAAAAB97FQHJieqAwAAANDH+hdgcqI6\nAAAAAH1EdWByojoAAAAAfexUByYnqgMAAADQx051YHKiOgAAAAB9rH8BJieqAwAAANBHVAcmJ6oD\nAAAA0EdUByYnqgMAAADQx4NKgcmJ6gAAAAD08aBSYHKiOgAAAAAtDg4O8tHf+7189Nd+LQfCOjAp\nUR0AAACAnXvqwoW885578uyv/3qe/Y7vyDvvuSdPXbhw2scC+LLVaNxhVVWj834AAAAAnL6Dg4O8\n85578qNPPvmFCc+DJO987Wvzox/9aLbN3CfQq6oyxqgbea+/WAAAAADs1IULF7J36dIfCFFbkm+8\ndCkXTKsDkxHVAQAAAADgmER1AAAAAHbq3Llz2b/rrlz9aNKDJB+6666cO3futI4FcEPsVAcAAABg\n5566cCHvefvb842f+ERy++3Zv/vu/L33vjevEdWBU3AzO9VFdQAAAABaHBwc5MK5c8k73pFz3/Zt\nHlAKnJqbieq3nfRhAAAAAOB6tm3LPS95SXLXXYmgDkzKXy8AAAAA+lQlNhkAExPVAQAAAOizbaI6\nMDVRHQAAAIA+VcnBwWmfAuCGieoAAAAA9DGpDkxOVAcAAACgj0l1YHKiOgAAAAB9TKoDkxPVAQAA\nAOhjUh2YnKgOAAAAQB+T6sDkRHUAAAAA+phUByYnqgMAAADQp8qkOjA1UR0AAACAPttmUh2YmqgO\nAAAAQB+T6sDkRHUAAAAA+nhQKTA5UR0AAACAPh5UCkxOVAcAAACgj0l1YHKiOgAAAAB9TKoDkxPV\nAQAAAOhjUh2YnKgOAAAAQB+T6sDkRHUAAAAA+phUByYnqgMAAADQx6Q6MDlRHQAAAIA+VSbVgamJ\n6gAAAAD0sf4FmJyoDgAAAEAf61+AyYnqAAAAAPQxqQ5M7lhRvaruq6qnq+pSVT38Ja7761V1UFWv\nO7kjAgAAALAMk+rA5I6M6lW1JXk0yb1JXpPkgap69XWu++ok70jy4ZM+JAAAAACLMKkOTO44k+qv\nT3J5jPHsGONzSR5L8ubrXPePkrw7yf87wfMBAAAAsBKT6sDkjhPV70jy3FWvnz/83hdU1bkkLx9j\n/PwJng0AAACA1ZhUByZ3281+QFVVkh9O8rarv32znwsAAADAgkyqA5M7TlT/ZJJXXvX65Yff+7yX\n5Mqu9f3DwP5nkryvqt40xvjYtR92/vz5L3y9t7eXvb29L//UAAAAAMypyqQ60G5/fz/7+/sn8lk1\njvgjVlVfkeSZJN+U5NNJnkjywBjj4otc/8Ek/2CMceE6PxtH3Q8AAACAhX3ndyZf//XJd33XaZ8E\nOMOqKmOMG9q4cuRO9THGC0keSvKBJE8leWyMcbGqHqmq+6/3llj/AgAAAMD1mFQHJnesnepjjF9I\ncvc133vXi1z7V07gXAAAAACsyINKgckdOakOAAAAACfGg0qByYnqAAAAAPQxqQ5MTlQHAAAAoI9J\ndWByojoAAAAAfUyqA5MT1QEAAADoY1IdmJyoDgAAAECfKpPqwNREdQAAAAD6bJtJdWBqojoAAAAA\nfUyqA5MT1QEAAADo40GlwOREdQAAAAD6eFApMDlRHQAAAIA+JtWByYnqAAAAAPQxqQ5MTlQHAAAA\noI9JdWByojoAAAAAfUyqA5MT1QEAAADoU2VSHZiaqA4AAABAn20zqQ5MTVQHAAAAoI9JdWByojoA\nAAAAfUyqA5MT1QEAAADoY1IdmJyoDgAAAECfbRPVgamJ6gAAAAD0qbL+BZiaqA4AAABAH5PqwORE\ndQAAAAD6mFQHJieqAwAAANDHpDowOVEdAAAAgD4m1YHJieoAAAAA9KkyqQ5MTVQHAAAAoM+2mVQH\npiaqAwAAANDHpDowOVEdAAAAgD4m1YHJieoAAAAA9DGpDkxOVAcAAACgz7aJ6sDURHUAAAAA+lRZ\n/wJMTVQHAAAAoI9JdWByojoAAAAAfUyqA5MT1QEAAADo40GlwOREdQAAAAD6bJtJdWBqojoAAAAA\nfUyqA5MT1QEAAADoY1IdmJyoDgAAAEAfk+rA5ER1AAAAAPpsm6gOTE1UBwAAAKBPlfUvwNREdQAA\nAAD6mFQHJieqAwAAANDHpDowOVEdAAAAgD4eVApMTlQHAAAAoM+2mVQHpiaqAwAAANDHpDowOVEd\nAAAAgD4m1YHJieoAAAAA9DGpDkxOVAcAAACgj0l1YHKiOgAAAAB9TKoDkxPVAQAAAOizbaI6MDVR\nHQAAAIA+Vda/AFMT1QEAAADoY/0LMDlRHQAAAIA+HlQKTE5UBwAAAKCPSXVgcqI6AAAAAH1MqgOT\nE9UBAAAA6GNSHZicqA4AAABAH5PqwOREdQAAAAD6mFQHJieqAwAAANBn20R1YGqiOgAAAAB9qqx/\nAaYmqgMAAADQx6Q6MDlRHQAAAIA+JtWByYnqAAAAAPTxoFJgcqI6AAAAAH22zaQ6MDVRHQAAAIA+\nJtWByYnqAAAAAPQxqQ5MTlQHAAAAoI9JdWByojoAAAAAfUyqA5MT1QEAAADoY1IdmJyoDgAAAECf\nbRPVgamJ6gAAAAD0qbL+BZiaqA4AAABAH+tfgMmJ6gAAAAD08aBSYHKiOgAAAAB9TKoDkxPVAQAA\nAOhjUh2YnKgOAAAAQB+T6sDkRHUAAAAA+phUByYnqgMAAADQx6Q6MDlRHQAAAIA+2yaqA1MT1QEA\nAADoU2X9CzA1UR0AAACAPta/AJMT1QEAAADo40GlwOREdQAAAAD6mFQHJieqAwAAANDHpDowOVEd\nAAAAgD4m1YHJieoAAAAA9DGpDkxOVAcAAACgj0l1YHKiOgAAAAB9TKoDkxPVAQAAAOhjUh2YnKgO\nAAAAQJ9tE9WBqYnqAAAAAPSpsv4FmJqoDgAAAEAf61+AyYnqAAAAAPTxoFJgcqI6AAAAAH1MqgOT\nE9UBAAAA6GNSHZicqA4AAABAH5PqwOREdQAAAAD6mFQHJieqAwAAANDHpDowOVEdAAAAgD7bJqoD\nUxPVAQAAAOhTZf0LMDVRHQAAAIA+VVf+Na0OTEpUBwAAAKCPqA5M7lhRvaruq6qnq+pSVT18nZ9/\nb1U9VVVPVtV/rqpXnPxRAQAAAFiCh5UCEzsyqlfVluTRJPcmeU2SB6rq1ddc9rEk94wxXpvk3yX5\nxyd9UAAAAAAWsW32qgPTOs6k+uuTXB5jPDvG+FySx5K8+eoLxhgfGmP838OXH05yx8keEwAAAIBl\nmFQHJnacqH5Hkueuev18vnQ0//YkP38zhwIAAABgYSbVgYnddpIfVlV/J8k9Sb7xxa45f/78F77e\n29vL3t7eSR4BAAAAgFudSXWg2f7+fvb390/ks2oc8Qesqt6Q5PwY477D19+fZIwxfvCa6745yY8l\n+YYxxmdf5LPGUfcDAAAAYHFf+ZXJZz6TfNVXnfZJgDOqqjLGqBt573HWv3wkyauq6mur6vYkb03y\n/msOcC7JTyR504sFdQAAAABIYlIdmNqRUX2M8UKSh5J8IMlTSR4bY1ysqkeq6v7Dy34oyVcl+bdV\ndaGq/v3OTgwAAADA3ER1YGJHrn850ZtZ/wIAAADAS1+aPPdc8rKXnfZJgDNq1+tfAAAAAODkmFQH\nJiaqAwAAANBr25KDg9M+BcANEdUBAAAA6GVSHZiYqA4AAABAL5PqwMREdQAAAAB6mVQHJiaqAwAA\nANDLpDowMVEdAAAAgF4m1YGJieoAAAAA9BLVgYmJ6gAAAAD0sv4FmJioDgAAAEAvk+rAxER1AAAA\nAHqZVAcmJqoDAAAA0MukOjAxUR0AAACAXibVgYmJ6gAAAAD0MqkOTExUBwAAAKCXSXVgYqI6AAAA\nAL1MqgMTE9UBAAAA6GVSHZiYqA4AAABAL5PqwMREdQAAAAB6ierAxER1AAAAAHpZ/wJMTFQHAAAA\noJdJdWBiojoAAAAAvUyqAxMT1QEAAADoZVIdmJioDgAAAEAvk+rAxER1AAAAAHqZVAcmJqoDAAAA\n0MukOjAxUR0AAACAXibVgYmJ6gAAAAD0EtWBiYnqAAAAAPSy/gWYmKgOAAAAQC+T6sDERHUAAAAA\neplUByYmqgMAAADQy6Q6MDFRHQAAAIBeJtWBiYnqAAAAAPQyqQ5MTFQHAAAAoJdJdWBiojoAAAAA\nvUyqAxMT1QEAAADoVWVSHZiWqA4AAABAr20zqQ5MS1QHAAAAoJf1L8DERHUAAAAAenlQKTAxUR0A\nAACAXibVgYmJ6gAAAAD0MqkOTExUBwAAAKCXSXVgYqI6AAAAAL1MqgMTE9UBAAAA6GVSHZiYqA4A\nAABAryqT6sC0RHUAAAAAem2bSXVgWqI6AAAAAL2sfwEmJqoDAAAA0MuDSoGJieoAAAAA9DKpDkxM\nVAcAAACgl0l1YGKiOgAAAAC9TKoDExPVAQAAAOhlUh2YmKgOAAAAQC+T6sDERHUAAAAAeplUByYm\nqgMAAADQy6Q6MDFRHQAAAIBeVSbVgWmJ6gAAAAD02jaT6sC0RHUAAAAAeln/AkxMVAcAAACglweV\nAhMT1QHP0zmGAAAIVElEQVQAAADoZVIdmJioDgAAAEAvk+rAxER1AAAAAHqZVAcmJqoDAAAA0Muk\nOjAxUR0AAACAXibVgYmJ6gAAAAD0qjKpDkxLVAcAAACg17aZVAemJaoDAAAA0MukOjAxUR0AAACA\nXibVgYmJ6gAAAAD08qBSYGKiOgAAAAC9ts36F2BaojoAAAAAvUyqAxMT1QEAAADoZVIdmJioDgAA\nAEAvk+rAxER1AAAAAHpVmVQHpiWqAwAAANBr20yqA9MS1QEAAADoZVIdmJioDgAAAEAvk+rAxER1\nAAAAAHp5UCkwMVEdAAAAgF7bZv0LMC1RHQAAAIBeJtWBiYnqAAAAAPQyqQ5MTFQHAAAAoJdJdWBi\nojoAAAAAvapMqgPTEtUBAAAA6LVtJtWBaYnqAAAAAPQyqQ5MTFQHAAAAoJdJdWBiojoAAAAAvUyq\nAxMT1QEAAADoZVIdmJioDgAAAECvKlEdmJaoDgAAAECvbbP+BZiWqA4AAABAL5PqwMREdQAAAAB6\nmVQHJiaqAwAAANDLpDowMVEdAAAAgF5VJtWBaYnqAAAAAPTaNpPqwLREdQAAAAB6mVQHJiaqAwAA\nANDLpDowMVEdAAAAgF4eVApMTFQHAAAAoNe2Wf8CTEtUBwAAAKCXSXVgYqI6AAAAAL1MqgMTO1ZU\nr6r7qurpqrpUVQ9f5+e3V9VjVXW5qn61ql558kcFAAAAYAkm1YGJ3XbUBVW1JXk0yTcl+VSSj1TV\n+8YYT1912bcn+d9jjDur6m8l+aEkb93FgQFuxv7+fvb29k77GMAZ5u8QcCvwtwg4TQcHB/lnH/xg\nXveZz+Tg8cdz+fLl3HnnnUmSZ555Jkly9913J8kf+NmLfX0j75nxnjOe+azcc8Yzn/Xf07bd3AKX\nGkf8V8GqekOSd40x3nj4+vuTjDHGD151zS8cXvN4VX1Fkv81xvhT1/mscdT9AHbp/PnzOX/+/Gkf\nAzjD/B0CbgX+FgGn5akLF/Ket789lz/+8fyRMfLVSV6X5EOHP39pknOHr19y1c9e7Osbec/Nvv80\n7jnjmc/KPWc881n/PX0syV+tyt8eI2OMyg04TpK/I8lzV71+/vB7171mjPFCkt+pqj9+IwcCAAAA\nYD0HBwd5z9vfnh9+8sl8doy8PMl7k/xGkpcneUWSf374+hVX/ezFvr6R99zs+0/jnjOe+azcc8Yz\nn/Xf0/9I8i+SPHCTg99Hrn+5QTdU+AEAAABY04ULF7J36VI+nuRlSf5yko8n+fyD+b7uqtfH+fpG\n3nOz7z+Ne8545rNyzxnPfNZ/T3s55kNGj3Dc9S/nxxj3Hb6+3vqXnz+85vPrXz49xvjT1/ksu18A\nAAAAADh1N7r+5TiT6h9J8qqq+tokn86VB5A+cM01/yHJ25I8nuRvJPnFkzwkAAAAAADcCo6M6mOM\nF6rqoSQfyJXp+J8aY1ysqkeSfGSM8R+T/FSSf1VVl5N8NlfCOwAAAAAALOXI9S8AAAAAAMAVJ7GX\n/YtU1X1V9XRVXaqqh6/z89ur6rGqulxVv/r/27t7EDnqMI7j35/GVKKghUJOL6A2VhEhHlgoWGmR\nA1FSCMaXSpAIliKIrZ0vhYhRNCBBUpjzDYKkEJsQYg6DiRAbNSdG8JIiahHlsdgxLufd7dxxMxd2\nvx9YmNn5szzVw28fZv6T5NblfkeS1qtFH9qT5NckXzefpzajTknjK8m+JOeSfLPKmteaPDSfZEef\n9Ukaf6P6UJL7klwYykMv9l2jpPGWZCrJkSTfJjmZZO8K68xEkjrRpg+tJxO12VN9rYVeBbwBPAD8\nDBxLcqiqvhta9jSwWFV3JNkNvIJbxkjaIC37EMCBqlo21EnSBngXeB14f7mLSR4Ebmvy0D3Am8BM\nj/VJGn+r9qHGl1W1q6d6JE2ev4Dnq2o+ybXA8SSHh/+bmYkkdWxkH2qsKRN1caf6TuBMVf1QVZeA\nA8DskjWzwHvN8UEGgy9J2iht+hCAL0+W1Jmq+go4v8qSWZpBV1UdBa5PclMftUmaDC36EJiHJHWo\nqn6pqvnm+CJwGti2ZJmZSFJnWvYhWGMm6mKovg34aej8LP8v9PKaqvobuJDkhg5qkTSZ2vQhgIeb\nxws/TDLVT2mSdNnSXrXA8r1Kkro0k+REkk+T3LnZxUgaX0m2AzuAo0sumYkk9WKVPgRrzESd7Km+\nDt4dIalvc8D2qtoBfMF/T89IkiRNiuPAdFXdxWDrvI82uR5JY6rZcuEg8Fxzp6gk9WpEH1pzJupi\nqL4ADL94dKr5bthZ4BaAJFcD11XVYge1SJpMI/tQVZ1vtoYBeBu4u6faJOlfCzR5qLFcZpKkzlTV\nxar6ozn+HLjGJ4glbbQkWxgMsvZX1aFllpiJJHVqVB9aTybqYqh+DLg9yXSSrQxeQDq3ZM3HwJ7m\n+FHgSAd1SJpcI/tQkpuHTmeBUz3WJ2lyhJWfyJsDHgdIMgNcqKpzfRUmaWKs2IeG9yxOshOINztJ\n6sA7wKmqenWF62YiSV1btQ+tJxNt2dj6BnukJ3kWOMxgaL+vqk4neRk4VlWfAPuA/UnOAL8xGHhJ\n0oZo2Yf2JtkFXAIWgSc2rWBJYynJB8D9wI1JfgReArYCVVVvVdVnSR5K8j3wO/Dk5lUraRyN6kPA\nI0meYZCH/gR2b1atksZTknuBx4CTSU4ABbwATGMmktSDNn2IdWSiVFV3VUuSJEmSJEmSNEaulBeV\nSpIkSZIkSZJ0xXOoLkmSJEmSJElSSw7VJUmSJEmSJElqyaG6JEmSJEmSJEktOVSXJEmSJEmSJKkl\nh+qSJEmSJEmSJLXkUF2SJEmSJEmSpJYcqkuSJEmSJEmS1NI/UBaOIR9CvLIAAAAASUVORK5CYII=\n" 98 | }, 99 | "output_type": "display_data", 100 | "metadata": {} 101 | } 102 | ], 103 | "source": [ 104 | "%time transmission = cal_T(10, 10, 2.5, 1.0, 1.0)" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 9, 110 | "metadata": {}, 111 | "outputs": [ 112 | { 113 | "data": { 114 | "text/plain": [ 115 | "1.7989869151531417" 116 | ] 117 | }, 118 | "execution_count": 9, 119 | "output_type": "execute_result", 120 | "metadata": {} 121 | } 122 | ], 123 | "source": [ 124 | "sigma(transmission[0], transmission[1], 1.0)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 30, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "name": "stderr", 134 | "output_type": "stream", 135 | "text": [ 136 | "/usr/lib/python3.5/site-packages/ipykernel/__main__.py:6: RuntimeWarning: overflow encountered in double_scalars\n", 137 | "/usr/lib/python3.5/site-packages/ipykernel/__main__.py:6: RuntimeWarning: invalid value encountered in double_scalars\n", 138 | "/usr/lib/python3.5/site-packages/ipykernel/__main__.py:5: RuntimeWarning: overflow encountered in double_scalars\n", 139 | "/usr/lib/python3.5/site-packages/ipykernel/__main__.py:5: RuntimeWarning: divide by zero encountered in double_scalars\n" 140 | ] 141 | }, 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "nan" 146 | ] 147 | }, 148 | "execution_count": 30, 149 | "output_type": "execute_result", 150 | "metadata": {} 151 | } 152 | ], 153 | "source": [ 154 | "sigma(transmission[0], transmission[1], 0.001)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 17, 160 | "metadata": {}, 161 | "outputs": [ 162 | { 163 | "data": { 164 | "text/plain": [ 165 | "[]" 166 | ] 167 | }, 168 | "execution_count": 17, 169 | "output_type": "execute_result", 170 | "metadata": {} 171 | }, 172 | { 173 | "data": { 174 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABdUAAAJPCAYAAACadT3NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYXnV9///XSSAsISwSCAGBKIEQkC3s4jKyiqBAQSpi\nFb/qV61FsS1FSyux9Wut+/ZDRWksKiIu7EhYdIAAAQl7EkIg7MGYgLKEJcuc3x8fxplAQobJTM4s\nj8d1neu+78zNPe/5JzrP653Pqeq6DgAAAAAAsHJDmh4AAAAAAAD6C1EdAAAAAAC6SFQHAAAAAIAu\nEtUBAAAAAKCLRHUAAAAAAOgiUR0AAAAAALpopVG9qqozq6qaV1XVHSv4+vpVVV1YVdVtVVXdWVXV\nCT0+JQAAAAAA9AFd2VSflOSQV/j6J5JMr+t61yRvS/K1qqrW6InhAAAAAACgL1lpVK/rekqSP7/S\nW5KMePH5iCSP13W9pAdmAwAAAACAPqUnNsq/m+TCqqrmJlkvyd/2wGcCAAAAAECf0xM3Kj0kya11\nXW+eZLck/19VVev1wOcCAAAAAECf0hOb6h9M8l9JUtf1fVVV3Z9k+yQ3v/SNVVXVPfD9AAAAAABg\nldR1XXXnv+tqVK9evJbnwSQHJrmuqqpRSbZLMmdFH1TXujrQnIkTJ2bixIlNjwEMcv4uAprm7yGg\naf4eApJk0aJkwYKXX/PnL//PFyxIhgxJRo7suDbe+OXPOz9uvHGy7rov/95V1a2enqQLUb2qqrOT\ntCTZuKqqh5KclmRYkrqu6zOSfCHJj6uquuPF/+Rf6rp+otsTAQAAAADQr9R18vTTJYi3R/GVPS5c\nWKL3JpuUCN7+OHJksu22yb77drzeZJMVB/LVbaVRva7r967k64+lnKsOAAAAAMAAUNfJX/7SEcnb\nrz/96eV/1n4NG9YRwNuv9tfjxr08nm+4YbIKC+ON6Ykz1QH6jZaWlqZHAPB3EdA4fw8BTfP3EKx+\nnTfJ//Snjjj+0uftjwsWJOusUwL4ppsuG8q32irZffeO15tuWiL5Ous0/VOuHtXqPOO8qqrameoA\nAAAAAKtu0aISwefN64jj7ddL/2z+/GTNNZeN5JtuuuLnI0cma63V9E/Ye6qq6vaNSkV1AAAAAIA+\noH2bvD2Iz5vXcS0vlj/zTIngo0Z1RPHO16hRy0b0vnAeeV8hqgMAAAAA9EF1nfz5zx1x/I9/XHE0\nnzcvGTq0xPD2qz2Otz92DugbbpgMGdL0T9g/ieoAAAAAAKtJ+008O0fyFT3/05/KWeOjRiWbbbb8\nYN759fDhTf90g4OoDgAAAACwip57rsTwlV3z5iXDhiWjR3cE8c7B/KXxfO21m/7JeClRHQAAAABg\nOdrakscfLzH8scc6Hjs/b4/lL7zQEcQ322zF16hRzifv70R1AAAAAGBQWby4bIw/9lgyd+7LQ3n7\n83nzkhEjSgwfPbrjcXnPN9ggqbqVWelvRHUAAAAAYEB44YUSwzuH8peG87lzy80/N9mkI4qPHp1s\nvvnLQ/lmmyVrrdX0T0VfI6oDAAAAAH1a+2b53LmvfD31VDlepT2SvzSatz/fdNNk6NCmfyr6K1Ed\nAAAAAGhE+5nljz5arrlzOx47X48/XkJ4exxf0TVyZDJkSNM/FQOdqA4AAAAA9Lhnn+2I5Z2Deefn\njz2WrLdessUWJYpvscWyz9tjuc1y+hJRHQAAAADosrpedrv8kUeW//zZZ18ey1/6evToZJ11mv6J\n4NUR1QEAAACAJOU4lnnzShxf0TV3brL22iWKv/a1HYG8/Xn748YbJ1W3siP0baI6AAAAAAwCS5cm\nf/xjCeMPP7z8YP7YY8mGG5Yw/tKrczAfPrzpnwaaI6oDAAAAQD/X1pbMn19i+fKuRx4pQf01rylh\nfMstlw3m7a833zxZa62mfxro20R1AAAAAOjjnnwyeeihcj388LLPH364nGE+YkSJ4yu6ttgiGTas\n6Z8E+j9RHQAAAAAatGhRieLLi+btr5cuTbbaquNqD+Xtz1/7Wjf8hNVFVAcAAACAXvSXv5Q4/uCD\ny39csCDZbLNlg/lLn2+4oZt+Ql8hqgMAAABAN7W1lbPKH3xw2atzNG9rS7beulxbbfXyx803T4YO\nbfonAbpKVAcAAACAFViypBzN8uCDyQMPdETz9ucPP5xssEEyZsyKw7ktcxhYRHUAAAAABq0lS5JH\nHimR/P77y2P79eCDyWOPJZts0hHNO8fzMWNKOHeWOQwuojoAAAAAA9bSpWXTfHnR/P77SzQfNaoE\n8jFjkte9riOYjxlTbgA6bFhz8wN9j6gOAAAAQL9V18mf/lQCefs1Z07H80cf7dg0b4/m7c/HjCk3\nAhXNgVdDVAcAAACgT3v66WVD+UuvddYpsbzz9frXl8ettkrWWqvpnwAYSER1AAAAABrVfkTLnDnL\nXvfdVx4XLlw2lL/0Wn/9pn8CYDAR1QEAAADodc88s2wo73w9+GAycmSJ5su7Ro1Kqm7lK4CeJ6oD\nAAAAsMrqOpk/v0Tz5V1PPVUC+TbbvDyajxlTjnAB6A9EdQAAAAC6pK0teeSR5N57y/XScL7mmiWa\nt19jx3Y8Hz3atjkwMIjqAAAAAPzVkiXJww+XaD57dkdAv/feclPQjTdeNph3Ducbbtj09AC9T1QH\nAAAAGGSWLCnnmN9zz7LR/N57y5+PGlVieedr223LUS3rrtv09ADNEtUBAAAABqC2trJxPnt2ue65\np+N5ezjfdtuOqz2ev+51zjcHeCWiOgAAAEA/VdfJH/9YgnnnaH7PPcmcOclrXlOC+XbbLRvQt9km\nWXvtpqcH6J9EdQAAAIA+7qmnOmL5rFkdEf2ee0ocb4/mneP52LHJ8OFNTw4w8IjqAAAAAH3A4sVl\nu/yl4XzWrBLV26P5dtsl48Z1PN9oo6YnBxhcRHUAAACA1ejxx0sov/vuZR8feCDZfPMSzDtH83Hj\nki22SIYMaXpyABJRHQAAAKDHLVlSts7bg3nneL5oUQnl22/fEdC3374c1+Kcc4C+T1QHAAAA6KZn\nnimhfObMEs3bH+fMSUaP7gjnnQP6ZpslVbdSDAB9gagOAAAA8ArqOpk/vwTzzvF85sxkwYJy1vn4\n8eXafvvyuO22yTrrND05AL1BVAcAAABIieePPJLMmFGumTM7HpNlo3n78623ToYObXZuAFYvUR0A\nAAAYVNrayk1B2+N5ezifOTNZb71khx1KNN9hh47nm2ziyBYAClEdAAAAGJCWLk3uvz+ZPr3jmjEj\nueeeZOTIZcN5ezzfaKOmpwagrxPVAQAAgH6tffO8czyfPr3cQHSTTZIddyzXDjuUx+23T0aMaHpq\nAPorUR0AAADoF+o6efjh5K67OsL5XXeVG4dutFFHPN9xx+QNbyib5+I5AD1NVAcAAAD6nAULSjC/\n667kzjs7ng8fXoJ554C+ww7JBhs0PTEAg4WoDgAAADRm4cKOjfPO8fy550o832mn8th+bbxx0xMD\nMNiJ6gAAAECvW7o0ue++5I47ynXnneXxscfKGecvDeivfW1SdStXAEDvEtUBAACAHjV/fkc0b3+c\nMSMZNSrZeecSz9sfx45N1lij6YkBoOtEdQAAAKBbFi1KZs7s2D5vv557btl4vvPOZfvcTUMBGAhE\ndQAAAGClFixIbr992euee5IxY0o032WXjpC+5ZaObgFg4BLVAQAAgL9aujSZPbsjnN92W3lcuLAj\nnu+yS7LrrsmOOybrrNP0xACweonqAAAAMEg9+2w5ruW225Jbby2Pd92VbLZZRzhvj+hbb237HAAS\nUR0AAAAGhQULSjhvj+e33po8+GAyfnyy224loO+6a9lGX3/9pqcFgL6rV6N6VVVnJjk8yby6rnde\nwXtaknwjyZpJ5td1/bYVvE9UBwAAgJWo6+SBB14e0J95pkTz3XbriOjjxydrrtn0xADQv/R2VH9T\nkmeSnLW8qF5V1QZJrk9ycF3Xj1ZVNbKu6wUr+CxRHQAAADppayvnn99yy7LX8OEd8bw9oI8Z4/gW\nAOgJvX78S1VVWye5aAVR/eNJRtd1/bkufI6oDgAAwKC1ZEkyc+ay8fy225JNNkl23z2ZMKFcu+2W\nbLpp09MCwMC1KlF9jR74/tslWbOqqt8nWS/Jt+u6/kkPfC4AAAD0W4sXlxuGTptWrltuKa+33LIj\nnh9xRAnoG23U9LQAQFf1RFRfI8mEJPsnGZ7khqqqbqjr+t4e+GwAAADo8xYvTmbMKPH85pvLNX16\n8rrXlQ303XdPjj8+2WWXZMSIpqcFAFZFT0T1R5IsqOv6+STPV1V1TZJdkiw3qk+cOPGvz1taWtLS\n0tIDIwAAAMDq0X6ES3tAnzYtueOOZKutkj32KNd731vOQF9vvaanBQCSpLW1Na2trT3yWV09U31M\nypnqOy3na9sn+U6StydZK8mNSf62rusZy3mvM9UBAADoN9pvIvqHP5Tr5puT229PttiixPPddy+P\nu+1mAx0A+pNePVO9qqqzk7Qk2biqqoeSnJZkWJK6rusz6rq+u6qqyUnuSLI0yRnLC+oAAADQl9V1\n8sgjJZ7fdFN5nDatnHe+557lOuqoEtA32KDpaQGApnRpU73HvplNdQAAAPqIxx/v2EBvj+h13RHQ\n269NNml6UgCgp63KprqoDgAAwID33HPJrbcmN95YrptuShYsKEe3dA7oW22VVN369RoA6E9EdQAA\nAHhRW1tyzz0d8fzGG5MZM5Lx45O99y7XXnsl48YlQ4Y0PS0A0ARRHQAAgEFr/vyODfQbbyzHuGy4\nYUc833vvZMKEZJ11mp4UAOgrRHUAAAAGhUWLkttvT264IZk6tVxPPFGObum8hT5qVNOTAgB9magO\nAADAgDR3bgnnN9xQrttuS17/+mTffZN99imXY1wAgFdLVAcAAKDfW7So3Ey0fQv9hhuSZ54p4Xzf\nfcu1557J+us3PSkA0N+J6gAAAPQ7f/xjcv31Hdfttyfbbtuxhb7vvuV11a1fdwEAVkxUBwAAoE9b\nujSZPr3E8+uuK49PPFHC+X77dWyhjxjR9KQAwGAgqgMAANCnPP10cuONHQF96tRy89D99kve+Mby\nuP32zkIHAJohqgMAANCohx9Orr22I6LPnp3stltHQN9332STTZqeEgCgENUBAABYbdrakhkzkilT\nSkifMiV57rnkTW8qAX2//ZIJE5Jhw5qeFABg+UR1AAAAes0LLyQ331zi+ZQpZRt9441LRG+/ttvO\nDUUBgP5DVAcAAKDHPPlkOcKlfQv9lluSceOSN7+5Yxt99OimpwQA6D5RHQAAgG6bP7/E86uvTq65\nppyHvueeHRF9n32SESOanhIAoOeI6gAAAHTZo4+WeN5+PfJI2T5/y1vKtccezkMHAAY2UR0AAIDl\nquvk/vuXjeh/+UtHQH/LW5JddkmGDm16UgCA1UdUBwAAIEmJ6Pfdl7S2luvqq5OlS5O3vrUjoo8f\nnwwZ0vSkAADNEdUBAAAGqbpO5szpiOitrUlbW/K2tyUtLeXaZpuk6tavjAAAA5OoDgAAMEi0H+fS\n2pr8/vcdEb2lpSOki+gAAK9MVAcAABjAHnigBPT2iL5kybIRfexYER0A4NUQ1QEAAAaQP/6xBPTf\n/S656qpk4cJk//07Ivq224roAACrQlQHAADox/7857KB/rvflWvu3BLP99+/XDvsIKIDAPQkUR0A\nAKAfWbgwufbajog+a1ay334dEX233ZKhQ5ueEgBg4BLVAQAA+rDFi5ObbkquvLJct96aTJiQHHBA\nieh7750MG9b0lAAAg4eoDgAA0IfUdTJzZkdEv/rq5PWvTw48sFxvelMyfHjTUwIADF6iOgAAQMMe\ne6zcVPSKK0pIX2ON5KCDyrX//skmmzQ9IQAA7UR1AACA1ezpp5NrrikB/Yorys1F3/a2sol+0EHJ\nNtu4uSgAQF8lqgMAAPSytrZyFvrkycnllyfTpiV77tlxpMvuu7u5KABAfyGqAwAA9IK5c8sW+uTJ\n5XHkyOSQQ5KDD07e+lbnogMA9FeiOgAAQA94/vnk2ms7ttEffTQ54IAS0Q8+ONlqq6YnBACgJ4jq\nAAAA3VDXycyZJaJPnpxcd12y884d2+h77ulIFwCAgUhUBwAA6KKnnkquuiq57LLkt79NhgxJ3v72\nEtH33z/ZcMOmJwQAoLeJ6gAAACtQ18ldd5WA/tvfJjffnOy7b3LooeUaNy6puvXrFAAA/ZWoDgAA\n0MmTTyZXXlki+mWXJcOGdUT0t73NDUYBAAY7UR0AABjU6jq5446ObfRbbkn2268jpG+7rW10AAA6\niOoAAMCgs3BhORv9kkuSSy8t2+jveEeJ6C0tybrrNj0hAAB9lagOAAAMCvffXyL6xRcn112X7Lln\ncthh5XI2OgAAXSWqAwAAA9Lixcn115eIfsklyeOPl230ww5LDjoo2WCDpicEAKA/EtUBAIABY/78\nci76JZckV1yRvP71JaIffniy++7JkCFNTwgAQH8nqgMAAP1WXSczZyYXXZRceGEyfXpywAElpB96\naDJ6dNMTAgAw0IjqAABAv7J4cTJlSonoF12ULFqUvOtdyTvfWW4yutZaTU8IAMBAtipRfY2eHgYA\nAGB5/vKX5LLLSki/7LJkm21KSP/Vr5JddnGTUQAA+geb6gAAQK+ZM6djG/0Pf0je8pYS0g8/PNl8\n86anAwBgsHL8CwAA0CfUdTJtWnL++eVasKAE9He+MznwwGT48KYnBAAAUR0AAGjQ4sXJNdd0hPR1\n1kmOOio54ohkn32SIUOanhAAAJblTHUAAGC1euaZZPLkEtEvvTQZOzY58sjk8suT7bd3PjoAAAOX\nTXUAAKBL5s8v56Off35y9dVlC/3II8sZ6a99bdPTAQBA1zn+BQAA6BUPPJCcd1657rgjOfjgEtLf\n8Y5kww2bng4AALpHVAcAAHrMrFnJr39droceKmejH3VUcsABydprNz0dAACsOlEdAADotrouW+i/\n/nXym98kf/5ziehHH528+c3JGu7EBADAACOqAwAAr0pbW/KHP3SE9KVLS0Q/+uhk772TIUOanhAA\nAHrPqkR1OycAADBILF2aTJlSQvp55yXrrVci+i9/mey6a1J161cKAAAYXER1AAAYwJYuTa65poTz\nX/862XzzEtIvvzwZP77p6QAAoP9ZaVSvqurMJIcnmVfX9c6v8L49k1yf5G/ruv5Nz40IAAC8Gi8N\n6VtskRx7bHLddcnYsU1PBwAA/VtXNtUnJflOkrNW9IaqqoYk+VKSyT00FwAA8CoI6QAAsHqsNKrX\n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\n" 175 | }, 176 | "output_type": "display_data", 177 | "metadata": {} 178 | } 179 | ], 180 | "source": [ 181 | "fig = plt.figure(1)\n", 182 | "fig.set_size_inches(26, 10)\n", 183 | "plt.plot(linspace(0.05,1,100),[sigma(transmission[0], transmission[1], t) for t in linspace(0.05,1,100)])" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 18, 189 | "metadata": {}, 190 | "outputs": [], 191 | "source": [ 192 | "from numpy import pi" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": 19, 198 | "metadata": {}, 199 | "outputs": [ 200 | { 201 | "data": { 202 | "text/plain": [ 203 | "3.141592653589793" 204 | ] 205 | }, 206 | "execution_count": 19, 207 | "output_type": "execute_result", 208 | "metadata": {} 209 | } 210 | ], 211 | "source": [ 212 | "pi" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 22, 218 | "metadata": {}, 219 | "outputs": [ 220 | { 221 | "ename": "OverflowError", 222 | "evalue": "(34, 'Numerical result out of range')", 223 | "output_type": "error", 224 | "traceback": [ 225 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 226 | "\u001b[1;31mOverflowError\u001b[0m Traceback (most recent call last)", 227 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0me\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.001\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 228 | "\u001b[1;31mOverflowError\u001b[0m: (34, 'Numerical result out of range')" 229 | ] 230 | } 231 | ], 232 | "source": [ 233 | "e**((1)/(0.001))" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 32, 239 | "metadata": {}, 240 | "outputs": [ 241 | { 242 | "ename": "ZeroDivisionError", 243 | "evalue": "float division by zero", 244 | "output_type": "error", 245 | "traceback": [ 246 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 247 | "\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", 248 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;36m1\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.001\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 249 | "\u001b[1;31mZeroDivisionError\u001b[0m: float division by zero" 250 | ] 251 | } 252 | ], 253 | "source": [ 254 | "1/(e**(-1/0.001))" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 35, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "text/plain": [ 265 | "3.7200759760208555e-44" 266 | ] 267 | }, 268 | "execution_count": 35, 269 | "output_type": "execute_result", 270 | "metadata": {} 271 | } 272 | ], 273 | "source": [ 274 | "e**(-1/0.01)" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": null, 280 | "metadata": {}, 281 | "outputs": [], 282 | "source": [ 283 | "" 284 | ] 285 | } 286 | ], 287 | "metadata": { 288 | "kernelspec": { 289 | "display_name": "Python 3", 290 | "language": "python", 291 | "name": "python3" 292 | }, 293 | "language_info": { 294 | "codemirror_mode": { 295 | "name": "ipython", 296 | "version": 3.0 297 | }, 298 | "file_extension": ".py", 299 | "mimetype": "text/x-python", 300 | "name": "python", 301 | "nbconvert_exporter": "python", 302 | "pygments_lexer": "ipython3", 303 | "version": "3.5.0" 304 | } 305 | }, 306 | "nbformat": 4, 307 | "nbformat_minor": 0 308 | } -------------------------------------------------------------------------------- /two_lead/one_atom_line.py: -------------------------------------------------------------------------------- 1 | ## 2 | from environment import * 3 | from two_lead.phonon_GF import Phonon 4 | f = 1.0 5 | omega = 1.5 6 | D00 = matrix([2*f]) 7 | D11 = matrix([2*f]) 8 | D22 = matrix([2*f]) 9 | D33 = matrix([2*f]) 10 | D44 = matrix([2*f]) 11 | D55 = matrix([2*f]) 12 | D66 = matrix([2*f]) 13 | D77 = matrix([2*f]) 14 | Dl00 = matrix([2*f]) 15 | Dl01 = matrix([-f]) 16 | Dl11 = matrix([2*f]) 17 | Dr00 = matrix([2*f]) 18 | Dr01 = matrix([-f]) 19 | Dr11 = matrix([2*f]) 20 | D01 = matrix([-f]) 21 | D12 = matrix([-f]) 22 | D23 = matrix([-f]) 23 | D34 = matrix([-f]) 24 | D45 = matrix([-f]) 25 | D56 = matrix([-f]) 26 | D67 = matrix([-f]) 27 | Dlcl = matrix([-f]) 28 | Dlcr = matrix([-f]) 29 | D = {'on_site': [D00, D11, D22, D33, D44, D55, D66, D77], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 30 | 'couple': [D01, D12, D23, D34, D45, D56, D67], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 31 | system = Phonon(D, omega) 32 | system.cal_surface_GF() 33 | system.cal_self_energy() 34 | system.cal_GF(flag='all') 35 | system.cal_T() 36 | print(system.T) 37 | print('------------------') 38 | print(system.GF['center'][0]) 39 | print('------------------') 40 | print(system.GF['center'][7]) 41 | ## -------------------------------------------------------------------------------- /two_lead/phonon_GF.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | 3 | 4 | class Phonon(object): 5 | 6 | def __init__(self, D, omega, delta=0.000001): 7 | 8 | """ 9 | D should be a dictionary, the format is: 10 | D = {'on_site': [D00, D11, D22, D33 ...], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 11 | 'couple': [D01, D12, D23 ...], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 12 | """ 13 | self.D = D 14 | self.omega = omega 15 | # size of primitive cells in left/right lead and center area 16 | self.size = {'l': D['lead']['l'][0].shape[0], 'r': D['lead']['r'][0].shape[0], 17 | 'c': D['on_site'][0].shape[0]} 18 | # the number of cells in center area 19 | self.length = len(D['on_site']) 20 | # self.GF is used to store green's function of any type 21 | self.GF = {'surface': {'l': None, 'r': None}, 22 | 'center': [0]*self.length, 'through': None} 23 | # store self_energy of leads 24 | self.self_energy = {'l': None, 'r': None} 25 | # self.delta is used in (omega + i delta)^2 to calculate green's function 26 | self.delta = delta 27 | # store transmission probability 28 | self.T = None 29 | 30 | def M(self, i, j): 31 | if i == j: 32 | return (self.omega + 1j*self.delta)**2*eye(self.size['c']) - self.D['on_site'][i] 33 | if i + 1 == j: 34 | return -self.D['couple'][i] 35 | if i == j + 1: 36 | return -self.D['couple'][j].H 37 | 38 | def cal_surface_GF(self, epsilon=0.000001): 39 | """ 40 | calculate surface green's function 41 | """ 42 | omega = self.omega 43 | for lead in ('l', 'r'): 44 | I = eye(self.size[lead]) 45 | Ws = ((omega + 1j*self.delta)**2)*I - self.D['lead'][lead][0] 46 | Wb = ((omega + 1j*self.delta)**2)*I - self.D['lead'][lead][2] 47 | tau1 = self.D['lead'][lead][1] 48 | tau2 = tau1.T 49 | while abs(tau1).max() > epsilon: 50 | Wb_I = Wb.I 51 | Ws = Ws - tau1*Wb_I*tau2 52 | Wb = Wb - tau1*Wb_I*tau2 - tau2*Wb_I*tau1 53 | tau1 = tau1*Wb_I*tau1 54 | tau2 = tau1.T 55 | self.GF['surface'][lead] = Ws.I 56 | 57 | def cal_self_energy(self): 58 | """ 59 | calculate self energy. Surface green's function must be calculated first 60 | """ 61 | for lead in ('l', 'r'): 62 | self.self_energy[lead] = \ 63 | self.D['lead_center'][lead]*self.GF['surface'][lead]*self.D['lead_center'][lead].T 64 | 65 | def cal_GF(self, flag = 'minimal'): 66 | """ 67 | calculate green's function for center area. Self energy of leads must be calculated first 68 | :param flag: minimal: calculate only G_NN, 'center': calculate all G_ii, 'through': calculate G_1N, 69 | 'all': all green's function 70 | """ 71 | from operator import mul 72 | length = self.length 73 | g = [0]*length 74 | # forward iterating 75 | if length == 1: 76 | g[0] = (self.M(0, 0) - self.self_energy['l'] - self.self_energy['r']).I 77 | else: 78 | g[0] = (self.M(0, 0) - self.self_energy['l']).I 79 | for j in range(1, length - 1): 80 | g[j] = (self.M(j, j) - 81 | self.M(j, j-1)*g[j-1]*self.M(j-1, j)).I 82 | g[self.length - 1] = ( 83 | self.M(length - 1, length - 1) - self.self_energy['r'] - 84 | self.M(length - 1, length - 2)*g[length - 2]*self.M(length - 2, length - 1) 85 | ).I 86 | G = self.GF['center'] 87 | G[self.length - 1] = g[self.length - 1] 88 | # calculate more green's function according to the flag 89 | # backward iterating 90 | if flag == 'center' or flag == 'all': 91 | for j in list(range(self.length - 1))[::-1]: 92 | G[j] = g[j] + g[j]*self.M(j, j+1)*G[j+1]*self.M(j+1, j)*g[j] 93 | if flag == 'through' or flag == 'all': 94 | self.GF['through'] = reduce(mul, [g[j]*-self.M(j, j+1) for j in range(length - 1)], 1)*g[self.length - 1] 95 | 96 | def cal_T(self): 97 | """ 98 | calculating transmission probability 99 | """ 100 | gamma_r = 1j*(self.self_energy['r'] - self.self_energy['r'].H) 101 | gamma_l = 1j*(self.self_energy['l'] - self.self_energy['l'].H) 102 | self.T = trace(gamma_r*self.GF['through'].H*gamma_l*self.GF['through']) 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /two_lead/random_line.py: -------------------------------------------------------------------------------- 1 | from environment import * 2 | omega = 0.5 3 | n = 20 4 | m = 100 5 | out = 1 6 | g = rand(n, m-7) 7 | tmp = zeros((n, 3)) 8 | tmp.fill(out) 9 | g = concatenate((tmp, g, tmp), axis=1) 10 | #g.fill(1) 11 | f = rand(n-1, m-6) 12 | tmp = zeros((n-1, 3)) 13 | tmp.fill(out) 14 | f = concatenate((tmp, f, tmp), axis=1) 15 | #f.fill(1) 16 | D_self = [] 17 | for i in range(m): 18 | D_self += [matrix(zeros((2*n,2*n)))] 19 | D_couple = [] 20 | for i in range(m-1): 21 | D_couple += [matrix(zeros((2*n,2*n)))] 22 | for j in range(m): 23 | for i in range(n): 24 | if i < n-1: 25 | D_self[j][2*i+1, 2*i+3] = -f[i, j] 26 | D_self[j][2*i+3, 2*i+1] = -f[i, j] 27 | if i == 0 or i == n-1: 28 | D_self[j][1, 1] = f[0, j] 29 | D_self[j][2*n-1, 2*n-1] = f[n-2, j] 30 | else: 31 | D_self[j][2*i + 1, 2*i + 1] = f[i-1, j] + f[i, j] 32 | if j == 0: 33 | D_self[j][2*i, 2*i] = g[i, j] 34 | elif j == m-1: 35 | D_self[j][2*i, 2*i] = g[i, j-1] 36 | else: 37 | D_self[j][2*i, 2*i] = g[i, j-1] + g[i, j] 38 | for j in range(m-1): 39 | for i in range(n): 40 | D_couple[j][2*i, 2*i] = - g[i, j] 41 | D = {'on_site': D_self[3: m-3], 'lead': {'l': [D_self[2], D_couple[1], D_self[1]], 'r': [D_self[m-3], D_couple[m-3], D_self[m-2]]}, 42 | 'couple': D_couple[3: m-4], 'lead_center': {'l': D_couple[2], 'r': D_couple[m-4]}} -------------------------------------------------------------------------------- /two_lead/skeleton-parrallel.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | from datetime import datetime 3 | 4 | from scoop import futures 5 | 6 | from environment import * 7 | from two_lead.phonon_GF import Phonon 8 | from two_lead.random_line import D 9 | 10 | N = 100 11 | omega_range = linspace(0.00000001, 5, N) 12 | 13 | start_time = datetime.now() 14 | def cal_T(omega): 15 | system = Phonon(D, omega) 16 | system.cal_surface_GF() 17 | system.cal_self_energy() 18 | system.cal_GF(flag='all') 19 | system.cal_T() 20 | return system.T.real 21 | 22 | if __name__ == '__main__': 23 | data = list(futures.map(cal_T, omega_range)) 24 | file = open('data.dat','wb') 25 | pickle.dump(data, file) 26 | file.close() 27 | print(datetime.now() - start_time) 28 | 29 | -------------------------------------------------------------------------------- /two_lead/skeleton.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from environment import * 4 | from two_lead.one_atom_line import D 5 | from two_lead.phonon_GF import Phonon 6 | 7 | N = 500 8 | omega_range = linspace(0.00000001, 3, N) 9 | T = zeros(N) 10 | start_time = datetime.now() 11 | for i in range(N): 12 | omega = omega_range[i] 13 | system = Phonon(D, omega) 14 | system.cal_surface_GF() 15 | system.cal_self_energy() 16 | system.cal_GF(flag='all') 17 | system.cal_T() 18 | T[i] = system.T.real 19 | print(datetime.now() - start_time) 20 | plt.plot(omega_range, T, 'ro-') 21 | plt.show() -------------------------------------------------------------------------------- /two_lead/two_atom_line.py: -------------------------------------------------------------------------------- 1 | ## 2 | from environment import * 3 | from two_lead.phonon_GF import Phonon 4 | f = 1.0 5 | omega = 1.5 6 | N = 100 7 | D_self = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 8 | D_couple = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 9 | Dl00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 10 | Dl01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 11 | Dl11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 12 | Dr00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 13 | Dr01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 14 | Dr11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 15 | Dlcl = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 16 | Dlcr = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 17 | 18 | D00 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 19 | D11 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 20 | D22 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 21 | D33 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 22 | D44 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 23 | D55 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 24 | D66 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 25 | D77 = matrix([[2*f, 0, 0, 0], [0, f, 0, -f], [0, 0, 2*f, 0], [0, -f, 0, f]]) 26 | D01 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 27 | D12 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 28 | D23 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 29 | D34 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 30 | D45 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 31 | D56 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 32 | D67 = matrix([[-f, 0, 0, 0], [0, 0, 0, 0], [0, 0, -f, 0], [0, 0, 0, 0]]) 33 | 34 | # D = {'on_site': [D_self for i in range(N)], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 35 | # 'couple': [D_couple for i in range(N-1)], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 36 | D = {'on_site': [D00, D11, D22, D33, D44, D55, D66, D77], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 37 | 'couple': [D01, D12, D23, D34, D45, D56, D67], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 38 | # D = {'on_site': [D00, D11], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]}, 39 | # 'couple': [D01], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 40 | test = Phonon(D, omega, 0.0000000000000001) 41 | test.cal_surface_GF(0.000001) 42 | test.cal_self_energy() 43 | test.cal_GF(flag='all') 44 | test.cal_T() 45 | print(test.GF['center'][0]) 46 | print('--------------------------------------') 47 | print(test.GF['center'][7]) 48 | print('--------------------------------------') 49 | print(test.T) 50 | ## --------------------------------------------------------------------------------