Skip to content

O(1) boundary-shape adjoint gradient for SIMSOPT #591

@krystophny

Description

@krystophny

User story

As a stellarator-optimization user, I get VMEC++'s plasma-boundary-shape gradient at a cost independent of the number of boundary DOFs: one linear Hessian solve instead of one equilibrium re-solve per DOF.

Scope

  • examples/vmecpp_adjoint.py: partition the state into interior and boundary, converge the interior, then one adjoint solve H_II^T lambda = dJ/dx_I (GMRES preconditioned by M^-1) gives the full boundary gradient.
  • examples/simsopt_vmec_gradient.py: a SIMSOPT Optimizable wrapping it.

Benefit

25x to 263x fewer force evaluations than finite-differencing over the boundary, growing with DOF count. Depends on the gradient and preconditioner exposures (#577, #579) and the exact HVP (#582).

Closes when #581 merges.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions