V3FIT
bextern.f
1  SUBROUTINE bextern(plascur, wint, lscreen)
2  USE vacmod
3  USE mgrid_mod, ONLY: bvac
4  USE parallel_include_module
5  IMPLICIT NONE
6 C-----------------------------------------------
7 C D u m m y A r g u m e n t s
8 C-----------------------------------------------
9  REAL(dp), INTENT(IN) :: plascur
10  REAL(dp), INTENT(IN) :: wint(nuv3)
11  LOGICAL :: lscreen
12 C-----------------------------------------------
13 C L o c a l V a r i a b l e s
14 C-----------------------------------------------
15  INTEGER :: i, k
16  REAL(dp), ALLOCATABLE :: brad(:), bphi(:), bz(:)
17  REAL(dp) :: tbexon, tbexoff
18 C-----------------------------------------------
19 c
20 c exterior Neumann problem
21 c
22  CALL second0(tbexon)
23 
24  IF (.not.ALLOCATED(bvac)) stop 'BVAC unallocated in bextern'
25  ALLOCATE (brad(nuv3), bphi(nuv3), bz(nuv3), stat=i)
26  IF (i .ne. 0) stop 'allocation error in bextern'
27 
28 !
29 ! THIS ROUTINE COMPUTES THE B DOT DS ARISING FROM EXTERNAL COILS AND INTERNAL PLASMA CURRENT
30 ! NOTE THAT BEXN = - BEX * DS IS THE EFFECTIVE SOURCE TERM
31 !
32 ! COMPUTE B FROM COILS ON THE PLASMA BOUNDARY
33 !
34 
35  CALL becoil (r1b,z1b,brad,bphi,bz,bvac(1,1),bvac(1,2),bvac(1,3), &
36  & lscreen)
37 
38 !
39 ! COMPUTE B (ON PLASMA BOUNDARY) FROM NET TOROIDAL PLASMA CURRENT
40 ! THE NET CURRENT IS MODELLED AS A WIRE AT THE MAGNETIC AXIS, AND THE
41 ! BIOT-SAVART LAW IS USED TO COMPUTE THE FIELD AT THE PLASMA SURFACE
42 !
43 ! USE BEXU, BEXV, BEXN AS TEMPORARY STORAGE FOR BX, BY, BZ
44 !
45  CALL tolicu (plascur)
46  CALL belicu (bexu, bexv, bexn, cosuv, sinuv, r1b, z1b)
47 
48  DO i = nuv3min, nuv3max
49  brad(i) = brad(i) + bexu(i)*cosuv(i) + bexv(i)*sinuv(i)
50  bphi(i) = bphi(i) - bexu(i)*sinuv(i) + bexv(i)*cosuv(i)
51  bz(i) = bz(i) + bexn(i)
52  END DO
53 
54 !
55 ! COMPUTE COVARIANT COMPONENTS OF EXTERNAL FIELD: BEXU = B0 dot dx/du,
56 ! BEXV = B0 dot dx/dv. HERE, BEXN = -B0*SURF_NORM CORRESPONDS TO THE
57 ! "exterior Neumann problem" convention of PKM (sign flipped as noted in PKM)
58 ! THUS, THE UNIT NORMAL SHOULD POINT INTO THE PLASMA (OUTWARD FROM VACUUM),
59 ! WHICH IT DOES FOR A NEGATIVE JACOBIAN (SIGNGS) SYSTEM
60 !
61  DO i = nuv3min, nuv3max
62  bexu(i) = rub(i)*brad(i) + zub(i)*bz(i)
63  bexv(i) = rvb(i)*brad(i) + zvb(i)*bz(i) + r1b(i)*bphi(i)
64  bexn(i) =-(brad(i)*snr(i) + bphi(i)*snv(i) + bz(i)*snz(i))
65 !
66 ! COMPUTE NORMALIZED [(2*pi)**2], READY-TO-INTEGRATE (WINT FACTOR) SOURCE TERM
67 !
68 ! NOTE: BEXN == NP*F = -B0 dot [Xu cross Xv] NP (see PKM, Eq. 2.13)
69  bexni(i) = bexn(i)*wint(i)*pi2*pi2
70  END DO
71 
72  DEALLOCATE (brad, bphi, bz)
73 
74  CALL second0(tbexoff)
75  bextern_time = bextern_time + (tbexoff - tbexon)
76 
77  END SUBROUTINE bextern
78