12 USE read_wout_mod, ns_vmec=>ns, mpol_vmec=>mpol, ntor_vmec=>ntor,
13 rmnc_vmec=>rmnc, zmns_vmec=>zmns, lmns_vmec=>lmns
14 xm_vmec=>xm, xn_vmec=>xn, chipf_vmec=>chipf,
15 rmns_vmec=>rmns, zmnc_vmec=>zmnc, lmnc_vmec=>lmnc
16 phipf_vmec=>phipf, presf_vmec=>presf, nfp_vmec=
17 wb_vmec=>wb, wp_vmec=>wp, gamma_vmec=>gamma,
18 volume_vmec=>volume, raxis_vmec=>raxis,
19 lasym_vmec=>lasym, iasym_vmec=>iasym,
29 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: rmnc_spline
31 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: zmns_spline
33 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: lmns_spline
35 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: rmns_spline
37 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: zmnc_spline
39 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: lmnc_spline
41 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: currumnc_spline
43 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: currvmnc_spline
45 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: currumns_spline
47 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: currvmns_spline
50 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: rmnc_i
52 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: zmns_i
54 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: lmns_i
56 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: rmns_i
58 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: zmnc_i
60 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: lmnc_i
62 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: jcurrumnc
64 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: jcurrvmnc
66 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: jcurrumns
68 REAL (dp),
DIMENSION(:,:,:),
ALLOCATABLE :: jcurrvmns
74 INTEGER,
PARAMETER :: iflipj = 1
76 REAL (dp),
PARAMETER :: lower_b = -1.e30_dp
78 REAL (dp),
PARAMETER :: upper_b = -1.e30_dp
95 SUBROUTINE vmec_info_construct_spline(mnmax, ns, is_asym)
100 INTEGER,
INTENT(in) :: mnmax
101 INTEGER,
INTENT(in) :: ns
102 LOGICAL,
INTENT(in) :: is_asym
107 ALLOCATE(rmnc_spline(mnmax,ns))
108 ALLOCATE(zmns_spline(mnmax,ns))
109 ALLOCATE(lmns_spline(mnmax,ns + 1))
110 ALLOCATE(currumnc_spline(mnmax,ns))
111 ALLOCATE(currvmnc_spline(mnmax,ns))
115 ALLOCATE(rmns_spline(mnmax,ns))
116 ALLOCATE(zmnc_spline(mnmax,ns))
117 ALLOCATE(lmnc_spline(mnmax,ns + 1))
118 ALLOCATE(currumns_spline(mnmax,ns))
119 ALLOCATE(currvmns_spline(mnmax,ns))
136 SUBROUTINE vmec_info_construct_island(mpol, ntor, ns, is_asym)
141 INTEGER,
INTENT(in) :: mpol
142 INTEGER,
INTENT(in) :: ntor
143 INTEGER,
INTENT(in) :: ns
144 LOGICAL,
INTENT(in) :: is_asym
149 ALLOCATE(rmnc_i(0:mpol,-ntor:ntor,ns))
150 ALLOCATE(zmns_i(0:mpol,-ntor:ntor,ns))
151 ALLOCATE(lmns_i(0:mpol,-ntor:ntor,ns + 1))
152 ALLOCATE(jcurrumnc(0:mpol,-ntor:ntor,ns))
153 ALLOCATE(jcurrvmnc(0:mpol,-ntor:ntor,ns))
163 ALLOCATE(rmns_i(0:mpol,-ntor:ntor,ns))
164 ALLOCATE(zmnc_i(0:mpol,-ntor:ntor,ns))
165 ALLOCATE(lmnc_i(0:mpol,-ntor:ntor,ns + 1))
166 ALLOCATE(jcurrumns(0:mpol,-ntor:ntor,ns))
167 ALLOCATE(jcurrvmns(0:mpol,-ntor:ntor,ns))
186 SUBROUTINE vmec_info_destruct_spline
193 DEALLOCATE(rmnc_spline)
194 DEALLOCATE(zmns_spline)
195 DEALLOCATE(lmns_spline)
196 DEALLOCATE(currumnc_spline)
197 DEALLOCATE(currvmnc_spline)
200 IF (
ALLOCATED(rmns_spline))
THEN
201 DEALLOCATE(rmns_spline)
202 DEALLOCATE(zmnc_spline)
203 DEALLOCATE(lmnc_spline)
204 DEALLOCATE(currumns_spline)
205 DEALLOCATE(currvmns_spline)
215 SUBROUTINE vmec_info_destruct_island
225 DEALLOCATE(jcurrumnc)
226 DEALLOCATE(jcurrvmnc)
229 IF (
ALLOCATED(rmns_i))
THEN
233 DEALLOCATE(jcurrumns)
234 DEALLOCATE(jcurrvmns)
251 SUBROUTINE vmec_info_set_wout(wout_file, ns_in, mpol_in, ntor_in, nfp_in)
252 USE descriptor_mod,
ONLY: iam
255 USE stel_constants,
ONLY: twopi, zero, mu0
262 CHARACTER(len=*),
INTENT(in) :: wout_file
263 INTEGER,
INTENT(IN) :: ns_in
264 INTEGER,
INTENT(IN) :: mpol_in
265 INTEGER,
INTENT(IN) :: ntor_in
266 INTEGER,
INTENT(IN) :: nfp_in
276 CALL read_wout_file(wout_file, istat)
277 CALL assert_eq(0, istat,
'Read-wout error in vmec_info_set_wout')
279 IF (nfp_in .lt. 1)
THEN
285 wb_i = (twopi*twopi)*wb_vmec
286 wp_i = (twopi*twopi)*wp_vmec
300 CALL vmec_info_construct_spline(mnmax, ns,
lasym)
301 CALL vmec_info_set_rzl_splines(rmnc_vmec, zmns_vmec, lmns_vmec,
303 rmnc_spline, zmns_spline, lmns_spline
304 currumnc_spline, currvmnc_spline,
f_cos
306 CALL vmec_info_set_rzl_splines(rmns_vmec, zmnc_vmec, lmnc_vmec,
308 rmns_spline, zmnc_spline, lmnc_spline
309 currumns_spline, currvmns_spline
316 CALL vmec_info_spline_oned_array(chipf_vmec,
chipf_i, istat)
317 CALL vmec_info_spline_oned_array(phipf_vmec,
phipf_i, istat)
318 presf_vmec = mu0*presf_vmec
319 CALL vmec_info_spline_oned_array(presf_vmec,
presf_i, istat)
353 CALL vmec_info_set_rzl
356 1000
FORMAT(/,
' INITIAL PARAMETERS (FROM VMEC)',/,
357 ' PHYSICS QUANTITIES',/,
358 ' PLASMA VOLUME (M^3): ',1pe12.4,
359 ' TOTAL MHD ENERGY (MJ): ', 1pe16.8,/,
360 ' THERMAL ENERGY (MJ): ', 1pe12.4,
361 ' EDGE TOROIDAL FLUX (Wb): ', 1pe12.4,/,
362 ' DIMENSIONLESS QUANTITIES',/,
363 ' <BETA>: ',1pe12.4,
' IOTA(0): ',1pe12.4,
364 ' IOTA(1) ',1pe12.4,
' GAMMA: ',1pe12.4,/, 21(
'-'),/)
385 SUBROUTINE vmec_info_set_rzl_splines(rmn_vmec, zmn_vmec, lmn_vmec, &
386 currumn_vmec, currvmn_vmec, &
387 rmn_spline, zmn_spline, lmn_spline, &
388 currumn_spline, currvmn_spline, &
391 USE stel_constants,
ONLY: mu0
397 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: rmn_vmec
398 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: zmn_vmec
399 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: lmn_vmec
400 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: currumn_vmec
401 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: currvmn_vmec
402 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(inout) :: rmn_spline
403 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(inout) :: zmn_spline
404 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(inout) :: lmn_spline
405 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(inout) :: currumn_spline
406 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(inout) :: currvmn_spline
407 INTEGER,
INTENT(in) :: parity
415 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: tempmn1
416 REAL (dp),
DIMENSION(:,:),
ALLOCATABLE :: tempmn2
419 IF (parity .eq.
f_sin .and. .not.lasym_vmec)
THEN
430 CALL vmec_info_spline_modes(rmn_vmec, rmn_spline, xm_vmec, istat)
431 CALL assert_eq(0, istat,
'Error splining rmn')
433 CALL vmec_info_spline_modes(zmn_vmec, zmn_spline, xm_vmec, istat)
434 CALL assert_eq(0, istat,
'Error splining zmn')
436 ALLOCATE(tempmn1(mnmax,ns_vmec + 1), stat=istat)
437 CALL vmec_info_set_ghost_points(lmn_vmec, tempmn1)
438 CALL vmec_info_spline_modes(tempmn1, lmn_spline, xm_vmec, istat)
439 CALL assert_eq(0, istat,
'Error splining lmn')
444 ALLOCATE (tempmn1(mnmax,ns_vmec),
445 tempmn2(mnmax,ns_vmec), stat=istat)
450 CALL assert(mnmax_nyq .ge. mnmax,
'ERROR: More modes than _nyq modes'
452 n_max = int(maxval(xn_vmec))
453 n_off = 2*int((maxval(xn_nyq) - maxval(xn_vmec))/nfp_vmec) + 1
457 CALL assert(xm_vmec(modes) .eq. xm_nyq(modes_nyq),
'm mode mismatch'
458 CALL assert(xn_vmec(modes) .eq. xn_nyq(modes_nyq),
'n mode mismatch'
460 tempmn1(modes,:) = mu0*currumn_vmec(modes_nyq,:)
461 tempmn2(modes,:) = mu0*currvmn_vmec(modes_nyq,:)
463 IF (int(xn_vmec(modes)) .eq. n_max)
THEN
464 modes_nyq = modes_nyq + n_off
466 modes_nyq = modes_nyq + 1
469 IF (parity .eq.
f_cos)
THEN
470 jsupvdota = mu0*(sum(tempmn2(1,2:ns_vmec - 1))
471 + (tempmn2(1, 1) + tempmn2(1, ns_vmec))/2)
475 CALL vmec_info_spline_modes(tempmn1, currumn_spline, xm_vmec, istat
476 CALL vmec_info_spline_modes(tempmn2, currvmn_spline, xm_vmec, istat
478 DEALLOCATE(tempmn1, tempmn2)
490 SUBROUTINE vmec_info_set_ghost_points(ymn_vmec, ymn_ghost)
495 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: ymn_vmec
496 REAL (dp),
DIMENSION(:,:),
INTENT(out) :: ymn_ghost
502 ymn_ghost(:,2:ns_vmec) = ymn_vmec(:,2:ns_vmec)
503 ymn_ghost(:,ns_vmec + 1) = 2*ymn_vmec(:,ns_vmec)
504 & - ymn_vmec(:,ns_vmec - 1)
506 WHERE (xm_vmec .eq. 0)
507 ymn_ghost(:,1) = 2*ymn_vmec(:,2) - ymn_vmec(:,3)
521 SUBROUTINE vmec_info_set_rzl()
523 USE island_params,
ONLY: mpol=>mpol_i, ntor=>ntor_i, ns=>ns_i
528 CALL vmec_info_construct_island(mpol, ntor, ns,
lasym)
529 CALL vmec_info_repack(rmnc_i, zmns_i, lmns_i, jcurrumnc, jcurrvmnc
530 rmnc_spline, zmns_spline, lmns_spline,
531 currumnc_spline, currvmnc_spline,
f_cos)
533 CALL vmec_info_repack(rmns_i, zmnc_i, lmnc_i, jcurrumns, jcurrvmns
534 rmns_spline, zmnc_spline, lmnc_spline,
535 currumns_spline, currvmns_spline,
f_sin)
537 CALL vmec_info_destruct_spline
579 SUBROUTINE vmec_info_repack(rmn, zmn, lmn, currumn, currvmn, &
580 rmn_spl, zmn_spl, lmn_spl, &
581 currumn_spl, currvmn_spl, parity)
583 USE island_params,
ONLY: mpol=>mpol_i, ntor=>ntor_i, ns=>ns_i, &
585 USE descriptor_mod,
ONLY: iam
591 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:,:),
INTENT(inout) :: rmn
592 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:,:),
INTENT(inout) :: zmn
593 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:,:),
INTENT(inout) :: lmn
594 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:,:),
INTENT(inout) :: currumn
595 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:,:),
INTENT(inout) :: currvmn
596 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(in) :: rmn_spl
597 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(in) :: zmn_spl
598 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(in) :: lmn_spl
599 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(in) :: currumn_spl
600 REAL (dp),
ALLOCATABLE,
DIMENSION(:,:),
INTENT(in) :: currvmn_spl
601 INTEGER,
INTENT(in) :: parity
614 CALL assert_eq(mnmax,
SIZE(rmn_spl,1),
'rmn_spl wrong size1 in REPACK'
615 CALL assert_eq(ns,
SIZE(rmn_spl,2),
'rmn_spl wrong size2 in REPACK'
616 CALL assert_eq(ns + 1,
SIZE(lmn_spl,2),
'lmn_spl wrong size2 in REPACK'
618 IF (parity .eq. f_cos)
THEN
624 IF (iam .eq. 0 .and.
lverbose .and. parity .eq. f_cos)
THEN
625 m = int(maxval(xm_vmec))
626 n = int(maxval(abs(xn_vmec)))/nfp
627 IF (m .gt. mpol .or. n .gt. ntor)
THEN
630 CALL assert_eq(0, mod(nfp_vmec, nfp),
'nfpin should be an even '
631 'divisor of the VMEC nfp.'
637 n = xn_vmec(mn_mode)/nfp
639 IF (m .le. mpol .and. n_abs .le. ntor)
THEN
643 IF (parity .eq. f_cos)
THEN
646 IF (parity .eq. f_sin)
THEN
649 rmn(m,n_abs,:) = rmn(m,n_abs,:) + s1*rmn_spl(mn_mode,:)
650 zmn(m,n_abs,:) = zmn(m,n_abs,:) + s2*zmn_spl(mn_mode,:)
651 lmn(m,n_abs,:) = lmn(m,n_abs,:) + s2*lmn_spl(mn_mode,:)*iflipj
652 currumn(m,n_abs,:) = currumn(m,n_abs,:)
653 + s1*currumn_spl(mn_mode,:)
654 currvmn(m,n_abs,:) = currvmn(m,n_abs,:)
655 + s1*currvmn_spl(mn_mode,:)
657 rmn(m,-n*iflipj,:) = rmn_spl(mn_mode,:)
658 zmn(m,-n*iflipj,:) = zmn_spl(mn_mode,:)*iflipj
659 lmn(m,-n*iflipj,:) = lmn_spl(mn_mode,:)
660 currumn(m,-n*iflipj,:) = currumn_spl(mn_mode,:)
661 currvmn(m,-n*iflipj,:) = currvmn_spl(mn_mode,:)
678 currumn(:,:,js) = 2*hs*(js - 1)*currumn(:,:,js)
680 currvmn(:,:,js) = 2*hs*(js - 1)*currvmn(:,:,js)
685 lmn(:,:,ns + 1) = lmn(:,:,ns + 1)
695 IF (parity .eq. f_cos)
THEN
696 lmn(
m0,-ntor:
n0,:) = 0
697 rmn(
m0,-ntor:-
n1,:) = 0
698 zmn(
m0,-ntor:
n0,:) = 0
699 currumn(
m0,-ntor:-
n1,:) = 0
700 currvmn(
m0,-ntor:-
n1,:) = 0
702 lmn(
m0,-ntor:-
n0,:) = 0
703 rmn(
m0,-ntor:
n0,:) = 0
704 zmn(
m0,-ntor:-
n1,:) = 0
705 currumn(
m0,-ntor:
n0,:) = 0
706 currvmn(
m0,-ntor:
n0,:) = 0
712 1000
FORMAT(
' It is recommended to increase the number of modes to at'
713 ' least VMEC values mpol=',i4,
' ntor=',i4)
732 SUBROUTINE vmec_info_spline_modes(ymn_vmec, ymn_spline, xm_in, istat)
738 REAL (dp),
DIMENSION(:,:),
INTENT(in) :: ymn_vmec
739 REAL (dp),
DIMENSION(:,:),
INTENT(out) :: ymn_spline
740 REAL (dp),
DIMENSION(:),
INTENT(in) :: xm_in
741 INTEGER,
INTENT(inout) :: istat
747 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: snodes_vmec
748 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: y2_vmec
749 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: fac1
750 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: y_vmec
751 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: snodes
752 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: fac2
753 REAL (dp),
ALLOCATABLE,
DIMENSION(:) :: y_spline
759 REAL (dp),
PARAMETER :: one = 1
764 IF (
SIZE(ymn_vmec, 2) .le. 1)
THEN
774 ALLOCATE(snodes_vmec(
SIZE(ymn_vmec, 2)))
775 ALLOCATE(y2_vmec(
SIZE(ymn_vmec, 2)))
776 ALLOCATE(fac1(
SIZE(ymn_vmec, 2)))
777 ALLOCATE(y_vmec(
SIZE(ymn_vmec, 2)))
779 ALLOCATE(snodes(
SIZE(ymn_spline, 2)))
780 ALLOCATE(fac2(
SIZE(ymn_spline, 2)))
781 ALLOCATE(y_spline(
SIZE(ymn_spline, 2)))
783 IF (
SIZE(snodes_vmec) .eq. ns_vmec)
THEN
787 snodes_vmec(
SIZE(snodes_vmec)) = 1
788 fac1(
SIZE(snodes_vmec)) = 1;
789 fac2(
SIZE(snodes)) = 1
790 snodes(
SIZE(snodes)) = 1
795 hsv = one/(ns_vmec - 1)
796 snodes_vmec(1) = 0; fac1(1) = 1;
798 snodes_vmec(js) = hsv*(js - offset)
799 fac1(js) = one/sqrt(snodes_vmec(js))
801 fac1(2:ns_vmec) = one/sqrt(snodes_vmec(2:ns_vmec))
809 snodes(js) = hs*(js - offset)
812 snodes = snodes*snodes
815 DO modes = 1,
SIZE(xm_in)
819 y_vmec = ymn_vmec(modes,:)
822 IF (istat.EQ.0 .and. mp.GT.0)
THEN
823 IF (mod(mp,2) .eq. 1)
THEN
828 y_vmec = y_vmec*(fac1**expm)
830 y_vmec(1) = 2*y_vmec(2) - y_vmec(3)
836 CALL spline(snodes_vmec, y_vmec,
SIZE(snodes_vmec),
837 lower_b, upper_b, y2_vmec)
840 DO js = 1,
SIZE(snodes)
841 CALL splint(snodes_vmec, y_vmec, y2_vmec,
842 SIZE(snodes_vmec), snodes(js), y_spline(js))
845 IF (istat .eq. 0 .and. mp .gt. 0 .and. expm .ne. 0)
THEN
846 y_spline = y_spline*(fac2**expm)
848 ymn_spline(modes,:) = y_spline(:)
853 DEALLOCATE(snodes_vmec)
874 SUBROUTINE vmec_info_spline_oned_array(y_vmec, y_spline, istat)
880 REAL (dp),
DIMENSION(ns_vmec),
INTENT(in) :: y_vmec
881 REAL (dp),
DIMENSION(ns),
INTENT(out) :: y_spline
882 INTEGER,
INTENT(OUT) :: istat
886 REAL (dp),
DIMENSION(ns_vmec) :: snodes_vmec
887 REAL (dp),
DIMENSION(ns_vmec) :: y2_vmec
888 REAL (dp),
DIMENSION(ns) :: snodes
892 REAL (dp),
PARAMETER :: one = 1
897 IF (ns_vmec .le. 1)
THEN
908 hs_vmec = one/(ns_vmec - 1)
910 snodes_vmec(js) = hs_vmec*(js - 1)
918 snodes(js) = hs*(js - 1)
919 snodes(js) = snodes(js)*snodes(js)
924 CALL spline(snodes_vmec, y_vmec, ns_vmec, lower_b, upper_b, y2_vmec
928 CALL splint(snodes_vmec, y_vmec, y2_vmec, ns_vmec,
929 snodes(js), y_spline(js))