V3FIT
rt_hand_side_dtheta.f
1 
2 
3  SUBROUTINE rt_hand_side_dtheta(neq, theta, yin, fout) ! Defines field-line equations for LSODE integrator for type="poloidal"
4  USE stel_kinds ! The right hand sides are B^s/B^u and B^v/B^u.
5  USE stel_constants ! To get them, one simply uses:
6  USE bspline ! B^R =B*grad R = B^sRs + B^uRu + B^vRv
7  USE spline3d_fit_coefs ! B^z =B*grad Z = B^sZs + B^uZu + B^vZu
8  USE lsode_quantities ! B^Phi = B*grad PHi = B^sPhi_s + B^u Phi_u + B^vPhi
9  IMPLICIT NONE ! ... and inverts to get B^s and B^u.
10  INTEGER, INTENT(IN):: neq ! Recall that it is assumed that Phi=v, thus Phi_s = Phi_u = 0
11  REAL(KIND=rprec), INTENT(IN):: theta
12  REAL(KIND=rprec), DIMENSION(neq), INTENT(IN) :: yin
13  REAL(KIND=rprec), DIMENSION(neq), INTENT(OUT):: fout
14  INTEGER:: i, isize
15  REAL(KIND=rprec) :: s_eval, phi_eval, theta_eval,
16  & bs, bu, bv, jac
17 
18  isize = neq/2
19  DO i = 1, isize !loop over field lines
20  s_eval = yin(2*i-1); theta_eval = theta
21  phi_eval = yin(2*i)
22  CALL reset_coords(s_eval, theta_eval, phi_eval)
23  s_nb(i) = s_eval; phi_nb(i) = phi_eval
24  theta_nb(i) = theta_eval
25  ENDDO
26 
27  CALL dbs3vd(0, 0, 0, isize, s_nb, theta_nb, phi_nb, ks, ku, ! Br
28  & kv, s_knots, u_knots, v_knots, is, itht, iphi, br_coef,
29  & br_s_nb, is_uniformx, is_uniformy, is_uniformz )
30 
31  CALL dbs3vd(0, 0, 0, isize, s_nb, theta_nb, phi_nb, ks, ku, ! Bphi
32  & kv, s_knots, u_knots, v_knots, is, itht, iphi, bphi_coef,
33  & bphi_s_nb, is_uniformx, is_uniformy, is_uniformz )
34 
35  CALL dbs3vd(0, 0, 0, isize, s_nb, theta_nb, phi_nb, ks, ku, ! Bz
36  & kv, s_knots, u_knots, v_knots, is, itht, iphi, bz_coef,
37  & bz_s_nb, is_uniformx, is_uniformy, is_uniformz )
38 
39  CALL dbs3vd(0, 0, 0, isize, s_nb, theta_nb, phi_nb, ks, ku, ! R
40  & kv, s_knots, u_knots, v_knots, is, itht, iphi, r_coef,
41  & r_s_nb, is_uniformx, is_uniformy, is_uniformz )
42 
43  DO i = 1, isize
44  s_eval = s_nb(i); theta_eval = theta_nb(i)
45  phi_eval = phi_nb(i)
46  drds_s_nb(i) = dbs3dr(1, 0, 0, s_eval, theta_eval, phi_eval, ! dR/ds
47  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, r_coef)
48  drdtht_s_nb(i) = dbs3dr(0, 1, 0, s_eval, theta_eval, phi_eval, ! dR/du
49  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, r_coef)
50  drdphi_s_nb(i) = dbs3dr(0, 0, 1, s_eval, theta_eval, phi_eval, ! dR/dv
51  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, r_coef)
52  dzds_s_nb(i) = dbs3dr(1, 0, 0, s_eval, theta_eval, phi_eval, ! dZ/ds
53  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, z_coef)
54  dzdtht_s_nb(i) = dbs3dr(0, 1, 0, s_eval, theta_eval, phi_eval, ! dZ/du
55  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, z_coef)
56  dzdphi_s_nb(i) = dbs3dr(0, 0, 1, s_eval, theta_eval, phi_eval, ! dZ/dv
57  & ks, ku, kv, s_knots, u_knots, v_knots, is, itht, iphi, z_coef)
58  ENDDO
59 
60  DO i = 1, isize ! Field line ODEs in cylindrical geometry
61  jac = drds_s_nb(i)*dzdtht_s_nb(i) - drdtht_s_nb(i)*dzds_s_nb(i)
62  bs = r_s_nb(i)*(dzdtht_s_nb(i)*br_s_nb(i) - !B^s = (R(Zu*B^R-RuB^Z))+B^Phi*(RuZv-RvZu))/Jacob
63  & drdtht_s_nb(i)*bz_s_nb(i)) + bphi_s_nb(i)*(
64  & drdtht_s_nb(i)*dzdphi_s_nb(i) - drdphi_s_nb(i)*dzdtht_s_nb(i))
65  bu = r_s_nb(i)*(drds_s_nb(i)*bz_s_nb(i) - !B^u = (R(RsB^z-ZsB^R)}B^Phi*(ZsRv-RsZu))/Jacob
66  & dzds_s_nb(i)*br_s_nb(i)) + bphi_s_nb(i)*(
67  & drdphi_s_nb(i)*dzds_s_nb(i) - drds_s_nb(i)*dzdphi_s_nb(i))
68  bv = bphi_s_nb(i)
69  IF (bu == zero) stop 'BU becomes zero for some orbit!'
70  fout(2*i-1) = bs/bu ! r.h.s. = B^s/B^u
71  fout(2*i) = (jac*bv)/bu ! r.h.s. = B^v/B^u
72  END DO
73 
74  END SUBROUTINE rt_hand_side_dtheta