33 use,
intrinsic :: iso_c_binding
38 subroutine my_error(message, line, file)
40 character(len=*, kind=c_char),
intent(in) :: message
41 integer,
intent(in) :: line
42 character(len=*, kind=c_char),
intent(in) :: file
44 print *,
"* Error : '", trim(message),
"' ", line,
":", &
51 character(len=*, kind=c_char),
intent(in) :: message
52 integer,
intent(in) :: line
53 character(len=*, kind=c_char),
intent(in) :: file
55 print *,
"* Warning : '", trim(message),
"' ", line,
":", &
71 use,
intrinsic :: iso_c_binding
76 real(c_double) :: cutoff
77 integer(c_int) :: number_of_particles
78 integer(c_int),
pointer :: neighborList(:,:)
79 real(c_double),
pointer :: RijList(:,:,:)
97 subroutine get_neigh(data_object, number_of_neighbor_lists, cutoffs, &
98 neighbor_list_index, request, numnei, pnei1part, ierr) bind(c)
103 type(c_ptr),
value,
intent(in) :: data_object
104 integer(c_int),
value,
intent(in) :: number_of_neighbor_lists
105 real(c_double),
intent(in) :: cutoffs(number_of_neighbor_lists)
106 integer(c_int),
value,
intent(in) :: neighbor_list_index
107 integer(c_int),
value,
intent(in) :: request
108 integer(c_int),
intent(out) :: numnei
109 type(c_ptr),
intent(out) :: pnei1part
110 integer(c_int),
intent(out) :: ierr
113 integer(c_int),
parameter :: DIM = 3
114 integer(c_int) numberOfParticles
115 type(neighObject_type),
pointer :: neighObject
117 call c_f_pointer(data_object, neighobject)
119 if (number_of_neighbor_lists /= 1)
then 120 call my_warning(
"invalid number of neighbor_lists", __line__, __file__)
125 if (cutoffs(1) > neighobject%cutoff)
then 126 call my_warning(
"neighbor list cutoff too small for model cutoff", &
132 if (neighbor_list_index /= 1)
then 133 call my_warning(
"wrong list index", __line__, __file__)
138 numberofparticles = neighobject%number_of_particles
140 if ( (request.gt.numberofparticles) .or. (request.lt.1))
then 142 call my_warning(
"Invalid part ID in get_neigh", &
149 numnei = neighobject%neighborList(1,request)
152 pnei1part = c_loc(neighobject%neighborList(2,request))
173 forces_optional, model_is_compatible, ierr)
174 use,
intrinsic :: iso_c_binding
179 type(kim_compute_arguments_handle_type),
intent(in) :: compute_arguments_handle
180 logical,
intent(out) :: forces_optional
181 logical,
intent(out) :: model_is_compatible
182 integer(c_int),
intent(out) :: ierr
186 integer(c_int) number_of_argument_names
187 integer(c_int) number_of_callback_names
188 type(kim_compute_argument_name_type) argument_name
189 type(kim_support_status_type) support_status
190 type(kim_compute_callback_name_type) callback_name
194 model_is_compatible = .false.
198 call kim_compute_argument_name_get_number_of_compute_argument_names(&
199 number_of_argument_names)
200 do i=1,number_of_argument_names
201 call kim_compute_argument_name_get_compute_argument_name(i, argument_name, &
208 call kim_compute_arguments_get_argument_support_status( &
209 compute_arguments_handle, argument_name, support_status, ierr)
211 call my_warning(
"can't get argument support_status", &
217 if (support_status == kim_support_status_required)
then 219 (argument_name == kim_compute_argument_name_partial_energy) .or. &
220 (argument_name == kim_compute_argument_name_partial_forces)))
then 221 call my_warning(
"unsupported required argument", &
229 if ((argument_name == kim_compute_argument_name_partial_energy) .and. &
230 (support_status == kim_support_status_not_supported))
then 231 call my_warning(
"model does not support energy", &
236 if (argument_name == kim_compute_argument_name_partial_forces)
then 237 if (support_status == kim_support_status_not_supported)
then 238 call my_warning(
"model does not support forces", &
242 else if (support_status == kim_support_status_required)
then 243 forces_optional = .false.
244 else if (support_status == kim_support_status_optional)
then 245 forces_optional = .true.
247 call my_warning(
"unknown support_status for forces", &
256 call kim_compute_callback_name_get_number_of_compute_callback_names( &
257 number_of_callback_names)
258 do i=1,number_of_callback_names
259 call kim_compute_callback_name_get_compute_callback_name(i, callback_name, &
266 call kim_compute_arguments_get_callback_support_status( &
267 compute_arguments_handle, callback_name, support_status, ierr)
269 call my_warning(
"can't get call back support_status", &
275 if (support_status == kim_support_status_required)
then 276 call my_warning(
"unsupported required call back", &
284 model_is_compatible = .true.
296 model_species, num_species, ier)
297 use,
intrinsic :: iso_c_binding
301 type(kim_model_handle_type),
intent(in) :: model_handle
302 integer(c_int),
intent(in) :: max_species
303 type(kim_species_name_type),
intent(out) :: model_species(max_species)
304 integer(c_int),
intent(out) :: num_species
305 integer(c_int),
intent(out) :: ier
309 integer(c_int) total_num_species
310 type(kim_species_name_type) :: species_name
311 integer(c_int) species_is_supported
317 call kim_species_name_get_number_of_species_names(total_num_species)
319 if (total_num_species .gt. max_species)
return 322 do i=1,total_num_species
323 call kim_species_name_get_species_name(i, species_name, ier)
324 call kim_model_get_species_support_and_code(model_handle, species_name, &
325 species_is_supported, code, ier)
326 if ((ier == 0) .and. (species_is_supported .ne. 0))
then 327 num_species = num_species + 1
328 model_species(num_species) = species_name
338 do_update_list,coordsave, &
340 use,
intrinsic :: iso_c_binding
343 integer(c_int),
parameter :: cd = c_double
346 integer(c_int),
intent(in) :: DIM
347 integer(c_int),
intent(in) :: N
348 real(c_double),
intent(in) :: coords(DIM,N)
349 real(c_double),
intent(in) :: cutoff
350 real(c_double),
intent(in) :: cutpad
351 logical,
intent(inout) :: do_update_list
352 real(c_double),
intent(inout) :: coordsave(DIM,N)
353 type(neighObject_type),
intent(inout) :: neighObject
354 integer(c_int),
intent(out) :: ierr
359 real(c_double) disp, disp1, disp2, cutrange, dispvec(DIM)
368 if (.not.do_update_list)
then 375 dispvec(1:dim) = coords(1:dim,i) - coordsave(1:dim,i)
376 disp = sqrt( dot_product(dispvec,dispvec) )
377 if (disp >= disp1)
then 380 else if (disp >= disp2)
then 384 do_update_list = ( disp1 + disp2 > cutpad )
388 if (do_update_list)
then 391 coordsave(1:dim,1:n) = coords(1:dim,1:n)
394 cutrange = cutoff + cutpad
399 do_update_list = .false.
415 use,
intrinsic :: iso_c_binding
420 logical,
intent(in) :: half
421 integer(c_int),
intent(in) :: numberOfParticles
422 real(c_double),
dimension(3,numberOfParticles), &
424 real(c_double),
intent(in) :: cutoff
425 type(neighObject_type),
intent(inout) :: neighObject
428 integer(c_int) i, j, a
431 real(c_double) cutoff2
433 neighobject%cutoff = cutoff
437 do i=1,numberofparticles
439 do j=1,numberofparticles
440 dx(:) = coords(:, j) - coords(:, i)
441 r2 = dot_product(dx, dx)
442 if (r2.le.cutoff2)
then 444 if ( (j .gt. i) .OR. ((.not. half) .AND. (i.ne.j)) )
then 446 neighobject%neighborList(a,i) = j
451 neighobject%neighborList(1,i) = a-1
476 coords, MiddlePartId)
477 use,
intrinsic :: iso_c_binding
479 integer(c_int),
parameter :: cd = c_double
482 real(c_double),
intent(in) :: FCCspacing
483 integer(c_int),
intent(in) :: nCellsPerSide
484 logical,
intent(in) :: periodic
485 real(c_double),
intent(out) :: coords(3,*)
486 integer(c_int),
intent(out) :: MiddlePartId
490 real(c_double) FCCshifts(3,4)
491 real(c_double) latVec(3)
492 integer(c_int) a, i, j, k, m
496 fccshifts(1,1) = 0.0_cd
497 fccshifts(2,1) = 0.0_cd
498 fccshifts(3,1) = 0.0_cd
499 fccshifts(1,2) = 0.5_cd*fccspacing
500 fccshifts(2,2) = 0.5_cd*fccspacing
501 fccshifts(3,2) = 0.0_cd
502 fccshifts(1,3) = 0.5_cd*fccspacing
503 fccshifts(2,3) = 0.0_cd
504 fccshifts(3,3) = 0.5_cd*fccspacing
505 fccshifts(1,4) = 0.0_cd
506 fccshifts(2,4) = 0.5_cd*fccspacing
507 fccshifts(3,4) = 0.5_cd*fccspacing
512 latvec(1) = (i-1)*fccspacing
514 latvec(2) = (j-1)*fccspacing
516 latvec(3) = (k-1)*fccspacing
519 coords(:,a) = latvec + fccshifts(:,m)
520 if ((i.eq.ncellsperside/2+1).and.(j.eq.ncellsperside/2+1) .and. &
521 (k.eq.ncellsperside/2+1) .and. (m.eq.1))
then 522 coords(:,1) = latvec + fccshifts(:,m)
527 if (.not. periodic)
then 530 latvec(1) = ncellsperside*fccspacing
531 latvec(2) = (i-1)*fccspacing
532 latvec(3) = (j-1)*fccspacing
533 a = a+1; coords(:,a) = latvec
534 a = a+1; coords(:,a) = latvec + fccshifts(:,4)
536 latvec(1) = (i-1)*fccspacing
537 latvec(2) = ncellsperside*fccspacing
538 latvec(3) = (j-1)*fccspacing
539 a = a+1; coords(:,a) = latvec
540 a = a+1; coords(:,a) = latvec + fccshifts(:,3)
542 latvec(1) = (i-1)*fccspacing
543 latvec(2) = (j-1)*fccspacing
544 latvec(3) = ncellsperside*fccspacing
545 a = a+1; coords(:,a) = latvec
546 a = a+1; coords(:,a) = latvec + fccshifts(:,2)
549 if (.not. periodic)
then 551 latvec(1) = (i-1)*fccspacing
552 latvec(2) = ncellsperside*fccspacing
553 latvec(3) = ncellsperside*fccspacing
554 a = a+1; coords(:,a) = latvec
555 latvec(1) = ncellsperside*fccspacing
556 latvec(2) = (i-1)*fccspacing
557 latvec(3) = ncellsperside*fccspacing
558 a = a+1; coords(:,a) = latvec
559 latvec(1) = ncellsperside*fccspacing
560 latvec(2) = ncellsperside*fccspacing
561 latvec(3) = (i-1)*fccspacing
562 a = a+1; coords(:,a) = latvec
565 if (.not. periodic)
then 567 a = a+1; coords(:,a) = ncellsperside*fccspacing
575 compute_arguments_handle,DIM,N,coords,&
576 cutoff,cutpad,energy, do_update_list, &
577 coordsave,neighObject,deriv,deriv_err,ierr)
578 use,
intrinsic :: iso_c_binding
582 integer(c_int),
parameter :: cd = c_double
585 integer(c_int),
intent(in) :: partnum
586 integer(c_int),
intent(in) :: dir
587 type(kim_model_handle_type),
intent(in) :: model_handle
588 type(kim_compute_arguments_handle_type),
intent(in) :: compute_arguments_handle
589 integer(c_int),
intent(in) :: DIM
590 integer(c_int),
intent(in) :: N
591 real(c_double),
intent(inout) :: coords(DIM,N)
592 real(c_double),
intent(in) :: cutoff
593 real(c_double),
intent(in) :: cutpad
594 real(c_double),
intent(inout) :: energy
595 logical,
intent(inout) :: do_update_list
596 real(c_double),
intent(inout) :: coordsave(DIM,N)
597 type(neighObject_type),
intent(inout) :: neighObject
598 real(c_double),
intent(out) :: deriv
599 real(c_double),
intent(out) :: deriv_err
600 integer(c_int),
intent(out) :: ierr
603 real(c_double),
parameter :: eps_init = 1.e-6_cd
604 integer(c_int),
parameter :: number_eps_levels = 15
605 real(c_double) eps, deriv_last, deriv_err_last
616 deriv_err_last = huge(1.0_cd)
617 do i=1,number_eps_levels
618 deriv =
dfridr(eps,deriv_err)
620 call my_error(
"compute_numer_deriv", &
623 if (deriv_err>deriv_err_last)
then 625 deriv_err = deriv_err_last
630 deriv_err_last = deriv_err
654 real(c_double) function dfridr(h,err)
658 real(c_double),
intent(inout) :: h
659 real(c_double),
intent(out) :: err
662 integer(c_int),
parameter :: ntab=10
663 real(c_double),
parameter :: con=1.4_cd
664 real(c_double),
parameter :: con2=con*con
665 real(c_double),
parameter :: big=huge(1.0_cd)
666 real(c_double),
parameter :: safe=2.0_cd
669 real(c_double) errt,fac,hh,a(ntab,ntab),fp,fm,coordorig
673 if (h.eq.0.0_cd)
then 679 coordorig = coords(dir,partnum)
680 coords(dir,partnum) = coordorig + hh
682 do_update_list,coordsave, &
684 call kim_model_compute(model_handle, compute_arguments_handle, ierr)
686 call my_error(
"kim_api_model_compute", &
690 coords(dir,partnum) = coordorig - hh
692 do_update_list,coordsave, &
694 call kim_model_compute(model_handle, compute_arguments_handle, ierr)
696 call my_error(
"kim_api_model_compute", &
700 coords(dir,partnum) = coordorig
702 do_update_list,coordsave, &
704 a(1,1)=(fp-fm)/(2.0_cd*hh)
711 coords(dir,partnum) = coordorig + hh
713 do_update_list,coordsave, &
715 call kim_model_compute(model_handle, compute_arguments_handle, ierr)
717 call my_error(
"kim_api_model_compute", &
721 coords(dir,partnum) = coordorig - hh
723 do_update_list,coordsave, &
725 call kim_model_compute(model_handle, compute_arguments_handle, ierr)
727 call my_error(
"kim_api_model_compute", &
731 coords(dir,partnum) = coordorig
733 do_update_list,coordsave, &
735 a(1,i)=(fp-fm)/(2.0_cd*hh)
740 a(j,i)=(a(j-1,i)*fac-a(j-1,i-1))/(fac-1.0_cd)
744 errt = max(abs(a(j,i)-a(j-1,i)),abs(a(j,i)-a(j-1,i-1)))
745 if (errt.le.err)
then 750 if (abs(a(i,i)-a(i-1,i-1)).ge.safe*err)
return 775 use,
intrinsic :: iso_c_binding
780 integer(c_int),
parameter :: cd = c_double
782 integer(c_int),
parameter :: ncellsperside = 2
783 integer(c_int),
parameter :: dim = 3
784 real(c_double),
parameter :: cutpad = 0.75_cd
785 integer(c_int),
parameter :: max_species = 200
786 real(c_double),
parameter :: eps_prec = epsilon(1.0_cd)
787 real(c_double) fccspacing
789 integer(c_int),
parameter :: &
790 n = 4*(ncellsperside)**3 + 6*(ncellsperside)**2 + 3*(ncellsperside) + 1
791 real(c_double),
allocatable :: forces_num(:,:)
792 real(c_double),
allocatable :: forces_num_err(:,:)
793 type(kim_species_name_type) :: model_species(max_species)
794 integer(c_int),
target :: num_species
795 character(len=5, kind=c_char) :: passfail
796 real(c_double) :: forcediff
797 real(c_double) :: forcediff_sumsq
798 real(c_double) :: weight
799 real(c_double) :: weight_sum
800 real(c_double) :: alpha
801 real(c_double) :: term
802 real(c_double) :: term_max
803 real(c_double),
allocatable :: cluster_coords(:,:)
804 real(c_double),
allocatable :: cluster_disps(:,:)
805 type(kim_species_name_type),
allocatable :: cluster_species(:)
806 integer(c_int) i,j,imax,jmax,species_code
807 integer(c_int) seed_size
808 integer(c_int),
allocatable :: seed(:)
814 real(c_double),
allocatable :: coordsave(:,:)
815 logical do_update_list
820 character(len=256, kind=c_char) :: testname =
"vc_forces_numer_deriv" 821 character(len=256, kind=c_char) :: modelname
823 type(kim_model_handle_type) :: model_handle
824 type(kim_compute_arguments_handle_type) :: compute_arguments_handle
825 integer(c_int) ierr, ierr2
826 integer(c_int) species_is_supported
827 integer(c_int),
target :: numberofparticles
828 integer(c_int),
target :: particlespeciescodes(n)
829 integer(c_int),
target :: particlecontributing(n)
830 real(c_double) :: influence_distance
831 integer(c_int) :: number_of_neighbor_lists
832 real(c_double) :: cutoffs(1)
833 integer(c_int) :: padding_neighbor_hints(1)
834 integer(c_int) :: half_list_hints(1)
835 real(c_double) :: cutoff
836 real(c_double),
target :: energy
837 real(c_double),
target :: coords(3,n)
838 real(c_double),
target :: forces_kim(3,n)
839 real(c_double) :: forces(3,n)
840 integer(c_int) middledum
841 logical forces_optional
842 logical model_is_compatible
843 integer(c_int) requested_units_accepted
844 real(c_double) rnd, deriv, deriv_err
845 real(c_double),
pointer :: null_pointer
847 nullify(null_pointer)
849 numberofparticles = n
859 call random_seed(size=seed_size)
860 allocate(seed(seed_size))
862 call random_seed(put=seed)
866 print
'("Please enter a valid KIM model name: ")' 872 print *,
'VERIFICATION CHECK: NUMERICAL DERIVATIVE VERIFICATION OF FORCES' 875 print
'("This is Test : ",A)', trim(testname)
876 print
'("Results for KIM Model : ",A)', trim(modelname)
880 call kim_model_create(kim_numbering_one_based, &
882 kim_energy_unit_ev, &
884 kim_temperature_unit_k, &
887 requested_units_accepted, &
890 call my_error(
"kim_api_create", __line__, __file__)
894 if (requested_units_accepted == 0)
then 895 call my_error(
"Must adapt to model units", __line__, __file__)
899 call kim_model_compute_arguments_create(model_handle, &
900 compute_arguments_handle, ierr)
902 call my_error(
"kim_model_compute_arguments_create", __line__, __file__)
906 model_is_compatible, ierr)
908 call my_error(
"error checking compatibility", __line__, __file__)
910 if (.not. model_is_compatible)
then 911 call my_error(
"incompatibility reported by check_model_compatibility", &
920 call my_error(
"Get_Model_Supported_Species", __line__, __file__)
924 allocate(cluster_coords(3,n),cluster_disps(3,n),cluster_species(n))
926 call random_number(rnd)
927 species_code = 1 + int(rnd*num_species)
928 cluster_species(i) = model_species(species_code)
934 cluster_coords, middledum)
939 call random_number(rnd)
940 cluster_disps(j,i) = 0.1_cd*(rnd-0.5_cd)
946 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
947 kim_compute_argument_name_number_of_particles, numberofparticles, ierr2)
949 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
950 kim_compute_argument_name_particle_species_codes, particlespeciescodes, &
953 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
954 kim_compute_argument_name_particle_contributing, particlecontributing, &
957 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
958 kim_compute_argument_name_coordinates, coords, ierr2)
960 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
961 kim_compute_argument_name_partial_energy, energy, ierr2)
963 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
964 kim_compute_argument_name_partial_forces, forces_kim, ierr2)
967 call my_error(
"set_argument_pointer", __line__, __file__)
973 allocate(neighobject%neighborList(n+1,n))
974 neighobject%number_of_particles = n
978 call kim_compute_arguments_set_callback_pointer(compute_arguments_handle, &
979 kim_compute_callback_name_get_neighbor_list, kim_language_name_fortran, &
980 c_funloc(
get_neigh), c_loc(neighobject), ierr)
982 call my_error(
"set_callback_pointer", __line__, __file__)
985 call kim_model_get_influence_distance(model_handle, influence_distance)
986 call kim_model_get_number_of_neighbor_lists(model_handle, &
987 number_of_neighbor_lists)
988 if (number_of_neighbor_lists /= 1)
then 989 call my_error(
"too many neighbor lists", __line__, __file__)
991 call kim_model_get_neighbor_list_values(model_handle, cutoffs, &
992 padding_neighbor_hints, half_list_hints, ierr)
994 call my_error(
"get_neighbor_list_values", __line__, __file__)
999 fccspacing = 0.75_cd*cutoff
1002 cluster_coords(:,i) = fccspacing*cluster_coords(:,i)
1004 print
'("Using FCC lattice parameter: ",f12.5)', fccspacing
1007 call kim_model_get_species_support_and_code(model_handle, &
1008 cluster_species(i), species_is_supported, particlespeciescodes(i), ierr)
1011 call my_error(
"kim_api_get_species_code", __line__, __file__)
1014 particlecontributing(i) = 1
1017 coords(:,i) = cluster_coords(:,i) + cluster_disps(:,i)
1022 do_update_list = .true.
1023 allocate(coordsave(dim,n))
1025 do_update_list,coordsave, &
1028 call my_error(
"update_neighborlist", __line__, __file__)
1033 call kim_model_compute(model_handle, compute_arguments_handle, ierr)
1035 call my_error(
"kim_api_model_compute", __line__, __file__)
1045 print
'("Energy = ",ES25.15)', energy
1051 if (forces_optional)
then 1052 call kim_compute_arguments_set_argument_pointer(compute_arguments_handle, &
1053 kim_compute_argument_name_partial_forces, null_pointer, ierr)
1055 call my_error(
"set_argument_pointer", __line__, __file__)
1061 allocate(forces_num(dim,n),forces_num_err(dim,n))
1065 dim,n,coords,cutoff, &
1066 cutpad, energy, do_update_list, &
1067 coordsave,neighobject,deriv,deriv_err,ierr)
1069 call my_error(
"compute_numer_deriv", __line__, __file__)
1071 forces_num(j,i) = -deriv
1072 forces_num_err(j,i) = deriv_err
1078 print
'(A6,2X,A4,2X,A3,2X,2A25,3A15,2X,A4)',
"Part",
"Spec",
"Dir", &
1079 "Force_model",
"Force_numer",
"Force diff",
"pred error",
"weight", &
1081 forcediff_sumsq = 0.0_cd
1085 forcediff = abs(forces(j,i)-forces_num(j,i))
1086 if (forcediff<forces_num_err(j,i))
then 1091 weight = max(abs(forces_num(j,i)),eps_prec)/ &
1092 max(abs(forces_num_err(j,i)),eps_prec)
1093 term = weight*forcediff**2
1094 if (term.gt.term_max)
then 1099 forcediff_sumsq = forcediff_sumsq + term
1100 weight_sum = weight_sum + weight
1102 print
'(I6,2X,I4,2X,I3,2X,2ES25.15,3ES15.5,2X,A5)', &
1103 i,particlespeciescodes(i),j,forces(j,i),forces_num(j,i), &
1104 forcediff,forces_num_err(j,i),weight,passfail
1106 print
'(14X,I3,2X,2ES25.15,3ES15.5,2X,A5)', &
1107 j,forces(j,i),forces_num(j,i), &
1108 forcediff,forces_num_err(j,i),weight,passfail
1113 alpha = sqrt(forcediff_sumsq/weight_sum)/dble(dim*n)
1115 print
'("alpha = |Force_model - Force_numer|_w/(DIM*N) = ",ES15.5," (units of force)")', &
1118 print
'(''Maximum term obtained for Part = '',I6,'', Dir = '',I1,' // &
1119 ''', forcediff = '',ES15.5, '', forcediff/force_model = '',ES15.5)', &
1120 imax,jmax,abs(forces(jmax,imax)-forces_num(jmax,imax)), &
1121 abs(forces(jmax,imax)-forces_num(jmax,imax))/abs(forces(jmax,imax))
1125 deallocate(forces_num)
1126 deallocate(forces_num_err)
1127 deallocate(neighobject%neighborList)
1128 deallocate(coordsave)
1130 call kim_model_compute_arguments_destroy(model_handle, &
1131 compute_arguments_handle, ierr)
1133 call my_error(
"kim_model_compute_arguments_destroy", __line__, __file__)
1135 call kim_model_destroy(model_handle)
1140 print
'(120(''-''))' 1144 deallocate(cluster_coords,cluster_disps,cluster_species)
subroutine compute_numer_deriv(partnum, dir, model_handle, compute_arguments_handle, DIM, N, coords, cutoff, cutpad, energy, do_update_list, coordsave, neighObject, deriv, deriv_err, ierr)
subroutine my_error(message, line, file)
subroutine get_model_supported_species(model_handle, max_species, model_species, num_species, ier)
subroutine check_model_compatibility(compute_arguments_handle, forces_optional, model_is_compatible, ierr)
program vc_forces_numer_deriv
subroutine neigh_pure_cluster_neighborlist(half, numberOfParticles, coords, cutoff, neighObject)
subroutine update_neighborlist(DIM, N, coords, cutoff, cutpad, do_update_list, coordsave, neighObject, ierr)
subroutine create_fcc_configuration(FCCspacing, nCellsPerSide, periodic, coords, MiddlePartId)
subroutine my_warning(message, line, file)
real(c_double) function dfridr(h, err)
integer(c_int) function, public get_neigh(pkim, mode, request, part, numnei, pnei1part, pRij)