From 1eb49f3248790086c61220c86ee8b17820927445 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 30 Nov 2025 08:39:23 +0000 Subject: [PATCH 1/2] Refactor: Use 'tag' instead of 'id' for atom extraction Co-authored-by: andershaf --- cpp/lammpsweb/lammpsweb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/lammpsweb/lammpsweb.cpp b/cpp/lammpsweb/lammpsweb.cpp index 921c8f5d..44582d86 100644 --- a/cpp/lammpsweb/lammpsweb.cpp +++ b/cpp/lammpsweb/lammpsweb.cpp @@ -575,7 +575,7 @@ long LAMMPSWeb::getPositionsPointer() { } long LAMMPSWeb::getIdPointer() { - auto ptr = lammps_extract_atom((void *)m_lmp, "id"); + auto ptr = lammps_extract_atom((void *)m_lmp, "tag"); return reinterpret_cast(ptr); } From 9ecd09e1f794ce67de3490de4b59332fc6655e03 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 30 Nov 2025 08:43:57 +0000 Subject: [PATCH 2/2] feat: Add getTagPointer and use tag for particle IDs Co-authored-by: andershaf --- cpp/lammpsweb/lammpsweb.cpp | 11 +++++++++++ cpp/lammpsweb/lammpsweb.h | 2 ++ src/modifiers/syncparticlesmodifier.ts | 11 ++++++++--- src/types.ts | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cpp/lammpsweb/lammpsweb.cpp b/cpp/lammpsweb/lammpsweb.cpp index 44582d86..9ce4baf9 100644 --- a/cpp/lammpsweb/lammpsweb.cpp +++ b/cpp/lammpsweb/lammpsweb.cpp @@ -575,7 +575,18 @@ long LAMMPSWeb::getPositionsPointer() { } long LAMMPSWeb::getIdPointer() { + auto ptr = lammps_extract_atom((void *)m_lmp, "id"); + + 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); } 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;