Metadata-Version: 2.1
Name: openmagnets
Version: 0.1.1
Summary: Magnetostatic solver
Keywords: magnetostatics,electromagnetics,simulation,physics
Author: CoolPhys / ok3D Team
License: MIT
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Fortran
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Physics
Project-URL: Homepage, https://github.com/maklecule/openmagnets
Project-URL: Repository, https://github.com/maklecule/openmagnets
Project-URL: Issues, https://github.com/maklecule/openmagnets/issues
Project-URL: Releases, https://github.com/maklecule/openmagnets/releases
Requires-Python: >=3.11
Requires-Dist: numpy>=2.0
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == "dev"
Requires-Dist: meson>=1.0; extra == "dev"
Requires-Dist: meson-python>=0.17; extra == "dev"
Requires-Dist: build>=1.2; extra == "dev"
Requires-Dist: twine>=5.1; extra == "dev"
Description-Content-Type: text/markdown

# OpenMagnets

OpenMagnets is a magnetostatic solver with a Python API and a native Fortran core.

## public API

- `SurfaceMesh`
- `TetraMesh`
- `Material`
- `Problem`
- `SolveResult`
- `load_obj(...)`
- `has_native()`
- `backend_info()`
- `reload_backend()`
- `require_backend()`

## install

```bash
pip install openmagnets
```

### source build

- Python 3.11+
- `gfortran`
- `ninja`
- build isolation support through `pip`

## rebuild from source

```bash
python scripts/build_native.py
```

## quick start

```python
from openmagnets import Material, Problem, load_obj

surface = load_obj("part.obj")

mesh = surface.voxel_tetrahedralize(
    padding=0.01,
    resolution=(12, 12, 12),
    inside_region_id=10,
    outside_region_id=0,
    region_names={
        0: "air",
        10: "magnet",
    },
)

problem = Problem(
    mesh=mesh,
    materials={
        0: Material(name="air", mu_r=1.0),
        10: Material(name="magnet", mu_r=1.05, magnetization=[0.0, 0.0, 8.0e5]),
    },
)

result = problem.solve()
print(result.cell_B.shape)
```

## gradients

`SolveResult` reconstructs the cell centered gradients

```python
cell_grad_B = result.cell_grad_B
cell_grad_H = result.cell_grad_H

print(cell_grad_B.shape)  
print(result.sample_grad_B([[0.0, 0.0, 0.0]], outside="nearest")[0])
```
