ITADN

HOOMD/Topology Charge floating point error

#943OpenCalCraven 创建于 2025-12-02
C
CalCravencommented
**Bug summary** Create a hoomd gsd file for use in hoomd. **Code to reproduce the behavior** Please include a code snippet that can be used to reproduce this bug. ```python import mbuild as mb import gmso from gmso.parameterization import apply import numpy as np import unyt as u import hoomd mol = mb.load('CC(C)C(=O)OC', smiles=True) top = mol.to_gmso() ff = gmso.ForceField("oplsaa") ptop = apply(top, ff) print(sum([site.charge for site in ptop.sites])) print(np.sum([site.charge for site in ptop.sites])) print(np.sum([site.charge.in_units("elementary_charge") for site in ptop.sites])) print(np.sum([site.charge.round(2) for site in ptop.sites])) from gmso.external import to_hoomd_snapshot base_units = { "mass": u.g / u.mol, "length": u.nm, "energy": u.kJ / u.mol, } snapshot, _ = to_hoomd_snapshot(ptop, base_units=base_units) print(sum(snapshot.particles.charge)) device = hoomd.device.CPU() sim = hoomd.Simulation(device=device, seed=1) sim.create_state_from_snapshot(snapshot) hoomd.write.GSD.write( state=sim.state, filename="charge.gsd", mode="wb" ) with gsd.hoomd.open(name="charge.gsd", mode='r') as traj: # Read a specific frame (e.g., frame 0 for the initial state) # You can specify any frame index you need snapshot = traj[-1] print(sum(snapshot.particles.charge)) ``` ``` 8.326672684688674e-17 elementary_charge 8.326672684688674e-17 8.326672684688674e-17 8.326672684688674e-17 -2.220446049250313e-16 2.3841858e-07 ``` As you can see the charge builds up from very small floating point issues, which I believe is compounded during the unit nondimensionalizing stage in hoomd. **Software versions** - Which version of GMSO are you using? (`python -c "import gmso; print(gmso.__version__)"`) 0.14.0 - Which version of Python (`python --version`)? 3.12 - Which operating system? MacOS ARM
3 条评论