ETS  \$Id: Doxyfile 2162 2020-02-26 14:16:09Z g2dpc $
All Classes Files Functions Variables Pages
write_eqdsk.f90
Go to the documentation of this file.
1 subroutine write_eqdsk(a, curr, r0, b0, qprof, path)
2 !-----------------------------------------------------------------------
3 ! write eqdsk file, but without the flux surfaces, which are set to 0.
4 !-----------------------------------------------------------------------
5 
6  use itm_types
7  use mod_parameter
8  use mod_dat
9  use mod_mesh
10  use mod_helena_io
11  use mod_profiles
12  use mod_spline
13  use helena_spline
14 
15  implicit none
16 
17  character(len = 132) :: path
18  integer(itm_i4), parameter :: out_eqdsk = 11
19 
20  real(r8), intent(in) :: a, curr, r0, b0
21  real(r8), dimension(nr), intent(in) :: qprof
22 
23  real(r8), parameter :: zmu0 = 4e-7_r8 * pi
24 
25  real(r8), dimension(nr) :: p0tmp, dptmp, ftmp, dftmp
26  real(r8), dimension(3) :: ablt
27  real(r8) :: flux
28  real(r8) :: radius, cpsurf
29  real(r8) :: rbscale
30  real(r8) :: reast, rwest, rgridl
31  real(r8) :: zmid, rmaxis, zmaxis, xip
32  integer(itm_i4) :: i, j, np2
33 
34  real(r8) :: dp_dpsi, dgamma_dpsi
35 
36 !-- spline p_int and gam_int with use of known derivatives
37  call allocate_spline_coefficients(p_spline, npts)
38  call allocate_spline_coefficients(rbphi_spline, npts)
39 
40  call spline(npts, psivec, p_int, dpres(1) * sign(1._r8, cpsurfin), &
41  dpres(npts) * sign(1._r8, cpsurfin), 1, p_spline)
42  call spline(npts, psivec, gam_int, dgam(1) * sign(1._r8, cpsurfin), &
43  dgam(npts) * sign(1._r8, cpsurfin), 1, rbphi_spline)
44 
45  do i = 1, nr
46  flux = (i - 1) / dble(nr - 1)
47  if (hbt) then
48  p0tmp(i) = 0.5_r8 * a * b * spwert(npts, flux, p_spline, psivec, ablt, &
49  0) * sign(1.0_r8, -alfa)
50  dptmp(i) = -0.5_r8 * a * b * dp_dpsi(flux)
51  ftmp(i) = p0tmp(i) + eps * a * spwert(npts, flux, rbphi_spline, psivec, &
52  ablt, 0) * sign(1.0_r8, -alfa) * sign(1.0_r8, a)
53  dftmp(i) = dptmp(i) - eps * a * dgamma_dpsi(flux)
54  else
55  p0tmp(i) = eps * a * b * spwert(npts, flux, p_spline, psivec, ablt, 0) &
56  * sign(1.0_r8, -alfa)
57  dptmp(i) = -eps * a * b * dp_dpsi(flux)
58  ftmp(i) = eps * a * spwert(npts, flux, rbphi_spline, psivec, ablt, 0) &
59  * sign(1.0_r8, -alfa) * sign(1.0_r8, a)
60  dftmp(i) = -eps * a * dgamma_dpsi(flux)
61  endif
62  ftmp(i) = sqrt(1._r8 + 2._r8 * eps * ftmp(i) / alfa**2)
63  dftmp(i) = 1._r8 / (2._r8 * ftmp(i)) * 2._r8 * eps * dftmp(i) / alfa**2
64  end do
65 
66  radius = eps * r0
67  cpsurf = radius**2 * b0 / alfa
68 
69  pscale = b0**2 * eps / (zmu0 * alfa**2)
70  rbscale = b0 * r0
71 
72  do i = 1, nr
73  p0tmp(i) = p0tmp(i) * pscale
74  dptmp(i) = dptmp(i) * pscale / cpsurf
75  ftmp(i) = ftmp(i) * rbscale
76  dftmp(i) = ftmp(i) * (dftmp(i) * rbscale / cpsurf)
77  end do
78 
79  np2 = np
80  if (ias == 1) np2 = (np - 1) / 2 + 1
81  reast = xx(1, 1) * eps * r0
82  rwest = xx(1, np2) * eps * r0
83  rgridl = reast - rwest
84 
85  zmid = yy(1, nr * np) * eps * r0
86  rmaxis = (1._r8 + xx(1, nr * np) * eps) * r0
87  zmaxis = zmid
88  xip = curr * eps * r0 * b0 / zmu0
89 
90  open (unit = out_eqdsk, file = trim(adjustl(path)) // file_eqdsk_out, &
91  status = 'replace', form = 'formatted', action = 'write', iostat = i_error)
92 
93  write(out_eqdsk, *) ' helena produced eqdsk file ', nr, np
94  write(out_eqdsk, 11) 0., 0., r0, rgridl, zmid
95  write(out_eqdsk, 11) rmaxis, zmaxis, 0., 0., b0
96  write(out_eqdsk, 11) xip, 0., 0., rmaxis, 0.
97  write(out_eqdsk, 11) zmaxis, 0., 0., 0., 0.
98 
99  write(out_eqdsk, 11) (ftmp(i), i = 1, nr)
100  write(out_eqdsk, 11) (p0tmp(i), i = 1, nr)
101  write(out_eqdsk, 11) (dftmp(i), i = 1, nr)
102  write(out_eqdsk, 11) (dptmp(i), i = 1, nr)
103  write(out_eqdsk, 11) (0., i = 1, nr * np)
104  write(out_eqdsk, 11) (qprof(i), i = 1, nr)
105 
106  if (ias == 1) then
107  write(out_eqdsk, *) np - 1, 1
108  write(out_eqdsk, 11) (r0 * (1._r8 + eps * xx(1, j)), eps * r0 &
109  * yy(1, j), j = 1, np - 1)
110  else
111  write(out_eqdsk, *) 2 * (np - 1), 1
112  write(out_eqdsk, 11) (r0 * (1._r8 + eps * xx(1, j)), eps * r0 &
113  * yy(1, j), j = 1, np)
114  write(out_eqdsk, 11) (r0 * (1._r8 + eps * xx(1, np - j)), -eps * r0 &
115  * yy(1, np - j), j = 1, np - 2)
116  end if
117  close(out_eqdsk)
118 !---------------------------------------------- end of eqdsk writing
119 
120  11 format(5e17.9)
121 
122  call deallocate_spline_coefficients(p_spline)
123  call deallocate_spline_coefficients(rbphi_spline)
124 
125  return
126 end subroutine write_eqdsk
subroutine write_eqdsk(a, curr, r0, b0, qprof, path)
Definition: write_eqdsk.f90:1
subroutine allocate_spline_coefficients(spline, n)
subroutine spline(N, X, Y, ALFA, BETA, TYP, A, B, C, D)
Definition: solution6.f90:655
subroutine flux(psitok, rk, zk, nk)
Definition: EQ1_m.f:786
REAL *8 function spwert(N, XWERT, A, B, C, D, X, ABLTG)
Definition: solution6.f90:155
real(r8) function dgamma_dpsi(flux)
Definition: dgamma_dpsi.f90:1
subroutine deallocate_spline_coefficients(spline)
real(r8) function dp_dpsi(flux)
Definition: dp_dpsi.f90:1