Commit 8e68015a authored by Stan Moore's avatar Stan Moore
Browse files

Merge branch 'reax_dup' of github.com:stanmoore1/lammps into reax_dup

parents 95aec46b 8a9a7f4e
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ void FixQEqReaxKokkos<DeviceType>::pre_force(int vflag)
  k_t.template sync<DeviceType>();

  if (neighflag != FULL)
    red_o = Kokkos::Experimental::create_reduction_view<> (k_o.d_view); // allocate duplicated memory
    red_o = Kokkos::Experimental::create_reduction_view<> (d_o); // allocate duplicated memory

  // 1st cg solve over b_s, s
  cg_solve1();
@@ -502,7 +502,7 @@ void FixQEqReaxKokkos<DeviceType>::cg_solve1()
    Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType,TagZeroQGhosts>(nlocal,nlocal+atom->nghost),*this);
    FixQEqReaxKokkosSparse13Functor<DeviceType,HALFTHREAD> sparse13_functor(this);
    Kokkos::parallel_for(inum,sparse13_functor);
    Kokkos::Experimental::contribute(k_o.d_view, red_o);
    Kokkos::Experimental::contribute(d_o, red_o);
  } else {
    Kokkos::parallel_for(Kokkos::TeamPolicy <DeviceType, TagSparseMatvec1> (inum, teamsize), *this);
  }
@@ -553,7 +553,7 @@ void FixQEqReaxKokkos<DeviceType>::cg_solve1()
      red_o.reset_except(d_o);
      FixQEqReaxKokkosSparse23Functor<DeviceType,HALFTHREAD> sparse23_functor(this);
      Kokkos::parallel_for(inum,sparse23_functor);
      Kokkos::Experimental::contribute(k_o.d_view, red_o);
      Kokkos::Experimental::contribute(d_o, red_o);
    } else {
      Kokkos::parallel_for(Kokkos::TeamPolicy <DeviceType, TagSparseMatvec2> (inum, teamsize), *this);
    }
@@ -626,7 +626,7 @@ void FixQEqReaxKokkos<DeviceType>::cg_solve2()
    red_o.reset_except(d_o);
    FixQEqReaxKokkosSparse33Functor<DeviceType,HALFTHREAD> sparse33_functor(this);
    Kokkos::parallel_for(inum,sparse33_functor);
    Kokkos::Experimental::contribute(k_o.d_view, red_o);
    Kokkos::Experimental::contribute(d_o, red_o);
  } else {
    Kokkos::parallel_for(Kokkos::TeamPolicy <DeviceType, TagSparseMatvec3> (inum, teamsize), *this);
  }
@@ -677,7 +677,7 @@ void FixQEqReaxKokkos<DeviceType>::cg_solve2()
      red_o.reset_except(d_o);
      FixQEqReaxKokkosSparse23Functor<DeviceType,HALFTHREAD> sparse23_functor(this);
      Kokkos::parallel_for(inum,sparse23_functor);
      Kokkos::Experimental::contribute(k_o.d_view, red_o);
      Kokkos::Experimental::contribute(d_o, red_o);
    } else {
      Kokkos::parallel_for(Kokkos::TeamPolicy <DeviceType, TagSparseMatvec2> (inum, teamsize), *this);
    }
@@ -790,7 +790,7 @@ KOKKOS_INLINE_FUNCTION
void FixQEqReaxKokkos<DeviceType>::sparse13_item(int ii) const
{
  // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
  auto a_o = red_o.access();
  auto a_o = red_o.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  if (mask[i] & groupbit) {
@@ -842,7 +842,7 @@ KOKKOS_INLINE_FUNCTION
void FixQEqReaxKokkos<DeviceType>::sparse23_item(int ii) const
{
  // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
  auto a_o = red_o.access();
  auto a_o = red_o.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  if (mask[i] & groupbit) {
@@ -901,7 +901,7 @@ KOKKOS_INLINE_FUNCTION
void FixQEqReaxKokkos<DeviceType>::sparse33_item(int ii) const
{
  // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
  auto a_o = red_o.access();
  auto a_o = red_o.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  if (mask[i] & groupbit) {
+2 −2
Original line number Diff line number Diff line
@@ -19,11 +19,11 @@
#define LMP_PAIR_KOKKOS_H

#include "Kokkos_Macros.hpp"
#include "Kokkos_Vectorization.hpp"
#include "Kokkos_ReductionView.hpp"
#include "pair.h"
#include "neighbor_kokkos.h"
#include "neigh_list_kokkos.h"
#include "Kokkos_Vectorization.hpp"
#include "Kokkos_ReductionView.hpp"

namespace LAMMPS_NS {

+69 −87
Original line number Diff line number Diff line
@@ -713,11 +713,9 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  d_ilist = k_list->d_ilist;

  // allocate duplicated memory
  if (neighflag != FULL) {
  dup_f            = Kokkos::Experimental::create_reduction_view<>(f);
  dup_eatom        = Kokkos::Experimental::create_reduction_view<>(v_eatom);
  dup_vatom        = Kokkos::Experimental::create_reduction_view<>(v_vatom);
  }

  if (eflag_global) {
    for (int i = 0; i < 14; i++)
@@ -789,10 +787,8 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  }

  // allocate duplicated memory
  if (neighflag != FULL) {
  dup_dDeltap_self = Kokkos::Experimental::create_reduction_view<>(d_dDeltap_self);
  dup_total_bo     = Kokkos::Experimental::create_reduction_view<>(d_total_bo);
  }

  // Neighbor lists for bond and hbond

@@ -833,23 +829,18 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
    resize = resize_bo || resize_hb;
    if (resize) {
      allocate_array();
      if (neighflag != FULL) {
      dup_dDeltap_self = Kokkos::Experimental::create_reduction_view<>(d_dDeltap_self);
      dup_total_bo     = Kokkos::Experimental::create_reduction_view<>(d_total_bo);
    }
  }
  }

  // allocate duplicated memory
  if (neighflag != FULL) {
  dup_CdDelta = Kokkos::Experimental::create_reduction_view<>(d_CdDelta);
  //dup_Cdbo    = Kokkos::Experimental::create_reduction_view<>(d_Cdbo);
  //dup_Cdbopi  = Kokkos::Experimental::create_reduction_view<>(d_Cdbopi);
  //dup_Cdbopi2 = Kokkos::Experimental::create_reduction_view<>(d_Cdbopi2);
  }

  // reduction over duplicated memory
  if (neighflag != FULL)
  Kokkos::Experimental::contribute(d_total_bo, dup_total_bo); // needed in BondOrder1

  // Bond order
@@ -956,7 +947,6 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  ev_all.evdwl += ev.ereax[8];

  // reduction over duplicated memory
  if (neighflag != FULL) {
  Kokkos::Experimental::contribute(d_dDeltap_self, dup_dDeltap_self); // needed in ComputeBond2
  Kokkos::Experimental::contribute(d_CdDelta, dup_CdDelta); // needed in ComputeBond2

@@ -966,18 +956,16 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  //dup_Cdbo.reset_except(d_Cdbo);
  //dup_Cdbopi.reset_except(d_Cdbopi);
  //dup_Cdbopi2.reset_except(d_Cdbopi2);
  }

  // Bond force
  if (neighflag == HALF) {
    Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, PairReaxUpdateBond<HALF> >(0,ignum),*this);

    // reduction over duplicated memory
    //if (neighflag != FULL) {
    //Kokkos::Experimental::contribute(d_Cdbo, dup_Cdbo); // needed in ComputeBond2
    //Kokkos::Experimental::contribute(d_Cdbopi, dup_Cdbopi); // needed in ComputeBond2
    //Kokkos::Experimental::contribute(d_Cdbopi2, dup_Cdbopi2); // needed in ComputeBond2
    //}

    if (evflag)
      Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, PairReaxComputeBond2<HALF,1> >(0,ignum),*this,ev);
    else
@@ -988,11 +976,10 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
    Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, PairReaxUpdateBond<HALFTHREAD> >(0,ignum),*this);

    // reduction over duplicated memory
    //if (neighflag != FULL) {
    //Kokkos::Experimental::contribute(d_Cdbo, dup_Cdbo); // needed in ComputeBond2
    //Kokkos::Experimental::contribute(d_Cdbopi, dup_Cdbopi); // needed in ComputeBond2
    //Kokkos::Experimental::contribute(d_Cdbopi2, dup_Cdbopi2); // needed in ComputeBond2
    //}

    if (evflag)
      Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, PairReaxComputeBond2<HALFTHREAD,1> >(0,ignum),*this,ev);
    else
@@ -1002,7 +989,6 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  }

  // reduction over duplicated memory
  if (neighflag != FULL)
  Kokkos::Experimental::contribute(f, dup_f);

  if (eflag_global) {
@@ -1021,14 +1007,12 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  if (vflag_fdotr) pair_virial_fdotr_compute(this);

  if (eflag_atom) {
    if (neighflag != FULL)
    Kokkos::Experimental::contribute(v_eatom, dup_eatom);
    k_eatom.template modify<DeviceType>();
    k_eatom.template sync<LMPHostType>();
  }

  if (vflag_atom) {
    if (neighflag != FULL)
    Kokkos::Experimental::contribute(v_vatom, dup_vatom);
    k_vatom.template modify<DeviceType>();
    k_vatom.template sync<LMPHostType>();
@@ -1038,7 +1022,6 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
    FindBondSpecies();

  // free duplicated memory
  if (neighflag != FULL) {
  dup_f            = decltype(dup_f)();
  dup_dDeltap_self = decltype(dup_dDeltap_self)();
  dup_total_bo     = decltype(dup_total_bo)();
@@ -1048,7 +1031,6 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
  //dup_Cdbopi2      = decltype(dup_Cdbopi2)();
  dup_eatom        = decltype(dup_eatom)();
  dup_vatom        = decltype(dup_vatom)();
  }

  copymode = 0;
}
@@ -1091,7 +1073,7 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeLJCoulomb<NEIGHFLAG,

  // The f array is atomic for Half/Thread neighbor style
  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  auto a_f = dup_f.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();

  F_FLOAT powr_vdw, powgi_vdw, fn13, dfn13, exp1, exp2, etmp;
  F_FLOAT evdwl, fvdwl;
@@ -1251,7 +1233,7 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeTabulatedLJCoulomb<N

  // The f array is atomic for Half/Thread neighbor style
  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  auto a_f = dup_f.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  const X_FLOAT xtmp = x(i,0);
@@ -1634,8 +1616,8 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxBuildListsHalf<NEIGHFLAG>,

  //Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_dDeltap_self = d_dDeltap_self;
  //Kokkos::View<F_FLOAT*, typename DAT::t_float_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_total_bo = d_total_bo;
  auto a_dDeltap_self = dup_dDeltap_self.access();
  auto a_total_bo = dup_total_bo.access();
  auto a_dDeltap_self = dup_dDeltap_self.template access<AtomicDup<NEIGHFLAG>::value>();
  auto a_total_bo = dup_total_bo.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  const X_FLOAT xtmp = x(i,0);
@@ -2330,10 +2312,10 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeMulti2<NEIGHFLAG,EVF
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi = d_Cdbopi;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi2 = d_Cdbopi2;
  auto a_CdDelta = dup_CdDelta.access();
  //auto a_Cdbo = dup_Cdbo.access();
  //auto a_Cdbopi = dup_Cdbopi.access();
  //auto a_Cdbopi2 = dup_Cdbopi2.access();
  auto a_CdDelta = dup_CdDelta.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbo = dup_Cdbo.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbopi = dup_Cdbopi.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbopi2 = dup_Cdbopi2.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  const int itype = type(i);
@@ -2487,9 +2469,9 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeAngular<NEIGHFLAG,EV
  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
  //Kokkos::View<F_FLOAT*, typename DAT::t_float_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_CdDelta = d_CdDelta;
  auto a_f = dup_f.access();
  //auto a_Cdbo = dup_Cdbo.access();
  auto a_CdDelta = dup_CdDelta.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbo = dup_Cdbo.template access<AtomicDup<NEIGHFLAG>::value>();
  auto a_CdDelta = dup_CdDelta.template access<AtomicDup<NEIGHFLAG>::value>();


  const int i = d_ilist[ii];
@@ -2800,9 +2782,9 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeTorsion<NEIGHFLAG,EV
  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  //Kokkos::View<F_FLOAT*, typename DAT::t_float_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_CdDelta = d_CdDelta;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
  auto a_f = dup_f.access();
  auto a_CdDelta = dup_CdDelta.access();
  //auto a_Cdbo = dup_Cdbo.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();
  auto a_CdDelta = dup_CdDelta.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbo = dup_Cdbo.template access<AtomicDup<NEIGHFLAG>::value>();

  // in reaxc_torsion_angles: j = i, k = j, i = k;

@@ -3173,7 +3155,7 @@ KOKKOS_INLINE_FUNCTION
void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeHydrogen<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {

  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  auto a_f = dup_f.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();

  int hblist[MAX_BONDS];
  F_FLOAT theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2;
@@ -3323,9 +3305,9 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxUpdateBond<NEIGHFLAG>, cons
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi = d_Cdbopi;
  Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi2 = d_Cdbopi2;
  //auto a_Cdbo = dup_Cdbo.access();
  //auto a_Cdbopi = dup_Cdbopi.access();
  //auto a_Cdbopi2 = dup_Cdbopi2.access();
  //auto a_Cdbo = dup_Cdbo.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbopi = dup_Cdbopi.template access<AtomicDup<NEIGHFLAG>::value>();
  //auto a_Cdbopi2 = dup_Cdbopi2.template access<AtomicDup<NEIGHFLAG>::value>();

  const int i = d_ilist[ii];
  const tagint itag = tag(i);
@@ -3374,8 +3356,8 @@ void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeBond1<NEIGHFLAG,EVFL

  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  //Kokkos::View<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_CdDelta = d_CdDelta;
  auto a_f = dup_f.access();
  auto a_CdDelta = dup_CdDelta.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();
  auto a_CdDelta = dup_CdDelta.template access<AtomicDup<NEIGHFLAG>::value>();

  F_FLOAT delij[3];
  F_FLOAT p_be1, p_be2, De_s, De_p, De_pp, pow_BOs_be2, exp_be12, CEbo, ebond;
@@ -3513,7 +3495,7 @@ KOKKOS_INLINE_FUNCTION
void PairReaxCKokkos<DeviceType>::operator()(PairReaxComputeBond2<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {

  //Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
  auto a_f = dup_f.access();
  auto a_f = dup_f.template access<AtomicDup<NEIGHFLAG>::value>();

  F_FLOAT delij[3], delik[3], deljk[3], tmpvec[3];
  F_FLOAT dBOp_i[3], dBOp_k[3], dln_BOp_pi[3], dln_BOp_pi2[3];
@@ -3728,8 +3710,8 @@ void PairReaxCKokkos<DeviceType>::ev_tally(EV_FLOAT_REAX &ev, const int &i, cons
  // The eatom and vatom arrays are atomic for Half/Thread neighbor style
  //Kokkos::View<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_eatom = v_eatom;
  //Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_vatom = v_vatom;
  auto a_eatom = dup_eatom.access();
  auto a_vatom = dup_vatom.access();
  auto a_eatom = dup_eatom.template access<AtomicDup<NEIGHFLAG>::value>();
  auto a_vatom = dup_vatom.template access<AtomicDup<NEIGHFLAG>::value>();

  if (eflag_atom) {
    const E_FLOAT epairhalf = 0.5 * epair;
@@ -3796,7 +3778,7 @@ void PairReaxCKokkos<DeviceType>::e_tally(EV_FLOAT_REAX &ev, const int &i, const

  if (eflag_atom) {
    //Kokkos::View<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_eatom = v_eatom;
    auto a_eatom = dup_eatom.access();
    auto a_eatom = dup_eatom.template access<AtomicDup<NEIGHFLAG>::value>();

    const E_FLOAT epairhalf = 0.5 * epair;
    a_eatom[i] += epairhalf;
@@ -3814,7 +3796,7 @@ void PairReaxCKokkos<DeviceType>::e_tally_single(EV_FLOAT_REAX &ev, const int &i
{
  // The eatom array is atomic for Half/Thread neighbor style
  //Kokkos::View<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_eatom = v_eatom;
  auto a_eatom = dup_eatom.access();
  auto a_eatom = dup_eatom.template access<AtomicDup<NEIGHFLAG>::value>();

  a_eatom[i] += epair;
}
@@ -3848,7 +3830,7 @@ void PairReaxCKokkos<DeviceType>::v_tally(EV_FLOAT_REAX &ev, const int &i,

  if (vflag_atom) {
    //Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_vatom = v_vatom;
    auto a_vatom = dup_vatom.access();
    auto a_vatom = dup_vatom.template access<AtomicDup<NEIGHFLAG>::value>();

    a_vatom(i,0) += v[0]; a_vatom(i,1) += v[1]; a_vatom(i,2) += v[2];
    a_vatom(i,3) += v[3]; a_vatom(i,4) += v[4]; a_vatom(i,5) += v[5];
@@ -3866,7 +3848,7 @@ void PairReaxCKokkos<DeviceType>::v_tally3(EV_FLOAT_REAX &ev, const int &i, cons

  // The eatom and vatom arrays are atomic for Half/Thread neighbor style
  //Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_vatom = v_vatom;
  auto a_vatom = dup_vatom.access();
  auto a_vatom = dup_vatom.template access<AtomicDup<NEIGHFLAG>::value>();

  F_FLOAT v[6];

@@ -3927,7 +3909,7 @@ void PairReaxCKokkos<DeviceType>::v_tally4(EV_FLOAT_REAX &ev, const int &i, cons

  if (vflag_atom) {
    //Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_vatom = v_vatom;
    auto a_vatom = dup_vatom.access();
    auto a_vatom = dup_vatom.template access<AtomicDup<NEIGHFLAG>::value>();

    a_vatom(i,0) += 0.25 * v[0]; a_vatom(i,1) += 0.25 * v[1]; a_vatom(i,2) += 0.25 * v[2];
    a_vatom(i,3) += 0.25 * v[3]; a_vatom(i,4) += 0.25 * v[4]; a_vatom(i,5) += 0.25 * v[5];