1
/* ----------------------------------------------------------------------
2
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
3
http://lammps.sandia.gov, Sandia National Laboratories
4
Steve Plimpton, sjplimp@sandia.gov
6
Copyright (2003) Sandia Corporation. Under the terms of Contract
7
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
8
certain rights in this software. This software is distributed under
9
the GNU General Public License.
11
See the README file in the top-level LAMMPS directory.
12
------------------------------------------------------------------------- */
14
#include "domain_kokkos.h"
15
#include "atom_kokkos.h"
16
#include "atom_masks.h"
18
using namespace LAMMPS_NS;
20
/* ---------------------------------------------------------------------- */
22
DomainKokkos::DomainKokkos(LAMMPS *lmp) : Domain(lmp) {}
24
/* ---------------------------------------------------------------------- */
26
void DomainKokkos::init()
28
atomKK = (AtomKokkos *) atom;
32
/* ---------------------------------------------------------------------- */
34
template<class DeviceType, int PERIODIC, int DEFORM_VREMAP>
35
struct DomainPBCFunctor {
36
typedef DeviceType device_type;
37
double lo[3],hi[3],period[3];
38
typename ArrayTypes<DeviceType>::t_x_array x;
39
typename ArrayTypes<DeviceType>::t_v_array v;
40
typename ArrayTypes<DeviceType>::t_int_1d mask;
41
typename ArrayTypes<DeviceType>::t_imageint_1d image;
44
int xperiodic,yperiodic,zperiodic;
46
DomainPBCFunctor(double* _lo, double* _hi, double* _period,
47
DAT::tdual_x_array _x, DAT::tdual_v_array _v,
48
DAT::tdual_int_1d _mask, DAT::tdual_imageint_1d _image,
49
int _deform_groupbit, double* _h_rate,
50
int _xperiodic, int _yperiodic, int _zperiodic):
51
x(_x.view<DeviceType>()), v(_v.view<DeviceType>()),
52
mask(_mask.view<DeviceType>()), image(_image.view<DeviceType>()),
53
deform_groupbit(_deform_groupbit),
54
xperiodic(_xperiodic), yperiodic(_yperiodic), zperiodic(_zperiodic){
55
lo[0]=_lo[0]; lo[1]=_lo[1]; lo[2]=_lo[2];
56
hi[0]=_hi[0]; hi[1]=_hi[1]; hi[2]=_hi[2];
57
period[0]=_period[0]; period[1]=_period[1]; period[2]=_period[2];
58
h_rate[0]=_h_rate[0]; h_rate[1]=_h_rate[1]; h_rate[2]=_h_rate[2];
59
h_rate[3]=_h_rate[3]; h_rate[4]=_h_rate[4]; h_rate[5]=_h_rate[5];
62
KOKKOS_INLINE_FUNCTION
63
void operator() (const int &i) const {
64
if (PERIODIC && xperiodic) {
67
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) v(i,0) += h_rate[0];
68
imageint idim = image[i] & IMGMASK;
69
const int otherdims = image[i] ^ idim;
72
image[i] = otherdims | idim;
74
if (x(i,0) >= hi[0]) {
76
x(i,0) = MAX(x(i,0),lo[0]);
77
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) v(i,0) -= h_rate[0];
78
imageint idim = image[i] & IMGMASK;
79
const int otherdims = image[i] ^ idim;
82
image[i] = otherdims | idim;
86
if (PERIODIC && yperiodic) {
89
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) {
93
imageint idim = (image[i] >> IMGBITS) & IMGMASK;
94
const imageint otherdims = image[i] ^ (idim << IMGBITS);
97
image[i] = otherdims | (idim << IMGBITS);
99
if (x(i,1) >= hi[1]) {
101
x(i,1) = MAX(x(i,1),lo[1]);
102
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) {
106
imageint idim = (image[i] >> IMGBITS) & IMGMASK;
107
const imageint otherdims = image[i] ^ (idim << IMGBITS);
110
image[i] = otherdims | (idim << IMGBITS);
114
if (PERIODIC && zperiodic) {
115
if (x(i,2) < lo[2]) {
117
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) {
122
imageint idim = image[i] >> IMG2BITS;
123
const imageint otherdims = image[i] ^ (idim << IMG2BITS);
126
image[i] = otherdims | (idim << IMG2BITS);
128
if (x(i,2) >= hi[2]) {
130
x(i,2) = MAX(x(i,2),lo[2]);
131
if (DEFORM_VREMAP && (mask[i] & deform_groupbit)) {
136
imageint idim = image[i] >> IMG2BITS;
137
const imageint otherdims = image[i] ^ (idim << IMG2BITS);
140
image[i] = otherdims | (idim << IMG2BITS);
146
/* ----------------------------------------------------------------------
147
enforce PBC and modify box image flags for each atom
148
called every reneighboring and by other commands that change atoms
149
resulting coord must satisfy lo <= coord < hi
150
MAX is important since coord - prd < lo can happen when coord = hi
151
if fix deform, remap velocity of fix group atoms by box edge velocities
152
for triclinic, atoms must be in lamda coords (0-1) before pbc is called
153
image = 10 bits for each dimension
154
increment/decrement in wrap-around fashion
155
------------------------------------------------------------------------- */
157
void DomainKokkos::pbc()
159
double *lo,*hi,*period;
160
int nlocal = atomKK->nlocal;
162
if (triclinic == 0) {
172
atomKK->sync(Device,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK);
173
atomKK->modified(Device,X_MASK|V_MASK);
175
if (xperiodic || yperiodic || zperiodic) {
177
DomainPBCFunctor<LMPDeviceType,1,1>
179
atomKK->k_x,atomKK->k_v,atomKK->k_mask,atomKK->k_image,
180
deform_groupbit,h_rate,xperiodic,yperiodic,zperiodic);
181
Kokkos::parallel_for(nlocal,f);
183
DomainPBCFunctor<LMPDeviceType,1,0>
185
atomKK->k_x,atomKK->k_v,atomKK->k_mask,atomKK->k_image,
186
deform_groupbit,h_rate,xperiodic,yperiodic,zperiodic);
187
Kokkos::parallel_for(nlocal,f);
191
DomainPBCFunctor<LMPDeviceType,0,1>
193
atomKK->k_x,atomKK->k_v,atomKK->k_mask,atomKK->k_image,
194
deform_groupbit,h_rate,xperiodic,yperiodic,zperiodic);
195
Kokkos::parallel_for(nlocal,f);
197
DomainPBCFunctor<LMPDeviceType,0,0>
199
atomKK->k_x,atomKK->k_v,atomKK->k_mask,atomKK->k_image,
200
deform_groupbit,h_rate,xperiodic,yperiodic,zperiodic);
201
Kokkos::parallel_for(nlocal,f);
205
LMPDeviceType::fence();