示例#1
0
    def fix(self, err_jobdir, new_jobdir, settings):
        """ Try to fix by making kpoints subdivisions odd or changing kpoint length"""
        continue_job(err_jobdir, new_jobdir, settings)
        kpt = io.Kpoints(os.path.join(new_jobdir, "KPOINTS"))

        if kpt.automode[0].lower() == "a":
            old_kpt = kpt.subdivisions[0]
            ocr = io.Outcar(os.path.join(err_jobdir, "OUTCAR"))
            max_k = max(ocr.kpts)
            kpt.automode = "GAMMA"
            kpt.subdivisions = [max_k, max_k, max_k]
            kpt.shift = [0.0, 0.0, 0.0]
            print("  Changed KPOINTS from AUTO (%s) to GAMMA (%s)" %
                  (old_kpt, kpt.subdivisions))
            kpt.write(os.path.join(new_jobdir, "KPOINTS"))

        else:
            odd = True
            for i in range(len(kpt.subdivisions)):
                if kpt.subdivisions[i] % 2 == 0:
                    odd = False
                    kpt.subdivisions[i] += 1

            if odd == False:
                print("  Set KPOINTS subdivision to be odd:", kpt.subdivisions,
                      "and mode to Gamma")
                kpt.automode = "Gamma"
                kpt.write(os.path.join(new_jobdir, "KPOINTS"))
示例#2
0
    def complete(self):
        """Check if the VASP convergence is complete.

           Completion criteria: .../config/calctype/prop/prop_value/run.final/OUTCAR exists and is complete
        """
        outcarfile = os.path.join(self.finaldir, "OUTCAR")
        if not os.path.isfile(outcarfile):
            return False
        if not io.Outcar(outcarfile).complete():
            return False
        return True
示例#3
0
    def complete(self):
        """Check if the VASP relaxation is complete.

           Completion criteria: .../config/vasp/relax/run.final/OUTCAR exists and is complete
        """
        outcarfile = os.path.join(self.finaldir,"OUTCAR")
        if not os.path.isfile(outcarfile):
            return False
        if not io.Outcar(outcarfile).complete():
            return False
        return True
示例#4
0
    def complete(self):
        """Check if the VASP calculation is complete.

           Completion criteria: self.calcdir/self.rundir[-1]/OUTCAR exists and is complete
        """
        ## test if this gives write output when job is still running
        for img in range(1, self.settings["n_images"] + 1):
            outcarfile = os.path.join(self.rundir[-1],
                                      str(img).zfill(2), "OUTCAR")
            if not os.path.isfile(outcarfile):
                return False
            if not io.Outcar(outcarfile).complete():  ## check this
                return False
        return True
示例#5
0
def crash_check(jobdir, stdoutfile, crash_types):
    """ Check vasp stdout for evidence of a crash """
    err = None
    possible = [i_err() for i_err in _CrashError.__subclasses__()]
    ocar = io.Outcar(os.path.join(jobdir, "OUTCAR"))
    if ocar.complete:
        return None
    # Error to check line by line, only track most-recent error
    sout = open(stdoutfile, 'r')
    for line in sout:
        for p in possible:
            if p.error(line=line, jobdir=jobdir):
                err = p
    sout.close()
    if err is None:
        return None
    else:
        return {err.__class__.__name__: err}
示例#6
0
    def error(line=None, jobdir=None):  #pylint: disable=unused-argument
        """ Check if VASP appears frozen

            Returns true if:
            1) no file has been modified for 5 minutes
            2) 'LOOP+' exists in OUTCAR and no output file has been modified
            in 5x the time for the slowest loop
        """

        # Check if any files modified in last 300 s
        most_recent = None
        most_recent_file = None
        for f in os.listdir(jobdir):
            t = time.time() - os.path.getmtime(os.path.join(jobdir, f))
            if most_recent is None:
                most_recent = t
                most_recent_file = f
            elif t < most_recent:
                most_recent = t
                most_recent_file = f

        print("Most recent file output (" + most_recent_file + "):",
              most_recent, " seconds ago.")
        sys.stdout.flush()
        if t < 300:
            return False

        outcar = io.Outcar(os.path.join(jobdir, "OUTCAR"))
        if outcar.complete:
            print("outcar.complete:", outcar.complete)
            sys.stdout.flush()
            return False
        elif outcar.slowest_loop != None and most_recent > 5.0 * outcar.slowest_loop:
            print("slowest_loop:", outcar.slowest_loop)
            print("5.0*slowest_loop:", 5.0 * outcar.slowest_loop)
            print("most_recent:", most_recent)
            sys.stdout.flush()
            return True
        return False
示例#7
0
    def run(self):
        """ Perform a series of vasp jobs to relax a structure. Performs a series of vasp calculations until
            convergence is reached according to the criteria in 'status()'. Then performs a final constant volume run
            {"ISIF":2, "ISMEAR":-5, "NSW":0, "IBRION":-1}.
        """

        print("Begin VASP convergence run")
        sys.stdout.flush()

        # get current status of the relaxation:
        (status, task) = self.status()
        print("\n++  status:", status, "  next task:", task)
        sys.stdout.flush()

        while status == "incomplete":
            if task == "setup":
                self.add_rundir()
                self.setup(self.rundir[-1])

            elif task == "relax":
                self.add_rundir()
                continue_job(self.rundir[-2], self.rundir[-1], self.settings)
                shutil.copyfile(os.path.join(self.propdir, "INCAR.base"),
                                os.path.join(self.rundir[-1], "INCAR"))

            elif task == "constant":
                self.add_rundir()
                continue_job(self.rundir[-2], self.rundir[-1], self.settings)

                # set INCAR to ISIF = 2, ISMEAR = -5, NSW = 0, IBRION = -1
                if (self.settings["final"] != None) and (os.path.isfile(
                        os.path.join(self.propdir, self.settings["final"]))):
                    new_values = io.Incar(
                        os.path.join(self.propdir,
                                     self.settings["final"])).tags
                else:
                    new_values = {
                        "ISIF": 2,
                        "ISMEAR": -5,
                        "NSW": 0,
                        "IBRION": -1
                    }

                # set INCAR system tag to denote 'final'
                if io.get_incar_tag("SYSTEM", self.rundir[-1]) is None:
                    new_values["SYSTEM"] = "final"
                else:
                    new_values["SYSTEM"] = io.get_incar_tag(
                        "SYSTEM", self.rundir[-1]) + " final"

                io.set_incar_tag(new_values, self.rundir[-1])
                print("  Set INCAR tags:", new_values, "\n")
                sys.stdout.flush()

            else:
                # probably hit walltime
                self.add_rundir()
                continue_job(self.rundir[-2], self.rundir[-1], self.settings)

            while True:
                # run vasp
                result = run(self.rundir[-1],
                             npar=self.settings["npar"],
                             ncore=self.settings["ncore"],
                             command=self.settings["vasp_cmd"],
                             ncpus=self.settings["ncpus"],
                             kpar=self.settings["kpar"],
                             err_types=self.settings["err_types"])

                # if no errors, continue
                if result is None or self.not_converging():
                    # Check for actions that should be taken after the initial run
                    if len(self.rundir) == 1:
                        if self.settings["fine_ngx"]:
                            outcarfile = os.path.join(self.rundir[-1],
                                                      "OUTCAR")
                            if not os.path.isfile(outcarfile):
                                # This is an error but I'm not sure what to do about it
                                pass
                            else:
                                init_outcar = io.Outcar(outcarfile)
                                if not init_outcar.complete:
                                    # This is an error but I'm not sure what to do about it
                                    pass
                                elif (init_outcar.ngx is None
                                      or init_outcar.ngy is None
                                      or init_outcar.ngz is None):
                                    # This is an error but I'm not sure what to do about it
                                    pass
                                else:
                                    ng_tags = {
                                        "ngx": init_outcar.ngx * 2,
                                        "ngy": init_outcar.ngy * 2,
                                        "ngz": init_outcar.ngz * 2
                                    }
                                    print(ng_tags)
                                    io.set_incar_tag(ng_tags, self.propdir,
                                                     "INCAR.base")

                    break

                # else, attempt to fix first error
                self.add_errdir()
                os.mkdir(self.rundir[-1])
                # self.add_rundir()
                err = result.itervalues().next()

                print("\n++  status:", "error", "  next task:", "fix_error")
                sys.stdout.flush()

                print("Attempting to fix error:", str(err))
                err.fix(self.errdir[-1], self.rundir[-1], self.settings)
                print("")
                sys.stdout.flush()

                if (self.settings["backup"] != None) and len(self.rundir) > 1:
                    print("Restoring from backups:")
                    for my_file in self.settings["backup"]:
                        if os.path.isfile(
                                os.path.join(self.rundir[-2],
                                             my_file + "_BACKUP.gz")):
                            f_in = gzip.open(
                                os.path.join(self.rundir[-2],
                                             my_file + "_BACKUP.gz", 'rb'))
                            f_out = open(
                                os.path.join(self.rundir[-1], my_file, 'wb'))
                            f_out.write(f_in.read())
                            f_in.close()
                            f_out.close()
                            print(my_file, " restored!")
                    sys.stdout.flush()

            (status, task) = self.status()
            print("\n++  status:", status, "  next task:", task)
            sys.stdout.flush()

        if status == "complete":
            if not os.path.isdir(self.finaldir):
                # mv final results to relax.final
                print("mv", os.path.basename(self.rundir[-1]),
                      os.path.basename(self.finaldir))
                sys.stdout.flush()
                os.rename(self.rundir[-1], self.finaldir)
                self.rundir.pop()
                complete_job(self.finaldir, self.settings)

        return (status, task)