トップ «前の日記(2010-06-30) 最新 次の日記(2010-07-20)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2010-07-06 [長年日記]

_ [SAD]備忘録

  • /tflagscom/ common blockを tmacro_flags moduleへ取り込む(実装の近代化)
    • equivalenceなシンボルはすべてlogical型なので implicit noneしていないコンテキストでもコンパイルエラーで捕まえられるので作業自体は楽なはず
  • RECURSIVEキーワードの導入(実装の近代化)
    • -fcheck=recursionで runtimeカバレッジを取れる所から随時
    • Fortranコードに対する static analysis toolが欲しいところ
  • RADIUS ApertureをNOSPAC時にも適用する(仕様変更)
    • コードの展開最適化(特にdrift/solenoid時の運動量再計算の削除)
    • Aperture codeの見直し
      • Markと Sweepに分離する(Markは Apertureの定義に依存するが、Sweepは共通化できる)
        • Sweep Logicから Particle Loss Map生成 or 汎用Callbackを設ける(NPARA時の同期機構を考慮すること)
      • Lost positionの情報を粒子分布に付帯する(kbtblを拡張するのが適当か?)

_ [SAD][Fortran]バグなのか仕様なのか

equivalence宣言された publicな module変数の参照であるが、 直管に反する動作をしている模様。

      module tmacro_flags
      implicit none
      private

      public tflag_get, tflag_set, tflag_reset

      logical, public :: flags(3), rad, rfsw, radcod

      equivalence (flags(1), rad)
      equivalence (flags(2), rfsw)
      equivalence (flags(3), radcod)

      contains

      logical function tflag_get()
      implicit none
      tflag_get = flags(2)
      return
      end function tflag_get

      subroutine tflag_set()
      implicit none
      flags(2) = .true.
      return
      end subroutine tflag_set

      subroutine tflag_reset()
      implicit none
      flags(2) = .false.
      return
      end subroutine tflag_reset

      end module tmacro_flags

      subroutine reset
      use tmacro_flags, only: tflag_reset
      logical exist
      call tflag_reset()
      end subroutine

      subroutine set1
      use tmacro_flags, only: tflag_set
      logical exist
      call tflag_set()
      end subroutine

      subroutine set2
      use tmacro_flags, only: rfsw
      rfsw = .true.
      end subroutine

      subroutine test0
      use tmacro_flags, only: tflag_get
      write(*,*) 'Test0: rfsw = ', tflag_get()
      end subroutine

      subroutine test1
      use tmacro_flags, only: rfsw
      write(*,*) 'Test1: rfsw = ', rfsw
      end subroutine

      subroutine test2
      use tmacro_flags, only: flags, rfsw
      write(*,*) 'Test2: rfsw = ', rfsw
      end subroutine

      implicit none

      call reset()
      call set1()
      call test0()
      call test1()
      call test2()

      call reset()
      call set2()
      call test0()
      call test1()
      call test2()

      end

なぜかflags(2)のequivalenceであるrfswの参照結果が、flagsシンボルを 取り込むかどうかで変化している(gfortran 4.6.0 2010/07/03)

Test0: rfsw =  T
Test1: rfsw =  F
Test2: rfsw =  T
Test0: rfsw =  F
Test1: rfsw =  T
Test2: rfsw =  F

しかも、equivalence文の順序を入れ替えて rfswを最後にすると

Test0: rfsw =  T
Test1: rfsw =  T
Test2: rfsw =  T
Test0: rfsw =  T
Test1: rfsw =  T
Test2: rfsw =  T

となり、期待通りに動く。 なんとなく、gfortranのバグのように思えるのだが...

NAGだと動く

ようなので、gfortranの実装バグの可能性が高い...


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記