diff --git a/docs/source/databases.rst b/docs/source/databases.rst index e4a7c3ad..7a3d411e 100644 --- a/docs/source/databases.rst +++ b/docs/source/databases.rst @@ -6,9 +6,13 @@ Databases ==================== ========================= ======================================================= Database name Number of data-points Description ==================== ========================= ======================================================= -``dft_3d`` 55723 Various 3D materials properties in JARVIS-DFT database +``dft_3d`` 75993 Various 3D materials properties in JARVIS-DFT database computed with OptB88vdW and TBmBJ methods -``dft_2d`` 1079 Various 2D materials properties in JARVIS-DFT database +``dft_2d`` 1109 Various 2D materials properties in JARVIS-DFT database + computed with OptB88vdW +``dft_3d_2021`` 55723 Various 3D materials properties in JARVIS-DFT database + computed with OptB88vdW and TBmBJ methods +``dft_2d_2021`` 1079 Various 2D materials properties in JARVIS-DFT database computed with OptB88vdW ``qe_tb`` 829574 Various 3D materials properties in JARVIS-QETB database ``stm`` 1132 2D materials STM images in JARVIS-STM database diff --git a/jarvis/__init__.py b/jarvis/__init__.py index d595e2bf..ba536cfb 100644 --- a/jarvis/__init__.py +++ b/jarvis/__init__.py @@ -1,5 +1,5 @@ """Version number.""" -__version__ = "2023.01.09" +__version__ = "2023.04.06" import os diff --git a/jarvis/ai/descriptors/cfid.py b/jarvis/ai/descriptors/cfid.py index 7882ba1f..eaab819f 100644 --- a/jarvis/ai/descriptors/cfid.py +++ b/jarvis/ai/descriptors/cfid.py @@ -139,10 +139,10 @@ def get_chem_only_descriptors( chem = np.mean(np.array(arr), axis=0) / sum names = ["Mean_" + source + "_" + str(n) for n in names] elif max_only: - chem = np.max(np.array(arr), axis=0) / sum + chem = np.max(np.array(arr), axis=0) # / sum names = ["Max_" + source + "_" + str(n) for n in names] elif min_only: - chem = np.min(np.array(arr), axis=0) / sum + chem = np.min(np.array(arr), axis=0) # / sum names = ["Min_" + source + "_" + str(n) for n in names] else: chem = ( diff --git a/jarvis/analysis/thermodynamics/energetics.py b/jarvis/analysis/thermodynamics/energetics.py index b145c9fc..0ff9cfdf 100644 --- a/jarvis/analysis/thermodynamics/energetics.py +++ b/jarvis/analysis/thermodynamics/energetics.py @@ -407,6 +407,10 @@ def plot3d4(self, ax): def jid_hull(jid="", dataset=[]): """Get ehull for a jid and a dataset e.g. dft_3d.""" + from jarvis.db.figshare import data + + if isinstance(dataset, str): + dataset = data(dataset) for i in dataset: if i["jid"] == jid: system = list(set(i["atoms"]["elements"])) @@ -425,3 +429,35 @@ def jid_hull(jid="", dataset=[]): for i in info: if i[0][2] == jid: return i + + +def formula_hull(formula_energy_id=[], dataset=[]): + """Get ehull for a formula_energy_id pair and a dataset e.g. dft_3d.""" + # e.g. ["Al2O3",-1.0,"JVASP-xyz"] + # for i in dataset: + # if i["jid"] == jid: + # system = list(set(i["atoms"]["elements"])) + from jarvis.db.figshare import data + + if isinstance(dataset, str): + dataset = data(dataset) + + c = Composition.from_string(formula_energy_id[0]) + system = list(c.to_dict().keys()) + z = [] + z.append(formula_energy_id) + + for i in dataset: + formula = i["formula"] + comp = Composition.from_string(formula) + # atom_frac = comp.atomic_fraction + all_elms = list(comp.to_dict()) + if (set(all_elms)).issubset(set(system)): + z.append([i["formula"], i["formation_energy_peratom"], i["jid"]]) + + pdj = PhaseDiagram(z) + # pdj.plot() + info = pdj.get_ehull_all() + for i in info: + if i[0][2] == formula_energy_id[-1]: + return i diff --git a/jarvis/db/figshare.py b/jarvis/db/figshare.py index dd73dc80..f9e4eba7 100644 --- a/jarvis/db/figshare.py +++ b/jarvis/db/figshare.py @@ -42,6 +42,20 @@ def get_db_info(): "https://www.nature.com/articles/s41524-020-00440-1" + "\nOther versions:https://doi.org/10.6084/m9.figshare.6815699", ], + # https://doi.org/10.6084/m9.figshare.6815705 + "dft_2d_2021": [ + "https://ndownloader.figshare.com/files/26808917", + "d2-3-12-2021.json", + "Obtaining 2D dataset 1.1k ...", + "https://www.nature.com/articles/s41524-020-00440-1", + ], + # https://doi.org/10.6084/m9.figshare.6815699 + "dft_3d_2021": [ + "https://ndownloader.figshare.com/files/29204826", + "jdft_3d-8-18-2021.json", + "Obtaining 3D dataset 55k ...", + "https://www.nature.com/articles/s41524-020-00440-1", + ], # https://doi.org/10.6084/m9.figshare.6815699 "cfid_3d": [ "https://ndownloader.figshare.com/files/29205201", diff --git a/jarvis/io/qe/inputs.py b/jarvis/io/qe/inputs.py index 3910183f..eeac1cc7 100644 --- a/jarvis/io/qe/inputs.py +++ b/jarvis/io/qe/inputs.py @@ -27,12 +27,17 @@ def __init__( url=None, sanitize=True, sanitize_tol=2e-4, + psp_temp_name=None, ): """Initialize input parameters for qunatum espresso.""" + if psp_temp_name is None: + psp_temp_name = "QE_PSPs" if input_params == {}: input_params = GenericInputs().geometry_optimization() if psp_dir is None: - psp_dir = str(os.path.join(os.path.dirname(__file__), "QE_PSPs")) + psp_dir = str( + os.path.join(os.path.dirname(__file__), psp_temp_name) + ) # Download GBRV PSPs by default if url is None: url = ( @@ -188,7 +193,7 @@ def get_psp(self, element): """Obtain psuedopotential for an element.""" element = str(element).lower() for i in os.listdir(self.psp_dir): - el = str(i.split("_")[0]).lower() + el = str(i.split(".")[0].split("_")[0]).lower() if el == element: return i diff --git a/jarvis/tasks/qe/converg.py b/jarvis/tasks/qe/converg.py index b4135344..6800a251 100644 --- a/jarvis/tasks/qe/converg.py +++ b/jarvis/tasks/qe/converg.py @@ -16,6 +16,8 @@ def converg_kpoints( increment=5, qe_cmd="/cluster/deb9/bin/mpirun -n 16 /cluster/bin/pw.x", psp_dir=None, + url=None, + psp_temp_name=None, ): """Converge k-points for a material.""" scf_init = { @@ -79,6 +81,8 @@ def converg_kpoints( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + psp_temp_name=psp_temp_name, + url=url, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -115,6 +119,8 @@ def converg_kpoints( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + psp_temp_name=psp_temp_name, + url=url, input_file=prefix + "_ascf_init.in", ) @@ -153,6 +159,8 @@ def converg_kpoints( input_params=scf_init, output_file="scf_init.out", qe_cmd=qe_cmd, + psp_temp_name=psp_temp_name, + url=url, jobname=prefix, kpoints=kpoints, input_file=prefix + "_ascf_init.in", @@ -178,6 +186,8 @@ def converg_kpoints( input_params=scf_init, output_file="scf_init.out", qe_cmd=qe_cmd, + psp_temp_name=psp_temp_name, + url=url, jobname=prefix, kpoints=kpoints, input_file=prefix + "_ascf_init.in", @@ -204,6 +214,8 @@ def converg_kpoints( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + psp_temp_name=psp_temp_name, + url=url, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -228,6 +240,8 @@ def converg_kpoints( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + psp_temp_name=psp_temp_name, + url=url, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -252,6 +266,8 @@ def converg_kpoints( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + psp_temp_name=psp_temp_name, + url=url, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -310,7 +326,8 @@ def converg_kpoints( length1 = length3 else: print( - "KPOINTS convergence achieved for ", length1, + "KPOINTS convergence achieved for ", + length1, ) convg_kp2 = True @@ -325,6 +342,8 @@ def converg_cutoff( tol=0.001, increment=5, psp_dir=None, + url=None, + psp_temp_name=None, qe_cmd="/cluster/deb9/bin/mpirun -n 16 /cluster/bin/pw.x", ): """Converge cutoff for a material.""" @@ -381,6 +400,8 @@ def converg_cutoff( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -403,6 +424,8 @@ def converg_cutoff( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) @@ -429,6 +452,8 @@ def converg_cutoff( psp_dir=psp_dir, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -449,6 +474,8 @@ def converg_cutoff( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -469,6 +496,8 @@ def converg_cutoff( psp_dir=psp_dir, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -489,6 +518,8 @@ def converg_cutoff( qe_cmd=qe_cmd, jobname=prefix, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() @@ -509,6 +540,8 @@ def converg_cutoff( jobname=prefix, psp_dir=psp_dir, kpoints=kpoints, + url=url, + psp_temp_name=psp_temp_name, input_file=prefix + "_ascf_init.in", ) info_scf = qejob_scf_init.runjob() diff --git a/jarvis/tasks/qe/qe.py b/jarvis/tasks/qe/qe.py index 5e383aab..57a41fa7 100644 --- a/jarvis/tasks/qe/qe.py +++ b/jarvis/tasks/qe/qe.py @@ -21,6 +21,7 @@ def __init__( output_file="qe.out", input_file="qe.in", stderr_file="std.err", + psp_temp_name=None, ): """Intitialize class.""" self.atoms = atoms @@ -30,6 +31,7 @@ def __init__( self.jobname = jobname self.psp_dir = psp_dir self.url = url + self.psp_temp_name = psp_temp_name self.input_file = input_file self.output_file = output_file self.stderr_file = stderr_file @@ -39,6 +41,7 @@ def __init__( psp_dir=self.psp_dir, input_params=self.input_params, url=self.url, + psp_temp_name=self.psp_temp_name, ) def write_input(self): diff --git a/jarvis/tasks/qe/super.py b/jarvis/tasks/qe/super.py index 7aa29919..4e6e9d28 100644 --- a/jarvis/tasks/qe/super.py +++ b/jarvis/tasks/qe/super.py @@ -71,6 +71,9 @@ def __init__( relax_calc="'vc-relax'", pressure=None, psp_dir=None, + url=None, + psp_temp_name=None, + clean_files=True, ): """Initialize the class.""" self.atoms = atoms @@ -81,7 +84,10 @@ def __init__( self.relax_calc = relax_calc self.qe_cmd = qe_cmd self.psp_dir = psp_dir + self.url = url self.pressure = pressure + self.psp_temp_name = psp_temp_name + self.clean_files = clean_files def to_dict(self): """Get dictionary.""" @@ -92,6 +98,8 @@ def to_dict(self): info["qp"] = self.qp.to_dict() info["qe_cmd"] = self.qe_cmd info["psp_dir"] = self.psp_dir + info["psp_temp_name"] = self.psp_temp_name + info["url"] = self.url info["relax_calc"] = self.relax_calc info["pressure"] = self.pressure return info @@ -106,6 +114,9 @@ def from_dict(self, info={}): qe_cmd=info["qe_cmd"], pressure=info["pressure"], relax_calc=info["relax_calc"], + psp_dir=info["psp_dir"], + url=info["url"], + psp_temp_name=info["psp_temp_name"], ) def runjob(self): @@ -116,7 +127,11 @@ def runjob(self): qp = self.qp if not kp._kpoints: kp_len = converg_kpoints( - atoms=atoms, qe_cmd=self.qe_cmd, psp_dir=self.psp_dir + atoms=atoms, + qe_cmd=self.qe_cmd, + psp_dir=self.psp_dir, + url=self.url, + psp_temp_name=self.psp_temp_name, ) kp = Kpoints3D().automatic_length_mesh( lattice_mat=atoms.lattice_mat, length=kp_len @@ -125,7 +140,10 @@ def runjob(self): kpts = non_prime_kpoints(kpts) kp = Kpoints3D(kpoints=[kpts]) print("kpts", kpts) - + else: + kpts = kp._kpoints[0] + kpts = non_prime_kpoints(kpts) + print("kpts xyz", kpts) nq1 = get_factors(kpts[0])[0] nq2 = get_factors(kpts[1])[0] nq3 = get_factors(kpts[2])[0] @@ -179,6 +197,9 @@ def runjob(self): jobname="relax", kpoints=kp, input_file="arelax.in", + url=self.url, + psp_dir=self.psp_dir, + psp_temp_name=self.psp_temp_name, ) info = qejob_relax.runjob() @@ -231,6 +252,9 @@ def runjob(self): jobname="scf_init", kpoints=kp, input_file="ascf_init.in", + url=self.url, + psp_temp_name=self.psp_temp_name, + psp_dir=self.psp_dir, ) info_scf = qejob_scf_init.runjob() @@ -264,6 +288,9 @@ def runjob(self): jobname="ph", kpoints=None, input_file="aph.in", + url=self.url, + psp_temp_name=self.psp_temp_name, + psp_dir=self.psp_dir, ) qejob_ph.runjob() @@ -286,6 +313,9 @@ def runjob(self): jobname="qr", kpoints=None, input_file="aqr.in", + url=self.url, + psp_temp_name=self.psp_temp_name, + psp_dir=self.psp_dir, ) qejob_qr.runjob() @@ -315,7 +345,13 @@ def runjob(self): jobname="matdyn", kpoints=None, input_file="amatdyn.in", + url=self.url, + psp_temp_name=self.psp_temp_name, + psp_dir=self.psp_dir, ) qejob_matdyn.runjob() parse_lambda() + cmd = "rm -r _ph0 *.wfc* */wfc* */*UPF */*upf */charge-density.dat" + if self.clean_files: + os.system(cmd) diff --git a/setup.py b/setup.py index 17ae8831..d03ef968 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ setup( name="jarvis-tools", - version="2023.01.08", + version="2023.04.06", long_description=long_d, install_requires=[ "numpy>=1.19.5",