154 logical,
save :: lfirst = .true.
156 integer,
save,
public ::
dbg = -1
159 integer,
save :: level = 0
160 integer,
parameter :: trace_stack_size = 128
162 character(TOKEN),
save:: table(trace_stack_size)
164 character(STRING),
save,
allocatable:: called_subname(:), &
165 & called_subname_tmp(:)
169 character(1),
parameter:: head =
'#'
170 character(2),
parameter :: indent =
'| '
171 character(2),
parameter :: meshead =
'|-'
175 module procedure dctracedebug
178 module procedure datad1dump, datad2dump, datad3dump
234 logical,
intent(in):: on
235 integer,
save:: saved_dbg = -1
246 inquire(unit=
dbg, exist=x, opened=p)
248 if (x .and. .not. p)
then
254 open(unit=
dbg, status=
'SCRATCH')
269 if (saved_dbg < 0)
return
276 read(
dbg,
'(A)', iostat=ios) line
279 write(saved_dbg,
'(A)', iostat=ios) trim(line)
283 close(
dbg, iostat=ios)
338 integer,
intent(in),
optional::
debug
341 if (
present(
debug))
then
344 write(
dbg,
"(A, 'SetDebug: dbg =', i4)", iostat=ios) &
350 write(
dbg,
"(A, 'SetDebug: dbg = ', I0)", iostat=ios) trim(head),
dbg
354 write(
dbg,
"(A, 'SetDebug: dbg = ', I0)", iostat=ios) trim(head),
dbg
377 subroutine dctracedebug(dbg_mode)
378 logical,
intent(out):: dbg_mode
380 end subroutine dctracedebug
382 subroutine initialize
385 end subroutine initialize
455 subroutine beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, &
459 character(*),
intent(in) :: name
460 character(*),
intent(in),
optional:: fmt
461 integer,
intent(in),
optional:: i(:), n(:)
462 real,
intent(in),
optional:: r(:)
463 real(
dp),
intent(in),
optional:: d(:)
464 logical,
intent(in),
optional:: l(:)
465 character(*),
intent(in),
optional:: c1, c2, c3
466 character(*),
intent(in),
optional:: ca(:)
467 character(*),
intent(in),
optional:: version
468 character(STRING) :: cbuf
469 character(STRING) :: name_ver
470 logical :: dbg_mode, print_version
471 integer :: alloc_size
473 if (
dbg < 0 )
return
474 if (lfirst)
call initialize
475 call debug( dbg_mode )
478 print_version = .false.
481 if (
present(version))
then
482 if (.not.
allocated(called_subname))
then
483 allocate(called_subname(1))
484 called_subname(1) = name
485 print_version = .true.
487 if (.not.
strinclude(called_subname, trim(name)))
then
488 alloc_size =
size(called_subname)
489 allocate(called_subname_tmp(alloc_size))
490 called_subname_tmp = called_subname
491 deallocate(called_subname)
492 allocate(called_subname(alloc_size + 1))
493 called_subname(1:alloc_size) = called_subname_tmp
494 deallocate(called_subname_tmp)
495 called_subname(alloc_size + 1) = name
496 print_version = .true.
499 if (print_version)
then
500 name_ver =
cprintf(
'%c version=<%c>', &
501 & c1=trim(name), c2=trim(version))
506 if (
present(fmt))
then
507 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
508 write(
dbg,
"(A, A, 'call ', A, ' : ', A)") trim(head), &
509 & repeat(indent, level), trim(name_ver), trim(cbuf)
511 write(
dbg,
"(A, A, 'call ',A)") trim(head), &
512 & repeat(indent, level), trim(name_ver)
516 if (level >
size(table))
return
579 subroutine endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
582 character(*),
intent(in) :: name
583 character(*),
intent(in),
optional:: fmt
584 integer,
intent(in),
optional:: i(:), n(:)
585 real,
intent(in),
optional:: r(:)
586 real(
dp),
intent(in),
optional:: d(:)
587 logical,
intent(in),
optional:: l(:)
588 character(*),
intent(in),
optional:: c1, c2, c3
589 character(*),
intent(in),
optional:: ca(:)
590 character(STRING):: cbuf
593 if (
dbg < 0 )
return
594 if (lfirst)
call initialize
597 write(*,
"(A, 'Warning EndSub[',A,'] without BeginSub')") &
598 & trim(head), trim(name)
599 else if (name /= table(level))
then
600 write(*,
"(A, 'Warning EndSub[',A,'] but tos[',A,']')") &
601 & trim(head), trim(name), trim(table(level))
605 call debug( debug_mode )
606 if ( debug_mode )
then
607 if (
present(fmt))
then
608 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
609 write(
dbg,
"(A, A, 'end ', A, ' : ', A)") trim(head), &
610 & repeat(indent, level), trim(name), trim(cbuf)
612 write(
dbg,
"(A, A, 'end ', A)") trim(head), &
613 & repeat(indent, level), trim(name)
663 character(*),
intent(in) :: fmt
664 integer,
intent(in),
optional:: i(:), n(:)
665 real,
intent(in),
optional:: r(:)
666 real(
dp),
intent(in),
optional:: d(:)
667 logical,
intent(in),
optional:: l(:)
668 character(*),
intent(in),
optional:: c1, c2, c3
669 character(*),
intent(in),
optional:: ca(:)
670 character(STRING):: cbuf
671 character(STRING):: meshead_tmp
672 integer :: meshead_len
674 if (
dbg < 0 )
return
675 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
680 meshead_tmp = meshead
681 meshead_len = len(meshead)
683 write(
dbg,
"(A, A, A, A)") &
684 & trim(head), repeat( indent, max(level-1, 0) ), &
685 & meshead_tmp(1:meshead_len), trim(cbuf)
724 subroutine datad1dump(header, d, strlen, multi)
727 character(*),
intent(in) :: header
728 real(DP),
intent(in) :: d(:)
729 integer,
intent(in),
optional:: strlen
730 integer,
intent(in),
optional:: multi(:)
732 character(STRING):: unit
733 character(STRING):: unitbuf
735 character(STRING):: cbuf
740 character(STRING):: cmulti
741 character(STRING):: cout
742 character(STRING):: meshead_tmp
743 integer :: meshead_len
745 if (
dbg < 0 )
return
758 meshead_tmp = meshead
759 meshead_len = len(meshead)
762 if (
present(multi))
then
763 do j = 1,
size(multi)
764 cmulti = trim(cmulti) //
', ' // trim(
tochar( multi(j) ) )
769 if (first) begini = i
771 write(cbuf,
"(g40.20)") d(i)
772 if (.not. first) cbuf =
', ' // adjustl(cbuf(1:254))
774 call append(unit, ucur, trim(adjustl(cbuf)), stat, strlen)
775 if ( stat /= 0 .or. i ==
size( d(:) ) )
then
778 cout = header //
'(' &
779 & // trim(
tochar(begini)) &
781 & //
')=' // trim(unit)
783 elseif (stat /= 0 .and. begini == endi-1)
then
784 cout = header //
'(' &
785 & // trim(
tochar(begini)) &
787 & //
')='// trim(unitbuf)
790 elseif (stat /= 0 .and. begini /= endi-1)
then
791 cout = header //
'(' &
792 & // trim(
tochar(begini)) //
'-' &
793 & // trim(
tochar(endi-1)) &
795 & //
')=' // trim(unitbuf)
799 elseif ( i ==
size( d(:) ) )
then
800 cout = header //
'(' &
801 & // trim(
tochar(begini)) //
'-' &
804 & //
')='// trim(unit)
806 write(
dbg,
"(A, A, A, A)") &
807 & trim(head), repeat( indent, max(level-1, 0) ), &
808 & meshead_tmp(1:meshead_len), trim(cout)
817 if (i ==
size( d(:) ) )
exit dim_1_loop
820 end subroutine datad1dump
842 subroutine datad2dump(header, d, strlen, multi)
844 character(*),
intent(in) :: header
845 real(DP),
intent(in) :: d(:,:)
846 integer,
intent(in),
optional:: strlen
847 integer,
intent(in),
optional:: multi(:)
848 integer,
allocatable :: total(:)
851 if (
dbg < 0 )
return
852 if (
present(multi))
then
853 allocate( total(
size(multi)+1) )
854 total(2:
size(multi)+1) = multi(:)
858 do j = 1,
size( d(:,:), 2 )
860 call datadump(header, d(:,j), strlen=strlen, multi=total(:))
863 end subroutine datad2dump
885 subroutine datad3dump(header, d, strlen, multi)
887 character(*),
intent(in) :: header
888 real(DP),
intent(in) :: d(:,:,:)
889 integer,
intent(in),
optional:: strlen
890 integer,
intent(in),
optional:: multi(:)
891 integer,
allocatable :: total(:)
894 if (
dbg < 0 )
return
895 if (
present(multi))
then
896 allocate( total(
size(multi)+1) )
897 total(2:
size(multi)+1) = multi(:)
901 do k = 1,
size( d(:,:,:), 3 )
903 call datadump(header, d(:,:,k), strlen=strlen, multi=total(:))
906 end subroutine datad3dump
932 subroutine append(unit, ucur, val, stat, strlen)
933 character(*),
intent(inout):: unit
934 integer,
intent(inout):: ucur
935 character(*),
intent(in) :: val
936 integer,
intent(out) :: stat
937 integer,
intent(in), &
942 if (
present(strlen))
then
943 if (ucur >= strlen)
then
948 if (ucur >= len(unit))
then
955 wrsz = min(len(val), len(unit) - ucur)
956 unit(1+ucur: wrsz+ucur) = val(1: wrsz)
959 if (wrsz < len(val)) stat = 1
960 end subroutine append
integer function, public sublevel()
subroutine, public setdebug(debug)
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public dbg_scratch(on)
integer, save, public dbg
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
integer, parameter, public stdout
標準出力の装置番号
integer, parameter, public dp
倍精度実数型変数
integer, parameter, public stderr
標準エラー出力の装置番号