LCOV - code coverage report
Current view: top level - src/elpa2/kernels - mod_single_hh_trafo_real.F90 (source / functions) Hit Total Coverage
Test: coverage_50ab7a7628bba174fc62cee3ab72b26e81f87fe5.info Lines: 22 22 100.0 %
Date: 2018-01-10 09:29:53 Functions: 4 4 100.0 %

          Line data    Source code
       1             : module single_hh_trafo_real
       2             :   implicit none
       3             : #include "config-f90.h"
       4             : 
       5             : #ifdef WITH_OPENMP
       6             :   public single_hh_trafo_real_cpu_openmp_double
       7             : #else
       8             :   public single_hh_trafo_real_cpu_double
       9             : #endif
      10             : 
      11             : #ifdef WANT_SINGLE_PRECISION_REAL
      12             : 
      13             : #ifdef WITH_OPENMP
      14             :   public single_hh_trafo_real_cpu_openmp_single
      15             : #else
      16             :   public single_hh_trafo_real_cpu_single
      17             : #endif
      18             : 
      19             : #endif
      20             : 
      21             :   contains
      22             : 
      23             : #ifdef WITH_OPENMP
      24       72192 :     subroutine single_hh_trafo_real_cpu_openmp_double(q, hh, nb, nq, ldq)
      25             : #else
      26       72192 :     subroutine single_hh_trafo_real_cpu_double(q, hh, nb, nq, ldq)
      27             : #endif
      28             : 
      29             :       use elpa_abstract_impl
      30             :       use precision
      31             :       ! Perform single real Householder transformation.
      32             :       ! This routine is not performance critical and thus it is coded here in Fortran
      33             : 
      34             :       implicit none
      35             :  !     class(elpa_abstract_impl_t), intent(inout) :: obj
      36             : 
      37             :       integer(kind=ik), intent(in)   :: nb, nq, ldq
      38             : !      real(kind=rk8), intent(inout)   :: q(ldq, *)
      39             : !      real(kind=rk8), intent(in)      :: hh(*)
      40             :       real(kind=rk8), intent(inout)   :: q(1:ldq, 1:nb)
      41             :       real(kind=rk8), intent(in)      :: hh(1:nb)
      42             :       integer(kind=ik)               :: i
      43      288768 :       real(kind=rk8)                  :: v(nq)
      44             : 
      45             : !#ifdef WITH_OPENMP
      46             : !      call obj%timer%start("single_hh_trafo_real_cpu_openmp_double")
      47             : !#else
      48             : !      call obj%timer%start("single_hh_trafo_real_cpu_double")
      49             : !#endif
      50             : 
      51             :       ! v = q * hh
      52      144384 :       v(:) = q(1:nq,1)
      53     8798208 :       do i=2,nb
      54     8653824 :         v(:) = v(:) + q(1:nq,i) * hh(i)
      55             :       enddo
      56             : 
      57             :       ! v = v * tau
      58      144384 :       v(:) = v(:) * hh(1)
      59             : 
      60             :       ! q = q - v * hh**T
      61      144384 :       q(1:nq,1) = q(1:nq,1) - v(:)
      62     8798208 :       do i=2,nb
      63     8653824 :         q(1:nq,i) = q(1:nq,i) - v(:) * hh(i)
      64             :       enddo
      65             : 
      66             : !#ifdef WITH_OPENMP
      67             : !      call obj%timer%stop("single_hh_trafo_real_cpu_openmp_double")
      68             : !#else
      69             : !      call obj%timer%stop("single_hh_trafo_real_cpu_double")
      70             : !#endif
      71      144384 :     end subroutine
      72             : 
      73             : #ifdef WANT_SINGLE_PRECISION_REAL
      74             : ! single precision implementation at the moment duplicated !!!
      75             : 
      76             : #ifdef WITH_OPENMP
      77       14080 :     subroutine single_hh_trafo_real_cpu_openmp_single(q, hh, nb, nq, ldq)
      78             : #else
      79       14080 :     subroutine single_hh_trafo_real_cpu_single(q, hh, nb, nq, ldq)
      80             : #endif
      81             : 
      82             :       use elpa_abstract_impl
      83             :       use precision
      84             :       ! Perform single real Householder transformation.
      85             :       ! This routine is not performance critical and thus it is coded here in Fortran
      86             : 
      87             :       implicit none
      88             :       !class(elpa_abstract_impl_t), intent(inout) :: obj
      89             : 
      90             :       integer(kind=ik), intent(in)   :: nb, nq, ldq
      91             : !      real(kind=rk4), intent(inout)   :: q(ldq, *)
      92             : !      real(kind=rk4), intent(in)      :: hh(*)
      93             :       real(kind=rk4), intent(inout)   :: q(1:ldq, 1:nb)
      94             :       real(kind=rk4), intent(in)      :: hh(1:nb)
      95             :       integer(kind=ik)               :: i
      96       56320 :       real(kind=rk4)                  :: v(nq)
      97             : 
      98             : !#ifdef WITH_OPENMP
      99             : !      call obj%timer%start("single_hh_trafo_real_cpu_openmp_single")
     100             : !#else
     101             : !      call obj%timer%start("single_hh_trafo_real_cpu_single")
     102             : !#endif
     103             : 
     104             :       ! v = q * hh
     105       28160 :       v(:) = q(1:nq,1)
     106     1691648 :       do i=2,nb
     107     1663488 :         v(:) = v(:) + q(1:nq,i) * hh(i)
     108             :       enddo
     109             : 
     110             :       ! v = v * tau
     111       28160 :       v(:) = v(:) * hh(1)
     112             : 
     113             :       ! q = q - v * hh**T
     114       28160 :       q(1:nq,1) = q(1:nq,1) - v(:)
     115     1691648 :       do i=2,nb
     116     1663488 :         q(1:nq,i) = q(1:nq,i) - v(:) * hh(i)
     117             :       enddo
     118             : 
     119             : !#ifdef WITH_OPENMP
     120             : !      call obj%timer%stop("single_hh_trafo_real_cpu_openmp_single")
     121             : !#else
     122             : !      call obj%timer%stop("single_hh_trafo_real_cpu_single")
     123             : !#endif
     124       28160 :     end subroutine
     125             : 
     126             : 
     127             : #endif /* WANT_SINGLE_PRECISION_REAL */
     128             : end module

Generated by: LCOV version 1.12