limit_dt_endtime Subroutine

public pure subroutine limit_dt_endtime(t_left, dt_p)

Arguments

Type IntentOptional Attributes Name
double precision, intent(in) :: t_left
double precision, intent(inout) :: dt_p

Called by

proc~~limit_dt_endtime~~CalledByGraph proc~limit_dt_endtime limit_dt_endtime proc~advect_get_particle_dt advect_get_particle_dt proc~advect_get_particle_dt->proc~limit_dt_endtime proc~gca_get_particle_dt gca_get_particle_dt proc~gca_get_particle_dt->proc~limit_dt_endtime proc~lorentz_get_particle_dt Lorentz_get_particle_dt proc~lorentz_get_particle_dt->proc~limit_dt_endtime proc~sample_get_particle_dt sample_get_particle_dt proc~sample_get_particle_dt->proc~limit_dt_endtime proc~advect_integrate_particles advect_integrate_particles proc~advect_integrate_particles->proc~advect_get_particle_dt proc~gca_integrate_particles gca_integrate_particles proc~gca_integrate_particles->proc~gca_get_particle_dt proc~lorentz_integrate_particles Lorentz_integrate_particles proc~lorentz_integrate_particles->proc~lorentz_get_particle_dt proc~sample_integrate_particles sample_integrate_particles proc~sample_integrate_particles->proc~sample_get_particle_dt

Source Code

  pure subroutine limit_dt_endtime(t_left, dt_p)
    double precision, intent(in)    :: t_left
    double precision, intent(inout) :: dt_p
    double precision                :: n_steps
    double precision, parameter     :: eps = 1d-10

    n_steps = t_left / dt_p

    if (n_steps < 1+eps) then
      ! Last step
      dt_p = t_left
    else if (n_steps < 2-eps) then
      ! Divide time left over two steps, to prevent one tiny time step
      dt_p = 0.5d0 * t_left
    end if

  end subroutine limit_dt_endtime