subroutine Lorentz_create_particles() use mod_global_parameters use mod_usr_methods, only: usr_create_particles, usr_update_payload,& usr_check_particle integer :: n, idir, igrid, ipe_particle, nparticles_local double precision :: lfac double precision :: x(3, num_particles) double precision :: v(3, num_particles) double precision :: q(num_particles) double precision :: m(num_particles) double precision :: rrd(num_particles,ndir) double precision :: defpayload(ndefpayload) double precision :: usrpayload(nusrpayload) logical :: follow(num_particles), check follow = .false. x = 0.0d0 if (mype==0) then if (.not. associated(usr_create_particles)) then ! Randomly distributed do idir=1,ndir do n = 1, num_particles rrd(n,idir) = rng%unif_01() end do end do do n=1, num_particles x(1,n) = xprobmin1 + rrd(n+1,1) * (xprobmax1 - xprobmin1) x(2,n) = xprobmin2 + rrd(n+1,2) * (xprobmax2 - xprobmin2) x(3,n) = xprobmin3 + rrd(n+1,3) * (xprobmax3 - xprobmin3) end do else call usr_create_particles(num_particles, x, v, q, m, follow) end if end if call MPI_BCAST(x,3*num_particles,MPI_DOUBLE_PRECISION,0,icomm,ierrmpi) call MPI_BCAST(v,3*num_particles,MPI_DOUBLE_PRECISION,0,icomm,ierrmpi) call MPI_BCAST(q,num_particles,MPI_DOUBLE_PRECISION,0,icomm,ierrmpi) call MPI_BCAST(m,num_particles,MPI_DOUBLE_PRECISION,0,icomm,ierrmpi) call MPI_BCAST(follow,num_particles,MPI_LOGICAL,0,icomm,ierrmpi) nparticles_local = 0 ! Find ipe and igrid responsible for particle do n = 1, num_particles call find_particle_ipe(x(:, n),igrid,ipe_particle) particle(n)%igrid = igrid particle(n)%ipe = ipe_particle if (ipe_particle == mype) then check = .true. ! Check for user-defined modifications or rejection conditions if (associated(usr_check_particle)) call usr_check_particle(igrid, x(:,& n), v(:,n), q(n), m(n), follow(n), check) if (check) then call push_particle_into_particles_on_mype(n) else cycle end if nparticles_local = nparticles_local + 1 call get_lfac_from_velocity(v(:,n), lfac) allocate(particle(n)%self) particle(n)%self%x = x(:,n) particle(n)%self%u = v(:,n) * lfac particle(n)%self%q = q(n) particle(n)%self%m = m(n) particle(n)%self%follow = follow(n) particle(n)%self%index = n particle(n)%self%time = global_time particle(n)%self%dt = 0.0d0 ! initialise payloads for Lorentz module allocate(particle(n)%payload(npayload)) call Lorentz_update_payload(igrid,x(:,n),v(:,n)*lfac,q(n),m(n),& defpayload,ndefpayload,0.d0) particle(n)%payload(1:ndefpayload) = defpayload if (associated(usr_update_payload)) then call usr_update_payload(igrid,x(:,n),v(:,n)*lfac,q(n),m(n),& usrpayload,nusrpayload,0.d0) particle(n)%payload(ndefpayload+1:npayload) = usrpayload end if end if end do call MPI_ALLREDUCE(nparticles_local,nparticles,1,MPI_INTEGER,MPI_SUM,icomm,& ierrmpi) end subroutine Lorentz_create_particles