@@ -96,14 +96,50 @@ class AtomicSystem {
9696 Array3X& positions () { return positions_; }
9797 const Array3X& positions () const { return positions_; }
9898
99- // Single atom position access
100- auto position (std::size_t i) { return positions_.col (i); }
101- auto position (std::size_t i) const { return positions_.col (i); }
99+ // Single atom position access - always returns a Vec3 copy for type safety
100+ // Use positions().col(i) for assignment or set_position() method
101+ Vec3 position (std::size_t i) const { return positions_.col (i).matrix (); }
102+
103+ // Set single atom position
104+ void set_position (std::size_t i, const Vec3& r) {
105+ positions_.col (i) = r.array ();
106+ ++position_revision_;
107+ }
102108
103109 // Atomic numbers
104110 ArrayXi& atomic_numbers () { return atomic_numbers_; }
105111 const ArrayXi& atomic_numbers () const { return atomic_numbers_; }
106112
113+ // Single atom atomic number access
114+ int atomic_number (std::size_t i) const { return atomic_numbers_[i]; }
115+
116+ // Masses
117+ ArrayX& masses () { return masses_; }
118+ const ArrayX& masses () const { return masses_; }
119+
120+ // Single atom mass access
121+ Scalar mass (std::size_t i) const { return masses_[i]; }
122+ void set_mass (std::size_t i, Scalar m) { masses_[i] = m; }
123+
124+ // Velocities
125+ Array3X& velocities () { return velocities_; }
126+ const Array3X& velocities () const { return velocities_; }
127+
128+ // Single atom velocity access - always returns a Vec3 copy for type safety
129+ // Use velocities().col(i) for assignment or set_velocity() method
130+ Vec3 velocity (std::size_t i) const { return velocities_.col (i).matrix (); }
131+ void set_velocity (std::size_t i, const Vec3& v) { velocities_.col (i) = v.array (); }
132+
133+ // Add atom with position and mass
134+ void add_atom (int Z, const Vec3& r, Scalar m = 1.0 ) {
135+ std::size_t i = num_atoms_;
136+ resize (num_atoms_ + 1 );
137+ positions_.col (i) = r.array ();
138+ atomic_numbers_[i] = Z;
139+ masses_[i] = m;
140+ velocities_.col (i).setZero ();
141+ }
142+
107143 // Forces (accumulated by potentials)
108144 Array3X& forces () { return forces_; }
109145 const Array3X& forces () const { return forces_; }
@@ -139,6 +175,8 @@ class AtomicSystem {
139175
140176 Array3X positions_;
141177 ArrayXi atomic_numbers_;
178+ ArrayX masses_;
179+ Array3X velocities_;
142180 Array3X forces_;
143181
144182 PropertyMap properties_;
0 commit comments