MPI-AMRVAC 3.1
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_rbsl.t
Go to the documentation of this file.
1!> To get a RBSL magnetic flux rope in 3D (Titov 2018 ApJL 852, L21)
2module mod_rbsl
3 implicit none
4
5contains
6
7{^ifthreed
8 subroutine rbsl(ixI^L,ixO^L,np,a,F_flx,positive_helicity,x,x_axis,Atotal,Bfr)
10 use mod_geometry
11
12 integer, intent(in) :: ixI^L,ixO^L
13 ! resolution of flux rope axis
14 integer, intent(in) :: np
15 double precision, intent(in) :: x(ixI^S,1:ndim)
16 ! coordinates of flux rope axis (integral path)
17 double precision, intent(in) :: x_axis(np,1:ndim)
18 ! cross-sectional radius of flux rope
19 double precision, intent(in) :: a
20 ! net magnetic flux along flux rope axis
21 double precision, intent(in) :: F_flx
22 ! is positive helicity
23 logical, intent(in) :: positive_helicity
24 ! vector potential of flux rope
25 double precision, intent(out) :: Atotal(ixI^S,1:ndim)
26 ! magnetic field of flux rope
27 double precision, optional, intent(out) :: Bfr(ixI^S,1:ndir)
28
29 ! net current along flux rope axis for azimuthal magnetic field
30 double precision :: I_cur
31 ! vector potential for azimuthal magnetic field
32 double precision :: AIx(ixI^S,1:ndim)
33 ! vector potential for axial magnetic field
34 double precision :: AFx(ixI^S,1:ndim)
35 double precision :: r_mag, KIr, KFr, dl, re_pi, sqrt1r, f52r,fsqrt6
36 double precision :: Rpl(1:ndim), r_vec(1:ndim), Rcr(1:ndim)
37 integer :: ix^D, ixp, idirmin
38
39 if(positive_helicity) then
40 i_cur = 5.d0*sqrt(2.d0)*f_flx/(3.d0*4.d0*dpi*a)
41 else
42 i_cur =-5.d0*sqrt(2.d0)*f_flx/(3.d0*4.d0*dpi*a)
43 end if
44
45 re_pi=1.d0/dpi
46 aix = 0.d0
47 afx = 0.d0
48 fsqrt6=1.d0/sqrt(6.d0)
49 {do ix^db=ixomin^db,ixomax^db\}
50 do ixp=1,np
51 ! position vector from source point to field point
52 r_vec(:) = (x(ix^d,:) - x_axis(ixp,:))/a
53 r_mag = sqrt(sum(r_vec(:)**2))
54 ! calculate tangential vector of the axis which is a circle
55 if (ixp == 1) then
56 rpl(:) = 0.5d0*(x_axis(ixp+1,:)-x_axis(np,:))
57 else if (ixp==np) then
58 rpl(:) = 0.5d0*(x_axis(1,:)-x_axis(ixp-1,:))
59 else
60 rpl(:) = 0.5d0*(x_axis(ixp+1,:)-x_axis(ixp-1,:))
61 end if
62 ! Rpl X r_vec
63 rcr(1) = rpl(2)*r_vec(3) - rpl(3)*r_vec(2)
64 rcr(2) = rpl(3)*r_vec(1) - rpl(1)*r_vec(3)
65 rcr(3) = rpl(1)*r_vec(2) - rpl(2)*r_vec(1)
66 if (r_mag < 1.d0) then
67 sqrt1r=sqrt(1.d0-r_mag**2)
68 f52r=5.d0-2.d0*r_mag**2
69 kir = 2.d0*re_pi*(asin(r_mag)/r_mag + f52r*third*sqrt1r)
70 kfr = 2.d0*re_pi/r_mag**2*(asin(r_mag)/r_mag-sqrt1r) + &
71 2.d0*re_pi*sqrt1r + f52r*0.5d0*fsqrt6*(1.d0 - &
72 2.d0*re_pi*asin((1.d0+2.d0*r_mag**2)/f52r))
73 else
74 kir = 1.d0/r_mag
75 kfr = kir**3
76 endif
77 aix(ix^d,:) = aix(ix^d,:) + kir*rpl(:)
78 afx(ix^d,:) = afx(ix^d,:) + kfr*rcr(:)
79 end do
80 aix(ix^d,:) = aix(ix^d,:)*i_cur/a
81 afx(ix^d,:) = afx(ix^d,:)*f_flx*0.25d0*re_pi/a**2
82 {end do\}
83 atotal=aix+afx
84 if(present(bfr)) call curlvector(atotal,ixi^l,ixo^l,bfr,idirmin,1,ndir)
85
86 end subroutine rbsl
87}
88
89end module mod_rbsl
Module with geometry-related routines (e.g., divergence, curl)
Definition mod_geometry.t:2
This module contains definitions of global parameters and variables and some generic functions/subrou...
To get a RBSL magnetic flux rope in 3D (Titov 2018 ApJL 852, L21)
Definition mod_rbsl.t:2
subroutine rbsl(ixil, ixol, np, a, f_flx, positive_helicity, x, x_axis, atotal, bfr)
Definition mod_rbsl.t:9