V3FIT
becoil.f
1  SUBROUTINE becoil (rad, zee, br, bp, bz, brvac, bpvac, bzvac, &
2  & lscreen)
3  USE vparams, ONLY: nthreed
4  USE vacmod
5  USE parallel_include_module
6  IMPLICIT NONE
7 C-----------------------------------------------
8 C D u m m y A r g u m e n t s
9 C-----------------------------------------------
10  REAL(dp), DIMENSION(nuv3), INTENT(in) :: rad, zee
11  REAL(dp), DIMENSION(nuv3), INTENT(out) :: br, bp, bz
12  REAL(dp), DIMENSION(nr0b,nz0b,np0b), INTENT(in) ::
13  1 brvac, bpvac, bzvac
14  LOGICAL :: lscreen
15 C-----------------------------------------------
16 C L o c a l P a r a m e t e r s
17 C-----------------------------------------------
18  CHARACTER(LEN=50), PARAMETER :: warning =
19  1 'Plasma Boundary exceeded Vacuum Grid Size'
20 C-----------------------------------------------
21 C L o c a l V a r i a b l e s
22 C-----------------------------------------------
23  INTEGER, SAVE :: icount = 0
24  INTEGER :: i, kv, ir, jz, ir1, jz1
25  REAL(dp) :: rad0, zee0, ri, zj,
26  1 pr, qz, w22, w21, w12, w11, tbecon, tbecoff
27 C-----------------------------------------------
28 !
29 ! DETERMINE THE CYLINDRICAL COMPONENTS OF THE EXTERNAL
30 ! MAGNETIC FIELD (BR, BP, BZ) AT A FIXED PHI PLANE BY
31 ! USING 2-D INTERPOLATION BASED ON THE FOUR POINT FORMULA
32 ! IN ABRAMOWITZ AND STEGUN, EQ. 25.2.66
33 !
34 ! BRVAC, BPVAC, BZVAC: CYLINDRICAL COMPONENTS OF VACUUM B-FIELD
35 ! STORED ON R, Z, PHI GRID
36 !
37 ! RAD, ZEE: ARRAY OF R, Z VALUES (ON FLUX SURFACE)
38 ! AT WHICH B-FIELD IS TO BE DETERMINED
39 !
40 C-----------------------------------------------
41  CALL second0(tbecon)
42 
43  icount = icount + 1
44 
45  DO i = nuv3min, nuv3max
46 !
47 ! CHECK THAT BOUNDARY POINTS ARE INSIDE VACUUM GRID. IF NOT,
48 ! SET THEM EQUAL TO LARGEST (OR SMALLEST) VACUUM GRID POINTS
49 !
50  rad0 = min(rad(i), rmaxb)
51  rad0 = max(rad0, rminb)
52  zee0 = min(zee(i), zmaxb)
53  zee0 = max(zee0, zminb)
54 !
55 ! DETERMINE PHI-PLANE, KV (MUST LIE IN FIRST FIELD PERIOD)
56 !
57  kv = 1 + mod(i - 1,nv)
58  kv = min(kv, np0b) !!Axi-symmetric special case
59 !
60 !
61 ! DETERMINE INTEGER INDICES (IR,JZ) FOR LOWER LEFT R, Z CORNER GRID POINT
62 !
63  ir = int((rad0 - rminb)/delrb) + 1
64  jz = int((zee0 - zminb)/delzb) + 1
65  ir1 = min(nr0b,ir + 1)
66  jz1 = min(nz0b,jz + 1)
67 !
68 ! COMPUTE RI, ZJ AND PR , QZ AT GRID POINT (IR , JZ)
69 ! ALSO, COMPUTE WEIGHTS WIJ FOR 4 CORNER GRID POINTS
70 !
71  ri = rminb + (ir - 1)*delrb
72  zj = zminb + (jz - 1)*delzb
73  pr = (rad0 - ri)/delrb
74  qz = (zee0 - zj)/delzb
75  w22 = pr*qz !p*q
76  w21 = pr - w22 !p*(1-q)
77  w12 = qz - w22 !q*(1-p)
78  w11 = 1 + w22 - (pr + qz) !(1-p)*(1-q)
79 !
80 ! COMPUTE B FIELD AT R, PHI, Z BY INTERPOLATION
81 !
82  br(i) = w11*brvac(ir,jz,kv) + w22*brvac(ir1,jz1,kv) +
83  1 w21*brvac(ir1,jz,kv) + w12*brvac(ir,jz1,kv)
84  bz(i) = w11*bzvac(ir,jz,kv) + w22*bzvac(ir1,jz1,kv) +
85  1 w21*bzvac(ir1,jz,kv) + w12*bzvac(ir,jz1,kv)
86  bp(i) = w11*bpvac(ir,jz,kv) + w22*bpvac(ir1,jz1,kv) +
87  1 w21*bpvac(ir1,jz,kv) + w12*bpvac(ir,jz1,kv)
88 
89  END DO
90 
91 !
92 ! PRINT INFO IF R, Z OUT OF BOX
93 !
94  IF (mod(icount,25).EQ.0 .AND. rank.EQ.0) THEN
95  i = 0
96  rad0 = maxval(rad)
97  zee0 = maxval(zee)
98  IF (rad0 .gt. rmaxb) i = 1
99  IF (zee0 .gt. zmaxb) i = i + 2
100  ri = minval(rad)
101  zj = minval(zee)
102  IF (ri .lt. rminb) i = i + 4
103  IF (zj .lt. zminb) i = i + 8
104  IF (i .ne. 0 .and. lscreen) THEN
105  print *, warning
106  WRITE (nthreed, *) warning
107  IF (i/8 .ne. 0) print *,' zmin = ', zj
108  i = mod(i,8)
109  IF (i/4 .ne. 0) print *,' rmin = ', ri
110  i = mod(i,4)
111  IF (i/2 .ne. 0) print *,' zmax = ', zee0
112  i = mod(i,2)
113  IF (i .ne. 0) print *,' rmax = ', rad0
114  END IF
115  ENDIF
116 
117  CALL second0(tbecoff)
118  becoil_time = becoil_time + (tbecoff - tbecon)
119 
120  END SUBROUTINE becoil