1 SUBROUTINE descur_sub(g1,g2)
47 INTEGER,
PARAMETER :: nphi20 = 1 + nv/2
48 INTEGER,
PARAMETER :: mntot = mu*(2*nphi20 + 1)
52 INTEGER :: niter, nstep, itype,
54 REAL(rprec),
DIMENSION(nu*nv) :: rin, zin, LENgth
55 REAL(rprec),
DIMENSION(mntot) :: rbc, rbs, zbc, zbs
56 REAL(rprec),
DIMENSION(0:nv) :: rmnaxis, zmnaxis
57 REAL(rprec),
DIMENSION(0:mu-1,-nphi20:nphi20) ::
59 REAL(rprec),
DIMENSION(4) :: rbdy, zbdy, rdshape, zdshape,
60 1 rbean, zbean, rbelt, zbelt, rellip, zellip, rsqr, zsqr
61 REAL(rprec),
DIMENSION(0:3,0:2) :: rheliac, zheliac
62 REAL(rprec) :: ftol, pexp, qexp, zeta, texp,
63 1 dumr, dumphi, dumz, arg, PSI, XI, DELTA_R,
65 CHARACTER :: datafile*80
71 data rdshape/3.0, 0.991, 0.136, 0./
72 data zdshape/0.0, 1.409, -0.118, 0./
73 data rbean/3.0, 1.042, 0.502, - 0.0389/
74 data zbean/0.0, 1.339, 0.296, - 0.0176/
75 data rbelt/3.0, 0.453, 0., 0./
76 data zbelt/0.0, 0.60, 0., 0.196/
77 data rellip/3.0e0, 1.000e0, 0., 0./
78 data zellip/0.0, 6.00e0, 0., 0./
79 data rheliac/4.115, 0.4753, 0., 0., 0.3225, -0.06208, -0.1358,
80 1 -0.04146, 0.0136, 0.0806, -0.0205, 0.0445/
81 data zheliac/0., -0.5045, 0., 0., 0.337, 0.0637, 0.1325, -0.04094
82 1 , 0.01152, 0.06186, -0.03819, - 0.02366/
83 data rsqr/ 3.0, 0.4268, 0., 0.07322/,
84 1 zsqr/ 0.0, 0.4268, 0., -0.07322/
117 ntheta = g2%nthet ; nphi = 1 ; nfp = 1
118 IF (ntheta .gt. nu) stop
'ntheta > nu'
119 IF (nphi .gt. nv) stop
'nphi > nv'
123 i = 0 ; rin = 0 ; zin = 0
126 rin(1:ntheta)=g2%rs(g2%npsi,1:ntheta)
127 zin(1:ntheta)=g2%zs(g2%npsi,1:ntheta)
132 CALL scrunch (rin, zin, pexp, qexp, rbc, zbs, rbs, zbc, rmnaxis,
133 1 zmnaxis, ftol, niter, nstep, mexp)
139 CALL printit(rin,zin,rbc,zbs,rbs,zbc,rmnaxis,zmnaxis,g2)
142 END SUBROUTINE descur_sub
143 SUBROUTINE scrunch(rin, zin, pexp, qexp, rbc, zbs, rbs, zbc,
144 1 rmnaxis, zmnaxis, ftol, niter, nstep, mexp)
154 INTEGER :: niter, nstep, mexp
155 REAL(rprec) pexp, qexp, ftol
156 REAL(rprec),
DIMENSION(ntheta,nphi) :: rin, zin
157 REAL(rprec),
DIMENSION(*) :: rbc, zbs, rbs, zbc,
162 INTEGER :: irst=1, nplane, imodes, iter, modeno, mrho1
163 REAL(rprec),
ALLOCATABLE,
DIMENSION(:,:) :: angle
164 REAL(rprec),
DIMENSION(2*mpol,nphi) :: result
165 REAL(rprec) :: too_large,
166 1 gtrig, fsq, gmin, g11, gout
181 IF (mod(nphi,2).ne.0 .and. nphi.ne.1 .or. nphi.eq.0)
THEN
182 print *,
' NPHI > 0 must be EVEN for non-symmetric systems'
185 IF (ntheta > nu)
THEN
186 print *,
' NTHETA input to SCRUNCH is too large'
190 print *,
' NPHI input to SCRUNCH is too large'
194 print *,
' MPOL input to SCRUNCH is too large'
198 print *,
' NFP > 0 must be positive and exceed zero'
208 CALL fixaray (pexp, qexp, mexp)
214 ALLOCATE (angle(ntheta, nphi))
215 CALL inguess (rin, zin, angle)
221 ALLOCATE (xvec(n2), gvec(n2), xdot(n2), xstore(n2))
239 r0n = zero ; z0n = zero ; raxis = zero ; zaxis = zero
242 10
FORMAT(/
' Fitting toroidal plane # ',i3)
244 CALL amplitud (r0n(nplane), z0n(nplane), angle(1,nplane),
245 1 xvec(1), xvec(1+mrho1), xvec(2:mrho1), xvec(2+mrho1:2*mrho1),
246 2 xvec(2*mrho1+1:), rin(1,nplane), zin(1,nplane))
250 20
FORMAT(/
' ITERATIONS RMS ERROR FORCE GRADIENT <M>',
258 CALL funct (xvec(1), xvec(1+mrho1), xvec(2:mrho1),
259 1 xvec(2+mrho1:2*mrho1),xvec(2*mrho1+1:), gvec(1),
260 2 gvec(1+mrho1), gvec(2:mrho1), gvec(2+mrho1:2*mrho1),
261 3 gvec(2*mrho1+1:), fsq, rin(1,nplane), zin(1,nplane),
266 gmin = min(gmin,gnorm)
271 IF (gnorm/gmin .gt. too_large) irst = 2
272 IF (irst.eq.2 .or. gmin.eq.gnorm)
CALL restart (irst)
274 IF (gnorm.lt.gtrig .and. imodes.lt.mrho)
THEN
280 IF (mod(iter,nstep).ne.0 .and. gnorm.gt.ftol**2) cycle
291 IF (iter .eq. 1) modeno = mpol - 1
292 IF (qexp .gt. zero) specw = specw**(one/qexp)
295 IF (gnorm.lt.ftol**2 .and. imodes.eq.mrho
296 1 .or. fsq.lt.ftol)
EXIT
299 110
FORMAT(i8,1p,2e16.3,0p,f10.2,i8,1p,e10.2)
304 result(1:2*mpol,nplane) = xvec(1:2*mpol)
312 330
FORMAT(/
' ANGLE CONSTRAINTS WERE APPLIED ',/,
313 1
' BASED ON RM**2 + ZM**2 SPECTRUM WITH P = ',f8.2,
' AND Q = ',
314 2 f8.2,/,
' POLAR DAMPING EXPONENT = ',i2/,
' TIME: ',1pe10.2,
319 CALL fftrans (result(1,1:nphi), result(1+mpol,1:nphi),
320 1 result(2:mpol,1:nphi), result(mpol+2:2*mpol,1:nphi), rbc,
321 1 zbs, rbs, zbc, rmnaxis, zmnaxis)
323 DEALLOCATE (xvec, gvec, xdot, xstore, angle)
325 END SUBROUTINE scrunch
327 SUBROUTINE fixaray(pexp, qexp, mexp)
338 REAL(rprec) :: pexp, qexp
342 INTEGER :: l, ntor, nn0, n, m
361 IF (nphi2 .eq. 0) nphi2 = 1
362 n2 = 2*(mrho+1) + ntheta
365 ntor = max0(1,nphi - 1)
366 IF (nphi .eq. 2) ntor = 2
368 nn0 = 1 - (ntor + 1)/2
370 nn(n) = (nn0 + (n - 1))*nfp
375 IF (mm(m).ne.0 .or. nn(n).ge.0)
THEN
383 dnorm = 2._dbl/ntheta
391 xmpq(m,1) = dm1(m)**(pexp+qexp)
392 xmpq(m,2) = dm1(m)**(pexp)
403 t1m(m) = (real(m-1, rprec)/m)**mexp
406 t2m(m) = sgn*(real(m+1, rprec)/m)**mexp
411 END SUBROUTINE fixaray
412 SUBROUTINE inguess(rin, zin, angle)
422 REAL(rprec),
DIMENSION(ntheta,nphi) :: rin, zin, angle
426 INTEGER :: i, inside, jskip, j1, j2
451 r0n(i) = r0n(i) + sum(rin(:,i))/real(ntheta,rprec)
452 z0n(i) = z0n(i) + sum(zin(:,i))/real(ntheta,rprec)
455 CALL order (rin(1,i), zin(1,i), raxis(i), zaxis(i), inside)
456 IF (inside .eq. 0)
THEN
460 IF (jskip .le. 0)
THEN
461 print *,
'Could not find INTernal point'
462 WRITE (3, *)
'Could not find INTernal point'
468 raxis(i) = 0.5_dbl*(rin(j1,i)+rin(j2,i))
469 zaxis(i) = 0.5_dbl*(zin(j1,i)+zin(j2,i))
470 CALL order (rin(1,i), zin(1,i), raxis(i), zaxis(i), inside)
471 IF (inside .eq. 1)
THEN
476 IF (j1 .gt. ntheta)
go to 40
478 IF (j2 .gt. ntheta) j2 = 1
486 CALL getangle (rin, zin, angle, r0n, z0n)
488 END SUBROUTINE inguess
489 SUBROUTINE amplitud(rcenter, zcenter, angin, r0c, z0c, rhoc, rhos,
500 REAL(rprec) rcenter, zcenter, r0c, z0c
501 REAL(rprec),
DIMENSION(ntheta) :: angin, xpts, xin, yin
502 REAL(rprec),
DIMENSION(0:mrho-1) :: rhoc, rhos
508 REAL(rprec) :: xmult, arg, xi, yi, t1, t2,
509 1 r1c(mu), r1s(mu), z1c(mu), z1s(mu), tnorm
518 xpts(:ntheta) = angin(:ntheta)
521 xmult = 2._dbl/ntheta
533 xi = xmult*(xin(j)-rcenter)
534 yi = xmult*(yin(j)-zcenter)
535 r1c(m) = r1c(m) + cos(m*arg)*xi
536 r1s(m) = r1s(m) + sin(m*arg)*xi
537 z1c(m) = z1c(m) + cos(m*arg)*yi
538 z1s(m) = z1s(m) + sin(m*arg)*yi
542 r10 = sqrt( r1c(1)**2 + r1s(1)**2 + z1c(1)**2 + z1s(1)**2 )
554 rhoc(m) = 0.5_dbl*(r1c(m+1) + z1s(m+1))/t1
555 rhos(m) = 0.5_dbl*(r1s(m+1) - z1c(m+1))/t1
559 tnorm = 0.5_dbl/(t1**2 + t2**2)
560 rhoc(m) = tnorm*( (r1c(m+1) + z1s(m+1))*t1
561 1 + (r1c(m-1) - z1s(m-1))*t2 )
562 rhos(m) = tnorm*( (r1s(m+1) - z1c(m+1))*t1
563 1 + (r1s(m-1) + z1c(m-1))*t2 )
567 END SUBROUTINE amplitud
568 SUBROUTINE funct(r0c, z0c, rhoc, rhos, xpts, gr0c, gz0c, grhoc,
569 1 grhos, gpts, fsq, xin, yin, mrho_in)
580 REAL(rprec) fsq, r0c, z0c, gr0c, gz0c
581 REAL(rprec),
DIMENSION(ntheta) :: xpts, gpts, xin, yin
582 REAL(rprec),
DIMENSION(0:mrho_in-1) ::
583 1 rhoc, rhos, grhoc, grhos
588 REAL(rprec),
DIMENSION(ntheta) ::
589 1 gcon, gtt, r1, z1, rt1, zt1
590 REAL(rprec),
DIMENSION(ntheta,0:mrho_in) :: COSa, SINa
591 REAL(rprec) :: denom, rmc_p, zms_p, rms_p, zmc_p,
606 r1(:ntheta) = -xin(:ntheta)
607 z1(:ntheta) = -yin(:ntheta)
611 cosa(:,1) = cos(xpts)
613 sina(:,1) = sin(xpts)
620 cosa(:,m) = cosa(:,m-1)*cosa(:,1) - sina(:,m-1)*sina(:,1)
621 sina(:,m) = sina(:,m-1)*cosa(:,1) + cosa(:,m-1)*sina(:,1)
625 CALL getrz(rmc_p,rms_p,zmc_p,zms_p,r0c,z0c,rhoc,rhos,
630 t2 = rmc_p*rmc_p + zmc_p*zmc_p + rms_p*rms_p + zms_p*zms_p
631 denom = denom + t2*xmpq(m,2)
632 specw = specw + xmpq(m,1)*t2
634 gtt(:ntheta) = rmc_p*cosa(:ntheta,m) + rms_p*sina(:ntheta,m)
635 gcon(:ntheta) = zmc_p*cosa(:ntheta,m) + zms_p*sina(:ntheta,m)
636 r1(:ntheta) = r1(:ntheta) + gtt(:ntheta)
637 z1(:ntheta) = z1(:ntheta) + gcon(:ntheta)
638 rt1(:ntheta) = rt1(:ntheta) + dm1(m)*(rms_p*cosa(:ntheta,m)-
639 1 rmc_p*sina(:ntheta,m))
640 zt1(:ntheta) = zt1(:ntheta) + dm1(m)*(zms_p*cosa(:ntheta,m)-
641 1 zmc_p*sina(:ntheta,m))
646 gtt(:ntheta) = rt1(:ntheta)**2 + zt1(:ntheta)**2
647 gpts(:ntheta) = r1(:ntheta)*rt1(:ntheta)+z1(:ntheta)*zt1(:ntheta)
654 gpts(:ntheta) = 0.5_dbl*gpts(:ntheta)/gtt(:ntheta)
655 t1 = maxval(abs(gpts(:ntheta)))
660 gpts(:ntheta) = t1 * gpts(:ntheta)
662 fsq = 0.5_dbl*dnorm*sum(r1(:ntheta)**2 + z1(:ntheta)**2)
670 gr0c = dnorm*sum(cosa(:ntheta,m)*r1(:ntheta))
671 gz0c = dnorm*sum(cosa(:ntheta,m)*z1(:ntheta))
680 grhoc(m) = t1*sum(cosa(:ntheta,m+1)*r1(:ntheta) +
681 1 sina(:ntheta,m+1)*z1(:ntheta))
682 grhos(m) = t1*sum(sina(:ntheta,m+1)*r1(:ntheta) -
683 1 cosa(:ntheta,m+1)*z1(:ntheta))
687 tnorm = dnorm/(t1*t1 + t2*t2)
690 grhoc(m) = sum((cosa(:ntheta,m+1)*r1(:ntheta) +
691 1 sina(:ntheta,m+1)*z1(:ntheta))*t1 +
692 2 (cosa(:ntheta,m-1)*r1(:ntheta) -
693 3 sina(:ntheta,m-1)*z1(:ntheta))*t2)
694 grhos(m) = sum((sina(:ntheta,m+1)*r1(:ntheta) -
695 1 cosa(:ntheta,m+1)*z1(:ntheta))*t1 +
696 2 (sina(:ntheta,m-1)*r1(:ntheta) +
697 3 cosa(:ntheta,m-1)*z1(:ntheta))*t2)
703 gnorm = sum(grhoc(0:mrho1)*grhoc(0:mrho1) +
704 1 grhos(0:mrho1)*grhos(0:mrho1)) +
708 gnorm = gnorm + dnorm*sum(gpts(:ntheta)*gpts(:ntheta))
711 SUBROUTINE evolve(g11)
725 REAL(rprec),
PARAMETER :: bmax = 0.15_dbl
726 REAL(rprec) :: ftest, dtau, otav, b1, fac
730 dtau = abs(one - ftest)
733 dtau = delt*otav + 1.e-3_dbl
734 dtau = min(bmax,dtau)
735 b1 = one - 0.5_dbl*dtau
736 fac = one/(one + 0.5_dbl*dtau)
737 xdot(:n2) = fac*(xdot(:n2)*b1-delt*gvec(:n2))
738 xvec(:n2) = xvec(:n2) + xdot(:n2)*delt
740 END SUBROUTINE evolve
741 SUBROUTINE fftrans(r0c, z0c, rhoc, rhos, rbc, zbs, rbs, zbc,
752 REAL(rprec),
DIMENSION(nphi) :: r0c, z0c
753 REAL(rprec),
DIMENSION(0:mrho-1,nphi) :: rhoc, rhos
754 REAL(rprec),
DIMENSION(0:mpol-1,-nphi2:nphi2) ::
756 REAL(rprec),
DIMENSION(0:nphi2) :: rmnaxis, zmnaxis
760 INTEGER :: i, mn, mREAL, nreal
761 REAL(rprec),
DIMENSION(nv) :: INTgrate, argi
762 REAL(rprec) :: delphi,dn,rmc_p,zms_p,rms_p,zmc_p,
771 argi(i) = twopi*(i - 1)/real(nphi*nfp,rprec)
774 rbc = 0; zbs = 0; rbs = 0; zbc = 0
781 CALL getrz(rmc_p,rms_p,zmc_p,zms_p,r0c(i),z0c(i),
782 1 rhoc(0,i),rhos(0,i),mreal,mrho)
786 rbc(mreal,nreal) = rbc(mreal,nreal) + intgrate(i)*(tcosn*
787 1 rmc_p + tsinn*rms_p)
788 zbs(mreal,nreal) = zbs(mreal,nreal) + intgrate(i)*(tcosn*
789 1 zms_p - tsinn*zmc_p)
790 zbc(mreal,nreal) = zbc(mreal,nreal) + intgrate(i)*(tcosn*
791 1 zmc_p + tsinn*zms_p)
792 rbs(mreal,nreal) = rbs(mreal,nreal) + intgrate(i)*(tcosn*
793 1 rms_p - tsinn*rmc_p)
795 IF (mreal.eq.0 .and. nreal.eq.0)
THEN
796 rmnaxis(0) = dot_product(intgrate(:nphi),raxis(:nphi))
798 ELSE IF (mreal.eq.0 .and. nreal.gt.0)
THEN
799 rbc(0,nreal) = 2*rbc(0,nreal)
800 rbs(0,nreal) = 2*rbs(0,nreal)
801 zbc(0,nreal) = 2*zbc(0,nreal)
802 zbs(0,nreal) = 2*zbs(0,nreal)
803 rmnaxis(nreal) = zero
804 zmnaxis(nreal) = zero
805 rmnaxis(nreal) = rmnaxis(nreal) + sum(2*intgrate(:nphi)*
806 1 raxis(:nphi)*cos(dn*argi(:nphi)))
807 zmnaxis(nreal) = zmnaxis(nreal) - sum(2*intgrate(:nphi)*
808 1 zaxis(:nphi)*sin(dn*argi(:nphi)))
812 END SUBROUTINE fftrans
813 SUBROUTINE printit(rin,zin,rbc,zbs,rbs,zbc,rmnaxis,zmnaxis,g2)
824 REAL(rprec),
DIMENSION(*) :: rin, zin
825 REAL(rprec),
DIMENSION(0:mpol - 1,-nphi2:nphi2) ::
827 REAL(rprec),
DIMENSION(0:nphi2) :: rmnaxis, zmnaxis
831 INTEGER :: i, m, n, n11
833 CHARACTER*250 :: form_string
836 g2%rbc=0 ; g2%rbs=0 ; g2%zbs=0 ; g2%zbc=0 ;
837 g2%rbc(0:mu-1,0)=rbc(0:mu-1,0)
838 g2%rbs(0:mu-1,0)=rbs(0:mu-1,0)
839 g2%zbc(0:mu-1,0)=zbc(0:mu-1,0)
840 g2%zbs(0:mu-1,0)=zbs(0:mu-1,0)
842 OPEN(unit=10, file=
'plotout', status=
'unknown')
843 WRITE (10, 1990) mpol, ntheta, nphi, mpol - 1, nphi2, nfp, mpnt
845 DO i = 1, nphi*ntheta
846 WRITE (10, 1995) rin(i), zin(i)
848 1995
FORMAT(1p,2e12.4)
855 10
FORMAT(/
' MB NB RBC RBS ',
856 1
'ZBC ZBS RAXIS ZAXIS')
857 tol = 1.e-6_dbl*abs(rbc(1,0))
861 IF (.not.(abs(rbc(m,n)).lt.tol .and. abs(zbs(m,n)).lt.tol
862 1 .and. abs(rbs(m,n)).lt.tol .and. abs(zbc(m,n)).lt.tol))
864 IF (m.eq.0 .and. n.ge.0)
THEN
874 30
FORMAT(i5,i4,1p,6e12.4)
875 40
FORMAT(i5,i4,1p,4e12.4)
876 2000
FORMAT(1p,4e12.4)
882 WRITE(67,fmt=
'('' MPOL = '',i2.2)')mpol
885 IF (.not.(abs(rbc(m,n)).lt.tol .and. abs(zbs(m,n)).lt.tol
886 1 .and. abs(rbs(m,n)).lt.tol .and. abs(zbc(m,n)).lt.tol))
889 IF (n .lt. 0) n11 = n11+1
890 WRITE(form_string,
'(a,4(a,i1,a,i1,a))')
"(2x,",
891 1
"'RBC(',i",n11,
",',',i",m/10+1,
",') = ',1p,e14.6,3x,",
892 2
"'RBS(',i",n11,
",',',i",m/10+1,
",') = ',e14.6,3x,",
893 3
"'ZBC(',i",n11,
",',',i",m/10+1,
",') = ',e14.6,3x,",
894 4
"'ZBS(',i",n11,
",',',i",m/10+1,
",') = ',e14.6)"
895 WRITE(form_string,
'(a,4(a,i1,a,i1,a))')
"(2x,",
896 1
"'RBC(',i",n11,
",',',i",m/10+1,
",') = ',1p,e14.6,3x,",
897 2
"'RBS(',i",n11,
",',',i",m/10+1,
",') = ',e14.6,3x,/,4x,",
898 3
"'ZBC(',i",n11,
",',',i",m/10+1,
",') = ',e14.6,3x,",
899 4
"'ZBS(',i",n11,
",',',i",m/10+1,
",') = ',e14.6)"
901 WRITE(67, form_string) n,m,rbc(m,n), n,m,rbs(m,n),
902 1 n,m,zbc(m,n), n,m,zbs(m,n)
910 END SUBROUTINE printit
911 SUBROUTINE getrz(rmc,rms,zmc,zms,r0c,z0c,rhoc,rhos,m,mrho_in)
917 REAL(rprec),
DIMENSION(0:mrho_in-1) :: rhoc, rhos
918 REAL(rprec) :: rmc, rms, zmc, zms, r0c, z0c
933 ELSE IF (m .lt. mrho1)
THEN
934 rmc = (t1m(m)*rhoc(m-1) + t2m(m)*rhoc(m+1))
935 zms = (t1m(m)*rhoc(m-1) - t2m(m)*rhoc(m+1))
936 rms = (t1m(m)*rhos(m-1) + t2m(m)*rhos(m+1))
937 zmc =-(t1m(m)*rhos(m-1) - t2m(m)*rhos(m+1))
939 rmc = t1m(m)*rhoc(m-1) * hb_parameter
940 zms = rmc * hb_parameter
941 rms = t1m(m)*rhos(m-1) * hb_parameter
942 zmc =-rms * hb_parameter
946 SUBROUTINE getangle(rval, zval, angle, rcenter, zcenter)
956 REAL(rprec),
DIMENSION(ntheta, nphi) :: rval, zval, angle
957 REAL(rprec),
DIMENSION(nv) :: rcenter, zcenter
961 INTEGER :: i, j, iterate
962 REAL(rprec),
DIMENSION(nv) ::
963 1 rcos, rsin, zcos, zsin, phiangle
964 REAL(rprec) :: xc, yc, dnum, denom, delangle
972 angle(j,i) = twopi*(j - 1)/real(ntheta,rprec)
982 xc = rval(j,i) - rcenter(i)
983 yc = zval(j,i) - zcenter(i)
984 rcos(i) = rcos(i) + cos(angle(j,i))*xc
985 rsin(i) = rsin(i) + sin(angle(j,i))*xc
986 zcos(i) = zcos(i) + cos(angle(j,i))*yc
987 zsin(i) = zsin(i) + sin(angle(j,i))*yc
995 dnum = sum(zsin(:nphi))
996 denom = sum(rcos(:nphi))
997 IF (denom .ne. zero)
THEN
998 elongate = dnum/denom
1005 phiangle(i) = atan2(elongate*zcos(i)-rsin(i),
1006 1 elongate*zsin(i)+rcos(i))
1007 delangle = max(delangle,abs(phiangle(i)))
1008 angle(:,i) = angle(:,i) + phiangle(i)
1010 IF (delangle < 0.02_dbl)
EXIT
1016 1010
FORMAT(
' Average elongation = ',1pe10.4,/,
' Raxis = ',1pe12.4,
1017 1
' Zaxis = ',1pe12.4)
1018 1020
FORMAT(
' Number of Theta Points Matched = ',i5,/,
1019 1
' Number Phi Planes = ',i5)
1021 END SUBROUTINE getangle
1022 SUBROUTINE restart(irst)
1036 INTEGER,
SAVE :: nresets = 0
1045 xstore(:n2) = xvec(:n2)
1050 xvec(:n2) = xstore(:n2)
1053 nresets = nresets + 1
1054 IF (nresets .ge. 100)
THEN
1055 print *,
' Time step reduced 100 times without convergence'
1061 END SUBROUTINE restart
1062 SUBROUTINE order(rval, zval, xaxis, yaxis, inside)
1073 REAL(rprec) xaxis, yaxis
1074 REAL(rprec),
DIMENSION(*) :: rval, zval
1078 INTEGER :: i, ip1, i1, j, next
1079 REAL(rprec),
DIMENSION(nu) :: tempr, tempz
1081 1 newdist,olddist,shortest,saver,savez,residue,x,y,dx,dy
1094 DO i = 1, ntheta - 1
1097 shortest = 1.e20_dbl
1100 IF (i1 > 1) olddist = (rval(i1-1)-rval(j))**2 + (zval(i1-1)-
1102 newdist = (rval(i1)-rval(j))**2 + (zval(i1)-zval(j))**2
1103 IF (newdist.le.olddist .and. newdist<shortest)
THEN
1111 IF (shortest .ge. 1.e10_dbl)
THEN
1123 rval(ip1) = rval(next)
1126 zval(ip1) = zval(next)
1136 DO i = 1, ntheta - 1
1137 x = 0.5_dbl*(rval(i)+rval(i+1)) - xaxis
1138 y = 0.5_dbl*(zval(i)+zval(i+1)) - yaxis
1139 dx = rval(i+1) - rval(i)
1140 dy = zval(i+1) - zval(i)
1141 residue = residue + (x*dy - y*dx)/(x**2 + y**2 + 1.e-10_dbl)
1143 x = 0.5_dbl*(rval(1)+rval(ntheta)) - xaxis
1144 y = 0.5_dbl*(zval(1)+zval(ntheta)) - yaxis
1145 dx = rval(1) - rval(ntheta)
1146 dy = zval(1) - zval(ntheta)
1147 residue = residue + (x*dy - y*dx)/(x**2 + y**2 + 1.e-10_dbl)
1149 IF (residue < (-0.9_dbl*twopi))
THEN
1155 rval(2:ntheta) = tempr(2:ntheta)
1156 zval(2:ntheta) = tempz(2:ntheta)
1157 ELSE IF (abs(residue) < 0.9_dbl*twopi)
THEN
1158 print *,
' mag. axis not enclosed by bndry; trying again'
1159 WRITE (3, *)
' mag. axis not enclosed by bndry; trying again'
1164 END SUBROUTINE order
1165 SUBROUTINE evals_boundary(g2,xp,yp,icount)
1168 REAL(rprec),
DIMENSION(0:mu-1,0:0) :: rbc,zbs,rbs,zbc
1169 real*4,
DIMENSION(:),
ALLOCATABLE :: rb, zb
1170 real*4,
DIMENSION(*) :: xp, yp
1175 rbc(0:mu-1,0)=g2%rbc(0:mu-1,0)
1176 rbs(0:mu-1,0)=g2%rbs(0:mu-1,0)
1177 zbc(0:mu-1,0)=g2%zbc(0:mu-1,0)
1178 zbs(0:mu-1,0)=g2%zbs(0:mu-1,0)
1180 pit = 2.d0*pi/(ntheta - 1)
1182 IF(
ALLOCATED(rb) )
DEALLOCATE(rb,zb)
1183 ALLOCATE ( rb(ntheta+1), zb(ntheta+1) )
1194 cosa=cos(arg);sina=sin(arg)
1195 r=r+rbc(m,n)*cosa+rbs(m,n)*sina
1196 z=z+zbc(m,n)*cosa+zbs(m,n)*sina
1203 xp(1:icount)=rb(1:icount)
1204 yp(1:icount)=zb(1:icount)
1206 END SUBROUTINE evals_boundary