bluemira.equilibria.run

Interface for building and loading equilibria and coilset designs

Classes

Snapshot

Abstract object for grouping of equilibria objects in a given state.

BreakdownCOPConfig

Breakdown settings for PulsedCoilsetDesign

EQConfig

Equilibrium settings for PulsedCoilsetDesign

PositionConfig

Position optimiser settings

PulsedCoilsetDesignFrame

PulsedCoilsetDesign Parameters

PulsedCoilsetDesign

Abstract base class for the procedural design of a pulsed tokamak poloidal field

FixedPulsedCoilsetDesign

Procedural design for a pulsed tokamak with a known, fixed PF coilset.

MovingCurrentBoundStrategy

Tool to adjust current bounds in sub-optimisation problems in accordance with

OptimisedPulsedCoilsetDesign

Procedural design for a pulsed tokamak with no prescribed PF coil positions.

Module Contents

class bluemira.equilibria.run.Snapshot

Abstract object for grouping of equilibria objects in a given state.

Parameters:
  • eq – The equilibrium at the snapshot

  • coilset – The coilset at the snapshot

  • opt_problem – The constraints at the snapshot

  • profiles – The profile at the snapshot

  • optimisation_result – The optimisation result

  • limiter – The limiter for the snapshot

  • tfcoil – The PF coil placement boundary

eq: bluemira.equilibria.equilibrium.MHDState
coilset: bluemira.equilibria.coils.CoilSet
constraints: bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem | None = None
profiles: bluemira.equilibria.profiles.Profile | None = None
optimisation_result: bluemira.equilibria.optimisation.problem.base.CoilsetOptimiserResult | None = None
iterator: bluemira.equilibria.solve.PicardIterator | None = None
limiter: bluemira.equilibria.limiter.Limiter | None = None
tfcoil: bluemira.geometry.coordinates.Coordinates | None = None
__post_init__()

Copy some variables on initialisation

class bluemira.equilibria.run.BreakdownCOPConfig

Breakdown settings for PulsedCoilsetDesign

problem: type[bluemira.equilibria.optimisation.problem.BreakdownCOP]
strategy: type[bluemira.equilibria.optimisation.problem.BreakdownZoneStrategy]
algorithm: bluemira.optimisation.AlgorithmType
opt_conditions: dict[str, float | int]
B_stray_con_tol: float = 1e-08
n_B_stray_points: int = 20
iter_max: int = 30
make_opt_problem(breakdown, strategy, max_currents, constraints, B_stray_max)

Make breakdown optimisation problem

Returns:

The breakdown problem

class bluemira.equilibria.run.EQConfig

Equilibrium settings for PulsedCoilsetDesign

problem: type[bluemira.equilibria.optimisation.problem.base.EqCoilsetOptimisationProblem]
convergence: bluemira.equilibria.solve.ConvergenceCriterion
algorithm: bluemira.optimisation.AlgorithmType
opt_conditions: dict[str, float | int]
opt_parameters: dict[str, Any]
coil_mesh_size: float = 0.3
gamma: float = 1e-08
relaxation: float = 0.1
peak_PF_current_factor: float = 1.5
diagnostic_plotting: bluemira.equilibria.diagnostics.PicardDiagnosticOptions
o_point_fallback: bluemira.equilibria.profiles.OPointCalcOptions
make_opt_problem(eq: bluemira.equilibria.equilibrium.Equilibrium, max_currents: numpy.typing.NDArray[numpy.float64], current_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None, eq_constraints: list[bluemira.equilibria.optimisation.constraints.MagneticConstraint]) bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem

Make equilibria optimisation problem

Returns:

The equilibria problem

Raises:

EquilibriaError – Unimplemented setup for equilibria problem

Parameters:
Return type:

bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem

class bluemira.equilibria.run.PositionConfig

Position optimiser settings

problem: type[bluemira.equilibria.optimisation.problem.PulsedNestedPositionCOP]
algorithm: bluemira.optimisation.AlgorithmType
opt_conditions: dict[str, float | int]
make_opt_problem(position_mapper, current_bounder, sub_opt_problems)

Make outer position optimisation problem

Returns:

The position problem

class bluemira.equilibria.run.PulsedCoilsetDesignFrame

Bases: bluemira.base.parameter_frame.ParameterFrame

Inheritance diagram of bluemira.equilibria.run.PulsedCoilsetDesignFrame

PulsedCoilsetDesign Parameters

A: bluemira.base.parameter_frame.Parameter[float]
B_premag_stray_max: bluemira.base.parameter_frame.Parameter[float]
C_Ejima: bluemira.base.parameter_frame.Parameter[float]
I_p: bluemira.base.parameter_frame.Parameter[float]
l_i: bluemira.base.parameter_frame.Parameter[float]
R_0: bluemira.base.parameter_frame.Parameter[float]
tau_flattop: bluemira.base.parameter_frame.Parameter[float]
tk_sol_ib: bluemira.base.parameter_frame.Parameter[float]
v_burn: bluemira.base.parameter_frame.Parameter[float]
class bluemira.equilibria.run.PulsedCoilsetDesign(params: bluemira.base.parameter_frame.ParameterFrame, coilset: bluemira.equilibria.coils.CoilSet, grid: bluemira.equilibria.grid.Grid, equilibrium_constraints: list[bluemira.equilibria.optimisation.constraints.MagneticConstraint], profiles: bluemira.equilibria.profiles.Profile, breakdown_settings: dict | BreakdownCOPConfig | None = None, equilibrium_settings: dict | EQConfig | None = None, current_opt_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, coil_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, limiter: bluemira.equilibria.limiter.Limiter | None = None)

Bases: abc.ABC

Inheritance diagram of bluemira.equilibria.run.PulsedCoilsetDesign

Abstract base class for the procedural design of a pulsed tokamak poloidal field coilset.

Parameters:
BREAKDOWN = 'Breakdown'
EQ_REF = 'Reference'
SOF = 'SOF'
EOF = 'EOF'
snapshots
params
coilset
grid
_current_opt_cons = None
eq_constraints
profiles
property bd_config: BreakdownCOPConfig

Breakdown COP settings.

Return type:

BreakdownCOPConfig

property eq_config: EQConfig

Equilibrium COP settings.

Return type:

EQConfig

_coil_cons = []
limiter = None
abstract optimise(*args, **kwargs) bluemira.equilibria.coils.CoilSet

Run pulsed coilset design optimisation.

Return type:

bluemira.equilibria.coils.CoilSet

take_snapshot(name: str, eq: bluemira.equilibria.equilibrium.MHDState, coilset: bluemira.equilibria.coils.CoilSet, problem: bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem, profiles: bluemira.equilibria.profiles.Profile | None = None, iterator: bluemira.equilibria.solve.PicardIterator | None = None)

Take a snapshot of the pulse.

Parameters:
_get_psi_premag()
run_premagnetisation(*, keep_history: bool = False, check_constraints: bool = False)

Run the breakdown optimisation problem.

Raises:

EquilibriaError – Unable to relax breakdown for given coil sizes

Parameters:
  • keep_history (bool)

  • check_constraints (bool)

run_reference_equilibrium()

Run a reference equilibrium.

calculate_sof_eof_fluxes(psi_premag: float | None = None) tuple[float, float]

Calculate the SOF and EOF plasma boundary fluxes.

Returns:

  • SOF psi

  • EOF psi

Parameters:

psi_premag (float | None)

Return type:

tuple[float, float]

_get_max_currents(coilset: bluemira.equilibria.coils.CoilSet) numpy.typing.NDArray[numpy.float64]
Parameters:

coilset (bluemira.equilibria.coils.CoilSet)

Return type:

numpy.typing.NDArray[numpy.float64]

get_sof_eof_opt_problems(psi_sof: float, psi_eof: float) list[bluemira.equilibria.optimisation.problem.base.EqCoilsetOptimisationProblem]
Returns:

Start of flat top and end of flat top optimisation problems.

Parameters:
  • psi_sof (float)

  • psi_eof (float)

Return type:

list[bluemira.equilibria.optimisation.problem.base.EqCoilsetOptimisationProblem]

converge_equilibrium(eq: bluemira.equilibria.equilibrium.Equilibrium, problem: bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem)

Converge an equilibrium problem from a ‘frozen’ plasma optimised state.

Returns:

The iterator

Parameters:
converge_and_snapshot(sub_opt_problems: collections.abc.Iterable[bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem], problem_names: collections.abc.Iterable[str] = (SOF, EOF))

Converge equilibrium optimisation problems and take snapshots.

Parameters:
  • sub_opt_problems (collections.abc.Iterable[bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem])

  • problem_names (collections.abc.Iterable[str])

plot()

Plot the pulsed equilibrium problem.

Returns:

plot figure

class bluemira.equilibria.run.FixedPulsedCoilsetDesign(params: bluemira.base.parameter_frame.ParameterFrame, coilset: bluemira.equilibria.coils.CoilSet, grid: bluemira.equilibria.grid.Grid, equilibrium_constraints: list[bluemira.equilibria.optimisation.constraints.MagneticConstraint], profiles: bluemira.equilibria.profiles.Profile, breakdown_settings: dict | BreakdownCOPConfig | None = None, equilibrium_settings: dict | EQConfig | None = None, current_opt_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, coil_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, limiter: bluemira.equilibria.limiter.Limiter | None = None)

Bases: PulsedCoilsetDesign

Inheritance diagram of bluemira.equilibria.run.FixedPulsedCoilsetDesign

Procedural design for a pulsed tokamak with a known, fixed PF coilset.

Parameters:
optimise() bluemira.equilibria.coils.CoilSet

Run pulsed coilset design optimisation.

Return type:

bluemira.equilibria.coils.CoilSet

optimise_currents()

Optimise the coil currents at the start and end of the current flat-top.

class bluemira.equilibria.run.MovingCurrentBoundStrategy(keep_out_zones: list[bluemira.geometry.face.BluemiraFace], pf_max_current: float, pf_current_density: float)

Tool to adjust current bounds in sub-optimisation problems in accordance with the KOZ and PF coil current density.

Parameters:
keep_out_zones
pf_max_current
pf_current_density
get_max_currents(pos_map: dict[str, numpy.typing.NDArray[numpy.float64]], coil_names: list[str]) numpy.typing.NDArray[numpy.float64]

Get the maximum currents for the PF coils in accordance with the potential size and current density.

Return type:

The vector of maximum currents

Parameters:
  • pos_map (dict[str, numpy.typing.NDArray[numpy.float64]])

  • coil_names (list[str])

class bluemira.equilibria.run.OptimisedPulsedCoilsetDesign(params: bluemira.base.parameter_frame.ParameterFrame, coilset: bluemira.equilibria.coils.CoilSet, position_mapper: bluemira.utilities.positioning.PositionMapper, grid: bluemira.equilibria.grid.Grid, equilibrium_constraints: list[bluemira.equilibria.optimisation.constraints.MagneticConstraint], profiles: bluemira.equilibria.profiles.Profile, breakdown_settings: dict | BreakdownCOPConfig | None = None, equilibrium_settings: dict | EQConfig | None = None, current_opt_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, coil_constraints: list[bluemira.equilibria.optimisation.constraints.UpdateableConstraint] | None = None, limiter: bluemira.equilibria.limiter.Limiter | None = None, current_bounder: MovingCurrentBoundStrategy | None = None, position_settings: dict | PositionConfig | None = None)

Bases: PulsedCoilsetDesign

Inheritance diagram of bluemira.equilibria.run.OptimisedPulsedCoilsetDesign

Procedural design for a pulsed tokamak with no prescribed PF coil positions.

Parameters:
coilset
position_mapper
current_bounder = None
property pos_config: PositionConfig

Position COP settings.

Return type:

PositionConfig

_prepare_coilset(coilset: bluemira.equilibria.coils.CoilSet) bluemira.equilibria.coils.CoilSet
Parameters:

coilset (bluemira.equilibria.coils.CoilSet)

Return type:

bluemira.equilibria.coils.CoilSet

optimise(*, verbose: bool = False, keep_history: bool = False, check_constraints: bool = False) bluemira.equilibria.coils.CoilSet

Optimise the coil positions for the start and end of the current flat-top.

Parameters:
  • verbose (bool)

  • keep_history (bool)

  • check_constraints (bool)

Return type:

bluemira.equilibria.coils.CoilSet

_consolidate_coilset(coilset: bluemira.equilibria.coils.CoilSet, sub_opt_problems: collections.abc.Iterable[bluemira.equilibria.optimisation.problem.base.EqCoilsetOptimisationProblem]) bluemira.equilibria.coils.CoilSet

Set the current bounds on the current optimisation problems, fix coil sizes, and mesh.

Parameters:
Return type:

bluemira.equilibria.coils.CoilSet