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 の配列でパラメータを与えるか? 2011.7.29.  テーブルをクリックしてもフォーカスされないことがあっておかしいと思っていたのだが、発生条件をどうやら特定できた。セル編集中に MyGLCanvas をクリックしてそちらにフォーカスが移ると、テーブルをクリックしても MyGLCanvas からフォーカスが動かない。もう一度セルをダブルクリックして編集状態にすると正常に戻る。この症状は Windows では起こらない。修正する方法がなかなか見つからない。wxMac のソースを読んでも、Carbon だからよくわからんし。→ 編集状態でなくなった時に wxTextCtrl を Destroy するといいみたい。ただし、Windows ではこれでクラッシュすることがある(しないこともある)。よくわからんが、#ifdef で分けてしのぐことにした。 2011.7.30.  バージョン 0.5.6 をリリース。 Gaff, parm99 パラメータ: 結合長を小数点以下3桁まで有効にした。 Antechamber/parmchk ダイアログ(および Ruby で書かれたその他のダイアログ)のクラッシュを修正。 Ruby: 新しいメソッド: AtomRef#exclusion, Molecule#resize_to_fit, Molecule#bond_par/angle_par/dihedral_par/improper_par/vdw_par, $stdin.gets, $stdin.readline. 改良したメソッド: Molecule#each_atom, Molecule#duplicate, Molecule#open, Kernel#message_box, Dialog#item. 分子力学: 構造最適化計算の安定性が向上。"Solvate" コマンドで溶媒分子に "SOLV" セグメント名が付与されるようになった。 新しいメニューコマンド:"Create New Atom", "Create New Parameter", "Create SANDER Input", "Import AMBER Lib", "Import AMBER Frcmod". 新しいファイルフォーマット: cif(読み込み), AMBER mdcrd(読み込み)。 属性テーブルでのカット/コピー/ペーストの安定性が向上。 Mac: 属性テーブルがときどきフォーカスされない問題を解決。 Gaff and parm99 parameters: the equilibrium bond lengths have now three significant digits after the decimal point. Crash on antechamber/parmchk dialog (and other Ruby-based dialogs as well) is fixed. Ruby: New methods: AtomRef#exclusion, Molecule#resize_to_fit, Molecule#bond_par/angle_par/dihedral_par/improper_par/vdw_par, $stdin.gets, $stdin.readline. Improved: Molecule#each_atom, Molecule#duplicate, Molecule#open, Kernel#message_box, Dialog#item. MM/MD: minimization gets improved stability; the "solvate" command now sets the segment name 'SOLV' for the solvent atoms. New menu commands: "Create New Atom", "Create New Parameter", "Create SANDER Input", "Import AMBER Lib", "Import AMBER Frcmod". New file formats: cif (import), AMBER mdcrd (import). Tables: cut/copy/paste in parameter table is improved. Mac: table did not get focus under certain conditions; fixed. 2011.8.3. gfortran 絡みの厄介な問題を発見。AmberTools の resp, sqm が libgfortran.dylib をリンクしているため、実行時に libgfortran がないとクラッシュする。libgfortran.dylib を同梱して DYLD_LIBRARY_PATH を設定するのは一案だが、libgfortran.dylib が 8 MB もあるので、ちょっとどうかと思う。静的にリンクする方法をいろいろ探った。どうやら2つ方法がありそう。 (1) libgfortran.dylib をリネームして見えなくしてしまい、同じディレクトリの libgfortran.a を優先させる。 (2) libgfortran.a を libgfortran-static.a とリネームした上で、明示的にリンクオプションに記述する。-nodefaultlibs -lgfortran-static -lgcc -lc -lm -lSystem -lSystemStubs -lgfortranbegin -lgfortran-static だけではダメ。また、-static-gfortran も機能しない。 (1) の方が簡単だが、開発者が libgfortran.dylib に依存するバイナリを使っていると問題が起きるので、amber11 の Makefile に手を入れて (2) の方針でいく。変更しないといけないのは gfortran を使って実行ファイルを作っているところで、etc/Makefile の nucgen/ambpdb/resp, lib/Makefile の neww2oldparm, sqm/Makefile の sqm ターゲット。config.h に FLDFLAGS= -nodefaultlibs -lgfortran-static -lgcc -lc -lm -lSystem -lSystemStubs -lgfortranbegin という一行を加えて、上のそれぞれのコマンドラインに $(FLDFLAGS) を加えた。 なお、/usr/local/lib/libgfortran.a は、strip しておかないと "can't find atom for N_GSYM stabs" という警告が出る。次のようにする。 % cd /usr/local/lib % sudo cp libgfortran.a libgfortran-static.a % sudo strip -S libgfortran-static.a % sudo ranlib libgfortran-static.a 2011.8.3. 0.5.6.1 を公開。 Crash on running antechamber/parmchk on PPC Mac is (hopefully) fixed. Mac: resp and sqm (semiempirial QM calculation invoked by antechamber) caused crash unless gfortran is installed. To fix this, config.h/Makefiles for AmberTools is modified so that gfortran library is statically linked Occasionally, termination of the subprocess (like antechamber) was not detected properly, and the subprocess was left as a zombie. Improved, but may not be completely fixed. Loading GAMESS dat file now can be interrupted by ESC. Disable close box of RubyDialogFrame. On importing frcmod, atom type with a single character (like "c") was not recognized properly. Fixed. MO import from GAMESS log/dat files are implemented. ruby-1.8.7-p160.tar.gz is added (required for building) PPC Mac での antechamber/parmchk のクラッシュを修正。 Mac: resp, sqm(半経験的量子化学計算)のクラッシュを修正。AmberTools の config.h/Makefile を修正して gfortran のライブラリを静的リンクするようにした。 Antechamber などのサブプロセスの終了が検出できず、ゾンビになっていることがあった。一応修正したが、まだ問題があるかも。 GAMESS dat ファイルの読み込みが ESC で中断できるようになった。 RubyDialogFrame のクローズボタンをなくした。 Frcmod インポート(antechamber/parmchk 後の読み込みを含む)で、原子タイプが一文字のものを正しく読めるように修正。 GAMESS dat, log ファイルから MO を読み込むように修正。 2011.8.23. 0.5.6.2. Gaussian fchk のインポートができなくなっていた (0.5.6.1 で発生)。修正。 最後にコンパイルした日時を 'About' ダイアログで表示するようにした。 Amber mdcrd のインポートで、座標が8桁になる時にエラーが発生していたので修正。 構造最適化で時々クラッシュしていたのを修正。 Fchk import was broken (enbug in 0.5.6.1); fixed. Final compile date/time is now shown in the 'About' window. Fix mdcrd import to allow coordinates using full 8 digits (like -123.456 or 1234.567). Occasional crash during minimization is fixed.