mirror of https://github.com/lammps/lammps.git
Merge pull request #4030 from alphataubio/alphataubio-charmmfsw-kk
Kokkos charmmfsw pair and dihedral styles
This commit is contained in:
commit
54794a45de
|
@ -124,7 +124,7 @@ OPT.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* :doc:`charmm (iko) <dihedral_charmm>`
|
* :doc:`charmm (iko) <dihedral_charmm>`
|
||||||
* :doc:`charmmfsw <dihedral_charmm>`
|
* :doc:`charmmfsw (k) <dihedral_charmm>`
|
||||||
* :doc:`class2 (ko) <dihedral_class2>`
|
* :doc:`class2 (ko) <dihedral_class2>`
|
||||||
* :doc:`cosine/shift/exp (o) <dihedral_cosine_shift_exp>`
|
* :doc:`cosine/shift/exp (o) <dihedral_cosine_shift_exp>`
|
||||||
* :doc:`fourier (io) <dihedral_fourier>`
|
* :doc:`fourier (io) <dihedral_fourier>`
|
||||||
|
|
|
@ -146,7 +146,7 @@ OPT.
|
||||||
* :doc:`lj/charmm/coul/long/soft (o) <pair_fep_soft>`
|
* :doc:`lj/charmm/coul/long/soft (o) <pair_fep_soft>`
|
||||||
* :doc:`lj/charmm/coul/msm (o) <pair_charmm>`
|
* :doc:`lj/charmm/coul/msm (o) <pair_charmm>`
|
||||||
* :doc:`lj/charmmfsw/coul/charmmfsh <pair_charmm>`
|
* :doc:`lj/charmmfsw/coul/charmmfsh <pair_charmm>`
|
||||||
* :doc:`lj/charmmfsw/coul/long <pair_charmm>`
|
* :doc:`lj/charmmfsw/coul/long (k) <pair_charmm>`
|
||||||
* :doc:`lj/class2 (gko) <pair_class2>`
|
* :doc:`lj/class2 (gko) <pair_class2>`
|
||||||
* :doc:`lj/class2/coul/cut (ko) <pair_class2>`
|
* :doc:`lj/class2/coul/cut (ko) <pair_class2>`
|
||||||
* :doc:`lj/class2/coul/cut/soft <pair_fep_soft>`
|
* :doc:`lj/class2/coul/cut/soft <pair_fep_soft>`
|
||||||
|
|
|
@ -70,7 +70,9 @@ for more info.
|
||||||
Related commands
|
Related commands
|
||||||
""""""""""""""""
|
""""""""""""""""
|
||||||
|
|
||||||
:doc:`angle_coeff <angle_coeff>`
|
:doc:`angle_coeff <angle_coeff>`, :doc:`pair_style lj/charmm variants <pair_charmm>`,
|
||||||
|
:doc:`dihedral_style charmm <dihedral_charmm>`,
|
||||||
|
:doc:`dihedral_style charmmfsw <dihedral_charmm>`, :doc:`fix cmap <fix_cmap>`
|
||||||
|
|
||||||
Default
|
Default
|
||||||
"""""""
|
"""""""
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
.. index:: dihedral_style charmm/kk
|
.. index:: dihedral_style charmm/kk
|
||||||
.. index:: dihedral_style charmm/omp
|
.. index:: dihedral_style charmm/omp
|
||||||
.. index:: dihedral_style charmmfsw
|
.. index:: dihedral_style charmmfsw
|
||||||
|
.. index:: dihedral_style charmmfsw/kk
|
||||||
|
|
||||||
dihedral_style charmm command
|
dihedral_style charmm command
|
||||||
=============================
|
=============================
|
||||||
|
@ -12,6 +13,8 @@ Accelerator Variants: *charmm/intel*, *charmm/kk*, *charmm/omp*
|
||||||
dihedral_style charmmfsw command
|
dihedral_style charmmfsw command
|
||||||
================================
|
================================
|
||||||
|
|
||||||
|
Accelerator Variants: *charmmfsw/kk*
|
||||||
|
|
||||||
Syntax
|
Syntax
|
||||||
""""""
|
""""""
|
||||||
|
|
||||||
|
@ -144,7 +147,9 @@ for more info.
|
||||||
Related commands
|
Related commands
|
||||||
""""""""""""""""
|
""""""""""""""""
|
||||||
|
|
||||||
:doc:`dihedral_coeff <dihedral_coeff>`
|
:doc:`dihedral_coeff <dihedral_coeff>`,
|
||||||
|
:doc:`pair_style lj/charmm variants <pair_charmm>`,
|
||||||
|
:doc:`angle_style charmm <angle_charmm>`, :doc:`fix cmap <fix_cmap>`
|
||||||
|
|
||||||
Default
|
Default
|
||||||
"""""""
|
"""""""
|
||||||
|
|
|
@ -376,7 +376,7 @@ not listed, the default diameter of each atom in the molecule is 1.0.
|
||||||
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
..versionadded:: TBD
|
.. versionadded:: TBD
|
||||||
|
|
||||||
*Dipoles* section:
|
*Dipoles* section:
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
.. index:: pair_style lj/charmm/coul/msm/omp
|
.. index:: pair_style lj/charmm/coul/msm/omp
|
||||||
.. index:: pair_style lj/charmmfsw/coul/charmmfsh
|
.. index:: pair_style lj/charmmfsw/coul/charmmfsh
|
||||||
.. index:: pair_style lj/charmmfsw/coul/long
|
.. index:: pair_style lj/charmmfsw/coul/long
|
||||||
|
.. index:: pair_style lj/charmmfsw/coul/long/kk
|
||||||
|
|
||||||
pair_style lj/charmm/coul/charmm command
|
pair_style lj/charmm/coul/charmm command
|
||||||
========================================
|
========================================
|
||||||
|
@ -43,6 +44,8 @@ pair_style lj/charmmfsw/coul/charmmfsh command
|
||||||
pair_style lj/charmmfsw/coul/long command
|
pair_style lj/charmmfsw/coul/long command
|
||||||
=========================================
|
=========================================
|
||||||
|
|
||||||
|
Accelerator Variants: *lj/charmmfsw/coul/long/kk*
|
||||||
|
|
||||||
Syntax
|
Syntax
|
||||||
""""""
|
""""""
|
||||||
|
|
||||||
|
@ -281,7 +284,9 @@ page for more info.
|
||||||
Related commands
|
Related commands
|
||||||
""""""""""""""""
|
""""""""""""""""
|
||||||
|
|
||||||
:doc:`pair_coeff <pair_coeff>`
|
:doc:`pair_coeff <pair_coeff>`, :doc:`angle_style charmm <angle_charmm>`,
|
||||||
|
:doc:`dihedral_style charmm <dihedral_charmm>`,
|
||||||
|
:doc:`dihedral_style charmmfsw <dihedral_charmm>`, :doc:`fix cmap <fix_cmap>`
|
||||||
|
|
||||||
Default
|
Default
|
||||||
"""""""
|
"""""""
|
||||||
|
|
|
@ -106,6 +106,8 @@ action compute_temp_kokkos.cpp
|
||||||
action compute_temp_kokkos.h
|
action compute_temp_kokkos.h
|
||||||
action dihedral_charmm_kokkos.cpp dihedral_charmm.cpp
|
action dihedral_charmm_kokkos.cpp dihedral_charmm.cpp
|
||||||
action dihedral_charmm_kokkos.h dihedral_charmm.h
|
action dihedral_charmm_kokkos.h dihedral_charmm.h
|
||||||
|
action dihedral_charmmfsw_kokkos.cpp dihedral_charmmfsw.cpp
|
||||||
|
action dihedral_charmmfsw_kokkos.h dihedral_charmmfsw.h
|
||||||
action dihedral_class2_kokkos.cpp dihedral_class2.cpp
|
action dihedral_class2_kokkos.cpp dihedral_class2.cpp
|
||||||
action dihedral_class2_kokkos.h dihedral_class2.h
|
action dihedral_class2_kokkos.h dihedral_class2.h
|
||||||
action dihedral_harmonic_kokkos.cpp dihedral_harmonic.cpp
|
action dihedral_harmonic_kokkos.cpp dihedral_harmonic.cpp
|
||||||
|
@ -310,6 +312,8 @@ action pair_lj_charmm_coul_charmm_kokkos.cpp pair_lj_charmm_coul_charmm.cpp
|
||||||
action pair_lj_charmm_coul_charmm_kokkos.h pair_lj_charmm_coul_charmm.h
|
action pair_lj_charmm_coul_charmm_kokkos.h pair_lj_charmm_coul_charmm.h
|
||||||
action pair_lj_charmm_coul_long_kokkos.cpp pair_lj_charmm_coul_long.cpp
|
action pair_lj_charmm_coul_long_kokkos.cpp pair_lj_charmm_coul_long.cpp
|
||||||
action pair_lj_charmm_coul_long_kokkos.h pair_lj_charmm_coul_long.h
|
action pair_lj_charmm_coul_long_kokkos.h pair_lj_charmm_coul_long.h
|
||||||
|
action pair_lj_charmmfsw_coul_long_kokkos.cpp pair_lj_charmmfsw_coul_long.cpp
|
||||||
|
action pair_lj_charmmfsw_coul_long_kokkos.h pair_lj_charmmfsw_coul_long.h
|
||||||
action pair_lj_class2_coul_cut_kokkos.cpp pair_lj_class2_coul_cut.cpp
|
action pair_lj_class2_coul_cut_kokkos.cpp pair_lj_class2_coul_cut.cpp
|
||||||
action pair_lj_class2_coul_cut_kokkos.h pair_lj_class2_coul_cut.h
|
action pair_lj_class2_coul_cut_kokkos.h pair_lj_class2_coul_cut.h
|
||||||
action pair_lj_class2_coul_long_kokkos.cpp pair_lj_class2_coul_long.cpp
|
action pair_lj_class2_coul_long_kokkos.cpp pair_lj_class2_coul_long.cpp
|
||||||
|
|
|
@ -273,6 +273,7 @@ void AtomKokkos::map_set()
|
||||||
error->one(FLERR,"Failed to insert into Kokkos hash atom map");
|
error->one(FLERR,"Failed to insert into Kokkos hash atom map");
|
||||||
|
|
||||||
k_sametag.modify_device();
|
k_sametag.modify_device();
|
||||||
|
k_sametag.sync_host();
|
||||||
|
|
||||||
if (map_style == MAP_ARRAY)
|
if (map_style == MAP_ARRAY)
|
||||||
k_map_array.modify_device();
|
k_map_array.modify_device();
|
||||||
|
|
|
@ -0,0 +1,815 @@
|
||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
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: Mitch Murphy (alphataubio)
|
||||||
|
|
||||||
|
Based on serial dihedral_charmmfsw.cpp lj-fsw sections (force-switched)
|
||||||
|
provided by Robert Meissner and Lucio Colombi Ciacchi of Bremen
|
||||||
|
University, Germany, with additional assistance from
|
||||||
|
Robert A. Latour, Clemson University.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "dihedral_charmmfsw_kokkos.h"
|
||||||
|
|
||||||
|
#include "atom_kokkos.h"
|
||||||
|
#include "atom_masks.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "kokkos.h"
|
||||||
|
#include "math_const.h"
|
||||||
|
#include "memory_kokkos.h"
|
||||||
|
#include "neighbor_kokkos.h"
|
||||||
|
#include "pair.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
using namespace MathConst;
|
||||||
|
|
||||||
|
#define TOLERANCE 0.05
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
DihedralCharmmfswKokkos<DeviceType>::DihedralCharmmfswKokkos(LAMMPS *lmp) : DihedralCharmmfsw(lmp)
|
||||||
|
{
|
||||||
|
atomKK = (AtomKokkos *) atom;
|
||||||
|
neighborKK = (NeighborKokkos *) neighbor;
|
||||||
|
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
|
||||||
|
datamask_read = X_MASK | F_MASK | Q_MASK | ENERGY_MASK | VIRIAL_MASK | TYPE_MASK;
|
||||||
|
datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK;
|
||||||
|
|
||||||
|
k_warning_flag = Kokkos::DualView<int,DeviceType>("Dihedral:warning_flag");
|
||||||
|
d_warning_flag = k_warning_flag.template view<DeviceType>();
|
||||||
|
h_warning_flag = k_warning_flag.h_view;
|
||||||
|
|
||||||
|
centroidstressflag = CENTROID_NOTAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
DihedralCharmmfswKokkos<DeviceType>::~DihedralCharmmfswKokkos()
|
||||||
|
{
|
||||||
|
if (!copymode) {
|
||||||
|
memoryKK->destroy_kokkos(k_eatom,eatom);
|
||||||
|
memoryKK->destroy_kokkos(k_vatom,vatom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
|
||||||
|
{
|
||||||
|
eflag = eflag_in;
|
||||||
|
vflag = vflag_in;
|
||||||
|
|
||||||
|
if (lmp->kokkos->neighflag == FULL)
|
||||||
|
error->all(FLERR,"Dihedral_style charmm/kk requires half neighbor list");
|
||||||
|
|
||||||
|
ev_init(eflag,vflag,0);
|
||||||
|
|
||||||
|
// ensure pair->ev_tally() will use 1-4 virial contribution
|
||||||
|
|
||||||
|
if (weightflag && vflag_global == VIRIAL_FDOTR)
|
||||||
|
force->pair->vflag_either = force->pair->vflag_global = 1;
|
||||||
|
|
||||||
|
// reallocate per-atom arrays if necessary
|
||||||
|
|
||||||
|
if (eflag_atom) {
|
||||||
|
//if(k_eatom.extent(0)<maxeatom) { // won't work without adding zero functor
|
||||||
|
memoryKK->destroy_kokkos(k_eatom,eatom);
|
||||||
|
memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"dihedral:eatom");
|
||||||
|
d_eatom = k_eatom.template view<KKDeviceType>();
|
||||||
|
k_eatom_pair = Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType>("dihedral:eatom_pair",maxeatom);
|
||||||
|
d_eatom_pair = k_eatom_pair.template view<KKDeviceType>();
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
if (vflag_atom) {
|
||||||
|
//if(k_vatom.extent(0)<maxvatom) { // won't work without adding zero functor
|
||||||
|
memoryKK->destroy_kokkos(k_vatom,vatom);
|
||||||
|
memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"dihedral:vatom");
|
||||||
|
d_vatom = k_vatom.template view<KKDeviceType>();
|
||||||
|
k_vatom_pair = Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType>("dihedral:vatom_pair",maxvatom);
|
||||||
|
d_vatom_pair = k_vatom_pair.template view<KKDeviceType>();
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
x = atomKK->k_x.view<DeviceType>();
|
||||||
|
f = atomKK->k_f.view<DeviceType>();
|
||||||
|
q = atomKK->k_q.view<DeviceType>();
|
||||||
|
atomtype = atomKK->k_type.view<DeviceType>();
|
||||||
|
neighborKK->k_dihedrallist.template sync<DeviceType>();
|
||||||
|
dihedrallist = neighborKK->k_dihedrallist.view<DeviceType>();
|
||||||
|
int ndihedrallist = neighborKK->ndihedrallist;
|
||||||
|
nlocal = atom->nlocal;
|
||||||
|
newton_bond = force->newton_bond;
|
||||||
|
qqrd2e = force->qqrd2e;
|
||||||
|
|
||||||
|
h_warning_flag() = 0;
|
||||||
|
k_warning_flag.template modify<LMPHostType>();
|
||||||
|
k_warning_flag.template sync<DeviceType>();
|
||||||
|
|
||||||
|
copymode = 1;
|
||||||
|
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
|
||||||
|
EVM_FLOAT evm;
|
||||||
|
|
||||||
|
if (evflag) {
|
||||||
|
if (newton_bond) {
|
||||||
|
Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagDihedralCharmmfswCompute<1,1> >(0,ndihedrallist),*this,evm);
|
||||||
|
} else {
|
||||||
|
Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagDihedralCharmmfswCompute<0,1> >(0,ndihedrallist),*this,evm);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (newton_bond) {
|
||||||
|
Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, TagDihedralCharmmfswCompute<1,0> >(0,ndihedrallist),*this);
|
||||||
|
} else {
|
||||||
|
Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, TagDihedralCharmmfswCompute<0,0> >(0,ndihedrallist),*this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// error check
|
||||||
|
|
||||||
|
k_warning_flag.template modify<DeviceType>();
|
||||||
|
k_warning_flag.template sync<LMPHostType>();
|
||||||
|
if (h_warning_flag())
|
||||||
|
error->warning(FLERR,"Dihedral problem");
|
||||||
|
|
||||||
|
if (eflag_global) {
|
||||||
|
energy += evm.emol;
|
||||||
|
force->pair->eng_vdwl += evm.evdwl;
|
||||||
|
force->pair->eng_coul += evm.ecoul;
|
||||||
|
}
|
||||||
|
if (vflag_global) {
|
||||||
|
virial[0] += evm.v[0];
|
||||||
|
virial[1] += evm.v[1];
|
||||||
|
virial[2] += evm.v[2];
|
||||||
|
virial[3] += evm.v[3];
|
||||||
|
virial[4] += evm.v[4];
|
||||||
|
virial[5] += evm.v[5];
|
||||||
|
|
||||||
|
force->pair->virial[0] += evm.vp[0];
|
||||||
|
force->pair->virial[1] += evm.vp[1];
|
||||||
|
force->pair->virial[2] += evm.vp[2];
|
||||||
|
force->pair->virial[3] += evm.vp[3];
|
||||||
|
force->pair->virial[4] += evm.vp[4];
|
||||||
|
force->pair->virial[5] += evm.vp[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't yet have dualviews for eatom and vatom in pair_kokkos,
|
||||||
|
// so need to manually copy these to pair style
|
||||||
|
|
||||||
|
int n = nlocal;
|
||||||
|
if (newton_bond) n += atom->nghost;
|
||||||
|
|
||||||
|
if (eflag_atom) {
|
||||||
|
k_eatom.template modify<DeviceType>();
|
||||||
|
k_eatom.template sync<LMPHostType>();
|
||||||
|
|
||||||
|
k_eatom_pair.template modify<DeviceType>();
|
||||||
|
k_eatom_pair.template sync<LMPHostType>();
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
force->pair->eatom[i] += k_eatom_pair.h_view(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_atom) {
|
||||||
|
k_vatom.template modify<DeviceType>();
|
||||||
|
k_vatom.template sync<LMPHostType>();
|
||||||
|
|
||||||
|
k_vatom_pair.template modify<DeviceType>();
|
||||||
|
k_vatom_pair.template sync<LMPHostType>();
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
force->pair->vatom[i][0] += k_vatom_pair.h_view(i,0);
|
||||||
|
force->pair->vatom[i][1] += k_vatom_pair.h_view(i,1);
|
||||||
|
force->pair->vatom[i][2] += k_vatom_pair.h_view(i,2);
|
||||||
|
force->pair->vatom[i][3] += k_vatom_pair.h_view(i,3);
|
||||||
|
force->pair->vatom[i][4] += k_vatom_pair.h_view(i,4);
|
||||||
|
force->pair->vatom[i][5] += k_vatom_pair.h_view(i,5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
copymode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
template<int NEWTON_BOND, int EVFLAG>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::operator()(TagDihedralCharmmfswCompute<NEWTON_BOND,EVFLAG>, const int &n, EVM_FLOAT& evm) const {
|
||||||
|
|
||||||
|
// The f array is atomic
|
||||||
|
Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<Kokkos::Atomic|Kokkos::Unmanaged> > a_f = f;
|
||||||
|
|
||||||
|
const int i1 = dihedrallist(n,0);
|
||||||
|
const int i2 = dihedrallist(n,1);
|
||||||
|
const int i3 = dihedrallist(n,2);
|
||||||
|
const int i4 = dihedrallist(n,3);
|
||||||
|
const int type = dihedrallist(n,4);
|
||||||
|
|
||||||
|
// 1st bond
|
||||||
|
|
||||||
|
const F_FLOAT vb1x = x(i1,0) - x(i2,0);
|
||||||
|
const F_FLOAT vb1y = x(i1,1) - x(i2,1);
|
||||||
|
const F_FLOAT vb1z = x(i1,2) - x(i2,2);
|
||||||
|
|
||||||
|
// 2nd bond
|
||||||
|
|
||||||
|
const F_FLOAT vb2x = x(i3,0) - x(i2,0);
|
||||||
|
const F_FLOAT vb2y = x(i3,1) - x(i2,1);
|
||||||
|
const F_FLOAT vb2z = x(i3,2) - x(i2,2);
|
||||||
|
|
||||||
|
const F_FLOAT vb2xm = -vb2x;
|
||||||
|
const F_FLOAT vb2ym = -vb2y;
|
||||||
|
const F_FLOAT vb2zm = -vb2z;
|
||||||
|
|
||||||
|
// 3rd bond
|
||||||
|
|
||||||
|
const F_FLOAT vb3x = x(i4,0) - x(i3,0);
|
||||||
|
const F_FLOAT vb3y = x(i4,1) - x(i3,1);
|
||||||
|
const F_FLOAT vb3z = x(i4,2) - x(i3,2);
|
||||||
|
|
||||||
|
const F_FLOAT ax = vb1y*vb2zm - vb1z*vb2ym;
|
||||||
|
const F_FLOAT ay = vb1z*vb2xm - vb1x*vb2zm;
|
||||||
|
const F_FLOAT az = vb1x*vb2ym - vb1y*vb2xm;
|
||||||
|
const F_FLOAT bx = vb3y*vb2zm - vb3z*vb2ym;
|
||||||
|
const F_FLOAT by = vb3z*vb2xm - vb3x*vb2zm;
|
||||||
|
const F_FLOAT bz = vb3x*vb2ym - vb3y*vb2xm;
|
||||||
|
|
||||||
|
const F_FLOAT rasq = ax*ax + ay*ay + az*az;
|
||||||
|
const F_FLOAT rbsq = bx*bx + by*by + bz*bz;
|
||||||
|
const F_FLOAT rgsq = vb2xm*vb2xm + vb2ym*vb2ym + vb2zm*vb2zm;
|
||||||
|
const F_FLOAT rg = sqrt(rgsq);
|
||||||
|
|
||||||
|
F_FLOAT rginv,ra2inv,rb2inv;
|
||||||
|
rginv = ra2inv = rb2inv = 0.0;
|
||||||
|
if (rg > 0) rginv = 1.0/rg;
|
||||||
|
if (rasq > 0) ra2inv = 1.0/rasq;
|
||||||
|
if (rbsq > 0) rb2inv = 1.0/rbsq;
|
||||||
|
const F_FLOAT rabinv = sqrt(ra2inv*rb2inv);
|
||||||
|
|
||||||
|
F_FLOAT c = (ax*bx + ay*by + az*bz)*rabinv;
|
||||||
|
F_FLOAT s = rg*rabinv*(ax*vb3x + ay*vb3y + az*vb3z);
|
||||||
|
|
||||||
|
// error check
|
||||||
|
|
||||||
|
if ((c > 1.0 + TOLERANCE || c < (-1.0 - TOLERANCE)) && !d_warning_flag())
|
||||||
|
d_warning_flag() = 1;
|
||||||
|
|
||||||
|
if (c > 1.0) c = 1.0;
|
||||||
|
if (c < -1.0) c = -1.0;
|
||||||
|
|
||||||
|
const int m = d_multiplicity[type];
|
||||||
|
F_FLOAT p = 1.0;
|
||||||
|
F_FLOAT ddf1,df1;
|
||||||
|
ddf1 = df1 = 0.0;
|
||||||
|
|
||||||
|
for (int i = 0; i < m; i++) {
|
||||||
|
ddf1 = p*c - df1*s;
|
||||||
|
df1 = p*s + df1*c;
|
||||||
|
p = ddf1;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = p*d_cos_shift[type] + df1*d_sin_shift[type];
|
||||||
|
df1 = df1*d_cos_shift[type] - ddf1*d_sin_shift[type];
|
||||||
|
df1 *= -m;
|
||||||
|
p += 1.0;
|
||||||
|
|
||||||
|
if (m == 0) {
|
||||||
|
p = 1.0 + d_cos_shift[type];
|
||||||
|
df1 = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
E_FLOAT edihedral = 0.0;
|
||||||
|
if (eflag) edihedral = d_k[type] * p;
|
||||||
|
|
||||||
|
const F_FLOAT fg = vb1x*vb2xm + vb1y*vb2ym + vb1z*vb2zm;
|
||||||
|
const F_FLOAT hg = vb3x*vb2xm + vb3y*vb2ym + vb3z*vb2zm;
|
||||||
|
const F_FLOAT fga = fg*ra2inv*rginv;
|
||||||
|
const F_FLOAT hgb = hg*rb2inv*rginv;
|
||||||
|
const F_FLOAT gaa = -ra2inv*rg;
|
||||||
|
const F_FLOAT gbb = rb2inv*rg;
|
||||||
|
|
||||||
|
const F_FLOAT dtfx = gaa*ax;
|
||||||
|
const F_FLOAT dtfy = gaa*ay;
|
||||||
|
const F_FLOAT dtfz = gaa*az;
|
||||||
|
const F_FLOAT dtgx = fga*ax - hgb*bx;
|
||||||
|
const F_FLOAT dtgy = fga*ay - hgb*by;
|
||||||
|
const F_FLOAT dtgz = fga*az - hgb*bz;
|
||||||
|
const F_FLOAT dthx = gbb*bx;
|
||||||
|
const F_FLOAT dthy = gbb*by;
|
||||||
|
const F_FLOAT dthz = gbb*bz;
|
||||||
|
|
||||||
|
const F_FLOAT df = -d_k[type] * df1;
|
||||||
|
|
||||||
|
const F_FLOAT sx2 = df*dtgx;
|
||||||
|
const F_FLOAT sy2 = df*dtgy;
|
||||||
|
const F_FLOAT sz2 = df*dtgz;
|
||||||
|
|
||||||
|
F_FLOAT f1[3],f2[3],f3[3],f4[3];
|
||||||
|
f1[0] = df*dtfx;
|
||||||
|
f1[1] = df*dtfy;
|
||||||
|
f1[2] = df*dtfz;
|
||||||
|
|
||||||
|
f2[0] = sx2 - f1[0];
|
||||||
|
f2[1] = sy2 - f1[1];
|
||||||
|
f2[2] = sz2 - f1[2];
|
||||||
|
|
||||||
|
f4[0] = df*dthx;
|
||||||
|
f4[1] = df*dthy;
|
||||||
|
f4[2] = df*dthz;
|
||||||
|
|
||||||
|
f3[0] = -sx2 - f4[0];
|
||||||
|
f3[1] = -sy2 - f4[1];
|
||||||
|
f3[2] = -sz2 - f4[2];
|
||||||
|
|
||||||
|
// apply force to each of 4 atoms
|
||||||
|
|
||||||
|
if (NEWTON_BOND || i1 < nlocal) {
|
||||||
|
a_f(i1,0) += f1[0];
|
||||||
|
a_f(i1,1) += f1[1];
|
||||||
|
a_f(i1,2) += f1[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NEWTON_BOND || i2 < nlocal) {
|
||||||
|
a_f(i2,0) += f2[0];
|
||||||
|
a_f(i2,1) += f2[1];
|
||||||
|
a_f(i2,2) += f2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NEWTON_BOND || i3 < nlocal) {
|
||||||
|
a_f(i3,0) += f3[0];
|
||||||
|
a_f(i3,1) += f3[1];
|
||||||
|
a_f(i3,2) += f3[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NEWTON_BOND || i4 < nlocal) {
|
||||||
|
a_f(i4,0) += f4[0];
|
||||||
|
a_f(i4,1) += f4[1];
|
||||||
|
a_f(i4,2) += f4[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EVFLAG)
|
||||||
|
ev_tally(evm,i1,i2,i3,i4,edihedral,f1,f3,f4,
|
||||||
|
vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z);
|
||||||
|
|
||||||
|
// 1-4 LJ and Coulomb interactions
|
||||||
|
// tally energy/virial in pair, using newton_bond as newton flag
|
||||||
|
|
||||||
|
if (d_weight[type] > 0.0) {
|
||||||
|
const int itype = atomtype[i1];
|
||||||
|
const int jtype = atomtype[i4];
|
||||||
|
|
||||||
|
const F_FLOAT delx = x(i1,0) - x(i4,0);
|
||||||
|
const F_FLOAT dely = x(i1,1) - x(i4,1);
|
||||||
|
const F_FLOAT delz = x(i1,2) - x(i4,2);
|
||||||
|
const F_FLOAT rsq = delx*delx + dely*dely + delz*delz;
|
||||||
|
const F_FLOAT r2inv = 1.0/rsq;
|
||||||
|
const F_FLOAT r6inv = r2inv*r2inv*r2inv;
|
||||||
|
|
||||||
|
F_FLOAT forcecoul;
|
||||||
|
if (implicit) forcecoul = qqrd2e * q[i1]*q[i4]*r2inv;
|
||||||
|
else forcecoul = qqrd2e * q[i1]*q[i4]*sqrt(r2inv);
|
||||||
|
const F_FLOAT forcelj = r6inv * (d_lj14_1(itype,jtype)*r6inv - d_lj14_2(itype,jtype));
|
||||||
|
const F_FLOAT fpair = d_weight[type] * (forcelj+forcecoul)*r2inv;
|
||||||
|
|
||||||
|
const F_FLOAT r = sqrt(rsq);
|
||||||
|
F_FLOAT ecoul = 0.0;
|
||||||
|
F_FLOAT evdwl = 0.0;
|
||||||
|
F_FLOAT evdwl14_12, evdwl14_6;
|
||||||
|
if (eflag) {
|
||||||
|
if (dihedflag)
|
||||||
|
ecoul = d_weight[type] * forcecoul;
|
||||||
|
else
|
||||||
|
ecoul = d_weight[type] * qqrd2e * q[i1] * q[i4] *
|
||||||
|
(sqrt(r2inv) + r * cut_coulinv14 * cut_coulinv14 - 2.0 * cut_coulinv14);
|
||||||
|
evdwl14_12 = r6inv * d_lj14_3(itype,jtype) * r6inv -
|
||||||
|
d_lj14_3(itype,jtype) * cut_lj_inner6inv * cut_lj6inv;
|
||||||
|
evdwl14_6 =
|
||||||
|
-d_lj14_4(itype,jtype) * r6inv + d_lj14_4(itype,jtype) * cut_lj_inner3inv * cut_lj3inv;
|
||||||
|
evdwl = evdwl14_12 + evdwl14_6;
|
||||||
|
evdwl *= d_weight[type];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newton_bond || i1 < nlocal) {
|
||||||
|
a_f(i1,0) += delx*fpair;
|
||||||
|
a_f(i1,1) += dely*fpair;
|
||||||
|
a_f(i1,2) += delz*fpair;
|
||||||
|
}
|
||||||
|
if (newton_bond || i4 < nlocal) {
|
||||||
|
a_f(i4,0) -= delx*fpair;
|
||||||
|
a_f(i4,1) -= dely*fpair;
|
||||||
|
a_f(i4,2) -= delz*fpair;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EVFLAG) ev_tally(evm,i1,i4,evdwl,ecoul,fpair,delx,dely,delz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
template<int NEWTON_BOND, int EVFLAG>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::operator()(TagDihedralCharmmfswCompute<NEWTON_BOND,EVFLAG>, const int &n) const {
|
||||||
|
EVM_FLOAT evm;
|
||||||
|
this->template operator()<NEWTON_BOND,EVFLAG>(TagDihedralCharmmfswCompute<NEWTON_BOND,EVFLAG>(), n, evm);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::allocate()
|
||||||
|
{
|
||||||
|
DihedralCharmmfsw::allocate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
set coeffs for one or more types
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::coeff(int narg, char **arg)
|
||||||
|
{
|
||||||
|
DihedralCharmmfsw::coeff(narg, arg);
|
||||||
|
|
||||||
|
int nd = atom->ndihedraltypes;
|
||||||
|
typename AT::tdual_ffloat_1d k_k("DihedralCharmmfsw::k",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_multiplicity("DihedralCharmmfsw::multiplicity",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_shift("DihedralCharmmfsw::shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_cos_shift("DihedralCharmmfsw::cos_shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_sin_shift("DihedralCharmmfsw::sin_shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_weight("DihedralCharmmfsw::weight",nd+1);
|
||||||
|
|
||||||
|
d_k = k_k.template view<DeviceType>();
|
||||||
|
d_multiplicity = k_multiplicity.template view<DeviceType>();
|
||||||
|
d_shift = k_shift.template view<DeviceType>();
|
||||||
|
d_cos_shift = k_cos_shift.template view<DeviceType>();
|
||||||
|
d_sin_shift = k_sin_shift.template view<DeviceType>();
|
||||||
|
d_weight = k_weight.template view<DeviceType>();
|
||||||
|
|
||||||
|
int n = atom->ndihedraltypes;
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
k_k.h_view[i] = k[i];
|
||||||
|
k_multiplicity.h_view[i] = multiplicity[i];
|
||||||
|
k_shift.h_view[i] = shift[i];
|
||||||
|
k_cos_shift.h_view[i] = cos_shift[i];
|
||||||
|
k_sin_shift.h_view[i] = sin_shift[i];
|
||||||
|
k_weight.h_view[i] = weight[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
k_k.template modify<LMPHostType>();
|
||||||
|
k_multiplicity.template modify<LMPHostType>();
|
||||||
|
k_shift.template modify<LMPHostType>();
|
||||||
|
k_cos_shift.template modify<LMPHostType>();
|
||||||
|
k_sin_shift.template modify<LMPHostType>();
|
||||||
|
k_weight.template modify<LMPHostType>();
|
||||||
|
|
||||||
|
k_k.template sync<DeviceType>();
|
||||||
|
k_multiplicity.template sync<DeviceType>();
|
||||||
|
k_shift.template sync<DeviceType>();
|
||||||
|
k_cos_shift.template sync<DeviceType>();
|
||||||
|
k_sin_shift.template sync<DeviceType>();
|
||||||
|
k_weight.template sync<DeviceType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
error check and initialize all values needed for force computation
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::init_style()
|
||||||
|
{
|
||||||
|
DihedralCharmmfsw::init_style();
|
||||||
|
|
||||||
|
int n = atom->ntypes;
|
||||||
|
DAT::tdual_ffloat_2d k_lj14_1("DihedralCharmmfsw:lj14_1",n+1,n+1);
|
||||||
|
DAT::tdual_ffloat_2d k_lj14_2("DihedralCharmmfsw:lj14_2",n+1,n+1);
|
||||||
|
DAT::tdual_ffloat_2d k_lj14_3("DihedralCharmmfsw:lj14_3",n+1,n+1);
|
||||||
|
DAT::tdual_ffloat_2d k_lj14_4("DihedralCharmmfsw:lj14_4",n+1,n+1);
|
||||||
|
|
||||||
|
d_lj14_1 = k_lj14_1.template view<DeviceType>();
|
||||||
|
d_lj14_2 = k_lj14_2.template view<DeviceType>();
|
||||||
|
d_lj14_3 = k_lj14_3.template view<DeviceType>();
|
||||||
|
d_lj14_4 = k_lj14_4.template view<DeviceType>();
|
||||||
|
|
||||||
|
|
||||||
|
if (weightflag) {
|
||||||
|
int n = atom->ntypes;
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
for (int j = 1; j <= n; j++) {
|
||||||
|
k_lj14_1.h_view(i,j) = lj14_1[i][j];
|
||||||
|
k_lj14_2.h_view(i,j) = lj14_2[i][j];
|
||||||
|
k_lj14_3.h_view(i,j) = lj14_3[i][j];
|
||||||
|
k_lj14_4.h_view(i,j) = lj14_4[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
k_lj14_1.template modify<LMPHostType>();
|
||||||
|
k_lj14_2.template modify<LMPHostType>();
|
||||||
|
k_lj14_3.template modify<LMPHostType>();
|
||||||
|
k_lj14_4.template modify<LMPHostType>();
|
||||||
|
|
||||||
|
k_lj14_1.template sync<DeviceType>();
|
||||||
|
k_lj14_2.template sync<DeviceType>();
|
||||||
|
k_lj14_3.template sync<DeviceType>();
|
||||||
|
k_lj14_4.template sync<DeviceType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
proc 0 reads coeffs from restart file, bcasts them
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::read_restart(FILE *fp)
|
||||||
|
{
|
||||||
|
DihedralCharmmfsw::read_restart(fp);
|
||||||
|
|
||||||
|
int nd = atom->ndihedraltypes;
|
||||||
|
typename AT::tdual_ffloat_1d k_k("DihedralCharmmfsw::k",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_multiplicity("DihedralCharmmfsw::multiplicity",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_shift("DihedralCharmmfsw::shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_cos_shift("DihedralCharmmfsw::cos_shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_sin_shift("DihedralCharmmfsw::sin_shift",nd+1);
|
||||||
|
typename AT::tdual_ffloat_1d k_weight("DihedralCharmmfsw::weight",nd+1);
|
||||||
|
|
||||||
|
d_k = k_k.template view<DeviceType>();
|
||||||
|
d_multiplicity = k_multiplicity.template view<DeviceType>();
|
||||||
|
d_shift = k_shift.template view<DeviceType>();
|
||||||
|
d_cos_shift = k_cos_shift.template view<DeviceType>();
|
||||||
|
d_sin_shift = k_sin_shift.template view<DeviceType>();
|
||||||
|
d_weight = k_weight.template view<DeviceType>();
|
||||||
|
|
||||||
|
int n = atom->ndihedraltypes;
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
k_k.h_view[i] = k[i];
|
||||||
|
k_multiplicity.h_view[i] = multiplicity[i];
|
||||||
|
k_shift.h_view[i] = shift[i];
|
||||||
|
k_cos_shift.h_view[i] = cos_shift[i];
|
||||||
|
k_sin_shift.h_view[i] = sin_shift[i];
|
||||||
|
k_weight.h_view[i] = weight[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
k_k.template modify<LMPHostType>();
|
||||||
|
k_multiplicity.template modify<LMPHostType>();
|
||||||
|
k_shift.template modify<LMPHostType>();
|
||||||
|
k_cos_shift.template modify<LMPHostType>();
|
||||||
|
k_sin_shift.template modify<LMPHostType>();
|
||||||
|
k_weight.template modify<LMPHostType>();
|
||||||
|
|
||||||
|
k_k.template sync<DeviceType>();
|
||||||
|
k_multiplicity.template sync<DeviceType>();
|
||||||
|
k_shift.template sync<DeviceType>();
|
||||||
|
k_cos_shift.template sync<DeviceType>();
|
||||||
|
k_sin_shift.template sync<DeviceType>();
|
||||||
|
k_weight.template sync<DeviceType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
tally energy and virial into global and per-atom accumulators
|
||||||
|
virial = r1F1 + r2F2 + r3F3 + r4F4 = (r1-r2) F1 + (r3-r2) F3 + (r4-r2) F4
|
||||||
|
= (r1-r2) F1 + (r3-r2) F3 + (r4-r3 + r3-r2) F4
|
||||||
|
= vb1*f1 + vb2*f3 + (vb3+vb2)*f4
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
//template<int NEWTON_BOND>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::ev_tally(EVM_FLOAT &evm, const int i1, const int i2, const int i3, const int i4,
|
||||||
|
F_FLOAT &edihedral, F_FLOAT *f1, F_FLOAT *f3, F_FLOAT *f4,
|
||||||
|
const F_FLOAT &vb1x, const F_FLOAT &vb1y, const F_FLOAT &vb1z,
|
||||||
|
const F_FLOAT &vb2x, const F_FLOAT &vb2y, const F_FLOAT &vb2z,
|
||||||
|
const F_FLOAT &vb3x, const F_FLOAT &vb3y, const F_FLOAT &vb3z) const
|
||||||
|
{
|
||||||
|
E_FLOAT edihedralquarter;
|
||||||
|
F_FLOAT v[6];
|
||||||
|
|
||||||
|
if (eflag_either) {
|
||||||
|
if (eflag_global) {
|
||||||
|
if (newton_bond) evm.emol += edihedral;
|
||||||
|
else {
|
||||||
|
edihedralquarter = 0.25*edihedral;
|
||||||
|
if (i1 < nlocal) evm.emol += edihedralquarter;
|
||||||
|
if (i2 < nlocal) evm.emol += edihedralquarter;
|
||||||
|
if (i3 < nlocal) evm.emol += edihedralquarter;
|
||||||
|
if (i4 < nlocal) evm.emol += edihedralquarter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eflag_atom) {
|
||||||
|
edihedralquarter = 0.25*edihedral;
|
||||||
|
if (newton_bond || i1 < nlocal) d_eatom[i1] += edihedralquarter;
|
||||||
|
if (newton_bond || i2 < nlocal) d_eatom[i2] += edihedralquarter;
|
||||||
|
if (newton_bond || i3 < nlocal) d_eatom[i3] += edihedralquarter;
|
||||||
|
if (newton_bond || i4 < nlocal) d_eatom[i4] += edihedralquarter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_either) {
|
||||||
|
v[0] = vb1x*f1[0] + vb2x*f3[0] + (vb3x+vb2x)*f4[0];
|
||||||
|
v[1] = vb1y*f1[1] + vb2y*f3[1] + (vb3y+vb2y)*f4[1];
|
||||||
|
v[2] = vb1z*f1[2] + vb2z*f3[2] + (vb3z+vb2z)*f4[2];
|
||||||
|
v[3] = vb1x*f1[1] + vb2x*f3[1] + (vb3x+vb2x)*f4[1];
|
||||||
|
v[4] = vb1x*f1[2] + vb2x*f3[2] + (vb3x+vb2x)*f4[2];
|
||||||
|
v[5] = vb1y*f1[2] + vb2y*f3[2] + (vb3y+vb2y)*f4[2];
|
||||||
|
|
||||||
|
if (vflag_global) {
|
||||||
|
if (newton_bond) {
|
||||||
|
evm.v[0] += v[0];
|
||||||
|
evm.v[1] += v[1];
|
||||||
|
evm.v[2] += v[2];
|
||||||
|
evm.v[3] += v[3];
|
||||||
|
evm.v[4] += v[4];
|
||||||
|
evm.v[5] += v[5];
|
||||||
|
} else {
|
||||||
|
if (i1 < nlocal) {
|
||||||
|
evm.v[0] += 0.25*v[0];
|
||||||
|
evm.v[1] += 0.25*v[1];
|
||||||
|
evm.v[2] += 0.25*v[2];
|
||||||
|
evm.v[3] += 0.25*v[3];
|
||||||
|
evm.v[4] += 0.25*v[4];
|
||||||
|
evm.v[5] += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (i2 < nlocal) {
|
||||||
|
evm.v[0] += 0.25*v[0];
|
||||||
|
evm.v[1] += 0.25*v[1];
|
||||||
|
evm.v[2] += 0.25*v[2];
|
||||||
|
evm.v[3] += 0.25*v[3];
|
||||||
|
evm.v[4] += 0.25*v[4];
|
||||||
|
evm.v[5] += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (i3 < nlocal) {
|
||||||
|
evm.v[0] += 0.25*v[0];
|
||||||
|
evm.v[1] += 0.25*v[1];
|
||||||
|
evm.v[2] += 0.25*v[2];
|
||||||
|
evm.v[3] += 0.25*v[3];
|
||||||
|
evm.v[4] += 0.25*v[4];
|
||||||
|
evm.v[5] += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (i4 < nlocal) {
|
||||||
|
evm.v[0] += 0.25*v[0];
|
||||||
|
evm.v[1] += 0.25*v[1];
|
||||||
|
evm.v[2] += 0.25*v[2];
|
||||||
|
evm.v[3] += 0.25*v[3];
|
||||||
|
evm.v[4] += 0.25*v[4];
|
||||||
|
evm.v[5] += 0.25*v[5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_atom) {
|
||||||
|
if (newton_bond || i1 < nlocal) {
|
||||||
|
d_vatom(i1,0) += 0.25*v[0];
|
||||||
|
d_vatom(i1,1) += 0.25*v[1];
|
||||||
|
d_vatom(i1,2) += 0.25*v[2];
|
||||||
|
d_vatom(i1,3) += 0.25*v[3];
|
||||||
|
d_vatom(i1,4) += 0.25*v[4];
|
||||||
|
d_vatom(i1,5) += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (newton_bond || i2 < nlocal) {
|
||||||
|
d_vatom(i2,0) += 0.25*v[0];
|
||||||
|
d_vatom(i2,1) += 0.25*v[1];
|
||||||
|
d_vatom(i2,2) += 0.25*v[2];
|
||||||
|
d_vatom(i2,3) += 0.25*v[3];
|
||||||
|
d_vatom(i2,4) += 0.25*v[4];
|
||||||
|
d_vatom(i2,5) += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (newton_bond || i3 < nlocal) {
|
||||||
|
d_vatom(i3,0) += 0.25*v[0];
|
||||||
|
d_vatom(i3,1) += 0.25*v[1];
|
||||||
|
d_vatom(i3,2) += 0.25*v[2];
|
||||||
|
d_vatom(i3,3) += 0.25*v[3];
|
||||||
|
d_vatom(i3,4) += 0.25*v[4];
|
||||||
|
d_vatom(i3,5) += 0.25*v[5];
|
||||||
|
}
|
||||||
|
if (newton_bond || i4 < nlocal) {
|
||||||
|
d_vatom(i4,0) += 0.25*v[0];
|
||||||
|
d_vatom(i4,1) += 0.25*v[1];
|
||||||
|
d_vatom(i4,2) += 0.25*v[2];
|
||||||
|
d_vatom(i4,3) += 0.25*v[3];
|
||||||
|
d_vatom(i4,4) += 0.25*v[4];
|
||||||
|
d_vatom(i4,5) += 0.25*v[5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
tally eng_vdwl and virial into global and per-atom accumulators
|
||||||
|
need i < nlocal test since called by bond_quartic and dihedral_charmm
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void DihedralCharmmfswKokkos<DeviceType>::ev_tally(EVM_FLOAT &evm, const int i, const int j,
|
||||||
|
const F_FLOAT &evdwl, const F_FLOAT &ecoul, const F_FLOAT &fpair, const F_FLOAT &delx,
|
||||||
|
const F_FLOAT &dely, const F_FLOAT &delz) const
|
||||||
|
{
|
||||||
|
E_FLOAT evdwlhalf,ecoulhalf,epairhalf;
|
||||||
|
F_FLOAT v[6];
|
||||||
|
|
||||||
|
|
||||||
|
if (eflag_either) {
|
||||||
|
if (eflag_global) {
|
||||||
|
if (newton_bond) {
|
||||||
|
evm.evdwl += evdwl;
|
||||||
|
evm.ecoul += ecoul;
|
||||||
|
} else {
|
||||||
|
evdwlhalf = 0.5*evdwl;
|
||||||
|
ecoulhalf = 0.5*ecoul;
|
||||||
|
if (i < nlocal) {
|
||||||
|
evm.evdwl += evdwlhalf;
|
||||||
|
evm.ecoul += ecoulhalf;
|
||||||
|
}
|
||||||
|
if (j < nlocal) {
|
||||||
|
evm.evdwl += evdwlhalf;
|
||||||
|
evm.ecoul += ecoulhalf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eflag_atom) {
|
||||||
|
epairhalf = 0.5 * (evdwl + ecoul);
|
||||||
|
if (newton_bond || i < nlocal) d_eatom_pair[i] += epairhalf;
|
||||||
|
if (newton_bond || j < nlocal) d_eatom_pair[j] += epairhalf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_either) {
|
||||||
|
v[0] = delx*delx*fpair;
|
||||||
|
v[1] = dely*dely*fpair;
|
||||||
|
v[2] = delz*delz*fpair;
|
||||||
|
v[3] = delx*dely*fpair;
|
||||||
|
v[4] = delx*delz*fpair;
|
||||||
|
v[5] = dely*delz*fpair;
|
||||||
|
|
||||||
|
if (vflag_global) {
|
||||||
|
if (newton_bond) {
|
||||||
|
evm.vp[0] += v[0];
|
||||||
|
evm.vp[1] += v[1];
|
||||||
|
evm.vp[2] += v[2];
|
||||||
|
evm.vp[3] += v[3];
|
||||||
|
evm.vp[4] += v[4];
|
||||||
|
evm.vp[5] += v[5];
|
||||||
|
} else {
|
||||||
|
if (i < nlocal) {
|
||||||
|
evm.vp[0] += 0.5*v[0];
|
||||||
|
evm.vp[1] += 0.5*v[1];
|
||||||
|
evm.vp[2] += 0.5*v[2];
|
||||||
|
evm.vp[3] += 0.5*v[3];
|
||||||
|
evm.vp[4] += 0.5*v[4];
|
||||||
|
evm.vp[5] += 0.5*v[5];
|
||||||
|
}
|
||||||
|
if (j < nlocal) {
|
||||||
|
evm.vp[0] += 0.5*v[0];
|
||||||
|
evm.vp[1] += 0.5*v[1];
|
||||||
|
evm.vp[2] += 0.5*v[2];
|
||||||
|
evm.vp[3] += 0.5*v[3];
|
||||||
|
evm.vp[4] += 0.5*v[4];
|
||||||
|
evm.vp[5] += 0.5*v[5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_atom) {
|
||||||
|
if (newton_bond || i < nlocal) {
|
||||||
|
d_vatom_pair(i,0) += 0.5*v[0];
|
||||||
|
d_vatom_pair(i,1) += 0.5*v[1];
|
||||||
|
d_vatom_pair(i,2) += 0.5*v[2];
|
||||||
|
d_vatom_pair(i,3) += 0.5*v[3];
|
||||||
|
d_vatom_pair(i,4) += 0.5*v[4];
|
||||||
|
d_vatom_pair(i,5) += 0.5*v[5];
|
||||||
|
}
|
||||||
|
if (newton_bond || j < nlocal) {
|
||||||
|
d_vatom_pair(j,0) += 0.5*v[0];
|
||||||
|
d_vatom_pair(j,1) += 0.5*v[1];
|
||||||
|
d_vatom_pair(j,2) += 0.5*v[2];
|
||||||
|
d_vatom_pair(j,3) += 0.5*v[3];
|
||||||
|
d_vatom_pair(j,4) += 0.5*v[4];
|
||||||
|
d_vatom_pair(j,5) += 0.5*v[5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
template class DihedralCharmmfswKokkos<LMPDeviceType>;
|
||||||
|
#ifdef LMP_KOKKOS_GPU
|
||||||
|
template class DihedralCharmmfswKokkos<LMPHostType>;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
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.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef DIHEDRAL_CLASS
|
||||||
|
// clang-format off
|
||||||
|
DihedralStyle(charmmfsw/kk,DihedralCharmmfswKokkos<LMPDeviceType>);
|
||||||
|
DihedralStyle(charmmfsw/kk/device,DihedralCharmmfswKokkos<LMPDeviceType>);
|
||||||
|
DihedralStyle(charmmfsw/kk/host,DihedralCharmmfswKokkos<LMPHostType>);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
#ifndef LMP_DIHEDRAL_CHARMMFSW_KOKKOS_H
|
||||||
|
#define LMP_DIHEDRAL_CHARMMFSW_KOKKOS_H
|
||||||
|
|
||||||
|
#include "dihedral_charmmfsw.h"
|
||||||
|
#include "kokkos_type.h"
|
||||||
|
#include "dihedral_charmm_kokkos.h" // needed for s_EVM_FLOAT
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
template<int NEWTON_BOND, int EVFLAG>
|
||||||
|
struct TagDihedralCharmmfswCompute{};
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
class DihedralCharmmfswKokkos : public DihedralCharmmfsw {
|
||||||
|
public:
|
||||||
|
typedef DeviceType device_type;
|
||||||
|
typedef EVM_FLOAT value_type;
|
||||||
|
typedef ArrayTypes<DeviceType> AT;
|
||||||
|
|
||||||
|
DihedralCharmmfswKokkos(class LAMMPS *);
|
||||||
|
~DihedralCharmmfswKokkos() override;
|
||||||
|
void compute(int, int) override;
|
||||||
|
void coeff(int, char **) override;
|
||||||
|
void init_style() override;
|
||||||
|
void read_restart(FILE *) override;
|
||||||
|
|
||||||
|
template<int NEWTON_BOND, int EVFLAG>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void operator()(TagDihedralCharmmfswCompute<NEWTON_BOND,EVFLAG>, const int&, EVM_FLOAT&) const;
|
||||||
|
|
||||||
|
template<int NEWTON_BOND, int EVFLAG>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void operator()(TagDihedralCharmmfswCompute<NEWTON_BOND,EVFLAG>, const int&) const;
|
||||||
|
|
||||||
|
//template<int NEWTON_BOND>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void ev_tally(EVM_FLOAT &evm, const int i1, const int i2, const int i3, const int i4,
|
||||||
|
F_FLOAT &edihedral, F_FLOAT *f1, F_FLOAT *f3, F_FLOAT *f4,
|
||||||
|
const F_FLOAT &vb1x, const F_FLOAT &vb1y, const F_FLOAT &vb1z,
|
||||||
|
const F_FLOAT &vb2x, const F_FLOAT &vb2y, const F_FLOAT &vb2z,
|
||||||
|
const F_FLOAT &vb3x, const F_FLOAT &vb3y, const F_FLOAT &vb3z) const;
|
||||||
|
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
void ev_tally(EVM_FLOAT &evm, const int i, const int j,
|
||||||
|
const F_FLOAT &evdwl, const F_FLOAT &ecoul, const F_FLOAT &fpair, const F_FLOAT &delx,
|
||||||
|
const F_FLOAT &dely, const F_FLOAT &delz) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
class NeighborKokkos *neighborKK;
|
||||||
|
|
||||||
|
typename AT::t_x_array_randomread x;
|
||||||
|
typename AT::t_int_1d_randomread atomtype;
|
||||||
|
typename AT::t_ffloat_1d_randomread q;
|
||||||
|
typename AT::t_f_array f;
|
||||||
|
typename AT::t_int_2d dihedrallist;
|
||||||
|
|
||||||
|
typedef typename KKDevice<DeviceType>::value KKDeviceType;
|
||||||
|
Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType> k_eatom;
|
||||||
|
Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType> k_vatom;
|
||||||
|
Kokkos::View<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > d_eatom;
|
||||||
|
Kokkos::View<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > d_vatom;
|
||||||
|
|
||||||
|
Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType> k_eatom_pair;
|
||||||
|
Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType> k_vatom_pair;
|
||||||
|
Kokkos::View<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > d_eatom_pair;
|
||||||
|
Kokkos::View<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > d_vatom_pair;
|
||||||
|
|
||||||
|
int nlocal,newton_bond;
|
||||||
|
int eflag,vflag;
|
||||||
|
double qqrd2e;
|
||||||
|
|
||||||
|
Kokkos::DualView<int,DeviceType> k_warning_flag;
|
||||||
|
typename Kokkos::DualView<int,DeviceType>::t_dev d_warning_flag;
|
||||||
|
typename Kokkos::DualView<int,DeviceType>::t_host h_warning_flag;
|
||||||
|
|
||||||
|
typename AT::t_ffloat_2d d_lj14_1;
|
||||||
|
typename AT::t_ffloat_2d d_lj14_2;
|
||||||
|
typename AT::t_ffloat_2d d_lj14_3;
|
||||||
|
typename AT::t_ffloat_2d d_lj14_4;
|
||||||
|
|
||||||
|
typename AT::t_ffloat_1d d_k;
|
||||||
|
typename AT::t_ffloat_1d d_multiplicity;
|
||||||
|
typename AT::t_ffloat_1d d_shift;
|
||||||
|
typename AT::t_ffloat_1d d_sin_shift;
|
||||||
|
typename AT::t_ffloat_1d d_cos_shift;
|
||||||
|
typename AT::t_ffloat_1d d_weight;
|
||||||
|
|
||||||
|
void allocate() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -627,7 +627,7 @@ struct PairComputeFunctor {
|
||||||
const int itype = c.type(i);
|
const int itype = c.type(i);
|
||||||
const F_FLOAT qtmp = c.q(i);
|
const F_FLOAT qtmp = c.q(i);
|
||||||
|
|
||||||
if (ZEROFLAG) {
|
if (NEIGHFLAG == FULL && ZEROFLAG) {
|
||||||
Kokkos::single(Kokkos::PerThread(team), [&] (){
|
Kokkos::single(Kokkos::PerThread(team), [&] (){
|
||||||
f(i,0) = 0.0;
|
f(i,0) = 0.0;
|
||||||
f(i,1) = 0.0;
|
f(i,1) = 0.0;
|
||||||
|
@ -674,7 +674,7 @@ struct PairComputeFunctor {
|
||||||
const int J_CONTRIB = ((NEIGHFLAG == HALF || NEIGHFLAG == HALFTHREAD) && j < c.nlocal);
|
const int J_CONTRIB = ((NEIGHFLAG == HALF || NEIGHFLAG == HALFTHREAD) && j < c.nlocal);
|
||||||
const E_FLOAT factor = J_CONTRIB?1.0:0.5;
|
const E_FLOAT factor = J_CONTRIB?1.0:0.5;
|
||||||
|
|
||||||
if ((NEIGHFLAG == HALF || NEIGHFLAG == HALFTHREAD) && j < c.nlocal) {
|
if (J_CONTRIB) {
|
||||||
a_f(j,0) -= fx;
|
a_f(j,0) -= fx;
|
||||||
a_f(j,1) -= fy;
|
a_f(j,1) -= fy;
|
||||||
a_f(j,2) -= fz;
|
a_f(j,2) -= fz;
|
||||||
|
@ -746,8 +746,10 @@ struct PairComputeFunctor {
|
||||||
a_f(i,1) += fev.f[1];
|
a_f(i,1) += fev.f[1];
|
||||||
a_f(i,2) += fev.f[2];
|
a_f(i,2) += fev.f[2];
|
||||||
|
|
||||||
if (c.eflag_global)
|
if (c.eflag_global) {
|
||||||
ev.evdwl += fev.evdwl;
|
ev.evdwl += fev.evdwl;
|
||||||
|
ev.ecoul += fev.ecoul;
|
||||||
|
}
|
||||||
|
|
||||||
if (c.vflag_global) {
|
if (c.vflag_global) {
|
||||||
ev.v[0] += fev.v[0];
|
ev.v[0] += fev.v[0];
|
||||||
|
@ -761,7 +763,7 @@ struct PairComputeFunctor {
|
||||||
if (NEIGHFLAG == FULL) {
|
if (NEIGHFLAG == FULL) {
|
||||||
|
|
||||||
if (c.eflag_atom)
|
if (c.eflag_atom)
|
||||||
a_eatom(i) += fev.evdwl;
|
a_eatom(i) += fev.evdwl + fev.ecoul;
|
||||||
|
|
||||||
if (c.vflag_atom) {
|
if (c.vflag_atom) {
|
||||||
a_vatom(i,0) += fev.v[0];
|
a_vatom(i,0) += fev.v[0];
|
||||||
|
|
|
@ -214,9 +214,7 @@ compute_evdwl(const F_FLOAT& rsq, const int& /*i*/, const int& /*j*/,
|
||||||
(cut_ljsq + 2.0*rsq - 3.0*cut_lj_innersq) / denom_lj;
|
(cut_ljsq + 2.0*rsq - 3.0*cut_lj_innersq) / denom_lj;
|
||||||
englj *= switch1;
|
englj *= switch1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return englj;
|
return englj;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
@ -488,4 +486,3 @@ template class PairLJCharmmCoulLongKokkos<LMPDeviceType>;
|
||||||
template class PairLJCharmmCoulLongKokkos<LMPHostType>;
|
template class PairLJCharmmCoulLongKokkos<LMPHostType>;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,497 @@
|
||||||
|
// clang-format off
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
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: Mitch Murphy (alphataubio)
|
||||||
|
|
||||||
|
Based on serial kspace lj-fsw sections (force-switched) provided by
|
||||||
|
Robert Meissner and Lucio Colombi Ciacchi of Bremen University, Germany,
|
||||||
|
with additional assistance from Robert A. Latour, Clemson University
|
||||||
|
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "pair_lj_charmmfsw_coul_long_kokkos.h"
|
||||||
|
|
||||||
|
#include "atom_kokkos.h"
|
||||||
|
#include "atom_masks.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "force.h"
|
||||||
|
#include "kokkos.h"
|
||||||
|
#include "memory_kokkos.h"
|
||||||
|
#include "neigh_list.h"
|
||||||
|
#include "neigh_request.h"
|
||||||
|
#include "neighbor.h"
|
||||||
|
#include "respa.h"
|
||||||
|
#include "update.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
|
||||||
|
#define EWALD_F 1.12837917
|
||||||
|
#define EWALD_P 0.3275911
|
||||||
|
#define A1 0.254829592
|
||||||
|
#define A2 -0.284496736
|
||||||
|
#define A3 1.421413741
|
||||||
|
#define A4 -1.453152027
|
||||||
|
#define A5 1.061405429
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
PairLJCharmmfswCoulLongKokkos<DeviceType>::PairLJCharmmfswCoulLongKokkos(LAMMPS *lmp):PairLJCharmmfswCoulLong(lmp)
|
||||||
|
{
|
||||||
|
respa_enable = 0;
|
||||||
|
|
||||||
|
kokkosable = 1;
|
||||||
|
atomKK = (AtomKokkos *) atom;
|
||||||
|
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
|
||||||
|
datamask_read = X_MASK | F_MASK | TYPE_MASK | Q_MASK | ENERGY_MASK | VIRIAL_MASK;
|
||||||
|
datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
PairLJCharmmfswCoulLongKokkos<DeviceType>::~PairLJCharmmfswCoulLongKokkos()
|
||||||
|
{
|
||||||
|
if (copymode) return;
|
||||||
|
|
||||||
|
if (allocated) {
|
||||||
|
memoryKK->destroy_kokkos(k_eatom,eatom);
|
||||||
|
memoryKK->destroy_kokkos(k_vatom,vatom);
|
||||||
|
memoryKK->destroy_kokkos(k_cutsq,cutsq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void PairLJCharmmfswCoulLongKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
|
||||||
|
{
|
||||||
|
eflag = eflag_in;
|
||||||
|
vflag = vflag_in;
|
||||||
|
|
||||||
|
if (neighflag == FULL) no_virial_fdotr_compute = 1;
|
||||||
|
|
||||||
|
ev_init(eflag,vflag,0);
|
||||||
|
|
||||||
|
// reallocate per-atom arrays if necessary
|
||||||
|
|
||||||
|
if (eflag_atom) {
|
||||||
|
memoryKK->destroy_kokkos(k_eatom,eatom);
|
||||||
|
memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
|
||||||
|
d_eatom = k_eatom.view<DeviceType>();
|
||||||
|
}
|
||||||
|
if (vflag_atom) {
|
||||||
|
memoryKK->destroy_kokkos(k_vatom,vatom);
|
||||||
|
memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom");
|
||||||
|
d_vatom = k_vatom.view<DeviceType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
atomKK->sync(execution_space,datamask_read);
|
||||||
|
k_cutsq.template sync<DeviceType>();
|
||||||
|
k_params.template sync<DeviceType>();
|
||||||
|
if (eflag || vflag) atomKK->modified(execution_space,datamask_modify);
|
||||||
|
else atomKK->modified(execution_space,F_MASK);
|
||||||
|
|
||||||
|
x = atomKK->k_x.view<DeviceType>();
|
||||||
|
c_x = atomKK->k_x.view<DeviceType>();
|
||||||
|
f = atomKK->k_f.view<DeviceType>();
|
||||||
|
q = atomKK->k_q.view<DeviceType>();
|
||||||
|
type = atomKK->k_type.view<DeviceType>();
|
||||||
|
nlocal = atom->nlocal;
|
||||||
|
nall = atom->nlocal + atom->nghost;
|
||||||
|
special_lj[0] = force->special_lj[0];
|
||||||
|
special_lj[1] = force->special_lj[1];
|
||||||
|
special_lj[2] = force->special_lj[2];
|
||||||
|
special_lj[3] = force->special_lj[3];
|
||||||
|
special_coul[0] = force->special_coul[0];
|
||||||
|
special_coul[1] = force->special_coul[1];
|
||||||
|
special_coul[2] = force->special_coul[2];
|
||||||
|
special_coul[3] = force->special_coul[3];
|
||||||
|
qqrd2e = force->qqrd2e;
|
||||||
|
newton_pair = force->newton_pair;
|
||||||
|
|
||||||
|
// loop over neighbors of my atoms
|
||||||
|
|
||||||
|
copymode = 1;
|
||||||
|
|
||||||
|
EV_FLOAT ev;
|
||||||
|
if (ncoultablebits)
|
||||||
|
ev = pair_compute<PairLJCharmmfswCoulLongKokkos<DeviceType>,CoulLongTable<1> >
|
||||||
|
(this,(NeighListKokkos<DeviceType>*)list);
|
||||||
|
else
|
||||||
|
ev = pair_compute<PairLJCharmmfswCoulLongKokkos<DeviceType>,CoulLongTable<0> >
|
||||||
|
(this,(NeighListKokkos<DeviceType>*)list);
|
||||||
|
|
||||||
|
|
||||||
|
if (eflag) {
|
||||||
|
eng_vdwl += ev.evdwl;
|
||||||
|
eng_coul += ev.ecoul;
|
||||||
|
}
|
||||||
|
if (vflag_global) {
|
||||||
|
virial[0] += ev.v[0];
|
||||||
|
virial[1] += ev.v[1];
|
||||||
|
virial[2] += ev.v[2];
|
||||||
|
virial[3] += ev.v[3];
|
||||||
|
virial[4] += ev.v[4];
|
||||||
|
virial[5] += ev.v[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eflag_atom) {
|
||||||
|
k_eatom.template modify<DeviceType>();
|
||||||
|
k_eatom.template sync<LMPHostType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_atom) {
|
||||||
|
k_vatom.template modify<DeviceType>();
|
||||||
|
k_vatom.template sync<LMPHostType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vflag_fdotr) pair_virial_fdotr_compute(this);
|
||||||
|
|
||||||
|
copymode = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
compute LJ CHARMM pair force between atoms i and j
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
template<class DeviceType>
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT PairLJCharmmfswCoulLongKokkos<DeviceType>::
|
||||||
|
compute_fpair(const F_FLOAT& rsq, const int& /*i*/, const int& /*j*/,
|
||||||
|
const int& itype, const int& jtype) const {
|
||||||
|
const F_FLOAT r2inv = 1.0/rsq;
|
||||||
|
const F_FLOAT r6inv = r2inv*r2inv*r2inv;
|
||||||
|
F_FLOAT forcelj, switch1;
|
||||||
|
|
||||||
|
forcelj = r6inv *
|
||||||
|
((STACKPARAMS?m_params[itype][jtype].lj1:params(itype,jtype).lj1)*r6inv -
|
||||||
|
(STACKPARAMS?m_params[itype][jtype].lj2:params(itype,jtype).lj2));
|
||||||
|
|
||||||
|
if (rsq > cut_lj_innersq) {
|
||||||
|
switch1 = (cut_ljsq-rsq) * (cut_ljsq-rsq) *
|
||||||
|
(cut_ljsq + 2.0*rsq - 3.0*cut_lj_innersq) / denom_lj;
|
||||||
|
forcelj = forcelj*switch1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return forcelj*r2inv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
compute LJ CHARMM pair potential energy between atoms i and j
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
template<class DeviceType>
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT PairLJCharmmfswCoulLongKokkos<DeviceType>::
|
||||||
|
compute_evdwl(const F_FLOAT& rsq, const int& /*i*/, const int& /*j*/,
|
||||||
|
const int& itype, const int& jtype) const {
|
||||||
|
const F_FLOAT r2inv = 1.0/rsq;
|
||||||
|
const F_FLOAT r6inv = r2inv*r2inv*r2inv;
|
||||||
|
const F_FLOAT r = sqrt(rsq);
|
||||||
|
const F_FLOAT rinv = 1.0/r;
|
||||||
|
const F_FLOAT r3inv = rinv*rinv*rinv;
|
||||||
|
F_FLOAT englj, englj12, englj6;
|
||||||
|
|
||||||
|
if (rsq > cut_lj_innersq) {
|
||||||
|
englj12 = (STACKPARAMS?m_params[itype][jtype].lj3:params(itype,jtype).lj3)*cut_lj6*
|
||||||
|
denom_lj12 * (r6inv - cut_lj6inv)*(r6inv - cut_lj6inv);
|
||||||
|
englj6 = -(STACKPARAMS?m_params[itype][jtype].lj4:params(itype,jtype).lj4)*
|
||||||
|
cut_lj3*denom_lj6 * (r3inv - cut_lj3inv)*(r3inv - cut_lj3inv);
|
||||||
|
englj = englj12 + englj6;
|
||||||
|
} else {
|
||||||
|
englj12 = r6inv*(STACKPARAMS?m_params[itype][jtype].lj3:params(itype,jtype).lj3)*r6inv -
|
||||||
|
(STACKPARAMS?m_params[itype][jtype].lj3:params(itype,jtype).lj3)*cut_lj_inner6inv*cut_lj6inv;
|
||||||
|
englj6 = -(STACKPARAMS?m_params[itype][jtype].lj4:params(itype,jtype).lj4)*r6inv +
|
||||||
|
(STACKPARAMS?m_params[itype][jtype].lj4:params(itype,jtype).lj4)*
|
||||||
|
cut_lj_inner3inv*cut_lj3inv;
|
||||||
|
englj = englj12 + englj6;
|
||||||
|
}
|
||||||
|
return englj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
compute coulomb pair force between atoms i and j
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
template<class DeviceType>
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT PairLJCharmmfswCoulLongKokkos<DeviceType>::
|
||||||
|
compute_fcoul(const F_FLOAT& rsq, const int& /*i*/, const int&j,
|
||||||
|
const int& /*itype*/, const int& /*jtype*/,
|
||||||
|
const F_FLOAT& factor_coul, const F_FLOAT& qtmp) const {
|
||||||
|
if (Specialisation::DoTable && rsq > tabinnersq) {
|
||||||
|
union_int_float_t rsq_lookup;
|
||||||
|
rsq_lookup.f = rsq;
|
||||||
|
const int itable = (rsq_lookup.i & ncoulmask) >> ncoulshiftbits;
|
||||||
|
const F_FLOAT fraction = (rsq_lookup.f - d_rtable[itable]) * d_drtable[itable];
|
||||||
|
const F_FLOAT table = d_ftable[itable] + fraction*d_dftable[itable];
|
||||||
|
F_FLOAT forcecoul = qtmp*q[j] * table;
|
||||||
|
if (factor_coul < 1.0) {
|
||||||
|
const F_FLOAT table = d_ctable[itable] + fraction*d_dctable[itable];
|
||||||
|
const F_FLOAT prefactor = qtmp*q[j] * table;
|
||||||
|
forcecoul -= (1.0-factor_coul)*prefactor;
|
||||||
|
}
|
||||||
|
return forcecoul/rsq;
|
||||||
|
} else {
|
||||||
|
const F_FLOAT r = sqrt(rsq);
|
||||||
|
const F_FLOAT grij = g_ewald * r;
|
||||||
|
const F_FLOAT expm2 = exp(-grij*grij);
|
||||||
|
const F_FLOAT t = 1.0 / (1.0 + EWALD_P*grij);
|
||||||
|
const F_FLOAT rinv = 1.0/r;
|
||||||
|
const F_FLOAT erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
|
||||||
|
const F_FLOAT prefactor = qqrd2e * qtmp*q[j]*rinv;
|
||||||
|
F_FLOAT forcecoul = prefactor * (erfc + EWALD_F*grij*expm2);
|
||||||
|
if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor;
|
||||||
|
|
||||||
|
return forcecoul*rinv*rinv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
compute coulomb pair potential energy between atoms i and j
|
||||||
|
---------------------------------------------------------------------- */
|
||||||
|
template<class DeviceType>
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT PairLJCharmmfswCoulLongKokkos<DeviceType>::
|
||||||
|
compute_ecoul(const F_FLOAT& rsq, const int& /*i*/, const int&j,
|
||||||
|
const int& /*itype*/, const int& /*jtype*/, const F_FLOAT& factor_coul, const F_FLOAT& qtmp) const {
|
||||||
|
if (Specialisation::DoTable && rsq > tabinnersq) {
|
||||||
|
union_int_float_t rsq_lookup;
|
||||||
|
rsq_lookup.f = rsq;
|
||||||
|
const int itable = (rsq_lookup.i & ncoulmask) >> ncoulshiftbits;
|
||||||
|
const F_FLOAT fraction = (rsq_lookup.f - d_rtable[itable]) * d_drtable[itable];
|
||||||
|
const F_FLOAT table = d_etable[itable] + fraction*d_detable[itable];
|
||||||
|
F_FLOAT ecoul = qtmp*q[j] * table;
|
||||||
|
if (factor_coul < 1.0) {
|
||||||
|
const F_FLOAT table = d_ctable[itable] + fraction*d_dctable[itable];
|
||||||
|
const F_FLOAT prefactor = qtmp*q[j] * table;
|
||||||
|
ecoul -= (1.0-factor_coul)*prefactor;
|
||||||
|
}
|
||||||
|
return ecoul;
|
||||||
|
} else {
|
||||||
|
const F_FLOAT r = sqrt(rsq);
|
||||||
|
const F_FLOAT grij = g_ewald * r;
|
||||||
|
const F_FLOAT expm2 = exp(-grij*grij);
|
||||||
|
const F_FLOAT t = 1.0 / (1.0 + EWALD_P*grij);
|
||||||
|
const F_FLOAT erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
|
||||||
|
const F_FLOAT prefactor = qqrd2e * qtmp*q[j]/r;
|
||||||
|
F_FLOAT ecoul = prefactor * erfc;
|
||||||
|
if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor;
|
||||||
|
return ecoul;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
allocate all arrays
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void PairLJCharmmfswCoulLongKokkos<DeviceType>::allocate()
|
||||||
|
{
|
||||||
|
PairLJCharmmfswCoulLong::allocate();
|
||||||
|
|
||||||
|
int n = atom->ntypes;
|
||||||
|
|
||||||
|
memory->destroy(cutsq);
|
||||||
|
memoryKK->create_kokkos(k_cutsq,cutsq,n+1,n+1,"pair:cutsq");
|
||||||
|
d_cutsq = k_cutsq.template view<DeviceType>();
|
||||||
|
|
||||||
|
d_cut_ljsq = typename AT::t_ffloat_2d("pair:cut_ljsq",n+1,n+1);
|
||||||
|
|
||||||
|
d_cut_coulsq = typename AT::t_ffloat_2d("pair:cut_coulsq",n+1,n+1);
|
||||||
|
|
||||||
|
k_params = Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType>("PairLJCharmmfswCoulLong::params",n+1,n+1);
|
||||||
|
params = k_params.template view<DeviceType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void PairLJCharmmfswCoulLongKokkos<DeviceType>::init_tables(double cut_coul, double *cut_respa)
|
||||||
|
{
|
||||||
|
Pair::init_tables(cut_coul,cut_respa);
|
||||||
|
|
||||||
|
typedef typename ArrayTypes<DeviceType>::t_ffloat_1d table_type;
|
||||||
|
typedef typename ArrayTypes<LMPHostType>::t_ffloat_1d host_table_type;
|
||||||
|
|
||||||
|
int ntable = 1;
|
||||||
|
for (int i = 0; i < ncoultablebits; i++) ntable *= 2;
|
||||||
|
|
||||||
|
|
||||||
|
// Copy rtable and drtable
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = rtable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_rtable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = drtable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_drtable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
// Copy ftable and dftable
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = ftable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_ftable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = dftable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_dftable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
// Copy ctable and dctable
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = ctable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_ctable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = dctable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_dctable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
// Copy etable and detable
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = etable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_etable = d_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
host_table_type h_table("HostTable",ntable);
|
||||||
|
table_type d_table("DeviceTable",ntable);
|
||||||
|
|
||||||
|
for (int i = 0; i < ntable; i++) {
|
||||||
|
h_table(i) = detable[i];
|
||||||
|
}
|
||||||
|
Kokkos::deep_copy(d_table,h_table);
|
||||||
|
d_detable = d_table;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
init specific to this pair style
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
void PairLJCharmmfswCoulLongKokkos<DeviceType>::init_style()
|
||||||
|
{
|
||||||
|
PairLJCharmmfswCoulLong::init_style();
|
||||||
|
|
||||||
|
Kokkos::deep_copy(d_cut_ljsq,cut_ljsq);
|
||||||
|
Kokkos::deep_copy(d_cut_coulsq,cut_coulsq);
|
||||||
|
|
||||||
|
// error if rRESPA with inner levels
|
||||||
|
|
||||||
|
if (update->whichflag == 1 && utils::strmatch(update->integrate_style,"^respa")) {
|
||||||
|
int respa = 0;
|
||||||
|
if (((Respa *) update->integrate)->level_inner >= 0) respa = 1;
|
||||||
|
if (((Respa *) update->integrate)->level_middle >= 0) respa = 2;
|
||||||
|
if (respa)
|
||||||
|
error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle");
|
||||||
|
}
|
||||||
|
|
||||||
|
// adjust neighbor list request for KOKKOS
|
||||||
|
|
||||||
|
neighflag = lmp->kokkos->neighflag;
|
||||||
|
auto request = neighbor->find_request(this);
|
||||||
|
request->set_kokkos_host(std::is_same_v<DeviceType,LMPHostType> &&
|
||||||
|
!std::is_same_v<DeviceType,LMPDeviceType>);
|
||||||
|
request->set_kokkos_device(std::is_same_v<DeviceType,LMPDeviceType>);
|
||||||
|
if (neighflag == FULL) request->enable_full();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
init for one type pair i,j and corresponding j,i
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
double PairLJCharmmfswCoulLongKokkos<DeviceType>::init_one(int i, int j)
|
||||||
|
{
|
||||||
|
double cutone = PairLJCharmmfswCoulLong::init_one(i,j);
|
||||||
|
|
||||||
|
k_params.h_view(i,j).lj1 = lj1[i][j];
|
||||||
|
k_params.h_view(i,j).lj2 = lj2[i][j];
|
||||||
|
k_params.h_view(i,j).lj3 = lj3[i][j];
|
||||||
|
k_params.h_view(i,j).lj4 = lj4[i][j];
|
||||||
|
//k_params.h_view(i,j).offset = offset[i][j];
|
||||||
|
k_params.h_view(i,j).cut_ljsq = cut_ljsq;
|
||||||
|
k_params.h_view(i,j).cut_coulsq = cut_coulsq;
|
||||||
|
|
||||||
|
k_params.h_view(j,i) = k_params.h_view(i,j);
|
||||||
|
if (i<MAX_TYPES_STACKPARAMS+1 && j<MAX_TYPES_STACKPARAMS+1) {
|
||||||
|
m_params[i][j] = m_params[j][i] = k_params.h_view(i,j);
|
||||||
|
m_cutsq[j][i] = m_cutsq[i][j] = cutone*cutone;
|
||||||
|
m_cut_ljsq[j][i] = m_cut_ljsq[i][j] = cut_ljsq;
|
||||||
|
m_cut_coulsq[j][i] = m_cut_coulsq[i][j] = cut_coulsq;
|
||||||
|
}
|
||||||
|
|
||||||
|
k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone;
|
||||||
|
k_cutsq.template modify<LMPHostType>();
|
||||||
|
k_params.template modify<LMPHostType>();
|
||||||
|
|
||||||
|
return cutone;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
template class PairLJCharmmfswCoulLongKokkos<LMPDeviceType>;
|
||||||
|
#ifdef LMP_KOKKOS_GPU
|
||||||
|
template class PairLJCharmmfswCoulLongKokkos<LMPHostType>;
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
/* -*- c++ -*- ----------------------------------------------------------
|
||||||
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||||
|
https://www.lammps.org/, Sandia National Laboratories
|
||||||
|
LAMMPS development team: developers@lammps.org
|
||||||
|
|
||||||
|
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.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef PAIR_CLASS
|
||||||
|
// clang-format off
|
||||||
|
PairStyle(lj/charmmfsw/coul/long/kk,PairLJCharmmfswCoulLongKokkos<LMPDeviceType>);
|
||||||
|
PairStyle(lj/charmmfsw/coul/long/kk/device,PairLJCharmmfswCoulLongKokkos<LMPDeviceType>);
|
||||||
|
PairStyle(lj/charmmfsw/coul/long/kk/host,PairLJCharmmfswCoulLongKokkos<LMPHostType>);
|
||||||
|
// clang-format on
|
||||||
|
#else
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
#ifndef LMP_PAIR_LJ_CHARMMFSW_COUL_LONG_KOKKOS_H
|
||||||
|
#define LMP_PAIR_LJ_CHARMMFSW_COUL_LONG_KOKKOS_H
|
||||||
|
|
||||||
|
#include "pair_kokkos.h"
|
||||||
|
#include "pair_lj_charmmfsw_coul_long.h"
|
||||||
|
#include "neigh_list_kokkos.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
template<class DeviceType>
|
||||||
|
class PairLJCharmmfswCoulLongKokkos : public PairLJCharmmfswCoulLong {
|
||||||
|
public:
|
||||||
|
enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
|
||||||
|
enum {COUL_FLAG=1};
|
||||||
|
typedef DeviceType device_type;
|
||||||
|
typedef ArrayTypes<DeviceType> AT;
|
||||||
|
PairLJCharmmfswCoulLongKokkos(class LAMMPS *);
|
||||||
|
~PairLJCharmmfswCoulLongKokkos() override;
|
||||||
|
|
||||||
|
void compute(int, int) override;
|
||||||
|
|
||||||
|
void init_tables(double cut_coul, double *cut_respa) override;
|
||||||
|
void init_style() override;
|
||||||
|
double init_one(int, int) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j,
|
||||||
|
const int& itype, const int& jtype) const;
|
||||||
|
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT compute_fcoul(const F_FLOAT& rsq, const int& i, const int&j, const int& itype,
|
||||||
|
const int& jtype, const F_FLOAT& factor_coul, const F_FLOAT& qtmp) const;
|
||||||
|
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j,
|
||||||
|
const int& itype, const int& jtype) const;
|
||||||
|
|
||||||
|
template<bool STACKPARAMS, class Specialisation>
|
||||||
|
KOKKOS_INLINE_FUNCTION
|
||||||
|
F_FLOAT compute_ecoul(const F_FLOAT& rsq, const int& i, const int&j,
|
||||||
|
const int& itype, const int& jtype, const F_FLOAT& factor_coul, const F_FLOAT& qtmp) const;
|
||||||
|
|
||||||
|
Kokkos::DualView<params_lj_coul**,Kokkos::LayoutRight,DeviceType> k_params;
|
||||||
|
typename Kokkos::DualView<params_lj_coul**,
|
||||||
|
Kokkos::LayoutRight,DeviceType>::t_dev_const_um params;
|
||||||
|
// hardwired to space for 12 atom types
|
||||||
|
params_lj_coul m_params[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
|
||||||
|
|
||||||
|
F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
|
||||||
|
F_FLOAT m_cut_ljsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
|
||||||
|
F_FLOAT m_cut_coulsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
|
||||||
|
typename AT::t_x_array_randomread x;
|
||||||
|
typename AT::t_x_array c_x;
|
||||||
|
typename AT::t_f_array f;
|
||||||
|
typename AT::t_int_1d_randomread type;
|
||||||
|
typename AT::t_float_1d_randomread q;
|
||||||
|
|
||||||
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
|
DAT::tdual_virial_array k_vatom;
|
||||||
|
typename AT::t_efloat_1d d_eatom;
|
||||||
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
|
int newton_pair;
|
||||||
|
|
||||||
|
typename AT::tdual_ffloat_2d k_cutsq;
|
||||||
|
typename AT::t_ffloat_2d d_cutsq;
|
||||||
|
typename AT::t_ffloat_2d d_cut_ljsq;
|
||||||
|
typename AT::t_ffloat_2d d_cut_coulsq;
|
||||||
|
|
||||||
|
typename AT::t_ffloat_1d_randomread
|
||||||
|
d_rtable, d_drtable, d_ftable, d_dftable,
|
||||||
|
d_ctable, d_dctable, d_etable, d_detable;
|
||||||
|
|
||||||
|
int neighflag;
|
||||||
|
int nlocal,nall,eflag,vflag;
|
||||||
|
|
||||||
|
double special_coul[4];
|
||||||
|
double special_lj[4];
|
||||||
|
double qqrd2e;
|
||||||
|
|
||||||
|
void allocate() override;
|
||||||
|
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,true,0,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,true,1,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALF,true,0,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,true,0,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,false,0,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,false,1,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALF,false,0,CoulLongTable<1>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,false,0,CoulLongTable<1>>;
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,FULL,0,CoulLongTable<1>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,FULL,1,CoulLongTable<1>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,HALF,0,CoulLongTable<1>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,0,CoulLongTable<1>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute<PairLJCharmmfswCoulLongKokkos,CoulLongTable<1>>(PairLJCharmmfswCoulLongKokkos*,
|
||||||
|
NeighListKokkos<DeviceType>*);
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,true,0,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,true,1,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALF,true,0,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,true,0,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,false,0,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,FULL,false,1,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALF,false,0,CoulLongTable<0>>;
|
||||||
|
friend struct PairComputeFunctor<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,false,0,CoulLongTable<0>>;
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,FULL,0,CoulLongTable<0>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,FULL,1,CoulLongTable<0>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,HALF,0,CoulLongTable<0>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute_neighlist<PairLJCharmmfswCoulLongKokkos,HALFTHREAD,0,CoulLongTable<0>>(PairLJCharmmfswCoulLongKokkos*,NeighListKokkos<DeviceType>*);
|
||||||
|
friend EV_FLOAT pair_compute<PairLJCharmmfswCoulLongKokkos,CoulLongTable<0>>(PairLJCharmmfswCoulLongKokkos*,
|
||||||
|
NeighListKokkos<DeviceType>*);
|
||||||
|
friend void pair_virial_fdotr_compute<PairLJCharmmfswCoulLongKokkos>(PairLJCharmmfswCoulLongKokkos*);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -76,6 +76,8 @@ PairLJCharmmfswCoulLong::PairLJCharmmfswCoulLong(LAMMPS *lmp) : Pair(lmp)
|
||||||
|
|
||||||
PairLJCharmmfswCoulLong::~PairLJCharmmfswCoulLong()
|
PairLJCharmmfswCoulLong::~PairLJCharmmfswCoulLong()
|
||||||
{
|
{
|
||||||
|
if (copymode) return;
|
||||||
|
|
||||||
// switch qqr2e back from CHARMM value to LAMMPS value
|
// switch qqr2e back from CHARMM value to LAMMPS value
|
||||||
|
|
||||||
if (update && strcmp(update->unit_style,"real") == 0) {
|
if (update && strcmp(update->unit_style,"real") == 0) {
|
||||||
|
@ -85,8 +87,6 @@ PairLJCharmmfswCoulLong::~PairLJCharmmfswCoulLong()
|
||||||
force->qqr2e = force->qqr2e_lammps_real;
|
force->qqr2e = force->qqr2e_lammps_real;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copymode) return;
|
|
||||||
|
|
||||||
if (allocated) {
|
if (allocated) {
|
||||||
memory->destroy(setflag);
|
memory->destroy(setflag);
|
||||||
memory->destroy(cutsq);
|
memory->destroy(cutsq);
|
||||||
|
|
Loading…
Reference in New Issue