Skip to content

Commit 5b54014

Browse files
Liu-RXLiuRenxi
andauthored
added ABACUS interface for first principle calculations (#433)
* delete unnecessary files * remove ABACUS codes in relabel.py, fix test files. * Add files via upload * Add files via upload Co-authored-by: LiuRenxi <[email protected]>
1 parent b57b86e commit 5b54014

File tree

47 files changed

+2634
-2
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2634
-2
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import numpy as np
2+
bohr2ang = 0.52917721067
3+
def make_abacus_pw_scf_kpt(fp_params):
4+
# Make KPT file for abacus pw scf calculation.
5+
# KPT file is the file containing k points infomation in ABACUS scf calculation.
6+
k_points = [1, 1, 1, 0, 0, 0]
7+
if "k_points" in fp_params:
8+
k_points = fp_params["k_points"]
9+
if len(k_points) != 6:
10+
raise RuntimeError("k_points has to be a list containig 6 integers specifying MP k points generation.")
11+
ret = "K_POINTS\n0\nGamma\n"
12+
for i in range(6):
13+
ret += str(k_points[i]) + " "
14+
return ret
15+
16+
def make_abacus_pw_scf_input(fp_params):
17+
# Make INPUT file for abacus pw scf calculation.
18+
ret = "INPUT_PARAMETERS\n"
19+
assert(fp_params['ntype'] >= 0 and type(fp_params["ntype"]) == int)
20+
ret += "ntype %d\n" % fp_params['ntype']
21+
ret += "pseudo_dir ./\n"
22+
if "ecutwfc" in fp_params:
23+
assert(fp_params["ecutwfc"] >= 0)
24+
ret += "ecutwfc %f\n" % fp_params["ecutwfc"]
25+
if "mixing_type" in fp_params:
26+
assert(fp_params["mixing_type"] in ["plain", "kerker", "pulay", "pulay-kerker", "broyden"])
27+
ret += "mixing_type %s\n" % fp_params["mixing_type"]
28+
if "mixing_beta" in fp_params:
29+
assert(fp_params["mixing_beta"] >= 0 and fp_params["mixing_beta"] < 1)
30+
ret += "mixing_beta %f\n" % fp_params["mixing_beta"]
31+
if "symmetry" in fp_params:
32+
assert(fp_params["symmetry"] == 0 or fp_params["symmetry"] == 1)
33+
ret += "symmetry %d\n" % fp_params["symmetry"]
34+
if "nbands" in fp_params:
35+
assert(fp_params["nbands"] > 0 and type(fp_params["nbands"]) == int)
36+
ret += "nbands %f\n" % fp_params["nbands"]
37+
if "nspin" in fp_params:
38+
assert(fp_params["nspin"] == 1 or fp_params["nspin"] == 2 or fp_params["nspin"] == 4)
39+
ret += "nspin %d\n" % fp_params["nspin"]
40+
if "ks_solver" in fp_params:
41+
assert(fp_params["ks_solver"] in ["cg", "dav", "lapack", "genelpa", "hpseps", "scalapack_gvx"])
42+
ret += "ks_solver %s\n" % fp_params["ks_solver"]
43+
if "smearing" in fp_params:
44+
assert(fp_params["smearing"] in ["gauss", "fd", "fixed", "mp", "mp2", "mv"])
45+
ret += "smearing %s\n" % fp_params["smearing"]
46+
if "sigma" in fp_params:
47+
assert(fp_params["sigma"] >= 0)
48+
ret += "sigma %f\n" % fp_params["sigma"]
49+
ret += "force 1\nstress 1\n"
50+
return ret
51+
52+
def make_abacus_pw_scf_stru(sys_data, fp_pp_files):
53+
atom_names = sys_data['atom_names']
54+
atom_numbs = sys_data['atom_numbs']
55+
assert(len(atom_names) == len(fp_pp_files))
56+
assert(len(atom_names) == len(atom_numbs))
57+
cell = sys_data["cells"][0].reshape([3, 3])
58+
coord = sys_data['coords'][0]
59+
#volume = np.linalg.det(cell)
60+
#lattice_const = np.power(volume, 1/3)
61+
lattice_const = 1/bohr2ang # in Bohr, in this way coord and cell are in Angstrom
62+
63+
ret = "ATOMIC_SPECIES\n"
64+
for iatom in range(len(atom_names)):
65+
ret += atom_names[iatom] + " 1.00 " + fp_pp_files[iatom] + "\n"
66+
67+
ret += "\nLATTICE_CONSTANT\n"
68+
ret += str(lattice_const) + "\n\n"
69+
70+
ret += "LATTICE_VECTORS\n"
71+
for ix in range(3):
72+
for iy in range(3):
73+
ret += str(cell[ix][iy]) + " "
74+
ret += "\n"
75+
ret += "\n"
76+
77+
ret += "ATOMIC_POSITIONS\n"
78+
ret += "Cartesian # Cartesian(Unit is LATTICE_CONSTANT)\n"
79+
natom_tot = 0
80+
for iele in range(len(atom_names)):
81+
ret += atom_names[iele] + "\n"
82+
ret += "0.0\n"
83+
ret += str(atom_numbs[iele]) + "\n"
84+
for iatom in range(atom_numbs[iele]):
85+
ret += "%.12f %.12f %.12f %d %d %d\n" % (coord[natom_tot, 0], coord[natom_tot, 1], coord[natom_tot, 2], 0, 0, 0)
86+
natom_tot += 1
87+
assert(natom_tot == sum(atom_numbs))
88+
89+
return ret
90+
91+
92+
if __name__ == "__main__":
93+
fp_params = {"k_points": [1, 1, 1, 0, 0, 0]}
94+
ret = make_abacus_pw_scf_kpt(fp_params)
95+
print(ret)

dpgen/generator/run.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from dpgen.generator.lib.vasp import make_vasp_incar_user_dict
4444
from dpgen.generator.lib.vasp import incar_upper
4545
from dpgen.generator.lib.pwscf import make_pwscf_input
46+
from dpgen.generator.lib.abacus_pw_scf import make_abacus_pw_scf_stru, make_abacus_pw_scf_input, make_abacus_pw_scf_kpt
4647
#from dpgen.generator.lib.pwscf import cvt_1frame
4748
from dpgen.generator.lib.pwmat import make_pwmat_input_dict
4849
from dpgen.generator.lib.pwmat import write_input_dict
@@ -1795,6 +1796,41 @@ def make_fp_pwscf(iter_index,
17951796
# link pp files
17961797
_link_fp_vasp_pp(iter_index, jdata)
17971798

1799+
def make_fp_abacus_pw_scf(iter_index,
1800+
jdata) :
1801+
# make config
1802+
fp_tasks = _make_fp_vasp_configs(iter_index, jdata)
1803+
if len(fp_tasks) == 0 :
1804+
return
1805+
# make abacus/pw/scf input
1806+
iter_name = make_iter_name(iter_index)
1807+
work_path = os.path.join(iter_name, fp_name)
1808+
fp_pp_files = jdata['fp_pp_files']
1809+
if 'user_fp_params' in jdata.keys() :
1810+
fp_params = jdata['user_fp_params']
1811+
#user_input = True
1812+
else:
1813+
raise RuntimeError("Key 'user_fp_params' and its value have to be specified in parameter json file.")
1814+
cwd = os.getcwd()
1815+
for ii in fp_tasks:
1816+
os.chdir(ii)
1817+
sys_data = dpdata.System('POSCAR').data
1818+
if 'mass_map' in jdata:
1819+
sys_data['atom_masses'] = jdata['mass_map']
1820+
ret_input = make_abacus_pw_scf_input(fp_params)
1821+
with open('INPUT', 'w') as fp:
1822+
fp.write(ret_input)
1823+
ret_kpt = make_abacus_pw_scf_kpt(fp_params)
1824+
with open("KPT", "w") as fp:
1825+
fp.write(ret_kpt)
1826+
ret_stru = make_abacus_pw_scf_stru(sys_data, fp_pp_files)
1827+
with open("STRU", "w") as fp:
1828+
fp.write(ret_stru)
1829+
1830+
os.chdir(cwd)
1831+
# link pp files
1832+
_link_fp_vasp_pp(iter_index, jdata)
1833+
17981834

17991835
def make_fp_siesta(iter_index,
18001836
jdata) :
@@ -1918,6 +1954,8 @@ def make_fp (iter_index,
19181954
make_fp_vasp(iter_index, jdata)
19191955
elif fp_style == "pwscf" :
19201956
make_fp_pwscf(iter_index, jdata)
1957+
elif fp_style == "abacus/scf" :
1958+
make_fp_abacus_pw_scf(iter_index, jdata)
19211959
elif fp_style == "siesta" :
19221960
make_fp_siesta(iter_index, jdata)
19231961
elif fp_style == "gaussian" :
@@ -1951,6 +1989,16 @@ def _qe_check_fin(ii) :
19511989
return False
19521990
return True
19531991

1992+
def _abacus_pw_scf_check_fin(ii) :
1993+
if os.path.isfile(os.path.join(ii, 'OUT.ABACUS/running_scf.log')) :
1994+
with open(os.path.join(ii, 'OUT.ABACUS/running_scf.log'), 'r') as fp :
1995+
content = fp.read()
1996+
count = content.count('!FINAL_ETOT_IS')
1997+
if count != 1 :
1998+
return False
1999+
else :
2000+
return False
2001+
return True
19542002

19552003
def _siesta_check_fin(ii) :
19562004
if os.path.isfile(os.path.join(ii, 'output')) :
@@ -2061,6 +2109,10 @@ def run_fp (iter_index,
20612109
forward_files = ['input'] + fp_pp_files
20622110
backward_files = ['output']
20632111
run_fp_inner(iter_index, jdata, mdata, forward_files, backward_files, _qe_check_fin, log_file = 'output')
2112+
elif fp_style == "abacus/scf":
2113+
forward_files = ["INPUT", "STRU", "KPT"] + fp_pp_files
2114+
backward_files = ["output", "OUT.ABACUS"]
2115+
run_fp_inner(iter_index, jdata, mdata, forward_files, backward_files, _abacus_pw_scf_check_fin, log_file = 'output')
20642116
elif fp_style == "siesta":
20652117
forward_files = ['input'] + fp_pp_files
20662118
backward_files = ['output']
@@ -2235,6 +2287,51 @@ def post_fp_pwscf (iter_index,
22352287
all_sys.to_deepmd_raw(sys_data_path)
22362288
all_sys.to_deepmd_npy(sys_data_path, set_size = len(sys_output))
22372289

2290+
def post_fp_abacus_pw_scf (iter_index,
2291+
jdata):
2292+
model_devi_jobs = jdata['model_devi_jobs']
2293+
assert (iter_index < len(model_devi_jobs))
2294+
2295+
iter_name = make_iter_name(iter_index)
2296+
work_path = os.path.join(iter_name, fp_name)
2297+
fp_tasks = glob.glob(os.path.join(work_path, 'task.*'))
2298+
fp_tasks.sort()
2299+
if len(fp_tasks) == 0 :
2300+
return
2301+
2302+
system_index = []
2303+
for ii in fp_tasks :
2304+
system_index.append(os.path.basename(ii).split('.')[1])
2305+
system_index.sort()
2306+
set_tmp = set(system_index)
2307+
system_index = list(set_tmp)
2308+
system_index.sort()
2309+
2310+
cwd = os.getcwd()
2311+
for ss in system_index :
2312+
sys_output = glob.glob(os.path.join(work_path, "task.%s.*"%ss))
2313+
sys_input = glob.glob(os.path.join(work_path, "task.%s.*/INPUT"%ss))
2314+
sys_output.sort()
2315+
sys_input.sort()
2316+
2317+
flag=True
2318+
for ii,oo in zip(sys_input,sys_output) :
2319+
if flag:
2320+
_sys = dpdata.LabeledSystem(oo, fmt = 'abacus/scf', type_map = jdata['type_map'])
2321+
if len(_sys)>0:
2322+
all_sys=_sys
2323+
flag=False
2324+
else:
2325+
pass
2326+
else:
2327+
_sys = dpdata.LabeledSystem(oo, fmt = 'abacus/scf', type_map = jdata['type_map'])
2328+
if len(_sys)>0:
2329+
all_sys.append(_sys)
2330+
2331+
sys_data_path = os.path.join(work_path, 'data.%s'%ss)
2332+
all_sys.to_deepmd_raw(sys_data_path)
2333+
all_sys.to_deepmd_npy(sys_data_path, set_size = len(sys_output))
2334+
22382335
def post_fp_siesta (iter_index,
22392336
jdata):
22402337
model_devi_jobs = jdata['model_devi_jobs']
@@ -2424,6 +2521,8 @@ def post_fp (iter_index,
24242521
post_fp_vasp(iter_index, jdata)
24252522
elif fp_style == "pwscf" :
24262523
post_fp_pwscf(iter_index, jdata)
2524+
elif fp_style == "abacus/scf":
2525+
post_fp_abacus_pw_scf(iter_index, jdata)
24272526
elif fp_style == "siesta":
24282527
post_fp_siesta(iter_index, jdata)
24292528
elif fp_style == 'gaussian' :

dpgen/tools/relabel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ def create_tasks(target_folder, param_file, output, fp_json, verbose = True, num
202202
copy_pp_files(output, fp_pp_path, fp_pp_files)
203203
make_vasp_incar(fp_params, output)
204204
if fp_style == 'pwscf' :
205-
copy_pp_files(output, fp_pp_path, fp_pp_files)
205+
copy_pp_files(output, fp_pp_path, fp_pp_files)
206206
if fp_style == 'siesta' :
207207
copy_pp_files(output, fp_pp_path, fp_pp_files)
208208
for si in range(numb_sys) :
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
{
2+
"train":[
3+
{
4+
"machine":{
5+
"machine_type": "slurm",
6+
"host_name": "localhost",
7+
"port": 22,
8+
"username": "",
9+
"work_path": "/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/5_dpgen_examples/dpgen-example/run_abacus"
10+
},
11+
12+
"resources":{
13+
"numb_node": 1,
14+
"numb_gpu": 1,
15+
"task_per_node": 1,
16+
"partition": "",
17+
"exclude_list": [],
18+
"mem_limit": 0,
19+
"source_list": ["/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/env.sh"],
20+
"module_list": [],
21+
"time_limit": "23:0:0",
22+
"account":"",
23+
"qos": ""
24+
},
25+
"python_path": "/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_dpgen_interface/4_deepmd-kit/dpmd_install/bin/python"
26+
}
27+
],
28+
"model_devi": [
29+
{
30+
"machine": {
31+
"machine_type": "slurm",
32+
"hostname": "localhost",
33+
"port": 22,
34+
"username": "",
35+
"work_path": "/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/5_dpgen_examples/dpgen-example/run_abacus"
36+
},
37+
"resources": {
38+
"num_node": 1,
39+
"num_gpu": 0,
40+
"task_per_node": 2,
41+
"partition": "cn-large",
42+
"exclude_list": [],
43+
"mem_limit": 0,
44+
"source_list": ["/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/env.sh"],
45+
"module_list": [],
46+
"time_limit": "14:00:00",
47+
"account": "",
48+
"qos": "",
49+
"allow_failure":true
50+
},
51+
"command": "mpirun -n 2 lmp",
52+
"group_size": 6
53+
}
54+
],
55+
"fp": [
56+
{
57+
"machine":{
58+
"machine_type": "slurm",
59+
"hostname": "localhost",
60+
"port": 22,
61+
"username": "",
62+
"work_path": "/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/5_dpgen_examples/dpgen-example/run_abacus"
63+
},
64+
"resources": {
65+
"cvasp": false,
66+
"numb_node": 1,
67+
"partition": "cn-large",
68+
"task_per_node": 4,
69+
70+
"numb_gpu": 0,
71+
"exclude_list": [],
72+
"with_mpi": false,
73+
"mem_limit": 0,
74+
"source_list":[
75+
"/home/mhchen_pkuhpc/mhchen_cls/lustre2/5_liurenxi/5_ABACUS_dpgen_interface/env.sh"
76+
],
77+
"module_list":[],
78+
"time_limit": "48:0:0",
79+
"account": "",
80+
"qos": "",
81+
"_comment": "that's all"
82+
},
83+
"command": "mpirun -np 4 ABACUS.mpi.2.1.0",
84+
"group_size": 150
85+
}
86+
87+
]
88+
}

0 commit comments

Comments
 (0)