/* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://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. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- Contributing author: W. Michael Brown (Intel) ------------------------------------------------------------------------- */ #include "npair_half_bin_newton_tri_intel.h" #include "atom.h" #include "comm.h" #include "neigh_list.h" #include "neighbor.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ NPairHalfBinNewtonTriIntel::NPairHalfBinNewtonTriIntel(LAMMPS *lmp) : NPairIntel(lmp) {} /* ---------------------------------------------------------------------- binned neighbor list construction with Newton's 3rd law for triclinic each owned atom i checks its own bin and other bins in triclinic stencil every pair stored exactly once by some processor ------------------------------------------------------------------------- */ void NPairHalfBinNewtonTriIntel::build(NeighList *list) { if (nstencil > INTEL_MAX_STENCIL) error->all(FLERR, "Too many neighbor bins for USER-INTEL package."); #ifdef _LMP_INTEL_OFFLOAD if (exclude) error->all(FLERR, "Exclusion lists not yet supported for Intel offload"); #endif if (_fix->precision() == FixIntel::PREC_MODE_MIXED) hbnti(list, _fix->get_mixed_buffers()); else if (_fix->precision() == FixIntel::PREC_MODE_DOUBLE) hbnti(list, _fix->get_double_buffers()); else hbnti(list, _fix->get_single_buffers()); _fix->stop_watch(TIME_HOST_NEIGHBOR); } template void NPairHalfBinNewtonTriIntel:: hbnti(NeighList *list, IntelBuffers *buffers) { const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; list->inum = nlocal; int host_start = _fix->host_start_neighbor(); const int off_end = _fix->offload_end_neighbor(); #ifdef _LMP_INTEL_OFFLOAD if (off_end) grow_stencil(); if (_fix->full_host_list()) host_start = 0; int offload_noghost = _fix->offload_noghost(); #endif buffers->grow_list(list, atom->nlocal, comm->nthreads, 0, off_end); int need_ic = 0; if (atom->molecular != Atom::ATOMIC) dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, neighbor->cutneighmax); #ifdef _LMP_INTEL_OFFLOAD if (need_ic) { if (offload_noghost) { bin_newton(1, list, buffers, 0, off_end); bin_newton(0, list, buffers, host_start, nlocal, off_end); } else { bin_newton(1, list, buffers, 0, off_end); bin_newton(0, list, buffers, host_start, nlocal); } } else { if (offload_noghost) { bin_newton(1, list, buffers, 0, off_end); bin_newton(0, list, buffers, host_start, nlocal, off_end); } else { bin_newton(1, list, buffers, 0, off_end); bin_newton(0, list, buffers, host_start, nlocal); } } #else if (need_ic) bin_newton(0, list, buffers, host_start, nlocal); else bin_newton(0, list, buffers, host_start, nlocal); #endif }