2010.1.25. AmberTools1.3 をバンドルする方向で検討中。antechamber と sqm だけあればいいはず。 config.h, Makefile_at を手動で修正。 src ディレクトリの中で、antechamber, blas, carpack, cblas, clapack, etc, f2c, include, lapack, lib, sff, sqm を残し、他は削除する。 make -f Makefile_at でビルド。 なお、Mac 用の gfortran は http://r.research.att.com/tools/ にあるやつがいい。hpc.sourceforge.net のやつはいろいろと使い方が複雑。 OS 10.4 用のユニバーサルバイナリは、export ISYSROOT='-isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -arch ppc -arch i386' としたあと make -f Makefile_at とすると作ることができる。MacBook 上でビルドして、PowerPC の 10.4 に持って行っても実行できたので、たぶん大丈夫じゃないかと。 原子タイプのアサインだけなら、antechamber を -c オプション無しで走らせればいいんだな。気がついてなかった。(どれぐらい使えるのかは不明だが。) 2010.2.2. MD/Minimize のサブスレッドの処理を整理(よくフリーズしていたので)。 サブスレッドから MM/MD をしているときは、指定したステップが終わるごとにリングバッファに座標データをためこみ、メインスレッドにイベントを投げる。メインスレッドはイベントを捕まえて、リングバッファから座標データを読み込んで、フレームを作成する。サブスレッドから Molecule を直接触ることがなくなったので、少しは安定すると期待しよう。また、ドキュメントを閉じるときにサブスレッドが走っている時は、エラーメッセージを出して閉じるのを拒否するようにした。 2010.2.21. Ruby の Parameter/ParEnumerable の仕様がわかりにくい。グローバルパラメータを自動的に探しに行く機能はlookup メソッドに限定する。Parameter#lookup(par_type, atom_type_string, *options), ParEnumerable#lookup(atom_type_string, *options). Parameter#bond, ParEnumerable#[] などで、原子タイプからの探索はやめにする。また、ローカルな Parameter の nbonds などがグローバルパラメータを含んだ値を返すのはやめる。 Parameter#bond などをクラスメソッド・インスタンスメソッドとして二重に登録するのはやめた。グローバルパラメータはたとえば Parameter.builtin.atoms または Parameter::Builtin.atoms としてアクセスする。 2010.2.27. Parameter タイプの atom というのはなんとも紛らわしい。element の方がまだましかも。 2010.3.8. RubyDialog って名前はよくないな。Ruby のクラス名に "Ruby" って接頭辞をつけてどうすんだよ。全体を Molby というモジュールにして、暗黙に include Molby することにしようか。これなら、RubyDialog は Dialog でもいい。 DialogItem を独立したクラスにしたいんだけど、オーナーシップをどうしようか? DialogItem は常に Dialog#item で作成されるので、このとき作ったオブジェクトを Dialog._items に格納し、常にそれを返す。従って、Dialog#get_item(n) で返されるオブジェクトは常に同一。 DialogItem は Dialog へのポインタとアイテム番号を保持すべき。アイテム番号はともかく、ポインタはどう保持するか? Dialog._items -> DialogItem -> Dialog という循環参照を作っても、Ruby の GC ならちゃんと回収してくれるから、これでいいんじゃないか。他のいい方法が思いつかん。 DialogItem は C レベルのデータは持たず、単なる cDialogItem のインスタンスとする。属性は、今まで Dialog 中のハッシュに保持していたが、DialogItem のインスタンス変数として実装する。 Dialog#item(:type, hash) でアイテムを作成。Dialog#set_attr, Dialog#get_attr はやめて、DialogItem#[], DialogItem#[]= で実装する。DialogItem#属性名, DialogItem#属性名= も実装する(ParameterRef と同様)。また、Dialog#action の引数はアイテム番号でなく DialogItem オブジェクトとする。 DialogItem の action 属性は今までと同様だが、引数としてはアイテム番号でなく DialogItem オブジェクトそのものが渡される。 2010.3.21. Pressure control を使えるようにしたい。フレームごとに unit cell パラメータを保持できるようにしないといけない。→ 一応実装した。 2010.4.25. SVN メモ。タグの付け方。 svn copy svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/molby/trunk svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/molby/tags/version_x_y_z -m "version x.y.z" 2010.4.25. wxWidgets 絡みの厄介なバグをいくつか退治したのでメモ。 ・wxDocument::Close() が二重に呼ばれる問題。メニューから Close コマンドを選ぶと、普通は wxDocManager::CloseDocument() が呼び出される。これは、最初に wxDocument::Close() を呼び、成功したら wxDocument::DeleteAllViews() を呼ぶのだが、この中から wxView::Close() -> wxView::OnClose() -> wxDocument::Close() という呼び出しがあるため、wxDocument::Close() が2回呼ばれてしまう。2回目に何もしないで true を返せばいいのだが、下手なコーディングをするとおかしくなってしまう。今回は、MoleculeView::OnClose() を修正して、wxDocument::Close() の呼び出しをスキップした。 参考: http://trac.wxwidgets.org/ticket/11367 ・wxDocument::Close() をオーバーライドしたら、元の wxDocument::Close() を呼ばないといけない。こんな感じ。 bool MyDocument::Close() { if (mol != NULL && mol->mutex != NULL) { return false; /* クローズを拒否 */ } return wxDocument::Close(); }  理由は、wxDocument::Close() の中で、未保存のドキュメントを保存するかどうか尋ねる処理があるため。これを忘れて "return true;" としてしまうと、未保存のドキュメントの場合は wxDocument のデストラクタからこの処理が呼ばれてしまい、変なことになる。 ・wxMac で wxMDIParentFrame を使うとき、frame->Move(-10000, -10000); frame->Show(false); などとして不可視にするが、すべてのウィンドウが閉じられている状態でアプリケーションをバックグラウンドからフォアグラウンドに持って来た時など、何かの拍子にこのウィンドウが可視化されて Window メニューに現れてしまうことがある。これを防ぐ方法: (1) wxMDIParentFrame のコンストラクタ中で、 #if defined(__WXMAC__) OSStatus sts; sts = ChangeWindowAttributes((WindowRef)m_macWindow, 0, kWindowInWindowMenuAttribute); #endif  ChangeWindowAttributes には が必要。ちなみに、Ruby のヘッダと同時に #include すると T_DATA が二重定義になるので、#include の前に #undef T_DATA を置く。 (2) wxApp で Activate Event をつかまえて、そのたびに wxMDIParentFrame を不可視にする。なんとも強引だが、確実。 EVT_ACTIVATE(MyApp::OnActivate) void MyApp::OnActivate(wxActivateEvent &event) { #if defined(__WXMAC__) MyFrame *frame = GetMainFrame(); frame->Show(false); #endif event.Skip(); } 2010.4.25. バージョン0.5.3をリリースしました。 ・フレームごとに可変な単位格子を設定可能。 ・パラメータテーブルのコピー/カット/ペーストを改善。 ・Mac 版で、隠れウィンドウの "Molby" がときどき Window メニューに現れる不具合を修正。 ・テーブルの編集時の不具合(Windows はクラッシュ、Mac はテキストフィールドが残ってしまう)の修正。 Version 0.5.3 is out. * Frames can now have variable unit cell parameters. * Improved handling of copy/cut/paste in the parameter table. * Fix the problem in the Mac version in which the hidden top-level window gets sometimes visible in the Window menu. * Bugs in the list control were (hopefully) fixed. 2010.4.29. 4/25 に修正した wxDocument::Close() 二重呼び出しの件、どうも修正の仕方がまずいみたいで、Windows でクラッシュを起こす。元に戻した。 2010.5.4. いろいろ変なクラッシュが起きる。malloc/free 関係のバグくさいのだが、なかなか特定できない。Mac 上では GuardMalloc を使い、MolAction.c:562 の - usave = *up; + ParameterCopyOneWithType(&usave, up, i); が原因と特定できた。つまり、up は BondPar/AnglePar/etc. の配列へのポインタを UnionPar * にキャストしたものなので、up が配列の最後の要素を指しているときに *up をアクセスすると、存在しないメモリ領域を読み出すことになってしまう。(これでバスエラーが起きるのは相当不運なケースだが)。 Windows の方は本当に困ってしまった。開発ツールへの投資をけちるとこういうところでつまづくんだな。チェック用ツールをいろいろ探して、kmmalloc (http://www.vector.co.jp/soft/dos/prog/se026997.html) を使うことにした。使い方は同梱の kmmalloc.txt に全部書いてあるのだが、少し手こずってしまったのでメモしておく。 ・インストールの仕方: (1) kmmalloc-2.5.3.zip をダウンロード、解凍。 (2) $ cd kmmalloc-2.5.3 (3) patch -c < mingw.dif (4) xalloc.h を編集して、次の5行を追加。 #define EFREEP 120 #define EFREEBLK 121 #define EALLOCBLK 122 #define EFREEWRT 123 #define ETRAILWRT 124 (5) mingw.mak を編集する。 -LIBDIR = /usr/local/lib +LIBDIR = /mingw/lib (6) make PACKAGE=KMMALLOC _MEM_DEBUG=1 -f mingw.mak  途中で一回「問題が発生したため、test_mem.exe を終了します。」というダイアログが出る。仕様なのか不具合なのか不明。 (7) mkdir /mingw/include/kmmalloc; cp xalloc.h yalloc.h /mingw/include/kmmalloc ・使い方 (1) ビルド時に -lkmmalloc_debug フラグをリンカに渡す。これで malloc/free/realloc が kmmalloc のものと置き換わる。 (2) 問題のソースに #include を入れておくと、malloc/free/realloc のコール時に __FILE__, __LINE__ を渡すようにしてくれるが、これをしなくてもデバッガを使えば何とかなる。 (3) export MEMCHECK=2 # kmmalloc のデバッグ機能を有効にする。ログを書き出すなら export MEMCHECK=4; export MEMFP=ファイル名 とする。 (4) デバッガで mem_error() 関数にブレークポイントを指定して実行。実行は非常に遅くなる場合がある(それほどでもない場合もある)。 (5) strdup, wcsdup 中の malloc はこの方法では置き換えられないようなので、自前で malloc を使うバージョンを用意して使う。(Missing.c 参照) → どうも wxWidgets の中の strdup コールはこれでは置き換わってくれないらしく、かえって変なことが起きているような気がする。kmmalloc.a をリンクする条件で wxWidgets を再コンパイルしないとだめか? → マルチスレッドに未対応? 無理かも… 2011.4.26.  GaussianW のフォーマットチェックポイントファイルが読めないことが判明。改行コードの問題だった。Molecule.c の sSeparateTokens() を修正して解決。  また、GaussianW では formchk で作ったファイルの拡張子が fch になるので、fch, fchk 両方とも Gaussian Checkpoint File として認識するように修正。 2011.4.26. バージョン 0.5.5 をリリース。 原子座標を修正したあとの MM/MD の不具合を修正。 wrap_unit_cell コマンドの不具合を修正。 単位格子が定義されているときに、周期的なイメージを表示する機能を実装。 周期境界条件での vdW/静電力計算の不具合を修正。 mbsf ファイルにスケール、配向などの表示に関する設定を保存。 MD パラメータがない分子に他の分子からのパラメータをペーストできない不具合を修正。 GaussianW の fch(k) ファイルが読めない不具合を修正。また、拡張子 ".fch" を Gaussian Checkpoint File として認識するよう設定。 Incomplete MM/MD re-initialization after modification of coordinates was fixed. The Ruby command wrap_unit_cell now works correctly. Periodic images can be displayed when a unit cell is defined. Wrong calculation of vdw/elect forces under periodic boundary conditions was fixed. The native format (mbsf) now preserves the display conditions, such as scale, orientation etc. Pasting MD parameters to a molecule with no parameters now works correctly. Importing GaussianW fch(k) files was not working; fixed. The extension ".fch" is now recognized as a Gaussian formatted checkpoint files. 2011.7.5. sander 用入力を作れるようにする。prmtop, inpcrd は一応作れるようになった。あとは sander の入力ファイル。関係ありそうな設定パラメータ: General flags imin = 0 (no minimization), 1 (minimization) ntx = 1 (read coords), 5 (read coords and velocities and box [if ntb>0]. velocities are used only if irest > 0. irest = 0 (no restart), 1 (restart) ntpr : every NTPR steps energy info are printed to mdout/mdinfo (default 50). ntwx : every ntwx steps coords are written to mdcrd (default 0: no output) Minimization and dynamics: maxcyc: maximum number of cycles of minimization nstlim: number of MD-steps to be performed dt: time step (psec). Recommended value is 0.002 when SHAKE is used or 0.001 otherwise. nrespa: frequency for calculation of slow forces. nrespa * dt > 0.004 causes instablitity. Temperature control: ntt: temperature control 0: constant energy, 1: constant temperature, 2: Andersen temperature, 3: Langevin dynamics temp0: target temperature tempi: initial temperature tautp: time constant for heat bath coupling. Should be 0.5-5.0ps. gamma_ln: collision frequency for Langevin dynamics. vlimit: limiting velocity, default 20. Pressure control: ntp: constant pressure dynamics 0: no pressure scaling, 1: isotropic position scaling, 2: anisotropic pressure scaling pres0: reference pressure (default 1 bar) taup: pressure relaxation time (default 1.0 ps) SHAKE constraint: ntc: SHAKE algorithm. generally ntf and ntc should be the same. 1: SHAKE is not perfomred, 2: bonds involving hydrogen are constrained, 3: all bonds are constrained Potential function parameters: ntf: force evaluation 1: complete interaction, 2: omit hydrogen (with ntc=2), 3: omit all bonds (with ntc=3) ntb: 0 (no periodicity), 1 (constant volume), 2 (constant pressure) cut: nonbonded cutoff, default 8.0 (for PME this is good); for igb > 0, larger values should be used Generalized Born/Surface Area: igb: 0 (no GB), 1 (Hawkins/Cramer/Truhlar GB), 2 (Onufriev/Bashford/Case GB), etc. extdiel: external dielectric constant. default 78.5. saltcon: salt concentraction (M), GB plus Debye-Huckel model. rgbmax: cutoff for estimation of effective Born radii. Default 25 A. gbsa: 0 (no surface area calc), 1 (LCPO surface area model), 2 (recursive approximation of spheres; used only in single point calc) surften: surface tension. default 0.005 kcal/mol/A^2 rdt: (only used in LES) sander -O -i min.in -o NAME.out -p NAME.prmtop -c NAME.inpcrd -x NAME.mdcrd -r NAME.restrt 2011.7.8.  MoleculeMerge(), MoleculeUnmerge() の仕様を見直した方がいい。undo サポート用に、bond/angle/dihedral/improper を指定した位置に入れる機能が欲しい。パラメータも、すべての種類のパラメータを指定した位置に入れる機能が必要。IntGroup の配列でパラメータを与えるか?