(git:32ddf85)
Loading...
Searching...
No Matches
ace_wrapper.F
Go to the documentation of this file.
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
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
25
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
96CONTAINS
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 SUBROUTINE ace_model_compute(natomc, nghostc, neic, neiatc, originc, nlistc, &
114 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 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 END SUBROUTINE
148
149! **************************************************************************************************
150!> \brief ...
151!> \param ntypec ...
152!> \param symbolc ...
153!> \param fname ...
154!> \param rcutc ...
155!> \param model ...
156! **************************************************************************************************
157 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 CHARACTER(KIND=C_CHAR), DIMENSION(LEN(fname) + 1) :: cname
170 INTEGER :: i, nlen
171
172 nlen = len(fname)
173 DO i = 1, nlen
174 cname(i) = fname(i:i)
175 END DO
176 nlen = nlen + 1
177 cname(nlen) = c_null_char
178 CALL acepotinitialize(ntypec, symbolc, nlen, cname, rcutc, model%c_ptr)
179 ALLOCATE (model%symbolc(ntypec))
180 DO i = 1, ntypec
181 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 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 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 CALL acepotfinalize(model%c_ptr)
204 model%c_ptr = c_null_ptr
205 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 END SUBROUTINE ace_model_release
212
213END MODULE ace_wrapper
214
Interface to ACE C wrapper.
Definition ace_wrapper.F:12
subroutine, public ace_model_compute(natomc, nghostc, neic, neiatc, originc, nlistc, attypec, atposc, forcec, virialc, energyc, model)
...
subroutine, public ace_model_initialize(ntypec, symbolc, fname, rcutc, model)
...
subroutine, public ace_model_release(model)
Releases an ACE model and all its ressources.