Skip to content

Commit fa896eb

Browse files
committed
Availability of 0.1.2
1 parent c4e196b commit fa896eb

2,374 files changed

Lines changed: 57215 additions & 70464 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,60 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.1.2] - 2026-06-06
9+
10+
### Fixed
11+
- `oxiphysics-io`: Re-exported `particle_formats` types (`DcdWriter`, `DcdReader`, `XyzWriter`,
12+
`XyzReader`, `ParticleFrame`, `ParticleTrajectory`, `TrajectoryStats`, `BinaryFrameReader`,
13+
`BinaryFrameWriter`, `GroReader`, `GroWriter`, `DcdHeader`) at the crate root; a doctest for
14+
`DcdWriter` was previously failing with an unresolved import.
15+
- `oxiphysics-vehicle`: Fixed `hil.rs` module doctest — replaced non-existent `HilBridge` alias
16+
with `SimHilBridge` + `HilInterface` trait import; corrected `get_output` return type
17+
(`Option<f64>`) assertion.
18+
- `oxiphysics-wasm`: Fixed two module-level doctests — `SharedStateBuffer` needed `let mut` to
19+
call `write_body_position`; `WebGlRenderFrame.positions` is private, call `.positions()` method.
20+
21+
### Added
22+
- `oxiphysics-python` (KF-5 — Python bindings): `PyCsg::union/intersection/subtraction` now
23+
delegate to the real `oxiphysics-geometry::mesh_boolean::mesh_boolean` algorithm (proper
24+
winding-number/ray-cast inside-outside classification + `cleanup_mesh`/`weld_vertices`)
25+
instead of the previous AABB-approximation stubs.
26+
- `oxiphysics-python` (KF-5): `PyPointCloud::poisson_reconstruct` now performs real **Implicit
27+
Moving Least Squares (IMLS)** surface reconstruction: PCA-estimated normals when absent,
28+
Gaussian-weighted tangent-plane signed-distance implicit, marching-cubes isosurface extraction
29+
via `oxiphysics-geometry::signed_distance_field::MarchingCubes`. Previously returned an empty
30+
mesh silently.
31+
- `oxiphysics-rigid`: `MotionPlanning` now carries a real `obstacles: Vec<PlanningObstacle>` field
32+
(n-dimensional C-space spheres). `is_collision_free` checks Euclidean distance to every
33+
obstacle; `is_segment_collision_free` prevents tunnelling in RRT/PRM edge expansion (10-sample
34+
discretisation). Builder `with_obstacles(...)` provided. Previously the check always returned
35+
`true`.
36+
- `oxiphysics-lbm`: `LbmGrid3D` now has a real `step(omega: f64)` method: BGK collision
37+
(equilibrium computed from cached `rho`/`ux`/`uy`/`uz`) + pull-scheme periodic streaming;
38+
`compute_macroscopic()` updates macroscopic fields after each step. Removed the dead empty
39+
`step_placeholder` (zero call sites).
40+
- `oxiphysics-md`: New `qm_mm` module — hybrid quantum-mechanics / molecular-mechanics support.
41+
QM region selectable via `QmMethod` (`Pm3` semi-empirical NDDO, `SccDftb` density-functional
42+
tight-binding, `Hf` Hartree-Fock/STO-3G, `DftB3lyp` Kohn-Sham LDA/VWN), MM region via
43+
force-field point charges, with mechanical/electrostatic embedding and hydrogen link-atom
44+
boundary capping. Each engine runs a real SCF loop (Löwdin-orthogonalised generalised
45+
eigensolver) and provides numerical Hellmann-Feynman forces.
46+
47+
### Changed
48+
- Workspace-wide structural refactor (splitrs): oversized modules (>2000 LoC) — e.g.
49+
`oxiphysics-core` `types.rs`/`pde`/`linalg`, `oxiphysics-geometry` `bspline`, `oxiphysics-rigid`
50+
`kinematics`/`mechanism_rigid`, `oxiphysics-lbm` `mixing_lbm`, `oxiphysics-md`
51+
`quantum_chemistry`, `oxiphysics-viz` `multiphysics_viz` — were split into focused
52+
`types`/`functions` submodules, and redundant `#[allow(...)]` Clippy attributes were removed
53+
across the workspace. Public APIs are unchanged.
54+
- `oxiphysics-sph`: Refactored particle data structures across the SPH crate for clearer field
55+
layout and reduced duplication (no behavioural change).
56+
57+
### Tests
58+
- 16 new unit/integration tests across `oxiphysics-python`, `oxiphysics-rigid`, `oxiphysics-lbm`
59+
covering the correctness fixes above (CSG operations, IMLS reconstruction, obstacle collision,
60+
segment collision, RRT path, LBM mass conservation, equilibrium fixed-point).
61+
862
## [0.1.1] - 2026-05-17
963

1064
### Changed
@@ -34,5 +88,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3488
- `oxiphysics-python`: Python bindings via PyO3
3589
- `oxiphysics-wasm`: WebAssembly bindings
3690

91+
[0.1.2]: https://github.com/cool-japan/oxiphysics/releases/tag/v0.1.2
3792
[0.1.1]: https://github.com/cool-japan/oxiphysics/releases/tag/v0.1.1
3893
[0.1.0]: https://github.com/cool-japan/oxiphysics/releases/tag/v0.1.0

Cargo.toml

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["crates/*"]
33
resolver = "2"
44

55
[workspace.package]
6-
version = "0.1.1"
6+
version = "0.1.2"
77
edition = "2024"
88
license = "Apache-2.0"
99
repository = "https://github.com/cool-japan/oxiphysics"
@@ -18,44 +18,44 @@ nalgebra = "0.34"
1818
serde_json = "1"
1919
serde-wasm-bindgen = "0.6.5"
2020
criterion = { version = "0.8", features = ["html_reports"] }
21-
js-sys = "0.3.97"
21+
js-sys = "0.3.98"
2222
proptest = "1"
2323
numpy = "0.28.0"
2424
pyo3 = "0.28"
2525
wasm-bindgen = "0.2"
26-
wasm-bindgen-test = "0.3.70"
27-
web-sys = { version = "0.3.97", features = ["console", "Window", "Performance"] }
26+
wasm-bindgen-test = "0.3.71"
27+
web-sys = { version = "0.3.98", features = ["console", "Window", "Performance"] }
2828
rayon = "1"
2929
wgpu = "29"
3030
bitvec = "1"
31-
oxiarc-zstd = "0.2"
32-
oxifft = "0.3.1"
31+
oxiarc-zstd = "0.3.2"
32+
oxifft = "0.3.2"
3333
pollster = "0.4"
3434
bytemuck = { version = "1", features = ["derive"] }
3535
console_error_panic_hook = "0.1.7"
3636
getrandom = { version = "0.4", features = ["wasm_js"] }
3737
cudarc = { version = "0.19", default-features = false, features = ["driver", "nvrtc", "dynamic-loading", "cuda-12080"] }
3838

3939
ndarray = { version = "0.17.2", default-features = false, features = ["std"] }
40-
scirs2-integrate = { version = "0.4.4" }
40+
scirs2-integrate = { version = "0.5.0" }
4141

4242
# Workspace-internal dependencies
43-
oxiphysics-articulated = { path = "crates/oxiphysics-articulated", version = "0.1.1" }
44-
oxiphysics-core = { path = "crates/oxiphysics-core", version = "0.1.1" }
45-
oxiphysics-geometry = { path = "crates/oxiphysics-geometry", version = "0.1.1" }
46-
oxiphysics-collision = { path = "crates/oxiphysics-collision", version = "0.1.1" }
47-
oxiphysics-rigid = { path = "crates/oxiphysics-rigid", version = "0.1.1" }
48-
oxiphysics-constraints = { path = "crates/oxiphysics-constraints", version = "0.1.1" }
49-
oxiphysics-vehicle = { path = "crates/oxiphysics-vehicle", version = "0.1.1" }
50-
oxiphysics-sph = { path = "crates/oxiphysics-sph", version = "0.1.1" }
51-
oxiphysics-lbm = { path = "crates/oxiphysics-lbm", version = "0.1.1" }
52-
oxiphysics-fem = { path = "crates/oxiphysics-fem", version = "0.1.1" }
53-
oxiphysics-md = { path = "crates/oxiphysics-md", version = "0.1.1" }
54-
oxiphysics-softbody = { path = "crates/oxiphysics-softbody", version = "0.1.1" }
55-
oxiphysics-materials = { path = "crates/oxiphysics-materials", version = "0.1.1" }
56-
oxiphysics-gpu = { path = "crates/oxiphysics-gpu", version = "0.1.1" }
57-
oxiphysics-viz = { path = "crates/oxiphysics-viz", version = "0.1.1" }
58-
oxiphysics-io = { path = "crates/oxiphysics-io", version = "0.1.1" }
59-
oxiphysics = { path = "crates/oxiphysics", version = "0.1.1" }
60-
oxiphysics-python = { path = "crates/oxiphysics-python", version = "0.1.1" }
61-
oxiphysics-wasm = { path = "crates/oxiphysics-wasm", version = "0.1.1" }
43+
oxiphysics-articulated = { path = "crates/oxiphysics-articulated", version = "0.1.2" }
44+
oxiphysics-core = { path = "crates/oxiphysics-core", version = "0.1.2" }
45+
oxiphysics-geometry = { path = "crates/oxiphysics-geometry", version = "0.1.2" }
46+
oxiphysics-collision = { path = "crates/oxiphysics-collision", version = "0.1.2" }
47+
oxiphysics-rigid = { path = "crates/oxiphysics-rigid", version = "0.1.2" }
48+
oxiphysics-constraints = { path = "crates/oxiphysics-constraints", version = "0.1.2" }
49+
oxiphysics-vehicle = { path = "crates/oxiphysics-vehicle", version = "0.1.2" }
50+
oxiphysics-sph = { path = "crates/oxiphysics-sph", version = "0.1.2" }
51+
oxiphysics-lbm = { path = "crates/oxiphysics-lbm", version = "0.1.2" }
52+
oxiphysics-fem = { path = "crates/oxiphysics-fem", version = "0.1.2" }
53+
oxiphysics-md = { path = "crates/oxiphysics-md", version = "0.1.2" }
54+
oxiphysics-softbody = { path = "crates/oxiphysics-softbody", version = "0.1.2" }
55+
oxiphysics-materials = { path = "crates/oxiphysics-materials", version = "0.1.2" }
56+
oxiphysics-gpu = { path = "crates/oxiphysics-gpu", version = "0.1.2" }
57+
oxiphysics-viz = { path = "crates/oxiphysics-viz", version = "0.1.2" }
58+
oxiphysics-io = { path = "crates/oxiphysics-io", version = "0.1.2" }
59+
oxiphysics = { path = "crates/oxiphysics", version = "0.1.2" }
60+
oxiphysics-python = { path = "crates/oxiphysics-python", version = "0.1.2" }
61+
oxiphysics-wasm = { path = "crates/oxiphysics-wasm", version = "0.1.2" }

README.md

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
[![Crates.io](https://img.shields.io/crates/v/oxiphysics?label=oxiphysics&color=orange)](https://crates.io/crates/oxiphysics)
44
[![docs.rs](https://img.shields.io/docsrs/oxiphysics)](https://docs.rs/oxiphysics)
55
[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
6-
[![Version](https://img.shields.io/badge/version-0.1.1-green.svg)](CHANGELOG.md)
6+
[![Version](https://img.shields.io/badge/version-0.1.2-green.svg)](CHANGELOG.md)
77

88
OxiPhysics is a unified, pure-Rust physics engine targeting the same problem
99
domains as **Bullet** (rigid body), **OpenFOAM** (CFD), **LAMMPS** (molecular
@@ -12,35 +12,37 @@ dynamics), and **CalculiX** (FEM) — with no C or Fortran dependencies, no
1212

1313
---
1414

15-
## Implementation Status — v0.1.1 (2026-05-17)
15+
## Implementation Status — v0.1.2 (2026-06-06)
1616

1717
| Crate | Status | Tests | Domain summary |
1818
|---|---|---|---|
19-
| `oxiphysics-core` | **Stable** | 5,348 | Math, numerics, ODE, stochastic, tensors, signal processing, 80+ modules |
20-
| `oxiphysics-geometry` | **Stable** | 3,089 | Shapes, meshes, computational geometry, NURBS, CSG, 57+ modules |
21-
| `oxiphysics-collision` | **Stable** | 2,439 | GJK/EPA, SAP, BVH, CCD, ray casting, contact graphs |
22-
| `oxiphysics-materials` | **Stable** | 4,486 | Material models, hyperelastic, composites, biomaterials, smart materials |
23-
| `oxiphysics-fem` | **Stable** | 4,561 | Linear+nonlinear FEM, XFEM, spectral, stochastic FEM, 124 source files |
19+
| `oxiphysics-core` | **Stable** | 5,378 | Math, numerics, ODE, stochastic, tensors, signal processing, 80+ modules |
20+
| `oxiphysics-geometry` | **Stable** | 3,120 | Shapes, meshes, computational geometry, NURBS, CSG, 57+ modules |
21+
| `oxiphysics-collision` | **Stable** | 2,443 | GJK/EPA, SAP, BVH, CCD, ray casting, contact graphs |
22+
| `oxiphysics-materials` | **Stable** | 4,506 | Material models, hyperelastic, composites, biomaterials, smart materials |
23+
| `oxiphysics-fem` | **Stable** | 4,620 | Linear+nonlinear FEM, XFEM, spectral, stochastic FEM, 124 source files |
2424
| `oxiphysics-gpu` | **Alpha** | 2,811 | CPU-fallback compute backend, ParticleSystem, parallel sort |
25-
| `oxiphysics-io` | **Stable** | 4,849 | VTK, PDB, LAMMPS, OpenFOAM, GLTF, HDF5, 80+ format modules |
26-
| `oxiphysics-lbm` | **Stable** | 5,313 | LBM D3Q19/D3Q27, MRT, multiphase, MHD, biofluid, traffic |
27-
| `oxiphysics-md` | **Stable** | 5,139 | MD forcefield, QM/MM, REMD, free energy, LAMMPS/AMBER compat |
28-
| `oxiphysics-sph` | **Stable** | 4,367 | WCSPH, IISPH, DFSPH, PCISPH, free surface, multiphase SPH |
29-
| `oxiphysics-rigid` | **Stable** | 3,810 | Rigid body dynamics, aerospace, spacecraft, marine, swarm |
30-
| `oxiphysics-softbody` | **Stable** | 3,469 | PBD, XPBD, cloth, hair, ropes, Cosserat rods, surgical sim |
31-
| `oxiphysics-constraints` | **Stable** | 2,173 | PGS/TGS solvers, joints, motors, islands, trajectory opt |
32-
| `oxiphysics-vehicle` | **Stable** | 2,669 | Vehicle dynamics, Pacejka tires, EV, autonomous driving |
33-
| `oxiphysics-viz` | **Stable** | 4,072 | CPU software renderer, scientific plotting, volume rendering, VR |
34-
| `oxiphysics-python` | **Stable** | 25,257 | PyO3 0.28 bindings — 210 `#[pyclass]` across 14 domain modules |
35-
| `oxiphysics-wasm` | **Stable** | 27,215 | wasm-bindgen 0.2 bindings — 929 `#[wasm_bindgen]` across 27+ bridge files |
25+
| `oxiphysics-io` | **Stable** | 4,879 | VTK, PDB, LAMMPS, OpenFOAM, GLTF, HDF5, 80+ format modules |
26+
| `oxiphysics-lbm` | **Stable** | 5,320 | LBM D3Q19/D3Q27, MRT, multiphase, MHD, biofluid, traffic |
27+
| `oxiphysics-md` | **Stable** | 5,171 | MD forcefield, QM/MM, REMD, free energy, LAMMPS/AMBER compat |
28+
| `oxiphysics-sph` | **Stable** | 4,370 | WCSPH, IISPH, DFSPH, PCISPH, free surface, multiphase SPH |
29+
| `oxiphysics-rigid` | **Stable** | 3,820 | Rigid body dynamics, aerospace, spacecraft, marine, swarm |
30+
| `oxiphysics-softbody` | **Stable** | 3,473 | PBD, XPBD, cloth, hair, ropes, Cosserat rods, surgical sim |
31+
| `oxiphysics-constraints` | **Stable** | 2,188 | PGS/TGS solvers, joints, motors, islands, trajectory opt |
32+
| `oxiphysics-vehicle` | **Stable** | 2,687 | Vehicle dynamics, Pacejka tires, EV, autonomous driving |
33+
| `oxiphysics-viz` | **Stable** | 4,114 | CPU software renderer, scientific plotting, volume rendering, VR |
34+
| `oxiphysics-python` | **Stable** | | PyO3 0.28 bindings — 210 `#[pyclass]` across 14 domain modules |
35+
| `oxiphysics-wasm` | **Stable** | 922 | wasm-bindgen 0.2 bindings — 929 `#[wasm_bindgen]` across 27+ bridge files |
3636
| `oxiphysics` | top-level re-exports || Single-crate entry point for all modules |
3737

38+
*`oxiphysics-python` is validated via its pytest suite (PyO3 extension-module; not counted in the cargo nextest total).*
39+
3840
---
3941

4042
## Highlights
4143

4244
- **Zero stubs** — no `todo!()` or `unimplemented!()` calls anywhere in the workspace.
43-
- **~60,087 tests** across 17 crates, all passing under `cargo nextest`.
45+
- **60,115 tests** (11 skipped) across the workspace, all passing under `cargo nextest`.
4446
- **Strict docs**`RUSTDOCFLAGS='-D warnings' cargo doc` passes with no missing-docs warnings.
4547
- **Pure Rust** — zero C/Fortran build-time dependencies; default features are 100% Rust.
4648
- **`cargo publish --dry-run` passes** for the top-level `oxiphysics` crate.
@@ -99,16 +101,16 @@ Add to your `Cargo.toml`:
99101

100102
```toml
101103
[dependencies]
102-
oxiphysics = "0.1.1"
104+
oxiphysics = "0.1.2"
103105
```
104106

105107
Or use individual sub-crates for smaller build graphs, e.g.:
106108

107109
```toml
108110
[dependencies]
109-
oxiphysics-core = "0.1.1"
110-
oxiphysics-collision = "0.1.1"
111-
oxiphysics-rigid = "0.1.1"
111+
oxiphysics-core = "0.1.2"
112+
oxiphysics-collision = "0.1.2"
113+
oxiphysics-rigid = "0.1.2"
112114
```
113115

114116
---

0 commit comments

Comments
 (0)