kim-api  2.3.1-git+v2.3.0-git-2-g378406f9.GNU.GNU.
An Application Programming Interface (API) for the Knowledgebase of Interatomic Models (KIM).
kim_model_driver_create_module.f90
Go to the documentation of this file.
1 !
2 ! KIM-API: An API for interatomic models
3 ! Copyright (c) 2013--2022, Regents of the University of Minnesota.
4 ! All rights reserved.
5 !
6 ! Contributors:
7 ! Ryan S. Elliott
8 !
9 ! SPDX-License-Identifier: LGPL-2.1-or-later
10 !
11 ! This library is free software; you can redistribute it and/or
12 ! modify it under the terms of the GNU Lesser General Public
13 ! License as published by the Free Software Foundation; either
14 ! version 2.1 of the License, or (at your option) any later version.
15 !
16 ! This library is distributed in the hope that it will be useful,
17 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ! Lesser General Public License for more details.
20 !
21 ! You should have received a copy of the GNU Lesser General Public License
22 ! along with this library; if not, write to the Free Software Foundation,
23 ! Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 !
25 
26 !
27 ! Release: This file is part of the kim-api.git repository.
28 !
29 
36  use, intrinsic :: iso_c_binding
37  implicit none
38  private
39 
40  public &
41  ! Derived types
42  kim_model_driver_create_handle_type, &
43  ! Constants
45  ! Routines
46  operator(.eq.), &
47  operator(.ne.), &
48  kim_get_parameter_file_directory_name, &
49  kim_get_number_of_parameter_files, &
50  kim_get_parameter_file_name, &
51  kim_get_parameter_file_basename, &
52  kim_set_model_numbering, &
53  kim_set_influence_distance_pointer, &
54  kim_set_neighbor_list_pointers, &
55  kim_set_routine_pointer, &
56  kim_set_species_code, &
57  kim_set_parameter_pointer, &
58  kim_set_model_buffer_pointer, &
59  kim_set_units, &
60  kim_convert_unit, &
61  kim_log_entry, &
62  kim_to_string
63 
69  type, bind(c) :: kim_model_driver_create_handle_type
70  type(c_ptr) :: p = c_null_ptr
71  end type kim_model_driver_create_handle_type
72 
76  type(kim_model_driver_create_handle_type), protected, save &
78 
82  interface operator(.eq.)
83  module procedure kim_model_driver_create_handle_equal
84  end interface operator(.eq.)
85 
89  interface operator(.ne.)
90  module procedure kim_model_driver_create_handle_not_equal
91  end interface operator(.ne.)
92 
99  interface kim_get_parameter_file_directory_name
100  module procedure kim_model_driver_create_get_parameter_file_directory_name
101  end interface kim_get_parameter_file_directory_name
102 
109  interface kim_get_number_of_parameter_files
111  end interface kim_get_number_of_parameter_files
112 
122  interface kim_get_parameter_file_name
124  end interface kim_get_parameter_file_name
125 
132  interface kim_get_parameter_file_basename
134  end interface kim_get_parameter_file_basename
135 
142  interface kim_set_model_numbering
144  end interface kim_set_model_numbering
145 
152  interface kim_set_influence_distance_pointer
154  end interface kim_set_influence_distance_pointer
155 
162  interface kim_set_neighbor_list_pointers
164  end interface kim_set_neighbor_list_pointers
165 
172  interface kim_set_routine_pointer
174  end interface kim_set_routine_pointer
175 
182  interface kim_set_species_code
184  end interface kim_set_species_code
185 
193  interface kim_set_parameter_pointer
196  end interface kim_set_parameter_pointer
197 
204  interface kim_set_model_buffer_pointer
206  end interface kim_set_model_buffer_pointer
207 
213  interface kim_set_units
214  module procedure kim_model_driver_create_set_units
215  end interface kim_set_units
216 
222  interface kim_convert_unit
223  module procedure kim_model_driver_create_convert_unit
224  end interface kim_convert_unit
225 
231  interface kim_log_entry
232  module procedure kim_model_driver_create_log_entry
233  end interface kim_log_entry
234 
240  interface kim_to_string
241  module procedure kim_model_driver_create_to_string
242  end interface kim_to_string
243 
244 contains
248  logical recursive function kim_model_driver_create_handle_equal(lhs, rhs)
249  implicit none
250  type(kim_model_driver_create_handle_type), intent(in) :: lhs
251  type(kim_model_driver_create_handle_type), intent(in) :: rhs
252 
253  if ((.not. c_associated(lhs%p)) .and. (.not. c_associated(rhs%p))) then
254  kim_model_driver_create_handle_equal = .true.
255  else
256  kim_model_driver_create_handle_equal = c_associated(lhs%p, rhs%p)
257  end if
258  end function kim_model_driver_create_handle_equal
259 
263  logical recursive function kim_model_driver_create_handle_not_equal(lhs, rhs)
264  implicit none
265  type(kim_model_driver_create_handle_type), intent(in) :: lhs
266  type(kim_model_driver_create_handle_type), intent(in) :: rhs
267 
268  kim_model_driver_create_handle_not_equal = .not. (lhs == rhs)
269  end function kim_model_driver_create_handle_not_equal
270 
277  recursive subroutine &
278  kim_model_driver_create_get_parameter_file_directory_name( &
279  model_driver_create_handle, directory_name)
280  use kim_interoperable_types_module, only: kim_model_driver_create_type
281  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
282  implicit none
283  interface
284  recursive subroutine get_parameter_file_directory_name( &
285  model_driver_create, directory_name) &
286  bind(c, name="KIM_ModelDriverCreate_GetParameterFileDirectoryName")
287  use, intrinsic :: iso_c_binding
288  use kim_interoperable_types_module, only: kim_model_driver_create_type
289  implicit none
290  type(kim_model_driver_create_type), intent(in) :: model_driver_create
291  type(c_ptr), intent(out) :: directory_name
292  end subroutine get_parameter_file_directory_name
293  end interface
294  type(kim_model_driver_create_handle_type), intent(in) :: &
295  model_driver_create_handle
296  character(len=*, kind=c_char), intent(out) :: directory_name
297  type(kim_model_driver_create_type), pointer :: model_driver_create
298 
299  type(c_ptr) pdirectory_name
300 
301  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
302  call get_parameter_file_directory_name(model_driver_create, pdirectory_name)
303  call kim_convert_c_char_ptr_to_string(pdirectory_name, directory_name)
304  end subroutine kim_model_driver_create_get_parameter_file_directory_name
305 
313  model_driver_create_handle, number_of_parameter_files)
314  use kim_interoperable_types_module, only: kim_model_driver_create_type
315  implicit none
316  interface
317  recursive subroutine get_number_of_parameter_files( &
318  model_driver_create, number_of_parameter_files) &
319  bind(c, name="KIM_ModelDriverCreate_GetNumberOfParameterFiles")
320  use, intrinsic :: iso_c_binding
321  use kim_interoperable_types_module, only: kim_model_driver_create_type
322  implicit none
323  type(kim_model_driver_create_type), intent(in) &
324  :: model_driver_create
325  integer(c_int), intent(out) :: number_of_parameter_files
326  end subroutine get_number_of_parameter_files
327  end interface
328  type(kim_model_driver_create_handle_type), intent(in) &
329  :: model_driver_create_handle
330  integer(c_int), intent(out) :: number_of_parameter_files
331  type(kim_model_driver_create_type), pointer :: model_driver_create
332 
333  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
334  call get_number_of_parameter_files(model_driver_create, &
335  number_of_parameter_files)
337 
348  model_driver_create_handle, index, parameter_file_name, ierr)
349  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
350  use kim_interoperable_types_module, only: kim_model_driver_create_type
351  implicit none
352  interface
353  integer(c_int) recursive function get_parameter_file_name( &
354  model_driver_create, index, parameter_file_name) &
355  bind(c, name="KIM_ModelDriverCreate_GetParameterFileName")
356  use, intrinsic :: iso_c_binding
357  use kim_interoperable_types_module, only: kim_model_driver_create_type
358  implicit none
359  type(kim_model_driver_create_type), intent(in) &
360  :: model_driver_create
361  integer(c_int), intent(in), value :: index
362  type(c_ptr), intent(out) :: parameter_file_name
363  end function get_parameter_file_name
364  end interface
365  type(kim_model_driver_create_handle_type), intent(in) &
366  :: model_driver_create_handle
367  integer(c_int), intent(in) :: index
368  character(len=*, kind=c_char), intent(out) :: parameter_file_name
369  integer(c_int), intent(out) :: ierr
370  type(kim_model_driver_create_type), pointer :: model_driver_create
371 
372  type(c_ptr) :: p
373 
374  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
375  ierr = get_parameter_file_name(model_driver_create, &
376  index - 1, p)
377  call kim_convert_c_char_ptr_to_string(p, parameter_file_name)
379 
387  model_driver_create_handle, index, parameter_file_basename, ierr)
388  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
389  use kim_interoperable_types_module, only: kim_model_driver_create_type
390  implicit none
391  interface
392  integer(c_int) recursive function get_parameter_file_basename( &
393  model_driver_create, index, parameter_file_basename) &
394  bind(c, name="KIM_ModelDriverCreate_GetParameterFileBasename")
395  use, intrinsic :: iso_c_binding
396  use kim_interoperable_types_module, only: kim_model_driver_create_type
397  implicit none
398  type(kim_model_driver_create_type), intent(in) &
399  :: model_driver_create
400  integer(c_int), intent(in), value :: index
401  type(c_ptr), intent(out) :: parameter_file_basename
402  end function get_parameter_file_basename
403  end interface
404  type(kim_model_driver_create_handle_type), intent(in) &
405  :: model_driver_create_handle
406  integer(c_int), intent(in) :: index
407  character(len=*, kind=c_char), intent(out) :: parameter_file_basename
408  integer(c_int), intent(out) :: ierr
409  type(kim_model_driver_create_type), pointer :: model_driver_create
410 
411  type(c_ptr) :: p
412 
413  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
414  ierr = get_parameter_file_basename(model_driver_create, &
415  index - 1, p)
416  call kim_convert_c_char_ptr_to_string(p, parameter_file_basename)
418 
425  recursive subroutine kim_model_driver_create_set_model_numbering( &
426  model_driver_create_handle, numbering, ierr)
427  use kim_numbering_module, only: kim_numbering_type
428  use kim_interoperable_types_module, only: kim_model_driver_create_type
429  implicit none
430  interface
431  integer(c_int) recursive function set_model_numbering( &
432  model_driver_create, numbering) &
433  bind(c, name="KIM_ModelDriverCreate_SetModelNumbering")
434  use, intrinsic :: iso_c_binding
435  use kim_numbering_module, only: kim_numbering_type
436  use kim_interoperable_types_module, only: kim_model_driver_create_type
437  implicit none
438  type(kim_model_driver_create_type), intent(in) &
439  :: model_driver_create
440  type(kim_numbering_type), intent(in), value :: numbering
441  end function set_model_numbering
442  end interface
443  type(kim_model_driver_create_handle_type), intent(in) &
444  :: model_driver_create_handle
445  type(kim_numbering_type), intent(in) :: numbering
446  integer(c_int), intent(out) :: ierr
447  type(kim_model_driver_create_type), pointer :: model_driver_create
448 
449  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
450  ierr = set_model_numbering(model_driver_create, numbering)
452 
460  model_driver_create_handle, influence_distance)
461  use kim_interoperable_types_module, only: kim_model_driver_create_type
462  implicit none
463  interface
464  recursive subroutine set_influence_distance_pointer(model_driver_create, &
465  influence_distance) &
466  bind(c, name="KIM_ModelDriverCreate_SetInfluenceDistancePointer")
467  use, intrinsic :: iso_c_binding
468  use kim_interoperable_types_module, only: kim_model_driver_create_type
469  implicit none
470  type(kim_model_driver_create_type), intent(in) &
471  :: model_driver_create
472  type(c_ptr), intent(in), value :: influence_distance
473  end subroutine set_influence_distance_pointer
474  end interface
475  type(kim_model_driver_create_handle_type), intent(in) &
476  :: model_driver_create_handle
477  real(c_double), intent(in), target :: influence_distance
478  type(kim_model_driver_create_type), pointer :: model_driver_create
479 
480  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
481  call set_influence_distance_pointer(model_driver_create, &
482  c_loc(influence_distance))
484 
492  model_driver_create_handle, number_of_neighbor_lists, cutoffs, &
493  model_will_not_request_neighbors_of_noncontributing_particles)
494  use kim_interoperable_types_module, only: kim_model_driver_create_type
495  implicit none
496  interface
497  recursive subroutine set_neighbor_list_pointers( &
498  model_driver_create, number_of_neighbor_lists, cutoffs_ptr, &
499  model_will_not_request_neighbors_of_noncontributing_particles) &
500  bind(c, name="KIM_ModelDriverCreate_SetNeighborListPointers")
501  use, intrinsic :: iso_c_binding
502  use kim_interoperable_types_module, only: kim_model_driver_create_type
503  implicit none
504  type(kim_model_driver_create_type), intent(in) &
505  :: model_driver_create
506  integer(c_int), intent(in), value :: number_of_neighbor_lists
507  type(c_ptr), intent(in), value :: cutoffs_ptr
508  type(c_ptr), intent(in), value :: &
509  model_will_not_request_neighbors_of_noncontributing_particles
510  end subroutine set_neighbor_list_pointers
511  end interface
512  type(kim_model_driver_create_handle_type), intent(in) &
513  :: model_driver_create_handle
514  integer(c_int), intent(in) :: number_of_neighbor_lists
515  real(c_double), intent(in), target :: cutoffs(number_of_neighbor_lists)
516  integer(c_int), intent(in), target :: &
517  model_will_not_request_neighbors_of_noncontributing_particles( &
518  number_of_neighbor_lists)
519 
520  type(kim_model_driver_create_type), pointer :: model_driver_create
521 
522  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
523  call set_neighbor_list_pointers( &
524  model_driver_create, number_of_neighbor_lists, c_loc(cutoffs), &
525  c_loc(model_will_not_request_neighbors_of_noncontributing_particles))
527 
534  recursive subroutine kim_model_driver_create_set_routine_pointer( &
535  model_driver_create_handle, model_routine_name, language_name, required, &
536  fptr, ierr)
537  use kim_model_routine_name_module, only: kim_model_routine_name_type
538  use kim_language_name_module, only: kim_language_name_type
539  use kim_interoperable_types_module, only: kim_model_driver_create_type
540  implicit none
541  interface
542  integer(c_int) recursive function set_routine_pointer( &
543  model_driver_create, model_routine_name, language_name, required, &
544  fptr) bind(c, name="KIM_ModelDriverCreate_SetRoutinePointer")
545  use, intrinsic :: iso_c_binding
546  use kim_model_routine_name_module, only: kim_model_routine_name_type
547  use kim_language_name_module, only: kim_language_name_type
548  use kim_interoperable_types_module, only: kim_model_driver_create_type
549  implicit none
550  type(kim_model_driver_create_type), intent(in) &
551  :: model_driver_create
552  type(kim_model_routine_name_type), intent(in), value &
553  :: model_routine_name
554  type(kim_language_name_type), intent(in), value :: language_name
555  integer(c_int), intent(in), value :: required
556  type(c_funptr), intent(in), value :: fptr
557  end function set_routine_pointer
558  end interface
559  type(kim_model_driver_create_handle_type), intent(in) &
560  :: model_driver_create_handle
561  type(kim_model_routine_name_type), intent(in) :: model_routine_name
562  type(kim_language_name_type), intent(in) :: language_name
563  integer(c_int), intent(in) :: required
564  type(c_funptr), intent(in), value :: fptr ! must be left as "value"!?!
565  integer(c_int), intent(out) :: ierr
566  type(kim_model_driver_create_type), pointer :: model_driver_create
567 
568  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
569  ierr = set_routine_pointer(model_driver_create, model_routine_name, &
570  language_name, required, fptr)
572 
579  recursive subroutine kim_model_driver_create_set_species_code( &
580  model_driver_create_handle, species_name, code, ierr)
581  use kim_species_name_module, only: kim_species_name_type
582  use kim_interoperable_types_module, only: kim_model_driver_create_type
583  implicit none
584  interface
585  integer(c_int) recursive function set_species_code(model_driver_create, &
586  species_name, code) &
587  bind(c, name="KIM_ModelDriverCreate_SetSpeciesCode")
588  use, intrinsic :: iso_c_binding
589  use kim_species_name_module, only: kim_species_name_type
590  use kim_interoperable_types_module, only: kim_model_driver_create_type
591  implicit none
592  type(kim_model_driver_create_type), intent(in) &
593  :: model_driver_create
594  type(kim_species_name_type), intent(in), value :: species_name
595  integer(c_int), intent(in), value :: code
596  end function set_species_code
597  end interface
598  type(kim_model_driver_create_handle_type), intent(in) &
599  :: model_driver_create_handle
600  type(kim_species_name_type), intent(in) :: species_name
601  integer(c_int), intent(in) :: code
602  integer(c_int), intent(out) :: ierr
603  type(kim_model_driver_create_type), pointer :: model_driver_create
604 
605  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
606  ierr = set_species_code(model_driver_create, species_name, code)
608 
616  model_driver_create_handle, int1, name, description, ierr)
617  use kim_interoperable_types_module, only: kim_model_driver_create_type
618  implicit none
619  type(kim_model_driver_create_handle_type), intent(in) &
620  :: model_driver_create_handle
621  integer(c_int), intent(in), target :: int1(:)
622  character(len=*, kind=c_char), intent(in) :: name
623  character(len=*, kind=c_char), intent(in) :: description
624  integer(c_int), intent(out) :: ierr
625  type(kim_model_driver_create_type), pointer :: model_driver_create
626 
627  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
628  call set_parameter(model_driver_create, size(int1, 1, c_int), int1, &
629  name, description, ierr)
630  return
631 
632  contains
633  recursive subroutine set_parameter(model_driver_create, extent, int1, &
634  name, description, ierr)
635  use kim_interoperable_types_module, only: kim_model_driver_create_type
636  implicit none
637  interface
638  integer(c_int) recursive function set_parameter_pointer_integer( &
639  model_driver_create, extent, ptr, name, description) &
640  bind(c, name="KIM_ModelDriverCreate_SetParameterPointerInteger")
641  use, intrinsic :: iso_c_binding
642  use kim_interoperable_types_module, only: &
643  kim_model_driver_create_type
644  implicit none
645  type(kim_model_driver_create_type), intent(in) &
646  :: model_driver_create
647  integer(c_int), intent(in), value :: extent
648  type(c_ptr), intent(in), value :: ptr
649  character(c_char), intent(in) :: name(*)
650  character(c_char), intent(in) :: description(*)
651  end function set_parameter_pointer_integer
652  end interface
653  type(kim_model_driver_create_type), intent(in) &
654  :: model_driver_create
655  integer(c_int), intent(in) :: extent
656  integer(c_int), intent(in), target :: int1(extent)
657  character(len=*, kind=c_char), intent(in) :: name
658  character(len=*, kind=c_char), intent(in) :: description
659  integer(c_int), intent(out) :: ierr
660 
661  ierr = set_parameter_pointer_integer(model_driver_create, &
662  extent, &
663  c_loc(int1), &
664  trim(name)//c_null_char, &
665  trim(description)//c_null_char)
666  end subroutine set_parameter
668 
676  model_driver_create_handle, double1, name, description, ierr)
677  use kim_interoperable_types_module, only: kim_model_driver_create_type
678  implicit none
679  type(kim_model_driver_create_handle_type), intent(in) &
680  :: model_driver_create_handle
681  real(c_double), intent(in), target :: double1(:)
682  character(len=*, kind=c_char), intent(in) :: name
683  character(len=*, kind=c_char), intent(in) :: description
684  integer(c_int), intent(out) :: ierr
685  type(kim_model_driver_create_type), pointer :: model_driver_create
686 
687  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
688  call set_parameter(model_driver_create, size(double1, 1, c_int), &
689  double1, name, description, ierr)
690  return
691 
692  contains
693  recursive subroutine set_parameter(model_driver_create, extent, double1, &
694  name, description, ierr)
695  use kim_interoperable_types_module, only: kim_model_driver_create_type
696  implicit none
697  interface
698  integer(c_int) recursive function set_parameter_pointer_double( &
699  model_driver_create, extent, ptr, name, description) &
700  bind(c, name="KIM_ModelDriverCreate_SetParameterPointerDouble")
701  use, intrinsic :: iso_c_binding
702  use kim_interoperable_types_module, only: &
703  kim_model_driver_create_type
704  implicit none
705  type(kim_model_driver_create_type), intent(in) &
706  :: model_driver_create
707  integer(c_int), intent(in), value :: extent
708  type(c_ptr), intent(in), value :: ptr
709  character(c_char), intent(in) :: name(*)
710  character(c_char), intent(in) :: description(*)
711  end function set_parameter_pointer_double
712  end interface
713  type(kim_model_driver_create_type), intent(in) &
714  :: model_driver_create
715  integer(c_int), intent(in) :: extent
716  real(c_double), intent(in), target :: double1(extent)
717  character(len=*, kind=c_char), intent(in) :: name
718  character(len=*, kind=c_char), intent(in) :: description
719  integer(c_int), intent(out) :: ierr
720 
721  ierr = set_parameter_pointer_double(model_driver_create, &
722  extent, &
723  c_loc(double1), &
724  trim(name)//c_null_char, &
725  trim(description)//c_null_char)
726  end subroutine set_parameter
728 
736  model_driver_create_handle, ptr)
737  use kim_interoperable_types_module, only: kim_model_driver_create_type
738  implicit none
739  interface
740  recursive subroutine set_model_buffer_pointer(model_driver_create, ptr) &
741  bind(c, name="KIM_ModelDriverCreate_SetModelBufferPointer")
742  use, intrinsic :: iso_c_binding
743  use kim_interoperable_types_module, only: kim_model_driver_create_type
744  implicit none
745  type(kim_model_driver_create_type), intent(in) &
746  :: model_driver_create
747  type(c_ptr), intent(in), value :: ptr
748  end subroutine set_model_buffer_pointer
749  end interface
750  type(kim_model_driver_create_handle_type), intent(in) &
751  :: model_driver_create_handle
752  type(c_ptr), intent(in) :: ptr
753  type(kim_model_driver_create_type), pointer :: model_driver_create
754 
755  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
756  call set_model_buffer_pointer(model_driver_create, ptr)
758 
764  recursive subroutine kim_model_driver_create_set_units( &
765  model_driver_create_handle, length_unit, energy_unit, charge_unit, &
766  temperature_unit, time_unit, ierr)
767  use kim_unit_system_module, only: kim_length_unit_type, &
768  kim_energy_unit_type, &
769  kim_charge_unit_type, &
770  kim_temperature_unit_type, &
771  kim_time_unit_type
772  use kim_interoperable_types_module, only: kim_model_driver_create_type
773  implicit none
774  interface
775  integer(c_int) recursive function set_units( &
776  model_driver_create, length_unit, energy_unit, charge_unit, &
777  temperature_unit, time_unit) &
778  bind(c, name="KIM_ModelDriverCreate_SetUnits")
779  use, intrinsic :: iso_c_binding
780  use kim_unit_system_module, only: kim_length_unit_type, &
781  kim_energy_unit_type, &
782  kim_charge_unit_type, &
783  kim_temperature_unit_type, &
784  kim_time_unit_type
785  use kim_interoperable_types_module, only: kim_model_driver_create_type
786  implicit none
787  type(kim_model_driver_create_type), intent(in) &
788  :: model_driver_create
789  type(kim_length_unit_type), intent(in), value :: length_unit
790  type(kim_energy_unit_type), intent(in), value :: energy_unit
791  type(kim_charge_unit_type), intent(in), value :: charge_unit
792  type(kim_temperature_unit_type), intent(in), value :: temperature_unit
793  type(kim_time_unit_type), intent(in), value :: time_unit
794  end function set_units
795  end interface
796  type(kim_model_driver_create_handle_type), intent(in) &
797  :: model_driver_create_handle
798  type(kim_length_unit_type), intent(in) :: length_unit
799  type(kim_energy_unit_type), intent(in) :: energy_unit
800  type(kim_charge_unit_type), intent(in) :: charge_unit
801  type(kim_temperature_unit_type), intent(in) :: temperature_unit
802  type(kim_time_unit_type), intent(in) :: time_unit
803  integer(c_int), intent(out) :: ierr
804  type(kim_model_driver_create_type), pointer :: model_driver_create
805 
806  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
807  ierr = set_units(model_driver_create, length_unit, energy_unit, &
808  charge_unit, temperature_unit, time_unit)
809  end subroutine kim_model_driver_create_set_units
810 
816  recursive subroutine kim_model_driver_create_convert_unit( &
817  from_length_unit, from_energy_unit, &
818  from_charge_unit, from_temperature_unit, from_time_unit, &
819  to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
820  to_time_unit, length_exponent, energy_exponent, charge_exponent, &
821  temperature_exponent, time_exponent, conversion_factor, ierr)
822  use kim_unit_system_module, only: kim_length_unit_type
823  use kim_unit_system_module, only: kim_energy_unit_type
824  use kim_unit_system_module, only: kim_charge_unit_type
825  use kim_unit_system_module, only: kim_temperature_unit_type
826  use kim_unit_system_module, only: kim_time_unit_type
827  implicit none
828  interface
829  integer(c_int) recursive function convert_unit( &
830  from_length_unit, from_energy_unit, &
831  from_charge_unit, from_temperature_unit, from_time_unit, &
832  to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
833  to_time_unit, length_exponent, energy_exponent, charge_exponent, &
834  temperature_exponent, time_exponent, conversion_factor) &
835  bind(c, name="KIM_ModelDriverCreate_ConvertUnit")
836  use, intrinsic :: iso_c_binding
837  use kim_unit_system_module, only: kim_length_unit_type
838  use kim_unit_system_module, only: kim_energy_unit_type
839  use kim_unit_system_module, only: kim_charge_unit_type
840  use kim_unit_system_module, only: kim_temperature_unit_type
841  use kim_unit_system_module, only: kim_time_unit_type
842  implicit none
843  type(kim_length_unit_type), intent(in), value :: from_length_unit
844  type(kim_energy_unit_type), intent(in), value :: from_energy_unit
845  type(kim_charge_unit_type), intent(in), value :: from_charge_unit
846  type(kim_temperature_unit_type), intent(in), value :: &
847  from_temperature_unit
848  type(kim_time_unit_type), intent(in), value :: from_time_unit
849  type(kim_length_unit_type), intent(in), value :: to_length_unit
850  type(kim_energy_unit_type), intent(in), value :: to_energy_unit
851  type(kim_charge_unit_type), intent(in), value :: to_charge_unit
852  type(kim_temperature_unit_type), intent(in), value :: &
853  to_temperature_unit
854  type(kim_time_unit_type), intent(in), value :: to_time_unit
855  real(c_double), intent(in), value :: length_exponent
856  real(c_double), intent(in), value :: energy_exponent
857  real(c_double), intent(in), value :: charge_exponent
858  real(c_double), intent(in), value :: temperature_exponent
859  real(c_double), intent(in), value :: time_exponent
860  real(c_double), intent(out) :: conversion_factor
861  end function convert_unit
862  end interface
863  type(kim_length_unit_type), intent(in) :: from_length_unit
864  type(kim_energy_unit_type), intent(in) :: from_energy_unit
865  type(kim_charge_unit_type), intent(in) :: from_charge_unit
866  type(kim_temperature_unit_type), intent(in) :: from_temperature_unit
867  type(kim_time_unit_type), intent(in) :: from_time_unit
868  type(kim_length_unit_type), intent(in) :: to_length_unit
869  type(kim_energy_unit_type), intent(in) :: to_energy_unit
870  type(kim_charge_unit_type), intent(in) :: to_charge_unit
871  type(kim_temperature_unit_type), intent(in) :: to_temperature_unit
872  type(kim_time_unit_type), intent(in) :: to_time_unit
873  real(c_double), intent(in) :: length_exponent
874  real(c_double), intent(in) :: energy_exponent
875  real(c_double), intent(in) :: charge_exponent
876  real(c_double), intent(in) :: temperature_exponent
877  real(c_double), intent(in) :: time_exponent
878  real(c_double), intent(out) :: conversion_factor
879  integer(c_int), intent(out) :: ierr
880 
881  ierr = convert_unit(from_length_unit, from_energy_unit, from_charge_unit, &
882  from_temperature_unit, from_time_unit, to_length_unit, &
883  to_energy_unit, to_charge_unit, to_temperature_unit, &
884  to_time_unit, length_exponent, energy_exponent, &
885  charge_exponent, temperature_exponent, time_exponent, &
886  conversion_factor)
888 
894  recursive subroutine kim_model_driver_create_log_entry( &
895  model_driver_create_handle, log_verbosity, message)
896  use kim_log_verbosity_module, only: kim_log_verbosity_type
897  use kim_interoperable_types_module, only: kim_model_driver_create_type
898  implicit none
899  interface
900  recursive subroutine log_entry(model_driver_create, log_verbosity, &
901  message, line_number, file_name) &
902  bind(c, name="KIM_ModelDriverCreate_LogEntry")
903  use, intrinsic :: iso_c_binding
904  use kim_log_verbosity_module, only: kim_log_verbosity_type
905  use kim_interoperable_types_module, only: kim_model_driver_create_type
906  implicit none
907  type(kim_model_driver_create_type), intent(in) &
908  :: model_driver_create
909  type(kim_log_verbosity_type), intent(in), value :: log_verbosity
910  character(c_char), intent(in) :: message(*)
911  integer(c_int), intent(in), value :: line_number
912  character(c_char), intent(in) :: file_name(*)
913  end subroutine log_entry
914  end interface
915  type(kim_model_driver_create_handle_type), intent(in) &
916  :: model_driver_create_handle
917  type(kim_log_verbosity_type), intent(in) :: log_verbosity
918  character(len=*, kind=c_char), intent(in) :: message
919  type(kim_model_driver_create_type), pointer :: model_driver_create
920 
921  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
922  call log_entry(model_driver_create, log_verbosity, &
923  trim(message)//c_null_char, 0, ""//c_null_char)
924  end subroutine kim_model_driver_create_log_entry
925 
931  recursive subroutine kim_model_driver_create_to_string( &
932  model_driver_create_handle, string)
933  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
934  use kim_interoperable_types_module, only: kim_model_driver_create_type
935  implicit none
936  interface
937  type(c_ptr) recursive function model_driver_create_string( &
938  model_driver_create) &
939  bind(c, name="KIM_ModelDriverCreate_ToString")
940  use, intrinsic :: iso_c_binding
941  use kim_interoperable_types_module, only: kim_model_driver_create_type
942  implicit none
943  type(kim_model_driver_create_type), intent(in) &
944  :: model_driver_create
945  end function model_driver_create_string
946  end interface
947  type(kim_model_driver_create_handle_type), intent(in) &
948  :: model_driver_create_handle
949  character(len=*, kind=c_char), intent(out) :: string
950  type(kim_model_driver_create_type), pointer :: model_driver_create
951 
952  type(c_ptr) :: p
953 
954  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
955  p = model_driver_create_string(model_driver_create)
956  call kim_convert_c_char_ptr_to_string(p, string)
957  end subroutine kim_model_driver_create_to_string
recursive subroutine kim_model_driver_create_convert_unit(from_length_unit, from_energy_unit, from_charge_unit, from_temperature_unit, from_time_unit, to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, to_time_unit, length_exponent, energy_exponent, charge_exponent, temperature_exponent, time_exponent, conversion_factor, ierr)
Get the multiplicative factor to convert between a derived unit represented in two different sets of ...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
recursive subroutine kim_model_driver_create_get_parameter_file_name(model_driver_create_handle, index, parameter_file_name, ierr)
Get a particular parameter file name.
recursive subroutine kim_model_driver_create_set_neighbor_list_pointers(model_driver_create_handle, number_of_neighbor_lists, cutoffs, model_will_not_request_neighbors_of_noncontributing_particles)
Set the Model's neighbor list data pointers.
recursive subroutine kim_model_driver_create_set_influence_distance_pointer(model_driver_create_handle, influence_distance)
Set the Model's influence distance data pointer.
recursive subroutine kim_model_driver_create_get_parameter_file_basename(model_driver_create_handle, index, parameter_file_basename, ierr)
Get a particular parameter file basename. The file is located in the Model's parameter file directory...
recursive subroutine kim_model_driver_create_log_entry(model_driver_create_handle, log_verbosity, message)
Write a log entry into the log file.
An Extensible Enumeration for the ModelRoutineName's supported by the KIM API.
recursive subroutine kim_model_driver_create_set_parameter_pointer_integer(model_driver_create_handle, int1, name, description, ierr)
Set the next parameter data pointer to be provided by the model.
recursive subroutine kim_model_driver_create_set_units(model_driver_create_handle, length_unit, energy_unit, charge_unit, temperature_unit, time_unit, ierr)
Set the Model's base unit values.
recursive subroutine kim_model_driver_create_set_model_numbering(model_driver_create_handle, numbering, ierr)
Set the Model's particle Numbering.
An Extensible Enumeration for the Numbering's supported by the KIM API.
recursive subroutine kim_model_driver_create_set_species_code(model_driver_create_handle, species_name, code, ierr)
Set integer code for supported SpeciesName.
An Extensible Enumeration for the LanguageName's supported by the KIM API.
recursive subroutine kim_model_driver_create_set_model_buffer_pointer(model_driver_create_handle, ptr)
Set the Model's buffer pointer within the Model object.
An Extensible Enumeration for the SpeciesName's supported by the KIM API.
int model_driver_create(KIM_ModelDriverCreate *const modelDriverCreate, KIM_LengthUnit const requestedLengthUnit, KIM_EnergyUnit const requestedEnergyUnit, KIM_ChargeUnit const requestedChargeUnit, KIM_TemperatureUnit const requestedTemperatureUnit, KIM_TimeUnit const requestedTimeUnit)
recursive subroutine set_parameter(model_create, extent, int1, name, description, ierr)
recursive subroutine kim_model_driver_create_get_number_of_parameter_files(model_driver_create_handle, number_of_parameter_files)
Get the number of parameter files provided by the parameterized model.
recursive subroutine kim_model_driver_create_to_string(model_driver_create_handle, string)
Get a string representing the internal state of the Model object.
type(kim_model_driver_create_handle_type), save, public, protected kim_model_driver_create_null_handle
NULL handle for use in comparisons.
recursive subroutine kim_model_driver_create_set_routine_pointer(model_driver_create_handle, model_routine_name, language_name, required, fptr, ierr)
Set the function pointer for the ModelRoutineName of interest.
recursive subroutine kim_model_driver_create_set_parameter_pointer_double(model_driver_create_handle, double1, name, description, ierr)
Set the next parameter data pointer to be provided by the model.
An Extensible Enumeration for the LogVerbosity's supported by the KIM API.