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