LCOV - code coverage report
Current view: top level - src - ace_wrapper.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:dc5a454) Lines: 20 22 90.9 %
Date: 2025-06-17 07:40:17 Functions: 3 5 60.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 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
      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
     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             :       MARK_USED(ntypec)
     185             :       MARK_USED(symbolc)
     186             :       MARK_USED(fname)
     187             :       MARK_USED(rcutc)
     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 1.15