Beispiel #1
0
 def __init__(self, xc):
     """xc: exchange-correlation functional e.g. PBE or PW."""
     self.db = gbrv_database(xc)
Beispiel #2
0
 def __init__(self):
     self._db = gbrv_database()
Beispiel #3
0
    def compute_eos(self):
        results = self.get_results()

        # Read etotals and fit E(V) with a parabola to find the minimum
        etotals = self.read_etotals(unit="eV")[1:]
        assert len(etotals) == len(self.volumes)

        results.update(dict(
            etotals=list(etotals),
            volumes=list(self.volumes),
            num_sites=len(self.relaxed_structure),
        ))

        try:
            eos_fit = EOS.Quadratic().fit(self.volumes, etotals)
        except EOS.Error as exc:
            results.push_exceptions(exc)

        # Function to compute cubic a0 from primitive v0 (depends on struct_type)
        vol2a = {"fcc": lambda vol: (4 * vol) ** (1/3.),
                 "bcc": lambda vol: (2 * vol) ** (1/3.),
                 }[self.struct_type]

        a0 = vol2a(eos_fit.v0)

        results.update(dict(
            v0=eos_fit.v0,
            b0=eos_fit.b0,
            b1=eos_fit.b1,
            a0=a0,
            struct_type=self.struct_type
        ))

        db = gbrv_database()
        entry = db.get_entry(self.pseudo.symbol, stype=self.struct_type)

        pawabs_err = a0 - entry.gbrv_paw
        pawrel_err = 100 * (a0 - entry.gbrv_paw) / entry.gbrv_paw

        # AE results for P and Hg are missing.
        if entry.ae is not None:
            abs_err = a0 - entry.ae
            rel_err = 100 * (a0 - entry.ae) / entry.ae
        else:
            # Use GBRV_PAW as reference.
            abs_err = pawabs_err
            rel_err = pawrel_err

        print("for GBRV struct_type: ", self.struct_type, "a0= ", a0, "Angstrom")
        print("AE - THIS: abs_err = %f, rel_err = %f %%" % (abs_err, rel_err))
        print("GBRV-PAW - THIS: abs_err = %f, rel_err = %f %%" % (pawabs_err, pawrel_err))

        d = {k: results[k] for k in ("a0", "etotals", "volumes")}
        d["a0_abs_err"] = abs_err
        d["a0_rel_err"] = rel_err
        if results.exceptions:
            d["_exceptions"] = str(results.exceptions)

        self.write_dojo_report(d)

        return results
Beispiel #4
0
 def __init__(self, xc):
     """xc: Exchange-correlation functional."""
     self.db = gbrv_database(xc)
Beispiel #5
0
    def compute_eos(self):
        """Compute the EOS as describedin the GBRV paper."""
        self.history.info("Computing EOS")

        # Read etotals and fit E(V) with a parabola to find the minimum
        etotals = self.read_etotals(unit="eV")[1:]
        assert len(etotals) == len(self.volumes)

        results = {}
        results.update(dict(
            etotals=list(etotals),
            volumes=list(self.volumes),
            num_sites=len(self.relaxed_structure),
            #pseudos=self.pseudos.as_dict(),
        ))

        try:
            eos_fit = EOS.Quadratic().fit(self.volumes, etotals)
        except EOS.Error as exc:
            results.push_exceptions(exc)

        # Function to compute cubic a0 from primitive v0 (depends on struct_type)
        vol2a = {"fcc": lambda vol: (4 * vol) ** (1/3.),
                 "bcc": lambda vol: (2 * vol) ** (1/3.),
                 "rocksalt": lambda vol: (4 * vol) ** (1/3.),
                 "ABO3": lambda vol: vol ** (1/3.),
                 "hH": lambda vol: (4 * vol) ** (1/3.),
                 }[self.struct_type]
        a0 = vol2a(eos_fit.v0)

        results.update(dict(
            ecut=self.ecut,
            pawecutdg=self.pawecutdg,
            struct_type=self.struct_type,
            v0=eos_fit.v0,
            b0=eos_fit.b0,
            #b1=eos_fit.b1, # infinity
            a0=a0,
        ))

        db = gbrv_database(xc=self.xc)
        entry = db.get_entry(self.formula, stype=self.struct_type)

        try:
            pawabs_err = a0 - entry.gbrv_paw
            pawrel_err = 100 * (a0 - entry.gbrv_paw) / entry.gbrv_paw
        except:
            # Some paw_abinit entries are not available.
            pawabs_err = np.inf
            pawrel_err = np.inf

        # If AE results are missing we use GBRV_PAW as reference.
        if entry.ae is not None:
            ref_a0 = entry.ae
            abs_err = a0 - entry.ae
            rel_err = 100 * (a0 - entry.ae) / entry.ae
        else:
            assert pawabs_err is not None
            assert pawrel_err is not None
            ref_a0 = entry.gbrv_paw
            abs_err = pawabs_err
            rel_err = pawrel_err

        results["a0_abs_err"] = abs_err
        results["a0_rel_err"] = rel_err

        print(80 * "=")
        print("pseudos:", list(p.basename for p in self.pseudos))
        print("for %s (%s): my_a0=%.3f, ref_a0=%.3f Angstrom" % (self.formula, self.struct_type, a0, ref_a0))
        print("AE - THIS: abs_err=%f, rel_err=%f %%" % (abs_err, rel_err))
        print("GBRV-PAW - THIS: abs_err=%f, rel_err=%f %%" % (pawabs_err, pawrel_err))
        print(80 * "=")

        # Write results in outdir in JSON format.
        with open(self.outdir.path_in("gbrv_results.json"), "wt") as fh:
             json.dump(results, fh, indent=-1, sort_keys=True) #, cls=MontyEncoder)

        # Update the database.
        if self.outdb_path is not None:
            GbrvOutdb.insert_results(self.outdb_path, self.struct_type, self.formula,
                                     self.accuracy, self.pseudos, results)

        return results
 def __init__(self, xc):
     """xc: Exchange-correlation functional."""
     self.db = gbrv_database(xc)
    def compute_eos(self):
        """Compute the EOS as described in the GBRV paper."""
        self.history.info("Computing EOS")

        # Read etotals and fit E(V) with a parabola to find the minimum
        etotals = self.read_etotals(unit="eV")[1:]
        assert len(etotals) == len(self.volumes)

        results = {}
        results.update(dict(
            etotals=list(etotals),
            volumes=list(self.volumes),
            num_sites=len(self.relaxed_structure),
            #pseudos=self.pseudos.as_dict(),
        ))

        try:
            eos_fit = EOS.Quadratic().fit(self.volumes, etotals)
        except EOS.Error as exc:
            results.push_exceptions(exc)

        # Function to compute cubic a0 from primitive v0 (depends on struct_type)
        vol2a = {"fcc": lambda vol: (4 * vol) ** (1/3.),
                 "bcc": lambda vol: (2 * vol) ** (1/3.),
                 "rocksalt": lambda vol: (4 * vol) ** (1/3.),
                 "ABO3": lambda vol: vol ** (1/3.),
                 "hH": lambda vol: (4 * vol) ** (1/3.),
                 }[self.struct_type]
        a0 = vol2a(eos_fit.v0)

        results.update(dict(
            ecut=self.ecut,
            pawecutdg=self.pawecutdg,
            struct_type=self.struct_type,
            v0=eos_fit.v0,
            b0=eos_fit.b0,
            #b1=eos_fit.b1, # infinity
            a0=a0,
        ))

        db = gbrv_database(xc=self.xc)
        entry = db.get_entry(self.formula, stype=self.struct_type)

        try:
            pawabs_err = a0 - entry.gbrv_paw
            pawrel_err = 100 * (a0 - entry.gbrv_paw) / entry.gbrv_paw
        except Exception:
            # Some paw_abinit entries are not available.
            pawabs_err = np.inf
            pawrel_err = np.inf

        # If AE results are missing we use GBRV_PAW as reference.
        if entry.ae is not None:
            ref_a0 = entry.ae
            abs_err = a0 - entry.ae
            rel_err = 100 * (a0 - entry.ae) / entry.ae
        else:
            assert pawabs_err is not None
            assert pawrel_err is not None
            ref_a0 = entry.gbrv_paw
            abs_err = pawabs_err
            rel_err = pawrel_err

        results["a0_rel_err"] = rel_err
        results["a0_abs_err"] = abs_err
        results["pseudos"] = {p.basename: p.md5 for p in self.pseudos}

        print(80 * "=")
        print("pseudos:", list(p.basename for p in self.pseudos))
        print("for %s (%s): my_a0=%.3f, ref_a0=%.3f Angstrom" % (self.formula, self.struct_type, a0, ref_a0))
        print("AE - THIS: abs_err=%f, rel_err=%f %%" % (abs_err, rel_err))
        print("GBRV-PAW - THIS: abs_err=%f, rel_err=%f %%" % (pawabs_err, pawrel_err))
        print(80 * "=")

        # Write results in outdir in JSON format.
        with open(self.outdir.path_in("gbrv_results.json"), "wt") as fh:
            json.dump(results, fh, indent=-1, sort_keys=True)

        # Update the database.
        if self.outdb_path is not None:
            GbrvOutdb.insert_results(self.outdb_path, self.struct_type, self.formula,
                                     self.accuracy, self.pseudos, results)

        return results
Beispiel #8
0
    def compute_eos(self):
        self.history.info("Computing EOS")
        #results = self.get_results()

        # Read etotals and fit E(V) with a parabola to find the minimum
        etotals = self.read_etotals(unit="eV")[1:]
        assert len(etotals) == len(self.volumes)

        results = {}
        results.update(dict(
            etotals=list(etotals),
            volumes=list(self.volumes),
            num_sites=len(self.relaxed_structure),
        ))

        try:
            eos_fit = EOS.Quadratic().fit(self.volumes, etotals)
        except EOS.Error as exc:
            results.push_exceptions(exc)
        #return results

        # Function to compute cubic a0 from primitive v0 (depends on struct_type)
        vol2a = {"fcc": lambda vol: (4 * vol) ** (1/3.),
                 "rocksalt": lambda vol: (4 * vol) ** (1/3.),
                 "bcc": lambda vol: (2 * vol) ** (1/3.),
                 "ABO3": lambda vol: vol ** (1/3.),
                 }[self.struct_type]

        a0 = vol2a(eos_fit.v0)

        results.update(dict(
            v0=eos_fit.v0,
            b0=eos_fit.b0,
            b1=eos_fit.b1,
            a0=a0,
            ecut=self.ecut,
            #struct_type=self.struct_type
        ))

        # Update the database.
        # TODO, handle error!
        if self.outdb_path is not None:
            GbrvOutdb.update_record(self.outdb_path, self.formula, self.accuracy, self.pseudos, results)

        db = gbrv_database()
        entry = db.get_entry(self.formula, stype=self.struct_type)

        pawabs_err = a0 - entry.gbrv_paw
        pawrel_err = 100 * (a0 - entry.gbrv_paw) / entry.gbrv_paw

        # If AE results are missing we use GBRV_PAW as reference.
        if entry.ae is not None:
            abs_err = a0 - entry.ae
            rel_err = 100 * (a0 - entry.ae) / entry.ae
        else:
            abs_err = pawabs_err
            rel_err = pawrel_err

        print("for %s (%s) a0=%.2f Angstrom" % (self.formula, self.struct_type, a0))
        print("AE - THIS: abs_err = %f, rel_err = %f %%" % (abs_err, rel_err))
        print("GBRV-PAW - THIS: abs_err = %f, rel_err = %f %%" % (pawabs_err, pawrel_err))

        #d = {k: results[k] for k in ("a0", "etotals", "volumes")}
        #d["a0_abs_err"] = abs_err
        #d["a0_rel_err"] = rel_err
        #if results.exceptions:
        #    d["_exceptions"] = str(results.exceptions)

        return results