def converged(self): """Check if configuration is relaxed. This is called when self.rundir[-1] is complete and not a constant volume job. Convergence criteria is: at least 2 relaxation jobs are complete, and: 1) the last job completed with <= 3 ionic steps or 2) the last two jobs had final E0 differ by less than self.settings["nrg_convergence"] """ if len(self.rundir) >= 2: if io.ionic_steps(self.rundir[-1]) <= 3: return True if self.settings["nrg_convergence"] != None: if io.job_complete(self.rundir[-1]) and io.job_complete( self.rundir[-2]): osz_1 = io.Oszicar(os.path.join(self.rundir[-1], "OSZICAR")) osz_2 = io.Oszicar(os.path.join(self.rundir[-2], "OSZICAR")) if abs(osz_1.E[-1] - osz_2.E[-1]) < self.settings["nrg_convergence"]: return True return False
def status(self): """ Determine the status of a vasp relaxation series of runs. Individual runs in the series are in directories labeled "run.0", "run.1", etc. Returns a tuple: (status = "incomplete" or "complete" or "not_converging", task = continuedir or "relax" or "constant" or None) The first value is the status of the entire relaxation. The second value is the current task, where 'continuedir' is the path to a vasp job directory that is not yet completed, "relax" indicates another volume relaxation job is required, and "constant" that a constant volume run is required. """ # check if all complete if io.job_complete(self.finaldir): return ("complete", None) # check status of relaxation runs self.update_rundir() # if not yet started if len(self.rundir) == 0: return ("incomplete", "setup") # if the latest run is complete: if io.job_complete(self.rundir[-1]): # if it is a final constant volume run if io.get_incar_tag("SYSTEM", self.rundir[-1]) != None: if io.get_incar_tag("SYSTEM", self.rundir[-1]).split()[-1].strip().lower( ) == "final": # if io.get_incar_tag("ISIF", self.rundir[-1]) == 2 and \ # io.get_incar_tag("NSW", self.rundir[-1]) == 0 and \ # io.get_incar_tag("ISMEAR", self.rundir[-1]) == -5: return ("complete", None) # elif constant volume run (but not the final one) if io.get_incar_tag("ISIF", self.rundir[-1]) in [0, 1, 2]: if io.get_incar_tag("NSW", self.rundir[-1]) == len( io.Oszicar(os.path.join(self.rundir[-1], "OSZICAR")).E): return ("incomplete", "relax" ) # static run hit NSW limit and so isn't "done" else: return ("incomplete", "constant") # elif convergence criteria met if self.converged(): return ("incomplete", "constant") # elif not converging, return 'not_converging' error if self.not_converging(): return ("not_converging", None) # else continue relaxing else: return ("incomplete", "relax") # elif not converging, return 'not_converging' error elif self.not_converging(): return ("not_converging", None) # else if the latest run is not complete, continue running it return ("incomplete", self.rundir[-1])