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::ModelCreate
34!!
35!! \sa KIM::ModelCreate, KIM_ModelCreate
36!!
37!! \since 2.0
38module kim_model_create_module
39  use, intrinsic :: iso_c_binding
40  implicit none
41  private
42
43  public &
44    ! Derived types
45    kim_model_create_handle_type, &
46    ! Constants
47    KIM_MODEL_CREATE_NULL_HANDLE, &
48    ! Routines
49    operator(.eq.), &
50    operator(.ne.), &
51    kim_set_model_numbering, &
52    kim_set_influence_distance_pointer, &
53    kim_set_neighbor_list_pointers, &
54    kim_set_routine_pointer, &
55    kim_set_species_code, &
56    kim_set_parameter_pointer, &
57    kim_set_model_buffer_pointer, &
58    kim_set_units, &
59    kim_convert_unit, &
60    kim_log_entry, &
61    kim_to_string
62
63  !> \brief \copybrief KIM::ModelCreate
64  !!
65  !! \sa KIM::ModelCreate, KIM_ModelCreate
66  !!
67  !! \since 2.0
68  type, bind(c) :: kim_model_create_handle_type
69    type(c_ptr) :: p = c_null_ptr
70  end type kim_model_create_handle_type
71
72  !> \brief NULL handle for use in comparisons.
73  !!
74  !! \since 2.0
75  type(kim_model_create_handle_type), protected, save &
76    :: KIM_MODEL_CREATE_NULL_HANDLE
77
78  !> \brief Compares kim_model_create_handle_type's for equality.
79  !!
80  !! \since 2.0
81  interface operator(.eq.)
82    module procedure kim_model_create_handle_equal
83  end interface operator(.eq.)
84
85  !> \brief Compares kim_model_create_handle_type's for inequality.
86  !!
87  !! \since 2.0
88  interface operator(.ne.)
89    module procedure kim_model_create_handle_not_equal
90  end interface operator(.ne.)
91
92  !> \brief \copybrief KIM::ModelCreate::SetModelNumbering
93  !!
94  !! \sa KIM::ModelCreate::SetModelNumbering, KIM_ModelCreate_SetModelNumbering
95  !!
96  !! \since 2.0
97  interface kim_set_model_numbering
98    module procedure kim_model_create_set_model_numbering
99  end interface kim_set_model_numbering
100
101  !> \brief \copybrief KIM::ModelCreate::SetInfluenceDistancePointer
102  !!
103  !! \sa KIM::ModelCreate::SetInfluenceDistancePointer,
104  !! KIM_ModelCreate_SetInfluenceDistancePointer
105  !!
106  !! \since 2.0
107  interface kim_set_influence_distance_pointer
108    module procedure kim_model_create_set_influence_distance_pointer
109  end interface kim_set_influence_distance_pointer
110
111  !> \brief \copybrief KIM::ModelCreate::SetNeighborListPointers
112  !!
113  !! \sa KIM::ModelCreate::SetNeighborListPointers,
114  !! KIM_ModelCreate_SetNeighborListPointers
115  !!
116  !! \since 2.0
117  interface kim_set_neighbor_list_pointers
118    module procedure kim_model_create_set_neighbor_list_pointers
119  end interface kim_set_neighbor_list_pointers
120
121  !> \brief \copybrief KIM::ModelCreate::SetRoutinePointer
122  !!
123  !! \sa KIM::ModelCreate::SetRoutinePointer, KIM_ModelCreate_SetRoutinePointer
124  !!
125  !! \since 2.0
126  interface kim_set_routine_pointer
127    module procedure kim_model_create_set_routine_pointer
128  end interface kim_set_routine_pointer
129
130  !> \brief \copybrief KIM::ModelCreate::SetSpeciesCode
131  !!
132  !! \sa KIM::ModelCreate::SetSpeciesCode, KIM_ModelCreate_SetSpeciesCode
133  !!
134  !! \since 2.0
135  interface kim_set_species_code
136    module procedure kim_model_create_set_species_code
137  end interface kim_set_species_code
138
139  !> \brief \copybrief KIM::ModelCreate::SetParameterPointer
140  !!
141  !! \sa KIM::ModelCreate::SetParameterPointer,
142  !! KIM_ModelCreate_SetParameterPointerInteger,
143  !! KIM_ModelCreate_SetParameterPointerDouble
144  !!
145  !! \since 2.0
146  interface kim_set_parameter_pointer
147    module procedure kim_model_create_set_parameter_pointer_integer
148    module procedure kim_model_create_set_parameter_pointer_double
149  end interface kim_set_parameter_pointer
150
151  !> \brief \copybrief KIM::ModelCreate::SetModelBufferPointer
152  !!
153  !! \sa KIM::ModelCreate::SetModelBufferPointer,
154  !! KIM_ModelCreate_SetModelBufferPointer
155  !!
156  !! \since 2.0
157  interface kim_set_model_buffer_pointer
158    module procedure kim_model_create_set_model_buffer_pointer
159  end interface kim_set_model_buffer_pointer
160
161  !> \brief \copybrief KIM::ModelCreate::SetUnits
162  !!
163  !! \sa KIM::ModelCreate::SetUnits, KIM_ModelCreate_SetUnits
164  !!
165  !! \since 2.0
166  interface kim_set_units
167    module procedure kim_model_create_set_units
168  end interface kim_set_units
169
170  !> \brief \copybrief KIM::ModelCreate::ConvertUnit
171  !!
172  !! \sa KIM::ModelCreate::ConvertUnit, KIM_ModelCreate_ConvertUnit
173  !!
174  !! \since 2.0
175  interface kim_convert_unit
176    module procedure kim_model_create_convert_unit
177  end interface kim_convert_unit
178
179  !> \brief \copybrief KIM::ModelCreate::LogEntry
180  !!
181  !! \sa KIM::ModelCreate::LogEntry, KIM_ModelCreate_LogEntry
182  !!
183  !! \since 2.0
184  interface kim_log_entry
185    module procedure kim_model_create_log_entry
186  end interface kim_log_entry
187
188  !> \brief \copybrief KIM::ModelCreate::ToString
189  !!
190  !! \sa KIM::ModelCreate::ToString, KIM_ModelCreate_ToString
191  !!
192  !! \since 2.0
193  interface kim_to_string
194    module procedure kim_model_create_to_string
195  end interface kim_to_string
196
197contains
198  !> \brief Compares kim_model_create_handle_type's for equality.
199  !!
200  !! \since 2.0
201  logical recursive function kim_model_create_handle_equal(lhs, rhs)
202    implicit none
203    type(kim_model_create_handle_type), intent(in) :: lhs
204    type(kim_model_create_handle_type), intent(in) :: rhs
205
206    if ((.not. c_associated(lhs%p)) .and. (.not. c_associated(rhs%p))) then
207      kim_model_create_handle_equal = .true.
208    else
209      kim_model_create_handle_equal = c_associated(lhs%p, rhs%p)
210    end if
211  end function kim_model_create_handle_equal
212
213  !> \brief Compares kim_model_create_handle_type's for inequality.
214  !!
215  !! \since 2.0
216  logical recursive function kim_model_create_handle_not_equal(lhs, rhs)
217    implicit none
218    type(kim_model_create_handle_type), intent(in) :: lhs
219    type(kim_model_create_handle_type), intent(in) :: rhs
220
221    kim_model_create_handle_not_equal = .not. (lhs == rhs)
222  end function kim_model_create_handle_not_equal
223
224  !> \brief \copybrief KIM::ModelCreate::SetModelNumbering
225  !!
226  !! \sa KIM::ModelCreate::SetModelNumbering, KIM_ModelCreate_SetModelNumbering
227  !!
228  !! \since 2.0
229  recursive subroutine kim_model_create_set_model_numbering( &
230    model_create_handle, numbering, ierr)
231    use kim_numbering_module, only: kim_numbering_type
232    use kim_interoperable_types_module, only: kim_model_create_type
233    implicit none
234    interface
235      integer(c_int) recursive function set_model_numbering( &
236        model_create, numbering) &
237        bind(c, name="KIM_ModelCreate_SetModelNumbering")
238        use, intrinsic :: iso_c_binding
239        use kim_numbering_module, only: kim_numbering_type
240        use kim_interoperable_types_module, only: kim_model_create_type
241        implicit none
242        type(kim_model_create_type), intent(in) :: model_create
243        type(kim_numbering_type), intent(in), value :: numbering
244      end function set_model_numbering
245    end interface
246    type(kim_model_create_handle_type), intent(in) :: model_create_handle
247    type(kim_numbering_type), intent(in) :: numbering
248    integer(c_int), intent(out) :: ierr
249    type(kim_model_create_type), pointer :: model_create
250
251    call c_f_pointer(model_create_handle%p, model_create)
252    ierr = set_model_numbering(model_create, numbering)
253  end subroutine kim_model_create_set_model_numbering
254
255  !> \brief \copybrief KIM::ModelCreate::SetInfluenceDistancePointer
256  !!
257  !! \sa KIM::ModelCreate::SetInfluenceDistancePointer,
258  !! KIM_ModelCreate_SetInfluenceDistancePointer
259  !!
260  !! \since 2.0
261  recursive subroutine kim_model_create_set_influence_distance_pointer( &
262    model_create_handle, influence_distance)
263    use kim_interoperable_types_module, only: kim_model_create_type
264    implicit none
265    interface
266      recursive subroutine set_influence_distance_pointer(model_create, &
267                                                          influence_distance) &
268        bind(c, name="KIM_ModelCreate_SetInfluenceDistancePointer")
269        use, intrinsic :: iso_c_binding
270        use kim_interoperable_types_module, only: kim_model_create_type
271        implicit none
272        type(kim_model_create_type), intent(in) :: model_create
273        type(c_ptr), intent(in), value :: influence_distance
274      end subroutine set_influence_distance_pointer
275    end interface
276    type(kim_model_create_handle_type), intent(in) :: model_create_handle
277    real(c_double), intent(in), target :: influence_distance
278    type(kim_model_create_type), pointer :: model_create
279
280    call c_f_pointer(model_create_handle%p, model_create)
281    call set_influence_distance_pointer(model_create, &
282                                        c_loc(influence_distance))
283  end subroutine kim_model_create_set_influence_distance_pointer
284
285  !> \brief \copybrief KIM::ModelCreate::SetNeighborListPointers
286  !!
287  !! \sa KIM::ModelCreate::SetNeighborListPointers,
288  !! KIM_ModelCreate_SetNeighborListPointers
289  !!
290  !! \since 2.0
291  recursive subroutine kim_model_create_set_neighbor_list_pointers( &
292    model_create_handle, number_of_neighbor_lists, cutoffs, &
293    model_will_not_request_neighbors_of_noncontributing_particles)
294    use kim_interoperable_types_module, only: kim_model_create_type
295    implicit none
296    interface
297      recursive subroutine set_neighbor_list_pointers( &
298        model_create, number_of_neighbor_lists, cutoffs_ptr, &
299        model_will_not_request_neighbors_of_noncontributing_particles) &
300        bind(c, name="KIM_ModelCreate_SetNeighborListPointers")
301        use, intrinsic :: iso_c_binding
302        use kim_interoperable_types_module, only: kim_model_create_type
303        implicit none
304        type(kim_model_create_type), intent(in) :: model_create
305        integer(c_int), intent(in), value :: number_of_neighbor_lists
306        type(c_ptr), intent(in), value :: cutoffs_ptr
307        type(c_ptr), intent(in), value :: &
308          model_will_not_request_neighbors_of_noncontributing_particles
309      end subroutine set_neighbor_list_pointers
310    end interface
311    type(kim_model_create_handle_type), intent(in) :: model_create_handle
312    integer(c_int), intent(in) :: number_of_neighbor_lists
313    real(c_double), intent(in), target :: cutoffs(number_of_neighbor_lists)
314    integer(c_int), intent(in), target :: &
315      model_will_not_request_neighbors_of_noncontributing_particles( &
316      number_of_neighbor_lists)
317    type(kim_model_create_type), pointer :: model_create
318
319    call c_f_pointer(model_create_handle%p, model_create)
320    call set_neighbor_list_pointers( &
321      model_create, number_of_neighbor_lists, c_loc(cutoffs), &
322      c_loc(model_will_not_request_neighbors_of_noncontributing_particles))
323  end subroutine kim_model_create_set_neighbor_list_pointers
324
325  !> \brief \copybrief KIM::ModelCreate::SetRoutinePointer
326  !!
327  !! \sa KIM::ModelCreate::SetRoutinePointer, KIM_ModelCreate_SetRoutinePointer
328  !!
329  !! \since 2.0
330  recursive subroutine kim_model_create_set_routine_pointer( &
331    model_create_handle, model_routine_name, language_name, required, fptr, &
332    ierr)
333    use kim_model_routine_name_module, only: kim_model_routine_name_type
334    use kim_language_name_module, only: kim_language_name_type
335    use kim_interoperable_types_module, only: kim_model_create_type
336    implicit none
337    interface
338      integer(c_int) recursive function set_routine_pointer( &
339        model_create, model_routine_name, language_name, required, fptr) &
340        bind(c, name="KIM_ModelCreate_SetRoutinePointer")
341        use, intrinsic :: iso_c_binding
342        use kim_model_routine_name_module, only: kim_model_routine_name_type
343        use kim_language_name_module, only: kim_language_name_type
344        use kim_interoperable_types_module, only: kim_model_create_type
345        implicit none
346        type(kim_model_create_type), intent(in) :: model_create
347        type(kim_model_routine_name_type), intent(in), value &
348          :: model_routine_name
349        type(kim_language_name_type), intent(in), value :: language_name
350        integer(c_int), intent(in), value :: required
351        type(c_funptr), intent(in), value :: fptr
352      end function set_routine_pointer
353    end interface
354    type(kim_model_create_handle_type), intent(in) :: model_create_handle
355    type(kim_model_routine_name_type), intent(in) :: model_routine_name
356    type(kim_language_name_type), intent(in) :: language_name
357    integer(c_int), intent(in) :: required
358    type(c_funptr), intent(in), value :: fptr  ! must be left as "value"!?!
359    integer(c_int), intent(out) :: ierr
360    type(kim_model_create_type), pointer :: model_create
361
362    call c_f_pointer(model_create_handle%p, model_create)
363    ierr = set_routine_pointer(model_create, model_routine_name, &
364                               language_name, required, fptr)
365  end subroutine kim_model_create_set_routine_pointer
366
367  !> \brief \copybrief KIM::ModelCreate::SetSpeciesCode
368  !!
369  !! \sa KIM::ModelCreate::SetSpeciesCode, KIM_ModelCreate_SetSpeciesCode
370  !!
371  !! \since 2.0
372  recursive subroutine kim_model_create_set_species_code( &
373    model_create_handle, species_name, code, ierr)
374    use kim_species_name_module, only: kim_species_name_type
375    use kim_interoperable_types_module, only: kim_model_create_type
376    implicit none
377    interface
378      integer(c_int) recursive function set_species_code(model_create, &
379                                                         species_name, code) &
380        bind(c, name="KIM_ModelCreate_SetSpeciesCode")
381        use, intrinsic :: iso_c_binding
382        use kim_species_name_module, only: kim_species_name_type
383        use kim_interoperable_types_module, only: kim_model_create_type
384        implicit none
385        type(kim_model_create_type), intent(in) :: model_create
386        type(kim_species_name_type), intent(in), value :: species_name
387        integer(c_int), intent(in), value :: code
388      end function set_species_code
389    end interface
390    type(kim_model_create_handle_type), intent(in) :: model_create_handle
391    type(kim_species_name_type), intent(in) :: species_name
392    integer(c_int), intent(in) :: code
393    integer(c_int), intent(out) :: ierr
394    type(kim_model_create_type), pointer :: model_create
395
396    call c_f_pointer(model_create_handle%p, model_create)
397    ierr = set_species_code(model_create, species_name, code)
398  end subroutine kim_model_create_set_species_code
399
400  !> \brief \copybrief KIM::ModelCreate::SetParameterPointer
401  !!
402  !! \sa KIM::ModelCreate::SetParameterPointer,
403  !! KIM_ModelCreate_SetParameterPointerInteger
404  !!
405  !! \since 2.0
406  recursive subroutine kim_model_create_set_parameter_pointer_integer( &
407    model_create_handle, int1, name, description, ierr)
408    use kim_interoperable_types_module, only: kim_model_create_type
409    implicit none
410    type(kim_model_create_handle_type), intent(in) :: model_create_handle
411    integer(c_int), intent(in), target :: int1(:)
412    character(len=*, kind=c_char), intent(in) :: name
413    character(len=*, kind=c_char), intent(in) :: description
414    integer(c_int), intent(out) :: ierr
415    type(kim_model_create_type), pointer :: model_create
416
417    call c_f_pointer(model_create_handle%p, model_create)
418    call set_parameter(model_create, size(int1, 1, c_int), int1, name, &
419                       description, ierr)
420    return
421
422  contains
423    recursive subroutine set_parameter(model_create, extent, int1, name, &
424                                       description, ierr)
425      use kim_interoperable_types_module, only: kim_model_create_type
426      implicit none
427      interface
428        integer(c_int) recursive function set_parameter_pointer_integer( &
429          model_create, extent, ptr, name, description) &
430          bind(c, name="KIM_ModelCreate_SetParameterPointerInteger")
431          use, intrinsic :: iso_c_binding
432          use kim_interoperable_types_module, only: kim_model_create_type
433          implicit none
434          type(kim_model_create_type), intent(in) :: model_create
435          integer(c_int), intent(in), value :: extent
436          type(c_ptr), intent(in), value :: ptr
437          character(c_char), intent(in) :: name(*)
438          character(c_char), intent(in) :: description(*)
439        end function set_parameter_pointer_integer
440      end interface
441      type(kim_model_create_type), intent(in) :: model_create
442      integer(c_int), intent(in) :: extent
443      integer(c_int), intent(in), target :: int1(extent)
444      character(len=*, kind=c_char), intent(in) :: name
445      character(len=*, kind=c_char), intent(in) :: description
446      integer(c_int), intent(out) :: ierr
447
448      ierr = set_parameter_pointer_integer(model_create, &
449                                           extent, &
450                                           c_loc(int1), &
451                                           trim(name)//c_null_char, &
452                                           trim(description)//c_null_char)
453    end subroutine set_parameter
454  end subroutine kim_model_create_set_parameter_pointer_integer
455
456  !> \brief \copybrief KIM::ModelCreate::SetParameterPointer
457  !!
458  !! \sa KIM::ModelCreate::SetParameterPointer,
459  !! KIM_ModelCreate_SetParameterPointerDouble
460  !!
461  !! \since 2.0
462  recursive subroutine kim_model_create_set_parameter_pointer_double( &
463    model_create_handle, double1, name, description, ierr)
464    use kim_interoperable_types_module, only: kim_model_create_type
465    implicit none
466    type(kim_model_create_handle_type), intent(in) :: model_create_handle
467    real(c_double), intent(in), target :: double1(:)
468    character(len=*, kind=c_char), intent(in) :: name
469    character(len=*, kind=c_char), intent(in) :: description
470    integer(c_int), intent(out) :: ierr
471    type(kim_model_create_type), pointer :: model_create
472
473    call c_f_pointer(model_create_handle%p, model_create)
474    call set_parameter(model_create, size(double1, 1, c_int), double1, &
475                       name, description, ierr)
476    return
477
478  contains
479    recursive subroutine set_parameter(model_create, extent, double1, name, &
480                                       description, ierr)
481      implicit none
482      interface
483        integer(c_int) recursive function set_parameter_pointer_double( &
484          model_create, extent, ptr, name, description) &
485          bind(c, name="KIM_ModelCreate_SetParameterPointerDouble")
486          use, intrinsic :: iso_c_binding
487          use kim_interoperable_types_module, only: kim_model_create_type
488          implicit none
489          type(kim_model_create_type), intent(in) :: model_create
490          integer(c_int), intent(in), value :: extent
491          type(c_ptr), intent(in), value :: ptr
492          character(c_char), intent(in) :: name(*)
493          character(c_char), intent(in) :: description(*)
494        end function set_parameter_pointer_double
495      end interface
496      type(kim_model_create_type), intent(in) :: model_create
497      integer(c_int), intent(in) :: extent
498      real(c_double), intent(in), target :: double1(extent)
499      character(len=*, kind=c_char), intent(in) :: name
500      character(len=*, kind=c_char), intent(in) :: description
501      integer(c_int), intent(out) :: ierr
502
503      ierr = set_parameter_pointer_double(model_create, &
504                                          extent, &
505                                          c_loc(double1), &
506                                          trim(name)//c_null_char, &
507                                          trim(description)//c_null_char)
508    end subroutine set_parameter
509  end subroutine kim_model_create_set_parameter_pointer_double
510
511  !> \brief \copybrief KIM::ModelCreate::SetModelBufferPointer
512  !!
513  !! \sa KIM::ModelCreate::SetModelBufferPointer,
514  !! KIM_ModelCreate_SetModelBufferPointer
515  !!
516  !! \since 2.0
517  recursive subroutine kim_model_create_set_model_buffer_pointer( &
518    model_create_handle, ptr)
519    use kim_interoperable_types_module, only: kim_model_create_type
520    implicit none
521    interface
522      recursive subroutine set_model_buffer_pointer(model_create, ptr) &
523        bind(c, name="KIM_ModelCreate_SetModelBufferPointer")
524        use, intrinsic :: iso_c_binding
525        use kim_interoperable_types_module, only: kim_model_create_type
526        implicit none
527        type(kim_model_create_type), intent(in) :: model_create
528        type(c_ptr), intent(in), value :: ptr
529      end subroutine set_model_buffer_pointer
530    end interface
531    type(kim_model_create_handle_type), intent(in) :: model_create_handle
532    type(c_ptr), intent(in) :: ptr
533    type(kim_model_create_type), pointer :: model_create
534
535    call c_f_pointer(model_create_handle%p, model_create)
536    call set_model_buffer_pointer(model_create, ptr)
537  end subroutine kim_model_create_set_model_buffer_pointer
538
539  !> \brief \copybrief KIM::ModelCreate::SetUnits
540  !!
541  !! \sa KIM::ModelCreate::SetUnits, KIM_ModelCreate_SetUnits
542  !!
543  !! \since 2.0
544  recursive subroutine kim_model_create_set_units( &
545    model_create_handle, length_unit, energy_unit, charge_unit, &
546    temperature_unit, time_unit, ierr)
547    use kim_unit_system_module, only: &
548      kim_length_unit_type, &
549      kim_energy_unit_type, &
550      kim_charge_unit_type, &
551      kim_temperature_unit_type, &
552      kim_time_unit_type
553    use kim_interoperable_types_module, only: kim_model_create_type
554    implicit none
555    interface
556      integer(c_int) recursive function set_units( &
557        model_create, length_unit, energy_unit, charge_unit, temperature_unit, &
558        time_unit) bind(c, name="KIM_ModelCreate_SetUnits")
559        use, intrinsic :: iso_c_binding
560        use kim_unit_system_module, only: kim_length_unit_type, &
561                                          kim_energy_unit_type, &
562                                          kim_charge_unit_type, &
563                                          kim_temperature_unit_type, &
564                                          kim_time_unit_type
565        use kim_interoperable_types_module, only: kim_model_create_type
566        implicit none
567        type(kim_model_create_type), intent(in) :: model_create
568        type(kim_length_unit_type), intent(in), value :: length_unit
569        type(kim_energy_unit_type), intent(in), value :: energy_unit
570        type(kim_charge_unit_type), intent(in), value :: charge_unit
571        type(kim_temperature_unit_type), intent(in), value :: temperature_unit
572        type(kim_time_unit_type), intent(in), value :: time_unit
573      end function set_units
574    end interface
575    type(kim_model_create_handle_type), intent(in) :: model_create_handle
576    type(kim_length_unit_type), intent(in) :: length_unit
577    type(kim_energy_unit_type), intent(in) :: energy_unit
578    type(kim_charge_unit_type), intent(in) :: charge_unit
579    type(kim_temperature_unit_type), intent(in) :: temperature_unit
580    type(kim_time_unit_type), intent(in) :: time_unit
581    integer(c_int), intent(out) :: ierr
582    type(kim_model_create_type), pointer :: model_create
583
584    call c_f_pointer(model_create_handle%p, model_create)
585    ierr = set_units(model_create, length_unit, energy_unit, &
586                     charge_unit, temperature_unit, time_unit)
587  end subroutine kim_model_create_set_units
588
589  !> \brief \copybrief KIM::ModelCreate::ConvertUnit
590  !!
591  !! \sa KIM::ModelCreate::ConvertUnit, KIM_ModelCreate_ConvertUnit
592  !!
593  !! \since 2.0
594  recursive subroutine kim_model_create_convert_unit( &
595    from_length_unit, from_energy_unit, &
596    from_charge_unit, from_temperature_unit, from_time_unit, &
597    to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
598    to_time_unit, length_exponent, energy_exponent, charge_exponent, &
599    temperature_exponent, time_exponent, conversion_factor, ierr)
600    use kim_unit_system_module, only: kim_length_unit_type
601    use kim_unit_system_module, only: kim_energy_unit_type
602    use kim_unit_system_module, only: kim_charge_unit_type
603    use kim_unit_system_module, only: kim_temperature_unit_type
604    use kim_unit_system_module, only: kim_time_unit_type
605    implicit none
606    interface
607      integer(c_int) recursive function convert_unit( &
608        from_length_unit, from_energy_unit, &
609        from_charge_unit, from_temperature_unit, from_time_unit, &
610        to_length_unit, to_energy_unit, to_charge_unit, to_temperature_unit, &
611        to_time_unit, length_exponent, energy_exponent, charge_exponent, &
612        temperature_exponent, time_exponent, conversion_factor) &
613        bind(c, name="KIM_ModelCreate_ConvertUnit")
614        use, intrinsic :: iso_c_binding
615        use kim_unit_system_module, only: kim_length_unit_type
616        use kim_unit_system_module, only: kim_energy_unit_type
617        use kim_unit_system_module, only: kim_charge_unit_type
618        use kim_unit_system_module, only: kim_temperature_unit_type
619        use kim_unit_system_module, only: kim_time_unit_type
620        implicit none
621        type(kim_length_unit_type), intent(in), value :: from_length_unit
622        type(kim_energy_unit_type), intent(in), value :: from_energy_unit
623        type(kim_charge_unit_type), intent(in), value :: from_charge_unit
624        type(kim_temperature_unit_type), intent(in), value :: &
625          from_temperature_unit
626        type(kim_time_unit_type), intent(in), value :: from_time_unit
627        type(kim_length_unit_type), intent(in), value :: to_length_unit
628        type(kim_energy_unit_type), intent(in), value :: to_energy_unit
629        type(kim_charge_unit_type), intent(in), value :: to_charge_unit
630        type(kim_temperature_unit_type), intent(in), value :: &
631          to_temperature_unit
632        type(kim_time_unit_type), intent(in), value :: to_time_unit
633        real(c_double), intent(in), value :: length_exponent
634        real(c_double), intent(in), value :: energy_exponent
635        real(c_double), intent(in), value :: charge_exponent
636        real(c_double), intent(in), value :: temperature_exponent
637        real(c_double), intent(in), value :: time_exponent
638        real(c_double), intent(out) :: conversion_factor
639      end function convert_unit
640    end interface
641    type(kim_length_unit_type), intent(in) :: from_length_unit
642    type(kim_energy_unit_type), intent(in) :: from_energy_unit
643    type(kim_charge_unit_type), intent(in) :: from_charge_unit
644    type(kim_temperature_unit_type), intent(in) :: from_temperature_unit
645    type(kim_time_unit_type), intent(in) :: from_time_unit
646    type(kim_length_unit_type), intent(in) :: to_length_unit
647    type(kim_energy_unit_type), intent(in) :: to_energy_unit
648    type(kim_charge_unit_type), intent(in) :: to_charge_unit
649    type(kim_temperature_unit_type), intent(in) :: to_temperature_unit
650    type(kim_time_unit_type), intent(in) :: to_time_unit
651    real(c_double), intent(in) :: length_exponent
652    real(c_double), intent(in) :: energy_exponent
653    real(c_double), intent(in) :: charge_exponent
654    real(c_double), intent(in) :: temperature_exponent
655    real(c_double), intent(in) :: time_exponent
656    real(c_double), intent(out) :: conversion_factor
657    integer(c_int), intent(out) :: ierr
658
659    ierr = convert_unit(from_length_unit, from_energy_unit, from_charge_unit, &
660                        from_temperature_unit, from_time_unit, to_length_unit, &
661                        to_energy_unit, to_charge_unit, to_temperature_unit, &
662                        to_time_unit, length_exponent, energy_exponent, &
663                        charge_exponent, temperature_exponent, time_exponent, &
664                        conversion_factor)
665  end subroutine kim_model_create_convert_unit
666
667  !> \brief \copybrief KIM::ModelCreate::LogEntry
668  !!
669  !! \sa KIM::ModelCreate::LogEntry, KIM_ModelCreate_LogEntry
670  !!
671  !! \since 2.0
672  recursive subroutine kim_model_create_log_entry(model_create_handle, &
673                                                  log_verbosity, message)
674    use kim_log_verbosity_module, only: kim_log_verbosity_type
675    use kim_interoperable_types_module, only: kim_model_create_type
676    implicit none
677    interface
678      recursive subroutine log_entry(model_create, log_verbosity, message, &
679                                     line_number, file_name) &
680        bind(c, name="KIM_ModelCreate_LogEntry")
681        use, intrinsic :: iso_c_binding
682        use kim_log_verbosity_module, only: kim_log_verbosity_type
683        use kim_interoperable_types_module, only: kim_model_create_type
684        implicit none
685        type(kim_model_create_type), intent(in) :: model_create
686        type(kim_log_verbosity_type), intent(in), value :: log_verbosity
687        character(c_char), intent(in) :: message(*)
688        integer(c_int), intent(in), value :: line_number
689        character(c_char), intent(in) :: file_name(*)
690      end subroutine log_entry
691    end interface
692    type(kim_model_create_handle_type), intent(in) :: model_create_handle
693    type(kim_log_verbosity_type), intent(in) :: log_verbosity
694    character(len=*, kind=c_char), intent(in) :: message
695    type(kim_model_create_type), pointer :: model_create
696
697    call c_f_pointer(model_create_handle%p, model_create)
698    call log_entry(model_create, log_verbosity, trim(message)//c_null_char, &
699                   0, ""//c_null_char)
700  end subroutine kim_model_create_log_entry
701
702  !> \brief \copybrief KIM::ModelCreate::ToString
703  !!
704  !! \sa KIM::ModelCreate::ToString, KIM_ModelCreate_ToString
705  !!
706  !! \since 2.0
707  recursive subroutine kim_model_create_to_string(model_create_handle, string)
708    use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
709    use kim_interoperable_types_module, only: kim_model_create_type
710    implicit none
711    interface
712      type(c_ptr) recursive function model_create_string(model_create) &
713        bind(c, name="KIM_ModelCreate_ToString")
714        use, intrinsic :: iso_c_binding
715        use kim_interoperable_types_module, only: kim_model_create_type
716        implicit none
717        type(kim_model_create_type), intent(in) :: model_create
718      end function model_create_string
719    end interface
720    type(kim_model_create_handle_type), intent(in) :: model_create_handle
721    character(len=*, kind=c_char), intent(out) :: string
722    type(kim_model_create_type), pointer :: model_create
723
724    type(c_ptr) :: p
725
726    call c_f_pointer(model_create_handle%p, model_create)
727    p = model_create_string(model_create)
728    call kim_convert_c_char_ptr_to_string(p, string)
729  end subroutine kim_model_create_to_string
730end module kim_model_create_module
731