kim-api  2.2.1+v2.2.1.GNU.GNU.
An Application Programming Interface (API) for the Knowledgebase of Interatomic Models (KIM).
kim_model_extension_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_extension_handle_type, &
46  ! Constants
48  ! Routines
49  operator(.eq.), &
50  operator(.ne.), &
51  kim_get_extension_id, &
52  kim_to_model, &
53  kim_to_model_compute, &
54  kim_to_model_create, &
55  kim_to_model_destroy, &
56  kim_to_model_driver_create, &
57  kim_to_model_refresh, &
58  kim_to_model_write_parameterized_model, &
59  kim_to_model_compute_arguments, &
60  kim_to_model_compute_arguments_create, &
61  kim_to_model_compute_arguments_destroy, &
62  kim_c_char_array_to_string, &
63  kim_c_char_ptr_to_string, &
64  kim_string_to_c_char_array, &
65  kim_get_model_buffer_pointer, &
66  kim_log_entry, &
67  kim_to_string
68 
74  type, bind(c) :: kim_model_extension_handle_type
75  type(c_ptr) :: p = c_null_ptr
76  end type kim_model_extension_handle_type
77 
81  type(kim_model_extension_handle_type), protected, save &
83 
87  interface operator(.eq.)
88  module procedure kim_model_extension_handle_equal
89  end interface operator(.eq.)
90 
94  interface operator(.ne.)
95  module procedure kim_model_extension_handle_not_equal
96  end interface operator(.ne.)
97 
103  interface kim_get_extension_id
104  module procedure kim_model_extension_get_extension_id
105  end interface kim_get_extension_id
106 
112  interface kim_to_model
113  module procedure kim_model_extension_to_model
114  end interface kim_to_model
115 
121  interface kim_to_model_compute
122  module procedure kim_model_extension_to_model_compute
123  end interface kim_to_model_compute
124 
130  interface kim_to_model_create
131  module procedure kim_model_extension_to_model_create
132  end interface kim_to_model_create
133 
139  interface kim_to_model_destroy
140  module procedure kim_model_extension_to_model_destroy
141  end interface kim_to_model_destroy
142 
149  interface kim_to_model_driver_create
151  end interface kim_to_model_driver_create
152 
158  interface kim_to_model_refresh
159  module procedure kim_model_extension_to_model_refresh
160  end interface kim_to_model_refresh
161 
168  interface kim_to_model_write_parameterized_model
170  end interface kim_to_model_write_parameterized_model
171 
178  interface kim_to_model_compute_arguments
180  end interface kim_to_model_compute_arguments
181 
188  interface kim_to_model_compute_arguments_create
190  end interface kim_to_model_compute_arguments_create
191 
198  interface kim_to_model_compute_arguments_destroy
200  end interface kim_to_model_compute_arguments_destroy
201 
205  interface kim_c_char_array_to_string
207  end interface kim_c_char_array_to_string
208 
212  interface kim_c_char_ptr_to_string
214  end interface kim_c_char_ptr_to_string
215 
219  interface kim_string_to_c_char_array
221  end interface kim_string_to_c_char_array
222 
229  interface kim_get_model_buffer_pointer
231  end interface kim_get_model_buffer_pointer
232 
238  interface kim_log_entry
239  module procedure kim_model_extension_log_entry
240  end interface kim_log_entry
241 
247  interface kim_to_string
248  module procedure kim_model_extension_to_string
249  end interface kim_to_string
250 
251 contains
255  logical recursive function kim_model_extension_handle_equal(lhs, rhs)
256  implicit none
257  type(kim_model_extension_handle_type), intent(in) :: lhs
258  type(kim_model_extension_handle_type), intent(in) :: rhs
259 
260  if ((.not. c_associated(lhs%p)) .and. (.not. c_associated(rhs%p))) then
261  kim_model_extension_handle_equal = .true.
262  else
263  kim_model_extension_handle_equal = c_associated(lhs%p, rhs%p)
264  end if
265  end function kim_model_extension_handle_equal
266 
270  logical recursive function kim_model_extension_handle_not_equal(lhs, rhs)
271  implicit none
272  type(kim_model_extension_handle_type), intent(in) :: lhs
273  type(kim_model_extension_handle_type), intent(in) :: rhs
274 
275  kim_model_extension_handle_not_equal = .not. (lhs == rhs)
276  end function kim_model_extension_handle_not_equal
277 
283  recursive subroutine kim_model_extension_get_extension_id( &
284  model_extension_handle, extension_id)
285  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
286  use kim_interoperable_types_module, only: kim_model_extension_type
287  implicit none
288  interface
289  recursive subroutine get_extension_id(model_extension, extension_id) &
290  bind(c, name="KIM_ModelExtension_GetExtensionID")
291  use, intrinsic :: iso_c_binding
292  use kim_interoperable_types_module, only: kim_model_extension_type
293  implicit none
294  type(kim_model_extension_type), intent(in) :: model_extension
295  type(c_ptr), intent(out) :: extension_id
296  end subroutine get_extension_id
297  end interface
298  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
299  character(len=*, kind=c_char), intent(out) :: extension_id
300  type(kim_model_extension_type), pointer :: model_extension
301 
302  type(c_ptr) :: p
303 
304  call c_f_pointer(model_extension_handle%p, model_extension)
305  call get_extension_id(model_extension, p)
306  call kim_convert_c_char_ptr_to_string(p, extension_id)
307  end subroutine kim_model_extension_get_extension_id
308 
314  recursive subroutine kim_model_extension_to_model(model_extension_handle, &
315  model_handle)
317  implicit none
318  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
319  type(kim_model_handle_type), intent(out) :: model_handle
320 
321  model_handle%p = model_extension_handle%p
322  end subroutine kim_model_extension_to_model
323 
329  recursive subroutine kim_model_extension_to_model_compute( &
330  model_extension_handle, model_compute_handle)
332  implicit none
333  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
334  type(kim_model_compute_handle_type), intent(out) :: model_compute_handle
335 
336  model_compute_handle%p = model_extension_handle%p
338 
344  recursive subroutine kim_model_extension_to_model_create( &
345  model_extension_handle, model_create_handle)
347  implicit none
348  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
349  type(kim_model_create_handle_type), intent(out) :: model_create_handle
350 
351  model_create_handle%p = model_extension_handle%p
353 
359  recursive subroutine kim_model_extension_to_model_destroy( &
360  model_extension_handle, model_destroy_handle)
362  implicit none
363  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
364  type(kim_model_destroy_handle_type), intent(out) :: model_destroy_handle
365 
366  model_destroy_handle%p = model_extension_handle%p
368 
375  recursive subroutine kim_model_extension_to_model_driver_create( &
376  model_extension_handle, model_driver_create_handle)
378  implicit none
379  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
380  type(kim_model_driver_create_handle_type), intent(out) &
381  :: model_driver_create_handle
382 
383  model_driver_create_handle%p = model_extension_handle%p
385 
391  recursive subroutine kim_model_extension_to_model_refresh( &
392  model_extension_handle, model_refresh_handle)
394  implicit none
395  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
396  type(kim_model_refresh_handle_type), intent(out) :: model_refresh_handle
397 
398  model_refresh_handle%p = model_extension_handle%p
400 
408  model_extension_handle, model_write_parameterized_model_handle)
410  implicit none
411  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
412  type(kim_model_write_parameterized_model_handle_type), intent(out) &
413  :: model_write_parameterized_model_handle
414 
415  model_write_parameterized_model_handle%p = model_extension_handle%p
417 
424  recursive subroutine kim_model_extension_to_model_compute_arguments( &
425  model_extension_handle, compute_arguments_c_ptr, &
426  model_compute_arguments_handle)
428  implicit none
429  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
430  type(c_ptr), intent(in) :: compute_arguments_c_ptr
431  type(kim_model_compute_arguments_handle_type), intent(out) &
432  :: model_compute_arguments_handle
433 
434  ! avoid unused dummy argument warnings
435  if (model_extension_handle == kim_model_extension_null_handle) continue
436 
437  model_compute_arguments_handle%p = compute_arguments_c_ptr
439 
447  model_extension_handle, compute_arguments_c_ptr, &
448  model_compute_arguments_create_handle)
450  implicit none
451  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
452  type(c_ptr), intent(in) :: compute_arguments_c_ptr
453  type(kim_model_compute_arguments_create_handle_type), intent(out) &
454  :: model_compute_arguments_create_handle
455 
456  ! avoid unused dummy argument warnings
457  if (model_extension_handle == kim_model_extension_null_handle) continue
458 
459  model_compute_arguments_create_handle%p = compute_arguments_c_ptr
461 
469  model_extension_handle, compute_arguments_c_ptr, &
470  model_compute_arguments_destroy_handle)
472  implicit none
473  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
474  type(c_ptr), intent(in) :: compute_arguments_c_ptr
475  type(kim_model_compute_arguments_destroy_handle_type), intent(out) &
476  :: model_compute_arguments_destroy_handle
477 
478  ! avoid unused dummy argument warnings
479  if (model_extension_handle == kim_model_extension_null_handle) continue
480 
481  model_compute_arguments_destroy_handle%p = compute_arguments_c_ptr
483 
488  c_char_array, string)
489  use kim_convert_string_module, only: kim_convert_c_char_array_to_string
490  implicit none
491  character(len=1, kind=c_char), intent(in) :: c_char_array(:)
492  character(len=*, kind=c_char), intent(out) :: string
493 
494  call kim_convert_c_char_array_to_string(c_char_array, string)
496 
501  c_char_ptr, string)
502  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
503  implicit none
504  type(c_ptr), intent(in) :: c_char_ptr
505  character(len=*, kind=c_char), intent(out) :: string
506 
507  call kim_convert_c_char_ptr_to_string(c_char_ptr, string)
509 
514  string, c_char_array)
515  use kim_convert_string_module, only: kim_convert_string_to_c_char_array
516  implicit none
517  character(len=*, kind=c_char), intent(in) :: string
518  character(len=1, kind=c_char), intent(out) :: c_char_array(:)
519 
520  call kim_convert_string_to_c_char_array(string, c_char_array)
522 
529  recursive subroutine kim_model_extension_get_model_buffer_pointer( &
530  model_extension_handle, ptr)
531  use kim_interoperable_types_module, only: kim_model_extension_type
532  implicit none
533  interface
534  recursive subroutine get_model_buffer_pointer(model_extension, ptr) &
535  bind(c, name="KIM_ModelExtension_GetModelBufferPointer")
536  use, intrinsic :: iso_c_binding
537  use kim_interoperable_types_module, only: kim_model_extension_type
538  implicit none
539  type(kim_model_extension_type), intent(in) :: model_extension
540  type(c_ptr), intent(out) :: ptr
541  end subroutine get_model_buffer_pointer
542  end interface
543  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
544  type(c_ptr), intent(out) :: ptr
545  type(kim_model_extension_type), pointer :: model_extension
546 
547  call c_f_pointer(model_extension_handle%p, model_extension)
548  call get_model_buffer_pointer(model_extension, ptr)
550 
556  recursive subroutine kim_model_extension_log_entry(model_extension_handle, &
557  log_verbosity, message)
558  use kim_log_verbosity_module, only: kim_log_verbosity_type
559  use kim_interoperable_types_module, only: kim_model_extension_type
560  implicit none
561  interface
562  recursive subroutine log_entry( &
563  model_extension, log_verbosity, message, line_number, file_name) &
564  bind(c, name="KIM_ModelExtension_LogEntry")
565  use, intrinsic :: iso_c_binding
566  use kim_log_verbosity_module, only: kim_log_verbosity_type
567  use kim_interoperable_types_module, only: kim_model_extension_type
568  implicit none
569  type(kim_model_extension_type), intent(in) :: model_extension
570  type(kim_log_verbosity_type), intent(in), value :: log_verbosity
571  character(c_char), intent(in) :: message(*)
572  integer(c_int), intent(in), value :: line_number
573  character(c_char), intent(in) :: file_name(*)
574  end subroutine log_entry
575  end interface
576  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
577  type(kim_log_verbosity_type), intent(in) :: log_verbosity
578  character(len=*, kind=c_char), intent(in) :: message
579  type(kim_model_extension_type), pointer :: model_extension
580 
581  call c_f_pointer(model_extension_handle%p, model_extension)
582  call log_entry(model_extension, log_verbosity, trim(message)//c_null_char, &
583  0, ""//c_null_char)
584  end subroutine kim_model_extension_log_entry
585 
591  recursive subroutine kim_model_extension_to_string(model_extension_handle, &
592  string)
593  use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
594  use kim_interoperable_types_module, only: kim_model_extension_type
595  implicit none
596  interface
597  type(c_ptr) recursive function model_extension_string(model_extension) &
598  bind(c, name="KIM_ModelExtension_ToString")
599  use, intrinsic :: iso_c_binding
600  use kim_interoperable_types_module, only: kim_model_extension_type
601  implicit none
602  type(kim_model_extension_type), intent(in) :: model_extension
603  end function model_extension_string
604  end interface
605  type(kim_model_extension_handle_type), intent(in) :: model_extension_handle
606  character(len=*, kind=c_char), intent(out) :: string
607  type(kim_model_extension_type), pointer :: model_extension
608 
609  type(c_ptr) :: p
610 
611  call c_f_pointer(model_extension_handle%p, model_extension)
612  p = model_extension_string(model_extension)
613  call kim_convert_c_char_ptr_to_string(p, string)
614  end subroutine kim_model_extension_to_string
recursive subroutine kim_model_extension_to_model_compute_arguments_destroy(model_extension_handle, compute_arguments_c_ptr, model_compute_arguments_destroy_handle)
Convert the ModelExtension interface to the Model object to a ModelComputeArgumentsDestroy interface...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
recursive subroutine kim_model_extension_to_model_driver_create(model_extension_handle, model_driver_create_handle)
Convert the ModelExtension interface to the Model object to a ModelDriverCreate interface.
recursive subroutine kim_model_extension_to_model_create(model_extension_handle, model_create_handle)
Convert the ModelExtension interface to the Model object to a ModelCompute interface.
recursive subroutine kim_model_extension_convert_c_char_ptr_to_string(c_char_ptr, string)
Copy C character pointer to Fortran string.
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
recursive subroutine kim_model_extension_to_model_refresh(model_extension_handle, model_refresh_handle)
Convert the ModelExtension interface to the Model object to a ModelRefresh interface.
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::E...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::R...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::D...
recursive subroutine kim_model_extension_to_model(model_extension_handle, model_handle)
Convert the ModelExtension interface to the Model object to a Model interface.
recursive subroutine kim_model_extension_to_model_compute_arguments(model_extension_handle, compute_arguments_c_ptr, model_compute_arguments_handle)
Convert the ModelExtension interface to the Model object to a ModelComputeArguments interface...
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::W...
recursive subroutine kim_model_extension_to_model_destroy(model_extension_handle, model_destroy_handle)
Convert the ModelExtension interface to the Model object to a ModelDestroy interface.
recursive subroutine kim_model_extension_log_entry(model_extension_handle, log_verbosity, message)
Write a log entry into the log file.
Provides the primary interface to a KIM API Model object and is meant to be used by simulators...
recursive subroutine kim_model_extension_to_model_compute(model_extension_handle, model_compute_handle)
Convert the ModelExtension interface to the Model object to a ModelCompute interface.
recursive subroutine kim_model_extension_to_model_write_parameterized_model(model_extension_handle, model_write_parameterized_model_handle)
Convert the ModelExtension interface to the Model object to a ModelWriteParameterizedModel interface...
recursive subroutine kim_model_extension_get_model_buffer_pointer(model_extension_handle, ptr)
Get the Model's buffer pointer within the Model object.
recursive subroutine kim_model_extension_to_model_compute_arguments_create(model_extension_handle, compute_arguments_c_ptr, model_compute_arguments_create_handle)
Convert the ModelExtension interface to the Model object to a ModelComputeArgumentsCreate interface...
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
type(kim_model_extension_handle_type), save, public, protected kim_model_extension_null_handle
NULL handle for use in comparisons.
Provides the interface to a KIM API ComputeArguments object for use by models within their MODEL_ROUT...
recursive subroutine kim_model_extension_convert_c_char_array_to_string(c_char_array, string)
Copy C character array to Fortran string.
Provides the interface to a KIM API Model object for use by models within their MODEL_ROUTINE_NAME::C...
static int model_extension(KIM_ModelExtension *const modelExtension, void *const extensionStructure)
An Extensible Enumeration for the LogVerbosity's supported by the KIM API.
recursive subroutine kim_model_extension_convert_string_to_c_char_array(string, c_char_array)
Convert Fortran string to C character array.
recursive subroutine kim_model_extension_to_string(model_extension_handle, string)
Get a string representing the internal state of the Model object.