LCOV - code coverage report
Current view: top level - src - ace_wrapper.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 90.9 % 22 20
Test Date: 2025-12-04 06:27:48 Functions: 60.0 % 5 3

            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 ACE C wrapper.
      10              : ! **************************************************************************************************
      11              : 
      12              : MODULE ace_wrapper
      13              :    USE ISO_C_BINDING,                   ONLY: C_CHAR,&
      14              :                                               C_DOUBLE,&
      15              :                                               C_INT,&
      16              :                                               C_NULL_CHAR,&
      17              :                                               C_NULL_PTR,&
      18              :                                               C_PTR
      19              : #include "./base/base_uses.f90"
      20              : 
      21              :    IMPLICIT NONE
      22              : 
      23              :    PRIVATE
      24              :    PUBLIC :: ace_model_type, ace_model_compute, ace_model_initialize, ace_model_release
      25              : 
      26              :    TYPE ace_model_type
      27              :       TYPE(C_PTR)                                 :: c_ptr = C_NULL_PTR
      28              :       CHARACTER(LEN=2), DIMENSION(:), ALLOCATABLE :: symbolc
      29              :    END TYPE ace_model_type
      30              : 
      31              :    INTERFACE ace_interface
      32              : ! **************************************************************************************************
      33              : !> \brief ...
      34              : !> \param natomc ...
      35              : !> \param nghostc ...
      36              : !> \param neic ...
      37              : !> \param neiatc ...
      38              : !> \param originc ...
      39              : !> \param nlistc ...
      40              : !> \param attypec ...
      41              : !> \param atposc ...
      42              : !> \param forcec ...
      43              : !> \param virialc ...
      44              : !> \param energyc ...
      45              : !> \param acedata_ptr ...
      46              : ! **************************************************************************************************
      47              :       SUBROUTINE AcePotCompute(natomc, nghostc, neic, neiatc, originc, nlistc, &
      48              :                                attypec, atposc, forcec, virialc, energyc, &
      49              :                                acedata_ptr) BIND(C, NAME="AcePotCompute")
      50              : 
      51              :          IMPORT :: C_PTR, C_INT, C_DOUBLE
      52              :          INTEGER(C_INT), VALUE                                           :: natomc
      53              :          INTEGER(C_INT), VALUE                                           :: nghostc
      54              :          INTEGER(C_INT), VALUE                                           :: neic
      55              :          INTEGER(C_INT), DIMENSION(0:natomc)                             :: neiatc
      56              :          INTEGER(C_INT), DIMENSION(1:nghostc)                            :: originc
      57              :          INTEGER(C_INT), DIMENSION(1:neic)                               :: nlistc
      58              :          INTEGER(C_INT), DIMENSION(1:natomc + nghostc)                   :: attypec
      59              :          REAL(C_DOUBLE), DIMENSION(1:3*(natomc + nghostc))               :: atposc
      60              :          REAL(C_DOUBLE), DIMENSION(1:3*natomc)                           :: forcec
      61              :          REAL(C_DOUBLE), DIMENSION(1:6)                                  :: virialc
      62              :          REAL(C_DOUBLE), DIMENSION(1:natomc)                             :: energyc
      63              :          TYPE(C_PTR)                                                     :: acedata_ptr
      64              :       END SUBROUTINE AcePotCompute
      65              : ! **************************************************************************************************
      66              : !> \brief ...
      67              : !> \param ntypec ...
      68              : !> \param symbolc ...
      69              : !> \param nlen ...
      70              : !> \param cname ...
      71              : !> \param rcutc ...
      72              : !> \param acedata_ptr ...
      73              : ! **************************************************************************************************
      74              :       SUBROUTINE AcePotInitialize(ntypec, symbolc, nlen, cname, rcutc, &
      75              :                                   acedata_ptr) BIND(C, NAME="AcePotInitialize")
      76              :          USE ISO_C_BINDING, ONLY: C_CHAR, C_INT, C_DOUBLE, C_PTR
      77              :       INTEGER(C_INT), VALUE                              :: ntypec
      78              :       CHARACTER(KIND=C_CHAR, LEN=1), DIMENSION(*)        :: symbolc
      79              :       INTEGER(C_INT), VALUE                              :: nlen
      80              :       CHARACTER(KIND=C_CHAR, LEN=1), DIMENSION(*)        :: cname
      81              :       REAL(C_DOUBLE), DIMENSION(1:ntypec, 1:ntypec)      :: rcutc
      82              :       TYPE(C_PTR)                                        :: acedata_ptr
      83              : 
      84              :       END SUBROUTINE AcePotInitialize
      85              : ! **************************************************************************************************
      86              : !> \brief ...
      87              : !> \param acedata_ptr ...
      88              : ! **************************************************************************************************
      89              :       SUBROUTINE AcePotFinalize(acedata_ptr) BIND(C, NAME="AcePotFinalize")
      90              :          USE ISO_C_BINDING, ONLY: C_PTR
      91              :       TYPE(C_PTR)                                        :: acedata_ptr
      92              : 
      93              :       END SUBROUTINE AcePotFinalize
      94              :    END INTERFACE ace_interface
      95              : 
      96              : CONTAINS
      97              : 
      98              : ! **************************************************************************************************
      99              : !> \brief ...
     100              : !> \param natomc ...
     101              : !> \param nghostc ...
     102              : !> \param neic ...
     103              : !> \param neiatc ...
     104              : !> \param originc ...
     105              : !> \param nlistc ...
     106              : !> \param attypec ...
     107              : !> \param atposc ...
     108              : !> \param forcec ...
     109              : !> \param virialc ...
     110              : !> \param energyc ...
     111              : !> \param model ...
     112              : ! **************************************************************************************************
     113          206 :    SUBROUTINE ace_model_compute(natomc, nghostc, neic, neiatc, originc, nlistc, &
     114          206 :                                 attypec, atposc, forcec, virialc, energyc, model)
     115              : 
     116              :       INTEGER                                            :: natomc, nghostc, neic
     117              :       INTEGER, DIMENSION(0:natomc), INTENT(IN)           :: neiatc
     118              :       INTEGER, DIMENSION(1:nghostc), INTENT(IN)          :: originc
     119              :       INTEGER, DIMENSION(1:neic), INTENT(IN)             :: nlistc
     120              :       INTEGER, DIMENSION(1:natomc + nghostc), INTENT(IN) :: attypec
     121              :       REAL(KIND=8), DIMENSION(1:3*(natomc + nghostc)), &
     122              :          INTENT(IN)                                      :: atposc
     123              :       REAL(KIND=8), DIMENSION(1:3*natomc), INTENT(INOUT) :: forcec
     124              :       REAL(KIND=8), DIMENSION(1:6), INTENT(INOUT)        :: virialc
     125              :       REAL(KIND=8), DIMENSION(1:natomc), INTENT(INOUT)   :: energyc
     126              :       TYPE(ace_model_type), INTENT(IN)                   :: model
     127              : 
     128              : #if defined(__ACE)
     129              : 
     130              :       CALL AcePotCompute(natomc, nghostc, neic, neiatc, originc, nlistc, attypec, &
     131          206 :                          atposc, forcec, virialc, energyc, model%c_ptr)
     132              : #else
     133              :       MARK_USED(natomc)
     134              :       MARK_USED(nghostc)
     135              :       MARK_USED(neic)
     136              :       MARK_USED(neiatc)
     137              :       MARK_USED(originc)
     138              :       MARK_USED(nlistc)
     139              :       MARK_USED(attypec)
     140              :       MARK_USED(atposc)
     141              :       MARK_USED(forcec)
     142              :       MARK_USED(virialc)
     143              :       MARK_USED(energyc)
     144              :       MARK_USED(model)
     145              :       CPABORT("CP2K was compiled without ACE library.")
     146              : #endif
     147          206 :    END SUBROUTINE ace_model_compute
     148              : 
     149              : ! **************************************************************************************************
     150              : !> \brief ...
     151              : !> \param ntypec ...
     152              : !> \param symbolc ...
     153              : !> \param fname ...
     154              : !> \param rcutc ...
     155              : !> \param model ...
     156              : ! **************************************************************************************************
     157            0 :    SUBROUTINE ace_model_initialize(ntypec, symbolc, fname, rcutc, model)
     158              :       USE ISO_C_BINDING, ONLY: C_CHAR, C_NULL_CHAR
     159              :       INTEGER, INTENT(IN)                                :: ntypec
     160              :       CHARACTER(KIND=C_CHAR, LEN=2), &
     161              :          DIMENSION(1:ntypec), INTENT(IN)                 :: symbolc
     162              :       CHARACTER(KIND=C_CHAR, LEN=*), INTENT(IN)          :: fname
     163              :       REAL(KIND=8), DIMENSION(1:ntypec, 1:ntypec), &
     164              :          INTENT(OUT)                                     :: rcutc
     165              :       TYPE(ace_model_type), INTENT(OUT)                  :: model
     166              : 
     167              : #if defined(__ACE)
     168              : 
     169            6 :       CHARACTER(KIND=C_CHAR), DIMENSION(LEN(fname) + 1)  :: cname
     170              :       INTEGER                                            :: i, nlen
     171              : 
     172            6 :       nlen = LEN(fname)
     173          156 :       DO i = 1, nlen
     174          156 :          cname(i) = fname(i:i)
     175              :       END DO
     176            6 :       nlen = nlen + 1
     177            6 :       cname(nlen) = C_NULL_CHAR
     178            6 :       CALL AcePotInitialize(ntypec, symbolc, nlen, cname, rcutc, model%c_ptr)
     179           12 :       ALLOCATE (model%symbolc(ntypec))
     180           18 :       DO i = 1, ntypec
     181           18 :          model%symbolc(i) = symbolc(i)
     182              :       END DO
     183              : #else
     184              :       rcutc = 0
     185              :       MARK_USED(ntypec)
     186              :       MARK_USED(symbolc)
     187              :       MARK_USED(fname)
     188              :       MARK_USED(model)
     189              :       CPABORT("CP2K was compiled without ACE library.")
     190              : #endif
     191            6 :    END SUBROUTINE ace_model_initialize
     192              : 
     193              : !**************************************************************************************************
     194              : !> \brief Releases an ACE model and all its ressources.
     195              : !> \param model Pointer to the ACE model.
     196              : ! **************************************************************************************************
     197            6 :    SUBROUTINE ace_model_release(model)
     198              :       USE ISO_C_BINDING, ONLY: C_NULL_PTR
     199              :       TYPE(ace_model_type), INTENT(INOUT)                :: model
     200              : 
     201              : #if defined(__ACE)
     202              : 
     203            6 :       CALL AcePotFinalize(model%c_ptr)
     204            6 :       model%c_ptr = C_NULL_PTR
     205            6 :       IF (ALLOCATED(model%symbolc)) DEALLOCATE (model%symbolc)
     206              : #else
     207              :       MARK_USED(model)
     208              :       CPABORT("CP2K was compiled without ACE library.")
     209              : #endif
     210              : 
     211            6 :    END SUBROUTINE ace_model_release
     212              : 
     213            0 : END MODULE ace_wrapper
     214              : 
        

Generated by: LCOV version 2.0-1