sample_integrate_particles Subroutine

private subroutine sample_integrate_particles(end_time)

Uses

  • proc~~sample_integrate_particles~~UsesGraph proc~sample_integrate_particles sample_integrate_particles module~mod_global_parameters mod_global_parameters proc~sample_integrate_particles->module~mod_global_parameters module~mod_usr_methods mod_usr_methods proc~sample_integrate_particles->module~mod_usr_methods module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
double precision, intent(in) :: end_time

Calls

proc~~sample_integrate_particles~~CallsGraph proc~sample_integrate_particles sample_integrate_particles proc~sample_get_particle_dt sample_get_particle_dt proc~sample_integrate_particles->proc~sample_get_particle_dt proc~sample_update_payload sample_update_payload proc~sample_integrate_particles->proc~sample_update_payload proc~limit_dt_endtime limit_dt_endtime proc~sample_get_particle_dt->proc~limit_dt_endtime proc~point_in_igrid_ghostc point_in_igrid_ghostc proc~sample_get_particle_dt->proc~point_in_igrid_ghostc phys_to_conserved phys_to_conserved proc~sample_update_payload->phys_to_conserved proc~interpolate_var interpolate_var proc~sample_update_payload->proc~interpolate_var proc~mpistop mpistop proc~interpolate_var->proc~mpistop mpi_abort mpi_abort proc~mpistop->mpi_abort

Source Code

  subroutine sample_integrate_particles(end_time)
    ! this interpolates the HD/MHD quantities at the particle positions
    use mod_global_parameters
    use mod_usr_methods, only: usr_create_particles, usr_update_payload,&
        usr_particle_position
    double precision, intent(in) :: end_time

    double precision, dimension(1:ndir) :: v, x
    double precision                 :: defpayload(ndefpayload)
    double precision                 :: usrpayload(nusrpayload)
    double precision                 :: tloc, tlocnew, dt_p, h1
    double precision,parameter       :: eps=1.0d-6, hmin=1.0d-8
    integer                          :: ipart, iipart, igrid
    integer                          :: nok, nbad, ierror

    do iipart=1,nparticles_active_on_mype
      ipart                   = particles_active_on_mype(iipart);
      dt_p                    = sample_get_particle_dt(particle(ipart),&
          end_time)
      particle(ipart)%self%dt = dt_p

      igrid                   = particle(ipart)%igrid
      igrid_working           = igrid
      tloc                    = particle(ipart)%self%time
      x(1:ndir)               = particle(ipart)%self%x(1:ndir)
      tlocnew                 = tloc+dt_p

      ! Position update (if defined)
      ! TODO: this may create problems with interpolation out of boundaries
      if (associated(usr_particle_position)) call usr_particle_position(x,&
         particle(ipart)%self%index,tloc,tlocnew)
      particle(ipart)%self%x(1:ndir) = x

      ! Time update
      particle(ipart)%self%time = tlocnew

      ! Update payload
      call sample_update_payload(igrid,x,v,0.d0,0.d0,defpayload,ndefpayload,&
         tlocnew)
      particle(ipart)%payload(1:ndefpayload) = defpayload
      if (associated(usr_update_payload)) then
        call usr_update_payload(igrid,x,v,0.d0,0.d0,usrpayload,nusrpayload,&
           tlocnew)
        particle(ipart)%payload(ndefpayload+1:npayload) = usrpayload
      end if

    end do

  end subroutine sample_integrate_particles