Skip to content

Commit 22587f1

Browse files
jan-janssenpre-commit-ci[bot]samwaseda
authored
Fix velocity when resetting structure (#356)
* Fix velocity when resetting structure * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Move vector_to_lammps to a separate function (#357) * Implement _vector_to_lammps * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * run black * Remove flatten because it's always flattened --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sam Dareska <[email protected]>
1 parent 3a96fa0 commit 22587f1

File tree

2 files changed

+68
-9
lines changed

2 files changed

+68
-9
lines changed

pylammpsmpi/wrapper/ase.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,7 @@ def interactive_positions_setter(self, positions: list[list[float]]) -> None:
9696
Args:
9797
positions (List[List[float]]): The positions of atoms.
9898
"""
99-
if not _check_ortho_prism(prism=self._prism):
100-
positions = self._prism.vector_to_lammps(positions)
101-
positions = np.array(positions).flatten()
99+
positions = _vector_to_lammps(vector=positions, prism=self._prism)
102100
if self._cores == 1:
103101
self._interactive_library.scatter_atoms(
104102
"x", 1, 3, (len(positions) * c_double)(*positions)
@@ -279,10 +277,11 @@ def interactive_structure_setter(
279277
self.interactive_lib_command(
280278
command=f"mass {id_eam + 1:3d} {1.00:f}",
281279
)
282-
if not _check_ortho_prism(prism=self._prism):
283-
positions = self._prism.vector_to_lammps(structure.positions).flatten()
284-
else:
285-
positions = structure.positions.flatten()
280+
positions = _vector_to_lammps(vector=structure.positions, prism=self._prism)
281+
velocities = _vector_to_lammps(
282+
vector=structure.get_velocities(),
283+
prism=self._prism,
284+
)
286285
try:
287286
elem_all = get_lammps_indicies_from_ase_structure(
288287
structure=structure, el_eam_lst=el_eam_lst
@@ -299,7 +298,7 @@ def interactive_structure_setter(
299298
id=None,
300299
type=elem_all,
301300
x=positions,
302-
v=None,
301+
v=velocities,
303302
image=None,
304303
shrinkexceed=False,
305304
)
@@ -309,7 +308,7 @@ def interactive_structure_setter(
309308
id=range(1, len(structure) + 1),
310309
type=elem_all,
311310
x=positions,
312-
v=None,
311+
v=velocities,
313312
image=None,
314313
shrinkexceed=False,
315314
)
@@ -476,6 +475,15 @@ def cell_is_skewed(cell, tolerance=1.0e-8):
476475
return not (volume > 0 and abs(volume - prod) / volume < tolerance)
477476

478477

478+
def _vector_to_lammps(vector, prism):
479+
if vector is not None and np.any(vector):
480+
if not _check_ortho_prism(prism=prism):
481+
vector = prism.vector_to_lammps(vector)
482+
return vector.flatten()
483+
else:
484+
return None
485+
486+
479487
def _check_ortho_prism(prism, rtol=0.0, atol=1e-08):
480488
"""
481489
Check if the rotation matrix of the UnfoldingPrism object is sufficiently close to a unit matrix

tests/test_ase_interface.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,57 @@ def test_small_displacement(self):
121121
np.all(np.isclose(lmp.interactive_positions_getter(), positions))
122122
)
123123

124+
def test_velocities(self):
125+
lmp = LammpsASELibrary(
126+
working_directory=None,
127+
cores=1,
128+
comm=None,
129+
logger=logging.getLogger("TestStaticLogger"),
130+
log_file=None,
131+
library=LammpsLibrary(cores=2),
132+
disable_log_file=True,
133+
)
134+
structure = bulk("Al", cubic=True)
135+
velocities_initial = np.array(
136+
[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]
137+
)
138+
structure.set_velocities(velocities_initial)
139+
lmp.interactive_structure_setter(
140+
structure=structure,
141+
units="lj",
142+
dimension=3,
143+
boundary=" ".join(["p" if coord else "f" for coord in structure.pbc]),
144+
atom_style="atomic",
145+
el_eam_lst=["Al"],
146+
calc_md=False,
147+
)
148+
lmp.interactive_lib_command("pair_style lj/cut 6.0")
149+
lmp.interactive_lib_command("pair_coeff 1 1 1.0 1.0 4.04")
150+
lmp.interactive_lib_command(
151+
command="thermo_style custom step temp pe etotal pxx pxy pxz pyy pyz pzz vol"
152+
)
153+
lmp.interactive_lib_command(command="thermo_modify format float %20.15g")
154+
lmp.interactive_lib_command("run 0")
155+
self.assertTrue(
156+
np.all(np.isclose(lmp.interactive_positions_getter(), structure.positions))
157+
)
158+
self.assertTrue(
159+
np.isclose(lmp.interactive_energy_pot_getter(), -0.04342932384411341)
160+
)
161+
self.assertTrue(
162+
np.all(np.equal(lmp.interactive_velocities_getter(), velocities_initial))
163+
)
164+
positions = structure.positions.copy()
165+
positions[0] += np.array([0.1, 0.1, 0.1])
166+
lmp.interactive_positions_setter(positions=positions)
167+
lmp.interactive_lib_command("run 0")
168+
self.assertTrue(
169+
np.isclose(lmp.interactive_energy_pot_getter(), -0.043829529274767506)
170+
)
171+
self.assertTrue(
172+
np.all(np.isclose(lmp.interactive_positions_getter(), positions))
173+
)
174+
124175
def test_small_displacement_skewed(self):
125176
lmp = LammpsASELibrary(
126177
working_directory=None,

0 commit comments

Comments
 (0)