1 SUBROUTINE eqsolve(ier_flag, lscreen)
3 USE vmec_params,
ONLY: ntmax, ns4, jac75_flag, norm_term_flag,
4 & bad_jacobian_flag, more_iter_flag,
6 USE precon2d,
ONLY: scratchfile, lswap2disk, ictrl_prec2d
7 USE directaccess,
ONLY: deletedafile
8 USE gmres_mod,
ONLY: nfcn
13 USE parallel_include_module
14 USE parallel_vmec_module,
ONLY: zerolastntype
15 USE vacmod,
ONLY: nuv, nuv3
25 REAL(dp),
PARAMETER :: p98 = 0.98_dp, p96 = 0.96_dp
29 REAL(dp) :: w1, r00s, w0, wdota, r0dot, teqsolon, teqsoloff
30 LOGICAL :: liter_flag, lreset_internal
50 CALL second0(teqsolon)
52 liter_flag = iter2 .eq. 1
70 CALL zerolastntype(pxc)
71 CALL profil3d_par(pxc(1), pxc(1+irzloff), lreset_internal,
75 CALL profil3d(xc(1),xc(1+irzloff),lreset_internal,.false.)
79 IF (liter_flag)
CALL restart_iter(delt0r)
83 ier_flag = norm_term_flag
88 iter_loop:
DO WHILE (liter_flag)
92 CALL evolve (delt0r, ier_flag, liter_flag, lscreen)
94 IF (ijacob .eq. 0 .and.
95 & (ier_flag .eq. bad_jacobian_flag .or.
99 IF (ier_flag .eq. bad_jacobian_flag)
THEN
100 IF (rank.EQ.0)
WRITE (*,50)
102 IF (rank.EQ.0)
WRITE (*,51)
105 50
FORMAT(
' INITIAL JACOBIAN CHANGED SIGN!')
106 51
FORMAT(
' TRYING TO IMPROVE INITIAL MAGNETIC AXIS GUESS')
109 CALL guess_axis_par (pr1, pz1, pru0, pzu0, lscreen)
111 CALL guess_axis (r1, z1, ru0, zu0)
114 lreset_internal = .true.
118 ELSE IF (ier_flag .NE. norm_term_flag .AND.
119 1 ier_flag .NE. successful_term_flag)
THEN
124 w0 = wb + wpar/(gamma-one)
126 w0 = wb + wp/(gamma - one)
132 IF (ijacob .eq. 25)
THEN
134 CALL restart_iter(delt0r)
136 IF (lscreen) print 120, delt0r
139 ELSE IF (ijacob .eq. 50)
THEN
141 CALL restart_iter(delt0r)
143 IF (lscreen) print 120, delt0r
146 ELSE IF (ijacob .ge. 75)
THEN
147 ier_flag = jac75_flag
149 ELSE IF (iter2.ge.niter .and. liter_flag)
THEN
150 ier_flag = more_iter_flag
155 wdota = abs(w0 - w1)/w0
157 CALL mpi_bcast(r00, 1, mpi_real8, 0, ns_comm, mpi_err)
159 r0dot = abs(r00 - r00s)/r00
162 IF (ivac .eq. 1)
THEN
163 IF (grank .EQ. 0)
THEN
164 IF (lscreen) print 110, iter2
165 WRITE (nthreed, 110) iter2
172 IF (mod(iter2,nstep) .eq. 0 .or.
174 & .not.liter_flag)
THEN
175 CALL printout(iter2, delt0r, w0, lscreen)
184 IF (.not.parvmec)
THEN
185 CALL vmec_history_store(delt0r)
191 IF (mod(iter2,niter/nstore_seq + 1) .eq. 0 .and.
192 & ns .eq. ns_array(multi_ns_grid))
THEN
193 IF (itfsq .lt. nstore_seq)
THEN
195 fsqt(itfsq) = fsqr + fsqz
196 wdot(itfsq) = max(wdota,c1pm13)
210 IF (ictrl_prec2d .gt. 0)
THEN
211 CALL restart_iter(delt0r)
215 IF (lswap2disk)
CALL deletedafile(scratchfile)
217 IF (grank .EQ. 0)
THEN
218 WRITE (nthreed, 60) w0*twopi**2, wdota, r0dot
219 IF (lrecon)
WRITE (nthreed, 70) r00*fsqsum0/wb
220 IF (nfcn .GT. 0)
WRITE (nthreed, 80) nfcn
223 CALL second0(teqsoloff)
224 eqsolve_time = eqsolve_time + (teqsoloff-teqsolon)
226 60
FORMAT(/,
' MHD Energy = ',1p,e12.6,3x,
'd(ln W)/dt = ',1p,e9.3,
227 & 3x,
'd(ln R0)/dt = ',e9.3)
228 70
FORMAT(
' Average radial force balance: Int[FR(m=0)]',
229 &
'/Int(B**2/R) = ',1p,e12.5,
' (should tend to zero)'/)
230 80
FORMAT(
' Function calls in GMRES: ',i5)
231 110
FORMAT(/,2x,
'VACUUM PRESSURE TURNED ON AT ',i4,
' ITERATIONS'/)
232 120
FORMAT(2x,
'HAVING A CONVERGENCE PROBLEM: RESETTING DELT TO ',f8.3,
233 & /,2x,
'If this does NOT resolve the problem, try changing ',
234 &
'(decrease OR increase) the value of DELT')
236 END SUBROUTINE eqsolve