Fortranプログラムで、印刷データ列数をカスタマイズする3つの方法

3460 ワード

データ表示や後期のデータ処理を容易にするために、Fortranプログラムで印刷されるデータ列数を制御したい場合がありますが、write文ではフォーマットコントローラに変数を追加することはできません.実はいくつかのテクニックを通じて、これは実現することができます.
サンプルコードは次のとおりです.
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      dimension a(20),b(20),c(20)
      character*100 frmt

      a=1.d0
      b=2.d0
      c=3.d0

      write(*,*)"Please specify the number of columns (default: 5):"
      read(*,*) ncol
      if(ncol .lt. 1) ncol=5

      write(*,"(/,'a=')")
      do i=1,20
        write(*,"(f20.12)",advance='no')a(i)
        if(mod(i,ncol) .eq. 0) write(*,*)
      end do
      write(*,*)

      frmt='(    f11.3)'
      write(frmt(2:5),"(i4)")ncol
      write(*,"(/,'b=')")
      write(*,trim(frmt))b
      write(*,*)

      write(*,*)"Please specify the format (for example, 5f12.6):"
      read(*,*)frmt
      frmt="(" // trim(frmt) // ")"
      write(*,"(/,'c=')")
      write(*,trim(frmt))c

      end

まず、ユーザーによって出力される列の数を定義します.
 Please specify the number of columns (default: 5):
  3      

例1では、配列aを印刷する.ここでは、Fortran 90が導入したwreiteオプションadvance='no'を用いて、印刷後に改行しないことを示す.このオプションは、Fortran 77コンパイラ(pgf 77、g 77など)には無効です.配列の要素が1つしか印刷されないたびに、データ番号が列数で割り切れる場合は、空のwriteコマンドを実行して改行します.出力は次のとおりです.
a=
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000      1.000000000000
      1.000000000000      1.000000000000

例2、配列bを印刷する.ここでは文字列frmtを用いて出力フォーマットを格納し,write文を用いてカスタムの整数列数を文字としてfrmtに印刷し,frmtが予め残した2番目から5番目の文字位置をユーザ定義の列数に変更する.上記の例ではfrmtを(3 f 1.3)に変更した.私たちは一般的に数列から数十列しか出力しないので、4文字の位置を予約するのは一般的に十分です.出力:
b=
      2.000      2.000      2.000
      2.000      2.000      2.000
      2.000      2.000      2.000
      2.000      2.000      2.000
      2.000      2.000      2.000
      2.000      2.000      2.000
      2.000      2.000

例3では、配列cを印刷する.この例は例2の拡張と見なすことができ,出力がより柔軟である.列数だけでなく、各要素の出力フォーマットもユーザーがFortranのフォーマットに従って定義します.例:
 Please specify the format (for example, 5f12.6):
    4d16.6        

それからFortran形式によって、前後のかっこをつけます.出力は次のとおりです.
c=
    0.300000D+01    0.300000D+01    0.300000D+01    0.300000D+01
    0.300000D+01    0.300000D+01    0.300000D+01    0.300000D+01
    0.300000D+01    0.300000D+01    0.300000D+01    0.300000D+01
    0.300000D+01    0.300000D+01    0.300000D+01    0.300000D+01
    0.300000D+01    0.300000D+01    0.300000D+01    0.300000D+01

ユーザがカスタマイズしたフォーマットが必ずしも文法に合致するとは限らない.正式なプログラムである場合は、writeにエラー判断を加えたほうがいいです.与えられたフォーマットの出力が実行できない場合は、デフォルトのフォーマットで出力します.
補足:CVFおよびIntelコンパイラでは、列の数を大きい番号と小さい番号で指定できます.例:
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      dimension a(20)

      ncol=5
      a=1.d0

      write(*,"(f12.6)")a

      end

出力:
    1.000000    1.000000    1.000000    1.000000    1.000000
    1.000000    1.000000    1.000000    1.000000    1.000000
    1.000000    1.000000    1.000000    1.000000    1.000000
    1.000000    1.000000    1.000000    1.000000    1.000000