V3FIT
spectrum.f
1  SUBROUTINE spectrum_par(rmn, zmn)
2  USE parallel_include_module
3  USE vmec_main
4  USE vmec_params, ONLY: mscale, nscale, ntmax, rss, zcs, rsc, zcc
5  USE totzsp_mod, ONLY: convert_sym, convert_asym
6  USE totzsp_mod, ONLY: convert_sym_par, convert_asym_par
7 
8  IMPLICIT NONE
9 C-----------------------------------------------
10 C D u m m y A r g u m e n t s
11 C-----------------------------------------------
12  REAL(dp), DIMENSION(0:ntor,0:mpol1,ns,ntmax),
13  1 INTENT(inout) :: rmn, zmn
14 C-----------------------------------------------
15 C L o c a l V a r i a b l e s
16 C-----------------------------------------------
17  INTEGER, PARAMETER :: m1 = 1
18  INTEGER :: js, ntype, n, m, nsmin, nsmax
19  REAL(dp), DIMENSION(ns) :: t1, dnumer, denom
20  REAL(dp) :: scale
21 C-----------------------------------------------
22 !
23 ! CONVERT FROM INTERNAL XC REPRESENTATION FOR m=1 MODES, R+(at rsc) = .5(rsc + zcc),
24 ! R-(at zcc) = .5(rsc - zcc), TO REQUIRED rsc, zcc FORMS
25 !
26  nsmin=max(2,tlglob); nsmax=min(t1rglob,ns)
27 #ifndef _HBANGLE
28  IF (lthreed) THEN
29  CALL convert_sym_par(rmn(:,m1,:,rss), zmn(:,m1,:,zcs),
30  & nsmin, nsmax)
31  END IF
32  IF (lasym) THEN
33  CALL convert_asym_par(rmn(:,m1,:,rsc), zmn(:,m1,:,zcc),
34  & nsmin, nsmax)
35  END IF
36 #endif
37  dnumer(nsmin:nsmax) = zero
38  denom(nsmin:nsmax) = zero
39  DO ntype = 1,ntmax
40  DO n = 0,ntor
41  DO m = 1,mpol1
42  scale = (mscale(m)*nscale(n))**2
43  DO js = nsmin,nsmax
44  t1(js) = (rmn(n,m,js,ntype)**2 +
45  & zmn(n,m,js,ntype)**2)*scale
46  END DO
47  dnumer(nsmin:nsmax) = dnumer(nsmin:nsmax)
48  & + t1(nsmin:nsmax)*xmpq(m,3)
49  denom(nsmin:nsmax) = denom(nsmin:nsmax)
50  & + t1(nsmin:nsmax)*xmpq(m,2)
51  END DO
52  END DO
53  END DO
54 
55  specw(nsmin:nsmax) = dnumer(nsmin:nsmax)/denom(nsmin:nsmax)
56 
57  END SUBROUTINE spectrum_par
58 
59  SUBROUTINE spectrum(rmn, zmn)
60  USE vmec_main
61  USE vmec_params, ONLY: mscale, nscale, ntmax, rss, zcs, rsc, zcc
62  USE totzsp_mod, ONLY: convert_sym, convert_asym
63  USE parallel_include_module
64  IMPLICIT NONE
65 C-----------------------------------------------
66 C D u m m y A r g u m e n t s
67 C-----------------------------------------------
68  REAL(dp), DIMENSION(ns,0:ntor,0:mpol1,ntmax),
69  1 INTENT(inout) :: rmn, zmn
70 C-----------------------------------------------
71 C L o c a l V a r i a b l e s
72 C-----------------------------------------------
73  INTEGER, PARAMETER :: m1 = 1
74  INTEGER :: js, ntype, n, m, nsmin, nsmax
75  REAL(dp), DIMENSION(ns) :: t1, dnumer, denom
76  REAL(dp) :: scale
77 C-----------------------------------------------
78 !
79 ! CONVERT FROM INTERNAL XC REPRESENTATION FOR m=1 MODES, R+(at rsc) = .5(rsc + zcc),
80 ! R-(at zcc) = .5(rsc - zcc), TO REQUIRED rsc, zcc FORMS
81 !
82  nsmin=max(2,tlglob)
83  nsmax=min(t1rglob,ns)
84 #ifndef _HBANGLE
85  IF (lthreed) THEN
86  CALL convert_sym(rmn(:,:,m1,rss), zmn(:,:,m1,zcs))
87  END IF
88  IF (lasym) THEN
89  CALL convert_asym(rmn(:,:,m1,rsc), zmn(:,:,m1,zcc))
90  END IF
91 #endif
92  dnumer(2:ns) = zero
93  denom(2:ns) = zero
94  DO ntype = 1,ntmax
95  DO n = 0,ntor
96  DO m = 1,mpol1
97  scale = (mscale(m)*nscale(n))**2
98  DO js = 2,ns
99  t1(js) =(rmn(js,n,m,ntype)**2 +
100  & zmn(js,n,m,ntype)**2)*scale
101  END DO
102  dnumer(2:ns) = dnumer(2:ns) + t1(2:ns)*xmpq(m,3)
103  denom(2:ns) = denom(2:ns) + t1(2:ns)*xmpq(m,2)
104  END DO
105  END DO
106  END DO
107 
108  specw(2:ns) = dnumer(2:ns)/denom(2:ns)
109 
110  END SUBROUTINE spectrum