112 LOGICAL,
PRIVATE,
SAVE :: &
118 INTEGER,
PRIVATE,
SAVE :: &
125 INTEGER,
PRIVATE,
SAVE,
ALLOCATABLE :: &
131 INTEGER,
PRIVATE,
SAVE :: &
136 REAL(KIND=rspec),
PRIVATE,
SAVE :: &
140 REAL(KIND=rspec),
PRIVATE,
SAVE,
ALLOCATABLE :: &
146 REAL(KIND=rspec),
PRIVATE,
SAVE :: &
152 REAL(KIND=rspec),
PRIVATE,
SAVE,
ALLOCATABLE :: &
159 REAL(KIND=rspec),
PRIVATE,
SAVE,
ALLOCATABLE :: &
175 REAL(KIND=rspec),
PRIVATE,
SAVE :: &
182 REAL(KIND=rspec),
PRIVATE,
PARAMETER :: &
186 REAL(KIND=rspec),
PRIVATE,
SAVE :: &
196 SUBROUTINE ajax_load_rzbdy(r0,a0,s0,e0,e1,d1, &
198 NRHO_AJAX,NTHETA_AJAX,NKLAM_AJAX,RHOMAX_AJAX)
208 REAL(KIND=rspec),
INTENT(IN) :: &
217 CHARACTER(LEN=1024),
INTENT(OUT) :: &
220 INTEGER,
INTENT(OUT) :: &
227 INTEGER,
INTENT(IN),
OPTIONAL :: &
235 REAL(KIND=rspec),
INTENT(IN),
OPTIONAL :: &
242 i,k,nk_rz,nk_lam,nr_rz,nthetal
244 INTEGER,
ALLOCATABLE :: &
247 REAL(KIND=rspec) :: &
250 REAL(KIND=rspec),
ALLOCATABLE :: &
251 rho_rz(:),r(:,:),z(:,:)
261 IF(
PRESENT(rhomax_ajax))
THEN
271 IF(
PRESENT(nrho_ajax))
THEN
281 IF(
PRESENT(nklam_ajax))
THEN
291 IF(
PRESENT(ntheta_ajax))
THEN
302 ALLOCATE(m(nk_lam), &
306 m(:)=(/ (k-1,k=1,nk_lam) /)
319 c=4*dm1/(sqrt(1.0+32*dm1**2)+1.0)
325 em1=e1/(sqrt(1.0-c**2)*(1.0+2*dm1*c))
331 ALLOCATE(rho_rz(nr_rz), &
340 rho_rz(:)=(/ (real(i-1,rspec)/real(nr_rz-1,rspec),i=1,nr_rz) /)
346 r(i,1)=r0+a0*(s0*(1.0-r2)-dm1*r2)
348 z(i,2)=-r(i,2)*(e0*(1.0-r2)+em1*r2)
355 CALL ajax_load_rzlam(nr_rz,nk_rz,rho_rz,m,n,r,z, &
358 ntheta_ajax=nthetal, &
359 rhomax_ajax=rhomaxl, &
363 IF(iflag /= 0) message=
'AJAX_LOAD_RZBDY '// message
370 IF(
ALLOCATED(m))
THEN
378 IF(
ALLOCATED(rho_rz))
THEN
387 END SUBROUTINE ajax_load_rzbdy
389 SUBROUTINE ajax_load_rzlam(nr_rz,nk_rz,rho_rz,m,n,r,z, &
391 K_GRID,L_MFILTER_AJAX,NRHO_AJAX,NTHETA_AJAX, &
392 NZETA_AJAX,RHOMAX_AJAX,NR_LAM,NK_LAM,RHO_LAM,LAM)
416 INTEGER,
INTENT(IN) :: &
422 REAL(KIND=rspec),
INTENT(IN) :: &
428 CHARACTER(LEN=1024),
INTENT(OUT) :: &
431 INTEGER,
INTENT(OUT) :: &
438 LOGICAL,
INTENT(IN),
OPTIONAL :: &
441 INTEGER,
INTENT(IN),
OPTIONAL :: &
456 REAL(KIND=rspec),
INTENT(IN),
OPTIONAL :: &
465 i,j,k,kmax,nset1,k_grid_l,k_vopt(1:3)=(/1,0,0/),k_bc1=3,k_bcn=0
467 REAL(KIND=rspec),
ALLOCATABLE :: &
468 rho(:),rmn(:,:),zmn(:,:),fspl(:,:),values(:,:)
480 IF(
PRESENT(nk_lam))
THEN
486 klam_3d=max(krz_3d,8)
490 kmax=max(krz_3d,klam_3d)
498 IF(n(k) /= 0) i=min(i,abs(n(k)))
523 message=
'AJAX_LOAD_RZLAM/ERROR(1):periodicity not found'
538 IF(
PRESENT(nrho_ajax))
THEN
551 IF(
PRESENT(ntheta_ajax))
THEN
554 ntheta_3d=ntheta_ajax
557 IF(mod(ntheta_3d,2) == 0)
THEN
559 ntheta_3d=ntheta_3d+1
561 message=
'AJAX_LOAD_RZLAM/WARNING(2):poloidal nodes reset'
567 IF(nper_3d == 0)
THEN
571 ntheta_3d=4*klam_3d+1
584 IF(
PRESENT(nzeta_ajax))
THEN
589 IF(nper_3d == 0 .AND. nzeta_3d /= 1)
THEN
593 message=
'AJAX_LOAD_RZLAM/WARNING(3):toroidal nodes reset to 1'
598 IF(mod(nzeta_3d,2) == 0)
THEN
602 message=
'AJAX_LOAD_RZLAM/WARNING(4):toroidal nodes reset'
606 ELSEIF(nper_3d == 0)
THEN
620 IF(
PRESENT(l_mfilter_ajax))
THEN
623 l_mfilter_3d=l_mfilter_ajax
636 IF(
PRESENT(rhomax_ajax))
THEN
639 rhomax_3d=rhomax_ajax
654 IF(abs(m(k)) == 0 .AND. n(k) == 0) km0n0_3d=k
655 IF(abs(m(k)) == 1 .AND. n(k) == 0) km1n0_3d=k
656 IF(km0n0_3d /= 0 .AND. km1n0_3d /= 0)
EXIT loop_k
671 m_3d(1:kmax)=m(1:kmax)
672 n_3d(1:kmax)=n(1:kmax)
677 mabs_3d(k)=abs(m_3d(k))
680 IF(l_mfilter_3d)
THEN
682 IF(mabs_3d(k) > 3)
THEN
685 IF(mod(mabs_3d(k),2) == 0)
THEN
712 IF(rho_rz(1) > rhores_3d)
THEN
716 ALLOCATE(rho(nset1), &
723 rho(2:nset1)=rho_rz(1:nr_rz)/rho_rz(nr_rz)
724 rmn(2:nset1,1:nk_rz)=r(1:nr_rz,1:nk_rz)
725 zmn(2:nset1,1:nk_rz)=z(1:nr_rz,1:nk_rz)
731 ALLOCATE(rho(nset1), &
738 rho(1:nset1)=rho_rz(1:nset1)/rho_rz(nset1)
739 rmn(1:nset1,1:nk_rz)=r(1:nset1,1:nk_rz)
740 zmn(1:nset1,1:nk_rz)=z(1:nset1,1:nk_rz)
746 IF(
PRESENT(k_grid)) k_grid_l=k_grid
748 IF(k_grid_l == 1)
THEN
751 rho(:)=sqrt(rho(:))*rhomax_3d
753 ELSEIF(k_grid_l == 0)
THEN
756 rho(:)=rho(:)*rhomax_3d
762 message=
'AJAX_LOAD_RZLAM/ERROR(5):unallowed choice of K_GRID'
771 ALLOCATE(fspl(4,nset1), &
782 rmn(i,k)=rmn(i,k)/rho(i)**mabs_3d(k)
783 zmn(i,k)=zmn(i,k)/rho(i)**mabs_3d(k)
788 rmn(1,k)=(rmn(2,k)*rho(3)**2-rmn(3,k)*rho(2)**2)/(rho(3)**2-rho(2)**2)
789 zmn(1,k)=(zmn(2,k)*rho(3)**2-zmn(3,k)*rho(2)**2)/(rho(3)**2-rho(2)**2)
792 fspl(1,1:nset1)=rmn(1:nset1,k)
795 CALL spline1_interp(k_vopt,nset1,rho,fspl,nrho_3d,rho_3d,values, &
803 message=
'AJAX_LOAD_RZLAM(6) '// message
809 r_3d(1,1:nrho_3d,k)=values(1,1:nrho_3d)
810 CALL spline1_fit(nrho_3d,rho_3d,r_3d(:,:,k), &
815 fspl(1,1:nset1)=zmn(1:nset1,k)
818 CALL spline1_interp(k_vopt,nset1,rho,fspl,nrho_3d,rho_3d, &
819 values,iflag,message, &
826 message=
'AJAX_LOAD_RZLAM(7) '// message
832 z_3d(1,1:nrho_3d,k)=values(1,1:nrho_3d)
833 CALL spline1_fit(nrho_3d,rho_3d,z_3d(:,:,k), &
840 r000_3d=r_3d(1,1,km0n0_3d)
845 IF(
PRESENT(nr_lam) .AND. &
846 PRESENT(nk_lam) .AND. &
847 PRESENT(rho_lam) .AND. &
853 CALL ajax_load_lambda(k_grid_l,nr_lam,nk_lam,rho_rz(nr_rz), &
854 rho_lam,lam,iflag,message)
857 IF(iflag /= 0) message=
'AJAX_LOAD_RZLAM(8) '// message
859 ELSEIF(nper_3d == 0)
THEN
865 CALL ajax_init_fluxav_g(iflag,message)
870 message=
'AJAX_LOAD_RZLAM(9) '// message
871 IF(iflag > 0)
GOTO 9999
877 CALL ajax_init_lambda
883 message=
'AJAX_LOAD_RZLAM/ERROR(10):need lambdas'
892 IF(
ALLOCATED(rho))
THEN
901 IF(
ALLOCATED(fspl))
THEN
909 END SUBROUTINE ajax_load_rzlam
911 SUBROUTINE ajax_load_magflux(phitot,k_pflx,nr_pflx,rho_pflx,pflx, &
921 INTEGER,
INTENT(IN) :: &
928 REAL(KIND=rspec),
INTENT(IN) :: &
937 CHARACTER(LEN=1024),
INTENT(OUT) :: &
940 INTEGER,
INTENT(OUT) :: &
948 INTEGER,
PARAMETER :: &
949 k_vopt(1:3)=(/1,0,0/),k_bc1=3,k_bcn=0
954 REAL(KIND=rspec) :: &
955 fspl(1:4,1:nr_pflx),values(1:3,1:nrho_3d)
967 IF(
ALLOCATED(iotabar_3d))
THEN
970 nset1=
SIZE(iotabar_3d,2)
973 IF(nset1 /= nrho_3d)
THEN
976 DEALLOCATE(iotabar_3d)
977 ALLOCATE(iotabar_3d(4,nrho_3d))
986 ALLOCATE(iotabar_3d(4,nrho_3d))
1004 IF(k_pflx == 1)
THEN
1007 fspl(1,1:nr_pflx)=pflx(1:nr_pflx)
1009 ELSEIF(k_pflx == 2)
THEN
1012 fspl(1,1:nr_pflx)=pflx(1:nr_pflx)/rho_pflx(1:nr_pflx)
1013 fspl(1,1:nr_pflx)=rhomax_3d**2/phitot_3d/2*fspl(1,1:nr_pflx)
1018 fspl(1,1:nr_pflx)=1/pflx(1:nr_pflx)
1025 CALL spline1_interp(k_vopt,nr_pflx,rho_pflx,fspl,nrho_3d,rho_3d, &
1026 values,iflag,message, &
1033 message=
'AJAX_LOAD_MAGFLUX(2) '// message
1040 iotabar_3d(1,1:nrho_3d)=values(1,1:nrho_3d)
1043 IF(rho_pflx(1) > rhores_3d)
THEN
1045 iotabar_3d(1,1)=iotabar_3d(2,1)-rho_3d(2)*(iotabar_3d(3,1)-iotabar_3d(2,1)) &
1046 /(rho_3d(3)-rho_3d(2))
1050 CALL spline1_fit(nrho_3d,rho_3d,iotabar_3d, &
1057 signbt_3d=sign(1.0_rspec,phitot_3d)
1058 signbp_3d=sign(1.0_rspec,iotabar_3d(1,nrho_3d))*signbt_3d
1063 l_fluxavb_3d=.false.
1070 END SUBROUTINE ajax_load_magflux
1072 SUBROUTINE ajax_car2cyl(r_car, &
1082 REAL(KIND=rspec),
INTENT(IN) :: &
1086 REAL(KIND=rspec),
INTENT(OUT) :: &
1098 r_cyl(1)=sqrt(r_car(1)**2+r_car(2)**2)
1099 r_cyl(2)=atan2(r_car(2),r_car(1))
1103 IF(r_cyl(2) < 0.0) r_cyl(2)=r_cyl(2)+2*z_pi
1105 END SUBROUTINE ajax_car2cyl
1107 SUBROUTINE ajax_cyl2car(r_cyl, &
1117 REAL(KIND=rspec),
INTENT(IN) :: &
1121 REAL(KIND=rspec),
INTENT(OUT) :: &
1133 r_car(1)=r_cyl(1)*cos(r_cyl(2))
1134 r_car(2)=r_cyl(1)*sin(r_cyl(2))
1137 END SUBROUTINE ajax_cyl2car
1139 SUBROUTINE ajax_cyl2flx(r_cyl, &
1163 REAL(KIND=rspec),
INTENT(IN) :: &
1167 REAL(KIND=rspec),
INTENT(INOUT) :: &
1171 CHARACTER(LEN=1024),
INTENT(OUT) :: &
1174 INTEGER,
INTENT(OUT) :: &
1181 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
1193 REAL(KIND=rspec) :: &
1194 dr,dr0,dr1,dz,dz0,dz1,drho,dtheta,err0,err1,gsqrt1,tau0,tau1, &
1197 REAL(KIND=rspec) :: &
1198 r_flx0(1:3),g_cyl0(1:6),r_flx1(1:3),r_cyl1(1:3),g_cyl1(1:6), &
1217 tol=0.1*rhores_3d/rhomax_3d
1231 r_flx0(1:3)=r_flx(1:3)
1232 r_flx1(1:3)=r_flx(1:3)
1235 IF(r_flx1(1) < rhores_3d) r_flx1(1)=rhores_3d
1245 CALL ajax_flx2cyl(r_flx1,r_cyl1,iflag,message, &
1253 message=
'AJAX_CYL2FLX(1) '// message
1254 IF(iflag > 0)
GOTO 9999
1258 dr1=(r_cyl(1)-r_cyl1(1))
1259 dz1=(r_cyl(3)-r_cyl1(3))
1260 err1=(dr1**2+dz1**2)/r000_3d**2
1263 IF((abs(dr1) <= tol*r000_3d .AND. abs(dz1) <= tol*r000_3d) &
1264 .OR. (abs(err1-err0) < 5.0e-6))
THEN
1267 IF(r_flx1(1) > rhomax_3d)
THEN
1270 message=
'AJAX_CYL2FLX(2)/WARNING:outside R,Z domain'
1275 r_flx(1:3)=r_flx1(1:3)
1276 IF(r_flx(2) < 0.0) r_flx(2)=r_flx(2)+2*z_pi
1277 r_flx(2)=mod(r_flx(2),2*z_pi)
1278 IF(
PRESENT(gsqrt)) gsqrt=gsqrt1
1279 IF(
PRESENT(g_cyl)) g_cyl(:)=g_cyl1(:)
1280 IF(
PRESENT(tau)) tau=tau1
1286 IF(r_flx1(1) < rhores_3d) r_flx1(1)=rhores_3d
1288 IF(abs(tau1) < 10*z_small)
THEN
1293 message=
'AJAX_CYL2FLX(3)/WARNING:solution at origin'
1300 IF(sign(1.0_rspec,tau1) /= sign(1.0_rspec,tau0) .AND. tau0 /= 0.0)
THEN
1304 message=
'AJAX_CYL2FLX(4)/ERROR:bad Jacobian'
1310 IF(err1 < err0)
THEN
1331 g_cylt(:)=0.75*g_cyl0(:)+0.25*g_cyl1(:)
1332 taut=0.75*tau0+0.25*tau1
1338 drho=(g_cylt(2)*dz-g_cylt(5)*dr)/taut
1340 dtheta=(g_cylt(4)*dr-g_cylt(1)*dz)/taut
1341 IF(abs(dtheta) > z_pi/4) dtheta=sign(z_pi/4,dtheta)
1344 r_flx1(1)=r_flx0(1)+drho
1345 r_flx1(2)=r_flx0(2)+dtheta
1347 IF(r_flx1(1) < 0.0)
THEN
1350 r_flx1(1)=-r_flx1(1)
1351 r_flx1(2)=r_flx1(2)+z_pi-2*dtheta
1359 message=
'AJAX_CYL2FLX(5)/ERROR:max iterations exceeded'
1366 END SUBROUTINE ajax_cyl2flx
1368 SUBROUTINE ajax_flx2cyl(r_flx, &
1369 r_cyl,iflag,message, &
1391 REAL(KIND=rspec),
INTENT(IN) :: &
1395 CHARACTER(LEN=1024),
INTENT(OUT) :: &
1398 INTEGER,
INTENT(OUT) :: &
1404 REAL(KIND=rspec),
INTENT(OUT) :: &
1408 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
1423 INTEGER,
PARAMETER :: &
1424 k_vopt(1:3)=(/1,1,0/)
1426 REAL(KIND=rspec) :: &
1427 ct,st,rho,rhom,drhom,rmnx,drmnx,zmnx,dzmnx,g_cylt(1:6),value(1:3)
1445 rho=min(r_flx(1),rhomax_3d)
1448 rho=max(rho,rhores_3d)
1457 ct=cos(m_3d(k)*r_flx(2)-n_3d(k)*r_flx(3))
1458 st=sin(m_3d(k)*r_flx(2)-n_3d(k)*r_flx(3))
1461 IF(mabs_3d(k) == 0)
THEN
1467 ELSEIF(r_flx(1) < rhomax_3d+rhores_3d)
THEN
1470 rhom=rho**mabs_3d(k)
1471 drhom=mabs_3d(k)*rho**(mabs_3d(k)-1)
1476 rhom=rhomax_3d**mabs_3d(k)
1482 CALL spline1_eval(k_vopt,nrho_3d,rho,rho_3d, &
1483 r_3d(1:4,1:nrho_3d,k),i,
value)
1488 CALL spline1_eval(k_vopt,nrho_3d,rho,rho_3d,z_3d(1:4,1:nrho_3d,k),i,
value)
1493 r_cyl(1)=r_cyl(1)+rmnx*ct*rhom
1496 r_cyl(3)=r_cyl(3)+zmnx*st*rhom
1499 g_cylt(2)=g_cylt(2)-m_3d(k)*rmnx*st*rhom
1502 g_cylt(3)=g_cylt(3)+n_3d(k)*rmnx*st*rhom
1505 g_cylt(5)=g_cylt(5)+m_3d(k)*zmnx*ct*rhom
1508 g_cylt(6)=g_cylt(6)-n_3d(k)*zmnx*ct*rhom
1511 IF(r_flx(1) <= rhomax_3d+rhores_3d)
THEN
1515 g_cylt(1)=g_cylt(1)+(drmnx*rhom+rmnx*drhom)*ct
1519 g_cylt(4)=g_cylt(4)+(dzmnx*rhom+zmnx*drhom)*st
1526 IF(r_flx(1) > rhomax_3d+rhores_3d)
THEN
1529 ct=cos(m_3d(km1n0_3d)*r_flx(2))
1530 st=sin(m_3d(km1n0_3d)*r_flx(2))
1531 r_cyl(1)=r_cyl(1)+(r_flx(1)-rhomax_3d)*r_3d(1,nrho_3d,km1n0_3d)*ct
1532 r_cyl(3)=r_cyl(3)+(r_flx(1)-rhomax_3d)*z_3d(1,nrho_3d,km1n0_3d)*st
1533 g_cylt(1)=r_3d(1,nrho_3d,km1n0_3d)*ct
1534 g_cylt(2)=g_cylt(2)-(r_flx(1)-rhomax_3d)*r_3d(1,nrho_3d,km1n0_3d)*st &
1536 g_cylt(4)=z_3d(1,nrho_3d,km1n0_3d)*st
1537 g_cylt(5)=g_cylt(5)+(r_flx(1)-rhomax_3d)*z_3d(1,nrho_3d,km1n0_3d)*ct &
1546 IF(
PRESENT(g_cyl)) g_cyl(:)=g_cylt(:)
1549 IF(
PRESENT(tau)) tau=g_cylt(2)*g_cylt(4)-g_cylt(1)*g_cylt(5)
1552 IF(
PRESENT(gsqrt)) gsqrt=r_cyl(1)*(g_cylt(2)*g_cylt(4)-g_cylt(1)*g_cylt(5))
1554 END SUBROUTINE ajax_flx2cyl
1556 SUBROUTINE ajax_b(r_flx,r_cyl,g_cyl, &
1558 B_CON,B_CO,B_CYL,B_CAR,B_POL,B_TOR,B_MOD)
1568 REAL(KIND=rspec),
INTENT(IN) :: &
1576 CHARACTER(LEN=1024),
INTENT(OUT) :: &
1579 INTEGER,
INTENT(OUT) :: &
1586 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
1597 REAL(KIND=rspec) :: &
1598 gsqrt,iotabar(1),phiprm(1),lam_theta,lam_zeta,b_cont(1:3), &
1612 gsqrt=r_cyl(1)*(g_cyl(2)*g_cyl(4)-g_cyl(1)*g_cyl(5))
1615 CALL ajax_lambda(r_flx, &
1619 CALL ajax_magflux(1,r_flx, &
1621 iotabar_r=iotabar, &
1627 message=
'AJAX_B '// message
1628 IF (iflag > 0 )
GOTO 9999
1639 b_cont(2)=phiprm(1)*(iotabar(1)-lam_zeta)/(2*z_pi*gsqrt)
1642 b_cont(3)=phiprm(1)*(1.0_rspec+lam_theta)/(2*z_pi*gsqrt)
1644 IF(
PRESENT(b_con)) b_con(1:3)=b_cont(1:3)
1649 IF(
PRESENT(b_cyl) .OR. &
1650 PRESENT(b_co) .OR. &
1651 PRESENT(b_car) .OR. &
1652 PRESENT(b_pol) .OR. &
1653 PRESENT(b_tor) .OR. &
1654 PRESENT(b_mod))
THEN
1657 b_cylt(1)=g_cyl(2)*b_cont(2)+g_cyl(3)*b_cont(3)
1660 b_cylt(2)=r_cyl(1)*b_cont(3)
1663 b_cylt(3)=g_cyl(5)*b_cont(2)+g_cyl(6)*b_cont(3)
1665 IF(
PRESENT(b_cyl)) b_cyl(1:3)=b_cylt(1:3)
1670 IF(
PRESENT(b_co))
THEN
1673 b_co(1)=b_cylt(1)*g_cyl(1)+b_cylt(3)*g_cyl(4)
1676 b_co(2)=b_cylt(1)*g_cyl(2)+b_cylt(3)*g_cyl(5)
1679 b_co(3)=b_cylt(1)*g_cyl(3)+b_cylt(2)*r_cyl(1)+b_cylt(3)*g_cyl(6)
1686 IF(
PRESENT(b_car))
THEN
1689 b_car(1)=b_cylt(1)*cos(r_cyl(2))-b_cylt(2)*sin(r_cyl(2))
1692 b_car(2)=b_cylt(1)*sin(r_cyl(2))+b_cylt(2)*cos(r_cyl(2))
1702 IF(
PRESENT(b_pol))
THEN
1705 b_pol=signbp_3d*sqrt(b_cylt(1)**2+b_cylt(3)**2)
1712 IF(
PRESENT(b_tor))
THEN
1722 IF(
PRESENT(b_mod))
THEN
1725 b_mod=sqrt(b_cylt(1)**2+b_cylt(2)**2+b_cylt(3)**2)
1736 END SUBROUTINE ajax_b
1738 SUBROUTINE ajax_lambda(r_flx, &
1753 REAL(KIND=rspec),
INTENT(IN) :: &
1757 REAL(KIND=rspec),
INTENT(OUT) :: &
1763 INTEGER,
PARAMETER :: &
1764 k_vopt(1:3)=(/1,0,0/)
1772 REAL(KIND=rspec) :: &
1773 value(1:3),cosk,lam,rho
1786 rho=min(r_flx(1),rhomax_3d)
1789 rho=max(rho,rhores_3d)
1797 cosk=cos(m_3d(k)*r_flx(2)-n_3d(k)*r_flx(3))
1798 CALL spline1_eval(k_vopt,nrho_3d,rho,rho_3d,lam_3d(1:4,1:nrho_3d,k),i,
value)
1800 lam=value(1)*rho**mabs_3d(k)
1801 lam_theta=lam_theta+lam*m_3d(k)*cosk
1802 lam_zeta=lam_zeta-lam*n_3d(k)*cosk
1806 END SUBROUTINE ajax_lambda
1808 SUBROUTINE ajax_fluxav_b(nrho_r,rho_r, &
1810 B2_R,BM2_R,FM_R,FTRAP_R,GR2BM2_R,GRTH_R,SUS11_R, &
1811 SUS12_R,SUS21_R,SUS22_R)
1820 INTEGER,
INTENT(IN) :: &
1823 REAL(KIND=rspec),
INTENT(IN) :: &
1827 CHARACTER(LEN=1024),
INTENT(OUT) :: &
1830 INTEGER,
INTENT(OUT) :: &
1837 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
1854 REAL(KIND=rspec) :: &
1857 REAL(KIND=rspec) :: &
1858 b(1:nrho_3d),b2(1:nrho_3d),bmax(1:nrho_3d), &
1859 captheta(1:nrho_3d,1:ntheta_3d), &
1860 gam(1:nrho_3d),v1(1:nrho_3d),v2(1:nrho_3d)
1862 REAL(KIND=rspec) :: &
1875 IF(.NOT. l_fluxavg_3d)
THEN
1879 CALL ajax_init_fluxav_g(iflag,message)
1884 message=
'AJAX_FLUXAV_B(1) ' // message
1891 IF(.NOT. l_fluxavb_3d)
CALL ajax_init_fluxav_b
1896 loop_i1:
DO i=nrho_r,1,-1
1899 IF(rho_r(nr) < rhomax_3d+rhores_3d)
EXIT loop_i1
1906 IF(
PRESENT(b2_r) .OR. &
1907 PRESENT(fm_r) .OR. &
1908 PRESENT(ftrap_r))
THEN
1920 gt_3d(1:ntheta_3d)=gsqrt_3d(i,1:ntheta_3d,k)*b_3d(i,1:ntheta_3d,k)**2
1921 az_3d(k)=sum(wtheta_3d*gt_3d)
1925 b2(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
1930 b2(1)=b2(2)-rho_3d(2)*(b2(3)-b2(2))/(rho_3d(3)-rho_3d(2))
1937 IF((
PRESENT(fm_r) .OR. &
1938 PRESENT(grth_r)) .AND. &
1950 captheta(i,j)=captheta(i,j-1)+dtheta_3d/2 &
1951 *(b_3d(i,j-1,1)/btheta_3d(i,j-1,1) &
1952 +b_3d(i,j,1)/btheta_3d(i,j,1))
1956 gam(i)=2*z_pi/captheta(i,ntheta_3d)
1957 captheta(i,1:ntheta_3d)=gam(i)*captheta(i,1:ntheta_3d)
1962 gam(1)=gam(2)-rho_3d(2)*(gam(3)-gam(2))/(rho_3d(3)-rho_3d(2))
1969 IF(
PRESENT(b2_r))
THEN
1977 CALL linear1_interp(nrho_3d,rho_3d,b2,nr,rho_r,b2_r,iflag,message)
1982 message=
'AJAX_FLUXAV_B(2) ' // message
1983 IF(iflag > 0)
GOTO 9999
1987 IF(nr < nrho_r)
THEN
1990 b2_r(nr+1:nrho_r)=b2_r(nr)
1999 IF(
PRESENT(bm2_r))
THEN
2012 gt_3d(1:ntheta_3d)=gsqrt_3d(i,1:ntheta_3d,k)/b_3d(i,1:ntheta_3d,k)**2
2013 az_3d(k)=sum(wtheta_3d*gt_3d)
2017 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2022 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2027 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,bm2_r,iflag,message)
2032 message=
'AJAX_FLUXAV_B(3) ' // message
2033 IF(iflag > 0)
GOTO 9999
2037 IF(nr < nrho_r)
THEN
2040 bm2_r(nr+1:nrho_r)=bm2_r(nr)
2049 IF(
PRESENT(gr2bm2_r))
THEN
2052 gr2bm2_r(1:nrho_r)=0
2061 gt_3d(1:ntheta_3d)=((gcyl_3d(3,i,1:ntheta_3d,k) &
2062 *gcyl_3d(5,i,1:ntheta_3d,k) &
2063 -gcyl_3d(2,i,1:ntheta_3d,k) &
2064 *gcyl_3d(6,i,1:ntheta_3d,k))**2 &
2065 +rcyl_3d(i,1:ntheta_3d,k)**2 &
2066 *(gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2067 +gcyl_3d(5,i,1:ntheta_3d,k)**2)) &
2068 /gsqrt_3d(i,1:ntheta_3d,k)/b_3d(i,1:ntheta_3d,k)**2
2069 az_3d(k)=sum(wtheta_3d*gt_3d)
2073 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2078 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2083 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,gr2bm2_r,iflag,message)
2088 message=
'AJAX_FLUXAV_B(4) ' // message
2089 IF(iflag > 0)
GOTO 9999
2093 IF(nr < nrho_r)
THEN
2096 gr2bm2_r(nr+1:nrho_r)=gr2bm2_r(nr)
2105 IF(
PRESENT(ftrap_r))
THEN
2122 gt_3d(j)=b_3d(i,j,k)*gsqrt_3d(i,j,k)
2123 IF(b_3d(i,j,k) > bmax(i)) bmax(i)=b_3d(i,j,k)
2127 az_3d(k)=sum(wtheta_3d*gt_3d)
2131 b(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2136 b(1)=b(2)-rho_3d(2)*(b(3)-b(2))/(rho_3d(3)-rho_3d(2))
2137 bmax(1)=bmax(2)-rho_3d(2)*(bmax(3)-bmax(2))/(rho_3d(3)-rho_3d(2))
2147 h=b_3d(i,j,k)/bmax(i)
2148 gt_3d(j)=(1.0-sqrt(1.0-h)*(1.0+h/2))/h**2*gsqrt_3d(i,j,k)
2152 az_3d(k)=sum(wtheta_3d*gt_3d)
2156 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2160 v1(i)=((1.0-b2(i)/bmax(i)**2*v1(i))/4+0.75*(1.0-b2(i)/b(i)**2 &
2161 *(1.0-sqrt(1.0-h)*(1.0+h/2))))/sqrt(rho_3d(i))
2168 loop_i2:
DO i=1,nrho_r
2171 IF(rho_3d(j) > rhomin_3d)
EXIT loop_i2
2175 IF(j > 1) v1(1:j-1)=v1(j)
2180 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,ftrap_r,iflag,message)
2185 message=
'AJAX_FLUXAV_B(5) ' // message
2186 IF(iflag > 0)
GOTO 9999
2190 IF(nr < nrho_r)
THEN
2193 ftrap_r(nr+1:nrho_r)=ftrap_r(nr)
2198 ftrap_r(1:nrho_r)=ftrap_r(1:nrho_r)*sqrt(rho_r(1:nrho_r))
2205 IF(
PRESENT(fm_r))
THEN
2214 IF(nper_3d /= 0)
THEN
2220 v1(i)=1/abs(iotabar_3d(1,i))
2225 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2230 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,v_r,iflag,message)
2235 message=
'AJAX_FLUXAV_B(6) ' // message
2236 IF(iflag > 0)
GOTO 9999
2240 IF(nr < nrho_r)
THEN
2243 v_r(nr+1:nrho_r)=v_r(nr)
2250 IF(rho_r(1) > rhores_3d) j=1
2255 fm_r(2,i)=(rho_r(i)/r000_3d)**1.5
2258 fm_r(1,i)=r000_3d*v_r(i)/fm_r(2,i)
2272 IF(j == 1 .OR. j == ntheta_3d)
THEN
2275 dbdt=(b_3d(i,2,1)-b_3d(i,ntheta_3d-1,1))/2/dtheta_3d
2279 dbdt=(b_3d(i,j+1,1)-b_3d(i,j-1,1))/2/dtheta_3d
2284 gt_3d(j)=gsqrt_3d(i,j,1)*btheta_3d(i,j,1)/b_3d(i,j,1) &
2285 *sin(m*captheta(i,j))*dbdt
2289 v1(i)=2*z_pi*sum(wtheta_3d*gt_3d)/vp_3d(i)
2294 gt_3d(j)=gt_3d(j)*b_3d(i,j,1)*gam(i)
2298 v2(i)=v1(i)*2*z_pi*sum(wtheta_3d*gt_3d)/vp_3d(i)
2303 IF(j == 1 .OR. j == ntheta_3d)
THEN
2306 dbdt=(b_3d(i,2,1)-b_3d(i,ntheta_3d-1,1))/(2*dtheta_3d)
2310 dbdt=(b_3d(i,j+1,1)-b_3d(i,j-1,1))/2/dtheta_3d
2315 gt_3d(j)=gsqrt_3d(i,j,1)*btheta_3d(i,j,1)/b_3d(i,j,1) &
2316 *cos(m*captheta(i,j))*dbdt
2320 v1(i)=2*z_pi*sum(wtheta_3d*gt_3d) &
2324 gt_3d(:)=gt_3d(:)*b_3d(i,:,1)*gam(i)
2325 v2(i)=v2(i)+v1(i)*2*z_pi*sum(wtheta_3d*gt_3d)/vp_3d(i)
2328 gt_3d(:)=gsqrt_3d(i,:,1)*btheta_3d(i,:,1)
2329 v1(i)=2*z_pi*sum(wtheta_3d*gt_3d)/vp_3d(i)
2332 v2(i)=v2(i)*2/v1(i)/b2(i)/rho_3d(i)**1.5
2337 v2(1)=v2(2)-rho_3d(2)*(v2(3)-v2(2))/(rho_3d(3)-rho_3d(2))
2342 CALL linear1_interp(nrho_3d,rho_3d,v2,nr,rho_r,v_r,iflag,message)
2347 message=
'AJAX_FLUXAV_B(7) ' // message
2348 IF(iflag > 0)
GOTO 9999
2352 IF(nr < nrho_r)
THEN
2355 v_r(nr+1:nrho_r)=v_r(nr)
2360 fm_r(m,1:nrho_r)=v_r(1:nrho_r)*rho_r(1:nrho_r)**1.5
2371 IF(
PRESENT(grth_r))
THEN
2377 IF(nper_3d == 0)
THEN
2381 CALL linear1_interp(nrho_3d,rho_3d,gam,nr,rho_r,grth_r,iflag,message)
2386 message=
'AJAX_FLUXAV_B(8) ' // message
2387 IF(iflag > 0)
GOTO 9999
2393 IF(nr < nrho_r)
THEN
2396 grth_r(nr+1:nrho_r)=grth_r(nr)
2405 IF(
PRESENT(sus11_r))
THEN
2418 gt_3d(1:ntheta_3d)=( gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2419 +gcyl_3d(5,i,1:ntheta_3d,k)**2 ) &
2420 /gsqrt_3d(i,1:ntheta_3d,k)
2421 az_3d(k)=sum(wtheta_3d*gt_3d)
2426 v1(i)=sum(wzeta_3d*az_3d)/rho_3d(i)
2431 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2436 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,sus11_r,iflag,message)
2441 message=
'AJAX_FLUXAV_B(9) ' // message
2442 IF(iflag > 0)
GOTO 9999
2446 IF(nr < nrho_r)
THEN
2449 sus11_r(nrho_r+1:nr)=sus11_r(nr)
2454 sus11_r(1:nrho_r)=sus11_r(1:nrho_r)*rho_r(1:nrho_r)/4/z_pi**2
2461 IF(
PRESENT(sus12_r))
THEN
2474 gt_3d(1:ntheta_3d)=( ( gcyl_3d(2,i,1:ntheta_3d,k) &
2475 *gcyl_3d(3,i,1:ntheta_3d,k) &
2476 +gcyl_3d(5,i,1:ntheta_3d,k) &
2477 *gcyl_3d(6,i,1:ntheta_3d,k)) &
2478 *(1.0+eltheta_3d(i,1:ntheta_3d,k)) &
2479 -( gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2480 +gcyl_3d(5,i,1:ntheta_3d,k)**2 ) &
2481 *elzeta_3d(i,1:ntheta_3d,k) ) &
2482 /gsqrt_3d(i,1:ntheta_3d,k)
2483 az_3d(k)=sum(wtheta_3d*gt_3d)
2488 v1(i)=sum(wzeta_3d*az_3d)/rho_3d(i)
2493 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2498 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,sus12_r,iflag,message)
2503 message=
'AJAX_FLUXAV_B(10) ' // message
2504 IF(iflag > 0)
GOTO 9999
2508 IF(nr < nrho_r)
THEN
2511 sus12_r(nr+1:nrho_r)=sus12_r(nr)
2516 sus12_r(1:nrho_r)=sus12_r(1:nrho_r)*rho_r(1:nrho_r)/4/z_pi**2
2523 IF(
PRESENT(sus21_r))
THEN
2536 gt_3d(1:ntheta_3d)=( gcyl_3d(2,i,1:ntheta_3d,k) &
2537 *gcyl_3d(3,i,1:ntheta_3d,k) &
2538 +gcyl_3d(5,i,1:ntheta_3d,k) &
2539 *gcyl_3d(6,i,1:ntheta_3d,k) ) &
2540 /gsqrt_3d(i,1:ntheta_3d,k)
2541 az_3d(k)=sum(wtheta_3d*gt_3d)
2546 v1(i)=sum(wzeta_3d*az_3d)/rho_3d(i)
2551 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2556 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,sus21_r,iflag,message)
2561 message=
'AJAX_FLUXAV_B(11) ' // message
2562 IF(iflag > 0)
GOTO 9999
2566 IF(nr < nrho_r)
THEN
2569 sus21_r(nr+1:nrho_r)=sus21_r(nr)
2574 sus21_r(1:nrho_r)=sus21_r(1:nrho_r)*rho_r(1:nrho_r)/4/z_pi**2
2581 IF(
PRESENT(sus22_r))
THEN
2594 gt_3d(1:ntheta_3d)=( ( rcyl_3d(i,1:ntheta_3d,k)**2 &
2595 +gcyl_3d(3,i,1:ntheta_3d,k)**2 &
2596 +gcyl_3d(6,i,1:ntheta_3d,k)**2 ) &
2597 *(1.0+eltheta_3d(i,1:ntheta_3d,k)) &
2598 -( gcyl_3d(2,i,1:ntheta_3d,k) &
2599 *gcyl_3d(3,i,1:ntheta_3d,k) &
2600 +gcyl_3d(5,i,1:ntheta_3d,k) &
2601 *gcyl_3d(6,i,1:ntheta_3d,k) ) &
2602 *elzeta_3d(i,1:ntheta_3d,k) ) &
2603 /gsqrt_3d(i,1:ntheta_3d,k)
2604 az_3d(k)=sum(wtheta_3d*gt_3d)
2609 v1(i)=sum(wzeta_3d*az_3d)*rho_3d(i)
2614 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2619 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,sus22_r,iflag,message)
2624 message=
'AJAX_FLUXAV_B(12) ' // message
2625 IF(iflag > 0)
GOTO 9999
2629 IF(nr < nrho_r)
THEN
2632 sus22_r(nr+1:nrho_r)=sus22_r(nr)
2639 IF(rho_r(1) > rhores_3d) j=1
2641 sus22_r(j:nrho_r)=sus22_r(j:nrho_r)/rho_r(j:nrho_r)/4/z_pi**2
2645 IF(j == 2) sus22_r(1)=sus22_r(2)
2652 END SUBROUTINE ajax_fluxav_b
2654 SUBROUTINE ajax_fluxav_g(nrho_r,rho_r, &
2656 AREA_R,DVOL_R,GRHO1_R,GRHO2_R,GRHO2RM2_R,RM2_R,VOL_R, &
2666 INTEGER,
INTENT(IN) :: &
2669 REAL(KIND=rspec),
INTENT(IN) :: &
2673 CHARACTER(LEN=1024),
INTENT(OUT) :: &
2676 INTEGER,
INTENT(OUT) :: &
2683 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
2698 REAL(KIND=rspec) :: &
2699 gr(1:nrho_r),v1(1:nrho_3d),vp(1:nrho_r)
2709 IF(.NOT. l_fluxavg_3d)
THEN
2711 CALL ajax_init_fluxav_g(iflag,message)
2716 message=
'AJAX_FLUXAV_G(1) ' // message
2724 loop_i:
DO i=nrho_r,1,-1
2727 IF(rho_r(nr) < rhomax_3d+rhores_3d)
EXIT loop_i
2734 IF(
PRESENT(area_r) .OR. &
2735 PRESENT(dvol_r) .OR. &
2736 PRESENT(vol_r) .OR. &
2744 v1(2:nrho_3d)=vp_3d(2:nrho_3d)/rho_3d(2:nrho_3d)
2747 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
2752 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,vp,iflag,message)
2757 message=
'AJAX_FLUXAV_G(2) ' // message
2758 IF(iflag > 0)
GOTO 9999
2762 IF(nr < nrho_r)
THEN
2765 vp(nr+1:nrho_r)=vp(nr)
2770 vp(1:nrho_r)=vp(1:nrho_r)*rho_r(1:nrho_r)
2777 IF(
PRESENT(area_r) .OR. &
2778 PRESENT(grho1_r))
THEN
2791 gt_3d(1:ntheta_3d)=sqrt(( ( gcyl_3d(3,i,1:ntheta_3d,k) &
2792 *gcyl_3d(5,i,1:ntheta_3d,k) &
2793 -gcyl_3d(2,i,1:ntheta_3d,k) &
2794 *gcyl_3d(6,i,1:ntheta_3d,k))**2 &
2795 +rcyl_3d(i,1:ntheta_3d,k)**2 &
2796 *(gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2797 +gcyl_3d(5,i,1:ntheta_3d,k)**2) ))
2798 az_3d(k)=sum(wtheta_3d*gt_3d)
2802 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2811 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,gr,iflag,message)
2816 message=
'AJAX_FLUXAV_G(3) ' // message
2817 IF(iflag > 0)
GOTO 9999
2821 IF(nr < nrho_r)
THEN
2824 gr(nr+1:nrho_r)=gr(nr)
2833 IF(
PRESENT(area_r))
THEN
2839 area_r(1:nrho_r)=vp(1:nrho_r)*gr(1:nrho_r)
2846 IF(
PRESENT(dvol_r))
THEN
2853 IF(rho_r(1) > rhores_3d)
THEN
2862 dvol_r(1)=vp(2)*rho_r(2)/2
2868 dvol_r(i)=(vp(i)/rho_r(i)+vp(i+1)/rho_r(i+1))/2 &
2869 *(rho_r(i+1)**2-rho_r(i)**2)/2
2874 dvol_r(nrho_r)=dvol_r(nrho_r-1)
2881 IF(
PRESENT(grho1_r))
THEN
2887 grho1_r(1:nrho_r)=gr(1:nrho_r)
2894 IF(
PRESENT(grho2_r))
THEN
2907 gt_3d(1:ntheta_3d)=( (gcyl_3d(3,i,1:ntheta_3d,k) &
2908 *gcyl_3d(5,i,1:ntheta_3d,k) &
2909 -gcyl_3d(2,i,1:ntheta_3d,k) &
2910 *gcyl_3d(6,i,1:ntheta_3d,k))**2 &
2911 +rcyl_3d(i,1:ntheta_3d,k)**2 &
2912 *(gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2913 +gcyl_3d(5,i,1:ntheta_3d,k)**2) ) &
2914 /gsqrt_3d(i,1:ntheta_3d,k)
2915 az_3d(k)=sum(wtheta_3d*gt_3d)
2919 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2929 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,grho2_r,iflag,message)
2934 message=
'AJAX_FLUXAV_G(4) ' // message
2935 IF(iflag > 0)
GOTO 9999
2939 IF(nr < nrho_r)
THEN
2942 grho2_r(nr+1:nrho_r)=grho2_r(nr)
2951 IF(
PRESENT(grho2rm2_r))
THEN
2964 gt_3d(1:ntheta_3d)=( (gcyl_3d(3,i,1:ntheta_3d,k) &
2965 *gcyl_3d(5,i,1:ntheta_3d,k) &
2966 -gcyl_3d(2,i,1:ntheta_3d,k) &
2967 *gcyl_3d(6,i,1:ntheta_3d,k))**2 &
2968 /rcyl_3d(i,1:ntheta_3d,k)**2 &
2969 +(gcyl_3d(2,i,1:ntheta_3d,k)**2 &
2970 +gcyl_3d(5,i,1:ntheta_3d,k)**2) ) &
2971 /gsqrt_3d(i,1:ntheta_3d,k)
2972 az_3d(k)=sum(wtheta_3d*gt_3d)
2976 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
2986 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,grho2rm2_r,iflag,message)
2991 message=
'AJAX_FLUXAV_G(5) ' // message
2992 IF(iflag > 0)
GOTO 9999
2996 IF(nr < nrho_r)
THEN
2999 grho2rm2_r(nr+1:nrho_r)=grho2rm2_r(nr)
3008 IF(
PRESENT(rm2_r))
THEN
3021 gt_3d(1:ntheta_3d)=gsqrt_3d(i,1:ntheta_3d,k) &
3022 /rcyl_3d(i,1:ntheta_3d,k)**2
3023 az_3d(k)=sum(wtheta_3d*gt_3d)
3027 v1(i)=sum(wzeta_3d*az_3d)/vp_3d(i)
3037 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,rm2_r,iflag,message)
3042 message=
'AJAX_FLUXAV_G(6) ' // message
3043 IF(iflag > 0)
GOTO 9999
3047 IF(nr < nrho_r)
THEN
3050 rm2_r(nr+1:nrho_r)=rm2_r(nr)
3059 IF(
PRESENT(vol_r))
THEN
3066 IF(rho_r(1) > rhores_3d)
THEN
3070 vol_r(1)=vp(1)*rho_r(1)/2
3077 vol_r(2)=vp(2)*rho_r(2)/2
3083 vol_r(i)=vol_r(i-1)+(vp(i-1)/rho_r(i-1)+vp(i)/rho_r(i))/2 &
3084 *(rho_r(i)**2-rho_r(i-1)**2)/2
3093 IF(
PRESENT(vp_r))
THEN
3099 vp_r(1:nrho_r)=vp(1:nrho_r)
3108 END SUBROUTINE ajax_fluxav_g
3110 SUBROUTINE ajax_i(nrho_r,rho_r, &
3112 CUR_I_R,CUR_F_R,CUR_IMN_R,CUR_IMX_R,CUR_FMN_R,CUR_FMX_R)
3123 INTEGER,
INTENT(IN) :: &
3126 REAL(KIND=rspec),
INTENT(IN) :: &
3130 CHARACTER(LEN=1024),
INTENT(OUT) :: &
3133 INTEGER,
INTENT(OUT) :: &
3140 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
3153 REAL(KIND=rspec) :: &
3154 cmax,cmin,r_flx(1:3),r_cyl(1:3),g_cyl(1:6)
3156 REAL(KIND=rspec),
ALLOCATABLE :: &
3157 b_co(:,:,:),gt(:),gz(:)
3167 ALLOCATE(b_co(3,ntheta_3d,nzeta_3d))
3171 IF(
PRESENT(cur_i_r) .OR. &
3172 PRESENT(cur_imn_r) .OR. &
3173 PRESENT(cur_imx_r))
THEN
3175 ALLOCATE(gz(nzeta_3d))
3181 IF(
PRESENT(cur_f_r) .OR. &
3182 PRESENT(cur_fmn_r) .OR. &
3183 PRESENT(cur_fmx_r))
THEN
3185 ALLOCATE(gt(ntheta_3d))
3191 IF(
PRESENT(cur_i_r)) cur_i_r(1:nrho_r)=0
3192 IF(
PRESENT(cur_imn_r)) cur_imn_r(1:nrho_r)=0
3193 IF(
PRESENT(cur_imx_r)) cur_imx_r(1:nrho_r)=0
3194 IF(
PRESENT(cur_f_r)) cur_f_r(1:nrho_r)=0
3195 IF(
PRESENT(cur_fmn_r)) cur_fmn_r(1:nrho_r)=0
3196 IF(
PRESENT(cur_fmx_r)) cur_fmx_r(1:nrho_r)=0
3199 IF(rho_r(1) <= rhomin_3d) imin=2
3210 r_flx(3)=(k-1)*dzeta_3d
3214 r_flx(2)=(j-1)*dtheta_3d
3219 CALL ajax_flx2cyl(r_flx,r_cyl,iflag,message,g_cyl=g_cyl)
3224 message=
'AJAX_I(1) ' // message
3225 IF(iflag > 0)
GOTO 9999
3232 CALL ajax_b(r_flx,r_cyl,g_cyl,iflag,message,b_co=b_co(:,j,k))
3237 message=
'AJAX_I(2) ' // message
3238 IF(iflag > 0)
GOTO 9999
3247 IF(
PRESENT(cur_i_r) .OR. &
3248 PRESENT(cur_imn_r) .OR. &
3249 PRESENT(cur_imx_r))
THEN
3256 gz(k)=sum(wtheta_3d*b_co(2,1:ntheta_3d,k))/z_mu0
3257 IF(gz(k) < cmin) cmin=gz(k)
3258 IF(gz(k) > cmax) cmax=gz(k)
3260 IF(
PRESENT(cur_i_r)) cur_i_r(i)=sum(wzeta_3d*gz)/2/z_pi
3261 IF(
PRESENT(cur_imn_r)) cur_imn_r(i)=cmin
3262 IF(
PRESENT(cur_imx_r)) cur_imx_r(i)=cmax
3269 IF(
PRESENT(cur_f_r) .OR. &
3270 PRESENT(cur_fmn_r) .OR. &
3271 PRESENT(cur_fmx_r))
THEN
3278 gt(j)=sum(wzeta_3d*b_co(3,j,1:nzeta_3d))/z_mu0
3279 IF(gt(j) < cmin) cmin=gt(j)
3280 IF(gt(j) > cmax) cmax=gt(j)
3282 IF(
PRESENT(cur_f_r)) cur_f_r(i)=sum(wtheta_3d*gt)/2/z_pi
3283 IF(
PRESENT(cur_fmn_r)) cur_fmn_r(i)=cmin
3284 IF(
PRESENT(cur_fmx_r)) cur_fmx_r(i)=cmax
3296 IF(
PRESENT(cur_i_r)) cur_i_r(1)=0
3297 IF(
PRESENT(cur_imn_r)) cur_imn_r(1)=0
3298 IF(
PRESENT(cur_imx_r)) cur_imx_r(1)=0
3299 IF(
PRESENT(cur_f_r)) cur_f_r(1)=cur_f_r(2)
3300 IF(
PRESENT(cur_fmn_r)) cur_fmn_r(1)=cur_fmn_r(2)
3301 IF(
PRESENT(cur_fmx_r)) cur_fmx_r(1)=cur_fmx_r(2)
3312 IF(
ALLOCATED(gt))
DEALLOCATE(gt)
3313 IF(
ALLOCATED(gz))
DEALLOCATE(gz)
3315 END SUBROUTINE ajax_i
3317 SUBROUTINE ajax_magflux(nrho_r,rho_r, &
3319 IOTABAR_R,Q_R,PHIPRM_R,PSIPRM_R,PHI_R,PSI_R)
3328 INTEGER,
INTENT(IN) :: &
3331 REAL(KIND=rspec),
INTENT(IN) :: &
3335 CHARACTER(LEN=1024),
INTENT(OUT) :: &
3338 INTEGER,
INTENT(OUT) :: &
3345 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
3358 INTEGER,
PARAMETER :: &
3359 k_vopt(1:3)=(/1,0,0/)
3361 REAL(KIND=rspec) :: &
3362 iotabar_t(1:nrho_r),phiprm_t(1:nrho_r),value(1:3), &
3377 loop_i:
DO i=nrho_r,1,-1
3380 IF(rho_r(nr) < rhomax_3d+rhores_3d)
EXIT loop_i
3387 phiprm_t(1:nrho_r)=2*rho_r(1:nrho_r)*phitot_3d/rhomax_3d**2
3388 IF(rho_r(1) < rhores_3d) phiprm_t(1)=2*rhores_3d*phitot_3d/rhomax_3d**2
3395 CALL spline1_eval(k_vopt,nrho_3d,rho_r(i),rho_3d,iotabar_3d,j,
value)
3396 iotabar_t(i)=value(1)
3400 IF(nr < nrho_r)
THEN
3403 iotabar_t(nr+1:nrho_r)=iotabar_3d(1,nrho_3d) &
3404 +(rho_r(nr+1:nrho_r)-rhomax_3d) &
3405 *(iotabar_3d(1,nrho_3d) &
3406 -iotabar_3d(1,nrho_3d-1)) &
3407 /(rhomax_3d-rho_3d(nrho_3d-1))
3415 IF(
PRESENT(iotabar_r))
THEN
3418 iotabar_r(1:nrho_r)=iotabar_t(1:nrho_r)
3423 IF(
PRESENT(q_r))
THEN
3426 q_r(1:nrho_r)=1/iotabar_t(1:nrho_r)
3431 IF(
PRESENT(phiprm_r))
THEN
3434 phiprm_r(1:nrho_r)=phiprm_t(1:nrho_r)
3439 IF(
PRESENT(psiprm_r))
THEN
3442 psiprm_r(1:nrho_r)=iotabar_t(1:nrho_r)*phiprm_t(1:nrho_r)
3447 IF(
PRESENT(phi_r))
THEN
3450 phi_r(1:nrho_r)=phitot_3d*(rho_r(1:nrho_r)/rhomax_3d)**2
3455 IF(
PRESENT(psi_r))
THEN
3460 CALL spline1_integ(1,nrho_3d,rho_3d,iotabar_3d,nr,rho_r,values,iflag,message)
3465 message=
'AJAX_MAGFLUX ' // message
3466 IF(iflag > 0)
GOTO 9999
3470 psi_r(1:nr)=values(1:nr)*2*phitot_3d/rhomax_3d**2
3472 IF(nr < nrho_r)
THEN
3476 psi_r(i)=psi_r(i-1)+phitot_3d/rhomax_3d**2 &
3477 *(rho_r(i-1)*iotabar_t(i-1)+rho_r(i)*iotabar_t(i)) &
3478 *(rho_r(i)-rho_r(i-1))
3491 END SUBROUTINE ajax_magflux
3493 SUBROUTINE ajax_shape(nrho_r,rho_r, &
3496 SHIFT_R,ELONG_R,TRIANG_R,RMAX_R,RMIN_R,ZMAX_R,ZMIN_R, &
3506 INTEGER,
INTENT(IN) :: &
3509 REAL(KIND=rspec),
INTENT(IN) :: &
3513 CHARACTER(LEN=1024),
INTENT(OUT) :: &
3516 INTEGER,
INTENT(OUT) :: &
3523 REAL(KIND=rspec),
INTENT(IN),
OPTIONAL :: &
3528 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
3547 REAL(KIND=rspec) :: &
3548 a0,rg0,r_cyl(1:3),r_flx(1:3),v1(1:nrho_3d),rbot(1:nrho_3d), &
3549 rtop(1:nrho_3d),rmax(1:nrho_3d),rmin(1:nrho_3d),zmax(1:nrho_3d), &
3571 IF(
PRESENT(zeta)) r_flx(3)=zeta
3574 loop_i:
DO i=nrho_r,1,-1
3577 IF(rho_r(nr) < rhomax_3d+rhores_3d)
EXIT loop_i
3590 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3595 message=
'AJAX_SHAPE(1) ' // message
3596 IF(iflag > 0)
GOTO 9999
3600 rmin(nrho_3d)=r_cyl(1)
3608 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3613 message=
'AJAX_SHAPE(2) ' // message
3614 IF(iflag > 0)
GOTO 9999
3618 rmax(nrho_3d)=r_cyl(1)
3621 rg0=(rmin(nrho_3d)+rmax(nrho_3d))/2
3624 a0=(rmax(nrho_3d)-rmin(nrho_3d))/2
3637 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3642 message=
'AJAX_SHAPE(3) ' // message
3643 IF(iflag > 0)
GOTO 9999
3655 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3660 message=
'AJAX_SHAPE(4) ' // message
3661 IF(iflag > 0)
GOTO 9999
3673 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3678 message=
'AJAX_SHAPE(5) ' // message
3679 IF(iflag > 0)
GOTO 9999
3692 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3697 message=
'AJAX_SHAPE(6) ' // message
3698 IF(iflag > 0)
GOTO 9999
3710 IF(
PRESENT(shift_r))
THEN
3716 v1(2:nrho_3d)=((rmax(2:nrho_3d)+rmin(2:nrho_3d))/2-rg0)/a0
3719 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
3724 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,shift_r,iflag,message)
3729 message=
'AJAX_SHAPE(7) ' // message
3734 IF(nr < nrho_r)
THEN
3737 shift_r(nr+1:nrho_r)=shift_r(nr)
3746 IF(
PRESENT(elong_r))
THEN
3752 v1(2:nrho_3d)=(zmax(2:nrho_3d)-zmin(2:nrho_3d)) &
3753 /(rmax(2:nrho_3d)-rmin(2:nrho_3d))
3756 v1(1)=v1(2)-rho_3d(2)*(v1(3)-v1(2))/(rho_3d(3)-rho_3d(2))
3761 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,elong_r,iflag,message)
3766 message=
'AJAX_SHAPE(8) ' // message
3771 IF(nr < nrho_r)
THEN
3774 elong_r(nr+1:nrho_r)=elong_r(nr)
3783 IF(
PRESENT(triang_r))
THEN
3786 triang_r(1:nrho_r)=0
3789 v1(2:nrho_3d)=((rmax(2:nrho_3d)+rmin(2:nrho_3d)) &
3790 -(rbot(2:nrho_3d)+rtop(2:nrho_3d))) &
3791 /(rmax(2:nrho_3d)-rmin(2:nrho_3d))
3799 CALL linear1_interp(nrho_3d,rho_3d,v1,nr,rho_r,triang_r,iflag,message)
3804 message=
'AJAX_SHAPE(9) ' // message
3809 IF(nr < nrho_r)
THEN
3812 triang_r(nr+1:nrho_r)=triang_r(nr)
3821 IF(
PRESENT(rmax_r))
THEN
3834 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3839 message=
'AJAX_SHAPE(10) ' // message
3844 IF(r_cyl(1) > rmax(i)) rmax(i)=r_cyl(1)
3848 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3853 message=
'AJAX_SHAPE(11) ' // message
3858 IF(r_cyl(1) > rmax(i)) rmax(i)=r_cyl(1)
3863 rmax(1)=rmax(2)-rho_3d(2)*(rmax(3)-rmax(2))/(rho_3d(3)-rho_3d(2))
3868 CALL linear1_interp(nrho_3d,rho_3d,rmax,nr,rho_r,rmax_r,iflag,message)
3873 message=
'AJAX_SHAPE(12) ' // message
3883 IF(
PRESENT(rmin_r))
THEN
3896 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3901 message=
'AJAX_SHAPE(13) ' // message
3906 IF(r_cyl(1) < rmin(i)) rmin(i)=r_cyl(1)
3910 CALL ajax_minmax_rz(l_rminmax,r_flx,r_cyl,iflag,message)
3915 message=
'AJAX_SHAPE(14) ' // message
3920 IF(r_cyl(1) < rmin(i)) rmin(i)=r_cyl(1)
3925 rmin(1)=rmin(2)-rho_3d(2)*(rmin(3)-rmin(2))/(rho_3d(3)-rho_3d(2))
3930 CALL linear1_interp(nrho_3d,rho_3d,rmin,nr,rho_r,rmin_r,iflag,message)
3935 message=
'AJAX_SHAPE(15) ' // message
3945 IF(
PRESENT(zmax_r))
THEN
3951 zmax(1)=zmax(2)-rho_3d(2)*(zmax(3)-zmax(2))/(rho_3d(3)-rho_3d(2))
3956 CALL linear1_interp(nrho_3d,rho_3d,zmax,nr,rho_r,zmax_r,iflag,message)
3961 message=
'AJAX_SHAPE(16) ' // message
3971 IF(
PRESENT(zmin_r))
THEN
3977 zmin(1)=zmin(2)-rho_3d(2)*(zmin(3)-zmin(2))/(rho_3d(3)-rho_3d(2))
3982 CALL linear1_interp(nrho_3d,rho_3d,zmin,nr,rho_r,zmin_r,iflag,message)
3987 message=
'AJAX_SHAPE(17) ' // message
3997 IF(
PRESENT(rtop_r))
THEN
4003 rtop(1)=rtop(2)-rho_3d(2)*(rtop(3)-rtop(2))/(rho_3d(3)-rho_3d(2))
4008 CALL linear1_interp(nrho_3d,rho_3d,rtop,nr,rho_r,rtop_r,iflag,message)
4013 message=
'AJAX_SHAPE(18) ' // message
4023 IF(
PRESENT(rbot_r))
THEN
4029 rbot(1)=rbot(2)-rho_3d(2)*(rbot(3)-rbot(2))/(rho_3d(3)-rho_3d(2))
4034 CALL linear1_interp(nrho_3d,rho_3d,rbot,nr,rho_r,rbot_r,iflag,message)
4039 message=
'AJAX_SHAPE(19) ' // message
4051 END SUBROUTINE ajax_shape
4053 SUBROUTINE ajax_globals(iflag,message, &
4054 R000,PHITOT,RHOMAX,RHOMIN,SIGNBP,SIGNBT,NPER,NRHO, &
4064 CHARACTER(LEN=1024),
INTENT(OUT) :: &
4067 INTEGER,
INTENT(OUT) :: &
4074 INTEGER,
INTENT(OUT),
OPTIONAL :: &
4080 REAL(KIND=rspec),
INTENT(OUT),
OPTIONAL :: &
4100 IF(
PRESENT(r000)) r000=r000_3d
4101 IF(
PRESENT(phitot)) phitot=phitot_3d
4102 IF(
PRESENT(rhomax)) rhomax=rhomax_3d
4103 IF(
PRESENT(rhomin)) rhomin=rhomin_3d
4104 IF(
PRESENT(signbp)) signbp=signbp_3d
4105 IF(
PRESENT(signbt)) signbt=signbt_3d
4106 IF(
PRESENT(nper)) nper=nper_3d
4107 IF(
PRESENT(nrho)) nrho=nrho_3d
4108 IF(
PRESENT(ntheta)) ntheta=ntheta_3d
4109 IF(
PRESENT(nzeta)) nzeta=nzeta_3d
4111 END SUBROUTINE ajax_globals
4113 SUBROUTINE ajax_minmax_rz(l_rminmax, &
4115 r_cyl,iflag,message)
4124 LOGICAL,
INTENT(IN) :: &
4130 REAL(KIND=rspec),
INTENT(INOUT) :: &
4134 CHARACTER(LEN=1024),
INTENT(OUT) :: &
4137 INTEGER,
INTENT(OUT) :: &
4143 REAL(KIND=rspec),
INTENT(OUT) :: &
4151 REAL(KIND=rspec) :: &
4152 g_cyl0(1:6),g_cyl1(1:6),r_flx0(1:3),r_flx1(1:3)
4183 r_flx0(1:3)=r_flx(1:3)
4184 r_flx0(2)=r_flx0(2)-0.05*z_pi
4187 CALL ajax_flx2cyl(r_flx0,r_cyl,iflag,message, &
4193 message=
'AJAX_MINMAX_RZ(1) ' // message
4194 IF(iflag > 0)
GOTO 9999
4198 r_flx1(1:3)=r_flx(1:3)
4199 r_flx1(2)=r_flx1(2)+0.05*z_pi
4202 CALL ajax_flx2cyl(r_flx1,r_cyl,iflag,message, &
4208 message=
'AJAX_MINMAX_RZ(2) ' // message
4209 IF(iflag > 0)
GOTO 9999
4216 r_flx(2)=r_flx0(2)-g_cyl0(ig)*(r_flx1(2)-r_flx0(2))/(g_cyl1(ig)-g_cyl0(ig))
4217 r_flx0(1:3)=r_flx1(1:3)
4219 r_flx1(1:3)=r_flx(1:3)
4222 CALL ajax_flx2cyl(r_flx,r_cyl,iflag,message, &
4228 message=
'AJAX_MINMAX_RZ(3) ' // message
4229 IF(iflag > 0)
GOTO 9999
4233 IF(abs(g_cyl1(ig)) < 1.0e-5*r000_3d/z_pi)
EXIT loop_i
4242 END SUBROUTINE ajax_minmax_rz
4244 SUBROUTINE ajax_init
4262 z_large=huge(1.0_rspec)
4263 z_precision=epsilon(1.0_rspec)
4264 z_small=tiny(1.0_rspec)
4267 rhores_3d=1.0e-3*rhomax_3d
4272 IF(
ALLOCATED(rho_3d))
THEN
4279 IF(nset1 /= nrho_3d .OR. &
4280 nset2 /= krz_3d)
THEN
4283 DEALLOCATE(rho_3d, &
4286 ALLOCATE(rho_3d(nrho_3d), &
4287 r_3d(4,nrho_3d,krz_3d), &
4288 z_3d(4,nrho_3d,krz_3d))
4299 ALLOCATE(rho_3d(nrho_3d), &
4300 r_3d(4,nrho_3d,krz_3d), &
4301 z_3d(4,nrho_3d,krz_3d))
4310 rho_3d(:)=real((/ (i-1,i=1,nrho_3d) /),rspec)*rhomax_3d/(nrho_3d-1)
4315 IF(
ALLOCATED(lam_3d))
THEN
4318 nset1=
SIZE(lam_3d,2)
4319 nset2=
SIZE(lam_3d,3)
4322 IF(nset1 /= nrho_3d .OR. &
4323 nset2 /= klam_3d)
THEN
4327 ALLOCATE(lam_3d(4,nrho_3d,klam_3d))
4336 ALLOCATE(lam_3d(4,nrho_3d,klam_3d))
4345 kmax=max(krz_3d,klam_3d)
4347 IF(
ALLOCATED(m_3d))
THEN
4353 IF(nset1 /= kmax)
THEN
4359 ALLOCATE(m_3d(kmax), &
4372 ALLOCATE(m_3d(kmax), &
4385 dtheta_3d=2*z_pi/(ntheta_3d-1)
4387 IF(
ALLOCATED(wtheta_3d))
THEN
4390 nset1=
SIZE(wtheta_3d)
4392 IF(nset1 /= ntheta_3d)
THEN
4395 DEALLOCATE(wtheta_3d)
4396 ALLOCATE(wtheta_3d(ntheta_3d))
4402 wtheta_3d(ntheta_3d)=1
4406 IF(mod(i,2) == 0)
THEN
4420 wtheta_3d(:)=wtheta_3d(:)*2*z_pi/3/(ntheta_3d-1)
4427 ALLOCATE(wtheta_3d(ntheta_3d))
4433 wtheta_3d(ntheta_3d)=1
4437 IF(mod(i,2) == 0)
THEN
4451 wtheta_3d(:)=wtheta_3d(:)*2*z_pi/3/(ntheta_3d-1)
4458 IF(nzeta_3d == 1)
THEN
4464 dzeta_3d=2*z_pi/(nzeta_3d-1)/nper_3d
4469 IF(
ALLOCATED(wzeta_3d))
THEN
4472 nset1=
SIZE(wzeta_3d)
4474 IF(nset1 /= nzeta_3d)
THEN
4477 DEALLOCATE(wzeta_3d)
4478 ALLOCATE(wzeta_3d(nzeta_3d))
4483 wzeta_3d(1)=dzeta_3d
4485 IF(nzeta_3d > 1)
THEN
4489 wzeta_3d(nzeta_3d)=1
4493 IF(mod(i,2) == 0)
THEN
4507 wzeta_3d(:)=wzeta_3d(:)*nper_3d*dzeta_3d/3
4516 ALLOCATE(wzeta_3d(nzeta_3d))
4521 wzeta_3d(1)=dzeta_3d
4523 IF(nzeta_3d > 1)
THEN
4527 wzeta_3d(nzeta_3d)=1
4531 IF(mod(i,2) == 0)
THEN
4545 wzeta_3d(:)=wzeta_3d(:)*nper_3d*dzeta_3d/3
4554 l_fluxavb_3d=.false.
4555 l_fluxavg_3d=.false.
4557 END SUBROUTINE ajax_init
4559 SUBROUTINE ajax_init_fluxav_b
4569 i,j,k,nset1,nset2,nset3
4571 REAL(KIND=rspec) :: &
4572 br,bz,bzeta,phiprm,r_flx(1:3)
4578 IF(
ALLOCATED(eltheta_3d))
THEN
4581 nset1=
SIZE(eltheta_3d,1)
4582 nset2=
SIZE(eltheta_3d,2)
4583 nset3=
SIZE(eltheta_3d,3)
4586 IF(nset1 /= nrho_3d .OR. &
4587 nset2 /= ntheta_3d .OR. &
4588 nset3 /= nzeta_3d)
THEN
4591 DEALLOCATE(eltheta_3d, &
4593 ALLOCATE(eltheta_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4594 elzeta_3d(nrho_3d,ntheta_3d,nzeta_3d))
4601 ALLOCATE(eltheta_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4602 elzeta_3d(nrho_3d,ntheta_3d,nzeta_3d))
4618 r_flx(2)=(j-1)*dtheta_3d
4622 r_flx(3)=(k-1)*dzeta_3d
4624 CALL ajax_lambda(r_flx, &
4625 eltheta_3d(i,j,k),elzeta_3d(i,j,k))
4637 IF(
ALLOCATED(b_3d))
THEN
4645 IF(nset1 /= nrho_3d .OR. &
4646 nset2 /= ntheta_3d .OR. &
4647 nset3 /= nzeta_3d)
THEN
4652 ALLOCATE(b_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4653 btheta_3d(nrho_3d,ntheta_3d,nzeta_3d))
4659 ALLOCATE(b_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4660 btheta_3d(nrho_3d,ntheta_3d,nzeta_3d))
4671 phiprm=2*rho_3d(i)*phitot_3d/rhomax_3d**2
4677 btheta_3d(i,j,k)=(iotabar_3d(1,i)-elzeta_3d(i,j,k))
4678 bzeta=(1.0+eltheta_3d(i,j,k))
4679 br=gcyl_3d(2,i,j,k)*btheta_3d(i,j,k)+gcyl_3d(3,i,j,k)*bzeta
4680 bz=gcyl_3d(5,i,j,k)*btheta_3d(i,j,k)+gcyl_3d(6,i,j,k)*bzeta
4681 b_3d(i,j,k)=sqrt(br**2+bz**2+(rcyl_3d(i,j,k)*bzeta)**2)/gsqrt_3d(i,j,k)
4682 btheta_3d(i,j,k)=btheta_3d(i,j,k)/gsqrt_3d(i,j,k)
4688 btheta_3d(i,:,:)=phiprm*btheta_3d(i,:,:)
4689 b_3d(i,:,:)=abs(phiprm)*b_3d(i,:,:)
4696 btheta_3d(1,1:ntheta_3d,k)=(sum(btheta_3d(2,1:ntheta_3d-1,k))*rho_3d(3) &
4697 -sum(btheta_3d(3,1:ntheta_3d-1,k)) &
4698 *rho_3d(2))/(ntheta_3d-1)/(rho_3d(3)-rho_3d(2))
4699 b_3d(1,1:ntheta_3d,k)=(sum(b_3d(2,1:ntheta_3d-1,k))*rho_3d(3) &
4700 -sum(b_3d(3,1:ntheta_3d-1,k)) &
4701 *rho_3d(2))/(ntheta_3d-1)/(rho_3d(3)-rho_3d(2))
4706 btheta_3d(:,:,:)=btheta_3d(:,:,:)/2/z_pi
4707 b_3d(:,:,:)=b_3d(:,:,:)/2/z_pi
4714 END SUBROUTINE ajax_init_fluxav_b
4716 SUBROUTINE ajax_init_fluxav_g(iflag,message)
4725 CHARACTER(LEN=1024),
INTENT(OUT) :: &
4728 INTEGER,
INTENT(OUT) :: &
4737 i,j,k,nset1,nset2,nset3
4739 REAL(KIND=rspec) :: &
4740 r_cyl(1:3),r_flx(1:3)
4753 IF(
ALLOCATED(rcyl_3d))
THEN
4756 nset1=
SIZE(rcyl_3d,1)
4757 nset2=
SIZE(rcyl_3d,2)
4758 nset3=
SIZE(rcyl_3d,3)
4761 IF(nset1 /= nrho_3d .OR. &
4762 nset2 /= ntheta_3d .OR. &
4763 nset3 /= nzeta_3d)
THEN
4766 DEALLOCATE(rcyl_3d, &
4773 ALLOCATE(rcyl_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4774 zcyl_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4775 gsqrt_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4776 gcyl_3d(6,nrho_3d,ntheta_3d,nzeta_3d), &
4786 ALLOCATE(rcyl_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4787 zcyl_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4788 gsqrt_3d(nrho_3d,ntheta_3d,nzeta_3d), &
4789 gcyl_3d(6,nrho_3d,ntheta_3d,nzeta_3d), &
4815 r_flx(2)=(j-1)*dtheta_3d
4816 r_flx(3)=(k-1)*dzeta_3d
4819 CALL ajax_flx2cyl(r_flx,r_cyl,iflag,message, &
4820 g_cyl=gcyl_3d(1:6,i,j,k), &
4821 gsqrt=gsqrt_3d(i,j,k))
4826 message=
'AJAX_INIT_FLUXAV_G '// message
4827 IF(iflag > 0)
GOTO 9999
4831 rcyl_3d(i,j,k)=r_cyl(1)
4832 zcyl_3d(i,j,k)=r_cyl(3)
4845 gt_3d(1:ntheta_3d)=gsqrt_3d(i,1:ntheta_3d,k)
4846 az_3d(k)=sum(wtheta_3d*gt_3d)
4850 vp_3d(i)=sum(wzeta_3d*az_3d)
4864 END SUBROUTINE ajax_init_fluxav_g
4866 SUBROUTINE ajax_init_lambda
4877 i,j,k,k_bc1=3,k_bcn=0
4879 REAL(KIND=rspec) :: &
4880 theta,g1(1:ntheta_3d),g2(1:ntheta_3d)
4895 IF(k /= km0n0_3d)
THEN
4903 g1(j)=gsqrt_3d(i,j,1)/rcyl_3d(i,j,1)**2
4904 theta=(j-1)*dtheta_3d
4905 g2(j)=g1(j)*cos(m_3d(k)*theta)
4910 lam_3d(1,i,k)=2*sum(wtheta_3d*g2)/sum(wtheta_3d*g1)/m_3d(k)
4914 lam_3d(1,2:nrho_3d,k)=lam_3d(1,2:nrho_3d,k)/rho_3d(2:nrho_3d)**mabs_3d(k)
4917 lam_3d(1,1,k)=(lam_3d(1,2,k)*rho_3d(3)**2-lam_3d(1,3,k)*rho_3d(2)**2) &
4918 /(rho_3d(3)**2-rho_3d(2)**2)
4921 CALL spline1_fit(nrho_3d,rho_3d,lam_3d(:,:,k), &
4929 END SUBROUTINE ajax_init_lambda
4931 SUBROUTINE ajax_load_lambda(k_grid,nr_lam,nk_lam,rhorz,rho_lam,lam, &
4945 INTEGER,
INTENT(IN) :: &
4953 REAL(KIND=rspec),
INTENT(IN) :: &
4959 CHARACTER(LEN=1024),
INTENT(OUT) :: &
4962 INTEGER,
INTENT(OUT) :: &
4974 j,k,nset1,nset2,k_vopt(1:3)=(/1,0,0/),k_bc1=3,k_bcn=0
4976 REAL(KIND=rspec),
ALLOCATABLE :: &
4977 rho(:),lmn(:,:),fspl(:,:),values(:,:)
4996 IF(rho_lam(1) > 10*z_precision*rhorz)
THEN
4999 IF(rho_lam(nr_lam) < (1.0+10*z_precision)*rhorz)
THEN
5003 ALLOCATE(rho(nset1), &
5010 rho(2:nset1-1)=rho_lam(1:nr_lam)/rhorz
5012 lmn(2:nset1-1,1:nset2)=lam(1:nr_lam,1:nset2)
5019 ALLOCATE(rho(nset1), &
5026 rho(2:nset1)=rho_lam(1:nr_lam)/rhorz
5027 lmn(2:nset1,1:nset2)=lam(1:nr_lam,1:nset2)
5036 IF(rho_lam(nr_lam) < (1.0+10*z_precision)*rhorz)
THEN
5040 ALLOCATE(rho(nset1), &
5046 rho(1:nset1-1)=rho_lam(1:nset1-1)/rhorz
5048 lmn(1:nset1-1,1:nset2)=lam(1:nset1-1,1:nset2)
5055 ALLOCATE(rho(nset1), &
5061 rho(1:nset1)=rho_lam(1:nset1)/rhorz
5062 lmn(1:nset1,1:nset2)=lam(1:nset1,1:nset2)
5070 IF(k_grid == 1)
THEN
5073 rho(:)=sqrt(rho(:))*rhomax_3d
5078 rho(:)=rho(:)*rhomax_3d
5083 ALLOCATE(fspl(4,nset1), &
5097 lmn(j,k)=lmn(j,k)/rho(j)**mabs_3d(k)
5101 lmn(nset1,k)=(lmn(nset1-1,k)*(rho(nset1)-rho(nset1-2)) &
5102 -lmn(nset1-2,k)*(rho(nset1)-rho(nset1-1))) &
5103 /(rho(nset1-1)-rho(nset1-2))
5108 lmn(j,k)=lmn(j,k)/rho(j)**mabs_3d(k)
5115 lmn(1,k)=(lmn(2,k)*rho(3)**2-lmn(3,k)*rho(2)**2)/(rho(3)**2-rho(2)**2)
5118 fspl(1,1:nset1)=lmn(1:nset1,k)
5121 CALL spline1_interp(k_vopt,nset1,rho,fspl,nrho_3d,rho_3d,values, &
5129 message=
'AJAX_LOAD_LAM '// message
5135 lam_3d(1,1:nrho_3d,k)=values(1,1:nrho_3d)
5136 CALL spline1_fit(nrho_3d,rho_3d,lam_3d(:,:,k), &
5147 IF(
ALLOCATED(rho))
THEN
5155 IF(
ALLOCATED(fspl))
THEN
5163 END SUBROUTINE ajax_load_lambda