Example scripts¶
Complete pysimple scripts from examples/, run by
test/python/test_examples.py. Run them from examples/; they read
test/test_data/wout.nc, the equilibrium of
Quick start.
Surface trace¶
examples/simple_api.py¶
#!/usr/bin/env python3
"""Simple particle tracing example using pysimple API."""
import pysimple
vmec_file = '../test/test_data/wout.nc'
pysimple.init(vmec_file, deterministic=True, trace_time=5e-5, ntestpart=32)
particles = pysimple.sample_surface(32, s=0.3)
results = pysimple.trace_parallel(particles, integrator='midpoint')
n_lost = ((results['loss_times'] > 0.0) & (results['loss_times'] < 5e-5)).sum()
n_confined = (results['loss_times'] >= 5e-5).sum()
n_skipped = (results['loss_times'] < 0.0).sum()
print(f"Traced 32 particles: {n_confined} confined, {n_lost} lost, {n_skipped} skipped")
Fast classification¶
examples/classify_fast.py¶
#!/usr/bin/env python3
"""Fast classification using jpar and topology."""
import pysimple
vmec_file = '../test/test_data/wout.nc'
pysimple.init(vmec_file, deterministic=True, trace_time=1e-4, ntestpart=16)
particles = pysimple.sample_surface(16, s=0.4)
results = pysimple.classify_fast(particles, nturns=8)
n_passing = results['passing'].sum()
n_trapped = (~results['passing']).sum()
jpar_regular = (results['jpar'] == 1).sum()
jpar_stochastic = (results['jpar'] == 2).sum()
topology_ideal = (results['topology'] == 1).sum()
topology_non_ideal = (results['topology'] == 2).sum()
print(f"Fast classification of 16 particles: {n_passing} passing, {n_trapped} trapped")
print(f" J_parallel: {jpar_regular} regular, {jpar_stochastic} stochastic")
print(f" Topology: {topology_ideal} ideal, {topology_non_ideal} non-ideal")
Fractal classification¶
examples/classify_fractal.py¶
#!/usr/bin/env python3
"""Fractal classification using fractal dimension."""
import pysimple
vmec_file = '../test/test_data/wout.nc'
pysimple.init(vmec_file, deterministic=True, trace_time=1e-4, ntestpart=16)
particles = pysimple.sample_surface(16, s=0.4)
results = pysimple.classify_fractal(particles, tcut=0.1)
n_passing = results['passing'].sum()
n_trapped = (~results['passing']).sum()
n_lost = results['lost'].sum()
fractal_regular = (results['fractal'] == 1).sum()
fractal_chaotic = (results['fractal'] == 2).sum()
print(f"Fractal classification of {16} particles:")
print(f" Passing: {n_passing}, Trapped: {n_trapped}, Lost: {n_lost}")
print(f" Fractal: {fractal_regular} regular, {fractal_chaotic} chaotic")
Macrostep orbit trace¶
examples/orbit_macro.py¶
#!/usr/bin/env python3
"""Trace orbit with trajectory output."""
import pysimple
vmec_file = '../test/test_data/wout.nc'
pysimple.init(vmec_file, deterministic=True, trace_time=1e-4, ntestpart=1)
particles = pysimple.sample_surface(1, s=0.35)
particle = particles[:, 0]
result = pysimple.trace_orbit(particle, integrator='midpoint', return_trajectory=True)
n_timesteps = result['times'].shape[0]
print(f"Traced 1 particle with {n_timesteps} timesteps")
print(f"Loss time: {result['loss_time']:.3e}s")