Source code for struphy.geometry.domains.desc_unit.desc_unit
from struphy.geometry.base import Spline, interp_mapping
[docs]
class DESCunit(Spline):
r"""The mapping :math:`(\rho, \theta,\zeta) \mapsto (X, Y, Z)` to Cartesian coordinates computed by the `DESC MHD equilibrium code
<https://desc-docs.readthedocs.io/en/latest/theory_general.html#flux-coordinates>`_.
.. image:: ../../pics/mappings/desc.png
Parameters
----------
desc_equil : struphy.fields_background.equils.DESCequilibrium
DESC MHD equilibrium object.
"""
def __init__(self, desc_equil=None):
from struphy.fields_background.equils import DESCequilibrium
if desc_equil is None:
desc_equil = DESCequilibrium()
else:
assert isinstance(desc_equil, DESCequilibrium)
num_elements = desc_equil.params["num_elements"]
degree = desc_equil.params["degree"]
if desc_equil.eq.NFP > 1 and desc_equil.use_nfp:
spl_kind = (False, True, False)
else:
spl_kind = (False, True, True)
_rmin = desc_equil.params["rmin"]
nfp = desc_equil.eq.NFP
if not desc_equil.use_nfp:
nfp = 1
# project mapping to splines
def X(e1, e2, e3):
return desc_equil.desc_eval("X", e1, e2, e3, nfp=nfp)
def Y(e1, e2, e3):
return desc_equil.desc_eval("Y", e1, e2, e3, nfp=nfp)
def Z(e1, e2, e3):
return desc_equil.desc_eval("Z", e1, e2, e3, nfp=nfp)
cx, cy, cz = interp_mapping(num_elements, degree, spl_kind, X, Y, Z)
super().__init__(num_elements=num_elements, degree=degree, spl_kind=spl_kind, cx=cx, cy=cy, cz=cz)