Source code for pyvibdmc.simulation_utilities.sim_logger

from .Constants import *

__all__ = ['SimLogger']


[docs] class SimLogger: """A utility class for logging the simulation, writes to .log file.""" def __init__(self, fname, overwrite=False): if overwrite: self.fl = open(fname, 'w') else: self.fl = open(fname, 'a')
[docs] def finish_sim(self, final_time): self.fl.write("Simulation has finished.\n\n") self.fl.write(f"Simulation took {final_time} seconds.\n\n") self.fl.close()
[docs] def final_chkpt(self): self.fl.write("\nFinal checkpoint is written to chkpts folder.\n\n")
[docs] def write_ts(self, cur_time_step): self.fl.write(f"Time step {cur_time_step}\n")
[docs] def write_chkpt(self, cur_time_step): self.fl.write(f"Checkpointing, time step {cur_time_step}\n")
[docs] def write_wfn_save(self, cur_time_step): self.fl.write(f"Starting descendant weighting, time step {cur_time_step}\n") self.fl.write(f"Will save wave function from time step {cur_time_step}\n")
[docs] def write_desc_wt(self, cur_time_step): self.fl.write(f"Finished descendant weighting at end of time step {cur_time_step}\n") self.fl.write(f"Saving wave function with descendant weights\n")
[docs] def write_pot_time(self, cur_time_step, pot_time, maxpot, minpot, avgpot): maxpot = Constants.convert(maxpot, 'wavenumbers', to_AU=False) minpot = Constants.convert(minpot, 'wavenumbers', to_AU=False) avgpot = Constants.convert(avgpot, 'wavenumbers', to_AU=False) self.fl.write(f"Potential call time at time step {cur_time_step}:\n") self.fl.write(f"\t{pot_time} seconds\n") self.fl.write(f"\tAverage energy of ensemble: {avgpot} cm-1 (without vref correction)\n") self.fl.write(f"\tHighest energy walker: {maxpot} cm-1\n") self.fl.write(f"\tLowest energy walker: {minpot} cm-1\n")
[docs] def write_local(self, local_energy): avg_l = Constants.convert(local_energy, 'wavenumbers', to_AU=False) self.fl.write(f"\tAverage local energy of ensemble: {avg_l} cm-1 \n")
[docs] def write_branching(self, cur_time_step, weighting, birthdeath_branch): if weighting == 'discrete': self.fl.write(f"Birth/Death at time step {cur_time_step}:\n") self.fl.write(f"\tWalker Births: {birthdeath_branch[0]}\n") self.fl.write(f"\tWalker Deaths: {birthdeath_branch[1]}\n") self.fl.write(f"\tNumber of Walkers: {birthdeath_branch[2]}\n") elif weighting == 'continuous': self.fl.write(f"Branching at time step {cur_time_step}:\n") self.fl.write(f"\tWalkers Branched: {birthdeath_branch[0]}:\n") self.fl.write(f"\tMax Wt before Branched: {birthdeath_branch[1]}:\n") self.fl.write(f"\tMin Wt before Branched: {birthdeath_branch[2]}:\n")
[docs] def write_beginning(self, attribs): self.fl.write(f"Simulation {attribs['sim_name']} starting at step {attribs['cur_timestep']}\n") self.fl.write(f"Potential attributes: \n") potential_info = attribs['potential_info'] for key, value in potential_info.items(): if not key.startswith("_"): self.fl.write(f"\t{key}: {value}\n") if attribs['impsamp_manager'] is not None: imp_info = attribs['imp_info'] self.fl.write("Imp Samp attributes: \n") for key, value in imp_info.items(): if not key.startswith("_"): self.fl.write(f"\t{key}: {value}\n") self.fl.write(f"Num Walkers: {attribs['num_walkers']}\n") self.fl.write(f"Num Time Steps: {attribs['num_timesteps']}\n") self.fl.write(f"Weighting Type: {attribs['weighting']}\n") self.fl.write(f"Branch every {attribs['branch_every']} Time Step(s)\n") self.fl.write(f"Delta Tau: {attribs['delta_t']} a.u.\n") self.fl.write(f"Start Structure Array Shape: {attribs['start_structures'].shape}\n") self.fl.write(f"Masses of Each Atom: {attribs['masses']}\n") self.fl.write(f"Equilibration Steps Before Collecting Wave Functions: {attribs['equil_steps']}\n") self.fl.write(f"Checkpoint Every {attribs['chkpt_every']} time steps\n") self.fl.write(f"Collect Wave Functions Every {attribs['wfn_every']} Time Steps After Equilibration\n") self.fl.write("\n")
[docs] def write_rejections(self, rejected, total): self.fl.write(f"Metropolis rejected {rejected} of {total} walkers ({(rejected / total) * 100:0.2f} %)\n")
[docs] def write_imp_disp_time(self, time): self.fl.write(f"Imp samp displacement took {time} seconds.\n")