diff --git a/cpp/lammpsweb/lammpsweb.cpp b/cpp/lammpsweb/lammpsweb.cpp index 921c8f5d..9ce4baf9 100644 --- a/cpp/lammpsweb/lammpsweb.cpp +++ b/cpp/lammpsweb/lammpsweb.cpp @@ -580,6 +580,17 @@ long LAMMPSWeb::getIdPointer() { return reinterpret_cast(ptr); } +long LAMMPSWeb::getTagPointer() { + auto ptr = lammps_extract_atom((void *)m_lmp, "tag"); + + // Tag may not exist for all atom styles, return 0 if not available + if (!ptr) { + return 0; + } + + return reinterpret_cast(ptr); +} + long LAMMPSWeb::getTypePointer() { auto ptr = lammps_extract_atom((void *)m_lmp, "type"); diff --git a/cpp/lammpsweb/lammpsweb.h b/cpp/lammpsweb/lammpsweb.h index 86239f15..004b3627 100644 --- a/cpp/lammpsweb/lammpsweb.h +++ b/cpp/lammpsweb/lammpsweb.h @@ -65,6 +65,7 @@ class LAMMPSWeb long getBondsDistanceMapPointer(); long getPositionsPointer(); long getIdPointer(); + long getTagPointer(); long getTypePointer(); long getBondsPosition1Pointer(); long getBondsPosition2Pointer(); @@ -129,6 +130,7 @@ EMSCRIPTEN_BINDINGS(LAMMPSWeb) .function("getPositionsPointer", &LAMMPSWeb::getPositionsPointer) .function("getBondsDistanceMapPointer", &LAMMPSWeb::getBondsDistanceMapPointer) .function("getIdPointer", &LAMMPSWeb::getIdPointer) + .function("getTagPointer", &LAMMPSWeb::getTagPointer) .function("getTypePointer", &LAMMPSWeb::getTypePointer) .function("getCellMatrixPointer", &LAMMPSWeb::getCellMatrixPointer) .function("getOrigoPointer", &LAMMPSWeb::getOrigoPointer) diff --git a/src/modifiers/syncparticlesmodifier.ts b/src/modifiers/syncparticlesmodifier.ts index 7a4ad840..4ad5a069 100644 --- a/src/modifiers/syncparticlesmodifier.ts +++ b/src/modifiers/syncparticlesmodifier.ts @@ -48,7 +48,12 @@ class SyncParticlesModifier extends Modifier { const positionsPtr = input.lammps.getPositionsPointer() / 4; const typePtr = input.lammps.getTypePointer() / 4; - const idPtr = input.lammps.getIdPointer() / 4; + + // Try to use tag first (persistent particle identifier), fallback to id if not available + const tagPtr = input.lammps.getTagPointer(); + const particleIdPtr = + tagPtr !== 0 ? tagPtr / 4 : input.lammps.getIdPointer() / 4; + const positionsSubarray = input.wasm.HEAPF32.subarray( positionsPtr, positionsPtr + 3 * numParticles, @@ -58,8 +63,8 @@ class SyncParticlesModifier extends Modifier { typePtr + numParticles, ) as Int32Array; const idSubarray = input.wasm.HEAP32.subarray( - idPtr, - idPtr + numParticles, + particleIdPtr, + particleIdPtr + numParticles, ) as Int32Array; newParticles.positions.set(positionsSubarray); diff --git a/src/types.ts b/src/types.ts index a942c77d..873a300e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -24,6 +24,7 @@ export type LammpsWeb = { getPositionsPointer: () => number; getIdPointer: () => number; + getTagPointer: () => number; getTypePointer: () => number; getCellMatrixPointer: () => number; getOrigoPointer: () => number;