LCOV - code coverage report
Current view: top level - src - pexsi_interface.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 0.0 % 57 0
Test Date: 2025-12-04 06:27:48 Functions: 0.0 % 9 0

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Interface to the PEXSI library, providing wrappers for all PEXSI
      10              : !>        routines that are called inside CP2K. Requires PEXSI version 0.10.x.
      11              : !> \par History
      12              : !>       2014.12 created [Patrick Seewald]
      13              : !> \author Patrick Seewald
      14              : ! **************************************************************************************************
      15              : MODULE pexsi_interface
      16              : 
      17              : #if defined(__PEXSI)
      18              :    USE f_ppexsi_interface, ONLY: f_ppexsi_dft_driver, &
      19              :                                  f_ppexsi_load_real_hs_matrix, &
      20              :                                  f_ppexsi_options, &
      21              :                                  f_ppexsi_plan_finalize, &
      22              :                                  f_ppexsi_plan_initialize, &
      23              :                                  f_ppexsi_retrieve_real_dft_matrix, &
      24              :                                  f_ppexsi_set_default_options
      25              : #endif
      26              : #if defined(__HAS_IEEE_EXCEPTIONS)
      27              :    USE ieee_exceptions, ONLY: ieee_get_halting_mode, &
      28              :                               ieee_set_halting_mode, &
      29              :                               ieee_all
      30              : #endif
      31              :    USE kinds, ONLY: int_8, &
      32              :                     real_8
      33              :    USE ISO_C_BINDING, ONLY: C_INTPTR_T
      34              :    USE message_passing, ONLY: mp_comm_type
      35              : #include "./base/base_uses.f90"
      36              : 
      37              :    IMPLICIT NONE
      38              : 
      39              :    PRIVATE
      40              : 
      41              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pexsi_interface'
      42              : 
      43              :    PUBLIC :: cp_pexsi_options, cp_pexsi_plan_initialize, &
      44              :              cp_pexsi_load_real_hs_matrix, cp_pexsi_dft_driver, &
      45              :              cp_pexsi_retrieve_real_dft_matrix, cp_pexsi_plan_finalize, &
      46              :              cp_pexsi_set_options, cp_pexsi_get_options, cp_pexsi_set_default_options
      47              : 
      48              :    TYPE cp_pexsi_options
      49              :       PRIVATE
      50              : #if defined(__PEXSI)
      51              :       TYPE(f_ppexsi_options) :: options
      52              : #else
      53              :       INTEGER :: unused = -1
      54              : #endif
      55              :    END TYPE cp_pexsi_options
      56              : 
      57              : CONTAINS
      58              : 
      59              : ! **************************************************************************************************
      60              : !> \brief Set PEXSI internal options
      61              : !> \param pexsi_options ...
      62              : !> \param temperature ...
      63              : !> \param gap ...
      64              : !> \param deltaE ...
      65              : !> \param numPole ...
      66              : !> \param isInertiaCount ...
      67              : !> \param maxPEXSIIter ...
      68              : !> \param muMin0 ...
      69              : !> \param muMax0 ...
      70              : !> \param mu0 ...
      71              : !> \param muInertiaTolerance ...
      72              : !> \param muInertiaExpansion ...
      73              : !> \param muPEXSISafeGuard ...
      74              : !> \param numElectronPEXSITolerance ...
      75              : !> \param matrixType ...
      76              : !> \param isSymbolicFactorize ...
      77              : !> \param ordering ...
      78              : !> \param rowOrdering ...
      79              : !> \param npSymbFact ...
      80              : !> \param verbosity ...
      81              : ! **************************************************************************************************
      82            0 :    SUBROUTINE cp_pexsi_set_options(pexsi_options, temperature, gap, deltaE, numPole, &
      83              :                                    isInertiaCount, maxPEXSIIter, muMin0, muMax0, mu0, &
      84              :                                    muInertiaTolerance, muInertiaExpansion, &
      85              :                                    muPEXSISafeGuard, numElectronPEXSITolerance, &
      86              :                                    matrixType, isSymbolicFactorize, ordering, rowOrdering, &
      87              :                                    npSymbFact, verbosity)
      88              : 
      89              :       TYPE(cp_pexsi_options), INTENT(INOUT)    :: pexsi_options
      90              :       REAL(KIND=real_8), INTENT(IN), OPTIONAL  :: temperature, gap, deltaE
      91              :       INTEGER, INTENT(IN), OPTIONAL            :: numPole, isInertiaCount, &
      92              :                                                   maxPEXSIIter
      93              :       REAL(KIND=real_8), INTENT(IN), OPTIONAL  :: muMin0, muMax0, mu0, &
      94              :                                                   muInertiaTolerance, muInertiaExpansion, muPEXSISafeGuard, &
      95              :                                                   numElectronPEXSITolerance
      96              :       INTEGER, INTENT(IN), OPTIONAL            :: matrixType, &
      97              :                                                   isSymbolicFactorize, &
      98              :                                                   ordering, rowOrdering, npSymbFact, &
      99              :                                                   verbosity
     100              : 
     101              : #if defined(__PEXSI)
     102              :       IF (PRESENT(temperature)) pexsi_options%options%temperature = temperature
     103              :       IF (PRESENT(gap)) pexsi_options%options%gap = gap
     104              :       IF (PRESENT(deltaE)) pexsi_options%options%deltaE = deltaE
     105              :       IF (PRESENT(numPole)) pexsi_options%options%numPole = numPole
     106              :       IF (PRESENT(isInertiaCount)) pexsi_options%options%isInertiaCount = isInertiaCount
     107              :       IF (PRESENT(maxPEXSIIter)) pexsi_options%options%maxPEXSIIter = maxPEXSIIter
     108              :       IF (PRESENT(muMin0)) pexsi_options%options%muMin0 = muMin0
     109              :       IF (PRESENT(muMax0)) pexsi_options%options%muMax0 = muMax0
     110              :       IF (PRESENT(mu0)) pexsi_options%options%mu0 = mu0
     111              :       IF (PRESENT(muInertiaTolerance)) &
     112              :          pexsi_options%options%muInertiaTolerance = muInertiaTolerance
     113              :       IF (PRESENT(muInertiaExpansion)) &
     114              :          pexsi_options%options%muInertiaExpansion = muInertiaExpansion
     115              :       IF (PRESENT(muPEXSISafeGuard)) &
     116              :          pexsi_options%options%muPEXSISafeGuard = muPEXSISafeGuard
     117              :       IF (PRESENT(numElectronPEXSITolerance)) &
     118              :          pexsi_options%options%numElectronPEXSITolerance = numElectronPEXSITolerance
     119              :       IF (PRESENT(matrixType)) pexsi_options%options%matrixType = matrixType
     120              :       IF (PRESENT(isSymbolicFactorize)) &
     121              :          pexsi_options%options%isSymbolicFactorize = isSymbolicFactorize
     122              :       IF (PRESENT(ordering)) pexsi_options%options%ordering = ordering
     123              :       IF (PRESENT(rowOrdering)) pexsi_options%options%rowOrdering = rowOrdering
     124              :       IF (PRESENT(npSymbFact)) pexsi_options%options%npSymbFact = npSymbFact
     125              :       IF (PRESENT(verbosity)) pexsi_options%options%verbosity = verbosity
     126              : #else
     127              :       MARK_USED(pexsi_options)
     128              :       MARK_USED(temperature)
     129              :       MARK_USED(gap)
     130              :       MARK_USED(deltaE)
     131              :       MARK_USED(numPole)
     132              :       MARK_USED(isInertiaCount)
     133              :       MARK_USED(maxPEXSIIter)
     134              :       MARK_USED(muMin0)
     135              :       MARK_USED(muMax0)
     136              :       MARK_USED(mu0)
     137              :       MARK_USED(muInertiaTolerance)
     138              :       MARK_USED(muInertiaExpansion)
     139              :       MARK_USED(muPEXSISafeGuard)
     140              :       MARK_USED(numElectronPEXSITolerance)
     141              :       MARK_USED(matrixType)
     142              :       MARK_USED(isSymbolicFactorize)
     143              :       MARK_USED(ordering)
     144              :       MARK_USED(rowOrdering)
     145              :       MARK_USED(npSymbFact)
     146              :       MARK_USED(verbosity)
     147            0 :       CPABORT("Requires linking to the PEXSI library.")
     148              : #endif
     149              : 
     150              :       ! Additional PEXSI parameters and their defaults not made available here
     151              :       ! because CP2K should always use PEXSI's defaults:
     152              :       ! isConstructCommPattern (=?, pexsi does not even use it)
     153              :       ! symmetric (=1)
     154              :       ! transpose (=0)
     155            0 :    END SUBROUTINE cp_pexsi_set_options
     156              : 
     157              : ! **************************************************************************************************
     158              : !> \brief Access PEXSI internal options
     159              : !> \param pexsi_options ...
     160              : !> \param temperature ...
     161              : !> \param gap ...
     162              : !> \param deltaE ...
     163              : !> \param numPole ...
     164              : !> \param isInertiaCount ...
     165              : !> \param maxPEXSIIter ...
     166              : !> \param muMin0 ...
     167              : !> \param muMax0 ...
     168              : !> \param mu0 ...
     169              : !> \param muInertiaTolerance ...
     170              : !> \param muInertiaExpansion ...
     171              : !> \param muPEXSISafeGuard ...
     172              : !> \param numElectronPEXSITolerance ...
     173              : !> \param matrixType ...
     174              : !> \param isSymbolicFactorize ...
     175              : !> \param ordering ...
     176              : !> \param rowOrdering ...
     177              : !> \param npSymbFact ...
     178              : !> \param verbosity ...
     179              : ! **************************************************************************************************
     180            0 :    SUBROUTINE cp_pexsi_get_options(pexsi_options, temperature, gap, deltaE, numPole, &
     181              :                                    isInertiaCount, maxPEXSIIter, muMin0, muMax0, mu0, &
     182              :                                    muInertiaTolerance, muInertiaExpansion, &
     183              :                                    muPEXSISafeGuard, numElectronPEXSITolerance, &
     184              :                                    matrixType, isSymbolicFactorize, ordering, rowOrdering, &
     185              :                                    npSymbFact, verbosity)
     186              :       TYPE(cp_pexsi_options), INTENT(IN)       :: pexsi_options
     187              :       REAL(KIND=real_8), INTENT(OUT), OPTIONAL :: temperature, gap, deltaE
     188              :       INTEGER, INTENT(OUT), OPTIONAL           :: numPole, isInertiaCount, &
     189              :                                                   maxPEXSIIter
     190              :       REAL(KIND=real_8), INTENT(OUT), OPTIONAL :: muMin0, muMax0, mu0, &
     191              :                                                   muInertiaTolerance, muInertiaExpansion, muPEXSISafeGuard, &
     192              :                                                   numElectronPEXSITolerance
     193              :       INTEGER, INTENT(OUT), OPTIONAL           :: matrixType, &
     194              :                                                   isSymbolicFactorize, &
     195              :                                                   ordering, rowOrdering, npSymbFact, &
     196              :                                                   verbosity
     197              : 
     198              : #if defined(__PEXSI)
     199              :       IF (PRESENT(temperature)) temperature = pexsi_options%options%temperature
     200              :       IF (PRESENT(gap)) gap = pexsi_options%options%gap
     201              :       IF (PRESENT(deltaE)) deltaE = pexsi_options%options%deltaE
     202              :       IF (PRESENT(numPole)) numPole = pexsi_options%options%numPole
     203              :       IF (PRESENT(isInertiaCount)) isInertiaCount = pexsi_options%options%isInertiaCount
     204              :       IF (PRESENT(maxPEXSIIter)) maxPEXSIIter = pexsi_options%options%maxPEXSIIter
     205              :       IF (PRESENT(muMin0)) muMin0 = pexsi_options%options%muMin0
     206              :       IF (PRESENT(muMax0)) muMax0 = pexsi_options%options%muMax0
     207              :       IF (PRESENT(mu0)) mu0 = pexsi_options%options%mu0
     208              :       IF (PRESENT(muInertiaTolerance)) &
     209              :          muInertiaTolerance = pexsi_options%options%muInertiaTolerance
     210              :       IF (PRESENT(muInertiaExpansion)) &
     211              :          muInertiaExpansion = pexsi_options%options%muInertiaExpansion
     212              :       IF (PRESENT(muPEXSISafeGuard)) &
     213              :          muPEXSISafeGuard = pexsi_options%options%muPEXSISafeGuard
     214              :       IF (PRESENT(numElectronPEXSITolerance)) &
     215              :          numElectronPEXSITolerance = pexsi_options%options%numElectronPEXSITolerance
     216              :       IF (PRESENT(matrixType)) matrixType = pexsi_options%options%matrixType
     217              :       IF (PRESENT(isSymbolicFactorize)) &
     218              :          isSymbolicFactorize = pexsi_options%options%isSymbolicFactorize
     219              :       IF (PRESENT(ordering)) ordering = pexsi_options%options%ordering
     220              :       IF (PRESENT(rowOrdering)) rowOrdering = pexsi_options%options%rowOrdering
     221              :       IF (PRESENT(npSymbFact)) npSymbFact = pexsi_options%options%npSymbFact
     222              :       IF (PRESENT(verbosity)) verbosity = pexsi_options%options%verbosity
     223              : #else
     224              :       MARK_USED(pexsi_options)
     225              :       ! assign intent-out arguments to silence compiler warnings
     226            0 :       IF (PRESENT(temperature)) temperature = 0.0_real_8
     227            0 :       IF (PRESENT(gap)) gap = 0.0_real_8
     228            0 :       IF (PRESENT(deltaE)) deltaE = 0.0_real_8
     229            0 :       IF (PRESENT(numPole)) numPole = -1
     230            0 :       IF (PRESENT(isInertiaCount)) isInertiaCount = -1
     231            0 :       IF (PRESENT(maxPEXSIIter)) maxPEXSIIter = -1
     232            0 :       IF (PRESENT(muMin0)) muMin0 = 0.0_real_8
     233            0 :       IF (PRESENT(muMax0)) muMax0 = 0.0_real_8
     234            0 :       IF (PRESENT(mu0)) mu0 = 0.0_real_8
     235            0 :       IF (PRESENT(muInertiaTolerance)) muInertiaTolerance = 0.0_real_8
     236            0 :       IF (PRESENT(muInertiaExpansion)) muInertiaExpansion = 0.0_real_8
     237            0 :       IF (PRESENT(muPEXSISafeGuard)) muPEXSISafeGuard = 0.0_real_8
     238            0 :       IF (PRESENT(numElectronPEXSITolerance)) numElectronPEXSITolerance = 0.0_real_8
     239            0 :       IF (PRESENT(matrixType)) matrixType = -1
     240            0 :       IF (PRESENT(isSymbolicFactorize)) isSymbolicFactorize = -1
     241            0 :       IF (PRESENT(ordering)) ordering = -1
     242            0 :       IF (PRESENT(rowOrdering)) rowOrdering = -1
     243            0 :       IF (PRESENT(npSymbFact)) npSymbFact = -1
     244            0 :       IF (PRESENT(verbosity)) verbosity = -1
     245            0 :       CPABORT("Requires linking to the PEXSI library.")
     246              : #endif
     247            0 :    END SUBROUTINE cp_pexsi_get_options
     248              : 
     249              : ! **************************************************************************************************
     250              : !> \brief ...
     251              : !> \param pexsi_options ...
     252              : ! **************************************************************************************************
     253            0 :    SUBROUTINE cp_pexsi_set_default_options(pexsi_options)
     254              :       TYPE(cp_pexsi_options), INTENT(OUT)      :: pexsi_options
     255              : 
     256              : #if defined(__PEXSI)
     257              :       CALL f_ppexsi_set_default_options(pexsi_options%options)
     258              : #else
     259            0 :       CPABORT("Requires linking to the PEXSI library.")
     260              : #endif
     261            0 :    END SUBROUTINE cp_pexsi_set_default_options
     262              : 
     263              : ! **************************************************************************************************
     264              : !> \brief ...
     265              : !> \param comm ...
     266              : !> \param numProcRow ...
     267              : !> \param numProcCol ...
     268              : !> \param outputFileIndex ...
     269              : !> \return ...
     270              : ! **************************************************************************************************
     271            0 :    FUNCTION cp_pexsi_plan_initialize(comm, numProcRow, numProcCol, outputFileIndex)
     272              :       TYPE(mp_comm_type), INTENT(IN) :: comm
     273              :       INTEGER, INTENT(IN)                      :: numProcRow, numProcCol, &
     274              :                                                   outputFileIndex
     275              :       INTEGER(KIND=C_INTPTR_T)                 :: cp_pexsi_plan_initialize
     276              : 
     277              : #if defined(__PEXSI)
     278              :       CHARACTER(LEN=*), PARAMETER              :: routineN = 'cp_pexsi_plan_initialize'
     279              :       INTEGER                                  :: info, handle
     280              : 
     281              :       CALL timeset(routineN, handle)
     282              :       cp_pexsi_plan_initialize = f_ppexsi_plan_initialize(comm%get_handle(), numProcRow, &
     283              :                                                           numProcCol, outputFileIndex, info)
     284              :       IF (info /= 0) &
     285              :          CPABORT("Pexsi returned an error. Consider logPEXSI0 for details.")
     286              :       CALL timestop(handle)
     287              : #else
     288              :       MARK_USED(comm)
     289              :       MARK_USED(numProcRow)
     290              :       MARK_USED(numProcCol)
     291              :       MARK_USED(outputFileIndex)
     292            0 :       cp_pexsi_plan_initialize = 0
     293            0 :       CPABORT("Requires linking to the PEXSI library.")
     294              : #endif
     295            0 :    END FUNCTION cp_pexsi_plan_initialize
     296              : 
     297              : ! **************************************************************************************************
     298              : !> \brief ...
     299              : !> \param plan ...
     300              : !> \param pexsi_options ...
     301              : !> \param nrows ...
     302              : !> \param nnz ...
     303              : !> \param nnzLocal ...
     304              : !> \param numColLocal ...
     305              : !> \param colptrLocal ...
     306              : !> \param rowindLocal ...
     307              : !> \param HnzvalLocal ...
     308              : !> \param isSIdentity ...
     309              : !> \param SnzvalLocal ...
     310              : ! **************************************************************************************************
     311            0 :    SUBROUTINE cp_pexsi_load_real_hs_matrix(plan, pexsi_options, nrows, nnz, &
     312              :                                            nnzLocal, numColLocal, colptrLocal, &
     313              :                                            rowindLocal, HnzvalLocal, isSIdentity, &
     314              :                                            SnzvalLocal)
     315              :       INTEGER(KIND=C_INTPTR_T), INTENT(IN)     :: plan
     316              :       TYPE(cp_pexsi_options), INTENT(IN)       :: pexsi_options
     317              :       INTEGER, INTENT(IN)                      :: nrows, nnz, nnzLocal, &
     318              :                                                   numColLocal, colptrLocal(*), &
     319              :                                                   rowindLocal(*)
     320              :       REAL(KIND=real_8), INTENT(IN)            :: HnzvalLocal(*)
     321              :       INTEGER, INTENT(IN)                      :: isSIdentity
     322              :       REAL(KIND=real_8), INTENT(IN)            :: SnzvalLocal(*)
     323              : 
     324              : #if defined(__PEXSI)
     325              :       CHARACTER(LEN=*), PARAMETER              :: routineN = 'cp_pexsi_load_real_symmetric_hs_matrix'
     326              :       INTEGER                                  :: handle, info
     327              : 
     328              :       CALL timeset(routineN, handle)
     329              :       CALL f_ppexsi_load_real_hs_matrix(plan, pexsi_options%options, nrows, nnz, nnzLocal, &
     330              :                                         numColLocal, colptrLocal, rowindLocal, &
     331              :                                         HnzvalLocal, isSIdentity, SnzvalLocal, info)
     332              :       IF (info /= 0) &
     333              :          CPABORT("Pexsi returned an error. Consider logPEXSI0 for details.")
     334              :       CALL timestop(handle)
     335              : #else
     336              :       MARK_USED(plan)
     337              :       MARK_USED(pexsi_options)
     338              :       MARK_USED(nrows)
     339              :       MARK_USED(nnz)
     340              :       MARK_USED(nnzLocal)
     341              :       MARK_USED(numColLocal)
     342              :       MARK_USED(isSIdentity)
     343            0 :       CPABORT("Requires linking to the PEXSI library.")
     344              : 
     345              :       ! MARK_USED macro does not work on assumed shape variables
     346              :       IF (.FALSE.) THEN; DO
     347              :             IF (colptrLocal(1) > rowindLocal(1) .OR. HnzvalLocal(1) > SnzvalLocal(1)) EXIT
     348              :          END DO; END IF
     349              : #endif
     350            0 :    END SUBROUTINE cp_pexsi_load_real_hs_matrix
     351              : 
     352              : ! **************************************************************************************************
     353              : !> \brief ...
     354              : !> \param plan ...
     355              : !> \param pexsi_options ...
     356              : !> \param numElectronExact ...
     357              : !> \param muPEXSI ...
     358              : !> \param numElectronPEXSI ...
     359              : !> \param muMinInertia ...
     360              : !> \param muMaxInertia ...
     361              : !> \param numTotalInertiaIter ...
     362              : !> \param numTotalPEXSIIter ...
     363              : ! **************************************************************************************************
     364            0 :    SUBROUTINE cp_pexsi_dft_driver(plan, pexsi_options, numElectronExact, muPEXSI, &
     365              :                                   numElectronPEXSI, muMinInertia, muMaxInertia, &
     366              :                                   numTotalInertiaIter, numTotalPEXSIIter)
     367              :       INTEGER(KIND=C_INTPTR_T), INTENT(IN)     :: plan
     368              :       TYPE(cp_pexsi_options), INTENT(IN)       :: pexsi_options
     369              :       REAL(KIND=real_8), INTENT(IN)            :: numElectronExact
     370              :       REAL(KIND=real_8), INTENT(out)           :: muPEXSI, numElectronPEXSI, &
     371              :                                                   muMinInertia, muMaxInertia
     372              :       INTEGER, INTENT(out)                     :: numTotalInertiaIter, &
     373              :                                                   numTotalPEXSIIter
     374              : 
     375              : #if defined(__PEXSI)
     376              :       CHARACTER(LEN=*), PARAMETER              :: routineN = 'cp_pexsi_dft_driver'
     377              :       INTEGER                                  :: handle, info
     378              : #if defined(__HAS_IEEE_EXCEPTIONS)
     379              :       LOGICAL, DIMENSION(5)                    :: halt
     380              : #endif
     381              : 
     382              :       CALL timeset(routineN, handle)
     383              : 
     384              :       ! Unfortuntatelly, some PEXSI kernels raise IEEE754 exceptions.
     385              :       ! Therefore, we disable floating point traps temporarily.
     386              : #if defined(__HAS_IEEE_EXCEPTIONS)
     387              :       CALL ieee_get_halting_mode(IEEE_ALL, halt)
     388              :       CALL ieee_set_halting_mode(IEEE_ALL, .FALSE.)
     389              : #endif
     390              : 
     391              :       CALL f_ppexsi_dft_driver(plan, pexsi_options%options, numElectronExact, muPEXSI, &
     392              :                                numElectronPEXSI, muMinInertia, muMaxInertia, &
     393              :                                numTotalInertiaIter, numTotalPEXSIIter, info)
     394              : 
     395              : #if defined(__HAS_IEEE_EXCEPTIONS)
     396              :       CALL ieee_set_halting_mode(IEEE_ALL, halt)
     397              : #endif
     398              : 
     399              :       IF (info /= 0) &
     400              :          CPABORT("Pexsi returned an error. Consider logPEXSI0 for details.")
     401              :       CALL timestop(handle)
     402              : #else
     403              :       MARK_USED(plan)
     404              :       MARK_USED(numelectronexact)
     405              :       MARK_USED(pexsi_options)
     406              :       ! assign intent-out arguments to silence compiler warnings
     407            0 :       muPEXSI = 0.0_real_8
     408            0 :       numElectronPEXSI = 0.0_real_8
     409            0 :       muMinInertia = 0.0_real_8
     410            0 :       muMaxInertia = 0.0_real_8
     411            0 :       numTotalInertiaIter = -1
     412            0 :       numTotalPEXSIIter = -1
     413            0 :       CPABORT("Requires linking to the PEXSI library.")
     414              : #endif
     415            0 :    END SUBROUTINE cp_pexsi_dft_driver
     416              : 
     417              : ! **************************************************************************************************
     418              : !> \brief ...
     419              : !> \param plan ...
     420              : !> \param DMnzvalLocal ...
     421              : !> \param EDMnzvalLocal ...
     422              : !> \param FDMnzvalLocal ...
     423              : !> \param totalEnergyH ...
     424              : !> \param totalEnergyS ...
     425              : !> \param totalFreeEnergy ...
     426              : ! **************************************************************************************************
     427            0 :    SUBROUTINE cp_pexsi_retrieve_real_dft_matrix(plan, DMnzvalLocal, EDMnzvalLocal, &
     428              :                                                 FDMnzvalLocal, totalEnergyH, &
     429              :                                                 totalEnergyS, totalFreeEnergy)
     430              :       INTEGER(KIND=C_INTPTR_T), INTENT(IN)     :: plan
     431              :       REAL(KIND=real_8), INTENT(out)           :: DMnzvalLocal(*), EDMnzvalLocal(*), &
     432              :                                                   FDMnzvalLocal(*), totalEnergyH, totalEnergyS, &
     433              :                                                   totalFreeEnergy
     434              : 
     435              : #if defined(__PEXSI)
     436              :       CHARACTER(LEN=*), PARAMETER              :: routineN = 'cp_pexsi_retrieve_real_symmetric_dft_matrix'
     437              :       INTEGER                                  :: handle, info
     438              : 
     439              :       CALL timeset(routineN, handle)
     440              :       CALL f_ppexsi_retrieve_real_dft_matrix(plan, DMnzvalLocal, EDMnzvalLocal, &
     441              :                                              FDMnzvalLocal, totalEnergyH, &
     442              :                                              totalEnergyS, totalFreeEnergy, info)
     443              :       IF (info /= 0) &
     444              :          CPABORT("Pexsi returned an error. Consider logPEXSI0 for details.")
     445              :       CALL timestop(handle)
     446              : #else
     447              :       MARK_USED(plan)
     448              :       ! assign intent-out arguments to silence compiler warnings
     449            0 :       DMnzvalLocal(1) = 0.0_real_8
     450            0 :       EDMnzvalLocal(1) = 0.0_real_8
     451            0 :       FDMnzvalLocal(1) = 0.0_real_8
     452            0 :       totalEnergyH = 0.0_real_8
     453            0 :       totalEnergyS = 0.0_real_8
     454            0 :       totalFreeEnergy = 0.0_real_8
     455              : 
     456            0 :       CPABORT("Requires linking to the PEXSI library.")
     457              : #endif
     458            0 :    END SUBROUTINE cp_pexsi_retrieve_real_dft_matrix
     459              : 
     460              : ! **************************************************************************************************
     461              : !> \brief ...
     462              : !> \param plan ...
     463              : ! **************************************************************************************************
     464            0 :    SUBROUTINE cp_pexsi_plan_finalize(plan)
     465              :       INTEGER(KIND=C_INTPTR_T), INTENT(IN)     :: plan
     466              : 
     467              : #if defined(__PEXSI)
     468              :       CHARACTER(LEN=*), PARAMETER              :: routineN = 'cp_pexsi_plan_finalize'
     469              :       INTEGER                                  :: info, handle
     470              : 
     471              :       CALL timeset(routineN, handle)
     472              :       CALL f_ppexsi_plan_finalize(plan, info)
     473              :       IF (info /= 0) &
     474              :          CPABORT("Pexsi returned an error. Consider logPEXSI0 for details.")
     475              :       CALL timestop(handle)
     476              : #else
     477              :       MARK_USED(plan)
     478            0 :       CPABORT("Requires linking to the PEXSI library.")
     479              : #endif
     480            0 :    END SUBROUTINE cp_pexsi_plan_finalize
     481              : 
     482            0 : END MODULE pexsi_interface
        

Generated by: LCOV version 2.0-1