Source code for idstools.compute.tf
"""
This module provides compute functions and classes for tf ids data
`refer data dictionary <https://imas-data-dictionary.readthedocs.io/en/latest/>`_.
"""
import logging
import math
import numpy as np
from idstools.compute.common import get_conductor_outline
from idstools.utils.utility_functions import get_slice_from_array
logger = logging.getLogger("module")
[docs]class TFCompute:
"""This class provides compute functions for tf ids.
Attributes:
ids (object): The toroidal field (TF) IDS (Integrated Data Structure) object
containing toroidal field coil data including coil geometry, conductors,
electrical properties, and mechanical support information.
"""
def __init__(self, ids: object):
"""Initialization TFCompute object.
Args:
ids : tf ids object
"""
self.ids = ids
[docs] def get_tf_coils(self, select_coil=":", select_conductor=":") -> dict:
"""
Retrieve information about the Toroidal Field (TF) coils and their conductors.
Args:
select_coil (str, optional): A string representing the selection of coils.
Defaults to ":" which selects all coils.
select_conductor (str, optional): A string representing the selection of conductors.
Defaults to ":" which selects all conductors.
Returns:
dict: A dictionary containing information about the selected TF coils and their conductors.
If no coils are found, a warning is logged and None is returned.
"""
coil_arrays = list(self.ids.coil)
if select_coil is not None:
coil_arrays = get_slice_from_array(coil_arrays, select_coil)
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
coil_info["turns"] = coil.turns
conductor_arrays = list(coil.conductor)
if select_conductor is not None:
conductor_arrays = get_slice_from_array(conductor_arrays, select_conductor)
conductors = {}
for conductor_index, conductor in enumerate(conductor_arrays):
conductor_info = {}
conductor_info["elements"] = conductor.elements
conductor_info["cross_section"] = conductor.cross_section
# Add outline only for line segment elements with valid cross-section
if np.all(conductor.elements.types == 1) and len(conductor.cross_section) == 1:
n = len(conductor.elements.start_points.r)
nskip = max(1, math.ceil(n / 180))
conductor_info["outline"] = get_conductor_outline(conductor, skip=nskip)
conductors[conductor_index] = conductor_info
coil_info["conductors"] = conductors
coils[coil_index] = coil_info
if not coils:
logger.warning("tf.coil is empty")
return None
return coils