51 SUBROUTINE ace_interface(ace_natom, ace_atype, pot_ace, ace_force, ace_virial, &
52 fist_nonbond_env, cell, ace_data)
54 INTEGER,
INTENT(IN) :: ace_natom, ace_atype(1:ace_natom)
55 REAL(kind=
dp),
INTENT(OUT) :: pot_ace, ace_force(1:3, 1:ace_natom), &
62 INTEGER :: atom_a, atom_b, counter, ilist, k, m, n, &
63 natom, nghost, num_update
64 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ghostidx, listidx
65 REAL(kind=8), allocatable :: forceunroll(:)
66 REAL(kind=
dp) :: cell_v(3), dv(1:3), energy(1:ace_natom)
69 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
74 r_last_update_pbc=r_last_update_pbc, &
75 num_update=num_update, counter=counter)
77 IF ((counter == 1) .OR. (ace_data%refupdate /= num_update))
THEN
79 ace_data%refupdate = num_update
81 IF (.NOT.
ALLOCATED(ace_data%neiat))
THEN
82 ALLOCATE (ace_data%neiat(0:natom))
84 cpassert(
SIZE(ace_data%neiat) > natom)
89 ALLOCATE (ghostidx(natom), listidx(natom))
93 DO n = 1,
SIZE(nonbonded%neighbor_kind_pairs)
94 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(n)
95 IF (neighbor_kind_pair%npairs > 0)
THEN
96 IF ((neighbor_kind_pair%cell_vector(1) == 0) .AND. &
97 (neighbor_kind_pair%cell_vector(2) == 0) .AND. &
98 (neighbor_kind_pair%cell_vector(3) == 0))
THEN
100 ghostidx(ilist) = ilist
105 DO ilist = 1, neighbor_kind_pair%npairs
106 atom_a = ace_data%inverse_index_map(neighbor_kind_pair%list(1, ilist))
107 atom_b = ace_data%inverse_index_map(neighbor_kind_pair%list(2, ilist))
108 IF ((atom_a == 0) .OR. (atom_b == 0)) cycle
109 ace_data%neiat(atom_a) = ace_data%neiat(atom_a) + 1
110 IF (ghostidx(atom_b) == 0)
THEN
113 ghostidx(atom_b) = nghost + natom
120 ace_data%neiat(n) = ace_data%neiat(n) + ace_data%neiat(n - 1)
122 ace_data%nei = ace_data%neiat(natom)
123 ace_data%nghost = nghost
125 IF (
ALLOCATED(ace_data%nlist))
THEN
126 IF (
SIZE(ace_data%nlist) < ace_data%nei)
THEN
127 DEALLOCATE (ace_data%nlist)
128 ALLOCATE (ace_data%nlist(1:ace_data%nei))
131 ALLOCATE (ace_data%nlist(1:ace_data%nei))
134 IF (
ALLOCATED(ace_data%attype))
THEN
135 IF (
SIZE(ace_data%attype) < natom + nghost)
THEN
136 DEALLOCATE (ace_data%atpos)
137 DEALLOCATE (ace_data%attype)
138 DEALLOCATE (ace_data%origin)
139 DEALLOCATE (ace_data%shift)
140 ALLOCATE (ace_data%atpos(1:3, 1:natom + nghost))
141 ALLOCATE (ace_data%attype(1:natom + nghost))
142 ALLOCATE (ace_data%origin(1:natom + nghost))
143 ALLOCATE (ace_data%shift(1:3, 1:natom + nghost))
146 ALLOCATE (ace_data%atpos(1:3, 1:natom + nghost))
147 ALLOCATE (ace_data%attype(1:natom + nghost))
148 ALLOCATE (ace_data%origin(1:natom + nghost))
149 ALLOCATE (ace_data%shift(1:3, 1:natom + nghost))
151 ace_data%attype(1:natom) = ace_atype(:)
154 ace_data%atpos(:, n) = r_last_update_pbc(ace_data%use_indices(n))%r*
angstrom
155 ace_data%origin(n) = n
157 ace_data%shift(:, :) = 0
160 listidx(1:natom) = ace_data%neiat(0:natom - 1)
161 DO n = 1,
SIZE(nonbonded%neighbor_kind_pairs)
162 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(n)
163 IF (neighbor_kind_pair%npairs > 0)
THEN
164 IF ((neighbor_kind_pair%cell_vector(1) == 0) .AND. &
165 (neighbor_kind_pair%cell_vector(2) == 0) .AND. &
166 (neighbor_kind_pair%cell_vector(3) == 0))
THEN
173 dv = real(neighbor_kind_pair%cell_vector, kind=
dp)
176 cell_v = matmul(cell%hmat, dv)*
angstrom
177 DO ilist = 1, neighbor_kind_pair%npairs
178 atom_a = ace_data%inverse_index_map(neighbor_kind_pair%list(1, ilist))
179 atom_b = ace_data%inverse_index_map(neighbor_kind_pair%list(2, ilist))
180 IF ((atom_a == 0) .OR. (atom_b == 0)) cycle
181 IF (ghostidx(atom_b) == 0)
THEN
183 ace_data%atpos(:, k) = ace_data%atpos(:, atom_b) + cell_v
184 ace_data%shift(:, k) = neighbor_kind_pair%cell_vector
185 ace_data%origin(k) = atom_b
186 ace_data%attype(k) = ace_atype(atom_b)
189 listidx(atom_a) = listidx(atom_a) + 1
190 ace_data%nlist(listidx(atom_a)) = ghostidx(atom_b)
195 DEALLOCATE (ghostidx)
200 ace_data%nlist(1:ace_data%nei) = ace_data%nlist(1:ace_data%nei) - 1
201 ace_data%origin(1:natom + nghost) = ace_data%origin(1:natom + nghost) - 1
205 nghost = ace_data%nghost
207 ace_data%atpos(:, n) = r_last_update_pbc(ace_data%use_indices(n))%r*
angstrom
209 DO n = natom + 1, natom + nghost
210 dv = real(ace_data%shift(:, n), kind=
dp)*
angstrom
212 ace_data%atpos(:, n) = ace_data%atpos(:, ace_data%origin(n) + 1) + matmul(cell%hmat, dv)
217 ALLOCATE (forceunroll(1:3*natom))
226 neiatc=ace_data%neiat, &
227 originc=ace_data%origin, &
228 nlistc=ace_data%nlist, &
229 attypec=ace_data%attype, &
230 atposc=reshape(ace_data%atpos, (/3*(natom + nghost)/)), &
231 forcec=forceunroll, &
232 virialc=ace_virial, &
234 model=ace_data%model)
236 ace_force = reshape(forceunroll, (/3, natom/))
237 pot_ace = sum(energy(1:natom))
239 DEALLOCATE (forceunroll)
246 mark_used(ace_virial)
247 mark_used(fist_nonbond_env)
250 cpabort(
"CP2K was compiled without ACE library.")
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, ace_data, charges)
sets a fist_nonbond_env