sample_get_particle_dt Function

private function sample_get_particle_dt(partp, end_time) result(dt_p)

Uses

  • proc~~sample_get_particle_dt~~UsesGraph proc~sample_get_particle_dt sample_get_particle_dt module~mod_geometry mod_geometry proc~sample_get_particle_dt->module~mod_geometry module~mod_global_parameters mod_global_parameters proc~sample_get_particle_dt->module~mod_global_parameters module~mod_usr_methods mod_usr_methods proc~sample_get_particle_dt->module~mod_usr_methods module~mod_comm_lib mod_comm_lib module~mod_geometry->module~mod_comm_lib 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
type(particle_ptr), intent(in) :: partp
double precision, intent(in) :: end_time

Return Value double precision


Calls

proc~~sample_get_particle_dt~~CallsGraph proc~sample_get_particle_dt sample_get_particle_dt 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

Called by

proc~~sample_get_particle_dt~~CalledByGraph proc~sample_get_particle_dt sample_get_particle_dt proc~sample_integrate_particles sample_integrate_particles proc~sample_integrate_particles->proc~sample_get_particle_dt

Source Code

  function sample_get_particle_dt(partp, end_time) result(dt_p)
    use mod_global_parameters
    use mod_geometry
    use mod_usr_methods, only: usr_particle_position
    type(particle_ptr), intent(in) :: partp
    double precision, intent(in)   :: end_time
    double precision               :: dt_p
    integer                        :: ipart, iipart, nout, id
    double precision               :: tout, dt_cfl
    double precision               :: v(1:ndir), xp(3), told, tnew

    if (const_dt_particles > 0) then
      dt_p = const_dt_particles
      return
    end if

    dt_p = dtsave_particles

    ! Make sure the user-defined particle movement doesn't break communication
    if (associated(usr_particle_position)) then
      xp = partp%self%x
      told = partp%self%time
      tnew = told+dt_p
      call usr_particle_position(xp, partp%self%index, told, tnew)
      do while (.not. point_in_igrid_ghostc(xp,partp%igrid,1))
        dt_p = dt_p/10.d0
        xp = partp%self%x
        tnew = told+dt_p
        call usr_particle_position(xp, partp%self%index, told, tnew)
      end do
    end if

    ! Make sure we don't advance beyond end_time
    call limit_dt_endtime(end_time - partp%self%time, dt_p)

  end function sample_get_particle_dt