Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
MODULE units
USE prec_const
IMPLICIT NONE
PRIVATE
!! Define the reference values for transforming simulation data into physical units
! The default value, commented here, are corresponding to the #186473 DIII-D discharge at rho=0.95.
REAL(xp), PUBLIC, PROTECTED :: n_ref = -1!25 ! density (electrons) [1e19m-3]
REAL(xp), PUBLIC, PROTECTED :: T_ref = -1!0.3 ! temperature (electrons) [keV]
REAL(xp), PUBLIC, PROTECTED :: R_ref = -1!1.7 ! length (major radius) [m]
REAL(xp), PUBLIC, PROTECTED :: B_ref = -1!2.0 ! magnetic field [T]
REAL(xp), PUBLIC, PROTECTED :: m_ref = -1!1 ! mass [nucleid mass]
REAL(xp), PUBLIC, PROTECTED :: q_ref = -1!1 ! charge [elementary charge]
! Input flag to write heat flux in MW in the std terminal
LOGICAL, PUBLIC, PROTECTED :: WRITE_MW = .false.
! Physical constants
REAL(xp), PUBLIC, PROTECTED :: kB = 1.4e-23 ! Boltzmann constant [J/K]
REAL(xp), PUBLIC, PROTECTED :: mp = 1.7e-27 ! proton mass at rest [kg]
REAL(xp), PUBLIC, PROTECTED :: ec = 1.6e-19 ! elementary charge [C]
! Derived normalization quantities
REAL(xp), PUBLIC, PROTECTED :: c_s0 ! sound speed [m/s]
REAL(xp), PUBLIC, PROTECTED :: r_s0 ! sound Larmor radius [m/s]
REAL(xp), PUBLIC, PROTECTED :: w_ci ! ion cyclotron frequency [1/s]
REAL(xp), PUBLIC, PROTECTED :: A_fs ! flux surface area (torus approx) [m2]
! Physical unit converters
REAL(xp), PUBLIC, PROTECTED :: hf_ref ! heat flux [W/m2]
REAL(xp), PUBLIC, PROTECTED :: pf_ref ! particle flux [1/s/m2]
REAL(xp), PUBLIC, PROTECTED :: mf_ref ! momentum flux [kg (m/s)2]
REAL(xp), PUBLIC, PROTECTED :: ph_ref ! voltage [V]
REAL(xp), PUBLIC, PROTECTED :: pow_ref ! power [MW]
PUBLIC :: units_readinputs, units_outputinputs
CONTAINS
SUBROUTINE units_readinputs
! Read the input parameters
USE basic, ONLY: lu_in
USE geometry, ONLY: eps, geom
USE prec_const, ONLY: xp, pi
IMPLICIT NONE
REAL(xp) :: T0,n0, p0, m0, q0
INTEGER :: fu
! Define namelist to read
NAMELIST /UNITS/ n_ref, T_ref, R_ref, B_ref, m_ref, q_ref, WRITE_MW
! Read namelist in input file
READ(unit=lu_in,nml=units,iostat=fu)
! Convert in mksa
T0 = ec*(1000*T_ref)/kB ! temperature [K]
n0 = n_ref*1e19 ! density [m-3]
m0 = m_ref*mp ! mass [kg]
q0 = q_ref*ec ! charge [C]
! Setup derived normalization quantities
c_s0 = sqrt(kB*T0/m0) ! Sound speed [m/s]
w_ci = q0*B_ref/m0 ! Ion cyclotron frequ. [Hz]
r_s0 = c_s0/w_ci ! Ion Larmor radius [m]
SELECT CASE(geom)
CASE('z-pinch','Z-pinch','zpinch','Zpinch')
A_fs = 2*pi*R_ref*R_ref ! Area of a cylinder of height R_ref [m2]
CASE DEFAULT
A_fs = 4*pi**2*eps*R_ref**2 ! Area of the toroidal flux surface [m2]
END SELECT
! Setup physical unit converters
p0 = n0*kB*T0 ! pressure [Pa]
hf_ref = p0*c_s0*r_s0**2/R_ref**2 ! Gyrobohm heat flux [W/m2]
pow_ref = hf_ref*A_fs/1e6 ! Gyrobohm power [MW]
pf_ref = n0*c_s0*r_s0**2/R_ref**2 ! Particle flux [1/s/m2]
mf_ref = n0*m0*c_s0**2*r_s0**2/R_ref**2 ! Momentum flux [kg (m/s)2]
END SUBROUTINE units_readinputs
SUBROUTINE units_outputinputs(fid)
! Write the input parameters to the results_xx.h5 file
USE futils, ONLY: attach, creatd
IMPLICIT NONE
INTEGER, INTENT(in) :: fid
CHARACTER(len=256) :: str
WRITE(str,'(a)') '/data/input/units'
CALL creatd(fid, 0,(/0/),TRIM(str),'Units Input')
CALL attach(fid, TRIM(str), "density (electrons)", n_ref)
CALL attach(fid, TRIM(str), "temperature (electrons)", T_ref)
CALL attach(fid, TRIM(str), "length (major radius)",R_ref)
CALL attach(fid, TRIM(str), "magnetic field (electrons)", B_ref)
CALL attach(fid, TRIM(str), "mass (proton)", m_ref)
CALL attach(fid, TRIM(str), "charge (elementary)", q_ref)
! Write the mksa converter if units input are provided
if ( (hf_ref > 0) .AND. (pf_ref > 0) .AND. (mf_ref > 0)) THEN
CALL attach(fid, TRIM(str), "heat flux (gyroBohm)", hf_ref)
CALL attach(fid, TRIM(str), "power (gyroBohm)", pow_ref)
CALL attach(fid, TRIM(str), "particle flux (gyroBohm)", pf_ref)
CALL attach(fid, TRIM(str), "momentum flux (gyroBohm)", mf_ref)
ENDIF
END SUBROUTINE units_outputinputs
END MODULE units