Skip to content

Commit

Permalink
SH Plotting (#3023)
Browse files Browse the repository at this point in the history
* Create equilibrium comparison plotter class

- compare equilibrium object with reference equilibrium
- split psi plotting
- plotting percentage difference between current and reference equilibrium
- plot reference lcfs

* work on plots before work to update plot instead of producing new plots

* make subplots have the same axes limits

* remove unused argument in call to EquilibriumComparisonPlotter class in _minimal_current

* Add xz_plot_setup to plot_tools.py

* working on updating plot

* remove blank line after docstring

* trying to update colorbar (from stackexchange)

* colorbar updating instead of multiple colorbars

* add # noqa: BLE001 to Exception

* update typing

* pre-commit changes

* fix from github comment

* 🚨 Few missing imports

---------

Co-authored-by: james <james.cook1@ukaea.uk>
  • Loading branch information
clmould and je-cook committed Aug 29, 2024
1 parent cc1ec88 commit 6f6602a
Show file tree
Hide file tree
Showing 6 changed files with 521 additions and 19 deletions.
35 changes: 35 additions & 0 deletions bluemira/equilibria/diagnostics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# SPDX-FileCopyrightText: 2021-present M. Coleman, J. Cook, F. Franza
# SPDX-FileCopyrightText: 2021-present I.A. Maione, S. McIntosh
# SPDX-FileCopyrightText: 2021-present J. Morris, D. Short
#
# SPDX-License-Identifier: LGPL-2.1-or-later
"""
Diagnostic options for use in the equilibria module.
"""

from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from os import PathLike

from bluemira.equilibria.equilibrium import Equilibrium


@dataclass
class EqDiagnosticOptions:
"""Diagnostic plotting options for Equilibrium."""

reference_eq: Equilibrium
psi_diff: bool = False
split_psi_plots: bool = False
plot_name: str = "default_0"
folder: str | PathLike | None = None
save: bool = False

def __post_init__(self):
"""Post init folder definition"""
self.folder = Path.cwd() if self.folder is None else Path(self.folder)
7 changes: 6 additions & 1 deletion bluemira/equilibria/equilibrium.py
Original file line number Diff line number Diff line change
Expand Up @@ -1891,7 +1891,12 @@ def plot(
"""
Plot the equilibrium magnetic flux surfaces object onto `ax`.
"""
return EquilibriumPlotter(self, ax, plasma=plasma, show_ox=show_ox)
return EquilibriumPlotter(
self,
ax,
plasma=plasma,
show_ox=show_ox,
)

def plot_field(self, ax: Axes | None = None, *, show_ox: bool = True):
"""
Expand Down
24 changes: 23 additions & 1 deletion bluemira/equilibria/optimisation/problem/_minimal_current.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@
#
# SPDX-License-Identifier: LGPL-2.1-or-later

from copy import deepcopy

import numpy as np
import numpy.typing as npt

from bluemira.equilibria.coils import CoilSet
from bluemira.equilibria.diagnostics import EqDiagnosticOptions
from bluemira.equilibria.equilibrium import Equilibrium
from bluemira.equilibria.optimisation.constraints import UpdateableConstraint
from bluemira.equilibria.optimisation.objectives import CoilCurrentsObjective
from bluemira.equilibria.optimisation.problem.base import (
CoilsetOptimisationProblem,
CoilsetOptimiserResult,
)
from bluemira.equilibria.plotting import EquilibriumComparisonPlotter
from bluemira.optimisation import Algorithm, AlgorithmType, optimise


Expand All @@ -41,6 +44,10 @@ class MinimalCurrentCOP(CoilsetOptimisationProblem):
Otherwise, the parameters can be founded by digging through the source code.
constraints:
List of optimisation constraints to apply to the optimisation problem
plot:
Whether or not to plot
diag_ops:
Diagnostic plotting options for Equilibrium
"""

def __init__(
Expand All @@ -52,6 +59,9 @@ def __init__(
opt_conditions: dict[str, float | int] | None = None,
opt_parameters: dict[str, float] | None = None,
constraints: list[UpdateableConstraint] | None = None,
*,
plot: bool | None = False,
diag_ops: EqDiagnosticOptions | None = None,
):
self.coilset = coilset
self.eq = eq
Expand All @@ -61,6 +71,16 @@ def __init__(
self.opt_parameters = opt_parameters
self._constraints = [] if constraints is None else constraints

self.plotting_enabled = plot

if self.plotting_enabled:
self.comp_plot = EquilibriumComparisonPlotter(
equilibrium=self.eq,
diag_ops=EqDiagnosticOptions(reference_eq=deepcopy(self.eq))
if diag_ops is None
else diag_ops,
)

def optimise(
self, x0: npt.NDArray | None = None, *, fixed_coils: bool = True
) -> CoilsetOptimiserResult:
Expand Down Expand Up @@ -99,11 +119,13 @@ def optimise(
eq_constraints=eq_constraints,
ineq_constraints=ineq_constraints,
)

opt_currents = opt_result.x
self.coilset.set_optimisation_state(
opt_currents=opt_currents,
current_scale=self.scale,
)

if self.plotting_enabled:
self.comp_plot.update_plot()

return CoilsetOptimiserResult.from_opt_result(self.coilset, opt_result)
Loading

0 comments on commit 6f6602a

Please sign in to comment.