def get_wf_timing(wf_id, returnval=False): lp = LaunchPad().from_file(lpad_file_path) wf = lp.get_wf_by_fw_id(wf_id) out_run_stats = [] just_non_polar_stats = [] for fw in wf.fws: ld = fw.launches[-1].launch_dir out = None if 'OUTCAR' in os.listdir(ld): out = Outcar(os.path.join(ld, 'OUTCAR')) elif 'OUTCAR.gz' in os.listdir(ld): out = Outcar(os.path.join(ld, 'OUTCAR.gz')) if out: out_run_stats.append(out.run_stats.copy()) if 'nonpolar_polarization' in fw.name: just_non_polar_stats.append(out.run_stats.copy()) ld += '/polarization' if os.path.exists(ld): out = None if 'OUTCAR' in os.listdir(ld): out = Outcar(os.path.join(ld, 'OUTCAR')) elif 'OUTCAR.gz' in os.listdir(ld): out = Outcar(os.path.join(ld, 'OUTCAR.gz')) if out: out_run_stats.append(out.run_stats.copy()) cores = out_run_stats[0]['cores'] print('Workflow {} retrieved {} Outcars all run on {} cores'.format( wf.name, len(out_run_stats), cores)) timestat = { k: 0 for k in [ 'Elapsed time (sec)', 'System time (sec)', 'User time (sec)', 'Total CPU time used (sec)' ] } print('\nNon-Polar calc (non-polarization) alone took:') if len(just_non_polar_stats) != 1: raise ValueError("Too many non polar calcs?? = {}".format( len(just_non_polar_stats))) else: for k, v in just_non_polar_stats[0].items(): if k in timestat.keys(): print("\t{}: {}".format(k, round(v, 2))) for out in out_run_stats: if out['cores'] != cores: raise ValueError( "Inconsisten number of cores for timing! {} vs {}".format( cores, out['cores'])) for k, v in out.items(): if k in timestat: timestat[k] += v print("\nSummary of TOTAL wf timing:") for k, v in timestat.items(): print("\t{}: {}".format(k, round(v, 2))) if not returnval: return else: return {'tot': timestat, 'nonpolar': just_non_polar_stats}