Skip to content

Commit 0365640

Browse files
authored
Merge pull request #195 from boutproject/extend_legs
tokamak: leg_extend options
2 parents 87ca4e5 + b707fc7 commit 0365640

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

doc/whats-new.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ Release history
2525
- Wall coordinates are written to output grid as `closed_wall_R` and `closed_wall_Z`
2626
(#176)
2727
By [Ben Dudson](https://github.com/bendudson)
28+
- Extend divertor legs with `leg_extend` options. These specify how far each
29+
leg should extend beyond the wall intersection (#195).
30+
By [Ben Dudson](https://github.com/bendudson)
2831

2932
0.5.2 (13th March 2023)
3033
-------------------------

hypnotoad/cases/tokamak.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,36 @@ class TokamakEquilibrium(Equilibrium):
7878
value_type=float,
7979
check_all=is_positive,
8080
),
81+
leg_extend=WithMeta(
82+
0.0,
83+
doc="Extend divertor legs by this length [m]",
84+
value_type=float,
85+
check_all=is_non_negative,
86+
),
87+
leg_extend_lower_inner=WithMeta(
88+
"leg_extend",
89+
doc="Extend lower inner divertor leg",
90+
value_type=float,
91+
check_all=is_non_negative,
92+
),
93+
leg_extend_lower_outer=WithMeta(
94+
"leg_extend",
95+
doc="Extend lower outer divertor leg",
96+
value_type=float,
97+
check_all=is_non_negative,
98+
),
99+
leg_extend_upper_inner=WithMeta(
100+
"leg_extend",
101+
doc="Extend upper inner divertor leg",
102+
value_type=float,
103+
check_all=is_non_negative,
104+
),
105+
leg_extend_upper_outer=WithMeta(
106+
"leg_extend",
107+
doc="Extend upper outer divertor leg",
108+
value_type=float,
109+
check_all=is_non_negative,
110+
),
81111
nx_core=WithMeta(
82112
5,
83113
doc="Number of radial points in the core",
@@ -616,6 +646,20 @@ def findLegs(self, xpoint, radius=0.01, step=0.01):
616646
# The sign is used to tell which way to integrate
617647
sign = np.sign((leg[0] - xpoint.R) * Br + (leg[1] - xpoint.Z) * Bz)
618648

649+
# Get the length that the leg should be extended by
650+
if leg[1] > xpoint.Z:
651+
# Upper
652+
if leg[0] > xpoint.R:
653+
leg_extend = self.user_options.leg_extend_upper_outer
654+
else:
655+
leg_extend = self.user_options.leg_extend_upper_inner
656+
else:
657+
# Lower
658+
if leg[0] > xpoint.R:
659+
leg_extend = self.user_options.leg_extend_lower_outer
660+
else:
661+
leg_extend = self.user_options.leg_extend_lower_inner
662+
619663
# Integrate in this direction until the wall is intersected
620664
# This is affected by sign, which determines which way to integrate
621665
def dpos_dl(distance, pos):
@@ -644,6 +688,20 @@ def dpos_dl(distance, pos):
644688
intersect = self.wallIntersection(Point2D(*pos), Point2D(*newpos))
645689
if intersect is not None:
646690
line.append(intersect) # Put the intersection in the line
691+
if leg_extend > 0.0:
692+
nsteps = int(leg_extend / step + 0.5)
693+
extend_step = leg_extend / nsteps
694+
pos = (intersect.R, intersect.Z)
695+
for i in range(nsteps):
696+
solve_result = solve_ivp(
697+
dpos_dl,
698+
(0.0, extend_step),
699+
pos,
700+
rtol=0.0,
701+
atol=self.user_options.leg_trace_atol,
702+
)
703+
pos = (solve_result.y[0][1], solve_result.y[1][1])
704+
line.append(Point2D(*pos))
647705
break
648706
pos = newpos
649707
line.append(Point2D(*pos))

0 commit comments

Comments
 (0)