LCOV - code coverage report
Current view: top level - src/elpa2/kernels - complex_template.F90 (source / functions) Hit Total Coverage
Test: coverage_50ab7a7628bba174fc62cee3ab72b26e81f87fe5.info Lines: 170 492 34.6 %
Date: 2018-01-10 09:29:53 Functions: 16 32 50.0 %

          Line data    Source code
       1             : #if 0
       2             : !    This file is part of ELPA.
       3             : !
       4             : !    The ELPA library was originally created by the ELPA consortium,
       5             : !    consisting of the following organizations:
       6             : !
       7             : !    - Max Planck Computing and Data Facility (MPCDF), formerly known as
       8             : !      Rechenzentrum Garching der Max-Planck-Gesellschaft (RZG),
       9             : !    - Bergische Universität Wuppertal, Lehrstuhl für angewandte
      10             : !      Informatik,
      11             : !    - Technische Universität München, Lehrstuhl für Informatik mit
      12             : !      Schwerpunkt Wissenschaftliches Rechnen ,
      13             : !    - Fritz-Haber-Institut, Berlin, Abt. Theorie,
      14             : !    - Max-Plack-Institut für Mathematik in den Naturwissenschaften,
      15             : !      Leipzig, Abt. Komplexe Strukutren in Biologie und Kognition,
      16             : !      and
      17             : !    - IBM Deutschland GmbH
      18             : !
      19             : !
      20             : !    More information can be found here:
      21             : !    http://elpa.mpcdf.mpg.de/
      22             : !
      23             : !    ELPA is free software: you can redistribute it and/or modify
      24             : !    it under the terms of the version 3 of the license of the
      25             : !    GNU Lesser General Public License as published by the Free
      26             : !    Software Foundation.
      27             : !
      28             : !    ELPA is distributed in the hope that it will be useful,
      29             : !    but WITHOUT ANY WARRANTY; without even the implied warranty of
      30             : !    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      31             : !    GNU Lesser General Public License for more details.
      32             : !
      33             : !    You should have received a copy of the GNU Lesser General Public License
      34             : !    along with ELPA.  If not, see <http://www.gnu.org/licenses/>
      35             : !
      36             : !    ELPA reflects a substantial effort on the part of the original
      37             : !    ELPA consortium, and we ask you to respect the spirit of the
      38             : !    license that we chose: i.e., please contribute any changes you
      39             : !    may have back to the original ELPA library distribution, and keep
      40             : !    any derivatives of ELPA under the same license that we chose for
      41             : !    the original distribution, the GNU Lesser General Public License.
      42             : !
      43             : !
      44             : ! --------------------------------------------------------------------------------------------------
      45             : !
      46             : ! This file contains the compute intensive kernels for the Householder transformations.
      47             : ! It should be compiled with the highest possible optimization level.
      48             : !
      49             : ! On Intel use -O3 -xSSE4.2 (or the SSE level fitting to your CPU)
      50             : !
      51             : ! Copyright of the original code rests with the authors inside the ELPA
      52             : ! consortium. The copyright of any additional modifications shall rest
      53             : ! with their original authors, but shall adhere to the licensing terms
      54             : ! distributed along with the original code in the file "COPYING".
      55             : !
      56             : ! --------------------------------------------------------------------------------------------------
      57             : #endif
      58             : 
      59             :   ! the Intel compiler creates a temp array copy of array q!
      60             :   ! this should be prevented, if possible without using assumed size arrays
      61             : #ifdef DOUBLE_PRECISION_COMPLEX
      62     1320960 :   subroutine single_hh_trafo_complex_generic_double(q, hh, nb, nq, ldq)
      63             : #else
      64      660480 :   subroutine single_hh_trafo_complex_generic_single(q, hh, nb, nq, ldq)
      65             : #endif
      66             :     use precision
      67             :     use elpa_abstract_impl
      68             :     implicit none
      69             : 
      70             :  !   class(elpa_abstract_impl_t), intent(inout) :: obj
      71             :     integer(kind=ik), intent(in)    :: nb, nq, ldq
      72             : #ifdef USE_ASSUMED_SIZE
      73             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
      74             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(*)
      75             : #else
      76             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(1:ldq,1:nb)
      77             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:nb)
      78             : #endif
      79             : 
      80             :     integer(kind=ik)                :: i
      81             : 
      82             : !#ifdef DOUBLE_PRECISION_COMPLEX
      83             : !
      84             : !      call obj%timer%start("kernel generic: single_hh_trafo_complex_generic_double")
      85             : !
      86             : !#else
      87             : !
      88             : !      call obj%timer%start("kernel generic: single_hh_trafo_complex_generic_single")
      89             : !
      90             : !#endif
      91             :     ! Safety only:
      92             : 
      93     1981440 :     if(mod(ldq,4) /= 0) STOP 'double_hh_trafo: ldq not divisible by 4!'
      94             : 
      95             :     ! Do the Householder transformations
      96             : 
      97             :     ! Always a multiple of 4 Q-rows is transformed, even if nq is smaller
      98             : 
      99     7430400 :     do i=1,nq-8,12
     100             : #ifdef DOUBLE_PRECISION_COMPLEX
     101             : 
     102             : #ifdef USE_ASSUMED_SIZE
     103     1816320 :        call hh_trafo_complex_kernel_12_double(q(i,1),hh, nb, ldq)
     104             : #else
     105     1816320 :        call hh_trafo_complex_kernel_12_double(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     106             : #endif
     107             : 
     108             : #else
     109             : 
     110             : #ifdef USE_ASSUMED_SIZE
     111      908160 :        call hh_trafo_complex_kernel_12_single(q(i,1),hh, nb, ldq)
     112             : #else
     113      908160 :        call hh_trafo_complex_kernel_12_single(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     114             : #endif
     115             : 
     116             : #endif
     117             :     enddo
     118             : 
     119             :     ! i > nq-8 now, i.e. at most 8 rows remain
     120             : 
     121     1981440 :     if(nq-i+1 > 4) then
     122             : #ifdef DOUBLE_PRECISION_COMPLEX
     123             : 
     124             : #ifdef USE_ASSUMED_SIZE
     125      165120 :        call hh_trafo_complex_kernel_8_double(q(i,1),hh, nb, ldq)
     126             : #else
     127      165120 :        call hh_trafo_complex_kernel_8_double(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     128             : #endif
     129             : 
     130             : #else
     131             : 
     132             : #ifdef USE_ASSUMED_SIZE
     133       82560 :        call hh_trafo_complex_kernel_8_single(q(i,1),hh, nb, ldq)
     134             : #else
     135       82560 :        call hh_trafo_complex_kernel_8_single(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     136             : #endif
     137             : 
     138             : #endif
     139     1486080 :     else if(nq-i+1 > 0) then
     140             : #ifdef DOUBLE_PRECISION_COMPLEX
     141             : 
     142             : #ifdef USE_ASSUMED_SIZE
     143      495360 :        call hh_trafo_complex_kernel_4_double(q(i,1),hh, nb, ldq)
     144             : #else
     145      495360 :        call hh_trafo_complex_kernel_4_double(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     146             : #endif
     147             : 
     148             : #else
     149             : 
     150             : #ifdef USE_ASSUMED_SIZE
     151      247680 :        call hh_trafo_complex_kernel_4_single(q(i,1),hh, nb, ldq)
     152             : #else
     153      247680 :        call hh_trafo_complex_kernel_4_single(q(i:ldq,1:nb),hh(1:nb), nb, ldq)
     154             : #endif
     155             : 
     156             : #endif
     157             :     endif
     158             : 
     159             : !#ifdef DOUBLE_PRECISION_COMPLEX
     160             : !
     161             : !      call obj%timer%stop("kernel generic: single_hh_trafo_complex_generic_double")
     162             : !
     163             : !#else
     164             : !
     165             : !      call obj%timer%stop("kernel generic: single_hh_trafo_complex_generic_single")
     166             : !
     167             : !#endif
     168             : 
     169             : #ifdef DOUBLE_PRECISION_COMPLEX
     170     1320960 :   end subroutine single_hh_trafo_complex_generic_double
     171             : #else
     172      660480 :   end subroutine single_hh_trafo_complex_generic_single
     173             : #endif
     174             :   ! --------------------------------------------------------------------------------------------------
     175             : 
     176             : #ifdef DOUBLE_PRECISION_COMPLEX
     177           0 :   subroutine double_hh_trafo_complex_generic_double(q, hh, nb, nq, ldq, ldh)
     178             : #else
     179           0 :   subroutine double_hh_trafo_complex_generic_single(q, hh, nb, nq, ldq, ldh)
     180             : #endif
     181             :     use precision
     182             :     implicit none
     183             : 
     184             :     integer(kind=ik), intent(in)    :: nb, nq, ldq, ldh
     185             : #ifdef USE_ASSUMED_SIZE
     186             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     187             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(ldh,*)
     188             : #else
     189             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(1:ldq,1:nb+1)
     190             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:ldh,1:2)
     191             : #endif
     192             :     complex(kind=COMPLEX_DATATYPE)                :: s
     193             : 
     194             :     integer(kind=ik)                 :: i
     195             : 
     196             :     ! Safety only:
     197             : #ifdef DOUBLE_PRECISION_COMPLEX
     198             : 
     199             :  !     call obj%timer%start("kernel generic: double_hh_trafo_complex_generic_double")
     200             : 
     201             : #else
     202             : 
     203             :   !    call obj%timer%start("kernel generic: double_hh_trafo_complex_generic_single")
     204             : 
     205             : #endif
     206           0 :     if(mod(ldq,4) /= 0) STOP 'double_hh_trafo: ldq not divisible by 4!'
     207             : 
     208             :     ! Calculate dot product of the two Householder vectors
     209             : 
     210           0 :     s = conjg(hh(2,2)*1)
     211           0 :     do i=3,nb
     212           0 :        s = s+(conjg(hh(i,2))*hh(i-1,1))
     213             :     enddo
     214             : 
     215             :     ! Do the Householder transformations
     216             : 
     217             :     ! Always a multiple of 4 Q-rows is transformed, even if nq is smaller
     218             : 
     219           0 :     do i=1,nq,4
     220             : #ifdef DOUBLE_PRECISION_COMPLEX
     221             : 
     222             : #ifdef USE_ASSUMED_SIZE
     223           0 :        call hh_trafo_complex_kernel_4_2hv_double(q(i,1),hh, nb, ldq, ldh, s)
     224             : #else
     225           0 :        call hh_trafo_complex_kernel_4_2hv_double(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     226             : #endif
     227             : 
     228             : #else
     229             : 
     230             : #ifdef USE_ASSUMED_SIZE
     231           0 :        call hh_trafo_complex_kernel_4_2hv_single(q(i,1),hh, nb, ldq, ldh, s)
     232             : #else
     233           0 :        call hh_trafo_complex_kernel_4_2hv_single(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     234             : #endif
     235             : 
     236             : #endif
     237             :     enddo
     238             : 
     239             :     !do i=1,nq-8,12
     240             : #ifdef DOUBLE_PRECISION_COMPLEX
     241             : 
     242             : #ifdef USE_ASSUMED_SIZE
     243             :     !   call hh_trafo_complex_kernel_12_2hv(q(i,1),hh, nb, ldq, ldh, s)
     244             : #else
     245             :     !   call hh_trafo_complex_kernel_12_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     246             : #endif
     247             : 
     248             : #else
     249             : 
     250             : #ifdef USE_ASSUMED_SIZE
     251             :     !   call hh_trafo_complex_kernel_12_2hv(q(i,1),hh, nb, ldq, ldh, s)
     252             : #else
     253             :     !   call hh_trafo_complex_kernel_12_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     254             : #endif
     255             : 
     256             : #endif
     257             :     !enddo
     258             : 
     259             :     ! i > nq-8 now, i.e. at most 8 rows remain
     260             : 
     261             :     !if(nq-i+1 > 4) then
     262             : #ifdef DOUBLE_PRECISION_COMPLEX
     263             : 
     264             : #ifdef USE_ASSUMED_SIZE
     265             :     !   call hh_trafo_complex_kernel_8_2hv(q(i,1),hh, nb, ldq, ldh, s)
     266             : #else
     267             :     !   call hh_trafo_complex_kernel_8_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     268             : #endif
     269             : 
     270             : #else
     271             : 
     272             : #ifdef USE_ASSUMED_SIZE
     273             :     !   call hh_trafo_complex_kernel_8_2hv(q(i,1),hh, nb, ldq, ldh, s)
     274             : #else
     275             :     !   call hh_trafo_complex_kernel_8_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     276             : #endif
     277             : 
     278             : #endif
     279             :     !else if(nq-i+1 > 0) then
     280             : #ifdef DOUBLE_PRECISION_COMPLEX
     281             : 
     282             : #ifdef USE_ASSUMED_SIZE
     283             :     !   call hh_trafo_complex_kernel_4_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     284             : #else
     285             : 
     286             : #endif
     287             : 
     288             : #else
     289             : 
     290             : #ifdef USE_ASSUMED_SIZE
     291             :     !   call hh_trafo_complex_kernel_4_2hv(q(i:ldq,1:nb+1),hh(1:ldh,1:2), nb, ldq, ldh, s)
     292             : #else
     293             : 
     294             : #endif
     295             : 
     296             : #endif
     297             :     !endif
     298             : 
     299             : #ifdef DOUBLE_PRECISION_COMPLEX
     300             : 
     301             :  !     call obj%timer%stop("kernel generic: double_hh_trafo_complex_generic_double")
     302             : 
     303             : #else
     304             : 
     305             :   !    call obj%timer%stop("kernel generic: double_hh_trafo_complex_generic_single")
     306             : 
     307             : #endif
     308             : 
     309             : #ifdef DOUBLE_PRECISION_COMPLEX
     310           0 :   end subroutine double_hh_trafo_complex_generic_double
     311             : #else
     312           0 :   end subroutine double_hh_trafo_complex_generic_single
     313             : #endif
     314             :   ! --------------------------------------------------------------------------------------------------
     315             : 
     316             : #ifdef DOUBLE_PRECISION_COMPLEX
     317     3632640 :   subroutine hh_trafo_complex_kernel_12_double(q, hh, nb, ldq)
     318             : #else
     319     1816320 :   subroutine hh_trafo_complex_kernel_12_single(q, hh, nb, ldq)
     320             : #endif
     321             :     use precision
     322             :     implicit none
     323             : 
     324             :     integer(kind=ik), intent(in)    :: nb, ldq
     325             : #ifdef USE_ASSUMED_SIZE
     326             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     327             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(*)
     328             : #else
     329             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     330             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:nb)
     331             : #endif
     332             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc
     333             :     complex(kind=COMPLEX_DATATYPE)                :: h1, tau1
     334             :     integer(kind=ik)                :: i
     335             : 
     336             : #ifdef DOUBLE_PRECISION_COMPLEX
     337             : 
     338             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_12_double")
     339             : 
     340             : #else
     341             : 
     342             :   !    call obj%timer%start("kernel generic: hh_trafo_complex_kernel_12_single")
     343             : 
     344             : #endif
     345     5448960 :     x1 = q(1,1)
     346     5448960 :     x2 = q(2,1)
     347     5448960 :     x3 = q(3,1)
     348     5448960 :     x4 = q(4,1)
     349     5448960 :     x5 = q(5,1)
     350     5448960 :     x6 = q(6,1)
     351     5448960 :     x7 = q(7,1)
     352     5448960 :     x8 = q(8,1)
     353     5448960 :     x9 = q(9,1)
     354     5448960 :     xa = q(10,1)
     355     5448960 :     xb = q(11,1)
     356     5448960 :     xc = q(12,1)
     357             : 
     358             :     !DEC$ VECTOR ALIGNED
     359   174366720 :     do i=2,nb
     360   168917760 :        h1 = conjg(hh(i))
     361   168917760 :        x1 = x1 + q(1,i)*h1
     362   168917760 :        x2 = x2 + q(2,i)*h1
     363   168917760 :        x3 = x3 + q(3,i)*h1
     364   168917760 :        x4 = x4 + q(4,i)*h1
     365   168917760 :        x5 = x5 + q(5,i)*h1
     366   168917760 :        x6 = x6 + q(6,i)*h1
     367   168917760 :        x7 = x7 + q(7,i)*h1
     368   168917760 :        x8 = x8 + q(8,i)*h1
     369   168917760 :        x9 = x9 + q(9,i)*h1
     370   168917760 :        xa = xa + q(10,i)*h1
     371   168917760 :        xb = xb + q(11,i)*h1
     372   168917760 :        xc = xc + q(12,i)*h1
     373             :     enddo
     374             : 
     375     5448960 :     tau1 = hh(1)
     376             : 
     377     5448960 :     h1 = -tau1
     378     5448960 :     x1 = x1*h1
     379     5448960 :     x2 = x2*h1
     380     5448960 :     x3 = x3*h1
     381     5448960 :     x4 = x4*h1
     382     5448960 :     x5 = x5*h1
     383     5448960 :     x6 = x6*h1
     384     5448960 :     x7 = x7*h1
     385     5448960 :     x8 = x8*h1
     386     5448960 :     x9 = x9*h1
     387     5448960 :     xa = xa*h1
     388     5448960 :     xb = xb*h1
     389     5448960 :     xc = xc*h1
     390             : 
     391     5448960 :     q(1,1) = q(1,1) + x1
     392     5448960 :     q(2,1) = q(2,1) + x2
     393     5448960 :     q(3,1) = q(3,1) + x3
     394     5448960 :     q(4,1) = q(4,1) + x4
     395     5448960 :     q(5,1) = q(5,1) + x5
     396     5448960 :     q(6,1) = q(6,1) + x6
     397     5448960 :     q(7,1) = q(7,1) + x7
     398     5448960 :     q(8,1) = q(8,1) + x8
     399     5448960 :     q(9,1) = q(9,1) + x9
     400     5448960 :     q(10,1) = q(10,1) + xa
     401     5448960 :     q(11,1) = q(11,1) + xb
     402     5448960 :     q(12,1) = q(12,1) + xc
     403             : 
     404             :     !DEC$ VECTOR ALIGNED
     405   174366720 :     do i=2,nb
     406   168917760 :        h1 = hh(i)
     407   168917760 :        q(1,i) = q(1,i) + x1*h1
     408   168917760 :        q(2,i) = q(2,i) + x2*h1
     409   168917760 :        q(3,i) = q(3,i) + x3*h1
     410   168917760 :        q(4,i) = q(4,i) + x4*h1
     411   168917760 :        q(5,i) = q(5,i) + x5*h1
     412   168917760 :        q(6,i) = q(6,i) + x6*h1
     413   168917760 :        q(7,i) = q(7,i) + x7*h1
     414   168917760 :        q(8,i) = q(8,i) + x8*h1
     415   168917760 :        q(9,i) = q(9,i) + x9*h1
     416   168917760 :        q(10,i) = q(10,i) + xa*h1
     417   168917760 :        q(11,i) = q(11,i) + xb*h1
     418   168917760 :        q(12,i) = q(12,i) + xc*h1
     419             :     enddo
     420             : 
     421             : #ifdef DOUBLE_PRECISION_COMPLEX
     422             : 
     423             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_12_double")
     424             : 
     425             : #else
     426             : 
     427             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_12_single")
     428             : 
     429             : #endif
     430             : 
     431             : #ifdef DOUBLE_PRECISION_COMPLEX
     432     3632640 :   end subroutine hh_trafo_complex_kernel_12_double
     433             : #else
     434     1816320 :   end subroutine hh_trafo_complex_kernel_12_single
     435             : #endif
     436             :   ! --------------------------------------------------------------------------------------------------
     437             : 
     438             : #ifdef DOUBLE_PRECISION_COMPLEX
     439      330240 :   subroutine hh_trafo_complex_kernel_8_double(q, hh, nb, ldq)
     440             : #else
     441      165120 :   subroutine hh_trafo_complex_kernel_8_single(q, hh, nb, ldq)
     442             : #endif
     443             :     use precision
     444             :     implicit none
     445             : 
     446             :     integer(kind=ik), intent(in)    :: nb, ldq
     447             : #ifdef USE_ASSUMED_SIZE
     448             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     449             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(*)
     450             : #else
     451             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     452             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:nb)
     453             : #endif
     454             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4, x5, x6, x7, x8
     455             :     complex(kind=COMPLEX_DATATYPE)                :: h1, tau1
     456             :     integer(kind=ik)                :: i
     457             : 
     458             : #ifdef DOUBLE_PRECISION_COMPLEX
     459             : 
     460             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_8_double")
     461             : 
     462             : #else
     463             : 
     464             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_8_single")
     465             : 
     466             : #endif
     467      495360 :     x1 = q(1,1)
     468      495360 :     x2 = q(2,1)
     469      495360 :     x3 = q(3,1)
     470      495360 :     x4 = q(4,1)
     471      495360 :     x5 = q(5,1)
     472      495360 :     x6 = q(6,1)
     473      495360 :     x7 = q(7,1)
     474      495360 :     x8 = q(8,1)
     475             : 
     476             :     !DEC$ VECTOR ALIGNED
     477    15851520 :     do i=2,nb
     478    15356160 :        h1 = conjg(hh(i))
     479    15356160 :        x1 = x1 + q(1,i)*h1
     480    15356160 :        x2 = x2 + q(2,i)*h1
     481    15356160 :        x3 = x3 + q(3,i)*h1
     482    15356160 :        x4 = x4 + q(4,i)*h1
     483    15356160 :        x5 = x5 + q(5,i)*h1
     484    15356160 :        x6 = x6 + q(6,i)*h1
     485    15356160 :        x7 = x7 + q(7,i)*h1
     486    15356160 :        x8 = x8 + q(8,i)*h1
     487             :     enddo
     488             : 
     489      495360 :     tau1 = hh(1)
     490             : 
     491      495360 :     h1 = -tau1
     492      495360 :     x1 = x1*h1
     493      495360 :     x2 = x2*h1
     494      495360 :     x3 = x3*h1
     495      495360 :     x4 = x4*h1
     496      495360 :     x5 = x5*h1
     497      495360 :     x6 = x6*h1
     498      495360 :     x7 = x7*h1
     499      495360 :     x8 = x8*h1
     500             : 
     501      495360 :     q(1,1) = q(1,1) + x1
     502      495360 :     q(2,1) = q(2,1) + x2
     503      495360 :     q(3,1) = q(3,1) + x3
     504      495360 :     q(4,1) = q(4,1) + x4
     505      495360 :     q(5,1) = q(5,1) + x5
     506      495360 :     q(6,1) = q(6,1) + x6
     507      495360 :     q(7,1) = q(7,1) + x7
     508      495360 :     q(8,1) = q(8,1) + x8
     509             : 
     510             :     !DEC$ VECTOR ALIGNED
     511    15851520 :     do i=2,nb
     512    15356160 :        h1 = hh(i)
     513    15356160 :        q(1,i) = q(1,i) + x1*h1
     514    15356160 :        q(2,i) = q(2,i) + x2*h1
     515    15356160 :        q(3,i) = q(3,i) + x3*h1
     516    15356160 :        q(4,i) = q(4,i) + x4*h1
     517    15356160 :        q(5,i) = q(5,i) + x5*h1
     518    15356160 :        q(6,i) = q(6,i) + x6*h1
     519    15356160 :        q(7,i) = q(7,i) + x7*h1
     520    15356160 :        q(8,i) = q(8,i) + x8*h1
     521             :     enddo
     522             : 
     523             : #ifdef DOUBLE_PRECISION_COMPLEX
     524             : 
     525             :     !  call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_8_double")
     526             : 
     527             : #else
     528             : 
     529             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_8_single")
     530             : 
     531             : #endif
     532             : 
     533             : #ifdef DOUBLE_PRECISION_COMPLEX
     534      330240 :   end subroutine hh_trafo_complex_kernel_8_double
     535             : #else
     536      165120 :   end subroutine hh_trafo_complex_kernel_8_single
     537             : #endif
     538             :   ! --------------------------------------------------------------------------------------------------
     539             : 
     540             : #ifdef DOUBLE_PRECISION_COMPLEX
     541      990720 :   subroutine hh_trafo_complex_kernel_4_double(q, hh, nb, ldq)
     542             : #else
     543      495360 :   subroutine hh_trafo_complex_kernel_4_single(q, hh, nb, ldq)
     544             : #endif
     545             :     use precision
     546             :     implicit none
     547             : 
     548             :     integer(kind=ik), intent(in)    :: nb, ldq
     549             : #ifdef USE_ASSUMED_SIZE
     550             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     551             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(*)
     552             : #else
     553             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     554             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:nb)
     555             : #endif
     556             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4
     557             :     complex(kind=COMPLEX_DATATYPE)                :: h1, tau1
     558             :     integer(kind=ik)                :: i
     559             : 
     560             : #ifdef DOUBLE_PRECISION_COMPLEX
     561             : 
     562             :     !  call obj%timer%start("kernel generic: hh_trafo_complex_kernel_4_double")
     563             : 
     564             : #else
     565             : 
     566             :     !  call obj%timer%start("kernel generic: hh_trafo_complex_kernel_4_single")
     567             : 
     568             : #endif
     569             : 
     570     1486080 :     x1 = q(1,1)
     571     1486080 :     x2 = q(2,1)
     572     1486080 :     x3 = q(3,1)
     573     1486080 :     x4 = q(4,1)
     574             : 
     575             :     !DEC$ VECTOR ALIGNED
     576    47554560 :     do i=2,nb
     577    46068480 :        h1 = conjg(hh(i))
     578    46068480 :        x1 = x1 + q(1,i)*h1
     579    46068480 :        x2 = x2 + q(2,i)*h1
     580    46068480 :        x3 = x3 + q(3,i)*h1
     581    46068480 :        x4 = x4 + q(4,i)*h1
     582             :     enddo
     583             : 
     584     1486080 :     tau1 = hh(1)
     585             : 
     586     1486080 :     h1 = -tau1
     587     1486080 :     x1 = x1*h1
     588     1486080 :     x2 = x2*h1
     589     1486080 :     x3 = x3*h1
     590     1486080 :     x4 = x4*h1
     591             : 
     592     1486080 :     q(1,1) = q(1,1) + x1
     593     1486080 :     q(2,1) = q(2,1) + x2
     594     1486080 :     q(3,1) = q(3,1) + x3
     595     1486080 :     q(4,1) = q(4,1) + x4
     596             : 
     597             :     !DEC$ VECTOR ALIGNED
     598    47554560 :     do i=2,nb
     599    46068480 :        h1 = hh(i)
     600    46068480 :        q(1,i) = q(1,i) + x1*h1
     601    46068480 :        q(2,i) = q(2,i) + x2*h1
     602    46068480 :        q(3,i) = q(3,i) + x3*h1
     603    46068480 :        q(4,i) = q(4,i) + x4*h1
     604             :     enddo
     605             : 
     606             : #ifdef DOUBLE_PRECISION_COMPLEX
     607             : 
     608             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_4_double")
     609             : 
     610             : #else
     611             : 
     612             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_4_single")
     613             : 
     614             : #endif
     615             : 
     616             : #ifdef DOUBLE_PRECISION_COMPLEX
     617      990720 :   end subroutine hh_trafo_complex_kernel_4_double
     618             : #else
     619      495360 :   end subroutine hh_trafo_complex_kernel_4_single
     620             : #endif
     621             :   ! --------------------------------------------------------------------------------------------------
     622             : 
     623             : #ifdef DOUBLE_PRECISION_COMPLEX
     624           0 :   subroutine hh_trafo_complex_kernel_4_2hv_double(q, hh, nb, ldq, ldh, s)
     625             : #else
     626           0 :   subroutine hh_trafo_complex_kernel_4_2hv_single(q, hh, nb, ldq, ldh, s)
     627             : #endif
     628             :     use precision
     629             :     implicit none
     630             : 
     631             :     integer(kind=ik), intent(in)    :: nb, ldq, ldh
     632             : #ifdef USE_ASSUMED_SIZE
     633             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     634             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(ldh,*)
     635             : #else
     636             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     637             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:ldh,1:2)
     638             : #endif
     639             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: s
     640             : 
     641             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4, y1, y2, y3, y4
     642             :     complex(kind=COMPLEX_DATATYPE)                :: h1, h2, tau1, tau2
     643             :     integer(kind=ik)                :: i
     644             : 
     645             : #ifdef DOUBLE_PRECISION_COMPLEX
     646             : 
     647             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_4_2hv_double")
     648             : 
     649             : #else
     650             : 
     651             :   !    call obj%timer%start("kernel generic: hh_trafo_complex_kernel_4_2hv_single")
     652             : 
     653             : #endif
     654           0 :     x1 = q(1,2)
     655           0 :     x2 = q(2,2)
     656           0 :     x3 = q(3,2)
     657           0 :     x4 = q(4,2)
     658             : 
     659           0 :     y1 = q(1,1) + q(1,2)*conjg(hh(2,2))
     660           0 :     y2 = q(2,1) + q(2,2)*conjg(hh(2,2))
     661           0 :     y3 = q(3,1) + q(3,2)*conjg(hh(2,2))
     662           0 :     y4 = q(4,1) + q(4,2)*conjg(hh(2,2))
     663             : 
     664             :     !DEC$ VECTOR ALIGNED
     665           0 :     do i=3,nb
     666           0 :        h1 = conjg(hh(i-1,1))
     667           0 :        h2 = conjg(hh(i,2))
     668           0 :        x1 = x1 + q(1,i)*h1
     669           0 :        y1 = y1 + q(1,i)*h2
     670           0 :        x2 = x2 + q(2,i)*h1
     671           0 :        y2 = y2 + q(2,i)*h2
     672           0 :        x3 = x3 + q(3,i)*h1
     673           0 :        y3 = y3 + q(3,i)*h2
     674           0 :        x4 = x4 + q(4,i)*h1
     675           0 :        y4 = y4 + q(4,i)*h2
     676             :     enddo
     677             : 
     678           0 :     x1 = x1 + q(1,nb+1)*conjg(hh(nb,1))
     679           0 :     x2 = x2 + q(2,nb+1)*conjg(hh(nb,1))
     680           0 :     x3 = x3 + q(3,nb+1)*conjg(hh(nb,1))
     681           0 :     x4 = x4 + q(4,nb+1)*conjg(hh(nb,1))
     682             : 
     683           0 :     tau1 = hh(1,1)
     684           0 :     tau2 = hh(1,2)
     685             : 
     686           0 :     h1 = -tau1
     687           0 :     x1 = x1*h1
     688           0 :     x2 = x2*h1
     689           0 :     x3 = x3*h1
     690           0 :     x4 = x4*h1
     691           0 :     h1 = -tau2
     692           0 :     h2 = -tau2*s
     693           0 :     y1 = y1*h1 + x1*h2
     694           0 :     y2 = y2*h1 + x2*h2
     695           0 :     y3 = y3*h1 + x3*h2
     696           0 :     y4 = y4*h1 + x4*h2
     697             : 
     698           0 :     q(1,1) = q(1,1) + y1
     699           0 :     q(2,1) = q(2,1) + y2
     700           0 :     q(3,1) = q(3,1) + y3
     701           0 :     q(4,1) = q(4,1) + y4
     702             : 
     703           0 :     q(1,2) = q(1,2) + x1 + y1*hh(2,2)
     704           0 :     q(2,2) = q(2,2) + x2 + y2*hh(2,2)
     705           0 :     q(3,2) = q(3,2) + x3 + y3*hh(2,2)
     706           0 :     q(4,2) = q(4,2) + x4 + y4*hh(2,2)
     707             : 
     708             :     !DEC$ VECTOR ALIGNED
     709           0 :     do i=3,nb
     710           0 :        h1 = hh(i-1,1)
     711           0 :        h2 = hh(i,2)
     712           0 :        q(1,i) = q(1,i) + x1*h1 + y1*h2
     713           0 :        q(2,i) = q(2,i) + x2*h1 + y2*h2
     714           0 :        q(3,i) = q(3,i) + x3*h1 + y3*h2
     715           0 :        q(4,i) = q(4,i) + x4*h1 + y4*h2
     716             :     enddo
     717             : 
     718           0 :     q(1,nb+1) = q(1,nb+1) + x1*hh(nb,1)
     719           0 :     q(2,nb+1) = q(2,nb+1) + x2*hh(nb,1)
     720           0 :     q(3,nb+1) = q(3,nb+1) + x3*hh(nb,1)
     721           0 :     q(4,nb+1) = q(4,nb+1) + x4*hh(nb,1)
     722             : 
     723             : #ifdef DOUBLE_PRECISION_COMPLEX
     724             : 
     725             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_4_2hv_double")
     726             : 
     727             : #else
     728             : 
     729             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_4_2hv_single")
     730             : 
     731             : #endif
     732             : 
     733             : #ifdef DOUBLE_PRECISION_COMPLEX
     734           0 :   end subroutine hh_trafo_complex_kernel_4_2hv_double
     735             : #else
     736           0 :   end subroutine hh_trafo_complex_kernel_4_2hv_single
     737             : #endif
     738             : 
     739             :   ! --------------------------------------------------------------------------------------------------
     740             : 
     741             : #ifdef DOUBLE_PRECISION_COMPLEX
     742           0 :   subroutine hh_trafo_complex_kernel_8_2hv_double(q, hh, nb, ldq, ldh, s)
     743             : #else
     744           0 :   subroutine hh_trafo_complex_kernel_8_2hv_single(q, hh, nb, ldq, ldh, s)
     745             : #endif
     746             :     use precision
     747             :     implicit none
     748             : 
     749             :     integer(kind=ik), intent(in)    :: nb, ldq, ldh
     750             : #ifdef USE_ASSUMED_SIZE
     751             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     752             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(ldh,*)
     753             : #else
     754             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     755             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:ldh,1:2)
     756             : #endif
     757             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: s
     758             : 
     759             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4, x5, x6 ,x7, x8, y1, y2, y3, y4, y5, y6, y7, y8
     760             :     complex(kind=COMPLEX_DATATYPE)                :: h1, h2, tau1, tau2
     761             :     integer(kind=ik)                :: i
     762             : 
     763             : #ifdef DOUBLE_PRECISION_COMPLEX
     764             : 
     765             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_8_2hv_double")
     766             : 
     767             : #else
     768             : 
     769             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_8_2hv_single")
     770             : 
     771             : #endif
     772             : 
     773           0 :     x1 = q(1,2)
     774           0 :     x2 = q(2,2)
     775           0 :     x3 = q(3,2)
     776           0 :     x4 = q(4,2)
     777           0 :     x5 = q(5,2)
     778           0 :     x6 = q(6,2)
     779           0 :     x7 = q(7,2)
     780           0 :     x8 = q(8,2)
     781             : 
     782           0 :     y1 = q(1,1) + q(1,2)*conjg(hh(2,2))
     783           0 :     y2 = q(2,1) + q(2,2)*conjg(hh(2,2))
     784           0 :     y3 = q(3,1) + q(3,2)*conjg(hh(2,2))
     785           0 :     y4 = q(4,1) + q(4,2)*conjg(hh(2,2))
     786           0 :     y5 = q(5,1) + q(5,2)*conjg(hh(2,2))
     787           0 :     y6 = q(6,1) + q(6,2)*conjg(hh(2,2))
     788           0 :     y7 = q(7,1) + q(7,2)*conjg(hh(2,2))
     789           0 :     y8 = q(8,1) + q(8,2)*conjg(hh(2,2))
     790             : 
     791             :     !DEC$ VECTOR ALIGNED
     792           0 :     do i=3,nb
     793           0 :        h1 = conjg(hh(i-1,1))
     794           0 :        h2 = conjg(hh(i,2))
     795           0 :        x1 = x1 + q(1,i)*h1
     796           0 :        y1 = y1 + q(1,i)*h2
     797           0 :        x2 = x2 + q(2,i)*h1
     798           0 :        y2 = y2 + q(2,i)*h2
     799           0 :        x3 = x3 + q(3,i)*h1
     800           0 :        y3 = y3 + q(3,i)*h2
     801           0 :        x4 = x4 + q(4,i)*h1
     802           0 :        y4 = y4 + q(4,i)*h2
     803           0 :        x5 = x5 + q(5,i)*h1
     804           0 :        y5 = y5 + q(5,i)*h2
     805           0 :        x6 = x6 + q(6,i)*h1
     806           0 :        y6 = y6 + q(6,i)*h2
     807           0 :        x7 = x7 + q(7,i)*h1
     808           0 :        y7 = y7 + q(7,i)*h2
     809           0 :        x8 = x8 + q(8,i)*h1
     810           0 :        y8 = y8 + q(8,i)*h2
     811             :     enddo
     812             : 
     813           0 :     x1 = x1 + q(1,nb+1)*conjg(hh(nb,1))
     814           0 :     x2 = x2 + q(2,nb+1)*conjg(hh(nb,1))
     815           0 :     x3 = x3 + q(3,nb+1)*conjg(hh(nb,1))
     816           0 :     x4 = x4 + q(4,nb+1)*conjg(hh(nb,1))
     817           0 :     x5 = x5 + q(5,nb+1)*conjg(hh(nb,1))
     818           0 :     x6 = x6 + q(6,nb+1)*conjg(hh(nb,1))
     819           0 :     x7 = x7 + q(7,nb+1)*conjg(hh(nb,1))
     820           0 :     x8 = x8 + q(8,nb+1)*conjg(hh(nb,1))
     821             : 
     822           0 :     tau1 = hh(1,1)
     823           0 :     tau2 = hh(1,2)
     824             : 
     825           0 :     h1 = -tau1
     826           0 :     x1 = x1*h1
     827           0 :     x2 = x2*h1
     828           0 :     x3 = x3*h1
     829           0 :     x4 = x4*h1
     830           0 :     x5 = x5*h1
     831           0 :     x6 = x6*h1
     832           0 :     x7 = x7*h1
     833           0 :     x8 = x8*h1
     834             : 
     835           0 :     h1 = -tau2
     836           0 :     h2 = -tau2*s
     837           0 :     y1 = y1*h1 + x1*h2
     838           0 :     y2 = y2*h1 + x2*h2
     839           0 :     y3 = y3*h1 + x3*h2
     840           0 :     y4 = y4*h1 + x4*h2
     841           0 :     y5 = y5*h1 + x5*h2
     842           0 :     y6 = y6*h1 + x6*h2
     843           0 :     y7 = y7*h1 + x7*h2
     844           0 :     y8 = y8*h1 + x8*h2
     845             : 
     846           0 :     q(1,1) = q(1,1) + y1
     847           0 :     q(2,1) = q(2,1) + y2
     848           0 :     q(3,1) = q(3,1) + y3
     849           0 :     q(4,1) = q(4,1) + y4
     850           0 :     q(5,1) = q(5,1) + y5
     851           0 :     q(6,1) = q(6,1) + y6
     852           0 :     q(7,1) = q(7,1) + y7
     853           0 :     q(8,1) = q(8,1) + y8
     854             : 
     855           0 :     q(1,2) = q(1,2) + x1 + y1*hh(2,2)
     856           0 :     q(2,2) = q(2,2) + x2 + y2*hh(2,2)
     857           0 :     q(3,2) = q(3,2) + x3 + y3*hh(2,2)
     858           0 :     q(4,2) = q(4,2) + x4 + y4*hh(2,2)
     859           0 :     q(5,2) = q(5,2) + x5 + y5*hh(2,2)
     860           0 :     q(6,2) = q(6,2) + x6 + y6*hh(2,2)
     861           0 :     q(7,2) = q(7,2) + x7 + y7*hh(2,2)
     862           0 :     q(8,2) = q(8,2) + x8 + y8*hh(2,2)
     863             : 
     864             :     !DEC$ VECTOR ALIGNED
     865           0 :     do i=3,nb
     866           0 :        h1 = hh(i-1,1)
     867           0 :        h2 = hh(i,2)
     868           0 :        q(1,i) = q(1,i) + x1*h1 + y1*h2
     869           0 :        q(2,i) = q(2,i) + x2*h1 + y2*h2
     870           0 :        q(3,i) = q(3,i) + x3*h1 + y3*h2
     871           0 :        q(4,i) = q(4,i) + x4*h1 + y4*h2
     872           0 :        q(5,i) = q(5,i) + x5*h1 + y5*h2
     873           0 :        q(6,i) = q(6,i) + x6*h1 + y6*h2
     874           0 :        q(7,i) = q(7,i) + x7*h1 + y7*h2
     875           0 :        q(8,i) = q(8,i) + x8*h1 + y8*h2
     876             :     enddo
     877             : 
     878           0 :     q(1,nb+1) = q(1,nb+1) + x1*hh(nb,1)
     879           0 :     q(2,nb+1) = q(2,nb+1) + x2*hh(nb,1)
     880           0 :     q(3,nb+1) = q(3,nb+1) + x3*hh(nb,1)
     881           0 :     q(4,nb+1) = q(4,nb+1) + x4*hh(nb,1)
     882           0 :     q(5,nb+1) = q(5,nb+1) + x5*hh(nb,1)
     883           0 :     q(6,nb+1) = q(6,nb+1) + x6*hh(nb,1)
     884           0 :     q(7,nb+1) = q(7,nb+1) + x7*hh(nb,1)
     885           0 :     q(8,nb+1) = q(8,nb+1) + x8*hh(nb,1)
     886             : 
     887             : #ifdef DOUBLE_PRECISION_COMPLEX
     888             : 
     889             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_8_2hv_double")
     890             : 
     891             : #else
     892             : 
     893             :     !  call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_8_2hv_single")
     894             : 
     895             : #endif
     896             : 
     897             : #ifdef DOUBLE_PRECISION_COMPLEX
     898           0 :   end subroutine hh_trafo_complex_kernel_8_2hv_double
     899             : #else
     900           0 :   end subroutine hh_trafo_complex_kernel_8_2hv_single
     901             : #endif
     902             :   ! --------------------------------------------------------------------------------------------------
     903             : 
     904             : #ifdef DOUBLE_PRECISION_COMPLEX
     905           0 :   subroutine hh_trafo_complex_kernel_12_2hv_double(q, hh, nb, ldq, ldh, s)
     906             : #else
     907           0 :   subroutine hh_trafo_complex_kernel_12_2hv_single(q, hh, nb, ldq, ldh, s)
     908             : #endif
     909             :     use precision
     910             :     implicit none
     911             : 
     912             :     integer(kind=ik), intent(in)    :: nb, ldq, ldh
     913             : #ifdef USE_ASSUMED_SIZE
     914             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(ldq,*)
     915             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(ldh,*)
     916             : #else
     917             :     complex(kind=COMPLEX_DATATYPE), intent(inout) :: q(:,:)
     918             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: hh(1:ldh,1:2)
     919             : #endif
     920             :     complex(kind=COMPLEX_DATATYPE), intent(in)    :: s
     921             : 
     922             :     complex(kind=COMPLEX_DATATYPE)                :: x1, x2, x3, x4, x5, x6 ,x7, x8, x9, x10, x11, x12, y1, y2, y3, y4, y5, y6, &
     923             :                                        y7, y8, y9, y10, y11, y12
     924             :     complex(kind=COMPLEX_DATATYPE)                :: h1, h2, tau1, tau2
     925             :     integer(kind=ik)                :: i
     926             : 
     927             : #ifdef DOUBLE_PRECISION_COMPLEX
     928             : 
     929             :    !   call obj%timer%start("kernel generic: hh_trafo_complex_kernel_12_2hv_double")
     930             : 
     931             : #else
     932             : 
     933             :   !    call obj%timer%start("kernel generic: hh_trafo_complex_kernel_12_2hv_single")
     934             : 
     935             : #endif
     936           0 :     x1 = q(1,2)
     937           0 :     x2 = q(2,2)
     938           0 :     x3 = q(3,2)
     939           0 :     x4 = q(4,2)
     940           0 :     x5 = q(5,2)
     941           0 :     x6 = q(6,2)
     942           0 :     x7 = q(7,2)
     943           0 :     x8 = q(8,2)
     944           0 :     x9 = q(9,2)
     945           0 :     x10 = q(10,2)
     946           0 :     x11 = q(11,2)
     947           0 :     x12 = q(12,2)
     948             : 
     949           0 :     y1 = q(1,1) + q(1,2)*conjg(hh(2,2))
     950           0 :     y2 = q(2,1) + q(2,2)*conjg(hh(2,2))
     951           0 :     y3 = q(3,1) + q(3,2)*conjg(hh(2,2))
     952           0 :     y4 = q(4,1) + q(4,2)*conjg(hh(2,2))
     953           0 :     y5 = q(5,1) + q(5,2)*conjg(hh(2,2))
     954           0 :     y6 = q(6,1) + q(6,2)*conjg(hh(2,2))
     955           0 :     y7 = q(7,1) + q(7,2)*conjg(hh(2,2))
     956           0 :     y8 = q(8,1) + q(8,2)*conjg(hh(2,2))
     957           0 :     y9 = q(9,1) + q(9,2)*conjg(hh(2,2))
     958           0 :     y10 = q(10,1) + q(10,2)*conjg(hh(2,2))
     959           0 :     y11 = q(11,1) + q(11,2)*conjg(hh(2,2))
     960           0 :     y12 = q(12,1) + q(12,2)*conjg(hh(2,2))
     961             : 
     962             :     !DEC$ VECTOR ALIGNED
     963           0 :     do i=3,nb
     964           0 :        h1 = conjg(hh(i-1,1))
     965           0 :        h2 = conjg(hh(i,2))
     966           0 :        x1 = x1 + q(1,i)*h1
     967           0 :        y1 = y1 + q(1,i)*h2
     968           0 :        x2 = x2 + q(2,i)*h1
     969           0 :        y2 = y2 + q(2,i)*h2
     970           0 :        x3 = x3 + q(3,i)*h1
     971           0 :        y3 = y3 + q(3,i)*h2
     972           0 :        x4 = x4 + q(4,i)*h1
     973           0 :        y4 = y4 + q(4,i)*h2
     974           0 :        x5 = x5 + q(5,i)*h1
     975           0 :        y5 = y5 + q(5,i)*h2
     976           0 :        x6 = x6 + q(6,i)*h1
     977           0 :        y6 = y6 + q(6,i)*h2
     978           0 :        x7 = x7 + q(7,i)*h1
     979           0 :        y7 = y7 + q(7,i)*h2
     980           0 :        x8 = x8 + q(8,i)*h1
     981           0 :        y8 = y8 + q(8,i)*h2
     982           0 :        x9 = x9 + q(9,i)*h1
     983           0 :        y9 = y9 + q(9,i)*h2
     984           0 :        x10 = x10 + q(10,i)*h1
     985           0 :        y10 = y10 + q(10,i)*h2
     986           0 :        x11 = x11 + q(11,i)*h1
     987           0 :        y11 = y11 + q(11,i)*h2
     988           0 :        x12 = x12 + q(12,i)*h1
     989           0 :        y12 = y12 + q(12,i)*h2
     990             :     enddo
     991             : 
     992           0 :     x1 = x1 + q(1,nb+1)*conjg(hh(nb,1))
     993           0 :     x2 = x2 + q(2,nb+1)*conjg(hh(nb,1))
     994           0 :     x3 = x3 + q(3,nb+1)*conjg(hh(nb,1))
     995           0 :     x4 = x4 + q(4,nb+1)*conjg(hh(nb,1))
     996           0 :     x5 = x5 + q(5,nb+1)*conjg(hh(nb,1))
     997           0 :     x6 = x6 + q(6,nb+1)*conjg(hh(nb,1))
     998           0 :     x7 = x7 + q(7,nb+1)*conjg(hh(nb,1))
     999           0 :     x8 = x8 + q(8,nb+1)*conjg(hh(nb,1))
    1000           0 :     x9 = x9 + q(9,nb+1)*conjg(hh(nb,1))
    1001           0 :     x10 = x10 + q(10,nb+1)*conjg(hh(nb,1))
    1002           0 :     x11 = x11 + q(11,nb+1)*conjg(hh(nb,1))
    1003           0 :     x12 = x12 + q(12,nb+1)*conjg(hh(nb,1))
    1004             : 
    1005           0 :     tau1 = hh(1,1)
    1006           0 :     tau2 = hh(1,2)
    1007             : 
    1008           0 :     h1 = -tau1
    1009           0 :     x1 = x1*h1
    1010           0 :     x2 = x2*h1
    1011           0 :     x3 = x3*h1
    1012           0 :     x4 = x4*h1
    1013           0 :     x5 = x5*h1
    1014           0 :     x6 = x6*h1
    1015           0 :     x7 = x7*h1
    1016           0 :     x8 = x8*h1
    1017           0 :     x9 = x9*h1
    1018           0 :     x10 = x10*h1
    1019           0 :     x11 = x11*h1
    1020           0 :     x12 = x12*h1
    1021           0 :     h1 = -tau2
    1022           0 :     h2 = -tau2*s
    1023           0 :     y1 = y1*h1 + x1*h2
    1024           0 :     y2 = y2*h1 + x2*h2
    1025           0 :     y3 = y3*h1 + x3*h2
    1026           0 :     y4 = y4*h1 + x4*h2
    1027           0 :     y5 = y5*h1 + x5*h2
    1028           0 :     y6 = y6*h1 + x6*h2
    1029           0 :     y7 = y7*h1 + x7*h2
    1030           0 :     y8 = y8*h1 + x8*h2
    1031           0 :     y9 = y9*h1 + x9*h2
    1032           0 :     y10 = y10*h1 + x10*h2
    1033           0 :     y11 = y11*h1 + x11*h2
    1034           0 :     y12 = y12*h1 + x12*h2
    1035             : 
    1036           0 :     q(1,1) = q(1,1) + y1
    1037           0 :     q(2,1) = q(2,1) + y2
    1038           0 :     q(3,1) = q(3,1) + y3
    1039           0 :     q(4,1) = q(4,1) + y4
    1040           0 :     q(5,1) = q(5,1) + y5
    1041           0 :     q(6,1) = q(6,1) + y6
    1042           0 :     q(7,1) = q(7,1) + y7
    1043           0 :     q(8,1) = q(8,1) + y8
    1044           0 :     q(9,1) = q(9,1) + y9
    1045           0 :     q(10,1) = q(10,1) + y10
    1046           0 :     q(11,1) = q(11,1) + y11
    1047           0 :     q(12,1) = q(12,1) + y12
    1048             : 
    1049           0 :     q(1,2) = q(1,2) + x1 + y1*hh(2,2)
    1050           0 :     q(2,2) = q(2,2) + x2 + y2*hh(2,2)
    1051           0 :     q(3,2) = q(3,2) + x3 + y3*hh(2,2)
    1052           0 :     q(4,2) = q(4,2) + x4 + y4*hh(2,2)
    1053           0 :     q(5,2) = q(5,2) + x5 + y5*hh(2,2)
    1054           0 :     q(6,2) = q(6,2) + x6 + y6*hh(2,2)
    1055           0 :     q(7,2) = q(7,2) + x7 + y7*hh(2,2)
    1056           0 :     q(8,2) = q(8,2) + x8 + y8*hh(2,2)
    1057           0 :     q(9,2) = q(9,2) + x9 + y9*hh(2,2)
    1058           0 :     q(10,2) = q(10,2) + x10 + y10*hh(2,2)
    1059           0 :     q(11,2) = q(11,2) + x11 + y11*hh(2,2)
    1060           0 :     q(12,2) = q(12,2) + x12 + y12*hh(2,2)
    1061             : 
    1062             :     !DEC$ VECTOR ALIGNED
    1063           0 :     do i=3,nb
    1064           0 :        h1 = hh(i-1,1)
    1065           0 :        h2 = hh(i,2)
    1066           0 :        q(1,i) = q(1,i) + x1*h1 + y1*h2
    1067           0 :        q(2,i) = q(2,i) + x2*h1 + y2*h2
    1068           0 :        q(3,i) = q(3,i) + x3*h1 + y3*h2
    1069           0 :        q(4,i) = q(4,i) + x4*h1 + y4*h2
    1070           0 :        q(5,i) = q(5,i) + x5*h1 + y5*h2
    1071           0 :        q(6,i) = q(6,i) + x6*h1 + y6*h2
    1072           0 :        q(7,i) = q(7,i) + x7*h1 + y7*h2
    1073           0 :        q(8,i) = q(8,i) + x8*h1 + y8*h2
    1074           0 :        q(9,i) = q(9,i) + x9*h1 + y9*h2
    1075           0 :        q(10,i) = q(10,i) + x10*h1 + y10*h2
    1076           0 :        q(11,i) = q(11,i) + x11*h1 + y11*h2
    1077           0 :        q(12,i) = q(12,i) + x12*h1 + y12*h2
    1078             :     enddo
    1079             : 
    1080           0 :     q(1,nb+1) = q(1,nb+1) + x1*hh(nb,1)
    1081           0 :     q(2,nb+1) = q(2,nb+1) + x2*hh(nb,1)
    1082           0 :     q(3,nb+1) = q(3,nb+1) + x3*hh(nb,1)
    1083           0 :     q(4,nb+1) = q(4,nb+1) + x4*hh(nb,1)
    1084           0 :     q(5,nb+1) = q(5,nb+1) + x5*hh(nb,1)
    1085           0 :     q(6,nb+1) = q(6,nb+1) + x6*hh(nb,1)
    1086           0 :     q(7,nb+1) = q(7,nb+1) + x7*hh(nb,1)
    1087           0 :     q(8,nb+1) = q(8,nb+1) + x8*hh(nb,1)
    1088           0 :     q(9,nb+1) = q(9,nb+1) + x9*hh(nb,1)
    1089           0 :     q(10,nb+1) = q(10,nb+1) + x10*hh(nb,1)
    1090           0 :     q(11,nb+1) = q(11,nb+1) + x11*hh(nb,1)
    1091           0 :     q(12,nb+1) = q(12,nb+1) + x12*hh(nb,1)
    1092             : 
    1093             : #ifdef DOUBLE_PRECISION_COMPLEX
    1094             : 
    1095             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_12_2hv_double")
    1096             : 
    1097             : #else
    1098             : 
    1099             :    !   call obj%timer%stop("kernel generic: hh_trafo_complex_kernel_12_2hv_single")
    1100             : 
    1101             : #endif
    1102             : 
    1103             : #ifdef DOUBLE_PRECISION_COMPLEX
    1104           0 :   end subroutine hh_trafo_complex_kernel_12_2hv_double
    1105             : #else
    1106           0 :   end subroutine hh_trafo_complex_kernel_12_2hv_single
    1107             : #endif

Generated by: LCOV version 1.12