VMEC 8.52
3D Equilibrium solver with nested flux surfaces.
Loading...
Searching...
No Matches
read_wout_mod.f
Go to the documentation of this file.
1!> \file
2!> \brief Reading of \c wout VMEC output file.
3
4!> \brief Reading of \c wout VMEC output file.
6!
7! USE READ_WOUT_MOD to include variables dynamically allocated
8! in this module
9! Call DEALLOCATE_READ_WOUT to free this memory when it is no longer needed
10!
11! Reads in output from VMEC equilibrium code(s), contained in wout file
12!
13! Contained subroutines:
14!
15! read_wout_file wrapper alias called to read/open wout file
16! read_wout_text called by read_wout_file to read text file wout
17! read_wout_nc called by read_wout_file to read netcdf file wout
18!
19! Post-processing routines
20!
21! mse_pitch user-callable function to compute mse pitch angle
22! for the computed equilibrium
23!
24 USE stel_kinds
25 USE mgrid_mod
26
27 IMPLICIT NONE
28C-----------------------------------------------
29C L O C A L P A R A M E T E R S
30C-----------------------------------------------
31! Variable names (vn_...) : put eventually into library, used by read_wout too...
32 CHARACTER(LEN=*), PARAMETER ::
33 1 vn_version = 'version_',
34 2 vn_extension = 'input_extension', vn_mgrid = 'mgrid_file',
35 3 vn_magen = 'wb', vn_therm = 'wp', vn_gam = 'gamma',
36 4 vn_maxr = 'rmax_surf', vn_minr = 'rmin_surf',
37 5 vn_maxz = 'zmax_surf', vn_fp = 'nfp',
38 6 vn_radnod = 'ns', vn_polmod = 'mpol', vn_tormod = 'ntor',
39 7 vn_maxmod = 'mnmax', vn_maxit = 'niter',
40 8 vn_asym = 'lasym', vn_free = 'lfreeb',
41 9 vn_error = 'ier_flag', vn_aspect = 'aspect',
42 a vn_maxmod_nyq = 'mnmax_nyq',
43 b vn_beta = 'betatotal', vn_pbeta = 'betapol',
44 c vn_tbeta = 'betator', vn_abeta = 'betaxis',
45 d vn_b0 = 'b0', vn_rbt0 = 'rbtor0', vn_rbt1 = 'rbtor',
46 e vn_sgs = 'signgs', vn_lar = 'IonLarmor', vn_modb = 'volavgB',
47 f vn_ctor = 'ctor', vn_amin = 'Aminor_p', vn_rmaj = 'Rmajor_p',
48 g vn_vol = 'volume_p', vn_am = 'am', vn_ai = 'ai', vn_ac = 'ac',
49 g vn_ah = 'hot particle fraction', vn_atuname = 'T-perp/T-par',
50 h vn_pmass_type = 'pmass_type', vn_piota_type = 'piota_type',
51 i vn_pcurr_type = 'pcurr_type',
52 j vn_am_aux_s = 'am_aux_s', vn_am_aux_f = 'am_aux_f',
53 k vn_ai_aux_s = 'ai_aux_s', vn_ai_aux_f = 'ai_aux_f',
54 l vn_ac_aux_s = 'ac_aux_s', vn_ac_aux_f = 'ac_aux_f',
55 m vn_mse = 'imse', vn_thom = 'itse',
56 n vn_pmod = 'xm', vn_tmod = 'xn', vn_pmod_nyq = 'xm_nyq',
57 o vn_tmod_nyq = 'xn_nyq',
58 p vn_racc = 'raxis_cc', vn_zacs = 'zaxis_cs',
59 q vn_racs = 'raxis_cs', vn_zacc = 'zaxis_cc', vn_iotaf = 'iotaf',
60 q vn_qfact='q-factor', vn_chi='chi', vn_chipf='chipf',
61 r vn_presf = 'presf', vn_phi = 'phi', vn_phipf = 'phipf',
62 s vn_jcuru = 'jcuru', vn_jcurv = 'jcurv', vn_iotah = 'iotas',
63 t vn_mass = 'mass', vn_presh = 'pres', vn_betah = 'beta_vol',
64 u vn_buco = 'buco', vn_bvco = 'bvco', vn_vp = 'vp',
65 v vn_specw = 'specw', vn_phip = 'phips', vn_jdotb = 'jdotb',
66 w vn_bdotb = 'bdotb', vn_overr = 'over_r',
67 x vn_bgrv = 'bdotgradv', vn_merc = 'DMerc', vn_mshear = 'DShear',
68 y vn_mwell = 'DWell', vn_mcurr = 'DCurr', vn_mgeo = 'DGeod',
69 z vn_equif = 'equif', vn_fsq = 'fsqt', vn_wdot = 'wdot',
70 1 vn_ftolv = 'ftolv', vn_fsql= 'fsql', vn_fsqr = 'fsqr',
71 2 vn_fsqz = 'fsqz',
72 3 vn_extcur = 'extcur', vn_curlab = 'curlabel', vn_rmnc = 'rmnc',
73 4 vn_zmns = 'zmns', vn_lmns = 'lmns', vn_gmnc = 'gmnc',
74 5 vn_bmnc = 'bmnc', vn_bsubumnc = 'bsubumnc',
75 6 vn_bsubvmnc = 'bsubvmnc', vn_bsubsmns = 'bsubsmns',
76 7 vn_bsupumnc = 'bsupumnc', vn_bsupvmnc = 'bsupvmnc',
77 8 vn_rmns = 'rmns', vn_zmnc = 'zmnc',
78 9 vn_lmnc = 'lmnc', vn_gmns = 'gmns', vn_bmns = 'bmns',
79 a vn_bsubumns = 'bsubumns', vn_bsubvmns = 'bsubvmns',
80 b vn_bsubsmnc = 'bsubsmnc', vn_bsupumns = 'bsupumns',
81 c vn_bsupvmns = 'bsupvmns',
82 d vn_bsubumnc_sur = 'bsubumnc_sur',
83 e vn_bsubvmnc_sur = 'bsubvmnc_sur',
84 f vn_bsupumnc_sur = 'bsupumnc_sur',
85 g vn_bsupvmnc_sur = 'bsupvmnc_sur',
86 h vn_bsubumns_sur = 'bsubumns_sur',
87 i vn_bsubvmns_sur = 'bsubvmns_sur',
88 j vn_bsupumns_sur = 'bsupumns_sur',
89 k vn_bsupvmns_sur = 'bsupvmns_sur',
90 d vn_rbc = 'rbc', vn_zbs = 'zbs', vn_rbs = 'rbs', vn_zbc = 'zbc',
91 e vn_potvac = 'potvac',
92 f vn_currumnc = 'currumnc', vn_currvmnc = 'currvmnc',
93 g vn_currumns = 'currumns', vn_currvmns = 'currvmns'
94
95! Long names (ln_...)
96 CHARACTER(LEN=*), PARAMETER ::
97 1 ln_version = 'VMEC Version',
98 2 ln_extension = 'Input file extension',
99 3 ln_mgrid = 'MGRID file',
100 4 ln_magen = 'Magnetic Energy', ln_therm = 'Thermal Energy',
101 5 ln_gam = 'Gamma', ln_maxr = 'Maximum R', ln_minr = 'Minimum R',
102 6 ln_maxz = 'Maximum Z', ln_fp = 'Field Periods',
103 7 ln_radnod = 'Radial nodes', ln_polmod = 'Poloidal modes',
104 8 ln_tormod = 'Toroidal modes', ln_maxmod = 'Fourier modes',
105 8 ln_maxmod_nyq = 'Fourier modes (Nyquist)',
106 9 ln_maxit = 'Max iterations',
107 1 ln_asym = 'Asymmetry', ln_recon = 'Reconstruction',
108 1 ln_free = 'Free boundary',
109 2 ln_error = 'Error flag', ln_aspect = 'Aspect ratio',
110 3 ln_beta = 'Total beta', ln_pbeta = 'Poloidal beta',
111 4 ln_tbeta = 'Toroidal beta', ln_abeta = 'Beta axis',
112 5 ln_b0 = 'RB-t over R axis', ln_rbt0 = 'RB-t axis',
113 6 ln_rbt1 = 'RB-t edge', ln_sgs = 'Sign jacobian',
114 7 ln_lar = 'Ion Larmor radius', ln_modb = 'avg mod B',
115 8 ln_ctor = 'Toroidal current', ln_amin = 'minor radius',
116 9 ln_rmaj = 'major radius', ln_vol = 'Plasma volume',
117 1 ln_mse = 'Number of MSE points',
118 1 ln_thom = 'Number of Thompson scattering points',
119 1 ln_am = 'Specification parameters for mass(s)',
120 1 ln_ac = 'Specification parameters for <J>(s)',
121 1 ln_ai = 'Specification parameters for iota(s)',
122 1 ln_pmass_type = 'Profile type specifier for mass(s)',
123 1 ln_pcurr_type = 'Profile type specifier for <J>(s)',
124 1 ln_piota_type = 'Profile type specifier for iota(s)',
125 1 ln_am_aux_s = 'Auxiliary-s parameters for mass(s)',
126 1 ln_am_aux_f = 'Auxiliary-f parameters for mass(s)',
127 1 ln_ac_aux_s = 'Auxiliary-s parameters for <J>(s)',
128 1 ln_ac_aux_f = 'Auxiliary-f parameters for <J>(s)',
129 1 ln_ai_aux_s = 'Auxiliary-s parameters for iota(s)',
130 1 ln_ai_aux_f = 'Auxiliary-f parameters for iota(s)',
131 4 ln_pmod = 'Poloidal mode numbers',
132 5 ln_tmod = 'Toroidal mode numbers',
133 4 ln_pmod_nyq = 'Poloidal mode numbers (Nyquist)',
134 5 ln_tmod_nyq = 'Toroidal mode numbers (Nyquist)',
135 5 ln_racc = 'raxis (cosnv)', ln_racs = 'raxis (sinnv)',
136 6 ln_zacs = 'zaxis (sinnv)', ln_zacc = 'zaxis (cosnv)',
137 7 ln_iotaf = 'iota on full mesh',
138 7 ln_qfact = 'q-factor on full mesh',
139 8 ln_presf = 'pressure on full mesh',
140 8 ln_phi = 'Toroidal flux on full mesh',
141 9 ln_phipf = 'd(phi)/ds: Toroidal flux deriv on full mesh',
142 9 ln_chi = 'Poloidal flux on full mesh',
143 9 ln_chipf = 'd(chi)/ds: Poroidal flux deriv on full mesh',
144 9 ln_jcuru = 'j dot gradu full',
145 1 ln_jcurv = 'j dot gradv full', ln_iotah = 'iota half',
146 2 ln_mass = 'mass half', ln_presh = 'pressure half',
147 3 ln_betah = 'beta half', ln_buco = 'bsubu half',
148 4 ln_bvco = 'bsubv half', ln_vp = 'volume deriv half',
149 5 ln_specw = 'Spectral width half',
150 6 ln_phip = 'tor flux deriv over 2pi half',
151 7 ln_jdotb = 'J dot B', ln_bdotb = 'B dot B',
152 7 ln_bgrv = 'B dot grad v',
153 8 ln_merc = 'Mercier criterion', ln_mshear = 'Shear Mercier',
154 9 ln_mwell = 'Well Mercier', ln_mcurr = 'Current Mercier',
155 1 ln_mgeo = 'Geodesic Mercier', ln_equif='Average force balance',
156 1 ln_fsq = 'Residual decay',
157 2 ln_wdot = 'Wdot decay', ln_extcur = 'External coil currents',
158 2 ln_fsqr = 'Residual decay - radial',
159 2 ln_fsqz = 'Residual decay - vertical',
160 2 ln_fsql = 'Residual decay - hoop',
161 2 ln_ftolv = 'Residual decay - requested',
162 3 ln_curlab = 'External current names',
163
164 3 ln_rmnc = 'cosmn component of cylindrical R, full mesh',
165 4 ln_zmns = 'sinmn component of cylindrical Z, full mesh',
166 4 ln_lmns = 'sinmn component of lambda, half mesh',
167 5 ln_gmnc = 'cosmn component of jacobian, half mesh',
168 6 ln_bmnc = 'cosmn component of mod-B, half mesh',
169 6 ln_bsubumnc = 'cosmn covariant u-component of B, half mesh',
170 6 ln_bsubvmnc = 'cosmn covariant v-component of B, half mesh',
171 7 ln_bsubsmns = 'sinmn covariant s-component of B, full mesh',
172
173 8 ln_bsubumnc_sur = 'cosmn bsubu of B, surface',
174 9 ln_bsubvmnc_sur = 'cosmn bsubv of B, surface',
175 a ln_bsupumnc_sur = 'cosmn bsupu of B, surface',
176 b ln_bsupvmnc_sur = 'cosmn bsupv of B, surface',
177
178 7 ln_bsupumnc = 'BSUPUmnc half',
179 8 ln_bsupvmnc = 'BSUPVmnc half',
180
181 3 ln_rmns = 'sinmn component of cylindrical R, full mesh',
182 4 ln_zmnc = 'cosmn component of cylindrical Z, full mesh',
183 4 ln_lmnc = 'cosmn component of lambda, half mesh',
184 5 ln_gmns = 'sinmn component of jacobian, half mesh',
185 6 ln_bmns = 'sinmn component of mod-B, half mesh',
186 6 ln_bsubumns = 'sinmn covariant u-component of B, half mesh',
187 6 ln_bsubvmns = 'sinmn covariant v-component of B, half mesh',
188 7 ln_bsubsmnc = 'cosmn covariant s-component of B, full mesh',
189
190 8 ln_bsubumns_sur = 'sinmn bsubu of B, surface',
191 9 ln_bsubvmns_sur = 'sinmn bsubv of B, surface',
192 a ln_bsupumns_sur = 'sinmn bsupu of B, surface',
193 b ln_bsupvmns_sur = 'sinmn bsupv of B, surface',
194
195 4 ln_bsupumns = 'BSUPUmns half', ln_bsupvmns = 'BSUPVmns half',
196 6 ln_rbc = 'Initial boundary R cos(mu-nv) coefficients',
197 7 ln_zbs = 'Initial boundary Z sin(mu-nv) coefficients',
198 8 ln_rbs = 'Initial boundary R sin(mu-nv) coefficients',
199 9 ln_zbc = 'Initial boundary Z cos(mu-nv) coefficients',
200 1 ln_potvac = 'Vacuum Potential on Boundary',
201 2 ln_currumnc = 'cosmn sqrt(g)*J^u, full mesh',
202 3 ln_currvmnc = 'cosmn sqrt(g)*J^v, full mesh',
203 4 ln_currumns = 'sinmn sqrt(g)*J^u, full mesh',
204 5 ln_currvmns = 'sinmn sqrt(g)*J^v, full mesh'
205!-----------------------------------------------
206! L o c a l V a r i a b l e s
207!-----------------------------------------------
208 INTEGER :: nfp, ns, mpol, ntor, mnmax, mnmax_nyq, niter,
215 3 fsql, fsqr, fsqz, ftolv,
217 5 machsq !SAL
218 REAL(rprec), ALLOCATABLE :: rzl_local(:,:,:,:)
219 REAL(rprec), DIMENSION(:,:), ALLOCATABLE ::
223 REAL(rprec), DIMENSION(:,:), ALLOCATABLE ::
226 REAL(rprec), DIMENSION(:), ALLOCATABLE ::
228 1 qfact, chipf, phi, chi,
236
237 LOGICAL :: lasym, lthreed, lwout_opened=.false.
238 CHARACTER :: mgrid_file*200, input_extension*100
239 CHARACTER :: pmass_type*20, pcurr_type*20, piota_type*20
240
241 INTEGER, PARAMETER :: norm_term_flag=0,
242 1 bad_jacobian_flag=1, more_iter_flag=2, jac75_flag=4
243
244! OVERLOAD SUBROUTINE READ_WOUT_FILE TO ACCEPT BOTH UNIT NO. (OPENED EXTERNALLY)
245! OR FILENAME (HANDLE OPEN/CLOSE HERE)
247 MODULE PROCEDURE readw_and_open
248 END INTERFACE
249
250 PRIVATE :: read_wout_nc
251 PRIVATE :: norm_term_flag, bad_jacobian_flag,
252 1 more_iter_flag, jac75_flag
253
254 CONTAINS
255
256 SUBROUTINE readw_and_open(file_or_extension, ierr, iopen)
257 USE safe_open_mod
258 IMPLICIT NONE
259C-----------------------------------------------
260C D u m m y A r g u m e n t s
261C-----------------------------------------------
262 INTEGER, INTENT(out) :: ierr
263 INTEGER, OPTIONAL :: iopen
264 CHARACTER(LEN=*), INTENT(in) :: file_or_extension
265C-----------------------------------------------
266C L o c a l V a r i a b l e s
267C-----------------------------------------------
268 INTEGER, PARAMETER :: iunit_init = 10
269 LOGICAL :: isnc
270 CHARACTER(len=LEN_TRIM(file_or_extension)+10) :: filename
271C-----------------------------------------------
272!
273! THIS SUBROUTINE READS THE WOUT FILE CREATED BY THE VMEC CODE
274! AND STORES THE DATA IN THE READ_WOUT MODULE
275!
276! FIRST, CHECK IF THIS IS A FULLY-QUALIFIED PATH NAME
277! MAKE SURE wout IS NOT EMBEDDED IN THE NAME (PERVERSE USER...)
278!
279 filename = 'wout'
280 CALL parse_extension(filename, file_or_extension, isnc)
281 CALL flush(6)
282 IF (isnc) THEN
283 CALL read_wout_nc(filename, ierr)
284 END IF
285
286 IF (PRESENT(iopen)) iopen = ierr
287 lwout_opened = (ierr .eq. 0)
288 ! WHEN READING A NETCDF FILE, A BAD RUN MAY PREVENT XN FROM BEING
289 ! READ, SUBSEQUENTLY WE MUST CHECK TO SEE IF XN HAS BEEN ALLOCATED
290 ! BEFORE DOING ANYTHING WITH IT OTHERWISE WE DEFAULT LTHREED TO
291 ! FALSE. - SAL 09/07/11
292 IF (ALLOCATED(xn)) THEN
293 lthreed = any(nint(xn) .ne. 0)
294 ELSE
295 lthreed = .false.
296 END IF
297
298 END SUBROUTINE readw_and_open
299
300 SUBROUTINE read_wout_nc(filename, ierr)
301 USE ezcdf
302 USE stel_constants, ONLY: mu0
303 IMPLICIT NONE
304C-----------------------------------------------
305C D u m m y A r g u m e n t s
306C-----------------------------------------------
307 INTEGER, INTENT(out) :: ierr
308 CHARACTER(LEN=*), INTENT(in) :: filename
309C-----------------------------------------------
310C L o c a l V a r i a b l e s
311C-----------------------------------------------
312 INTEGER :: nwout, ierror
313 INTEGER, DIMENSION(3) :: dimlens
314 REAL(rprec), DIMENSION(:), ALLOCATABLE :: raxis_cc, raxis_cs,
315 1 zaxis_cs, zaxis_cc
316C-----------------------------------------------
317! Open cdf File
318 CALL cdf_open(nwout,filename,'r', ierr)
319 IF (ierr .ne. 0) THEN
320 print *,' Error opening wout .nc file'
321 RETURN
322 END IF
323
324! Be sure all arrays are deallocated
326
327 ! reset iasym, needed when using the same instance multiple times -jons
328 iasym = 0
329
330! Read in scalar variables
331 CALL cdf_read(nwout, vn_error, ierr_vmec)
332
333 IF (ierr_vmec.ne.norm_term_flag .and. ierr_vmec.ne.more_iter_flag)
334 1 GOTO 1000
335
336 CALL cdf_read(nwout, vn_version, version_)
337 CALL cdf_read(nwout, vn_extension, input_extension)
338 CALL cdf_read(nwout, vn_mgrid, mgrid_file)
339 CALL cdf_read(nwout, vn_magen, wb)
340 CALL cdf_read(nwout, vn_therm, wp)
341 CALL cdf_read(nwout, vn_gam, gamma)
342 CALL cdf_read(nwout, vn_maxr, rmax_surf)
343 CALL cdf_read(nwout, vn_minr, rmin_surf)
344 CALL cdf_read(nwout, vn_maxz, zmax_surf)
345 CALL cdf_read(nwout, vn_fp, nfp)
346 CALL cdf_read(nwout, vn_radnod, ns)
347 CALL cdf_read(nwout, vn_polmod, mpol)
348 CALL cdf_read(nwout, vn_tormod, ntor)
349 CALL cdf_read(nwout, vn_maxmod, mnmax)
350 mnmax_nyq = -1
351 CALL cdf_read(nwout, vn_maxmod_nyq, mnmax_nyq)
352 CALL cdf_read(nwout, vn_maxit, niter)
353 CALL cdf_read(nwout, vn_asym, lasym)
354 IF (lasym) iasym = 1
355 CALL cdf_read(nwout, vn_free, lfreeb)
356 CALL cdf_read(nwout, vn_aspect, aspect)
357 CALL cdf_read(nwout, vn_beta, betatot)
358 CALL cdf_read(nwout, vn_pbeta, betapol)
359 CALL cdf_read(nwout, vn_tbeta, betator)
360 CALL cdf_read(nwout, vn_abeta, betaxis)
361 CALL cdf_read(nwout, vn_b0, b0)
362 CALL cdf_read(nwout, vn_rbt0, rbtor0)
363 CALL cdf_read(nwout, vn_rbt1, rbtor)
364 CALL cdf_read(nwout, vn_sgs, isigng)
365 CALL cdf_read(nwout, vn_lar, ionlarmor)
366 CALL cdf_read(nwout, vn_modb, volavgb)
367 CALL cdf_read(nwout, vn_ctor, itor)
368 CALL cdf_read(nwout, vn_amin, aminor)
369 CALL cdf_read(nwout, vn_rmaj, rmajor)
370 CALL cdf_read(nwout, vn_vol, volume)
371 CALL cdf_read(nwout, vn_ftolv, ftolv)
372 CALL cdf_read(nwout, vn_fsqr, fsqr)
373 CALL cdf_read(nwout, vn_fsqz, fsqz)
374 CALL cdf_read(nwout, vn_fsql, fsql)
375 CALL cdf_read(nwout, vn_pcurr_type, pcurr_type)
376 CALL cdf_read(nwout, vn_piota_type, piota_type)
377 CALL cdf_read(nwout, vn_pmass_type, pmass_type)
378 imse = -1
379 CALL cdf_read(nwout, vn_nextcur, nextcur)
380
381 mgrid_mode = 'N'
382 CALL cdf_inquire(nwout, vn_mgmode, dimlens, ier=ierror)
383 IF (ierror.eq.0) CALL cdf_read(nwout, vn_mgmode, mgrid_mode)
384
385! Inquire existence, dimensions of arrays for allocation
386! 1D Arrays
387 CALL cdf_inquire(nwout, vn_pmod, dimlens)
388 ALLOCATE (xm(dimlens(1)), stat = ierror)
389 CALL cdf_inquire(nwout, vn_tmod, dimlens)
390 ALLOCATE (xn(dimlens(1)), stat = ierror)
391 IF (mnmax_nyq .gt. 0) THEN
392 CALL cdf_inquire(nwout, vn_pmod_nyq, dimlens)
393 ALLOCATE (xm_nyq(dimlens(1)), stat = ierror)
394 CALL cdf_inquire(nwout, vn_tmod_nyq, dimlens)
395 ALLOCATE (xn_nyq(dimlens(1)), stat = ierror)
396 END IF
397
398 CALL cdf_inquire(nwout, vn_racc, dimlens)
399 ALLOCATE (raxis_cc(0:dimlens(1)-1), stat = ierror)
400 CALL cdf_inquire(nwout, vn_zacs, dimlens)
401 ALLOCATE (zaxis_cs(0:dimlens(1)-1), stat = ierror)
402 IF (lasym) THEN
403 CALL cdf_inquire(nwout, vn_racs, dimlens)
404 ALLOCATE (raxis_cs(0:dimlens(1)-1), stat = ierror)
405 CALL cdf_inquire(nwout, vn_zacc, dimlens)
406 ALLOCATE (zaxis_cc(0:dimlens(1)-1), stat = ierror)
407 END IF
408
409! Profile coefficients, dimensioned from 0
410 CALL cdf_inquire(nwout, vn_am, dimlens)
411 ALLOCATE (am(0:dimlens(1)-1), stat = ierror)
412 CALL cdf_inquire(nwout, vn_ac, dimlens)
413 ALLOCATE (ac(0:dimlens(1)-1), stat = ierror)
414 CALL cdf_inquire(nwout, vn_ai, dimlens)
415 ALLOCATE (ai(0:dimlens(1)-1), stat = ierror)
416
417 CALL cdf_inquire(nwout, vn_ac_aux_s, dimlens)
418 ALLOCATE (ac_aux_s(dimlens(1)), stat = ierror)
419 CALL cdf_inquire(nwout, vn_ac_aux_f, dimlens)
420 ALLOCATE (ac_aux_f(dimlens(1)), stat = ierror)
421 CALL cdf_inquire(nwout, vn_ai_aux_s, dimlens)
422 ALLOCATE (ai_aux_s(dimlens(1)), stat = ierror)
423 CALL cdf_inquire(nwout, vn_ai_aux_f, dimlens)
424 ALLOCATE (ai_aux_f(dimlens(1)), stat = ierror)
425 CALL cdf_inquire(nwout, vn_am_aux_s, dimlens)
426 ALLOCATE (am_aux_s(dimlens(1)), stat = ierror)
427 CALL cdf_inquire(nwout, vn_am_aux_f, dimlens)
428 ALLOCATE (am_aux_f(dimlens(1)), stat = ierror)
429
430 CALL cdf_inquire(nwout, vn_iotaf, dimlens)
431 ALLOCATE (iotaf(dimlens(1)), stat = ierror)
432 CALL cdf_inquire(nwout, vn_qfact, dimlens)
433 ALLOCATE (qfact(dimlens(1)), stat = ierror)
434 CALL cdf_inquire(nwout, vn_presf, dimlens)
435 ALLOCATE (presf(dimlens(1)), stat = ierror)
436 CALL cdf_inquire(nwout, vn_phi, dimlens)
437 ALLOCATE (phi(dimlens(1)), stat = ierror)
438 CALL cdf_inquire(nwout, vn_chi, dimlens)
439 ALLOCATE (chi(dimlens(1)), stat = ierror)
440 CALL cdf_inquire(nwout, vn_phipf, dimlens)
441 ALLOCATE (phipf(dimlens(1)), stat = ierror)
442 CALL cdf_inquire(nwout, vn_chipf, dimlens)
443 ALLOCATE (chipf(dimlens(1)), stat = ierror)
444 CALL cdf_inquire(nwout, vn_jcuru, dimlens)
445 ALLOCATE (jcuru(dimlens(1)), stat = ierror)
446 CALL cdf_inquire(nwout, vn_jcurv, dimlens)
447 ALLOCATE (jcurv(dimlens(1)), stat = ierror)
448 CALL cdf_inquire(nwout, vn_iotah, dimlens)
449 ALLOCATE (iotas(dimlens(1)), stat = ierror)
450 CALL cdf_inquire(nwout, vn_mass, dimlens)
451 ALLOCATE (mass(dimlens(1)), stat = ierror)
452 CALL cdf_inquire(nwout, vn_presh, dimlens)
453 ALLOCATE (pres(dimlens(1)), stat = ierror)
454 CALL cdf_inquire(nwout, vn_betah, dimlens)
455 ALLOCATE (beta_vol(dimlens(1)), stat = ierror)
456 CALL cdf_inquire(nwout, vn_buco, dimlens)
457 ALLOCATE (buco(dimlens(1)), stat = ierror)
458 CALL cdf_inquire(nwout, vn_bvco, dimlens)
459 ALLOCATE (bvco(dimlens(1)), stat = ierror)
460 CALL cdf_inquire(nwout, vn_vp, dimlens)
461 ALLOCATE (vp(dimlens(1)), stat = ierror)
462 CALL cdf_inquire(nwout, vn_specw, dimlens)
463 ALLOCATE (specw(dimlens(1)), stat = ierror)
464 CALL cdf_inquire(nwout, vn_phip, dimlens)
465 ALLOCATE (phip(dimlens(1)), stat = ierror)
466 CALL cdf_inquire(nwout, vn_overr, dimlens)
467 ALLOCATE (overr(dimlens(1)), stat = ierror)
468
469 CALL cdf_inquire(nwout, vn_jdotb, dimlens)
470 ALLOCATE (jdotb(dimlens(1)), stat = ierror)
471 CALL cdf_inquire(nwout, vn_bdotb, dimlens)
472 ALLOCATE (bdotb(dimlens(1)), stat = ierror)
473 CALL cdf_inquire(nwout, vn_bgrv, dimlens)
474 ALLOCATE (bdotgradv(dimlens(1)), stat = ierror)
475
476 CALL cdf_inquire(nwout, vn_merc, dimlens)
477 ALLOCATE (dmerc(dimlens(1)), stat = ierror)
478 CALL cdf_inquire(nwout, vn_mshear, dimlens)
479 ALLOCATE (dshear(dimlens(1)), stat = ierror)
480 CALL cdf_inquire(nwout, vn_mwell, dimlens)
481 ALLOCATE (dwell(dimlens(1)), stat = ierror)
482 CALL cdf_inquire(nwout, vn_mcurr, dimlens)
483 ALLOCATE (dcurr(dimlens(1)), stat = ierror)
484 CALL cdf_inquire(nwout, vn_mgeo, dimlens)
485 ALLOCATE (dgeod(dimlens(1)), stat = ierror)
486 CALL cdf_inquire(nwout, vn_equif, dimlens)
487 ALLOCATE (equif(dimlens(1)), stat = ierror)
488
489 CALL cdf_inquire(nwout, vn_fsq, dimlens)
490 ALLOCATE (fsqt(dimlens(1)), stat = ierror)
491 CALL cdf_inquire(nwout, vn_wdot, dimlens)
492 ALLOCATE (wdot(dimlens(1)), stat = ierror)
493
494 IF (nextcur .gt. 0) THEN
495 CALL cdf_inquire(nwout, vn_extcur, dimlens)
496 ALLOCATE (extcur(dimlens(1)), stat = ierror)
497!NOTE: curlabel is an array of CHARACTER(30) strings - defined in mgrid_mod
498! so dimlens(1) == 30 (check this) and dimlens(2) is the number of strings in the array
499 CALL cdf_inquire(nwout, vn_curlab, dimlens)
500 ALLOCATE (curlabel(dimlens(2)), stat = ierror)
501 ! SAL
502 CALL cdf_inquire(nwout, vn_potvac, dimlens, ier = ierror)
503 IF (ierror == 0) ALLOCATE (potvac(1:dimlens(1)), stat = ierror)
504 ENDIF
505
506! 2D Arrays
507 CALL cdf_inquire(nwout, vn_rmnc, dimlens)
508 ALLOCATE (rmnc(dimlens(1),dimlens(2)), stat = ierror)
509 CALL cdf_inquire(nwout, vn_zmns, dimlens)
510 ALLOCATE (zmns(dimlens(1),dimlens(2)), stat = ierror)
511 CALL cdf_inquire(nwout, vn_lmns, dimlens)
512 ALLOCATE (lmns(dimlens(1),dimlens(2)), stat = ierror)
513 CALL cdf_inquire(nwout, vn_gmnc, dimlens)
514 ALLOCATE (gmnc(dimlens(1),dimlens(2)), stat = ierror)
515 CALL cdf_inquire(nwout, vn_bmnc, dimlens)
516 ALLOCATE (bmnc(dimlens(1),dimlens(2)), stat = ierror)
517 CALL cdf_inquire(nwout, vn_bsubumnc, dimlens)
518 ALLOCATE (bsubumnc(dimlens(1),dimlens(2)), stat = ierror)
519 CALL cdf_inquire(nwout, vn_bsubvmnc, dimlens)
520 ALLOCATE (bsubvmnc(dimlens(1),dimlens(2)), stat = ierror)
521 CALL cdf_inquire(nwout, vn_bsubsmns, dimlens)
522 ALLOCATE (bsubsmns(dimlens(1),dimlens(2)), stat = ierror)
523
524! ELIMINATE THESE EVENTUALLY: DON'T NEED THEM
525 CALL cdf_inquire(nwout, vn_bsupumnc, dimlens)
526 ALLOCATE (bsupumnc(dimlens(1),dimlens(2)), stat = ierror)
527 CALL cdf_inquire(nwout, vn_bsupvmnc, dimlens)
528 ALLOCATE (bsupvmnc(dimlens(1),dimlens(2)), stat = ierror)
529
530 IF (.NOT. lasym) GO TO 800
531
532 CALL cdf_inquire(nwout, vn_rmns, dimlens)
533 ALLOCATE (rmns(dimlens(1),dimlens(2)), stat = ierror)
534 CALL cdf_inquire(nwout, vn_zmnc, dimlens)
535 ALLOCATE (zmnc(dimlens(1),dimlens(2)), stat = ierror)
536 CALL cdf_inquire(nwout, vn_lmnc, dimlens)
537 ALLOCATE (lmnc(dimlens(1),dimlens(2)), stat = ierror)
538 CALL cdf_inquire(nwout, vn_gmns, dimlens)
539 ALLOCATE (gmns(dimlens(1),dimlens(2)), stat = ierror)
540 CALL cdf_inquire(nwout, vn_bmns, dimlens)
541 ALLOCATE (bmns(dimlens(1),dimlens(2)), stat = ierror)
542 CALL cdf_inquire(nwout, vn_bsubumns, dimlens)
543 ALLOCATE (bsubumns(dimlens(1),dimlens(2)), stat = ierror)
544 CALL cdf_inquire(nwout, vn_bsubvmns, dimlens)
545 ALLOCATE (bsubvmns(dimlens(1),dimlens(2)), stat = ierror)
546 CALL cdf_inquire(nwout, vn_bsubsmnc, dimlens)
547 ALLOCATE (bsubsmnc(dimlens(1),dimlens(2)), stat = ierror)
548
549! ELIMINATE THESE EVENTUALLY: DO NOT NEED THEM
550 CALL cdf_inquire(nwout, vn_bsupumns, dimlens)
551 ALLOCATE (bsupumns(dimlens(1),dimlens(2)), stat = ierror)
552 CALL cdf_inquire(nwout, vn_bsupvmns, dimlens)
553 ALLOCATE (bsupvmns(dimlens(1),dimlens(2)), stat = ierror)
554
555 800 CONTINUE
556
557! Read Arrays
558 CALL cdf_read(nwout, vn_pmod, xm)
559 CALL cdf_read(nwout, vn_tmod, xn)
560 IF (mnmax_nyq .le. 0) THEN
562 ALLOCATE (xm_nyq(mnmax_nyq), xn_nyq(mnmax_nyq), stat=ierror)
563 xm_nyq = xm; xn_nyq = xn
564 ELSE
565 CALL cdf_read(nwout, vn_pmod_nyq, xm_nyq)
566 CALL cdf_read(nwout, vn_tmod_nyq, xn_nyq)
567 END IF
568
569 mnyq = int(maxval(xm_nyq)); nnyq = int(maxval(abs(xn_nyq)))/nfp
570
571 CALL cdf_read(nwout, vn_racc, raxis_cc)
572 CALL cdf_read(nwout, vn_zacs, zaxis_cs)
573
574 IF (SIZE(raxis_cc) .ne. ntor+1)
575 1 stop 'WRONG SIZE(raxis_cc) in READ_WOUT_NC'
576 ALLOCATE (raxis(0:ntor,2), zaxis(0:ntor,2), stat=ierror)
577 raxis(:,1) = raxis_cc(0:ntor); zaxis(:,1) = zaxis_cs(0:ntor)
578 raxis(:,2) = 0; zaxis(:,2) = 0
579 DEALLOCATE (raxis_cc, zaxis_cs, stat=ierror)
580
581 CALL cdf_read(nwout, vn_rmnc, rmnc)
582 CALL cdf_read(nwout, vn_zmns, zmns)
583 CALL cdf_read(nwout, vn_lmns, lmns)
584 CALL cdf_read(nwout, vn_gmnc, gmnc) !Half mesh
585 CALL cdf_read(nwout, vn_bmnc, bmnc) !Half mesh
586 CALL cdf_read(nwout, vn_bsubumnc, bsubumnc) !Half mesh
587 CALL cdf_read(nwout, vn_bsubvmnc, bsubvmnc) !Half mesh
588 CALL cdf_read(nwout, vn_bsubsmns, bsubsmns) !Full mesh
589! ELIMINATE THESE EVENTUALLY: DON'T NEED THEM (can express in terms of lambdas)
590 CALL cdf_read(nwout, vn_bsupumnc, bsupumnc)
591 CALL cdf_read(nwout, vn_bsupvmnc, bsupvmnc)
592 IF (lasym) THEN
593 CALL cdf_read(nwout, vn_racs, raxis_cs)
594 CALL cdf_read(nwout, vn_zacc, zaxis_cc)
595 raxis(:,2) = raxis_cs; zaxis(:,2) = zaxis_cc
596 DEALLOCATE (raxis_cs, zaxis_cc, stat=ierror)
597 CALL cdf_read(nwout, vn_rmns, rmns)
598 CALL cdf_read(nwout, vn_zmnc, zmnc)
599 CALL cdf_read(nwout, vn_lmnc, lmnc)
600 CALL cdf_read(nwout, vn_gmns, gmns)
601 CALL cdf_read(nwout, vn_bmns, bmns)
602 CALL cdf_read(nwout, vn_bsubumns, bsubumns)
603 CALL cdf_read(nwout, vn_bsubvmns, bsubvmns)
604 CALL cdf_read(nwout, vn_bsubsmnc, bsubsmnc)
605! ELIMINATE THESE EVENTUALLY: DON'T NEED THEM
606 CALL cdf_read(nwout, vn_bsupumns, bsupumns)
607 CALL cdf_read(nwout, vn_bsupvmns, bsupvmns)
608 END IF
609
610 CALL cdf_read(nwout, vn_am, am)
611 CALL cdf_read(nwout, vn_ac, ac)
612 CALL cdf_read(nwout, vn_ai, ai)
613
614 CALL cdf_read(nwout, vn_am_aux_s, am_aux_s)
615 CALL cdf_read(nwout, vn_am_aux_f, am_aux_f)
616 CALL cdf_read(nwout, vn_ac_aux_s, ac_aux_s)
617 CALL cdf_read(nwout, vn_ac_aux_f, ac_aux_f)
618 CALL cdf_read(nwout, vn_ai_aux_s, ai_aux_s)
619 CALL cdf_read(nwout, vn_ai_aux_f, ai_aux_f)
620
621 CALL cdf_read(nwout, vn_iotaf, iotaf)
622 CALL cdf_read(nwout, vn_qfact, qfact)
623 CALL cdf_read(nwout, vn_presf, presf)
624 CALL cdf_read(nwout, vn_phi, phi)
625 CALL cdf_read(nwout, vn_phipf, phipf)
626 CALL cdf_read(nwout, vn_chi, chi)
627 CALL cdf_read(nwout, vn_chipf, chipf)
628 CALL cdf_read(nwout, vn_jcuru, jcuru)
629 CALL cdf_read(nwout, vn_jcurv, jcurv)
630
631
632! HALF-MESH quantities
633! NOTE: jdotb is in units_of_A (1/mu0 incorporated in jxbforce...)
634! prior to version 6.00, this was output in internal VMEC units...
635 CALL cdf_read(nwout, vn_iotah, iotas)
636 CALL cdf_read(nwout, vn_mass, mass)
637 CALL cdf_read(nwout, vn_presh, pres)
638 CALL cdf_read(nwout, vn_betah, beta_vol)
639 CALL cdf_read(nwout, vn_buco, buco)
640 CALL cdf_read(nwout, vn_bvco, bvco)
641 CALL cdf_read(nwout, vn_vp, vp)
642 CALL cdf_read(nwout, vn_specw, specw)
643 CALL cdf_read(nwout, vn_phip, phip)
644 CALL cdf_read(nwout, vn_jdotb, jdotb)
645 CALL cdf_read(nwout, vn_bdotb, bdotb)
646 CALL cdf_read(nwout, vn_bgrv, bdotgradv)
647
648! MERCIER_CRITERION
649 CALL cdf_read(nwout, vn_merc, dmerc)
650 CALL cdf_read(nwout, vn_mshear, dshear)
651 CALL cdf_read(nwout, vn_mwell, dwell)
652 CALL cdf_read(nwout, vn_mcurr, dcurr)
653 CALL cdf_read(nwout, vn_mgeo, dgeod)
654 CALL cdf_read(nwout, vn_equif, equif)
655
656 CALL cdf_read(nwout, vn_fsq, fsqt)
657 CALL cdf_read(nwout, vn_wdot, wdot)
658
659 IF (nextcur .gt. 0) THEN
660 CALL cdf_read(nwout, vn_extcur, extcur)
661 CALL cdf_read(nwout, vn_curlab, curlabel)
662 ENDIF
663
664 !SAL Addition
665 IF (ALLOCATED(potvac)) CALL cdf_read(nwout,vn_potvac, potvac)
666
667 1000 CONTINUE
668
669 CALL cdf_close(nwout, ierr)
670
671 IF (.not.ALLOCATED(bsubumnc)) RETURN !Moved this here because ns may not be set. SAL -09/07/11
672!
673! COMPUTE CONTRAVARIANT CURRENT COMPONENTS IN AMPS
674! ON THE FULL RADIAL MESH, WHERE JACOBIAN = SQRT(G)
675!
676! CURRU = SQRT(G) * J dot grad(u)
677! CURRV = SQRT(G) * J dot grad(v)
678!
679 IF (ierror .eq. 0) THEN
681 IF (.NOT.ALLOCATED(bsubsmnc))
682 & ALLOCATE (bsubsmnc(mnmax_nyq,ns),
685 IF (.NOT.ALLOCATED(currumns))
686 & ALLOCATE (currumns(mnmax_nyq,ns),
692 END IF
693
694 IF (ierr. ne. 0) print *,"in read_wout_nc ierr=",ierr
695 IF (ierror. ne. 0) print *,"in read_wout_nc ierror=",ierror
696
697 END SUBROUTINE read_wout_nc
698
699 SUBROUTINE compute_currents(bsubsmnc_i, bsubsmns_i,
700 & bsubumnc_i, bsubumns_i, bsubvmnc_i, bsubvmns_i,
701 & xm_nyq_i, xn_nyq_i, mnmax_nyq_i, lasym_i, ns_i,
702 & currumnc_o, currvmnc_o, currumns_o, currvmns_o)
703 USE stel_constants, ONLY: mu0
704 IMPLICIT NONE
705!-----------------------------------------------
706! D u m m y A r g u m e n t s
707!-----------------------------------------------
708 INTEGER, INTENT(in) :: mnmax_nyq_i, ns_i
709 LOGICAL, INTENT(in) :: lasym_i
710 REAL(rprec), DIMENSION(mnmax_nyq_i), INTENT(in) ::
711 & xm_nyq_i, xn_nyq_i
712 REAL(rprec), DIMENSION(mnmax_nyq_i, ns_i), INTENT(in) ::
713 & bsubsmnc_i, bsubsmns_i,
714 & bsubumnc_i, bsubumns_i,
715 & bsubvmnc_i, bsubvmns_i
716 REAL(rprec), DIMENSION(mnmax_nyq_i, ns_i), INTENT(inout) ::
717 & currumnc_o, currvmnc_o, currumns_o, currvmns_o
718!-----------------------------------------------
719! L o c a l V a r i a b l e s
720!-----------------------------------------------
721 INTEGER :: js
722 REAL(rprec) :: ohs, hs, shalf(ns_i), sfull(ns_i)
723 REAL(rprec), DIMENSION(mnmax_nyq_i) :: bu1, bu0, bv1, bv0,
724 & t1, t2, t3
725!-----------------------------------------------
726!
727! Computes current harmonics for currXmn == sqrt(g)*JsupX, X = u,v
728! [Corrected above "JsubX" to "JsupX", JDH 2010-08-16]
729
730! NOTE: bsub(s,u,v)mn are on HALF radial grid
731! (in earlier versions, bsubsmn was on FULL radial grid)
732
733!
734 ohs = (ns_i-1)
735 hs = 1._dp/ohs
736
737 DO js = 2, ns_i
738 shalf(js) = sqrt(hs*(js-1.5_dp))
739 sfull(js) = sqrt(hs*(js-1))
740 END DO
741
742 currumnc_o = 0
743 currvmnc_o = 0
744
745 DO js = 2, ns_i-1
746 WHERE (mod(int(xm_nyq_i),2) .EQ. 1)
747 t1 = 0.5_dp*(shalf(js+1)*bsubsmns_i(:,js+1) +
748 & shalf(js) *bsubsmns_i(:,js)) /sfull(js)
749 bu0 = bsubumnc_i(:,js )/shalf(js)
750 bu1 = bsubumnc_i(:,js+1)/shalf(js+1)
751 t2 = ohs*(bu1-bu0)*sfull(js)+0.25_dp*(bu0+bu1)/sfull(js)
752 bv0 = bsubvmnc_i(:,js )/shalf(js)
753 bv1 = bsubvmnc_i(:,js+1)/shalf(js+1)
754 t3 = ohs*(bv1-bv0)*sfull(js)+0.25_dp*(bv0+bv1)/sfull(js)
755 ELSEWHERE
756 t1 = 0.5_dp*(bsubsmns_i(:,js+1)+bsubsmns_i(:,js))
757 t2 = ohs*(bsubumnc_i(:,js+1)-bsubumnc_i(:,js))
758 t3 = ohs*(bsubvmnc_i(:,js+1)-bsubvmnc_i(:,js))
759 ENDWHERE
760 currumnc_o(:,js) = -xn_nyq_i(:)*t1 - t3
761 currvmnc_o(:,js) = -xm_nyq_i(:)*t1 + t2
762 END DO
763
764 WHERE (xm_nyq_i .LE. 1)
765 currvmnc_o(:,1) = 2*currvmnc_o(:,2) - currvmnc_o(:,3)
766 currumnc_o(:,1) = 2*currumnc_o(:,2) - currumnc_o(:,3)
767 ELSEWHERE
768 currvmnc_o(:,1) = 0
769 currumnc_o(:,1) = 0
770 ENDWHERE
771
772 currumnc_o(:,ns_i) = 2*currumnc_o(:,ns_i-1)
773 & - currumnc_o(:,ns_i-2)
774 currvmnc_o(:,ns_i) = 2*currvmnc_o(:,ns_i-1)
775 & - currvmnc_o(:,ns_i-2)
776 currumnc_o = currumnc_o/mu0
777 currvmnc_o = currvmnc_o/mu0
778
779 IF (.NOT.lasym_i) RETURN
780
781 currumns_o = 0
782 currvmns_o = 0
783
784 DO js = 2, ns_i-1
785 WHERE (mod(int(xm_nyq_i),2) .EQ. 1)
786 t1 = 0.5_dp*(shalf(js+1)*bsubsmnc_i(:,js+1)
787 & + shalf(js) *bsubsmnc_i(:,js)) / sfull(js)
788 bu0 = bsubumns_i(:,js )/shalf(js+1)
789 bu1 = bsubumns_i(:,js+1)/shalf(js+1)
790 t2 = ohs*(bu1-bu0)*sfull(js) + 0.25_dp*(bu0+bu1)/sfull(js)
791 bv0 = bsubvmns_i(:,js )/shalf(js)
792 bv1 = bsubvmns_i(:,js+1)/shalf(js+1)
793 t3 = ohs*(bv1-bv0)*sfull(js)+0.25_dp*(bv0+bv1)/sfull(js)
794 ELSEWHERE
795 t1 = 0.5_dp*(bsubsmnc_i(:,js+1) + bsubsmnc_i(:,js))
796 t2 = ohs*(bsubumns_i(:,js+1)-bsubumns_i(:,js))
797 t3 = ohs*(bsubvmns_i(:,js+1)-bsubvmns_i(:,js))
798 END WHERE
799 currumns_o(:,js) = xn_nyq_i(:)*t1 - t3
800 currvmns_o(:,js) = xm_nyq_i(:)*t1 + t2
801 END DO
802
803 WHERE (xm_nyq_i .LE. 1)
804 currvmns_o(:,1) = 2*currvmns_o(:,2) - currvmns_o(:,3)
805 currumns_o(:,1) = 2*currumns_o(:,2) - currumns_o(:,3)
806 ELSEWHERE
807 currvmns_o(:,1) = 0
808 currumns_o(:,1) = 0
809 END WHERE
810 currumns_o(:,ns_i) = 2*currumns_o(:,ns_i-1)
811 & - currumns_o(:,ns_i-2)
812 currvmns_o(:,ns_i) = 2*currvmns_o(:,ns_i-1)
813 & - currvmns_o(:,ns_i-2)
814 currumns_o = currumns_o/mu0
815 currvmns_o = currvmns_o/mu0
816
817 END SUBROUTINE compute_currents
818
820 IMPLICIT NONE
821!-----------------------------------------------
822! L o c a l V a r i a b l e s
823!-----------------------------------------------
824 INTEGER :: istat(10)
825!-----------------------------------------------
826 istat = 0
827 lwout_opened = .false.
828
829 IF (ALLOCATED(extcur)) DEALLOCATE (extcur,
830 1 stat = istat(1))
831 IF (ALLOCATED(curlabel)) DEALLOCATE (curlabel,
832 1 stat = istat(1))
833 IF (ALLOCATED(overr)) DEALLOCATE (overr, stat = istat(2))
834
835 IF (ALLOCATED(xm)) DEALLOCATE (xm, xn, xm_nyq, xn_nyq,
838 3 pres, beta_vol, phip, buco, bvco, phi, vp, jcuru, am, ac, ai,
840 5 bdotb, bdotgradv, raxis, zaxis, fsqt, wdot, stat = istat(3))
841
842 IF (ALLOCATED(chipf)) DEALLOCATE (chipf, chi)
843
844 IF (ALLOCATED(am_aux_s)) DEALLOCATE (am_aux_s, am_aux_f, ac_aux_s,
845 1 ac_aux_f, ai_aux_s, ai_aux_f, stat=istat(6))
846
847 IF (ALLOCATED(rmns)) DEALLOCATE (rmns, zmnc, lmnc,
849 2 bsupumns, bsupvmns, stat=istat(5))
850
851 IF (ALLOCATED(currumnc)) DEALLOCATE (currumnc)
852 IF (ALLOCATED(currumns)) DEALLOCATE (currumns, currvmns)
853 IF (ALLOCATED(rzl_local)) DEALLOCATE (rzl_local)
854
855 ! SAL Addition
856 IF (ALLOCATED(potvac)) DEALLOCATE(potvac)
857
858 IF (any(istat .ne. 0)) THEN
859 print *,istat
860 stop 'Deallocation error in read_wout_deallocate'
861 END IF
862
863 END SUBROUTINE read_wout_deallocate
864
865 SUBROUTINE tosuvspace (s_in, u_in, v_in, gsqrt,
866 1 bsupu, bsupv, jsupu, jsupv, lam)
867 USE stel_constants, ONLY: zero, one
868 IMPLICIT NONE
869C-----------------------------------------------
870C D u m m y A r g u m e n t s
871C-----------------------------------------------
872 REAL(rprec), INTENT(in) :: s_in, u_in, v_in
873 REAL(rprec), INTENT(out), OPTIONAL :: gsqrt, bsupu, bsupv,
874 1 jsupu, jsupv, lam
875C-----------------------------------------------
876C L o c a l V a r i a b l e s
877C-----------------------------------------------
878 REAL(rprec), PARAMETER :: c1p5 = 1.5_dp
879 INTEGER :: m, n, n1, mn, ipresent, jslo, jshi
880 REAL(rprec) :: hs1, wlo, whi, wlo_odd, whi_odd
881 REAL(rprec), DIMENSION(mnmax_nyq) :: gmnc1, gmns1, bsupumnc1,
882 1 bsupumns1, bsupvmnc1, bsupvmns1, jsupumnc1, jsupumns1,
883 2 jsupvmnc1, jsupvmns1, wmins, wplus, lammns1, lammnc1
884 REAL(rprec) :: cosu, sinu, cosv, sinv, tcosmn, tsinmn, sgn
885 REAL(rprec) :: cosmu(0:mnyq), sinmu(0:mnyq),
886 1 cosnv(0:nnyq), sinnv(0:nnyq)
887 LOGICAL :: lgsqrt, lbsupu, lbsupv, ljsupu, ljsupv, llam
888C-----------------------------------------------
889!
890! COMPUTE VARIOUS HALF/FULL-RADIAL GRID QUANTITIES AT THE INPUT POINT
891! (S, U, V) , WHERE
892! S = normalized toroidal flux (0 - 1),
893! U = poloidal angle
894! V = N*phi = toroidal angle * no. field periods
895!
896! HALF-RADIAL GRID QUANTITIES
897! gsqrt, bsupu, bsupv
898!
899! FULL-RADIAL GRID QUANTITIES
900! dbsubuds, dbsubvds, dbsubsdu, dbsubsdv
901!
902C-----------------------------------------------
903 IF (s_in.lt.zero .or. s_in.gt.one) THEN
904 WRITE(6, *)
905 1 ' In tosuvspace, s(flux) must be between 0 and 1'
906 RETURN
907 END IF
908
909 IF (.not.lwout_opened) THEN
910 WRITE(6, *)
911 1 ' tosuvspace can only be called AFTER opening wout file!'
912 RETURN
913 END IF
914
915!
916! SETUP TRIG ARRAYS
917!
918 cosu = cos(u_in); sinu = sin(u_in)
919 cosv = cos(v_in); sinv = sin(v_in)
920
921 cosmu(0) = 1; sinmu(0) = 0
922 cosnv(0) = 1; sinnv(0) = 0
923 DO m = 1, mnyq
924 cosmu(m) = cosmu(m-1)*cosu - sinmu(m-1)*sinu
925 sinmu(m) = sinmu(m-1)*cosu + cosmu(m-1)*sinu
926 END DO
927
928 DO n = 1, nnyq
929 cosnv(n) = cosnv(n-1)*cosv - sinnv(n-1)*sinv
930 sinnv(n) = sinnv(n-1)*cosv + cosnv(n-1)*sinv
931 END DO
932
933
934!
935! FIND INTERPOLATED s VALUE AND COMPUTE INTERPOLATION WEIGHTS wlo, whi
936! RECALL THAT THESE QUANTITIES ARE ON THE HALF-RADIAL GRID...
937! s-half(j) = (j-1.5)*hs, for j = 2,...ns
938!
939 hs1 = one/(ns-1)
940 jslo = int(c1p5 + s_in/hs1)
941 jshi = jslo+1
942 wlo = (hs1*(jshi-c1p5) - s_in)/hs1
943 whi = 1 - wlo
944 IF (jslo .eq. ns) THEN
945! USE Xhalf(ns+1) = 2*Xhalf(ns) - Xhalf(ns-1) FOR "GHOST" POINT VALUE 1/2hs OUTSIDE EDGE
946! THEN, X = wlo*Xhalf(ns) + whi*Xhalf(ns+1) == Xhalf(ns) + whi*(Xhalf(ns) - Xhalf(ns-1))
947 jshi = jslo-1
948 wlo = 1+whi; whi = -whi
949 ELSE IF (jslo .eq. 1) THEN
950 jslo = 2
951 END IF
952
953!
954! FOR ODD-m MODES X ~ SQRT(s), SO INTERPOLATE Xmn/SQRT(s)
955!
956 whi_odd = whi*sqrt(s_in/(hs1*(jshi-c1p5)))
957 IF (jslo .ne. 1) THEN
958 wlo_odd = wlo*sqrt(s_in/(hs1*(jslo-c1p5)))
959 ELSE
960 wlo_odd = 0
961 whi_odd = sqrt(s_in/(hs1*(jshi-c1p5)))
962 END IF
963
964 WHERE (mod(nint(xm_nyq(:)),2) .eq. 0)
965 wmins = wlo
966 wplus = whi
967 ELSEWHERE
968 wmins = wlo_odd
969 wplus = whi_odd
970 END WHERE
971
972 ipresent = 0
973 lgsqrt = PRESENT(gsqrt)
974 IF (lgsqrt) THEN
975 gsqrt = 0 ; ipresent = ipresent+1
976 gmnc1 = wmins*gmnc(:,jslo) + wplus*gmnc(:,jshi)
977 IF (lasym)
978 1 gmns1 = wmins*gmns(:,jslo) + wplus*gmns(:,jshi)
979 END IF
980 lbsupu = PRESENT(bsupu)
981 IF (lbsupu) THEN
982 bsupu = 0 ; ipresent = ipresent+1
983 bsupumnc1 = wmins*bsupumnc(:,jslo) + wplus*bsupumnc(:,jshi)
984 IF (lasym)
985 1 bsupumns1 = wmins*bsupumns(:,jslo) + wplus*bsupumns(:,jshi)
986 END IF
987 lbsupv = PRESENT(bsupv)
988 IF (lbsupv) THEN
989 bsupv = 0 ; ipresent = ipresent+1
990 bsupvmnc1 = wmins*bsupvmnc(:,jslo) + wplus*bsupvmnc(:,jshi)
991 IF (lasym)
992 1 bsupvmns1 = wmins*bsupvmns(:,jslo) + wplus*bsupvmns(:,jshi)
993 END IF
994 llam = PRESENT(lam)
995 IF (llam) THEN
996 lam = 0 ; ipresent = ipresent+1
997 lammns1 = wmins*lmns(:,jslo) + wplus*lmns(:,jshi)
998 IF (lasym)
999 1 lammnc1 = wmins*lmnc(:,jslo) + wplus*lmnc(:,jshi)
1000 END IF
1001
1002 IF (ipresent .eq. 0) GOTO 1000
1003
1004!
1005! COMPUTE GSQRT, ... IN REAL SPACE
1006! tcosmn = cos(mu - nv); tsinmn = sin(mu - nv)
1007!
1008 DO mn = 1, mnmax_nyq
1009 m = nint(xm_nyq(mn)); n = nint(xn_nyq(mn))/nfp
1010 n1 = abs(n); sgn = sign(1,n)
1011 tcosmn = cosmu(m)*cosnv(n1) + sgn*sinmu(m)*sinnv(n1)
1012 tsinmn = sinmu(m)*cosnv(n1) - sgn*cosmu(m)*sinnv(n1)
1013 IF (lgsqrt) gsqrt = gsqrt + gmnc1(mn)*tcosmn
1014 IF (lbsupu) bsupu = bsupu + bsupumnc1(mn)*tcosmn
1015 IF (lbsupv) bsupv = bsupv + bsupvmnc1(mn)*tcosmn
1016 IF (llam) lam = lam + lammns1(mn)*tsinmn
1017 END DO
1018
1019 IF (.not.lasym) GOTO 1000
1020
1021 DO mn = 1, mnmax_nyq
1022 m = nint(xm_nyq(mn)); n = nint(xn_nyq(mn))/nfp
1023 n1 = abs(n); sgn = sign(1,n)
1024 tcosmn = cosmu(m)*cosnv(n1) + sgn*sinmu(m)*sinnv(n1)
1025 tsinmn = sinmu(m)*cosnv(n1) - sgn*cosmu(m)*sinnv(n1)
1026 IF (lgsqrt) gsqrt = gsqrt + gmns1(mn)*tsinmn
1027 IF (lbsupu) bsupu = bsupu + bsupumns1(mn)*tsinmn
1028 IF (lbsupv) bsupv = bsupv + bsupvmns1(mn)*tsinmn
1029 IF (llam) lam = lam + lammnc1(mn)*tcosmn
1030 END DO
1031
1032 1000 CONTINUE
1033
1034! FULL-MESH QUANTITIES
1035!
1036! FIND INTERPOLATED s VALUE AND COMPUTE INTERPOLATION WEIGHTS wlo, whi
1037! RECALL THAT THESE QUANTITIES ARE ON THE FULL-RADIAL GRID...
1038! s-full(j) = (j-1)*hs, for j = 1,...ns
1039!
1040 hs1 = one/(ns-1)
1041 jslo = 1+int(s_in/hs1)
1042 jshi = jslo+1
1043 IF (jslo .eq. ns) jshi = ns
1044 wlo = (hs1*(jshi-1) - s_in)/hs1
1045 whi = 1 - wlo
1046!
1047! FOR ODD-m MODES X ~ SQRT(s), SO INTERPOLATE Xmn/SQRT(s)
1048!
1049 whi_odd = whi*sqrt(s_in/(hs1*(jshi-1)))
1050 IF (jslo .ne. 1) THEN
1051 wlo_odd = wlo*sqrt(s_in/(hs1*(jslo-1)))
1052 ELSE
1053 wlo_odd = 0
1054 whi_odd = sqrt(s_in/(hs1*(jshi-1)))
1055 END IF
1056
1057 WHERE (mod(nint(xm_nyq(:)),2) .eq. 0)
1058 wmins = wlo
1059 wplus = whi
1060 ELSEWHERE
1061 wmins = wlo_odd
1062 wplus = whi_odd
1063 END WHERE
1064
1065 ipresent = 0
1066 ljsupu = PRESENT(jsupu)
1067 IF (ljsupu) THEN
1068 IF (.not.lgsqrt) stop 'MUST compute gsqrt for jsupu'
1069 jsupu = 0 ; ipresent = ipresent+1
1070 jsupumnc1 = wmins*currumnc(:,jslo) + wplus*currumnc(:,jshi)
1071 IF (lasym)
1072 1 jsupumns1 = wmins*currumns(:,jslo) + wplus*currumns(:,jshi)
1073 END IF
1074
1075 ljsupv = PRESENT(jsupv)
1076 IF (ljsupv) THEN
1077 IF (.not.lgsqrt) stop 'MUST compute gsqrt for jsupv'
1078 jsupv = 0 ; ipresent = ipresent+1
1079 jsupvmnc1 = wmins*currvmnc(:,jslo) + wplus*currvmnc(:,jshi)
1080 IF (lasym)
1081 1 jsupvmns1 = wmins*currvmns(:,jslo) + wplus*currvmns(:,jshi)
1082 END IF
1083
1084 IF (ipresent .eq. 0) RETURN
1085
1086 DO mn = 1, mnmax_nyq
1087 m = nint(xm_nyq(mn)); n = nint(xn_nyq(mn))/nfp
1088 n1 = abs(n); sgn = sign(1,n)
1089 tcosmn = cosmu(m)*cosnv(n1) + sgn*sinmu(m)*sinnv(n1)
1090 IF (ljsupu) jsupu = jsupu + jsupumnc1(mn)*tcosmn
1091 IF (ljsupv) jsupv = jsupv + jsupvmnc1(mn)*tcosmn
1092 END DO
1093
1094 IF (.not.lasym) GOTO 2000
1095
1096 DO mn = 1, mnmax_nyq
1097 m = nint(xm_nyq(mn)); n = nint(xn_nyq(mn))/nfp
1098 n1 = abs(n); sgn = sign(1,n)
1099 tsinmn = sinmu(m)*cosnv(n1) - sgn*cosmu(m)*sinnv(n1)
1100 IF (ljsupu) jsupu = jsupu + jsupumns1(mn)*tsinmn
1101 IF (ljsupv) jsupv = jsupv + jsupvmns1(mn)*tsinmn
1102 END DO
1103
1104 2000 CONTINUE
1105
1106 IF (ljsupu) jsupu = jsupu/gsqrt
1107 IF (ljsupv) jsupv = jsupv/gsqrt
1108
1109 END SUBROUTINE tosuvspace
1110
1111 SUBROUTINE loadrzl
1112 IMPLICIT NONE
1113C-----------------------------------------------
1114C L o c a l V a r i a b l e s
1115C-----------------------------------------------
1116 INTEGER :: rcc, rss, zsc, zcs, rsc, rcs, zcc, zss
1117 INTEGER :: mpol1, mn, m, n, n1
1118 REAL(rprec) :: sgn
1119C-----------------------------------------------
1120!
1121! Arrays must be stacked (and ns,ntor,mpol ordering imposed)
1122! as coefficients of cos(mu)*cos(nv), etc
1123! Only need R, Z components(not lambda, for now anyhow)
1124!
1125 IF (ALLOCATED(rzl_local)) RETURN
1126
1127 mpol1 = mpol-1
1128 rcc = 1; zsc = 1
1129 IF (.not.lasym) THEN
1130 IF (lthreed) THEN
1131 ntmax = 2
1132 rss = 2; zcs = 2
1133 ELSE
1134 ntmax = 1
1135 END IF
1136 ELSE
1137 IF (lthreed) THEN
1138 ntmax = 4
1139 rss = 2; rsc = 3; rcs = 4
1140 zcs = 2; zcc = 3; zss = 4
1141 ELSE
1142 ntmax = 2
1143 rsc = 2; zcc = 2
1144 END IF
1145 END IF
1146
1147! only ALLOCATE 2*ntmax, don't need lambdas
1148 zsc = 1+ntmax; zcs = zcs+ntmax; zcc = zcc+ntmax; zss = zss+ntmax
1149 ALLOCATE(rzl_local(ns,0:ntor,0:mpol1,2*ntmax), stat=n)
1150 IF (n .ne. 0) stop 'Allocation error in LoadRZL'
1151 rzl_local = 0
1152
1153 DO mn = 1, mnmax
1154 m = nint(xm(mn)); n = nint(xn(mn))/nfp; n1 = abs(n)
1155 sgn = sign(1, n)
1156 rzl_local(:,n1,m,rcc) = rzl_local(:,n1,m,rcc) + rmnc(mn,:)
1157 rzl_local(:,n1,m,zsc) = rzl_local(:,n1,m,zsc) + zmns(mn,:)
1158 IF (lthreed) THEN
1159 rzl_local(:,n1,m,rss) = rzl_local(:,n1,m,rss)
1160 1 + sgn*rmnc(mn,:)
1161 rzl_local(:,n1,m,zcs) = rzl_local(:,n1,m,zcs)
1162 1 - sgn*zmns(mn,:)
1163 END IF
1164 IF (lasym) THEN
1165 rzl_local(:,n1,m,rsc) = rzl_local(:,n1,m,rsc)
1166 1 + rmns(mn,:)
1167 rzl_local(:,n1,m,zcc) = rzl_local(:,n1,m,zcc)
1168 1 + zmnc(mn,:)
1169 IF (lthreed) THEN
1170 rzl_local(:,n1,m,rcs) = rzl_local(:,n1,m,rcs)
1171 1 - sgn*rmns(mn,:)
1172 rzl_local(:,n1,m,zss) = rzl_local(:,n1,m,zss)
1173 1 + sgn*zmnc(mn,:)
1174 END IF
1175 END IF
1176 END DO
1177
1178! ADDED by SAL for Vecpot calc
1179 IF (.not. ALLOCATED(chi)) ALLOCATE(chi(1:ns))
1180 DO mn = 1, ns
1181 chi(mn) = sum(iotaf(1:mn)*phipf(1:mn))
1182 END DO
1183
1184 END SUBROUTINE loadrzl
1185
1186 END MODULE read_wout_mod
1187
character(len= *), parameter vn_mgmode
Definition mgrid_mod.f:16
character(len=30), dimension(:), allocatable curlabel
Definition mgrid_mod.f:95
character(len=1) mgrid_mode
Definition mgrid_mod.f:102
integer nextcur
Definition mgrid_mod.f:78
character(len= *), parameter vn_nextcur
Definition mgrid_mod.f:16
Reading of wout VMEC output file.
character(len= *), parameter vn_bmns
subroutine readw_and_open(file_or_extension, ierr, iopen)
character(len= *), parameter vn_piota_type
real(rprec) aminor
character(len= *), parameter vn_bsupumns_sur
character pcurr_type
character(len= *), parameter vn_bsubvmns_sur
character(len= *), parameter vn_aspect
real(rprec), dimension(:,:), allocatable lmns
character(len= *), parameter vn_bsupumnc
character(len= *), parameter ln_ctor
character(len= *), parameter ln_tmod
character(len= *), parameter ln_vp
character(len= *), parameter vn_rmns
real(rprec) flmwgt
character(len= *), parameter ln_beta
character(len= *), parameter vn_radnod
character(len= *), parameter ln_bsupumns_sur
character(len= *), parameter ln_curlab
real(rprec), dimension(:), allocatable qfact
character(len= *), parameter ln_pbeta
real(rprec), dimension(:), allocatable y2thom
character(len= *), parameter vn_zacs
character(len= *), parameter ln_am_aux_f
real(rprec), dimension(:), allocatable fsqt
character(len= *), parameter vn_rbt1
character(len= *), parameter ln_maxmod_nyq
character(len= *), parameter vn_bsupumns
character(len= *), parameter vn_bsubsmns
character(len= *), parameter ln_extcur
character(len= *), parameter vn_pmass_type
character(len= *), parameter ln_zbs
character(len= *), parameter ln_fsq
character(len= *), parameter ln_amin
character(len= *), parameter ln_bsubvmns
character(len= *), parameter ln_ftolv
real(rprec) aspect
character(len= *), parameter ln_chipf
subroutine tosuvspace(s_in, u_in, v_in, gsqrt, bsupu, bsupv, jsupu, jsupv, lam)
real(rprec), dimension(:,:), allocatable bsubvmnc
character(len= *), parameter ln_maxit
character(len= *), parameter vn_lmnc
real(rprec), dimension(:,:), allocatable currvmns
real(rprec), dimension(:,:), allocatable zmns
character(len= *), parameter ln_bsubumns
character(len= *), parameter ln_jcurv
character(len= *), parameter vn_tbeta
character(len= *), parameter ln_bsubvmnc
character(len= *), parameter ln_presh
character(len= *), parameter ln_bsupumnc_sur
real(rprec), dimension(:), allocatable presf
real(rprec), dimension(:), allocatable rthom
real(rprec), dimension(:,:), allocatable bsubumnc
character(len= *), parameter ln_merc
real(rprec), dimension(:,:), allocatable bsupumnc
character(len= *), parameter ln_zacc
real(rprec), dimension(:), allocatable extcur
real(rprec), dimension(:,:), allocatable zaxis
character(len= *), parameter ln_thom
character(len= *), parameter ln_rmns
character(len= *), parameter vn_overr
character(len= *), parameter vn_ftolv
character(len= *), parameter ln_therm
character(len= *), parameter ln_bsubumnc_sur
real(rprec), dimension(:), allocatable pres
character(len= *), parameter vn_curlab
real(rprec), dimension(:), allocatable datathom
character(len= *), parameter vn_specw
character(len= *), parameter ln_lmns
real(rprec), dimension(:,:), allocatable rmnc
character(len= *), parameter vn_vp
real(rprec), dimension(:), allocatable am_aux_f
character(len= *), parameter vn_vol
character(len= *), parameter vn_magen
real(rprec), dimension(:), allocatable presmid
real(rprec), dimension(:,:), allocatable rmns
real(rprec) fsql
character(len= *), parameter ln_fsql
character(len= *), parameter vn_maxz
character(len= *), parameter vn_bsupvmns_sur
real(rprec), dimension(:), allocatable xn_nyq
character(len= *), parameter ln_racc
character(len= *), parameter vn_ah
character(len= *), parameter vn_currvmns
character(len= *), parameter vn_abeta
real(rprec), dimension(:), allocatable buco
real(rprec), dimension(:,:), allocatable currumnc
character pmass_type
character(len= *), parameter vn_ac
character(len= *), parameter vn_presf
real(rprec), dimension(:,:), allocatable gmnc
character(len= *), parameter vn_chipf
real(rprec), dimension(:,:), allocatable bsupvmnc
real(rprec) fsqr
character(len= *), parameter vn_jcuru
character(len= *), parameter ln_recon
character(len= *), parameter ln_ai_aux_s
real(rprec), dimension(:), allocatable xn
character(len= *), parameter vn_free
character(len= *), parameter vn_version
character(len= *), parameter vn_currumns
character(len= *), parameter vn_buco
real(rprec) betator
real(rprec) fsqz
character(len= *), parameter vn_mse
character(len= *), parameter vn_phipf
character(len= *), parameter ln_bsubsmns
character(len= *), parameter ln_pmod
real(rprec), dimension(:), allocatable dcurr
real(rprec), dimension(:), allocatable equif
real(rprec), dimension(:), allocatable phipf
real(rprec) volume
character(len= *), parameter vn_ac_aux_f
character(len= *), parameter ln_radnod
character(len= *), parameter vn_bgrv
real(rprec), dimension(:,:), allocatable bmns
character(len= *), parameter vn_mgrid
character(len= *), parameter ln_extension
character(len= *), parameter vn_zmnc
real(rprec), dimension(:), allocatable pknots
character(len= *), parameter ln_chi
character(len= *), parameter vn_iotah
character(len= *), parameter vn_lmns
real(rprec), dimension(:), allocatable dsiobt
real(rprec), dimension(:), allocatable rstark
character(len= *), parameter ln_rbs
real(rprec), dimension(:), allocatable phip
character(len= *), parameter ln_ai
real(rprec), dimension(:,:), allocatable currumns
real(rprec), dimension(:), allocatable mass
character(len= *), parameter vn_bvco
character(len= *), parameter vn_fsqr
character(len= *), parameter vn_zacc
character(len= *), parameter ln_mse
character(len= *), parameter vn_bsubvmnc_sur
character(len= *), parameter vn_gam
real(rprec), dimension(:), allocatable ai
character(len= *), parameter ln_ac_aux_f
real(rprec), dimension(:), allocatable xm_nyq
real(rprec), dimension(:), allocatable bvco
character(len= *), parameter vn_betah
character(len= *), parameter ln_fsqr
real(rprec), dimension(:), allocatable jcurv
character(len= *), parameter ln_bsupvmns_sur
character(len= *), parameter ln_maxr
character(len= *), parameter vn_bsupvmnc
real(rprec), dimension(:), allocatable ystark
character(len= *), parameter ln_mgeo
real(rprec), dimension(:), allocatable y2stark
real(rprec), dimension(:), allocatable jdotb
character(len= *), parameter vn_mshear
character(len= *), parameter ln_bgrv
character(len= *), parameter vn_merc
real(rprec) volavgb
character(len= *), parameter vn_b0
real(rprec), dimension(:), allocatable xm
real(rprec), dimension(:), allocatable vp
character(len= *), parameter ln_zmnc
real(rprec), dimension(:), allocatable ythom
character(len= *), parameter ln_ac_aux_s
character(len= *), parameter vn_ai_aux_s
real(rprec), dimension(:), allocatable iotaf
character(len= *), parameter ln_free
character(len= *), parameter ln_zbc
character(len= *), parameter vn_rbc
real(rprec) rmajor
character(len= *), parameter vn_zbs
character(len= *), parameter ln_phip
character(len= *), parameter ln_bsupvmns
character(len= *), parameter ln_buco
character(len= *), parameter vn_gmnc
character(len= *), parameter ln_potvac
real(rprec), dimension(:), allocatable chipf
real(rprec), dimension(:), allocatable beta_vol
real(rprec), dimension(:), allocatable specw
character(len= *), parameter vn_bsupumnc_sur
character(len= *), parameter ln_currvmnc
character(len= *), parameter vn_qfact
real(rprec), dimension(:), allocatable dwell
character(len= *), parameter ln_bmns
character(len= *), parameter vn_maxr
real(rprec) msewgt
character(len= *), parameter vn_bsubsmnc
character(len= *), parameter vn_currvmnc
real(rprec), dimension(:), allocatable jcuru
character(len= *), parameter vn_jcurv
real(rprec), dimension(:,:), allocatable bmnc
real(rprec), dimension(:), allocatable bdotb
character(len= *), parameter vn_zmns
character(len= *), parameter vn_jdotb
character(len= *), parameter ln_bsupvmnc
real(rprec), dimension(:), allocatable ac
character(len= *), parameter ln_equif
character(len= *), parameter ln_am
real(rprec), dimension(:), allocatable ac_aux_f
character(len= *), parameter ln_currumnc
character(len= *), parameter vn_am_aux_s
real(rprec), dimension(:,:), allocatable currvmnc
character(len= *), parameter vn_tmod_nyq
character(len= *), parameter ln_gmns
real(rprec), dimension(:), allocatable overr
character(len= *), parameter ln_version
real(rprec) pfac
character(len= *), parameter vn_mwell
character(len= *), parameter ln_jcuru
character(len= *), parameter ln_bvco
character(len= *), parameter vn_fsql
character mgrid_file
character(len= *), parameter ln_ac
character(len= *), parameter vn_amin
character(len= *), parameter vn_rmnc
real(rprec), dimension(:), allocatable rmid
character(len= *), parameter ln_bsupvmnc_sur
real(rprec), dimension(:), allocatable chi
character(len= *), parameter vn_mgeo
character(len= *), parameter vn_bsubumns
character(len= *), parameter vn_bsupvmns
character(len= *), parameter vn_mass
character(len= *), parameter vn_modb
real(rprec) zmax_surf
character(len= *), parameter ln_vol
real(rprec) b0
character(len= *), parameter ln_racs
character(len= *), parameter vn_gmns
real(rprec), dimension(:,:), allocatable zmnc
character(len= *), parameter vn_atuname
character(len= *), parameter vn_am
character(len= *), parameter vn_fsq
character(len= *), parameter ln_rbt1
character(len= *), parameter vn_am_aux_f
real(rprec) betaxis
character(len= *), parameter vn_lar
character(len= *), parameter vn_rmaj
character(len= *), parameter ln_specw
real(rprec), dimension(:), allocatable ac_aux_s
logical lwout_opened
character(len= *), parameter vn_bmnc
character(len= *), parameter ln_bdotb
real(rprec) wb
character(len= *), parameter vn_ai
character(len= *), parameter ln_phipf
character(len= *), parameter ln_polmod
character(len= *), parameter ln_bmnc
character(len= *), parameter ln_mcurr
character(len= *), parameter vn_racc
real(rprec), dimension(:,:), allocatable bsupvmns
character(len= *), parameter ln_bsupumns
character(len= *), parameter vn_pmod
character(len= *), parameter ln_iotah
character(len= *), parameter ln_error
character(len= *), parameter ln_piota_type
real(rprec), dimension(:), allocatable dgeod
character(len= *), parameter vn_wdot
character(len= *), parameter vn_bsubumns_sur
character(len= *), parameter vn_asym
character(len= *), parameter vn_extension
character(len= *), parameter ln_maxz
real(rprec), dimension(:), allocatable phi
real(rprec) tswgt
character(len= *), parameter vn_tmod
character(len= *), parameter ln_mwell
real(rprec) rbtor0
real(rprec), dimension(:), allocatable am
character(len= *), parameter ln_mshear
real(rprec), dimension(:,:), allocatable bbc
real(rprec) rmin_surf
real(rprec) betatot
character(len= *), parameter ln_fsqz
real(rprec), dimension(:), allocatable wdot
real(rprec), dimension(:), allocatable am_aux_s
character(len= *), parameter vn_beta
character(len= *), parameter vn_pcurr_type
character(len= *), parameter ln_rmaj
character(len= *), parameter vn_currumnc
character(len= *), parameter ln_rmnc
subroutine loadrzl
real(rprec), dimension(:), allocatable shear
character(len= *), parameter ln_lar
character(len= *), parameter vn_bsubvmns
character(len= *), parameter ln_pmass_type
real(rprec), dimension(:), allocatable curmid
character(len= *), parameter vn_tormod
real(rprec) rmax_surf
real(rprec), dimension(:), allocatable anglemse
real(rprec), dimension(:), allocatable iotas
character(len= *), parameter ln_magen
character(len= *), parameter ln_minr
character(len= *), parameter ln_presf
character(len= *), parameter ln_b0
character(len= *), parameter vn_equif
real(rprec), dimension(:), allocatable potvac
integer imatch_phiedge
real(rprec), dimension(:), allocatable datastark
character(len= *), parameter ln_currvmns
real(rprec) version_
character(len= *), parameter ln_rbt0
real(rprec), dimension(:), allocatable ai_aux_f
character(len= *), parameter ln_fp
real(rprec), dimension(:,:), allocatable bsubsmnc
character input_extension
character(len= *), parameter vn_error
real(rprec) delphid
character(len= *), parameter vn_minr
character(len= *), parameter vn_extcur
character(len= *), parameter vn_pmod_nyq
character(len= *), parameter ln_mass
character(len= *), parameter vn_bsubumnc
real(rprec), dimension(:), allocatable qmid
character(len= *), parameter vn_presh
real(rprec), dimension(:,:), allocatable bsubumns
character(len= *), parameter vn_sgs
character(len= *), parameter ln_pmod_nyq
character(len= *), parameter vn_phi
character(len= *), parameter ln_rbc
character(len= *), parameter ln_aspect
character(len= *), parameter ln_bsubumns_sur
subroutine read_wout_deallocate
real(rprec) bcwgt
character(len= *), parameter vn_ctor
character(len= *), parameter ln_ai_aux_f
character(len= *), parameter vn_bdotb
character(len= *), parameter vn_racs
character(len= *), parameter vn_pbeta
character(len= *), parameter ln_bsubvmnc_sur
character(len= *), parameter vn_chi
real(rprec) machsq
character(len= *), parameter vn_polmod
real(rprec), dimension(:,:), allocatable bsubvmns
real(rprec), dimension(:), allocatable sknots
character(len= *), parameter vn_mcurr
character(len= *), parameter ln_zmns
real(rprec), dimension(:,:), allocatable bsupumns
real(rprec), dimension(:), allocatable dshear
character(len= *), parameter ln_bsubumnc
character(len= *), parameter vn_maxmod_nyq
character(len= *), parameter vn_bsubvmnc
character(len= *), parameter ln_bsupumnc
character(len= *), parameter ln_sgs
character(len= *), parameter ln_wdot
character(len= *), parameter ln_pcurr_type
character(len= *), parameter vn_thom
character(len= *), parameter ln_tbeta
real(rprec), dimension(:), allocatable qmeas
real(rprec) phidiam
character(len= *), parameter ln_maxmod
character(len= *), parameter vn_maxit
character(len= *), parameter vn_ac_aux_s
character(len= *), parameter vn_rbt0
real(rprec) betapol
character(len= *), parameter ln_lmnc
real(rprec), dimension(:), allocatable alfa
character(len= *), parameter ln_tmod_nyq
character(len= *), parameter vn_fp
character(len= *), parameter ln_bsubsmnc
subroutine compute_currents(bsubsmnc_i, bsubsmns_i, bsubumnc_i, bsubumns_i, bsubvmnc_i, bsubvmns_i, xm_nyq_i, xn_nyq_i, mnmax_nyq_i, lasym_i, ns_i, currumnc_o, currvmnc_o, currumns_o, currvmns_o)
character(len= *), parameter ln_mgrid
character(len= *), parameter ln_currumns
real(rprec), dimension(:), allocatable dmerc
real(rprec) wp
real(rprec) gamma
character(len= *), parameter ln_iotaf
real(rprec), dimension(:,:), allocatable lmnc
character(len= *), parameter vn_zbc
character(len= *), parameter vn_potvac
character(len= *), parameter ln_am_aux_s
character(len= *), parameter ln_phi
character piota_type
character(len= *), parameter ln_asym
character(len= *), parameter ln_tormod
character(len= *), parameter ln_abeta
character(len= *), parameter ln_qfact
character(len= *), parameter vn_maxmod
real(rprec), dimension(:), allocatable ai_aux_s
character(len= *), parameter vn_iotaf
real(rprec) rbtor
character(len= *), parameter ln_betah
real(rprec), dimension(:,:,:,:), allocatable rzl_local
real(rprec), dimension(:,:), allocatable raxis
real(rprec), dimension(:), allocatable bdotgradv
character(len= *), parameter vn_therm
character(len= *), parameter vn_rbs
character(len= *), parameter ln_gmnc
character(len= *), parameter vn_phip
character(len= *), parameter vn_fsqz
character(len= *), parameter vn_bsupvmnc_sur
character(len= *), parameter ln_modb
character(len= *), parameter ln_bsubvmns_sur
real(rprec) itor
character(len= *), parameter ln_gam
real(rprec), dimension(:,:), allocatable gmns
real(rprec) ionlarmor
real(rprec), dimension(:,:), allocatable bsubsmns
character(len= *), parameter ln_jdotb
character(len= *), parameter ln_zacs
character(len= *), parameter vn_ai_aux_f
character(len= *), parameter vn_bsubumnc_sur
real(rprec) ftolv
fault-tolerant file opening routines
real(dp), parameter mu0
real(dp), parameter one
real(dp), parameter zero
integer, parameter rprec
subroutine parse_extension(file_to_parse, file_or_extension, lnc)
Parse the first command-line argument into a filename.