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()


Example #4
0
    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']