Fix error from copying uninitialized angle parameters to GPU 66/4766/2
authorJim Phillips <jim@ks.uiuc.edu>
Thu, 1 Nov 2018 14:52:19 +0000 (09:52 -0500)
committerJim Phillips <jim@ks.uiuc.edu>
Fri, 2 Nov 2018 14:03:31 +0000 (09:03 -0500)
One example was the ffTK tutorial bond and angle optimization.
Replacement angle parameters would be counted as unique but only
the last would be copied from the parameter assignment tree to the
indexed parameter array. The new CUDA bonded code would look at
uninitialized and never-used data at the end of the parameter array
and exit with "Can't use cosAngles with Urey-Bradley angles".

We could use the indexing functions to set correct counts for
all bonded term parameters, but this would break backwards
compatibility of memopt compressed structure files, especially
those containing extraBonds, so just initialize the full arrays
as is already done for dihedrals, impropers, and cross-terms.

Change-Id: I5d4592c3580f6876243427415b591b8ea88158d9

src/Parameters.C

index fb67e4e..a5eff47 100644 (file)
@@ -2969,6 +2969,7 @@ void Parameters::done_reading_files()
     {
       NAMD_die("memory allocation of bond_array failed!");
     }
+    memset(bond_array, 0, NumBondParams*sizeof(BondValue));
   }
 
   if (NumAngleParams)
@@ -2979,6 +2980,10 @@ void Parameters::done_reading_files()
     {
       NAMD_die("memory allocation of angle_array failed!");
     }
+    memset(angle_array, 0, NumAngleParams*sizeof(AngleValue));
+    for ( Index i=0; i<NumAngleParams; ++i ) {
+      angle_array[i].normal = 1;
+    }
   }
 
   if (NumDihedralParams)
@@ -3039,6 +3044,14 @@ void Parameters::done_reading_files()
   //  Assign indexes to each of the parameters and populate the
   //  arrays using the binary trees and linked lists that we have
   //  already read in
+
+  // Note that if parameters have been overwritten (matching
+  // atom patterns but different parameter values) the tree
+  // contains fewer elements than Num...Params would suggest.
+  // The arrays are initialized above because the end values
+  // may not be occupied.  Modifying the Num...Params values
+  // would break backwards compatibility of memopt extraBonds.
+
   index_bonds(bondp, 0);
   index_angles(anglep, 0);
   NumVdwParamsAssigned = index_vdw(vdwp, 0);