V3FIT
surface.f
1  SUBROUTINE surface(rc, rs, zs, zc, xm, xn, mnmax)
2  USE vacmod
3  USE parallel_include_module
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 mnmax
9  REAL(dp), DIMENSION(mnmax) :: rc, rs, zs, zc, xm, xn
10 C-----------------------------------------------
11 C L o c a l V a r i a b l e s
12 C-----------------------------------------------
13  INTEGER :: i, mn, m, n, n1
14  REAL(dp), ALLOCATABLE, DIMENSION(:) ::
15  1 ruu, ruv, rvv, zuu, zuv, zvv, cosmn1, sinmn1
16  REAL(dp) :: tsurfon, tsurfoff
17 C-----------------------------------------------
18 !
19 ! THIS ROUTINE COMPUTES THE SURFACE VALUES OF R,Z AND DERIVATIVES
20 !
21 !
22 ! Compute R & Z (and their derivatives) on surface
23 !
24 ! R = SUM [RC(m,n)*COS(mu - nv) + RS(m,n)*SIN(mu - nv)]
25 ! Z = SUM [ZS(m,n)*SIN(mu - nv) + ZC(m,n)*COS(mu - nv)]
26 !
27 ! NOTE: u, v here are actual angles (0, 2pi), NOT the normalized
28 ! variables used in PKM paper
29 !
30  CALL second0(tsurfon)
31 
32  ALLOCATE (ruu(nuv3), ruv(nuv3), rvv(nuv3), zuu(nuv3), zuv(nuv3),
33  1 zvv(nuv3), cosmn1(nuv3), sinmn1(nuv3), stat = i)
34  IF (i .ne. 0) stop 'Allocation error in SURFACE'
35 
36  r1b = 0; z1b = 0
37  DO i = nuv3min, nuv3max
38  zub(i) = 0; zvb(i) = 0; zuu(i) = 0; zuv(i) = 0; zvv(i) = 0
39  rub(i) = 0; rvb(i) = 0; ruu(i) = 0; ruv(i) = 0; rvv(i) = 0
40  END DO
41 
42  DO mn = 1, mnmax
43  m = nint(xm(mn))
44  n = nint(xn(mn)/(nfper))
45  n1 = abs(n)
46  cosmn1(:) = cosu1(:,m)*cosv1(:,n1) + csign(n)*sinu1(:,m)*
47  1 sinv1(:,n1)
48  sinmn1(:) = sinu1(:,m)*cosv1(:,n1) - csign(n)*cosu1(:,m)*
49  1 sinv1(:,n1)
50  DO i = 1, nuv3
51  r1b(i) = r1b(i) + rc(mn) * cosmn1(i)
52  z1b(i) = z1b(i) + zs(mn) * sinmn1(i)
53  END DO
54  DO i = nuv3min, nuv3max
55  rub(i) = rub(i) - xm(mn) * rc(mn) * sinmn1(i)
56  rvb(i) = rvb(i) + xn(mn) * rc(mn) * sinmn1(i)
57  zub(i) = zub(i) + xm(mn) * zs(mn) * cosmn1(i)
58  zvb(i) = zvb(i) - xn(mn) * zs(mn) * cosmn1(i)
59  ruu(i) = ruu(i) - xm(mn)*xm(mn)*rc(mn) * cosmn1(i)
60  ruv(i) = ruv(i) + xm(mn)*xn(mn)*rc(mn) * cosmn1(i)
61  rvv(i) = rvv(i) - xn(mn)*xn(mn)*rc(mn) * cosmn1(i)
62  zuu(i) = zuu(i) - xm(mn)*xm(mn)*zs(mn) * sinmn1(i)
63  zuv(i) = zuv(i) + xm(mn)*xn(mn)*zs(mn) * sinmn1(i)
64  zvv(i) = zvv(i) - xn(mn)*xn(mn)*zs(mn) * sinmn1(i)
65  END DO
66 
67  IF (.NOT.lasym) cycle
68 
69  DO i = 1, nuv3
70  r1b(i) = r1b(i) + rs(mn) * sinmn1(i)
71  z1b(i) = z1b(i) + zc(mn) * cosmn1(i)
72  END DO
73  DO i = nuv3min, nuv3max
74  rub(i) = rub(i) + xm(mn) * rs(mn) * cosmn1(i)
75  rvb(i) = rvb(i) - xn(mn) * rs(mn) * cosmn1(i)
76  zub(i) = zub(i) - xm(mn) * zc(mn) * sinmn1(i)
77  zvb(i) = zvb(i) + xn(mn) * zc(mn) * sinmn1(i)
78  ruu(i) = ruu(i) - xm(mn)*xm(mn)*rs(mn) * sinmn1(i)
79  ruv(i) = ruv(i) + xm(mn)*xn(mn)*rs(mn) * sinmn1(i)
80  rvv(i) = rvv(i) - xn(mn)*xn(mn)*rs(mn) * sinmn1(i)
81  zuu(i) = zuu(i) - xm(mn)*xm(mn)*zc(mn) * cosmn1(i)
82  zuv(i) = zuv(i) + xm(mn)*xn(mn)*zc(mn) * cosmn1(i)
83  zvv(i) = zvv(i) - xn(mn)*xn(mn)*zc(mn) * cosmn1(i)
84  END DO
85  END DO
86 
87 !
88 ! COMPUTE METRIC COEFFICIENTS GIJ_B AND SURFACE NORMAL COMPONENTS
89 ! [SNR, SNV, SNZ] = NP*[Xu cross Xv]
90 !
91 ! NOTE: These should be multiplied by -signgs to point OUTWARD from vacuum INTO plasma
92 ! for either handed-ness of the coordinate system
93 !
94 ! Eq. 2.4 in PKM has wrong sign for a left-handed coordinate system
95 !
96 ! NOTE: guv = .5*np guv_b; gvv = np*np* gvv_b, where GUV, GVV are the
97 ! REAL metric elements. CAP(A), etc. defined in Eq. (2.13) of PKM paper
98 !
99 ! AUU == NP*CAP(A) = .5*Xuu dot [Xu cross Xv] * NP
100 !
101 ! AUV == 2*NP*CAP(B) = Xuv dot [Xu cross Xv] * NP
102 !
103 ! AVV == NP*CAP(C) = .5*Xvv dot [Xu cross Xv] * NP
104 !
105  DO i = nuv3min, nuv3max
106  guu_b(i) = rub(i)*rub(i) + zub(i)*zub(i)
107  guv_b(i) = (rub(i)*rvb(i)+ zub(i)*zvb(i))*onp*2
108  gvv_b(i) = (rvb(i)*rvb(i)+ zvb(i)*zvb(i)+(r1b(i)*r1b(i)))*onp2
109  snr(i) = signgs*r1b(i)*zub(i)
110  snv(i) = signgs*(rub(i)*zvb(i) - rvb(i)*zub(i))
111  snz(i) =-signgs*r1b(i)*rub(i)
112  drv(i) = -(r1b(i)*snr(i) + z1b(i)*snz(i))
113  auu(i) = p5*(snr(i)*ruu(i) + snz(i)*zuu(i))
114  auv(i) = (snr(i)*ruv(i) + snv(i)*rub(i) + snz(i)*zuv(i))*onp
115  avv(i) = (snv(i)*rvb(i) + p5*(snr(i)*(rvv(i) - r1b(i))
116  1 + snz(i)* zvv(i)))*onp2
117  END DO
118 
119  DO i = 1, nuv3
120  rzb2(i) = r1b(i)*r1b(i) + z1b(i)*z1b(i)
121  END DO
122  IF (.NOT.lasym) THEN
123  DO i = 1 + nv, nuv3 - nv
124  rzb2(imirr(i)) = rzb2(i)
125  r1b(imirr(i)) = r1b(i)
126  z1b(imirr(i)) =-z1b(i)
127  END DO
128  END IF
129 
130  DO i = 1, nuv
131  rcosuv(i) = r1b(i)*cosuv(i)
132  rsinuv(i) = r1b(i)*sinuv(i)
133  END DO
134 
135  DEALLOCATE (ruu, ruv, rvv, zuu, zuv, zvv, cosmn1, sinmn1, stat=i)
136 
137  CALL second0(tsurfoff)
138  surface_time = surface_time + (tsurfoff-tsurfon)
139 
140  END SUBROUTINE surface
141