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