Skip to content

Commit 82320e4

Browse files
committed
Added saving and initialization using all ADM's to HEOM (before just tier/order 0 density matrix). Also added option to print every nprint steps instead of every step (default = 1).
1 parent a56ca7f commit 82320e4

2 files changed

Lines changed: 51 additions & 16 deletions

File tree

src/libra_py/dynamics/heom/compute.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ def transform_adm(rho, rho_scaled, aux_memory, params, direction):
144144
pack_mtx(aux_memory["rho_unpacked"], rho)
145145

146146

147-
def run_dynamics(dyn_params, Ham, rho_init):
147+
#def run_dynamics(dyn_params, Ham, rho_init):
148+
def run_dynamics(dyn_params, Ham, rho_init, adm_init=None):
148149
"""
149150
This functions integrates the HEOM for a given system's Hamiltonian, initial conditions, and bath parameters
150151
@@ -188,6 +189,9 @@ def run_dynamics(dyn_params, Ham, rho_init):
188189
* **dyn_params["nsteps"]** ( int )
189190
How many steps of the dynamics to perform [ default: 10 ]
190191
192+
* **dyn_params["nprint"]** ( int )
193+
The number of steps in between data saves [ default: 1 ]
194+
191195
* **dyn_params["verbosity"]** ( int )
192196
The level of the run-time printout of any useful information [ default: -1 ]
193197
@@ -317,7 +321,7 @@ def run_dynamics(dyn_params, Ham, rho_init):
317321
"temperature": 300.0,
318322
"el_phon_couplings": initialize_el_phonon_couplings(Ham.num_of_cols),
319323

320-
"dt": 0.1 * units.fs2au, "nsteps": 10,
324+
"dt": 0.1 * units.fs2au, "nsteps": 10, "nprint": 1,
321325
"verbosity": -1, "progress_frequency": 0.1,
322326

323327
"truncation_scheme": 1, "do_scale": 0,
@@ -334,6 +338,7 @@ def run_dynamics(dyn_params, Ham, rho_init):
334338
comn.check_input(params, default_params, critical_params)
335339

336340
nsteps = params["nsteps"]
341+
#nprint = params["nprint"]
337342
print_freq = int(params["progress_frequency"] * nsteps)
338343

339344
# ============= System ======================
@@ -389,9 +394,16 @@ def run_dynamics(dyn_params, Ham, rho_init):
389394
aux_memory["drho_unpacked_scaled"].append(CMATRIX(nquant, nquant))
390395

391396
# Initial conditions
392-
x_ = Py2Cpp_int(list(range(nquant)))
393-
y_ = Py2Cpp_int(list(range(nquant)))
394-
push_submatrix(rho, rho_init, x_, y_)
397+
if adm_init is None:
398+
x_ = Py2Cpp_int(list(range(nquant)))
399+
y_ = Py2Cpp_int(list(range(nquant)))
400+
push_submatrix(rho, rho_init, x_, y_)
401+
else:
402+
# should test to make sure that len(adm_init) == nn_tot-1:
403+
aux_memory["rho_unpacked"][0] = rho_init
404+
for n in range(1,nn_tot):
405+
aux_memory["rho_unpacked"][n] = adm_init[n-1]
406+
pack_mtx(aux_memory["rho_unpacked"], rho)
395407

396408
# unpack_mtx(aux_memory["rho_unpacked"], rho)
397409

@@ -423,7 +435,8 @@ def run_dynamics(dyn_params, Ham, rho_init):
423435
aux_print_matrices(0, aux_memory["rho_unpacked_scaled"])
424436

425437
# Initialize savers
426-
_savers = save.init_heom_savers(params, nquant)
438+
#_savers = save.init_heom_savers(params, nquant)
439+
_savers = save.init_heom_savers(params, nquant, nn_tot)
427440

428441
# ============== Propagation =============
429442

src/libra_py/dynamics/heom/save.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
# ===================== HEOM output ====================
5656

57-
def init_heom_data(saver, hdf5_output_level, _nsteps, _nquant):
57+
def init_heom_data(saver, hdf5_output_level, _nsteps, _nquant, _nn_tot):
5858

5959
if hdf5_output_level >= 1:
6060
# Time axis (integer steps)
@@ -67,8 +67,13 @@ def init_heom_data(saver, hdf5_output_level, _nsteps, _nquant):
6767
# System's density matrix
6868
saver.add_dataset("denmat", (_nsteps, _nquant, _nquant), "C")
6969

70+
if hdf5_output_level >= 4:
71+
# Auxiliary density matrices
72+
saver.add_dataset("auxdenmat", (_nsteps, _nn_tot-1, _nquant, _nquant), "C")
7073

71-
def init_heom_savers(params, nquant):
74+
75+
#def init_heom_savers(params, nquant):
76+
def init_heom_savers(params, nquant, nn_tot):
7277

7378
# ================ Create savers ==================
7479
prefix = params["prefix"]
@@ -87,7 +92,8 @@ def init_heom_savers(params, nquant):
8792
if hdf5_output_level > 0:
8893
_savers["hdf5_saver"] = data_savers.hdf5_saver(F"{prefix}/data.hdf", properties_to_save)
8994
_savers["hdf5_saver"].set_compression_level(params["use_compression"], params["compression_level"])
90-
init_heom_data(_savers["hdf5_saver"], hdf5_output_level, params["nsteps"], nquant)
95+
#init_heom_data(_savers["hdf5_saver"], hdf5_output_level, params["nsteps"], nquant)
96+
init_heom_data(_savers["hdf5_saver"], hdf5_output_level, math.ceil(params["nsteps"] / params["nprint"]), nquant, nn_tot)
9197

9298
# ====== TXT ========
9399
if params["txt_output_level"] > 0:
@@ -98,26 +104,40 @@ def init_heom_savers(params, nquant):
98104

99105
if mem_output_level > 0:
100106
_savers["mem_saver"] = data_savers.mem_saver(properties_to_save)
101-
init_heom_data(_savers["mem_saver"], mem_output_level, params["nsteps"], nquant)
107+
#init_heom_data(_savers["mem_saver"], mem_output_level, params["nsteps"], nquant)
108+
init_heom_data(_savers["mem_saver"], mem_output_level, math.ceil(params["nsteps"] / params["nprint"]), nquant, nn_tot)
102109

103110
return _savers
104111

105112

106-
def save_heom_hdf5(step, saver, params, denmat):
113+
#def save_heom_hdf5(step, saver, params, denmat):
114+
def save_heom_hdf5(step, saver, params, rho_unpacked):
107115

108116
dt = params["dt"]
117+
nprint = params["nprint"]
109118
hdf5_output_level = params["hdf5_output_level"]
110119

120+
if step % nprint == 0:
121+
step = int(step / nprint)
122+
else:
123+
return None
124+
111125
if hdf5_output_level >= 1:
112126
# Timestep
113-
saver.save_scalar(step, "timestep", step)
127+
saver.save_scalar(step, "timestep", nprint * step)
114128

115129
# Actual time
116-
saver.save_scalar(step, "time", step * dt)
130+
saver.save_scalar(step, "time", nprint * step * dt)
117131

118132
if hdf5_output_level >= 3:
119133
# Average adiabatic density matrices
120-
saver.save_matrix(step, "denmat", denmat)
134+
#saver.save_matrix(step, "denmat", denmat)
135+
saver.save_matrix(step, "denmat", rho_unpacked[0])
136+
137+
if hdf5_output_level >= 4:
138+
nn_tot = len(rho_unpacked)
139+
for n in range(1,nn_tot):
140+
saver.save_multi_matrix(step, n-1, "auxdenmat", rho_unpacked[n])
121141

122142

123143
def save_heom_data(_savers, step, print_freq, params, rho_unpacked):
@@ -129,12 +149,14 @@ def save_heom_data(_savers, step, print_freq, params, rho_unpacked):
129149

130150
# Save properties
131151
if _savers["hdf5_saver"] is not None:
132-
save_heom_hdf5(step, _savers["hdf5_saver"], params, rho_unpacked[0])
152+
#save_heom_hdf5(step, _savers["hdf5_saver"], params, rho_unpacked[0])
153+
save_heom_hdf5(step, _savers["hdf5_saver"], params, rho_unpacked)
133154

134155
if _savers["txt_saver"] is not None:
135156
pass
136157

137158
if _savers["mem_saver"] is not None:
138159
prms = dict(params)
139160
prms["hdf5_output_level"] = prms["mem_output_level"]
140-
save_heom_hdf5(step, _savers["mem_saver"], prms, rho_unpacked[0])
161+
#save_heom_hdf5(step, _savers["mem_saver"], prms, rho_unpacked[0])
162+
save_heom_hdf5(step, _savers["mem_saver"], prms, rho_unpacked)

0 commit comments

Comments
 (0)