BENCH_VSH_TOR Subroutine

public subroutine BENCH_VSH_TOR(LMAX, NX, OUTUNIT)

Benchmarks VSH_TOR_ALL (batch) against looped VSH_TOR (single-mode) calls, for , swept over NX colatitude points.

LMAX N_MODES T_BATCH T_LOOP SPEEDUP (seconds per grid-point evaluation).

Arguments

Type IntentOptional Attributes Name
integer(kind=i4), intent(in) :: LMAX

Maximum degree benchmarked, .

integer(kind=i4), intent(in) :: NX

Number of colatitude points swept per timing measurement.

integer(kind=i4), intent(in) :: OUTUNIT

Fortran unit number to append one result row to:


Calls

proc~~bench_vsh_tor~~CallsGraph proc~bench_vsh_tor BENCH_VSH_TOR interface~vsh_tor VSH_TOR proc~bench_vsh_tor->interface~vsh_tor interface~vsh_tor_all VSH_TOR_ALL proc~bench_vsh_tor->interface~vsh_tor_all proc~wall_time WALL_TIME proc~bench_vsh_tor->proc~wall_time proc~vsh_tor_dp VSH_TOR_DP interface~vsh_tor->proc~vsh_tor_dp proc~vsh_tor_all_dp VSH_TOR_ALL_DP interface~vsh_tor_all->proc~vsh_tor_all_dp interface~pvsh_tor_all PVSH_TOR_ALL proc~vsh_tor_all_dp->interface~pvsh_tor_all interface~pvsh_tor PVSH_TOR proc~vsh_tor_dp->interface~pvsh_tor proc~pvsh_tor_dp PVSH_TOR_DP interface~pvsh_tor->proc~pvsh_tor_dp proc~pvsh_tor_all_dp PVSH_TOR_ALL_DP interface~pvsh_tor_all->proc~pvsh_tor_all_dp interface~vsh_core VSH_CORE proc~pvsh_tor_all_dp->interface~vsh_core proc~ylm_index YLM_INDEX proc~pvsh_tor_all_dp->proc~ylm_index dcos dcos proc~pvsh_tor_dp->dcos dsin dsin proc~pvsh_tor_dp->dsin interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~pvsh_tor_dp->interface~assoc_legendre_and_deriv interface~log_fact LOG_FACT proc~pvsh_tor_dp->interface~log_fact proc~assoc_legendre_and_deriv_dp ASSOC_LEGENDRE_AND_DERIV_DP interface~assoc_legendre_and_deriv->proc~assoc_legendre_and_deriv_dp proc~log_fact_dp LOG_FACT_DP interface~log_fact->proc~log_fact_dp proc~vsh_core_dp VSH_CORE_DP interface~vsh_core->proc~vsh_core_dp proc~assoc_legendre_and_deriv_dp->interface~log_fact proc~vsh_core_dp->dcos proc~vsh_core_dp->dsin proc~vsh_core_dp->proc~ylm_index interface~assoc_legendre_norm_all ASSOC_LEGENDRE_NORM_ALL proc~vsh_core_dp->interface~assoc_legendre_norm_all interface~ddx_assoc_legendre_norm_all DDX_ASSOC_LEGENDRE_NORM_ALL proc~vsh_core_dp->interface~ddx_assoc_legendre_norm_all proc~plm_index PLM_INDEX proc~vsh_core_dp->proc~plm_index proc~assoc_legendre_norm_all_dp ASSOC_LEGENDRE_NORM_ALL_DP interface~assoc_legendre_norm_all->proc~assoc_legendre_norm_all_dp proc~ddx_assoc_legendre_norm_all_dp DDX_ASSOC_LEGENDRE_NORM_ALL_DP interface~ddx_assoc_legendre_norm_all->proc~ddx_assoc_legendre_norm_all_dp proc~assoc_legendre_norm_all_dp->proc~plm_index proc~ddx_assoc_legendre_norm_all_dp->proc~plm_index

Called by

proc~~bench_vsh_tor~~CalledByGraph proc~bench_vsh_tor BENCH_VSH_TOR program~bench_main BENCH_MAIN program~bench_main->proc~bench_vsh_tor

Source Code

  SUBROUTINE BENCH_VSH_TOR(LMAX, NX, OUTUNIT)
  IMPLICIT NONE
  INTEGER(KIND=i4), INTENT(IN) :: LMAX
  INTEGER(KIND=i4), INTENT(IN) :: NX
  INTEGER(KIND=i4), INTENT(IN) :: OUTUNIT
  INTEGER(KIND=i4) :: L, M, IX, R, NREP, NYLM
  REAL(KIND=dp) :: THETA, PHI, DTH, T0, T1, T_BATCH, T_LOOP
  COMPLEX(KIND=dp) :: ACC
  COMPLEX(KIND=dp), ALLOCATABLE :: OUT(:,:)

  NYLM = (LMAX+1)**2
  ALLOCATE(OUT(3,NYLM))
  PHI = 0.123d0
  DTH = pi / (NX - 1)

  NREP = 1
  DO
    T0 = WALL_TIME()
    DO R = 1, NREP
      DO IX = 0, NX-1
        THETA = IX*DTH
        CALL VSH_TOR_ALL(OUT, LMAX, THETA, PHI)
      ENDDO
    ENDDO
    T1 = WALL_TIME()
    IF (T1-T0 >= MIN_TIME .OR. NREP >= NREP_CAP) EXIT
    NREP = NREP*2
  ENDDO
  T_BATCH = (T1-T0) / (NREP*NX)
  ACC = SUM(OUT)
  IF (ACC == (-1.0d300,0.d0)) WRITE(*,'(A)') ""

  IF (LMAX <= LOOP_LMAX_CAP) THEN
    NREP = 1
    DO
      ACC = DCMPLX(0.d0,0.d0)
      T0 = WALL_TIME()
      DO R = 1, NREP
        DO IX = 0, NX-1
          THETA = IX*DTH
          DO L = 0, LMAX
            DO M = -L, L
              ACC = ACC + SUM(VSH_TOR(L, M, THETA, PHI))
            ENDDO
          ENDDO
        ENDDO
      ENDDO
      T1 = WALL_TIME()
      IF (T1-T0 >= MIN_TIME .OR. NREP >= NREP_CAP) EXIT
      NREP = NREP*2
    ENDDO
    T_LOOP = (T1-T0) / (NREP*NX)
    IF (ACC == (-1.0d300,0.d0)) WRITE(*,'(A)') ""
  ELSE
    T_LOOP = -1.0_dp   !- sentinel: not measured, see LOOP_LMAX_CAP
  END IF

  IF (T_LOOP >= 0.0_dp) THEN
    WRITE(OUTUNIT,'(I6,1X,I8,1X,ES14.6,1X,ES14.6,1X,F12.3)') &
      LMAX, NYLM, T_BATCH, T_LOOP, T_LOOP/T_BATCH
  ELSE
    WRITE(OUTUNIT,'(I6,1X,I8,1X,ES14.6,1X,ES14.6,1X,F12.3)') &
      LMAX, NYLM, T_BATCH, T_LOOP, -1.0_dp
  END IF

  DEALLOCATE(OUT)
  RETURN
  END SUBROUTINE BENCH_VSH_TOR