LCOV - code coverage report
Current view: top level - diagonalization - dummy_diag.F90 (source / functions) Coverage Total Hit
Test: FLEUR test coverage Lines: 31.1 % 45 14
Test Date: 2026-04-29 04:40:47 Functions: 66.7 % 3 2

            Line data    Source code
       1              : !--------------------------------------------------------------------------------
       2              : ! Copyright (c) 2025 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
       3              : ! This file is part of FLEUR and available as free software under the conditions 
       4              : ! of the MIT license as expressed in the LICENSE file in more detail.
       5              : !--------------------------------------------------------------------------------
       6              : ! Added MPI implementation, DW 2018
       7              : !--------------------------------------------------------------------------------
       8              : module m_dummy_diag
       9              :    use m_judft
      10              :    use m_constants
      11              :    use m_types_solver
      12              :    implicit none
      13              :    private
      14              :    type, extends(t_solver):: t_solver_dummy
      15              :    contains
      16              :       procedure        :: solve_gev => dummy_diag  !solver for generalized eigenvalue problem
      17              :    end type
      18              : 
      19              :    public t_solver_dummy, get_solver_dummy
      20              : 
      21              : contains
      22              : 
      23          104 :    function get_solver_dummy() result(solver)
      24              :       class(t_solver), allocatable :: solver
      25          104 :       allocate(t_solver_dummy :: solver)
      26          104 :       solver%name = "dummy"
      27          104 :       solver%available = .true.
      28          104 :       solver%parallel = .false.
      29          104 :       solver%serial = .true.
      30          104 :       solver%generalized = .true.
      31          104 :       solver%standard = .false.
      32          104 :       solver%single_precision = .false.
      33          104 :       solver%transform = .false.
      34          104 :       solver%GPU = .true.
      35          104 :       solver%use_sp = .false.
      36          104 :    end function
      37              : 
      38            0 :    subroutine dummy_diag(self, hmat, smat, ne, eig, zmat, ikpt)
      39              :       !Dummy diver: does not solve actual eigenvalue problem but simply returns a set of orthogonal vectors.
      40              :       !Could be useful for performance testing workloads in which we do not want to look at the diagonalization.
      41              :       ! A Cholesky decomp is still done to be able to do a back transform so that the resulting vector are orthonormal
      42              :       ! with respect to overlapp matrix.
      43              : 
      44              :       use m_types_mat
      45              :       use m_judft
      46              : 
      47              :       implicit none
      48              :       class(t_solver_dummy)                  :: self
      49              :       class(t_mat), intent(INOUT) :: hmat, smat
      50              :       integer, intent(INOUT) :: ne
      51              :       class(t_mat), allocatable, intent(OUT)   :: zmat
      52              :       real, intent(OUT)   :: eig(:)
      53              :       integer, intent(IN) :: ikpt
      54              : 
      55              :       integer            :: nev, lwork, liwork, n
      56              :       integer            :: info
      57              : 
      58            0 :       call timestart("DUMMY DIAG")
      59              : 
      60            0 :       allocate (t_mat::zmat)
      61            0 :       call zmat%alloc(hmat%l_real, hmat%matsize1, ne)
      62              : 
      63            0 :       if (hmat%l_real) then
      64              :          ! --> start with Cholesky factorization of b ( so that b = l * l^t)
      65              :          ! --> b is overwritten by l
      66            0 :          call dpotrf('U', smat%matsize1, smat%data_r, size(smat%data_r, 1), info)
      67            0 :          if (info .ne. 0) then
      68            0 :             write (*, *) 'Error in dpotrf: info =', info
      69            0 :             call juDFT_error("Diagonalization failed", calledby="lapack_singlePrec_diag")
      70              :          end if
      71              : 
      72              :          ! --> solve a' * z' = eig * z' for eigenvalues eig between lb und ub
      73            0 :          zmat%data_r = 0.0
      74            0 :          do n = 1, ne
      75            0 :             eig(ne) = -0.1 + ne*1e-5
      76            0 :             zmat%data_r(ne, ne) = 1.0
      77              :          end do
      78              :          ! --> recover the generalized eigenvectors z by solving z' = l^t * z
      79            0 :          call dtrtrs('U', 'N', 'N', hmat%matsize1, nev, smat%data_r, smat%matsize1, zMat%data_r, zmat%matsize1, info)
      80            0 :          if (info .ne. 0) then
      81            0 :             write (oUnit, *) 'Error in dtrtrs: info =', info
      82            0 :             call juDFT_error("Diagonalization failed", calledby="lapack_singlePrec_diag")
      83              :          end if
      84              : 
      85              :       else
      86              : 
      87              :          ! --> start with Cholesky factorization of b ( so that b = l * l^t)
      88              :          ! --> b is overwritten by l
      89            0 :          call zpotrf('U', smat%matsize1, smat%data_c, size(smat%data_c, 1), info)
      90            0 :          if (info .ne. 0) then
      91            0 :             write (*, *) 'Error in zpotrf: info =', info
      92            0 :             call juDFT_error("Diagonalization failed", calledby="chase_diag")
      93              :          end if
      94              : 
      95              :          ! --> solve a' * z' = eig * z' for eigenvalues eig between lb und ub
      96            0 :          zmat%data_c = 0.0
      97            0 :          do n = 1, ne
      98            0 :             eig(ne) = -0.1 + ne*1e-5
      99            0 :             zmat%data_c(ne, ne) = 1.0
     100              :          end do
     101              : 
     102              :          ! --> recover the generalized eigenvectors z by solving z' = l^t * z
     103            0 :          call ztrtrs('U', 'N', 'N', hmat%matsize1, nev, smat%data_c, smat%matsize1, zMat%data_c, zmat%matsize1, info)
     104            0 :          if (info .ne. 0) then
     105            0 :             write (oUnit, *) 'Error in ztrtrs: info =', info
     106            0 :             call juDFT_error("Diagonalization failed", calledby="chase_diag")
     107              :          end if
     108              : 
     109              :       end if
     110            0 :       call timestop("DUMMY DIAG")
     111            0 :    end subroutine dummy_diag
     112              : 
     113          208 : end module m_dummy_diag
        

Generated by: LCOV version 2.0-1