36#include "../base/base_uses.f90"
41 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
42 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'input_keyword_types'
90 INTEGER :: ref_count = 0
91 CHARACTER(LEN=default_string_length),
DIMENSION(:),
POINTER :: names => null()
92 CHARACTER(LEN=usage_string_length) :: location =
""
93 CHARACTER(LEN=usage_string_length) :: usage =
""
94 CHARACTER,
DIMENSION(:),
POINTER :: description => null()
95 CHARACTER(LEN=:),
ALLOCATABLE :: deprecation_notice
96 INTEGER,
POINTER,
DIMENSION(:) :: citations => null()
97 INTEGER :: type_of_var = 0, n_var = 0
98 LOGICAL :: repeats = .false., removed = .false.
102 TYPE(
val_type),
POINTER :: lone_keyword_value => null()
148 SUBROUTINE keyword_create(keyword, location, name, description, usage, type_of_var, &
149 n_var, repeats, variants, default_val, &
150 default_l_val, default_r_val, default_lc_val, default_c_val, default_i_val, &
151 default_l_vals, default_r_vals, default_c_vals, default_i_vals, &
152 lone_keyword_val, lone_keyword_l_val, lone_keyword_r_val, lone_keyword_c_val, &
153 lone_keyword_i_val, lone_keyword_l_vals, lone_keyword_r_vals, &
154 lone_keyword_c_vals, lone_keyword_i_vals, enum_c_vals, enum_i_vals, &
155 enum, enum_strict, enum_desc, unit_str, citations, deprecation_notice, removed)
157 CHARACTER(len=*),
INTENT(in) :: location, name, description
158 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: usage
159 INTEGER,
INTENT(in),
OPTIONAL :: type_of_var, n_var
160 LOGICAL,
INTENT(in),
OPTIONAL :: repeats
161 CHARACTER(len=*),
DIMENSION(:),
INTENT(in), &
163 TYPE(
val_type),
OPTIONAL,
POINTER :: default_val
164 LOGICAL,
INTENT(in),
OPTIONAL :: default_l_val
165 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: default_r_val
166 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: default_lc_val, default_c_val
167 INTEGER,
INTENT(in),
OPTIONAL :: default_i_val
168 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: default_l_vals
169 REAL(kind=
dp),
DIMENSION(:),
INTENT(in),
OPTIONAL :: default_r_vals
170 CHARACTER(len=*),
DIMENSION(:),
INTENT(in), &
171 OPTIONAL :: default_c_vals
172 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: default_i_vals
173 TYPE(
val_type),
OPTIONAL,
POINTER :: lone_keyword_val
174 LOGICAL,
INTENT(in),
OPTIONAL :: lone_keyword_l_val
175 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: lone_keyword_r_val
176 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: lone_keyword_c_val
177 INTEGER,
INTENT(in),
OPTIONAL :: lone_keyword_i_val
178 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: lone_keyword_l_vals
179 REAL(kind=
dp),
DIMENSION(:),
INTENT(in),
OPTIONAL :: lone_keyword_r_vals
180 CHARACTER(len=*),
DIMENSION(:),
INTENT(in), &
181 OPTIONAL :: lone_keyword_c_vals
182 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: lone_keyword_i_vals
183 CHARACTER(len=*),
DIMENSION(:),
INTENT(in), &
184 OPTIONAL :: enum_c_vals
185 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: enum_i_vals
187 LOGICAL,
INTENT(in),
OPTIONAL :: enum_strict
188 CHARACTER(len=*),
DIMENSION(:),
INTENT(in), &
189 OPTIONAL :: enum_desc
190 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: unit_str
191 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: citations
192 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: deprecation_notice
193 LOGICAL,
INTENT(in),
OPTIONAL :: removed
195 CHARACTER(LEN=default_string_length) :: tmp_string
199 cpassert(.NOT.
ASSOCIATED(keyword))
201 keyword%ref_count = 1
202 NULLIFY (keyword%unit)
203 keyword%location = location
204 keyword%removed = .false.
206 cpassert(len_trim(name) > 0)
208 IF (
PRESENT(variants))
THEN
209 ALLOCATE (keyword%names(
SIZE(variants) + 1))
210 keyword%names(1) = name
211 DO i = 1,
SIZE(variants)
212 cpassert(len_trim(variants(i)) > 0)
213 keyword%names(i + 1) = variants(i)
216 ALLOCATE (keyword%names(1))
217 keyword%names(1) = name
219 DO i = 1,
SIZE(keyword%names)
223 IF (
PRESENT(usage))
THEN
224 cpassert(len_trim(usage) <= len(keyword%usage))
225 keyword%usage = usage
227 IF (keyword%names(1) /=
"_SECTION_PARAMETERS_" .AND. keyword%names(1) /=
"_DEFAULT_KEYWORD_")
THEN
231 DO i = 1,
SIZE(keyword%names)
232 check = check .OR. (index(tmp_string, trim(keyword%names(i))) == 1)
234 IF (.NOT. check)
THEN
235 cpabort(
"Usage string must start with one of the keyword name.")
242 n = len_trim(description)
243 ALLOCATE (keyword%description(n))
245 keyword%description(i) = description(i:i)
248 IF (
PRESENT(citations))
THEN
249 ALLOCATE (keyword%citations(
SIZE(citations, 1)))
250 keyword%citations = citations
252 NULLIFY (keyword%citations)
255 keyword%repeats = .false.
256 IF (
PRESENT(repeats)) keyword%repeats = repeats
258 NULLIFY (keyword%enum)
259 IF (
PRESENT(enum))
THEN
263 IF (
PRESENT(enum_i_vals))
THEN
264 cpassert(
PRESENT(enum_c_vals))
265 cpassert(.NOT.
ASSOCIATED(keyword%enum))
266 CALL enum_create(keyword%enum, c_vals=enum_c_vals, i_vals=enum_i_vals, &
267 desc=enum_desc, strict=enum_strict)
269 cpassert(.NOT.
PRESENT(enum_c_vals))
272 NULLIFY (keyword%default_value, keyword%lone_keyword_value)
273 IF (
PRESENT(default_val))
THEN
274 IF (
PRESENT(default_l_val) .OR.
PRESENT(default_l_vals) .OR. &
275 PRESENT(default_i_val) .OR.
PRESENT(default_i_vals) .OR. &
276 PRESENT(default_r_val) .OR.
PRESENT(default_r_vals) .OR. &
277 PRESENT(default_c_val) .OR.
PRESENT(default_c_vals))
THEN
278 cpabort(
"you should pass either default_val or a default value, not both")
280 keyword%default_value => default_val
281 IF (
ASSOCIATED(default_val%enum))
THEN
282 IF (
ASSOCIATED(keyword%enum))
THEN
283 cpassert(
ASSOCIATED(keyword%enum, default_val%enum))
285 keyword%enum => default_val%enum
289 cpassert(.NOT.
ASSOCIATED(keyword%enum))
293 IF (.NOT.
ASSOCIATED(keyword%default_value))
THEN
294 CALL val_create(keyword%default_value, l_val=default_l_val, &
295 l_vals=default_l_vals, i_val=default_i_val, i_vals=default_i_vals, &
296 r_val=default_r_val, r_vals=default_r_vals, c_val=default_c_val, &
297 c_vals=default_c_vals, lc_val=default_lc_val, enum=keyword%enum)
300 keyword%type_of_var = keyword%default_value%type_of_var
301 IF (keyword%default_value%type_of_var ==
no_t)
THEN
305 IF (keyword%type_of_var ==
no_t)
THEN
306 IF (
PRESENT(type_of_var))
THEN
307 keyword%type_of_var = type_of_var
309 CALL cp_abort(__location__, &
310 "keyword "//trim(keyword%names(1))// &
311 " assumed undefined type by default")
313 ELSE IF (
PRESENT(type_of_var))
THEN
314 IF (keyword%type_of_var /= type_of_var)
THEN
315 CALL cp_abort(__location__, &
316 "keyword "//trim(keyword%names(1))// &
317 " has a type different from the type of the default_value")
319 keyword%type_of_var = type_of_var
322 IF (keyword%type_of_var ==
no_t)
THEN
326 IF (
PRESENT(lone_keyword_val))
THEN
327 IF (
PRESENT(lone_keyword_l_val) .OR.
PRESENT(lone_keyword_l_vals) .OR. &
328 PRESENT(lone_keyword_i_val) .OR.
PRESENT(lone_keyword_i_vals) .OR. &
329 PRESENT(lone_keyword_r_val) .OR.
PRESENT(lone_keyword_r_vals) .OR. &
330 PRESENT(lone_keyword_c_val) .OR.
PRESENT(lone_keyword_c_vals))
THEN
331 CALL cp_abort(__location__, &
332 "you should pass either lone_keyword_val or a lone_keyword value, not both")
334 keyword%lone_keyword_value => lone_keyword_val
336 IF (
ASSOCIATED(lone_keyword_val%enum))
THEN
337 IF (
ASSOCIATED(keyword%enum))
THEN
338 IF (.NOT.
ASSOCIATED(keyword%enum, lone_keyword_val%enum))
THEN
339 cpabort(
"keyword%enum/=lone_keyword_val%enum")
342 IF (
ASSOCIATED(keyword%lone_keyword_value))
THEN
343 cpabort(.NOT.
" ASSOCIATED(keyword%lone_keyword_value)")
345 keyword%enum => lone_keyword_val%enum
349 cpassert(.NOT.
ASSOCIATED(keyword%enum))
352 IF (.NOT.
ASSOCIATED(keyword%lone_keyword_value))
THEN
353 CALL val_create(keyword%lone_keyword_value, l_val=lone_keyword_l_val, &
354 l_vals=lone_keyword_l_vals, i_val=lone_keyword_i_val, i_vals=lone_keyword_i_vals, &
355 r_val=lone_keyword_r_val, r_vals=lone_keyword_r_vals, c_val=lone_keyword_c_val, &
356 c_vals=lone_keyword_c_vals, enum=keyword%enum)
358 IF (
ASSOCIATED(keyword%lone_keyword_value))
THEN
359 IF (keyword%lone_keyword_value%type_of_var ==
no_t)
THEN
362 IF (keyword%lone_keyword_value%type_of_var /= keyword%type_of_var)
THEN
363 cpabort(
"lone_keyword_value type incompatible with keyword type")
366 IF (keyword%type_of_var ==
enum_t)
THEN
367 IF (keyword%enum%strict)
THEN
369 DO i = 1,
SIZE(keyword%enum%i_vals)
370 check = check .OR. (keyword%default_value%i_val(1) == keyword%enum%i_vals(i))
372 IF (.NOT. check)
THEN
373 cpabort(
"default value not in enumeration : "//keyword%names(1))
381 IF (
ASSOCIATED(keyword%default_value))
THEN
382 SELECT CASE (keyword%default_value%type_of_var)
384 keyword%n_var =
SIZE(keyword%default_value%l_val)
386 keyword%n_var =
SIZE(keyword%default_value%i_val)
388 IF (keyword%enum%strict)
THEN
390 DO i = 1,
SIZE(keyword%enum%i_vals)
391 check = check .OR. (keyword%default_value%i_val(1) == keyword%enum%i_vals(i))
393 IF (.NOT. check)
THEN
394 cpabort(
"default value not in enumeration : "//keyword%names(1))
397 keyword%n_var =
SIZE(keyword%default_value%i_val)
399 keyword%n_var =
SIZE(keyword%default_value%r_val)
401 keyword%n_var =
SIZE(keyword%default_value%c_val)
407 cpabort(
"Unknown type_of_var for keyword_create")
410 IF (
PRESENT(n_var)) keyword%n_var = n_var
411 IF (keyword%type_of_var ==
lchar_t .AND. keyword%n_var /= 1)
THEN
412 cpabort(
"arrays of lchar_t not supported : "//keyword%names(1))
415 IF (
PRESENT(unit_str))
THEN
416 ALLOCATE (keyword%unit)
420 IF (
PRESENT(deprecation_notice))
THEN
421 keyword%deprecation_notice = trim(deprecation_notice)
424 IF (
PRESENT(removed))
THEN
425 keyword%removed = removed
437 cpassert(
ASSOCIATED(keyword))
438 cpassert(keyword%ref_count > 0)
439 keyword%ref_count = keyword%ref_count + 1
450 IF (
ASSOCIATED(keyword))
THEN
451 cpassert(keyword%ref_count > 0)
452 keyword%ref_count = keyword%ref_count - 1
453 IF (keyword%ref_count == 0)
THEN
454 DEALLOCATE (keyword%names)
455 DEALLOCATE (keyword%description)
459 IF (
ASSOCIATED(keyword%unit))
THEN
461 DEALLOCATE (keyword%unit)
463 IF (
ASSOCIATED(keyword%citations))
THEN
464 DEALLOCATE (keyword%citations)
487 SUBROUTINE keyword_get(keyword, names, usage, description, type_of_var, n_var, &
488 default_value, lone_keyword_value, repeats, enum, citations)
490 CHARACTER(len=default_string_length), &
491 DIMENSION(:),
OPTIONAL,
POINTER :: names
492 CHARACTER(len=*),
INTENT(out),
OPTIONAL :: usage, description
493 INTEGER,
INTENT(out),
OPTIONAL :: type_of_var, n_var
494 TYPE(
val_type),
OPTIONAL,
POINTER :: default_value, lone_keyword_value
495 LOGICAL,
INTENT(out),
OPTIONAL :: repeats
497 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: citations
499 cpassert(
ASSOCIATED(keyword))
500 cpassert(keyword%ref_count > 0)
501 IF (
PRESENT(names)) names => keyword%names
502 IF (
PRESENT(usage)) usage = keyword%usage
503 IF (
PRESENT(description)) description =
a2s(keyword%description)
504 IF (
PRESENT(type_of_var)) type_of_var = keyword%type_of_var
505 IF (
PRESENT(n_var)) n_var = keyword%n_var
506 IF (
PRESENT(repeats)) repeats = keyword%repeats
507 IF (
PRESENT(default_value)) default_value => keyword%default_value
508 IF (
PRESENT(lone_keyword_value)) lone_keyword_value => keyword%lone_keyword_value
509 IF (
PRESENT(enum))
enum => keyword%enum
510 IF (
PRESENT(citations)) citations => keyword%citations
524 INTEGER,
INTENT(in) :: unit_nr, level
526 CHARACTER(len=cp_unit_desc_length) :: c_string
529 cpassert(
ASSOCIATED(keyword))
530 cpassert(keyword%ref_count > 0)
531 IF (level > 0 .AND. (unit_nr > 0))
THEN
532 WRITE (unit_nr,
"(a,a,a)")
" ---", &
533 trim(keyword%names(1)),
"---"
535 WRITE (unit_nr,
"(a,a)")
"usage : ", trim(keyword%usage)
538 WRITE (unit_nr,
"(a)")
"description : "
541 SELECT CASE (keyword%type_of_var)
543 IF (keyword%n_var == -1)
THEN
544 WRITE (unit_nr,
"(' A list of logicals is expected')")
545 ELSE IF (keyword%n_var == 1)
THEN
546 WRITE (unit_nr,
"(' A logical is expected')")
548 WRITE (unit_nr,
"(i6,' logicals are expected')") keyword%n_var
550 WRITE (unit_nr,
"(' (T,TRUE,YES,ON) and (F,FALSE,NO,OFF) are synonyms')")
552 IF (keyword%n_var == -1)
THEN
553 WRITE (unit_nr,
"(' A list of integers is expected')")
554 ELSE IF (keyword%n_var == 1)
THEN
555 WRITE (unit_nr,
"(' An integer is expected')")
557 WRITE (unit_nr,
"(i6,' integers are expected')") keyword%n_var
560 IF (keyword%n_var == -1)
THEN
561 WRITE (unit_nr,
"(' A list of reals is expected')")
562 ELSE IF (keyword%n_var == 1)
THEN
563 WRITE (unit_nr,
"(' A real is expected')")
565 WRITE (unit_nr,
"(i6,' reals are expected')") keyword%n_var
567 IF (
ASSOCIATED(keyword%unit))
THEN
568 c_string =
cp_unit_desc(keyword%unit, accept_undefined=.true.)
569 WRITE (unit_nr,
"('the default unit of measure is ',a)") &
573 IF (keyword%n_var == -1)
THEN
574 WRITE (unit_nr,
"(' A list of words is expected')")
575 ELSE IF (keyword%n_var == 1)
THEN
576 WRITE (unit_nr,
"(' A word is expected')")
578 WRITE (unit_nr,
"(i6,' words are expected')") keyword%n_var
581 WRITE (unit_nr,
"(' A string is expected')")
583 IF (keyword%n_var == -1)
THEN
584 WRITE (unit_nr,
"(' A list of keywords is expected')")
585 ELSE IF (keyword%n_var == 1)
THEN
586 WRITE (unit_nr,
"(' A keyword is expected')")
588 WRITE (unit_nr,
"(i6,' keywords are expected')") keyword%n_var
591 WRITE (unit_nr,
"(' Non-standard type.')")
593 cpabort(
"Unknown type_of_var for keyword_describe")
596 IF (keyword%type_of_var ==
enum_t)
THEN
598 WRITE (unit_nr,
"(' valid keywords:')")
599 DO i = 1,
SIZE(keyword%enum%c_vals)
600 c_string = keyword%enum%c_vals(i)
601 IF (len_trim(
a2s(keyword%enum%desc(i)%chars)) > 0)
THEN
602 WRITE (unit_nr,
"(' - ',a,' : ',a,'.')") &
603 trim(c_string), trim(
a2s(keyword%enum%desc(i)%chars))
605 WRITE (unit_nr,
"(' - ',a)") trim(c_string)
609 WRITE (unit_nr,
"(' valid keywords:')", advance=
'NO')
611 DO i = 1,
SIZE(keyword%enum%c_vals)
612 c_string = keyword%enum%c_vals(i)
613 IF (l + len_trim(c_string) > 72 .AND. l > 14)
THEN
614 WRITE (unit_nr,
"(/,' ')", advance=
'NO')
617 WRITE (unit_nr,
"(' ',a)", advance=
'NO') trim(c_string)
618 l = len_trim(c_string) + 3
620 WRITE (unit_nr,
"()")
622 IF (.NOT. keyword%enum%strict)
THEN
623 WRITE (unit_nr,
"(' other integer values are also accepted.')")
626 IF (
ASSOCIATED(keyword%default_value) .AND. keyword%type_of_var /=
no_t)
THEN
627 WRITE (unit_nr,
"('default_value : ')", advance=
"NO")
628 CALL val_write(keyword%default_value, unit_nr=unit_nr)
630 IF (
ASSOCIATED(keyword%lone_keyword_value) .AND. keyword%type_of_var /=
no_t)
THEN
631 WRITE (unit_nr,
"('lone_keyword : ')", advance=
"NO")
632 CALL val_write(keyword%lone_keyword_value, unit_nr=unit_nr)
634 IF (keyword%repeats)
THEN
635 WRITE (unit_nr,
"(' and it can be repeated more than once')", advance=
"NO")
637 WRITE (unit_nr,
"()")
638 IF (
SIZE(keyword%names) > 1)
THEN
639 WRITE (unit_nr,
"(a)", advance=
"NO")
"variants : "
640 DO i = 2,
SIZE(keyword%names)
641 WRITE (unit_nr,
"(a,' ')", advance=
"NO") keyword%names(i)
643 WRITE (unit_nr,
"()")
659 INTEGER,
INTENT(IN) :: level, unit_number
661 CHARACTER(LEN=1000) :: string
662 CHARACTER(LEN=3) :: removed, repeats
663 CHARACTER(LEN=8) :: short_string
664 INTEGER :: i, l0, l1, l2, l3, l4
666 cpassert(
ASSOCIATED(keyword))
667 cpassert(keyword%ref_count > 0)
677 IF (keyword%repeats)
THEN
683 IF (keyword%removed)
THEN
691 IF (keyword%names(1) ==
"_SECTION_PARAMETERS_")
THEN
692 WRITE (unit=unit_number, fmt=
"(A)") &
693 repeat(
" ", l0)//
"<SECTION_PARAMETERS repeats="""//trim(repeats)// &
694 """ removed="""//trim(removed)//
""">", &
695 repeat(
" ", l1)//
"<NAME type=""default"">SECTION_PARAMETERS</NAME>"
696 ELSE IF (keyword%names(1) ==
"_DEFAULT_KEYWORD_")
THEN
697 WRITE (unit=unit_number, fmt=
"(A)") &
698 repeat(
" ", l0)//
"<DEFAULT_KEYWORD repeats="""//trim(repeats)//
""">", &
699 repeat(
" ", l1)//
"<NAME type=""default"">DEFAULT_KEYWORD</NAME>"
701 WRITE (unit=unit_number, fmt=
"(A)") &
702 repeat(
" ", l0)//
"<KEYWORD repeats="""//trim(repeats)// &
703 """ removed="""//trim(removed)//
""">", &
704 repeat(
" ", l1)//
"<NAME type=""default"">"// &
705 trim(keyword%names(1))//
"</NAME>"
708 DO i = 2,
SIZE(keyword%names)
709 WRITE (unit=unit_number, fmt=
"(A)") &
710 repeat(
" ", l1)//
"<NAME type=""alias"">"// &
711 trim(keyword%names(i))//
"</NAME>"
714 SELECT CASE (keyword%type_of_var)
716 WRITE (unit=unit_number, fmt=
"(A)") &
717 repeat(
" ", l1)//
"<DATA_TYPE kind=""logical"">"
719 WRITE (unit=unit_number, fmt=
"(A)") &
720 repeat(
" ", l1)//
"<DATA_TYPE kind=""integer"">"
722 WRITE (unit=unit_number, fmt=
"(A)") &
723 repeat(
" ", l1)//
"<DATA_TYPE kind=""real"">"
725 WRITE (unit=unit_number, fmt=
"(A)") &
726 repeat(
" ", l1)//
"<DATA_TYPE kind=""word"">"
728 WRITE (unit=unit_number, fmt=
"(A)") &
729 repeat(
" ", l1)//
"<DATA_TYPE kind=""string"">"
731 WRITE (unit=unit_number, fmt=
"(A)") &
732 repeat(
" ", l1)//
"<DATA_TYPE kind=""keyword"">"
733 IF (keyword%enum%strict)
THEN
734 WRITE (unit=unit_number, fmt=
"(A)") &
735 repeat(
" ", l2)//
"<ENUMERATION strict=""yes"">"
737 WRITE (unit=unit_number, fmt=
"(A)") &
738 repeat(
" ", l2)//
"<ENUMERATION strict=""no"">"
740 DO i = 1,
SIZE(keyword%enum%c_vals)
741 WRITE (unit=unit_number, fmt=
"(A)") &
742 repeat(
" ", l3)//
"<ITEM>", &
743 repeat(
" ", l4)//
"<NAME>"// &
745 repeat(
" ", l4)//
"<DESCRIPTION>"// &
747 //
"</DESCRIPTION>", repeat(
" ", l3)//
"</ITEM>"
749 WRITE (unit=unit_number, fmt=
"(A)") repeat(
" ", l2)//
"</ENUMERATION>"
751 WRITE (unit=unit_number, fmt=
"(A)") &
752 repeat(
" ", l1)//
"<DATA_TYPE kind=""non-standard type"">"
754 cpabort(
"Unknown type_of_var for write_keyword_xml")
758 WRITE (unit=short_string, fmt=
"(I8)") keyword%n_var
759 WRITE (unit=unit_number, fmt=
"(A)") &
760 repeat(
" ", l2)//
"<N_VAR>"//trim(adjustl(short_string))//
"</N_VAR>", &
761 repeat(
" ", l1)//
"</DATA_TYPE>"
763 WRITE (unit=unit_number, fmt=
"(A)") repeat(
" ", l1)//
"<USAGE>"// &
767 WRITE (unit=unit_number, fmt=
"(A)") repeat(
" ", l1)//
"<DESCRIPTION>"// &
771 IF (
ALLOCATED(keyword%deprecation_notice))
THEN
772 WRITE (unit=unit_number, fmt=
"(A)") repeat(
" ", l1)//
"<DEPRECATION_NOTICE>"// &
774 //
"</DEPRECATION_NOTICE>"
777 IF (
ASSOCIATED(keyword%default_value) .AND. &
778 (keyword%type_of_var /=
no_t))
THEN
779 IF (
ASSOCIATED(keyword%unit))
THEN
788 WRITE (unit=unit_number, fmt=
"(A)") &
789 repeat(
" ", l1)//
"<DEFAULT_VALUE>"// &
793 IF (
ASSOCIATED(keyword%unit))
THEN
794 string =
cp_unit_desc(keyword%unit, accept_undefined=.true.)
795 WRITE (unit=unit_number, fmt=
"(A)") &
796 repeat(
" ", l1)//
"<DEFAULT_UNIT>"// &
797 trim(adjustl(string))//
"</DEFAULT_UNIT>"
800 IF (
ASSOCIATED(keyword%lone_keyword_value) .AND. &
801 (keyword%type_of_var /=
no_t))
THEN
804 WRITE (unit=unit_number, fmt=
"(A)") &
805 repeat(
" ", l1)//
"<LONE_KEYWORD_VALUE>"// &
809 IF (
ASSOCIATED(keyword%citations))
THEN
810 DO i = 1,
SIZE(keyword%citations, 1)
812 WRITE (unit=short_string, fmt=
"(I8)") keyword%citations(i)
813 WRITE (unit=unit_number, fmt=
"(A)") &
814 repeat(
" ", l1)//
"<REFERENCE>", &
815 repeat(
" ", l2)//
"<NAME>"//trim(
get_citation_key(keyword%citations(i)))//
"</NAME>", &
816 repeat(
" ", l2)//
"<NUMBER>"//trim(adjustl(short_string))//
"</NUMBER>", &
817 repeat(
" ", l1)//
"</REFERENCE>"
821 WRITE (unit=unit_number, fmt=
"(A)") &
822 repeat(
" ", l1)//
"<LOCATION>"//trim(keyword%location)//
"</LOCATION>"
826 IF (keyword%names(1) ==
"_SECTION_PARAMETERS_")
THEN
827 WRITE (unit=unit_number, fmt=
"(A)") &
828 repeat(
" ", l0)//
"</SECTION_PARAMETERS>"
829 ELSE IF (keyword%names(1) ==
"_DEFAULT_KEYWORD_")
THEN
830 WRITE (unit=unit_number, fmt=
"(A)") &
831 repeat(
" ", l0)//
"</DEFAULT_KEYWORD>"
833 WRITE (unit=unit_number, fmt=
"(A)") &
834 repeat(
" ", l0)//
"</KEYWORD>"
848 SUBROUTINE keyword_typo_match(keyword, unknown_string, location_string, matching_rank, matching_string, bonus)
851 CHARACTER(LEN=*) :: unknown_string, location_string
852 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: matching_rank
853 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(INOUT) :: matching_string
854 INTEGER,
INTENT(IN) :: bonus
856 CHARACTER(LEN=LEN(matching_string(1))) :: line
857 INTEGER :: i, imatch,
imax, irank, j, k
859 cpassert(
ASSOCIATED(keyword))
860 cpassert(keyword%ref_count > 0)
862 DO i = 1,
SIZE(keyword%names)
863 imatch =
typo_match(trim(keyword%names(i)), trim(unknown_string))
865 imatch = imatch + bonus
866 WRITE (line,
'(T2,A)')
" keyword "//trim(keyword%names(i))//
" in section "//trim(location_string)
867 imax =
SIZE(matching_rank, 1)
870 IF (imatch > matching_rank(k)) irank = k
872 IF (irank <=
imax)
THEN
873 matching_rank(irank + 1:
imax) = matching_rank(irank:
imax - 1)
874 matching_string(irank + 1:
imax) = matching_string(irank:
imax - 1)
875 matching_rank(irank) = imatch
876 matching_string(irank) = line
880 IF (keyword%type_of_var ==
enum_t)
THEN
881 DO j = 1,
SIZE(keyword%enum%c_vals)
882 imatch =
typo_match(trim(keyword%enum%c_vals(j)), trim(unknown_string))
884 imatch = imatch + bonus
885 WRITE (line,
'(T2,A)')
" enum "//trim(keyword%enum%c_vals(j))// &
886 " in section "//trim(location_string)// &
887 " for keyword "//trim(keyword%names(i))
888 imax =
SIZE(matching_rank, 1)
891 IF (imatch > matching_rank(k)) irank = k
893 IF (irank <=
imax)
THEN
894 matching_rank(irank + 1:
imax) = matching_rank(irank:
imax - 1)
895 matching_string(irank + 1:
imax) = matching_string(irank:
imax - 1)
896 matching_rank(irank) = imatch
897 matching_string(irank) = line
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
character(len=cp_unit_desc_length) function, public cp_unit_desc(unit, defaults, accept_undefined)
returns the "name" of the given unit
subroutine, public cp_unit_create(unit, string)
creates a unit parsing a string
integer, parameter, public cp_unit_desc_length
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
Perform an abnormal program termination.
subroutine, public print_message(message, output_unit, declev, before, after)
Perform a basic blocking of the text in message and print it optionally decorated with a frame of sta...
provides a uniform framework to add references to CP2K cite and output these
pure character(len=default_string_length) function, public get_citation_key(key)
...
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
elemental integer function, public typo_match(string, typo_string)
returns a non-zero positive value if typo_string equals string apart from a few typos....
pure character(len=size(array)) function, public a2s(array)
Converts a character-array into a string.
character(len=2 *len(inp_string)) function, public substitute_special_xml_tokens(inp_string)
Substitutes the five predefined XML entities: &, <, >, ', and ".
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.