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
33!> \brief \copybrief KIM::ModelDriverCreate
34!!
35!! \sa KIM::ModelDriverCreate, KIM_ModelDriverCreate
36!!
37!! \since 2.0
38module kim_model_driver_create_module
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
47    KIM_MODEL_DRIVER_CREATE_NULL_HANDLE, &
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
67  !> \brief \copybrief KIM::ModelDriverCreate
68  !!
69  !! \sa KIM::ModelDriverCreate, KIM_ModelDriverCreate
70  !!
71  !! \since 2.0
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
76  !> \brief NULL handle for use in comparisons.
77  !!
78  !! \since 2.0
79  type(kim_model_driver_create_handle_type), protected, save &
80    :: KIM_MODEL_DRIVER_CREATE_NULL_HANDLE
81
82  !> \brief Compares kim_model_driver_create_handle_type's for equality.
83  !!
84  !! \since 2.0
85  interface operator(.eq.)
86    module procedure kim_model_driver_create_handle_equal
87  end interface operator(.eq.)
88
89  !> \brief Compares kim_model_driver_create_handle_type's for inequality.
90  !!
91  !! \since 2.0
92  interface operator(.ne.)
93    module procedure kim_model_driver_create_handle_not_equal
94  end interface operator(.ne.)
95
96  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileDirectoryName
97  !!
98  !! \sa KIM::ModelDriverCreate::GetParameterFileDirectoryName,
99  !! KIM_ModelDriverCreate_GetParameterFileDirectoryName
100  !!
101  !! \since 2.2
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
106  !> \brief \copybrief KIM::ModelDriverCreate::GetNumberOfParameterFiles
107  !!
108  !! \sa KIM::ModelDriverCreate::GetNumberOfParameterFiles,
109  !! KIM_ModelDriverCreate_GetNumberOfParameterFiles
110  !!
111  !! \since 2.0
112  interface kim_get_number_of_parameter_files
113    module procedure kim_model_driver_create_get_number_of_parameter_files
114  end interface kim_get_number_of_parameter_files
115
116  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileName
117  !!
118  !! \sa KIM::ModelDriverCreate::GetParameterFileName,
119  !! KIM_ModelDriverCreate_GetParameterFileName
120  !!
121  !! \since 2.0
122  !!
123  !! \deprecated As of 2.2.  Please use
124  !! kim_model_driver_create_module::kim_get_parameter_file_basename() instead.
125  interface kim_get_parameter_file_name
126    module procedure kim_model_driver_create_get_parameter_file_name
127  end interface kim_get_parameter_file_name
128
129  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileBasename
130  !!
131  !! \sa KIM::ModelDriverCreate::GetParameterFileBasename,
132  !! KIM_ModelDriverCreate_GetParameterFileBasename
133  !!
134  !! \since 2.2
135  interface kim_get_parameter_file_basename
136    module procedure kim_model_driver_create_get_parameter_file_basename
137  end interface kim_get_parameter_file_basename
138
139  !> \brief \copybrief KIM::ModelDriverCreate::SetModelNumbering
140  !!
141  !! \sa KIM::ModelDriverCreate::SetModelNumbering,
142  !! KIM_ModelDriverCreate_SetModelNumbering
143  !!
144  !! \since 2.0
145  interface kim_set_model_numbering
146    module procedure kim_model_driver_create_set_model_numbering
147  end interface kim_set_model_numbering
148
149  !> \brief \copybrief KIM::ModelDriverCreate::SetInfluenceDistancePointer
150  !!
151  !! \sa KIM::ModelDriverCreate::SetInfluenceDistancePointer,
152  !! KIM_ModelDriverCreate_SetInfluenceDistancePointer
153  !!
154  !! \since 2.0
155  interface kim_set_influence_distance_pointer
156    module procedure kim_model_driver_create_set_influence_distance_pointer
157  end interface kim_set_influence_distance_pointer
158
159  !> \brief \copybrief KIM::ModelDriverCreate::SetNeighborListPointers
160  !!
161  !! \sa KIM::ModelDriverCreate::SetNeighborListPointers,
162  !! KIM_ModelDriverCreate_SetNeighborListPointers
163  !!
164  !! \since 2.0
165  interface kim_set_neighbor_list_pointers
166    module procedure kim_model_driver_create_set_neighbor_list_pointers
167  end interface kim_set_neighbor_list_pointers
168
169  !> \brief \copybrief KIM::ModelDriverCreate::SetRoutinePointer
170  !!
171  !! \sa KIM::ModelDriverCreate::SetRoutinePointer,
172  !! KIM_ModelDriverCreate_SetRoutinePointer
173  !!
174  !! \since 2.0
175  interface kim_set_routine_pointer
176    module procedure kim_model_driver_create_set_routine_pointer
177  end interface kim_set_routine_pointer
178
179  !> \brief \copybrief KIM::ModelDriverCreate::SetSpeciesCode
180  !!
181  !! \sa KIM::ModelDriverCreate::SetSpeciesCode,
182  !! KIM_ModelDriverCreate_SetSpeciesCode
183  !!
184  !! \since 2.0
185  interface kim_set_species_code
186    module procedure kim_model_driver_create_set_species_code
187  end interface kim_set_species_code
188
189  !> \brief \copybrief KIM::ModelDriverCreate::SetParameterPointer
190  !!
191  !! \sa KIM::ModelDriverCreate::SetParameterPointer,
192  !! KIM_ModelDriverCreate_SetParameterPointerInteger,
193  !! KIM_ModelDriverCreate_SetParameterPointerDouble
194  !!
195  !! \since 2.0
196  interface kim_set_parameter_pointer
197    module procedure kim_model_driver_create_set_parameter_pointer_integer
198    module procedure kim_model_driver_create_set_parameter_pointer_double
199  end interface kim_set_parameter_pointer
200
201  !> \brief \copybrief KIM::ModelDriverCreate::SetModelBufferPointer
202  !!
203  !! \sa KIM::ModelDriverCreate::SetModelBufferPointer,
204  !! KIM_ModelDriverCreate_SetModelBufferPointer
205  !!
206  !! \since 2.0
207  interface kim_set_model_buffer_pointer
208    module procedure kim_model_driver_create_set_model_buffer_pointer
209  end interface kim_set_model_buffer_pointer
210
211  !> \brief \copybrief KIM::ModelDriverCreate::SetUnits
212  !!
213  !! \sa KIM::ModelDriverCreate::SetUnits, KIM_ModelDriverCreate_SetUnits
214  !!
215  !! \since 2.0
216  interface kim_set_units
217    module procedure kim_model_driver_create_set_units
218  end interface kim_set_units
219
220  !> \brief \copybrief KIM::ModelDriverCreate::ConvertUnit
221  !!
222  !! \sa KIM::ModelDriverCreate::ConvertUnit, KIM_ModelDriverCreate_ConvertUnit
223  !!
224  !! \since 2.0
225  interface kim_convert_unit
226    module procedure kim_model_driver_create_convert_unit
227  end interface kim_convert_unit
228
229  !> \brief \copybrief KIM::ModelDriverCreate::LogEntry
230  !!
231  !! \sa KIM::ModelDriverCreate::LogEntry, KIM_ModelDriverCreate_LogEntry
232  !!
233  !! \since 2.0
234  interface kim_log_entry
235    module procedure kim_model_driver_create_log_entry
236  end interface kim_log_entry
237
238  !> \brief \copybrief KIM::ModelDriverCreate::ToString
239  !!
240  !! \sa KIM::ModelDriverCreate::ToString, KIM_ModelDriverCreate_ToString
241  !!
242  !! \since 2.0
243  interface kim_to_string
244    module procedure kim_model_driver_create_to_string
245  end interface kim_to_string
246
247contains
248  !> \brief Compares kim_model_driver_create_handle_type's for equality.
249  !!
250  !! \since 2.0
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
263  !> \brief Compares kim_model_driver_create_handle_type's for inequality.
264  !!
265  !! \since 2.0
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
274  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileDirectoryName
275  !!
276  !! \sa KIM::ModelDriverCreate::GetParameterFileDirectoryName,
277  !! KIM_ModelDriverCreate_GetParameterFileDirectoryName
278  !!
279  !! \since 2.2
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
309  !> \brief \copybrief KIM::ModelDriverCreate::GetNumberOfParameterFiles
310  !!
311  !! \sa KIM::ModelDriverCreate::GetNumberOfParameterFiles,
312  !! KIM_ModelDriverCreate_GetNumberOfParameterFiles
313  !!
314  !! \since 2.0
315  recursive subroutine kim_model_driver_create_get_number_of_parameter_files( &
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)
339  end subroutine kim_model_driver_create_get_number_of_parameter_files
340
341  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileName
342  !!
343  !! \sa KIM::ModelDriverCreate::GetParameterFileName,
344  !! KIM_ModelDriverCreate_GetParameterFileName
345  !!
346  !! \since 2.0
347  !!
348  !! \deprecated As of 2.2.  Please use
349  !! kim_model_driver_create_module::kim_get_parameter_file_basename() instead.
350  recursive subroutine kim_model_driver_create_get_parameter_file_name( &
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)
381  end subroutine kim_model_driver_create_get_parameter_file_name
382
383  !> \brief \copybrief KIM::ModelDriverCreate::GetParameterFileBasename
384  !!
385  !! \sa KIM::ModelDriverCreate::GetParameterFileBasename,
386  !! KIM_ModelDriverCreate_GetParameterFileBasename
387  !!
388  !! \since 2.2
389  recursive subroutine kim_model_driver_create_get_parameter_file_basename( &
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)
420  end subroutine kim_model_driver_create_get_parameter_file_basename
421
422  !> \brief \copybrief KIM::ModelDriverCreate::SetModelNumbering
423  !!
424  !! \sa KIM::ModelDriverCreate::SetModelNumbering,
425  !! KIM_ModelDriverCreate_SetModelNumbering
426  !!
427  !! \since 2.0
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)
454  end subroutine kim_model_driver_create_set_model_numbering
455
456  !> \brief \copybrief KIM::ModelDriverCreate::SetInfluenceDistancePointer
457  !!
458  !! \sa KIM::ModelDriverCreate::SetInfluenceDistancePointer,
459  !! KIM_ModelDriverCreate_SetInfluenceDistancePointer
460  !!
461  !! \since 2.0
462  recursive subroutine kim_model_driver_create_set_influence_distance_pointer( &
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))
486  end subroutine kim_model_driver_create_set_influence_distance_pointer
487
488  !> \brief \copybrief KIM::ModelDriverCreate::SetNeighborListPointers
489  !!
490  !! \sa KIM::ModelDriverCreate::SetNeighborListPointers,
491  !! KIM_ModelDriverCreate_SetNeighborListPointers
492  !!
493  !! \since 2.0
494  recursive subroutine kim_model_driver_create_set_neighbor_list_pointers( &
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))
529  end subroutine kim_model_driver_create_set_neighbor_list_pointers
530
531  !> \brief \copybrief KIM::ModelDriverCreate::SetRoutinePointer
532  !!
533  !! \sa KIM::ModelDriverCreate::SetRoutinePointer,
534  !! KIM_ModelDriverCreate_SetRoutinePointer
535  !!
536  !! \since 2.0
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)
574  end subroutine kim_model_driver_create_set_routine_pointer
575
576  !> \brief \copybrief KIM::ModelDriverCreate::SetSpeciesCode
577  !!
578  !! \sa KIM::ModelDriverCreate::SetSpeciesCode,
579  !! KIM_ModelDriverCreate_SetSpeciesCode
580  !!
581  !! \since 2.0
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)
610  end subroutine kim_model_driver_create_set_species_code
611
612  !> \brief \copybrief KIM::ModelDriverCreate::SetParameterPointer
613  !!
614  !! \sa KIM::ModelDriverCreate::SetParameterPointer,
615  !! KIM_ModelDriverCreate_SetParameterPointerInteger
616  !!
617  !! \since 2.0
618  recursive subroutine kim_model_driver_create_set_parameter_pointer_integer( &
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
670  end subroutine kim_model_driver_create_set_parameter_pointer_integer
671
672  !> \brief \copybrief KIM::ModelDriverCreate::SetParameterPointer
673  !!
674  !! \sa KIM::ModelDriverCreate::SetParameterPointer,
675  !! KIM_ModelDriverCreate_SetParameterPointerDouble
676  !!
677  !! \since 2.0
678  recursive subroutine kim_model_driver_create_set_parameter_pointer_double( &
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
730  end subroutine kim_model_driver_create_set_parameter_pointer_double
731
732  !> \brief \copybrief KIM::ModelDriverCreate::SetModelBufferPointer
733  !!
734  !! \sa KIM::ModelDriverCreate::SetModelBufferPointer,
735  !! KIM_ModelDriverCreate_SetModelBufferPointer
736  !!
737  !! \since 2.0
738  recursive subroutine kim_model_driver_create_set_model_buffer_pointer( &
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)
760  end subroutine kim_model_driver_create_set_model_buffer_pointer
761
762  !> \brief \copybrief KIM::ModelDriverCreate::SetUnits
763  !!
764  !! \sa KIM::ModelDriverCreate::SetUnits, KIM_ModelDriverCreate_SetUnits
765  !!
766  !! \since 2.0
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
814  !> \brief \copybrief KIM::ModelDriverCreate::ConvertUnit
815  !!
816  !! \sa KIM::ModelDriverCreate::ConvertUnit, KIM_ModelDriverCreate_ConvertUnit
817  !!
818  !! \since 2.0
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)
890  end subroutine kim_model_driver_create_convert_unit
891
892  !> \brief \copybrief KIM::ModelDriverCreate::LogEntry
893  !!
894  !! \sa KIM::ModelDriverCreate::LogEntry, KIM_ModelDriverCreate_LogEntry
895  !!
896  !! \since 2.0
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
929  !> \brief \copybrief KIM::ModelDriverCreate::ToString
930  !!
931  !! \sa KIM::ModelDriverCreate::ToString, KIM_ModelDriverCreate_ToString
932  !!
933  !! \since 2.0
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
961end module kim_model_driver_create_module
962