V3FIT
harfun.f
1  SUBROUTINE harfun(jacfac, hiota, gpsi, ipsi, js, nznt, xlt,
2  1 xlz, xl, wt, wz, w, uboz, vboz, xjac)
3  USE stel_kinds
4  IMPLICIT NONE
5 C-----------------------------------------------
6 C D u m m y A r g u m e n t s
7 C-----------------------------------------------
8  INTEGER :: js, nznt
9  REAL(rprec) :: jacfac
10  REAL(rprec), DIMENSION(*) :: hiota, gpsi, ipsi
11  REAL(rprec), DIMENSION(nznt) ::
12  1 xl, xlt, xlz, w, wt, wz, uboz, vboz, xjac
13 C-----------------------------------------------
14 C L o c a l P a r a m e t e r s
15 C-----------------------------------------------
16  REAL(rprec), PARAMETER :: one = 1, zero = 0
17 C-----------------------------------------------
18 C L o c a l V a r i a b l e s
19 C-----------------------------------------------
20  REAL(rprec), ALLOCATABLE, DIMENSION(:) ::
21  1 bsupu, bsupv, psubu, psubv
22  REAL(rprec) :: dem, dem2, gpsi1, hiota1, ipsi1
23  INTEGER :: istat
24 C-----------------------------------------------
25 !
26 ! HERE, W IS THE PART OF THE TRANSFORMATION FUNCTION P
27 ! WHICH DEPENDS ON THE SURFACE-AVERAGED COVARIANT B COMPONENTS [RIGHT-SIDE IN Eq(10)],
28 ! COMPUTED IN transpmn AND vcoord_w.
29 !
30 ! THE FULL TRANSFORMATION FUNCTION IS THEN [Eq(10 in paper], with D=gpsi+iota*Ipsi:
31 !
32 ! P = (w - Ipsi*Lambda) / D
33 !
34 ! ALSO [Eq.(3) in paper]:
35 !
36 ! uboz = lambda + iota*P (non-secular piece of boozer theta in VMEC coordinates)
37 !
38 ! = (gpsi*lambda + iota*w)/D
39 !
40 ! vboz = P (non-secular piece of boozer phi in VMEC coordinates)
41 !
42 ! FINALLY, XJAC IS THE JACOBIAN BETWEEN BOOZER, VMEC COORDINATES
43 !
44 !
45 ! NOTE THAT LAMBDA = xl, d(lambda)/du = xlt, d(lambda)/dv = xlz
46 !
47  ALLOCATE(bsupu(nznt), bsupv(nznt), psubu(nznt), psubv(nznt),
48  1 stat=istat)
49  IF (istat .ne. 0) stop 'Allocation error in harfun!'
50 
51  jacfac = gpsi(js) + hiota(js)*ipsi(js)
52  IF (jacfac .eq. zero)
53  1 stop 'Boozer coordinate XFORM failed, jacfac = 0!'
54  dem = one/jacfac
55  gpsi1 = gpsi(js)*dem
56  hiota1 = hiota(js)*dem
57  ipsi1 = ipsi(js)*dem
58 
59  vboz = dem*w - ipsi1*xl !TOTAL p in Eq.(10)
60  uboz = xl + hiota(js)*vboz
61  psubv = dem*wz - ipsi1*xlz
62  psubu = dem*wt - ipsi1*xlt
63  bsupv = 1 + xlt
64  bsupu = hiota(js) - xlz
65 
66 !
67 ! Eq. (12)
68 !
69  xjac = bsupv*(1+psubv) + bsupu*psubu
70 
71  dem = minval(xjac)
72  dem2= maxval(xjac)
73  IF (dem*dem2 .le. zero) print *,
74  1 ' Jacobian xjac changed sign in harfun in xbooz_xform'
75 
76  DEALLOCATE(bsupu, bsupv, psubu, psubv, stat=istat)
77 
78  END SUBROUTINE harfun
79 
80  SUBROUTINE modbooz(bmnc, bmns, bmod, xmb, xnb,
81  1 u_b, v_b, cosmm, sinmm, cosnn, sinnn,
82  2 mnmax, mboz, nboz, nfp, lasym)
83  USE stel_kinds
84  IMPLICIT NONE
85 !-----------------------------------------------
86 ! D u m m y A r g u m e n t s
87 !-----------------------------------------------
88  INTEGER :: mnmax, mboz, nboz, nfp
89  REAL(rprec), DIMENSION(mnmax), INTENT(in) ::
90  1 bmnc, bmns
91  REAL(rprec), DIMENSION(mnmax), INTENT(in) :: xmb, xnb
92  REAL(rprec), DIMENSION(4), INTENT(in) :: u_b, v_b
93  REAL(rprec), DIMENSION(4), INTENT(out) :: bmod
94  REAL(rprec), DIMENSION(0:mboz) :: cosmm, sinmm
95  REAL(rprec), DIMENSION(0:nboz) :: cosnn, sinnn
96  LOGICAL, INTENT(in) :: lasym
97 !-----------------------------------------------
98 ! L o c a l P a r a m e t e r s
99 !-----------------------------------------------
100  REAL(rprec), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
101 !-----------------------------------------------
102 ! L o c a l V a r i a b l e s
103 !-----------------------------------------------
104  INTEGER :: mn, m, n, angles
105  REAL(rprec) :: cost, sint
106  REAL(rprec) :: sgn
107 !-----------------------------------------------
108  bmod = zero
109 
110  angle_loop: DO angles=1,4
111 
112  cosmm(0) = one
113  sinmm(0) = zero
114  cosmm(1) = cos(u_b(angles))
115  sinmm(1) = sin(u_b(angles))
116 
117  cosnn(0) = one
118  sinnn(0) = zero
119  IF (nboz .ge. 1) THEN
120  cosnn(1) = cos(v_b(angles)*nfp)
121  sinnn(1) = sin(v_b(angles)*nfp)
122  END IF
123 
124  DO m = 2,mboz
125  cosmm(m) = cosmm(m-1)*cosmm(1)
126  1 - sinmm(m-1)*sinmm(1)
127  sinmm(m) = sinmm(m-1)*cosmm(1)
128  1 + cosmm(m-1)*sinmm(1)
129  END DO
130 
131  DO n = 2,nboz
132  cosnn(n) = cosnn(n-1)*cosnn(1)
133  1 - sinnn(n-1)*sinnn(1)
134  sinnn(n) = sinnn(n-1)*cosnn(1)
135  1 + cosnn(n-1)*sinnn(1)
136  END DO
137 
138  DO mn=1,mnmax
139  m = nint(xmb(mn))
140  n = nint(abs(xnb(mn)))/nfp
141  sgn = sign(one,xnb(mn))
142  cost = cosmm(m)*cosnn(n)
143  1 + sinmm(m)*sinnn(n)*sgn
144  bmod(angles) = bmod(angles) + bmnc(mn)*cost
145  IF (lasym) THEN
146  sint = sinmm(m)*cosnn(n)
147  1 - cosmm(m)*sinnn(n)*sgn
148  bmod(angles) = bmod(angles) + bmns(mn)*sint
149  END IF
150  END DO
151 
152  END DO angle_loop
153 
154  END SUBROUTINE modbooz