4 USE makegrid_global,
ONLY: rprec
5 USE write_mgrid,
ONLY: rmin, rmax, zmin, zmax
14 INTEGER :: sym_nfp, sym_nextcur
15 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:,:) ::
16 1 sym_br, sym_bz, sym_bp, sym_b
20 PUBLIC :: check_symmetry
21 PUBLIC :: init_symmetry
22 PUBLIC :: cleanup_symmetry
24 INTEGER,
PUBLIC :: sym_ir, sym_jz, sym_kp
25 LOGICAL,
PUBLIC :: sym_perform_tests
34 SUBROUTINE init_symmetry
37 sym_nextcur =
SIZE(coil_group)
39 ALLOCATE( sym_br(sym_ir, sym_jz, sym_kp*sym_nfp) )
40 ALLOCATE( sym_bz(sym_ir, sym_jz, sym_kp*sym_nfp) )
41 ALLOCATE( sym_bp(sym_ir, sym_jz, sym_kp*sym_nfp) )
42 ALLOCATE( sym_b(sym_ir, sym_jz, sym_kp*sym_nfp) )
44 END SUBROUTINE init_symmetry
50 SUBROUTINE cleanup_symmetry
57 END SUBROUTINE cleanup_symmetry
63 SUBROUTINE check_symmetry(ig)
67 INTEGER,
INTENT(in) :: ig
71 INTEGER :: i, j, ki, fp
72 REAL(rprec) :: maxerr, avgerr
75 IF(sym_perform_tests)
THEN
77 CALL sym_compute_bfield(ig)
81 CALL sym_checkrot(ki,maxerr,avgerr)
82 WRITE(*,300) ki, maxerr, avgerr
87 CALL sym_checkstel(fp,maxerr,avgerr)
88 WRITE(*,300) fp, maxerr, avgerr
93 225
FORMAT(/
" Error factors, rotational symmetry ",
94 1
"(corresponding to KI'th plane):",/,
95 2
" KI", 6x,
"Max Error", 5x,
"Avg Error")
97 275
FORMAT(/
" Error factors, stellarator symmetry ",
98 1
"(for FP'th field period):",/,
99 2
" FP", 6x,
"Max Error", 5x,
"Avg Error")
101 300
FORMAT(i2,4x,es14.5,es14.5)
103 END SUBROUTINE check_symmetry
108 SUBROUTINE sym_compute_bfield(ig)
112 INTEGER,
INTENT(in) :: ig
116 INTEGER :: numcoils, i, j, k
117 REAL(rprec) :: rrr,ppp,zzz,delr,delp,delz
120 delr = (rmax - rmin)/(sym_ir - 1)
121 delz = (zmax - zmin)/(sym_ir - 1)
122 delp = (8*datan(1.0d0))/(sym_nfp*sym_kp)
129 DO k=1,sym_kp*sym_nfp
137 CALL bfield (rrr, ppp, zzz, sym_br(i,j,k),
138 1 sym_bp(i,j,k), sym_bz(i,j,k), ig)
142 1 dsqrt(sym_br(i,j,k)**2 + sym_bp(i,j,k)**2 + sym_bz(i,j,k)**2)
151 END SUBROUTINE sym_compute_bfield
157 SUBROUTINE sym_checkrot(ki,maxerr,avgerr)
161 INTEGER,
INTENT(in) :: ki
162 REAL(rprec),
INTENT(out) :: maxerr, avgerr
167 REAL(rprec) :: dbr, dbp, dbz, currerr, avgb
175 DO k=ki+sym_kp, sym_kp*sym_nfp, sym_kp
180 dbr = sym_br(i,j,k) - sym_br(i,j,ki)
181 dbp = sym_bp(i,j,k) - sym_bp(i,j,ki)
182 dbz = sym_bz(i,j,k) - sym_bz(i,j,ki)
183 avgb = (sym_b(i,j,k) + sym_b(i,j,ki))/2.0d0
185 IF(avgb .NE. 0d0)
THEN
186 currerr = currerr + dsqrt(dbr**2+dbp**2+dbz**2)/avgb
191 avgerr = avgerr + currerr
192 IF(currerr .GT. maxerr) maxerr = currerr
195 IF (sym_nfp .GT. 1) avgerr = avgerr/(sym_nfp-1)
197 END SUBROUTINE sym_checkrot
203 SUBROUTINE sym_checkstel(fp,maxerr,avgerr)
207 INTEGER,
INTENT(in) :: fp
208 REAL(rprec),
INTENT(out) :: maxerr, avgerr
213 INTEGER :: i,j,k,h,l, startk, midk, endk
214 REAL(rprec) :: dbr, dbp, dbz, avgb, currerr
217 startk = sym_kp*(fp-1)+1
218 midk = startk+sym_kp/2-1
227 l = mod(endk-(k-startk)-1,sym_kp*sym_nfp)+1
233 dbr = sym_br(i,j,k)+sym_br(i,h,l)
234 dbp = sym_bp(i,j,k)-sym_bp(i,h,l)
235 dbz = sym_bz(i,j,k)-sym_bz(i,h,l)
236 avgb = (sym_b(i,j,k)+sym_b(i,h,l))/2.0d0
238 IF(avgb .NE. 0d0)
THEN
239 currerr = currerr + dsqrt(dbr**2+dbp**2+dbz**2)/avgb
244 avgerr = avgerr + currerr
245 IF(currerr .GT. maxerr) maxerr = currerr
248 IF(midk-startk+1 .GT. 0) avgerr = avgerr/(midk-startk+1)
250 END SUBROUTINE sym_checkstel