@@ -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+
3191def _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
61105def _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
104133def _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
0 commit comments