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 :
|