1 SUBROUTINE getbsubs (bsubsmn, frho, bsupu, bsupv, mmax,
4 USE vmec_input,
ONLY: nfp, nzeta, lasym
5 USE vmec_dim,
ONLY: ntheta1, ntheta2, ntheta3
6 USE vmec_persistent,
ONLY: cosmu, sinmu, cosnv, sinnv
7 USE vmec_main,
ONLY: r0scale
12 INTEGER,
INTENT(in) :: mmax, nmax
13 INTEGER,
INTENT(out) :: info
14 REAL(rprec),
INTENT(out) :: bsubsmn(0:mmax, -nmax:nmax, 0:1)
15 REAL(rprec),
DIMENSION(nzeta, ntheta3),
INTENT(in) ::
20 REAL(rprec),
PARAMETER :: p5 = 0.5_dp, one = 1
24 INTEGER :: i, j, m, n, nmax1, itotal, ijtot, mntot
25 REAL(rprec) :: ccmn, ssmn, csmn, scmn, dm, dn, termsc, termcs,
27 REAL(rprec),
ALLOCATABLE :: amatrix(:,:), save_matrix(:,:),
46 IF ((mmax+1 .ne. ntheta2) .or. (nmax .ne. nzeta/2))
RETURN
49 itotal = ntheta3*nzeta
50 IF (.not.lasym) itotal = itotal - 2*nmax1
51 ALLOCATE (amatrix(itotal, itotal),
52 1 brhs(itotal), save_matrix(itotal, itotal), stat=m)
53 IF (m .ne. 0) stop
'Allocation error in getbsubs'
68 lpior0 = ((i.eq.1 .or. i.eq.ntheta2) .and. (j.gt.nzeta/2+1))
69 IF (lpior0 .and. .not. lasym) cycle
71 brhs(ijtot) = frho(j,i)
75 IF (mntot .ge. itotal)
EXIT
76 IF (m.eq.0 .and. n.eq.0 .and. lasym) cycle
78 ccmn = cosmu(i,m)*cosnv(j,n)
79 ssmn = sinmu(i,m)*sinnv(j,n)
81 dn = n * bsupv(j,i) * nfp
82 termsc = dm*ccmn - dn*ssmn
83 termcs =-dm*ssmn + dn*ccmn
84 IF (n.eq.0 .or. n.eq.nmax)
THEN
86 amatrix(ijtot,mntot) = termsc
87 ELSE IF (n .eq. 0)
THEN
88 amatrix(ijtot,mntot) = bsupv(j,i)
90 amatrix(ijtot,mntot) = termcs
92 ELSE IF (m.eq.0 .or. m.eq.mmax)
THEN
93 amatrix(ijtot,mntot) = termcs
95 amatrix(ijtot,mntot) = termsc
97 amatrix(ijtot,mntot) = termcs
100 IF (.not.lasym) cycle
101 IF (m.eq.0 .and. (n.eq.0 .or. n.eq.nmax)) cycle
103 IF (mntot .ge. itotal)
EXIT
105 csmn = cosmu(i,m)*sinnv(j,n)
106 scmn = sinmu(i,m)*cosnv(j,n)
107 termcc =-dm*scmn - dn*csmn
108 termss = dm*csmn + dn*scmn
110 IF ((n.eq.0 .or. n.eq.nmax) .or.
111 1 (m.eq.0 .or. m.eq.mmax))
THEN
112 amatrix(ijtot,mntot) = termcc
114 amatrix(ijtot,mntot) = termcc
116 amatrix(ijtot,mntot) = termss
124 save_matrix = amatrix
127 IF (ijtot .ne. itotal .or. mntot .ne. itotal)
THEN
128 print *,
' itotal = ', itotal,
' ijtot = ', ijtot,
130 print *,
' ntheta3: ',ntheta3,
' nzeta: ', nzeta,
131 1
' mnyq: ', mmax,
' nnyq: ', nmax
134 CALL solver (amatrix, brhs, itotal, 1, info)
135 IF (info .ne. 0)
GOTO 200
145 lpior0 = ((i.eq.1 .or. i.eq.ntheta2) .and. (j.gt.nzeta/2+1))
146 IF (lpior0 .and. .not.lasym) cycle
148 amn = sum(save_matrix(ijtot,:)*brhs(:))
149 IF (abs(amn) .lt. 1.e-12_dp) cycle
150 IF (abs(frho(j,i) - amn) .gt. 1.e-8_dp*abs(amn))
THEN
151 print 50,
'In GETbsubs, i = ',i,
' j = ',j,
152 1
' Original force = ', frho(j,i),
' Final force = ', amn
156 50
FORMAT(a,i5,a,i5,a,1p,e10.3,a,1p,e10.3)
166 IF (mntot .ge. itotal)
EXIT
167 IF (m.eq.0 .and. n.eq.0 .and. lasym) cycle
169 IF (n.eq.0 .or. n.eq.nmax)
THEN
171 bsubsmn(m,n,0) = brhs(mntot)
172 ELSE IF (n .eq. 0)
THEN
173 bsubsmn(m,n,0) = brhs(mntot)
175 bsubsmn(m,-n,0) = brhs(mntot)
177 ELSE IF (m.eq.0 .or. m.eq.mmax)
THEN
178 bsubsmn(m,-n,0) = brhs(mntot)
180 bsubsmn(m,n,0) = brhs(mntot)
182 bsubsmn(m,-n,0) = brhs(mntot)
185 IF (.not.lasym) cycle
186 IF (m.eq.0 .and. (n.eq.0 .or. n.eq.nmax)) cycle
187 IF (mntot .ge. itotal)
EXIT
190 IF ((n.eq.0 .or. n.eq.nmax) .or.
191 1 (m.eq.0 .or. m.eq.mmax))
THEN
192 bsubsmn(m,n,1) = brhs(mntot)
194 bsubsmn(m,n,1) = brhs(mntot)
196 bsubsmn(m,-n,1)= brhs(mntot)
202 IF (mntot .ne. ijtot) info = -2
206 DEALLOCATE (amatrix, save_matrix, brhs)
208 END SUBROUTINE getbsubs