Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F87330252
atom_vec_full_kokkos.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Oct 12, 01:13
Size
91 KB
Mime Type
text/x-c
Expires
Mon, Oct 14, 01:13 (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
21577793
Attached To
rLAMMPS lammps
atom_vec_full_kokkos.cpp
View Options
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include <stdlib.h>
#include "atom_vec_full_kokkos.h"
#include "atom_kokkos.h"
#include "comm_kokkos.h"
#include "domain.h"
#include "modify.h"
#include "fix.h"
#include "atom_masks.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
#define DELTA 10000
/* ---------------------------------------------------------------------- */
AtomVecFullKokkos::AtomVecFullKokkos(LAMMPS *lmp) : AtomVecKokkos(lmp)
{
molecular = 1;
bonds_allow = angles_allow = dihedrals_allow = impropers_allow = 1;
mass_type = 1;
comm_x_only = comm_f_only = 1;
size_forward = 3;
size_reverse = 3;
size_border = 8;
size_velocity = 3;
size_data_atom = 7;
size_data_vel = 4;
xcol_data = 5;
atom->molecule_flag = atom->q_flag = 1;
k_count = DAT::tdual_int_1d("atom::k_count",1);
atomKK = (AtomKokkos *) atom;
commKK = (CommKokkos *) comm;
}
/* ----------------------------------------------------------------------
grow atom arrays
n = 0 grows arrays by DELTA
n > 0 allocates arrays to size n
------------------------------------------------------------------------- */
void AtomVecFullKokkos::grow(int n)
{
if (n == 0) nmax += DELTA;
else nmax = n;
atomKK->nmax = nmax;
if (nmax < 0 || nmax > MAXSMALLINT)
error->one(FLERR,"Per-processor system is too big");
sync(Device,ALL_MASK);
modified(Device,ALL_MASK);
memory->grow_kokkos(atomKK->k_tag,atomKK->tag,nmax,"atom:tag");
memory->grow_kokkos(atomKK->k_type,atomKK->type,nmax,"atom:type");
memory->grow_kokkos(atomKK->k_mask,atomKK->mask,nmax,"atom:mask");
memory->grow_kokkos(atomKK->k_image,atomKK->image,nmax,"atom:image");
memory->grow_kokkos(atomKK->k_x,atomKK->x,nmax,3,"atom:x");
memory->grow_kokkos(atomKK->k_v,atomKK->v,nmax,3,"atom:v");
memory->grow_kokkos(atomKK->k_f,atomKK->f,nmax,3,"atom:f");
memory->grow_kokkos(atomKK->k_q,atomKK->q,nmax,"atom:q");
memory->grow_kokkos(atomKK->k_molecule,atomKK->molecule,nmax,"atom:molecule");
memory->grow_kokkos(atomKK->k_nspecial,atomKK->nspecial,nmax,3,"atom:nspecial");
memory->grow_kokkos(atomKK->k_special,atomKK->special,nmax,atomKK->maxspecial,
"atom:special");
memory->grow_kokkos(atomKK->k_num_bond,atomKK->num_bond,nmax,"atom:num_bond");
memory->grow_kokkos(atomKK->k_bond_type,atomKK->bond_type,nmax,atomKK->bond_per_atom,
"atom:bond_type");
memory->grow_kokkos(atomKK->k_bond_atom,atomKK->bond_atom,nmax,atomKK->bond_per_atom,
"atom:bond_atom");
memory->grow_kokkos(atomKK->k_num_angle,atomKK->num_angle,nmax,"atom:num_angle");
memory->grow_kokkos(atomKK->k_angle_type,atomKK->angle_type,nmax,atomKK->angle_per_atom,
"atom:angle_type");
memory->grow_kokkos(atomKK->k_angle_atom1,atomKK->angle_atom1,nmax,atomKK->angle_per_atom,
"atom:angle_atom1");
memory->grow_kokkos(atomKK->k_angle_atom2,atomKK->angle_atom2,nmax,atomKK->angle_per_atom,
"atom:angle_atom2");
memory->grow_kokkos(atomKK->k_angle_atom3,atomKK->angle_atom3,nmax,atomKK->angle_per_atom,
"atom:angle_atom3");
memory->grow_kokkos(atomKK->k_num_dihedral,atomKK->num_dihedral,nmax,"atom:num_dihedral");
memory->grow_kokkos(atomKK->k_dihedral_type,atomKK->dihedral_type,nmax,
atomKK->dihedral_per_atom,"atom:dihedral_type");
memory->grow_kokkos(atomKK->k_dihedral_atom1,atomKK->dihedral_atom1,nmax,
atomKK->dihedral_per_atom,"atom:dihedral_atom1");
memory->grow_kokkos(atomKK->k_dihedral_atom2,atomKK->dihedral_atom2,nmax,
atomKK->dihedral_per_atom,"atom:dihedral_atom2");
memory->grow_kokkos(atomKK->k_dihedral_atom3,atomKK->dihedral_atom3,nmax,
atomKK->dihedral_per_atom,"atom:dihedral_atom3");
memory->grow_kokkos(atomKK->k_dihedral_atom4,atomKK->dihedral_atom4,nmax,
atomKK->dihedral_per_atom,"atom:dihedral_atom4");
memory->grow_kokkos(atomKK->k_num_improper,atomKK->num_improper,nmax,"atom:num_improper");
memory->grow_kokkos(atomKK->k_improper_type,atomKK->improper_type,nmax,
atomKK->improper_per_atom,"atom:improper_type");
memory->grow_kokkos(atomKK->k_improper_atom1,atomKK->improper_atom1,nmax,
atomKK->improper_per_atom,"atom:improper_atom1");
memory->grow_kokkos(atomKK->k_improper_atom2,atomKK->improper_atom2,nmax,
atomKK->improper_per_atom,"atom:improper_atom2");
memory->grow_kokkos(atomKK->k_improper_atom3,atomKK->improper_atom3,nmax,
atomKK->improper_per_atom,"atom:improper_atom3");
memory->grow_kokkos(atomKK->k_improper_atom4,atomKK->improper_atom4,nmax,
atomKK->improper_per_atom,"atom:improper_atom4");
grow_reset();
sync(Host,ALL_MASK);
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->grow_arrays(nmax);
}
/* ----------------------------------------------------------------------
reset local array ptrs
------------------------------------------------------------------------- */
void AtomVecFullKokkos::grow_reset()
{
tag = atomKK->tag;
d_tag = atomKK->k_tag.d_view;
h_tag = atomKK->k_tag.h_view;
type = atomKK->type;
d_type = atomKK->k_type.d_view;
h_type = atomKK->k_type.h_view;
mask = atomKK->mask;
d_mask = atomKK->k_mask.d_view;
h_mask = atomKK->k_mask.h_view;
image = atomKK->image;
d_image = atomKK->k_image.d_view;
h_image = atomKK->k_image.h_view;
x = atomKK->x;
d_x = atomKK->k_x.d_view;
h_x = atomKK->k_x.h_view;
v = atomKK->v;
d_v = atomKK->k_v.d_view;
h_v = atomKK->k_v.h_view;
f = atomKK->f;
d_f = atomKK->k_f.d_view;
h_f = atomKK->k_f.h_view;
q = atomKK->q;
d_q = atomKK->k_q.d_view;
h_q = atomKK->k_q.h_view;
molecule = atomKK->molecule;
d_molecule = atomKK->k_molecule.d_view;
h_molecule = atomKK->k_molecule.h_view;
nspecial = atomKK->nspecial;
d_nspecial = atomKK->k_nspecial.d_view;
h_nspecial = atomKK->k_nspecial.h_view;
special = atomKK->special;
d_special = atomKK->k_special.d_view;
h_special = atomKK->k_special.h_view;
num_bond = atomKK->num_bond;
d_num_bond = atomKK->k_num_bond.d_view;
h_num_bond = atomKK->k_num_bond.h_view;
bond_type = atomKK->bond_type;
d_bond_type = atomKK->k_bond_type.d_view;
h_bond_type = atomKK->k_bond_type.h_view;
bond_atom = atomKK->bond_atom;
d_bond_atom = atomKK->k_bond_atom.d_view;
h_bond_atom = atomKK->k_bond_atom.h_view;
num_angle = atomKK->num_angle;
d_num_angle = atomKK->k_num_angle.d_view;
h_num_angle = atomKK->k_num_angle.h_view;
angle_type = atomKK->angle_type;
d_angle_type = atomKK->k_angle_type.d_view;
h_angle_type = atomKK->k_angle_type.h_view;
angle_atom1 = atomKK->angle_atom1;
d_angle_atom1 = atomKK->k_angle_atom1.d_view;
h_angle_atom1 = atomKK->k_angle_atom1.h_view;
angle_atom2 = atomKK->angle_atom2;
d_angle_atom2 = atomKK->k_angle_atom2.d_view;
h_angle_atom2 = atomKK->k_angle_atom2.h_view;
angle_atom3 = atomKK->angle_atom3;
d_angle_atom3 = atomKK->k_angle_atom3.d_view;
h_angle_atom3 = atomKK->k_angle_atom3.h_view;
num_dihedral = atomKK->num_dihedral;
d_num_dihedral = atomKK->k_num_dihedral.d_view;
h_num_dihedral = atomKK->k_num_dihedral.h_view;
dihedral_type = atomKK->dihedral_type;
d_dihedral_type = atomKK->k_dihedral_type.d_view;
h_dihedral_type = atomKK->k_dihedral_type.h_view;
dihedral_atom1 = atomKK->dihedral_atom1;
d_dihedral_atom1 = atomKK->k_dihedral_atom1.d_view;
h_dihedral_atom1 = atomKK->k_dihedral_atom1.h_view;
dihedral_atom2 = atomKK->dihedral_atom2;
d_dihedral_atom2 = atomKK->k_dihedral_atom2.d_view;
h_dihedral_atom2 = atomKK->k_dihedral_atom2.h_view;
dihedral_atom3 = atomKK->dihedral_atom3;
d_dihedral_atom3 = atomKK->k_dihedral_atom3.d_view;
h_dihedral_atom3 = atomKK->k_dihedral_atom3.h_view;
dihedral_atom4 = atomKK->dihedral_atom4;
d_dihedral_atom4 = atomKK->k_dihedral_atom4.d_view;
h_dihedral_atom4 = atomKK->k_dihedral_atom4.h_view;
num_improper = atomKK->num_improper;
d_num_improper = atomKK->k_num_improper.d_view;
h_num_improper = atomKK->k_num_improper.h_view;
improper_type = atomKK->improper_type;
d_improper_type = atomKK->k_improper_type.d_view;
h_improper_type = atomKK->k_improper_type.h_view;
improper_atom1 = atomKK->improper_atom1;
d_improper_atom1 = atomKK->k_improper_atom1.d_view;
h_improper_atom1 = atomKK->k_improper_atom1.h_view;
improper_atom2 = atomKK->improper_atom2;
d_improper_atom2 = atomKK->k_improper_atom2.d_view;
h_improper_atom2 = atomKK->k_improper_atom2.h_view;
improper_atom3 = atomKK->improper_atom3;
d_improper_atom3 = atomKK->k_improper_atom3.d_view;
h_improper_atom3 = atomKK->k_improper_atom3.h_view;
improper_atom4 = atomKK->improper_atom4;
d_improper_atom4 = atomKK->k_improper_atom4.d_view;
h_improper_atom4 = atomKK->k_improper_atom4.h_view;
}
/* ----------------------------------------------------------------------
copy atom I info to atom J
------------------------------------------------------------------------- */
void AtomVecFullKokkos::copy(int i, int j, int delflag)
{
int k;
h_tag[j] = h_tag[i];
h_type[j] = h_type[i];
mask[j] = mask[i];
h_image[j] = h_image[i];
h_x(j,0) = h_x(i,0);
h_x(j,1) = h_x(i,1);
h_x(j,2) = h_x(i,2);
h_v(j,0) = h_v(i,0);
h_v(j,1) = h_v(i,1);
h_v(j,2) = h_v(i,2);
h_q[j] = h_q[i];
h_molecule(j) = h_molecule(i);
h_num_bond(j) = h_num_bond(i);
for (k = 0; k < h_num_bond(j); k++) {
h_bond_type(j,k) = h_bond_type(i,k);
h_bond_atom(j,k) = h_bond_atom(i,k);
}
h_nspecial(j,0) = h_nspecial(i,0);
h_nspecial(j,1) = h_nspecial(i,1);
h_nspecial(j,2) = h_nspecial(i,2);
for (k = 0; k < h_nspecial(j,2); k++)
h_special(j,k) = h_special(i,k);
h_num_angle(j) = h_num_angle(i);
for (k = 0; k < h_num_angle(j); k++) {
h_angle_type(j,k) = h_angle_type(i,k);
h_angle_atom1(j,k) = h_angle_atom1(i,k);
h_angle_atom2(j,k) = h_angle_atom2(i,k);
h_angle_atom3(j,k) = h_angle_atom3(i,k);
}
h_num_dihedral(j) = h_num_dihedral(i);
for (k = 0; k < h_num_dihedral(j); k++) {
h_dihedral_type(j,k) = h_dihedral_type(i,k);
h_dihedral_atom1(j,k) = h_dihedral_atom1(i,k);
h_dihedral_atom2(j,k) = h_dihedral_atom2(i,k);
h_dihedral_atom3(j,k) = h_dihedral_atom3(i,k);
h_dihedral_atom4(j,k) = h_dihedral_atom4(i,k);
}
h_num_improper(j) = h_num_improper(i);
for (k = 0; k < h_num_improper(j); k++) {
h_improper_type(j,k) = h_improper_type(i,k);
h_improper_atom1(j,k) = h_improper_atom1(i,k);
h_improper_atom2(j,k) = h_improper_atom2(i,k);
h_improper_atom3(j,k) = h_improper_atom3(i,k);
h_improper_atom4(j,k) = h_improper_atom4(i,k);
}
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
modify->fix[atom->extra_grow[iextra]]->copy_arrays(i,j,delflag);
}
/* ---------------------------------------------------------------------- */
template<class DeviceType,int PBC_FLAG,int TRICLINIC>
struct AtomVecFullKokkos_PackComm {
typedef DeviceType device_type;
typename ArrayTypes<DeviceType>::t_x_array_randomread _x;
typename ArrayTypes<DeviceType>::t_xfloat_2d_um _buf;
typename ArrayTypes<DeviceType>::t_int_2d_const _list;
const int _iswap;
X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz;
X_FLOAT _pbc[6];
AtomVecFullKokkos_PackComm(
const typename DAT::tdual_x_array &x,
const typename DAT::tdual_xfloat_2d &buf,
const typename DAT::tdual_int_2d &list,
const int & iswap,
const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd,
const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc):
_x(x.view<DeviceType>()),_list(list.view<DeviceType>()),_iswap(iswap),
_xprd(xprd),_yprd(yprd),_zprd(zprd),
_xy(xy),_xz(xz),_yz(yz) {
const size_t maxsend = (buf.view<DeviceType>().dimension_0()
*buf.view<DeviceType>().dimension_1())/3;
const size_t elements = 3;
buffer_view<DeviceType>(_buf,buf,maxsend,elements);
_pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2];
_pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5];
};
KOKKOS_INLINE_FUNCTION
void operator() (const int& i) const {
const int j = _list(_iswap,i);
if (PBC_FLAG == 0) {
_buf(i,0) = _x(j,0);
_buf(i,1) = _x(j,1);
_buf(i,2) = _x(j,2);
} else {
if (TRICLINIC == 0) {
_buf(i,0) = _x(j,0) + _pbc[0]*_xprd;
_buf(i,1) = _x(j,1) + _pbc[1]*_yprd;
_buf(i,2) = _x(j,2) + _pbc[2]*_zprd;
} else {
_buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz;
_buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz;
_buf(i,2) = _x(j,2) + _pbc[2]*_zprd;
}
}
}
};
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_comm_kokkos(const int &n,
const DAT::tdual_int_2d &list,
const int & iswap,
const DAT::tdual_xfloat_2d &buf,
const int &pbc_flag,
const int* const pbc)
{
// Check whether to always run forward communication on the host
// Choose correct forward PackComm kernel
if(commKK->forward_comm_on_host) {
sync(Host,X_MASK);
if(pbc_flag) {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackComm<LMPHostType,1,1>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackComm<LMPHostType,1,0>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
} else {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackComm<LMPHostType,0,1>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackComm<LMPHostType,0,0>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
}
LMPHostType::fence();
} else {
sync(Device,X_MASK);
if(pbc_flag) {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackComm<LMPDeviceType,1,1>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackComm<LMPDeviceType,1,0>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
} else {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackComm<LMPDeviceType,0,1>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackComm<LMPDeviceType,0,0>
f(atomKK->k_x,buf,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
}
LMPDeviceType::fence();
}
return n*size_forward;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType,int PBC_FLAG,int TRICLINIC>
struct AtomVecFullKokkos_PackCommSelf {
typedef DeviceType device_type;
typename ArrayTypes<DeviceType>::t_x_array_randomread _x;
typename ArrayTypes<DeviceType>::t_x_array _xw;
int _nfirst;
typename ArrayTypes<DeviceType>::t_int_2d_const _list;
const int _iswap;
X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz;
X_FLOAT _pbc[6];
AtomVecFullKokkos_PackCommSelf(
const typename DAT::tdual_x_array &x,
const int &nfirst,
const typename DAT::tdual_int_2d &list,
const int & iswap,
const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd,
const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz, const int* const pbc):
_x(x.view<DeviceType>()),_xw(x.view<DeviceType>()),_nfirst(nfirst),
_list(list.view<DeviceType>()),_iswap(iswap),
_xprd(xprd),_yprd(yprd),_zprd(zprd),
_xy(xy),_xz(xz),_yz(yz) {
_pbc[0] = pbc[0]; _pbc[1] = pbc[1]; _pbc[2] = pbc[2];
_pbc[3] = pbc[3]; _pbc[4] = pbc[4]; _pbc[5] = pbc[5];
};
KOKKOS_INLINE_FUNCTION
void operator() (const int& i) const {
const int j = _list(_iswap,i);
if (PBC_FLAG == 0) {
_xw(i+_nfirst,0) = _x(j,0);
_xw(i+_nfirst,1) = _x(j,1);
_xw(i+_nfirst,2) = _x(j,2);
} else {
if (TRICLINIC == 0) {
_xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd;
_xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd;
_xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd;
} else {
_xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz;
_xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz;
_xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd;
}
}
}
};
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list,
const int & iswap,
const int nfirst, const int &pbc_flag,
const int* const pbc) {
if(commKK->forward_comm_on_host) {
sync(Host,X_MASK);
modified(Host,X_MASK);
if(pbc_flag) {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackCommSelf<LMPHostType,1,1>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackCommSelf<LMPHostType,1,0>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
} else {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackCommSelf<LMPHostType,0,1>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackCommSelf<LMPHostType,0,0>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
}
LMPHostType::fence();
} else {
sync(Device,X_MASK);
modified(Device,X_MASK);
if(pbc_flag) {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackCommSelf<LMPDeviceType,1,1>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackCommSelf<LMPDeviceType,1,0>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
} else {
if(domain->triclinic) {
struct AtomVecFullKokkos_PackCommSelf<LMPDeviceType,0,1>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
} else {
struct AtomVecFullKokkos_PackCommSelf<LMPDeviceType,0,0>
f(atomKK->k_x,nfirst,list,iswap,domain->xprd,domain->yprd,domain->zprd,
domain->xy,domain->xz,domain->yz,pbc);
Kokkos::parallel_for(n,f);
}
}
LMPDeviceType::fence();
}
return n*3;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
struct AtomVecFullKokkos_UnpackComm {
typedef DeviceType device_type;
typename ArrayTypes<DeviceType>::t_x_array _x;
typename ArrayTypes<DeviceType>::t_xfloat_2d_const _buf;
int _first;
AtomVecFullKokkos_UnpackComm(
const typename DAT::tdual_x_array &x,
const typename DAT::tdual_xfloat_2d &buf,
const int& first):_x(x.view<DeviceType>()),_buf(buf.view<DeviceType>()),
_first(first) {};
KOKKOS_INLINE_FUNCTION
void operator() (const int& i) const {
_x(i+_first,0) = _buf(i,0);
_x(i+_first,1) = _buf(i,1);
_x(i+_first,2) = _buf(i,2);
}
};
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_comm_kokkos(const int &n, const int &first,
const DAT::tdual_xfloat_2d &buf ) {
if(commKK->forward_comm_on_host) {
sync(Host,X_MASK);
modified(Host,X_MASK);
struct AtomVecFullKokkos_UnpackComm<LMPHostType> f(atomKK->k_x,buf,first);
Kokkos::parallel_for(n,f);
LMPDeviceType::fence();
} else {
sync(Device,X_MASK);
modified(Device,X_MASK);
struct AtomVecFullKokkos_UnpackComm<LMPDeviceType> f(atomKK->k_x,buf,first);
Kokkos::parallel_for(n,f);
LMPDeviceType::fence();
}
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0);
buf[m++] = h_x(j,1);
buf[m++] = h_x(j,2);
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
}
}
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_comm_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0);
buf[m++] = h_x(j,1);
buf[m++] = h_x(j,2);
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0]*domain->xprd + pbc[5]*domain->xy + pbc[4]*domain->xz;
dy = pbc[1]*domain->yprd + pbc[3]*domain->yz;
dz = pbc[2]*domain->zprd;
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
if (mask[i] & deform_groupbit) {
buf[m++] = h_v(j,0) + dvx;
buf[m++] = h_v(j,1) + dvy;
buf[m++] = h_v(j,2) + dvz;
} else {
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
}
}
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_comm(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
h_x(i,0) = buf[m++];
h_x(i,1) = buf[m++];
h_x(i,2) = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_comm_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
h_x(i,0) = buf[m++];
h_x(i,1) = buf[m++];
h_x(i,2) = buf[m++];
h_v(i,0) = buf[m++];
h_v(i,1) = buf[m++];
h_v(i,2) = buf[m++];
}
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_reverse(int n, int first, double *buf)
{
if(n > 0)
sync(Host,F_MASK);
int m = 0;
const int last = first + n;
for (int i = first; i < last; i++) {
buf[m++] = h_f(i,0);
buf[m++] = h_f(i,1);
buf[m++] = h_f(i,2);
}
return m;
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_reverse(int n, int *list, double *buf)
{
if(n > 0)
modified(Host,F_MASK);
int m = 0;
for (int i = 0; i < n; i++) {
const int j = list[i];
h_f(j,0) += buf[m++];
h_f(j,1) += buf[m++];
h_f(j,2) += buf[m++];
}
}
/* ---------------------------------------------------------------------- */
template<class DeviceType,int PBC_FLAG>
struct AtomVecFullKokkos_PackBorder {
union ubuf {
double d;
int64_t i;
KOKKOS_INLINE_FUNCTION
ubuf(double arg) : d(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int64_t arg) : i(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int arg) : i(arg) {}
};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
typename AT::t_xfloat_2d _buf;
const typename AT::t_int_2d_const _list;
const int _iswap;
const typename AT::t_x_array_randomread _x;
const typename AT::t_tagint_1d _tag;
const typename AT::t_int_1d _type;
const typename AT::t_int_1d _mask;
const typename AT::t_float_1d _q;
const typename AT::t_tagint_1d _molecule;
X_FLOAT _dx,_dy,_dz;
AtomVecFullKokkos_PackBorder(
const typename AT::t_xfloat_2d &buf,
const typename AT::t_int_2d_const &list,
const int & iswap,
const typename AT::t_x_array &x,
const typename AT::t_tagint_1d &tag,
const typename AT::t_int_1d &type,
const typename AT::t_int_1d &mask,
const typename AT::t_float_1d &q,
const typename AT::t_tagint_1d &molecule,
const X_FLOAT &dx, const X_FLOAT &dy, const X_FLOAT &dz):
_buf(buf),_list(list),_iswap(iswap),
_x(x),_tag(tag),_type(type),_mask(mask),_q(q),_molecule(molecule),
_dx(dx),_dy(dy),_dz(dz) {}
KOKKOS_INLINE_FUNCTION
void operator() (const int& i) const {
const int j = _list(_iswap,i);
if (PBC_FLAG == 0) {
_buf(i,0) = _x(j,0);
_buf(i,1) = _x(j,1);
_buf(i,2) = _x(j,2);
_buf(i,3) = ubuf(_tag(j)).d;
_buf(i,4) = ubuf(_type(j)).d;
_buf(i,5) = ubuf(_mask(j)).d;
_buf(i,6) = _q(j);
_buf(i,7) = ubuf(_molecule(j)).d;
} else {
_buf(i,0) = _x(j,0) + _dx;
_buf(i,1) = _x(j,1) + _dy;
_buf(i,2) = _x(j,2) + _dz;
_buf(i,3) = ubuf(_tag(j)).d;
_buf(i,4) = ubuf(_type(j)).d;
_buf(i,5) = ubuf(_mask(j)).d;
_buf(i,6) = _q(j);
_buf(i,7) = ubuf(_molecule(j)).d;
}
}
};
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist,
DAT::tdual_xfloat_2d buf,int iswap,
int pbc_flag, int *pbc, ExecutionSpace space)
{
X_FLOAT dx,dy,dz;
if (pbc_flag != 0) {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
if(space==Host) {
AtomVecFullKokkos_PackBorder<LMPHostType,1> f(
buf.view<LMPHostType>(), k_sendlist.view<LMPHostType>(),
iswap,h_x,h_tag,h_type,h_mask,h_q,h_molecule,dx,dy,dz);
Kokkos::parallel_for(n,f);
LMPHostType::fence();
} else {
AtomVecFullKokkos_PackBorder<LMPDeviceType,1> f(
buf.view<LMPDeviceType>(), k_sendlist.view<LMPDeviceType>(),
iswap,d_x,d_tag,d_type,d_mask,d_q,d_molecule,dx,dy,dz);
Kokkos::parallel_for(n,f);
LMPDeviceType::fence();
}
} else {
dx = dy = dz = 0;
if(space==Host) {
AtomVecFullKokkos_PackBorder<LMPHostType,0> f(
buf.view<LMPHostType>(), k_sendlist.view<LMPHostType>(),
iswap,h_x,h_tag,h_type,h_mask,h_q,h_molecule,dx,dy,dz);
Kokkos::parallel_for(n,f);
LMPHostType::fence();
} else {
AtomVecFullKokkos_PackBorder<LMPDeviceType,0> f(
buf.view<LMPDeviceType>(), k_sendlist.view<LMPDeviceType>(),
iswap,d_x,d_tag,d_type,d_mask,d_q,d_molecule,dx,dy,dz);
Kokkos::parallel_for(n,f);
LMPDeviceType::fence();
}
}
return n*size_border;
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_border(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0);
buf[m++] = h_x(j,1);
buf[m++] = h_x(j,2);
buf[m++] = ubuf(h_tag(j)).d;
buf[m++] = ubuf(h_type(j)).d;
buf[m++] = ubuf(h_mask(j)).d;
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
buf[m++] = ubuf(h_tag(j)).d;
buf[m++] = ubuf(h_type(j)).d;
buf[m++] = ubuf(h_mask(j)).d;
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_border_vel(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx,dy,dz,dvx,dvy,dvz;
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0);
buf[m++] = h_x(j,1);
buf[m++] = h_x(j,2);
buf[m++] = ubuf(h_tag(j)).d;
buf[m++] = ubuf(h_type(j)).d;
buf[m++] = ubuf(h_mask(j)).d;
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
} else {
if (domain->triclinic == 0) {
dx = pbc[0]*domain->xprd;
dy = pbc[1]*domain->yprd;
dz = pbc[2]*domain->zprd;
} else {
dx = pbc[0];
dy = pbc[1];
dz = pbc[2];
}
if (!deform_vremap) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
buf[m++] = ubuf(h_tag(j)).d;
buf[m++] = ubuf(h_type(j)).d;
buf[m++] = ubuf(h_mask(j)).d;
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
} else {
dvx = pbc[0]*h_rate[0] + pbc[5]*h_rate[5] + pbc[4]*h_rate[4];
dvy = pbc[1]*h_rate[1] + pbc[3]*h_rate[3];
dvz = pbc[2]*h_rate[2];
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_x(j,0) + dx;
buf[m++] = h_x(j,1) + dy;
buf[m++] = h_x(j,2) + dz;
buf[m++] = ubuf(h_tag(j)).d;
buf[m++] = ubuf(h_type(j)).d;
buf[m++] = ubuf(h_mask(j)).d;
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
if (mask[i] & deform_groupbit) {
buf[m++] = h_v(j,0) + dvx;
buf[m++] = h_v(j,1) + dvy;
buf[m++] = h_v(j,2) + dvz;
} else {
buf[m++] = h_v(j,0);
buf[m++] = h_v(j,1);
buf[m++] = h_v(j,2);
}
}
}
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->pack_border(n,list,&buf[m]);
return m;
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_border_hybrid(int n, int *list, double *buf)
{
int i,j,m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = h_q(j);
buf[m++] = ubuf(h_molecule(j)).d;
}
return m;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
struct AtomVecFullKokkos_UnpackBorder {
union ubuf {
double d;
int64_t i;
KOKKOS_INLINE_FUNCTION
ubuf(double arg) : d(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int64_t arg) : i(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int arg) : i(arg) {}
};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
const typename AT::t_xfloat_2d_const _buf;
typename AT::t_x_array _x;
typename AT::t_tagint_1d _tag;
typename AT::t_int_1d _type;
typename AT::t_int_1d _mask;
typename AT::t_float_1d _q;
typename AT::t_tagint_1d _molecule;
int _first;
AtomVecFullKokkos_UnpackBorder(
const typename AT::t_xfloat_2d_const &buf,
typename AT::t_x_array &x,
typename AT::t_tagint_1d &tag,
typename AT::t_int_1d &type,
typename AT::t_int_1d &mask,
typename AT::t_float_1d &q,
typename AT::t_tagint_1d &molecule,
const int& first):
_buf(buf),_x(x),_tag(tag),_type(type),_mask(mask),_q(q),_molecule(molecule),
_first(first){
};
KOKKOS_INLINE_FUNCTION
void operator() (const int& i) const {
_x(i+_first,0) = _buf(i,0);
_x(i+_first,1) = _buf(i,1);
_x(i+_first,2) = _buf(i,2);
_tag(i+_first) = (tagint) ubuf(_buf(i,3)).i;
_type(i+_first) = (int) ubuf(_buf(i,4)).i;
_mask(i+_first) = (int) ubuf(_buf(i,5)).i;
_q(i+_first) = _buf(i,6);
_molecule(i+_first) = (tagint) ubuf(_buf(i,7)).i;
}
};
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_border_kokkos(const int &n, const int &first,
const DAT::tdual_xfloat_2d &buf,
ExecutionSpace space) {
modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|Q_MASK|MOLECULE_MASK);
while (first+n >= nmax) grow(0);
modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|Q_MASK|MOLECULE_MASK);
if(space==Host) {
struct AtomVecFullKokkos_UnpackBorder<LMPHostType>
f(buf.view<LMPHostType>(),h_x,h_tag,h_type,h_mask,h_q,h_molecule,first);
Kokkos::parallel_for(n,f);
LMPHostType::fence();
} else {
struct AtomVecFullKokkos_UnpackBorder<LMPDeviceType>
f(buf.view<LMPDeviceType>(),d_x,d_tag,d_type,d_mask,d_q,d_molecule,first);
Kokkos::parallel_for(n,f);
LMPDeviceType::fence();
}
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_border(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
modified(Host,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|Q_MASK|MOLECULE_MASK);
h_x(i,0) = buf[m++];
h_x(i,1) = buf[m++];
h_x(i,2) = buf[m++];
h_tag(i) = (tagint) ubuf(buf[m++]).i;
h_type(i) = (int) ubuf(buf[m++]).i;
h_mask(i) = (int) ubuf(buf[m++]).i;
h_q(i) = buf[m++];
h_molecule(i) = (tagint) ubuf(buf[m++]).i;
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::unpack_border_vel(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
if (i == nmax) grow(0);
modified(Host,X_MASK|V_MASK|TAG_MASK|TYPE_MASK|MASK_MASK|Q_MASK|MOLECULE_MASK);
h_x(i,0) = buf[m++];
h_x(i,1) = buf[m++];
h_x(i,2) = buf[m++];
h_tag(i) = (tagint) ubuf(buf[m++]).i;
h_type(i) = (int) ubuf(buf[m++]).i;
h_mask(i) = (int) ubuf(buf[m++]).i;
h_q(i) = buf[m++];
h_molecule(i) = (tagint) ubuf(buf[m++]).i;
h_v(i,0) = buf[m++];
h_v(i,1) = buf[m++];
h_v(i,2) = buf[m++];
}
if (atom->nextra_border)
for (int iextra = 0; iextra < atom->nextra_border; iextra++)
m += modify->fix[atom->extra_border[iextra]]->
unpack_border(n,first,&buf[m]);
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::unpack_border_hybrid(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++) {
h_q(i) = buf[m++];
h_molecule(i) = (tagint) ubuf(buf[m++]).i;
}
return m;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
struct AtomVecFullKokkos_PackExchangeFunctor {
union ubuf {
double d;
int64_t i;
KOKKOS_INLINE_FUNCTION
ubuf(double arg) : d(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int64_t arg) : i(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int arg) : i(arg) {}
};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
typename AT::t_x_array_randomread _x;
typename AT::t_v_array_randomread _v;
typename AT::t_tagint_1d_randomread _tag;
typename AT::t_int_1d_randomread _type;
typename AT::t_int_1d_randomread _mask;
typename AT::t_imageint_1d_randomread _image;
typename AT::t_float_1d_randomread _q;
typename AT::t_tagint_1d_randomread _molecule;
typename AT::t_int_2d_randomread _nspecial;
typename AT::t_tagint_2d_randomread _special;
typename AT::t_int_1d_randomread _num_bond;
typename AT::t_int_2d_randomread _bond_type;
typename AT::t_tagint_2d_randomread _bond_atom;
typename AT::t_int_1d_randomread _num_angle;
typename AT::t_int_2d_randomread _angle_type;
typename AT::t_tagint_2d_randomread _angle_atom1,_angle_atom2,_angle_atom3;
typename AT::t_int_1d_randomread _num_dihedral;
typename AT::t_int_2d_randomread _dihedral_type;
typename AT::t_tagint_2d_randomread _dihedral_atom1,_dihedral_atom2,
_dihedral_atom3,_dihedral_atom4;
typename AT::t_int_1d_randomread _num_improper;
typename AT::t_int_2d_randomread _improper_type;
typename AT::t_tagint_2d_randomread _improper_atom1,_improper_atom2,
_improper_atom3,_improper_atom4;
typename AT::t_x_array _xw;
typename AT::t_v_array _vw;
typename AT::t_tagint_1d _tagw;
typename AT::t_int_1d _typew;
typename AT::t_int_1d _maskw;
typename AT::t_imageint_1d _imagew;
typename AT::t_float_1d _qw;
typename AT::t_tagint_1d _moleculew;
typename AT::t_int_2d _nspecialw;
typename AT::t_tagint_2d _specialw;
typename AT::t_int_1d _num_bondw;
typename AT::t_int_2d _bond_typew;
typename AT::t_tagint_2d _bond_atomw;
typename AT::t_int_1d _num_anglew;
typename AT::t_int_2d _angle_typew;
typename AT::t_tagint_2d _angle_atom1w,_angle_atom2w,_angle_atom3w;
typename AT::t_int_1d _num_dihedralw;
typename AT::t_int_2d _dihedral_typew;
typename AT::t_tagint_2d _dihedral_atom1w,_dihedral_atom2w,
_dihedral_atom3w,_dihedral_atom4w;
typename AT::t_int_1d _num_improperw;
typename AT::t_int_2d _improper_typew;
typename AT::t_tagint_2d _improper_atom1w,_improper_atom2w,
_improper_atom3w,_improper_atom4w;
typename AT::t_xfloat_2d_um _buf;
typename AT::t_int_1d_const _sendlist;
typename AT::t_int_1d_const _copylist;
int _nlocal,_dim;
X_FLOAT _lo,_hi;
size_t elements;
AtomVecFullKokkos_PackExchangeFunctor(
const AtomKokkos* atom,
const typename AT::tdual_xfloat_2d buf,
typename AT::tdual_int_1d sendlist,
typename AT::tdual_int_1d copylist,int nlocal, int dim,
X_FLOAT lo, X_FLOAT hi):
_x(atom->k_x.view<DeviceType>()),
_v(atom->k_v.view<DeviceType>()),
_tag(atom->k_tag.view<DeviceType>()),
_type(atom->k_type.view<DeviceType>()),
_mask(atom->k_mask.view<DeviceType>()),
_image(atom->k_image.view<DeviceType>()),
_q(atom->k_q.view<DeviceType>()),
_molecule(atom->k_molecule.view<DeviceType>()),
_nspecial(atom->k_nspecial.view<DeviceType>()),
_special(atom->k_special.view<DeviceType>()),
_num_bond(atom->k_num_bond.view<DeviceType>()),
_bond_type(atom->k_bond_type.view<DeviceType>()),
_bond_atom(atom->k_bond_atom.view<DeviceType>()),
_num_angle(atom->k_num_angle.view<DeviceType>()),
_angle_type(atom->k_angle_type.view<DeviceType>()),
_angle_atom1(atom->k_angle_atom1.view<DeviceType>()),
_angle_atom2(atom->k_angle_atom2.view<DeviceType>()),
_angle_atom3(atom->k_angle_atom3.view<DeviceType>()),
_num_dihedral(atom->k_num_dihedral.view<DeviceType>()),
_dihedral_type(atom->k_dihedral_type.view<DeviceType>()),
_dihedral_atom1(atom->k_dihedral_atom1.view<DeviceType>()),
_dihedral_atom2(atom->k_dihedral_atom2.view<DeviceType>()),
_dihedral_atom3(atom->k_dihedral_atom3.view<DeviceType>()),
_dihedral_atom4(atom->k_dihedral_atom4.view<DeviceType>()),
_num_improper(atom->k_num_improper.view<DeviceType>()),
_improper_type(atom->k_improper_type.view<DeviceType>()),
_improper_atom1(atom->k_improper_atom1.view<DeviceType>()),
_improper_atom2(atom->k_improper_atom2.view<DeviceType>()),
_improper_atom3(atom->k_improper_atom3.view<DeviceType>()),
_improper_atom4(atom->k_improper_atom4.view<DeviceType>()),
_xw(atom->k_x.view<DeviceType>()),
_vw(atom->k_v.view<DeviceType>()),
_tagw(atom->k_tag.view<DeviceType>()),
_typew(atom->k_type.view<DeviceType>()),
_maskw(atom->k_mask.view<DeviceType>()),
_imagew(atom->k_image.view<DeviceType>()),
_qw(atom->k_q.view<DeviceType>()),
_moleculew(atom->k_molecule.view<DeviceType>()),
_nspecialw(atom->k_nspecial.view<DeviceType>()),
_specialw(atom->k_special.view<DeviceType>()),
_num_bondw(atom->k_num_bond.view<DeviceType>()),
_bond_typew(atom->k_bond_type.view<DeviceType>()),
_bond_atomw(atom->k_bond_atom.view<DeviceType>()),
_num_anglew(atom->k_num_angle.view<DeviceType>()),
_angle_typew(atom->k_angle_type.view<DeviceType>()),
_angle_atom1w(atom->k_angle_atom1.view<DeviceType>()),
_angle_atom2w(atom->k_angle_atom2.view<DeviceType>()),
_angle_atom3w(atom->k_angle_atom3.view<DeviceType>()),
_num_dihedralw(atom->k_num_dihedral.view<DeviceType>()),
_dihedral_typew(atom->k_dihedral_type.view<DeviceType>()),
_dihedral_atom1w(atom->k_dihedral_atom1.view<DeviceType>()),
_dihedral_atom2w(atom->k_dihedral_atom2.view<DeviceType>()),
_dihedral_atom3w(atom->k_dihedral_atom3.view<DeviceType>()),
_dihedral_atom4w(atom->k_dihedral_atom4.view<DeviceType>()),
_num_improperw(atom->k_num_improper.view<DeviceType>()),
_improper_typew(atom->k_improper_type.view<DeviceType>()),
_improper_atom1w(atom->k_improper_atom1.view<DeviceType>()),
_improper_atom2w(atom->k_improper_atom2.view<DeviceType>()),
_improper_atom3w(atom->k_improper_atom3.view<DeviceType>()),
_improper_atom4w(atom->k_improper_atom4.view<DeviceType>()),
_sendlist(sendlist.template view<DeviceType>()),
_copylist(copylist.template view<DeviceType>()),
_nlocal(nlocal),_dim(dim),
_lo(lo),_hi(hi){
// 3 comp of x, 3 comp of v, 1 tag, 1 type, 1 mask, 1 image, 1 molecule, 3 nspecial,
// maxspecial special, 1 num_bond, bond_per_atom bond_type, bond_per_atom bond_atom,
// 1 num_angle, angle_per_atom angle_type, angle_per_atom angle_atom1, angle_atom2,
// and angle_atom3
// 1 num_dihedral, dihedral_per_atom dihedral_type, 4*dihedral_per_atom
// 1 num_improper, 5*improper_per_atom
// 1 charge
// 1 to store buffer length
elements = 20+atom->maxspecial+2*atom->bond_per_atom+4*atom->angle_per_atom+
5*atom->dihedral_per_atom + 5*atom->improper_per_atom;
const int maxsendlist = (buf.template view<DeviceType>().dimension_0()*
buf.template view<DeviceType>().dimension_1())/elements;
buffer_view<DeviceType>(_buf,buf,maxsendlist,elements);
}
KOKKOS_INLINE_FUNCTION
void operator() (const int &mysend) const {
int k;
const int i = _sendlist(mysend);
_buf(mysend,0) = elements;
int m = 1;
_buf(mysend,m++) = _x(i,0);
_buf(mysend,m++) = _x(i,1);
_buf(mysend,m++) = _x(i,2);
_buf(mysend,m++) = _v(i,0);
_buf(mysend,m++) = _v(i,1);
_buf(mysend,m++) = _v(i,2);
_buf(mysend,m++) = ubuf(_tag(i)).d;
_buf(mysend,m++) = ubuf(_type(i)).d;
_buf(mysend,m++) = ubuf(_mask(i)).d;
_buf(mysend,m++) = ubuf(_image(i)).d;
_buf(mysend,m++) = _q(i);
_buf(mysend,m++) = ubuf(_molecule(i)).d;
_buf(mysend,m++) = ubuf(_num_bond(i)).d;
for (k = 0; k < _num_bond(i); k++) {
_buf(mysend,m++) = ubuf(_bond_type(i,k)).d;
_buf(mysend,m++) = ubuf(_bond_atom(i,k)).d;
}
_buf(mysend,m++) = ubuf(_num_angle(i)).d;
for (k = 0; k < _num_angle(i); k++) {
_buf(mysend,m++) = ubuf(_angle_type(i,k)).d;
_buf(mysend,m++) = ubuf(_angle_atom1(i,k)).d;
_buf(mysend,m++) = ubuf(_angle_atom2(i,k)).d;
_buf(mysend,m++) = ubuf(_angle_atom3(i,k)).d;
}
_buf(mysend,m++) = ubuf(_num_dihedral(i)).d;
for (k = 0; k < _num_dihedral(i); k++) {
_buf(mysend,m++) = ubuf(_dihedral_type(i,k)).d;
_buf(mysend,m++) = ubuf(_dihedral_atom1(i,k)).d;
_buf(mysend,m++) = ubuf(_dihedral_atom2(i,k)).d;
_buf(mysend,m++) = ubuf(_dihedral_atom3(i,k)).d;
_buf(mysend,m++) = ubuf(_dihedral_atom4(i,k)).d;
}
_buf(mysend,m++) = ubuf(_num_improper(i)).d;
for (k = 0; k < _num_improper(i); k++) {
_buf(mysend,m++) = ubuf(_improper_type(i,k)).d;
_buf(mysend,m++) = ubuf(_improper_atom1(i,k)).d;
_buf(mysend,m++) = ubuf(_improper_atom2(i,k)).d;
_buf(mysend,m++) = ubuf(_improper_atom3(i,k)).d;
_buf(mysend,m++) = ubuf(_improper_atom4(i,k)).d;
}
_buf(mysend,m++) = ubuf(_nspecial(i,0)).d;
_buf(mysend,m++) = ubuf(_nspecial(i,1)).d;
_buf(mysend,m++) = ubuf(_nspecial(i,2)).d;
for (k = 0; k < _nspecial(i,2); k++)
_buf(mysend,m++) = ubuf(_special(i,k)).d;
const int j = _copylist(mysend);
if(j>-1) {
_xw(i,0) = _x(j,0);
_xw(i,1) = _x(j,1);
_xw(i,2) = _x(j,2);
_vw(i,0) = _v(j,0);
_vw(i,1) = _v(j,1);
_vw(i,2) = _v(j,2);
_tagw(i) = _tag(j);
_typew(i) = _type(j);
_maskw(i) = _mask(j);
_imagew(i) = _image(j);
_qw(i) = _q(j);
_moleculew(i) = _molecule(j);
_num_bondw(i) = _num_bond(j);
for (k = 0; k < _num_bond(j); k++) {
_bond_typew(i,k) = _bond_type(j,k);
_bond_atomw(i,k) = _bond_atom(j,k);
}
_num_anglew(i) = _num_angle(j);
for (k = 0; k < _num_angle(j); k++) {
_angle_typew(i,k) = _angle_type(j,k);
_angle_atom1w(i,k) = _angle_atom1(j,k);
_angle_atom2w(i,k) = _angle_atom2(j,k);
_angle_atom3w(i,k) = _angle_atom3(j,k);
}
_num_dihedralw(i) = _num_dihedral(j);
for (k = 0; k < _num_dihedral(j); k++) {
_dihedral_typew(i,k) = _dihedral_type(j,k);
_dihedral_atom1w(i,k) = _dihedral_atom1(j,k);
_dihedral_atom2w(i,k) = _dihedral_atom2(j,k);
_dihedral_atom3w(i,k) = _dihedral_atom3(j,k);
_dihedral_atom4w(i,k) = _dihedral_atom4(j,k);
}
_num_improperw(i) = _num_improper(j);
for (k = 0; k < _num_improper(j); k++) {
_improper_typew(i,k) = _improper_type(j,k);
_improper_atom1w(i,k) = _improper_atom1(j,k);
_improper_atom2w(i,k) = _improper_atom2(j,k);
_improper_atom3w(i,k) = _improper_atom3(j,k);
_improper_atom4w(i,k) = _improper_atom4(j,k);
}
_nspecialw(i,0) = _nspecial(j,0);
_nspecialw(i,1) = _nspecial(j,1);
_nspecialw(i,2) = _nspecial(j,2);
for (k = 0; k < _nspecial(j,2); k++)
_specialw(i,k) = _special(j,k);
}
}
};
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &k_buf,
DAT::tdual_int_1d k_sendlist,
DAT::tdual_int_1d k_copylist,
ExecutionSpace space,int dim,X_FLOAT lo,
X_FLOAT hi )
{
const int elements = 20+atom->maxspecial+2*atom->bond_per_atom+4*atom->angle_per_atom+
5*atom->dihedral_per_atom + 5*atom->improper_per_atom;
if(nsend > (int) (k_buf.view<LMPHostType>().dimension_0()*
k_buf.view<LMPHostType>().dimension_1())/elements) {
int newsize = nsend*elements/k_buf.view<LMPHostType>().dimension_1()+1;
k_buf.resize(newsize,k_buf.view<LMPHostType>().dimension_1());
}
if(space == Host) {
AtomVecFullKokkos_PackExchangeFunctor<LMPHostType>
f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi);
Kokkos::parallel_for(nsend,f);
LMPHostType::fence();
return nsend*elements;
} else {
AtomVecFullKokkos_PackExchangeFunctor<LMPDeviceType>
f(atomKK,k_buf,k_sendlist,k_copylist,atom->nlocal,dim,lo,hi);
Kokkos::parallel_for(nsend,f);
LMPDeviceType::fence();
return nsend*elements;
}
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_exchange(int i, double *buf)
{
int k;
int m = 1;
buf[m++] = h_x(i,0);
buf[m++] = h_x(i,1);
buf[m++] = h_x(i,2);
buf[m++] = h_v(i,0);
buf[m++] = h_v(i,1);
buf[m++] = h_v(i,2);
buf[m++] = ubuf(h_tag(i)).d;
buf[m++] = ubuf(h_type(i)).d;
buf[m++] = ubuf(h_mask(i)).d;
buf[m++] = ubuf(h_image(i)).d;
buf[m++] = h_q(i);
buf[m++] = ubuf(h_molecule(i)).d;
buf[m++] = ubuf(h_num_bond(i)).d;
for (k = 0; k < h_num_bond(i); k++) {
buf[m++] = ubuf(h_bond_type(i,k)).d;
buf[m++] = ubuf(h_bond_atom(i,k)).d;
}
buf[m++] = ubuf(h_num_angle(i)).d;
for (k = 0; k < h_num_angle(i); k++) {
buf[m++] = ubuf(h_angle_type(i,k)).d;
buf[m++] = ubuf(h_angle_atom1(i,k)).d;
buf[m++] = ubuf(h_angle_atom2(i,k)).d;
buf[m++] = ubuf(h_angle_atom3(i,k)).d;
}
buf[m++] = ubuf(h_num_dihedral(i)).d;
for (k = 0; k < h_num_dihedral(i); k++) {
buf[m++] = ubuf(h_dihedral_type(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom1(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom2(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom3(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom4(i,k)).d;
}
buf[m++] = ubuf(h_num_improper(i)).d;
for (k = 0; k < h_num_improper(i); k++) {
buf[m++] = ubuf(h_improper_type(i,k)).d;
buf[m++] = ubuf(h_improper_atom1(i,k)).d;
buf[m++] = ubuf(h_improper_atom2(i,k)).d;
buf[m++] = ubuf(h_improper_atom3(i,k)).d;
buf[m++] = ubuf(h_improper_atom4(i,k)).d;
}
buf[m++] = ubuf(h_nspecial(i,0)).d;
buf[m++] = ubuf(h_nspecial(i,1)).d;
buf[m++] = ubuf(h_nspecial(i,2)).d;
for (k = 0; k < h_nspecial(i,2); k++)
buf[m++] = ubuf(h_special(i,k)).d;
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->pack_exchange(i,&buf[m]);
buf[0] = m;
return m;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
struct AtomVecFullKokkos_UnpackExchangeFunctor {
union ubuf {
double d;
int64_t i;
KOKKOS_INLINE_FUNCTION
ubuf(double arg) : d(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int64_t arg) : i(arg) {}
KOKKOS_INLINE_FUNCTION
ubuf(int arg) : i(arg) {}
};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
typename AT::t_x_array _x;
typename AT::t_v_array _v;
typename AT::t_tagint_1d _tag;
typename AT::t_int_1d _type;
typename AT::t_int_1d _mask;
typename AT::t_imageint_1d _image;
typename AT::t_float_1d _q;
typename AT::t_tagint_1d _molecule;
typename AT::t_int_2d _nspecial;
typename AT::t_tagint_2d _special;
typename AT::t_int_1d _num_bond;
typename AT::t_int_2d _bond_type;
typename AT::t_tagint_2d _bond_atom;
typename AT::t_int_1d _num_angle;
typename AT::t_int_2d _angle_type;
typename AT::t_tagint_2d _angle_atom1,_angle_atom2,_angle_atom3;
typename AT::t_int_1d _num_dihedral;
typename AT::t_int_2d _dihedral_type;
typename AT::t_tagint_2d _dihedral_atom1,_dihedral_atom2,
_dihedral_atom3,_dihedral_atom4;
typename AT::t_int_1d _num_improper;
typename AT::t_int_2d _improper_type;
typename AT::t_tagint_2d _improper_atom1,_improper_atom2,
_improper_atom3,_improper_atom4;
typename AT::t_xfloat_2d_um _buf;
typename AT::t_int_1d _nlocal;
int _dim;
X_FLOAT _lo,_hi;
size_t elements;
AtomVecFullKokkos_UnpackExchangeFunctor(
const AtomKokkos* atom,
const typename AT::tdual_xfloat_2d buf,
typename AT::tdual_int_1d nlocal,
int dim, X_FLOAT lo, X_FLOAT hi):
_x(atom->k_x.view<DeviceType>()),
_v(atom->k_v.view<DeviceType>()),
_tag(atom->k_tag.view<DeviceType>()),
_type(atom->k_type.view<DeviceType>()),
_mask(atom->k_mask.view<DeviceType>()),
_image(atom->k_image.view<DeviceType>()),
_q(atom->k_q.view<DeviceType>()),
_molecule(atom->k_molecule.view<DeviceType>()),
_nspecial(atom->k_nspecial.view<DeviceType>()),
_special(atom->k_special.view<DeviceType>()),
_num_bond(atom->k_num_bond.view<DeviceType>()),
_bond_type(atom->k_bond_type.view<DeviceType>()),
_bond_atom(atom->k_bond_atom.view<DeviceType>()),
_num_angle(atom->k_num_angle.view<DeviceType>()),
_angle_type(atom->k_angle_type.view<DeviceType>()),
_angle_atom1(atom->k_angle_atom1.view<DeviceType>()),
_angle_atom2(atom->k_angle_atom2.view<DeviceType>()),
_angle_atom3(atom->k_angle_atom3.view<DeviceType>()),
_num_dihedral(atom->k_num_dihedral.view<DeviceType>()),
_dihedral_type(atom->k_dihedral_type.view<DeviceType>()),
_dihedral_atom1(atom->k_dihedral_atom1.view<DeviceType>()),
_dihedral_atom2(atom->k_dihedral_atom2.view<DeviceType>()),
_dihedral_atom3(atom->k_dihedral_atom3.view<DeviceType>()),
_dihedral_atom4(atom->k_dihedral_atom4.view<DeviceType>()),
_num_improper(atom->k_num_improper.view<DeviceType>()),
_improper_type(atom->k_improper_type.view<DeviceType>()),
_improper_atom1(atom->k_improper_atom1.view<DeviceType>()),
_improper_atom2(atom->k_improper_atom2.view<DeviceType>()),
_improper_atom3(atom->k_improper_atom3.view<DeviceType>()),
_improper_atom4(atom->k_improper_atom4.view<DeviceType>()),
_nlocal(nlocal.template view<DeviceType>()),_dim(dim),
_lo(lo),_hi(hi){
elements = 20+atom->maxspecial+2*atom->bond_per_atom+4*atom->angle_per_atom+
5*atom->dihedral_per_atom + 5*atom->improper_per_atom;
const int maxsendlist = (buf.template view<DeviceType>().dimension_0()*
buf.template view<DeviceType>().dimension_1())/elements;
buffer_view<DeviceType>(_buf,buf,maxsendlist,elements);
}
KOKKOS_INLINE_FUNCTION
void operator() (const int &myrecv) const {
X_FLOAT x = _buf(myrecv,_dim+1);
if (x >= _lo && x < _hi) {
int i = Kokkos::atomic_fetch_add(&_nlocal(0),1);
int m = 1;
_x(i,0) = _buf(myrecv,m++);
_x(i,1) = _buf(myrecv,m++);
_x(i,2) = _buf(myrecv,m++);
_v(i,0) = _buf(myrecv,m++);
_v(i,1) = _buf(myrecv,m++);
_v(i,2) = _buf(myrecv,m++);
_tag(i) = (tagint) ubuf(_buf(myrecv,m++)).i;
_type(i) = (int) ubuf(_buf(myrecv,m++)).i;
_mask(i) = (int) ubuf(_buf(myrecv,m++)).i;
_image(i) = (imageint) ubuf(_buf(myrecv,m++)).i;
_q(i) = _buf(myrecv,m++);
_molecule(i) = (tagint) ubuf(_buf(myrecv,m++)).i;
_num_bond(i) = (int) ubuf(_buf(myrecv,m++)).i;
int k;
for (k = 0; k < _num_bond(i); k++) {
_bond_type(i,k) = (int) ubuf(_buf(myrecv,m++)).i;
_bond_atom(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
}
_num_angle(i) = (int) ubuf(_buf(myrecv,m++)).i;
for (k = 0; k < _num_angle(i); k++) {
_angle_type(i,k) = (int) ubuf(_buf(myrecv,m++)).i;
_angle_atom1(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_angle_atom2(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_angle_atom3(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
}
_num_dihedral(i) = (int) ubuf(_buf(myrecv,m++)).i;
for (k = 0; k < _num_dihedral(i); k++) {
_dihedral_type(i,k) = (int) ubuf(_buf(myrecv,m++)).i;
_dihedral_atom1(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_dihedral_atom2(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_dihedral_atom3(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_dihedral_atom4(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
}
_num_improper(i) = (int) ubuf(_buf(myrecv,m++)).i;
for (k = 0; k < _num_improper(i); k++) {
_improper_type(i,k) = (int) ubuf(_buf(myrecv,m++)).i;
_improper_atom1(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_improper_atom2(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_improper_atom3(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
_improper_atom4(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
}
_nspecial(i,0) = (int) ubuf(_buf(myrecv,m++)).i;
_nspecial(i,1) = (int) ubuf(_buf(myrecv,m++)).i;
_nspecial(i,2) = (int) ubuf(_buf(myrecv,m++)).i;
for (k = 0; k < _nspecial(i,2); k++)
_special(i,k) = (tagint) ubuf(_buf(myrecv,m++)).i;
}
}
};
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf,int nrecv,
int nlocal,int dim,X_FLOAT lo,X_FLOAT hi,
ExecutionSpace space) {
const size_t elements = 20+atom->maxspecial+2*atom->bond_per_atom+4*atom->angle_per_atom+
5*atom->dihedral_per_atom + 5*atom->improper_per_atom;
if(space == Host) {
k_count.h_view(0) = nlocal;
AtomVecFullKokkos_UnpackExchangeFunctor<LMPHostType>
f(atomKK,k_buf,k_count,dim,lo,hi);
Kokkos::parallel_for(nrecv/elements,f);
LMPHostType::fence();
return k_count.h_view(0);
} else {
k_count.h_view(0) = nlocal;
k_count.modify<LMPHostType>();
k_count.sync<LMPDeviceType>();
AtomVecFullKokkos_UnpackExchangeFunctor<LMPDeviceType>
f(atomKK,k_buf,k_count,dim,lo,hi);
Kokkos::parallel_for(nrecv/elements,f);
LMPDeviceType::fence();
k_count.modify<LMPDeviceType>();
k_count.sync<LMPHostType>();
return k_count.h_view(0);
}
}
/* ---------------------------------------------------------------------- */
int AtomVecFullKokkos::unpack_exchange(double *buf)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
modified(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK |
MASK_MASK | IMAGE_MASK | Q_MASK | MOLECULE_MASK | BOND_MASK |
ANGLE_MASK | DIHEDRAL_MASK | IMPROPER_MASK | SPECIAL_MASK);
int k;
int m = 1;
h_x(nlocal,0) = buf[m++];
h_x(nlocal,1) = buf[m++];
h_x(nlocal,2) = buf[m++];
h_v(nlocal,0) = buf[m++];
h_v(nlocal,1) = buf[m++];
h_v(nlocal,2) = buf[m++];
h_tag(nlocal) = (tagint) ubuf(buf[m++]).i;
h_type(nlocal) = (int) ubuf(buf[m++]).i;
h_mask(nlocal) = (int) ubuf(buf[m++]).i;
h_image(nlocal) = (imageint) ubuf(buf[m++]).i;
h_q(nlocal) = buf[m++];
h_molecule(nlocal) = (tagint) ubuf(buf[m++]).i;
h_num_bond(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_bond(nlocal); k++) {
h_bond_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_bond_atom(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_angle(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_angle(nlocal); k++) {
h_angle_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_angle_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_angle_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_angle_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_dihedral(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_dihedral(nlocal); k++) {
h_dihedral_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_dihedral_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom4(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_improper(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_improper(nlocal); k++) {
h_improper_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_improper_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom4(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_nspecial(nlocal,0) = (int) ubuf(buf[m++]).i;
h_nspecial(nlocal,1) = (int) ubuf(buf[m++]).i;
h_nspecial(nlocal,2) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_nspecial(nlocal,2); k++)
h_special(nlocal,k) = (tagint) ubuf(buf[m++]).i;
if (atom->nextra_grow)
for (int iextra = 0; iextra < atom->nextra_grow; iextra++)
m += modify->fix[atom->extra_grow[iextra]]->
unpack_exchange(nlocal,&buf[m]);
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
size of restart data for all atoms owned by this proc
include extra data stored by fixes
------------------------------------------------------------------------- */
int AtomVecFullKokkos::size_restart()
{
int i;
int nlocal = atom->nlocal;
int n = 0;
for (i = 0; i < nlocal; i++)
n += 17 + 2*num_bond[i] + 4*num_angle[i] +
5*num_dihedral[i] + 5*num_improper[i];
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
for (i = 0; i < nlocal; i++)
n += modify->fix[atom->extra_restart[iextra]]->size_restart(i);
return n;
}
/* ----------------------------------------------------------------------
pack atom I's data for restart file including extra quantities
xyz must be 1st 3 values, so that read_restart can test on them
molecular types may be negative, but write as positive
------------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_restart(int i, double *buf)
{
sync(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK |
MASK_MASK | IMAGE_MASK | Q_MASK | MOLECULE_MASK | BOND_MASK |
ANGLE_MASK | DIHEDRAL_MASK | IMPROPER_MASK | SPECIAL_MASK);
int m = 1;
buf[m++] = h_x(i,0);
buf[m++] = h_x(i,1);
buf[m++] = h_x(i,2);
buf[m++] = ubuf(h_tag(i)).d;
buf[m++] = ubuf(h_type(i)).d;
buf[m++] = ubuf(h_mask(i)).d;
buf[m++] = ubuf(h_image(i)).d;
buf[m++] = h_v(i,0);
buf[m++] = h_v(i,1);
buf[m++] = h_v(i,2);
buf[m++] = h_q(i);
buf[m++] = ubuf(h_molecule(i)).d;
buf[m++] = ubuf(h_num_bond(i)).d;
for (int k = 0; k < h_num_bond(i); k++) {
buf[m++] = ubuf(MAX(h_bond_type(i,k),-h_bond_type(i,k))).d;
buf[m++] = ubuf(h_bond_atom(i,k)).d;
}
buf[m++] = ubuf(h_num_angle(i)).d;
for (int k = 0; k < h_num_angle(i); k++) {
buf[m++] = ubuf(MAX(h_angle_type(i,k),-h_angle_type(i,k))).d;
buf[m++] = ubuf(h_angle_atom1(i,k)).d;
buf[m++] = ubuf(h_angle_atom2(i,k)).d;
buf[m++] = ubuf(h_angle_atom3(i,k)).d;
}
buf[m++] = ubuf(h_num_dihedral(i)).d;
for (int k = 0; k < h_num_dihedral(i); k++) {
buf[m++] = ubuf(MAX(h_dihedral_type(i,k),-h_dihedral_type(i,k))).d;
buf[m++] = ubuf(h_dihedral_atom1(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom2(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom3(i,k)).d;
buf[m++] = ubuf(h_dihedral_atom4(i,k)).d;
}
buf[m++] = ubuf(h_num_improper(i)).d;
for (int k = 0; k < h_num_improper(i); k++) {
buf[m++] = ubuf(MAX(h_improper_type(i,k),-h_improper_type(i,k))).d;
buf[m++] = ubuf(h_improper_atom1(i,k)).d;
buf[m++] = ubuf(h_improper_atom2(i,k)).d;
buf[m++] = ubuf(h_improper_atom3(i,k)).d;
buf[m++] = ubuf(h_improper_atom4(i,k)).d;
}
if (atom->nextra_restart)
for (int iextra = 0; iextra < atom->nextra_restart; iextra++)
m += modify->fix[atom->extra_restart[iextra]]->pack_restart(i,&buf[m]);
buf[0] = m;
return m;
}
/* ----------------------------------------------------------------------
unpack data for one atom from restart file including extra quantities
------------------------------------------------------------------------- */
int AtomVecFullKokkos::unpack_restart(double *buf)
{
int k;
int nlocal = atom->nlocal;
if (nlocal == nmax) {
grow(0);
if (atom->nextra_store)
memory->grow(atom->extra,nmax,atom->nextra_store,"atom:extra");
}
sync(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK |
MASK_MASK | IMAGE_MASK | Q_MASK | MOLECULE_MASK | BOND_MASK |
ANGLE_MASK | DIHEDRAL_MASK | IMPROPER_MASK | SPECIAL_MASK);
modified(Host,X_MASK | V_MASK | TAG_MASK | TYPE_MASK |
MASK_MASK | IMAGE_MASK | Q_MASK | MOLECULE_MASK | BOND_MASK |
ANGLE_MASK | DIHEDRAL_MASK | IMPROPER_MASK | SPECIAL_MASK);
int m = 1;
h_x(nlocal,0) = buf[m++];
h_x(nlocal,1) = buf[m++];
h_x(nlocal,2) = buf[m++];
h_tag(nlocal) = (tagint) ubuf(buf[m++]).i;
h_type(nlocal) = (int) ubuf(buf[m++]).i;
h_mask(nlocal) = (int) ubuf(buf[m++]).i;
h_image(nlocal) = (imageint) ubuf(buf[m++]).i;
h_v(nlocal,0) = buf[m++];
h_v(nlocal,1) = buf[m++];
h_v(nlocal,2) = buf[m++];
h_q(nlocal) = buf[m++];
h_molecule(nlocal) = (tagint) ubuf(buf[m++]).i;
h_num_bond(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_bond(nlocal); k++) {
h_bond_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_bond_atom(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_angle(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_angle(nlocal); k++) {
h_angle_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_angle_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_angle_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_angle_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_dihedral(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_dihedral(nlocal); k++) {
h_dihedral_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_dihedral_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_dihedral_atom4(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_num_improper(nlocal) = (int) ubuf(buf[m++]).i;
for (k = 0; k < h_num_improper(nlocal); k++) {
h_improper_type(nlocal,k) = (int) ubuf(buf[m++]).i;
h_improper_atom1(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom2(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom3(nlocal,k) = (tagint) ubuf(buf[m++]).i;
h_improper_atom4(nlocal,k) = (tagint) ubuf(buf[m++]).i;
}
h_nspecial(nlocal,0) = h_nspecial(nlocal,1) = h_nspecial(nlocal,2) = 0;
double **extra = atom->extra;
if (atom->nextra_store) {
int size = static_cast<int> (buf[0]) - m;
for (int i = 0; i < size; i++) extra[nlocal][i] = buf[m++];
}
atom->nlocal++;
return m;
}
/* ----------------------------------------------------------------------
create one atom of itype at coord
set other values to defaults
------------------------------------------------------------------------- */
void AtomVecFullKokkos::create_atom(int itype, double *coord)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) {
atomKK->modified(Host,ALL_MASK);
grow(0);
}
atomKK->sync(Host,ALL_MASK);
atomKK->modified(Host,ALL_MASK);
tag[nlocal] = 0;
type[nlocal] = itype;
h_x(nlocal,0) = coord[0];
h_x(nlocal,1) = coord[1];
h_x(nlocal,2) = coord[2];
h_mask(nlocal) = 1;
h_image(nlocal) = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
h_v(nlocal,0) = 0.0;
h_v(nlocal,1) = 0.0;
h_v(nlocal,2) = 0.0;
h_q(nlocal) = 0.0;
h_molecule(nlocal) = 0;
h_num_bond(nlocal) = 0;
h_num_angle(nlocal) = 0;
h_num_dihedral(nlocal) = 0;
h_num_improper(nlocal) = 0;
h_nspecial(nlocal,0) = h_nspecial(nlocal,1) = h_nspecial(nlocal,2) = 0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack one line from Atoms section of data file
initialize other atom quantities
------------------------------------------------------------------------- */
void AtomVecFullKokkos::data_atom(double *coord, imageint imagetmp,
char **values)
{
int nlocal = atom->nlocal;
if (nlocal == nmax) grow(0);
atomKK->modified(Host,ALL_MASK);
h_tag(nlocal) = atoi(values[0]);
h_molecule(nlocal) = atoi(values[1]);
h_type(nlocal) = atoi(values[2]);
if (h_type(nlocal) <= 0 || h_type(nlocal) > atom->ntypes)
error->one(FLERR,"Invalid atom type in Atoms section of data file");
h_q(nlocal) = atof(values[3]);
h_x(nlocal,0) = coord[0];
h_x(nlocal,1) = coord[1];
h_x(nlocal,2) = coord[2];
h_image(nlocal) = imagetmp;
h_mask(nlocal) = 1;
h_v(nlocal,0) = 0.0;
h_v(nlocal,1) = 0.0;
h_v(nlocal,2) = 0.0;
h_num_bond(nlocal) = 0;
h_num_angle(nlocal) = 0;
h_num_dihedral(nlocal) = 0;
h_num_improper(nlocal) = 0;
atom->nlocal++;
}
/* ----------------------------------------------------------------------
unpack hybrid quantities from one line in Atoms section of data file
initialize other atom quantities for this sub-style
------------------------------------------------------------------------- */
int AtomVecFullKokkos::data_atom_hybrid(int nlocal, char **values)
{
h_molecule(nlocal) = atoi(values[0]);
h_q(nlocal) = atof(values[1]);
h_num_bond(nlocal) = 0;
h_num_angle(nlocal) = 0;
h_num_dihedral(nlocal) = 0;
h_num_improper(nlocal) = 0;
return 2;
}
/* ----------------------------------------------------------------------
pack atom info for data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecFullKokkos::pack_data(double **buf)
{
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
buf[i][0] = h_tag(i);
buf[i][1] = h_molecule(i);
buf[i][2] = h_type(i);
buf[i][3] = h_q(i);
buf[i][4] = h_x(i,0);
buf[i][5] = h_x(i,1);
buf[i][6] = h_x(i,2);
buf[i][7] = (h_image[i] & IMGMASK) - IMGMAX;
buf[i][8] = (h_image[i] >> IMGBITS & IMGMASK) - IMGMAX;
buf[i][9] = (h_image[i] >> IMG2BITS) - IMGMAX;
}
}
/* ----------------------------------------------------------------------
pack hybrid atom info for data file
------------------------------------------------------------------------- */
int AtomVecFullKokkos::pack_data_hybrid(int i, double *buf)
{
buf[0] = h_molecule(i);
buf[1] = h_q(i);
return 2;
}
/* ----------------------------------------------------------------------
write atom info to data file including 3 image flags
------------------------------------------------------------------------- */
void AtomVecFullKokkos::write_data(FILE *fp, int n, double **buf)
{
for (int i = 0; i < n; i++)
fprintf(fp,"%d %d %d %-1.16e %-1.16e %-1.16e %-1.16e %d %d %d\n",
(int) buf[i][0],(int) buf[i][1], (int) buf[i][2], buf[i][3],
buf[i][4],buf[i][5],buf[i][6],
(int) buf[i][7],(int) buf[i][8],(int) buf[i][9]);
}
/* ----------------------------------------------------------------------
write hybrid atom info to data file
------------------------------------------------------------------------- */
int AtomVecFullKokkos::write_data_hybrid(FILE *fp, double *buf)
{
fprintf(fp," " TAGINT_FORMAT " %-1.16e",(tagint) ubuf(buf[0]).i,buf[1]);
return 2;
}
/* ----------------------------------------------------------------------
return # of bytes of allocated memory
------------------------------------------------------------------------- */
bigint AtomVecFullKokkos::memory_usage()
{
bigint bytes = 0;
if (atom->memcheck("tag")) bytes += memory->usage(tag,nmax);
if (atom->memcheck("type")) bytes += memory->usage(type,nmax);
if (atom->memcheck("mask")) bytes += memory->usage(mask,nmax);
if (atom->memcheck("image")) bytes += memory->usage(image,nmax);
if (atom->memcheck("x")) bytes += memory->usage(x,nmax,3);
if (atom->memcheck("v")) bytes += memory->usage(v,nmax,3);
if (atom->memcheck("f")) bytes += memory->usage(f,nmax*commKK->nthreads,3);
if (atom->memcheck("q")) bytes += memory->usage(q,nmax);
if (atom->memcheck("molecule")) bytes += memory->usage(molecule,nmax);
if (atom->memcheck("nspecial")) bytes += memory->usage(nspecial,nmax,3);
if (atom->memcheck("special"))
bytes += memory->usage(special,nmax,atom->maxspecial);
if (atom->memcheck("num_bond")) bytes += memory->usage(num_bond,nmax);
if (atom->memcheck("bond_type"))
bytes += memory->usage(bond_type,nmax,atom->bond_per_atom);
if (atom->memcheck("bond_atom"))
bytes += memory->usage(bond_atom,nmax,atom->bond_per_atom);
if (atom->memcheck("num_angle")) bytes += memory->usage(num_angle,nmax);
if (atom->memcheck("angle_type"))
bytes += memory->usage(angle_type,nmax,atom->angle_per_atom);
if (atom->memcheck("angle_atom1"))
bytes += memory->usage(angle_atom1,nmax,atom->angle_per_atom);
if (atom->memcheck("angle_atom2"))
bytes += memory->usage(angle_atom2,nmax,atom->angle_per_atom);
if (atom->memcheck("angle_atom3"))
bytes += memory->usage(angle_atom3,nmax,atom->angle_per_atom);
if (atom->memcheck("num_dihedral")) bytes += memory->usage(num_dihedral,nmax);
if (atom->memcheck("dihedral_type"))
bytes += memory->usage(dihedral_type,nmax,atom->dihedral_per_atom);
if (atom->memcheck("dihedral_atom1"))
bytes += memory->usage(dihedral_atom1,nmax,atom->dihedral_per_atom);
if (atom->memcheck("dihedral_atom2"))
bytes += memory->usage(dihedral_atom2,nmax,atom->dihedral_per_atom);
if (atom->memcheck("dihedral_atom3"))
bytes += memory->usage(dihedral_atom3,nmax,atom->dihedral_per_atom);
if (atom->memcheck("dihedral_atom4"))
bytes += memory->usage(dihedral_atom4,nmax,atom->dihedral_per_atom);
if (atom->memcheck("num_improper")) bytes += memory->usage(num_improper,nmax);
if (atom->memcheck("improper_type"))
bytes += memory->usage(improper_type,nmax,atom->improper_per_atom);
if (atom->memcheck("improper_atom1"))
bytes += memory->usage(improper_atom1,nmax,atom->improper_per_atom);
if (atom->memcheck("improper_atom2"))
bytes += memory->usage(improper_atom2,nmax,atom->improper_per_atom);
if (atom->memcheck("improper_atom3"))
bytes += memory->usage(improper_atom3,nmax,atom->improper_per_atom);
if (atom->memcheck("improper_atom4"))
bytes += memory->usage(improper_atom4,nmax,atom->improper_per_atom);
return bytes;
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::sync(ExecutionSpace space, unsigned int mask)
{
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPDeviceType>();
atomKK->k_special.sync<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPDeviceType>();
atomKK->k_bond_type.sync<LMPDeviceType>();
atomKK->k_bond_atom.sync<LMPDeviceType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPDeviceType>();
atomKK->k_angle_type.sync<LMPDeviceType>();
atomKK->k_angle_atom1.sync<LMPDeviceType>();
atomKK->k_angle_atom2.sync<LMPDeviceType>();
atomKK->k_angle_atom3.sync<LMPDeviceType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPDeviceType>();
atomKK->k_dihedral_type.sync<LMPDeviceType>();
atomKK->k_dihedral_atom1.sync<LMPDeviceType>();
atomKK->k_dihedral_atom2.sync<LMPDeviceType>();
atomKK->k_dihedral_atom3.sync<LMPDeviceType>();
atomKK->k_dihedral_atom4.sync<LMPDeviceType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPDeviceType>();
atomKK->k_improper_type.sync<LMPDeviceType>();
atomKK->k_improper_atom1.sync<LMPDeviceType>();
atomKK->k_improper_atom2.sync<LMPDeviceType>();
atomKK->k_improper_atom3.sync<LMPDeviceType>();
atomKK->k_improper_atom4.sync<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPHostType>();
atomKK->k_special.sync<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPHostType>();
atomKK->k_bond_type.sync<LMPHostType>();
atomKK->k_bond_atom.sync<LMPHostType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPHostType>();
atomKK->k_angle_type.sync<LMPHostType>();
atomKK->k_angle_atom1.sync<LMPHostType>();
atomKK->k_angle_atom2.sync<LMPHostType>();
atomKK->k_angle_atom3.sync<LMPHostType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPHostType>();
atomKK->k_dihedral_type.sync<LMPHostType>();
atomKK->k_dihedral_atom1.sync<LMPHostType>();
atomKK->k_dihedral_atom2.sync<LMPHostType>();
atomKK->k_dihedral_atom3.sync<LMPHostType>();
atomKK->k_dihedral_atom4.sync<LMPHostType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPHostType>();
atomKK->k_improper_type.sync<LMPHostType>();
atomKK->k_improper_atom1.sync<LMPHostType>();
atomKK->k_improper_atom2.sync<LMPHostType>();
atomKK->k_improper_atom3.sync<LMPHostType>();
atomKK->k_improper_atom4.sync<LMPHostType>();
}
}
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::sync_overlapping_device(ExecutionSpace space, unsigned int mask)
{
if (space == Device) {
if ((mask & X_MASK) && atomKK->k_x.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_x_array>(atomKK->k_x,space);
if ((mask & V_MASK) && atomKK->k_v.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_v_array>(atomKK->k_v,space);
if ((mask & F_MASK) && atomKK->k_f.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_f_array>(atomKK->k_f,space);
if ((mask & TAG_MASK) && atomKK->k_tag.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_1d>(atomKK->k_tag,space);
if ((mask & TYPE_MASK) && atomKK->k_type.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_type,space);
if ((mask & MASK_MASK) && atomKK->k_mask.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_mask,space);
if ((mask & IMAGE_MASK) && atomKK->k_image.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_imageint_1d>(atomKK->k_image,space);
if ((mask & Q_MASK) && atomKK->k_q.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_float_1d>(atomKK->k_q,space);
if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_1d>(atomKK->k_molecule,space);
if (mask & SPECIAL_MASK) {
if (atomKK->k_nspecial.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_nspecial,space);
if (atomKK->k_special.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_special,space);
}
if (mask & BOND_MASK) {
if (atomKK->k_num_bond.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_bond,space);
if (atomKK->k_bond_type.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_bond_type,space);
if (atomKK->k_bond_atom.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_bond_atom,space);
}
if (mask & ANGLE_MASK) {
if (atomKK->k_num_angle.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_angle,space);
if (atomKK->k_angle_type.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_angle_type,space);
if (atomKK->k_angle_atom1.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom1,space);
if (atomKK->k_angle_atom2.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom2,space);
if (atomKK->k_angle_atom3.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom3,space);
}
if (mask & DIHEDRAL_MASK) {
if (atomKK->k_num_dihedral.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_dihedral,space);
if (atomKK->k_dihedral_type.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_dihedral_type,space);
if (atomKK->k_dihedral_atom1.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom1,space);
if (atomKK->k_dihedral_atom2.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom2,space);
if (atomKK->k_dihedral_atom3.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom3,space);
}
if (mask & IMPROPER_MASK) {
if (atomKK->k_num_improper.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_improper,space);
if (atomKK->k_improper_type.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_improper_type,space);
if (atomKK->k_improper_atom1.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom1,space);
if (atomKK->k_improper_atom2.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom2,space);
if (atomKK->k_improper_atom3.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom3,space);
if (atomKK->k_improper_atom4.need_sync<LMPDeviceType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom4,space);
}
} else {
if ((mask & X_MASK) && atomKK->k_x.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_x_array>(atomKK->k_x,space);
if ((mask & V_MASK) && atomKK->k_v.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_v_array>(atomKK->k_v,space);
if ((mask & F_MASK) && atomKK->k_f.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_f_array>(atomKK->k_f,space);
if ((mask & TAG_MASK) && atomKK->k_tag.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_1d>(atomKK->k_tag,space);
if ((mask & TYPE_MASK) && atomKK->k_type.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_type,space);
if ((mask & MASK_MASK) && atomKK->k_mask.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_mask,space);
if ((mask & IMAGE_MASK) && atomKK->k_image.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_imageint_1d>(atomKK->k_image,space);
if ((mask & Q_MASK) && atomKK->k_q.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_float_1d>(atomKK->k_q,space);
if ((mask & MOLECULE_MASK) && atomKK->k_molecule.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_1d>(atomKK->k_molecule,space);
if (mask & SPECIAL_MASK) {
if (atomKK->k_nspecial.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_nspecial,space);
if (atomKK->k_special.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_special,space);
}
if (mask & BOND_MASK) {
if (atomKK->k_num_bond.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_bond,space);
if (atomKK->k_bond_type.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_bond_type,space);
if (atomKK->k_bond_atom.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_bond_atom,space);
}
if (mask & ANGLE_MASK) {
if (atomKK->k_num_angle.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_angle,space);
if (atomKK->k_angle_type.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_angle_type,space);
if (atomKK->k_angle_atom1.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom1,space);
if (atomKK->k_angle_atom2.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom2,space);
if (atomKK->k_angle_atom3.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_angle_atom3,space);
}
if (mask & DIHEDRAL_MASK) {
if (atomKK->k_num_dihedral.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_dihedral,space);
if (atomKK->k_dihedral_type.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_dihedral_type,space);
if (atomKK->k_dihedral_atom1.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom1,space);
if (atomKK->k_dihedral_atom2.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom2,space);
if (atomKK->k_dihedral_atom3.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom3,space);
if (atomKK->k_dihedral_atom4.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_dihedral_atom4,space);
}
if (mask & IMPROPER_MASK) {
if (atomKK->k_num_improper.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_1d>(atomKK->k_num_improper,space);
if (atomKK->k_improper_type.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_int_2d>(atomKK->k_improper_type,space);
if (atomKK->k_improper_atom1.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom1,space);
if (atomKK->k_improper_atom2.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom2,space);
if (atomKK->k_improper_atom3.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom3,space);
if (atomKK->k_improper_atom4.need_sync<LMPHostType>())
perform_async_copy<DAT::tdual_tagint_2d>(atomKK->k_improper_atom4,space);
}
}
}
/* ---------------------------------------------------------------------- */
void AtomVecFullKokkos::modified(ExecutionSpace space, unsigned int mask)
{
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
if (mask & Q_MASK) atomKK->k_q.modify<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.modify<LMPDeviceType>();
atomKK->k_special.modify<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.modify<LMPDeviceType>();
atomKK->k_bond_type.modify<LMPDeviceType>();
atomKK->k_bond_atom.modify<LMPDeviceType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.modify<LMPDeviceType>();
atomKK->k_angle_type.modify<LMPDeviceType>();
atomKK->k_angle_atom1.modify<LMPDeviceType>();
atomKK->k_angle_atom2.modify<LMPDeviceType>();
atomKK->k_angle_atom3.modify<LMPDeviceType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.modify<LMPDeviceType>();
atomKK->k_dihedral_type.modify<LMPDeviceType>();
atomKK->k_dihedral_atom1.modify<LMPDeviceType>();
atomKK->k_dihedral_atom2.modify<LMPDeviceType>();
atomKK->k_dihedral_atom3.modify<LMPDeviceType>();
atomKK->k_dihedral_atom4.modify<LMPDeviceType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.modify<LMPDeviceType>();
atomKK->k_improper_type.modify<LMPDeviceType>();
atomKK->k_improper_atom1.modify<LMPDeviceType>();
atomKK->k_improper_atom2.modify<LMPDeviceType>();
atomKK->k_improper_atom3.modify<LMPDeviceType>();
atomKK->k_improper_atom4.modify<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.modify<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.modify<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.modify<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.modify<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.modify<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.modify<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPHostType>();
if (mask & Q_MASK) atomKK->k_q.modify<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.modify<LMPHostType>();
atomKK->k_special.modify<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.modify<LMPHostType>();
atomKK->k_bond_type.modify<LMPHostType>();
atomKK->k_bond_atom.modify<LMPHostType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.modify<LMPHostType>();
atomKK->k_angle_type.modify<LMPHostType>();
atomKK->k_angle_atom1.modify<LMPHostType>();
atomKK->k_angle_atom2.modify<LMPHostType>();
atomKK->k_angle_atom3.modify<LMPHostType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.modify<LMPHostType>();
atomKK->k_dihedral_type.modify<LMPHostType>();
atomKK->k_dihedral_atom1.modify<LMPHostType>();
atomKK->k_dihedral_atom2.modify<LMPHostType>();
atomKK->k_dihedral_atom3.modify<LMPHostType>();
atomKK->k_dihedral_atom4.modify<LMPHostType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.modify<LMPHostType>();
atomKK->k_improper_type.modify<LMPHostType>();
atomKK->k_improper_atom1.modify<LMPHostType>();
atomKK->k_improper_atom2.modify<LMPHostType>();
atomKK->k_improper_atom3.modify<LMPHostType>();
atomKK->k_improper_atom4.modify<LMPHostType>();
}
}
}
Event Timeline
Log In to Comment