V3FIT
write_dcon.f
1  SUBROUTINE write_dcon (rzl_array)
2  USE vmec_main, fpsi=>bvcof
3  USE vmec_params, ONLY: ntmax, rcc, rsc, zsc, zcc, mscale, nscale
4  USE realspace
5  IMPLICIT NONE
6 C-----------------------------------------------
7 C D u m m y A r g u m e n t s
8 C-----------------------------------------------
9  REAL(rprec), DIMENSION(ns,0:ntor,0:mpol1,3*ntmax),
10  1 TARGET, INTENT(in) :: rzl_array
11 C-----------------------------------------------
12 C L o c a l V a r i a b l e s
13 C-----------------------------------------------
14  INTEGER :: istat, m
15  REAL(rprec), ALLOCATABLE, DIMENSION(:,:,:) :: rmncc, rmnsc, zmnsc, &
16  & zmncc, lmnsc, lmncc
17  REAL(rprec) :: t1(0:mpol1)
18  CHARACTER*(256) :: dcon_file
19 C-----------------------------------------------
20  t1 = nscale(0)*mscale(0:mpol1)
21 
22  ALLOCATE (rmncc(ns,0:0,0:mpol1), zmnsc(ns,0:0,0:mpol1), &
23  & lmnsc(ns,0:0,0:mpol1), stat=istat)
24  IF (istat .ne. 0) stop 'Allocation error in write_dcon'
25  DO m=0,mpol1
26  rmncc(:,0,m) = rzl_array(:,0,m,rcc)*t1(m) !!COS(mu) COS(nv)
27  zmnsc(:,0,m) = rzl_array(:,0,m,zsc+ntmax)*t1(m) !!SIN(mu) COS(nv)
28  lmnsc(:,0,m) = rzl_array(:,0,m,zsc+2*ntmax)*t1(m) !!SIN(mu) COS(nv)
29  END DO
30 
31  IF (lasym) THEN
32  ALLOCATE (rmnsc(ns,0:0,0:mpol1), zmncc(ns,0:0,0:mpol1), &
33  & lmncc(ns,0:0,0:mpol1), stat=istat)
34  IF (istat .ne. 0) stop 'Allocation error in write_dcon'
35  DO m=0,mpol1
36  rmnsc(:,0,m) = rzl_array(:,0,m,rsc)*t1(m) !!SIN(mu) COS(nv)
37  zmncc(:,0,m) = rzl_array(:,0,m,zcc+ntmax)*t1(m) !!COS(mu) COS(nv)
38  lmncc(:,0,m) = rzl_array(:,0,m,zcc+2*ntmax)*t1(m) !!COS(mu) COS(nv)
39  END DO
40  ENDIF
41 
42 ! HERE, FULL(i) = (i-1)*hs, i=1,ns (hs=1/(ns-1))
43 ! HALF(i) = (i-1.5)*hs, i=2,ns
44 
45  dcon_file = "dcon_" // trim(input_extension) // ".txt"
46  OPEN (unit=51,file=dcon_file,form='FORMATTED',iostat=istat)
47  IF (istat .ne. 0) stop 'Error writing dcon output file'
48 
49  IF (mnmax .ne. mpol) stop 'THIS IS NOT AXISYMMETRIC!'
50 
51  WRITE (51, *) ns !Number of flux surfaces
52  WRITE (51, *) mpol !Number of poloidal modes, m=[0:mpol-1]
53  WRITE (51, *) lasym !Up-down sym:=F
54  WRITE (51, *) rmncc(1:ns,0,0:mpol1) !r = sum [rmnc * cos (mu)], full mesh
55  WRITE (51, *) zmnsc(1:ns,0,0:mpol1) !z = sum [zmns * sin (mu)], full mesh
56  WRITE (51, *) lmnsc(1:ns,0,0:mpol1) !lam = sum[lmns * sin(mu)], half mesh
57 ! NOTE: u + lam give a straight magnetic field line
58  IF (lasym) THEN
59  WRITE (51, *) rmnsc(1:ns,0,0:mpol1) !r = r+sum [rmns * sin (mu)], full mesh
60  WRITE (51, *) zmncc(1:ns,0,0:mpol1) !z = z+sum [zmnc * cos (mu)], full mesh
61  WRITE (51, *) lmncc(1:ns,0,0:mpol1) !lam = lam+sum[lmnc * cos(mu)], half mesh
62  END IF
63  WRITE (51, *) chi(1:ns) !pol flux, full mesh (included 2*pi factor)
64  WRITE (51, *) fpsi(1:ns) !R*BT, full mesh
65  WRITE (51, *) presf(1:ns)/mu0 !pressure, full mesh (MKS units)
66  WRITE (51, *) 1/iotaf(1:ns) !q, full mesh
67 
68  CLOSE (unit=51)
69 
70  DEALLOCATE (rmncc, zmnsc, lmnsc, stat=istat)
71  IF (lasym) DEALLOCATE (rmnsc, zmncc, lmncc, stat=istat)
72 
73  END SUBROUTINE write_dcon