pub struct Geometry {
pub elements: Vec<String>,
pub coords: DVector<f64>,
pub num_atoms: usize,
}Expand description
Represents a molecular geometry with atomic elements and Cartesian coordinates.
The Geometry struct stores the fundamental information about a molecular
structure: the chemical elements of each atom and their 3D positions in
Cartesian coordinates. It uses a flat representation where coordinates are
stored as a single-dimensional vector in the order [x1, y1, z1, x2, y2, z2, …].
§Coordinate System
- Units: Angstrom (Å) - standard molecular geometry unit
- Coordinate frame: Cartesian (x, y, z)
- Origin: Arbitrary (typically centered for convenience)
§Storage Format
Coordinates are stored in a DVector<f64> for efficient linear algebra operations.
The flat representation enables direct use with nalgebra for matrix operations
commonly required in geometry optimization.
§Examples
use omecp::geometry::Geometry;
// Create a water molecule geometry (coordinates in Angstrom)
let elements = vec![
"O".to_string(),
"H".to_string(),
"H".to_string(),
];
let coords = vec![
0.0, 0.0, 0.0, // O at origin
0.757, 0.586, 0.0, // H1 (Angstrom)
-0.757, 0.586, 0.0, // H2 (Angstrom)
];
let geometry = Geometry::new(elements, coords);
assert_eq!(geometry.num_atoms, 3);
// Get coordinates of atom 0 (oxygen)
let oxygen_coords = geometry.get_atom_coords(0);
println!("Oxygen position: ({:.3}, {:.3}, {:.3}) Angstrom",
oxygen_coords[0], oxygen_coords[1], oxygen_coords[2]);Fields§
§elements: Vec<String>Chemical element symbols for each atom in order
coords: DVector<f64>Flattened Cartesian coordinates [x1, y1, z1, x2, y2, z2, …] in Angstrom (Å)
num_atoms: usizeNumber of atoms in the molecule
Implementations§
Source§impl Geometry
impl Geometry
Sourcepub fn new(elements: Vec<String>, coords: Vec<f64>) -> Self
pub fn new(elements: Vec<String>, coords: Vec<f64>) -> Self
Create a new Geometry from element list and coordinate vector.
§Arguments
elements- Vector of element symbols (e.g., “C”, “H”, “O”)coords- Flattened coordinate vector of length 3 × num_atoms
§Panics
Panics if coords.len() != elements.len() * 3, ensuring data consistency.
§Examples
use omecp::geometry::Geometry;
let elements = vec!["C".to_string(), "H".to_string()];
let coords = vec![0.0, 0.0, 0.0, 1.0, 0.0, 0.0];
let geometry = Geometry::new(elements, coords);Sourcepub fn get_atom_coords(&self, atom_idx: usize) -> [f64; 3]
pub fn get_atom_coords(&self, atom_idx: usize) -> [f64; 3]
Get the Cartesian coordinates of a specific atom.
§Arguments
atom_idx- Zero-based index of the atom (0 = first atom)
§Returns
Array of three coordinates [x, y, z] in Angstroms.
§Examples
use omecp::geometry::Geometry;
let elements = vec!["O".to_string(), "H".to_string(), "H".to_string()];
let coords = vec![0.0, 0.0, 0.0, 0.757, 0.586, 0.0, -0.757, 0.586, 0.0];
let geometry = Geometry::new(elements, coords);
// Get oxygen coordinates
let o_coords = geometry.get_atom_coords(0);
assert_eq!(o_coords, [0.0, 0.0, 0.0]);
// Get first hydrogen coordinates
let h1_coords = geometry.get_atom_coords(1);
assert_eq!(h1_coords, [0.757, 0.586, 0.0]);Trait Implementations§
Source§impl From<&Geometry> for SerializableGeometry
impl From<&Geometry> for SerializableGeometry
Source§impl From<SerializableGeometry> for Geometry
impl From<SerializableGeometry> for Geometry
Source§fn from(ser_geom: SerializableGeometry) -> Self
fn from(ser_geom: SerializableGeometry) -> Self
Auto Trait Implementations§
impl Freeze for Geometry
impl RefUnwindSafe for Geometry
impl Send for Geometry
impl Sync for Geometry
impl Unpin for Geometry
impl UnsafeUnpin for Geometry
impl UnwindSafe for Geometry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.