29#include "../base/base_uses.f90"
34 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
35 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'input_val_types'
64 INTEGER :: ref_count = 0, type_of_var =
no_t
65 LOGICAL,
DIMENSION(:),
POINTER :: l_val => null()
66 INTEGER,
DIMENSION(:),
POINTER :: i_val => null()
67 CHARACTER(len=default_string_length),
DIMENSION(:),
POINTER :: &
67 CHARACTER(len=default_string_length),
DIMENSION(:),
POINTER :: &
…
69 REAL(kind=
dp),
DIMENSION(:),
POINTER :: r_val => null()
100 SUBROUTINE val_create(val, l_val, l_vals, l_vals_ptr, i_val, i_vals, i_vals_ptr, &
101 r_val, r_vals, r_vals_ptr, c_val, c_vals, c_vals_ptr, lc_val, lc_vals, &
105 LOGICAL,
INTENT(in),
OPTIONAL :: l_val
106 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: l_vals
107 LOGICAL,
DIMENSION(:),
OPTIONAL,
POINTER :: l_vals_ptr
108 INTEGER,
INTENT(in),
OPTIONAL :: i_val
109 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: i_vals
110 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: i_vals_ptr
111 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: r_val
112 REAL(kind=
dp),
DIMENSION(:),
INTENT(in),
OPTIONAL :: r_vals
113 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: r_vals_ptr
114 CHARACTER(LEN=*),
INTENT(in),
OPTIONAL :: c_val
115 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in), &
117 CHARACTER(LEN=default_string_length), &
118 DIMENSION(:),
OPTIONAL,
POINTER :: c_vals_ptr
119 CHARACTER(LEN=*),
INTENT(in),
OPTIONAL :: lc_val
120 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in), &
122 CHARACTER(LEN=default_string_length), &
123 DIMENSION(:),
OPTIONAL,
POINTER :: lc_vals_ptr
126 INTEGER :: i, len_c, narg, nval
128 cpassert(.NOT.
ASSOCIATED(val))
130 NULLIFY (val%l_val, val%i_val, val%r_val, val%c_val, val%enum)
131 val%type_of_var =
no_t
135 val%type_of_var =
no_t
136 IF (
PRESENT(l_val))
THEN
138 ALLOCATE (val%l_val(1))
142 IF (
PRESENT(l_vals))
THEN
144 ALLOCATE (val%l_val(
SIZE(l_vals)))
148 IF (
PRESENT(l_vals_ptr))
THEN
150 val%l_val => l_vals_ptr
154 IF (
PRESENT(r_val))
THEN
156 ALLOCATE (val%r_val(1))
160 IF (
PRESENT(r_vals))
THEN
162 ALLOCATE (val%r_val(
SIZE(r_vals)))
166 IF (
PRESENT(r_vals_ptr))
THEN
168 val%r_val => r_vals_ptr
172 IF (
PRESENT(i_val))
THEN
174 ALLOCATE (val%i_val(1))
178 IF (
PRESENT(i_vals))
THEN
180 ALLOCATE (val%i_val(
SIZE(i_vals)))
184 IF (
PRESENT(i_vals_ptr))
THEN
186 val%i_val => i_vals_ptr
190 IF (
PRESENT(c_val))
THEN
193 ALLOCATE (val%c_val(1))
197 IF (
PRESENT(c_vals))
THEN
200 ALLOCATE (val%c_val(
SIZE(c_vals)))
204 IF (
PRESENT(c_vals_ptr))
THEN
206 val%c_val => c_vals_ptr
209 IF (
PRESENT(lc_val))
THEN
211 len_c = len_trim(lc_val)
212 nval = max(1, ceiling(real(len_c,
dp)/80._dp))
213 ALLOCATE (val%c_val(nval))
225 IF (
PRESENT(lc_vals))
THEN
228 ALLOCATE (val%c_val(
SIZE(lc_vals)))
232 IF (
PRESENT(lc_vals_ptr))
THEN
234 val%c_val => lc_vals_ptr
238 IF (
PRESENT(enum))
THEN
239 IF (
ASSOCIATED(enum))
THEN
240 IF (val%type_of_var /=
no_t .AND. val%type_of_var /=
integer_t .AND. &
241 val%type_of_var /=
enum_t)
THEN
244 IF (
ASSOCIATED(val%i_val))
THEN
252 cpassert(
ASSOCIATED(val%enum) .EQV. val%type_of_var ==
enum_t)
100 SUBROUTINE val_create(val, l_val, l_vals, l_vals_ptr, i_val, i_vals, i_vals_ptr, &
…
265 IF (
ASSOCIATED(val))
THEN
266 cpassert(val%ref_count > 0)
267 val%ref_count = val%ref_count - 1
268 IF (val%ref_count == 0)
THEN
269 IF (
ASSOCIATED(val%l_val))
THEN
270 DEALLOCATE (val%l_val)
272 IF (
ASSOCIATED(val%i_val))
THEN
273 DEALLOCATE (val%i_val)
275 IF (
ASSOCIATED(val%r_val))
THEN
276 DEALLOCATE (val%r_val)
278 IF (
ASSOCIATED(val%c_val))
THEN
279 DEALLOCATE (val%c_val)
282 val%type_of_var =
no_t
300 cpassert(
ASSOCIATED(val))
301 cpassert(val%ref_count > 0)
302 val%ref_count = val%ref_count + 1
332 SUBROUTINE val_get(val, has_l, has_i, has_r, has_lc, has_c, l_val, l_vals, i_val, &
333 i_vals, r_val, r_vals, c_val, c_vals, len_c, type_of_var, enum)
336 LOGICAL,
INTENT(out),
OPTIONAL :: has_l, has_i, has_r, has_lc, has_c, l_val
337 LOGICAL,
DIMENSION(:),
OPTIONAL,
POINTER :: l_vals
338 INTEGER,
INTENT(out),
OPTIONAL :: i_val
339 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: i_vals
340 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: r_val
341 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: r_vals
342 CHARACTER(LEN=*),
INTENT(out),
OPTIONAL :: c_val
343 CHARACTER(LEN=default_string_length), &
344 DIMENSION(:),
OPTIONAL,
POINTER :: c_vals
345 INTEGER,
INTENT(out),
OPTIONAL :: len_c, type_of_var
348 INTEGER :: i, l_in, l_out
350 IF (
PRESENT(has_l)) has_l =
ASSOCIATED(val%l_val)
351 IF (
PRESENT(has_i)) has_i =
ASSOCIATED(val%i_val)
352 IF (
PRESENT(has_r)) has_r =
ASSOCIATED(val%r_val)
353 IF (
PRESENT(has_c)) has_c =
ASSOCIATED(val%c_val)
354 IF (
PRESENT(has_lc)) has_lc = (val%type_of_var ==
lchar_t)
355 IF (
PRESENT(l_vals)) l_vals => val%l_val
356 IF (
PRESENT(l_val))
THEN
357 IF (
ASSOCIATED(val%l_val))
THEN
358 IF (
SIZE(val%l_val) > 0)
THEN
368 IF (
PRESENT(i_vals)) i_vals => val%i_val
369 IF (
PRESENT(i_val))
THEN
370 IF (
ASSOCIATED(val%i_val))
THEN
371 IF (
SIZE(val%i_val) > 0)
THEN
381 IF (
PRESENT(r_vals)) r_vals => val%r_val
382 IF (
PRESENT(r_val))
THEN
383 IF (
ASSOCIATED(val%r_val))
THEN
384 IF (
SIZE(val%r_val) > 0)
THEN
394 IF (
PRESENT(c_vals)) c_vals => val%c_val
395 IF (
PRESENT(c_val))
THEN
397 IF (
ASSOCIATED(val%c_val))
THEN
398 IF (
SIZE(val%c_val) > 0)
THEN
399 IF (val%type_of_var ==
lchar_t)
THEN
401 len_trim(val%c_val(
SIZE(val%c_val)))
403 CALL cp_warn(__location__, &
404 "val_get will truncate value, value beginning with '"// &
405 trim(val%c_val(1))//
"' is too long for variable")
406 DO i = 1,
SIZE(val%c_val)
414 l_in = len_trim(val%c_val(1))
416 CALL cp_warn(__location__, &
417 "val_get will truncate value, value '"// &
418 trim(val%c_val(1))//
"' is too long for variable")
424 ELSE IF (
ASSOCIATED(val%i_val) .AND.
ASSOCIATED(val%enum))
THEN
425 IF (
SIZE(val%i_val) > 0)
THEN
426 c_val =
enum_i2c(val%enum, val%i_val(1))
435 IF (
PRESENT(len_c))
THEN
436 IF (
ASSOCIATED(val%c_val))
THEN
437 IF (
SIZE(val%c_val) > 0)
THEN
438 IF (val%type_of_var ==
lchar_t)
THEN
440 len_trim(val%c_val(
SIZE(val%c_val)))
442 len_c = len_trim(val%c_val(1))
447 ELSE IF (
ASSOCIATED(val%i_val) .AND.
ASSOCIATED(val%enum))
THEN
448 IF (
SIZE(val%i_val) > 0)
THEN
449 len_c = len_trim(
enum_i2c(val%enum, val%i_val(1)))
458 IF (
PRESENT(type_of_var)) type_of_var = val%type_of_var
460 IF (
PRESENT(enum))
enum => val%enum
332 SUBROUTINE val_get(val, has_l, has_i, has_r, has_lc, has_c, l_val, l_vals, i_val, &
…
479 INTEGER,
INTENT(in) :: unit_nr
481 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: unit_str, fmt
483 CHARACTER(len=default_string_length) :: c_string, myfmt, rcval
484 INTEGER :: i, iend, item, j, l
492 IF (
PRESENT(fmt)) myfmt = fmt
493 IF (
PRESENT(unit)) my_unit => unit
494 IF (.NOT.
ASSOCIATED(my_unit) .AND.
PRESENT(unit_str))
THEN
500 IF (
ASSOCIATED(val))
THEN
501 SELECT CASE (val%type_of_var)
503 IF (
ASSOCIATED(val%l_val))
THEN
504 DO i = 1,
SIZE(val%l_val)
505 IF (
modulo(i, 20) == 0)
THEN
507 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
509 WRITE (unit=unit_nr, fmt=
"(1X,L1)", advance=
"NO") &
513 cpabort(
"Input value of type <logical_t> not associated")
516 IF (
ASSOCIATED(val%i_val))
THEN
519 loop_i:
DO WHILE (i <=
SIZE(val%i_val))
521 IF (
modulo(item, 10) == 0)
THEN
523 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
526 loop_j:
DO j = i + 1,
SIZE(val%i_val)
527 IF (val%i_val(j - 1) + 1 == val%i_val(j))
THEN
533 IF ((iend - i) > 1)
THEN
534 WRITE (unit=unit_nr, fmt=
"(1X,I0,A2,I0)", advance=
"NO") &
535 val%i_val(i),
"..", val%i_val(iend)
538 WRITE (unit=unit_nr, fmt=
"(1X,I0)", advance=
"NO") &
544 cpabort(
"Input value of type <integer_t> not associated")
547 IF (
ASSOCIATED(val%r_val))
THEN
548 DO i = 1,
SIZE(val%r_val)
549 IF (
modulo(i, 5) == 0)
THEN
551 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
553 IF (
ASSOCIATED(my_unit))
THEN
554 WRITE (unit=rcval, fmt=
"(ES25.16E3)") &
557 WRITE (unit=rcval, fmt=
"(ES25.16E3)") val%r_val(i)
559 WRITE (unit=unit_nr, fmt=
"(A)", advance=
"NO") trim(rcval)
562 cpabort(
"Input value of type <real_t> not associated")
565 IF (
ASSOCIATED(val%c_val))
THEN
567 DO i = 1,
SIZE(val%c_val)
569 IF (l > 10 .AND. l + len_trim(val%c_val(i)) > 76)
THEN
571 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
573 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
""""//trim(val%c_val(i))//
""""
574 l = l + len_trim(val%c_val(i)) + 3
575 ELSE IF (len_trim(val%c_val(i)) > 0)
THEN
576 l = l + len_trim(val%c_val(i))
577 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
""""//trim(val%c_val(i))//
""""
580 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
'""'
584 cpabort(
"Input value of type <char_t> not associated")
587 IF (
ASSOCIATED(val%c_val))
THEN
588 SELECT CASE (
SIZE(val%c_val))
590 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") trim(val%c_val(1))
592 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") val%c_val(1)
593 WRITE (unit=unit_nr, fmt=
'(A)', advance=
"NO") trim(val%c_val(2))
595 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") val%c_val(1)
596 DO i = 2,
SIZE(val%c_val) - 1
597 WRITE (unit=unit_nr, fmt=
"(A)", advance=
"NO") val%c_val(i)
599 WRITE (unit=unit_nr, fmt=
'(A)', advance=
"NO") trim(val%c_val(
SIZE(val%c_val)))
602 cpabort(
"Input value of type <lchar_t> not associated")
605 IF (
ASSOCIATED(val%i_val))
THEN
607 DO i = 1,
SIZE(val%i_val)
608 c_string =
enum_i2c(val%enum, val%i_val(i))
609 IF (l > 10 .AND. l + len_trim(c_string) > 76)
THEN
611 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
614 l = l + len_trim(c_string) + 3
616 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO") trim(c_string)
619 cpabort(
"Input value of type <enum_t> not associated")
622 WRITE (unit=unit_nr, fmt=
"(' *empty*')", advance=
"NO")
624 cpabort(
"Unexpected type_of_var for val")
627 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
"NULL()"
635 WRITE (unit=unit_nr, fmt=
"()")
653 CHARACTER(LEN=*),
INTENT(OUT) :: string
656 CHARACTER(LEN=default_string_length) :: enum_string
658 REAL(kind=
dp) ::
value
662 IF (
ASSOCIATED(val))
THEN
664 SELECT CASE (val%type_of_var)
666 IF (
ASSOCIATED(val%l_val))
THEN
667 DO i = 1,
SIZE(val%l_val)
668 WRITE (unit=string(2*i - 1:), fmt=
"(1X,L1)") val%l_val(i)
674 IF (
ASSOCIATED(val%i_val))
THEN
675 DO i = 1,
SIZE(val%i_val)
676 WRITE (unit=string(12*i - 11:), fmt=
"(I12)") val%i_val(i)
682 IF (
ASSOCIATED(val%r_val))
THEN
683 IF (
PRESENT(unit))
THEN
684 DO i = 1,
SIZE(val%r_val)
687 WRITE (unit=string(17*i - 16:), fmt=
"(ES17.8E3)")
value
690 DO i = 1,
SIZE(val%r_val)
691 WRITE (unit=string(17*i - 16:), fmt=
"(ES17.8E3)") val%r_val(i)
698 IF (
ASSOCIATED(val%c_val))
THEN
700 DO i = 1,
SIZE(val%c_val)
701 WRITE (unit=string(ipos:), fmt=
"(A)") trim(adjustl(val%c_val(i)))
702 ipos = ipos + len_trim(adjustl(val%c_val(i))) + 1
708 IF (
ASSOCIATED(val%c_val))
THEN
709 CALL val_get(val, c_val=string)
714 IF (
ASSOCIATED(val%i_val))
THEN
715 DO i = 1,
SIZE(val%i_val)
716 enum_string =
enum_i2c(val%enum, val%i_val(i))
717 WRITE (unit=string, fmt=
"(A)") trim(adjustl(enum_string))
723 cpabort(
"unexpected type_of_var for val ")
738 TYPE(
val_type),
POINTER :: val_in, val_out
740 cpassert(
ASSOCIATED(val_in))
741 cpassert(.NOT.
ASSOCIATED(val_out))
743 val_out%type_of_var = val_in%type_of_var
744 val_out%ref_count = 1
745 val_out%enum => val_in%enum
746 IF (
ASSOCIATED(val_out%enum))
CALL enum_retain(val_out%enum)
748 NULLIFY (val_out%l_val, val_out%i_val, val_out%c_val, val_out%r_val)
749 IF (
ASSOCIATED(val_in%l_val))
THEN
750 ALLOCATE (val_out%l_val(
SIZE(val_in%l_val)))
751 val_out%l_val = val_in%l_val
753 IF (
ASSOCIATED(val_in%i_val))
THEN
754 ALLOCATE (val_out%i_val(
SIZE(val_in%i_val)))
755 val_out%i_val = val_in%i_val
757 IF (
ASSOCIATED(val_in%r_val))
THEN
758 ALLOCATE (val_out%r_val(
SIZE(val_in%r_val)))
759 val_out%r_val = val_in%r_val
761 IF (
ASSOCIATED(val_in%c_val))
THEN
762 ALLOCATE (val_out%c_val(
SIZE(val_in%c_val)))
763 val_out%c_val = val_in%c_val
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Utility routines to read data from files. Kept as close as possible to the old parser because.
character(len=1), parameter, public default_continuation_character
character(len=cp_unit_desc_length) function, public cp_unit_desc(unit, defaults, accept_undefined)
returns the "name" of the given unit
real(kind=dp) function, public cp_unit_from_cp2k1(value, unit, defaults, power)
converts from the internal cp2k units to the given unit
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
subroutine, public cp_unit_create(unit, string)
creates a unit parsing a string
elemental subroutine, public cp_unit_release(unit)
releases the given unit
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length