Skip to content

Commit 7009516

Browse files
parse multiple epsilon values for lj/cut/soft (#88)
* parse multiple epsilon values for lj/cut/soft * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * correct pair_coeff for hybrid style * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * support multiple activation values * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * support using a single sigma to set sigma for all pairs * add an example for hti_liq of 2 atomic types * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent d53450f commit 7009516

File tree

2 files changed

+140
-67
lines changed

2 files changed

+140
-67
lines changed

dpti/hti_liq.py

Lines changed: 82 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -28,45 +28,85 @@ def make_iter_name(iter_index):
2828
return "task_hti." + ("%04d" % iter_index)
2929

3030

31+
def parse_lj_sigma_epsilon(ret, sparam, hybrid=False):
32+
element_num = sparam.get("element_num", 1)
33+
sigma_key_index_ = filter(
34+
lambda t: t[0] <= t[1],
35+
((i, j) for i in range(element_num) for j in range(element_num)),
36+
)
37+
sigma_key_index = list(sigma_key_index_)
38+
39+
epsilon = sparam.get("epsilon", None)
40+
epsilon_0_0 = sparam.get("epsilon_0_0", None)
41+
sigma = sparam.get("sigma", None)
42+
sigma_0_0 = sparam.get("sigma_0_0", None)
43+
activation = sparam.get("activation", None)
44+
activation_0_0 = sparam.get("activation_0_0", None)
45+
46+
epsilon_ij = np.zeros((element_num, element_num))
47+
sigma_ij = np.zeros((element_num, element_num))
48+
activation_ij = np.zeros((element_num, element_num))
49+
50+
if epsilon is not None:
51+
assert (
52+
epsilon_0_0 is None
53+
), "epsilon and epsilon_0_0 cannot be set at the same time"
54+
for i, j in sigma_key_index:
55+
epsilon_ij[i, j] = epsilon
56+
else:
57+
assert epsilon_0_0 is not None, "epsilon or epsilon_0_0 must be set"
58+
for i, j in sigma_key_index:
59+
epsilon_ij[i, j] = sparam["epsilon_" + str(i) + "_" + str(j)]
60+
61+
if sigma is not None:
62+
assert sigma_0_0 is None, "sigma and sigma_0_0 cannot be set at the same time"
63+
for i, j in sigma_key_index:
64+
sigma_ij[i, j] = sigma
65+
else:
66+
assert sigma_0_0 is not None, "sigma or sigma_0_0 must be set"
67+
for i, j in sigma_key_index:
68+
sigma_ij[i, j] = sparam["sigma_" + str(i) + "_" + str(j)]
69+
70+
if activation is not None:
71+
assert (
72+
activation_0_0 is None
73+
), "activation and activation_0_0 cannot be set at the same time"
74+
for i, j in sigma_key_index:
75+
activation_ij[i, j] = activation
76+
else:
77+
assert activation_0_0 is not None, "activation or activation_0_0 must be set"
78+
for i, j in sigma_key_index:
79+
activation_ij[i, j] = sparam["activation_" + str(i) + "_" + str(j)]
80+
81+
if hybrid:
82+
pair_coeff_str = "lj/cut/soft "
83+
else:
84+
pair_coeff_str = ""
85+
86+
for i, j in sigma_key_index:
87+
ret += f"pair_coeff {i + 1} {j + 1} {pair_coeff_str:s}{epsilon_ij[i, j]:f} {sigma_ij[i, j]:f} {activation_ij[i, j]:f}\n"
88+
return ret
89+
90+
3191
def _ff_soft_on(lamb, sparam):
3292
nn = sparam["n"]
3393
alpha_lj = sparam["alpha_lj"]
3494
rcut = sparam["rcut"]
35-
epsilon = sparam["epsilon"]
36-
# sigma = sparam['sigma']
37-
activation = sparam["activation"]
3895
ret = ""
39-
ret += f"variable EPSILON equal {epsilon:f}\n"
4096
ret += f"pair_style lj/cut/soft {nn:f} {alpha_lj:f} {rcut:f}\n"
97+
ret = parse_lj_sigma_epsilon(ret, sparam, hybrid=False)
4198

42-
element_num = sparam.get("element_num", 1)
43-
sigma_key_index = filter(
44-
lambda t: t[0] <= t[1],
45-
((i, j) for i in range(element_num) for j in range(element_num)),
46-
)
47-
for i, j in sigma_key_index:
48-
ret += "pair_coeff {} {} ${{EPSILON}} {:f} {:f}\n".format(
49-
i + 1,
50-
j + 1,
51-
sparam["sigma_" + str(i) + "_" + str(j)],
52-
activation,
53-
)
54-
55-
# ret += 'pair_coeff * * ${EPSILON} %f %f\n' % (sigma, activation)
5699
ret += "fix tot_pot all adapt/fep 0 pair lj/cut/soft epsilon * * v_LAMBDA scale yes\n"
57-
ret += "compute e_diff all fep ${TEMP} pair lj/cut/soft epsilon * * v_EPSILON\n"
100+
ret += "compute lj_pe all pair lj/cut/soft\n"
101+
ret += "variable e_diff equal c_lj_pe/v_LAMBDA\n"
58102
return ret
59103

60104

61105
def _ff_deep_on(lamb, sparam, model, if_meam=False, meam_model=None):
62106
nn = sparam["n"]
63107
alpha_lj = sparam["alpha_lj"]
64108
rcut = sparam["rcut"]
65-
epsilon = sparam["epsilon"]
66-
# sigma = sparam['sigma']
67-
activation = sparam["activation"]
68109
ret = ""
69-
ret += f"variable EPSILON equal {epsilon:f}\n"
70110
ret += "variable ONE equal 1\n"
71111
if if_meam:
72112
ret += f"pair_style hybrid/overlay meam lj/cut/soft {nn:f} {alpha_lj:f} {rcut:f}\n"
@@ -76,20 +116,8 @@ def _ff_deep_on(lamb, sparam, model, if_meam=False, meam_model=None):
76116
ret += f"pair_style hybrid/overlay deepmd {model} lj/cut/soft {nn:f} {alpha_lj:f} {rcut:f}\n"
77117
ret += "pair_coeff * * deepmd\n"
78118

79-
element_num = sparam.get("element_num", 1)
80-
sigma_key_index = filter(
81-
lambda t: t[0] <= t[1],
82-
((i, j) for i in range(element_num) for j in range(element_num)),
83-
)
84-
for i, j in sigma_key_index:
85-
ret += "pair_coeff {} {} lj/cut/soft ${{EPSILON}} {:f} {:f}\n".format(
86-
i + 1,
87-
j + 1,
88-
sparam["sigma_" + str(i) + "_" + str(j)],
89-
activation,
90-
)
119+
ret = parse_lj_sigma_epsilon(ret, sparam, hybrid=True)
91120

92-
# ret += 'pair_coeff * * lj/cut/soft ${EPSILON} %f %f\n' % (sigma, activation)
93121
if if_meam:
94122
ret += "fix tot_pot all adapt/fep 0 pair meam scale * * v_LAMBDA\n"
95123
ret += "compute e_diff all fep ${TEMP} pair meam scale * * v_ONE\n"
@@ -98,20 +126,16 @@ def _ff_deep_on(lamb, sparam, model, if_meam=False, meam_model=None):
98126
"fix tot_pot all adapt/fep 0 pair deepmd scale * * v_LAMBDA\n"
99127
)
100128
ret += "compute e_diff all fep ${TEMP} pair deepmd scale * * v_ONE\n"
129+
ret += "variable e_diff equal c_e_diff[1]\n"
101130
return ret
102131

103132

104133
def _ff_soft_off(lamb, sparam, model, if_meam=False, meam_model=None):
105134
nn = sparam["n"]
106135
alpha_lj = sparam["alpha_lj"]
107136
rcut = sparam["rcut"]
108-
epsilon = sparam["epsilon"]
109-
# sigma = sparam['sigma']
110-
activation = sparam["activation"]
111137
ret = ""
112138
ret += "variable INV_LAMBDA equal 1-${LAMBDA}\n"
113-
ret += f"variable EPSILON equal {epsilon:f}\n"
114-
ret += "variable INV_EPSILON equal -${EPSILON}\n"
115139
if if_meam:
116140
ret += f"pair_style hybrid/overlay meam lj/cut/soft {nn:f} {alpha_lj:f} {rcut:f}\n"
117141
ret += f'pair_coeff * * meam {meam_model["library"]} {meam_model["element"]} {meam_model["potential"]} {meam_model["element"]}\n'
@@ -120,22 +144,11 @@ def _ff_soft_off(lamb, sparam, model, if_meam=False, meam_model=None):
120144
ret += f"pair_style hybrid/overlay deepmd {model} lj/cut/soft {nn:f} {alpha_lj:f} {rcut:f}\n"
121145
ret += "pair_coeff * * deepmd\n"
122146

123-
element_num = sparam.get("element_num", 1)
124-
sigma_key_index = filter(
125-
lambda t: t[0] <= t[1],
126-
((i, j) for i in range(element_num) for j in range(element_num)),
127-
)
128-
for i, j in sigma_key_index:
129-
ret += "pair_coeff {} {} lj/cut/soft ${{EPSILON}} {:f} {:f}\n".format(
130-
i + 1,
131-
j + 1,
132-
sparam["sigma_" + str(i) + "_" + str(j)],
133-
activation,
134-
)
147+
ret = parse_lj_sigma_epsilon(ret, sparam, hybrid=True)
135148

136-
# ret += 'pair_coeff * * lj/cut/soft ${EPSILON} %f %f\n' % (sigma, activation)
137149
ret += "fix tot_pot all adapt/fep 0 pair lj/cut/soft epsilon * * v_INV_LAMBDA scale yes\n"
138-
ret += "compute e_diff all fep ${TEMP} pair lj/cut/soft epsilon * * v_INV_EPSILON\n"
150+
ret += "compute lj_pe all pair lj/cut/soft\n"
151+
ret += "variable e_diff equal -c_lj_pe/v_INV_LAMBDA\n"
139152
return ret
140153

141154

@@ -202,7 +215,7 @@ def _gen_lammps_input_ideal(
202215
ret += f"timestep {timestep}\n"
203216
ret += "compute allmsd all msd\n"
204217
ret += "thermo ${THERMO_FREQ}\n"
205-
ret += "thermo_style custom step ke pe etotal enthalpy temp press vol c_e_diff[1] c_allmsd[*]\n"
218+
ret += "thermo_style custom step ke pe etotal enthalpy temp press vol v_e_diff c_allmsd[*]\n"
206219
ret += "thermo_modify format 9 %.16e\n"
207220
ret += "dump 1 all custom ${DUMP_FREQ} dump.hti id type x y z vx vy vz\n"
208221
if ens == "nvt":
@@ -266,17 +279,19 @@ def _make_tasks(iter_name, jdata, step, if_meam=False, meam_model=None):
266279
element_num = len(mass_map)
267280
sparam["element_num"] = element_num
268281

269-
sigma_key_index = filter(
270-
lambda t: t[0] <= t[1],
271-
((i, j) for i in range(element_num) for j in range(element_num)),
272-
)
273-
sigma_key_name_list = [
274-
"sigma_" + str(t[0]) + "_" + str(t[1]) for t in sigma_key_index
275-
]
276-
for sigma_key_name in sigma_key_name_list:
277-
assert sparam.get(
278-
sigma_key_name, None
279-
), f"there must be key-value for {sigma_key_name} in soft_param"
282+
sigma = sparam.get("sigma", None)
283+
if sigma is None:
284+
sigma_key_index = filter(
285+
lambda t: t[0] <= t[1],
286+
((i, j) for i in range(element_num) for j in range(element_num)),
287+
)
288+
sigma_key_name_list = [
289+
"sigma_" + str(t[0]) + "_" + str(t[1]) for t in sigma_key_index
290+
]
291+
for sigma_key_name in sigma_key_name_list:
292+
assert sparam.get(
293+
sigma_key_name, None
294+
), f"there must be key-value for sigma or {sigma_key_name} in soft_param"
280295

281296
job_abs_dir = create_path(iter_name)
282297

examples/hti.SiO2-liq.json

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"equi_conf": "nvt/out.lmp",
3+
"ncopies": [
4+
1,
5+
1,
6+
1
7+
],
8+
"lambda_soft_on": [
9+
"0.00001:0.01000:0.0005",
10+
"0.01000:0.04000:0.0100",
11+
"0.04000:0.20000:0.0200",
12+
"0.20000:0.40000:0.0500",
13+
"0.40000:0.99999:0.0800",
14+
"0.99999"
15+
],
16+
"lambda_deep_on": [
17+
"0.00001:0.0100:0.005",
18+
"0.01000:0.0400:0.010",
19+
"0.04000:0.2000:0.020",
20+
"0.20000:0.4000:0.050",
21+
"0.40000:0.9999:0.080",
22+
"0.99999"
23+
],
24+
"lambda_soft_off": [
25+
"0.00001:0.01000:0.005",
26+
"0.01000:0.04000:0.010",
27+
"0.04000:0.20000:0.020",
28+
"0.20000:0.40000:0.050",
29+
"0.40000:0.99999:0.080",
30+
"0.99999"
31+
],
32+
"protect_eps": 1e-6,
33+
"model": "graph.pb",
34+
"mass_map": [
35+
28.08,15.999
36+
],
37+
"soft_param": {
38+
"sigma_0_0": 3.2,
39+
"sigma_0_1": 2.95,
40+
"sigma_1_1": 2.70,
41+
"epsilon_0_0": 0.0860,
42+
"epsilon_0_1": 0.2776,
43+
"epsilon_1_1": 0.0392,
44+
"activation_0_0": 0.3,
45+
"activation_0_1": 0.5,
46+
"activation_1_1": 0.7,
47+
"n": 1,
48+
"alpha_lj": 0.5,
49+
"rcut": 6
50+
},
51+
"nsteps": 40000,
52+
"timestep": 0.002,
53+
"thermo_freq": 10,
54+
"dump_freq": 1000,
55+
"stat_skip": 100,
56+
"stat_bsize": 10,
57+
"temp": 2500
58+
}

0 commit comments

Comments
 (0)