Exemplo n.º 1
0
def markovian_master_eqn_RK4(init_density_matrix, hamiltonian, duration, timestep, trace_basis=None, jump_operators=None, hamiltonianInWaveNums=True):

    if hamiltonianInWaveNums:
        hamiltonian = utils.WAVENUMS_TO_INVERSE_PS * hamiltonian

    density_matrix = init_density_matrix
    dm_history = []
    if trace_basis:
        dm_history.append(utils.partial_trace(density_matrix, trace_basis))
    else:
        dm_history.append(density_matrix) 

    for step in range(0, int(duration/timestep)):
#         if step % 100 == 0:
#             print "Reached step " + str(step)
        
        k1 = timestep * master_equation(density_matrix, hamiltonian, jump_operators)
        k2 = timestep * master_equation(density_matrix + (0.5*k1), hamiltonian, jump_operators)
        k3 = timestep * master_equation(density_matrix + (0.5*k2), hamiltonian, jump_operators)
        k4 = timestep * master_equation(density_matrix + k3, hamiltonian, jump_operators)
  
        density_matrix = density_matrix + (1./6.) * (k1 + 2.*k2 + 2.*k3 + k4)
        if trace_basis:
            dm_history.append(utils.partial_trace(density_matrix, trace_basis))
        else:
            dm_history.append(density_matrix)
  
    return dm_history
Exemplo n.º 2
0
def von_neumann_eqn(init_density_matrix, hamiltonian, duration, timestep, trace_basis=None, wave_nums=True):

    if wave_nums:
        hamiltonian = utils.hamiltonian_to_picosecs(hamiltonian)

    timestep_operator = la.expm(-1j*hamiltonian*timestep)
    timestep_operator_dagger = timestep_operator.conj().T
    density_matrix = init_density_matrix
    dm_history = []
    if trace_basis:
        dm_history.append(utils.partial_trace(density_matrix, trace_basis))
    else:
        dm_history.append(density_matrix) 

    for step in range(int(duration/timestep)):
        density_matrix = np.dot(np.dot(timestep_operator, density_matrix), timestep_operator_dagger)
        if trace_basis:
            dm_history.append(utils.partial_trace(density_matrix, trace_basis))
        else:
            dm_history.append(density_matrix)

    return np.array(dm_history)
    print 'Calculations for v = ' + str(v)
    #model.mode_coupling = v
    #model.N = v
    model.vib_damping_rate = v
    
    temp_current = np.zeros(num_data_pts)
    #temp_current_cs = np.zeros(num_data_pts)
    
    for j,e in enumerate(energy_gap_range):
        model.energy_gap = e
        L = model.liouvillian()
        dm_pops = np.eye(3*model.vib_basis_size).flatten()
        ss_vec = utils.stationary_state(L, dm_pops)
        ss_mat = ss_vec.copy()
        ss_mat.shape = np.sqrt(ss_mat.shape[0]), np.sqrt(ss_mat.shape[0])
        ss_el = utils.partial_trace(ss_mat, utils.orthog_basis_set(model.vib_basis_size))
        temp_current[j] = model.Gamma_R * ss_el[2,2]
        #temp_current_cs[j] = cs.mean(L, model.jump_liouvillian(), ss_vec, dm_pops)
    
    current[i] = temp_current
    plt.plot(energy_gap_range, current[i], label=v)
    
#np.savez('../../data/dimer_vib_energy_gap_current_mode_coupling_data.npz', energy_gap_range=energy_gap_range, current=current, mode_couplings=mode_couplings)
#np.savez('../../data/dimer_vib_energy_gap_current_thermal_occupation_data.npz', energy_gap_range=energy_gap_range, current=current, thermal_occupations=thermal_occupations)
np.savez('../../data/dimer_vib_energy_gap_current_mode_damping_data.npz', energy_gap_range=energy_gap_range, current=current, mode_dampings=mode_dampings)

#plt.plot(energy_gap_range, current_cs)
plt.legend()
plt.show()