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 :: &
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
242 cpabort(
"Type of variable is incompatible with enum")
244 IF (
ASSOCIATED(val%i_val))
THEN
252 cpassert(
ASSOCIATED(val%enum) .EQV. val%type_of_var ==
enum_t)
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
361 cpabort(
"Invalid size of logical value(s)")
364 cpabort(
"Logical value is unavailable")
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
374 cpabort(
"Invalid size of integer value(s)")
377 cpabort(
"Integer value is unavailable")
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
387 cpabort(
"Invalid size of real value(s)")
390 cpabort(
"Real value is unavailable")
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)))
402 IF (l_out < l_in)
THEN
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")
407 DO i = 1,
SIZE(val%c_val)
416 l_in = len_trim(val%c_val(1))
417 IF (l_out < l_in)
THEN
418 CALL cp_warn(__location__, &
419 "val_get will truncate value, value '"// &
420 trim(val%c_val(1))//
"' is too long for variable")
425 cpabort(
"Invalid size of character value(s)")
427 ELSE IF (
ASSOCIATED(val%i_val) .AND.
ASSOCIATED(val%enum))
THEN
428 IF (
SIZE(val%i_val) > 0)
THEN
429 c_val =
enum_i2c(val%enum, val%i_val(1))
431 cpabort(
"Invalid size of character value(s)")
434 cpabort(
"Character value is unavailable")
438 IF (
PRESENT(len_c))
THEN
439 IF (
ASSOCIATED(val%c_val))
THEN
440 IF (
SIZE(val%c_val) > 0)
THEN
441 IF (val%type_of_var ==
lchar_t)
THEN
443 len_trim(val%c_val(
SIZE(val%c_val)))
445 len_c = len_trim(val%c_val(1))
450 ELSE IF (
ASSOCIATED(val%i_val) .AND.
ASSOCIATED(val%enum))
THEN
451 IF (
SIZE(val%i_val) > 0)
THEN
452 len_c = len_trim(
enum_i2c(val%enum, val%i_val(1)))
461 IF (
PRESENT(type_of_var)) type_of_var = val%type_of_var
463 IF (
PRESENT(enum))
enum => val%enum
482 INTEGER,
INTENT(in) :: unit_nr
484 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: unit_str, fmt
486 CHARACTER(len=default_string_length) :: c_string, myfmt, rcval
487 INTEGER :: i, iend, item, j, l
495 IF (
PRESENT(fmt)) myfmt = fmt
496 IF (
PRESENT(unit)) my_unit => unit
497 IF (.NOT.
ASSOCIATED(my_unit) .AND.
PRESENT(unit_str))
THEN
503 IF (
ASSOCIATED(val))
THEN
504 SELECT CASE (val%type_of_var)
506 IF (
ASSOCIATED(val%l_val))
THEN
507 DO i = 1,
SIZE(val%l_val)
508 IF (
modulo(i, 20) == 0)
THEN
510 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
512 WRITE (unit=unit_nr, fmt=
"(1X,L1)", advance=
"NO") &
516 cpabort(
"Input value of type <logical_t> not associated")
519 IF (
ASSOCIATED(val%i_val))
THEN
522 loop_i:
DO WHILE (i <=
SIZE(val%i_val))
524 IF (
modulo(item, 10) == 0)
THEN
526 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
529 loop_j:
DO j = i + 1,
SIZE(val%i_val)
530 IF (val%i_val(j - 1) + 1 == val%i_val(j))
THEN
536 IF ((iend - i) > 1)
THEN
537 WRITE (unit=unit_nr, fmt=
"(1X,I0,A2,I0)", advance=
"NO") &
538 val%i_val(i),
"..", val%i_val(iend)
541 WRITE (unit=unit_nr, fmt=
"(1X,I0)", advance=
"NO") &
547 cpabort(
"Input value of type <integer_t> not associated")
550 IF (
ASSOCIATED(val%r_val))
THEN
551 DO i = 1,
SIZE(val%r_val)
552 IF (
modulo(i, 5) == 0)
THEN
554 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
556 IF (
ASSOCIATED(my_unit))
THEN
557 WRITE (unit=rcval, fmt=
"(ES25.16E3)") &
560 WRITE (unit=rcval, fmt=
"(ES25.16E3)") val%r_val(i)
562 WRITE (unit=unit_nr, fmt=
"(A)", advance=
"NO") trim(rcval)
565 cpabort(
"Input value of type <real_t> not associated")
568 IF (
ASSOCIATED(val%c_val))
THEN
570 DO i = 1,
SIZE(val%c_val)
572 IF (l > 10 .AND. l + len_trim(val%c_val(i)) > 76)
THEN
574 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
576 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
""""//trim(val%c_val(i))//
""""
577 l = l + len_trim(val%c_val(i)) + 3
578 ELSE IF (len_trim(val%c_val(i)) > 0)
THEN
579 l = l + len_trim(val%c_val(i))
580 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
""""//trim(val%c_val(i))//
""""
583 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
'""'
587 cpabort(
"Input value of type <char_t> not associated")
590 IF (
ASSOCIATED(val%c_val))
THEN
591 SELECT CASE (
SIZE(val%c_val))
593 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") trim(val%c_val(1))
595 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") val%c_val(1)
596 WRITE (unit=unit_nr, fmt=
'(A)', advance=
"NO") trim(val%c_val(2))
598 WRITE (unit=unit_nr, fmt=
'(1X,A)', advance=
"NO") val%c_val(1)
599 DO i = 2,
SIZE(val%c_val) - 1
600 WRITE (unit=unit_nr, fmt=
"(A)", advance=
"NO") val%c_val(i)
602 WRITE (unit=unit_nr, fmt=
'(A)', advance=
"NO") trim(val%c_val(
SIZE(val%c_val)))
605 cpabort(
"Input value of type <lchar_t> not associated")
608 IF (
ASSOCIATED(val%i_val))
THEN
610 DO i = 1,
SIZE(val%i_val)
611 c_string =
enum_i2c(val%enum, val%i_val(i))
612 IF (l > 10 .AND. l + len_trim(c_string) > 76)
THEN
614 WRITE (unit=unit_nr, fmt=
"("//trim(myfmt)//
")", advance=
"NO")
617 l = l + len_trim(c_string) + 3
619 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO") trim(c_string)
622 cpabort(
"Input value of type <enum_t> not associated")
625 WRITE (unit=unit_nr, fmt=
"(' *empty*')", advance=
"NO")
627 cpabort(
"Unexpected type_of_var for val")
630 WRITE (unit=unit_nr, fmt=
"(1X,A)", advance=
"NO")
"NULL()"
638 WRITE (unit=unit_nr, fmt=
"()")
656 CHARACTER(LEN=*),
INTENT(OUT) :: string
659 CHARACTER(LEN=default_string_length) :: enum_string
661 REAL(kind=
dp) ::
value
665 IF (
ASSOCIATED(val))
THEN
667 SELECT CASE (val%type_of_var)
669 IF (
ASSOCIATED(val%l_val))
THEN
670 DO i = 1,
SIZE(val%l_val)
671 WRITE (unit=string(2*i - 1:), fmt=
"(1X,L1)") val%l_val(i)
674 cpabort(
"Logical value is unavailable")
677 IF (
ASSOCIATED(val%i_val))
THEN
678 DO i = 1,
SIZE(val%i_val)
679 WRITE (unit=string(12*i - 11:), fmt=
"(I12)") val%i_val(i)
682 cpabort(
"Integer value is unavailable")
685 IF (
ASSOCIATED(val%r_val))
THEN
686 IF (
PRESENT(unit))
THEN
687 DO i = 1,
SIZE(val%r_val)
690 WRITE (unit=string(17*i - 16:), fmt=
"(ES17.8E3)")
value
693 DO i = 1,
SIZE(val%r_val)
694 WRITE (unit=string(17*i - 16:), fmt=
"(ES17.8E3)") val%r_val(i)
698 cpabort(
"Real value is unavailable")
701 IF (
ASSOCIATED(val%c_val))
THEN
703 DO i = 1,
SIZE(val%c_val)
704 WRITE (unit=string(ipos:), fmt=
"(A)") trim(adjustl(val%c_val(i)))
705 ipos = ipos + len_trim(adjustl(val%c_val(i))) + 1
708 cpabort(
"Character value is unavailable")
711 IF (
ASSOCIATED(val%c_val))
THEN
712 CALL val_get(val, c_val=string)
714 cpabort(
"Character value is unavailable")
717 IF (
ASSOCIATED(val%i_val))
THEN
718 DO i = 1,
SIZE(val%i_val)
719 enum_string =
enum_i2c(val%enum, val%i_val(i))
720 WRITE (unit=string, fmt=
"(A)") trim(adjustl(enum_string))
723 cpabort(
"Enumeration value is unavailable")
726 cpabort(
"unexpected type_of_var for val ")
741 TYPE(
val_type),
POINTER :: val_in, val_out
743 cpassert(
ASSOCIATED(val_in))
744 cpassert(.NOT.
ASSOCIATED(val_out))
746 val_out%type_of_var = val_in%type_of_var
747 val_out%ref_count = 1
748 val_out%enum => val_in%enum
749 IF (
ASSOCIATED(val_out%enum))
CALL enum_retain(val_out%enum)
751 NULLIFY (val_out%l_val, val_out%i_val, val_out%c_val, val_out%r_val)
752 IF (
ASSOCIATED(val_in%l_val))
THEN
753 ALLOCATE (val_out%l_val(
SIZE(val_in%l_val)))
754 val_out%l_val = val_in%l_val
756 IF (
ASSOCIATED(val_in%i_val))
THEN
757 ALLOCATE (val_out%i_val(
SIZE(val_in%i_val)))
758 val_out%i_val = val_in%i_val
760 IF (
ASSOCIATED(val_in%r_val))
THEN
761 ALLOCATE (val_out%r_val(
SIZE(val_in%r_val)))
762 val_out%r_val = val_in%r_val
764 IF (
ASSOCIATED(val_in%c_val))
THEN
765 ALLOCATE (val_out%c_val(
SIZE(val_in%c_val)))
766 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