diff --git a/src/USER-CG-CMM/Install.sh b/src/USER-CG-CMM/Install.sh index 1562a9896..ac4705f01 100644 --- a/src/USER-CG-CMM/Install.sh +++ b/src/USER-CG-CMM/Install.sh @@ -1,62 +1,69 @@ # Install/unInstall package files in LAMMPS # do not install child files if parent does not exist if (test $1 = 1) then if (test -e ../angle_harmonic.cpp) then cp angle_cg_cmm.h .. cp angle_cg_cmm.cpp .. cp angle_sdk.h .. cp angle_sdk.cpp .. fi if (test -e ../pppm.cpp) then cp pair_lj_sdk_coul_long.cpp .. cp pair_cg_cmm_coul_long.cpp .. cp pair_lj_sdk_coul_long.h .. cp pair_cg_cmm_coul_long.h .. fi + if (test -e ../msm.cpp) then + cp pair_lj_sdk_coul_msm.cpp .. + cp pair_lj_sdk_coul_msm.h .. + fi + cp cg_cmm_parms.h .. cp cg_cmm_parms.cpp .. cp pair_cmm_common.h .. cp pair_cmm_common.cpp .. cp pair_cg_cmm.cpp .. cp pair_cg_cmm.h .. cp pair_cg_cmm_coul_cut.cpp .. cp pair_cg_cmm_coul_cut.h .. cp pair_lj_sdk.cpp .. cp pair_lj_sdk.h .. cp lj_sdk_common.h .. elif (test $1 = 0) then rm -f ../angle_cg_cmm.h rm -f ../angle_cg_cmm.cpp rm -f ../cg_cmm_parms.h rm -f ../cg_cmm_parms.cpp rm -f ../pair_cmm_common.h rm -f ../pair_cmm_common.cpp rm -f ../pair_cg_cmm.cpp rm -f ../pair_cg_cmm.h rm -f ../pair_cg_cmm_coul_cut.cpp rm -f ../pair_cg_cmm_coul_cut.h rm -f ../pair_cg_cmm_coul_long.cpp rm -f ../pair_cg_cmm_coul_long.h rm -f ../lj_sdk_common.h rm -f ../angle_sdk.h rm -f ../angle_sdk.cpp rm -f ../pair_lj_sdk.cpp rm -f ../pair_lj_sdk.h rm -f ../pair_lj_sdk_coul_long.cpp rm -f ../pair_lj_sdk_coul_long.h + rm -f ../pair_lj_sdk_coul_msm.cpp + rm -f ../pair_lj_sdk_coul_msm.h fi diff --git a/src/USER-CG-CMM/Package.sh b/src/USER-CG-CMM/Package.sh index 317648236..6f481d663 100644 --- a/src/USER-CG-CMM/Package.sh +++ b/src/USER-CG-CMM/Package.sh @@ -1,38 +1,44 @@ # Update package files in LAMMPS # cp package file to src if doesn't exist or is different # do not copy molecular and kspace files if corresponding versions do not exist for file in *.cpp *.h; do if (test $file = angle_cg_cmm.cpp -a ! -e ../angle_harmonic.cpp) then continue fi if (test $file = angle_cg_cmm.h -a ! -e ../angle_harmonic.h) then continue fi if (test $file = pair_cg_cmm_coul_long.cpp -a ! -e ../pair_lj_cut_coul_long.cpp) then continue fi if (test $file = pair_cg_cmm_coul_long.h -a ! -e ../pair_lj_cut_coul_long.h) then continue fi if (test $file = angle_sdk.cpp -a ! -e ../angle_harmonic.cpp) then continue fi if (test $file = angle_sdk.h -a ! -e ../angle_harmonic.h) then continue fi if (test $file = pair_lj_sdk_coul_long.cpp -a ! -e ../pair_lj_cut_coul_long.cpp) then continue fi if (test $file = pair_lj_sdk_coul_long.h -a ! -e ../pair_lj_cut_coul_long.h) then continue fi + if (test $file = pair_lj_sdk_coul_msm.cpp -a ! -e ../pair_lj_cut_coul_msm.cpp) then + continue + fi + if (test $file = pair_lj_sdk_coul_msm.h -a ! -e ../pair_lj_cut_coul_msm.h) then + continue + fi if (test ! -e ../$file) then echo " creating src/$file" cp $file .. elif (test "`diff --brief $file ../$file`" != "") then echo " updating src/$file" cp $file .. fi done diff --git a/src/USER-CG-CMM/pair_lj_sdk_coul_long.h b/src/USER-CG-CMM/pair_lj_sdk_coul_long.h index c929712ec..8000507e2 100644 --- a/src/USER-CG-CMM/pair_lj_sdk_coul_long.h +++ b/src/USER-CG-CMM/pair_lj_sdk_coul_long.h @@ -1,82 +1,82 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- Contributing author: Axel Kohlmeyer (Temple U) ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS PairStyle(lj/sdk/coul/long,PairLJSDKCoulLong) PairStyle(cg/cmm/coul/long,PairLJSDKCoulLong) #else #ifndef LMP_PAIR_LJ_SDK_COUL_LONG_H #define LMP_PAIR_LJ_SDK_COUL_LONG_H #include "pair.h" namespace LAMMPS_NS { class PairLJSDKCoulLong : public Pair { public: PairLJSDKCoulLong(class LAMMPS *); virtual ~PairLJSDKCoulLong(); virtual void compute(int, int); virtual void settings(int, char **); void coeff(int, char **); void init_style(); double init_one(int, int); void write_restart(FILE *); void read_restart(FILE *); virtual void write_restart_settings(FILE *); virtual void read_restart_settings(FILE *); virtual double single(int, int, int, int, double, double, double, double &); - void *extract(const char *, int &); + virtual void *extract(const char *, int &); virtual double memory_usage(); protected: double **cut_lj,**cut_ljsq; double cut_coul,cut_coulsq; double **epsilon,**sigma; double **lj1,**lj2,**lj3,**lj4,**offset; int **lj_type; // cutoff and offset for minimum of LJ potential // to be used in SDK angle potential, which // uses only the repulsive part of the potential double **rminsq, **emin; double cut_lj_global; double g_ewald; double tabinnersq; double *rtable,*drtable,*ftable,*dftable,*ctable,*dctable; double *etable,*detable; int ncoulshiftbits,ncoulmask; void allocate(); void init_tables(); void free_tables(); private: template <int EVFLAG, int EFLAG, int NEWTON_PAIR> void eval(); }; } #endif #endif diff --git a/src/USER-CG-CMM/pair_lj_sdk_coul_msm.cpp b/src/USER-CG-CMM/pair_lj_sdk_coul_msm.cpp new file mode 100644 index 000000000..fe8e8ce9b --- /dev/null +++ b/src/USER-CG-CMM/pair_lj_sdk_coul_msm.cpp @@ -0,0 +1,307 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) + This style is a simplified re-implementation of the CG/CMM pair style +------------------------------------------------------------------------- */ + +#include "math.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "pair_lj_sdk_coul_msm.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "kspace.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "integrate.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +#include "lj_sdk_common.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace LJSDKParms; + +/* ---------------------------------------------------------------------- */ + +PairLJSDKCoulMSM::PairLJSDKCoulMSM(LAMMPS *lmp) : PairLJSDKCoulLong(lmp) +{ + ewaldflag = pppmflag = 0; + msmflag = 1; + respa_enable = 0; + ftable = NULL; +} + +/* ---------------------------------------------------------------------- */ + +void PairLJSDKCoulMSM::compute(int eflag, int vflag) +{ + if (eflag || vflag) { + ev_setup(eflag,vflag); + } else evflag = vflag_fdotr = 0; + + if (evflag) { + if (eflag) { + if (force->newton_pair) eval_msm<1,1,1>(); + else eval_msm<1,1,0>(); + } else { + if (force->newton_pair) eval_msm<1,0,1>(); + else eval_msm<1,0,0>(); + } + } else { + if (force->newton_pair) eval_msm<0,0,1>(); + else eval_msm<0,0,0>(); + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- */ + +template <int EVFLAG, int EFLAG, int NEWTON_PAIR> +void PairLJSDKCoulMSM::eval_msm() +{ + int i,ii,j,jj,jtype,itable; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair; + double fraction,table; + double r,rsq,r2inv,forcecoul,forcelj,factor_coul,factor_lj; + double egamma,fgamma,prefactor; + + const double * const * const x = atom->x; + double * const * const f = atom->f; + const double * const q = atom->q; + const int * const type = atom->type; + const int nlocal = atom->nlocal; + const double * const special_coul = force->special_coul; + const double * const special_lj = force->special_lj; + const double qqrd2e = force->qqrd2e; + double fxtmp,fytmp,fztmp; + + const int inum = list->inum; + const int * const ilist = list->ilist; + const int * const numneigh = list->numneigh; + const int * const * const firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + fxtmp=fytmp=fztmp=0.0; + + const int itype = type[i]; + const int * const jlist = firstneigh[i]; + const int jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + forcecoul = forcelj = evdwl = ecoul = 0.0; + + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + factor_coul = special_coul[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + const int ljt = lj_type[itype][jtype]; + + if (rsq < cut_coulsq) { + if (!ncoultablebits || rsq <= tabinnersq) { + r = sqrt(rsq); + prefactor = qqrd2e * qtmp*q[j]/r; + fgamma = 1.0 + (rsq/cut_coulsq)*force->kspace->dgamma(r/cut_coul); + forcecoul = prefactor * fgamma; + if (EFLAG) { + egamma = 1.0 - (r/cut_coul)*force->kspace->gamma(r/cut_coul); + ecoul = prefactor*egamma; + } + if (factor_coul < 1.0) { + forcecoul -= (1.0-factor_coul)*prefactor; + if (EFLAG) ecoul -= (1.0-factor_coul)*prefactor; + } + } else { + union_int_float_t rsq_lookup; + rsq_lookup.f = rsq; + itable = rsq_lookup.i & ncoulmask; + itable >>= ncoulshiftbits; + fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; + table = ftable[itable] + fraction*dftable[itable]; + forcecoul = qtmp*q[j] * table; + if (EFLAG) ecoul = qtmp*q[j] * + (etable[itable] + fraction*detable[itable]); + if (factor_coul < 1.0) { + table = ctable[itable] + fraction*dctable[itable]; + prefactor = qtmp*q[j] * table; + forcecoul -= (1.0-factor_coul)*prefactor; + if (EFLAG) ecoul -= (1.0-factor_coul)*prefactor; + } + } + } else forcecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + + if (ljt == LJ12_4) { + const double r4inv=r2inv*r2inv; + forcelj = r4inv*(lj1[itype][jtype]*r4inv*r4inv + - lj2[itype][jtype]); + + if (EFLAG) + evdwl = r4inv*(lj3[itype][jtype]*r4inv*r4inv + - lj4[itype][jtype]) - offset[itype][jtype]; + + } else if (ljt == LJ9_6) { + const double r3inv = r2inv*sqrt(r2inv); + const double r6inv = r3inv*r3inv; + forcelj = r6inv*(lj1[itype][jtype]*r3inv + - lj2[itype][jtype]); + if (EFLAG) + evdwl = r6inv*(lj3[itype][jtype]*r3inv + - lj4[itype][jtype]) - offset[itype][jtype]; + + } else if (ljt == LJ12_6) { + const double r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv*(lj1[itype][jtype]*r6inv + - lj2[itype][jtype]); + if (EFLAG) + evdwl = r6inv*(lj3[itype][jtype]*r6inv + - lj4[itype][jtype]) - offset[itype][jtype]; + } + forcelj *= factor_lj; + if (EFLAG) evdwl *= factor_lj; + } + + fpair = (forcecoul + forcelj) * r2inv; + + fxtmp += delx*fpair; + fytmp += dely*fpair; + fztmp += delz*fpair; + if (NEWTON_PAIR || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (EVFLAG) ev_tally(i,j,nlocal,NEWTON_PAIR, + evdwl,ecoul,fpair,delx,dely,delz); + } + } + f[i][0] += fxtmp; + f[i][1] += fytmp; + f[i][2] += fztmp; + } +} + +/* ---------------------------------------------------------------------- */ + +double PairLJSDKCoulMSM::single(int i, int j, int itype, int jtype, + double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + double r2inv,r,fgamma,egamma,prefactor; + double fraction,table,forcecoul,forcelj,phicoul,philj; + int itable; + + forcecoul = forcelj = phicoul = philj = 0.0; + + r2inv = 1.0/rsq; + if (rsq < cut_coulsq) { + if (!ncoultablebits || rsq <= tabinnersq) { + r = sqrt(rsq); + prefactor = force->qqrd2e * atom->q[i]*atom->q[j]/r; + egamma = 1.0 - (r/cut_coul)*force->kspace->gamma(r/cut_coul); + fgamma = 1.0 + (rsq/cut_coulsq)*force->kspace->dgamma(r/cut_coul); + forcecoul = prefactor * fgamma; + phicoul = prefactor * egamma; + if (factor_coul < 1.0) { + forcecoul -= (1.0-factor_coul)*prefactor; + phicoul -= (1.0-factor_coul)*prefactor; + } + } else { + union_int_float_t rsq_lookup_single; + rsq_lookup_single.f = rsq; + itable = rsq_lookup_single.i & ncoulmask; + itable >>= ncoulshiftbits; + fraction = (rsq_lookup_single.f - rtable[itable]) * drtable[itable]; + table = ftable[itable] + fraction*dftable[itable]; + forcecoul = atom->q[i]*atom->q[j] * table; + table = etable[itable] + fraction*detable[itable]; + phicoul = atom->q[i]*atom->q[j] * table; + if (factor_coul < 1.0) { + table = ctable[itable] + fraction*dctable[itable]; + prefactor = atom->q[i]*atom->q[j] * table; + forcecoul -= (1.0-factor_coul)*prefactor; + phicoul -= (1.0-factor_coul)*prefactor; + } + } + } + + if (rsq < cut_ljsq[itype][jtype]) { + const int ljt = lj_type[itype][jtype]; + const double ljpow1 = lj_pow1[ljt]; + const double ljpow2 = lj_pow2[ljt]; + const double ljpref = lj_prefact[ljt]; + + const double ratio = sigma[itype][jtype]/sqrt(rsq); + const double eps = epsilon[itype][jtype]; + + forcelj = factor_lj * ljpref*eps * (ljpow1*pow(ratio,ljpow1) + - ljpow2*pow(ratio,ljpow2))/rsq; + philj = factor_lj * (ljpref*eps * (pow(ratio,ljpow1) - pow(ratio,ljpow2)) + - offset[itype][jtype]); + } + + fforce = (forcecoul + forcelj) * r2inv; + + return phicoul + philj; +} + +/* ---------------------------------------------------------------------- */ + +void *PairLJSDKCoulMSM::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + if (strcmp(str,"sigma") == 0) return (void *) sigma; + if (strcmp(str,"lj_type") == 0) return (void *) lj_type; + if (strcmp(str,"lj1") == 0) return (void *) lj1; + if (strcmp(str,"lj2") == 0) return (void *) lj2; + if (strcmp(str,"lj3") == 0) return (void *) lj3; + if (strcmp(str,"lj4") == 0) return (void *) lj4; + if (strcmp(str,"rminsq") == 0) return (void *) rminsq; + if (strcmp(str,"emin") == 0) return (void *) emin; + + dim = 0; + if (strcmp(str,"cut_coul") == 0) return (void *) &cut_coul; + if (strcmp(str,"cut_msm") == 0) return (void *) &cut_coul; + return NULL; +} + diff --git a/src/USER-CG-CMM/pair_lj_sdk_coul_msm.h b/src/USER-CG-CMM/pair_lj_sdk_coul_msm.h new file mode 100644 index 000000000..af79b6e0b --- /dev/null +++ b/src/USER-CG-CMM/pair_lj_sdk_coul_msm.h @@ -0,0 +1,48 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(lj/sdk/coul/msm,PairLJSDKCoulMSM) +PairStyle(cg/cmm/coul/msm,PairLJSDKCoulMSM) + +#else + +#ifndef LMP_PAIR_LJ_SDK_COUL_MSM_H +#define LMP_PAIR_LJ_SDK_COUL_MSM_H + +#include "pair_lj_sdk_coul_long.h" + +namespace LAMMPS_NS { + +class PairLJSDKCoulMSM : public PairLJSDKCoulLong { + public: + PairLJSDKCoulMSM(class LAMMPS *); + virtual ~PairLJSDKCoulMSM() {}; + virtual void compute(int, int); + virtual double single(int, int, int, int, double, double, double, double &); + virtual void *extract(const char *, int &); + +private: + template <int EVFLAG, int EFLAG, int NEWTON_PAIR> void eval_msm(); + +}; + +} + +#endif +#endif