for i, V in enumerate(coupling_values): print 'calculating rates for coupling ' + str(V) rates = [] for delta_E in delta_E_values: evals, evecs = utils.sorted_eig(hamiltonian(delta_E, V)) print evals exciton_reorg_energies = np.array([ os.exciton_reorg_energy(exciton, [reorg_energy, reorg_energy]) for exciton in evecs ]) print exciton_reorg_energies rates.append( os.modified_redfield_rates_general( evals, evecs, np.array([g_site, scaling * g_site]), np.array([g_site_dot, scaling * g_site_dot]), np.array([g_site_dot_dot, scaling * g_site_dot_dot]), np.array([reorg_energy, scaling * reorg_energy]), temperature, time)[0][0, 1]) #rates.append(os.MRT_rates(hamiltonian(delta_E, V), np.array([reorg_energy, reorg_energy]), cutoff_freq, temperature, None)[0,1]) plt.subplot(1, coupling_values.size, i + 1) rates_data.append(rates) plt.loglog(delta_E_values, np.array(rates) * utils.WAVENUMS_TO_INVERSE_PS, label=V) # plot extracted data from Ed's thesis # xdata, ydata = np.loadtxt('../../data/thieved_data'+str(i)+'.txt', delimiter=', ', unpack=True) # plt.loglog(xdata, ydata, color='red') #s = interp.UnivariateSpline(xdata, ydata, k=2, s=None) #plt.loglog(xdata, s(xdata), color='red')
time = np.linspace(0, time_interval, int(time_interval*2000)) lbf_coeffs = os.lbf_coeffs(reorg_energy, cutoff_freq, temperature, None, 0) g_site = os.site_lbf_ed(time, lbf_coeffs) g_site_dot = os.site_lbf_dot_ed(time, lbf_coeffs) g_site_dot_dot = os.site_lbf_dot_dot_ed(time, lbf_coeffs) scaling = 1. for i,V in enumerate(coupling_values): print 'calculating rates for coupling ' + str(V) rates = [] for delta_E in delta_E_values: evals, evecs = utils.sorted_eig(hamiltonian(delta_E, V)) print evals exciton_reorg_energies = np.array([os.exciton_reorg_energy(exciton, [reorg_energy, reorg_energy]) for exciton in evecs]) print exciton_reorg_energies rates.append(os.modified_redfield_rates_general(evals, evecs, np.array([g_site, scaling*g_site]), np.array([g_site_dot,scaling*g_site_dot]), np.array([g_site_dot_dot,scaling*g_site_dot_dot]), np.array([reorg_energy,scaling*reorg_energy]), temperature, time)[0][0,1]) #rates.append(os.MRT_rates(hamiltonian(delta_E, V), np.array([reorg_energy, reorg_energy]), cutoff_freq, temperature, None)[0,1]) plt.subplot(1, coupling_values.size, i+1) rates_data.append(rates) plt.loglog(delta_E_values, np.array(rates)*utils.WAVENUMS_TO_INVERSE_PS, label=V) # plot extracted data from Ed's thesis # xdata, ydata = np.loadtxt('../../data/thieved_data'+str(i)+'.txt', delimiter=', ', unpack=True) # plt.loglog(xdata, ydata, color='red') #s = interp.UnivariateSpline(xdata, ydata, k=2, s=None) #plt.loglog(xdata, s(xdata), color='red') plt.xlabel(r'$\Delta E$ (cm$^{-1}$)') plt.ylabel(r'rate') plt.ylim(0.01, 200) plt.xlim(5,1000)
]) # print evals - exciton_reorg_energies # evals,evecs = utils.sort_evals_evecs(evals-exciton_reorg_energies, evecs) # print evals # MRT_rates2 = os.modified_redfield_rates_general_unordered(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) # # liouvillian2 = MRT_rates2 - np.diag(np.sum(MRT_rates2, axis=0)) # # print evals # print MRT_rates2 print evals - exciton_reorg_energies #MRT_rates,evals,evecs = os.modified_redfield_rates_general(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) MRT_rates = os.modified_redfield_rates_general( evals - exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time)[0] print evals print MRT_rates # time evolution liouvillian = MRT_rates - np.diag(np.sum(MRT_rates, axis=0)) # print liouvillian # for col in liouvillian.T: # print np.sum(col) init_state = np.array([1., 0, 0, 0, 0, 0]) dv_dynamics = te.liouvillian_time_evolution(init_state, liouvillian, duration, time_step)
1.5*total_site_reorg_energy]) MRT_rates2 = os.modified_redfield_rates_general_unordered(evals-exciton_reorg_energies, evecs, np.array([lbf,lbf,lbf,lbf,lbf,lbf,1.5*lbf]), \ np.array([lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,1.5*lbf_dot]), \ np.array([lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,1.5*lbf_dot_dot]), \ reorgs,\ temperature, time) liouvillian2 = MRT_rates2 - np.diag(np.sum(MRT_rates2, axis=0)) print evals print MRT_rates2 MRT_rates, evals, evecs = os.modified_redfield_rates_general( evals - exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) print evals print MRT_rates MRT_rates3,evals,evecs = os.modified_redfield_rates_general(evals, evecs,\ np.array([lbf,lbf,lbf,lbf,lbf,lbf,1.5*lbf]),\ np.array([lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,1.5*lbf_dot]),\ np.array([lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,1.5*lbf_dot_dot]),\ reorgs,\ temperature, time) print MRT_rates3 # time evolution liouvillian = MRT_rates - np.diag(np.sum(MRT_rates, axis=0))
lbf = os.site_lbf_ed(time, lbf_coeffs) lbf_dot = os.site_lbf_dot_ed(time, lbf_coeffs) lbf_dot_dot = os.site_lbf_dot_ed(time, lbf_coeffs) np.savez(lbf_fn, lbf=lbf, lbf_dot=lbf_dot, lbf_dot_dot=lbf_dot_dot, time=time) print 'Calculating MRT rates at ' + str(time_utils.getTime()) MRT_rates = np.zeros(energy_gap_values.size) for i, H in enumerate(hamiltonians): evals, evecs = utils.sorted_eig(H) MRT_rates[i] = os.modified_redfield_rates_general(evals, evecs, lbf, lbf_dot, lbf_dot_dot, reorg_energy, temperature, time)[0][0, 1] # define function for HEOM calculation pool def HEOM_calculation(hamiltonian): reorg_energy = 100. cutoff_freq = 53. temperature = 300. init_state = np.array([[1., 0], [0, 0]]) duration = 5. time_step = 0.00005 hs = HierarchySolver(hamiltonian, reorg_energy, cutoff_freq, temperature)
data = np.load(lbf_fn) lbf = data['lbf'] lbf_dot = data['lbf_dot'] lbf_dot_dot = data['lbf_dot_dot'] except IOError: lbf_coeffs = os.lbf_coeffs(reorg_energy, cutoff_freq, temperature, None, num_expansion_terms) lbf = os.site_lbf_ed(time, lbf_coeffs) lbf_dot = os.site_lbf_dot_ed(time, lbf_coeffs) lbf_dot_dot = os.site_lbf_dot_ed(time, lbf_coeffs) np.savez(lbf_fn, lbf=lbf, lbf_dot=lbf_dot, lbf_dot_dot=lbf_dot_dot, time=time) print 'Calculating MRT rates at ' + str(time_utils.getTime()) MRT_rates = np.zeros(energy_gap_values.size) for i,H in enumerate(hamiltonians): evals,evecs = utils.sorted_eig(H) MRT_rates[i] = os.modified_redfield_rates_general(evals, evecs, lbf, lbf_dot, lbf_dot_dot, reorg_energy, temperature, time)[0][0,1] # define function for HEOM calculation pool def HEOM_calculation(hamiltonian): reorg_energy = 100. cutoff_freq = 53. temperature = 300. init_state = np.array([[1., 0], [0, 0]]) duration = 5. time_step = 0.00005 hs = HierarchySolver(hamiltonian, reorg_energy, cutoff_freq, temperature) HEOM_history, time = hs.hierarchy_time_evolution(init_state, 18, time_step, duration) return HEOM_history
exciton_reorg_energies = np.array([os.exciton_reorg_energy(exciton, site_reorg_energies) for exciton in evecs]) # print evals - exciton_reorg_energies # evals,evecs = utils.sort_evals_evecs(evals-exciton_reorg_energies, evecs) # print evals # MRT_rates2 = os.modified_redfield_rates_general_unordered(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) # # liouvillian2 = MRT_rates2 - np.diag(np.sum(MRT_rates2, axis=0)) # # print evals # print MRT_rates2 print evals - exciton_reorg_energies #MRT_rates,evals,evecs = os.modified_redfield_rates_general(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) MRT_rates = os.modified_redfield_rates_general(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time)[0] print evals print MRT_rates # time evolution liouvillian = MRT_rates - np.diag(np.sum(MRT_rates, axis=0)) # print liouvillian # for col in liouvillian.T: # print np.sum(col) init_state = np.array([1., 0, 0, 0, 0, 0]) dv_dynamics = te.liouvillian_time_evolution(init_state, liouvillian, duration, time_step) dv_dynamics = np.array(dv_dynamics) dynamics[i] = dv_dynamics
total_site_reorg_energy, total_site_reorg_energy, total_site_reorg_energy,\ 1.5*total_site_reorg_energy]) MRT_rates2 = os.modified_redfield_rates_general_unordered(evals-exciton_reorg_energies, evecs, np.array([lbf,lbf,lbf,lbf,lbf,lbf,1.5*lbf]), \ np.array([lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,1.5*lbf_dot]), \ np.array([lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,1.5*lbf_dot_dot]), \ reorgs,\ temperature, time) liouvillian2 = MRT_rates2 - np.diag(np.sum(MRT_rates2, axis=0)) print evals print MRT_rates2 MRT_rates,evals,evecs = os.modified_redfield_rates_general(evals-exciton_reorg_energies, evecs, lbf, lbf_dot, lbf_dot_dot, total_site_reorg_energy, temperature, time) print evals print MRT_rates MRT_rates3,evals,evecs = os.modified_redfield_rates_general(evals, evecs,\ np.array([lbf,lbf,lbf,lbf,lbf,lbf,1.5*lbf]),\ np.array([lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,lbf_dot,1.5*lbf_dot]),\ np.array([lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,lbf_dot_dot,1.5*lbf_dot_dot]),\ reorgs,\ temperature, time) print MRT_rates3 # time evolution liouvillian = MRT_rates - np.diag(np.sum(MRT_rates, axis=0)) # print liouvillian