(git:d18deda)
Loading...
Searching...
No Matches
deepmd_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 the DeePMD-kit or a c++ wrapper.
10!> \par History
11!> 07.2019 created [Yongbin Zhuang]
12!> 06.2021 refactored [Yunpei Liu]
13!> 10.2023 adapt to DeePMD-kit C Interface [Yunpei Liu]
14!> \author Yongbin Zhuang
15! **************************************************************************************************
16
18 USE iso_c_binding, ONLY: c_associated,&
19 c_char,&
20 c_double,&
21 c_f_pointer,&
22 c_int,&
23 c_null_char,&
24 c_null_ptr,&
25 c_ptr
26 USE kinds, ONLY: default_string_length,&
27 dp
28#include "./base/base_uses.f90"
29
30 IMPLICIT NONE
31 PRIVATE
33
35 PRIVATE
36 TYPE(C_PTR) :: c_ptr = c_null_ptr
37 END TYPE deepmd_model_type
38
39CONTAINS
40
41! **************************************************************************************************
42!> \brief Load DP from a model file.
43!> \param filename Path to the model file.
44!> \return Pointer to the DP model.
45! **************************************************************************************************
46 FUNCTION deepmd_model_load(filename) RESULT(model)
47 CHARACTER(len=*), INTENT(IN) :: filename
48 TYPE(deepmd_model_type) :: model
49
50 CHARACTER(LEN=*), PARAMETER :: routinen = 'deepmd_model_load'
51
52 CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(:), &
53 POINTER :: error_f_ptr
54 CHARACTER(LEN=default_string_length) :: error_str
55 INTEGER :: handle, i
56 TYPE(c_ptr) :: error_c_ptr
57 INTERFACE
58 FUNCTION newdeeppot(filename) BIND(C, name="DP_NewDeepPot")
59 IMPORT :: c_ptr, c_char
60 CHARACTER(kind=C_CHAR), DIMENSION(*) :: filename
61 TYPE(c_ptr) :: newdeeppot
62 END FUNCTION
63 END INTERFACE
64 INTERFACE
65 FUNCTION deeppotcheckok(model) BIND(C, name="DP_DeepPotCheckOK")
66 IMPORT :: c_ptr
67 TYPE(c_ptr), VALUE :: model
68 TYPE(c_ptr) :: deeppotcheckok
69 END FUNCTION deeppotcheckok
70 END INTERFACE
71 INTERFACE
72 SUBROUTINE deletechar(ptr) BIND(C, name="DP_DeleteChar")
73 IMPORT :: c_ptr
74 TYPE(c_ptr), VALUE :: ptr
75 END SUBROUTINE deletechar
76 END INTERFACE
77
78 CALL timeset(routinen, handle)
79
80#if defined(__DEEPMD)
81 cpassert(.NOT. c_associated(model%c_ptr))
82 model%c_ptr = newdeeppot(filename=trim(filename)//c_null_char)
83 cpassert(c_associated(model%c_ptr))
84
85 ! Check for errors.
86 error_c_ptr = deeppotcheckok(model%c_ptr)
87 cpassert(c_associated(error_c_ptr))
88 CALL c_f_pointer(error_c_ptr, error_f_ptr, shape=(/default_string_length/))
89 error_str = ""
90 DO i = 1, default_string_length
91 IF (error_f_ptr(i) == c_null_char) EXIT
92 error_str(i:i) = error_f_ptr(i)
93 END DO
94 CALL deletechar(error_c_ptr)
95 IF (len_trim(error_str) > 0) cpabort(trim(error_str))
96#else
97 cpabort("CP2K was compiled without libdeepmd_c library.")
98 mark_used(filename)
99 mark_used(model)
100 mark_used(i)
101 mark_used(error_str)
102 mark_used(error_c_ptr)
103 mark_used(error_f_ptr)
104#endif
105
106 CALL timestop(handle)
107 END FUNCTION deepmd_model_load
108
109! **************************************************************************************************
110!> \brief Compute energy, force and virial from DP.
111!> \param model Pointer to the DP model.
112!> \param natom Number of atoms.
113!> \param coord Coordinates of the atoms.
114!> \param atype Atom types.
115!> \param cell Cell vectors.
116!> \param energy Potential energy.
117!> \param force Forces.
118!> \param virial Virial tensor.
119!> \param atomic_energy Atomic energies.
120!> \param atomic_virial Atomic virial tensors.
121! **************************************************************************************************
122 SUBROUTINE deepmd_model_compute(model, natom, coord, atype, cell, energy, force, virial, &
123 atomic_energy, atomic_virial)
124 TYPE(deepmd_model_type) :: model
125 INTEGER :: natom
126 REAL(kind=dp), DIMENSION(natom, 3), INTENT(IN) :: coord
127 INTEGER, DIMENSION(natom), INTENT(IN) :: atype
128 REAL(kind=dp), DIMENSION(9), INTENT(IN) :: cell
129 REAL(kind=dp), INTENT(OUT) :: energy
130 REAL(kind=dp), DIMENSION(natom, 3), INTENT(OUT) :: force
131 REAL(kind=dp), DIMENSION(9), INTENT(OUT) :: virial
132 REAL(kind=dp), DIMENSION(natom), INTENT(OUT) :: atomic_energy
133 REAL(kind=dp), DIMENSION(natom, 9), INTENT(OUT) :: atomic_virial
134
135 CHARACTER(LEN=*), PARAMETER :: routinen = 'deepmd_model_compute'
136
137 INTEGER :: handle
138 INTERFACE
139 SUBROUTINE deeppotcompute(model, natom, coord, atype, cell, energy, force, virial, &
140 atomic_energy, atomic_virial) BIND(C, name="DP_DeepPotCompute")
141 IMPORT :: c_ptr, c_int, c_double
142 TYPE(c_ptr), VALUE :: model
143 INTEGER(C_INT), VALUE :: natom
144 REAL(c_double), DIMENSION(natom, 3) :: coord
145 INTEGER(C_INT), DIMENSION(natom) :: atype
146 REAL(c_double), DIMENSION(9) :: cell
147 REAL(c_double) :: energy
148 REAL(c_double), DIMENSION(natom, 3) :: force
149 REAL(c_double), DIMENSION(9) :: virial
150 REAL(c_double), DIMENSION(natom) :: atomic_energy
151 REAL(c_double), DIMENSION(natom, 9) :: atomic_virial
152 END SUBROUTINE
153 END INTERFACE
154
155 CALL timeset(routinen, handle)
156
157#if defined(__DEEPMD)
158 cpassert(c_associated(model%c_ptr))
159 CALL deeppotcompute(model=model%c_ptr, &
160 natom=natom, &
161 coord=coord, &
162 atype=atype, &
163 cell=cell, &
164 energy=energy, &
165 force=force, &
166 virial=virial, &
167 atomic_energy=atomic_energy, &
168 atomic_virial=atomic_virial)
169#else
170 cpabort("CP2K was compiled without libdeepmd_c library.")
171 mark_used(model)
172 mark_used(natom)
173 mark_used(coord)
174 mark_used(atype)
175 mark_used(cell)
176 energy = 0.0_dp
177 force = 0.0_dp
178 virial = 0.0_dp
179 atomic_energy = 0.0_dp
180 atomic_virial = 0.0_dp
181#endif
182
183 CALL timestop(handle)
184 END SUBROUTINE
185
186! **************************************************************************************************
187!> \brief Releases a deepmd model and all its ressources.
188!> \param model Pointer to the DP model.
189! **************************************************************************************************
190 SUBROUTINE deepmd_model_release(model)
191 TYPE(deepmd_model_type) :: model
192
193 CHARACTER(LEN=*), PARAMETER :: routinen = 'deepmd_model_release'
194
195 INTEGER :: handle
196 INTERFACE
197 SUBROUTINE deletedeeppot(model) BIND(C, name="DP_DeleteDeepPot")
198 IMPORT :: c_ptr
199 TYPE(c_ptr), VALUE :: model
200 END SUBROUTINE deletedeeppot
201 END INTERFACE
202
203 CALL timeset(routinen, handle)
204
205#if defined(__DEEPMD)
206 cpassert(c_associated(model%c_ptr))
207 CALL deletedeeppot(model%c_ptr)
208 model%c_ptr = c_null_ptr
209#else
210 cpabort("CP2K was compiled without libdeepmd_c library.")
211 mark_used(model)
212#endif
213
214 CALL timestop(handle)
215 END SUBROUTINE deepmd_model_release
216
217END MODULE deepmd_wrapper
Interface to the DeePMD-kit or a c++ wrapper.
type(deepmd_model_type) function, public deepmd_model_load(filename)
Load DP from a model file.
subroutine, public deepmd_model_release(model)
Releases a deepmd model and all its ressources.
subroutine, public deepmd_model_compute(model, natom, coord, atype, cell, energy, force, virial, atomic_energy, atomic_virial)
Compute energy, force and virial from DP.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57