GCC Code Coverage Report


Directory: ./
File: src/magfie_can_boozer.f90
Date: 2026-10-22 05:02:02
Coverage Exec Excl Total
Lines: 100.0% 47 0 47
Functions: 100.0% 2 0 2
Branches: 100.0% 2 0 2

Line Branch Exec Source
1 module magfie_can_boozer_sub
2
3 use libneo_kinds, only: dp
4 use get_can_sub, only: splint_can_coord
5 use boozer_sub, only: splint_boozer_coord
6 use vector_potentail_mod, only: torflux
7
8 implicit none
9
10 contains
11
12 32 subroutine magfie_can(x, bmod, sqrtg, bder, hcovar, hctrvr, hcurl)
13 ! Computes magnetic field module in units of the magnetic code - bmod,
14 ! square root of determinant of the metric tensor - sqrtg,
15 ! derivatives of the logarythm of the magnetic field module
16 ! over coordinates - bder,
17 ! covariant componets of the unit vector of the magnetic
18 ! field direction - hcovar,
19 ! contravariant components of this vector - hctrvr,
20 ! contravariant component of the curl of this vector - hcurl
21 ! Order of coordinates is the following: x(1)=s (normalized toroidal flux),
22 ! x(2)=vartheta_c (canonical poloidal angle), x(3)=varphi_c (canonical toroidal angle).
23 !
24 ! Input parameters:
25 ! formal: x(3) - array of canonical coordinates
26 ! Output parameters:
27 ! formal: bmod
28 ! sqrtg
29 ! bder(3) - derivatives of $\log(B)$
30 ! hcovar(3) - covariant components of unit vector $\bh$
31 ! along $\bB$
32 ! hctrvr(3) - contra-variant components of unit vector $\bh$
33 ! along $\bB$
34 ! hcurl(3) - contra-variant components of curl of $\bh$
35 !
36 ! Called routines: canonical_field
37
38 implicit none
39
40 logical :: fullset
41 integer :: mode_secders
42 real(dp), intent(in) :: x(3)
43 real(dp), intent(out) :: bmod, sqrtg
44 real(dp), intent(out) :: bder(3), hcovar(3), hctrvr(3), hcurl(3)
45 real(dp) :: r, vartheta_c, varphi_c, &
46 A_phi, A_theta, dA_phi_dr, dA_theta_dr, d2A_phi_dr2, &
47 d3A_phi_dr3, &
48 sqg_c, dsqg_c_dr, dsqg_c_dt, dsqg_c_dp, &
49 B_vartheta_c, dB_vartheta_c_dr, dB_vartheta_c_dt, &
50 dB_vartheta_c_dp, &
51 B_varphi_c, dB_varphi_c_dr, dB_varphi_c_dt, &
52 dB_varphi_c_dp, G_c, &
53 d2sqg_rr, d2sqg_rt, d2sqg_rp, d2sqg_tt, d2sqg_tp, d2sqg_pp, &
54 d2bth_rr, d2bth_rt, d2bth_rp, d2bth_tt, d2bth_tp, d2bth_pp, &
55 d2bph_rr, d2bph_rt, d2bph_rp, d2bph_tt, d2bph_tp, d2bph_pp
56 real(dp) :: Bctr_vartheta, Bctr_varphi, bmod2
57
58 32 r = x(1)
59 32 vartheta_c = x(2)
60 32 varphi_c = x(3)
61
62 32 fullset = .false.
63 32 mode_secders = 0
64
65 call splint_can_coord(fullset, mode_secders, r, vartheta_c, varphi_c, &
66 A_theta, A_phi, dA_theta_dr, dA_phi_dr, d2A_phi_dr2, &
67 d3A_phi_dr3, &
68 sqg_c, dsqg_c_dr, dsqg_c_dt, dsqg_c_dp, &
69 B_vartheta_c, dB_vartheta_c_dr, dB_vartheta_c_dt, &
70 dB_vartheta_c_dp, &
71 B_varphi_c, dB_varphi_c_dr, dB_varphi_c_dt, &
72 dB_varphi_c_dp, &
73 d2sqg_rr, d2sqg_rt, d2sqg_rp, d2sqg_tt, d2sqg_tp, &
74 d2sqg_pp, &
75 d2bth_rr, d2bth_rt, d2bth_rp, d2bth_tt, d2bth_tp, &
76 d2bth_pp, &
77 d2bph_rr, d2bph_rt, d2bph_rp, d2bph_tt, d2bph_tp, &
78 32 d2bph_pp, G_c)
79
80 32 sqrtg = sqg_c
81
82 32 Bctr_vartheta = -dA_phi_dr/sqg_c
83 32 Bctr_varphi = dA_theta_dr/sqg_c
84
85 32 bmod2 = Bctr_vartheta*B_vartheta_c + Bctr_varphi*B_varphi_c
86 32 bmod = sqrt(bmod2)
87
88 bder(1) = 0.5d0*((dA_theta_dr*dB_varphi_c_dr - dA_phi_dr*dB_vartheta_c_dr - &
89 d2A_phi_dr2*B_vartheta_c) &
90 32 /bmod2 - dsqg_c_dr)/sqg_c
91 bder(2) = 0.5d0*((dA_theta_dr*dB_varphi_c_dt - &
92 dA_phi_dr*dB_vartheta_c_dt)/bmod2 - &
93 32 dsqg_c_dt)/sqg_c
94 bder(3) = 0.5d0*((dA_theta_dr*dB_varphi_c_dp - &
95 dA_phi_dr*dB_vartheta_c_dp)/bmod2 - &
96 32 dsqg_c_dp)/sqg_c
97
98 32 hcovar(1) = 0.d0
99 32 hcovar(2) = B_vartheta_c/bmod
100 32 hcovar(3) = B_varphi_c/bmod
101
102 32 hctrvr(1) = 0.d0
103 32 hctrvr(2) = Bctr_vartheta/bmod
104 32 hctrvr(3) = Bctr_varphi/bmod
105
106 hcurl(1) = ((dB_varphi_c_dt - dB_vartheta_c_dp)/bmod - bder(2)*hcovar(3) + &
107 32 bder(3)*hcovar(2))/sqg_c
108 32 hcurl(2) = (-dB_varphi_c_dr/bmod + bder(1)*hcovar(3))/sqg_c
109 32 hcurl(3) = (dB_vartheta_c_dr/bmod - bder(1)*hcovar(2))/sqg_c
110
111 32 end subroutine magfie_can
112
113 45190832 subroutine magfie_boozer(x, bmod, sqrtg, bder, hcovar, hctrvr, hcurl)
114 ! Computes magnetic field module in units of the magnetic code - bmod,
115 ! square root of determinant of the metric tensor - sqrtg,
116 ! derivatives of the logarythm of the magnetic field module
117 ! over coordinates - bder,
118 ! covariant componets of the unit vector of the magnetic
119 ! field direction - hcovar,
120 ! contravariant components of this vector - hctrvr,
121 ! contravariant component of the curl of this vector - hcurl
122 ! Order of coordinates is the following: x(1)=s (normalized toroidal flux),
123 ! x(2)=vartheta_B (Boozer's poloidal angle), x(3)=varphi_B (Boozer's toroidal angle).
124 !
125 ! Input parameters:
126 ! formal: x(3) - array of Boozer coordinates
127 ! Output parameters:
128 ! formal: bmod
129 ! sqrtg
130 ! bder(3) - derivatives of $\log(B)$
131 ! hcovar(3) - covariant components of unit vector $\bh$
132 ! along $\bB$
133 ! hctrvr(3) - contra-variant components of unit vector $\bh$
134 ! along $\bB$
135 ! hcurl(3) - contra-variant components of curl of $\bh$
136 !
137 ! Called routines: splint_boozer_coord
138
139 implicit none
140
141 real(dp), intent(in) :: x(3)
142 real(dp), intent(out) :: bmod, sqrtg
143 real(dp), intent(out) :: bder(3), hcovar(3), hctrvr(3), hcurl(3)
144
145 real(dp) :: r, vartheta_B, varphi_B, &
146 A_phi, A_theta, dA_phi_dr, dA_theta_dr, d2A_phi_dr2, &
147 d3A_phi_dr3, &
148 B_vartheta_B, dB_vartheta_B, d2B_vartheta_B, &
149 B_varphi_B, dB_varphi_B, d2B_varphi_B, Bmod_B, B_r
150 real(dp), dimension(3) :: dBmod_B, dB_r
151 real(dp), dimension(6) :: d2Bmod_B, d2B_r
152
153 real(dp) :: aiota, Bctrvr_theta, Bctrvr_phi, sqrtgbmod
154
155 integer, parameter :: mode_secders = 0
156
157 45190832 r = x(1)
158 45190832 vartheta_B = x(2)
159 45190832 varphi_B = x(3)
160
161 call splint_boozer_coord(r, vartheta_B, varphi_B, mode_secders, &
162 A_theta, A_phi, dA_theta_dr, dA_phi_dr, d2A_phi_dr2, &
163 d3A_phi_dr3, &
164 B_vartheta_B, dB_vartheta_B, d2B_vartheta_B, &
165 B_varphi_B, dB_varphi_B, d2B_varphi_B, &
166 Bmod_B, dBmod_B, d2Bmod_B, &
167 45190832 B_r, dB_r, d2B_r)
168
169 45190832 aiota = -dA_phi_dr/dA_theta_dr
170
171 45190832 bmod = Bmod_B
172
2/2
✓ Branch 0 taken 135572496 times.
✓ Branch 1 taken 45190832 times.
180763328 bder = dBmod_B/Bmod_B
173
174 45190832 sqrtg = (aiota*B_vartheta_B + B_varphi_B)/bmod**2*torflux
175
176 45190832 Bctrvr_phi = dA_theta_dr/sqrtg
177 45190832 Bctrvr_theta = aiota*Bctrvr_phi
178 45190832 hctrvr(1) = 0.d0
179 45190832 hctrvr(2) = Bctrvr_theta/bmod
180 45190832 hctrvr(3) = Bctrvr_phi/bmod
181
182 45190832 hcovar(1) = B_r/bmod
183 45190832 hcovar(2) = B_vartheta_B/bmod
184 45190832 hcovar(3) = B_varphi_B/bmod
185
186 45190832 sqrtgbmod = sqrtg*bmod
187 45190832 hcurl(1) = (B_vartheta_B*bder(3) - B_varphi_B*bder(2))/sqrtgbmod
188 45190832 hcurl(2) = (B_varphi_B*bder(1) - B_r*bder(3) + dB_r(3) - dB_varphi_B)/sqrtgbmod
189 hcurl(3) = (B_r*bder(2) - B_vartheta_B*bder(1) + dB_vartheta_B - &
190 45190832 dB_r(2))/sqrtgbmod
191
192 45190832 end subroutine magfie_boozer
193
194 end module magfie_can_boozer_sub
195