diff --git a/doc/src/compute_pressure.txt b/doc/src/compute_pressure.txt index 28747b7dc5..cad3c5e65e 100644 --- a/doc/src/compute_pressure.txt +++ b/doc/src/compute_pressure.txt @@ -38,9 +38,17 @@ The pressure is computed by the formula where N is the number of atoms in the system (see discussion of DOF below), Kb is the Boltzmann constant, T is the temperature, d is the dimensionality of the system (2 or 3 for 2d/3d), V is the system -volume (or area in 2d), and the second term is the virial, computed -within LAMMPS for all pairwise as well as 2-body, 3-body, and 4-body, -and long-range interactions. "Fixes"_fix.html that impose constraints +volume (or area in 2d). +The second term is the virial, -dU/dV, computed within LAMMPS for all +pairwise as well as 2-body, 3-body, 4-body, many-body, and +long-range interactions, where r_i and f_i are the position and +force vector of atom i, and the big black dot indicates dot product. +When periodic boundary conditions are used, the summation includes +contributions from periodic images of the atoms in the central box, +which involves computing partial forces on local and ghost atoms. +A detailed description of how partial forces for 2-body and manybody +potentials are computed is provided in "(Thompson)"_#Thompson. +"Fixes"_fix.html that impose constraints (e.g. the "fix shake"_fix_shake.html command) also contribute to the virial term. diff --git a/src/Depend.sh b/src/Depend.sh index 7eb485cb1d..44964d5182 100644 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -53,6 +53,7 @@ fi if (test $1 = "CLASS2") then depend GPU + depend KOKKOS depend USER-OMP fi diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index fbeeaf96be..7ac66f1626 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -83,8 +83,13 @@ class AtomVecKokkos : public AtomVec { std::is_same::value, Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type, Kokkos::MemoryTraits > mirror_type; - if(buffer_size < src.capacity()) + if (buffer_size == 0) { + buffer = Kokkos::kokkos_malloc(src.capacity()); + buffer_size = src.capacity(); + } else if (buffer_size < src.capacity()) { buffer = Kokkos::kokkos_realloc(buffer,src.capacity()); + buffer_size = src.capacity(); + } return mirror_type( buffer , src.dimension_0() , src.dimension_1() , @@ -104,8 +109,13 @@ class AtomVecKokkos : public AtomVec { std::is_same::value, Kokkos::CudaHostPinnedSpace,typename ViewType::memory_space>::type, Kokkos::MemoryTraits > mirror_type; - if(buffer_size < src.capacity()) + if (buffer_size == 0) { + buffer = Kokkos::kokkos_malloc(src.capacity()*sizeof(typename ViewType::value_type)); + buffer_size = src.capacity(); + } else if (buffer_size < src.capacity()) { buffer = Kokkos::kokkos_realloc(buffer,src.capacity()*sizeof(typename ViewType::value_type)); + buffer_size = src.capacity(); + } mirror_type tmp_view( (typename ViewType::value_type*)buffer , src.dimension_0() , src.dimension_1() , diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index 9622129e70..31fa1859f9 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -21,6 +21,11 @@ #include "atom_masks.h" #include "error.h" #include "kokkos.h" +#include "force.h" +#include "bond.h" +#include "angle.h" +#include "dihedral.h" +#include "improper.h" using namespace LAMMPS_NS; @@ -601,7 +606,19 @@ void NeighborKokkos::build_topology_kokkos() { k_anglelist.modify(); k_dihedrallist.modify(); k_improperlist.modify(); - } else { + + // Transfer topology neighbor lists to Host for non-Kokkos styles + + if (force->bond && force->bond->execution_space == Host) + k_bondlist.sync(); + if (force->angle && force->angle->execution_space == Host) + k_anglelist.sync(); + if (force->dihedral && force->dihedral->execution_space == Host) + k_dihedrallist.sync(); + if (force->improper && force->improper->execution_space == Host) + k_improperlist.sync(); + + } else { neighbond_host.build_topology_kk(); k_bondlist = neighbond_host.k_bondlist; diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index 162661430b..2908622e87 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -126,26 +126,26 @@ void PairTersoffKokkos::setup_params() for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 1; k <= n; k++) { - m = elem2param[i-1][j-1][k-1]; - k_params.h_view(i,j,k).powerm = params[m].powerm; - k_params.h_view(i,j,k).gamma = params[m].gamma; - k_params.h_view(i,j,k).lam3 = params[m].lam3; - k_params.h_view(i,j,k).c = params[m].c; - k_params.h_view(i,j,k).d = params[m].d; - k_params.h_view(i,j,k).h = params[m].h; - k_params.h_view(i,j,k).powern = params[m].powern; - k_params.h_view(i,j,k).beta = params[m].beta; - k_params.h_view(i,j,k).lam2 = params[m].lam2; - k_params.h_view(i,j,k).bigb = params[m].bigb; - k_params.h_view(i,j,k).bigr = params[m].bigr; - k_params.h_view(i,j,k).bigd = params[m].bigd; - k_params.h_view(i,j,k).lam1 = params[m].lam1; - k_params.h_view(i,j,k).biga = params[m].biga; - k_params.h_view(i,j,k).cutsq = params[m].cutsq; - k_params.h_view(i,j,k).c1 = params[m].c1; - k_params.h_view(i,j,k).c2 = params[m].c2; - k_params.h_view(i,j,k).c3 = params[m].c3; - k_params.h_view(i,j,k).c4 = params[m].c4; + m = elem2param[map[i]][map[j]][map[k]]; + k_params.h_view(i,j,k).powerm = params[m].powerm; + k_params.h_view(i,j,k).gamma = params[m].gamma; + k_params.h_view(i,j,k).lam3 = params[m].lam3; + k_params.h_view(i,j,k).c = params[m].c; + k_params.h_view(i,j,k).d = params[m].d; + k_params.h_view(i,j,k).h = params[m].h; + k_params.h_view(i,j,k).powern = params[m].powern; + k_params.h_view(i,j,k).beta = params[m].beta; + k_params.h_view(i,j,k).lam2 = params[m].lam2; + k_params.h_view(i,j,k).bigb = params[m].bigb; + k_params.h_view(i,j,k).bigr = params[m].bigr; + k_params.h_view(i,j,k).bigd = params[m].bigd; + k_params.h_view(i,j,k).lam1 = params[m].lam1; + k_params.h_view(i,j,k).biga = params[m].biga; + k_params.h_view(i,j,k).cutsq = params[m].cutsq; + k_params.h_view(i,j,k).c1 = params[m].c1; + k_params.h_view(i,j,k).c2 = params[m].c2; + k_params.h_view(i,j,k).c3 = params[m].c3; + k_params.h_view(i,j,k).c4 = params[m].c4; } k_params.template modify(); diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index 0c8f46a30d..3406c607f3 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -125,27 +125,27 @@ void PairTersoffMODKokkos::setup_params() for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 1; k <= n; k++) { - m = elem2param[i-1][j-1][k-1]; - k_params.h_view(i,j,k).powerm = params[m].powerm; - k_params.h_view(i,j,k).lam3 = params[m].lam3; - k_params.h_view(i,j,k).h = params[m].h; - k_params.h_view(i,j,k).powern = params[m].powern; - k_params.h_view(i,j,k).beta = params[m].beta; - k_params.h_view(i,j,k).lam2 = params[m].lam2; - k_params.h_view(i,j,k).bigb = params[m].bigb; - k_params.h_view(i,j,k).bigr = params[m].bigr; - k_params.h_view(i,j,k).bigd = params[m].bigd; - k_params.h_view(i,j,k).lam1 = params[m].lam1; - k_params.h_view(i,j,k).biga = params[m].biga; - k_params.h_view(i,j,k).cutsq = params[m].cutsq; - k_params.h_view(i,j,k).c1 = params[m].c1; - k_params.h_view(i,j,k).c2 = params[m].c2; - k_params.h_view(i,j,k).c3 = params[m].c3; - k_params.h_view(i,j,k).c4 = params[m].c4; - k_params.h_view(i,j,k).c5 = params[m].c5; - k_params.h_view(i,j,k).ca1 = params[m].ca1; - k_params.h_view(i,j,k).ca4 = params[m].ca4; - k_params.h_view(i,j,k).powern_del = params[m].powern_del; + m = elem2param[map[i]][map[j]][map[k]]; + k_params.h_view(i,j,k).powerm = params[m].powerm; + k_params.h_view(i,j,k).lam3 = params[m].lam3; + k_params.h_view(i,j,k).h = params[m].h; + k_params.h_view(i,j,k).powern = params[m].powern; + k_params.h_view(i,j,k).beta = params[m].beta; + k_params.h_view(i,j,k).lam2 = params[m].lam2; + k_params.h_view(i,j,k).bigb = params[m].bigb; + k_params.h_view(i,j,k).bigr = params[m].bigr; + k_params.h_view(i,j,k).bigd = params[m].bigd; + k_params.h_view(i,j,k).lam1 = params[m].lam1; + k_params.h_view(i,j,k).biga = params[m].biga; + k_params.h_view(i,j,k).cutsq = params[m].cutsq; + k_params.h_view(i,j,k).c1 = params[m].c1; + k_params.h_view(i,j,k).c2 = params[m].c2; + k_params.h_view(i,j,k).c3 = params[m].c3; + k_params.h_view(i,j,k).c4 = params[m].c4; + k_params.h_view(i,j,k).c5 = params[m].c5; + k_params.h_view(i,j,k).ca1 = params[m].ca1; + k_params.h_view(i,j,k).ca4 = params[m].ca4; + k_params.h_view(i,j,k).powern_del = params[m].powern_del; } k_params.template modify(); diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index 6f011aecf4..07341911bd 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -136,30 +136,30 @@ void PairTersoffZBLKokkos::setup_params() for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) for (k = 1; k <= n; k++) { - m = elem2param[i-1][j-1][k-1]; - k_params.h_view(i,j,k).powerm = params[m].powerm; - k_params.h_view(i,j,k).gamma = params[m].gamma; - k_params.h_view(i,j,k).lam3 = params[m].lam3; - k_params.h_view(i,j,k).c = params[m].c; - k_params.h_view(i,j,k).d = params[m].d; - k_params.h_view(i,j,k).h = params[m].h; - k_params.h_view(i,j,k).powern = params[m].powern; - k_params.h_view(i,j,k).beta = params[m].beta; - k_params.h_view(i,j,k).lam2 = params[m].lam2; - k_params.h_view(i,j,k).bigb = params[m].bigb; - k_params.h_view(i,j,k).bigr = params[m].bigr; - k_params.h_view(i,j,k).bigd = params[m].bigd; - k_params.h_view(i,j,k).lam1 = params[m].lam1; - k_params.h_view(i,j,k).biga = params[m].biga; - k_params.h_view(i,j,k).cutsq = params[m].cutsq; - k_params.h_view(i,j,k).c1 = params[m].c1; - k_params.h_view(i,j,k).c2 = params[m].c2; - k_params.h_view(i,j,k).c3 = params[m].c3; - k_params.h_view(i,j,k).c4 = params[m].c4; - k_params.h_view(i,j,k).Z_i = params[m].Z_i; - k_params.h_view(i,j,k).Z_j = params[m].Z_j; - k_params.h_view(i,j,k).ZBLcut = params[m].ZBLcut; - k_params.h_view(i,j,k).ZBLexpscale = params[m].ZBLexpscale; + m = elem2param[map[i]][map[j]][map[k]]; + k_params.h_view(i,j,k).powerm = params[m].powerm; + k_params.h_view(i,j,k).gamma = params[m].gamma; + k_params.h_view(i,j,k).lam3 = params[m].lam3; + k_params.h_view(i,j,k).c = params[m].c; + k_params.h_view(i,j,k).d = params[m].d; + k_params.h_view(i,j,k).h = params[m].h; + k_params.h_view(i,j,k).powern = params[m].powern; + k_params.h_view(i,j,k).beta = params[m].beta; + k_params.h_view(i,j,k).lam2 = params[m].lam2; + k_params.h_view(i,j,k).bigb = params[m].bigb; + k_params.h_view(i,j,k).bigr = params[m].bigr; + k_params.h_view(i,j,k).bigd = params[m].bigd; + k_params.h_view(i,j,k).lam1 = params[m].lam1; + k_params.h_view(i,j,k).biga = params[m].biga; + k_params.h_view(i,j,k).cutsq = params[m].cutsq; + k_params.h_view(i,j,k).c1 = params[m].c1; + k_params.h_view(i,j,k).c2 = params[m].c2; + k_params.h_view(i,j,k).c3 = params[m].c3; + k_params.h_view(i,j,k).c4 = params[m].c4; + k_params.h_view(i,j,k).Z_i = params[m].Z_i; + k_params.h_view(i,j,k).Z_j = params[m].Z_j; + k_params.h_view(i,j,k).ZBLcut = params[m].ZBLcut; + k_params.h_view(i,j,k).ZBLexpscale = params[m].ZBLexpscale; } k_params.template modify(); diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h index a8c9520298..19b3204973 100644 --- a/src/KOKKOS/region_block_kokkos.h +++ b/src/KOKKOS/region_block_kokkos.h @@ -33,10 +33,10 @@ template class RegBlockKokkos : public RegBlock { friend class FixPour; + public: typedef DeviceType device_type; typedef ArrayTypes AT; - public: RegBlockKokkos(class LAMMPS *, int, char **); ~RegBlockKokkos(); void match_all_kokkos(int, DAT::t_int_1d); diff --git a/src/MISC/fix_orient_fcc.cpp b/src/MISC/fix_orient_fcc.cpp index 23b25b5cd0..401a99177b 100644 --- a/src/MISC/fix_orient_fcc.cpp +++ b/src/MISC/fix_orient_fcc.cpp @@ -55,7 +55,8 @@ static const char cite_fix_orient_fcc[] = FixOrientFCC::FixOrientFCC(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - xifilename(NULL), chifilename(NULL), order(NULL), nbr(NULL), sort(NULL), list(NULL) + xifilename(NULL), chifilename(NULL), order(NULL), nbr(NULL), + sort(NULL), list(NULL) { if (lmp->citeme) lmp->citeme->add(cite_fix_orient_fcc); diff --git a/src/USER-SMTBQ/pair_smtbq.cpp b/src/USER-SMTBQ/pair_smtbq.cpp index 4ccbc6da3a..5ab12aed6b 100644 --- a/src/USER-SMTBQ/pair_smtbq.cpp +++ b/src/USER-SMTBQ/pair_smtbq.cpp @@ -1423,7 +1423,7 @@ void PairSMTBQ::tabqeq() { gam = dgam = dza = dzb = d2zaa = d2zab = d2zbb = d2zra = d2zrb = d2gamr2 = 0.0 ; - aCoeff = bCoeff = dij = 0.0 ; + dij = 0.0 ; s = static_cast(k)*ds ; r = sqrt(s) ; if (k==0) r=10e-30; @@ -1438,7 +1438,6 @@ void PairSMTBQ::tabqeq() // Cutting Fonction - if (dij < 0.01 && ii==0) { ii=2; @@ -1452,7 +1451,6 @@ void PairSMTBQ::tabqeq() ddij = aCoeff*(r- rc-nang) *(2+bCoeff*(r-rc-nang))*exp(bCoeff*r); } - if (r > (rc+nang)) {dij = 0.0 ; ddij = 0.0;} fafb[k][m] = potqn[k] - dij ; @@ -1471,7 +1469,6 @@ void PairSMTBQ::tabqeq() rb = ROxSurf; zb = (2.0*params[j].ne + 1.0)/(4.0*rb); } - ii = 0 ; nang =cang= 5.0 ; // -------------------------- for (k = 0; k < kmax+5; k++) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index dc6896f27b..41a8107571 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -44,8 +44,9 @@ enum{PERATOM,LOCAL}; ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), - nvalues(0), which(NULL), argindex(NULL), flavor(NULL), value2index(NULL), ids(NULL), - onevec(NULL), replace(NULL), indices(NULL), owner(NULL), idregion(NULL), varatom(NULL) + nvalues(0), which(NULL), argindex(NULL), flavor(NULL), + value2index(NULL), ids(NULL), onevec(NULL), replace(NULL), indices(NULL), + owner(NULL), idregion(NULL), varatom(NULL) { int iarg = 0; if (strcmp(style,"reduce") == 0) {