fortran66のブログ

fortran について書きます。

ユーザー定義派生型変数の入出力

non-default derived-type input/output

DT の引数に、文字列と整数を書けるのですが、それを用いてさまざまな出力制御が可能になります。また自由書式も可能になっています。

思ったより便利そうな機能です。

出力結果

f:id:fortran66:20131218032016g:plain

ソース・プログラム

    module m_test
      implicit none
      type :: t_test
        integer :: i, j
      contains
        procedure :: wr
        generic   :: write(formatted) => wr
      end type t_test
    contains
      subroutine wr(dtv, unit, iotype, vlist, iostat, iomsg)
        class(t_test), intent(in) :: dtv
        integer, intent(in) :: unit
        character(len = *), intent(in) :: iotype
        integer, intent(in) :: vlist(:)
        integer, intent(out) :: iostat
        character(len = *), intent(in out) :: iomsg
        !
        character(len = 20) :: fmt
        if (iotype == 'LISTDIRECTED') then
          write(unit, *, iostat = iostat) dtv%i, dtv%j
        else if (iotype == 'DTtest') then
          write(fmt, '(a, g0, a, g0, a)') '(i', vlist(1), ', i', vlist(2) ,')'
          print *, trim(fmt)
          write(unit, fmt, iostat = iostat) dtv%i, dtv%j
        else if (iotype(1:2) == 'DT') then
          write(fmt, '(a, g0, a, g0, a)', iostat = iostat) '(i', vlist(1), ', i', vlist(2) ,')'
          write(unit, fmt) dtv%i, dtv%j
        else
          print *, 'namelist not supported'
        end if  
        return
      end subroutine wr
    end module m_test

    program testDT
      use m_test
      implicit none
      type(t_test), allocatable :: test
      allocate(test, source = t_test(12, 345))
      print *, test
      print '(DT"test"(4, 4))', test
      print '(DT(8, 8))', test
      stop
    end program testDT