投稿

2月, 2009の投稿を表示しています

SPHEREPACK

07/10/06 19:51

SPHEREPACKはLegendre変換をするFortranライブラリ.
Mac OS X上でg95を使ってコンパイルして使っている。

解像度変換のユーティリティルーチンtrssph()が配列サイズが大きいときにNaNを返すことがある。試した範囲では、288×145を1200×600にするのは大丈夫で、1440×720にするのはだめだった。 メモリ節約のため、trssph()は、Legendre陪関数を逐次計算するサブルーチンsphcom.fにあるlegin()でルジャンドル陪 関数が正しく計算されないようである。アルゴリズムとしては、robustな方法を使っているはずだし、ベクトルのLegendre変換をするルーチンは うまく動作する。また、SPHEREPACKを呼んでいるNCLでは、正しく動作する。ソースを見たところ、ルジャンドル陪関数を計算するときに必要な係数abel, bbel, cbelが大きな整数のかけ算になっていたためであることが分かった。shagc.f, shsgc.f, shags.f, shsgs.f, shigc.f, shigs.fでは

- abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/
- 1 float(((2*n-3)*(m+n-1)*(m+n))))
- bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/
- 1 float(((2*n-3)*(m+n-1)*(m+n))))
- cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/
- 1 float(((n+m-1)*(n+m))))
+ abel(imn)=sqrt((2.*n+1.)*(m+n-2.)*(m+n-3.)/
+ 1 ((2.*n-3.)*(m+n-1.)*(m+n)))
+ bbel(imn)=sqrt((2.*n+1.)*(n-m-1.)*(n-m)/
+ 1 ((2.*n-3.)*(m+n-1.)*(m+n)))
+ …

D 2.025 for Mac OS X

D 2.025には,Mac OS X版が含まれている.D言語を開発したDigital Mars社純正で,Intel Macで動作する.writeln()等D 2.0で追加された機能が使える.ChageLogを見ると2009/2/14に公開された2.025からMac OS X版が追加されたようだ.マニュアルrdmd.1はあるが,rdmdはない.

2009/2/24 追記
#!/usr/bin/dmd -runと書けば良いようだ.スクリプト風に動くというのは面白い.

私の場合は,/usr/local/dmdというフォルダを作り,bin, libをコピー.shareにhtmlとmanをコピー.ランタイムはsrc以下にあるので,これもコピー.dmdは/etc/dmd.confの設定を読む./usr/local/dmd/etc/dmd.confからシンボリックリンクを張った. dmd.confには,次のように書いた.

DFLAGS=-I/usr/local/dmd/src/phobos -I/usr/local/dmd/src/druntime/import -L-L/usr/local/dmd/lib

gdcで変なメッセージが出ることに対応するパッチは,MacPortsのリポジトリに登録されたようだ.

plplot-5.9.2 revision 1

D言語のbindingとcairo/pangoドライバをvariantsとして追加.cairoドライバによりPDFが作成できるようになる.g95, gdc, cairoを有効にしてインストールするには,
sudo port -d install plplot +g95 +gdc +cairo
とする.

D言語サンプルは,bindingがexperimentalなので少ないが,/opt/local/share/plplot-5.9.2/examples/dにいくつかある.コンパイルは,ヘッダ/opt/local/include/plplot/plplot.d,モジュール本体は/opt/local/lib/libplplotd.dylibなので,
gdmd -I/opt/local/include/plplot x03d.d /opt/local/lib/libplplotd.dylibとする.gdcでなくgdmdを使うとソースコードから.dをとった名前のバイナリができる.簡単なプログラムでは便利.-lオプションはないようだ.

D言語

Windowsの.NETやLinuxやMacでも.NET互換の環境Monoの開発言語として,C#が注目されている.言語仕様は,よりよいC, Javaになっている.多次元配列もある.しかし,中間言語に翻訳するためか,Cの函数を直接呼べず,動的ライブラリをロードする必要がある.このあたりは不便であるように思われた.

plplotに対応している言語を見ていて,D言語があるのを見つけた.聞いたことはあったが,仕様はよく知らなかったので,調べてみた.「わかったつもりになるD言語」にはドキュメントの翻訳を含めて,詳しく紹介されていた.コンパイル型言語で,Cの函数をラッパー無しで直接呼べる.複素数型,動的に伸張配列可能な配列,文字列がUnicode文字の配列あること,標準ライブラリに正規表現が含まれることなどが大変便利に思えた.

MacPortsにもGNUのDコンパイラgdcがあったので,インストールしてみた.Leopardでは変なメッセージが出るが問題なく使える.かつてg95にもあり既に解決済なので,Portfileのパッチを作り,Ticketを発行して添付しておいた.

GNU Dも仕様通りUnicodeに対応しているので,Hello, worldは日本語で試せた.gdcはDMD 1.0仕様なので,writelnはないことに注意.

ちなみに,NHKの地上波の朝のニュースは「おはよう日本」,BSは「おはよう世界」である.

ソースはHTMLでもよいというのも面白い.の間のソースをコンパイルする.の間にタグが含まれていても無視するので問題ない.

Vis5D+

MacPortsにVis5D+を追加.以前にインストールメモを見てコンパイルしたことがあった.Fortranのコンパイルがうまくいかなくて困っていたが,configureスクリプトを改変すればg95でコンパイルが通るようになった.gcc43では,うまくいかない.Fortranコンパイラは使われておらず,Fortran用のインターフェースをコンパイルするかどうかだけ.+g95をつければ,-lvis5dをリンクしてFortranでvis5d+形式のデータを作成するツールが作れるはず.GTK1は,
うまくいかなかった.

モードライン

Portfileの最初の行におまじないのような一行がある.
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

EmacsとVim用にソースの種類やタブの取り扱いを設定するためのもので,モードラインと
呼ばれている.

Portfileの書き方として推奨されているので,よく考えずにこの行をつけていた.

モードラインの設定に従うはずなのに,この行があるにもかかわらず,~/.vimrcの設定が使われるので,モードラインが有効になっていないことに気づいた.

モードラインを有効にするには,
set modeline
set modelines=1
とする.いつも使うのなら,~/.vimrcに書いておけば良い.モードラインはset modelineで有効になる.モードラインの設定を検索する行数は,set modelinesで指定する.既定では,モードラインは無効でmodelines=0のようであるので,モードラインを使うにはこの設定が必要である.

後半にあるvimの部分では,テキストのエンコーディングをutf-8に(fenc=utf-8),ファイルタイプをtclに(ft=tcl),タブを展開(et),インデント,タブ,ソフトタブをそれぞれ4文字に設定している.ソフトタブに0でない値を設定すると,タブを入力したとき設定した文字数の空白に置換する.

ソースの種類により,スタイルは異なっている.Makefileはタブが必要なので,いつもタブの展開(set expandtab)しておくわけにはいかない.Cなど通常のソースでは,タブが4つの空白にすることが推奨されることが多い.長い数式を書き,doループが多重になることが多いFortranのソースでは,タブは2つくらいにしておきたい.このような場合でも,ソースの最初にモードラインを書いておけば,様々なスタイルに対応することができる.

Portfileは拡張子がないが,モードラインの設定のおかげで,文法に基づいた色づけ(syntax enable)を~/.vimrc等に設定しておけば,キーワード等に色がつく.インデント等の設定があるために,文字を揃えるの…

gdl-0.9r2, GMT-4.3.1

GDLとGMTのMacPortsパッケージを更新.universalにも対応.GDLが依存しているhdf5のuniversal対応は,管理者に連絡中.GDLのlibtoolが古かったので,/opt/local/share/libtool/config/ltmain.shをコピー.

Eigen2

Eigen2は,配列を扱うためのC++テンプレートライブラリ.MacResearchに掲載されたインタビューによると,SSE2やAltivecにも対応していて,ATLASに劣らない性能が出るそうだ.データ解析とお絵描きには使えるかもしれない.MacPortsで簡単にインストールすることができる.MacPortsで入れた場合,コンパイルは
c++ -I/opt/local/include/eigen2 foo.cc -o foo
とすればよい.