2 AmberTools1.3 をバンドルする方向で検討中。antechamber と sqm だけあればいいはず。
4 config.h, Makefile_at を手動で修正。
5 src ディレクトリの中で、antechamber, blas, carpack, cblas, clapack, etc, f2c, include, lapack, lib, sff, sqm を残し、他は削除する。
7 make -f Makefile_at でビルド。
8 なお、Mac 用の gfortran は http://r.research.att.com/tools/ にあるやつがいい。hpc.sourceforge.net のやつはいろいろと使い方が複雑。
9 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 に持って行っても実行できたので、たぶん大丈夫じゃないかと。
10 原子タイプのアサインだけなら、antechamber を -c オプション無しで走らせればいいんだな。気がついてなかった。(どれぐらい使えるのかは不明だが。)
13 MD/Minimize のサブスレッドの処理を整理(よくフリーズしていたので)。
14 サブスレッドから MM/MD をしているときは、指定したステップが終わるごとにリングバッファに座標データをためこみ、メインスレッドにイベントを投げる。メインスレッドはイベントを捕まえて、リングバッファから座標データを読み込んで、フレームを作成する。サブスレッドから Molecule を直接触ることがなくなったので、少しは安定すると期待しよう。また、ドキュメントを閉じるときにサブスレッドが走っている時は、エラーメッセージを出して閉じるのを拒否するようにした。
17 Ruby の Parameter/ParEnumerable の仕様がわかりにくい。グローバルパラメータを自動的に探しに行く機能はlookup メソッドに限定する。Parameter#lookup(par_type, atom_type_string, *options), ParEnumerable#lookup(atom_type_string, *options).
18 Parameter#bond, ParEnumerable#[] などで、原子タイプからの探索はやめにする。また、ローカルな Parameter の nbonds などがグローバルパラメータを含んだ値を返すのはやめる。
19 Parameter#bond などをクラスメソッド・インスタンスメソッドとして二重に登録するのはやめた。グローバルパラメータはたとえば Parameter.builtin.atoms または Parameter::Builtin.atoms としてアクセスする。
22 Parameter タイプの atom というのはなんとも紛らわしい。element の方がまだましかも。
25 RubyDialog って名前はよくないな。Ruby のクラス名に "Ruby" って接頭辞をつけてどうすんだよ。全体を Molby というモジュールにして、暗黙に include Molby することにしようか。これなら、RubyDialog は Dialog でもいい。
26 DialogItem を独立したクラスにしたいんだけど、オーナーシップをどうしようか?
27 DialogItem は常に Dialog#item で作成されるので、このとき作ったオブジェクトを Dialog._items に格納し、常にそれを返す。従って、Dialog#get_item(n) で返されるオブジェクトは常に同一。
28 DialogItem は Dialog へのポインタとアイテム番号を保持すべき。アイテム番号はともかく、ポインタはどう保持するか? Dialog._items -> DialogItem -> Dialog という循環参照を作っても、Ruby の GC ならちゃんと回収してくれるから、これでいいんじゃないか。他のいい方法が思いつかん。
29 DialogItem は C レベルのデータは持たず、単なる cDialogItem のインスタンスとする。属性は、今まで Dialog 中のハッシュに保持していたが、DialogItem のインスタンス変数として実装する。
30 Dialog#item(:type, hash) でアイテムを作成。Dialog#set_attr, Dialog#get_attr はやめて、DialogItem#[], DialogItem#[]= で実装する。DialogItem#属性名, DialogItem#属性名= も実装する(ParameterRef と同様)。また、Dialog#action の引数はアイテム番号でなく DialogItem オブジェクトとする。
31 DialogItem の action 属性は今までと同様だが、引数としてはアイテム番号でなく DialogItem オブジェクトそのものが渡される。
34 Pressure control を使えるようにしたい。フレームごとに unit cell パラメータを保持できるようにしないといけない。→ 一応実装した。
38 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"
41 wxWidgets 絡みの厄介なバグをいくつか退治したのでメモ。
42 ・wxDocument::Close() が二重に呼ばれる問題。メニューから Close コマンドを選ぶと、普通は wxDocManager::CloseDocument() が呼び出される。これは、最初に wxDocument::Close() を呼び、成功したら wxDocument::DeleteAllViews() を呼ぶのだが、この中から wxView::Close() -> wxView::OnClose() -> wxDocument::Close() という呼び出しがあるため、wxDocument::Close() が2回呼ばれてしまう。2回目に何もしないで true を返せばいいのだが、下手なコーディングをするとおかしくなってしまう。今回は、MoleculeView::OnClose() を修正して、wxDocument::Close() の呼び出しをスキップした。
43 参考: http://trac.wxwidgets.org/ticket/11367
44 ・wxDocument::Close() をオーバーライドしたら、元の wxDocument::Close() を呼ばないといけない。こんな感じ。
48 if (mol != NULL && mol->mutex != NULL) {
49 return false; /* クローズを拒否 */
51 return wxDocument::Close();
53 理由は、wxDocument::Close() の中で、未保存のドキュメントを保存するかどうか尋ねる処理があるため。これを忘れて "return true;" としてしまうと、未保存のドキュメントの場合は wxDocument のデストラクタからこの処理が呼ばれてしまい、変なことになる。
54 ・wxMac で wxMDIParentFrame を使うとき、frame->Move(-10000, -10000); frame->Show(false); などとして不可視にするが、すべてのウィンドウが閉じられている状態でアプリケーションをバックグラウンドからフォアグラウンドに持って来た時など、何かの拍子にこのウィンドウが可視化されて Window メニューに現れてしまうことがある。これを防ぐ方法:
55 (1) wxMDIParentFrame のコンストラクタ中で、
56 #if defined(__WXMAC__)
58 sts = ChangeWindowAttributes((WindowRef)m_macWindow, 0, kWindowInWindowMenuAttribute);
60 ChangeWindowAttributes には <Carbon/Carbon.h> が必要。ちなみに、Ruby のヘッダと同時に #include すると T_DATA が二重定義になるので、#include <Carbon/Carbon.h> の前に #undef T_DATA を置く。
61 (2) wxApp で Activate Event をつかまえて、そのたびに wxMDIParentFrame を不可視にする。なんとも強引だが、確実。
62 EVT_ACTIVATE(MyApp::OnActivate)
64 MyApp::OnActivate(wxActivateEvent &event)
66 #if defined(__WXMAC__)
67 MyFrame *frame = GetMainFrame();
76 ・パラメータテーブルのコピー/カット/ペーストを改善。
77 ・Mac 版で、隠れウィンドウの "Molby" がときどき Window メニューに現れる不具合を修正。
78 ・テーブルの編集時の不具合(Windows はクラッシュ、Mac はテキストフィールドが残ってしまう)の修正。
80 * Frames can now have variable unit cell parameters.
81 * Improved handling of copy/cut/paste in the parameter table.
82 * Fix the problem in the Mac version in which the hidden top-level window gets sometimes visible in the Window menu.
83 * Bugs in the list control were (hopefully) fixed.
86 4/25 に修正した wxDocument::Close() 二重呼び出しの件、どうも修正の仕方がまずいみたいで、Windows でクラッシュを起こす。元に戻した。
89 いろいろ変なクラッシュが起きる。malloc/free 関係のバグくさいのだが、なかなか特定できない。Mac 上では GuardMalloc を使い、MolAction.c:562 の
91 + ParameterCopyOneWithType(&usave, up, i);
92 が原因と特定できた。つまり、up は BondPar/AnglePar/etc. の配列へのポインタを UnionPar * にキャストしたものなので、up が配列の最後の要素を指しているときに *up をアクセスすると、存在しないメモリ領域を読み出すことになってしまう。(これでバスエラーが起きるのは相当不運なケースだが)。
93 Windows の方は本当に困ってしまった。開発ツールへの投資をけちるとこういうところでつまづくんだな。チェック用ツールをいろいろ探して、kmmalloc (http://www.vector.co.jp/soft/dos/prog/se026997.html) を使うことにした。使い方は同梱の kmmalloc.txt に全部書いてあるのだが、少し手こずってしまったのでメモしておく。
95 (1) kmmalloc-2.5.3.zip をダウンロード、解凍。
96 (2) $ cd kmmalloc-2.5.3
97 (3) patch -c < mingw.dif
98 (4) xalloc.h を編集して、次の5行を追加。
101 #define EALLOCBLK 122
103 #define ETRAILWRT 124
105 -LIBDIR = /usr/local/lib
107 (6) make PACKAGE=KMMALLOC _MEM_DEBUG=1 -f mingw.mak
108 途中で一回「問題が発生したため、test_mem.exe を終了します。」というダイアログが出る。仕様なのか不具合なのか不明。
109 (7) mkdir /mingw/include/kmmalloc; cp xalloc.h yalloc.h /mingw/include/kmmalloc
111 (1) ビルド時に -lkmmalloc_debug フラグをリンカに渡す。これで malloc/free/realloc が kmmalloc のものと置き換わる。
112 (2) 問題のソースに #include <kmmalloc/xalloc.h> を入れておくと、malloc/free/realloc のコール時に __FILE__, __LINE__ を渡すようにしてくれるが、これをしなくてもデバッガを使えば何とかなる。
113 (3) export MEMCHECK=2 # kmmalloc のデバッグ機能を有効にする。ログを書き出すなら export MEMCHECK=4; export MEMFP=ファイル名 とする。
114 (4) デバッガで mem_error() 関数にブレークポイントを指定して実行。実行は非常に遅くなる場合がある(それほどでもない場合もある)。
115 (5) strdup, wcsdup 中の malloc はこの方法では置き換えられないようなので、自前で malloc を使うバージョンを用意して使う。(Missing.c 参照) → どうも wxWidgets の中の strdup コールはこれでは置き換わってくれないらしく、かえって変なことが起きているような気がする。kmmalloc.a をリンクする条件で wxWidgets を再コンパイルしないとだめか? → マルチスレッドに未対応? 無理かも…
118 GaussianW のフォーマットチェックポイントファイルが読めないことが判明。改行コードの問題だった。Molecule.c の sSeparateTokens() を修正して解決。
119 また、GaussianW では formchk で作ったファイルの拡張子が fch になるので、fch, fchk 両方とも Gaussian Checkpoint File として認識するように修正。
124 原子座標を修正したあとの MM/MD の不具合を修正。
125 wrap_unit_cell コマンドの不具合を修正。
126 単位格子が定義されているときに、周期的なイメージを表示する機能を実装。
127 周期境界条件での vdW/静電力計算の不具合を修正。
128 mbsf ファイルにスケール、配向などの表示に関する設定を保存。
129 MD パラメータがない分子に他の分子からのパラメータをペーストできない不具合を修正。
130 GaussianW の fch(k) ファイルが読めない不具合を修正。また、拡張子 ".fch" を Gaussian Checkpoint File として認識するよう設定。
132 Incomplete MM/MD re-initialization after modification of coordinates was fixed.
133 The Ruby command wrap_unit_cell now works correctly.
134 Periodic images can be displayed when a unit cell is defined.
135 Wrong calculation of vdw/elect forces under periodic boundary conditions was fixed.
136 The native format (mbsf) now preserves the display conditions, such as scale, orientation etc.
137 Pasting MD parameters to a molecule with no parameters now works correctly.
138 Importing GaussianW fch(k) files was not working; fixed. The extension ".fch" is now recognized as a Gaussian formatted checkpoint files.
141 sander 用入力を作れるようにする。prmtop, inpcrd は一応作れるようになった。あとは sander の入力ファイル。関係ありそうな設定パラメータ:
144 imin = 0 (no minimization), 1 (minimization)
145 ntx = 1 (read coords), 5 (read coords and velocities and box [if ntb>0]. velocities are used only if irest > 0.
146 irest = 0 (no restart), 1 (restart)
147 ntpr : every NTPR steps energy info are printed to mdout/mdinfo (default 50).
148 ntwx : every ntwx steps coords are written to mdcrd (default 0: no output)
150 Minimization and dynamics:
151 maxcyc: maximum number of cycles of minimization
152 nstlim: number of MD-steps to be performed
153 dt: time step (psec). Recommended value is 0.002 when SHAKE is used or 0.001 otherwise.
154 nrespa: frequency for calculation of slow forces. nrespa * dt > 0.004 causes instablitity.
157 ntt: temperature control 0: constant energy, 1: constant temperature, 2: Andersen temperature, 3: Langevin dynamics
158 temp0: target temperature
159 tempi: initial temperature
160 tautp: time constant for heat bath coupling. Should be 0.5-5.0ps.
161 gamma_ln: collision frequency for Langevin dynamics.
162 vlimit: limiting velocity, default 20.
165 ntp: constant pressure dynamics 0: no pressure scaling, 1: isotropic position scaling, 2: anisotropic pressure scaling
166 pres0: reference pressure (default 1 bar)
167 taup: pressure relaxation time (default 1.0 ps)
170 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
172 Potential function parameters:
173 ntf: force evaluation 1: complete interaction, 2: omit hydrogen (with ntc=2), 3: omit all bonds (with ntc=3)
174 ntb: 0 (no periodicity), 1 (constant volume), 2 (constant pressure)
175 cut: nonbonded cutoff, default 8.0 (for PME this is good); for igb > 0, larger values should be used
177 Generalized Born/Surface Area:
178 igb: 0 (no GB), 1 (Hawkins/Cramer/Truhlar GB), 2 (Onufriev/Bashford/Case GB), etc.
179 extdiel: external dielectric constant. default 78.5.
180 saltcon: salt concentraction (M), GB plus Debye-Huckel model.
181 rgbmax: cutoff for estimation of effective Born radii. Default 25 A.
182 gbsa: 0 (no surface area calc), 1 (LCPO surface area model), 2 (recursive approximation of spheres; used only in single point calc)
183 surften: surface tension. default 0.005 kcal/mol/A^2
184 rdt: (only used in LES)
186 sander -O -i min.in -o NAME.out -p NAME.prmtop -c NAME.inpcrd -x NAME.mdcrd -r NAME.restrt
189 MoleculeMerge(), MoleculeUnmerge() の仕様を見直した方がいい。undo サポート用に、bond/angle/dihedral/improper を指定した位置に入れる機能が欲しい。パラメータも、すべての種類のパラメータを指定した位置に入れる機能が必要。IntGroup の配列でパラメータを与えるか?
192 テーブルをクリックしてもフォーカスされないことがあっておかしいと思っていたのだが、発生条件をどうやら特定できた。セル編集中に MyGLCanvas をクリックしてそちらにフォーカスが移ると、テーブルをクリックしても MyGLCanvas からフォーカスが動かない。もう一度セルをダブルクリックして編集状態にすると正常に戻る。この症状は Windows では起こらない。修正する方法がなかなか見つからない。wxMac のソースを読んでも、Carbon だからよくわからんし。→ 編集状態でなくなった時に wxTextCtrl を Destroy するといいみたい。ただし、Windows ではこれでクラッシュすることがある(しないこともある)。よくわからんが、#ifdef で分けてしのぐことにした。
197 Gaff, parm99 パラメータ: 結合長を小数点以下3桁まで有効にした。
198 Antechamber/parmchk ダイアログ(および Ruby で書かれたその他のダイアログ)のクラッシュを修正。
199 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.
200 分子力学: 構造最適化計算の安定性が向上。"Solvate" コマンドで溶媒分子に "SOLV" セグメント名が付与されるようになった。
201 新しいメニューコマンド:"Create New Atom", "Create New Parameter", "Create SANDER Input", "Import AMBER Lib", "Import AMBER Frcmod".
202 新しいファイルフォーマット: cif(読み込み), AMBER mdcrd(読み込み)。
203 属性テーブルでのカット/コピー/ペーストの安定性が向上。
204 Mac: 属性テーブルがときどきフォーカスされない問題を解決。
206 Gaff and parm99 parameters: the equilibrium bond lengths have now three significant digits after the decimal point.
207 Crash on antechamber/parmchk dialog (and other Ruby-based dialogs as well) is fixed.
208 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.
209 MM/MD: minimization gets improved stability; the "solvate" command now sets the segment name 'SOLV' for the solvent atoms.
210 New menu commands: "Create New Atom", "Create New Parameter", "Create SANDER Input", "Import AMBER Lib", "Import AMBER Frcmod".
211 New file formats: cif (import), AMBER mdcrd (import).
212 Tables: cut/copy/paste in parameter table is improved. Mac: table did not get focus under certain conditions; fixed.
215 gfortran 絡みの厄介な問題を発見。AmberTools の resp, sqm が libgfortran.dylib をリンクしているため、実行時に libgfortran がないとクラッシュする。libgfortran.dylib を同梱して DYLD_LIBRARY_PATH を設定するのは一案だが、libgfortran.dylib が 8 MB もあるので、ちょっとどうかと思う。静的にリンクする方法をいろいろ探った。どうやら2つ方法がありそう。
216 (1) libgfortran.dylib をリネームして見えなくしてしまい、同じディレクトリの libgfortran.a を優先させる。
217 (2) libgfortran.a を libgfortran-static.a とリネームした上で、明示的にリンクオプションに記述する。-nodefaultlibs -lgfortran-static -lgcc -lc -lm -lSystem -lSystemStubs -lgfortranbegin
218 -lgfortran-static だけではダメ。また、-static-gfortran も機能しない。
220 (1) の方が簡単だが、開発者が libgfortran.dylib に依存するバイナリを使っていると問題が起きるので、amber11 の Makefile に手を入れて (2) の方針でいく。変更しないといけないのは gfortran を使って実行ファイルを作っているところで、etc/Makefile の nucgen/ambpdb/resp, lib/Makefile の neww2oldparm, sqm/Makefile の sqm ターゲット。config.h に
221 FLDFLAGS= -nodefaultlibs -lgfortran-static -lgcc -lc -lm -lSystem -lSystemStubs -lgfortranbegin
222 という一行を加えて、上のそれぞれのコマンドラインに $(FLDFLAGS) を加えた。
224 なお、/usr/local/lib/libgfortran.a は、strip しておかないと "can't find atom for N_GSYM stabs" という警告が出る。次のようにする。
226 % sudo cp libgfortran.a libgfortran-static.a
227 % sudo strip -S libgfortran-static.a
228 % sudo ranlib libgfortran-static.a
233 Crash on running antechamber/parmchk on PPC Mac is (hopefully) fixed.
234 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
235 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.
236 Loading GAMESS dat file now can be interrupted by ESC.
237 Disable close box of RubyDialogFrame.
238 On importing frcmod, atom type with a single character (like "c") was not recognized properly. Fixed.
239 MO import from GAMESS log/dat files are implemented.
240 ruby-1.8.7-p160.tar.gz is added (required for building)
242 PPC Mac での antechamber/parmchk のクラッシュを修正。
243 Mac: resp, sqm(半経験的量子化学計算)のクラッシュを修正。AmberTools の config.h/Makefile を修正して gfortran のライブラリを静的リンクするようにした。
244 Antechamber などのサブプロセスの終了が検出できず、ゾンビになっていることがあった。一応修正したが、まだ問題があるかも。
245 GAMESS dat ファイルの読み込みが ESC で中断できるようになった。
246 RubyDialogFrame のクローズボタンをなくした。
247 Frcmod インポート(antechamber/parmchk 後の読み込みを含む)で、原子タイプが一文字のものを正しく読めるように修正。
248 GAMESS dat, log ファイルから MO を読み込むように修正。
253 Gaussian fchk のインポートができなくなっていた (0.5.6.1 で発生)。修正。
254 最後にコンパイルした日時を 'About' ダイアログで表示するようにした。
255 Amber mdcrd のインポートで、座標が8桁になる時にエラーが発生していたので修正。
256 構造最適化で時々クラッシュしていたのを修正。
258 Fchk import was broken (enbug in 0.5.6.1); fixed.
259 Final compile date/time is now shown in the 'About' window.
260 Fix mdcrd import to allow coordinates using full 8 digits (like -123.456 or 1234.567).
261 Occasional crash during minimization is fixed.