https://github.com/p-sira/magba
Analytical magnetic computation for Rust
https://github.com/p-sira/magba
analytical-solution electromagnetism magnet magnetic-fields magnetism physics scientific simulation
Last synced: 2 months ago
JSON representation
Analytical magnetic computation for Rust
- Host: GitHub
- URL: https://github.com/p-sira/magba
- Owner: p-sira
- License: bsd-3-clause
- Created: 2025-01-26T08:31:10.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-07-17T15:30:51.000Z (3 months ago)
- Last Synced: 2025-08-10T23:34:16.842Z (2 months ago)
- Topics: analytical-solution, electromagnetism, magnet, magnetic-fields, magnetism, physics, scientific, simulation
- Language: Rust
- Homepage:
- Size: 9.03 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
-----
**Magba** is a performant analytical magnetic computation library for Rust.
```bash
>> cargo add magba
```Learn more at [docs.rs/magba](https://docs.rs/magba).
## Features
- Compute [magnetic fields](#field-computation) analytically for various source geometries.
- Create [magnetic sources](Source) and group them as [source collections](#sources-and-collections).
- [Move and rotate objects](#move-and-rotate-objects) in 3D space.
- Increase performance using [parallelization](#installation) with [Rayon](https://docs.rs/crate/rayon/latest).
- Support calculation with [f32] and [f64].
- Python bindings available via [Pymagba](https://github.com/p-sira/pymagba)## Quick Start
To install, simply: `cargo add magba`.
```rust
use magba::*;
use nalgebra::*;
use std::f64::consts::PI;// Define magnetic sources
let cylinder = Box::new(CylinderMagnet::default());
let cuboid = Box::new(CuboidMagnet::new(
Point3::new(1.0, 0.0, 0.0), // position (m)
UnitQuaternion::identity(), // orientation
Vector3::z(), // polarization (T)
Vector3::new(0.1, 0.2, 0.3), // dimensions (m)
));
//!
// Grouping sources as collection
let mut collection = MultiSourceCollection::from_sources(vec![cylinder, cuboid]);
collection.add(Box::new(Dipole::default()));// Observer positions
let points = [
Point3::new(0.0, 0.0, 0.020),
Point3::new(0.0, 0.0, 0.025),
Point3::new(0.0, 0.0, 0.030),
];// Compute B-field (Magnetic flux density [T])
let b_fields = collection.get_B(&points);
// [
// [ -2.7063724257464133e-5, -3.533949646070574e-17, 0.4715809600578704 ],
// [ -3.381192498299282e-5 , 0.0, 0.4592848558923018 ],
// [ -4.0548326050340215e-5, 0.0, 0.45377483361434284 ],
// ]// Move and Rotate
collection.translate(&Translation3::new(0.0, 0.0, 0.010));
collection.rotate(&UnitQuaternion::from_scaled_axis(Vector3::new(PI / 4.0, 0.0, 0.0)));let b_fields = collection.get_B(&points);
// [
// [ -9.575129388363597e-6 , -0.24516787434696088, 0.4573303607411665 ],
// [ -1.4358446356125264e-5, -0.2948988353221851 , 0.3578212873125478 ],
// [ -1.9136669915278972e-5, -0.30697154302354923, 0.33360985034592394 ],
// ]
```## Testing
Results are validated against MagpyLib and reference data.
See `/tests/test-data` and the accuracy report for details.---
Learn more at [docs.rs/magba](https://docs.rs/magba).