"""Module to run Tc calculation."""
from jarvis.io.qe.outputs import DataFileSchema
from jarvis.core.atoms import Atoms
from jarvis.core.kpoints import Kpoints3D
from jarvis.tasks.qe.qe import QEjob
# import numpy as np
import os
# from jarvis.core.utils import get_factors
[docs]def very_clean():
"""Clean files."""
cmd = (
"rm -r elph_dir _ph0 *.dos* *.in *.json *.fc *.freq* *.save "
+ "*.out *.dyn* *wfc* *.xml *save lambda *.modes dyn*"
)
os.system(cmd)
[docs]class SuperCond(object):
"""Module to calculate Tc."""
def __init__(self, atoms=None, kp=None, qp=None, qe_cmd="pw.x"):
"""Initialize the class."""
self.atoms = atoms
self.kp = kp
self.qp = qp
self.qe_cmd = qe_cmd
[docs] def to_dict(self):
"""Get dictionary."""
info = {}
info["atoms"] = self.atoms.to_dict()
info["kp"] = self.kp.to_dict()
info["qp"] = self.qp.to_dict()
info["qe_cmd"] = self.qe_cmd
return info
[docs] @classmethod
def from_dict(self, info={}):
"""Load from a dictionary."""
return SuperCond(
atoms=Atoms.from_dict(info["atoms"]),
kp=Kpoints3D.from_dict(info["kp"]),
qp=Kpoints3D.from_dict(info["qp"]),
qe_cmd=info["qe_cmd"],
)
[docs] def runjob(self):
"""Calculate Tc using QE."""
# Still under development,
atoms = self.atoms
kp = self.kp
qp = self.qp
relax = {
"control": {
# "calculation": "'scf'",
"calculation": "'vc-relax'",
"restart_mode": "'from_scratch'",
"prefix": "'RELAX'",
"outdir": "'./'",
"tstress": ".true.",
"tprnfor": ".true.",
"disk_io": "'low'",
"wf_collect": ".true.",
"pseudo_dir": None,
"verbosity": "'high'",
"nstep": 100,
},
"system": {
"ibrav": 0,
"nat": None,
"ntyp": None,
"ecutwfc": 45,
"ecutrho": 250,
"q2sigma": 1,
"ecfixed": 44.5,
"qcutz": 800,
"occupations": "'smearing'",
"degauss": 0.01,
"lda_plus_u": ".false.",
},
"electrons": {
"diagonalization": "'david'",
"mixing_mode": "'local-TF'",
"mixing_beta": 0.3,
"conv_thr": "1d-10",
},
"ions": {"ion_dynamics": "'bfgs'"},
"cell": {"cell_dynamics": "'bfgs'", "cell_dofree": "'all'"},
}
qejob_relax = QEjob(
atoms=atoms,
input_params=relax,
output_file="relax.out",
qe_cmd=self.qe_cmd,
jobname="relax",
kpoints=kp,
input_file="arelax.in",
)
info = qejob_relax.runjob()
xml_path = info["xml_path"]
xml_dat = DataFileSchema(xml_path)
final_strt = xml_dat.final_structure
print("final_strt", final_strt)
# scf_init =
scf_init = {
"control": {
"calculation": "'scf'",
"restart_mode": "'from_scratch'",
"prefix": "'QE'",
"outdir": "'./'",
"tstress": ".true.",
"tprnfor": ".true.",
"disk_io": "'low'",
"pseudo_dir": None,
"verbosity": "'high'",
"nstep": 100,
"etot_conv_thr": "1.0d-5",
"forc_conv_thr": "1.0d-4",
},
"system": {
"ibrav": 0,
# "degauss": 0.01,
"nat": None,
"ntyp": None,
"ecutwfc": 45,
"ecutrho": 250,
"occupations": "'tetrahedra_opt'",
# "smearing": "'mp'",
# "la2F ": ".true.",
},
"electrons": {
"diagonalization": "'david'",
"mixing_mode": "'plain'",
"mixing_beta": 0.7,
"conv_thr": "1d-10",
},
}
qejob_scf_init = QEjob(
atoms=final_strt,
input_params=scf_init,
output_file="scf_init.out",
qe_cmd=self.qe_cmd,
jobname="scf_init",
kpoints=kp,
input_file="ascf_init.in",
)
info_scf = qejob_scf_init.runjob()
print(info_scf)
kpts = kp._kpoints[0]
qpts = qp._kpoints[0]
nq1 = qpts[0] # get_factors(kpts[0])[0]
nq2 = qpts[1] # get_factors(kpts[1])[0]
nq3 = qpts[2] # get_factors(kpts[2])[0]
nk1 = kpts[0]
nk2 = kpts[1]
nk3 = kpts[2]
ph = {
"inputph": {
"prefix": "'QE'",
"fildyn": "'QE.dyn'",
"outdir": "'./'",
"ldisp": ".true.",
"lshift_q": ".true.",
"fildvscf": "'dvscf'",
"fildrho": "'dvrho'",
# "electron_phonon": "'lambda_tetra'",
# "electron_phonon": "'interpolated'",
# "el_ph_sigma": 0.005,
"nq1": nq1,
"nq2": nq2,
"nq3": nq3,
"nk1": nk1,
"nk2": nk2,
"nk3": nk3,
# "tr2_ph": "1.0d-12",
},
}
qejob_ph = QEjob(
atoms=final_strt,
input_params=ph,
output_file="ph.out",
qe_cmd=self.qe_cmd.replace("pw.x", "ph.x"),
jobname="ph",
kpoints=None,
input_file="aph.in",
)
qejob_ph.runjob()
nq1 = qpts[0] # get_factors(kpts[0])[0]
nq2 = qpts[1] # get_factors(kpts[1])[0]
nq3 = qpts[2] # get_factors(kpts[2])[0]
nk1 = kpts[0]
nk2 = kpts[1]
nk3 = kpts[2]
ph_tetra = {
"inputph": {
"prefix": "'QE'",
"fildyn": "'QE.dyn'",
"outdir": "'./'",
"ldisp": ".true.",
"lshift_q": ".true.",
"fildvscf": "'dvscf'",
"fildrho": "'dvrho'",
"electron_phonon": "'lambda_tetra'",
# "electron_phonon": "'interpolated'",
# "el_ph_sigma": 0.005,
"nq1": nq1,
"nq2": nq2,
"nq3": nq3,
"nk1": nk1,
"nk2": nk2,
"nk3": nk3,
# "tr2_ph": "1.0d-12",
},
"inputa2f": {
"nfreq": 500,
},
}
qejob_ph_tetra = QEjob(
atoms=final_strt,
input_params=ph_tetra,
output_file="ph_tetra.out",
qe_cmd=self.qe_cmd.replace("pw.x", "ph.x"),
jobname="ph_tetra",
kpoints=None,
input_file="aph_tetra.in",
)
qejob_ph_tetra.runjob()
cmd = (
self.qe_cmd.replace("pw.x", "alpha2f.x")
+ "<"
+ "aph_tetra.in"
+ ">"
+ "aph_tetra.out"
)
os.system(cmd)