8 USE iso_c_binding,
ONLY: c_associated, &
23#include "./base/base_uses.f90"
31 TYPE(C_PTR) :: c_ptr = c_null_ptr
36 TYPE(C_PTR) :: c_ptr = c_null_ptr
41 TYPE(C_PTR) :: c_ptr = c_null_ptr
45 MODULE PROCEDURE torch_tensor_from_array_int32_1d
46 MODULE PROCEDURE torch_tensor_from_array_float_1d
47 MODULE PROCEDURE torch_tensor_from_array_int64_1d
48 MODULE PROCEDURE torch_tensor_from_array_double_1d
49 MODULE PROCEDURE torch_tensor_from_array_int32_2d
50 MODULE PROCEDURE torch_tensor_from_array_float_2d
51 MODULE PROCEDURE torch_tensor_from_array_int64_2d
52 MODULE PROCEDURE torch_tensor_from_array_double_2d
53 MODULE PROCEDURE torch_tensor_from_array_int32_3d
54 MODULE PROCEDURE torch_tensor_from_array_float_3d
55 MODULE PROCEDURE torch_tensor_from_array_int64_3d
56 MODULE PROCEDURE torch_tensor_from_array_double_3d
60 MODULE PROCEDURE torch_tensor_data_ptr_int32_1d
61 MODULE PROCEDURE torch_tensor_data_ptr_float_1d
62 MODULE PROCEDURE torch_tensor_data_ptr_int64_1d
63 MODULE PROCEDURE torch_tensor_data_ptr_double_1d
64 MODULE PROCEDURE torch_tensor_data_ptr_int32_2d
65 MODULE PROCEDURE torch_tensor_data_ptr_float_2d
66 MODULE PROCEDURE torch_tensor_data_ptr_int64_2d
67 MODULE PROCEDURE torch_tensor_data_ptr_double_2d
68 MODULE PROCEDURE torch_tensor_data_ptr_int32_3d
69 MODULE PROCEDURE torch_tensor_data_ptr_float_3d
70 MODULE PROCEDURE torch_tensor_data_ptr_int64_3d
71 MODULE PROCEDURE torch_tensor_data_ptr_double_3d
75 MODULE PROCEDURE torch_model_get_attr_string
76 MODULE PROCEDURE torch_model_get_attr_double
77 MODULE PROCEDURE torch_model_get_attr_int64
78 MODULE PROCEDURE torch_model_get_attr_int32
79 MODULE PROCEDURE torch_model_get_attr_strlist
98 SUBROUTINE torch_tensor_from_array_int32_1d(tensor, source, requires_grad)
100 INTEGER(kind=int_4),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
101 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
103#if defined(__LIBTORCH)
104 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
105 LOGICAL :: my_req_grad
108 SUBROUTINE torch_c_tensor_from_array_int32 (tensor, req_grad, ndims, sizes, source) &
109 BIND(C, name="torch_c_tensor_from_array_int32")
110 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
111 TYPE(c_ptr) :: tensor
112 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
113 INTEGER(kind=C_INT),
VALUE :: ndims
114 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
115 INTEGER(kind=C_INT32_T),
DIMENSION(*) :: source
116 END SUBROUTINE torch_c_tensor_from_array_int32
119 my_req_grad = .false.
120 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
122 sizes_c(1) =
SIZE(source, 1)
124 cpassert(.NOT. c_associated(tensor%c_ptr))
125 CALL torch_c_tensor_from_array_int32 (tensor=tensor%c_ptr, &
126 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
130 cpassert(c_associated(tensor%c_ptr))
132 cpabort(
"CP2K compiled without the Torch library.")
135 mark_used(requires_grad)
137 END SUBROUTINE torch_tensor_from_array_int32_1d
144 SUBROUTINE torch_tensor_data_ptr_int32_1d(tensor, data_ptr)
146 INTEGER(kind=int_4),
DIMENSION(:),
POINTER :: data_ptr
148#if defined(__LIBTORCH)
149 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
150 TYPE(c_ptr) :: data_ptr_c
153 SUBROUTINE torch_c_tensor_data_ptr_int32 (tensor, ndims, sizes, data_ptr) &
154 BIND(C, name="torch_c_tensor_data_ptr_int32")
155 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
156 TYPE(c_ptr),
VALUE :: tensor
157 INTEGER(kind=C_INT),
VALUE :: ndims
158 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
159 TYPE(c_ptr) :: data_ptr
160 END SUBROUTINE torch_c_tensor_data_ptr_int32
164 data_ptr_c = c_null_ptr
165 cpassert(c_associated(tensor%c_ptr))
166 cpassert(.NOT.
ASSOCIATED(data_ptr))
167 CALL torch_c_tensor_data_ptr_int32 (tensor=tensor%c_ptr, &
172 cpassert(all(sizes_c >= 0))
173 cpassert(c_associated(data_ptr_c))
175 sizes_f(1) = sizes_c(1)
176 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
178 cpabort(
"CP2K compiled without the Torch library.")
182 END SUBROUTINE torch_tensor_data_ptr_int32_1d
190 SUBROUTINE torch_tensor_from_array_float_1d(tensor, source, requires_grad)
192 REAL(sp),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
193 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
195#if defined(__LIBTORCH)
196 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
197 LOGICAL :: my_req_grad
200 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
201 BIND(C, name="torch_c_tensor_from_array_float")
202 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
203 TYPE(c_ptr) :: tensor
204 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
205 INTEGER(kind=C_INT),
VALUE :: ndims
206 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
207 REAL(kind=c_float),
DIMENSION(*) :: source
208 END SUBROUTINE torch_c_tensor_from_array_float
211 my_req_grad = .false.
212 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
214 sizes_c(1) =
SIZE(source, 1)
216 cpassert(.NOT. c_associated(tensor%c_ptr))
217 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
218 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
222 cpassert(c_associated(tensor%c_ptr))
224 cpabort(
"CP2K compiled without the Torch library.")
227 mark_used(requires_grad)
229 END SUBROUTINE torch_tensor_from_array_float_1d
236 SUBROUTINE torch_tensor_data_ptr_float_1d(tensor, data_ptr)
238 REAL(sp),
DIMENSION(:),
POINTER :: data_ptr
240#if defined(__LIBTORCH)
241 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
242 TYPE(c_ptr) :: data_ptr_c
245 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
246 BIND(C, name="torch_c_tensor_data_ptr_float")
247 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
248 TYPE(c_ptr),
VALUE :: tensor
249 INTEGER(kind=C_INT),
VALUE :: ndims
250 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
251 TYPE(c_ptr) :: data_ptr
252 END SUBROUTINE torch_c_tensor_data_ptr_float
256 data_ptr_c = c_null_ptr
257 cpassert(c_associated(tensor%c_ptr))
258 cpassert(.NOT.
ASSOCIATED(data_ptr))
259 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
264 cpassert(all(sizes_c >= 0))
265 cpassert(c_associated(data_ptr_c))
267 sizes_f(1) = sizes_c(1)
268 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
270 cpabort(
"CP2K compiled without the Torch library.")
274 END SUBROUTINE torch_tensor_data_ptr_float_1d
282 SUBROUTINE torch_tensor_from_array_int64_1d(tensor, source, requires_grad)
284 INTEGER(kind=int_8),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
285 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
287#if defined(__LIBTORCH)
288 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
289 LOGICAL :: my_req_grad
292 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
293 BIND(C, name="torch_c_tensor_from_array_int64")
294 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
295 TYPE(c_ptr) :: tensor
296 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
297 INTEGER(kind=C_INT),
VALUE :: ndims
298 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
299 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
300 END SUBROUTINE torch_c_tensor_from_array_int64
303 my_req_grad = .false.
304 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
306 sizes_c(1) =
SIZE(source, 1)
308 cpassert(.NOT. c_associated(tensor%c_ptr))
309 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
310 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
314 cpassert(c_associated(tensor%c_ptr))
316 cpabort(
"CP2K compiled without the Torch library.")
319 mark_used(requires_grad)
321 END SUBROUTINE torch_tensor_from_array_int64_1d
328 SUBROUTINE torch_tensor_data_ptr_int64_1d(tensor, data_ptr)
330 INTEGER(kind=int_8),
DIMENSION(:),
POINTER :: data_ptr
332#if defined(__LIBTORCH)
333 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
334 TYPE(c_ptr) :: data_ptr_c
337 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
338 BIND(C, name="torch_c_tensor_data_ptr_int64")
339 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
340 TYPE(c_ptr),
VALUE :: tensor
341 INTEGER(kind=C_INT),
VALUE :: ndims
342 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
343 TYPE(c_ptr) :: data_ptr
344 END SUBROUTINE torch_c_tensor_data_ptr_int64
348 data_ptr_c = c_null_ptr
349 cpassert(c_associated(tensor%c_ptr))
350 cpassert(.NOT.
ASSOCIATED(data_ptr))
351 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
356 cpassert(all(sizes_c >= 0))
357 cpassert(c_associated(data_ptr_c))
359 sizes_f(1) = sizes_c(1)
360 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
362 cpabort(
"CP2K compiled without the Torch library.")
366 END SUBROUTINE torch_tensor_data_ptr_int64_1d
374 SUBROUTINE torch_tensor_from_array_double_1d(tensor, source, requires_grad)
376 REAL(dp),
DIMENSION(:),
ALLOCATABLE,
INTENT(IN) :: source
377 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
379#if defined(__LIBTORCH)
380 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_c
381 LOGICAL :: my_req_grad
384 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
385 BIND(C, name="torch_c_tensor_from_array_double")
386 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
387 TYPE(c_ptr) :: tensor
388 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
389 INTEGER(kind=C_INT),
VALUE :: ndims
390 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
391 REAL(kind=c_double),
DIMENSION(*) :: source
392 END SUBROUTINE torch_c_tensor_from_array_double
395 my_req_grad = .false.
396 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
398 sizes_c(1) =
SIZE(source, 1)
400 cpassert(.NOT. c_associated(tensor%c_ptr))
401 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
402 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
406 cpassert(c_associated(tensor%c_ptr))
408 cpabort(
"CP2K compiled without the Torch library.")
411 mark_used(requires_grad)
413 END SUBROUTINE torch_tensor_from_array_double_1d
420 SUBROUTINE torch_tensor_data_ptr_double_1d(tensor, data_ptr)
422 REAL(dp),
DIMENSION(:),
POINTER :: data_ptr
424#if defined(__LIBTORCH)
425 INTEGER(kind=int_8),
DIMENSION(1) :: sizes_f, sizes_c
426 TYPE(c_ptr) :: data_ptr_c
429 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
430 BIND(C, name="torch_c_tensor_data_ptr_double")
431 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
432 TYPE(c_ptr),
VALUE :: tensor
433 INTEGER(kind=C_INT),
VALUE :: ndims
434 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
435 TYPE(c_ptr) :: data_ptr
436 END SUBROUTINE torch_c_tensor_data_ptr_double
440 data_ptr_c = c_null_ptr
441 cpassert(c_associated(tensor%c_ptr))
442 cpassert(.NOT.
ASSOCIATED(data_ptr))
443 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
448 cpassert(all(sizes_c >= 0))
449 cpassert(c_associated(data_ptr_c))
451 sizes_f(1) = sizes_c(1)
452 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
454 cpabort(
"CP2K compiled without the Torch library.")
458 END SUBROUTINE torch_tensor_data_ptr_double_1d
466 SUBROUTINE torch_tensor_from_array_int32_2d(tensor, source, requires_grad)
468 INTEGER(kind=int_4),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
469 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
471#if defined(__LIBTORCH)
472 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
473 LOGICAL :: my_req_grad
476 SUBROUTINE torch_c_tensor_from_array_int32 (tensor, req_grad, ndims, sizes, source) &
477 BIND(C, name="torch_c_tensor_from_array_int32")
478 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
479 TYPE(c_ptr) :: tensor
480 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
481 INTEGER(kind=C_INT),
VALUE :: ndims
482 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
483 INTEGER(kind=C_INT32_T),
DIMENSION(*) :: source
484 END SUBROUTINE torch_c_tensor_from_array_int32
487 my_req_grad = .false.
488 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
490 sizes_c(1) =
SIZE(source, 2)
491 sizes_c(2) =
SIZE(source, 1)
493 cpassert(.NOT. c_associated(tensor%c_ptr))
494 CALL torch_c_tensor_from_array_int32 (tensor=tensor%c_ptr, &
495 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
499 cpassert(c_associated(tensor%c_ptr))
501 cpabort(
"CP2K compiled without the Torch library.")
504 mark_used(requires_grad)
506 END SUBROUTINE torch_tensor_from_array_int32_2d
513 SUBROUTINE torch_tensor_data_ptr_int32_2d(tensor, data_ptr)
515 INTEGER(kind=int_4),
DIMENSION(:, :),
POINTER :: data_ptr
517#if defined(__LIBTORCH)
518 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
519 TYPE(c_ptr) :: data_ptr_c
522 SUBROUTINE torch_c_tensor_data_ptr_int32 (tensor, ndims, sizes, data_ptr) &
523 BIND(C, name="torch_c_tensor_data_ptr_int32")
524 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
525 TYPE(c_ptr),
VALUE :: tensor
526 INTEGER(kind=C_INT),
VALUE :: ndims
527 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
528 TYPE(c_ptr) :: data_ptr
529 END SUBROUTINE torch_c_tensor_data_ptr_int32
533 data_ptr_c = c_null_ptr
534 cpassert(c_associated(tensor%c_ptr))
535 cpassert(.NOT.
ASSOCIATED(data_ptr))
536 CALL torch_c_tensor_data_ptr_int32 (tensor=tensor%c_ptr, &
541 cpassert(all(sizes_c >= 0))
542 cpassert(c_associated(data_ptr_c))
544 sizes_f(1) = sizes_c(2)
545 sizes_f(2) = sizes_c(1)
546 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
548 cpabort(
"CP2K compiled without the Torch library.")
552 END SUBROUTINE torch_tensor_data_ptr_int32_2d
560 SUBROUTINE torch_tensor_from_array_float_2d(tensor, source, requires_grad)
562 REAL(sp),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
563 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
565#if defined(__LIBTORCH)
566 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
567 LOGICAL :: my_req_grad
570 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
571 BIND(C, name="torch_c_tensor_from_array_float")
572 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
573 TYPE(c_ptr) :: tensor
574 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
575 INTEGER(kind=C_INT),
VALUE :: ndims
576 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
577 REAL(kind=c_float),
DIMENSION(*) :: source
578 END SUBROUTINE torch_c_tensor_from_array_float
581 my_req_grad = .false.
582 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
584 sizes_c(1) =
SIZE(source, 2)
585 sizes_c(2) =
SIZE(source, 1)
587 cpassert(.NOT. c_associated(tensor%c_ptr))
588 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
589 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
593 cpassert(c_associated(tensor%c_ptr))
595 cpabort(
"CP2K compiled without the Torch library.")
598 mark_used(requires_grad)
600 END SUBROUTINE torch_tensor_from_array_float_2d
607 SUBROUTINE torch_tensor_data_ptr_float_2d(tensor, data_ptr)
609 REAL(sp),
DIMENSION(:, :),
POINTER :: data_ptr
611#if defined(__LIBTORCH)
612 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
613 TYPE(c_ptr) :: data_ptr_c
616 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
617 BIND(C, name="torch_c_tensor_data_ptr_float")
618 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
619 TYPE(c_ptr),
VALUE :: tensor
620 INTEGER(kind=C_INT),
VALUE :: ndims
621 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
622 TYPE(c_ptr) :: data_ptr
623 END SUBROUTINE torch_c_tensor_data_ptr_float
627 data_ptr_c = c_null_ptr
628 cpassert(c_associated(tensor%c_ptr))
629 cpassert(.NOT.
ASSOCIATED(data_ptr))
630 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
635 cpassert(all(sizes_c >= 0))
636 cpassert(c_associated(data_ptr_c))
638 sizes_f(1) = sizes_c(2)
639 sizes_f(2) = sizes_c(1)
640 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
642 cpabort(
"CP2K compiled without the Torch library.")
646 END SUBROUTINE torch_tensor_data_ptr_float_2d
654 SUBROUTINE torch_tensor_from_array_int64_2d(tensor, source, requires_grad)
656 INTEGER(kind=int_8),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
657 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
659#if defined(__LIBTORCH)
660 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
661 LOGICAL :: my_req_grad
664 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
665 BIND(C, name="torch_c_tensor_from_array_int64")
666 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
667 TYPE(c_ptr) :: tensor
668 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
669 INTEGER(kind=C_INT),
VALUE :: ndims
670 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
671 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
672 END SUBROUTINE torch_c_tensor_from_array_int64
675 my_req_grad = .false.
676 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
678 sizes_c(1) =
SIZE(source, 2)
679 sizes_c(2) =
SIZE(source, 1)
681 cpassert(.NOT. c_associated(tensor%c_ptr))
682 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
683 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
687 cpassert(c_associated(tensor%c_ptr))
689 cpabort(
"CP2K compiled without the Torch library.")
692 mark_used(requires_grad)
694 END SUBROUTINE torch_tensor_from_array_int64_2d
701 SUBROUTINE torch_tensor_data_ptr_int64_2d(tensor, data_ptr)
703 INTEGER(kind=int_8),
DIMENSION(:, :),
POINTER :: data_ptr
705#if defined(__LIBTORCH)
706 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
707 TYPE(c_ptr) :: data_ptr_c
710 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
711 BIND(C, name="torch_c_tensor_data_ptr_int64")
712 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
713 TYPE(c_ptr),
VALUE :: tensor
714 INTEGER(kind=C_INT),
VALUE :: ndims
715 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
716 TYPE(c_ptr) :: data_ptr
717 END SUBROUTINE torch_c_tensor_data_ptr_int64
721 data_ptr_c = c_null_ptr
722 cpassert(c_associated(tensor%c_ptr))
723 cpassert(.NOT.
ASSOCIATED(data_ptr))
724 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
729 cpassert(all(sizes_c >= 0))
730 cpassert(c_associated(data_ptr_c))
732 sizes_f(1) = sizes_c(2)
733 sizes_f(2) = sizes_c(1)
734 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
736 cpabort(
"CP2K compiled without the Torch library.")
740 END SUBROUTINE torch_tensor_data_ptr_int64_2d
748 SUBROUTINE torch_tensor_from_array_double_2d(tensor, source, requires_grad)
750 REAL(dp),
DIMENSION(:, :),
ALLOCATABLE,
INTENT(IN) :: source
751 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
753#if defined(__LIBTORCH)
754 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_c
755 LOGICAL :: my_req_grad
758 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
759 BIND(C, name="torch_c_tensor_from_array_double")
760 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
761 TYPE(c_ptr) :: tensor
762 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
763 INTEGER(kind=C_INT),
VALUE :: ndims
764 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
765 REAL(kind=c_double),
DIMENSION(*) :: source
766 END SUBROUTINE torch_c_tensor_from_array_double
769 my_req_grad = .false.
770 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
772 sizes_c(1) =
SIZE(source, 2)
773 sizes_c(2) =
SIZE(source, 1)
775 cpassert(.NOT. c_associated(tensor%c_ptr))
776 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
777 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
781 cpassert(c_associated(tensor%c_ptr))
783 cpabort(
"CP2K compiled without the Torch library.")
786 mark_used(requires_grad)
788 END SUBROUTINE torch_tensor_from_array_double_2d
795 SUBROUTINE torch_tensor_data_ptr_double_2d(tensor, data_ptr)
797 REAL(dp),
DIMENSION(:, :),
POINTER :: data_ptr
799#if defined(__LIBTORCH)
800 INTEGER(kind=int_8),
DIMENSION(2) :: sizes_f, sizes_c
801 TYPE(c_ptr) :: data_ptr_c
804 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
805 BIND(C, name="torch_c_tensor_data_ptr_double")
806 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
807 TYPE(c_ptr),
VALUE :: tensor
808 INTEGER(kind=C_INT),
VALUE :: ndims
809 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
810 TYPE(c_ptr) :: data_ptr
811 END SUBROUTINE torch_c_tensor_data_ptr_double
815 data_ptr_c = c_null_ptr
816 cpassert(c_associated(tensor%c_ptr))
817 cpassert(.NOT.
ASSOCIATED(data_ptr))
818 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
823 cpassert(all(sizes_c >= 0))
824 cpassert(c_associated(data_ptr_c))
826 sizes_f(1) = sizes_c(2)
827 sizes_f(2) = sizes_c(1)
828 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
830 cpabort(
"CP2K compiled without the Torch library.")
834 END SUBROUTINE torch_tensor_data_ptr_double_2d
842 SUBROUTINE torch_tensor_from_array_int32_3d(tensor, source, requires_grad)
844 INTEGER(kind=int_4),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
845 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
847#if defined(__LIBTORCH)
848 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
849 LOGICAL :: my_req_grad
852 SUBROUTINE torch_c_tensor_from_array_int32 (tensor, req_grad, ndims, sizes, source) &
853 BIND(C, name="torch_c_tensor_from_array_int32")
854 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
855 TYPE(c_ptr) :: tensor
856 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
857 INTEGER(kind=C_INT),
VALUE :: ndims
858 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
859 INTEGER(kind=C_INT32_T),
DIMENSION(*) :: source
860 END SUBROUTINE torch_c_tensor_from_array_int32
863 my_req_grad = .false.
864 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
866 sizes_c(1) =
SIZE(source, 3)
867 sizes_c(2) =
SIZE(source, 2)
868 sizes_c(3) =
SIZE(source, 1)
870 cpassert(.NOT. c_associated(tensor%c_ptr))
871 CALL torch_c_tensor_from_array_int32 (tensor=tensor%c_ptr, &
872 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
876 cpassert(c_associated(tensor%c_ptr))
878 cpabort(
"CP2K compiled without the Torch library.")
881 mark_used(requires_grad)
883 END SUBROUTINE torch_tensor_from_array_int32_3d
890 SUBROUTINE torch_tensor_data_ptr_int32_3d(tensor, data_ptr)
892 INTEGER(kind=int_4),
DIMENSION(:, :, :),
POINTER :: data_ptr
894#if defined(__LIBTORCH)
895 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
896 TYPE(c_ptr) :: data_ptr_c
899 SUBROUTINE torch_c_tensor_data_ptr_int32 (tensor, ndims, sizes, data_ptr) &
900 BIND(C, name="torch_c_tensor_data_ptr_int32")
901 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
902 TYPE(c_ptr),
VALUE :: tensor
903 INTEGER(kind=C_INT),
VALUE :: ndims
904 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
905 TYPE(c_ptr) :: data_ptr
906 END SUBROUTINE torch_c_tensor_data_ptr_int32
910 data_ptr_c = c_null_ptr
911 cpassert(c_associated(tensor%c_ptr))
912 cpassert(.NOT.
ASSOCIATED(data_ptr))
913 CALL torch_c_tensor_data_ptr_int32 (tensor=tensor%c_ptr, &
918 cpassert(all(sizes_c >= 0))
919 cpassert(c_associated(data_ptr_c))
921 sizes_f(1) = sizes_c(3)
922 sizes_f(2) = sizes_c(2)
923 sizes_f(3) = sizes_c(1)
924 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
926 cpabort(
"CP2K compiled without the Torch library.")
930 END SUBROUTINE torch_tensor_data_ptr_int32_3d
938 SUBROUTINE torch_tensor_from_array_float_3d(tensor, source, requires_grad)
940 REAL(sp),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
941 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
943#if defined(__LIBTORCH)
944 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
945 LOGICAL :: my_req_grad
948 SUBROUTINE torch_c_tensor_from_array_float (tensor, req_grad, ndims, sizes, source) &
949 BIND(C, name="torch_c_tensor_from_array_float")
950 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
951 TYPE(c_ptr) :: tensor
952 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
953 INTEGER(kind=C_INT),
VALUE :: ndims
954 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
955 REAL(kind=c_float),
DIMENSION(*) :: source
956 END SUBROUTINE torch_c_tensor_from_array_float
959 my_req_grad = .false.
960 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
962 sizes_c(1) =
SIZE(source, 3)
963 sizes_c(2) =
SIZE(source, 2)
964 sizes_c(3) =
SIZE(source, 1)
966 cpassert(.NOT. c_associated(tensor%c_ptr))
967 CALL torch_c_tensor_from_array_float (tensor=tensor%c_ptr, &
968 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
972 cpassert(c_associated(tensor%c_ptr))
974 cpabort(
"CP2K compiled without the Torch library.")
977 mark_used(requires_grad)
979 END SUBROUTINE torch_tensor_from_array_float_3d
986 SUBROUTINE torch_tensor_data_ptr_float_3d(tensor, data_ptr)
988 REAL(sp),
DIMENSION(:, :, :),
POINTER :: data_ptr
990#if defined(__LIBTORCH)
991 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
992 TYPE(c_ptr) :: data_ptr_c
995 SUBROUTINE torch_c_tensor_data_ptr_float (tensor, ndims, sizes, data_ptr) &
996 BIND(C, name="torch_c_tensor_data_ptr_float")
997 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
998 TYPE(c_ptr),
VALUE :: tensor
999 INTEGER(kind=C_INT),
VALUE :: ndims
1000 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
1001 TYPE(c_ptr) :: data_ptr
1002 END SUBROUTINE torch_c_tensor_data_ptr_float
1006 data_ptr_c = c_null_ptr
1007 cpassert(c_associated(tensor%c_ptr))
1008 cpassert(.NOT.
ASSOCIATED(data_ptr))
1009 CALL torch_c_tensor_data_ptr_float (tensor=tensor%c_ptr, &
1012 data_ptr=data_ptr_c)
1014 cpassert(all(sizes_c >= 0))
1015 cpassert(c_associated(data_ptr_c))
1017 sizes_f(1) = sizes_c(3)
1018 sizes_f(2) = sizes_c(2)
1019 sizes_f(3) = sizes_c(1)
1020 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
1022 cpabort(
"CP2K compiled without the Torch library.")
1026 END SUBROUTINE torch_tensor_data_ptr_float_3d
1034 SUBROUTINE torch_tensor_from_array_int64_3d(tensor, source, requires_grad)
1036 INTEGER(kind=int_8),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
1037 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
1039#if defined(__LIBTORCH)
1040 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
1041 LOGICAL :: my_req_grad
1044 SUBROUTINE torch_c_tensor_from_array_int64 (tensor, req_grad, ndims, sizes, source) &
1045 BIND(C, name="torch_c_tensor_from_array_int64")
1046 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
1047 TYPE(c_ptr) :: tensor
1048 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
1049 INTEGER(kind=C_INT),
VALUE :: ndims
1050 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
1051 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: source
1052 END SUBROUTINE torch_c_tensor_from_array_int64
1055 my_req_grad = .false.
1056 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
1058 sizes_c(1) =
SIZE(source, 3)
1059 sizes_c(2) =
SIZE(source, 2)
1060 sizes_c(3) =
SIZE(source, 1)
1062 cpassert(.NOT. c_associated(tensor%c_ptr))
1063 CALL torch_c_tensor_from_array_int64 (tensor=tensor%c_ptr, &
1064 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
1068 cpassert(c_associated(tensor%c_ptr))
1070 cpabort(
"CP2K compiled without the Torch library.")
1073 mark_used(requires_grad)
1075 END SUBROUTINE torch_tensor_from_array_int64_3d
1082 SUBROUTINE torch_tensor_data_ptr_int64_3d(tensor, data_ptr)
1084 INTEGER(kind=int_8),
DIMENSION(:, :, :),
POINTER :: data_ptr
1086#if defined(__LIBTORCH)
1087 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
1088 TYPE(c_ptr) :: data_ptr_c
1091 SUBROUTINE torch_c_tensor_data_ptr_int64 (tensor, ndims, sizes, data_ptr) &
1092 BIND(C, name="torch_c_tensor_data_ptr_int64")
1093 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
1094 TYPE(c_ptr),
VALUE :: tensor
1095 INTEGER(kind=C_INT),
VALUE :: ndims
1096 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
1097 TYPE(c_ptr) :: data_ptr
1098 END SUBROUTINE torch_c_tensor_data_ptr_int64
1102 data_ptr_c = c_null_ptr
1103 cpassert(c_associated(tensor%c_ptr))
1104 cpassert(.NOT.
ASSOCIATED(data_ptr))
1105 CALL torch_c_tensor_data_ptr_int64 (tensor=tensor%c_ptr, &
1108 data_ptr=data_ptr_c)
1110 cpassert(all(sizes_c >= 0))
1111 cpassert(c_associated(data_ptr_c))
1113 sizes_f(1) = sizes_c(3)
1114 sizes_f(2) = sizes_c(2)
1115 sizes_f(3) = sizes_c(1)
1116 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
1118 cpabort(
"CP2K compiled without the Torch library.")
1122 END SUBROUTINE torch_tensor_data_ptr_int64_3d
1130 SUBROUTINE torch_tensor_from_array_double_3d(tensor, source, requires_grad)
1132 REAL(dp),
DIMENSION(:, :, :),
ALLOCATABLE,
INTENT(IN) :: source
1133 LOGICAL,
OPTIONAL,
INTENT(IN) :: requires_grad
1135#if defined(__LIBTORCH)
1136 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_c
1137 LOGICAL :: my_req_grad
1140 SUBROUTINE torch_c_tensor_from_array_double (tensor, req_grad, ndims, sizes, source) &
1141 BIND(C, name="torch_c_tensor_from_array_double")
1142 IMPORT :: c_ptr, c_int, c_int32_t, c_int64_t, c_float, c_double, c_bool
1143 TYPE(c_ptr) :: tensor
1144 LOGICAL(kind=C_BOOL),
VALUE :: req_grad
1145 INTEGER(kind=C_INT),
VALUE :: ndims
1146 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
1147 REAL(kind=c_double),
DIMENSION(*) :: source
1148 END SUBROUTINE torch_c_tensor_from_array_double
1151 my_req_grad = .false.
1152 IF (
PRESENT(requires_grad)) my_req_grad = requires_grad
1154 sizes_c(1) =
SIZE(source, 3)
1155 sizes_c(2) =
SIZE(source, 2)
1156 sizes_c(3) =
SIZE(source, 1)
1158 cpassert(.NOT. c_associated(tensor%c_ptr))
1159 CALL torch_c_tensor_from_array_double (tensor=tensor%c_ptr, &
1160 req_grad=
LOGICAL(my_req_grad, C_BOOL), &
1164 cpassert(c_associated(tensor%c_ptr))
1166 cpabort(
"CP2K compiled without the Torch library.")
1169 mark_used(requires_grad)
1171 END SUBROUTINE torch_tensor_from_array_double_3d
1178 SUBROUTINE torch_tensor_data_ptr_double_3d(tensor, data_ptr)
1180 REAL(dp),
DIMENSION(:, :, :),
POINTER :: data_ptr
1182#if defined(__LIBTORCH)
1183 INTEGER(kind=int_8),
DIMENSION(3) :: sizes_f, sizes_c
1184 TYPE(c_ptr) :: data_ptr_c
1187 SUBROUTINE torch_c_tensor_data_ptr_double (tensor, ndims, sizes, data_ptr) &
1188 BIND(C, name="torch_c_tensor_data_ptr_double")
1189 IMPORT :: c_char, c_ptr, c_int, c_int32_t, c_int64_t
1190 TYPE(c_ptr),
VALUE :: tensor
1191 INTEGER(kind=C_INT),
VALUE :: ndims
1192 INTEGER(kind=C_INT64_T),
DIMENSION(*) :: sizes
1193 TYPE(c_ptr) :: data_ptr
1194 END SUBROUTINE torch_c_tensor_data_ptr_double
1198 data_ptr_c = c_null_ptr
1199 cpassert(c_associated(tensor%c_ptr))
1200 cpassert(.NOT.
ASSOCIATED(data_ptr))
1201 CALL torch_c_tensor_data_ptr_double (tensor=tensor%c_ptr, &
1204 data_ptr=data_ptr_c)
1206 cpassert(all(sizes_c >= 0))
1207 cpassert(c_associated(data_ptr_c))
1209 sizes_f(1) = sizes_c(3)
1210 sizes_f(2) = sizes_c(2)
1211 sizes_f(3) = sizes_c(1)
1212 CALL c_f_pointer(data_ptr_c, data_ptr, shape=sizes_f)
1214 cpabort(
"CP2K compiled without the Torch library.")
1218 END SUBROUTINE torch_tensor_data_ptr_double_3d
1229#if defined(__LIBTORCH)
1230 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_tensor_backward'
1234 SUBROUTINE torch_c_tensor_backward(tensor, outer_grad) &
1235 BIND(C, name="torch_c_tensor_backward")
1236 IMPORT :: c_char, c_ptr
1237 TYPE(c_ptr),
VALUE ::
tensor
1238 TYPE(c_ptr),
VALUE :: outer_grad
1239 END SUBROUTINE torch_c_tensor_backward
1242 CALL timeset(routinen, handle)
1243 cpassert(c_associated(
tensor%c_ptr))
1244 cpassert(c_associated(outer_grad%c_ptr))
1245 CALL torch_c_tensor_backward(
tensor=
tensor%c_ptr, outer_grad=outer_grad%c_ptr)
1246 CALL timestop(handle)
1248 cpabort(
"CP2K compiled without the Torch library.")
1250 mark_used(outer_grad)
1262#if defined(__LIBTORCH)
1264 SUBROUTINE torch_c_tensor_grad(tensor, grad) &
1265 BIND(C, name="torch_c_tensor_grad")
1267 TYPE(c_ptr),
VALUE ::
tensor
1269 END SUBROUTINE torch_c_tensor_grad
1272 cpassert(c_associated(
tensor%c_ptr))
1273 cpassert(.NOT. c_associated(grad%c_ptr))
1274 CALL torch_c_tensor_grad(
tensor=
tensor%c_ptr, grad=grad%c_ptr)
1275 cpassert(c_associated(grad%c_ptr))
1277 cpabort(
"CP2K compiled without the Torch library.")
1290#if defined(__LIBTORCH)
1292 SUBROUTINE torch_c_tensor_release(tensor)
BIND(C, name="torch_c_tensor_release")
1294 TYPE(c_ptr),
VALUE ::
tensor
1295 END SUBROUTINE torch_c_tensor_release
1298 cpassert(c_associated(
tensor%c_ptr))
1300 tensor%c_ptr = c_null_ptr
1302 cpabort(
"CP2K was compiled without Torch library.")
1314#if defined(__LIBTORCH)
1316 SUBROUTINE torch_c_dict_create(dict)
BIND(C, name="torch_c_dict_create")
1319 END SUBROUTINE torch_c_dict_create
1322 cpassert(.NOT. c_associated(dict%c_ptr))
1323 CALL torch_c_dict_create(dict=dict%c_ptr)
1324 cpassert(c_associated(dict%c_ptr))
1326 cpabort(
"CP2K was compiled without Torch library.")
1337 CHARACTER(len=*),
INTENT(IN) :: key
1340#if defined(__LIBTORCH)
1343 SUBROUTINE torch_c_dict_insert(dict, key, tensor) &
1344 BIND(C, name="torch_c_dict_insert")
1345 IMPORT :: c_char, c_ptr
1346 TYPE(c_ptr),
VALUE :: dict
1347 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1348 TYPE(c_ptr),
VALUE ::
tensor
1349 END SUBROUTINE torch_c_dict_insert
1352 cpassert(c_associated(dict%c_ptr))
1353 cpassert(c_associated(
tensor%c_ptr))
1354 CALL torch_c_dict_insert(dict=dict%c_ptr, key=trim(key)//c_null_char,
tensor=
tensor%c_ptr)
1356 cpabort(
"CP2K compiled without the Torch library.")
1369 CHARACTER(len=*),
INTENT(IN) :: key
1372#if defined(__LIBTORCH)
1375 SUBROUTINE torch_c_dict_get(dict, key, tensor) &
1376 BIND(C, name="torch_c_dict_get")
1377 IMPORT :: c_char, c_ptr
1378 TYPE(c_ptr),
VALUE :: dict
1379 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1381 END SUBROUTINE torch_c_dict_get
1384 cpassert(c_associated(dict%c_ptr))
1385 cpassert(.NOT. c_associated(
tensor%c_ptr))
1386 CALL torch_c_dict_get(dict=dict%c_ptr, key=trim(key)//c_null_char,
tensor=
tensor%c_ptr)
1387 cpassert(c_associated(
tensor%c_ptr))
1390 cpabort(
"CP2K compiled without the Torch library.")
1404#if defined(__LIBTORCH)
1406 SUBROUTINE torch_c_dict_release(dict)
BIND(C, name="torch_c_dict_release")
1408 TYPE(c_ptr),
VALUE :: dict
1409 END SUBROUTINE torch_c_dict_release
1412 cpassert(c_associated(dict%c_ptr))
1413 CALL torch_c_dict_release(dict=dict%c_ptr)
1414 dict%c_ptr = c_null_ptr
1416 cpabort(
"CP2K was compiled without Torch library.")
1427 CHARACTER(len=*),
INTENT(IN) :: filename
1429#if defined(__LIBTORCH)
1430 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_load'
1434 SUBROUTINE torch_c_model_load(model, filename)
BIND(C, name="torch_c_model_load")
1435 IMPORT :: c_ptr, c_char
1436 TYPE(c_ptr) :: model
1437 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: filename
1438 END SUBROUTINE torch_c_model_load
1441 CALL timeset(routinen, handle)
1442 cpassert(.NOT. c_associated(model%c_ptr))
1443 CALL torch_c_model_load(model=model%c_ptr, filename=trim(filename)//c_null_char)
1444 cpassert(c_associated(model%c_ptr))
1445 CALL timestop(handle)
1447 cpabort(
"CP2K was compiled without Torch library.")
1462#if defined(__LIBTORCH)
1463 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_forward'
1467 SUBROUTINE torch_c_model_forward(model, inputs, outputs)
BIND(C, name="torch_c_model_forward")
1469 TYPE(c_ptr),
VALUE :: model
1470 TYPE(c_ptr),
VALUE :: inputs
1471 TYPE(c_ptr),
VALUE :: outputs
1472 END SUBROUTINE torch_c_model_forward
1475 CALL timeset(routinen, handle)
1476 cpassert(c_associated(model%c_ptr))
1477 cpassert(c_associated(inputs%c_ptr))
1478 cpassert(c_associated(outputs%c_ptr))
1479 CALL torch_c_model_forward(model=model%c_ptr, inputs=inputs%c_ptr, outputs=outputs%c_ptr)
1480 CALL timestop(handle)
1482 cpabort(
"CP2K was compiled without Torch library.")
1496#if defined(__LIBTORCH)
1498 SUBROUTINE torch_c_model_release(model)
BIND(C, name="torch_c_model_release")
1500 TYPE(c_ptr),
VALUE :: model
1501 END SUBROUTINE torch_c_model_release
1504 cpassert(c_associated(model%c_ptr))
1505 CALL torch_c_model_release(model=model%c_ptr)
1506 model%c_ptr = c_null_ptr
1508 cpabort(
"CP2K was compiled without Torch library.")
1518 CHARACTER(len=*),
INTENT(IN) :: filename, key
1519 CHARACTER(:),
ALLOCATABLE :: res
1521#if defined(__LIBTORCH)
1522 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_read_metadata'
1525 CHARACTER(LEN=1, KIND=C_CHAR),
DIMENSION(:), &
1526 POINTER :: content_f
1529 TYPE(c_ptr) :: content_c
1532 SUBROUTINE torch_c_model_read_metadata(filename, key, content, length) &
1533 BIND(C, name="torch_c_model_read_metadata")
1534 IMPORT :: c_char, c_ptr, c_int
1535 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: filename, key
1536 TYPE(c_ptr) :: content
1537 INTEGER(kind=C_INT) :: length
1538 END SUBROUTINE torch_c_model_read_metadata
1541 CALL timeset(routinen, handle)
1542 content_c = c_null_ptr
1544 CALL torch_c_model_read_metadata(filename=trim(filename)//c_null_char, &
1545 key=trim(key)//c_null_char, &
1546 content=content_c, &
1548 cpassert(c_associated(content_c))
1549 cpassert(length >= 0)
1551 CALL c_f_pointer(content_c, content_f, shape=(/length + 1/))
1552 cpassert(content_f(length + 1) == c_null_char)
1554 ALLOCATE (
CHARACTER(LEN=length) :: res)
1556 cpassert(content_f(i) /= c_null_char)
1557 res(i:i) = content_f(i)
1560 DEALLOCATE (content_f)
1561 CALL timestop(handle)
1566 cpabort(
"CP2K was compiled without Torch library.")
1577#if defined(__LIBTORCH)
1579 FUNCTION torch_c_cuda_is_available()
BIND(C, name="torch_c_cuda_is_available")
1581 LOGICAL(C_BOOL) :: torch_c_cuda_is_available
1582 END FUNCTION torch_c_cuda_is_available
1585 res = torch_c_cuda_is_available()
1587 cpabort(
"CP2K was compiled without Torch library.")
1599 LOGICAL,
INTENT(IN) :: allow_tf32
1601#if defined(__LIBTORCH)
1603 SUBROUTINE torch_c_allow_tf32(allow_tf32)
BIND(C, name="torch_c_allow_tf32")
1605 LOGICAL(C_BOOL),
VALUE :: allow_tf32
1606 END SUBROUTINE torch_c_allow_tf32
1609 CALL torch_c_allow_tf32(allow_tf32=
LOGICAL(allow_tf32, c_bool))
1611 cpabort(
"CP2K was compiled without Torch library.")
1612 mark_used(allow_tf32)
1624#if defined(__LIBTORCH)
1625 CHARACTER(len=*),
PARAMETER :: routinen =
'torch_model_freeze'
1629 SUBROUTINE torch_c_model_freeze(model)
BIND(C, name="torch_c_model_freeze")
1631 TYPE(c_ptr),
VALUE :: model
1632 END SUBROUTINE torch_c_model_freeze
1635 CALL timeset(routinen, handle)
1636 cpassert(c_associated(model%c_ptr))
1637 CALL torch_c_model_freeze(model=model%c_ptr)
1638 CALL timestop(handle)
1640 cpabort(
"CP2K was compiled without Torch library.")
1650 SUBROUTINE torch_model_get_attr_int64 (model, key, dest)
1652 CHARACTER(len=*),
INTENT(IN) :: key
1653 INTEGER(kind=int_8),
INTENT(OUT) :: dest
1655#if defined(__LIBTORCH)
1658 SUBROUTINE torch_c_model_get_attr_int64 (model, key, dest) &
1659 BIND(C, name="torch_c_model_get_attr_int64")
1660 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1661 TYPE(c_ptr),
VALUE :: model
1662 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1663 INTEGER(kind=C_INT64_T) :: dest
1664 END SUBROUTINE torch_c_model_get_attr_int64
1667 CALL torch_c_model_get_attr_int64 (model=model%c_ptr, &
1668 key=trim(key)//c_null_char, &
1674 cpabort(
"CP2K compiled without the Torch library.")
1676 END SUBROUTINE torch_model_get_attr_int64
1681 SUBROUTINE torch_model_get_attr_double (model, key, dest)
1683 CHARACTER(len=*),
INTENT(IN) :: key
1684 REAL(dp),
INTENT(OUT) :: dest
1686#if defined(__LIBTORCH)
1689 SUBROUTINE torch_c_model_get_attr_double (model, key, dest) &
1690 BIND(C, name="torch_c_model_get_attr_double")
1691 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1692 TYPE(c_ptr),
VALUE :: model
1693 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1694 REAL(kind=c_double) :: dest
1695 END SUBROUTINE torch_c_model_get_attr_double
1698 CALL torch_c_model_get_attr_double (model=model%c_ptr, &
1699 key=trim(key)//c_null_char, &
1705 cpabort(
"CP2K compiled without the Torch library.")
1707 END SUBROUTINE torch_model_get_attr_double
1712 SUBROUTINE torch_model_get_attr_string (model, key, dest)
1714 CHARACTER(len=*),
INTENT(IN) :: key
1715 CHARACTER(LEN=default_string_length),
INTENT(OUT) :: dest
1717#if defined(__LIBTORCH)
1720 SUBROUTINE torch_c_model_get_attr_string (model, key, dest) &
1721 BIND(C, name="torch_c_model_get_attr_string")
1722 IMPORT :: c_ptr, c_char, c_int64_t, c_double
1723 TYPE(c_ptr),
VALUE :: model
1724 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1725 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: dest
1726 END SUBROUTINE torch_c_model_get_attr_string
1729 CALL torch_c_model_get_attr_string (model=model%c_ptr, &
1730 key=trim(key)//c_null_char, &
1736 cpabort(
"CP2K compiled without the Torch library.")
1738 END SUBROUTINE torch_model_get_attr_string
1744 SUBROUTINE torch_model_get_attr_int32(model, key, dest)
1746 CHARACTER(len=*),
INTENT(IN) :: key
1747 INTEGER,
INTENT(OUT) :: dest
1749 INTEGER(kind=int_8) :: temp
1750 CALL torch_model_get_attr_int64(model, key, temp)
1751 cpassert(abs(temp) < huge(dest))
1753 END SUBROUTINE torch_model_get_attr_int32
1759 SUBROUTINE torch_model_get_attr_strlist(model, key, dest)
1761 CHARACTER(len=*),
INTENT(IN) :: key
1762 CHARACTER(LEN=default_string_length), &
1763 ALLOCATABLE,
DIMENSION(:) :: dest
1765#if defined(__LIBTORCH)
1767 INTEGER :: num_items, i
1770 SUBROUTINE torch_c_model_get_attr_list_size(model, key, size) &
1771 BIND(C, name="torch_c_model_get_attr_list_size")
1772 IMPORT :: c_ptr, c_char, c_int
1773 TYPE(c_ptr),
VALUE :: model
1774 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1775 INTEGER(kind=C_INT) :: size
1776 END SUBROUTINE torch_c_model_get_attr_list_size
1780 SUBROUTINE torch_c_model_get_attr_strlist(model, key, index, dest) &
1781 BIND(C, name="torch_c_model_get_attr_strlist")
1782 IMPORT :: c_ptr, c_char, c_int
1783 TYPE(c_ptr),
VALUE :: model
1784 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: key
1785 INTEGER(kind=C_INT),
VALUE :: index
1786 CHARACTER(kind=C_CHAR),
DIMENSION(*) :: dest
1787 END SUBROUTINE torch_c_model_get_attr_strlist
1790 CALL torch_c_model_get_attr_list_size(model=model%c_ptr, &
1791 key=trim(key)//c_null_char, &
1793 ALLOCATE (dest(num_items))
1797 CALL torch_c_model_get_attr_strlist(model=model%c_ptr, &
1798 key=trim(key)//c_null_char, &
1804 cpabort(
"CP2K compiled without the Torch library.")
1810 END SUBROUTINE torch_model_get_attr_strlist
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public sp
integer, parameter, public int_4
subroutine, public torch_dict_release(dict)
Releases a Torch dictionary and all its ressources.
subroutine, public torch_tensor_backward(tensor, outer_grad)
Runs autograd on a Torch tensor.
subroutine, public torch_dict_get(dict, key, tensor)
Retrieves a Torch tensor from a Torch dictionary.
subroutine, public torch_model_load(model, filename)
Loads a Torch model from given "*.pth" file. (In Torch lingo models are called modules)
subroutine, public torch_dict_create(dict)
Creates an empty Torch dictionary.
subroutine, public torch_model_release(model)
Releases a Torch model and all its ressources.
subroutine, public torch_tensor_grad(tensor, grad)
Returns the gradient of a Torch tensor which was computed by autograd.
subroutine, public torch_allow_tf32(allow_tf32)
Set whether to allow the use of TF32. Needed due to changes in defaults from pytorch 1....
subroutine, public torch_model_freeze(model)
Freeze the given Torch model: applies generic optimization that speed up model. See https://pytorch....
character(:) function, allocatable, public torch_model_read_metadata(filename, key)
Reads metadata entry from given "*.pth" file. (In Torch lingo they are called extra files)
subroutine, public torch_dict_insert(dict, key, tensor)
Inserts a Torch tensor into a Torch dictionary.
logical function, public torch_cuda_is_available()
Returns true iff the Torch CUDA backend is available.
subroutine, public torch_tensor_release(tensor)
Releases a Torch tensor and all its ressources.
subroutine, public torch_model_forward(model, inputs, outputs)
Evaluates the given Torch model.