BENCH_VSH_POL_UP Subroutine

public subroutine BENCH_VSH_POL_UP(LMAX, NX, OUTUNIT)

Benchmarks VSH_POL_UP_ALL (batch) against looped VSH_POL_UP (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_pol_up~~CallsGraph proc~bench_vsh_pol_up BENCH_VSH_POL_UP interface~vsh_pol_up VSH_POL_UP proc~bench_vsh_pol_up->interface~vsh_pol_up interface~vsh_pol_up_all VSH_POL_UP_ALL proc~bench_vsh_pol_up->interface~vsh_pol_up_all proc~wall_time WALL_TIME proc~bench_vsh_pol_up->proc~wall_time proc~vsh_pol_up_dp VSH_POL_UP_DP interface~vsh_pol_up->proc~vsh_pol_up_dp proc~vsh_pol_up_all_dp VSH_POL_UP_ALL_DP interface~vsh_pol_up_all->proc~vsh_pol_up_all_dp interface~vsh_core VSH_CORE proc~vsh_pol_up_all_dp->interface~vsh_core proc~ylm_index YLM_INDEX proc~vsh_pol_up_all_dp->proc~ylm_index dcos dcos proc~vsh_pol_up_dp->dcos dsin dsin proc~vsh_pol_up_dp->dsin interface~assoc_legendre_and_deriv ASSOC_LEGENDRE_AND_DERIV proc~vsh_pol_up_dp->interface~assoc_legendre_and_deriv interface~log_fact LOG_FACT proc~vsh_pol_up_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_pol_up~~CalledByGraph proc~bench_vsh_pol_up BENCH_VSH_POL_UP program~bench_main BENCH_MAIN program~bench_main->proc~bench_vsh_pol_up

Source Code

  SUBROUTINE BENCH_VSH_POL_UP(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_POL_UP_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_POL_UP(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_POL_UP