158 logical,
save :: lfirst = .true.
160 integer,
save,
public ::
dbg = -1
163 integer,
save :: level = 0
164 integer,
parameter :: trace_stack_size = 128
166 character(TOKEN),
save:: table(trace_stack_size)
168 character(STRING),
save,
allocatable:: called_subname(:), &
169 & called_subname_tmp(:)
174 character(2),
parameter :: indent =
'| '
175 character(2),
parameter :: meshead =
'|-'
179 module procedure dctracedebug
182 module procedure datad1dump, datad2dump, datad3dump
238 logical,
intent(in):: on
239 integer,
save:: saved_dbg = -1
250 inquire(unit=
dbg, exist=x, opened=p)
252 if (x .and. .not. p)
then
258 open(unit=
dbg, status=
'SCRATCH')
273 if (saved_dbg < 0)
return
280 read(
dbg,
'(A)', iostat=ios) line
283 write(saved_dbg,
'(A)', iostat=ios) trim(line)
287 close(
dbg, iostat=ios)
342 integer,
intent(in),
optional::
debug
344 logical:: initflag_mpi
345 character(4):: myrank_str_mpi
346 integer:: myrank_mpi, err_mpi
348 call mpi_initialized(initflag_mpi, err_mpi)
349 if ( initflag_mpi )
then
350 call mpi_comm_rank(mpi_comm_world, myrank_mpi, err_mpi)
351 if ( myrank_mpi > 9999 )
then
354 write(unit=myrank_str_mpi, fmt=
"(i4.4)") myrank_mpi
355 head =
'#r' // myrank_str_mpi //
'#'
360 if (
present(
debug))
then
363 write(
dbg,
"(A, 'SetDebug: dbg =', i4)", iostat=ios) &
369 write(
dbg,
"(A, 'SetDebug: dbg = ', I0)", iostat=ios) trim(head),
dbg
373 write(
dbg,
"(A, 'SetDebug: dbg = ', I0)", iostat=ios) trim(head),
dbg
396 subroutine dctracedebug(dbg_mode)
397 logical,
intent(out):: dbg_mode
399 end subroutine dctracedebug
401 subroutine initialize
404 end subroutine initialize
474 subroutine beginsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca, &
478 character(*),
intent(in) :: name
479 character(*),
intent(in),
optional:: fmt
480 integer,
intent(in),
optional:: i(:), n(:)
481 real,
intent(in),
optional:: r(:)
482 real(
dp),
intent(in),
optional:: d(:)
483 logical,
intent(in),
optional:: l(:)
484 character(*),
intent(in),
optional:: c1, c2, c3
485 character(*),
intent(in),
optional:: ca(:)
486 character(*),
intent(in),
optional:: version
487 character(STRING) :: cbuf
488 character(STRING) :: name_ver
489 logical :: dbg_mode, print_version
490 integer :: alloc_size
492 if (
dbg < 0 )
return
493 if (lfirst)
call initialize
494 call debug( dbg_mode )
497 print_version = .false.
500 if (
present(version))
then
501 if (.not.
allocated(called_subname))
then
502 allocate(called_subname(1))
503 called_subname(1) = name
504 print_version = .true.
506 if (.not.
strinclude(called_subname, trim(name)))
then
507 alloc_size =
size(called_subname)
508 allocate(called_subname_tmp(alloc_size))
509 called_subname_tmp = called_subname
510 deallocate(called_subname)
511 allocate(called_subname(alloc_size + 1))
512 called_subname(1:alloc_size) = called_subname_tmp
513 deallocate(called_subname_tmp)
514 called_subname(alloc_size + 1) = name
515 print_version = .true.
518 if (print_version)
then
519 name_ver =
cprintf(
'%c version=<%c>', &
520 & c1=trim(name), c2=trim(version))
525 if (
present(fmt))
then
526 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
527 write(
dbg,
"(A, A, 'call ', A, ' : ', A)") trim(head), &
528 & repeat(indent, level), trim(name_ver), trim(cbuf)
530 write(
dbg,
"(A, A, 'call ',A)") trim(head), &
531 & repeat(indent, level), trim(name_ver)
535 if (level >
size(table))
return
598 subroutine endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)
601 character(*),
intent(in) :: name
602 character(*),
intent(in),
optional:: fmt
603 integer,
intent(in),
optional:: i(:), n(:)
604 real,
intent(in),
optional:: r(:)
605 real(
dp),
intent(in),
optional:: d(:)
606 logical,
intent(in),
optional:: l(:)
607 character(*),
intent(in),
optional:: c1, c2, c3
608 character(*),
intent(in),
optional:: ca(:)
609 character(STRING):: cbuf
612 if (
dbg < 0 )
return
613 if (lfirst)
call initialize
616 write(*,
"(A, 'Warning EndSub[',A,'] without BeginSub')") &
617 & trim(head), trim(name)
618 else if (name /= table(level))
then
619 write(*,
"(A, 'Warning EndSub[',A,'] but tos[',A,']')") &
620 & trim(head), trim(name), trim(table(level))
624 call debug( debug_mode )
625 if ( debug_mode )
then
626 if (
present(fmt))
then
627 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
628 write(
dbg,
"(A, A, 'end ', A, ' : ', A)") trim(head), &
629 & repeat(indent, level), trim(name), trim(cbuf)
631 write(
dbg,
"(A, A, 'end ', A)") trim(head), &
632 & repeat(indent, level), trim(name)
682 character(*),
intent(in) :: fmt
683 integer,
intent(in),
optional:: i(:), n(:)
684 real,
intent(in),
optional:: r(:)
685 real(
dp),
intent(in),
optional:: d(:)
686 logical,
intent(in),
optional:: l(:)
687 character(*),
intent(in),
optional:: c1, c2, c3
688 character(*),
intent(in),
optional:: ca(:)
689 character(STRING):: cbuf
690 character(STRING):: meshead_tmp
691 integer :: meshead_len
693 if (
dbg < 0 )
return
694 cbuf =
cprintf(fmt, i, r, d, l, n, c1, c2, c3, ca)
699 meshead_tmp = meshead
700 meshead_len = len(meshead)
702 write(
dbg,
"(A, A, A, A)") &
703 & trim(head), repeat( indent, max(level-1, 0) ), &
704 & meshead_tmp(1:meshead_len), trim(cbuf)
743 subroutine datad1dump(header, d, strlen, multi)
746 character(*),
intent(in) :: header
747 real(DP),
intent(in) :: d(:)
748 integer,
intent(in),
optional:: strlen
749 integer,
intent(in),
optional:: multi(:)
751 character(STRING):: unit
752 character(STRING):: unitbuf
754 character(STRING):: cbuf
759 character(STRING):: cmulti
760 character(STRING):: cout
761 character(STRING):: meshead_tmp
762 integer :: meshead_len
764 if (
dbg < 0 )
return
777 meshead_tmp = meshead
778 meshead_len = len(meshead)
781 if (
present(multi))
then
782 do j = 1,
size(multi)
783 cmulti = trim(cmulti) //
', ' // trim(
tochar( multi(j) ) )
788 if (first) begini = i
790 write(cbuf,
"(g40.20)") d(i)
791 if (.not. first) cbuf =
', ' // adjustl(cbuf(1:254))
793 call append(unit, ucur, trim(adjustl(cbuf)), stat, strlen)
794 if ( stat /= 0 .or. i ==
size( d(:) ) )
then
797 cout = header //
'(' &
798 & // trim(
tochar(begini)) &
800 & //
')=' // trim(unit)
802 elseif (stat /= 0 .and. begini == endi-1)
then
803 cout = header //
'(' &
804 & // trim(
tochar(begini)) &
806 & //
')='// trim(unitbuf)
809 elseif (stat /= 0 .and. begini /= endi-1)
then
810 cout = header //
'(' &
811 & // trim(
tochar(begini)) //
'-' &
812 & // trim(
tochar(endi-1)) &
814 & //
')=' // trim(unitbuf)
818 elseif ( i ==
size( d(:) ) )
then
819 cout = header //
'(' &
820 & // trim(
tochar(begini)) //
'-' &
823 & //
')='// trim(unit)
825 write(
dbg,
"(A, A, A, A)") &
826 & trim(head), repeat( indent, max(level-1, 0) ), &
827 & meshead_tmp(1:meshead_len), trim(cout)
836 if (i ==
size( d(:) ) )
exit dim_1_loop
839 end subroutine datad1dump
861 subroutine datad2dump(header, d, strlen, multi)
863 character(*),
intent(in) :: header
864 real(DP),
intent(in) :: d(:,:)
865 integer,
intent(in),
optional:: strlen
866 integer,
intent(in),
optional:: multi(:)
867 integer,
allocatable :: total(:)
870 if (
dbg < 0 )
return
871 if (
present(multi))
then
872 allocate( total(
size(multi)+1) )
873 total(2:
size(multi)+1) = multi(:)
877 do j = 1,
size( d(:,:), 2 )
879 call datadump(header, d(:,j), strlen=strlen, multi=total(:))
882 end subroutine datad2dump
904 subroutine datad3dump(header, d, strlen, multi)
906 character(*),
intent(in) :: header
907 real(DP),
intent(in) :: d(:,:,:)
908 integer,
intent(in),
optional:: strlen
909 integer,
intent(in),
optional:: multi(:)
910 integer,
allocatable :: total(:)
913 if (
dbg < 0 )
return
914 if (
present(multi))
then
915 allocate( total(
size(multi)+1) )
916 total(2:
size(multi)+1) = multi(:)
920 do k = 1,
size( d(:,:,:), 3 )
922 call datadump(header, d(:,:,k), strlen=strlen, multi=total(:))
925 end subroutine datad3dump
951 subroutine append(unit, ucur, val, stat, strlen)
952 character(*),
intent(inout):: unit
953 integer,
intent(inout):: ucur
954 character(*),
intent(in) :: val
955 integer,
intent(out) :: stat
956 integer,
intent(in), &
961 if (
present(strlen))
then
962 if (ucur >= strlen)
then
967 if (ucur >= len(unit))
then
974 wrsz = min(len(val), len(unit) - ucur)
975 unit(1+ucur: wrsz+ucur) = val(1: wrsz)
978 if (wrsz < len(val)) stat = 1
979 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
標準エラー出力の装置番号