Source code for dpgen.generator.lib.pwmat
#!/usr/bin/python3
import numpy as np
def _reciprocal_box(box):
rbox = np.linalg.inv(box)
rbox = rbox.T
return rbox
def _make_pwmat_kp_mp(kpoints):
ret = ""
ret += "%d %d %d 0 0 0 " % (kpoints[0], kpoints[1], kpoints[2])
return ret
def _make_kspacing_kpoints(config, kspacing):
with open(config) as fp:
lines = fp.read().split("\n")
box = []
for idx, ii in enumerate(lines):
if "lattice" in ii or "Lattice" in ii or "LATTICE" in ii:
for kk in range(idx + 1, idx + 1 + 3):
vector = [float(jj) for jj in lines[kk].split()[0:3]]
box.append(vector)
box = np.array(box)
rbox = _reciprocal_box(box)
kpoints = [
(np.ceil(2 * np.pi * np.linalg.norm(ii) / kspacing).astype(int)) for ii in rbox
]
ret = _make_pwmat_kp_mp(kpoints)
return ret
[docs]
def make_pwmat_input_dict(
node1,
node2,
atom_config,
ecut,
e_error,
rho_error,
icmix=None,
smearing=None,
sigma=None,
kspacing=0.5,
flag_symm=None,
):
input_dict = {}
input_dict["node1"] = node1
input_dict["node2"] = node2
input_dict["in.atom"] = atom_config
input_dict["ecut"] = ecut
input_dict["e_error"] = e_error
input_dict["rho_error"] = rho_error
if icmix is not None:
if sigma is not None:
if smearing is not None:
SCF_ITER0_1 = "6 4 3 0.0000 " + str(sigma) + " " + str(smearing)
SCF_ITER0_2 = (
"94 4 3 " + str(icmix) + " " + str(sigma) + " " + str(smearing)
)
else:
SCF_ITER0_1 = "6 4 3 0.0000 " + str(sigma) + " 2"
SCF_ITER0_2 = "94 4 3 " + str(icmix) + " " + str(sigma) + " 2"
else:
if smearing is not None:
SCF_ITER0_1 = "6 4 3 0.0000 0.025 " + str(smearing)
SCF_ITER0_2 = "94 4 3 " + str(icmix) + " 0.025 " + str(smearing)
else:
SCF_ITER0_1 = "6 4 3 0.0000 0.025 2"
SCF_ITER0_2 = "94 4 3 " + str(icmix) + " 0.025 2"
else:
if sigma is not None:
if smearing is not None:
SCF_ITER0_1 = "6 4 3 0.0000 " + str(sigma) + " " + str(smearing)
SCF_ITER0_2 = "94 4 3 1.0000 " + str(sigma) + " " + str(smearing)
else:
SCF_ITER0_1 = "6 4 3 0.0000 " + str(sigma) + " 2"
SCF_ITER0_2 = "94 4 3 1.0000 " + str(sigma) + " 2"
else:
if smearing is not None:
SCF_ITER0_1 = "6 4 3 0.0000 0.025 " + str(smearing)
SCF_ITER0_2 = "94 4 3 1.0000 0.025 " + str(smearing)
else:
SCF_ITER0_1 = "6 4 3 0.0000 0.025 2"
SCF_ITER0_2 = "94 4 3 1.0000 0.025 2"
input_dict["scf_iter0_1"] = SCF_ITER0_1
input_dict["scf_iter0_2"] = SCF_ITER0_2
if flag_symm is not None:
MP_N123 = _make_kspacing_kpoints(atom_config, kspacing)
MP_N123 += str(flag_symm)
else:
MP_N123 = _make_kspacing_kpoints(atom_config, kspacing)
input_dict["mp_n123"] = MP_N123
input_dict["out.wg"] = "F"
input_dict["out.rho"] = "F"
input_dict["out.mlmd"] = "T\n"
return input_dict
def _update_input_dict(input_dict_, user_dict):
if user_dict is None:
return input_dict_
input_dict = input_dict_
for ii in user_dict:
input_dict[ii] = user_dict[ii]
return input_dict
[docs]
def write_input_dict(input_dict):
lines = []
for key in input_dict:
if isinstance(input_dict[key], bool):
if input_dict[key]:
rs = "T"
else:
rs = "F"
else:
rs = str(input_dict[key])
lines.append(f"{key}={rs}")
return "\n".join(lines)
def _make_smearing(fp_params):
icmix = None
smearing = None
sigma = None
if "icmix" in fp_params:
icmix = fp_params["icmix"]
if "smearing" in fp_params:
smearing = fp_params["smearing"]
if "sigma" in fp_params:
sigma = fp_params["sigma"]
if icmix is None:
if smearing is None:
if sigma is None:
return None, None, None
else:
return None, None, sigma
else:
if sigma is None:
return None, smearing, None
else:
return None, smearing, sigma
else:
if smearing is None:
if sigma is None:
return icmix, None, None
else:
return icmix, None, sigma
else:
if sigma is None:
return icmix, smearing, None
else:
return icmix, smearing, sigma
def _make_flag_symm(fp_params):
flag_symm = None
if "flag_symm" in fp_params:
flag_symm = fp_params["flag_symm"]
if flag_symm == "NONE":
flag_symm = None
elif str(flag_symm) not in [None, "0", "1", "2", "3"]:
raise RuntimeError("unknow flag_symm type " + str(flag_symm))
return flag_symm
[docs]
def make_pwmat_input_user_dict(fp_params):
node1 = fp_params["node1"]
node2 = fp_params["node2"]
atom_config = fp_params["in.atom"]
ecut = fp_params["ecut"]
e_error = fp_params["e_error"]
rho_error = fp_params["rho_error"]
kspacing = fp_params["kspacing"]
if "user_pwmat_params" in fp_params:
user_dict = fp_params["user_pwmat_params"]
else:
user_dict = None
icmix, smearing, sigma = _make_smearing(fp_params)
flag_symm = _make_flag_symm(fp_params)
input_dict = make_pwmat_input_dict(
node1,
node2,
atom_config,
ecut,
e_error,
rho_error,
icmix=icmix,
smearing=smearing,
sigma=sigma,
kspacing=kspacing,
flag_symm=flag_symm,
)
input_dict = _update_input_dict(input_dict, user_dict)
input = write_input_dict(input_dict)
return input
[docs]
def input_upper(dinput):
standard_input = {}
for key, val in dinput.items():
standard_input[key.upper()] = val
# return Input(standard_input)
return standard_input