check_fsal_cache Subroutine

private subroutine check_fsal_cache(me, t, x, f)

Compute the function at t and x, or get it from the function evaluation cache if it is there (see set_fsal_cache). This is used by all the variable-step methods for the first stage of a step. It may already be in the cache because:

  • it was the last stage of the previous step (first-same-as-last methods),
  • it was computed for the dense output of the previous step (see dense_extra_stages), or
  • the step is a repeat of a rejected step (or a step for event finding) from the same point.

If it is not in the cache, it is computed and saved in the cache.

Type Bound

rk_variable_step_class

Arguments

Type IntentOptional Attributes Name
class(rk_variable_step_class), intent(inout) :: me
real(kind=wp), intent(in) :: t
real(kind=wp), intent(in), dimension(:) :: x
real(kind=wp), intent(out), dimension(:) :: f

Calls

proc~~check_fsal_cache~~CallsGraph proc~check_fsal_cache rk_variable_step_class%check_fsal_cache proc~set_fsal_cache rk_variable_step_class%set_fsal_cache proc~check_fsal_cache->proc~set_fsal_cache f f proc~set_fsal_cache->f

Called by

proc~~check_fsal_cache~~CalledByGraph proc~check_fsal_cache rk_variable_step_class%check_fsal_cache proc~dverk65 dverk65 proc~dverk65->proc~check_fsal_cache proc~dverk78 dverk78 proc~dverk78->proc~check_fsal_cache proc~rkb109 rkb109 proc~rkb109->proc~check_fsal_cache proc~rkbs32 rkbs32 proc~rkbs32->proc~check_fsal_cache proc~rkbs54 rkbs54 proc~rkbs54->proc~check_fsal_cache proc~rkc108 rkc108 proc~rkc108->proc~check_fsal_cache proc~rkc65 rkc65 proc~rkc65->proc~check_fsal_cache proc~rkck54 rkck54 proc~rkck54->proc~check_fsal_cache proc~rkdp54 rkdp54 proc~rkdp54->proc~check_fsal_cache proc~rkdp65 rkdp65 proc~rkdp65->proc~check_fsal_cache proc~rkdp85 rkdp85 proc~rkdp85->proc~check_fsal_cache proc~rkdp87 rkdp87 proc~rkdp87->proc~check_fsal_cache proc~rkev87 rkev87 proc~rkev87->proc~check_fsal_cache proc~rkf108 rkf108 proc~rkf108->proc~check_fsal_cache proc~rkf1210 rkf1210 proc~rkf1210->proc~check_fsal_cache proc~rkf1412 rkf1412 proc~rkf1412->proc~check_fsal_cache proc~rkf45 rkf45 proc~rkf45->proc~check_fsal_cache proc~rkf78 rkf78 proc~rkf78->proc~check_fsal_cache proc~rkf89 rkf89 proc~rkf89->proc~check_fsal_cache proc~rkk87 rkk87 proc~rkk87->proc~check_fsal_cache proc~rko129 rko129 proc~rko129->proc~check_fsal_cache proc~rkpp54 rkpp54 proc~rkpp54->proc~check_fsal_cache proc~rkpp54b rkpp54b proc~rkpp54b->proc~check_fsal_cache proc~rks1110a rks1110a proc~rks1110a->proc~check_fsal_cache proc~rks54 rks54 proc~rks54->proc~check_fsal_cache proc~rks98 rks98 proc~rks98->proc~check_fsal_cache proc~rkss54 rkss54 proc~rkss54->proc~check_fsal_cache proc~rkss76 rkss76 proc~rkss76->proc~check_fsal_cache proc~rkssp43 rkssp43 proc~rkssp43->proc~check_fsal_cache proc~rkt54 rkt54 proc~rkt54->proc~check_fsal_cache proc~rkt98a rkt98a proc~rkt98a->proc~check_fsal_cache proc~rktf65 rktf65 proc~rktf65->proc~check_fsal_cache proc~rktmy7 rktmy7 proc~rktmy7->proc~check_fsal_cache proc~rktmy7s rktmy7s proc~rktmy7s->proc~check_fsal_cache proc~rktp64 rktp64 proc~rktp64->proc~check_fsal_cache proc~rktp75 rktp75 proc~rktp75->proc~check_fsal_cache proc~rktp86 rktp86 proc~rktp86->proc~check_fsal_cache proc~rkv65 rkv65 proc~rkv65->proc~check_fsal_cache proc~rkv65e rkv65e proc~rkv65e->proc~check_fsal_cache proc~rkv65r rkv65r proc~rkv65r->proc~check_fsal_cache proc~rkv76e rkv76e proc~rkv76e->proc~check_fsal_cache proc~rkv76r rkv76r proc~rkv76r->proc~check_fsal_cache proc~rkv78 rkv78 proc~rkv78->proc~check_fsal_cache proc~rkv87e rkv87e proc~rkv87e->proc~check_fsal_cache proc~rkv87r rkv87r proc~rkv87r->proc~check_fsal_cache proc~rkv89 rkv89 proc~rkv89->proc~check_fsal_cache proc~rkv98e rkv98e proc~rkv98e->proc~check_fsal_cache proc~rkv98r rkv98r proc~rkv98r->proc~check_fsal_cache

Source Code

    subroutine check_fsal_cache(me,t,x,f)
        class(rk_variable_step_class),intent(inout) :: me
        real(wp),intent(in) :: t
        real(wp),dimension(:),intent(in)  :: x
        real(wp),dimension(:),intent(out) :: f

        logical :: fsal !! if we can avoid a step due to first-same-as-last

        fsal = .false.
        if (allocated(me%x_saved)) then
            if (size(x) == size(me%x_saved)) then
                fsal = all(x==me%x_saved) .and. t==me%t_saved
            end if
        end if
        if (fsal) then
            f = me%f_saved
        else
            call me%set_fsal_cache(t, x, f)
        end if

    end subroutine check_fsal_cache