kim-api-v2  2.0.0+912e79a.GNU
An Application Programming Interface (API) for the Knowledgebase of Interatomic Models (KIM).
kim_model_module.f90
Go to the documentation of this file.
1 !
2 ! CDDL HEADER START
3 !
4 ! The contents of this file are subject to the terms of the Common Development
5 ! and Distribution License Version 1.0 (the "License").
6 !
7 ! You can obtain a copy of the license at
8 ! http://www.opensource.org/licenses/CDDL-1.0. See the License for the
9 ! specific language governing permissions and limitations under the License.
10 !
11 ! When distributing Covered Code, include this CDDL HEADER in each file and
12 ! include the License file in a prominent location with the name LICENSE.CDDL.
13 ! If applicable, add the following below this CDDL HEADER, with the fields
14 ! enclosed by brackets "[]" replaced with your own identifying information:
15 !
16 ! Portions Copyright (c) [yyyy] [name of copyright owner]. All rights reserved.
17 !
18 ! CDDL HEADER END
19 !
20 
21 !
22 ! Copyright (c) 2016--2019, Regents of the University of Minnesota.
23 ! All rights reserved.
24 !
25 ! Contributors:
26 ! Ryan S. Elliott
27 !
28 
29 !
30 ! Release: This file is part of the kim-api-v2-2.0.0 package.
31 !
32 
33 
40  use, intrinsic :: iso_c_binding
41  implicit none
42  private
43 
44  public &
45  ! Derived types
46  kim_model_handle_type, &
47 
48  ! Constants
50 
51  ! Routines
52  operator (.eq.), &
53  operator (.ne.), &
56  kim_is_routine_present, &
57  kim_get_influence_distance, &
58  kim_get_number_of_neighbor_lists, &
59  kim_get_neighbor_list_values, &
60  kim_get_units, &
61  kim_compute_arguments_create, &
62  kim_compute_arguments_destroy, &
63  kim_compute, &
64  kim_extension, &
65  kim_clear_then_refresh, &
66  kim_write_parameterized_model, &
67  kim_get_species_support_and_code, &
68  kim_get_number_of_parameters, &
69  kim_get_parameter_metadata, &
70  kim_get_parameter, &
71  kim_set_parameter, &
72  kim_set_simulator_buffer_pointer, &
73  kim_get_simulator_buffer_pointer, &
74  kim_to_string, &
75  kim_set_log_id, &
76  kim_push_log_verbosity, &
77  kim_pop_log_verbosity
78 
79 
85  type, bind(c) :: kim_model_handle_type
86  type(c_ptr) :: p = c_null_ptr
87  end type kim_model_handle_type
88 
92  type(kim_model_handle_type), protected, save &
94 
98  interface operator (.eq.)
99  module procedure kim_model_handle_equal
100  end interface operator (.eq.)
101 
105  interface operator (.ne.)
106  module procedure kim_model_handle_not_equal
107  end interface operator (.ne.)
108 
114  interface kim_is_routine_present
115  module procedure kim_model_is_routine_present
116  end interface kim_is_routine_present
117 
123  interface kim_get_influence_distance
124  module procedure kim_model_get_influence_distance
125  end interface kim_get_influence_distance
126 
132  interface kim_get_number_of_neighbor_lists
134  end interface kim_get_number_of_neighbor_lists
135 
141  interface kim_get_neighbor_list_values
142  module procedure kim_model_get_neighbor_list_values
143  end interface kim_get_neighbor_list_values
144 
150  interface kim_get_units
151  module procedure kim_model_get_units
152  end interface kim_get_units
153 
159  interface kim_compute_arguments_create
160  module procedure kim_model_compute_arguments_create
161  end interface kim_compute_arguments_create
162 
168  interface kim_compute_arguments_destroy
169  module procedure kim_model_compute_arguments_destroy
170  end interface kim_compute_arguments_destroy
171 
177  interface kim_compute
178  module procedure kim_model_compute
179  end interface kim_compute
180 
186  interface kim_extension
187  module procedure kim_model_extension
188  end interface kim_extension
189 
195  interface kim_clear_then_refresh
196  module procedure kim_model_clear_then_refresh
197  end interface kim_clear_then_refresh
198 
204  interface kim_write_parameterized_model
205  module procedure kim_model_write_parameterized_model
206  end interface kim_write_parameterized_model
207 
214  interface kim_get_species_support_and_code
216  end interface kim_get_species_support_and_code
217 
223  interface kim_get_number_of_parameters
224  module procedure kim_model_get_number_of_parameters
225  end interface kim_get_number_of_parameters
226 
232  interface kim_get_parameter_metadata
233  module procedure kim_model_get_parameter_metadata
234  end interface kim_get_parameter_metadata
235 
242  interface kim_get_parameter
243  module procedure kim_model_get_parameter_integer
244  module procedure kim_model_get_parameter_double
245  end interface kim_get_parameter
246 
253  interface kim_set_parameter
254  module procedure kim_model_set_parameter_integer
255  module procedure kim_model_set_parameter_double
256  end interface kim_set_parameter
257 
264  interface kim_set_simulator_buffer_pointer
266  end interface kim_set_simulator_buffer_pointer
267 
274  interface kim_get_simulator_buffer_pointer
276  end interface kim_get_simulator_buffer_pointer
277 
283  interface kim_to_string
284  module procedure kim_model_to_string
285  end interface kim_to_string
286 
292  interface kim_set_log_id
293  module procedure kim_model_set_log_id
294  end interface kim_set_log_id
295 
301  interface kim_push_log_verbosity
302  module procedure kim_model_push_log_verbosity
303  end interface kim_push_log_verbosity
304 
310  interface kim_pop_log_verbosity
311  module procedure kim_model_pop_log_verbosity
312  end interface kim_pop_log_verbosity
313 
314 contains
318  logical recursive function kim_model_handle_equal(lhs, rhs)
319  implicit none
320  type(kim_model_handle_type), intent(in) :: lhs
321  type(kim_model_handle_type), intent(in) :: rhs
322 
323  if ((.not. c_associated(lhs%p)) .and. (.not. c_associated(rhs%p))) then
324  kim_model_handle_equal = .true.
325  else
326  kim_model_handle_equal = c_associated(lhs%p, rhs%p)
327  end if
328  end function kim_model_handle_equal
329 
333  logical recursive function kim_model_handle_not_equal(lhs, rhs)
334  implicit none
335  type(kim_model_handle_type), intent(in) :: lhs
336  type(kim_model_handle_type), intent(in) :: rhs
337 
338  kim_model_handle_not_equal = .not. (lhs .eq. rhs)
339  end function kim_model_handle_not_equal
340 
346  recursive subroutine kim_model_create(numbering, requested_length_unit, &
347  requested_energy_unit, requested_charge_unit, &
348  requested_temperature_unit, requested_time_unit, model_name, &
349  requested_units_accepted, model_handle, ierr)
350  use kim_numbering_module, only : kim_numbering_type
351  use kim_unit_system_module, only : kim_length_unit_type, &
352  kim_energy_unit_type, kim_charge_unit_type, kim_temperature_unit_type, &
353  kim_time_unit_type
354  implicit none
355  interface
356  integer(c_int) recursive function create(numbering, &
357  requested_length_unit, requested_energy_unit, requested_charge_unit, &
358  requested_temperature_unit, requested_time_unit, model_name, &
359  requested_units_accepted, model) bind(c, name="KIM_Model_Create")
360  use, intrinsic :: iso_c_binding
361  use kim_numbering_module, only : kim_numbering_type
362  use kim_unit_system_module, only : kim_length_unit_type, &
363  kim_energy_unit_type, kim_charge_unit_type, &
364  kim_temperature_unit_type, kim_time_unit_type
365  implicit none
366  type(kim_numbering_type), intent(in), value :: numbering
367  type(kim_length_unit_type), intent(in), value :: requested_length_unit
368  type(kim_energy_unit_type), intent(in), value :: requested_energy_unit
369  type(kim_charge_unit_type), intent(in), value :: requested_charge_unit
370  type(kim_temperature_unit_type), intent(in), value :: &
371  requested_temperature_unit
372  type(kim_time_unit_type), intent(in), value :: requested_time_unit
373  character(c_char), intent(in) :: model_name(*)
374  integer(c_int), intent(out) :: requested_units_accepted
375  type(c_ptr), intent(out) :: model
376  end function create
377  end interface
378  type(kim_numbering_type), intent(in) :: numbering
379  type(kim_length_unit_type), intent(in) :: requested_length_unit
380  type(kim_energy_unit_type), intent(in) :: requested_energy_unit
381  type(kim_charge_unit_type), intent(in) :: requested_charge_unit
382  type(kim_temperature_unit_type), intent(in) :: &
383  requested_temperature_unit
384  type(kim_time_unit_type), intent(in) :: requested_time_unit
385  character(len=*, kind=c_char), intent(in) :: model_name
386  integer(c_int), intent(out) :: requested_units_accepted
387  type(kim_model_handle_type), intent(out) :: model_handle
388  integer(c_int), intent(out) :: ierr
389 
390  type(c_ptr) :: pmodel
391 
392  ierr = create(numbering, requested_length_unit, requested_energy_unit, &
393  requested_charge_unit, requested_temperature_unit, requested_time_unit, &
394  trim(model_name)//c_null_char, requested_units_accepted, pmodel)
395  model_handle%p = pmodel
396  end subroutine kim_model_create
397 
403  recursive subroutine kim_model_destroy(model_handle)
404  implicit none
405  interface
406  recursive subroutine destroy(model) bind(c, name="KIM_Model_Destroy")
407  use, intrinsic :: iso_c_binding
408  implicit none
409  type(c_ptr), intent(inout) :: model
410  end subroutine destroy
411  end interface
412  type(kim_model_handle_type), intent(inout) :: model_handle
413 
414  type(c_ptr) :: pmodel
415  pmodel = model_handle%p
416  call destroy(pmodel)
417  model_handle%p = c_null_ptr
418  end subroutine kim_model_destroy
419 
425  recursive subroutine kim_model_is_routine_present(model_handle, &
426  model_routine_name, present, required, ierr)
427  use kim_interoperable_types_module, only : kim_model_type
428  use kim_model_routine_name_module, only : kim_model_routine_name_type
429  implicit none
430  interface
431  integer(c_int) recursive function is_routine_present(model, &
432  model_routine_name, present, required) &
433  bind(c, name="KIM_Model_IsRoutinePresent")
434  use, intrinsic :: iso_c_binding
435  use kim_interoperable_types_module, only : kim_model_type
436  use kim_model_routine_name_module, only : kim_model_routine_name_type
437  implicit none
438  type(kim_model_type), intent(in) :: model
439  type(kim_model_routine_name_type), intent(in), value &
440  :: model_routine_name
441  integer(c_int), intent(out) :: present
442  integer(c_int), intent(out) :: required
443  end function is_routine_present
444  end interface
445  type(kim_model_handle_type), intent(in) :: model_handle
446  type(kim_model_routine_name_type), intent(in) :: model_routine_name
447  integer(c_int), intent(out) :: present
448  integer(c_int), intent(out) :: required
449  integer(c_int), intent(out) :: ierr
450  type(kim_model_type), pointer :: model
451 
452  call c_f_pointer(model_handle%p, model)
453  ierr = is_routine_present(model, model_routine_name, present, required)
454  end subroutine kim_model_is_routine_present
455 
461  recursive subroutine kim_model_get_influence_distance(model_handle, &
462  influence_distance)
463  use kim_interoperable_types_module, only : kim_model_type
464  implicit none
465  interface
466  recursive subroutine get_influence_distance(model, influence_distance) &
467  bind(c, name="KIM_Model_GetInfluenceDistance")
468  use, intrinsic :: iso_c_binding
469  use kim_interoperable_types_module, only : kim_model_type
470  implicit none
471  type(kim_model_type), intent(in) :: model
472  real(c_double), intent(out) :: influence_distance
473  end subroutine get_influence_distance
474  end interface
475  type(kim_model_handle_type), intent(in) :: model_handle
476  real(c_double), intent(out) :: influence_distance
477  type(kim_model_type), pointer :: model
478 
479  call c_f_pointer(model_handle%p, model)
480  call get_influence_distance(model, influence_distance)
481  end subroutine kim_model_get_influence_distance
482 
488  recursive subroutine kim_model_get_number_of_neighbor_lists(model_handle, &
489  number_of_neighbor_lists)
490  use kim_interoperable_types_module, only : kim_model_type
491  implicit none
492  interface
493  recursive subroutine get_neighbor_list_pointers(model, &
494  number_of_neighbor_lists, cutoffs_ptr, &
495  model_will_not_request_neighbors_of_noncontributing__ptr) &
496  bind(c, name="KIM_Model_GetNeighborListPointers")
497  use, intrinsic :: iso_c_binding
498  use kim_interoperable_types_module, only : kim_model_type
499  implicit none
500  type(kim_model_type), intent(in) :: model
501  integer(c_int), intent(out) :: number_of_neighbor_lists
502  type(c_ptr), intent(out) :: cutoffs_ptr
503  type(c_ptr), intent(out) :: &
504  model_will_not_request_neighbors_of_noncontributing__ptr
505  end subroutine get_neighbor_list_pointers
506  end interface
507  type(kim_model_handle_type), intent(in) :: model_handle
508  integer(c_int), intent(out) :: number_of_neighbor_lists
509  type(kim_model_type), pointer :: model
510 
511  type(c_ptr) cutoffs_ptr, hint_ptr
512 
513  call c_f_pointer(model_handle%p, model)
514  call get_neighbor_list_pointers(model, number_of_neighbor_lists, &
515  cutoffs_ptr, hint_ptr)
517 
523  recursive subroutine kim_model_get_neighbor_list_values(model_handle, &
524  cutoffs, model_will_not_request_neighbors_of_noncontributing_particles, &
525  ierr)
526  use kim_interoperable_types_module, only : kim_model_type
527  implicit none
528  interface
529  recursive subroutine get_neighbor_list_pointers(model, &
530  number_of_neighbor_lists, cutoffs_ptr, &
531  model_will_not_request_neighbors_of_noncontributing__ptr) &
532  bind(c, name="KIM_Model_GetNeighborListPointers")
533  use, intrinsic :: iso_c_binding
534  use kim_interoperable_types_module, only : kim_model_type
535  implicit none
536  type(kim_model_type), intent(in) :: model
537  integer(c_int), intent(out) :: number_of_neighbor_lists
538  type(c_ptr), intent(out) :: cutoffs_ptr
539  type(c_ptr), intent(out) :: &
540  model_will_not_request_neighbors_of_noncontributing__ptr
541  end subroutine get_neighbor_list_pointers
542  end interface
543  type(kim_model_handle_type), intent(in) :: model_handle
544  real(c_double), intent(out) :: cutoffs(:)
545  integer(c_int), intent(out) :: &
546  model_will_not_request_neighbors_of_noncontributing_particles(:)
547  integer(c_int), intent(out) :: ierr
548  type(kim_model_type), pointer :: model
549 
550  integer(c_int) number_of_neighbor_lists
551  real(c_double), pointer :: cutoffs_fpointer(:)
552  integer(c_int), pointer :: &
553  model_will_not_request_neighbors_of_noncontributing__fpointer(:)
554  type(c_ptr) cutoffs_ptr
555  type(c_ptr) model_will_not_request_neighbors_of_noncontributing__ptr
556 
557  call c_f_pointer(model_handle%p, model)
558  call get_neighbor_list_pointers(model, number_of_neighbor_lists, &
559  cutoffs_ptr, &
560  model_will_not_request_neighbors_of_noncontributing__ptr)
561  if (c_associated(cutoffs_ptr)) then
562  call c_f_pointer(cutoffs_ptr, cutoffs_fpointer, &
563  [number_of_neighbor_lists])
564  else
565  nullify(cutoffs_fpointer)
566  end if
567  if (size(cutoffs) < number_of_neighbor_lists) then
568  ierr = 1
569  else
570  ierr = 0
571  cutoffs = cutoffs_fpointer(1:number_of_neighbor_lists)
572  end if
573 
574  if (c_associated( &
575  model_will_not_request_neighbors_of_noncontributing__ptr)) then
576  call c_f_pointer( &
577  model_will_not_request_neighbors_of_noncontributing__ptr, &
578  model_will_not_request_neighbors_of_noncontributing__fpointer, &
579  [number_of_neighbor_lists])
580  else
581  nullify( &
582  model_will_not_request_neighbors_of_noncontributing__fpointer)
583  end if
584  if (size( &
585  model_will_not_request_neighbors_of_noncontributing_particles) &
586  < number_of_neighbor_lists) then
587  ierr = 1
588  else
589  ierr = 0
590  model_will_not_request_neighbors_of_noncontributing_particles = &
591  model_will_not_request_neighbors_of_noncontributing__fpointer( &
592  1:number_of_neighbor_lists)
593  end if
595 
601  recursive subroutine kim_model_get_units(model_handle, length_unit, &
602  energy_unit, charge_unit, temperature_unit, time_unit)
603  use kim_unit_system_module, only : kim_length_unit_type, &
604  kim_energy_unit_type, kim_charge_unit_type, kim_temperature_unit_type, &
605  kim_time_unit_type
606  use kim_interoperable_types_module, only : kim_model_type
607  implicit none
608  interface
609  recursive subroutine get_units(model, length_unit, energy_unit, &
610  charge_unit, temperature_unit, time_unit) &
611  bind(c, name="KIM_Model_GetUnits")
612  use, intrinsic :: iso_c_binding
613  use kim_unit_system_module, only : kim_length_unit_type, &
614  kim_energy_unit_type, kim_charge_unit_type, &
615  kim_temperature_unit_type, kim_time_unit_type
616  use kim_interoperable_types_module, only : kim_model_type
617  type(kim_model_type), intent(in) :: model
618  type(kim_length_unit_type), intent(out) :: length_unit
619  type(kim_energy_unit_type), intent(out) :: energy_unit
620  type(kim_charge_unit_type), intent(out) :: charge_unit
621  type(kim_temperature_unit_type), intent(out) :: temperature_unit
622  type(kim_time_unit_type), intent(out) :: time_unit
623  end subroutine get_units
624  end interface
625  type(kim_model_handle_type), intent(in) :: model_handle
626  type(kim_length_unit_type), intent(out) :: length_unit
627  type(kim_energy_unit_type), intent(out) :: energy_unit
628  type(kim_charge_unit_type), intent(out) :: charge_unit
629  type(kim_temperature_unit_type), intent(out) :: temperature_unit
630  type(kim_time_unit_type), intent(out) :: time_unit
631  type(kim_model_type), pointer :: model
632 
633  call c_f_pointer(model_handle%p, model)
634  call get_units(model, length_unit, energy_unit, charge_unit, &
635  temperature_unit, time_unit)
636  end subroutine kim_model_get_units
637 
643  recursive subroutine kim_model_compute_arguments_create(model_handle, &
644  compute_arguments_handle, ierr)
646  kim_compute_arguments_handle_type
647  use kim_interoperable_types_module, only : kim_model_type
648  implicit none
649  interface
650  integer(c_int) recursive function compute_arguments_create(model, &
651  compute_arguments) bind(c, name="KIM_Model_ComputeArgumentsCreate")
652  use, intrinsic :: iso_c_binding
653  use kim_interoperable_types_module, only : kim_model_type
654  implicit none
655  type(kim_model_type), intent(in) :: model
656  type(c_ptr), intent(out) :: compute_arguments
657  end function compute_arguments_create
658  end interface
659  type(kim_model_handle_type), intent(in) :: model_handle
660  type(kim_compute_arguments_handle_type), intent(out) :: &
661  compute_arguments_handle
662  integer(c_int), intent(out) :: ierr
663  type(kim_model_type), pointer :: model
664  type(c_ptr) :: pcompute_arguments
665 
666  call c_f_pointer(model_handle%p, model)
667 
668  ierr = compute_arguments_create(model, pcompute_arguments)
669  if (ierr == 0) then
670  compute_arguments_handle%p = pcompute_arguments
671  end if
673 
679  recursive subroutine kim_model_compute_arguments_destroy(model_handle, &
680  compute_arguments_handle, ierr)
682  kim_compute_arguments_handle_type
683  use kim_interoperable_types_module, only : kim_model_type
684  implicit none
685  interface
686  integer(c_int) recursive function compute_arguments_destroy(model, &
687  compute_arguments) bind(c, name="KIM_Model_ComputeArgumentsDestroy")
688  use, intrinsic :: iso_c_binding
689  use kim_interoperable_types_module, only : kim_model_type
690  implicit none
691  type(kim_model_type), intent(in) :: model
692  type(c_ptr), intent(inout) :: compute_arguments
693  end function compute_arguments_destroy
694  end interface
695  type(kim_model_handle_type), intent(in) :: model_handle
696  type(kim_compute_arguments_handle_type), intent(inout) :: &
697  compute_arguments_handle
698  integer(c_int), intent(out) :: ierr
699  type(kim_model_type), pointer :: model
700  type(c_ptr) pcompute_arguments
701 
702  call c_f_pointer(model_handle%p, model)
703  pcompute_arguments = compute_arguments_handle%p
704  ierr = compute_arguments_destroy(model, pcompute_arguments)
705  if (ierr /= 0) then
706  compute_arguments_handle%p = c_null_ptr
707  end if
709 
715  recursive subroutine kim_model_compute(model_handle, &
716  compute_arguments_handle, ierr)
717  use kim_compute_arguments_module, only : kim_compute_arguments_handle_type
718  use kim_interoperable_types_module, only : kim_compute_arguments_type, &
719  kim_model_type
720  implicit none
721  interface
722  integer(c_int) recursive function compute(model, compute_arguments) &
723  bind(c, name="KIM_Model_Compute")
724  use, intrinsic :: iso_c_binding
725  use kim_interoperable_types_module, only : kim_compute_arguments_type
726  use kim_interoperable_types_module, only : kim_model_type
727  implicit none
728  type(kim_model_type), intent(in) :: model
729  type(kim_compute_arguments_type), intent(in) :: compute_arguments
730  end function compute
731  end interface
732  type(kim_model_handle_type), intent(in) :: model_handle
733  type(kim_compute_arguments_handle_type), intent(in) :: &
734  compute_arguments_handle
735  integer(c_int), intent(out) :: ierr
736  type(kim_model_type), pointer :: model
737  type(kim_compute_arguments_type), pointer :: compute_arguments
738 
739  call c_f_pointer(model_handle%p, model)
740  call c_f_pointer(compute_arguments_handle%p, compute_arguments)
741  ierr = compute(model, compute_arguments)
742  end subroutine kim_model_compute
743 
749  recursive subroutine kim_model_extension(model_handle, extension_id, &
750  extension_structure, ierr)
751  use kim_interoperable_types_module, only : kim_model_type
752  implicit none
753  interface
754  integer(c_int) recursive function extension(model, extension_id, &
755  extension_structure) bind(c, name="KIM_Model_Extension")
756  use, intrinsic :: iso_c_binding
757  use kim_interoperable_types_module, only : kim_model_type
758  implicit none
759  type(kim_model_type), intent(in) :: model
760  character(c_char), intent(in) :: extension_id(*)
761  type(c_ptr), intent(in), value :: extension_structure
762  end function extension
763  end interface
764  type(kim_model_handle_type), intent(in) :: model_handle
765  character(len=*, kind=c_char), intent(in) :: extension_id
766  type(c_ptr), intent(in) :: extension_structure
767  integer(c_int), intent(out) :: ierr
768  type(kim_model_type), pointer :: model
769 
770  call c_f_pointer(model_handle%p, model)
771  ierr = extension(model, trim(extension_id)//c_null_char, &
772  extension_structure)
773  end subroutine kim_model_extension
774 
780  recursive subroutine kim_model_clear_then_refresh(model_handle, ierr)
781  use kim_interoperable_types_module, only : kim_model_type
782  implicit none
783  interface
784  integer(c_int) recursive function clear_then_refresh(model) &
785  bind(c, name="KIM_Model_ClearThenRefresh")
786  use, intrinsic :: iso_c_binding
787  use kim_interoperable_types_module, only : kim_model_type
788  implicit none
789  type(kim_model_type), intent(in) :: model
790  end function clear_then_refresh
791  end interface
792  type(kim_model_handle_type), intent(in) :: model_handle
793  integer(c_int), intent(out) :: ierr
794  type(kim_model_type), pointer :: model
795 
796  call c_f_pointer(model_handle%p, model)
797  ierr = clear_then_refresh(model)
798  end subroutine kim_model_clear_then_refresh
799 
805  recursive subroutine kim_model_write_parameterized_model(model_handle, &
806  path, model_name, ierr)
807  use kim_interoperable_types_module, only : kim_model_type
808  implicit none
809  interface
810  integer(c_int) recursive function write_parameterized_model(model, &
811  path, model_name) bind(c, name="KIM_Model_WriteParameterizedModel")
812  use, intrinsic :: iso_c_binding
813  use kim_interoperable_types_module, only : kim_model_type
814  implicit none
815  type(kim_model_type), intent(in) :: model
816  character(c_char), intent(in) :: path(*)
817  character(c_char), intent(in) :: model_name(*)
818  end function write_parameterized_model
819  end interface
820  type(kim_model_handle_type), intent(in) :: model_handle
821  character(len=*, kind=c_char), intent(in) :: path
822  character(len=*, kind=c_char), intent(in) :: model_name
823  integer(c_int), intent(out) :: ierr
824  type(kim_model_type), pointer :: model
825 
826  call c_f_pointer(model_handle%p, model)
827  ierr = write_parameterized_model(model, trim(path)//c_null_char, &
828  trim(model_name)//c_null_char)
830 
837  recursive subroutine kim_model_get_species_support_and_code(model_handle, &
838  species_name, species_is_supported, code, ierr)
839  use kim_species_name_module, only : kim_species_name_type
840  use kim_interoperable_types_module, only : kim_model_type
841  implicit none
842  interface
843  integer(c_int) recursive function get_species_support_and_code(model, &
844  species_name, species_is_supported, code) &
845  bind(c, name="KIM_Model_GetSpeciesSupportAndCode")
846  use, intrinsic :: iso_c_binding
847  use kim_species_name_module, only : kim_species_name_type
848  use kim_interoperable_types_module, only : kim_model_type
849  implicit none
850  type(kim_model_type), intent(in) :: model
851  type(kim_species_name_type), intent(in), value :: species_name
852  integer(c_int), intent(out) :: species_is_supported
853  integer(c_int), intent(out) :: code
854  end function get_species_support_and_code
855  end interface
856  type(kim_model_handle_type), intent(in) :: model_handle
857  type(kim_species_name_type), intent(in) :: species_name
858  integer(c_int), intent(out) :: species_is_supported
859  integer(c_int), intent(out) :: code
860  integer(c_int), intent(out) :: ierr
861  type(kim_model_type), pointer :: model
862 
863  call c_f_pointer(model_handle%p, model)
864  ierr = get_species_support_and_code(model, species_name, &
865  species_is_supported, code)
867 
873  recursive subroutine kim_model_get_number_of_parameters(model_handle, &
874  number_of_parameters)
875  use kim_interoperable_types_module, only : kim_model_type
876  implicit none
877  interface
878  recursive subroutine get_number_of_parameters(model, &
879  number_of_parameters) bind(c, name="KIM_Model_GetNumberOfParameters")
880  use, intrinsic :: iso_c_binding
881  use kim_interoperable_types_module, only : kim_model_type
882  implicit none
883  type(kim_model_type), intent(in) :: model
884  integer(c_int), intent(out) :: number_of_parameters
885  end subroutine get_number_of_parameters
886  end interface
887  type(kim_model_handle_type), intent(in) :: model_handle
888  integer(c_int), intent(out) :: number_of_parameters
889  type(kim_model_type), pointer :: model
890 
891  call c_f_pointer(model_handle%p, model)
892  call get_number_of_parameters(model, number_of_parameters)
894 
900  recursive subroutine kim_model_get_parameter_metadata(model_handle, &
901  parameter_index, data_type, extent, name, description, ierr)
902  use kim_data_type_module, only : kim_data_type_type
903  use kim_convert_string_module, only : kim_convert_c_char_ptr_to_string
904  use kim_interoperable_types_module, only : kim_model_type
905  implicit none
906  interface
907  integer(c_int) recursive function get_parameter_metadata(model, &
908  parameter_index, data_type, extent, name, description) &
909  bind(c, name="KIM_Model_GetParameterMetadata")
910  use, intrinsic :: iso_c_binding
911  use kim_data_type_module, only : kim_data_type_type
912  use kim_interoperable_types_module, only : kim_model_type
913  implicit none
914  type(kim_model_type), intent(in) :: model
915  integer(c_int), intent(in), value :: parameter_index
916  type(kim_data_type_type), intent(out) :: data_type
917  integer(c_int), intent(out) :: extent
918  type(c_ptr), intent(out) :: name
919  type(c_ptr), intent(out) :: description
920  end function get_parameter_metadata
921  end interface
922  type(kim_model_handle_type), intent(in) :: model_handle
923  integer(c_int), intent(in) :: parameter_index
924  type(kim_data_type_type), intent(out) :: data_type
925  integer(c_int), intent(out) :: extent
926  character(len=*, kind=c_char), intent(out) :: name
927  character(len=*, kind=c_char), intent(out) :: description
928  integer(c_int), intent(out) :: ierr
929  type(kim_model_type), pointer :: model
930 
931  type(c_ptr) :: pname, pdesc
932 
933  call c_f_pointer(model_handle%p, model)
934  ierr = get_parameter_metadata(model, parameter_index-1, data_type, extent, &
935  pname, pdesc)
936  call kim_convert_c_char_ptr_to_string(pname, name)
937  call kim_convert_c_char_ptr_to_string(pdesc, description)
938  end subroutine kim_model_get_parameter_metadata
939 
945  recursive subroutine kim_model_get_parameter_integer(model_handle, &
946  parameter_index, array_index, parameter_value, ierr)
947  use kim_interoperable_types_module, only : kim_model_type
948  implicit none
949  interface
950  integer(c_int) recursive function get_parameter_integer(model, &
951  parameter_index, array_index, parameter_value) &
952  bind(c, name="KIM_Model_GetParameterInteger")
953  use, intrinsic :: iso_c_binding
954  use kim_interoperable_types_module, only : kim_model_type
955  implicit none
956  type(kim_model_type), intent(in) :: model
957  integer(c_int), intent(in), value :: parameter_index
958  integer(c_int), intent(in), value :: array_index
959  integer(c_int), intent(out) :: parameter_value
960  end function get_parameter_integer
961  end interface
962  type(kim_model_handle_type), intent(in) :: model_handle
963  integer(c_int), intent(in) :: parameter_index
964  integer(c_int), intent(in) :: array_index
965  integer(c_int), intent(out) :: parameter_value
966  integer(c_int), intent(out) :: ierr
967  type(kim_model_type), pointer :: model
968 
969  call c_f_pointer(model_handle%p, model)
970  ierr = get_parameter_integer(model, parameter_index-1, array_index-1, &
971  parameter_value)
972  end subroutine kim_model_get_parameter_integer
973 
979  recursive subroutine kim_model_get_parameter_double(model_handle, &
980  parameter_index, array_index, parameter_value, ierr)
981  use kim_interoperable_types_module, only : kim_model_type
982  implicit none
983  interface
984  integer(c_int) recursive function get_parameter_double(model, &
985  parameter_index, array_index, parameter_value) &
986  bind(c, name="KIM_Model_GetParameterDouble")
987  use, intrinsic :: iso_c_binding
988  use kim_interoperable_types_module, only : kim_model_type
989  implicit none
990  type(kim_model_type), intent(in) :: model
991  integer(c_int), intent(in), value :: parameter_index
992  integer(c_int), intent(in), value :: array_index
993  real(c_double), intent(out) :: parameter_value
994  end function get_parameter_double
995  end interface
996  type(kim_model_handle_type), intent(in) :: model_handle
997  integer(c_int), intent(in) :: parameter_index
998  integer(c_int), intent(in) :: array_index
999  real(c_double), intent(out) :: parameter_value
1000  integer(c_int), intent(out) :: ierr
1001  type(kim_model_type), pointer :: model
1002 
1003  call c_f_pointer(model_handle%p, model)
1004  ierr = get_parameter_double(model, parameter_index-1, array_index-1, &
1005  parameter_value)
1006  end subroutine kim_model_get_parameter_double
1007 
1013  recursive subroutine kim_model_set_parameter_integer(model_handle, &
1014  parameter_index, array_index, parameter_value, ierr)
1015  use kim_interoperable_types_module, only : kim_model_type
1016  implicit none
1017  interface
1018  integer(c_int) recursive function set_parameter_integer(model, &
1019  parameter_index, array_index, parameter_value) &
1020  bind(c, name="KIM_Model_SetParameterInteger")
1021  use, intrinsic :: iso_c_binding
1022  use kim_interoperable_types_module, only : kim_model_type
1023  implicit none
1024  type(kim_model_type), intent(in) :: model
1025  integer(c_int), intent(in), value :: parameter_index
1026  integer(c_int), intent(in), value :: array_index
1027  integer(c_int), intent(in), value :: parameter_value
1028  end function set_parameter_integer
1029  end interface
1030  type(kim_model_handle_type), intent(in) :: model_handle
1031  integer(c_int), intent(in) :: parameter_index
1032  integer(c_int), intent(in) :: array_index
1033  integer(c_int), intent(in) :: parameter_value
1034  integer(c_int), intent(out) :: ierr
1035  type(kim_model_type), pointer :: model
1036 
1037  call c_f_pointer(model_handle%p, model)
1038  ierr = set_parameter_integer(model, parameter_index-1, array_index-1, &
1039  parameter_value)
1040  end subroutine kim_model_set_parameter_integer
1041 
1047  recursive subroutine kim_model_set_parameter_double(model_handle, &
1048  parameter_index, array_index, parameter_value, ierr)
1049  use kim_interoperable_types_module, only : kim_model_type
1050  implicit none
1051  interface
1052  integer(c_int) recursive function set_parameter_double(model, &
1053  parameter_index, array_index, parameter_value) &
1054  bind(c, name="KIM_Model_SetParameterDouble")
1055  use, intrinsic :: iso_c_binding
1056  use kim_interoperable_types_module, only : kim_model_type
1057  implicit none
1058  type(kim_model_type), intent(in) :: model
1059  integer(c_int), intent(in), value :: parameter_index
1060  integer(c_int), intent(in), value :: array_index
1061  real(c_double), intent(in), value :: parameter_value
1062  end function set_parameter_double
1063  end interface
1064  type(kim_model_handle_type), intent(in) :: model_handle
1065  integer(c_int), intent(in) :: parameter_index
1066  integer(c_int), intent(in) :: array_index
1067  real(c_double), intent(in) :: parameter_value
1068  integer(c_int), intent(out) :: ierr
1069  type(kim_model_type), pointer :: model
1070 
1071  call c_f_pointer(model_handle%p, model)
1072  ierr = set_parameter_double(model, parameter_index-1, array_index-1, &
1073  parameter_value)
1074  end subroutine kim_model_set_parameter_double
1075 
1082  recursive subroutine kim_model_set_simulator_buffer_pointer(model_handle, ptr)
1083  use kim_interoperable_types_module, only : kim_model_type
1084  implicit none
1085  interface
1086  recursive subroutine set_simulator_buffer_pointer(model, ptr) &
1087  bind(c, name="KIM_Model_SetSimulatorBufferPointer")
1088  use, intrinsic :: iso_c_binding
1089  use kim_interoperable_types_module, only : kim_model_type
1090  implicit none
1091  type(kim_model_type), intent(in) :: model
1092  type(c_ptr), intent(in), value :: ptr
1093  end subroutine set_simulator_buffer_pointer
1094  end interface
1095  type(kim_model_handle_type), intent(in) :: model_handle
1096  type(c_ptr), intent(in) :: ptr
1097  type(kim_model_type), pointer :: model
1098 
1099  call c_f_pointer(model_handle%p, model)
1100  call set_simulator_buffer_pointer(model, ptr)
1102 
1109  recursive subroutine kim_model_get_simulator_buffer_pointer(model_handle, ptr)
1110  use kim_interoperable_types_module, only : kim_model_type
1111  implicit none
1112  interface
1113  recursive subroutine get_simulator_buffer_pointer(model, ptr) &
1114  bind(c, name="KIM_Model_GetSimulatorBufferPointer")
1115  use, intrinsic :: iso_c_binding
1116  use kim_interoperable_types_module, only : kim_model_type
1117  implicit none
1118  type(kim_model_type), intent(in) :: model
1119  type(c_ptr), intent(out) :: ptr
1120  end subroutine get_simulator_buffer_pointer
1121  end interface
1122  type(kim_model_handle_type), intent(in) :: model_handle
1123  type(c_ptr), intent(out) :: ptr
1124  type(kim_model_type), pointer :: model
1125 
1126  call c_f_pointer(model_handle%p, model)
1127  call get_simulator_buffer_pointer(model, ptr)
1129 
1135  recursive subroutine kim_model_to_string(model_handle, string)
1136  use kim_convert_string_module, only : kim_convert_c_char_ptr_to_string
1137  use kim_interoperable_types_module, only : kim_model_type
1138  implicit none
1139  interface
1140  type(c_ptr) recursive function model_string(model) &
1141  bind(c, name="KIM_Model_ToString")
1142  use, intrinsic :: iso_c_binding
1143  use kim_interoperable_types_module, only : kim_model_type
1144  implicit none
1145  type(kim_model_type), intent(in) :: model
1146  end function model_string
1147  end interface
1148  type(kim_model_handle_type), intent(in) :: model_handle
1149  character(len=*, kind=c_char), intent(out) :: string
1150  type(kim_model_type), pointer :: model
1151 
1152  type(c_ptr) :: p
1153 
1154  call c_f_pointer(model_handle%p, model)
1155  p = model_string(model)
1156  call kim_convert_c_char_ptr_to_string(p, string)
1157  end subroutine kim_model_to_string
1158 
1164  recursive subroutine kim_model_set_log_id(model_handle, log_id)
1165  use kim_interoperable_types_module, only : kim_model_type
1166  implicit none
1167  interface
1168  recursive subroutine set_log_id(model, log_id) &
1169  bind(c, name="KIM_Model_SetLogID")
1170  use, intrinsic :: iso_c_binding
1171  use kim_interoperable_types_module, only : kim_model_type
1172  implicit none
1173  type(kim_model_type), intent(in) :: model
1174  character(c_char), intent(in) :: log_id(*)
1175  end subroutine set_log_id
1176  end interface
1177  type(kim_model_handle_type), intent(in) :: model_handle
1178  character(len=*, kind=c_char), intent(in) :: log_id
1179  type(kim_model_type), pointer :: model
1180 
1181  call c_f_pointer(model_handle%p, model)
1182  call set_log_id(model, trim(log_id)//c_null_char)
1183  end subroutine kim_model_set_log_id
1184 
1190  recursive subroutine kim_model_push_log_verbosity(model_handle, log_verbosity)
1191  use kim_log_verbosity_module, only : kim_log_verbosity_type
1192  use kim_interoperable_types_module, only : kim_model_type
1193  implicit none
1194  interface
1195  recursive subroutine push_log_verbosity(model, log_verbosity) &
1196  bind(c, name="KIM_Model_PushLogVerbosity")
1197  use, intrinsic :: iso_c_binding
1198  use kim_log_verbosity_module, only : kim_log_verbosity_type
1199  use kim_interoperable_types_module, only : kim_model_type
1200  implicit none
1201  type(kim_model_type), intent(in) :: model
1202  type(kim_log_verbosity_type), intent(in), value :: log_verbosity
1203  end subroutine push_log_verbosity
1204  end interface
1205  type(kim_model_handle_type), intent(in) :: model_handle
1206  type(kim_log_verbosity_type), intent(in) :: log_verbosity
1207  type(kim_model_type), pointer :: model
1208 
1209  call c_f_pointer(model_handle%p, model)
1210  call push_log_verbosity(model, log_verbosity)
1211  end subroutine kim_model_push_log_verbosity
1212 
1218  recursive subroutine kim_model_pop_log_verbosity(model_handle)
1219  use kim_log_verbosity_module, only : kim_log_verbosity_type
1220  use kim_interoperable_types_module, only : kim_model_type
1221  implicit none
1222  interface
1223  recursive subroutine pop_log_verbosity(model) &
1224  bind(c, name="KIM_Model_PopLogVerbosity")
1225  use, intrinsic :: iso_c_binding
1226  use kim_log_verbosity_module, only : kim_log_verbosity_type
1227  use kim_interoperable_types_module, only : kim_model_type
1228  implicit none
1229  type(kim_model_type), intent(in) :: model
1230  end subroutine pop_log_verbosity
1231  end interface
1232  type(kim_model_handle_type), intent(in) :: model_handle
1233  type(kim_model_type), pointer :: model
1234 
1235  call c_f_pointer(model_handle%p, model)
1236  call pop_log_verbosity(model)
1237  end subroutine kim_model_pop_log_verbosity
1238 end module kim_model_module
recursive subroutine, public kim_model_destroy(model_handle)
Destroy a previously Model::Create&#39;d object.
recursive subroutine kim_model_get_influence_distance(model_handle, influence_distance)
Get the Model&#39;s influence distance.
recursive subroutine kim_model_to_string(model_handle, string)
Get a string representing the internal state of the Model object.
recursive subroutine kim_model_get_parameter_double(model_handle, parameter_index, array_index, parameter_value, ierr)
Get a parameter value from the Model.
recursive subroutine kim_model_compute_arguments_create(model_handle, compute_arguments_handle, ierr)
Create a new ComputeArguments object for the Model object.
recursive subroutine kim_model_clear_then_refresh(model_handle, ierr)
Clear influence distance and neighbor list pointers and refresh Model object after parameter changes...
recursive subroutine kim_model_compute(model_handle, compute_arguments_handle, ierr)
Call the Model&#39;s MODEL_ROUTINE_NAME::Compute routine.
An Extensible Enumeration for the ModelRoutineName&#39;s supported by the KIM API.
recursive subroutine kim_model_get_neighbor_list_values(model_handle, cutoffs, model_will_not_request_neighbors_of_noncontributing_particles, ierr)
Get Model&#39;s neighbor list values.
recursive subroutine kim_model_set_log_id(model_handle, log_id)
Set the identity of the Log object associated with the Model object.
recursive subroutine kim_model_push_log_verbosity(model_handle, log_verbosity)
Push a new LogVerbosity onto the Model object&#39;s Log object verbosity stack.
recursive subroutine kim_model_write_parameterized_model(model_handle, path, model_name, ierr)
Call the Model&#39;s MODEL_ROUTINE_NAME::WriteParameterizedModel routine.
An Extensible Enumeration for the Numbering&#39;s supported by the KIM API.
recursive subroutine kim_model_set_parameter_double(model_handle, parameter_index, array_index, parameter_value, ierr)
Set a parameter value for the Model.
type(kim_model_handle_type), save, public, protected kim_model_null_handle
NULL handle for use in comparisons.
recursive subroutine kim_model_get_number_of_parameters(model_handle, number_of_parameters)
Get the number of parameter arrays provided by the Model.
static int compute_arguments_create(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsCreate *const modelComputeArgumentsCreate)
recursive subroutine kim_model_get_parameter_metadata(model_handle, parameter_index, data_type, extent, name, description, ierr)
Get the metadata associated with one of the Model&#39;s parameter arrays.
recursive subroutine kim_model_get_number_of_neighbor_lists(model_handle, number_of_neighbor_lists)
Get Model&#39;s number of neighbor lists.
recursive subroutine kim_model_get_parameter_integer(model_handle, parameter_index, array_index, parameter_value, ierr)
Get a parameter value from the Model.
Provides the primary interface to a KIM API Model object and is meant to be used by simulators...
An Extensible Enumeration for the SpeciesName&#39;s supported by the KIM API.
recursive subroutine kim_model_get_simulator_buffer_pointer(model_handle, ptr)
Get the Simulator&#39;s buffer pointer from the Model object.
Provides the primary interface to a KIM API ComputeArguments object and is meant to be used by simula...
recursive subroutine kim_model_set_parameter_integer(model_handle, parameter_index, array_index, parameter_value, ierr)
Set a parameter value for the Model.
recursive subroutine kim_model_set_simulator_buffer_pointer(model_handle, ptr)
Set the Simulator&#39;s buffer pointer within the Model object.
recursive subroutine kim_model_get_species_support_and_code(model_handle, species_name, species_is_supported, code, ierr)
Get the Model&#39;s support and code for the requested SpeciesName.
recursive subroutine, public kim_model_create(numbering, requested_length_unit, requested_energy_unit, requested_charge_unit, requested_temperature_unit, requested_time_unit, model_name, requested_units_accepted, model_handle, ierr)
Create a new KIM API Model object.
recursive subroutine kim_model_extension(model_handle, extension_id, extension_structure, ierr)
Call the Model&#39;s MODEL_ROUTINE_NAME::Extension routine.
An Extensible Enumeration for the DataType&#39;s supported by the KIM API.
recursive subroutine kim_model_pop_log_verbosity(model_handle)
Pop a LogVerbosity from the Model object&#39;s Log object verbosity stack.
static int write_parameterized_model(KIM_ModelWriteParameterizedModel const *const modelWriteParameterizedModel)
static int compute_arguments_destroy(KIM_ModelCompute const *const modelCompute, KIM_ModelComputeArgumentsDestroy *const modelComputeArgumentsDestroy)
An Extensible Enumeration for the LogVerbosity&#39;s supported by the KIM API.
recursive subroutine kim_model_get_units(model_handle, length_unit, energy_unit, charge_unit, temperature_unit, time_unit)
Get the Model&#39;s base unit values.
recursive subroutine kim_model_compute_arguments_destroy(model_handle, compute_arguments_handle, ierr)
Destroy a previously Model::ComputeArgumentsCreate&#39;d object.