32 double precision,
allocatable,
save ::
bz0(:,:)
33 double precision,
allocatable,
save ::
xa1(:),
xa2(:)
40 double precision,
intent(in) :: qLunit,qBunit
41 double precision :: xc1,xc2,dxm1,dxm2
42 integer,
dimension(MPI_STATUS_SIZE) :: statuss
43 integer :: file_handle,i
44 character(len=*),
intent(in) :: magnetogramname
50 inquire(file=magnetogramname,exist=aexist)
52 if(
mype==0)
write(*,
'(2a)')
"can not find file:",magnetogramname
53 call mpistop(
"no input magnetogram----init_b_fff_data")
55 call mpi_file_open(
icomm,magnetogramname,mpi_mode_rdonly,mpi_info_null,&
57 call mpi_file_read_all(file_handle,
nx1,1,mpi_integer,statuss,
ierrmpi)
58 call mpi_file_read_all(file_handle,
nx2,1,mpi_integer,statuss,
ierrmpi)
60 call mpi_file_read_all(file_handle,xc1,1,mpi_double_precision,statuss,
ierrmpi)
61 call mpi_file_read_all(file_handle,xc2,1,mpi_double_precision,statuss,
ierrmpi)
62 call mpi_file_read_all(file_handle,dxm1,1,mpi_double_precision,statuss,
ierrmpi)
63 call mpi_file_read_all(file_handle,dxm2,1,mpi_double_precision,statuss,
ierrmpi)
64 call mpi_file_read_all(file_handle,
bz0,
nx1*
nx2,mpi_double_precision,&
66 call mpi_file_close(file_handle,
ierrmpi)
70 xa1(i) = xc1 + (dble(i) - dble(
nx1)/2.d0 - 0.5d0)*dxm1
73 xa2(i) = xc2 + (dble(i) - dble(
nx2)/2.d0 - 0.5d0)*dxm2
88 print*,
'magnetogram xrange:',minval(
xa1),maxval(
xa1)
89 print*,
'magnetogram yrange:',minval(
xa2),maxval(
xa2)
93 print*,
'extrapolating 3D force-free field from an observed Bz '
94 print*,
'magnetogram of',
nx1,
'by',
nx2,
'pixels. Bzmax=',
bzmax
109 integer,
intent(in) :: ixI^L, ixO^L
110 integer,
optional,
intent(in) :: idir
111 double precision,
intent(in) :: x(ixI^S,1:ndim),alpha,zshift
112 double precision,
intent(inout) :: Bf(ixI^S,1:ndir)
114 double precision,
dimension(ixO^S) :: cos_az,sin_az,zk,bigr,r,r2,r3,cos_ar,sin_ar,g,dgdz
115 double precision :: gx(ixO^S,1:ndim),twopiinv
116 integer :: idim,ixp1,ixp2
121 zk(ixo^s)=x(ixo^s,3)-xprobmin3+zshift
122 cos_az(ixo^s)=dcos(alpha*zk(ixo^s))
123 sin_az(ixo^s)=dsin(alpha*zk(ixo^s))
127 bigr(ixo^s)=dsqrt((x(ixo^s,1)-
xa1(ixp1))**2+&
128 (x(ixo^s,2)-
xa2(ixp2))**2)
146 g=(zk*cos_ar*r-cos_az)*bigr
147 dgdz=(cos_ar*(r-zk**2*r3)-alpha*zk**2*sin_ar*r2+alpha*sin_az)*bigr
149 if(
present(idir).and.idim/=idir) cycle
152 bf(ixo^s,1)=bf(ixo^s,1)+
bz0(ixp1,ixp2)*((x(ixo^s,1)-
xa1(ixp1))*dgdz(ixo^s)&
153 +alpha*g(ixo^s)*(x(ixo^s,2)-
xa2(ixp2)))*bigr(ixo^s)
155 bf(ixo^s,2)=bf(ixo^s,2)+
bz0(ixp1,ixp2)*((x(ixo^s,2)-
xa2(ixp2))*dgdz(ixo^s)&
156 -alpha*g(ixo^s)*(x(ixo^s,1)-
xa1(ixp1)))*bigr(ixo^s)
158 bf(ixo^s,3)=bf(ixo^s,3)+
bz0(ixp1,ixp2)*(zk(ixo^s)*cos_ar(ixo^s)*r3(ixo^s)+alpha*&
159 zk(ixo^s)*sin_ar(ixo^s)*r2(ixo^s))
164 bf(ixo^s,:)=bf(ixo^s,:)*twopiinv
177 integer,
intent(in) :: ixI^L, ixO^L
178 double precision,
intent(in) :: x(ixI^S,1:ndim),zshift
179 double precision,
intent(inout) :: potential(ixI^S)
181 double precision,
dimension(ixO^S) :: zk,bigr
184 zk(ixo^s)=x(ixo^s,3)-xprobmin3+zshift
189 bigr(ixo^s)=dsqrt((x(ixo^s,1)-
xa1(ixp1))**2+&
190 (x(ixo^s,2)-
xa2(ixp2))**2+&
192 potential(ixo^s)=potential(ixo^s)+0.5d0*
bz0(ixp1,ixp2)/bigr*
darea/dpi
subroutine mpistop(message)
Exit MPI-AMRVAC with an error message.
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer icomm
The MPI communicator.
integer mype
The rank of the current MPI task.
integer ierrmpi
A global MPI error return code.
Program to extrapolate linear force-free fields in 3D Cartesian coordinates, based on exact Green fun...
double precision, save darea
double precision, dimension(:,:), allocatable, save bz0
subroutine get_potential_field_potential(ixIL, ixOL, potential, x, zshift)
subroutine init_b_fff_data(magnetogramname, qLunit, qBunit)
double precision, dimension(:), allocatable, save xa2
subroutine calc_lin_fff(ixIL, ixOL, Bf, x, alpha, zshift, idir)
double precision, save bzmax
double precision, dimension(:), allocatable, save xa1