#+PROPERTY: header-args :session rich_hops_eflow_nl :kernel python :pandoc t :async yes * Setup ** Jupyter #+begin_src jupyter-python %load_ext autoreload %autoreload 2 %load_ext jupyter_spaces #+end_src #+RESULTS: ** Matplotlib #+begin_src jupyter-python import matplotlib import matplotlib.pyplot as plt #matplotlib.use("TkCairo", force=True) %gui tk %matplotlib inline plt.style.use('ggplot') #+end_src #+RESULTS: ** Richard (old) HOPS #+begin_src jupyter-python import hierarchyLib import hierarchyData import numpy as np from stocproc.stocproc import StocProc_FFT import bcf from dataclasses import dataclass import scipy import scipy.misc import scipy.signal #+end_src #+RESULTS: ** Auxiliary Definitions #+begin_src jupyter-python σ1 = np.matrix([[0,1],[1,0]]) σ2 = np.matrix([[0,-1j],[1j,0]]) σ3 = np.matrix([[1,0],[0,-1]]) #+end_src #+RESULTS: * Model Setup Basic parameters. #+begin_src jupyter-python γ = 3 # coupling ratio ω_c = 2 # center of spect. dens δ = 2 # breadth BCF t_max = 4 t_steps = 4000 k_max = 3 seed = 100 g = np.sqrt(δ) H_s = σ3 + np.eye(2) L = 1 / 2 * (σ1 - 1j * σ2) * γ ψ_0 = np.array([1, 0]) W = ω_c * 1j + δ # exponent BCF N = 1000 #+end_src #+RESULTS: ** BCF #+begin_src jupyter-python @dataclass class CauchyBCF: δ: float ω_c: float def I(self, ω): return np.sqrt(self.δ) / (self.δ + (ω - self.ω_c) ** 2 / self.δ) def __call__(self, τ): return np.sqrt(self.δ) * np.exp(-1j * self.ω_c * τ - np.abs(τ) * self.δ) def __bfkey__(self): return self.δ, self.ω_c α = CauchyBCF(δ, ω_c) #+end_src #+RESULTS: *** Plot #+begin_src jupyter-python %%space plot t = np.linspace(0, t_max, 1000) ω = np.linspace(ω_c - 10, ω_c + 10, 1000) fig, axs = plt.subplots(2) axs[0].plot(t, np.real(α(t))) axs[0].plot(t, np.imag(α(t))) axs[1].plot(ω, α.I(ω)) #+end_src #+RESULTS: :RESULTS: | | | | | | [[file:./.ob-jupyter/cc8a82c1bde6ea1912c1b977e822908ef92ed79a.png]] :END: ** Hops setup #+begin_src jupyter-python HierachyParam = hierarchyData.HiP( k_max=k_max, # g_scale=None, # sample_method='random', seed=seed, nonlinear=True, normalized=False, # terminator=False, result_type=hierarchyData.RESULT_TYPE_ALL, # accum_only=None, # rand_skip=None ) #+end_src #+RESULTS: Integration. #+begin_src jupyter-python IntegrationParam = hierarchyData.IntP( t_max=t_max, t_steps=t_steps, # integrator_name='zvode', # atol=1e-8, # rtol=1e-8, # order=5, # nsteps=5000, # method='bdf', # t_steps_skip=1 ) #+end_src #+RESULTS: And now the system. #+begin_src jupyter-python SystemParam = hierarchyData.SysP( H_sys=H_s, L=L, psi0=ψ_0, # excited qubit g=np.array([g]), w=np.array([W]), H_dynamic=[], bcf_scale=1, # some coupling strength (scaling of the fit parameters 'g_i') gw_hash=None, # this is used to load g,w from some database len_gw=1, ) #+end_src #+RESULTS: The quantum noise. #+begin_src jupyter-python Eta = StocProc_FFT( α.I, t_max, α, negative_frequencies=True, seed=seed, intgr_tol=1e-2, intpl_tol=1e-2, scale=1, ) #+end_src #+RESULTS: #+begin_example stocproc.stocproc - INFO - use neg freq stocproc.method_ft - INFO - get_dt_for_accurate_interpolation, please wait ... stocproc.method_ft - INFO - acc interp N 33 dt 1.44e-01 -> diff 7.57e-03 stocproc.method_ft - INFO - requires dt < 1.439e-01 stocproc.method_ft - INFO - get_N_a_b_for_accurate_fourier_integral, please wait ... stocproc.method_ft - INFO - J_w_min:1.00e-02 N 32 yields: interval [-1.47e+01,1.87e+01] diff 3.37e-01 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 32 yields: interval [-5.11e+01,5.51e+01] diff 6.70e-01 stocproc.method_ft - INFO - J_w_min:1.00e-02 N 64 yields: interval [-1.47e+01,1.87e+01] diff 3.37e-01 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 32 yields: interval [-1.66e+02,1.70e+02] diff 2.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 64 yields: interval [-5.11e+01,5.51e+01] diff 1.11e-01 stocproc.method_ft - INFO - J_w_min:1.00e-02 N 128 yields: interval [-1.47e+01,1.87e+01] diff 3.37e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-05 N 32 yields: interval [-5.30e+02,5.34e+02] diff 3.68e+00 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 64 yields: interval [-1.66e+02,1.70e+02] diff 1.34e+00 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 128 yields: interval [-5.11e+01,5.51e+01] diff 1.06e-01 stocproc.method_ft - INFO - J_w_min:1.00e-02 N 256 yields: interval [-1.47e+01,1.87e+01] diff 3.37e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-06 N 32 yields: interval [-1.68e+03,1.68e+03] diff 4.19e+00 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 64 yields: interval [-5.30e+02,5.34e+02] diff 3.04e+00 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 128 yields: interval [-1.66e+02,1.70e+02] diff 4.07e-01 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 256 yields: interval [-5.11e+01,5.51e+01] diff 1.06e-01 stocproc.method_ft - INFO - J_w_min:1.00e-02 N 512 yields: interval [-1.47e+01,1.87e+01] diff 3.37e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-07 N 32 yields: interval [-5.32e+03,5.32e+03] diff 4.36e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 64 yields: interval [-1.68e+03,1.68e+03] diff 3.94e+00 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 128 yields: interval [-5.30e+02,5.34e+02] diff 2.09e+00 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 256 yields: interval [-1.66e+02,1.70e+02] diff 3.72e-02 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 512 yields: interval [-5.11e+01,5.51e+01] diff 1.06e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-08 N 32 yields: interval [-1.68e+04,1.68e+04] diff 4.42e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 64 yields: interval [-5.32e+03,5.32e+03] diff 4.28e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 128 yields: interval [-1.68e+03,1.68e+03] diff 3.50e+00 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 256 yields: interval [-5.30e+02,5.34e+02] diff 9.79e-01 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 512 yields: interval [-1.66e+02,1.70e+02] diff 3.36e-02 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 1024 yields: interval [-5.11e+01,5.51e+01] diff 1.06e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-09 N 32 yields: interval [-5.32e+04,5.32e+04] diff 4.43e+00 stocproc.method_ft - INFO - J_w_min:1.00e-08 N 64 yields: interval [-1.68e+04,1.68e+04] diff 4.39e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 128 yields: interval [-5.32e+03,5.32e+03] diff 4.12e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 256 yields: interval [-1.68e+03,1.68e+03] diff 2.75e+00 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 512 yields: interval [-5.30e+02,5.34e+02] diff 2.16e-01 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 1024 yields: interval [-1.66e+02,1.70e+02] diff 3.36e-02 stocproc.method_ft - INFO - J_w_min:1.00e-03 N 2048 yields: interval [-5.11e+01,5.51e+01] diff 1.06e-01 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-10 N 32 yields: interval [-1.68e+05,1.68e+05] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-09 N 64 yields: interval [-5.32e+04,5.32e+04] diff 4.43e+00 stocproc.method_ft - INFO - J_w_min:1.00e-08 N 128 yields: interval [-1.68e+04,1.68e+04] diff 4.34e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 256 yields: interval [-5.32e+03,5.32e+03] diff 3.82e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 512 yields: interval [-1.68e+03,1.68e+03] diff 1.71e+00 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 1024 yields: interval [-5.30e+02,5.34e+02] diff 1.07e-02 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 2048 yields: interval [-1.66e+02,1.70e+02] diff 3.36e-02 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-11 N 32 yields: interval [-5.32e+05,5.32e+05] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-10 N 64 yields: interval [-1.68e+05,1.68e+05] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-09 N 128 yields: interval [-5.32e+04,5.32e+04] diff 4.41e+00 stocproc.method_ft - INFO - J_w_min:1.00e-08 N 256 yields: interval [-1.68e+04,1.68e+04] diff 4.24e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 512 yields: interval [-5.32e+03,5.32e+03] diff 3.28e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 1024 yields: interval [-1.68e+03,1.68e+03] diff 6.56e-01 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 2048 yields: interval [-5.30e+02,5.34e+02] diff 1.06e-02 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 4096 yields: interval [-1.66e+02,1.70e+02] diff 3.36e-02 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-12 N 32 yields: interval [-1.68e+06,1.68e+06] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-11 N 64 yields: interval [-5.32e+05,5.32e+05] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-10 N 128 yields: interval [-1.68e+05,1.68e+05] diff 4.43e+00 stocproc.method_ft - INFO - J_w_min:1.00e-09 N 256 yields: interval [-5.32e+04,5.32e+04] diff 4.38e+00 stocproc.method_ft - INFO - J_w_min:1.00e-08 N 512 yields: interval [-1.68e+04,1.68e+04] diff 4.04e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 1024 yields: interval [-5.32e+03,5.32e+03] diff 2.43e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 2048 yields: interval [-1.68e+03,1.68e+03] diff 9.69e-02 stocproc.method_ft - INFO - J_w_min:1.00e-05 N 4096 yields: interval [-5.30e+02,5.34e+02] diff 1.06e-02 stocproc.method_ft - INFO - J_w_min:1.00e-04 N 8192 yields: interval [-1.66e+02,1.70e+02] diff 3.36e-02 stocproc.method_ft - INFO - increasing N while shrinking the interval does lower the error -> try next level stocproc.method_ft - INFO - J_w_min:1.00e-13 N 32 yields: interval [-5.32e+06,5.32e+06] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-12 N 64 yields: interval [-1.68e+06,1.68e+06] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-11 N 128 yields: interval [-5.32e+05,5.32e+05] diff 4.44e+00 stocproc.method_ft - INFO - J_w_min:1.00e-10 N 256 yields: interval [-1.68e+05,1.68e+05] diff 4.42e+00 stocproc.method_ft - INFO - J_w_min:1.00e-09 N 512 yields: interval [-5.32e+04,5.32e+04] diff 4.31e+00 stocproc.method_ft - INFO - J_w_min:1.00e-08 N 1024 yields: interval [-1.68e+04,1.68e+04] diff 3.67e+00 stocproc.method_ft - INFO - J_w_min:1.00e-07 N 2048 yields: interval [-5.32e+03,5.32e+03] diff 1.33e+00 stocproc.method_ft - INFO - J_w_min:1.00e-06 N 4096 yields: interval [-1.68e+03,1.68e+03] diff 3.37e-03 stocproc.method_ft - INFO - return, cause tol of 0.01 was reached stocproc.method_ft - INFO - requires dx < 8.212e-01 stocproc.stocproc - INFO - Fourier Integral Boundaries: [-1.680e+03, 1.684e+03] stocproc.stocproc - INFO - Number of Nodes : 4096 stocproc.stocproc - INFO - yields dx : 8.212e-01 stocproc.stocproc - INFO - yields dt : 1.868e-03 stocproc.stocproc - INFO - yields t_max : 7.649e+00 #+end_example * Actual Hops Generate the key for binary caching. #+begin_src jupyter-python hi_key = hierarchyData.HIMetaKey_type( HiP=HierachyParam, IntP=IntegrationParam, SysP=SystemParam, Eta=Eta, EtaTherm=None, ) #+end_src #+RESULTS: Initialize Hierarchy. #+begin_src jupyter-python myHierarchy = hierarchyLib.HI(hi_key, number_of_samples=N, desc="run a test case") #+end_src #+RESULTS: : init Hi class, use 8 equation : /home/hiro/Documents/Projects/UNI/master/masterarb/python/richard_hops/hierarchyLib.py:1058: UserWarning: sum_k_max is not implemented! DO SO BEFORE NEXT USAGE (use simplex).HierarchyParametersType does not yet know about sum_k_max : warnings.warn( Run the integration. #+begin_src jupyter-python myHierarchy.integrate_simple(data_path="data", data_name="energy_flow_nl_2.data") #+end_src #+RESULTS: : samples :0.0% : integration :0.0% : samples :49.0% : integration :0.0% : samples : 100% : integration :0.0% :  Get the samples. #+begin_src jupyter-python # to access the data the 'hi_key' is used to find the data in the hdf5 file with hierarchyData.HIMetaData(hid_name="energy_flow_nl_2.data", hid_path="data") as metaData: with metaData.get_HIData(hi_key, read_only=True) as data: smp = data.get_samples() print("{} samples found in database".format(smp)) τ = data.get_time() rho_τ = data.get_rho_t() s_proc = np.array(data.stoc_proc) states = np.array(data.aux_states).copy() ψ_1 = np.array(data.aux_states)[:, :, 0:2] ψ_0 = np.array(data.stoc_traj) y = np.array(data.y) η = np.array(data.stoc_proc) #+end_src #+RESULTS: : 1000 samples found in database Calculate energy. #+begin_src jupyter-python %matplotlib inline import qutip energy = np.array([np.trace(ρ @ H_s).real for ρ in rho_τ]) plt.plot(τ, energy) #+end_src #+RESULTS: :RESULTS: | | [[file:./.ob-jupyter/6f9ff44b906cf57c7c84d88a0a157cc66b911965.png]] :END: #+begin_src jupyter-python %%space plot plt.plot(τ, np.trace(rho_τ.T).real) #+end_src #+RESULTS: :RESULTS: | | [[file:./.ob-jupyter/f3f9c51e9054713cfd1c1c767658d98df3b5a747.png]] :END: * Energy Flow :PROPERTIES: :ID: eefb1594-e399-4d24-9dd7-a57addd42e65 :END: #+begin_src jupyter-python ψ_1.shape #+end_src #+RESULTS: | 1280 | 4000 | 2 | Let's look at the norm. #+begin_src jupyter-python plt.plot(τ, (ψ_0[0].conj() * ψ_0[0]).sum(axis=1).real) #+end_src #+RESULTS: :RESULTS: | | [[file:./.ob-jupyter/410aaf67c52a948f72fac9345da5fb6cedf4889d.png]] :END: And try to calculate the energy flow. #+begin_src jupyter-python def flow_for_traj(ψ_0, ψ_1): a = np.array((L @ ψ_0.T).T) #return np.array(np.sum(ψ_0.conj() * ψ_0, axis=1)).flatten().real return np.array(np.sqrt(δ) * 2 * (1j * -W * np.sum(a.conj() * ψ_1, axis=1)/np.sum(ψ_0.conj() * ψ_0, axis=1)).real).flatten() def flow_for_traj_alt(ψ_0, y): Eta.new_process(y) eta_dot = scipy.misc.derivative(Eta, τ, dx=1e-8) a = np.array((L @ ψ_0.T).T) return -( 2j * eta_dot.conj() * np.array((np.sum(ψ_0.conj() * a, axis=1))).flatten() ).real #+end_src #+RESULTS: Now we calculate the average over all trajectories. #+begin_src jupyter-python j = np.zeros_like(τ) for i in range(0, N): j += flow_for_traj(ψ_0[i], ψ_1[i]) j /= N #+end_src #+RESULTS: And do the same with the alternative implementation. #+begin_src jupyter-python ja = np.zeros_like(τ) for i in range(0, N): ja += flow_for_traj_alt(ψ_0[i], y[i]) ja /= N #+end_src #+RESULTS: And plot it :) #+begin_src jupyter-python %matplotlib inline plt.plot(τ, j) #plt.plot(τ, ja) plt.show() #+end_src #+RESULTS: [[file:./.ob-jupyter/9c069301b804633b13ade3d61ac2757938ac6dcf.png]] Let's calculate the integrated energy. #+begin_src jupyter-python E_t = np.array([0] + [scipy.integrate.simpson(j[0:n], τ[0:n]) for n in range(1, len(τ))]) E_t[-1] #+end_src #+RESULTS: : 1.992784078082371 With this we can retrieve the energy of the interaction Hamiltonian. #+begin_src jupyter-python E_I = 2 - energy - E_t #+end_src #+RESULTS: #+begin_src jupyter-python %%space plot plt.rcParams['figure.figsize'] = [15, 10] #plt.plot(τ, j, label="$J$", linestyle='--') plt.plot(τ, E_t, label=r"$\langle H_{\mathrm{B}}\rangle$") plt.plot(τ, E_I, label=r"$\langle H_{\mathrm{I}}\rangle$") plt.plot(τ, energy, label=r"$\langle H_{\mathrm{S}}\rangle$") plt.xlabel("τ") plt.legend() plt.show() #+end_src #+RESULTS: :RESULTS: | | | | | | : Text(0.5, 0, 'τ') : [[file:./.ob-jupyter/82a58cfbc077e4a57611ba17d345c984cd3deca7.png]] :END: #+RESULTS: * System + Interaction Energy #+begin_src jupyter-python def h_si_for_traj(ψ_0, ψ_1): a = np.array((L @ ψ_0.T).T) b = np.array((H_s @ ψ_0.T).T) E_i = np.array(2 * (-1j * np.sum(a.conj() * ψ_1, axis=1)).real).flatten() E_s = np.array(np.sum(b.conj() * ψ_0, axis=1)).flatten().real return (E_i + E_s)/np.sum(ψ_0.conj() * ψ_0, axis=1).real def h_si_for_traj_alt(ψ_0, y): Eta.new_process(y) a = np.array((L.conj().T @ ψ_0.T).T) b = np.array((H_s @ ψ_0.T).T) E_i = np.array(2 * (Eta(τ) * 1j * np.sum(a.conj() * ψ_0, axis=1)).real).flatten() E_s = np.array(np.sum(b.conj() * ψ_0, axis=1)).flatten().real return E_i + E_s #+end_src #+RESULTS: #+begin_src jupyter-python e_si = np.zeros_like(τ) for i in range(0, N): e_si += h_si_for_traj(ψ_0[i], ψ_1[i]) e_si /= N #+end_src #+RESULTS: Not too bad... #+begin_src jupyter-python plt.plot(τ, e_si) plt.plot(τ, E_I + energy) #+end_src #+RESULTS: :RESULTS: | | [[file:./.ob-jupyter/377ab054182f30bb1937d7b37a215d9b6584c278.png]] :END: