V3FIT
boozer.f
1  SUBROUTINE boozer(thgrd, ztgrd, bmod, rad, zee, xmb, xnb,
2  1 bmncb, rmncb, zmnsb, pmnsb, gmncb,
3  2 bmnsb, rmnsb, zmncb, pmncb, gmnsb,
4  3 scl, uboz, vboz, xjac,
5  4 cosmm, sinmm, cosnn, sinnn, mnmax, nznt, mboz, nboz, nfp,
6  5 nu2, nv, jacfac, js)
7 ! CRCook added js as last argument to specify iota on the surface
8 C...MODIFIED 6/98 by A. WARE to speed up by factor of 8
9 C
10  USE stel_kinds
11 ! CRCook Need extra variables from booz_params now
12  USE booz_params, ONLY: lasym_b, lrfp_b, hiota
13  IMPLICIT NONE
14 C-----------------------------------------------
15 C D u m m y A r g u m e n t s
16 C-----------------------------------------------
17  INTEGER :: mnmax, nznt, mboz, nboz, nfp, nu2, nv
18  REAL(rprec), DIMENSION(nznt), INTENT(in) ::
19  1 thgrd, ztgrd, bmod, rad, zee, uboz, vboz, xjac
20  REAL(rprec), DIMENSION(mnmax), INTENT(in) ::
21  1 xmb, xnb, scl
22  REAL(rprec), DIMENSION(nznt,0:mboz), INTENT(out) ::
23  1 cosmm, sinmm
24  REAL(rprec), DIMENSION(nznt,0:nboz), INTENT(out) ::
25  1 cosnn, sinnn
26  REAL(rprec), DIMENSION(mnmax), INTENT(out) ::
27  1 bmncb, rmncb, zmnsb, pmnsb, gmncb
28  REAL(rprec), DIMENSION(mnmax), INTENT(out) ::
29  1 bmnsb, rmnsb, zmncb, pmncb, gmnsb
30  REAL(rprec), INTENT(in) :: jacfac
31 ! CRCook 10/9/12 added js
32  INTEGER :: js
33 C-----------------------------------------------
34 C L o c a l P a r a m e t e r s
35 C-----------------------------------------------
36  REAL(rprec), PARAMETER :: one=1, zero=0, p5=0.5_dp
37 C-----------------------------------------------
38 C L o c a l V a r i a b l e s
39 C-----------------------------------------------
40  INTEGER :: mn, m, n, imax, i
41  REAL(rprec), ALLOCATABLE, DIMENSION(:) :: cost, sint, uang,
42  1 vang, bbjac
43  REAL(rprec) :: sgn
44 C-----------------------------------------------
45 !
46 ! theta-boz = thgrd + uboz
47 ! zeta-boz = ztgrd + vboz
48 !
49  ALLOCATE (cost(nznt), sint(nznt), uang(nznt),
50  1 vang(nznt), bbjac(nznt), stat=i)
51  IF (i .ne. 0) stop 'Allocation error in boozer!'
52 
53  uang = thgrd+uboz
54  vang = ztgrd+vboz
55  CALL trigfunc (uang, vang, cosmm, sinmm, cosnn, sinnn,
56  1 mboz, nboz, nznt)
57 
58  IF (.not.lasym_b) THEN
59 ! ONLY INTEGRATE IN U HALF WAY AROUND (FOR LASYM=F)
60  i = nv*(nu2-1)+1 !u=pi interval: i:imax
61  imax = i-1+nv
62  DO m = 0,mboz
63  cosmm(1:nv,m) = p5*cosmm(1:nv,m) !u=0
64  cosmm(i:imax,m) = p5*cosmm(i:imax,m) !u=pi
65  sinmm(1:nv,m) = p5*sinmm(1:nv,m) !should be zeroes
66  sinmm(i:imax,m) = p5*sinmm(i:imax,m) !should be zeroes
67  END DO
68  END IF
69 
70 ! jacobian from VMEC to Boozer coords, with SPECIAL
71 ! radial variable s = (toroidal flux)/twopi (phip = 1)
72 ! cost = cos(mu-nv); sint = sin(mu-nv)
73  bbjac = jacfac/(bmod*bmod)
74 
75 ! CRCook This modification makes the Jacobian the correct one for s ~ chi
76 ! (LRFP = TRUE)
77  IF (lrfp_b) THEN
78  bbjac = bbjac/hiota(js)
79  ENDIF
80 
81  DO mn = 1,mnmax
82  m = nint(xmb(mn))
83  n = nint(abs(xnb(mn)))/nfp
84  sgn = sign(one,xnb(mn))
85  cost = (cosmm(:,m)*cosnn(:,n)
86  1 + sinmm(:,m)*sinnn(:,n)*sgn)*xjac
87  sint = (sinmm(:,m)*cosnn(:,n)
88  1 - cosmm(:,m)*sinnn(:,n)*sgn)*xjac
89 
90  bmncb(mn) = dot_product(bmod,cost)
91  rmncb(mn) = dot_product(rad, cost)
92  zmnsb(mn) = dot_product(zee, sint)
93  pmnsb(mn) =-dot_product(vboz,sint)
94  gmncb(mn) = dot_product(bbjac, cost)
95 
96  IF (.not.lasym_b) cycle
97 
98  bmnsb(mn) = dot_product(bmod,sint)
99  rmnsb(mn) = dot_product(rad ,sint)
100  zmncb(mn) = dot_product(zee, cost)
101  pmncb(mn) =-dot_product(vboz,cost)
102  gmnsb(mn) = dot_product(bbjac, sint)
103 
104  END DO
105 
106  DEALLOCATE (cost, sint, uang, vang, bbjac, stat=i)
107 
108  bmncb = scl*bmncb
109  rmncb = scl*rmncb
110  zmnsb = scl*zmnsb
111  pmnsb = scl*pmnsb
112  gmncb = scl*gmncb
113 
114  IF (.not.lasym_b) RETURN
115 
116  bmnsb = scl*bmnsb
117  rmnsb = scl*rmnsb
118  zmncb = scl*zmncb
119  pmncb = scl*pmncb
120  gmnsb = scl*gmnsb
121 
122  END SUBROUTINE boozer