45 INTEGER,
PARAMETER :: nphi20 = 1 + nv/2
46 INTEGER,
PARAMETER :: mntot = mu*(2*nphi20 + 1)
51 INTEGER :: niter, nstep, itype, ncount,
52 1 i, k, j, m, n, mexp = 4, ns, iread, numargs, ier_flag
53 REAL(rprec),
DIMENSION(nu*nv) :: rin, zin
54 REAL(rprec),
DIMENSION(mntot) :: rbc, rbs, zbc, zbs
55 REAL(rprec),
DIMENSION(0:nv) :: rmnaxis, zmnaxis
56 REAL(rprec),
DIMENSION(0:mu-1,-nphi20:nphi20,2) ::
58 REAL(rprec),
DIMENSION(4) :: rbdy, zbdy, rdshape, zdshape,
59 1 rbean, zbean, rbelt, zbelt, rellip, zellip, rsqr, zsqr
60 REAL(rprec),
DIMENSION(0:11) :: rd3dc, zd3dc, rd3ds, zd3ds
61 REAL(rprec),
DIMENSION(0:3,0:2) :: rheliac, zheliac
62 REAL(rprec) :: ftol, zeta, texp, dels, A2, VP,
63 1 dumr, dumphi, dumz, arg, PSI, EPS, KAPPA, BDIA, R1, A1, QPSI
65 CHARACTER :: datafile*80
66 CHARACTER*120 :: command_arg(10)
70 data rdshape/3.0, 0.991, 0.136, 0./
71 data zdshape/0.0, 1.409, -0.118, 0./
72 data rbean/3.0, 1.042, 0.502, -0.0389/
73 data zbean/0.0, 1.339, 0.296, -0.0176/
74 data rbelt/3.0, 0.453, 0., 0./
75 data zbelt/0.0, 0.60, 0., 0.196/
76 data rellip/3.0e0, 1.0e0, 0., 0./
77 data zellip/0.0, 3.0e0, 0., 0./
78 DATA rd3dc/1.600721e+00, 5.675630e-01, 8.285081e-02, 8.140693e-03,
79 1 -5.756955e-03, 6.116248e-03, -9.446896e-04, 2.829636e-04,
80 2 9.626338e-04, 1.882352e-04, 2.479652e-04, 2.384830e-04 /
81 DATA zd3ds/0.000000e+00, 1.022053e+00,-6.887837e-02,-1.375168e-02,
82 1 1.524003e-02,-3.278997e-03, -3.202863e-03, 2.162696e-03,
83 2 -2.481337e-04,-8.761237e-04, 2.479652e-04, 2.384830e-04 /
84 DATA rd3ds/0.000000e+00, 5.456112e-02, 4.568940e-02,-1.259973e-02,
85 1 1.985606e-03, 1.203369e-03,-5.408820e-04, 6.187615e-04,
86 2 1.184803e-03, 1.187193e-04, 5.690797e-04, 7.653277e-05 /
87 DATA zd3dc/-1.274712e-01,5.456112e-02, 7.422938e-04,-1.394692e-02,
88 1 -9.163748e-04, 4.643816e-03,-7.520882e-04,-9.033089e-04,
89 2 1.593907e-03, 2.228495e-04,-5.690797e-04,-7.653277e-05 /
90 data rheliac/4.115, 0.4753, 0., 0., 0.3225, -0.06208, -0.1358,
91 1 -0.04146, 0.0136, 0.0806, -0.0205, 0.0445/
92 data zheliac/0., -0.5045, 0., 0., 0.337, 0.0637, 0.1325, -0.04094
93 1 , 0.01152, 0.06186, -0.03819, - 0.02366/
94 data rsqr/ 3.0, 0.4268, 0., 0.07322/,
95 1 zsqr/ 0.0, 0.4268, 0., -0.07322/
105 data datafile/
'none'/
118 CALL getcarg(1, command_arg(1), numargs)
119 IF (numargs .GT. 0)
THEN
122 CALL read_indata(command_arg(1), iunit, ier_flag,
123 1 nphi20, rbdy_3d, zbdy_3d)
124 IF (ier_flag .ne. 0) stop
'ERROR READING INPUT FILE'
131 WRITE (6,
'(a)')
' Enter spectral convergence parameter'
132 WRITE (6,
'(a)')
' =0 for polar, =1 for equal arclength'
133 WRITE (6,
'(a)')
' >1 for smaller spectral width'
134 WRITE (6,
'(a)', advance=
'no')
135 1
' =4 corresponds to STELLOPT choice): '
141 WRITE (6,
'(a,/,a)', advance=
'no')
142 1
' Use (default) VMEC-compatible compression (V)',
143 2
' or Advanced Hirshman-Breslau compression (A): '
146 IF (ch_yn ==
'A' .or. ch_yn ==
'a') hb_parameter = 0
149 WRITE (6,
'(5(a,/))')
150 1
' Select source of curve data to be fit: ',
151 2
' 0 : Points from file',
152 3
' 1 : Fourier coeffs from file (wout file allowed)',
153 4
' 2 : Solove''ev Equilibrium',
154 5
' 3 : Assorted 2-D shapes'
158 IF (itype .eq. 3)
THEN
160 1
' Shape to fit: 1=ellipse; 2=D; 3=bean; 4=belt; 5=square;',
161 2
' 6=D3D-asym; 7=heliac)'
163 IF (itype<1 .or. itype>7) itype = 1
164 IF (itype .eq. 7)
THEN
166 1
' Enter toroidal cross section to plot in degrees: '
168 zeta = zeta*twopi/360
172 ELSE IF (itype .eq. 0)
THEN
173 WRITE(*,
'(a)', advance=
'no')
174 1
' Enter file name containing R, PHI, Z data to fit:'
176 IF (datafile .eq.
'none') stop
'Must enter datafile name!'
179 ELSE IF (itype .eq. 1)
THEN
180 WRITE(6,
'(a)', advance=
'no')
181 1
' Enter full file name containing Rmn, Zmn',
182 2
' coefficients to convert: '
184 IF (datafile .eq.
'none') stop
'Must enter datafile name!'
186 ELSE IF (itype .eq. 2)
THEN
188 1
' Normalized Soloveev boundary: ',
190 2
' Psi = eps^-2[(r^2 + bdia^2)(z/kappa)^2 + (r^2 - 1)^2/4] '
193 1
' Psi (0<Psi<1), eps (<0.5), kappa, bdia: (blank delimited)'
195 READ (*,*) psi, eps, kappa, bdia
198 stop
'Must enter a number between 0 and 2!'
210 IF (itype .LT. 6)
THEN
229 rin(:ntheta) = rbdy(1)
230 zin(:ntheta) = zbdy(1)
233 arg = (m-1)*twopi*(j - 1)/real(ntheta,rprec)
234 rin(j) = rin(j) + rbdy(m)*cos(arg)
235 zin(j) = zin(j) + zbdy(m)*sin(arg)
239 ELSE IF (itype .EQ. 6)
THEN
240 rin(:ntheta) = zero; zin(:ntheta) = zero
244 arg = twopi*(j-1)/real(ntheta,rprec)
245 rin(j)=rin(j) + rd3dc(m)*cos(m*arg) + rd3ds(m)*sin(m*arg)
246 zin(j)=zin(j) + zd3ds(m)*sin(m*arg) + zd3dc(m)*cos(m*arg)
250 ELSE IF (itype .EQ. 7)
THEN
251 rin(:ntheta) = zero; zin(:ntheta) = zero
256 arg = twopi*(j-1)/real(ntheta,rprec)
257 rin(j) = rin(j) + rheliac(n,m)*cos(m*arg - n*zeta)
258 zin(j) = zin(j) + zheliac(n,m)*sin(m*arg - n*zeta)
271 OPEN(unit=20,file=trim(datafile),status=
'old', iostat=itype)
272 IF (itype .ne. 0) stop
'error reading datafile'
273 READ (20, *, iostat=itype) ntheta, nphi, nfp
274 IF (itype .ne. 0)
THEN
275 print *,
'Error reading first line of ',trim(datafile)
278 IF (ntheta .gt. nu) stop
'ntheta > nu'
279 IF (nphi .gt. nv) stop
'nphi > nv'
287 IF (iread .eq. 1)
THEN
288 READ (20, *, iostat=itype) rin(i), dumphi, zin(i)
290 READ (20, *, iostat=itype) rin(i), zin(i)
292 IF (itype .ne. 0)
THEN
293 IF (iread .eq. 1)
THEN
297 print *,
' Error reading datafile: iostat = ',itype
307 1 .and. (all(zin .ge. 0.) .or. all(zin .le. 0.)))
THEN
310 IF (zin(i) .eq. 0.)
CONTINUE
316 IF (ntheta .gt. nu) stop
'ntheta > nu'
326 CALL read_wout_curve (datafile, i, nphi20, rbdy_3d, zbdy_3d)
330 OPEN(unit=20,file=datafile,iostat=itype)
331 IF (itype .ne. 0) stop
'error reading datafile'
332 READ (20, *) mpol, nphi2, nfp
333 IF (mpol .gt. mu) stop
'mpol-input > mu'
335 DO WHILE (itype .eq. 0)
336 READ(20, *, iostat=itype,
END=200) n, m, dumr, dumz
337 IF (itype .ne. 0) cycle
338 IF (nfp .ne. 0) n = n/nfp
339 rbdy_3d(m,n,1) = dumr
340 zbdy_3d(m,n,1) = dumz
352 IF (nphi2 .le. 0) nphi = 1
353 IF (nphi .gt. nv) stop
'nphi > nv'
362 zeta = twopi*(k-1)/real(nphi,rprec)
365 arg = twopi*(j - 1)/real(ntheta,rprec)
366 rin(i) = rin(i) + rbdy_3d(m,n,1)*cos(m*arg - n*zeta)
367 1 + rbdy_3d(m,n,2)*sin(m*arg - n*zeta)
368 zin(i) = zin(i) + zbdy_3d(m,n,1)*sin(m*arg - n*zeta)
369 1 + zbdy_3d(m,n,2)*cos(m*arg - n*zeta)
375 IF (hb_parameter == 0)
THEN
394 IF (psi .LE. zero) stop
'Psi must be > 0'
395 IF (psi .GT. one) stop
'Psi must be <= 1'
396 IF (eps .GT. 0.5) stop
'Eps must be <= 0.5'
398 a1 = eps*sqrt(abs(psi))
400 arg = twopi*(j - 1)/real(ntheta,rprec)
401 rin(j) = sqrt(1 + 2*a1*cos(arg))
402 zin(j) = a1*kappa*sin(arg)/sqrt(rin(j)**2 + bdia**2)
414 arg = twopi*(j-1)/ntheta
415 r1 = sqrt(1 + 2*a2*cos(arg))
416 qpsi = qpsi + one/r1**3
421 vp = (vp/ntheta) * (kappa*eps**2)/2
422 WRITE (6,
'(a,1p,3e12.3)')
' PSI,Q/Q0, VP: ', a1, qpsi, vp
423 WRITE (33,
'(a,1p,3e12.3)')
' PSI,Q/Q0, VP: ', a1, qpsi, vp
479 CALL scrunch (rin, zin, rbc, zbs, rbs, zbc, rmnaxis,
480 1 zmnaxis, ftol, niter, nstep, mexp, mntot)
486 CALL printit(rin,zin,rbc,zbs,rbs,zbc,rmnaxis,zmnaxis)
493 WRITE (6,
'(/,a)', advance=
'no')
494 1
' Do you wish to plot this data (Y/N)? '
497 IF (ch_yn ==
'Y' .or. ch_yn ==
'y')
CALL system (
"xdes_plot")