From 7a78875911d28acd1739292fc8725e9f417e7892 Mon Sep 17 00:00:00 2001
From: smoore <stanmoore1@gmail.com>
Date: Sat, 13 Jan 2018 21:31:11 -0700
Subject: [PATCH] Fix issues in Kokkos pair snap and zbl

---
 src/KOKKOS/pair_snap_kokkos.h      |  5 +++--
 src/KOKKOS/pair_snap_kokkos_impl.h | 26 +++++++++++++++++---------
 src/KOKKOS/pair_zbl_kokkos.cpp     | 23 ++++++++++++-----------
 src/SNAP/pair_snap.h               |  2 +-
 4 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h
index 3b56789cc1..7bfac00391 100644
--- a/src/KOKKOS/pair_snap_kokkos.h
+++ b/src/KOKKOS/pair_snap_kokkos.h
@@ -47,6 +47,7 @@ public:
   
   void coeff(int, char**);
   void init_style();
+  double init_one(int, int);
   void compute(int, int);
   double memory_usage();
 
@@ -118,8 +119,8 @@ inline double dist2(double* x,double* y);
   Kokkos::View<F_FLOAT**, Kokkos::LayoutRight, DeviceType> d_coeffelem;           // element bispectrum coefficients
   Kokkos::View<T_INT*, DeviceType> d_map;                     // mapping from atom types to elements
 
-  typedef Kokkos::View<F_FLOAT**, DeviceType> t_fparams;
-  t_fparams d_cutsq;
+  typedef Kokkos::DualView<F_FLOAT**, DeviceType> tdual_fparams;
+  tdual_fparams k_cutsq;
   typedef Kokkos::View<const F_FLOAT**, DeviceType,
       Kokkos::MemoryTraits<Kokkos::RandomAccess> > t_fparams_rnd;
   t_fparams_rnd rnd_cutsq;
diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h
index db694b1a2a..d976be120e 100644
--- a/src/KOKKOS/pair_snap_kokkos_impl.h
+++ b/src/KOKKOS/pair_snap_kokkos_impl.h
@@ -58,7 +58,9 @@ PairSNAPKokkos<DeviceType>::PairSNAPKokkos(LAMMPS *lmp) : PairSNAP(lmp)
   datamask_modify = EMPTY_MASK;
 
   vector_length = 8;
-  d_cutsq = t_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1);
+  k_cutsq = tdual_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1);
+  auto d_cutsq = k_cutsq.template view<DeviceType>();
+  rnd_cutsq = d_cutsq;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -160,6 +162,7 @@ void PairSNAPKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
   x = atomKK->k_x.view<DeviceType>();
   f = atomKK->k_f.view<DeviceType>();
   type = atomKK->k_type.view<DeviceType>();
+  k_cutsq.template sync<DeviceType>();
 
   NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list);
   d_numneigh = k_list->d_numneigh;
@@ -268,6 +271,19 @@ void PairSNAPKokkos<DeviceType>::allocate()
   d_map = Kokkos::View<T_INT*, DeviceType>("PairSNAPKokkos::map",n+1);
 }
 
+
+/* ----------------------------------------------------------------------
+   init for one type pair i,j and corresponding j,i
+------------------------------------------------------------------------- */
+
+template<class DeviceType>
+double PairSNAPKokkos<DeviceType>::init_one(int i, int j)
+{
+  double cutone = PairSNAP::init_one(i,j);
+  k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone;
+  k_cutsq.template modify<LMPHostType>();
+}
+
 /* ----------------------------------------------------------------------
    set coeffs for one or more type pairs
 ------------------------------------------------------------------------- */
@@ -287,7 +303,6 @@ void PairSNAPKokkos<DeviceType>::coeff(int narg, char **arg)
   auto h_wjelem = Kokkos::create_mirror_view(d_wjelem);
   auto h_coeffelem = Kokkos::create_mirror_view(d_coeffelem);
   auto h_map = Kokkos::create_mirror_view(d_map);
-  auto h_cutsq = Kokkos::create_mirror_view(d_cutsq);
 
   for (int ielem = 0; ielem < nelements; ielem++) {
     h_radelem(ielem) = radelem[ielem];
@@ -299,19 +314,12 @@ void PairSNAPKokkos<DeviceType>::coeff(int narg, char **arg)
 
   for (int i = 1; i <= atom->ntypes; i++) {
     h_map(i) = map[i];
-    for (int j = 1; j <= atom->ntypes; j++) {
-      double cutone = (radelem[map[i]] +
-        radelem[map[j]])*rcutfac;
-      h_cutsq(i,j) = cutone*cutone;
-    }
   }
 
   Kokkos::deep_copy(d_radelem,h_radelem);
   Kokkos::deep_copy(d_wjelem,h_wjelem);
   Kokkos::deep_copy(d_coeffelem,h_coeffelem);
   Kokkos::deep_copy(d_map,h_map);
-  Kokkos::deep_copy(d_cutsq,h_cutsq);
-  rnd_cutsq = d_cutsq;
 
   // deallocate non-kokkos sna
 
diff --git a/src/KOKKOS/pair_zbl_kokkos.cpp b/src/KOKKOS/pair_zbl_kokkos.cpp
index 16fcac1534..0ed9e62dff 100644
--- a/src/KOKKOS/pair_zbl_kokkos.cpp
+++ b/src/KOKKOS/pair_zbl_kokkos.cpp
@@ -287,16 +287,17 @@ double PairZBLKokkos<DeviceType>::init_one(int i, int j)
   double cutone = PairZBL::init_one(i,j);
 
   k_z.h_view(i) = z[i];
-  k_d1a.h_view(i,j) = d1a[i][j];
-  k_d2a.h_view(i,j) = d2a[i][j];
-  k_d3a.h_view(i,j) = d3a[i][j];
-  k_d4a.h_view(i,j) = d4a[i][j];
-  k_zze.h_view(i,j) = zze[i][j];
-  k_sw1.h_view(i,j) = sw1[i][j];
-  k_sw2.h_view(i,j) = sw2[i][j];
-  k_sw3.h_view(i,j) = sw3[i][j];
-  k_sw4.h_view(i,j) = sw4[i][j];
-  k_sw5.h_view(i,j) = sw5[i][j];
+  k_z.h_view(j) = z[j];
+  k_d1a.h_view(i,j) = k_d1a.h_view(j,i) = d1a[i][j];
+  k_d2a.h_view(i,j) = k_d2a.h_view(j,i) = d2a[i][j];
+  k_d3a.h_view(i,j) = k_d3a.h_view(j,i) = d3a[i][j];
+  k_d4a.h_view(i,j) = k_d4a.h_view(j,i) = d4a[i][j];
+  k_zze.h_view(i,j) = k_zze.h_view(j,i) = zze[i][j];
+  k_sw1.h_view(i,j) = k_sw1.h_view(j,i) = sw1[i][j];
+  k_sw2.h_view(i,j) = k_sw2.h_view(j,i) = sw2[i][j];
+  k_sw3.h_view(i,j) = k_sw3.h_view(j,i) = sw3[i][j];
+  k_sw4.h_view(i,j) = k_sw4.h_view(j,i) = sw4[i][j];
+  k_sw5.h_view(i,j) = k_sw5.h_view(j,i) = sw5[i][j];
 
   k_z.modify<LMPHostType>();
   k_d1a.modify<LMPHostType>();
@@ -311,7 +312,7 @@ double PairZBLKokkos<DeviceType>::init_one(int i, int j)
   k_sw5.modify<LMPHostType>();
 
   if(i<MAX_TYPES_STACKPARAMS+1 && j<MAX_TYPES_STACKPARAMS+1) {
-    m_cutsq[j][i] = m_cutsq[i][j] = cutone*cutone;
+    m_cutsq[i][j] = m_cutsq[j][i] = cutone*cutone;
   }
 
   return cutone;
diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h
index 5e78edc079..9d330f0d6f 100644
--- a/src/SNAP/pair_snap.h
+++ b/src/SNAP/pair_snap.h
@@ -34,7 +34,7 @@ public:
   void settings(int, char **);
   virtual void coeff(int, char **);
   virtual void init_style();
-  double init_one(int, int);
+  virtual double init_one(int, int);
   virtual double memory_usage();
 
 protected:
-- 
GitLab