3 USE stel_constants,
ONLY: twopi, one, zero
4 USE cyl_flux,
ONLY: flx2cyl, cyl2flx
32 MODULE PROCEDURE getbcyl_wout, getbcyl_vmec
36 MODULE PROCEDURE getjcyl_wout
40 MODULE PROCEDURE mse_pitch_wout
41 MODULE PROCEDURE mse_pitch_vmec
48 SUBROUTINE getbcyl_wout(R1, Phi, Z1, Br, Bphi, Bz,
50 USE read_wout_mod, phi_wout=>phi, ns_w=>ns, ntor_w=>ntor,
51 1 mpol_w=>mpol, ntmax_w=>ntmax, lthreed_w=>lthreed,
57 INTEGER,
OPTIONAL,
INTENT(out) :: info
58 REAL(rprec),
INTENT(in) :: R1, Z1, Phi
59 REAL(rprec),
INTENT(out) :: Br, Bphi, Bz
60 REAL(rprec),
INTENT(out),
OPTIONAL :: sflx, uflx
64 REAL(rprec),
PARAMETER :: fmin_acceptable = 1.e-6_dp
65 INTEGER :: nfe, info_loc
66 REAL(rprec) :: r_cyl(3), c_flx(3), fmin
67 REAL(rprec) :: Ru1, Zu1, Rv1, Zv1
68 REAL(rprec) :: bsupu1, bsupv1
70 IF (.not.lwout_opened)
THEN
72 1
' This form of GetBcyl can only be called if WOUT has been',
73 2
' previously opened!',
' Try GetBcyl_VMEC form instead.'
93 r_cyl(1) = r1; r_cyl(2) = nfp*phi; r_cyl(3) = z1
94 c_flx(1) = 0; c_flx(2) = 0; c_flx(3) = r_cyl(2)
95 IF (
PRESENT(sflx)) c_flx(1) = sflx
96 IF (
PRESENT(uflx)) c_flx(2) = uflx
97 CALL cyl2flx(rzl_local, r_cyl, c_flx, ns_w, ntor_w, mpol_w,
98 1 ntmax_w, lthreed_w, lasym_w, info_loc, nfe, fmin,
99 2 ru=ru1, zu=zu1, rv=rv1, zv=zv1)
100 rv1 = nfp*rv1; zv1 = nfp*zv1
102 IF (info_loc.eq.-1 .and. (fmin .le. fmin_acceptable)) info_loc = 0
104 IF (
PRESENT(info)) info = info_loc
105 IF (info_loc .ne. 0)
RETURN
107 IF (
PRESENT(sflx)) sflx = c_flx(1)
108 IF (
PRESENT(uflx)) uflx = c_flx(2)
110 IF (c_flx(1) .gt. one)
THEN
111 br = 0; bphi = 0; bz = 0
117 CALL tosuvspace (c_flx(1), c_flx(2), c_flx(3),
118 1 bsupu=bsupu1, bsupv=bsupv1)
122 br = ru1*bsupu1 + rv1*bsupv1
124 bz = zu1*bsupu1 + zv1*bsupv1
126 END SUBROUTINE getbcyl_wout
130 SUBROUTINE getbcyl_vmec(R1, Phi, Z1, Br, Bphi, Bz, sflx, uflx,
131 1 bsupu, bsupv, rzl_array, ns_in, ntor_in, mpol_in, ntmax_in,
132 2 nzeta, ntheta3, nper, mscale, nscale, lthreed_in, lasym_in,
138 INTEGER,
INTENT(in) :: ns_in, ntor_in, mpol_in, ntmax_in,
139 1 nzeta, ntheta3, nper
140 INTEGER,
OPTIONAL,
INTENT(out) :: info
141 LOGICAL,
INTENT(in) :: lthreed_in, lasym_in
142 REAL(rprec),
INTENT(in) :: R1, Z1, Phi
143 REAL(rprec),
INTENT(in) ::
144 1 rzl_array(ns_in,0:ntor_in,0:mpol_in-1,3*ntmax_in),
145 2 mscale(0:mpol_in-1), nscale(0:ntor_in)
146 REAL(rprec),
DIMENSION(ns_in,nzeta,ntheta3),
INTENT(in)
148 REAL(rprec),
INTENT(out) :: Br, Bphi, Bz, sflx, uflx
152 REAL(rprec),
PARAMETER :: c1p5 = 1.5_dp
153 REAL(rprec),
PARAMETER :: fmin_acceptable = 1.e-6_dp
154 INTEGER :: nfe, info_loc, jslo, jshi, julo, juhi,
155 1 kvlo, kvhi, ntheta1
156 REAL(rprec) :: r_cyl(3), c_flx(3), vflx, vflx_norm,
158 REAL(rprec) :: wgt_s, wgt_u, wgt_v, hs1, hu1, hv1
159 REAL(rprec) :: Ru1, Zu1, Rv1, Zv1
160 REAL(rprec) :: bsupu1, bsupv1, bsupu2, bsupv2
174 r_cyl(1) = r1; r_cyl(2) = nper*phi; r_cyl(3) = z1
175 c_flx(1) = 0; c_flx(2) = 0; c_flx(3) = r_cyl(2)
176 CALL cyl2flx(rzl_array, r_cyl, c_flx, ns_in, ntor_in, mpol_in,
177 1 ntmax_in, lthreed_in, lasym_in, info_loc, nfe, fmin,
178 2 mscale, nscale, ru=ru1, zu=zu1, rv=rv1, zv=zv1)
179 rv1 = nper*rv1; zv1 = nper*zv1
181 IF (info_loc.eq.-1 .and. (fmin .le. fmin_acceptable)) info_loc = 0
183 IF (
PRESENT(info)) info = info_loc
184 IF (info_loc .ne. 0)
RETURN
186 sflx = c_flx(1); uflx = c_flx(2); vflx = c_flx(3)
187 IF (c_flx(1) .gt. one)
THEN
188 br = 0; bphi = 0; bz = 0
198 hs1 = one/(ns_in - 1)
199 jslo = int(c1p5 + sflx/hs1)
201 wgt_s = (sflx - hs1*(jslo-c1p5))/hs1
202 IF (jslo .eq. ns_in)
THEN
208 ELSE IF (jslo .eq. 1)
THEN
215 ntheta1 = 2*(ntheta3 - 1)
218 uflx = mod(uflx, twopi)
219 DO WHILE (uflx .lt. zero)
224 uflx_norm = uflx/twopi
225 julo = int(1 + uflx_norm/hu1)
226 IF (julo .gt. ntheta3)
THEN
227 IF (abs(uflx_norm - 1) .lt. 1.e-2*hu1)
THEN
230 ELSE IF (abs(uflx_norm - .5_dp) .lt. 1.e-2*hu1)
THEN
234 print *,
'julo=', julo,
' > ntheta3=', ntheta3,
235 1
' uflx_norm=', uflx_norm,
' in GetBcyl!'
236 IF (
PRESENT(info)) info = -10
241 IF (julo .eq. ntheta3) juhi = 1
242 wgt_u = (uflx_norm - hu1*(julo-1))/hu1
245 DO WHILE (vflx .lt. zero)
248 vflx = mod(vflx, twopi)
250 vflx_norm = vflx/twopi
251 kvlo = int(1 + vflx_norm/hv1)
253 IF (kvlo .eq. nzeta) kvhi = 1
254 wgt_v = (vflx_norm - hv1*(kvlo-1))/hv1
259 bsupu1 = (1-wgt_s)*((1-wgt_u)*bsupu(jslo,kvlo,julo)
260 2 + wgt_u *bsupu(jslo,kvlo,juhi))
261 1 + wgt_s* ((1-wgt_u)*bsupu(jshi,kvlo,julo)
262 3 + wgt_u *bsupu(jshi,kvlo,juhi))
264 bsupv1 = (1-wgt_s)*((1-wgt_u)*bsupv(jslo,kvlo,julo)
265 2 + wgt_u *bsupv(jslo,kvlo,juhi))
266 1 + wgt_s* ((1-wgt_u)*bsupv(jshi,kvlo,julo)
267 3 + wgt_u *bsupv(jshi,kvlo,juhi))
269 bsupu2 = (1-wgt_s)*((1-wgt_u)*bsupu(jslo,kvhi,julo)
270 2 + wgt_u *bsupu(jslo,kvhi,juhi))
271 1 + wgt_s* ((1-wgt_u)*bsupu(jshi,kvhi,julo)
272 3 + wgt_u *bsupu(jshi,kvhi,juhi))
274 bsupv2 = (1-wgt_s)*((1-wgt_u)*bsupv(jslo,kvhi,julo)
275 2 + wgt_u *bsupv(jslo,kvhi,juhi))
276 1 + wgt_s* ((1-wgt_u)*bsupv(jshi,kvhi,julo)
277 3 + wgt_u *bsupv(jshi,kvhi,juhi))
282 bsupu1 = (1-wgt_v)*bsupu1 + wgt_v*bsupu2
283 bsupv1 = (1-wgt_v)*bsupv1 + wgt_v*bsupv2
288 br = ru1*bsupu1 + rv1*bsupv1
290 bz = zu1*bsupu1 + zv1*bsupv1
292 END SUBROUTINE getbcyl_vmec
296 SUBROUTINE getjcyl_wout(R1, Phi, Z1, JR, JPHI, JZ,
298 USE read_wout_mod, phi_wout1=>phi, ns_w1=>ns, ntor_w1=>ntor,
299 1 mpol_w1=>mpol, ntmax_w1=>ntmax, lthreed_w1=>lthreed,
305 INTEGER,
OPTIONAL,
INTENT(out) :: info
306 REAL(rprec),
INTENT(in) :: R1, Z1, Phi
307 REAL(rprec),
INTENT(out) :: JR, JPHI, JZ
308 REAL(rprec),
INTENT(out),
OPTIONAL :: sflx, uflx
312 REAL(rprec),
PARAMETER :: fmin_acceptable = 1.e-6_dp
313 INTEGER :: nfe, info_loc
314 REAL(rprec) :: r_cyl(3), c_flx(3), fmin
315 REAL(rprec) :: Ru1, Zu1, Rv1, Zv1
316 REAL(rprec) :: jsupu1, jsupv1, gsqrt1
318 IF (.not.lwout_opened)
THEN
320 1
' This form of GetBcyl can only be called if WOUT has been',
321 2
' previously opened!'
341 r_cyl(1) = r1; r_cyl(2) = nfp*phi; r_cyl(3) = z1
342 c_flx(1) = 0; c_flx(2) = 0; c_flx(3) = r_cyl(2)
343 CALL cyl2flx(rzl_local, r_cyl, c_flx, ns_w1, ntor_w1, mpol_w1,
344 1 ntmax_w1, lthreed_w1, lasym_w1, info_loc, nfe, fmin,
345 2 ru=ru1, zu=zu1, rv=rv1, zv=zv1)
346 rv1 = nfp*rv1; zv1 = nfp*zv1
348 IF (info_loc.eq.-1 .and. (fmin .le. fmin_acceptable)) info_loc = 0
350 IF (
PRESENT(info)) info = info_loc
351 IF (info_loc .ne. 0)
RETURN
353 IF (
PRESENT(sflx)) sflx = c_flx(1)
354 IF (
PRESENT(uflx)) uflx = c_flx(2)
356 IF (c_flx(1) .gt. one)
THEN
357 jr = 0; jphi = 0; jz = 0
362 CALL tosuvspace (c_flx(1), c_flx(2), c_flx(3),
363 1 gsqrt=gsqrt1, jsupu=jsupu1, jsupv=jsupv1)
369 jr = ru1*jsupu1 + rv1*jsupv1
371 jz = zu1*jsupu1 + zv1*jsupv1
373 END SUBROUTINE getjcyl_wout
377 FUNCTION mse_pitch_wout(r1, phi1, z1, acoef, efield, info)
382 INTEGER,
INTENT(out) :: info
383 REAL(rprec),
INTENT(in) :: r1, phi1, z1, acoef(6)
384 REAL(rprec),
INTENT(in),
OPTIONAL :: efield(2)
388 REAL(rprec) :: MSE_pitch_WOUT, Er, Ez, Br, Bphi, Bz
403 IF (
PRESENT(efield))
THEN
404 er = efield(1); ez = efield(2)
412 CALL getbcyl_wout(r1, phi1, z1, br, bphi, bz, info=info)
414 mse_pitch_wout = (acoef(1)*bz + acoef(5)*er)/
415 1 (acoef(2)*bphi + acoef(3)*br
416 2 + acoef(4)*bz + acoef(6)*ez)
418 END FUNCTION mse_pitch_wout
422 FUNCTION mse_pitch_vmec(r1, phi1, z1, acoef, efield, sflx, uflx,
423 1 bsupu, bsupv, rzl_array, ns_in, ntor_in, mpol_in, ntmax_in,
424 2 nzeta, ntheta3, nper, mscale, nscale, lthreed_in, lasym_in,
430 REAL(rprec),
INTENT(in) :: r1, phi1, z1, acoef(6), efield(2)
431 INTEGER,
INTENT(in) :: ns_in, ntor_in, mpol_in, ntmax_in,
432 1 nzeta, ntheta3, nper
433 LOGICAL,
INTENT(in) :: lthreed_in, lasym_in
434 REAL(rprec),
INTENT(in) ::
435 1 rzl_array(ns_in,0:ntor_in,0:mpol_in-1,3*ntmax_in),
436 2 mscale(0:mpol_in-1), nscale(0:ntor_in)
437 REAL(rprec),
DIMENSION(ns_in,nzeta,ntheta3),
INTENT(in)
439 REAL(rprec),
INTENT(out) :: sflx, uflx
440 INTEGER,
INTENT(out) :: info
444 REAL(rprec) :: MSE_pitch_VMEC, Er, Ez, Br, Bphi, Bz
459 er = efield(1); ez = efield(2)
464 CALL getbcyl_vmec(r1, phi1, z1, br, bphi, bz, sflx, uflx,
465 1 bsupu, bsupv, rzl_array, ns_in, ntor_in, mpol_in, ntmax_in,
466 2 nzeta, ntheta3, nper, mscale, nscale, lthreed_in, lasym_in,
469 mse_pitch_vmec = (acoef(1)*bz + acoef(5)*er)/
470 1 (acoef(2)*bphi + acoef(3)*br
471 2 + acoef(4)*bz + acoef(6)*ez)
473 END FUNCTION mse_pitch_vmec
475 END MODULE vmec_utils