58 REAL(kind=
dp) :: pot_deepmd
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(:), &
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)
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
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)
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
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)
...
Define the data structure for the particle information.