def make_driver(): ha, vstate, _ = _setup_system(L=2) return nkx.TDVP( ha, vstate, integrator, propagation_type="imag", )
def test_dt_bounds(): ha, vstate, _ = _setup_system(L=2, dtype=np.complex128) te = nkx.TDVP( ha, vstate, nkx.dynamics.RK23(dt=0.1, adaptive=True, dt_limits=(1e-2, None)), propagation_type="real", ) with pytest.warns(UserWarning, match="RK solver: dt reached lower bound"): te.run(T=0.1, callback=_stop_after_one_step)
def test_one_fixed_step(integrator, propagation_type): ha, vstate, _ = _setup_system(L=2) te = nkx.TDVP( ha, vstate, integrator, qgt=nk.optimizer.qgt.QGTJacobianDense(holomorphic=True), propagation_type=propagation_type, ) te.run(T=0.01, callback=_stop_after_one_step) assert te.t == 0.01
def test_run_twice(): # 1100 ha, vstate, _ = _setup_system(L=2) driver = nkx.TDVP( ha, vstate, nkx.dynamics.RK23(dt=0.01), ) driver.run(0.03) driver.run(0.03) np.testing.assert_allclose(driver.t, 0.06)
def test_repr_and_info(): ha, vstate, _ = _setup_system(L=2) driver = nkx.TDVP( ha, vstate, nkx.dynamics.RK23(dt=0.01), ) print(str(driver)) assert "TDVP" in str(driver) info = driver.info() print(info) assert "TDVP" in info assert "generator" in info assert "integrator" in info assert "RK23" in info
def test_change_integrator(): ha, vstate, _ = _setup_system(L=2) driver = nkx.TDVP( ha, vstate, nkx.dynamics.RK23(dt=0.01, adaptive=False), ) driver.run(0.03) np.testing.assert_allclose(driver.t, 0.03) integrator = nkx.dynamics.Euler(dt=0.05) driver.integrator = integrator np.testing.assert_allclose(driver.t, 0.03) np.testing.assert_allclose(driver.dt, 0.05) driver.run(0.1) np.testing.assert_allclose(driver.t, 0.13)
def test_change_norm(): ha, vstate, _ = _setup_system(L=2) driver = nkx.TDVP( ha, vstate, nkx.dynamics.RK23(dt=0.01, adaptive=False), ) driver.run(0.03) def norm(x): return 0.0 driver.error_norm = norm driver.run(0.02) driver.error_norm = "qgt" driver.run(0.02) driver.error_norm = "maximum" driver.run(0.02) with pytest.raises(ValueError): driver.error_norm = "assd"
def test_one_step_lindbladian(integrator): def _setup_lindbladian_system(): L = 3 hi = nk.hilbert.Spin(s=0.5)**L ha = nk.operator.LocalOperator(hi) j_ops = [] for i in range(L): ha += (0.3 / 2.0) * nk.operator.spin.sigmax(hi, i) ha += ((2.0 / 4.0) * nk.operator.spin.sigmaz(hi, i) * nk.operator.spin.sigmaz(hi, (i + 1) % L)) j_ops.append(nk.operator.spin.sigmam(hi, i)) # Create the liouvillian lind = nk.operator.LocalLiouvillian(ha, j_ops) # Create NDM and vstate ma = nk.models.NDM() sa = nk.sampler.MetropolisLocal(hilbert=nk.hilbert.DoubledHilbert(hi)) sa_obs = nk.sampler.MetropolisLocal(hilbert=hi) vstate = nk.vqs.MCMixedState(sa, ma, sampler_diag=sa_obs, n_samples=1000, seed=SEED) return lind, vstate lind, vstate = _setup_lindbladian_system() te = nkx.TDVP( lind, vstate, integrator, propagation_type="real", linear_solver=partial(nk.optimizer.solver.svd, rcond=1e-3), ) te.run(T=0.01, callback=_stop_after_one_step) assert te.t > 0.0
Sx = sum([nk.operator.spin.sigmax(hi, i) for i in range(L)]) # Run the optimization for 300 iterations to determine the ground state, used as # initial state of the time-evolution gs.run(n_iter=300, out="example_ising1d_GS", obs={"Sx": Sx}) # Create integrator for time propagation integrator = nkx.dynamics.RK23(dt=0.01, adaptive=True, rtol=1e-3, atol=1e-3) print(integrator) # Quenched hamiltonian: this has a different transverse field than `ha` ha1 = nk.operator.Ising(hilbert=hi, graph=g, h=0.5) te = nkx.TDVP( ha1, variational_state=vs, integrator=integrator, t0=0.0, qgt=nk.optimizer.qgt.QGTJacobianDense(holomorphic=True), error_norm="qgt", ) log = nk.logging.JsonLog("example_ising1d_TE") # perform the time-evolution saving the observable Sx at every `tstop` time te.run( T=1.0, out=log, show_progress=True, obs={"Sx": Sx}, tstops=np.linspace(0.0, 1.0, 101, endpoint=True), )