Skip to content

scrape_off_layer

Module for calculating plasma scrape off layer physics

ScrapeOffLayer

Bases: Model

Model for calculating plasma scrape off layer physics.

Source code in process/models/physics/scrape_off_layer.py
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
class ScrapeOffLayer(Model):
    """Model for calculating plasma scrape off layer physics."""

    def __init__(self):
        self.outfile = constants.NOUT
        self.mfile = constants.MFILE

    def run(self):
        """Calculate the scrape off layer physics and update the physics variables."""
        self.data.physics.len_plasma_sol_eich13_power_decay = self.calculate_eich2013_sol_power_decay_length(  # noqa: E501
            p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
            rmajor=self.data.physics.rmajor,
            b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
            aspect=self.data.physics.aspect,
        )

        self.data.physics.len_plasma_sol_mast14_power_decay_1 = self.calculate_mast2014_sol_power_decay_length_1(  # noqa: E501
            p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
            b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
        )

        # NOTE: converting plasma_current from A to MA
        self.data.physics.len_plasma_sol_mast14_power_decay_2 = (
            self.calculate_mast2014_sol_power_decay_length_2(
                p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
                cur_plasma_ma=self.data.physics.plasma_current / 1e6,
            )
        )

        self.data.physics.a_plasma_outboard_sol_eich13_parallel = self.calculate_upstream_sol_outboard_parallel_area(  # noqa: E501
            rmajor=self.data.physics.rmajor,
            rminor=self.data.physics.rminor,
            len_plasma_sol_power_decay=self.data.physics.len_plasma_sol_eich13_power_decay,
            b_plasma_outboard_total=self.data.physics.b_plasma_outboard_total,
            b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
        )

        self.data.physics.pflux_plasma_outboard_sol_eich13_parallel_mw = (
            self.data.physics.p_plasma_separatrix_mw
            / self.data.physics.a_plasma_outboard_sol_eich13_parallel
        )

    def output(self) -> None:
        """Output plasma scrape off layer physics information."""
        po.oheadr(self.outfile, "Plasma Scrape Off Layer")

        po.osubhd(self.outfile, "Power Decay Lengths (λ_q):")

        po.ovarre(
            self.outfile,
            "Eich 2013 SOL power decay length (λ_q) [m]",
            "(len_plasma_sol_eich13_power_decay)",
            self.data.physics.len_plasma_sol_eich13_power_decay,
        )
        po.ovarre(
            self.outfile,
            "MAST 2014 SOL power decay length 1 (λ_q) [m]",
            "(len_plasma_sol_mast14_power_decay_1)",
            self.data.physics.len_plasma_sol_mast14_power_decay_1,
        )
        po.ovarre(
            self.outfile,
            "MAST 2014 SOL power decay length 2 (λ_q) [m]",
            "(len_plasma_sol_mast14_power_decay_2)",
            self.data.physics.len_plasma_sol_mast14_power_decay_2,
        )
        po.oblnkl(self.outfile)
        po.ocmmnt(self.outfile, "----------------------------")

        po.osubhd(self.outfile, "Upstream Outboard SOL Parallel Area and Power Flux:")
        po.ovarre(
            self.outfile,
            "Plasma outboard midplane Eich 2013 SOL parallel area (Aₗₗ,ᵤ) [m²]",
            "(a_plasma_outboard_sol_eich13_parallel)",
            self.data.physics.a_plasma_outboard_sol_eich13_parallel,
        )
        po.ovarre(
            self.outfile,
            "Plasma outboard midplane Eich 2013 SOL parallel power flux (qₗₗ,ᵤ) [MW/m²]",
            "(pflux_plasma_outboard_sol_eich13_parallel_mw)",
            self.data.physics.pflux_plasma_outboard_sol_eich13_parallel_mw,
        )

    @staticmethod
    def calculate_eich2013_sol_power_decay_length(
        p_plasma_separatrix_mw: float,
        rmajor: float,
        b_plasma_surface_poloidal_average: float,
        aspect: float,
    ) -> float:
        """Calculate the Eich 2013 SOL power decay length (λ_q).

        Parameters
        ----------
        p_plasma_separatrix_mw : float
            Power crossing the separatrix (Pₛₑₚ) [MW]
        rmajor : float
            Major radius of the plasma (R₀) [m]
        b_plasma_surface_poloidal_average : float
            Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]
        aspect : float
            Aspect ratio of the plasma (A)

        Returns
        -------
        float
            Eich 2013 SOL power decay length (λ_q) [m]

        Notes
        -----
        - The paper states that the poloidal field terms is for the outer midplane
        Bₚₒₗ(a), we are using the outer surface average

        References
        ----------
        [1] T. Eich et al., “Scaling of the tokamak near the scrape-off layer H-mode
        power width and implications for ITER,” Nuclear Fusion, vol. 53, no. 9,
        p. 093031, Aug. 2013, doi: 10.1088/0029-5515/53/9/093031.

        """
        return (
            1.35e-3
            * p_plasma_separatrix_mw**-0.02
            * rmajor**0.04
            * b_plasma_surface_poloidal_average**-0.92
            * aspect**-0.42
        )

    @staticmethod
    def calculate_mast2014_sol_power_decay_length_1(
        p_plasma_separatrix_mw: float,
        b_plasma_surface_poloidal_average: float,
    ) -> float:
        """Calculate the MAST 2014 SOL power decay length (λ_q).

        Parameters
        ----------
        p_plasma_separatrix_mw : float
            Power crossing the separatrix (Pₛₑₚ) [MW]
        b_plasma_surface_poloidal_average : float
            Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

        Returns
        -------
        float
            MAST 2014 SOL power decay length (λ_q) [m]

        Notes
        -----
        - The paper states that the poloidal field terms is for the outer midplane
        Bₚₒₗ(a), we are using the outer surface average

        References
        ----------
        [1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during
        inter-ELM H modes on MAST as measured by infrared thermography,”
        Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014,
        doi: 10.1088/0741-3335/56/5/055008.

        """
        return (
            1.84e-3
            * p_plasma_separatrix_mw**0.18
            * b_plasma_surface_poloidal_average**-0.68
        )

    @staticmethod
    def calculate_mast2014_sol_power_decay_length_2(
        p_plasma_separatrix_mw: float,
        cur_plasma_ma: float,
    ) -> float:
        """Calculate the MAST 2014 SOL power decay length (λ_q).

        Parameters
        ----------
        p_plasma_separatrix_mw : float
            Power crossing the separatrix (Pₛₑₚ) [MW]
        cur_plasma_ma : float
            Plasma current (Iₚ) [MA]

        Returns
        -------
        float
            MAST 2014 SOL power decay length (λ_q) [m]


        References
        ----------
        [1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during
        inter-ELM H modes on MAST as measured by infrared thermography,”
        Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014,
        doi: 10.1088/0741-3335/56/5/055008.

        """
        return 4.57e-3 * p_plasma_separatrix_mw**0.22 * cur_plasma_ma**-0.64

    @staticmethod
    def calculate_upstream_sol_outboard_parallel_area(
        rmajor: float,
        rminor: float,
        len_plasma_sol_power_decay: float,
        b_plasma_outboard_total: float,
        b_plasma_surface_poloidal_average: float,
    ) -> float:
        """Calculate the outboard SOL upstream parallel area (Aₗₗ,ᵤ) [m²].

        Parameters
        ----------
        rmajor : float
            Major radius of the plasma (R₀) [m]
        rminor : float
            Minor radius of the plasma (a) [m]
        len_plasma_sol_power_decay : float
            Power decay length (λ_q) [m]
        b_plasma_outboard_total : float
            Total magnetic field at the plasma outboard (Bₜₒₜ(R₀+a)) [T]
        b_plasma_surface_poloidal_average : float
            Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

        Returns
        -------
        float
            Upstream outboard SOL parallel area (Aₗₗ,ᵤ) [m²]

        References
        ----------
        [1] P. C. Stangeby, “The Plasma Boundary of Magnetic Fusion Devices,” Jan. 2000,
        doi: 10.1201/9780367801489.

        [2] S. S. Henderson et al., “An overview of the STEP divertor design and the
        simple models driving the plasma exhaust scenario,” Nuclear Fusion, vol. 65,
        no. 1, pp. 016033-016033, Nov. 2024, doi: 10.1088/1741-4326/ad93e7.

        """
        return (
            (2 * np.pi * (rmajor + rminor))
            * len_plasma_sol_power_decay
            * (b_plasma_surface_poloidal_average / b_plasma_outboard_total)
        )

outfile = constants.NOUT instance-attribute

mfile = constants.MFILE instance-attribute

run()

Calculate the scrape off layer physics and update the physics variables.

Source code in process/models/physics/scrape_off_layer.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def run(self):
    """Calculate the scrape off layer physics and update the physics variables."""
    self.data.physics.len_plasma_sol_eich13_power_decay = self.calculate_eich2013_sol_power_decay_length(  # noqa: E501
        p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
        rmajor=self.data.physics.rmajor,
        b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
        aspect=self.data.physics.aspect,
    )

    self.data.physics.len_plasma_sol_mast14_power_decay_1 = self.calculate_mast2014_sol_power_decay_length_1(  # noqa: E501
        p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
        b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
    )

    # NOTE: converting plasma_current from A to MA
    self.data.physics.len_plasma_sol_mast14_power_decay_2 = (
        self.calculate_mast2014_sol_power_decay_length_2(
            p_plasma_separatrix_mw=self.data.physics.p_plasma_separatrix_mw,
            cur_plasma_ma=self.data.physics.plasma_current / 1e6,
        )
    )

    self.data.physics.a_plasma_outboard_sol_eich13_parallel = self.calculate_upstream_sol_outboard_parallel_area(  # noqa: E501
        rmajor=self.data.physics.rmajor,
        rminor=self.data.physics.rminor,
        len_plasma_sol_power_decay=self.data.physics.len_plasma_sol_eich13_power_decay,
        b_plasma_outboard_total=self.data.physics.b_plasma_outboard_total,
        b_plasma_surface_poloidal_average=self.data.physics.b_plasma_surface_poloidal_average,
    )

    self.data.physics.pflux_plasma_outboard_sol_eich13_parallel_mw = (
        self.data.physics.p_plasma_separatrix_mw
        / self.data.physics.a_plasma_outboard_sol_eich13_parallel
    )

output()

Output plasma scrape off layer physics information.

Source code in process/models/physics/scrape_off_layer.py
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
def output(self) -> None:
    """Output plasma scrape off layer physics information."""
    po.oheadr(self.outfile, "Plasma Scrape Off Layer")

    po.osubhd(self.outfile, "Power Decay Lengths (λ_q):")

    po.ovarre(
        self.outfile,
        "Eich 2013 SOL power decay length (λ_q) [m]",
        "(len_plasma_sol_eich13_power_decay)",
        self.data.physics.len_plasma_sol_eich13_power_decay,
    )
    po.ovarre(
        self.outfile,
        "MAST 2014 SOL power decay length 1 (λ_q) [m]",
        "(len_plasma_sol_mast14_power_decay_1)",
        self.data.physics.len_plasma_sol_mast14_power_decay_1,
    )
    po.ovarre(
        self.outfile,
        "MAST 2014 SOL power decay length 2 (λ_q) [m]",
        "(len_plasma_sol_mast14_power_decay_2)",
        self.data.physics.len_plasma_sol_mast14_power_decay_2,
    )
    po.oblnkl(self.outfile)
    po.ocmmnt(self.outfile, "----------------------------")

    po.osubhd(self.outfile, "Upstream Outboard SOL Parallel Area and Power Flux:")
    po.ovarre(
        self.outfile,
        "Plasma outboard midplane Eich 2013 SOL parallel area (Aₗₗ,ᵤ) [m²]",
        "(a_plasma_outboard_sol_eich13_parallel)",
        self.data.physics.a_plasma_outboard_sol_eich13_parallel,
    )
    po.ovarre(
        self.outfile,
        "Plasma outboard midplane Eich 2013 SOL parallel power flux (qₗₗ,ᵤ) [MW/m²]",
        "(pflux_plasma_outboard_sol_eich13_parallel_mw)",
        self.data.physics.pflux_plasma_outboard_sol_eich13_parallel_mw,
    )

calculate_eich2013_sol_power_decay_length(p_plasma_separatrix_mw, rmajor, b_plasma_surface_poloidal_average, aspect) staticmethod

Calculate the Eich 2013 SOL power decay length (λ_q).

Parameters:

Name Type Description Default
p_plasma_separatrix_mw float

Power crossing the separatrix (Pₛₑₚ) [MW]

required
rmajor float

Major radius of the plasma (R₀) [m]

required
b_plasma_surface_poloidal_average float

Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

required
aspect float

Aspect ratio of the plasma (A)

required

Returns:

Type Description
float

Eich 2013 SOL power decay length (λ_q) [m]

Notes
  • The paper states that the poloidal field terms is for the outer midplane Bₚₒₗ(a), we are using the outer surface average
References

[1] T. Eich et al., “Scaling of the tokamak near the scrape-off layer H-mode power width and implications for ITER,” Nuclear Fusion, vol. 53, no. 9, p. 093031, Aug. 2013, doi: 10.1088/0029-5515/53/9/093031.

Source code in process/models/physics/scrape_off_layer.py
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
@staticmethod
def calculate_eich2013_sol_power_decay_length(
    p_plasma_separatrix_mw: float,
    rmajor: float,
    b_plasma_surface_poloidal_average: float,
    aspect: float,
) -> float:
    """Calculate the Eich 2013 SOL power decay length (λ_q).

    Parameters
    ----------
    p_plasma_separatrix_mw : float
        Power crossing the separatrix (Pₛₑₚ) [MW]
    rmajor : float
        Major radius of the plasma (R₀) [m]
    b_plasma_surface_poloidal_average : float
        Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]
    aspect : float
        Aspect ratio of the plasma (A)

    Returns
    -------
    float
        Eich 2013 SOL power decay length (λ_q) [m]

    Notes
    -----
    - The paper states that the poloidal field terms is for the outer midplane
    Bₚₒₗ(a), we are using the outer surface average

    References
    ----------
    [1] T. Eich et al., “Scaling of the tokamak near the scrape-off layer H-mode
    power width and implications for ITER,” Nuclear Fusion, vol. 53, no. 9,
    p. 093031, Aug. 2013, doi: 10.1088/0029-5515/53/9/093031.

    """
    return (
        1.35e-3
        * p_plasma_separatrix_mw**-0.02
        * rmajor**0.04
        * b_plasma_surface_poloidal_average**-0.92
        * aspect**-0.42
    )

calculate_mast2014_sol_power_decay_length_1(p_plasma_separatrix_mw, b_plasma_surface_poloidal_average) staticmethod

Calculate the MAST 2014 SOL power decay length (λ_q).

Parameters:

Name Type Description Default
p_plasma_separatrix_mw float

Power crossing the separatrix (Pₛₑₚ) [MW]

required
b_plasma_surface_poloidal_average float

Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

required

Returns:

Type Description
float

MAST 2014 SOL power decay length (λ_q) [m]

Notes
  • The paper states that the poloidal field terms is for the outer midplane Bₚₒₗ(a), we are using the outer surface average
References

[1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during inter-ELM H modes on MAST as measured by infrared thermography,” Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014, doi: 10.1088/0741-3335/56/5/055008.

Source code in process/models/physics/scrape_off_layer.py
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
@staticmethod
def calculate_mast2014_sol_power_decay_length_1(
    p_plasma_separatrix_mw: float,
    b_plasma_surface_poloidal_average: float,
) -> float:
    """Calculate the MAST 2014 SOL power decay length (λ_q).

    Parameters
    ----------
    p_plasma_separatrix_mw : float
        Power crossing the separatrix (Pₛₑₚ) [MW]
    b_plasma_surface_poloidal_average : float
        Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

    Returns
    -------
    float
        MAST 2014 SOL power decay length (λ_q) [m]

    Notes
    -----
    - The paper states that the poloidal field terms is for the outer midplane
    Bₚₒₗ(a), we are using the outer surface average

    References
    ----------
    [1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during
    inter-ELM H modes on MAST as measured by infrared thermography,”
    Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014,
    doi: 10.1088/0741-3335/56/5/055008.

    """
    return (
        1.84e-3
        * p_plasma_separatrix_mw**0.18
        * b_plasma_surface_poloidal_average**-0.68
    )

calculate_mast2014_sol_power_decay_length_2(p_plasma_separatrix_mw, cur_plasma_ma) staticmethod

Calculate the MAST 2014 SOL power decay length (λ_q).

Parameters:

Name Type Description Default
p_plasma_separatrix_mw float

Power crossing the separatrix (Pₛₑₚ) [MW]

required
cur_plasma_ma float

Plasma current (Iₚ) [MA]

required

Returns:

Type Description
float

MAST 2014 SOL power decay length (λ_q) [m]

References

[1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during inter-ELM H modes on MAST as measured by infrared thermography,” Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014, doi: 10.1088/0741-3335/56/5/055008.

Source code in process/models/physics/scrape_off_layer.py
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
@staticmethod
def calculate_mast2014_sol_power_decay_length_2(
    p_plasma_separatrix_mw: float,
    cur_plasma_ma: float,
) -> float:
    """Calculate the MAST 2014 SOL power decay length (λ_q).

    Parameters
    ----------
    p_plasma_separatrix_mw : float
        Power crossing the separatrix (Pₛₑₚ) [MW]
    cur_plasma_ma : float
        Plasma current (Iₚ) [MA]

    Returns
    -------
    float
        MAST 2014 SOL power decay length (λ_q) [m]


    References
    ----------
    [1] A. J. Thornton and A. Kirk, “Scaling of the scrape-off layer width during
    inter-ELM H modes on MAST as measured by infrared thermography,”
    Plasma Physics and Controlled Fusion, vol. 56, no. 5, p. 055008, Apr. 2014,
    doi: 10.1088/0741-3335/56/5/055008.

    """
    return 4.57e-3 * p_plasma_separatrix_mw**0.22 * cur_plasma_ma**-0.64

calculate_upstream_sol_outboard_parallel_area(rmajor, rminor, len_plasma_sol_power_decay, b_plasma_outboard_total, b_plasma_surface_poloidal_average) staticmethod

Calculate the outboard SOL upstream parallel area (Aₗₗ,ᵤ) [m²].

Parameters:

Name Type Description Default
rmajor float

Major radius of the plasma (R₀) [m]

required
rminor float

Minor radius of the plasma (a) [m]

required
len_plasma_sol_power_decay float

Power decay length (λ_q) [m]

required
b_plasma_outboard_total float

Total magnetic field at the plasma outboard (Bₜₒₜ(R₀+a)) [T]

required
b_plasma_surface_poloidal_average float

Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

required

Returns:

Type Description
float

Upstream outboard SOL parallel area (Aₗₗ,ᵤ) [m²]

References

[1] P. C. Stangeby, “The Plasma Boundary of Magnetic Fusion Devices,” Jan. 2000, doi: 10.1201/9780367801489.

[2] S. S. Henderson et al., “An overview of the STEP divertor design and the simple models driving the plasma exhaust scenario,” Nuclear Fusion, vol. 65, no. 1, pp. 016033-016033, Nov. 2024, doi: 10.1088/1741-4326/ad93e7.

Source code in process/models/physics/scrape_off_layer.py
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
@staticmethod
def calculate_upstream_sol_outboard_parallel_area(
    rmajor: float,
    rminor: float,
    len_plasma_sol_power_decay: float,
    b_plasma_outboard_total: float,
    b_plasma_surface_poloidal_average: float,
) -> float:
    """Calculate the outboard SOL upstream parallel area (Aₗₗ,ᵤ) [m²].

    Parameters
    ----------
    rmajor : float
        Major radius of the plasma (R₀) [m]
    rminor : float
        Minor radius of the plasma (a) [m]
    len_plasma_sol_power_decay : float
        Power decay length (λ_q) [m]
    b_plasma_outboard_total : float
        Total magnetic field at the plasma outboard (Bₜₒₜ(R₀+a)) [T]
    b_plasma_surface_poloidal_average : float
        Poloidal magnetic field at the plasma surface (⟨Bₚₒₗ(a)⟩) [T]

    Returns
    -------
    float
        Upstream outboard SOL parallel area (Aₗₗ,ᵤ) [m²]

    References
    ----------
    [1] P. C. Stangeby, “The Plasma Boundary of Magnetic Fusion Devices,” Jan. 2000,
    doi: 10.1201/9780367801489.

    [2] S. S. Henderson et al., “An overview of the STEP divertor design and the
    simple models driving the plasma exhaust scenario,” Nuclear Fusion, vol. 65,
    no. 1, pp. 016033-016033, Nov. 2024, doi: 10.1088/1741-4326/ad93e7.

    """
    return (
        (2 * np.pi * (rmajor + rminor))
        * len_plasma_sol_power_decay
        * (b_plasma_surface_poloidal_average / b_plasma_outboard_total)
    )