def fit_func(t, k01, k10): time_propagator = np.zeros((2,2)) time_propagator[0,0] = -k01 time_propagator[0,1] = k10 time_propagator[1,1] = -k10 time_propagator[1,0] = k01 time_step = t[1] - t[0] dynamics = te.liouvillian_time_evolution(np.array([1,0]), time_propagator, t[-1], time_step, wave_nums=False) return dynamics[:,0]
def fit_func(t, k01, k10): time_propagator = np.zeros((2, 2)) time_propagator[0, 0] = -k01 time_propagator[0, 1] = k10 time_propagator[1, 1] = -k10 time_propagator[1, 0] = k01 time_step = t[1] - t[0] dynamics = te.liouvillian_time_evolution(np.array([1, 0]), time_propagator, t[-1], time_step, wave_nums=False) return dynamics[:, 0]
pops2 = data['pops2'] time = data['time'] y = np.array(utils.differentiate_function(pops1, time), dtype='float64') def residuals(p, y, pops1, pops2): k12, k21 = p return y - (-k12*pops1 + k21*pops2) rates0 = np.array([0.1 ,0.1]) result = leastsq(residuals, rates0, args=(y, pops1, pops2)) rates = result[0] time_propagator = np.zeros((2,2)) time_propagator[0,0] = -rates[0] time_propagator[0,1] = rates[1] time_propagator[1,1] = -rates[1] time_propagator[1,0] = rates[0] print time_propagator pauli_evolution = te.liouvillian_time_evolution(np.array([1,0]), time_propagator, duration, time_step) plt.plot(time, pops1) plt.plot(time, pops2) plt.plot(time, [dv[0] for dv in pauli_evolution], ls='--') plt.plot(time, [dv[1] for dv in pauli_evolution], ls='--') plt.plot(time, y, color='k') plt.show()
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 # init_state = np.array([0, 1., 0, 0, 0, 0]) # dv_dynamics2 = te.liouvillian_time_evolution(init_state, liouvillian2, duration, time_step) # dv_dynamics2 = np.array(dv_dynamics2) # calculate Boltzmann distribution over excitons # thermal_state = utils.general_thermal_state(np.diag(np.sort(evals-exciton_reorg_energies)), temperature) # print thermal_state # np.savez('../../data/PSIIRC_6site_thermal_state_single_mode.npz', thermal_state=thermal_state) np.savez('../../data/PSIIRC_MRT_dynamics_vary_cutoff_freq.npz', dynamics=dynamics, dynamics_time=dynamics_time, \ cutoff_freqs=cutoff_freqs, site_drude_reorg_energy=site_drude_reorg_energy, \ temperature=temperature)
y = np.array(utils.differentiate_function(pops1, time), dtype='float64') def residuals(p, y, pops1, pops2): k12, k21 = p return y - (-k12 * pops1 + k21 * pops2) rates0 = np.array([0.1, 0.1]) result = leastsq(residuals, rates0, args=(y, pops1, pops2)) rates = result[0] time_propagator = np.zeros((2, 2)) time_propagator[0, 0] = -rates[0] time_propagator[0, 1] = rates[1] time_propagator[1, 1] = -rates[1] time_propagator[1, 0] = rates[0] print time_propagator pauli_evolution = te.liouvillian_time_evolution(np.array([1, 0]), time_propagator, duration, time_step) plt.plot(time, pops1) plt.plot(time, pops2) plt.plot(time, [dv[0] for dv in pauli_evolution], ls='--') plt.plot(time, [dv[1] for dv in pauli_evolution], ls='--') plt.plot(time, y, color='k') plt.show()
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 # init_state = np.array([0, 1., 0, 0, 0, 0]) # dv_dynamics2 = te.liouvillian_time_evolution(init_state, liouvillian2, duration, time_step) # dv_dynamics2 = np.array(dv_dynamics2) # calculate Boltzmann distribution over excitons # thermal_state = utils.general_thermal_state(np.diag(np.sort(evals-exciton_reorg_energies)), temperature) # print thermal_state # np.savez('../../data/PSIIRC_6site_thermal_state_single_mode.npz', thermal_state=thermal_state) np.savez('../../data/PSIIRC_MRT_dynamics_vary_cutoff_freq.npz', dynamics=dynamics, dynamics_time=dynamics_time, \ cutoff_freqs=cutoff_freqs, site_drude_reorg_energy=site_drude_reorg_energy, \ temperature=temperature)
for i,col in enumerate(liouvillian.T): liouvillian[i,i] = -np.sum(col) liouvillians[n] = liouvillian # propagate initial state for 15 ps site_exciton_transform = np.zeros(hamiltonian.shape) for i,exciton in enumerate(evecs): site_exciton_transform[i] = np.append(exciton, [0,0]) site_exciton_transform[6,6] = 1. site_exciton_transform[7,7] = 1. exciton_init_state = np.diag(np.dot(site_exciton_transform, np.dot(np.diag(site_init_state), site_exciton_transform.T))) dv_history = te.liouvillian_time_evolution(exciton_init_state, liouvillian, dynamics_duration, dynamics_timestep) dv_history = np.array(dv_history) # loop over density vectors in history and transform to site basis site_dv_history = np.zeros(dv_history.shape) for i in range(dv_history.shape[0]): site_dv_history[i] = np.diag(np.dot(site_exciton_transform.T, np.dot(np.diag(dv_history[i]), site_exciton_transform))) population_dynamics_realisations[n] = site_dv_history.T data_fn = '../../data/PSIIRC_ChlD1_pathway_dynamics_' + str(int(temperature)) + 'K__incorrect_ordering_data.npz' try: saved_data = np.load(data_fn) saved_realisations = saved_data['population_dynamics_realisations'] population_dynamics_realisations = np.append(population_dynamics_realisations, saved_realisations, axis=0) num_realisations += saved_data['num_realisations']