From 387f0ad3a19e417734b53ece2a418fc080f5822c Mon Sep 17 00:00:00 2001 From: Alexander Schlaich Date: Tue, 26 Oct 2021 14:15:59 +0200 Subject: [PATCH 1/5] Parse velocities from LAMMPSDUMP --- package/MDAnalysis/coordinates/LAMMPS.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index e5d758816f2..912eab5b1cb 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -606,15 +606,30 @@ def _read_next_timestep(self): coord_cols = convention_to_col_ix[self.lammps_coordinate_convention] + # pass possible additional fields from LAMMPS dump + # pass velocities + velocity_col_names = ["vx","vy","vz"] + if any(item in attrs for item in velocity_col_names): + for cv_name, cv_col_names in enumerate(velocity_col_names): + try: + velocity_cols = [attr_to_col_ix[x] for x in velocity_col_names] + ts.has_velocities = True + except KeyError: + raise ValueError("Velocities detected in LAMMPS Dump file but MDAnalysis can only deal with all entries vx, vy, vz present") + ids = "id" in attr_to_col_ix for i in range(self.n_atoms): fields = f.readline().split() if ids: indices[i] = fields[attr_to_col_ix["id"]] ts.positions[i] = [fields[dim] for dim in coord_cols] + if ts.has_velocities: + ts.velocities[i] = [fields[dim] for dim in velocity_cols] order = np.argsort(indices) ts.positions = ts.positions[order] + if ts.has_velocities: + ts.velocities = ts.velocities[order] if (self.lammps_coordinate_convention.startswith("scaled")): # if coordinates are given in scaled format, undo that ts.positions = distances.transform_StoR(ts.positions, From 6f86e507364d98951f426f756b63e8e16991bd6e Mon Sep 17 00:00:00 2001 From: Alexander Schlaich Date: Fri, 29 Oct 2021 12:08:55 +0200 Subject: [PATCH 2/5] Add unit conversion for LAMMPS real units --- package/MDAnalysis/coordinates/LAMMPS.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 912eab5b1cb..49c4330dcae 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -630,6 +630,8 @@ def _read_next_timestep(self): ts.positions = ts.positions[order] if ts.has_velocities: ts.velocities = ts.velocities[order] + # LAMMPS reader only supports real units + ts.velocities *= units.speedUnit_factor['Angstrom/femtosecond'] if (self.lammps_coordinate_convention.startswith("scaled")): # if coordinates are given in scaled format, undo that ts.positions = distances.transform_StoR(ts.positions, From 10723cf3ea66ba7a324a9b174933178286e57a24 Mon Sep 17 00:00:00 2001 From: Alexander Schlaich Date: Fri, 29 Oct 2021 12:09:21 +0200 Subject: [PATCH 3/5] Correct frame numbering --- package/MDAnalysis/coordinates/LAMMPS.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 49c4330dcae..45790ea74d9 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -502,7 +502,7 @@ def _reopen(self): self.close() self._file = util.anyopen(self.filename) self.ts = self._Timestep(self.n_atoms, **self._ts_kwargs) - self.ts.frame = -1 + self.ts.frame = 0 @property @cached('n_atoms') From c130c182ec1648b2a0aa707a05f408663034c8a2 Mon Sep 17 00:00:00 2001 From: Alexander Schlaich Date: Fri, 29 Oct 2021 12:20:08 +0200 Subject: [PATCH 4/5] Adjust documentation --- package/MDAnalysis/coordinates/LAMMPS.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index 45790ea74d9..fd302794230 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -55,8 +55,9 @@ Dump files ---------- -The DumpReader expects ascii dump files written with the default -`LAMMPS dump format`_ of 'atom' +The DumpReader expects ascii dump files. Currently supported are +coordinates (dump style atom) and velocities for custom dump styles. +Other columns are ignored. Example: Loading a LAMMPS simulation @@ -462,6 +463,7 @@ class DumpReader(base.ReaderBase): coordinate convention (xs,ys,zs) or scaled unwrapped coordinate convention (xsu,ysu,zsu) they will automatically be converted from their scaled/fractional representation to their real values. + Velocities (vx, vy, vz) can be parsed, too. .. versionchanged:: 2.0.0 From a985b43bb46f63aa16f12728f4d39ac5796db6dd Mon Sep 17 00:00:00 2001 From: Alexander Schlaich Date: Fri, 29 Oct 2021 12:28:18 +0200 Subject: [PATCH 5/5] PEP8 --- package/MDAnalysis/coordinates/LAMMPS.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/MDAnalysis/coordinates/LAMMPS.py b/package/MDAnalysis/coordinates/LAMMPS.py index fd302794230..19fc6750a17 100644 --- a/package/MDAnalysis/coordinates/LAMMPS.py +++ b/package/MDAnalysis/coordinates/LAMMPS.py @@ -610,7 +610,7 @@ def _read_next_timestep(self): # pass possible additional fields from LAMMPS dump # pass velocities - velocity_col_names = ["vx","vy","vz"] + velocity_col_names = ["vx", "vy", "vz"] if any(item in attrs for item in velocity_col_names): for cv_name, cv_col_names in enumerate(velocity_col_names): try: