@@ -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