fortran66のブログ

fortran について書きます。

【メモ帳】Jupyter fortran kernel 続き

メモ帳

github に上げてみましたが、仕組みをよく理解していません。
github.com

notebook 例題

github のページは TeX の数式が崩れる上に、BMP や GIF 画像は表示されないようです。よく分かりません。
github.com

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

%picture: コマンドを %image: に改名しました。この先画像 image に限らずなんでも突っ込めるのではないかと考え、MIME のタイプそのままにしておくのが合理的かと考えました。

今後の希望

Docker 化して Binder で起動できるようにしたいです。最小構成のようなものを探りたいです。

邪神ちゃんは、蛇のくせにおへそがあるので、爬虫類ではないようです。

【メモ帳】Jupyter Fortran Kernel

Fortran Kernel

せんべいを齧りながら考えた結果、結局どの道何らかのワーク・ファイルを経由しないと図は出せないので、Fortran の中から図を描くのは諦めて、素直にいったん結果を出力し、それを matplotlib で読み込むことにした。

ただ、いちいちカーネルを切り替えたりするのは面倒なので、オプションでセルの入力を python の eval/exec コマンドで実行することにした。しかし、困ったことに fig = plt.figure() や imgdata = BytesIO() のような、ポインタを取ってくるような命令は eval/exec ではうまく機能しなかったので、これらはカーネルにべた書きすることにした。したがって matplotlib.pyplot と numpy は、それぞれ慣例にのっとって plt, np で import しておくことにし、fig という変数は予約変数として、これで plt.figure のポインタを取っておくことにする。

ポインタを取ってこれない理由はよく分からないが、さもありなんという感じはする。ただ、PIL (pillow) の im = Image.open(fn) は機能するので、区分がよく分からないが、Python 自体が全く分からないので、分からなくてもしょうがないw

f:id:fortran66:20180916224208p:plain


ついでなので、コンパイラを選べるようにしてみた。単に、名前を変えるだけだけなので、拡張子とセットで変えれば、一定の規約下のコンパイラなら何でも行ける気もする。

f:id:fortran66:20180916224230p:plain

TAB と Space が混在してしまったせいで、蛇にむちゃくちゃ怒られた。インタープリタだから、その行が実行されるまでエラーを黙っているので、ゲス蛇ホントむかつくw

以下の記事は、大変ためになりました。感謝感激雨あられ
ipython-books.github.io

[追記] gcc 可能

FORTRAN77 形式を可能にするには拡張子を .f / .for にしなければならないので、拡張子も変えられるようにした。結果的に gcc + .c の組み合わせでも実行できることが確認できた。

%fig: オプションの場合、fig 等の内部変数が、eval/exec で書き換え可能になっているので、python の慣例に従ってアンダースコアを手前につけておくことにした。

もう少し debug したら、うpしてみたい。
f:id:fortran66:20180917022444p:plain

Ipython Interactive Computing and Visualization Cookbook - Second Edition

Ipython Interactive Computing and Visualization Cookbook - Second Edition

【メモ帳】Jupyter, Forpy, Fortran kernel, inlilne の続き

forpy から inline 命令出せない?

IPython.core.getipython.get_ipython().magic('matplotlib inline') によって、実行命令で inline マジックコマンドが発行できるかとも思ったが、出来ない模様。

Module: core.getipython — IPython 6.5.0 documentation

IPython.core.getipython.get_ipython() で戻り値が None になっているので、Jupyter の中で動いているとはいえ、forpy は独立した Python 処理系で動いているのだから、Ipython のインスタンスが取れなくても当然のような気がする。したがって、forpy からの呼び出しで inline 化は出来ないような気がする。
f:id:fortran66:20180915010922p:plain
Python Kernel の場合
f:id:fortran66:20180915135232p:plain

import IPython.core.getipython
ip = IPython.core.getipython.get_ipython()
ip.magic('matplotlib inline')
print(ip)

<ipykernel.zmqshell.ZMQInteractiveShell object at 0x0000020B2527DDD8>

もっとも、CMD 窓の サーバーのメッセージには ZMQ は closed channel にデータ受けたとかメッセージを返しているので、別の手法で乗り越えられるのかもしれない。

画像 inline 表示について

なお、ファイルの画像は MIME type を変えるだけで、png/gif/jpeg/bmp なんでもござれと分かった。拡張子を写せばいいが jpg だけは jpeg

よく分からないが、タグで適切に修飾して send_response というサブルーチンに文字列を渡せば、ブラウザの受信になる模様。ASCII化した画像のみならず平文テキストからなんでも同じ。notebook には、これが溜まってゆくので画像などがあるとサイズが膨らみそう。

IDL kernel から丸写し

        #plot figure 
        tmp = magics['fig']
        if p.returncode == 0 and os.path.exists(tmp[0]):
            _, ext = os.path.splitext(tmp[0])
            ext = ext[1:]
            if ext == 'jpg': # MIME type
                ext = 'jpeg'
            image_type = 'image/' + ext
            image = open(tmp[0], 'rb').read() 
            data = {image_type: b64encode(image).decode('ascii')}
            self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})

            if tmp[0] == 'tmp.png':
                os.remove('tmp.png') 

Magic コマンド

coarray fortran kernel から丸写し

    def _filter_magics(self, code):

        magics = {'fcflags': [],
                  'ldflags': [],
                  'module': [],
                  'args': [],
                  'fig': ['tmp.png'],
                 }

        for line in code.splitlines():
            if line.strip().startswith('%'):
                key, value = line.strip().strip('%').split(":", 1)
                key = key.lower()
                
                if key in ['ldflags', 'fcflags', 'args']:
                    magics[key] = shsplit(value)
                elif key in ['module', 'Module']:  
                    magics['module'] = shsplit(value)
                    magics['ldflags'].append('-c')
                elif key in ['fig', 'Fig', 'figure', 'Figure']:  
                    magics['fig'] = shsplit(value)
                else:
                    pass # need to add exception handling
        
        return magics

HTML 部分

本当は carriage control のように先頭1文字目だけで指定したい><;

    def _write_to_stdout(self, contents):
        if contents[0:6] == '<HTML>':
            data = {'text/html': contents}
            self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})
        else:      
            self.send_response(self.iopub_socket, 'stream', {'name': 'stdout', 'text': contents})

f:id:fortran66:20180915020651p:plain

Classical Fortran: Programming for Engineering and Scientific Applications, Second Edition

Classical Fortran: Programming for Engineering and Scientific Applications, Second Edition

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran: Style and Usage

Modern Fortran: Style and Usage

Modern Fortran in Practice

Modern Fortran in Practice

Numerical Computing with Modern Fortran (Applied Mathematics)

Numerical Computing with Modern Fortran (Applied Mathematics)

Modern Fortran: Tricks of the Software Engineering Trade (Chapman & Hall/CRC Computational Science)

Modern Fortran: Tricks of the Software Engineering Trade (Chapman & Hall/CRC Computational Science)

【メモ帳】Jupyter Lab Fortran Kernel で inline plot ムズイ

forpy と Jupyter Lab と Fortran Kernel

forpy を用いることによって、Fortran から python を呼び出して matplotlib の図を backend:WebAgg で別のブラウザタブには書き出せるが、show のところで inline 出力にするやり方が分からない。Backend を変えただけでは、Figure (640x480) 的なテキストメッセージは出るが絵は出ない。

一度、外部ファイルに書き出したうえで、Kernel の方の処理で inline に出すやり方は分かった。画像などは一度 png などにしてから base64 で ascii 文字?に変換して HTML 的に送り込んでいる。WEB 関連の知識がないのでわけわかめ

BMP や GIF は Fortran から直接吐けるので、外部ファイル書き出し形式なら Kernel とセットで対応すれば Forpy 無しでも inline 図はゆけるだろう。

メモ帳

  • chcp 437 で英語モードにする(Windows)
  • matplotrc で backend : module://ipykernel.pylab.backend_inline(環境変数でも行ける?)
  • kernel.py に付加

このチュートリアルが一番簡単そうだが、幼女には難しい。
ipython-books.github.io

  • HTML (文字列を HTML 解釈で出力)

contents は文字列。

        data = {'text/html': contents}
        self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})

tmp.png というファイルがあったら無条件に出力して消す。IDL kernel から丸パクリw

        #plot figure 
        if p.returncode == 0 and os.path.exists('tmp.png'):
            image = open('tmp.png', 'rb').read() 
            display_data=[]
            display_data.append({'image/png': b64encode(image).decode('ascii')})

            for data in display_data:
                self.send_response(self.iopub_socket, 'display_data',{'data':data,'metadata':{}})

            os.remove('tmp.png') 

github.com

出力例

f:id:fortran66:20180913211929p:plain
sin カーブまで蛇に見えてきた!蛇むかつく!

【ニュース】Intel Fortran Ver.19 Initial Release 出る!

Intel® Parallel Studio XE 2019

まだベータテスト終了まで1か月くらい残っていますが、Initial Release が出ました。

言語新機能は、ベータと変わりなしの模様。

Fortran 2008 and Fortran 2018 Feature Summary

The Intel® Fortran Compiler now supports all features from the Fortran 2008 standard. The Intel® Fortran Compiler also supports features from the proposed draft Fortran 2018 standard. Additional features will be supported in future releases. Features from the proposed Fortran 2018 standard supported by the current version include:

  • Assumed type (TYPE(*))
  • Assumed rank (DIMENSION(..))
  • Relaxed restrictions on interoperable dummy arguments
  • C include file ISO_Fortran_binding.h for use by C code manipulating “C descriptors” used by Fortran
  • Coarray events
  • Intrinsic function coshape
  • Default accessibility for entities accessed from a module
  • Import Enhancements
  • All standard procedures in ISO_C_BINDING other than -C_F_POINTER are now PURE

software.intel.com

去る者は日々に疎しコーナー

IMSL、 Win8、IA32、Xeon Phi 

Me-Vista-Win8 の呪われた系図

32bit には早く去って欲しいが、Fortran 的には Integer と real の語長一致の掟に抵触する・・・

Phi は要らない子!

Support Removed
Rogue Wave* IMSL* is no longer available directly from Intel
Rogue Wave* IMSL* Fortran Numerical Library is no longer available directly from Intel. It can be obtained directly from Rogue Wave* or Rogue Wave* resellers.


Microsoft Windows 8.x* is not supported
Microsoft Windows 8.x* is not supported with Intel® Parallel Studio XE 2019.


IA-32 host installation is not supported
Support for installation on IA-32 hosts was removed in Intel® Parallel Studio XE 2018.


Intel® Xeon Phi™ x100 product family coprocessor (formerly code name Knights Corner) is not supported
The Intel® Xeon Phi™ x100 product family coprocessor (formerly code name Knights Corner) was officially announced end of life in January 2017. As part of the end of life process, the support for this family will only be available in the Intel® Parallel Studio XE 2017 version. Intel® Parallel Studio XE 2017 will be supported for a period of 3 years ending in January 2020 for the Intel® Xeon Phi™ x100 product family. Support will be provided for those customers with active support.

【メモ帳】deep copy / shallow copy

Fortran の派生型中の動的割り付け成分の代入時の動作差

派生型中に、動的な配列を定義することができますが、allocatable で定義するか、pointer で定義するかで、代入時のコピーのされ方に違いが出ます。

allocatable の場合は、内容丸ごとコピーですが、これに対して pointer の場合は、(当然ですが)動的に確保した記憶領域の番地情報だけがコピーされます。つまり allocatable の場合は deep copy 、pointer の場合は shallow copy となります。

したがって、pointer で確保した場合は、派生型内の動的配列の実体は一つなのでその内容をいじると、代入した他の派生型変数でもその内容が変化します。一方、allocatble の場合、動的配列は新しく確保されて内容が写されるので変化しません。

代入コストから考えると pointer の場合はコストが小さいですが、allocatable の場合は新たにメモリー領域を確保したうえで内容を写し取るので、コストが大きいと言えます。

実行結果

 allocatable component : deep copy
          10           1           2           3           4
          10           1           2           3           4
          10         101         102         103         104
          10           1           2           3           4
 
 pointer     component : shallow copy
          10           4           3           2           1
          10           4           3           2           1
          10         100          99          98          97
          10         100          99          98          97

プログラム

        program test
            implicit none
            type :: t_alloc
                integer :: n
                integer, allocatable :: ia(:)
            end type t_alloc
    
            type t_point
                integer :: n
                integer, pointer :: ip(:)
            end type t_point
        
            type (t_alloc) :: a, b
            type (t_point) :: p, q
            a = t_alloc(10, [1, 2, 3, 4])
            b = a
            !
            print *, 'allocatable component : deep copy' 
            print *, a%n, a%ia
            print *, b%n, b%ia
            a%ia = [101, 102, 103, 104]
            print *, a%n, a%ia
            print *, b%n, b%ia
            !
            print *
            print *, 'pointer     component : shallow copy' 
            p%n = 10
            allocate(p%ip(4), source = [4, 3, 2, 1])
            q = p
            print *, p%n, p%ip
            print *, q%n, q%ip
            p%ip = [100, 99, 98, 97]
            print *, p%n, p%ip
            print *, q%n, q%ip
        end program test

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

【寝言】色々

CODE Q&A

Fortran 関係の記事が増えていました。かなり前の Stack Overflow の Q&A などを自動翻訳しているようです。

fortran | CODE Q&A 問題解決 [日本語]

GNU Fortranコンパイラ | GNU Fortran 7 入門リファレンス | CODE Q&A 問題解決 [日本語]

ホストがさくらインターネット上のサーバーなので、日本人がやっているのでしょうか?機械翻訳のテストでしょうか?

以前の Fortran 講座の翻訳は悪くなかったので復活させてくださいw

[追記]コメントをいただきました。

id:septcolor7

> Code Q&A

Stack Overflow 本家の各言語のreputationの高いQ&Aなどを自動翻訳して、ページビュー+広告クリックで稼ぐタイプのサイトに見えます。例えば、Fortranですと

https://stackoverflow.com/search?q=fortran

の内容の機械翻訳な事が一発で分かります。

4:20 イーロン・マスク

$420 で自社株買いをするといった時点で、悪ふざけと分かる。

420、4:20若しくは4/20(フォー・トゥエンティ, four-twenty)は、大麻を表すスラングアメリカ合衆国大麻のカルチャーにおいて、420という番号は、大麻の消費と関連して用いられる。

420 (大麻) - Wikipedia

【乞食情報】O'Reilly 無料本

絶版本

www.oreilly.com

Fortran 本二冊が絶版になっているので、無料で公開してくださいw

shop.oreilly.com

shop.oreilly.com

豆本

www.oreilly.com

オウムの言葉をしゃべる事

礼記の曲礼に「鸚鵡能言不離飛鳥、猩猩能言不離禽獣」という句があるらしく、少なくとも前漢西漢)以前に鸚鵡が人語をしゃべることが分かっていた模様。 (狩野直喜「漢文研究法」p.164)

漢文研究法: 中国学入門講義 (東洋文庫)

漢文研究法: 中国学入門講義 (東洋文庫)

この本の「漢文研究法」では、素人にプロも持ってない絶版全集を座右にそろえろとか無茶苦茶ハッスルしすぎてひどいw 「経史子概要」には、武内義雄の本にもある学問の伝授表(樹形図グラフ)がすでに表れている。

p.143 の易の章で『其の起源多くの野蛮人種に行わる「リビネ―ション(divination)」の類にして』とあるが、ディヴィネーション(占い)の誤りと思われる。

www.youtube.com