• R/O
  • HTTP
  • SSH
  • HTTPS

Molby: コミット

Molecular Modeling Software


コミットメタ情報

リビジョンd1da522ab22f1ba5a4316ab13b5ca9574f682826 (tree)
日時2010-02-04 01:02:23
作者toshinagata1964 <toshinagata1964@a2be...>
コミッターtoshinagata1964

ログメッセージ

The multithread handling for MM/MD is improved.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/molby/trunk@6 a2be9bc6-48de-4e38-9406-05402d4bc13c

変更サマリ

差分

--- a/MolLib/MD/MDCore.c
+++ b/MolLib/MD/MDCore.c
@@ -1588,6 +1588,18 @@ md_prepare(MDArena *arena, int check_only)
15881588 arena->pair_forces = NULL;
15891589 }
15901590
1591+ /* Allocate ring buffer */
1592+ if (arena->ring != NULL)
1593+ free(arena->ring);
1594+ arena->nringframes = 2000 / mol->natoms;
1595+ if (arena->nringframes == 0)
1596+ arena->nringframes = 1;
1597+ arena->ring = (Vector *)malloc(sizeof(Vector) * mol->natoms * arena->nringframes);
1598+ if (arena->ring == NULL)
1599+ md_panic(arena, ERROR_out_of_memory);
1600+ arena->ring_next = 0;
1601+ arena->ring_count = 0;
1602+
15911603 /* Initialize temperature statistics */
15921604 arena->sum_temperature = 0.0;
15931605 arena->nsum_temperature = 0;
@@ -3016,6 +3028,8 @@ md_arena_release(MDArena *arena)
30163028 free(arena->old_pos);
30173029 if (arena->graphite != NULL)
30183030 graphite_release(arena->graphite);
3031+ if (arena->ring != NULL)
3032+ free(arena->ring);
30193033 free(arena);
30203034 }
30213035
--- a/MolLib/MD/MDCore.h
+++ b/MolLib/MD/MDCore.h
@@ -267,6 +267,11 @@ typedef struct MDArena {
267267
268268 Int natoms_uniq; /* Number of symmetry-unique atoms */
269269
270+ Vector *ring; /* Ring buffer for sending coordinates between threads */
271+ Int nringframes; /* Number of frames in the ring buffer (2000 / natoms) */
272+ Int ring_next; /* Next frame index to store data */
273+ Int ring_count; /* Number of frames currently in the ring buffer */
274+
270275 /* Parameters are copied from mol->par and gBuiltinParameters for each call to md_prepare() */
271276 Parameter *par;
272277
--- a/memo.txt
+++ b/memo.txt
@@ -8,3 +8,7 @@ make -f Makefile_at でビルド。
88 なお、Mac 用の gfortran は http://r.research.att.com/tools/ にあるやつがいい。hpc.sourceforge.net のやつはいろいろと使い方が複雑。
99 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 に持って行っても実行できたので、たぶん大丈夫じゃないかと。
1010 原子タイプのアサインだけなら、antechamber を -c オプション無しで走らせればいいんだな。気がついてなかった。(どれぐらい使えるのかは不明だが。)
11+
12+2010.2.2.
13+ MD/Minimize のサブスレッドの処理を整理(よくフリーズしていたので)。
14+ サブスレッドから MM/MD をしているときは、指定したステップが終わるごとにリングバッファに座標データをためこみ、メインスレッドにイベントを投げる。メインスレッドはイベントを捕まえて、リングバッファから座標データを読み込んで、フレームを作成する。サブスレッドから Molecule を直接触ることがなくなったので、少しは安定すると期待しよう。また、ドキュメントを閉じるときにサブスレッドが走っている時は、エラーメッセージを出して閉じるのを拒否するようにした。
--- a/wxSources/MyDocument.cpp
+++ b/wxSources/MyDocument.cpp
@@ -64,6 +64,7 @@ const wxEventType MyDocumentEvent = wxNewEventType();
6464 BEGIN_EVENT_TABLE(MyDocument, wxDocument)
6565 EVT_COMMAND(MyDocumentEvent_willNeedCleanUndoStack, MyDocumentEvent, MyDocument::OnNeedCleanUndoStack)
6666 EVT_COMMAND(MyDocumentEvent_documentModified, MyDocumentEvent, MyDocument::OnDocumentModified)
67+ EVT_COMMAND(MyDocumentEvent_insertFrameFromMD, MyDocumentEvent, MyDocument::OnInsertFrameFromMD)
6768 EVT_COMMAND(MyDocumentEvent_updateDisplay, MyDocumentEvent, MyDocument::OnUpdateDisplay)
6869 EVT_COMMAND(MyDocumentEvent_threadTerminated, MyDocumentEvent, MyDocument::OnSubThreadTerminated)
6970 EVT_MENU(myMenuID_Import, MyDocument::OnImport)
@@ -396,6 +397,20 @@ MyDocument::CleanUndoStack(bool shouldRegister)
396397 currentCommand = NULL;
397398 }
398399
400+bool
401+MyDocument::Close()
402+{
403+ if (mol != NULL && mol->mutex != NULL) {
404+ const char *msg;
405+ if (subThreadKind == 1)
406+ msg = "MM/MD";
407+ else msg = "Some background process";
408+ MyAppCallback_errorMessageBox("%s is running: please stop it before closing", msg);
409+ return false;
410+ }
411+ return true;
412+}
413+
399414 void
400415 MyDocument::OnNeedCleanUndoStack(wxCommandEvent& event)
401416 {
@@ -650,8 +665,7 @@ sDoMolecularDynamics(void *argptr, int argnum)
650665 mol->arena->end_step = mol->arena->start_step;
651666 md_main(mol->arena, minimize);
652667 } else if (count > 0) {
653- IntGroup *ig;
654- wxCommandEvent displayEvent(MyDocumentEvent, MyDocumentEvent_updateDisplay);
668+ wxCommandEvent insertFrameEvent(MyDocumentEvent, MyDocumentEvent_insertFrameFromMD);
655669 for (i = 0; i < count; i++) {
656670
657671 mol->arena->end_step = mol->arena->start_step + mol->arena->coord_output_freq;
@@ -662,17 +676,30 @@ sDoMolecularDynamics(void *argptr, int argnum)
662676 r = -1;
663677 else {
664678
665- /* Create a new frame and copy the new coordinates */
679+ /* Copy the coordinate to the ring buffer */
680+ Vector *rp = mol->arena->ring + mol->natoms * mol->arena->ring_next;
681+ Int j;
682+ Atom *ap;
666683 MoleculeLock(mol);
684+ for (j = 0, ap = mol->arena->mol->atoms; j < mol->natoms; j++, ap = ATOM_NEXT(ap)) {
685+ rp[j] = ap->r;
686+ }
687+ mol->arena->ring_next = (mol->arena->ring_next + 1) % mol->arena->nringframes;
688+ if (mol->arena->ring_count < mol->arena->nringframes)
689+ mol->arena->ring_count++;
690+ MoleculeUnlock(mol);
691+
692+ /* Create a new frame and copy the new coordinates */
693+ /* MoleculeLock(mol);
667694 ig = IntGroupNewWithPoints(MoleculeGetNumberOfFrames(mol), 1, -1);
668695 MolActionCreateAndPerform(mol, gMolActionInsertFrames, ig, 0, NULL);
669696 IntGroupRelease(ig);
670697 md_copy_coordinates_from_internal(mol->arena);
671- MoleculeUnlock(mol);
698+ MoleculeUnlock(mol); */
672699
673700 if (minimize && mol->arena->minimize_complete)
674701 break;
675- wxPostEvent(doc, displayEvent);
702+ wxPostEvent(doc, insertFrameEvent);
676703 }
677704 }
678705 if (r != 0)
@@ -727,6 +754,33 @@ MyDocument::OnStopMDRun(wxCommandEvent &event)
727754 }
728755
729756 void
757+MyDocument::OnInsertFrameFromMD(wxCommandEvent &event)
758+{
759+ Int i, j, n, old_nframes;
760+ Atom *ap;
761+
762+ /* Create new frame(s) and copy the new coordinates from the ring buffer */
763+ MoleculeLock(mol);
764+ n = mol->arena->ring_count;
765+ if (n > 0) {
766+ IntGroup *ig;
767+ Vector *rp;
768+ old_nframes = MoleculeGetNumberOfFrames(mol);
769+ ig = IntGroupNewWithPoints(old_nframes, n, -1);
770+ MolActionCreateAndPerform(mol, gMolActionInsertFrames, ig, 0, NULL);
771+ IntGroupRelease(ig);
772+ for (i = 0; i < n; i++) {
773+ MoleculeSelectFrame(mol, old_nframes + i, 1);
774+ rp = mol->arena->ring + ((mol->arena->ring_next + mol->arena->nringframes - n + i) % mol->arena->nringframes) * mol->natoms;
775+ for (j = 0, ap = mol->atoms; j < mol->natoms; j++, ap = ATOM_NEXT(ap))
776+ ap->r = rp[j];
777+ }
778+ mol->arena->ring_count = 0;
779+ }
780+ MoleculeUnlock(mol);
781+}
782+
783+void
730784 MyDocument::OnUpdateDisplay(wxCommandEvent &event)
731785 {
732786 MainView *mview = GetMainView();
--- a/wxSources/MyDocument.h
+++ b/wxSources/MyDocument.h
@@ -30,6 +30,7 @@ enum {
3030 MyDocumentEvent_documentModified,
3131 MyDocumentEvent_scriptMenuModified,
3232 MyDocumentEvent_updateDisplay,
33+ MyDocumentEvent_insertFrameFromMD,
3334 MyDocumentEvent_threadTerminated
3435 };
3536
@@ -70,6 +71,8 @@ public:
7071 void UpdateModifyFlag();
7172 void BeginUndoGrouping();
7273 void EndUndoGrouping();
74+
75+ virtual bool Close();
7376
7477 void OnNeedCleanUndoStack(wxCommandEvent& event);
7578
@@ -115,6 +118,7 @@ public:
115118 void OnCreateGamessInput(wxCommandEvent &event);
116119 void OnCreateMOCube(wxCommandEvent &event);
117120
121+ void OnInsertFrameFromMD(wxCommandEvent &event);
118122 void OnUpdateDisplay(wxCommandEvent &event);
119123 void OnSubThreadTerminated(wxCommandEvent &event);
120124
旧リポジトリブラウザで表示