Source code for dpgen.generator.lib.pwmat
#!/usr/bin/python3
import os
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, 'r') 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(simga) + " 2"
SCF_ITER0_2 = "94 4 3 " + str(icmix) + " " + str(simga) + " 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[ci] = user_dict[ii]
return input_dict
[docs]def write_input_dict(input_dict) :
lines = []
for key in input_dict:
if (type(input_dict[key]) == bool):
if input_dict[key]:
rs = 'T'
else :
rs = 'F'
else :
rs = str(input_dict[key])
lines.append('%s=%s' % (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 == None:
if smearing == None:
if sigma == None:
return None, None, None
else:
return None, None, sigma
else:
if sigma == None:
return None, smearing, None
else:
return None, smearing, sigma
else:
if smearing == None:
if sigma == None:
return icmix, None, None
else:
return icmix, None, sigma
else:
if sigma == 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)