47 use,
intrinsic :: iso_c_binding
60 integer(c_int),
parameter :: cd = c_double
61 integer(c_int),
parameter :: DIM = 3
65 real(c_double),
parameter :: model_cutsq =
model_cutoff**2
82 real(c_double),
parameter :: lj_epsilon = 0.0104_cd
83 real(c_double),
parameter :: lj_sigma = 3.40_cd
84 real(c_double),
parameter :: lj_cutnorm =
model_cutoff/lj_sigma
85 real(c_double),
parameter :: lj_a = 12.0_cd*lj_epsilon*(-26.0_cd &
86 + 7.0_cd*lj_cutnorm**6)/(lj_cutnorm**14 &
88 real(c_double),
parameter :: lj_b = 96.0_cd*lj_epsilon*(7.0_cd &
89 - 2.0_cd*lj_cutnorm**6)/(lj_cutnorm**13*lj_sigma)
90 real(c_double),
parameter :: lj_c = 28.0_cd*lj_epsilon*(-13.0_cd &
91 + 4.0_cd*lj_cutnorm**6)/(lj_cutnorm**12)
93 type, bind(c) :: buffer_type
94 real(c_double) :: cutoff(1)
108 real(c_double),
intent(in) :: r
109 real(c_double),
intent(out) :: phi
112 real(c_double) rsq,sor,sor6,sor12
123 phi = 4.0_cd*lj_epsilon*(sor12-sor6) + lj_a*rsq + lj_b*r + lj_c
137 real(c_double),
intent(in) :: r
138 real(c_double),
intent(out) :: phi,dphi
141 real(c_double) rsq,sor,sor6,sor12
153 phi = 4.0_cd*lj_epsilon*(sor12-sor6) + lj_a*rsq + lj_b*r + lj_c
154 dphi = 24.0_cd*lj_epsilon*(-2.0_cd*sor12+sor6)/r + 2.0_cd*lj_a*r + lj_b
164 #include "kim_model_compute_log_macros.fd" 172 type(kim_model_compute_handle_type),
intent(in) :: model_compute_handle
173 integer(c_int),
intent(out) :: ierr
176 real(c_double) :: rij(dim)
177 real(c_double) :: r,rsqij,phi,dphi,deidr = 0.0_cd
178 integer(c_int) :: i,j,jj,numnei,comp_force,comp_enepot,comp_virial, comp_energy
179 integer(c_int) :: ierr2
182 integer(c_int),
pointer :: n
183 real(c_double),
pointer :: energy
184 real(c_double),
pointer :: coor(:,:)
185 real(c_double),
pointer :: force(:,:)
186 real(c_double),
pointer :: enepot(:)
187 integer(c_int),
pointer :: nei1part(:)
188 integer(c_int),
pointer :: particlespeciescodes(:)
189 integer(c_int),
pointer :: particlecontributing(:)
190 real(c_double),
pointer :: virial(:)
197 call kim_model_compute_get_argument_pointer(model_compute_handle, &
200 call kim_model_compute_get_argument_pointer(model_compute_handle, &
203 call kim_model_compute_get_argument_pointer(model_compute_handle, &
206 call kim_model_compute_get_argument_pointer(model_compute_handle, &
209 call kim_model_compute_get_argument_pointer(model_compute_handle, &
212 call kim_model_compute_get_argument_pointer(model_compute_handle, &
215 call kim_model_compute_get_argument_pointer(model_compute_handle, &
218 call kim_model_compute_get_argument_pointer(model_compute_handle, &
230 if (
associated(energy))
then 235 if (
associated(force))
then 240 if (
associated(enepot))
then 245 if (
associated(virial))
then 255 if (particlespeciescodes(i).ne.
speccode)
then 265 if (comp_enepot.eq.1) enepot = 0.0_cd
266 if (comp_energy.eq.1) energy = 0.0_cd
267 if (comp_force.eq.1) force = 0.0_cd
268 if (comp_virial.eq.1) virial = 0.0_cd
277 if (particlecontributing(i) == 1)
then 280 model_compute_handle, 1, i, numnei, nei1part, ierr)
297 rij(:) = coor(:,j) - coor(:,i)
301 rsqij = dot_product(rij,rij)
302 if ( rsqij .lt. model_cutsq )
then 305 if (comp_force.eq.1.or.comp_virial.eq.1)
then 315 if (comp_enepot.eq.1)
then 316 enepot(i) = enepot(i) + 0.5_cd*phi
318 if (comp_energy.eq.1)
then 319 energy = energy + 0.5_cd*phi
324 if (comp_virial.eq.1)
then 325 virial(1) = virial(1) + rij(1)*rij(1)*deidr/r
326 virial(2) = virial(2) + rij(2)*rij(2)*deidr/r
327 virial(3) = virial(3) + rij(3)*rij(3)*deidr/r
328 virial(4) = virial(4) + rij(2)*rij(3)*deidr/r
329 virial(5) = virial(5) + rij(1)*rij(3)*deidr/r
330 virial(6) = virial(6) + rij(1)*rij(2)*deidr/r
335 if (comp_force.eq.1)
then 336 force(:,i) = force(:,i) + deidr*rij/r
337 force(:,j) = force(:,j) - deidr*rij/r
360 #include "kim_model_destroy_log_macros.fd" 362 use,
intrinsic :: iso_c_binding
368 type(kim_model_destroy_handle_type),
intent(inout) :: model_destroy_handle
369 integer(c_int),
intent(out) :: ierr
371 type(buffer_type),
pointer :: buf;
type(c_ptr) :: pbuf
375 call kim_model_destroy_get_model_buffer_pointer(model_destroy_handle, pbuf)
376 call c_f_pointer(pbuf, buf)
388 #include "kim_model_refresh_log_macros.fd" 390 use,
intrinsic :: iso_c_binding
396 type(kim_model_refresh_handle_type),
intent(inout) :: model_refresh_handle
397 integer(c_int),
intent(out) :: ierr
399 type(buffer_type),
pointer :: buf;
type(c_ptr) :: pbuf
403 call kim_model_refresh_get_model_buffer_pointer(model_refresh_handle, pbuf)
404 call c_f_pointer(pbuf, buf)
408 call kim_model_refresh_set_influence_distance_pointer( &
409 model_refresh_handle, buf%cutoff(1))
410 call kim_model_refresh_set_neighbor_list_cutoffs_pointer( &
411 model_refresh_handle, 1, buf%cutoff)
423 #include "kim_model_create_log_macros.fd" 425 requested_energy_unit, requested_charge_unit, requested_temperature_unit, &
426 requested_time_unit, ierr) bind(c)
427 use,
intrinsic :: iso_c_binding
440 type(kim_model_create_handle_type),
intent(inout) :: model_create_handle
441 type(kim_length_unit_type),
intent(in) :: requested_length_unit
442 type(kim_energy_unit_type),
intent(in) :: requested_energy_unit
443 type(kim_charge_unit_type),
intent(in) :: requested_charge_unit
444 type(kim_temperature_unit_type),
intent(in) :: requested_temperature_unit
445 type(kim_time_unit_type),
intent(in) :: requested_time_unit
446 integer(c_int),
intent(out) :: ierr
449 integer(c_int) :: ierr2
450 type(buffer_type),
pointer :: buf
457 call kim_model_create_set_model_numbering(model_create_handle, &
494 call kim_model_create_set_refresh_pointer( &
500 call kim_model_create_set_units(model_create_handle, &
502 kim_energy_unit_ev, &
503 kim_charge_unit_unused, &
504 kim_temperature_unit_unused, &
505 kim_time_unit_unused, &
517 model_create_handle, buf%cutoff(1))
519 call kim_model_create_set_neighbor_list_cutoffs_pointer(model_create_handle, &
type(kim_numbering_type), public, protected kim_numbering_one_based
type(kim_argument_name_type), public, protected kim_argument_name_number_of_particles
character(len=4096), public kim_log_file
character(len=65536), public kim_log_message
type(kim_language_name_type), public, protected kim_language_name_fortran
type(kim_support_status_type), public, protected kim_support_status_optional
type(kim_argument_name_type), public, protected kim_argument_name_partial_forces
type(kim_argument_name_type), public, protected kim_argument_name_particle_contributing
static void calc_phi_dphi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi, double *dphi)
subroutine model_create_routine(model_create_handle, requested_length_unit, requested_energy_unit, requested_charge_unit, requested_temperature_unit, requested_time_unit, ierr)
type(kim_argument_name_type), public, protected kim_argument_name_particle_species_codes
subroutine, public model_destroy_func(model_destroy_handle, ierr)
type(kim_argument_name_type), public, protected kim_argument_name_partial_particle_energy
type(kim_argument_name_type), public, protected kim_argument_name_partial_virial
type(kim_argument_name_type), public, protected kim_argument_name_partial_energy
subroutine, public compute_energy_forces(model_compute_handle, ierr)
type(kim_argument_name_type), public, protected kim_argument_name_coordinates
static void calc_phi(double const *epsilon, double const *C, double const *Rzero, double const *shift, double const cutoff, double const r, double *phi)
subroutine, public model_refresh_func(model_refresh_handle, ierr)
real(c_double), parameter, public model_cutoff
integer(c_int), parameter, public speccode
type(kim_species_name_type), public, protected kim_species_name_ar