Note
Go to the end to download the full example code.
Particle-level friction coefficient of a rigid clump#
Same setup as the SASA example, but the quantity of interest is the
probe-reported friction coefficient mu = |F_t| / |F_n| instead of
the surface area. We take the mean of mu over the sampled approach
directions; since the directions are a near-uniform Fibonacci lattice
on S^2, that’s the surface-averaged friction to leading order.
Numerics match sasa_calculation.py: target_overlap = 1e-10
and separation_tolerance = 1e-12, which requires x64.
Enable x64 before any other JAX work.
import jax
jax.config.update("jax_enable_x64", True) # type: ignore[no-untyped-call]
import numpy as np
from jaxdem.utils.particle_creation import create_ga_state, create_sphere_state
from jaxdem.utils.surface_properties import compute_surface_properties
Central rigid clump + tracer sphere
central = create_ga_state(
N=1,
nv=20,
dim=3,
particle_radius=0.5,
asperity_radius=0.1,
particle_type="clump",
core_type="solid", # clumps need to be solid for the sasa protocol to be robust
n_samples=10_000_000, # the default; ~10M samples give decent accuracy for the clump COM
seed=0,
mesh_kwargs={"steps": 1_000},
)
tracer_radius = 0.05
tracer = create_sphere_state(radii=tracer_radius, dim=3)
Probe the surface
n_points = 1024
result = compute_surface_properties(
central,
tracer,
target_overlap=1e-10,
separation_tolerance=1e-12,
n_points=n_points,
n_orientations=1,
n_rolls=1,
)
mu = np.asarray(result["mu"]).reshape(n_points)
print(f"mu: min={mu.min():.4f} max={mu.max():.4f}")
mu: min=0.0004 max=1.8231
Mean friction across the sampled approach directions.
mean_friction = float(mu.mean())
print(f"mean friction = {mean_friction:.4f}")
mean friction = 0.4731
Total running time of the script: (0 minutes 8.979 seconds)