| 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 |