forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@13419 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
2a4b310a95
commit
ebb392abc2
|
@ -98,6 +98,10 @@ action pair_coul_wolf_kokkos.cpp
|
|||
action pair_coul_wolf_kokkos.h
|
||||
action pair_eam_kokkos.cpp pair_eam.cpp
|
||||
action pair_eam_kokkos.h pair_eam.h
|
||||
action pair_eam_alloy_kokkos.cpp pair_eam_alloy.cpp
|
||||
action pair_eam_alloy_kokkos.h pair_eam_alloy.h
|
||||
action pair_eam_fs_kokkos.cpp pair_eam_fs.cpp
|
||||
action pair_eam_fs_kokkos.h pair_eam_fs.h
|
||||
action pair_kokkos.h
|
||||
action pair_lj_charmm_coul_charmm_implicit_kokkos.cpp pair_lj_charmm_coul_charmm_implicit.cpp
|
||||
action pair_lj_charmm_coul_charmm_implicit_kokkos.h pair_lj_charmm_coul_charmm_implicit.h
|
||||
|
@ -129,8 +133,16 @@ action pair_lj_gromacs_kokkos.cpp
|
|||
action pair_lj_gromacs_kokkos.h
|
||||
action pair_lj_sdk_kokkos.cpp pair_lj_sdk.cpp
|
||||
action pair_lj_sdk_kokkos.h pair_lj_sdk.h
|
||||
action pair_sw_kokkos.cpp pair_sw.cpp
|
||||
action pair_sw_kokkos.h pair_sw.h
|
||||
action pair_table_kokkos.cpp
|
||||
action pair_table_kokkos.h
|
||||
action pair_tersoff_kokkos.cpp pair_tersoff.cpp
|
||||
action pair_tersoff_kokkos.h pair_tersoff.h
|
||||
action pair_tersoff_mod_kokkos.cpp pair_tersoff_mod.cpp
|
||||
action pair_tersoff_mod_kokkos.h pair_tersoff_mod.h
|
||||
action pair_tersoff_zbl_kokkos.cpp pair_tersoff_zbl.cpp
|
||||
action pair_tersoff_zbl_kokkos.h pair_tersoff_zbl.h
|
||||
action verlet_kokkos.cpp
|
||||
action verlet_kokkos.h
|
||||
|
||||
|
|
|
@ -214,6 +214,14 @@ typedef tdual_int_1d::t_dev_um t_int_1d_um;
|
|||
typedef tdual_int_1d::t_dev_const_um t_int_1d_const_um;
|
||||
typedef tdual_int_1d::t_dev_const_randomread t_int_1d_randomread;
|
||||
|
||||
typedef Kokkos::
|
||||
DualView<int*[3], Kokkos::LayoutRight, LMPDeviceType> tdual_int_1d_3;
|
||||
typedef tdual_int_1d_3::t_dev t_int_1d_3;
|
||||
typedef tdual_int_1d_3::t_dev_const t_int_1d_3_const;
|
||||
typedef tdual_int_1d_3::t_dev_um t_int_1d_3_um;
|
||||
typedef tdual_int_1d_3::t_dev_const_um t_int_1d_3_const_um;
|
||||
typedef tdual_int_1d_3::t_dev_const_randomread t_int_1d_3_randomread;
|
||||
|
||||
typedef Kokkos::
|
||||
DualView<int**, Kokkos::LayoutRight, LMPDeviceType> tdual_int_2d;
|
||||
typedef tdual_int_2d::t_dev t_int_2d;
|
||||
|
@ -440,6 +448,13 @@ typedef tdual_int_1d::t_host_um t_int_1d_um;
|
|||
typedef tdual_int_1d::t_host_const_um t_int_1d_const_um;
|
||||
typedef tdual_int_1d::t_host_const_randomread t_int_1d_randomread;
|
||||
|
||||
typedef Kokkos::DualView<int*[3], Kokkos::LayoutRight, LMPDeviceType> tdual_int_1d_3;
|
||||
typedef tdual_int_1d_3::t_host t_int_1d_3;
|
||||
typedef tdual_int_1d_3::t_host_const t_int_1d_3_const;
|
||||
typedef tdual_int_1d_3::t_host_um t_int_1d_3_um;
|
||||
typedef tdual_int_1d_3::t_host_const_um t_int_1d_3_const_um;
|
||||
typedef tdual_int_1d_3::t_host_const_randomread t_int_1d_3_randomread;
|
||||
|
||||
typedef Kokkos::DualView<int**, Kokkos::LayoutRight, LMPDeviceType> tdual_int_2d;
|
||||
typedef tdual_int_2d::t_host t_int_2d;
|
||||
typedef tdual_int_2d::t_host_const t_int_2d_const;
|
||||
|
|
|
@ -19,17 +19,20 @@ using namespace LAMMPS_NS;
|
|||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
template<class DeviceType, int HALF_NEIGH>
|
||||
template<class DeviceType, int HALF_NEIGH, int GHOST>
|
||||
void NeighborKokkos::full_bin_kokkos(NeighListKokkos<DeviceType> *list)
|
||||
{
|
||||
const int nall = includegroup?atom->nfirst:atom->nlocal;
|
||||
const int nlocal = includegroup?atom->nfirst:atom->nlocal;
|
||||
int nall = nlocal;
|
||||
if (GHOST)
|
||||
nall += atom->nghost;
|
||||
list->grow(nall);
|
||||
|
||||
NeighborKokkosExecute<DeviceType>
|
||||
data(*list,
|
||||
k_cutneighsq.view<DeviceType>(),
|
||||
k_bincount.view<DeviceType>(),
|
||||
k_bins.view<DeviceType>(),nall,
|
||||
k_bins.view<DeviceType>(),nlocal,
|
||||
atomKK->k_x.view<DeviceType>(),
|
||||
atomKK->k_type.view<DeviceType>(),
|
||||
atomKK->k_mask.view<DeviceType>(),
|
||||
|
@ -68,6 +71,8 @@ void NeighborKokkos::full_bin_kokkos(NeighListKokkos<DeviceType> *list)
|
|||
k_ex_mol_bit.sync<DeviceType>();
|
||||
atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK);
|
||||
Kokkos::deep_copy(list->d_stencil,list->h_stencil);
|
||||
if (GHOST)
|
||||
Kokkos::deep_copy(list->d_stencilxyz,list->h_stencilxyz);
|
||||
|
||||
data.special_flag[0] = special_flag[0];
|
||||
data.special_flag[1] = special_flag[1];
|
||||
|
@ -119,20 +124,25 @@ void NeighborKokkos::full_bin_kokkos(NeighListKokkos<DeviceType> *list)
|
|||
const int factor = 1;
|
||||
#endif
|
||||
|
||||
if(newton_pair) {
|
||||
NeighborKokkosBuildFunctor<DeviceType,HALF_NEIGH,1> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
|
||||
#ifdef KOKKOS_HAVE_CUDA
|
||||
Kokkos::parallel_for(config, f);
|
||||
#else
|
||||
if (GHOST && !HALF_NEIGH) {
|
||||
NeighborKokkosBuildFunctorFullGhost<DeviceType> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
|
||||
Kokkos::parallel_for(nall, f);
|
||||
#endif
|
||||
} else {
|
||||
NeighborKokkosBuildFunctor<DeviceType,HALF_NEIGH,0> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
|
||||
if(newton_pair) {
|
||||
NeighborKokkosBuildFunctor<DeviceType,HALF_NEIGH,1> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
|
||||
#ifdef KOKKOS_HAVE_CUDA
|
||||
Kokkos::parallel_for(config, f);
|
||||
Kokkos::parallel_for(config, f);
|
||||
#else
|
||||
Kokkos::parallel_for(nall, f);
|
||||
Kokkos::parallel_for(nall, f);
|
||||
#endif
|
||||
} else {
|
||||
NeighborKokkosBuildFunctor<DeviceType,HALF_NEIGH,0> f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor);
|
||||
#ifdef KOKKOS_HAVE_CUDA
|
||||
Kokkos::parallel_for(config, f);
|
||||
#else
|
||||
Kokkos::parallel_for(nall, f);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
DeviceType::fence();
|
||||
deep_copy(data.h_resize, data.resize);
|
||||
|
@ -146,8 +156,13 @@ if(newton_pair) {
|
|||
}
|
||||
}
|
||||
|
||||
list->inum = nall;
|
||||
list->gnum = 0;
|
||||
if (GHOST) {
|
||||
list->inum = atom->nlocal;
|
||||
list->gnum = nall - atom->nlocal;
|
||||
} else {
|
||||
list->inum = nall;
|
||||
list->gnum = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -524,6 +539,120 @@ void NeighborKokkosExecute<DeviceType>::build_ItemCuda(typename Kokkos::TeamPoli
|
|||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
template<class Device>
|
||||
void NeighborKokkosExecute<Device>::
|
||||
build_Item_Full_Ghost(const int &i) const
|
||||
{
|
||||
/* if necessary, goto next page and add pages */
|
||||
int n = 0;
|
||||
int which = 0;
|
||||
int moltemplate;
|
||||
if (molecular == 2) moltemplate = 1;
|
||||
else moltemplate = 0;
|
||||
// get subview of neighbors of i
|
||||
|
||||
const AtomNeighbors neighbors_i = neigh_list.get_neighbors(i);
|
||||
const X_FLOAT xtmp = x(i, 0);
|
||||
const X_FLOAT ytmp = x(i, 1);
|
||||
const X_FLOAT ztmp = x(i, 2);
|
||||
const int itype = type(i);
|
||||
|
||||
const int nstencil = neigh_list.nstencil;
|
||||
const typename ArrayTypes<Device>::t_int_1d_const_um stencil
|
||||
= neigh_list.d_stencil;
|
||||
const typename ArrayTypes<Device>::t_int_1d_3_const_um stencilxyz
|
||||
= neigh_list.d_stencilxyz;
|
||||
|
||||
// loop over all atoms in surrounding bins in stencil including self
|
||||
// when i is a ghost atom, must check if stencil bin is out of bounds
|
||||
// skip i = j
|
||||
// no molecular test when i = ghost atom
|
||||
|
||||
if (i < nlocal) {
|
||||
const int ibin = coord2bin(xtmp, ytmp, ztmp);
|
||||
for (int k = 0; k < nstencil; k++) {
|
||||
const int jbin = ibin + stencil[k];
|
||||
for(int m = 0; m < c_bincount(jbin); m++) {
|
||||
const int j = c_bins(jbin,m);
|
||||
if (i == j) continue;
|
||||
|
||||
const int jtype = type[j];
|
||||
if(exclude && exclusion(i,j,itype,jtype)) continue;
|
||||
|
||||
const X_FLOAT delx = xtmp - x(j,0);
|
||||
const X_FLOAT dely = ytmp - x(j,1);
|
||||
const X_FLOAT delz = ztmp - x(j,2);
|
||||
const X_FLOAT rsq = delx*delx + dely*dely + delz*delz;
|
||||
|
||||
if (rsq <= cutneighsq(itype,jtype)) {
|
||||
if (molecular) {
|
||||
if (!moltemplate)
|
||||
which = find_special(i,j);
|
||||
/* else if (imol >= 0) */
|
||||
/* which = find_special(onemols[imol]->special[iatom], */
|
||||
/* onemols[imol]->nspecial[iatom], */
|
||||
/* tag[j]-tagprev); */
|
||||
/* else which = 0; */
|
||||
if (which == 0){
|
||||
if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
|
||||
}else if (minimum_image_check(delx,dely,delz)){
|
||||
if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
|
||||
}
|
||||
else if (which > 0) {
|
||||
if(n<neigh_list.maxneighs) neighbors_i(n++) = j ^ (which << SBBITS);
|
||||
}
|
||||
} else {
|
||||
if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
int binxyz[3];
|
||||
const int ibin = coord2bin(xtmp, ytmp, ztmp, binxyz);
|
||||
const int xbin = binxyz[0];
|
||||
const int ybin = binxyz[1];
|
||||
const int zbin = binxyz[2];
|
||||
for (int k = 0; k < nstencil; k++) {
|
||||
const X_FLOAT xbin2 = xbin + stencilxyz(k,0);
|
||||
const X_FLOAT ybin2 = ybin + stencilxyz(k,1);
|
||||
const X_FLOAT zbin2 = zbin + stencilxyz(k,2);
|
||||
if (xbin2 < 0 || xbin2 >= mbinx ||
|
||||
ybin2 < 0 || ybin2 >= mbiny ||
|
||||
zbin2 < 0 || zbin2 >= mbinz) continue;
|
||||
const int jbin = ibin + stencil[k];
|
||||
for(int m = 0; m < c_bincount(jbin); m++) {
|
||||
const int j = c_bins(jbin,m);
|
||||
if (i == j) continue;
|
||||
|
||||
const int jtype = type[j];
|
||||
if(exclude && exclusion(i,j,itype,jtype)) continue;
|
||||
|
||||
const X_FLOAT delx = xtmp - x(j,0);
|
||||
const X_FLOAT dely = ytmp - x(j,1);
|
||||
const X_FLOAT delz = ztmp - x(j,2);
|
||||
const X_FLOAT rsq = delx*delx + dely*dely + delz*delz;
|
||||
|
||||
if (rsq <= cutneighsq(itype,jtype)) {
|
||||
if(n<neigh_list.maxneighs) neighbors_i(n++) = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
neigh_list.d_numneigh(i) = n;
|
||||
|
||||
if(n >= neigh_list.maxneighs) {
|
||||
resize() = 1;
|
||||
|
||||
if(n >= new_maxneighs()) new_maxneighs() = n;
|
||||
}
|
||||
neigh_list.d_ilist(i) = i;
|
||||
}
|
||||
|
||||
template<class DeviceType>
|
||||
void NeighborKokkos::full_bin_cluster_kokkos(NeighListKokkos<DeviceType> *list)
|
||||
{
|
||||
|
|
|
@ -81,8 +81,8 @@ void NeighListKokkos<Device>::stencil_allocate(int smax, int style)
|
|||
memory->create_kokkos(d_stencil,h_stencil,stencil,maxstencil,
|
||||
"neighlist:stencil");
|
||||
if (ghostflag) {
|
||||
memory->destroy(stencilxyz);
|
||||
memory->create(stencilxyz,maxstencil,3,"neighlist:stencilxyz");
|
||||
memory->create_kokkos(d_stencilxyz,h_stencilxyz,stencilxyz,maxstencil,
|
||||
3,"neighlist:stencilxyz");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ class AtomNeighbors
|
|||
KOKKOS_INLINE_FUNCTION
|
||||
AtomNeighbors(int* const & firstneigh, const int & _num_neighs,
|
||||
const int & stride):
|
||||
_firstneigh(firstneigh), _stride(stride), num_neighs(_num_neighs) {};
|
||||
num_neighs(_num_neighs), _firstneigh(firstneigh), _stride(stride) {};
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
int& operator()(const int &i) const {
|
||||
return _firstneigh[i*_stride];
|
||||
|
@ -45,12 +45,12 @@ class AtomNeighborsConst
|
|||
{
|
||||
public:
|
||||
const int* const _firstneigh;
|
||||
const int numneigh;
|
||||
const int num_neighs;
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
AtomNeighborsConst(int* const & firstneigh, const int & _numneigh,
|
||||
AtomNeighborsConst(int* const & firstneigh, const int & _num_neighs,
|
||||
const int & stride):
|
||||
_firstneigh(firstneigh), _stride(stride), numneigh(_numneigh) {};
|
||||
_firstneigh(firstneigh), num_neighs(_num_neighs), _stride(stride) {};
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
const int& operator()(const int &i) const {
|
||||
return _firstneigh[i*_stride];
|
||||
|
@ -75,6 +75,8 @@ public:
|
|||
typename ArrayTypes<Device>::t_int_1d d_numneigh; // # of J neighs for each I
|
||||
typename ArrayTypes<Device>::t_int_1d d_stencil; // # of J neighs for each I
|
||||
typename ArrayTypes<LMPHostType>::t_int_1d h_stencil; // # of J neighs per I
|
||||
typename ArrayTypes<Device>::t_int_1d_3 d_stencilxyz;
|
||||
typename ArrayTypes<LMPHostType>::t_int_1d_3 h_stencilxyz;
|
||||
|
||||
NeighListKokkos(class LAMMPS *lmp):
|
||||
NeighList(lmp) {_stride = 1; maxneighs = 16;};
|
||||
|
|
|
@ -269,18 +269,32 @@ void NeighborKokkos::choose_build(int index, NeighRequest *rq)
|
|||
{
|
||||
if (rq->kokkos_host != 0) {
|
||||
PairPtrHost pb = NULL;
|
||||
if (rq->full) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,0>;
|
||||
else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,1>;
|
||||
pair_build_host[index] = pb;
|
||||
if (rq->ghost) {
|
||||
if (rq->full) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,0,1>;
|
||||
else if (rq->half) error->one(FLERR,"Cannot (yet) request ghost atoms with Kokkos half neighbor list");
|
||||
pair_build_host[index] = pb;
|
||||
} else {
|
||||
if (rq->full) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,0,0>;
|
||||
else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPHostType,1,0>;
|
||||
pair_build_host[index] = pb;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (rq->kokkos_device != 0) {
|
||||
PairPtrDevice pb = NULL;
|
||||
if (rq->full) {
|
||||
if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPDeviceType>;
|
||||
else pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,0>;
|
||||
if (rq->ghost) {
|
||||
if (rq->full) {
|
||||
if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPDeviceType>;
|
||||
else pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,0,1>;
|
||||
}
|
||||
else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,1,1>;
|
||||
} else {
|
||||
if (rq->full) {
|
||||
if (rq->full_cluster) pb = &NeighborKokkos::full_bin_cluster_kokkos<LMPDeviceType>;
|
||||
else pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,0,0>;
|
||||
}
|
||||
else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,1,0>;
|
||||
}
|
||||
else if (rq->half) pb = &NeighborKokkos::full_bin_kokkos<LMPDeviceType,1>;
|
||||
pair_build_device[index] = pb;
|
||||
return;
|
||||
}
|
||||
|
@ -441,10 +455,14 @@ void NeighborKokkos::build_kokkos(int topoflag)
|
|||
|
||||
if (anyghostlist && atom->nlocal+atom->nghost > maxatom) {
|
||||
maxatom = atom->nmax;
|
||||
for (i = 0; i < nglist; i++) lists[glist[i]]->grow(maxatom);
|
||||
for (i = 0; i < nglist; i++)
|
||||
if (lists[glist[i]]) lists[glist[i]]->grow(maxatom);
|
||||
else init_list_grow_kokkos(glist[i]);
|
||||
} else if (atom->nlocal > maxatom) {
|
||||
maxatom = atom->nmax;
|
||||
for (i = 0; i < nglist; i++) lists[glist[i]]->grow(maxatom);
|
||||
for (i = 0; i < nglist; i++)
|
||||
if (lists[glist[i]]) lists[glist[i]]->grow(maxatom);
|
||||
else init_list_grow_kokkos(glist[i]);
|
||||
}
|
||||
|
||||
// extend atom bin list if necessary
|
||||
|
|
|
@ -158,6 +158,9 @@ class NeighborKokkosExecute
|
|||
KOKKOS_FUNCTION
|
||||
void build_Item(const int &i) const;
|
||||
|
||||
KOKKOS_FUNCTION
|
||||
void build_Item_Full_Ghost(const int &i) const;
|
||||
|
||||
template<int ClusterSize>
|
||||
KOKKOS_FUNCTION
|
||||
void build_cluster_Item(const int &i) const;
|
||||
|
@ -203,6 +206,42 @@ class NeighborKokkosExecute
|
|||
return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
int coord2bin(const X_FLOAT & x,const X_FLOAT & y,const X_FLOAT & z, int* i) const
|
||||
{
|
||||
int ix,iy,iz;
|
||||
|
||||
if (x >= bboxhi[0])
|
||||
ix = static_cast<int> ((x-bboxhi[0])*bininvx) + nbinx;
|
||||
else if (x >= bboxlo[0]) {
|
||||
ix = static_cast<int> ((x-bboxlo[0])*bininvx);
|
||||
ix = MIN(ix,nbinx-1);
|
||||
} else
|
||||
ix = static_cast<int> ((x-bboxlo[0])*bininvx) - 1;
|
||||
|
||||
if (y >= bboxhi[1])
|
||||
iy = static_cast<int> ((y-bboxhi[1])*bininvy) + nbiny;
|
||||
else if (y >= bboxlo[1]) {
|
||||
iy = static_cast<int> ((y-bboxlo[1])*bininvy);
|
||||
iy = MIN(iy,nbiny-1);
|
||||
} else
|
||||
iy = static_cast<int> ((y-bboxlo[1])*bininvy) - 1;
|
||||
|
||||
if (z >= bboxhi[2])
|
||||
iz = static_cast<int> ((z-bboxhi[2])*bininvz) + nbinz;
|
||||
else if (z >= bboxlo[2]) {
|
||||
iz = static_cast<int> ((z-bboxlo[2])*bininvz);
|
||||
iz = MIN(iz,nbinz-1);
|
||||
} else
|
||||
iz = static_cast<int> ((z-bboxlo[2])*bininvz) - 1;
|
||||
|
||||
i[0] = ix - mbinxlo;
|
||||
i[1] = iy - mbinylo;
|
||||
i[2] = iz - mbinzlo;
|
||||
|
||||
return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
int exclusion(const int &i,const int &j, const int &itype,const int &jtype) const;
|
||||
|
||||
|
@ -258,6 +297,23 @@ struct NeighborKokkosBuildFunctor {
|
|||
#endif
|
||||
};
|
||||
|
||||
template<class Device>
|
||||
struct NeighborKokkosBuildFunctorFullGhost {
|
||||
typedef Device device_type;
|
||||
|
||||
const NeighborKokkosExecute<Device> c;
|
||||
const size_t sharedsize;
|
||||
|
||||
NeighborKokkosBuildFunctorFullGhost(const NeighborKokkosExecute<Device> &_c,
|
||||
const size_t _sharedsize):c(_c),
|
||||
sharedsize(_sharedsize) {};
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator() (const int & i) const {
|
||||
c.build_Item_Full_Ghost(i);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Device,int ClusterSize>
|
||||
struct NeighborClusterKokkosBuildFunctor {
|
||||
typedef Device device_type;
|
||||
|
@ -358,7 +414,7 @@ class NeighborKokkos : public Neighbor {
|
|||
(class NeighListKokkos<LMPDeviceType> *);
|
||||
PairPtrDevice *pair_build_device;
|
||||
|
||||
template<class DeviceType,int HALF_NEIGH>
|
||||
template<class DeviceType,int HALF_NEIGH, int GHOST>
|
||||
void full_bin_kokkos(NeighListKokkos<DeviceType> *list);
|
||||
template<class DeviceType>
|
||||
void full_bin_cluster_kokkos(NeighListKokkos<DeviceType> *list);
|
||||
|
@ -383,4 +439,8 @@ The number of nlocal + nghost atoms on a processor
|
|||
is limited by the size of a 32-bit integer with 2 bits
|
||||
removed for masking 1-2, 1-3, 1-4 neighbors.
|
||||
|
||||
E: Cannot (yet) request ghost atoms with Kokkos half neighbor list
|
||||
|
||||
This feature is not yet supported.
|
||||
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue