@@ -3,39 +3,46 @@ using Printf: @printf
33@kwdef mutable struct ApplyExpProblem{State}
44 operator
55 state:: State
6- current_time :: Number = 0.0
6+ current_exponent :: Number = 0.0
77end
88
99ITensorNetworks. state (A:: ApplyExpProblem ) = A. state
1010operator (A:: ApplyExpProblem ) = A. operator
11- current_time (A:: ApplyExpProblem ) = A. current_time
11+ current_exponent (A:: ApplyExpProblem ) = A. current_exponent
12+ function current_time (A:: ApplyExpProblem )
13+ t = im* A. current_exponent
14+ return iszero (imag (t)) ? real (t) : t
15+ end
1216
1317function set_operator (A:: ApplyExpProblem , operator)
14- ApplyExpProblem (operator, A. state, A. current_time)
18+ ApplyExpProblem (operator, A. state, A. current_exponent)
19+ end
20+ function set_state (A:: ApplyExpProblem , state)
21+ ApplyExpProblem (A. operator, state, A. current_exponent)
1522end
16- set_state (A:: ApplyExpProblem , state) = ApplyExpProblem (A. operator, state, A. current_time)
17- function set_current_time (A:: ApplyExpProblem , current_time)
18- ApplyExpProblem (A. operator, A. state, current_time)
23+ function set_current_exponent (A:: ApplyExpProblem , current_exponent)
24+ ApplyExpProblem (A. operator, A. state, current_exponent)
1925end
2026
2127function region_plan (tdvp:: ApplyExpProblem ; nsites, time_step, sweep_kwargs... )
22- return tdvp_regions (state (tdvp), time_step; nsites, sweep_kwargs... )
28+ return applyexp_regions (state (tdvp), time_step; nsites, sweep_kwargs... )
2329end
2430
2531function update (
2632 prob:: ApplyExpProblem ,
2733 local_state,
2834 region_iterator;
2935 nsites,
30- time_step ,
36+ exponent_step ,
3137 solver= runge_kutta_solver,
3238 outputlevel,
3339 kws... ,
3440)
41+ iszero (abs (exponent_step)) && return prob, local_state
42+
3543 local_state, info = solver (
36- x-> optimal_map (operator (prob), x), time_step , local_state; kws...
44+ x-> optimal_map (operator (prob), x), exponent_step , local_state; kws...
3745 )
38-
3946 if nsites== 1
4047 curr_reg = current_region (region_iterator)
4148 next_reg = next_region (region_iterator)
@@ -45,21 +52,29 @@ function update(
4552 psi = copy (state (prob))
4653 psi[v1], R = qr (local_state, uniqueinds (local_state, psi[v2]))
4754 shifted_operator = position (operator (prob), psi, NamedEdge (v1=> v2))
48- R_t, _ = solver (x-> optimal_map (shifted_operator, x), - time_step , R; kws... )
55+ R_t, _ = solver (x-> optimal_map (shifted_operator, x), - exponent_step , R; kws... )
4956 local_state = psi[v1]* R_t
5057 end
5158 end
5259
53- prob = set_current_time (prob, current_time (prob)+ time_step )
60+ prob = set_current_exponent (prob, current_exponent (prob)+ exponent_step )
5461
5562 return prob, local_state
5663end
5764
5865function sweep_printer (
59- problem:: ApplyExpProblem ; outputlevel, sweep, nsweeps, process_time= identity, kws...
66+ problem:: ApplyExpProblem ;
67+ exponent_description= " exponent" ,
68+ outputlevel,
69+ sweep,
70+ nsweeps,
71+ process_time= identity,
72+ kws... ,
6073)
6174 if outputlevel >= 1
62- @printf (" Current time = %s, " , process_time (current_time (problem)))
75+ @printf (
76+ " Current %s = %s, " , exponent_description, process_time (current_exponent (problem))
77+ )
6378 @printf (" maxlinkdim=%d" , maxlinkdim (state (problem)))
6479 println ()
6580 flush (stdout )
@@ -75,30 +90,30 @@ function applyexp(
7590 insert_kwargs= (;),
7691 outputlevel= 0 ,
7792 nsites= 1 ,
78- tdvp_order = 4 ,
93+ order = 4 ,
7994 kws... ,
8095)
8196 init_prob = ApplyExpProblem (;
8297 state= align_indices (init_state), operator= ProjTTN (align_indices (operator))
8398 )
84- time_steps = diff ([zero (eltype (exponents)); exponents])[2 : end ]
85- sweep_kws = (;
86- outputlevel, extract_kwargs, insert_kwargs, nsites, tdvp_order, update_kwargs
87- )
88- kws_array = [(; sweep_kws... , time_step= t) for t in time_steps]
99+ exponent_steps = diff ([zero (eltype (exponents)); exponents])
100+ sweep_kws = (; outputlevel, extract_kwargs, insert_kwargs, nsites, order, update_kwargs)
101+ kws_array = [(; sweep_kws... , time_step= t) for t in exponent_steps]
89102 sweep_iter = sweep_iterator (init_prob, kws_array)
90103 converged_prob = sweep_solve (sweep_iter; outputlevel, kws... )
91104 return state (converged_prob)
92105end
93106
94- process_real_times (z) = round (- imag (z); digits= 10 )
107+ process_real_times (z) = iszero ( abs (z)) ? 0.0 : round (- imag (z); digits= 10 )
95108
96109function time_evolve (
97110 operator,
98111 time_points,
99112 init_state;
100113 process_time= process_real_times,
101- sweep_printer= (a... ; k... )-> sweep_printer (a... ; process_time, k... ),
114+ sweep_printer= (
115+ a... ; k...
116+ )-> sweep_printer (a... ; exponent_description= " time" , process_time, k... ),
102117 kws... ,
103118)
104119 exponents = [- im* t for t in time_points]
0 commit comments