Skip to content

Fix all examples for PR #29#35

Open
Tejas7007 wants to merge 2 commits into
uwplasma:eg/analysisfrom
Tejas7007:eg/analysis
Open

Fix all examples for PR #29#35
Tejas7007 wants to merge 2 commits into
uwplasma:eg/analysisfrom
Tejas7007:eg/analysis

Conversation

@Tejas7007

Copy link
Copy Markdown

Got all 44 examples in PR #29 running end-to-end (was 3/44).

Verified locally: Fig 3 (gc_vs_fo), Fig 5 (poincare_plots), and the autodiff figure (gradients) all reproduce correctly.

Source-level changes (all additive / backward-compatible):

  • essos/coils.py: override setters for Curves gamma / gamma_dash / gamma_dashdash (unblocks coil perturbation with the immutable Curves model)

  • essos/surfaces.py: SurfaceRZFourier.init accepts filename string or Vmec object as first arg (existing explicit-arg calls unchanged)

  • essos/dynamics.py: optional solver= kwarg in Tracing (defaults preserve Dopri8); energy() now handles FullOrbit_Boris

  • essos/objective_functions.py: restored loss_coil_curvature_new, loss_coil_length_new, loss_particle_r_cross_max_constraint as flat-vector wrappers; loss_BdotN accepts surface= alternative to vmec=; fixed shape mismatch in loss_optimize_coils_for_particle_confinement

  • essos/augmented_lagrangian.py: 16 jax.jax.tree_util -> jax.tree_util typo fixes

  • essos/coil_perturbation.py: jnp.clip(eigvals, a_min=0) -> min=0 (NumPy 2.x API)

Example fixes:

  • Path bugs (10+ files): name -> file typos, "../examples/input_files" -> "../input_files", missing "../" when running from subdirs

  • API renames: Coils_from_json -> Coils.from_json (7 files), Coils_from_simsopt -> Coils.from_simsopt (2 files)

  • Tracing API alignment in poincare_plots.py (timesteps=count -> timestep=dt, tol_step_size -> atol/rtol)

  • gradients.py: hardcoded 8 processors -> 1 (was failing on shape mismatch)

  • Rewrote paper/fo_integrators.py and paper/gc_integrators.py for current keyword API + new solver= kwarg (Fig 4 unblocked)

  • .energy attribute -> .energy() method form

  • _new aliasing in adam / augmented-lagrangian examples

Optional deps the examples need: simsopt, h5py, plotly, booz_xform (latter needs libnetcdf-dev + gfortran on the system). Happy to add these as extras to pyproject.toml in a follow-up if useful.

Caveats: every example now starts and runs without crashing. End-to-end completion verified for the 3 paper figures above. The longer-running optimizers (LBFGS, augmented Lagrangian) should be confirmed on full runs.

…loss wrappers, solver kwarg in Tracing, override setters for Curves gamma

@rogeriojorge rogeriojorge left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done with review of this PR.

@@ -1,6 +1,6 @@
import os
import gc
number_of_processors_to_use = 1 # Parallelization, this should divide nparticles

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason to remove this comment?

plt.grid(axis='y', which='major', linestyle='--', linewidth=0.6)
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'fo_integration.pdf'))
plt.show()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't be removing code that works

coils = Coils.from_json(json_file)
field = BiotSavart(coils)

# Particle parameters

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't be removing comments

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restored in the latest push.

Comment thread essos/dynamics.py
dt0=self.timestep,#self.maxtime / self.timesteps,
y0=initial_condition,
solver=diffrax.Dopri8(),
solver=(self.solver if self.solver is not None else diffrax.Dopri8()),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this if statement differentiable? Could you test if we could do the optimize coils particle confinement script with this solver and get gradients?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested it.. gradients flow fine. I traced with both the default solver and an explicit solver=Tsit5() and took jax.grad through each; both give finite, identical gradients. The branch is on self.solver (a Python attribute, not a traced value), so it resolves at trace time and doesn't break differentiability. Added a note in the code.

Comment thread essos/dynamics.py
energy = vmap(compute_energy)(self.trajectories)

elif self.model == 'FullOrbit':
elif self.model == 'FullOrbit' or self.model == 'FullOrbit_Boris':

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if FullOrbit and FullOrbit_Boris refer to the same model, but if they do, then there's no need for a second redundant name.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They're different integrators for the same physics..Basically, FullOrbit uses the diffrax adaptive solver, FullOrbit_Boris uses the Boris pusher. The energy computation is identical for both, so they share that branch, but the names aren't redundant.

Comment thread essos/surfaces.py Outdated

nfp, mpol, ntor: static

Backward-compat: rc may also be a filename (string) or a Vmec-like object,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eduardolneto can you review this init? Do we need such backwards compatibility?

field = BiotSavart(coils)

# Particle parameters
nparticles = number_of_processors_to_use

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wasn't it used before? I guess perhaps not, but it might be good to trace more than one particle.

cyclotron_frequency = ELEMENTARY_CHARGE * 0.3 / mass
print("cyclotron period:", 1 / cyclotron_frequency)

# Particles initialization

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments like these one are important!

Comment on lines -99 to -103
plt.show()

## Save results in vtk format to analyze in Paraview
# tracing.to_vtk('trajectories')
# coils.to_vtk('coils')

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All this is important.

@@ -1,13 +1,13 @@
import os
number_of_processors_to_use = 12 # Parallelization, this should divide ntheta*nphi

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this change is done to make the examples uniform, that's ok, if it's here because parallelization is not working, then it should be addressed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants