kim-api  2.2.1+v2.2.1.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 ! 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--2020, 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-2.2.1 package.
31 !
32 
39  use, intrinsic :: iso_c_binding
40  implicit none
41  private
42 
43  public &
44  ! Derived types
45  kim_model_driver_create_handle_type, &
46  ! Constants
48  ! Routines
49  operator(.eq.), &
50  operator(.ne.), &
51  kim_get_parameter_file_directory_name, &
52  kim_get_number_of_parameter_files, &
53  kim_get_parameter_file_name, &
54  kim_get_parameter_file_basename, &
55  kim_set_model_numbering, &
56  kim_set_influence_distance_pointer, &
57  kim_set_neighbor_list_pointers, &
58  kim_set_routine_pointer, &
59  kim_set_species_code, &
60  kim_set_parameter_pointer, &
61  kim_set_model_buffer_pointer, &
62  kim_set_units, &
63  kim_convert_unit, &
64  kim_log_entry, &
65  kim_to_string
66 
72  type, bind(c) :: kim_model_driver_create_handle_type
73  type(c_ptr) :: p = c_null_ptr
74  end type kim_model_driver_create_handle_type
75 
79  type(kim_model_driver_create_handle_type), protected, save &
81 
85  interface operator(.eq.)
86  module procedure kim_model_driver_create_handle_equal
87  end interface operator(.eq.)
88 
92  interface operator(.ne.)
93  module procedure kim_model_driver_create_handle_not_equal
94  end interface operator(.ne.)
95 
102  interface kim_get_parameter_file_directory_name
103  module procedure kim_model_driver_create_get_parameter_file_directory_name
104  end interface kim_get_parameter_file_directory_name
105 
112  interface kim_get_number_of_parameter_files
114  end interface kim_get_number_of_parameter_files
115 
125  interface kim_get_parameter_file_name
127  end interface kim_get_parameter_file_name
128 
135  interface kim_get_parameter_file_basename
137  end interface kim_get_parameter_file_basename
138 
145  interface kim_set_model_numbering
147  end interface kim_set_model_numbering
148 
155  interface kim_set_influence_distance_pointer
157  end interface kim_set_influence_distance_pointer
158 
165  interface kim_set_neighbor_list_pointers
167  end interface kim_set_neighbor_list_pointers
168 
175  interface kim_set_routine_pointer
177  end interface kim_set_routine_pointer
178 
185  interface kim_set_species_code
187  end interface kim_set_species_code
188 
196  interface kim_set_parameter_pointer
199  end interface kim_set_parameter_pointer
200 
207  interface kim_set_model_buffer_pointer
209  end interface kim_set_model_buffer_pointer
210 
216  interface kim_set_units
217  module procedure kim_model_driver_create_set_units
218  end interface kim_set_units
219 
225  interface kim_convert_unit
226  module procedure kim_model_driver_create_convert_unit
227  end interface kim_convert_unit
228 
234  interface kim_log_entry
235  module procedure kim_model_driver_create_log_entry
236  end interface kim_log_entry
237 
243  interface kim_to_string
244  module procedure kim_model_driver_create_to_string
245  end interface kim_to_string
246 
247 contains
251  logical recursive function kim_model_driver_create_handle_equal(lhs, rhs)
252  implicit none
253  type(kim_model_driver_create_handle_type), intent(in) :: lhs
254  type(kim_model_driver_create_handle_type), intent(in) :: rhs
255 
256  if ((.not. c_associated(lhs%p)) .and. (.not. c_associated(rhs%p))) then
257  kim_model_driver_create_handle_equal = .true.
258  else
259  kim_model_driver_create_handle_equal = c_associated(lhs%p, rhs%p)
260  end if
261  end function kim_model_driver_create_handle_equal
262 
266  logical recursive function kim_model_driver_create_handle_not_equal(lhs, rhs)
267  implicit none
268  type(kim_model_driver_create_handle_type), intent(in) :: lhs
269  type(kim_model_driver_create_handle_type), intent(in) :: rhs
270 
271  kim_model_driver_create_handle_not_equal = .not. (lhs == rhs)
272  end function kim_model_driver_create_handle_not_equal
273 
280  recursive subroutine &
281  kim_model_driver_create_get_parameter_file_directory_name( &
282  model_driver_create_handle, directory_name)
283  use kim_interoperable_types_module, only: kim_model_driver_create_type
284  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
285  implicit none
286  interface
287  recursive subroutine get_parameter_file_directory_name( &
288  model_driver_create, directory_name) &
289  bind(c, name="KIM_ModelDriverCreate_GetParameterFileDirectoryName")
290  use, intrinsic :: iso_c_binding
291  use kim_interoperable_types_module, only: kim_model_driver_create_type
292  implicit none
293  type(kim_model_driver_create_type), intent(in) :: model_driver_create
294  type(c_ptr), intent(out) :: directory_name
295  end subroutine get_parameter_file_directory_name
296  end interface
297  type(kim_model_driver_create_handle_type), intent(in) :: &
298  model_driver_create_handle
299  character(len=*, kind=c_char), intent(out) :: directory_name
300  type(kim_model_driver_create_type), pointer :: model_driver_create
301 
302  type(c_ptr) pdirectory_name
303 
304  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
305  call get_parameter_file_directory_name(model_driver_create, pdirectory_name)
306  call kim_convert_c_char_ptr_to_string(pdirectory_name, directory_name)
307  end subroutine kim_model_driver_create_get_parameter_file_directory_name
308 
316  model_driver_create_handle, number_of_parameter_files)
317  use kim_interoperable_types_module, only: kim_model_driver_create_type
318  implicit none
319  interface
320  recursive subroutine get_number_of_parameter_files( &
321  model_driver_create, number_of_parameter_files) &
322  bind(c, name="KIM_ModelDriverCreate_GetNumberOfParameterFiles")
323  use, intrinsic :: iso_c_binding
324  use kim_interoperable_types_module, only: kim_model_driver_create_type
325  implicit none
326  type(kim_model_driver_create_type), intent(in) &
327  :: model_driver_create
328  integer(c_int), intent(out) :: number_of_parameter_files
329  end subroutine get_number_of_parameter_files
330  end interface
331  type(kim_model_driver_create_handle_type), intent(in) &
332  :: model_driver_create_handle
333  integer(c_int), intent(out) :: number_of_parameter_files
334  type(kim_model_driver_create_type), pointer :: model_driver_create
335 
336  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
337  call get_number_of_parameter_files(model_driver_create, &
338  number_of_parameter_files)
340 
351  model_driver_create_handle, index, parameter_file_name, ierr)
352  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
353  use kim_interoperable_types_module, only: kim_model_driver_create_type
354  implicit none
355  interface
356  integer(c_int) recursive function get_parameter_file_name( &
357  model_driver_create, index, parameter_file_name) &
358  bind(c, name="KIM_ModelDriverCreate_GetParameterFileName")
359  use, intrinsic :: iso_c_binding
360  use kim_interoperable_types_module, only: kim_model_driver_create_type
361  implicit none
362  type(kim_model_driver_create_type), intent(in) &
363  :: model_driver_create
364  integer(c_int), intent(in), value :: index
365  type(c_ptr), intent(out) :: parameter_file_name
366  end function get_parameter_file_name
367  end interface
368  type(kim_model_driver_create_handle_type), intent(in) &
369  :: model_driver_create_handle
370  integer(c_int), intent(in) :: index
371  character(len=*, kind=c_char), intent(out) :: parameter_file_name
372  integer(c_int), intent(out) :: ierr
373  type(kim_model_driver_create_type), pointer :: model_driver_create
374 
375  type(c_ptr) :: p
376 
377  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
378  ierr = get_parameter_file_name(model_driver_create, &
379  index - 1, p)
380  call kim_convert_c_char_ptr_to_string(p, parameter_file_name)
382 
390  model_driver_create_handle, index, parameter_file_basename, ierr)
391  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
392  use kim_interoperable_types_module, only: kim_model_driver_create_type
393  implicit none
394  interface
395  integer(c_int) recursive function get_parameter_file_basename( &
396  model_driver_create, index, parameter_file_basename) &
397  bind(c, name="KIM_ModelDriverCreate_GetParameterFileBasename")
398  use, intrinsic :: iso_c_binding
399  use kim_interoperable_types_module, only: kim_model_driver_create_type
400  implicit none
401  type(kim_model_driver_create_type), intent(in) &
402  :: model_driver_create
403  integer(c_int), intent(in), value :: index
404  type(c_ptr), intent(out) :: parameter_file_basename
405  end function get_parameter_file_basename
406  end interface
407  type(kim_model_driver_create_handle_type), intent(in) &
408  :: model_driver_create_handle
409  integer(c_int), intent(in) :: index
410  character(len=*, kind=c_char), intent(out) :: parameter_file_basename
411  integer(c_int), intent(out) :: ierr
412  type(kim_model_driver_create_type), pointer :: model_driver_create
413 
414  type(c_ptr) :: p
415 
416  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
417  ierr = get_parameter_file_basename(model_driver_create, &
418  index - 1, p)
419  call kim_convert_c_char_ptr_to_string(p, parameter_file_basename)
421 
428  recursive subroutine kim_model_driver_create_set_model_numbering( &
429  model_driver_create_handle, numbering, ierr)
430  use kim_numbering_module, only: kim_numbering_type
431  use kim_interoperable_types_module, only: kim_model_driver_create_type
432  implicit none
433  interface
434  integer(c_int) recursive function set_model_numbering( &
435  model_driver_create, numbering) &
436  bind(c, name="KIM_ModelDriverCreate_SetModelNumbering")
437  use, intrinsic :: iso_c_binding
438  use kim_numbering_module, only: kim_numbering_type
439  use kim_interoperable_types_module, only: kim_model_driver_create_type
440  implicit none
441  type(kim_model_driver_create_type), intent(in) &
442  :: model_driver_create
443  type(kim_numbering_type), intent(in), value :: numbering
444  end function set_model_numbering
445  end interface
446  type(kim_model_driver_create_handle_type), intent(in) &
447  :: model_driver_create_handle
448  type(kim_numbering_type), intent(in) :: numbering
449  integer(c_int), intent(out) :: ierr
450  type(kim_model_driver_create_type), pointer :: model_driver_create
451 
452  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
453  ierr = set_model_numbering(model_driver_create, numbering)
455 
463  model_driver_create_handle, influence_distance)
464  use kim_interoperable_types_module, only: kim_model_driver_create_type
465  implicit none
466  interface
467  recursive subroutine set_influence_distance_pointer(model_driver_create, &
468  influence_distance) &
469  bind(c, name="KIM_ModelDriverCreate_SetInfluenceDistancePointer")
470  use, intrinsic :: iso_c_binding
471  use kim_interoperable_types_module, only: kim_model_driver_create_type
472  implicit none
473  type(kim_model_driver_create_type), intent(in) &
474  :: model_driver_create
475  type(c_ptr), intent(in), value :: influence_distance
476  end subroutine set_influence_distance_pointer
477  end interface
478  type(kim_model_driver_create_handle_type), intent(in) &
479  :: model_driver_create_handle
480  real(c_double), intent(in), target :: influence_distance
481  type(kim_model_driver_create_type), pointer :: model_driver_create
482 
483  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
484  call set_influence_distance_pointer(model_driver_create, &
485  c_loc(influence_distance))
487 
495  model_driver_create_handle, number_of_neighbor_lists, cutoffs, &
496  model_will_not_request_neighbors_of_noncontributing_particles)
497  use kim_interoperable_types_module, only: kim_model_driver_create_type
498  implicit none
499  interface
500  recursive subroutine set_neighbor_list_pointers( &
501  model_driver_create, number_of_neighbor_lists, cutoffs_ptr, &
502  model_will_not_request_neighbors_of_noncontributing_particles) &
503  bind(c, name="KIM_ModelDriverCreate_SetNeighborListPointers")
504  use, intrinsic :: iso_c_binding
505  use kim_interoperable_types_module, only: kim_model_driver_create_type
506  implicit none
507  type(kim_model_driver_create_type), intent(in) &
508  :: model_driver_create
509  integer(c_int), intent(in), value :: number_of_neighbor_lists
510  type(c_ptr), intent(in), value :: cutoffs_ptr
511  type(c_ptr), intent(in), value :: &
512  model_will_not_request_neighbors_of_noncontributing_particles
513  end subroutine set_neighbor_list_pointers
514  end interface
515  type(kim_model_driver_create_handle_type), intent(in) &
516  :: model_driver_create_handle
517  integer(c_int), intent(in) :: number_of_neighbor_lists
518  real(c_double), intent(in), target :: cutoffs(number_of_neighbor_lists)
519  integer(c_int), intent(in), target :: &
520  model_will_not_request_neighbors_of_noncontributing_particles( &
521  number_of_neighbor_lists)
522 
523  type(kim_model_driver_create_type), pointer :: model_driver_create
524 
525  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
526  call set_neighbor_list_pointers( &
527  model_driver_create, number_of_neighbor_lists, c_loc(cutoffs), &
528  c_loc(model_will_not_request_neighbors_of_noncontributing_particles))
530 
537  recursive subroutine kim_model_driver_create_set_routine_pointer( &
538  model_driver_create_handle, model_routine_name, language_name, required, &
539  fptr, ierr)
540  use kim_model_routine_name_module, only: kim_model_routine_name_type
541  use kim_language_name_module, only: kim_language_name_type
542  use kim_interoperable_types_module, only: kim_model_driver_create_type
543  implicit none
544  interface
545  integer(c_int) recursive function set_routine_pointer( &
546  model_driver_create, model_routine_name, language_name, required, &
547  fptr) bind(c, name="KIM_ModelDriverCreate_SetRoutinePointer")
548  use, intrinsic :: iso_c_binding
549  use kim_model_routine_name_module, only: kim_model_routine_name_type
550  use kim_language_name_module, only: kim_language_name_type
551  use kim_interoperable_types_module, only: kim_model_driver_create_type
552  implicit none
553  type(kim_model_driver_create_type), intent(in) &
554  :: model_driver_create
555  type(kim_model_routine_name_type), intent(in), value &
556  :: model_routine_name
557  type(kim_language_name_type), intent(in), value :: language_name
558  integer(c_int), intent(in), value :: required
559  type(c_funptr), intent(in), value :: fptr
560  end function set_routine_pointer
561  end interface
562  type(kim_model_driver_create_handle_type), intent(in) &
563  :: model_driver_create_handle
564  type(kim_model_routine_name_type), intent(in) :: model_routine_name
565  type(kim_language_name_type), intent(in) :: language_name
566  integer(c_int), intent(in) :: required
567  type(c_funptr), intent(in), value :: fptr ! must be left as "value"!?!
568  integer(c_int), intent(out) :: ierr
569  type(kim_model_driver_create_type), pointer :: model_driver_create
570 
571  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
572  ierr = set_routine_pointer(model_driver_create, model_routine_name, &
573  language_name, required, fptr)
575 
582  recursive subroutine kim_model_driver_create_set_species_code( &
583  model_driver_create_handle, species_name, code, ierr)
584  use kim_species_name_module, only: kim_species_name_type
585  use kim_interoperable_types_module, only: kim_model_driver_create_type
586  implicit none
587  interface
588  integer(c_int) recursive function set_species_code(model_driver_create, &
589  species_name, code) &
590  bind(c, name="KIM_ModelDriverCreate_SetSpeciesCode")
591  use, intrinsic :: iso_c_binding
592  use kim_species_name_module, only: kim_species_name_type
593  use kim_interoperable_types_module, only: kim_model_driver_create_type
594  implicit none
595  type(kim_model_driver_create_type), intent(in) &
596  :: model_driver_create
597  type(kim_species_name_type), intent(in), value :: species_name
598  integer(c_int), intent(in), value :: code
599  end function set_species_code
600  end interface
601  type(kim_model_driver_create_handle_type), intent(in) &
602  :: model_driver_create_handle
603  type(kim_species_name_type), intent(in) :: species_name
604  integer(c_int), intent(in) :: code
605  integer(c_int), intent(out) :: ierr
606  type(kim_model_driver_create_type), pointer :: model_driver_create
607 
608  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
609  ierr = set_species_code(model_driver_create, species_name, code)
611 
619  model_driver_create_handle, int1, name, description, ierr)
620  use kim_interoperable_types_module, only: kim_model_driver_create_type
621  implicit none
622  type(kim_model_driver_create_handle_type), intent(in) &
623  :: model_driver_create_handle
624  integer(c_int), intent(in), target :: int1(:)
625  character(len=*, kind=c_char), intent(in) :: name
626  character(len=*, kind=c_char), intent(in) :: description
627  integer(c_int), intent(out) :: ierr
628  type(kim_model_driver_create_type), pointer :: model_driver_create
629 
630  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
631  call set_parameter(model_driver_create, size(int1, 1, c_int), int1, &
632  name, description, ierr)
633  return
634 
635  contains
636  recursive subroutine set_parameter(model_driver_create, extent, int1, &
637  name, description, ierr)
638  use kim_interoperable_types_module, only: kim_model_driver_create_type
639  implicit none
640  interface
641  integer(c_int) recursive function set_parameter_pointer_integer( &
642  model_driver_create, extent, ptr, name, description) &
643  bind(c, name="KIM_ModelDriverCreate_SetParameterPointerInteger")
644  use, intrinsic :: iso_c_binding
645  use kim_interoperable_types_module, only: &
646  kim_model_driver_create_type
647  implicit none
648  type(kim_model_driver_create_type), intent(in) &
649  :: model_driver_create
650  integer(c_int), intent(in), value :: extent
651  type(c_ptr), intent(in), value :: ptr
652  character(c_char), intent(in) :: name(*)
653  character(c_char), intent(in) :: description(*)
654  end function set_parameter_pointer_integer
655  end interface
656  type(kim_model_driver_create_type), intent(in) &
657  :: model_driver_create
658  integer(c_int), intent(in) :: extent
659  integer(c_int), intent(in), target :: int1(extent)
660  character(len=*, kind=c_char), intent(in) :: name
661  character(len=*, kind=c_char), intent(in) :: description
662  integer(c_int), intent(out) :: ierr
663 
664  ierr = set_parameter_pointer_integer(model_driver_create, &
665  extent, &
666  c_loc(int1), &
667  trim(name)//c_null_char, &
668  trim(description)//c_null_char)
669  end subroutine set_parameter
671 
679  model_driver_create_handle, double1, name, description, ierr)
680  use kim_interoperable_types_module, only: kim_model_driver_create_type
681  implicit none
682  type(kim_model_driver_create_handle_type), intent(in) &
683  :: model_driver_create_handle
684  real(c_double), intent(in), target :: double1(:)
685  character(len=*, kind=c_char), intent(in) :: name
686  character(len=*, kind=c_char), intent(in) :: description
687  integer(c_int), intent(out) :: ierr
688  type(kim_model_driver_create_type), pointer :: model_driver_create
689 
690  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
691  call set_parameter(model_driver_create, size(double1, 1, c_int), &
692  double1, name, description, ierr)
693  return
694 
695  contains
696  recursive subroutine set_parameter(model_driver_create, extent, double1, &
697  name, description, ierr)
698  use kim_interoperable_types_module, only: kim_model_driver_create_type
699  implicit none
700  interface
701  integer(c_int) recursive function set_parameter_pointer_double( &
702  model_driver_create, extent, ptr, name, description) &
703  bind(c, name="KIM_ModelDriverCreate_SetParameterPointerDouble")
704  use, intrinsic :: iso_c_binding
705  use kim_interoperable_types_module, only: &
706  kim_model_driver_create_type
707  implicit none
708  type(kim_model_driver_create_type), intent(in) &
709  :: model_driver_create
710  integer(c_int), intent(in), value :: extent
711  type(c_ptr), intent(in), value :: ptr
712  character(c_char), intent(in) :: name(*)
713  character(c_char), intent(in) :: description(*)
714  end function set_parameter_pointer_double
715  end interface
716  type(kim_model_driver_create_type), intent(in) &
717  :: model_driver_create
718  integer(c_int), intent(in) :: extent
719  real(c_double), intent(in), target :: double1(extent)
720  character(len=*, kind=c_char), intent(in) :: name
721  character(len=*, kind=c_char), intent(in) :: description
722  integer(c_int), intent(out) :: ierr
723 
724  ierr = set_parameter_pointer_double(model_driver_create, &
725  extent, &
726  c_loc(double1), &
727  trim(name)//c_null_char, &
728  trim(description)//c_null_char)
729  end subroutine set_parameter
731 
739  model_driver_create_handle, ptr)
740  use kim_interoperable_types_module, only: kim_model_driver_create_type
741  implicit none
742  interface
743  recursive subroutine set_model_buffer_pointer(model_driver_create, ptr) &
744  bind(c, name="KIM_ModelDriverCreate_SetModelBufferPointer")
745  use, intrinsic :: iso_c_binding
746  use kim_interoperable_types_module, only: kim_model_driver_create_type
747  implicit none
748  type(kim_model_driver_create_type), intent(in) &
749  :: model_driver_create
750  type(c_ptr), intent(in), value :: ptr
751  end subroutine set_model_buffer_pointer
752  end interface
753  type(kim_model_driver_create_handle_type), intent(in) &
754  :: model_driver_create_handle
755  type(c_ptr), intent(in) :: ptr
756  type(kim_model_driver_create_type), pointer :: model_driver_create
757 
758  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
759  call set_model_buffer_pointer(model_driver_create, ptr)
761 
767  recursive subroutine kim_model_driver_create_set_units( &
768  model_driver_create_handle, length_unit, energy_unit, charge_unit, &
769  temperature_unit, time_unit, ierr)
770  use kim_unit_system_module, only: kim_length_unit_type, &
771  kim_energy_unit_type, &
772  kim_charge_unit_type, &
773  kim_temperature_unit_type, &
774  kim_time_unit_type
775  use kim_interoperable_types_module, only: kim_model_driver_create_type
776  implicit none
777  interface
778  integer(c_int) recursive function set_units( &
779  model_driver_create, length_unit, energy_unit, charge_unit, &
780  temperature_unit, time_unit) &
781  bind(c, name="KIM_ModelDriverCreate_SetUnits")
782  use, intrinsic :: iso_c_binding
783  use kim_unit_system_module, only: kim_length_unit_type, &
784  kim_energy_unit_type, &
785  kim_charge_unit_type, &
786  kim_temperature_unit_type, &
787  kim_time_unit_type
788  use kim_interoperable_types_module, only: kim_model_driver_create_type
789  implicit none
790  type(kim_model_driver_create_type), intent(in) &
791  :: model_driver_create
792  type(kim_length_unit_type), intent(in), value :: length_unit
793  type(kim_energy_unit_type), intent(in), value :: energy_unit
794  type(kim_charge_unit_type), intent(in), value :: charge_unit
795  type(kim_temperature_unit_type), intent(in), value :: temperature_unit
796  type(kim_time_unit_type), intent(in), value :: time_unit
797  end function set_units
798  end interface
799  type(kim_model_driver_create_handle_type), intent(in) &
800  :: model_driver_create_handle
801  type(kim_length_unit_type), intent(in) :: length_unit
802  type(kim_energy_unit_type), intent(in) :: energy_unit
803  type(kim_charge_unit_type), intent(in) :: charge_unit
804  type(kim_temperature_unit_type), intent(in) :: temperature_unit
805  type(kim_time_unit_type), intent(in) :: time_unit
806  integer(c_int), intent(out) :: ierr
807  type(kim_model_driver_create_type), pointer :: model_driver_create
808 
809  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
810  ierr = set_units(model_driver_create, length_unit, energy_unit, &
811  charge_unit, temperature_unit, time_unit)
812  end subroutine kim_model_driver_create_set_units
813 
819  recursive subroutine kim_model_driver_create_convert_unit( &
820  from_length_unit, from_energy_unit, &
821  from_charge_unit, from_temperature_unit, from_time_unit, &
822  to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
823  to_time_unit, length_exponent, energy_exponent, charge_exponent, &
824  temperature_exponent, time_exponent, conversion_factor, ierr)
825  use kim_unit_system_module, only: kim_length_unit_type
826  use kim_unit_system_module, only: kim_energy_unit_type
827  use kim_unit_system_module, only: kim_charge_unit_type
828  use kim_unit_system_module, only: kim_temperature_unit_type
829  use kim_unit_system_module, only: kim_time_unit_type
830  implicit none
831  interface
832  integer(c_int) recursive function convert_unit( &
833  from_length_unit, from_energy_unit, &
834  from_charge_unit, from_temperature_unit, from_time_unit, &
835  to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
836  to_time_unit, length_exponent, energy_exponent, charge_exponent, &
837  temperature_exponent, time_exponent, conversion_factor) &
838  bind(c, name="KIM_ModelDriverCreate_ConvertUnit")
839  use, intrinsic :: iso_c_binding
840  use kim_unit_system_module, only: kim_length_unit_type
841  use kim_unit_system_module, only: kim_energy_unit_type
842  use kim_unit_system_module, only: kim_charge_unit_type
843  use kim_unit_system_module, only: kim_temperature_unit_type
844  use kim_unit_system_module, only: kim_time_unit_type
845  implicit none
846  type(kim_length_unit_type), intent(in), value :: from_length_unit
847  type(kim_energy_unit_type), intent(in), value :: from_energy_unit
848  type(kim_charge_unit_type), intent(in), value :: from_charge_unit
849  type(kim_temperature_unit_type), intent(in), value :: &
850  from_temperature_unit
851  type(kim_time_unit_type), intent(in), value :: from_time_unit
852  type(kim_length_unit_type), intent(in), value :: to_length_unit
853  type(kim_energy_unit_type), intent(in), value :: to_energy_unit
854  type(kim_charge_unit_type), intent(in), value :: to_charge_unit
855  type(kim_temperature_unit_type), intent(in), value :: &
856  to_temperature_unit
857  type(kim_time_unit_type), intent(in), value :: to_time_unit
858  real(c_double), intent(in), value :: length_exponent
859  real(c_double), intent(in), value :: energy_exponent
860  real(c_double), intent(in), value :: charge_exponent
861  real(c_double), intent(in), value :: temperature_exponent
862  real(c_double), intent(in), value :: time_exponent
863  real(c_double), intent(out) :: conversion_factor
864  end function convert_unit
865  end interface
866  type(kim_length_unit_type), intent(in) :: from_length_unit
867  type(kim_energy_unit_type), intent(in) :: from_energy_unit
868  type(kim_charge_unit_type), intent(in) :: from_charge_unit
869  type(kim_temperature_unit_type), intent(in) :: from_temperature_unit
870  type(kim_time_unit_type), intent(in) :: from_time_unit
871  type(kim_length_unit_type), intent(in) :: to_length_unit
872  type(kim_energy_unit_type), intent(in) :: to_energy_unit
873  type(kim_charge_unit_type), intent(in) :: to_charge_unit
874  type(kim_temperature_unit_type), intent(in) :: to_temperature_unit
875  type(kim_time_unit_type), intent(in) :: to_time_unit
876  real(c_double), intent(in) :: length_exponent
877  real(c_double), intent(in) :: energy_exponent
878  real(c_double), intent(in) :: charge_exponent
879  real(c_double), intent(in) :: temperature_exponent
880  real(c_double), intent(in) :: time_exponent
881  real(c_double), intent(out) :: conversion_factor
882  integer(c_int), intent(out) :: ierr
883 
884  ierr = convert_unit(from_length_unit, from_energy_unit, from_charge_unit, &
885  from_temperature_unit, from_time_unit, to_length_unit, &
886  to_energy_unit, to_charge_unit, to_temperature_unit, &
887  to_time_unit, length_exponent, energy_exponent, &
888  charge_exponent, temperature_exponent, time_exponent, &
889  conversion_factor)
891 
897  recursive subroutine kim_model_driver_create_log_entry( &
898  model_driver_create_handle, log_verbosity, message)
899  use kim_log_verbosity_module, only: kim_log_verbosity_type
900  use kim_interoperable_types_module, only: kim_model_driver_create_type
901  implicit none
902  interface
903  recursive subroutine log_entry(model_driver_create, log_verbosity, &
904  message, line_number, file_name) &
905  bind(c, name="KIM_ModelDriverCreate_LogEntry")
906  use, intrinsic :: iso_c_binding
907  use kim_log_verbosity_module, only: kim_log_verbosity_type
908  use kim_interoperable_types_module, only: kim_model_driver_create_type
909  implicit none
910  type(kim_model_driver_create_type), intent(in) &
911  :: model_driver_create
912  type(kim_log_verbosity_type), intent(in), value :: log_verbosity
913  character(c_char), intent(in) :: message(*)
914  integer(c_int), intent(in), value :: line_number
915  character(c_char), intent(in) :: file_name(*)
916  end subroutine log_entry
917  end interface
918  type(kim_model_driver_create_handle_type), intent(in) &
919  :: model_driver_create_handle
920  type(kim_log_verbosity_type), intent(in) :: log_verbosity
921  character(len=*, kind=c_char), intent(in) :: message
922  type(kim_model_driver_create_type), pointer :: model_driver_create
923 
924  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
925  call log_entry(model_driver_create, log_verbosity, &
926  trim(message)//c_null_char, 0, ""//c_null_char)
927  end subroutine kim_model_driver_create_log_entry
928 
934  recursive subroutine kim_model_driver_create_to_string( &
935  model_driver_create_handle, string)
936  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
937  use kim_interoperable_types_module, only: kim_model_driver_create_type
938  implicit none
939  interface
940  type(c_ptr) recursive function model_driver_create_string( &
941  model_driver_create) &
942  bind(c, name="KIM_ModelDriverCreate_ToString")
943  use, intrinsic :: iso_c_binding
944  use kim_interoperable_types_module, only: kim_model_driver_create_type
945  implicit none
946  type(kim_model_driver_create_type), intent(in) &
947  :: model_driver_create
948  end function model_driver_create_string
949  end interface
950  type(kim_model_driver_create_handle_type), intent(in) &
951  :: model_driver_create_handle
952  character(len=*, kind=c_char), intent(out) :: string
953  type(kim_model_driver_create_type), pointer :: model_driver_create
954 
955  type(c_ptr) :: p
956 
957  call c_f_pointer(model_driver_create_handle%p, model_driver_create)
958  p = model_driver_create_string(model_driver_create)
959  call kim_convert_c_char_ptr_to_string(p, string)
960  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.