diff --git a/src/USER-CUDA/cuda.h b/src/USER-CUDA/cuda.h index 2494796da2..9d77dcdb63 100644 --- a/src/USER-CUDA/cuda.h +++ b/src/USER-CUDA/cuda.h @@ -38,116 +38,118 @@ namespace LAMMPS_NS { - class Cuda : protected Pointers - { - public: - Cuda(class LAMMPS *); - ~Cuda(); - //static void setDevice(class LAMMPS*); - void allocate(); +class Cuda : protected Pointers +{ + public: + Cuda(class LAMMPS*); + ~Cuda(); + //static void setDevice(class LAMMPS*); + void allocate(); - void accelerator(int, char **); + void accelerator(int, char**); - void setSharedDataZero(); - void setSystemParams(); + void setSharedDataZero(); + void setSystemParams(); - void setDomainParams(); + void setDomainParams(); - void checkResize(); - void evsetup_eatom_vatom(int eflag_atom,int vflag_atom); - void uploadAll(); - void downloadAll(); - void downloadX(); + void checkResize(); + void evsetup_eatom_vatom(int eflag_atom, int vflag_atom); + void uploadAll(); + void downloadAll(); + void upload(int datamask); + void download(int datamask); + void downloadX(); - class CudaNeighList* registerNeighborList(class NeighList* neigh_list); - void uploadAllNeighborLists(); - void downloadAllNeighborLists(); - void set_neighinit(int dist_check, double triggerneighsq) - { - shared_data.atom.dist_check=dist_check; - shared_data.atom.triggerneighsq = triggerneighsq; - } - bool decide_by_integrator() - { - return neighbor_decide_by_integrator && cu_xhold && finished_setup; - } - void update_xhold(int &maxhold,double* xhold); + class CudaNeighList* registerNeighborList(class NeighList* neigh_list); + void uploadAllNeighborLists(); + void downloadAllNeighborLists(); + void set_neighinit(int dist_check, double triggerneighsq) { + shared_data.atom.dist_check = dist_check; + shared_data.atom.triggerneighsq = triggerneighsq; + } + bool decide_by_integrator() { + return neighbor_decide_by_integrator && cu_xhold && finished_setup; + } + void update_xhold(int &maxhold, double* xhold); - void setTimingsZero(); - void print_timings(); + void setTimingsZero(); + void print_timings(); - void cu_x_download() {cu_x->download();} - bool device_set; - bool dotiming; - bool dotestatom; - int testatom; + void cu_x_download() { + cu_x->download(); + } + bool device_set; + bool dotiming; + bool dotestatom; + int testatom; - double uploadtime,downloadtime; - bool finished_setup,begin_setup; - bool oncpu; - bool finished_run; + double uploadtime, downloadtime; + bool finished_setup, begin_setup; + bool oncpu; + bool finished_run; - int self_comm; + int self_comm; - int cuda_exists; + int cuda_exists; - double extent[6]; - int* debugdata; - // data shared between host code and device code - // (number of atoms, device pointers for up- & download) - cuda_shared_data shared_data; + double extent[6]; + int* debugdata; + // data shared between host code and device code + // (number of atoms, device pointers for up- & download) + cuda_shared_data shared_data; - cCudaData* cu_q; - cCudaData* cu_f; - cCudaData* cu_mass; - cCudaData* cu_rmass; - cCudaData* cu_v; - cCudaData* cu_x; - cCudaData* cu_xhold; - cCudaData* cu_mask; - cCudaData* cu_tag; - cCudaData* cu_type; - cCudaData* cu_image; - cCudaData* cu_eatom; - cCudaData* cu_vatom; - cCudaData* cu_virial; - cCudaData* cu_eng_vdwl; - cCudaData* cu_eng_coul; - cCudaData* cu_extent; - int* binned_id; - cCudaData* cu_binned_id; - int* binned_idnew; - cCudaData* cu_binned_idnew; - cCudaData* cu_debugdata; - cCudaData* cu_radius; - cCudaData* cu_density; - cCudaData* cu_omega; - cCudaData* cu_torque; - cCudaData* cu_special; - cCudaData* cu_nspecial; - cCudaData* cu_molecule; + cCudaData* cu_q; + cCudaData* cu_f; + cCudaData* cu_mass; + cCudaData* cu_rmass; + cCudaData* cu_v; + cCudaData* cu_x; + cCudaData* cu_xhold; + cCudaData* cu_mask; + cCudaData* cu_tag; + cCudaData* cu_type; + cCudaData* cu_image; + cCudaData* cu_eatom; + cCudaData* cu_vatom; + cCudaData* cu_virial; + cCudaData* cu_eng_vdwl; + cCudaData* cu_eng_coul; + cCudaData* cu_extent; + int* binned_id; + cCudaData* cu_binned_id; + int* binned_idnew; + cCudaData* cu_binned_idnew; + cCudaData* cu_debugdata; + cCudaData* cu_radius; + cCudaData* cu_density; + cCudaData* cu_omega; + cCudaData* cu_torque; + cCudaData* cu_special; + cCudaData* cu_nspecial; + cCudaData* cu_molecule; - cCudaData* cu_x_type; - X_FLOAT* x_type; + cCudaData* cu_x_type; + X_FLOAT* x_type; - cCudaData* cu_v_radius; - V_FLOAT* v_radius; + cCudaData* cu_v_radius; + V_FLOAT* v_radius; - cCudaData* cu_omega_rmass; - V_FLOAT* omega_rmass; + cCudaData* cu_omega_rmass; + V_FLOAT* omega_rmass; - cCudaData* cu_map_array; - int neighbor_decide_by_integrator; + cCudaData* cu_map_array; + int neighbor_decide_by_integrator; - bool pinned; + bool pinned; - void* copy_buffer; - int copy_buffersize; + void* copy_buffer; + int copy_buffersize; - private: - std::map neigh_lists; - }; + private: + std::map neigh_lists; +}; } #endif // CUDA_H diff --git a/src/group.cpp b/src/group.cpp index e15891d3a2..21bea8f750 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -25,7 +25,10 @@ #include "fix.h" #include "compute.h" #include "output.h" +#include "input.h" +#include "variable.h" #include "dump.h" +#include "memory.h" #include "error.h" using namespace LAMMPS_NS; @@ -241,6 +244,29 @@ void Group::assign(int narg, char **arg) delete [] list; + // style = variable + + } else if (strcmp(arg[1],"variable") == 0) { + + int ivar = input->variable->find(arg[2]); + if (ivar < 0) error->all(FLERR,"Variable name for group does not exist"); + if (!input->variable->atomstyle(ivar)) + error->all(FLERR,"Variable for group is invalid style"); + + double *aflag; + + // aflag = evaluation of per-atom variable + + memory->create(aflag,nlocal,"group:aflag"); + input->variable->compute_atom(ivar,0,aflag,1,0); + + // add to group if per-atom variable evaluated to non-zero + + for (i = 0; i < nlocal; i++) + if (aflag[i] != 0.0) mask[i] |= bit; + + memory->destroy(aflag); + // style = subtract } else if (strcmp(arg[1],"subtract") == 0) {