Fix analysis neighborhood search for 2D/screw PBC.
authorTeemu Murtola <teemu.murtola@gmail.com>
Sun, 5 May 2013 03:48:16 +0000 (06:48 +0300)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Thu, 27 Jun 2013 19:27:41 +0000 (21:27 +0200)
The gridding implementation did not work correctly in these cases, but
could get triggered.  For now, a simple all-pairs search is always used
in these cases.

Related to #866 and #651.

Change-Id: Iad066f3ea5964e97e1a29a0a20c5725f205509c8

src/gromacs/gmxlib/pbc.c
src/gromacs/legacyheaders/types/pbc.h
src/gromacs/selection/nbsearch.cpp
src/gromacs/selection/tests/nbsearch.cpp

index 7e4bc7474bc1126253b17a5e8e958938bbabe40c..3dc6092ebd91bcfdb7e1f146a984744ffdc6040a 100644 (file)
@@ -330,6 +330,7 @@ static void low_set_pbc(t_pbc *pbc, int ePBC, ivec *dd_nc, matrix box)
     gmx_bool    bXY, bUse;
     const char *ptr;
 
+    pbc->ePBC      = ePBC;
     pbc->ndim_ePBC = ePBC2npbcdim(ePBC);
 
     copy_mat(box, pbc->box);
index ce66aa2cad615adacda7973828992cdf04c965fa..0276f0d5e3fbfa71d6881ce51358b40d38220dab 100644 (file)
@@ -49,6 +49,7 @@ extern "C" {
 #define MAX_NTRICVEC 12
 
 typedef struct {
+    int        ePBC;
     int        ndim_ePBC;
     int        ePBCDX;
     int        dim;
index 0cb7771152c643c5bbc460b2e0da4a79d38e79ca..b5a9c35cbe26e14f242f5a23a7b5443c27b11ca2 100644 (file)
@@ -463,7 +463,9 @@ gmx_ana_nbsearch_init(gmx_ana_nbsearch_t *d, t_pbc *pbc, int n, const rvec x[])
 {
     d->pbc  = pbc;
     d->nref = n;
-    if (!pbc)
+    // TODO: Consider whether it would be possible to support grid searching in
+    // more cases.
+    if (pbc == NULL || pbc->ePBC != epbcXYZ)
     {
         d->bGrid = false;
     }
@@ -613,7 +615,6 @@ grid_search(gmx_ana_nbsearch_t *d,
             ivec cell;
 
             ivec_add(d->testcell, d->gnboffs[nbi], cell);
-            /* TODO: Support for 2D and screw PBC */
             cell[XX] = (cell[XX] + d->ncelldim[XX]) % d->ncelldim[XX];
             cell[YY] = (cell[YY] + d->ncelldim[YY]) % d->ncelldim[YY];
             cell[ZZ] = (cell[ZZ] + d->ncelldim[ZZ]) % d->ncelldim[ZZ];
index b1f157b8e6709287cf3614e7d5d3bd0089791bc9..58cb1aaca4c22cca8a2a025cabe16c64a6c8ffb6 100644 (file)
@@ -351,6 +351,32 @@ class RandomTriclinicFullPBCData
         NeighborhoodSearchTestData data_;
 };
 
+class RandomBox2DPBCData
+{
+    public:
+        static const NeighborhoodSearchTestData &get()
+        {
+            static RandomBox2DPBCData singleton;
+            return singleton.data_;
+        }
+
+        RandomBox2DPBCData() : data_(12345, 1.0)
+        {
+            data_.box_[XX][XX] = 10.0;
+            data_.box_[YY][YY] = 7.0;
+            data_.box_[ZZ][ZZ] = 5.0;
+            // TODO: Consider whether manually picking some positions would give better
+            // test coverage.
+            data_.generateRandomRefPositions(1000);
+            data_.generateRandomTestPositions(100);
+            set_pbc(&data_.pbc_, epbcXY, data_.box_);
+            data_.computeReferences(&data_.pbc_);
+        }
+
+    private:
+        NeighborhoodSearchTestData data_;
+};
+
 /********************************************************************
  * Actual tests
  */
@@ -400,4 +426,21 @@ TEST_F(NeighborhoodSearchTest, GridSearchTriclinic)
     testPairSearch(&search, data);
 }
 
+TEST_F(NeighborhoodSearchTest, GridSearch2DPBC)
+{
+    const NeighborhoodSearchTestData &data = RandomBox2DPBCData::get();
+
+    nb_.setCutoff(data.cutoff_);
+    nb_.setMode(gmx::AnalysisNeighborhood::eSearchMode_Grid);
+    gmx::AnalysisNeighborhoodSearch search =
+        nb_.initSearch(&data.pbc_, data.refPosCount_, data.refPos_);
+    // Currently, grid searching not supported with 2D PBC.
+    //ASSERT_EQ(gmx::AnalysisNeighborhood::eSearchMode_Grid, search.mode());
+
+    testIsWithin(&search, data);
+    testMinimumDistance(&search, data);
+    testNearestPoint(&search, data);
+    testPairSearch(&search, data);
+}
+
 } // namespace