Source code for idstools.compute.pf_active
"""
This module provides compute functions and classes for pf_active ids data
`refer data dictionary <https://imas-data-dictionary.readthedocs.io/en/latest/>`_.
"""
import logging
from idstools.utils.utility_functions import get_slice_from_array
logger = logging.getLogger("module")
[docs]class PfActiveCompute:
"""This class provides compute functions for pf_active ids.
Attributes:
ids (object): The PF active IDS (Integrated Data Structure) object containing
active poloidal field coil data including coil geometry, electrical properties,
and control information.
"""
def __init__(self, ids: object):
"""Initialization PfActiveCompute object.
Args:
ids : pf_active ids object
"""
self.ids = ids
[docs] def get_active_pf_coils(self, select=":") -> dict:
"""
This function returns a dictionary of active PF coils and their corresponding elements dimensions and
center coordinates.
Returns:
a dictionary containing information about the active PF (poloidal field) coils. The keys of the dictionary
are the identifiers of the coils, and the values are dictionaries containing information about the
individual elements of each coil. The information about each element includes its horizontal width,
vertical height, and center coordinates.
Examples:
.. code-block:: python
import pprint
import imas
from idstools.compute.pf_active import PfActiveCompute
from idstools.view.common import PlotCanvas
connection = imas.DBEntry("imas:mdsplus?user=public;pulse=135005;run=4;database=ITER;version=3", "r")
idsObj = connection.get('pf_active')
computeObj = PfActiveCompute(idsObj)
result=computeObj.get_active_pf_coils()
pprint.pprint(result)
"""
coil_arrays = list(self.ids.coil)
if select is not None:
coil_arrays = get_slice_from_array(coil_arrays, select)
coils = {}
for coil_index, coil in enumerate(coil_arrays):
coil_info = {}
if hasattr(coil, "identifier"):
coil_info["identifier"] = coil.identifier
else:
coil_info["identifier"] = ""
coil_info["name"] = coil.name
coil_info["resistance"] = coil.resistance
# Get elements
dict_elements = {}
for element_index, element in enumerate(coil.element):
if hasattr(element, "identifier"):
element_identifier = element.identifier
else:
element_identifier = ""
dict_element = {}
dict_element["name"] = element.name
dict_element["identifier"] = element_identifier
dict_element["geometry_type"] = element.geometry.geometry_type
if element.geometry.geometry_type == 1: # outline
dict_element["r"] = element.geometry.outline.r
dict_element["z"] = element.geometry.outline.z
elif element.geometry.geometry_type == 2: # rectangle
dict_element["r"] = element.geometry.rectangle.r
dict_element["z"] = element.geometry.rectangle.z
dict_element["width"] = element.geometry.rectangle.width
dict_element["height"] = element.geometry.rectangle.height
elif element.geometry.geometry_type == 3: # oblique
dict_element["r"] = element.geometry.oblique.r
dict_element["z"] = element.geometry.oblique.z
dict_element["length_alpha"] = element.geometry.oblique.length_alpha
dict_element["length_beta"] = element.geometry.oblique.length_beta
dict_element["alpha"] = element.geometry.oblique.alpha
dict_element["beta"] = element.geometry.oblique.beta
elif element.geometry.geometry_type == 4: # arcs_of_circle
dict_element["r"] = element.geometry.arcs_of_circle.r
dict_element["z"] = element.geometry.arcs_of_circle.z
dict_element["curvature_radii"] = element.geometry.arcs_of_circle.curvature_radii
elif element.geometry.geometry_type == 5: # annulus
dict_element["r"] = element.geometry.annulus.r
dict_element["z"] = element.geometry.annulus.z
dict_element["radius_inner"] = element.geometry.annulus.radius_inner
dict_element["radius_outer"] = element.geometry.annulus.radius_outer
elif element.geometry.geometry_type == 6: # thick_line
dict_element["r1"] = element.geometry.thick_line.first_point.r
dict_element["z1"] = element.geometry.thick_line.first_point.z
dict_element["r2"] = element.geometry.thick_line.second_point.r
dict_element["z2"] = element.geometry.thick_line.second_point.z
dict_element["thickness"] = element.geometry.thick_line.thickness
dict_elements[element_index] = dict_element
coil_info["elements"] = dict_elements
if not dict_elements:
logger.warning(f"Coil index {coil_index} : pf_active.coil.element.geometry.rectangle is empty")
coils[coil_index] = coil_info
if not coils:
logger.warning("pf_active.coil is empty")
return coils