25 pair_potential_pp_type,&
26 pair_potential_single_type
30 #include "./base/base_uses.f90"
37 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'manybody_deepmd'
53 TYPE(particle_type),
POINTER :: particle_set(:)
54 TYPE(cell_type),
POINTER :: cell
55 TYPE(atomic_kind_type),
POINTER :: atomic_kind_set(:)
56 TYPE(pair_potential_pp_type),
POINTER :: potparm
57 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
58 REAL(kind=
dp) :: pot_deepmd
59 TYPE(mp_para_env_type),
OPTIONAL,
POINTER :: para_env
61 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deepmd_energy_store_force_virial'
63 INTEGER :: dpmd_natoms, handle, i, iat, iat_use, &
64 ikind, jkind, n_atoms, n_atoms_use, &
66 INTEGER,
ALLOCATABLE :: dpmd_atype(:), use_atom_type(:)
67 LOGICAL,
ALLOCATABLE :: use_atom(:)
68 REAL(kind=
dp) :: lattice(3, 3)
69 REAL(kind=
dp),
ALLOCATABLE :: dpmd_atomic_energy(:), &
70 dpmd_atomic_virial(:), dpmd_cell(:), &
71 dpmd_coord(:), dpmd_force(:), &
73 TYPE(deepmd_data_type),
POINTER :: deepmd_data
74 TYPE(pair_potential_single_type),
POINTER :: pot
76 CALL timeset(routinen, handle)
77 n_atoms =
SIZE(particle_set)
78 ALLOCATE (use_atom(n_atoms))
79 ALLOCATE (use_atom_type(n_atoms))
83 DO ikind = 1,
SIZE(atomic_kind_set)
84 DO jkind = 1,
SIZE(atomic_kind_set)
85 pot => potparm%pot(ikind, jkind)%pot
87 IF (ikind /= jkind) cycle
88 DO i = 1,
SIZE(pot%type)
91 IF (particle_set(iat)%atomic_kind%kind_number == ikind .OR. &
92 particle_set(iat)%atomic_kind%kind_number == jkind)
THEN
93 use_atom(iat) = .true.
94 use_atom_type(iat) = pot%set(i)%deepmd%atom_deepmd_type
101 n_atoms_use = count(use_atom)
102 dpmd_natoms = n_atoms_use
103 ALLOCATE (dpmd_cell(9), dpmd_atype(dpmd_natoms), dpmd_coord(dpmd_natoms*3), &
104 dpmd_force(dpmd_natoms*3), dpmd_virial(9), &
105 dpmd_atomic_energy(dpmd_natoms), dpmd_atomic_virial(dpmd_natoms*9))
109 IF (.NOT. use_atom(iat)) cycle
110 iat_use = iat_use + 1
111 dpmd_coord((iat_use - 1)*3 + 1:(iat_use - 1)*3 + 3) = particle_set(iat)%r*
angstrom
112 dpmd_atype(iat_use) = use_atom_type(iat)
114 IF (iat_use > 0)
THEN
123 dpmd_cell((i - 1)*3 + 1:(i - 1)*3 + 3) = lattice(:, i)
128 IF (.NOT.
ASSOCIATED(deepmd_data))
THEN
129 ALLOCATE (deepmd_data)
131 NULLIFY (deepmd_data%use_indices, deepmd_data%force)
132 deepmd_data%model =
deepmd_model_load(filename=pot%set(1)%deepmd%deepmd_file_name)
134 IF (
ASSOCIATED(deepmd_data%force))
THEN
135 IF (
SIZE(deepmd_data%force, 2) /= n_atoms_use)
THEN
136 DEALLOCATE (deepmd_data%force, deepmd_data%use_indices)
139 IF (.NOT.
ASSOCIATED(deepmd_data%force))
THEN
140 ALLOCATE (deepmd_data%force(3, n_atoms_use))
141 ALLOCATE (deepmd_data%use_indices(n_atoms_use))
151 virial=dpmd_virial, &
152 atomic_energy=dpmd_atomic_energy, &
153 atomic_virial=dpmd_atomic_virial)
156 pot_deepmd = pot_deepmd/
evolt
158 dpmd_virial = dpmd_virial/
evolt
161 IF (
PRESENT(para_env))
THEN
162 pot_deepmd = pot_deepmd/real(para_env%num_pe,
dp)
163 dpmd_force = dpmd_force/real(para_env%num_pe,
dp)
164 dpmd_virial = dpmd_virial/real(para_env%num_pe,
dp)
170 IF (use_atom(iat))
THEN
171 iat_use = iat_use + 1
172 deepmd_data%use_indices(iat_use) = iat
173 deepmd_data%force(1:3, iat_use) = dpmd_force((iat_use - 1)*3 + 1:(iat_use - 1)*3 + 3)
177 deepmd_data%virial(1:3, i) = dpmd_virial((i - 1)*3 + 1:(i - 1)*3 + 3)
179 DEALLOCATE (use_atom, use_atom_type, dpmd_coord, dpmd_force, &
180 dpmd_virial, dpmd_atomic_energy, dpmd_atomic_virial, &
181 dpmd_cell, dpmd_atype)
183 CALL timestop(handle)
194 TYPE(fist_nonbond_env_type),
POINTER :: fist_nonbond_env
195 REAL(kind=
dp) :: force(:, :), pv_nonbond(3, 3)
196 LOGICAL,
OPTIONAL :: use_virial
198 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deepmd_add_force_virial'
200 INTEGER :: handle, iat, iat_use
201 TYPE(deepmd_data_type),
POINTER :: deepmd_data
203 CALL timeset(routinen, handle)
207 IF (.NOT.
ASSOCIATED(deepmd_data))
RETURN
209 DO iat_use = 1,
SIZE(deepmd_data%use_indices)
210 iat = deepmd_data%use_indices(iat_use)
211 cpassert(iat >= 1 .AND. iat <=
SIZE(force, 2))
212 force(1:3, iat) = force(1:3, iat) + deepmd_data%force(1:3, iat_use)
216 pv_nonbond = pv_nonbond + deepmd_data%virial
219 CALL timestop(handle)
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public zeng2023
integer, save, public wang2018
Handles all functions related to the CELL.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
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_compute(model, natom, coord, atype, cell, energy, force, virial, atomic_energy, atomic_virial)
Compute energy, force and virial from DP.
subroutine, public fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
subroutine, public fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
Defines the basic variable types.
integer, parameter, public dp
subroutine, public deepmd_energy_store_force_virial(particle_set, cell, atomic_kind_set, potparm, fist_nonbond_env, pot_deepmd, para_env)
...
subroutine, public deepmd_add_force_virial(fist_nonbond_env, force, pv_nonbond, use_virial)
...
Interface to the message passing library MPI.
integer, parameter, public deepmd_type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom