| Class | dc_trace | 
| In: | 
                
                src/dc_trace.f90
                
         | 
        
| name : | character(*), intent(in) | 
| fmt : | character(*), intent(in), optional | 
| i(:) : | integer, intent(in), optional | 
| r(:) : | real, intent(in), optional | 
| d(:) : | real(8), intent(in), optional | 
| L(:) : | logical, intent(in), optional | 
| s(:) : | type(VSTRING),intent(in), optional | 
| n(:) : | integer, intent(in), optional | 
| c1 : | character(*), intent(in), optional | 
| c2 : | character(*), intent(in), optional | 
| c3 : | character(*), intent(in), optional | 
副プログラム開始のメッセージ出力 (level + 1)
    subroutine BeginSub(name, fmt, i, r, d, L, s, n, c1, c2, c3)
        character(*), intent(in)          :: name
        character(*), intent(in), optional:: fmt
        integer,      intent(in), optional:: i(:), n(:)
        real,         intent(in), optional:: r(:)
        real(8),      intent(in), optional:: d(:)
        logical,      intent(in), optional:: L(:)
        type(VSTRING),intent(in), optional:: s(:)
        character(*), intent(in), optional:: c1, c2, c3
        character(string) :: cbuf
    continue
        if (lfirst) call initialize
        if (debug()) then
            if (present(fmt)) then
                cbuf = cprintf(fmt, i, r, d, L, s, n, c1, c2, c3)
                write(dbg, "(A, A, 'call ', A, ' : ', A)") trim(head),  repeat(indent, level), trim(name), trim(cbuf)
            else
                write(dbg, "(A, A, 'call ',A)") trim(head),  repeat(indent, level), trim(name)
            endif
        endif
        ! call errtra ! --- for Fujitsu debug
        if (level > size(table)) return
        level = level + 1
        table(level) = name
    end subroutine BeginSub
          | header : | character(*), intent(in)
  | ||
| d(:) : | real(8), intent(in)
  | ||
| strlen : | integer, intent(in), optional
  | ||
| multi(:) : | integer, intent(in), optional
  | 
多次元データ出力 (level ± 0)
    subroutine DataD1Dump(header, d, strlen, multi)
      character(*), intent(in)          :: header  ! データの名称
      real(8),      intent(in)          :: d(:)    ! 倍精度実数1次元データ
      integer,      intent(in), optional:: strlen  ! 一行の文字数
      integer,      intent(in), optional:: multi(:)! 上位の次元添字
      integer          :: i, j
      character(string):: unit    ! データ文字列
      character(string):: unitbuf ! データ文字列バッファ
      integer          :: ucur    ! unit に書かれた文字数
      character(string):: cbuf    ! read/write 文のバッファ
      integer          :: stat    ! ステータス
      logical  :: first  ! 1つ目のデータかどうか
      integer  :: begini ! 1つ目のデータの添字
      integer  :: endi   ! 最後のデータの添字
      character(string):: cmulti ! 次元添字用文字列
      character(string):: cout   ! 出力する文字列
      character(string):: meshead_tmp
      integer          :: meshead_len
    continue
      if (.not. debug()) return
      ! 初期化
      unit    = ''
      unitbuf = ''
      ucur    = 0
      stat    = 0
      first = .true.
      cmulti = ''
      ! デバッグメッセージヘッダの作成。
      if (level < 1) then
         meshead_tmp = ''
         meshead_len = 0
      else
         meshead_tmp = meshead
         meshead_len = len(meshead)
      endif
      ! 次元添字用文字列を作成
      if (present(multi)) then
         do j = 1, size(multi)
            cmulti = trim(cmulti) // ', ' // trim(  toChar( multi(j) )  )
         enddo
      endif
      i = 1
      Dim_1_Loop : do
         if (first) begini = i
         endi = i
         write(cbuf, "(g40.20)") d(i)
         if (.not. first) cbuf = ', ' // adjustl(cbuf)
         unitbuf = unit
         call append(unit, ucur, trim(adjustl(cbuf)), stat, strlen)
         if ( stat /= 0 .or. i == size( d(:) ) ) then
            ! 一回目は、文字数オーバーでもそのまま出力。
            if (first) then
               cout = header // '('    // trim(toChar(begini))    // trim(cmulti)    // ')=' // trim(unit)
            ! 二回目以降は、オーバーしたものは次回へ
            elseif (stat /= 0 .and. begini == endi-1) then
               cout = header // '('    // trim(toChar(begini))    // trim(cmulti)    // ')='// trim(unitbuf)
               ! 1つ巻戻す
               i = i - 1
            elseif (stat /= 0 .and. begini /= endi-1) then
               cout = header // '('    // trim(toChar(begini)) // '-'    // trim(toChar(endi-1))    // trim(cmulti)    // ')=' // trim(unitbuf)
               ! 1つ巻戻す
               i = i - 1
            ! i が size(d) まで到達した場合もそのまま出力。
            elseif ( i == size( d(:) ) ) then
               cout = header // '('    // trim(toChar(begini)) // '-'    // trim(toChar(endi))      // trim(cmulti)    // ')='// trim(unit)
            endif
            write(dbg, "(A, A, A, A)")  trim(head), repeat( indent, max(level-1, 0) ),  meshead_tmp(1:meshead_len), trim(cout)
            ! unit, unitbuf をクリア
            unit    = ''
            unitbuf = ''
            ucur    = 0
            first = .true.
         else
            first = .false.
         endif
         if (i == size( d(:) ) ) exit Dim_1_Loop
         i = i + 1
      enddo Dim_1_Loop
    end subroutine DataD1Dump
          | header : | character(*), intent(in)
  | ||
| d(:,:,:) : | real(8), intent(in)
  | ||
| strlen : | integer, intent(in), optional
  | ||
| multi(:) : | integer, intent(in), optional
  | 
多次元データ出力 (level ± 0)
    subroutine DataD3Dump(header, d, strlen, multi)
      character(*), intent(in)          :: header  ! データの名称
      real(8),      intent(in)          :: d(:,:,:)! 倍精度実数3次元データ
      integer,      intent(in), optional:: strlen  ! 一行の文字数
      integer,      intent(in), optional:: multi(:)! 上位の次元添字
      integer, allocatable :: total(:)
      integer              :: k
    continue
      if (.not. debug()) return
      if (present(multi)) then
         allocate( total(size(multi)+1) )
         total(2:size(multi)+1) = multi(:)
      else
         allocate( total(1) )
      endif
      do k = 1, size( d(:,:,:), 3 )
         total(1) = k
         call DataDump(header, d(:,:,k), strlen=strlen, multi=total(:))
      enddo
      deallocate( total )
    end subroutine DataD3Dump
          | header : | character(*), intent(in)
  | ||
| d(:,:) : | real(8), intent(in)
  | ||
| strlen : | integer, intent(in), optional
  | ||
| multi(:) : | integer, intent(in), optional
  | 
多次元データ出力 (level ± 0)
    subroutine DataD2Dump(header, d, strlen, multi)
      character(*), intent(in)          :: header  ! データの名称
      real(8),      intent(in)          :: d(:,:)  ! 倍精度実数2次元データ
      integer,      intent(in), optional:: strlen  ! 一行の文字数
      integer,      intent(in), optional:: multi(:)! 上位の次元添字
      integer, allocatable :: total(:)
      integer              :: j
    continue
      if (.not. debug()) return
      if (present(multi)) then
         allocate( total(size(multi)+1) )
         total(2:size(multi)+1) = multi(:)
      else
         allocate( total(1) )
      endif
      do j = 1, size( d(:,:), 2 )
         total(1) = j
         call DataDump(header, d(:,j), strlen=strlen, multi=total(:))
      enddo
      deallocate( total )
    end subroutine DataD2Dump