fortran66のブログ

fortran について書きます。

Fortran2003

配列の一括操作

Fortran での配列 Fortranの配列は、等質なデータがメモリ上に連続的に等間隔に並んでいるものに対応しています。何かの次に何かがあるという順序数に対応する一次元リスト構造のイメージより、等質なものが規則的に並列に並んでいるイメージに近いと思いま…

エイトクィーン問題ふたたび

エイトクィーンの解を配列の配列に保存するようにします。以前はI/Oで出力しておりました。 参照 2012-05-19 8クイーン http://d.hatena.ne.jp/fortran66/20120519 2012-12-19 配列の配列 http://d.hatena.ne.jp/fortran66/20121219再帰を使うと簡潔に書け…

エラトステネスのふるい

昔のをもう少し整理しました。1からnmaxまでの整数列を生成するところでスタックがすぐあふれるのが難点。 素数は小さい方から逐次求めるので普通のDO..LOOPを、ふるいで表を埋めるのは順序に依らないのでコロン三つ組みを用いることにします。 実行結果 2 …

リスト構造のようなもの

配列の配列が欲しくなる時があるのですが、実行時にしかサイズの決まらない場合 Fortran では面倒になります。ポインタを使ってリスト構造を定義してもいいのですが、Fortran の世界ではポインタを使ったら負けに近いので、動的確保や後処理とかをちゃんとや…

Sn(3)群

群の積を中値演算子 .o. と定義。逆演算子は単項演算子にしてもいいが関数のままに。f2008の findloc 関数が使えると便利なんですが、無いので do..loop にて処理。 実行結果 : 1 2 3 4 5 6 - 1: 1 2 3 4 5 6 2: 2 3 1 5 6 4 3: 3 1 2 6 4 5 4: 4 6 5 1 3 2 …

ANSI ESCAPE SEQUENCE の利用

16bit DOS窓の時代は、ANSI.SYS を config.sys で読み込むことで、ANSI ESCAPE SEQUENCE が利用できたわけですが、32bit 対応になったあたりから ANSI.SYS が使えなくなっていました。 しかしながら UNIX系のターミナルではまだ ANSI ESCAPE SEQUENCE が使わ…

new Parallel Programming Features in Intel(Visual) fortran Composer XE

Intel の広報誌に Steve Lionel が、do concurrent と coArray について記事を書いています。なぜ forall が要らない子で、do concurrent が導入されたのか歴史的経緯から軽く書いてあります。 http://software.intel.com/sites/default/files/parallel_mag_…

Fortran2003 and beyond

結構前(2005年)のものなのですが、Fortran2003(及び若干 Fortran2008)の新機能がまとめられている記事がありました。CRAYの資料のようです。 スライド https://cug.org/5-publications/proceedings_attendee_lists/2005CD/S05_Proceedings/pages/Authors/L…

配列の配列のテスト

配列の配列を作りたいのですが、allocatable 属性ではうまくゆかないようで、pointer を使わないといけないようです。pointer を使ったら負けのような気もしますが、負けるが勝ちということで・・・ class(*)の万能 pointer を使いところですが、debugがめん…

マーナハン・中山の式

Murnaghan の読み方が分からりませんが、たぶんゲール系の名前でマーナハンと読むのではないかと思われます。マーナハン・中山の式を用いると、対称群の指標が機械的に簡単に求められます。多分マーナハンは代数的な方法を、中山が図形的な方法を示したと思…

Kostka数の変換行列を出力

Kostka数計算プログラムを Schur関数と単項対称式間の変換行列を出力する様に改造しました。 出力結果 λ = 6 までは文献によってチェック済み。 |λ| = 1 1 [ 1 ] 1 |λ| = 2 1 [ 2 ] 2 [ 1 1 ] 1 1 0 1 |λ| = 3 1 [ 3 ] 2 [ 2 1 ] 3 [ 1 1 1 ] 1 1 1 0 1 2 0 …

Kostka number

あるヤング図に対応する半標準ヤング盤から特定の項を抜き出して個数を数えると、シューア関数と単項対称式の変換行列の行列要素が得られます。この数をコストカ数と言います。特定の項の抜き出しは、単項対称式式に対応する半標準ヤング盤を指定することで…

Semi-Standard Young Tableau

半標準ヤング盤では、マスを埋める数字に重複が許されます。 半標準ヤング盤はシューア関数との関係を深く持っています。半標準ヤング盤が得られれば、シューア関数の単項式による展開が得られます。 http://www.mth.msu.edu/~sagan/Papers/Old/schur.pdf シ…

Robinson-Schensted correspondence

対称群(置換群)の規約表現はヤング図で表わされますが、各々の置換も、標準ヤング盤二個の組で表すことができます。その組は Robinson と Schensted による非常に単純なアルゴリズムに依って求められます。その求め方は bumping とも言われますが、次々と…

Standard Young Tableaux

標準ヤング盤の生成を考えます。以前、整数の分割を行いましたが、それはヤング図に対応しています。その時と似たようなやり方を取ることにして、配列をスタックのように用います。 あまりよく考えていないので、まだ冗長かと思います。この先、半標準ヤング…

IEEE 丸めモードで区間演算の代用

数値的に不安定な古典的な例として有名なヒルベルト行列の逆行列計算を、丸めモードを変えて計算してみます。 IEEE7754 の丸めモードの切り捨てと切り上げが、区間演算の下限と上限のようなものとして代用できるというアイデアを試してみます。 近接値への丸…

Introduction to Modern Fortran

ここの講義ノートが重箱の隅をつついていて結構面白いです。 http://people.pwf.cam.ac.uk/nmm1/Fortran/文字配列のメモリー上での置かれ方なんて考えたことがありませんでしたが、文字長が余分な配列の RANK として最内に加わった感じになっているそうです…

eight queens

昔、PASCALの再帰を使った例題でよく出ていた eight queens 問題を解いてみます。前回の整数並べ替えの列挙を変形して利用します。配列の i 番目の要素が i 列目での queen の存在する行を指していると解釈します。 すでに飛車道を消した形になっているので…

順番付並べ替えの列挙

1からnまでの整数の順番付並べ替えを、再帰を使って列挙します。 実行結果 ソース・プログラム [list1, list2(i)], pack(list2, list2 /= list2(i)) この行では、list2 から要素を一個取り出して消して、list1 に加えています。配列をリストとして用いてい…

move_alloc を用いた整数の分割

昨日のバージョンでは、整数の分割は画面出力されるだけで、データとして値を返していませんでした。これを配列の配列として返すことを考えます。整数配列を要素として持つ構造体を返すことにします。 返り値となる割り付け配列の大きさを増加させていくため…

整数の分割

以前整数の分割数 p(n) を漸化式によって求めましたが、今回は分割そのものを求めることにします。 再帰を使った導出法は、富田氏による 『Fortran90プログラミング』例題8.10を参考としました。以下のプログラムでは、配列生成子 [ ] を用いて、サブルーチ…

OOP 的な用法で粒子の散乱

計算は手抜きのオイラー法で。話を散乱対を含む二次元面内に限定します。 実行結果 中央付近の四角い枠の中心に固定された正の点電荷があるとき、左側から縦の位置を乱数で決めた、右に水平に同じ速度を持つ荷電粒子を同時に発射したときの散乱のようすです…

Modern Fortran 入門用文書

最近、Modern Fortran という単語を見かけるようになってきました。Fortran2003 までは書名などに、FORTRAN66、FORTRAN77、Fortran90、Fortran95、Fortran2003というような規格名が使われてきましたが、Fortran2008 の代からは Modern Fortran という語が多…

OOP 的な win32 plotter routine

自分の昔のプログラムを見ていたら callback routine (MainWndProc) へスレッドローカル記憶域(TLS)を使ってパラメータを渡していました。昔の自分の真似をして問☆題☆解☆決!基底クラスの動的変数を、win32 型で領域確保して図を描いています。それぞれの…

MASKオプションのある組み込み関数

配列操作とBit操作との対応のあるもの(フラグ関連) all iall any iany parity iparity merge imerge_bits count popcnt*1 配列の位置にかかわるもの maxloc minloc maxval minval findloc 演算にかかわるもの sum product フィルター関数 pack unpack 参考…

select type

万能型 class(*) と select type による処理。F90でせっかく型チェックを厳しくしたのに、OOPのせいでまたゆるゆるにwww 実行結果 ソースプログラム program test implicit none class(*), allocatable :: d integer :: i allocate(real(8)::d) do i = 1,…

allocatebleな文字型変数の文字列長のallocateについて

F2003からできるようになりました。 出力結果 ソースプログラム program test_challoc implicit none character(len=:), allocatable :: d(:) allocate(character(len = 10)::d(5)) print *, len(d), size(d) stop end program test_challoc

Windows窓絵もOOPで。

やっつけで。Win32窓用のコールバックルーチン等への変数の受け渡し方がきれいにかけてません。 intel fortran の問題だと思いますが、構造体の要素として構造体を持つ場合の生成子でコンパイラのエラーが出ます。Win32で実行時に表示されるwindowの図。 フ…

HTML5 canvas 書き出しをオブジェクト指向化

module m_oop implicit none type, abstract :: t_device character(len = 80) :: title = 'Plotter' integer :: nsize_x = 640, nsize_y = 480 contains procedure (device_on), deferred, pass :: on procedure (device_off), deferred, pass :: off proce…

Householder法による三重対角化

昔Householder法とQR法のサブルーチンを外人からもらいましたが、EISPACKの tred と tql で F66 で書かれていました。のちに Numerical Recipes の F77 版に置き換えたけれども、基本的に LAPACK のものだと思います。微妙に変えてあって、tql は旧版で収束…