def __init__(self, xc): """xc: exchange-correlation functional e.g. PBE or PW.""" self.db = gbrv_database(xc)
def __init__(self): self._db = gbrv_database()
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
def __init__(self, xc): """xc: Exchange-correlation functional.""" self.db = gbrv_database(xc)
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 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
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