Source code for freegs.plotting

"""
Plotting using matplotlib

Copyright 2016 Ben Dudson, University of York. Email: benjamin.dudson@york.ac.uk

This file is part of FreeGS.

FreeGS is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

FreeGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with FreeGS.  If not, see <http://www.gnu.org/licenses/>.

"""

from numpy import amax, amin, linspace

from . import critical


[docs] def plotCoils(coils, axis=None): import matplotlib.pyplot as plt if axis is None: fig = plt.figure() axis = fig.add_subplot(111) return axis
[docs] def plotConstraints(control, axis=None, show=True): """ Plots constraints used for coil current control axis - Specify the axis on which to plot show - Call matplotlib.pyplot.show() before returning """ import matplotlib.pyplot as plt if axis is None: fig = plt.figure() axis = fig.add_subplot(111) # Locations of the X-points for r, z in control.xpoints: axis.plot(r, z, "bx") if control.xpoints: axis.plot([], [], "bx", label="X-point constraints") # Isoflux surfaces for r1, z1, r2, z2 in control.isoflux: axis.plot([r1, r2], [z1, z2], ":b^") if control.isoflux: axis.plot([], [], ":b^", label="Isoflux constraints") if show: plt.legend() plt.show() return axis
[docs] def plotEquilibrium( eq, axis=None, show=True, oxpoints=True, wall=True, plot_sensors=True ): """ Plot the equilibrium flux surfaces axis - Specify the axis on which to plot show - Call matplotlib.pyplot.show() before returning oxpoints - Plot X points as red circles, O points as green circles wall - Plot the wall (limiter) sensors - Plot the sensors """ import matplotlib.pyplot as plt R = eq.R Z = eq.Z psi = eq.psi() if axis is None: fig = plt.figure() axis = fig.add_subplot(111) levels = linspace(amin(psi), amax(psi), 100) axis.contour(R, Z, psi, levels=levels) axis.set_aspect("equal") axis.set_xlabel("Major radius [m]") axis.set_ylabel("Height [m]") if oxpoints: # Add O- and X-points opt, xpt = critical.find_critical(eq.R, eq.Z, psi) for r, z, _ in xpt: axis.plot(r, z, "rx") for r, z, _ in opt: axis.plot(r, z, "go") if xpt: psi_bndry = eq.psi_bndry # xpt[0][2] axis.contour(eq.R, eq.Z, psi, levels=[psi_bndry], colors="r") # Add legend axis.plot([], [], "rx", label="X-points") axis.plot([], [], "r", label="Separatrix") if opt: axis.plot([], [], "go", label="O-points") if wall and eq.tokamak.wall and len(eq.tokamak.wall.R): axis.plot( [*list(eq.tokamak.wall.R), eq.tokamak.wall.R[0]], [*list(eq.tokamak.wall.Z), eq.tokamak.wall.Z[0]], "k", ) if plot_sensors and eq.tokamak.sensors is not None: for sensor in eq.tokamak.sensors: sensor.plot(axis) axis.plot([], [], "b", label="Rogowski Coil") axis.plot([], [], "mo", label="Poloidal Field Sensor") axis.plot([], [], "ro", label="Flux Loop Sensor") if show: plt.legend() plt.show() return axis