fortran66のブログ

fortran について書きます。

【メモ帳】Fortran 2008 微改良

Fortran 2008 での文法微改良

文字列長を属性的に

%len で宣言長がとれる。

    program Console4
      implicit none
      character(10) :: c = 'abc'
      character(:), allocatable :: d
      print *, c%len, ':', c
      d = 'def'
      print *, d%len, ':', d
      d = d // 'inition'
      print *, d%len, ':', d
    end program Console4
          10 :abc
           3 :def
          10 :definition
続行するには何かキーを押してください . . .

allocatable 属性で可変的な文字列可能。

複素数成分を属性的に

%re, %im で実部・虚部がとれる。

    program Console5
      implicit none
      complex(kind(1.0d0)) :: c
      c = cmplx(0.1d0, 0.1d0)
      print *, c%re, c%im
      c = cmplx(0.1d0, 0.1d0, kind(1.0d0))
      print *, c%re, c%im
    end program Console5
  0.100000001490116       0.100000001490116
  0.100000000000000       0.100000000000000
続行するには何かキーを押してください . . .

落とし穴:cmplx は引数が倍精度でも、デフォルトでは単精度複素数を返す。(歴史的互換性から)

parameterized derived type の属性

デフォルト値を与えておくと省略可能。オプショナル引数的な扱い。

program Console6
  implicit none
  type :: t_test(kind, leng)
    integer, kind :: kind = 8
    integer, len  :: leng =10
    real(kind) :: x(leng)
  end type t_test
  type(t_test) :: a
  type(t_test(4)) :: b
  type(t_test(leng=5)) :: c 
  print *, a%kind, a%leng
  print *, b%kind, b%leng
  print *, c%kind, c%leng
  c = t_test(leng = 5)(1.0)
  print *, 'c='
  print *, c
end program Console6
           8          10
           4          10
           8           5
 c=
   1.00000000000000        1.00000000000000        1.00000000000000
   1.00000000000000        1.00000000000000
続行するには何かキーを押してください . . .

print * の時は、データ部のみ出力。

Introduction to Programming with Fortran: With Coverage of Fortran 90, 95, 2003, 2008 and 77

Introduction to Programming with Fortran: With Coverage of Fortran 90, 95, 2003, 2008 and 77

Modern Fortran Explained (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained (Numerical Mathematics and Scientific Computation)