bluemira.equilibria.run ======================= .. py:module:: bluemira.equilibria.run .. autoapi-nested-parse:: Interface for building and loading equilibria and coilset designs Classes ------- .. autoapisummary:: bluemira.equilibria.run.Snapshot bluemira.equilibria.run.BreakdownCOPConfig bluemira.equilibria.run.EQConfig bluemira.equilibria.run.PositionConfig bluemira.equilibria.run.PulsedCoilsetDesignFrame bluemira.equilibria.run.PulsedCoilsetDesign bluemira.equilibria.run.FixedPulsedCoilsetDesign bluemira.equilibria.run.MovingCurrentBoundStrategy bluemira.equilibria.run.OptimisedPulsedCoilsetDesign Module Contents --------------- .. py:class:: Snapshot Abstract object for grouping of equilibria objects in a given state. :param eq: The equilibrium at the snapshot :param coilset: The coilset at the snapshot :param opt_problem: The constraints at the snapshot :param profiles: The profile at the snapshot :param optimisation_result: The optimisation result :param limiter: The limiter for the snapshot :param tfcoil: The PF coil placement boundary .. py:attribute:: eq :type: bluemira.equilibria.equilibrium.MHDState .. py:attribute:: coilset :type: bluemira.equilibria.coils.CoilSet .. py:attribute:: constraints :type: bluemira.equilibria.optimisation.problem.CoilsetOptimisationProblem | None :value: None .. py:attribute:: profiles :type: bluemira.equilibria.profiles.Profile | None :value: None .. py:attribute:: optimisation_result :type: bluemira.equilibria.optimisation.problem.base.CoilsetOptimiserResult | None :value: None .. py:attribute:: iterator :type: bluemira.equilibria.solve.PicardIterator | None :value: None .. py:attribute:: limiter :type: bluemira.equilibria.limiter.Limiter | None :value: None .. py:attribute:: tfcoil :type: bluemira.geometry.coordinates.Coordinates | None :value: None .. py:method:: __post_init__() Copy some variables on initialisation .. py:class:: BreakdownCOPConfig Breakdown settings for PulsedCoilsetDesign .. py:attribute:: problem :type: type[bluemira.equilibria.optimisation.problem.BreakdownCOP] .. py:attribute:: strategy :type: type[bluemira.equilibria.optimisation.problem.BreakdownZoneStrategy] .. py:attribute:: algorithm :type: bluemira.optimisation.AlgorithmType .. py:attribute:: opt_conditions :type: dict[str, float | int] .. py:attribute:: B_stray_con_tol :type: float :value: 1e-08 .. py:attribute:: n_B_stray_points :type: int :value: 20 .. py:attribute:: iter_max :type: int :value: 30 .. py:method:: make_opt_problem(breakdown, strategy, max_currents, constraints, B_stray_max) Make breakdown optimisation problem :returns: The breakdown problem .. py:class:: EQConfig Equilibrium settings for PulsedCoilsetDesign .. py:attribute:: problem :type: type[bluemira.equilibria.optimisation.problem.base.EqCoilsetOptimisationProblem] .. py:attribute:: convergence :type: bluemira.equilibria.solve.ConvergenceCriterion .. py:attribute:: algorithm :type: bluemira.optimisation.AlgorithmType .. py:attribute:: opt_conditions :type: dict[str, float | int] .. py:attribute:: opt_parameters :type: dict[str, Any] .. py:attribute:: coil_mesh_size :type: float :value: 0.3 .. py:attribute:: gamma :type: float :value: 1e-08 .. py:attribute:: relaxation :type: float :value: 0.1 .. py:attribute:: peak_PF_current_factor :type: float :value: 1.5 .. py:attribute:: diagnostic_plotting :type: bluemira.equilibria.diagnostics.PicardDiagnosticOptions .. py:attribute:: o_point_fallback :type: bluemira.equilibria.profiles.OPointCalcOptions .. py:method:: 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 .. py:class:: PositionConfig Position optimiser settings .. py:attribute:: problem :type: type[bluemira.equilibria.optimisation.problem.PulsedNestedPositionCOP] .. py:attribute:: algorithm :type: bluemira.optimisation.AlgorithmType .. py:attribute:: opt_conditions :type: dict[str, float | int] .. py:method:: make_opt_problem(position_mapper, current_bounder, sub_opt_problems) Make outer position optimisation problem :returns: The position problem .. py:class:: PulsedCoilsetDesignFrame Bases: :py:obj:`bluemira.base.parameter_frame.ParameterFrame` .. autoapi-inheritance-diagram:: bluemira.equilibria.run.PulsedCoilsetDesignFrame :parts: 1 :private-bases: PulsedCoilsetDesign Parameters .. py:attribute:: A :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: B_premag_stray_max :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: C_Ejima :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: I_p :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: l_i :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: R_0 :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: tau_flattop :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: tk_sol_ib :type: bluemira.base.parameter_frame.Parameter[float] .. py:attribute:: v_burn :type: bluemira.base.parameter_frame.Parameter[float] .. py:class:: 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: :py:obj:`abc.ABC` .. autoapi-inheritance-diagram:: bluemira.equilibria.run.PulsedCoilsetDesign :parts: 1 :private-bases: Abstract base class for the procedural design of a pulsed tokamak poloidal field coilset. :param params: Parameter frame with which to perform the problem :param coilset: PF coilset to use in the equilibrium design :param grid: Grid to use in the equilibrium design :param equilibrium_constraints: List of magnetic constraints to use for equilibria. Depending on the optimisation problem, these may be used in the objective function or constraints :param profiles: Plasma profile object to use when solving equilibria :param breakdown_settings: Breakdown optimiser settings :param equilibrium_settings: Settings for the solution of equilibria :param current_opt_constraints: List of current optimisation constraints for equilibria :param coil_constraints: List of coil current optimisation constraints for all snapshots (including breakdown) :param limiter: Limiter to use when solving equilibria .. py:attribute:: BREAKDOWN :value: 'Breakdown' .. py:attribute:: EQ_REF :value: 'Reference' .. py:attribute:: SOF :value: 'SOF' .. py:attribute:: EOF :value: 'EOF' .. py:attribute:: snapshots .. py:attribute:: params .. py:attribute:: coilset .. py:attribute:: grid .. py:attribute:: _current_opt_cons :value: None .. py:attribute:: eq_constraints .. py:attribute:: profiles .. py:property:: bd_config :type: BreakdownCOPConfig Breakdown COP settings. .. py:property:: eq_config :type: EQConfig Equilibrium COP settings. .. py:attribute:: _coil_cons :value: [] .. py:attribute:: limiter :value: None .. py:method:: optimise(*args, **kwargs) -> bluemira.equilibria.coils.CoilSet :abstractmethod: Run pulsed coilset design optimisation. .. py:method:: 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. .. py:method:: _get_psi_premag() .. py:method:: 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 .. py:method:: run_reference_equilibrium() Run a reference equilibrium. .. py:method:: 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 .. py:method:: _get_max_currents(coilset: bluemira.equilibria.coils.CoilSet) -> numpy.typing.NDArray[numpy.float64] .. py:method:: 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. .. py:method:: 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 .. py:method:: 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. .. py:method:: plot() Plot the pulsed equilibrium problem. :returns: plot figure .. py:class:: 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: :py:obj:`PulsedCoilsetDesign` .. autoapi-inheritance-diagram:: bluemira.equilibria.run.FixedPulsedCoilsetDesign :parts: 1 :private-bases: Procedural design for a pulsed tokamak with a known, fixed PF coilset. .. py:method:: optimise() -> bluemira.equilibria.coils.CoilSet Run pulsed coilset design optimisation. .. py:method:: optimise_currents() Optimise the coil currents at the start and end of the current flat-top. .. py:class:: 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. .. py:attribute:: keep_out_zones .. py:attribute:: pf_max_current .. py:attribute:: pf_current_density .. py:method:: 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. :rtype: The vector of maximum currents .. py:class:: 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: :py:obj:`PulsedCoilsetDesign` .. autoapi-inheritance-diagram:: bluemira.equilibria.run.OptimisedPulsedCoilsetDesign :parts: 1 :private-bases: Procedural design for a pulsed tokamak with no prescribed PF coil positions. :param params: Parameter frame with which to perform the problem :param coilset: PF coilset to use in the equilibrium design :param position_mapper: Normalised coil position mapping :param grid: Grid to use in the equilibrium design :param equilibrium_constraints: List of magnetic constraints to use for equilibria. Depending on the optimisation problem, these may be used in the objective function or constraints :param profiles: Plasma profile object to use when solving equilibria :param breakdown_settings: Breakdown optimiser settings :param equilibrium_settings: Settings for the solution of equilibria :param current_opt_constraints: List of current optimisation constraints for equilibria :param coil_constraints: List of coil current optimisation constraints for all snapshots (including breakdown) :param limiter: Limiter to use when solving equilibria .. py:attribute:: coilset .. py:attribute:: position_mapper .. py:attribute:: current_bounder :value: None .. py:property:: pos_config :type: PositionConfig Position COP settings. .. py:method:: _prepare_coilset(coilset: bluemira.equilibria.coils.CoilSet) -> bluemira.equilibria.coils.CoilSet .. py:method:: 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. .. py:method:: _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.