fortran66のブログ

fortran について書きます。

【寝言】大掃除 ♪あぁ阿部さん 今何をしてますか~

くそみそ

大掃除をしていたら、ゴミの中から阿部さんの絵がw 方眼紙で座標を読んでいてマメですね。

f:id:fortran66:20201229224120j:plain

fortran66.hatenablog.com

fortran66.hatenablog.com

そんなわけで、年末大掃除も全然片付かずクソミソな結果に終わってしまった・・・

ウホッ!!いい男たち~ヤマジュン・パーフェクト

ウホッ!!いい男たち~ヤマジュン・パーフェクト

  • 作者:山川 純一
  • 発売日: 2003/11/01
  • メディア: コミック

くそみそテクニック グラス 阿部さん

くそみそテクニック グラス 阿部さん

  • 発売日: 2014/08/17
  • メディア: おもちゃ&ホビー

Manning 電子版から紙版への upgrade

サポートにメールすると $12 + 送料($10~)で紙版が買えるクーポンを送ってもらえます。

I purchased an eBook from manning.com, can I upgrade to the print version?

Yes! The cost to upgrade from an eBook to a pBook is only $12 + shipping. Simply write to support@manning.com with your order number or the email you used to purchase the eBook and we will send you an upgrade code. Upgrades are only available to original customers who purchased the eBook at manning.com, and cannot be combined with other discount offers.

www.manning.com

Modern Fortran: Building efficient parallel applications

Modern Fortran: Building efficient parallel applications

  • 作者:Curcic, Milan
  • 発売日: 2020/11/24
  • メディア: ペーパーバック

【メモ帳】intel fortran の Fortran 2018 機能 その他

implied do loop の局所スコープの bug

    program F2018
        implicit none
        integer, allocatable :: m(:)
        
        m =  [(i, integer:: i = 1, 10)]
        print *, m
        
    end program F2018

この単純な形でコンパイル時の syntax error が出る。

loop.f90(5): error #6404: This name does not have a type, and must have an explicit type.   [I]

しかし、implicit none を外したり integer :: i の宣言を入れるとコンパイル通る。

    program F2018
!        implicit none
        integer, allocatable :: m(:)
        
        m =  [(i, integer:: i = 1, 10)]
        print *, m
        
    end program F2018
           1           2           3           4           5           6
           7           8           9          10

forall の時も同じことをやっているので Intel 進歩してない。多分チェックプログラムに implicit none を付けてないw implicit none の場合は integer(8) にすると変数 i はちゃんと 8 byte になるが、implicit none ; integer :: i で 4byte 変数として宣言してあると、implied do loop 中で 8byte 宣言しても 4byte 変数となって overflow するキチガイ挙動w

    program F2018
      !  implicit none

        integer(8), allocatable :: m(:)
        
        m =  [(i, integer(8):: i = 10_8**10, 10_8**10 + 10)]
        print *, m
        
    end program F2018
           10000000000           10000000001           10000000002
           10000000003           10000000004           10000000005
           10000000006           10000000007           10000000008
           10000000009           10000000010
    program F2018
      !  implicit none
        integer :: i
        integer(8), allocatable :: m(:)
        
        m =  [(i, integer(8):: i = 10_8**10, 10_8**10 + 10)]
        print *, m
        
    end program F2018
            1410065408            1410065409            1410065410
            1410065411            1410065412            1410065413
            1410065414            1410065415            1410065416
            1410065417            1410065418

大室家4巻

大室家4巻 特装版の付録はみさきち話で私的にイマイチ。小学生世代では、こころちゃんが好き。

なお公式略語も OMRK と先頭の母音以外は母音を抜いて子音を並べる FORTRAN の変数名づけのようで好ましい。

先生たちの方は、まだこれからか・・・

補足

Fortran 2018 とは関係なくて Fortran 2003 水準での話ですが、implied do loop そのままだと loop 変数の値が残るのに、これを配列構成子の中に置くと、loop 変数の終了値が残らないという不思議。gfortran でもそうなっているので規格上の挙動なのでしょうか・・・?規格を調べる気力が起きないです。

(配列構成子を (/.../) にすれば Fortran90 水準の話の気もします。そのうち調べたいです。)

[補足 R5.6.6] MFE 赤本 §23.9 に array constructor と data 文中の implied do loop は limited scope を持つが、入出力文中の implied do loop はそうではないと書いてありました。

program Hello
        i = 99
        print *, i
        print *, (i, i = 1, 10)
        print *, i

        i = 99
        print *, i
        print *, [(i, i = 1, 10)]
        print *, i
end program Hello

一個目は loop を抜けた後で i=11 になっているのに、二個目は loop を抜けても loop に入る前の値の i=99 を保っている。

$main
          99
           1           2           3           4           5           6           7           8           9          10
          11
          99
           1           2           3           4           5           6           7           8           9          10
          99

【メモ帳】Fortran 2018 の配列 reduce (汎)関数

配列 reduction

Fortran 90 で配列 reduction 関数として、sum(), product() 等が与えられましたが、Fortran 2018 規格ではユーザー定義の reduction 演算を行う reduce 汎関数が導入されました。ここで配列 reduction とは演算の結果として、配列の次元 rank が減るような演算を行う操作を指します。

引数としては、被演算配列と結合則を満たす pure な2項演算関数を取ります。reduce 汎関数と書いてみたのは、関数を引数として取って数値を返り値として返すからです。(まぁ Fortran 文法上は、関数と書いてもばちは当たらないと思います。)

なお、ここでいう結合則は数学的な形式上の結合則で、浮動小数点数では厳密にいえば実数で成り立つ様々な結合則が成り立たたないわけですが、それは気にしなくていいそうです。

最近無料化された intel fortranFortran 2018 に完全準拠したと嘯いているので、以下で試してみます。

実行例

一例として積の modulo 演算を取るものを以下に示します。modulo 演算は最後に一回だけ余りをとっても、途中で演算ごとに余りをとっても結果は変わらないはずですが、積の途中で overflow すると困るので積を取るごとに余りを取りたいことがあります。reduce 汎関数を使うと、これを簡潔に書けます。

ソース・プログラム

規格では pure 関数は module (大域)変数に依存しても良いです。ただし、演算中にその module 変数が書き換えられてはならない条件付きで。

    module test_m 
        implicit none
        real :: r = 60.0
    contains
        pure real function f(a, b) result(res)
            real, intent(in) :: a, b
            res = mod(a * b, r)
        end function f
    end module test_m
    
    program F2018
        use test_m
        implicit none
        print *, reduce([9999.,1213.,33333.], f)                         !Fortran 2018
        print *, mod(mod(9999. * 1213., 60.0) * 3333., 60.0) 
        print *, mod(product([9999.,1213.,33333.]), 60.0)
        
        stop 999, quiet = .true.            !Fortran 2018
    end program F2018

実行結果

三番目の結果が一致しないのは、単精度仮数部が overflow して下の方の桁が切り捨てられたためだと思います。 想定通りの結果が得られたのではないかと思います。

   51.00000
   51.00000
   36.00000

【乞食速報】XcalableMP PGAS Programming Language 無料!

Springer free access

本邦発の Coarray Fortran とも共存できるコンパイラ・ディレクティブ型の言語拡張です。

HPF の流れを汲むものではないかと思います。

www.springer.com

XcalableMP PGAS Programming Language: From Programming Model to Applications

XcalableMP PGAS Programming Language: From Programming Model to Applications

  • 発売日: 2020/11/20
  • メディア: ハードカバー

冬至木星土星大接近

今日は至点の一つ冬至で太陽復活の日と思うとエクスタシーを感じます。

夕空には木星土星が大接近して輝いていました。キリストが生まれた頃も木星土星が大接近していた説がありますが、今日もどこか西方の馬小屋で救い主が誕生か。

厩焚 郷党第十

武内義雄の「論語之研究」は岩波書店刊だけれども、戦後版も支那の語を残しています。

郷党篇最後の「山梁雌雉云々かんぬん」の章は、意味不明でわけわかめな章ですが、私はあらかた竹簡の最後の方がちぎれて適当に余ったものをくっつけたのではないかと思っていました。皇侃の論語義疏によると孔家壁中から出た古文にはこの章が無かったということらしいので、まぁもっともな気がします。(110頁、248頁)

昔は漫画や雑誌を読みまわしたりしていると前や後ろの方がちぎれて、話が途中から始まって結末も分からんということがよくありましたが、竹簡もちぎれていいのではないかと思いますw

【ニュース】M1 用の gfortran その他

M1 Mac 用 gfortran のバイナリ

gfortran11 のバイナリがあるようです。 hpc.sourceforge.net

元ネタ

追記 【メモ帳】M1 Mac で Fortran - fortran66のブログ

fpm Fortran で記述

FPM (Fortran Package Manager) が Fortran で書かれるようになったようです。ナイス! 以前のものは Haskell のインストールだけでウザかった。

github.com

Intel Fortran 無料化?

今年の分の年貢を納めたわたくしの立場は?w 租庸調!

図書館

大学院生諸君はこの辺の本を図書館の購入希望図書に書いて、本棚での Fortran のプレゼンスを高めるべき。

Modern Fortran: Building efficient parallel applications

Modern Fortran: Building efficient parallel applications

  • 作者:Curcic, Milan
  • 発売日: 2020/11/24
  • メディア: ペーパーバック

【寝言】ニイタカヤマノボレ

太陽

ひとふたまるはち。

冬至まではまだですが、日没時間が一番早くなっています。近頃、日が暮れるのが早くて侘しさ溢れます。

最近、黒点がよく出ているようで、極小を確かに超えたようです。

swc.nict.go.jp

【メモ帳】M1 Mac gfortran 近況など

gfortran

ネットに流れていたニュースによると、Julia 方面の Fortran 問題は解決に向かったとかで、関連して gfortran の情報も流れていましたのでメモしておきます。

チェックリストでは解決済みになっております。 github.com

github.com

私的分岐 github.com

元々アップルは GNU コンパイラ群に非協力的で llvm に乗っていたので長期的にはどうなるのか。

Cole Porter

なんとなく流して聞いていたら、マレーネ・ディートリッヒの歌声が聞こえてきてちょっとツボに入ってしまったw Marlene Dietrich You Do Something To Me


The Words and Music of Cole Porter: #1920s, #30s, 40s (Past Perfect) #Composer

最近の YouTube は広告がうざくてしょうがないけれど、あんまり弾き過ぎると、Google とかならそのうちバラードのSFばりに可聴域外で識域下への直接広告とかやりかねないから、じっと我慢の子であったw