# Source code for pleque.utils.flux_expansions

import numpy as np

import pleque

[docs]def incidence_angle_sin(coords: 'pleque.Coordinates', vecs):
"""

:param coords: Coordinate object (of length N_vecs)of a line in the space on
which the incidence angle is evaluated.
:param vecs: array (3, N_vecs) vectors in (R, Z, phi) space.
:return: array of sines of angles of incidence. I.e. cosine of the angle between the normal
to the line (in the poloidal plane) and the corresponding vector.
"""

normal_vecs = coords.normal_vector()
vec_norms = vecs / np.linalg.norm(vecs, axis=0)

inccos = np.einsum('ij,ij->j', vec_norms, normal_vecs)

return inccos

[docs]def impact_angle_sin(coords: 'pleque.Coordinates'):
"""
Impact angle calculation - dot product of PFC norm and local magnetic field direction.
Internally uses incidence_angle_sin function where vecs are replaced by the vector
of the magnetic field.

:return: array of impact angles cosines
"""

bvec = coords._eq.Bvec_norm(coords)

return incidence_angle_sin(coords, bvec)

[docs]def impact_angle_cos_pol_projection(coords: 'pleque.Coordinates'):
"""
Impact angle calculation - dot product of PFC norm and local magnetic field direction
poloidal projection only.
Internally uses incidence_angle_sin function where vecs are replaced by the vector
of the poloidal magnetic field (Bphi = 0).

:return: array of impact angles
"""

bvec = coords._eq.Bvec(coords)
bvec[2, :] = 0  # set Z component to be zero

return incidence_angle_sin(coords, bvec)

[docs]def poloidal_mag_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Poloidal magnetic flux expansion coefficient.**

**Definition:**

.. math::
f_\mathrm{pol} = \frac{\Delta r^\mathrm{t}}{\Delta r^\mathrm{u}} =
\frac{B_\theta^\mathrm{u} R^\mathrm{u}}{B_\theta^\mathrm{t} R^\mathrm{t}}

**Typical usage:**

*Poloidal magnetic flux expansion coefficient* is typically used for :math:\lambda scaling
in plane perpendicular to the poloidal component of the magnetic field.

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

B_midplane = equilibrium.B_pol(r=coords.r_mid, theta=np.zeros_like(coords.r_mid), grid=False)
R_mid = equilibrium.magnetic_axis.R[0] + coords.r_mid
B_coords = equilibrium.B_pol(coords)
R_coords = coords.R

return B_midplane * R_mid / (B_coords * R_coords)

[docs]def effective_poloidal_mag_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Effective poloidal magnetic flux expansion coefficient**

**Definition:**

.. math::
f_\mathrm{pol, eff} = \frac{B_\theta^\mathrm{u} R^\mathrm{u}}{B_\theta^\mathrm{t} R^\mathrm{t}}
\frac{1}{\sin \beta} = \frac{f_\mathrm{pol}}{\sin \beta}

Where :math:\beta is inclination angle of the poloidal magnetic field and the target plane.

**Typical usage:**

*Effective magnetic flux expansion coefficient* is typically used for :math:\lambda scaling
of the target :math:\lambda with respect to the upstream value.

.. math::
\lambda^\mathrm{t} = \lambda_q^\mathrm{u} f_{\mathrm{pol, eff}}

This coefficient can be also used to calculate peak target heat flux from the total power through
LCFS if the perpendicular diffusion is neglected. Then for the peak value stays

.. math::
q_{\perp, \mathrm{peak}} = \frac{P_\mathrm{div}}{2 \pi R^\mathrm{t} \lambda_q^\mathrm{u}}
\frac{1}{f_\mathrm{pol, eff}}

Where :math:P_\mathrm{div} is total power to outer strike point and $\lambda_q^\mathrm{u}$
is e-folding length on the outer midplane.

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

return poloidal_mag_flux_exp_coef(equilibrium, coords) \
/ np.abs(coords.impact_angle_sin_pol_projection())

[docs]def poloidal_heat_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Poloidal heat flux expansion coefficient**

**Definition:**

.. math::
f_\mathrm{pol, heat} = \frac{B_\theta^\mathrm{u}}{B_\theta^\mathrm{t}}

**Typical usage:**
*Poloidal heat flux expansion coefficient* is typically used to scale poloidal heat flux
(heat flux projected along poloidal magnetic field)  along the magnetic field line.

.. math::
q_\theta^\mathrm{t} = \frac{q_\theta^\mathrm{u}}{f_{\mathrm{pol, heat}}}

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

B_midplane = equilibrium.B_pol(r=coords.r_mid, theta=np.zeros_like(coords.r_mid), grid=False)
B_coords = equilibrium.B_pol(coords)

return B_midplane / B_coords

[docs]def effective_poloidal_heat_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Effective poloidal heat flux expansion coefficient**

**Definition:**

.. math::
f_\mathrm{pol, heat, eff} = \frac{B_\theta^\mathrm{u}}{B_\theta^\mathrm{t}}
\frac{1}{\sin \beta} = \frac{f_\mathrm{pol}}{\sin \beta}

Where :math:\beta is inclination angle of the poloidal magnetic field and the target plane.

**Typical usage:**

*Effective poloidal heat flux expansion coefficient* is typically used scale upstream poloidal
heat flux to the target plane.

.. math::
q_\perp^\mathrm{t} = \frac{q_\theta^\mathrm{u}}{f_{\mathrm{pol, heat, eff}}}

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

return poloidal_heat_flux_exp_coef(equilibrium, coords) \
/ np.abs(coords.impact_angle_sin_pol_projection())

[docs]def parallel_heat_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Parallel heat flux expansion coefficient**

**Definition:**

.. math::
f_\parallel= \frac{B^\mathrm{u}}{B^\mathrm{t}}

**Typical usage:**

*Parallel heat flux expansion coefficient* is typically used to scale total upstream heat flux
parallel to the magnetic field along the magnetic field lines.

.. math::
q_\parallel^\mathrm{t} = \frac{q_\parallel^\mathrm{u}}{f_\parallel}

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

B_midplane = equilibrium.B_abs(r=coords.r_mid, theta=np.zeros_like(coords.r_mid), grid=False)
B_coords = equilibrium.B_abs(coords)

return B_midplane / B_coords

[docs]def total_heat_flux_exp_coef(equilibrium: 'pleque.Equilibrium', coords: 'pleque.Coordinates'):
r"""
**Total heat flux expansion coefficient**

**Definition:**

.. math::
f_\mathrm{tot} = \frac{B^\mathrm{u}}{B^\mathrm{t}} \frac{1}{\sin \alpha} =
\frac{f_\parallel}{\sin \alpha}

Where :math:\alpha is an inclination angle of the total magnetic field and the target plane.

.. important:: :math:\alpha is an inclination angle of the total magnetic field to the
target plate. Whereas :math:\beta is an inclination of poloidal components
of the magnetic field to the target plate.

**Typical usage:**

*Total heat flux expansion coefficient* is typically used to project total upstream heat flux
parallel to the magnetic field to the target plane.

.. math::
q_\perp^\mathrm{t} = \frac{q_\parallel^\mathrm{u}}{f_{\mathrm{tot}}}

:param equilibrium: Instance of Equilibrium.
:param coords: Coordinates where the coefficient is evaluated.
:return:
"""

return parallel_heat_flux_exp_coef(equilibrium, coords) \
/ np.abs(coords.impact_angle_sin())