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