Source code for idstools.compute.pf_passive
"""
This module provides compute functions and classes for pf_passive 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 PfPassiveCompute:
"""This class provides compute functions for pf_passive ids.
Attributes:
ids (object): The PF passive IDS (Integrated Data Structure) object containing
passive poloidal field loop data including loop geometry, mechanical properties,
and electromagnetic response parameters.
"""
def __init__(self, ids: object):
"""Initialization PfPassiveCompute object.
Args:
ids : pf_passive ids object
"""
self.ids = ids
[docs] def get_pf_passive_loops(self, select=":") -> dict:
"""
Retrieves passive loops information from the IDS (Integrated Data Structure).
This method processes the loops and their elements, extracting relevant information
such as identifiers, names, resistances, resistivities, and geometrical coordinates.
It returns a dictionary where each key is the loop index and the value is another
dictionary containing loop details and its elements.
Returns:
dict: A dictionary containing loop information and their elements.
Returns None if no valid loops are found or if the geometry type is not implemented.
Raises:
None
Logs:
Warnings are logged if:
- The geometry type is not implemented.
- Any loop has no elements.
- The entire loop structure is empty.
"""
loop_arrays = list(self.ids.loop)
if select is not None:
loop_arrays = get_slice_from_array(loop_arrays, select)
loops = {}
for loop_index, loop in enumerate(loop_arrays):
loop_info = {}
if hasattr(loop, "identifier"):
loop_info["identifier"] = loop.identifier
else:
loop_info["identifier"] = ""
loop_info["name"] = loop.name
loop_info["resistance"] = loop.resistance
loop_info["resistivity"] = loop.resistivity
dict_elements = {}
for element_index, element in enumerate(loop.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
else:
dict_element["r"] = element.geometry.outline.r
dict_element["z"] = element.geometry.outline.z
dict_elements[element_index] = dict_element
loop_info["elements"] = dict_elements
if not dict_elements:
logger.warning(f"loop index {loop_index} : pf_passive.loop.element.geometry.thick_line is empty")
loops[loop_index] = loop_info
if not loops:
logger.warning("pf_passive.loop is empty")
return None
return loops