10 integer,
parameter :: Euler = 1, rk4=2, ark4=3
41 case(
'RK4',
'Rk4',
'rk4')
43 case(
'ARK4',
'ARk4',
'Ark4',
'ark4')
63 double precision :: w(ixg^t,1:nw)
66 integer :: n, idir, igrid, ipe_particle, nparticles_local
80 rrd(n,idir) =
rng%unif_01()
84 {^
d&x(^
d,n) = xprobmin^
d + rrd(n,^
d) * (xprobmax^
d - xprobmin^
d)\}
105 if(ipe_particle ==
mype)
then
116 nparticles_local = nparticles_local + 1
128 call phys_to_primitive(ixg^
ll,ixg^
ll,w,ps(igrid)%x)
131 w(ixg^t,iw_mom(idir)),ps(igrid)%x,x(:,n),v(idir,n))
139 call advect_update_payload(igrid,x(:,n),v(:,n),q(n),m(n),defpayload,
ndefpayload,0.d0)
159 subroutine advect_fill_gridvars
162 double precision,
dimension(ixG^T,1:nw) :: w
163 integer :: igrid, iigrid, idir
166 do iigrid=1,igridstail; igrid=igrids(iigrid);
167 gridvars(igrid)%w(ixg^t,1:
ngridvars) = 0.0d0
168 w(ixg^t,1:nw) = ps(igrid)%w(ixg^t,1:nw)
169 call phys_to_primitive(ixg^
ll,ixg^
ll,w,ps(igrid)%x)
170 gridvars(igrid)%w(ixg^t,
vp(:)) = w(ixg^t,iw_mom(:))
171 gridvars(igrid)%w(ixg^t,
rhop) = w(ixg^t,iw_rho)
174 end subroutine advect_fill_gridvars
176 subroutine advect_integrate_particles(end_time)
181 double precision,
intent(in) :: end_time
183 double precision,
dimension(1:ndir) :: v, x
186 double precision :: tloc, tlocnew, dt_p, h1, tk
187 double precision,
dimension(1:ndir) :: yk, k1, k2, k3, k4
188 double precision,
parameter :: eps=1.0
d-6, hmin=1.0
d-8
189 integer :: ipart, iipart, igrid
190 integer :: nok, nbad, ierror
196 dt_p = advect_get_particle_dt(
particle(ipart), end_time)
207 call derivs_advect(tloc,x,v)
214 call derivs_advect(tk,yk,k1)
215 tk = tloc + dt_p/2.d0
216 yk = x + dt_p*k1/2.d0
217 call derivs_advect(tk,yk,k2)
218 tk = tloc + dt_p/2.d0
219 yk = x + dt_p*k2/2.d0
220 call derivs_advect(tk,yk,k3)
223 call derivs_advect(tloc,yk,k4)
224 x = x + dt_p/6.d0*(k1 + 2.d0*k2 + 2.d0*k3 + k4)
229 call odeint(x,
ndir,tloc,tlocnew,eps,h1,hmin,nok,nbad,derivs_advect,
rkqs,ierror)
231 if (ierror /= 0)
then
232 print *,
"odeint returned error code", ierror
233 print *,
"1 means hmin too small, 2 means MAXSTP exceeded"
234 print *,
"Having a problem with particle", iipart
240 call get_vec_advect(igrid,x,tlocnew,v,
vp(1),
vp(
ndir))
248 call advect_update_payload(igrid,x,v,0.d0,0.d0,defpayload,
ndefpayload,tlocnew)
258 end subroutine advect_integrate_particles
261 subroutine advect_update_payload(igrid,xpart,upart,qpart,mpart,mypayload,mynpayload,particle_time)
263 integer,
intent(in) :: igrid,mynpayload
264 double precision,
intent(in) :: xpart(1:
ndir),upart(1:
ndir),qpart,mpart,particle_time
265 double precision,
intent(out) :: mypayload(mynpayload)
266 double precision :: rho, rho1, rho2, td
271 if (mynpayload > 0 )
then
275 rho = rho1 * (1.0d0 - td) + rho2 * td
282 end subroutine advect_update_payload
284 subroutine derivs_advect(t_s,x,dxdt)
287 double precision :: t_s, x(
ndir)
288 double precision :: dxdt(
ndir)
290 double precision :: v(
ndir)
298 v(3) = v(3)/(x(1)*sin(x(2)))
302 end subroutine derivs_advect
304 function advect_get_particle_dt(partp, end_time)
result(dt_p)
307 double precision,
intent(in) :: end_time
308 double precision :: dt_p
309 double precision :: v(1:
ndir),dtdims(1:
ndim)
310 integer :: ipart, iipart, idims
318 call derivs_advect(partp%self%time,partp%self%x,v)
320 dtdims(idims)=minval(ps(partp%igrid)%ds(
ixm^t,idims))/(max(abs(v(idims)),smalldouble))
328 end function advect_get_particle_dt
330 subroutine get_vec_advect(igrid,x,tloc,var,ibeg,iend)
333 integer,
intent(in) :: igrid, ibeg, iend
334 double precision,
dimension(ndir),
intent(in) :: x
335 double precision,
intent(in) :: tloc
336 double precision,
dimension(iend-ibeg+1),
intent(out) :: var
337 double precision,
dimension(iend-ibeg+1) :: e1, e2
338 double precision :: td
339 integer :: ivar, iloc
352 var(iloc) = e1(iloc) * (1.0d0 - td) + e2(iloc) * td
356 end subroutine get_vec_advect
Module with geometry-related routines (e.g., divergence, curl).
integer, parameter spherical
integer, parameter cylindrical
This module contains definitions of global parameters and variables and some generic functions/subrou...
double precision, dimension(:), allocatable w_convert_factor
Conversion factors the primitive variables.
double precision global_time
The global simulation time.
integer, parameter ndim
Number of spatial dimensions for grid variables.
integer icomm
The MPI communicator.
integer mype
The rank of the current MPI task.
double precision dt
global time step
integer ndir
Number of spatial dimensions (components) for vector variables.
integer ixm
the mesh range of a physical block without ghost cells
integer ierrmpi
A global MPI error return code.
double precision, dimension(:), allocatable, parameter d
logical time_advance
do time evolving
integer r_
Indices for cylindrical coordinates FOR TESTS, negative value when not used:
This module packages odeint from numerical recipes.
subroutine odeint(ystart, nvar, x1, x2, eps, h1, hmin, nok, nbad, derivs, rkqs, ierror)
subroutine rkqs(y, dydx, n, x, htry, eps, yscal, hdid, hnext, derivs)
Tracer for advected particles moving with fluid flows By Jannis Teunissen, Bart Ripperda,...
subroutine, public advect_init()
subroutine, public advect_create_particles()
Module with shared functionality for all the particle movers.
pure subroutine limit_dt_endtime(t_left, dt_p)
integer num_particles
Number of particles.
double precision const_dt_particles
If positive, a constant time step for the particles.
subroutine write_particle_output()
double precision dtsave_particles
Time interval to save particles.
integer ngridvars
Number of variables for grid field.
integer nusrpayload
Number of user-defined payload variables for a particle.
subroutine find_particle_ipe(x, igrid_particle, ipe_particle)
integer integrator
Integrator to be used for particles.
integer npayload
Number of total payload variables for a particle.
integer, dimension(:), allocatable particles_active_on_mype
Array of identity numbers of active particles in current processor.
character(len=name_len) integrator_type_particles
String describing the particle integrator type.
subroutine push_particle_into_particles_on_mype(ipart)
integer nparticles_active_on_mype
Number of active particles in current processor.
procedure(sub_define_additional_gridvars), pointer particles_define_additional_gridvars
integer nparticles
Identity number and total number of particles.
type(particle_ptr), dimension(:), allocatable particle
integer, dimension(:), allocatable vp
Variable index for fluid velocity.
procedure(sub_integrate), pointer particles_integrate
procedure(sub_fill_gridvars), pointer particles_fill_gridvars
double precision t_next_output
Time to write next particle output.
integer ndefpayload
Number of default payload variables for a particle.
integer igrid_working
set the current igrid for the particle integrator:
subroutine interpolate_var(igrid, ixil, ixol, gf, x, xloc, gfloc)
double precision particles_cfl
Particle CFL safety factor.
integer rhop
Variable index for density.
Module with all the methods that users can customize in AMRVAC.
procedure(check_particle), pointer usr_check_particle
procedure(create_particles), pointer usr_create_particles
procedure(update_payload), pointer usr_update_payload