bugfix in QM charge update 64/4864/3
authormelomcr <melomcr@gmail.com>
Sat, 15 Dec 2018 01:11:21 +0000 (19:11 -0600)
committerDavid Hardy <dhardy@ks.uiuc.edu>
Thu, 28 Mar 2019 19:51:33 +0000 (14:51 -0500)
QM code will now update charges on QM atoms
when more than one QM region is defined, instead of
only when PME is ON. This allows QM regions to
see one another as partial charges with thei updated
QM charges, instead of the original PSF charges.

Also fixed bug when calculating multiple QM regions
using only one core. Now multiple directories are
created regardless of the number of PEs.

Change-Id: I9973743e3a580fd82020b5ce594d7f01716fdc90

src/ComputeQM.C

index 5344af3..895fb60 100644 (file)
@@ -2660,6 +2660,7 @@ void ComputeQM::saveResults(QMForceMsg *fmsg) {
     bool callReplaceForces = false;
     
     int numQMAtms = Node::Object()->molecule->get_numQMAtoms();
+    int numQMGrps = Node::Object()->molecule->get_qmNumGrps();
     const Real * const qmAtomGroup = Node::Object()->molecule->get_qmAtomGroup() ;
     const int *qmAtmIndx = Node::Object()->molecule->get_qmAtmIndx() ;
     Real *qmAtmChrg = Node::Object()->molecule->get_qmAtmChrg() ;
@@ -2703,7 +2704,7 @@ void ComputeQM::saveResults(QMForceMsg *fmsg) {
         
         // If the atom is in a QM group, update its charge to the local (this homePatch)
         // copy of the qmAtmChrg array.
-        if (qmAtomGroup[results_ptr->id] > 0 && fmsg->PMEOn) {
+        if (qmAtomGroup[results_ptr->id] > 0 && (fmsg->PMEOn || (numQMGrps > 1) ) ) {
             
             // Loops over all QM atoms (in all QM groups) comparing their global indices
             for (int qmIter=0; qmIter<numQMAtms; qmIter++) {
@@ -2841,7 +2842,7 @@ void ComputeQMMgr::calcMOPAC(QMGrpCalcMsg *msg)
         
     }
     baseDir.append("/") ;
-    itosConv << msg->peIter ;
+    itosConv << msg->grpIndx ;
     baseDir += itosConv.str() ;
     
     if (stat(msg->baseDir, &info) != 0 ) {
@@ -3652,15 +3653,34 @@ void ComputeQMMgr::calcORCA(QMGrpCalcMsg *msg)
         pcPpme = pcP;
     }
     
+    int retVal = 0;
+    struct stat info;
+    
     // For each QM group, create a subdirectory where files will be palced.
     std::string baseDir(msg->baseDir);
-    baseDir.append("/") ;
     std::ostringstream itosConv ;
-    itosConv << msg->peIter ;
+    if ( CmiNumPartitions() > 1 ) {
+        baseDir.append("/") ;
+        itosConv << CmiMyPartition() ;
+        baseDir += itosConv.str() ;
+        itosConv.str("");
+        itosConv.clear() ;
+        
+        if (stat(msg->baseDir, &info) != 0 ) {
+            CkPrintf( "Node %d cannot access directory %s\n",
+                      CkMyPe(), baseDir.c_str() );
+            NAMD_die("QM calculation could not be ran. Check your qmBaseDir!");
+        }
+        else if (! (stat(baseDir.c_str(), &info) == 0 && S_ISDIR(info.st_mode)) ) {
+            DebugM(4,"Creating directory " << baseDir.c_str() << std::endl);
+            retVal = mkdir(baseDir.c_str(), S_IRWXU);
+        }
+        
+    }
+    baseDir.append("/") ;
+    itosConv << msg->grpIndx ;
     baseDir += itosConv.str() ;
     
-    struct stat info;
-    
     if (stat(msg->baseDir, &info) != 0 ) {
         CkPrintf( "Node %d cannot access directory %s\n",
                   CkMyPe(), baseDir.c_str() );
@@ -4484,15 +4504,34 @@ void ComputeQMMgr::calcUSR(QMGrpCalcMsg *msg) {
         pcPpme = pcP;
     }
     
+    int retVal = 0;
+    struct stat info;
+    
     // For each QM group, create a subdirectory where files will be palced.
     std::string baseDir(msg->baseDir);
-    baseDir.append("/") ;
     std::ostringstream itosConv ;
-    itosConv << msg->peIter ;
+    if ( CmiNumPartitions() > 1 ) {
+        baseDir.append("/") ;
+        itosConv << CmiMyPartition() ;
+        baseDir += itosConv.str() ;
+        itosConv.str("");
+        itosConv.clear() ;
+        
+        if (stat(msg->baseDir, &info) != 0 ) {
+            CkPrintf( "Node %d cannot access directory %s\n",
+                      CkMyPe(), baseDir.c_str() );
+            NAMD_die("QM calculation could not be ran. Check your qmBaseDir!");
+        }
+        else if (! (stat(baseDir.c_str(), &info) == 0 && S_ISDIR(info.st_mode)) ) {
+            DebugM(4,"Creating directory " << baseDir.c_str() << std::endl);
+            retVal = mkdir(baseDir.c_str(), S_IRWXU);
+        }
+        
+    }
+    baseDir.append("/") ;
+    itosConv << msg->grpIndx ;
     baseDir += itosConv.str() ;
     
-    struct stat info;
-    
     if (stat(msg->baseDir, &info) != 0 ) {
         CkPrintf( "Node %d cannot access directory %s\n",
                   CkMyPe(), baseDir.c_str() );