1 SUBROUTINE funct3d_par (lscreen, ier_flag)
3 USE vacmod,
ONLY: bsqvac, bsqvac0, raxis_nestor, zaxis_nestor,
5 USE vmec_params,
ONLY: ntmax, norm_term_flag
10 USE precon2d,
ONLY: ictrl_prec2d, lhess_exact, l_edge
11 USE vparams,
ONLY: twopi
15 USE parallel_include_module
16 USE parallel_vmec_module,
ONLY: saxlastntype, zerolastntype,
24 INTEGER,
INTENT(inout) :: ier_flag
25 LOGICAL,
INTENT(in) :: lscreen
29 INTEGER :: l0pi, l, ivacskip
30 INTEGER :: nvskip0 = 0
31 REAL(dp),
DIMENSION(mnmax) ::
32 & rmnc, zmns, lmns, rmns, zmnc, lmnc
33 REAL(dp),
DIMENSION(:,:,:),
POINTER :: lu, lv
34 REAL(dp) :: presf_ns, delr_mse, delt0
35 REAL(dp) :: tbroadon, tbroadoff
36 REAL(dp),
EXTERNAL :: pmass
37 INTEGER :: i, j, k, nsmin, nsmax, m
38 REAL(dp),
ALLOCATABLE,
DIMENSION(:) :: bcastbuf
39 INTEGER,
DIMENSION(4) :: bbuf
46 nfunct3d = nfunct3d + 1
47 lu => pczmn; lv => pcrmn
51 active1:
IF (lactive)
THEN
52 IF (ictrl_prec2d .EQ. 3)
THEN
53 CALL saxpbylastntype(one, pxc, one, pxcdot, pgc)
54 CALL saxlastntype(pgc, pscalxc, pgc)
55 ELSE IF (ictrl_prec2d.EQ.1 .AND. l_colscale)
THEN
56 pgc = (pxc-pxsave)*pcol_scale + pxsave
57 CALL saxlastntype(pgc, pscalxc, pgc)
59 CALL saxlastntype(pxc, pscalxc, pgc)
71 CALL totzsps_par (pgc, pr1, pru, prv, pz1, pzu, pzv, lu, lv,
72 & prcon, pzcon, ier_flag)
78 CALL totzspa_par (pgc, parmn, pbrmn, pextra3, pazmn, pbzmn,
79 & pextra4, pblmn, pclmn, pextra1, pextra2)
83 CALL symrzl_par (pr1, pru, prv, pz1, pzu, pzv, lu, lv,
84 & prcon, pzcon, parmn, pbrmn, pextra3, pazmn,
85 & pbzmn, pextra4, pblmn, pclmn, pextra1,
99 nsmin=tlglob; nsmax=trglob
101 prcon(:,l,0) = prcon(:,l,0) + prcon(:,l,1)*psqrts(:,l)
102 pzcon(:,l,0) = pzcon(:,l,0) + pzcon(:,l,1)*psqrts(:,l)
103 pru0(:,l) = pru(:,l,0) + pru(:,l,1)*psqrts(:,l)
104 pzu0(:,l) = pzu(:,l,0) + pzu(:,l,1)*psqrts(:,l)
115 IF (ictrl_prec2d .EQ. 2)
THEN
117 prcon0(:,l) = prcon(:,l,0)
118 pzcon0(:,l) = pzcon(:,l,0)
120 ELSE IF (iter2 .EQ. iter1 .AND.
122 & ictrl_prec2d .EQ. 0)
THEN
124 ALLOCATE(bcastbuf(2*nznt))
125 bcastbuf(1:nznt)=prcon(:,ns,0)
126 bcastbuf(nznt+1:2*nznt)=pzcon(:,ns,0)
127 CALL second0(tbroadon)
128 CALL mpi_bcast(bcastbuf,
SIZE(bcastbuf),mpi_real8,nranks-1,
130 CALL second0(tbroadoff)
131 broadcast_time = broadcast_time + (tbroadoff-tbroadon)
132 prcon(:,ns,0)=bcastbuf(1:nznt)
133 pzcon(:,ns,0)=bcastbuf(nznt+1:2*nznt)
137 prcon0(:,l) = prcon(:,ns,0)*psqrts(:,l)**2
138 pzcon0(:,l) = pzcon(:,ns,0)*psqrts(:,l)**2
150 CALL second0(tbcovon)
151 CALL bcovar_par(lu, lv, pxc, ier_flag)
152 CALL second0(tbcovoff)
153 bcovar_time=bcovar_time+(tbcovoff - tbcovon)
157 CALL mpi_bcast( ier_flag, 1, mpi_integer, 0,
158 & runvmec_comm_world, mpi_err)
161 bbuf(1)=irst; bbuf(2)=iequi; bbuf(3)=ivac; bbuf(4)=iter2
162 CALL mpi_bcast(bbuf,4,mpi_integer,0,runvmec_comm_world,mpi_err)
163 irst=bbuf(1); iequi=bbuf(2); ivac=bbuf(3); iter2=bbuf(4)
164 CALL mpi_bcast(lfreeb,1,mpi_logical,0,runvmec_comm_world,mpi_err)
165 IF (ier_flag .ne. norm_term_flag)
RETURN
168 IF (irst.EQ.2 .AND. iequi.EQ.0)
THEN
169 CALL zerolastntype(pgc)
173 timer(tbcov) = timer(tbcov) + (tbcovoff - tbcovon)
186 IF (ictrl_prec2d.LE.1 .AND. (fsqr + fsqz).LE.1.e-3_dp)
189 IF (nvskip0 .EQ. 0) nvskip0 = max(1, nvacskip)
191 ivac0:
IF (ivac .GE. 0)
THEN
195 IF (ictrl_prec2d .EQ. 2)
THEN
196 prcon0(:,nsmin:nsmax) = 0; pzcon0(:,nsmin:nsmax) = 0
197 ELSE IF (ictrl_prec2d .EQ. 0)
THEN
198 prcon0(:,nsmin:nsmax) = 0.9_dp*prcon0(:,nsmin:nsmax)
199 pzcon0(:,nsmin:nsmax) = 0.9_dp*pzcon0(:,nsmin:nsmax)
202 CALL second0 (tvacon)
203 ivacskip = mod(iter2-iter1,nvacskip)
204 IF (ivac .LE. 2) ivacskip = 0
207 IF (ivacskip .EQ. 0)
THEN
208 nvacskip = one/max(1.e-1_dp, 1.e11_dp*(fsqr+fsqz))
209 nvacskip = max(nvacskip, nvskip0)
224 IF (ictrl_prec2d .NE. 0)
THEN
225 IF (lhess_exact .OR. ictrl_prec2d.EQ.2)
THEN
235 CALL convert_par(rmnc,zmns,lmns,rmns,zmnc,lmnc,pgc)
238 IF (ictrl_prec2d.EQ.0 .OR. ictrl_prec2d.EQ.2)
THEN
239 raxis_nestor(1:nzeta) = pr1(1:nzeta,1,0)
240 zaxis_nestor(1:nzeta) = pz1(1:nzeta,1,0)
243 ALLOCATE (bcastbuf(2*nzeta))
244 bcastbuf(1:nzeta) = raxis_nestor(1:nzeta)
245 bcastbuf(nzeta+1:2*nzeta) = zaxis_nestor(1:nzeta)
246 CALL second0(tbroadon)
247 CALL mpi_bcast(bcastbuf,
SIZE(bcastbuf),mpi_real8,0,
248 & runvmec_comm_world,mpi_err)
249 CALL second0(tbroadoff)
250 broadcast_time = broadcast_time + (tbroadoff - tbroadon)
251 raxis_nestor(1:nzeta) = bcastbuf(1:nzeta)
252 zaxis_nestor(1:nzeta) = bcastbuf(nzeta+1:2*nzeta)
253 DEALLOCATE (bcastbuf)
258 ALLOCATE (bcastbuf(2))
262 CALL second0(tbroadon)
263 CALL mpi_bcast(bcastbuf,
SIZE(bcastbuf),mpi_real8,
264 & nranks-1,ns_comm,mpi_err)
265 CALL second0(tbroadoff)
266 broadcast_time = broadcast_time + (tbroadoff -tbroadon)
269 CALL second0(tbroadon)
271 CALL mpi_bcast(bcastbuf,
SIZE(bcastbuf),mpi_real8,0,
274 CALL second0(tbroadoff)
275 broadcast_time = broadcast_time + (tbroadoff -tbroadon)
278 DEALLOCATE (bcastbuf)
282 IF (ictrl_prec2d .NE. 3 .OR.
284 CALL vacuum_par (rmnc, rmns, zmns, zmnc, xm, xn,
285 & ctor, rbtor, pwint_ns, ns, ivacskip,
286 & ivac, mnmax, ier_flag, lscreen)
287 IF (ictrl_prec2d .EQ. 2) bsqvac0 = bsqvac
289 bsqvac = bsqvac0; ier_flag = 0
293 IF (vnranks .LT. nranks)
THEN
295 CALL mpi_bcast(bsqvac,
SIZE(bsqvac),mpi_real8,0,
300 IF (ier_flag .NE. 0)
THEN
306 IF (ivac .EQ. 1)
THEN
307 irst = 2; delt0 = delt
308 CALL restart_iter(delt0)
319 presf_ns = pmass(hs*(ns-1.5_dp))
320 IF (presf_ns .NE. zero)
THEN
321 presf_ns = (pmass(1._dp)/presf_ns) * pres(ns)
325 bsqsav(l,3) = 1.5_dp*pbzmn_o(l,ns)
326 & - 0.5_dp*pbzmn_o(l,ns-1)
327 pgcon(l,ns) = bsqvac(l) + presf_ns
328 rbsq(l) = pgcon(l,ns)*(pr1(l,ns,0) + pr1(l,ns,1))*ohs
329 dbsq(l) = abs(pgcon(l,ns)-bsqsav(l,3))
332 IF (ivac .EQ. 1)
THEN
334 bsqsav(:nznt,1) = pbzmn_o(:,ns)
335 bsqsav(:nznt,2) = bsqvac(:nznt)
337 CALL mpi_bcast(bsqsav(:,1),nznt,mpi_real8,
338 & nranks-1,ns_comm,mpi_err)
341 ELSE IF (ictrl_prec2d .NE. 3)
THEN
343 CALL mpi_bcast(bsqsav(:,1),nznt,mpi_real8,
348 CALL second0 (tvacoff)
349 timer(tvac) = timer(tvac) + (tvacoff - tvacon)
350 IF (ictrl_prec2d .GE. 2)
THEN
351 timer(tvac_2d) = timer(tvac_2d)+ (tvacoff - tvacon)
358 active2:
IF (lactive)
THEN
359 IF (iequi .NE. 1)
THEN
361 pextra1(:,l,0) = (prcon(:,l,0) - prcon0(:,l))*pru0(:,l)
362 & + (pzcon(:,l,0) - pzcon0(:,l))*pzu0(:,l)
364 CALL alias_par (pgcon, pextra1(:,:,0), pgc, pgc(1+mns),
365 & pgc(1+2*mns), pextra1(:,:,1))
368 pxc(:ns) = pxc(:ns) + delr_mse
382 CALL symforce_par (parmn, pbrmn, pcrmn, pazmn, pbzmn,
383 & pczmn, pblmn, pclmn, prcon, pzcon, pr1,
384 & pru, prv, pz1, pzu, pzv, pextra3,
385 & pextra4, pextra1, pextra2)
392 CALL tomnsps_par (pgc, parmn, pbrmn, pcrmn, pazmn, pbzmn,
393 & pczmn, pblmn, pclmn, prcon, pzcon)
396 CALL tomnspa_par (pgc, pr1, pru, prv, pz1, pzu, pzv,
397 & pextra3, pextra4, pextra1, pextra2)
405 CALL second0 (treson)
407 CALL saxlastntype(pgc, pscalxc, pgc)
409 CALL residue_par(pgc, pgc(1+irzloff), pgc(1+2*irzloff))
415 IF (gnranks .GT. nranks)
THEN
416 ALLOCATE(bcastbuf(6))
417 bcastbuf(1) = fsqr; bcastbuf(2) = fsqr1
418 bcastbuf(3) = fsqz; bcastbuf(4) = fsqz1
419 bcastbuf(5) = fsql; bcastbuf(6) = fsql1
420 CALL second0(tbroadon)
421 CALL mpi_bcast(bcastbuf,
SIZE(bcastbuf),mpi_real8,0,
422 & runvmec_comm_world,mpi_err)
423 CALL second0(tbroadoff)
424 broadcast_time = broadcast_time + (tbroadoff -tbroadon)
425 fsqr = bcastbuf(1); fsqr1 = bcastbuf(2)
426 fsqz = bcastbuf(3); fsqz1 = bcastbuf(4)
427 fsql = bcastbuf(5); fsql1 = bcastbuf(6)
435 & (fsqr + fsqz +fsql) .gt. 1.e2_dp)
THEN
439 CALL second0 (tresoff)
440 timer(tres) = timer(tres) + (tresoff - treson)
444 CALL second0 (tfunoff)
445 timer(tfun) = timer(tfun) + (tfunoff - tfunon)
446 IF (ictrl_prec2d .GE. 2)
THEN
447 timer(tfun_2d) = timer(tfun_2d) + (tfunoff - tfunon)
450 END SUBROUTINE funct3d_par
452 SUBROUTINE funct3d (lscreen, ier_flag)
455 USE vac2_vacmod,
ONLY: mf, nf, bsqvac
457 USE vacmod,
ONLY: bsqvac, bsqvac0, raxis_nestor, zaxis_nestor
459 USE vmec_params,
ONLY: ntmax
464 USE precon2d,
ONLY: ictrl_prec2d, lhess_exact, l_edge
465 USE vparams,
ONLY: twopi
470 USE angle_constraints,
ONLY: getrz, getfrho, xtempa
476 INTEGER,
INTENT(inout) :: ier_flag
477 LOGICAL,
INTENT(in) :: lscreen
481 INTEGER :: l0pi, l, lk, ivacskip
482 INTEGER :: nvskip0 = 0
483 REAL(dp),
DIMENSION(mnmax) ::
484 1 rmnc, zmns, lmns, rmns, zmnc, lmnc
485 REAL(dp),
DIMENSION(:),
POINTER :: lu, lv
486 REAL(dp) :: presf_ns, delr_mse, delt0
487 REAL(dp),
EXTERNAL :: pmass
492 lu => czmn; lv => crmn
494 CALL second0 (tfunon)
503 IF (ictrl_prec2d .EQ. 3)
THEN
504 gc(:neqs) = scalxc(:neqs)*(xc(:neqs)+xcdot(:neqs))
506 gc(:neqs) = scalxc(:neqs)*xc(:neqs)
516 CALL totzsps (gc, r1, ru, rv, z1, zu, zv, lu, lv, rcon, zcon)
521 CALL totzspa (gc, armn, brmn, extra3, azmn, bzmn, extra4,
522 & blmn, clmn, extra1, extra2)
526 CALL symrzl (r1, ru, rv, z1, zu, zv, lu, lv, rcon, zcon,
527 & armn, brmn, extra3, azmn, bzmn, extra4, blmn,
528 & clmn, extra1, extra2)
531 l0pi = ns*(1 + nzeta*(ntheta2 - 1))
532 router = r1(ns,0) + r1(ns,1)
533 rinner = r1(l0pi,0) + r1(l0pi,1)
541 rcon(:nrzt,0) = rcon(:nrzt,0) + rcon(:nrzt,1)*sqrts(:nrzt)
542 zcon(:nrzt,0) = zcon(:nrzt,0) + zcon(:nrzt,1)*sqrts(:nrzt)
544 ru0(:nrzt) = ru(:nrzt,0) + ru(:nrzt,1)*sqrts(:nrzt)
545 zu0(:nrzt) = zu(:nrzt,0) + zu(:nrzt,1)*sqrts(:nrzt)
557 IF (ictrl_prec2d .EQ. 2)
THEN
558 rcon0(1:nrzt) = rcon(1:nrzt,0)
559 zcon0(1:nrzt) = zcon(1:nrzt,0)
560 ALLOCATE(bsqvac0(nznt))
561 ELSE IF (iter2 .EQ. iter1 .AND.
563 & ictrl_prec2d .EQ. 0)
THEN
565 rcon0(l:nrzt:ns) = rcon(ns:nrzt:ns,0)*sqrts(l:nrzt:ns)**2
566 zcon0(l:nrzt:ns) = zcon(ns:nrzt:ns,0)*sqrts(l:nrzt:ns)**2
574 IF (irst .EQ. 2 .AND.
584 CALL second0 (tbcovon)
587 CALL second0 (tbcovoff)
588 timer(tbcov) = timer(tbcov) + (tbcovoff - tbcovon)
597 IF (lfreeb .and. iter2.gt.1 .and. iequi.eq.0)
THEN
598 IF (ictrl_prec2d .le. 1 .and.
599 & (fsqr + fsqz) .le. 1.e-3_dp)
THEN
602 IF (nvskip0 .eq. 0)
THEN
603 nvskip0 = max(1, nvacskip)
605 ivac0:
IF (ivac .ge. 0)
THEN
608 IF (ictrl_prec2d .eq. 2)
THEN
610 ELSE IF (ictrl_prec2d .eq. 0)
THEN
611 rcon0 = 0.9_dp*rcon0; zcon0 = 0.9_dp*zcon0
613 CALL second0 (tvacon)
614 ivacskip = mod(iter2-iter1,nvacskip)
615 IF (ivac .LE. 2)
THEN
620 IF (ivacskip .eq. 0)
THEN
621 nvacskip = one/max(1.e-1_dp, 1.e11_dp*(fsqr+fsqz))
622 nvacskip = max(nvacskip, nvskip0)
636 IF (ictrl_prec2d .NE. 0)
THEN
637 IF (lhess_exact .OR. ictrl_prec2d.EQ.2)
THEN
646 CALL convert (rmnc, zmns, lmns, rmns, zmnc, lmnc, gc, ns)
647 IF (ictrl_prec2d.NE.3 .OR. l_edge)
THEN
649 CALL vac2_vacuum(rmnc, rmns, zmns, zmnc, xm, xn, ctor,
654 IF (ictrl_prec2d .EQ. 0 .OR.
655 & ictrl_prec2d .EQ. 2)
THEN
656 raxis_nestor(1:nzeta) = r1(1:ns*nzeta:ns,0)
657 zaxis_nestor(1:nzeta) = z1(1:ns*nzeta:ns,0)
660 CALL vacuum (rmnc, rmns, zmns, zmnc, xm, xn,
661 & ctor, rbtor, wint, ns, ivacskip, ivac,
662 & mnmax, ier_flag, lscreen)
663 IF (ictrl_prec2d .EQ. 2)
THEN
672 IF (ier_flag .NE. 0)
THEN
678 IF (ivac .eq. 1)
THEN
679 irst = 2; delt0 = delt
683 CALL restart_iter(delt0)
697 presf_ns = pmass(hs*(ns-1.5_dp))
698 IF (presf_ns .ne. zero)
THEN
699 presf_ns = (pmass(one)/presf_ns) * pres(ns)
707 bsqsav(lk,3) = 1.5_dp*bzmn_o(l) - 0.5_dp*bzmn_o(l-1)
709 gcon(l) = bsqvac(lk) + pperp_ns(lk)
711 gcon(l) = bsqvac(lk) + presf_ns
714 rbsq(lk) = gcon(l)*(r1(l,0) + r1(l,1))*ohs
715 dbsq(lk) = abs(gcon(l)-bsqsav(lk,3))
726 IF (ivac .eq. 1)
THEN
727 bsqsav(:nznt,1) = bzmn_o(ns:nrzt:ns)
728 bsqsav(:nznt,2) = bsqvac(:nznt)
730 CALL second0 (tvacoff)
731 timer(tvac) = timer(tvac) + (tvacoff - tvacon)
732 IF (ictrl_prec2d .GE. 2)
THEN
733 timer(tvac_2d) = timer(tvac_2d)+ (tvacoff - tvacon)
744 IF (iequi .EQ. 1)
THEN
748 IF (iequi .NE. 1)
THEN
749 extra1(:nrzt,0) = (rcon(:nrzt,0) - rcon0(:nrzt))*ru0(:nrzt)
750 & + (zcon(:nrzt,0) - zcon0(:nrzt))*zu0(:nrzt)
751 CALL alias (gcon, extra1(:,0), gc, gc(1+mns), gc(1+2*mns),
754 IF (lrecon) xc(:ns) = xc(:ns) + delr_mse
777 CALL symforce (armn, brmn, crmn, azmn, bzmn,
778 & czmn, blmn, clmn, rcon, zcon, r1, ru, rv,
779 & z1, zu, zv, extra3, extra4, extra1, extra2)
786 CALL tomnsps (gc, armn, brmn, crmn, azmn, bzmn, czmn,
787 & blmn, clmn, rcon, zcon)
790 CALL tomnspa (gc, r1, ru, rv, z1, zu, zv,
791 & extra3, extra4, extra1, extra2)
799 CALL second0 (treson)
805 CALL residue (gc, gc(1+irzloff), gc(1+2*irzloff))
809 & (fsqr + fsqz + fsql) .gt. 1.e2_dp)
THEN
813 CALL second0 (tresoff)
814 timer(tres) = timer(tres) + (tresoff - treson)
821 CALL second0 (tfunoff)
822 timer(tfun) = timer(tfun) + (tfunoff - tfunon)
823 IF (ictrl_prec2d .GE. 2)
THEN
824 timer(tfun_2d) = timer(tfun_2d) + (tfunoff - tfunon)
827 END SUBROUTINE funct3d