173 model_compute_handle, model_compute_arguments_handle, ierr)
bind(c)
177 type(kim_model_compute_handle_type),
intent(in) :: model_compute_handle
178 type(kim_model_compute_arguments_handle_type),
intent(in) :: &
179 model_compute_arguments_handle
180 integer(c_int),
intent(out) :: ierr
183 real(c_double) :: rij(dim)
184 real(c_double) :: r, rsqij, phi, dphi, deidr = 0.0_cd
185 integer(c_int) :: i, j, jj, numnei, comp_force, comp_enepot, &
186 comp_virial, comp_energy
187 integer(c_int) :: ierr2
190 integer(c_int),
pointer :: n
191 real(c_double),
pointer :: energy
192 real(c_double),
pointer :: coor(:, :)
193 real(c_double),
pointer :: force(:, :)
194 real(c_double),
pointer :: enepot(:)
195 integer(c_int),
pointer :: nei1part(:)
196 integer(c_int),
pointer :: particlespeciescodes(:)
197 integer(c_int),
pointer :: particlecontributing(:)
198 real(c_double),
pointer :: virial(:)
203 call kim_get_argument_pointer( &
204 model_compute_arguments_handle, &
205 kim_compute_argument_name_number_of_particles, n, ierr2)
207 call kim_get_argument_pointer( &
208 model_compute_arguments_handle, &
209 kim_compute_argument_name_particle_species_codes, n, &
210 particlespeciescodes, ierr2)
212 call kim_get_argument_pointer( &
213 model_compute_arguments_handle, &
214 kim_compute_argument_name_particle_contributing, n, &
215 particlecontributing, ierr2)
217 call kim_get_argument_pointer( &
218 model_compute_arguments_handle, &
219 kim_compute_argument_name_coordinates, dim, n, coor, ierr2)
221 call kim_get_argument_pointer( &
222 model_compute_arguments_handle, &
223 kim_compute_argument_name_partial_energy, energy, ierr2)
225 call kim_get_argument_pointer( &
226 model_compute_arguments_handle, &
227 kim_compute_argument_name_partial_forces, dim, n, force, ierr2)
229 call kim_get_argument_pointer( &
230 model_compute_arguments_handle, &
231 kim_compute_argument_name_partial_particle_energy, n, enepot, ierr2)
233 call kim_get_argument_pointer( &
234 model_compute_arguments_handle, &
235 kim_compute_argument_name_partial_virial, 6, virial, ierr2)
238 call kim_log_entry(model_compute_arguments_handle, &
239 kim_log_verbosity_error,
"get data")
247 if (
associated(energy))
then
252 if (
associated(force))
then
257 if (
associated(enepot))
then
262 if (
associated(virial))
then
272 if (particlespeciescodes(i) /=
speccode)
then
273 call kim_log_entry( &
274 model_compute_handle, kim_log_verbosity_error, &
275 "Unexpected species code detected")
284 if (comp_enepot == 1) enepot = 0.0_cd
285 if (comp_energy == 1) energy = 0.0_cd
286 if (comp_force == 1) force = 0.0_cd
287 if (comp_virial == 1) virial = 0.0_cd
296 if (particlecontributing(i) == 1)
then
298 call kim_get_neighbor_list( &
299 model_compute_arguments_handle, 1, i, numnei, nei1part, ierr)
302 call kim_log_entry( &
303 model_compute_arguments_handle, kim_log_verbosity_error, &
304 "GetNeighborList failed")
317 rij(:) = coor(:, j) - coor(:, i)
321 rsqij = dot_product(rij, rij)
322 if (rsqij < model_cutsq)
then
325 if (comp_force == 1 .or. comp_virial == 1)
then
328 deidr = 0.5_cd * dphi
335 if (comp_enepot == 1)
then
336 enepot(i) = enepot(i) + 0.5_cd * phi
338 if (comp_energy == 1)
then
339 energy = energy + 0.5_cd * phi
344 if (comp_virial == 1)
then
345 virial(1) = virial(1) + rij(1) * rij(1) * deidr / r
346 virial(2) = virial(2) + rij(2) * rij(2) * deidr / r
347 virial(3) = virial(3) + rij(3) * rij(3) * deidr / r
348 virial(4) = virial(4) + rij(2) * rij(3) * deidr / r
349 virial(5) = virial(5) + rij(1) * rij(3) * deidr / r
350 virial(6) = virial(6) + rij(1) * rij(2) * deidr / r
355 if (comp_force == 1)
then
356 force(:, i) = force(:, i) + deidr * rij / r
357 force(:, j) = force(:, j) - deidr * rij / r
405 model_compute_handle, model_compute_arguments_create_handle, ierr)
bind(c)
406 use,
intrinsic :: iso_c_binding
410 type(kim_model_compute_handle_type),
intent(in) :: model_compute_handle
411 type(kim_model_compute_arguments_create_handle_type),
intent(inout) :: &
412 model_compute_arguments_create_handle
413 integer(c_int),
intent(out) :: ierr
415 integer(c_int) :: ierr2
418 if (model_compute_handle == kim_model_compute_null_handle)
continue
424 call kim_set_argument_support_status( &
425 model_compute_arguments_create_handle, &
426 kim_compute_argument_name_partial_energy, &
427 kim_support_status_optional, ierr2)
429 call kim_set_argument_support_status( &
430 model_compute_arguments_create_handle, &
431 kim_compute_argument_name_partial_forces, &
432 kim_support_status_optional, ierr2)
434 call kim_set_argument_support_status( &
435 model_compute_arguments_create_handle, &
436 kim_compute_argument_name_partial_particle_energy, &
437 kim_support_status_optional, ierr2)
439 call kim_set_argument_support_status( &
440 model_compute_arguments_create_handle, &
441 kim_compute_argument_name_partial_virial, &
442 kim_support_status_optional, ierr2)
450 call kim_log_entry( &
451 model_compute_arguments_create_handle, kim_log_verbosity_error, &
452 "Unable to successfully create compute_arguments object")