Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

particlesci

Validated 2D particle solvers for soil–fluid interaction analysis.

This is the scientific core behind ParticlesInteraction (the interactive sandbox), rebuilt validation-first: SI units end-to-end, no rendering, and a benchmark suite (validate.py) that checks every solver against analytical solutions and published experimental data. Nothing here is tuned "to look right" — if a behaviour matters, there is a benchmark for it.

Solvers

  • particlesci.fluid.PBFluid — 2D Position-Based Fluids (Macklin & Müller 2013) in SI units (m, s, kg/m of depth; y-up). Jacobi constraint solver with explicit under-relaxation, one-sided (compression-only) density constraint, CFL-limited internal sub-stepping at ≤1/240 s, self-calibrated CFM epsilon from the rest lattice, XSPH smoothing. Static boundary particles (e.g. a grain bed) enter the density constraint.
  • particlesci.granular.Granular — 2D grains (pymunk) in SI units: metre-scale collision slop, Coulomb friction, rolling resistance as exponential angular damping (mu_roll, the standard circular-DEM surrogate).

Validation suite

python3 -m pip install -r requirements.txt
python3 validate.py            # full suite (a few minutes, CPU)
python3 validate.py --quick    # coarser resolution
python3 validate.py --only hydrostatic
# Benchmark Reference What is checked
1 hydrostatic analytical interior density = ρ₀ (incompressibility), volume conservation, liquid at rest stays at rest, linear pressure profile with depth
2 dambreak Martin & Moyce (1952) experiments dimensionless front position Z = x/a at T = t·√(2g/a) = 2
3 repose Coulomb friction poured-pile angle of repose ≈ arctan(μ)
4 infiltration Ergun equation superficial velocity of water through a static coarse-grain bed

Current results: 6/7 checks pass — recorded in docs/VALIDATION.md — including the failures and what they mean. Exit code = number of failed checks, so the suite is CI-ready.

Development findings so far

Documented in detail in docs/VALIDATION.md; the headline lessons from building the suite:

  • PBD stiffness is timestep-dependent. At a 1/60 s solver step the hydrostatic interior density error is ~10 %; at 1/240 s it is ~1 %. The solver therefore sub-steps internally at ≤ 1/240 s.
  • Jacobi constraint projection needs under-relaxation (ω ≈ 0.5): both ends of every pair are corrected simultaneously, and full-strength corrections diverge. (The predecessor project achieved the same effect accidentally through an oversized ε.)
  • The density constraint must be one-sided (compression only): surface and wall particles have truncated kernel support, and a two-sided constraint turns that deficiency into spurious attraction.

Roadmap

  1. ✅ SI solvers + validation harness (this)
  2. Calibrated coupling: boundary pseudo-mass and drag derived from grain geometry (Ergun closure), not tuned
  3. GPU port (Taichi): DFSPH + proper DEM contacts, 10⁵–10⁶ particles, 3D
  4. Science modules, each with its own benchmark: erosion/corrosion, sediment transport (Shields), unsaturated flow (Green–Ampt)
  5. Experiment configs, parameter sweeps, reproducible reports; interactive front-end reattached from ParticlesInteraction

Layout

particlesci/
├── particlesci/
│   ├── fluid.py        # PBF solver (SI)
│   └── granular.py     # granular solver (SI)
├── validate.py         # benchmark suite (exit code = #fails)
├── scripts/
│   └── calibrate.py    # parameter-sweep experiments behind the defaults
└── docs/
    └── VALIDATION.md   # current benchmark results & analysis

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages