From 456b81417ddba1a16c582c6d19633f2f7a8b65b2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 9 Jun 2021 09:03:50 -0600 Subject: [PATCH 001/437] first version of fix ttm/grid --- src/MISC/fix_ttm.cpp | 372 +++++++++++---------- src/MISC/fix_ttm.h | 25 +- src/MISC/fix_ttm_grid.cpp | 609 ++++++++++++++++++++++++++++++++++ src/MISC/fix_ttm_grid.h | 148 +++++++++ src/fix.h | 5 + src/{KSPACE => }/gridcomm.cpp | 112 ++++--- src/{KSPACE => }/gridcomm.h | 16 +- 7 files changed, 1062 insertions(+), 225 deletions(-) create mode 100644 src/MISC/fix_ttm_grid.cpp create mode 100644 src/MISC/fix_ttm_grid.h rename src/{KSPACE => }/gridcomm.cpp (91%) rename src/{KSPACE => }/gridcomm.h (91%) diff --git a/src/MISC/fix_ttm.cpp b/src/MISC/fix_ttm.cpp index aed5761dd4..c5e7d07429 100644 --- a/src/MISC/fix_ttm.cpp +++ b/src/MISC/fix_ttm.cpp @@ -31,7 +31,6 @@ #include "memory.h" #include "error.h" - #include "tokenizer.h" using namespace LAMMPS_NS; @@ -108,45 +107,36 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : gfactor1 = new double[atom->ntypes+1]; gfactor2 = new double[atom->ntypes+1]; - // allocate 3d grid variables // check for allowed maxium number of total grid nodes total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes; if (total_nnodes > MAXSMALLINT) error->all(FLERR,"Too many nodes in fix ttm"); - memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum"); - memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all"); - memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq"); - memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); - memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all"); - memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes, - "ttm:sum_mass_vsq_all"); - memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old"); - memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron"); - memory->create(net_energy_transfer,nxnodes,nynodes,nznodes, - "TTM:net_energy_transfer"); - memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes, - "TTM:net_energy_transfer_all"); + // allocate 3d grid variables + + allocate_grid(); + + // allocate per-atom flangevin and zero it + // NOTE: is init to zero necessary? flangevin = nullptr; grow_arrays(atom->nmax); - // zero out the flangevin array - for (int i = 0; i < atom->nmax; i++) { - flangevin[i][0] = 0; - flangevin[i][1] = 0; - flangevin[i][2] = 0; + flangevin[i][0] = 0.0; + flangevin[i][1] = 0.0; + flangevin[i][2] = 0.0; } + // set 2 callbacks + atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); // set initial electron temperatures from user input file - if (comm->me == 0) read_initial_electron_temperatures(arg[13]); - MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); + read_initial_electron_temperatures(arg[13]); } /* ---------------------------------------------------------------------- */ @@ -160,17 +150,9 @@ FixTTM::~FixTTM() delete [] gfactor1; delete [] gfactor2; - memory->destroy(nsum); - memory->destroy(nsum_all); - memory->destroy(sum_vsq); - memory->destroy(sum_mass_vsq); - memory->destroy(sum_vsq_all); - memory->destroy(sum_mass_vsq_all); - memory->destroy(T_electron_old); - memory->destroy(T_electron); memory->destroy(flangevin); - memory->destroy(net_energy_transfer); - memory->destroy(net_energy_transfer_all); + + deallocate_grid(); } /* ---------------------------------------------------------------------- */ @@ -203,13 +185,12 @@ void FixTTM::init() sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; } - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - net_energy_transfer_all[ixnode][iynode][iznode] = 0; - if (utils::strmatch(update->integrate_style,"^respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; + + // initialize grid quantities + + init_grid(); } /* ---------------------------------------------------------------------- */ @@ -227,6 +208,25 @@ void FixTTM::setup(int vflag) /* ---------------------------------------------------------------------- */ +void FixTTM::post_force_setup(int /*vflag*/) +{ + double **f = atom->f; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // apply langevin forces that have been stored from previous run + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + f[i][0] += flangevin[i][0]; + f[i][1] += flangevin[i][1]; + f[i][2] += flangevin[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- */ + void FixTTM::post_force(int /*vflag*/) { double **x = atom->x; @@ -279,32 +279,6 @@ void FixTTM::post_force(int /*vflag*/) /* ---------------------------------------------------------------------- */ -void FixTTM::post_force_setup(int /*vflag*/) -{ - double **f = atom->f; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - // apply langevin forces that have been stored from previous run - - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - f[i][0] += flangevin[i][0]; - f[i][1] += flangevin[i][1]; - f[i][2] += flangevin[i][2]; - } - } -} - -/* ---------------------------------------------------------------------- */ - -void FixTTM::post_force_respa(int vflag, int ilevel, int /*iloop*/) -{ - if (ilevel == nlevels_respa-1) post_force(vflag); -} - -/* ---------------------------------------------------------------------- */ - void FixTTM::post_force_respa_setup(int vflag, int ilevel, int /*iloop*/) { if (ilevel == nlevels_respa-1) post_force_setup(vflag); @@ -312,68 +286,9 @@ void FixTTM::post_force_respa_setup(int vflag, int ilevel, int /*iloop*/) /* ---------------------------------------------------------------------- */ -void FixTTM::reset_dt() +void FixTTM::post_force_respa(int vflag, int ilevel, int /*iloop*/) { - for (int i = 1; i <= atom->ntypes; i++) - gfactor2[i] = - sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; -} - -/* ---------------------------------------------------------------------- - read in initial electron temperatures from a user-specified file - only called by proc 0 -------------------------------------------------------------------------- */ - -void FixTTM::read_initial_electron_temperatures(const char *filename) -{ - int ***T_initial_set; - memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); - memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); - - std::string name = utils::get_potential_file_path(filename); - if (name.empty()) - error->one(FLERR,"Cannot open input file: {}", - filename); - FILE *fpr = fopen(name.c_str(),"r"); - - // read initial electron temperature values from file - - char line[MAXLINE]; - int ixnode,iynode,iznode; - double T_tmp; - while (1) { - if (fgets(line,MAXLINE,fpr) == nullptr) break; - ValueTokenizer values(line); - if (values.has_next()) ixnode = values.next_int(); - if (values.has_next()) iynode = values.next_int(); - if (values.has_next()) iznode = values.next_int(); - if (values.has_next()) T_tmp = values.next_double(); - else error->one(FLERR,"Incorrect format in fix ttm input file"); - - // check correctness of input data - - if ((ixnode < 0) || (ixnode >= nxnodes) - || (iynode < 0) || (iynode >= nynodes) - || (iznode < 0) || (iznode >= nznodes)) - error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); - - if (T_tmp < 0.0) - error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); - - T_electron[ixnode][iynode][iznode] = T_tmp; - T_initial_set[ixnode][iynode][iznode] = 1; - } - fclose(fpr); - - // check completeness of input data - - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - if (T_initial_set[ixnode][iynode][iznode] == 0) - error->one(FLERR,"Initial temperatures not all set in fix ttm"); - - memory->destroy(T_initial_set); + if (ilevel == nlevels_respa-1) post_force(vflag); } /* ---------------------------------------------------------------------- */ @@ -552,55 +467,20 @@ void FixTTM::end_of_step() } } -/* ---------------------------------------------------------------------- - memory usage of 3d grid -------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- */ -double FixTTM::memory_usage() +void FixTTM::reset_dt() { - double bytes = 0.0; - bytes += (double)5*total_nnodes * sizeof(int); - bytes += (double)14*total_nnodes * sizeof(double); - return bytes; + for (int i = 1; i <= atom->ntypes; i++) + gfactor2[i] = + sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; } /* ---------------------------------------------------------------------- */ void FixTTM::grow_arrays(int ngrow) { - - memory->grow(flangevin,ngrow,3,"TTM:flangevin"); - -} - -/* ---------------------------------------------------------------------- - return the energy of the electronic subsystem or the net_energy transfer - between the subsystems -------------------------------------------------------------------------- */ - -double FixTTM::compute_vector(int n) -{ - double e_energy = 0.0; - double transfer_energy = 0.0; - - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; - double del_vol = dx*dy*dz; - - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - e_energy += - T_electron[ixnode][iynode][iznode]*electronic_specific_heat* - electronic_density*del_vol; - transfer_energy += - net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; - } - - if (n == 0) return e_energy; - if (n == 1) return transfer_energy; - return 0.0; + memory->grow(flangevin,ngrow,3,"TTM:flangevin"); } /* ---------------------------------------------------------------------- @@ -685,6 +565,15 @@ void FixTTM::unpack_restart(int nlocal, int nth) flangevin[nlocal][2] = extra[nlocal][m++]; } +/* ---------------------------------------------------------------------- + size of atom nlocal's restart data +------------------------------------------------------------------------- */ + +int FixTTM::size_restart(int /*nlocal*/) +{ + return 4; +} + /* ---------------------------------------------------------------------- maxsize of any atom's restart data ------------------------------------------------------------------------- */ @@ -695,10 +584,157 @@ int FixTTM::maxsize_restart() } /* ---------------------------------------------------------------------- - size of atom nlocal's restart data + return the energy of the electronic subsystem or the net_energy transfer + between the subsystems ------------------------------------------------------------------------- */ -int FixTTM::size_restart(int /*nlocal*/) +double FixTTM::compute_vector(int n) { - return 4; + double e_energy = 0.0; + double transfer_energy = 0.0; + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + e_energy += + T_electron[ixnode][iynode][iznode]*electronic_specific_heat* + electronic_density*del_vol; + transfer_energy += + net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; + } + + if (n == 0) return e_energy; + if (n == 1) return transfer_energy; + return 0.0; +} + +/* ---------------------------------------------------------------------- + memory usage for flangevin and 3d grid +------------------------------------------------------------------------- */ + +double FixTTM::memory_usage() +{ + double bytes = 0.0; + bytes += (double)atom->nmax * 3 * sizeof(double); + + bytes += (double)5*total_nnodes * sizeof(int); + bytes += (double)14*total_nnodes * sizeof(double); + + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTM::allocate_grid() +{ + memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum"); + memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all"); + memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq"); + memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); + memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all"); + memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes, + "ttm:sum_mass_vsq_all"); + memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old"); + memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron"); + memory->create(net_energy_transfer,nxnodes,nynodes,nznodes, + "TTM:net_energy_transfer"); + memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes, + "TTM:net_energy_transfer_all"); +} + +/* ---------------------------------------------------------------------- + initialize 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTM::init_grid() +{ + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + net_energy_transfer_all[ixnode][iynode][iznode] = 0; +} + +/* ---------------------------------------------------------------------- + deallocate 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTM::deallocate_grid() +{ + memory->destroy(nsum); + memory->destroy(nsum_all); + memory->destroy(sum_vsq); + memory->destroy(sum_mass_vsq); + memory->destroy(sum_vsq_all); + memory->destroy(sum_mass_vsq_all); + memory->destroy(T_electron_old); + memory->destroy(T_electron); + memory->destroy(flangevin); + memory->destroy(net_energy_transfer); + memory->destroy(net_energy_transfer_all); +} + +/* ---------------------------------------------------------------------- + read in initial electron temperatures from a user-specified file + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixTTM::read_initial_electron_temperatures(const char *filename) +{ + int ***T_initial_set; + memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); + memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + + std::string name = utils::get_potential_file_path(filename); + if (name.empty()) + error->one(FLERR,"Cannot open input file: {}", + filename); + FILE *fpr = fopen(name.c_str(),"r"); + + // read initial electron temperature values from file + + char line[MAXLINE]; + int ixnode,iynode,iznode; + double T_tmp; + while (1) { + if (fgets(line,MAXLINE,fpr) == nullptr) break; + ValueTokenizer values(line); + if (values.has_next()) ixnode = values.next_int(); + if (values.has_next()) iynode = values.next_int(); + if (values.has_next()) iznode = values.next_int(); + if (values.has_next()) T_tmp = values.next_double(); + else error->one(FLERR,"Incorrect format in fix ttm input file"); + + // check correctness of input data + + if ((ixnode < 0) || (ixnode >= nxnodes) + || (iynode < 0) || (iynode >= nynodes) + || (iznode < 0) || (iznode >= nznodes)) + error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); + + if (T_tmp < 0.0) + error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); + + T_electron[ixnode][iynode][iznode] = T_tmp; + T_initial_set[ixnode][iynode][iznode] = 1; + } + fclose(fpr); + + // check completeness of input data + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + if (T_initial_set[ixnode][iynode][iznode] == 0) + error->one(FLERR,"Initial temperatures not all set in fix ttm"); + + memory->destroy(T_initial_set); + + MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); } diff --git a/src/MISC/fix_ttm.h b/src/MISC/fix_ttm.h index 46bddd22af..82dd4964c8 100644 --- a/src/MISC/fix_ttm.h +++ b/src/MISC/fix_ttm.h @@ -27,27 +27,27 @@ namespace LAMMPS_NS { class FixTTM : public Fix { public: FixTTM(class LAMMPS *, int, char **); - ~FixTTM(); + virtual ~FixTTM(); int setmask(); void init(); void setup(int); - void post_force(int); - void post_force_respa(int, int, int); void post_force_setup(int); + virtual void post_force(int); void post_force_respa_setup(int, int, int); - void end_of_step(); + void post_force_respa(int, int, int); + virtual void end_of_step(); void reset_dt(); - void write_restart(FILE *); - void restart(char *); + void grow_arrays(int); + virtual void write_restart(FILE *); + virtual void restart(char *); int pack_restart(int, double *); void unpack_restart(int, int); int size_restart(int); int maxsize_restart(); - double memory_usage(); - void grow_arrays(int); - double compute_vector(int); + virtual double compute_vector(int); + virtual double memory_usage(); - private: + protected: int nfileevery; int nlevels_respa; int seed; @@ -65,7 +65,10 @@ class FixTTM : public Fix { double electronic_thermal_conductivity; double gamma_p, gamma_s, v_0, v_0_sq; - void read_initial_electron_temperatures(const char *); + virtual void allocate_grid(); + virtual void init_grid(); + virtual void deallocate_grid(); + virtual void read_initial_electron_temperatures(const char *); }; } // namespace LAMMPS_NS diff --git a/src/MISC/fix_ttm_grid.cpp b/src/MISC/fix_ttm_grid.cpp new file mode 100644 index 0000000000..eb0d376db8 --- /dev/null +++ b/src/MISC/fix_ttm_grid.cpp @@ -0,0 +1,609 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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 authors: Paul Crozier (SNL) + Carolyn Phillips (University of Michigan) +------------------------------------------------------------------------- */ + +#include "fix_ttm_grid.h" + +#include +#include +#include "atom.h" +#include "force.h" +#include "update.h" +#include "domain.h" +#include "comm.h" +#include "gridcomm.h" +#include "neighbor.h" +#include "random_mars.h" +#include "memory.h" +#include "error.h" + +#include "tokenizer.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define MAXLINE 1024 +#define OFFSET 16384 + +enum{T_ELECTRON,NET_ENERGY_TRANSFER,DSUM,SUM_VSQ,SUM_MASS_VSQ}; + +/* ---------------------------------------------------------------------- */ + +FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : + FixTTM(lmp, narg, arg) {} + +/* ---------------------------------------------------------------------- */ + +void FixTTMGrid::post_force(int /*vflag*/) +{ + int ix,iy,iz; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double gamma1,gamma2; + + double *boxlo = domain->boxlo; + + // apply damping and thermostat to all atoms in fix group + + int flag = 0; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + + ix = static_cast ((x[i][0]-boxlo[0])*delxinv + shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*delyinv + shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*delzinv + shift) - OFFSET; + + if (T_electron[ix][iy][iz] < 0) + error->all(FLERR,"Electronic temperature dropped below zero"); + + // check that ix,iy,iz is within my ghost cell range + + if (ix < nxlo_out || ix > nxhi_out || iy < nylo_out || iy > nyhi_out || + iz < nzlo_out || iz > nzhi_out) flag = 1; + + double tsqrt = sqrt(T_electron[ix][iy][iz]); + + gamma1 = gfactor1[type[i]]; + double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p; + gamma2 = gfactor2[type[i]] * tsqrt; + + flangevin[i][0] = gamma1*v[i][0] + gamma2*(random->uniform()-0.5); + flangevin[i][1] = gamma1*v[i][1] + gamma2*(random->uniform()-0.5); + flangevin[i][2] = gamma1*v[i][2] + gamma2*(random->uniform()-0.5); + + f[i][0] += flangevin[i][0]; + f[i][1] += flangevin[i][1]; + f[i][2] += flangevin[i][2]; + } + } + + if (flag) error->one(FLERR,"Out of range fix ttm/grid atoms"); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMGrid::end_of_step() +{ + int ix,iy,iz; + + double **x = atom->x; + double **v = atom->v; + double *mass = atom->mass; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double *boxlo = domain->boxlo; + + memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + ix = static_cast ((x[i][0]-boxlo[0])*delxinv+shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*delyinv+shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*delzinv+shift) - OFFSET; + net_energy_transfer[ix][iy][iz] += + (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + + flangevin[i][2]*v[i][2]); + } + + gc->reverse_comm(1,this,1,sizeof(double),NET_ENERGY_TRANSFER, + gc_buf1,gc_buf2,MPI_DOUBLE); + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + // num_inner_timesteps = # of inner steps (thermal solves) + // required this MD step to maintain a stable explicit solve + + int num_inner_timesteps = 1; + double inner_dt = update->dt; + + double stability_criterion = 1.0 - + 2.0*inner_dt/(electronic_specific_heat*electronic_density) * + (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + + if (stability_criterion < 0.0) { + inner_dt = 0.5*(electronic_specific_heat*electronic_density) / + (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; + inner_dt = update->dt/double(num_inner_timesteps); + if (num_inner_timesteps > 1000000) + error->warning(FLERR,"Too many inner timesteps in fix ttm/grid"); + } + + for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; + ith_inner_timestep++) { + + memcpy(&T_electron_old[nzlo_out][nylo_out][nxlo_out], + &T_electron[nzlo_out][nylo_out][nxlo_out],ngridout*sizeof(double)); + + // compute new electron T profile + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + T_electron[ix][iy][iz] = + T_electron_old[ix][iy][iz] + + inner_dt/(electronic_specific_heat*electronic_density) * + (electronic_thermal_conductivity * + + ((T_electron_old[ix-1][iy][iz] + T_electron_old[ix+1][iy][iz] - + 2*T_electron_old[ix][iy][iz])/dx/dx + + (T_electron_old[ix][iy-1][iz] + T_electron_old[ix][iy+1][iz] - + 2*T_electron_old[ix][iy][iz])/dy/dy + + (T_electron_old[ix][iy][iz-1] + T_electron_old[ix][iy][iz+1] - + 2*T_electron_old[ix][iy][iz])/dz/dz) - + + net_energy_transfer_all[ix][iy][iz]/del_vol); + } + } + + // comm new T_electron to ghost grid points + + gc->forward_comm(1,this,1,sizeof(double),T_ELECTRON, + gc_buf1,gc_buf2,MPI_DOUBLE); + + // output nodal temperatures for current timestep + + if ((nfileevery) && !(update->ntimestep % nfileevery)) { + + // compute atomic Ta for each grid point + + memset(&dsum[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); + memset(&sum_vsq[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); + memset(&sum_mass_vsq[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); + + double massone; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) massone = rmass[i]; + else massone = mass[type[i]]; + double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + + ix = static_cast ((x[i][0]-boxlo[0])*delxinv+shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*delyinv+shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*delzinv+shift) - OFFSET; + + dsum[ix][iy][iz] += 1.0; + sum_vsq[ix][iy][iz] += vsq; + sum_mass_vsq[ix][iy][iz] += massone*vsq; + } + + // can GridComm work on a larger struct of several values? + + gc->reverse_comm(1,this,1,sizeof(double),DSUM, + gc_buf1,gc_buf2,MPI_DOUBLE); + gc->reverse_comm(1,this,1,sizeof(double),SUM_VSQ, + gc_buf1,gc_buf2,MPI_DOUBLE); + gc->reverse_comm(1,this,1,sizeof(double),SUM_MASS_VSQ, + gc_buf1,gc_buf2,MPI_DOUBLE); + + // NOTE: should this be a write function, work with parallel pings + + if (comm->me == 0) { + fmt::print(fp,"{}",update->ntimestep); + + double T_a; + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + T_a = 0; + if (dsum[ix][iy][iz] > 0) + T_a = sum_mass_vsq[ix][iy][iz] / + (3.0*force->boltz*dsum[ix][iy][iz]/force->mvv2e); + fmt::print(fp," {}",T_a); + } + + fputs("\t",fp); + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + fmt::print(fp," {}",T_electron[ix][iy][iz]); + fputs("\n",fp); + } + } +} + +/* ---------------------------------------------------------------------- + pack own values to buf to send to another proc +------------------------------------------------------------------------- */ + +void FixTTMGrid::pack_forward_grid(int flag, void *vbuf, int nlist, int *list) +{ + double *buf = (double *) vbuf; + + double *src; + if (flag == T_ELECTRON) + src = &T_electron[nzlo_out][nylo_out][nxlo_out]; + + for (int i = 0; i < nlist; i++) + buf[i] = src[list[i]]; +} + +/* ---------------------------------------------------------------------- + unpack another proc's own values from buf and set own ghost values +------------------------------------------------------------------------- */ + +void FixTTMGrid::unpack_forward_grid(int flag, void *vbuf, int nlist, int *list) +{ + double *buf = (double *) vbuf; + + double *dest; + if (flag == T_ELECTRON) + dest = &T_electron[nzlo_out][nylo_out][nxlo_out]; + + for (int i = 0; i < nlist; i++) + dest[list[i]] = buf[i]; +} + +/* ---------------------------------------------------------------------- + pack ghost values into buf to send to another proc +------------------------------------------------------------------------- */ + +void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list) +{ + double *buf = (double *) vbuf; + + double *src; + if (flag == NET_ENERGY_TRANSFER) + src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; + else if (flag == DSUM) + src = &dsum[nzlo_out][nylo_out][nxlo_out]; + else if (flag == SUM_VSQ) + src = &sum_vsq[nzlo_out][nylo_out][nxlo_out]; + else if (flag == SUM_MASS_VSQ) + src = &sum_mass_vsq[nzlo_out][nylo_out][nxlo_out]; + + for (int i = 0; i < nlist; i++) + buf[i] = src[list[i]]; +} + +/* ---------------------------------------------------------------------- + unpack another proc's ghost values from buf and add to own values +------------------------------------------------------------------------- */ + +void FixTTMGrid::unpack_reverse_grid(int flag, void *vbuf, int nlist, int *list) +{ + double *buf = (double *) vbuf; + + double *dest; + if (flag == NET_ENERGY_TRANSFER) + dest = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; + else if (flag == DSUM) + dest = &dsum[nzlo_out][nylo_out][nxlo_out]; + else if (flag == SUM_VSQ) + dest = &sum_vsq[nzlo_out][nylo_out][nxlo_out]; + else if (flag == SUM_MASS_VSQ) + dest = &sum_mass_vsq[nzlo_out][nylo_out][nxlo_out]; + + for (int i = 0; i < nlist; i++) + dest[list[i]] += buf[i]; +} + +/* ---------------------------------------------------------------------- + return the energy of the electronic subsystem or the net_energy transfer + between the subsystems +------------------------------------------------------------------------- */ + +double FixTTMGrid::compute_vector(int n) +{ + int ix,iy,iz; + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + double e_energy_me = 0.0; + double transfer_energy_me = 0.0; + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + e_energy_me += + T_electron[ix][iy][iz]*electronic_specific_heat* + electronic_density*del_vol; + transfer_energy_me += + net_energy_transfer_all[ix][iy][iz]*update->dt; + } + + // NOTE: only do allreduce once ? + double e_energy,transfer_energy; + MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world); + + if (n == 0) return e_energy; + if (n == 1) return transfer_energy; + return 0.0; +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixTTMGrid::write_restart(FILE *fp) +{ + int ix,iy,iz; + + double *rlist; + memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); + + int n = 0; + rlist[n++] = seed; + + // NOTE: this is a parallel grid now, not a serial grid + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + rlist[n++] = T_electron[ix][iy][iz]; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(rlist,sizeof(double),n,fp); + } + + memory->destroy(rlist); +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixTTMGrid::restart(char *buf) +{ + int ix,iy,iz; + + int n = 0; + double *rlist = (double *) buf; + + // the seed must be changed from the initial seed + // NOTE: 0.5 is whacky, could go to zero + // NOTE: maybe GridComm should provide a method to pack a grid with bounds + + seed = static_cast (0.5*rlist[n++]); + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + T_electron[ix][iy][iz] = rlist[n++]; + + delete random; + random = new RanMars(lmp,seed+comm->me); +} + +/* ---------------------------------------------------------------------- + memory usage for flangevin and 3d grid +------------------------------------------------------------------------- */ + +double FixTTMGrid::memory_usage() +{ + double bytes = 0.0; + bytes += (double)3*atom->nmax * sizeof(double); + bytes += (double)6*ngridout * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTMGrid::allocate_grid() +{ + // global indices of grid range from 0 to N-1 + // nlo_in,nhi_in = lower/upper limits of the 3d sub-brick of + // global grid that I own without ghost cells + // both non-tiled and tiled proc layouts use 0-1 fractional subdomain info + + if (comm->layout != Comm::LAYOUT_TILED) { + nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nxnodes); + nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nxnodes) - 1; + + nylo_in = static_cast (comm->ysplit[comm->myloc[1]] * nynodes); + nyhi_in = static_cast (comm->ysplit[comm->myloc[1]+1] * nynodes) - 1; + + nzlo_in = static_cast (comm->zsplit[comm->myloc[2]] * nznodes); + nzhi_in = static_cast (comm->zsplit[comm->myloc[2]+1] * nznodes) - 1; + + } else { + nxlo_in = static_cast (comm->mysplit[0][0] * nxnodes); + nxhi_in = static_cast (comm->mysplit[0][1] * nxnodes) - 1; + + nylo_in = static_cast (comm->mysplit[1][0] * nynodes); + nyhi_in = static_cast (comm->mysplit[1][1] * nynodes) - 1; + + nzlo_in = static_cast (comm->mysplit[1][0] * nznodes); + nzhi_in = static_cast (comm->mysplit[1][1] * nznodes) - 1; + } + + // nlo,nhi = min/max index of global grid pt my owned atoms can be mapped to + // finite difference stencil requires extra grid pt around my owned grid pts + // max of these 2 quantities is the ghost cells needed in each di + // nlo_out,nhi_out = nlo_in,nhi_in + ghost cells + + // NOTE: need to wait until init() when neighskin is defined? + + double *boxlo = domain->boxlo; + double *sublo = domain->sublo; + double *subhi = domain->subhi; + + shift = OFFSET + 0.0; // change this to 0.5 for nearest grid pt + delxinv = nxnodes/domain->xprd; + delyinv = nxnodes/domain->yprd; + delzinv = nxnodes/domain->zprd; + + int nlo,nhi; + double cuthalf = 0.5*neighbor->skin; + + nlo = static_cast ((sublo[0]-cuthalf-boxlo[0])*delxinv + shift) - OFFSET; + nhi = static_cast ((subhi[0]+cuthalf-boxlo[0])*delxinv + shift) - OFFSET; + nxlo_out = MIN(nlo,nxlo_in-1); + nxhi_out = MAX(nhi,nxhi_in+1); + + nlo = static_cast ((sublo[1]-cuthalf-boxlo[1])*delyinv + shift) - OFFSET; + nhi = static_cast ((subhi[1]+cuthalf-boxlo[1])*delyinv + shift) - OFFSET; + nylo_out = MIN(nlo,nylo_in-1); + nyhi_out = MAX(nhi,nyhi_in+1); + + nlo = static_cast ((sublo[2]-cuthalf-boxlo[2])*delzinv + shift) - OFFSET; + nhi = static_cast ((subhi[2]+cuthalf-boxlo[2])*delzinv + shift) - OFFSET; + nzlo_out = MIN(nlo,nzlo_in-1); + nzhi_out = MAX(nhi,nzhi_in+1); + + ngridout = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * + (nzhi_out-nzlo_out+1); + + gc = new GridComm(lmp,world,nxnodes,nynodes,nznodes, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out); + + gc->setup(ngc_buf1,ngc_buf2); + + memory->create(gc_buf1,ngc_buf1,"ttm/grid:gc_buf1"); + memory->create(gc_buf2,ngc_buf2,"ttm/grid:gc_buf2"); + + memory->create3d_offset(nsum,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:nsum"); + memory->create3d_offset(sum_vsq,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:sum_vsq"); + memory->create3d_offset(sum_mass_vsq,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:sum_mass_vsq"); + memory->create3d_offset(T_electron_old,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:T_electron_old"); + memory->create3d_offset(T_electron,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:T_electron"); + memory->create3d_offset(net_energy_transfer,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"ttm:net_energy_transfer"); +} + +/* ---------------------------------------------------------------------- + initialize 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTMGrid::init_grid() +{ + memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); +} + +/* ---------------------------------------------------------------------- + deallocate 3d grid quantities +------------------------------------------------------------------------- */ + +void FixTTMGrid::deallocate_grid() +{ + memory->destroy3d_offset(nsum,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(sum_vsq,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(sum_mass_vsq,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(T_electron_old,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(T_electron,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(net_energy_transfer,nzlo_out,nylo_out,nxlo_out); +} + +/* ---------------------------------------------------------------------- + read in initial electron temperatures from a user-specified file + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixTTMGrid::read_initial_electron_temperatures(const char *filename) +{ + int ***T_initial_set; + memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); + memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + + std::string name = utils::get_potential_file_path(filename); + if (name.empty()) + error->one(FLERR,"Cannot open input file: {}",filename); + FILE *fpr = fopen(name.c_str(),"r"); + + // read initial electron temperature values from file + + char line[MAXLINE]; + int ixnode,iynode,iznode; + double T_tmp; + while (1) { + if (fgets(line,MAXLINE,fpr) == nullptr) break; + ValueTokenizer values(line); + if (values.has_next()) ixnode = values.next_int(); + if (values.has_next()) iynode = values.next_int(); + if (values.has_next()) iznode = values.next_int(); + if (values.has_next()) T_tmp = values.next_double(); + else error->one(FLERR,"Incorrect format in fix ttm/grid input file"); + + // check correctness of input data + + if ((ixnode < 0) || (ixnode >= nxnodes) + || (iynode < 0) || (iynode >= nynodes) + || (iznode < 0) || (iznode >= nznodes)) + error->one(FLERR,"Fix ttm/grid invalid node index in input"); + + if (T_tmp < 0.0) + error->one(FLERR,"Fix ttm/grid electron temperatures must be > 0.0"); + + T_electron[ixnode][iynode][iznode] = T_tmp; + T_initial_set[ixnode][iynode][iznode] = 1; + } + fclose(fpr); + + // check completeness of input data + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + if (T_initial_set[ixnode][iynode][iznode] == 0) + error->one(FLERR,"Initial temperatures not all set in fix ttm/grid"); + + memory->destroy(T_initial_set); +} diff --git a/src/MISC/fix_ttm_grid.h b/src/MISC/fix_ttm_grid.h new file mode 100644 index 0000000000..5f5c5a9077 --- /dev/null +++ b/src/MISC/fix_ttm_grid.h @@ -0,0 +1,148 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(ttm/grid,FixTTMGrid); +// clang-format on +#else + +#ifndef LMP_FIX_TTM_GRID_H +#define LMP_FIX_TTM_GRID_H + +#include "fix_ttm.h" + +namespace LAMMPS_NS { + +class FixTTMGrid : public FixTTM { + public: + FixTTMGrid(class LAMMPS *, int, char **); + ~FixTTMGrid() {} + void post_force(int); + void end_of_step(); + double compute_vector(int); + void write_restart(FILE *); + void restart(char *); + double memory_usage(); + + // grid communication + + void pack_forward_grid(int, void *, int, int *); + void unpack_forward_grid(int, void *, int, int *); + void pack_reverse_grid(int, void *, int, int *); + void unpack_reverse_grid(int, void *, int, int *); + + private: + int ngridout; + int nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in; + int nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out; + double shift; + double delxinv,delyinv,delzinv; + double ***dsum; + + class GridComm *gc; + int ngc_buf1,ngc_buf2; + double *gc_buf1,*gc_buf2; + + void allocate_grid(); + void init_grid(); + void deallocate_grid(); + + void read_initial_electron_temperatures(const char *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Cannot open file %s + +The specified file cannot be opened. Check that the path and name are +correct. If the file is a compressed file, also check that the gzip +executable can be found and run. + +E: Cannot open fix ttm file %s + +The output file for the fix ttm command cannot be opened. Check that +the path and name are correct. + +E: Invalid random number seed in fix ttm command + +Random number seed must be > 0. + +E: Fix ttm electronic_specific_heat must be > 0.0 + +Self-explanatory. + +E: Fix ttm electronic_density must be > 0.0 + +Self-explanatory. + +E: Fix ttm electronic_thermal_conductivity must be >= 0.0 + +Self-explanatory. + +E: Fix ttm gamma_p must be > 0.0 + +Self-explanatory. + +E: Fix ttm gamma_s must be >= 0.0 + +Self-explanatory. + +E: Fix ttm v_0 must be >= 0.0 + +Self-explanatory. + +E: Fix ttm number of nodes must be > 0 + +Self-explanatory. + +E: Cannot use fix ttm with 2d simulation + +This is a current restriction of this fix due to the grid it creates. + +E: Cannot use non-periodic boundares with fix ttm + +This fix requires a fully periodic simulation box. + +E: Cannot use fix ttm with triclinic box + +This is a current restriction of this fix due to the grid it creates. + +E: Electronic temperature dropped below zero + +Something has gone wrong with the fix ttm electron temperature model. + +E: Fix ttm electron temperatures must be > 0.0 + +Self-explanatory. + +E: Initial temperatures not all set in fix ttm + +Self-explanatory. + +W: Too many inner timesteps in fix ttm + +Self-explanatory. + +*/ diff --git a/src/fix.h b/src/fix.h index 251c286ec0..a48c4eeb6a 100644 --- a/src/fix.h +++ b/src/fix.h @@ -205,6 +205,11 @@ class Fix : protected Pointers { virtual int pack_reverse_comm(int, int, double *) { return 0; } virtual void unpack_reverse_comm(int, int *, double *) {} + virtual void pack_forward_grid(int, void *, int, int *) {}; + virtual void unpack_forward_grid(int, void *, int, int *) {}; + virtual void pack_reverse_grid(int, void *, int, int *) {}; + virtual void unpack_reverse_grid(int, void *, int, int *) {}; + virtual double compute_scalar() { return 0.0; } virtual double compute_vector(int) { return 0.0; } virtual double compute_array(int, int) { return 0.0; } diff --git a/src/KSPACE/gridcomm.cpp b/src/gridcomm.cpp similarity index 91% rename from src/KSPACE/gridcomm.cpp rename to src/gridcomm.cpp index e37555080d..1edba6c768 100644 --- a/src/KSPACE/gridcomm.cpp +++ b/src/gridcomm.cpp @@ -18,11 +18,13 @@ #include "error.h" #include "irregular.h" #include "kspace.h" +#include "fix.h" #include "memory.h" using namespace LAMMPS_NS; enum{REGULAR,TILED}; +enum{KSPACE,FIX}; #define DELTA 16 @@ -164,10 +166,14 @@ GridComm::~GridComm() void GridComm::initialize(MPI_Comm gcomm, int gnx, int gny, int gnz, - int ixlo, int ixhi, int iylo, int iyhi, int izlo, int izhi, - int oxlo, int oxhi, int oylo, int oyhi, int ozlo, int ozhi, - int fxlo, int fxhi, int fylo, int fyhi, int fzlo, int fzhi, - int pxlo, int pxhi, int pylo, int pyhi, int pzlo, int pzhi) + int ixlo, int ixhi, int iylo, int iyhi, + int izlo, int izhi, + int oxlo, int oxhi, int oylo, int oyhi, + int ozlo, int ozhi, + int fxlo, int fxhi, int fylo, int fyhi, + int fzlo, int fzhi, + int pxlo, int pxhi, int pylo, int pyhi, + int pzlo, int pzhi) { gridcomm = gcomm; MPI_Comm_rank(gridcomm,&me); @@ -926,31 +932,43 @@ int GridComm::ghost_adjacent_tiled() forward comm of my owned cells to other's ghost cells ------------------------------------------------------------------------- */ -void GridComm::forward_comm_kspace(KSpace *kspace, int nper, int nbyte, int which, - void *buf1, void *buf2, MPI_Datatype datatype) +void GridComm::forward_comm(int caller, void *ptr, int nper, int nbyte, int which, + void *buf1, void *buf2, MPI_Datatype datatype) { - if (layout == REGULAR) - forward_comm_kspace_regular(kspace,nper,nbyte,which,buf1,buf2,datatype); - else - forward_comm_kspace_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype); + if (layout == REGULAR) { + if (caller == KSPACE) + forward_comm_regular((KSpace *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + else if (caller == FIX) + forward_comm_regular((Fix *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + } else { + if (caller == KSPACE) + forward_comm_tiled((KSpace *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + else if (caller == FIX) + forward_comm_tiled((Fix *)ptr,nper,nbyte, + which,buf1,buf2,datatype); + } } /* ---------------------------------------------------------------------- forward comm on regular grid of procs via list of swaps with 6 neighbor procs ------------------------------------------------------------------------- */ +template < class T > void GridComm:: -forward_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, - void *buf1, void *buf2, MPI_Datatype datatype) +forward_comm_regular(T *ptr, int nper, int /*nbyte*/, int which, + void *buf1, void *buf2, MPI_Datatype datatype) { int m; MPI_Request request; for (m = 0; m < nswap; m++) { if (swap[m].sendproc == me) - kspace->pack_forward_grid(which,buf2,swap[m].npack,swap[m].packlist); + ptr->pack_forward_grid(which,buf2,swap[m].npack,swap[m].packlist); else - kspace->pack_forward_grid(which,buf1,swap[m].npack,swap[m].packlist); + ptr->pack_forward_grid(which,buf1,swap[m].npack,swap[m].packlist); if (swap[m].sendproc != me) { if (swap[m].nunpack) MPI_Irecv(buf2,nper*swap[m].nunpack,datatype, @@ -960,7 +978,7 @@ forward_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, if (swap[m].nunpack) MPI_Wait(&request,MPI_STATUS_IGNORE); } - kspace->unpack_forward_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist); + ptr->unpack_forward_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist); } } @@ -968,9 +986,10 @@ forward_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, forward comm on tiled grid decomp via Send/Recv lists of each neighbor proc ------------------------------------------------------------------------- */ +template < class T > void GridComm:: -forward_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, - void *buf1, void *vbuf2, MPI_Datatype datatype) +forward_comm_tiled(T *ptr, int nper, int nbyte, int which, + void *buf1, void *vbuf2, MPI_Datatype datatype) { int i,m,offset; @@ -987,15 +1006,15 @@ forward_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, // perform all sends to other procs for (m = 0; m < nsend; m++) { - kspace->pack_forward_grid(which,buf1,send[m].npack,send[m].packlist); + ptr->pack_forward_grid(which,buf1,send[m].npack,send[m].packlist); MPI_Send(buf1,nper*send[m].npack,datatype,send[m].proc,0,gridcomm); } // perform all copies to self for (m = 0; m < ncopy; m++) { - kspace->pack_forward_grid(which,buf1,copy[m].npack,copy[m].packlist); - kspace->unpack_forward_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist); + ptr->pack_forward_grid(which,buf1,copy[m].npack,copy[m].packlist); + ptr->unpack_forward_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist); } // unpack all received data @@ -1003,8 +1022,8 @@ forward_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, for (i = 0; i < nrecv; i++) { MPI_Waitany(nrecv,requests,&m,MPI_STATUS_IGNORE); offset = nper * recv[m].offset * nbyte; - kspace->unpack_forward_grid(which,(void *) &buf2[offset], - recv[m].nunpack,recv[m].unpacklist); + ptr->unpack_forward_grid(which,(void *) &buf2[offset], + recv[m].nunpack,recv[m].unpacklist); } } @@ -1012,31 +1031,43 @@ forward_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, reverse comm of my ghost cells to sum to owner cells ------------------------------------------------------------------------- */ -void GridComm::reverse_comm_kspace(KSpace *kspace, int nper, int nbyte, int which, - void *buf1, void *buf2, MPI_Datatype datatype) +void GridComm::reverse_comm(int caller, void *ptr, int nper, int nbyte, int which, + void *buf1, void *buf2, MPI_Datatype datatype) { - if (layout == REGULAR) - reverse_comm_kspace_regular(kspace,nper,nbyte,which,buf1,buf2,datatype); - else - reverse_comm_kspace_tiled(kspace,nper,nbyte,which,buf1,buf2,datatype); + if (layout == REGULAR) { + if (caller == KSPACE) + reverse_comm_regular((KSpace *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + else if (caller == FIX) + reverse_comm_regular((Fix *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + } else { + if (caller == KSPACE) + reverse_comm_tiled((KSpace *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + else if (caller == FIX) + reverse_comm_tiled((Fix *)ptr,nper,nbyte,which, + buf1,buf2,datatype); + } } /* ---------------------------------------------------------------------- reverse comm on regular grid of procs via list of swaps with 6 neighbor procs ------------------------------------------------------------------------- */ +template < class T > void GridComm:: -reverse_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, - void *buf1, void *buf2, MPI_Datatype datatype) +reverse_comm_regular(T *ptr, int nper, int /*nbyte*/, int which, + void *buf1, void *buf2, MPI_Datatype datatype) { int m; MPI_Request request; for (m = nswap-1; m >= 0; m--) { if (swap[m].recvproc == me) - kspace->pack_reverse_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist); + ptr->pack_reverse_grid(which,buf2,swap[m].nunpack,swap[m].unpacklist); else - kspace->pack_reverse_grid(which,buf1,swap[m].nunpack,swap[m].unpacklist); + ptr->pack_reverse_grid(which,buf1,swap[m].nunpack,swap[m].unpacklist); if (swap[m].recvproc != me) { if (swap[m].npack) MPI_Irecv(buf2,nper*swap[m].npack,datatype, @@ -1046,7 +1077,7 @@ reverse_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, if (swap[m].npack) MPI_Wait(&request,MPI_STATUS_IGNORE); } - kspace->unpack_reverse_grid(which,buf2,swap[m].npack,swap[m].packlist); + ptr->unpack_reverse_grid(which,buf2,swap[m].npack,swap[m].packlist); } } @@ -1054,9 +1085,10 @@ reverse_comm_kspace_regular(KSpace *kspace, int nper, int /*nbyte*/, int which, reverse comm on tiled grid decomp via Send/Recv lists of each neighbor proc ------------------------------------------------------------------------- */ +template < class T > void GridComm:: -reverse_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, - void *buf1, void *vbuf2, MPI_Datatype datatype) +reverse_comm_tiled(T *ptr, int nper, int nbyte, int which, + void *buf1, void *vbuf2, MPI_Datatype datatype) { int i,m,offset; @@ -1073,15 +1105,15 @@ reverse_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, // perform all sends to other procs for (m = 0; m < nrecv; m++) { - kspace->pack_reverse_grid(which,buf1,recv[m].nunpack,recv[m].unpacklist); + ptr->pack_reverse_grid(which,buf1,recv[m].nunpack,recv[m].unpacklist); MPI_Send(buf1,nper*recv[m].nunpack,datatype,recv[m].proc,0,gridcomm); } // perform all copies to self for (m = 0; m < ncopy; m++) { - kspace->pack_reverse_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist); - kspace->unpack_reverse_grid(which,buf1,copy[m].npack,copy[m].packlist); + ptr->pack_reverse_grid(which,buf1,copy[m].nunpack,copy[m].unpacklist); + ptr->unpack_reverse_grid(which,buf1,copy[m].npack,copy[m].packlist); } // unpack all received data @@ -1089,8 +1121,8 @@ reverse_comm_kspace_tiled(KSpace *kspace, int nper, int nbyte, int which, for (i = 0; i < nsend; i++) { MPI_Waitany(nsend,requests,&m,MPI_STATUS_IGNORE); offset = nper * send[m].offset * nbyte; - kspace->unpack_reverse_grid(which,(void *) &buf2[offset], - send[m].npack,send[m].packlist); + ptr->unpack_reverse_grid(which,(void *) &buf2[offset], + send[m].npack,send[m].packlist); } } diff --git a/src/KSPACE/gridcomm.h b/src/gridcomm.h similarity index 91% rename from src/KSPACE/gridcomm.h rename to src/gridcomm.h index 03379bde99..4446724dc4 100644 --- a/src/KSPACE/gridcomm.h +++ b/src/gridcomm.h @@ -27,8 +27,8 @@ class GridComm : protected Pointers { virtual ~GridComm(); void setup(int &, int &); int ghost_adjacent(); - void forward_comm_kspace(class KSpace *, int, int, int, void *, void *, MPI_Datatype); - void reverse_comm_kspace(class KSpace *, int, int, int, void *, void *, MPI_Datatype); + void forward_comm(int, void *, int, int, int, void *, void *, MPI_Datatype); + void reverse_comm(int, void *, int, int, int, void *, void *, MPI_Datatype); protected: int me, nprocs; @@ -181,10 +181,14 @@ class GridComm : protected Pointers { int ghost_adjacent_regular(); int ghost_adjacent_tiled(); - void forward_comm_kspace_regular(class KSpace *, int, int, int, void *, void *, MPI_Datatype); - void forward_comm_kspace_tiled(class KSpace *, int, int, int, void *, void *, MPI_Datatype); - void reverse_comm_kspace_regular(class KSpace *, int, int, int, void *, void *, MPI_Datatype); - void reverse_comm_kspace_tiled(class KSpace *, int, int, int, void *, void *, MPI_Datatype); + template + void forward_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype); + template + void forward_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype); + template + void reverse_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype); + template + void reverse_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype); virtual void grow_swap(); void grow_overlap(); From 26127e1fa030f8734a8bbd8d591c3c4392054bf0 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 9 Jun 2021 15:49:20 -0600 Subject: [PATCH 002/437] more changes to fix ttm/grid --- src/MISC/fix_ttm.cpp | 273 ++++++----------- src/MISC/fix_ttm.h | 14 +- src/MISC/fix_ttm_grid.cpp | 595 +++++++++++++++++++------------------- src/MISC/fix_ttm_grid.h | 17 +- 4 files changed, 397 insertions(+), 502 deletions(-) diff --git a/src/MISC/fix_ttm.cpp b/src/MISC/fix_ttm.cpp index c5e7d07429..fcecced4ef 100644 --- a/src/MISC/fix_ttm.cpp +++ b/src/MISC/fix_ttm.cpp @@ -37,18 +37,18 @@ using namespace LAMMPS_NS; using namespace FixConst; #define MAXLINE 1024 +#define OFFSET 16384 /* ---------------------------------------------------------------------- */ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - random(nullptr), fp(nullptr), nsum(nullptr), nsum_all(nullptr), + random(nullptr), gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), flangevin(nullptr), - T_electron(nullptr), T_electron_old(nullptr), sum_vsq(nullptr), sum_mass_vsq(nullptr), - sum_vsq_all(nullptr), sum_mass_vsq_all(nullptr), net_energy_transfer(nullptr), - net_energy_transfer_all(nullptr) + T_electron(nullptr), T_electron_old(nullptr), + net_energy_transfer(nullptr), net_energy_transfer_all(nullptr) { - if (narg < 15) error->all(FLERR,"Illegal fix ttm command"); + if (narg != 14) error->all(FLERR,"Illegal fix ttm command"); vector_flag = 1; size_vector = 2; @@ -68,17 +68,10 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : nxnodes = utils::inumeric(FLERR,arg[10],false,lmp); nynodes = utils::inumeric(FLERR,arg[11],false,lmp); nznodes = utils::inumeric(FLERR,arg[12],false,lmp); - nfileevery = utils::inumeric(FLERR,arg[14],false,lmp); - if (nfileevery) { - if (narg != 16) error->all(FLERR,"Illegal fix ttm command"); - if (comm->me == 0) { - fp = fopen(arg[15],"w"); - if (fp == nullptr) - error->one(FLERR,"Cannot open output file {}: {}", - arg[15], utils::getsyserror()); - } - } + int n = strlen(arg[13]) + 1; + infile = new char[n]; + strcpy(infile,arg[13]); // error check @@ -113,10 +106,6 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : if (total_nnodes > MAXSMALLINT) error->all(FLERR,"Too many nodes in fix ttm"); - // allocate 3d grid variables - - allocate_grid(); - // allocate per-atom flangevin and zero it // NOTE: is init to zero necessary? @@ -134,16 +123,35 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); + deallocate_flag = 0; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::post_constructor() +{ + // allocate 3d grid variables + + allocate_grid(); + + // zero net_energy_transfer + // in case compute_vector accesses it on timestep 0 + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + net_energy_transfer_all[ixnode][iynode][iznode] = 0; + // set initial electron temperatures from user input file - read_initial_electron_temperatures(arg[13]); + read_electron_temperatures(infile); } /* ---------------------------------------------------------------------- */ FixTTM::~FixTTM() { - if (fp) fclose(fp); + delete [] infile; delete random; @@ -152,7 +160,7 @@ FixTTM::~FixTTM() memory->destroy(flangevin); - deallocate_grid(); + if (!deallocate_flag) deallocate_grid(); } /* ---------------------------------------------------------------------- */ @@ -187,10 +195,6 @@ void FixTTM::init() if (utils::strmatch(update->integrate_style,"^respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; - - // initialize grid quantities - - init_grid(); } /* ---------------------------------------------------------------------- */ @@ -242,13 +246,12 @@ void FixTTM::post_force(int /*vflag*/) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; - int ixnode = static_cast(xscale*nxnodes); - int iynode = static_cast(yscale*nynodes); - int iznode = static_cast(zscale*nznodes); + int ixnode = static_cast(xscale*nxnodes + OFFSET) - OFFSET; + int iynode = static_cast(yscale*nynodes + OFFSET) - OFFSET; + int iznode = static_cast(zscale*nznodes + OFFSET) - OFFSET; while (ixnode > nxnodes-1) ixnode -= nxnodes; while (iynode > nynodes-1) iynode -= nynodes; while (iznode > nznodes-1) iznode -= nznodes; @@ -313,9 +316,9 @@ void FixTTM::end_of_step() double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; - int ixnode = static_cast(xscale*nxnodes); - int iynode = static_cast(yscale*nynodes); - int iznode = static_cast(zscale*nznodes); + int ixnode = static_cast(xscale*nxnodes + OFFSET) - OFFSET; + int iynode = static_cast(yscale*nynodes + OFFSET) - OFFSET; + int iznode = static_cast(zscale*nznodes + OFFSET) - OFFSET; while (ixnode > nxnodes-1) ixnode -= nxnodes; while (iynode > nynodes-1) iynode -= nynodes; while (iznode > nznodes-1) iznode -= nznodes; @@ -395,76 +398,66 @@ void FixTTM::end_of_step() (net_energy_transfer_all[ixnode][iynode][iznode])/del_vol); } } +} - // output nodal temperatures for current timestep +/* ---------------------------------------------------------------------- + read in initial electron temperatures from a user-specified file + only called by proc 0 +------------------------------------------------------------------------- */ - if ((nfileevery) && !(update->ntimestep % nfileevery)) { +void FixTTM::read_electron_temperatures(const char *filename) +{ + int ***T_initial_set; + memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); + memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); - // compute atomic Ta for each grid point + std::string name = utils::get_potential_file_path(filename); + if (name.empty()) + error->one(FLERR,"Cannot open input file: {}", + filename); + FILE *fp = fopen(name.c_str(),"r"); - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - nsum[ixnode][iynode][iznode] = 0; - nsum_all[ixnode][iynode][iznode] = 0; - sum_vsq[ixnode][iynode][iznode] = 0.0; - sum_mass_vsq[ixnode][iynode][iznode] = 0.0; - sum_vsq_all[ixnode][iynode][iznode] = 0.0; - sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0; - } + // read initial electron temperature values from file - double massone; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - if (rmass) massone = rmass[i]; - else massone = mass[type[i]]; - double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; - double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; - double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; - int ixnode = static_cast(xscale*nxnodes); - int iynode = static_cast(yscale*nynodes); - int iznode = static_cast(zscale*nznodes); - while (ixnode > nxnodes-1) ixnode -= nxnodes; - while (iynode > nynodes-1) iynode -= nynodes; - while (iznode > nznodes-1) iznode -= nznodes; - while (ixnode < 0) ixnode += nxnodes; - while (iynode < 0) iynode += nynodes; - while (iznode < 0) iznode += nznodes; - double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; - nsum[ixnode][iynode][iznode] += 1; - sum_vsq[ixnode][iynode][iznode] += vsq; - sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq; - } + char line[MAXLINE]; + int ixnode,iynode,iznode; + double T_tmp; + while (1) { + if (fgets(line,MAXLINE,fp) == nullptr) break; + ValueTokenizer values(line); + if (values.has_next()) ixnode = values.next_int(); + if (values.has_next()) iynode = values.next_int(); + if (values.has_next()) iznode = values.next_int(); + if (values.has_next()) T_tmp = values.next_double(); + else error->one(FLERR,"Incorrect format in fix ttm input file"); - MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes, - MPI_INT,MPI_SUM,world); - MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes, - MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0], - total_nnodes,MPI_DOUBLE,MPI_SUM,world); + // check correctness of input data - if (comm->me == 0) { - fmt::print(fp,"{}",update->ntimestep); + if ((ixnode < 0) || (ixnode >= nxnodes) + || (iynode < 0) || (iynode >= nynodes) + || (iznode < 0) || (iznode >= nznodes)) + error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); - double T_a; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - T_a = 0; - if (nsum_all[ixnode][iynode][iznode] > 0) - T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/ - (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); - fmt::print(fp," {}",T_a); - } + if (T_tmp < 0.0) + error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); - fputs("\t",fp); - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]); - fputs("\n",fp); - } + T_electron[ixnode][iynode][iznode] = T_tmp; + T_initial_set[ixnode][iynode][iznode] = 1; } + + fclose(fp); + + // check completeness of input data + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + if (T_initial_set[ixnode][iynode][iznode] == 0) + error->one(FLERR,"Initial temperatures not all set in fix ttm"); + + memory->destroy(T_initial_set); + + MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); } /* ---------------------------------------------------------------------- */ @@ -621,10 +614,7 @@ double FixTTM::memory_usage() { double bytes = 0.0; bytes += (double)atom->nmax * 3 * sizeof(double); - - bytes += (double)5*total_nnodes * sizeof(int); - bytes += (double)14*total_nnodes * sizeof(double); - + bytes += (double)4*total_nnodes * sizeof(int); return bytes; } @@ -634,31 +624,12 @@ double FixTTM::memory_usage() void FixTTM::allocate_grid() { - memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum"); - memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all"); - memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq"); - memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); - memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all"); - memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes, - "ttm:sum_mass_vsq_all"); memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old"); memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron"); memory->create(net_energy_transfer,nxnodes,nynodes,nznodes, - "TTM:net_energy_transfer"); + "ttm:net_energy_transfer"); memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes, - "TTM:net_energy_transfer_all"); -} - -/* ---------------------------------------------------------------------- - initialize 3d grid quantities -------------------------------------------------------------------------- */ - -void FixTTM::init_grid() -{ - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - net_energy_transfer_all[ixnode][iynode][iznode] = 0; + "ttm:net_energy_transfer_all"); } /* ---------------------------------------------------------------------- @@ -667,74 +638,8 @@ void FixTTM::init_grid() void FixTTM::deallocate_grid() { - memory->destroy(nsum); - memory->destroy(nsum_all); - memory->destroy(sum_vsq); - memory->destroy(sum_mass_vsq); - memory->destroy(sum_vsq_all); - memory->destroy(sum_mass_vsq_all); memory->destroy(T_electron_old); memory->destroy(T_electron); - memory->destroy(flangevin); memory->destroy(net_energy_transfer); memory->destroy(net_energy_transfer_all); } - -/* ---------------------------------------------------------------------- - read in initial electron temperatures from a user-specified file - only called by proc 0 -------------------------------------------------------------------------- */ - -void FixTTM::read_initial_electron_temperatures(const char *filename) -{ - int ***T_initial_set; - memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); - memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); - - std::string name = utils::get_potential_file_path(filename); - if (name.empty()) - error->one(FLERR,"Cannot open input file: {}", - filename); - FILE *fpr = fopen(name.c_str(),"r"); - - // read initial electron temperature values from file - - char line[MAXLINE]; - int ixnode,iynode,iznode; - double T_tmp; - while (1) { - if (fgets(line,MAXLINE,fpr) == nullptr) break; - ValueTokenizer values(line); - if (values.has_next()) ixnode = values.next_int(); - if (values.has_next()) iynode = values.next_int(); - if (values.has_next()) iznode = values.next_int(); - if (values.has_next()) T_tmp = values.next_double(); - else error->one(FLERR,"Incorrect format in fix ttm input file"); - - // check correctness of input data - - if ((ixnode < 0) || (ixnode >= nxnodes) - || (iynode < 0) || (iynode >= nynodes) - || (iznode < 0) || (iznode >= nznodes)) - error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); - - if (T_tmp < 0.0) - error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); - - T_electron[ixnode][iynode][iznode] = T_tmp; - T_initial_set[ixnode][iynode][iznode] = 1; - } - fclose(fpr); - - // check completeness of input data - - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - if (T_initial_set[ixnode][iynode][iznode] == 0) - error->one(FLERR,"Initial temperatures not all set in fix ttm"); - - memory->destroy(T_initial_set); - - MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); -} diff --git a/src/MISC/fix_ttm.h b/src/MISC/fix_ttm.h index 82dd4964c8..5773582d29 100644 --- a/src/MISC/fix_ttm.h +++ b/src/MISC/fix_ttm.h @@ -28,6 +28,7 @@ class FixTTM : public Fix { public: FixTTM(class LAMMPS *, int, char **); virtual ~FixTTM(); + virtual void post_constructor(); int setmask(); void init(); void setup(int); @@ -48,27 +49,24 @@ class FixTTM : public Fix { virtual double memory_usage(); protected: - int nfileevery; int nlevels_respa; int seed; - class RanMars *random; - FILE *fp; int nxnodes, nynodes, nznodes; bigint total_nnodes; - int ***nsum, ***nsum_all; + int deallocate_flag; + + class RanMars *random; + char *infile; double *gfactor1, *gfactor2, *ratio, **flangevin; double ***T_electron, ***T_electron_old; - double ***sum_vsq, ***sum_mass_vsq; - double ***sum_vsq_all, ***sum_mass_vsq_all; double ***net_energy_transfer, ***net_energy_transfer_all; double electronic_specific_heat, electronic_density; double electronic_thermal_conductivity; double gamma_p, gamma_s, v_0, v_0_sq; virtual void allocate_grid(); - virtual void init_grid(); virtual void deallocate_grid(); - virtual void read_initial_electron_temperatures(const char *); + virtual void read_electron_temperatures(const char *); }; } // namespace LAMMPS_NS diff --git a/src/MISC/fix_ttm_grid.cpp b/src/MISC/fix_ttm_grid.cpp index eb0d376db8..223ea6240a 100644 --- a/src/MISC/fix_ttm_grid.cpp +++ b/src/MISC/fix_ttm_grid.cpp @@ -32,15 +32,13 @@ #include "memory.h" #include "error.h" -#include "tokenizer.h" - using namespace LAMMPS_NS; using namespace FixConst; -#define MAXLINE 1024 -#define OFFSET 16384 +static constexpr int MAXLINE = 256; +static constexpr int CHUNK = 1024; -enum{T_ELECTRON,NET_ENERGY_TRANSFER,DSUM,SUM_VSQ,SUM_MASS_VSQ}; +#define OFFSET 16384 /* ---------------------------------------------------------------------- */ @@ -49,9 +47,37 @@ FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ +FixTTMGrid::~FixTTMGrid() +{ + deallocate_grid(); + deallocate_flag = 1; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMGrid::post_constructor() +{ + // allocate 3d grid variables + + allocate_grid(); + + // zero net_energy_transfer + // in case compute_vector accesses it on timestep 0 + + memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, + ngridout*sizeof(double)); + + // set initial electron temperatures from user input file + + read_electron_temperatures(infile); +} + +/* ---------------------------------------------------------------------- */ + void FixTTMGrid::post_force(int /*vflag*/) { int ix,iy,iz; + double gamma1,gamma2; double **x = atom->x; double **v = atom->v; @@ -60,9 +86,10 @@ void FixTTMGrid::post_force(int /*vflag*/) int *mask = atom->mask; int nlocal = atom->nlocal; - double gamma1,gamma2; - double *boxlo = domain->boxlo; + double dxinv = nxnodes/domain->xprd; + double dyinv = nxnodes/domain->yprd; + double dzinv = nxnodes/domain->zprd; // apply damping and thermostat to all atoms in fix group @@ -71,19 +98,20 @@ void FixTTMGrid::post_force(int /*vflag*/) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - ix = static_cast ((x[i][0]-boxlo[0])*delxinv + shift) - OFFSET; - iy = static_cast ((x[i][1]-boxlo[1])*delyinv + shift) - OFFSET; - iz = static_cast ((x[i][2]-boxlo[2])*delzinv + shift) - OFFSET; + ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET; - if (T_electron[ix][iy][iz] < 0) - error->all(FLERR,"Electronic temperature dropped below zero"); + // flag if ix,iy,iz is not within my ghost cell range - // check that ix,iy,iz is within my ghost cell range + if (ix < nxlo_out || ix > nxhi_out || + iy < nylo_out || iy > nyhi_out || + iz < nzlo_out || iz > nzhi_out) { + flag = 1; + continue; + } - if (ix < nxlo_out || ix > nxhi_out || iy < nylo_out || iy > nyhi_out || - iz < nzlo_out || iz > nzhi_out) flag = 1; - - double tsqrt = sqrt(T_electron[ix][iy][iz]); + double tsqrt = sqrt(T_electron[iz][iy][ix]); gamma1 = gfactor1[type[i]]; double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; @@ -112,33 +140,30 @@ void FixTTMGrid::end_of_step() double **x = atom->x; double **v = atom->v; double *mass = atom->mass; - double *rmass = atom->rmass; int *type = atom->type; int *mask = atom->mask; int nlocal = atom->nlocal; double *boxlo = domain->boxlo; + double dxinv = nxnodes/domain->xprd; + double dyinv = nxnodes/domain->yprd; + double dzinv = nxnodes/domain->zprd; + double volgrid = 1.0 / (dxinv*dyinv*dzinv); memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, ngridout*sizeof(double)); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - ix = static_cast ((x[i][0]-boxlo[0])*delxinv+shift) - OFFSET; - iy = static_cast ((x[i][1]-boxlo[1])*delyinv+shift) - OFFSET; - iz = static_cast ((x[i][2]-boxlo[2])*delzinv+shift) - OFFSET; - net_energy_transfer[ix][iy][iz] += + ix = static_cast ((x[i][0]-boxlo[0])*dxinv+shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*dyinv+shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*dzinv+shift) - OFFSET; + net_energy_transfer[iz][iy][ix] += (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + flangevin[i][2]*v[i][2]); } - gc->reverse_comm(1,this,1,sizeof(double),NET_ENERGY_TRANSFER, - gc_buf1,gc_buf2,MPI_DOUBLE); - - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; - double del_vol = dx*dy*dz; + gc->reverse_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); // num_inner_timesteps = # of inner steps (thermal solves) // required this MD step to maintain a stable explicit solve @@ -148,17 +173,19 @@ void FixTTMGrid::end_of_step() double stability_criterion = 1.0 - 2.0*inner_dt/(electronic_specific_heat*electronic_density) * - (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + (electronic_thermal_conductivity*(dxinv*dxinv + dyinv*dyinv + dzinv*dzinv)); if (stability_criterion < 0.0) { inner_dt = 0.5*(electronic_specific_heat*electronic_density) / - (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + (electronic_thermal_conductivity*(dxinv*dxinv + dyinv*dyinv + dzinv*dzinv)); num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; inner_dt = update->dt/double(num_inner_timesteps); if (num_inner_timesteps > 1000000) error->warning(FLERR,"Too many inner timesteps in fix ttm/grid"); } + // finite difference iterations to update T_electron + for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; ith_inner_timestep++) { @@ -170,89 +197,152 @@ void FixTTMGrid::end_of_step() for (iz = nzlo_in; iz <= nzhi_in; iz++) for (iy = nylo_in; iy <= nyhi_in; iy++) for (ix = nxlo_in; ix <= nxhi_in; ix++) { - T_electron[ix][iy][iz] = - T_electron_old[ix][iy][iz] + + T_electron[iz][iy][ix] = + T_electron_old[iz][iy][ix] + inner_dt/(electronic_specific_heat*electronic_density) * (electronic_thermal_conductivity * - ((T_electron_old[ix-1][iy][iz] + T_electron_old[ix+1][iy][iz] - - 2*T_electron_old[ix][iy][iz])/dx/dx + - (T_electron_old[ix][iy-1][iz] + T_electron_old[ix][iy+1][iz] - - 2*T_electron_old[ix][iy][iz])/dy/dy + - (T_electron_old[ix][iy][iz-1] + T_electron_old[ix][iy][iz+1] - - 2*T_electron_old[ix][iy][iz])/dz/dz) - + ((T_electron_old[iz][iy][ix-1] + T_electron_old[iz][iy][ix+1] - + 2*T_electron_old[iz][iy][ix])*dxinv*dxinv + + (T_electron_old[iz][iy-1][ix] + T_electron_old[iz][iy+1][ix] - + 2*T_electron_old[iz][iy][ix])*dyinv*dyinv + + (T_electron_old[iz-1][iy][ix] + T_electron_old[iz+1][iy][ix] - + 2*T_electron_old[iz][iy][ix])*dzinv*dzinv) - - net_energy_transfer_all[ix][iy][iz]/del_vol); + net_energy_transfer[iz][iy][ix]/volgrid); } } - // comm new T_electron to ghost grid points + // check that all temperatures are >= 0.0 - gc->forward_comm(1,this,1,sizeof(double),T_ELECTRON, - gc_buf1,gc_buf2,MPI_DOUBLE); + int flag = 0; - // output nodal temperatures for current timestep + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + if (T_electron[iz][iy][ix] < 0.0) flag = 1; - if ((nfileevery) && !(update->ntimestep % nfileevery)) { + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + if (flagall) + error->all(FLERR,"Fix ttm electron temperature became negative"); - // compute atomic Ta for each grid point + // communicate new T_electron values to ghost grid points - memset(&dsum[nzlo_out][nylo_out][nxlo_out],0, - ngridout*sizeof(double)); - memset(&sum_vsq[nzlo_out][nylo_out][nxlo_out],0, - ngridout*sizeof(double)); - memset(&sum_mass_vsq[nzlo_out][nylo_out][nxlo_out],0, - ngridout*sizeof(double)); + gc->forward_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); - double massone; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - if (rmass) massone = rmass[i]; - else massone = mass[type[i]]; - double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + // assign electron temperature to each atom for fix output - ix = static_cast ((x[i][0]-boxlo[0])*delxinv+shift) - OFFSET; - iy = static_cast ((x[i][1]-boxlo[1])*delyinv+shift) - OFFSET; - iz = static_cast ((x[i][2]-boxlo[2])*delzinv+shift) - OFFSET; - dsum[ix][iy][iz] += 1.0; - sum_vsq[ix][iy][iz] += vsq; - sum_mass_vsq[ix][iy][iz] += massone*vsq; - } +} - // can GridComm work on a larger struct of several values? +/* ---------------------------------------------------------------------- + read electron temperatures on grid from a user-specified file + proc 0 reads one chunk at a time, broadcasts to other procs + each proc stores values for grid points it owns +------------------------------------------------------------------------- */ - gc->reverse_comm(1,this,1,sizeof(double),DSUM, - gc_buf1,gc_buf2,MPI_DOUBLE); - gc->reverse_comm(1,this,1,sizeof(double),SUM_VSQ, - gc_buf1,gc_buf2,MPI_DOUBLE); - gc->reverse_comm(1,this,1,sizeof(double),SUM_MASS_VSQ, - gc_buf1,gc_buf2,MPI_DOUBLE); - - // NOTE: should this be a write function, work with parallel pings +void FixTTMGrid::read_electron_temperatures(const char *filename) +{ + int i,j,ix,iy,iz,nchunk,eof; - if (comm->me == 0) { - fmt::print(fp,"{}",update->ntimestep); + int me = comm->me; - double T_a; - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) { - T_a = 0; - if (dsum[ix][iy][iz] > 0) - T_a = sum_mass_vsq[ix][iy][iz] / - (3.0*force->boltz*dsum[ix][iy][iz]/force->mvv2e); - fmt::print(fp," {}",T_a); - } + // initialize my own+ghost grid values to zero - fputs("\t",fp); - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) - fmt::print(fp," {}",T_electron[ix][iy][iz]); - fputs("\n",fp); - } + memset(&T_electron[nzlo_out][nylo_out][nxlo_out],0,ngridout*sizeof(double)); + + // proc 0 opens file + + FILE *fp = nullptr; + + if (me == 0) { + std::string name = utils::get_potential_file_path(filename); + if (name.empty()) error->one(FLERR,"Cannot open input file: {}",filename); + fp = fopen(name.c_str(),"r"); } + + // read electron temperature values from file, one chunk at a time + + char **values = new char*[4]; + char *buffer = new char[CHUNK*MAXLINE]; + bigint ntotal = (bigint) nxnodes * nynodes * nznodes; + bigint nread = 0; + char *buf,*next; + + while (nread < ntotal) { + nchunk = MIN(ntotal-nread,CHUNK); + eof = utils::read_lines_from_file(fp,nchunk,MAXLINE,buffer,me,world); + if (eof) error->all(FLERR,"Unexpected end of data file"); + + buf = buffer; + next = strchr(buf,'\n'); + *next = '\0'; + int nwords = utils::trim_and_count_words(buf); + *next = '\n'; + + if (nwords != 4) error->all(FLERR,"Incorrect format in fix ttm data file"); + + // loop over lines of grid point values + // tokenize the line into ix,iy,iz grid index plus temperature value + // if I own grid point, store the value + + for (i = 0; i < nchunk; i++) { + next = strchr(buf,'\n'); + + for (j = 0; j < nwords; j++) { + buf += strspn(buf," \t\n\r\f"); + buf[strcspn(buf," \t\n\r\f")] = '\0'; + values[j] = buf; + buf += strlen(buf)+1; + } + + ix = utils::inumeric(FLERR,values[0],false,lmp); + iy = utils::inumeric(FLERR,values[1],false,lmp); + iz = utils::inumeric(FLERR,values[2],false,lmp); + + if (ix < 0 || ix >= nxnodes || iy < 0 || iy >= nynodes || + iz < 0 || iz >= nznodes) + error->all(FLERR,"Fix ttm/grid invalid node index in input"); + + if (ix >= nxlo_in && ix <= nxhi_in && + iy >= nylo_in && iy <= nyhi_in && + iz >= nzlo_in && iz <= nzhi_in) + T_electron[iz][iy][ix] = utils::numeric(FLERR,values[3],true,lmp); + + buf = next + 1; + } + + nread += nchunk; + } + + // close file + + if (me == 0) fclose(fp); + + // clean up + + delete [] values; + delete [] buffer; + + // check that all owned temperature values are > 0.0 + + int flag = 0; + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + if (T_electron[iz][iy][ix] <= 0.0) flag = 1; + + int flagall; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); + if (flagall) + error->all(FLERR, + "Fix ttm infile did not set all temperatures or some are <= 0.0"); + + // communicate new T_electron values to ghost grid points + + gc->forward_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); } /* ---------------------------------------------------------------------- @@ -262,10 +352,7 @@ void FixTTMGrid::end_of_step() void FixTTMGrid::pack_forward_grid(int flag, void *vbuf, int nlist, int *list) { double *buf = (double *) vbuf; - - double *src; - if (flag == T_ELECTRON) - src = &T_electron[nzlo_out][nylo_out][nxlo_out]; + double *src = &T_electron[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) buf[i] = src[list[i]]; @@ -278,10 +365,7 @@ void FixTTMGrid::pack_forward_grid(int flag, void *vbuf, int nlist, int *list) void FixTTMGrid::unpack_forward_grid(int flag, void *vbuf, int nlist, int *list) { double *buf = (double *) vbuf; - - double *dest; - if (flag == T_ELECTRON) - dest = &T_electron[nzlo_out][nylo_out][nxlo_out]; + double *dest = &T_electron[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) dest[list[i]] = buf[i]; @@ -294,16 +378,7 @@ void FixTTMGrid::unpack_forward_grid(int flag, void *vbuf, int nlist, int *list) void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list) { double *buf = (double *) vbuf; - - double *src; - if (flag == NET_ENERGY_TRANSFER) - src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; - else if (flag == DSUM) - src = &dsum[nzlo_out][nylo_out][nxlo_out]; - else if (flag == SUM_VSQ) - src = &sum_vsq[nzlo_out][nylo_out][nxlo_out]; - else if (flag == SUM_MASS_VSQ) - src = &sum_mass_vsq[nzlo_out][nylo_out][nxlo_out]; + double *src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) buf[i] = src[list[i]]; @@ -316,126 +391,12 @@ void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list) void FixTTMGrid::unpack_reverse_grid(int flag, void *vbuf, int nlist, int *list) { double *buf = (double *) vbuf; - - double *dest; - if (flag == NET_ENERGY_TRANSFER) - dest = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; - else if (flag == DSUM) - dest = &dsum[nzlo_out][nylo_out][nxlo_out]; - else if (flag == SUM_VSQ) - dest = &sum_vsq[nzlo_out][nylo_out][nxlo_out]; - else if (flag == SUM_MASS_VSQ) - dest = &sum_mass_vsq[nzlo_out][nylo_out][nxlo_out]; + double *dest = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) dest[list[i]] += buf[i]; } -/* ---------------------------------------------------------------------- - return the energy of the electronic subsystem or the net_energy transfer - between the subsystems -------------------------------------------------------------------------- */ - -double FixTTMGrid::compute_vector(int n) -{ - int ix,iy,iz; - - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; - double del_vol = dx*dy*dz; - - double e_energy_me = 0.0; - double transfer_energy_me = 0.0; - - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) { - e_energy_me += - T_electron[ix][iy][iz]*electronic_specific_heat* - electronic_density*del_vol; - transfer_energy_me += - net_energy_transfer_all[ix][iy][iz]*update->dt; - } - - // NOTE: only do allreduce once ? - double e_energy,transfer_energy; - MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world); - - if (n == 0) return e_energy; - if (n == 1) return transfer_energy; - return 0.0; -} - -/* ---------------------------------------------------------------------- - pack entire state of Fix into one write -------------------------------------------------------------------------- */ - -void FixTTMGrid::write_restart(FILE *fp) -{ - int ix,iy,iz; - - double *rlist; - memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); - - int n = 0; - rlist[n++] = seed; - - // NOTE: this is a parallel grid now, not a serial grid - - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) - rlist[n++] = T_electron[ix][iy][iz]; - - if (comm->me == 0) { - int size = n * sizeof(double); - fwrite(&size,sizeof(int),1,fp); - fwrite(rlist,sizeof(double),n,fp); - } - - memory->destroy(rlist); -} - -/* ---------------------------------------------------------------------- - use state info from restart file to restart the Fix -------------------------------------------------------------------------- */ - -void FixTTMGrid::restart(char *buf) -{ - int ix,iy,iz; - - int n = 0; - double *rlist = (double *) buf; - - // the seed must be changed from the initial seed - // NOTE: 0.5 is whacky, could go to zero - // NOTE: maybe GridComm should provide a method to pack a grid with bounds - - seed = static_cast (0.5*rlist[n++]); - - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) - T_electron[ix][iy][iz] = rlist[n++]; - - delete random; - random = new RanMars(lmp,seed+comm->me); -} - -/* ---------------------------------------------------------------------- - memory usage for flangevin and 3d grid -------------------------------------------------------------------------- */ - -double FixTTMGrid::memory_usage() -{ - double bytes = 0.0; - bytes += (double)3*atom->nmax * sizeof(double); - bytes += (double)6*ngridout * sizeof(double); - return bytes; -} - /* ---------------------------------------------------------------------- allocate 3d grid quantities ------------------------------------------------------------------------- */ @@ -473,32 +434,30 @@ void FixTTMGrid::allocate_grid() // max of these 2 quantities is the ghost cells needed in each di // nlo_out,nhi_out = nlo_in,nhi_in + ghost cells - // NOTE: need to wait until init() when neighskin is defined? - double *boxlo = domain->boxlo; double *sublo = domain->sublo; double *subhi = domain->subhi; + double dxinv = nxnodes/domain->xprd; + double dyinv = nxnodes/domain->yprd; + double dzinv = nxnodes/domain->zprd; shift = OFFSET + 0.0; // change this to 0.5 for nearest grid pt - delxinv = nxnodes/domain->xprd; - delyinv = nxnodes/domain->yprd; - delzinv = nxnodes/domain->zprd; int nlo,nhi; double cuthalf = 0.5*neighbor->skin; - nlo = static_cast ((sublo[0]-cuthalf-boxlo[0])*delxinv + shift) - OFFSET; - nhi = static_cast ((subhi[0]+cuthalf-boxlo[0])*delxinv + shift) - OFFSET; + nlo = static_cast ((sublo[0]-cuthalf-boxlo[0])*dxinv + shift) - OFFSET; + nhi = static_cast ((subhi[0]+cuthalf-boxlo[0])*dxinv + shift) - OFFSET; nxlo_out = MIN(nlo,nxlo_in-1); nxhi_out = MAX(nhi,nxhi_in+1); - nlo = static_cast ((sublo[1]-cuthalf-boxlo[1])*delyinv + shift) - OFFSET; - nhi = static_cast ((subhi[1]+cuthalf-boxlo[1])*delyinv + shift) - OFFSET; + nlo = static_cast ((sublo[1]-cuthalf-boxlo[1])*dyinv + shift) - OFFSET; + nhi = static_cast ((subhi[1]+cuthalf-boxlo[1])*dyinv + shift) - OFFSET; nylo_out = MIN(nlo,nylo_in-1); nyhi_out = MAX(nhi,nyhi_in+1); - nlo = static_cast ((sublo[2]-cuthalf-boxlo[2])*delzinv + shift) - OFFSET; - nhi = static_cast ((subhi[2]+cuthalf-boxlo[2])*delzinv + shift) - OFFSET; + nlo = static_cast ((sublo[2]-cuthalf-boxlo[2])*dzinv + shift) - OFFSET; + nhi = static_cast ((subhi[2]+cuthalf-boxlo[2])*dzinv + shift) - OFFSET; nzlo_out = MIN(nlo,nzlo_in-1); nzhi_out = MAX(nhi,nzhi_in+1); @@ -514,12 +473,6 @@ void FixTTMGrid::allocate_grid() memory->create(gc_buf1,ngc_buf1,"ttm/grid:gc_buf1"); memory->create(gc_buf2,ngc_buf2,"ttm/grid:gc_buf2"); - memory->create3d_offset(nsum,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"ttm:nsum"); - memory->create3d_offset(sum_vsq,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"ttm:sum_vsq"); - memory->create3d_offset(sum_mass_vsq,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"ttm:sum_mass_vsq"); memory->create3d_offset(T_electron_old,nzlo_out,nzhi_out,nylo_out,nyhi_out, nxlo_out,nxhi_out,"ttm:T_electron_old"); memory->create3d_offset(T_electron,nzlo_out,nzhi_out,nylo_out,nyhi_out, @@ -528,82 +481,122 @@ void FixTTMGrid::allocate_grid() nxlo_out,nxhi_out,"ttm:net_energy_transfer"); } -/* ---------------------------------------------------------------------- - initialize 3d grid quantities -------------------------------------------------------------------------- */ - -void FixTTMGrid::init_grid() -{ - memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, - ngridout*sizeof(double)); -} - /* ---------------------------------------------------------------------- deallocate 3d grid quantities ------------------------------------------------------------------------- */ void FixTTMGrid::deallocate_grid() { - memory->destroy3d_offset(nsum,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(sum_vsq,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(sum_mass_vsq,nzlo_out,nylo_out,nxlo_out); + delete gc; + memory->destroy(gc_buf1); + memory->destroy(gc_buf2); + memory->destroy3d_offset(T_electron_old,nzlo_out,nylo_out,nxlo_out); memory->destroy3d_offset(T_electron,nzlo_out,nylo_out,nxlo_out); memory->destroy3d_offset(net_energy_transfer,nzlo_out,nylo_out,nxlo_out); } /* ---------------------------------------------------------------------- - read in initial electron temperatures from a user-specified file - only called by proc 0 + use state info from restart file to restart the Fix ------------------------------------------------------------------------- */ -void FixTTMGrid::read_initial_electron_temperatures(const char *filename) +void FixTTMGrid::restart(char *buf) { - int ***T_initial_set; - memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); - memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + int ix,iy,iz; - std::string name = utils::get_potential_file_path(filename); - if (name.empty()) - error->one(FLERR,"Cannot open input file: {}",filename); - FILE *fpr = fopen(name.c_str(),"r"); + int n = 0; + double *rlist = (double *) buf; - // read initial electron temperature values from file + // the seed must be changed from the initial seed + // NOTE: 0.5 is whacky, could go to zero + // NOTE: maybe GridComm should provide a method to pack a grid with bounds - char line[MAXLINE]; - int ixnode,iynode,iznode; - double T_tmp; - while (1) { - if (fgets(line,MAXLINE,fpr) == nullptr) break; - ValueTokenizer values(line); - if (values.has_next()) ixnode = values.next_int(); - if (values.has_next()) iynode = values.next_int(); - if (values.has_next()) iznode = values.next_int(); - if (values.has_next()) T_tmp = values.next_double(); - else error->one(FLERR,"Incorrect format in fix ttm/grid input file"); + seed = static_cast (0.5*rlist[n++]); - // check correctness of input data + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + T_electron[iz][iy][ix] = rlist[n++]; - if ((ixnode < 0) || (ixnode >= nxnodes) - || (iynode < 0) || (iynode >= nynodes) - || (iznode < 0) || (iznode >= nznodes)) - error->one(FLERR,"Fix ttm/grid invalid node index in input"); - - if (T_tmp < 0.0) - error->one(FLERR,"Fix ttm/grid electron temperatures must be > 0.0"); - - T_electron[ixnode][iynode][iznode] = T_tmp; - T_initial_set[ixnode][iynode][iznode] = 1; - } - fclose(fpr); - - // check completeness of input data - - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - if (T_initial_set[ixnode][iynode][iznode] == 0) - error->one(FLERR,"Initial temperatures not all set in fix ttm/grid"); - - memory->destroy(T_initial_set); + delete random; + random = new RanMars(lmp,seed+comm->me); } + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixTTMGrid::write_restart(FILE *fp) +{ + int ix,iy,iz; + + double *rlist; + memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); + + int n = 0; + rlist[n++] = seed; + + // NOTE: this is a parallel grid now, not a serial grid + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) + rlist[n++] = T_electron[iz][iy][ix]; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(rlist,sizeof(double),n,fp); + } + + memory->destroy(rlist); +} + +/* ---------------------------------------------------------------------- + return the energy of the electronic subsystem + or the net_energy transfer between the subsystems +------------------------------------------------------------------------- */ + +double FixTTMGrid::compute_vector(int n) +{ + int ix,iy,iz; + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double volgrid = dx*dy*dz; + + double e_energy_me = 0.0; + double transfer_energy_me = 0.0; + + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + e_energy_me += + T_electron[iz][iy][ix]*electronic_specific_heat* + electronic_density*volgrid; + transfer_energy_me += + net_energy_transfer[iz][iy][ix]*update->dt; + } + + double e_energy,transfer_energy; + MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world); + + if (n == 0) return e_energy; + if (n == 1) return transfer_energy; + return 0.0; +} + +/* ---------------------------------------------------------------------- + memory usage for flangevin and 3d grid +------------------------------------------------------------------------- */ + +double FixTTMGrid::memory_usage() +{ + double bytes = 0.0; + bytes += (double)3*atom->nmax * sizeof(double); + bytes += (double)3*ngridout * sizeof(double); + return bytes; +} + diff --git a/src/MISC/fix_ttm_grid.h b/src/MISC/fix_ttm_grid.h index 5f5c5a9077..08854823df 100644 --- a/src/MISC/fix_ttm_grid.h +++ b/src/MISC/fix_ttm_grid.h @@ -27,13 +27,10 @@ namespace LAMMPS_NS { class FixTTMGrid : public FixTTM { public: FixTTMGrid(class LAMMPS *, int, char **); - ~FixTTMGrid() {} + ~FixTTMGrid(); + void post_constructor(); void post_force(int); void end_of_step(); - double compute_vector(int); - void write_restart(FILE *); - void restart(char *); - double memory_usage(); // grid communication @@ -42,23 +39,25 @@ class FixTTMGrid : public FixTTM { void pack_reverse_grid(int, void *, int, int *); void unpack_reverse_grid(int, void *, int, int *); + void write_restart(FILE *); + void restart(char *); + double compute_vector(int); + double memory_usage(); + private: int ngridout; int nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in; int nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out; double shift; double delxinv,delyinv,delzinv; - double ***dsum; class GridComm *gc; int ngc_buf1,ngc_buf2; double *gc_buf1,*gc_buf2; void allocate_grid(); - void init_grid(); void deallocate_grid(); - - void read_initial_electron_temperatures(const char *); + void read_electron_temperatures(const char *); }; } // namespace LAMMPS_NS From 8fef6a10dd7d97af95787bd48dc40bff4d2013b8 Mon Sep 17 00:00:00 2001 From: Vsevak Date: Fri, 18 Jun 2021 00:52:23 +0300 Subject: [PATCH 003/437] Fix atom types handling in the tip4p/gpu kernels --- lib/gpu/lal_lj_tip4p_long.cu | 38 +++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/gpu/lal_lj_tip4p_long.cu b/lib/gpu/lal_lj_tip4p_long.cu index 782ae43662..ba552e9df8 100644 --- a/lib/gpu/lal_lj_tip4p_long.cu +++ b/lib/gpu/lal_lj_tip4p_long.cu @@ -140,7 +140,8 @@ __kernel void k_lj_tip4p_long_distrib(const __global numtyp4 *restrict x_, engv[inum*engv_iter + i] += vM.z * (acctyp)0.5 * alpha; } } - } else { + } + if (itype == typeO) { fM = ansO[i]; int iH1 = hneigh[i*4 ]; int iH2 = hneigh[i*4+1]; @@ -202,7 +203,8 @@ __kernel void k_lj_tip4p_reneigh(const __global numtyp4 *restrict x_, hneigh[i*4+1] = iH2; hneigh[i*4+2] = -1; } - } else { + } + if (itype == typeH) { if (hneigh[i*4+2] != -1) { int iI, iH; iI = atom_mapping(map,tag[i] - 1); @@ -301,12 +303,13 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, int non_local_oxy = 0; int iH1, iH2, iO; - if(itype == typeO) { + if (itype == typeO) { iO = i; iH1 = hneigh[i*4 ]; iH2 = hneigh[i*4+1]; x1 = m[iO]; - } else { + } + if (itype == typeH) { iO = hneigh[i *4 ]; iH1 = hneigh[iO*4 ]; iH2 = hneigh[iO*4+1]; @@ -390,7 +393,8 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, f.y += dely * force_coul; f.z += delz * force_coul; f.w += 0; - } else { + } + if (itype == typeO) { fO.x += delx * force_coul; fO.y += dely * force_coul; fO.z += delz * force_coul; @@ -412,7 +416,8 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, virial[3] += delx*fd.y; virial[4] += delx*fd.z; virial[5] += dely*fd.z; - } else { + } + if (jtype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdj; numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); @@ -429,7 +434,8 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, virial[4] += (ix.x - vdj.x)*fd.z; virial[5] += (ix.y - vdj.y)*fd.z; } - } else { + } + if (itype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdi, vdj; numtyp4 xH1; fetch4(xH1,iH1,pos_tex); @@ -439,7 +445,7 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, vdi.y = xO.y*cO + xH1.y*cH + xH2.y*cH; vdi.z = xO.z*cO + xH1.z*cH + xH2.z*cH; //vdi.w = vdi.w; - if (jtype != typeH) { + if (jtype == typeO) { numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); numtyp4 xjO; fetch4(xjO,jO,pos_tex); @@ -625,12 +631,13 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, int non_local_oxy = 0; int iH1, iH2, iO; - if(itype == typeO) { + if (itype == typeO) { iO = i; iH1 = hneigh[i*4 ]; iH2 = hneigh[i*4+1]; x1 = m[iO]; - } else { + } + if (itype == typeH) { iO = hneigh[i *4 ]; iH1 = hneigh[iO*4 ]; iH2 = hneigh[iO*4+1]; @@ -714,7 +721,8 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, f.y += dely * force_coul; f.z += delz * force_coul; f.w += 0; - } else { + } + if (itype == typeO) { fO.x += delx * force_coul; fO.y += dely * force_coul; fO.z += delz * force_coul; @@ -736,7 +744,8 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, virial[3] += delx*fd.y; virial[4] += delx*fd.z; virial[5] += dely*fd.z; - } else { + } + if (jtype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdj; numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); @@ -753,7 +762,8 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, virial[4] += (ix.x - vdj.x)*fd.z; virial[5] += (ix.y - vdj.y)*fd.z; } - } else { + } + if (itype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdi, vdj; numtyp4 xH1; fetch4(xH1,iH1,pos_tex); @@ -763,7 +773,7 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, vdi.y = xO.y*cO + xH1.y*cH + xH2.y*cH; vdi.z = xO.z*cO + xH1.z*cH + xH2.z*cH; //vdi.w = vdi.w; - if (jtype != typeH) { + if (jtype == typeO) { numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); numtyp4 xjO; fetch4(xjO,jO,pos_tex); From d982d153f870b412941ea50eda3771b7bcf75969 Mon Sep 17 00:00:00 2001 From: Vsevak Date: Fri, 18 Jun 2021 18:26:53 +0300 Subject: [PATCH 004/437] Fix conditions for correct results on other types --- lib/gpu/lal_lj_tip4p_long.cu | 128 +++++++++++++++++------------------ 1 file changed, 61 insertions(+), 67 deletions(-) diff --git a/lib/gpu/lal_lj_tip4p_long.cu b/lib/gpu/lal_lj_tip4p_long.cu index ba552e9df8..026f08b3f9 100644 --- a/lib/gpu/lal_lj_tip4p_long.cu +++ b/lib/gpu/lal_lj_tip4p_long.cu @@ -388,17 +388,16 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, prefactor *= qqrd2e*qtmp/r; numtyp force_coul = r2inv*prefactor * (_erfc + EWALD_F*grij*expm2 - factor_coul); - if (itype == typeH) { - f.x += delx * force_coul; - f.y += dely * force_coul; - f.z += delz * force_coul; - f.w += 0; - } if (itype == typeO) { fO.x += delx * force_coul; fO.y += dely * force_coul; fO.z += delz * force_coul; fO.w += 0; + } else { + f.x += delx * force_coul; + f.y += dely * force_coul; + f.z += delz * force_coul; + f.w += 0; } if (eflag>0) { e_coul += prefactor*(_erfc-factor_coul); @@ -408,33 +407,6 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, fd.x = delx*force_coul; fd.y = dely*force_coul; fd.z = delz*force_coul; - if (itype == typeH) { - if (jtype == typeH) { - virial[0] += delx*fd.x; - virial[1] += dely*fd.y; - virial[2] += delz*fd.z; - virial[3] += delx*fd.y; - virial[4] += delx*fd.z; - virial[5] += dely*fd.z; - } - if (jtype == typeO) { - numtyp cO = 1 - alpha, cH = 0.5*alpha; - numtyp4 vdj; - numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); - numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); - numtyp4 xjO; fetch4(xjO,jO,pos_tex); - vdj.x = xjO.x*cO + xjH1.x*cH + xjH2.x*cH; - vdj.y = xjO.y*cO + xjH1.y*cH + xjH2.y*cH; - vdj.z = xjO.z*cO + xjH1.z*cH + xjH2.z*cH; - //vdj.w = vdj.w; - virial[0] += (ix.x - vdj.x)*fd.x; - virial[1] += (ix.y - vdj.y)*fd.y; - virial[2] += (ix.z - vdj.z)*fd.z; - virial[3] += (ix.x - vdj.x)*fd.y; - virial[4] += (ix.x - vdj.x)*fd.z; - virial[5] += (ix.y - vdj.y)*fd.z; - } - } if (itype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdi, vdj; @@ -460,6 +432,31 @@ __kernel void k_lj_tip4p_long(const __global numtyp4 *restrict x_, vO[3] += 0.5*(vdi.x - vdj.x)*fd.y; vO[4] += 0.5*(vdi.x - vdj.x)*fd.z; vO[5] += 0.5*(vdi.y - vdj.y)*fd.z; + } else { + if (jtype == typeO) { + numtyp cO = 1 - alpha, cH = 0.5*alpha; + numtyp4 vdj; + numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); + numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); + numtyp4 xjO; fetch4(xjO,jO,pos_tex); + vdj.x = xjO.x*cO + xjH1.x*cH + xjH2.x*cH; + vdj.y = xjO.y*cO + xjH1.y*cH + xjH2.y*cH; + vdj.z = xjO.z*cO + xjH1.z*cH + xjH2.z*cH; + //vdj.w = vdj.w; + virial[0] += (ix.x - vdj.x)*fd.x; + virial[1] += (ix.y - vdj.y)*fd.y; + virial[2] += (ix.z - vdj.z)*fd.z; + virial[3] += (ix.x - vdj.x)*fd.y; + virial[4] += (ix.x - vdj.x)*fd.z; + virial[5] += (ix.y - vdj.y)*fd.z; + } else { + virial[0] += delx*fd.x; + virial[1] += dely*fd.y; + virial[2] += delz*fd.z; + virial[3] += delx*fd.y; + virial[4] += delx*fd.z; + virial[5] += dely*fd.z; + } } } } @@ -617,7 +614,7 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, } __syncthreads(); - if (ii0) { e_coul += prefactor*(_erfc-factor_coul); @@ -736,33 +732,6 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, fd.x = delx*force_coul; fd.y = dely*force_coul; fd.z = delz*force_coul; - if (itype == typeH) { - if (jtype == typeH) { - virial[0] += delx*fd.x; - virial[1] += dely*fd.y; - virial[2] += delz*fd.z; - virial[3] += delx*fd.y; - virial[4] += delx*fd.z; - virial[5] += dely*fd.z; - } - if (jtype == typeO) { - numtyp cO = 1 - alpha, cH = 0.5*alpha; - numtyp4 vdj; - numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); - numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); - numtyp4 xjO; fetch4(xjO,jO,pos_tex); - vdj.x = xjO.x*cO + xjH1.x*cH + xjH2.x*cH; - vdj.y = xjO.y*cO + xjH1.y*cH + xjH2.y*cH; - vdj.z = xjO.z*cO + xjH1.z*cH + xjH2.z*cH; - //vdj.w = vdj.w; - virial[0] += (ix.x - vdj.x)*fd.x; - virial[1] += (ix.y - vdj.y)*fd.y; - virial[2] += (ix.z - vdj.z)*fd.z; - virial[3] += (ix.x - vdj.x)*fd.y; - virial[4] += (ix.x - vdj.x)*fd.z; - virial[5] += (ix.y - vdj.y)*fd.z; - } - } if (itype == typeO) { numtyp cO = 1 - alpha, cH = 0.5*alpha; numtyp4 vdi, vdj; @@ -788,6 +757,31 @@ __kernel void k_lj_tip4p_long_fast(const __global numtyp4 *restrict x_, vO[3] += 0.5*(vdi.x - vdj.x)*fd.y; vO[4] += 0.5*(vdi.x - vdj.x)*fd.z; vO[5] += 0.5*(vdi.y - vdj.y)*fd.z; + } else { + if (jtype == typeO) { + numtyp cO = 1 - alpha, cH = 0.5*alpha; + numtyp4 vdj; + numtyp4 xjH1; fetch4(xjH1,jH1,pos_tex); + numtyp4 xjH2; fetch4(xjH2,jH2,pos_tex); + numtyp4 xjO; fetch4(xjO,jO,pos_tex); + vdj.x = xjO.x*cO + xjH1.x*cH + xjH2.x*cH; + vdj.y = xjO.y*cO + xjH1.y*cH + xjH2.y*cH; + vdj.z = xjO.z*cO + xjH1.z*cH + xjH2.z*cH; + //vdj.w = vdj.w; + virial[0] += (ix.x - vdj.x)*fd.x; + virial[1] += (ix.y - vdj.y)*fd.y; + virial[2] += (ix.z - vdj.z)*fd.z; + virial[3] += (ix.x - vdj.x)*fd.y; + virial[4] += (ix.x - vdj.x)*fd.z; + virial[5] += (ix.y - vdj.y)*fd.z; + } else { + virial[0] += delx*fd.x; + virial[1] += dely*fd.y; + virial[2] += delz*fd.z; + virial[3] += delx*fd.y; + virial[4] += delx*fd.z; + virial[5] += dely*fd.z; + } } } } From 2a21c4b29f54490f5928ca36dc7eb67f9f216c73 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 2 Jul 2021 11:46:25 -0600 Subject: [PATCH 005/437] add sticker-bond support to fix bond/swap --- doc/src/fix_bond_swap.rst | 21 ++++++++++++-------- src/MC/fix_bond_swap.cpp | 40 +++++++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 248c4cc8e9..e3b756476d 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -65,14 +65,19 @@ monomers for this timestep. Choosing a small *fraction* value can reduce the likelihood of a reverse swap occurring soon after an initial swap. -For each monomer A1, its neighbors are examined to find a possible B1 -monomer. Both A1 and B1 must be in the fix group, their separation -must be less than the specified *cutoff*\ , and the molecule IDs of A1 -and B1 must be the same (see below). If a suitable partner is found, -the energy change due to swapping the 2 bonds is computed. This -includes changes in pairwise, bond, and angle energies due to the -altered connectivity of the 2 chains. Dihedral and improper -interactions are not allowed to be defined when this fix is used. +NOTE: is cutoff applied to all new bonds? + +For each monomer A1, its neighbors are looped over as B1 monomers. +All bond partners of both A1 and B1 are also looped over. For a pair +of A1-A2 and B1-B2 bonds to be eligible for swapping, these criteria +must be met. All 4 monomers must be in the fix group. The separation +between A1 and B1 must be less than the specified *cutoff*\ . And the +molecule IDs of A1 and B1 must be the same (see below). If an +eligible B1 partner is found, the energy change due to swapping the 2 +bonds is computed. This includes changes in pairwise, bond, and angle +energies due to the altered connectivity of the 2 chains. Dihedral +and improper interactions are not allowed to be defined when this fix +is used. If the energy decreases due to the swap operation, the bond swap is accepted. If the energy increases it is accepted with probability diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index babaecc2bd..d6d7f82dbd 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -148,7 +148,8 @@ void FixBondSwap::init() error->all(FLERR,"Pair style does not support fix bond/swap"); if (force->angle == nullptr && atom->nangles > 0 && comm->me == 0) - error->warning(FLERR,"Fix bond/swap will ignore defined angles"); + error->warning(FLERR,"Fix bond/swap will not preserve correct angle " + "topology because no angle_style is defined"); if (force->dihedral || force->improper) error->all(FLERR,"Fix bond/swap cannot use dihedral or improper styles"); @@ -255,12 +256,18 @@ void FixBondSwap::post_integrate() } // examine ntest of my eligible atoms for potential swaps - // atom i is randomly selected via atom list - // look at all j neighbors of atom i - // atom j must be on-processor (j < nlocal) - // atom j must be in fix group - // i and j must be same distance from chain end (mol[i] = mol[j]) - // NOTE: must use extra parens in if test on mask[j] & groupbit + // atom I is randomly selected via atom list + // look at all J neighbors of atom I + // J must be on-processor (J < nlocal) + // I,J must be in fix group + // I,J must have same molecule IDs + // use case 1: + // if user defines mol IDs appropriately for linear chains, + // this will mean they are same distance from (either) chain end + // use case 2: + // if user defines a unique mol ID for desired bond sites (on any chain) + // and defines the fix group for these sites, + // this will mean they are eligible bond sites int ntest = static_cast (fraction * neligible); int accept = 0; @@ -277,23 +284,28 @@ void FixBondSwap::post_integrate() if ((mask[j] & groupbit) == 0) continue; if (molecule[i] != molecule[j]) continue; - // look at all bond partners of atoms i and j - // use num_bond for this, not special list, so also find bondtypes - // inext,jnext = bonded atoms + // loop over all bond partners of atoms I and J + // use num_bond for this, not special list, so also have bondtypes + // inext,jnext = atoms bonded to I,J // inext,jnext must be on-processor (inext,jnext < nlocal) - // inext,jnext must be same dist from chain end (mol[inext] = mol[jnext]) - // since swaps may occur between two ends of a single chain, insure - // the 4 atoms are unique (no duplicates): inext != jnext, inext != j + // inext,jnext must be in fix group + // inext,jnext must have same molecule IDs + // for use case 1 (above): this insures chain length is preserved + // for use case 2: always satisfied b/c fix group = bond-able atoms + // 4 atoms must be unique (no duplicates): inext != jnext, inext != j + // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); if (inext >= nlocal || inext < 0) continue; + if ((mask[inext] & groupbit) == 0) continue; ibondtype = bond_type[i][ibond]; for (jbond = 0; jbond < num_bond[j]; jbond++) { jnext = atom->map(bond_atom[j][jbond]); if (jnext >= nlocal || jnext < 0) continue; + if ((mask[jnext] & groupbit) == 0) continue; jbondtype = bond_type[j][jbond]; if (molecule[inext] != molecule[jnext]) continue; @@ -306,7 +318,7 @@ void FixBondSwap::post_integrate() // if angles are enabled: // find other atoms i,inext,j,jnext are in angles with // and angletypes: i/j angletype, i/j nextangletype - // use num_angle for this, not special list, so also find angletypes + // use num_angle for this, not special list, so also have angletypes // 4 atoms consecutively along 1st chain: iprev,i,inext,ilast // 4 atoms consecutively along 2nd chain: jprev,j,jnext,jlast // prev or last atom can be non-existent at end of chain From cfd9cf625dd90697d9b7e40623f123d032683690 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Fri, 25 Jun 2021 09:47:54 +1000 Subject: [PATCH 006/437] Initial draft of Kokkos acclerated PPPM routines for triclinic cells. --- src/KOKKOS/pppm_kokkos.cpp | 553 +++++++++++++++++++++++-------------- src/KOKKOS/pppm_kokkos.h | 41 ++- 2 files changed, 381 insertions(+), 213 deletions(-) diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index dbda29d807..98b6492e48 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1,7 +1,6 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories + https://lammps.sandia.gov/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract @@ -31,6 +30,7 @@ #include "memory_kokkos.h" #include "pair.h" #include "remap_kokkos.h" +#include "kokkos_few.h" #include @@ -67,7 +67,7 @@ PPPMKokkos::PPPMKokkos(LAMMPS *lmp) : PPPM(lmp) pppmflag = 1; group_group_enable = 0; - triclinic_support = 0; + triclinic_support = 1; nfactors = 3; //factors = new int[nfactors]; @@ -455,80 +455,92 @@ void PPPMKokkos::operator()(TagPPPM_setup4, const int &n) const template void PPPMKokkos::setup_triclinic() { -// int i,j,k,n; -// double *prd; -// -// // volume-dependent factors -// // adjust z dimension for 2d slab PPPM -// // z dimension for 3d PPPM is zprd since slab_volfactor = 1.0 -// -// prd = domain->prd; -// -// double xprd = prd[0]; -// double yprd = prd[1]; -// double zprd = prd[2]; -// double zprd_slab = zprd*slab_volfactor; -// volume = xprd * yprd * zprd_slab; -// -// // use lamda (0-1) coordinates -// -// delxinv = nx_pppm; -// delyinv = ny_pppm; -// delzinv = nz_pppm; -// delvolinv = delxinv*delyinv*delzinv/volume; -// -// // d_fkx,d_fky,d_fkz for my FFT grid pts -// -// double per_i,per_j,per_k; -// -// n = 0; -// for (k = nzlo_fft; k <= nzhi_fft; k++) { // parallel_for -// per_k = k - nz_pppm*(2*k/nz_pppm); -// for (j = nylo_fft; j <= nyhi_fft; j++) { -// per_j = j - ny_pppm*(2*j/ny_pppm); -// for (i = nxlo_fft; i <= nxhi_fft; i++) { -// per_i = i - nx_pppm*(2*i/nx_pppm); -// -// double unitk_lamda[3]; -// unitk_lamda[0] = 2.0*MY_PI*per_i; -// unitk_lamda[1] = 2.0*MY_PI*per_j; -// unitk_lamda[2] = 2.0*MY_PI*per_k; -// x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]); -// d_fkx[n] = unitk_lamda[0]; -// d_fky[n] = unitk_lamda[1]; -// d_fkz[n] = unitk_lamda[2]; -// n++; -// } -// } -// } -// -// // virial coefficients -// -// double sqk,vterm; -// -// for (n = 0; n < nfft; n++) { // parallel_for -// sqk = d_fkx[n]*d_fkx[n] + d_fky[n]*d_fky[n] + d_fkz[n]*d_fkz[n]; -// if (sqk == 0.0) { -// d_vg(n,0) = 0.0; -// d_vg(n,1) = 0.0; -// d_vg(n,2) = 0.0; -// d_vg(n,3) = 0.0; -// d_vg(n,4) = 0.0; -// d_vg(n,5) = 0.0; -// } else { -// vterm = -2.0 * (1.0/sqk + 0.25/(g_ewald*g_ewald)); -// d_vg(n,0) = 1.0 + vterm*d_fkx[n]*d_fkx[n]; -// d_vg(n,1) = 1.0 + vterm*d_fky[n]*d_fky[n]; -// d_vg(n,2) = 1.0 + vterm*d_fkz[n]*d_fkz[n]; -// d_vg(n,3) = vterm*d_fkx[n]*d_fky[n]; -// d_vg(n,4) = vterm*d_fkx[n]*d_fkz[n]; -// d_vg(n,5) = vterm*d_fky[n]*d_fkz[n]; -// } -// } -// -// compute_gf_ik_triclinic(); + int i,j,k,n; + double *prd; + + // volume-dependent factors + // adjust z dimension for 2d slab PPPM + // z dimension for 3d PPPM is zprd since slab_volfactor = 1.0 + + prd = domain->prd; + // Update simulation box parameters + h = Few(domain->h); + h_inv = Few(domain->h_inv); + + double xprd = prd[0]; + double yprd = prd[1]; + double zprd = prd[2]; + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + // use lamda (0-1) coordinates + + delxinv = nx_pppm; + delyinv = ny_pppm; + delzinv = nz_pppm; + delvolinv = delxinv*delyinv*delzinv/volume; + + // merge three outer loops into one for better threading + numz_fft = nzhi_fft-nzlo_fft + 1; + numy_fft = nyhi_fft-nylo_fft + 1; + numx_fft = nxhi_fft-nxlo_fft + 1; + const int inum_fft = numx_fft*numy_fft*numz_fft; + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); + copymode = 0; + + // virial coefficients + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); + copymode = 0; + + compute_gf_ik_triclinic(); } +template +KOKKOS_INLINE_FUNCTION +void PPPMKokkos::operator()(TagPPPM_setup_triclinic1, const int &n) const +{ + const int k = n/(numy_fft*numx_fft); + const int j = (n - k*numy_fft*numx_fft) / numx_fft; + const int i = n - k*numy_fft*numx_fft - j*numx_fft; + double per_k = k - nz_pppm*(2*k/nz_pppm); + double per_j = j - ny_pppm*(2*j/ny_pppm); + double per_i = i - nx_pppm*(2*i/nx_pppm); + + double unitk_lamda[3]; + unitk_lamda[0] = 2.0*MY_PI*per_i; + unitk_lamda[1] = 2.0*MY_PI*per_j; + unitk_lamda[2] = 2.0*MY_PI*per_k; + x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]); + d_fkx[n] = unitk_lamda[0]; + d_fky[n] = unitk_lamda[1]; + d_fkz[n] = unitk_lamda[2]; +} + +template +KOKKOS_INLINE_FUNCTION +void PPPMKokkos::operator()(TagPPPM_setup_triclinic2, const int &n) const +{ + const double sqk = d_fkx[n]*d_fkx[n] + d_fky[n]*d_fky[n] + d_fkz[n]*d_fkz[n]; + if (sqk == 0.0) { + d_vg(n,0) = 0.0; + d_vg(n,1) = 0.0; + d_vg(n,2) = 0.0; + d_vg(n,3) = 0.0; + d_vg(n,4) = 0.0; + d_vg(n,5) = 0.0; + } else { + const double vterm = -2.0 * (1.0/sqk + 0.25/(g_ewald*g_ewald)); + d_vg(n,0) = 1.0 + vterm*d_fkx[n]*d_fkx[n]; + d_vg(n,1) = 1.0 + vterm*d_fky[n]*d_fky[n]; + d_vg(n,2) = 1.0 + vterm*d_fkz[n]*d_fkz[n]; + d_vg(n,3) = vterm*d_fkx[n]*d_fky[n]; + d_vg(n,4) = vterm*d_fkx[n]*d_fkz[n]; + d_vg(n,5) = vterm*d_fky[n]*d_fkz[n]; + } +} /* ---------------------------------------------------------------------- reset local grid arrays and communication stencils called by fix balance b/c it changed sizes of processor sub-domains @@ -1004,7 +1016,7 @@ void PPPMKokkos::set_grid_global() tmp[0] = nx_pppm; tmp[1] = ny_pppm; tmp[2] = nz_pppm; - x2lamdaT(&tmp[0],&tmp[0]); + KSpace::x2lamdaT(&tmp[0],&tmp[0]); h_x = 1.0/tmp[0]; h_y = 1.0/tmp[1]; h_z = 1.0/tmp[2]; @@ -1311,6 +1323,10 @@ void PPPMKokkos::compute_gf_ik_triclinic() nby = static_cast (tmp[1]); nbz = static_cast (tmp[2]); + // Update the local copy of the domain box tilt + h = Few(domain->h); + h_inv = Few(domain->h_inv); + twoorder = 2*order; copymode = 1; @@ -1320,71 +1336,71 @@ void PPPMKokkos::compute_gf_ik_triclinic() template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_compute_gf_ik_triclinic, const int &/*m*/) const +void PPPMKokkos::operator()(TagPPPM_compute_gf_ik_triclinic, const int &m) const { - //int n = (m - nzlo_fft)*(nyhi_fft+1 - nylo_fft)*(nxhi_fft+1 - nxlo_fft); - // - //const int mper = m - nz_pppm*(2*m/nz_pppm); - //const double snz = square(sin(MY_PI*mper/nz_pppm)); - // - //for (int l = nylo_fft; l <= nyhi_fft; l++) { - // const int lper = l - ny_pppm*(2*l/ny_pppm); - // const double sny = square(sin(MY_PI*lper/ny_pppm)); - // - // for (int k = nxlo_fft; k <= nxhi_fft; k++) { - // const int kper = k - nx_pppm*(2*k/nx_pppm); - // const double snx = square(sin(MY_PI*kper/nx_pppm)); - // - // double unitk_lamda[3]; - // unitk_lamda[0] = 2.0*MY_PI*kper; - // unitk_lamda[1] = 2.0*MY_PI*lper; - // unitk_lamda[2] = 2.0*MY_PI*mper; - // x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]); - // - // const double sqk = square(unitk_lamda[0]) + square(unitk_lamda[1]) + square(unitk_lamda[2]); - // - // if (sqk != 0.0) { - // const double numerator = 12.5663706/sqk; - // const double denominator = gf_denom(snx,sny,snz); - // double sum1 = 0.0; - // - // for (int nx = -nbx; nx <= nbx; nx++) { - // const double argx = MY_PI*kper/nx_pppm + MY_PI*nx; - // const double wx = powsinxx(argx,twoorder); - // - // for (int ny = -nby; ny <= nby; ny++) { - // const double argy = MY_PI*lper/ny_pppm + MY_PI*ny; - // const double wy = powsinxx(argy,twoorder); - // - // for (int nz = -nbz; nz <= nbz; nz++) { - // const double argz = MY_PI*mper/nz_pppm + MY_PI*nz; - // const double wz = powsinxx(argz,twoorder); - // - // double b[3]; - // b[0] = 2.0*MY_PI*nx_pppm*nx; - // b[1] = 2.0*MY_PI*ny_pppm*ny; - // b[2] = 2.0*MY_PI*nz_pppm*nz; - // x2lamdaT(&b[0],&b[0]); - // - // const double qx = unitk_lamda[0]+b[0]; - // const double sx = exp(-0.25*square(qx/g_ewald)); - // - // const double qy = unitk_lamda[1]+b[1]; - // const double sy = exp(-0.25*square(qy/g_ewald)); - // - // const double qz = unitk_lamda[2]+b[2]; - // const double sz = exp(-0.25*square(qz/g_ewald)); - // - // const double dot1 = unitk_lamda[0]*qx + unitk_lamda[1]*qy + unitk_lamda[2]*qz; - // const double dot2 = qx*qx+qy*qy+qz*qz; - // sum1 += (dot1/dot2) * sx*sy*sz * wx*wy*wz; - // } - // } - // } - // d_greensfn[n++] = numerator*sum1/denominator; - // } else d_greensfn[n++] = 0.0; - // } - //} + int n = (m - nzlo_fft)*(nyhi_fft+1 - nylo_fft)*(nxhi_fft+1 - nxlo_fft); + + const int mper = m - nz_pppm*(2*m/nz_pppm); + const double snz = square(sin(MY_PI*mper/nz_pppm)); + + for (int l = nylo_fft; l <= nyhi_fft; l++) { + const int lper = l - ny_pppm*(2*l/ny_pppm); + const double sny = square(sin(MY_PI*lper/ny_pppm)); + + for (int k = nxlo_fft; k <= nxhi_fft; k++) { + const int kper = k - nx_pppm*(2*k/nx_pppm); + const double snx = square(sin(MY_PI*kper/nx_pppm)); + + double unitk_lamda[3]; + unitk_lamda[0] = 2.0*MY_PI*kper; + unitk_lamda[1] = 2.0*MY_PI*lper; + unitk_lamda[2] = 2.0*MY_PI*mper; + x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]); + + const double sqk = square(unitk_lamda[0]) + square(unitk_lamda[1]) + square(unitk_lamda[2]); + + if (sqk != 0.0) { + const double numerator = 12.5663706/sqk; + const double denominator = gf_denom(snx,sny,snz); + double sum1 = 0.0; + + for (int nx = -nbx; nx <= nbx; nx++) { + const double argx = MY_PI*kper/nx_pppm + MY_PI*nx; + const double wx = powsinxx(argx,twoorder); + + for (int ny = -nby; ny <= nby; ny++) { + const double argy = MY_PI*lper/ny_pppm + MY_PI*ny; + const double wy = powsinxx(argy,twoorder); + + for (int nz = -nbz; nz <= nbz; nz++) { + const double argz = MY_PI*mper/nz_pppm + MY_PI*nz; + const double wz = powsinxx(argz,twoorder); + + double b[3]; + b[0] = 2.0*MY_PI*nx_pppm*nx; + b[1] = 2.0*MY_PI*ny_pppm*ny; + b[2] = 2.0*MY_PI*nz_pppm*nz; + x2lamdaT(&b[0],&b[0]); + + const double qx = unitk_lamda[0]+b[0]; + const double sx = exp(-0.25*square(qx/g_ewald)); + + const double qy = unitk_lamda[1]+b[1]; + const double sy = exp(-0.25*square(qy/g_ewald)); + + const double qz = unitk_lamda[2]+b[2]; + const double sz = exp(-0.25*square(qz/g_ewald)); + + const double dot1 = unitk_lamda[0]*qx + unitk_lamda[1]*qy + unitk_lamda[2]*qz; + const double dot2 = qx*qx+qy*qy+qz*qz; + sum1 += (dot1/dot2) * sx*sy*sz * wx*wy*wz; + } + } + } + d_greensfn[n++] = numerator*sum1/denominator; + } else d_greensfn[n++] = 0.0; + } + } } /* ---------------------------------------------------------------------- @@ -1867,107 +1883,224 @@ void PPPMKokkos::operator()(TagPPPM_poisson_ik10, const int &ii) con template void PPPMKokkos::poisson_ik_triclinic() { -// int i,j,k,n; -// -// // compute gradients of V(r) in each of 3 dims by transforming ik*V(k) -// // FFT leaves data in 3d brick decomposition -// // copy it into inner portion of vdx,vdy,vdz arrays -// -// // x direction gradient -// -// n = 0; -// for (i = 0; i < nfft; i++) { // parallel_for1 -// d_work2[n] = -d_fkx[i]*d_work1[n+1]; -// d_work2[n+1] = d_fkx[i]*d_work1[n]; -// n += 2; -// } -// -// fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); -// -// n = 0; -// for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for2 -// -// -// // y direction gradient -// -// n = 0; -// for (i = 0; i < nfft; i++) { // parallel_for3 -// d_work2[n] = -d_fky[i]*d_work1[n+1]; -// d_work2[n+1] = d_fky[i]*d_work1[n]; -// n += 2; -// } -// -// fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); -// -// n = 0; -// for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for4 -// for (j = nylo_in-nylo_out; j <= nyhi_in-nylo_out; j++) -// for (i = nxlo_in-nxlo_out; i <= nxhi_in-nxlo_out; i++) { -// d_vdy_brick(k,j,i) = d_work2[n]; -// n += 2; -// } -// -// // z direction gradient -// -// n = 0; -// for (i = 0; i < nfft; i++) { // parallel_for5 -// d_work2[n] = -d_fkz[i]*d_work1[n+1]; -// d_work2[n+1] = d_fkz[i]*d_work1[n]; -// n += 2; -// } -// -// fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); -// -// n = 0; -// for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for6 -// +/************************************************** + int i,j,k,n; + + // compute gradients of V(r) in each of 3 dims by transforming ik*V(k) + // FFT leaves data in 3d brick decomposition + // copy it into inner portion of vdx,vdy,vdz arrays + + // x direction gradient + + n = 0; + for (i = 0; i < nfft; i++) { // parallel_for1 + d_work2[n] = -d_fkx[i]*d_work1[n+1]; + d_work2[n+1] = d_fkx[i]*d_work1[n]; + n += 2; + } + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + n = 0; + for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for2 + + + // y direction gradient + + n = 0; + for (i = 0; i < nfft; i++) { // parallel_for3 + d_work2[n] = -d_fky[i]*d_work1[n+1]; + d_work2[n+1] = d_fky[i]*d_work1[n]; + n += 2; + } + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + n = 0; + for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for4 + for (j = nylo_in-nylo_out; j <= nyhi_in-nylo_out; j++) + for (i = nxlo_in-nxlo_out; i <= nxhi_in-nxlo_out; i++) { + d_vdy_brick(k,j,i) = d_work2[n]; + n += 2; + } + + // z direction gradient + + n = 0; + for (i = 0; i < nfft; i++) { // parallel_for5 + d_work2[n] = -d_fkz[i]*d_work1[n+1]; + d_work2[n+1] = d_fkz[i]*d_work1[n]; + n += 2; + } + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + n = 0; + for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for6 +******************************/ + int i,j,k,n; + + // compute gradients of V(r) in each of 3 dims by transforming ik*V(k) + // FFT leaves data in 3d brick decomposition + // copy it into inner portion of vdx,vdy,vdz arrays + + // x direction gradient + + //n = 0; + //for (i = 0; i < nfft; i++) { + // d_work2[n] = -d_fkx[i]*d_work1[n+1]; + // d_work2[n+1] = d_fkx[i]*d_work1[n]; + // n += 2; + //} + + // merge three outer loops into one for better threading + + numz_fft = nzhi_fft-nzlo_fft + 1; + numy_fft = nyhi_fft-nylo_fft + 1; + numx_fft = nxhi_fft-nxlo_fft + 1; + const int inum_fft = numz_fft*numy_fft*numx_fft; + + numz_inout = (nzhi_in-nzlo_out)-(nzlo_in-nzlo_out) + 1; + numy_inout = (nyhi_in-nylo_out)-(nylo_in-nylo_out) + 1; + numx_inout = (nxhi_in-nxlo_out)-(nxlo_in-nxlo_out) + 1; + const int inum_inout = numz_inout*numy_inout*numx_inout; + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); + copymode = 0; + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + //n = 0; + //for (k = nzlo_in; k <= nzhi_in; k++) + // for (j = nylo_in; j <= nyhi_in; j++) + // for (i = nxlo_in; i <= nxhi_in; i++) { + // d_vdx_brick(k,j,i) = d_work2[n]; + // n += 2; + // } + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); + copymode = 0; + + // y direction gradient + + //n = 0; + //for (i = 0; i < nfft; i++) { + // d_work2[n] = -d_fky[i]*d_work1[n+1]; + // d_work2[n+1] = d_fky[i]*d_work1[n]; + // n += 2; + //} + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); + copymode = 0; + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + //n = 0; + //for (k = nzlo_in; k <= nzhi_in; k++) + // for (j = nylo_in; j <= nyhi_in; j++) + // for (i = nxlo_in; i <= nxhi_in; i++) { + // d_vdy_brick(k,j,i) = d_work2[n]; + // n += 2; + // } + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); + copymode = 0; + + // z direction gradient + + //n = 0; + //for (i = 0; i < nfft; i++) { + // d_work2[n] = -d_fkz[i]*d_work1[n+1]; + // d_work2[n+1] = d_fkz[i]*d_work1[n]; + // n += 2; + //} + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); + copymode = 0; + + fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); + + //n = 0; + //for (k = nzlo_in; k <= nzhi_in; k++) + // for (j = nylo_in; j <= nyhi_in; j++) + // for (i = nxlo_in; i <= nxhi_in; i++) { + // d_vdz_brick(k,j,i) = d_work2[n]; + // n += 2; + // } + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); + copymode = 0; + } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic1, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic1, const int &ii) const { - + d_work2[2*ii] = -d_fkx[ii]*d_work1[2*ii+1]; + d_work2[2*ii+1] = d_fkx[ii]*d_work1[2*ii]; } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic2, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic2, const int &ii) const { -// for (j = nylo_in-nylo_out; j <= nyhi_in-nylo_out; j++) -// for (i = nxlo_in-nxlo_out; i <= nxhi_in-nxlo_out; i++) { -// d_vdx_brick(k,j,i) = d_work2[n]; -// n += 2; -// } + const int n = ii*2; + int k = ii/(numy_inout*numx_inout); + int j = (ii - k*numy_inout*numx_inout) / numx_inout; + int i = ii - k*numy_inout*numx_inout - j*numx_inout; + k += nzlo_in-nzlo_out; + j += nylo_in-nylo_out; + i += nxlo_in-nxlo_out; + d_vdx_brick(k,j,i) = d_work2[n]; } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic3, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic3, const int &ii) const { // int n = (k - (nzlo_in-nzlo_out))*((nyhi_in-nylo_out) - (nylo_in-nylo_out) + 1)*((nxhi_in-nxlo_out) - (nxlo_in-nxlo_out) + 1)*2; + d_work2[2*ii] = -d_fky[ii]*d_work1[2*ii+1]; + d_work2[2*ii+1] = d_fky[ii]*d_work1[2*ii]; } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic4, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic4, const int &ii) const { // int n = (k - (nzlo_in-nzlo_out))*((nyhi_in-nylo_out) - (nylo_in-nylo_out) + 1)*((nxhi_in-nxlo_out) - (nxlo_in-nxlo_out) + 1)*2; // + + const int n = ii*2; + int k = ii/(numy_inout*numx_inout); + int j = (ii - k*numy_inout*numx_inout) / numx_inout; + int i = ii - k*numy_inout*numx_inout - j*numx_inout; + k += nzlo_in-nzlo_out; + j += nylo_in-nylo_out; + i += nxlo_in-nxlo_out; + d_vdy_brick(k,j,i) = d_work2[n]; } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic5, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic5, const int &ii) const { // int n = (k - (nzlo_in-nzlo_out))*((nyhi_in-nylo_out) - (nylo_in-nylo_out) + 1)*((nxhi_in-nxlo_out) - (nxlo_in-nxlo_out) + 1)*2; // + d_work2[2*ii] = -d_fkz[ii]*d_work1[2*ii+1]; + d_work2[2*ii+1] = d_fkz[ii]*d_work1[2*ii]; } template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic6, const int &/*k*/) const +void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic6, const int &ii) const { // int n = (k - (nzlo_in-nzlo_out))*((nyhi_in-nylo_out) - (nylo_in-nylo_out) + 1)*((nxhi_in-nxlo_out) - (nxlo_in-nxlo_out) + 1)*2; // @@ -1976,6 +2109,14 @@ void PPPMKokkos::operator()(TagPPPM_poisson_ik_triclinic6, const int // d_vdz_brick(k,j,i) = d_work2[n]; // n += 2; // } + const int n = ii*2; + int k = ii/(numy_inout*numx_inout); + int j = (ii - k*numy_inout*numx_inout) / numx_inout; + int i = ii - k*numy_inout*numx_inout - j*numx_inout; + k += nzlo_in-nzlo_out; + j += nylo_in-nylo_out; + i += nxlo_in-nxlo_out; + d_vdz_brick(k,j,i) = d_work2[n]; } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index 6b7b7f1f89..c92210b748 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -1,7 +1,6 @@ -// clang-format off /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories + https://lammps.sandia.gov/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract @@ -13,11 +12,11 @@ ------------------------------------------------------------------------- */ #ifdef KSPACE_CLASS -// clang-format off -KSpaceStyle(pppm/kk,PPPMKokkos); -KSpaceStyle(pppm/kk/device,PPPMKokkos); -KSpaceStyle(pppm/kk/host,PPPMKokkos); -// clang-format on + +KSpaceStyle(pppm/kk,PPPMKokkos) +KSpaceStyle(pppm/kk/device,PPPMKokkos) +KSpaceStyle(pppm/kk/host,PPPMKokkos) + #else #ifndef LMP_PPPM_KOKKOS_H @@ -29,6 +28,7 @@ KSpaceStyle(pppm/kk/host,PPPMKokkos); #include "kokkos_base_fft.h" #include "fftdata_kokkos.h" #include "kokkos_type.h" +#include "kokkos_few.h" // fix up FFT defines for KOKKOS with CUDA @@ -55,6 +55,8 @@ struct TagPPPM_setup1{}; struct TagPPPM_setup2{}; struct TagPPPM_setup3{}; struct TagPPPM_setup4{}; +struct TagPPPM_setup_triclinic1{}; +struct TagPPPM_setup_triclinic2{}; struct TagPPPM_compute_gf_ik{}; struct TagPPPM_compute_gf_ik_triclinic{}; struct TagPPPM_self1{}; @@ -138,6 +140,12 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT { KOKKOS_INLINE_FUNCTION void operator()(TagPPPM_setup4, const int&) const; + KOKKOS_INLINE_FUNCTION + void operator()(TagPPPM_setup_triclinic1, const int&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagPPPM_setup_triclinic2, const int&) const; + KOKKOS_INLINE_FUNCTION void operator()(TagPPPM_compute_gf_ik, const int&) const; @@ -309,6 +317,25 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT { int numx_out,numy_out,numz_out; int ix,iy,nlocal; + // Local copies of the domain box tilt etc. + // TODO: Will need to put in a less + // hacky solution later, since this needs to be manually updated + Few h, h_inv; + + KOKKOS_INLINE_FUNCTION + void x2lamdaT(double* v, double* lamda) const + { + double lamda_tmp[3]; + + lamda_tmp[0] = h_inv[0]*v[0]; + lamda_tmp[1] = h_inv[5]*v[0] + h_inv[1]*v[1]; + lamda_tmp[2] = h_inv[4]*v[0] + h_inv[3]*v[1] + h_inv[2]*v[2]; + + lamda[0] = lamda_tmp[0]; + lamda[1] = lamda_tmp[1]; + lamda[2] = lamda_tmp[2]; + } + int nx,ny,nz; typename AT::t_int_1d_um d_list_index; typename FFT_AT::t_FFT_SCALAR_1d_um d_buf; From e400e5b6f7be6530db7ca63ca4f422d6dc4e8fee Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Wed, 14 Jul 2021 14:46:54 +1000 Subject: [PATCH 007/437] Fixed bug in PPPMKokkos::setup_triclinic for MPI calculations. This fix should probably be considered a temporary fix - it relies on a 3-dimensional Kokkos range which seems to be disfavoured in the rest of LAMMPS' codebase. --- src/KOKKOS/pppm_kokkos.cpp | 122 +++---------------------------------- src/KOKKOS/pppm_kokkos.h | 3 +- 2 files changed, 10 insertions(+), 115 deletions(-) diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 98b6492e48..3fe93f6825 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -455,7 +455,6 @@ void PPPMKokkos::operator()(TagPPPM_setup4, const int &n) const template void PPPMKokkos::setup_triclinic() { - int i,j,k,n; double *prd; // volume-dependent factors @@ -480,13 +479,9 @@ void PPPMKokkos::setup_triclinic() delzinv = nz_pppm; delvolinv = delxinv*delyinv*delzinv/volume; - // merge three outer loops into one for better threading - numz_fft = nzhi_fft-nzlo_fft + 1; - numy_fft = nyhi_fft-nylo_fft + 1; - numx_fft = nxhi_fft-nxlo_fft + 1; - const int inum_fft = numx_fft*numy_fft*numz_fft; copymode = 1; - Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); + Kokkos::parallel_for(Kokkos::MDRangePolicy, DeviceType, TagPPPM_setup_triclinic1>\ + ({nzlo_fft, nylo_fft, nxlo_fft}, {nzhi_fft+1, nyhi_fft+1, nxhi_fft+1}),*this); copymode = 0; // virial coefficients @@ -500,14 +495,14 @@ void PPPMKokkos::setup_triclinic() template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_setup_triclinic1, const int &n) const +void PPPMKokkos::operator()(TagPPPM_setup_triclinic1, const int &k, const int &j, const int& i) const { - const int k = n/(numy_fft*numx_fft); - const int j = (n - k*numy_fft*numx_fft) / numx_fft; - const int i = n - k*numy_fft*numx_fft - j*numx_fft; double per_k = k - nz_pppm*(2*k/nz_pppm); double per_j = j - ny_pppm*(2*j/ny_pppm); double per_i = i - nx_pppm*(2*i/nx_pppm); + // n corresponds to the "number" of this iteration if we were to execute the loop monotonically and in serial + int n = (nxhi_fft - nxlo_fft + 1)*(nyhi_fft - nylo_fft + 1)*(k - nzlo_fft)+ + (nxhi_fft - nxlo_fft + 1)*(j - nylo_fft) + (i - nxlo_fft); double unitk_lamda[3]; unitk_lamda[0] = 2.0*MY_PI*per_i; @@ -1244,7 +1239,7 @@ void PPPMKokkos::compute_gf_ik() numz_fft = nzhi_fft-nzlo_fft + 1; numy_fft = nyhi_fft-nylo_fft + 1; numx_fft = nxhi_fft-nxlo_fft + 1; - const int inum_fft = numz_fft*numy_fft*numx_fft; + const int inum_fft = numx_fft*numy_fft*numz_fft; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); @@ -1883,76 +1878,12 @@ void PPPMKokkos::operator()(TagPPPM_poisson_ik10, const int &ii) con template void PPPMKokkos::poisson_ik_triclinic() { -/************************************************** - int i,j,k,n; - // compute gradients of V(r) in each of 3 dims by transforming ik*V(k) // FFT leaves data in 3d brick decomposition // copy it into inner portion of vdx,vdy,vdz arrays // x direction gradient - n = 0; - for (i = 0; i < nfft; i++) { // parallel_for1 - d_work2[n] = -d_fkx[i]*d_work1[n+1]; - d_work2[n+1] = d_fkx[i]*d_work1[n]; - n += 2; - } - - fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - - n = 0; - for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for2 - - - // y direction gradient - - n = 0; - for (i = 0; i < nfft; i++) { // parallel_for3 - d_work2[n] = -d_fky[i]*d_work1[n+1]; - d_work2[n+1] = d_fky[i]*d_work1[n]; - n += 2; - } - - fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - - n = 0; - for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for4 - for (j = nylo_in-nylo_out; j <= nyhi_in-nylo_out; j++) - for (i = nxlo_in-nxlo_out; i <= nxhi_in-nxlo_out; i++) { - d_vdy_brick(k,j,i) = d_work2[n]; - n += 2; - } - - // z direction gradient - - n = 0; - for (i = 0; i < nfft; i++) { // parallel_for5 - d_work2[n] = -d_fkz[i]*d_work1[n+1]; - d_work2[n+1] = d_fkz[i]*d_work1[n]; - n += 2; - } - - fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - - n = 0; - for (k = nzlo_in-nzlo_out; k <= nzhi_in-nzlo_out; k++) // parallel_for6 -******************************/ - int i,j,k,n; - - // compute gradients of V(r) in each of 3 dims by transforming ik*V(k) - // FFT leaves data in 3d brick decomposition - // copy it into inner portion of vdx,vdy,vdz arrays - - // x direction gradient - - //n = 0; - //for (i = 0; i < nfft; i++) { - // d_work2[n] = -d_fkx[i]*d_work1[n+1]; - // d_work2[n+1] = d_fkx[i]*d_work1[n]; - // n += 2; - //} - // merge three outer loops into one for better threading numz_fft = nzhi_fft-nzlo_fft + 1; @@ -1971,68 +1902,30 @@ void PPPMKokkos::poisson_ik_triclinic() fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - //n = 0; - //for (k = nzlo_in; k <= nzhi_in; k++) - // for (j = nylo_in; j <= nyhi_in; j++) - // for (i = nxlo_in; i <= nxhi_in; i++) { - // d_vdx_brick(k,j,i) = d_work2[n]; - // n += 2; - // } - copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); copymode = 0; // y direction gradient - //n = 0; - //for (i = 0; i < nfft; i++) { - // d_work2[n] = -d_fky[i]*d_work1[n+1]; - // d_work2[n+1] = d_fky[i]*d_work1[n]; - // n += 2; - //} - copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); copymode = 0; fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - //n = 0; - //for (k = nzlo_in; k <= nzhi_in; k++) - // for (j = nylo_in; j <= nyhi_in; j++) - // for (i = nxlo_in; i <= nxhi_in; i++) { - // d_vdy_brick(k,j,i) = d_work2[n]; - // n += 2; - // } - copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); copymode = 0; // z direction gradient - //n = 0; - //for (i = 0; i < nfft; i++) { - // d_work2[n] = -d_fkz[i]*d_work1[n+1]; - // d_work2[n+1] = d_fkz[i]*d_work1[n]; - // n += 2; - //} - copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); copymode = 0; fft2->compute(d_work2,d_work2,FFT3dKokkos::BACKWARD); - //n = 0; - //for (k = nzlo_in; k <= nzhi_in; k++) - // for (j = nylo_in; j <= nyhi_in; j++) - // for (i = nxlo_in; i <= nxhi_in; i++) { - // d_vdz_brick(k,j,i) = d_work2[n]; - // n += 2; - // } - copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); copymode = 0; @@ -3040,3 +2933,4 @@ template class PPPMKokkos; template class PPPMKokkos; #endif } + diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index c92210b748..e7c55b1726 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -141,7 +141,7 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT { void operator()(TagPPPM_setup4, const int&) const; KOKKOS_INLINE_FUNCTION - void operator()(TagPPPM_setup_triclinic1, const int&) const; + void operator()(TagPPPM_setup_triclinic1, const int&, const int&, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(TagPPPM_setup_triclinic2, const int&) const; @@ -623,3 +623,4 @@ accuracy. This error should not occur for typical problems. Please send an email to the developers. */ + From e7ba4179a75ef9b05eababbe4ebf00d60f4fde0e Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Thu, 29 Jul 2021 09:53:08 +1000 Subject: [PATCH 008/437] Added Kokkos-enabled version of compute temp/deform. --- src/KOKKOS/compute_temp_deform_kokkos.cpp | 285 ++++++++++++++++++++++ src/KOKKOS/compute_temp_deform_kokkos.h | 127 ++++++++++ src/KOKKOS/compute_temp_kokkos.h | 23 +- src/compute_temp_deform.cpp | 9 +- 4 files changed, 430 insertions(+), 14 deletions(-) create mode 100644 src/KOKKOS/compute_temp_deform_kokkos.cpp create mode 100644 src/KOKKOS/compute_temp_deform_kokkos.h diff --git a/src/KOKKOS/compute_temp_deform_kokkos.cpp b/src/KOKKOS/compute_temp_deform_kokkos.cpp new file mode 100644 index 0000000000..6040504aeb --- /dev/null +++ b/src/KOKKOS/compute_temp_deform_kokkos.cpp @@ -0,0 +1,285 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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 authors: Emily Kahl (UQ) +------------------------------------------------------------------------- */ + +#include "compute_temp_deform_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "update.h" +#include "memory_kokkos.h" + +#include + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +ComputeTempDeformKokkos::ComputeTempDeformKokkos(LAMMPS *lmp, int narg, char **arg) : + ComputeTempDeform(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + domainKK = (DomainKokkos *) domain; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = V_MASK | MASK_MASK | RMASS_MASK | TYPE_MASK; + datamask_modify = EMPTY_MASK; + + maxbias = 0; +} + +template +ComputeTempDeformKokkos::~ComputeTempDeformKokkos() +{ + + +} + +/* ---------------------------------------------------------------------- */ + +template +double ComputeTempDeformKokkos::compute_scalar() +{ + atomKK->sync(execution_space,datamask_read); + atomKK->k_mass.sync(); + + invoked_scalar = update->ntimestep; + + v = atomKK->k_v.view(); + x = atomKK->k_x.view(); + if (atomKK->rmass) + rmass = atomKK->k_rmass.view(); + else + mass = atomKK->k_mass.view(); + type = atomKK->k_type.view(); + mask = atomKK->k_mask.view(); + int nlocal = atom->nlocal; + + double t = 0.0; + CTEMP t_kk; + + /**************** EVK ****************/ + // Convert from box coords to lamda coords + domainKK->x2lamda(nlocal); + + copymode = 1; + if (atomKK->rmass) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); + else + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); + copymode = 0; + + /**************** EVK ****************/ + // Convert back to box coords + domainKK->lamda2x(nlocal); + + t = t_kk.t0; // could make this more efficient + + MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); + if (dynamic) dof_compute(); + if (dof < 0.0 && natoms_temp > 0.0) + error->all(FLERR,"Temperature compute degrees of freedom < 0"); + scalar *= tfactor; + + return scalar; +} + +template +template +KOKKOS_INLINE_FUNCTION +void ComputeTempDeformKokkos::operator()(TagComputeTempDeformScalar, const int &i, CTEMP& t_kk) const { + + double *h_rate = domainKK->h_rate; + double *h_ratelo = domainKK->h_ratelo; + double vstream[3],vthermal[3]; + + vstream[0] = h_rate[0]*x(i,0) + h_rate[5]*x(i,1) + h_rate[4]*x(i,2) + h_ratelo[0]; + vstream[1] = h_rate[1]*x(i,1) + h_rate[3]*x(i,2) + h_ratelo[1]; + vstream[2] = h_rate[2]*x(i,2) + h_ratelo[2]; + vthermal[0] = v(i,0) - vstream[0]; + vthermal[1] = v(i,1) - vstream[1]; + vthermal[2] = v(i,2) - vstream[2]; + if (RMASS) { + if (mask[i] & groupbit) + t_kk.t0 += (vthermal[0]*vthermal[0] + vthermal[1]*vthermal[1] + vthermal[2]*vthermal[2]) * rmass[i]; + } else { + if (mask[i] & groupbit) + t_kk.t0 += (vthermal[0]*vthermal[0] + vthermal[1]*vthermal[1] + vthermal[2]*vthermal[2]) * mass[type[i]]; + } +} + +/* ---------------------------------------------------------------------- */ +template +void ComputeTempDeformKokkos::compute_vector() +{ + atomKK->sync(execution_space,datamask_read); + + int i; + + invoked_vector = update->ntimestep; + + v = atomKK->k_v.view(); + x = atomKK->k_x.view(); + if (atomKK->rmass) + rmass = atomKK->k_rmass.view(); + else + mass = atomKK->k_mass.view(); + type = atomKK->k_type.view(); + mask = atomKK->k_mask.view(); + int nlocal = atom->nlocal; + + double t[6]; + for (i = 0; i < 6; i++) t[i] = 0.0; + CTEMP t_kk; + + /**************** EVK ****************/ + // Convert from box coords to lamda coords + domainKK->x2lamda(nlocal); + + copymode = 1; + if (atomKK->rmass) + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); + else + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); + copymode = 0; + + /**************** EVK ****************/ + // Convert back to box coords + domainKK->lamda2x(nlocal); + + t[0] = t_kk.t0; + t[1] = t_kk.t1; + t[2] = t_kk.t2; + t[3] = t_kk.t3; + t[4] = t_kk.t4; + t[5] = t_kk.t5; + + MPI_Allreduce(t,vector,6,MPI_DOUBLE,MPI_SUM,world); + for (i = 0; i < 6; i++) vector[i] *= force->mvv2e; +} + +template +template +KOKKOS_INLINE_FUNCTION +void ComputeTempDeformKokkos::operator()(TagComputeTempDeformVector, const int &i, CTEMP& t_kk) const { + + double *h_rate = domainKK->h_rate; + double *h_ratelo = domainKK->h_ratelo; + double vstream[3],vthermal[3]; + + vstream[0] = h_rate[0]*x(i,0) + h_rate[5]*x(i,1) + h_rate[4]*x(i,2) + h_ratelo[0]; + vstream[1] = h_rate[1]*x(i,1) + h_rate[3]*x(i,2) + h_ratelo[1]; + vstream[2] = h_rate[2]*x(i,2) + h_ratelo[2]; + vthermal[0] = v(i,0) - vstream[0]; + vthermal[1] = v(i,1) - vstream[1]; + vthermal[2] = v(i,2) - vstream[2]; + + if (mask[i] & groupbit) { + F_FLOAT massone = 0.0; + if (RMASS) massone = rmass[i]; + else massone = mass[type[i]]; + t_kk.t0 += massone * vthermal[0]*vthermal[0]; + t_kk.t1 += massone * vthermal[1]*vthermal[1]; + t_kk.t2 += massone * vthermal[2]*vthermal[2]; + t_kk.t3 += massone * vthermal[0]*vthermal[1]; + t_kk.t4 += massone * vthermal[0]*vthermal[2]; + t_kk.t5 += massone * vthermal[1]*vthermal[2]; + } +} + +/* ---------------------------------------------------------------------- */ +template +void ComputeTempDeformKokkos::remove_bias_all() +{ + atomKK->sync(execution_space,datamask_read); + v = atomKK->k_v.view(); + x = atomKK->k_x.view(); + mask = atomKK->k_mask.view(); + int nlocal = atom->nlocal; + + if (atom->nmax > maxbias) { + //memoryKK->destroy_kokkos(vbiasall); + maxbias = atom->nmax; + //memoryKK->create_kokkos(vbiasall,maxbias,"temp/deform/kk:vbiasall"); + vbiasall = typename ArrayTypes::t_v_array("temp/deform/kk:vbiasall", maxbias); + } + + /**************** EVK ****************/ + // Convert from box coords to lamda coords + domainKK->x2lamda(nlocal); + + h_rate = domain->h_rate; + h_ratelo = domain->h_ratelo; + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + copymode = 0; + + /**************** EVK ****************/ + // Convert back to box coords + domainKK->lamda2x(nlocal); +} + +template +KOKKOS_INLINE_FUNCTION +void ComputeTempDeformKokkos::operator()(TagComputeTempDeformRemoveBias, const int &i) const { + if (mask[i] & groupbit) { + vbiasall(i,0) = h_rate[0]*x(i,0) + h_rate[5]*x(i,1) + h_rate[4]*x(i,2) + h_ratelo[0]; + vbiasall(i,1) = h_rate[1]*x(i,1) + h_rate[3]*x(i,2) + h_ratelo[1]; + vbiasall(i,2) = h_rate[2]*x(i,2) + h_ratelo[2]; + v(i,0) -= vbiasall(i,0); + v(i,1) -= vbiasall(i,1); + v(i,2) -= vbiasall(i,2); + } +} + +/* ---------------------------------------------------------------------- */ +template +void ComputeTempDeformKokkos::restore_bias_all() +{ + atomKK->sync(execution_space,datamask_read); + v = atomKK->k_v.view(); + x = atomKK->k_x.view(); + mask = atomKK->k_mask.view(); + int nlocal = atom->nlocal; + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void ComputeTempDeformKokkos::operator()(TagComputeTempDeformRestoreBias, const int &i) const { + if (mask[i] & groupbit) { + v(i,0) += vbiasall(i,0); + v(i,1) += vbiasall(i,1); + v(i,2) += vbiasall(i,2); + } +} + +namespace LAMMPS_NS { +template class ComputeTempDeformKokkos; +#ifdef LMP_KOKKOS_GPU +template class ComputeTempDeformKokkos; +#endif +} diff --git a/src/KOKKOS/compute_temp_deform_kokkos.h b/src/KOKKOS/compute_temp_deform_kokkos.h new file mode 100644 index 0000000000..4ff6d59674 --- /dev/null +++ b/src/KOKKOS/compute_temp_deform_kokkos.h @@ -0,0 +1,127 @@ +// clang-format off +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(temp/deform/kk,ComputeTempDeformKokkos); +ComputeStyle(temp/deform/kk/device,ComputeTempDeformKokkos); +ComputeStyle(temp/deform/kk/host,ComputeTempDeformKokkos); +// clang-format on +#else + +#ifndef LMP_COMPUTE_TEMP_DEFORM_KOKKOS_H +#define LMP_COMPUTE_TEMP_DEFORM_KOKKOS_H + +#include "compute_temp_deform.h" +#include "kokkos_type.h" +#include "domain_kokkos.h" +#include "kokkos_few.h" + +namespace LAMMPS_NS { + +template +struct TagComputeTempDeformScalar{}; + +template +struct TagComputeTempDeformVector{}; + +struct TagComputeTempDeformRemoveBias{}; + +struct TagComputeTempDeformRestoreBias{}; + +template +class ComputeTempDeformKokkos: public ComputeTempDeform { + public: + struct s_CTEMP { + double t0, t1, t2, t3, t4, t5; + KOKKOS_INLINE_FUNCTION + s_CTEMP() { + t0 = t1 = t2 = t3 = t4 = t5 = 0.0; + } + KOKKOS_INLINE_FUNCTION + s_CTEMP& operator+=(const s_CTEMP &rhs) { + t0 += rhs.t0; + t1 += rhs.t1; + t2 += rhs.t2; + t3 += rhs.t3; + t4 += rhs.t4; + t5 += rhs.t5; + return *this; + } + + KOKKOS_INLINE_FUNCTION + void operator+=(const volatile s_CTEMP &rhs) volatile { + t0 += rhs.t0; + t1 += rhs.t1; + t2 += rhs.t2; + t3 += rhs.t3; + t4 += rhs.t4; + t5 += rhs.t5; + } + }; + + typedef s_CTEMP CTEMP; + typedef CTEMP value_type; + typedef DeviceType device_type; + typedef ArrayTypes AT; + + ComputeTempDeformKokkos(class LAMMPS *, int, char **); + ~ComputeTempDeformKokkos(); + double compute_scalar(); + void compute_vector(); + void remove_bias_all(); + void restore_bias_all(); + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagComputeTempDeformScalar, const int&, CTEMP&) const; + + template + KOKKOS_INLINE_FUNCTION + void operator()(TagComputeTempDeformVector, const int&, CTEMP&) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagComputeTempDeformRemoveBias, const int &i) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagComputeTempDeformRestoreBias, const int &i) const; + + protected: + typename ArrayTypes::t_x_array_randomread x; + typename ArrayTypes::t_v_array v; + typename ArrayTypes::t_v_array vbiasall; + typename ArrayTypes::t_float_1d_randomread rmass; + typename ArrayTypes::t_float_1d_randomread mass; + typename ArrayTypes::t_int_1d_randomread type; + typename ArrayTypes::t_int_1d_randomread mask; + + class DomainKokkos *domainKK; + + Few h_rate, h_ratelo; + + }; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Temperature compute degrees of freedom < 0 + +This should not happen if you are calculating the temperature +on a valid set of atoms. + +*/ diff --git a/src/KOKKOS/compute_temp_kokkos.h b/src/KOKKOS/compute_temp_kokkos.h index 792e2e17db..4cbace02d7 100644 --- a/src/KOKKOS/compute_temp_kokkos.h +++ b/src/KOKKOS/compute_temp_kokkos.h @@ -28,6 +28,16 @@ ComputeStyle(temp/kk/host,ComputeTempKokkos); namespace LAMMPS_NS { +template +struct TagComputeTempScalar{}; + +template +struct TagComputeTempVector{}; + +template +class ComputeTempKokkos : public ComputeTemp { + public: + struct s_CTEMP { double t0, t1, t2, t3, t4, t5; KOKKOS_INLINE_FUNCTION @@ -55,23 +65,14 @@ namespace LAMMPS_NS { t5 += rhs.t5; } }; + typedef s_CTEMP CTEMP; - -template -struct TagComputeTempScalar{}; - -template -struct TagComputeTempVector{}; - -template -class ComputeTempKokkos : public ComputeTemp { - public: typedef DeviceType device_type; typedef CTEMP value_type; typedef ArrayTypes AT; ComputeTempKokkos(class LAMMPS *, int, char **); - virtual ~ComputeTempKokkos() {} + virtual ~ComputeTempKokkos() {}; double compute_scalar(); void compute_vector(); diff --git a/src/compute_temp_deform.cpp b/src/compute_temp_deform.cpp index 0c158e96e6..7b17b12fd8 100644 --- a/src/compute_temp_deform.cpp +++ b/src/compute_temp_deform.cpp @@ -56,8 +56,11 @@ ComputeTempDeform::ComputeTempDeform(LAMMPS *lmp, int narg, char **arg) : ComputeTempDeform::~ComputeTempDeform() { - memory->destroy(vbiasall); - delete [] vector; + if (!copymode) + { + memory->destroy(vbiasall); + delete [] vector; + } } /* ---------------------------------------------------------------------- */ @@ -69,7 +72,7 @@ void ComputeTempDeform::init() // check fix deform remap settings for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { + if (strncmp(modify->fix[i]->style,"deform", 6) == 0) { if (((FixDeform *) modify->fix[i])->remapflag == Domain::X_REMAP && comm->me == 0) error->warning(FLERR,"Using compute temp/deform with inconsistent " From 8945d81be3e444b412860987b86e8853f6a010c3 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Thu, 29 Jul 2021 09:54:15 +1000 Subject: [PATCH 009/437] Added Kokkos accelerated SLLOD thermostat (nvt/sllod/kk). --- src/KOKKOS/fix_nvt_sllod_kokkos.cpp | 171 ++++++++++++++++++++++++++++ src/KOKKOS/fix_nvt_sllod_kokkos.h | 97 ++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 src/KOKKOS/fix_nvt_sllod_kokkos.cpp create mode 100644 src/KOKKOS/fix_nvt_sllod_kokkos.h diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp new file mode 100644 index 0000000000..7d9ad3a61a --- /dev/null +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp @@ -0,0 +1,171 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/ + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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 authors: Emily Kahl (UQ, e.kahl@uq.edu.au) +------------------------------------------------------------------------- */ + +#include "fix_nvt_sllod_kokkos.h" + +#include "atom.h" +#include "compute.h" +#include "domain.h" +#include "error.h" +#include "fix.h" +#include "fix_deform_kokkos.h" +#include "group.h" +#include "math_extra.h" +#include "modify.h" +#include "atom_kokkos.h" +#include "atom.h" +#include "atom_masks.h" +#include "kokkos_few.h" +#include "memory_kokkos.h" + +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +template +FixNVTSllodKokkos::FixNVTSllodKokkos(LAMMPS *lmp, int narg, char **arg) : + FixNHKokkos(lmp, narg, arg) +{ + /************************ EVK *********************/ + atomKK = (AtomKokkos *) this->atom; + this->kokkosable = 1; + this->domainKK = (DomainKokkos *) this->domain; + + if (!this->tstat_flag) + this->error->all(FLERR,"Temperature control must be used with fix nvt/kk"); + if (this->pstat_flag) + this->error->all(FLERR,"Pressure control can not be used with fix nvt/kk"); + + if (this->mtchain_default_flag) this->mtchain = 1; + + this->id_temp = utils::strdup(std::string(this->id)+"_temp"); + this->modify->add_compute(fmt::format("{} all temp/deform/kk",this->id_temp)); + this->tcomputeflag = 1; +} + +/* ---------------------------------------------------------------------- */ + +template +FixNVTSllodKokkos::~FixNVTSllodKokkos() +{ + + +} + +/* ---------------------------------------------------------------------- */ + +template +void FixNVTSllodKokkos::init() +{ + FixNHKokkos::init(); + + vdelu = typename ArrayTypes::t_v_array("nvt/sllod/kk:vdelu", atomKK->nlocal); + + if (!this->temperature->tempbias) + this->error->all(FLERR,"Temperature for fix nvt/sllod does not have a bias"); + + nondeformbias = 0; + if (strncmp(this->temperature->style,"temp/deform", 11) != 0) nondeformbias = 1; + + // check fix deform remap settings + + int i; + for (i = 0; i < this->modify->nfix; i++) + if (strncmp(this->modify->fix[i]->style,"deform",6) == 0) { + if (((FixDeform *) this->modify->fix[i])->remapflag != Domain::V_REMAP) + this->error->all(FLERR,"Using fix nvt/sllod with inconsistent fix deform " + "remap option"); + break; + } + if (i == this->modify->nfix) + this->error->all(FLERR,"Using fix nvt/sllod with no fix deform defined"); +} + +/* ---------------------------------------------------------------------- + perform half-step scaling of velocities +-----------------------------------------------------------------------*/ + +template +void FixNVTSllodKokkos::nh_v_temp() +{ + // remove and restore bias = streaming velocity = Hrate*lamda + Hratelo + // thermostat thermal velocity only + // vdelu = SLLOD correction = Hrate*Hinv*vthermal + // for non temp/deform BIAS: + // calculate temperature since some computes require temp + // computed on current nlocal atoms to remove bias + + if (nondeformbias){ + atomKK->sync(this->temperature->execution_space,this->temperature->datamask_read); + this->temperature->compute_scalar(); + atomKK->modified(this->temperature->execution_space,this->temperature->datamask_modify); + } + v = atomKK->k_v.view(); + mask = atomKK->k_mask.view(); + int nlocal = atomKK->nlocal; + if (this->igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; + + double h_two[6]; + MathExtra::multiply_shape_shape(this->domain->h_rate,this->domain->h_inv,h_two); + + d_h_two = Few(h_two); + + this->copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + this->copymode = 0; + + this->temperature->remove_bias_all(); + + this->copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + this->copymode = 0; + + this->temperature->restore_bias_all(); +} + +template +KOKKOS_INLINE_FUNCTION +void FixNVTSllodKokkos::operator()(TagFixNVTSllod_temp1, const int &i) const { + if (mask[i] & this->groupbit) { + vdelu(i,0) = d_h_two[0]*v(i,0) + d_h_two[5]*v(i,1) + d_h_two[4]*v(i,2); + vdelu(i,1) = d_h_two[1]*v(i,1) + d_h_two[3]*v(i,2); + vdelu(i,2) = d_h_two[2]*v(i,2); + } +} + +template +KOKKOS_INLINE_FUNCTION +void FixNVTSllodKokkos::operator()(TagFixNVTSllod_temp2, const int &i) const { + if (mask[i] & this->groupbit) { + v(i,0) = v(i,0)*this->factor_eta - this->dthalf*vdelu(i,0); + v(i,1) = v(i,1)*this->factor_eta - this->dthalf*vdelu(i,1); + v(i,2) = v(i,2)*this->factor_eta - this->dthalf*vdelu(i,2); + } +} + +namespace LAMMPS_NS { +template class FixNVTSllodKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixNVTSllodKokkos; +#endif +} + + diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.h b/src/KOKKOS/fix_nvt_sllod_kokkos.h new file mode 100644 index 0000000000..85b4e54bcd --- /dev/null +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.h @@ -0,0 +1,97 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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 FIX_CLASS +// clang-format off +FixStyle(nvt/sllod/kk,FixNVTSllodKokkos); +FixStyle(nvt/sllod/kk/device,FixNVTSllodKokkos); +FixStyle(nvt/sllod/kk/host,FixNVTSllodKokkos); +// clang-format on +#else + +#ifndef LMP_FIX_NVT_SLLOD_KOKKOS_H +#define LMP_FIX_NVT_SLLOD_KOKKOS_H + +#include "fix_nh_kokkos.h" +//#include "fix_nvt_sllod.h" +#include "kokkos_type.h" +#include "kokkos_few.h" + +namespace LAMMPS_NS { + +struct TagFixNVTSllod_temp1{}; +struct TagFixNVTSllod_temp2{}; + +template +class FixNVTSllodKokkos : public FixNHKokkos { + public: + FixNVTSllodKokkos(class LAMMPS *, int, char **); + ~FixNVTSllodKokkos(); + void init(); + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixNVTSllod_temp1, const int& i) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixNVTSllod_temp2, const int& i) const; + + private: + int nondeformbias; + + void nh_v_temp(); + + protected: + typename ArrayTypes::t_x_array x; + typename ArrayTypes::t_v_array v; + typename ArrayTypes::t_v_array vdelu; + typename ArrayTypes::t_f_array_const f; + typename ArrayTypes::t_float_1d rmass; + typename ArrayTypes::t_float_1d mass; + typename ArrayTypes::t_int_1d type; + typename ArrayTypes::t_int_1d mask; + + Few d_h_two; + + class DomainKokkos *domainKK; + class AtomKokkos *atomKK; +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Temperature control must be used with fix nvt/sllod + +Self-explanatory. + +E: Pressure control can not be used with fix nvt/sllod + +Self-explanatory. + +E: Temperature for fix nvt/sllod does not have a bias + +The specified compute must compute temperature with a bias. + +E: Using fix nvt/sllod with inconsistent fix deform remap option + +Fix nvt/sllod requires that deforming atoms have a velocity profile +provided by "remap v" as a fix deform option. + +E: Using fix nvt/sllod with no fix deform defined + +Self-explanatory. + +*/ From 8ae9d51466b49767399f2f71d1c22b4125fcb82c Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Mon, 2 Aug 2021 14:46:03 +1000 Subject: [PATCH 010/437] Fixed memory issues in ComputeTempDeformKokkos. --- src/KOKKOS/compute_temp_deform_kokkos.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/compute_temp_deform_kokkos.cpp b/src/KOKKOS/compute_temp_deform_kokkos.cpp index 6040504aeb..2716c4688e 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.cpp +++ b/src/KOKKOS/compute_temp_deform_kokkos.cpp @@ -80,6 +80,8 @@ double ComputeTempDeformKokkos::compute_scalar() /**************** EVK ****************/ // Convert from box coords to lamda coords domainKK->x2lamda(nlocal); + h_rate = domainKK->h_rate; + h_ratelo = domainKK->h_ratelo; copymode = 1; if (atomKK->rmass) @@ -108,8 +110,6 @@ template KOKKOS_INLINE_FUNCTION void ComputeTempDeformKokkos::operator()(TagComputeTempDeformScalar, const int &i, CTEMP& t_kk) const { - double *h_rate = domainKK->h_rate; - double *h_ratelo = domainKK->h_ratelo; double vstream[3],vthermal[3]; vstream[0] = h_rate[0]*x(i,0) + h_rate[5]*x(i,1) + h_rate[4]*x(i,2) + h_ratelo[0]; @@ -154,6 +154,8 @@ void ComputeTempDeformKokkos::compute_vector() /**************** EVK ****************/ // Convert from box coords to lamda coords domainKK->x2lamda(nlocal); + h_rate = domainKK->h_rate; + h_ratelo = domainKK->h_ratelo; copymode = 1; if (atomKK->rmass) @@ -182,8 +184,6 @@ template KOKKOS_INLINE_FUNCTION void ComputeTempDeformKokkos::operator()(TagComputeTempDeformVector, const int &i, CTEMP& t_kk) const { - double *h_rate = domainKK->h_rate; - double *h_ratelo = domainKK->h_ratelo; double vstream[3],vthermal[3]; vstream[0] = h_rate[0]*x(i,0) + h_rate[5]*x(i,1) + h_rate[4]*x(i,2) + h_ratelo[0]; From d7f9f9fead0744fb1ff07e50609fc16550d7e933 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Mon, 9 Aug 2021 10:19:32 +1000 Subject: [PATCH 011/437] Updated documentation to include Kokkos accelerated NEMD styles. Also tidied up header files and attribution to fit LAMMPS coding style. --- doc/src/Commands_compute.rst | 2 +- doc/src/Commands_fix.rst | 2 +- doc/src/compute_temp_deform.rst | 3 +++ doc/src/fix_nvt_sllod.rst | 3 ++- src/KOKKOS/compute_temp_deform_kokkos.cpp | 3 ++- src/KOKKOS/compute_temp_deform_kokkos.h | 1 - src/KOKKOS/fix_nvt_sllod_kokkos.cpp | 2 +- 7 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 9dfb28fa8b..2c67d44f24 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -152,7 +152,7 @@ KOKKOS, o = OPENMP, t = OPT. * :doc:`temp/chunk ` * :doc:`temp/com ` * :doc:`temp/cs ` - * :doc:`temp/deform ` + * :doc:`temp/deform (k) ` * :doc:`temp/deform/eff ` * :doc:`temp/drude ` * :doc:`temp/eff ` diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 45a75ff394..08857b96ec 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -148,7 +148,7 @@ OPT. * :doc:`nvt/body ` * :doc:`nvt/eff ` * :doc:`nvt/manifold/rattle ` - * :doc:`nvt/sllod (io) ` + * :doc:`nvt/sllod (iko) ` * :doc:`nvt/sllod/eff ` * :doc:`nvt/sphere (o) ` * :doc:`nvt/uef ` diff --git a/doc/src/compute_temp_deform.rst b/doc/src/compute_temp_deform.rst index bc4d1ae3f3..6c61f7bc93 100644 --- a/doc/src/compute_temp_deform.rst +++ b/doc/src/compute_temp_deform.rst @@ -1,8 +1,11 @@ .. index:: compute temp/deform +.. index:: compute temp/deform/kk compute temp/deform command =========================== +Accelerator Variants: *temp/deform/kk* + Syntax """""" diff --git a/doc/src/fix_nvt_sllod.rst b/doc/src/fix_nvt_sllod.rst index 9ff22bca09..3d041ca767 100644 --- a/doc/src/fix_nvt_sllod.rst +++ b/doc/src/fix_nvt_sllod.rst @@ -1,11 +1,12 @@ .. index:: fix nvt/sllod .. index:: fix nvt/sllod/intel .. index:: fix nvt/sllod/omp +.. index:: fix nvt/sllod/kk fix nvt/sllod command ===================== -Accelerator Variants: *nvt/sllod/intel*, *nvt/sllod/omp* +Accelerator Variants: *nvt/sllod/intel*, *nvt/sllod/omp*, *nvt/sllod/kk* Syntax """""" diff --git a/src/KOKKOS/compute_temp_deform_kokkos.cpp b/src/KOKKOS/compute_temp_deform_kokkos.cpp index 2716c4688e..7846e18113 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.cpp +++ b/src/KOKKOS/compute_temp_deform_kokkos.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Emily Kahl (UQ) + Contributing authors: Emily Kahl (Uni. of QLD, e.kahl@uq.edu.au) ------------------------------------------------------------------------- */ #include "compute_temp_deform_kokkos.h" @@ -25,6 +25,7 @@ #include "force.h" #include "update.h" #include "memory_kokkos.h" +#include "domain_kokkos.h" #include diff --git a/src/KOKKOS/compute_temp_deform_kokkos.h b/src/KOKKOS/compute_temp_deform_kokkos.h index 4ff6d59674..9f32069604 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.h +++ b/src/KOKKOS/compute_temp_deform_kokkos.h @@ -25,7 +25,6 @@ ComputeStyle(temp/deform/kk/host,ComputeTempDeformKokkos); #include "compute_temp_deform.h" #include "kokkos_type.h" -#include "domain_kokkos.h" #include "kokkos_few.h" namespace LAMMPS_NS { diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp index 7d9ad3a61a..68574adff0 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Emily Kahl (UQ, e.kahl@uq.edu.au) + Contributing authors: Emily Kahl (Uni. of QLD, e.kahl@uq.edu.au) ------------------------------------------------------------------------- */ #include "fix_nvt_sllod_kokkos.h" From b385c85440c5ab10af686282ee4bd9794f329231 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Wed, 11 Aug 2021 14:05:45 +1000 Subject: [PATCH 012/437] Refactored PPPMKokkos::setup_triclinic kernel indexing to be more consistent the rest of the codebase. This commit "fixes" the temporary solution using Kokkos::MDRange in commit a98b8bee88. --- src/KOKKOS/pppm_kokkos.cpp | 20 ++++++++++++++------ src/KOKKOS/pppm_kokkos.h | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 3fe93f6825..e2956036c3 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -479,9 +479,13 @@ void PPPMKokkos::setup_triclinic() delzinv = nz_pppm; delvolinv = delxinv*delyinv*delzinv/volume; + numz_fft = nzhi_fft-nzlo_fft + 1; + numy_fft = nyhi_fft-nylo_fft + 1; + numx_fft = nxhi_fft-nxlo_fft + 1; + const int inum_fft = numz_fft*numy_fft*numx_fft; + copymode = 1; - Kokkos::parallel_for(Kokkos::MDRangePolicy, DeviceType, TagPPPM_setup_triclinic1>\ - ({nzlo_fft, nylo_fft, nxlo_fft}, {nzhi_fft+1, nyhi_fft+1, nxhi_fft+1}),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); copymode = 0; // virial coefficients @@ -495,14 +499,18 @@ void PPPMKokkos::setup_triclinic() template KOKKOS_INLINE_FUNCTION -void PPPMKokkos::operator()(TagPPPM_setup_triclinic1, const int &k, const int &j, const int& i) const +void PPPMKokkos::operator()(TagPPPM_setup_triclinic1, const int &n) const { + int k = n/(numy_fft*numx_fft); + int j = (n - k*numy_fft*numx_fft) / numx_fft; + int i = n - k*numy_fft*numx_fft - j*numx_fft; + k += nzlo_fft; + j += nylo_fft; + i += nxlo_fft; + double per_k = k - nz_pppm*(2*k/nz_pppm); double per_j = j - ny_pppm*(2*j/ny_pppm); double per_i = i - nx_pppm*(2*i/nx_pppm); - // n corresponds to the "number" of this iteration if we were to execute the loop monotonically and in serial - int n = (nxhi_fft - nxlo_fft + 1)*(nyhi_fft - nylo_fft + 1)*(k - nzlo_fft)+ - (nxhi_fft - nxlo_fft + 1)*(j - nylo_fft) + (i - nxlo_fft); double unitk_lamda[3]; unitk_lamda[0] = 2.0*MY_PI*per_i; diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index e7c55b1726..ad8612e637 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -141,7 +141,7 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT { void operator()(TagPPPM_setup4, const int&) const; KOKKOS_INLINE_FUNCTION - void operator()(TagPPPM_setup_triclinic1, const int&, const int&, const int&) const; + void operator()(TagPPPM_setup_triclinic1, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(TagPPPM_setup_triclinic2, const int&) const; From 2e59b5c4de8eb195411abb8d32e7887c147e7ff7 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Wed, 18 Aug 2021 15:18:55 +1000 Subject: [PATCH 013/437] Fixed whitespace errors and removed some extraneous comments. --- src/KOKKOS/compute_temp_deform_kokkos.cpp | 20 +++------------ src/KOKKOS/fix_nvt_sllod_kokkos.cpp | 11 ++++----- src/KOKKOS/fix_nvt_sllod_kokkos.h | 3 +-- src/KOKKOS/pppm_kokkos.cpp | 30 +++++++++++------------ src/KOKKOS/pppm_kokkos.h | 20 +++++++-------- 5 files changed, 33 insertions(+), 51 deletions(-) diff --git a/src/KOKKOS/compute_temp_deform_kokkos.cpp b/src/KOKKOS/compute_temp_deform_kokkos.cpp index 7846e18113..91d7d3f942 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.cpp +++ b/src/KOKKOS/compute_temp_deform_kokkos.cpp @@ -49,7 +49,7 @@ ComputeTempDeformKokkos::ComputeTempDeformKokkos(LAMMPS *lmp, int na } template -ComputeTempDeformKokkos::~ComputeTempDeformKokkos() +ComputeTempDeformKokkos::~ComputeTempDeformKokkos() { @@ -78,12 +78,10 @@ double ComputeTempDeformKokkos::compute_scalar() double t = 0.0; CTEMP t_kk; - /**************** EVK ****************/ - // Convert from box coords to lamda coords domainKK->x2lamda(nlocal); h_rate = domainKK->h_rate; h_ratelo = domainKK->h_ratelo; - + copymode = 1; if (atomKK->rmass) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); @@ -91,11 +89,9 @@ double ComputeTempDeformKokkos::compute_scalar() Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); copymode = 0; - /**************** EVK ****************/ - // Convert back to box coords domainKK->lamda2x(nlocal); - t = t_kk.t0; // could make this more efficient + t = t_kk.t0; MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); if (dynamic) dof_compute(); @@ -152,8 +148,6 @@ void ComputeTempDeformKokkos::compute_vector() for (i = 0; i < 6; i++) t[i] = 0.0; CTEMP t_kk; - /**************** EVK ****************/ - // Convert from box coords to lamda coords domainKK->x2lamda(nlocal); h_rate = domainKK->h_rate; h_ratelo = domainKK->h_ratelo; @@ -165,8 +159,6 @@ void ComputeTempDeformKokkos::compute_vector() Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); copymode = 0; - /**************** EVK ****************/ - // Convert back to box coords domainKK->lamda2x(nlocal); t[0] = t_kk.t0; @@ -218,14 +210,10 @@ void ComputeTempDeformKokkos::remove_bias_all() int nlocal = atom->nlocal; if (atom->nmax > maxbias) { - //memoryKK->destroy_kokkos(vbiasall); maxbias = atom->nmax; - //memoryKK->create_kokkos(vbiasall,maxbias,"temp/deform/kk:vbiasall"); vbiasall = typename ArrayTypes::t_v_array("temp/deform/kk:vbiasall", maxbias); } - /**************** EVK ****************/ - // Convert from box coords to lamda coords domainKK->x2lamda(nlocal); h_rate = domain->h_rate; @@ -235,8 +223,6 @@ void ComputeTempDeformKokkos::remove_bias_all() Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); copymode = 0; - /**************** EVK ****************/ - // Convert back to box coords domainKK->lamda2x(nlocal); } diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp index 68574adff0..1ed99cc77c 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp @@ -44,7 +44,6 @@ template FixNVTSllodKokkos::FixNVTSllodKokkos(LAMMPS *lmp, int narg, char **arg) : FixNHKokkos(lmp, narg, arg) { - /************************ EVK *********************/ atomKK = (AtomKokkos *) this->atom; this->kokkosable = 1; this->domainKK = (DomainKokkos *) this->domain; @@ -55,7 +54,7 @@ FixNVTSllodKokkos::FixNVTSllodKokkos(LAMMPS *lmp, int narg, char **a this->error->all(FLERR,"Pressure control can not be used with fix nvt/kk"); if (this->mtchain_default_flag) this->mtchain = 1; - + this->id_temp = utils::strdup(std::string(this->id)+"_temp"); this->modify->add_compute(fmt::format("{} all temp/deform/kk",this->id_temp)); this->tcomputeflag = 1; @@ -78,7 +77,7 @@ void FixNVTSllodKokkos::init() FixNHKokkos::init(); vdelu = typename ArrayTypes::t_v_array("nvt/sllod/kk:vdelu", atomKK->nlocal); - + if (!this->temperature->tempbias) this->error->all(FLERR,"Temperature for fix nvt/sllod does not have a bias"); @@ -112,8 +111,8 @@ void FixNVTSllodKokkos::nh_v_temp() // for non temp/deform BIAS: // calculate temperature since some computes require temp // computed on current nlocal atoms to remove bias - - if (nondeformbias){ + + if (nondeformbias){ atomKK->sync(this->temperature->execution_space,this->temperature->datamask_read); this->temperature->compute_scalar(); atomKK->modified(this->temperature->execution_space,this->temperature->datamask_modify); @@ -133,7 +132,7 @@ void FixNVTSllodKokkos::nh_v_temp() this->copymode = 0; this->temperature->remove_bias_all(); - + this->copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); this->copymode = 0; diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.h b/src/KOKKOS/fix_nvt_sllod_kokkos.h index 85b4e54bcd..15af600430 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.h +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.h @@ -23,7 +23,6 @@ FixStyle(nvt/sllod/kk/host,FixNVTSllodKokkos); #define LMP_FIX_NVT_SLLOD_KOKKOS_H #include "fix_nh_kokkos.h" -//#include "fix_nvt_sllod.h" #include "kokkos_type.h" #include "kokkos_few.h" @@ -61,7 +60,7 @@ class FixNVTSllodKokkos : public FixNHKokkos { typename ArrayTypes::t_int_1d mask; Few d_h_two; - + class DomainKokkos *domainKK; class AtomKokkos *atomKK; }; diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index e2956036c3..b76e36c6e2 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1326,7 +1326,7 @@ void PPPMKokkos::compute_gf_ik_triclinic() nby = static_cast (tmp[1]); nbz = static_cast (tmp[2]); - // Update the local copy of the domain box tilt + // Update the local copy of the domain box tilt h = Few(domain->h); h_inv = Few(domain->h_inv); @@ -1342,58 +1342,58 @@ KOKKOS_INLINE_FUNCTION void PPPMKokkos::operator()(TagPPPM_compute_gf_ik_triclinic, const int &m) const { int n = (m - nzlo_fft)*(nyhi_fft+1 - nylo_fft)*(nxhi_fft+1 - nxlo_fft); - + const int mper = m - nz_pppm*(2*m/nz_pppm); const double snz = square(sin(MY_PI*mper/nz_pppm)); - + for (int l = nylo_fft; l <= nyhi_fft; l++) { const int lper = l - ny_pppm*(2*l/ny_pppm); const double sny = square(sin(MY_PI*lper/ny_pppm)); - + for (int k = nxlo_fft; k <= nxhi_fft; k++) { const int kper = k - nx_pppm*(2*k/nx_pppm); const double snx = square(sin(MY_PI*kper/nx_pppm)); - + double unitk_lamda[3]; unitk_lamda[0] = 2.0*MY_PI*kper; unitk_lamda[1] = 2.0*MY_PI*lper; unitk_lamda[2] = 2.0*MY_PI*mper; x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]); - + const double sqk = square(unitk_lamda[0]) + square(unitk_lamda[1]) + square(unitk_lamda[2]); - + if (sqk != 0.0) { const double numerator = 12.5663706/sqk; const double denominator = gf_denom(snx,sny,snz); double sum1 = 0.0; - + for (int nx = -nbx; nx <= nbx; nx++) { const double argx = MY_PI*kper/nx_pppm + MY_PI*nx; const double wx = powsinxx(argx,twoorder); - + for (int ny = -nby; ny <= nby; ny++) { const double argy = MY_PI*lper/ny_pppm + MY_PI*ny; const double wy = powsinxx(argy,twoorder); - + for (int nz = -nbz; nz <= nbz; nz++) { const double argz = MY_PI*mper/nz_pppm + MY_PI*nz; const double wz = powsinxx(argz,twoorder); - + double b[3]; b[0] = 2.0*MY_PI*nx_pppm*nx; b[1] = 2.0*MY_PI*ny_pppm*ny; b[2] = 2.0*MY_PI*nz_pppm*nz; x2lamdaT(&b[0],&b[0]); - + const double qx = unitk_lamda[0]+b[0]; const double sx = exp(-0.25*square(qx/g_ewald)); - + const double qy = unitk_lamda[1]+b[1]; const double sy = exp(-0.25*square(qy/g_ewald)); - + const double qz = unitk_lamda[2]+b[2]; const double sz = exp(-0.25*square(qz/g_ewald)); - + const double dot1 = unitk_lamda[0]*qx + unitk_lamda[1]*qy + unitk_lamda[2]*qz; const double dot2 = qx*qx+qy*qy+qz*qz; sum1 += (dot1/dot2) * sx*sy*sz * wx*wy*wz; diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index ad8612e637..f9e2b1a62a 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -317,22 +317,20 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT { int numx_out,numy_out,numz_out; int ix,iy,nlocal; - // Local copies of the domain box tilt etc. - // TODO: Will need to put in a less - // hacky solution later, since this needs to be manually updated + // Local copies of the domain box tilt etc. Few h, h_inv; KOKKOS_INLINE_FUNCTION void x2lamdaT(double* v, double* lamda) const { - double lamda_tmp[3]; - - lamda_tmp[0] = h_inv[0]*v[0]; - lamda_tmp[1] = h_inv[5]*v[0] + h_inv[1]*v[1]; - lamda_tmp[2] = h_inv[4]*v[0] + h_inv[3]*v[1] + h_inv[2]*v[2]; - - lamda[0] = lamda_tmp[0]; - lamda[1] = lamda_tmp[1]; + double lamda_tmp[3]; + + lamda_tmp[0] = h_inv[0]*v[0]; + lamda_tmp[1] = h_inv[5]*v[0] + h_inv[1]*v[1]; + lamda_tmp[2] = h_inv[4]*v[0] + h_inv[3]*v[1] + h_inv[2]*v[2]; + + lamda[0] = lamda_tmp[0]; + lamda[1] = lamda_tmp[1]; lamda[2] = lamda_tmp[2]; } From 4876e0cbb697128ce4df8c8e4753c992efcda4d4 Mon Sep 17 00:00:00 2001 From: Emily Kahl Date: Wed, 18 Aug 2021 17:37:00 +1000 Subject: [PATCH 014/437] Changed URLs in the headers to point to the new LAMMPS site. --- src/KOKKOS/fix_nvt_sllod_kokkos.h | 4 ++-- src/KOKKOS/pppm_kokkos.cpp | 2 +- src/KOKKOS/pppm_kokkos.h | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.h b/src/KOKKOS/fix_nvt_sllod_kokkos.h index 15af600430..4e731c4b70 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.h +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.h @@ -1,7 +1,7 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - www.cs.sandia.gov/~sjplimp/lammps.html - Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + https://www.lammps.org/, 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 diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index b76e36c6e2..16cdce16de 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://lammps.sandia.gov/, Sandia National Laboratories + https://lammps.org/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index f9e2b1a62a..9a69a82762 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -1,6 +1,7 @@ +// clang-format off /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://lammps.sandia.gov/, Sandia National Laboratories + https://lammps.org/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract @@ -12,11 +13,11 @@ ------------------------------------------------------------------------- */ #ifdef KSPACE_CLASS - +// clang-format off KSpaceStyle(pppm/kk,PPPMKokkos) KSpaceStyle(pppm/kk/device,PPPMKokkos) KSpaceStyle(pppm/kk/host,PPPMKokkos) - +// clang-format on #else #ifndef LMP_PPPM_KOKKOS_H From 511ac4994986cf269f135e3830d9a3ea8d6c4294 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 05:53:23 -0400 Subject: [PATCH 015/437] reformat, minor cosmetic changes --- src/KOKKOS/compute_temp_deform_kokkos.cpp | 6 +- src/KOKKOS/compute_temp_deform_kokkos.h | 2 +- src/KOKKOS/compute_temp_kokkos.h | 5 +- src/KOKKOS/fix_nvt_sllod_kokkos.cpp | 28 ++--- src/KOKKOS/fix_nvt_sllod_kokkos.h | 5 +- src/KOKKOS/pppm_kokkos.cpp | 2 +- src/KOKKOS/pppm_kokkos.h | 11 +- src/compute_temp_deform.cpp | 130 +++++++++++----------- 8 files changed, 85 insertions(+), 104 deletions(-) diff --git a/src/KOKKOS/compute_temp_deform_kokkos.cpp b/src/KOKKOS/compute_temp_deform_kokkos.cpp index 91d7d3f942..1d7d087200 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.cpp +++ b/src/KOKKOS/compute_temp_deform_kokkos.cpp @@ -21,13 +21,11 @@ #include "atom_kokkos.h" #include "atom_masks.h" #include "comm.h" +#include "domain_kokkos.h" #include "error.h" #include "force.h" -#include "update.h" #include "memory_kokkos.h" -#include "domain_kokkos.h" - -#include +#include "update.h" using namespace LAMMPS_NS; diff --git a/src/KOKKOS/compute_temp_deform_kokkos.h b/src/KOKKOS/compute_temp_deform_kokkos.h index 9f32069604..8b53c1f633 100644 --- a/src/KOKKOS/compute_temp_deform_kokkos.h +++ b/src/KOKKOS/compute_temp_deform_kokkos.h @@ -24,8 +24,8 @@ ComputeStyle(temp/deform/kk/host,ComputeTempDeformKokkos); #define LMP_COMPUTE_TEMP_DEFORM_KOKKOS_H #include "compute_temp_deform.h" -#include "kokkos_type.h" #include "kokkos_few.h" +#include "kokkos_type.h" namespace LAMMPS_NS { diff --git a/src/KOKKOS/compute_temp_kokkos.h b/src/KOKKOS/compute_temp_kokkos.h index 4cbace02d7..ae6ab485d2 100644 --- a/src/KOKKOS/compute_temp_kokkos.h +++ b/src/KOKKOS/compute_temp_kokkos.h @@ -1,4 +1,3 @@ -// clang-format off /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -19,13 +18,13 @@ ComputeStyle(temp/kk/device,ComputeTempKokkos); ComputeStyle(temp/kk/host,ComputeTempKokkos); // clang-format on #else - #ifndef LMP_COMPUTE_TEMP_KOKKOS_H #define LMP_COMPUTE_TEMP_KOKKOS_H #include "compute_temp.h" #include "kokkos_type.h" +// clang-format off namespace LAMMPS_NS { template @@ -72,7 +71,7 @@ class ComputeTempKokkos : public ComputeTemp { typedef ArrayTypes AT; ComputeTempKokkos(class LAMMPS *, int, char **); - virtual ~ComputeTempKokkos() {}; + virtual ~ComputeTempKokkos() {} double compute_scalar(); void compute_vector(); diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp index 1ed99cc77c..d0af72f17f 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp @@ -19,21 +19,19 @@ #include "fix_nvt_sllod_kokkos.h" #include "atom.h" +#include "atom.h" +#include "atom_kokkos.h" +#include "atom_masks.h" #include "compute.h" #include "domain.h" #include "error.h" #include "fix.h" #include "fix_deform_kokkos.h" #include "group.h" -#include "math_extra.h" -#include "modify.h" -#include "atom_kokkos.h" -#include "atom.h" -#include "atom_masks.h" #include "kokkos_few.h" +#include "math_extra.h" #include "memory_kokkos.h" - -#include +#include "modify.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -62,15 +60,6 @@ FixNVTSllodKokkos::FixNVTSllodKokkos(LAMMPS *lmp, int narg, char **a /* ---------------------------------------------------------------------- */ -template -FixNVTSllodKokkos::~FixNVTSllodKokkos() -{ - - -} - -/* ---------------------------------------------------------------------- */ - template void FixNVTSllodKokkos::init() { @@ -82,16 +71,15 @@ void FixNVTSllodKokkos::init() this->error->all(FLERR,"Temperature for fix nvt/sllod does not have a bias"); nondeformbias = 0; - if (strncmp(this->temperature->style,"temp/deform", 11) != 0) nondeformbias = 1; + if (utils::strmatch(this->temperature->style,"^temp/deform")) nondeformbias = 1; // check fix deform remap settings int i; for (i = 0; i < this->modify->nfix; i++) - if (strncmp(this->modify->fix[i]->style,"deform",6) == 0) { + if (utils::strmatch(this->modify->fix[i]->style,"^deform")) { if (((FixDeform *) this->modify->fix[i])->remapflag != Domain::V_REMAP) - this->error->all(FLERR,"Using fix nvt/sllod with inconsistent fix deform " - "remap option"); + this->error->all(FLERR,"Using fix nvt/sllod with inconsistent fix deform remap option"); break; } if (i == this->modify->nfix) diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.h b/src/KOKKOS/fix_nvt_sllod_kokkos.h index 4e731c4b70..6057ce44d0 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.h +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.h @@ -23,9 +23,10 @@ FixStyle(nvt/sllod/kk/host,FixNVTSllodKokkos); #define LMP_FIX_NVT_SLLOD_KOKKOS_H #include "fix_nh_kokkos.h" -#include "kokkos_type.h" #include "kokkos_few.h" +#include "kokkos_type.h" +// clang-format off namespace LAMMPS_NS { struct TagFixNVTSllod_temp1{}; @@ -35,7 +36,7 @@ template class FixNVTSllodKokkos : public FixNHKokkos { public: FixNVTSllodKokkos(class LAMMPS *, int, char **); - ~FixNVTSllodKokkos(); + ~FixNVTSllodKokkos() {} void init(); KOKKOS_INLINE_FUNCTION diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 16cdce16de..a7f58f2525 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://lammps.org/, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h index 9a69a82762..9a333135b7 100644 --- a/src/KOKKOS/pppm_kokkos.h +++ b/src/KOKKOS/pppm_kokkos.h @@ -1,7 +1,6 @@ -// clang-format off /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://lammps.org/, Sandia National Laboratories + https://www.lammps.org/, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract @@ -14,9 +13,9 @@ #ifdef KSPACE_CLASS // clang-format off -KSpaceStyle(pppm/kk,PPPMKokkos) -KSpaceStyle(pppm/kk/device,PPPMKokkos) -KSpaceStyle(pppm/kk/host,PPPMKokkos) +KSpaceStyle(pppm/kk,PPPMKokkos); +KSpaceStyle(pppm/kk/device,PPPMKokkos); +KSpaceStyle(pppm/kk/host,PPPMKokkos); // clang-format on #else @@ -31,6 +30,8 @@ KSpaceStyle(pppm/kk/host,PPPMKokkos) #include "kokkos_type.h" #include "kokkos_few.h" +// clang-format off + // fix up FFT defines for KOKKOS with CUDA #ifdef KOKKOS_ENABLE_CUDA diff --git a/src/compute_temp_deform.cpp b/src/compute_temp_deform.cpp index 7b17b12fd8..915e682219 100644 --- a/src/compute_temp_deform.cpp +++ b/src/compute_temp_deform.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -18,27 +17,25 @@ #include "compute_temp_deform.h" -#include -#include "domain.h" #include "atom.h" -#include "update.h" -#include "force.h" -#include "modify.h" +#include "comm.h" +#include "domain.h" +#include "error.h" #include "fix.h" #include "fix_deform.h" +#include "force.h" #include "group.h" -#include "comm.h" #include "memory.h" -#include "error.h" +#include "modify.h" +#include "update.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputeTempDeform::ComputeTempDeform(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputeTempDeform::ComputeTempDeform(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg != 3) error->all(FLERR,"Illegal compute temp/deform command"); + if (narg != 3) error->all(FLERR, "Illegal compute temp/deform command"); scalar_flag = vector_flag = 1; size_vector = 6; @@ -56,10 +53,9 @@ ComputeTempDeform::ComputeTempDeform(LAMMPS *lmp, int narg, char **arg) : ComputeTempDeform::~ComputeTempDeform() { - if (!copymode) - { + if (!copymode) { memory->destroy(vbiasall); - delete [] vector; + delete[] vector; } } @@ -72,16 +68,14 @@ void ComputeTempDeform::init() // check fix deform remap settings for (i = 0; i < modify->nfix; i++) - if (strncmp(modify->fix[i]->style,"deform", 6) == 0) { - if (((FixDeform *) modify->fix[i])->remapflag == Domain::X_REMAP && - comm->me == 0) - error->warning(FLERR,"Using compute temp/deform with inconsistent " - "fix deform remap option"); + if (utils::strmatch(modify->fix[i]->style, "^deform")) { + if (((FixDeform *) modify->fix[i])->remapflag == Domain::X_REMAP && comm->me == 0) + error->warning(FLERR, + "Using compute temp/deform with inconsistent fix deform remap option"); break; } if (i == modify->nfix && comm->me == 0) - error->warning(FLERR, - "Using compute temp/deform with no fix deform defined"); + error->warning(FLERR, "Using compute temp/deform with no fix deform defined"); } /* ---------------------------------------------------------------------- */ @@ -101,15 +95,17 @@ void ComputeTempDeform::dof_compute() natoms_temp = group->count(igroup); dof = domain->dimension * natoms_temp; dof -= extra_dof + fix_dof; - if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); - else tfactor = 0.0; + if (dof > 0) + tfactor = force->mvv2e / (dof * force->boltz); + else + tfactor = 0.0; } /* ---------------------------------------------------------------------- */ double ComputeTempDeform::compute_scalar() { - double lamda[3],vstream[3],vthermal[3]; + double lamda[3], vstream[3], vthermal[3]; invoked_scalar = update->ntimestep; @@ -132,26 +128,25 @@ double ComputeTempDeform::compute_scalar() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - domain->x2lamda(x[i],lamda); - vstream[0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + - h_rate[4]*lamda[2] + h_ratelo[0]; - vstream[1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; - vstream[2] = h_rate[2]*lamda[2] + h_ratelo[2]; + domain->x2lamda(x[i], lamda); + vstream[0] = h_rate[0] * lamda[0] + h_rate[5] * lamda[1] + h_rate[4] * lamda[2] + h_ratelo[0]; + vstream[1] = h_rate[1] * lamda[1] + h_rate[3] * lamda[2] + h_ratelo[1]; + vstream[2] = h_rate[2] * lamda[2] + h_ratelo[2]; vthermal[0] = v[i][0] - vstream[0]; vthermal[1] = v[i][1] - vstream[1]; vthermal[2] = v[i][2] - vstream[2]; if (rmass) - t += (vthermal[0]*vthermal[0] + vthermal[1]*vthermal[1] + - vthermal[2]*vthermal[2]) * rmass[i]; + t += (vthermal[0] * vthermal[0] + vthermal[1] * vthermal[1] + vthermal[2] * vthermal[2]) * + rmass[i]; else - t += (vthermal[0]*vthermal[0] + vthermal[1]*vthermal[1] + - vthermal[2]*vthermal[2]) * mass[type[i]]; + t += (vthermal[0] * vthermal[0] + vthermal[1] * vthermal[1] + vthermal[2] * vthermal[2]) * + mass[type[i]]; } - MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&t, &scalar, 1, MPI_DOUBLE, MPI_SUM, world); if (dynamic) dof_compute(); if (dof < 0.0 && natoms_temp > 0.0) - error->all(FLERR,"Temperature compute degrees of freedom < 0"); + error->all(FLERR, "Temperature compute degrees of freedom < 0"); scalar *= tfactor; return scalar; } @@ -160,7 +155,7 @@ double ComputeTempDeform::compute_scalar() void ComputeTempDeform::compute_vector() { - double lamda[3],vstream[3],vthermal[3]; + double lamda[3], vstream[3], vthermal[3]; invoked_vector = update->ntimestep; @@ -175,31 +170,32 @@ void ComputeTempDeform::compute_vector() double *h_rate = domain->h_rate; double *h_ratelo = domain->h_ratelo; - double massone,t[6]; + double massone, t[6]; for (int i = 0; i < 6; i++) t[i] = 0.0; for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - domain->x2lamda(x[i],lamda); - vstream[0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + - h_rate[4]*lamda[2] + h_ratelo[0]; - vstream[1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; - vstream[2] = h_rate[2]*lamda[2] + h_ratelo[2]; + domain->x2lamda(x[i], lamda); + vstream[0] = h_rate[0] * lamda[0] + h_rate[5] * lamda[1] + h_rate[4] * lamda[2] + h_ratelo[0]; + vstream[1] = h_rate[1] * lamda[1] + h_rate[3] * lamda[2] + h_ratelo[1]; + vstream[2] = h_rate[2] * lamda[2] + h_ratelo[2]; vthermal[0] = v[i][0] - vstream[0]; vthermal[1] = v[i][1] - vstream[1]; vthermal[2] = v[i][2] - vstream[2]; - if (rmass) massone = rmass[i]; - else massone = mass[type[i]]; - t[0] += massone * vthermal[0]*vthermal[0]; - t[1] += massone * vthermal[1]*vthermal[1]; - t[2] += massone * vthermal[2]*vthermal[2]; - t[3] += massone * vthermal[0]*vthermal[1]; - t[4] += massone * vthermal[0]*vthermal[2]; - t[5] += massone * vthermal[1]*vthermal[2]; + if (rmass) + massone = rmass[i]; + else + massone = mass[type[i]]; + t[0] += massone * vthermal[0] * vthermal[0]; + t[1] += massone * vthermal[1] * vthermal[1]; + t[2] += massone * vthermal[2] * vthermal[2]; + t[3] += massone * vthermal[0] * vthermal[1]; + t[4] += massone * vthermal[0] * vthermal[2]; + t[5] += massone * vthermal[1] * vthermal[2]; } - MPI_Allreduce(t,vector,6,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(t, vector, 6, MPI_DOUBLE, MPI_SUM, world); for (int i = 0; i < 6; i++) vector[i] *= force->mvv2e; } @@ -213,11 +209,10 @@ void ComputeTempDeform::remove_bias(int i, double *v) double *h_rate = domain->h_rate; double *h_ratelo = domain->h_ratelo; - domain->x2lamda(atom->x[i],lamda); - vbias[0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + - h_rate[4]*lamda[2] + h_ratelo[0]; - vbias[1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; - vbias[2] = h_rate[2]*lamda[2] + h_ratelo[2]; + domain->x2lamda(atom->x[i], lamda); + vbias[0] = h_rate[0] * lamda[0] + h_rate[5] * lamda[1] + h_rate[4] * lamda[2] + h_ratelo[0]; + vbias[1] = h_rate[1] * lamda[1] + h_rate[3] * lamda[2] + h_ratelo[1]; + vbias[2] = h_rate[2] * lamda[2] + h_ratelo[2]; v[0] -= vbias[0]; v[1] -= vbias[1]; v[2] -= vbias[2]; @@ -233,11 +228,10 @@ void ComputeTempDeform::remove_bias_thr(int i, double *v, double *b) double *h_rate = domain->h_rate; double *h_ratelo = domain->h_ratelo; - domain->x2lamda(atom->x[i],lamda); - b[0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + - h_rate[4]*lamda[2] + h_ratelo[0]; - b[1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; - b[2] = h_rate[2]*lamda[2] + h_ratelo[2]; + domain->x2lamda(atom->x[i], lamda); + b[0] = h_rate[0] * lamda[0] + h_rate[5] * lamda[1] + h_rate[4] * lamda[2] + h_ratelo[0]; + b[1] = h_rate[1] * lamda[1] + h_rate[3] * lamda[2] + h_ratelo[1]; + b[2] = h_rate[2] * lamda[2] + h_ratelo[2]; v[0] -= b[0]; v[1] -= b[1]; v[2] -= b[2]; @@ -256,7 +250,7 @@ void ComputeTempDeform::remove_bias_all() if (atom->nmax > maxbias) { memory->destroy(vbiasall); maxbias = atom->nmax; - memory->create(vbiasall,maxbias,3,"temp/deform:vbiasall"); + memory->create(vbiasall, maxbias, 3, "temp/deform:vbiasall"); } double lamda[3]; @@ -265,11 +259,11 @@ void ComputeTempDeform::remove_bias_all() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - domain->x2lamda(atom->x[i],lamda); - vbiasall[i][0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + - h_rate[4]*lamda[2] + h_ratelo[0]; - vbiasall[i][1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; - vbiasall[i][2] = h_rate[2]*lamda[2] + h_ratelo[2]; + domain->x2lamda(atom->x[i], lamda); + vbiasall[i][0] = + h_rate[0] * lamda[0] + h_rate[5] * lamda[1] + h_rate[4] * lamda[2] + h_ratelo[0]; + vbiasall[i][1] = h_rate[1] * lamda[1] + h_rate[3] * lamda[2] + h_ratelo[1]; + vbiasall[i][2] = h_rate[2] * lamda[2] + h_ratelo[2]; v[i][0] -= vbiasall[i][0]; v[i][1] -= vbiasall[i][1]; v[i][2] -= vbiasall[i][2]; @@ -323,6 +317,6 @@ void ComputeTempDeform::restore_bias_all() double ComputeTempDeform::memory_usage() { - double bytes = 3*maxbias * sizeof(double); + double bytes = 3 * maxbias * sizeof(double); return bytes; } From 08e71eee6d1380f3476b3167c291e9a574682299 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 18 Aug 2021 10:30:35 -0400 Subject: [PATCH 016/437] corrections to recent large reformatting PR --- src/REACTION/fix_bond_react.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/REACTION/fix_bond_react.h b/src/REACTION/fix_bond_react.h index abb2b5b123..8c733de02a 100644 --- a/src/REACTION/fix_bond_react.h +++ b/src/REACTION/fix_bond_react.h @@ -151,14 +151,12 @@ class FixBondReact : public Fix { // for all mega_gloves and global_mega_glove: first row is the ID of bond/react tagint **local_mega_glove; // consolidation local of reaction instances tagint **ghostly_mega_glove; // consolidation nonlocal of reaction instances - tagint * - *global_mega_glove; // consolidation (inter-processor) of gloves containing nonlocal atoms + tagint **global_mega_glove; // consolidation (inter-processor) of gloves containing nonlocal atoms int *localsendlist; // indicates ghosts of other procs int local_num_mega; // num of local reaction instances int ghostly_num_mega; // num of ghostly reaction instances int global_megasize; // num of reaction instances in global_mega_glove - int * - pioneers; // during Superimpose Algorithm, atoms which have been assigned, but whose first neighbors haven't + int *pioneers; // during Superimpose Algorithm, atoms which have been assigned, but whose first neighbors haven't int glove_counter; // used to determine when to terminate Superimpose Algorithm void read(int); From 6db856fd687e726c7ef8001a6577042ee8c2c9f6 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 18 Aug 2021 11:24:32 -0400 Subject: [PATCH 017/437] refactor dynamic constraints array cannot use memory->* routines with non-primitive types --- src/REACTION/fix_bond_react.cpp | 4 +--- src/REACTION/fix_bond_react.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index e52347727f..ae8622e7c0 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -232,7 +232,6 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) : memory->create(molecule_keyword,nreacts,"bond/react:molecule_keyword"); memory->create(nconstraints,nreacts,"bond/react:nconstraints"); memory->create(constraintstr,nreacts,MAXLINE,"bond/react:constraintstr"); - memory->create(constraints,0,nreacts,"bond/react:constraints"); memory->create(var_flag,NUMVARVALS,nreacts,"bond/react:var_flag"); memory->create(var_id,NUMVARVALS,nreacts,"bond/react:var_id"); memory->create(iatomtype,nreacts,"bond/react:iatomtype"); @@ -617,7 +616,6 @@ FixBondReact::~FixBondReact() memory->destroy(stabilize_steps_flag); memory->destroy(custom_charges_fragid); memory->destroy(molecule_keyword); - memory->destroy(constraints); memory->destroy(nconstraints); memory->destroy(constraintstr); memory->destroy(create_atoms_flag); @@ -3668,7 +3666,7 @@ void FixBondReact::read(int myrxn) else if (strstr(line,"constraints")) { sscanf(line,"%d",&nconstraints[myrxn]); if (maxnconstraints < nconstraints[myrxn]) maxnconstraints = nconstraints[myrxn]; - memory->grow(constraints,maxnconstraints,nreacts,"bond/react:constraints"); + constraints.resize(maxnconstraints, std::vector(nreacts)); } else break; } diff --git a/src/REACTION/fix_bond_react.h b/src/REACTION/fix_bond_react.h index 8c733de02a..d2bd1be9fd 100644 --- a/src/REACTION/fix_bond_react.h +++ b/src/REACTION/fix_bond_react.h @@ -214,7 +214,7 @@ class FixBondReact : public Fix { double par[MAXCONPAR]; std::string str; }; - Constraint **constraints; + std::vector> constraints; // DEBUG From 40fcfef35b9e4576221e89291149e569682a79a0 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Wed, 18 Aug 2021 14:17:04 -0400 Subject: [PATCH 018/437] create_atoms serial build bugfix --- src/REACTION/fix_bond_react.cpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index ae8622e7c0..5126d7c8e7 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -2828,6 +2828,19 @@ void FixBondReact::update_everything() rxnID = local_mega_glove[0][i]; // reactions already shuffled from dedup procedure, so can skip first N if (iskip[rxnID]++ < nlocalskips[rxnID]) continue; + + // atoms inserted here for serial MPI_STUBS build only + if (create_atoms_flag[rxnID] == 1) { + onemol = atom->molecules[unreacted_mol[rxnID]]; + twomol = atom->molecules[reacted_mol[rxnID]]; + if (insert_atoms(local_mega_glove,i)) { + inserted_atoms_flag = 1; + } else { // create aborted + reaction_count_total[rxnID]--; + continue; + } + } + for (int j = 0; j < max_natoms+1; j++) update_mega_glove[j][update_num_mega] = local_mega_glove[j][i]; update_num_mega++; @@ -2840,7 +2853,7 @@ void FixBondReact::update_everything() // we can insert atoms here, now that reactions are finalized // can't do it any earlier, due to skipped reactions (max_rxn) - // reactions that create atoms are always treated as 'global' + // for MPI build, reactions that create atoms are always treated as 'global' if (create_atoms_flag[rxnID] == 1) { onemol = atom->molecules[unreacted_mol[rxnID]]; twomol = atom->molecules[reacted_mol[rxnID]]; @@ -2856,17 +2869,18 @@ void FixBondReact::update_everything() update_mega_glove[j][update_num_mega] = global_mega_glove[j][i]; update_num_mega++; } - // if inserted atoms and global map exists, reset map now instead - // of waiting for comm since other pre-exchange fixes may use it - // invoke map_init() b/c atom count has grown - // do this once after all atom insertions - if (inserted_atoms_flag == 1 && atom->map_style != Atom::MAP_NONE) { - atom->map_init(); - atom->map_set(); - } } delete [] iskip; + // if inserted atoms and global map exists, reset map now instead + // of waiting for comm since other pre-exchange fixes may use it + // invoke map_init() b/c atom count has grown + // do this once after all atom insertions + if (inserted_atoms_flag == 1 && atom->map_style != Atom::MAP_NONE) { + atom->map_init(); + atom->map_set(); + } + // mark to-delete atoms nlocal = atom->nlocal; if (nlocal > nmark) { From 1c5bdadcfb37dfbd05ef26afe24e1d03fd519934 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 18 Aug 2021 15:43:54 -0600 Subject: [PATCH 019/437] small alteration to code that assigns grid pts to procs --- src/KSPACE/msm.cpp | 19 +++----- src/KSPACE/pppm.cpp | 34 +++----------- src/KSPACE/pppm.h | 3 ++ src/KSPACE/pppm_disp.cpp | 18 ++------ src/comm.cpp | 97 ++++++++++++++++++++++++++++++++++++++++ src/comm.h | 6 +++ src/domain.h | 14 ++++-- 7 files changed, 133 insertions(+), 58 deletions(-) diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 87b919af17..0a642d5b53 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -1194,18 +1194,13 @@ void MSM::set_grid_local() for (int n=0; n (comm->xsplit[comm->myloc[0]] * nx_msm[n]); - nxhi_in[n] = static_cast (comm->xsplit[comm->myloc[0]+1] * nx_msm[n]) - 1; - - nylo_in[n] = static_cast (comm->ysplit[comm->myloc[1]] * ny_msm[n]); - nyhi_in[n] = static_cast (comm->ysplit[comm->myloc[1]+1] * ny_msm[n]) - 1; - - nzlo_in[n] = static_cast (comm->zsplit[comm->myloc[2]] * nz_msm[n]); - nzhi_in[n] = static_cast (comm->zsplit[comm->myloc[2]+1] * nz_msm[n]) - 1; + // partition global grid across procs + // nxyz lo/hi = lower/upper bounds of global grid this proc owns + // indices range from 0 to N-1 inclusive in each dim + + comm->partition_grid(nx_msm[n],ny_msm[n],nz_msm[n],0.0, + nxlo_in[n],nxhi_in[n],nylo_in[n],nyhi_in[n], + nzlo_in[n],nzhi_in[n]); // nlower,nupper = stencil size for mapping (interpolating) particles to MSM grid diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 0415631a4c..1c77bd8919 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1320,34 +1320,12 @@ double PPPM::final_accuracy() void PPPM::set_grid_local() { - // global indices of PPPM grid range from 0 to N-1 - // nlo_in,nhi_in = lower/upper limits of the 3d sub-brick of - // global PPPM grid that I own without ghost cells - // for slab PPPM, assign z grid as if it were not extended - // both non-tiled and tiled proc layouts use 0-1 fractional sumdomain info + // partition global grid across procs + // nxyz lo/hi = lower/upper bounds of global grid this proc owns + // indices range from 0 to N-1 inclusive in each dim - if (comm->layout != Comm::LAYOUT_TILED) { - nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nx_pppm); - nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nx_pppm) - 1; - - nylo_in = static_cast (comm->ysplit[comm->myloc[1]] * ny_pppm); - nyhi_in = static_cast (comm->ysplit[comm->myloc[1]+1] * ny_pppm) - 1; - - nzlo_in = static_cast - (comm->zsplit[comm->myloc[2]] * nz_pppm/slab_volfactor); - nzhi_in = static_cast - (comm->zsplit[comm->myloc[2]+1] * nz_pppm/slab_volfactor) - 1; - - } else { - nxlo_in = static_cast (comm->mysplit[0][0] * nx_pppm); - nxhi_in = static_cast (comm->mysplit[0][1] * nx_pppm) - 1; - - nylo_in = static_cast (comm->mysplit[1][0] * ny_pppm); - nyhi_in = static_cast (comm->mysplit[1][1] * ny_pppm) - 1; - - nzlo_in = static_cast (comm->mysplit[2][0] * nz_pppm/slab_volfactor); - nzhi_in = static_cast (comm->mysplit[2][1] * nz_pppm/slab_volfactor) - 1; - } + comm->partition_grid(nx_pppm,ny_pppm,nz_pppm,slab_volfactor, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in); // nlower,nupper = stencil size for mapping particles to PPPM grid @@ -1367,7 +1345,7 @@ void PPPM::set_grid_local() // effectively nlo_in,nhi_in + ghost cells // nlo,nhi = index of global grid pt to "lower left" of smallest/largest // position a particle in my box can be at - // dist[3] = particle position bound = subbox + skin/2.0 + qdist + // dist[3] = max particle position outside subbox = skin/2.0 + qdist // qdist = offset due to TIP4P fictitious charge // convert to triclinic if necessary // nlo_out,nhi_out = nlo,nhi + stencil size for particle mapping diff --git a/src/KSPACE/pppm.h b/src/KSPACE/pppm.h index 4fa41fa311..0b67040b00 100644 --- a/src/KSPACE/pppm.h +++ b/src/KSPACE/pppm.h @@ -120,6 +120,9 @@ class PPPM : public KSpace { double qdist; // distance from O site to negative charge double alpha; // geometric factor + void carve_grid(int, int, int, double, + int &, int &, int &, int &, int &, int &); + virtual void set_grid_global(); void set_grid_local(); void adjust_gewald(); diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index f7c97b1f87..a12c9ecd8f 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -2700,22 +2700,10 @@ void PPPMDisp::set_fft_parameters(int& nx_p, int& ny_p, int& nz_p, int& ng, int& nf, int& nfb, double& sft, double& sftone, int& ord) { - // global indices of PPPM grid range from 0 to N-1 - // nlo_in,nhi_in = lower/upper limits of the 3d sub-brick of - // global PPPM grid that I own without ghost cells - // for slab PPPM, assign z grid as if it were not extended - - nxlo_i = static_cast (comm->xsplit[comm->myloc[0]] * nx_p); - nxhi_i = static_cast (comm->xsplit[comm->myloc[0]+1] * nx_p) - 1; - - nylo_i = static_cast (comm->ysplit[comm->myloc[1]] * ny_p); - nyhi_i = static_cast (comm->ysplit[comm->myloc[1]+1] * ny_p) - 1; - - nzlo_i = static_cast - (comm->zsplit[comm->myloc[2]] * nz_p/slab_volfactor); - nzhi_i = static_cast - (comm->zsplit[comm->myloc[2]+1] * nz_p/slab_volfactor) - 1; + // partition global grid across procs + comm->partition_grid(nx_p,ny_p,nz_p,slab_volfactor, + nxlo_i,nxhi_i,nylo_i,nyhi_i,nzlo_i,nzhi_i); // nlow,nupp = stencil size for mapping particles to PPPM grid diff --git a/src/comm.cpp b/src/comm.cpp index 2dddba11c2..fa9175f62c 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -832,6 +832,103 @@ int Comm::binary(double value, int n, double *vec) return index; } +/* ---------------------------------------------------------------------- + partition a global regular grid into sub-grids matching proc sub-domains + nx,ny,nz = extent of global grid + indices into the global grid range from 0 to N-1 in each dim + zfactor = 0.0 if the grid exactly covers the simulation box + zfactor > 1.0 if the grid extends beyond the +z boundary by this factor + used by 2d slab-mode PPPM + this effectively maps proc sub-grids to a smaller subset of the grid + if grid point is inside my sub-domain I own it, + this includes sub-domain lo boundary but excludes hi boundary + nxyz lo/hi = inclusive lo/hi bounds of global grid sub-brick I own + if proc owns no grid cells in a dim, then nlo > nhi + special case: 2 procs share boundary which a grid point is exactly on + 2 equality if tests insure a consistent decision as to which proc owns it +------------------------------------------------------------------------- */ + +void Comm::partition_grid(int nx, int ny, int nz, double zfactor, + int &nxlo, int &nxhi, int &nylo, int &nyhi, + int &nzlo, int &nzhi) +{ + double xfraclo,xfrachi,yfraclo,yfrachi,zfraclo,zfrachi; + + if (layout != LAYOUT_TILED) { + xfraclo = xsplit[myloc[0]]; + xfrachi = xsplit[myloc[0]+1]; + yfraclo = ysplit[myloc[1]]; + yfrachi = ysplit[myloc[1]+1]; + zfraclo = zsplit[myloc[2]]; + zfrachi = zsplit[myloc[2]+1]; + } else { + xfraclo = mysplit[0][0]; + xfrachi = mysplit[0][1]; + yfraclo = mysplit[1][0]; + yfrachi = mysplit[1][1]; + zfraclo = mysplit[2][0]; + zfrachi = mysplit[2][1]; + } + + nxlo = static_cast (xfraclo * nx); + if (1.0*nxlo != xfraclo*nx) nxlo++; + nxhi = static_cast (xfrachi * nx); + if (1.0*nxhi == xfrachi*nx) nxhi--; + + nylo = static_cast (yfraclo * ny); + if (1.0*nylo != yfraclo*ny) nylo++; + nyhi = static_cast (yfrachi * ny); + if (1.0*nyhi == yfrachi*ny) nyhi--; + + if (zfactor == 0.0) { + nzlo = static_cast (zfraclo * nz); + if (1.0*nzlo != zfraclo*nz) nzlo++; + nzhi = static_cast (zfrachi * nz); + if (1.0*nzhi == zfrachi*nz) nzhi--; + } else { + nzlo = static_cast (zfraclo * nz/zfactor); + if (1.0*nzlo != zfraclo*nz) nzlo++; + nzhi = static_cast (zfrachi * nz/zfactor); + if (1.0*nzhi == zfrachi*nz) nzhi--; + } + + // OLD code + // could sometimes map grid points slightly outside a proc to the proc + + /* + if (layout != LAYOUT_TILED) { + nxlo = static_cast (xsplit[myloc[0]] * nx); + nxhi = static_cast (xsplit[myloc[0]+1] * nx) - 1; + + nylo = static_cast (ysplit[myloc[1]] * ny); + nyhi = static_cast (ysplit[myloc[1]+1] * ny) - 1; + + if (zfactor == 0.0) { + nzlo = static_cast (zsplit[myloc[2]] * nz); + nzhi = static_cast (zsplit[myloc[2]+1] * nz) - 1; + } else { + nzlo = static_cast (zsplit[myloc[2]] * nz/zfactor); + nzhi = static_cast (zsplit[myloc[2]+1] * nz/zfactor) - 1; + } + + } else { + nxlo = static_cast (mysplit[0][0] * nx); + nxhi = static_cast (mysplit[0][1] * nx) - 1; + + nylo = static_cast (mysplit[1][0] * ny); + nyhi = static_cast (mysplit[1][1] * ny) - 1; + + if (zfactor == 0.0) { + nzlo = static_cast (mysplit[2][0] * nz); + nzhi = static_cast (mysplit[2][1] * nz) - 1; + } else { + nzlo = static_cast (mysplit[2][0] * nz/zfactor); + nzhi = static_cast (mysplit[2][1] * nz/zfactor) - 1; + } + } + */ +} + /* ---------------------------------------------------------------------- communicate inbuf around full ring of processors with messtag nbytes = size of inbuf = n datums * nper bytes diff --git a/src/comm.h b/src/comm.h index bc5faa49f4..7ad9e8756c 100644 --- a/src/comm.h +++ b/src/comm.h @@ -105,6 +105,11 @@ class Comm : protected Pointers { virtual void coord2proc_setup() {} virtual int coord2proc(double *, int &, int &, int &); + // partition a global regular grid by proc sub-domains + + void partition_grid(int, int, int, double, + int &, int &, int &, int &, int &, int &); + // memory usage virtual double memory_usage() = 0; @@ -117,6 +122,7 @@ class Comm : protected Pointers { int statflag = 0); // extract data useful to other classes + virtual void *extract(const char *, int &) { return nullptr; } protected: diff --git a/src/domain.h b/src/domain.h index 2a812218f1..f05afc50e6 100644 --- a/src/domain.h +++ b/src/domain.h @@ -42,38 +42,46 @@ class Domain : protected Pointers { int tiltsmall; // 1 if limit tilt, else 0 // orthogonal box + double xprd, yprd, zprd; // global box dimensions double xprd_half, yprd_half, zprd_half; // half dimensions double prd[3]; // array form of dimensions double prd_half[3]; // array form of half dimensions // triclinic box - // xprd,xprd_half,prd,prd_half = - // same as if untilted + // xyzprd,xyzprd_half and prd,prd_half = same as if untilted + double prd_lamda[3]; // lamda box = (1,1,1) double prd_half_lamda[3]; // lamda half box = (0.5,0.5,0.5) - double boxlo[3], boxhi[3]; // orthogonal box global bounds + // orthogonal box global bounds + + double boxlo[3], boxhi[3]; // triclinic box // boxlo/hi = same as if untilted + double boxlo_lamda[3], boxhi_lamda[3]; // lamda box = (0,1) double boxlo_bound[3], boxhi_bound[3]; // bounding box of tilted domain double corners[8][3]; // 8 corner points // orthogonal box & triclinic box + double minxlo, minxhi; // minimum size of global box double minylo, minyhi; // when shrink-wrapping double minzlo, minzhi; // tri only possible for non-skew dims // orthogonal box + double sublo[3], subhi[3]; // sub-box bounds on this proc // triclinic box // sublo/hi = undefined + double sublo_lamda[3], subhi_lamda[3]; // bounds of subbox in lamda // triclinic box + double xy, xz, yz; // 3 tilt factors double h[6], h_inv[6]; // shape matrix in Voigt ordering // Voigt = xx,yy,zz,yz,xz,xy From 2119b59d974a68742bd26f448e2b30cfc11be46e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 18 Aug 2021 15:49:23 -0600 Subject: [PATCH 020/437] code documentation tweaks --- src/KSPACE/msm.cpp | 2 +- src/KSPACE/pppm.cpp | 2 +- src/KSPACE/pppm_disp.cpp | 2 ++ src/comm.cpp | 6 +++--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 0a642d5b53..0f9bf07139 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -1195,7 +1195,7 @@ void MSM::set_grid_local() for (int n=0; npartition_grid(nx_msm[n],ny_msm[n],nz_msm[n],0.0, diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 1c77bd8919..1c409d5279 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1321,7 +1321,7 @@ double PPPM::final_accuracy() void PPPM::set_grid_local() { // partition global grid across procs - // nxyz lo/hi = lower/upper bounds of global grid this proc owns + // n xyz lo/hi in = lower/upper bounds of global grid this proc owns // indices range from 0 to N-1 inclusive in each dim comm->partition_grid(nx_pppm,ny_pppm,nz_pppm,slab_volfactor, diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index a12c9ecd8f..7444b5f1e2 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -2701,6 +2701,8 @@ void PPPMDisp::set_fft_parameters(int& nx_p, int& ny_p, int& nz_p, double& sft, double& sftone, int& ord) { // partition global grid across procs + // n xyz lo/hi i = lower/upper bounds of global grid this proc owns + // indices range from 0 to N-1 inclusive in each dim comm->partition_grid(nx_p,ny_p,nz_p,slab_volfactor, nxlo_i,nxhi_i,nylo_i,nyhi_i,nzlo_i,nzhi_i); diff --git a/src/comm.cpp b/src/comm.cpp index fa9175f62c..bf137ce969 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -833,15 +833,15 @@ int Comm::binary(double value, int n, double *vec) } /* ---------------------------------------------------------------------- - partition a global regular grid into sub-grids matching proc sub-domains + partition a global regular grid into one brick-shaped sub-grid per proc + if grid point is inside my sub-domain I own it, + this includes sub-domain lo boundary but excludes hi boundary nx,ny,nz = extent of global grid indices into the global grid range from 0 to N-1 in each dim zfactor = 0.0 if the grid exactly covers the simulation box zfactor > 1.0 if the grid extends beyond the +z boundary by this factor used by 2d slab-mode PPPM this effectively maps proc sub-grids to a smaller subset of the grid - if grid point is inside my sub-domain I own it, - this includes sub-domain lo boundary but excludes hi boundary nxyz lo/hi = inclusive lo/hi bounds of global grid sub-brick I own if proc owns no grid cells in a dim, then nlo > nhi special case: 2 procs share boundary which a grid point is exactly on From 4e16df9a216a07c203de1d1ded0157d1f0f5475e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 18 Aug 2021 15:56:52 -0600 Subject: [PATCH 021/437] remove prototype for early version of partition_grid method --- src/KSPACE/pppm.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/KSPACE/pppm.h b/src/KSPACE/pppm.h index 0b67040b00..4fa41fa311 100644 --- a/src/KSPACE/pppm.h +++ b/src/KSPACE/pppm.h @@ -120,9 +120,6 @@ class PPPM : public KSpace { double qdist; // distance from O site to negative charge double alpha; // geometric factor - void carve_grid(int, int, int, double, - int &, int &, int &, int &, int &, int &); - virtual void set_grid_global(); void set_grid_local(); void adjust_gewald(); From eebbbe9f73c48dc5b32b81bcfac65dae71e07f57 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 14:01:06 -0600 Subject: [PATCH 022/437] support a second usage model with fix bond/swap --- doc/src/fix_bond_swap.rst | 72 ++++++++++++++++++++++++--------------- src/MC/fix_bond_swap.cpp | 6 ++-- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index da000c98b2..b29091308b 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -27,15 +27,15 @@ Examples Description """"""""""" -In a simulation of polymer chains, this command attempts to swap a -pair of bonds, as illustrated below. This is done via Monte Carlo -rules using the Boltzmann acceptance criterion, typically with the -goal of equilibrating the polymer system more quickly. This fix is -designed for use with idealized bead-spring polymer chains where each -polymer is a linear chain of monomers, but LAMMPS does not check that -is the case for your system. +In a simulation of polymer chains this command attempts to swap a pair +of bonds, as illustrated below. This is done via Monte Carlo rules +using the Boltzmann acceptance criterion, typically with the goal of +equilibrating the polymer system more quickly. This fix is designed +for use with idealized bead-spring polymer chains where each polymer +is a linear chain of monomers, but LAMMPS does not check that is the +case for your system. -Here are two use cases where this fix can be used effectively. +Here are two use cases for this fix. The first use case is for swapping bonds on two different chains, effectively grafting the end of one chain onto the other chain and @@ -62,22 +62,30 @@ undergone a dramatic conformational change. This reference, effectiveness for this use case. The second use case is a collection of polymer chains with some -fraction of their sites identified as "sticker" sites. +fraction of their sites identified as "sticker" sites. Initially each +polymer chain is isolated from the others in a topological sense, and +there is an intra-chain bond between every pair of sticker sites on +the same chain. Over time, bonds swap so that inter-moleculer sticker +bonds are created. This models a vitrification-style process whereby +the polymer chains all become interconnected. For this use case, if +angles are defined they should not include sticker sites. +---------- -The bond swapping operation is invoked every *Nevery* timesteps. If -any bond in the entire system is swapped, a re-build of the neighbor -lists is triggered, since a swap alters the list of which neighbors -are considered for pairwise interaction. At each invocation, each -processor considers a random specified *fraction* of its atoms as -potential swapping monomers for this timestep. Choosing a small -*fraction* value can reduce the likelihood of a reverse swap occurring -soon after an initial swap. +The bond swapping operation is invoked once every *Nevery* timesteps. +If any bond in the entire system is swapped, a re-build of the +neighbor lists is triggered, since a swap alters the list of which +neighbors are considered for pairwise interaction. At each +invocation, each processor considers a random specified *fraction* of +its atoms as potential swapping monomers for this timestep. Choosing +a small *fraction* value can reduce the likelihood of a reverse swap +occurring soon after an initial swap. -For each monomer A1, its neighbors are looped over as B1 monomers. An -additional double loop of bond partners A2 of A1, and bond partners B2 -of B1 a is performed. For each pair of A1-A2 and B1-B2 bonds to be -eligible for swapping, the following 4 criteria must be met: +For each monomer A1, its neighbors are looped over as B1 monomers. +For each A1,B1 an additional double loop of bond partners A2 of A1, +and bond partners B2 of B1 a is performed. For each pair of A1-A2 and +B1-B2 bonds to be eligible for swapping, the following 4 criteria must +be met: (1) All 4 monomers must be in the fix group. @@ -103,15 +111,22 @@ accepted. If the energy increases it is accepted with probability exp(-delta/kT) where delta is the increase in energy, k is the Boltzmann constant, and T is the current temperature of the system. -IMPORTANT: Whether the swap is accepted or rejected, no other swaps -are attempted by this processor on this timestep. +.. note:: + + IMPORTANT: Whether the swap is accepted or rejected, no other swaps + are attempted by this processor on this timestep. No other + eliglble 4-tuples of atoms are considered. This means that each + processor will perform either a single swap or none on timesteps + this fix is invoked. ---------- -The criterion for matching molecule IDs is how bond swaps performed by -this fix conserve chain length. To use this features you must setup -the molecule IDs for your polymer chains in a certain way, typically -in the data file, read by the :doc:`read_data ` command. +The criterion for matching molecule IDs is how the first use case +described above can be simulated while conserving chain lengths. This +is done by setting up the molecule IDs for the polymer chains in a +specific way, typically in the data file, read by the :doc:`read_data +` command. + Consider a system of 6-mer chains. You have 2 choices. If the molecule IDs for monomers on each chain are set to 1,2,3,4,5,6 then swaps will conserve chain length. For a particular monomer there will @@ -140,6 +155,9 @@ ends of a chain swap with each other. running dynamics, but can affect calculation of some diagnostic quantities or the printing of unwrapped coordinates to a dump file. +For the second use case described above, the molecule IDs for all +sticker sites should be the same. + ---------- This fix computes a temperature each time it is invoked for use by the diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 0b24f21e2d..5f7ffcbbe5 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -261,12 +261,12 @@ void FixBondSwap::post_integrate() // J must be on-processor (J < nlocal) // I,J must be in fix group // I,J must have same molecule IDs - // use case 1: + // use case 1 (see doc page): // if user defines mol IDs appropriately for linear chains, // this will mean they are same distance from (either) chain end - // use case 2: + // use case 2 (see doc page): // if user defines a unique mol ID for desired bond sites (on any chain) - // and defines the fix group for these sites, + // and defines the fix group as these sites, // this will mean they are eligible bond sites int ntest = static_cast (fraction * neligible); From e1c1c663c4fee57faaf7957d4ab61f81b35a02af Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 14:21:15 -0600 Subject: [PATCH 023/437] correction to doc page --- doc/src/fix_bond_swap.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index b29091308b..42ee820c93 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -68,7 +68,8 @@ there is an intra-chain bond between every pair of sticker sites on the same chain. Over time, bonds swap so that inter-moleculer sticker bonds are created. This models a vitrification-style process whereby the polymer chains all become interconnected. For this use case, if -angles are defined they should not include sticker sites. +angles are defined they should not include bonds between sticker +sites. ---------- From d4de26f6efb373b2cd0f8ebe8f2954ccf9af3228 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 17:28:48 -0400 Subject: [PATCH 024/437] fix whitespace issues --- src/KSPACE/msm.cpp | 2 +- src/comm.cpp | 4 ++-- src/comm.h | 2 +- src/domain.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 0f9bf07139..7bf16533bb 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -1197,7 +1197,7 @@ void MSM::set_grid_local() // partition global grid across procs // n xyz lo/hi in[] = lower/upper bounds of global grid this proc owns // indices range from 0 to N-1 inclusive in each dim - + comm->partition_grid(nx_msm[n],ny_msm[n],nz_msm[n],0.0, nxlo_in[n],nxhi_in[n],nylo_in[n],nyhi_in[n], nzlo_in[n],nzhi_in[n]); diff --git a/src/comm.cpp b/src/comm.cpp index bf137ce969..17175f9517 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -840,7 +840,7 @@ int Comm::binary(double value, int n, double *vec) indices into the global grid range from 0 to N-1 in each dim zfactor = 0.0 if the grid exactly covers the simulation box zfactor > 1.0 if the grid extends beyond the +z boundary by this factor - used by 2d slab-mode PPPM + used by 2d slab-mode PPPM this effectively maps proc sub-grids to a smaller subset of the grid nxyz lo/hi = inclusive lo/hi bounds of global grid sub-brick I own if proc owns no grid cells in a dim, then nlo > nhi @@ -849,7 +849,7 @@ int Comm::binary(double value, int n, double *vec) ------------------------------------------------------------------------- */ void Comm::partition_grid(int nx, int ny, int nz, double zfactor, - int &nxlo, int &nxhi, int &nylo, int &nyhi, + int &nxlo, int &nxhi, int &nylo, int &nyhi, int &nzlo, int &nzhi) { double xfraclo,xfrachi,yfraclo,yfrachi,zfraclo,zfrachi; diff --git a/src/comm.h b/src/comm.h index 7ad9e8756c..2ab999bab3 100644 --- a/src/comm.h +++ b/src/comm.h @@ -107,7 +107,7 @@ class Comm : protected Pointers { // partition a global regular grid by proc sub-domains - void partition_grid(int, int, int, double, + void partition_grid(int, int, int, double, int &, int &, int &, int &, int &, int &); // memory usage diff --git a/src/domain.h b/src/domain.h index f05afc50e6..711bab0fb2 100644 --- a/src/domain.h +++ b/src/domain.h @@ -56,7 +56,7 @@ class Domain : protected Pointers { // orthogonal box global bounds - double boxlo[3], boxhi[3]; + double boxlo[3], boxhi[3]; // triclinic box // boxlo/hi = same as if untilted From 95bae4d78c6e0564786257b5af8a6dddbfda0ad6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 16:09:41 -0600 Subject: [PATCH 025/437] sync with current master --- src/{MISC => EXTRA-FIX}/fix_ttm_grid.cpp | 0 src/{MISC => EXTRA-FIX}/fix_ttm_grid.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{MISC => EXTRA-FIX}/fix_ttm_grid.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_ttm_grid.h (100%) diff --git a/src/MISC/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp similarity index 100% rename from src/MISC/fix_ttm_grid.cpp rename to src/EXTRA-FIX/fix_ttm_grid.cpp diff --git a/src/MISC/fix_ttm_grid.h b/src/EXTRA-FIX/fix_ttm_grid.h similarity index 100% rename from src/MISC/fix_ttm_grid.h rename to src/EXTRA-FIX/fix_ttm_grid.h From f0a041799f5aa79bb7cd929c74cc43fba0bc1f0e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 16:55:57 -0600 Subject: [PATCH 026/437] add original TTM for testing --- src/EXTRA-FIX/fix_ttm_old.cpp | 704 ++++++++++++++++++++++++++++++++++ src/EXTRA-FIX/fix_ttm_old.h | 155 ++++++++ 2 files changed, 859 insertions(+) create mode 100644 src/EXTRA-FIX/fix_ttm_old.cpp create mode 100644 src/EXTRA-FIX/fix_ttm_old.h diff --git a/src/EXTRA-FIX/fix_ttm_old.cpp b/src/EXTRA-FIX/fix_ttm_old.cpp new file mode 100644 index 0000000000..80db9e3fc2 --- /dev/null +++ b/src/EXTRA-FIX/fix_ttm_old.cpp @@ -0,0 +1,704 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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 authors: Paul Crozier (SNL) + Carolyn Phillips (University of Michigan) +------------------------------------------------------------------------- */ + +#include "fix_ttm_old.h" + +#include +#include +#include "atom.h" +#include "force.h" +#include "update.h" +#include "domain.h" +#include "respa.h" +#include "comm.h" +#include "random_mars.h" +#include "memory.h" +#include "error.h" + + +#include "tokenizer.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define MAXLINE 1024 + +/* ---------------------------------------------------------------------- */ + +FixTTMOld::FixTTMOld(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), + random(nullptr), fp(nullptr), nsum(nullptr), nsum_all(nullptr), + gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), flangevin(nullptr), + T_electron(nullptr), T_electron_old(nullptr), sum_vsq(nullptr), sum_mass_vsq(nullptr), + sum_vsq_all(nullptr), sum_mass_vsq_all(nullptr), net_energy_transfer(nullptr), + net_energy_transfer_all(nullptr) +{ + if (narg < 15) error->all(FLERR,"Illegal fix ttm command"); + + vector_flag = 1; + size_vector = 2; + global_freq = 1; + extvector = 1; + nevery = 1; + restart_peratom = 1; + restart_global = 1; + + seed = utils::inumeric(FLERR,arg[3],false,lmp); + electronic_specific_heat = utils::numeric(FLERR,arg[4],false,lmp); + electronic_density = utils::numeric(FLERR,arg[5],false,lmp); + electronic_thermal_conductivity = utils::numeric(FLERR,arg[6],false,lmp); + gamma_p = utils::numeric(FLERR,arg[7],false,lmp); + gamma_s = utils::numeric(FLERR,arg[8],false,lmp); + v_0 = utils::numeric(FLERR,arg[9],false,lmp); + nxnodes = utils::inumeric(FLERR,arg[10],false,lmp); + nynodes = utils::inumeric(FLERR,arg[11],false,lmp); + nznodes = utils::inumeric(FLERR,arg[12],false,lmp); + nfileevery = utils::inumeric(FLERR,arg[14],false,lmp); + + if (nfileevery) { + if (narg != 16) error->all(FLERR,"Illegal fix ttm command"); + if (comm->me == 0) { + fp = fopen(arg[15],"w"); + if (fp == nullptr) + error->one(FLERR,"Cannot open output file {}: {}", + arg[15], utils::getsyserror()); + } + } + + // error check + + if (seed <= 0) + error->all(FLERR,"Invalid random number seed in fix ttm command"); + if (electronic_specific_heat <= 0.0) + error->all(FLERR,"Fix ttm electronic_specific_heat must be > 0.0"); + if (electronic_density <= 0.0) + error->all(FLERR,"Fix ttm electronic_density must be > 0.0"); + if (electronic_thermal_conductivity < 0.0) + error->all(FLERR,"Fix ttm electronic_thermal_conductivity must be >= 0.0"); + if (gamma_p <= 0.0) error->all(FLERR,"Fix ttm gamma_p must be > 0.0"); + if (gamma_s < 0.0) error->all(FLERR,"Fix ttm gamma_s must be >= 0.0"); + if (v_0 < 0.0) error->all(FLERR,"Fix ttm v_0 must be >= 0.0"); + if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0) + error->all(FLERR,"Fix ttm number of nodes must be > 0"); + + v_0_sq = v_0*v_0; + + // initialize Marsaglia RNG with processor-unique seed + + random = new RanMars(lmp,seed + comm->me); + + // allocate per-type arrays for force prefactors + + gfactor1 = new double[atom->ntypes+1]; + gfactor2 = new double[atom->ntypes+1]; + + // allocate 3d grid variables + // check for allowed maxium number of total grid nodes + + total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes; + if (total_nnodes > MAXSMALLINT) + error->all(FLERR,"Too many nodes in fix ttm"); + + memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum"); + memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all"); + memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq"); + memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); + memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all"); + memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes, + "ttm:sum_mass_vsq_all"); + memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old"); + memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron"); + memory->create(net_energy_transfer,nxnodes,nynodes,nznodes, + "TTM:net_energy_transfer"); + memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes, + "TTM:net_energy_transfer_all"); + + flangevin = nullptr; + grow_arrays(atom->nmax); + + // zero out the flangevin array + + for (int i = 0; i < atom->nmax; i++) { + flangevin[i][0] = 0; + flangevin[i][1] = 0; + flangevin[i][2] = 0; + } + + atom->add_callback(Atom::GROW); + atom->add_callback(Atom::RESTART); + + // set initial electron temperatures from user input file + + if (comm->me == 0) read_initial_electron_temperatures(arg[13]); + MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +FixTTMOld::~FixTTMOld() +{ + if (fp) fclose(fp); + + delete random; + + delete [] gfactor1; + delete [] gfactor2; + + memory->destroy(nsum); + memory->destroy(nsum_all); + memory->destroy(sum_vsq); + memory->destroy(sum_mass_vsq); + memory->destroy(sum_vsq_all); + memory->destroy(sum_mass_vsq_all); + memory->destroy(T_electron_old); + memory->destroy(T_electron); + memory->destroy(flangevin); + memory->destroy(net_energy_transfer); + memory->destroy(net_energy_transfer_all); +} + +/* ---------------------------------------------------------------------- */ + +int FixTTMOld::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + mask |= POST_FORCE_RESPA; + mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::init() +{ + if (domain->dimension == 2) + error->all(FLERR,"Cannot use fix ttm with 2d simulation"); + if (domain->nonperiodic != 0) + error->all(FLERR,"Cannot use non-periodic boundares with fix ttm"); + if (domain->triclinic) + error->all(FLERR,"Cannot use fix ttm with triclinic box"); + + // set force prefactors + + for (int i = 1; i <= atom->ntypes; i++) { + gfactor1[i] = - gamma_p / force->ftm2v; + gfactor2[i] = + sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; + } + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + net_energy_transfer_all[ixnode][iynode][iznode] = 0; + + if (utils::strmatch(update->integrate_style,"^respa")) + nlevels_respa = ((Respa *) update->integrate)->nlevels; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::setup(int vflag) +{ + if (utils::strmatch(update->integrate_style,"^verlet")) { + post_force_setup(vflag); + } else { + ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); + post_force_respa_setup(vflag,nlevels_respa-1,0); + ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::post_force(int /*vflag*/) +{ + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double gamma1,gamma2; + + // apply damping and thermostat to all atoms in fix group + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + + double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; + double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; + double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; + int ixnode = static_cast(xscale*nxnodes); + int iynode = static_cast(yscale*nynodes); + int iznode = static_cast(zscale*nznodes); + while (ixnode > nxnodes-1) ixnode -= nxnodes; + while (iynode > nynodes-1) iynode -= nynodes; + while (iznode > nznodes-1) iznode -= nznodes; + while (ixnode < 0) ixnode += nxnodes; + while (iynode < 0) iynode += nynodes; + while (iznode < 0) iznode += nznodes; + + if (T_electron[ixnode][iynode][iznode] < 0) + error->all(FLERR,"Electronic temperature dropped below zero"); + + double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]); + + gamma1 = gfactor1[type[i]]; + double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p; + gamma2 = gfactor2[type[i]] * tsqrt; + + flangevin[i][0] = gamma1*v[i][0] + gamma2*(random->uniform()-0.5); + flangevin[i][1] = gamma1*v[i][1] + gamma2*(random->uniform()-0.5); + flangevin[i][2] = gamma1*v[i][2] + gamma2*(random->uniform()-0.5); + + f[i][0] += flangevin[i][0]; + f[i][1] += flangevin[i][1]; + f[i][2] += flangevin[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::post_force_setup(int /*vflag*/) +{ + double **f = atom->f; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // apply langevin forces that have been stored from previous run + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + f[i][0] += flangevin[i][0]; + f[i][1] += flangevin[i][1]; + f[i][2] += flangevin[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::post_force_respa(int vflag, int ilevel, int /*iloop*/) +{ + if (ilevel == nlevels_respa-1) post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::post_force_respa_setup(int vflag, int ilevel, int /*iloop*/) +{ + if (ilevel == nlevels_respa-1) post_force_setup(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::reset_dt() +{ + for (int i = 1; i <= atom->ntypes; i++) + gfactor2[i] = + sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; +} + +/* ---------------------------------------------------------------------- + read in initial electron temperatures from a user-specified file + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixTTMOld::read_initial_electron_temperatures(const char *filename) +{ + int ***T_initial_set; + memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); + memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + + std::string name = utils::get_potential_file_path(filename); + if (name.empty()) + error->one(FLERR,"Cannot open input file: {}", + filename); + FILE *fpr = fopen(name.c_str(),"r"); + + // read initial electron temperature values from file + + char line[MAXLINE]; + int ixnode,iynode,iznode; + double T_tmp; + while (1) { + if (fgets(line,MAXLINE,fpr) == nullptr) break; + ValueTokenizer values(line); + if (values.has_next()) ixnode = values.next_int(); + if (values.has_next()) iynode = values.next_int(); + if (values.has_next()) iznode = values.next_int(); + if (values.has_next()) T_tmp = values.next_double(); + else error->one(FLERR,"Incorrect format in fix ttm input file"); + + // check correctness of input data + + if ((ixnode < 0) || (ixnode >= nxnodes) + || (iynode < 0) || (iynode >= nynodes) + || (iznode < 0) || (iznode >= nznodes)) + error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); + + if (T_tmp < 0.0) + error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); + + T_electron[ixnode][iynode][iznode] = T_tmp; + T_initial_set[ixnode][iynode][iznode] = 1; + } + fclose(fpr); + + // check completeness of input data + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + if (T_initial_set[ixnode][iynode][iznode] == 0) + error->one(FLERR,"Initial temperatures not all set in fix ttm"); + + memory->destroy(T_initial_set); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::end_of_step() +{ + double **x = atom->x; + double **v = atom->v; + double *mass = atom->mass; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + net_energy_transfer[ixnode][iynode][iznode] = 0; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; + double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; + double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; + int ixnode = static_cast(xscale*nxnodes); + int iynode = static_cast(yscale*nynodes); + int iznode = static_cast(zscale*nznodes); + while (ixnode > nxnodes-1) ixnode -= nxnodes; + while (iynode > nynodes-1) iynode -= nynodes; + while (iznode > nznodes-1) iznode -= nznodes; + while (ixnode < 0) ixnode += nxnodes; + while (iynode < 0) iynode += nynodes; + while (iznode < 0) iznode += nznodes; + net_energy_transfer[ixnode][iynode][iznode] += + (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + + flangevin[i][2]*v[i][2]); + } + + MPI_Allreduce(&net_energy_transfer[0][0][0], + &net_energy_transfer_all[0][0][0], + total_nnodes,MPI_DOUBLE,MPI_SUM,world); + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + // num_inner_timesteps = # of inner steps (thermal solves) + // required this MD step to maintain a stable explicit solve + + int num_inner_timesteps = 1; + double inner_dt = update->dt; + double stability_criterion = 1.0 - + 2.0*inner_dt/(electronic_specific_heat*electronic_density) * + (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + if (stability_criterion < 0.0) { + inner_dt = 0.5*(electronic_specific_heat*electronic_density) / + (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; + inner_dt = update->dt/double(num_inner_timesteps); + if (num_inner_timesteps > 1000000) + error->warning(FLERR,"Too many inner timesteps in fix ttm"); + } + + for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; + ith_inner_timestep++) { + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + T_electron_old[ixnode][iynode][iznode] = + T_electron[ixnode][iynode][iznode]; + + // compute new electron T profile + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + int right_xnode = ixnode + 1; + int right_ynode = iynode + 1; + int right_znode = iznode + 1; + if (right_xnode == nxnodes) right_xnode = 0; + if (right_ynode == nynodes) right_ynode = 0; + if (right_znode == nznodes) right_znode = 0; + int left_xnode = ixnode - 1; + int left_ynode = iynode - 1; + int left_znode = iznode - 1; + if (left_xnode == -1) left_xnode = nxnodes - 1; + if (left_ynode == -1) left_ynode = nynodes - 1; + if (left_znode == -1) left_znode = nznodes - 1; + T_electron[ixnode][iynode][iznode] = + T_electron_old[ixnode][iynode][iznode] + + inner_dt/(electronic_specific_heat*electronic_density) * + (electronic_thermal_conductivity * + ((T_electron_old[right_xnode][iynode][iznode] + + T_electron_old[left_xnode][iynode][iznode] - + 2*T_electron_old[ixnode][iynode][iznode])/dx/dx + + (T_electron_old[ixnode][right_ynode][iznode] + + T_electron_old[ixnode][left_ynode][iznode] - + 2*T_electron_old[ixnode][iynode][iznode])/dy/dy + + (T_electron_old[ixnode][iynode][right_znode] + + T_electron_old[ixnode][iynode][left_znode] - + 2*T_electron_old[ixnode][iynode][iznode])/dz/dz) - + (net_energy_transfer_all[ixnode][iynode][iznode])/del_vol); + } + } + + // output nodal temperatures for current timestep + + if ((nfileevery) && !(update->ntimestep % nfileevery)) { + + // compute atomic Ta for each grid point + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + nsum[ixnode][iynode][iznode] = 0; + nsum_all[ixnode][iynode][iznode] = 0; + sum_vsq[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq[ixnode][iynode][iznode] = 0.0; + sum_vsq_all[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0; + } + + double massone; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + if (rmass) massone = rmass[i]; + else massone = mass[type[i]]; + double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; + double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; + double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; + int ixnode = static_cast(xscale*nxnodes); + int iynode = static_cast(yscale*nynodes); + int iznode = static_cast(zscale*nznodes); + while (ixnode > nxnodes-1) ixnode -= nxnodes; + while (iynode > nynodes-1) iynode -= nynodes; + while (iznode > nznodes-1) iznode -= nznodes; + while (ixnode < 0) ixnode += nxnodes; + while (iynode < 0) iynode += nynodes; + while (iznode < 0) iznode += nznodes; + double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + nsum[ixnode][iynode][iznode] += 1; + sum_vsq[ixnode][iynode][iznode] += vsq; + sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq; + } + + MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes, + MPI_INT,MPI_SUM,world); + MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes, + MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0], + total_nnodes,MPI_DOUBLE,MPI_SUM,world); + + if (comm->me == 0) { + fmt::print(fp,"{}",update->ntimestep); + + double T_a; + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + T_a = 0; + if (nsum_all[ixnode][iynode][iznode] > 0) + T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/ + (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); + fmt::print(fp," {}",T_a); + } + + fputs("\t",fp); + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]); + fputs("\n",fp); + } + } +} + +/* ---------------------------------------------------------------------- + memory usage of 3d grid +------------------------------------------------------------------------- */ + +double FixTTMOld::memory_usage() +{ + double bytes = 0.0; + bytes += (double)5*total_nnodes * sizeof(int); + bytes += (double)14*total_nnodes * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTMOld::grow_arrays(int ngrow) +{ + + memory->grow(flangevin,ngrow,3,"TTM:flangevin"); + +} + +/* ---------------------------------------------------------------------- + return the energy of the electronic subsystem or the net_energy transfer + between the subsystems +------------------------------------------------------------------------- */ + +double FixTTMOld::compute_vector(int n) +{ + double e_energy = 0.0; + double transfer_energy = 0.0; + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) { + e_energy += + T_electron[ixnode][iynode][iznode]*electronic_specific_heat* + electronic_density*del_vol; + transfer_energy += + net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; + } + + if (n == 0) return e_energy; + if (n == 1) return transfer_energy; + return 0.0; +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixTTMOld::write_restart(FILE *fp) +{ + double *rlist; + memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); + + int n = 0; + rlist[n++] = seed; + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + rlist[n++] = T_electron[ixnode][iynode][iznode]; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(rlist,sizeof(double),n,fp); + } + + memory->destroy(rlist); +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixTTMOld::restart(char *buf) +{ + int n = 0; + double *rlist = (double *) buf; + + // the seed must be changed from the initial seed + + seed = static_cast (0.5*rlist[n++]); + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) + for (int iynode = 0; iynode < nynodes; iynode++) + for (int iznode = 0; iznode < nznodes; iznode++) + T_electron[ixnode][iynode][iznode] = rlist[n++]; + + delete random; + random = new RanMars(lmp,seed+comm->me); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for restart file +------------------------------------------------------------------------- */ + +int FixTTMOld::pack_restart(int i, double *buf) +{ + // pack buf[0] this way because other fixes unpack it + buf[0] = 4; + buf[1] = flangevin[i][0]; + buf[2] = flangevin[i][1]; + buf[3] = flangevin[i][2]; + return 4; +} + +/* ---------------------------------------------------------------------- + unpack values from atom->extra array to restart the fix +------------------------------------------------------------------------- */ + +void FixTTMOld::unpack_restart(int nlocal, int nth) +{ + double **extra = atom->extra; + + // skip to Nth set of extra values + // unpack the Nth first values this way because other fixes pack them + + int m = 0; + for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); + m++; + + flangevin[nlocal][0] = extra[nlocal][m++]; + flangevin[nlocal][1] = extra[nlocal][m++]; + flangevin[nlocal][2] = extra[nlocal][m++]; +} + +/* ---------------------------------------------------------------------- + maxsize of any atom's restart data +------------------------------------------------------------------------- */ + +int FixTTMOld::maxsize_restart() +{ + return 4; +} + +/* ---------------------------------------------------------------------- + size of atom nlocal's restart data +------------------------------------------------------------------------- */ + +int FixTTMOld::size_restart(int /*nlocal*/) +{ + return 4; +} diff --git a/src/EXTRA-FIX/fix_ttm_old.h b/src/EXTRA-FIX/fix_ttm_old.h new file mode 100644 index 0000000000..078e7d4cb7 --- /dev/null +++ b/src/EXTRA-FIX/fix_ttm_old.h @@ -0,0 +1,155 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, 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. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(ttm/old,FixTTMOld); +// clang-format on +#else + +#ifndef LMP_FIX_TTM_OLD_H +#define LMP_FIX_TTM_OLD_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixTTMOld : public Fix { + public: + FixTTMOld(class LAMMPS *, int, char **); + ~FixTTMOld(); + int setmask(); + void init(); + void setup(int); + void post_force(int); + void post_force_respa(int, int, int); + void post_force_setup(int); + void post_force_respa_setup(int, int, int); + void end_of_step(); + void reset_dt(); + void write_restart(FILE *); + void restart(char *); + int pack_restart(int, double *); + void unpack_restart(int, int); + int size_restart(int); + int maxsize_restart(); + double memory_usage(); + void grow_arrays(int); + double compute_vector(int); + + private: + int nfileevery; + int nlevels_respa; + int seed; + class RanMars *random; + FILE *fp; + int nxnodes, nynodes, nznodes; + bigint total_nnodes; + int ***nsum, ***nsum_all; + double *gfactor1, *gfactor2, *ratio, **flangevin; + double ***T_electron, ***T_electron_old; + double ***sum_vsq, ***sum_mass_vsq; + double ***sum_vsq_all, ***sum_mass_vsq_all; + double ***net_energy_transfer, ***net_energy_transfer_all; + double electronic_specific_heat, electronic_density; + double electronic_thermal_conductivity; + double gamma_p, gamma_s, v_0, v_0_sq; + + void read_initial_electron_temperatures(const char *); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Cannot open file %s + +The specified file cannot be opened. Check that the path and name are +correct. If the file is a compressed file, also check that the gzip +executable can be found and run. + +E: Cannot open fix ttm file %s + +The output file for the fix ttm command cannot be opened. Check that +the path and name are correct. + +E: Invalid random number seed in fix ttm command + +Random number seed must be > 0. + +E: Fix ttm electronic_specific_heat must be > 0.0 + +Self-explanatory. + +E: Fix ttm electronic_density must be > 0.0 + +Self-explanatory. + +E: Fix ttm electronic_thermal_conductivity must be >= 0.0 + +Self-explanatory. + +E: Fix ttm gamma_p must be > 0.0 + +Self-explanatory. + +E: Fix ttm gamma_s must be >= 0.0 + +Self-explanatory. + +E: Fix ttm v_0 must be >= 0.0 + +Self-explanatory. + +E: Fix ttm number of nodes must be > 0 + +Self-explanatory. + +E: Cannot use fix ttm with 2d simulation + +This is a current restriction of this fix due to the grid it creates. + +E: Cannot use non-periodic boundares with fix ttm + +This fix requires a fully periodic simulation box. + +E: Cannot use fix ttm with triclinic box + +This is a current restriction of this fix due to the grid it creates. + +E: Electronic temperature dropped below zero + +Something has gone wrong with the fix ttm electron temperature model. + +E: Fix ttm electron temperatures must be > 0.0 + +Self-explanatory. + +E: Initial temperatures not all set in fix ttm + +Self-explanatory. + +W: Too many inner timesteps in fix ttm + +Self-explanatory. + +*/ From 7a8afb6eef81964bee555fa2e8c16cb6b2cf478f Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 19 Aug 2021 20:10:26 -0400 Subject: [PATCH 027/437] add fragment count to molecule file output --- src/molecule.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/molecule.cpp b/src/molecule.cpp index 1194f2c584..138b4e0749 100644 --- a/src/molecule.cpp +++ b/src/molecule.cpp @@ -148,13 +148,15 @@ Molecule::Molecule(LAMMPS *lmp, int narg, char **arg, int &index) : if (me == 0) utils::logmesg(lmp,"Read molecule template {}:\n {} molecules\n" + " {} fragments\n" " {} atoms with max type {}\n" " {} bonds with max type {}\n" " {} angles with max type {}\n" " {} dihedrals with max type {}\n" " {} impropers with max type {}\n", id,nmolecules, - natoms,ntypes,nbonds,nbondtypes,nangles,nangletypes, - ndihedrals,ndihedraltypes,nimpropers,nimpropertypes); + nfragments,natoms,ntypes,nbonds,nbondtypes,nangles, + nangletypes,ndihedrals,ndihedraltypes,nimpropers, + nimpropertypes); } /* ---------------------------------------------------------------------- */ From fcc6cc628e7e04093e2c366a73986f6791f9cd02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Aug 2021 13:47:24 -0400 Subject: [PATCH 028/437] fix whitespace --- doc/src/fix_bond_swap.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 42ee820c93..dbbaceb61f 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -99,7 +99,7 @@ eligible for swapping on this step. (3) The distances between 4 pairs of atoms -- (A1,A2), (B1,B2), (A1,B2), (B1,A2) -- must all be less thann the specified *cutoff*\ . -(4) The molecule IDs of A1 and B1 must be the same (see below). +(4) The molecule IDs of A1 and B1 must be the same (see below). If an eligible B1 partner is found, the energy change due to swapping the 2 bonds is computed. This includes changes in pairwise, bond, and @@ -126,7 +126,7 @@ The criterion for matching molecule IDs is how the first use case described above can be simulated while conserving chain lengths. This is done by setting up the molecule IDs for the polymer chains in a specific way, typically in the data file, read by the :doc:`read_data -` command. +` command. Consider a system of 6-mer chains. You have 2 choices. If the molecule IDs for monomers on each chain are set to 1,2,3,4,5,6 then From 8735555e00a58f40d6ebf9f9adddb302e4e0a45f Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 20 Aug 2021 14:17:05 -0400 Subject: [PATCH 029/437] 1 liner fix for PR #2342 --- src/fix_group.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_group.cpp b/src/fix_group.cpp index c15f2590c5..562384fb40 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -75,7 +75,7 @@ idregion(nullptr), idvar(nullptr), idprop(nullptr) if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); int flag,cols; iprop = atom->find_custom(arg[iarg+1],flag,cols); - if (iprop < 1 || cols) + if (iprop < 0 || cols) error->all(FLERR,"Custom per-atom vector for group dynamic " "does not exist"); propflag = 1; From 29fe006e4631ee2e498a0a13efa7724ad815c25b Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Aug 2021 12:43:47 -0600 Subject: [PATCH 030/437] fix issue in non-perioidic msm.cpp to allow it to work with any grid partitioning --- src/KSPACE/msm.cpp | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 0f9bf07139..23152fa992 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -643,6 +643,7 @@ void MSM::allocate() if (active_flag[n]) { delete gc[n]; int **procneigh = procneigh_levels[n]; + gc[n] = new GridComm(lmp,world_levels[n],2,nx_msm[n],ny_msm[n],nz_msm[n], nxlo_in[n],nxhi_in[n],nylo_in[n],nyhi_in[n], nzlo_in[n],nzhi_in[n], @@ -1202,8 +1203,6 @@ void MSM::set_grid_local() nxlo_in[n],nxhi_in[n],nylo_in[n],nyhi_in[n], nzlo_in[n],nzhi_in[n]); - // nlower,nupper = stencil size for mapping (interpolating) particles to MSM grid - nlower = -(order-1)/2; nupper = order/2; @@ -1282,49 +1281,38 @@ void MSM::set_grid_local() nzhi_out[n] = nhi + MAX(order,nzhi_direct); // add extra grid points for non-periodic boundary conditions + // skip reset of lo/hi for procs who do not own any grid cells if (domain->nonperiodic) { - if (!domain->xperiodic) { - if (nxlo_in[n] == 0) - nxlo_in[n] = alpha[n]; + if (!domain->xperiodic && nxlo_in[n] <= nxhi_in[n]) { + if (nxlo_in[n] == 0) nxlo_in[n] = alpha[n]; nxlo_out[n] = MAX(nxlo_out[n],alpha[n]); if (n == 0) nxlo_out_all = MAX(nxlo_out_all,alpha[0]); - if (nxhi_in[n] == nx_msm[n] - 1) - nxhi_in[n] = betax[n]; + if (nxhi_in[n] == nx_msm[n] - 1) nxhi_in[n] = betax[n]; nxhi_out[n] = MIN(nxhi_out[n],betax[n]); if (n == 0) nxhi_out_all = MIN(nxhi_out_all,betax[0]); - if (nxhi_in[n] < 0) - nxhi_in[n] = alpha[n] - 1; } - if (!domain->yperiodic) { - if (nylo_in[n] == 0) - nylo_in[n] = alpha[n]; + if (!domain->yperiodic && nylo_in[n] <= nyhi_in[n]) { + if (nylo_in[n] == 0) nylo_in[n] = alpha[n]; nylo_out[n] = MAX(nylo_out[n],alpha[n]); if (n == 0) nylo_out_all = MAX(nylo_out_all,alpha[0]); - if (nyhi_in[n] == ny_msm[n] - 1) - nyhi_in[n] = betay[n]; + if (nyhi_in[n] == ny_msm[n] - 1) nyhi_in[n] = betay[n]; nyhi_out[n] = MIN(nyhi_out[n],betay[n]); if (n == 0) nyhi_out_all = MIN(nyhi_out_all,betay[0]); - if (nyhi_in[n] < 0) - nyhi_in[n] = alpha[n] - 1; } - if (!domain->zperiodic) { - if (nzlo_in[n] == 0) - nzlo_in[n] = alpha[n]; + if (!domain->zperiodic && nzlo_in[n] <= nzhi_in[n]) { + if (nzlo_in[n] == 0) nzlo_in[n] = alpha[n]; nzlo_out[n] = MAX(nzlo_out[n],alpha[n]); if (n == 0) nzlo_out_all = MAX(nzlo_out_all,alpha[0]); - if (nzhi_in[n] == nz_msm[n] - 1) - nzhi_in[n] = betaz[n]; + if (nzhi_in[n] == nz_msm[n] - 1) nzhi_in[n] = betaz[n]; nzhi_out[n] = MIN(nzhi_out[n],betaz[n]); if (n == 0) nzhi_out_all = MIN(nzhi_out_all,betaz[0]); - if (nzhi_in[n] < 0) - nzhi_in[n] = alpha[n] - 1; } } From 1a81a94dfb917ef77452055d760a93a4f4201cf6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Aug 2021 13:46:47 -0400 Subject: [PATCH 031/437] fix up whitespace issues (remove tabs, trailing whitespace) --- src/KOKKOS/atom_kokkos.cpp | 12 ++++---- src/dump_custom.cpp | 10 +++---- src/fix_group.cpp | 6 ++-- src/fix_property_atom.cpp | 58 +++++++++++++++++++------------------- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index f40b9c324a..5fb9840a48 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -265,7 +265,7 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) index = nivector; nivector++; ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *), - "atom:ivname"); + "atom:ivname"); int n = strlen(name) + 1; ivname[index] = new char[n]; strcpy(ivname[index],name); @@ -277,7 +277,7 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) index = ndvector; ndvector++; dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *), - "atom:dvname"); + "atom:dvname"); int n = strlen(name) + 1; dvname[index] = new char[n]; strcpy(dvname[index],name); @@ -292,12 +292,12 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) index = niarray; niarray++; ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *), - "atom:ianame"); + "atom:ianame"); int n = strlen(name) + 1; ianame[index] = new char[n]; strcpy(ianame[index],name); iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), - "atom:iarray"); + "atom:iarray"); memory->create(iarray[index],nmax,cols,"atom:iarray"); icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); @@ -307,12 +307,12 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) index = ndarray; ndarray++; daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *), - "atom:daname"); + "atom:daname"); int n = strlen(name) + 1; daname[index] = new char[n]; strcpy(daname[index],name); darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **), - "atom:darray"); + "atom:darray"); memory->create(darray[index],nmax,cols,"atom:darray"); dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 3f70d242b1..7446c65c04 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1042,16 +1042,16 @@ int DumpCustom::count() nstride = 1; } else if (thresh_array[ithresh] == DVEC) { - i = nfield + ithresh; + i = nfield + ithresh; int iwhich = custom[field2index[i]]; ptr = atom->dvector[iwhich]; - nstride = 1; + nstride = 1; } else if (thresh_array[ithresh] == IARRAY) { i = nfield + ithresh; int iwhich = custom[field2index[i]]; int **iarray = atom->iarray[iwhich]; - int icol = argindex[i] - 1; + int icol = argindex[i] - 1; for (i = 0; i < nlocal; i++) dchoose[i] = iarray[i][icol]; ptr = dchoose; @@ -1061,8 +1061,8 @@ int DumpCustom::count() i = nfield + ithresh; int iwhich = custom[field2index[i]]; double **darray = atom->darray[iwhich]; - ptr = &darray[0][argindex[i]-1]; - nstride = atom->dcols[iwhich]; + ptr = &darray[0][argindex[i]-1]; + nstride = atom->dcols[iwhich]; } // unselect atoms that don't meet threshold criterion diff --git a/src/fix_group.cpp b/src/fix_group.cpp index c15f2590c5..1e7225bcef 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -77,7 +77,7 @@ idregion(nullptr), idvar(nullptr), idprop(nullptr) iprop = atom->find_custom(arg[iarg+1],flag,cols); if (iprop < 1 || cols) error->all(FLERR,"Custom per-atom vector for group dynamic " - "does not exist"); + "does not exist"); propflag = 1; delete [] idprop; idprop = utils::strdup(arg[iarg+1]); @@ -246,8 +246,8 @@ void FixGroup::set_group() if (regionflag && !region->match(x[i][0],x[i][1],x[i][2])) inflag = 0; if (varflag && var[i] == 0.0) inflag = 0; if (propflag) { - if (!proptype && ivector[i] == 0) inflag = 0; - if (proptype && dvector[i] == 0.0) inflag = 0; + if (!proptype && ivector[i] == 0) inflag = 0; + if (proptype && dvector[i] == 0.0) inflag = 0; } } else inflag = 0; diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 1e583a4ec9..7df49f4bc4 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -449,23 +449,23 @@ void FixPropertyAtom::write_data_section(int /*mth*/, FILE *fp, if (style[nv] == MOLECULE) fprintf(fp," " TAGINT_FORMAT,(tagint) ubuf(buf[i][icol++]).i); else if (style[nv] == CHARGE) - fprintf(fp," %g",buf[i][icol++]); + fprintf(fp," %g",buf[i][icol++]); else if (style[nv] == RMASS) - fprintf(fp," %g",buf[i][icol++]); + fprintf(fp," %g",buf[i][icol++]); else if (style[nv] == IVEC) fprintf(fp," %d",(int) ubuf(buf[i][icol++]).i); else if (style[nv] == DVEC) - fprintf(fp," %g",buf[i][icol++]); + fprintf(fp," %g",buf[i][icol++]); else if (style[nv] == IARRAY) { - ncol = cols[nv]; - for (k = 0; k < ncol; k++) - fprintf(fp," %d",(int) ubuf(buf[i][icol+k]).i); - icol += ncol; + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + fprintf(fp," %d",(int) ubuf(buf[i][icol+k]).i); + icol += ncol; } else if (style[nv] == DARRAY) { - ncol = cols[nv]; - for (k = 0; k < ncol; k++) - fprintf(fp," %g",buf[i][icol+k]); - icol += ncol; + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + fprintf(fp," %g",buf[i][icol+k]); + icol += ncol; } } fprintf(fp,"\n"); @@ -557,11 +557,11 @@ void FixPropertyAtom::copy_arrays(int i, int j, int /*delflag*/) else if (style[nv] == IARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->iarray[index[nv]][j][k] = atom->iarray[index[nv]][i][k]; + atom->iarray[index[nv]][j][k] = atom->iarray[index[nv]][i][k]; } else if (style[nv] == DARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->darray[index[nv]][j][k] = atom->darray[index[nv]][i][k]; + atom->darray[index[nv]][j][k] = atom->darray[index[nv]][i][k]; } } } @@ -611,16 +611,16 @@ int FixPropertyAtom::pack_border(int n, int *list, double *buf) ncol = cols[nv]; for (i = 0; i < n; i++) { j = list[i]; - for (k = 0; k < ncol; k++) - buf[m++] = ubuf(iarray[j][k]).d; + for (k = 0; k < ncol; k++) + buf[m++] = ubuf(iarray[j][k]).d; } } else if (style[nv] == DARRAY) { double **darray = atom->darray[index[nv]]; ncol = cols[nv]; for (i = 0; i < n; i++) { j = list[i]; - for (k = 0; k < ncol; k++) - buf[m++] = darray[j][k]; + for (k = 0; k < ncol; k++) + buf[m++] = darray[j][k]; } } } @@ -668,15 +668,15 @@ int FixPropertyAtom::unpack_border(int n, int first, double *buf) ncol = cols[nv]; last = first + n; for (i = first; i < last; i++) - for (k = 0; k < ncol; k++) - iarray[i][k] = (int) ubuf(buf[m++]).i; + for (k = 0; k < ncol; k++) + iarray[i][k] = (int) ubuf(buf[m++]).i; } else if (style[nv] == DARRAY) { double **darray = atom->darray[index[nv]]; ncol = cols[nv]; last = first + n; for (i = first; i < last; i++) - for (k = 0; k < ncol; k++) - darray[i][k] = buf[m++]; + for (k = 0; k < ncol; k++) + darray[i][k] = buf[m++]; } } @@ -701,11 +701,11 @@ int FixPropertyAtom::pack_exchange(int i, double *buf) else if (style[nv] == IARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; + buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; } else if (style[nv] == DARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - buf[m++] = atom->darray[index[nv]][i][k]; + buf[m++] = atom->darray[index[nv]][i][k]; } } @@ -735,11 +735,11 @@ int FixPropertyAtom::unpack_exchange(int nlocal, double *buf) else if (style[nv] == IARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->iarray[index[nv]][nlocal][k] = (int) ubuf(buf[m++]).i; + atom->iarray[index[nv]][nlocal][k] = (int) ubuf(buf[m++]).i; } else if (style[nv] == DARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->darray[index[nv]][nlocal][k] = buf[m++]; + atom->darray[index[nv]][nlocal][k] = buf[m++]; } } @@ -768,11 +768,11 @@ int FixPropertyAtom::pack_restart(int i, double *buf) else if (style[nv] == IARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; + buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; } else if (style[nv] == DARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - buf[m++] = atom->darray[index[nv]][i][k]; + buf[m++] = atom->darray[index[nv]][i][k]; } } @@ -809,11 +809,11 @@ void FixPropertyAtom::unpack_restart(int nlocal, int nth) else if (style[nv] == IARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->iarray[index[nv]][nlocal][k] = (int) ubuf(extra[nlocal][m++]).i; + atom->iarray[index[nv]][nlocal][k] = (int) ubuf(extra[nlocal][m++]).i; } else if (style[nv] == DARRAY) { ncol = cols[nv]; for (k = 0; k < ncol; k++) - atom->darray[index[nv]][nlocal][k] = extra[nlocal][m++]; + atom->darray[index[nv]][nlocal][k] = extra[nlocal][m++]; } } } From 7c61e96f0bd236756c2cb1e6e5211daac88d06be Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 20 Aug 2021 16:08:06 -0600 Subject: [PATCH 032/437] Fix bug with v remap option in Kokkos fix deform --- src/KOKKOS/domain_kokkos.cpp | 8 +------- src/KOKKOS/domain_kokkos.h | 1 - src/KOKKOS/fix_deform_kokkos.cpp | 6 +++--- src/domain.cpp | 2 +- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/domain_kokkos.cpp b/src/KOKKOS/domain_kokkos.cpp index 82e1684de9..6a1decbed6 100644 --- a/src/KOKKOS/domain_kokkos.cpp +++ b/src/KOKKOS/domain_kokkos.cpp @@ -27,14 +27,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -DomainKokkos::DomainKokkos(LAMMPS *lmp) : Domain(lmp) {} - -/* ---------------------------------------------------------------------- */ - -void DomainKokkos::init() -{ +DomainKokkos::DomainKokkos(LAMMPS *lmp) : Domain(lmp) { atomKK = (AtomKokkos *) atom; - Domain::init(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/domain_kokkos.h b/src/KOKKOS/domain_kokkos.h index 591d2ef7b9..50c7542e82 100644 --- a/src/KOKKOS/domain_kokkos.h +++ b/src/KOKKOS/domain_kokkos.h @@ -30,7 +30,6 @@ class DomainKokkos : public Domain { public: DomainKokkos(class LAMMPS *); ~DomainKokkos() {} - void init(); void reset_box(); void pbc(); void remap_all(); diff --git a/src/KOKKOS/fix_deform_kokkos.cpp b/src/KOKKOS/fix_deform_kokkos.cpp index bf7fdfb429..576e34503c 100644 --- a/src/KOKKOS/fix_deform_kokkos.cpp +++ b/src/KOKKOS/fix_deform_kokkos.cpp @@ -38,7 +38,7 @@ using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -enum{NONE,FINAL,DELTA,SCALE,VEL,ERATE,TRATE,VOLUME,WIGGLE,VARIABLE}; +enum{NONE=0,FINAL,DELTA,SCALE,VEL,ERATE,TRATE,VOLUME,WIGGLE,VARIABLE}; enum{ONE_FROM_ONE,ONE_FROM_TWO,TWO_FROM_ONE}; /* ---------------------------------------------------------------------- */ @@ -143,7 +143,7 @@ void FixDeformKokkos::end_of_step() // set new box size for VOLUME dims that are linked to other dims // NOTE: still need to set h_rate for these dims - for (int i = 0; i < 3; i++) { + for (i = 0; i < 3; i++) { if (set[i].style != VOLUME) continue; if (set[i].substyle == ONE_FROM_ONE) { @@ -227,7 +227,7 @@ void FixDeformKokkos::end_of_step() // tilt_target can be large positive or large negative value // add/subtract box lengths until tilt_target is closest to current value - int idenom; + int idenom = 0; if (i == 5) idenom = 0; else if (i == 4) idenom = 0; else if (i == 3) idenom = 1; diff --git a/src/domain.cpp b/src/domain.cpp index 5f780d523c..7df82fbfb3 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -175,7 +175,7 @@ void Domain::init() deform_flag = deform_vremap = deform_groupbit = 0; for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"deform") == 0) { + if (utils::strmatch(modify->fix[i]->style,"^deform")) { deform_flag = 1; if (((FixDeform *) modify->fix[i])->remapflag == Domain::V_REMAP) { deform_vremap = 1; From d8f0cec03108bbbb293230fad6f9cb04e8c47f4b Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 20 Aug 2021 16:57:20 -0600 Subject: [PATCH 033/437] updates/bug-fixes to parallel fix ttm/grid --- src/EXTRA-FIX/fix_ttm.cpp | 289 ++++++++++++++++++-------------- src/EXTRA-FIX/fix_ttm.h | 7 +- src/EXTRA-FIX/fix_ttm_grid.cpp | 122 +++++++------- src/EXTRA-FIX/fix_ttm_grid.h | 1 - src/KSPACE/msm.cpp | 40 ++--- src/KSPACE/msm_cg.cpp | 40 ++--- src/KSPACE/pppm.cpp | 28 ++-- src/KSPACE/pppm_cg.cpp | 20 +-- src/KSPACE/pppm_dipole.cpp | 12 +- src/KSPACE/pppm_dipole_spin.cpp | 12 +- src/KSPACE/pppm_disp.cpp | 84 +++++----- src/KSPACE/pppm_stagger.cpp | 20 +-- src/gridcomm.cpp | 17 +- src/gridcomm.h | 2 + 14 files changed, 366 insertions(+), 328 deletions(-) diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp index fcecced4ef..eaf095d329 100644 --- a/src/EXTRA-FIX/fix_ttm.cpp +++ b/src/EXTRA-FIX/fix_ttm.cpp @@ -37,7 +37,8 @@ using namespace LAMMPS_NS; using namespace FixConst; #define MAXLINE 1024 -#define OFFSET 16384 +#define OFFSET 16384 // to avoid outside-of-box atoms being rounded incorrectly +#define SHIFT 0.5 // 0.5 for nearest grid point, 0.0 for lower-left grid point /* ---------------------------------------------------------------------- */ @@ -65,9 +66,9 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : gamma_p = utils::numeric(FLERR,arg[7],false,lmp); gamma_s = utils::numeric(FLERR,arg[8],false,lmp); v_0 = utils::numeric(FLERR,arg[9],false,lmp); - nxnodes = utils::inumeric(FLERR,arg[10],false,lmp); - nynodes = utils::inumeric(FLERR,arg[11],false,lmp); - nznodes = utils::inumeric(FLERR,arg[12],false,lmp); + nxgrid = utils::inumeric(FLERR,arg[10],false,lmp); + nygrid = utils::inumeric(FLERR,arg[11],false,lmp); + nzgrid = utils::inumeric(FLERR,arg[12],false,lmp); int n = strlen(arg[13]) + 1; infile = new char[n]; @@ -86,11 +87,16 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : if (gamma_p <= 0.0) error->all(FLERR,"Fix ttm gamma_p must be > 0.0"); if (gamma_s < 0.0) error->all(FLERR,"Fix ttm gamma_s must be >= 0.0"); if (v_0 < 0.0) error->all(FLERR,"Fix ttm v_0 must be >= 0.0"); - if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0) + if (nxgrid <= 0 || nygrid <= 0 || nzgrid <= 0) error->all(FLERR,"Fix ttm number of nodes must be > 0"); v_0_sq = v_0*v_0; + // OFFSET to make + // SHIFT to map atom to nearest or lower-left grid point + + shift = OFFSET + SHIFT; + // initialize Marsaglia RNG with processor-unique seed random = new RanMars(lmp,seed + comm->me); @@ -102,9 +108,10 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : // check for allowed maxium number of total grid nodes - total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes; - if (total_nnodes > MAXSMALLINT) - error->all(FLERR,"Too many nodes in fix ttm"); + bigint totalgrid = (bigint) nxgrid * nygrid * nzgrid; + if (totalgrid > MAXSMALLINT) + error->all(FLERR,"Too many grid points in fix ttm"); + ngridtotal = totalgrid; // allocate per-atom flangevin and zero it // NOTE: is init to zero necessary? @@ -137,10 +144,11 @@ void FixTTM::post_constructor() // zero net_energy_transfer // in case compute_vector accesses it on timestep 0 - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - net_energy_transfer_all[ixnode][iynode][iznode] = 0; + outflag = 0; + for (int ix = 0; ix < nxgrid; ix++) + for (int iy = 0; iy < nygrid; iy++) + for (int iz = 0; iz < nzgrid; iz++) + net_energy_transfer_all[ix][iy][iz] = 0; // set initial electron temperatures from user input file @@ -233,6 +241,10 @@ void FixTTM::post_force_setup(int /*vflag*/) void FixTTM::post_force(int /*vflag*/) { + int ix,iy,iz; + double xscale,yscale,zscale; + double gamma1,gamma2; + double **x = atom->x; double **v = atom->v; double **f = atom->f; @@ -240,29 +252,27 @@ void FixTTM::post_force(int /*vflag*/) int *mask = atom->mask; int nlocal = atom->nlocal; - double gamma1,gamma2; - // apply damping and thermostat to all atoms in fix group for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; - double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; - double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; - int ixnode = static_cast(xscale*nxnodes + OFFSET) - OFFSET; - int iynode = static_cast(yscale*nynodes + OFFSET) - OFFSET; - int iznode = static_cast(zscale*nznodes + OFFSET) - OFFSET; - while (ixnode > nxnodes-1) ixnode -= nxnodes; - while (iynode > nynodes-1) iynode -= nynodes; - while (iznode > nznodes-1) iznode -= nznodes; - while (ixnode < 0) ixnode += nxnodes; - while (iynode < 0) iynode += nynodes; - while (iznode < 0) iznode += nznodes; + xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; + yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; + zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; + ix = static_cast(xscale*nxgrid + shift) - OFFSET; + iy = static_cast(yscale*nygrid + shift) - OFFSET; + iz = static_cast(zscale*nzgrid + shift) - OFFSET; + if (ix < 0) ix += nxgrid; + if (iy < 0) iy += nygrid; + if (iz < 0) iz += nzgrid; + if (ix >= nxgrid) ix -= nxgrid; + if (iy >= nygrid) iy -= nygrid; + if (iz >= nzgrid) iz -= nzgrid; - if (T_electron[ixnode][iynode][iznode] < 0) + if (T_electron[ix][iy][iz] < 0) error->all(FLERR,"Electronic temperature dropped below zero"); - double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]); + double tsqrt = sqrt(T_electron[ix][iy][iz]); gamma1 = gfactor1[type[i]]; double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; @@ -298,6 +308,9 @@ void FixTTM::post_force_respa(int vflag, int ilevel, int /*iloop*/) void FixTTM::end_of_step() { + int ix,iy,iz; + double xscale,yscale,zscale; + double **x = atom->x; double **v = atom->v; double *mass = atom->mass; @@ -306,37 +319,38 @@ void FixTTM::end_of_step() int *mask = atom->mask; int nlocal = atom->nlocal; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - net_energy_transfer[ixnode][iynode][iznode] = 0; + outflag = 0; + for (ix = 0; ix < nxgrid; ix++) + for (iy = 0; iy < nygrid; iy++) + for (iz = 0; iz < nzgrid; iz++) + net_energy_transfer[ix][iy][iz] = 0; for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; - double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; - double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; - int ixnode = static_cast(xscale*nxnodes + OFFSET) - OFFSET; - int iynode = static_cast(yscale*nynodes + OFFSET) - OFFSET; - int iznode = static_cast(zscale*nznodes + OFFSET) - OFFSET; - while (ixnode > nxnodes-1) ixnode -= nxnodes; - while (iynode > nynodes-1) iynode -= nynodes; - while (iznode > nznodes-1) iznode -= nznodes; - while (ixnode < 0) ixnode += nxnodes; - while (iynode < 0) iynode += nynodes; - while (iznode < 0) iznode += nznodes; - net_energy_transfer[ixnode][iynode][iznode] += + xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; + yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; + zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; + ix = static_cast(xscale*nxgrid + shift) - OFFSET; + iy = static_cast(yscale*nygrid + shift) - OFFSET; + iz = static_cast(zscale*nzgrid + shift) - OFFSET; + if (ix < 0) ix += nxgrid; + if (iy < 0) iy += nygrid; + if (iz < 0) iz += nzgrid; + if (ix >= nxgrid) ix -= nxgrid; + if (iy >= nygrid) iy -= nygrid; + if (iz >= nzgrid) iz -= nzgrid; + net_energy_transfer[ix][iy][iz] += (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + flangevin[i][2]*v[i][2]); } MPI_Allreduce(&net_energy_transfer[0][0][0], &net_energy_transfer_all[0][0][0], - total_nnodes,MPI_DOUBLE,MPI_SUM,world); + ngridtotal,MPI_DOUBLE,MPI_SUM,world); - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; + double dx = domain->xprd/nxgrid; + double dy = domain->yprd/nygrid; + double dz = domain->zprd/nzgrid; double del_vol = dx*dy*dz; // num_inner_timesteps = # of inner steps (thermal solves) @@ -344,9 +358,11 @@ void FixTTM::end_of_step() int num_inner_timesteps = 1; double inner_dt = update->dt; + double stability_criterion = 1.0 - 2.0*inner_dt/(electronic_specific_heat*electronic_density) * (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); + if (stability_criterion < 0.0) { inner_dt = 0.5*(electronic_specific_heat*electronic_density) / (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); @@ -356,46 +372,50 @@ void FixTTM::end_of_step() error->warning(FLERR,"Too many inner timesteps in fix ttm"); } - for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; - ith_inner_timestep++) { + // finite difference iterations to update T_electron - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - T_electron_old[ixnode][iynode][iznode] = - T_electron[ixnode][iynode][iznode]; + for (int istep = 0; istep < num_inner_timesteps; istep++) { + + for (ix = 0; ix < nxgrid; ix++) + for (iy = 0; iy < nygrid; iy++) + for (iz = 0; iz < nzgrid; iz++) + T_electron_old[ix][iy][iz] = + T_electron[ix][iy][iz]; // compute new electron T profile - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - int right_xnode = ixnode + 1; - int right_ynode = iynode + 1; - int right_znode = iznode + 1; - if (right_xnode == nxnodes) right_xnode = 0; - if (right_ynode == nynodes) right_ynode = 0; - if (right_znode == nznodes) right_znode = 0; - int left_xnode = ixnode - 1; - int left_ynode = iynode - 1; - int left_znode = iznode - 1; - if (left_xnode == -1) left_xnode = nxnodes - 1; - if (left_ynode == -1) left_ynode = nynodes - 1; - if (left_znode == -1) left_znode = nznodes - 1; - T_electron[ixnode][iynode][iznode] = - T_electron_old[ixnode][iynode][iznode] + + for (ix = 0; ix < nxgrid; ix++) + for (iy = 0; iy < nygrid; iy++) + for (iz = 0; iz < nzgrid; iz++) { + int right_xnode = ix + 1; + int right_ynode = iy + 1; + int right_znode = iz + 1; + if (right_xnode == nxgrid) right_xnode = 0; + if (right_ynode == nygrid) right_ynode = 0; + if (right_znode == nzgrid) right_znode = 0; + int left_xnode = ix - 1; + int left_ynode = iy - 1; + int left_znode = iz - 1; + if (left_xnode == -1) left_xnode = nxgrid - 1; + if (left_ynode == -1) left_ynode = nygrid - 1; + if (left_znode == -1) left_znode = nzgrid - 1; + + T_electron[ix][iy][iz] = + T_electron_old[ix][iy][iz] + inner_dt/(electronic_specific_heat*electronic_density) * (electronic_thermal_conductivity * - ((T_electron_old[right_xnode][iynode][iznode] + - T_electron_old[left_xnode][iynode][iznode] - - 2*T_electron_old[ixnode][iynode][iznode])/dx/dx + - (T_electron_old[ixnode][right_ynode][iznode] + - T_electron_old[ixnode][left_ynode][iznode] - - 2*T_electron_old[ixnode][iynode][iznode])/dy/dy + - (T_electron_old[ixnode][iynode][right_znode] + - T_electron_old[ixnode][iynode][left_znode] - - 2*T_electron_old[ixnode][iynode][iznode])/dz/dz) - - (net_energy_transfer_all[ixnode][iynode][iznode])/del_vol); + + ((T_electron_old[right_xnode][iy][iz] + + T_electron_old[left_xnode][iy][iz] - + 2*T_electron_old[ix][iy][iz])/dx/dx + + (T_electron_old[ix][right_ynode][iz] + + T_electron_old[ix][left_ynode][iz] - + 2*T_electron_old[ix][iy][iz])/dy/dy + + (T_electron_old[ix][iy][right_znode] + + T_electron_old[ix][iy][left_znode] - + 2*T_electron_old[ix][iy][iz])/dz/dz) - + + (net_energy_transfer_all[ix][iy][iz])/del_vol); } } } @@ -408,8 +428,8 @@ void FixTTM::end_of_step() void FixTTM::read_electron_temperatures(const char *filename) { int ***T_initial_set; - memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set"); - memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + memory->create(T_initial_set,nxgrid,nygrid,nzgrid,"ttm:T_initial_set"); + memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int)); std::string name = utils::get_potential_file_path(filename); if (name.empty()) @@ -420,44 +440,45 @@ void FixTTM::read_electron_temperatures(const char *filename) // read initial electron temperature values from file char line[MAXLINE]; - int ixnode,iynode,iznode; + int ix,iy,iz; double T_tmp; + while (1) { if (fgets(line,MAXLINE,fp) == nullptr) break; ValueTokenizer values(line); - if (values.has_next()) ixnode = values.next_int(); - if (values.has_next()) iynode = values.next_int(); - if (values.has_next()) iznode = values.next_int(); + if (values.has_next()) ix = values.next_int(); + if (values.has_next()) iy = values.next_int(); + if (values.has_next()) iz = values.next_int(); if (values.has_next()) T_tmp = values.next_double(); else error->one(FLERR,"Incorrect format in fix ttm input file"); // check correctness of input data - if ((ixnode < 0) || (ixnode >= nxnodes) - || (iynode < 0) || (iynode >= nynodes) - || (iznode < 0) || (iznode >= nznodes)) + if ((ix < 0) || (ix >= nxgrid) + || (iy < 0) || (iy >= nygrid) + || (iz < 0) || (iz >= nzgrid)) error->one(FLERR,"Fix ttm invalide node index in fix ttm input"); if (T_tmp < 0.0) error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); - T_electron[ixnode][iynode][iznode] = T_tmp; - T_initial_set[ixnode][iynode][iznode] = 1; + T_electron[ix][iy][iz] = T_tmp; + T_initial_set[ix][iy][iz] = 1; } fclose(fp); // check completeness of input data - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - if (T_initial_set[ixnode][iynode][iznode] == 0) + for (int ix = 0; ix < nxgrid; ix++) + for (int iy = 0; iy < nygrid; iy++) + for (int iz = 0; iz < nzgrid; iz++) + if (T_initial_set[ix][iy][iz] == 0) error->one(FLERR,"Initial temperatures not all set in fix ttm"); memory->destroy(T_initial_set); - MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); + MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world); } /* ---------------------------------------------------------------------- */ @@ -483,15 +504,15 @@ void FixTTM::grow_arrays(int ngrow) void FixTTM::write_restart(FILE *fp) { double *rlist; - memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); + memory->create(rlist,nxgrid*nygrid*nzgrid+1,"TTM:rlist"); int n = 0; rlist[n++] = seed; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - rlist[n++] = T_electron[ixnode][iynode][iznode]; + for (int ix = 0; ix < nxgrid; ix++) + for (int iy = 0; iy < nygrid; iy++) + for (int iz = 0; iz < nzgrid; iz++) + rlist[n++] = T_electron[ix][iy][iz]; if (comm->me == 0) { int size = n * sizeof(double); @@ -511,14 +532,15 @@ void FixTTM::restart(char *buf) int n = 0; double *rlist = (double *) buf; - // the seed must be changed from the initial seed + // change RN seed from initial seed, to avoid same Langevin factors + // just increment by 1, since for RanMars that is new RN streamd - seed = static_cast (0.5*rlist[n++]); + seed = static_cast (rlist[n++]) + 1; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - T_electron[ixnode][iynode][iznode] = rlist[n++]; + for (int ix = 0; ix < nxgrid; ix++) + for (int iy = 0; iy < nygrid; iy++) + for (int iz = 0; iz < nzgrid; iz++) + T_electron[ix][iy][iz] = rlist[n++]; delete random; random = new RanMars(lmp,seed+comm->me); @@ -531,6 +553,7 @@ void FixTTM::restart(char *buf) int FixTTM::pack_restart(int i, double *buf) { // pack buf[0] this way because other fixes unpack it + buf[0] = 4; buf[1] = flangevin[i][0]; buf[2] = flangevin[i][1]; @@ -583,23 +606,29 @@ int FixTTM::maxsize_restart() double FixTTM::compute_vector(int n) { - double e_energy = 0.0; - double transfer_energy = 0.0; + if (outflag == 0) { + e_energy = 0.0; + transfer_energy = 0.0; - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; - double del_vol = dx*dy*dz; + int ix,iy,iz; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) { - e_energy += - T_electron[ixnode][iynode][iznode]*electronic_specific_heat* - electronic_density*del_vol; - transfer_energy += - net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; - } + double dx = domain->xprd/nxgrid; + double dy = domain->yprd/nygrid; + double dz = domain->zprd/nzgrid; + double del_vol = dx*dy*dz; + + for (ix = 0; ix < nxgrid; ix++) + for (iy = 0; iy < nygrid; iy++) + for (iz = 0; iz < nzgrid; iz++) { + e_energy += + T_electron[ix][iy][iz]*electronic_specific_heat* + electronic_density*del_vol; + transfer_energy += + net_energy_transfer_all[ix][iy][iz]*update->dt; + } + + outflag = 1; + } if (n == 0) return e_energy; if (n == 1) return transfer_energy; @@ -614,7 +643,7 @@ double FixTTM::memory_usage() { double bytes = 0.0; bytes += (double)atom->nmax * 3 * sizeof(double); - bytes += (double)4*total_nnodes * sizeof(int); + bytes += (double)4*ngridtotal * sizeof(int); return bytes; } @@ -624,11 +653,11 @@ double FixTTM::memory_usage() void FixTTM::allocate_grid() { - memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old"); - memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron"); - memory->create(net_energy_transfer,nxnodes,nynodes,nznodes, + memory->create(T_electron_old,nxgrid,nygrid,nzgrid,"ttm:T_electron_old"); + memory->create(T_electron,nxgrid,nygrid,nzgrid,"ttm:T_electron"); + memory->create(net_energy_transfer,nxgrid,nygrid,nzgrid, "ttm:net_energy_transfer"); - memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes, + memory->create(net_energy_transfer_all,nxgrid,nygrid,nzgrid, "ttm:net_energy_transfer_all"); } diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h index 5773582d29..a7e7e0ea45 100644 --- a/src/EXTRA-FIX/fix_ttm.h +++ b/src/EXTRA-FIX/fix_ttm.h @@ -51,9 +51,12 @@ class FixTTM : public Fix { protected: int nlevels_respa; int seed; - int nxnodes, nynodes, nznodes; - bigint total_nnodes; + int nxgrid, nygrid, nzgrid; // size of global grid + int ngridtotal; // total size of global grid int deallocate_flag; + int outflag; + double shift; + double e_energy,transfer_energy; class RanMars *random; char *infile; diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp index 223ea6240a..3ca94e10b4 100644 --- a/src/EXTRA-FIX/fix_ttm_grid.cpp +++ b/src/EXTRA-FIX/fix_ttm_grid.cpp @@ -87,9 +87,9 @@ void FixTTMGrid::post_force(int /*vflag*/) int nlocal = atom->nlocal; double *boxlo = domain->boxlo; - double dxinv = nxnodes/domain->xprd; - double dyinv = nxnodes/domain->yprd; - double dzinv = nxnodes/domain->zprd; + double dxinv = nxgrid/domain->xprd; + double dyinv = nygrid/domain->yprd; + double dzinv = nzgrid/domain->zprd; // apply damping and thermostat to all atoms in fix group @@ -145,25 +145,27 @@ void FixTTMGrid::end_of_step() int nlocal = atom->nlocal; double *boxlo = domain->boxlo; - double dxinv = nxnodes/domain->xprd; - double dyinv = nxnodes/domain->yprd; - double dzinv = nxnodes/domain->zprd; + double dxinv = nxgrid/domain->xprd; + double dyinv = nygrid/domain->yprd; + double dzinv = nzgrid/domain->zprd; double volgrid = 1.0 / (dxinv*dyinv*dzinv); + outflag = 0; memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0, ngridout*sizeof(double)); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - ix = static_cast ((x[i][0]-boxlo[0])*dxinv+shift) - OFFSET; - iy = static_cast ((x[i][1]-boxlo[1])*dyinv+shift) - OFFSET; - iz = static_cast ((x[i][2]-boxlo[2])*dzinv+shift) - OFFSET; + ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET; + iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET; + iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET; net_energy_transfer[iz][iy][ix] += (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + flangevin[i][2]*v[i][2]); } - gc->reverse_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); + gc->reverse_comm(GridComm::FIX,this,1,sizeof(double),0, + gc_buf1,gc_buf2,MPI_DOUBLE); // num_inner_timesteps = # of inner steps (thermal solves) // required this MD step to maintain a stable explicit solve @@ -186,8 +188,7 @@ void FixTTMGrid::end_of_step() // finite difference iterations to update T_electron - for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; - ith_inner_timestep++) { + for (int istep = 0; istep < num_inner_timesteps; istep++) { memcpy(&T_electron_old[nzlo_out][nylo_out][nxlo_out], &T_electron[nzlo_out][nylo_out][nxlo_out],ngridout*sizeof(double)); @@ -229,7 +230,8 @@ void FixTTMGrid::end_of_step() // communicate new T_electron values to ghost grid points - gc->forward_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); + gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0, + gc_buf1,gc_buf2,MPI_DOUBLE); // assign electron temperature to each atom for fix output @@ -266,7 +268,7 @@ void FixTTMGrid::read_electron_temperatures(const char *filename) char **values = new char*[4]; char *buffer = new char[CHUNK*MAXLINE]; - bigint ntotal = (bigint) nxnodes * nynodes * nznodes; + bigint ntotal = (bigint) nxgrid * nygrid * nzgrid; bigint nread = 0; char *buf,*next; @@ -301,8 +303,8 @@ void FixTTMGrid::read_electron_temperatures(const char *filename) iy = utils::inumeric(FLERR,values[1],false,lmp); iz = utils::inumeric(FLERR,values[2],false,lmp); - if (ix < 0 || ix >= nxnodes || iy < 0 || iy >= nynodes || - iz < 0 || iz >= nznodes) + if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid || + iz < 0 || iz >= nzgrid) error->all(FLERR,"Fix ttm/grid invalid node index in input"); if (ix >= nxlo_in && ix <= nxhi_in && @@ -342,7 +344,8 @@ void FixTTMGrid::read_electron_temperatures(const char *filename) // communicate new T_electron values to ghost grid points - gc->forward_comm(1,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE); + gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0, + gc_buf1,gc_buf2,MPI_DOUBLE); } /* ---------------------------------------------------------------------- @@ -408,40 +411,40 @@ void FixTTMGrid::allocate_grid() // global grid that I own without ghost cells // both non-tiled and tiled proc layouts use 0-1 fractional subdomain info + // NOTE: replace with comm->partition_grid() + if (comm->layout != Comm::LAYOUT_TILED) { - nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nxnodes); - nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nxnodes) - 1; + nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nxgrid); + nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nxgrid) - 1; - nylo_in = static_cast (comm->ysplit[comm->myloc[1]] * nynodes); - nyhi_in = static_cast (comm->ysplit[comm->myloc[1]+1] * nynodes) - 1; + nylo_in = static_cast (comm->ysplit[comm->myloc[1]] * nygrid); + nyhi_in = static_cast (comm->ysplit[comm->myloc[1]+1] * nygrid) - 1; - nzlo_in = static_cast (comm->zsplit[comm->myloc[2]] * nznodes); - nzhi_in = static_cast (comm->zsplit[comm->myloc[2]+1] * nznodes) - 1; + nzlo_in = static_cast (comm->zsplit[comm->myloc[2]] * nzgrid); + nzhi_in = static_cast (comm->zsplit[comm->myloc[2]+1] * nzgrid) - 1; } else { - nxlo_in = static_cast (comm->mysplit[0][0] * nxnodes); - nxhi_in = static_cast (comm->mysplit[0][1] * nxnodes) - 1; + nxlo_in = static_cast (comm->mysplit[0][0] * nxgrid); + nxhi_in = static_cast (comm->mysplit[0][1] * nxgrid) - 1; - nylo_in = static_cast (comm->mysplit[1][0] * nynodes); - nyhi_in = static_cast (comm->mysplit[1][1] * nynodes) - 1; + nylo_in = static_cast (comm->mysplit[1][0] * nygrid); + nyhi_in = static_cast (comm->mysplit[1][1] * nygrid) - 1; - nzlo_in = static_cast (comm->mysplit[1][0] * nznodes); - nzhi_in = static_cast (comm->mysplit[1][1] * nznodes) - 1; + nzlo_in = static_cast (comm->mysplit[1][0] * nzgrid); + nzhi_in = static_cast (comm->mysplit[1][1] * nzgrid) - 1; } // nlo,nhi = min/max index of global grid pt my owned atoms can be mapped to // finite difference stencil requires extra grid pt around my owned grid pts - // max of these 2 quantities is the ghost cells needed in each di + // max of these 2 quantities is the ghost cells needed in each dim // nlo_out,nhi_out = nlo_in,nhi_in + ghost cells double *boxlo = domain->boxlo; double *sublo = domain->sublo; double *subhi = domain->subhi; - double dxinv = nxnodes/domain->xprd; - double dyinv = nxnodes/domain->yprd; - double dzinv = nxnodes/domain->zprd; - - shift = OFFSET + 0.0; // change this to 0.5 for nearest grid pt + double dxinv = nxgrid/domain->xprd; + double dyinv = nxgrid/domain->yprd; + double dzinv = nxgrid/domain->zprd; int nlo,nhi; double cuthalf = 0.5*neighbor->skin; @@ -461,10 +464,14 @@ void FixTTMGrid::allocate_grid() nzlo_out = MIN(nlo,nzlo_in-1); nzhi_out = MAX(nhi,nzhi_in+1); - ngridout = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * + bigint totalmine; + totalmine = (bigint) (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * (nzhi_out-nzlo_out+1); + if (totalmine > MAXSMALLINT) + error->one(FLERR,"Too many owned+ghost grid points in fix ttm"); + ngridout = totalmine; - gc = new GridComm(lmp,world,nxnodes,nynodes,nznodes, + gc = new GridComm(lmp,world,nxgrid,nygrid,nzgrid, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out); @@ -531,7 +538,7 @@ void FixTTMGrid::write_restart(FILE *fp) int ix,iy,iz; double *rlist; - memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist"); + memory->create(rlist,nxgrid*nygrid*nzgrid+1,"TTM:rlist"); int n = 0; rlist[n++] = seed; @@ -561,27 +568,30 @@ double FixTTMGrid::compute_vector(int n) { int ix,iy,iz; - double dx = domain->xprd/nxnodes; - double dy = domain->yprd/nynodes; - double dz = domain->zprd/nznodes; - double volgrid = dx*dy*dz; + if (outflag == 0) { + double dx = domain->xprd/nxgrid; + double dy = domain->yprd/nygrid; + double dz = domain->zprd/nzgrid; + double volgrid = dx*dy*dz; - double e_energy_me = 0.0; - double transfer_energy_me = 0.0; + double e_energy_me = 0.0; + double transfer_energy_me = 0.0; - for (iz = nzlo_in; iz <= nzhi_in; iz++) - for (iy = nylo_in; iy <= nyhi_in; iy++) - for (ix = nxlo_in; ix <= nxhi_in; ix++) { - e_energy_me += - T_electron[iz][iy][ix]*electronic_specific_heat* - electronic_density*volgrid; - transfer_energy_me += - net_energy_transfer[iz][iy][ix]*update->dt; - } + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + e_energy_me += + T_electron[iz][iy][ix]*electronic_specific_heat* + electronic_density*volgrid; + transfer_energy_me += + net_energy_transfer[iz][iy][ix]*update->dt; + } - double e_energy,transfer_energy; - MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE, + MPI_SUM,world); + outflag = 1; + } if (n == 0) return e_energy; if (n == 1) return transfer_energy; diff --git a/src/EXTRA-FIX/fix_ttm_grid.h b/src/EXTRA-FIX/fix_ttm_grid.h index 08854823df..617612d641 100644 --- a/src/EXTRA-FIX/fix_ttm_grid.h +++ b/src/EXTRA-FIX/fix_ttm_grid.h @@ -48,7 +48,6 @@ class FixTTMGrid : public FixTTM { int ngridout; int nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in; int nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out; - double shift; double delxinv,delyinv,delzinv; class GridComm *gc; diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 87b919af17..d7cc35cf19 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -465,8 +465,8 @@ void MSM::compute(int eflag, int vflag) // to fully sum contribution in their 3d grid current_level = 0; - gcall->reverse_comm_kspace(this,1,sizeof(double),REVERSE_RHO, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_RHO,gcall_buf1,gcall_buf2,MPI_DOUBLE); // forward communicate charge density values to fill ghost grid points // compute direct sum interaction and then restrict to coarser grid @@ -474,8 +474,8 @@ void MSM::compute(int eflag, int vflag) for (int n=0; n<=levels-2; n++) { if (!active_flag[n]) continue; current_level = n; - gc[n]->forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_RHO,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); direct(n); restriction(n); } @@ -487,16 +487,16 @@ void MSM::compute(int eflag, int vflag) if (domain->nonperiodic) { current_level = levels-1; gc[levels-1]-> - forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_RHO,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); direct_top(levels-1); gc[levels-1]-> - reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_AD,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); if (vflag_atom) gc[levels-1]-> - reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); } else { // Here using MPI_Allreduce is cheaper than using commgrid @@ -506,8 +506,8 @@ void MSM::compute(int eflag, int vflag) current_level = levels-1; if (vflag_atom) gc[levels-1]-> - reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); } } @@ -519,28 +519,28 @@ void MSM::compute(int eflag, int vflag) prolongation(n); current_level = n; - gc[n]->reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_AD,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); // extra per-atom virial communication if (vflag_atom) - gc[n]->reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); } // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks current_level = 0; - gcall->forward_comm_kspace(this,1,sizeof(double),FORWARD_AD, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_AD,gcall_buf1,gcall_buf2,MPI_DOUBLE); // extra per-atom energy/virial communication if (vflag_atom) - gcall->forward_comm_kspace(this,6,sizeof(double),FORWARD_AD_PERATOM, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->forward_comm(GridComm::KSPACE,this,6,sizeof(double), + FORWARD_AD_PERATOM,gcall_buf1,gcall_buf2,MPI_DOUBLE); // calculate the force on my particles (interpolation) diff --git a/src/KSPACE/msm_cg.cpp b/src/KSPACE/msm_cg.cpp index 81a1418fc7..3073e9c9dc 100644 --- a/src/KSPACE/msm_cg.cpp +++ b/src/KSPACE/msm_cg.cpp @@ -160,8 +160,8 @@ void MSMCG::compute(int eflag, int vflag) // to fully sum contribution in their 3d grid current_level = 0; - gcall->reverse_comm_kspace(this,1,sizeof(double),REVERSE_RHO, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_RHO,gcall_buf1,gcall_buf2,MPI_DOUBLE); // forward communicate charge density values to fill ghost grid points // compute direct sum interaction and then restrict to coarser grid @@ -169,8 +169,8 @@ void MSMCG::compute(int eflag, int vflag) for (n=0; n<=levels-2; n++) { if (!active_flag[n]) continue; current_level = n; - gc[n]->forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_RHO,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); direct(n); restriction(n); } @@ -182,16 +182,16 @@ void MSMCG::compute(int eflag, int vflag) if (domain->nonperiodic) { current_level = levels-1; gc[levels-1]-> - forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_RHO,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); direct_top(levels-1); gc[levels-1]-> - reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_AD,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); if (vflag_atom) gc[levels-1]-> - reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); } else { // Here using MPI_Allreduce is cheaper than using commgrid @@ -201,8 +201,8 @@ void MSMCG::compute(int eflag, int vflag) current_level = levels-1; if (vflag_atom) gc[levels-1]-> - reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); + reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE); } } @@ -214,28 +214,28 @@ void MSMCG::compute(int eflag, int vflag) prolongation(n); current_level = n; - gc[n]->reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->reverse_comm(GridComm::KSPACE,this,1,sizeof(double), + REVERSE_AD,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); // extra per-atom virial communication if (vflag_atom) - gc[n]->reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM, - gc_buf1[n],gc_buf2[n],MPI_DOUBLE); + gc[n]->reverse_comm(GridComm::KSPACE,this,6,sizeof(double), + REVERSE_AD_PERATOM,gc_buf1[n],gc_buf2[n],MPI_DOUBLE); } // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks current_level = 0; - gcall->forward_comm_kspace(this,1,sizeof(double),FORWARD_AD, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->forward_comm(GridComm::KSPACE,this,1,sizeof(double), + FORWARD_AD,gcall_buf1,gcall_buf2,MPI_DOUBLE); // extra per-atom energy/virial communication if (vflag_atom) - gcall->forward_comm_kspace(this,6,sizeof(double),FORWARD_AD_PERATOM, - gcall_buf1,gcall_buf2,MPI_DOUBLE); + gcall->forward_comm(GridComm::KSPACE,this,6,sizeof(double), + FORWARD_AD_PERATOM,gcall_buf1,gcall_buf2,MPI_DOUBLE); // calculate the force on my particles (interpolation) diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 0415631a4c..b4fc5d87ce 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -638,8 +638,8 @@ void PPPM::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(); // compute potential gradient on my FFT grid and @@ -653,21 +653,21 @@ void PPPM::compute(int eflag, int vflag) // to fill ghost cells surrounding their 3d bricks if (differentiation_flag == 1) - gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else - gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) { if (differentiation_flag == 1 && vflag_atom) - gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else if (differentiation_flag == 0) - gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); } // calculate the force on my particles @@ -3141,8 +3141,8 @@ void PPPM::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag) density_brick = density_A_brick; density_fft = density_A_fft; - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(); // group B @@ -3150,8 +3150,8 @@ void PPPM::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag) density_brick = density_B_brick; density_fft = density_B_fft; - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(); // switch back pointers diff --git a/src/KSPACE/pppm_cg.cpp b/src/KSPACE/pppm_cg.cpp index 825547e573..077eb9f3f4 100644 --- a/src/KSPACE/pppm_cg.cpp +++ b/src/KSPACE/pppm_cg.cpp @@ -177,8 +177,8 @@ void PPPMCG::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(); // compute potential gradient on my FFT grid and @@ -192,21 +192,21 @@ void PPPMCG::compute(int eflag, int vflag) // to fill ghost cells surrounding their 3d bricks if (differentiation_flag == 1) - gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else - gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) { if (differentiation_flag == 1 && vflag_atom) - gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else if (differentiation_flag == 0) - gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); } // calculate the force on my particles diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index a730d8214b..c2e6eca585 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -443,8 +443,8 @@ void PPPMDipole::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc_dipole->reverse_comm_kspace(this,3,sizeof(FFT_SCALAR),REVERSE_MU, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->reverse_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + REVERSE_MU,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft_dipole(); // compute potential gradient on my FFT grid and @@ -457,14 +457,14 @@ void PPPMDipole::compute(int eflag, int vflag) // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - gc_dipole->forward_comm_kspace(this,9,sizeof(FFT_SCALAR),FORWARD_MU, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->forward_comm(GridComm::KSPACE,this,9,sizeof(FFT_SCALAR), + FORWARD_MU,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) - gc_dipole->forward_comm_kspace(this,18,sizeof(FFT_SCALAR),FORWARD_MU_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->forward_comm(GridComm::KSPACE,this,18,sizeof(FFT_SCALAR), + FORWARD_MU_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // calculate the force on my particles diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index bff33bc3eb..1692ae3ed7 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -299,8 +299,8 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc_dipole->reverse_comm_kspace(this,3,sizeof(FFT_SCALAR),REVERSE_MU, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->reverse_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + REVERSE_MU,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft_dipole(); // compute potential gradient on my FFT grid and @@ -313,14 +313,14 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - gc_dipole->forward_comm_kspace(this,9,sizeof(FFT_SCALAR),FORWARD_MU, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc_dipole->forward_comm(GridComm::KSPACE,this,9,sizeof(FFT_SCALAR), + FORWARD_MU,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) - gc->forward_comm_kspace(this,18,sizeof(FFT_SCALAR),FORWARD_MU_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,18,sizeof(FFT_SCALAR), + FORWARD_MU_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // calculate the force on my particles diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index f7c97b1f87..785ac9c131 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -930,8 +930,8 @@ void PPPMDisp::compute(int eflag, int vflag) make_rho_c(); - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(nxlo_in,nylo_in,nzlo_in,nxhi_in,nyhi_in,nzhi_in, density_brick,density_fft,work1,remap); @@ -945,14 +945,14 @@ void PPPMDisp::compute(int eflag, int vflag) virial_1,vg,vg2, u_brick,v0_brick,v1_brick,v2_brick,v3_brick,v4_brick,v5_brick); - gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR); fieldforce_c_ad(); if (vflag_atom) - gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); } else { poisson_ik(work1,work2,density_fft,fft1,fft2, @@ -964,14 +964,14 @@ void PPPMDisp::compute(int eflag, int vflag) vdx_brick,vdy_brick,vdz_brick,virial_1,vg,vg2, u_brick,v0_brick,v1_brick,v2_brick,v3_brick,v4_brick,v5_brick); - gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR); fieldforce_c_ik(); if (evflag_atom) - gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); } if (evflag_atom) fieldforce_c_peratom(); @@ -988,8 +988,8 @@ void PPPMDisp::compute(int eflag, int vflag) make_rho_g(); - gc6->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO_GEOM, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); brick2fft(nxlo_in_6,nylo_in_6,nzlo_in_6,nxhi_in_6,nyhi_in_6,nzhi_in_6, density_brick_g,density_fft_g,work1_6,remap_6); @@ -1004,14 +1004,14 @@ void PPPMDisp::compute(int eflag, int vflag) u_brick_g,v0_brick_g,v1_brick_g,v2_brick_g, v3_brick_g,v4_brick_g,v5_brick_g); - gc6->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD_GEOM, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + FORWARD_AD_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_g_ad(); if (vflag_atom) - gc6->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_GEOM, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } else { poisson_ik(work1_6,work2_6,density_fft_g,fft1_6,fft2_6, @@ -1024,14 +1024,14 @@ void PPPMDisp::compute(int eflag, int vflag) u_brick_g,v0_brick_g,v1_brick_g,v2_brick_g, v3_brick_g,v4_brick_g,v5_brick_g); - gc6->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK_GEOM, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + FORWARD_IK_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_g_ik(); if (evflag_atom) - gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_GEOM, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } if (evflag_atom) fieldforce_g_peratom(); @@ -1048,8 +1048,8 @@ void PPPMDisp::compute(int eflag, int vflag) make_rho_a(); - gc6->reverse_comm_kspace(this,7,sizeof(FFT_SCALAR),REVERSE_RHO_ARITH, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->reverse_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + REVERSE_RHO_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); brick2fft_a(); @@ -1078,14 +1078,14 @@ void PPPMDisp::compute(int eflag, int vflag) u_brick_a4,v0_brick_a4,v1_brick_a4,v2_brick_a4, v3_brick_a4,v4_brick_a4,v5_brick_a4); - gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_AD_ARITH, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_AD_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_a_ad(); if (evflag_atom) - gc6->forward_comm_kspace(this,42,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_ARITH, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,42,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } else { poisson_ik(work1_6,work2_6,density_fft_a3,fft1_6,fft2_6, @@ -1119,14 +1119,14 @@ void PPPMDisp::compute(int eflag, int vflag) u_brick_a4,v0_brick_a4,v1_brick_a4,v2_brick_a4, v3_brick_a4,v4_brick_a4,v5_brick_a4); - gc6->forward_comm_kspace(this,21,sizeof(FFT_SCALAR),FORWARD_IK_ARITH, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,21,sizeof(FFT_SCALAR), + FORWARD_IK_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_a_ik(); if (evflag_atom) - gc6->forward_comm_kspace(this,49,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_ARITH, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,49,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } if (evflag_atom) fieldforce_a_peratom(); @@ -1143,8 +1143,8 @@ void PPPMDisp::compute(int eflag, int vflag) make_rho_none(); - gc6->reverse_comm_kspace(this,nsplit_alloc,sizeof(FFT_SCALAR),REVERSE_RHO_NONE, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->reverse_comm(GridComm::KSPACE,this,nsplit_alloc,sizeof(FFT_SCALAR), + REVERSE_RHO_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); brick2fft_none(); @@ -1158,16 +1158,14 @@ void PPPMDisp::compute(int eflag, int vflag) n += 2; } - gc6->forward_comm_kspace(this,1*nsplit_alloc,sizeof(FFT_SCALAR), - FORWARD_AD_NONE, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,1*nsplit_alloc,sizeof(FFT_SCALAR), + FORWARD_AD_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_none_ad(); if (vflag_atom) - gc6->forward_comm_kspace(this,6*nsplit_alloc,sizeof(FFT_SCALAR), - FORWARD_AD_PERATOM_NONE, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,6*nsplit_alloc,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } else { int n = 0; @@ -1180,16 +1178,14 @@ void PPPMDisp::compute(int eflag, int vflag) n += 2; } - gc6->forward_comm_kspace(this,3*nsplit_alloc,sizeof(FFT_SCALAR), - FORWARD_IK_NONE, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,3*nsplit_alloc,sizeof(FFT_SCALAR), + FORWARD_IK_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); fieldforce_none_ik(); if (evflag_atom) - gc6->forward_comm_kspace(this,7*nsplit_alloc,sizeof(FFT_SCALAR), - FORWARD_IK_PERATOM_NONE, - gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); + gc6->forward_comm(GridComm::KSPACE,this,7*nsplit_alloc,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR); } if (evflag_atom) fieldforce_none_peratom(); diff --git a/src/KSPACE/pppm_stagger.cpp b/src/KSPACE/pppm_stagger.cpp index 49cefac12e..35aec73169 100644 --- a/src/KSPACE/pppm_stagger.cpp +++ b/src/KSPACE/pppm_stagger.cpp @@ -157,8 +157,8 @@ void PPPMStagger::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR); brick2fft(); // compute potential gradient on my FFT grid and @@ -172,21 +172,21 @@ void PPPMStagger::compute(int eflag, int vflag) // to fill ghost cells surrounding their 3d bricks if (differentiation_flag == 1) - gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR), + FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else - gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR), + FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR); // extra per-atom energy/virial communication if (evflag_atom) { if (differentiation_flag == 1 && vflag_atom) - gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR), + FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); else if (differentiation_flag == 0) - gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM, - gc_buf1,gc_buf2,MPI_FFT_SCALAR); + gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR), + FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR); } // calculate the force on my particles diff --git a/src/gridcomm.cpp b/src/gridcomm.cpp index 1edba6c768..fc6d8296d8 100644 --- a/src/gridcomm.cpp +++ b/src/gridcomm.cpp @@ -24,7 +24,6 @@ using namespace LAMMPS_NS; enum{REGULAR,TILED}; -enum{KSPACE,FIX}; #define DELTA 16 @@ -937,17 +936,17 @@ void GridComm::forward_comm(int caller, void *ptr, int nper, int nbyte, int whic { if (layout == REGULAR) { if (caller == KSPACE) - forward_comm_regular((KSpace *)ptr,nper,nbyte,which, + forward_comm_regular((KSpace *) ptr,nper,nbyte,which, buf1,buf2,datatype); else if (caller == FIX) - forward_comm_regular((Fix *)ptr,nper,nbyte,which, + forward_comm_regular((Fix *) ptr,nper,nbyte,which, buf1,buf2,datatype); } else { if (caller == KSPACE) - forward_comm_tiled((KSpace *)ptr,nper,nbyte,which, + forward_comm_tiled((KSpace *) ptr,nper,nbyte,which, buf1,buf2,datatype); else if (caller == FIX) - forward_comm_tiled((Fix *)ptr,nper,nbyte, + forward_comm_tiled((Fix *) ptr,nper,nbyte, which,buf1,buf2,datatype); } } @@ -1036,17 +1035,17 @@ void GridComm::reverse_comm(int caller, void *ptr, int nper, int nbyte, int whic { if (layout == REGULAR) { if (caller == KSPACE) - reverse_comm_regular((KSpace *)ptr,nper,nbyte,which, + reverse_comm_regular((KSpace *) ptr,nper,nbyte,which, buf1,buf2,datatype); else if (caller == FIX) - reverse_comm_regular((Fix *)ptr,nper,nbyte,which, + reverse_comm_regular((Fix *) ptr,nper,nbyte,which, buf1,buf2,datatype); } else { if (caller == KSPACE) - reverse_comm_tiled((KSpace *)ptr,nper,nbyte,which, + reverse_comm_tiled((KSpace *) ptr,nper,nbyte,which, buf1,buf2,datatype); else if (caller == FIX) - reverse_comm_tiled((Fix *)ptr,nper,nbyte,which, + reverse_comm_tiled((Fix *) ptr,nper,nbyte,which, buf1,buf2,datatype); } } diff --git a/src/gridcomm.h b/src/gridcomm.h index 4446724dc4..86f2c30297 100644 --- a/src/gridcomm.h +++ b/src/gridcomm.h @@ -20,6 +20,8 @@ namespace LAMMPS_NS { class GridComm : protected Pointers { public: + enum { KSPACE = 0, FIX = 1}; // calling classes + GridComm(class LAMMPS *, MPI_Comm, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int); GridComm(class LAMMPS *, MPI_Comm, int, int, int, int, int, int, int, int, int, int, int, int, From ad5cc694dcba428c660a0a514abd0a2614488824 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 15:18:18 -0400 Subject: [PATCH 034/437] correctly check for and enable/disable dipole and dispersion support --- src/DIPOLE/pair_lj_long_dipole_long.cpp | 34 +++++++++++-------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/DIPOLE/pair_lj_long_dipole_long.cpp b/src/DIPOLE/pair_lj_long_dipole_long.cpp index 8530cc3e95..13395f9ab3 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_long_dipole_long.cpp @@ -67,7 +67,7 @@ void PairLJLongDipoleLong::options(char **arg, int order) for (i=0; option[i]&&strcmp(arg[0], option[i]); ++i); switch (i) { case 0: ewald_order |= 1<all(FLERR,"Illegal pair_style lj/long/dipole/long command"); } @@ -77,23 +77,25 @@ void PairLJLongDipoleLong::settings(int narg, char **arg) { if (narg != 3 && narg != 4) error->all(FLERR,"Illegal pair_style command"); - ewald_off = 0; ewald_order = 0; + ewald_off = 0; + options(arg, 6); options(++arg, 3); options(arg, 1); + if (!comm->me && ewald_order&(1<<6)) error->warning(FLERR,"Geometric mixing assumed for 1/r^6 coefficients"); if (!comm->me && ewald_order==((1<<3)|(1<<6))) - error->warning(FLERR, - "Using largest cut-off for lj/long/dipole/long long long"); + error->warning(FLERR,"Using largest cut-off for lj/long/dipole/long long long"); if (!*(++arg)) - error->all(FLERR,"Cut-offs missing in pair_style lj/long/dipole/long"); + error->all(FLERR,"Cutoffs missing in pair_style lj/long/dipole/long"); + if (!((ewald_order^ewald_off) & (1<<6))) + dispersionflag = 0; if (!((ewald_order^ewald_off)&(1<<3))) - error->all(FLERR, - "Coulombic cut not supported in pair_style lj/long/dipole/long"); + error->all(FLERR,"Coulombic cut not supported in pair_style lj/long/dipole/long"); cut_lj_global = utils::numeric(FLERR,*(arg++),false,lmp); - if (narg == 4 && (ewald_order==74)) + if (narg == 4 && (ewald_order==0x4a)) error->all(FLERR,"Only one cut-off allowed when requesting all long"); if (narg == 4) cut_coul = utils::numeric(FLERR,*(arg++),false,lmp); else cut_coul = cut_lj_global; @@ -222,10 +224,6 @@ void PairLJLongDipoleLong::coeff(int narg, char **arg) void PairLJLongDipoleLong::init_style() { - const char *style3[] = {"ewald/disp", nullptr}; - const char *style6[] = {"ewald/disp", nullptr}; - int i; - if (strcmp(update->unit_style,"electron") == 0) error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); @@ -233,7 +231,7 @@ void PairLJLongDipoleLong::init_style() if (!atom->q_flag && (ewald_order&(1<<1))) error->all(FLERR, - "Invoking coulombic in pair style lj/long/dipole/long requires atom attribute q"); + "Invoking coulombic in pair style lj/long/dipole/long requires atom attribute q"); if (!atom->mu_flag || !atom->torque_flag) error->all(FLERR,"Pair lj/long/dipole/long requires atom attributes mu, torque"); @@ -246,16 +244,14 @@ void PairLJLongDipoleLong::init_style() if (ewald_order&(1<<3)) { // r^-1 kspace if (force->kspace == nullptr) error->all(FLERR,"Pair style requires a KSpace style"); - for (i=0; style3[i]&&strcmp(force->kspace_style, style3[i]); ++i); - if (!style3[i]) - error->all(FLERR,"Pair style requires use of kspace_style ewald/disp"); + if (!force->kspace->dipoleflag) + error->all(FLERR,"Pair style requires use of kspace_style with dipole support"); } if (ewald_order&(1<<6)) { // r^-6 kspace if (force->kspace == nullptr) error->all(FLERR,"Pair style requires a KSpace style"); - for (i=0; style6[i]&&strcmp(force->kspace_style, style6[i]); ++i); - if (!style6[i]) - error->all(FLERR,"Pair style requires use of kspace_style ewald/disp"); + if (!force->kspace->dispersionflag) + error->all(FLERR,"Pair style requires use of kspace_style with dispersion support"); } if (force->kspace) g_ewald = force->kspace->g_ewald; } From 2afa00ae66647e2d0a6c526ee81581c8d93e76f7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 15:18:28 -0400 Subject: [PATCH 035/437] pretty --- src/KSPACE/ewald_disp.cpp | 3 +-- src/KSPACE/pair_lj_long_coul_long.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/KSPACE/ewald_disp.cpp b/src/KSPACE/ewald_disp.cpp index 0535061bb7..670da1610d 100644 --- a/src/KSPACE/ewald_disp.cpp +++ b/src/KSPACE/ewald_disp.cpp @@ -174,8 +174,7 @@ void EwaldDisp::init() case 6: if (ewald_mix==Pair::GEOMETRIC) { k = 1; break; } else if (ewald_mix==Pair::ARITHMETIC) { k = 2; break; } - error->all(FLERR, - "Unsupported mixing rule in kspace_style ewald/disp"); + error->all(FLERR,"Unsupported mixing rule in kspace_style ewald/disp"); break; default: error->all(FLERR,"Unsupported order in kspace_style ewald/disp"); diff --git a/src/KSPACE/pair_lj_long_coul_long.cpp b/src/KSPACE/pair_lj_long_coul_long.cpp index 01698bb43d..afd880a27b 100644 --- a/src/KSPACE/pair_lj_long_coul_long.cpp +++ b/src/KSPACE/pair_lj_long_coul_long.cpp @@ -96,8 +96,7 @@ void PairLJLongCoulLong::settings(int narg, char **arg) if (!((ewald_order^ewald_off) & (1<<6))) dispersionflag = 0; if (!((ewald_order^ewald_off) & (1<<1))) - error->all(FLERR, - "Coulomb cut not supported in pair_style lj/long/coul/long"); + error->all(FLERR,"Coulomb cut not supported in pair_style lj/long/coul/long"); cut_lj_global = utils::numeric(FLERR,*(arg++),false,lmp); if (narg == 4 && ((ewald_order & 0x42) == 0x42)) error->all(FLERR,"Only one cutoff allowed when requesting all long"); From 3083e6f4cbd51e0baa980e218b4cffb80ffd07d3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 15:53:52 -0400 Subject: [PATCH 036/437] make ewald/disp/dipole an alias for ewald/disp for more obvious choices for users --- doc/src/Commands_kspace.rst | 1 + doc/src/kspace_style.rst | 10 ++++++++-- src/KSPACE/ewald_disp.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/src/Commands_kspace.rst b/doc/src/Commands_kspace.rst index 553bfc845f..2057854f0b 100644 --- a/doc/src/Commands_kspace.rst +++ b/doc/src/Commands_kspace.rst @@ -24,6 +24,7 @@ OPT. * :doc:`ewald (o) ` * :doc:`ewald/disp ` + * :doc:`ewald/disp/dipole ` * :doc:`ewald/dipole ` * :doc:`ewald/dipole/spin ` * :doc:`msm (o) ` diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index 055f0b02b2..be854581ed 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -2,6 +2,7 @@ .. index:: kspace_style ewald/dipole .. index:: kspace_style ewald/dipole/spin .. index:: kspace_style ewald/disp +.. index:: kspace_style ewald/disp/dipole .. index:: kspace_style ewald/omp .. index:: kspace_style pppm .. index:: kspace_style pppm/kk @@ -39,7 +40,7 @@ Syntax kspace_style style value -* style = *none* or *ewald* or *ewald/dipole* or *ewald/dipole/spin* or *ewald/disp* or *ewald/omp* or *pppm* or *pppm/cg* or *pppm/disp* or *pppm/tip4p* or *pppm/stagger* or *pppm/disp/tip4p* or *pppm/gpu* or *pppm/intel* or *pppm/disp/intel* or *pppm/kk* or *pppm/omp* or *pppm/cg/omp* or *pppm/disp/tip4p/omp* or *pppm/tip4p/omp* or *pppm/dielectic* or *pppm/disp/dielectric* or *msm* or *msm/cg* or *msm/omp* or *msm/cg/omp* or *msm/dielectric* or *scafacos* +* style = *none* or *ewald* or *ewald/dipole* or *ewald/dipole/spin* or *ewald/disp* or *ewald/disp/dipole* or *ewald/omp* or *pppm* or *pppm/cg* or *pppm/disp* or *pppm/tip4p* or *pppm/stagger* or *pppm/disp/tip4p* or *pppm/gpu* or *pppm/intel* or *pppm/disp/intel* or *pppm/kk* or *pppm/omp* or *pppm/cg/omp* or *pppm/disp/tip4p/omp* or *pppm/tip4p/omp* or *pppm/dielectic* or *pppm/disp/dielectric* or *msm* or *msm/cg* or *msm/omp* or *msm/cg/omp* or *msm/dielectric* or *scafacos* .. parsed-literal:: @@ -52,6 +53,8 @@ Syntax accuracy = desired relative error in forces *ewald/disp* value = accuracy accuracy = desired relative error in forces + *ewald/disp/dipole* value = accuracy + accuracy = desired relative error in forces *ewald/omp* value = accuracy accuracy = desired relative error in forces *pppm* value = accuracy @@ -156,6 +159,8 @@ matching keyword to the name of the KSpace style, as in this table: +----------------------+-----------------------+ | tip4p/long | tip4p | +----------------------+-----------------------+ +| dipole/long | dipole | ++----------------------+-----------------------+ ---------- @@ -168,7 +173,8 @@ The *ewald/disp* style adds a long-range dispersion sum option for but in a more efficient manner than the *ewald* style. The :math:`1/r^6` capability means that Lennard-Jones or Buckingham potentials can be used without a cutoff, i.e. they become full long-range potentials. -The *ewald/disp* style can also be used with point-dipoles, see + +The *ewald/disp/dipole* style can also be used with point-dipoles, see :ref:`(Toukmaji) `. The *ewald/dipole* style adds long-range standard Ewald summations diff --git a/src/KSPACE/ewald_disp.h b/src/KSPACE/ewald_disp.h index 11fd019718..760baa726d 100644 --- a/src/KSPACE/ewald_disp.h +++ b/src/KSPACE/ewald_disp.h @@ -14,6 +14,7 @@ #ifdef KSPACE_CLASS // clang-format off KSpaceStyle(ewald/disp,EwaldDisp); +KSpaceStyle(ewald/disp/dipole,EwaldDisp); // clang-format on #else From 09b0809d75f135a633be75bb0556761425b55268 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 19:18:21 -0400 Subject: [PATCH 037/437] add template files for testing dipolar pair styles and kspace styles --- unittest/force-styles/CMakeLists.txt | 2 +- unittest/force-styles/tests/data.dipole | 223 +++++++++++++++++++++++ unittest/force-styles/tests/data.fourmol | 58 +++--- unittest/force-styles/tests/in.dipole | 30 +++ 4 files changed, 283 insertions(+), 30 deletions(-) create mode 100644 unittest/force-styles/tests/data.dipole create mode 100644 unittest/force-styles/tests/in.dipole diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 8e84e10c62..fba632d3ec 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -53,7 +53,7 @@ if(FFT_SINGLE) target_compile_definitions(test_pair_style PRIVATE -DFFT_SINGLE) endif() -# tests for a molecular systems and related pair styles +# tests for molecular systems and related pair styles file(GLOB MOL_PAIR_TESTS LIST_DIRECTORIES false ${TEST_INPUT_FOLDER}/mol-pair-*.yaml) # cannot test MSM with single precision data if(FFT_SINGLE) diff --git a/unittest/force-styles/tests/data.dipole b/unittest/force-styles/tests/data.dipole new file mode 100644 index 0000000000..5d86c32a75 --- /dev/null +++ b/unittest/force-styles/tests/data.dipole @@ -0,0 +1,223 @@ +LAMMPS data file via write_data, version 5 May 2020, timestep = 0 + +29 atoms +5 atom types +24 bonds +5 bond types +30 angles +4 angle types +31 dihedrals +5 dihedral types +2 impropers +2 improper types + + -6.024572 8.975428 xlo xhi + -7.692866 7.307134 ylo yhi + -8.086924 6.913076 zlo zhi + +Masses + +1 12.0107 +2 4.00794 +3 14.0067 +4 15.9994 +5 15.9994 + +Pair Coeffs # zero + +1 +2 +3 +4 +5 + +Bond Coeffs # zero + +1 1.5 +2 1.1 +3 1.3 +4 1.2 +5 1 + +Angle Coeffs # zero + +1 110.1 +2 111 +3 120 +4 108.5 + +Dihedral Coeffs # zero + +1 +2 +3 +4 +5 + +Improper Coeffs # zero + +1 +2 + +Atoms + +10 1 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 2 7.0000000000000007e-02 12.0107 0.23873241463784300365 1.0 0.0 0.0 +11 2 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 +12 1 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 2 -2.7000000000000002e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 +13 2 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 +14 2 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 + 2 2 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 1 3.1000000000000000e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 + 3 1 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 1 -2.0000000000000000e-02 12.0107 0.23873241463784300365 1.0 0.0 0.0 + 4 2 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 1 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 + 6 1 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 1 5.1000000000000001e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 + 7 4 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 1 -5.1000000000000001e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 +19 2 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 3 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +15 2 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 +18 4 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 3 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 +20 2 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 3 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 + 8 3 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 2 -4.6999999999999997e-01 14.0067 0.23873241463784300365 1.0 0.0 0.0 + 9 2 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 2 3.1000000000000000e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +16 1 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 2 5.1000000000000001e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 +17 4 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 2 -5.1000000000000001e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 + 1 3 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 1 -4.6999999999999997e-01 14.0067 0.23873241463784300365 1.0 0.0 0.0 + 5 2 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 1 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 +21 5 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 4 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 +22 2 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 4 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +23 2 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 4 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +24 5 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 5 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 +25 2 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 5 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +26 2 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 5 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +27 5 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 6 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 +28 2 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 6 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +29 2 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 6 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 + +Velocities + + 1 7.7867804888392077e-04 5.8970331623292821e-04 -2.2179517633030531e-04 0.0 0.0 0.0 + 2 2.7129529964126462e-03 4.6286427111164284e-03 3.5805549693846352e-03 0.0 0.0 0.0 + 3 -1.2736791029204805e-03 1.6108674226414498e-03 -3.3618185901550799e-04 0.0 0.0 0.0 + 4 -9.2828595122009308e-04 -1.2537885319521818e-03 -4.1204974953432108e-03 0.0 0.0 0.0 + 5 -1.1800848061603740e-03 7.5424401975844038e-04 6.9023177964912290e-05 0.0 0.0 0.0 + 6 -3.0914004879905335e-04 1.2755385764678133e-03 7.9574303350202582e-04 0.0 0.0 0.0 + 7 -1.1037894966874103e-04 -7.6764845099077425e-04 -7.7217630460203659e-04 0.0 0.0 0.0 + 8 3.9060281273221989e-04 -8.1444231918053418e-04 1.5134641148324972e-04 0.0 0.0 0.0 + 9 1.2475530960659720e-03 -2.6608454451432528e-03 1.1117602907112732e-03 0.0 0.0 0.0 +10 4.5008983776042893e-04 4.9530197647538077e-04 -2.3336234361093645e-04 0.0 0.0 0.0 +11 -3.6977669078869707e-04 -1.5289071951960539e-03 -2.9176389881837113e-03 0.0 0.0 0.0 +12 1.0850834530183159e-03 -6.4965897903201833e-04 -1.2971152622619948e-03 0.0 0.0 0.0 +13 4.0754559196230639e-03 3.5043502394946119e-03 -7.8324487687854666e-04 0.0 0.0 0.0 +14 -1.3837220448746613e-04 -4.0656048637594394e-03 -3.9333461173944500e-03 0.0 0.0 0.0 +15 -4.3301707382721859e-03 -3.1802661664634938e-03 3.2037919043360571e-03 0.0 0.0 0.0 +16 -9.6715751018414326e-05 -5.0016572678960377e-04 1.4945658875149626e-03 0.0 0.0 0.0 +17 6.5692180538157174e-04 3.6635779995305095e-04 8.3495414466050911e-04 0.0 0.0 0.0 +18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 0.0 0.0 0.0 +19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 0.0 0.0 0.0 +20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 0.0 0.0 0.0 +21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 0.0 0.0 0.0 +22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 0.0 0.0 0.0 +23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 0.0 0.0 0.0 +24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 0.0 0.0 0.0 +25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 0.0 0.0 0.0 +26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 0.0 0.0 0.0 +27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 0.0 0.0 0.0 +28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 0.0 0.0 0.0 +29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 0.0 0.0 0.0 + +Bonds + +1 5 1 2 +2 3 1 3 +3 2 3 4 +4 2 3 5 +5 1 3 6 +6 3 6 8 +7 4 6 7 +8 5 8 9 +9 3 8 10 +10 2 10 11 +11 1 10 12 +12 1 10 16 +13 2 12 13 +14 2 12 14 +15 2 12 15 +16 4 16 17 +17 5 18 19 +18 5 18 20 +19 5 21 22 +20 5 21 23 +21 5 24 25 +22 5 24 26 +23 5 27 28 +24 5 27 29 + +Angles + +1 4 2 1 3 +2 4 1 3 5 +3 4 1 3 4 +4 4 1 3 6 +5 4 4 3 5 +6 2 5 3 6 +7 2 4 3 6 +8 3 3 6 7 +9 3 3 6 8 +10 3 7 6 8 +11 2 6 8 9 +12 2 9 8 10 +13 3 6 8 10 +14 2 8 10 11 +15 3 8 10 16 +16 2 11 10 12 +17 1 12 10 16 +18 1 8 10 12 +19 2 11 10 16 +20 2 10 12 15 +21 2 10 12 14 +22 2 10 12 13 +23 4 13 12 15 +24 4 13 12 14 +25 4 14 12 15 +26 4 10 16 17 +27 1 19 18 20 +28 1 22 21 23 +29 1 25 24 26 +30 1 28 27 29 + +Dihedrals + +1 2 2 1 3 6 +2 2 2 1 3 4 +3 3 2 1 3 5 +4 1 1 3 6 8 +5 1 1 3 6 7 +6 5 4 3 6 8 +7 5 4 3 6 7 +8 5 5 3 6 8 +9 5 5 3 6 7 +10 4 3 6 8 9 +11 3 3 6 8 10 +12 3 7 6 8 9 +13 4 7 6 8 10 +14 2 6 8 10 12 +15 2 6 8 10 16 +16 2 6 8 10 11 +17 2 9 8 10 12 +18 4 9 8 10 16 +19 5 9 8 10 11 +20 5 8 10 12 13 +21 1 8 10 12 14 +22 5 8 10 12 15 +23 4 8 10 16 17 +24 5 11 10 12 13 +25 5 11 10 12 14 +26 5 11 10 12 15 +27 2 11 10 16 17 +28 2 12 10 16 17 +29 5 16 10 12 13 +30 5 16 10 12 14 +31 5 16 10 12 15 + +Impropers + +1 1 6 3 8 7 +2 2 8 6 10 9 diff --git a/unittest/force-styles/tests/data.fourmol b/unittest/force-styles/tests/data.fourmol index 1415230e9c..70dc685895 100644 --- a/unittest/force-styles/tests/data.fourmol +++ b/unittest/force-styles/tests/data.fourmol @@ -61,35 +61,35 @@ Improper Coeffs # zero Atoms # full -10 2 1 7.0000000000000007e-02 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 0 0 0 -11 2 2 8.9999999999999997e-02 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 0 0 0 -12 2 1 -2.7000000000000002e-01 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 0 0 0 -13 2 2 8.9999999999999997e-02 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 0 0 0 -14 2 2 8.9999999999999997e-02 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 0 0 0 -2 1 2 3.1000000000000000e-01 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 0 0 0 -3 1 1 -2.0000000000000000e-02 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 0 0 0 -4 1 2 8.9999999999999997e-02 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 0 0 0 -6 1 1 5.1000000000000001e-01 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 0 0 0 -7 1 4 -5.1000000000000001e-01 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 0 0 0 -19 3 2 4.2359999999999998e-01 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 0 0 0 -15 2 2 8.9999999999999997e-02 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 0 0 0 -18 3 4 -8.4719999999999995e-01 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 0 0 0 -20 3 2 4.2359999999999998e-01 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 0 0 0 -8 2 3 -4.6999999999999997e-01 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 0 0 0 -9 2 2 3.1000000000000000e-01 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 0 0 0 -16 2 1 5.1000000000000001e-01 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 0 0 0 -17 2 4 -5.1000000000000001e-01 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 0 0 0 -1 1 3 -4.6999999999999997e-01 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 0 0 0 -5 1 2 8.9999999999999997e-02 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 0 0 0 -21 4 5 -8.4719999999999995e-01 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 0 0 0 -22 4 2 4.2359999999999998e-01 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 0 0 0 -23 4 2 4.2359999999999998e-01 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 0 0 0 -24 5 5 -8.4719999999999995e-01 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 0 0 0 -25 5 2 4.2359999999999998e-01 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 0 0 0 -26 5 2 4.2359999999999998e-01 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 0 0 0 -27 6 5 -8.4719999999999995e-01 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 0 0 0 -28 6 2 4.2359999999999998e-01 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 0 0 0 -29 6 2 4.2359999999999998e-01 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 0 0 0 +10 2 1 7.0000000000000007e-02 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 0 0 0 +11 2 2 8.9999999999999997e-02 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 0 0 0 +12 2 1 -2.7000000000000002e-01 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 0 0 0 +13 2 2 8.9999999999999997e-02 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 0 0 0 +14 2 2 8.9999999999999997e-02 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 0 0 0 + 2 1 2 3.1000000000000000e-01 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 0 0 0 + 3 1 1 -2.0000000000000000e-02 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 0 0 0 + 4 1 2 8.9999999999999997e-02 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 0 0 0 + 6 1 1 5.1000000000000001e-01 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 0 0 0 + 7 1 4 -5.1000000000000001e-01 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 0 0 0 +19 3 2 4.2359999999999998e-01 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 0 0 0 +15 2 2 8.9999999999999997e-02 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 0 0 0 +18 3 4 -8.4719999999999995e-01 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 0 0 0 +20 3 2 4.2359999999999998e-01 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 0 0 0 + 8 2 3 -4.6999999999999997e-01 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 0 0 0 + 9 2 2 3.1000000000000000e-01 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 0 0 0 +16 2 1 5.1000000000000001e-01 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 0 0 0 +17 2 4 -5.1000000000000001e-01 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 0 0 0 + 1 1 3 -4.6999999999999997e-01 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 0 0 0 + 5 1 2 8.9999999999999997e-02 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 0 0 0 +21 4 5 -8.4719999999999995e-01 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 0 0 0 +22 4 2 4.2359999999999998e-01 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 0 0 0 +23 4 2 4.2359999999999998e-01 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 0 0 0 +24 5 5 -8.4719999999999995e-01 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 0 0 0 +25 5 2 4.2359999999999998e-01 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 0 0 0 +26 5 2 4.2359999999999998e-01 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 0 0 0 +27 6 5 -8.4719999999999995e-01 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 0 0 0 +28 6 2 4.2359999999999998e-01 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 0 0 0 +29 6 2 4.2359999999999998e-01 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 0 0 0 Velocities diff --git a/unittest/force-styles/tests/in.dipole b/unittest/force-styles/tests/in.dipole new file mode 100644 index 0000000000..e46567dcb7 --- /dev/null +++ b/unittest/force-styles/tests/in.dipole @@ -0,0 +1,30 @@ +variable newton_pair index on +variable newton_bond index on +variable bond_factor index 0.10 +variable angle_factor index 0.25 +variable dihedral_factor index 0.50 +variable units index real +variable input_dir index . +variable data_file index ${input_dir}/data.dipole +variable pair_style index 'zero 8.0' +variable bond_style index zero +variable angle_style index zero +variable dihedral_style index zero +variable improper_style index zero +variable t_target index 100.0 + +atom_style hybrid full sphere dipole +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.1 +newton ${newton_pair} ${newton_bond} +special_bonds lj/coul ${bond_factor} ${angle_factor} ${dihedral_factor} + +pair_style ${pair_style} +bond_style ${bond_style} +angle_style ${angle_style} +dihedral_style ${dihedral_style} +improper_style ${improper_style} + +read_data ${data_file} From 4032c6da9820ae54a4e268eb83418bd893ad112b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:30:15 -0400 Subject: [PATCH 038/437] fix restart bug --- src/DIPOLE/pair_lj_long_dipole_long.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/DIPOLE/pair_lj_long_dipole_long.cpp b/src/DIPOLE/pair_lj_long_dipole_long.cpp index 13395f9ab3..0d94d7116d 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_long_dipole_long.cpp @@ -367,6 +367,8 @@ void PairLJLongDipoleLong::write_restart_settings(FILE *fp) fwrite(&offset_flag,sizeof(int),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); fwrite(&ewald_order,sizeof(int),1,fp); + fwrite(&ewald_off,sizeof(int),1,fp); + fwrite(&dispersionflag,sizeof(int),1,fp); } /* ---------------------------------------------------------------------- @@ -381,12 +383,16 @@ void PairLJLongDipoleLong::read_restart_settings(FILE *fp) utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error); utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); utils::sfread(FLERR,&ewald_order,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR,&ewald_off,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR,&dispersionflag,sizeof(int),1,fp,nullptr,error); } MPI_Bcast(&cut_lj_global,1,MPI_DOUBLE,0,world); MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); MPI_Bcast(&offset_flag,1,MPI_INT,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); MPI_Bcast(&ewald_order,1,MPI_INT,0,world); + MPI_Bcast(&ewald_off,1,MPI_INT,0,world); + MPI_Bcast(&dispersionflag,1,MPI_INT,0,world); } /* ---------------------------------------------------------------------- From 1c7bf82930ed8a48a26cf06bbaf1d5e8d05a0a2a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:30:38 -0400 Subject: [PATCH 039/437] initialize scale array --- src/DIPOLE/pair_lj_sf_dipole_sf.cpp | 16 ++++++++++------ src/pair_coul_cut.cpp | 12 +++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/DIPOLE/pair_lj_sf_dipole_sf.cpp b/src/DIPOLE/pair_lj_sf_dipole_sf.cpp index be18f50822..7d88513910 100644 --- a/src/DIPOLE/pair_lj_sf_dipole_sf.cpp +++ b/src/DIPOLE/pair_lj_sf_dipole_sf.cpp @@ -19,8 +19,6 @@ #include "pair_lj_sf_dipole_sf.h" -#include -#include #include "atom.h" #include "neighbor.h" #include "neigh_list.h" @@ -28,9 +26,11 @@ #include "force.h" #include "memory.h" #include "error.h" - #include "update.h" +#include +#include + using namespace LAMMPS_NS; static int warn_single = 0; @@ -303,9 +303,13 @@ void PairLJSFDipoleSF::allocate() int n = atom->ntypes; memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + memory->create(scale,n+1,n+1,"pair:scale"); + for (int i = 1; i <= n; i++) { + for (int j = i; j <= n; j++) { setflag[i][j] = 0; + scale[i][j] = 1.0; + } + } memory->create(cutsq,n+1,n+1,"pair:cutsq"); @@ -319,7 +323,6 @@ void PairLJSFDipoleSF::allocate() memory->create(lj2,n+1,n+1,"pair:lj2"); memory->create(lj3,n+1,n+1,"pair:lj3"); memory->create(lj4,n+1,n+1,"pair:lj4"); - memory->create(scale,n+1,n+1,"pair:scale"); } /* ---------------------------------------------------------------------- @@ -639,5 +642,6 @@ void *PairLJSFDipoleSF::extract(const char *str, int &dim) if (strcmp(str,"epsilon") == 0) return (void *) epsilon; if (strcmp(str,"sigma") == 0) return (void *) sigma; if (strcmp(str,"scale") == 0) return (void *) scale; + if (strcmp(str,"cut_coul") == 0) return (void *) cut_coul; return nullptr; } diff --git a/src/pair_coul_cut.cpp b/src/pair_coul_cut.cpp index e07ff41f9c..ea29358174 100644 --- a/src/pair_coul_cut.cpp +++ b/src/pair_coul_cut.cpp @@ -134,14 +134,16 @@ void PairCoulCut::allocate() int n = atom->ntypes; memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + memory->create(scale,n+1,n+1,"pair:scale"); + for (int i = 1; i <= n; i++) { + for (int j = i; j <= n; j++) { setflag[i][j] = 0; + scale[i][j] = 1.0; + } + } memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(scale,n+1,n+1,"pair:scale"); } /* ---------------------------------------------------------------------- @@ -341,7 +343,7 @@ double PairCoulCut::single(int i, int j, int /*itype*/, int /*jtype*/, void *PairCoulCut::extract(const char *str, int &dim) { dim = 2; - if (strcmp(str,"cut_coul") == 0) return (void *) &cut; + if (strcmp(str,"cut_coul") == 0) return (void *) cut; if (strcmp(str,"scale") == 0) return (void *) scale; return nullptr; } From 384330aff27e557959f8e86c0a16e73196f76c50 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:31:02 -0400 Subject: [PATCH 040/437] update/correct extract function --- src/DIPOLE/pair_lj_cut_dipole_cut.cpp | 11 +++++++++++ src/DIPOLE/pair_lj_cut_dipole_cut.h | 1 + src/DIPOLE/pair_lj_cut_dipole_long.cpp | 18 +++++++++--------- src/DIPOLE/pair_lj_cut_dipole_long.h | 2 +- src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp | 2 +- src/pair.cpp | 3 +-- src/pair_lj_cut_coul_cut.cpp | 2 +- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp index e4b9e592eb..0f8a7317c6 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp @@ -485,3 +485,14 @@ void PairLJCutDipoleCut::read_restart_settings(FILE *fp) MPI_Bcast(&offset_flag,1,MPI_INT,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } + +/* ---------------------------------------------------------------------- */ + +void *PairLJCutDipoleCut::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"cut_coul") == 0) return (void *) cut_coul; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + if (strcmp(str,"sigma") == 0) return (void *) sigma; + return nullptr; +} diff --git a/src/DIPOLE/pair_lj_cut_dipole_cut.h b/src/DIPOLE/pair_lj_cut_dipole_cut.h index 11bc49f358..1999e1612e 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_cut.h +++ b/src/DIPOLE/pair_lj_cut_dipole_cut.h @@ -37,6 +37,7 @@ class PairLJCutDipoleCut : public Pair { void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); + void *extract(const char *, int &); protected: double cut_lj_global, cut_coul_global; diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.cpp b/src/DIPOLE/pair_lj_cut_dipole_long.cpp index e286568f31..b13e48b808 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_long.cpp @@ -540,18 +540,18 @@ void PairLJCutDipoleLong::read_restart_settings(FILE *fp) void *PairLJCutDipoleLong::extract(const char *str, int &dim) { - if (strcmp(str,"cut_coul") == 0) { - dim = 0; - return (void *) &cut_coul; - } else if (strcmp(str,"ewald_order") == 0) { + dim = 0; + if (strcmp(str,"cut_coul") == 0) return (void *) &cut_coul; + else if (strcmp(str,"ewald_order") == 0) { ewald_order = 0; ewald_order |= 1<<1; ewald_order |= 1<<3; - dim = 0; return (void *) &ewald_order; - } else if (strcmp(str,"ewald_mix") == 0) { - dim = 0; - return (void *) &mix_flag; - } + } else if (strcmp(str,"ewald_mix") == 0) return (void *) &mix_flag; + + dim = 2; + if (strcmp(str,"epsilon") == 0) return (void *) epsilon; + else if (strcmp(str,"sigma") == 0) return (void *) sigma; + return nullptr; } diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.h b/src/DIPOLE/pair_lj_cut_dipole_long.h index 26ff54f73e..bc9e3571da 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.h +++ b/src/DIPOLE/pair_lj_cut_dipole_long.h @@ -40,6 +40,7 @@ class PairLJCutDipoleLong : public Pair { void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); + void *extract(const char *, int &); protected: double cut_lj_global; @@ -49,7 +50,6 @@ class PairLJCutDipoleLong : public Pair { double **lj1, **lj2, **lj3, **lj4, **offset; double g_ewald; int ewald_order; - virtual void *extract(const char *, int &); void allocate(); }; diff --git a/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp index de5bc7cf92..6c2dd433de 100644 --- a/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp +++ b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp @@ -489,7 +489,7 @@ double PairNMCutCoulCut::single(int i, int j, int itype, int jtype, void *PairNMCutCoulCut::extract(const char *str, int &dim) { dim = 2; - if (strcmp(str,"cut_coul") == 0) return (void *) &cut_coul; + if (strcmp(str,"cut_coul") == 0) return (void *) cut_coul; if (strcmp(str,"e0") == 0) return (void *) e0; if (strcmp(str,"r0") == 0) return (void *) r0; if (strcmp(str,"nn") == 0) return (void *) nn; diff --git a/src/pair.cpp b/src/pair.cpp index 38c7922c17..16979f8023 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -77,8 +77,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) setflag = nullptr; cutsq = nullptr; - ewaldflag = pppmflag = msmflag = dispersionflag = - tip4pflag = dipoleflag = spinflag = 0; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0; reinitflag = 1; centroidstressflag = CENTROID_SAME; diff --git a/src/pair_lj_cut_coul_cut.cpp b/src/pair_lj_cut_coul_cut.cpp index 8fdc47d5f1..4782a96fec 100644 --- a/src/pair_lj_cut_coul_cut.cpp +++ b/src/pair_lj_cut_coul_cut.cpp @@ -465,7 +465,7 @@ double PairLJCutCoulCut::single(int i, int j, int itype, int jtype, void *PairLJCutCoulCut::extract(const char *str, int &dim) { dim = 2; - if (strcmp(str,"cut_coul") == 0) return (void *) &cut_coul; + if (strcmp(str,"cut_coul") == 0) return (void *) cut_coul; if (strcmp(str,"epsilon") == 0) return (void *) epsilon; if (strcmp(str,"sigma") == 0) return (void *) sigma; return nullptr; From 1b72cf01a9a300178829ea8de8abc541b4abb5c8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:31:18 -0400 Subject: [PATCH 041/437] add unit test inputs for pair styles with point dipoles --- .../tests/mol-pair-lj_cut_dipole_cut.yaml | 96 ++++++++++++++++ .../tests/mol-pair-lj_cut_dipole_long.yaml | 104 +++++++++++++++++ .../mol-pair-lj_long_cut_dipole_long.yaml | 101 +++++++++++++++++ .../tests/mol-pair-lj_long_dipole_long.yaml | 107 ++++++++++++++++++ .../tests/mol-pair-lj_sf_dipole_sf.yaml | 96 ++++++++++++++++ 5 files changed, 504 insertions(+) create mode 100644 unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml create mode 100644 unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml create mode 100644 unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml create mode 100644 unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml create mode 100644 unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml new file mode 100644 index 0000000000..d4fc06ba64 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml @@ -0,0 +1,96 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 19:22:50 2021 +epsilon: 2e-13 +skip_tests: +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_modify mix arithmetic +input_file: in.dipole +pair_style: lj/cut/dipole/cut 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! | + epsilon 2 + sigma 2 + cut_coul 2 +natoms: 29 +init_vdwl: 749.2372261744105 +init_coul: -215.46996777645347 +init_stress: ! |2- + 2.6201477421722402e+03 1.7878993283727934e+03 4.2135405703065144e+03 -4.6536224816043256e+02 -7.9729626294548083e+01 6.9790208302160386e+02 +init_forces: ! |2 + 1 -6.5581092166522225e+01 2.8790967101864624e+02 3.0556163752989789e+02 + 2 1.9955296046408944e+02 1.1064549771529568e+02 -2.0125790734414912e+02 + 3 -1.6744118162880952e+02 -3.8376338360683457e+02 -2.9964838924549127e+02 + 4 -1.4682240238095135e+01 -3.8004339269592286e+01 8.1070341235141143e+01 + 5 -6.2874688511845378e+01 -7.3633283028576628e+01 4.7727367282374829e+01 + 6 -7.9556621766240244e+02 8.7830188014660803e+02 1.2035546934848351e+03 + 7 1.0134777271895786e+02 -3.5860327807585202e+02 -1.7447020913752892e+03 + 8 9.7221783816473788e+01 -5.0106384903360045e+01 2.6415488395239208e+02 + 9 1.7665414834784158e+01 1.2626191606389457e+02 3.8334906733439880e+02 + 10 5.8561911471237136e+02 -5.3125644133812534e+02 -1.6629272523434770e+02 + 11 -4.9009451817709930e+01 -2.1456208542340015e+01 -7.0514088309780405e+01 + 12 1.4341511826889621e+02 -1.1687815372779096e+02 2.6997394253161165e+01 + 13 -7.3801132809376895e+01 7.8643634163516467e+01 1.1808429156407279e+01 + 14 -6.1546940173885865e+01 7.5306833231004333e+00 1.6546194983110425e+01 + 15 -3.9667266067375031e+01 3.2220533476805343e+01 8.1440434248102406e+01 + 16 5.0531694076551270e+02 -3.6319735450279410e+02 -1.2090960999385989e+03 + 17 -4.1343115501384796e+02 3.3417023069608859e+02 1.2514132191499448e+03 + 18 3.7676277384630737e+01 -2.8362377908248146e+01 -8.2290015884114837e+01 + 19 -8.2023723738127288e+01 1.0006538535804265e+02 9.5626037410293023e+01 + 20 7.0954555101071264e+01 -3.5627922439241615e+01 -1.0696847475399830e+01 + 21 2.9123476275164890e+01 3.6242807280278111e+00 1.1599497378533388e+02 + 22 -1.6872980439818326e+02 1.4634805992778700e+01 -4.8878571346457221e+01 + 23 1.7807079056360166e+02 -4.5496210146873519e+00 -5.3780304803625910e+01 + 24 -3.2441431343135569e+01 -2.0170145101120073e+02 -7.9942827082079063e+01 + 25 -1.1847139531919895e+02 3.0848903120387661e+01 1.0566501896756124e+02 + 26 1.8496783031500885e+02 1.8444462021364646e+02 -7.8872189685221281e+00 + 27 -6.1177599339393907e+01 -1.0891181275941133e+02 -6.0417413568062088e+01 + 28 -1.1216903376348023e+02 9.1434568489551147e+00 7.3371950240010179e+01 + 29 1.6768231877082690e+02 1.1760651326226129e+02 -2.8877142437046142e+01 +run_vdwl: 746.2462108249126 +run_coul: -217.0811470535041 +run_stress: ! |2- + 2.6183978655374117e+03 1.7854954987269102e+03 4.1773534305550402e+03 -4.6574369880377157e+02 -8.1181204292614396e+01 6.9724661631292486e+02 +run_forces: ! |2 + 1 -6.2166839556442937e+01 2.8986501154843847e+02 3.0173952160931310e+02 + 2 1.9631694562203893e+02 1.0858596566529263e+02 -1.9726194554267187e+02 + 3 -1.6763176143580696e+02 -3.8374593504399382e+02 -2.9941238716442774e+02 + 4 -1.4709613019625342e+01 -3.7961039104571839e+01 8.0951443391910047e+01 + 5 -6.2760117657627617e+01 -7.3444779063948857e+01 4.7537859095103030e+01 + 6 -7.8996457208465574e+02 8.7198746349093858e+02 1.1869397029835670e+03 + 7 1.0065517595184686e+02 -3.5565911067048978e+02 -1.7240046995776238e+03 + 8 9.3181453115771944e+01 -4.3047624009005197e+01 2.6974219388638261e+02 + 9 1.5186769584941434e+01 1.2362301435212208e+02 3.7436614934823007e+02 + 10 5.8664393856638014e+02 -5.3269905287906545e+02 -1.6724470537443557e+02 + 11 -4.8889381866218557e+01 -2.1274252617657659e+01 -7.0006558800629961e+01 + 12 1.4402217942313882e+02 -1.1655122412105953e+02 2.6591368070904235e+01 + 13 -7.4210536821499772e+01 7.8535220650134519e+01 1.1774917588964787e+01 + 14 -6.0945811011324871e+01 7.6169993474339384e+00 1.6707026675974184e+01 + 15 -4.0152284442013197e+01 3.1918490260565530e+01 8.1441912305574050e+01 + 16 5.0482413279368535e+02 -3.6349119913496349e+02 -1.2086255122037562e+03 + 17 -4.1289147731837835e+02 3.3456330805867543e+02 1.2508733726965099e+03 + 18 3.8424833859036056e+01 -2.8983726749549888e+01 -8.2889605927198545e+01 + 19 -8.1865687463431243e+01 1.0038042325741871e+02 9.6105762836336510e+01 + 20 7.0108251616425932e+01 -3.5322348990136838e+01 -1.0577655711839213e+01 + 21 2.9135323901877978e+01 4.0084924583559314e+00 1.1492805247432594e+02 + 22 -1.6862925376573318e+02 1.4472495296362101e+01 -4.8164826334710632e+01 + 23 1.7793536003794964e+02 -4.7731405425939535e+00 -5.3427031657552149e+01 + 24 -2.9577816968010218e+01 -2.0332154289832820e+02 -7.8528045293575261e+01 + 25 -1.2236095962841648e+02 3.1350722926330402e+01 1.0375474002670626e+02 + 26 1.8598968725807586e+02 1.8554789269657357e+02 -7.3912113601707734e+00 + 27 -5.9963564320050750e+01 -1.0864816769388554e+02 -6.0331964774009975e+01 + 28 -1.1286034653317385e+02 9.2388959748268196e+00 7.3116588451121657e+01 + 29 1.6715597216124019e+02 1.1722874753578131e+02 -2.8704461718321827e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml new file mode 100644 index 0000000000..c39d645961 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml @@ -0,0 +1,104 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 19:22:50 2021 +epsilon: 2.5e-09 +skip_tests: gpu +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/cut/dipole/long + kspace ewald/dipole +pre_commands: ! "" +post_commands: ! | + set atom * charge 0.0 + pair_modify mix arithmetic + pair_modify table 0 + kspace_style ewald/dipole 1.0e-6 + kspace_modify gewald 0.3 + kspace_modify compute no +input_file: in.dipole +pair_style: lj/cut/dipole/long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! | + epsilon 2 + sigma 2 + cut_coul 0 + ewald_order 0 + ewald_mix 0 +natoms: 29 +init_vdwl: 749.2372261744105 +init_coul: -765.7216219373037 +init_stress: ! |2- + 1.9436630368145486e+03 1.4514070555446594e+03 4.1943857214331510e+03 -5.7732497199818658e+02 1.7627899282943837e+01 7.3293055810920964e+02 +init_forces: ! |2 + 1 -6.6325744461630961e+01 3.0037629013182396e+02 2.8298667386589261e+02 + 2 2.2126793666827646e+02 8.7414578011553346e+01 -1.5782367579470306e+02 + 3 -1.3854732166887879e+02 -3.9037869363775172e+02 -2.9815467444165444e+02 + 4 5.5337530341142882e+00 -3.5587014032418274e+01 8.0163319839961460e+01 + 5 -3.0782522782134073e+01 -7.9334931956058696e+01 5.1064735094583277e+01 + 6 -7.9465795411537135e+02 9.3108677871304076e+02 1.2151392855093018e+03 + 7 1.3479057388185871e+02 -3.9285491644478151e+02 -1.7294352228532521e+03 + 8 1.0138432779274672e+02 -8.7854149227322523e+01 2.5840998550337196e+02 + 9 5.2374775022845370e+01 1.6991485760449464e+02 3.6702113722473320e+02 + 10 5.7942396057684232e+02 -5.1773741839622653e+02 -1.6407902891205467e+02 + 11 -4.3342420632187135e+01 -1.4536830515196753e-01 -6.5701263699668090e+01 + 12 1.2437488858014615e+02 -1.2708067053643420e+02 1.5660782314417842e+01 + 13 -1.1541678545405667e+02 9.0266848145725731e+01 1.0812091946949954e+01 + 14 -8.7480812472983658e+01 1.6184547145740286e+01 1.9097990397801627e+01 + 15 -5.4682293939698255e+01 2.3936828459781925e+01 7.3605016968149073e+01 + 16 5.2009690615914690e+02 -3.2886762825465757e+02 -1.2015403510740541e+03 + 17 -4.5637175524544244e+02 3.0302031594173809e+02 1.2418681765632286e+03 + 18 7.0333832268683114e+00 4.0052732323628931e+01 -7.9875170652329700e+01 + 19 -6.4583111418059502e+01 6.9167384752109399e+01 5.6898855482775403e+01 + 20 6.8042950791932441e+01 -9.7875006217217788e+01 2.9905322910753714e+01 + 21 4.8854700567877842e+01 3.6799431021790667e+01 1.3373381517556700e+02 + 22 -1.6352965807148956e+02 1.7011001069339844e+01 -9.9752659826336142e+01 + 23 1.2267890613966252e+02 -4.1203994222104392e+01 -2.2195283929327644e+01 + 24 -3.7399140818029331e+01 -1.6346830325427734e+02 -3.5582213327349939e+00 + 25 -1.3808231643675967e+02 3.4648415027412625e+01 2.1135786203059418e+01 + 26 1.9347932471938313e+02 1.2806726144790011e+02 -2.2502284392610317e+01 + 27 -5.9698734188395122e+00 -7.6688049371318414e+01 -4.3466379984340175e+00 + 28 -1.4540221424093897e+02 3.7391865524266137e+01 2.4336357977303802e+01 + 29 1.6323753801479879e+02 5.3737008535374322e+01 -3.2874858070690287e+01 +run_vdwl: 746.2718524175359 +run_coul: -766.8349504887466 +run_stress: ! |2- + 1.9422849266903772e+03 1.4499928776254378e+03 4.1579119043243772e+03 -5.7660186484953738e+02 1.5778310808464493e+01 7.3231013428757922e+02 +run_forces: ! |2 + 1 -6.3116728997436311e+01 3.0219461207673027e+02 2.7945642554461517e+02 + 2 2.1823670153441185e+02 8.5492899699192421e+01 -1.5416203993873395e+02 + 3 -1.3873821803667016e+02 -3.9036455798049053e+02 -2.9794365908252206e+02 + 4 5.4851656704259373e+00 -3.5559374795504148e+01 8.0074902814023446e+01 + 5 -3.0661596327244666e+01 -7.9166150853713717e+01 5.0895445853048557e+01 + 6 -7.8903772218772826e+02 9.2471773371504594e+02 1.1985249679913393e+03 + 7 1.3417054750196161e+02 -3.8991741033232239e+02 -1.7086821922186305e+03 + 8 9.7330644540156584e+01 -8.0732053466860933e+01 2.6397599804616618e+02 + 9 4.9872446833672825e+01 1.6739712606628419e+02 3.5793214687649453e+02 + 10 5.8047343113404111e+02 -5.1918893040724413e+02 -1.6501718351118546e+02 + 11 -4.3233315287020993e+01 4.8219395895150195e-02 -6.5210618092242868e+01 + 12 1.2504972159099091e+02 -1.2681145615764525e+02 1.5217879430940524e+01 + 13 -1.1589262395465819e+02 9.0144184839471677e+01 1.0780271591852674e+01 + 14 -8.6900421010852114e+01 1.6300621186747282e+01 1.9338330327730862e+01 + 15 -5.5169401385359258e+01 2.3653589419066329e+01 7.3639830012305453e+01 + 16 5.1962480904449421e+02 -3.2916996348824193e+02 -1.2010875200238368e+03 + 17 -4.5587760056968011e+02 3.0332567791707356e+02 1.2413709462068782e+03 + 18 8.0235682517434928e+00 3.9518661500945100e+01 -8.0011439411858660e+01 + 19 -6.4600501252629982e+01 6.9212979380494616e+01 5.7164075209738755e+01 + 20 6.7120044414622129e+01 -9.7394378696639180e+01 2.9761527878860310e+01 + 21 4.8440417347595513e+01 3.6922090422655316e+01 1.3264742205258210e+02 + 22 -1.6338236470125480e+02 1.6776249909866969e+01 -9.8826227614850623e+01 + 23 1.2293682885266210e+02 -4.1087498445113432e+01 -2.2043764582323913e+01 + 24 -3.5111758127072342e+01 -1.6525225787695715e+02 -1.9202235780720216e+00 + 25 -1.4176466306219362e+02 3.5021705876403836e+01 1.9091979788311285e+01 + 26 1.9486095772040414e+02 1.2948463021905852e+02 -2.2088528184565416e+01 + 27 -5.5506450042810798e+00 -7.6677333726027612e+01 -4.5097234567706010e+00 + 28 -1.4575309240271551e+02 3.7357103430616839e+01 2.4333203960870190e+01 + 29 1.6316536786961481e+02 5.3753281171212350e+01 -3.2702233890165388e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml new file mode 100644 index 0000000000..724221b291 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml @@ -0,0 +1,101 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 20:00:29 2021 +epsilon: 2.5e-09 +skip_tests: +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/long/dipole/long + kspace ewald/disp/dipole +pre_commands: ! "" +post_commands: ! | + pair_modify mix arithmetic + pair_modify table 0 + kspace_style ewald/disp/dipole 1.0e-6 + kspace_modify gewald 0.3 + kspace_modify compute no +input_file: in.dipole +pair_style: lj/long/dipole/long cut long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! | + epsilon 2 + sigma 2 + cut_coul 0 +natoms: 29 +init_vdwl: 749.2372261744105 +init_coul: -510.0645577150534 +init_stress: ! |2- + 1.9775205995303602e+03 1.5401122683443116e+03 4.0242099368503768e+03 -4.4187182607529485e+02 -9.4825605825355396e+01 7.1164256744416593e+02 +init_forces: ! |2 + 1 -7.6003373605897039e+01 2.7664303110780685e+02 3.0134186026453369e+02 + 2 2.2866831476513934e+02 1.0470808583484599e+02 -1.9912936151543389e+02 + 3 -1.4483754133996587e+02 -3.8429405958583584e+02 -2.9901476862775820e+02 + 4 1.3935374831423081e+01 -3.6644775830784546e+01 8.3888637572435158e+01 + 5 -3.5439363457232254e+01 -7.2739998197921977e+01 4.6110481295917836e+01 + 6 -7.4157915036285317e+02 8.8448406711774749e+02 1.2098091295808249e+03 + 7 8.6279237300879885e+01 -3.5778180760633592e+02 -1.7363570739437334e+03 + 8 6.5976418873841538e+01 -4.8643696191930168e+01 2.5793073839073116e+02 + 9 4.2497668124943402e+01 1.3070788520628537e+02 3.7830324006697737e+02 + 10 5.8689894201521861e+02 -5.2344991811391242e+02 -1.6697376525148064e+02 + 11 -4.0543166651544091e+01 -1.0758718002496700e+01 -6.5598501291565654e+01 + 12 1.0605006281669685e+02 -1.2015055787633801e+02 2.3647755824690115e+01 + 13 -9.5622291773669801e+01 7.8051492119874155e+01 1.0840728093654999e+01 + 14 -6.6610421769850930e+01 9.4472358237111980e+00 2.3486691113112261e+01 + 15 -5.5064524709467094e+01 2.8321481073714651e+01 8.0274791498111597e+01 + 16 5.2481928319641543e+02 -3.4780982672534094e+02 -1.2134258838092942e+03 + 17 -4.4902027864747055e+02 3.3813246096969442e+02 1.2424893806935199e+03 + 18 -1.5836179618063737e+01 -3.5669546354618284e+01 -8.3210631687445670e+01 + 19 -5.6328976127551243e+01 9.6733628506286507e+01 1.0605968724248876e+02 + 20 7.9896480670685548e+01 -4.7609233962545133e+01 -2.0598227515881544e+00 + 21 -7.3561583498209302e+00 -4.0643789881974843e+00 1.0849215484482751e+02 + 22 -1.5958047288090896e+02 2.1347230251836393e+01 -4.2314270063219311e+01 + 23 1.7353977109742178e+02 1.3431074128504807e+00 -4.9650608960934427e+01 + 24 -7.5733472061382287e+01 -2.0163658479862383e+02 -8.0676295119211048e+01 + 25 -9.7954035204512238e+01 2.5260170328403998e+01 9.5988127630363820e+01 + 26 1.9140129493860326e+02 1.7797509205542670e+02 -1.4675059681103502e+01 + 27 -7.2552065966554537e+01 -9.7071930327475854e+01 -6.8741247089994090e+01 + 28 -9.5686977535954313e+01 2.6049356521912799e+00 7.8594180702461799e+01 + 29 1.8578560143143028e+02 1.1256512910168119e+02 -2.5430295021889062e+01 +run_vdwl: 746.2717632004208 +run_coul: -511.65100924242483 +run_stress: ! |2- + 1.9762013405618991e+03 1.5375515668491785e+03 3.9879670178636779e+03 -4.4243677010745125e+02 -9.6011606577106576e+01 7.1091771589632401e+02 +run_forces: ! |2 + 1 -7.2478585679131498e+01 2.7872806793432318e+02 2.9736357661381140e+02 + 2 2.2529962504230434e+02 1.0251981508302525e+02 -1.9498035412210305e+02 + 3 -1.4501735347066150e+02 -3.8426959234457314e+02 -2.9882271219157508e+02 + 4 1.3876617458543992e+01 -3.6609792259953458e+01 8.3789032506060906e+01 + 5 -3.5316550486718199e+01 -7.2567143445439740e+01 4.5949357432698797e+01 + 6 -7.3601436266182395e+02 8.7822380079047036e+02 1.1931464956802458e+03 + 7 8.5583154065997618e+01 -3.5483967152960344e+02 -1.7156547499611020e+03 + 8 6.1948409647708836e+01 -4.1641832208069538e+01 2.6361965766266354e+02 + 9 4.0042789510313987e+01 1.2807988471764313e+02 3.6924227917296008e+02 + 10 5.8792182268994054e+02 -5.2488215301716320e+02 -1.6790878601963803e+02 + 11 -4.0420231062846966e+01 -1.0581860633114506e+01 -6.5100546999107152e+01 + 12 1.0668593869978415e+02 -1.1984622885151535e+02 2.3238109853124776e+01 + 13 -9.6046249922340181e+01 7.7952711911077870e+01 1.0808129620759990e+01 + 14 -6.5999254432540610e+01 9.5407955998902434e+00 2.3657276736312426e+01 + 15 -5.5531506342868440e+01 2.8029042545127680e+01 8.0284356864842906e+01 + 16 5.2432627377301412e+02 -3.4810209520519425e+02 -1.2129317857506171e+03 + 17 -4.4847603565819435e+02 3.3850758051579493e+02 1.2419304995023560e+03 + 18 -1.5037075809229599e+01 -3.6287994708529588e+01 -8.3833045917740222e+01 + 19 -5.6200349125775993e+01 9.7070350513647767e+01 1.0655212140217252e+02 + 20 7.9028998967302954e+01 -4.7327861918939419e+01 -1.9347032673888207e+00 + 21 -7.2791635145342131e+00 -3.6689216287405007e+00 1.0752780513752649e+02 + 22 -1.5955254293398622e+02 2.1174472639278221e+01 -4.1695307727865440e+01 + 23 1.7341797299818074e+02 1.1262544744622631e+00 -4.9307932358563441e+01 + 24 -7.2788339173435915e+01 -2.0327590850303113e+02 -7.9191545570721885e+01 + 25 -1.0196479758402157e+02 2.5780676855057195e+01 9.4010361415118780e+01 + 26 1.9245590647660194e+02 1.7908552466286497e+02 -1.4186662063258972e+01 + 27 -7.1099076175251355e+01 -9.6770344800568736e+01 -6.8565488422534827e+01 + 28 -9.6556587212141352e+01 2.7540512430947963e+00 7.8263446196497611e+01 + 29 1.8519055191580867e+02 1.1209837156867849e+02 -2.5268885424937110e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml new file mode 100644 index 0000000000..79bf720aa3 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml @@ -0,0 +1,107 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 19:22:50 2021 +epsilon: 2.5e-09 +skip_tests: +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/long/dipole/long + kspace ewald/disp/dipole +pre_commands: ! "" +post_commands: ! | + pair_modify mix arithmetic + pair_modify table 0 + pair_modify table/disp 0 + kspace_style ewald/disp/dipole 1.0e-6 + kspace_modify gewald 0.3 + kspace_modify compute no +input_file: in.dipole +pair_style: lj/long/dipole/long long long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! | + B 2 + epsilon 2 + sigma 2 + cut_coul 0 + cut_vdwl 0 + ewald_order 0 + ewald_cut 0 + ewald_mix 0 +natoms: 29 +init_vdwl: 780.964939033474 +init_coul: -510.0645577150534 +init_stress: ! |2- + 2.1186891565758292e+03 1.6568747134262373e+03 4.1488018143646023e+03 -3.1698706178071541e+02 -7.7642156449388779e+01 6.9929788784082587e+02 +init_forces: ! |2 + 1 -7.6007892503616404e+01 2.7665013159907738e+02 3.0134418995941166e+02 + 2 2.2867037231947904e+02 1.0470590208275833e+02 -1.9913367796139423e+02 + 3 -1.4484116376800864e+02 -3.8429247602547053e+02 -2.9901434029556566e+02 + 4 1.3938502687594612e+01 -3.6647053046991061e+01 8.3886466623489767e+01 + 5 -3.5438584458162318e+01 -7.2740708285616961e+01 4.6109114027644985e+01 + 6 -7.4158126313863966e+02 8.8448420846676731e+02 1.2098080364986888e+03 + 7 8.6287183176696090e+01 -3.5778221265743844e+02 -1.7363516789861883e+03 + 8 6.5976057527884421e+01 -4.8645495241218576e+01 2.5793156261508091e+02 + 9 4.2491092905023471e+01 1.3072021692758040e+02 3.7829462692746256e+02 + 10 5.8690043458138007e+02 -5.2345223324260144e+02 -1.6697423161520402e+02 + 11 -4.0548553200170225e+01 -1.0751022519246836e+01 -6.5598562050775186e+01 + 12 1.0605382583151132e+02 -1.2015067638157343e+02 2.3646242017204663e+01 + 13 -9.5624178109512840e+01 7.8051254612166446e+01 1.0841939370686937e+01 + 14 -6.6611102165459215e+01 9.4489222311521761e+00 2.3486637060965521e+01 + 15 -5.5070532176868142e+01 2.8320939037640930e+01 8.0271735764091915e+01 + 16 5.2482147552248352e+02 -3.4781291266409153e+02 -1.2134244881209024e+03 + 17 -4.4901247139192253e+02 3.3811896569767225e+02 1.2424947717998630e+03 + 18 -4.7461836541915851e+01 -1.1119812968855497e+02 1.2434792821301285e+02 + 19 -1.5507117139923497e+02 3.3562381224711103e+01 -1.3561336271097147e+01 + 20 2.1026410894172201e+02 9.1088799850008940e+01 -8.9994878031051428e+01 + 21 -7.3540986790080272e+00 -4.0666051205998279e+00 1.0849022311932021e+02 + 22 -1.5958048220865899e+02 2.1347201816470964e+01 -4.2314333856649611e+01 + 23 1.7353983503860766e+02 1.3431032233629090e+00 -4.9650644605857359e+01 + 24 -7.5732096381198389e+01 -2.0163409889381214e+02 -8.0672450655028229e+01 + 25 -9.7954004446520742e+01 2.5260207836781959e+01 9.5988189689701770e+01 + 26 1.9140136416350640e+02 1.7797517193284955e+02 -1.4674989703590418e+01 + 27 -7.2554159134880464e+01 -9.7074109214580631e+01 -6.8739761097486507e+01 + 28 -9.5686975441521014e+01 2.6049307025671595e+00 7.8594177731605996e+01 + 29 1.8578631244940976e+02 1.1256539574022824e+02 -2.5430468167440296e+01 +run_vdwl: 777.3635559161404 +run_coul: -511.61056889302586 +run_stress: ! |2- + 2.1145384663553446e+03 1.6510668217739590e+03 4.1110613021748786e+03 -3.2034939216947475e+02 -7.5852028946707975e+01 7.0161836723009515e+02 +run_forces: ! |2 + 1 -7.2481915554468316e+01 2.7873533962269897e+02 2.9736553162748010e+02 + 2 2.2530700136172547e+02 1.0251795242867284e+02 -1.9498348518123478e+02 + 3 -1.4502046592654210e+02 -3.8426825566001651e+02 -2.9882158301997504e+02 + 4 1.3879012832806696e+01 -3.6612695951538271e+01 8.3787745719906539e+01 + 5 -3.5315604779312473e+01 -7.2567908037413773e+01 4.5948158195046283e+01 + 6 -7.3601478244893099e+02 8.7822376057908912e+02 1.1931463023857750e+03 + 7 8.5593400194792167e+01 -3.5483999790439844e+02 -1.7156481613379353e+03 + 8 6.1948168094253568e+01 -4.1643096768243105e+01 2.6361985288349189e+02 + 9 4.0036362505006849e+01 1.2809297433027587e+02 3.6923325743788149e+02 + 10 5.8792334478759483e+02 -5.2488402370828601e+02 -1.6790948960744348e+02 + 11 -4.0425480882258505e+01 -1.0573799181622711e+01 -6.5100685016812548e+01 + 12 1.0668811367434198e+02 -1.1984628711151187e+02 2.3236152187612923e+01 + 13 -9.6048813773627344e+01 7.7952197357603239e+01 1.0809336270525087e+01 + 14 -6.6001202900526522e+01 9.5463761360826584e+00 2.3655784750123413e+01 + 15 -5.5540888390243040e+01 2.8029939249904579e+01 8.0279497327689711e+01 + 16 5.2432845997166748e+02 -3.4810507930928827e+02 -1.2129304514808082e+03 + 17 -4.4846812380300480e+02 3.3849380728322205e+02 1.2419360206198796e+03 + 18 -4.0126265216240299e+01 -1.0506049253576529e+02 1.2028433815007091e+02 + 19 -1.5557437978499408e+02 3.3044880263130914e+01 -1.3924100898964099e+01 + 20 2.0348791523589139e+02 8.5461816296489218e+01 -8.5572815975123476e+01 + 21 -7.2771091375000241e+00 -3.6711998323594579e+00 1.0752585156213770e+02 + 22 -1.5955253114000146e+02 2.1174506710846043e+01 -4.1695372723856913e+01 + 23 1.7341802372293813e+02 1.1262503605507654e+00 -4.9307971786681463e+01 + 24 -7.2786994107130170e+01 -2.0327342663988938e+02 -7.9187646703575908e+01 + 25 -1.0196471574644906e+02 2.5780707544351898e+01 9.4010233721469760e+01 + 26 1.9245596364740629e+02 1.7908559406841604e+02 -1.4186681320598032e+01 + 27 -7.1101164100672392e+01 -9.6772518105492182e+01 -6.8564001290184706e+01 + 28 -9.6556585391234933e+01 2.7540461843377990e+00 7.8263442932085326e+01 + 29 1.8519125705471143e+02 1.1209863233015392e+02 -2.5269059427981762e+01 +... diff --git a/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml b/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml new file mode 100644 index 0000000000..0bfa9f1415 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml @@ -0,0 +1,96 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 20:27:05 2021 +epsilon: 2e-14 +skip_tests: single gpu +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/sf/dipole/sf +pre_commands: ! "" +post_commands: ! | + pair_modify mix arithmetic +input_file: in.dipole +pair_style: lj/sf/dipole/sf 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! | + epsilon 2 + sigma 2 + cut_coul 2 +natoms: 29 +init_vdwl: 749.2633759833361 +init_coul: -217.7767543539848 +init_stress: ! |2- + 2.3307105275824219e+03 1.8921784919073946e+03 4.3143552886045145e+03 -5.1717888760304368e+02 -1.7289838727974762e+02 7.0607232447937497e+02 +init_forces: ! |2 + 1 -6.8103039103553144e+01 2.8778862154082498e+02 3.0598333226831829e+02 + 2 2.1952336496459932e+02 1.1643833719338330e+02 -1.9726975963868048e+02 + 3 -1.5974445996862306e+02 -3.8001194336338159e+02 -2.9677767461249147e+02 + 4 -6.2777682367372609e+00 -3.3143507895754816e+01 8.1020040494238430e+01 + 5 -5.1379437837923646e+01 -6.9099476429409023e+01 5.3040402232428697e+01 + 6 -7.7892402615511719e+02 8.8493877731707005e+02 1.2063996163601676e+03 + 7 9.3000586899588157e+01 -3.5906990969693118e+02 -1.7468150087847234e+03 + 8 8.6846265878755133e+01 -5.2764263908575401e+01 2.6302131630793338e+02 + 9 3.5959610475937126e+01 1.2911756626467115e+02 3.8936928039057244e+02 + 10 5.8513761567202016e+02 -5.3200952424358229e+02 -1.6587070527717438e+02 + 11 -4.7032470597262787e+01 -2.1718543141469965e+01 -7.0231444370360848e+01 + 12 1.3287235515664267e+02 -1.2120172572389244e+02 2.1763587679908113e+01 + 13 -7.7691060923393735e+01 7.6084565848279254e+01 8.8549530128208271e+00 + 14 -6.4615902859434996e+01 7.5964711355839807e+00 1.1139107171119367e+01 + 15 -4.2859729034814592e+01 3.3888993721189628e+01 7.8229135888456071e+01 + 16 5.1432034868049288e+02 -3.5897765347245490e+02 -1.2066866005063182e+03 + 17 -4.3488303272382689e+02 3.2926789598153533e+02 1.2525098799549635e+03 + 18 4.7676551609994586e+00 -2.6492769022611796e+01 -9.1019415782273768e+01 + 19 -6.5907740207137849e+01 1.0051282082846487e+02 9.6061159173386358e+01 + 20 7.7312452517807614e+01 -4.0282335324931580e+01 -7.3865439244729547e+00 + 21 9.7072453091424595e+00 -5.7984158968375610e+00 1.0701822320724706e+02 + 22 -1.6673016608317349e+02 1.5378757671170883e+01 -4.8154882780231830e+01 + 23 1.7376105499832110e+02 -2.4876013668085752e+00 -5.2485395047269890e+01 + 24 -5.8826520432613847e+01 -1.9724647943351388e+02 -7.5498123010225626e+01 + 25 -1.0743747013955485e+02 2.9047527651164682e+01 1.0167377674566907e+02 + 26 1.8855306479293733e+02 1.8132632405885457e+02 -9.1007743361203488e+00 + 27 -6.2881960946585536e+01 -1.0091483313808286e+02 -6.5049492394568205e+01 + 28 -1.0642245132509179e+02 7.1817894569033669e-01 7.7435015441815892e+01 + 29 1.7795561606760143e+02 1.0911414390035503e+02 -2.1173005864134293e+01 +run_vdwl: 746.2626573093828 +run_coul: -219.46521636718495 +run_stress: ! |2- + 2.3291910634059586e+03 1.8896338010219772e+03 4.2779066388693673e+03 -5.1763237780858333e+02 -1.7416362503874595e+02 7.0537625931221612e+02 +run_forces: ! |2 + 1 -6.4584674657771515e+01 2.8983646384293615e+02 3.0202284109290724e+02 + 2 2.1618076189933106e+02 1.1427831457072568e+02 -1.9314116489125814e+02 + 3 -1.5993648092484190e+02 -3.7999586237374569e+02 -2.9655196386886252e+02 + 4 -6.3190175662096824e+00 -3.3105372597033458e+01 8.0903348979897856e+01 + 5 -5.1264538677538106e+01 -6.8915068550452332e+01 5.2853683811181462e+01 + 6 -7.7332667821630548e+02 8.7863758904167798e+02 1.1897625560660572e+03 + 7 9.2312901142593816e+01 -3.5612290923433949e+02 -1.7261053689357518e+03 + 8 8.2837099184303213e+01 -4.5668956744859727e+01 2.6883889894862114e+02 + 9 3.3465120697168985e+01 1.2643635928344169e+02 3.8015948150198676e+02 + 10 5.8616217794883767e+02 -5.3344932502539120e+02 -1.6682265133877738e+02 + 11 -4.6907551909313561e+01 -2.1532164076321582e+01 -6.9722764759532637e+01 + 12 1.3347317052854399e+02 -1.2087525356778710e+02 2.1354763126125746e+01 + 13 -7.8097978396802830e+01 7.5980741277055273e+01 8.8252035761426217e+00 + 14 -6.4011731230837015e+01 7.6839158928631601e+00 1.1312101922881329e+01 + 15 -4.3338634451079720e+01 3.3584440250128551e+01 7.8237801787523694e+01 + 16 5.1382857086338026e+02 -3.5926956845145241e+02 -1.2062099218451672e+03 + 17 -4.3434475776499738e+02 3.2965053889770934e+02 1.2519628687249585e+03 + 18 5.5497080568258799e+00 -2.7105130428183966e+01 -9.1619619877799437e+01 + 19 -6.5771871629638710e+01 1.0083384924106365e+02 9.6539204583481222e+01 + 20 7.6451566926835611e+01 -3.9992220622894031e+01 -7.2662980133099069e+00 + 21 9.7095514827038851e+00 -5.4249106470670174e+00 1.0598125111105223e+02 + 22 -1.6664515963177726e+02 1.5214225678316646e+01 -4.7460992600407494e+01 + 23 1.7365621602968167e+02 -2.6968949308459482e+00 -5.2141668046157378e+01 + 24 -5.5910478635751304e+01 -1.9887169761844189e+02 -7.4040013188840518e+01 + 25 -1.1139537409017143e+02 2.9555641441579397e+01 9.9720511455284168e+01 + 26 1.8958557210558467e+02 1.8242955167894382e+02 -8.6093955315153625e+00 + 27 -6.1570934346116388e+01 -1.0064681711132053e+02 -6.4927497667696230e+01 + 28 -1.0720564196929094e+02 8.4075286919278369e-01 7.7143138333351857e+01 + 29 1.7741908723265240e+02 1.0870976801450216e+02 -2.0998334456377012e+01 +... From 46e4e1b60e5808daf5d6c8759d0867bd68fe4354 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:45:25 -0400 Subject: [PATCH 042/437] add kspace tests with dipoles --- .../tests/kspace-ewald_dipole.yaml | 97 +++++++++++++++++++ .../force-styles/tests/kspace-ewald_disp.yaml | 1 + .../tests/kspace-ewald_disp_dipole.yaml | 96 ++++++++++++++++++ .../tests/kspace-pppm_dipole.yaml | 97 +++++++++++++++++++ 4 files changed, 291 insertions(+) create mode 100644 unittest/force-styles/tests/kspace-ewald_dipole.yaml create mode 100644 unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml create mode 100644 unittest/force-styles/tests/kspace-pppm_dipole.yaml diff --git a/unittest/force-styles/tests/kspace-ewald_dipole.yaml b/unittest/force-styles/tests/kspace-ewald_dipole.yaml new file mode 100644 index 0000000000..ea66ddbace --- /dev/null +++ b/unittest/force-styles/tests/kspace-ewald_dipole.yaml @@ -0,0 +1,97 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 20:34:27 2021 +epsilon: 5e-12 +skip_tests: gpu single extract +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/cut/dipole/long + kspace ewald/dipole +pre_commands: ! "" +post_commands: ! | + set atom * charge 0.0 + pair_modify compute no + kspace_style ewald/dipole 1.0e-8 + kspace_modify gewald 0.2 +input_file: in.dipole +pair_style: lj/cut/dipole/long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! "" +natoms: 29 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 -6.3805449052595913e+00 1.0012034950319659e+00 1.1044840649025668e-01 + 2 -4.2965332689290543e+00 1.5020782864325359e+00 -2.3799754308399262e-01 + 3 -8.2063412899404291e+00 1.1686024220952766e-01 -3.4066590088768650e-01 + 4 -9.8912558949071165e+00 -7.9243654108039241e-02 -7.1447131893145843e-01 + 5 -8.4066311926293746e+00 -2.5770195885802261e-02 2.1001256705111906e-01 + 6 -5.1656917273498788e+00 -4.7344667498748816e-01 -6.6395518679801591e-01 + 7 -5.1553727466179513e+00 -6.8817355836879956e-01 -1.4869571944164934e+00 + 8 -1.3200521859179806e+00 -9.1923698523412567e-01 1.1188489760899759e-01 + 9 -1.0209696733609814e-02 -6.8754994132457492e-01 1.0028756375879018e+00 + 10 2.1197682412253043e+00 -1.3795090360584246e+00 1.6975982085566022e-01 + 11 6.0932786902790270e-01 -1.7133373578356208e+00 -6.6055301932880561e-01 + 12 6.1802400730040166e+00 -3.3469704481716267e-01 2.4240550295882568e-02 + 13 8.9206235645704908e+00 -2.9728320012162607e-02 4.8671262131784337e-01 + 14 4.1636792462484795e+00 -4.1050938179910623e-01 -9.2955027450810646e-01 + 15 6.5456496372393715e+00 3.1128766443074074e-01 2.2561153570821868e-01 + 16 4.4545489082809500e+00 -1.5285789455408449e+00 1.0667137250056324e+00 + 17 3.2211809841116534e+00 -1.5229531702219341e+00 1.5797722164604753e+00 + 18 2.2978493886549902e+00 1.4731179239902128e+00 -1.3277204583248148e+00 + 19 -1.4773210827470695e-01 1.1930255702874257e+00 -1.7730289579224090e+00 + 20 4.0051857762542813e+00 1.3498893754280965e+00 -1.0437468254736015e+00 + 21 6.7359132036166862e+00 -2.0509678088915065e-01 2.3816656251906621e-01 + 22 5.4960083761484357e+00 -5.2168558303798973e-01 -4.3991123166461177e-01 + 23 7.2115114336482140e+00 4.7232721366053315e-01 6.4199659507644613e-01 + 24 2.5537878185085563e+00 1.1036465573876277e+00 1.4985588063989326e+00 + 25 9.0934885323777109e-02 1.3535657998166013e+00 1.6392747875852032e+00 + 26 3.8102302098927212e+00 1.1627169089175879e+00 1.1144474600420826e+00 + 27 -6.3774202397791129e+00 -1.9477774943342219e-01 -1.3012515544992012e-01 + 28 -6.9237349107173713e+00 2.9502671112603146e-01 -7.3680804984764769e-01 + 29 -6.1349194486996330e+00 -6.2045136916423638e-01 3.6501492663384533e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 -6.3794761170362797e+00 1.0014050007655639e+00 1.1038908899542715e-01 + 2 -4.2917565714190200e+00 1.5032859261416123e+00 -2.3682233624430710e-01 + 3 -8.2073500812951714e+00 1.1713702854625513e-01 -3.4077419909840750e-01 + 4 -9.8911748277703975e+00 -7.9640456886270528e-02 -7.1479806383418054e-01 + 5 -8.4075721979806968e+00 -2.5655419911871775e-02 2.0973169384031953e-01 + 6 -5.1662204664221010e+00 -4.7288483570753725e-01 -6.6358389090683767e-01 + 7 -5.1556618728821935e+00 -6.8815638181860539e-01 -1.4868424147606212e+00 + 8 -1.3199450036122879e+00 -9.1927429716583575e-01 1.1197852020008769e-01 + 9 -8.6863331771202326e-03 -6.8820154797027466e-01 1.0031813721998930e+00 + 10 2.1198330559710414e+00 -1.3790719939414731e+00 1.6978551834043465e-01 + 11 6.0744997420034663e-01 -1.7132540945017130e+00 -6.6130292475572605e-01 + 12 6.1807018723467664e+00 -3.3443648070328580e-01 2.3995343925596185e-02 + 13 8.9239922416570376e+00 -2.8148649568997600e-02 4.8698040199910714e-01 + 14 4.1613933224791273e+00 -4.1128753524578959e-01 -9.3056594895345635e-01 + 15 6.5388776582330621e+00 3.1024618552803152e-01 2.2581698394911581e-01 + 16 4.4536651940319807e+00 -1.5284773061721311e+00 1.0670482566990316e+00 + 17 3.2214398614770494e+00 -1.5227123661352884e+00 1.5798379983865767e+00 + 18 2.2963076532445514e+00 1.4728793745109725e+00 -1.3278635988916623e+00 + 19 -1.4892019130130399e-01 1.1926845393134009e+00 -1.7729644618749920e+00 + 20 4.0097333951498788e+00 1.3491422225583067e+00 -1.0422026063121017e+00 + 21 6.7356891860556498e+00 -2.0514360614732452e-01 2.3763370150863697e-01 + 22 5.4944140818326614e+00 -5.2243494533316892e-01 -4.4025723209329121e-01 + 23 7.2111620066109481e+00 4.7211062306034157e-01 6.4198606290765858e-01 + 24 2.5535104770595738e+00 1.1037602721941646e+00 1.4983405995049637e+00 + 25 9.6377061926546645e-02 1.3527339069766595e+00 1.6394163127560981e+00 + 26 3.8074413552285966e+00 1.1626070538888325e+00 1.1147060236222321e+00 + 27 -6.3773422678008194e+00 -1.9467236040261920e-01 -1.3056613544698842e-01 + 28 -6.9226078114121012e+00 2.9508005636824414e-01 -7.3682489601150702e-01 + 29 -6.1352746553953184e+00 -6.1961991224019386e-01 3.6454083034889967e-01 +... diff --git a/unittest/force-styles/tests/kspace-ewald_disp.yaml b/unittest/force-styles/tests/kspace-ewald_disp.yaml index e20bdc149a..5b0faec124 100644 --- a/unittest/force-styles/tests/kspace-ewald_disp.yaml +++ b/unittest/force-styles/tests/kspace-ewald_disp.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:25 2021 epsilon: 5e-12 +skip_tests: gpu single extract prerequisites: ! | atom full pair lj/long/coul/long diff --git a/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml b/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml new file mode 100644 index 0000000000..d2fe945845 --- /dev/null +++ b/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml @@ -0,0 +1,96 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 20:44:17 2021 +epsilon: 5e-12 +skip_tests: extract gpu single +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/long/dipole/long + kspace ewald/disp/dipole +pre_commands: ! "" +post_commands: ! | + pair_modify compute no + kspace_style ewald/disp/dipole 1.0e-8 + kspace_modify gewald 0.2 +input_file: in.dipole +pair_style: lj/long/dipole/long long long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! "" +natoms: 29 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 1.8161545040590614e+00 2.0805690002241701e+00 8.2983967603739284e-01 + 2 -1.0881968371971796e+01 7.3371979285516020e-01 -4.7839171817035314e-01 + 3 -8.0876262651374322e+00 9.2103380745213043e-02 -2.7560755523402031e-01 + 4 -1.0607482786888513e+01 -3.2082764964834026e-01 -6.6137102480516297e-01 + 5 -9.7788030513395086e+00 -1.4121844888694118e-01 -6.2958000329413986e-03 + 6 -1.6569350341955069e+01 -7.3778837100736450e-01 -1.1505763108052891e+00 + 7 5.1065173930064303e+00 -4.2157560003852773e-01 -1.4234408555222080e+00 + 8 9.9224059631527801e+00 -6.4683885413461706e-01 1.0031880338975343e+00 + 9 -7.8618615951092767e+00 -8.2280180210534271e-01 6.4793125769938864e-01 + 10 2.2194802047144466e-01 -1.4630404577261027e+00 1.0974068007565399e-01 + 11 -1.6708475580943973e+00 -1.8027546205450915e+00 -7.7505417447774971e-01 + 12 1.1502973205187178e+01 1.8611078630318650e-01 6.4878526105101386e-01 + 13 7.7407590935854209e+00 -2.9266950530840186e-01 3.4686013757550688e-01 + 14 1.9771354507001559e+00 -5.6222351545462912e-01 -1.1169897947372798e+00 + 15 4.4961313004297061e+00 2.6941867112732049e-01 1.5071410903714488e-01 + 16 -5.5750754249535710e+00 -2.7008358894134550e+00 7.5109207835498371e-01 + 17 1.3055808568576591e+01 -7.8795579349143541e-01 1.5573049728873616e+00 + 18 1.9281612695540346e+01 1.1537458303090271e+00 2.6430501822187397e-01 + 19 -8.8884160555436207e+00 9.0369418139836366e-01 -2.0688829247393117e+00 + 20 -3.1911264650458597e+00 2.1200174891455990e+00 -2.0534860916436761e+00 + 21 1.1544674316250926e+01 2.7736248979683009e+00 2.7603066284087623e+00 + 22 1.8948570251927412e+00 -1.8204271140082788e+00 -1.7285732035553496e+00 + 23 7.5451080526968690e+00 -1.1633863479849456e+00 -6.9617166397491903e-01 + 24 1.7090123035824977e+01 6.0386551941088407e-01 3.9627332291020417e-02 + 25 -8.2199481042167122e+00 1.1234334691809766e+00 1.7435126694450034e+00 + 26 -2.5549693637963902e+00 1.6367589770767825e+00 2.0242658791559829e+00 + 27 -4.0222808166046038e+00 -2.6500176615280457e+00 2.3870876229675893e+00 + 28 -5.8651168962944924e+00 1.8105347196240968e+00 -1.7584641077143275e+00 + 29 -9.4213355277234108e+00 8.4676491591243930e-01 -1.0712561316936238e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 1.8169953633895561e+00 2.0808461650729537e+00 8.3041936373546843e-01 + 2 -1.0878054813594593e+01 7.3490952057898329e-01 -4.7808361477007555e-01 + 3 -8.0891337630280393e+00 9.2289454399877860e-02 -2.7592430573439752e-01 + 4 -1.0607226495334707e+01 -3.2121973075546556e-01 -6.6181844555801284e-01 + 5 -9.7795114334777562e+00 -1.4123109433426517e-01 -6.9653512939859309e-03 + 6 -1.6569327432011324e+01 -7.3761604768331035e-01 -1.1515786004602047e+00 + 7 5.1046360915521927e+00 -4.2176008468974424e-01 -1.4230323295733194e+00 + 8 9.9219450902555053e+00 -6.4702943691605719e-01 1.0044080630464101e+00 + 9 -7.8600031181485983e+00 -8.2349222764333285e-01 6.4758125333792238e-01 + 10 2.2195174154714353e-01 -1.4625405378942173e+00 1.0961271855984214e-01 + 11 -1.6727541499558802e+00 -1.8024427258355147e+00 -7.7606176252233550e-01 + 12 1.1502963069614021e+01 1.8623811664781245e-01 6.4927854355163195e-01 + 13 7.7456547920463441e+00 -2.9084078034427885e-01 3.4703491502728595e-01 + 14 1.9748668467647146e+00 -5.6318548644507771e-01 -1.1183076454338698e+00 + 15 4.4881694664947114e+00 2.6802064645991991e-01 1.5094672500274675e-01 + 16 -5.5758092590055623e+00 -2.6999762614596339e+00 7.5085665849128036e-01 + 17 1.3055662636942614e+01 -7.8782424382489413e-01 1.5582848236011495e+00 + 18 1.9280786989015635e+01 1.1554885612385097e+00 2.6429825674584151e-01 + 19 -8.8920126752258053e+00 9.0198849896384070e-01 -2.0689713182243463e+00 + 20 -3.1827952500825427e+00 2.1199150366707706e+00 -2.0527632343468181e+00 + 21 1.1548055725823801e+01 2.7708239267435171e+00 2.7605003009197651e+00 + 22 1.8896345638344842e+00 -1.8195498795819531e+00 -1.7287912309008906e+00 + 23 7.5449375723760363e+00 -1.1625668704424199e+00 -6.9574863550087018e-01 + 24 1.7090373157346892e+01 6.0360593740203949e-01 3.9871055831725552e-02 + 25 -8.2149622840991974e+00 1.1236497843086952e+00 1.7447856303284364e+00 + 26 -2.5591359187212634e+00 1.6359744609968121e+00 2.0244050677241399e+00 + 27 -4.0238603703928533e+00 -2.6502739043440280e+00 2.3874825361707104e+00 + 28 -5.8637000655529770e+00 1.8102871636069633e+00 -1.7593576520985350e+00 + 29 -9.4183460783725810e+00 8.4751203910349304e-01 -1.0723617856566923e+00 +... diff --git a/unittest/force-styles/tests/kspace-pppm_dipole.yaml b/unittest/force-styles/tests/kspace-pppm_dipole.yaml new file mode 100644 index 0000000000..b4e77d5708 --- /dev/null +++ b/unittest/force-styles/tests/kspace-pppm_dipole.yaml @@ -0,0 +1,97 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sat Aug 21 20:37:38 2021 +epsilon: 5e-12 +skip_tests: gpu single extract +prerequisites: ! | + atom full + atom sphere + atom dipole + pair lj/cut/dipole/long + kspace pppm/dipole +pre_commands: ! "" +post_commands: ! | + set atom * charge 0.0 + pair_modify compute no + kspace_style pppm/dipole 1.0e-8 + kspace_modify gewald 0.2 +input_file: in.dipole +pair_style: lj/cut/dipole/long 8.0 +pair_coeff: ! | + 1 1 0.02 2.5 + 2 2 0.005 1.0 + 2 4 0.005 0.5 + 3 3 0.02 3.2 + 4 4 0.015 3.1 + 5 5 0.015 3.1 +extract: ! "" +natoms: 29 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 -6.3805358365027622e+00 1.0012042613092100e+00 1.1045002811720689e-01 + 2 -4.2965350961202908e+00 1.5020764076251609e+00 -2.3799604053624657e-01 + 3 -8.2063438482674780e+00 1.1686015334197719e-01 -3.4066510308974446e-01 + 4 -9.8912585098174191e+00 -7.9245099087574863e-02 -7.1447161487948030e-01 + 5 -8.4066310439065361e+00 -2.5771124825315763e-02 2.1001261893610784e-01 + 6 -5.1656936444842341e+00 -4.7344595409327650e-01 -6.6395541913315437e-01 + 7 -5.1553700801611599e+00 -6.8817448730918829e-01 -1.4869547145654336e+00 + 8 -1.3200481718020149e+00 -9.1923515232628128e-01 1.1188655744939495e-01 + 9 -1.0207290954110351e-02 -6.8754964741819191e-01 1.0028752367004619e+00 + 10 2.1197739446149431e+00 -1.3795086488978878e+00 1.6975960722025565e-01 + 11 6.0931767572689643e-01 -1.7133364907674298e+00 -6.6055557694588607e-01 + 12 6.1802389677596974e+00 -3.3469795667558327e-01 2.4240375324555221e-02 + 13 8.9206185137157092e+00 -2.9731063130709633e-02 4.8671146040352475e-01 + 14 4.1636718122955987e+00 -4.1050918761100558e-01 -9.2955242693905782e-01 + 15 6.5456498527546669e+00 3.1128764687221688e-01 2.2560993518583913e-01 + 16 4.4545467918156811e+00 -1.5285786805244670e+00 1.0667134424689115e+00 + 17 3.2211757688846316e+00 -1.5229546320844545e+00 1.5797718927571085e+00 + 18 2.2978532779714858e+00 1.4731179475378802e+00 -1.3277205887412058e+00 + 19 -1.4774234711323067e-01 1.1930262539699554e+00 -1.7730294415794705e+00 + 20 4.0051904718935498e+00 1.3498888254217831e+00 -1.0437450760166322e+00 + 21 6.7359110652889500e+00 -2.0509666875198637e-01 2.3816624349582471e-01 + 22 5.4960114108541447e+00 -5.2168457553718139e-01 -4.3991041660178920e-01 + 23 7.2115084006519261e+00 4.7232729809480084e-01 6.4199721914726260e-01 + 24 2.5537922547761678e+00 1.1036461042849897e+00 1.4985585857549020e+00 + 25 9.0940245036958800e-02 1.3535663945567040e+00 1.6392741308543988e+00 + 26 3.8102220441050907e+00 1.1627176362205849e+00 1.1144483723313934e+00 + 27 -6.3774137790554413e+00 -1.9477752067799528e-01 -1.3012527712914013e-01 + 28 -6.9237292947884992e+00 2.9502709876738664e-01 -7.3680805805554495e-01 + 29 -6.1349135551729201e+00 -6.2044913828412185e-01 3.6501404806563809e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 -6.3794670713051396e+00 1.0014057765209496e+00 1.1039070119266108e-01 + 2 -4.2917583215983059e+00 1.5032840536381384e+00 -2.3682082896276035e-01 + 3 -8.2073526552603404e+00 1.1713693941301162e-01 -3.4077340500928732e-01 + 4 -9.8911774679667364e+00 -7.9641889932201296e-02 -7.1479836041918843e-01 + 5 -8.4075720502648892e+00 -2.5656340231007144e-02 2.0973174669137851e-01 + 6 -5.1662223893410557e+00 -4.7288411156728155e-01 -6.6358413361213364e-01 + 7 -5.1556592068168756e+00 -6.8815731088937615e-01 -1.4868399421082457e+00 + 8 -1.3199409629055094e+00 -9.1927247607124507e-01 1.1198017565223027e-01 + 9 -8.6839526360140765e-03 -6.8820125926516185e-01 1.0031809621952430e+00 + 10 2.1198387771895493e+00 -1.3790716135879908e+00 1.6978530323785193e-01 + 11 6.0743978295630208e-01 -1.7132532349353555e+00 -6.6130548345257012e-01 + 12 6.1807007279040054e+00 -3.3443741259132764e-01 2.3995163438530760e-02 + 13 8.9239871531255197e+00 -2.8151386051136287e-02 4.8697925460570501e-01 + 14 4.1613858872169462e+00 -4.1128735538300232e-01 -9.3056809863371248e-01 + 15 6.5388779802122068e+00 3.1024617818216560e-01 2.2581538536089366e-01 + 16 4.4536630829164050e+00 -1.5284770413213327e+00 1.0670479730226936e+00 + 17 3.2214346381278829e+00 -1.5227138337682848e+00 1.5798376713141347e+00 + 18 2.2963115484881533e+00 1.4728793967268368e+00 -1.3278637286680524e+00 + 19 -1.4893042098132542e-01 1.1926852178770355e+00 -1.7729649420475160e+00 + 20 4.0097381511983023e+00 1.3491416760166850e+00 -1.0422008556274691e+00 + 21 6.7356870222610778e+00 -2.0514349696348458e-01 2.3763337801425341e-01 + 22 5.4944170998698718e+00 -5.2243392478981421e-01 -4.4025641685875266e-01 + 23 7.2111589530597735e+00 4.7211069841464914e-01 6.4198669117223706e-01 + 24 2.5535149279358502e+00 1.1037598225426664e+00 1.4983403819560210e+00 + 25 9.6382396316406244e-02 1.3527345080357760e+00 1.6394156717006976e+00 + 26 3.8074331740275631e+00 1.1626077926858638e+00 1.1147069501981408e+00 + 27 -6.3773358185998346e+00 -1.9467213397745334e-01 -1.3056625652950193e-01 + 28 -6.9226022138801095e+00 2.9508044255970062e-01 -7.3682490917827204e-01 + 29 -6.1352687712496827e+00 -6.1961768128802408e-01 3.6453995135478745e-01 +... From dd670bab665831ea1e8125a047bd760333c794fb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 21 Aug 2021 20:50:16 -0400 Subject: [PATCH 043/437] update dipole data file with randomized dipole orientations --- unittest/force-styles/tests/data.dipole | 58 ++++---- .../tests/kspace-ewald_dipole.yaml | 120 ++++++++-------- .../tests/kspace-ewald_disp_dipole.yaml | 118 ++++++++-------- .../tests/kspace-pppm_dipole.yaml | 120 ++++++++-------- .../tests/mol-pair-lj_cut_dipole_cut.yaml | 128 ++++++++--------- .../tests/mol-pair-lj_cut_dipole_long.yaml | 128 ++++++++--------- .../mol-pair-lj_long_cut_dipole_long.yaml | 128 ++++++++--------- .../tests/mol-pair-lj_long_dipole_long.yaml | 128 ++++++++--------- .../tests/mol-pair-lj_sf_dipole_sf.yaml | 130 +++++++++--------- 9 files changed, 529 insertions(+), 529 deletions(-) diff --git a/unittest/force-styles/tests/data.dipole b/unittest/force-styles/tests/data.dipole index 5d86c32a75..948646741c 100644 --- a/unittest/force-styles/tests/data.dipole +++ b/unittest/force-styles/tests/data.dipole @@ -61,35 +61,35 @@ Improper Coeffs # zero Atoms -10 1 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 2 7.0000000000000007e-02 12.0107 0.23873241463784300365 1.0 0.0 0.0 -11 2 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 -12 1 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 2 -2.7000000000000002e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 -13 2 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 -14 2 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 - 2 2 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 1 3.1000000000000000e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 - 3 1 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 1 -2.0000000000000000e-02 12.0107 0.23873241463784300365 1.0 0.0 0.0 - 4 2 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 1 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 - 6 1 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 1 5.1000000000000001e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 - 7 4 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 1 -5.1000000000000001e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 -19 2 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 3 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -15 2 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 2 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 -18 4 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 3 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 -20 2 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 3 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 - 8 3 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 2 -4.6999999999999997e-01 14.0067 0.23873241463784300365 1.0 0.0 0.0 - 9 2 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 2 3.1000000000000000e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -16 1 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 2 5.1000000000000001e-01 12.0107 0.23873241463784300365 1.0 0.0 0.0 -17 4 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 2 -5.1000000000000001e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 - 1 3 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 1 -4.6999999999999997e-01 14.0067 0.23873241463784300365 1.0 0.0 0.0 - 5 2 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 1 8.9999999999999997e-02 4.00794 0.23873241463784300365 1.0 0.0 0.0 -21 5 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 4 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 -22 2 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 4 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -23 2 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 4 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -24 5 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 5 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 -25 2 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 5 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -26 2 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 5 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -27 5 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 6 -8.4719999999999995e-01 15.9994 0.23873241463784300365 1.0 0.0 0.0 -28 2 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 6 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 -29 2 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 6 4.2359999999999998e-01 4.00794 0.23873241463784300365 1.0 0.0 0.0 +10 1 2.018528355553699 -1.4283966846517357 -0.9673352727113302 2 0.07 12.0107 0.238732414637843 0.598323762260729 0.6736604951785857 0.4338089588170229 0 0 0 +11 2 1.7929780509347666 -1.9871047540768743 -1.8840626643185674 2 0.09 4.00794 0.23873241463784303 -0.653673000810123 0.15744235821924107 -0.7402185568129547 0 0 0 +12 1 3.0030247876861225 -0.4892331996757275 -1.6188658531537248 2 -0.27 12.0107 0.238732414637843 0.1982898389827933 0.9017416598878113 0.3841134188998773 0 0 0 +13 2 4.044727378789593 -0.9013199854744625 -1.6384447268320836 2 0.09 4.00794 0.23873241463784303 -0.9032575128654979 -0.12328276882760088 -0.41100757214707784 0 0 0 +14 2 2.6033152817257075 -0.4078976150596358 -2.6554413538823063 2 0.09 4.00794 0.23873241463784303 -0.14851833750804266 -0.9888639887111963 -0.009503433802052257 0 0 0 +2 2 0.30197083955402204 2.951523906888861 -0.8568973557290757 1 0.31 4.00794 0.23873241463784303 -0.4719970197952735 0.8165391546945855 -0.3323892629960118 0 0 0 +3 1 -0.694353778805586 1.244047312713671 -0.6223380146889202 1 -0.02 12.0107 0.238732414637843 -0.14259106521630074 -0.5377173777883748 0.8309800296907711 0 0 0 +4 2 -1.5771614164685133 1.4915333140468066 -1.2487126845040522 1 0.09 4.00794 0.23873241463784303 -0.2743334356599845 0.41506321378034144 0.8674466523339196 0 0 0 +6 1 0.2941260793770601 0.2271928265665291 -1.284309406785787 1 0.51 12.0107 0.238732414637843 0.073323319042206 0.8852732211516792 -0.4592548473302867 0 0 0 +7 4 0.3401987106287961 -0.009127735007578656 -2.463311322430456 1 -0.51 15.9994 0.238732414637843 0.3495409341995758 0.29563535093417964 -0.8890561706646618 0 0 0 +19 2 1.5349125211132961 2.6315969880333707 -4.247285944022065 3 0.4236 4.00794 0.23873241463784303 -0.8094927833438124 -0.5602943912834794 -0.17547543648773933 0 0 0 +15 2 2.9756315249791303 0.5633426972296929 -1.2437650754599008 2 0.09 4.00794 0.23873241463784303 0.47699954585689774 -0.6681250097955895 0.5710345038068684 0 0 0 +18 4 2.1384791188033843 3.0177261773770208 -3.5160827596876225 3 -0.8472 15.9994 0.238732414637843 -0.34086589666653927 0.5056271863248302 0.7925601484675794 0 0 0 +20 2 2.7641167828863153 3.683341906400022 -3.9380850623312638 3 0.4236 4.00794 0.23873241463784303 -0.1758215108534723 -0.6443961898922309 0.7442045060153684 0 0 0 +8 3 1.1641187171852805 -0.48375305955385234 -0.6765982376736869 2 -0.47 14.0067 0.238732414637843 0.11555125429654613 0.39602168410504884 -0.9109416739556357 0 0 0 +9 2 1.3777459838125838 -0.25366338669523 0.26877644730326306 2 0.31 4.00794 0.23873241463784303 -0.9313621725731209 -0.08807883610885835 -0.3532798071353432 0 0 0 +16 1 2.6517554244980306 -2.395711042497844 0.03290833599917833 2 0.51 12.0107 0.238732414637843 -0.9292357748110288 0.368034479406453 0.032733725412307256 0 0 0 +17 4 2.230996479271064 -2.1022918943319384 1.1491948328949437 2 -0.51 15.9994 0.238732414637843 -0.031510953240420185 0.19452807867563532 0.9803906805109103 0 0 0 +1 3 -0.2799368366922683 2.472658806931284 -0.17200860244148433 1 -0.47 14.0067 0.238732414637843 0.23295119580382673 -0.8473527734924149 0.47720752050683307 0 0 0 +5 2 -0.8950176135935926 0.9356812874307134 0.40227731871484346 1 0.09 4.00794 0.23873241463784303 -0.36497959145640124 0.036001310109668457 -0.9303191944116309 0 0 0 +21 5 4.90644543902083 -4.07512052553832 -3.6215576073601046 4 -0.8472 15.9994 0.238732414637843 -0.1757814468079174 -0.7210010050074684 -0.670267434488903 0 0 0 +22 2 4.368745348862754 -4.2054270536772504 -4.4651491269372565 4 0.4236 4.00794 0.23873241463784303 -0.4212893184124181 -0.5560043452928596 0.7165015549229874 0 0 0 +23 2 5.7374928154769504 -3.5763355905184966 -3.882029719423073 4 0.4236 4.00794 0.23873241463784303 0.04872707802207754 -0.34043198728069224 -0.9390057155861986 0 0 0 +24 5 2.0684115301174013 3.1518221747664397 3.1554242678474576 5 -0.8472 15.9994 0.238732414637843 0.4714236511900419 0.858273197314799 -0.20279758349073562 0 0 0 +25 2 1.2998381073113014 3.2755513587518097 2.5092990173114837 5 0.4236 4.00794 0.23873241463784303 0.15292822161529598 -0.9462935793447818 0.2848533319524703 0 0 0 +26 2 2.5807438597688113 4.0120175892854135 3.21333983790591 5 0.4236 4.00794 0.23873241463784303 -0.523358899843679 -0.7155362540625704 -0.4627130115703671 0 0 0 +27 5 -1.961358187674436 -4.355630059608516 2.110146767353479 6 -0.8472 15.9994 0.238732414637843 -0.550381894651155 0.7130596234203497 -0.43431065320555295 0 0 0 +28 2 -2.7406520384725965 -4.0207251278130975 1.582868986167851 6 0.4236 4.00794 0.23873241463784303 0.33789250391653003 -0.004624272711539025 0.9411733484852335 0 0 0 +29 2 -1.3108232656499081 -3.599298632241076 2.2680459788743503 6 0.4236 4.00794 0.23873241463784303 0.3143354955993785 0.2985178479912606 0.9011549759264272 0 0 0 Velocities diff --git a/unittest/force-styles/tests/kspace-ewald_dipole.yaml b/unittest/force-styles/tests/kspace-ewald_dipole.yaml index ea66ddbace..4206c873e4 100644 --- a/unittest/force-styles/tests/kspace-ewald_dipole.yaml +++ b/unittest/force-styles/tests/kspace-ewald_dipole.yaml @@ -1,8 +1,8 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 20:34:27 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 5e-12 -skip_tests: gpu single extract +skip_tests: extract gpu single prerequisites: ! | atom full atom sphere @@ -31,67 +31,67 @@ init_coul: 0 init_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 init_forces: ! |2 - 1 -6.3805449052595913e+00 1.0012034950319659e+00 1.1044840649025668e-01 - 2 -4.2965332689290543e+00 1.5020782864325359e+00 -2.3799754308399262e-01 - 3 -8.2063412899404291e+00 1.1686024220952766e-01 -3.4066590088768650e-01 - 4 -9.8912558949071165e+00 -7.9243654108039241e-02 -7.1447131893145843e-01 - 5 -8.4066311926293746e+00 -2.5770195885802261e-02 2.1001256705111906e-01 - 6 -5.1656917273498788e+00 -4.7344667498748816e-01 -6.6395518679801591e-01 - 7 -5.1553727466179513e+00 -6.8817355836879956e-01 -1.4869571944164934e+00 - 8 -1.3200521859179806e+00 -9.1923698523412567e-01 1.1188489760899759e-01 - 9 -1.0209696733609814e-02 -6.8754994132457492e-01 1.0028756375879018e+00 - 10 2.1197682412253043e+00 -1.3795090360584246e+00 1.6975982085566022e-01 - 11 6.0932786902790270e-01 -1.7133373578356208e+00 -6.6055301932880561e-01 - 12 6.1802400730040166e+00 -3.3469704481716267e-01 2.4240550295882568e-02 - 13 8.9206235645704908e+00 -2.9728320012162607e-02 4.8671262131784337e-01 - 14 4.1636792462484795e+00 -4.1050938179910623e-01 -9.2955027450810646e-01 - 15 6.5456496372393715e+00 3.1128766443074074e-01 2.2561153570821868e-01 - 16 4.4545489082809500e+00 -1.5285789455408449e+00 1.0667137250056324e+00 - 17 3.2211809841116534e+00 -1.5229531702219341e+00 1.5797722164604753e+00 - 18 2.2978493886549902e+00 1.4731179239902128e+00 -1.3277204583248148e+00 - 19 -1.4773210827470695e-01 1.1930255702874257e+00 -1.7730289579224090e+00 - 20 4.0051857762542813e+00 1.3498893754280965e+00 -1.0437468254736015e+00 - 21 6.7359132036166862e+00 -2.0509678088915065e-01 2.3816656251906621e-01 - 22 5.4960083761484357e+00 -5.2168558303798973e-01 -4.3991123166461177e-01 - 23 7.2115114336482140e+00 4.7232721366053315e-01 6.4199659507644613e-01 - 24 2.5537878185085563e+00 1.1036465573876277e+00 1.4985588063989326e+00 - 25 9.0934885323777109e-02 1.3535657998166013e+00 1.6392747875852032e+00 - 26 3.8102302098927212e+00 1.1627169089175879e+00 1.1144474600420826e+00 - 27 -6.3774202397791129e+00 -1.9477774943342219e-01 -1.3012515544992012e-01 - 28 -6.9237349107173713e+00 2.9502671112603146e-01 -7.3680804984764769e-01 - 29 -6.1349194486996330e+00 -6.2045136916423638e-01 3.6501492663384533e-01 + 1 4.7146915162171821e-01 -1.4295710948423141e+00 6.1435623989040209e-03 + 2 -8.1188533070254898e-01 1.3335418049898284e+00 5.1008597216173526e-02 + 3 -1.8007626143934696e-01 -8.9625581784386277e-01 7.6271499732538509e-02 + 4 -4.2766629885045121e-01 7.1331588347962505e-01 8.9835431132857441e-02 + 5 -7.2273464774212781e-01 -2.1259955465285590e-01 -1.8401980719561145e-01 + 6 4.9932794364086694e-02 1.3421881560501545e+00 -1.4660788122030535e-01 + 7 5.2073898899475124e-01 9.2443975851178228e-01 9.1660644378494735e-02 + 8 1.7573439368754798e-01 5.2241353311824235e-01 3.9664460601801721e-01 + 9 -7.6048119894562516e-01 -1.2213148316694507e-01 2.3723430619629129e-01 + 10 4.3027850086640856e-01 -1.8463817772181979e-02 -7.0729575459069371e-01 + 11 -4.0608981166225111e-01 1.1414536918400635e-01 5.1917728145179509e-01 + 12 5.5709112609996655e-02 1.5146923589884401e-01 -8.3720962063300153e-01 + 13 1.0917160929005580e+00 4.1316910209090528e-02 5.7575748824439410e-01 + 14 -1.6956031467696719e-01 -4.8876005907032460e-01 8.1622239711676448e-01 + 15 -1.5955454290129462e-01 -9.4458143416169948e-01 -3.7151326449817529e-02 + 16 4.0147035470738285e-01 -7.3479501793237012e-01 2.2690239809441085e-02 + 17 -1.2223167182988551e-01 1.0695574104128276e-01 -6.7222119670736291e-01 + 18 -2.4563744123227402e-01 4.2007924593037760e-01 -1.6683842679107941e-01 + 19 -3.7491783478502932e-01 -3.5413986264640630e-02 9.2453058293424636e-02 + 20 5.2281068577317680e-01 -1.8876908235060278e-02 -2.3464746869032699e-01 + 21 -4.9475948922342611e-02 2.9155337872613513e-01 1.4788891022456038e-01 + 22 1.2494473355142388e-01 7.4876779183618153e-02 9.2384795300423414e-02 + 23 -3.6031471870765622e-02 2.6986586756578101e-01 2.5370181057460994e-01 + 24 -2.4649831279348036e-01 5.2679544526035116e-01 -4.6958598898879572e-02 + 25 3.7338144402568929e-01 -9.7532478169760095e-01 -1.8527019756098228e-02 + 26 4.5192097966850403e-01 -1.2774302000182343e-02 9.5759728022241794e-02 + 27 -7.8909511102612173e-01 -5.8760104824644954e-01 9.1169608243118726e-03 + 28 4.8059394233359004e-01 -2.1590316529216103e-01 -3.9310100709375234e-01 + 29 3.5123502427567771e-01 -1.3990463797047181e-01 -1.2937320890831427e-01 run_vdwl: 0 run_coul: 0 run_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 run_forces: ! |2 - 1 -6.3794761170362797e+00 1.0014050007655639e+00 1.1038908899542715e-01 - 2 -4.2917565714190200e+00 1.5032859261416123e+00 -2.3682233624430710e-01 - 3 -8.2073500812951714e+00 1.1713702854625513e-01 -3.4077419909840750e-01 - 4 -9.8911748277703975e+00 -7.9640456886270528e-02 -7.1479806383418054e-01 - 5 -8.4075721979806968e+00 -2.5655419911871775e-02 2.0973169384031953e-01 - 6 -5.1662204664221010e+00 -4.7288483570753725e-01 -6.6358389090683767e-01 - 7 -5.1556618728821935e+00 -6.8815638181860539e-01 -1.4868424147606212e+00 - 8 -1.3199450036122879e+00 -9.1927429716583575e-01 1.1197852020008769e-01 - 9 -8.6863331771202326e-03 -6.8820154797027466e-01 1.0031813721998930e+00 - 10 2.1198330559710414e+00 -1.3790719939414731e+00 1.6978551834043465e-01 - 11 6.0744997420034663e-01 -1.7132540945017130e+00 -6.6130292475572605e-01 - 12 6.1807018723467664e+00 -3.3443648070328580e-01 2.3995343925596185e-02 - 13 8.9239922416570376e+00 -2.8148649568997600e-02 4.8698040199910714e-01 - 14 4.1613933224791273e+00 -4.1128753524578959e-01 -9.3056594895345635e-01 - 15 6.5388776582330621e+00 3.1024618552803152e-01 2.2581698394911581e-01 - 16 4.4536651940319807e+00 -1.5284773061721311e+00 1.0670482566990316e+00 - 17 3.2214398614770494e+00 -1.5227123661352884e+00 1.5798379983865767e+00 - 18 2.2963076532445514e+00 1.4728793745109725e+00 -1.3278635988916623e+00 - 19 -1.4892019130130399e-01 1.1926845393134009e+00 -1.7729644618749920e+00 - 20 4.0097333951498788e+00 1.3491422225583067e+00 -1.0422026063121017e+00 - 21 6.7356891860556498e+00 -2.0514360614732452e-01 2.3763370150863697e-01 - 22 5.4944140818326614e+00 -5.2243494533316892e-01 -4.4025723209329121e-01 - 23 7.2111620066109481e+00 4.7211062306034157e-01 6.4198606290765858e-01 - 24 2.5535104770595738e+00 1.1037602721941646e+00 1.4983405995049637e+00 - 25 9.6377061926546645e-02 1.3527339069766595e+00 1.6394163127560981e+00 - 26 3.8074413552285966e+00 1.1626070538888325e+00 1.1147060236222321e+00 - 27 -6.3773422678008194e+00 -1.9467236040261920e-01 -1.3056613544698842e-01 - 28 -6.9226078114121012e+00 2.9508005636824414e-01 -7.3682489601150702e-01 - 29 -6.1352746553953184e+00 -6.1961991224019386e-01 3.6454083034889967e-01 + 1 4.7146249215470787e-01 -1.4286728911324664e+00 5.9247510427571535e-03 + 2 -8.1161490826449334e-01 1.3324273090833796e+00 5.1318150117710896e-02 + 3 -1.8006836004871105e-01 -8.9559927101104286e-01 7.6229648686188006e-02 + 4 -4.2765686223893024e-01 7.1255965368469654e-01 8.9483811767868252e-02 + 5 -7.2259990671507901e-01 -2.1289415617126431e-01 -1.8394972645398608e-01 + 6 4.9796542970424892e-02 1.3415200252313557e+00 -1.4632844435400277e-01 + 7 5.2061246302470421e-01 9.2406713416256048e-01 9.1830094467982265e-02 + 8 1.7575425718726292e-01 5.2187853675924600e-01 3.9696164295960562e-01 + 9 -7.6003762564702249e-01 -1.2217994238645402e-01 2.3748585825092289e-01 + 10 4.3003773037896720e-01 -1.8826756379902675e-02 -7.0733953950500239e-01 + 11 -4.0631569591421729e-01 1.1419704696488772e-01 5.1909188086981350e-01 + 12 5.5492734357036930e-02 1.5059182941096264e-01 -8.3724173210910380e-01 + 13 1.0926714184672788e+00 4.1791216785587365e-02 5.7564851861203514e-01 + 14 -1.6966464623895128e-01 -4.8718178521808442e-01 8.1630239895337020e-01 + 15 -1.5883812844513975e-01 -9.4374280966565982e-01 -3.7727453890703769e-02 + 16 4.0110965971127860e-01 -7.3458408815245746e-01 2.2810311634314111e-02 + 17 -1.2239784767387099e-01 1.0700991296777629e-01 -6.7201931781430491e-01 + 18 -2.4562359912342022e-01 4.1969849309432877e-01 -1.6677617877267276e-01 + 19 -3.7545284778521315e-01 -3.5774773452361061e-02 9.2774463010989489e-02 + 20 5.2293718875958484e-01 -1.8315347771610362e-02 -2.3453865738420243e-01 + 21 -4.9459727166953189e-02 2.9158945853099849e-01 1.4783908713063570e-01 + 22 1.2487210147255659e-01 7.5484104361371554e-02 9.1552788576811359e-02 + 23 -3.5979920519029006e-02 2.6942954155017279e-01 2.5407238066404786e-01 + 24 -2.4644976287016662e-01 5.2605365526794778e-01 -4.6702160203282647e-02 + 25 3.7328647765960316e-01 -9.7487940909199666e-01 -1.9432307066272300e-02 + 26 4.5156925969567291e-01 -1.2674445111513366e-02 9.5663012846130463e-02 + 27 -7.8912345316025423e-01 -5.8719473594673610e-01 9.1031742406403604e-03 + 28 4.8049629566594160e-01 -2.1599251069676242e-01 -3.9304000279453249e-01 + 29 3.5118467030643269e-01 -1.3978499566696054e-01 -1.2899645348375802e-01 ... diff --git a/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml b/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml index d2fe945845..8addec3570 100644 --- a/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml +++ b/unittest/force-styles/tests/kspace-ewald_disp_dipole.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 20:44:17 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 5e-12 skip_tests: extract gpu single prerequisites: ! | @@ -30,67 +30,67 @@ init_coul: 0 init_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 init_forces: ! |2 - 1 1.8161545040590614e+00 2.0805690002241701e+00 8.2983967603739284e-01 - 2 -1.0881968371971796e+01 7.3371979285516020e-01 -4.7839171817035314e-01 - 3 -8.0876262651374322e+00 9.2103380745213043e-02 -2.7560755523402031e-01 - 4 -1.0607482786888513e+01 -3.2082764964834026e-01 -6.6137102480516297e-01 - 5 -9.7788030513395086e+00 -1.4121844888694118e-01 -6.2958000329413986e-03 - 6 -1.6569350341955069e+01 -7.3778837100736450e-01 -1.1505763108052891e+00 - 7 5.1065173930064303e+00 -4.2157560003852773e-01 -1.4234408555222080e+00 - 8 9.9224059631527801e+00 -6.4683885413461706e-01 1.0031880338975343e+00 - 9 -7.8618615951092767e+00 -8.2280180210534271e-01 6.4793125769938864e-01 - 10 2.2194802047144466e-01 -1.4630404577261027e+00 1.0974068007565399e-01 - 11 -1.6708475580943973e+00 -1.8027546205450915e+00 -7.7505417447774971e-01 - 12 1.1502973205187178e+01 1.8611078630318650e-01 6.4878526105101386e-01 - 13 7.7407590935854209e+00 -2.9266950530840186e-01 3.4686013757550688e-01 - 14 1.9771354507001559e+00 -5.6222351545462912e-01 -1.1169897947372798e+00 - 15 4.4961313004297061e+00 2.6941867112732049e-01 1.5071410903714488e-01 - 16 -5.5750754249535710e+00 -2.7008358894134550e+00 7.5109207835498371e-01 - 17 1.3055808568576591e+01 -7.8795579349143541e-01 1.5573049728873616e+00 - 18 1.9281612695540346e+01 1.1537458303090271e+00 2.6430501822187397e-01 - 19 -8.8884160555436207e+00 9.0369418139836366e-01 -2.0688829247393117e+00 - 20 -3.1911264650458597e+00 2.1200174891455990e+00 -2.0534860916436761e+00 - 21 1.1544674316250926e+01 2.7736248979683009e+00 2.7603066284087623e+00 - 22 1.8948570251927412e+00 -1.8204271140082788e+00 -1.7285732035553496e+00 - 23 7.5451080526968690e+00 -1.1633863479849456e+00 -6.9617166397491903e-01 - 24 1.7090123035824977e+01 6.0386551941088407e-01 3.9627332291020417e-02 - 25 -8.2199481042167122e+00 1.1234334691809766e+00 1.7435126694450034e+00 - 26 -2.5549693637963902e+00 1.6367589770767825e+00 2.0242658791559829e+00 - 27 -4.0222808166046038e+00 -2.6500176615280457e+00 2.3870876229675893e+00 - 28 -5.8651168962944924e+00 1.8105347196240968e+00 -1.7584641077143275e+00 - 29 -9.4213355277234108e+00 8.4676491591243930e-01 -1.0712561316936238e+00 + 1 -2.6561518185117655e-01 -1.9420018305449676e+00 1.0392228756251773e-02 + 2 -7.6654814442687957e-02 1.8009038199316127e+00 2.7382346620116182e-03 + 3 -1.1610412475479578e-01 -8.0182240637196833e-01 6.8787515818332118e-02 + 4 -4.3115586576347487e-01 6.9898957428741304e-01 4.8671178707420583e-02 + 5 -5.9220640499701949e-01 -2.9767002973448098e-01 -2.3344153101953555e-01 + 6 1.4717273649127971e+00 -7.0175702177224408e-02 -2.9316271954565287e-01 + 7 -1.0686003948868212e+00 2.0233669543940400e+00 5.2457266583146450e-02 + 8 -1.7572394713503741e+00 2.1351079974646465e+00 5.1632951759631518e-01 + 9 7.5209032984913293e-01 -1.1382344107548379e+00 -2.0491634823639041e-02 + 10 6.0639487717511609e-01 -2.9231635661136435e-01 -6.6285057966534000e-01 + 11 4.1758339108595416e-02 -1.4011272913215281e-01 5.7115143195167473e-01 + 12 -1.0866582425464151e+00 8.1131471315792747e-01 -9.2223396634300059e-01 + 13 1.4210222006665059e+00 -1.6127026480494186e-01 5.9592936921250961e-01 + 14 2.3379152978771828e-01 -5.4577264309244400e-01 8.8194869504032791e-01 + 15 1.4362110249715077e-01 -1.0416346894747346e+00 -4.8356756553474024e-02 + 16 2.4144876405791358e+00 -2.3386785559672090e+00 -3.0136612735010387e-01 + 17 -1.9794120128087205e+00 1.8853849312161932e+00 9.4132767884066049e-02 + 18 -3.1869185698798801e+00 -2.7061406912013630e-01 6.0205406928375726e-01 + 19 1.2409686933618000e+00 4.0661576165352320e-01 -3.0305458316898642e-01 + 20 1.8219051573220095e+00 3.2490157836527944e-01 -4.7126223978618009e-01 + 21 -1.1058327206034999e+00 -1.3932336060834016e-01 -2.9354954145712773e+00 + 22 8.4944791683284659e-01 1.4878777291989581e-01 1.6735456661249686e+00 + 23 2.7709117742150569e-01 4.4018584437531000e-01 1.6101359599442289e+00 + 24 -2.5593624204184504e+00 -1.2004818089121581e+00 -7.2452591401016986e-01 + 25 1.4944730144026102e+00 4.5782811667407677e-02 3.1496988015839178e-01 + 26 1.4233146551531941e+00 9.6081116928899823e-01 4.7328367060122878e-01 + 27 -9.1679936665252970e-01 1.7719275223909456e+00 1.9633016293655159e+00 + 28 2.1306908383460332e-01 -1.4768718292029264e+00 -1.3423306899399565e+00 + 29 7.3739650805112844e-01 -1.5970997646033089e+00 -1.2212569249128271e+00 run_vdwl: 0 run_coul: 0 run_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 run_forces: ! |2 - 1 1.8169953633895561e+00 2.0808461650729537e+00 8.3041936373546843e-01 - 2 -1.0878054813594593e+01 7.3490952057898329e-01 -4.7808361477007555e-01 - 3 -8.0891337630280393e+00 9.2289454399877860e-02 -2.7592430573439752e-01 - 4 -1.0607226495334707e+01 -3.2121973075546556e-01 -6.6181844555801284e-01 - 5 -9.7795114334777562e+00 -1.4123109433426517e-01 -6.9653512939859309e-03 - 6 -1.6569327432011324e+01 -7.3761604768331035e-01 -1.1515786004602047e+00 - 7 5.1046360915521927e+00 -4.2176008468974424e-01 -1.4230323295733194e+00 - 8 9.9219450902555053e+00 -6.4702943691605719e-01 1.0044080630464101e+00 - 9 -7.8600031181485983e+00 -8.2349222764333285e-01 6.4758125333792238e-01 - 10 2.2195174154714353e-01 -1.4625405378942173e+00 1.0961271855984214e-01 - 11 -1.6727541499558802e+00 -1.8024427258355147e+00 -7.7606176252233550e-01 - 12 1.1502963069614021e+01 1.8623811664781245e-01 6.4927854355163195e-01 - 13 7.7456547920463441e+00 -2.9084078034427885e-01 3.4703491502728595e-01 - 14 1.9748668467647146e+00 -5.6318548644507771e-01 -1.1183076454338698e+00 - 15 4.4881694664947114e+00 2.6802064645991991e-01 1.5094672500274675e-01 - 16 -5.5758092590055623e+00 -2.6999762614596339e+00 7.5085665849128036e-01 - 17 1.3055662636942614e+01 -7.8782424382489413e-01 1.5582848236011495e+00 - 18 1.9280786989015635e+01 1.1554885612385097e+00 2.6429825674584151e-01 - 19 -8.8920126752258053e+00 9.0198849896384070e-01 -2.0689713182243463e+00 - 20 -3.1827952500825427e+00 2.1199150366707706e+00 -2.0527632343468181e+00 - 21 1.1548055725823801e+01 2.7708239267435171e+00 2.7605003009197651e+00 - 22 1.8896345638344842e+00 -1.8195498795819531e+00 -1.7287912309008906e+00 - 23 7.5449375723760363e+00 -1.1625668704424199e+00 -6.9574863550087018e-01 - 24 1.7090373157346892e+01 6.0360593740203949e-01 3.9871055831725552e-02 - 25 -8.2149622840991974e+00 1.1236497843086952e+00 1.7447856303284364e+00 - 26 -2.5591359187212634e+00 1.6359744609968121e+00 2.0244050677241399e+00 - 27 -4.0238603703928533e+00 -2.6502739043440280e+00 2.3874825361707104e+00 - 28 -5.8637000655529770e+00 1.8102871636069633e+00 -1.7593576520985350e+00 - 29 -9.4183460783725810e+00 8.4751203910349304e-01 -1.0723617856566923e+00 + 1 -2.6534495063379343e-01 -1.9401330265469534e+00 1.0653278413744957e-02 + 2 -7.6630676317488322e-02 1.7996387293173730e+00 3.3337225170220891e-03 + 3 -1.1614482334659879e-01 -8.0080222346209162e-01 6.8574255420264144e-02 + 4 -4.3127572502199130e-01 6.9805546967773147e-01 4.7938846006429885e-02 + 5 -5.9190232268271614e-01 -2.9800079900966259e-01 -2.3372535104260903e-01 + 6 1.4709650855226801e+00 -7.0706042811931144e-02 -2.9414807010497612e-01 + 7 -1.0682898972605743e+00 2.0223695168254499e+00 5.4019236952934813e-02 + 8 -1.7566311333788607e+00 2.1339051186765055e+00 5.1811154012171767e-01 + 9 7.5218718109525640e-01 -1.1380545093906598e+00 -2.1473979869412171e-02 + 10 6.0604209024795519e-01 -2.9305025501721416e-01 -6.6338335831865669e-01 + 11 4.1615008019359551e-02 -1.3955912485152533e-01 5.7131672285993529e-01 + 12 -1.0864964090937801e+00 8.0931233929800728e-01 -9.2185354841016964e-01 + 13 1.4213858142064029e+00 -1.6046657018255733e-01 5.9554820071163672e-01 + 14 2.3368537682049792e-01 -5.4313851038503691e-01 8.8213230834556056e-01 + 15 1.4440791782502588e-01 -1.0405530080422838e+00 -4.9259829491534075e-02 + 16 2.4136282206595085e+00 -2.3373858185703802e+00 -3.0326721950548452e-01 + 17 -1.9788922257090289e+00 1.8839928930501746e+00 9.6208673329344518e-02 + 18 -3.1849986247721112e+00 -2.6746725682907557e-01 6.0230338979513753e-01 + 19 1.2403666775380491e+00 4.0496046064751301e-01 -3.0248013026868387e-01 + 20 1.8202594907858962e+00 3.2343505764762459e-01 -4.7177160096128379e-01 + 21 -1.1061750127661441e+00 -1.4240624408926714e-01 -2.9341167697361135e+00 + 22 8.4954491307457358e-01 1.5102034780598456e-01 1.6720730655509644e+00 + 23 2.7695069031824615e-01 4.4156005487711703e-01 1.6105518862631272e+00 + 24 -2.5580464279412545e+00 -1.2011981036473429e+00 -7.2432818369358343e-01 + 25 1.4942274908487030e+00 4.5175993693303745e-02 3.1394175948675584e-01 + 26 1.4225935109097099e+00 9.6052147747340633e-01 4.7315349713114208e-01 + 27 -9.1598197958065852e-01 1.7718288128329616e+00 1.9638505188284343e+00 + 28 2.1253702450308351e-01 -1.4764188590074996e+00 -1.3427918873660771e+00 + 29 7.3641371613005091e-01 -1.5964359199796749e+00 -1.2211109729655727e+00 ... diff --git a/unittest/force-styles/tests/kspace-pppm_dipole.yaml b/unittest/force-styles/tests/kspace-pppm_dipole.yaml index b4e77d5708..76c6516f51 100644 --- a/unittest/force-styles/tests/kspace-pppm_dipole.yaml +++ b/unittest/force-styles/tests/kspace-pppm_dipole.yaml @@ -1,8 +1,8 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 20:37:38 2021 +date_generated: Sat Aug 21 20:49:01 2021 epsilon: 5e-12 -skip_tests: gpu single extract +skip_tests: extract gpu single prerequisites: ! | atom full atom sphere @@ -31,67 +31,67 @@ init_coul: 0 init_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 init_forces: ! |2 - 1 -6.3805358365027622e+00 1.0012042613092100e+00 1.1045002811720689e-01 - 2 -4.2965350961202908e+00 1.5020764076251609e+00 -2.3799604053624657e-01 - 3 -8.2063438482674780e+00 1.1686015334197719e-01 -3.4066510308974446e-01 - 4 -9.8912585098174191e+00 -7.9245099087574863e-02 -7.1447161487948030e-01 - 5 -8.4066310439065361e+00 -2.5771124825315763e-02 2.1001261893610784e-01 - 6 -5.1656936444842341e+00 -4.7344595409327650e-01 -6.6395541913315437e-01 - 7 -5.1553700801611599e+00 -6.8817448730918829e-01 -1.4869547145654336e+00 - 8 -1.3200481718020149e+00 -9.1923515232628128e-01 1.1188655744939495e-01 - 9 -1.0207290954110351e-02 -6.8754964741819191e-01 1.0028752367004619e+00 - 10 2.1197739446149431e+00 -1.3795086488978878e+00 1.6975960722025565e-01 - 11 6.0931767572689643e-01 -1.7133364907674298e+00 -6.6055557694588607e-01 - 12 6.1802389677596974e+00 -3.3469795667558327e-01 2.4240375324555221e-02 - 13 8.9206185137157092e+00 -2.9731063130709633e-02 4.8671146040352475e-01 - 14 4.1636718122955987e+00 -4.1050918761100558e-01 -9.2955242693905782e-01 - 15 6.5456498527546669e+00 3.1128764687221688e-01 2.2560993518583913e-01 - 16 4.4545467918156811e+00 -1.5285786805244670e+00 1.0667134424689115e+00 - 17 3.2211757688846316e+00 -1.5229546320844545e+00 1.5797718927571085e+00 - 18 2.2978532779714858e+00 1.4731179475378802e+00 -1.3277205887412058e+00 - 19 -1.4774234711323067e-01 1.1930262539699554e+00 -1.7730294415794705e+00 - 20 4.0051904718935498e+00 1.3498888254217831e+00 -1.0437450760166322e+00 - 21 6.7359110652889500e+00 -2.0509666875198637e-01 2.3816624349582471e-01 - 22 5.4960114108541447e+00 -5.2168457553718139e-01 -4.3991041660178920e-01 - 23 7.2115084006519261e+00 4.7232729809480084e-01 6.4199721914726260e-01 - 24 2.5537922547761678e+00 1.1036461042849897e+00 1.4985585857549020e+00 - 25 9.0940245036958800e-02 1.3535663945567040e+00 1.6392741308543988e+00 - 26 3.8102220441050907e+00 1.1627176362205849e+00 1.1144483723313934e+00 - 27 -6.3774137790554413e+00 -1.9477752067799528e-01 -1.3012527712914013e-01 - 28 -6.9237292947884992e+00 2.9502709876738664e-01 -7.3680805805554495e-01 - 29 -6.1349135551729201e+00 -6.2044913828412185e-01 3.6501404806563809e-01 + 1 4.7146930800839842e-01 -1.4295721707080535e+00 6.1440432873051815e-03 + 2 -8.1188458367634553e-01 1.3335469911554523e+00 5.1008440590008322e-02 + 3 -1.8007648470592788e-01 -8.9625682271105922e-01 7.6272128111565127e-02 + 4 -4.2766728566513867e-01 7.1331582701074558e-01 8.9835644152527885e-02 + 5 -7.2273534167050268e-01 -2.1259863388511696e-01 -1.8401915187446424e-01 + 6 4.9933409326591363e-02 1.3421864745519234e+00 -1.4660920753194528e-01 + 7 5.2073856627222448e-01 9.2443850460942845e-01 9.1660870662325991e-02 + 8 1.7573501049851470e-01 5.2241302212132035e-01 3.9664475585621856e-01 + 9 -7.6047847962935367e-01 -1.2213147963079042e-01 2.3723520546986454e-01 + 10 4.3027575067324031e-01 -1.8466347024241259e-02 -7.0729543966652098e-01 + 11 -4.0608867551160988e-01 1.1414678848494038e-01 5.1917337176167611e-01 + 12 5.5709014639010436e-02 1.5147011453897752e-01 -8.3720905430398662e-01 + 13 1.0917127873181816e+00 4.1316644219788430e-02 5.7575684712862329e-01 + 14 -1.6956001834714785e-01 -4.8876183269084328e-01 8.1622278091578804e-01 + 15 -1.5955520314326271e-01 -9.4458187388740700e-01 -3.7149332560766239e-02 + 16 4.0147267651727636e-01 -7.3479510634758005e-01 2.2689946424796222e-02 + 17 -1.2223159352955358e-01 1.0695526484775031e-01 -6.7222520636466898e-01 + 18 -2.4563664773683083e-01 4.2008154124373404e-01 -1.6683955302572581e-01 + 19 -3.7491701157830593e-01 -3.5413072439257239e-02 9.2453381336082857e-02 + 20 5.2281117865792837e-01 -1.8879738909487014e-02 -2.3464859039947292e-01 + 21 -4.9476267263632683e-02 2.9155472324242843e-01 1.4788912046869021e-01 + 22 1.2494446629578382e-01 7.4876301760901584e-02 9.2385685028064726e-02 + 23 -3.6030905557854445e-02 2.6986531644554707e-01 2.5370377015607143e-01 + 24 -2.4649981168118401e-01 5.2679842529366705e-01 -4.6958353076667889e-02 + 25 3.7338170623411954e-01 -9.7532720461839051e-01 -1.8527429903505258e-02 + 26 4.5192128231355483e-01 -1.2775656856661363e-02 9.5760254316748505e-02 + 27 -7.8909616758868628e-01 -5.8759937020323727e-01 9.1169323952227238e-03 + 28 4.8059402460851830e-01 -2.1590295593921377e-01 -3.9310094981457672e-01 + 29 3.5123529592199454e-01 -1.3990367367526577e-01 -1.2937090953927879e-01 run_vdwl: 0 run_coul: 0 run_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 run_forces: ! |2 - 1 -6.3794670713051396e+00 1.0014057765209496e+00 1.1039070119266108e-01 - 2 -4.2917583215983059e+00 1.5032840536381384e+00 -2.3682082896276035e-01 - 3 -8.2073526552603404e+00 1.1713693941301162e-01 -3.4077340500928732e-01 - 4 -9.8911774679667364e+00 -7.9641889932201296e-02 -7.1479836041918843e-01 - 5 -8.4075720502648892e+00 -2.5656340231007144e-02 2.0973174669137851e-01 - 6 -5.1662223893410557e+00 -4.7288411156728155e-01 -6.6358413361213364e-01 - 7 -5.1556592068168756e+00 -6.8815731088937615e-01 -1.4868399421082457e+00 - 8 -1.3199409629055094e+00 -9.1927247607124507e-01 1.1198017565223027e-01 - 9 -8.6839526360140765e-03 -6.8820125926516185e-01 1.0031809621952430e+00 - 10 2.1198387771895493e+00 -1.3790716135879908e+00 1.6978530323785193e-01 - 11 6.0743978295630208e-01 -1.7132532349353555e+00 -6.6130548345257012e-01 - 12 6.1807007279040054e+00 -3.3443741259132764e-01 2.3995163438530760e-02 - 13 8.9239871531255197e+00 -2.8151386051136287e-02 4.8697925460570501e-01 - 14 4.1613858872169462e+00 -4.1128735538300232e-01 -9.3056809863371248e-01 - 15 6.5388779802122068e+00 3.1024617818216560e-01 2.2581538536089366e-01 - 16 4.4536630829164050e+00 -1.5284770413213327e+00 1.0670479730226936e+00 - 17 3.2214346381278829e+00 -1.5227138337682848e+00 1.5798376713141347e+00 - 18 2.2963115484881533e+00 1.4728793967268368e+00 -1.3278637286680524e+00 - 19 -1.4893042098132542e-01 1.1926852178770355e+00 -1.7729649420475160e+00 - 20 4.0097381511983023e+00 1.3491416760166850e+00 -1.0422008556274691e+00 - 21 6.7356870222610778e+00 -2.0514349696348458e-01 2.3763337801425341e-01 - 22 5.4944170998698718e+00 -5.2243392478981421e-01 -4.4025641685875266e-01 - 23 7.2111589530597735e+00 4.7211069841464914e-01 6.4198669117223706e-01 - 24 2.5535149279358502e+00 1.1037598225426664e+00 1.4983403819560210e+00 - 25 9.6382396316406244e-02 1.3527345080357760e+00 1.6394156717006976e+00 - 26 3.8074331740275631e+00 1.1626077926858638e+00 1.1147069501981408e+00 - 27 -6.3773358185998346e+00 -1.9467213397745334e-01 -1.3056625652950193e-01 - 28 -6.9226022138801095e+00 2.9508044255970062e-01 -7.3682490917827204e-01 - 29 -6.1352687712496827e+00 -6.1961768128802408e-01 3.6453995135478745e-01 + 1 4.7146265291011286e-01 -1.4286739619310602e+00 5.9252336794066839e-03 + 2 -8.1161416724738378e-01 1.3324325094138352e+00 5.1317998121986300e-02 + 3 -1.8006858080910332e-01 -8.9560028211779141e-01 7.6230272234456734e-02 + 4 -4.2765785068983425e-01 7.1255961227696751e-01 8.9484014649986107e-02 + 5 -7.2260060803733905e-01 -2.1289324004186444e-01 -1.8394908300706178e-01 + 6 4.9797155776302608e-02 1.3415183685341998e+00 -1.4632977306616299e-01 + 7 5.2061203799056222e-01 9.2406589232063452e-01 9.1830322851661289e-02 + 8 1.7575486607016719e-01 5.2187802765547331e-01 3.9696180433250983e-01 + 9 -7.6003490585426803e-01 -1.2217994469726692e-01 2.3748674633250763e-01 + 10 4.3003497451140943e-01 -1.8829285078602036e-02 -7.0733922963458917e-01 + 11 -4.0631455291515178e-01 1.1419847080799683e-01 5.1908797972583820e-01 + 12 5.5492644448155062e-02 1.5059271774153810e-01 -8.3724116938445592e-01 + 13 1.0926681176109192e+00 4.1790955435565623e-02 5.7564787485990110e-01 + 14 -1.6966435472490746e-01 -4.8718355722172652e-01 8.1630279430227370e-01 + 15 -1.5883880663830841e-01 -9.4374327627800803e-01 -3.7725438802450530e-02 + 16 4.0111199016973159e-01 -7.3458417886895844e-01 2.2810010951160049e-02 + 17 -1.2239776297284811e-01 1.0700944203633105e-01 -6.7202332216909488e-01 + 18 -2.4562280290088206e-01 4.1970078136485128e-01 -1.6677730599774215e-01 + 19 -3.7545201332957207e-01 -3.5773849887951077e-02 9.2774786738501647e-02 + 20 5.2293768132520224e-01 -1.8318185228890581e-02 -2.3453977555438676e-01 + 21 -4.9460049875268565e-02 2.9159081279005755e-01 1.4783928423012241e-01 + 22 1.2487183198905445e-01 7.5483622910994461e-02 9.1553705511144085e-02 + 23 -3.5979348911194746e-02 2.6942897617945138e-01 2.5407431952395165e-01 + 24 -2.4645126790134830e-01 5.2605660742880467e-01 -4.6701920209195683e-02 + 25 3.7328674153258534e-01 -9.7488183051172828e-01 -1.9432722879541914e-02 + 26 4.5156956872454779e-01 -1.2675795807192339e-02 9.5663549972410111e-02 + 27 -7.8912451567372077e-01 -5.8719306623948897e-01 9.1031414062004695e-03 + 28 4.8049638304312681e-01 -2.1599230474425982e-01 -3.9303995352472332e-01 + 29 3.5118494237925202e-01 -1.3978403824190910e-01 -1.2899414519461275e-01 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml index d4fc06ba64..64cf43dabf 100644 --- a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_cut.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 19:22:50 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 2e-13 skip_tests: prerequisites: ! | @@ -26,71 +26,71 @@ extract: ! | cut_coul 2 natoms: 29 init_vdwl: 749.2372261744105 -init_coul: -215.46996777645347 +init_coul: -115.56185911209866 init_stress: ! |2- - 2.6201477421722402e+03 1.7878993283727934e+03 4.2135405703065144e+03 -4.6536224816043256e+02 -7.9729626294548083e+01 6.9790208302160386e+02 + 2.1161025413077055e+03 2.4187955807681415e+03 4.4550457974891324e+03 -8.1888765431297963e+02 1.0695978501084858e+02 6.9904389713599676e+02 init_forces: ! |2 - 1 -6.5581092166522225e+01 2.8790967101864624e+02 3.0556163752989789e+02 - 2 1.9955296046408944e+02 1.1064549771529568e+02 -2.0125790734414912e+02 - 3 -1.6744118162880952e+02 -3.8376338360683457e+02 -2.9964838924549127e+02 - 4 -1.4682240238095135e+01 -3.8004339269592286e+01 8.1070341235141143e+01 - 5 -6.2874688511845378e+01 -7.3633283028576628e+01 4.7727367282374829e+01 - 6 -7.9556621766240244e+02 8.7830188014660803e+02 1.2035546934848351e+03 - 7 1.0134777271895786e+02 -3.5860327807585202e+02 -1.7447020913752892e+03 - 8 9.7221783816473788e+01 -5.0106384903360045e+01 2.6415488395239208e+02 - 9 1.7665414834784158e+01 1.2626191606389457e+02 3.8334906733439880e+02 - 10 5.8561911471237136e+02 -5.3125644133812534e+02 -1.6629272523434770e+02 - 11 -4.9009451817709930e+01 -2.1456208542340015e+01 -7.0514088309780405e+01 - 12 1.4341511826889621e+02 -1.1687815372779096e+02 2.6997394253161165e+01 - 13 -7.3801132809376895e+01 7.8643634163516467e+01 1.1808429156407279e+01 - 14 -6.1546940173885865e+01 7.5306833231004333e+00 1.6546194983110425e+01 - 15 -3.9667266067375031e+01 3.2220533476805343e+01 8.1440434248102406e+01 - 16 5.0531694076551270e+02 -3.6319735450279410e+02 -1.2090960999385989e+03 - 17 -4.1343115501384796e+02 3.3417023069608859e+02 1.2514132191499448e+03 - 18 3.7676277384630737e+01 -2.8362377908248146e+01 -8.2290015884114837e+01 - 19 -8.2023723738127288e+01 1.0006538535804265e+02 9.5626037410293023e+01 - 20 7.0954555101071264e+01 -3.5627922439241615e+01 -1.0696847475399830e+01 - 21 2.9123476275164890e+01 3.6242807280278111e+00 1.1599497378533388e+02 - 22 -1.6872980439818326e+02 1.4634805992778700e+01 -4.8878571346457221e+01 - 23 1.7807079056360166e+02 -4.5496210146873519e+00 -5.3780304803625910e+01 - 24 -3.2441431343135569e+01 -2.0170145101120073e+02 -7.9942827082079063e+01 - 25 -1.1847139531919895e+02 3.0848903120387661e+01 1.0566501896756124e+02 - 26 1.8496783031500885e+02 1.8444462021364646e+02 -7.8872189685221281e+00 - 27 -6.1177599339393907e+01 -1.0891181275941133e+02 -6.0417413568062088e+01 - 28 -1.1216903376348023e+02 9.1434568489551147e+00 7.3371950240010179e+01 - 29 1.6768231877082690e+02 1.1760651326226129e+02 -2.8877142437046142e+01 -run_vdwl: 746.2462108249126 -run_coul: -217.0811470535041 + 1 -5.2947642305542864e+01 3.5059583281190999e+02 3.0455580530176985e+02 + 2 1.8948179115097341e+02 5.7159911247789260e+01 -1.4579285152177178e+02 + 3 -9.7138803082436837e+01 -3.7302057649912553e+02 -2.1162770834876693e+02 + 4 -1.3663190244397313e+01 3.6017209594952284e+01 -5.5904143317123427e+01 + 5 -5.1022094240456120e+01 -6.8823389941359480e+01 1.0157721005174324e+02 + 6 -7.9342799728681928e+02 9.6051769013481612e+02 1.1171474214420291e+03 + 7 1.1592116886167440e+02 -3.0467134188438968e+02 -1.6725682791395773e+03 + 8 8.8336394372266682e+01 -4.6650744936998354e+00 5.3291454288068371e+02 + 9 1.1951014412905155e+02 3.8049166798148621e+00 1.6247141846252987e+02 + 10 4.9929716185343909e+02 -5.7030645625085981e+02 -1.1091629587832915e+02 + 11 -1.8205888460892123e+01 -5.5233460348996331e+01 -5.7573375489845752e+01 + 12 4.0331053813353293e+01 -1.5537466197977771e+01 -1.1206152664762794e+02 + 13 -3.4453096291789429e+01 -2.8003771690289767e+01 7.2556086397560304e-01 + 14 1.3246369416491259e+01 -3.0095691207957799e+01 5.2468393897531399e+01 + 15 -8.1769850757685170e+00 5.9654338530923134e+01 1.1754933192967982e+02 + 16 4.5085314371173780e+02 -3.2221443267014661e+02 -1.1217614862074872e+03 + 17 -4.4790186773207273e+02 3.0208692997961884e+02 1.1189133138063780e+03 + 18 1.2970299025640594e+02 1.2757606348329033e+02 1.3904916065482311e+02 + 19 -5.9364957961559973e+01 1.4532116607100299e+01 -7.6985953936923650e+01 + 20 -6.9451900544345747e+01 -1.3145527051782526e+02 -7.4833408114087035e+01 + 21 -7.8971293843203625e+01 -1.4344053539041863e+02 1.9922520980622110e+02 + 22 -1.5299796255088060e+02 -3.4332306888984469e+01 -1.6131379246090370e+02 + 23 2.3280138941458188e+02 1.7322830921562206e+02 -4.9298030559345548e+01 + 24 -1.2541910953293572e+02 -3.1516603900609476e+02 1.2478045108514044e+01 + 25 -6.2201285724132148e+01 -4.2926133948103740e+01 -1.9912598458045903e+01 + 26 1.8775843965719872e+02 3.5660405558870633e+02 1.1009723847718986e+01 + 27 2.1229580983949188e+02 -2.4997231543484259e+02 1.6136799943815947e+02 + 28 -2.7253705973372314e+02 9.6945133149152980e+01 -1.7898790334429347e+02 + 29 5.8345278134290496e+01 1.5114175534737529e+02 1.8084215932370657e+01 +run_vdwl: 746.0703450692324 +run_coul: -115.77478938966894 run_stress: ! |2- - 2.6183978655374117e+03 1.7854954987269102e+03 4.1773534305550402e+03 -4.6574369880377157e+02 -8.1181204292614396e+01 6.9724661631292486e+02 + 2.1128577047795729e+03 2.4153581489420362e+03 4.4226574593952964e+03 -8.1776931475121660e+02 1.0606772050857766e+02 7.0132876973689270e+02 run_forces: ! |2 - 1 -6.2166839556442937e+01 2.8986501154843847e+02 3.0173952160931310e+02 - 2 1.9631694562203893e+02 1.0858596566529263e+02 -1.9726194554267187e+02 - 3 -1.6763176143580696e+02 -3.8374593504399382e+02 -2.9941238716442774e+02 - 4 -1.4709613019625342e+01 -3.7961039104571839e+01 8.0951443391910047e+01 - 5 -6.2760117657627617e+01 -7.3444779063948857e+01 4.7537859095103030e+01 - 6 -7.8996457208465574e+02 8.7198746349093858e+02 1.1869397029835670e+03 - 7 1.0065517595184686e+02 -3.5565911067048978e+02 -1.7240046995776238e+03 - 8 9.3181453115771944e+01 -4.3047624009005197e+01 2.6974219388638261e+02 - 9 1.5186769584941434e+01 1.2362301435212208e+02 3.7436614934823007e+02 - 10 5.8664393856638014e+02 -5.3269905287906545e+02 -1.6724470537443557e+02 - 11 -4.8889381866218557e+01 -2.1274252617657659e+01 -7.0006558800629961e+01 - 12 1.4402217942313882e+02 -1.1655122412105953e+02 2.6591368070904235e+01 - 13 -7.4210536821499772e+01 7.8535220650134519e+01 1.1774917588964787e+01 - 14 -6.0945811011324871e+01 7.6169993474339384e+00 1.6707026675974184e+01 - 15 -4.0152284442013197e+01 3.1918490260565530e+01 8.1441912305574050e+01 - 16 5.0482413279368535e+02 -3.6349119913496349e+02 -1.2086255122037562e+03 - 17 -4.1289147731837835e+02 3.3456330805867543e+02 1.2508733726965099e+03 - 18 3.8424833859036056e+01 -2.8983726749549888e+01 -8.2889605927198545e+01 - 19 -8.1865687463431243e+01 1.0038042325741871e+02 9.6105762836336510e+01 - 20 7.0108251616425932e+01 -3.5322348990136838e+01 -1.0577655711839213e+01 - 21 2.9135323901877978e+01 4.0084924583559314e+00 1.1492805247432594e+02 - 22 -1.6862925376573318e+02 1.4472495296362101e+01 -4.8164826334710632e+01 - 23 1.7793536003794964e+02 -4.7731405425939535e+00 -5.3427031657552149e+01 - 24 -2.9577816968010218e+01 -2.0332154289832820e+02 -7.8528045293575261e+01 - 25 -1.2236095962841648e+02 3.1350722926330402e+01 1.0375474002670626e+02 - 26 1.8598968725807586e+02 1.8554789269657357e+02 -7.3912113601707734e+00 - 27 -5.9963564320050750e+01 -1.0864816769388554e+02 -6.0331964774009975e+01 - 28 -1.1286034653317385e+02 9.2388959748268196e+00 7.3116588451121657e+01 - 29 1.6715597216124019e+02 1.1722874753578131e+02 -2.8704461718321827e+01 + 1 -5.0468016286881173e+01 3.5175051590465978e+02 3.0153077283803606e+02 + 2 1.8719892173764617e+02 5.5931484399978231e+01 -1.4278977373038239e+02 + 3 -9.7813103781184481e+01 -3.7288513938148117e+02 -2.1140196386195237e+02 + 4 -1.3287622491108550e+01 3.5892417845877610e+01 -5.5763936625150492e+01 + 5 -5.0876600790558889e+01 -6.8715169539365291e+01 1.0126276616912898e+02 + 6 -7.8770325910174097e+02 9.5402537399119717e+02 1.1012907529213787e+03 + 7 1.1527370771879073e+02 -3.0199786607587583e+02 -1.6525099031583482e+03 + 8 8.3094489922974915e+01 1.0828324655152546e+00 5.3331802021892770e+02 + 9 1.1843252298093563e+02 2.9339476889031326e+00 1.5828642081083467e+02 + 10 5.0080550021117642e+02 -5.7193704671948262e+02 -1.1203816921510494e+02 + 11 -1.8443681019537763e+01 -5.4822095903248780e+01 -5.7031904285818726e+01 + 12 4.0417261319238158e+01 -1.5155043445324038e+01 -1.1190778708413112e+02 + 13 -3.4264329367606436e+01 -2.8137387799098661e+01 4.9469492655546449e-01 + 14 1.3366313672540647e+01 -2.9785297074732348e+01 5.2479215291702936e+01 + 15 -8.5899755506278748e+00 5.9140947850973049e+01 1.1777894141592017e+02 + 16 4.5058101476254166e+02 -3.2251852379617799e+02 -1.1215581589866722e+03 + 17 -4.4765958969645737e+02 3.0243885015892744e+02 1.1186460335765803e+03 + 18 1.2960369514058246e+02 1.2669919552491230e+02 1.3896100883054982e+02 + 19 -5.9998243800714981e+01 1.4234068160081407e+01 -7.7243049274762086e+01 + 20 -6.8735241898349102e+01 -1.3026279192320581e+02 -7.4470420313712978e+01 + 21 -7.8528225749621726e+01 -1.4199615901909851e+02 1.9725176289718902e+02 + 22 -1.5281496312625384e+02 -3.4716204873755011e+01 -1.6016035728540731e+02 + 23 2.3217369122898603e+02 1.7217306020324023e+02 -4.8466954822780835e+01 + 24 -1.2192559798626465e+02 -3.1534440336744331e+02 1.4209601592659549e+01 + 25 -6.5202120595551051e+01 -4.2284612208662622e+01 -2.2428444683797039e+01 + 26 1.8726203714229709e+02 3.5613808068234732e+02 1.1789299082698571e+01 + 27 2.1078884664183718e+02 -2.4893858829765711e+02 1.5959062399358152e+02 + 28 -2.7070095794445820e+02 9.6004954387952310e+01 -1.7729110964320077e+02 + 29 5.8013526707370019e+01 1.5105060016004401e+02 1.8172018405478379e+01 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml index c39d645961..4bad876133 100644 --- a/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_cut_dipole_long.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 19:22:50 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 2.5e-09 skip_tests: gpu prerequisites: ! | @@ -34,71 +34,71 @@ extract: ! | ewald_mix 0 natoms: 29 init_vdwl: 749.2372261744105 -init_coul: -765.7216219373037 +init_coul: 66.65064075576207 init_stress: ! |2- - 1.9436630368145486e+03 1.4514070555446594e+03 4.1943857214331510e+03 -5.7732497199818658e+02 1.7627899282943837e+01 7.3293055810920964e+02 + 2.1474767807376115e+03 2.4621525916161690e+03 4.5633637826207050e+03 -7.7984661061027043e+02 6.6437959884399433e+01 6.8605103799781011e+02 init_forces: ! |2 - 1 -6.6325744461630961e+01 3.0037629013182396e+02 2.8298667386589261e+02 - 2 2.2126793666827646e+02 8.7414578011553346e+01 -1.5782367579470306e+02 - 3 -1.3854732166887879e+02 -3.9037869363775172e+02 -2.9815467444165444e+02 - 4 5.5337530341142882e+00 -3.5587014032418274e+01 8.0163319839961460e+01 - 5 -3.0782522782134073e+01 -7.9334931956058696e+01 5.1064735094583277e+01 - 6 -7.9465795411537135e+02 9.3108677871304076e+02 1.2151392855093018e+03 - 7 1.3479057388185871e+02 -3.9285491644478151e+02 -1.7294352228532521e+03 - 8 1.0138432779274672e+02 -8.7854149227322523e+01 2.5840998550337196e+02 - 9 5.2374775022845370e+01 1.6991485760449464e+02 3.6702113722473320e+02 - 10 5.7942396057684232e+02 -5.1773741839622653e+02 -1.6407902891205467e+02 - 11 -4.3342420632187135e+01 -1.4536830515196753e-01 -6.5701263699668090e+01 - 12 1.2437488858014615e+02 -1.2708067053643420e+02 1.5660782314417842e+01 - 13 -1.1541678545405667e+02 9.0266848145725731e+01 1.0812091946949954e+01 - 14 -8.7480812472983658e+01 1.6184547145740286e+01 1.9097990397801627e+01 - 15 -5.4682293939698255e+01 2.3936828459781925e+01 7.3605016968149073e+01 - 16 5.2009690615914690e+02 -3.2886762825465757e+02 -1.2015403510740541e+03 - 17 -4.5637175524544244e+02 3.0302031594173809e+02 1.2418681765632286e+03 - 18 7.0333832268683114e+00 4.0052732323628931e+01 -7.9875170652329700e+01 - 19 -6.4583111418059502e+01 6.9167384752109399e+01 5.6898855482775403e+01 - 20 6.8042950791932441e+01 -9.7875006217217788e+01 2.9905322910753714e+01 - 21 4.8854700567877842e+01 3.6799431021790667e+01 1.3373381517556700e+02 - 22 -1.6352965807148956e+02 1.7011001069339844e+01 -9.9752659826336142e+01 - 23 1.2267890613966252e+02 -4.1203994222104392e+01 -2.2195283929327644e+01 - 24 -3.7399140818029331e+01 -1.6346830325427734e+02 -3.5582213327349939e+00 - 25 -1.3808231643675967e+02 3.4648415027412625e+01 2.1135786203059418e+01 - 26 1.9347932471938313e+02 1.2806726144790011e+02 -2.2502284392610317e+01 - 27 -5.9698734188395122e+00 -7.6688049371318414e+01 -4.3466379984340175e+00 - 28 -1.4540221424093897e+02 3.7391865524266137e+01 2.4336357977303802e+01 - 29 1.6323753801479879e+02 5.3737008535374322e+01 -3.2874858070690287e+01 -run_vdwl: 746.2718524175359 -run_coul: -766.8349504887466 + 1 -4.6375618115170305e+01 3.6065356711916911e+02 3.0803379417352232e+02 + 2 1.8976878625731271e+02 5.8277101170191386e+01 -1.5574009841191969e+02 + 3 -9.4292736260791273e+01 -3.7185069836299692e+02 -2.0901928644638804e+02 + 4 -1.3855107820162232e+01 2.6945695752158148e+01 -6.0309830574713978e+01 + 5 -5.0128991371301453e+01 -6.7283379828352480e+01 9.8116595675035640e+01 + 6 -7.7949201015233450e+02 9.5078549205949878e+02 1.1633750746187511e+03 + 7 1.0911230379596401e+02 -3.0213315968926469e+02 -1.6996554869403103e+03 + 8 6.9072483167805089e+01 -2.1639192148915029e+01 4.9586235609341117e+02 + 9 1.2048735277290527e+02 1.4434071177582654e+01 2.0104434607842774e+02 + 10 4.9852549900384088e+02 -5.6227327996558654e+02 -1.0095986469480168e+02 + 11 -9.5854675029151366e+00 -6.6674650511298310e+01 -7.3374206204822627e+01 + 12 3.2101752367554219e+01 -8.5604204356168854e+00 -1.0501947565681559e+02 + 13 -3.2067095638045963e+01 -2.9441505605874916e+01 -1.6300814742840235e+00 + 14 7.2896674683432794e+00 -3.6851806041808565e+01 4.5280383253367525e+01 + 15 -1.0839308324646334e+01 6.8994725204909798e+01 1.1143232962944258e+02 + 16 4.5782495487127170e+02 -3.2134943353537989e+02 -1.1433169513163809e+03 + 17 -4.4965859794463529e+02 3.0845665001706959e+02 1.1360644033244944e+03 + 18 1.0087486858624091e+02 6.7450982673857808e+01 1.2635690806289033e+02 + 19 -7.1459505875589002e+01 1.3924715603469842e+01 -4.5338825759160187e+01 + 20 -2.5670169816046492e+01 -7.6437554565775415e+01 -8.4803973289531640e+01 + 21 -6.9874160098377061e+01 -1.0441899200859832e+02 2.4344561156482885e+02 + 22 -1.6143492146631789e+02 -5.4257945861800081e+01 -1.7051129900931775e+02 + 23 2.3270933037151514e+02 1.5541290213069414e+02 -8.1441123078517293e+01 + 24 -1.0999205767813606e+02 -3.3882968761198254e+02 4.9601182978097555e+01 + 25 -8.0002878753178209e+01 -3.9623741521707046e+01 -4.3596782357005964e+01 + 26 1.9006795050976015e+02 3.7714653711989683e+02 -5.3088146550549240e+00 + 27 2.6857769300386252e+02 -2.6122441465786244e+02 1.4699752955507023e+02 + 28 -2.9852934422332379e+02 1.2500596931207087e+02 -1.7550868254659525e+02 + 29 2.6845328864595203e+01 1.3536145301225076e+02 2.9924267408280816e+01 +run_vdwl: 745.9351466183666 +run_coul: 66.12560288721725 run_stress: ! |2- - 1.9422849266903772e+03 1.4499928776254378e+03 4.1579119043243772e+03 -5.7660186484953738e+02 1.5778310808464493e+01 7.3231013428757922e+02 + 2.1438406369539384e+03 2.4584623543914290e+03 4.5292856398497352e+03 -7.7888284752184336e+02 6.5066344952844446e+01 6.8834191128296936e+02 run_forces: ! |2 - 1 -6.3116728997436311e+01 3.0219461207673027e+02 2.7945642554461517e+02 - 2 2.1823670153441185e+02 8.5492899699192421e+01 -1.5416203993873395e+02 - 3 -1.3873821803667016e+02 -3.9036455798049053e+02 -2.9794365908252206e+02 - 4 5.4851656704259373e+00 -3.5559374795504148e+01 8.0074902814023446e+01 - 5 -3.0661596327244666e+01 -7.9166150853713717e+01 5.0895445853048557e+01 - 6 -7.8903772218772826e+02 9.2471773371504594e+02 1.1985249679913393e+03 - 7 1.3417054750196161e+02 -3.8991741033232239e+02 -1.7086821922186305e+03 - 8 9.7330644540156584e+01 -8.0732053466860933e+01 2.6397599804616618e+02 - 9 4.9872446833672825e+01 1.6739712606628419e+02 3.5793214687649453e+02 - 10 5.8047343113404111e+02 -5.1918893040724413e+02 -1.6501718351118546e+02 - 11 -4.3233315287020993e+01 4.8219395895150195e-02 -6.5210618092242868e+01 - 12 1.2504972159099091e+02 -1.2681145615764525e+02 1.5217879430940524e+01 - 13 -1.1589262395465819e+02 9.0144184839471677e+01 1.0780271591852674e+01 - 14 -8.6900421010852114e+01 1.6300621186747282e+01 1.9338330327730862e+01 - 15 -5.5169401385359258e+01 2.3653589419066329e+01 7.3639830012305453e+01 - 16 5.1962480904449421e+02 -3.2916996348824193e+02 -1.2010875200238368e+03 - 17 -4.5587760056968011e+02 3.0332567791707356e+02 1.2413709462068782e+03 - 18 8.0235682517434928e+00 3.9518661500945100e+01 -8.0011439411858660e+01 - 19 -6.4600501252629982e+01 6.9212979380494616e+01 5.7164075209738755e+01 - 20 6.7120044414622129e+01 -9.7394378696639180e+01 2.9761527878860310e+01 - 21 4.8440417347595513e+01 3.6922090422655316e+01 1.3264742205258210e+02 - 22 -1.6338236470125480e+02 1.6776249909866969e+01 -9.8826227614850623e+01 - 23 1.2293682885266210e+02 -4.1087498445113432e+01 -2.2043764582323913e+01 - 24 -3.5111758127072342e+01 -1.6525225787695715e+02 -1.9202235780720216e+00 - 25 -1.4176466306219362e+02 3.5021705876403836e+01 1.9091979788311285e+01 - 26 1.9486095772040414e+02 1.2948463021905852e+02 -2.2088528184565416e+01 - 27 -5.5506450042810798e+00 -7.6677333726027612e+01 -4.5097234567706010e+00 - 28 -1.4575309240271551e+02 3.7357103430616839e+01 2.4333203960870190e+01 - 29 1.6316536786961481e+02 5.3753281171212350e+01 -3.2702233890165388e+01 + 1 -4.3850543631074885e+01 3.6184280360259618e+02 3.0493981300920677e+02 + 2 1.8742018231212731e+02 5.6998242829821592e+01 -1.5267226053722794e+02 + 3 -9.4962900889417199e+01 -3.7169369967341220e+02 -2.0879796811144706e+02 + 4 -1.3466851986906786e+01 2.6833426578265520e+01 -6.0168761303875847e+01 + 5 -4.9982449726025770e+01 -6.7186459940241022e+01 9.7815472287722528e+01 + 6 -7.7391771912666479e+02 9.4430987510650391e+02 1.1472148192893724e+03 + 7 1.0851048309962822e+02 -2.9940752929461263e+02 -1.6793290895913613e+03 + 8 6.4047591291038984e+01 -1.5714334331175451e+01 4.9702699030946712e+02 + 9 1.1927997700555687e+02 1.3319419291004671e+01 1.9615339791720274e+02 + 10 5.0005138934072613e+02 -5.6393793897111777e+02 -1.0212743450616721e+02 + 11 -9.8137887280994907e+00 -6.6243221570213606e+01 -7.2779582411686803e+01 + 12 3.2190915415252867e+01 -8.1981559434630444e+00 -1.0489356117208523e+02 + 13 -3.1872720569746239e+01 -2.9558724986260994e+01 -1.8498251917167239e+00 + 14 7.3967441060281045e+00 -3.6539663730940781e+01 4.5324431593009344e+01 + 15 -1.1254467039351175e+01 6.8440765532594014e+01 1.1164587593209069e+02 + 16 4.5751837790658379e+02 -3.2163693706355184e+02 -1.1430536747180747e+03 + 17 -4.4937448699087111e+02 3.0880977009533615e+02 1.1357248265826368e+03 + 18 1.0100944766290171e+02 6.6749401501767466e+01 1.2590974686110167e+02 + 19 -7.2028730203050998e+01 1.3778781024640445e+01 -4.5561088081860539e+01 + 20 -2.5265170957926856e+01 -7.5548467208970877e+01 -8.4129666219700241e+01 + 21 -6.9710504277261805e+01 -1.0300543048390996e+02 2.4118062061009678e+02 + 22 -1.6109368565749858e+02 -5.4632302781095724e+01 -1.6900409281603939e+02 + 23 2.3220469975272059e+02 1.5437820507943380e+02 -8.0672192570084263e+01 + 24 -1.0648351777593089e+02 -3.3865333216265589e+02 5.1246506838640727e+01 + 25 -8.2932144656273763e+01 -3.9128022691130710e+01 -4.6059449009881853e+01 + 26 1.8948051323455078e+02 3.7647621241904335e+02 -4.4970638167906110e+00 + 27 2.6652919911993564e+02 -2.6019297529603256e+02 1.4495949127807398e+02 + 28 -2.9628823123866573e+02 1.2389337834803328e+02 -1.7352518750507207e+02 + 29 2.6658393207715143e+01 1.3544691471974446e+02 2.9978905054449594e+01 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml index 724221b291..122d56c238 100644 --- a/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_long_cut_dipole_long.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 20:00:29 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 2.5e-09 skip_tests: prerequisites: ! | @@ -31,71 +31,71 @@ extract: ! | cut_coul 0 natoms: 29 init_vdwl: 749.2372261744105 -init_coul: -510.0645577150534 +init_coul: 264.19409398004746 init_stress: ! |2- - 1.9775205995303602e+03 1.5401122683443116e+03 4.0242099368503768e+03 -4.4187182607529485e+02 -9.4825605825355396e+01 7.1164256744416593e+02 + 2.0968605799339416e+03 2.4057868670339949e+03 4.4759568652532653e+03 -8.0301989545587662e+02 1.0569861352299075e+02 7.0101073958860150e+02 init_forces: ! |2 - 1 -7.6003373605897039e+01 2.7664303110780685e+02 3.0134186026453369e+02 - 2 2.2866831476513934e+02 1.0470808583484599e+02 -1.9912936151543389e+02 - 3 -1.4483754133996587e+02 -3.8429405958583584e+02 -2.9901476862775820e+02 - 4 1.3935374831423081e+01 -3.6644775830784546e+01 8.3888637572435158e+01 - 5 -3.5439363457232254e+01 -7.2739998197921977e+01 4.6110481295917836e+01 - 6 -7.4157915036285317e+02 8.8448406711774749e+02 1.2098091295808249e+03 - 7 8.6279237300879885e+01 -3.5778180760633592e+02 -1.7363570739437334e+03 - 8 6.5976418873841538e+01 -4.8643696191930168e+01 2.5793073839073116e+02 - 9 4.2497668124943402e+01 1.3070788520628537e+02 3.7830324006697737e+02 - 10 5.8689894201521861e+02 -5.2344991811391242e+02 -1.6697376525148064e+02 - 11 -4.0543166651544091e+01 -1.0758718002496700e+01 -6.5598501291565654e+01 - 12 1.0605006281669685e+02 -1.2015055787633801e+02 2.3647755824690115e+01 - 13 -9.5622291773669801e+01 7.8051492119874155e+01 1.0840728093654999e+01 - 14 -6.6610421769850930e+01 9.4472358237111980e+00 2.3486691113112261e+01 - 15 -5.5064524709467094e+01 2.8321481073714651e+01 8.0274791498111597e+01 - 16 5.2481928319641543e+02 -3.4780982672534094e+02 -1.2134258838092942e+03 - 17 -4.4902027864747055e+02 3.3813246096969442e+02 1.2424893806935199e+03 - 18 -1.5836179618063737e+01 -3.5669546354618284e+01 -8.3210631687445670e+01 - 19 -5.6328976127551243e+01 9.6733628506286507e+01 1.0605968724248876e+02 - 20 7.9896480670685548e+01 -4.7609233962545133e+01 -2.0598227515881544e+00 - 21 -7.3561583498209302e+00 -4.0643789881974843e+00 1.0849215484482751e+02 - 22 -1.5958047288090896e+02 2.1347230251836393e+01 -4.2314270063219311e+01 - 23 1.7353977109742178e+02 1.3431074128504807e+00 -4.9650608960934427e+01 - 24 -7.5733472061382287e+01 -2.0163658479862383e+02 -8.0676295119211048e+01 - 25 -9.7954035204512238e+01 2.5260170328403998e+01 9.5988127630363820e+01 - 26 1.9140129493860326e+02 1.7797509205542670e+02 -1.4675059681103502e+01 - 27 -7.2552065966554537e+01 -9.7071930327475854e+01 -6.8741247089994090e+01 - 28 -9.5686977535954313e+01 2.6049356521912799e+00 7.8594180702461799e+01 - 29 1.8578560143143028e+02 1.1256512910168119e+02 -2.5430295021889062e+01 -run_vdwl: 746.2717632004208 -run_coul: -511.65100924242483 + 1 -5.2460419240902993e+01 3.5570020231433051e+02 3.0357528436986786e+02 + 2 1.8972908879689726e+02 5.2501721653918899e+01 -1.4443782698971859e+02 + 3 -9.7641533379653779e+01 -3.7029176260506529e+02 -2.1329433718488173e+02 + 4 -1.3322526246772242e+01 3.3487140937656640e+01 -5.7174534499548024e+01 + 5 -4.9310830023747755e+01 -6.7362098868924321e+01 1.0455312557666571e+02 + 6 -7.9714977861478428e+02 9.6062972585777857e+02 1.1190556256645543e+03 + 7 1.1863877512984182e+02 -3.1274135999475635e+02 -1.6722365095743642e+03 + 8 9.4020225949559133e+01 -1.3076017099181206e+01 5.3171613745689763e+02 + 9 1.1687146641420811e+02 8.0658311416142716e+00 1.6247556822604119e+02 + 10 4.9702376529991113e+02 -5.6820409005525221e+02 -1.0804841841538311e+02 + 11 -1.7174721782064328e+01 -5.5180743347182812e+01 -5.9399088129254785e+01 + 12 4.4036260596512427e+01 -1.8551058168539157e+01 -1.0755063636319714e+02 + 13 -3.8829864163672319e+01 -2.7543045120948193e+01 -2.5925415634886497e+00 + 14 1.2761965596539152e+01 -2.7554166171124503e+01 4.7764910930114560e+01 + 15 -8.9693134275223354e+00 6.4708501014966970e+01 1.1655201429694297e+02 + 16 4.4351862100023988e+02 -3.1339904747512225e+02 -1.1211968607056076e+03 + 17 -4.4201177446659585e+02 2.9526831894837738e+02 1.1181154471833058e+03 + 18 1.4114635396785206e+02 1.3102181597657875e+02 1.3444225359377944e+02 + 19 -6.3917421373431253e+01 1.1921603886997961e+01 -7.3713725621929086e+01 + 20 -7.5039657065841084e+01 -1.3534639062776128e+02 -7.0257460395780811e+01 + 21 -7.4652581046679813e+01 -1.3311029852536706e+02 2.1318500716075857e+02 + 22 -1.5557176807876652e+02 -3.9124521502177558e+01 -1.6852151211131957e+02 + 23 2.3032980413070243e+02 1.6892900438819134e+02 -5.4139898702875499e+01 + 24 -1.2038489066583203e+02 -3.1184969674605560e+02 1.4746884423279068e+01 + 25 -6.5160779981702305e+01 -4.3480668211050045e+01 -2.3230530186298907e+01 + 26 1.8572425352763193e+02 3.5565996801587585e+02 9.2502800497175155e+00 + 27 2.1573349204501821e+02 -2.5808518983770762e+02 1.5385822690467586e+02 + 28 -2.7371676462691147e+02 1.0256336074454332e+02 -1.7424892322007733e+02 + 29 5.5780551729966803e+01 1.5444295947538512e+02 2.0752037827124337e+01 +run_vdwl: 746.0661234350821 +run_coul: 263.99432540186694 run_stress: ! |2- - 1.9762013405618991e+03 1.5375515668491785e+03 3.9879670178636779e+03 -4.4243677010745125e+02 -9.6011606577106576e+01 7.1091771589632401e+02 + 2.0935929213665963e+03 2.4023864979721948e+03 4.4435008261788926e+03 -8.0194076218046519e+02 1.0469957491889312e+02 7.0332914501840787e+02 run_forces: ! |2 - 1 -7.2478585679131498e+01 2.7872806793432318e+02 2.9736357661381140e+02 - 2 2.2529962504230434e+02 1.0251981508302525e+02 -1.9498035412210305e+02 - 3 -1.4501735347066150e+02 -3.8426959234457314e+02 -2.9882271219157508e+02 - 4 1.3876617458543992e+01 -3.6609792259953458e+01 8.3789032506060906e+01 - 5 -3.5316550486718199e+01 -7.2567143445439740e+01 4.5949357432698797e+01 - 6 -7.3601436266182395e+02 8.7822380079047036e+02 1.1931464956802458e+03 - 7 8.5583154065997618e+01 -3.5483967152960344e+02 -1.7156547499611020e+03 - 8 6.1948409647708836e+01 -4.1641832208069538e+01 2.6361965766266354e+02 - 9 4.0042789510313987e+01 1.2807988471764313e+02 3.6924227917296008e+02 - 10 5.8792182268994054e+02 -5.2488215301716320e+02 -1.6790878601963803e+02 - 11 -4.0420231062846966e+01 -1.0581860633114506e+01 -6.5100546999107152e+01 - 12 1.0668593869978415e+02 -1.1984622885151535e+02 2.3238109853124776e+01 - 13 -9.6046249922340181e+01 7.7952711911077870e+01 1.0808129620759990e+01 - 14 -6.5999254432540610e+01 9.5407955998902434e+00 2.3657276736312426e+01 - 15 -5.5531506342868440e+01 2.8029042545127680e+01 8.0284356864842906e+01 - 16 5.2432627377301412e+02 -3.4810209520519425e+02 -1.2129317857506171e+03 - 17 -4.4847603565819435e+02 3.3850758051579493e+02 1.2419304995023560e+03 - 18 -1.5037075809229599e+01 -3.6287994708529588e+01 -8.3833045917740222e+01 - 19 -5.6200349125775993e+01 9.7070350513647767e+01 1.0655212140217252e+02 - 20 7.9028998967302954e+01 -4.7327861918939419e+01 -1.9347032673888207e+00 - 21 -7.2791635145342131e+00 -3.6689216287405007e+00 1.0752780513752649e+02 - 22 -1.5955254293398622e+02 2.1174472639278221e+01 -4.1695307727865440e+01 - 23 1.7341797299818074e+02 1.1262544744622631e+00 -4.9307932358563441e+01 - 24 -7.2788339173435915e+01 -2.0327590850303113e+02 -7.9191545570721885e+01 - 25 -1.0196479758402157e+02 2.5780676855057195e+01 9.4010361415118780e+01 - 26 1.9245590647660194e+02 1.7908552466286497e+02 -1.4186662063258972e+01 - 27 -7.1099076175251355e+01 -9.6770344800568736e+01 -6.8565488422534827e+01 - 28 -9.6556587212141352e+01 2.7540512430947963e+00 7.8263446196497611e+01 - 29 1.8519055191580867e+02 1.1209837156867849e+02 -2.5268885424937110e+01 + 1 -5.0005190783640359e+01 3.5683629483636668e+02 3.0057590846071133e+02 + 2 1.8746962965267136e+02 5.1292505277097092e+01 -1.4146234152757947e+02 + 3 -9.8320245883125878e+01 -3.7016189495096023e+02 -2.1306636914970588e+02 + 4 -1.2945634139624765e+01 3.3363333190010259e+01 -5.7031897616149173e+01 + 5 -4.9165332389621454e+01 -6.7248378475117093e+01 1.0423665936890278e+02 + 6 -7.9141782355601674e+02 9.5413131205242564e+02 1.1032037749961678e+03 + 7 1.1799383832468655e+02 -3.1006302951506939e+02 -1.6521787412114300e+03 + 8 8.8761856950715128e+01 -7.3124397140418278e+00 5.3211101127126642e+02 + 9 1.1578985895709347e+02 7.1960717952092805e+00 1.5829228806707661e+02 + 10 4.9854215447122328e+02 -5.6984382505288750e+02 -1.0917175492647810e+02 + 11 -1.7411784006948348e+01 -5.4771244247018586e+01 -5.8854113274023419e+01 + 12 4.4129337712515877e+01 -1.8155572691935600e+01 -1.0739306899626705e+02 + 13 -3.8645829639677032e+01 -2.7679099526806642e+01 -2.8173822780425675e+00 + 14 1.2879254681619537e+01 -2.7257138950617524e+01 4.7773905805679071e+01 + 15 -9.3864409328265168e+00 6.4187136860762379e+01 1.1677991915098511e+02 + 16 4.4325331257155182e+02 -3.1370748261427036e+02 -1.1209997332587959e+03 + 17 -4.4177474453116014e+02 2.9562454083388127e+02 1.1178544037368640e+03 + 18 1.4104233565016156e+02 1.3014768795143343e+02 1.3435187024355969e+02 + 19 -6.4549740240650380e+01 1.1627486056140137e+01 -7.3966479406484083e+01 + 20 -7.4318238356524091e+01 -1.3415733704161062e+02 -6.9901296134051904e+01 + 21 -7.4304927696545633e+01 -1.3168400726885417e+02 2.1114938039036207e+02 + 22 -1.5533236234884367e+02 -3.9505395371652519e+01 -1.6728481007437028e+02 + 23 2.2974289314705547e+02 1.6788862867909339e+02 -5.3332252327165058e+01 + 24 -1.1694069584204382e+02 -3.1204231038530872e+02 1.6450238660445763e+01 + 25 -6.8129122173460573e+01 -4.2846333627185608e+01 -2.5715860712844034e+01 + 26 1.8524544466096418e+02 3.5521708679684997e+02 1.0031220116496323e+01 + 27 2.1423876113134398e+02 -2.5705214884819708e+02 1.5206295367383996e+02 + 28 -2.7187821271680798e+02 1.0163362759968949e+02 -1.7253766670842825e+02 + 29 5.5437647325915478e+01 1.5434192635257409e+02 2.0840233659458249e+01 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml b/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml index 79bf720aa3..dc7166f5ac 100644 --- a/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_long_dipole_long.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 19:22:50 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 2.5e-09 skip_tests: prerequisites: ! | @@ -37,71 +37,71 @@ extract: ! | ewald_mix 0 natoms: 29 init_vdwl: 780.964939033474 -init_coul: -510.0645577150534 +init_coul: 264.19409398004746 init_stress: ! |2- - 2.1186891565758292e+03 1.6568747134262373e+03 4.1488018143646023e+03 -3.1698706178071541e+02 -7.7642156449388779e+01 6.9929788784082587e+02 + 2.2380291369794104e+03 2.5225493121159216e+03 4.6005487427674934e+03 -6.7813513116129673e+02 1.2288206289895820e+02 6.8866605998525927e+02 init_forces: ! |2 - 1 -7.6007892503616404e+01 2.7665013159907738e+02 3.0134418995941166e+02 - 2 2.2867037231947904e+02 1.0470590208275833e+02 -1.9913367796139423e+02 - 3 -1.4484116376800864e+02 -3.8429247602547053e+02 -2.9901434029556566e+02 - 4 1.3938502687594612e+01 -3.6647053046991061e+01 8.3886466623489767e+01 - 5 -3.5438584458162318e+01 -7.2740708285616961e+01 4.6109114027644985e+01 - 6 -7.4158126313863966e+02 8.8448420846676731e+02 1.2098080364986888e+03 - 7 8.6287183176696090e+01 -3.5778221265743844e+02 -1.7363516789861883e+03 - 8 6.5976057527884421e+01 -4.8645495241218576e+01 2.5793156261508091e+02 - 9 4.2491092905023471e+01 1.3072021692758040e+02 3.7829462692746256e+02 - 10 5.8690043458138007e+02 -5.2345223324260144e+02 -1.6697423161520402e+02 - 11 -4.0548553200170225e+01 -1.0751022519246836e+01 -6.5598562050775186e+01 - 12 1.0605382583151132e+02 -1.2015067638157343e+02 2.3646242017204663e+01 - 13 -9.5624178109512840e+01 7.8051254612166446e+01 1.0841939370686937e+01 - 14 -6.6611102165459215e+01 9.4489222311521761e+00 2.3486637060965521e+01 - 15 -5.5070532176868142e+01 2.8320939037640930e+01 8.0271735764091915e+01 - 16 5.2482147552248352e+02 -3.4781291266409153e+02 -1.2134244881209024e+03 - 17 -4.4901247139192253e+02 3.3811896569767225e+02 1.2424947717998630e+03 - 18 -4.7461836541915851e+01 -1.1119812968855497e+02 1.2434792821301285e+02 - 19 -1.5507117139923497e+02 3.3562381224711103e+01 -1.3561336271097147e+01 - 20 2.1026410894172201e+02 9.1088799850008940e+01 -8.9994878031051428e+01 - 21 -7.3540986790080272e+00 -4.0666051205998279e+00 1.0849022311932021e+02 - 22 -1.5958048220865899e+02 2.1347201816470964e+01 -4.2314333856649611e+01 - 23 1.7353983503860766e+02 1.3431032233629090e+00 -4.9650644605857359e+01 - 24 -7.5732096381198389e+01 -2.0163409889381214e+02 -8.0672450655028229e+01 - 25 -9.7954004446520742e+01 2.5260207836781959e+01 9.5988189689701770e+01 - 26 1.9140136416350640e+02 1.7797517193284955e+02 -1.4674989703590418e+01 - 27 -7.2554159134880464e+01 -9.7074109214580631e+01 -6.8739761097486507e+01 - 28 -9.5686975441521014e+01 2.6049307025671595e+00 7.8594177731605996e+01 - 29 1.8578631244940976e+02 1.1256539574022824e+02 -2.5430468167440296e+01 -run_vdwl: 777.3635559161404 -run_coul: -511.61056889302586 + 1 -5.2464938138622280e+01 3.5570730280560127e+02 3.0357761406474572e+02 + 2 1.8973114635123699e+02 5.2499537901831253e+01 -1.4444214343567890e+02 + 3 -9.7645155807696540e+01 -3.7029017904470010e+02 -2.1329390885268927e+02 + 4 -1.3319398390600714e+01 3.3484863721450132e+01 -5.7176705448493415e+01 + 5 -4.9310051024677826e+01 -6.7362808956619318e+01 1.0455175830839289e+02 + 6 -7.9715189139057043e+02 9.6062986720679839e+02 1.1190545325824169e+03 + 7 1.1864672100565804e+02 -3.1274176504585904e+02 -1.6722311146168195e+03 + 8 9.4019864603601818e+01 -1.3077816148469742e+01 5.3171696168124720e+02 + 9 1.1686489119428815e+02 8.0781628629092772e+00 1.6246695508652650e+02 + 10 4.9702525786607254e+02 -5.6820640518394111e+02 -1.0804888477910643e+02 + 11 -1.7180108330690480e+01 -5.5173047863932943e+01 -5.9399148888464325e+01 + 12 4.4040023611326916e+01 -1.8551176673774549e+01 -1.0755215017068259e+02 + 13 -3.8831750499515366e+01 -2.7543282628655898e+01 -2.5913302864567074e+00 + 14 1.2761285200930857e+01 -2.7552479763683525e+01 4.7764856877967809e+01 + 15 -8.9753208949233851e+00 6.4707958978893259e+01 1.1654895856292333e+02 + 16 4.4352081332630792e+02 -3.1340213341387295e+02 -1.1211954650172158e+03 + 17 -4.4200396721104772e+02 2.9525482367635522e+02 1.1181208382896493e+03 + 18 1.0952069704400000e+02 5.5493232642642020e+01 3.4200081349423789e+02 + 19 -1.6265961664511502e+02 -5.1249643394577404e+01 -1.9333474913551498e+02 + 20 5.5327971205195425e+01 3.3516431847928718e+00 -1.5819251567524412e+02 + 21 -7.4650521375866902e+01 -1.3311252465776940e+02 2.1318307543525120e+02 + 22 -1.5557177740651650e+02 -3.9124549937542980e+01 -1.6852157590474968e+02 + 23 2.3032986807188826e+02 1.6892900019870379e+02 -5.4139934347798381e+01 + 24 -1.2038351498564820e+02 -3.1184721084124391e+02 1.4750728887461861e+01 + 25 -6.5160749223710809e+01 -4.3480630702672087e+01 -2.3230468126960950e+01 + 26 1.8572432275253513e+02 3.5566004789329872e+02 9.2503500272306045e+00 + 27 2.1573139887669225e+02 -2.5808736872481239e+02 1.5385971289718336e+02 + 28 -2.7371676253247824e+02 1.0256335579491919e+02 -1.7424892619093313e+02 + 29 5.5781262747946322e+01 1.5444322611393216e+02 2.0751864681573121e+01 +run_vdwl: 777.1457175511489 +run_coul: 264.0242807071321 run_stress: ! |2- - 2.1145384663553446e+03 1.6510668217739590e+03 4.1110613021748786e+03 -3.2034939216947475e+02 -7.5852028946707975e+01 7.0161836723009515e+02 + 2.2320053673041330e+03 2.5162825128155046e+03 4.5659247196300730e+03 -6.7977028389742259e+02 1.2383592203172893e+02 6.9326249735974170e+02 run_forces: ! |2 - 1 -7.2481915554468316e+01 2.7873533962269897e+02 2.9736553162748010e+02 - 2 2.2530700136172547e+02 1.0251795242867284e+02 -1.9498348518123478e+02 - 3 -1.4502046592654210e+02 -3.8426825566001651e+02 -2.9882158301997504e+02 - 4 1.3879012832806696e+01 -3.6612695951538271e+01 8.3787745719906539e+01 - 5 -3.5315604779312473e+01 -7.2567908037413773e+01 4.5948158195046283e+01 - 6 -7.3601478244893099e+02 8.7822376057908912e+02 1.1931463023857750e+03 - 7 8.5593400194792167e+01 -3.5483999790439844e+02 -1.7156481613379353e+03 - 8 6.1948168094253568e+01 -4.1643096768243105e+01 2.6361985288349189e+02 - 9 4.0036362505006849e+01 1.2809297433027587e+02 3.6923325743788149e+02 - 10 5.8792334478759483e+02 -5.2488402370828601e+02 -1.6790948960744348e+02 - 11 -4.0425480882258505e+01 -1.0573799181622711e+01 -6.5100685016812548e+01 - 12 1.0668811367434198e+02 -1.1984628711151187e+02 2.3236152187612923e+01 - 13 -9.6048813773627344e+01 7.7952197357603239e+01 1.0809336270525087e+01 - 14 -6.6001202900526522e+01 9.5463761360826584e+00 2.3655784750123413e+01 - 15 -5.5540888390243040e+01 2.8029939249904579e+01 8.0279497327689711e+01 - 16 5.2432845997166748e+02 -3.4810507930928827e+02 -1.2129304514808082e+03 - 17 -4.4846812380300480e+02 3.3849380728322205e+02 1.2419360206198796e+03 - 18 -4.0126265216240299e+01 -1.0506049253576529e+02 1.2028433815007091e+02 - 19 -1.5557437978499408e+02 3.3044880263130914e+01 -1.3924100898964099e+01 - 20 2.0348791523589139e+02 8.5461816296489218e+01 -8.5572815975123476e+01 - 21 -7.2771091375000241e+00 -3.6711998323594579e+00 1.0752585156213770e+02 - 22 -1.5955253114000146e+02 2.1174506710846043e+01 -4.1695372723856913e+01 - 23 1.7341802372293813e+02 1.1262503605507654e+00 -4.9307971786681463e+01 - 24 -7.2786994107130170e+01 -2.0327342663988938e+02 -7.9187646703575908e+01 - 25 -1.0196471574644906e+02 2.5780707544351898e+01 9.4010233721469760e+01 - 26 1.9245596364740629e+02 1.7908559406841604e+02 -1.4186681320598032e+01 - 27 -7.1101164100672392e+01 -9.6772518105492182e+01 -6.8564001290184706e+01 - 28 -9.6556585391234933e+01 2.7540461843377990e+00 7.8263442932085326e+01 - 29 1.8519125705471143e+02 1.1209863233015392e+02 -2.5269059427981762e+01 + 1 -5.0012381628101593e+01 3.5684449953160413e+02 3.0058113499756263e+02 + 2 1.8747488179789627e+02 5.1285858281159385e+01 -1.4146762516783770e+02 + 3 -9.8327058187338352e+01 -3.7016163512850846e+02 -2.1306413042699927e+02 + 4 -1.2943698254030156e+01 3.3360172401646729e+01 -5.7034982599578555e+01 + 5 -4.9163779766373771e+01 -6.7248677420647311e+01 1.0423491163714048e+02 + 6 -7.9141406888310144e+02 9.5413810588729154e+02 1.1031981098122944e+03 + 7 1.1800370077217963e+02 -3.1006267632306856e+02 -1.6521689123311828e+03 + 8 8.8761935139523231e+01 -7.3126848934500437e+00 5.3211103817552566e+02 + 9 1.1578377461819309e+02 7.2094345560175306e+00 1.5828313331461484e+02 + 10 4.9854330179085451e+02 -5.6984544201637777e+02 -1.0917302238349905e+02 + 11 -1.7416735765684084e+01 -5.4762988323059993e+01 -5.8853880279964130e+01 + 12 4.4131775490197185e+01 -1.8155426259597949e+01 -1.0739629726768800e+02 + 13 -3.8648169345143174e+01 -2.7677678792511994e+01 -2.8166692485180174e+00 + 14 1.2882274959649953e+01 -2.7263641536310903e+01 4.7776634578601765e+01 + 15 -9.3889491520745487e+00 6.4180923054663992e+01 1.1678360109819684e+02 + 16 4.4325552364636053e+02 -3.1371025999761252e+02 -1.1209985450349595e+03 + 17 -4.4176678010308530e+02 2.9561052615964297e+02 1.1178601074240491e+03 + 18 1.1377334480946868e+02 5.9499151005832211e+01 3.3736754235789670e+02 + 19 -1.6298420156224060e+02 -5.1591792535089041e+01 -1.9296614867345400e+02 + 20 5.1373705605309375e+01 -2.8513990285278418e-01 -1.5392253849998019e+02 + 21 -7.4302861440715731e+01 -1.3168627584778730e+02 2.1114744315128254e+02 + 22 -1.5533237453036580e+02 -3.9505493744753139e+01 -1.6728490396594151e+02 + 23 2.2974296708879965e+02 1.6788861348434000e+02 -5.3332281837827189e+01 + 24 -1.1693934635323190e+02 -3.1203984916359502e+02 1.6454280939575451e+01 + 25 -6.8129083642593443e+01 -4.2846233143653606e+01 -2.5715936578423289e+01 + 26 1.8524548875421416e+02 3.5521712342736737e+02 1.0031106244446969e+01 + 27 2.1423667163422260e+02 -2.5705432226594780e+02 1.5206444053447962e+02 + 28 -2.7187821113021187e+02 1.0163362265229429e+02 -1.7253766971210624e+02 + 29 5.5438353637422729e+01 1.5434218685296398e+02 2.0840059742293167e+01 ... diff --git a/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml b/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml index 0bfa9f1415..dc44d20267 100644 --- a/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml +++ b/unittest/force-styles/tests/mol-pair-lj_sf_dipole_sf.yaml @@ -1,8 +1,8 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sat Aug 21 20:27:05 2021 +date_generated: Sat Aug 21 20:48:58 2021 epsilon: 2e-14 -skip_tests: single gpu +skip_tests: gpu single prerequisites: ! | atom full atom sphere @@ -26,71 +26,71 @@ extract: ! | cut_coul 2 natoms: 29 init_vdwl: 749.2633759833361 -init_coul: -217.7767543539848 +init_coul: -81.6113321312246 init_stress: ! |2- - 2.3307105275824219e+03 1.8921784919073946e+03 4.3143552886045145e+03 -5.1717888760304368e+02 -1.7289838727974762e+02 7.0607232447937497e+02 + 2.1007353118189826e+03 2.4057688880269438e+03 4.4809118645047720e+03 -8.0352081840588698e+02 1.0643590815807765e+02 6.9545206797431490e+02 init_forces: ! |2 - 1 -6.8103039103553144e+01 2.8778862154082498e+02 3.0598333226831829e+02 - 2 2.1952336496459932e+02 1.1643833719338330e+02 -1.9726975963868048e+02 - 3 -1.5974445996862306e+02 -3.8001194336338159e+02 -2.9677767461249147e+02 - 4 -6.2777682367372609e+00 -3.3143507895754816e+01 8.1020040494238430e+01 - 5 -5.1379437837923646e+01 -6.9099476429409023e+01 5.3040402232428697e+01 - 6 -7.7892402615511719e+02 8.8493877731707005e+02 1.2063996163601676e+03 - 7 9.3000586899588157e+01 -3.5906990969693118e+02 -1.7468150087847234e+03 - 8 8.6846265878755133e+01 -5.2764263908575401e+01 2.6302131630793338e+02 - 9 3.5959610475937126e+01 1.2911756626467115e+02 3.8936928039057244e+02 - 10 5.8513761567202016e+02 -5.3200952424358229e+02 -1.6587070527717438e+02 - 11 -4.7032470597262787e+01 -2.1718543141469965e+01 -7.0231444370360848e+01 - 12 1.3287235515664267e+02 -1.2120172572389244e+02 2.1763587679908113e+01 - 13 -7.7691060923393735e+01 7.6084565848279254e+01 8.8549530128208271e+00 - 14 -6.4615902859434996e+01 7.5964711355839807e+00 1.1139107171119367e+01 - 15 -4.2859729034814592e+01 3.3888993721189628e+01 7.8229135888456071e+01 - 16 5.1432034868049288e+02 -3.5897765347245490e+02 -1.2066866005063182e+03 - 17 -4.3488303272382689e+02 3.2926789598153533e+02 1.2525098799549635e+03 - 18 4.7676551609994586e+00 -2.6492769022611796e+01 -9.1019415782273768e+01 - 19 -6.5907740207137849e+01 1.0051282082846487e+02 9.6061159173386358e+01 - 20 7.7312452517807614e+01 -4.0282335324931580e+01 -7.3865439244729547e+00 - 21 9.7072453091424595e+00 -5.7984158968375610e+00 1.0701822320724706e+02 - 22 -1.6673016608317349e+02 1.5378757671170883e+01 -4.8154882780231830e+01 - 23 1.7376105499832110e+02 -2.4876013668085752e+00 -5.2485395047269890e+01 - 24 -5.8826520432613847e+01 -1.9724647943351388e+02 -7.5498123010225626e+01 - 25 -1.0743747013955485e+02 2.9047527651164682e+01 1.0167377674566907e+02 - 26 1.8855306479293733e+02 1.8132632405885457e+02 -9.1007743361203488e+00 - 27 -6.2881960946585536e+01 -1.0091483313808286e+02 -6.5049492394568205e+01 - 28 -1.0642245132509179e+02 7.1817894569033669e-01 7.7435015441815892e+01 - 29 1.7795561606760143e+02 1.0911414390035503e+02 -2.1173005864134293e+01 -run_vdwl: 746.2626573093828 -run_coul: -219.46521636718495 + 1 -5.3214898786716304e+01 3.5301613102972811e+02 3.0338443812123495e+02 + 2 1.9086335918253812e+02 5.5501222916561225e+01 -1.4520693922759375e+02 + 3 -9.6146757454289173e+01 -3.7277130055082273e+02 -2.1251793169884976e+02 + 4 -1.2723029186258252e+01 3.2642459255129381e+01 -5.7172163950933466e+01 + 5 -5.0751976560112318e+01 -6.6177486971170509e+01 1.0506964361371259e+02 + 6 -7.9606976391129979e+02 9.5841751754188454e+02 1.1198348257849530e+03 + 7 1.1673972343587907e+02 -3.0540525980468175e+02 -1.6747930306515780e+03 + 8 9.2316498478027043e+01 -8.7410998764997920e+00 5.3094438563637857e+02 + 9 1.1716577009727359e+02 5.0535208912190015e+00 1.6635557828332207e+02 + 10 4.9934457026712852e+02 -5.6821068993614290e+02 -1.1042389422482539e+02 + 11 -1.6305861789413303e+01 -5.7267161152059352e+01 -5.9601476073911520e+01 + 12 4.3453346701307417e+01 -1.5920808670882607e+01 -1.0912766482492954e+02 + 13 -3.8434459426968544e+01 -2.5902064630114566e+01 -3.1610346326751984e+00 + 14 1.0556660677196238e+01 -2.7756791745661701e+01 4.9510934193410463e+01 + 15 -1.0075105015748591e+01 6.1051996909046366e+01 1.1614489973241970e+02 + 16 4.4875326510517982e+02 -3.2040132978271384e+02 -1.1207794176681743e+03 + 17 -4.4456418676844692e+02 3.0120851397211106e+02 1.1190203886839113e+03 + 18 1.3515370696009032e+02 1.2625310337588876e+02 1.3884999031912412e+02 + 19 -6.1810141375343505e+01 1.2445618836777829e+01 -7.4852332670238226e+01 + 20 -7.1910684917336866e+01 -1.3211542425787979e+02 -7.3647136411480218e+01 + 21 -7.7214068548156789e+01 -1.3980876660569331e+02 2.0701928900255390e+02 + 22 -1.5406359305075381e+02 -3.5574958263948012e+01 -1.6566949128311359e+02 + 23 2.3130719459423921e+02 1.7187495054887211e+02 -5.0165284141183392e+01 + 24 -1.2017988981429811e+02 -3.1258500032358762e+02 1.1453368723911767e+01 + 25 -6.5315698831805307e+01 -4.2927714848553563e+01 -2.2158779849917039e+01 + 26 1.8575036338540261e+02 3.5546859704101615e+02 1.1287691303886378e+01 + 27 2.1403175814584907e+02 -2.5171586468158071e+02 1.5945024941431268e+02 + 28 -2.7373619870171223e+02 9.9046377469164526e+01 -1.7731073729711252e+02 + 29 5.7080097108548543e+01 1.5130171231459346e+02 1.8261631793384637e+01 +run_vdwl: 746.0876260305123 +run_coul: -81.82766139265927 run_stress: ! |2- - 2.3291910634059586e+03 1.8896338010219772e+03 4.2779066388693673e+03 -5.1763237780858333e+02 -1.7416362503874595e+02 7.0537625931221612e+02 + 2.0974734865394976e+03 2.4023640260509278e+03 4.4484252755500384e+03 -8.0240421183617048e+02 1.0547582270349152e+02 6.9775525601445258e+02 run_forces: ! |2 - 1 -6.4584674657771515e+01 2.8983646384293615e+02 3.0202284109290724e+02 - 2 2.1618076189933106e+02 1.1427831457072568e+02 -1.9314116489125814e+02 - 3 -1.5993648092484190e+02 -3.7999586237374569e+02 -2.9655196386886252e+02 - 4 -6.3190175662096824e+00 -3.3105372597033458e+01 8.0903348979897856e+01 - 5 -5.1264538677538106e+01 -6.8915068550452332e+01 5.2853683811181462e+01 - 6 -7.7332667821630548e+02 8.7863758904167798e+02 1.1897625560660572e+03 - 7 9.2312901142593816e+01 -3.5612290923433949e+02 -1.7261053689357518e+03 - 8 8.2837099184303213e+01 -4.5668956744859727e+01 2.6883889894862114e+02 - 9 3.3465120697168985e+01 1.2643635928344169e+02 3.8015948150198676e+02 - 10 5.8616217794883767e+02 -5.3344932502539120e+02 -1.6682265133877738e+02 - 11 -4.6907551909313561e+01 -2.1532164076321582e+01 -6.9722764759532637e+01 - 12 1.3347317052854399e+02 -1.2087525356778710e+02 2.1354763126125746e+01 - 13 -7.8097978396802830e+01 7.5980741277055273e+01 8.8252035761426217e+00 - 14 -6.4011731230837015e+01 7.6839158928631601e+00 1.1312101922881329e+01 - 15 -4.3338634451079720e+01 3.3584440250128551e+01 7.8237801787523694e+01 - 16 5.1382857086338026e+02 -3.5926956845145241e+02 -1.2062099218451672e+03 - 17 -4.3434475776499738e+02 3.2965053889770934e+02 1.2519628687249585e+03 - 18 5.5497080568258799e+00 -2.7105130428183966e+01 -9.1619619877799437e+01 - 19 -6.5771871629638710e+01 1.0083384924106365e+02 9.6539204583481222e+01 - 20 7.6451566926835611e+01 -3.9992220622894031e+01 -7.2662980133099069e+00 - 21 9.7095514827038851e+00 -5.4249106470670174e+00 1.0598125111105223e+02 - 22 -1.6664515963177726e+02 1.5214225678316646e+01 -4.7460992600407494e+01 - 23 1.7365621602968167e+02 -2.6968949308459482e+00 -5.2141668046157378e+01 - 24 -5.5910478635751304e+01 -1.9887169761844189e+02 -7.4040013188840518e+01 - 25 -1.1139537409017143e+02 2.9555641441579397e+01 9.9720511455284168e+01 - 26 1.8958557210558467e+02 1.8242955167894382e+02 -8.6093955315153625e+00 - 27 -6.1570934346116388e+01 -1.0064681711132053e+02 -6.4927497667696230e+01 - 28 -1.0720564196929094e+02 8.4075286919278369e-01 7.7143138333351857e+01 - 29 1.7741908723265240e+02 1.0870976801450216e+02 -2.0998334456377012e+01 + 1 -5.0737087570122149e+01 3.5416731554018810e+02 3.0036522509410474e+02 + 2 1.8858211447586461e+02 5.4270826849491137e+01 -1.4220691173305502e+02 + 3 -9.6826442301267576e+01 -3.7264257514947894e+02 -2.1228291001817260e+02 + 4 -1.2347895711147414e+01 3.2519170438924817e+01 -5.7027830213049910e+01 + 5 -5.0604733781040025e+01 -6.6063052081516815e+01 1.0474502452612880e+02 + 6 -7.9034761638195960e+02 9.5192731029513243e+02 1.1039697072891006e+03 + 7 1.1609761257487948e+02 -3.0272547740348932e+02 -1.6547281938570964e+03 + 8 8.7080873944928896e+01 -2.9726058229770480e+00 5.3139886388302534e+02 + 9 1.1607508323617013e+02 4.1679216485424515e+00 1.6211901094224004e+02 + 10 5.0085646629672232e+02 -5.6984802498776367e+02 -1.1154888780594567e+02 + 11 -1.6541742288273539e+01 -5.6854421774935162e+01 -5.9055562283708326e+01 + 12 4.3544289717936628e+01 -1.5535500243643323e+01 -1.0897434947485453e+02 + 13 -3.8250691829644033e+01 -2.6038439851100890e+01 -3.3825334903487447e+00 + 14 1.0674100116466676e+01 -2.7455605625143598e+01 4.9519168484376088e+01 + 15 -1.0490290556514518e+01 6.0539673269832015e+01 1.1637067271109436e+02 + 16 4.4848223626741293e+02 -3.2070588197904527e+02 -1.1205792621451862e+03 + 17 -4.4432338530166510e+02 3.0156271991300309e+02 1.1187550013473319e+03 + 18 1.3505129434684949e+02 1.2538216464264322e+02 1.3875677365919145e+02 + 19 -6.2440800440251522e+01 1.2148099966130708e+01 -7.5105638962179356e+01 + 20 -7.1190304081528723e+01 -1.3092765380565228e+02 -7.3285381118152969e+01 + 21 -7.6823027405458333e+01 -1.3838326969837249e+02 2.0501021681357949e+02 + 22 -1.5385007753793224e+02 -3.5953373294584729e+01 -1.6446974304904936e+02 + 23 2.3070267891585755e+02 1.7083241229148200e+02 -4.9346623037892634e+01 + 24 -1.1672807343962495e+02 -3.1278329990266189e+02 1.3160935424003705e+01 + 25 -6.8292869949181323e+01 -4.2291474053353497e+01 -2.4653166847508317e+01 + 26 1.8527271359398421e+02 3.5502956968195019e+02 1.2070629909116388e+01 + 27 2.1251253130658401e+02 -2.5068594029647426e+02 1.5766250316815643e+02 + 28 -2.7189062809617383e+02 9.8105159254070315e+01 -1.7560633261240864e+02 + 29 5.6753671878127868e+01 1.5121425217880301e+02 1.8349593397158632e+01 ... From eeff288541bddd3553712d2fcd368fbfbae710fc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 10:50:28 -0400 Subject: [PATCH 044/437] tweak settings to pass OpenCL GPU tests in mixed precision --- unittest/force-styles/tests/mol-pair-coul_long.yaml | 2 +- unittest/force-styles/tests/mol-pair-soft.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/tests/mol-pair-coul_long.yaml b/unittest/force-styles/tests/mol-pair-coul_long.yaml index 9c3c933100..61e038af54 100644 --- a/unittest/force-styles/tests/mol-pair-coul_long.yaml +++ b/unittest/force-styles/tests/mol-pair-coul_long.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:42 2021 -epsilon: 7.5e-14 +epsilon: 1.5e-13 prerequisites: ! | atom full pair coul/long diff --git a/unittest/force-styles/tests/mol-pair-soft.yaml b/unittest/force-styles/tests/mol-pair-soft.yaml index b9c049cc18..e5be18374a 100644 --- a/unittest/force-styles/tests/mol-pair-soft.yaml +++ b/unittest/force-styles/tests/mol-pair-soft.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:56 2021 -epsilon: 5e-14 +epsilon: 1.5e-12 prerequisites: ! | atom full pair soft From ce71e45db0defd75e348cf6a8517fc651cf0c6c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:11:32 -0400 Subject: [PATCH 045/437] plug memory leak --- src/EXTRA-MOLECULE/dihedral_spherical.cpp | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/EXTRA-MOLECULE/dihedral_spherical.cpp b/src/EXTRA-MOLECULE/dihedral_spherical.cpp index 8b30a23b06..d489e3af21 100644 --- a/src/EXTRA-MOLECULE/dihedral_spherical.cpp +++ b/src/EXTRA-MOLECULE/dihedral_spherical.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -77,7 +76,6 @@ DihedralSpherical::~DihedralSpherical() } } - static void norm3safe(double *v) { double inv_scale = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); double scale = 1.0; @@ -88,7 +86,6 @@ static void norm3safe(double *v) { v[2] *= scale; } - // -------------------------------------------- // ------- Calculate the dihedral angle ------- // -------------------------------------------- @@ -640,21 +637,21 @@ CalcGeneralizedForces(int type, void DihedralSpherical::allocate() { allocated = 1; - int n = atom->ndihedraltypes; + int n = atom->ndihedraltypes+1; - memory->create(nterms,n+1,"dihedral:nterms"); + memory->create(nterms,n,"dihedral:nterms"); - Ccoeff = new double * [n+1]; - phi_mult = new double * [n+1]; - phi_shift = new double * [n+1]; - phi_offset = new double * [n+1]; - theta1_mult = new double * [n+1]; - theta1_shift = new double * [n+1]; - theta1_offset = new double * [n+1]; - theta2_mult = new double * [n+1]; - theta2_shift = new double * [n+1]; - theta2_offset = new double * [n+1]; - for (int i = 1; i <= n; i++) { + Ccoeff = new double * [n]; + phi_mult = new double * [n]; + phi_shift = new double * [n]; + phi_offset = new double * [n]; + theta1_mult = new double * [n]; + theta1_shift = new double * [n]; + theta1_offset = new double * [n]; + theta2_mult = new double * [n]; + theta2_shift = new double * [n]; + theta2_offset = new double * [n]; + for (int i = 0; i < n; i++) { Ccoeff[i] = nullptr; phi_mult[i] = nullptr; phi_shift[i] = nullptr; @@ -667,8 +664,8 @@ void DihedralSpherical::allocate() theta2_offset[i] = nullptr; } - memory->create(setflag,n+1,"dihedral:setflag"); - for (int i = 1; i <= n; i++) setflag[i] = 0; + memory->create(setflag,n,"dihedral:setflag"); + for (int i = 1; i < n; i++) setflag[i] = 0; } /* ---------------------------------------------------------------------- @@ -694,6 +691,16 @@ void DihedralSpherical::coeff(int narg, char **arg) int count = 0; for (int i = ilo; i <= ihi; i++) { nterms[i] = nterms_one; + delete[] Ccoeff[i]; + delete[] phi_mult[i]; + delete[] phi_shift[i]; + delete[] phi_offset[i]; + delete[] theta1_mult[i]; + delete[] theta1_shift[i]; + delete[] theta1_offset[i]; + delete[] theta2_mult[i]; + delete[] theta2_shift[i]; + delete[] theta2_offset[i]; Ccoeff[i] = new double [nterms_one]; phi_mult[i] = new double [nterms_one]; phi_shift[i] = new double [nterms_one]; @@ -730,7 +737,6 @@ void DihedralSpherical::coeff(int narg, char **arg) void DihedralSpherical::write_restart(FILE *fp) { - fwrite(&nterms[1],sizeof(int),atom->ndihedraltypes,fp); for (int i = 1; i <= atom->ndihedraltypes; i++) { fwrite(Ccoeff[i],sizeof(double),nterms[i],fp); @@ -744,7 +750,6 @@ void DihedralSpherical::write_restart(FILE *fp) fwrite(theta2_shift[i],sizeof(double),nterms[i],fp); fwrite(theta2_offset[i],sizeof(double),nterms[i],fp); } - } /* ---------------------------------------------------------------------- @@ -827,11 +832,6 @@ void DihedralSpherical::write_data(FILE *fp) } } - - - - - // Not needed? // single() calculates the dihedral-angle energy of atoms i1, i2, i3, i4. //double DihedralSpherical::single(int type, int i1, int i2, int i3, int i4) From 403ee3a85f8aaa6e94efd229889456f01bac83d0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:13:34 -0400 Subject: [PATCH 046/437] apply clang-format --- src/EXTRA-MOLECULE/dihedral_spherical.cpp | 487 ++++++++++------------ 1 file changed, 223 insertions(+), 264 deletions(-) diff --git a/src/EXTRA-MOLECULE/dihedral_spherical.cpp b/src/EXTRA-MOLECULE/dihedral_spherical.cpp index d489e3af21..7671acc528 100644 --- a/src/EXTRA-MOLECULE/dihedral_spherical.cpp +++ b/src/EXTRA-MOLECULE/dihedral_spherical.cpp @@ -29,8 +29,8 @@ #include "memory.h" #include "neighbor.h" -#include #include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -51,36 +51,36 @@ DihedralSpherical::~DihedralSpherical() memory->destroy(setflag); memory->destroy(nterms); - for (int i=1; i<= atom->ndihedraltypes; i++) { - if (Ccoeff[i]) delete [] Ccoeff[i]; - if (phi_mult[i]) delete [] phi_mult[i]; - if (phi_shift[i]) delete [] phi_shift[i]; - if (phi_offset[i]) delete [] phi_offset[i]; - if (theta1_mult[i]) delete [] theta1_mult[i]; - if (theta1_shift[i]) delete [] theta1_shift[i]; - if (theta1_offset[i]) delete [] theta1_offset[i]; - if (theta2_mult[i]) delete [] theta2_mult[i]; - if (theta2_shift[i]) delete [] theta2_shift[i]; - if (theta2_offset[i]) delete [] theta2_offset[i]; + for (int i = 1; i <= atom->ndihedraltypes; i++) { + if (Ccoeff[i]) delete[] Ccoeff[i]; + if (phi_mult[i]) delete[] phi_mult[i]; + if (phi_shift[i]) delete[] phi_shift[i]; + if (phi_offset[i]) delete[] phi_offset[i]; + if (theta1_mult[i]) delete[] theta1_mult[i]; + if (theta1_shift[i]) delete[] theta1_shift[i]; + if (theta1_offset[i]) delete[] theta1_offset[i]; + if (theta2_mult[i]) delete[] theta2_mult[i]; + if (theta2_shift[i]) delete[] theta2_shift[i]; + if (theta2_offset[i]) delete[] theta2_offset[i]; } - delete [] Ccoeff; - delete [] phi_mult; - delete [] phi_shift; - delete [] phi_offset; - delete [] theta1_mult; - delete [] theta1_shift; - delete [] theta1_offset; - delete [] theta2_mult; - delete [] theta2_shift; - delete [] theta2_offset; + delete[] Ccoeff; + delete[] phi_mult; + delete[] phi_shift; + delete[] phi_offset; + delete[] theta1_mult; + delete[] theta1_shift; + delete[] theta1_offset; + delete[] theta2_mult; + delete[] theta2_shift; + delete[] theta2_offset; } } -static void norm3safe(double *v) { - double inv_scale = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); +static void norm3safe(double *v) +{ + double inv_scale = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); double scale = 1.0; - if (inv_scale > 0.0) - scale = 1.0 / inv_scale; + if (inv_scale > 0.0) scale = 1.0 / inv_scale; v[0] *= scale; v[1] *= scale; v[2] *= scale; @@ -89,35 +89,35 @@ static void norm3safe(double *v) { // -------------------------------------------- // ------- Calculate the dihedral angle ------- // -------------------------------------------- -static const int g_dim=3; +static const int g_dim = 3; -static double Phi(double const *x1, //array holding x,y,z coords atom 1 - double const *x2, // : : : : 2 - double const *x3, // : : : : 3 - double const *x4, // : : : : 4 - Domain *domain, //<-periodic boundary information - double *vb12, //<-preallocated vector will store x2-x1 - double *vb23, //<-preallocated vector will store x3-x2 - double *vb34, //<-preallocated vector will store x4-x3 - double *n123, //<-will store normal to plane x1,x2,x3 - double *n234) //<-will store normal to plane x2,x3,x4 +static double Phi(double const *x1, //array holding x,y,z coords atom 1 + double const *x2, // : : : : 2 + double const *x3, // : : : : 3 + double const *x4, // : : : : 4 + Domain *domain, //<-periodic boundary information + double *vb12, //<-preallocated vector will store x2-x1 + double *vb23, //<-preallocated vector will store x3-x2 + double *vb34, //<-preallocated vector will store x4-x3 + double *n123, //<-will store normal to plane x1,x2,x3 + double *n234) //<-will store normal to plane x2,x3,x4 { - for (int d=0; d < g_dim; ++d) { - vb12[d] = x2[d] - x1[d]; // 1st bond - vb23[d] = x3[d] - x2[d]; // 2nd bond - vb34[d] = x4[d] - x3[d]; // 3rd bond + for (int d = 0; d < g_dim; ++d) { + vb12[d] = x2[d] - x1[d]; // 1st bond + vb23[d] = x3[d] - x2[d]; // 2nd bond + vb34[d] = x4[d] - x3[d]; // 3rd bond } //Consider periodic boundary conditions: - domain->minimum_image(vb12[0],vb12[1],vb12[2]); - domain->minimum_image(vb23[0],vb23[1],vb23[2]); - domain->minimum_image(vb34[0],vb34[1],vb34[2]); + domain->minimum_image(vb12[0], vb12[1], vb12[2]); + domain->minimum_image(vb23[0], vb23[1], vb23[2]); + domain->minimum_image(vb34[0], vb34[1], vb34[2]); //--- Compute the normal to the planes formed by atoms 1,2,3 and 2,3,4 --- - cross3(vb23, vb12, n123); // <- n123=vb23 x vb12 - cross3(vb23, vb34, n234); // <- n234=vb23 x vb34 + cross3(vb23, vb12, n123); // <- n123=vb23 x vb12 + cross3(vb23, vb34, n234); // <- n234=vb23 x vb34 norm3safe(n123); norm3safe(n234); @@ -132,20 +132,18 @@ static double Phi(double const *x1, //array holding x,y,z coords atom 1 double phi = acos(cos_phi); if (dot3(n123, vb34) > 0.0) { - phi = -phi; //(Note: Negative dihedral angles are possible only in 3-D.) - phi += MY_2PI; //<- This insure phi is always in the range 0 to 2*PI + phi = -phi; //(Note: Negative dihedral angles are possible only in 3-D.) + phi += MY_2PI; //<- This insure phi is always in the range 0 to 2*PI } return phi; -} // DihedralSpherical::Phi() - - +} // DihedralSpherical::Phi() /* ---------------------------------------------------------------------- */ void DihedralSpherical::compute(int eflag, int vflag) { - int i1,i2,i3,i4,n,type; - double edihedral,f1[3],f2[3],f3[3],f4[3]; + int i1, i2, i3, i4, n, type; + double edihedral, f1[3], f2[3], f3[3], f4[3]; double **x = atom->x; double **f = atom->f; @@ -188,17 +186,17 @@ void DihedralSpherical::compute(int eflag, int vflag) // x[i4] // - double vb12[g_dim]; // displacement vector from atom i1 towards atom i2 + double vb12[g_dim]; // displacement vector from atom i1 towards atom i2 // vb12[d] = x[i2][d] - x[i1][d] (for d=0,1,2) - double vb23[g_dim]; // displacement vector from atom i2 towards atom i3 + double vb23[g_dim]; // displacement vector from atom i2 towards atom i3 // vb23[d] = x[i3][d] - x[i2][d] (for d=0,1,2) - double vb34[g_dim]; // displacement vector from atom i3 towards atom i4 + double vb34[g_dim]; // displacement vector from atom i3 towards atom i4 // vb34[d] = x[i4][d] - x[i3][d] (for d=0,1,2) // n123 & n234: These two unit vectors are normal to the planes // defined by atoms 1,2,3 and 2,3,4. - double n123[g_dim]; //n123=vb23 x vb12 / |vb23 x vb12| ("x" is cross product) - double n234[g_dim]; //n234=vb23 x vb34 / |vb23 x vb34| ("x" is cross product) + double n123[g_dim]; //n123=vb23 x vb12 / |vb23 x vb12| ("x" is cross product) + double n234[g_dim]; //n234=vb23 x vb34 / |vb23 x vb34| ("x" is cross product) // The next 4 vectors are needed to calculate dphi_dx = d phi / dx double proj12on23[g_dim]; @@ -211,8 +209,7 @@ void DihedralSpherical::compute(int eflag, int vflag) // perp34on23[d] = v34[d] - proj34on23[d] edihedral = 0.0; - ev_init(eflag,vflag); - + ev_init(eflag, vflag); for (n = 0; n < ndihedrallist; n++) { @@ -229,13 +226,10 @@ void DihedralSpherical::compute(int eflag, int vflag) // This function also calculates the vectors: // vb12, vb23, vb34, n123, and n234, which we will need later. - - double phi = Phi(x[i1], x[i2], x[i3], x[i4], domain, - vb12, vb23, vb34, n123, n234); + double phi = Phi(x[i1], x[i2], x[i3], x[i4], domain, vb12, vb23, vb34, n123, n234); // Step 2: Compute the gradients of phi, theta1, theta2 with atom position: - // ===================== Step2a) phi dependence: ======================== // // Gradient variables: @@ -243,29 +237,29 @@ void DihedralSpherical::compute(int eflag, int vflag) // dphi_dx1, dphi_dx2, dphi_dx3, dphi_dx4 are the gradients of phi with // respect to the atomic positions of atoms i1, i2, i3, i4, respectively. // As an example, consider dphi_dx1. The d'th element is: - double dphi_dx1[g_dim]; // d phi - double dphi_dx2[g_dim]; // dphi_dx1[d] = ---------- (partial derivatives) - double dphi_dx3[g_dim]; // d x[i1][d] - double dphi_dx4[g_dim]; //where d=0,1,2 corresponds to x,y,z (g_dim==3) + double dphi_dx1[g_dim]; // d phi + double dphi_dx2[g_dim]; // dphi_dx1[d] = ---------- (partial derivatives) + double dphi_dx3[g_dim]; // d x[i1][d] + double dphi_dx4[g_dim]; //where d=0,1,2 corresponds to x,y,z (g_dim==3) - double dot123 = dot3(vb12, vb23); - double dot234 = dot3(vb23, vb34); + double dot123 = dot3(vb12, vb23); + double dot234 = dot3(vb23, vb34); - double L23sqr = dot3(vb23, vb23); - double L23 = sqrt(L23sqr); // (central bond length) + double L23sqr = dot3(vb23, vb23); + double L23 = sqrt(L23sqr); // (central bond length) double inv_L23sqr = 0.0; - double inv_L23 = 0.0; + double inv_L23 = 0.0; if (L23sqr != 0.0) { inv_L23sqr = 1.0 / L23sqr; inv_L23 = 1.0 / L23; } - double neg_inv_L23 = -inv_L23; + double neg_inv_L23 = -inv_L23; double dot123_over_L23sqr = dot123 * inv_L23sqr; double dot234_over_L23sqr = dot234 * inv_L23sqr; - for (int d=0; d < g_dim; ++d) { + for (int d = 0; d < g_dim; ++d) { // See figure above for a visual definitions of these vectors: proj12on23[d] = vb23[d] * dot123_over_L23sqr; proj34on23[d] = vb23[d] * dot234_over_L23sqr; @@ -287,7 +281,7 @@ void DihedralSpherical::compute(int eflag, int vflag) double inv_perp34on23 = 0.0; if (perp34on23_len != 0.0) inv_perp34on23 = 1.0 / perp34on23_len; - for (int d=0; d < g_dim; ++d) { + for (int d = 0; d < g_dim; ++d) { dphi_dx1[d] = n123[d] * inv_perp12on23; dphi_dx4[d] = n234[d] * inv_perp34on23; } @@ -331,17 +325,16 @@ void DihedralSpherical::compute(int eflag, int vflag) double dphi234_dx3_coef = neg_inv_L23 * (L23 + proj34on23_len); double dphi123_dx3_coef = inv_L23 * proj12on23_len; - for (int d=0; d < g_dim; ++d) { + for (int d = 0; d < g_dim; ++d) { // Recall that the n123 and n234 plane normal vectors are proportional to // the dphi/dx1 and dphi/dx2 gradients vectors // It turns out we can save slightly more CPU cycles by expressing // dphi/dx2 and dphi/dx3 as linear combinations of dphi/dx1 and dphi/dx2 // which we computed already (instead of n123 & n234). - dphi_dx2[d] = dphi123_dx2_coef*dphi_dx1[d] + dphi234_dx2_coef*dphi_dx4[d]; - dphi_dx3[d] = dphi123_dx3_coef*dphi_dx1[d] + dphi234_dx3_coef*dphi_dx4[d]; + dphi_dx2[d] = dphi123_dx2_coef * dphi_dx1[d] + dphi234_dx2_coef * dphi_dx4[d]; + dphi_dx3[d] = dphi123_dx3_coef * dphi_dx1[d] + dphi234_dx3_coef * dphi_dx4[d]; } - // ============= Step2b) theta1 and theta2 dependence: ============= // --- Compute the gradient vectors dtheta1/dx1 and dtheta2/dx4: --- @@ -349,25 +342,25 @@ void DihedralSpherical::compute(int eflag, int vflag) // These two gradients point in the direction of n123 and n234, // and are scaled by the distances of atoms 1 and 4 from the central axis. // Distance of atom 1 to central axis: - double dth1_dx1[g_dim]; // d theta1 (partial - double dth1_dx2[g_dim]; // dth1_dx1[d] = ---------- derivative) - double dth1_dx3[g_dim]; // d x[i1][d] + double dth1_dx1[g_dim]; // d theta1 (partial + double dth1_dx2[g_dim]; // dth1_dx1[d] = ---------- derivative) + double dth1_dx3[g_dim]; // d x[i1][d] //Note dth1_dx4 = 0 //Note dth2_dx1 = 0 - double dth2_dx2[g_dim]; // d theta2 (partial - double dth2_dx3[g_dim]; // dth2_dx1[d] = ---------- derivative) - double dth2_dx4[g_dim]; // d x[i1][d] - //where d=0,1,2 corresponds to x,y,z (g_dim==3) + double dth2_dx2[g_dim]; // d theta2 (partial + double dth2_dx3[g_dim]; // dth2_dx1[d] = ---------- derivative) + double dth2_dx4[g_dim]; // d x[i1][d] + //where d=0,1,2 corresponds to x,y,z (g_dim==3) - double L12sqr = dot3(vb12, vb12); - double L12 = sqrt(L12sqr); - double L34sqr = dot3(vb34, vb34); - double L34 = sqrt(L34sqr); + double L12sqr = dot3(vb12, vb12); + double L12 = sqrt(L12sqr); + double L34sqr = dot3(vb34, vb34); + double L34 = sqrt(L34sqr); double inv_L12sqr = 0.0; - double inv_L12 = 0.0; + double inv_L12 = 0.0; double inv_L34sqr = 0.0; - double inv_L34 = 0.0; + double inv_L34 = 0.0; if (L12sqr != 0.0) { inv_L12sqr = 1.0 / L12sqr; inv_L12 = 1.0 / L12; @@ -416,7 +409,7 @@ void DihedralSpherical::compute(int eflag, int vflag) * x[i4] */ - for (int d=0; d < g_dim; ++d) { + for (int d = 0; d < g_dim; ++d) { // See figure above for a visual definitions of these vectors: proj23on12[d] = vb12[d] * dot123_over_L12sqr; proj23on34[d] = vb34[d] * dot234_over_L34sqr; @@ -433,11 +426,11 @@ void DihedralSpherical::compute(int eflag, int vflag) if (perp23on34_len != 0.0) inv_perp23on34 = 1.0 / perp23on34_len; double coeff_dth1_dx1 = -inv_perp23on12 * inv_L12; - double coeff_dth1_dx3 = inv_perp12on23 * inv_L23; + double coeff_dth1_dx3 = inv_perp12on23 * inv_L23; double coeff_dth2_dx2 = -inv_perp34on23 * inv_L23; - double coeff_dth2_dx4 = inv_perp23on34 * inv_L34; + double coeff_dth2_dx4 = inv_perp23on34 * inv_L34; - for (int d=0; d < g_dim; ++d) { + for (int d = 0; d < g_dim; ++d) { dth1_dx1[d] = perp23on12[d] * coeff_dth1_dx1; dth1_dx3[d] = perp12on23[d] * coeff_dth1_dx3; dth1_dx2[d] = -(dth1_dx1[d] + dth1_dx3[d]); @@ -450,24 +443,26 @@ void DihedralSpherical::compute(int eflag, int vflag) } double ct1 = -dot123 * inv_L12 * inv_L23; - if (ct1 < -1.0) ct1 = -1.0; - else if (ct1 > 1.0) ct1 = 1.0; + if (ct1 < -1.0) + ct1 = -1.0; + else if (ct1 > 1.0) + ct1 = 1.0; double theta1 = acos(ct1); double ct2 = -dot234 * inv_L23 * inv_L34; - if (ct2 < -1.0) ct2 = -1.0; - else if (ct2 > 1.0) ct2 = 1.0; + if (ct2 < -1.0) + ct2 = -1.0; + else if (ct2 > 1.0) + ct2 = 1.0; double theta2 = acos(ct2); // - Step 3: Calculate the energy and force in the phi & theta1/2 directions - double u=0.0; // u = energy - double m_du_dth1 = 0.0; // m_du_dth1 = -du / d theta1 - double m_du_dth2 = 0.0; // m_du_dth2 = -du / d theta2 - double m_du_dphi = 0.0; // m_du_dphi = -du / d phi + double u = 0.0; // u = energy + double m_du_dth1 = 0.0; // m_du_dth1 = -du / d theta1 + double m_du_dth2 = 0.0; // m_du_dth2 = -du / d theta2 + double m_du_dphi = 0.0; // m_du_dphi = -du / d phi - u = CalcGeneralizedForces(type, - phi, theta1, theta2, - &m_du_dth1, &m_du_dth2, &m_du_dphi); + u = CalcGeneralizedForces(type, phi, theta1, theta2, &m_du_dth1, &m_du_dth2, &m_du_dphi); if (eflag) edihedral = u; @@ -477,13 +472,13 @@ void DihedralSpherical::compute(int eflag, int vflag) // d U d U d phi d U d theta1 d U d theta2 // -f = ----- = ----- * ----- + -------*------- + --------*-------- // d x d phi d x d theta1 d X d theta2 d X - for (int d=0; d < g_dim; ++d) { - f1[d] = m_du_dphi*dphi_dx1[d]+m_du_dth1*dth1_dx1[d]; - //note: dth2_dx1[d]=0 - f2[d] = m_du_dphi*dphi_dx2[d]+m_du_dth1*dth1_dx2[d]+m_du_dth2*dth2_dx2[d]; - f3[d] = m_du_dphi*dphi_dx3[d]+m_du_dth1*dth1_dx3[d]+m_du_dth2*dth2_dx3[d]; - f4[d] = m_du_dphi*dphi_dx4[d] + m_du_dth2*dth2_dx4[d]; - //note: dth1_dx4[d] = 0 + for (int d = 0; d < g_dim; ++d) { + f1[d] = m_du_dphi * dphi_dx1[d] + m_du_dth1 * dth1_dx1[d]; + //note: dth2_dx1[d]=0 + f2[d] = m_du_dphi * dphi_dx2[d] + m_du_dth1 * dth1_dx2[d] + m_du_dth2 * dth2_dx2[d]; + f3[d] = m_du_dphi * dphi_dx3[d] + m_du_dth1 * dth1_dx3[d] + m_du_dth2 * dth2_dx3[d]; + f4[d] = m_du_dphi * dphi_dx4[d] + m_du_dth2 * dth2_dx4[d]; + //note: dth1_dx4[d] = 0 } // apply force to each of 4 atoms @@ -513,26 +508,15 @@ void DihedralSpherical::compute(int eflag, int vflag) } if (evflag) - ev_tally(i1,i2,i3,i4, - nlocal,newton_bond,edihedral, - f1,f3,f4, - vb12[0],vb12[1],vb12[2], - vb23[0],vb23[1],vb23[2], - vb34[0],vb34[1],vb34[2]); + ev_tally(i1, i2, i3, i4, nlocal, newton_bond, edihedral, f1, f3, f4, vb12[0], vb12[1], + vb12[2], vb23[0], vb23[1], vb23[2], vb34[0], vb34[1], vb34[2]); } -} // void DihedralSpherical::compute() - - - - - +} // void DihedralSpherical::compute() // --- CalcGeneralizedForces() --- // --- Calculate the energy as a function of theta1, theta2, and phi --- // --- as well as its derivatives (with respect to theta1, theta2, and phi) --- - - // The code above above is sufficiently general that it can work with any // any function of the angles theta1, theta2, and phi. However the // function below calculates the energy and force according to this specific @@ -545,17 +529,9 @@ void DihedralSpherical::compute(int eflag, int vflag) // \Theta_{2i}(\theta_2) = cos((\theta_2-b_i)L_i) + v_i // \Phi_i(\phi) = cos((\phi - c_i)M_i) + w_i - - - -double DihedralSpherical:: -CalcGeneralizedForces(int type, - double phi, - double theta1, - double theta2, - double *m_du_dth1, - double *m_du_dth2, - double *m_du_dphi) +double DihedralSpherical::CalcGeneralizedForces(int type, double phi, double theta1, double theta2, + double *m_du_dth1, double *m_du_dth2, + double *m_du_dphi) { double energy = 0.0; assert(m_du_dphi && m_du_dphi && m_du_dphi); @@ -573,7 +549,7 @@ CalcGeneralizedForces(int type, double cp = 1.0; double sp = 0.0; if (phi_mult[i][j] != 0.0) { - double p = phi_mult[i][j] * (phi - phi_shift[i][j]); + double p = phi_mult[i][j] * (phi - phi_shift[i][j]); cp = cos(p); sp = sin(p); } @@ -581,7 +557,7 @@ CalcGeneralizedForces(int type, double ct1 = 1.0; double st1 = 0.0; if (theta1_mult[i][j] != 0.0) { - double t1 = theta1_mult[i][j]*(theta1 - theta1_shift[i][j]); + double t1 = theta1_mult[i][j] * (theta1 - theta1_shift[i][j]); ct1 = cos(t1); st1 = sin(t1); } @@ -589,28 +565,23 @@ CalcGeneralizedForces(int type, double ct2 = 1.0; double st2 = 0.0; if (theta2_mult[i][j] != 0.0) { - double t2 = theta2_mult[i][j]*(theta2 - theta2_shift[i][j]); + double t2 = theta2_mult[i][j] * (theta2 - theta2_shift[i][j]); ct2 = cos(t2); st2 = sin(t2); } - energy += Ccoeff[i][j] * (phi_offset[i][j] - cp) * - (theta1_offset[i][j] - ct1) * - (theta2_offset[i][j] - ct2); + energy += Ccoeff[i][j] * (phi_offset[i][j] - cp) * (theta1_offset[i][j] - ct1) * + (theta2_offset[i][j] - ct2); // Forces: - *m_du_dphi += -Ccoeff[i][j] * sp * phi_mult[i][j] * - (theta1_offset[i][j] - ct1) * - (theta2_offset[i][j] - ct2); + *m_du_dphi += -Ccoeff[i][j] * sp * phi_mult[i][j] * (theta1_offset[i][j] - ct1) * + (theta2_offset[i][j] - ct2); - *m_du_dth1 += -Ccoeff[i][j] * (phi_offset[i][j] - cp) * - st1 * theta1_mult[i][j] * - (theta2_offset[i][j] - ct2); - - *m_du_dth2 += -Ccoeff[i][j] * (phi_offset[i][j] - cp) * - (theta1_offset[i][j] - ct1) * - st2 * theta2_mult[i][j]; + *m_du_dth1 += -Ccoeff[i][j] * (phi_offset[i][j] - cp) * st1 * theta1_mult[i][j] * + (theta2_offset[i][j] - ct2); + *m_du_dth2 += -Ccoeff[i][j] * (phi_offset[i][j] - cp) * (theta1_offset[i][j] - ct1) * st2 * + theta2_mult[i][j]; // Things to consider later: // To speed up the computation, one could try to simplify the expansion: @@ -622,35 +593,29 @@ CalcGeneralizedForces(int type, // can be calculated more efficiently using polynomials of // cos(phi) and sin(phi) - } //for (int j = 0; j < nterms[i]; j++) { + } //for (int j = 0; j < nterms[i]; j++) { return energy; -} //CalcGeneralizedForces() - - - - - - +} //CalcGeneralizedForces() void DihedralSpherical::allocate() { allocated = 1; - int n = atom->ndihedraltypes+1; + int n = atom->ndihedraltypes + 1; - memory->create(nterms,n,"dihedral:nterms"); + memory->create(nterms, n, "dihedral:nterms"); - Ccoeff = new double * [n]; - phi_mult = new double * [n]; - phi_shift = new double * [n]; - phi_offset = new double * [n]; - theta1_mult = new double * [n]; - theta1_shift = new double * [n]; - theta1_offset = new double * [n]; - theta2_mult = new double * [n]; - theta2_shift = new double * [n]; - theta2_offset = new double * [n]; + Ccoeff = new double *[n]; + phi_mult = new double *[n]; + phi_shift = new double *[n]; + phi_offset = new double *[n]; + theta1_mult = new double *[n]; + theta1_shift = new double *[n]; + theta1_offset = new double *[n]; + theta2_mult = new double *[n]; + theta2_shift = new double *[n]; + theta2_offset = new double *[n]; for (int i = 0; i < n; i++) { Ccoeff[i] = nullptr; phi_mult[i] = nullptr; @@ -664,7 +629,7 @@ void DihedralSpherical::allocate() theta2_offset[i] = nullptr; } - memory->create(setflag,n,"dihedral:setflag"); + memory->create(setflag, n, "dihedral:setflag"); for (int i = 1; i < n; i++) setflag[i] = 0; } @@ -674,19 +639,18 @@ void DihedralSpherical::allocate() void DihedralSpherical::coeff(int narg, char **arg) { - if (narg < 4) error->all(FLERR,"Incorrect args for dihedral coefficients"); + if (narg < 4) error->all(FLERR, "Incorrect args for dihedral coefficients"); if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->ndihedraltypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->ndihedraltypes, ilo, ihi, error); - int nterms_one = utils::inumeric(FLERR,arg[1],false,lmp); + int nterms_one = utils::inumeric(FLERR, arg[1], false, lmp); - if (nterms_one < 1) - error->all(FLERR,"Incorrect number of terms arg for dihedral coefficients"); + if (nterms_one < 1) error->all(FLERR, "Incorrect number of terms arg for dihedral coefficients"); - if (2+10*nterms_one < narg) - error->all(FLERR,"Incorrect number of arguments for dihedral coefficients"); + if (2 + 10 * nterms_one < narg) + error->all(FLERR, "Incorrect number of arguments for dihedral coefficients"); int count = 0; for (int i = ilo; i <= ihi; i++) { @@ -701,34 +665,34 @@ void DihedralSpherical::coeff(int narg, char **arg) delete[] theta2_mult[i]; delete[] theta2_shift[i]; delete[] theta2_offset[i]; - Ccoeff[i] = new double [nterms_one]; - phi_mult[i] = new double [nterms_one]; - phi_shift[i] = new double [nterms_one]; - phi_offset[i] = new double [nterms_one]; - theta1_mult[i] = new double [nterms_one]; - theta1_shift[i] = new double [nterms_one]; - theta1_offset[i] = new double [nterms_one]; - theta2_mult[i] = new double [nterms_one]; - theta2_shift[i] = new double [nterms_one]; - theta2_offset[i] = new double [nterms_one]; + Ccoeff[i] = new double[nterms_one]; + phi_mult[i] = new double[nterms_one]; + phi_shift[i] = new double[nterms_one]; + phi_offset[i] = new double[nterms_one]; + theta1_mult[i] = new double[nterms_one]; + theta1_shift[i] = new double[nterms_one]; + theta1_offset[i] = new double[nterms_one]; + theta2_mult[i] = new double[nterms_one]; + theta2_shift[i] = new double[nterms_one]; + theta2_offset[i] = new double[nterms_one]; for (int j = 0; j < nterms_one; j++) { - int offset = 1+10*j; - Ccoeff[i][j] = utils::numeric(FLERR,arg[offset+1],false,lmp); - phi_mult[i][j] = utils::numeric(FLERR,arg[offset+2],false,lmp); - phi_shift[i][j] = utils::numeric(FLERR,arg[offset+3],false,lmp) * MY_PI/180.0; - phi_offset[i][j] = utils::numeric(FLERR,arg[offset+4],false,lmp); - theta1_mult[i][j] = utils::numeric(FLERR,arg[offset+5],false,lmp); - theta1_shift[i][j] = utils::numeric(FLERR,arg[offset+6],false,lmp) * MY_PI/180.0; - theta1_offset[i][j] = utils::numeric(FLERR,arg[offset+7],false,lmp); - theta2_mult[i][j] = utils::numeric(FLERR,arg[offset+8],false,lmp); - theta2_shift[i][j] = utils::numeric(FLERR,arg[offset+9],false,lmp) * MY_PI/180.0; - theta2_offset[i][j] = utils::numeric(FLERR,arg[offset+10],false,lmp); + int offset = 1 + 10 * j; + Ccoeff[i][j] = utils::numeric(FLERR, arg[offset + 1], false, lmp); + phi_mult[i][j] = utils::numeric(FLERR, arg[offset + 2], false, lmp); + phi_shift[i][j] = utils::numeric(FLERR, arg[offset + 3], false, lmp) * MY_PI / 180.0; + phi_offset[i][j] = utils::numeric(FLERR, arg[offset + 4], false, lmp); + theta1_mult[i][j] = utils::numeric(FLERR, arg[offset + 5], false, lmp); + theta1_shift[i][j] = utils::numeric(FLERR, arg[offset + 6], false, lmp) * MY_PI / 180.0; + theta1_offset[i][j] = utils::numeric(FLERR, arg[offset + 7], false, lmp); + theta2_mult[i][j] = utils::numeric(FLERR, arg[offset + 8], false, lmp); + theta2_shift[i][j] = utils::numeric(FLERR, arg[offset + 9], false, lmp) * MY_PI / 180.0; + theta2_offset[i][j] = utils::numeric(FLERR, arg[offset + 10], false, lmp); } setflag[i] = 1; count++; } - if (count == 0) error->all(FLERR,"Incorrect args for dihedral coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for dihedral coefficients"); } /* ---------------------------------------------------------------------- @@ -737,18 +701,18 @@ void DihedralSpherical::coeff(int narg, char **arg) void DihedralSpherical::write_restart(FILE *fp) { - fwrite(&nterms[1],sizeof(int),atom->ndihedraltypes,fp); + fwrite(&nterms[1], sizeof(int), atom->ndihedraltypes, fp); for (int i = 1; i <= atom->ndihedraltypes; i++) { - fwrite(Ccoeff[i],sizeof(double),nterms[i],fp); - fwrite(phi_mult[i],sizeof(double),nterms[i],fp); - fwrite(phi_shift[i],sizeof(double),nterms[i],fp); - fwrite(phi_offset[i],sizeof(double),nterms[i],fp); - fwrite(theta1_mult[i],sizeof(double),nterms[i],fp); - fwrite(theta1_shift[i],sizeof(double),nterms[i],fp); - fwrite(theta1_offset[i],sizeof(double),nterms[i],fp); - fwrite(theta2_mult[i],sizeof(double),nterms[i],fp); - fwrite(theta2_shift[i],sizeof(double),nterms[i],fp); - fwrite(theta2_offset[i],sizeof(double),nterms[i],fp); + fwrite(Ccoeff[i], sizeof(double), nterms[i], fp); + fwrite(phi_mult[i], sizeof(double), nterms[i], fp); + fwrite(phi_shift[i], sizeof(double), nterms[i], fp); + fwrite(phi_offset[i], sizeof(double), nterms[i], fp); + fwrite(theta1_mult[i], sizeof(double), nterms[i], fp); + fwrite(theta1_shift[i], sizeof(double), nterms[i], fp); + fwrite(theta1_offset[i], sizeof(double), nterms[i], fp); + fwrite(theta2_mult[i], sizeof(double), nterms[i], fp); + fwrite(theta2_shift[i], sizeof(double), nterms[i], fp); + fwrite(theta2_offset[i], sizeof(double), nterms[i], fp); } } @@ -761,58 +725,55 @@ void DihedralSpherical::read_restart(FILE *fp) allocate(); if (comm->me == 0) - utils::sfread(FLERR,&nterms[1],sizeof(int),atom->ndihedraltypes,fp,nullptr,error); + utils::sfread(FLERR, &nterms[1], sizeof(int), atom->ndihedraltypes, fp, nullptr, error); - MPI_Bcast(&nterms[1],atom->ndihedraltypes,MPI_INT,0,world); + MPI_Bcast(&nterms[1], atom->ndihedraltypes, MPI_INT, 0, world); // allocate - for (int i=1; i<=atom->ndihedraltypes; i++) { - Ccoeff[i] = new double [nterms[i]]; - phi_mult[i] = new double [nterms[i]]; - phi_shift[i] = new double [nterms[i]]; - phi_offset[i] = new double [nterms[i]]; - theta1_mult[i] = new double [nterms[i]]; - theta1_shift[i] = new double [nterms[i]]; - theta1_offset[i] = new double [nterms[i]]; - theta2_mult[i] = new double [nterms[i]]; - theta2_shift[i] = new double [nterms[i]]; - theta2_offset[i] = new double [nterms[i]]; + for (int i = 1; i <= atom->ndihedraltypes; i++) { + Ccoeff[i] = new double[nterms[i]]; + phi_mult[i] = new double[nterms[i]]; + phi_shift[i] = new double[nterms[i]]; + phi_offset[i] = new double[nterms[i]]; + theta1_mult[i] = new double[nterms[i]]; + theta1_shift[i] = new double[nterms[i]]; + theta1_offset[i] = new double[nterms[i]]; + theta2_mult[i] = new double[nterms[i]]; + theta2_shift[i] = new double[nterms[i]]; + theta2_offset[i] = new double[nterms[i]]; } if (comm->me == 0) { - for (int i=1; i<=atom->ndihedraltypes; i++) { - utils::sfread(FLERR,Ccoeff[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,phi_mult[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,phi_shift[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,phi_offset[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta1_mult[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta1_shift[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta1_offset[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta2_mult[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta2_shift[i],sizeof(double),nterms[i],fp,nullptr,error); - utils::sfread(FLERR,theta2_offset[i],sizeof(double),nterms[i],fp,nullptr,error); + for (int i = 1; i <= atom->ndihedraltypes; i++) { + utils::sfread(FLERR, Ccoeff[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, phi_mult[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, phi_shift[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, phi_offset[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta1_mult[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta1_shift[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta1_offset[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta2_mult[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta2_shift[i], sizeof(double), nterms[i], fp, nullptr, error); + utils::sfread(FLERR, theta2_offset[i], sizeof(double), nterms[i], fp, nullptr, error); } } - for (int i=1; i<=atom->ndihedraltypes; i++) { - MPI_Bcast(Ccoeff[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(phi_mult[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(phi_shift[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(phi_offset[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta1_mult[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta1_shift[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta1_offset[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta2_mult[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta2_shift[i],nterms[i],MPI_DOUBLE,0,world); - MPI_Bcast(theta2_offset[i],nterms[i],MPI_DOUBLE,0,world); + for (int i = 1; i <= atom->ndihedraltypes; i++) { + MPI_Bcast(Ccoeff[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(phi_mult[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(phi_shift[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(phi_offset[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta1_mult[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta1_shift[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta1_offset[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta2_mult[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta2_shift[i], nterms[i], MPI_DOUBLE, 0, world); + MPI_Bcast(theta2_offset[i], nterms[i], MPI_DOUBLE, 0, world); } for (int i = 1; i <= atom->ndihedraltypes; i++) setflag[i] = 1; } - - - /* ---------------------------------------------------------------------- proc 0 writes to data file ------------------------------------------------------------------------- */ @@ -820,15 +781,14 @@ void DihedralSpherical::read_restart(FILE *fp) void DihedralSpherical::write_data(FILE *fp) { for (int i = 1; i <= atom->ndihedraltypes; i++) { - fprintf(fp,"%d %d ", i , nterms[i]); + fprintf(fp, "%d %d ", i, nterms[i]); for (int j = 0; j < nterms[i]; j++) { - fprintf(fp, "%g %g %g %g %g %g %g %g %g %g ", Ccoeff[i][j], - phi_mult[i][j], phi_shift[i][j]*180.0/MY_PI, phi_offset[i][j], - theta1_mult[i][j], theta1_shift[i][j]*180.0/MY_PI, - theta1_offset[i][j], theta2_mult[i][j], - theta2_shift[i][j]*180.0/MY_PI, theta2_offset[i][j]); + fprintf(fp, "%g %g %g %g %g %g %g %g %g %g ", Ccoeff[i][j], phi_mult[i][j], + phi_shift[i][j] * 180.0 / MY_PI, phi_offset[i][j], theta1_mult[i][j], + theta1_shift[i][j] * 180.0 / MY_PI, theta1_offset[i][j], theta2_mult[i][j], + theta2_shift[i][j] * 180.0 / MY_PI, theta2_offset[i][j]); } - fprintf(fp,"\n"); + fprintf(fp, "\n"); } } @@ -874,4 +834,3 @@ void DihedralSpherical::write_data(FILE *fp) // &m_du_dth1, &m_du_dth2, &m_du_dphi); // return u; //} - From 9ce9d36ac585ef117967e175c518589602c0fe9d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:18:42 -0400 Subject: [PATCH 047/437] correct package designations for styles in the EXTRA-MOLECULES package --- doc/src/angle_cosine_shift.rst | 3 ++- doc/src/angle_cosine_shift_exp.rst | 2 +- doc/src/angle_fourier.rst | 2 +- doc/src/angle_fourier_simple.rst | 2 +- doc/src/angle_gaussian.rst | 2 +- doc/src/angle_quartic.rst | 2 +- doc/src/bond_gaussian.rst | 2 +- doc/src/bond_harmonic_shift.rst | 2 +- doc/src/bond_harmonic_shift_cut.rst | 2 +- doc/src/dihedral_fourier.rst | 4 ++-- doc/src/dihedral_nharmonic.rst | 4 ++-- doc/src/dihedral_quadratic.rst | 4 ++-- doc/src/dihedral_spherical.rst | 2 +- doc/src/dihedral_table.rst | 7 ++++--- 14 files changed, 21 insertions(+), 19 deletions(-) diff --git a/doc/src/angle_cosine_shift.rst b/doc/src/angle_cosine_shift.rst index a22f93b1d0..ab4a945140 100644 --- a/doc/src/angle_cosine_shift.rst +++ b/doc/src/angle_cosine_shift.rst @@ -53,7 +53,8 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. +EXTRA-MOLECULE package. See the :doc:`Build package ` doc +page for more info. Related commands """""""""""""""" diff --git a/doc/src/angle_cosine_shift_exp.rst b/doc/src/angle_cosine_shift_exp.rst index 72962abc1c..fe84c588f6 100644 --- a/doc/src/angle_cosine_shift_exp.rst +++ b/doc/src/angle_cosine_shift_exp.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_fourier.rst b/doc/src/angle_fourier.rst index 780ecd510c..06e87fa97f 100644 --- a/doc/src/angle_fourier.rst +++ b/doc/src/angle_fourier.rst @@ -50,7 +50,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_fourier_simple.rst b/doc/src/angle_fourier_simple.rst index 29a493a442..4971e22c93 100644 --- a/doc/src/angle_fourier_simple.rst +++ b/doc/src/angle_fourier_simple.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_gaussian.rst b/doc/src/angle_gaussian.rst index 9f2964f5f7..f0a50938e4 100644 --- a/doc/src/angle_gaussian.rst +++ b/doc/src/angle_gaussian.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_quartic.rst b/doc/src/angle_quartic.rst index e153faee73..6cc27ecb24 100644 --- a/doc/src/angle_quartic.rst +++ b/doc/src/angle_quartic.rst @@ -57,7 +57,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_gaussian.rst b/doc/src/bond_gaussian.rst index 369b9eac26..9fbcf4778c 100644 --- a/doc/src/bond_gaussian.rst +++ b/doc/src/bond_gaussian.rst @@ -50,7 +50,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_harmonic_shift.rst b/doc/src/bond_harmonic_shift.rst index 24bbc98b83..43e10bde00 100644 --- a/doc/src/bond_harmonic_shift.rst +++ b/doc/src/bond_harmonic_shift.rst @@ -56,7 +56,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_harmonic_shift_cut.rst b/doc/src/bond_harmonic_shift_cut.rst index 05fb245727..d8d4a792b7 100644 --- a/doc/src/bond_harmonic_shift_cut.rst +++ b/doc/src/bond_harmonic_shift_cut.rst @@ -54,7 +54,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_fourier.rst b/doc/src/dihedral_fourier.rst index 7889b3c58f..a26f88d688 100644 --- a/doc/src/dihedral_fourier.rst +++ b/doc/src/dihedral_fourier.rst @@ -54,8 +54,8 @@ or :doc:`read_restart ` commands: Restrictions """""""""""" -This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +This dihedral style can only be used if LAMMPS was built with the +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_nharmonic.rst b/doc/src/dihedral_nharmonic.rst index 06ae8be8a0..d4ba345bf4 100644 --- a/doc/src/dihedral_nharmonic.rst +++ b/doc/src/dihedral_nharmonic.rst @@ -50,8 +50,8 @@ or :doc:`read_restart ` commands: Restrictions """""""""""" -This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +This dihedral style can only be used if LAMMPS was built with the +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_quadratic.rst b/doc/src/dihedral_quadratic.rst index a776c953c1..ea093d1dea 100644 --- a/doc/src/dihedral_quadratic.rst +++ b/doc/src/dihedral_quadratic.rst @@ -55,8 +55,8 @@ radian\^2. Restrictions """""""""""" -This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +This dihedral style can only be used if LAMMPS was built with the +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_spherical.rst b/doc/src/dihedral_spherical.rst index 9704bff1a8..9a3db70314 100644 --- a/doc/src/dihedral_spherical.rst +++ b/doc/src/dihedral_spherical.rst @@ -89,7 +89,7 @@ Restrictions """""""""""" This dihedral style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_table.rst b/doc/src/dihedral_table.rst index 7c08241458..e0830b523c 100644 --- a/doc/src/dihedral_table.rst +++ b/doc/src/dihedral_table.rst @@ -244,9 +244,10 @@ script after reading the restart file. Restrictions """""""""""" -These dihedral styles can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc -page for more info. +The *table* dihedral style can only be used if LAMMPS was built with the +MOLECULE package. The *table/cut* dihedral style can only be used if +LAMMPS was built with the EXTRA-MOLECULE package. See the +:doc:`Build package ` doc page for more info. Related commands """""""""""""""" From 9b4317335a091fa1b4ab2b19cda766f1b1c7e9f7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:26:43 -0400 Subject: [PATCH 048/437] reorder includes --- src/MOLECULE/dihedral_harmonic.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MOLECULE/dihedral_harmonic.cpp b/src/MOLECULE/dihedral_harmonic.cpp index 5603178bcf..5ab866fa33 100644 --- a/src/MOLECULE/dihedral_harmonic.cpp +++ b/src/MOLECULE/dihedral_harmonic.cpp @@ -18,15 +18,15 @@ #include "dihedral_harmonic.h" -#include #include "atom.h" #include "comm.h" -#include "neighbor.h" -#include "force.h" -#include "update.h" -#include "memory.h" #include "error.h" +#include "force.h" +#include "memory.h" +#include "neighbor.h" +#include "update.h" +#include using namespace LAMMPS_NS; From 433ece22ecd0dd7613096c0ebb7dd3917058d253 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:28:32 -0400 Subject: [PATCH 049/437] add unit test for dihedral style spherical --- .../tests/dihedral-spherical.yaml | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 unittest/force-styles/tests/dihedral-spherical.yaml diff --git a/unittest/force-styles/tests/dihedral-spherical.yaml b/unittest/force-styles/tests/dihedral-spherical.yaml new file mode 100644 index 0000000000..1811ce1069 --- /dev/null +++ b/unittest/force-styles/tests/dihedral-spherical.yaml @@ -0,0 +1,87 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 10:57:54 2021 +epsilon: 2.5e-14 +skip_tests: +prerequisites: ! | + atom full + dihedral spherical +pre_commands: ! "" +post_commands: ! "" +input_file: in.fourmol +dihedral_style: spherical +dihedral_coeff: ! | + 1 1 75.0 1 170.0 1 1 100.0 0 1 100.0 0 + 2 2 25.0 1 170.0 1 1 100.0 0 1 100.0 0 50.0 1 170.0 1 1 100.0 0 1 100.0 0 + 3 3 25.0 1 170.0 1 1 100.0 0 1 100.0 0 25.0 1 170.0 1 1 100.0 0 1 100.0 0 25.0 1 170.0 1 1 100.0 0 1 100.0 0 + 4 1 286.1 1 124 1 1 90.0 0 1 90.0 0 + 5 3 69.3 1 93.9 1 1 90 0 1 90 0 49.1 0 0.00 0 1 74.4 1 0 0.00 0 25.2 0 0.00 0 0 0.00 0 1 48.1 1 +extract: ! "" +natoms: 29 +init_energy: 2971.2383065182107 +init_stress: ! |2- + 5.3691408134277469e+02 -2.4278648172523600e+02 -2.9412759961753875e+02 2.1748842337298720e+02 -1.3130250014127927e+02 1.2699460888082062e+02 +init_forces: ! |2 + 1 -5.1299150424548074e+01 -2.6832797172644085e+01 2.7179724354789787e+00 + 2 4.2174859183618096e+00 3.2161732977867516e+01 2.6070392924255202e+01 + 3 8.0160254399259998e+01 1.7163751181857435e+02 -2.9457754920984252e+02 + 4 -3.4546537081267040e+01 -2.0398561181718726e+01 4.0629977035703519e+01 + 5 -7.4634384821521671e-01 -1.0073209504217054e+01 -3.1777777368359530e+00 + 6 9.5873325747250490e+01 1.5102014498290663e+02 5.7731798785549802e+02 + 7 -1.7620683444783128e+02 -9.0588105496720743e+01 1.1271838729882237e+01 + 8 -6.6542430644327723e+01 -1.2746762742589269e+01 -9.1269023645291645e+02 + 9 3.1030762983927058e+01 -1.3920555814795441e+02 2.6868441328496157e+01 + 10 -3.3798236314375650e+01 1.1512842785842382e+02 7.2999211547967263e+02 + 11 5.6571642982815739e+01 -3.3103843238397189e+01 6.2566397505084268e+00 + 12 -2.5699528710481310e+01 2.4557453475074741e+01 -4.0808265187191921e+00 + 13 5.0092304609755516e+00 1.2803710235286633e+01 -2.9680689236583362e+00 + 14 1.4026184085574172e+01 -5.5770183842894227e+01 -9.7846221633007033e+00 + 15 1.4850114334338436e+00 4.1522209421394365e+00 -1.1543160215831875e+01 + 16 1.7051941668640254e+02 4.8718425575884538e+01 -2.0096667661987300e+02 + 17 -7.0054253226954927e+01 -1.7146060653902191e+02 1.8663552301482596e+01 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_energy: 2965.2390304039986 +run_stress: ! |2- + 5.4016959641960705e+02 -2.4109421173858090e+02 -2.9907538468102621e+02 2.1634529044974451e+02 -1.3388628102363205e+02 1.2723973764407675e+02 +run_forces: ! |2 + 1 -5.0810965151635614e+01 -2.7216109025208077e+01 2.3602043332641918e+00 + 2 4.0960910552766947e+00 3.2456204271944252e+01 2.6337747315921739e+01 + 3 7.9644793108469358e+01 1.7280887127721473e+02 -2.9669709111502539e+02 + 4 -3.4680136126460731e+01 -2.0865372149681164e+01 4.0691427024172121e+01 + 5 -7.9421755054776177e-01 -1.0249893079806689e+01 -3.2465057099617938e+00 + 6 9.3591274519723370e+01 1.5281597092865354e+02 5.8619281796014138e+02 + 7 -1.7437783006887116e+02 -9.0377929688282336e+01 1.1471118665488826e+01 + 8 -6.7134415038939338e+01 -1.5628076672607847e+01 -9.2660607973886670e+02 + 9 3.1620812451760791e+01 -1.3942394237249255e+02 2.6408943770786756e+01 + 10 -3.3670789340214448e+01 1.1657183101565136e+02 7.4030345624752965e+02 + 11 5.5890002487272866e+01 -3.2505523328624463e+01 6.1036819817287054e+00 + 12 -2.5054349056107355e+01 2.3581074211906564e+01 -4.8499585588387291e+00 + 13 5.1062399806072012e+00 1.3125415059992939e+01 -3.1263083728212422e+00 + 14 1.3925654151711635e+01 -5.5574668671113535e+01 -9.6222875747796905e+00 + 15 9.0691046837621059e-01 4.0822736960653785e+00 -1.1320877519534751e+01 + 16 1.7163668110697810e+02 4.6961503900585427e+01 -2.0283921230519184e+02 + 17 -6.9895756997399872e+01 -1.7056162937419754e+02 1.8438923595986640e+01 + 18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +... From db887b4d7a2dcb2fcdacd2128f5308406ded329b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:49:29 -0400 Subject: [PATCH 050/437] add unit test for angle style dipole --- unittest/force-styles/tests/angle-dipole.yaml | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 unittest/force-styles/tests/angle-dipole.yaml diff --git a/unittest/force-styles/tests/angle-dipole.yaml b/unittest/force-styles/tests/angle-dipole.yaml new file mode 100644 index 0000000000..877ffa19c7 --- /dev/null +++ b/unittest/force-styles/tests/angle-dipole.yaml @@ -0,0 +1,91 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 11:45:20 2021 +epsilon: 5e-14 +skip_tests: single +prerequisites: ! | + atom full + atom dipole + atom sphere + angle dipole +pre_commands: ! | + variable newton_bond delete + variable newton_bond index on +post_commands: ! "" +input_file: in.dipole +angle_style: dipole +angle_coeff: ! | + 1 75.0 110.1 + 2 45.0 111.0 + 3 50.0 120.0 + 4 100.0 108.5 +equilibrium: 4 1.9216075064457565 1.9373154697137058 2.0943951023931953 1.8936822384138474 +extract: ! "" +natoms: 29 +init_energy: 1003.6681304854917 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 1.4331464742441932e+02 -1.3521953367178702e+02 2.4136500745014638e+02 + 2 2.6782718701354495e+00 -2.6486844416509454e+00 4.2363729730751343e-01 + 3 -4.4870554148237957e+01 6.5332348612165362e+01 -2.8681421060482592e+02 + 4 -5.5331596954352193e+01 6.0444025889892004e+01 1.0186587954807706e+02 + 5 -5.0188134661254459e+01 -1.9054016536475679e+01 -1.5563455266708351e+01 + 6 -4.7689438529777330e+00 2.5998138492348428e+01 -3.8516204693196570e+01 + 7 -8.6229671217220201e+00 -1.2421265466897683e+01 2.1527680425485713e+00 + 8 9.6964353397438117e+01 5.3394052635160953e+01 -1.1082117659998222e+02 + 9 -6.7054699081680781e+01 3.3182768247976950e+00 1.4344800073205271e+01 + 10 2.3085630178993561e+01 8.8190114128473112e+01 2.3691936919417330e+02 + 11 2.6587128526383761e+01 -2.5800454586297853e+01 9.1828686599773413e+00 + 12 4.5372284279490486e+01 1.6028883883859157e+02 3.4249174509506588e+01 + 13 -6.7550239156171727e+01 -1.6280001895550967e+02 -1.6750312981073466e+02 + 14 -8.9418079914661455e+00 -5.8079361135878713e+01 -1.1092227596020046e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 -3.0673372708997686e+01 -4.0942460626931563e+01 -2.0176105039892352e+01 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 -2.2712540293246668e+01 -1.7453415342214672e+01 2.7964598931107446e+01 + 19 2.2712540293246668e+01 1.7453415342214672e+01 -2.7964598931107446e+01 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 5.6004383892242643e+01 5.7200475495464815e+01 -4.4532403142988926e+01 + 22 -5.6004383892242643e+01 -5.7200475495464815e+01 4.4532403142988926e+01 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 1.8134763455516421e+01 1.0059678732782618e+02 -2.3078169626191753e+00 + 25 -1.8134763455516421e+01 -1.0059678732782618e+02 2.3078169626191753e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 4.2638015912387303e+01 -4.1671225283554001e+01 -8.9484981457177739e+01 + 28 -4.2638015912387303e+01 4.1671225283554001e+01 8.9484981457177739e+01 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_energy: 1003.0851914468608 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 1.4328096352084947e+02 -1.3530230953132229e+02 2.4122581488599297e+02 + 2 2.7298965229607592e+00 -2.6951354825673448e+00 4.3267587749608466e-01 + 3 -4.4714029933441985e+01 6.5356068089556771e+01 -2.8670909149344470e+02 + 4 -5.5530217488916051e+01 6.0554792045240731e+01 1.0193955141054229e+02 + 5 -5.0174946397456822e+01 -1.9068769692804402e+01 -1.5579247164095250e+01 + 6 -4.7810946332088076e+00 2.6007082305414617e+01 -3.8547146840000252e+01 + 7 -8.6101376377218966e+00 -1.2414872660200437e+01 2.1589256020055188e+00 + 8 9.6951385389386587e+01 5.3477335750537158e+01 -1.1090887140797879e+02 + 9 -6.7036094439222779e+01 3.2807351797930484e+00 1.4349227465829642e+01 + 10 2.3130117854946015e+01 8.8097016865831421e+01 2.3693632332422158e+02 + 11 2.6544273888246803e+01 -2.5757999366608257e+01 9.1765536206478515e+00 + 12 4.5030411690793741e+01 1.5963342491389886e+02 3.4321908824663403e+01 + 13 -6.7304592378151042e+01 -1.6249899606534225e+02 -1.6761149753433577e+02 + 14 -8.8591515509844356e+00 -5.7758783233556812e+01 -1.0193826926872265e+00 + 15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 16 -3.0656784408079538e+01 -4.0909589117870823e+01 -2.0165743878857381e+01 + 17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 18 -2.2713613130211510e+01 -1.7405520971726386e+01 2.8028270235465772e+01 + 19 2.2713613130211510e+01 1.7405520971726386e+01 -2.8028270235465772e+01 + 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 21 5.5760605962699742e+01 5.7044064249837312e+01 -4.4620013484652453e+01 + 22 -5.5760605962699742e+01 -5.7044064249837312e+01 4.4620013484652453e+01 + 23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 24 1.7971471194738822e+01 1.0069051985832809e+02 -2.4345857673776785e+00 + 25 -1.7971471194738822e+01 -1.0069051985832809e+02 2.4345857673776785e+00 + 26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + 27 4.2637918866417778e+01 -4.1624108314352007e+01 -8.9691297655911058e+01 + 28 -4.2637918866417778e+01 4.1624108314352007e+01 8.9691297655911058e+01 + 29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +... From d9538a4745a03ba2f90d5afce557d182ef86410d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 11:55:37 -0400 Subject: [PATCH 051/437] skip some aliases when checking for missing force style tests --- unittest/force-styles/check_tests.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unittest/force-styles/check_tests.py b/unittest/force-styles/check_tests.py index cca1b9f84d..5261c02330 100755 --- a/unittest/force-styles/check_tests.py +++ b/unittest/force-styles/check_tests.py @@ -88,6 +88,9 @@ for header in headers: style = m[1] if upper.match(style): continue + if style in ['reax/c', 'reax/c/omp', 'reax/c/kk', + 'reax/c/kk/device', 'reax/c/kk/host', 'meam/c']: + continue # detect, process, and flag suffix styles: info = { 'kokkos': 0, 'gpu': 0, 'intel': 0, \ From bf618b3128a60d6055ddbb7ceff0739193f93900 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 12:44:02 -0400 Subject: [PATCH 052/437] support tests for integrators with dipoles and extended particles --- unittest/force-styles/test_fix_timestep.cpp | 463 ++++++++++---------- 1 file changed, 237 insertions(+), 226 deletions(-) diff --git a/unittest/force-styles/test_fix_timestep.cpp b/unittest/force-styles/test_fix_timestep.cpp index 34c8ba65d9..38d03358e2 100644 --- a/unittest/force-styles/test_fix_timestep.cpp +++ b/unittest/force-styles/test_fix_timestep.cpp @@ -421,67 +421,69 @@ TEST(FixTimestep, plain) std::cerr << "global_data, restart, verlet: " << stats << std::endl; } - if (!verbose) ::testing::internal::CaptureStdout(); - restart_lammps(lmp, test_config, true, false); - if (!verbose) ::testing::internal::GetCapturedStdout(); - - x = lmp->atom->x; - tag = lmp->atom->tag; - stats.reset(); - ASSERT_EQ(nlocal + 1, x_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_pos, rmass, verlet: " << stats << std::endl; - - v = lmp->atom->v; - stats.reset(); - ASSERT_EQ(nlocal + 1, v_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_vel, rmass, verlet: " << stats << std::endl; - - ifix = lmp->modify->find_fix("test"); - if (ifix < 0) { - FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; - } else { - Fix *fix = lmp->modify->fix[ifix]; - if (fix->thermo_virial) { - stats.reset(); - auto stress = fix->virial; - EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, epsilon); - if (print_stats) std::cerr << "run_stress rmass, verlet: " << stats << std::endl; - } + if (lmp->atom->rmass == nullptr) { + if (!verbose) ::testing::internal::CaptureStdout(); + restart_lammps(lmp, test_config, true, false); + if (!verbose) ::testing::internal::GetCapturedStdout(); + x = lmp->atom->x; + tag = lmp->atom->tag; stats.reset(); - - // global scalar - if (fix->scalar_flag) { - double value = fix->compute_scalar(); - EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, epsilon); + ASSERT_EQ(nlocal + 1, x_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); } + if (print_stats) std::cerr << "run_pos, rmass, verlet: " << stats << std::endl; - // global vector - if (fix->vector_flag) { - int num = fix->size_vector; - EXPECT_EQ(num, test_config.global_vector.size()); - - for (int i = 0; i < num; ++i) - EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), - epsilon); + v = lmp->atom->v; + stats.reset(); + ASSERT_EQ(nlocal + 1, v_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); + } + if (print_stats) std::cerr << "run_vel, rmass, verlet: " << stats << std::endl; + + ifix = lmp->modify->find_fix("test"); + if (ifix < 0) { + FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; + } else { + Fix *fix = lmp->modify->fix[ifix]; + if (fix->thermo_virial) { + stats.reset(); + auto stress = fix->virial; + EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, epsilon); + if (print_stats) std::cerr << "run_stress rmass, verlet: " << stats << std::endl; + } + + stats.reset(); + + // global scalar + if (fix->scalar_flag) { + double value = fix->compute_scalar(); + EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, epsilon); + } + + // global vector + if (fix->vector_flag) { + int num = fix->size_vector; + EXPECT_EQ(num, test_config.global_vector.size()); + + for (int i = 0; i < num; ++i) + EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), + epsilon); + } + if (print_stats && stats.has_data()) + std::cerr << "global_data, rmass, verlet: " << stats << std::endl; } - if (print_stats && stats.has_data()) - std::cerr << "global_data, rmass, verlet: " << stats << std::endl; } // rigid fixes need work to test properly with r-RESPA. @@ -625,67 +627,69 @@ TEST(FixTimestep, plain) std::cerr << "global_data, restart, respa: " << stats << std::endl; } - if (!verbose) ::testing::internal::CaptureStdout(); - restart_lammps(lmp, test_config, true, true); - if (!verbose) ::testing::internal::GetCapturedStdout(); - - x = lmp->atom->x; - tag = lmp->atom->tag; - stats.reset(); - ASSERT_EQ(nlocal + 1, x_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_pos, rmass, respa: " << stats << std::endl; - - v = lmp->atom->v; - stats.reset(); - ASSERT_EQ(nlocal + 1, v_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_vel, rmass, respa: " << stats << std::endl; - - ifix = lmp->modify->find_fix("test"); - if (ifix < 0) { - FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; - } else { - Fix *fix = lmp->modify->fix[ifix]; - if (fix->thermo_virial) { - stats.reset(); - auto stress = fix->virial; - EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, 1000 * epsilon); - if (print_stats) std::cerr << "run_stress rmass, respa: " << stats << std::endl; - } + if (lmp->atom->rmass == nullptr) { + if (!verbose) ::testing::internal::CaptureStdout(); + restart_lammps(lmp, test_config, true, true); + if (!verbose) ::testing::internal::GetCapturedStdout(); + x = lmp->atom->x; + tag = lmp->atom->tag; stats.reset(); - - // global scalar - if (fix->scalar_flag) { - double value = fix->compute_scalar(); - EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, 10 * epsilon); + ASSERT_EQ(nlocal + 1, x_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); } + if (print_stats) std::cerr << "run_pos, rmass, respa: " << stats << std::endl; - // global vector - if (fix->vector_flag) { - int num = fix->size_vector; - EXPECT_EQ(num, test_config.global_vector.size()); - - for (int i = 0; i < num; ++i) - EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), - 10 * epsilon); + v = lmp->atom->v; + stats.reset(); + ASSERT_EQ(nlocal + 1, v_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); + } + if (print_stats) std::cerr << "run_vel, rmass, respa: " << stats << std::endl; + + ifix = lmp->modify->find_fix("test"); + if (ifix < 0) { + FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; + } else { + Fix *fix = lmp->modify->fix[ifix]; + if (fix->thermo_virial) { + stats.reset(); + auto stress = fix->virial; + EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, 1000 * epsilon); + if (print_stats) std::cerr << "run_stress rmass, respa: " << stats << std::endl; + } + + stats.reset(); + + // global scalar + if (fix->scalar_flag) { + double value = fix->compute_scalar(); + EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, 10 * epsilon); + } + + // global vector + if (fix->vector_flag) { + int num = fix->size_vector; + EXPECT_EQ(num, test_config.global_vector.size()); + + for (int i = 0; i < num; ++i) + EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), + 10 * epsilon); + } + if (print_stats && stats.has_data()) + std::cerr << "global_data, rmass, respa: " << stats << std::endl; } - if (print_stats && stats.has_data()) - std::cerr << "global_data, rmass, respa: " << stats << std::endl; } } @@ -866,72 +870,76 @@ TEST(FixTimestep, omp) std::cerr << "global_data, restart, verlet: " << stats << std::endl; } - if (!verbose) ::testing::internal::CaptureStdout(); - restart_lammps(lmp, test_config, true, false); - if (!verbose) ::testing::internal::GetCapturedStdout(); - - x = lmp->atom->x; - tag = lmp->atom->tag; - stats.reset(); - ASSERT_EQ(nlocal + 1, x_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_pos, rmass, verlet: " << stats << std::endl; - - v = lmp->atom->v; - stats.reset(); - ASSERT_EQ(nlocal + 1, v_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_vel, rmass, verlet: " << stats << std::endl; - - ifix = lmp->modify->find_fix("test"); - if (ifix < 0) { - FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; - } else { - Fix *fix = lmp->modify->fix[ifix]; - if (fix->thermo_virial) { - stats.reset(); - auto stress = fix->virial; - EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, epsilon); - EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, epsilon); - if (print_stats) std::cerr << "run_stress rmass, verlet: " << stats << std::endl; - } + if (lmp->atom->rmass == nullptr) { + if (!verbose) ::testing::internal::CaptureStdout(); + restart_lammps(lmp, test_config, true, false); + if (!verbose) ::testing::internal::GetCapturedStdout(); + x = lmp->atom->x; + tag = lmp->atom->tag; stats.reset(); - - // global scalar - if (fix->scalar_flag) { - double value = fix->compute_scalar(); - EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, epsilon); + ASSERT_EQ(nlocal + 1, x_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); } + if (print_stats) std::cerr << "run_pos, rmass, verlet: " << stats << std::endl; - // global vector - if (fix->vector_flag) { - int num = fix->size_vector; - EXPECT_EQ(num, test_config.global_vector.size()); - - for (int i = 0; i < num; ++i) - EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), - epsilon); + v = lmp->atom->v; + stats.reset(); + ASSERT_EQ(nlocal + 1, v_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); + } + if (print_stats) std::cerr << "run_vel, rmass, verlet: " << stats << std::endl; + + ifix = lmp->modify->find_fix("test"); + if (ifix < 0) { + FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; + } else { + Fix *fix = lmp->modify->fix[ifix]; + if (fix->thermo_virial) { + stats.reset(); + auto stress = fix->virial; + EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, epsilon); + EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, epsilon); + if (print_stats) std::cerr << "run_stress rmass, verlet: " << stats << std::endl; + } + + stats.reset(); + + // global scalar + if (fix->scalar_flag) { + double value = fix->compute_scalar(); + EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, epsilon); + } + + // global vector + if (fix->vector_flag) { + int num = fix->size_vector; + EXPECT_EQ(num, test_config.global_vector.size()); + + for (int i = 0; i < num; ++i) + EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), + epsilon); + } + if (print_stats && stats.has_data()) + std::cerr << "global_data, rmass, verlet: " << stats << std::endl; } - if (print_stats && stats.has_data()) - std::cerr << "global_data, rmass, verlet: " << stats << std::endl; } - // rigid fixes need work to test properly with r-RESPA + // rigid fixes need work to test properly with r-RESPA, + // also, torque is not supported by respa/omp ifix = lmp->modify->find_fix("test"); - if (!utils::strmatch(lmp->modify->fix[ifix]->style, "^rigid")) { + if (!utils::strmatch(lmp->modify->fix[ifix]->style, "^rigid") + && !lmp->atom->torque) { if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); @@ -956,6 +964,7 @@ TEST(FixTimestep, omp) EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); } if (print_stats) std::cerr << "run_pos, normal run, respa: " << stats << std::endl; + printf("x1\n"); stats.reset(); ASSERT_EQ(nlocal + 1, v_ref.size()); @@ -1068,67 +1077,69 @@ TEST(FixTimestep, omp) std::cerr << "global_data, restart, respa: " << stats << std::endl; } - if (!verbose) ::testing::internal::CaptureStdout(); - restart_lammps(lmp, test_config, true, true); - if (!verbose) ::testing::internal::GetCapturedStdout(); - - x = lmp->atom->x; - tag = lmp->atom->tag; - stats.reset(); - ASSERT_EQ(nlocal + 1, x_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_pos, rmass, respa: " << stats << std::endl; - - v = lmp->atom->v; - stats.reset(); - ASSERT_EQ(nlocal + 1, v_ref.size()); - for (int i = 0; i < nlocal; ++i) { - EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); - EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); - } - if (print_stats) std::cerr << "run_vel, rmass, respa: " << stats << std::endl; - - ifix = lmp->modify->find_fix("test"); - if (ifix < 0) { - FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; - } else { - Fix *fix = lmp->modify->fix[ifix]; - if (fix->thermo_virial) { - stats.reset(); - auto stress = fix->virial; - EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, 1000 * epsilon); - EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, 1000 * epsilon); - if (print_stats) std::cerr << "run_stress rmass, respa: " << stats << std::endl; - } + if (lmp->atom->rmass == nullptr) { + if (!verbose) ::testing::internal::CaptureStdout(); + restart_lammps(lmp, test_config, true, true); + if (!verbose) ::testing::internal::GetCapturedStdout(); + x = lmp->atom->x; + tag = lmp->atom->tag; stats.reset(); - - // global scalar - if (fix->scalar_flag) { - double value = fix->compute_scalar(); - EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, 10 * epsilon); + ASSERT_EQ(nlocal + 1, x_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(x[i][0], x_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][1], x_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(x[i][2], x_ref[tag[i]].z, epsilon); } + if (print_stats) std::cerr << "run_pos, rmass, respa: " << stats << std::endl; - // global vector - if (fix->vector_flag) { - int num = fix->size_vector; - EXPECT_EQ(num, test_config.global_vector.size()); - - for (int i = 0; i < num; ++i) - EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), - 10 * epsilon); + v = lmp->atom->v; + stats.reset(); + ASSERT_EQ(nlocal + 1, v_ref.size()); + for (int i = 0; i < nlocal; ++i) { + EXPECT_FP_LE_WITH_EPS(v[i][0], v_ref[tag[i]].x, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][1], v_ref[tag[i]].y, epsilon); + EXPECT_FP_LE_WITH_EPS(v[i][2], v_ref[tag[i]].z, epsilon); + } + if (print_stats) std::cerr << "run_vel, rmass, respa: " << stats << std::endl; + + ifix = lmp->modify->find_fix("test"); + if (ifix < 0) { + FAIL() << "ERROR: no fix defined with fix ID 'test'\n"; + } else { + Fix *fix = lmp->modify->fix[ifix]; + if (fix->thermo_virial) { + stats.reset(); + auto stress = fix->virial; + EXPECT_FP_LE_WITH_EPS(stress[0], test_config.run_stress.xx, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[1], test_config.run_stress.yy, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[2], test_config.run_stress.zz, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[3], test_config.run_stress.xy, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[4], test_config.run_stress.xz, 1000 * epsilon); + EXPECT_FP_LE_WITH_EPS(stress[5], test_config.run_stress.yz, 1000 * epsilon); + if (print_stats) std::cerr << "run_stress rmass, respa: " << stats << std::endl; + } + + stats.reset(); + + // global scalar + if (fix->scalar_flag) { + double value = fix->compute_scalar(); + EXPECT_FP_LE_WITH_EPS(test_config.global_scalar, value, 10 * epsilon); + } + + // global vector + if (fix->vector_flag) { + int num = fix->size_vector; + EXPECT_EQ(num, test_config.global_vector.size()); + + for (int i = 0; i < num; ++i) + EXPECT_FP_LE_WITH_EPS(test_config.global_vector[i], fix->compute_vector(i), + 10 * epsilon); + } + if (print_stats && stats.has_data()) + std::cerr << "global_data, rmass, respa: " << stats << std::endl; } - if (print_stats && stats.has_data()) - std::cerr << "global_data, rmass, respa: " << stats << std::endl; } } From bb5a11b330ec9ace5ab70641f1bf798549e67284 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 14:16:50 -0400 Subject: [PATCH 053/437] add timestepping unit tests for atom style sphere --- .../tests/fix-timestep-nph_sphere.yaml | 82 ++++++++++++++++++ .../tests/fix-timestep-npt_sphere_aniso.yaml | 82 ++++++++++++++++++ .../tests/fix-timestep-npt_sphere_iso.yaml | 82 ++++++++++++++++++ .../tests/fix-timestep-npt_sphere_tri.yaml | 83 +++++++++++++++++++ .../tests/fix-timestep-nve_sphere.yaml | 79 ++++++++++++++++++ .../tests/fix-timestep-nve_sphere_dipole.yaml | 79 ++++++++++++++++++ .../fix-timestep-nve_sphere_dipole_dlm.yaml | 79 ++++++++++++++++++ .../tests/fix-timestep-nvt_sphere.yaml | 82 ++++++++++++++++++ 8 files changed, 648 insertions(+) create mode 100644 unittest/force-styles/tests/fix-timestep-nph_sphere.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-nve_sphere.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml diff --git a/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml new file mode 100644 index 0000000000..2b3a5efe74 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:13:03 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nvt/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute nph/sphere aniso 1.0 1.0 100.0 ptemp ${t_target} fixedpoint 0.0 0.0 0.0 couple xy +input_file: in.dipole +natoms: 29 +global_scalar: 2.6530736625996387 +global_vector: ! |- + 24 -0.00029360717345345503 -0.00029360717345345503 -0.009802195812217975 -0.0002295892446149489 -0.0002295892446149489 -0.009426150676164043 0.00038215586827905577 -0.0001999367873398407 -0.00019998672264189484 0.0013055190397921652 -0.00019964191319805292 -0.00019997330643321473 -0.00016957632738679295 -0.00016957632738679295 -0.00016957632738679295 0.0015712213802849902 0.0015712213802849902 2.6485187819688587 7.59422701888457e-05 -3.973157233782066e-05 -3.974149551450151e-05 0.0016934776411678706 3.960194290753771e-05 3.973352558103608e-05 +run_pos: ! |2 + 1 -2.7827104751341025e-01 2.4732379209353574e+00 -1.7098367287678773e-01 + 2 3.0951603206194456e-01 2.9505189917751125e+00 -8.3691694167351027e-01 + 3 -6.9644723315174417e-01 1.2472671215509692e+00 -6.1701736141854813e-01 + 4 -1.5802282899284723e+00 1.4894431387677187e+00 -1.2482123062291377e+00 + 5 -9.0694585604301725e-01 9.2501451815502911e-01 4.0592176435169947e-01 + 6 2.9363360685403350e-01 2.2973702434039112e-01 -1.2704408274438599e+00 + 7 3.3994545012798749e-01 -1.0583785999377149e-02 -2.4407493030729839e+00 + 8 1.1644354609969190e+00 -4.8507587255234341e-01 -6.6916588289257639e-01 + 9 1.3825436853436361e+00 -2.6560696592088551e-01 2.4916535088294367e-01 + 10 2.0187770977723849e+00 -1.4266867551175855e+00 -9.5830822229072332e-01 + 11 1.7878889969095608e+00 -1.9953652069550767e+00 -1.8755544230960393e+00 + 12 3.0043797986784559e+00 -4.9051788127567164e-01 -1.6061034220347734e+00 + 13 4.0464050870623778e+00 -8.9543443804534295e-01 -1.6239344875226056e+00 + 14 2.6059193314002735e+00 -4.1999218982596354e-01 -2.6309257924047857e+00 + 15 2.9664874399605337e+00 5.6033573646181978e-01 -1.2119048778102748e+00 + 16 2.6506680737114801e+00 -2.3958645918178787e+00 3.5937989665356440e-02 + 17 2.2316860653873727e+00 -2.1009813016703278e+00 1.1394583005162708e+00 + 18 2.1378513381587831e+00 3.0168402813828923e+00 -3.4817857953777800e+00 + 19 1.5344619259386985e+00 2.6308244456975824e+00 -4.2058565965374335e+00 + 20 2.7633053374995198e+00 3.6822606095400445e+00 -3.8996717563703172e+00 + 21 4.9050050829035721e+00 -4.0739242165503793e+00 -3.5862318085962848e+00 + 22 4.3674628421751338e+00 -4.2041924913739006e+00 -4.4215946742376611e+00 + 23 5.7358084937052700e+00 -3.5752857068686739e+00 -3.8441631947032109e+00 + 24 2.0678043187996673e+00 3.1508969130048694e+00 3.1246452785877228e+00 + 25 1.2994565215395681e+00 3.2745897745467882e+00 2.4848225346114337e+00 + 26 2.5799862460845864e+00 4.0108398050525853e+00 3.1819959221711613e+00 + 27 -1.9607824033721615e+00 -4.3543514030986543e+00 2.0895637397870637e+00 + 28 -2.7398474814917915e+00 -4.0195447873597807e+00 1.5674291899980410e+00 + 29 -1.3104384550303312e+00 -3.5982420074671468e+00 2.2459227533114134e+00 +run_vel: ! |2 + 1 8.0241784898899828e-04 7.1649810278735088e-04 -4.3254783495965635e-04 + 2 4.9920840652361133e-03 -4.7901355269901027e-03 8.0415105059913512e-03 + 3 -1.0246626622144124e-03 1.9728648029617435e-03 -4.1786270885854984e-04 + 4 -2.5514266874426907e-03 -3.8470310506856666e-04 -7.6419956671648741e-03 + 5 -1.0997203136770472e-02 -1.1100959801421180e-02 7.4710776737198642e-03 + 6 -9.6097534134826279e-05 1.3350328233459241e-03 5.6128607413785875e-04 + 7 -4.3022722269905067e-05 -6.9147676609541530e-04 -7.0822487621355530e-04 + 8 2.6656323611303379e-04 -6.4929896813388250e-04 6.8721556911616026e-04 + 9 4.0217754987332526e-03 -9.3762987441709713e-03 -1.8217220558355389e-02 + 10 3.9241017078855858e-04 7.9179015547129058e-04 -1.8323030547845353e-04 + 11 -4.1986571777318281e-03 -7.2528133986728104e-03 -6.9700940876634846e-03 + 12 1.1518085352395188e-03 -7.7797212668168330e-04 -1.7491524590193147e-03 + 13 -1.1763167453607102e-03 2.1016758888847365e-03 -7.0140970399881785e-04 + 14 3.4959302252370928e-03 -8.0425729559116862e-03 2.4731781160335117e-03 + 15 -4.0163275838685725e-03 2.2205560641154126e-04 1.6595018075308821e-02 + 16 -2.0953855224036227e-04 -3.5810043463447037e-04 1.8771712621666707e-03 + 17 6.8683193653879806e-04 3.2771494523541208e-04 6.5315694215737502e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml new file mode 100644 index 0000000000..e93f5187d0 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:10:26 2021 +epsilon: 1e-13 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nvt/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute npt/sphere temp 50.0 ${t_target} 1.0 aniso 1.0 1.0 100.0 drag 0.01 flip no +input_file: in.dipole +natoms: 29 +global_scalar: 12.096663886115614 +global_vector: ! |- + 36 0.18697665312191866 1.3884401940983198 -1.143641040188949 0.09347675524754455 2.0071422867094624 0.425406696845947 -0.002573189219691047 0.001618379686061744 -0.017497577807990692 -0.0020955754000787424 0.0015446684493233807 -0.01488781896977487 0.0026972315134052606 -0.00023072428193059388 -0.00023289107491333692 0.005208648473644532 -0.00022780275682141358 -0.00023637594502603685 6.35369750884944 0.2759117656261481 -0.22726511374584485 0.14846237885657246 0.40028504859566 0.017981325048433597 -0.0002999716767593198 -0.0002999716767593198 -0.0002999716767593198 0.09817527997528167 0.053341609668296035 4.95516047425249 0.0005359956534890073 -4.5849683890516504e-05 -4.6280270443798504e-05 0.020217358264846576 3.867161073461921e-05 4.1637137703144936e-05 +run_pos: ! |2 + 1 -2.7397105633323537e-01 2.4781785743666527e+00 -1.7980596873158383e-01 + 2 3.1208634768681343e-01 2.9563521874575622e+00 -8.4152963592209495e-01 + 3 -6.9088263168587183e-01 1.2496823839918898e+00 -6.2241602099735882e-01 + 4 -1.5726352769666319e+00 1.4927563203522878e+00 -1.2480677994753471e+00 + 5 -9.0031801678538503e-01 9.2772192330987036e-01 3.9232046844903401e-01 + 6 2.9679186211245945e-01 2.3027757366947199e-01 -1.2709808187784626e+00 + 7 3.4297645015682932e-01 -1.0171684760408972e-02 -2.4321119174003787e+00 + 8 1.1655212933693386e+00 -4.8556950448628200e-01 -6.7426976374512382e-01 + 9 1.3828541455059913e+00 -2.6495173792453208e-01 2.3806024782392399e-01 + 10 2.0179044360636613e+00 -1.4292029871930776e+00 -9.6110946927473684e-01 + 11 1.7879097819825853e+00 -1.9982880075869129e+00 -1.8707723329669710e+00 + 12 3.0011559399079015e+00 -4.9102996201509352e-01 -1.6037511843985595e+00 + 13 4.0407018630432852e+00 -8.9731162849897572e-01 -1.6215534152690392e+00 + 14 2.6035520776982448e+00 -4.1956871438988141e-01 -2.6207930732161282e+00 + 15 2.9641659041278992e+00 5.6200465347558382e-01 -1.2140368770123215e+00 + 16 2.6484488984987120e+00 -2.4000667496943313e+00 2.5233551830631029e-02 + 17 2.2302902457596883e+00 -2.1047464208867854e+00 1.1204322296835159e+00 + 18 2.1367751560618533e+00 3.0229263413219618e+00 -3.4652753757362378e+00 + 19 1.5347596529485310e+00 2.6361717424035094e+00 -4.1837955599396395e+00 + 20 2.7608050055448814e+00 3.6896201614646129e+00 -3.8799578863242683e+00 + 21 4.8976281311001824e+00 -4.0814085742512773e+00 -3.5689207216566610e+00 + 22 4.3613098664058789e+00 -4.2119261585667553e+00 -4.3978798222529232e+00 + 23 5.7265398143559310e+00 -3.5818157622754052e+00 -3.8248748448730190e+00 + 24 2.0668876327692072e+00 3.1572395326532616e+00 3.0905117994824316e+00 + 25 1.3002893525116210e+00 3.2811691195568313e+00 2.4555938396322556e+00 + 26 2.5779033290928890e+00 4.0188281970566999e+00 3.1474228017293964e+00 + 27 -1.9525260547538972e+00 -4.3623724468000757e+00 2.0633650387879658e+00 + 28 -2.7298172127749782e+00 -4.0269250728459882e+00 1.5452330932758489e+00 + 29 -1.3036629303295193e+00 -3.6048159970063285e+00 2.2185254278264974e+00 +run_vel: ! |2 + 1 6.6645514337822221e-04 6.0192577730141313e-04 -3.7299030694254784e-04 + 2 4.4186462683745379e-03 -4.6840896920226378e-03 6.9463033422740798e-03 + 3 -8.2788283512656344e-04 1.6664323303816279e-03 -3.6067014934863578e-04 + 4 -2.3360131422093121e-03 -2.4652356574843070e-04 -6.7612095269435086e-03 + 5 -9.9515654282019365e-03 -1.0186535017680890e-02 7.0490084717633062e-03 + 6 -6.3804753331014364e-05 1.1107780038266840e-03 4.6244242981496376e-04 + 7 -3.0142488152500502e-05 -5.6684692709220647e-04 -5.9335396255129238e-04 + 8 2.1070083677950853e-04 -5.2394803973737354e-04 6.1467530744658834e-04 + 9 3.6195183545487957e-03 -8.3369682502568449e-03 -1.6601527132808564e-02 + 10 3.2079212235368499e-04 6.8314953697639453e-04 -1.4658709900665793e-04 + 11 -3.7785845503841000e-03 -6.5404736905947487e-03 -6.2889329470937156e-03 + 12 9.6291409057966675e-04 -6.5439203151497114e-04 -1.4918221706275553e-03 + 13 -1.3242589815117614e-03 1.6385138464187446e-03 -5.7720431286344945e-04 + 14 3.1480939042203069e-03 -7.0000358651570562e-03 2.4177974139595096e-03 + 15 -3.3454335023896100e-03 4.4058024755002902e-04 1.4883635219226482e-02 + 16 -1.7846013433072078e-04 -2.8806672944350740e-04 1.5882710120078808e-03 + 17 5.7176195253866985e-04 2.6935646129835840e-04 5.3688215217051862e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml new file mode 100644 index 0000000000..85335e2f0e --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:07:35 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nvt/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute npt/sphere temp 50.0 ${t_target} 1.0 iso 1.0 1.0 100.0 dilate solute +input_file: in.dipole +natoms: 29 +global_scalar: 9.042301471806704 +global_vector: ! |- + 28 0.18636415542051687 1.4201480914539844 -1.1292034459301248 0.09086316406911908 1.9990627120668838 0.47615124832482836 -0.006387790127403963 -0.00558070983166458 0.0010748001531976797 -0.00023261555228169703 -0.00023292456865841747 0.0020841825580977056 -0.00023513173250148996 -0.00023642170879896256 6.33288408078452 0.28221278023295704 -0.22439606534154316 0.14027648316892297 0.3970689103168122 0.02252697627211299 -0.000934258230287154 2.0887944455121046 0.00021358500655954555 -4.6225518401838857e-05 -4.628692634326172e-05 0.0032370232941587745 4.1199960358459955e-05 4.165326165323854e-05 +run_pos: ! |2 + 1 -2.6730556919536941e-01 2.4568877649772691e+00 -1.7525449543283766e-01 + 2 3.1651774679036304e-01 2.9312403511996870e+00 -8.4441875599840355e-01 + 3 -6.8264474147763909e-01 1.2381912454214348e+00 -6.2280218085517536e-01 + 4 -1.5610219859358754e+00 1.4793243114694405e+00 -1.2553149431321637e+00 + 5 -8.9127711572705426e-01 9.1876066482616459e-01 4.0302509508195250e-01 + 6 3.0127913782733007e-01 2.2691631875798812e-01 -1.2786411328973895e+00 + 7 3.4728770083409088e-01 -1.1635378753637404e-02 -2.4527109396065221e+00 + 8 1.1667027859990906e+00 -4.8324232549892798e-01 -6.7525262456593804e-01 + 9 1.3831945982304781e+00 -2.6439786018314493e-01 2.4739530358641204e-01 + 10 2.0158407266952985e+00 -1.4193429843321432e+00 -9.6528797103694508e-01 + 11 1.7866895736040833e+00 -1.9838941403918913e+00 -1.8849439514011168e+00 + 12 2.9953527296458429e+00 -4.8865858428761744e-01 -1.6150917690062689e+00 + 13 4.0309463436135378e+00 -8.9170922780765505e-01 -1.6331027736196067e+00 + 14 2.5992669434526743e+00 -4.1779482081123387e-01 -2.6434372837883089e+00 + 15 2.9585057286412582e+00 5.5603993895379489e-01 -1.2211762319324428e+00 + 16 2.6439814481022470e+00 -2.3824704590318957e+00 3.2052450983229619e-02 + 17 2.2274196683049023e+00 -2.0894978978162264e+00 1.1394929345325000e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 6.7245251088027865e-04 6.1138248355858786e-04 -3.7339702570044316e-04 + 2 4.4052559672891761e-03 -4.6696302057353334e-03 6.9799826311338995e-03 + 3 -8.4229974223012048e-04 1.6692222625580451e-03 -3.4811445486190162e-04 + 4 -2.3115850080186913e-03 -2.1921753106846686e-04 -6.6129202326324832e-03 + 5 -9.9270913083732166e-03 -1.0162835960427118e-02 6.6835450876805242e-03 + 6 -6.3349132255598122e-05 1.1213920888471765e-03 4.3957112467583707e-04 + 7 -3.0550264536359436e-05 -5.7212395421602175e-04 -5.7852611868756802e-04 + 8 2.1230260290084165e-04 -5.2946150247993511e-04 6.1002092957609434e-04 + 9 3.5835237205891044e-03 -8.2976423766382163e-03 -1.6569654205811610e-02 + 10 3.2215400971380426e-04 6.7777051599916360e-04 -1.4690970683667580e-04 + 11 -3.8262569070299369e-03 -6.4899437483942309e-03 -6.0625717608142051e-03 + 12 9.6903366708958464e-04 -6.5830810892723965e-04 -1.4851103246954730e-03 + 13 -1.3051803182304376e-03 1.5782109043276473e-03 -5.7359190198993340e-04 + 14 3.1570944675627780e-03 -6.9925437658747572e-03 2.5670995049832728e-03 + 15 -3.3107454411357711e-03 5.6059336622465798e-04 1.4845717250576752e-02 + 16 -1.8030723242303480e-04 -2.9205235801445944e-04 1.5828900167446096e-03 + 17 5.7535428047488272e-04 2.7096053960059093e-04 5.2484092395923122e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml new file mode 100644 index 0000000000..6ed72bd4ac --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:15:09 2021 +epsilon: 2e-13 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nvt/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + change_box all triclinic + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute npt/sphere temp 50.0 ${t_target} 1.0 tri 1.0 1.0 100.0 nreset 2 +input_file: in.dipole +natoms: 29 +global_scalar: 12.427074202242965 +global_vector: ! |- + 48 0.18732599278123144 1.4327704185774879 -1.114350363106168 0.09281449313807318 2.0096876527033785 0.5168928407675009 -0.00258727803156183 0.0016072198861910659 -0.017515031066905426 -0.0006359696254764614 0.003684960047314246 0.0014630140342537605 -0.0021206674795814034 0.0015249288501334088 -0.014917163613204729 -0.0004705411201213485 0.003272044118682347 0.0012260895045759764 0.0021598960215781717 -0.0002313961526710642 -0.00023292466339283792 0.004804856034402303 -0.0002297564102730591 -0.00023642225051889441 6.365568501757152 0.2847210975358988 -0.22144445077120098 0.14636618463898685 0.4013009387004219 0.026546916334714173 -0.0003006594610783624 -0.0003006594610783624 -0.0003006594610783624 0 0 0 0.10054042535473215 0.051986996480227275 4.974713468580724 0.004949835079328575 0.23935023979298692 0.033607786910456634 0.00042921598453834873 -4.5983198494216164e-05 -4.628694516894922e-05 0.017204223259431568 3.9337756237346446e-05 4.1653452536114995e-05 +run_pos: ! |2 + 1 -2.3019540006487116e-01 2.4731491152481908e+00 -1.7981254448987816e-01 + 2 3.5408091994147828e-01 2.9517458018683023e+00 -8.4154317667398715e-01 + 3 -6.5053832938525158e-01 1.2449512560553124e+00 -6.2241599186766017e-01 + 4 -1.5342078390356910e+00 1.4884208596718249e+00 -1.2480276360391489e+00 + 5 -8.5668136613463908e-01 9.2234546360780989e-01 3.9231452398524702e-01 + 6 3.3322113863941816e-01 2.2597463982145172e-01 -1.2709694160975076e+00 + 7 3.7475098107547922e-01 -1.3724988393778226e-02 -2.4320792823935395e+00 + 8 1.2031137603847428e+00 -4.9024585938175047e-01 -6.7426808576801633e-01 + 9 1.4241784975508018e+00 -2.7021689756584077e-01 2.3803620252476776e-01 + 10 2.0530428396862863e+00 -1.4336868349895742e+00 -9.6110246210374406e-01 + 11 1.8188729850824128e+00 -2.0021830794840838e+00 -1.8707494276865724e+00 + 12 3.0352703768848617e+00 -4.9511047953296927e-01 -1.6037322028476977e+00 + 13 4.0741331374345862e+00 -9.0138890701479291e-01 -1.6215524267381634e+00 + 14 2.6340159931331169e+00 -4.2299939057361513e-01 -2.6207532717282440e+00 + 15 3.0012113993627043e+00 5.5766796064899893e-01 -1.2140224834055351e+00 + 16 2.6858185719984924e+00 -2.4051713466577018e+00 2.5220211520086799e-02 + 17 2.2721660250726234e+00 -2.1105589725251424e+00 1.1204022912329368e+00 + 18 2.1691096725020014e+00 3.0200034523915207e+00 -3.4652251395628202e+00 + 19 1.5638692354297250e+00 2.6337150067951516e+00 -4.1837327833568496e+00 + 20 2.7925636956819009e+00 3.6869563744341303e+00 -3.8799004126527885e+00 + 21 4.9191678730049482e+00 -4.0841855614113536e+00 -3.5688686765499709e+00 + 22 4.3795875951964049e+00 -4.2141688660389169e+00 -4.3978133092346745e+00 + 23 5.7478464814125925e+00 -3.5844338072573851e+00 -3.8248183325717333e+00 + 24 2.1237696561245585e+00 3.1501013360303496e+00 3.0904476168033845e+00 + 25 1.3550047845470798e+00 3.2744376408481486e+00 2.4555407382440482e+00 + 26 2.6362472864936741e+00 4.0116438051188350e+00 3.1473576257765501e+00 + 27 -1.9103797042670241e+00 -4.3687665159467368e+00 2.0633187830108284e+00 + 28 -2.6890947459520786e+00 -4.0329898501364472e+00 1.5451958805107964e+00 + 29 -1.2598435219755979e+00 -3.6113182514368392e+00 2.2184764640185506e+00 +run_vel: ! |2 + 1 6.6502876613817082e-04 6.0137715630290980e-04 -3.7231857614918843e-04 + 2 4.4310732749849807e-03 -4.6860518880721177e-03 6.9172213803384546e-03 + 3 -8.2879932936262243e-04 1.6675520063217351e-03 -3.6230664453296304e-04 + 4 -2.3009589595040800e-03 -2.4940767601862660e-04 -6.7114948439266726e-03 + 5 -9.9666600062292155e-03 -1.0192454842315551e-02 7.0756875873893990e-03 + 6 -6.6466948691939917e-05 1.1100485529839292e-03 4.6221787716926307e-04 + 7 -2.6664287463237775e-05 -5.6727672702013357e-04 -5.9340251907992480e-04 + 8 2.1069461419280906e-04 -5.2276533772721134e-04 6.1543942080566686e-04 + 9 3.5880864338549735e-03 -8.3291497817817063e-03 -1.6629312246477155e-02 + 10 3.2193494737598778e-04 6.8203760452628442e-04 -1.4590168253026390e-04 + 11 -3.7645937681506135e-03 -6.5457646086291817e-03 -6.2933396080559123e-03 + 12 9.6775971858663302e-04 -6.5412431179954719e-04 -1.4911729864314899e-03 + 13 -1.3236241180578610e-03 1.6172374806127389e-03 -6.1192476666209494e-04 + 14 3.1820466835757177e-03 -7.0137200098607851e-03 2.4247294180746613e-03 + 15 -3.3775929249580004e-03 4.3714311542648139e-04 1.4901523418484797e-02 + 16 -1.8137388689900202e-04 -2.8790510242829407e-04 1.5850222165835173e-03 + 17 5.6799086787378021e-04 2.7020817344844677e-04 5.3751629851417229e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml new file mode 100644 index 0000000000..1fe8a812eb --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 12:41:14 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nve/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute nve/sphere +input_file: in.dipole +natoms: 29 +run_pos: ! |2 + 1 -2.7835201600161724e-01 2.4739635854534794e+00 -1.7266529159533381e-01 + 2 3.0956103448813443e-01 2.9513901683650312e+00 -8.4519651860039569e-01 + 3 -6.9665388827099395e-01 1.2476305197459465e+00 -6.2308633790835477e-01 + 4 -1.5806537977080743e+00 1.4898724624011970e+00 -1.2603672720324142e+00 + 5 -9.0717200386943198e-01 9.2534244484276396e-01 4.0971062893387816e-01 + 6 2.9372031055501280e-01 2.2980352699256024e-01 -1.2829701888814602e+00 + 7 3.4004500250432684e-01 -1.0586419947851007e-02 -2.4647781104797737e+00 + 8 1.1647778686298806e+00 -4.8521860573422493e-01 -6.7576451345363708e-01 + 9 1.3829157998107842e+00 -2.6565307188585591e-01 2.5173761233997971e-01 + 10 2.0193699262014606e+00 -1.4271086980367889e+00 -9.6774682990296845e-01 + 11 1.7884196964387378e+00 -1.9958841177406170e+00 -1.8938559206044039e+00 + 12 3.0052615603252124e+00 -4.9066073995751519e-01 -1.6219039335607899e+00 + 13 4.0475793689415624e+00 -8.9569728772577217e-01 -1.6399185944813628e+00 + 14 2.6066884436546016e+00 -4.2009332682164852e-01 -2.6567757591856020e+00 + 15 2.9673761534618444e+00 5.6046814860711702e-01 -1.2240283568299068e+00 + 16 2.6514444904275640e+00 -2.3965661912341849e+00 3.6272891734414767e-02 + 17 2.2323418147609932e+00 -2.1015989434988138e+00 1.1506700987376535e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 8.0441098013536900e-04 7.1566696890217009e-04 -4.3319530641127324e-04 + 2 4.9019924927833974e-03 -4.7801485992371370e-03 8.0763763167138476e-03 + 3 -1.0296827041707426e-03 1.9681821177098759e-03 -4.0661362502986804e-04 + 4 -2.4750904667702697e-03 -4.0142184848872032e-04 -7.4645414457473590e-03 + 5 -1.0920223377262468e-02 -1.0990650916587269e-02 7.1259821326181468e-03 + 6 -9.5250936177773552e-05 1.3338845867289183e-03 5.4216231888479466e-04 + 7 -4.3622272484028061e-05 -6.9095838256533388e-04 -6.9347553685684493e-04 + 8 2.6770309186413690e-04 -6.5039173203211467e-04 6.8080720281545992e-04 + 9 3.9551108074098729e-03 -9.3129436730056761e-03 -1.8150317067617373e-02 + 10 3.9268045122209340e-04 7.8613414593941687e-04 -1.8443604077645874e-04 + 11 -4.1884490183000996e-03 -7.1206276521598860e-03 -6.7115880881258904e-03 + 12 1.1515461519926514e-03 -7.7600056283407166e-04 -1.7352241098650576e-03 + 13 -1.2037022170798477e-03 2.1033375439546342e-03 -6.8928778601845260e-04 + 14 3.5046339401241938e-03 -8.0020522800663806e-03 2.6034033369112244e-03 + 15 -3.9825896439104544e-03 1.5687388979248470e-04 1.6410860063121452e-02 + 16 -2.1359275515571647e-04 -3.5441416299211270e-04 1.8682699034667436e-03 + 17 6.8808524051577229e-04 3.2653076879221409e-04 6.4078607994587291e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml new file mode 100644 index 0000000000..7cfd558fc6 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 12:43:06 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nve/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute nve/sphere update dipole +input_file: in.dipole +natoms: 29 +run_pos: ! |2 + 1 -2.7835185784846639e-01 2.4739635976824457e+00 -1.7266540613768827e-01 + 2 3.0955514329308248e-01 2.9513889170933369e+00 -8.4519268900987066e-01 + 3 -6.9665378550990509e-01 1.2476305820642475e+00 -6.2308611984435502e-01 + 4 -1.5806536511342932e+00 1.4898713515536361e+00 -1.2603658774215603e+00 + 5 -9.0717519433308624e-01 9.2534266508192531e-01 4.0970472951585468e-01 + 6 2.9372040045726949e-01 2.2980343396372024e-01 -1.2829701974690204e+00 + 7 3.4004502028145178e-01 -1.0586487242355438e-02 -2.4647780625263791e+00 + 8 1.1647780304202811e+00 -4.8521861190064303e-01 -6.7576434032877364e-01 + 9 1.3829078978517115e+00 -2.6565225956574745e-01 2.5173098859928428e-01 + 10 2.0193698215890632e+00 -1.4271088019138458e+00 -9.6774705027509667e-01 + 11 1.7884241068776707e+00 -1.9958727472997557e+00 -1.8938539300092048e+00 + 12 3.0052615319846425e+00 -4.9066053656348119e-01 -1.6219039693969866e+00 + 13 4.0475766599340517e+00 -8.9569608771837539e-01 -1.6399149097828032e+00 + 14 2.6066830423067282e+00 -4.2009801994016499e-01 -2.6567767745821129e+00 + 15 2.9673801024672457e+00 5.6046146476986802e-01 -1.2240301106852221e+00 + 16 2.6514445448232995e+00 -2.3965662296702832e+00 3.6272911198516986e-02 + 17 2.2323417902303007e+00 -2.1015988995003463e+00 1.1506700685408195e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 8.0473659311712108e-04 7.1569249347906304e-04 -4.3342870018006228e-04 + 2 4.8898479203602872e-03 -4.7827042023383688e-03 8.0841799193837570e-03 + 3 -1.0294756367549977e-03 1.9683076071813901e-03 -4.0617066185945041e-04 + 4 -2.4747982635460672e-03 -4.0369263662479052e-04 -7.4617063284330544e-03 + 5 -1.0926646593906211e-02 -1.0990152085046804e-02 7.1139929395277867e-03 + 6 -9.5067271206254357e-05 1.3336935657649613e-03 5.4214461928120254e-04 + 7 -4.3586025236289389e-05 -6.9109610170650215e-04 -6.9337762329437880e-04 + 8 2.6803899143798955e-04 -6.5040541267279931e-04 6.8116655292381478e-04 + 9 3.9386905614672216e-03 -9.3112400668916677e-03 -1.8163977072531323e-02 + 10 3.9247060772836694e-04 7.8592522562680438e-04 -1.8488118631442108e-04 + 11 -4.1794652638823824e-03 -7.0974426331113054e-03 -6.7076698172827591e-03 + 12 1.1514884390152254e-03 -7.7558890534918008e-04 -1.7352975395072082e-03 + 13 -1.2091918935275513e-03 2.1057712474429301e-03 -6.8173220473209369e-04 + 14 3.4935556917242987e-03 -8.0116807211232811e-03 2.6013722731623311e-03 + 15 -3.9745580146274316e-03 1.4335430630176018e-04 1.6407163363653991e-02 + 16 -2.1348158583193162e-04 -3.5449321712298289e-04 1.8683099741508020e-03 + 17 6.8803503268433628e-04 3.2662083176268592e-04 6.4072364607846313e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml new file mode 100644 index 0000000000..1ce4c2874d --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 12:43:20 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nve/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute nve/sphere update dipole/dlm +input_file: in.dipole +natoms: 29 +run_pos: ! |2 + 1 -2.7835185784845923e-01 2.4739635976824457e+00 -1.7266540613769288e-01 + 2 3.0955514329281736e-01 2.9513889170932717e+00 -8.4519268900971201e-01 + 3 -6.9665378550990020e-01 1.2476305820642484e+00 -6.2308611984434259e-01 + 4 -1.5806536511342912e+00 1.4898713515536133e+00 -1.2603658774215709e+00 + 5 -9.0717519433323290e-01 9.2534266508195795e-01 4.0970472951558157e-01 + 6 2.9372040045727454e-01 2.2980343396371589e-01 -1.2829701974690213e+00 + 7 3.4004502028145350e-01 -1.0586487242360321e-02 -2.4647780625263760e+00 + 8 1.1647780304202888e+00 -4.8521861190064386e-01 -6.7576434032876598e-01 + 9 1.3829078978513061e+00 -2.6565225956566296e-01 2.5173098859898618e-01 + 10 2.0193698215890521e+00 -1.4271088019138558e+00 -9.6774705027511587e-01 + 11 1.7884241068779994e+00 -1.9958727472988336e+00 -1.8938539300089621e+00 + 12 3.0052615319846434e+00 -4.9066053656347280e-01 -1.6219039693969868e+00 + 13 4.0475766599338536e+00 -8.9569608771832465e-01 -1.6399149097826227e+00 + 14 2.6066830423064573e+00 -4.2009801994054885e-01 -2.6567767745821391e+00 + 15 2.9673801024674455e+00 5.6046146476958536e-01 -1.2240301106853306e+00 + 16 2.6514445448233035e+00 -2.3965662296702854e+00 3.6272911198519331e-02 + 17 2.2323417902302989e+00 -2.1015988995003445e+00 1.1506700685408175e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 8.0473659314045311e-04 7.1569249348053799e-04 -4.3342870019477203e-04 + 2 4.8898479194970758e-03 -4.7827042025493354e-03 8.0841799198950962e-03 + 3 -1.0294756367398522e-03 1.9683076071843977e-03 -4.0617066181897204e-04 + 4 -2.4747982635401470e-03 -4.0369263670034553e-04 -7.4617063284663802e-03 + 5 -1.0926646594371465e-02 -1.0990152084938037e-02 7.1139929386532276e-03 + 6 -9.5067271190104420e-05 1.3336935657507988e-03 5.4214461927831791e-04 + 7 -4.3586025231105304e-05 -6.9109610172221191e-04 -6.9337762328493019e-04 + 8 2.6803899146373794e-04 -6.5040541267551654e-04 6.8116655294853557e-04 + 9 3.9386905601377338e-03 -9.3112400666159056e-03 -1.8163977073503805e-02 + 10 3.9247060769256279e-04 7.8592522559452823e-04 -1.8488118637534628e-04 + 11 -4.1794652628278275e-03 -7.0974426301502243e-03 -6.7076698165187305e-03 + 12 1.1514884390163194e-03 -7.7558890532261485e-04 -1.7352975395074867e-03 + 13 -1.2091918941598313e-03 2.1057712476065032e-03 -6.8173220414898873e-04 + 14 3.4935556908446308e-03 -8.0116807223612942e-03 2.6013722730781601e-03 + 15 -3.9745580139864201e-03 1.4335430539960903e-04 1.6407163363297207e-02 + 16 -2.1348158581808034e-04 -3.5449321713051474e-04 1.8683099741583738e-03 + 17 6.8803503267879525e-04 3.2662083177018096e-04 6.4072364607216479e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml new file mode 100644 index 0000000000..475cca40dd --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:04:41 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + atom dipole + atom sphere + fix nvt/sphere + pair lj/cut/dipole/cut +pre_commands: ! "" +post_commands: ! | + pair_style lj/cut/dipole/cut 8.0 + pair_coeff * * 0.0 3.0 + fix test solute nvt/sphere temp 50.0 ${t_target} 1.0 mtk no tchain 1 +input_file: in.dipole +natoms: 29 +global_scalar: 9.924697652139482 +global_vector: ! |- + 4 0.43730807201701893 0.3665139279582142 8.603313153695396 1.321384498444087 +run_pos: ! |2 + 1 -2.7857754700604942e-01 2.4737788516853181e+00 -1.7257396330013031e-01 + 2 3.0850115944710327e-01 2.9513142622511719e+00 -8.4681556480583575e-01 + 3 -6.9632348687864432e-01 1.2471236694194847e+00 -6.2298052323011499e-01 + 4 -1.5801760404603551e+00 1.4901171554125783e+00 -1.2587444137786121e+00 + 5 -9.0554110755246675e-01 9.2669147227396242e-01 4.0873213467368236e-01 + 6 2.9378026057366557e-01 2.2943212036894861e-01 -1.2831635420654603e+00 + 7 3.4006761483004838e-01 -1.0377733744958867e-02 -2.4645683173858011e+00 + 8 1.1646826875098761e+00 -4.8500807795966860e-01 -6.7587787331337879e-01 + 9 1.3822063251019909e+00 -2.6401397156226225e-01 2.5396960414860481e-01 + 10 2.0192493111993715e+00 -1.4272889150482639e+00 -9.6768735273395645e-01 + 11 1.7890303309094977e+00 -1.9946965130909404e+00 -1.8925075194694674e+00 + 12 3.0049434516100972e+00 -4.9045861663050150e-01 -1.6214756179261760e+00 + 13 4.0471182890478579e+00 -8.9651185156943869e-01 -1.6397072178431196e+00 + 14 2.6062444242656060e+00 -4.1840193127005565e-01 -2.6565200131776696e+00 + 15 2.9685592646673440e+00 5.6091711077199957e-01 -1.2267010594920404e+00 + 16 2.6514875718616819e+00 -2.3964428457417650e+00 3.5797286851782795e-02 + 17 2.2321504030007735e+00 -2.1016981176998364e+00 1.1504578084374257e+00 + 18 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 + 19 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 + 20 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 + 21 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 + 22 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 + 23 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 + 24 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 + 25 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 + 26 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 + 27 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 + 28 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 + 29 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 +run_vel: ! |2 + 1 5.2257770354932154e-04 4.7726828362807159e-04 -3.0522943208439779e-04 + 2 3.4303751874469003e-03 -4.2180945960503015e-03 5.7574961491201398e-03 + 3 -6.3573466121110811e-04 1.3140213521350944e-03 -2.7079367477976345e-04 + 4 -1.7843971684490102e-03 -1.5758975301724453e-04 -5.2242082857429815e-03 + 5 -8.2227072251703434e-03 -8.5099569970796176e-03 5.4461443188764114e-03 + 6 -3.5789209403806848e-05 8.6848093647978709e-04 3.1971012031399495e-04 + 7 -2.0124049923183828e-05 -4.3697732547062844e-04 -4.3839548145203488e-04 + 8 1.5805774595943576e-04 -4.0027425549530725e-04 5.0330078142215727e-04 + 9 2.8822403754462044e-03 -6.8160818050074937e-03 -1.4036982183720429e-02 + 10 2.4663804309963576e-04 5.4279437979848030e-04 -1.1317926570306191e-04 + 11 -3.1643374866053933e-03 -5.2717858128617659e-03 -4.7921591091986638e-03 + 12 7.5165507333444870e-04 -5.1625440836408566e-04 -1.1731908604625757e-03 + 13 -1.4118493310107778e-03 1.1905767851418953e-03 -4.3306400341166124e-04 + 14 2.7000698448074820e-03 -5.6421006571202859e-03 2.4657183892946815e-03 + 15 -2.5296352230596542e-03 4.9931947404907172e-04 1.2186033148767310e-02 + 16 -1.5201520334258555e-04 -2.1134042562761171e-04 1.2515192941693037e-03 + 17 4.4810518325242047e-04 2.0606663095337985e-04 3.9041801229218047e-04 + 18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 + 19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 + 20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 + 21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 + 22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 + 23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 + 24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 + 25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 + 26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 + 27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 + 28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 + 29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 +... From bb852f239353bc5966e0eeb53843f102aa0c3ccf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 14:21:31 -0400 Subject: [PATCH 054/437] skip some more aliased styles --- unittest/force-styles/check_tests.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unittest/force-styles/check_tests.py b/unittest/force-styles/check_tests.py index 5261c02330..df71640789 100755 --- a/unittest/force-styles/check_tests.py +++ b/unittest/force-styles/check_tests.py @@ -89,7 +89,9 @@ for header in headers: if upper.match(style): continue if style in ['reax/c', 'reax/c/omp', 'reax/c/kk', - 'reax/c/kk/device', 'reax/c/kk/host', 'meam/c']: + 'reax/c/kk/device', 'reax/c/kk/host', + 'reax/c/species', 'reax/c/bonds', + 'reax/c/species/kk', 'reax/c/bonds/kk', 'meam/c']: continue # detect, process, and flag suffix styles: From 8b2e3ad3ee2bb87fd55c43422431b49e3083b528 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 14:27:38 -0400 Subject: [PATCH 055/437] add unit tests for fix addtorque --- .../tests/fix-timestep-addtorque_const.yaml | 78 ++++++++++++++++++ .../fix-timestep-addtorque_variable.yaml | 82 +++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 unittest/force-styles/tests/fix-timestep-addtorque_const.yaml create mode 100644 unittest/force-styles/tests/fix-timestep-addtorque_variable.yaml diff --git a/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml new file mode 100644 index 0000000000..00041030fd --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml @@ -0,0 +1,78 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:22:56 2021 +epsilon: 9e-12 +skip_tests: +prerequisites: ! | + atom full + fix addtorque +pre_commands: ! "" +post_commands: ! | + fix move all nve + fix test solute addtorque 0.0 -0.1 0.1 +input_file: in.fourmol +natoms: 29 +global_scalar: 0.03956049051638778 +global_vector: ! |- + 3 0.02948441541406055 0.004458628473514636 -0.07131104480401973 +run_pos: ! |2 + 1 -2.7045608765305873e-01 2.4912155300266194e+00 -1.6695862419419480e-01 + 2 3.1003988022271212e-01 2.9612351370415912e+00 -8.5466347382340779e-01 + 3 -7.0398571864393789e-01 1.2305506322261655e+00 -6.2777563892737831e-01 + 4 -1.5818160127396368e+00 1.4837403877878705e+00 -1.2538716386887083e+00 + 5 -9.0719802180160036e-01 9.2652052717190103e-01 3.9954158434283293e-01 + 6 2.4831726544553320e-01 2.8313014095084255e-01 -1.2314235089491432e+00 + 7 3.4143564541634441e-01 -2.2646427335239288e-02 -2.5292292817077064e+00 + 8 1.1743552315770585e+00 -4.8863228761713701e-01 -6.3783438385572133e-01 + 9 1.3800521862844288e+00 -2.5274734046648356e-01 2.8353984607063565e-01 + 10 2.0510767216424219e+00 -1.4604061647703297e+00 -9.8323736879838897e-01 + 11 1.7878036788887381e+00 -1.9921859718974058e+00 -1.8890602543966724e+00 + 12 3.0063008891314627e+00 -4.9013314727151508e-01 -1.6231892870803049e+00 + 13 4.0515405206097315e+00 -8.9201960028948268e-01 -1.6399997820565750e+00 + 14 2.6066967494963826e+00 -4.1789208605424438e-01 -2.6633998865546138e+00 + 15 2.9695286693280316e+00 5.5422635676528331e-01 -1.2342015684967804e+00 + 16 2.6747030713384099e+00 -2.4124116923895542e+00 -2.3435670152599387e-02 + 17 2.2153575843602251e+00 -2.0897985417815770e+00 1.1963150233982536e+00 + 18 2.1369701704116109e+00 3.0158507413630913e+00 -3.5179348337215344e+00 + 19 1.5355837136087369e+00 2.6255292355375666e+00 -4.2353987779879052e+00 + 20 2.7727573005678794e+00 3.6923910449610173e+00 -3.9330842459133506e+00 + 21 4.9040128073204503e+00 -4.0752348172958159e+00 -3.6210314709891849e+00 + 22 4.3582355554440859e+00 -4.2126119427287056e+00 -4.4612844196314079e+00 + 23 5.7439382849307608e+00 -3.5821957939275038e+00 -3.8766361295935821e+00 + 24 2.0689243582422865e+00 3.1513346907270998e+00 3.1550389754829222e+00 + 25 1.3045351331492425e+00 3.2665125705842950e+00 2.5111855257434161e+00 + 26 2.5809237402711305e+00 4.0117602605482841e+00 3.2212060529089928e+00 + 27 -1.9611343130357195e+00 -4.3563411931359699e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359861e+00 -3.5962518039482929e+00 2.2746342468737843e+00 +run_vel: ! |2 + 1 8.1700851351787680e-03 1.6515949908476435e-02 4.7901234026000820e-03 + 2 5.4497368734153350e-03 5.1788473112242134e-03 -1.4371398142926089e-03 + 3 -8.2300340000758081e-03 -1.2926916688743221e-02 -4.0987886606318937e-03 + 4 -3.7699831386057837e-03 -6.5726828161593578e-03 -1.1190176423498614e-03 + 5 -1.1022344766928559e-02 -9.8911887500188686e-03 -2.8415919891788752e-03 + 6 -3.9676608280663724e-02 4.6816984996815900e-02 3.7148317783925591e-02 + 7 9.1071086597237054e-04 -1.0128400725142215e-02 -5.1568394733748101e-02 + 8 7.9064759226637506e-03 -3.3507269525917005e-03 3.4557045104308584e-02 + 9 1.5641808529388477e-03 3.7364256461355199e-03 1.5047399262833255e-02 + 10 2.9201650498711828e-02 -2.9249371181362224e-02 -1.5017994712903047e-02 + 11 -4.7831130712487260e-03 -3.7477860269310944e-03 -2.3464216614065801e-03 + 12 2.2698304112799771e-03 -3.4738441424437080e-04 -3.0635558749914937e-03 + 13 2.7533982742218282e-03 5.8176203696077644e-03 -7.9390708609842597e-04 + 14 3.5250323942210967e-03 -5.7935475830105648e-03 -3.9473720437509336e-03 + 15 -1.8548438082234538e-03 -5.8552466365824583e-03 6.2944792336588409e-03 + 16 1.8681607173873734e-02 -1.3262252352501631e-02 -4.5638578270038387e-02 + 17 -1.2896467059015511e-02 9.7527432145300234e-03 3.7296482932975175e-02 + 18 -8.0065794839826582e-04 -8.6270473206014454e-04 -1.4483040698187947e-03 + 19 1.2452390836164592e-03 -2.5061097118798349e-03 7.2998631009701491e-03 + 20 3.5930060229627742e-03 3.6938860309263127e-03 3.2322732687855120e-03 + 21 -1.4689220370382708e-03 -2.7352129765913181e-04 7.0581624212404624e-04 + 22 -7.0694199254613017e-03 -4.2577148924905920e-03 2.8079117613999638e-04 + 23 6.0446963117407456e-03 -1.4000131614812878e-03 2.5819754846997636e-03 + 24 3.1926367907031124e-04 -9.9445664749458563e-04 1.4999996967894329e-04 + 25 1.3789754520737371e-04 -4.4335894884316232e-03 -8.1808136711778898e-04 + 26 2.0485904035277458e-03 2.7813358633862833e-03 4.3245727149281441e-03 + 27 4.5604120294022731e-04 -1.0305523026852440e-03 2.1188058381360966e-04 + 28 -6.2544520861857683e-03 1.4127711176150314e-03 -1.8429821884794460e-03 + 29 6.4110631534307870e-04 3.1273432719597966e-03 3.7253671105664863e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-addtorque_variable.yaml b/unittest/force-styles/tests/fix-timestep-addtorque_variable.yaml new file mode 100644 index 0000000000..d3e3f92083 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-addtorque_variable.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 22 14:26:01 2021 +epsilon: 2e-11 +skip_tests: +prerequisites: ! | + atom full + fix addtorque +pre_commands: ! "" +post_commands: ! | + variable xforce delete + variable xforce equal -1.0 + variable zforce delete + variable zforce equal 0.1*step/10.0 + fix move all nve + fix test solute addtorque v_xforce 0.0 v_zforce +input_file: in.fourmol +natoms: 29 +global_scalar: 0.040192344862746324 +global_vector: ! |- + 3 0.029484377941315643 0.004458348825806979 -0.07131114647916093 +run_pos: ! |2 + 1 -2.7045461263773218e-01 2.4912173168201677e+00 -1.6696274532928165e-01 + 2 3.1004052413574945e-01 2.9612352165094689e+00 -8.5466948427723322e-01 + 3 -7.0398514700197223e-01 1.2305514740305539e+00 -6.2777633916539544e-01 + 4 -1.5818162423457216e+00 1.4837399920103735e+00 -1.2538717040018597e+00 + 5 -9.0719611552425128e-01 9.2652376949202220e-01 3.9954186488341453e-01 + 6 2.4831672574192637e-01 2.8312927890145700e-01 -1.2314232633009583e+00 + 7 3.4143338526825445e-01 -2.2650090205246415e-02 -2.5292285243563257e+00 + 8 1.1743553550496466e+00 -4.8863196308796780e-01 -6.3783367577430294e-01 + 9 1.3800536475730052e+00 -2.5274490999005617e-01 2.8353973086130246e-01 + 10 2.0510762064717736e+00 -1.4604067440349566e+00 -9.8323565231712740e-01 + 11 1.7878017869191143e+00 -1.9921885935061132e+00 -1.8890569482017487e+00 + 12 3.0062997019627007e+00 -4.9013543652197411e-01 -1.6231910851065618e+00 + 13 4.0515392147263194e+00 -8.9202217000960282e-01 -1.6400020695571493e+00 + 14 2.6066941588279180e+00 -4.1789666725311453e-01 -2.6634013164859112e+00 + 15 2.9695282413677129e+00 5.5422494597097605e-01 -1.2342057356609046e+00 + 16 2.6747036907750799e+00 -2.4124101443742396e+00 -2.3432606562274621e-02 + 17 2.2153598439490909e+00 -2.0897942611237506e+00 1.1963179841694045e+00 + 18 2.1369701704109039e+00 3.0158507413624829e+00 -3.5179348337211214e+00 + 19 1.5355837136087067e+00 2.6255292355375737e+00 -4.2353987779878635e+00 + 20 2.7727573005678567e+00 3.6923910449610093e+00 -3.9330842459133306e+00 + 21 4.9040128073204992e+00 -4.0752348172957955e+00 -3.6210314709892710e+00 + 22 4.3582355554440868e+00 -4.2126119427287021e+00 -4.4612844196314096e+00 + 23 5.7439382849307608e+00 -3.5821957939275006e+00 -3.8766361295935838e+00 + 24 2.0689243582424557e+00 3.1513346907270807e+00 3.1550389754829760e+00 + 25 1.3045351331494643e+00 3.2665125705844265e+00 2.5111855257436448e+00 + 26 2.5809237402711411e+00 4.0117602605482912e+00 3.2212060529089981e+00 + 27 -1.9611343130358405e+00 -4.3563411931360090e+00 2.1098293115524167e+00 + 28 -2.7473562684513420e+00 -4.0200819932379330e+00 1.5830052163433950e+00 + 29 -1.3126000191359821e+00 -3.5962518039482925e+00 2.2746342468737826e+00 +run_vel: ! |2 + 1 8.1715038471805498e-03 1.6517702761528009e-02 4.7859997746321067e-03 + 2 5.4503179713409474e-03 5.1789072777174887e-03 -1.4431316168817382e-03 + 3 -8.2294952065699659e-03 -1.2926116506680038e-02 -4.0994800698084749e-03 + 4 -3.7702426960160408e-03 -6.5731295285995084e-03 -1.1190865089059298e-03 + 5 -1.1020475329056929e-02 -9.8880027104014442e-03 -2.8413084775740691e-03 + 6 -3.9677137318111941e-02 4.6816134139098450e-02 3.7148540792980043e-02 + 7 9.0844368987863977e-04 -1.0132095604865266e-02 -5.1567636305637793e-02 + 8 7.9066183357430729e-03 -3.3503801392424809e-03 3.4557749983800908e-02 + 9 1.5656401036142562e-03 3.7388603039389670e-03 1.5047280366985395e-02 + 10 2.9201153816488620e-02 -2.9249946103697275e-02 -1.5016274817450501e-02 + 11 -4.7849597510623036e-03 -3.7503854403682655e-03 -2.3431228504617210e-03 + 12 2.2686557921418379e-03 -3.4963168920308706e-04 -3.0653391271188305e-03 + 13 2.7521148018537969e-03 5.8151152207486893e-03 -7.9617831244930821e-04 + 14 3.5224627166930943e-03 -5.7980843766694372e-03 -3.9487861880922372e-03 + 15 -1.8552798945069447e-03 -5.8566124351604847e-03 6.2903445086971016e-03 + 16 1.8682244050164797e-02 -1.3260714393376980e-02 -4.5635521819500181e-02 + 17 -1.2894174676721371e-02 9.7570482748997739e-03 3.7299431774810592e-02 + 18 -8.0065794985635782e-04 -8.6270473333768262e-04 -1.4483040689709219e-03 + 19 1.2452390835506406e-03 -2.5061097118679156e-03 7.2998631010534921e-03 + 20 3.5930060229084934e-03 3.6938860309016657e-03 3.2322732688339346e-03 + 21 -1.4689220369302289e-03 -2.7352129762041533e-04 7.0581624194444154e-04 + 22 -7.0694199254599495e-03 -4.2577148924868363e-03 2.8079117613292169e-04 + 23 6.0446963117425125e-03 -1.4000131614743960e-03 2.5819754846962157e-03 + 24 3.1926367941798267e-04 -9.9445664753694237e-04 1.4999996979033864e-04 + 25 1.3789754566438797e-04 -4.4335894881603827e-03 -8.1808136664127291e-04 + 26 2.0485904035507274e-03 2.7813358634013181e-03 4.3245727149403366e-03 + 27 4.5604120268971426e-04 -1.0305523027678266e-03 2.1188058390995772e-04 + 28 -6.2544520861874025e-03 1.4127711176147907e-03 -1.8429821884809686e-03 + 29 6.4110631535004535e-04 3.1273432719582093e-03 3.7253671105630646e-03 +... From 607e75f984368cb065445e3a8b35fb25a0997238 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 19:42:55 -0400 Subject: [PATCH 056/437] remove tabs --- src/MGPT/mgpt_linalg.h | 10 +- src/MGPT/mgpt_readpot.cpp | 216 ++--- src/MGPT/mgpt_readpot.h | 108 +-- src/MGPT/mgpt_splinetab.cpp | 2 +- src/MGPT/mgpt_splinetab.h | 2 +- src/MGPT/pair_mgpt.cpp | 1730 +++++++++++++++++------------------ 6 files changed, 1034 insertions(+), 1034 deletions(-) diff --git a/src/MGPT/mgpt_linalg.h b/src/MGPT/mgpt_linalg.h index 07c4f5df6d..5b93885f4e 100644 --- a/src/MGPT/mgpt_linalg.h +++ b/src/MGPT/mgpt_linalg.h @@ -41,13 +41,13 @@ #define const #endif typedef void (*trmul_fun) (const double * restrict A, - const double * restrict B, - double * restrict C); + const double * restrict B, + double * restrict C); typedef void (*trtrace3_fun) (const double * restrict A, - const double * restrict B1,double * restrict t1, - const double * restrict B2,double * restrict t2, - const double * restrict B3,double * restrict t3); + const double * restrict B1,double * restrict t1, + const double * restrict B2,double * restrict t2, + const double * restrict B3,double * restrict t3); #if defined(IBM_BG_SIMD) || defined(IBM_BGQ_SIMD) #undef const #endif diff --git a/src/MGPT/mgpt_readpot.cpp b/src/MGPT/mgpt_readpot.cpp index 6717312bcd..75ea1202aa 100644 --- a/src/MGPT/mgpt_readpot.cpp +++ b/src/MGPT/mgpt_readpot.cpp @@ -69,7 +69,7 @@ static void getparmindata(const char *potin_file,int nvol[1],double vol0[1],doub if (in == nullptr) { fprintf(stderr,"@%s:%d: Error reading potin file. Can not open file \'%s\'.\n", - __FILE__,__LINE__,potin_file); + __FILE__,__LINE__,potin_file); exit(1); } @@ -86,24 +86,24 @@ static void getparmindata(const char *potin_file,int nvol[1],double vol0[1],doub if (n == 0) { metal[0] = 0; if (sscanf(line,"%s %d %d",metal,&ipot,&mode) != 3) { - fprintf(stderr,"@%s:%d: Error on potin file. line = %s\n", - __FILE__,__LINE__,line); - exit(1); + fprintf(stderr,"@%s:%d: Error on potin file. line = %s\n", + __FILE__,__LINE__,line); + exit(1); } } else { metalx[0] = 0; if (sscanf(line,"%s %d %d",metalx,&ipotx,&modex) != 3) { - fprintf(stderr,"@%s:%d: Error on potin file. line = %s\n", - __FILE__,__LINE__,line); - exit(1); + fprintf(stderr,"@%s:%d: Error on potin file. line = %s\n", + __FILE__,__LINE__,line); + exit(1); } else if (strcmp(metal,metalx) != 0 || ipot != ipotx || mode != modex) { - fprintf(stderr,"@%s:%d: Error on potin file, parameter mismatch:\n" - " metal = \'%s\' ipot = %d mode = %d\n" - " metalx = \'%s\' ipotx = %d modex = %d\n", - __FILE__,__LINE__, - metal,ipot,mode, - metalx,ipotx,modex); - exit(1); + fprintf(stderr,"@%s:%d: Error on potin file, parameter mismatch:\n" + " metal = \'%s\' ipot = %d mode = %d\n" + " metalx = \'%s\' ipotx = %d modex = %d\n", + __FILE__,__LINE__, + metal,ipot,mode, + metalx,ipotx,modex); + exit(1); } } @@ -127,7 +127,7 @@ static void getparmindata(const char *potin_file,int nvol[1],double vol0[1],doub if (n == 0) { fprintf(stderr,"@%s:%d: Invalid potin file \'%s\', no volume records.\n", - __FILE__,__LINE__,potin_file); + __FILE__,__LINE__,potin_file); exit(1); } @@ -196,7 +196,7 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl dx = (x1-x0)/(nvol-1); if (0) { printf("getparmindata() ==> nvol = %d, vol0 = %.6f, x0= %.6f, x1 = %.6f, dx = %.6f\n", - nvol,vol0,x0,x1,dx); + nvol,vol0,x0,x1,dx); } } else { /* Two-line version, reparse this line, and read second line */ @@ -252,30 +252,30 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl /* Read element type, mode, and pn parameter */ { int nf = sscanf(line,"%s %d %d %lf",metalx,&ipotx,&modex,&pnx); if (nf < 3) { - printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " - "at record %d:\n" - " Expected at least three fields. Number of fields = %d\n", - __func__,__FILE__,__LINE__,potin_file,ii, - nf); - exit(1); + printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " + "at record %d:\n" + " Expected at least three fields. Number of fields = %d\n", + __func__,__FILE__,__LINE__,potin_file,ii, + nf); + exit(1); } if (modex <= 4) { - pnx = 1.0; + pnx = 1.0; } else if (modex <= 6) { - if (nf != 4) { - printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " - "at record %d:\n" - " mode = %d, number of fields = %d\n", - __func__,__FILE__,__LINE__,potin_file,ii, - modex,nf); - exit(1); - } + if (nf != 4) { + printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " + "at record %d:\n" + " mode = %d, number of fields = %d\n", + __func__,__FILE__,__LINE__,potin_file,ii, + modex,nf); + exit(1); + } } else { - printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s): " - "at record %d\n" - " Invalid mode. mode = %d\n", - __func__,__FILE__,__LINE__,potin_file,ii, - modex); + printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s): " + "at record %d\n" + " Invalid mode. mode = %d\n", + __func__,__FILE__,__LINE__,potin_file,ii, + modex); } } @@ -285,21 +285,21 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl } else { /* Check that {metal,ipot,mode}x == {metal,ipot,mode} */ if (strcmp(metal,metalx) != 0 || - ipotx != ipot || - modex != mode || - pnx != pn) { - printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " - "at record %d:\n" - "metalx != metal (%s != %s) or\n" - "ipotx != ipot (%d != %d) or\n" - "modex != mode (%d != %d) or\n" - "pnx != pn (%.3f != %.3f).\n", - __func__,__FILE__,__LINE__,potin_file,ii, - metalx,metal, - ipotx,ipot, - modex,mode, - pnx,pn); - exit(1); + ipotx != ipot || + modex != mode || + pnx != pn) { + printf("Error in %s() @ %s:%d: Inconsistency in potential input file (%s) " + "at record %d:\n" + "metalx != metal (%s != %s) or\n" + "ipotx != ipot (%d != %d) or\n" + "modex != mode (%d != %d) or\n" + "pnx != pn (%.3f != %.3f).\n", + __func__,__FILE__,__LINE__,potin_file,ii, + metalx,metal, + ipotx,ipot, + modex,mode, + pnx,pn); + exit(1); } } //printf("LINE: %s\n",line); @@ -310,20 +310,20 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl double xi = x0 + i/((double) (nx-1)) * (x1-x0); double volguess = vol0 * xi*xi*xi; if (fabs(volguess/ivol - 1.0) > 1e-3) - printf("Wrong volume guess, i=%d volgues=%15.5e ivol=%15.5e\n", - i,volguess,ivol); + printf("Wrong volume guess, i=%d volgues=%15.5e ivol=%15.5e\n", + i,volguess,ivol); }*/ double ifrac = (pow(ivol/vol0,1.0/3.0) - x0)/((x1-x0)/(nx-1)); i = (int) (ifrac + 0.1); if (fabs(i - ifrac) > 0.01) { printf("Volume point not in table... ii=%d i=%d ifrac=%15.5e vol=%15.5e\n", - ii,i,ifrac,ivol); + ii,i,ifrac,ivol); printf("vol0 = %15.5e zval = %15.5e mass = %15.5e\n",vol0,zval,mass); exit(1); } else if (tag[i] == 1) { printf("Duplicate volume point in table.... ii=%d i=%d ifrac=%15.5e vol=%15.5e\n", - ii,i,ifrac,ivol); + ii,i,ifrac,ivol); exit(1); } else tag[i] = 1; @@ -334,7 +334,7 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl fgets(line,sizeof(line),in); sscanf(line,"%lf %lf %lf %lf %lf", - &vatab[i],&vbtab[i],&vctab[i],&vdtab[i],&vetab[i]); + &vatab[i],&vbtab[i],&vctab[i],&vdtab[i],&vetab[i]); if (ipot == 1) { vatab[i] *= vdtab[i]; vctab[i] *= vctab[i]; @@ -358,67 +358,67 @@ void potdata::readpot(const char *parmin_file,const char *potin_file,const doubl double rj,ktan,dvdvol; fgets(line,sizeof(line),in); sscanf(line,"%lf %lf %lf %lf", - &rj,&vpairtab[i*nr+j],&ktan,&dvdvol); + &rj,&vpairtab[i*nr+j],&ktan,&dvdvol); { /* Add screening and fl() part to pair energy table */ - double al = altab[i]; - double p1 = p1tab[i]; + double al = altab[i]; + double p1 = p1tab[i]; - int bscreen = (al > 0.0); + int bscreen = (al > 0.0); - double xi = x0 + i/((double) (nx-1)) * (x1-x0); - double rws = rws_scale * xi; + double xi = x0 + i/((double) (nx-1)) * (x1-x0); + double rws = rws_scale * xi; - double r0rws = r0rwstab[i]; - double r00 = r0rws*rws,rp = 1.8*rws; - if (bscreen == 0) r0rws = 10.0; - double alp = al,alm = al; - if (mode == 2 || mode == 4 || mode == 6) alm = 125.0; - al = alp; + double r0rws = r0rwstab[i]; + double r00 = r0rws*rws,rp = 1.8*rws; + if (bscreen == 0) r0rws = 10.0; + double alp = al,alm = al; + if (mode == 2 || mode == 4 || mode == 6) alm = 125.0; + al = alp; - double r = r0 + j*(r1-r0)/(nr-1); + double r = r0 + j*(r1-r0)/(nr-1); - double rrws = r/rws; - //double rsqr = r*r; - // double fl(double r,int mode,double rp,double p1,double al,double r0) - double flr = fl(r,mode,rp,p1,al,r00,pn); - double fl2 = flr*flr; - double v2a = vatab[i]*fl2*fl2; - double v2b = vbtab[i]*fl2; - double fscr = 1.0; + double rrws = r/rws; + //double rsqr = r*r; + // double fl(double r,int mode,double rp,double p1,double al,double r0) + double flr = fl(r,mode,rp,p1,al,r00,pn); + double fl2 = flr*flr; + double v2a = vatab[i]*fl2*fl2; + double v2b = vbtab[i]*fl2; + double fscr = 1.0; - if (bscreen == 1 && rrws >= r0rws) { - double arg = rrws/r0rwstab[i]; - double arg1 = arg - 1.0; - double arg12 = arg1*arg1; - double f,dp; - if (mode <= 2) { - f = fgauss(arg,al); - dp=2.*al*arg*arg1; - } - else { - f = hgauss(arg,al); - double arg13 = arg1*arg12; - dp=2.0*al*al*arg*arg13/(1.+al*arg12); - } - fscr = f*f; - } + if (bscreen == 1 && rrws >= r0rws) { + double arg = rrws/r0rwstab[i]; + double arg1 = arg - 1.0; + double arg12 = arg1*arg1; + double f,dp; + if (mode <= 2) { + f = fgauss(arg,al); + dp=2.*al*arg*arg1; + } + else { + f = hgauss(arg,al); + double arg13 = arg1*arg12; + dp=2.0*al*al*arg*arg13/(1.+al*arg12); + } + fscr = f*f; + } - double vpair_tmp = vpairtab[i*nr+j]; - vpairtab[i*nr+j] = vpairtab[i*nr+j]*fscr + v2a - v2b; + double vpair_tmp = vpairtab[i*nr+j]; + vpairtab[i*nr+j] = vpairtab[i*nr+j]*fscr + v2a - v2b; - if (0) if (fabs(vol-ivol) < 0.01) { - static FILE *xfile = nullptr; - if (j == 0) { - xfile = fopen("mgpt5-pot.dat","w"); - fprintf(xfile,"%%%% vol = %15.5e ivol = %15.5e i = %d ii = %d\n", - vol,ivol,i,ii); - } - fprintf(xfile,"%15.5e %15.5e %15.5e %15.5e %15.5e %20.10e\n", - r,vpair_tmp,fscr,v2a,v2b,flr); - if (j == nr-1) fclose(xfile); - } + if (0) if (fabs(vol-ivol) < 0.01) { + static FILE *xfile = nullptr; + if (j == 0) { + xfile = fopen("mgpt5-pot.dat","w"); + fprintf(xfile,"%%%% vol = %15.5e ivol = %15.5e i = %d ii = %d\n", + vol,ivol,i,ii); + } + fprintf(xfile,"%15.5e %15.5e %15.5e %15.5e %15.5e %20.10e\n", + r,vpair_tmp,fscr,v2a,v2b,flr); + if (j == nr-1) fclose(xfile); + } } @@ -544,7 +544,7 @@ int main(int argc,char *argv[]) { int n = 25,i; printf("%% parmin = %s\n%% potin = %s\n%% vol = %15.5e\n", - argv[1],argv[2],vol); + argv[1],argv[2],vol); readpot(argv[1],argv[2],vol); @@ -555,7 +555,7 @@ int main(int argc,char *argv[]) { evalspline(nr-1,r0,r1,vpair_spline,x,&u,&f,&d2y); evalspline(nr-1,r0,r1,dvpair_spline,x,&vir,&dy,&d2y); printf(" %15.5e %15.5e %15.5e %15.5e\n", - x,u,f,vir); + x,u,f,vir); } diff --git a/src/MGPT/mgpt_readpot.h b/src/MGPT/mgpt_readpot.h index 629b1c683f..d860146959 100644 --- a/src/MGPT/mgpt_readpot.h +++ b/src/MGPT/mgpt_readpot.h @@ -175,8 +175,8 @@ struct potdata2 { p = strchr(s,'{'); if(p != nullptr) { if(sscanf(p+1,"%d:%d:%d",i0,stride,i1) != 3) { - fprintf(stderr,"Error in template (\'%s\'), can not parse range.\n",nametemplate); - exit(1); + fprintf(stderr,"Error in template (\'%s\'), can not parse range.\n",nametemplate); + exit(1); } *p = '\0'; } else { @@ -205,13 +205,13 @@ struct potdata2 { if(i0x != i0 || i1x != i1 || stridex != stride) { fprintf(stderr,"Inconsistent templates. parmin_template=\'%s\', potin_template=\'%s\'\n", - parmin_template,potin_template); + parmin_template,potin_template); exit(1); } if(i0 < 0 || i1 < i0 || stride <= 0 || (i1-i0)/stride+1 < 4) { fprintf(stderr,"Improper temperature range. Need at least 4 temperature samples. " - "i0=%d,i1=%d,stride=%d,basename=\'%s\'\n", - i0,i1,stride,parmin_file); + "i0=%d,i1=%d,stride=%d,basename=\'%s\'\n", + i0,i1,stride,parmin_file); exit(1); } @@ -220,20 +220,20 @@ struct potdata2 { if(parmin_suffix-1 == nullptr) { fprintf(stderr,"No closing }. parmin_template=\'%s\'\n", - parmin_template); + parmin_template); exit(1); } if(potin_suffix-1 == nullptr) { fprintf(stderr,"No closing }. potin_template=\'%s\'\n", - potin_template); + potin_template); exit(1); } printf("parmin_template = %s\n" - "parmin_file = %s\n" - "parmin_suffix = %s\n" - "T0=%d , T1=%d , stride=%d\n", - parmin_template,parmin_file,parmin_suffix,i0,i1,stride); + "parmin_file = %s\n" + "parmin_suffix = %s\n" + "T0=%d , T1=%d , stride=%d\n", + parmin_template,parmin_file,parmin_suffix,i0,i1,stride); ntemp = (i1-i0)/stride + 1; /*potdata **/potlist = new potdata[ntemp]; @@ -245,27 +245,27 @@ struct potdata2 { printf("Calling readpot(%s,%s,%.3f)\n", - parmin_file,potin_file,vol); + parmin_file,potin_file,vol); potlist[k].readpot(parmin_file,potin_file,vol); if(k > 0) { - if(potlist[k].nr != potlist[k-1].nr) { - fprintf(stderr,"nr differs between file %d and %d. Exiting.\n", - k,k-1); - exit(1); - } + if(potlist[k].nr != potlist[k-1].nr) { + fprintf(stderr,"nr differs between file %d and %d. Exiting.\n", + k,k-1); + exit(1); + } - if(potlist[k].r0 != potlist[k-1].r0) { - fprintf(stderr,"r0 differs between file %d and %d. Exiting.\n", - k,k-1); - exit(1); - } + if(potlist[k].r0 != potlist[k-1].r0) { + fprintf(stderr,"r0 differs between file %d and %d. Exiting.\n", + k,k-1); + exit(1); + } - if(potlist[k].r1 != potlist[k-1].r1) { - fprintf(stderr,"r1 differs between file %d and %d. Exiting.\n", - k,k-1); - exit(1); - } + if(potlist[k].r1 != potlist[k-1].r1) { + fprintf(stderr,"r1 differs between file %d and %d. Exiting.\n", + k,k-1); + exit(1); + } } } tdeppot.r0 = potlist[0].r0; @@ -334,39 +334,39 @@ struct potdata2 { tdeppot.dvpair = new double[sz][4][4]; /* printf("vpair = %llx , dvpair = %llx", - (unsigned long long int) tdeppot.vpair, - (unsigned long long int) tdeppot.dvpair); + (unsigned long long int) tdeppot.vpair, + (unsigned long long int) tdeppot.dvpair); printf(" @@@@@@@@@@@@@@ nr = %d\n",nr); */ for(int i = 0; i= potlist[k].nr-1) - printf("Index error, local_nr=%d, k=%d, i=%d, nr=%d\n",nr,k,i,potlist[k].nr); - v[k] = potlist[k].vpair_spline[i][j]; - } - makespline(ntemp,1,v,C); + /* Make pair interaction interpolation functions */ + for(int k = 0; k= potlist[k].nr-1) + printf("Index error, local_nr=%d, k=%d, i=%d, nr=%d\n",nr,k,i,potlist[k].nr); + v[k] = potlist[k].vpair_spline[i][j]; + } + makespline(ntemp,1,v,C); - for(int k = 0; kdestroy(setflag); - memory->destroy(cutsq); - memory->destroy(cutghost); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cutghost); + } } /* ---------------------------------------------------------------------- */ @@ -143,12 +143,12 @@ void PairMGPT::make_bond(const double xx[][3],int i,int j,bond_data *bptr) { t0 = gettime(); if (lang == 3) { hamltn_5_raw(rrij[0],rrij[1],rrij[2], - bptr->H.m ,bptr->Hx.m, - bptr->Hy.m,bptr->Hz.m,&bptr->fl_deriv_sum); + bptr->H.m ,bptr->Hx.m, + bptr->Hy.m,bptr->Hz.m,&bptr->fl_deriv_sum); } else { hamltn_7_raw(rrij[0],rrij[1],rrij[2], - bptr->H.m ,bptr->Hx.m, - bptr->Hy.m,bptr->Hz.m,&bptr->fl_deriv_sum); + bptr->H.m ,bptr->Hx.m, + bptr->Hy.m,bptr->Hz.m,&bptr->fl_deriv_sum); } t1 = gettime(); @@ -179,7 +179,7 @@ static inline double mtrace(int n,double A[8][8],double B[8][8]) { s = 0.0; for (int i = 1; i<=n; i++) for (int j = 1; j<=n; j++) - s = s + A[i][j]*B[i][j]; + s = s + A[i][j]*B[i][j]; } t1 = gettime(); t_trace += t1-t0; @@ -190,7 +190,7 @@ static inline double mtrace(int n,double A[8][8],double B[8][8]) { */ void PairMGPT::make_triplet(bond_data *ij_bond,bond_data *ik_bond, - triplet_data *triptr) { + triplet_data *triptr) { if (1) { const trmul_fun tr_mul = linalg.tr_mul; tr_mul(&(ij_bond->H.m[1][0]), &(ik_bond->H.m[1][0]) ,&(triptr->H1H2.m[1][0]) ); @@ -214,9 +214,9 @@ void PairMGPT::make_triplet(bond_data *ij_bond,bond_data *ik_bond, static double t_make_t = 0.0,t_make_b = 0.0,n_make = 0.0; PairMGPT::triplet_data *PairMGPT::get_triplet(const double xx[][3],int i,int j,int k, - Hash *bhash, - triplet_data *twork, - double *dvir_ij_p,double *dvir_ik_p) { + Hash *bhash, + triplet_data *twork, + double *dvir_ij_p,double *dvir_ik_p) { const int recompute = 0; static bond_data bij_work,bik_work; @@ -354,11 +354,11 @@ double PairMGPT::numderiv4(double xx[][3],int i,int j,int k,int m,int p) { static double dtol = 1e-6; void PairMGPT::force_debug_3t(double xx[][3], - int i0,int j0,int k0, - int i ,int j ,int k , - double dfix,double dfiy,double dfiz, - double dfjx,double dfjy,double dfjz, - double dfkx,double dfky,double dfkz) { + int i0,int j0,int k0, + int i ,int j ,int k , + double dfix,double dfiy,double dfiz, + double dfjx,double dfjy,double dfjz, + double dfkx,double dfky,double dfkz) { double dfi[3],dfj[3],dfk[3]; dfi[0] = dfix; dfi[1] = dfiy; dfi[2] = dfiz; dfj[0] = dfjx; dfj[1] = dfjy; dfj[2] = dfjz; @@ -372,11 +372,11 @@ void PairMGPT::force_debug_3t(double xx[][3], ndfk = -numderiv3t(xx,k,i,j,p); if ((fabs(dfi[p] - ndfi) > dtol && - fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || + fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || (fabs(dfj[p] - ndfj) > dtol && - fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || + fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || (fabs(dfk[p] - ndfk) > dtol && - fabs(dfk[p] - ndfk) > dtol*fabs(ndfk))) { + fabs(dfk[p] - ndfk) > dtol*fabs(ndfk))) { printf("Force error in T12 & T23 & T31 :: i,j,k = %d,%d,%d\n",i0,j0,k0); printf(" dE/d%c[i] = %20.10e %20.10e\n", 'x'+p,ndfi, dfi[p]); printf(" dE/d%c[j] = %20.10e %20.10e\n", 'x'+p,ndfj, dfj[p]); @@ -387,11 +387,11 @@ void PairMGPT::force_debug_3t(double xx[][3], } void PairMGPT::force_debug_3v(double xx[][3], - int i0,int j0,int k0, - int i ,int j ,int k , - double dfix,double dfiy,double dfiz, - double dfjx,double dfjy,double dfjz, - double dfkx,double dfky,double dfkz) { + int i0,int j0,int k0, + int i ,int j ,int k , + double dfix,double dfiy,double dfiz, + double dfjx,double dfjy,double dfjz, + double dfkx,double dfky,double dfkz) { double dfi[3],dfj[3],dfk[3]; dfi[0] = dfix; dfi[1] = dfiy; dfi[2] = dfiz; dfj[0] = dfjx; dfj[1] = dfjy; dfj[2] = dfjz; @@ -405,11 +405,11 @@ void PairMGPT::force_debug_3v(double xx[][3], ndfk = -numderiv3v(xx,i,j,k,p,k0); if ((fabs(dfi[p] - ndfi) > dtol && - fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || + fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || (fabs(dfj[p] - ndfj) > dtol && - fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || + fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || (fabs(dfk[p] - ndfk) > dtol && - fabs(dfk[p] - ndfk) > dtol*fabs(ndfk))) { + fabs(dfk[p] - ndfk) > dtol*fabs(ndfk))) { printf("Force error in T12 :: i,j,k = %d,%d,%d\n",i0,j0,k0); printf(" dE/d%c[i] = %20.10e %20.10e\n", 'x'+p,ndfi, dfi[p]); printf(" dE/d%c[j] = %20.10e %20.10e\n", 'x'+p,ndfj, dfj[p]); @@ -420,12 +420,12 @@ void PairMGPT::force_debug_3v(double xx[][3], } void PairMGPT::force_debug_4(double xx[][3], - int i0,int j0,int k0,int m0, - int i ,int j ,int k ,int m , - double dfix,double dfiy,double dfiz, - double dfjx,double dfjy,double dfjz, - double dfkx,double dfky,double dfkz, - double dfmx,double dfmy,double dfmz) { + int i0,int j0,int k0,int m0, + int i ,int j ,int k ,int m , + double dfix,double dfiy,double dfiz, + double dfjx,double dfjy,double dfjz, + double dfkx,double dfky,double dfkz, + double dfmx,double dfmy,double dfmz) { double dfi[3],dfj[3],dfk[3],dfm[3]; dfi[0] = dfix; dfi[1] = dfiy; dfi[2] = dfiz; @@ -441,9 +441,9 @@ void PairMGPT::force_debug_4(double xx[][3], if (1) { double ndf[] = {0.0,0.0,0.0,0.0}; for (int s = 0; s<4; s++) - for (int t = 0; t<4; t++) - if (ii[s] == ii0[t]) - ndf[t] = -numderiv4(xx,ii[s],ii[s+1],ii[s+2],ii[s+3],p); + for (int t = 0; t<4; t++) + if (ii[s] == ii0[t]) + ndf[t] = -numderiv4(xx,ii[s],ii[s+1],ii[s+2],ii[s+3],p); ndfi = ndf[0]; ndfj = ndf[1]; ndfk = ndf[2]; ndfm = ndf[3]; } else { @@ -454,13 +454,13 @@ void PairMGPT::force_debug_4(double xx[][3], } if ((fabs(dfi[p] - ndfi) > dtol && - fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || + fabs(dfi[p] - ndfi) > dtol*fabs(ndfi)) || (fabs(dfj[p] - ndfj) > dtol && - fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || + fabs(dfj[p] - ndfj) > dtol*fabs(ndfj)) || (fabs(dfk[p] - ndfk) > dtol && - fabs(dfk[p] - ndfk) > dtol*fabs(ndfk)) || + fabs(dfk[p] - ndfk) > dtol*fabs(ndfk)) || (fabs(dfm[p] - ndfm) > dtol && - fabs(dfm[p] - ndfm) > dtol*fabs(ndfm))) { + fabs(dfm[p] - ndfm) > dtol*fabs(ndfm))) { printf("Force error in T31 & T64 :: i,j,k,m = %d,%d,%d,%d\n",i0,j0,k0,m0); printf(" dE/d%c[i] = %20.10e %20.10e\n", 'x'+p,ndfi, dfi[p]); printf(" dE/d%c[j] = %20.10e %20.10e\n", 'x'+p,ndfj, dfj[p]); @@ -485,21 +485,21 @@ void PairMGPT::force_debug_4(double xx[][3], #define trd_update_4(T12,T45) \ do { \ tr_trace3(&(T45->H1H2.m[1][0]), \ - &(T12->H1xH2.m[1][0]),&utr1x.d, \ - &(T12->H1yH2.m[1][0]),&utr1y.d, \ - &(T12->H1zH2.m[1][0]),&utr1z.d); \ + &(T12->H1xH2.m[1][0]),&utr1x.d, \ + &(T12->H1yH2.m[1][0]),&utr1y.d, \ + &(T12->H1zH2.m[1][0]),&utr1z.d); \ tr_trace3(&(T45->H1H2.m[1][0]), \ - &(T12->H1H2x.m[1][0]),&utr2x.d, \ - &(T12->H1H2y.m[1][0]),&utr2y.d, \ - &(T12->H1H2z.m[1][0]),&utr2z.d); \ + &(T12->H1H2x.m[1][0]),&utr2x.d, \ + &(T12->H1H2y.m[1][0]),&utr2y.d, \ + &(T12->H1H2z.m[1][0]),&utr2z.d); \ tr_trace3(&(T12->H1H2.m[1][0]), \ - &(T45->H1xH2.m[1][0]),&utr3x.d, \ - &(T45->H1yH2.m[1][0]),&utr3y.d, \ - &(T45->H1zH2.m[1][0]),&utr3z.d); \ + &(T45->H1xH2.m[1][0]),&utr3x.d, \ + &(T45->H1yH2.m[1][0]),&utr3y.d, \ + &(T45->H1zH2.m[1][0]),&utr3z.d); \ tr_trace3(&(T12->H1H2.m[1][0]), \ - &(T45->H1H2x.m[1][0]),&utr4x.d, \ - &(T45->H1H2y.m[1][0]),&utr4y.d, \ - &(T45->H1H2z.m[1][0]),&utr4z.d); \ + &(T45->H1H2x.m[1][0]),&utr4x.d, \ + &(T45->H1H2y.m[1][0]),&utr4y.d, \ + &(T45->H1H2z.m[1][0]),&utr4z.d); \ if (linalg.single) { \ trd1x = utr1x.f; trd2x = utr2x.f; trd3x = utr3x.f; trd4x = utr4x.f; \ trd1y = utr1y.f; trd2y = utr2y.f; trd3y = utr3y.f; trd4y = utr4y.f; \ @@ -572,9 +572,9 @@ void PairMGPT::force_debug_4(double xx[][3], static int ntr_calls = 0; static trtrace3_fun tr_internal; static void tr_count(const double * restrict A, - const double * restrict B1,double * restrict t1, - const double * restrict B2,double * restrict t2, - const double * restrict B3,double * restrict t3) { + const double * restrict B1,double * restrict t1, + const double * restrict B2,double * restrict t2, + const double * restrict B3,double * restrict t3) { tr_internal(A,B1,t1,B2,t2,B3,t3); ntr_calls++; } @@ -586,8 +586,8 @@ static void tr_count(const double * restrict A, int PairMGPT::Matrix::sz; void PairMGPT::compute_x(const int *nnei,const int * const *nlist, - double *e_s,double *e_p,double *e_t,double *e_q, - int evflag,int newton_pair) { + double *e_s,double *e_p,double *e_t,double *e_q, + int evflag,int newton_pair) { Hash bond_hash(100000); int i,j,k,m,ix,jx,kx,mx,itag,jtag,p; @@ -709,11 +709,11 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, int cyc[] = {0,1,2,0,1}; ss = (double (*)[3]) memory->smalloc(sizeof(double [3]) * ntot, - "mgpt: local reduced coordinate vector."); + "mgpt: local reduced coordinate vector."); for (i = 0; i<3; i++) { for (j = 0; j<3; j++) - E[i][j] = 0.0; + E[i][j] = 0.0; E[i][i] = domain->subhi_lamda[i] - domain->sublo_lamda[i]; domain->lamda2x(E[i],EX[i]); } @@ -721,17 +721,17 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, int i1 = cyc[i+1],i2 = cyc[i+2]; double dot = 0.0,ns2 = 0.0; for (j = 0; j<3; j++) { - int j1 = cyc[j+1],j2 = cyc[j+2]; - double cj = EX[i1][j1]*EX[i2][j2] - EX[i1][j2]*EX[i2][j1]; - ns2 = ns2 + cj*cj; - dot = dot + EX[i][j]*cj; + int j1 = cyc[j+1],j2 = cyc[j+2]; + double cj = EX[i1][j1]*EX[i2][j2] - EX[i1][j2]*EX[i2][j1]; + ns2 = ns2 + cj*cj; + dot = dot + EX[i][j]*cj; } alpha[i] = E[i][i] / (dot/sqrt(ns2)); if (comm->me == 0) { - static int count = 0; - if (count < 3) - printf("@@@ alpha(%d) = %15.5e\n",i+1,alpha[i]); - count++; + static int count = 0; + if (count < 3) + printf("@@@ alpha(%d) = %15.5e\n",i+1,alpha[i]); + count++; } if (alpha[i] < 0.0) alpha[i] = -alpha[i]; } @@ -768,14 +768,14 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, if (0) if (domain->triclinic) { if (comm->me == 0) - printf("Can not handle triclinic box yet\n"); + printf("Can not handle triclinic box yet\n"); error->all(__FILE__,__LINE__,"Can not handle triclinic cell with mgpt yet."); } /* for (i = 0; i 0.0) { - /* - Compute pair energy/force - */ - double de_pair,df,rij = sqrt(rij2); - splinepot.eval_pot(rij,&de_pair,&df); - de_pair = de_pair * e_scale * w2; - df = df / rij * w2; + if (w2 > 0.0) { + /* + Compute pair energy/force + */ + double de_pair,df,rij = sqrt(rij2); + splinepot.eval_pot(rij,&de_pair,&df); + de_pair = de_pair * e_scale * w2; + df = df / rij * w2; - if (pair_energies == 0) de_pair = 0.0; - e_pair = e_pair + de_pair; - c_p++; + if (pair_energies == 0) de_pair = 0.0; + e_pair = e_pair + de_pair; + c_p++; - if (pair_forces == 0) df = 0.0; + if (pair_forces == 0) df = 0.0; - if (volpres_flag && pair_energies) { - double dvir; - splinepot.eval_vir(rij,&dvir); - volvir2 = volvir2 - dvir * w2; + if (volpres_flag && pair_energies) { + double dvir; + splinepot.eval_vir(rij,&dvir); + volvir2 = volvir2 - dvir * w2; - /* Per-atom virial contribution of volumetric energy term */ - if (vflag_atom) - for (int pp = 0; pp<3; pp++) { - //virial[i] = virial[i] + rhoinv*e_scale*volvir2; - vatom[i][pp] -= 0.5 * rhoinv*e_scale*dvir*w2; - vatom[j][pp] -= 0.5 * rhoinv*e_scale*dvir*w2; - } - } + /* Per-atom virial contribution of volumetric energy term */ + if (vflag_atom) + for (int pp = 0; pp<3; pp++) { + //virial[i] = virial[i] + rhoinv*e_scale*volvir2; + vatom[i][pp] -= 0.5 * rhoinv*e_scale*dvir*w2; + vatom[j][pp] -= 0.5 * rhoinv*e_scale*dvir*w2; + } + } - double drijx = xx[j][0] - xx[i][0]; - double drijy = xx[j][1] - xx[i][1]; - double drijz = xx[j][2] - xx[i][2]; + double drijx = xx[j][0] - xx[i][0]; + double drijy = xx[j][1] - xx[i][1]; + double drijz = xx[j][2] - xx[i][2]; - fix = fix + df*drijx; - fjx = fjx - df*drijx; + fix = fix + df*drijx; + fjx = fjx - df*drijx; - fiy = fiy + df*drijy; - fjy = fjy - df*drijy; + fiy = fiy + df*drijy; + fjy = fjy - df*drijy; - fiz = fiz + df*drijz; - fjz = fjz - df*drijz; + fiz = fiz + df*drijz; + fjz = fjz - df*drijz; - if (evflag) { - //ev_tally(i,j,nloc,newton_pair,de_pair,0.0,df,-drijx,-drijy,-drijz); - /* To fix stress-per-atom scaling, and sign */ - ev_tally(i,j,nloc,newton_pair,de_pair,0.0,-df * e_scale,-drijx,-drijy,-drijz); - } + if (evflag) { + //ev_tally(i,j,nloc,newton_pair,de_pair,0.0,df,-drijx,-drijy,-drijz); + /* To fix stress-per-atom scaling, and sign */ + ev_tally(i,j,nloc,newton_pair,de_pair,0.0,-df * e_scale,-drijx,-drijy,-drijz); + } - ff[j][0] += fjx * e_scale; - ff[j][1] += fjy * e_scale; - ff[j][2] += fjz * e_scale; + ff[j][0] += fjx * e_scale; + ff[j][1] += fjy * e_scale; + ff[j][2] += fjz * e_scale; - } - } + } + } } if (rij2 < rcut2_bond && c2_outside(ss[i],ss[j],triclinic,alpha) == 0) { - /* - Add j to short neighbor list for i. - Insert j to keep list sorted. - */ + /* + Add j to short neighbor list for i. + Insert j to keep list sorted. + */ - p = first[i+1]-1; - while (p >= first[i] && nlist_short[p] > j) { - nlist_short[p+1] = nlist_short[p]; - p = p - 1; - } - nlist_short[p+1] = j; - first[i+1] = first[i+1] + 1; - if (first[i+1] > nneitot) { - printf("nneitot = %d, short list full. i=%d\n", - nneitot,i); - error->one(__FILE__,__LINE__,"Shit! Short list full\n"); - } + p = first[i+1]-1; + while (p >= first[i] && nlist_short[p] > j) { + nlist_short[p+1] = nlist_short[p]; + p = p - 1; + } + nlist_short[p+1] = j; + first[i+1] = first[i+1] + 1; + if (first[i+1] > nneitot) { + printf("nneitot = %d, short list full. i=%d\n", + nneitot,i); + error->one(__FILE__,__LINE__,"Shit! Short list full\n"); + } } } @@ -911,592 +911,592 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, if (three_body_energies || three_body_forces || four_body_energies || four_body_forces) for (jx = first[i]; jx k and the list - is sorted, the loop below terminates:-) - */ - while (mj < first[j+1] && nlist_short[mj] < k) mj = mj + 1; - if (mj < first[j+1] && nlist_short[mj] == k) { - /* Closed triplet */ - c_jk = 1; - - if (j > i) continue; /* Require k 0.0) { - triplet_defer = 0; - - dvir_ij = dvir_jk = dvir_ki = 0.0; - if (c_ij && c_jk) - T12 = get_triplet(xx,j,i,k,&bond_hash,&T12work,&dvir_ij,&dvir_jk); - if (c_ki && c_jk) - T23 = get_triplet(xx,k,i,j,&bond_hash,&T23work,&dvir_ki,&dvir_jk); - if (c_ij && c_ki) - T31 = get_triplet(xx,i,j,k,&bond_hash,&T31work,&dvir_ij,&dvir_ki); - - if (evflag) { - fsave[0][0] = fix; fsave[0][1] = fiy; fsave[0][2] = fiz; - fsave[1][0] = fjx; fsave[1][1] = fjy; fsave[1][2] = fjz; - fsave[2][0] = fkx; fsave[2][1] = fky; fsave[2][2] = fkz; - fix = fiy = fiz = 0.0; - fjx = fjy = fjz = 0.0; - fkx = fky = fkz = 0.0; - } - - tr0 = tr1 = tr2 = tr3 = 0.0; - double xvir3t,xvir3v; - xvir3t = xvir3v = 0.0; - - if (T12 && T23) { - bond_data *bki = bond_hash.Lookup(Doublet(k,i)); - - if (three_body_energies && evflag) { - tr0 = transtrace(T12->H1H2,bki->H); - double dvir = ((dvir_ij + dvir_jk + bki->fl_deriv_sum)*splinepot.vc + - splinepot.dvc)*tr0*w3/anorm3; - vir3t = vir3t + dvir; - xvir3t = xvir3t + dvir; - } - mcount2++; - - { - const double vc = splinepot.vc; - tr_trace3(&(bki->H.m[1][0]), - &(T12->H1xH2.m[1][0]),&utr1x.d, - &(T12->H1yH2.m[1][0]),&utr1y.d, - &(T12->H1zH2.m[1][0]),&utr1z.d); - - tr_trace3(&(bki->H.m[1][0]), - &(T12->H1H2x.m[1][0]),&utr2x.d, - &(T12->H1H2y.m[1][0]),&utr2y.d, - &(T12->H1H2z.m[1][0]),&utr2z.d); - - tr_trace3(&(T12->H1H2.m[1][0]), - &(bki->Hx.m[1][0]),&utr3x.d, - &(bki->Hy.m[1][0]),&utr3y.d, - &(bki->Hz.m[1][0]),&utr3z.d); - - if (linalg.single) { - trd1x = utr1x.f; trd2x = utr2x.f; trd3x = utr3x.f; - trd1y = utr1y.f; trd2y = utr2y.f; trd3y = utr3y.f; - trd1z = utr1z.f; trd2z = utr2z.f; trd3z = utr3z.f; - } else { - trd1x = utr1x.d; trd2x = utr2x.d; trd3x = utr3x.d; - trd1y = utr1y.d; trd2y = utr2y.d; trd3y = utr3y.d; - trd1z = utr1z.d; trd2z = utr2z.d; trd3z = utr3z.d; - } - - dfix = ( (-sij)*trd1x + ( ski)*trd3x ) * (vc / anorm3); - dfjx = ( ( sij)*trd1x + (-sjk)*trd2x ) * (vc / anorm3); - dfkx = ( ( sjk)*trd2x + (-ski)*trd3x ) * (vc / anorm3); - - dfiy = ( (-sij)*trd1y + ( ski)*trd3y ) * (vc / anorm3); - dfjy = ( ( sij)*trd1y + (-sjk)*trd2y ) * (vc / anorm3); - dfky = ( ( sjk)*trd2y + (-ski)*trd3y ) * (vc / anorm3); - - dfiz = ( (-sij)*trd1z + ( ski)*trd3z ) * (vc / anorm3); - dfjz = ( ( sij)*trd1z + (-sjk)*trd2z ) * (vc / anorm3); - dfkz = ( ( sjk)*trd2z + (-ski)*trd3z ) * (vc / anorm3); - } - - if (triplet_debug) - force_debug_3t(xx,i,j,k, i,j,k, - dfix,dfiy,dfiz, - dfjx,dfjy,dfjz, - dfkx,dfky,dfkz); - - if (three_body_forces) - accumulate_forces_3(w3); - } - - if (T12 != 0) { - //printf("T12 i,j,k = %d,%d,%d\n",i,j,k); - mcount++; - if (three_body_energies && evflag) { - tr1 = transtrace(T12->H1H2,T12->H1H2); - double dvir = (2.0*(dvir_ij + dvir_jk)*splinepot.vd + - splinepot.dvd)*tr1*w3/anorm4; - vir3v = vir3v + dvir; - xvir3v = xvir3v + dvir; - } - - { - const double vd = splinepot.vd; - - tr_trace3(&(T12->H1H2.m[1][0]), - &(T12->H1xH2.m[1][0]),&utr1x.d, - &(T12->H1yH2.m[1][0]),&utr1y.d, - &(T12->H1zH2.m[1][0]),&utr1z.d); - tr_trace3(&(T12->H1H2.m[1][0]), - &(T12->H1H2x.m[1][0]),&utr2x.d, - &(T12->H1H2y.m[1][0]),&utr2y.d, - &(T12->H1H2z.m[1][0]),&utr2z.d); - if (linalg.single) { - trd1x = utr1x.f; trd2x = utr2x.f; - trd1y = utr1y.f; trd2y = utr2y.f; - trd1z = utr1z.f; trd2z = utr2z.f; - } else { - trd1x = utr1x.d; trd2x = utr2x.d; - trd1y = utr1y.d; trd2y = utr2y.d; - trd1z = utr1z.d; trd2z = utr2z.d; - } - - dfix = 2.0*(-sij)*trd1x * (vd / anorm4); - dfkx = 2.0*( sjk)*trd2x * (vd / anorm4); - dfjx = -(dfix + dfkx); - - dfiy = 2.0*(-sij)*trd1y * (vd / anorm4); - dfky = 2.0*( sjk)*trd2y * (vd / anorm4); - dfjy = -(dfiy + dfky); - - dfiz = 2.0*(-sij)*trd1z * (vd / anorm4); - dfkz = 2.0*( sjk)*trd2z * (vd / anorm4); - dfjz = -(dfiz + dfkz); - } - - if (triplet_debug) /* Compare forces to numerical derivatives */ - force_debug_3v(xx,i,j,k, j,i,k, - dfix,dfiy,dfiz, - dfjx,dfjy,dfjz, - dfkx,dfky,dfkz); - - - if (three_body_forces) - accumulate_forces_3(w3); - } - - if (T23 != 0) { - //printf("T23 i,j,k = %d,%d,%d\n",i,j,k); - mcount++; - if (three_body_energies && evflag) { - tr2 = transtrace(T23->H1H2,T23->H1H2); - double dvir = (2.0*(dvir_jk + dvir_ki)*splinepot.vd + - splinepot.dvd)*tr2*w3/anorm4; - vir3v = vir3v + dvir; - xvir3v = xvir3v + dvir; - } - - { - const double vd = splinepot.vd; - - tr_trace3(&(T23->H1H2.m[1][0]), - &(T23->H1xH2.m[1][0]),&utr1x.d, - &(T23->H1yH2.m[1][0]),&utr1y.d, - &(T23->H1zH2.m[1][0]),&utr1z.d); - tr_trace3(&(T23->H1H2.m[1][0]), - &(T23->H1H2x.m[1][0]),&utr2x.d, - &(T23->H1H2y.m[1][0]),&utr2y.d, - &(T23->H1H2z.m[1][0]),&utr2z.d); - if (linalg.single) { - trd1x = utr1x.f; trd2x = utr2x.f; - trd1y = utr1y.f; trd2y = utr2y.f; - trd1z = utr1z.f; trd2z = utr2z.f; - } else { - trd1x = utr1x.d; trd2x = utr2x.d; - trd1y = utr1y.d; trd2y = utr2y.d; - trd1z = utr1z.d; trd2z = utr2z.d; - } - - dfix = 2.0*( ski)*trd1x * (vd / anorm4); - dfjx = 2.0*(-sjk)*trd2x * (vd / anorm4); - dfkx = -(dfix + dfjx); - - dfiy = 2.0*( ski)*trd1y * (vd / anorm4); - dfjy = 2.0*(-sjk)*trd2y * (vd / anorm4); - dfky = -(dfiy + dfjy); - - dfiz = 2.0*( ski)*trd1z * (vd / anorm4); - dfjz = 2.0*(-sjk)*trd2z * (vd / anorm4); - dfkz = -(dfiz + dfjz); - } - - if (triplet_debug) /* Compare forces to numerical derivatives */ - force_debug_3v(xx,i,j,k, k,i,j, - dfix,dfiy,dfiz, - dfjx,dfjy,dfjz, - dfkx,dfky,dfkz); - - if (three_body_forces) - accumulate_forces_3(w3); - - } - - if (T31 != 0) { - //printf("T31 i,j,k = %d,%d,%d\n",i,j,k); - mcount++; - if (three_body_energies && evflag) { - tr3 = transtrace(T31->H1H2,T31->H1H2); - double dvir = (2.0*(dvir_ki + dvir_ij)*splinepot.vd + - splinepot.dvd)*tr3*w3/anorm4; - vir3v = vir3v + dvir; - xvir3v = xvir3v + dvir; - } - - { - const double vd = splinepot.vd; - - tr_trace3(&(T31->H1H2.m[1][0]), - &(T31->H1xH2.m[1][0]),&utr1x.d, - &(T31->H1yH2.m[1][0]),&utr1y.d, - &(T31->H1zH2.m[1][0]),&utr1z.d); - tr_trace3(&(T31->H1H2.m[1][0]), - &(T31->H1H2x.m[1][0]),&utr2x.d, - &(T31->H1H2y.m[1][0]),&utr2y.d, - &(T31->H1H2z.m[1][0]),&utr2z.d); - if (linalg.single) { - trd1x = utr1x.f; trd2x = utr2x.f; - trd1y = utr1y.f; trd2y = utr2y.f; - trd1z = utr1z.f; trd2z = utr2z.f; - } else { - trd1x = utr1x.d; trd2x = utr2x.d; - trd1y = utr1y.d; trd2y = utr2y.d; - trd1z = utr1z.d; trd2z = utr2z.d; - } - - dfjx = 2.0*( sij)*trd1x * (vd / anorm4); - dfkx = 2.0*(-ski)*trd2x * (vd / anorm4); - dfix = -(dfjx + dfkx); - - dfjy = 2.0*( sij)*trd1y * (vd / anorm4); - dfky = 2.0*(-ski)*trd2y * (vd / anorm4); - dfiy = -(dfjy + dfky); - - dfjz = 2.0*( sij)*trd1z * (vd / anorm4); - dfkz = 2.0*(-ski)*trd2z * (vd / anorm4); - dfiz = -(dfjz + dfkz); - - } - - if (triplet_debug) /* Compare forces to numerical derivatives */ - force_debug_3v(xx,i,j,k, i,j,k, - dfix,dfiy,dfiz, - dfjx,dfjy,dfjz, - dfkx,dfky,dfkz); - - if (three_body_forces) - accumulate_forces_3(w3); - } - - v33 = tr0 / anorm3; - v43 = (tr1 + tr2 + tr3) / anorm4; - double de_triplet = (splinepot.vc*v33 + splinepot.vd*v43) * e_scale * w3; - e_triplet = e_triplet + de_triplet; - e_triplet_c = e_triplet_c + splinepot.vc*v33 * e_scale * w3; - c_t++; - - //printf("xxxx %6d %6d %6d :: %20.10e\n",1,2,3,de_triplet); - - if (evflag) { - double drji[3],drki[3]; - double fj[3] = {fjx,fjy,fjz},fk[3] = {fkx,fky,fkz}; - for (int p = 0; p<3; p++) { - drji[p] = xx[j][p] - xx[i][p]; - drki[p] = xx[k][p] - xx[i][p]; - /* To fix stress-per-atom scaling. */ - fj[p] *= e_scale; - fk[p] *= e_scale; - } - - ev_tally3(i,j,k,de_triplet,0.0,fj,fk,drji,drki); - - if (volpres_flag && vflag_atom) { - //virial[i] = virial[i] - (vir3v + vir3t) * rhoinv*e_scale; - double dvir = -(xvir3v + xvir3t) * rhoinv*e_scale * (1.0/3.0); - for (int pp = 0; pp<3; pp++) { - vatom[i][pp] += dvir; - vatom[j][pp] += dvir; - vatom[k][pp] += dvir; - } - } - - fix = fix+fsave[0][0]; fiy = fiy+fsave[0][1]; fiz = fiz+fsave[0][2]; - fjx = fjx+fsave[1][0]; fjy = fjy+fsave[1][1]; fjz = fjz+fsave[1][2]; - fkx = fkx+fsave[2][0]; fky = fky+fsave[2][1]; fkz = fkz+fsave[2][2]; - } - - tx1 = gettime(); - ttriplet += tx1 - tx0; - nttriplet++; - } else { - triplet_defer = 1; - } - - if (four_body_energies || four_body_forces) - if (j < i) { /* Search for quadruplet */ - tx0 = gettime(); - - mj = first[j]; - mk = first[k]; - /* - i is in both the j-list and the k-list, and i > k, - and lists are sorted, so the loop terminates. - */ - while (nlist_short[mj] < i && nlist_short[mk] < i) { - - if (mj >= first[j+1] || mk >= first[k+1]) { - printf("Illegal quad...\n" - " j=%d first[j]=%d first[j+1]=%d mj=%d\n" - " k=%d first[k]=%d first[k+1]=%d mk=%d\n", - j,first[j],first[j+1],mj, - k,first[k],first[k+1],mk); - error->one(__FILE__,__LINE__,"Shit, brkoen quad loop"); - } - - if (nlist_short[mj] == nlist_short[mk]) { - /* Closed quadruplet */ - m = nlist_short[mj]; - c_jm = c_km = 1; - - const int sim = (i < m) ? 1 : -1; - const int sjm = (j < m) ? 1 : -1; - const int skm = (k < m) ? 1 : -1; - - w4 = get_weight(triclinic,ss[i],ss[j],ss[k],ss[m]); - - if (w4 > 0.0) { - - /* Alrady know ij,jk,ki,jm,km bonds. Look for im bond. */ - mi = first[i]; - while (mi < first[i+1] && nlist_short[mi] < m) mi = mi + 1; - if (mi < first[i+1] && nlist_short[mi] == m) - c_im = 1; - else - c_im = 0; - - if (c_im == 0 || c_jk == 0 || (c_jk && c_im && m < k)) { - - if (triplet_defer) { - dvir_ij = dvir_jk = dvir_ki = 0.0; - if (c_ij && c_jk) - T12 = get_triplet(xx,j,i,k,&bond_hash,&T12work,&dvir_ij,&dvir_jk); - if (c_ki && c_jk) - T23 = get_triplet(xx,k,i,j,&bond_hash,&T23work,&dvir_ki,&dvir_jk); - if (c_ij && c_ki) - T31 = get_triplet(xx,i,j,k,&bond_hash,&T31work,&dvir_ij,&dvir_ki); - triplet_defer = 0; - } - - - fmx = fmy = fmz = 0.0; - double xvir4 = 0.0; - - if (evflag) { - fsave[0][0] = fix; fsave[0][1] = fiy; fsave[0][2] = fiz; - fsave[1][0] = fjx; fsave[1][1] = fjy; fsave[1][2] = fjz; - fsave[2][0] = fkx; fsave[2][1] = fky; fsave[2][2] = fkz; - fsave[3][0] = fmx; fsave[3][1] = fmy; fsave[3][2] = fmz; - fix = fiy = fiz = 0.0; - fjx = fjy = fjz = 0.0; - fkx = fky = fkz = 0.0; - fmx = fmy = fmz = 0.0; - } - - tr1 = tr2 = tr3 = 0.0; - - dvir_im = dvir_jm = dvir_km = 0.0; - T45 = T56 = T64 = 0; - if (T12 != 0 && c_km && c_im) - T45 = get_triplet(xx,m,i,k,&bond_hash,&T45work,&dvir_im,&dvir_km); - if (T23 != 0 && c_im && c_jm) - T56 = get_triplet(xx,m,i,j,&bond_hash,&T56work,&dvir_im,&dvir_jm); - if (T31 != 0 && c_jm && c_km) - T64 = get_triplet(xx,m,j,k,&bond_hash,&T64work,&dvir_jm,&dvir_km); - - if (T12 != 0 && T45 != 0) { - if (four_body_energies && evflag) { - tr1 = transtrace(T12->H1H2,T45->H1H2); - double dvir = ( (dvir_ij + dvir_jk + dvir_im + dvir_km)*splinepot.ve + - splinepot.dve )*tr1*w4/anorm4; - vir4 = vir4 + dvir; - xvir4 = xvir4 + dvir; - } - qcount++; - - { - const double ve = splinepot.ve; - - trd_update_4(T12,T45); - - dfix_update_4a(x); - dfix_update_4a(y); - dfix_update_4a(z); - } - - if (quad_debug) /* Compare forces to numerical derivatives */ - force_debug_4(xx,i,j,k,m, i,j,k,m, - dfix,dfiy,dfiz , dfjx,dfjy,dfjz, - dfkx,dfky,dfkz , dfmx,dfmy,dfmz); - - if (four_body_forces) - accumulate_forces_4(w4); - } - - if (T23 != 0 && T56 != 0) { - if (four_body_energies && evflag) { - tr2 = transtrace(T23->H1H2,T56->H1H2); - double dvir = ( (dvir_ki + dvir_jk + dvir_im + dvir_jm)*splinepot.ve + - splinepot.dve )*tr2*w4/anorm4; - vir4 = vir4 + dvir; - xvir4 = xvir4 + dvir; - } - qcount++; - - { - const double ve = splinepot.ve; - - trd_update_4(T23,T56); - - dfix_update_4b(x); - dfix_update_4b(y); - dfix_update_4b(z); - } - - if (quad_debug) /* Compare forces to numerical derivatives */ - force_debug_4(xx,i,j,k,m, i,m,j,k, - dfix,dfiy,dfiz , dfjx,dfjy,dfjz, - dfkx,dfky,dfkz , dfmx,dfmy,dfmz); - - if (four_body_forces) - accumulate_forces_4(w4); - - } - - if (T31 != 0 && T64 != 0) { - if (four_body_energies && evflag) { - tr3 = transtrace(T31->H1H2,T64->H1H2); - double dvir = ( (dvir_ki + dvir_ij + dvir_jm + dvir_km)*splinepot.ve + - splinepot.dve )*tr3*w4/anorm4; - vir4 = vir4 + dvir; - xvir4 = xvir4 + dvir; - } - qcount++; - - { - const double ve = splinepot.ve; - - /* X */ - trd_update_4(T31,T64); - - dfix_update_4c(x); - dfix_update_4c(y); - dfix_update_4c(z); - } - - if (quad_debug) /* Compare forces to numerical derivatives */ - force_debug_4(xx,i,j,k,m, i,j,m,k, - dfix,dfiy,dfiz , dfjx,dfjy,dfjz, - dfkx,dfky,dfkz , dfmx,dfmy,dfmz); - - if (four_body_forces) - accumulate_forces_4(w4); - } - - double de_quad = splinepot.ve*(tr1 + tr2 + tr3)/anorm4 * e_scale * w4; - e_quad = e_quad + de_quad; - if ((T12 && T45) || - (T23 && T56) || - (T31 && T64)) { - c_q++; - } - - if (evflag) { - double drim[3],drjm[3],drkm[3]; - double fi[3] = {fix,fiy,fiz}; - double fj[3] = {fjx,fjy,fjz}; - double fk[3] = {fkx,fky,fkz}; - for (int p = 0; p<3; p++) { - drim[p] = xx[i][p] - xx[m][p]; - drjm[p] = xx[j][p] - xx[m][p]; - drkm[p] = xx[k][p] - xx[m][p]; - fi[p] *= e_scale; - fj[p] *= e_scale; - fk[p] *= e_scale; - } - - ev_tally4(i,j,k,m,de_quad,fi,fj,fk,drim,drjm,drkm); - - if (volpres_flag && vflag_atom) { - //virial[i] = virial[i] - vir4 * rhoinv*e_scale; - double dvir = -xvir4 * rhoinv*e_scale * (1.0/4.0); - for (int pp = 0; pp<3; pp++) { - vatom[i][pp] += dvir; - vatom[j][pp] += dvir; - vatom[k][pp] += dvir; - vatom[m][pp] += dvir; - } - } - - fix = fix+fsave[0][0]; fiy = fiy+fsave[0][1]; fiz = fiz+fsave[0][2]; - fjx = fjx+fsave[1][0]; fjy = fjy+fsave[1][1]; fjz = fjz+fsave[1][2]; - fkx = fkx+fsave[2][0]; fky = fky+fsave[2][1]; fkz = fkz+fsave[2][2]; - fmx = fmx+fsave[3][0]; fmy = fmy+fsave[3][1]; fmz = fmz+fsave[3][2]; - } - - ff[m][0] += fmx * e_scale; - ff[m][1] += fmy * e_scale; - ff[m][2] += fmz * e_scale; - - } - } - mj = mj + 1; - mk = mk + 1; - } else if (nlist_short[mj] < nlist_short[mk]) { - mj = mj + 1; - } else { - mk = mk + 1; - } - - } - tx1 = gettime(); - tquad += tx1 - tx0; - ntquad++; - ntquaditer++; - } - - - ff[k][0] += fkx * e_scale; - ff[k][1] += fky * e_scale; - ff[k][2] += fkz * e_scale; - - } + fjx = fjy = fjz = 0.0; + + j = nlist_short[jx]; + + for (kx = first[i]; kx k and the list + is sorted, the loop below terminates:-) + */ + while (mj < first[j+1] && nlist_short[mj] < k) mj = mj + 1; + if (mj < first[j+1] && nlist_short[mj] == k) { + /* Closed triplet */ + c_jk = 1; + + if (j > i) continue; /* Require k 0.0) { + triplet_defer = 0; + + dvir_ij = dvir_jk = dvir_ki = 0.0; + if (c_ij && c_jk) + T12 = get_triplet(xx,j,i,k,&bond_hash,&T12work,&dvir_ij,&dvir_jk); + if (c_ki && c_jk) + T23 = get_triplet(xx,k,i,j,&bond_hash,&T23work,&dvir_ki,&dvir_jk); + if (c_ij && c_ki) + T31 = get_triplet(xx,i,j,k,&bond_hash,&T31work,&dvir_ij,&dvir_ki); + + if (evflag) { + fsave[0][0] = fix; fsave[0][1] = fiy; fsave[0][2] = fiz; + fsave[1][0] = fjx; fsave[1][1] = fjy; fsave[1][2] = fjz; + fsave[2][0] = fkx; fsave[2][1] = fky; fsave[2][2] = fkz; + fix = fiy = fiz = 0.0; + fjx = fjy = fjz = 0.0; + fkx = fky = fkz = 0.0; + } + + tr0 = tr1 = tr2 = tr3 = 0.0; + double xvir3t,xvir3v; + xvir3t = xvir3v = 0.0; + + if (T12 && T23) { + bond_data *bki = bond_hash.Lookup(Doublet(k,i)); + + if (three_body_energies && evflag) { + tr0 = transtrace(T12->H1H2,bki->H); + double dvir = ((dvir_ij + dvir_jk + bki->fl_deriv_sum)*splinepot.vc + + splinepot.dvc)*tr0*w3/anorm3; + vir3t = vir3t + dvir; + xvir3t = xvir3t + dvir; + } + mcount2++; + + { + const double vc = splinepot.vc; + tr_trace3(&(bki->H.m[1][0]), + &(T12->H1xH2.m[1][0]),&utr1x.d, + &(T12->H1yH2.m[1][0]),&utr1y.d, + &(T12->H1zH2.m[1][0]),&utr1z.d); + + tr_trace3(&(bki->H.m[1][0]), + &(T12->H1H2x.m[1][0]),&utr2x.d, + &(T12->H1H2y.m[1][0]),&utr2y.d, + &(T12->H1H2z.m[1][0]),&utr2z.d); + + tr_trace3(&(T12->H1H2.m[1][0]), + &(bki->Hx.m[1][0]),&utr3x.d, + &(bki->Hy.m[1][0]),&utr3y.d, + &(bki->Hz.m[1][0]),&utr3z.d); + + if (linalg.single) { + trd1x = utr1x.f; trd2x = utr2x.f; trd3x = utr3x.f; + trd1y = utr1y.f; trd2y = utr2y.f; trd3y = utr3y.f; + trd1z = utr1z.f; trd2z = utr2z.f; trd3z = utr3z.f; + } else { + trd1x = utr1x.d; trd2x = utr2x.d; trd3x = utr3x.d; + trd1y = utr1y.d; trd2y = utr2y.d; trd3y = utr3y.d; + trd1z = utr1z.d; trd2z = utr2z.d; trd3z = utr3z.d; + } + + dfix = ( (-sij)*trd1x + ( ski)*trd3x ) * (vc / anorm3); + dfjx = ( ( sij)*trd1x + (-sjk)*trd2x ) * (vc / anorm3); + dfkx = ( ( sjk)*trd2x + (-ski)*trd3x ) * (vc / anorm3); + + dfiy = ( (-sij)*trd1y + ( ski)*trd3y ) * (vc / anorm3); + dfjy = ( ( sij)*trd1y + (-sjk)*trd2y ) * (vc / anorm3); + dfky = ( ( sjk)*trd2y + (-ski)*trd3y ) * (vc / anorm3); + + dfiz = ( (-sij)*trd1z + ( ski)*trd3z ) * (vc / anorm3); + dfjz = ( ( sij)*trd1z + (-sjk)*trd2z ) * (vc / anorm3); + dfkz = ( ( sjk)*trd2z + (-ski)*trd3z ) * (vc / anorm3); + } + + if (triplet_debug) + force_debug_3t(xx,i,j,k, i,j,k, + dfix,dfiy,dfiz, + dfjx,dfjy,dfjz, + dfkx,dfky,dfkz); + + if (three_body_forces) + accumulate_forces_3(w3); + } + + if (T12 != 0) { + //printf("T12 i,j,k = %d,%d,%d\n",i,j,k); + mcount++; + if (three_body_energies && evflag) { + tr1 = transtrace(T12->H1H2,T12->H1H2); + double dvir = (2.0*(dvir_ij + dvir_jk)*splinepot.vd + + splinepot.dvd)*tr1*w3/anorm4; + vir3v = vir3v + dvir; + xvir3v = xvir3v + dvir; + } + + { + const double vd = splinepot.vd; + + tr_trace3(&(T12->H1H2.m[1][0]), + &(T12->H1xH2.m[1][0]),&utr1x.d, + &(T12->H1yH2.m[1][0]),&utr1y.d, + &(T12->H1zH2.m[1][0]),&utr1z.d); + tr_trace3(&(T12->H1H2.m[1][0]), + &(T12->H1H2x.m[1][0]),&utr2x.d, + &(T12->H1H2y.m[1][0]),&utr2y.d, + &(T12->H1H2z.m[1][0]),&utr2z.d); + if (linalg.single) { + trd1x = utr1x.f; trd2x = utr2x.f; + trd1y = utr1y.f; trd2y = utr2y.f; + trd1z = utr1z.f; trd2z = utr2z.f; + } else { + trd1x = utr1x.d; trd2x = utr2x.d; + trd1y = utr1y.d; trd2y = utr2y.d; + trd1z = utr1z.d; trd2z = utr2z.d; + } + + dfix = 2.0*(-sij)*trd1x * (vd / anorm4); + dfkx = 2.0*( sjk)*trd2x * (vd / anorm4); + dfjx = -(dfix + dfkx); + + dfiy = 2.0*(-sij)*trd1y * (vd / anorm4); + dfky = 2.0*( sjk)*trd2y * (vd / anorm4); + dfjy = -(dfiy + dfky); + + dfiz = 2.0*(-sij)*trd1z * (vd / anorm4); + dfkz = 2.0*( sjk)*trd2z * (vd / anorm4); + dfjz = -(dfiz + dfkz); + } + + if (triplet_debug) /* Compare forces to numerical derivatives */ + force_debug_3v(xx,i,j,k, j,i,k, + dfix,dfiy,dfiz, + dfjx,dfjy,dfjz, + dfkx,dfky,dfkz); + + + if (three_body_forces) + accumulate_forces_3(w3); + } + + if (T23 != 0) { + //printf("T23 i,j,k = %d,%d,%d\n",i,j,k); + mcount++; + if (three_body_energies && evflag) { + tr2 = transtrace(T23->H1H2,T23->H1H2); + double dvir = (2.0*(dvir_jk + dvir_ki)*splinepot.vd + + splinepot.dvd)*tr2*w3/anorm4; + vir3v = vir3v + dvir; + xvir3v = xvir3v + dvir; + } + + { + const double vd = splinepot.vd; + + tr_trace3(&(T23->H1H2.m[1][0]), + &(T23->H1xH2.m[1][0]),&utr1x.d, + &(T23->H1yH2.m[1][0]),&utr1y.d, + &(T23->H1zH2.m[1][0]),&utr1z.d); + tr_trace3(&(T23->H1H2.m[1][0]), + &(T23->H1H2x.m[1][0]),&utr2x.d, + &(T23->H1H2y.m[1][0]),&utr2y.d, + &(T23->H1H2z.m[1][0]),&utr2z.d); + if (linalg.single) { + trd1x = utr1x.f; trd2x = utr2x.f; + trd1y = utr1y.f; trd2y = utr2y.f; + trd1z = utr1z.f; trd2z = utr2z.f; + } else { + trd1x = utr1x.d; trd2x = utr2x.d; + trd1y = utr1y.d; trd2y = utr2y.d; + trd1z = utr1z.d; trd2z = utr2z.d; + } + + dfix = 2.0*( ski)*trd1x * (vd / anorm4); + dfjx = 2.0*(-sjk)*trd2x * (vd / anorm4); + dfkx = -(dfix + dfjx); + + dfiy = 2.0*( ski)*trd1y * (vd / anorm4); + dfjy = 2.0*(-sjk)*trd2y * (vd / anorm4); + dfky = -(dfiy + dfjy); + + dfiz = 2.0*( ski)*trd1z * (vd / anorm4); + dfjz = 2.0*(-sjk)*trd2z * (vd / anorm4); + dfkz = -(dfiz + dfjz); + } + + if (triplet_debug) /* Compare forces to numerical derivatives */ + force_debug_3v(xx,i,j,k, k,i,j, + dfix,dfiy,dfiz, + dfjx,dfjy,dfjz, + dfkx,dfky,dfkz); + + if (three_body_forces) + accumulate_forces_3(w3); + + } + + if (T31 != 0) { + //printf("T31 i,j,k = %d,%d,%d\n",i,j,k); + mcount++; + if (three_body_energies && evflag) { + tr3 = transtrace(T31->H1H2,T31->H1H2); + double dvir = (2.0*(dvir_ki + dvir_ij)*splinepot.vd + + splinepot.dvd)*tr3*w3/anorm4; + vir3v = vir3v + dvir; + xvir3v = xvir3v + dvir; + } + + { + const double vd = splinepot.vd; + + tr_trace3(&(T31->H1H2.m[1][0]), + &(T31->H1xH2.m[1][0]),&utr1x.d, + &(T31->H1yH2.m[1][0]),&utr1y.d, + &(T31->H1zH2.m[1][0]),&utr1z.d); + tr_trace3(&(T31->H1H2.m[1][0]), + &(T31->H1H2x.m[1][0]),&utr2x.d, + &(T31->H1H2y.m[1][0]),&utr2y.d, + &(T31->H1H2z.m[1][0]),&utr2z.d); + if (linalg.single) { + trd1x = utr1x.f; trd2x = utr2x.f; + trd1y = utr1y.f; trd2y = utr2y.f; + trd1z = utr1z.f; trd2z = utr2z.f; + } else { + trd1x = utr1x.d; trd2x = utr2x.d; + trd1y = utr1y.d; trd2y = utr2y.d; + trd1z = utr1z.d; trd2z = utr2z.d; + } + + dfjx = 2.0*( sij)*trd1x * (vd / anorm4); + dfkx = 2.0*(-ski)*trd2x * (vd / anorm4); + dfix = -(dfjx + dfkx); + + dfjy = 2.0*( sij)*trd1y * (vd / anorm4); + dfky = 2.0*(-ski)*trd2y * (vd / anorm4); + dfiy = -(dfjy + dfky); + + dfjz = 2.0*( sij)*trd1z * (vd / anorm4); + dfkz = 2.0*(-ski)*trd2z * (vd / anorm4); + dfiz = -(dfjz + dfkz); + + } + + if (triplet_debug) /* Compare forces to numerical derivatives */ + force_debug_3v(xx,i,j,k, i,j,k, + dfix,dfiy,dfiz, + dfjx,dfjy,dfjz, + dfkx,dfky,dfkz); + + if (three_body_forces) + accumulate_forces_3(w3); + } + + v33 = tr0 / anorm3; + v43 = (tr1 + tr2 + tr3) / anorm4; + double de_triplet = (splinepot.vc*v33 + splinepot.vd*v43) * e_scale * w3; + e_triplet = e_triplet + de_triplet; + e_triplet_c = e_triplet_c + splinepot.vc*v33 * e_scale * w3; + c_t++; + + //printf("xxxx %6d %6d %6d :: %20.10e\n",1,2,3,de_triplet); + + if (evflag) { + double drji[3],drki[3]; + double fj[3] = {fjx,fjy,fjz},fk[3] = {fkx,fky,fkz}; + for (int p = 0; p<3; p++) { + drji[p] = xx[j][p] - xx[i][p]; + drki[p] = xx[k][p] - xx[i][p]; + /* To fix stress-per-atom scaling. */ + fj[p] *= e_scale; + fk[p] *= e_scale; + } + + ev_tally3(i,j,k,de_triplet,0.0,fj,fk,drji,drki); + + if (volpres_flag && vflag_atom) { + //virial[i] = virial[i] - (vir3v + vir3t) * rhoinv*e_scale; + double dvir = -(xvir3v + xvir3t) * rhoinv*e_scale * (1.0/3.0); + for (int pp = 0; pp<3; pp++) { + vatom[i][pp] += dvir; + vatom[j][pp] += dvir; + vatom[k][pp] += dvir; + } + } + + fix = fix+fsave[0][0]; fiy = fiy+fsave[0][1]; fiz = fiz+fsave[0][2]; + fjx = fjx+fsave[1][0]; fjy = fjy+fsave[1][1]; fjz = fjz+fsave[1][2]; + fkx = fkx+fsave[2][0]; fky = fky+fsave[2][1]; fkz = fkz+fsave[2][2]; + } + + tx1 = gettime(); + ttriplet += tx1 - tx0; + nttriplet++; + } else { + triplet_defer = 1; + } + + if (four_body_energies || four_body_forces) + if (j < i) { /* Search for quadruplet */ + tx0 = gettime(); + + mj = first[j]; + mk = first[k]; + /* + i is in both the j-list and the k-list, and i > k, + and lists are sorted, so the loop terminates. + */ + while (nlist_short[mj] < i && nlist_short[mk] < i) { + + if (mj >= first[j+1] || mk >= first[k+1]) { + printf("Illegal quad...\n" + " j=%d first[j]=%d first[j+1]=%d mj=%d\n" + " k=%d first[k]=%d first[k+1]=%d mk=%d\n", + j,first[j],first[j+1],mj, + k,first[k],first[k+1],mk); + error->one(__FILE__,__LINE__,"Shit, brkoen quad loop"); + } + + if (nlist_short[mj] == nlist_short[mk]) { + /* Closed quadruplet */ + m = nlist_short[mj]; + c_jm = c_km = 1; + + const int sim = (i < m) ? 1 : -1; + const int sjm = (j < m) ? 1 : -1; + const int skm = (k < m) ? 1 : -1; + + w4 = get_weight(triclinic,ss[i],ss[j],ss[k],ss[m]); + + if (w4 > 0.0) { + + /* Alrady know ij,jk,ki,jm,km bonds. Look for im bond. */ + mi = first[i]; + while (mi < first[i+1] && nlist_short[mi] < m) mi = mi + 1; + if (mi < first[i+1] && nlist_short[mi] == m) + c_im = 1; + else + c_im = 0; + + if (c_im == 0 || c_jk == 0 || (c_jk && c_im && m < k)) { + + if (triplet_defer) { + dvir_ij = dvir_jk = dvir_ki = 0.0; + if (c_ij && c_jk) + T12 = get_triplet(xx,j,i,k,&bond_hash,&T12work,&dvir_ij,&dvir_jk); + if (c_ki && c_jk) + T23 = get_triplet(xx,k,i,j,&bond_hash,&T23work,&dvir_ki,&dvir_jk); + if (c_ij && c_ki) + T31 = get_triplet(xx,i,j,k,&bond_hash,&T31work,&dvir_ij,&dvir_ki); + triplet_defer = 0; + } + + + fmx = fmy = fmz = 0.0; + double xvir4 = 0.0; + + if (evflag) { + fsave[0][0] = fix; fsave[0][1] = fiy; fsave[0][2] = fiz; + fsave[1][0] = fjx; fsave[1][1] = fjy; fsave[1][2] = fjz; + fsave[2][0] = fkx; fsave[2][1] = fky; fsave[2][2] = fkz; + fsave[3][0] = fmx; fsave[3][1] = fmy; fsave[3][2] = fmz; + fix = fiy = fiz = 0.0; + fjx = fjy = fjz = 0.0; + fkx = fky = fkz = 0.0; + fmx = fmy = fmz = 0.0; + } + + tr1 = tr2 = tr3 = 0.0; + + dvir_im = dvir_jm = dvir_km = 0.0; + T45 = T56 = T64 = 0; + if (T12 != 0 && c_km && c_im) + T45 = get_triplet(xx,m,i,k,&bond_hash,&T45work,&dvir_im,&dvir_km); + if (T23 != 0 && c_im && c_jm) + T56 = get_triplet(xx,m,i,j,&bond_hash,&T56work,&dvir_im,&dvir_jm); + if (T31 != 0 && c_jm && c_km) + T64 = get_triplet(xx,m,j,k,&bond_hash,&T64work,&dvir_jm,&dvir_km); + + if (T12 != 0 && T45 != 0) { + if (four_body_energies && evflag) { + tr1 = transtrace(T12->H1H2,T45->H1H2); + double dvir = ( (dvir_ij + dvir_jk + dvir_im + dvir_km)*splinepot.ve + + splinepot.dve )*tr1*w4/anorm4; + vir4 = vir4 + dvir; + xvir4 = xvir4 + dvir; + } + qcount++; + + { + const double ve = splinepot.ve; + + trd_update_4(T12,T45); + + dfix_update_4a(x); + dfix_update_4a(y); + dfix_update_4a(z); + } + + if (quad_debug) /* Compare forces to numerical derivatives */ + force_debug_4(xx,i,j,k,m, i,j,k,m, + dfix,dfiy,dfiz , dfjx,dfjy,dfjz, + dfkx,dfky,dfkz , dfmx,dfmy,dfmz); + + if (four_body_forces) + accumulate_forces_4(w4); + } + + if (T23 != 0 && T56 != 0) { + if (four_body_energies && evflag) { + tr2 = transtrace(T23->H1H2,T56->H1H2); + double dvir = ( (dvir_ki + dvir_jk + dvir_im + dvir_jm)*splinepot.ve + + splinepot.dve )*tr2*w4/anorm4; + vir4 = vir4 + dvir; + xvir4 = xvir4 + dvir; + } + qcount++; + + { + const double ve = splinepot.ve; + + trd_update_4(T23,T56); + + dfix_update_4b(x); + dfix_update_4b(y); + dfix_update_4b(z); + } + + if (quad_debug) /* Compare forces to numerical derivatives */ + force_debug_4(xx,i,j,k,m, i,m,j,k, + dfix,dfiy,dfiz , dfjx,dfjy,dfjz, + dfkx,dfky,dfkz , dfmx,dfmy,dfmz); + + if (four_body_forces) + accumulate_forces_4(w4); + + } + + if (T31 != 0 && T64 != 0) { + if (four_body_energies && evflag) { + tr3 = transtrace(T31->H1H2,T64->H1H2); + double dvir = ( (dvir_ki + dvir_ij + dvir_jm + dvir_km)*splinepot.ve + + splinepot.dve )*tr3*w4/anorm4; + vir4 = vir4 + dvir; + xvir4 = xvir4 + dvir; + } + qcount++; + + { + const double ve = splinepot.ve; + + /* X */ + trd_update_4(T31,T64); + + dfix_update_4c(x); + dfix_update_4c(y); + dfix_update_4c(z); + } + + if (quad_debug) /* Compare forces to numerical derivatives */ + force_debug_4(xx,i,j,k,m, i,j,m,k, + dfix,dfiy,dfiz , dfjx,dfjy,dfjz, + dfkx,dfky,dfkz , dfmx,dfmy,dfmz); + + if (four_body_forces) + accumulate_forces_4(w4); + } + + double de_quad = splinepot.ve*(tr1 + tr2 + tr3)/anorm4 * e_scale * w4; + e_quad = e_quad + de_quad; + if ((T12 && T45) || + (T23 && T56) || + (T31 && T64)) { + c_q++; + } + + if (evflag) { + double drim[3],drjm[3],drkm[3]; + double fi[3] = {fix,fiy,fiz}; + double fj[3] = {fjx,fjy,fjz}; + double fk[3] = {fkx,fky,fkz}; + for (int p = 0; p<3; p++) { + drim[p] = xx[i][p] - xx[m][p]; + drjm[p] = xx[j][p] - xx[m][p]; + drkm[p] = xx[k][p] - xx[m][p]; + fi[p] *= e_scale; + fj[p] *= e_scale; + fk[p] *= e_scale; + } + + ev_tally4(i,j,k,m,de_quad,fi,fj,fk,drim,drjm,drkm); + + if (volpres_flag && vflag_atom) { + //virial[i] = virial[i] - vir4 * rhoinv*e_scale; + double dvir = -xvir4 * rhoinv*e_scale * (1.0/4.0); + for (int pp = 0; pp<3; pp++) { + vatom[i][pp] += dvir; + vatom[j][pp] += dvir; + vatom[k][pp] += dvir; + vatom[m][pp] += dvir; + } + } + + fix = fix+fsave[0][0]; fiy = fiy+fsave[0][1]; fiz = fiz+fsave[0][2]; + fjx = fjx+fsave[1][0]; fjy = fjy+fsave[1][1]; fjz = fjz+fsave[1][2]; + fkx = fkx+fsave[2][0]; fky = fky+fsave[2][1]; fkz = fkz+fsave[2][2]; + fmx = fmx+fsave[3][0]; fmy = fmy+fsave[3][1]; fmz = fmz+fsave[3][2]; + } + + ff[m][0] += fmx * e_scale; + ff[m][1] += fmy * e_scale; + ff[m][2] += fmz * e_scale; + + } + } + mj = mj + 1; + mk = mk + 1; + } else if (nlist_short[mj] < nlist_short[mk]) { + mj = mj + 1; + } else { + mk = mk + 1; + } + + } + tx1 = gettime(); + tquad += tx1 - tx0; + ntquad++; + ntquaditer++; + } + + + ff[k][0] += fkx * e_scale; + ff[k][1] += fky * e_scale; + ff[k][2] += fkz * e_scale; + + } #undef transtrace - ff[j][0] += fjx * e_scale; - ff[j][1] += fjy * e_scale; - ff[j][2] += fjz * e_scale; + ff[j][0] += fjx * e_scale; + ff[j][1] += fjy * e_scale; + ff[j][2] += fjz * e_scale; } @@ -1507,13 +1507,13 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, if (single_energies == 1 && i < nloc) { const double evol0 = splinepot.evol0; if (eflag_global) { - e_single = e_single + evol0 * e_scale; - eng_vdwl = eng_vdwl + evol0 * e_scale; + e_single = e_single + evol0 * e_scale; + eng_vdwl = eng_vdwl + evol0 * e_scale; } if (eflag_atom) eatom[i] = eatom[i] + evol0 * e_scale; if (volpres_flag && vflag_atom) { - for (int pp = 0; pp<3; pp++) - vatom[i][pp] = vatom[i][pp] - rhoinv*splinepot.devol0*e_scale; + for (int pp = 0; pp<3; pp++) + vatom[i][pp] = vatom[i][pp] - rhoinv*splinepot.devol0*e_scale; } } @@ -1566,34 +1566,34 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, printf("mgpt engy = %10.3fms\n",(t1-t0)*1e3); printf(" mem = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - tmem*1e3,ntmem,memadj*1e3,memadj/ntmem*1e9); + tmem*1e3,ntmem,memadj*1e3,memadj/ntmem*1e9); printf(" sort = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - tsort*1e3,ntsort,sortadj*1e3,sortadj/ntsort*1e9); + tsort*1e3,ntsort,sortadj*1e3,sortadj/ntsort*1e9); printf(" pair = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - tpair*1e3,ntpair,pairadj*1e3,pairadj/ntpair*1e9); + tpair*1e3,ntpair,pairadj*1e3,pairadj/ntpair*1e9); printf(" lookup = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - tlookup*1e3,ntlookup,lookupadj*1e3,lookupadj/ntlookup*1e9); + tlookup*1e3,ntlookup,lookupadj*1e3,lookupadj/ntlookup*1e9); printf(" triplet = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - ttriplet*1e3,nttriplet,tripletadj*1e3,tripletadj/nttriplet*1e9); + ttriplet*1e3,nttriplet,tripletadj*1e3,tripletadj/nttriplet*1e9); printf(" quad = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - tquad*1e3,ntquaditer,quadadj*1e3,quadadj/ntquaditer*1e9); + tquad*1e3,ntquaditer,quadadj*1e3,quadadj/ntquaditer*1e9); printf(" sum = %10.3fms adj = %10.3fms\n", - tsum*1e3,(tsum - adj*nsum)*1e3); + tsum*1e3,(tsum - adj*nsum)*1e3); printf("\n make_b = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - t_make_b*1e3,n_make,make_b_adj*1e3,make_b_adj/n_make*1e9); + t_make_b*1e3,n_make,make_b_adj*1e3,make_b_adj/n_make*1e9); printf(" make_b2 = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n", - t_make_b2*1e3,n_make_b2,make_b2_adj*1e3,make_b2_adj/n_make_b2*1e9); + t_make_b2*1e3,n_make_b2,make_b2_adj*1e3,make_b2_adj/n_make_b2*1e9); printf(" make_t = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n\n", - t_make_t*1e3,n_make,make_t_adj*1e3,make_t_adj/n_make*1e9); + t_make_t*1e3,n_make,make_t_adj*1e3,make_t_adj/n_make*1e9); printf(" trace = %10.3fms n = %8.0f adj = %10.3fms one = %10.3fns\n\n", - t_trace*1e3,n_trace,trace_adj*1e3,trace_adj/n_trace*1e9); + t_trace*1e3,n_trace,trace_adj*1e3,trace_adj/n_trace*1e9); printf("mcount (transpose + trace for triplet) = %.0f , %.0f qcount = %.0f lmax = %d\n", - mcount,mcount2,qcount,lmax); + mcount,mcount2,qcount,lmax); printf("nbc=%.0f tbl=%.3fms tbm=%.3fms one tbl=%.3fns one tbm=%.3fns\n", - nbc,(tbl-adj*nbc)*1e3,(tbm-adj*nbc)*1e3,(tbl/nbc-adj)*1e9, - (tbm/nbc-adj)*1e9); + nbc,(tbl-adj*nbc)*1e3,(tbm-adj*nbc)*1e3,(tbl/nbc-adj)*1e9, + (tbm/nbc-adj)*1e9); printf("\n\nForces:\n"); printf("fix = %.3f fiy=%.3f fiz=%.3f\n",fix,fiy,fiz); printf("fjx = %.3f fjy=%.3f fjz=%.3f\n",fjx,fjy,fjz); @@ -1601,24 +1601,24 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, printf("\n"); printf("Bonds : nsearch=%d maxlen=%d avg.len=%.3f\n", - bond_hash.NSearch(),bond_hash.MaxLength(), - bond_hash.NStep()/(double) bond_hash.NSearch()); + bond_hash.NSearch(),bond_hash.MaxLength(), + bond_hash.NStep()/(double) bond_hash.NSearch()); printf("compute_x: c_p = %d c_t = %d c_q = %d\n",c_p,c_t,c_q); printf("@@ Total number of trace3 calls is %d, total number of make_triplet is %.1f\n", - ntr_calls,n_make); + ntr_calls,n_make); { Hash::Iterator iter = bond_hash.begin(); int nitem = 0,nhit = 0; while (iter != bond_hash.end()) { - nitem++; - nhit += iter.link()->hits; - iter.next(); + nitem++; + nhit += iter.link()->hits; + iter.next(); } printf("bond_hash hits: nitems=%d nhits=%d hits/item = %.3f\n", - nitem,nhit,nhit/(double) nitem); + nitem,nhit,nhit/(double) nitem); } } #endif @@ -1641,24 +1641,24 @@ void PairMGPT::compute_x(const int *nnei,const int * const *nlist, if (single_energies) // Virial correction for self energy for (i = 0; i<3; i++) { - //virial[i] = virial[i] + nloc*pot_input_vol*pvol0*e_scale; - virial[i] = virial[i] - nloc*rhoinv*splinepot.devol0*e_scale; + //virial[i] = virial[i] + nloc*pot_input_vol*pvol0*e_scale; + virial[i] = virial[i] - nloc*rhoinv*splinepot.devol0*e_scale; } if (pair_energies) // Virial correction for pair energy for (i = 0; i<3; i++) - virial[i] = virial[i] + rhoinv*e_scale*volvir2; + virial[i] = virial[i] + rhoinv*e_scale*volvir2; if (three_body_energies) // Virial correction for three body enegries for (i = 0; i<3; i++) { - //virial[i] = virial[i] - pot_input_vol*(e_triplet_c*pc + (e_triplet-e_triplet_c)*pd); - virial[i] = virial[i] - (vir3v + vir3t) * rhoinv*e_scale; + //virial[i] = virial[i] - pot_input_vol*(e_triplet_c*pc + (e_triplet-e_triplet_c)*pd); + virial[i] = virial[i] - (vir3v + vir3t) * rhoinv*e_scale; } if (four_body_energies) // Virial correction for four body enegries for (i = 0; i<3; i++) { - //virial[i] = virial[i] - pot_input_vol*e_quad*pe; - virial[i] = virial[i] - vir4 * rhoinv*e_scale; + //virial[i] = virial[i] - pot_input_vol*e_quad*pe; + virial[i] = virial[i] - vir4 * rhoinv*e_scale; } } @@ -1711,10 +1711,10 @@ void PairMGPT::compute(int eflag, int vflag) ffloc2[3*ii+2] = 0.0; int i = listfull->ilist[ii]; for (int jj = 0; jjinum+listfull->gnum; jj++) { - int j = listfull->ilist[jj]; - if (atom->tag[i] == atom->tag[j]) - for (int p = 0; p<3; p++) - ffloc2[3*ii+p] += atom->f[j][p]; + int j = listfull->ilist[jj]; + if (atom->tag[i] == atom->tag[j]) + for (int p = 0; p<3; p++) + ffloc2[3*ii+p] += atom->f[j][p]; } } @@ -1726,38 +1726,38 @@ void PairMGPT::compute(int eflag, int vflag) atom->f = ffptr; for (int p = 0; p<3; p++) { - double xsave = atom->x[i][p]; - const double delta = 1e-3; + double xsave = atom->x[i][p]; + const double delta = 1e-3; - atom->x[i][p] = xsave + delta; - for (int jj = 0; jj<3*nmax; jj++) ffwork[jj] = 0.0; - compute_x(listfull->numneigh, - listfull->firstneigh, - &e_s,&e_p,&e_t,&e_q,evflag,newton_pair); - double e1 = e_s + e_p + e_t + e_q; + atom->x[i][p] = xsave + delta; + for (int jj = 0; jj<3*nmax; jj++) ffwork[jj] = 0.0; + compute_x(listfull->numneigh, + listfull->firstneigh, + &e_s,&e_p,&e_t,&e_q,evflag,newton_pair); + double e1 = e_s + e_p + e_t + e_q; - atom->x[i][p] = xsave - delta; - for (int jj = 0; jj<3*nmax; jj++) ffwork[jj] = 0.0; - compute_x(listfull->numneigh, - listfull->firstneigh, - &e_s,&e_p,&e_t,&e_q,evflag,newton_pair); - double e2 = e_s + e_p + e_t + e_q; + atom->x[i][p] = xsave - delta; + for (int jj = 0; jj<3*nmax; jj++) ffwork[jj] = 0.0; + compute_x(listfull->numneigh, + listfull->firstneigh, + &e_s,&e_p,&e_t,&e_q,evflag,newton_pair); + double e2 = e_s + e_p + e_t + e_q; - ffloc[3*ii+p] = -(e1-e2)/(2*delta); + ffloc[3*ii+p] = -(e1-e2)/(2*delta); - atom->x[i][p] = xsave; + atom->x[i][p] = xsave; } atom->f = atom_f_save; printf("Force on i=%4d:\n",i); printf(" Position %20.10e %20.10e %20.10e\n", - atom->x[i][0],atom->x[i][1],atom->x[i][2]); + atom->x[i][0],atom->x[i][1],atom->x[i][2]); printf(" Exact %20.10e %20.10e %20.10e\n", - atom->f[i][0],atom->f[i][1],atom->f[i][2]); + atom->f[i][0],atom->f[i][1],atom->f[i][2]); printf(" Numerical %20.10e %20.10e %20.10e\n", - ffloc[3*ii+0],ffloc[3*ii+1],ffloc[3*ii+2]); + ffloc[3*ii+0],ffloc[3*ii+1],ffloc[3*ii+2]); printf(" Boundary %20.10e %20.10e %20.10e\n", - ffloc2[3*ii+0],ffloc2[3*ii+1],ffloc2[3*ii+2]); + ffloc2[3*ii+0],ffloc2[3*ii+1],ffloc2[3*ii+2]); } @@ -1787,16 +1787,16 @@ void PairMGPT::compute(int eflag, int vflag) void PairMGPT::allocate() { - allocated = 1; - int n = atom->ntypes; + allocated = 1; + int n = atom->ntypes; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 0; i <= n; i++) - for (int j = 0; j <= n; j++) - setflag[i][j] = 0; + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 0; i <= n; i++) + for (int j = 0; j <= n; j++) + setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cutghost,n+1,n+1,"pair:cutsq"); + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutghost,n+1,n+1,"pair:cutsq"); } /* ---------------------------------------------------------------------- @@ -1817,7 +1817,7 @@ void PairMGPT::coeff(int narg, char **arg) if (narg < 5) error->all(__FILE__,__LINE__, - "Not enough arguments for mgpt (MGPT) pair coefficients."); + "Not enough arguments for mgpt (MGPT) pair coefficients."); if (!allocated) allocate(); @@ -1840,62 +1840,62 @@ void PairMGPT::coeff(int narg, char **arg) if (strcmp(arg[iarg],"volpress") == 0) { /* Volumetric pressure flag */ if (iarg+2 > narg) error->all(FLERR,"Incorrect args for pair coefficients"); - if (strcmp(arg[iarg+1],"yes") == 0) volpres_flag = 1; - else if (strcmp(arg[iarg+1],"no") == 0) volpres_flag = 0; - else { - char line[1024]; - sprintf(line,"(In %s:%d) Invalid value for volumetric pressure argument.\n" - "It should be \"volpress yes\" or \"volpress no\".\n" - "The value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); - error->all(__FILE__,__LINE__,line); - } - volpres_tag = 1; + if (strcmp(arg[iarg+1],"yes") == 0) volpres_flag = 1; + else if (strcmp(arg[iarg+1],"no") == 0) volpres_flag = 0; + else { + char line[1024]; + sprintf(line,"(In %s:%d) Invalid value for volumetric pressure argument.\n" + "It should be \"volpress yes\" or \"volpress no\".\n" + "The value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); + error->all(__FILE__,__LINE__,line); + } + volpres_tag = 1; iarg += 2; - if (comm->me == 0) printf("* volpress: volpres_flag = %d [%s %s]\n",volpres_flag,arg[iarg-2],arg[iarg-1]); + if (comm->me == 0) printf("* volpress: volpres_flag = %d [%s %s]\n",volpres_flag,arg[iarg-2],arg[iarg-1]); } else if (strcmp(arg[iarg],"nbody") == 0) { if (iarg+2 > narg) error->all(FLERR,"Incorrect args for pair coefficients"); - if (strspn(arg[iarg+1],"1234") == strlen(arg[iarg+1])) { - nbody_flag = 0; - for (int i = 0; i<4; i++) - if (strchr(arg[iarg+1],'1'+i) != nullptr) { - nbody_flag = nbody_flag + (1<me == 0) printf("Explicitly adding %d-tuple forces.\n",i+1); - } - } else { - char line[1024]; - sprintf(line,"(In %s:%d) Invalid value for nbody flag.\n" - "It should be e.g. \"nbody=1234\" (for single, pair, triple, and quad forces/energiers)\n" - "For e.g. only pair and triple forces/energies, use \"nbody=23\".\n" - "The default is \"nbody=1234\".\n" - "The current value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); - error->all(__FILE__,__LINE__,line); - } - nbody_tag = 1; + if (strspn(arg[iarg+1],"1234") == strlen(arg[iarg+1])) { + nbody_flag = 0; + for (int i = 0; i<4; i++) + if (strchr(arg[iarg+1],'1'+i) != nullptr) { + nbody_flag = nbody_flag + (1<me == 0) printf("Explicitly adding %d-tuple forces.\n",i+1); + } + } else { + char line[1024]; + sprintf(line,"(In %s:%d) Invalid value for nbody flag.\n" + "It should be e.g. \"nbody=1234\" (for single, pair, triple, and quad forces/energiers)\n" + "For e.g. only pair and triple forces/energies, use \"nbody=23\".\n" + "The default is \"nbody=1234\".\n" + "The current value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); + error->all(__FILE__,__LINE__,line); + } + nbody_tag = 1; iarg += 2; } else if (strcmp(arg[iarg],"precision") == 0) { if (iarg+2 > narg) error->all(FLERR,"Incorrect args for pair coefficients"); - if (strcmp(arg[iarg+1],"single") == 0) single_precision = 1; - else if (strcmp(arg[iarg+1],"double") == 0) single_precision = 0; - else { - char line[1024]; - sprintf(line,"(In %s:%d) Invalid value for precision argument.\n" - "It should be \"precision single\" or \"precision double\".\n" - "The value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); - error->all(__FILE__,__LINE__,line); - } - precision_tag = 1; + if (strcmp(arg[iarg+1],"single") == 0) single_precision = 1; + else if (strcmp(arg[iarg+1],"double") == 0) single_precision = 0; + else { + char line[1024]; + sprintf(line,"(In %s:%d) Invalid value for precision argument.\n" + "It should be \"precision single\" or \"precision double\".\n" + "The value is \"%s\".\n",__FILE__,__LINE__,arg[iarg+1]); + error->all(__FILE__,__LINE__,line); + } + precision_tag = 1; iarg += 2; - if (comm->me == 0) printf("* precision: single_flag = %d [%s %s]\n",single_precision,arg[iarg-2],arg[iarg-1]); + if (comm->me == 0) printf("* precision: single_flag = %d [%s %s]\n",single_precision,arg[iarg-2],arg[iarg-1]); } else { - char line[1024]; - sprintf(line,"(In %s:%d) Invalid argument. Allowed arguments are:\n" - " volpress {yes|no} , default = yes\n" - " precision {single|double} , default = double\n" - " nbody {[1234,]*} , default = whichever terms potential require\n" - "The invalid argument is \"%s\".\n",__FILE__,__LINE__,arg[iarg]); - error->all(__FILE__,__LINE__,line); + char line[1024]; + sprintf(line,"(In %s:%d) Invalid argument. Allowed arguments are:\n" + " volpress {yes|no} , default = yes\n" + " precision {single|double} , default = double\n" + " nbody {[1234,]*} , default = whichever terms potential require\n" + "The invalid argument is \"%s\".\n",__FILE__,__LINE__,arg[iarg]); + error->all(__FILE__,__LINE__,line); } } @@ -1917,19 +1917,19 @@ void PairMGPT::coeff(int narg, char **arg) printf("evol0 = %.10e\n",splinepot.evol0); /* Set up default and requested nbody forces to include */ { - int nbody_default = (1<<0) + (1<<1) + (1<<2) + (1<<3); + int nbody_default = (1<<0) + (1<<1) + (1<<2) + (1<<3); - if (splinepot.vd == 0.0 && splinepot.dvd == 0.0) - nbody_default -= (1<<2); // No 3-body contributions - if (splinepot.ve == 0.0 && splinepot.dve == 0.0) - nbody_default -= (1<<3); // No 4-body contributions + if (splinepot.vd == 0.0 && splinepot.dvd == 0.0) + nbody_default -= (1<<2); // No 3-body contributions + if (splinepot.ve == 0.0 && splinepot.dve == 0.0) + nbody_default -= (1<<3); // No 4-body contributions - if (nbody_tag == 0) nbody_flag = nbody_default; + if (nbody_tag == 0) nbody_flag = nbody_default; - if (nbody_flag != nbody_default) { - printf("Warning: nbody=%d (suggested=%d) set to disregard multibody-forces in potential.\n", - nbody_flag,nbody_default); - } + if (nbody_flag != nbody_default) { + printf("Warning: nbody=%d (suggested=%d) set to disregard multibody-forces in potential.\n", + nbody_flag,nbody_default); + } } } } @@ -1994,19 +1994,19 @@ void PairMGPT::coeff(int narg, char **arg) ------------------------------------------------------------------------- */ void PairMGPT::init_style() { - if (force->newton_pair == 0) - error->all(__FILE__,__LINE__,"Pair style mgpt requires newton pair on."); + if (force->newton_pair == 0) + error->all(__FILE__,__LINE__,"Pair style mgpt requires newton pair on."); - // Need full neighbor list. - int irequest_full = neighbor->request(this); - neighbor->requests[irequest_full]->id = 1; - neighbor->requests[irequest_full]->half = 0; - neighbor->requests[irequest_full]->full = 1; - neighbor->requests[irequest_full]->ghost = 1; + // Need full neighbor list. + int irequest_full = neighbor->request(this); + neighbor->requests[irequest_full]->id = 1; + neighbor->requests[irequest_full]->half = 0; + neighbor->requests[irequest_full]->full = 1; + neighbor->requests[irequest_full]->ghost = 1; - // Also need half neighbor list. - int irequest_half = neighbor->request(this); - neighbor->requests[irequest_half]->id = 2; + // Also need half neighbor list. + int irequest_half = neighbor->request(this); + neighbor->requests[irequest_half]->id = 2; } /* ---------------------------------------------------------------------- @@ -2015,8 +2015,8 @@ void PairMGPT::init_style() ------------------------------------------------------------------------- */ void PairMGPT::init_list(int id, NeighList *ptr) { - if (id == 1) listfull = ptr; - else if (id == 2) listhalf = ptr; + if (id == 1) listfull = ptr; + else if (id == 2) listhalf = ptr; } /* ---------------------------------------------------------------------- @@ -2024,7 +2024,7 @@ void PairMGPT::init_list(int id, NeighList *ptr) ------------------------------------------------------------------------- */ double PairMGPT::init_one(int /*i*/, int /*j*/) { - return cutoff; + return cutoff; } /************************************************************************ @@ -2035,8 +2035,8 @@ double PairMGPT::init_one(int /*i*/, int /*j*/) derivatives with respect to x,y, and z. */ void PairMGPT::fl_deriv_new(double r,double ri,double xhat,double yhat,double zhat, - double &fl_0,double &fl_x,double &fl_y,double &fl_z, - double &fl_rp,double &fl_p1,double &fl_r0,double &fl_al) { + double &fl_0,double &fl_x,double &fl_y,double &fl_z, + double &fl_rp,double &fl_p1,double &fl_r0,double &fl_al) { const double rp = splinepot.rp,p1 = splinepot.p1,r0 = splinepot.r00,al = splinepot.al; const int mode = splinepot.mode; const double pn = splinepot.pn; @@ -2176,9 +2176,9 @@ void PairMGPT::fl_deriv_new(double r,double ri,double xhat,double yhat,double zh with respect to the coordinates */ void PairMGPT::hamltn_5_raw(const double xin,const double yin,const double zin, - double M [8][8],double Mx[8][8], - double My[8][8],double Mz[8][8], - double *fl_deriv_sum_p) { + double M [8][8],double Mx[8][8], + double My[8][8],double Mz[8][8], + double *fl_deriv_sum_p) { const double r = sqrt(xin*xin + yin*yin + zin*zin),ri = 1.0/r; const double x = xin*ri,y = yin*ri,z = zin*ri; @@ -2351,9 +2351,9 @@ void PairMGPT::hamltn_5_raw(const double xin,const double yin,const double zin, void PairMGPT::hamltn_7_raw(const double xin,const double yin,const double zin, - double M [8][8],double Mx[8][8], - double My[8][8],double Mz[8][8], - double *fl_deriv_sum_p) { + double M [8][8],double Mx[8][8], + double My[8][8],double Mz[8][8], + double *fl_deriv_sum_p) { const double r = sqrt(xin*xin + yin*yin + zin*zin),ri = 1.0/r; const double x = xin*ri,y = yin*ri,z = zin*ri; From 0c4752b858631a590e724b136310fb869bb4fcba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 20:43:08 -0400 Subject: [PATCH 057/437] add support to check for tabs as whitespace errors including option to fix --- tools/coding_standard/whitespace.py | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py index 80b7328ed3..bad1ebd295 100644 --- a/tools/coding_standard/whitespace.py +++ b/tools/coding_standard/whitespace.py @@ -18,7 +18,13 @@ include: - doc/src/** - python - src/** + - lib/** - tools/coding_standard +exclude: + - lib/colvars/Install.py + - lib/gpu/geryon/file_to_cstr.sh + - lib/kokkos + - src/Make.sh patterns: - "*.c" - "*.cmake" @@ -47,10 +53,22 @@ def check_trailing_whitespace(f): return errors, last_line +def check_tabs(f): + pattern = re.compile(r'[^\n]*\t+[^n]*\n$') + lineno = 1 + errors = set() + + for line in f: + if pattern.match(line): + errors.add(lineno) + lineno += 1 + return errors + def check_file(path): encoding = 'UTF-8' last_line = "\n" whitespace_errors = set() + tab_errors = set() try: with open(path, 'r') as f: whitespace_errors, last_line = check_trailing_whitespace(f) @@ -62,7 +80,19 @@ def check_file(path): except Exception: encoding = 'unknown' + try: + with open(path, 'r') as f: + tab_errors = check_tabs(f) + except UnicodeDecodeError: + encoding = 'ISO-8859-1' + try: + with open(path, 'r', encoding=encoding) as f: + tab_errors = check_tabs(f) + except Exception: + encoding = 'unknown' + return { + 'tab_errors': tab_errors, 'whitespace_errors': whitespace_errors, 'encoding': encoding, 'eof_error': not last_line.endswith('\n') @@ -70,9 +100,15 @@ def check_file(path): def fix_file(path, check_result): newfile = path + ".modified" + tab_pat = re.compile(r'^([^\t]*)(\t+)(.*)$') with open(newfile, 'w', encoding='UTF-8') as out: with open(path, 'r', encoding=check_result['encoding']) as src: for line in src: + match = tab_pat.match(line) + if match: + # compute number of blanks assuming 8 character tab setting + num = 8*len(match.group(2))-len(match.group(1))%8 + line = match.group(1) + " "*num + match.group(3) print(line.rstrip(), file=out) shutil.copymode(path, newfile) shutil.move(newfile, path) @@ -85,6 +121,8 @@ def check_folder(directory, config, fix=False, verbose=False): for pattern in config['patterns']: path = os.path.join(directory, base_path, pattern) files += glob.glob(path, recursive=config['recursive']) + for exclude in config['exclude']: + files = [f for f in files if not f.startswith(os.path.join(directory,exclude))] for f in files: path = os.path.normpath(f) @@ -100,6 +138,10 @@ def check_folder(directory, config, fix=False, verbose=False): print("[Error] Trailing whitespace @ {}:{}".format(path, lineno)) has_resolvable_errors = True + for lineno in result['tab_errors']: + print("[Error] Tab @ {}:{}".format(path, lineno)) + has_resolvable_errors = True + if result['eof_error']: print("[Error] Missing newline at end of file @ {}".format(path)) has_resolvable_errors = True From 30821b37e55276bdb16f4b423c513a8366ebae3c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 20:43:27 -0400 Subject: [PATCH 058/437] replace tabs --- cmake/Modules/FindFFTW3.cmake | 2 +- cmake/Modules/FindFFTW3F.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/FindFFTW3.cmake b/cmake/Modules/FindFFTW3.cmake index 708ec49509..6a34c21e10 100644 --- a/cmake/Modules/FindFFTW3.cmake +++ b/cmake/Modules/FindFFTW3.cmake @@ -38,7 +38,7 @@ if(FFTW3_FOUND) add_library(FFTW3::FFTW3_OMP UNKNOWN IMPORTED) set_target_properties(FFTW3::FFTW3_OMP PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${FFTW3_OMP_LIBRARY}" + IMPORTED_LOCATION "${FFTW3_OMP_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}") endif() endif() diff --git a/cmake/Modules/FindFFTW3F.cmake b/cmake/Modules/FindFFTW3F.cmake index 3dbcdaa04e..86355e04cd 100644 --- a/cmake/Modules/FindFFTW3F.cmake +++ b/cmake/Modules/FindFFTW3F.cmake @@ -37,7 +37,7 @@ if(FFTW3F_FOUND) add_library(FFTW3F::FFTW3F_OMP UNKNOWN IMPORTED) set_target_properties(FFTW3F::FFTW3F_OMP PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" - IMPORTED_LOCATION "${FFTW3F_OMP_LIBRARY}" + IMPORTED_LOCATION "${FFTW3F_OMP_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${FFTW3F_INCLUDE_DIRS}") endif() endif() From 92b5b159e5ff1399d00619de0334284bce5bef72 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 22 Aug 2021 20:45:24 -0400 Subject: [PATCH 059/437] replace tabs and remove trailing whitespace in lib folder with updated script --- lib/README | 2 +- lib/atc/ATC_Coupling.cpp | 316 ++++----- lib/atc/ATC_Coupling.h | 62 +- lib/atc/ATC_CouplingEnergy.cpp | 54 +- lib/atc/ATC_CouplingEnergy.h | 8 +- lib/atc/ATC_CouplingMass.cpp | 46 +- lib/atc/ATC_CouplingMass.h | 12 +- lib/atc/ATC_CouplingMomentum.cpp | 44 +- lib/atc/ATC_CouplingMomentum.h | 8 +- lib/atc/ATC_CouplingMomentumEnergy.cpp | 66 +- lib/atc/ATC_CouplingMomentumEnergy.h | 6 +- lib/atc/ATC_Method.cpp | 432 ++++++------ lib/atc/ATC_Method.h | 88 +-- lib/atc/ATC_Transfer.cpp | 326 ++++----- lib/atc/ATC_Transfer.h | 54 +- lib/atc/ATC_TransferKernel.cpp | 76 +- lib/atc/ATC_TransferKernel.h | 6 +- lib/atc/ATC_TransferPartitionOfUnity.cpp | 48 +- lib/atc/ATC_TransferPartitionOfUnity.h | 6 +- lib/atc/ATC_TypeDefs.h | 60 +- lib/atc/Array.h | 24 +- lib/atc/Array2D.h | 20 +- lib/atc/AtomToMoleculeTransfer.cpp | 30 +- lib/atc/AtomToMoleculeTransfer.h | 82 +-- lib/atc/AtomicRegulator.cpp | 64 +- lib/atc/AtomicRegulator.h | 104 +-- lib/atc/BodyForce.cpp | 4 +- lib/atc/BodyForce.h | 12 +- lib/atc/CBLattice.cpp | 16 +- lib/atc/CBLattice.h | 20 +- lib/atc/CG.h | 26 +- lib/atc/CauchyBorn.cpp | 86 +-- lib/atc/CauchyBorn.h | 16 +- lib/atc/CbEam.h | 54 +- lib/atc/CbLjCut.h | 8 +- lib/atc/CbLjSmoothLinear.h | 18 +- lib/atc/CbPotential.cpp | 10 +- lib/atc/CbPotential.h | 4 +- lib/atc/ChargeRegulator.cpp | 138 ++-- lib/atc/ChargeRegulator.h | 88 +-- lib/atc/CloneVector.h | 24 +- lib/atc/ConcentrationRegulator.cpp | 100 +-- lib/atc/ConcentrationRegulator.h | 38 +- lib/atc/DenseMatrix.h | 96 +-- lib/atc/DenseVector.h | 10 +- lib/atc/DependencyManager.h | 40 +- lib/atc/DiagonalMatrix.h | 82 +-- lib/atc/ElasticTimeIntegrator.cpp | 52 +- lib/atc/ElasticTimeIntegrator.h | 102 +-- lib/atc/ElectronChargeDensity.cpp | 18 +- lib/atc/ElectronChargeDensity.h | 66 +- lib/atc/ElectronDragPower.cpp | 6 +- lib/atc/ElectronDragPower.h | 10 +- lib/atc/ElectronFlux.cpp | 10 +- lib/atc/ElectronFlux.h | 44 +- lib/atc/ElectronHeatCapacity.cpp | 8 +- lib/atc/ElectronHeatCapacity.h | 42 +- lib/atc/ElectronHeatFlux.cpp | 8 +- lib/atc/ElectronHeatFlux.h | 38 +- lib/atc/ElectronPhononExchange.cpp | 8 +- lib/atc/ElectronPhononExchange.h | 24 +- lib/atc/ExtrinsicModel.cpp | 32 +- lib/atc/ExtrinsicModel.h | 16 +- lib/atc/ExtrinsicModelDriftDiffusion.cpp | 102 +-- lib/atc/ExtrinsicModelDriftDiffusion.h | 12 +- lib/atc/ExtrinsicModelElectrostatic.cpp | 136 ++-- lib/atc/ExtrinsicModelElectrostatic.h | 20 +- lib/atc/ExtrinsicModelTwoTemperature.cpp | 20 +- lib/atc/ExtrinsicModelTwoTemperature.h | 4 +- lib/atc/FE_Element.cpp | 260 +++---- lib/atc/FE_Element.h | 100 +-- lib/atc/FE_Engine.cpp | 634 ++++++++--------- lib/atc/FE_Engine.h | 150 ++-- lib/atc/FE_Interpolate.cpp | 146 ++-- lib/atc/FE_Interpolate.h | 22 +- lib/atc/FE_Mesh.cpp | 502 +++++++------- lib/atc/FE_Mesh.h | 150 ++-- lib/atc/FE_Quadrature.h | 582 ++++++++-------- lib/atc/FieldEulerIntegrator.cpp | 44 +- lib/atc/FieldEulerIntegrator.h | 2 +- lib/atc/FieldManager.cpp | 82 +-- lib/atc/FieldManager.h | 22 +- lib/atc/Function.cpp | 56 +- lib/atc/Function.h | 84 +-- lib/atc/FundamentalAtomicQuantity.cpp | 10 +- lib/atc/FundamentalAtomicQuantity.h | 4 +- lib/atc/GMRES.h | 34 +- lib/atc/GhostManager.cpp | 54 +- lib/atc/GhostManager.h | 16 +- lib/atc/ImplicitSolveOperator.cpp | 12 +- lib/atc/ImplicitSolveOperator.h | 2 +- lib/atc/InterscaleOperators.cpp | 8 +- lib/atc/InterscaleOperators.h | 18 +- lib/atc/KD_Tree.cpp | 20 +- lib/atc/KD_Tree.h | 16 +- lib/atc/KernelFunction.cpp | 138 ++-- lib/atc/KernelFunction.h | 74 +- lib/atc/KinetoThermostat.cpp | 32 +- lib/atc/KinetoThermostat.h | 142 ++-- lib/atc/Kinetostat.cpp | 156 ++--- lib/atc/Kinetostat.h | 184 ++--- lib/atc/LammpsInterface.cpp | 228 +++--- lib/atc/LammpsInterface.h | 62 +- lib/atc/LinearSolver.cpp | 52 +- lib/atc/LinearSolver.h | 40 +- lib/atc/MPI_Wrappers.cpp | 28 +- lib/atc/Material.cpp | 94 +-- lib/atc/Material.h | 58 +- lib/atc/Matrix.cpp | 74 +- lib/atc/Matrix.h | 198 +++--- lib/atc/MatrixDef.h | 18 +- lib/atc/MatrixLibrary.h | 6 +- lib/atc/MeshReader.cpp | 40 +- lib/atc/MoleculeSet.cpp | 18 +- lib/atc/MoleculeSet.h | 2 +- lib/atc/NonLinearSolver.cpp | 16 +- lib/atc/NonLinearSolver.h | 10 +- lib/atc/OutputManager.cpp | 218 +++--- lib/atc/OutputManager.h | 28 +- lib/atc/ParDenseMatrix.h | 2 +- lib/atc/ParDiagonalMatrix.cpp | 12 +- lib/atc/ParDiagonalMatrix.h | 2 +- lib/atc/ParSparseMatrix.cpp | 4 +- lib/atc/ParSparseMatrix.h | 10 +- lib/atc/PerAtomQuantity-inl.h | 68 +- lib/atc/PerAtomQuantity.h | 84 +-- lib/atc/PerAtomQuantityLibrary.cpp | 140 ++-- lib/atc/PerAtomQuantityLibrary.h | 232 +++---- lib/atc/PerPairQuantity.cpp | 96 +-- lib/atc/PerPairQuantity.h | 90 +-- lib/atc/PhysicsModel.cpp | 30 +- lib/atc/PhysicsModel.h | 72 +- lib/atc/PoissonSolver.cpp | 42 +- lib/atc/PoissonSolver.h | 12 +- lib/atc/PolynomialSolver.cpp | 10 +- lib/atc/PrescribedDataManager.cpp | 170 ++--- lib/atc/PrescribedDataManager.h | 142 ++-- lib/atc/Quadrature.cpp | 4 +- lib/atc/Quadrature.h | 6 +- lib/atc/SchrodingerSolver.cpp | 174 ++--- lib/atc/SchrodingerSolver.h | 20 +- lib/atc/ShapeFunction.h | 42 +- lib/atc/SparseMatrix-inl.h | 208 +++--- lib/atc/SparseMatrix.h | 28 +- lib/atc/SparseVector-inl.h | 24 +- lib/atc/SparseVector.h | 18 +- lib/atc/SpeciesTimeIntegrator.cpp | 30 +- lib/atc/SpeciesTimeIntegrator.h | 66 +- lib/atc/Stress.cpp | 112 +-- lib/atc/Stress.h | 42 +- lib/atc/ThermalTimeIntegrator.cpp | 36 +- lib/atc/ThermalTimeIntegrator.h | 66 +- lib/atc/Thermostat.cpp | 172 ++--- lib/atc/Thermostat.h | 184 ++--- lib/atc/TimeFilter.cpp | 68 +- lib/atc/TimeFilter.h | 238 +++---- lib/atc/TimeIntegrator.cpp | 16 +- lib/atc/TimeIntegrator.h | 48 +- lib/atc/TransferLibrary.cpp | 84 +-- lib/atc/TransferLibrary.h | 234 +++---- lib/atc/TransferOperator.cpp | 20 +- lib/atc/TransferOperator.h | 200 +++--- lib/atc/Utility.h | 50 +- lib/atc/Vector.cpp | 6 +- lib/atc/Vector.h | 36 +- lib/atc/ViscousStress.cpp | 6 +- lib/atc/ViscousStress.h | 10 +- lib/atc/VoigtOperations.h | 70 +- lib/atc/WeakEquation.h | 20 +- lib/atc/WeakEquationChargeDiffusion.cpp | 2 +- lib/atc/WeakEquationChargeDiffusion.h | 12 +- lib/atc/WeakEquationDiffusion.cpp | 4 +- lib/atc/WeakEquationDiffusion.h | 10 +- lib/atc/WeakEquationElectronContinuity.cpp | 4 +- lib/atc/WeakEquationElectronContinuity.h | 26 +- lib/atc/WeakEquationElectronMomentum.cpp | 16 +- lib/atc/WeakEquationElectronMomentum.h | 24 +- lib/atc/WeakEquationElectronTemperature.cpp | 26 +- lib/atc/WeakEquationElectronTemperature.h | 44 +- lib/atc/WeakEquationMassDiffusion.cpp | 2 +- lib/atc/WeakEquationMassDiffusion.h | 8 +- lib/atc/WeakEquationMomentum.cpp | 14 +- lib/atc/WeakEquationMomentum.h | 14 +- lib/atc/WeakEquationPhononTemperature.cpp | 6 +- lib/atc/WeakEquationPhononTemperature.h | 18 +- lib/atc/WeakEquationPoisson.cpp | 6 +- lib/atc/WeakEquationPoisson.h | 14 +- lib/atc/WeakEquationSchrodinger.h | 10 +- lib/awpmd/README | 2 +- lib/awpmd/ivutils/include/lapack_inter.h | 16 +- lib/awpmd/ivutils/include/logexc.h | 58 +- lib/awpmd/ivutils/include/wavepacket.h | 12 +- lib/awpmd/systems/interact/TCP/tcpdefs.h | 2 +- lib/awpmd/systems/interact/TCP/wpmd.cpp | 90 +-- lib/awpmd/systems/interact/TCP/wpmd_split.h | 54 +- lib/colvars/colvarproxy.cpp | 8 +- lib/gpu/cudpp_mini/cudpp.cpp | 174 ++--- lib/gpu/cudpp_mini/cudpp.h | 284 ++++---- lib/gpu/cudpp_mini/cudpp_globals.h | 10 +- lib/gpu/cudpp_mini/cudpp_maximal_launch.cpp | 14 +- lib/gpu/cudpp_mini/cudpp_maximal_launch.h | 14 +- lib/gpu/cudpp_mini/cudpp_plan.cpp | 176 ++--- lib/gpu/cudpp_mini/cudpp_plan.h | 2 +- lib/gpu/cudpp_mini/cudpp_plan_manager.cpp | 46 +- lib/gpu/cudpp_mini/cudpp_plan_manager.h | 18 +- lib/gpu/cudpp_mini/cudpp_radixsort.h | 8 +- lib/gpu/cudpp_mini/cudpp_scan.h | 12 +- lib/gpu/cudpp_mini/cudpp_util.h | 82 +-- lib/gpu/cudpp_mini/sharedmem.h | 56 +- lib/gpu/geryon/README | 10 +- lib/gpu/geryon/file_to_cstr.sh | 10 +- lib/gpu/geryon/hip_device.h | 4 +- lib/gpu/geryon/hip_kernel.h | 4 +- lib/gpu/geryon/hip_texture.h | 10 +- lib/gpu/geryon/nvd_device.h | 2 +- lib/gpu/geryon/nvd_texture.h | 4 +- lib/gpu/geryon/ocl_device.h | 86 +-- lib/gpu/geryon/ocl_kernel.h | 66 +- lib/gpu/geryon/ucl_get_devices.cpp | 2 +- lib/gpu/geryon/ucl_vector.h | 2 +- lib/gpu/lal_lj_smooth.cpp | 4 +- lib/gpu/lal_lj_smooth.h | 4 +- lib/h5md/README | 2 +- lib/latte/README | 2 +- lib/mdi/.gitignore | 2 +- lib/mesont/README | 66 +- lib/message/Install.py | 2 +- lib/message/cslib/src/cslib.cpp | 158 ++--- lib/message/cslib/src/cslib.h | 2 +- lib/message/cslib/src/cslib.py | 66 +- lib/message/cslib/src/cslib_wrap.cpp | 18 +- lib/message/cslib/src/cslib_wrap.h | 4 +- lib/message/cslib/src/msg_file.cpp | 16 +- lib/message/cslib/src/msg_mpi_one.cpp | 2 +- lib/message/cslib/src/msg_mpi_two.cpp | 12 +- lib/message/cslib/src/msg_zmq.cpp | 2 +- lib/molfile/README | 2 +- lib/pace/Install.py | 8 +- lib/poems/README | 6 +- lib/poems/bodies.h | 4 +- lib/poems/body.cpp | 6 +- lib/poems/body.h | 16 +- lib/poems/body23joint.cpp | 220 +++--- lib/poems/colmatmap.cpp | 186 ++--- lib/poems/colmatmap.h | 4 +- lib/poems/colmatrix.cpp | 208 +++--- lib/poems/eulerparameters.cpp | 64 +- lib/poems/eulerparameters.h | 6 +- lib/poems/fastmatrixops.cpp | 142 ++-- lib/poems/fastmatrixops.h | 4 +- lib/poems/fixedpoint.cpp | 6 +- lib/poems/fixedpoint.h | 6 +- lib/poems/freebodyjoint.cpp | 126 ++-- lib/poems/freebodyjoint.h | 8 +- lib/poems/inertialframe.cpp | 4 +- lib/poems/inertialframe.h | 4 +- lib/poems/joint.cpp | 50 +- lib/poems/joints.h | 4 +- lib/poems/mat3x3.cpp | 6 +- lib/poems/mat3x3.h | 12 +- lib/poems/mat4x4.cpp | 6 +- lib/poems/mat4x4.h | 8 +- lib/poems/mat6x6.cpp | 4 +- lib/poems/mat6x6.h | 4 +- lib/poems/matrices.h | 4 +- lib/poems/matrix.cpp | 4 +- lib/poems/matrix.h | 6 +- lib/poems/matrixfun.cpp | 438 ++++++------ lib/poems/mixedjoint.cpp | 198 +++--- lib/poems/norm.cpp | 54 +- lib/poems/norm.h | 4 +- lib/poems/onbody.cpp | 352 +++++----- lib/poems/onfunctions.cpp | 32 +- lib/poems/onfunctions.h | 4 +- lib/poems/onsolver.cpp | 112 +-- lib/poems/particle.cpp | 4 +- lib/poems/particle.h | 6 +- lib/poems/poemsobject.cpp | 6 +- lib/poems/poemsobject.h | 8 +- lib/poems/poemstreenode.cpp | 14 +- lib/poems/point.cpp | 4 +- lib/poems/point.h | 14 +- lib/poems/prismaticjoint.cpp | 10 +- lib/poems/prismaticjoint.h | 4 +- lib/poems/revolutejoint.cpp | 6 +- lib/poems/revolutejoint.h | 6 +- lib/poems/rigidbody.cpp | 4 +- lib/poems/rigidbody.h | 6 +- lib/poems/rowmatrix.cpp | 4 +- lib/poems/rowmatrix.h | 4 +- lib/poems/solver.cpp | 16 +- lib/poems/solver.h | 16 +- lib/poems/sphericaljoint.cpp | 202 +++--- lib/poems/sphericaljoint.h | 4 +- lib/poems/system.cpp | 610 ++++++++--------- lib/poems/vect3.cpp | 12 +- lib/poems/vect3.h | 6 +- lib/poems/vect4.cpp | 4 +- lib/poems/vect4.h | 6 +- lib/poems/vect6.cpp | 14 +- lib/poems/vect6.h | 4 +- lib/poems/virtualcolmatrix.cpp | 14 +- lib/poems/virtualmatrix.cpp | 62 +- lib/poems/virtualrowmatrix.cpp | 12 +- lib/poems/virtualrowmatrix.h | 8 +- lib/poems/workspace.cpp | 724 ++++++++++---------- lib/qmmm/README | 16 +- lib/qmmm/libqmmm.c | 6 +- lib/qmmm/libqmmm.h | 2 +- lib/qmmm/pwqmmm.c | 6 +- lib/scafacos/README | 2 +- 311 files changed, 9176 insertions(+), 9176 deletions(-) diff --git a/lib/README b/lib/README index 75fca5c185..dc25053cec 100644 --- a/lib/README +++ b/lib/README @@ -3,7 +3,7 @@ LAMMPS, if particular packages are included in the LAMMPS build. Most of these directories contain code for the library; some contain a Makefile.lammps file that points to where the library is installed -elsewhere on your system. +elsewhere on your system. In either case, the library itself must be installed and/or built first, so that the appropriate library files exist for LAMMPS to link diff --git a/lib/atc/ATC_Coupling.cpp b/lib/atc/ATC_Coupling.cpp index 552bb9bb37..381e9fee90 100644 --- a/lib/atc/ATC_Coupling.cpp +++ b/lib/atc/ATC_Coupling.cpp @@ -53,7 +53,7 @@ namespace ATC { sourceIntegration_(FULL_DOMAIN) { // size the field mask - fieldMask_.reset(NUM_FIELDS,NUM_FLUX); + fieldMask_.reset(NUM_FIELDS,NUM_FLUX); fieldMask_ = false; // default: no consistent mass matrices useConsistentMassMatrix_.reset(NUM_FIELDS); @@ -67,8 +67,8 @@ namespace ATC { //-------------------------------------------------- ATC_Coupling::~ATC_Coupling() { - interscaleManager_.clear(); - if (feEngine_) { delete feEngine_; feEngine_ = nullptr; } + interscaleManager_.clear(); + if (feEngine_) { delete feEngine_; feEngine_ = nullptr; } if (physicsModel_) delete physicsModel_; if (atomicRegulator_) delete atomicRegulator_; if (prescribedDataMgr_) delete prescribedDataMgr_; @@ -78,7 +78,7 @@ namespace ATC { } //-------------------------------------------------- // Interactions with LAMMPS fix commands - // parse input command and pass on to finite element engine + // parse input command and pass on to finite element engine // or physics specific transfers if necessary // revert to physics-specific transfer if no command matches input // first keyword is unique to particular class @@ -91,8 +91,8 @@ namespace ATC { int thisIndex; int argIdx=0; - bool match = false; - + bool match = false; + // gateways to other modules e.g. extrinsic, control, mesh // pass off to extrinsic if (strcmp(arg[argIdx],"extrinsic")==0) { @@ -106,7 +106,7 @@ namespace ATC { } // parsing handled here else { - /*! \page man_initial fix_modify AtC initial + /*! \page man_initial fix_modify AtC initial \section syntax fix_modify AtC initial - = field name valid for type of physics, temperature | electron_temperature @@ -119,7 +119,7 @@ namespace ATC { Sets the initial values for the specified field at the specified nodes. \section restrictions keyword 'all' reserved in nodeset name - \section default + \section default none */ // set initial conditions @@ -140,7 +140,7 @@ namespace ATC { match = true; } - /*! \page man_fix_nodes fix_modify AtC fix + /*! \page man_fix_nodes fix_modify AtC fix \section syntax fix_modify AtC fix - = field name valid for type of physics @@ -154,9 +154,9 @@ namespace ATC { Creates a constraint on the values of the specified field at specified nodes. \section restrictions keyword 'all' reserved in nodeset name - \section related + \section related see \ref man_unfix_nodes - \section default + \section default none */ // fix and unfix nodes @@ -165,11 +165,11 @@ namespace ATC { parse_field(arg,argIdx,thisField,thisIndex); string nsetName(arg[argIdx++]); XT_Function * f = nullptr; - // fix current value + // fix current value if (narg == argIdx) { set nodeSet = (feEngine_->fe_mesh())->nodeset(nsetName); set::const_iterator iset; - const DENS_MAT & field =(fields_.find(thisField)->second).quantity(); + const DENS_MAT & field =(fields_.find(thisField)->second).quantity(); for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) { int inode = *iset; double v = field(inode,thisIndex); @@ -184,12 +184,12 @@ namespace ATC { if (is_numeric(a)) { // constant f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx])); prescribedDataMgr_->fix_field(nsetName,thisField,thisIndex,f); - } + } else { ATC::LammpsInterface::instance()->print_msg("reading "+field_to_string(thisField)+" on nodeset "+nsetName+" from file "+a); string s = ATC::LammpsInterface::instance()->read_file(a); - stringstream ss; ss << s; - double v; + stringstream ss; ss << s; + double v; set nodeSet = (feEngine_->fe_mesh())->nodeset(nsetName); set::const_iterator iset; for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) { @@ -211,20 +211,20 @@ namespace ATC { match = true; } - /*! \page man_unfix_nodes fix_modify AtC unfix + /*! \page man_unfix_nodes fix_modify AtC unfix \section syntax - fix_modify AtC unfix + fix_modify AtC unfix - = field name valid for type of physics - - = name of set of nodes + - = name of set of nodes \section examples fix_modify AtC unfix temperature groupNAME \section description Removes constraint on field values for specified nodes. \section restrictions keyword 'all' reserved in nodeset name - \section related + \section related see \ref man_fix_nodes - \section default + \section default none */ else if (strcmp(arg[argIdx],"unfix")==0) { @@ -239,15 +239,15 @@ namespace ATC { \section syntax fix_modify AtC source - = field name valid for type of physics - - = name of set of elements + - = name of set of elements \section examples fix_modify atc source temperature middle temporal_ramp 10. 0. \section description - Add domain sources to the mesh. The units are consistent with LAMMPS's + Add domain sources to the mesh. The units are consistent with LAMMPS's units for mass, length and time and are defined by the PDE being solved, e.g. for thermal transfer the balance equation is for energy and source is energy per time. - \section restrictions + \section restrictions keyword 'all' reserved in element_set name \section related see \ref man_remove_source @@ -265,14 +265,14 @@ namespace ATC { if (is_numeric(a)) { // constant f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx])); prescribedDataMgr_->fix_source(esetName,thisField,thisIndex,f); - } + } else { ATC::LammpsInterface::instance()->print_msg("reading "+field_to_string(thisField)+" source on node set "+esetName+" from file "+a); string s = ATC::LammpsInterface::instance()->read_file(arg[argIdx]); - stringstream ss; ss << s; - double v; + stringstream ss; ss << s; + double v; set nset = (feEngine_->fe_mesh())->nodeset(esetName); - set< pair < int, double > > src; + set< pair < int, double > > src; set::const_iterator iset; double sum = 0.; for (iset = nset.begin(); iset != nset.end(); iset++) { @@ -301,7 +301,7 @@ namespace ATC { \section syntax fix_modify AtC remove_source - = field name valid for type of physics - - = name of set of elements + - = name of set of elements \section examples fix_modify atc remove_source temperature groupNAME \section description @@ -344,7 +344,7 @@ namespace ATC { match = true; } - + /*! \page man_fix_flux fix_modify AtC fix_flux \section syntax fix_modify AtC fix_flux @@ -352,12 +352,12 @@ namespace ATC { - = name of set of element faces \section examples fix_modify atc fix_flux temperature faceSet 10.0 \n - + \section description - Command for fixing normal fluxes e.g. heat_flux. + Command for fixing normal fluxes e.g. heat_flux. This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux. The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales. - \section restrictions + \section restrictions Only normal fluxes (Neumann data) can be prescribed. \section related see \ref man_unfix_flux @@ -388,10 +388,10 @@ namespace ATC { - = name of set of element faces \section examples fix_modify atc unfix_flux temperature faceSet \n - + \section description - Command for removing prescribed normal fluxes e.g. heat_flux, stress. - \section restrictions + Command for removing prescribed normal fluxes e.g. heat_flux, stress. + \section restrictions \section related see \ref man_unfix_flux \section default @@ -405,15 +405,15 @@ namespace ATC { match = true; } - - /*! \page man_fe_md_boundary fix_modify AtC fe_md_boundary + + /*! \page man_fe_md_boundary fix_modify AtC fe_md_boundary \section syntax fix_modify AtC fe_md_boundary [args] \section examples fix_modify atc fe_md_boundary interpolate \n \section description Specifies different methods for computing fluxes between between the MD and FE integration regions. Faceset defines a faceset separating the MD and FE regions and uses finite element face quadrature to compute the flux. Interpolate uses a reconstruction scheme to approximate the flux, which is more robust but less accurate if the MD/FE boundary does correspond to a faceset. No boundary results in no fluxes between the systems being computed. - \section restrictions + \section restrictions If faceset is used, all the AtC non-boundary atoms must lie within and completely fill the domain enclosed by the faceset. \section related see \man_boundary_faceset for how to specify the faceset name. @@ -427,13 +427,13 @@ namespace ATC { bndyIntType_ = FE_QUADRATURE; string name(arg[argIdx++]); bndyFaceSet_ = & ( (feEngine_->fe_mesh())->faceset(name)); - } + } else if (strcmp(arg[argIdx],"interpolate")==0) { argIdx++; bndyIntType_ = FE_INTERPOLATION; } - else if (strcmp(arg[argIdx],"no_boundary")==0) { - bndyIntType_ = NO_QUADRATURE; + else if (strcmp(arg[argIdx],"no_boundary")==0) { + bndyIntType_ = NO_QUADRATURE; } else { throw ATC_Error("Bad boundary integration type"); @@ -442,7 +442,7 @@ namespace ATC { - /*! \page man_boundary_faceset fix_modify AtC boundary_faceset + /*! \page man_boundary_faceset fix_modify AtC boundary_faceset \section syntax fix_modify AtC boundary_faceset [args] \section examples @@ -472,7 +472,7 @@ namespace ATC { } } - /*! \page man_internal_quadrature fix_modify AtC internal_quadrature + /*! \page man_internal_quadrature fix_modify AtC internal_quadrature \section syntax fix_modify atc internal_quadrature [region] \section examples @@ -487,8 +487,8 @@ namespace ATC { as being within the MD region. This option is only valid with internal_quadrature off. \section restrictions - \section related - \section default + \section related + \section default on */ else if (strcmp(arg[argIdx],"internal_quadrature")==0) { @@ -509,7 +509,7 @@ namespace ATC { match = true; } else { - for (regionID_ = 0; regionID_ < lammpsInterface_->nregion(); regionID_++) + for (regionID_ = 0; regionID_ < lammpsInterface_->nregion(); regionID_++) if (strcmp(arg[argIdx],lammpsInterface_->region_name(regionID_)) == 0) break; if (regionID_ < lammpsInterface_->nregion()) { atomQuadForInternal_ = false; @@ -551,7 +551,7 @@ namespace ATC { match = true; } - + else if (strcmp(arg[argIdx],"fix_open")==0) { argIdx++; parse_field(arg,argIdx,thisField); @@ -655,19 +655,19 @@ namespace ATC { /*! \page man_equilibrium_start fix_modify AtC equilibrium_start \section syntax fix_modify AtC equilibrium_start - + \section examples fix_modify atc equilibrium_start on \n - + \section description Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance. - + \section restrictions only needed before filtering is begun - + \section related see \ref man_time_filter - + \section default on */ @@ -684,7 +684,7 @@ namespace ATC { } /*! \page man_mass_matrix fix_modify AtC mass_matrix - \section syntax + \section syntax fix_modify AtC mass_matrix - = activiate/deactiviate using the FE mass matrix in the MD region \section examples @@ -720,7 +720,7 @@ namespace ATC { fix_modify AtC material gap_region 2 \section description Sets the material model in elementset_name to be of type material_id. - \section restrictions + \section restrictions The element set must already be created and the material must be specified in the material file given the the atc fix on construction \section related \section default @@ -739,7 +739,7 @@ namespace ATC { set::const_iterator iset; for (iset = elemSet.begin(); iset != elemSet.end(); iset++) { int ielem = *iset; - + // and the tag a string elementToMaterialMap_(ielem) = matId; } @@ -747,7 +747,7 @@ namespace ATC { needReset_ = true; } - } // end else + } // end else // no match, call base class parser if (!match) { match = ATC_Method::modify(narg, arg); @@ -760,7 +760,7 @@ namespace ATC { WeakEquation::PDE_Type ATC_Coupling::pde_type(const FieldName fieldName) const { const WeakEquation * weakEq = physicsModel_->weak_equation(fieldName); - if (weakEq == nullptr) return WeakEquation::PROJECTION_PDE; + if (weakEq == nullptr) return WeakEquation::PROJECTION_PDE; return weakEq->type(); } //-------------------------------------------------- @@ -768,7 +768,7 @@ namespace ATC { bool ATC_Coupling::is_dynamic(const FieldName fieldName) const { const WeakEquation * weakEq = physicsModel_->weak_equation(fieldName); - if (weakEq == nullptr) return false; + if (weakEq == nullptr) return false; return (physicsModel_->weak_equation(fieldName)->type() == WeakEquation::DYNAMIC_PDE); } @@ -794,7 +794,7 @@ namespace ATC { //-------------------------------------------------------------- // create_physics_model - // - method to create physics model + // - method to create physics model //-------------------------------------------------------------- void ATC_Coupling::create_physics_model(const PhysicsType & physicsType, string matFileName) @@ -890,7 +890,7 @@ namespace ATC { //-------------------------------------------------------- void ATC_Coupling::set_initial_conditions() { - // set fields + // set fields prescribedDataMgr_->set_initial_conditions(time(), fields_,dot_fields_,ddot_fields_,dddot_fields_); @@ -931,7 +931,7 @@ namespace ATC { atomicSources); } else { - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; FIELDS::const_iterator fieldItr = fields.find(thisFieldName); @@ -941,7 +941,7 @@ namespace ATC { } } //----------------------------------------------------------------- - + void ATC_Coupling::compute_atomic_sources(const RHS_MASK & fieldMask, const FIELDS & fields, FIELDS & atomicSources) @@ -957,7 +957,7 @@ namespace ATC { } if (fieldMask(thisFieldName,PRESCRIBED_SOURCE)) { atomicSources[thisFieldName] -= fluxMask_*(sources_[thisFieldName].quantity()); - } + } // add in sources from extrinsic models @@ -971,7 +971,7 @@ namespace ATC { void ATC_Coupling::masked_atom_domain_rhs_tangent( const pair row_col, const RHS_MASK & rhsMask, - const FIELDS & fields, + const FIELDS & fields, SPAR_MAT & stiffness, const PhysicsModel * physicsModel) { @@ -989,7 +989,7 @@ namespace ATC { void ATC_Coupling::compute_rhs_tangent( const pair row_col, const RHS_MASK & rhsMask, - const FIELDS & fields, + const FIELDS & fields, SPAR_MAT & stiffness, const IntegrationDomainType integrationType, const PhysicsModel * physicsModel) @@ -998,7 +998,7 @@ namespace ATC { if (integrationType == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE) { RHS_MASK rhsMaskFE = rhsMask; RHS_MASK rhsMaskMD = rhsMask; rhsMaskMD = false; - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; if ( rhsMaskFE(thisFieldName,SOURCE) ) { @@ -1013,14 +1013,14 @@ namespace ATC { fields, stiffnessAtomDomain_, physicsModel); - stiffness += stiffnessAtomDomain_; + stiffness += stiffnessAtomDomain_; } else { feEngine_->compute_tangent_matrix(rhsMask, row_col, fields , physicsModel, elementToMaterialMap_, stiffness); } - ROBIN_SURFACE_SOURCE & robinFcn = *(prescribedDataMgr_->robin_functions()); + ROBIN_SURFACE_SOURCE & robinFcn = *(prescribedDataMgr_->robin_functions()); feEngine_->add_robin_tangent(rhsMask, fields, time(), robinFcn, stiffness); OPEN_SURFACE & openFaces = *(prescribedDataMgr_->open_faces()); feEngine_->add_open_tangent(rhsMask, fields, openFaces, stiffness); @@ -1037,15 +1037,15 @@ namespace ATC { } //----------------------------------------------------------------- void ATC_Coupling::compute_rhs_vector(const RHS_MASK & rhsMask, - const FIELDS & fields, + const FIELDS & fields, FIELDS & rhs, const IntegrationDomainType domain, const PhysicsModel * physicsModel) { if (!physicsModel) physicsModel = physicsModel_; - + // compute FE contributions - + evaluate_rhs_integral(rhsMask,fields,rhs,domain,physicsModel); for (int n = 0; n < rhsMask.nRows(); n++) { @@ -1053,7 +1053,7 @@ namespace ATC { if (rhsMask(thisFieldName,PRESCRIBED_SOURCE)) { if (is_intrinsic(thisFieldName)) { rhs[thisFieldName] += fluxMaskComplement_*(sources_[thisFieldName].quantity()); - } + } else { rhs[thisFieldName] += sources_[thisFieldName].quantity(); } @@ -1068,7 +1068,7 @@ namespace ATC { rhs[thisFieldName] += extrinsicSources_[thisFieldName].quantity(); } } - + } ROBIN_SURFACE_SOURCE & robinFcn = *(prescribedDataMgr_->robin_functions()); feEngine_->add_robin_fluxes(rhsMask, fields, time(), robinFcn, rhs); @@ -1092,7 +1092,7 @@ namespace ATC { rhs); } else { - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; FIELDS::const_iterator fieldItr = fields.find(thisFieldName); @@ -1108,13 +1108,13 @@ namespace ATC { const IntegrationDomainType integrationType, const PhysicsModel * physicsModel) { - + if (!physicsModel) physicsModel = physicsModel_; - + if (integrationType == FE_DOMAIN ) { - feEngine_->compute_rhs_vector(rhsMask, - fields, + feEngine_->compute_rhs_vector(rhsMask, + fields, physicsModel, elementToMaterialMap_, rhs, false, @@ -1123,14 +1123,14 @@ namespace ATC { fields, rhsAtomDomain_, physicsModel); - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; rhs[thisFieldName] -= rhsAtomDomain_[thisFieldName].quantity(); } } else if (integrationType == ATOM_DOMAIN) { - + masked_atom_domain_rhs_integral(rhsMask, fields, rhs, @@ -1139,7 +1139,7 @@ namespace ATC { else if (integrationType == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE) { RHS_MASK rhsMaskFE = rhsMask; RHS_MASK rhsMaskMD = rhsMask; rhsMaskMD = false; - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; if ( rhsMaskFE(thisFieldName,SOURCE) ) { @@ -1156,7 +1156,7 @@ namespace ATC { fields, rhsAtomDomain_, physicsModel); - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName thisFieldName = field->first; @@ -1180,7 +1180,7 @@ namespace ATC { rhs); } } - + //-------------------------------------------------- bool ATC_Coupling::reset_methods() const { @@ -1192,12 +1192,12 @@ namespace ATC { } //-------------------------------------------------- void ATC_Coupling::initialize() - { + { // initialize physics model if (physicsModel_) physicsModel_->initialize(); ATC_Method::initialize(); - + // initialized_ is set to true by derived class initialize() // STEP 6 - data initialization continued: set initial conditions if (!initialized_) { @@ -1211,7 +1211,7 @@ namespace ATC { throw; } } - + // initialize and fix computational geometry, this can be changed in the future for Eulerian calculations that fill and empty elements which is why it is outside a !initialized_ guard internalElement_->unfix_quantity(); if (ghostElement_) ghostElement_->unfix_quantity(); @@ -1231,7 +1231,7 @@ namespace ATC { map::const_iterator field; for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) { FieldName thisField = field->first; - if (is_intrinsic(thisField) && is_dynamic(thisField)) { + if (is_intrinsic(thisField) && is_dynamic(thisField)) { compute_mass_matrix(thisField); if (!useConsistentMassMatrix_(thisField) && !useFeMdMassMatrix_) { massMatsMd_[thisField] = massMatsMdInstantaneous_[thisField].quantity(); @@ -1242,7 +1242,7 @@ namespace ATC { } } } - + // prepare computes for first timestep lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+1); @@ -1283,7 +1283,7 @@ namespace ATC { // set consistent initial conditions, if requested if (!timeFilterManager_.filter_dynamics() && consistentInitialization_) { - + const INT_ARRAY & nodeType(nodalGeometryType_->quantity()); if (fieldSizes_.find(VELOCITY) != fieldSizes_.end()) { @@ -1291,7 +1291,7 @@ namespace ATC { DENS_MAN * nodalAtomicVelocity(interscaleManager_.dense_matrix("NodalAtomicVelocity")); const DENS_MAT & atomicVelocity(nodalAtomicVelocity->quantity()); for (int i = 0; iquantity()); - + for (int i = 0; iquantity()); for (int i = 0; iquantity()); for (int i = 0; iquantity()); for (int i = 0; ifirst; int thisSize = field->second; - + // Allocate fields, initialize to default values, set up initial schedule - + fields_[thisField].reset(nNodes_,thisSize); dot_fields_[thisField].reset(nNodes_,thisSize); ddot_fields_[thisField].reset(nNodes_,thisSize); dddot_fields_[thisField].reset(nNodes_,thisSize); - + // Allocate restricted fields if (is_intrinsic(thisField)) { nodalAtomicFields_[thisField].reset(nNodes_,thisSize); @@ -1383,11 +1383,11 @@ namespace ATC { // Dimension finite element rhs matrix rhs_[thisField].reset(nNodes_,thisSize); rhsAtomDomain_[thisField].reset(nNodes_,thisSize); - + sources_[thisField].reset(nNodes_,thisSize); extrinsicSources_[thisField].reset(nNodes_,thisSize); boundaryFlux_[thisField].reset(nNodes_,thisSize); - + if (is_intrinsic(thisField) && is_dynamic(thisField)) { massMats_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE massMatsFE_[thisField].reset(nNodes_,nNodes_); @@ -1402,7 +1402,7 @@ namespace ATC { // no MD mass matrices needed, regular matrices computed in extrinsic model if (useConsistentMassMatrix_(thisField)) { // compute FE mass matrix in full domain - + consistentMassMats_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE consistentMassMatsInv_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE } @@ -1416,7 +1416,7 @@ namespace ATC { } //-------------------------------------------------------- // create_full_element_mask - // constructs element mask which only masks out + // constructs element mask which only masks out // null elements //-------------------------------------------------------- MatrixDependencyManager * ATC_Coupling::create_full_element_mask() @@ -1424,7 +1424,7 @@ namespace ATC { MatrixDependencyManager * elementMaskMan = new MatrixDependencyManager(feEngine_->num_elements(),1); DenseMatrix & elementMask(elementMaskMan->set_quantity()); elementMask = true; - + const set & nullElements = feEngine_->null_elements(); set::const_iterator iset; for (iset = nullElements.begin(); iset != nullElements.end(); iset++) { @@ -1451,7 +1451,7 @@ namespace ATC { int ielem = *iset; elementMask(ielem,0) = true; } - + const set & nullElements = feEngine_->null_elements(); for (iset = nullElements.begin(); iset != nullElements.end(); iset++) { int ielem = *iset; @@ -1486,13 +1486,13 @@ namespace ATC { GHOST); interscaleManager_.add_per_atom_int_quantity(atomGhostElement_, "AtomGhostElement"); - + // does element contain ghost atoms ghostElement_ = new AtomTypeElement(this,atomGhostElement_); interscaleManager_.add_dense_matrix_int(ghostElement_, "ElementHasGhost"); } - + // element masking for approximate right-hand side FE atomic quadrature if (atomQuadForInternal_) { elementMask_ = create_full_element_mask(); @@ -1562,7 +1562,7 @@ namespace ATC { accumulantWeights_ = new AccumulantWeights(accumulant_); mdMassNormalization_ = false; } - + this->create_atom_volume(); // masked atom weights @@ -1620,7 +1620,7 @@ namespace ATC { //-------------------------------------------------------- void ATC_Coupling::construct_molecule_transfers() { - + map >::const_iterator molecule; PerAtomQuantity * atomProcGhostCoarseGrainingPositions = interscaleManager_.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions"); FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS, @@ -1631,12 +1631,12 @@ namespace ATC { SmallMoleculeSet * smallMoleculeSet = new SmallMoleculeSet(this,groupbit); smallMoleculeSet->initialize(); interscaleManager_.add_small_molecule_set(smallMoleculeSet,moleculeName); - SmallMoleculeCentroid * moleculeCentroid = + SmallMoleculeCentroid * moleculeCentroid = new SmallMoleculeCentroid(this,mass,smallMoleculeSet,atomProcGhostCoarseGrainingPositions); interscaleManager_.add_dense_matrix(moleculeCentroid,"MoleculeCentroid"+moleculeName); // shape function at molecular coordinates - PointToElementMap * elementMapMol = + PointToElementMap * elementMapMol = new PointToElementMap(this,moleculeCentroid); interscaleManager_.add_dense_matrix_int(elementMapMol, "ElementMap"+moleculeName); @@ -1714,16 +1714,16 @@ namespace ATC { meshDataInitialized_ = true; } //-------------------------------------------------------- - + void ATC_Coupling::reset_flux_mask(void) { int i; // this is exact only for uniform meshes and certain types of atomic weights // \int_{\Omega_MD} N_I dV = \sum_\alpha N_I\alpha V_\alpha - fluxMask_.reset((invNodeVolumes_.quantity()) + fluxMask_.reset((invNodeVolumes_.quantity()) * (nodalAtomicVolume_->quantity())); - DIAG_MAT id(fluxMask_.nRows(),fluxMask_.nCols()); + DIAG_MAT id(fluxMask_.nRows(),fluxMask_.nCols()); id = 1.0; fluxMaskComplement_ = id + -1.0*fluxMask_; @@ -1748,10 +1748,10 @@ namespace ATC { if (!physicsModel) physicsModel = physicsModel_; if (useConsistentMassMatrix_(thisField)) { // compute FE mass matrix in full domain - + Array massMask(1); - massMask(0) = thisField; - + massMask(0) = thisField; + feEngine_->compute_mass_matrix(massMask,fields_,physicsModel, elementToMaterialMap_,consistentMassMats_, &(elementMask_->quantity())); @@ -1760,15 +1760,15 @@ namespace ATC { } else if (! is_intrinsic(thisField)) { Array massMask(1); - massMask(0) = thisField; - + massMask(0) = thisField; + feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel, elementToMaterialMap_,massMats_, &(elementMask_->quantity())); const DIAG_MAT & myMassMat(massMats_[thisField].quantity()); DIAG_MAT & myMassMatInv(massMatsInv_[thisField].set_quantity()); for (int iNode = 0; iNode < nNodes_; iNode++) { - + if (fabs(myMassMat(iNode,iNode))>0) myMassMatInv(iNode,iNode) = 1./myMassMat(iNode,iNode); else @@ -1794,7 +1794,7 @@ namespace ATC { const DIAG_MAT & myMassMatMd(massMatsMd_[thisField].quantity()); // compute inverse mass matrices since we're using lumped masses for (int iNode = 0; iNode < nNodes_; iNode++) { - + if (fabs(myMassMat(iNode,iNode))>0) myMassMatInv(iNode,iNode) = 1./myMassMat(iNode,iNode); else @@ -1811,7 +1811,7 @@ namespace ATC { elementToMaterialMap_,massMatsFE_, &(elementMask_->quantity())); // fully remove contributions from internal nodes - + DIAG_MAT & myMassMatFE(massMatsFE_[thisField].set_quantity()); //myMassMatFE.print("MMFE"); if (!atomQuadForInternal_) { @@ -1821,7 +1821,7 @@ namespace ATC { myMassMatFE(iNode,iNode) = 0.; } } - + // atomic quadrature for FE mass matrix in atomic domain if (shpFcnMask_) { feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,atomMaterialGroupsMask_, @@ -1831,7 +1831,7 @@ namespace ATC { else { (massMatsAqInstantaneous_[thisField].set_quantity()).reset(nNodes_,nNodes_); } - + // set up mass MD matrices compute_md_mass_matrix(thisField,massMatsMdInstantaneous_[thisField].set_quantity()); } @@ -1853,13 +1853,13 @@ namespace ATC { // compute inverse mass matrices since we're using lumped masses for (int iNode = 0; iNode < nNodes_; iNode++) { - - if (fabs(myMassMatMD(iNode,iNode))>0) { + + if (fabs(myMassMatMD(iNode,iNode))>0) { myMassMatMDInv(iNode,iNode) = 1./myMassMatMD(iNode,iNode); } else myMassMatMDInv(iNode,iNode) = 0.; - + if (fabs(myMassMat(iNode,iNode))>0) { myMassMatInv(iNode,iNode) = 1./myMassMat(iNode,iNode); } @@ -1876,18 +1876,18 @@ namespace ATC { void ATC_Coupling::compute_md_mass_matrix(FieldName thisField, DIAG_MAT & massMat) { - + if (thisField == TEMPERATURE) { massMat.shallowreset(nodalAtomicHeatCapacity_->quantity()); } - + else if (thisField == DISPLACEMENT || thisField == VELOCITY) { massMat.shallowreset(nodalAtomicMass_->quantity()); } else if (thisField == MASS_DENSITY || thisField == SPECIES_CONCENTRATION) { massMat.shallowreset(nodalAtomicVolume_->quantity()); } - } + } //-------------------------------------------------- // write_restart_file @@ -1899,7 +1899,7 @@ namespace ATC { atomicRegulator_->pack_fields(data); ATC_Method::write_restart_data(fileName,data); } - + //-------------------------------------------------- // read_restart_file // bundle matrices that need to be saved and call @@ -2006,7 +2006,7 @@ namespace ATC { void ATC_Coupling::post_init_integrate() { double dt = lammpsInterface_->dt(); - + // Compute nodal velocity at n+1 for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) { (_tiIt_->second)->post_initial_integrate1(dt); @@ -2020,7 +2020,7 @@ namespace ATC { // fixed values, non-group bcs handled through FE set_fixed_nodes(); - + update_time(0.5); // ghost update, if needed @@ -2041,7 +2041,7 @@ namespace ATC { } } - + //-------------------------------------------------------- void ATC_Coupling::pre_neighbor() { @@ -2062,7 +2062,7 @@ namespace ATC { void ATC_Coupling::pre_force() { ATC_Method::pre_force(); - atomicRegulator_->pre_force(); + atomicRegulator_->pre_force(); } //-------------------------------------------------------- @@ -2078,7 +2078,7 @@ namespace ATC { for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) { FieldName thisField = field->first; if (is_intrinsic(thisField) && is_dynamic(thisField)) { - compute_mass_matrix(thisField); + compute_mass_matrix(thisField); } } } @@ -2095,7 +2095,7 @@ namespace ATC { massMatsAqInstantaneous_[thisField].quantity(),dt); massMatTimeFilters_[thisField]->apply_post_step1(massMatsMd_[thisField].set_quantity(), massMatsMdInstantaneous_[thisField].quantity(),dt); - update_mass_matrix(thisField); + update_mass_matrix(thisField); } } } @@ -2107,7 +2107,7 @@ namespace ATC { //-------------------------------------------------------- // post_final_integrate - // integration after the second stage lammps atomic + // integration after the second stage lammps atomic // update of Verlet step 2 //-------------------------------------------------------- void ATC_Coupling::post_final_integrate() @@ -2136,7 +2136,7 @@ namespace ATC { compute_atomic_sources(intrinsicMask_,fields_,atomicSources_); } atomicRegulator_->apply_pre_corrector(dt,lammpsInterface_->ntimestep()); - + // Compute atom-integrated rhs // parallel communication happens within FE_Engine compute_rhs_vector(intrinsicMask_,fields_,rhs_,FE_DOMAIN); @@ -2144,7 +2144,7 @@ namespace ATC { (_tiIt_->second)->add_to_rhs(); } atomicRegulator_->add_to_rhs(rhs_); - + // Compute and add atomic contributions to FE equations for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) { (_tiIt_->second)->post_final_integrate1(dt); @@ -2152,7 +2152,7 @@ namespace ATC { // fix nodes, non-group bcs applied through FE set_fixed_nodes(); - + // corrector step extrinsic model extrinsicModelManager_.post_final_integrate(); @@ -2174,7 +2174,7 @@ namespace ATC { for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) { (_tiIt_->second)->post_final_integrate2(dt); } - + // apply corrector phase of thermostat set_fixed_nodes(); atomicRegulator_->apply_post_corrector(dt,lammpsInterface_->ntimestep()); @@ -2186,9 +2186,9 @@ namespace ATC { // Fix nodes, non-group bcs applied through FE set_fixed_nodes(); - + update_time(0.5); - + output(); lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+1); // adds next step to computes //ATC_Method::post_final_integrate(); @@ -2213,13 +2213,13 @@ namespace ATC { // //================================================================= void ATC_Coupling::compute_boundary_flux(const Array2D & rhsMask, - const FIELDS & fields, + const FIELDS & fields, FIELDS & rhs, const Array< set > atomMaterialGroups, const VectorDependencyManager * shpFcnDerivs, const SPAR_MAN * shpFcn, const DIAG_MAN * atomicWeights, - + const MatrixDependencyManager * elementMask, const SetDependencyManager * nodeSet) { @@ -2276,10 +2276,10 @@ if (thisFieldName >= rhsMask.nRows()) break; //----------------------------------------------------------------- void ATC_Coupling::compute_flux(const Array2D & rhsMask, - const FIELDS & fields, + const FIELDS & fields, GRAD_FIELD_MATS & flux, const PhysicsModel * physicsModel, - bool project) + bool project) { if (! physicsModel) { physicsModel = physicsModel_; } feEngine_->compute_flux(rhsMask, @@ -2288,7 +2288,7 @@ if (thisFieldName >= rhsMask.nRows()) break; elementToMaterialMap_, flux); if (project) { - for (FIELDS::const_iterator field = fields.begin(); + for (FIELDS::const_iterator field = fields.begin(); field != fields.end(); field++) { FieldName name = field->first; if ( rhsMask(name,FLUX) ) { @@ -2324,13 +2324,13 @@ if (i==0) f.print("flux_"+field_to_string(name)+"_"+ATC_Utility::to_string(i)); // parses the boundary integration to determine // the type of boundary integration being used //-------------------------------------------------- - - + + BoundaryIntegrationType ATC_Coupling::parse_boundary_integration(int narg, char **arg, const set< pair > * boundaryFaceSet) { - + int argIndex = 0; BoundaryIntegrationType myBoundaryIntegrationType = FE_INTERPOLATION;// default if (narg > 0) { @@ -2340,12 +2340,12 @@ if (i==0) f.print("flux_"+field_to_string(name)+"_"+ATC_Utility::to_string(i)); string name(arg[argIndex]); boundaryFaceSet = & ( (feEngine_->fe_mesh())->faceset(name)); set_boundary_face_set(boundaryFaceSet); - } + } else if (strcmp(arg[argIndex],"interpolate")==0) { myBoundaryIntegrationType = FE_INTERPOLATION; } - else if (strcmp(arg[argIndex],"no_boundary")==0) { - myBoundaryIntegrationType = NO_QUADRATURE; + else if (strcmp(arg[argIndex],"no_boundary")==0) { + myBoundaryIntegrationType = NO_QUADRATURE; } else { throw ATC_Error("Bad boundary integration type"); diff --git a/lib/atc/ATC_Coupling.h b/lib/atc/ATC_Coupling.h index e119b68738..9c9983bf26 100644 --- a/lib/atc/ATC_Coupling.h +++ b/lib/atc/ATC_Coupling.h @@ -20,16 +20,16 @@ namespace ATC { /** * @class ATC_Coupling - * @brief Base class for atom-continuum coupling + * @brief Base class for atom-continuum coupling */ class ATC_Coupling : public ATC_Method { public: /** methods */ - + friend class ExtrinsicModel; // friend is not inherited friend class ExtrinsicModelTwoTemperature; - friend class ExtrinsicModelDriftDiffusion; + friend class ExtrinsicModelDriftDiffusion; friend class ExtrinsicModelDriftDiffusionConvection; friend class ExtrinsicModelElectrostatic; friend class ExtrinsicModelElectrostaticMomentum; @@ -72,13 +72,13 @@ namespace ATC { virtual void pre_init_integrate(); /** Predictor phase, Verlet first step for velocity and position */ - virtual void init_integrate(); + virtual void init_integrate(); /** Predictor phase, executed after Verlet */ virtual void post_init_integrate(); /** Corrector phase, executed after Verlet*/ - + virtual void post_final_integrate(); /** pre/post atomic force calculation in minimize */ @@ -95,9 +95,9 @@ namespace ATC { const std::set & boundary_face_names() {return boundaryFaceNames_;}; /** access to boundary integration method */ int boundary_integration_type() {return bndyIntType_;}; - void set_boundary_integration_type(int boundaryIntegrationType) + void set_boundary_integration_type(int boundaryIntegrationType) {bndyIntType_ = boundaryIntegrationType;}; - void set_boundary_face_set(const std::set< std::pair > * boundaryFaceSet) + void set_boundary_face_set(const std::set< std::pair > * boundaryFaceSet) {bndyFaceSet_ = boundaryFaceSet;}; BoundaryIntegrationType parse_boundary_integration (int narg, char **arg, const std::set< std::pair > * boundaryFaceSet); @@ -107,10 +107,10 @@ namespace ATC { //-------------------------------------------------------- /** access to all boundary fluxes */ - FIELDS &boundary_fluxes() {return boundaryFlux_;}; + FIELDS &boundary_fluxes() {return boundaryFlux_;}; /** wrapper for FE_Engine's compute_boundary_flux functions */ void compute_boundary_flux(const Array2D & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, FIELDS &rhs, const Array< std::set > atomMaterialGroups, const VectorDependencyManager * shpFcnDerivs, @@ -128,12 +128,12 @@ namespace ATC { DENS_MAN &field_rhs(FieldName thisField) { return rhs_[thisField]; }; /** allow FE_Engine to construct ATC structures after mesh is constructed */ - virtual void initialize_mesh_data(void); + virtual void initialize_mesh_data(void); // public for FieldIntegrator - bool source_atomic_quadrature(FieldName /* field */) + bool source_atomic_quadrature(FieldName /* field */) { return (sourceIntegration_ == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE); } - ATC::IntegrationDomainType source_integration() + ATC::IntegrationDomainType source_integration() { return sourceIntegration_; } /** wrapper for FE_Engine's compute_sources */ @@ -143,25 +143,25 @@ namespace ATC { FIELD_MATS & atomicSources); /** computes tangent matrix using atomic quadrature near FE region */ void masked_atom_domain_rhs_tangent(const std::pair row_col, - const RHS_MASK & rhsMask, - const FIELDS & fields, + const RHS_MASK & rhsMask, + const FIELDS & fields, SPAR_MAT & stiffness, const PhysicsModel * physicsModel); /** wrapper for FE_Engine's compute_rhs_vector functions */ void compute_rhs_vector(const RHS_MASK & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, FIELDS &rhs, const IntegrationDomainType domain, // = FULL_DOMAIN const PhysicsModel * physicsModel=nullptr); /** wrapper for FE_Engine's compute_tangent_matrix */ void compute_rhs_tangent(const std::pair row_col, - const RHS_MASK & rhsMask, - const FIELDS & fields, + const RHS_MASK & rhsMask, + const FIELDS & fields, SPAR_MAT & stiffness, const IntegrationDomainType integrationType, const PhysicsModel * physicsModel=nullptr); void tangent_matrix(const std::pair row_col, - const RHS_MASK & rhsMask, + const RHS_MASK & rhsMask, const PhysicsModel * physicsModel, SPAR_MAT & stiffness); @@ -172,7 +172,7 @@ namespace ATC { // public for ImplicitSolveOperator /** return pointer to PrescribedDataManager */ - PrescribedDataManager * prescribed_data_manager() + PrescribedDataManager * prescribed_data_manager() { return prescribedDataMgr_; } // public for Kinetostat // TODO rename to "mass_matrix" @@ -228,7 +228,7 @@ namespace ATC { void set_mass_mat_time_filter(FieldName thisField,TimeFilterManager::FilterIntegrationType filterIntegrationType); /** return reference to ExtrinsicModelManager */ - ExtrinsicModelManager & extrinsic_model_manager() + ExtrinsicModelManager & extrinsic_model_manager() { return extrinsicModelManager_; } /** access to time integrator */ const TimeIntegrator * time_integrator(const FieldName & field) const { @@ -242,7 +242,7 @@ namespace ATC { //--------------------------------------------------------------- /*@{*/ /** allow FE_Engine to construct data manager after mesh is constructed */ - void construct_prescribed_data_manager (void); + void construct_prescribed_data_manager (void); /** method to create physics model */ void create_physics_model(const PhysicsType & physicsType, std::string matFileName); @@ -289,7 +289,7 @@ namespace ATC { void set_sources(); /** assemble various contributions to the heat flux in the atomic region */ void compute_atomic_sources(const Array2D & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, FIELDS &atomicSources); DENS_MAT &get_source(FieldName thisField){return sources_[thisField].set_quantity();}; @@ -313,25 +313,25 @@ namespace ATC { //--------------------------------------------------------------- /*@{*/ /** access for field mask */ - Array2D &field_mask() {return fieldMask_;}; + Array2D &field_mask() {return fieldMask_;}; /** create field mask */ void reset_flux_mask(); /** field mask for intrinsic integration */ Array2D intrinsicMask_; /** wrapper for FE_Engine's compute_flux functions */ void compute_flux(const Array2D & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, GRAD_FIELD_MATS &flux, const PhysicsModel * physicsModel=nullptr, const bool normalize = false); /** evaluate rhs on the atomic domain which is near the FE region */ void masked_atom_domain_rhs_integral(const Array2D & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, FIELDS &rhs, const PhysicsModel * physicsModel); /** evaluate rhs on a specified domain defined by mask and physics model */ void evaluate_rhs_integral(const Array2D & rhs_mask, - const FIELDS &fields, + const FIELDS &fields, FIELDS &rhs, const IntegrationDomainType domain, const PhysicsModel * physicsModel=nullptr); @@ -422,8 +422,8 @@ namespace ATC { /*@{*/ Array elementToMaterialMap_; // ATOMIC_TAG * elementToMaterialMap_; /** atomic ATC material tag */ - - + + Array< std::set > atomMaterialGroups_; // ATOMIC_TAG*atomMaterialGroups_; Array< std::set > atomMaterialGroupsMask_; // ATOMIC_TAG*atomMaterialGroupsMask_; /*@}*/ @@ -432,7 +432,7 @@ namespace ATC { /** computational geometry */ //--------------------------------------------------------------- /*@{*/ - bool atomQuadForInternal_; + bool atomQuadForInternal_; MatrixDependencyManager * elementMask_; MatrixDependencyManager * elementMaskMass_; MatrixDependencyManager * elementMaskMassMd_; @@ -465,7 +465,7 @@ namespace ATC { DIAG_MAN * atomicWeightsMask_; SPAR_MAN * shpFcnMask_; VectorDependencyManager * shpFcnDerivsMask_; - Array atomMask_; + Array atomMask_; SPAR_MAN atomToOverlapMat_; DIAG_MAN nodalMaskMat_; /*@}*/ @@ -475,7 +475,7 @@ namespace ATC { //--------------------------------------------------------------- /*@{*/ /** mask for computation of fluxes */ - Array2D fieldMask_; + Array2D fieldMask_; DIAG_MAT fluxMask_; DIAG_MAT fluxMaskComplement_; /** sources */ diff --git a/lib/atc/ATC_CouplingEnergy.cpp b/lib/atc/ATC_CouplingEnergy.cpp index 8fae1f0703..bed3842bdb 100644 --- a/lib/atc/ATC_CouplingEnergy.cpp +++ b/lib/atc/ATC_CouplingEnergy.cpp @@ -20,7 +20,7 @@ namespace ATC { // Class ATC_CouplingEnergy //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -33,18 +33,18 @@ namespace ATC { nodalAtomicKineticTemperature_(nullptr), nodalAtomicConfigurationalTemperature_(nullptr) { - // Allocate PhysicsModel + // Allocate PhysicsModel create_physics_model(THERMAL, matParamFile); // create extrinsic physics model if (extrinsicModel != NO_MODEL) { - extrinsicModelManager_.create_model(extrinsicModel,matParamFile); + extrinsicModelManager_.create_model(extrinsicModel,matParamFile); } // Defaults set_time(); bndyIntType_ = FE_INTERPOLATION; - + // set up field data based on physicsModel physicsModel_->num_fields(fieldSizes_,fieldMask_); @@ -182,16 +182,16 @@ namespace ATC { // register the per-atom quantity for the temperature definition interscaleManager_.add_per_atom_quantity(atomEnergyForTemperature, "AtomicEnergyForTemperature"); - + // nodal restriction of the atomic energy quantity for the temperature definition AtfShapeFunctionRestriction * nodalAtomicEnergy = new AtfShapeFunctionRestriction(this, atomEnergyForTemperature, shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicEnergy, "NodalAtomicEnergy"); - + // nodal atomic temperature field - + AtfShapeFunctionMdProjection * nodalAtomicTemperature = new AtfShapeFunctionMdProjection(this, nodalAtomicEnergy, TEMPERATURE); @@ -210,18 +210,18 @@ namespace ATC { //--------------------------------------------------------- void ATC_CouplingEnergy::init_filter() { - + TimeIntegrator::TimeIntegrationType timeIntegrationType = timeIntegrators_[TEMPERATURE]->time_integration_type(); - - - - - if (timeFilterManager_.end_equilibrate()) { + + + + + if (timeFilterManager_.end_equilibrate()) { if (timeIntegrationType==TimeIntegrator::GEAR) { if (equilibriumStart_) { - - - + + + if (atomicRegulator_->regulator_target()==AtomicRegulator::DYNAMICS) { // based on FE equation DENS_MAT vdotflamMat(-2.*(nodalAtomicFields_[TEMPERATURE].quantity())); // note 2 is for 1/2 vdotflam addition atomicRegulator_->reset_lambda_contribution(vdotflamMat); @@ -249,7 +249,7 @@ namespace ATC { { bool foundMatch = false; int argIndx = 0; - + // check to see if input is a transfer class command // check derived class before base class @@ -311,19 +311,19 @@ namespace ATC { // output[2] = average temperature double mvv2e = lammpsInterface_->mvv2e(); // convert to lammps energy units - + if (n == 0) { Array mask(1); FIELD_MATS energy; mask(0) = TEMPERATURE; - - feEngine_->compute_energy(mask, + + feEngine_->compute_energy(mask, fields_, physicsModel_, elementToMaterialMap_, energy, &(elementMask_->quantity())); - + double phononEnergy = mvv2e * energy[TEMPERATURE].col_sum(); return phononEnergy; } @@ -353,9 +353,9 @@ namespace ATC { _keTemp_ = nodalAtomicKineticTemperature_->quantity(); if (nodalAtomicConfigurationalTemperature_) _peTemp_ = nodalAtomicConfigurationalTemperature_->quantity(); - + OUTPUT_LIST outputData; - + // base class output ATC_Method::output(); @@ -370,7 +370,7 @@ namespace ATC { } atomicRegulator_->output(outputData); extrinsicModelManager_.output(outputData); - + DENS_MAT & temperature(nodalAtomicFields_[TEMPERATURE].set_quantity()); DENS_MAT & dotTemperature(dot_fields_[TEMPERATURE].set_quantity()); DENS_MAT & ddotTemperature(ddot_fields_[TEMPERATURE].set_quantity()); @@ -384,18 +384,18 @@ namespace ATC { feEngine_->add_global("temperature_std_dev", T_stddev); double Ta_mean = (nodalAtomicFields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_; feEngine_->add_global("atomic_temperature_mean", Ta_mean); - double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0); + double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0); feEngine_->add_global("atomic_temperature_std_dev", Ta_stddev); // different temperature measures, if appropriate if (nodalAtomicKineticTemperature_) outputData["kinetic_temperature"] = & _keTemp_; - + if (nodalAtomicConfigurationalTemperature_) { _peTemp_ *= 2; // account for full temperature outputData["configurational_temperature"] = & _peTemp_; } - + // mesh data outputData["NodalAtomicTemperature"] = &temperature; outputData["dot_temperature"] = &dotTemperature; diff --git a/lib/atc/ATC_CouplingEnergy.h b/lib/atc/ATC_CouplingEnergy.h index fce1a45501..84d195f384 100644 --- a/lib/atc/ATC_CouplingEnergy.h +++ b/lib/atc/ATC_CouplingEnergy.h @@ -25,9 +25,9 @@ namespace ATC { class ATC_CouplingEnergy : public ATC_Coupling { public: - + // constructor - ATC_CouplingEnergy(std::string groupName, + ATC_CouplingEnergy(std::string groupName, double ** & perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile, @@ -64,7 +64,7 @@ namespace ATC { /** physics specific filter initialization */ void init_filter(); - + double compute_lambda_power(int gid); /** kinetic temperature for post-processing */ @@ -77,6 +77,6 @@ namespace ATC { DENS_MAT _keTemp_, _peTemp_; }; - + }; #endif diff --git a/lib/atc/ATC_CouplingMass.cpp b/lib/atc/ATC_CouplingMass.cpp index d36643e590..ecc2fe4a6c 100644 --- a/lib/atc/ATC_CouplingMass.cpp +++ b/lib/atc/ATC_CouplingMass.cpp @@ -31,11 +31,11 @@ namespace ATC { // Class ATC_CouplingMass //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- - ATC_CouplingMass::ATC_CouplingMass(string groupName, + ATC_CouplingMass::ATC_CouplingMass(string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, string matParamFile, @@ -43,19 +43,19 @@ namespace ATC { : ATC_Coupling(groupName,perAtomArray,thisFix), resetNlocal_(false) { - // Allocate PhysicsModel - create_physics_model(SPECIES, matParamFile); + // Allocate PhysicsModel + create_physics_model(SPECIES, matParamFile); // create extrinsic physics model if (extrinsicModel != NO_MODEL) { - extrinsicModelManager_.create_model(extrinsicModel,matParamFile); + extrinsicModelManager_.create_model(extrinsicModel,matParamFile); } // Defaults set_time(); bndyIntType_ = NO_QUADRATURE; - - + + // set up field data based on physicsModel physicsModel_->num_fields(fieldSizes_,fieldMask_); @@ -87,13 +87,13 @@ namespace ATC { //-------------------------------------------------------- // modify - // parses inputs and modifies state + // parses inputs and modifies state //-------------------------------------------------------- bool ATC_CouplingMass::modify(int narg, char **arg) { bool match = false; // check to see if it is a transfer class command - + // check derived class before base class int argIndex = 0; // pass-through to concentration regulator @@ -117,7 +117,7 @@ namespace ATC { //-------------------------------------------------------- void ATC_CouplingMass::initialize() { - + fieldSizes_[SPECIES_CONCENTRATION] = ntracked(); // Base class initalizations @@ -135,9 +135,9 @@ namespace ATC { FieldManager fmgr(this); atomicFields_[MASS_DENSITY] = fmgr.nodal_atomic_field(MASS_DENSITY, field_to_intrinsic_name(MASS_DENSITY)); - if (has_tracked_species()) { + if (has_tracked_species()) { atomicFields_[SPECIES_CONCENTRATION] = fmgr.nodal_atomic_field(SPECIES_CONCENTRATION, field_to_intrinsic_name(SPECIES_CONCENTRATION)); - + //if (atomicRegulator_->needs_temperature()) { atomicFields_[TEMPERATURE] = fmgr.nodal_atomic_field(KINETIC_TEMPERATURE, field_to_intrinsic_name(TEMPERATURE)); @@ -146,7 +146,7 @@ namespace ATC { //} } else { - + throw ATC_Error("ATC_CouplingMass: no tracked species"); } @@ -161,14 +161,14 @@ namespace ATC { const string moleculeName = molecule->first; SmallMoleculeSet * smallMoleculeSet = interscaleManager_.small_molecule_set(moleculeName); SPAR_MAN * shpFcnMol = interscaleManager_.sparse_matrix("ShapeFunction"+moleculeName); - AtomToSmallMoleculeTransfer * moleculeMass = + AtomToSmallMoleculeTransfer * moleculeMass = new AtomToSmallMoleculeTransfer(this,mass,smallMoleculeSet); interscaleManager_.add_dense_matrix(moleculeMass,"MoleculeMass"+moleculeName); - MotfShapeFunctionRestriction * nodalAtomicMoleculeMass = + MotfShapeFunctionRestriction * nodalAtomicMoleculeMass = new MotfShapeFunctionRestriction(moleculeMass,shpFcnMol); interscaleManager_.add_dense_matrix(nodalAtomicMoleculeMass,"NodalMoleculeMass"+moleculeName); - + AtfShapeFunctionMdProjection * nodalAtomicMoleculeMassDensity = new AtfShapeFunctionMdProjection(this,nodalAtomicMoleculeMass,MASS_DENSITY); interscaleManager_.add_dense_matrix(nodalAtomicMoleculeMassDensity,"NodalMoleculeMassDensity"+moleculeName); @@ -180,7 +180,7 @@ namespace ATC { void ATC_CouplingMass::init_filter() { - + ATC_Coupling::init_filter(); } @@ -192,11 +192,11 @@ namespace ATC { void ATC_CouplingMass::pre_exchange() { ATC_Coupling::pre_exchange(); - + //if (atomicRegulator_->needs_temperature()) { - field(TEMPERATURE) = atomicFields_[TEMPERATURE]->quantity(); + field(TEMPERATURE) = atomicFields_[TEMPERATURE]->quantity(); ///} - atomicRegulator_->pre_exchange(); + atomicRegulator_->pre_exchange(); if (resetNlocal_) { this->reset_nlocal(); resetNlocal_ = false; @@ -208,7 +208,7 @@ namespace ATC { // does post-processing steps and outputs data //-------------------------------------------------------- void ATC_CouplingMass::output() - { + { if (output_now()) { feEngine_->departition_mesh(); OUTPUT_LIST outputData; @@ -226,10 +226,10 @@ namespace ATC { (_tiIt_->second)->output(outputData); } extrinsicModelManager_.output(outputData); - atomicRegulator_->output(outputData); + atomicRegulator_->output(outputData); FIELD_POINTERS::iterator itr; - for (itr=atomicFields_.begin(); itr!=atomicFields_.end();itr++) { + for (itr=atomicFields_.begin(); itr!=atomicFields_.end();itr++) { FieldName name = itr->first; const DENS_MAT & data = (itr->second)->quantity(); outputData[field_to_intrinsic_name(name)] = & data; diff --git a/lib/atc/ATC_CouplingMass.h b/lib/atc/ATC_CouplingMass.h index 1589a7a655..8cdb3279ad 100644 --- a/lib/atc/ATC_CouplingMass.h +++ b/lib/atc/ATC_CouplingMass.h @@ -32,20 +32,20 @@ namespace ATC { class ATC_CouplingMass : public ATC_Coupling { public: - + // constructor - ATC_CouplingMass(std::string groupName, + ATC_CouplingMass(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile, ExtrinsicModelType extrinsic = NO_MODEL); - + // destructor virtual ~ATC_CouplingMass(); /** parser/modifier */ virtual bool modify(int narg, char **arg); - + /** pre time integration */ virtual void initialize(); @@ -78,8 +78,8 @@ namespace ATC { bool resetNlocal_; - - + + // i.e. we only need the correct shape function matrix for restriction }; diff --git a/lib/atc/ATC_CouplingMomentum.cpp b/lib/atc/ATC_CouplingMomentum.cpp index 6757245119..9b16efc159 100644 --- a/lib/atc/ATC_CouplingMomentum.cpp +++ b/lib/atc/ATC_CouplingMomentum.cpp @@ -22,11 +22,11 @@ namespace ATC { // Class ATC_CouplingMomentum //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- - ATC_CouplingMomentum::ATC_CouplingMomentum(string groupName, + ATC_CouplingMomentum::ATC_CouplingMomentum(string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, string matParamFile, @@ -35,14 +35,14 @@ namespace ATC { : ATC_Coupling(groupName,perAtomArray,thisFix), refPE_(0) { - // Allocate PhysicsModel + // Allocate PhysicsModel create_physics_model(intrinsicModel, matParamFile); // create extrinsic physics model if (extrinsicModel != NO_MODEL) { - extrinsicModelManager_.create_model(extrinsicModel,matParamFile); + extrinsicModelManager_.create_model(extrinsicModel,matParamFile); } - + // set up field data based on physicsModel physicsModel_->num_fields(fieldSizes_,fieldMask_); @@ -166,14 +166,14 @@ namespace ATC { atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this); interscaleManager_.add_per_atom_quantity(atomicMassWeightedDisplacement, "AtomicMassWeightedDisplacement"); - + // nodal (RHS) mass-weighted displacement AtfShapeFunctionRestriction * nodalAtomicMassWeightedDisplacement = new AtfShapeFunctionRestriction(this, atomicMassWeightedDisplacement, shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicMassWeightedDisplacement, "NodalAtomicMassWeightedDisplacement"); - + // nodal displacement derived only from atoms AtfShapeFunctionMdProjection * nodalAtomicDisplacement = new AtfShapeFunctionMdProjection(this, nodalAtomicMassWeightedDisplacement, @@ -194,7 +194,7 @@ namespace ATC { //--------------------------------------------------------- void ATC_CouplingMomentum::init_filter() { - + ATC_Coupling::init_filter(); if (timeFilterManager_.end_equilibrate() && equilibriumStart_) // set up correct initial lambda forces to enforce initial accerlation @@ -288,35 +288,35 @@ namespace ATC { ATC_Method::min_post_force(); // Set sources - + prescribedDataMgr_->set_sources(time(),sources_); extrinsicModelManager_.set_sources(fields_,extrinsicSources_); extrinsicModelManager_.pre_final_integrate(); - + if (outputNow_) { update_time(1.0); update_step(); output(); outputNow_ = false; } - - + + localStep_ += 1; } - + //-------------------------------------------------------- // output // does post-processing steps and outputs data //-------------------------------------------------------- - void ATC_CouplingMomentum::output() + void ATC_CouplingMomentum::output() { if (output_now()) { feEngine_->departition_mesh(); OUTPUT_LIST outputData; - + // base class output ATC_Method::output(); @@ -331,7 +331,7 @@ namespace ATC { } atomicRegulator_->output(outputData); extrinsicModelManager_.output(outputData); - + DENS_MAT & velocity(nodalAtomicFields_[VELOCITY].set_quantity()); DENS_MAT & rhs(rhs_[VELOCITY].set_quantity()); if (lammpsInterface_->rank_zero()) { @@ -341,7 +341,7 @@ namespace ATC { if (trackDisplacement_) { outputData["NodalAtomicDisplacement"] = & nodalAtomicFields_[DISPLACEMENT].set_quantity(); } - + feEngine_->write_data(output_index(), fields_, & outputData); } // force optional variables to reset to keep in sync @@ -376,7 +376,7 @@ namespace ATC { kineticEnergy += v.dot(M*v); } if (domain == FE_DOMAIN) { - + Array massMask(1); massMask(0) = VELOCITY; feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel_,atomMaterialGroups_, @@ -388,20 +388,20 @@ namespace ATC { kineticEnergy -= v.dot(Ma*v); } } - double mvv2e = lammpsInterface_->mvv2e(); + double mvv2e = lammpsInterface_->mvv2e(); kineticEnergy *= 0.5*mvv2e; // convert to LAMMPS units return kineticEnergy; } //-------------------------------------------------------------------- - // potential/strain energy + // potential/strain energy //-------------------------------------------------------------------- double ATC_CouplingMomentum::potential_energy(const IntegrationDomainType domain) const { Array mask(1); mask(0) = VELOCITY; FIELD_MATS energy; - feEngine_->compute_energy(mask, + feEngine_->compute_energy(mask, fields_, physicsModel_, elementToMaterialMap_, @@ -424,7 +424,7 @@ namespace ATC { // output[3] = total coarse scale energy // output[4] = fe-only coarse scale kinetic energy // output[5] = fe-only coarse scale potential energy - + if (n == 0) { diff --git a/lib/atc/ATC_CouplingMomentum.h b/lib/atc/ATC_CouplingMomentum.h index 66a4b22ca7..8ddb0eabeb 100644 --- a/lib/atc/ATC_CouplingMomentum.h +++ b/lib/atc/ATC_CouplingMomentum.h @@ -26,21 +26,21 @@ namespace ATC { class ATC_CouplingMomentum : public ATC_Coupling { public: - + // constructor - ATC_CouplingMomentum(std::string groupName, + ATC_CouplingMomentum(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile, PhysicsType intrinsicModel, ExtrinsicModelType extrinsicModel = NO_MODEL); - + // destructor virtual ~ATC_CouplingMomentum(); /** parser/modifier */ virtual bool modify(int narg, char **arg); - + /** pre time integration */ virtual void initialize(); diff --git a/lib/atc/ATC_CouplingMomentumEnergy.cpp b/lib/atc/ATC_CouplingMomentumEnergy.cpp index 32df5fd7b9..08206ba6db 100644 --- a/lib/atc/ATC_CouplingMomentumEnergy.cpp +++ b/lib/atc/ATC_CouplingMomentumEnergy.cpp @@ -22,7 +22,7 @@ namespace ATC { // Class ATC_CouplingMomentumEnergy //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -36,12 +36,12 @@ namespace ATC { nodalAtomicConfigurationalTemperature_(nullptr), refPE_(0) { - // Allocate PhysicsModel + // Allocate PhysicsModel create_physics_model(THERMO_ELASTIC, matParamFile); // create extrinsic physics model if (extrinsicModel != NO_MODEL) { - extrinsicModelManager_.create_model(extrinsicModel,matParamFile); + extrinsicModelManager_.create_model(extrinsicModel,matParamFile); } // set up field data based on physicsModel @@ -129,14 +129,14 @@ namespace ATC { AtomicMomentum * atomicMomentum = new AtomicMomentum(this); interscaleManager_.add_per_atom_quantity(atomicMomentum, "AtomicMomentum"); - + // nodal momentum for RHS AtfShapeFunctionRestriction * nodalAtomicMomentum = new AtfShapeFunctionRestriction(this, atomicMomentum, shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicMomentum, "NodalAtomicMomentum"); - + // nodal forces FundamentalAtomQuantity * atomicForce = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE); AtfShapeFunctionRestriction * nodalAtomicForce = new AtfShapeFunctionRestriction(this, @@ -144,14 +144,14 @@ namespace ATC { shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicForce, "NodalAtomicForce"); - + // nodal velocity derived only from atoms AtfShapeFunctionMdProjection * nodalAtomicVelocity = new AtfShapeFunctionMdProjection(this, nodalAtomicMomentum, VELOCITY); interscaleManager_.add_dense_matrix(nodalAtomicVelocity, "NodalAtomicVelocity"); - + if (trackDisplacement_) { // mass-weighted (center-of-mass) displacement of each atom AtomicMassWeightedDisplacement * atomicMassWeightedDisplacement; @@ -166,14 +166,14 @@ namespace ATC { atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this); interscaleManager_.add_per_atom_quantity(atomicMassWeightedDisplacement, "AtomicMassWeightedDisplacement"); - + // nodal (RHS) mass-weighted displacement AtfShapeFunctionRestriction * nodalAtomicMassWeightedDisplacement = new AtfShapeFunctionRestriction(this, atomicMassWeightedDisplacement, shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicMassWeightedDisplacement, "NodalAtomicMassWeightedDisplacement"); - + // nodal displacement derived only from atoms AtfShapeFunctionMdProjection * nodalAtomicDisplacement = new AtfShapeFunctionMdProjection(this, nodalAtomicMassWeightedDisplacement, @@ -183,7 +183,7 @@ namespace ATC { } // always need fluctuating velocity and kinetic energy - + FtaShapeFunctionProlongation * atomicMeanVelocity = new FtaShapeFunctionProlongation(this,&fields_[VELOCITY],shpFcn_); interscaleManager_.add_per_atom_quantity(atomicMeanVelocity, field_to_prolongation_name(VELOCITY)); @@ -267,16 +267,16 @@ namespace ATC { // register the per-atom quantity for the temperature definition interscaleManager_.add_per_atom_quantity(atomEnergyForTemperature, "AtomicEnergyForTemperature"); - + // nodal restriction of the atomic energy quantity for the temperature definition AtfShapeFunctionRestriction * nodalAtomicEnergy = new AtfShapeFunctionRestriction(this, atomEnergyForTemperature, shpFcn_); interscaleManager_.add_dense_matrix(nodalAtomicEnergy, "NodalAtomicEnergy"); - + // nodal atomic temperature field - + AtfShapeFunctionMdProjection * nodalAtomicTemperature = new AtfShapeFunctionMdProjection(this, nodalAtomicEnergy, TEMPERATURE); @@ -299,17 +299,17 @@ namespace ATC { throw ATC_Error("ATC_CouplingMomentumEnergy::initialize - method only valid with fractional step time integration"); } - + ATC_Coupling::init_filter(); - - - - + + + + if (timeFilterManager_.end_equilibrate() && equilibriumStart_) { if (atomicRegulator_->coupling_mode(VELOCITY)==AtomicRegulator::FLUX || atomicRegulator_->coupling_mode(VELOCITY)==AtomicRegulator::GHOST_FLUX) // nothing needed in other cases since kinetostat force is balanced by boundary flux in FE equations atomicRegulator_->reset_lambda_contribution(nodalAtomicFieldsRoc_[VELOCITY].quantity(),VELOCITY); - + DENS_MAT powerMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity())); atomicRegulator_->reset_lambda_contribution(powerMat,TEMPERATURE); } @@ -360,7 +360,7 @@ namespace ATC { Array mask(1); mask(0) = VELOCITY; FIELD_MATS energy; - feEngine_->compute_energy(mask, + feEngine_->compute_energy(mask, fields_, physicsModel_, elementToMaterialMap_, @@ -371,7 +371,7 @@ namespace ATC { potentialEnergy *= mvv2e; // convert to LAMMPS units return potentialEnergy-refPE_; } - + //-------------------------------------------------------------------- // compute_vector //-------------------------------------------------------------------- @@ -399,14 +399,14 @@ namespace ATC { Array mask(1); FIELD_MATS energy; mask(0) = TEMPERATURE; - - feEngine_->compute_energy(mask, + + feEngine_->compute_energy(mask, fields_, physicsModel_, elementToMaterialMap_, energy, &(elementMask_->quantity())); - + double phononEnergy = mvv2e * energy[TEMPERATURE].col_sum(); return phononEnergy; } @@ -435,9 +435,9 @@ namespace ATC { _keTemp_ = nodalAtomicKineticTemperature_->quantity(); if (nodalAtomicConfigurationalTemperature_) _peTemp_ = nodalAtomicConfigurationalTemperature_->quantity(); - + OUTPUT_LIST outputData; - + // base class output ATC_Method::output(); @@ -447,13 +447,13 @@ namespace ATC { } // auxiliary data - + for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) { (_tiIt_->second)->output(outputData); } atomicRegulator_->output(outputData); extrinsicModelManager_.output(outputData); - + DENS_MAT & velocity(nodalAtomicFields_[VELOCITY].set_quantity()); DENS_MAT & rhs(rhs_[VELOCITY].set_quantity()); DENS_MAT & temperature(nodalAtomicFields_[TEMPERATURE].set_quantity()); @@ -469,18 +469,18 @@ namespace ATC { feEngine_->add_global("temperature_std_dev", T_stddev); double Ta_mean = (nodalAtomicFields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_; feEngine_->add_global("atomic_temperature_mean", Ta_mean); - double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0); + double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0); feEngine_->add_global("atomic_temperature_std_dev", Ta_stddev); // different temperature measures, if appropriate if (nodalAtomicKineticTemperature_) outputData["kinetic_temperature"] = & _keTemp_; - + if (nodalAtomicConfigurationalTemperature_) { _peTemp_ *= 2; // account for full temperature outputData["configurational_temperature"] = & _peTemp_; } - + // mesh data outputData["NodalAtomicVelocity"] = &velocity; outputData["FE_Force"] = &rhs; @@ -491,10 +491,10 @@ namespace ATC { outputData["ddot_temperature"] = &ddotTemperature; outputData["NodalAtomicPower"] = &rocTemperature; outputData["fePower"] = &fePower; - + feEngine_->write_data(output_index(), fields_, & outputData); } - + // hence propagation is performed on proc 0 but not others. // The real fix is to have const data in the output list // force optional variables to reset to keep in sync diff --git a/lib/atc/ATC_CouplingMomentumEnergy.h b/lib/atc/ATC_CouplingMomentumEnergy.h index 598ee13bd7..2e0f8a8faa 100644 --- a/lib/atc/ATC_CouplingMomentumEnergy.h +++ b/lib/atc/ATC_CouplingMomentumEnergy.h @@ -25,9 +25,9 @@ namespace ATC { class ATC_CouplingMomentumEnergy : public ATC_Coupling { public: - + // constructor - ATC_CouplingMomentumEnergy(std::string groupName, + ATC_CouplingMomentumEnergy(std::string groupName, double ** & perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile, @@ -78,6 +78,6 @@ namespace ATC { // data double refPE_; }; - + }; #endif diff --git a/lib/atc/ATC_Method.cpp b/lib/atc/ATC_Method.cpp index 113d175e26..6fc8d51aa7 100644 --- a/lib/atc/ATC_Method.cpp +++ b/lib/atc/ATC_Method.cpp @@ -78,7 +78,7 @@ namespace ATC { vectorFlag_(0), sizeVector_(0), scalarVectorFreq_(0), - sizePerAtomCols_(4), + sizePerAtomCols_(4), perAtomOutput_(nullptr), perAtomArray_(perAtomArray), extScalar_(0), @@ -121,13 +121,13 @@ namespace ATC { simTime_(0.0), stepCounter_(0) { - lammpsInterface_->print_msg_once("version "+version()); + lammpsInterface_->print_msg_once("version "+version()); lammpsInterface_->set_fix_pointer(thisFix); interscaleManager_.set_lammps_data_prefix(); grow_arrays(lammpsInterface_->nmax()); feEngine_ = new FE_Engine(lammpsInterface_->world()); - + lammpsInterface_->create_compute_pe_peratom(); } @@ -164,7 +164,7 @@ namespace ATC { data[matrixName] = & nodalAtomicFieldsRoc_[thisField].set_quantity(); } } - + //-------------------------------------------------- // write_restart_file // bundle matrices that need to be saved and call @@ -172,7 +172,7 @@ namespace ATC { //-------------------------------------------------- void ATC_Method::write_restart_data(string fileName, RESTART_LIST & data) { - pack_fields(data); + pack_fields(data); feEngine_->write_restart_file(fileName,&data); } @@ -183,13 +183,13 @@ namespace ATC { //-------------------------------------------------- void ATC_Method::read_restart_data(string fileName, RESTART_LIST & data) { - pack_fields(data); + pack_fields(data); feEngine_->read_restart_file(fileName,&data); } //-------------------------------------------------- // Interactions with LAMMPS fix commands - // parse input command and pass on to finite element engine + // parse input command and pass on to finite element engine // or physics specific transfers if necessary // revert to physics-specific transfer if no command matches input // first keyword is unique to particular class @@ -199,21 +199,21 @@ namespace ATC { bool ATC_Method::modify(int narg, char **arg) { int argIdx=0; - bool match = false; - + bool match = false; + // gateways to other modules e.g. extrinsic, control, mesh // pass off to fe engine if (strcmp(arg[argIdx],"mesh")==0) { - match = feEngine_->modify(narg, arg); - if (feEngine_->has_mesh() && !meshDataInitialized_) + match = feEngine_->modify(narg, arg); + if (feEngine_->has_mesh() && !meshDataInitialized_) this->initialize_mesh_data(); } // pass off to time filter - else if (strcmp(arg[argIdx],"filter")==0) { + else if (strcmp(arg[argIdx],"filter")==0) { argIdx++; match = timeFilterManager_.modify(narg-argIdx,&arg[argIdx]); - // consistentInitialization_ = false; + // consistentInitialization_ = false; } // pass off to kernel function manager else if (strcmp(arg[argIdx],"kernel")==0) { @@ -223,11 +223,11 @@ namespace ATC { //delete kernelFunction_; //resetKernelFunction_ = true; } - kernelFunction_ = KernelFunctionMgr::instance()->function(&arg[argIdx],narg-argIdx); + kernelFunction_ = KernelFunctionMgr::instance()->function(&arg[argIdx],narg-argIdx); if (kernelFunction_) match = true; else ATC_Error("no matching kernel found"); feEngine_->set_kernel(kernelFunction_); - + accumulantMol_=&kernelAccumulantMol_; // KKM add accumulantMolGrad_=&kernelAccumulantMolGrad_; // KKM add } @@ -244,27 +244,27 @@ namespace ATC { //if (!kernelFunction_) { throw ATC_Error("on_the_fly requires a kernel function"); } if (strcmp(arg[argIdx],"off")==0) parallelConsistency_ = false; else parallelConsistency_ = true; - match = true; + match = true; } - /*! \page man_hardy_on_the_fly fix_modify AtC on_the_fly + /*! \page man_hardy_on_the_fly fix_modify AtC on_the_fly \section syntax - fix_modify AtC on_the_fly \n - bond | kernel (keyword) = specifies on-the-fly calculation of bond or + fix_modify AtC on_the_fly \n - bond | kernel (keyword) = specifies on-the-fly calculation of bond or kernel matrix elements \n - - on | off (keyword) = activate or discontinue on-the-fly mode \n + - on | off (keyword) = activate or discontinue on-the-fly mode \n \section examples fix_modify AtC on_the_fly bond on \n fix_modify AtC on_the_fly kernel \n fix_modify AtC on_the_fly kernel off \n \section description Overrides normal mode of pre-calculating and storing bond pair-to-node a -nd +nd kernel atom-to-node matrices. If activated, will calculate elements of t hese matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for future use. \n on flag is optional - if omitted, on_the_fly will be activated for the s -pecified - matrix. Can be deactivated using off flag. \n +pecified + matrix. Can be deactivated using off flag. \n \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default @@ -293,28 +293,28 @@ pecified fix_modify AtC output [text | full_text | binary | vector_components | tensor_components ] fix_modify AtC output index [step | time ] - - filename_prefix (string) = prefix for data files - - frequency (integer) = frequency of output in time-steps + - filename_prefix (string) = prefix for data files + - frequency (integer) = frequency of output in time-steps - options (keyword/s): \n text = creates text output of index, step and nodal variable values for unique nodes \n full_text = creates text output index, nodal id, step, nodal coordinates and nodal variable values for unique and image nodes \n binary = creates binary Ensight output \n vector_components = outputs vectors as scalar components \n - tensor_components = outputs tensor as scalar components + tensor_components = outputs tensor as scalar components (use this for Paraview)\n - + \section examples fix_modify AtC output heatFE 100 \n fix_modify AtC output hardyFE 1 text tensor_components \n fix_modify AtC output hardyFE 10 text binary tensor_components \n fix_modify AtC output index step \n \section description - Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data + Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data which is transfer/physics specific. Output indexed by step or time is possible. \section restrictions - \section related + \section related see \ref man_fix_atc - \section default + \section default no default format output indexed by time */ @@ -332,9 +332,9 @@ pecified Performs operation over the nodes belonging to specified nodeset and outputs resulting variable values to GLOBALS file. \section restrictions - \section related + \section related see \ref man_fix_atc - \section default + \section default none */ if (strcmp(arg[argIdx],"nodeset")==0) { @@ -356,7 +356,7 @@ pecified } } - /*! \page man_boundary_integral fix_modify AtC output boundary_integral + /*! \page man_boundary_integral fix_modify AtC output boundary_integral \section syntax fix_modify AtC output boundary_integral [field] faceset [name] - field (string) : name of hardy field @@ -367,7 +367,7 @@ pecified Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default @@ -387,17 +387,17 @@ pecified Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default none */ - else if ( (strcmp(arg[argIdx],"boundary_integral")==0) + else if ( (strcmp(arg[argIdx],"boundary_integral")==0) || (strcmp(arg[argIdx],"contour_integral")==0) ) { FacesetIntegralType type = BOUNDARY_INTEGRAL; - if (strcmp(arg[argIdx],"contour_integral")==0) + if (strcmp(arg[argIdx],"contour_integral")==0) type = CONTOUR_INTEGRAL; argIdx++; string field(arg[argIdx++]); @@ -412,7 +412,7 @@ pecified /*! \page man_output_elementset fix_modify AtC output elementset \section syntax - fix_modify AtC output volume_integral + fix_modify AtC output volume_integral - set_name (string) = name of elementset to be integrated over - fieldname (string) = name of field to integrate csum = creates nodal sum over nodes in specified nodeset \n @@ -422,9 +422,9 @@ pecified Performs volume integration of specified field over elementset and outputs resulting variable values to GLOBALS file. \section restrictions - \section related + \section related see \ref man_fix_atc - \section default + \section default none */ @@ -434,10 +434,10 @@ pecified string field(arg[argIdx++]); pair pair_name(name,string_to_field(field)); if (++argIdx < narg) { // keyword average - esetData_[pair_name] = ELEMENTSET_AVERAGE; + esetData_[pair_name] = ELEMENTSET_AVERAGE; } else { - esetData_[pair_name] = ELEMENTSET_TOTAL; + esetData_[pair_name] = ELEMENTSET_TOTAL; } match = true; } @@ -455,7 +455,7 @@ pecified outputNow_ = false; match = true; } - else + else if (strcmp(arg[argIdx],"index")==0) { argIdx++; if (strcmp(arg[argIdx],"step")==0) { outputTime_ = false; } @@ -498,10 +498,10 @@ pecified feEngine_->add_field_names(istem,inames); } feEngine_->initialize_output(rank,outputPrefix_,otypes); - if (vect_comp) + if (vect_comp) feEngine_->output_manager() ->set_option(OUTPUT_VECTOR_COMPONENTS,true); - if (tensor_comp) + if (tensor_comp) feEngine_->output_manager() ->set_option(OUTPUT_TENSOR_COMPONENTS,true); } @@ -539,11 +539,11 @@ pecified group GOLDGROUP type 1 \n fix_modify AtC add_species gold group GOLDGROUP \section description - Associates a tag with all atoms of a specified type or within a specified group. \n + Associates a tag with all atoms of a specified type or within a specified group. \n \section restrictions \section related \section default - No defaults for this command. + No defaults for this command. */ else if (strcmp(arg[argIdx],"add_species")==0) { argIdx++; @@ -554,31 +554,31 @@ pecified if (narg-argIdx == 2) { string name = arg[++argIdx]; int id = lammpsInterface_->group_bit(name); - groupList_.push_back(id); - groupNames_.push_back(tag); - } + groupList_.push_back(id); + groupNames_.push_back(tag); + } else { while (++argIdx < narg) { string name = arg[argIdx]; int id = lammpsInterface_->group_bit(name); string tag = speciesTag+"-"+name; - groupList_.push_back(id); - groupNames_.push_back(tag); + groupList_.push_back(id); + groupNames_.push_back(tag); } } } else if (strcmp(arg[argIdx],"type")==0) { if (narg-argIdx == 2) { int id = atoi(arg[++argIdx]); - typeList_.push_back(id); - typeNames_.push_back(tag); - } + typeList_.push_back(id); + typeNames_.push_back(tag); + } else { while (++argIdx < narg) { int id = atoi(arg[argIdx]); string tag = speciesTag+"_"+to_string(id); - typeList_.push_back(id); - typeNames_.push_back(tag); + typeList_.push_back(id); + typeNames_.push_back(tag); } } } @@ -588,20 +588,20 @@ pecified } // remove species from tracking - + /*! \page man_remove_species fix_modify AtC remove_species \section syntax fix_modify_AtC delete_species \n - + - = tag for tracking a species \n \section examples fix_modify AtC remove_species gold \n \section description - Removes tag designated for tracking a specified species. \n + Removes tag designated for tracking a specified species. \n \section restrictions \section related \section default - No defaults for this command. + No defaults for this command. */ else if (strcmp(arg[argIdx],"delete_species")==0) { argIdx++; @@ -609,8 +609,8 @@ pecified if (strcmp(arg[argIdx],"group")==0) { for (unsigned int j = 0; j < groupList_.size(); j++) { if (tag == groupNames_[j]) { - groupList_.erase(groupList_.begin()+j); - groupNames_.erase(groupNames_.begin()+j); + groupList_.erase(groupList_.begin()+j); + groupNames_.erase(groupNames_.begin()+j); break; } } @@ -618,8 +618,8 @@ pecified else if (strcmp(arg[argIdx],"type")==0) { for (unsigned int j = 0; j < typeList_.size(); j++) { if (tag == typeNames_[j]) { - typeList_.erase(typeList_.begin()+j); - typeNames_.erase(typeNames_.begin()+j); + typeList_.erase(typeList_.begin()+j); + typeNames_.erase(typeNames_.begin()+j); break; } } @@ -627,26 +627,26 @@ pecified else { throw ATC_Error("ATC_Method: delete_species only handles groups or types"); } match = true; - + } // add a molecule for tracking /*! \page man_add_molecule fix_modify AtC add_molecule \section syntax fix_modify_AtC add_molecule \n - + - small|large = can be small if molecule size < cutoff radius, must be large otherwise \n - = tag for tracking a species \n - - = name of group that tracking will be applied to \n + - = name of group that tracking will be applied to \n \section examples group WATERGROUP type 1 2 \n fix_modify AtC add_molecule small water WATERGROUP \n \section description - Associates a tag with all molecules corresponding to a specified group. \n + Associates a tag with all molecules corresponding to a specified group. \n \section restrictions \section related \section default - No defaults for this command. + No defaults for this command. */ else if (strcmp(arg[argIdx],"add_molecule")==0) { argIdx++; @@ -660,7 +660,7 @@ pecified throw ATC_Error("ATC_CouplingMass: Bad molecule size in add_molecule"); argIdx++; string moleculeTag = arg[argIdx]; - + argIdx++; int groupBit = lammpsInterface_->group_bit(arg[argIdx]); moleculeIds_[moleculeTag] = pair(size,groupBit); @@ -671,26 +671,26 @@ pecified /*! \page man_remove_molecule fix_modify AtC remove_molecule \section syntax fix_modify_AtC remove_molecule \n - + - = tag for tracking a molecule type \n \section examples fix_modify AtC remove_molecule water \n \section description - Removes tag designated for tracking a specified set of molecules. \n + Removes tag designated for tracking a specified set of molecules. \n \section restrictions \section related \section default - No defaults for this command. + No defaults for this command. */ else if (strcmp(arg[argIdx],"remove_molecule")==0) { argIdx++; string moleculeTag = arg[argIdx]; moleculeIds_.erase(moleculeTag); - + taggedDensMan_.erase(moleculeTag); } - - /*! \page man_boundary fix_modify AtC boundary + + /*! \page man_boundary fix_modify AtC boundary \section syntax fix_modify AtC boundary type - = type id for atoms that represent a fictitious @@ -699,11 +699,11 @@ pecified fix_modify AtC boundary type ghost_atoms \section description Command to define the atoms that represent the fictitious - boundary internal to the FE mesh. For fully overlapped MD/FE + boundary internal to the FE mesh. For fully overlapped MD/FE domains with periodic boundary conditions no boundary atoms should be defined. \section restrictions - \section default + \section default none */ else if (strcmp(arg[argIdx],"boundary")==0) { @@ -746,7 +746,7 @@ pecified \section description Enables AtC to base the region for internal atoms to be an element set. If no ghost atoms are used, all the AtC atoms must be constrained to remain - in this element set by the user, e.g., with walls. If boundary atoms are + in this element set by the user, e.g., with walls. If boundary atoms are used in conjunction with Eulerian atom maps AtC will partition all atoms of a boundary or internal type to be of type internal if they are in the internal region or to be of type boundary otherwise. @@ -772,11 +772,11 @@ pecified } } - /*! \page man_atom_weight fix_modify AtC atom_weight + /*! \page man_atom_weight fix_modify AtC atom_weight \section syntax fix_modify AtC atom_weight - = \n - value: atoms in specified group assigned constant value given \n + value: atoms in specified group assigned constant value given \n lattice: volume per atom for specified lattice type (e.g. fcc) and parameter \n element: element volume divided among atoms within element \n region: volume per atom determined based on the atom count in the MD regions and their volumes. Note: meaningful only if atoms completely fill all the regions. \n @@ -788,8 +788,8 @@ pecified fix_modify atc atom_weight read-in atm_wt_file.txt \n \section description Command for assigning the value of atomic weights used for atomic integration in - atom-continuum coupled simulations. - \section restrictions + atom-continuum coupled simulations. + \section restrictions Use of lattice option requires a lattice type and parameter is already specified. \section related \section default @@ -797,7 +797,7 @@ pecified */ else if (strcmp(arg[argIdx],"atom_weight")==0) { argIdx++; - if (strcmp(arg[argIdx],"constant")==0) { + if (strcmp(arg[argIdx],"constant")==0) { argIdx++; atomWeightType_ = USER; int groupbit = -1; @@ -850,17 +850,17 @@ pecified } } - /*! \page man_decomposition fix_modify AtC decomposition + /*! \page man_decomposition fix_modify AtC decomposition \section syntax - fix_modify AtC decomposition + fix_modify AtC decomposition - = \n - replicated_memory: nodal information replicated on each processor \n + replicated_memory: nodal information replicated on each processor \n distributed_memory: only owned nodal information on processor \n \section examples fix_modify atc decomposition distributed_memory \n \section description Command for assigning the distribution of work and memory for parallel runs. - \section restrictions + \section restrictions replicated_memory is appropriate for simulations were the number of nodes << number of atoms \section related \section default @@ -868,7 +868,7 @@ pecified */ else if (strcmp(arg[argIdx],"decomposition")==0) { argIdx++; - if (strcmp(arg[argIdx],"replicated_memory")==0) { + if (strcmp(arg[argIdx],"replicated_memory")==0) { domainDecomposition_ = REPLICATED_MEMORY; match = true; } @@ -887,7 +887,7 @@ pecified fix_modify atc write_atom_weights atm_wt_file.txt 10 \n \section description Command for writing the values of atomic weights to a specified file. - \section restrictions + \section restrictions \section related \section default */ @@ -901,13 +901,13 @@ pecified } - /*! \page man_reset_time fix_modify AtC reset_time + /*! \page man_reset_time fix_modify AtC reset_time \section syntax - fix_modify AtC reset_time + fix_modify AtC reset_time \section examples fix_modify atc reset_time 0.0 \n \section description - Resets the simulation time counter. + Resets the simulation time counter. \section restrictions \section related \section default @@ -924,7 +924,7 @@ pecified /*! \page man_reset_time fix_modify AtC kernel_bandwidth \section syntax - fix_modify AtC kernel_bandwidth + fix_modify AtC kernel_bandwidth \section examples fix_modify atc kernel_bandwidth 8 \n \section description @@ -941,7 +941,7 @@ pecified match = true; } - /*! \page man_reset_atomic_reference_positions fix_modify AtC reset_atomic_reference_positions + /*! \page man_reset_atomic_reference_positions fix_modify AtC reset_atomic_reference_positions \section syntax fix_modify AtC reset_atomic_reference_positions \section examples @@ -962,23 +962,23 @@ pecified match = true; } - /*! \page man_set fix_modify AtC set + /*! \page man_set fix_modify AtC set \section syntax fix_modify AtC set reference_potential_energy - value (double) : optional user specified zero point for PE in native LAMMPS energy units \n - - filename (string) : optional user specified string for file of nodal PE values to be read-in + - filename (string) : optional user specified string for file of nodal PE values to be read-in \section examples fix_modify AtC set reference_potential_energy \n fix_modify AtC set reference_potential_energy -0.05 \n fix_modify AtC set reference_potential_energy myPEvalues \n \section description Used to set various quantities for the post-processing algorithms. - It sets the zero point for the potential energy density using - the value provided for all nodes, or from the current - configuration of the lattice if no value is provided, or + It sets the zero point for the potential energy density using + the value provided for all nodes, or from the current + configuration of the lattice if no value is provided, or values provided within the specified filename. \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default @@ -1000,7 +1000,7 @@ pecified nodalRefPEfile_ = arg[argIdx]; readRefPE_ = true; } - } + } match = true; } } // end "set" @@ -1011,14 +1011,14 @@ pecified \section syntax fix_modify AtC atom_element_map \n - frequency (int) : frequency of updating atom-to-continuum maps based on the - current configuration - only for eulerian + current configuration - only for eulerian \section examples fix_modify atc atom_element_map eulerian 100 \section description Changes frame of reference from eulerian to lagrangian and sets the - frequency for which the map from atoms to elements is reformed and + frequency for which the map from atoms to elements is reformed and all the attendant data is recalculated. - \section restrictions + \section restrictions Cannot change map type after initialization. \section related \section default @@ -1030,11 +1030,11 @@ pecified atomToElementMapType_ = EULERIAN; argIdx++; atomToElementMapFrequency_ = atoi(arg[argIdx]); - } + } else { atomToElementMapType_ = LAGRANGIAN; atomToElementMapFrequency_ = 0; - } + } match = true; needReset_ = true; } @@ -1045,13 +1045,13 @@ pecified \section examples fix_modify AtC read_restart ATC_state \n \section description - Reads the current state of the fields from a named text-based restart + Reads the current state of the fields from a named text-based restart file. - \section restrictions + \section restrictions The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize - the fix are not saved e.g. an identical mesh containing the same atoms - will have to be recreated. + the fix are not saved e.g. an identical mesh containing the same atoms + will have to be recreated. \section related see write_restart \ref man_write_restart \section default @@ -1071,13 +1071,13 @@ pecified fix_modify AtC write_restart restart.mydata \n \section description Dumps the current state of the fields to a named text-based restart file. - This done when the command is invoked and not repeated, unlike the + This done when the command is invoked and not repeated, unlike the similar lammps command. - \section restrictions + \section restrictions The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize - the fix are not saved e.g. an identical mesh containing the same atoms - will have to be recreated. + the fix are not saved e.g. an identical mesh containing the same atoms + will have to be recreated. \section related see read_restart \ref man_read_restart \section default @@ -1091,10 +1091,10 @@ pecified match = true; } - } // end else + } // end else return match; // return to FixATC - + } //-------------------------------------------------- @@ -1142,10 +1142,10 @@ pecified //------------------------------------------------------------------- // this sets the peratom output - + void ATC_Method::update_peratom_output() { - perAtomArray_ = perAtomOutput_; + perAtomArray_ = perAtomOutput_; // copy values for (int i = 0; i < lammpsInterface_->nlocal(); i++) { for (int j = 0; j < nsd_; j++) { @@ -1170,7 +1170,7 @@ pecified void ATC_Method::adjust_xref_pbc() { - + int nlocal = lammpsInterface_->nlocal(); int xperiodic = lammpsInterface_->xperiodic(); int yperiodic = lammpsInterface_->yperiodic(); @@ -1190,11 +1190,11 @@ pecified xref_[i][0] += Xprd_; // changed = true; } - if (x[i][0] >= boxxhi) { + if (x[i][0] >= boxxhi) { xref_[i][0] -= Xprd_; // changed = true; - } - } + } + } if (yperiodic) { if (x[i][1] < boxylo) { @@ -1204,8 +1204,8 @@ pecified if (x[i][1] >= boxyhi) { xref_[i][1] -= Yprd_; // changed = true; - } - } + } + } if (zperiodic) { if (x[i][2] < boxzlo) { @@ -1215,8 +1215,8 @@ pecified if (x[i][2] >= boxzhi) { xref_[i][2] -= Zprd_; // changed = true; - } - } + } + } } // propagate reset if needed @@ -1232,7 +1232,7 @@ pecified } //------------------------------------------------------------------- void ATC_Method::initialize() - { + { feEngine_->partition_mesh(); // initialized_ is set to true by derived class initialize() // localStep_ is a counter within a run or minimize @@ -1249,7 +1249,7 @@ pecified // 1c) periodicity and box bounds/lengths if (!initialized_) { - + lammpsInterface_->box_periodicity(periodicity[0], periodicity[1], periodicity[2]); @@ -1257,7 +1257,7 @@ pecified box_bounds[0][1],box_bounds[1][1], box_bounds[0][2],box_bounds[1][2]); for (int k = 0; k < nsd_; k++) { - box_length[k] = box_bounds[1][k] - box_bounds[0][k]; + box_length[k] = box_bounds[1][k] - box_bounds[0][k]; } lammpsInterface_->set_reference_box(); @@ -1292,7 +1292,7 @@ pecified xref_[i][j] = x[i][j]; } } - + // re-write non-ghosts' xref with values from a file if (readXref_) { bool success = read_atomic_ref_positions(xRefFile_.c_str()); @@ -1302,7 +1302,7 @@ pecified } // ensure initial configuration is consistent with element set - + if (internalElementSet_.size() && groupbitGhost_) { int *mask = lammpsInterface_->atom_mask(); int nlocal = lammpsInterface_->nlocal(); @@ -1349,7 +1349,7 @@ pecified // STEP 5) construct dependency-managed data // 5b) all other transfer operators // needs to be done before every run in case options have changed or the atoms have been changed by the user - + if (this->reset_methods()) { // construct all the needed data structures this->construct_transfers(); @@ -1359,7 +1359,7 @@ pecified } // reset all computes invoked flags and lammps data interscaleManager_.lammps_force_reset(); - + // STEP 6) initialize data // 6b) size quantities which use pack_comm interscaleManager_.size_comm_quantities(); @@ -1368,12 +1368,12 @@ pecified if (!initialized_) { // FE_Engine allocates all required memory // assume initial atomic position is the reference position for now - + // \int_\Omega N_I dV : static if the mesh is NodeVolumes_.reset(nNodes_,nNodes_); invNodeVolumes_.reset(nNodes_,nNodes_); feEngine_->compute_lumped_mass_matrix(NodeVolumes_); - invNodeVolumes_.set_quantity() = NodeVolumes_.inv(); + invNodeVolumes_.set_quantity() = NodeVolumes_.inv(); } atomVolume_->set_reset(); @@ -1388,7 +1388,7 @@ pecified for (int i = 0; i < nNodes_; ++i) { massMatInv_(i,i) = 1./massMatInv_(i,i); } - + // clear need for resets needReset_ = false; @@ -1410,10 +1410,10 @@ pecified void ATC_Method::set_computational_geometry() { // set positions used for coarse-graining operators - - - - + + + + if (!initialized_) { if (atomToElementMapType_ == EULERIAN) { FundamentalAtomQuantity * atomPositionsAll = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,ALL); @@ -1444,7 +1444,7 @@ pecified atomProcGhostCoarseGrainingPositions_ = myAtomPositions; interscaleManager_.add_per_atom_quantity(myAtomPositions, "AtomicProcGhostCoarseGrainingPositions"); - } + } } else { XrefWrapper * myAtomPositions = new XrefWrapper(this); @@ -1481,7 +1481,7 @@ pecified //------------------------------------------------------------------- void ATC_Method::construct_methods() { - + if (this->reset_methods()) { if (atomTimeIntegrator_) delete atomTimeIntegrator_; if (integrateInternalAtoms_) { @@ -1672,7 +1672,7 @@ pecified } } } - + //------------------------------------------------------------------- void ATC_Method::set_reference_potential_energy(void) { @@ -1716,7 +1716,7 @@ pecified } } //------------------------------------------------------------------- - + //================================================================= // memory management and processor information exchange @@ -1724,18 +1724,18 @@ pecified //----------------------------------------------------------------- - // number of doubles + // number of doubles //----------------------------------------------------------------- int ATC_Method::doubles_per_atom() const { - + int doubles = 4; doubles += interscaleManager_.memory_usage(); return doubles; } //----------------------------------------------------------------- - // memory usage of local atom-based arrays + // memory usage of local atom-based arrays //----------------------------------------------------------------- int ATC_Method::memory_usage() { @@ -1745,20 +1745,20 @@ pecified } //----------------------------------------------------------------- - // allocate local atom-based arrays + // allocate local atom-based arrays //----------------------------------------------------------------- void ATC_Method::grow_arrays(int nmax) { xref_ = lammpsInterface_->grow_2d_double_array(xref_,nmax,3,"fix_atc:xref"); - perAtomOutput_ = + perAtomOutput_ = lammpsInterface_->grow_2d_double_array(perAtomOutput_,nmax,sizePerAtomCols_,"fix_atc:perAtomOutput"); interscaleManager_.grow_arrays(nmax); } //----------------------------------------------------------------- - // copy values within local atom-based arrays + // copy values within local atom-based arrays //----------------------------------------------------------------- void ATC_Method::copy_arrays(int i, int j) { @@ -1773,14 +1773,14 @@ pecified } //----------------------------------------------------------------- - // pack values in local atom-based arrays for exchange with another proc + // pack values in local atom-based arrays for exchange with another proc //----------------------------------------------------------------- int ATC_Method::pack_exchange(int i, double *buf) { - buf[0] = xref_[i][0]; - buf[1] = xref_[i][1]; - buf[2] = xref_[i][2]; - + buf[0] = xref_[i][0]; + buf[1] = xref_[i][1]; + buf[2] = xref_[i][2]; + int j = 4; for (int ii = 0 ; ii < sizePerAtomCols_ ; ii++ ) { buf[j++] = perAtomOutput_[i][ii]; @@ -1790,7 +1790,7 @@ pecified } //----------------------------------------------------------------- - // unpack values in local atom-based arrays from exchange with another proc + // unpack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- int ATC_Method::unpack_exchange(int nlocal, double *buf) { @@ -1807,9 +1807,9 @@ pecified } //----------------------------------------------------------------- - // pack values in local atom-based arrays from exchange with another proc + // pack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- - int ATC_Method::pack_comm(int n, int *list, double *buf, + int ATC_Method::pack_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) { int i,j,m; @@ -1817,7 +1817,7 @@ pecified int * num_bond = lammpsInterface_->num_bond(); int ** bond_atom = lammpsInterface_->bond_atom(); - + m = 0; if (pbc_flag == 0) { for (i = 0; i < n; i++) { @@ -1825,7 +1825,7 @@ pecified buf[m++] = xref_[j][0]; buf[m++] = xref_[j][1]; buf[m++] = xref_[j][2]; - + if (num_bond) { buf[m++] = num_bond[j]; for (int ii = 0; ii < lammpsInterface_->bond_per_atom(); ii++) { @@ -1833,13 +1833,13 @@ pecified } } } - } + } else { if (lammpsInterface_->domain_triclinic() == 0) { dx = pbc[0]*Xprd_; dy = pbc[1]*Yprd_; dz = pbc[2]*Zprd_; - } + } else { dx = pbc[0]*Xprd_ + pbc[5]*XY_ + pbc[4]*XZ_; dy = pbc[1]*Yprd_ + pbc[3]*YZ_; @@ -1864,7 +1864,7 @@ pecified } //----------------------------------------------------------------- - // unpack values in local atom-based arrays from exchange with another proc + // unpack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- void ATC_Method::unpack_comm(int n, int first, double *buf) { @@ -1879,7 +1879,7 @@ pecified xref_[i][0] = buf[m++]; xref_[i][1] = buf[m++]; xref_[i][2] = buf[m++]; - + if (num_bond) { num_bond[i] = static_cast(buf[m++]); for (int ii = 0; ii < lammpsInterface_->bond_per_atom(); ii++) { @@ -1896,7 +1896,7 @@ pecified int ATC_Method::comm_forward() { int size = 3; - if (lammpsInterface_->num_bond()) + if (lammpsInterface_->num_bond()) { size += lammpsInterface_->bond_per_atom()+1; } return size; } @@ -1909,7 +1909,7 @@ pecified nLocalTotal_ = lammpsInterface_->nlocal(); const int * mask = lammpsInterface_->atom_mask(); nLocal_ = 0; - nLocalGhost_ = 0; + nLocalGhost_ = 0; for (int i = 0; i < nLocalTotal_; ++i) { if (mask[i] & groupbit_) nLocal_++; @@ -1917,12 +1917,12 @@ pecified } // set up internal & ghost maps - + if (nLocal_>0) { // set map internalToAtom_.resize(nLocal_); int j = 0; - // construct internalToAtom map + // construct internalToAtom map // : internal index -> local lammps atom index for (int i = 0; i < nLocalTotal_; ++i) { if (mask[i] & groupbit_) internalToAtom_(j++) = i; @@ -1968,7 +1968,7 @@ pecified atomProcGhostCoarseGrainingPositions_->unfix_quantity(); atomProcGhostCoarseGrainingPositions_->quantity(); atomProcGhostCoarseGrainingPositions_->fix_quantity(); - } + } } //----------------------------------------------------------------- @@ -1978,11 +1978,11 @@ pecified { int nlocal = lammpsInterface_->nlocal(); int nlocalmax; - LammpsInterface::instance()->int_allmax(&nlocal,&nlocalmax); + LammpsInterface::instance()->int_allmax(&nlocal,&nlocalmax); int natoms = int(lammpsInterface_->natoms()); ofstream out; const char* fname = &filename[0]; - + // create tag to local id map for this processor map id2tag; map ::const_iterator itr; @@ -2008,7 +2008,7 @@ pecified out << id2tag[i] << " " << atomicVolumeMatrix(i,i) << "\n"; } } - + if (nprocs > 1) { int max_size,send_size; send_size = nlocal; @@ -2022,7 +2022,7 @@ pecified LammpsInterface::instance()->recv(buf,max_size,iproc); for (int i = 0; i < max_size; i++) { out << intbuf[i] << " " << buf[i] << "\n"; - } + } } delete[] intbuf; delete[] buf; @@ -2039,25 +2039,25 @@ pecified delete[] buf; } } - - if (comm_rank == 0) { + + if (comm_rank == 0) { out.close(); - } + } } - + //----------------------------------------------------------------- // //----------------------------------------------------------------- void ATC_Method::compute_consistent_md_mass_matrix(const SPAR_MAT & shapeFunctionMatrix, SPAR_MAT & mdMassMatrix) const { - + int nCols = shapeFunctionMatrix.nCols(); DENS_MAT massMatrixLocal(nCols,nCols); DENS_MAT denseMdMassMatrix(nCols,nCols); if (nLocal_>0) massMatrixLocal = shapeFunctionMatrix.transMat(shapeFunctionMatrix); - + lammpsInterface_->allsum(massMatrixLocal.ptr(), denseMdMassMatrix.ptr(), denseMdMassMatrix.size()); @@ -2068,10 +2068,10 @@ pecified // Interscale operators //================================================================= // in the spirit of the current design of ATC: atoms local, nodes global - - - - + + + + bool ATC_Method::nodal_influence(const int groupbit, set & nset, set & aset, double tol) { @@ -2091,7 +2091,7 @@ pecified DENS_MAT influence(nNodes_,1); DENS_MAT atomInfluence(natoms,1); const int *mask = lammpsInterface_->atom_mask(); - for (int i = 0; i < natoms; i++) { + for (int i = 0; i < natoms; i++) { if (mask[amap(i)] & groupbit) { atomInfluence(i,0) = 1; aset.insert(i); @@ -2102,7 +2102,7 @@ pecified restrict_volumetric_quantity(atomInfluence,influence,(interscaleManager_.per_atom_sparse_matrix("InterpolantGhost"))->quantity()); } else { - restrict_volumetric_quantity(atomInfluence,influence); + restrict_volumetric_quantity(atomInfluence,influence); } DENS_MAT localInfluence = influence; @@ -2110,7 +2110,7 @@ pecified influence.ptr(), influence.size()); - for (int i = 0; i < nNodes_; i++) { + for (int i = 0; i < nNodes_; i++) { if (fabs(influence(i,0)) > tol) { nset.insert(i); } } return aset.size(); @@ -2123,11 +2123,11 @@ pecified const SPAR_MAT & shpFcn) { // computes nodeData = N*DeltaVAtom*atomData where N are the shape functions - DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols()); + DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols()); //DENS_MAT workNodeArray; - if (atomData.nRows() > 0) { // or shpFcn_??? + if (atomData.nRows() > 0) { // or shpFcn_??? workNodeArray = shpFcn.transMat(atomData); } int count = nodeData.nRows()*nodeData.nCols(); @@ -2170,7 +2170,7 @@ pecified // } } //-------------------------------------------------------- - void ATC_Method::compute_nodeset_output(void) + void ATC_Method::compute_nodeset_output(void) { map< pair , NodesetOperationType >::const_iterator iter; for (iter = nsetData_.begin(); iter != nsetData_.end();iter++){ @@ -2223,7 +2223,7 @@ pecified } } //-------------------------------------------------------- - void ATC_Method::compute_elementset_output(void) + void ATC_Method::compute_elementset_output(void) { map< pair , ElementsetOperationType >::const_iterator iter; for (iter = esetData_.begin(); iter != esetData_.end();iter++){ @@ -2253,7 +2253,7 @@ pecified //================================================================= - // + // //================================================================= //-------------------------------------------------------- bool ATC_Method::read_atomic_ref_positions(const char * filename) @@ -2284,12 +2284,12 @@ pecified in.getline(line,lineSize); // header in.getline(line,lineSize); // blank line in >> natoms; - stringstream ss; + stringstream ss; ss << "found " << natoms << " atoms in reference " << filename ; while(in.good()) { in.getline(line,lineSize); string str(line); - int pos = str.find("Atoms"); + int pos = str.find("Atoms"); if (pos > -1) { in.getline(line,lineSize); // blank line break; @@ -2306,7 +2306,7 @@ pecified ss << " style:atomic"; style = LammpsInterface::ATOMIC_STYLE; break; - // charge: id type q x y z + // charge: id type q x y z // molecule : id molecule-ID type x y z case 6: ss << " style:charge"; @@ -2317,7 +2317,7 @@ pecified ss << " style:full"; style = LammpsInterface::FULL_STYLE; break; - default: + default: throw ATC_Error("cannot determine atom style, columns:"+to_string(ncols)); break; } @@ -2328,11 +2328,11 @@ pecified // read atoms and assign if (LammpsInterface::instance()->rank_zero()) { - in.open(filename); + in.open(filename); while(in.good()) { in.getline(line,lineSize); string str(line); - int pos = str.find("Atoms"); + int pos = str.find("Atoms"); if (pos > -1) { in.getline(line,lineSize); // blank line break; @@ -2345,12 +2345,12 @@ pecified if (LammpsInterface::instance()->rank_zero()) { in.getline(line,lineSize); stringstream ss (line,stringstream::in | stringstream::out); - if (style == LammpsInterface::CHARGE_STYLE) - ss >> tag >> type >> q >> x[0] >> x[1] >> x[2]; - else if (style == LammpsInterface::FULL_STYLE) - ss >> tag >> mId >> type >> q >> x[0] >> x[1] >> x[2]; + if (style == LammpsInterface::CHARGE_STYLE) + ss >> tag >> type >> q >> x[0] >> x[1] >> x[2]; + else if (style == LammpsInterface::FULL_STYLE) + ss >> tag >> mId >> type >> q >> x[0] >> x[1] >> x[2]; else - ss >> tag >> type >> x[0] >> x[1] >> x[2]; + ss >> tag >> type >> x[0] >> x[1] >> x[2]; nread++; } LammpsInterface::instance()->int_broadcast(&nread); @@ -2367,21 +2367,21 @@ pecified } if (LammpsInterface::instance()->rank_zero()) { in.close(); - stringstream ss; + stringstream ss; ss << "read " << natoms << " reference positions"; LammpsInterface::instance()->print_msg(ss.str()); } - if (count != nlocal) + if (count != nlocal) throw ATC_Error("reset "+to_string(count)+" atoms vs "+to_string(nlocal)); return true; - } + } //-------------------------------------------------------- void ATC_Method::remap_ghost_ref_positions(void) { - + int nlocal = lammpsInterface_->nlocal(); int nghost = lammpsInterface_->nghost(); @@ -2406,26 +2406,26 @@ pecified for (int i = 0; i < nlocal; ++i) { tag2id[atom_tag[i]] = i; } - + // loop over ghosts double ** x = lammpsInterface_->xatom(); for (int j = nlocal; j < nlocal + nghost; j++) { int tag = atom_tag[j]; int i = tag2id[tag]; //itr = tag2id.find(tag); - //if (itr != tag2id.end()) + //if (itr != tag2id.end()) double* xj = x[j]; double* Xj = xref_[j]; //double Xj[3]; double* Xi = xref_[i]; - // the assumption is that xref_[j] has been shuffled + // the assumption is that xref_[j] has been shuffled // so make an image of xref_[i] that is close to x[j] - if (xj[0] <= xlo) Xj[0] = Xi[0] -Lx; - if (xj[0] >= xhi) Xj[0] = Xi[0] +Lx; - if (xj[1] <= ylo) Xj[1] = Xi[1] -Ly; - if (xj[1] >= yhi) Xj[1] = Xi[1] +Ly; + if (xj[0] <= xlo) Xj[0] = Xi[0] -Lx; + if (xj[0] >= xhi) Xj[0] = Xi[0] +Lx; + if (xj[1] <= ylo) Xj[1] = Xi[1] -Ly; + if (xj[1] >= yhi) Xj[1] = Xi[1] +Ly; if (xj[2] <= zlo) Xj[2] = Xi[2] -Lz; - if (xj[2] >= zhi) Xj[2] = Xi[2] +Lz; + if (xj[2] >= zhi) Xj[2] = Xi[2] +Lz; } } }; diff --git a/lib/atc/ATC_Method.h b/lib/atc/ATC_Method.h index 0779990a99..f070258e5d 100644 --- a/lib/atc/ATC_Method.h +++ b/lib/atc/ATC_Method.h @@ -66,12 +66,12 @@ namespace ATC { /** Predictor phase, executed before Verlet */ virtual void pre_init_integrate() { - feEngine_->partition_mesh(); + feEngine_->partition_mesh(); update_step(); }; /** Predictor phase, Verlet first step for velocity and position */ - virtual void init_integrate(); + virtual void init_integrate(); /** Predictor phase, executed after Verlet */ virtual void post_init_integrate(); @@ -127,7 +127,7 @@ namespace ATC { /** access to interscale manager */ InterscaleManager & interscale_manager() {return interscaleManager_;}; /** access to lammps interface */ - + LammpsInterface const * lammps_interface() const {return lammpsInterface_;}; /** access to time filter */ TimeFilterManager * time_filter_manager() {return &timeFilterManager_;}; @@ -142,7 +142,7 @@ namespace ATC { /** compute vector for output */ virtual double compute_vector(int /* n */) {return 0.;} /** compute vector for output */ - virtual double compute_array(int /* irow */, int /* icol */) {return 0.;}; + virtual double compute_array(int /* irow */, int /* icol */) {return 0.;}; int scalar_flag() const {return scalarFlag_;} int vector_flag() const {return vectorFlag_;} int size_vector() const {return sizeVector_;} @@ -164,16 +164,16 @@ namespace ATC { /** time/step functions */ bool sample_now(void) const - { + { int s = step(); bool now = ( (sampleFrequency_ > 0) && (s % sampleFrequency_ == 0)); return now; } bool output_now(void) const - { + { int s = step(); - bool now = ( (outputFrequency_ > 0) && (s == 1 || s % outputFrequency_ == 0) ); + bool now = ( (outputFrequency_ > 0) && (s == 1 || s % outputFrequency_ == 0) ); now = now || outputNow_; return now; } @@ -328,7 +328,7 @@ namespace ATC { const std::map > & molecule_ids() const {return moleculeIds_;}; /** access to internal element set */ const std::string & internal_element_set() {return internalElementSet_;}; - + //---------------------------------------------------------------- /** \name mass matrix operations */ @@ -339,7 +339,7 @@ namespace ATC { // inverted using GMRES void apply_inverse_mass_matrix(MATRIX & data, FieldName thisField) { - + if (useConsistentMassMatrix_(thisField)) { //data = consistentMassInverse_*data; data = (consistentMassMatsInv_[thisField].quantity())*data; @@ -351,7 +351,7 @@ namespace ATC { void apply_inverse_mass_matrix(const MATRIX & data_in, MATRIX & data_out, FieldName thisField) { - if (useConsistentMassMatrix_(thisField)) { + if (useConsistentMassMatrix_(thisField)) { //data_out = consistentMassInverse_*data_in; data_out = (consistentMassMatsInv_[thisField].quantity())*data_in; return; @@ -365,7 +365,7 @@ namespace ATC { DIAG_MAN &mass_mat(FieldName thisField) { return massMats_[thisField];}; - + //--------------------------------------------------------------- /** \name mass matrices */ @@ -383,13 +383,13 @@ namespace ATC { void register_mass_matrix_dependency(DependencyManager * dependent, FieldName thisField) { - if (useConsistentMassMatrix_(thisField)) { + if (useConsistentMassMatrix_(thisField)) { consistentMassMatsInv_[thisField].register_dependence(dependent); return; } massMatsInv_[thisField].register_dependence(dependent); }; - + void apply_inverse_md_mass_matrix(MATRIX & data, FieldName thisField) { data = (massMatsMdInv_[thisField].quantity())*data; }; void register_md_mass_matrix_dependency(DependencyManager * dependent, @@ -416,11 +416,11 @@ namespace ATC { return man->second; }; /*@}*/ - + //---------------------------------------------------------------- /** \name Interscale operators */ //---------------------------------------------------------------- - bool use_md_mass_normalization() const { return mdMassNormalization_;} + bool use_md_mass_normalization() const { return mdMassNormalization_;} bool kernel_based() { return kernelBased_; } bool kernel_on_the_fly() const { return kernelOnTheFly_;} bool has_kernel_function() { return kernelFunction_ != nullptr; } @@ -439,20 +439,20 @@ namespace ATC { double ke_scale() { return keScale_; } double pe_scale() { return peScale_; } - + /** from a atom group, find the nodes that have non-zero shape function contributions */ bool nodal_influence(const int groupbit, std::set& nset, std::set& aset, double tol =1.e-8); - int nodal_influence(const int groupbit, std::set& nset, std::set& aset, + int nodal_influence(const int groupbit, std::set& nset, std::set& aset, bool ghost, double tol =1.e-8); /*@{*/ - + /** Restrict based on atomic volume integration for volumetric quantities : given w_\alpha, w_I = \sum_\alpha N_{I\alpha} w_\alpha */ void restrict_volumetric_quantity(const MATRIX &atomData, - MATRIX &nodeData); + MATRIX &nodeData); void restrict_volumetric_quantity(const MATRIX &atomData, MATRIX &nodeData, const SPAR_MAT & shpFcn); @@ -474,7 +474,7 @@ namespace ATC { protected: /** methods */ /** time functions */ void set_time(double t=0) {simTime_=t;}; - void update_time(double alpha = 1.0) + void update_time(double alpha = 1.0) { double dt = lammpsInterface_->dt(); simTime_ += alpha*dt; @@ -506,7 +506,7 @@ namespace ATC { virtual void read_restart_data(std::string fileName_, RESTART_LIST & data); virtual void write_restart_data(std::string fileName_, RESTART_LIST & data); - void pack_fields(RESTART_LIST & data); + void pack_fields(RESTART_LIST & data); /** mass matrices */ DIAG_MAT massMatInv_; @@ -564,11 +564,11 @@ namespace ATC { void reset_fields(); - private: /** methods */ + private: /** methods */ ATC_Method(); // do not define protected: /** data */ - + /* parsed input requires changes */ bool needReset_; @@ -609,7 +609,7 @@ namespace ATC { PerAtomQuantity * atomProcGhostCoarseGrainingPositions_; PerAtomQuantity * atomReferencePositions_; - + /** number of unique FE nodes */ int nNodes_; @@ -631,17 +631,17 @@ namespace ATC { bool trackDisplacement_; /** map from reference positions to element id, pointer is to internal only */ - + bool needsAtomToElementMap_; PerAtomQuantity * atomElement_; PerAtomQuantity * atomGhostElement_; /* use element sets to define internal and/or ghost regions */ std::string internalElementSet_; - + /** atomic ATC material tag */ - - + + double Xprd_,Yprd_,Zprd_; // lengths of periodic box in reference frame double XY_,YZ_,XZ_; double boxXlo_,boxXhi_; // lo/hi bounds of periodic box in reference frame @@ -671,22 +671,22 @@ namespace ATC { /** base name for output files */ std::string outputPrefix_; - /** output flag */ - + /** output flag */ + bool outputNow_; /** output time or step (for lammps compatibility) */ bool outputTime_; - + /** output frequency */ int outputFrequency_; - + /** sample frequency */ int sampleFrequency_; - + /** sample counter */ int sampleCounter_; - TAG_FIELDS filteredData_; + TAG_FIELDS filteredData_; double peScale_,keScale_; @@ -702,7 +702,7 @@ namespace ATC { int sizeVector_; // N = size of global vector int scalarVectorFreq_; // frequency compute s/v data is available at int sizePerAtomCols_; // N = size of per atom vector to dump - + double **perAtomOutput_; // per atom data double **&perAtomArray_; // per atom data int extScalar_; // 0/1 if scalar is intensive/extensive @@ -724,15 +724,15 @@ namespace ATC { /** \name time integration and filtering fields */ //--------------------------------------------------------------- /*@{*/ - - FIELDS dot_fields_; + + FIELDS dot_fields_; FIELDS ddot_fields_; FIELDS dddot_fields_; /** Restricted Fields */ FIELDS nodalAtomicFields_; // replaces fieldNdFiltered_ - FIELDS nodalAtomicFieldsRoc_; + FIELDS nodalAtomicFieldsRoc_; /*@}*/ @@ -740,9 +740,9 @@ namespace ATC { /** \name quadrature weights */ //--------------------------------------------------------------- /*@{*/ - - DIAG_MAT NodeVolumes_; - DIAG_MAN invNodeVolumes_; + + DIAG_MAT NodeVolumes_; + DIAG_MAN invNodeVolumes_; /** atomic quadrature integration weights (V_\alpha) */ ProtectedAtomDiagonalMatrix * atomVolume_; std::string atomicWeightsFile_; @@ -770,7 +770,7 @@ namespace ATC { bool needProcGhost_; std::string groupTag_; std::string groupTagGhost_; - + /** number of atoms of correct type, ghosts are atoms outside our domain of interest boundary are atoms contributing to boundary flux terms */ @@ -824,7 +824,7 @@ namespace ATC { SPAR_MAN kernelAccumulantMol_; // KKM add SPAR_MAN kernelAccumulantMolGrad_; // KKM add DIAG_MAN* accumulantWeights_; - DIAG_MAN* accumulantInverseVolumes_; + DIAG_MAN* accumulantInverseVolumes_; int accumulantBandwidth_; /*@}*/ @@ -845,7 +845,7 @@ namespace ATC { //--------------------------------------------------------------- - /** \name reference data */ + /** \name reference data */ //--------------------------------------------------------------- bool hasRefPE_; bool setRefPE_; diff --git a/lib/atc/ATC_Transfer.cpp b/lib/atc/ATC_Transfer.cpp index a9e87e3ff9..5ea7f1233a 100644 --- a/lib/atc/ATC_Transfer.cpp +++ b/lib/atc/ATC_Transfer.cpp @@ -68,7 +68,7 @@ namespace ATC { LAMMPS_NS::Fix * thisFix, string matParamFile) : ATC_Method(groupName,perAtomArray,thisFix), - xPointer_(nullptr), + xPointer_(nullptr), outputStepZero_(true), neighborReset_(false), pairMap_(nullptr), @@ -95,7 +95,7 @@ namespace ATC { lmp->lattice(cb.cell_vectors, cb.basis_vectors); cb.inv_atom_volume = 1.0 / lmp->volume_per_atom(); cb.e2mvv = 1.0 / lmp->mvv2e(); - cb.atom_mass = lmp->atom_mass(1); + cb.atom_mass = lmp->atom_mass(1); cb.boltzmann = lmp->boltz(); cb.hbar = lmp->hbar(); cauchyBornStress_ = new StressCauchyBorn(fileId, cb); @@ -103,7 +103,7 @@ namespace ATC { // Defaults set_time(); - + outputFlags_.reset(NUM_TOTAL_FIELDS); outputFlags_ = false; fieldFlags_.reset(NUM_TOTAL_FIELDS); @@ -117,20 +117,20 @@ namespace ATC { for (int i = 0; i < NUM_TOTAL_FIELDS; i++) { outputFields_[i] = nullptr; } // Hardy requires ref positions for processor ghosts for bond list - + //needXrefProcessorGhosts_ = true; } //------------------------------------------------------------------- ATC_Transfer::~ATC_Transfer() { - interscaleManager_.clear(); - if (cauchyBornStress_) delete cauchyBornStress_; + interscaleManager_.clear(); + if (cauchyBornStress_) delete cauchyBornStress_; } //------------------------------------------------------------------- // called before the beginning of a "run" - void ATC_Transfer::initialize() + void ATC_Transfer::initialize() { if (kernelOnTheFly_ && !readRefPE_ && !setRefPEvalue_) { if (setRefPE_) { @@ -143,7 +143,7 @@ namespace ATC { ATC_Method::initialize(); - if (!initialized_) { + if (!initialized_) { if (cauchyBornStress_) cauchyBornStress_->initialize(); } @@ -164,16 +164,16 @@ namespace ATC { ghostManager_.initialize(); // initialize bond matrix B_Iab - if ((! bondOnTheFly_) - && ( ( fieldFlags_(STRESS) - || fieldFlags_(ESHELBY_STRESS) + if ((! bondOnTheFly_) + && ( ( fieldFlags_(STRESS) + || fieldFlags_(ESHELBY_STRESS) || fieldFlags_(HEAT_FLUX) ) ) ) { try { - compute_bond_matrix(); - } - catch(bad_alloc&) { + compute_bond_matrix(); + } + catch(bad_alloc&) { ATC::LammpsInterface::instance()->print_msg("stress/heat_flux will be computed on-the-fly"); - + bondOnTheFly_ = true; } } @@ -181,7 +181,7 @@ namespace ATC { // set sample frequency to output if sample has not be specified if (sampleFrequency_ == 0) sampleFrequency_ = outputFrequency_; - // output for step 0 + // output for step 0 if (!initialized_) { if (outputFrequency_ > 0) { // initialize filtered data @@ -224,9 +224,9 @@ namespace ATC { lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+sampleFrequency_); - + //remap_ghost_ref_positions(); - update_peratom_output(); + update_peratom_output(); } //------------------------------------------------------------------- @@ -242,7 +242,7 @@ namespace ATC { void ATC_Transfer::construct_time_integration_data() { if (!initialized_) { - + // size arrays for requested/required fields for(int index=0; index < NUM_TOTAL_FIELDS; ++index) { if (fieldFlags_(index)) { @@ -298,13 +298,13 @@ namespace ATC { { // interpolant if (!(kernelOnTheFly_)) { - // finite element shape functions for interpolants + // finite element shape functions for interpolants PerAtomShapeFunction * atomShapeFunctions = new PerAtomShapeFunction(this); interscaleManager_.add_per_atom_sparse_matrix(atomShapeFunctions,"Interpolant"); shpFcn_ = atomShapeFunctions; } // accummulant and weights - + this->create_atom_volume(); // accumulants if (kernelFunction_) { @@ -312,7 +312,7 @@ namespace ATC { if (kernelOnTheFly_) { ConstantQuantity * atomCount = new ConstantQuantity(this,1.); interscaleManager_.add_per_atom_quantity(atomCount,"AtomCount"); - OnTheFlyKernelAccumulation * myWeights + OnTheFlyKernelAccumulation * myWeights = new OnTheFlyKernelAccumulation(this, atomCount, kernelFunction_, atomCoarseGrainingPositions_); interscaleManager_.add_dense_matrix(myWeights, @@ -337,7 +337,7 @@ namespace ATC { if (kernelOnTheFly_) { ConstantQuantity * atomCount = new ConstantQuantity(this,1.); interscaleManager_.add_per_atom_quantity(atomCount,"AtomCount"); - OnTheFlyMeshAccumulation * myWeights + OnTheFlyMeshAccumulation * myWeights = new OnTheFlyMeshAccumulation(this, atomCount, atomCoarseGrainingPositions_); interscaleManager_.add_dense_matrix(myWeights, @@ -363,13 +363,13 @@ namespace ATC { // molecule centroid, molecule charge, dipole moment and quadrupole moment calculations KKM add if (!moleculeIds_.empty()) { map >::const_iterator molecule; - InterscaleManager & interscaleManager = this->interscale_manager(); // KKM add, may be we do not need this as interscaleManager_ already exists. + InterscaleManager & interscaleManager = this->interscale_manager(); // KKM add, may be we do not need this as interscaleManager_ already exists. PerAtomQuantity * atomProcGhostCoarseGrainingPositions_ = interscaleManager.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions"); FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,PROC_GHOST); molecule = moleculeIds_.begin(); int groupbit = (molecule->second).second; smallMoleculeSet_ = new SmallMoleculeSet(this,groupbit); - smallMoleculeSet_->initialize(); // KKM add, why should we? + smallMoleculeSet_->initialize(); // KKM add, why should we? interscaleManager_.add_small_molecule_set(smallMoleculeSet_,"MoleculeSet"); moleculeCentroid_ = new SmallMoleculeCentroid(this,mass,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_); interscaleManager_.add_dense_matrix(moleculeCentroid_,"MoleculeCentroid"); @@ -393,7 +393,7 @@ namespace ATC { // set pointer to positions // REFACTOR use method's handling of xref/xpointer - set_xPointer(); + set_xPointer(); ATC_Method::construct_transfers(); @@ -412,7 +412,7 @@ namespace ATC { } // for hardy-based fluxes - + bool needsBondMatrix = (! bondOnTheFly_ ) && (fieldFlags_(STRESS) || fieldFlags_(ESHELBY_STRESS) @@ -434,7 +434,7 @@ namespace ATC { const FE_Mesh * fe_mesh = feEngine_->fe_mesh(); if (!kernelBased_) { - bondMatrix_ = new BondMatrixPartitionOfUnity(lammpsInterface_,*pairMap_,xPointer_,fe_mesh,accumulantInverseVolumes_); + bondMatrix_ = new BondMatrixPartitionOfUnity(lammpsInterface_,*pairMap_,xPointer_,fe_mesh,accumulantInverseVolumes_); } else { bondMatrix_ = new BondMatrixKernel(lammpsInterface_,*pairMap_,xPointer_,fe_mesh,kernelFunction_); @@ -470,7 +470,7 @@ namespace ATC { FieldManager fmgr(this); -// for(int index=0; index < NUM_TOTAL_FIELDS; ++index) +// for(int index=0; index < NUM_TOTAL_FIELDS; ++index) for(int i=0; i < numFields_; ++i) { FieldName index = indices_[i]; if (fieldFlags_(index)) { @@ -492,9 +492,9 @@ namespace ATC { interscaleManager_.add_per_atom_quantity(c,tag); int projection = iter->second; DIAG_MAN * w = nullptr; - if (projection == VOLUME_NORMALIZATION ) + if (projection == VOLUME_NORMALIZATION ) { w = accumulantInverseVolumes_; } - else if (projection == NUMBER_NORMALIZATION ) + else if (projection == NUMBER_NORMALIZATION ) { w = accumulantWeights_; } if (kernelFunction_ && kernelOnTheFly_) { OnTheFlyKernelAccumulationNormalized * C = new OnTheFlyKernelAccumulationNormalized(this, c, kernelFunction_, atomCoarseGrainingPositions_, w); @@ -507,7 +507,7 @@ namespace ATC { outputFieldsTagged_[tag] = C; } } - + } //------------------------------------------------------------------- @@ -519,18 +519,18 @@ namespace ATC { if ((!initialized_) || timeFilterManager_.need_reset()) { timeFilters_.reset(NUM_TOTAL_FIELDS+nComputes_); sampleCounter_ = 0; - + // for filtered fields for(int index=0; index < NUM_TOTAL_FIELDS; ++index) { if (fieldFlags_(index)) { string name = field_to_string((FieldName) index); filteredData_[name] = 0.0; - timeFilters_(index) = timeFilterManager_.construct(); + timeFilters_(index) = timeFilterManager_.construct(); } } - + // for filtered projected computes - + // lists/accessing of fields ( & computes) map ::const_iterator iter; int index = NUM_TOTAL_FIELDS; @@ -546,7 +546,7 @@ namespace ATC { //------------------------------------------------------------------- // called after the end of a "run" - void ATC_Transfer::finish() + void ATC_Transfer::finish() { // base class ATC_Method::finish(); @@ -560,7 +560,7 @@ namespace ATC { int argIdx = 0; // check to see if it is a transfer class command - /*! \page man_hardy_fields fix_modify AtC fields + /*! \page man_hardy_fields fix_modify AtC fields \section syntax fix_modify AtC fields \n fix_modify AtC fields \n @@ -575,13 +575,13 @@ namespace ATC { temperature : temperature derived from the relative atomic kinetic energy (as done by ) \n kinetic_temperature : temperature derived from the full kinetic energy \n number_density : simple kernel estimation of number of atoms per unit volume \n - stress : + stress : Cauchy stress tensor for eulerian analysis (atom_element_map), or 1st Piola-Kirchhoff stress tensor for lagrangian analysis \n - transformed_stress : - 1st Piola-Kirchhoff stress tensor for eulerian analysis (atom_element_map), or + transformed_stress : + 1st Piola-Kirchhoff stress tensor for eulerian analysis (atom_element_map), or Cauchy stress tensor for lagrangian analysis \n - heat_flux : spatial heat flux vector for eulerian, + heat_flux : spatial heat flux vector for eulerian, or referential heat flux vector for lagrangian \n potential_energy : potential energy per unit volume \n kinetic_energy : kinetic energy per unit volume \n @@ -590,23 +590,23 @@ namespace ATC { energy : total energy (potential + kinetic) per unit volume \n number_density : number of atoms per unit volume \n eshelby_stress: configurational stress (energy-momentum) tensor defined by Eshelby - [References: Philos. Trans. Royal Soc. London A, Math. Phys. Sci., Vol. 244, + [References: Philos. Trans. Royal Soc. London A, Math. Phys. Sci., Vol. 244, No. 877 (1951) pp. 87-112; J. Elasticity, Vol. 5, Nos. 3-4 (1975) pp. 321-335] \n vacancy_concentration: volume fraction of vacancy content \n type_concentration: volume fraction of a specific atom type \n \section examples fix_modify AtC fields add velocity temperature \section description - Allows modification of the fields calculated and output by the + Allows modification of the fields calculated and output by the transfer class. The commands are cumulative, e.g.\n - fix_modify AtC fields none \n - followed by \n + fix_modify AtC fields none \n + followed by \n fix_modify AtC fields add velocity temperature \n will only output the velocity and temperature fields. \section restrictions Must be used with the hardy/field type of AtC fix, see \ref man_fix_atc. - Currently, the stress and heat flux formulas are only correct for - central force potentials, e.g. Lennard-Jones and EAM + Currently, the stress and heat flux formulas are only correct for + central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber. \section related See \ref man_hardy_gradients , \ref man_hardy_rates and \ref man_hardy_computes @@ -615,30 +615,30 @@ namespace ATC { */ if (strcmp(arg[argIdx],"fields")==0) { argIdx++; - if (strcmp(arg[argIdx],"all")==0) { + if (strcmp(arg[argIdx],"all")==0) { outputFlags_ = true; match = true; - } - else if (strcmp(arg[argIdx],"none")==0) { + } + else if (strcmp(arg[argIdx],"none")==0) { outputFlags_ = false; match = true; - } - else if (strcmp(arg[argIdx],"add")==0) { + } + else if (strcmp(arg[argIdx],"add")==0) { argIdx++; for (int i = argIdx; i < narg; ++i) { FieldName field_name = string_to_field(arg[i]); - outputFlags_(field_name) = true; + outputFlags_(field_name) = true; } match = true; - } - else if (strcmp(arg[argIdx],"delete")==0) { + } + else if (strcmp(arg[argIdx],"delete")==0) { argIdx++; for (int i = argIdx; i < narg; ++i) { FieldName field_name = string_to_field(arg[i]); - outputFlags_(field_name) = false; + outputFlags_(field_name) = false; } match = true; - } + } check_field_dependencies(); if (fieldFlags_(DISPLACEMENT)) { trackDisplacement_ = true; } } @@ -649,17 +649,17 @@ namespace ATC { - add | delete (keyword) = add or delete the calculation of gradients for the listed output fields \n - fields (keyword) = \n gradients can be calculated for all fields listed in \ref man_hardy_fields - + \section examples fix_modify AtC gradients add temperature velocity stress \n fix_modify AtC gradients delete velocity \n \section description Requests calculation and output of gradients of the fields from the transfer class. These gradients will be with regard to spatial or material - coordinate for eulerian or lagrangian analysis, respectively, as specified by + coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see \ref man_atom_element_map ) \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default @@ -667,33 +667,33 @@ namespace ATC { */ else if (strcmp(arg[argIdx],"gradients")==0) { argIdx++; - if (strcmp(arg[argIdx],"add")==0) { + if (strcmp(arg[argIdx],"add")==0) { argIdx++; FieldName field_name; for (int i = argIdx; i < narg; ++i) { field_name = string_to_field(arg[i]); - gradFlags_(field_name) = true; + gradFlags_(field_name) = true; } match = true; - } - else if (strcmp(arg[argIdx],"delete")==0) { + } + else if (strcmp(arg[argIdx],"delete")==0) { argIdx++; FieldName field_name; for (int i = argIdx; i < narg; ++i) { field_name = string_to_field(arg[i]); - gradFlags_(field_name) = false; + gradFlags_(field_name) = false; } match = true; - } + } } - /*! \page man_hardy_rates fix_modify AtC rates + /*! \page man_hardy_rates fix_modify AtC rates \section syntax fix_modify AtC rates \n - add | delete (keyword) = add or delete the calculation of rates (time derivatives) for the listed output fields \n - fields (keyword) = \n rates can be calculated for all fields listed in \ref man_hardy_fields - + \section examples fix_modify AtC rates add temperature velocity stress \n fix_modify AtC rates delete stress \n @@ -703,7 +703,7 @@ namespace ATC { are the partial time derivatives of the nodal fields, not the full (material) time derivatives. \n \section restrictions - Must be used with the hardy/field type of AtC fix + Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \section related \section default @@ -711,16 +711,16 @@ namespace ATC { */ else if (strcmp(arg[argIdx],"rates")==0) { argIdx++; - if (strcmp(arg[argIdx],"add")==0) { + if (strcmp(arg[argIdx],"add")==0) { argIdx++; FieldName field_name; for (int i = argIdx; i < narg; ++i) { field_name = string_to_field(arg[i]); - rateFlags_(field_name) = true; + rateFlags_(field_name) = true; } match = true; - } - else if (strcmp(arg[argIdx],"delete")==0) { + } + else if (strcmp(arg[argIdx],"delete")==0) { argIdx++; FieldName field_name; for (int i = argIdx; i < narg; ++i) { @@ -728,7 +728,7 @@ namespace ATC { rateFlags_(field_name) = false; } match = true; - } + } } @@ -736,7 +736,7 @@ namespace ATC { \section syntax fix_modify AtC pair_interactions \n fix_modify AtC bond_interactions \n - + \section examples fix_modify AtC bond_interactions on \n \section description @@ -748,27 +748,27 @@ namespace ATC { */ if (strcmp(arg[argIdx],"pair_interactions")==0) { // default true argIdx++; - if (strcmp(arg[argIdx],"on")==0) { hasPairs_ = true; } + if (strcmp(arg[argIdx],"on")==0) { hasPairs_ = true; } else { hasPairs_ = false;} match = true; - } + } if (strcmp(arg[argIdx],"bond_interactions")==0) { // default false argIdx++; - if (strcmp(arg[argIdx],"on")==0) { hasBonds_ = true; } + if (strcmp(arg[argIdx],"on")==0) { hasBonds_ = true; } else { hasBonds_ = false;} match = true; - } - - /*! \page man_hardy_computes fix_modify AtC computes + } + + /*! \page man_hardy_computes fix_modify AtC computes \section syntax fix_modify AtC computes [per-atom compute id] \n - add | delete (keyword) = add or delete the calculation of an equivalent continuum field for the specified per-atom compute as volume or number density quantity \n - - per-atom compute id = name/id for per-atom compute, + - per-atom compute id = name/id for per-atom compute, fields can be calculated for all per-atom computes available from LAMMPS \n - volume | number (keyword) = field created is a per-unit-volume quantity - or a per-atom quantity as weighted by kernel functions \n - + or a per-atom quantity as weighted by kernel functions \n + \section examples compute virial all stress/atom \n fix_modify AtC computes add virial volume \n @@ -782,24 +782,24 @@ namespace ATC { Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \n Per-atom compute must be specified before corresponding continuum field can be requested \n \section related - See manual page for compute + See manual page for compute \section default No defaults exist for this command */ else if (strcmp(arg[argIdx],"computes")==0) { argIdx++; - if (strcmp(arg[argIdx],"add")==0) { + if (strcmp(arg[argIdx],"add")==0) { argIdx++; string tag(arg[argIdx++]); int normalization = NO_NORMALIZATION; if (narg > argIdx) { - if (strcmp(arg[argIdx],"volume")==0) { + if (strcmp(arg[argIdx],"volume")==0) { normalization = VOLUME_NORMALIZATION; } - else if (strcmp(arg[argIdx],"number")==0) { + else if (strcmp(arg[argIdx],"number")==0) { normalization = NUMBER_NORMALIZATION; } - else if (strcmp(arg[argIdx],"mass")==0) { + else if (strcmp(arg[argIdx],"mass")==0) { normalization = MASS_NORMALIZATION; throw ATC_Error("mass normalized not implemented"); } @@ -807,8 +807,8 @@ namespace ATC { computes_[tag] = normalization; nComputes_++; match = true; - } - else if (strcmp(arg[argIdx],"delete")==0) { + } + else if (strcmp(arg[argIdx],"delete")==0) { argIdx++; string tag(arg[argIdx]); if (computes_.find(tag) != computes_.end()) { @@ -816,10 +816,10 @@ namespace ATC { nComputes_--; } else { - throw ATC_Error(tag+" compute is not in list"); + throw ATC_Error(tag+" compute is not in list"); } match = true; - } + } } @@ -833,7 +833,7 @@ namespace ATC { Specifies a frequency at which fields are computed for the case where time filters are being applied. \section restrictions - Must be used with the hardy/field AtC fix ( see \ref man_fix_atc ) + Must be used with the hardy/field AtC fix ( see \ref man_fix_atc ) and is only relevant when time filters are being used. \section related \section default @@ -869,11 +869,11 @@ namespace ATC { // REFACTOR move this to post_neighbor void ATC_Transfer::pre_final_integrate() { - // update time + // update time update_time(); // time uses step if dt = 0 - + if ( neighborReset_ && sample_now() ) { if (! kernelOnTheFly_ ) { if (!moleculeIds_.empty()) compute_kernel_matrix_molecule(); //KKM add @@ -889,7 +889,7 @@ namespace ATC { // compute spatially smoothed quantities double dt = lammpsInterface_->dt(); if ( sample_now() ) { - + bool needsBond = (! bondOnTheFly_ ) && (fieldFlags_(STRESS) || fieldFlags_(ESHELBY_STRESS) @@ -898,7 +898,7 @@ namespace ATC { if ( needsBond ) { if (pairMap_->need_reset()) { // ATC::LammpsInterface::instance()->print_msg("Recomputing bond matrix due to atomReset_ value"); - compute_bond_matrix(); + compute_bond_matrix(); } } time_filter_pre (dt); @@ -923,8 +923,8 @@ namespace ATC { //------------------------------------------------------------------- void ATC_Transfer::compute_fields(void) { - - // keep per-atom computes fresh. JAZ and REJ not sure why; + + // keep per-atom computes fresh. JAZ and REJ not sure why; // need to confer with JAT. (JAZ, 4/5/12) interscaleManager_.lammps_force_reset(); @@ -937,16 +937,16 @@ namespace ATC { } } - if (fieldFlags_(STRESS)) + if (fieldFlags_(STRESS)) compute_stress(hardyData_["stress"].set_quantity()); - if (fieldFlags_(HEAT_FLUX)) + if (fieldFlags_(HEAT_FLUX)) compute_heatflux(hardyData_["heat_flux"].set_quantity()); // molecule data if (fieldFlags_(DIPOLE_MOMENT)) - compute_dipole_moment(hardyData_["dipole_moment"].set_quantity()); + compute_dipole_moment(hardyData_["dipole_moment"].set_quantity()); if (fieldFlags_(QUADRUPOLE_MOMENT)) compute_quadrupole_moment(hardyData_["quadrupole_moment"].set_quantity()); - if (fieldFlags_(DISLOCATION_DENSITY)) + if (fieldFlags_(DISLOCATION_DENSITY)) compute_dislocation_density(hardyData_["dislocation_density"].set_quantity()); // (2) derived quantities @@ -963,7 +963,7 @@ namespace ATC { } } } - // compute: eshelby stress + // compute: eshelby stress if (fieldFlags_(ESHELBY_STRESS)) { { compute_eshelby_stress(hardyData_["eshelby_stress"].set_quantity(), @@ -985,18 +985,18 @@ namespace ATC { E,hardyData_["stress"].quantity(), hardyData_["displacement_gradient"].quantity()); } - // compute: cauchy born stress + // compute: cauchy born stress if (fieldFlags_(CAUCHY_BORN_STRESS)) { ATOMIC_DATA::const_iterator tfield = hardyData_.find("temperature"); const DENS_MAT *temp = tfield==hardyData_.end() ? nullptr : &((tfield->second).quantity()); cauchy_born_stress(hardyData_["displacement_gradient"].quantity(), hardyData_["cauchy_born_stress"].set_quantity(), temp); } - // compute: cauchy born energy + // compute: cauchy born energy if (fieldFlags_(CAUCHY_BORN_ENERGY)) { ATOMIC_DATA::const_iterator tfield = hardyData_.find("temperature"); const DENS_MAT *temp = tfield==hardyData_.end() ? nullptr : &((tfield->second).quantity()); - cauchy_born_energy(hardyData_["displacement_gradient"].quantity(), + cauchy_born_energy(hardyData_["displacement_gradient"].quantity(), hardyData_["cauchy_born_energy"].set_quantity(), temp); } // 1st PK transformed to cauchy (lag) or cauchy transformed to 1st PK (eul) @@ -1014,13 +1014,13 @@ namespace ATC { compute_electric_potential( hardyData_[field_to_string(ELECTRIC_POTENTIAL)].set_quantity()); } - // compute: rotation and/or stretch from deformation gradient + // compute: rotation and/or stretch from deformation gradient if (fieldFlags_(ROTATION) || fieldFlags_(STRETCH)) { compute_polar_decomposition(hardyData_["rotation"].set_quantity(), hardyData_["stretch"].set_quantity(), hardyData_["displacement_gradient"].quantity()); } - // compute: rotation and/or stretch from deformation gradient + // compute: rotation and/or stretch from deformation gradient if (fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)) { compute_elastic_deformation_gradient2(hardyData_["elastic_deformation_gradient"].set_quantity(), hardyData_["stress"].quantity(), @@ -1082,9 +1082,9 @@ namespace ATC { F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0; FT = F.transpose(); FTINV = inv(FT); - + // volumes are already reference volumes. - PK1 = CAUCHY*FTINV; + PK1 = CAUCHY*FTINV; matrix_to_vector(k,PK1,myData); } } @@ -1094,7 +1094,7 @@ namespace ATC { } #endif } - + }// end of compute_fields routine //------------------------------------------------------------------- @@ -1156,7 +1156,7 @@ namespace ATC { filteredData_[grad_field] = hardyData_[grad_field]; } } - + // lists/accessing of fields ( & computes) map ::const_iterator iter; int index = NUM_TOTAL_FIELDS; @@ -1177,7 +1177,7 @@ namespace ATC { void ATC_Transfer::output() { feEngine_->departition_mesh(); - + for(int index=0; index < NUM_TOTAL_FIELDS; ++index) { if (outputFlags_(index)) { FieldName fName = (FieldName) index; @@ -1185,7 +1185,7 @@ namespace ATC { fields_[fName] = filteredData_[name]; } } - + ATC_Method::output(); if (lammpsInterface_->comm_rank() == 0) { // data @@ -1209,7 +1209,7 @@ namespace ATC { output_data[grad_name] = & ( filteredData_[grad_name].set_quantity()); } } - + // lists/accessing of fields ( & computes) map ::const_iterator iter; for (iter = computes_.begin(); iter != computes_.end(); iter++) { @@ -1226,7 +1226,7 @@ namespace ATC { output_data["NodalInverseVolumes"] = &nodalInverseVolumes; // output - feEngine_->write_data(output_index(), & output_data); + feEngine_->write_data(output_index(), & output_data); } feEngine_->partition_mesh(); } @@ -1235,7 +1235,7 @@ namespace ATC { /////// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //------------------------------------------------------------------- - // computes nodeData = N*atomData + // computes nodeData = N*atomData void ATC_Transfer::project(const DENS_MAT & atomData, DENS_MAT & nodeData) { @@ -1290,8 +1290,8 @@ namespace ATC { void ATC_Transfer::project_count_normalized(const DENS_MAT & atomData, DENS_MAT & nodeData) { - DENS_MAT tmp; - project(atomData,tmp); + DENS_MAT tmp; + project(atomData,tmp); nodeData = (accumulantWeights_->quantity())*tmp; } @@ -1301,7 +1301,7 @@ namespace ATC { DENS_MAT & nodeData) { DENS_MAT tmp; - project(atomData,tmp); + project(atomData,tmp); nodeData = (accumulantInverseVolumes_->quantity())*tmp; } @@ -1310,8 +1310,8 @@ namespace ATC { void ATC_Transfer::project_volume_normalized_molecule(const DENS_MAT & molData, DENS_MAT & nodeData) { - DENS_MAT tmp; - project_molecule(molData,tmp); + DENS_MAT tmp; + project_molecule(molData,tmp); nodeData = (accumulantInverseVolumes_->quantity())*tmp; } @@ -1320,8 +1320,8 @@ namespace ATC { void ATC_Transfer::project_volume_normalized_molecule_gradient(const DENS_MAT & molData, DENS_MAT & nodeData) { - DENS_MAT tmp; - project_molecule_gradient(molData,tmp); + DENS_MAT tmp; + project_molecule_gradient(molData,tmp); nodeData = (accumulantInverseVolumes_->quantity())*tmp; } @@ -1354,14 +1354,14 @@ namespace ATC { //------------------------------------------------------------------- // computes "virial" part of heat flux - // This is correct ONLY for pair potentials. + // This is correct ONLY for pair potentials. void ATC_Transfer::compute_heat_matrix() { atomicHeatMatrix_ = pairHeatFlux_->quantity(); } //------------------------------------------------------------------- - // set xPointer_ to xref or xatom depending on Lagrangian/Eulerian analysis + // set xPointer_ to xref or xatom depending on Lagrangian/Eulerian analysis void ATC_Transfer::set_xPointer() { xPointer_ = xref_; @@ -1386,7 +1386,7 @@ namespace ATC { fieldFlags_(DISPLACEMENT) = true; } if (fieldFlags_(CAUCHY_BORN_STRESS) - || fieldFlags_(CAUCHY_BORN_ENERGY) + || fieldFlags_(CAUCHY_BORN_ENERGY) || fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS) || fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)) { if (! (cauchyBornStress_) ) { @@ -1419,7 +1419,7 @@ namespace ATC { fieldFlags_(KINETIC_ENERGY) = true; } if (fieldFlags_(TEMPERATURE) || fieldFlags_(HEAT_FLUX) || - fieldFlags_(KINETIC_ENERGY) || fieldFlags_(THERMAL_ENERGY) || + fieldFlags_(KINETIC_ENERGY) || fieldFlags_(THERMAL_ENERGY) || fieldFlags_(ENERGY) || fieldFlags_(INTERNAL_ENERGY) || fieldFlags_(KINETIC_ENERGY) || (fieldFlags_(STRESS) && atomToElementMapType_ == EULERIAN) ) { @@ -1438,15 +1438,15 @@ namespace ATC { fieldFlags_(NUMBER_DENSITY) = true; } - if (fieldFlags_(ROTATION) || + if (fieldFlags_(ROTATION) || fieldFlags_(STRETCH)) { fieldFlags_(DISPLACEMENT) = true; } if (fieldFlags_(ESHELBY_STRESS) - || fieldFlags_(CAUCHY_BORN_STRESS) - || fieldFlags_(CAUCHY_BORN_ENERGY) - || fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS) - || fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT) + || fieldFlags_(CAUCHY_BORN_STRESS) + || fieldFlags_(CAUCHY_BORN_ENERGY) + || fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS) + || fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT) || fieldFlags_(VACANCY_CONCENTRATION) || fieldFlags_(ROTATION) || fieldFlags_(STRETCH) ) { @@ -1459,8 +1459,8 @@ namespace ATC { throw ATC_Error("Calculation of stress field not possible with selected pair type."); } } - - } + + } //============== THIN WRAPPERS ==================================== // OBSOLETE @@ -1492,7 +1492,7 @@ namespace ATC { // calculate kinetic energy tensor part of stress for Eulerian analysis if (atomToElementMapType_ == EULERIAN && nLocal_>0) { - compute_kinetic_stress(stress); + compute_kinetic_stress(stress); } else { // zero stress table for Lagrangian analysis or if nLocal_ = 0 @@ -1511,7 +1511,7 @@ namespace ATC { compute_force_matrix(); // calculate force part of stress tensor local_potential_hardy_stress = atomicBondMatrix_*atomicForceMatrix_; - local_potential_hardy_stress *= 0.5; + local_potential_hardy_stress *= 0.5; } } // global summation of potential part of stress tensor @@ -1570,7 +1570,7 @@ namespace ATC { compute_kinetic_heatflux(flux); } else { - flux.zero(); // zero stress table for Lagrangian analysis + flux.zero(); // zero stress table for Lagrangian analysis } // add potential part of heat flux vector int nrows = flux.nRows(); @@ -1628,11 +1628,11 @@ namespace ATC { // - e^0_I v_I + \sigma^T_I v_I for (int i = 0; i < nNodes_; i++) { double e_i = energy(i,0); - flux(i,0) += (e_i + stress(i,0))*velocity(i,0) + flux(i,0) += (e_i + stress(i,0))*velocity(i,0) + stress(i,3)*velocity(i,1)+ stress(i,4)*velocity(i,2); - flux(i,1) += (e_i + stress(i,1))*velocity(i,1) + flux(i,1) += (e_i + stress(i,1))*velocity(i,1) + stress(i,3)*velocity(i,0)+ stress(i,5)*velocity(i,2); - flux(i,2) += (e_i + stress(i,2))*velocity(i,2) + flux(i,2) += (e_i + stress(i,2))*velocity(i,2) + stress(i,4)*velocity(i,0)+ stress(i,5)*velocity(i,1); } } @@ -1643,7 +1643,7 @@ namespace ATC { const DENS_MAT & rho = (restrictedCharge_->quantity()); SPAR_MAT K; feEngine_->stiffness_matrix(K); - double permittivity = lammpsInterface_->dielectric(); + double permittivity = lammpsInterface_->dielectric(); permittivity *= LammpsInterface::instance()->epsilon0(); K *= permittivity; BC_SET bcs; @@ -1670,7 +1670,7 @@ namespace ATC { for (int i = 0; i < nLocal_; i++) { int atomIdx = internalToAtom_(i); - if (type[atomIdx] != 13) { + if (type[atomIdx] != 13) { atomCnt(i,0) = myAtomicWeights(i,i); atomic_weight_sum += myAtomicWeights(i,i); number_atoms++; @@ -1725,7 +1725,7 @@ namespace ATC { #ifndef H_BASED F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0; #endif - FT = F.transpose(); + FT = F.transpose(); } else if (atomToElementMapType_ == EULERIAN) { vector_to_symm_matrix(i,S,P); @@ -1741,9 +1741,9 @@ namespace ATC { // Q stores (1-H) Q -= FT.transpose(); DENS_MAT F(3,3); - F = inv(Q); + F = inv(Q); FT = F.transpose(); - ESH = FT*ESH; + ESH = FT*ESH; } // copy to global matrix_to_vector(i,ESH,M); @@ -1761,7 +1761,7 @@ namespace ATC { DENS_MAT_VEC &h = hField[DISPLACEMENT]; h.assign(nsd_, DENS_MAT(nNodes_,nsd_)); tField.assign(nsd_, DENS_MAT(nNodes_,nsd_)); - // each row is the CB stress at a node stored in voigt form + // each row is the CB stress at a node stored in voigt form T.reset(nNodes_,FieldSizes[CAUCHY_BORN_STRESS]); const double nktv2p = lammpsInterface_->nktv2p(); const double fact = -lammpsInterface_->mvv2e()*nktv2p; @@ -1779,7 +1779,7 @@ namespace ATC { DENS_MAT S(nNodes_,6); symm_dens_mat_vec_to_vector(tField,S); S *= fact; - + // tField/S holds the 2nd P-K stress tensor. Transform to // Cauchy for EULERIAN analysis, transform to 1st P-K // for LAGRANGIAN analysis. @@ -1799,7 +1799,7 @@ namespace ATC { FT = transpose(F); double J = det(F); STRESS = F*PK2*FT; - STRESS *= 1/J; + STRESS *= 1/J; symm_matrix_to_vector(i,STRESS,T); } else{ @@ -1810,7 +1810,7 @@ namespace ATC { STRESS = F*PK2; matrix_to_vector(i,STRESS,T); } - + } } //--------------------------------------------------------------------------- @@ -1861,7 +1861,7 @@ namespace ATC { void ATC_Transfer::cauchy_born_entropic_energy(const DENS_MAT &H, DENS_MAT &E, const DENS_MAT &T) { FIELD_MATS uField; // uField should contain temperature. - uField[TEMPERATURE] = T; + uField[TEMPERATURE] = T; GRAD_FIELD_MATS hField; DENS_MAT_VEC &h = hField[DISPLACEMENT]; h.assign(nsd_, DENS_MAT(nNodes_,nsd_)); @@ -1916,13 +1916,13 @@ namespace ATC { vector_to_matrix(i,H,F); F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0; - FT = F.transpose(); + FT = F.transpose(); } // double J = det(FT); FT *= 1/J; if (atomToElementMapType_ == EULERIAN) { - FT = inv(FT); + FT = inv(FT); } S = P*FT; matrix_to_vector(i,S,stress); @@ -1933,10 +1933,10 @@ namespace ATC { DENS_MAT & stretch, const DENS_MAT & H) { DENS_MAT F(3,3),R(3,3),U(3,3); - for (int i = 0; i < nNodes_; i++) { + for (int i = 0; i < nNodes_; i++) { vector_to_matrix(i,H,F); F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0; - if (atomToElementMapType_ == EULERIAN) { + if (atomToElementMapType_ == EULERIAN) { polar_decomposition(F,R,U,false); } // F = V R else { polar_decomposition(F,R,U); } // F = R U @@ -1953,12 +1953,12 @@ namespace ATC { //-------------------------------------------------------------------- void ATC_Transfer::compute_elastic_deformation_gradient(DENS_MAT & Fe, const DENS_MAT & P, const DENS_MAT & H) - + { // calculate Fe for every node const double nktv2p = lammpsInterface_->nktv2p(); const double fact = 1.0/ ( lammpsInterface_->mvv2e()*nktv2p ); - for (int i = 0; i < nNodes_; i++) { + for (int i = 0; i < nNodes_; i++) { DENS_VEC Pv = global_vector_to_vector(i,P); Pv *= fact; CBElasticTangentOperator tangent(cauchyBornStress_, Pv); @@ -1977,11 +1977,11 @@ namespace ATC { const double nktv2p = lammpsInterface_->nktv2p(); const double fact = 1.0/ ( lammpsInterface_->mvv2e()*nktv2p ); DENS_MAT F(3,3),R(3,3),U(3,3),PP(3,3),S(3,3); - for (int i = 0; i < nNodes_; i++) { + for (int i = 0; i < nNodes_; i++) { // get F = RU vector_to_matrix(i,H,F); F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0; - if (atomToElementMapType_ == EULERIAN) { + if (atomToElementMapType_ == EULERIAN) { polar_decomposition(F,R,U,false); } // F = V R else { polar_decomposition(F,R,U); } // F = R U @@ -1989,7 +1989,7 @@ namespace ATC { vector_to_matrix(i,P,PP); //S = PP*transpose(F); S = inv(F)*PP; - + S += S.transpose(); S *= 0.5; // symmetrize DENS_VEC Sv = to_voigt(S); Sv *= fact; diff --git a/lib/atc/ATC_Transfer.h b/lib/atc/ATC_Transfer.h index 9e05b8b84b..021b549fb6 100644 --- a/lib/atc/ATC_Transfer.h +++ b/lib/atc/ATC_Transfer.h @@ -22,9 +22,9 @@ class TimeFilter; class ATC_Transfer : public ATC_Method { public: - + // constructor - ATC_Transfer(std::string groupName, + ATC_Transfer(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile = "none"); @@ -52,7 +52,7 @@ class ATC_Transfer : public ATC_Method { virtual void pre_neighbor() {ATC_Method::pre_neighbor(); neighborReset_ = true;}; /** output function */ - virtual void output(); + virtual void output(); /** external access to hardy data and other information*/ const DENS_MAT * hardy_data(std::string field) { return &hardyData_[field].quantity(); } @@ -63,25 +63,25 @@ class ATC_Transfer : public ATC_Method { double ** xPointer_; /** data */ - TAG_FIELDS hardyData_; + TAG_FIELDS hardyData_; SmallMoleculeSet * smallMoleculeSet_; // KKM add SmallMoleculeCentroid * moleculeCentroid_; // KKM add SmallMoleculeDipoleMoment * dipoleMoment_; // KKM add SmallMoleculeQuadrupoleMoment * quadrupoleMoment_; // KKM add /** container for dependency managed data */ std::vector < DENS_MAN * > outputFields_; - + std::map < std::string, DENS_MAN * > outputFieldsTagged_; DENS_MAN * restrictedCharge_; // WIP/TEMP - /** work space */ + /** work space */ DENS_MAT atomicScalar_; DENS_MAT atomicVector_; DENS_MAT atomicTensor_; /** calculation flags */ - Array fieldFlags_; + Array fieldFlags_; Array outputFlags_; Array gradFlags_; Array rateFlags_; @@ -117,7 +117,7 @@ class ATC_Transfer : public ATC_Method { void compute_heatflux(DENS_MAT & flux); /** derived quantities: compute nodal to nodal quantities */ void compute_eshelby_stress(DENS_MAT & eshebly_stress, - const DENS_MAT & energy, const DENS_MAT & stress, + const DENS_MAT & energy, const DENS_MAT & stress, const DENS_MAT & displacement_gradient); void cauchy_born_stress(const DENS_MAT &dudx, DENS_MAT &T, const DENS_MAT *temp=0); void cauchy_born_energy(const DENS_MAT &dudx, DENS_MAT &T, const DENS_MAT *temp=0); @@ -151,15 +151,15 @@ class ATC_Transfer : public ATC_Method { virtual void compute_dislocation_density(DENS_MAT & dislocation_density) = 0; /** compute smooth fields */ - void compute_fields(void); - void time_filter_pre (double dt); - void time_filter_post(double dt); + void compute_fields(void); + void time_filter_pre (double dt); + void time_filter_post(double dt); /** mapping of atomic pairs to pair index value */ - class PairMap * pairMap_; - class BondMatrix * bondMatrix_; - class PairVirial * pairVirial_; - class PairPotentialHeatFlux * pairHeatFlux_; + class PairMap * pairMap_; + class BondMatrix * bondMatrix_; + class PairVirial * pairVirial_; + class PairPotentialHeatFlux * pairHeatFlux_; /** routine to calculate matrix of force & position dyads */ void compute_force_matrix(); @@ -176,7 +176,7 @@ class ATC_Transfer : public ATC_Method { DENS_MAT & nodeData) = 0; /** routine to calculate matrix of bond functions */ - virtual void compute_bond_matrix(); + virtual void compute_bond_matrix(); /** routine to set xPointer to xref or xatom */ void set_xPointer(); @@ -200,21 +200,21 @@ class ATC_Transfer : public ATC_Method { void project_count_normalized(const DENS_MAT & atomData, DENS_MAT & nodeData); - /** hardy_project (volume density): given w_\alpha, - w_I = 1/\Omega_I \sum_\alpha N_{I\alpha} w_\alpha + /** hardy_project (volume density): given w_\alpha, + w_I = 1/\Omega_I \sum_\alpha N_{I\alpha} w_\alpha where \Omega_I = \int_{support region of node I} N_{I} dV */ // REFACTOR AtfNodeWeightedShapeFunctionRestriction void project_volume_normalized(const DENS_MAT & atomData, DENS_MAT & nodeData); void project_volume_normalized_molecule(const DENS_MAT & molData, - DENS_MAT & nodeData); // KKM add + DENS_MAT & nodeData); // KKM add void project_volume_normalized_molecule_gradient(const DENS_MAT & molData, - DENS_MAT & nodeData); // KKM add - - - /** gradient_compute: given w_I, - w_J = \sum_I N_I'{xJ} \dyad w_I - where N_I'{xJ} is the gradient of the normalized + DENS_MAT & nodeData); // KKM add + + + /** gradient_compute: given w_I, + w_J = \sum_I N_I'{xJ} \dyad w_I + where N_I'{xJ} is the gradient of the normalized shape function of node I evaluated at node J */ // REFACTOR MatToGradBySparse void gradient_compute(const DENS_MAT & inNodeData, @@ -226,7 +226,7 @@ class ATC_Transfer : public ATC_Method { /** workset data */ VectorDependencyManager * gradientMatrix_; - + SPAR_MAT atomicBondMatrix_; DENS_MAT atomicForceMatrix_; DENS_MAT atomicHeatMatrix_; @@ -247,7 +247,7 @@ class ATC_Transfer : public ATC_Method { Array timeFilters_; /** check consistency of fieldFlags_ */ - void check_field_dependencies(); + void check_field_dependencies(); }; diff --git a/lib/atc/ATC_TransferKernel.cpp b/lib/atc/ATC_TransferKernel.cpp index a4d592ba64..e09139f92c 100644 --- a/lib/atc/ATC_TransferKernel.cpp +++ b/lib/atc/ATC_TransferKernel.cpp @@ -1,4 +1,4 @@ -// ATC headers +// ATC headers #include "ATC_TransferKernel.h" #include "ATC_Error.h" #include "FE_Engine.h" @@ -44,10 +44,10 @@ using ATC_Utility::to_string; { bool match = false; - /*! \page man_hardy_kernel fix_modify AtC kernel + /*! \page man_hardy_kernel fix_modify AtC kernel \section syntax fix_modify AtC kernel - - type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, + - type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere \n - parameters :\n step = radius (double) \n @@ -62,7 +62,7 @@ using ATC_Utility::to_string; fix_modify AtC kernel cell 1.0 1.0 1.0 \n fix_modify AtC kernel quartic_sphere 10.0 \section description - + \section restrictions Must be used with the hardy AtC fix \n For bar kernel types, half-width oriented along x-direction \n @@ -92,28 +92,28 @@ using ATC_Utility::to_string; SPAR_MAT & dN(kernelAccumulantMolGrad_.set_quantity()); dN.reset(nLocalMol,nNodes_); DENS_VEC derivKer(nsd_); - DENS_VEC xI(nsd_),xm(nsd_),xmI(nsd_); + DENS_VEC xI(nsd_),xm(nsd_),xmI(nsd_); const DENS_MAT & centroidMolMatrix(moleculeCentroid_->quantity()); - ATC::LammpsInterface::instance()->stream_msg_once("computing kernel matrix molecule ",true,false); - int heartbeatFreq = (nNodes_ <= 10 ? 1 : (int) nNodes_ / 10); + ATC::LammpsInterface::instance()->stream_msg_once("computing kernel matrix molecule ",true,false); + int heartbeatFreq = (nNodes_ <= 10 ? 1 : (int) nNodes_ / 10); for (int i = 0; i < nNodes_; i++) { - if (i % heartbeatFreq == 0 ) { + if (i % heartbeatFreq == 0 ) { ATC::LammpsInterface::instance()->stream_msg_once(".",false,false); - } + } xI = (feEngine_->fe_mesh())->nodal_coordinates(i); for (int j = 0; j < nLocalMol; j++) { for (int k = 0; k < nsd_; k++) { xm(k) = centroidMolMatrix(j,k); } - xmI = xm - xI; + xmI = xm - xI; lammpsInterface_->periodicity_correction(xmI.ptr()); double val = kernelFunction_->value(xmI); if (val > 0) N.add(j,i,val); kernelFunction_->derivative(xmI,derivKer); double val_grad = derivKer(2); if (val_grad!= 0) dN.add(j,i,val_grad); - } - } + } + } // reset kernelShpFunctions with the weights of molecules on processors DENS_VEC fractions(N.nRows()); DENS_VEC fractions_deriv(dN.nRows()); @@ -126,10 +126,10 @@ using ATC_Utility::to_string; dN.compress(); if (lammpsInterface_->rank_zero()) { ATC::LammpsInterface::instance()->stream_msg_once("done",false,true); - } - } + } + } } - + //------------------------------------------------------------------- void ATC_TransferKernel::compute_projection(const DENS_MAT & atomData, DENS_MAT & nodeData) @@ -183,7 +183,7 @@ using ATC_Utility::to_string; int **firstneigh = lammpsInterface_->neighbor_list_firstneigh(); double ** xatom = lammpsInterface_->xatom(); double lam1,lam2; - double bond_value; + double bond_value; // process differently for mesh vs translation-invariant kernels ATC::LammpsInterface::instance()->stream_msg_once("computing potential stress: ",true,false); int heartbeatFreq = (nNodes_ <= 10 ? 1 : (int) nNodes_ / 10); @@ -202,7 +202,7 @@ using ATC_Utility::to_string; int inode = i; for (int j = 0; j < nLocal_; j++) { // second (neighbor) atom location - int lammps_j = internalToAtom_(j); + int lammps_j = internalToAtom_(j); xa.copy(xPointer_[lammps_j],3); // difference vector xaI = xa - xI; @@ -217,8 +217,8 @@ using ATC_Utility::to_string; kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2); // compute virial if (lam1 < lam2) { - bond_value - = kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); + bond_value + = kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); double delx = xatom[lammps_j][0] - xatom[lammps_k][0]; double dely = xatom[lammps_j][1] - xatom[lammps_k][1]; double delz = xatom[lammps_j][2] - xatom[lammps_k][2]; @@ -227,9 +227,9 @@ using ATC_Utility::to_string; lammpsInterface_->pair_force(lammps_j,lammps_k,rsq,fforce); fforce *= 0.5; // dbl count if (atomToElementMapType_ == LAGRANGIAN) { - double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; - double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; - double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; + double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; + double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; + double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; stress(inode,0) +=-delx*fforce*delX*bond_value; stress(inode,1) +=-delx*fforce*delY*bond_value; stress(inode,2) +=-delx*fforce*delZ*bond_value; @@ -266,9 +266,9 @@ using ATC_Utility::to_string; int **firstneigh = lammpsInterface_->neighbor_list_firstneigh(); double ** xatom = lammpsInterface_->xatom(); double ** vatom = lammpsInterface_->vatom(); - + double lam1,lam2; - double bond_value; + double bond_value; // process differently for mesh vs translation-invariant kernels // "normal" kernel functions DENS_VEC xa(nsd_),xI(nsd_),xaI(nsd_),xb(nsd_),xbI(nsd_),xba(nsd_); @@ -281,7 +281,7 @@ using ATC_Utility::to_string; continue; } for (int j = 0; j < nLocal_; j++) { - int lammps_j = internalToAtom_(j); + int lammps_j = internalToAtom_(j); xa.copy(xPointer_[lammps_j],3); // difference vector xaI = xa - xI; @@ -296,8 +296,8 @@ using ATC_Utility::to_string; kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2); // compute virial if (lam1 < lam2) { - bond_value - = kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); + bond_value + = kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); double delx = xatom[lammps_j][0] - xatom[lammps_k][0]; double dely = xatom[lammps_j][1] - xatom[lammps_k][1]; double delz = xatom[lammps_j][2] - xatom[lammps_k][2]; @@ -308,9 +308,9 @@ using ATC_Utility::to_string; double * v = vatom[lammps_j]; fforce *= (delx*v[0] + dely*v[1] + delz*v[2]); if (atomToElementMapType_ == LAGRANGIAN) { - double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; - double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; - double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; + double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; + double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; + double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; flux(inode,0) +=fforce*delX*bond_value; flux(inode,1) +=fforce*delY*bond_value; flux(inode,2) +=fforce*delZ*bond_value; @@ -327,7 +327,7 @@ using ATC_Utility::to_string; } //------------------------------------------------------------------- - // calculation of the dislocation density tensor + // calculation of the dislocation density tensor void ATC_TransferKernel::compute_dislocation_density(DENS_MAT & A) { A.reset(nNodes_,9); @@ -348,7 +348,7 @@ using ATC_Utility::to_string; lammpsInterface_->int_allsum(&localNumberLines,&totalNumberLines,1); if (totalNumberLines == 0) { ATC::LammpsInterface::instance()->print_msg_once("no dislocation lines found"); - return; + return; } // for output @@ -366,7 +366,7 @@ using ATC_Utility::to_string; DENS_MAT local_A(nNodes_,9); - local_A.zero(); + local_A.zero(); DENS_VEC xa(nsd_),xI(nsd_),xaI(nsd_),xb(nsd_),xbI(nsd_),xba(nsd_); double kernel_inv_vol = kernelFunction_->inv_vol(); int iPt = 0, iSeg= 0; @@ -393,7 +393,7 @@ using ATC_Utility::to_string; xa(k) = x1[k]; xb(k) = x2[k]; xba(k) = delta[k]; - } + } for (int I = 0; I < nNodes_; I++) { xI = (feEngine_->fe_mesh())->nodal_coordinates(I); if (!kernelFunction_->node_contributes(xI)) { @@ -405,7 +405,7 @@ using ATC_Utility::to_string; double lam1=0,lam2=0; kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2); if (lam1 < lam2) { - double bond_value + double bond_value = kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); local_A(I,0) += xba(0)*burgers[0]*bond_value; local_A(I,1) += xba(0)*burgers[1]*bond_value; @@ -449,7 +449,7 @@ using ATC_Utility::to_string; lammpsInterface_->int_allsum(&nSeg,&totalNumberSegments,1); // output - double volume = lammpsInterface_->domain_volume(); + double volume = lammpsInterface_->domain_volume(); stringstream ss; ss << "total dislocation line length = " << totalDislocationDensity; ss << " lines = " << totalNumberLines << " segments = " << totalNumberSegments; @@ -474,10 +474,10 @@ using ATC_Utility::to_string; segOutput.write_geometry(&segCoor,&segConn); OUTPUT_LIST segOut; segOut["burgers_vector"] = &segBurg; - segOutput.write_data(0,&segOut); + segOutput.write_data(0,&segOut); } #else - throw ATC_Error("unimplemented function compute_dislocation_density (DXA support not included"); + throw ATC_Error("unimplemented function compute_dislocation_density (DXA support not included"); #endif } diff --git a/lib/atc/ATC_TransferKernel.h b/lib/atc/ATC_TransferKernel.h index 2443940e7e..5ad350bc68 100644 --- a/lib/atc/ATC_TransferKernel.h +++ b/lib/atc/ATC_TransferKernel.h @@ -12,9 +12,9 @@ class KernelFunction; class ATC_TransferKernel : public ATC_Transfer { public: - + // constructor - ATC_TransferKernel(std::string groupName, + ATC_TransferKernel(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile = "none"); @@ -27,7 +27,7 @@ class ATC_TransferKernel : public ATC_Transfer { protected: /** routine to calculate matrix of kernel functions */ - + virtual void compute_kernel_matrix_molecule(); /** calculate projection on the fly*/ diff --git a/lib/atc/ATC_TransferPartitionOfUnity.cpp b/lib/atc/ATC_TransferPartitionOfUnity.cpp index 5d83fd8fd7..be3dae77dd 100644 --- a/lib/atc/ATC_TransferPartitionOfUnity.cpp +++ b/lib/atc/ATC_TransferPartitionOfUnity.cpp @@ -1,4 +1,4 @@ -// ATC headers +// ATC headers #include "ATC_TransferPartitionOfUnity.h" #include "ATC_Error.h" #include "FE_Engine.h" @@ -27,7 +27,7 @@ static double line_xg[line_ngauss], line_wg[line_ngauss]; namespace ATC { ATC_TransferPartitionOfUnity::ATC_TransferPartitionOfUnity( - string groupName, + string groupName, double ** & perAtomArray, LAMMPS_NS::Fix * thisFix, string matParamFile) @@ -67,7 +67,7 @@ namespace ATC { //------------------------------------------------------------------- // kinetic energy portion of stress - + /** * @class KineticTensor * @brief Class for computing the quantity - m v' (x) v' @@ -83,7 +83,7 @@ namespace ATC { double mvv2e = lammpsInterface_->mvv2e(); // [MV^2]-->[Energy] DENS_MAT & v = variationVelocity_; - + atomicTensor_.reset(nLocal_,6); for (int i = 0; i < nLocal_; i++) { int atomIdx = internalToAtom_(i); @@ -132,7 +132,7 @@ namespace ATC { ATC::LammpsInterface::instance()->stream_msg_once(".",false,false); } // first atom location - int lammps_j = internalToAtom_(j); + int lammps_j = internalToAtom_(j); xa.copy(xPointer_[lammps_j],3); for (int k = 0; k < numneigh[lammps_j]; ++k) { int lammps_k = firstneigh[lammps_j][k]; @@ -147,9 +147,9 @@ namespace ATC { lammpsInterface_->pair_force(lammps_j,lammps_k,rsq,fforce); fforce *= 0.5; // 1/2 sum_ab = sum_(ab) if (atomToElementMapType_ == LAGRANGIAN) { - double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; - double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; - double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; + double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; + double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; + double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; virial[0] =-delx*fforce*delX; virial[1] =-delx*fforce*delY; virial[2] =-delx*fforce*delZ; @@ -172,7 +172,7 @@ namespace ATC { for (int i = 0; i < line_ngauss; i++) { double lambda = line_xg[i]; xlambda = lambda*xab + xb; - + lammpsInterface_->periodicity_correction(xlambda.ptr()); feEngine_->shape_functions(xlambda,shp,node_list); // accumulate to nodes whose support overlaps the integration point @@ -242,7 +242,7 @@ namespace ATC { DENS_VEC xa(nsd_),xb(nsd_),xab(nsd_),xlambda(nsd_); for (int j = 0; j < nLocal_; j++) { // first atom location - int lammps_j = internalToAtom_(j); + int lammps_j = internalToAtom_(j); xa.copy(xPointer_[lammps_j],3); for (int k = 0; k < numneigh[lammps_j]; ++k) { int lammps_k = firstneigh[lammps_j][k]; @@ -260,9 +260,9 @@ namespace ATC { delz*variationVelocity_(j,2)); double flux_vec[3]; if (atomToElementMapType_ == LAGRANGIAN) { - double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; - double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; - double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; + double delX = xref_[lammps_j][0] - xref_[lammps_k][0]; + double delY = xref_[lammps_j][1] - xref_[lammps_k][1]; + double delZ = xref_[lammps_j][2] - xref_[lammps_k][2]; flux_vec[0] =fforce*delX; flux_vec[1] =fforce*delY; flux_vec[2] =fforce*delZ; @@ -276,7 +276,7 @@ namespace ATC { for (int i = 0; i < line_ngauss; i++) { double lambda = line_xg[i]; xlambda = lambda*xab + xb; - + lammpsInterface_->periodicity_correction(xlambda.ptr()); feEngine_->shape_functions(xlambda,shp,node_list); // accumulate to nodes whose support overlaps the integration point @@ -316,7 +316,7 @@ namespace ATC { field_to_prolongation_name(VELOCITY)); } // use of prolong assumes atom system contained within mesh - vbar_ = vbar->quantity(); + vbar_ = vbar->quantity(); // compute and store variation velocities of atoms for (int i = 0; i < nLocal_; i++) { int atomIdx = internalToAtom_(i); @@ -328,10 +328,10 @@ namespace ATC { } //------------------------------------------------------------------- - // calculation of the dislocation density tensor + // calculation of the dislocation density tensor void ATC_TransferPartitionOfUnity::compute_dislocation_density(DENS_MAT & A) { - + A.reset(nNodes_,9); #ifdef HAS_DXA double cnaCutoff = lammpsInterface_->near_neighbor_cutoff(); @@ -368,7 +368,7 @@ namespace ATC { DENS_MAT local_A(nNodes_,9); - local_A.zero(); + local_A.zero(); Array latticePeriodicity(3); latticePeriodicity(0) = (bool) periodicity[0]; latticePeriodicity(1) = (bool) periodicity[1]; @@ -406,7 +406,7 @@ namespace ATC { for (int i = 0; i < line_ngauss; i++) { double lambda = line_xg[i]; xlambda = lambda*xba + xa; - + lammpsInterface_->periodicity_correction(xlambda.ptr()); feEngine_->shape_functions(xlambda,shp,node_list); // accumulate to nodes whose support overlaps the integration point @@ -472,7 +472,7 @@ namespace ATC { } ATC::LammpsInterface::instance()->print_msg_once(ss.str()); ss.str(""); - DENS_VEC A_avg(9); + DENS_VEC A_avg(9); for (int i = 0; i < nNodes_; i++) { for (int j = 0; j < 9; j++) { A_avg(j) += A(i,j); @@ -480,9 +480,9 @@ namespace ATC { } A_avg /= nNodes_; ss << "average nodal dislocation density tensor = \n"; - ss << A_avg(0) << " " << A_avg(1) << " " << A_avg(2) << "\n"; - ss << A_avg(3) << " " << A_avg(4) << " " << A_avg(5) << "\n"; - ss << A_avg(6) << " " << A_avg(7) << " " << A_avg(8) << "\n"; + ss << A_avg(0) << " " << A_avg(1) << " " << A_avg(2) << "\n"; + ss << A_avg(3) << " " << A_avg(4) << " " << A_avg(5) << "\n"; + ss << A_avg(6) << " " << A_avg(7) << " " << A_avg(8) << "\n"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); if (nSeg > 0) { @@ -495,7 +495,7 @@ namespace ATC { segOutput.write_geometry(&segCoor,&segConn); OUTPUT_LIST segOut; segOut["burgers_vector"] = &segBurg; - segOutput.write_data(0,&segOut); + segOutput.write_data(0,&segOut); } #else throw ATC_Error("TransferParititionOfUnity::compute_dislocaton_density - unimplemented function"); diff --git a/lib/atc/ATC_TransferPartitionOfUnity.h b/lib/atc/ATC_TransferPartitionOfUnity.h index 5c224d7c8e..4d919cc9ef 100644 --- a/lib/atc/ATC_TransferPartitionOfUnity.h +++ b/lib/atc/ATC_TransferPartitionOfUnity.h @@ -9,9 +9,9 @@ namespace ATC { class ATC_TransferPartitionOfUnity : public ATC_Transfer { public: - + // constructor - ATC_TransferPartitionOfUnity(std::string groupName, + ATC_TransferPartitionOfUnity(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix, std::string matParamFile = "none"); @@ -49,7 +49,7 @@ class ATC_TransferPartitionOfUnity : public ATC_Transfer { virtual void compute_dislocation_density(DENS_MAT & dislocation_density); private: - + DENS_MAT variationVelocity_; DENS_MAT vbar_; }; diff --git a/lib/atc/ATC_TypeDefs.h b/lib/atc/ATC_TypeDefs.h index 590cf15980..71f351494a 100644 --- a/lib/atc/ATC_TypeDefs.h +++ b/lib/atc/ATC_TypeDefs.h @@ -23,7 +23,7 @@ namespace ATC static const double kBeV_ = 8.617343e-5;// [eV/K] /** unsigned ints, when needed */ - typedef int INDEX; + typedef int INDEX; /** elementset integral */ enum ElementsetOperationType { @@ -53,13 +53,13 @@ namespace ATC FULL_DOMAIN=0, ATOM_DOMAIN, FE_DOMAIN, - FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE, + FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE, FULL_DOMAIN_FREE_ONLY }; /** domain decomposition */ enum DomainDecompositionType { REPLICATED_MEMORY=0, - DISTRIBUTED_MEMORY + DISTRIBUTED_MEMORY }; /** atomic weight specification */ enum AtomicWeightType { @@ -100,7 +100,7 @@ namespace ATC NUM_ATOM_TYPES }; /** field types */ - enum FieldName { + enum FieldName { TIME=-2, POSITION=-1, TEMPERATURE=0, // Intrinsic Fields @@ -114,9 +114,9 @@ namespace ATC ELECTRON_TEMPERATURE, ELECTRIC_POTENTIAL, ELECTRON_WAVEFUNCTION, - ELECTRON_WAVEFUNCTIONS, - ELECTRON_WAVEFUNCTION_ENERGIES, - FERMI_ENERGY, + ELECTRON_WAVEFUNCTIONS, + ELECTRON_WAVEFUNCTION_ENERGIES, + FERMI_ENERGY, MOMENTUM, PROJECTED_VELOCITY, KINETIC_TEMPERATURE, @@ -144,9 +144,9 @@ namespace ATC QUADRUPOLE_MOMENT, CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT, DISLOCATION_DENSITY, - NUM_TOTAL_FIELDS + NUM_TOTAL_FIELDS }; - const int NUM_FIELDS = ELECTRON_WAVEFUNCTION+1; + const int NUM_FIELDS = ELECTRON_WAVEFUNCTION+1; #define NDIM 3 static const int FieldSizes[NUM_TOTAL_FIELDS] = { @@ -193,7 +193,7 @@ namespace ATC NDIM*NDIM // DISLOCATION_DENSITY }; - enum NodalAtomicFieldNormalization { + enum NodalAtomicFieldNormalization { NO_NORMALIZATION=0, VOLUME_NORMALIZATION, NUMBER_NORMALIZATION, MASS_NORMALIZATION, MASS_MATRIX @@ -209,7 +209,7 @@ namespace ATC enum FeIntQuadrature {NODAL, GAUSS1, GAUSS2, GAUSS3, FACE}; /** field name enum to string */ - inline FeIntQuadrature string_to_FIQ(const std::string &str) + inline FeIntQuadrature string_to_FIQ(const std::string &str) { if (str == "nodal") return NODAL; @@ -226,7 +226,7 @@ namespace ATC } /** field name enum to string */ - inline std::string field_to_string(const FieldName index) + inline std::string field_to_string(const FieldName index) { switch (index) { case TEMPERATURE: @@ -313,7 +313,7 @@ namespace ATC } /** string to field enum */ - inline FieldName string_to_field(const std::string & name) + inline FieldName string_to_field(const std::string & name) { if (name=="temperature") return TEMPERATURE; @@ -397,7 +397,7 @@ namespace ATC throw ATC_Error(name + " is not a valid field"); } - inline bool is_intrinsic(const FieldName & field_enum) + inline bool is_intrinsic(const FieldName & field_enum) { if (field_enum==TEMPERATURE || field_enum==DISPLACEMENT @@ -412,7 +412,7 @@ namespace ATC else return false; } - inline std::string field_to_intrinsic_name(const FieldName index) + inline std::string field_to_intrinsic_name(const FieldName index) { if (is_intrinsic(index)) { return "NodalAtomic"+ATC_Utility::to_cap(field_to_string(index)); @@ -421,7 +421,7 @@ namespace ATC throw ATC_Error("field "+field_to_string(index)+" is not an intrinsic field"); } } - inline std::string field_to_restriction_name(const FieldName index) + inline std::string field_to_restriction_name(const FieldName index) { if (is_intrinsic(index)) { return "Restricted"+ATC_Utility::to_cap(field_to_string(index)); @@ -430,7 +430,7 @@ namespace ATC throw ATC_Error("field "+field_to_string(index)+" is not an intrinsic field"); } } - inline std::string field_to_prolongation_name(const FieldName index) + inline std::string field_to_prolongation_name(const FieldName index) { return "Prolonged"+ATC_Utility::to_cap(field_to_string(index)); } @@ -473,9 +473,9 @@ namespace ATC THERMO_ELASTIC, SPECIES // aka Mass }; - + /** rhs types */ - enum FluxType + enum FluxType { FLUX = 0, // has a source weighted by gradient of shape function SOURCE, // has a source term weighted by the shape function @@ -487,12 +487,12 @@ namespace ATC }; /** stiffness/ derivative of rhs types */ - enum StiffnessType + enum StiffnessType { - BB_STIFFNESS = 0, - NN_STIFFNESS, - BN_STIFFNESS, - NB_STIFFNESS, + BB_STIFFNESS = 0, + NN_STIFFNESS, + BN_STIFFNESS, + NB_STIFFNESS, NUM_STIFFNESS }; @@ -519,8 +519,8 @@ namespace ATC typedef std::set ESET; // elementset /** typedefs for N and B integrand functions */ - typedef std::set ARG_NAMES; - typedef std::map > ARGS; + typedef std::set ARG_NAMES; + typedef std::map > ARGS; typedef ATC::MatrixDependencyManager FIELD; typedef std::vector > GRAD_FIELD; typedef std::map > FIELDS; @@ -555,7 +555,7 @@ namespace ATC typedef std::map > OPEN_SURFACE; typedef std::map > VOLUME_SOURCE; typedef std::map > ATOMIC_DATA; - + /** typedefs for FE_Mesh */ typedef std::map > NODE_SET_MAP; typedef std::map > ELEMENT_SET_MAP; @@ -603,14 +603,14 @@ namespace ATC return true; } - inline std::string print_mask(const Array2D & rhsMask) + inline std::string print_mask(const Array2D & rhsMask) { std::string msg; - for (int i = 0; i < NUM_FIELDS; i++) { + for (int i = 0; i < NUM_FIELDS; i++) { FieldName field = (FieldName) i; std::string name = field_to_string(field); if (rhsMask(field,FLUX) - || rhsMask(field,SOURCE) + || rhsMask(field,SOURCE) || rhsMask(field,PRESCRIBED_SOURCE) || rhsMask(field,ROBIN_SOURCE) || rhsMask(field,OPEN_SOURCE) diff --git a/lib/atc/Array.h b/lib/atc/Array.h index c29729d320..1c3f56a35a 100644 --- a/lib/atc/Array.h +++ b/lib/atc/Array.h @@ -12,8 +12,8 @@ namespace ATC_matrix { /** - * @class Array - * @brief Base class for creating, sizing and operating on 1-D arrays of data + * @class Array + * @brief Base class for creating, sizing and operating on 1-D arrays of data */ template @@ -24,7 +24,7 @@ public: Array(const Array& A); virtual ~Array(); - // Resize and reinitialize the array + // Resize and reinitialize the array virtual void reset(int len); //* resizes the matrix, copy what fits default to OFF virtual void resize(int len, bool copy=false); @@ -38,17 +38,17 @@ public: int size() const; // Do I have this element? bool has_member(T val) const; - // range + // range bool check_range(T min, T max) const; void range(T & min, T & max) const; // search an ordered array int index(T& val) const; // Return pointer to internal data - const T* data() const; + const T* data() const; T* ptr() const; // print void print(std::string name = "") const; - // Dump templated type to disk; operation not safe for all types + // Dump templated type to disk; operation not safe for all types void write_restart(FILE *f) const; protected: @@ -66,7 +66,7 @@ public: virtual ~AliasArray(); virtual AliasArray& operator= (const Array &other); virtual AliasArray& operator= (const T &value); - + const T& operator() (int i) const; int size() const; T* ptr() const; @@ -135,8 +135,8 @@ void Array::resize(int len, bool copy) { delete[] data_; data_ = new T[len_]; for (int i = 0 ; i < len_; i++) { - if (i < temp.size()) - data_[i] = temp.data_[i]; + if (i < temp.size()) + data_[i] = temp.data_[i]; } } else { @@ -269,7 +269,7 @@ AliasArray::AliasArray(const AliasArray & other) { // for a mem continguous slice template -AliasArray::AliasArray(int len, T * ptr) { +AliasArray::AliasArray(int len, T * ptr) { len_ = len; data_ = ptr; } @@ -281,8 +281,8 @@ AliasArray::AliasArray(const Array& A) { } template -AliasArray::~AliasArray(void) { - len_ = 0; +AliasArray::~AliasArray(void) { + len_ = 0; data_ = nullptr; // trick base class into not deleting parent data } diff --git a/lib/atc/Array2D.h b/lib/atc/Array2D.h index 37b7dcb3c9..de255563e3 100644 --- a/lib/atc/Array2D.h +++ b/lib/atc/Array2D.h @@ -20,20 +20,20 @@ namespace ATC_matrix { template class Array2D { -public: +public: Array2D(); Array2D(int nrows, int ncols); Array2D(const Array2D& A); // copy constructor ~Array2D(); - + // Resize and reinitalize matrix void reset(int nrows, int ncols); // Access method to get the (i,j) element: - T& operator() (int i, int j); - // Access method to get the i-th col - AliasArray column(int i) const; + T& operator() (int i, int j); + // Access method to get the i-th col + AliasArray column(int i) const; // Access method to get the (i,j) element: - const T& operator() (int i, int j) const; + const T& operator() (int i, int j) const; // Copy operator Array2D& operator= (const Array2D& other); // assignment operator @@ -48,10 +48,10 @@ public: // Dump templated type to disk; operation not safe for all types void write_restart(FILE *f) const; -private: +private: int nrows_, ncols_; - T *data_; -}; + T *data_; +}; template Array2D::Array2D() { @@ -172,7 +172,7 @@ template Array2D::~Array2D() { if (data_ != nullptr) delete[] data_; -} +} template void Array2D::print(std::string name) const { diff --git a/lib/atc/AtomToMoleculeTransfer.cpp b/lib/atc/AtomToMoleculeTransfer.cpp index 21293967bd..e6c84fb6bc 100644 --- a/lib/atc/AtomToMoleculeTransfer.cpp +++ b/lib/atc/AtomToMoleculeTransfer.cpp @@ -1,4 +1,4 @@ -// ATC headers +// ATC headers #include "AtomToMoleculeTransfer.h" #include "ATC_Method.h" @@ -19,15 +19,15 @@ namespace ATC { { atomPositions_->register_dependence(this); } - + //-------------------------------------------------------- - // Destructor + // Destructor //-------------------------------------------------------- SmallMoleculeCentroid::~SmallMoleculeCentroid() { atomPositions_->remove_dependence(this); } - + //-------------------------------------------------------- // Quantity //-------------------------------------------------------- @@ -42,7 +42,7 @@ namespace ATC { for (int i = 0; i < nLocalMol; i++) { const set & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i); set::const_iterator atomsLocalMolID; - double totalSourceMol = 0.0; // for total source + double totalSourceMol = 0.0; // for total source for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID != atomsLocalMolArray.end(); atomsLocalMolID++) { totalSourceMol += sourceMatrix(*atomsLocalMolID,0); } // compute total source @@ -62,11 +62,11 @@ namespace ATC { } } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class SmallMoleculeDipoleMoment - //-------------------------------------------------------- + //-------------------------------------------------------- //-------------------------------------------------------- //-------------------------------------------------------- @@ -100,8 +100,8 @@ namespace ATC { quantity_.reset(nLocalMol,nsd); double dx[3]; - //call the SmallMoleculeCentroid here to find Centroid .... - const DENS_MAT & centroidMolMatrix(centroid_->quantity()); + //call the SmallMoleculeCentroid here to find Centroid .... + const DENS_MAT & centroidMolMatrix(centroid_->quantity()); for (int i = 0; i < nLocalMol; i++) { const set & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i); set::const_iterator atomsLocalMolID;; @@ -111,15 +111,15 @@ namespace ATC { } lammps->minimum_image(dx[0], dx[1], dx[2]); for(int j = 0; j < nsd; j++) { - quantity_(i,j) += sourceMatrix(*atomsLocalMolID,0) * dx[j]; - } + quantity_(i,j) += sourceMatrix(*atomsLocalMolID,0) * dx[j]; + } } } } //-------------------------------------------------------- // Class SmallMoleculeQuadrupoleMoment - //-------------------------------------------------------- + //-------------------------------------------------------- //-------------------------------------------------------- //-------------------------------------------------------- @@ -202,9 +202,9 @@ namespace ATC { // reallocate memory only if sizing has changed const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity()); quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols()); - + local_restriction(sourceMatrix,shapeFunctionMatrix); - + // communicate for total restriction int count = quantity_.nRows()*quantity_.nCols(); lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count); @@ -222,4 +222,4 @@ namespace ATC { _workspace_.reset(quantity_.nRows(),quantity_.nCols()); } -} // end namespace +} // end namespace diff --git a/lib/atc/AtomToMoleculeTransfer.h b/lib/atc/AtomToMoleculeTransfer.h index c628ee356f..6ebfa2f9a2 100644 --- a/lib/atc/AtomToMoleculeTransfer.h +++ b/lib/atc/AtomToMoleculeTransfer.h @@ -1,4 +1,4 @@ -// A class for defining transfer operations molecular centers of mass (centroid), dipole moments, quadrupole moments +// A class for defining transfer operations molecular centers of mass (centroid), dipole moments, quadrupole moments #ifndef ATOM_TO_MOLECULE_TRANSFER_H #define ATOM_TO_MOLECULE_TRANSFER_H @@ -15,18 +15,18 @@ namespace ATC { // forward declarations class ATC_Method; - /** + /** * @class PerMoleculeQuantity * */ - + template class PerMoleculeQuantity : public DenseMatrixTransfer { - + public: PerMoleculeQuantity(ATC_Method * atc):DenseMatrixTransfer(), atc_(atc) {}; - + virtual ~PerMoleculeQuantity() {}; protected: @@ -34,8 +34,8 @@ namespace ATC { /** utility object for atc information */ ATC_Method * atc_; - private: - + private: + //do not define PerMoleculeQuantity(); @@ -48,7 +48,7 @@ namespace ATC { */ template class AtomToSmallMoleculeTransfer : public PerMoleculeQuantity { - + public: //constructor @@ -61,20 +61,20 @@ namespace ATC { source_->register_dependence(this); smallMoleculeSet_->register_dependence(this); }; - - //destructor + + //destructor virtual ~AtomToSmallMoleculeTransfer() { source_->remove_dependence(this); smallMoleculeSet_->remove_dependence(this); }; - // apply transfer operator + // apply transfer operator void reset_quantity() const { const DenseMatrix & sourceMatrix(source_->quantity()); int nLocalMol = smallMoleculeSet_->local_molecule_count(); - (this->quantity_).reset(nLocalMol,sourceMatrix.nCols()); + (this->quantity_).reset(nLocalMol,sourceMatrix.nCols()); for (int i = 0; i < nLocalMol ; i++) { const std::set & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i); std::set::const_iterator atomsLocalMolID; @@ -86,29 +86,29 @@ namespace ATC { } }; - protected: + protected: - // pointer to source atomic quantity data + // pointer to source atomic quantity data PerAtomQuantity * source_; - // pointer to molecule data + // pointer to molecule data SmallMoleculeSet * smallMoleculeSet_; private: // do not define AtomToSmallMoleculeTransfer(); - + }; /** - * @class SmallMoleculeCentroid + * @class SmallMoleculeCentroid * @brief Class for defining objects to transfer molecular centroid (center of mass) */ class SmallMoleculeCentroid : public AtomToSmallMoleculeTransfer { - public: + public: //constructor SmallMoleculeCentroid(ATC_Method * atc, PerAtomQuantity * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity * atomPositions); @@ -116,15 +116,15 @@ namespace ATC { //destructor virtual ~SmallMoleculeCentroid(); - // apply transfer operator + // apply transfer operator virtual void reset_quantity() const; - - protected: - + + protected: + // pointer to source atomic quantity date : positions of atoms in a molecule PerAtomQuantity * atomPositions_; - private: + private: //do not define SmallMoleculeCentroid(); @@ -133,28 +133,28 @@ namespace ATC { /** * @class SmallMoleculeDipoleMoment - * @brief Class for defining objects to transfer molecular dipole moments + * @brief Class for defining objects to transfer molecular dipole moments */ class SmallMoleculeDipoleMoment : public SmallMoleculeCentroid { - public: - + public: + //constructor SmallMoleculeDipoleMoment(ATC_Method * atc, PerAtomQuantity * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity * atomPositions, SmallMoleculeCentroid * centroid); - + //destructor virtual ~SmallMoleculeDipoleMoment(); - // apply transfer operator + // apply transfer operator virtual void reset_quantity() const; - protected: + protected: - //pointer to the centroid data + //pointer to the centroid data SmallMoleculeCentroid * centroid_; - private: + private: //do not define SmallMoleculeDipoleMoment(); @@ -162,14 +162,14 @@ namespace ATC { }; /** - * @class AtomToFeTransfer + * @class AtomToFeTransfer * @brief Class for defining objects to transfer molecular quadrupole moments */ class SmallMoleculeQuadrupoleMoment : public SmallMoleculeCentroid { - public: + public: //constructor SmallMoleculeQuadrupoleMoment(ATC_Method * atc, PerAtomQuantity * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity * atomPositions, SmallMoleculeCentroid * centroid); @@ -179,10 +179,10 @@ namespace ATC { //apply transfer operator virtual void reset_quantity() const; - + protected: - //pointer to the centroid data + //pointer to the centroid data SmallMoleculeCentroid * centroid_; private: @@ -190,7 +190,7 @@ namespace ATC { //do not define SmallMoleculeQuadrupoleMoment(); - }; + }; /** * @class MotfShapeFunctionRestriction @@ -201,11 +201,11 @@ namespace ATC { class MotfShapeFunctionRestriction : public MatToMatTransfer { public: - + // constructor MotfShapeFunctionRestriction(PerMoleculeQuantity * source, SPAR_MAN * shapeFunction); - + // destructor virtual ~MotfShapeFunctionRestriction(); @@ -218,8 +218,8 @@ namespace ATC { SPAR_MAN * shapeFunction_; /** persistent workspace */ - - + + mutable DENS_MAT _workspace_; /** applies restriction operation on this processor */ @@ -236,4 +236,4 @@ namespace ATC { } #endif - + diff --git a/lib/atc/AtomicRegulator.cpp b/lib/atc/AtomicRegulator.cpp index 9dfcdaab51..1d2b5d1d85 100644 --- a/lib/atc/AtomicRegulator.cpp +++ b/lib/atc/AtomicRegulator.cpp @@ -13,7 +13,7 @@ using std::pair; namespace ATC { - + // only one regulator method at time, i.e. fixed & flux, thermo & elastic // regulator manages lambda variables, creates new ones when requested with dimensions and zero ics (map of tag to lambda) // regulator keeps track of which lambda are being used, unused lambdas deleted (map of tag to bool), all tags set to unused on start of initialization @@ -168,7 +168,7 @@ namespace ATC { fix_modify AtC control \n - physics_type (string) = thermal | momentum\n - solution_parameter (string) = max_iterations | tolerance\n - + fix_modify AtC transfer control max_iterations \n - max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers\n @@ -209,14 +209,14 @@ namespace ATC { foundMatch = true; } - /*! \page man_localized_lambda fix_modify AtC control localized_lambda + /*! \page man_localized_lambda fix_modify AtC control localized_lambda \section syntax - fix_modify AtC control localized_lambda + fix_modify AtC control localized_lambda \section examples fix_modify atc control localized_lambda on \n \section description Turns on localization algorithms for control algorithms to restrict the influence of FE coupling or boundary conditions to a region near the boundary of the MD region. Control algorithms will not affect atoms in elements not possessing faces on the boundary of the region. Flux-based control is localized via row-sum lumping while quantity control is done by solving a truncated matrix equation. - \section restrictions + \section restrictions \section related \section default Default is off. @@ -233,16 +233,16 @@ namespace ATC { } } - - - /*! \page man_lumped_lambda_solve fix_modify AtC control lumped_lambda_solve + + + /*! \page man_lumped_lambda_solve fix_modify AtC control lumped_lambda_solve \section syntax - fix_modify AtC control lumped_lambda_solve + fix_modify AtC control lumped_lambda_solve \section examples fix_modify atc control lumped_lambda_solve on \n \section description Command to use or not use lumped matrix for lambda solve - \section restrictions + \section restrictions \section related \section default */ @@ -260,12 +260,12 @@ namespace ATC { /*! \page man_mask_direction fix_modify AtC control mask_direction \section syntax - fix_modify AtC control mask_direction + fix_modify AtC control mask_direction \section examples fix_modify atc control mask_direction 0 on \n \section description Command to mask out certain dimensions from the atomic regulator - \section restrictions + \section restrictions \section related \section default */ @@ -404,7 +404,7 @@ namespace ATC { //-------------------------------------------------------- // apply_pre_predictor: // applies the controller in the pre-predictor - // phase of the time integrator + // phase of the time integrator //-------------------------------------------------------- void AtomicRegulator::apply_pre_predictor(double dt, int timeStep) { @@ -415,7 +415,7 @@ namespace ATC { //-------------------------------------------------------- // apply_mid_predictor: // applies the controller in the mid-predictor - // phase of the time integrator + // phase of the time integrator //-------------------------------------------------------- void AtomicRegulator::apply_mid_predictor(double dt, int timeStep) { @@ -426,14 +426,14 @@ namespace ATC { //-------------------------------------------------------- // apply_post_predictor: // applies the controller in the post-predictor - // phase of the time integrator + // phase of the time integrator //-------------------------------------------------------- void AtomicRegulator::apply_post_predictor(double dt, int timeStep) { if (timeStep % howOften_==0) // apply full integration scheme, including filter regulatorMethod_->apply_post_predictor(dt); } - + //-------------------------------------------------------- // apply_pre_corrector: // applies the controller in the pre-corrector phase @@ -441,7 +441,7 @@ namespace ATC { //-------------------------------------------------------- void AtomicRegulator::apply_pre_corrector(double dt, int timeStep) { - if (timeStep % howOften_==0) // apply full integration scheme, including filter + if (timeStep % howOften_==0) // apply full integration scheme, including filter regulatorMethod_->apply_pre_corrector(dt); } @@ -497,7 +497,7 @@ namespace ATC { //-------------------------------------------------------- // add_to_rhs: - // adds any controller contributions to the FE rhs + // adds any controller contributions to the FE rhs //-------------------------------------------------------- void AtomicRegulator::add_to_rhs(FIELDS & rhs) { @@ -509,7 +509,7 @@ namespace ATC { // Class RegulatorMethod //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -545,7 +545,7 @@ namespace ATC { // Class RegulatorShapeFunction //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -604,7 +604,7 @@ namespace ATC { interscaleManager.add_dense_matrix_int(overlapToNodeMap_, regulatorPrefix_+"OverlapToNodeMap"); } - + } //-------------------------------------------------------- @@ -690,7 +690,7 @@ namespace ATC { //-------------------------------------------------------- void RegulatorShapeFunction::compute_sparsity(void) { - + // first get local pattern from N N^T int nNodeOverlap = nodeToOverlapMap_->size(); DENS_MAT tmpLocal(nNodeOverlap,nNodeOverlap); @@ -699,7 +699,7 @@ namespace ATC { if (myShapeFunctionMatrix.nRows() > 0) { tmpLocal = myShapeFunctionMatrix.transMat(myShapeFunctionMatrix); } - + // second accumulate total pattern across processors LammpsInterface::instance()->allsum(tmpLocal.ptr(), tmp.ptr(), tmp.size()); // third extract non-zero entries & construct sparse template @@ -724,13 +724,13 @@ namespace ATC { { // assemble N^T W N with appropriate weighting matrix - + DIAG_MAT weights; if (shapeFunctionMatrix_->nRows() > 0) { weights.reset(weights_->quantity()); } matrixSolver_->assemble_matrix(weights); - + // solve on overlap nodes int nNodeOverlap = nodeToOverlapMap_->size(); DENS_MAT rhsOverlap(nNodeOverlap,rhs.nCols()); @@ -747,7 +747,7 @@ namespace ATC { tempLambda = 0.; } } - + // map solution back to all nodes map_overlap_to_unique(lambdaOverlap,lambda); } @@ -761,8 +761,8 @@ namespace ATC { RegulatorMethod::reset_nlocal(); nLocal_ = atomicRegulator_->nlocal(); - - + + //compute_sparsity(); } @@ -903,7 +903,7 @@ namespace ATC { void LambdaMatrixSolver::assemble_matrix(DIAG_MAT & weights) { // form matrix : sum_a N_Ia * W_a * N_Ja - + SPAR_MAT lambdaMatrixLocal(matrixTemplate_.quantity()); if (weights.nRows()>0) lambdaMatrixLocal.weighted_least_squares(shapeFunctionMatrix_->quantity(),weights); @@ -941,13 +941,13 @@ namespace ATC { void LambdaMatrixSolverLumped::assemble_matrix(DIAG_MAT & weights) { LambdaMatrixSolver::assemble_matrix(weights); - + lumpedMatrix_ = lambdaMatrix_.row_sum_lump(); } - void LambdaMatrixSolverLumped::execute(VECTOR & rhs, VECTOR & lambda) + void LambdaMatrixSolverLumped::execute(VECTOR & rhs, VECTOR & lambda) { - + // solve lumped equation const set & applicationNodes(applicationNodes_->quantity()); const INT_ARRAY & nodeToOverlapMap(nodeToOverlapMap_->quantity()); diff --git a/lib/atc/AtomicRegulator.h b/lib/atc/AtomicRegulator.h index 360af3a4f6..24a5517dc2 100644 --- a/lib/atc/AtomicRegulator.h +++ b/lib/atc/AtomicRegulator.h @@ -44,7 +44,7 @@ namespace ATC { //-------------------------------------------------------- class AtomicRegulator { - + public: /** linear solver types */ @@ -68,14 +68,14 @@ namespace ATC { GHOST_FLUX, FIXED }; - + // constructor AtomicRegulator(ATC_Coupling * atc, const std::string & regulatorPrefix = ""); - + // destructor virtual ~AtomicRegulator(); - + /** parser/modifier */ virtual bool modify(int narg, char **arg); @@ -87,11 +87,11 @@ namespace ATC { /** initialization of method data */ virtual void initialize(); - + /** add output information */ virtual void output(OUTPUT_LIST & outputData) const; virtual double compute_vector(int /* n */) const {return 0;} - + /** final work at the end of a run */ virtual void finish(); @@ -101,7 +101,7 @@ namespace ATC { /** set up atom to material identification */ virtual void reset_atom_materials(const Array & elementToMaterialMap, const MatrixDependencyManager * atomElement); - + // application steps /** apply the regulator in the pre-predictor phase */ virtual void apply_pre_predictor(double dt, int timeStep); @@ -136,7 +136,7 @@ namespace ATC { virtual void compute_boundary_flux(FIELDS & fields); /** add contributions (if any) to the finite element right-hand side */ virtual void add_to_rhs(FIELDS & rhs); - + // data access, intended for method objects /** returns a pointer to the DENS_MAN associated with the tag, creates a new data member if necessary */ DENS_MAN * regulator_data(const std::string tag, int nCols); @@ -158,7 +158,7 @@ namespace ATC { /** access for number of spatial dimensions */ int nsd() {return nsd_;}; /** access for number of local atoms */ - int nlocal() {return nLocal_;}; + int nlocal() {return nLocal_;}; /** access for boundary integration methods */ BoundaryIntegrationType boundary_integration_type() {return boundaryIntegrationType_;}; @@ -176,7 +176,7 @@ namespace ATC { /** check to see if this direction is being used */ bool apply_in_direction(int i) const {return applyInDirection_[i];}; - + /** checks if there are any fixed nodes in the MD region */ bool md_fixed_nodes(FieldName fieldName = NUM_TOTAL_FIELDS) const; @@ -185,7 +185,7 @@ namespace ATC { /** returns prefix tag for regulator */ const std::string & regulator_prefix() const {return regulatorPrefix_;}; - + protected: // methods @@ -200,11 +200,11 @@ namespace ATC { /** sets all data to be used */ void set_all_data_to_used(); - + // data /** point to atc_transfer object */ ATC_Coupling * atc_; - + /** how often in number of time steps regulator is applied */ int howOften_; @@ -227,7 +227,7 @@ namespace ATC { RegulatorTargetType regulatorTarget_; /** regulator fe coupling type flag */ RegulatorCouplingType couplingMode_; - + /** number of nodes */ int nNodes_; /** number of spatial dimensions */ @@ -241,7 +241,7 @@ namespace ATC { /** restrict application in certain directions */ std::vector applyInDirection_; - + // method pointers /** time filtering object */ TimeFilter * timeFilter_; @@ -256,30 +256,30 @@ namespace ATC { const std::string regulatorPrefix_; private: - + // DO NOT define this AtomicRegulator(); - + }; /** * @class RegulatorMethod * @brief Base class for implementation of control algorithms */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class RegulatorMethod //-------------------------------------------------------- //-------------------------------------------------------- - + class RegulatorMethod { - + public: - + RegulatorMethod(AtomicRegulator * atomicRegulator, const std::string & regulatorPrefix = ""); - + virtual ~RegulatorMethod(){}; /** instantiate all needed data */ @@ -294,7 +294,7 @@ namespace ATC { /** set up atom to material identification */ virtual void reset_atom_materials(const Array & /* elementToMaterialMap */, const MatrixDependencyManager * /* atomElement */){}; - + /** applies regulator to atoms in the pre-predictor phase */ virtual void apply_pre_predictor(double /* dt */){}; @@ -340,7 +340,7 @@ namespace ATC { /** pack fields for restart */ virtual void pack_fields(RESTART_LIST & /* data */){}; - + protected: //data @@ -372,7 +372,7 @@ namespace ATC { // DO NOT define this RegulatorMethod(); - + }; /** @@ -389,14 +389,14 @@ namespace ATC { // of N^T w N lambda = rhs //-------------------------------------------------------- //-------------------------------------------------------- - + class RegulatorShapeFunction : public RegulatorMethod { - + public: - + RegulatorShapeFunction(AtomicRegulator * atomicRegulator, const std::string & regulatorPrefix = ""); - + virtual ~RegulatorShapeFunction(); /** instantiate all needed data */ @@ -524,18 +524,18 @@ namespace ATC { // Class LambdaMatrixSolver //-------------------------------------------------------- //-------------------------------------------------------- - + class LambdaMatrixSolver { - + public: - + LambdaMatrixSolver(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance); - + virtual ~LambdaMatrixSolver(){}; /** assemble the matrix */ virtual void assemble_matrix(DIAG_MAT & weights); - + /** execute the solver */ virtual void execute(VECTOR & rhs, VECTOR & lambda)=0; @@ -549,7 +549,7 @@ namespace ATC { /** matrix used to solve for lambda */ SPAR_MAT lambdaMatrix_; - + /** maximum number of iterations */ int maxIterations_; @@ -560,7 +560,7 @@ namespace ATC { // DO NOT define this LambdaMatrixSolver(); - + }; //-------------------------------------------------------- @@ -568,21 +568,21 @@ namespace ATC { // Class LambdaMatrixSolverLumped //-------------------------------------------------------- //-------------------------------------------------------- - + class LambdaMatrixSolverLumped : public LambdaMatrixSolver { - + public: - + LambdaMatrixSolverLumped(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance, const SetDependencyManager * applicationNodes, const NodeToSubset * nodeToOverlapMap); - + virtual ~LambdaMatrixSolverLumped(){}; /** assemble the matrix */ virtual void assemble_matrix(DIAG_MAT & weights); - + /** execute the solver */ - virtual void execute(VECTOR & rhs, VECTOR & lambda); - + virtual void execute(VECTOR & rhs, VECTOR & lambda); + protected: /** lumped version of the matrix governing lambda */ @@ -598,7 +598,7 @@ namespace ATC { // DO NOT define this LambdaMatrixSolverLumped(); - + }; //-------------------------------------------------------- @@ -606,18 +606,18 @@ namespace ATC { // Class LambdaMatrixSolverCg //-------------------------------------------------------- //-------------------------------------------------------- - + class LambdaMatrixSolverCg : public LambdaMatrixSolver { - + public: - + LambdaMatrixSolverCg(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance); - + virtual ~LambdaMatrixSolverCg(){}; - + /** execute the solver */ - virtual void execute(VECTOR & rhs, VECTOR & lambda); - + virtual void execute(VECTOR & rhs, VECTOR & lambda); + protected: @@ -625,7 +625,7 @@ namespace ATC { // DO NOT define this LambdaMatrixSolverCg(); - + }; }; diff --git a/lib/atc/BodyForce.cpp b/lib/atc/BodyForce.cpp index ecef3749b7..30b87f90a3 100644 --- a/lib/atc/BodyForce.cpp +++ b/lib/atc/BodyForce.cpp @@ -16,14 +16,14 @@ using std::vector; namespace ATC { BodyForceViscous::BodyForceViscous( - fstream &fileId, std::map & parameters) + fstream &fileId, std::map & parameters) : BodyForce(), gamma_(0) { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); std::vector line; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; double value = str2dbl(line[1]); if (line[0] == "gamma") { diff --git a/lib/atc/BodyForce.h b/lib/atc/BodyForce.h index 10d7cf66c1..bdf7c991db 100644 --- a/lib/atc/BodyForce.h +++ b/lib/atc/BodyForce.h @@ -9,7 +9,7 @@ namespace ATC { /** - * @class BodyForce + * @class BodyForce * @brief Base class for models of body forces in the momentum eqn */ @@ -32,7 +32,7 @@ namespace ATC { BodyForceViscous(std::fstream &matfile,std::map & parameters); virtual ~BodyForceViscous() {}; virtual bool body_force(const FIELD_MATS &fields, - DENS_MAT &flux) const + DENS_MAT &flux) const { FIELD_MATS::const_iterator v_field = fields.find(VELOCITY); const DENS_MAT & v = v_field->second; @@ -49,20 +49,20 @@ namespace ATC { class BodyForceElectricField : public BodyForce { public: - BodyForceElectricField(std::fstream & /* matfile */,std::map & /* parameters */) + BodyForceElectricField(std::fstream & /* matfile */,std::map & /* parameters */) { throw ATC_Error("unimplemented due to issues with accessing electric field"); } virtual ~BodyForceElectricField() {}; virtual bool body_force(const FIELD_MATS &fields, - DENS_MAT &flux) const + DENS_MAT &flux) const { FIELD_MATS::const_iterator v_field = fields.find(VELOCITY); const DENS_MAT & v = v_field->second; int nNodes = v.nRows(); - flux.reset(nNodes,1); + flux.reset(nNodes,1); return true; } }; } -#endif +#endif diff --git a/lib/atc/CBLattice.cpp b/lib/atc/CBLattice.cpp index c50b8eb3d5..a7d8d750b9 100644 --- a/lib/atc/CBLattice.cpp +++ b/lib/atc/CBLattice.cpp @@ -12,7 +12,7 @@ namespace ATC { std::vector::iterator R(ref_coords_.begin()), Rp; const double TOL = 1.0e-6 * R->dot(*R); - for (; R!=ref_coords_.end(); R++, r++) { + for (; R!=ref_coords_.end(); R++, r++) { for (Rp=R+1; Rp!=ref_coords_.end(); Rp++) { if (sum_difference_squared(*Rp, *R) < TOL) { ref_coords_.erase(R--); @@ -59,13 +59,13 @@ namespace ATC { fid << ((i+1)%3==0 ? "\n" : " "); } fid << "\nCELLS "< cur_bond_len_; //*> Bond lengths (current) std::vector ref_coords_; //*> Atom coordinates (ref) DENS_MAT F_; //*> Deformation gradient }; /** - * @class CBLattice - * @brief Base class that generates a virtual atom clusters given a lattice and + * @class CBLattice + * @brief Base class that generates a virtual atom clusters given a lattice and * a deformation gradient. */ - + class CBLattice { protected: @@ -76,7 +76,7 @@ namespace ATC public: //* Operator that outputs the lattice and basis to a stream. friend std::ostream& operator<<(std::ostream& o, const CBLattice& lattice); - CBLattice(const MATRIX &N, const MATRIX &B); + CBLattice(const MATRIX &N, const MATRIX &B); //* generates the virtual atom cluster void atom_cluster(const MATRIX &F, double cutoff, AtomCluster &v); @@ -87,7 +87,7 @@ namespace ATC }; // hash functions: a, b, c must in range [-128, 127] inline int hash(int a,int b,int c) {return(a+128)|((b+128)<<8)|((c+128)<<16);} - inline void unhash(int r, int &a, int &b, int &c) + inline void unhash(int r, int &a, int &b, int &c) { a = (r&0xFF) - 128; b = ((r>>8)&0xFF) - 128; diff --git a/lib/atc/CG.h b/lib/atc/CG.h index 7821a495b9..975861f9c3 100644 --- a/lib/atc/CG.h +++ b/lib/atc/CG.h @@ -4,28 +4,28 @@ // CG solves the symmetric positive definite linear // system Ax=b using the Conjugate Gradient method. // -// CG follows the algorithm described on p. 15 in the +// CG follows the algorithm described on p. 15 in the // SIAM Templates book. // // The return value indicates convergence within max_iter (input) // iterations (0), or no convergence within max_iter iterations (1). // // Upon successful return, output arguments have the following values: -// +// // x -- approximate solution to Ax = b // max_iter -- the number of iterations performed before the // tolerance was reached // tol -- the residual after the final iteration -// +// //***************************************************************** /** - * @class CG - * @brief Base class for solving the linear system Ax=b using the Conjugate Gradient method + * @class CG + * @brief Base class for solving the linear system Ax=b using the Conjugate Gradient method */ template < class Matrix, class Vector, class DataVector, class Preconditioner, class Real > -int +int CG(const Matrix &A, Vector &x, const DataVector &b, const Preconditioner &M, int &max_iter, Real &tol) { Real resid; DenseVector p, z, q; @@ -44,9 +44,9 @@ CG(const Matrix &A, Vector &x, const DataVector &b, const Preconditioner &M, int // Implicit assumption that only diagonal matrices are being used for preconditioning Preconditioner Minv = M.inv(); - if (normb == 0.0) + if (normb == 0.0) normb = 1; - + if ((resid = r.norm() / normb) <= tol) { tol = resid; max_iter = 0; @@ -56,7 +56,7 @@ CG(const Matrix &A, Vector &x, const DataVector &b, const Preconditioner &M, int for (int i = 0; i < max_iter; i++) { z = Minv*r; rho = r.dot(z); - + if (i == 0) p = z; else { @@ -64,18 +64,18 @@ CG(const Matrix &A, Vector &x, const DataVector &b, const Preconditioner &M, int tmp = p*beta; p = z + tmp; } - + q = A*p; alpha = rho / p.dot(q); x += p*alpha; r -= q*alpha; - - if ((resid = r.norm() / normb) <= tol) + + if ((resid = r.norm() / normb) <= tol) { tol = resid; max_iter = i+1; - return 0; + return 0; } rho_1 = rho; } diff --git a/lib/atc/CauchyBorn.cpp b/lib/atc/CauchyBorn.cpp index 81f7b4e1a8..f00912786d 100644 --- a/lib/atc/CauchyBorn.cpp +++ b/lib/atc/CauchyBorn.cpp @@ -32,7 +32,7 @@ namespace ATC { DENS_MAT L0; DENS_MAT_VEC M0; - // If temperature is nonzero then allocate space for + // If temperature is nonzero then allocate space for // dynamical matrix and its derivative with respect to F. if (finite_temp) { D.reset(3,3); @@ -42,11 +42,11 @@ namespace ATC { l0.reset(3); } - if (F) *F = 0.0; + if (F) *F = 0.0; // if using EAM potential, calculate embedding function and derivatives if (args.potential->terms.embedding) { - + for (INDEX a=0; arho(pair.d); @@ -58,7 +58,7 @@ namespace ATC { DENS_MAT rR = tensor_product(pair.r, pair.R); L0.add_scaled(rR, pair.di*pair.rho_r); DENS_MAT rr = tensor_product(pair.r, pair.r); - rr *= pair.di*pair.di*(pair.rho_rr - pair.di*pair.rho_r); + rr *= pair.di*pair.di*(pair.rho_rr - pair.di*pair.rho_r); diagonal(rr) += pair.di*pair.rho_r; for (int i = 0; i < 3; i++) { for (int k = 0; k < 3; k++) { @@ -96,7 +96,7 @@ namespace ATC { // Loop on all cluster atoms (origin atom not included). for (INDEX a=0; aterms.pairwise) { + if (args.potential->terms.pairwise) { if (F) *F += 0.5*args.potential->phi(pair.d); pair.phi_r = args.potential->phi_r(pair.d); pairwise_stress(pair, s); @@ -104,7 +104,7 @@ namespace ATC { if (args.potential->terms.embedding) { pair.F_p = embed_p; pair.rho_r = args.potential->rho_r(pair.d); - embedding_stress(pair, s); + embedding_stress(pair, s); } if (finite_temp) { // Compute finite T terms. @@ -177,7 +177,7 @@ namespace ATC { for (INDEX a=0; aterms.pairwise) { + if (args.potential->terms.pairwise) { F += 0.5*args.potential->phi(pair.d); } @@ -185,11 +185,11 @@ namespace ATC { pair.r = args.vac.r(a); if (args.potential->terms.pairwise) { pair.phi_r = args.potential->phi_r(pair.d); - pair.phi_rr = args.potential->phi_rr(pair.d); - pair.phi_rrr = args.potential->phi_rrr(pair.d); + pair.phi_rr = args.potential->phi_rr(pair.d); + pair.phi_rrr = args.potential->phi_rrr(pair.d); pairwise_thermal(pair, D); } - if (args.potential->terms.embedding) { + if (args.potential->terms.embedding) { pair.rho_r = args.potential->rho_r(pair.d); pair.rho_rr = args.potential->rho_rr(pair.d); pair.rho_rrr = args.potential->rho_rrr(pair.d); @@ -200,7 +200,7 @@ namespace ATC { } } // if has three-body terms ... TODO compute three-body terms - } + } // Finish finite temperature Cauchy-Born. const double kB = args.boltzmann_constant; const double hbar = args.planck_constant; @@ -209,7 +209,7 @@ namespace ATC { } //if (finite_temp) F += 0.5*args.boltzmann_constant*T*log(det(D)); return F; - } + } //=========================================================================== // Computes the entropic energy TS (minus c_v T) //=========================================================================== @@ -268,7 +268,7 @@ namespace ATC { const double hbar = args.planck_constant;; double F = kB*T*log(pow(hbar/(kB*T),3.0)*sqrt(det(D))); return F; - } + } //=========================================================================== // Computes the stress contribution given the pairwise parameters. //=========================================================================== @@ -295,26 +295,26 @@ namespace ATC { void pairwise_thermal(const PairParam &p, DENS_MAT &D, DENS_MAT_VEC *dDdF) { const double di2 = p.di*p.di; - const double g = p.di*p.phi_r; + const double g = p.di*p.phi_r; const double g_d = p.di*p.phi_rr - p.di*g; // units (energy / length^3) const double f = di2 * (p.phi_rr - g); // units (energy / length^4) const double f_d = di2*(p.phi_rrr-g_d) - 2.0*p.di*f; - // compute needed tensor products of r and R + // compute needed tensor products of r and R const DENS_MAT rr = tensor_product(p.r, p.r); - // compute the dynamical matrix + // compute the dynamical matrix D.add_scaled(rr, f); diagonal(D) += g; - + if (!dDdF) return; // skip derivative const double gp_r = g_d*p.di; const double fp_r = f_d*p.di; - const double fr[] = {f*p.r(0), f*p.r(1), f*p.r(2)}; + const double fr[] = {f*p.r(0), f*p.r(1), f*p.r(2)}; const DENS_MAT rR = tensor_product(p.r, p.R); DENS_MAT_VEC &dD = *dDdF; - + // compute first term in A.13 dD[0].add_scaled(rR, fp_r*rr(0,0) + gp_r); dD[1].add_scaled(rR, fp_r*rr(1,1) + gp_r); @@ -349,13 +349,13 @@ namespace ATC { const double z = di*(2*p.F_p*p.rho_r); const double y = di2*(x-z); - // compute needed tensor products of r and R + // compute needed tensor products of r and R const DENS_MAT rr = tensor_product(p.r, p.r); - // compute the dynamical matrix + // compute the dynamical matrix D.add_scaled(rr, y); diagonal(D) += z; - + if (!dDdF) return; // skip derivative DENS_MAT_VEC &dD = *dDdF; const DENS_MAT rR = tensor_product(p.r, p.R); @@ -382,10 +382,10 @@ namespace ATC { dD[3].add_scaled(L0, b*rr(1,2)); dD[4].add_scaled(L0, b*rr(0,2)); dD[5].add_scaled(L0, b*rr(0,1)); - - //add remaining term + + //add remaining term const double aw = a + w; - const double awr[] = {aw*p.r(0), aw*p.r(1), aw*p.r(2)}; + const double awr[] = {aw*p.r(0), aw*p.r(1), aw*p.r(2)}; for (INDEX L=0; L(6,6),Iu*Iu-IIu); da -= voigt3::derivative_of_square(C); - + dU = tensor_product(U, dfct); dU.add_scaled(da, fct); - U *= fct; + U *= fct; } //============================================================================ // Computes the dynamical matrix (TESTING FUNCTION) @@ -526,11 +526,11 @@ namespace ATC { { DENS_MAT D(3,3); for (INDEX a=0; aphi_r(pair.d); pair.r = args.vac.r(a); - pair.phi_rr = args.potential->phi_rr(pair.d); - pair.phi_rrr = args.potential->phi_rrr(pair.d); + pair.phi_rr = args.potential->phi_rr(pair.d); + pair.phi_rrr = args.potential->phi_rrr(pair.d); pairwise_thermal(pair, D); } return D; @@ -558,7 +558,7 @@ namespace ATC { args.vac.F_(i,j) = Fij - EPS; DENS_MAT Db = compute_dynamical_matrix(args); args.vac.F_(i,j) = Fij; - + dDdF[0](i,j) = (Da(0,0)-Db(0,0))*(0.5/EPS); dDdF[1](i,j) = (Da(1,1)-Db(1,1))*(0.5/EPS); dDdF[2](i,j) = (Da(2,2)-Db(2,2))*(0.5/EPS); diff --git a/lib/atc/CauchyBorn.h b/lib/atc/CauchyBorn.h index fb63afa39b..7770486c14 100644 --- a/lib/atc/CauchyBorn.h +++ b/lib/atc/CauchyBorn.h @@ -13,9 +13,9 @@ namespace ATC { class AtomCluster; /** - * @class StressAtIP - * @brief Class for passing the vector of stresses at quadrature points - * Done by storing the quadrature point and providing indexing + * @class StressAtIP + * @brief Class for passing the vector of stresses at quadrature points + * Done by storing the quadrature point and providing indexing */ class StressAtIP { @@ -30,7 +30,7 @@ namespace ATC { void set_quadrature_point(INDEX qp) { q = qp; } //* Operator that outputs the stress friend std::ostream& operator<<(std::ostream& o, const StressAtIP& s) - { o << "stress\n"; + { o << "stress\n"; o << s(0,0) << " " << s(0,1) << " " << s(0,2) << "\n"; o << s(1,0) << " " << s(1,1) << " " << s(1,2) << "\n"; o << s(2,0) << " " << s(2,1) << " " << s(2,2) << "\n"; @@ -56,7 +56,7 @@ namespace ATC { }; /** - * @class PairParam + * @class PairParam * @brief Class for storing parameters used in pairwise stress computations */ struct PairParam { @@ -82,7 +82,7 @@ namespace ATC { void cb_stress(const StressArgs &args, StressAtIP &s, double *F=0); //* Computes the elastic energy (free or potential if T=0). double cb_energy(const StressArgs &args); - //* Computes the entropic energy + //* Computes the entropic energy double cb_entropic_energy(const StressArgs &args); //* Auxiliary functions for cb_stress //@{ @@ -96,8 +96,8 @@ namespace ATC { void embedding_thermal(const PairParam &p, DENS_MAT &D, DENS_MAT &L0, DENS_MAT_VEC *dDdF=0); //* Last stage of the pairwise finite-T Cauchy-Born stress computation. void thermal_end(const DENS_MAT_VEC &DF, const DENS_MAT &D, const DENS_MAT &F, - const double &T, const double &kb, StressAtIP &s, double *F_w=0); - //* Returns the stretch tensor and its derivative with respect to C (R C-G). + const double &T, const double &kb, StressAtIP &s, double *F_w=0); + //* Returns the stretch tensor and its derivative with respect to C (R C-G). void stretch_tensor_derivative(const DENS_VEC &C, DENS_VEC &U, DENS_MAT &dU); //@} diff --git a/lib/atc/CbEam.h b/lib/atc/CbEam.h index 7b7df175e8..b7740c88ff 100644 --- a/lib/atc/CbEam.h +++ b/lib/atc/CbEam.h @@ -11,75 +11,75 @@ namespace ATC { /** - * @class CbEam - * @brief Class for computing Cauchy-Born quantities for an Embeded-Atom Method material - * (A factor of one-half is already included to split the + * @class CbEam + * @brief Class for computing Cauchy-Born quantities for an Embeded-Atom Method material + * (A factor of one-half is already included to split the * bond energy between atoms) */ class CbEam : public CbPotential { public: - //! Constructor - CbEam(void) : CbPotential(Interactions(PAIRWISE,EAM)) { + //! Constructor + CbEam(void) : CbPotential(Interactions(PAIRWISE,EAM)) { // get pointer to lammps' pair_eam object - lammps_eam = ATC::LammpsInterface::instance()->pair_eam(); - nrho = &lammps_eam->nrho; - nr = &lammps_eam->nr; - nfrho = &lammps_eam->nfrho; - nrhor = &lammps_eam->nrhor; - nz2r = &lammps_eam->nz2r; + lammps_eam = ATC::LammpsInterface::instance()->pair_eam(); + nrho = &lammps_eam->nrho; + nr = &lammps_eam->nr; + nfrho = &lammps_eam->nfrho; + nrhor = &lammps_eam->nrhor; + nz2r = &lammps_eam->nz2r; type2frho = lammps_eam->type2frho; type2rhor = lammps_eam->type2rhor; type2z2r = lammps_eam->type2z2r; - dr = &lammps_eam->dr; - rdr = &lammps_eam->rdr; - drho = &lammps_eam->drho; - rdrho = &lammps_eam->rdrho; + dr = &lammps_eam->dr; + rdr = &lammps_eam->rdr; + drho = &lammps_eam->drho; + rdrho = &lammps_eam->rdrho; rhor_spline = &lammps_eam->rhor_spline; frho_spline = &lammps_eam->frho_spline; z2r_spline = &lammps_eam->z2r_spline; cutmax = &lammps_eam->cutmax; } - + //! Returns the cutoff readius of the EAM potential functions rho and z2r. double cutoff_radius() const { return *cutmax; } - //! Returns the EAM pair energy - double phi(const double &r) const + //! Returns the EAM pair energy + double phi(const double &r) const { double p = r*(*rdr) + 1.0; int m = static_cast (p); m = MIN(m,(*nr)-1); p -= m; p = MIN(p,1.0); - // for now, assume itype = jtype = 1 + // for now, assume itype = jtype = 1 double *coeff = (*z2r_spline)[type2z2r[1][1]][m]; double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; return z2/r; } //! Returns the first derivative of the pair energy. - double phi_r(const double &r) const + double phi_r(const double &r) const { double p = r*(*rdr) + 1.0; int m = static_cast (p); m = MIN(m,(*nr)-1); p -= m; p = MIN(p,1.0); - // for now, assume itype = jtype = 1 + // for now, assume itype = jtype = 1 double *coeff = (*z2r_spline)[type2z2r[1][1]][m]; double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; double z2p = (coeff[0]*p + coeff[1])*p + coeff[2]; return (1.0/r)*(z2p-z2/r); } //! Returns the second derivative of the pair energy. - double phi_rr(const double &r) const + double phi_rr(const double &r) const { double p = r*(*rdr) + 1.0; int m = static_cast (p); m = MIN(m,(*nr)-1); p -= m; p = MIN(p,1.0); - // for now, assume itype = jtype = 1 + // for now, assume itype = jtype = 1 double *coeff = (*z2r_spline)[type2z2r[1][1]][m]; double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; double z2p = (coeff[0]*p + coeff[1])*p + coeff[2]; @@ -94,7 +94,7 @@ namespace ATC m = MIN(m,(*nr)-1); p -= m; p = MIN(p,1.0); - // for now, assume itype = jtype = 1 + // for now, assume itype = jtype = 1 double *coeff = (*z2r_spline)[type2z2r[1][1]][m]; double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; double z2p = (coeff[0]*p + coeff[1])*p + coeff[2]; @@ -102,7 +102,7 @@ namespace ATC double z2ppp = (*rdr)*(*rdr)*2.0*coeff[0]; return (1.0/r)*(z2ppp-3.0*z2pp/r+6.0*z2p/(r*r)-6.0*z2/(r*r*r)); } - //! Returns the EAM atomic charge density. + //! Returns the EAM atomic charge density. double rho(const double &r) const { double p = r*(*rdr) + 1.0; @@ -150,7 +150,7 @@ namespace ATC double *coeff = (*rhor_spline)[type2rhor[1][1]][m]; return ((*rdr)*(*rdr)*2.0*coeff[0]); } - //! Returns the EAM embedding energy. + //! Returns the EAM embedding energy. double F(const double &p) const { double q = p*(*rdrho) + 1.0; @@ -202,7 +202,7 @@ namespace ATC int *type2frho,**type2rhor,**type2z2r; double *cutmax; double *dr,*rdr,*drho,*rdrho; - double ****rhor_spline,****frho_spline,****z2r_spline; + double ****rhor_spline,****frho_spline,****z2r_spline; LAMMPS_NS::PairEAM* lammps_eam; }; } diff --git a/lib/atc/CbLjCut.h b/lib/atc/CbLjCut.h index 53402f281c..1158a8ff37 100644 --- a/lib/atc/CbLjCut.h +++ b/lib/atc/CbLjCut.h @@ -24,24 +24,24 @@ namespace ATC B (4.0*eps*pow(sig, 6)), rcut(cutoff_radius) { } - + //! Returns the cutoff readius of the LJ potential. double cutoff_radius() const { return rcut; } //! Returns the LJ energy between two interacting atoms (6,12). - double phi(const double &r) const + double phi(const double &r) const { const double r6i = 1.0/((r*r*r)*(r*r*r)); return r6i*(A*r6i - B); } //! Returns the first derivative of the LJ energy (7,13). - double phi_r(const double &r) const + double phi_r(const double &r) const { const double ri = 1.0/r; const double r6i = (ri*ri*ri)*(ri*ri*ri); return r6i*ri*(6.0*B - 12.0*A*r6i); } //! Returns the second derivative of the LJ energy (8,14). - double phi_rr(const double &r) const + double phi_rr(const double &r) const { const double r2i = 1.0/(r*r); const double r6i = r2i*r2i*r2i; diff --git a/lib/atc/CbLjSmoothLinear.h b/lib/atc/CbLjSmoothLinear.h index d74b2b5df9..f4708de4f7 100644 --- a/lib/atc/CbLjSmoothLinear.h +++ b/lib/atc/CbLjSmoothLinear.h @@ -23,20 +23,20 @@ namespace ATC A (4.0*eps*pow(sig, 12)), B (4.0*eps*pow(sig, 6)), rcut(cutoff_radius) - { + { ricut = 1.0/rcut; - r6icut = (ricut*ricut*ricut)*(ricut*ricut*ricut); + r6icut = (ricut*ricut*ricut)*(ricut*ricut*ricut); phicut = r6icut*(A*r6icut - B); - dphicut = r6icut*ricut*(6.0*B - 12.0*A*r6icut); + dphicut = r6icut*ricut*(6.0*B - 12.0*A*r6icut); } - + //! Returns the cutoff readius of the LJ potential. double cutoff_radius() const { return rcut; } //! Returns the LJ energy between two interacting atoms (6,12). - double phi(const double &r) const + double phi(const double &r) const { const double r6i = 1.0/((r*r*r)*(r*r*r)); - if (r < rcut) { + if (r < rcut) { return (r6i*(A*r6i - B) - phicut - (r-rcut)*dphicut); } else { @@ -44,11 +44,11 @@ namespace ATC } } //! Returns the first derivative of the LJ energy (7,13). - double phi_r(const double &r) const + double phi_r(const double &r) const { const double ri = 1.0/r; const double r6i = (ri*ri*ri)*(ri*ri*ri); - if (r < rcut) { + if (r < rcut) { return (r6i*ri*(6.0*B - 12.0*A*r6i) - dphicut); } else { @@ -56,7 +56,7 @@ namespace ATC } } //! Returns the second derivative of the LJ energy (8,14). - double phi_rr(const double &r) const + double phi_rr(const double &r) const { const double r2i = 1.0/(r*r); const double r6i = r2i*r2i*r2i; diff --git a/lib/atc/CbPotential.cpp b/lib/atc/CbPotential.cpp index 741e75eb73..0886eec642 100644 --- a/lib/atc/CbPotential.cpp +++ b/lib/atc/CbPotential.cpp @@ -17,7 +17,7 @@ namespace ATC return (phi_r(r+dr)-phi_r(r)) / dr; } // Approximates the third derivative of phi - double CbPotential::phi_rrr(const double &r) const + double CbPotential::phi_rrr(const double &r) const { const double dr = r*EPS; return (phi_rr(r+dr)-phi_rr(r)) / dr; @@ -34,8 +34,8 @@ namespace ATC const double dr = r*EPS; return (rho_r(r+dr)-rho_r(r)) / dr; } - // Approximates the third derivative of rho - double CbPotential::rho_rrr(const double &r) const + // Approximates the third derivative of rho + double CbPotential::rho_rrr(const double &r) const { const double dr = r*EPS; return (rho_rr(r+dr)-rho_rr(r)) / dr; @@ -44,7 +44,7 @@ namespace ATC double CbPotential::F_p(const double &p) const { const double dp = p*EPS; - return (F(p+dp)-F(p)) / dp; + return (F(p+dp)-F(p)) / dp; } // Approximates the second derivative of the embedding function double CbPotential::F_pp(const double &p) const @@ -79,7 +79,7 @@ namespace ATC Interactions::Interactions(int a, int b, int c) { // bitwise OR combines the terms that are listed - const int abc = a|b|c; + const int abc = a|b|c; pairwise = (abc&PAIRWISE)>0; embedding = (abc&EAM)>0; three_body = (abc&THREE_BDY)>0; diff --git a/lib/atc/CbPotential.h b/lib/atc/CbPotential.h index 1d5386fcd5..e0f651852b 100644 --- a/lib/atc/CbPotential.h +++ b/lib/atc/CbPotential.h @@ -29,10 +29,10 @@ namespace ATC protected: //! CbPotential base constructor: //! Initializes which terms are included in energy computation. - //@param potential_terms Switches for atomic interaction terms. + //@param potential_terms Switches for atomic interaction terms. CbPotential(Interactions interaction_terms) : terms(interaction_terms) {} public: - virtual ~CbPotential() {} + virtual ~CbPotential() {} const Interactions terms; //!< switches for types of potential terms. //! Returns the minimum distance that all interactions get neglected. diff --git a/lib/atc/ChargeRegulator.cpp b/lib/atc/ChargeRegulator.cpp index 972530829c..f0f0423e9a 100644 --- a/lib/atc/ChargeRegulator.cpp +++ b/lib/atc/ChargeRegulator.cpp @@ -20,7 +20,7 @@ using std::vector; using std::set; using std::pair; using std::string; - + namespace ATC { @@ -47,7 +47,7 @@ namespace ATC { } } - + //-------------------------------------------------------- // modify: // parses and adjusts charge regulator state based on @@ -97,7 +97,7 @@ namespace ATC { regulators_[tag] = new ChargeRegulatorMethodEffectiveCharge(this,p); break; } - default: + default: throw ATC_Error("ChargeRegulator::construct_method unknown charge regulator type"); } } @@ -110,12 +110,12 @@ namespace ATC { void ChargeRegulator::initialize() { - + map::iterator itr; for (itr = regulators_.begin(); itr != regulators_.end(); itr++) { itr->second->initialize(); } - atc_->set_boundary_integration_type(boundaryIntegrationType_); + atc_->set_boundary_integration_type(boundaryIntegrationType_); AtomicRegulator::reset_nlocal(); AtomicRegulator::delete_unused_data(); needReset_ = false; @@ -152,23 +152,23 @@ namespace ATC { //======================================================== // Class ChargeRegulatorMethod //======================================================== - + //-------------------------------------------------------- // Constructor - // Grab references to ATC and ChargeRegulator + // Grab references to ATC and ChargeRegulator //-------------------------------------------------------- ChargeRegulatorMethod::ChargeRegulatorMethod - (ChargeRegulator *chargeRegulator, + (ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & p) - : RegulatorShapeFunction(chargeRegulator), + : RegulatorShapeFunction(chargeRegulator), chargeRegulator_(chargeRegulator), lammpsInterface_(LammpsInterface::instance()), rC_(0), rCsq_(0), - targetValue_(nullptr), - targetPhi_(p.value), + targetValue_(nullptr), + targetPhi_(p.value), surface_(p.faceset), - atomGroupBit_(p.groupBit), - boundary_(false), + atomGroupBit_(p.groupBit), + boundary_(false), depth_(p.depth), surfaceType_(p.surfaceType), permittivity_(p.permittivity), @@ -185,7 +185,7 @@ namespace ATC { point_.reset(nsd_); for (int i=0; i < nsd_; i++) { point_(i) = faceCoords(i,0); } #ifdef ATC_VERBOSE - stringstream ss; ss << "point: (" << point_(0) << "," << point_(1) << "," << point_(2) << ") normal: (" << normal_(0) << "," << normal_(1) << "," << normal_(2) << ") depth: " << depth_; + stringstream ss; ss << "point: (" << point_(0) << "," << point_(1) << "," << point_(2) << ") normal: (" << normal_(0) << "," << normal_(1) << "," << normal_(2) << ") depth: " << depth_; lammpsInterface_->print_msg_once(ss.str()); #endif sum_.reset(nsd_); @@ -193,7 +193,7 @@ namespace ATC { //-------------------------------------------------------- // Initialize - + //-------------------------------------------------------- @@ -217,7 +217,7 @@ namespace ATC { // note derived method set initialized to true } - + int ChargeRegulatorMethod::nlocal() { return atc_->nlocal(); } void ChargeRegulatorMethod::set_greens_functions(void) @@ -260,14 +260,14 @@ namespace ATC { // Constructor //-------------------------------------------------------- ChargeRegulatorMethodFeedback::ChargeRegulatorMethodFeedback - (ChargeRegulator *chargeRegulator, + (ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & p) : ChargeRegulatorMethod (chargeRegulator, p), controlNodes_(nodes_), influenceGroupBit_(p.groupBit) { - nControlNodes_ = controlNodes_.size(); - sum_.resize(1); + nControlNodes_ = controlNodes_.size(); + sum_.resize(1); } //-------------------------------------------------------- // Initialize @@ -275,10 +275,10 @@ namespace ATC { void ChargeRegulatorMethodFeedback::initialize(void) { ChargeRegulatorMethod::initialize(); - if (surfaceType_ != ChargeRegulator::CONDUCTOR) + if (surfaceType_ != ChargeRegulator::CONDUCTOR) throw ATC_Error("currently charge feedback can only mimic a conductor"); - set_influence(); - set_influence_matrix(); + set_influence(); + set_influence_matrix(); initialized_ = true; } //-------------------------------------------------------- @@ -299,13 +299,13 @@ namespace ATC { } } //-------------------------------------------------------- - // find measurement atoms and nodes + // find measurement atoms and nodes //-------------------------------------------------------- void ChargeRegulatorMethodFeedback::set_influence(void) { // get nodes that overlap influence atoms & compact list of influence atoms - boundary_ = + boundary_ = atc_->nodal_influence(influenceGroupBit_,influenceNodes_,influenceAtoms_); nInfluenceAtoms_ = influenceAtoms_.size(); // local nInfluenceNodes_ = influenceNodes_.size(); // global @@ -313,13 +313,13 @@ namespace ATC { lammpsInterface_->print_msg(ss.str()); if (nInfluenceNodes_ == 0) throw ATC_Error("no influence nodes"); - const Array & map = (boundary_) ? atc_->ghost_to_atom_map() : atc_->internal_to_atom_map(); + const Array & map = (boundary_) ? atc_->ghost_to_atom_map() : atc_->internal_to_atom_map(); for (set::const_iterator itr = influenceAtoms_.begin(); itr != influenceAtoms_.end(); itr++) { influenceAtomsIds_.insert(map(*itr)); } } //-------------------------------------------------------- - // constuct a Green's submatrix + // constuct a Green's submatrix //-------------------------------------------------------- void ChargeRegulatorMethodFeedback::set_influence_matrix(void) { @@ -329,7 +329,7 @@ namespace ATC { // if (nInfluenceNodes_ < nControlNodes_) throw ATC_Error(" least square not implemented "); if (nInfluenceNodes_ > nControlNodes_) throw ATC_Error(" solve not possible "); - DENS_MAT G(nInfluenceNodes_,nControlNodes_); + DENS_MAT G(nInfluenceNodes_,nControlNodes_); DENS_VEC G_I; set::const_iterator itr,itr2,itr3; const Array & nmap = atc_->fe_engine()->fe_mesh()->global_to_unique_map(); @@ -339,7 +339,7 @@ namespace ATC { int j = 0; for (itr2 = controlNodes_.begin(); itr2 != controlNodes_.end(); itr2++) { int jnode = nmap(*itr2); - G(i,j++) = G_I(jnode); + G(i,j++) = G_I(jnode); } i++; } @@ -371,33 +371,33 @@ namespace ATC { } // swap contributions across processors DENS_MAT localNNT = NNT; - int count = NNT.nRows()*NNT.nCols(); + int count = NNT.nRows()*NNT.nCols(); lammpsInterface_->allsum(localNNT.ptr(),NNT.ptr(),count); invNNT_ = inv(NNT); - + // total influence matrix if (nInfluenceAtoms_ > 0) { NTinvNNTinvG_ = NT_*invNNT_*invG_; } } - + //-------------------------------------------------------- // change potential/charge pre-force calculation //-------------------------------------------------------- void ChargeRegulatorMethodFeedback::apply_pre_force(double /* dt */) { - sum_ = 0; + sum_ = 0; if (nInfluenceAtoms_ == 0) return; // nothing to do apply_feedback_charges(); } //-------------------------------------------------------- - // apply feedback charges to atoms + // apply feedback charges to atoms //-------------------------------------------------------- void ChargeRegulatorMethodFeedback::apply_feedback_charges() { double * q = lammpsInterface_->atom_charge(); // calculate error in potential on the control nodes - + const DENS_MAT & phiField = (atc_->field(ELECTRIC_POTENTIAL)).quantity(); DENS_MAT dphi(nControlNodes_,1); int i = 0; @@ -410,10 +410,10 @@ namespace ATC { DENS_MAT dq = NTinvNNTinvG_*dphi; i = 0; for (itr = influenceAtomsIds_.begin(); itr != influenceAtomsIds_.end(); itr++) { - sum_(0) += dq(i,0); - q[*itr] += dq(i++,0); + sum_(0) += dq(i,0); + q[*itr] += dq(i++,0); } - + (interscaleManager_->fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE))->force_reset(); (interscaleManager_->fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE, GHOST))->force_reset(); } @@ -425,7 +425,7 @@ namespace ATC { // Constructor //-------------------------------------------------------- ChargeRegulatorMethodImageCharge::ChargeRegulatorMethodImageCharge - (ChargeRegulator *chargeRegulator, + (ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & p) : ChargeRegulatorMethod (chargeRegulator, p), imageNodes_(nodes_) @@ -459,12 +459,12 @@ namespace ATC { { sum_ = 0; apply_local_forces(); - + //correct_forces(); } - + //-------------------------------------------------------- - // apply local coulomb forces + // apply local coulomb forces // -- due to image charges //-------------------------------------------------------- void ChargeRegulatorMethodImageCharge::apply_local_forces() @@ -477,8 +477,8 @@ namespace ATC { const int *mask = lammpsInterface_->atom_mask(); ///.............................................. - double ** x = lammpsInterface_->xatom(); - double ** f = lammpsInterface_->fatom(); + double ** x = lammpsInterface_->xatom(); + double ** f = lammpsInterface_->fatom(); double * q = lammpsInterface_->atom_charge(); // loop over neighbor list @@ -487,13 +487,13 @@ namespace ATC { double qi = q[i]; if ((mask[i] & atomGroupBit_) && qi != 0.) { double* fi = f[i]; - DENS_VEC xi(x[i],nsd_); + DENS_VEC xi(x[i],nsd_); // distance to surface double dn = reflect(xi); // all ions near the interface/wall // (a) self image if (dn < rC_) { // close enough to wall to have explicit image charges - double factor_coul = 1; + double factor_coul = 1; double dx = 2.*dn; // distance to image charge double fn = factor_coul*qi*qi*permittivityRatio_/dx; fi[0] += fn*normal_[0]; @@ -513,8 +513,8 @@ namespace ATC { dn = reflect(xj); DENS_VEC dx = xi-xj; double r2 = dx.norm_sq(); - // neighbor image j' inside cutoff from i - if (r2 < rCsq_) { + // neighbor image j' inside cutoff from i + if (r2 < rCsq_) { double fm = factor_coul*qi*qj*permittivityRatio_/r2; fi[0] += fm*dx(0); fi[1] += fm*dx(1); @@ -532,7 +532,7 @@ namespace ATC { //-------------------------------------------------------- // correct charge densities - // - to reflect image charges + // - to reflect image charges //-------------------------------------------------------- void ChargeRegulatorMethodImageCharge::correct_charge_densities() { @@ -554,19 +554,19 @@ namespace ATC { //-------------------------------------------------------- // Constructor //-------------------------------------------------------- - - ChargeRegulatorMethodEffectiveCharge::ChargeRegulatorMethodEffectiveCharge( - ChargeRegulator *chargeRegulator, + + ChargeRegulatorMethodEffectiveCharge::ChargeRegulatorMethodEffectiveCharge( + ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & p) : ChargeRegulatorMethod (chargeRegulator, p), chargeDensity_(p.value), - useSlab_(false) + useSlab_(false) { } //-------------------------------------------------------- // add_charged_surface //-------------------------------------------------------- - void ChargeRegulatorMethodEffectiveCharge::initialize( ) + void ChargeRegulatorMethodEffectiveCharge::initialize( ) { ChargeRegulatorMethod::initialize(); boundary_ = atc_->is_ghost_group(atomGroupBit_); @@ -644,7 +644,7 @@ namespace ATC { //-------------------------------------------------------- // add effective forces post LAMMPS force call //-------------------------------------------------------- - void ChargeRegulatorMethodEffectiveCharge::apply_post_force(double /* dt */) + void ChargeRegulatorMethodEffectiveCharge::apply_post_force(double /* dt */) { apply_local_forces(); } @@ -664,7 +664,7 @@ namespace ATC { const DENS_MAT & xa((interscaleManager_->per_atom_quantity("AtomicCoarseGrainingPositions"))->quantity()); // WORKSPACE - most are static - SparseVector dv(nNodes_); + SparseVector dv(nNodes_); vector > derivativeVectors; derivativeVectors.reserve(nsd_); const SPAR_MAT_VEC & shapeFunctionDerivatives((interscaleManager_->vector_sparse_matrix("InterpolateGradient"))->quantity()); @@ -674,7 +674,7 @@ namespace ATC { NODE_TO_XF_MAP::const_iterator inode; for (inode = nodeXFMap_.begin(); inode != nodeXFMap_.end(); inode++) { - + int node = inode->first; DENS_VEC xI = (inode->second).first; double qI = (inode->second).second; @@ -682,46 +682,46 @@ namespace ATC { for (int i = 0; i < nlocal(); i++) { int atom = (atc_->internal_to_atom_map())(i); double qa = q[atom]; - if (qa != 0) { + if (qa != 0) { double dxSq = 0.; for (int j = 0; j < nsd_; j++) { dx[j] = xa(i,j) - xI(j); dxSq += dx[j]*dx[j]; } - if (dxSq < rCsq_) { + if (dxSq < rCsq_) { // first apply pairwise coulombic interaction - if (!useSlab_) { + if (!useSlab_) { double coulForce = qqrd2e_*qI*qa/(dxSq*sqrtf(dxSq)); for (int j = 0; j < nsd_; j++) { _atomElectricalForce_(i,j) += dx[j]*coulForce; } } - + // second correct for FE potential induced by BCs // determine shape function derivatives at atomic location // and construct sparse vectors to store derivative data - - + + for (int j = 0; j < nsd_; j++) { shapeFunctionDerivatives[j]->row(i,nodeValues,nodeIndices); derivativeVectors.push_back(dv); for (int k = 0; k < nodeIndices.size(); k++) { derivativeVectors[j](nodeIndices(k)) = nodeValues(k); } } - + // compute greens function from charge quadrature - - SparseVector shortFePotential(nNodes_); + + SparseVector shortFePotential(nNodes_); shortFePotential.add_scaled(greensFunctions_[node],penalty*phiI); - + // compute electric field induced by charge DENS_VEC efield(nsd_); for (int j = 0; j < nsd_; j++) { efield(j) = -.1*dot(derivativeVectors[j],shortFePotential); } - + // apply correction in atomic forces double c = qV2e_*qa; for (int j = 0; j < nsd_; j++) { - if ((!useSlab_) || (j==nsd_)) { + if ((!useSlab_) || (j==nsd_)) { _atomElectricalForce_(i,j) -= c*efield(j); } } @@ -729,7 +729,7 @@ namespace ATC { } } } - + } }; // end namespace diff --git a/lib/atc/ChargeRegulator.h b/lib/atc/ChargeRegulator.h index f250a955e8..d076f5a315 100644 --- a/lib/atc/ChargeRegulator.h +++ b/lib/atc/ChargeRegulator.h @@ -17,7 +17,7 @@ namespace ATC { class ChargeRegulatorMethod; class ChargeRegulator : public AtomicRegulator { - + public: /** charge regulator types */ @@ -43,21 +43,21 @@ namespace ATC { permittivity(0), surfaceType(INSULATOR) { }; ChargeRegulatorType method; - double value; + double value; int groupBit; std::string groupTag; double depth; - double permittivity; + double permittivity; ChargedSurfaceType surfaceType; - FSET faceset; + FSET faceset; }; /** constructor */ ChargeRegulator(ATC_Coupling *atc); - + /** destructor */ ~ChargeRegulator(); - + /** parser/modifier */ virtual bool modify(int narg, char **arg); virtual void construct_methods(); @@ -67,8 +67,8 @@ namespace ATC { virtual void output(OUTPUT_LIST & outputData) const; virtual double compute_vector(int /* n */) const {return 0;} // TODO - void assign_poisson_solver(PoissonSolver * solver) { poissonSolver_ = solver;} - PoissonSolver * poisson_solver(void) { return poissonSolver_;} + void assign_poisson_solver(PoissonSolver * solver) { poissonSolver_ = solver;} + PoissonSolver * poisson_solver(void) { return poissonSolver_;} protected: @@ -86,19 +86,19 @@ namespace ATC { /** * @class ChargeRegulatorMethod - * @brief Base class for implementation of ChargeRegulator algorithms + * @brief Base class for implementation of ChargeRegulator algorithms */ class ChargeRegulatorMethod : public RegulatorShapeFunction { - + public: ChargeRegulatorMethod(ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & parameters); ~ChargeRegulatorMethod(){}; - virtual void initialize(void); + virtual void initialize(void); void set_greens_functions(); - virtual void apply_pre_force(double /* dt */){}; - virtual void apply_post_force(double /* dt */){}; + virtual void apply_pre_force(double /* dt */){}; + virtual void apply_post_force(double /* dt */){}; virtual void set_weights() {}; const DENS_VEC & total_influence() const { return sum_;} virtual void output(OUTPUT_LIST & outputData); @@ -120,13 +120,13 @@ namespace ATC { /** conversion constants */ double qV2e_, qqrd2e_; /** member data */ - XT_Function * targetValue_; - double targetPhi_; - // controlling + XT_Function * targetValue_; + double targetPhi_; + // controlling FSET surface_; NSET nodes_; int atomGroupBit_; - bool boundary_; // atoms on boundary + bool boundary_; // atoms on boundary DENS_VEC point_; DENS_VEC normal_; double depth_; @@ -147,13 +147,13 @@ namespace ATC { */ class ChargeRegulatorMethodFeedback : public ChargeRegulatorMethod { - + public: - + /** constructor */ ChargeRegulatorMethodFeedback(ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & parameters); - + /** destructor */ ~ChargeRegulatorMethodFeedback(){}; @@ -161,30 +161,30 @@ namespace ATC { virtual void construct_transfers(); /** initialize */ - virtual void initialize(void); + virtual void initialize(void); - /** set influence nodes and atoms */ + /** set influence nodes and atoms */ void set_influence(); - void set_influence_matrix(void); + void set_influence_matrix(void); /** post first verlet step */ - virtual void apply_pre_force(double dt); + virtual void apply_pre_force(double dt); void apply_feedback_charges(); protected: - int nControlNodes_; + int nControlNodes_; NSET & controlNodes_; // measurement/controlled int influenceGroupBit_; int nInfluenceAtoms_; - NSET influenceAtoms_, influenceAtomsIds_; + NSET influenceAtoms_, influenceAtomsIds_; int nInfluenceNodes_; NSET influenceNodes_; - - + + DENS_MAT invG_; DENS_MAT invNNT_; DENS_MAT NT_; @@ -200,26 +200,26 @@ namespace ATC { */ class ChargeRegulatorMethodImageCharge : public ChargeRegulatorMethod { - + public: - + /** constructor */ ChargeRegulatorMethodImageCharge(ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & parameters); - + /** destructor */ ~ChargeRegulatorMethodImageCharge(){}; /** initialize */ - virtual void initialize(void); + virtual void initialize(void); /** post first verlet step */ - virtual void apply_post_force(double dt); + virtual void apply_post_force(double dt); protected: - double reflect(DENS_VEC & x) const { + double reflect(DENS_VEC & x) const { double dn = (x-point_).dot(normal_); - x -= 2*dn*normal_; + x -= 2*dn*normal_; return dn; } // internal functions @@ -229,8 +229,8 @@ namespace ATC { double layerDepth_; double permittivityRatio_; - NSET & imageNodes_; - DENS_MAT imageTransferOp_; + NSET & imageNodes_; + DENS_MAT imageTransferOp_; private: ChargeRegulatorMethodImageCharge(); // DO NOT define this @@ -244,21 +244,21 @@ namespace ATC { class ChargeRegulatorMethodEffectiveCharge : public ChargeRegulatorMethod { typedef std::map > NODE_TO_XF_MAP; - + public: - + /** constructor */ ChargeRegulatorMethodEffectiveCharge(ChargeRegulator *chargeRegulator, ChargeRegulator::ChargeRegulatorParameters & parameters); - + /** destructor */ ~ChargeRegulatorMethodEffectiveCharge(){}; /** initialize */ - virtual void initialize(void); + virtual void initialize(void); /** post first verlet step */ - virtual void apply_post_force(double dt); + virtual void apply_post_force(double dt); protected: // internal functions @@ -268,7 +268,7 @@ namespace ATC { double chargeDensity_; std::map nodalChargePotential_; - NODE_TO_XF_MAP nodeXFMap_; + NODE_TO_XF_MAP nodeXFMap_; bool useSlab_; @@ -276,7 +276,7 @@ namespace ATC { private: ChargeRegulatorMethodEffectiveCharge(); // DO NOT define this }; - + }; #endif diff --git a/lib/atc/CloneVector.h b/lib/atc/CloneVector.h index 63d11636b3..0b80b57628 100644 --- a/lib/atc/CloneVector.h +++ b/lib/atc/CloneVector.h @@ -7,7 +7,7 @@ namespace ATC_matrix { /** - * @class CloneVector + * @class CloneVector * @brief Class for creating objects that wrap matrix data for manipulation through vector operations */ @@ -39,7 +39,7 @@ public: private: void _resize(INDEX nRows, INDEX nCols, bool copy, bool zero); - + Vector * const _baseV; // ptr to a base vector Matrix * const _baseM; // ptr to a base matrix int _clone_type; // what to clone (see enum CLONE_TYPE) @@ -52,7 +52,7 @@ private: //----------------------------------------------------------------------------- template CloneVector::CloneVector(const Vector &c) - : Vector(), _baseV(const_cast*>(&c)), _baseM(nullptr) + : Vector(), _baseV(const_cast*>(&c)), _baseM(nullptr) {} //----------------------------------------------------------------------------- // Construct from a matrix, the const_cast isn't pretty @@ -64,7 +64,7 @@ CloneVector::CloneVector(const Vector &c) */ //----------------------------------------------------------------------------- template -CloneVector::CloneVector(const Matrix &c, int dim, INDEX idx) +CloneVector::CloneVector(const Matrix &c, int dim, INDEX idx) : Vector(), _baseV(nullptr), _baseM(const_cast*>(&c)) , _clone_type(dim), _idx(idx) {} @@ -72,7 +72,7 @@ CloneVector::CloneVector(const Matrix &c, int dim, INDEX idx) // Construct from a DiagonalMatrix //----------------------------------------------------------------------------- template -CloneVector::CloneVector(const DiagonalMatrix &c, INDEX /* idx */) +CloneVector::CloneVector(const DiagonalMatrix &c, INDEX /* idx */) : Vector(), _baseV(nullptr), _baseM(const_cast*>(&c)) , _clone_type(CLONE_DIAG), _idx(0) {} @@ -80,7 +80,7 @@ CloneVector::CloneVector(const DiagonalMatrix &c, INDEX /* idx */) // value (const) indexing operator //----------------------------------------------------------------------------- template - T CloneVector::operator()(INDEX i, INDEX /* j */) const + T CloneVector::operator()(INDEX i, INDEX /* j */) const { return (*this)[i]; } @@ -134,7 +134,7 @@ INDEX CloneVector::nRows() const template CloneVector& CloneVector::operator=(const T &v) { - this->set_all_elements_to(v); + this->set_all_elements_to(v); return *this; } //----------------------------------------------------------------------------- @@ -144,7 +144,7 @@ template CloneVector& CloneVector::operator=(const CloneVector &C) { GCK(*this, C, this->size()!=C.size(), "Error in CloneVector:operator="); - int sz = this->size(); + int sz = this->size(); for (INDEX i = 0; i < sz; i++) (*this)[i] = C[i]; return *this; } @@ -155,7 +155,7 @@ template CloneVector& CloneVector::operator=(const Matrix &C) { GCK(*this, C, this->size()!=C.size(), "Error in CloneVector:operator="); - int sz = this->size(); + int sz = this->size(); for (INDEX i = 0; i < sz; i++) (*this)[i] = C[i]; return *this; } @@ -168,7 +168,7 @@ bool CloneVector::memory_contiguous() const // drill down through clone of clones if (_baseV) return _baseV->memory_contiguous(); // could be okay if DiagonalMatrix, but can't guarantee this - if (_clone_type == CLONE_DIAG) return false; + if (_clone_type == CLONE_DIAG) return false; #ifdef ROW_STORAGE return _clone_type == CLONE_ROW; #else @@ -199,7 +199,7 @@ T* CloneVector::ptr() const template void CloneVector::_resize(INDEX nRows, INDEX nCols, bool copy, bool zero) { - if (_baseV) + if (_baseV) { if (copy) _baseV->resize(nRows, nCols, copy); else _baseV->reset (nRows, nCols, zero); @@ -232,7 +232,7 @@ void CloneVector::resize(INDEX nRows, INDEX nCols, bool copy) _resize(nRows, nCols, copy, false); } //----------------------------------------------------------------------------- -// resizes the matrix and optionally zeros it out +// resizes the matrix and optionally zeros it out //----------------------------------------------------------------------------- template void CloneVector::reset(INDEX nRows, INDEX nCols, bool zero) diff --git a/lib/atc/ConcentrationRegulator.cpp b/lib/atc/ConcentrationRegulator.cpp index 499a5501c1..b6aa6c5265 100644 --- a/lib/atc/ConcentrationRegulator.cpp +++ b/lib/atc/ConcentrationRegulator.cpp @@ -41,7 +41,7 @@ const double kMinScale_ = 10000.; } if (parameters_.size()) parameters_.clear(); } - + //-------------------------------------------------------- // modify: // parses and adjusts charge regulator state based on @@ -66,7 +66,7 @@ const double kMinScale_ = 10000.; // consruct new ones map::iterator itr; for (itr = parameters_.begin(); - itr != parameters_.end(); itr++) { + itr != parameters_.end(); itr++) { string tag = itr->first; if (regulators_.find(tag) != regulators_.end()) delete regulators_[tag]; ConcentrationRegulatorParameters & p = itr->second; @@ -82,7 +82,7 @@ const double kMinScale_ = 10000.; regulators_[tag] = new ConcentrationRegulatorMethodTransition(this,p); break; } - default: + default: throw ATC_Error("ConcentrationRegulator::initialize unknown concentration regulator type"); } } @@ -93,12 +93,12 @@ const double kMinScale_ = 10000.; //-------------------------------------------------------- void ConcentrationRegulator::initialize() { - + map::iterator itr; for (itr = regulators_.begin(); itr != regulators_.end(); itr++) { itr->second->initialize(); } - atc_->set_boundary_integration_type(boundaryIntegrationType_); + atc_->set_boundary_integration_type(boundaryIntegrationType_); AtomicRegulator::reset_nlocal(); AtomicRegulator::delete_unused_data(); needReset_ = false; @@ -157,7 +157,7 @@ const double kMinScale_ = 10000.; map::const_iterator itr; for (itr = regulators_.begin(); - itr != regulators_.end(); itr++) { + itr != regulators_.end(); itr++) { if (c++ == n) { return itr->second->compute_vector(m); } } return 0.; @@ -168,34 +168,34 @@ const double kMinScale_ = 10000.; //-------------------------------------------------------- int ConcentrationRegulator::size_vector(int /* i */) const { - int n = (regulators_.size())*5; - if (n==0) n = 20; - return n; + int n = (regulators_.size())*5; + if (n==0) n = 20; + return n; } //======================================================== // Class ConcentrationRegulatorMethodTransition //======================================================== - + //-------------------------------------------------------- // Constructor - // Grab references to ATC and ConcentrationRegulator + // Grab references to ATC and ConcentrationRegulator //-------------------------------------------------------- ConcentrationRegulatorMethodTransition::ConcentrationRegulatorMethodTransition - (ConcentrationRegulator *concReg, + (ConcentrationRegulator *concReg, ConcentrationRegulator::ConcentrationRegulatorParameters & p) - : ConcentrationRegulatorMethod(concReg), + : ConcentrationRegulatorMethod(concReg), concentrationRegulator_(concReg), interscaleManager_(nullptr), lammpsInterface_(LammpsInterface::instance()), list_(nullptr), - targetConcentration_(p.value), - targetCount_(0), + targetConcentration_(p.value), + targetCount_(0), elemset_(p.elemset), p_(nullptr), - randomNumberGenerator_(nullptr), + randomNumberGenerator_(nullptr), q0_(0), - controlType_(p.type), + controlType_(p.type), controlIndex_(0), transitionType_(p.transitionType), transitionInterval_(p.transitionInterval), @@ -241,7 +241,7 @@ const double kMinScale_ = 10000.; PerAtomQuantity * a2el = atc_->atom_to_element_map(); list_ = new AtomInElementSet(atc_,a2el,elemset_,controlType_); - + nNodes_ = atc_->num_nodes(); DENS_MAT conc(nNodes_,1); conc = targetConcentration_; DENS_VEC integral = atc_->fe_engine()->integrate(conc,elemset_); @@ -250,7 +250,7 @@ const double kMinScale_ = 10000.; volumes_.resize(elemset_.size()); ESET::const_iterator itr; int i = 0; - DENS_MAT c(nNodes_,1); c = 1; + DENS_MAT c(nNodes_,1); c = 1; V_ = 0.; for (itr = elemset_.begin(); itr != elemset_.end(); itr++, i++) { ESET e; e.insert(*itr); @@ -261,14 +261,14 @@ const double kMinScale_ = 10000.; volumes_ *= 1./V_; for (int i = 1; i < volumes_.size(); i++) { volumes_(i) += volumes_(i-1); - } + } // record original energetic properties int ntypes = lammpsInterface_->ntypes(); epsilon0_.reset(ntypes); p_ = lammpsInterface_->potential(); lammpsInterface_->epsilons(controlType_,p_,epsilon0_.ptr()); - + #ifdef ATC_VERBOSE string msg = "type "+to_string(controlType_)+" target count " + to_string(targetCount_); msg += " volume " + to_string(V_); @@ -280,11 +280,11 @@ const double kMinScale_ = 10000.; } double ConcentrationRegulatorMethodTransition::uniform() const { _rngUniformCounter_++; - return lammpsInterface_->random_uniform(randomNumberGenerator_); + return lammpsInterface_->random_uniform(randomNumberGenerator_); } double ConcentrationRegulatorMethodTransition::normal() const { _rngNormalCounter_++; - return lammpsInterface_->random_normal(randomNumberGenerator_); + return lammpsInterface_->random_normal(randomNumberGenerator_); } //-------------------------------------------------------- // pre exchange @@ -294,7 +294,7 @@ const double kMinScale_ = 10000.; // return if should not be called on this timestep if ( ! lammpsInterface_->now(frequency_)) return; nexchanges_ = excess(); - int n = abs(nexchanges_); + int n = abs(nexchanges_); bool success = false; if (nexchanges_ > 0) { success = delete_atoms(n); } else if (nexchanges_ < 0) { success = insert_atoms(n); } @@ -308,7 +308,7 @@ const double kMinScale_ = 10000.; } transitionCounter_=0; transition(); - } + } //-------------------------------------------------------- // pre force //-------------------------------------------------------- @@ -319,28 +319,28 @@ const double kMinScale_ = 10000.; //-------------------------------------------------------- // accept //-------------------------------------------------------- - bool ConcentrationRegulatorMethodTransition::accept(double energy, double /* T */) const - { + bool ConcentrationRegulatorMethodTransition::accept(double energy, double /* T */) const + { #ifdef ATC_VERBOSE2 if (energy < maxEnergy_) lammpsInterface_->print_msg(" energy "+to_string(energy)+" "+to_string(rngCounter_)); #endif return (energy < maxEnergy_); - } + } //-------------------------------------------------------- // energy //-------------------------------------------------------- - double ConcentrationRegulatorMethodTransition::energy(int id) const + double ConcentrationRegulatorMethodTransition::energy(int id) const { double e = lammpsInterface_->shortrange_energy(id,maxEnergy_); #ifdef ATC_VERBOSE -{ +{ int * tag = lammpsInterface_->atom_tag(); lammpsInterface_->print_msg(to_string(controlType_)+" deletion energy "+to_string(e)+" id "+to_string(tag[id])+" "+to_string(_rngUniformCounter_)+":"+to_string(_rngNormalCounter_)); } #endif return e; } - double ConcentrationRegulatorMethodTransition::energy(double * x) const + double ConcentrationRegulatorMethodTransition::energy(double * x) const { double e = lammpsInterface_->shortrange_energy(x,controlType_,maxEnergy_); #ifdef ATC_VERBOSE @@ -375,8 +375,8 @@ const double kMinScale_ = 10000.; bool ConcentrationRegulatorMethodTransition::delete_atoms(int n) { ID_PAIR idPair; - - deletionIds_.clear(); + + deletionIds_.clear(); int deletions = 0; int attempts = 0; while(deletions < n && attempts < maxAttempts_){ @@ -406,7 +406,7 @@ const double kMinScale_ = 10000.; //-------------------------------------------------------- double ConcentrationRegulatorMethodTransition::deletion_id(ID_PAIR & id) const { - if (atc_->parallel_consistency()) return deletion_id_consistent(id); + if (atc_->parallel_consistency()) return deletion_id_consistent(id); else return deletion_id_free(id); } double ConcentrationRegulatorMethodTransition::deletion_id_consistent(ID_PAIR & id) const @@ -422,12 +422,12 @@ const double kMinScale_ = 10000.; double min = ntotal; int * tag = lammpsInterface_->atom_tag(); for (itr = list.begin(); itr != list.end(); itr++) { - int atag = tag[itr->second]; + int atag = tag[itr->second]; double d = fabs(atag-r); if (d < min) { min = d; idx = i; - } + } i++; } int imin = kMinScale_*min; @@ -455,7 +455,7 @@ const double kMinScale_ = 10000.; r *= ntotal; if ( (r >= nrank-n) && (r < nrank)) { // pick processor - r = uniform(); + r = uniform(); int idx = rnd(r*(n-1)); id = list_->item(idx); // avoid repeats @@ -463,7 +463,7 @@ const double kMinScale_ = 10000.; l.erase(l.begin()+idx); return energy(id.second); } - else { + else { return maxEnergy_; } } @@ -474,7 +474,7 @@ const double kMinScale_ = 10000.; { insertionIds_.clear(); - DENS_VEC x(3); x = 0; + DENS_VEC x(3); x = 0; DENS_VEC v(3); v = 0; const DENS_MAN & T = atc_->field(TEMPERATURE); int additions = 0; @@ -482,7 +482,7 @@ const double kMinScale_ = 10000.; while(additions < n && attempts < maxAttempts_){ if(accept(insertion_location(x))) { DENS_VEC Tv = atc_->fe_engine()->interpolate_field(x,T); -Tv(0) = 300.; +Tv(0) = 300.; pick_velocity(v,Tv(0)); // 3 normal int nlocal = lammpsInterface_->insert_atom(transitionType_,controlMask_,x.ptr(),v.ptr()); // no charge insertionIds_.push_back(pair(-1,nlocal)); // atc id unknown @@ -540,7 +540,7 @@ Tv(0) = 300.; //-------------------------------------------------------- double ConcentrationRegulatorMethodTransition::insertion_location(DENS_VEC & x) const { - // pick random element + // pick random element int elem = pick_element(); // 1 uniform // pick random local coordinate DENS_VEC xi(3); @@ -552,8 +552,8 @@ Tv(0) = 300.; #endif return energy(x.ptr()); } - else { - return maxEnergy_; + else { + return maxEnergy_; } } //-------------------------------------------------------- @@ -573,7 +573,7 @@ Tv(0) = 300.; // pick coordinates //-------------------------------------------------------- void ConcentrationRegulatorMethodTransition::pick_coordinates(const int elem, - DENS_VEC & xi, + DENS_VEC & xi, DENS_VEC & x) const { xi.reset(3); @@ -600,9 +600,9 @@ Tv(0) = 300.; void ConcentrationRegulatorMethodTransition::transition() { transitionCounter_++; - //if (insertionIds_.size() == 0) return; // - if (transitionCounter_> transitionInterval_) { - nInTransition_ = 0; + //if (insertionIds_.size() == 0) return; // + if (transitionCounter_> transitionInterval_) { + nInTransition_ = 0; return; } else if (transitionCounter_==transitionInterval_) { @@ -611,10 +611,10 @@ Tv(0) = 300.; else { transitionFactor_ = insertion_factor(transitionCounter_); if (nInTransition_ < 0) transitionFactor_ = 1-transitionFactor_; - double q = 0; + double q = 0; lammpsInterface_->set_charge(transitionType_,q); DENS_VEC eps = epsilon0_; - + lammpsInterface_->set_epsilons(transitionType_,p_,eps.ptr()); lammpsInterface_->pair_reinit(); // epsilon } @@ -624,7 +624,7 @@ Tv(0) = 300.; //-------------------------------------------------------- double ConcentrationRegulatorMethodTransition::compute_vector(int n) const { - if (n==0) return count() - targetCount_; + if (n==0) return count() - targetCount_; else if (n==1) return count()/V_; else if (n==2) return (1.-transitionFactor_)*nInTransition_; else if (n==3) return _rngUniformCounter_; diff --git a/lib/atc/ConcentrationRegulator.h b/lib/atc/ConcentrationRegulator.h index 952cf88339..89810f4e49 100644 --- a/lib/atc/ConcentrationRegulator.h +++ b/lib/atc/ConcentrationRegulator.h @@ -16,13 +16,13 @@ namespace ATC { class ConcentrationRegulatorMethod; class ConcentrationRegulator : public AtomicRegulator { - + public: enum ConcentrationRegulatorType {NONE=0,TRANSITION}; /** parser data */ struct ConcentrationRegulatorParameters { ConcentrationRegulatorParameters(): - method(NONE), + method(NONE), type(0), groupbit(0), transitionType(0), @@ -36,14 +36,14 @@ namespace ATC { int type; int groupbit; int transitionType; - double value; + double value; int frequency; int transitionInterval; double maxEnergy; int maxExchanges; int maxAttempts; std::string transitionTag; - ESET elemset; + ESET elemset; }; /** constructor */ @@ -96,22 +96,22 @@ namespace ATC { private: ConcentrationRegulator(); // DO NOT define this }; - + /** * @class ConcentrationRegulatorMethod - * @brief Base class for ConcentrationRegulator algorithms + * @brief Base class for ConcentrationRegulator algorithms */ class ConcentrationRegulatorMethod : public RegulatorShapeFunction { - + public: ConcentrationRegulatorMethod(ConcentrationRegulator *c) : RegulatorShapeFunction(c) {}; ~ConcentrationRegulatorMethod() {}; void initialize(void) {}; - virtual void pre_force() {}; - virtual void pre_exchange() {}; - virtual void finish() {}; + virtual void pre_force() {}; + virtual void pre_exchange() {}; + virtual void finish() {}; virtual void set_weights() {}; virtual double compute_vector(int /* n */) const { return 0;} virtual void output(OUTPUT_LIST & /* outputData */){}; @@ -124,7 +124,7 @@ namespace ATC { * @brief GCMC + thermodynamic integration */ class ConcentrationRegulatorMethodTransition : public ConcentrationRegulatorMethod { - + public: /** constructor */ ConcentrationRegulatorMethodTransition( @@ -135,11 +135,11 @@ namespace ATC { if (randomNumberGenerator_) delete randomNumberGenerator_; } /** initialize */ - void initialize(void); + void initialize(void); /** prior to force evaluation */ - virtual void pre_force(); + virtual void pre_force(); /** prior to exchanges */ - virtual void pre_exchange(); + virtual void pre_exchange(); /** "thermo" output */ virtual double compute_vector(int n) const; protected: @@ -155,13 +155,13 @@ namespace ATC { double deletion_id_free(ID_PAIR & id) const ; double insertion_factor(int c) const // a ramp { - if (c < transitionInterval_) return ((double) c)/transitionInterval_; + if (c < transitionInterval_) return ((double) c)/transitionInterval_; else return 1.0; } void transition(); bool accept(double energy, double T = 0) const; bool delete_atoms(int n); - bool insert_atoms(int n); + bool insert_atoms(int n); int pick_element() const; void pick_coordinates(const int elem, DENS_VEC & xi, DENS_VEC& x ) const; void pick_velocity(DENS_VEC & v, const double T ) const; @@ -179,9 +179,9 @@ namespace ATC { /** member data */ class AtomInElementSet * list_; - double targetConcentration_; - double targetCount_; - ESET elemset_; + double targetConcentration_; + double targetCount_; + ESET elemset_; POTENTIAL p_; RNG_POINTER randomNumberGenerator_; DENS_VEC volumes_; diff --git a/lib/atc/DenseMatrix.h b/lib/atc/DenseMatrix.h index e4759f02d4..0143b7cc52 100644 --- a/lib/atc/DenseMatrix.h +++ b/lib/atc/DenseMatrix.h @@ -8,8 +8,8 @@ namespace ATC_matrix { /** - * @class DenseMatrix - * @brief Class for storing data in a "dense" matrix form + * @class DenseMatrix + * @brief Class for storing data in a "dense" matrix form */ template @@ -36,7 +36,7 @@ public: DenseMatrix mult_by_element(const DenseMatrix& B) const; /** returns by element multiply A_ij = this_ij / B_ij */ DenseMatrix div_by_element(const DenseMatrix& B) const; - + /** overloaded virtual functions */ //T& operator()(INDEX i, INDEX j) { MICK(i,j) return DATA(i,j); } T& operator()(INDEX i, INDEX j) { MICK(i,j) return DATA(i,j); } @@ -50,7 +50,7 @@ public: void from_file(std::string & name); void set_all_elements_to(const T &v); DiagonalMatrix diag() const; - + DenseMatrix& operator=(const T &v); DenseMatrix& operator=(const Matrix &c); DenseMatrix& operator=(const DenseMatrix &c); @@ -120,8 +120,8 @@ void DenseMatrix::resize(INDEX rows, INDEX cols, bool copy) _delete(); _create(rows, cols); int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) for (INDEX j = 0; j < szj; j++) (*this)(i,j) = temp.in_range(i,j) ? temp(i,j) : T(0); } @@ -153,22 +153,22 @@ DenseMatrix DenseMatrix::mult_by_element(const DenseMatrix& B) const DenseMatrix C; C.reset(_nRows,_nCols); if (B.nCols() == _nCols) { - int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + int szi = this->nRows(); + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) + for (INDEX j = 0; j < szj; j++) C(i,j) = (*this)(i,j)*B(i,j); } else if (B.nCols() == 1) { std::cout << "MULTIPLYING\n"; - int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + int szi = this->nRows(); + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) + for (INDEX j = 0; j < szj; j++) C(i,j) = (*this)(i,j)*B(i,0); } - else { - SSCK(B, *this, "DenseMatrix::mult_by_element"); + else { + SSCK(B, *this, "DenseMatrix::mult_by_element"); } return C; } @@ -182,21 +182,21 @@ DenseMatrix DenseMatrix::div_by_element(const DenseMatrix& B) const C.reset(_nRows,_nCols); if (B.nCols() == _nCols) { - int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + int szi = this->nRows(); + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) + for (INDEX j = 0; j < szj; j++) C(i,j) = (*this)(i,j)/B(i,j); } else if (B.nCols() == 1) { - int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + int szi = this->nRows(); + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) + for (INDEX j = 0; j < szj; j++) C(i,j) = (*this)(i,j)/B(i,0); } - else { - SSCK(B, *this, "DenseMatrix::div_by_element"); + else { + SSCK(B, *this, "DenseMatrix::div_by_element"); } return C; } @@ -214,7 +214,7 @@ void DenseMatrix::write_restart(FILE *f) const // reads matrix from text file (matrix needs to be sized) //---------------------------------------------------------------------------- template -void DenseMatrix::from_file(std::string & name) +void DenseMatrix::from_file(std::string & name) { GCHK(_nRows == 0,"from_file needs nRows > 0"); GCHK(_nCols == 0,"from_file needs nCols > 0"); @@ -223,10 +223,10 @@ void DenseMatrix::from_file(std::string & name) char line[lineSize]; if (! in.good()) gerror(name+" is not available"); in.getline(line,lineSize); // header - int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + int szi = this->nRows(); + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) + for (INDEX j = 0; j < szj; j++) in >> (*this)(i,j); } //---------------------------------------------------------------------------- @@ -239,15 +239,15 @@ inline void DenseMatrix::set_all_elements_to(const T &v) for (INDEX i = 0; i < sz; i++) _data[i] = v; } //----------------------------------------------------------------------------- -// Return a diagonal matrix containing the diagonal entries of this matrix +// Return a diagonal matrix containing the diagonal entries of this matrix //----------------------------------------------------------------------------- template -DiagonalMatrix DenseMatrix::diag() const +DiagonalMatrix DenseMatrix::diag() const { DiagonalMatrix D(nRows(), true); // initialized to zero INDEX i; for (i=0; i void DenseMatrix::_delete() { _nRows = _nCols = 0; - if (_data){ + if (_data){ delete [] _data; _data = nullptr; } @@ -271,7 +271,7 @@ template void DenseMatrix::_create(INDEX rows, INDEX cols, bool zero) { - _nRows=rows; + _nRows=rows; _nCols=cols; _data = (this->size() ? new T [_nCols*_nRows] : nullptr); if (zero) this->zero(); @@ -280,14 +280,14 @@ void DenseMatrix::_create(INDEX rows, INDEX cols, bool zero) // creates a deep memory copy from a general matrix //---------------------------------------------------------------------------- template -void DenseMatrix::_copy(const Matrix &c) +void DenseMatrix::_copy(const Matrix &c) { if (!_data || this->size()!=c.size()) { - _delete(); + _delete(); _create(c.nRows(), c.nCols()); } - else + else { _nRows = c.nRows(); _nCols = c.nCols(); @@ -295,7 +295,7 @@ void DenseMatrix::_copy(const Matrix &c) memcpy(_data, c.ptr(), c.size()*sizeof(T)); } //---------------------------------------------------------------------------- -// sets all elements to a constant +// sets all elements to a constant //---------------------------------------------------------------------------- template DenseMatrix& DenseMatrix::operator=(const T &v) @@ -355,9 +355,9 @@ void DenseMatrix::_set_equal(const Matrix &r) } } //* Returns the transpose of the cofactor matrix of A. -//* see http://en.wikipedia.org/wiki/Adjugate_matrix -//* symmetric flag only affects cases N>3 -template +//* see http://en.wikipedia.org/wiki/Adjugate_matrix +//* symmetric flag only affects cases N>3 +template DenseMatrix adjugate(const Matrix &A, bool symmetric) { if (!A.is_square()) gerror("adjugate can only be computed for square matrices."); @@ -365,7 +365,7 @@ DenseMatrix adjugate(const Matrix &A, bool symmetric) switch (A.nRows()) { case 1: gerror("adjugate must be computed for matrixes of size greater than 1"); - case 2: + case 2: C(0,0) = A(1,1); C(0,1) =-A(0,1); C(1,0) =-A(1,0); C(1,1) = A(0,0); break; @@ -377,18 +377,18 @@ DenseMatrix adjugate(const Matrix &A, bool symmetric) C(1,1) = A(0,0)*A(2,2)-A(0,2)*A(2,0); C(2,1) =-A(0,0)*A(2,1)+A(0,1)*A(2,0); // i+j is odd C(0,2) = A(0,1)*A(1,2)-A(0,2)*A(1,1); - C(1,2) =-A(0,0)*A(1,2)+A(0,2)*A(1,0); // i+j is odd + C(1,2) =-A(0,0)*A(1,2)+A(0,2)*A(1,0); // i+j is odd C(2,2) = A(0,0)*A(1,1)-A(0,1)*A(1,0); break; - default: - + default: + // this feature is neither tested nor optimal - use at your own risk!!! DenseMatrix m(A.nRows()-1, A.nRows()-1); double sign[] = {1.0, -1.0}; for (INDEX j=0; j=i), mj+(mj>=j)); // skip row i and col j } } diff --git a/lib/atc/DenseVector.h b/lib/atc/DenseVector.h index bab90bf3ff..1108d02451 100644 --- a/lib/atc/DenseVector.h +++ b/lib/atc/DenseVector.h @@ -9,7 +9,7 @@ template /** * @class DenseVector - * @brief Class for storing data in a "dense" vector form + * @brief Class for storing data in a "dense" vector form */ class DenseVector : public Vector @@ -20,7 +20,7 @@ public: DenseVector(const Vector &c) : Vector(), _data(nullptr) { _copy(c); } DenseVector(const T * ptr, INDEX nrows) : Vector(), _data(nullptr) { copy(ptr,nrows); } virtual ~DenseVector() { _delete(); } - + //* resizes the Vector, ignores nCols, optionally copys what fits void resize(INDEX rows, INDEX cols=1, bool copy=false); //* resizes the Vector, ignores nCols, optionally zeros it out @@ -35,7 +35,7 @@ public: T& operator()(INDEX i, INDEX /* j */) { VICK(i) return _data[i]; } T operator()(INDEX i) const { VICK(i) return _data[i]; } T& operator()(INDEX i) { VICK(i) return _data[i]; } - void set_all_elements_to(const T &v) { + void set_all_elements_to(const T &v) { int sz = this->size(); for (INDEX i = 0; i < sz; i++) _data[i] = v; } @@ -129,8 +129,8 @@ inline void DenseVector::_create(INDEX n, bool zero) /////////////////////////////////////////////////////////////////////////////// //* creates a deep memory copy from a general matrix template -inline void DenseVector::_copy(const Vector &c) -{ +inline void DenseVector::_copy(const Vector &c) +{ if (!_data || _size!=c.size()) { _delete(); diff --git a/lib/atc/DependencyManager.h b/lib/atc/DependencyManager.h index c797406240..fe8ed036ff 100644 --- a/lib/atc/DependencyManager.h +++ b/lib/atc/DependencyManager.h @@ -20,7 +20,7 @@ namespace ATC { }; /** - * @class DependencyManager + * @class DependencyManager * @brief Base class for defining objects that manage the dependencies of various objects */ @@ -30,13 +30,13 @@ namespace ATC { // used as a friend so it can perform a depth-first search to have safe deletions of managed dependencies friend class InterscaleManager; - + // constructor DependencyManager() : needReset_(true), isFixed_(false), memoryType_(TEMPORARY), dfsFound_(false) {}; - + // destructor virtual ~DependencyManager() {}; - + /** registration by other PerAtomQuantity objects */ void register_dependence(DependencyManager * dependentQuantity) {dependentQuantities_.insert(dependentQuantity);}; @@ -47,7 +47,7 @@ namespace ATC { /** check if a reset is required */ bool need_reset() const {return needReset_ && !isFixed_;}; - + /** propagate need to reset to to dependencies */ void propagate_reset() { @@ -91,10 +91,10 @@ namespace ATC { protected: - + /** list of dependent atomic quantities */ std::set dependentQuantities_; - + /** flag for needing a recent */ // mutable is applied because there can be internal updates because we update when needed rather than when pushed mutable bool needReset_; @@ -107,9 +107,9 @@ namespace ATC { /** flag for if the node has been found in depth-first search */ bool dfsFound_; - + }; - + /** * @class MatrixDependencyManager * @brief Class for defining objects that manage the dependencies of matrices @@ -127,7 +127,7 @@ namespace ATC { /** returns a non-const version for manipulations and changes, resets dependent quantities */ virtual T & set_quantity() {propagate_reset(); return get_quantity();}; - + /** access to a constant dense matrix of the quantity, indexed by AtC atom counts */ virtual const T & quantity() const {return get_quantity();}; @@ -210,12 +210,12 @@ namespace ATC { { public: - MatrixDependencyManager(MPI_Comm comm) : + MatrixDependencyManager(MPI_Comm comm) : MatrixDependencyManager(), quantity_(comm) {}; - + MatrixDependencyManager(MPI_Comm comm, int nRows, int nCols) : MatrixDependencyManager(), quantity_(comm, nRows, nCols) {}; - + virtual ~MatrixDependencyManager() {}; protected: @@ -238,12 +238,12 @@ namespace ATC { { public: - MatrixDependencyManager(MPI_Comm comm) : + MatrixDependencyManager(MPI_Comm comm) : MatrixDependencyManager(), quantity_(comm) {}; - + MatrixDependencyManager(MPI_Comm comm, int nRows, int nCols) : MatrixDependencyManager(), quantity_(comm, nRows, nCols) {}; - + virtual ~MatrixDependencyManager() {}; protected: @@ -267,13 +267,13 @@ namespace ATC { // constructor SetDependencyManager() : DependencyManager(), quantity_() {}; - + // destructor virtual ~SetDependencyManager() {}; /** returns a non-const version for manipulations and changes, resets dependent quantities */ virtual std::set & set_quantity() {propagate_reset(); return quantity_;}; - + /** access to a constant dense matrix of the quantity, indexed by AtC atom counts */ virtual const std::set & quantity() const {return quantity_;}; @@ -300,13 +300,13 @@ namespace ATC { // constructor VectorDependencyManager() : DependencyManager(), quantity_() {}; - + // destructor virtual ~VectorDependencyManager() {}; /** returns a non-const version for manipulations and changes, resets dependent quantities */ virtual std::vector & set_quantity() {propagate_reset(); return quantity_;}; - + /** access to a constant dense matrix of the quantity, indexed by AtC atom counts */ virtual const std::vector & quantity() const {return quantity_;}; diff --git a/lib/atc/DiagonalMatrix.h b/lib/atc/DiagonalMatrix.h index b24e19dd4e..49256975e9 100644 --- a/lib/atc/DiagonalMatrix.h +++ b/lib/atc/DiagonalMatrix.h @@ -7,19 +7,19 @@ namespace ATC_matrix { /** * @class DiagonalMatrix - * @brief Class for storing data as a diagonal matrix + * @brief Class for storing data as a diagonal matrix */ template class DiagonalMatrix : public Matrix { - public: + public: explicit DiagonalMatrix(INDEX nRows=0, bool zero=0); DiagonalMatrix(const DiagonalMatrix& c); DiagonalMatrix(const Vector& v); virtual ~DiagonalMatrix(); - - //* resizes the matrix, ignores nCols, optionally zeros + + //* resizes the matrix, ignores nCols, optionally zeros void reset(INDEX rows, INDEX cols=0, bool zero=true); //* resizes the matrix, ignores nCols, optionally copies what fits void resize(INDEX rows, INDEX cols=0, bool copy=false); @@ -62,7 +62,7 @@ class DiagonalMatrix : public Matrix INDEX size() const { return _data->size(); } //* computes the inverse of this matrix - DiagonalMatrix& inv_this(); + DiagonalMatrix& inv_this(); //* returns a copy of the inverse of this matrix DiagonalMatrix inv() const; @@ -82,19 +82,19 @@ protected: DiagonalMatrix& operator=(const Vector & /* c */) {} DiagonalMatrix& operator=(const Matrix & /* c */) {} -private: +private: void _delete(); Vector *_data; -}; +}; //----------------------------------------------------------------------------- // DiagonalMatrix-DiagonalMatrix multiplication //----------------------------------------------------------------------------- template -DiagonalMatrix operator*(const DiagonalMatrix& A, const DiagonalMatrix& B) +DiagonalMatrix operator*(const DiagonalMatrix& A, const DiagonalMatrix& B) { SSCK(A, B, "DiagonalMatrix-DiagonalMatrix multiplication"); - DiagonalMatrix R(A); + DiagonalMatrix R(A); for (INDEX i=0; i operator*(const Vector &b, const DiagonalMatrix& A) // DiagonalMatrix-SparseMatrix multiplication //----------------------------------------------------------------------------- template -SparseMatrix operator*(const DiagonalMatrix &A, const SparseMatrix& B) +SparseMatrix operator*(const DiagonalMatrix &A, const SparseMatrix& B) { GCK(A, B, A.nCols()!=B.nRows() ,"DiagonalMatrix-SparseMatrix multiplication"); SparseMatrix R(B); @@ -171,7 +171,7 @@ DiagonalMatrix operator*(DiagonalMatrix &A, const T s) // Commute with DiagonalMatrix * double //----------------------------------------------------------------------------- template -DiagonalMatrix operator*(const T s, const DiagonalMatrix& A) +DiagonalMatrix operator*(const T s, const DiagonalMatrix& A) { DiagonalMatrix R(A); R *= s; @@ -231,10 +231,10 @@ DiagonalMatrix::DiagonalMatrix(const Vector& v) // destructor //----------------------------------------------------------------------------- template -DiagonalMatrix::~DiagonalMatrix() +DiagonalMatrix::~DiagonalMatrix() { _delete(); -} +} //----------------------------------------------------------------------------- // deletes the data stored by this matrix //----------------------------------------------------------------------------- @@ -244,7 +244,7 @@ void DiagonalMatrix::_delete() if (_data) delete _data; } //----------------------------------------------------------------------------- -// resizes the matrix, ignores nCols, optionally zeros +// resizes the matrix, ignores nCols, optionally zeros //----------------------------------------------------------------------------- template void DiagonalMatrix::reset(INDEX rows, INDEX /* cols */, bool zero) @@ -258,13 +258,13 @@ void DiagonalMatrix::reset(INDEX rows, INDEX /* cols */, bool zero) template void DiagonalMatrix::resize(INDEX rows, INDEX /* cols */, bool copy) { - _data->resize(rows, copy); + _data->resize(rows, copy); } //----------------------------------------------------------------------------- // changes the diagonal of the matrix to a vector v (makes a copy) //----------------------------------------------------------------------------- template -void DiagonalMatrix::reset(const Vector& v) +void DiagonalMatrix::reset(const Vector& v) { if (&v == _data) return; // check for self-reset _delete(); @@ -274,7 +274,7 @@ void DiagonalMatrix::reset(const Vector& v) // copys from another DiagonalMatrix //----------------------------------------------------------------------------- template -void DiagonalMatrix::reset(const DiagonalMatrix& c) +void DiagonalMatrix::reset(const DiagonalMatrix& c) { reset(*(c._data)); } @@ -337,41 +337,41 @@ T& DiagonalMatrix::operator()(INDEX i, INDEX /* j */) // value indexing operator - returns 0 if i!=j //----------------------------------------------------------------------------- template -T DiagonalMatrix::operator()(INDEX i, INDEX j) const +T DiagonalMatrix::operator()(INDEX i, INDEX j) const { - return (i==j) ? (*_data)(i) : (T)0; + return (i==j) ? (*_data)(i) : (T)0; } //----------------------------------------------------------------------------- // flat reference indexing operator //----------------------------------------------------------------------------- template -T& DiagonalMatrix::operator[](INDEX i) +T& DiagonalMatrix::operator[](INDEX i) { - return (*_data)(i); + return (*_data)(i); } //----------------------------------------------------------------------------- // flat value indexing operator //----------------------------------------------------------------------------- template -T DiagonalMatrix::operator[](INDEX i) const -{ - return (*_data)(i); +T DiagonalMatrix::operator[](INDEX i) const +{ + return (*_data)(i); } //----------------------------------------------------------------------------- // returns the number of rows //----------------------------------------------------------------------------- template -INDEX DiagonalMatrix::nRows() const -{ - return _data->size(); +INDEX DiagonalMatrix::nRows() const +{ + return _data->size(); } //----------------------------------------------------------------------------- // returns the number of columns (same as nCols()) //----------------------------------------------------------------------------- template -INDEX DiagonalMatrix::nCols() const +INDEX DiagonalMatrix::nCols() const { - return _data->size(); + return _data->size(); } //----------------------------------------------------------------------------- // returns a pointer to the diagonal values, dangerous! @@ -379,13 +379,13 @@ INDEX DiagonalMatrix::nCols() const template T* DiagonalMatrix::ptr() const { - return _data->ptr(); -} + return _data->ptr(); +} //----------------------------------------------------------------------------- // writes the diagonal to a binary data restart file //----------------------------------------------------------------------------- template -void DiagonalMatrix::write_restart(FILE *f) const +void DiagonalMatrix::write_restart(FILE *f) const { _data->write_restart(f); } @@ -393,7 +393,7 @@ void DiagonalMatrix::write_restart(FILE *f) const // sets the diagonal to a constant //----------------------------------------------------------------------------- template -DiagonalMatrix& DiagonalMatrix::operator=(const T v) +DiagonalMatrix& DiagonalMatrix::operator=(const T v) { this->set_all_elements_to(v); return *this; @@ -402,7 +402,7 @@ DiagonalMatrix& DiagonalMatrix::operator=(const T v) // assignment operator with another diagonal matrix //----------------------------------------------------------------------------- template -DiagonalMatrix& DiagonalMatrix::operator=(const DiagonalMatrix& C) +DiagonalMatrix& DiagonalMatrix::operator=(const DiagonalMatrix& C) { reset(C); return *this; @@ -411,7 +411,7 @@ DiagonalMatrix& DiagonalMatrix::operator=(const DiagonalMatrix& C) // writes a matlab command to duplicate this sparse matrix //----------------------------------------------------------------------------- template -void DiagonalMatrix::matlab(std::ostream &o, const std::string &s) const +void DiagonalMatrix::matlab(std::ostream &o, const std::string &s) const { _data->matlab(o, s); o << s <<"=diag("<::matlab(std::ostream &o, const std::string &s) template DiagonalMatrix& DiagonalMatrix::inv_this() { - for(INDEX i=0; iminabs() / _data->maxabs(); if (min_max > 1e-14) return *this; @@ -447,10 +447,10 @@ DiagonalMatrix DiagonalMatrix::inv() const { DiagonalMatrix invA(*this); // Make copy of A to invert - for(INDEX i=0; i::_set_equal(const Matrix &r) } } //----------------------------------------------------------------------------- -// casts a generic matrix pointer into a DiagonalMatrix pointer - null if fail +// casts a generic matrix pointer into a DiagonalMatrix pointer - null if fail //----------------------------------------------------------------------------- template const DiagonalMatrix *diag_cast(const Matrix *m) diff --git a/lib/atc/ElasticTimeIntegrator.cpp b/lib/atc/ElasticTimeIntegrator.cpp index 785568cbb2..3d4cb83774 100644 --- a/lib/atc/ElasticTimeIntegrator.cpp +++ b/lib/atc/ElasticTimeIntegrator.cpp @@ -15,7 +15,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- MomentumTimeIntegrator::MomentumTimeIntegrator(ATC_Coupling * atc, TimeIntegrationType timeIntegrationType) : TimeIntegrator(atc, timeIntegrationType) @@ -36,7 +36,7 @@ namespace ATC { \section syntax fix_modify AtC time_integration \n - descriptor (string) = time integration type \n - + various time integration methods for the finite elements\n \section description verlet - atomic velocity update with 2nd order Verlet, nodal temperature update with 2nd order Verlet, kinetostats based on controlling force \n @@ -49,7 +49,7 @@ namespace ATC { \section related see \ref man_fix_atc \section default - none + none */ if (strcmp(arg[argIndex],"verlet")==0) { timeIntegrationType_ = VERLET; @@ -78,7 +78,7 @@ namespace ATC { if (atc_->reset_methods()) { if (timeIntegrationMethod_) delete timeIntegrationMethod_; - + if (timeFilterManager_->need_reset()) { switch (timeIntegrationType_) { case VERLET: @@ -122,7 +122,7 @@ namespace ATC { default: throw ATC_Error("Unknown time integration type in MomentumTimeIntegrator::Initialize()"); } - } + } } } @@ -146,7 +146,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor // Grab data from ATC - //-------------------------------------------------------- + //-------------------------------------------------------- MomentumIntegrationMethod::MomentumIntegrationMethod(MomentumTimeIntegrator * momentumTimeIntegrator) : TimeIntegrationMethod(momentumTimeIntegrator), timeFilter_(timeIntegrator_->time_filter()), @@ -178,7 +178,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- ElasticTimeIntegratorVerlet::ElasticTimeIntegratorVerlet(MomentumTimeIntegrator * momentumTimeIntegrator) : MomentumIntegrationMethod(momentumTimeIntegrator), displacement_(atc_->field(DISPLACEMENT)), @@ -217,7 +217,7 @@ namespace ATC { if (timeFilterManager->need_reset()) { timeFilter_->initialize(nodalAtomicForce_->quantity()); } - + if (!(timeFilterManager->end_equilibrate())) { nodalAtomicForceFiltered_.reset(atc_->num_nodes(),atc_->nsd()); } @@ -238,14 +238,14 @@ namespace ATC { explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt); } - + //-------------------------------------------------------- // post_initial_integrate1 // time integration after Verlet step 1 //-------------------------------------------------------- void ElasticTimeIntegratorVerlet::post_initial_integrate1(double dt) { - + // for improved accuracy, but this would be inconsistent with // the atomic integration scheme explicit_1(displacement_.set_quantity(),velocity_.quantity(),dt); @@ -253,7 +253,7 @@ namespace ATC { //-------------------------------------------------------- // pre_final_integrate1 - // first time integration computations + // first time integration computations // before Verlet step 2 //-------------------------------------------------------- void ElasticTimeIntegratorVerlet::pre_final_integrate1(double dt) @@ -325,7 +325,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- ElasticTimeIntegratorVerletFiltered::ElasticTimeIntegratorVerletFiltered(MomentumTimeIntegrator * momentumTimeIntegrator) : ElasticTimeIntegratorVerlet(momentumTimeIntegrator), nodalAtomicAcceleration_(atc_->nodal_atomic_field_roc(VELOCITY)) @@ -349,7 +349,7 @@ namespace ATC { //-------------------------------------------------------- void ElasticTimeIntegratorVerletFiltered::post_initial_integrate1(double dt) { - + // for improved accuracy, but this would be inconsistent with // the atomic integration scheme explicit_1(displacement_.set_quantity(),velocity_.quantity(),dt); @@ -367,7 +367,7 @@ namespace ATC { acceleration_.set_quantity(), VELOCITY); explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt); - + atc_->apply_inverse_md_mass_matrix(nodalAtomicForceFiltered_.quantity(), nodalAtomicAcceleration_.set_quantity(), VELOCITY); @@ -404,7 +404,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- ElasticTimeIntegratorFractionalStep::ElasticTimeIntegratorFractionalStep(MomentumTimeIntegrator * momentumTimeIntegrator) : MomentumIntegrationMethod(momentumTimeIntegrator), displacement_(atc_->field(DISPLACEMENT)), @@ -413,7 +413,7 @@ namespace ATC { nodalAtomicMomentum_(nullptr), nodalAtomicMomentumFiltered_(momentumTimeIntegrator->nodal_atomic_momentum_filtered()), nodalAtomicDisplacement_(nullptr), - nodalAtomicMomentumOld_(atc_->num_nodes(),atc_->nsd()), + nodalAtomicMomentumOld_(atc_->num_nodes(),atc_->nsd()), nodalAtomicVelocityOld_(atc_->num_nodes(),atc_->nsd()) { // do nothing @@ -450,7 +450,7 @@ namespace ATC { // the form of this integrator implies no time filters that require history data can be used timeFilter_->initialize(); } - + // sets up time filter for post-processing the filtered power // this time integrator should use an explicit-implicit filter // to mirror the 2nd order Verlet integration scheme @@ -513,7 +513,7 @@ namespace ATC { atomicVelocityDelta, VELOCITY); velocity_ += atomicVelocityDelta; - + // approximation to force for output nodalAtomicForce_ /= 0.5*dt; timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(), @@ -549,16 +549,16 @@ namespace ATC { // atomic contributions to change in momentum // compute change in restricted atomic momentum nodalAtomicForce_ += nodalAtomicMomentum_->quantity(); - + // update FE temperature with change in temperature from MD compute_velocity_delta(nodalAtomicForce_,dt); velocity_ += atomicVelocityDelta_.quantity(); - + // approximation to power for output nodalAtomicForce_ /= 0.5*dt; timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(), nodalAtomicForce_,dt); - + // change to velocity from FE dynamics atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(), acceleration_.set_quantity(), @@ -681,7 +681,7 @@ namespace ATC { if (!timeFilterManager->end_equilibrate()) { // implies an initial condition of the instantaneous atomic energy // for the corresponding filtered variable, consistent with the temperature - nodalAtomicMomentumFiltered_ = nodalAtomicMomentum_->quantity(); + nodalAtomicMomentumFiltered_ = nodalAtomicMomentum_->quantity(); nodalAtomicForceFiltered_.reset(atc_->num_nodes(),atc_->nsd()); } } @@ -709,7 +709,7 @@ namespace ATC { apply_gear_predictor(dt); // update filtered nodal atomic force - + // that way kinetostat and integrator can be consistent timeFilter_->apply_pre_step1(nodalAtomicForceFiltered_.set_quantity(), nodalAtomicForce_,dt); @@ -724,15 +724,15 @@ namespace ATC { //-------------------------------------------------------- void FluidsTimeIntegratorGear::pre_final_integrate1(double dt) { - + // before the new rhs is computed but after atomic velocity is updated. // compute change in restricted atomic momentum nodalAtomicForce_ += nodalAtomicMomentum_->quantity(); - + // update FE velocity with change in velocity from MD compute_velocity_delta(nodalAtomicForce_,dt); velocity_ += atomicVelocityDelta_.quantity(); - + // approximation to force for output nodalAtomicForce_ /= dt; timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(), diff --git a/lib/atc/ElasticTimeIntegrator.h b/lib/atc/ElasticTimeIntegrator.h index 02e6b5c3c8..70d1eb8b54 100644 --- a/lib/atc/ElasticTimeIntegrator.h +++ b/lib/atc/ElasticTimeIntegrator.h @@ -16,19 +16,19 @@ namespace ATC { */ class MomentumTimeIntegrator : public TimeIntegrator { - + public: - + // constructor MomentumTimeIntegrator(ATC_Coupling * atc, TimeIntegrationType timeIntegrationType); - + // destructor virtual ~MomentumTimeIntegrator(){}; /** parser/modifier */ virtual bool modify(int narg, char **arg); - + /** create objects to implement requested numerical method */ virtual void construct_methods(); @@ -47,7 +47,7 @@ namespace ATC { protected: /** filtered atomic force */ - + DENS_MAN nodalAtomicForceFiltered_; /** filtered atomic momentum due initial conditions and MD updates */ @@ -58,7 +58,7 @@ namespace ATC { // DO NOT define this MomentumTimeIntegrator(); - + }; /** @@ -67,12 +67,12 @@ namespace ATC { */ class MomentumIntegrationMethod : public TimeIntegrationMethod { - + public: - + // constructor MomentumIntegrationMethod(MomentumTimeIntegrator * momentumTimeIntegrator); - + // destructor virtual ~MomentumIntegrationMethod(){}; @@ -81,17 +81,17 @@ namespace ATC { /** checks to see if first RHS computation is needed */ virtual bool has_final_predictor() {return true;}; - + protected: - + /** time filtering object */ TimeFilter * timeFilter_; - + /** finite element velocity field */ DENS_MAN & velocity_; /** finite element acceleration field */ DENS_MAN & acceleration_; - + /** atomic nodal velocity field */ DENS_MAN & nodalAtomicVelocityOut_; /** right-hand side of velocity equation */ @@ -106,7 +106,7 @@ namespace ATC { // DO NOT define this MomentumIntegrationMethod(); - + }; /** @@ -115,21 +115,21 @@ namespace ATC { */ class ElasticTimeIntegratorVerlet : public MomentumIntegrationMethod { - + public: - + // constructor ElasticTimeIntegratorVerlet(MomentumTimeIntegrator * momentumTimeIntegrator); - + // destructor virtual ~ElasticTimeIntegratorVerlet(){}; /** create and get necessary transfer operators */ virtual void construct_transfers(); - + /** pre time integration initialization of data */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -143,52 +143,52 @@ namespace ATC { virtual void add_to_rhs(); /** post processing step before output */ virtual void post_process(); - + /** add output data */ virtual void output(OUTPUT_LIST & outputData); - + /** operations at end of a run */ virtual void finish(); - + protected: - + /** finite element displacement field */ DENS_MAN & displacement_; - + /** atomic nodal displacement field */ DENS_MAN & nodalAtomicDisplacementOut_; - + /** filtered atomic force */ DENS_MAN & nodalAtomicForceFiltered_; - + /** transfer for computing atomic displacement */ DENS_MAN * nodalAtomicDisplacement_; /** transfer for computing nodal atomic force */ DENS_MAN * nodalAtomicForce_; - + private: - + // DO NOT define this ElasticTimeIntegratorVerlet(); - + }; - + /** * @class ElasticTimeIntegratorVerlet * @brief Verlet integration for FE elastic quantities with time filtering */ class ElasticTimeIntegratorVerletFiltered : public ElasticTimeIntegratorVerlet { - + public: - + // constructor ElasticTimeIntegratorVerletFiltered(MomentumTimeIntegrator * momentumTimeIntegrator); - + // destructor virtual ~ElasticTimeIntegratorVerletFiltered(){}; - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -203,7 +203,7 @@ namespace ATC { /** add output data */ virtual void output(OUTPUT_LIST & outputData); - + protected: /** atomic nodal acceleration field */ @@ -213,16 +213,16 @@ namespace ATC { // DO NOT define this ElasticTimeIntegratorVerletFiltered(); - + }; /** - * @class ElasticTimeIntegratorFractionalStep + * @class ElasticTimeIntegratorFractionalStep * @brief Class for using 2nd order Verlet integration to update FE contributions to momentum field - * (Uses same update for the atomic contributions to the finite - * elements as are used by the LAMMPS integration scheme + * (Uses same update for the atomic contributions to the finite + * elements as are used by the LAMMPS integration scheme * for the atomic velocities and positions, i.e. Verlet.) - */ + */ class ElasticTimeIntegratorFractionalStep : public MomentumIntegrationMethod { @@ -230,16 +230,16 @@ namespace ATC { // constructor ElasticTimeIntegratorFractionalStep(MomentumTimeIntegrator * momentumTimeIntegrator); - + // destructor virtual ~ElasticTimeIntegratorFractionalStep() {}; - + /** create and get necessary transfer operators */ virtual void construct_transfers(); /** pre time integration initialization of data */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -272,13 +272,13 @@ namespace ATC { // data /** finite element displacement field */ DENS_MAN & displacement_; - + /** atomic nodal displacement field */ DENS_MAN & nodalAtomicDisplacementOut_; /** equivalent nodal force due to atomic momentum change */ DENS_MAT nodalAtomicForce_; - + /** filtered atomic force */ DENS_MAN & nodalAtomicForceFiltered_; @@ -287,7 +287,7 @@ namespace ATC { /** filtered atomic momentum */ DENS_MAN & nodalAtomicMomentumFiltered_; - + /** transfer for computing atomic displacement */ DENS_MAN * nodalAtomicDisplacement_; @@ -312,7 +312,7 @@ namespace ATC { * @class FluidsTimeIntegratorGear * @brief Class for using 3rd order Gear integration to update FE contributions to momentum field * and fractional step method for atomic contributions - */ + */ class FluidsTimeIntegratorGear : public MomentumIntegrationMethod { @@ -320,16 +320,16 @@ namespace ATC { // constructor FluidsTimeIntegratorGear(MomentumTimeIntegrator * MomentumTimeIntegrator); - + // destructor virtual ~FluidsTimeIntegratorGear() {}; - + /** create and get necessary transfer operators */ virtual void construct_transfers(); /** pre time integration initialization of data */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -371,7 +371,7 @@ namespace ATC { // data /** equivalent nodal force due to atomic momentum change */ DENS_MAT nodalAtomicForce_; - + /** filtered atomic force */ DENS_MAN & nodalAtomicForceFiltered_; diff --git a/lib/atc/ElectronChargeDensity.cpp b/lib/atc/ElectronChargeDensity.cpp index 14c764e46e..5f4d04af0d 100644 --- a/lib/atc/ElectronChargeDensity.cpp +++ b/lib/atc/ElectronChargeDensity.cpp @@ -14,7 +14,7 @@ using std::vector; namespace ATC { ElectronChargeDensityInterpolation::ElectronChargeDensityInterpolation( - fstream &fileId, map & /* parameters */) + fstream &fileId, map & /* parameters */) : ElectronChargeDensity(), n_() { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); @@ -23,7 +23,7 @@ ElectronChargeDensityInterpolation::ElectronChargeDensityInterpolation( double coef = 1.; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; else if (line[0] == "scale") coef = str2dbl(line[1]); else if (line[0] == "number_of_points") { @@ -34,14 +34,14 @@ ElectronChargeDensityInterpolation::ElectronChargeDensityInterpolation( } ElectronChargeDensityLinear::ElectronChargeDensityLinear( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronChargeDensity() { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); vector line; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; double value = str2dbl(line[1]); if (line[0] == "coefficient") { @@ -52,7 +52,7 @@ ElectronChargeDensityLinear::ElectronChargeDensityLinear( } ElectronChargeDensityExponential::ElectronChargeDensityExponential( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronChargeDensity(), intrinsicConcentration_(0), intrinsicEnergy_(0), @@ -62,7 +62,7 @@ ElectronChargeDensityExponential::ElectronChargeDensityExponential( vector line; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; double value = str2dbl(line[1]); if (line[0] == "intrinsic_concentration") { @@ -84,7 +84,7 @@ ElectronChargeDensityExponential::ElectronChargeDensityExponential( } ElectronChargeDensityFermiDirac::ElectronChargeDensityFermiDirac( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronChargeDensity(), Ef_(0), referenceTemperature_(0), @@ -96,7 +96,7 @@ ElectronChargeDensityFermiDirac::ElectronChargeDensityFermiDirac( vector line; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; double value = str2dbl(line[1]); if (line[0] == "fermi_energy") { @@ -120,7 +120,7 @@ ElectronChargeDensityFermiDirac::ElectronChargeDensityFermiDirac( else if (line[0] == "donor_concentration") { donorIonization_ = true; Nd_ = value; - parameters["donor_concentration"] = Nd_; + parameters["donor_concentration"] = Nd_; } else { throw ATC_Error( "unrecognized material function "+line[0]); diff --git a/lib/atc/ElectronChargeDensity.h b/lib/atc/ElectronChargeDensity.h index ac6052a9ef..53671d5df9 100644 --- a/lib/atc/ElectronChargeDensity.h +++ b/lib/atc/ElectronChargeDensity.h @@ -12,8 +12,8 @@ const double tol = 1.e-8; namespace ATC { /** - * @class ElectronChargeDensity - * @brief Base class for models of extrinsic electric charges + * @class ElectronChargeDensity + * @brief Base class for models of extrinsic electric charges */ class ElectronChargeDensity @@ -24,10 +24,10 @@ namespace ATC { virtual bool electron_charge_density(const FIELD_MATS & /* fields */, DENS_MAT & /* flux */) const { return false; }; - - virtual void D_electron_charge_density(const FieldName /* fieldName */, + + virtual void D_electron_charge_density(const FieldName /* fieldName */, const FIELD_MATS & /* fields */, - DENS_MAT & /* flux */) const + DENS_MAT & /* flux */) const { throw ATC_Error("Charge density D_electron_charge_density unimplemented function");} virtual void band_edge_potential(const FIELD_MATS & /* fields */, @@ -51,13 +51,13 @@ namespace ATC { FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL); const DENS_MAT & phi = phi_field->second; int nNodes = phi.nRows(); - flux.reset(nNodes,1,false); + flux.reset(nNodes,1,false); for (int i = 0; i < nNodes; i++) { // a mapping of a vector - flux(i,0) = n_.f(phi(i,0)); + flux(i,0) = n_.f(phi(i,0)); } flux *= -1.; return true; - }; + }; virtual void D_electron_charge_density(const FieldName /* field */, const FIELD_MATS &fields, DENS_MAT &coef) const @@ -65,10 +65,10 @@ namespace ATC { FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL); const DENS_MAT & phi = phi_field->second; int nNodes = phi.nRows(); - coef.reset(nNodes,1,false); - for (int i = 0; i < nNodes; i++) { - coef(i,0) = n_.dfdt(phi(i,0)); - coef(i,0) = n_.dfdt(phi(i,0)); + coef.reset(nNodes,1,false); + for (int i = 0; i < nNodes; i++) { + coef(i,0) = n_.dfdt(phi(i,0)); + coef(i,0) = n_.dfdt(phi(i,0)); } coef *= -1.; } @@ -93,7 +93,7 @@ namespace ATC { flux = phi_field->second; flux *= -C_; return true; - }; + }; virtual void D_electron_charge_density(const FieldName /* field */, const FIELD_MATS &fields, DENS_MAT &coef) const @@ -111,7 +111,7 @@ namespace ATC { /** * @class ElectronChargeDensityExponential * @brief Class for models of electron charge density dependent on difference between electric potential and the Fermi level n = n_i exp ( (phi-E_i) / kB T) - */ + */ class ElectronChargeDensityExponential : public ElectronChargeDensity { @@ -121,13 +121,13 @@ namespace ATC { double n(const double phi, double T) const { - return -intrinsicConcentration_*exp((phi-intrinsicEnergy_)/(kBeV_*T)); + return -intrinsicConcentration_*exp((phi-intrinsicEnergy_)/(kBeV_*T)); } double dndphi(const double phi, double T) const { return n(phi,T)/(kBeV_*T); } - virtual bool electron_charge_density(const FIELD_MATS &fields, + virtual bool electron_charge_density(const FIELD_MATS &fields, DENS_MAT &density) const { FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL); @@ -139,17 +139,17 @@ namespace ATC { density.resize(nNodes,1); if (hasTref) { T = referenceTemperature_; - for (int i = 0; i < nNodes; i++) { + for (int i = 0; i < nNodes; i++) { density(i,0) = n(phi(i,0),T); } } else { const DENS_MAT & temp = T_field->second; - for (int i = 0; i < nNodes; i++) { + for (int i = 0; i < nNodes; i++) { density(i,0) = n(phi(i,0),temp(i,0)); } } density *= -1.; return true; - }; + }; virtual void D_electron_charge_density(const FieldName /* field */, const FIELD_MATS &fields, DENS_MAT &coef) const @@ -163,16 +163,16 @@ namespace ATC { coef.resize(nNodes,1); if (hasTref) { T = referenceTemperature_; - for (int i = 0; i < nNodes; i++) { + for (int i = 0; i < nNodes; i++) { coef(i,0) = dndphi(phi(i,0),T); } } else { const DENS_MAT & temp = T_field->second; - for (int i = 0; i < nNodes; i++) { + for (int i = 0; i < nNodes; i++) { coef(i,0) = dndphi(phi(i,0),temp(i,0)); } } coef *= -1.; - }; + }; protected: double intrinsicConcentration_,intrinsicEnergy_; double referenceTemperature_; @@ -181,8 +181,8 @@ namespace ATC { //----------------------------------------------------------------------- /** * @class ElectronChargeDensityFermiDirac - * @brief Class for models of electron charge density based on Fermi-Dirac statistics - */ + * @brief Class for models of electron charge density based on Fermi-Dirac statistics + */ class ElectronChargeDensityFermiDirac : public ElectronChargeDensity { @@ -195,7 +195,7 @@ namespace ATC { if (T > 0) f = 1.0 / ( exp((E-Ef_)/kBeV_/T)+1.0 ); else if (E > Ef_) f = 0; return f; - }; + }; virtual bool electron_charge_density(const FIELD_MATS &fields, DENS_MAT &density) const { @@ -215,34 +215,34 @@ namespace ATC { const DENS_MAT & phi = phi_field->second; int nNodes = psi.nRows(); - density.reset(nNodes,1); + density.reset(nNodes,1); double T = referenceTemperature_; int count = 0; for (int i = 0; i < nNodes; i++) { if (!hasReferenceTemperature_) { T = Ts(i,0); } int j = 0; for (j = 0; j < psis.nCols(); j++) { - double E = Es(j,0); // Eigenvalue + double E = Es(j,0); // Eigenvalue double f = fermi_dirac(E,T); if (f < tol) break; else count++; density(i,0) -= psis(i,j)*psis(i,j)*f; // < 0 } - if (donorIonization_) { + if (donorIonization_) { double E = -1.0* phi(i,0);// units [eV] E = - |e| phi if ( E + Eb_ > Ef_+Ed_) density(i,0) += Nd_; // > 0 } } return true; - }; - virtual void D_electron_charge_density(const FieldName /* fieldName */, + }; + virtual void D_electron_charge_density(const FieldName /* fieldName */, const FIELD_MATS &fields, DENS_MAT &coef) const { FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL); const DENS_MAT & phi = phi_field->second; int nNodes = phi.nRows(); - coef.reset(nNodes,1,false); + coef.reset(nNodes,1,false); } virtual void band_edge_potential(const FIELD_MATS &fields, @@ -251,7 +251,7 @@ namespace ATC { FIELD_MATS::const_iterator p_field = fields.find(ELECTRIC_POTENTIAL); const DENS_MAT & phi = p_field->second; int nNodes = phi.nRows(); - density.reset(nNodes,1,false); + density.reset(nNodes,1,false); density = Eb_; }; @@ -264,6 +264,6 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/ElectronDragPower.cpp b/lib/atc/ElectronDragPower.cpp index 7fe31f0120..f1b69a8611 100644 --- a/lib/atc/ElectronDragPower.cpp +++ b/lib/atc/ElectronDragPower.cpp @@ -16,7 +16,7 @@ namespace ATC { ElectronDragPowerLinear::ElectronDragPowerLinear(fstream &fileId, map & parameters, - Material * material) + Material * material) : ElectronDragPower(), electronDragInvTau_(0), material_(material) @@ -42,7 +42,7 @@ ElectronDragPowerLinear::ElectronDragPowerLinear(fstream &fileId, const GRAD_FIELD_MATS & /* gradFields */, DENS_MAT & flux) { - + FIELD_MATS::const_iterator evField = fields.find(ELECTRON_VELOCITY); const DENS_MAT & v = evField->second; @@ -57,7 +57,7 @@ ElectronDragPowerLinear::ElectronDragPowerLinear(fstream &fileId, return true; } - + void ElectronDragPowerLinear::electron_drag_velocity_coefficient(const FIELD_MATS &fields, DENS_MAT & dragCoef) { diff --git a/lib/atc/ElectronDragPower.h b/lib/atc/ElectronDragPower.h index 12c1472e37..063e0df648 100644 --- a/lib/atc/ElectronDragPower.h +++ b/lib/atc/ElectronDragPower.h @@ -11,7 +11,7 @@ namespace ATC { /** - * @class ElectronDragPower + * @class ElectronDragPower * @brief Base class for defining the lattice drag power from electrons */ @@ -35,12 +35,12 @@ namespace ATC { }; }; //------------------------------------------------------------------- - + /** * @class ElectronDragPowerLinear * @brief Class for electron drag that linearly depends on the difference between the electron and lattice velocities - */ - + */ + class ElectronDragPowerLinear : public ElectronDragPower { public: @@ -66,6 +66,6 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/ElectronFlux.cpp b/lib/atc/ElectronFlux.cpp index 4894a32dae..a5a6b36469 100644 --- a/lib/atc/ElectronFlux.cpp +++ b/lib/atc/ElectronFlux.cpp @@ -22,8 +22,8 @@ ElectronFlux::ElectronFlux() : ElectronFluxLinear::ElectronFluxLinear( - fstream &fileId, map & parameters) - : ElectronFlux(), + fstream &fileId, map & parameters) + : ElectronFlux(), electronMobility_(0), electronDiffusivity_(0) { @@ -52,7 +52,7 @@ ElectronFluxLinear::ElectronFluxLinear( } ElectronFluxThermopower::ElectronFluxThermopower( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronFlux(), electronMobility_(0), seebeckCoef_(0) @@ -61,7 +61,7 @@ ElectronFluxThermopower::ElectronFluxThermopower( vector line; while(fileId.good()) { command_line(fileId, line); - if (line.size() == 0) continue; + if (line.size() == 0) continue; if (line[0] == "end") return; double value = str2dbl(line[1]); if (line[0] == "mobility") { @@ -79,7 +79,7 @@ ElectronFluxThermopower::ElectronFluxThermopower( } ElectronFluxConvection::ElectronFluxConvection( - fstream &fileId, map & /* parameters */) + fstream &fileId, map & /* parameters */) : ElectronFlux() { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); diff --git a/lib/atc/ElectronFlux.h b/lib/atc/ElectronFlux.h index b9cfd2305c..f58bc29dbf 100644 --- a/lib/atc/ElectronFlux.h +++ b/lib/atc/ElectronFlux.h @@ -20,12 +20,12 @@ namespace ATC { /** computes flux */ virtual void electron_flux(const FIELD_MATS &fields, const GRAD_FIELD_MATS & /* gradFields */, - DENS_MAT_VEC &flux) + DENS_MAT_VEC &flux) { - - - - + + + + FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE); const DENS_MAT & etMat = etField->second; zeroWorkspace_.reset(etMat.nRows(),etMat.nCols()); @@ -75,12 +75,12 @@ namespace ATC { DENS_MAT zeroWorkspace_; }; //----------------------------------------------------------------------- - + /** * @class ElectronFluxLinear * @brief Class for drift-diffusion electron flux with linear dependency on the electron density gradient - */ - + */ + class ElectronFluxLinear : public ElectronFlux { public: @@ -98,7 +98,7 @@ namespace ATC { const DENS_MAT & n = edField->second; const DENS_MAT_VEC & dn = dEdField->second; const DENS_MAT_VEC & dphi = dPhiField->second; - + //n.print("DENSITY"); //for (int i = 0; i < 3; i++) { // dn[i].print("GRAD N"); @@ -131,17 +131,17 @@ namespace ATC { flux[2] += -electronDiffusivity_* dn[2]; } - }; + }; protected: double electronMobility_, electronDiffusivity_; }; //----------------------------------------------------------------------- - + /** * @class ElectronFluxThermopower * @brief Class for defining the electron flux (i.e., current) to include the elctron velocity or have a electron temperature-dependent mobility - */ - + */ + class ElectronFluxThermopower : public ElectronFlux { public: @@ -165,13 +165,13 @@ namespace ATC { GRAD_FIELD_MATS::const_iterator dPhiField = gradFields.find(ELECTRIC_POTENTIAL); GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE); - // J_n = - \mu n grad \phi - \mu kB/e T_e grad n + // J_n = - \mu n grad \phi - \mu kB/e T_e grad n // - \mu S n grad T_e - \mu kB/e n grad T_e const DENS_MAT & n = edField->second; const DENS_MAT_VEC & dn = dEdField->second; const DENS_MAT_VEC & dphi = dPhiField->second; const DENS_MAT_VEC & dT = dEtField->second; - + flux[0] = -electronMobility_*dphi[0]; flux[1] = -electronMobility_*dphi[1]; flux[2] = -electronMobility_*dphi[2]; @@ -179,7 +179,7 @@ namespace ATC { flux[0] += coef* dT[0]; flux[1] += coef* dT[1]; flux[2] += coef* dT[2]; - flux[0] *= n; // scale by n + flux[0] *= n; // scale by n flux[1] *= n; flux[2] *= n; @@ -188,23 +188,23 @@ namespace ATC { //tmp[0] *= Te; //tmp[1] *= Te; //tmp[2] *= Te; - coef = -electronMobility_*kBeV_; + coef = -electronMobility_*kBeV_; //flux[0] += tmp[0]; flux[0] += dn[0].mult_by_element(Te); flux[1] += dn[1].mult_by_element(Te); flux[2] += dn[2].mult_by_element(Te); } - }; + }; protected: double electronMobility_, seebeckCoef_; }; //----------------------------------------------------------------------- - + /** * @class ElectronFluxConvection * @brief Class for electron flux based on the standard convection term - */ - + */ + class ElectronFluxConvection : public ElectronFlux { public: @@ -220,6 +220,6 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/ElectronHeatCapacity.cpp b/lib/atc/ElectronHeatCapacity.cpp index aafaa3c37d..38515d4659 100644 --- a/lib/atc/ElectronHeatCapacity.cpp +++ b/lib/atc/ElectronHeatCapacity.cpp @@ -15,7 +15,7 @@ using std::vector; namespace ATC { ElectronHeatCapacityConstant::ElectronHeatCapacityConstant( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronHeatCapacity(), electronHeatCapacity_(0) { @@ -36,7 +36,7 @@ ElectronHeatCapacityConstant::ElectronHeatCapacityConstant( } ElectronHeatCapacityLinear::ElectronHeatCapacityLinear( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronHeatCapacity(), electronHeatCapacity_(0) { @@ -58,7 +58,7 @@ ElectronHeatCapacityLinear::ElectronHeatCapacityLinear( ElectronHeatCapacityConstantAddDensity::ElectronHeatCapacityConstantAddDensity(fstream &fileId, map & parameters, - Material * material) + Material * material) : ElectronHeatCapacityConstant(fileId, parameters), material_(material) { @@ -67,7 +67,7 @@ ElectronHeatCapacityConstantAddDensity::ElectronHeatCapacityConstantAddDensity(f ElectronHeatCapacityLinearAddDensity::ElectronHeatCapacityLinearAddDensity(fstream &fileId, map & parameters, - Material * material) + Material * material) : ElectronHeatCapacityLinear(fileId, parameters), material_(material) { diff --git a/lib/atc/ElectronHeatCapacity.h b/lib/atc/ElectronHeatCapacity.h index f27d8193a0..eb4e970fee 100644 --- a/lib/atc/ElectronHeatCapacity.h +++ b/lib/atc/ElectronHeatCapacity.h @@ -27,19 +27,19 @@ namespace ATC { DENS_MAT_VEC & Dcapacity)=0; /** computes thermal energy */ virtual void electron_thermal_energy(const FIELD_MATS &fields, - DENS_MAT &energy)=0; + DENS_MAT &energy)=0; }; //------------------------------------------------------------------- - + /** * @class ElectronHeatCapacityConstant * @brief Class for a constant electron heat capacity - */ - + */ + class ElectronHeatCapacityConstant : public ElectronHeatCapacity { public: - ElectronHeatCapacityConstant(std::fstream &matfile, + ElectronHeatCapacityConstant(std::fstream &matfile, std::map & parameters); virtual ~ElectronHeatCapacityConstant() {}; virtual void electron_heat_capacity(const FIELD_MATS &fields, @@ -59,25 +59,25 @@ namespace ATC { Dcapacity[0] = zeroWorkspace_; Dcapacity[1] = zeroWorkspace_; Dcapacity[2] = zeroWorkspace_; - } + } virtual void electron_thermal_energy(const FIELD_MATS &fields, DENS_MAT &energy) { FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE); const DENS_MAT & T = etField->second; energy = electronHeatCapacity_ * T; - }; + }; protected: double electronHeatCapacity_; DENS_MAT zeroWorkspace_; }; //------------------------------------------------------------------- - + /** * @class ElectronHeatCapacityLinear * @brief Class for an electron capacity that is directly proportional to the electron temperature - */ - + */ + class ElectronHeatCapacityLinear : public ElectronHeatCapacity { public: @@ -108,21 +108,21 @@ namespace ATC { const DENS_MAT & T = etField->second; energy = electronHeatCapacity_ * T; energy *= T; - }; + }; protected: double electronHeatCapacity_; }; //------------------------------------------------------------------- - + /** * @class ElectronHeatCapacityConstantAddDensity * @brief Class for a constant electron specific heat capacity (i.e, does not include the electron density) - */ - + */ + class ElectronHeatCapacityConstantAddDensity : public ElectronHeatCapacityConstant { public: - ElectronHeatCapacityConstantAddDensity(std::fstream &matfile, + ElectronHeatCapacityConstantAddDensity(std::fstream &matfile, std::map & parameters, Material * material); virtual ~ElectronHeatCapacityConstantAddDensity() {}; @@ -165,12 +165,12 @@ namespace ATC { DENS_MAT capacityMat_; // avoid resizing if possible }; //------------------------------------------------------------------- - + /** * @class ElectronHeatCapacityLinearAddDensity * @brief Class for a electron specific heat capacity that is proportional to the temperature (i.e., does not include density) - */ - + */ + class ElectronHeatCapacityLinearAddDensity : public ElectronHeatCapacityLinear { public: @@ -199,7 +199,7 @@ namespace ATC { GRAD_FIELD_MATS::const_iterator dEdField = gradFields.find(ELECTRON_DENSITY); const DENS_MAT_VEC & Ddensity = dEdField->second; - ElectronHeatCapacityLinear::electron_heat_capacity(fields,capacityWorkspace_); + ElectronHeatCapacityLinear::electron_heat_capacity(fields,capacityWorkspace_); Dcapacity[0] += Ddensity[0].mult_by_element(capacityWorkspace_); Dcapacity[1] += Ddensity[1].mult_by_element(capacityWorkspace_); Dcapacity[2] += Ddensity[2].mult_by_element(capacityWorkspace_); @@ -208,7 +208,7 @@ namespace ATC { DENS_MAT &energy) { ElectronHeatCapacityLinear::electron_thermal_energy(fields,energy); - + FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY); const DENS_MAT & density = edField->second; @@ -220,6 +220,6 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/ElectronHeatFlux.cpp b/lib/atc/ElectronHeatFlux.cpp index fbe3d0d512..6515efc3cd 100644 --- a/lib/atc/ElectronHeatFlux.cpp +++ b/lib/atc/ElectronHeatFlux.cpp @@ -22,7 +22,7 @@ ElectronHeatFlux::ElectronHeatFlux(ElectronHeatCapacity * electronHeatCapacity) } ElectronHeatFluxLinear::ElectronHeatFluxLinear(fstream &fileId, map & parameters, - ElectronHeatCapacity * electronHeatCapacity) + ElectronHeatCapacity * electronHeatCapacity) : ElectronHeatFlux(electronHeatCapacity), conductivity_(0) { @@ -43,7 +43,7 @@ ElectronHeatFluxLinear::ElectronHeatFluxLinear(fstream &fileId, map & parameters, - ElectronHeatCapacity * electronHeatCapacity) + ElectronHeatCapacity * electronHeatCapacity) : ElectronHeatFlux(electronHeatCapacity), conductivity_(0) { @@ -66,7 +66,7 @@ ElectronHeatFluxPowerLaw::ElectronHeatFluxPowerLaw(fstream &fileId, map & parameters, /*const*/ ElectronFlux * electronFlux, - ElectronHeatCapacity * electronHeatCapacity) + ElectronHeatCapacity * electronHeatCapacity) : ElectronHeatFlux(electronHeatCapacity), conductivity_(0), seebeckCoef_(0), @@ -86,7 +86,7 @@ ElectronHeatFluxThermopower::ElectronHeatFluxThermopower( else { throw ATC_Error( "unrecognized material function "+line[0]); } - + seebeckCoef_ = parameters["seebeck_coefficient"]; } } diff --git a/lib/atc/ElectronHeatFlux.h b/lib/atc/ElectronHeatFlux.h index 4c5b6200d3..ae1d420009 100644 --- a/lib/atc/ElectronHeatFlux.h +++ b/lib/atc/ElectronHeatFlux.h @@ -24,7 +24,7 @@ namespace ATC { const GRAD_FIELD_MATS & /* gradFields */, DENS_MAT_VEC &flux) { - + FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE); const DENS_MAT & Te = etField->second; zeroWorkspace_.reset(Te.nRows(),Te.nCols()); @@ -47,7 +47,7 @@ namespace ATC { flux[0] = vx; flux[1] = vy; flux[2] = vz; - // scale by thermal energy + // scale by thermal energy flux[0] *= cpTeWorkspace_; flux[1] *= cpTeWorkspace_; flux[2] *= cpTeWorkspace_; @@ -58,12 +58,12 @@ namespace ATC { DENS_MAT cpTeWorkspace_; // hopefully avoid resizing }; //----------------------------------------------------------------------- - + /** * @class ElectronHeatFluxLinear * @brief Class for an electron heat flux proportional to the temperature gradient with constant conductivity - */ - + */ + class ElectronHeatFluxLinear : public ElectronHeatFlux { public: @@ -80,17 +80,17 @@ namespace ATC { flux[0] = -conductivity_ * dT[0]; flux[1] = -conductivity_ * dT[1]; flux[2] = -conductivity_ * dT[2]; - }; + }; protected: double conductivity_; }; //----------------------------------------------------------------------- - + /** * @class ElectronHeatFluxPowerLaw * @brief Class for an electron heat flux proportional to the temperature gradient but with a conductivity proportional to the ratio of the electron and phonon temperatures - */ - + */ + class ElectronHeatFluxPowerLaw : public ElectronHeatFlux { public: @@ -116,23 +116,23 @@ namespace ATC { flux[0] *= electronConductivity_; flux[1] *= electronConductivity_; flux[2] *= electronConductivity_; - }; + }; protected: double conductivity_; DENS_MAT electronConductivity_; // hopefully avoid resizing }; //----------------------------------------------------------------------- - + /** * @class ElectronHeatFluxThermopower * @brief Class for an electron heat flux proportional to the temperature gradient but with a condu ctivity proportional to the ratio of the electron and phonon temperatures with the thermopower from the electric current included - */ - + */ + class ElectronHeatFluxThermopower : public ElectronHeatFlux { public: - ElectronHeatFluxThermopower(std::fstream &matfile, + ElectronHeatFluxThermopower(std::fstream &matfile, std::map & parameters, /*const*/ ElectronFlux * electronFlux = nullptr, /*const*/ ElectronHeatCapacity * electronHeatCapacity = nullptr); @@ -147,7 +147,7 @@ ctivity proportional to the ratio of the electron and phonon temperatures with t const DENS_MAT_VEC & dT = dEtField->second; const DENS_MAT & T = tField->second; const DENS_MAT & Te = etField->second; - + // flux = -ke * ( Te / T ) dT + pi J_e; flux[0] = dT[0]; flux[1] = dT[1]; @@ -163,16 +163,16 @@ ctivity proportional to the ratio of the electron and phonon temperatures with t tmp_[2] *= Te; flux[0] += seebeckCoef_*tmp_[0]; flux[1] += seebeckCoef_*tmp_[1]; - flux[2] += seebeckCoef_*tmp_[2]; - }; + flux[2] += seebeckCoef_*tmp_[2]; + }; protected: double conductivity_,seebeckCoef_; ElectronFlux * electronFlux_; DENS_MAT elecCondWorkspace_; // hopefully avoid resizing - DENS_MAT_VEC tmp_; + DENS_MAT_VEC tmp_; }; } -#endif +#endif diff --git a/lib/atc/ElectronPhononExchange.cpp b/lib/atc/ElectronPhononExchange.cpp index 0ccc8ec67e..40ae720445 100644 --- a/lib/atc/ElectronPhononExchange.cpp +++ b/lib/atc/ElectronPhononExchange.cpp @@ -18,7 +18,7 @@ using std::vector; namespace ATC { ElectronPhononExchangeLinear::ElectronPhononExchangeLinear( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronPhononExchange(), exchangeCoef_(0) { @@ -39,7 +39,7 @@ ElectronPhononExchangeLinear::ElectronPhononExchangeLinear( } ElectronPhononExchangePowerLaw::ElectronPhononExchangePowerLaw( - fstream &fileId, map & parameters) + fstream &fileId, map & parameters) : ElectronPhononExchange(), exchangeCoef_(0), exponent_(1) @@ -65,7 +65,7 @@ ElectronPhononExchangePowerLaw::ElectronPhononExchangePowerLaw( ElectronPhononExchangeHertel::ElectronPhononExchangeHertel(fstream &fileId, map & parameters, - Material * material) + Material * material) : ElectronPhononExchange(), exchangeCoef_(0), debeyeTemperature_(1), @@ -93,7 +93,7 @@ ElectronPhononExchangeHertel::ElectronPhononExchangeHertel(fstream &fileId, // coupling coefficient, eqn. 15 of Hertel 2002 double kb = LammpsInterface::instance()->kBoltzmann(); double hbar = LammpsInterface::instance()->hbar(); - double PI = 3.141592653589793238; + double PI = 3.141592653589793238; exchangeCoef_ = 144.*1.0369*kb/(PI*hbar); exchangeCoef_ *= massEnhancement_/pow(debeyeTemperature_,2); } diff --git a/lib/atc/ElectronPhononExchange.h b/lib/atc/ElectronPhononExchange.h index 3037451513..13d7ac2d76 100644 --- a/lib/atc/ElectronPhononExchange.h +++ b/lib/atc/ElectronPhononExchange.h @@ -7,7 +7,7 @@ #include "ATC_TypeDefs.h" namespace ATC { - + class Material; /** @@ -54,16 +54,16 @@ namespace ATC { double exchangeCoef_; }; //------------------------------------------------------------------- - + /** * @class ElectronPhononExchangePowerLaw * @brief Class for electron-phonon exchange proportional to the temperature difference raised to a constant power - */ - + */ + class ElectronPhononExchangePowerLaw : public ElectronPhononExchange { public: - ElectronPhononExchangePowerLaw(std::fstream &matfile, + ElectronPhononExchangePowerLaw(std::fstream &matfile, std::map & parameters); virtual ~ElectronPhononExchangePowerLaw() {}; virtual bool electron_phonon_exchange(const FIELD_MATS &fields, @@ -78,22 +78,22 @@ namespace ATC { flux = (Te - T).pow(exponent_); flux *= exchangeCoef_; return true; - }; + }; protected: double exchangeCoef_; int exponent_; }; //------------------------------------------------------------------- - + /** * @class ElectronPhononExchangeHertel * @brief Class for electron-phonon exchange based on the formulation of Hertel for Cu - */ - + */ + class ElectronPhononExchangeHertel : public ElectronPhononExchange { public: - ElectronPhononExchangeHertel(std::fstream &matfile, + ElectronPhononExchangeHertel(std::fstream &matfile, std::map & parameters, Material * material); virtual ~ElectronPhononExchangeHertel() {}; @@ -104,13 +104,13 @@ namespace ATC { double debeyeTemperature_; double massEnhancement_; Material * material_; - + private: ElectronPhononExchangeHertel() {}; DENS_MAT capacityWorkspace_; }; } -#endif +#endif diff --git a/lib/atc/ExtrinsicModel.cpp b/lib/atc/ExtrinsicModel.cpp index 8e0079d965..8dc8b71539 100644 --- a/lib/atc/ExtrinsicModel.cpp +++ b/lib/atc/ExtrinsicModel.cpp @@ -32,7 +32,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -48,16 +48,16 @@ namespace ATC { //-------------------------------------------------------- bool ExtrinsicModelManager::modify(int narg, char **arg) { - bool foundMatch = false; - + bool foundMatch = false; + // loop over models with command vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { foundMatch = (*imodel)->modify(narg,arg); if (foundMatch) break; } - + return foundMatch; } @@ -81,10 +81,10 @@ namespace ATC { myModel = new ExtrinsicModelTwoTemperature (this,modelType,matFileName); } - else if (modelType==DRIFT_DIFFUSION + else if (modelType==DRIFT_DIFFUSION || modelType==DRIFT_DIFFUSION_EQUILIBRIUM || modelType==DRIFT_DIFFUSION_SCHRODINGER - || modelType==DRIFT_DIFFUSION_SCHRODINGER_SLICE) + || modelType==DRIFT_DIFFUSION_SCHRODINGER_SLICE) { stringstream ss; ss << "creating drift_diffusion extrinsic model"; @@ -92,7 +92,7 @@ namespace ATC { myModel = new ExtrinsicModelDriftDiffusion (this,modelType,matFileName); } - else if (modelType==CONVECTIVE_DRIFT_DIFFUSION + else if (modelType==CONVECTIVE_DRIFT_DIFFUSION || modelType==CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM || modelType==CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER) { stringstream ss; @@ -129,7 +129,7 @@ namespace ATC { void ExtrinsicModelManager::construct_transfers() { vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { // initialize models (*imodel)->construct_transfers(); @@ -142,7 +142,7 @@ namespace ATC { void ExtrinsicModelManager::initialize() { vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { // initialize models (*imodel)->initialize(); @@ -168,13 +168,13 @@ namespace ATC { { int extrinsicSize = 0; vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { // query all models for LAMMPS display int currentSize = intrinsicSize + extrinsicSize; extrinsicSize += (*imodel)->size_vector(currentSize); } - + return extrinsicSize; } @@ -185,7 +185,7 @@ namespace ATC { { double value = 0.; vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { value += (*imodel)->compute_scalar(); // sum } @@ -199,7 +199,7 @@ namespace ATC { { double value = 0.; vector::iterator imodel; - for(imodel=extrinsicModels_.begin(); + for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) { // query all models for LAMMPS display if ((*imodel)->compute_vector(n,value)) @@ -348,7 +348,7 @@ namespace ATC { rhsMaskIntrinsic_.reset(NUM_FIELDS,NUM_FLUX); rhsMaskIntrinsic_ = false; } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -371,7 +371,7 @@ namespace ATC { //-------------------------------------------------------- void ExtrinsicModel::num_fields(map & fieldSizes) { - physicsModel_->num_fields(fieldSizes,atc_->fieldMask_); + physicsModel_->num_fields(fieldSizes,atc_->fieldMask_); } }; diff --git a/lib/atc/ExtrinsicModel.h b/lib/atc/ExtrinsicModel.h index 66282fb505..77f38d109c 100644 --- a/lib/atc/ExtrinsicModel.h +++ b/lib/atc/ExtrinsicModel.h @@ -42,7 +42,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelManager { - + public: // constructor @@ -98,7 +98,7 @@ namespace ATC { /** model name enum to string */ - static bool model_to_string(const ExtrinsicModelType index, std::string & name) + static bool model_to_string(const ExtrinsicModelType index, std::string & name) { switch (index) { case NO_MODEL: @@ -141,11 +141,11 @@ namespace ATC { return false; break; } - return true; + return true; }; /** string to model enum */ - static bool string_to_model(const std::string & name, ExtrinsicModelType & index) + static bool string_to_model(const std::string & name, ExtrinsicModelType & index) { if (name=="no_model") index = NO_MODEL; @@ -174,7 +174,7 @@ namespace ATC { else return false; - + return true; }; @@ -209,7 +209,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModel { - + public: // constructor @@ -295,8 +295,8 @@ namespace ATC { /** rhs mask for coupling with MD */ Array2D rhsMaskIntrinsic_; - - + + GRAD_FIELD_MATS fluxes_; /** number of nodes */ diff --git a/lib/atc/ExtrinsicModelDriftDiffusion.cpp b/lib/atc/ExtrinsicModelDriftDiffusion.cpp index a9d8f27604..0288197da8 100644 --- a/lib/atc/ExtrinsicModelDriftDiffusion.cpp +++ b/lib/atc/ExtrinsicModelDriftDiffusion.cpp @@ -39,7 +39,7 @@ namespace ATC { string matFileName) : ExtrinsicModelTwoTemperature(modelManager,modelType,matFileName), continuityIntegrator_(nullptr), - + poissonSolverType_(DIRECT), // ITERATIVE | DIRECT poissonSolver_(nullptr), baseSize_(0), @@ -49,34 +49,34 @@ namespace ATC { schrodingerSolver_(nullptr), schrodingerPoissonMgr_(), schrodingerPoissonSolver_(nullptr), - maxConsistencyIter_(0), maxConstraintIter_(1), + maxConsistencyIter_(0), maxConstraintIter_(1), safe_dEf_(0.1), Ef_shift_(0.0), oneD_(false), oneDcoor_(0), oneDconserve_(0) { // delete base class's version of the physics model - if (physicsModel_) delete physicsModel_; + if (physicsModel_) delete physicsModel_; if (modelType == DRIFT_DIFFUSION_EQUILIBRIUM) { - physicsModel_ = new PhysicsModelDriftDiffusionEquilibrium(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusionEquilibrium(matFileName); electronDensityEqn_ = ELECTRON_EQUILIBRIUM; } else if (modelType == DRIFT_DIFFUSION_SCHRODINGER) { - physicsModel_ = new PhysicsModelDriftDiffusionSchrodinger(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusionSchrodinger(matFileName); electronDensityEqn_ = ELECTRON_SCHRODINGER; maxConsistencyIter_ = 1; } else if (modelType == DRIFT_DIFFUSION_SCHRODINGER_SLICE) { - physicsModel_ = new PhysicsModelDriftDiffusionSchrodingerSlice(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusionSchrodingerSlice(matFileName); electronDensityEqn_ = ELECTRON_SCHRODINGER; maxConsistencyIter_ = 1; } else { - physicsModel_ = new PhysicsModelDriftDiffusion(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusion(matFileName); } atc_->useConsistentMassMatrix_(ELECTRON_DENSITY) = true; rhsMaskIntrinsic_(ELECTRON_TEMPERATURE,SOURCE) = true; //atc_->fieldMask_(ELECTRON_TEMPERATURE,EXTRINSIC_SOURCE) = true; } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -89,7 +89,7 @@ namespace ATC { } //-------------------------------------------------------- - // modify + // modify //-------------------------------------------------------- bool ExtrinsicModelDriftDiffusion::modify(int narg, char **arg) { @@ -110,9 +110,9 @@ namespace ATC { nNodes_ = atc_->num_nodes(); rhs_[ELECTRON_DENSITY].reset(nNodes_,1); rhs_[ELECTRIC_POTENTIAL].reset(nNodes_,1); - + // set up electron continuity integrator - Array2D rhsMask(NUM_TOTAL_FIELDS,NUM_FLUX); + Array2D rhsMask(NUM_TOTAL_FIELDS,NUM_FLUX); rhsMask = false; for (int i = 0; i < NUM_FLUX; i++) { rhsMask(ELECTRON_DENSITY,i) = atc_->fieldMask_(ELECTRON_DENSITY,i); @@ -121,7 +121,7 @@ namespace ATC { atc_->set_fixed_nodes(); if (continuityIntegrator_) delete continuityIntegrator_; - if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) { + if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) { continuityIntegrator_ = new FieldImplicitEulerIntegrator(ELECTRON_DENSITY, physicsModel_, atc_->feEngine_, atc_, rhsMask); } @@ -142,7 +142,7 @@ namespace ATC { rhsMask(ELECTRIC_POTENTIAL,i) = atc_->fieldMask_(ELECTRIC_POTENTIAL,i); } int type = ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC; - if (poissonSolverType_ == DIRECT) { + if (poissonSolverType_ == DIRECT) { type = ATC::LinearSolver::DIRECT_SOLVE; } if (poissonSolver_) delete poissonSolver_; @@ -154,12 +154,12 @@ namespace ATC { // set up schrodinger solver if ( electronDensityEqn_ == ELECTRON_SCHRODINGER ) { if ( schrodingerSolver_ ) delete schrodingerSolver_; - if ( oneD_ ) { + if ( oneD_ ) { EfHistory_.reset(oneDslices_.size(),2); schrodingerSolver_ = new SliceSchrodingerSolver(ELECTRON_DENSITY, physicsModel_, atc_->feEngine_, atc_->prescribedDataMgr_, atc_, oneDslices_,oneDdxs_); - } + } else { schrodingerSolver_ = new SchrodingerSolver(ELECTRON_DENSITY, physicsModel_, atc_->feEngine_, atc_->prescribedDataMgr_, atc_); @@ -192,7 +192,7 @@ namespace ATC { double dt = atc_->lammpsInterface_->dt(); double time = atc_->time(); int step = atc_->step(); - if (step % fluxUpdateFreq_ != 0) return; + if (step % fluxUpdateFreq_ != 0) return; // set Dirchlet data atc_->set_fixed_nodes(); @@ -201,25 +201,25 @@ namespace ATC { atc_->set_sources(); // subcyle integration of fast electron variable/s - + double idt = dt/nsubcycle_; for (int i = 0; i < nsubcycle_ ; ++i) { if (electronDensityEqn_ == ELECTRON_CONTINUITY) { // update continuity eqn - if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) + if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) continuityIntegrator_->update(idt,time,atc_->fields_,rhs_); - atc_->set_fixed_nodes(); + atc_->set_fixed_nodes(); // solve poisson eqn for electric potential if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) poissonSolver_->solve(atc_->fields(),rhs_); - } + } else if (electronDensityEqn_ == ELECTRON_SCHRODINGER) { - if ( (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) + if ( (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) || (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) ) schrodingerPoissonSolver_->solve(rhs_,fluxes_); } // update electron temperature - if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_TEMPERATURE) + if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_TEMPERATURE) && temperatureIntegrator_ ) { #ifdef ATC_VERBOSE ATC::LammpsInterface::instance()->stream_msg_once("start temperature integration...",true,false); @@ -229,10 +229,10 @@ namespace ATC { ATC::LammpsInterface::instance()->stream_msg_once(" done",false,true); #endif } - atc_->set_fixed_nodes(); + atc_->set_fixed_nodes(); } - + } //-------------------------------------------------------- // set coupling source terms @@ -249,7 +249,7 @@ namespace ATC { // output //-------------------------------------------------------- void ExtrinsicModelDriftDiffusion::output(OUTPUT_LIST & outputData) - { + { #ifdef ATC_VERBOSE // ATC::LammpsInterface::instance()->print_msg_once("start output",true,false); #endif @@ -355,13 +355,13 @@ namespace ATC { baseSize_(0) { // delete base class's version of the physics model - if (physicsModel_) delete physicsModel_; + if (physicsModel_) delete physicsModel_; if (modelType == CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER) { - physicsModel_ = new PhysicsModelDriftDiffusionConvectionSchrodinger(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusionConvectionSchrodinger(matFileName); electronDensityEqn_ = ELECTRON_SCHRODINGER; } else { - physicsModel_ = new PhysicsModelDriftDiffusionConvection(matFileName); + physicsModel_ = new PhysicsModelDriftDiffusionConvection(matFileName); } atc_->useConsistentMassMatrix_(ELECTRON_VELOCITY) = false; atc_->useConsistentMassMatrix_(ELECTRON_TEMPERATURE) = false; @@ -388,7 +388,7 @@ namespace ATC { nsd_ = atc_->nsd(); rhs_[ELECTRON_VELOCITY].reset(nNodes_,nsd_); - + atc_->set_fixed_nodes(); // needed to correctly set BC data // initialize Poisson solver if (cddmPoissonSolver_) delete cddmPoissonSolver_; @@ -397,9 +397,9 @@ namespace ATC { rhsMask(ELECTRIC_POTENTIAL,FLUX) = true; pair row_col(ELECTRIC_POTENTIAL,ELECTRIC_POTENTIAL); SPAR_MAT stiffness; - (atc_->feEngine_)->compute_tangent_matrix(rhsMask,row_col, atc_->fields(), physicsModel_, + (atc_->feEngine_)->compute_tangent_matrix(rhsMask,row_col, atc_->fields(), physicsModel_, atc_->element_to_material_map(), stiffness); - + const BC_SET & bcs = (atc_->prescribedDataMgr_->bcs(ELECTRIC_POTENTIAL))[0]; cddmPoissonSolver_ = new LinearSolver(stiffness, bcs, poissonSolverType_, @@ -427,7 +427,7 @@ namespace ATC { double dt = atc_->lammpsInterface_->dt(); double time = atc_->time(); int step = atc_->step(); - if (step % fluxUpdateFreq_ != 0) return; + if (step % fluxUpdateFreq_ != 0) return; // set Dirchlet data atc_->set_fixed_nodes(); @@ -436,16 +436,16 @@ namespace ATC { atc_->set_sources(); // subcyle integration of fast electron variable/s - + double idt = dt/nsubcycle_; for (int i = 0; i < nsubcycle_ ; ++i) { // update electron temperature mass matrix atc_->compute_mass_matrix(ELECTRON_VELOCITY,physicsModel_); // update electron velocity if (!(atc_->prescribedDataMgr_)->all_fixed(ELECTRON_VELOCITY)) { - //const BCS & bcs + //const BCS & bcs // = atc_->prescribedDataMgr_->bcs(ELECTRON_VELOCITY); - Array2D rhsMask(NUM_FIELDS,NUM_FLUX); + Array2D rhsMask(NUM_FIELDS,NUM_FLUX); rhsMask = false; rhsMask(ELECTRON_VELOCITY,SOURCE) = atc_->fieldMask_(ELECTRON_VELOCITY,SOURCE); rhsMask(ELECTRON_VELOCITY,FLUX) = atc_->fieldMask_(ELECTRON_VELOCITY,FLUX); @@ -455,7 +455,7 @@ namespace ATC { atc_->compute_rhs_vector(rhsMask, atc_->fields_, rhs, atc_->source_integration(), physicsModel_); const DENS_MAT & velocityRhs = rhs[ELECTRON_VELOCITY].quantity(); - // add a solver for electron momentum + // add a solver for electron momentum DENS_MAT & velocity = (atc_->field(ELECTRON_VELOCITY)).set_quantity(); for (int j = 0; j < nsd_; ++j) { if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_VELOCITY,j) ) { @@ -477,12 +477,12 @@ namespace ATC { } } } - + //atc_->set_fixed_nodes(); - + if (electronDensityEqn_ == ELECTRON_CONTINUITY) { // update continuity eqn - Array2D rhsMask(NUM_FIELDS,NUM_FLUX); + Array2D rhsMask(NUM_FIELDS,NUM_FLUX); rhsMask = false; rhsMask(ELECTRON_DENSITY,FLUX) = atc_->fieldMask_(ELECTRON_DENSITY,FLUX); rhsMask(ELECTRON_DENSITY,SOURCE) = atc_->fieldMask_(ELECTRON_DENSITY,SOURCE); @@ -490,11 +490,11 @@ namespace ATC { FIELDS rhs; rhs[ELECTRON_DENSITY].reset(nNodes_,1); atc_->compute_rhs_vector(rhsMask, atc_->fields_, rhs, atc_->source_integration(), physicsModel_); - if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) + if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) continuityIntegrator_->update(idt,time,atc_->fields_,rhs); - atc_->set_fixed_nodes(); + atc_->set_fixed_nodes(); // solve poisson eqn for electric potential - + if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) { //poissonSolver_->solve(atc_->fields_,rhs_); rhsMask = false; @@ -507,12 +507,12 @@ namespace ATC { const CLON_VEC r =column(rhs[ELECTRIC_POTENTIAL].quantity(),0); cddmPoissonSolver_->solve(x,r); } - } + } else if (electronDensityEqn_ == ELECTRON_SCHRODINGER) { schrodingerPoissonSolver_->solve(rhs_,fluxes_); } - - atc_->set_fixed_nodes(); + + atc_->set_fixed_nodes(); // update electron temperature mass matrix atc_->compute_mass_matrix(ELECTRON_TEMPERATURE,physicsModel_); // update electron temperature @@ -521,11 +521,11 @@ namespace ATC { temperatureIntegrator_->update(idt,time,atc_->fields_,rhs_); //} //else { // lumped mass matrix - + //} } - atc_->set_fixed_nodes(); - + atc_->set_fixed_nodes(); + } } @@ -536,8 +536,8 @@ namespace ATC { void ExtrinsicModelDriftDiffusionConvection::output(OUTPUT_LIST & outputData) { ExtrinsicModelDriftDiffusion::output(outputData); - - + + //FIELD jouleHeating(atc_->num_nodes(),1); //set_kinetic_energy_source(atc_->fields(),jouleHeating); outputData["joule_heating"] = & (atc_->extrinsic_source(TEMPERATURE)).set_quantity(); @@ -587,7 +587,7 @@ namespace ATC { DENS_MAT & velocity((atc_->field(ELECTRON_VELOCITY)).set_quantity()); SPAR_MAT & velocityMassMat = (atc_->consistentMassMats_[ELECTRON_VELOCITY]).set_quantity(); kineticEnergy.reset(nNodes_,1); - + for (int j = 0; j < nsd_; j++) { CLON_VEC myVelocity(velocity,CLONE_COL,j); DENS_MAT velocityMat(nNodes_,1); diff --git a/lib/atc/ExtrinsicModelDriftDiffusion.h b/lib/atc/ExtrinsicModelDriftDiffusion.h index abc40e84d2..1547eb16aa 100644 --- a/lib/atc/ExtrinsicModelDriftDiffusion.h +++ b/lib/atc/ExtrinsicModelDriftDiffusion.h @@ -32,7 +32,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelDriftDiffusion : public ExtrinsicModelTwoTemperature { - + public: // constructor @@ -63,7 +63,7 @@ namespace ATC { /** get LAMMPS display variables */ virtual bool compute_vector(int n, double & value); - + protected: /** Poisson solve */ void poisson_solve(); @@ -91,7 +91,7 @@ namespace ATC { enum electronDensityEqnType { ELECTRON_CONTINUITY, ELECTRON_EQUILIBRIUM, ELECTRON_SCHRODINGER}; - + /** frequency for updating the electron state */ int fluxUpdateFreq_; @@ -139,7 +139,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelDriftDiffusionConvection : public ExtrinsicModelDriftDiffusion { - + public: // constructor @@ -167,7 +167,7 @@ namespace ATC { /** get LAMMPS display variables */ virtual bool compute_vector(int n, double & value); - + protected: /** compute the total kinetic energy of the electrons */ @@ -176,7 +176,7 @@ namespace ATC { /** Linear solver for velocity */ std::vector velocitySolvers_; - + /** Linear solver for solving the poisson equations */ LinearSolver * cddmPoissonSolver_; diff --git a/lib/atc/ExtrinsicModelElectrostatic.cpp b/lib/atc/ExtrinsicModelElectrostatic.cpp index d0aa56d67d..73a94b8192 100644 --- a/lib/atc/ExtrinsicModelElectrostatic.cpp +++ b/lib/atc/ExtrinsicModelElectrostatic.cpp @@ -53,11 +53,11 @@ namespace ATC { rhsMaskIntrinsic_.reset(NUM_FIELDS,NUM_FLUX); rhsMaskIntrinsic_ = false; if (atc_->track_charge()) { - + if (! chargeRegulator_) chargeRegulator_ = new ChargeRegulator(atc_); } } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -68,7 +68,7 @@ namespace ATC { } //-------------------------------------------------------- - // modify + // modify //-------------------------------------------------------- bool ExtrinsicModelElectrostatic::modify(int narg, char **arg) { @@ -82,7 +82,7 @@ namespace ATC { if (strcmp(arg[argIndx],"max_solves")==0) { argIndx++; maxSolves_ = atoi(arg[argIndx]) ; } - + else if (strcmp(arg[argIndx],"tolerance")==0) { argIndx++; poissonSolverTol_ = atof(arg[argIndx]); @@ -97,7 +97,7 @@ namespace ATC { poissonSolverType_ = DIRECT; } match = true; } // end "poisson_solver" - + /** creates fixed charge on faceset @@ -177,9 +177,9 @@ namespace ATC { "InterpolantGradient"); } - FundamentalAtomQuantity * atomicCharge = + FundamentalAtomQuantity * atomicCharge = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE); - AtfShapeFunctionRestriction * nodalAtomicCharge = + AtfShapeFunctionRestriction * nodalAtomicCharge = new AtfShapeFunctionRestriction(atc_,atomicCharge,atc_->accumulant()); interscaleManager.add_dense_matrix(nodalAtomicCharge,"NodalAtomicCharge"); AtfShapeFunctionMdProjection * nodalAtomicChargeDensity = @@ -198,10 +198,10 @@ namespace ATC { const string moleculeName = molecule->first; SmallMoleculeSet * smallMoleculeSet = interscaleManager.small_molecule_set(moleculeName); // calculate nodal charge from the molecules - AtomToSmallMoleculeTransfer * moleculeCharge = + AtomToSmallMoleculeTransfer * moleculeCharge = new AtomToSmallMoleculeTransfer(atc_,charge,smallMoleculeSet); interscaleManager.add_dense_matrix(moleculeCharge,"MoleculeCharge"+moleculeName); - MotfShapeFunctionRestriction * nodalAtomicMoleculeCharge = + MotfShapeFunctionRestriction * nodalAtomicMoleculeCharge = new MotfShapeFunctionRestriction(moleculeCharge, interscaleManager.sparse_matrix("ShapeFunction"+moleculeName)); interscaleManager.add_dense_matrix(nodalAtomicMoleculeCharge,"NodalMoleculeCharge"+moleculeName); @@ -212,10 +212,10 @@ namespace ATC { // dipole moment density // calculate the dipole moment of the molecules SmallMoleculeCentroid * moleculeCentroid = static_cast(interscaleManager.dense_matrix("MoleculeCentroid"+moleculeName)); - SmallMoleculeDipoleMoment * dipoleMoment = + SmallMoleculeDipoleMoment * dipoleMoment = new SmallMoleculeDipoleMoment(atc_,charge,smallMoleculeSet,atomProcGhostCoarseGrainingPositions,moleculeCentroid); interscaleManager.add_dense_matrix(dipoleMoment,"DipoleMoment"+moleculeName); - MotfShapeFunctionRestriction * nodalAtomicMoleculeDipole = + MotfShapeFunctionRestriction * nodalAtomicMoleculeDipole = new MotfShapeFunctionRestriction(dipoleMoment, interscaleManager.sparse_matrix("ShapeFunction"+moleculeName)); interscaleManager.add_dense_matrix(nodalAtomicMoleculeDipole,"NodalMoleculeDipole"+moleculeName); @@ -224,7 +224,7 @@ namespace ATC { interscaleManager.add_dense_matrix(nodalAtomicMoleculeDipoleDensity,"NodalMoleculeDipoleDensity"+moleculeName); } } - + } //-------------------------------------------------------- @@ -255,7 +255,7 @@ namespace ATC { } rhsMask_(ELECTRIC_POTENTIAL,FLUX) = false;// for poisson solve & rhs compute // need to create the bcs for the solver to configure properly - atc_->set_fixed_nodes(); + atc_->set_fixed_nodes(); if (poissonSolver_) delete poissonSolver_; @@ -278,14 +278,14 @@ namespace ATC { // set up Green's function per node for (int i = 0; i < nNodes; i++) { set localNodes; - + for (int j = 0; j < nNodes; j++) localNodes.insert(j); // call Poisson solver to get Green's function for node i DENS_VEC globalGreensFunction; poissonSolver_->greens_function(i,globalGreensFunction); - + // store green's functions as sparse vectors only on local nodes set::const_iterator thisNode; SparseVector sparseGreensFunction(nNodes); @@ -311,7 +311,7 @@ namespace ATC { nodalAtomicGhostCharge_ = interscaleManager.dense_matrix("NodalAtomicGhostCharge"); if (! nodalAtomicGhostCharge_) { FundamentalAtomQuantity * ghostCharge = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE, GHOST); - + PerAtomSparseMatrix * ghostShapeFunctions = interscaleManager.per_atom_sparse_matrix("InterpolantGhost"); if (!ghostShapeFunctions) { ghostShapeFunctions = new PerAtomShapeFunction(atc_, @@ -353,10 +353,10 @@ namespace ATC { { if (chargeRegulator_) chargeRegulator_->apply_post_force(atc_->dt()); - // add in correction accounting for lumped mass matrix in charge density + // add in correction accounting for lumped mass matrix in charge density // in atomistic part of domain & account for physics model fluxes,resets rhs - - + + // set Dirchlet data atc_->set_fixed_nodes(); @@ -365,7 +365,7 @@ namespace ATC { // compute Poisson equation RHS sources atc_->compute_rhs_vector(rhsMask_, atc_->fields_, rhs_, atc_->source_integration(), physicsModel_); - + // add atomic charges to rhs DENS_MAT & rhs = rhs_[ELECTRIC_POTENTIAL].set_quantity(); if (atc_->track_charge()) { @@ -376,9 +376,9 @@ namespace ATC { } } - - + + // solve poisson eqn for electric potential // electron charge density added to Poisson RHS in solver @@ -391,7 +391,7 @@ namespace ATC { } // do this for intrinsic charges or effective electron charges at atoms - if (atc_->track_charge() + if (atc_->track_charge() || ( LammpsInterface::instance()->atom_charge() && atc_->source_atomic_quadrature(ELECTRIC_POTENTIAL) ) ) { _atomElectricalForce_.resize(atc_->nlocal(),atc_->nsd()); add_electrostatic_forces(potential); @@ -400,8 +400,8 @@ namespace ATC { apply_charged_surfaces(potential); #endif - InterscaleManager & interscaleManager_ = atc_->interscale_manager(); - atomForces_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE); + InterscaleManager & interscaleManager_ = atc_->interscale_manager(); + atomForces_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE); (*atomForces_) += _atomElectricalForce_; // f_E in ours, f in lammps ultimately } } @@ -421,7 +421,7 @@ namespace ATC { else { localF[0] = 0.;localF[1] = 0.; localF[2] = 0.; } - LammpsInterface::instance()->allsum(localF,totalElectricalForce_,3); + LammpsInterface::instance()->allsum(localF,totalElectricalForce_,3); if (LammpsInterface::instance()->rank_zero()) { atc_->feEngine_->add_global("electrostatic_force_x", totalElectricalForce_[0]); atc_->feEngine_->add_global("electrostatic_force_y", totalElectricalForce_[1]); @@ -435,9 +435,9 @@ namespace ATC { InterscaleManager & interscaleManager(atc_->interscale_manager()); const DENS_MAN * atomicChargeDensity(interscaleManager.dense_matrix("NodalAtomicChargeDensity")); atc_->nodal_atomic_field(CHARGE_DENSITY) = atomicChargeDensity->quantity(); - + fields[CHARGE_DENSITY] = atomicChargeDensity->quantity(); - + DENS_MAT & chargeDensity(fields[CHARGE_DENSITY].set_quantity()); DENS_MAT & nodalAtomicChargeDensity((atc_->nodal_atomic_field(CHARGE_DENSITY)).set_quantity()); if ((atc_->lammps_interface())->rank_zero()) { @@ -446,7 +446,7 @@ namespace ATC { } } - + if (fields.find(ELECTRON_DENSITY)==fields.end()) { fields[ELECTRON_DENSITY].reset(fields[CHARGE_DENSITY].nRows(),1); DENS_MAT & electronDensity(fields[ELECTRON_DENSITY].set_quantity()); @@ -454,7 +454,7 @@ namespace ATC { outputData["electron_density"] = &electronDensity; } } - + const map > & moleculeIds(atc_->molecule_ids()); map >::const_iterator molecule; for (molecule = moleculeIds.begin(); molecule != moleculeIds.end(); molecule++) { @@ -488,7 +488,7 @@ namespace ATC { //((atc_->interscale_manager()).fundamental_atom_quantity(LammpsInterface::ATOM_POSITION))->force_reset(); const DENS_MAT & atomPosition = ((atc_->interscale_manager()).fundamental_atom_quantity(LammpsInterface::ATOM_POSITION))->quantity(); double local_fdotx = 0, fdotx; - + for (int i = 0; i < _atomElectricalForce_.nRows() ; i++) { for (int j = 0; j < _atomElectricalForce_.nCols() ; j++) { local_fdotx -= _atomElectricalForce_(i,j)*atomPosition(i,j); @@ -505,7 +505,7 @@ namespace ATC { bool ExtrinsicModelElectrostatic::compute_vector(int n, double & value) { if (n == baseSize_) { - + double nSum = ((atc_->field(ELECTRON_DENSITY)).quantity()).col_sum(); value = nSum; return true; @@ -532,7 +532,7 @@ namespace ATC { void ExtrinsicModelElectrostatic::add_electrostatic_forces (MATRIX & potential) { - + //double qE2f = LammpsInterface::instance()->qe2f(); double qV2e = LammpsInterface::instance()->qv2e(); // charge volts to our energy units //double ** f = LammpsInterface::instance()->fatom(); @@ -548,7 +548,7 @@ namespace ATC { Ei = -1.*(*(shapeFucntionDerivatives[i])*potential); } } - + int dimOffset = 0; if (useSlab_) dimOffset = nsd - 1; for (int i = 0; i < nLocal; i++) { @@ -559,7 +559,7 @@ namespace ATC { for (int j = dimOffset; j < nsd; j ++) _atomElectricalForce_(i,j) = c*E(i,j); } - + // correct field for short range interactions if (includeShortRange_) correct_electrostatic_forces(); @@ -577,7 +577,7 @@ namespace ATC { double * q = LammpsInterface::instance()->atom_charge(); vector > atomicFePotential; int nLocal = atc_->nlocal(); - + int nGhostLammps = LammpsInterface::instance()->nghost(); int nLocalLammps = LammpsInterface::instance()->nlocal(); int nLocalTotal = nLocalLammps + nGhostLammps; // total number of atoms on this processor @@ -593,18 +593,18 @@ namespace ATC { DenseVector nodeIndices; DENS_VEC nodeValues; myShpFcn.row(i,nodeValues,nodeIndices); - + int atomIdx = atc_->internalToAtom_(i); //double c = qE2f*q[atomIdx]; //double c = qV2e*q[atomIdx]; //nodeValues *= c; nodeValues *= q[atomIdx]; - + for (int j = 0; j < nodeIndices.size(); j++) atomicFePotential[atomIdx].add_scaled(greensFunctions_[nodeIndices(j)],nodeValues(j)); } - // compute local potential contribtutions for lammps ghost atoms + // compute local potential contribtutions for lammps ghost atoms // which are known to ATC, // this will grab both processor and periodic neighbors, // so we need to add in neighbor contributions using lammps indices @@ -621,7 +621,7 @@ namespace ATC { Array nodeIndices(nodesPerElement); DENS_VEC nodeValues(nodesPerElement); (atc_->feEngine_)->shape_functions(coords,nodeValues,nodeIndices); - + //double c = qV2e*q[i]; //nodeValues *= c; nodeValues *= q[i]; @@ -633,7 +633,7 @@ namespace ATC { } // Get sparse vectors of derivatives at each atom - + // to compute this only when the shape functions change vector > > atomicDerivatives; atomicDerivatives.reserve(nLocal); @@ -657,9 +657,9 @@ namespace ATC { } } - // loop over all atoms and correct their efield based on all their + // loop over all atoms and correct their efield based on all their // neighbor's local efield response - + // need to use specific coulombic cutoff from different pairs // see pair_coul_cut for an example of the data structures // unfortunately don't know how to get at this data in general @@ -670,12 +670,12 @@ namespace ATC { double cutoffRadius = LammpsInterface::instance()->pair_cutoff(); double cutoffSq = cutoffRadius*cutoffRadius; - + int inum = LammpsInterface::instance()->neighbor_list_inum(); int * ilist = LammpsInterface::instance()->neighbor_list_ilist(); int * numneigh = LammpsInterface::instance()->neighbor_list_numneigh(); int ** firstneigh = LammpsInterface::instance()->neighbor_list_firstneigh(); - + // loop over neighbors of my atoms for (int ii = 0; ii < inum; ii++) { int i = ilist[ii]; @@ -683,10 +683,10 @@ namespace ATC { double xtmp = xatom[i][0]; double ytmp = xatom[i][1]; double ztmp = xatom[i][2]; - + int * jlist = firstneigh[i]; int jnum = numneigh[i]; - + for (int jj = 0; jj < jnum; jj++) { int j = jlist[jj]; if (mask[j] & atc_->groupbit_) { @@ -696,7 +696,7 @@ namespace ATC { double delx = xtmp - xatom[j][0]; double dely = ytmp - xatom[j][1]; double delz = ztmp - xatom[j][2]; - double rsq = delx*delx + dely*dely + delz*delz; + double rsq = delx*delx + dely*dely + delz*delz; if (rsq < cutoffSq) { DENS_VEC efield(nsd); efield = 0.; @@ -732,7 +732,7 @@ namespace ATC { // get faceset information int nNodes = atc_->num_nodes(); const FE_Mesh * feMesh = (atc_->feEngine_)->fe_mesh(); - const set< pair > * faceset + const set< pair > * faceset = & ( feMesh->faceset(facesetName)); // set face sources to all point at one function for use in integration @@ -765,7 +765,7 @@ namespace ATC { nodalFaceWeights[ELECTRIC_POTENTIAL].reset(nNodes,1); Array fieldMask(NUM_FIELDS); fieldMask(ELECTRIC_POTENTIAL) = true; - + (atc_->feEngine_)->add_fluxes(fieldMask,0.,faceSources,nodalFaceWeights); // set up data structure holding charged faceset information FIELDS sources; @@ -774,7 +774,7 @@ namespace ATC { for (myNodeData = myFaceset.begin(); myNodeData != myFaceset.end(); myNodeData++) { // evaluate voltage at each node I // set up X_T function for integration: k*chargeDensity/||x_I - x_s|| - + // integral is approximated in two parts: // 1) near part with all faces within r < rcrit evaluated as 2 * pi * rcrit * k sigma A/A0, A is area of this region and A0 = pi * rcrit^2, so 2 k sigma A / rcrit // 2) far part evaluated using Gaussian quadrature on faceset @@ -790,7 +790,7 @@ namespace ATC { string radialPower = "radial_power"; f = XT_Function_Mgr::instance()->function(radialPower,8,xtArgs); - + for (iset = faceset->begin(); iset != faceset->end(); iset++) { pair face = *iset; // allocate @@ -850,7 +850,7 @@ namespace ATC { string facesetName = isurface->first; map >::const_iterator inode; for (inode = (isurface->second).begin(); inode != (isurface->second).end(); inode++) { - + int nodeId = inode->first; DENS_VEC nodalCoords = (inode->second).first; double nodalCharge = (inode->second).second; @@ -858,26 +858,26 @@ namespace ATC { PerAtomQuantity * atomicCoords = (atc_->interscale_manager()).per_atom_quantity("AtomicCoarseGrainingPositions"); const DENS_MAT & myAtomicCoords(atomicCoords->quantity()); for (int i = 0; i < nLocal; i++) { - if (abs(qatom(i,0)) > 0) { + if (abs(qatom(i,0)) > 0) { double distanceSq = 0.; double deltaX[3]; for (int j = 0; j < nsd; j++) { deltaX[j] = myAtomicCoords(i,j) - nodalCoords(j); distanceSq += deltaX[j]*deltaX[j]; } - if (distanceSq < cutoffSq) { + if (distanceSq < cutoffSq) { // first apply pairwise coulombic interaction - if (!useSlab_) { + if (!useSlab_) { double coulForce = qqrd2e*nodalCharge*qatom(i,0)/(distanceSq*sqrtf(distanceSq)); for (int j = 0; j < nsd; j++) //fatom[atomIdx][j] += deltaX[j]*coulForce; _atomElectricalForce_(i,j) += deltaX[j]*coulForce; } - + // second correct for FE potential induced by BCs // determine shape function derivatives at atomic location // and construct sparse vectors to store derivative data - + vector > derivativeVectors; derivativeVectors.reserve(nsd); const SPAR_MAT_VEC & shapeFunctionDerivatives((interscaleManager.vector_sparse_matrix("InterpolantGradient"))->quantity()); @@ -889,23 +889,23 @@ namespace ATC { for (int k = 0; k < nodeIndices.size(); k++) derivativeVectors[j](nodeIndices(k)) = nodeValues(k); } - + // compute greens function from charge quadrature - + SparseVector shortFePotential(nNodes); shortFePotential.add_scaled(greensFunctions_[nodeId],penalty*nodalPotential); - + // compute electric field induced by charge DENS_VEC efield(nsd); efield = 0.; for (int j = 0; j < nsd; j++) efield(j) = -.1*dot(derivativeVectors[j],shortFePotential); - + // apply correction in atomic forces //double c = qE2f*qatom[atomIdx]; double c = qV2e*qatom(i,0); for (int j = 0; j < nsd; j++) - if ((!useSlab_) || (j==nsd)) { + if ((!useSlab_) || (j==nsd)) { //fatom[atomIdx][j] -= c*efield(j); _atomElectricalForce_(i,j) -= c*efield(j); } @@ -932,7 +932,7 @@ namespace ATC { string matFileName) : ExtrinsicModelElectrostatic(modelManager,modelType,matFileName) { - if (physicsModel_) delete physicsModel_; + if (physicsModel_) delete physicsModel_; if (modelType == ELECTROSTATIC) { physicsModel_ = new PhysicsModelElectrostatic(matFileName); } @@ -943,7 +943,7 @@ namespace ATC { rhsMaskIntrinsic_(VELOCITY,SOURCE) = true; atc_->fieldMask_(VELOCITY,EXTRINSIC_SOURCE) = true; } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -953,7 +953,7 @@ namespace ATC { } //-------------------------------------------------------- - // modify + // modify //-------------------------------------------------------- bool ExtrinsicModelElectrostaticMomentum::modify(int narg, char **arg) { @@ -983,7 +983,7 @@ namespace ATC { void ExtrinsicModelElectrostaticMomentum::set_sources(FIELDS & fields, FIELDS & sources) { // compute charge density - if (modelType_ == ELECTROSTATIC_EQUILIBRIUM) { + if (modelType_ == ELECTROSTATIC_EQUILIBRIUM) { DENS_MAN & n = atc_->field(ELECTRON_DENSITY); atc_->nodal_projection(ELECTRON_DENSITY,physicsModel_,n); } @@ -997,7 +997,7 @@ namespace ATC { // compute source term with appropriate masking and physics model atc_->evaluate_rhs_integral(rhsMaskIntrinsic_, fields, sources, - atc_->source_integration(), physicsModel_); + atc_->source_integration(), physicsModel_); //(sources[VELOCITY].quantity()).print("V SRC"); } diff --git a/lib/atc/ExtrinsicModelElectrostatic.h b/lib/atc/ExtrinsicModelElectrostatic.h index 86cba31471..4e80f20b9b 100644 --- a/lib/atc/ExtrinsicModelElectrostatic.h +++ b/lib/atc/ExtrinsicModelElectrostatic.h @@ -25,7 +25,7 @@ namespace ATC { /** * @class ExtrinsicModelElectrostatic * @brief add self-consistent electrostatic forces - * owned field: ELECTRIC_POTENTIAL + * owned field: ELECTRIC_POTENTIAL */ //-------------------------------------------------------- @@ -35,7 +35,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelElectrostatic : public ExtrinsicModel { - + public: // constructor @@ -71,9 +71,9 @@ namespace ATC { virtual double compute_scalar(void); virtual bool compute_vector(int n, double & value); - PoissonSolver * poisson_solver(void) const { return poissonSolver_;} + PoissonSolver * poisson_solver(void) const { return poissonSolver_;} + - protected: /** poisson solver type */ SolverType poissonSolverType_; @@ -91,7 +91,7 @@ namespace ATC { /** rhs mask for Poisson solver */ Array2D rhsMask_; - + /** estimate intrinsic charge density */ void add_electrostatic_forces(MATRIX & nodalPotential); @@ -107,7 +107,7 @@ namespace ATC { const double chargeDensity); #endif /** charge regulator */ - ChargeRegulator * chargeRegulator_; + ChargeRegulator * chargeRegulator_; /** local electric potential Green's function for each node */ std::vector > greensFunctions_; @@ -123,11 +123,11 @@ namespace ATC { /** data structure storing potential induced only by charges under the nodal shape function support */ std::map > nodalChargePotential_; - + /** allows electric force only applied only in z direction to complement LAMMPS slab command */ bool useSlab_; - + /** enables method when short range interactions are off */ bool includeShortRange_; @@ -158,7 +158,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelElectrostaticMomentum : public ExtrinsicModelElectrostatic { - + public: // constructor @@ -180,7 +180,7 @@ namespace ATC { /** Add model-specific output data */ virtual void output(OUTPUT_LIST & outputData); - + }; }; diff --git a/lib/atc/ExtrinsicModelTwoTemperature.cpp b/lib/atc/ExtrinsicModelTwoTemperature.cpp index 35846fe496..43c68577bb 100644 --- a/lib/atc/ExtrinsicModelTwoTemperature.cpp +++ b/lib/atc/ExtrinsicModelTwoTemperature.cpp @@ -28,7 +28,7 @@ namespace ATC { electronTimeIntegration_(TimeIntegrator::IMPLICIT), temperatureIntegrator_(nullptr), nsubcycle_(1), - exchangeFlag_(true), + exchangeFlag_(true), baseSize_(0) { physicsModel_ = new PhysicsModelTwoTemperature(matFileName); @@ -39,7 +39,7 @@ namespace ATC { rhsMaskIntrinsic_(TEMPERATURE,SOURCE) = true; atc_->fieldMask_(TEMPERATURE,EXTRINSIC_SOURCE) = true; } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -49,7 +49,7 @@ namespace ATC { } //-------------------------------------------------------- - // modify + // modify //-------------------------------------------------------- bool ExtrinsicModelTwoTemperature::modify(int narg, char **arg) { @@ -174,12 +174,12 @@ namespace ATC { else if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) { double alpha = 1; // backwards Euler temperatureIntegrator_ = new FieldImplicitEulerIntegrator( - ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_, + ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_, rhsMask, alpha); } else if (electronTimeIntegration_ == TimeIntegrator::EXPLICIT) { temperatureIntegrator_ = new FieldExplicitEulerIntegrator( - ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_, + ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_, rhsMask); } double dt = atc_->lammpsInterface_->dt(); @@ -267,18 +267,18 @@ namespace ATC { // output[1] = total electron energy // output[2] = average electron temperature - if (n == baseSize_) { + if (n == baseSize_) { Array mask(1); FIELD_MATS energy; mask(0) = ELECTRON_TEMPERATURE; - - (atc_->feEngine_)->compute_energy(mask, + + (atc_->feEngine_)->compute_energy(mask, atc_->fields(), physicsModel_, atc_->elementToMaterialMap_, energy); // convert to lammps energy units - double mvv2e = (atc_->lammps_interface())->mvv2e(); + double mvv2e = (atc_->lammps_interface())->mvv2e(); double electronEnergy = mvv2e * energy[ELECTRON_TEMPERATURE].col_sum(); value = electronEnergy; return true; @@ -288,7 +288,7 @@ namespace ATC { value = electronTemperature; return true; } - + return false; } diff --git a/lib/atc/ExtrinsicModelTwoTemperature.h b/lib/atc/ExtrinsicModelTwoTemperature.h index bf1979f400..0f89a5173e 100644 --- a/lib/atc/ExtrinsicModelTwoTemperature.h +++ b/lib/atc/ExtrinsicModelTwoTemperature.h @@ -25,7 +25,7 @@ namespace ATC { //-------------------------------------------------------- class ExtrinsicModelTwoTemperature : public ExtrinsicModel { - + public: // constructor @@ -50,7 +50,7 @@ namespace ATC { /** Add model-specific output data */ virtual void output(OUTPUT_LIST & outputData); - + /** set up LAMMPS display variables */ virtual int size_vector(int externalSize); diff --git a/lib/atc/FE_Element.cpp b/lib/atc/FE_Element.cpp index 299b9f191d..a57484299b 100644 --- a/lib/atc/FE_Element.cpp +++ b/lib/atc/FE_Element.cpp @@ -45,22 +45,22 @@ static const double localCoordinatesTolerance = 1.e-09; } int FE_Element::num_ips() const - { - return feInterpolate_->num_ips(); + { + return feInterpolate_->num_ips(); } int FE_Element::num_face_ips() const - { - return feInterpolate_->num_face_ips(); + { + return feInterpolate_->num_face_ips(); } - void FE_Element::face_coordinates(const DENS_MAT &eltCoords, + void FE_Element::face_coordinates(const DENS_MAT &eltCoords, const int faceID, DENS_MAT & faceCoords) const { faceCoords.reset(nSD_, numFaceNodes_); - for (int inode=0; inode < numFaceNodes_; inode++) + for (int inode=0; inode < numFaceNodes_; inode++) { int id = localFaceConn_(faceID,inode); for (int isd=0; isd 1.0) xiGuess(0) = 0.; if (fabs(xiGuess(1)) > 1.0) xiGuess(1) = 0.; if (fabs(xiGuess(2)) > 1.0) xiGuess(2) = 0.; - - // iteratively solve the equation by calculating the global + + // iteratively solve the equation by calculating the global // position of the guess and bringing the difference between it // and the actual global position of x to zero // @@ -127,12 +127,12 @@ static const double localCoordinatesTolerance = 1.e-09; while (count < localCoordinatesMaxIterations_) { feInterpolate_->compute_N_dNdr(xiGuess,N,dNdr); xGuess = N*eltCoordsT; - xDiff = xGuess-x; + xDiff = xGuess-x; // determine if the guess is close enough. // if it is, take it and run // if not, use Newton's method to update the guess - if (!dbl_geq(abs(xDiff(0)),tolerance_) && - !dbl_geq(abs(xDiff(1)),tolerance_) && + if (!dbl_geq(abs(xDiff(0)),tolerance_) && + !dbl_geq(abs(xDiff(1)),tolerance_) && !dbl_geq(abs(xDiff(2)),tolerance_)) { converged = true; xi = xiGuess; @@ -160,11 +160,11 @@ static const double localCoordinatesTolerance = 1.e-09; xi(i) = 2.0*(x(i)-min)/(max-min) - 1.0; } } - else if (projectionGuess_ == CENTROID_LINEARIZED) { + else if (projectionGuess_ == CENTROID_LINEARIZED) { DENS_VEC xi0(nSD_); xi0 = 0; DENS_VEC x0(nSD_), dx(nSD_); - centroid(eltCoords,x0); - dx = x - x0; + centroid(eltCoords,x0); + dx = x - x0; vector ts; ts.reserve(nSD_); tangents(eltCoords,xi0,ts); DENS_VEC & t1 = ts[0]; @@ -178,7 +178,7 @@ static const double localCoordinatesTolerance = 1.e-09; xi(1) = J2/J; xi(2) = J3/J; } - else if (projectionGuess_ == TWOD_ANALYTIC) { + else if (projectionGuess_ == TWOD_ANALYTIC) { // assume x-y planar and HEX8 double x0 = x(0), y0 = x(1); double X[4] = {eltCoords(0,0),eltCoords(0,1),eltCoords(0,2),eltCoords(0,3)}; @@ -194,13 +194,13 @@ static const double localCoordinatesTolerance = 1.e-09; xi1[0] = (4*x0 - X[0] + xi2[0]*X[0] - X[0] + xi2[0]*X[0] - X[0] - xi2[0]*X[0] - X[0] - xi2[0]*X[0])/(-X[0] + xi2[0]*X[0] + X[0] - xi2[0]*X[0] + X[0] + xi2[0]*X[0] - X[0] - xi2[0]*X[0]); xi1[1] = (4*x0 - X[0] + xi2[0]*X[0] - X[0] + xi2[0]*X[0] - X[0] - xi2[0]*X[0] - X[0] - xi2[0]*X[0])/(-X[0] + xi2[0]*X[0] + X[0] - xi2[0]*X[0] + X[0] + xi2[0]*X[0] - X[0] - xi2[0]*X[0]); // choose which one gives back x - xi(0) = xi1[0]; - xi(1) = xi2[0]; - xi(2) = 0; + xi(0) = xi1[0]; + xi(1) = xi2[0]; + xi(2) = 0; } } - + bool FE_Element::range_check(const DENS_MAT &eltCoords, const DENS_VEC &x) const { @@ -214,7 +214,7 @@ static const double localCoordinatesTolerance = 1.e-09; // ------------------------------------------------------------- - // Note: Only works for convex elements with planar faces with + // Note: Only works for convex elements with planar faces with // outward normals // ------------------------------------------------------------- bool FE_Element::contains_point(const DENS_MAT &eltCoords, @@ -229,7 +229,7 @@ static const double localCoordinatesTolerance = 1.e-09; bool inside = true; for (int faceID=0; faceIDface_normal(faceCoords, + feInterpolate_->face_normal(faceCoords, 0, normal); faceToPoint = x - column(faceCoords, 0); @@ -258,8 +258,8 @@ static const double localCoordinatesTolerance = 1.e-09; if (dbl_geq(eltCoords(dim,it),min)) { ++it; } else { - // set min to this node's coord in the specified dim, if it's - // smaller than the value previously stored + // set min to this node's coord in the specified dim, if it's + // smaller than the value previously stored min = eltCoords(dim,it); } } else { @@ -277,7 +277,7 @@ static const double localCoordinatesTolerance = 1.e-09; } } } - + // ------------------------------------------------------------- // shape_function calls should stay generic at all costs // ------------------------------------------------------------- @@ -306,7 +306,7 @@ static const double localCoordinatesTolerance = 1.e-09; local_coordinates(eltCoords, x, xi); feInterpolate_->shape_function(eltCoords, xi, N, dNdx); - } + } void FE_Element::shape_function_derivatives(const DENS_MAT eltCoords, const VECTOR &x, @@ -316,7 +316,7 @@ static const double localCoordinatesTolerance = 1.e-09; local_coordinates(eltCoords, x, xi); feInterpolate_->shape_function_derivatives(eltCoords, xi, dNdx); - } + } void FE_Element::shape_function(const DENS_MAT eltCoords, @@ -334,8 +334,8 @@ static const double localCoordinatesTolerance = 1.e-09; DIAG_MAT &weights) { DENS_MAT faceCoords; - face_coordinates(eltCoords, faceID, faceCoords); - + face_coordinates(eltCoords, faceID, faceCoords); + feInterpolate_->face_shape_function(eltCoords, faceCoords, faceID, N, n, weights); } @@ -348,8 +348,8 @@ static const double localCoordinatesTolerance = 1.e-09; DIAG_MAT &weights) { DENS_MAT faceCoords; - face_coordinates(eltCoords, faceID, faceCoords); - + face_coordinates(eltCoords, faceID, faceCoords); + feInterpolate_->face_shape_function(eltCoords, faceCoords, faceID, N, dN, Nn, weights); } @@ -357,7 +357,7 @@ static const double localCoordinatesTolerance = 1.e-09; double FE_Element::face_normal(const DENS_MAT &eltCoords, const int faceID, int ip, - DENS_VEC &normal) + DENS_VEC &normal) { DENS_MAT faceCoords; face_coordinates(eltCoords, faceID, faceCoords); @@ -373,12 +373,12 @@ static const double localCoordinatesTolerance = 1.e-09; { feInterpolate_->tangents(eltCoords,localCoords,tangents,normalize); } - - + + // ============================================================= // class FE_ElementHex // ============================================================= - FE_ElementHex::FE_ElementHex(int numNodes, + FE_ElementHex::FE_ElementHex(int numNodes, int numFaceNodes, int numNodes1d) : FE_Element(3, // number of spatial dimensions @@ -396,126 +396,126 @@ static const double localCoordinatesTolerance = 1.e-09; // / // / // z - + // Basic properties of element: vol_ = 8.0; faceArea_ = 4.0; - + // Order-specific information: if (numNodes != 8 && numNodes != 20 && numNodes != 27) { - throw ATC_Error("Unrecognized interpolation order specified " - "for element class: \n" - " element only knows how to construct lin " + throw ATC_Error("Unrecognized interpolation order specified " + "for element class: \n" + " element only knows how to construct lin " "and quad elements."); } localCoords_.resize(nSD_,numNodes_); localFaceConn_ = Array2D(numFaces_,numFaceNodes_); - + // Matrix of local nodal coordinates - localCoords_(0,0) = -1; localCoords_(0,4) = -1; - localCoords_(1,0) = -1; localCoords_(1,4) = -1; + localCoords_(0,0) = -1; localCoords_(0,4) = -1; + localCoords_(1,0) = -1; localCoords_(1,4) = -1; localCoords_(2,0) = -1; localCoords_(2,4) = 1; - // - localCoords_(0,1) = 1; localCoords_(0,5) = 1; - localCoords_(1,1) = -1; localCoords_(1,5) = -1; + // + localCoords_(0,1) = 1; localCoords_(0,5) = 1; + localCoords_(1,1) = -1; localCoords_(1,5) = -1; localCoords_(2,1) = -1; localCoords_(2,5) = 1; // - localCoords_(0,2) = 1; localCoords_(0,6) = 1; - localCoords_(1,2) = 1; localCoords_(1,6) = 1; + localCoords_(0,2) = 1; localCoords_(0,6) = 1; + localCoords_(1,2) = 1; localCoords_(1,6) = 1; localCoords_(2,2) = -1; localCoords_(2,6) = 1; // - localCoords_(0,3) = -1; localCoords_(0,7) = -1; - localCoords_(1,3) = 1; localCoords_(1,7) = 1; + localCoords_(0,3) = -1; localCoords_(0,7) = -1; + localCoords_(1,3) = 1; localCoords_(1,7) = 1; localCoords_(2,3) = -1; localCoords_(2,7) = 1; if (numNodes >= 20) { // only for quads - localCoords_(0,8) = 0; localCoords_(0,14) = 1; - localCoords_(1,8) = -1; localCoords_(1,14) = 1; + localCoords_(0,8) = 0; localCoords_(0,14) = 1; + localCoords_(1,8) = -1; localCoords_(1,14) = 1; localCoords_(2,8) = -1; localCoords_(2,14) = 0; - // - localCoords_(0,9) = 1; localCoords_(0,15) = -1; - localCoords_(1,9) = 0; localCoords_(1,15) = 1; + // + localCoords_(0,9) = 1; localCoords_(0,15) = -1; + localCoords_(1,9) = 0; localCoords_(1,15) = 1; localCoords_(2,9) = -1; localCoords_(2,15) = 0; // - localCoords_(0,10) = 0; localCoords_(0,16) = 0; - localCoords_(1,10) = 1; localCoords_(1,16) = -1; + localCoords_(0,10) = 0; localCoords_(0,16) = 0; + localCoords_(1,10) = 1; localCoords_(1,16) = -1; localCoords_(2,10) = -1; localCoords_(2,16) = 1; // - localCoords_(0,11) = -1; localCoords_(0,17) = 1; - localCoords_(1,11) = 0; localCoords_(1,17) = 0; + localCoords_(0,11) = -1; localCoords_(0,17) = 1; + localCoords_(1,11) = 0; localCoords_(1,17) = 0; localCoords_(2,11) = -1; localCoords_(2,17) = 1; // - localCoords_(0,12) = -1; localCoords_(0,18) = 0; - localCoords_(1,12) = -1; localCoords_(1,18) = 1; + localCoords_(0,12) = -1; localCoords_(0,18) = 0; + localCoords_(1,12) = -1; localCoords_(1,18) = 1; localCoords_(2,12) = 0; localCoords_(2,18) = 1; // - localCoords_(0,13) = 1; localCoords_(0,19) = -1; - localCoords_(1,13) = -1; localCoords_(1,19) = 0; + localCoords_(0,13) = 1; localCoords_(0,19) = -1; + localCoords_(1,13) = -1; localCoords_(1,19) = 0; localCoords_(2,13) = 0; localCoords_(2,19) = 1; if (numNodes >= 27) { // only for quads - localCoords_(0,20) = 0; localCoords_(0,24) = 1; - localCoords_(1,20) = 0; localCoords_(1,24) = 0; + localCoords_(0,20) = 0; localCoords_(0,24) = 1; + localCoords_(1,20) = 0; localCoords_(1,24) = 0; localCoords_(2,20) = 0; localCoords_(2,24) = 0; // - localCoords_(0,21) = 0; localCoords_(0,25) = 0; - localCoords_(1,21) = 0; localCoords_(1,25) = -1; + localCoords_(0,21) = 0; localCoords_(0,25) = 0; + localCoords_(1,21) = 0; localCoords_(1,25) = -1; localCoords_(2,21) = -1; localCoords_(2,25) = 0; // - localCoords_(0,22) = 0; localCoords_(0,26) = 0; - localCoords_(1,22) = 0; localCoords_(1,26) = 1; + localCoords_(0,22) = 0; localCoords_(0,26) = 0; + localCoords_(1,22) = 0; localCoords_(1,26) = 1; localCoords_(2,22) = 1; localCoords_(2,26) = 0; // - localCoords_(0,23) = -1; - localCoords_(1,23) = 0; + localCoords_(0,23) = -1; + localCoords_(1,23) = 0; localCoords_(2,23) = 0; } } // Matrix of local face connectivity // -x // +x - localFaceConn_(0,0) = 0; localFaceConn_(1,0) = 1; - localFaceConn_(0,1) = 4; localFaceConn_(1,1) = 2; - localFaceConn_(0,2) = 7; localFaceConn_(1,2) = 6; - localFaceConn_(0,3) = 3; localFaceConn_(1,3) = 5; + localFaceConn_(0,0) = 0; localFaceConn_(1,0) = 1; + localFaceConn_(0,1) = 4; localFaceConn_(1,1) = 2; + localFaceConn_(0,2) = 7; localFaceConn_(1,2) = 6; + localFaceConn_(0,3) = 3; localFaceConn_(1,3) = 5; if (numNodes >= 20) { - localFaceConn_(0,4) = 12; localFaceConn_(1,4) = 9; - localFaceConn_(0,5) = 19; localFaceConn_(1,5) = 14; - localFaceConn_(0,6) = 15; localFaceConn_(1,6) = 17; - localFaceConn_(0,7) = 11; localFaceConn_(1,7) = 13; + localFaceConn_(0,4) = 12; localFaceConn_(1,4) = 9; + localFaceConn_(0,5) = 19; localFaceConn_(1,5) = 14; + localFaceConn_(0,6) = 15; localFaceConn_(1,6) = 17; + localFaceConn_(0,7) = 11; localFaceConn_(1,7) = 13; if (numNodes >= 27) { localFaceConn_(0,8) = 23; localFaceConn_(1,8) = 24; } } // -y // +y - localFaceConn_(2,0) = 0; localFaceConn_(3,0) = 3; - localFaceConn_(2,1) = 1; localFaceConn_(3,1) = 7; - localFaceConn_(2,2) = 5; localFaceConn_(3,2) = 6; - localFaceConn_(2,3) = 4; localFaceConn_(3,3) = 2; + localFaceConn_(2,0) = 0; localFaceConn_(3,0) = 3; + localFaceConn_(2,1) = 1; localFaceConn_(3,1) = 7; + localFaceConn_(2,2) = 5; localFaceConn_(3,2) = 6; + localFaceConn_(2,3) = 4; localFaceConn_(3,3) = 2; if (numNodes >= 20) { - localFaceConn_(2,4) = 8; localFaceConn_(3,4) = 15; - localFaceConn_(2,5) = 13; localFaceConn_(3,5) = 18; - localFaceConn_(2,6) = 16; localFaceConn_(3,6) = 14; - localFaceConn_(2,7) = 12; localFaceConn_(3,7) = 10; + localFaceConn_(2,4) = 8; localFaceConn_(3,4) = 15; + localFaceConn_(2,5) = 13; localFaceConn_(3,5) = 18; + localFaceConn_(2,6) = 16; localFaceConn_(3,6) = 14; + localFaceConn_(2,7) = 12; localFaceConn_(3,7) = 10; if (numNodes >= 27) { localFaceConn_(2,8) = 25; localFaceConn_(3,8) = 26; } } - + // -z // +z - localFaceConn_(4,0) = 0; localFaceConn_(5,0) = 4; - localFaceConn_(4,1) = 3; localFaceConn_(5,1) = 5; - localFaceConn_(4,2) = 2; localFaceConn_(5,2) = 6; - localFaceConn_(4,3) = 1; localFaceConn_(5,3) = 7; + localFaceConn_(4,0) = 0; localFaceConn_(5,0) = 4; + localFaceConn_(4,1) = 3; localFaceConn_(5,1) = 5; + localFaceConn_(4,2) = 2; localFaceConn_(5,2) = 6; + localFaceConn_(4,3) = 1; localFaceConn_(5,3) = 7; if (numNodes >= 20) { - localFaceConn_(4,4) = 8; localFaceConn_(5,4) = 16; - localFaceConn_(4,5) = 11; localFaceConn_(5,5) = 17; - localFaceConn_(4,6) = 10; localFaceConn_(5,6) = 18; - localFaceConn_(4,7) = 9; localFaceConn_(5,7) = 19; + localFaceConn_(4,4) = 8; localFaceConn_(5,4) = 16; + localFaceConn_(4,5) = 11; localFaceConn_(5,5) = 17; + localFaceConn_(4,6) = 10; localFaceConn_(5,6) = 18; + localFaceConn_(4,7) = 9; localFaceConn_(5,7) = 19; if (numNodes >= 27) { localFaceConn_(4,8) = 21; localFaceConn_(5,8) = 22; } @@ -530,7 +530,7 @@ static const double localCoordinatesTolerance = 1.e-09; } // determine alignment and skewness to see which guess we should use - + } FE_ElementHex::~FE_ElementHex() @@ -538,18 +538,18 @@ static const double localCoordinatesTolerance = 1.e-09; // Handled by base class } - void FE_ElementHex::set_quadrature(FeIntQuadrature type) - { + void FE_ElementHex::set_quadrature(FeIntQuadrature type) + { feInterpolate_->set_quadrature(HEXA,type); } - + bool FE_ElementHex::contains_point(const DENS_MAT &eltCoords, const DENS_VEC &x) const { if (! range_check(eltCoords,x) ) return false; DENS_VEC xi; - bool converged = local_coordinates(eltCoords,x,xi); + bool converged = local_coordinates(eltCoords,x,xi); if (!converged) return false; for (int i=0; i r - // 0 1 + // 0 1 // // (This is as dictated by the EXODUSII standard.) // @@ -631,18 +631,18 @@ static const double localCoordinatesTolerance = 1.e-09; // Basic properties of element: vol_ = 1.0/6.0; // local volume faceArea_ = 1.0/2.0; - + // Order-specific information: if (numNodes != 4 && numNodes != 10) { - throw ATC_Error("Unrecognized interpolation order specified " - "for element class: \n" - " element only knows how to construct lin " + throw ATC_Error("Unrecognized interpolation order specified " + "for element class: \n" + " element only knows how to construct lin " "and quad elements."); } - + localCoords_.resize(nSD_+1, numNodes_); localFaceConn_ = Array2D(numFaces_,numFaceNodes_); - + // Matrix of local nodal coordinates // // Remember, there's actually another coordinate too (u), coming @@ -653,45 +653,45 @@ static const double localCoordinatesTolerance = 1.e-09; // // The first three axes correspond to x, y, and z (essentially), // for the canonical element. - + // Everyone gets these nodes... localCoords_(0,0) = 0; localCoords_(0,2) = 0; - localCoords_(1,0) = 0; localCoords_(1,2) = 1; + localCoords_(1,0) = 0; localCoords_(1,2) = 1; localCoords_(2,0) = 0; localCoords_(2,2) = 0; localCoords_(3,0) = 1; localCoords_(3,2) = 0; // - localCoords_(0,1) = 1; localCoords_(0,3) = 0; - localCoords_(1,1) = 0; localCoords_(1,3) = 0; - localCoords_(2,1) = 0; localCoords_(2,3) = 1; + localCoords_(0,1) = 1; localCoords_(0,3) = 0; + localCoords_(1,1) = 0; localCoords_(1,3) = 0; + localCoords_(2,1) = 0; localCoords_(2,3) = 1; localCoords_(3,1) = 0; localCoords_(3,3) = 0; if (numNodes >= 10) { // ...quads get even more! localCoords_(0,4) = 0.5; localCoords_(0,5) = 0.5; - localCoords_(1,4) = 0.0; localCoords_(1,5) = 0.5; + localCoords_(1,4) = 0.0; localCoords_(1,5) = 0.5; localCoords_(2,4) = 0.0; localCoords_(2,5) = 0.0; localCoords_(3,4) = 0.5; localCoords_(3,5) = 0.0; // - localCoords_(0,6) = 0.0; localCoords_(0,7) = 0.0; - localCoords_(1,6) = 0.5; localCoords_(1,7) = 0.0; - localCoords_(2,6) = 0.0; localCoords_(2,7) = 0.5; + localCoords_(0,6) = 0.0; localCoords_(0,7) = 0.0; + localCoords_(1,6) = 0.5; localCoords_(1,7) = 0.0; + localCoords_(2,6) = 0.0; localCoords_(2,7) = 0.5; localCoords_(3,6) = 0.5; localCoords_(3,7) = 0.5; // - localCoords_(0,8) = 0.5; localCoords_(0,9) = 0.0; - localCoords_(1,8) = 0.0; localCoords_(1,9) = 0.5; - localCoords_(2,8) = 0.5; localCoords_(2,9) = 0.5; + localCoords_(0,8) = 0.5; localCoords_(0,9) = 0.0; + localCoords_(1,8) = 0.0; localCoords_(1,9) = 0.5; + localCoords_(2,8) = 0.5; localCoords_(2,9) = 0.5; localCoords_(3,8) = 0.0; localCoords_(3,9) = 0.0; } - + // Matrix of local face connectivity: - // ...opposite point 0, ...opposite point 2, + // ...opposite point 0, ...opposite point 2, localFaceConn_(0,0) = 1; localFaceConn_(2,0) = 0; localFaceConn_(0,1) = 2; localFaceConn_(2,1) = 1; localFaceConn_(0,2) = 3; localFaceConn_(2,2) = 3; - + // ...opposite point 1, ...opposite point 3. - localFaceConn_(1,0) = 2; localFaceConn_(3,0) = 0; - localFaceConn_(1,1) = 0; localFaceConn_(3,1) = 2; - localFaceConn_(1,2) = 3; localFaceConn_(3,2) = 1; + localFaceConn_(1,0) = 2; localFaceConn_(3,0) = 0; + localFaceConn_(1,1) = 0; localFaceConn_(3,1) = 2; + localFaceConn_(1,2) = 3; localFaceConn_(3,2) = 1; feInterpolate_ = new FE_InterpolateSimpLin(this); } @@ -701,8 +701,8 @@ static const double localCoordinatesTolerance = 1.e-09; // Handled by base class } - void FE_ElementTet::set_quadrature(FeIntQuadrature type) - { + void FE_ElementTet::set_quadrature(FeIntQuadrature type) + { feInterpolate_->set_quadrature(TETRA,type); } diff --git a/lib/atc/FE_Element.h b/lib/atc/FE_Element.h index 8c4dbc844b..1150c90063 100644 --- a/lib/atc/FE_Element.h +++ b/lib/atc/FE_Element.h @@ -12,7 +12,7 @@ namespace ATC { enum ProjectionGuessType { - COORDINATE_ALIGNED=0, + COORDINATE_ALIGNED=0, CENTROID_LINEARIZED, TWOD_ANALYTIC}; @@ -23,23 +23,23 @@ namespace ATC { * @class FE_Element * @brief Base class for a finite element holding info for canonical element */ - + class FE_Element { - + public: - + /////////////////////////////////////////////////////////////////////////// // - // CONSTRUCTOR AND DESTRUCTOR + // CONSTRUCTOR AND DESTRUCTOR FE_Element(const int nSD, - int numFaces, + int numFaces, int numNodes, int numFaceNodes, int numNodes1d); virtual ~FE_Element(); - + /////////////////////////////////////////////////////////////////////////// // // GETTERS @@ -49,23 +49,23 @@ namespace ATC { /** get number of element nodes */ int num_elt_nodes() { return numNodes_; } - + /** get number of element nodes */ int num_elt_nodes_1d() { return numNodes1d_; } - + /** get number of faces */ int num_faces() { return numFaces_; } - + /** get number of face nodes */ int num_face_nodes() { return numFaceNodes_; } - + // Getters for FE_Interpoate to have access to coordinates and connectivity /** get canonical coordinates */ const DENS_MAT &local_coords() const { return localCoords_; } /** get canonical coordinates in 1d */ - DENS_VEC local_coords_1d() const; - + DENS_VEC local_coords_1d() const; + /** get canonical connectivity of nodes and faces */ const Array2D &local_face_conn() const { return localFaceConn_; } @@ -78,29 +78,29 @@ namespace ATC { // the following two are pass-throughs to the interpolate class, and // can thus only be declared in the class body (or else the // interpolate class is "incomplete" and cannot be referenced) - + /** get number of integration points */ int num_ips() const; /** get number of integration points */ int num_face_ips() const; - + /** order of interpolation */ - int order() const {return numNodes1d_;} + int order() const {return numNodes1d_;} /** compute the quadrature for a given element type */ - virtual void set_quadrature(FeIntQuadrature type) = 0; + virtual void set_quadrature(FeIntQuadrature type) = 0; /** return the set of 1d nodes that correspond to this node in 3d space */ void mapping(const int inode, std::vector &mapping) const; /** extract face coordinates from element coordinates */ - void face_coordinates(const DENS_MAT &eltCoords, + void face_coordinates(const DENS_MAT &eltCoords, const int faceID, DENS_MAT &faceCoords) const; - /** set initial guess type for point in element search */ - void set_projection_guess(ProjectionGuessType type) + /** set initial guess type for point in element search */ + void set_projection_guess(ProjectionGuessType type) { projectionGuess_ = type;} /////////////////////////////////////////////////////////////////////////// // @@ -122,7 +122,7 @@ namespace ATC { /** check if element bounding box contains the given point */ bool range_check(const DENS_MAT &eltCoords, const DENS_VEC & x) const; - /** get the min and max coordinate of any point in an element in a + /** get the min and max coordinate of any point in an element in a * dimension */ void bounds_in_dim(const DENS_MAT &eltCoords, const int dim, double &min, double &max) const; @@ -133,7 +133,7 @@ namespace ATC { virtual void shape_function(const VECTOR & xi, DENS_VEC &N) const; - /** + /** * compute shape functions at all ip's: * indexed: N(ip,node) * dN[nsd](ip,node) @@ -141,11 +141,11 @@ namespace ATC { */ virtual void shape_function(const DENS_MAT eltCoords, DENS_MAT &N, - std::vector &dN, + std::vector &dN, DIAG_MAT &weights); - /** - * compute shape functions and derivatives at a single point, + /** + * compute shape functions and derivatives at a single point, * given the point and the element that contains it * indexed: N(node) */ @@ -153,8 +153,8 @@ namespace ATC { const VECTOR &x, DENS_VEC &N); - /** - * compute shape functions and derivatives at a single point, + /** + * compute shape functions and derivatives at a single point, * given the point and the element that contains it * indexed: N(node) * dNdx(ip,nSD) @@ -164,17 +164,17 @@ namespace ATC { DENS_VEC &N, DENS_MAT &dNdx); - /** - * compute shape functions and derivatives at a single point, + /** + * compute shape functions and derivatives at a single point, * given the point and the element that contains it - * indexed: + * indexed: * dNdx(ip,nSD) */ virtual void shape_function_derivatives(const DENS_MAT eltCoords, const VECTOR &x, DENS_MAT &dNdx); - /** + /** * compute shape functions at all face ip's: * indexed: N(ip,node) * n[nsd](ip,node) @@ -186,7 +186,7 @@ namespace ATC { DENS_MAT &n, DIAG_MAT &weights); - /** + /** * compute shape functions at all face ip's: * indexed: N(ip,node) * dN[nsd](ip,node) @@ -200,32 +200,32 @@ namespace ATC { std::vector &Nn, DIAG_MAT &weights); - /** + /** * compute normal vector from the specified face * indexed: normal(nSD) */ virtual double face_normal(const DENS_MAT &eltCoords, const int faceID, int ip, - DENS_VEC &normal); - - /** + DENS_VEC &normal); + + /** * compute tangents to local coordinates - * indexed: + * indexed: */ virtual void tangents(const DENS_MAT &eltCoords, const DENS_VEC &x, std::vector & tangents, - const bool normalize=false) const; + const bool normalize=false) const; protected: /////////////////////////////////////////////////////////////////////////// // // HELPERS - - /** - * generate the appropriate interpolation class + + /** + * generate the appropriate interpolation class */ FE_Interpolate *interpolate_factory(std::string interpolateType); @@ -233,11 +233,11 @@ namespace ATC { virtual void initial_local_coordinates(const DENS_MAT &eltCoords, const DENS_VEC &x, DENS_VEC &xiInitial) const; - + /////////////////////////////////////////////////////////////////////////// // // PROTECTED MEMBERS - + // Currently used interpolation class FE_Interpolate *feInterpolate_; @@ -251,7 +251,7 @@ namespace ATC { // Number of face nodes int numFaceNodes_; // Number of nodes in one dimension - int numNodes1d_; + int numNodes1d_; // local coords of nodes: localCoords_(isd, ip) @@ -269,7 +269,7 @@ namespace ATC { /** tolerance used in solving Newton's method for local coordinates */ double tolerance_; ProjectionGuessType projectionGuess_; - + }; @@ -290,7 +290,7 @@ namespace ATC { ~FE_ElementHex(); - void set_quadrature(FeIntQuadrature type); + void set_quadrature(FeIntQuadrature type); bool contains_point(const DENS_MAT &eltCoords, const DENS_VEC &x) const; @@ -312,7 +312,7 @@ namespace ATC { void write_restart(FILE *); ~FE_ElementRect(); - + bool local_coordinates(const DENS_MAT &eltCoords, const DENS_VEC &x, DENS_VEC &xi) const; @@ -320,7 +320,7 @@ namespace ATC { protected: virtual bool contains_point(const DENS_MAT &eltCoords, const DENS_VEC &x) const; - + }; @@ -338,10 +338,10 @@ namespace ATC { // Dump state info to disk for later restart (unimplemented) void write_restart(FILE *); - + ~FE_ElementTet(); - void set_quadrature(FeIntQuadrature type); + void set_quadrature(FeIntQuadrature type); bool local_coordinates(const DENS_MAT &eltCoords, const DENS_VEC &x, diff --git a/lib/atc/FE_Engine.cpp b/lib/atc/FE_Engine.cpp index 9e3c5180e2..fc07b5e638 100644 --- a/lib/atc/FE_Engine.cpp +++ b/lib/atc/FE_Engine.cpp @@ -38,14 +38,14 @@ namespace ATC{ { // Nothing to do here } - + //----------------------------------------------------------------- FE_Engine::~FE_Engine() { if (feMesh_) delete feMesh_; } //----------------------------------------------------------------- - + void FE_Engine::initialize() { if (!feMesh_) throw ATC_Error("FE_Engine has no mesh"); @@ -59,7 +59,7 @@ namespace ATC{ nElems_ = feMesh_->num_elements(); nNodesUnique_ = feMesh_->num_nodes_unique(); nNodes_ = feMesh_->num_nodes(); - + // arrays & matrices _weights_.reset(nIPsPerElement_,nIPsPerElement_); _N_.reset(nIPsPerElement_,nNodesPerElement_); @@ -69,13 +69,13 @@ namespace ATC{ _Bfluxes_.assign(nSD_, DENS_MAT()); // faces _fweights_.reset(nIPsPerElement_,nIPsPerElement_); - _fN_.reset(nIPsPerFace_,nNodesPerElement_); + _fN_.reset(nIPsPerFace_,nNodesPerElement_); _fdN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_)); _nN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_)); // remove specified elements if (nullElements_.size() > 0) delete_elements(nullElements_); - + initialized_ = true; } } @@ -84,8 +84,8 @@ namespace ATC{ { if (is_partitioned()) return; - feMesh_->partition_mesh(); - + feMesh_->partition_mesh(); + // now do all FE_Engine data structure partitioning // partition nullElements_ @@ -115,7 +115,7 @@ namespace ATC{ int nIPsPerElement_new = feMesh_->num_ips_per_element(); int nIPsPerFace_new = feMesh_->num_ips_per_face(); - + if (nIPsPerElement_ != nIPsPerElement_new) { // arrays & matrices nIPsPerElement_ = nIPsPerElement_new; @@ -129,11 +129,11 @@ namespace ATC{ // faces nIPsPerFace_ = nIPsPerFace_new; _fweights_.reset(nIPsPerElement_,nIPsPerElement_); - _fN_.reset(nIPsPerFace_,nNodesPerElement_); + _fN_.reset(nIPsPerFace_,nNodesPerElement_); _fdN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_)); _nN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_)); } - + } //----------------------------------------------------------------- @@ -142,7 +142,7 @@ namespace ATC{ bool match = false; /*! \page man_mesh_create fix_modify AtC mesh create \section syntax - fix_modify AtC mesh create + fix_modify AtC mesh create \n - nx ny nz = number of elements in x, y, z - region-id = id of region that is to be meshed @@ -156,11 +156,11 @@ namespace ATC{ \section related \ref man_mesh_quadrature \section default - When created, mesh defaults to gauss2 (2-point Gaussian) quadrature. + When created, mesh defaults to gauss2 (2-point Gaussian) quadrature. Use "mesh quadrature" command to change quadrature style. */ int argIdx = 0; - if (strcmp(arg[argIdx],"mesh")==0) { + if (strcmp(arg[argIdx],"mesh")==0) { argIdx++; // create mesh if (strcmp(arg[argIdx],"create")==0) { @@ -172,7 +172,7 @@ namespace ATC{ string box = arg[argIdx++]; Array periodicity(3); - periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false; + periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false; periodicity(1) = (strcmp(arg[argIdx++],"p")==0) ? true : false; periodicity(2) = (strcmp(arg[argIdx++],"p")==0) ? true : false; @@ -214,7 +214,7 @@ namespace ATC{ \section related \ref man_mesh_create \section default - none + none */ else if (strcmp(arg[argIdx],"quadrature")==0) { argIdx++; @@ -223,30 +223,30 @@ namespace ATC{ set_quadrature(quadEnum); match = true; } - /*! \page man_mesh_read fix_modify AtC mesh read + /*! \page man_mesh_read fix_modify AtC mesh read \section syntax - fix_modify AtC mesh read - - filename = name of file containing mesh to be read + fix_modify AtC mesh read + - filename = name of file containing mesh to be read - f p p = periodicity flags for x, y, z \section examples fix_modify AtC mesh read myComponent.mesh p p p \n fix_modify AtC mesh read myOtherComponent.exo \section description Reads a mesh from a text or exodus file, and assigns periodic - boundary conditions if needed. + boundary conditions if needed. \section restrictions \section related \section default - periodicity flags are false by default + periodicity flags are false by default */ else if (strcmp(arg[argIdx],"read")==0) { argIdx++; string meshFile = arg[argIdx++]; - + Array periodicity(3); periodicity = false; if (argIdx < narg) { - periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false; + periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false; periodicity(1) = (strcmp(arg[argIdx++],"p")==0) ? true : false; periodicity(2) = (strcmp(arg[argIdx++],"p")==0) ? true : false; } @@ -254,7 +254,7 @@ namespace ATC{ if (periodicity(0) || periodicity(1) || periodicity(2)) { meshFile = "periodic_"+meshFile; - stringstream ss; + stringstream ss; ss << "writing periodicity corrected mesh: " << meshFile; print_msg(communicator_,ss.str()); feMesh_->write_mesh(meshFile); @@ -262,14 +262,14 @@ namespace ATC{ } match = true; } - /*! \page man_mesh_write fix_modify AtC mesh write + /*! \page man_mesh_write fix_modify AtC mesh write \section syntax - fix_modify AtC mesh write + fix_modify AtC mesh write - filename = name of file to write mesh \section examples fix_modify AtC mesh write myMesh.mesh \n \section description - Writes a mesh to a text file. + Writes a mesh to a text file. \section restrictions \section related \section default @@ -337,26 +337,26 @@ namespace ATC{ return match; } //----------------------------------------------------------------- - void FE_Engine::parse_partitions(int & argIdx, int narg, char ** arg, + void FE_Engine::parse_partitions(int & argIdx, int narg, char ** arg, int idof, Array & dx ) const { - double x[3] = {0,0,0}; + double x[3] = {0,0,0}; int nx = dx.size(); // parse relative values for each element if (is_numeric(arg[argIdx])) { - for (int i = 0; i < nx; ++i) { + for (int i = 0; i < nx; ++i) { if (is_numeric(arg[argIdx])) { dx(i) = atof(arg[argIdx++]); } else throw ATC_Error("not enough element partitions"); } } // each segment of the piecewise function is length-normalized separately - else if (strcmp(arg[argIdx],"position-number-density")==0) { + else if (strcmp(arg[argIdx],"position-number-density")==0) { argIdx++; double *y = new double[nx]; double *w = new double[nx]; int *n = new int[nx]; int nn = 0; - while (argIdx < narg) { + while (argIdx < narg) { if (! is_numeric(arg[argIdx])) break; y[nn] = atof(arg[argIdx++]); n[nn] = atoi(arg[argIdx++]); @@ -364,7 +364,7 @@ namespace ATC{ } if (n[nn-1] != nx) throw ATC_Error("total element partitions do not match"); int k = 0; - for (int i = 1; i < nn; ++i) { + for (int i = 1; i < nn; ++i) { int dn = n[i]-n[i-1]; double dy = y[i]-y[i-1]; double w0 = w[i-1]; @@ -372,7 +372,7 @@ namespace ATC{ double lx = 0; double *l = new double[dn]; for (int j = 0; j < dn; ++j) { - double x = (j+0.5)/dn; + double x = (j+0.5)/dn; double dl = w0+x*dw; lx += dl; l[j]= dl; @@ -392,11 +392,11 @@ namespace ATC{ else { XT_Function * f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx); argIdx++; - while (argIdx < narg) { + while (argIdx < narg) { if (! is_numeric(arg[argIdx++])) break; } - for (int i = 0; i < nx; ++i) { - x[idof] = (i+0.5)/nx; dx(i) = f->f(x,0.); + for (int i = 0; i < nx; ++i) { + x[idof] = (i+0.5)/nx; dx(i) = f->f(x,0.); } } } @@ -416,13 +416,13 @@ namespace ATC{ outputManager_.initialize(outputPrefix, otypes); if (!feMesh_) throw ATC_Error("output needs mesh"); if (!initialized_) initialize(); - if (!feMesh_->coordinates() || !feMesh_->connectivity()) + if (!feMesh_->coordinates() || !feMesh_->connectivity()) throw ATC_Error("output mesh not properly initialized"); - if (!feMesh_->coordinates()->nCols() || - !feMesh_->connectivity()->nCols()) + if (!feMesh_->coordinates()->nCols() || + !feMesh_->connectivity()->nCols()) throw ATC_Error("output mesh is empty"); - if (rank == 0) - outputManager_.write_geometry(feMesh_->coordinates(), + if (rank == 0) + outputManager_.write_geometry(feMesh_->coordinates(), feMesh_->connectivity()); outputManager_.print_custom_names(); } @@ -432,15 +432,15 @@ namespace ATC{ //----------------------------------------------------------------- void FE_Engine::write_geometry(void) { - outputManager_.write_geometry(feMesh_->coordinates(), + outputManager_.write_geometry(feMesh_->coordinates(), feMesh_->connectivity()); } // ------------------------------------------------------------- - // write data + // write data // ------------------------------------------------------------- - void FE_Engine::write_data(double time, - FIELDS &soln, + void FE_Engine::write_data(double time, + FIELDS &soln, OUTPUT_LIST *data) { outputManager_.write_data( @@ -449,12 +449,12 @@ namespace ATC{ } // ------------------------------------------------------------- - // write data + // write data // ------------------------------------------------------------- void FE_Engine::write_data(double time, OUTPUT_LIST *data) { outputManager_.write_data( - time, data, + time, data, feMesh_->node_map()->data()); } @@ -469,7 +469,7 @@ namespace ATC{ // ------------------------------------------------------------- // amend mesh for cut at specified faces // ------------------------------------------------------------- - void FE_Engine::cut_mesh(const set &faceSet, + void FE_Engine::cut_mesh(const set &faceSet, const set &nodeSet) { feMesh_->cut_mesh(faceSet,nodeSet); @@ -523,7 +523,7 @@ namespace ATC{ DENS_MAT &vP = fieldsAtIPs[_fieldName_]; // gradients of field at integration points -> to be computed DENS_MAT_VEC &dvP = gradFieldsAtIPs[_fieldName_]; - + if (_fieldName_ == ELECTRON_WAVEFUNCTION_ENERGIES ) { vP = vI; continue; @@ -543,7 +543,7 @@ namespace ATC{ } } // ------------------------------------------------------------- - // interpolate fields + // interpolate fields // Currently, this function will break if called with an unowned ielem. // Currently, this function is only called with owned ielems. // ------------------------------------------------------------- @@ -570,7 +570,7 @@ namespace ATC{ DENS_MAT &vP = fieldsAtIPs[_fieldName_]; // field values at element nodes DENS_MAT &vIe = localElementFields[_fieldName_]; - + if (_fieldName_ == ELECTRON_WAVEFUNCTION_ENERGIES ) { vP = vI; continue; @@ -587,13 +587,13 @@ namespace ATC{ } // ------------------------------------------------------------- - // compute dimensionless stiffness matrix using native quadrature + // compute dimensionless stiffness matrix using native quadrature // ------------------------------------------------------------- void FE_Engine::stiffness_matrix(SPAR_MAT &matrix) const { - // assemble consistent mass + // assemble consistent mass matrix.reset(nNodesUnique_,nNodesUnique_);// zero since partial fill - DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); + DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); vector myElems = feMesh_->owned_elts(); for (vector::iterator elemsIter = myElems.begin(); @@ -604,16 +604,16 @@ namespace ATC{ // evaluate shape functions feMesh_->shape_function(ielem, _N_, _dN_, _weights_); // _N_ unused // perform quadrature - elementMassMatrix = _dN_[0].transMat(_weights_*_dN_[0]); + elementMassMatrix = _dN_[0].transMat(_weights_*_dN_[0]); for (int i = 1; i < nSD_; ++i) { - elementMassMatrix += _dN_[i].transMat(_weights_*_dN_[i]); + elementMassMatrix += _dN_[i].transMat(_weights_*_dN_[i]); } // get connectivity _conn_ = feMesh_->element_connectivity_unique(ielem); - for (int i = 0; i < nNodesPerElement_; ++i) + for (int i = 0; i < nNodesPerElement_; ++i) { int inode = _conn_(i); - for (int j = 0; j < nNodesPerElement_; ++j) + for (int j = 0; j < nNodesPerElement_; ++j) { int jnode = _conn_(j); matrix.add(inode, jnode, elementMassMatrix(i,j)); @@ -646,7 +646,7 @@ namespace ATC{ FieldName colField = row_col.second; bool BB = rhsMask(rowField,FLUX); bool NN = rhsMask(rowField,SOURCE); - DENS_MAT elementMatrix(nNodesPerElement_,nNodesPerElement_); + DENS_MAT elementMatrix(nNodesPerElement_,nNodesPerElement_); DENS_MAT coefsAtIPs; vector myElems = feMesh_->owned_elts(); @@ -663,20 +663,20 @@ namespace ATC{ // interpolate fields and gradients (nonlinear only) interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_, _fieldsAtIPs_,_gradFieldsAtIPs_); - + // evaluate Physics model - + if (! (physicsModel->null(rowField,imat)) ) { - if (BB && physicsModel->weak_equation(rowField)-> + if (BB && physicsModel->weak_equation(rowField)-> has_BB_tangent_coefficients() ) { physicsModel->weak_equation(rowField)-> BB_tangent_coefficients(colField, _fieldsAtIPs_, mat, coefsAtIPs); - DIAG_MAT D(column(coefsAtIPs,0)); + DIAG_MAT D(column(coefsAtIPs,0)); D = _weights_*D; elementMatrix = _dN_[0].transMat(D*_dN_[0]); for (int i = 1; i < nSD_; i++) { elementMatrix += _dN_[i].transMat(D*_dN_[i]); - } + } } else { elementMatrix.reset(nNodesPerElement_,nNodesPerElement_); @@ -685,29 +685,29 @@ namespace ATC{ has_NN_tangent_coefficients() ) { physicsModel->weak_equation(rowField)-> NN_tangent_coefficients(colField, _fieldsAtIPs_, mat, coefsAtIPs); - DIAG_MAT D(column(coefsAtIPs,0)); + DIAG_MAT D(column(coefsAtIPs,0)); D = _weights_*D; elementMatrix += _N_.transMat(D*_N_); } // assemble - for (int i = 0; i < nNodesPerElement_; ++i) - { - int inode = _conn_(i); + for (int i = 0; i < nNodesPerElement_; ++i) + { + int inode = _conn_(i); for (int j = 0; j < nNodesPerElement_; ++j) { int jnode = _conn_(j); tangent.add(inode, jnode, elementMatrix(i,j)); } - } + } } - } + } #ifdef ISOLATE_FE sparse_allsum(communicator_,tangent); #else LammpsInterface::instance()->sparse_allsum(tangent); #endif - tangent.compress(); - } + tangent.compress(); + } // ------------------------------------------------------------- // compute tangent using given quadrature for one (field,field) pair @@ -733,7 +733,7 @@ namespace ATC{ int nips = weights.nCols(); if (nips>0) { // compute fields and gradients of fields at given ips - + GRAD_FIELD_MATS gradFieldsAtIPs; FIELD_MATS fieldsAtIPs; for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) { @@ -755,11 +755,11 @@ namespace ATC{ if ( indices.size() > 0) atomMatls++; } bool singleMaterial = ( atomMatls == 1 ); - + if (! singleMaterial ) throw ATC_Error("FE_Engine::compute_tangent_matrix-given quadrature can not handle multiple atom material currently"); if (singleMaterial) { - int imat = 0; + int imat = 0; const Material * mat = physicsModel->material(imat); // evaluate Physics model if (! (physicsModel->null(rowField,imat)) ) { @@ -767,18 +767,18 @@ namespace ATC{ has_BB_tangent_coefficients() ) { physicsModel->weak_equation(rowField)-> BB_tangent_coefficients(colField, fieldsAtIPs, mat, coefsAtIPs); - DIAG_MAT D(column(coefsAtIPs,0)); + DIAG_MAT D(column(coefsAtIPs,0)); D = weights*D; K = (*dN[0]).transMat(D*(*dN[0])); for (int i = 1; i < nSD_; i++) { K += (*dN[i]).transMat(D*(*dN[i])); - } + } } if (NN && physicsModel->weak_equation(rowField)-> has_NN_tangent_coefficients() ) { physicsModel->weak_equation(rowField)-> NN_tangent_coefficients(colField, fieldsAtIPs, mat, coefsAtIPs); - DIAG_MAT D(column(coefsAtIPs,0)); + DIAG_MAT D(column(coefsAtIPs,0)); D = weights*D; K += N.transMat(D*N); } @@ -786,13 +786,13 @@ namespace ATC{ } } // share information between processors - int count = nn*nn; + int count = nn*nn; DENS_MAT K_sum(nn,nn); allsum(communicator_, K.ptr(), K_sum.ptr(), count); // create sparse from dense tangent.reset(K_sum,tol_sparse); tangent.compress(); - } + } // ------------------------------------------------------------- // compute a consistent mass matrix for native quadrature @@ -802,16 +802,16 @@ namespace ATC{ const FIELDS &fields, const PhysicsModel * physicsModel, const Array & elementMaterials, - + CON_MASS_MATS & massMatrices, const DenseMatrix *elementMask) const { int nfields = field_mask.size(); vector usedFields; - - DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); - + + DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); + // (JAT, 04/21/11) FIX THIS DENS_MAT capacity; @@ -819,7 +819,7 @@ namespace ATC{ for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); SPAR_MAT & M = massMatrices[_fieldName_].set_quantity(); - + // compresses 2May11 if (M.has_template()) { M = 0; } else { M.reset(nNodesUnique_,nNodesUnique_); } @@ -828,12 +828,12 @@ namespace ATC{ // element wise assembly vector myElems = feMesh_->owned_elts(); - for (vector::iterator elemsIter = myElems.begin(); + for (vector::iterator elemsIter = myElems.begin(); elemsIter != myElems.end(); - ++elemsIter) + ++elemsIter) { int ielem = *elemsIter; - // if element is masked, skip + // if element is masked, skip if (elementMask && !(*elementMask)(ielem,0)) continue; // material id int imat = elementMaterials(ielem); @@ -847,11 +847,11 @@ namespace ATC{ if (! (physicsModel->null(_fieldName_,imat)) ) { physicsModel->weak_equation(_fieldName_)-> M_integrand(_fieldsAtIPs_, mat, capacity); - DIAG_MAT rho(column(capacity,0)); + DIAG_MAT rho(column(capacity,0)); elementMassMatrix = _N_.transMat(_weights_*rho*_N_); // assemble - for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + for (int i = 0; i < nNodesPerElement_; ++i) { + int inode = _conn_(i); for (int j = 0; j < nNodesPerElement_; ++j) { int jnode = _conn_(j); M.add(inode, jnode, elementMassMatrix(i,j)); @@ -873,27 +873,27 @@ namespace ATC{ // fix zero diagonal entries due to null material elements for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); - - SPAR_MAT & M = massMatrices[_fieldName_].set_quantity(); + + SPAR_MAT & M = massMatrices[_fieldName_].set_quantity(); for (int inode = 0; inode < nNodesUnique_; ++inode) { if (! M.has_entry(inode,inode)) { - M.set(inode,inode,1.0); - } + M.set(inode,inode,1.0); + } } M.compress(); } - } + } // ------------------------------------------------------------- - // compute dimensionless consistent mass using native quadrature + // compute dimensionless consistent mass using native quadrature // ------------------------------------------------------------- void FE_Engine::compute_mass_matrix(SPAR_MAT &massMatrix) const { // assemble nnodes X nnodes matrix massMatrix.reset(nNodesUnique_,nNodesUnique_);// zero since partial fill - DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); + DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_); vector myElems = feMesh_->owned_elts(); for (vector::iterator elemsIter = myElems.begin(); elemsIter != myElems.end(); @@ -903,7 +903,7 @@ namespace ATC{ // evaluate shape functions feMesh_->shape_function(ielem, _N_, _weights_); // perform quadrature - elementMassMatrix = _N_.transMat(_weights_*_N_); + elementMassMatrix = _N_.transMat(_weights_*_N_); // get connectivity _conn_ = feMesh_->element_connectivity_unique(ielem); for (int i = 0; i < nNodesPerElement_; ++i) { @@ -932,9 +932,9 @@ namespace ATC{ int nn = N.nCols(); int nips = N.nRows(); DENS_MAT tmp_mass_matrix_local(nn,nn), tmp_mass_matrix(nn,nn); - if (nips>0) { tmp_mass_matrix_local = N.transMat(weights*N); } + if (nips>0) { tmp_mass_matrix_local = N.transMat(weights*N); } // share information between processors - int count = nn*nn; + int count = nn*nn; allsum(communicator_, tmp_mass_matrix_local.ptr(), tmp_mass_matrix.ptr(), count); @@ -943,12 +943,12 @@ namespace ATC{ } // ------------------------------------------------------------- - // compute dimensionless lumped mass using native quadrature + // compute dimensionless lumped mass using native quadrature // ------------------------------------------------------------- void FE_Engine::compute_lumped_mass_matrix(DIAG_MAT & M) const { M.reset(nNodesUnique_,nNodesUnique_); // zero since partial fill - // assemble lumped diagonal mass + // assemble lumped diagonal mass DENS_VEC Nvec(nNodesPerElement_); vector myElems = feMesh_->owned_elts(); for (vector::iterator elemsIter = myElems.begin(); @@ -972,7 +972,7 @@ namespace ATC{ } // ------------------------------------------------------------- - // compute physical lumped mass using native quadrature + // compute physical lumped mass using native quadrature // ------------------------------------------------------------- void FE_Engine::compute_lumped_mass_matrix( const Array& field_mask, @@ -984,9 +984,9 @@ namespace ATC{ { int nfields = field_mask.size(); // zero initialize for assembly - for (int j = 0; j < nfields; ++j) { + for (int j = 0; j < nfields; ++j) { DIAG_MAT & M = massMatrices[field_mask(j)].set_quantity(); - M.reset(nNodesUnique_,nNodesUnique_); + M.reset(nNodesUnique_,nNodesUnique_); } // assemble diagonal matrix vector myElems = feMesh_->owned_elts(); @@ -1005,13 +1005,13 @@ namespace ATC{ DENS_MAT capacity; for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); - if (! physicsModel->null(_fieldName_,imat)) { + if (! physicsModel->null(_fieldName_,imat)) { physicsModel->weak_equation(_fieldName_)-> M_integrand(_fieldsAtIPs_, mat, capacity); _Nmat_ = _N_.transMat(_weights_*capacity); DIAG_MAT & M = massMatrices[_fieldName_].set_quantity(); for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + int inode = _conn_(i); M(inode,inode) += _Nmat_(i,0); } @@ -1030,24 +1030,24 @@ namespace ATC{ for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); DIAG_MAT & M = massMatrices[_fieldName_].set_quantity(); - if (M(inode,inode) == 0.0) { - M(inode,inode) = 1.0; + if (M(inode,inode) == 0.0) { + M(inode,inode) = 1.0; } } } } // ------------------------------------------------------------- - // compute physical lumped mass using given quadrature + // compute physical lumped mass using given quadrature // ------------------------------------------------------------- void FE_Engine::compute_lumped_mass_matrix( - const Array &field_mask, + const Array &field_mask, const FIELDS &fields, const PhysicsModel * physicsModel, const Array > & pointMaterialGroups, - const DIAG_MAT &weights, + const DIAG_MAT &weights, const SPAR_MAT &N, - MASS_MATS &M) const // mass matrices + MASS_MATS &M) const // mass matrices { int nips = weights.nCols(); int nfields = field_mask.size(); @@ -1058,7 +1058,7 @@ namespace ATC{ M_local[_fieldName_].reset(nNodesUnique_,nNodesUnique_); M[_fieldName_].reset(nNodesUnique_,nNodesUnique_); } - + if (nips>0) { // compute fields at given ips // compute all fields since we don't the capacities dependencies @@ -1070,7 +1070,7 @@ namespace ATC{ fieldsAtIPs[_fieldName_].reset(nips,dof); fieldsAtIPs[_fieldName_] = N*field; } - + // treat single material point sets specially int nMatls = pointMaterialGroups.size(); int atomMatls = 0; @@ -1090,7 +1090,7 @@ namespace ATC{ stringstream ss; ss << " WARNING: multiple materials in atomic region"; print_msg(communicator_,ss.str()); } - + // setup data structures FIELD_MATS capacities; // evaluate physics model & compute capacity|density for requested fields @@ -1104,8 +1104,8 @@ namespace ATC{ const FIELD & f = (fields.find(_fieldName_))->second; capacities[_fieldName_].reset(f.nRows(),f.nCols()); capacities[_fieldName_] = 1.; - - } + + } else { physicsModel->weak_equation(_fieldName_)-> M_integrand(fieldsAtIPs, mat, capacities[_fieldName_]); @@ -1133,7 +1133,7 @@ namespace ATC{ for (set::const_iterator iter=indices.begin(); iter != indices.end(); iter++, i++ ) { for (int dof = 0; dof < ndof; ++dof) { - fieldsGroup[_fieldName_](i,dof) + fieldsGroup[_fieldName_](i,dof) = fieldsAtIPs[_fieldName_](*iter,dof); } } @@ -1145,7 +1145,7 @@ namespace ATC{ const FIELD & f = (fields.find(_fieldName_))->second; groupCapacities[_fieldName_].reset(f.nRows(),f.nCols()); groupCapacities[_fieldName_] = 1.; - } + } else { physicsModel->weak_equation(_fieldName_)-> M_integrand(fieldsGroup, mat, groupCapacities[_fieldName_]); @@ -1153,14 +1153,14 @@ namespace ATC{ int i = 0; for (set::const_iterator iter=indices.begin(); iter != indices.end(); iter++, i++ ) { - capacities[_fieldName_](*iter,0) + capacities[_fieldName_](*iter,0) = groupCapacities[_fieldName_](i,0); } } } } } - + // integrate & assemble for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); @@ -1168,7 +1168,7 @@ namespace ATC{ column(N.transMat(weights*capacities[_fieldName_]),0) ); } } - + // Share information between processors for (int j = 0; j < nfields; ++j) { _fieldName_ = field_mask(j); @@ -1177,16 +1177,16 @@ namespace ATC{ allsum(communicator_, M_local[_fieldName_].ptr(), myMassMat.ptr(), count); } } - + //----------------------------------------------------------------- // compute assembled average gradient evaluated at the nodes //----------------------------------------------------------------- void FE_Engine::compute_gradient_matrix(SPAR_MAT_VEC & grad_matrix) const { // zero - DENS_MAT_VEC tmp_grad_matrix(nSD_); + DENS_MAT_VEC tmp_grad_matrix(nSD_); for (int i = 0; i < nSD_; i++) { - tmp_grad_matrix[i].reset(nNodesUnique_,nNodesUnique_); + tmp_grad_matrix[i].reset(nNodesUnique_,nNodesUnique_); } // element wise assembly Array count(nNodesUnique_); count = 0; @@ -1202,7 +1202,7 @@ namespace ATC{ // get connectivity _conn_ = feMesh_->element_connectivity_unique(ielem); for (int j = 0; j < nIPsPerElement_; ++j) { - int jnode = _conn_(j); + int jnode = _conn_(j); count(jnode) += 1; for (int i = 0; i < nNodesPerElement_; ++i) { int inode = _conn_(i); @@ -1265,7 +1265,7 @@ namespace ATC{ const Material * mat = physicsModel->material(imat); interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_, _fieldsAtIPs_,_gradFieldsAtIPs_); - + // assemble for (int n = 0; n < mask.size(); n++) { _fieldName_ = mask(n); @@ -1276,8 +1276,8 @@ namespace ATC{ _fieldItr_ = fields.find(_fieldName_); _Nmat_ = _N_.transMat(_weights_*elementEnergy); DENS_MAT & energy = energies[_fieldName_]; - for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + for (int i = 0; i < nNodesPerElement_; ++i) { + int inode = _conn_(i); energy(inode,0) += _Nmat_(i,0); } } @@ -1319,24 +1319,24 @@ namespace ATC{ // Iterate over elements partitioned onto current processor. vector myElems = feMesh_->owned_elts(); - for (vector::iterator elemsIter = myElems.begin(); + for (vector::iterator elemsIter = myElems.begin(); elemsIter != myElems.end(); - ++elemsIter) + ++elemsIter) { int ielem = *elemsIter; - // Skip masked elements + // Skip masked elements if (elementMask && !(*elementMask)(ielem,0)) continue; int imat = elementMaterials(ielem); // material id const Material * mat = physicsModel->material(imat); - + // interpolate field values to integration points interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_, _fieldsAtIPs_,_gradFieldsAtIPs_); - + // rescale by _weights_, a diagonal matrix _Nw_ = _weights_*_N_; for (int j = 0; j < nSD_; ++j) _dNw_[j] = _weights_*_dN_[j]; - + // evaluate physics model and assemble // _Nfluxes is a set of fields for (int n = 0; n < rhsMask.nRows(); n++) { @@ -1347,15 +1347,15 @@ namespace ATC{ _fieldItr_ = fields.find(_fieldName_); const DENS_MAT & field = (_fieldItr_->second).quantity(); DENS_MAT & myRhs(rhs[_fieldName_].set_quantity()); - + int dof = field.nCols(); bool has = physicsModel->weak_equation(_fieldName_)-> N_integrand(_fieldsAtIPs_,_gradFieldsAtIPs_, mat, _Nfluxes_); if (!has) continue; _Nmat_ = _Nw_.transMat(_Nfluxes_); - - for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + + for (int i = 0; i < nNodesPerElement_; ++i) { + int inode = _conn_(i); for (int k = 0; k < dof; ++k) { myRhs(inode,k) += _Nmat_(i,k); } @@ -1366,29 +1366,29 @@ namespace ATC{ _fieldName_ = FieldName(n); if (!rhsMask(_fieldName_,FLUX)) continue; if (physicsModel->null(_fieldName_,imat)) continue; - + _fieldItr_ = fields.find(_fieldName_); const DENS_MAT & field = (_fieldItr_->second).quantity(); DENS_MAT & myRhs(rhs[_fieldName_].set_quantity()); - + int dof = field.nCols(); physicsModel->weak_equation(_fieldName_)-> B_integrand(_fieldsAtIPs_, _gradFieldsAtIPs_, mat, _Bfluxes_); for (int j = 0; j < nSD_; j++) { _Nmat_ = _dNw_[j].transMat(_Bfluxes_[j]); - for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + for (int i = 0; i < nNodesPerElement_; ++i) { + int inode = _conn_(i); for (int k = 0; k < dof; ++k) { myRhs(inode,k) += _Nmat_(i,k); - } + } } } - } + } } vector::iterator _fieldIter_; - for (_fieldIter_ = usedFields.begin(); _fieldIter_ != usedFields.end(); + for (_fieldIter_ = usedFields.begin(); _fieldIter_ != usedFields.end(); ++_fieldIter_) { // myRhs is where we put the global result for this field. _fieldName_ = *_fieldIter_; @@ -1397,7 +1397,7 @@ namespace ATC{ // Sum matrices in-place across all processors into myRhs. allsum(communicator_,MPI_IN_PLACE, myRhs.ptr(), myRhs.size()); } - } + } // ------------------------------------------------------------- // compute rhs using given quadrature @@ -1423,12 +1423,12 @@ namespace ATC{ rhs_local[_fieldName_].reset(nrows,ncols); } } - + int nips = weights.nCols(); if (nips>0) { // compute fields and gradients of fields at given ips - + GRAD_FIELD_MATS gradFieldsAtIPs; FIELD_MATS fieldsAtIPs; for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) { @@ -1443,16 +1443,16 @@ namespace ATC{ } // setup data structures - FIELD_MATS Nfluxes; - GRAD_FIELD_MATS Bfluxes; + FIELD_MATS Nfluxes; + GRAD_FIELD_MATS Bfluxes; for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); int index = (int) _fieldName_; if ( rhsMask(index,FLUX) ) { - Bfluxes[_fieldName_].assign(nSD_, DENS_MAT()); + Bfluxes[_fieldName_].assign(nSD_, DENS_MAT()); } } - + // treat single material point sets specially int nMatls = pointMaterialGroups.size(); int atomMatls = 0; @@ -1461,9 +1461,9 @@ namespace ATC{ if ( indices.size() > 0) atomMatls++; } bool singleMaterial = ( atomMatls == 1 ); - + // evaluate physics model - if (singleMaterial) + if (singleMaterial) { int imat = 0; const Material * mat = physicsModel->material(imat); @@ -1482,21 +1482,21 @@ namespace ATC{ } } } - else + else { - - + + // 1) permanent workspace with per-row mapped clones per matl // from caller/atc // 2) per point calls to N/B_integrand // 3) collect internalToAtom into materials and use mem-cont clones // what about dof for matrices and data storage: clone _matrix_ - - // for each material group: + + // for each material group: // set up storage DENS_MAT group_Nfluxes; - DENS_MAT_VEC group_Bfluxes; - group_Bfluxes.reserve(nSD_); + DENS_MAT_VEC group_Bfluxes; + group_Bfluxes.reserve(nSD_); FIELD_MATS fieldsGroup; GRAD_FIELD_MATS gradFieldsGroup; for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) { @@ -1504,14 +1504,14 @@ namespace ATC{ const DENS_MAT & field = (_fieldItr_->second).quantity(); int ndof = field.nCols(); gradFieldsGroup[_fieldName_].assign(nSD_,DENS_MAT(nips,ndof)); - + Nfluxes[_fieldName_].reset(nips,ndof); Bfluxes[_fieldName_].assign(nSD_,DENS_MAT(nips,ndof)); //} } // copy fields - for ( int imat = 0; imat < pointMaterialGroups.size(); imat++) + for ( int imat = 0; imat < pointMaterialGroups.size(); imat++) { const set & indices = pointMaterialGroups(imat); const Material * mat = physicsModel->material(0); @@ -1528,16 +1528,16 @@ namespace ATC{ (gradFieldsGroup[_fieldName_][j]).reset(npts,ndof); } for (int dof = 0; dof < ndof; ++dof) { - fieldsGroup[_fieldName_](i,dof) + fieldsGroup[_fieldName_](i,dof) = fieldsAtIPs[_fieldName_](*iter,dof); for (int j = 0; j < nSD_; ++j) { - gradFieldsGroup[_fieldName_][j](i,dof) + gradFieldsGroup[_fieldName_][j](i,dof) = gradFieldsAtIPs[_fieldName_][j](*iter,dof); } } } } - // calculate forces, & assemble + // calculate forces, & assemble for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); _fieldItr_ = fields.find(_fieldName_); @@ -1558,14 +1558,14 @@ namespace ATC{ } } } - // calculate forces, & assemble + // calculate forces, & assemble for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); if (physicsModel->null(_fieldName_,imat)) continue; int index = (int) _fieldName_; if ( rhsMask(index,FLUX) ) { _fieldItr_ = fields.find(_fieldName_); - const DENS_MAT & field = (_fieldItr_->second).quantity(); + const DENS_MAT & field = (_fieldItr_->second).quantity(); int ndof = field.nCols(); physicsModel->weak_equation(_fieldName_)-> B_integrand(fieldsGroup, gradFieldsGroup, mat, group_Bfluxes); @@ -1582,24 +1582,24 @@ namespace ATC{ } } } // endif multiple materials - + // assemble : N/Bfluxes -> rhs_local for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); int index = (int) _fieldName_; if ( rhsMask(index,SOURCE) && Nfluxes[_fieldName_].nCols() > 0 ) { - rhs_local[_fieldName_] + rhs_local[_fieldName_] += N.transMat(weights*Nfluxes[_fieldName_]); } if ( rhsMask(index,FLUX) && (Bfluxes[_fieldName_][0]).nCols() > 0 ) { for (int j = 0; j < nSD_; ++j) { - rhs_local[_fieldName_] + rhs_local[_fieldName_] += dN[j]->transMat(weights*Bfluxes[_fieldName_][j]); } } } } // end nips > 0 - + // Share information between processors: rhs_local -> rhs for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); @@ -1629,7 +1629,7 @@ namespace ATC{ if (nips>0) { FIELD_MATS Nfluxes; // compute fields and gradients of fields at given ips - + GRAD_FIELD_MATS gradFieldsAtIPs; FIELD_MATS fieldsAtIPs; for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) { @@ -1651,10 +1651,10 @@ namespace ATC{ if ( indices.size() > 0) atomMatls++; } bool singleMaterial = ( atomMatls == 1 ); - - + + // evaluate physics model - if (singleMaterial) + if (singleMaterial) { int imat = 0; const Material * mat = physicsModel->material(imat); @@ -1670,11 +1670,11 @@ namespace ATC{ } } } - else + else { throw ATC_Error("compute source does not handle multiple materials currently"); } - + // assemble for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); @@ -1684,7 +1684,7 @@ namespace ATC{ } } } - + // no need to share information between processors } @@ -1735,24 +1735,24 @@ namespace ATC{ B_integrand(_fieldsAtIPs_, _gradFieldsAtIPs_, mat, _Bfluxes_); for (int j = 0; j < nSD_; j++) { _Nmat_ = _Nw_.transMat(_Bfluxes_[j]); - for (int i = 0; i < nNodesPerElement_; ++i) { - int inode = _conn_(i); + for (int i = 0; i < nNodesPerElement_; ++i) { + int inode = _conn_(i); for (int k = 0; k < dof; ++k) { - fluxes[_fieldName_][j](inode,k) += _Nmat_(i,k); - } - } + fluxes[_fieldName_][j](inode,k) += _Nmat_(i,k); + } + } } - } - } + } + } // Assemble partial results for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); if (!rhsMask(_fieldName_,FLUX)) continue; for (int j = 0; j < nSD_; j++) { - allsum(communicator_,MPI_IN_PLACE, fluxes[_fieldName_][j].ptr(), fluxes[_fieldName_][j].size()); - } + allsum(communicator_,MPI_IN_PLACE, fluxes[_fieldName_][j].ptr(), fluxes[_fieldName_][j].size()); + } } - } + } //----------------------------------------------------------------- // boundary flux using native quadrature @@ -1773,8 +1773,8 @@ namespace ATC{ } } - FIELD_MATS localElementFields; - GRAD_FIELD_MATS gradFieldsAtIPs; + FIELD_MATS localElementFields; + GRAD_FIELD_MATS gradFieldsAtIPs; FIELD_MATS fieldsAtIPs; for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) { @@ -1788,7 +1788,7 @@ namespace ATC{ fieldsAtIPs[_fieldName_].reset(nIPsPerFace_,dof); localElementFields[_fieldName_].reset(nNodesPerElement_,dof); } - + // element wise assembly set< PAIR >::iterator iter; for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { @@ -1809,7 +1809,7 @@ namespace ATC{ _fieldName_ = _fieldItr_->first; const DENS_MAT & field = (_fieldItr_->second).quantity(); int dof = field.nCols(); - + for (int i = 0; i < nNodesPerElement_; i++) { for (int j = 0; j < dof; j++) { localElementFields[_fieldName_](i,j) = field(_conn_(i),j); @@ -1874,8 +1874,8 @@ namespace ATC{ const DenseMatrix * elementMask, const set * nodeSet) const { - - + + FIELDS rhs, rhsSubset; for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); @@ -1888,19 +1888,19 @@ namespace ATC{ rhsSubset[_fieldName_].reset(nrows,ncols); } } - + // R_I = - int_Omega Delta _N_I .q dV compute_rhs_vector(rhsMask, fields, physicsModel, elementMaterials, rhs, elementMask); // R_I^md = - int_Omega^md Delta _N_I .q dV - compute_rhs_vector(rhsMask, fields, physicsModel, pointMaterialGroups, + compute_rhs_vector(rhsMask, fields, physicsModel, pointMaterialGroups, _weights_, N, dN, rhsSubset); // flux_I = 1/Delta V_I V_I^md R_I + R_I^md // where : Delta V_I = int_Omega _N_I dV for (int n = 0; n < rhsMask.nRows(); n++) { _fieldName_ = FieldName(n); - if ( rhsMask(_fieldName_,FLUX) ) { + if ( rhsMask(_fieldName_,FLUX) ) { if (nodeSet) { _fieldItr_ = fields.find(_fieldName_); const DENS_MAT & field = (_fieldItr_->second).quantity(); @@ -1918,7 +1918,7 @@ namespace ATC{ } } else { - flux[_fieldName_] + flux[_fieldName_] = rhsSubset[_fieldName_].quantity() - flux_mask*(rhs[_fieldName_].quantity()); } } @@ -1930,7 +1930,7 @@ namespace ATC{ { int dof = field.nCols(); DENS_MAT eField(nNodesPerElement_, dof); - int nips = nIPsPerElement_; + int nips = nIPsPerElement_; DENS_MAT ipField(nips, dof); DENS_VEC integral(dof); integral = 0; for (ESET::const_iterator itr = eset.begin(); itr != eset.end(); ++itr) { @@ -1943,19 +1943,19 @@ namespace ATC{ for (int j = 0; j < dof; j++) { eField(i,j) = field(_conn_(i),j); }} ipField = _N_*eField; - for (int i = 0; i < nips; ++i) { + for (int i = 0; i < nips; ++i) { for (int j = 0; j < dof; ++j) { - integral(j) += ipField(i,j)*_weights_[i]; + integral(j) += ipField(i,j)*_weights_[i]; } } - } + } // assemble partial results allsum(communicator_,MPI_IN_PLACE, integral.ptr(), integral.size()); return integral; } //----------------------------------------------------------------- - // Robin boundary flux using native quadrature + // Robin boundary flux using native quadrature // integrate \int_delV _N_I s(x,t).n dA //----------------------------------------------------------------- void FE_Engine::add_robin_fluxes(const Array2D &rhsMask, @@ -1964,13 +1964,13 @@ namespace ATC{ const ROBIN_SURFACE_SOURCE & sourceFunctions, FIELDS &nodalSources) const { - + // sizing working arrays DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT faceSource; DENS_MAT localField; DENS_MAT xAtIPs(nSD_,nIPsPerFace_); - DENS_MAT uAtIPs(nIPsPerFace_,1); + DENS_MAT uAtIPs(nIPsPerFace_,1); FIELDS myNodalSources; // element wise assembly @@ -1978,15 +1978,15 @@ namespace ATC{ for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; + if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; DENS_MAT & s(nodalSources[_fieldName_].set_quantity()); myNodalSources[_fieldName_] = DENS_MAT(s.nRows(),s.nCols()); } for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; - + if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; + typedef map > FSET; const FSET *fset = (const FSET *)&(src_iter->second); FSET::const_iterator fset_iter; @@ -2001,7 +2001,7 @@ namespace ATC{ // evaluate location at ips feMesh_->face_shape_function(face, _fN_, _fdN_, _nN_, _fweights_); feMesh_->element_coordinates(elem, xCoords); - xAtIPs = xCoords*(_fN_.transpose()); + xAtIPs = xCoords*(_fN_.transpose()); // collect field _fieldItr_ = fields.find(_fieldName_); const DENS_MAT & field = (_fieldItr_->second).quantity(); @@ -2026,7 +2026,7 @@ namespace ATC{ faceSource(ip,idof) -= coefsAtIPs(ip,0)*uAtIPs(ip,0); } } - + // assemble DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); _Nmat_ = _fN_.transMat(_fweights_*faceSource); @@ -2034,23 +2034,23 @@ namespace ATC{ int inode = _conn_(i); for (int idof = 0; idof < nFieldDOF; ++idof) { s(inode,idof) += _Nmat_(i,idof); - } - } - } - } + } + } + } + } // assemble partial result matrices for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!rhsMask((int) _fieldName_,ROBIN_SOURCE)) continue; + if (!rhsMask((int) _fieldName_,ROBIN_SOURCE)) continue; DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); - allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); + allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); DENS_MAT & src(nodalSources[_fieldName_].set_quantity()); src += s; } } //----------------------------------------------------------------- - // Robin boundary flux stiffness using native quadrature + // Robin boundary flux stiffness using native quadrature // integrate \int_delV _N_I ds/du(x,t).n dA //----------------------------------------------------------------- void FE_Engine::add_robin_tangent(const Array2D &rhsMask, @@ -2059,7 +2059,7 @@ namespace ATC{ const ROBIN_SURFACE_SOURCE & sourceFunctions, SPAR_MAT &tangent) const { - + // sizing working arrays DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT coefsAtIPs; @@ -2073,8 +2073,8 @@ namespace ATC{ for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; - + if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue; + typedef map > FSET; const FSET *fset = (const FSET *)&(src_iter->second); FSET::const_iterator fset_iter; @@ -2089,7 +2089,7 @@ namespace ATC{ // evaluate location at ips feMesh_->face_shape_function(face, _fN_, _fdN_, _nN_, _fweights_); feMesh_->element_coordinates(elem, xCoords); - xAtIPs = xCoords*(_fN_.transpose()); + xAtIPs = xCoords*(_fN_.transpose()); // collect field _fieldItr_ = fields.find(_fieldName_); const DENS_MAT & field = (_fieldItr_->second).quantity(); @@ -2108,21 +2108,21 @@ namespace ATC{ column(xAtIPs,ip).ptr(),time); } } - + // assemble - DIAG_MAT D(column(coefsAtIPs,0)); - D *= -1; - D *= _fweights_; + DIAG_MAT D(column(coefsAtIPs,0)); + D *= -1; + D *= _fweights_; _Nmat_ = _fN_.transMat(D*_fN_); for (int i = 0; i < nNodesPerElement_; ++i) { int inode = _conn_(i); for (int j = 0; j < nNodesPerElement_; ++j) { int jnode = _conn_(j); K.add(inode, jnode, _Nmat_(i,j)); - } - } - } - } + } + } + } + } // assemble partial result matrices #ifdef ISOLATE_FE sparse_allsum(communicator_,K); @@ -2133,7 +2133,7 @@ namespace ATC{ } //----------------------------------------------------------------- - // Robin boundary flux using native quadrature + // Robin boundary flux using native quadrature // integrate \int_delV _N_I s(x,t).n dA //----------------------------------------------------------------- void FE_Engine::add_open_fluxes(const Array2D &rhsMask, @@ -2142,7 +2142,7 @@ namespace ATC{ FIELDS &nodalSources, const FieldName Velocity) const { - + // sizing working arrays DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT faceSource; @@ -2159,15 +2159,15 @@ namespace ATC{ for (face_iter=openFaces.begin(); face_iter!=openFaces.end(); face_iter++) { _fieldName_ = face_iter->first; - if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; + if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; DENS_MAT & s(nodalSources[_fieldName_].set_quantity()); myNodalSources[_fieldName_] = DENS_MAT(s.nRows(),s.nCols()); } for (face_iter=openFaces.begin(); face_iter!=openFaces.end(); face_iter++) { _fieldName_ = face_iter->first; - if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; - + if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; + typedef set FSET; const FSET *fset = (const FSET *)&(face_iter->second); FSET::const_iterator fset_iter; @@ -2220,23 +2220,23 @@ namespace ATC{ int inode = _conn_(i); for (int idof = 0; idof < nFieldDOF; ++idof) { s(inode,idof) += _Nmat_(i,idof); - } + } } - } - } + } + } // assemble partial result matrices for (face_iter=openFaces.begin(); face_iter!=openFaces.end(); face_iter++) { _fieldName_ = face_iter->first; - if (!rhsMask((int) _fieldName_,OPEN_SOURCE)) continue; + if (!rhsMask((int) _fieldName_,OPEN_SOURCE)) continue; DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); - allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); + allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); DENS_MAT & src(nodalSources[_fieldName_].set_quantity()); src += s; } } //----------------------------------------------------------------- - // Open boundary flux stiffness using native quadrature + // Open boundary flux stiffness using native quadrature // integrate \int_delV _N_I ds/du(x,t).n dA //----------------------------------------------------------------- void FE_Engine::add_open_tangent(const Array2D &rhsMask, @@ -2245,7 +2245,7 @@ namespace ATC{ SPAR_MAT &tangent, const FieldName Velocity) const { - + // sizing working arrays DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT faceSource; @@ -2259,10 +2259,10 @@ namespace ATC{ for (face_iter=openFaces.begin(); face_iter!=openFaces.end(); face_iter++) { _fieldName_ = face_iter->first; - if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; + if (!rhsMask((int)_fieldName_,OPEN_SOURCE)) continue; bool convective = false; if (_fieldName_ == Velocity) convective = true; - + typedef set FSET; const FSET *fset = (const FSET *)&(face_iter->second); FSET::const_iterator fset_iter; @@ -2315,10 +2315,10 @@ namespace ATC{ for (int j = 0; j < nNodesPerElement_; ++j) { int jnode = _conn_(j); K.add(inode, jnode, _Nmat_(i,j)); - } - } - } - } + } + } + } + } // assemble partial result matrices #ifdef ISOLATE_FE sparse_allsum(communicator_,K); @@ -2327,9 +2327,9 @@ namespace ATC{ #endif tangent += K; } - + //----------------------------------------------------------------- - // prescribed boundary flux using native quadrature + // prescribed boundary flux using native quadrature // integrate \int_delV _N_I s(x,t).n dA //----------------------------------------------------------------- void FE_Engine::add_fluxes(const Array &fieldMask, @@ -2337,7 +2337,7 @@ namespace ATC{ const SURFACE_SOURCE & sourceFunctions, FIELDS &nodalSources) const { - + // sizing working arrays DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT xAtIPs(nSD_,nIPsPerFace_); @@ -2349,15 +2349,15 @@ namespace ATC{ for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!fieldMask((int)_fieldName_)) continue; + if (!fieldMask((int)_fieldName_)) continue; DENS_MAT & s(nodalSources[_fieldName_].set_quantity()); myNodalSources[_fieldName_] = DENS_MAT(s.nRows(),s.nCols()); } for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!fieldMask((int)_fieldName_)) continue; - + if (!fieldMask((int)_fieldName_)) continue; + typedef map > FSET; const FSET *fset = (const FSET *)&(src_iter->second); FSET::const_iterator fset_iter; @@ -2376,17 +2376,17 @@ namespace ATC{ MultAB(xCoords,_fN_,xAtIPs,0,1); //xAtIPs = xCoords*(N.transpose()); // interpolate prescribed flux at ips of this element - + FSET::const_iterator face_iter = fset->find(face); - if (face_iter == fset->end()) - { + if (face_iter == fset->end()) + { stringstream ss; ss << "face not found" << std::endl; print_msg(communicator_,ss.str()); - + } - - + + int nFieldDOF = (face_iter->second).size(); faceSource.reset(nIPsPerFace_,nFieldDOF); for (int ip = 0; ip < nIPsPerFace_; ++ip) { @@ -2396,14 +2396,14 @@ namespace ATC{ faceSource(ip,idof) = f->f(column(xAtIPs,ip).ptr(),time); } } - + // assemble DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); _Nmat_ = _fN_.transMat(_fweights_*faceSource); - for (int i = 0; i < nNodesPerElement_; ++i) + for (int i = 0; i < nNodesPerElement_; ++i) { int inode = _conn_(i); - for (int idof = 0; idof < nFieldDOF; ++idof) + for (int idof = 0; idof < nFieldDOF; ++idof) { s(inode,idof) += _Nmat_(i,idof); } // end assemble nFieldDOF @@ -2413,16 +2413,16 @@ namespace ATC{ // assemble partial result matrices for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - if (!fieldMask((int)_fieldName_)) continue; + if (!fieldMask((int)_fieldName_)) continue; DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); - allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); + allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); DENS_MAT & src(nodalSources[_fieldName_].set_quantity()); src += s; } } //----------------------------------------------------------------- - // prescribed volume flux using native quadrature + // prescribed volume flux using native quadrature // integrate \int_V _N_I s(x,t) dV //----------------------------------------------------------------- void FE_Engine::add_sources(const Array &fieldMask, @@ -2430,14 +2430,14 @@ namespace ATC{ const VOLUME_SOURCE &sourceFunctions, FIELDS &nodalSources) const { - + // sizing working arrays DENS_MAT elemSource; DENS_MAT xCoords(nSD_,nNodesPerElement_); DENS_MAT xAtIPs(nSD_,nIPsPerElement_); FIELDS myNodalSources; - for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); + for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); src_iter != sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; int index = (int) _fieldName_; @@ -2456,12 +2456,12 @@ namespace ATC{ feMesh_->shape_function(ielem, _N_, _weights_); feMesh_->element_coordinates(ielem, xCoords); xAtIPs =xCoords*(_N_.transpose()); - for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); + for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); src_iter != sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; - int index = (int) _fieldName_; + int index = (int) _fieldName_; if ( fieldMask(index) ) { - const Array2D * thisSource + const Array2D * thisSource = (const Array2D *) &(src_iter->second); int nFieldDOF = thisSource->nCols(); elemSource.reset(nIPsPerElement_,nFieldDOF); @@ -2477,7 +2477,7 @@ namespace ATC{ // assemble _Nmat_ = _N_.transMat(_weights_*elemSource); DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); - + for (int i = 0; i < nNodesPerElement_; ++i) { int inode = _conn_(i); for (int idof = 0; idof < nFieldDOF; ++idof) { @@ -2488,13 +2488,13 @@ namespace ATC{ } } // Aggregate unmasked nodal sources on all processors. - for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); + for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin(); src_iter != sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; int index = (int) _fieldName_; if (!fieldMask(index)) continue; DENS_MAT & s(myNodalSources[_fieldName_].set_quantity()); - allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); + allsum(communicator_,MPI_IN_PLACE, s.ptr(), s.size()); DENS_MAT & src(nodalSources[_fieldName_].set_quantity()); src += s; } @@ -2510,7 +2510,7 @@ namespace ATC{ FIELDS::const_iterator itr; for (itr=sources.begin(); itr!=sources.end(); itr++) { _fieldName_ = itr->first; - if (!fieldMask((int)_fieldName_)) continue; + if (!fieldMask((int)_fieldName_)) continue; DENS_MAT & src(nodalSources[_fieldName_].set_quantity()); const DENS_MAT & s((sources.find(_fieldName_)->second).quantity()); for (int inode = 0; inode < nNodesUnique_; ++inode) { @@ -2539,8 +2539,8 @@ namespace ATC{ // sizing working arrays DENS_MAT n(nSD_,nIPsPerFace_); DENS_MAT localElementFields(nNodesPerElement_,dof); - DENS_MAT integrals(dof,nSD_); - DENS_MAT fieldsAtIPs; + DENS_MAT integrals(dof,nSD_); + DENS_MAT fieldsAtIPs; // SJL shouldn't this just be _fieldsAtIPs_ // the data member? @@ -2603,7 +2603,7 @@ namespace ATC{ values(1,0) = integrals(3,0)+integrals(1,1)+integrals(5,2); values(2,0) = integrals(4,1)+integrals(5,1)+integrals(2,2); } - // (v.n) = v_j n_j + // (v.n) = v_j n_j else if (dof == 3) { // vector values.reset(1,1); values(0,0) = integrals(0,0)+integrals(1,1)+integrals(2,2); @@ -2625,7 +2625,7 @@ namespace ATC{ //----------------------------------------------------------------- // evaluate shape functions at given points //----------------------------------------------------------------- - + void FE_Engine::evaluate_shape_functions( const MATRIX & pt_coords, SPAR_MAT & N) const @@ -2633,12 +2633,12 @@ namespace ATC{ // Get shape function and derivatives at atomic locations int nnodes = feMesh_->num_nodes_unique(); int npts = pt_coords.nRows(); - + // loop over point (atom) coordinates DENS_VEC x(nSD_); Array node_index(nNodesPerElement_); DENS_VEC shp(nNodesPerElement_); - + N.reset(npts,nnodes); for (int i = 0; i < npts; ++i) { for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); } @@ -2648,7 +2648,7 @@ namespace ATC{ N.add(i,jnode,shp(j)); } } - N.compress(); + N.compress(); } //----------------------------------------------------------------- @@ -2668,12 +2668,12 @@ namespace ATC{ Array node_index(nNodesPerElement_); DENS_VEC shp(nNodesPerElement_); DENS_MAT dshp(nSD_,nNodesPerElement_); - + for (int k = 0; k < nSD_; ++k) { - dN[k]->reset(npts,nnodes); + dN[k]->reset(npts,nnodes); } - - N.reset(npts,nnodes); + + N.reset(npts,nnodes); for (int i = 0; i < npts; ++i) { for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); } feMesh_->shape_functions(x,shp,dshp,node_index); @@ -2685,9 +2685,9 @@ namespace ATC{ } } } - N.compress(); - for (int k = 0; k < nSD_; ++k) { - dN[k]->compress(); + N.compress(); + for (int k = 0; k < nSD_; ++k) { + dN[k]->compress(); } } @@ -2702,12 +2702,12 @@ namespace ATC{ // Get shape function and derivatives at atomic locations int nnodes = feMesh_->num_nodes_unique(); int npts = pt_coords.nRows(); - + // loop over point (atom) coordinates DENS_VEC x(nSD_); Array node_index(nNodesPerElement_); DENS_VEC shp(nNodesPerElement_); - + N.reset(npts,nnodes); for (int i = 0; i < npts; ++i) { for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); } @@ -2718,7 +2718,7 @@ namespace ATC{ N.add(i,jnode,shp(j)); } } - N.compress(); + N.compress(); } //----------------------------------------------------------------- @@ -2740,10 +2740,10 @@ namespace ATC{ DENS_VEC shp(nNodesPerElement_); DENS_MAT dshp(nSD_,nNodesPerElement_); for (int k = 0; k < nSD_; ++k) { - dN[k]->reset(npts,nnodes); + dN[k]->reset(npts,nnodes); } - - N.reset(npts,nnodes); + + N.reset(npts,nnodes); for (int i = 0; i < npts; ++i) { for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); } int eltId = pointToEltMap(i,0); @@ -2756,9 +2756,9 @@ namespace ATC{ } } } - N.compress(); - for (int k = 0; k < nSD_; ++k) { - dN[k]->compress(); + N.compress(); + for (int k = 0; k < nSD_; ++k) { + dN[k]->compress(); } } //----------------------------------------------------------------- @@ -2772,14 +2772,14 @@ namespace ATC{ int nnodes = feMesh_->num_nodes_unique(); int npts = pt_coords.nRows(); for (int k = 0; k < nSD_; ++k) { - dNdx[k]->reset(npts,nnodes); + dNdx[k]->reset(npts,nnodes); } // loop over point (atom) coordinates DENS_VEC x(nSD_); Array node_index(nNodesPerElement_); DENS_MAT dshp(nSD_,nNodesPerElement_); - + for (int i = 0; i < npts; ++i) { for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); } int eltId = pointToEltMap(i,0); @@ -2791,8 +2791,8 @@ namespace ATC{ } } } - for (int k = 0; k < nSD_; ++k) { - dNdx[k]->compress(); + for (int k = 0; k < nSD_; ++k) { + dNdx[k]->compress(); } } @@ -2816,7 +2816,7 @@ namespace ATC{ for (int i = 0; i < nNodes_; i++) { xI = feMesh_->global_coordinates(i); for (int j = 0; j < npts; j++) { - for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); } + for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); } dx = x - xI; if (kernelFunction_->in_support(dx)) bw = max(bw,abs(j-map_global_to_unique(i))); } @@ -2844,7 +2844,7 @@ namespace ATC{ for (int i = 0; i < nNodes_; i++) { xI = feMesh_->global_coordinates(i); for (int j = 0; j < npts; j++) { - for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); } + for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); } dx = x - xI; double val = kernelFunction_->value(dx); val *= kernelFunction_->dimensionality_factor(); @@ -2859,9 +2859,9 @@ namespace ATC{ // create a non-uniform rectangular mesh on a rectangular region //----------------------------------------------------------------- - void FE_Engine::create_mesh(Array & dx, - Array & dy, - Array & dz, + void FE_Engine::create_mesh(Array & dx, + Array & dy, + Array & dz, const char * regionName, Array periodicity) { @@ -2885,7 +2885,7 @@ namespace ATC{ if (dy(0) == 0.0) dy = (ymax-ymin)/dy.size(); if (dz(0) == 0.0) dz = (zmax-zmin)/dz.size(); - + feMesh_ = new FE_Rectangular3DMesh(dx,dy,dz, xmin, xmax, ymin, ymax, @@ -2893,8 +2893,8 @@ namespace ATC{ periodicity, xscale, yscale, zscale); stringstream ss; - ss << "created structured mesh with " << feMesh_->num_nodes() << " nodes, " - << feMesh_->num_nodes_unique() << " unique nodes, and " + ss << "created structured mesh with " << feMesh_->num_nodes() << " nodes, " + << feMesh_->num_nodes_unique() << " unique nodes, and " << feMesh_->num_elements() << " elements"; print_msg_once(communicator_,ss.str()); #ifdef ATC_VERBOSE @@ -2916,7 +2916,7 @@ namespace ATC{ double xl= xs/(ATC::LammpsInterface::instance()->xlattice()); double sumn = 0, sums = 0, suml = 0; double x = xmin; - for (int i = 0; i < dx.size(); ++i) { + for (int i = 0; i < dx.size(); ++i) { double dxn = dx(i)*xn; sumn += dxn; double dxs = dx(i)*xs; sums += dxs; double dxl = dx(i)*xl; suml += dxl; @@ -2953,7 +2953,7 @@ namespace ATC{ zmin, zmax, xscale, yscale, zscale); if (!isBox) throw ATC_Error("Region for FE mesh is not a box"); - + feMesh_ = new FE_Uniform3DMesh(nx,ny,nz, xmin, xmax, ymin, ymax, @@ -2961,8 +2961,8 @@ namespace ATC{ periodicity, xscale, yscale, zscale); stringstream ss; - ss << "created uniform mesh with " << feMesh_->num_nodes() << " nodes, " - << feMesh_->num_nodes_unique() << " unique nodes, and " + ss << "created uniform mesh with " << feMesh_->num_nodes() << " nodes, " + << feMesh_->num_nodes_unique() << " unique nodes, and " << feMesh_->num_elements() << " elements"; print_msg_once(communicator_,ss.str()); } diff --git a/lib/atc/FE_Engine.h b/lib/atc/FE_Engine.h index ade7626f80..4a3bedac7d 100644 --- a/lib/atc/FE_Engine.h +++ b/lib/atc/FE_Engine.h @@ -16,36 +16,36 @@ #include "mpi.h" namespace ATC { - + class ATC_Method; class FE_Element; class XT_Function; class KernelFunction; - + /** - * @class FE_Engine - * @brief Base class for computing and assembling mass matrix + * @class FE_Engine + * @brief Base class for computing and assembling mass matrix * and rhs vectors - */ - + */ + class FE_Engine{ public: /** constructor/s */ FE_Engine(MPI_Comm comm); - + /** destructor */ ~FE_Engine(); - + /** initialize */ void initialize(); - + MPI_Comm communicator() {return communicator_;} void partition_mesh(); void departition_mesh(); bool is_partitioned() const { return feMesh_->is_partitioned(); } - int map_elem_to_myElem(int elemID) const + int map_elem_to_myElem(int elemID) const { return feMesh_->map_elem_to_myElem(elemID); } - int map_myElem_to_elem(int myElemID) const + int map_myElem_to_elem(int myElemID) const { return feMesh_->map_myElem_to_elem(myElemID); } // note: it is misleading to declare the following const @@ -60,7 +60,7 @@ namespace ATC { // are more pertinent to other classes (FE_Interpolate, // for the most part) that it uses temporarily for space/ // time speedups while doing it's computations. - // + // // I approve of this usage of mutable, but the const/ // non-const member function declaring in this class is // really all wrong to begin with. @@ -71,7 +71,7 @@ namespace ATC { /** parser/modifier */ bool modify(int narg, char **arg); - + /** finish up */ void finish(); @@ -84,11 +84,11 @@ namespace ATC { /*@{*/ /** these assume the caller is handling the parallel collection */ void initialize_output(int rank, std::string outputPrefix, std::set otypes); - + /** write geometry */ void write_geometry(void); - - /** write data: data is arrayed over _unique_ nodes + + /** write data: data is arrayed over _unique_ nodes and then mapped by the engine */ void write_data(double time, FIELDS &soln, OUTPUT_LIST *data=nullptr); void write_data(double time, OUTPUT_LIST *data); @@ -102,7 +102,7 @@ namespace ATC { void delete_elements(const std::set &elementList); void cut_mesh(const std::set &cutFaces, const std::set &edgeNodes); - void add_global(const std::string name, const double value) + void add_global(const std::string name, const double value) { outputManager_.add_global(name,value); } void add_field_names(const std::string field, const std::vector & names) @@ -175,18 +175,18 @@ namespace ATC { /** compute a dimensionless mass matrix */ void compute_mass_matrix(SPAR_MAT &mass_matrix) const; - + /** computes a dimensionless mass matrix for the given-quadrature */ void compute_mass_matrix(const DIAG_MAT &weights, const SPAR_MAT &N, SPAR_MAT &mass_matrix) const; - + /** compute a single dimensionless mass matrix */ void compute_lumped_mass_matrix(DIAG_MAT &lumped_mass_matrix) const; /** compute lumped mass matrix = diag (\int \rho N_I dV) */ void compute_lumped_mass_matrix( - const Array &mask, + const Array &mask, const FIELDS &fields, const PhysicsModel *physicsModel, const Array &elementMaterials, @@ -195,7 +195,7 @@ namespace ATC { /** compute dimensional lumped mass matrix using given quadrature */ void compute_lumped_mass_matrix( - const Array &mask, + const Array &mask, const FIELDS &fields, const PhysicsModel *physicsModel, const Array > &pointMaterialGroups, @@ -211,7 +211,7 @@ namespace ATC { const FIELDS &fields, const PhysicsModel *physicsModel, const Array &elementMaterials, - FIELD_MATS &energy, + FIELD_MATS &energy, const DenseMatrix *elementMask=nullptr, const IntegrationDomainType domain=FULL_DOMAIN) const; @@ -250,15 +250,15 @@ namespace ATC { const FIELDS &fields, const PhysicsModel *physicsModel, const Array &elementMaterials, - GRAD_FIELD_MATS &flux, + GRAD_FIELD_MATS &flux, const DenseMatrix *elementMask=nullptr) const; /** compute the flux on the MD/FE boundary */ - void compute_boundary_flux(const RHS_MASK &rhsMask, + void compute_boundary_flux(const RHS_MASK &rhsMask, const FIELDS &fields, const PhysicsModel *physicsModel, const Array &elementMaterials, - const std::set &faceSet, + const std::set &faceSet, FIELDS &rhs) const; /** compute the flux on using an L2 interpolation of the flux */ @@ -276,21 +276,21 @@ namespace ATC { const std::set *nodeSet=nullptr) const; /** compute prescribed flux given an array of functions of x & t */ - void add_fluxes(const Array &fieldMask, + void add_fluxes(const Array &fieldMask, const double time, - const SURFACE_SOURCE &sourceFunctions, + const SURFACE_SOURCE &sourceFunctions, FIELDS &nodalSources) const; - void compute_fluxes(const Array &fieldMask, + void compute_fluxes(const Array &fieldMask, const double time, - const SURFACE_SOURCE &sourceFunctions, + const SURFACE_SOURCE &sourceFunctions, FIELDS &nodalSources) const { SURFACE_SOURCE::const_iterator src_iter; for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) { _fieldName_ = src_iter->first; if (!fieldMask((int)_fieldName_)) continue; - if (nodalSources[_fieldName_].nRows()==0) { - nodalSources[_fieldName_].reset(nNodesUnique_,1); + if (nodalSources[_fieldName_].nRows()==0) { + nodalSources[_fieldName_].reset(nNodesUnique_,1); } } add_fluxes(fieldMask, time, sourceFunctions, nodalSources); @@ -310,7 +310,7 @@ namespace ATC { SPAR_MAT &tangent) const; /** compute open flux given a face set */ - + void add_open_fluxes(const Array2D &rhsMask, const FIELDS &fields, const OPEN_SURFACE &openFaces, @@ -324,13 +324,13 @@ namespace ATC { const FieldName velocity = ELECTRON_VELOCITY) const; /** compute nodal vector of volume based sources */ - void add_sources(const Array &fieldMask, + void add_sources(const Array &fieldMask, const double time, - const VOLUME_SOURCE &sourceFunctions, + const VOLUME_SOURCE &sourceFunctions, FIELDS &nodalSources) const; - void add_sources(const Array &fieldMask, + void add_sources(const Array &fieldMask, const double time, - const FIELDS &sources, + const FIELDS &sources, FIELDS &nodalSources) const; /** compute surface flux of a nodal field */ @@ -356,37 +356,37 @@ namespace ATC { /*@{*/ /** evaluate shape function at a list of points in R^3 */ - void evaluate_shape_functions(const MATRIX &coords, + void evaluate_shape_functions(const MATRIX &coords, SPAR_MAT &N) const; /** evaluate shape function & derivatives at a list of points in R^3 */ - void evaluate_shape_functions(const MATRIX &coords, + void evaluate_shape_functions(const MATRIX &coords, SPAR_MAT &N, SPAR_MAT_VEC &dN) const; /** evaluate shape function at a list of points in R^3 */ - void evaluate_shape_functions(const MATRIX &coords, + void evaluate_shape_functions(const MATRIX &coords, const INT_ARRAY &pointToEltMap, SPAR_MAT &N) const; /** evaluate shape function & derivatives at a list of points in R^3 */ - void evaluate_shape_functions(const MATRIX &coords, + void evaluate_shape_functions(const MATRIX &coords, const INT_ARRAY &pointToEltMap, SPAR_MAT &N, - SPAR_MAT_VEC &dN) const; + SPAR_MAT_VEC &dN) const; /** evaluate shape derivatives at a list of points in R^3 */ - void evaluate_shape_function_derivatives(const MATRIX &coords, + void evaluate_shape_function_derivatives(const MATRIX &coords, const INT_ARRAY &pointToEltMap, SPAR_MAT_VEC &dN) const; - void shape_functions(const VECTOR &x, + void shape_functions(const VECTOR &x, DENS_VEC &shp, Array &node_list) const { feMesh_->shape_functions(x,shp,node_list); } void shape_functions(const VECTOR & x, - DENS_VEC& shp, + DENS_VEC& shp, DENS_MAT& dshp, Array &node_list) const { feMesh_->shape_functions(x,shp,dshp,node_list); } @@ -405,7 +405,7 @@ namespace ATC { void shape_functions(const VECTOR &x, const int eltId, - DENS_VEC &shp, + DENS_VEC &shp, DENS_MAT &dshp, Array &node_list) const { feMesh_->shape_functions(x,eltId,shp,dshp,node_list); } @@ -425,21 +425,21 @@ namespace ATC { /** \name nodeset */ //---------------------------------------------------------------- /** pass through */ - void create_nodeset(const std::string &name, const std::set &nodeset) + void create_nodeset(const std::string &name, const std::set &nodeset) { feMesh_->create_nodeset(name,nodeset); } //---------------------------------------------------------------- /** \name accessors */ //---------------------------------------------------------------- /*@{*/ - /** even though these are pass-throughs there is a necessary + /** even though these are pass-throughs there is a necessary * translation */ /** return number of unique nodes */ int num_nodes() const { return feMesh_->num_nodes_unique(); } - + /** return number of total nodes */ int nNodesTotal() const { return feMesh_->num_nodes(); } - + /** return number of elements */ int num_elements() const { return feMesh_->num_elements(); } int my_num_elements() const { return feMesh_->my_num_elements(); } @@ -448,53 +448,53 @@ namespace ATC { int num_nodes_per_element() const { return feMesh_->num_nodes_per_element(); } /** return element connectivity */ - void element_connectivity(const int eltID, + void element_connectivity(const int eltID, Array & nodes) const { feMesh_->element_connectivity_unique(eltID, nodes); } - + /** return face connectivity */ - void face_connectivity(const PAIR &faceID, + void face_connectivity(const PAIR &faceID, Array &nodes) const { feMesh_->face_connectivity_unique(faceID, nodes); } /** in lieu of pass-throughs const accessors ... */ /** return const ptr to mesh */ const FE_Mesh* fe_mesh() const { return feMesh_; } - + /** return number of spatial dimensions */ int nsd() const { return feMesh_->num_spatial_dimensions(); } - + /** return if the FE mesh has been created */ int has_mesh() const { return feMesh_!=nullptr; } - + /** get nodal coordinates for a given element */ void element_coordinates(const int eltIdx, DENS_MAT &coords) { feMesh_->element_coordinates(eltIdx,coords); } /** get nodal coordinates for a given element */ - void element_field(const int eltIdx, const DENS_MAT field, + void element_field(const int eltIdx, const DENS_MAT field, DENS_MAT &local_field) { feMesh_->element_field(eltIdx, field, local_field); } /** access list of elements to be deleted */ const std::set &null_elements(void) const - { return nullElements_; } + { return nullElements_; } /** access to the amended nodal coordinate values */ - const DENS_MAT &nodal_coordinates(void) const + const DENS_MAT &nodal_coordinates(void) const { return (*feMesh_->coordinates()); } - /** map global node numbering to unique node numbering for + /** map global node numbering to unique node numbering for * amended mesh */ - int map_global_to_unique(const int global_id) const + int map_global_to_unique(const int global_id) const { return (*feMesh_->node_map())(global_id); } - + int number_of_global_nodes(void) const { return nNodes_; } /*@}*/ /** set kernel */ - + void set_kernel(KernelFunction* ptr); KernelFunction *kernel(int /* i */) { return kernelFunction_; } KernelFunction *kernel() { return kernelFunction_; } @@ -512,8 +512,8 @@ namespace ATC { /** auxiliary kernel function */ KernelFunction *kernelFunction_; - - /** initialized flag */ + + /** initialized flag */ bool initialized_; void parse_partitions(int & argIdx, int narg, char ** arg, @@ -521,13 +521,13 @@ namespace ATC { void print_partitions(double xmin, double xmax, Array &dx) const; /** create a uniform, structured mesh */ - void create_mesh(Array &dx, - Array &dy, - Array &dz, + void create_mesh(Array &dx, + Array &dy, + Array &dz, const char *regionName, Array periodic); - void create_mesh(int nx, int ny, int nz, + void create_mesh(int nx, int ny, int nz, const char *regionName, Array periodic); @@ -537,11 +537,11 @@ namespace ATC { /** data that can be used for a subset of original mesh */ std::set nullElements_; - + /** faces upon which nodes are duplicated */ std::set cutFaces_; std::set cutEdge_; - + /** workspace */ int nNodesPerElement_; int nSD_; @@ -551,9 +551,9 @@ namespace ATC { mutable int nIPsPerElement_; mutable int nIPsPerFace_; mutable FeIntQuadrature quadrature_; - mutable FIELDS::const_iterator _fieldItr_; + mutable FIELDS::const_iterator _fieldItr_; mutable FieldName _fieldName_; - + /** sized arrays */ mutable DIAG_MAT _weights_; mutable DENS_MAT _N_, _Nw_; @@ -565,14 +565,14 @@ namespace ATC { /** unsized arrays */ mutable DENS_MAT _Nmat_; mutable FIELD_MATS _fieldsAtIPs_; - mutable GRAD_FIELD_MATS _gradFieldsAtIPs_; + mutable GRAD_FIELD_MATS _gradFieldsAtIPs_; mutable DENS_MAT _Nfluxes_; mutable AliasArray _conn_; mutable DENS_MAT_VEC _Bfluxes_; - + /** output object */ OutputManager outputManager_; - + }; }; // end namespace ATC diff --git a/lib/atc/FE_Interpolate.cpp b/lib/atc/FE_Interpolate.cpp index 5e5bd5ecf1..1522be3383 100644 --- a/lib/atc/FE_Interpolate.cpp +++ b/lib/atc/FE_Interpolate.cpp @@ -31,7 +31,7 @@ namespace ATC { } void FE_Interpolate::set_quadrature(FeEltGeometry geo, - FeIntQuadrature quad) + FeIntQuadrature quad) { if (feQuadList_.count(quad) == 0) { feQuad_ = new FE_Quadrature(geo,quad); @@ -47,7 +47,7 @@ namespace ATC { int numEltNodes = feElement_->num_elt_nodes(); int numFaces = feElement_->num_faces(); int numFaceNodes = feElement_->num_face_nodes(); - + int numIPs = feQuad_->numIPs; DENS_MAT &ipCoords = feQuad_->ipCoords; int numFaceIPs = feQuad_->numFaceIPs; @@ -79,7 +79,7 @@ namespace ATC { compute_N_dNdr(thisIP,thisN,thisdNdr); } } - + // Compute 2D face shape function derivatives dNdrFace2D_.assign(numFaceIPs,DENS_MAT(nSD_-1,numFaceNodes)); for (int ip = 0; ip < numFaceIPs; ip++) { @@ -111,14 +111,14 @@ namespace ATC { N.resize(numEltNodes); DENS_MAT dNdr(nSD_,numEltNodes,false); compute_N_dNdr(xi,N,dNdr); - + DENS_MAT eltCoordsT = transpose(eltCoords); DENS_MAT dxdr, drdx; - + dxdr = dNdr*eltCoordsT; drdx = inv(dxdr); dNdx = drdx*dNdr; - } + } void FE_Interpolate::shape_function_derivatives(const DENS_MAT &eltCoords, const VECTOR &xi, @@ -126,16 +126,16 @@ namespace ATC { { int numEltNodes = feElement_->num_elt_nodes(); DENS_MAT dNdr(nSD_,numEltNodes,false); - - DENS_VEC N(numEltNodes); + + DENS_VEC N(numEltNodes); compute_N_dNdr(xi,N,dNdr); DENS_MAT eltCoordsT = transpose(eltCoords); DENS_MAT dxdr, drdx; dxdr = dNdr*eltCoordsT; // tangents or Jacobian matrix - + drdx = inv(dxdr); dNdx = drdx*dNdr; // dN/dx = dN/dxi (dx/dxi)^-1 - } + } void FE_Interpolate::tangents(const DENS_MAT &eltCoords, const VECTOR &xi, @@ -143,15 +143,15 @@ namespace ATC { { int numEltNodes = feElement_->num_elt_nodes(); DENS_MAT dNdr(nSD_,numEltNodes,false); - - DENS_VEC N(numEltNodes); + + DENS_VEC N(numEltNodes); compute_N_dNdr(xi,N,dNdr); //dNdr.print("dNdr"); DENS_MAT eltCoordsT = transpose(eltCoords); //eltCoordsT.print("elt coords"); dxdr = dNdr*eltCoordsT; //dxdr.print("dxdr"); - } + } void FE_Interpolate::tangents(const DENS_MAT &eltCoords, const VECTOR &xi, @@ -162,7 +162,7 @@ namespace ATC { tangents(eltCoords,xi,dxdr); //dxdr.print("dxdr-post"); dxdxi.resize(nSD_); - //for (int i = 0; i < nSD_; ++i) dxdxi[i] = CLON_VEC(dxdr,CLONE_COL,i); + //for (int i = 0; i < nSD_; ++i) dxdxi[i] = CLON_VEC(dxdr,CLONE_COL,i); for (int i = 0; i < nSD_; ++i) { dxdxi[i].resize(nSD_); for (int j = 0; j < nSD_; ++j) { @@ -192,7 +192,7 @@ namespace ATC { DIAG_MAT &weights) { int numEltNodes = feElement_->num_elt_nodes(); - + // Transpose eltCoords DENS_MAT eltCoordsT(transpose(eltCoords)); @@ -201,7 +201,7 @@ namespace ATC { // Set sizes of matrices and vectors if ((int)dN.size() != nSD_) dN.resize(nSD_); - for (int isd = 0; isd < nSD_; isd++) + for (int isd = 0; isd < nSD_; isd++) dN[isd].resize(feQuad_->numIPs,numEltNodes); weights.resize(feQuad_->numIPs,feQuad_->numIPs); @@ -218,7 +218,7 @@ namespace ATC { // Compute dNdx and fill dN matrix dNdx = drdx * dNdr_[ip]; for (int isd = 0; isd < nSD_; isd++) - for (int inode = 0; inode < numEltNodes; inode++) + for (int inode = 0; inode < numEltNodes; inode++) dN[isd](ip,inode) = dNdx(isd,inode); // Compute jacobian determinant of dxdr at this ip @@ -227,9 +227,9 @@ namespace ATC { + dxdr(0,2) * (dxdr(1,0)*dxdr(2,1) - dxdr(1,1)*dxdr(2,0)); // Compute ip weight - weights(ip,ip) = feQuad_->ipWeights(ip)*J; + weights(ip,ip) = feQuad_->ipWeights(ip)*J; } - + } //----------------------------------------------------------------- @@ -268,9 +268,9 @@ namespace ATC { } // Compute ip weight - weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J; + weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J; } - + } void FE_Interpolate::face_shape_function(const DENS_MAT &eltCoords, @@ -323,9 +323,9 @@ namespace ATC { } // Compute ip weight - weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J; + weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J; } - + } // ------------------------------------------------------------- @@ -333,7 +333,7 @@ namespace ATC { // ------------------------------------------------------------- double FE_Interpolate::face_normal(const DENS_MAT &faceCoords, int ip, - DENS_VEC &normal) + DENS_VEC &normal) { // Compute dx/dr for deformed element DENS_MAT faceCoordsT = transpose(faceCoords); @@ -345,8 +345,8 @@ namespace ATC { normal(2) = dxdr(0,0)*dxdr(1,1) - dxdr(0,1)*dxdr(1,0); // Jacobian (3D) - double J = sqrt(normal(0)*normal(0) + - normal(1)*normal(1) + + double J = sqrt(normal(0)*normal(0) + + normal(1)*normal(1) + normal(2)*normal(2)); double invJ = 1.0/J; normal(0) *= invJ; @@ -354,24 +354,24 @@ namespace ATC { normal(2) *= invJ; return J; } - + int FE_Interpolate::num_ips() const - { - return feQuad_->numIPs; + { + return feQuad_->numIPs; } int FE_Interpolate::num_face_ips() const - { - return feQuad_->numFaceIPs; + { + return feQuad_->numFaceIPs; } - + /********************************************************* * Class FE_InterpolateCartLagrange * * For computing Lagrange shape functions using Cartesian * coordinate systems (all quads/hexes fall under this - * category, and any elements derived by degenerating + * category, and any elements derived by degenerating * them). Not to be used for serendipity elements, which * should be implemented for SPEED. * @@ -395,7 +395,7 @@ namespace ATC { const DENS_VEC &localCoords1d = feElement_->local_coords_1d(); int numEltNodes = feElement_->num_elt_nodes(); int numEltNodes1d = feElement_->num_elt_nodes_1d(); - + DENS_MAT lagrangeTerms(nSD_,numEltNodes1d); DENS_MAT lagrangeDenom(nSD_,numEltNodes1d); lagrangeTerms = 1.0; @@ -404,7 +404,7 @@ namespace ATC { for (int inode = 0; inode < numEltNodes1d; ++inode) { for (int icont = 0; icont < numEltNodes1d; ++icont) { if (inode != icont) { - lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - + lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - localCoords1d(icont)); lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont)); } @@ -439,7 +439,7 @@ namespace ATC { // *** see comments for compute_N_dNdr *** const DENS_VEC &localCoords1d = feElement_->local_coords_1d(); int numEltNodes1d = feElement_->num_elt_nodes_1d(); - + DENS_MAT lagrangeTerms(nD,numEltNodes1d); DENS_MAT lagrangeDenom(nD,numEltNodes1d); DENS_MAT lagrangeDeriv(nD,numEltNodes1d); @@ -453,7 +453,7 @@ namespace ATC { for (int icont = 0; icont < numEltNodes1d; ++icont) { if (inode != icont) { lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont)); - lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - + lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - localCoords1d(icont)); for (int dcont=0; dcont mapping(nD); for (int inode=0; inodelocal_coords_1d(); int numEltNodes = feElement_->num_elt_nodes(); int numEltNodes1d = feElement_->num_elt_nodes_1d(); - + // lagrangeTerms stores the numerator for the various Lagrange polynomials // in one dimension, that will be used to produce the three dimensional // shape functions @@ -526,13 +526,13 @@ namespace ATC { for (int inode = 0; inode < numEltNodes1d; ++inode) { for (int icont = 0; icont < numEltNodes1d; ++icont) { if (inode != icont) { - // each dimension and each 1d node per dimension has a + // each dimension and each 1d node per dimension has a // contribution from all nodes besides the current node lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont)); - lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - + lagrangeDenom(iSD,inode) *= (localCoords1d(inode) - localCoords1d(icont)); // complciated; each sum produced by the product rule has one - // "derivative", and the rest are just identical to the terms + // "derivative", and the rest are just identical to the terms // above for (int dcont=0; dcontlocal_coords(); double invVol = 1.0/(feElement_->vol()); int numEltNodes = feElement_->num_elt_nodes(); - + for (int inode = 0; inode < numEltNodes; ++inode) { N(inode) = invVol; for (int isd = 0; isd < nSD_; ++isd) { @@ -633,7 +633,7 @@ namespace ATC { // *** see comments for compute_N_dNdr *** const DENS_MAT &localCoords = feElement_->local_coords(); double invVol = 1.0/vol; - + for (int inode = 0; inode < numNodes; ++inode) { for (int idr = 0; idr < nD; ++idr) { dNdr(idr,inode) = invVol; @@ -641,7 +641,7 @@ namespace ATC { for (int id = 0; id < nD; ++id) { for (int idr = 0; idr < nD; ++idr) { if (id == idr) dNdr(idr,inode) *= localCoords(id,inode); - else dNdr(idr,inode) *= 1.0 + + else dNdr(idr,inode) *= 1.0 + point(id)*localCoords(id,inode); } } @@ -656,7 +656,7 @@ namespace ATC { const DENS_MAT &localCoords = feElement_->local_coords(); double invVol = 1.0/(feElement_->vol()); int numEltNodes = feElement_->num_elt_nodes(); - + // Fill in for each node for (int inode = 0; inode < numEltNodes; ++inode) { // Intiialize shape function and derivatives @@ -670,20 +670,20 @@ namespace ATC { // One term for each dimension, only deriv in deriv's dimension for (int idr = 0; idr < nSD_; ++idr) { if (isd == idr) dNdr(idr,inode) *= localCoords(isd,inode); - else dNdr(idr,inode) *= 1.0 + + else dNdr(idr,inode) *= 1.0 + point(isd)*localCoords(isd,inode); } } } } - + /********************************************************* * Class FE_InterpolateCartSerendipity * * For computing shape functions for quadratic serendipity * elements, implemented for SPEED. - * + * *********************************************************/ FE_InterpolateCartSerendipity::FE_InterpolateCartSerendipity( FE_Element *feElement) @@ -696,7 +696,7 @@ namespace ATC { { // Handled by base class } - + void FE_InterpolateCartSerendipity::compute_N(const VECTOR &point, VECTOR &N) { @@ -704,14 +704,14 @@ namespace ATC { const DENS_MAT &localCoords = feElement_->local_coords(); double invVol = 1.0/(feElement_->vol()); int numEltNodes = feElement_->num_elt_nodes(); - + for (int inode = 0; inode < numEltNodes; ++inode) { N(inode) = invVol; for (int isd = 0; isd < nSD_; ++isd) { - if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && - (isd == 0)) || + if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && + (isd == 0)) || ((inode == 9 || inode == 11 || inode == 17 || inode == 19) && - (isd == 1)) || + (isd == 1)) || ((inode == 12 || inode == 13 || inode == 14 || inode == 15) && (isd == 2))) { N(inode) *= (1.0 - pow(point(isd),2))*2; @@ -742,7 +742,7 @@ namespace ATC { bool serendipityNode = false; double productRule1 = 0.0; double productRule2 = 0.0; - + if (nD != 3 && nD != 2) { ATC_Error("Serendipity dNdr calculations are too hard-wired to do " "what you want them to. Only 2D and 3D currently work."); @@ -757,15 +757,15 @@ namespace ATC { // identify nodes/dims differently if 3d or 2d case if (nD == 3) { serendipityNode = - (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && - (id == 0)) || + (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && + (id == 0)) || ((inode == 9 || inode == 11 || inode == 17 || inode == 19) && - (id == 1)) || + (id == 1)) || ((inode == 12 || inode == 13 || inode == 14 || inode == 15) && (id == 2))); } else if (nD == 2) { serendipityNode = - (((inode == 4 || inode == 6) && (id == 0)) || + (((inode == 4 || inode == 6) && (id == 0)) || ((inode == 5 || inode == 7) && (id == 1))); } if (serendipityNode) { @@ -794,7 +794,7 @@ namespace ATC { productRule2 = (point(0)*localCoords(0,inode) + point(1)*localCoords(1,inode) - 1); } - productRule1 = dNdr(idr,inode) * + productRule1 = dNdr(idr,inode) * (1 + point(idr)*localCoords(idr,inode)); productRule2 *= dNdr(idr,inode); dNdr(idr,inode) = productRule1 + productRule2; @@ -830,17 +830,17 @@ namespace ATC { // "0-coordinate" is in the same dimension as the one we're currently // iterating over. If that's the case, we want to contribute to its // shape functions and derivatives in a modified way: - if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && - (isd == 0)) || + if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) && + (isd == 0)) || ((inode == 9 || inode == 11 || inode == 17 || inode == 19) && - (isd == 1)) || + (isd == 1)) || ((inode == 12 || inode == 13 || inode == 14 || inode == 15) && (isd == 2))) { // If the 1d shape function dimension matches the derivative // dimension... if (isd == idr) { // contribute to N; sloppy, but this is the easiest way to get - // N to work right without adding extra, arguably unnecessary + // N to work right without adding extra, arguably unnecessary // loops, while also computing the shape functions N(inode) *= (1.0 - pow(point(isd),2))*2; // contribute to dNdr with the derivative of this shape function @@ -869,7 +869,7 @@ namespace ATC { } for (int idr = 0; idr < nSD_; ++idr) { if (inode < 8) { - productRule1 = dNdr(idr,inode) * + productRule1 = dNdr(idr,inode) * (1 + point(idr)*localCoords(idr,inode)); productRule2 = dNdr(idr,inode) * (point(0)*localCoords(0,inode) + point(1)*localCoords(1,inode) + @@ -883,7 +883,7 @@ namespace ATC { /********************************************************* * Class FE_InterpolateSimpLin - * + * * For computing linear shape functions of simplices, * which are rather different from those computed * in Cartesian coordinates. @@ -895,7 +895,7 @@ namespace ATC { * *********************************************************/ FE_InterpolateSimpLin::FE_InterpolateSimpLin( - FE_Element *feElement) + FE_Element *feElement) : FE_Interpolate(feElement) { set_quadrature(TETRA,GAUSS2); @@ -910,7 +910,7 @@ namespace ATC { VECTOR &N) { int numEltNodes = feElement_->num_elt_nodes(); - + // Fill in for each node for (int inode = 0; inode < numEltNodes; ++inode) { if (inode == 0) { @@ -948,7 +948,7 @@ namespace ATC { // (which map to x, y, and z). Therefore, the derivative in // each dimension are -1. // - // The idea is similar for 2 dimensions, which this can + // The idea is similar for 2 dimensions, which this can // handle as well. for (int idr = 0; idr < nD; ++idr) { if (inode == 0) { @@ -965,7 +965,7 @@ namespace ATC { DENS_MAT &dNdr) const { int numEltNodes = feElement_->num_elt_nodes(); - + // Fill in for each node for (int inode = 0; inode < numEltNodes; ++inode) { // Fill N... diff --git a/lib/atc/FE_Interpolate.h b/lib/atc/FE_Interpolate.h index 9e0b1388c1..6c5d7d1339 100644 --- a/lib/atc/FE_Interpolate.h +++ b/lib/atc/FE_Interpolate.h @@ -22,7 +22,7 @@ namespace ATC { FE_Interpolate(FE_Element *feElement); virtual ~FE_Interpolate(); - + /** compute the quadrature for a given element type */ void set_quadrature(FeEltGeometry geo, FeIntQuadrature quad); @@ -30,14 +30,14 @@ namespace ATC { * quadrature */ virtual void precalculate_shape_functions(); - /** compute the shape functions at the given point; + /** compute the shape functions at the given point; * we use CLON_VECs */ virtual void compute_N(const VECTOR &point, VECTOR &N) = 0; - + // middle args get no names because they won't be used by some // child classes. - /** compute the shape function derivatives at the given point; + /** compute the shape function derivatives at the given point; * generic, so can work for 2D or 3D case */ virtual void compute_dNdr(const VECTOR &point, const int, @@ -51,7 +51,7 @@ namespace ATC { VECTOR &N, DENS_MAT &dNdr) const = 0; - /** compute shape functions at a single point, given the local + /** compute shape functions at a single point, given the local * coordinates; eltCoords needed for derivatives: * indexed: N(node) * dN[nsd](node) */ @@ -72,7 +72,7 @@ namespace ATC { * weights(ip) */ virtual void shape_function(const DENS_MAT &eltCoords, DENS_MAT &N, - std::vector &dN, + std::vector &dN, DIAG_MAT &weights); /** compute shape functions at all face ip's: @@ -132,7 +132,7 @@ namespace ATC { // matrix of shape functions at ip's: N_(ip, node) DENS_MAT N_; - + std::vector dNdr_; // matrix of shape functions at ip's: N_(ip, node) @@ -160,7 +160,7 @@ namespace ATC { virtual void compute_N(const VECTOR &point, VECTOR &N); - + virtual void compute_dNdr(const VECTOR &point, const int numNodes, const int nD, @@ -187,7 +187,7 @@ namespace ATC { virtual void compute_N(const VECTOR &point, VECTOR &N); - + virtual void compute_dNdr(const VECTOR &point, const int numNodes, const int nD, @@ -214,7 +214,7 @@ namespace ATC { virtual void compute_N(const VECTOR &point, VECTOR &N); - + virtual void compute_dNdr(const VECTOR &point, const int numNodes, const int nD, @@ -242,7 +242,7 @@ namespace ATC { virtual void compute_N(const VECTOR &point, VECTOR &N); - + // middle args get no names because they won't be used by some // child classes. virtual void compute_dNdr(const VECTOR &, diff --git a/lib/atc/FE_Mesh.cpp b/lib/atc/FE_Mesh.cpp index 6af29ee37e..a516dbfee8 100644 --- a/lib/atc/FE_Mesh.cpp +++ b/lib/atc/FE_Mesh.cpp @@ -41,10 +41,10 @@ namespace ATC { // class FE_Mesh // ============================================================= FE_Mesh::FE_Mesh() - : decomposition_(false), + : decomposition_(false), lammpsPartition_(false), partitioned_(false), - nNodes_(0), + nNodes_(0), nNodesUnique_(0), feElement_(nullptr), twoDimensional_(false), @@ -66,7 +66,7 @@ namespace ATC { { bool match = false; - if (strcmp(arg[0],"mesh")==0) + if (strcmp(arg[0],"mesh")==0) { /*! \page man_mesh_create_faceset_box fix_modify AtC mesh create_faceset box \section syntax @@ -75,7 +75,7 @@ namespace ATC { - = id to assign to the collection of FE faces - = coordinates of the bounding box that is coincident with the desired FE faces - - = "in" gives inner faces to the box, + - = "in" gives inner faces to the box, "out" gives the outer faces to the box - units = option to specify real as opposed to lattice units \section examples @@ -88,46 +88,46 @@ namespace ATC { \section default The default options are units = lattice and the use of outer faces */ - /*! \page man_mesh_create_faceset_plane fix_modify AtC mesh create_faceset plane + /*! \page man_mesh_create_faceset_plane fix_modify AtC mesh create_faceset plane \section syntax - fix_modify AtC mesh create_faceset plane + fix_modify AtC mesh create_faceset plane [units] - = id to assign to the collection of FE faces - - = coordinate directions that define plane on which faceset lies + - = coordinate directions that define plane on which faceset lies - ,, = plane is specified as the x|y|z=val1 plane bounded by - the segments x|y|z = [lval2,uval2] + the segments x|y|z = [lval2,uval2] - units = option to specify real as opposed to lattice units \section examples fix_modify AtC mesh create_faceset xyplane plane y 0 x -4 0 \section description - Command to assign an id to a set of FE faces. + Command to assign an id to a set of FE faces. \section restrictions - Only viable for rectangular grids. + Only viable for rectangular grids. \section related \section default The default option is units = lattice. */ - if (strcmp(arg[1],"create_faceset")==0) + if (strcmp(arg[1],"create_faceset")==0) { int argIdx = 2; string tag = arg[argIdx++]; - if (strcmp(arg[argIdx],"plane")==0) + if (strcmp(arg[argIdx],"plane")==0) { argIdx++; int ndir, idir[3], isgn; double xlimits[3][2]; parse_plane(argIdx, narg, arg, ndir, idir, isgn, xlimits); - if (xlimits[idir[1]][0] == xlimits[idir[1]][1]) + if (xlimits[idir[1]][0] == xlimits[idir[1]][1]) split_values(xlimits[idir[1]][0],xlimits[idir[1]][1]); - if (xlimits[idir[2]][0] == xlimits[idir[2]][1]) + if (xlimits[idir[2]][0] == xlimits[idir[2]][1]) split_values(xlimits[idir[2]][0],xlimits[idir[2]][1]); parse_units(argIdx,narg,arg, xlimits[0][0],xlimits[0][1], xlimits[1][0],xlimits[1][1], xlimits[2][0],xlimits[2][1]); if (ndir > 1) { - create_faceset(tag, xlimits[idir[0]][0], idir[0], isgn, - idir[1], xlimits[idir[1]][0], xlimits[idir[1]][1], + create_faceset(tag, xlimits[idir[0]][0], idir[0], isgn, + idir[1], xlimits[idir[1]][0], xlimits[idir[1]][1], idir[2], xlimits[idir[2]][0], xlimits[idir[2]][1]); } else { @@ -136,7 +136,7 @@ namespace ATC { match = true; } // bounding_box - else + else { if (strcmp(arg[argIdx],"box")==0) argIdx++; double xmin = parse_min(arg[argIdx++]); @@ -146,7 +146,7 @@ namespace ATC { double zmin = parse_min(arg[argIdx++]); double zmax = parse_max(arg[argIdx++]); bool outward = true; - if (narg > argIdx && (strcmp(arg[argIdx++],"in") == 0)) + if (narg > argIdx && (strcmp(arg[argIdx++],"in") == 0)) outward = false; parse_units(argIdx,narg,arg, xmin,xmax,ymin,ymax,zmin,zmax); create_faceset(tag, xmin, xmax, ymin, ymax, zmin, zmax, outward); @@ -205,7 +205,7 @@ namespace ATC { \section syntax fix_modify AtC mesh add_to_nodeset - - = id of FE nodeset to be added to + - = id of FE nodeset to be added to - = coordinates of the bounding box that contains the desired nodes to be added \section examples @@ -316,13 +316,13 @@ namespace ATC { } /*! \page man_mesh_output fix_modify AtC mesh output \section syntax - fix_modify AtC mesh output + fix_modify AtC mesh output \section examples fix_modify AtC mesh output meshData \n \section description Command to output mesh and associated data: nodesets, facesets, and elementsets. This data is only output once upon initialization since - currently the mesh is static. Creates (binary, "gold" format) Ensight + currently the mesh is static. Creates (binary, "gold" format) Ensight output of mesh data. \section restrictions none @@ -340,11 +340,11 @@ namespace ATC { } // ------------------------------------------------------------- void FE_Mesh::parse_units(int & argIdx, int narg, char ** arg, - double & xmin, double & xmax, double & ymin, double & ymax, + double & xmin, double & xmax, double & ymin, double & ymax, double & zmin, double & zmax) { if (narg > argIdx && (strcmp(arg[argIdx++],"units") == 0)) {} - else + else { // scale from lattice units to physical units xmin *= xscale_; xmax *= xscale_; ymin *= yscale_; ymax *= yscale_; @@ -354,7 +354,7 @@ namespace ATC { // ------------------------------------------------------------- // parse plane // ------------------------------------------------------------- - void FE_Mesh::parse_plane(int & argIdx, int narg, char ** arg, + void FE_Mesh::parse_plane(int & argIdx, int narg, char ** arg, int & ndir, int * idir, int & isgn, double xlimits[][2]) { ndir = 0; @@ -375,14 +375,14 @@ namespace ATC { if (narg > argIdx ) { if (string_to_index(arg[argIdx],i2dir)) { argIdx++; - xlimits[i2dir][0] = parse_min(arg[argIdx++]); + xlimits[i2dir][0] = parse_min(arg[argIdx++]); xlimits[i2dir][1] = parse_max(arg[argIdx++]); idir[ndir++] = i2dir; } if (narg > argIdx ) { if (string_to_index(arg[argIdx],i3dir)) { argIdx++; - xlimits[i3dir][0] = parse_min(arg[argIdx++]); + xlimits[i3dir][0] = parse_min(arg[argIdx++]); xlimits[i3dir][1] = parse_max(arg[argIdx++]); } } @@ -398,13 +398,13 @@ namespace ATC { idir[ndir++] = i3dir; } if ((idir[0]==idir[1]) || (idir[0]==idir[2]) || (idir[1]==idir[2]) ) { - throw ATC_Error( "inconsistent directions in plane:"+to_string(idir[0]+1)+" "+to_string(idir[1]+1)+" "+to_string(idir[2]+1)); + throw ATC_Error( "inconsistent directions in plane:"+to_string(idir[0]+1)+" "+to_string(idir[1]+1)+" "+to_string(idir[2]+1)); } } // ------------------------------------------------------------- // initialize // ------------------------------------------------------------- - void FE_Mesh::initialize(void) + void FE_Mesh::initialize(void) { bool aligned = is_aligned(); @@ -413,15 +413,15 @@ namespace ATC { ATC::LammpsInterface::instance()->print_msg_once("WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive"); // if HEX8 -> orient(); } - bool twoD = is_two_dimensional(); + bool twoD = is_two_dimensional(); if (twoD) { feElement_->set_projection_guess(TWOD_ANALYTIC); - if (feElement_->order()< 3) hasPlanarFaces_ = true; + if (feElement_->order()< 3) hasPlanarFaces_ = true; ATC::LammpsInterface::instance()->print_msg_once(" mesh is two dimensional"); } } //----------------------------------------------------------------- - + //----------------------------------------------------------------- void FE_Mesh::write_mesh(string meshFile) { @@ -460,7 +460,7 @@ namespace ATC { out << name << " " << nset.size() << "\n"; set::const_iterator iter; for (iter = nset.begin(); iter != nset.end(); iter++) { - out << *iter << " " ; + out << *iter << " " ; } out << "\n"; } @@ -478,7 +478,7 @@ namespace ATC { DENS_MAT eltCoords; for (int ielem = 0; ielem < nElts_; ielem++) { element_coordinates(ielem,eltCoords); - feElement_->tangents(eltCoords,xi0,tangents,true); + feElement_->tangents(eltCoords,xi0,tangents,true); for (unsigned i = 0; i < tangents.size(); i++) { // find maximum value for which global axis its closest to @@ -519,7 +519,7 @@ namespace ATC { // element_type // ------------------------------------------------------------- string FE_Mesh::element_type(void) const { - int npe = feElement_->num_elt_nodes(); + int npe = feElement_->num_elt_nodes(); if (npe == 4) { return "TET4"; } else if (npe == 8) { return "HEX8"; } else if (npe == 20) { return "HEX20"; } @@ -541,7 +541,7 @@ namespace ATC { xCoords(isd,inode) = nodalCoords_(isd,id); } } - + } // ------------------------------------------------------------- // position @@ -553,7 +553,7 @@ namespace ATC { const int nne = num_nodes_per_element(); DENS_VEC N; feElement_->shape_function(xi,N); - x.reset(nSD_); + x.reset(nSD_); for (int inode=0; inodesecond; } @@ -665,8 +665,8 @@ namespace ATC { { NODE_SET_MAP::const_iterator iter = elementSetMap_.find(name); if (name == "all") return elementSetAll_; - else if (iter == elementSetMap_.end()) - throw ATC_Error( "No elementset with name " + name + " found."); + else if (iter == elementSetMap_.end()) + throw ATC_Error( "No elementset with name " + name + " found."); else return iter->second; } @@ -683,7 +683,7 @@ namespace ATC { } else { NODE_SET_MAP::const_iterator iter = nodeSetMap_.find(name); - if (iter == nodeSetMap_.end()) + if (iter == nodeSetMap_.end()) throw ATC_Error( "No nodeset with name " + name + " found."); nodeset_to_minimal_elementset(iter->second,elemSet); if (elemSet.size()==0) { @@ -724,7 +724,7 @@ namespace ATC { } else { NODE_SET_MAP::const_iterator iter = nodeSetMap_.find(name); - if (iter == nodeSetMap_.end()) + if (iter == nodeSetMap_.end()) throw ATC_Error( "No nodeset with name " + name + " found."); nodeset_to_maximal_elementset(iter->second,elemSet); if (elemSet.size()==0) { @@ -760,10 +760,10 @@ namespace ATC { { int npe = num_nodes_per_element(); set::const_iterator itr; - for (itr = elemSet.begin(); itr != elemSet.end(); itr++) + for (itr = elemSet.begin(); itr != elemSet.end(); itr++) { int ielem = *itr; - for (int inode=0; inode < npe; inode++) + for (int inode=0; inode < npe; inode++) { int node = element_connectivity_global(ielem, inode); nodeSet.insert(node); @@ -778,22 +778,22 @@ namespace ATC { (const string & name, set nodeSet) const { if (name == "all") - for (int ielem = 0; ielem < nElts_; ielem++) + for (int ielem = 0; ielem < nElts_; ielem++) nodeSet.insert(ielem); - else + else { ELEMENT_SET_MAP::const_iterator iter = elementSetMap_.find(name); - if (iter == elementSetMap_.end()) + if (iter == elementSetMap_.end()) throw ATC_Error( "No elementset with name " + name + " found."); int npe = num_nodes_per_element(); const set &elemSet = iter->second; set::const_iterator itr; - for (itr = elemSet.begin(); itr != elemSet.end(); itr++) + for (itr = elemSet.begin(); itr != elemSet.end(); itr++) { int ielem = *itr; - for (int inode=0; inode < npe; inode++) + for (int inode=0; inode < npe; inode++) { int node = element_connectivity_unique(ielem, inode); nodeSet.insert(node); @@ -818,17 +818,17 @@ namespace ATC { { // return: set - complement_of_set if (name == "all") { return;} - else + else { elementset_to_nodeset(name,nodeSet); set compElemSet; elementset_complement(name,compElemSet); int npe = num_nodes_per_element(); set::const_iterator itr; - for (itr = compElemSet.begin(); itr != compElemSet.end(); itr++) + for (itr = compElemSet.begin(); itr != compElemSet.end(); itr++) { int ielem = *itr; - for (int inode=0; inode < npe; inode++) + for (int inode=0; inode < npe; inode++) { int node = element_connectivity_unique(ielem, inode); nodeSet.erase(node); @@ -846,14 +846,14 @@ namespace ATC { { // return: set - complement_of_set if (name == "all") { return;} - else + else { ELEMENT_SET_MAP::const_iterator iter = elementSetMap_.find(name); - if (iter == elementSetMap_.end()) + if (iter == elementSetMap_.end()) throw ATC_Error( "No elementset with name " + name + " found."); const set &elemSet = iter->second; - for (int ielem = 0; ielem < nElts_; ielem++) + for (int ielem = 0; ielem < nElts_; ielem++) { if(elemSet.find(ielem) == elemSet.end() ) cElemSet.insert(ielem); } @@ -866,7 +866,7 @@ namespace ATC { void FE_Mesh::elementset_complement (const set & elemSet, set & cElemSet) const { - for (int ielem = 0; ielem < nElts_; ielem++) + for (int ielem = 0; ielem < nElts_; ielem++) { if(elemSet.find(ielem) == elemSet.end() ) cElemSet.insert(ielem); } @@ -880,15 +880,15 @@ namespace ATC { for (int inode = 0; inode < nNodesUnique_; inode++) nodeSet.insert(inode); } - else + else { FACE_SET_MAP::const_iterator faceset = faceSetMap_.find(name); - if (faceset == faceSetMap_.end()) + if (faceset == faceSetMap_.end()) throw ATC_Error( "No faceset with name " + name + " found."); const set & faceSet = faceset->second; set::const_iterator iter; Array conn; - for (iter = faceSet.begin(); iter != faceSet.end(); iter++) + for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { PAIR face = *iter; face_connectivity_unique(face,conn); @@ -903,7 +903,7 @@ namespace ATC { { set::const_iterator iter; Array conn; - for (iter = faceSet.begin(); iter != faceSet.end(); iter++) + for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { PAIR face = *iter; face_connectivity_unique(face,conn); @@ -922,15 +922,15 @@ namespace ATC { for (int inode = 0; inode < nNodes_; inode++) nodeSet.insert(inode); } - else + else { FACE_SET_MAP::const_iterator faceset = faceSetMap_.find(name); - if (faceset == faceSetMap_.end()) + if (faceset == faceSetMap_.end()) throw ATC_Error( "No faceset with name " + name + " found."); const set & faceSet = faceset->second; set::const_iterator iter; Array conn; - for (iter = faceSet.begin(); iter != faceSet.end(); iter++) + for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { PAIR face = *iter; face_connectivity(face,conn); @@ -945,7 +945,7 @@ namespace ATC { { set::const_iterator iter; Array conn; - for (iter = faceSet.begin(); iter != faceSet.end(); iter++) + for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { PAIR face = *iter; face_connectivity(face,conn); @@ -983,19 +983,19 @@ namespace ATC { } nodeSetMap_[name] = nodeSet; - if (ATC::LammpsInterface::instance()->rank_zero()) { + if (ATC::LammpsInterface::instance()->rank_zero()) { stringstream ss; - ss << "created nodeset " << name + ss << "created nodeset " << name << " with " << nodeSet.size() << " nodes"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } } void FE_Mesh::create_nodeset(const string & name, - double xmin, + double xmin, double xmax, - double ymin, + double ymin, double ymax, - double zmin, + double zmin, double zmax) { // Make sure we don't already have a nodeset with this name @@ -1027,9 +1027,9 @@ namespace ATC { nodeSetMap_[name] = nodeSet; - if (ATC::LammpsInterface::instance()->rank_zero()) { + if (ATC::LammpsInterface::instance()->rank_zero()) { stringstream ss; - ss << "created nodeset " << name + ss << "created nodeset " << name << " with " << nodeSet.size() << " nodes"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } @@ -1039,11 +1039,11 @@ namespace ATC { // add_to_nodeset // ------------------------------------------------------------- void FE_Mesh::add_to_nodeset(const string & name, - double xmin, + double xmin, double xmax, - double ymin, + double ymin, double ymax, - double zmin, + double zmin, double zmax) { // Make sure we already have a nodeset with this name @@ -1075,7 +1075,7 @@ namespace ATC { nodeSetMap_[name].insert(nodeSet.begin(),nodeSet.end()); - if (ATC::LammpsInterface::instance()->rank_zero()) { + if (ATC::LammpsInterface::instance()->rank_zero()) { stringstream ss; ss << "added " << nodeSet.size() << " nodes to nodeset " << name ; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); @@ -1086,17 +1086,17 @@ namespace ATC { // create_faceset // ------------------------------------------------------------- void FE_Mesh::create_faceset(const string & name, - double xmin, + double xmin, double xmax, - double ymin, + double ymin, double ymax, - double zmin, - double zmax, + double zmin, + double zmax, bool outward) { // Make sure we don't already have a nodeset with this name FACE_SET_MAP::iterator iter = faceSetMap_.find(name); - if (iter != faceSetMap_.end()) + if (iter != faceSetMap_.end()) throw ATC_Error( "A faceset with name " + name + " is already defined."); set faceSet; @@ -1105,24 +1105,24 @@ namespace ATC { const int nf = num_faces_per_element(); const int npf = num_nodes_per_face(); const Array2D & face_conn = local_face_connectivity(); - for (int ielem = 0; ielem < nElts_; ielem++) + for (int ielem = 0; ielem < nElts_; ielem++) { - for (int iface = 0; iface < nf; iface++) + for (int iface = 0; iface < nf; iface++) { bool in = true; - bool on_xmin = true, on_xmax = true; + bool on_xmin = true, on_xmax = true; bool on_ymin = true, on_ymax = true; bool on_zmin = true, on_zmax = true; bool x_neg = false, x_pos = false; bool y_neg = false, y_pos = false; bool z_neg = false, z_pos = false; double x,y,z; - for (int inode = 0; inode < npf; inode++) + for (int inode = 0; inode < npf; inode++) { x = nodalCoords_(0,connectivity_(face_conn(iface,inode),ielem)); y = nodalCoords_(1,connectivity_(face_conn(iface,inode),ielem)); z = nodalCoords_(2,connectivity_(face_conn(iface,inode),ielem)); - + if ( x + tol < xmin) { in = false; break; } if ( x - tol > xmax) { in = false; break; } if ( y + tol < ymin) { in = false; break; } @@ -1139,7 +1139,7 @@ namespace ATC { } if (in) { // note based on structured grid - if (outward) + if (outward) { if (on_xmin && iface==0) { x_neg = true;} if (on_xmax && iface==1) { x_pos = true;} @@ -1148,7 +1148,7 @@ namespace ATC { if (on_zmin && iface==4) { z_neg = true;} if (on_zmax && iface==5) { z_pos = true;} } - else + else { if (on_xmin && iface==1) { x_pos = true;} if (on_xmax && iface==0) { x_neg = true;} @@ -1157,7 +1157,7 @@ namespace ATC { if (on_zmin && iface==5) { z_pos = true;} if (on_zmax && iface==4) { z_neg = true;} } - + if ( (x_neg || x_pos) || (y_neg || y_pos) || (z_neg || z_pos) ) { PAIR face(ielem,iface); faceSet.insert(face); @@ -1168,16 +1168,16 @@ namespace ATC { if (faceSet.empty()) throw ATC_Error( "faceset "+name+" is empty."); faceSetMap_[name] = faceSet; - if (ATC::LammpsInterface::instance()->comm_rank() == 0) { + if (ATC::LammpsInterface::instance()->comm_rank() == 0) { stringstream ss; - ss << "created faceset " << name + ss << "created faceset " << name << " with " << faceSet.size() << " faces"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } } void FE_Mesh::create_faceset(const string & name, - double xRef, + double xRef, int nIdx, int nSgn, int nIdx2, double x2lo, double x2hi, int nIdx3, double x3lo, double x3hi) @@ -1185,7 +1185,7 @@ namespace ATC { double xtol = tolerance(xRef); // Make sure we don't already have a faceset with this name FACE_SET_MAP::iterator iter = faceSetMap_.find(name); - if (iter != faceSetMap_.end()) + if (iter != faceSetMap_.end()) throw ATC_Error( "A faceset with name "+name+" is already defined."); bool finite2 = (nIdx2 >= 0); @@ -1196,9 +1196,9 @@ namespace ATC { int nf = num_faces_per_element(); int npf = num_nodes_per_face(); const Array2D & face_conn = local_face_connectivity(); - for (int ielem = 0; ielem < nElts_; ielem++) + for (int ielem = 0; ielem < nElts_; ielem++) { - for (int iface = 0; iface < nf; iface++) + for (int iface = 0; iface < nf; iface++) { bool in = true; // all nodes must be on the plane @@ -1216,9 +1216,9 @@ namespace ATC { } } // check correct orientation - if (in) + if (in) { - if ( (nIdx == 0 && iface==0 && nSgn == -1) + if ( (nIdx == 0 && iface==0 && nSgn == -1) || (nIdx == 0 && iface==1 && nSgn == 1) || (nIdx == 1 && iface==2 && nSgn == -1) || (nIdx == 1 && iface==3 && nSgn == 1) @@ -1232,13 +1232,13 @@ namespace ATC { } } - if (faceSet.empty()) + if (faceSet.empty()) throw ATC_Error( "faceset "+name+" is empty."); faceSetMap_[name] = faceSet; - if (ATC::LammpsInterface::instance()->comm_rank() == 0) { + if (ATC::LammpsInterface::instance()->comm_rank() == 0) { stringstream ss; - ss << "created faceset " << name + ss << "created faceset " << name << " with " << faceSet.size() << " faces"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } @@ -1248,11 +1248,11 @@ namespace ATC { // create_elementset // ------------------------------------------------------------- void FE_Mesh::create_elementset(const string & name, - double xmin, + double xmin, double xmax, - double ymin, + double ymin, double ymax, - double zmin, + double zmin, double zmax) { // Make sure we don't already have a elementset with this name @@ -1285,11 +1285,11 @@ namespace ATC { // create a minimal element set from all the nodes included in the region set elemSet; int npe = num_nodes_per_element(); - for (int ielem=0; ielem < nElts_; ielem++) + for (int ielem=0; ielem < nElts_; ielem++) { int inode = 0; bool in = true; - while (in && inode < npe) + while (in && inode < npe) { int node = connectivityUnique_(inode, ielem); set::const_iterator iter = nodeSet.find(node); @@ -1304,9 +1304,9 @@ namespace ATC { } elementSetMap_[name] = elemSet; - if (ATC::LammpsInterface::instance()->comm_rank() == 0) { + if (ATC::LammpsInterface::instance()->comm_rank() == 0) { stringstream ss; - ss << "created elementset " << name + ss << "created elementset " << name << " with " << elemSet.size() << " elements"; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } @@ -1349,8 +1349,8 @@ namespace ATC { // ------------------------------------------------------------- // mappings from element id to associated nodes // ------------------------------------------------------------- - - + + void FE_Mesh::element_connectivity_global(const int eltID, Array & nodes) const { @@ -1360,16 +1360,16 @@ namespace ATC { // use connectivity arrays if (decomposition_ && partitioned_) { for (int inode = 0; inode < npe; inode++) { - nodes(inode) = myConnectivity_(inode, map_elem_to_myElem(eltID)); + nodes(inode) = myConnectivity_(inode, map_elem_to_myElem(eltID)); } } else { for (int inode = 0; inode < npe; inode++) { - nodes(inode) = connectivity_(inode, eltID); + nodes(inode) = connectivity_(inode, eltID); } } } // ------------------------------------------------------------- - // + // // ------------------------------------------------------------- void FE_Mesh::element_connectivity_unique(const int eltID, Array & nodes) const @@ -1380,17 +1380,17 @@ namespace ATC { // use connectivity arrays if (decomposition_ && partitioned_) { for (int inode = 0; inode < npe; inode++) { - nodes(inode) = myConnectivityUnique_(inode, map_elem_to_myElem(eltID)); + nodes(inode) = myConnectivityUnique_(inode, map_elem_to_myElem(eltID)); } } else { for (int inode = 0; inode < npe; inode++) { - nodes(inode) = connectivityUnique_(inode, eltID); + nodes(inode) = connectivityUnique_(inode, eltID); } } } // ------------------------------------------------------------- - // + // // ------------------------------------------------------------- int FE_Mesh::element_connectivity_global(const int eltID, const int inode) const @@ -1402,7 +1402,7 @@ namespace ATC { } } // ------------------------------------------------------------- - // + // // ------------------------------------------------------------- int FE_Mesh::element_connectivity_unique(const int eltID, const int inode) const @@ -1414,7 +1414,7 @@ namespace ATC { } } // ------------------------------------------------------------- - // + // // ------------------------------------------------------------- AliasArray FE_Mesh::element_connectivity_global(const int eltID) const { @@ -1425,7 +1425,7 @@ namespace ATC { } } // ------------------------------------------------------------- - // + // // ------------------------------------------------------------- AliasArray FE_Mesh::element_connectivity_unique(const int eltID) const { @@ -1449,23 +1449,23 @@ namespace ATC { int FE_Mesh::map_elem_to_myElem(int elemID) const { - + return elemToMyElemMap_.find(elemID)->second; } int FE_Mesh::map_myElem_to_elem(int myElemID) const { - return myElts_[myElemID]; + return myElts_[myElemID]; } - + // ------------------------------------------------------------- // shape function evaluation // ------------------------------------------------------------- - + // set quadrature scheme pass-through - void FE_Mesh::set_quadrature(FeIntQuadrature type) - { - feElement_->set_quadrature(type); + void FE_Mesh::set_quadrature(FeIntQuadrature type) + { + feElement_->set_quadrature(type); } // shape function evaluation @@ -1475,12 +1475,12 @@ namespace ATC { { // get element id from global coordinates int eltID = map_to_element(x); - + // call appropriate function below, with eltID shape_functions(x,eltID,N,nodeList); } - void FE_Mesh::shape_functions(const DENS_VEC &x, + void FE_Mesh::shape_functions(const DENS_VEC &x, DENS_VEC &N, DENS_MAT &dNdx, Array &nodeList) const @@ -1500,10 +1500,10 @@ namespace ATC { // Get element node coordinates from mesh DENS_MAT eltCoords; element_coordinates(eltID, eltCoords); - + // pass through call feElement_->shape_function(eltCoords,x,N); - + // determine nodes which correspond to shape function indices element_connectivity_unique(eltID,nodeList); } @@ -1520,7 +1520,7 @@ namespace ATC { // pass through call feElement_->shape_function(eltCoords,x,N,dNdx); - + // determine nodes which correspond to shp function indices element_connectivity_unique(eltID,nodeList); } @@ -1536,13 +1536,13 @@ namespace ATC { // pass through call feElement_->shape_function_derivatives(eltCoords,x,dNdx); - + // determine nodes which correspond to shp function indices element_connectivity_unique(eltID,nodeList); } void FE_Mesh::shape_function(const int eltID, - DENS_MAT &N, + DENS_MAT &N, DIAG_MAT &weights) const { // unused data (but required to calc weights) @@ -1553,7 +1553,7 @@ namespace ATC { } void FE_Mesh::shape_function(int eltID, - DENS_MAT &N, + DENS_MAT &N, vector &dN, DIAG_MAT &weights) const { @@ -1572,7 +1572,7 @@ namespace ATC { { int eltID = face.first; int faceID = face.second; - + // Get element node coordinates from mesh DENS_MAT eltCoords; element_coordinates(eltID,eltCoords); @@ -1589,7 +1589,7 @@ namespace ATC { { int eltID = face.first; int faceID = face.second; - + // Get element node coordinates from mesh DENS_MAT eltCoords; element_coordinates(eltID,eltCoords); @@ -1604,7 +1604,7 @@ namespace ATC { { int eltID = face.first; int faceID = face.second; - + // Get element node coordinates from mesh DENS_MAT eltCoords; element_coordinates(eltID,eltCoords); @@ -1639,7 +1639,7 @@ namespace ATC { nodesets[nodeset].reset(size,1); set::const_iterator iter; for (iter = nset.begin(); iter != nset.end(); iter++) { - (nodesets[nodeset])(*iter,0) = 1; + (nodesets[nodeset])(*iter,0) = 1; } subsetData[nodeset] = & nodesets[nodeset]; } @@ -1671,7 +1671,7 @@ namespace ATC { Array nodes; element_connectivity_unique(*iter, nodes); for(int i = 0; i < nodes.size(); ++i) { - (elemsets[elemset])(nodes(i),0) = 1; + (elemsets[elemset])(nodes(i),0) = 1; } } subsetData[elemset] = & elemsets[elemset]; @@ -1690,7 +1690,7 @@ namespace ATC { bool FE_Mesh::is_owned_elt(int elt) const { - return (find(myElts_.begin(), myElts_.end(), elt) != myElts_.end()); + return (find(myElts_.begin(), myElts_.end(), elt) != myElts_.end()); } @@ -1700,9 +1700,9 @@ namespace ATC { // ------------------------------------------------------------- // ------------------------------------------------------------- FE_3DMesh::FE_3DMesh(const string elementType, - const int nNodes, + const int nNodes, const int nElements, - const Array2D *connectivity, + const Array2D *connectivity, const DENS_MAT *nodalCoordinates, const Array periodicity, const Array< pair< string, set > > *nodeSets): @@ -1724,7 +1724,7 @@ namespace ATC { throw ATC_Error("Unrecognized element type specified."); } - + nSD_ = 3; nNodes_ = nNodes; nNodesUnique_ = nNodes; @@ -1739,7 +1739,7 @@ namespace ATC { nodalCoords_ = (*nodalCoordinates); // set minimum element size - minEltSize_ = 1.e20; + minEltSize_ = 1.e20; for (int i=0; i< connectivity_.nCols(); ++i) { int n1 = connectivity_(0,i); int n2 = connectivity_(1,i); @@ -1754,12 +1754,12 @@ namespace ATC { setup_periodicity(); // Create the "all" elementset, the "all" nodeset, and the read-in nodesets. - for (int elem = 0; elem < nElts_; elem++) elementSetAll_.insert(elem); + for (int elem = 0; elem < nElts_; elem++) elementSetAll_.insert(elem); for (int node = 0; node < nNodesUnique_; node++) nodeSetAll_.insert(node); const Array > > & sets = *nodeSets; for (int nodeSet = 0; nodeSet < sets.size(); ++nodeSet) { const set & nset = sets(nodeSet).second; - set copy; + set copy; if (compactRemap_.size() > 0) { for (set::iterator itr = nset.begin(); itr != nset.end(); itr++) { copy.insert(globalToUniqueMap_(compactRemap_(*itr))); @@ -1772,17 +1772,17 @@ namespace ATC { } create_nodeset(sets(nodeSet).first, copy); } - + // Insert nodes and elements into KD-tree for PIE search. if (tree_ == nullptr) { - tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(), nNodes_, + tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(), nNodes_, &nodalCoords_, nElts_, connectivity_); } } FE_3DMesh::~FE_3DMesh() { - if (tree_) delete tree_; + if (tree_) delete tree_; } // ------------------------------------------------------------- @@ -1802,7 +1802,7 @@ namespace ATC { if (periodicity_(2)) { fix_periodicity(3); } if (periodicity_(1)) { fix_periodicity(2); } if (periodicity_(0)) { fix_periodicity(1); } - + // renumber to compact unique numbering // unique nodes map to the same id with global to unique @@ -1914,8 +1914,8 @@ namespace ATC { ATC::LammpsInterface::instance()->print_msg_once(ss.str()); return true; } - - void FE_3DMesh::set_unique_connectivity(void) + + void FE_3DMesh::set_unique_connectivity(void) { int numEltNodes = feElement_->num_elt_nodes(); connectivityUnique_.reset(numEltNodes, nElts_); @@ -1987,14 +1987,14 @@ namespace ATC { // add duplicate coordinates int iNew = nNodes_; int iNewUnique = nNodesUnique_; - for (itr = dupNodes.begin(); itr != dupNodes.end(); + for (itr = dupNodes.begin(); itr != dupNodes.end(); itr++,iNew++) { int iOld = *itr; oldToNewMap[iOld] = iNew; // global ids if (iOld == node_map(iOld)) { // non-image atom - node_map(iNew) = iNewUnique++; - } else { - node_map(iNew) = -1; + node_map(iNew) = iNewUnique++; + } else { + node_map(iNew) = -1; } for(int j = 0; j < nsd; j++) { coordinates(j,iNew) = coordinates(j,iOld); @@ -2002,7 +2002,7 @@ namespace ATC { } nNodes_ = iNew; nNodesUnique_ = iNewUnique; - for (itr = dupNodes.begin(); itr != dupNodes.end(); + for (itr = dupNodes.begin(); itr != dupNodes.end(); itr++,iNew++) { int iOld = *itr; iNew = oldToNewMap[iOld]; // global ids @@ -2016,7 +2016,7 @@ namespace ATC { const int nnf = num_nodes_per_face(); const Array2D & local_conn = feElement_->local_face_conn(); set< PAIR >::iterator iter; - for (iter = faceSet.begin(); iter != faceSet.end(); iter++) + for (iter = faceSet.begin(); iter != faceSet.end(); iter++) { PAIR face = *iter; int eltID=face.first, faceID=face.second; @@ -2026,7 +2026,7 @@ namespace ATC { if (oldToNewMap.find(id) != oldToNewMap.end() ) { int new_id = (*oldToNewMap.find(id)).second; connectivity_(lid,eltID) = new_id; - connectivityUnique_(lid, eltID) = node_map(new_id); + connectivityUnique_(lid, eltID) = node_map(new_id); } } } @@ -2045,7 +2045,7 @@ namespace ATC { set newToOld; map oldToNewMap; elementset_to_nodeset(elementsNew,newToOld); - int nNodesNew = newToOld.size(); + int nNodesNew = newToOld.size(); set::const_iterator itr; // coordinates & node map (from nodes to data) @@ -2073,9 +2073,9 @@ namespace ATC { for(int j = 0; j < nPE; j++) { int old_node = connectivity_(j,ielem); map::iterator map_itr = oldToNewMap.find(old_node); - if (map_itr == oldToNewMap.end()) { - stringstream ss; - ss << "map failure " << old_node << "\n"; + if (map_itr == oldToNewMap.end()) { + stringstream ss; + ss << "map failure " << old_node << "\n"; ATC::LammpsInterface::instance()->print_msg(ss.str()); } int node = map_itr->second; @@ -2089,9 +2089,9 @@ namespace ATC { } // ------------------------------------------------------------- - // partition_mesh + // partition_mesh // ------------------------------------------------------------- - + void FE_3DMesh::partition_mesh() { if (lammpsPartition_) { @@ -2108,8 +2108,8 @@ namespace ATC { // use the KD tree for partitioning, getting more blocks than // processors if (tree_ == nullptr) { - tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(), - nNodes_, &nodalCoords_, + tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(), + nNodes_, &nodalCoords_, nElts_, connectivity_); } @@ -2119,14 +2119,14 @@ namespace ATC { // divide between all processors, we get the next-highest // power of 2. vector > procEltLists = tree_->getElemIDs(depth); - + // Make sure the KD tree is behaving as expected. assert(procEltLists.size() >= nProcs); - + // If the KD-tree was not able to return enough divisions, // duplicate the largest list. - - // elements, then the division would be more even. + + // elements, then the division would be more even. vector >::iterator it; if (numNonempty(procEltLists) < nProcs) { // Find the list of maximum size and assign it to empty processors @@ -2142,7 +2142,7 @@ namespace ATC { } } } - + // We will store the owning processor for each element. int * eltToOwners = new int[nElts_]; for (int i = 0; i < nElts_; ++i) { @@ -2180,7 +2180,7 @@ namespace ATC { partitioned_ = false; } - void FE_3DMesh::prune_duplicate_elements(vector > & procEltLists, + void FE_3DMesh::prune_duplicate_elements(vector > & procEltLists, int * eltToOwners) { int procID = 0; @@ -2195,7 +2195,7 @@ namespace ATC { // record it as belonging to processor *it. if (eltToOwners[*it] == -1) { eltToOwners[*it] = procID; - } + } else { // If it does have a processor in eltToOwners, then we need // to remove it from either processor *topIt or from the processor @@ -2205,7 +2205,7 @@ namespace ATC { // Delete element from processor *topIt, if it has more elements. it = topIt->erase(it); --it; - } + } else { // Delete element from conflicting processor otherwise. toErase = find(conflictingProc->begin(), conflictingProc->end(), *it); @@ -2219,9 +2219,9 @@ namespace ATC { } // ------------------------------------------------------------- - // lammps_partition_mesh + // lammps_partition_mesh // ------------------------------------------------------------- - + void FE_3DMesh::lammps_partition_mesh() { if (LammpsInterface::instance()->domain_triclinic()) { @@ -2234,10 +2234,10 @@ namespace ATC { LammpsInterface::instance()->sub_bounds(xlo, xhi, ylo, yhi, zlo, zhi); LammpsInterface::instance()->box_bounds(boxxlo, boxxhi, boxylo, boxyhi, boxzlo, boxzhi); - + myElts_.clear(); double xCent, yCent, zCent; - + // Assign elements to processors based on the centroid of the element. int numNodes = num_nodes_per_element(); for (int i = 0; i < nElts_; ++i) @@ -2259,7 +2259,7 @@ namespace ATC { if (yCent < boxylo) yCent = boxylo; if (yCent < boxyhi) yCent = boxyhi; if (zCent < boxzlo) zCent = boxzlo; - if (zCent < boxzhi) zCent = boxzhi; + if (zCent < boxzhi) zCent = boxzhi; if ( dbl_geq(xCent, xlo) && ((xhi == boxxhi) || !dbl_geq(xCent, xhi)) && dbl_geq(yCent, ylo) && @@ -2284,13 +2284,13 @@ namespace ATC { nodeset_to_maximal_elementset(nodes,elms); myAndGhostElts_.clear(); set::const_iterator iter; - for (iter=elms.begin(); iter!=elms.end(); iter++) + for (iter=elms.begin(); iter!=elms.end(); iter++) {myAndGhostElts_.push_back(*iter);} distribute_mesh_data(); } partitioned_ = true; return; - + } void FE_3DMesh::redistribute_extra_proclists(vector > &procEltLists, @@ -2300,7 +2300,7 @@ namespace ATC { faceAdjacencies = -1; // Set all values to -1, indicating uninitialized/uncalculated int currentElt, adjacentElt, procID; - + // Put all of the hobos onto one master list, allHomelessElts. list allHomelessElts; vector oneHomelessList; @@ -2309,11 +2309,11 @@ namespace ATC { for (int i = 0; i < nHoboLists; ++i) { current = min_element(procEltLists.begin(), procEltLists.end(), vectorCompSize); oneHomelessList = *current; - allHomelessElts.insert(allHomelessElts.end(), + allHomelessElts.insert(allHomelessElts.end(), oneHomelessList.begin(), oneHomelessList.end()); current->clear(); } - + // Make sure the hobos lose their association with their old processor. list::iterator it; for (it = allHomelessElts.begin(); it != allHomelessElts.end(); it++){ @@ -2322,34 +2322,34 @@ namespace ATC { // Figure out which elements the hobos are adjacent to. That way, they // will know what processors they can be redistributed to. - compute_face_adjacencies(allHomelessElts, faceAdjacencies); + compute_face_adjacencies(allHomelessElts, faceAdjacencies); // Place homeless elements onto lists that correspond to actual processors. while (!allHomelessElts.empty()) { currentElt = allHomelessElts.back(); - + // This will store the ID of the processor with the fewest elements // so far that has an element adjacent to currentElt. PAIR smallestProc(-1, INT_MAX); - + // Iterate over the faces, check the processors of adjacent elements, - // and slate the element to go on the adjacent processor with the fewest + // and slate the element to go on the adjacent processor with the fewest // elements. for (int localFaceID = 0; localFaceID < num_faces_per_element(); ++localFaceID) { - adjacentElt = faceAdjacencies(currentElt, localFaceID); - + adjacentElt = faceAdjacencies(currentElt, localFaceID); + // This means that there is no adjacency through this face. if (adjacentElt >= nElts_) continue; - + procID = eltToOwners[adjacentElt]; // The procID > -1 check makes sure we're not adjacent to another // homeless element by this face, in which case it won't have a // processor to put currentElt onto yet. if (procID > -1 && ((int) procEltLists[procID].size()) < smallestProc.second) { smallestProc = PAIR(procID, procEltLists[procID].size()); - } + } } - + allHomelessElts.pop_back(); // If we couldn't find an adjacent element that had a processor, @@ -2357,7 +2357,7 @@ namespace ATC { if (smallestProc.first == -1) { allHomelessElts.push_front(currentElt); } - // Otherwise, put it onto the processor with the fewest elements that + // Otherwise, put it onto the processor with the fewest elements that // we found. else { procEltLists[smallestProc.first].push_back(currentElt); @@ -2366,8 +2366,8 @@ namespace ATC { } } - - void FE_3DMesh::compute_face_adjacencies(const list &elts, + + void FE_3DMesh::compute_face_adjacencies(const list &elts, DENS_MAT &faceAdjacencies) { list::const_iterator cit; @@ -2382,9 +2382,9 @@ namespace ATC { // Put the first node's elements into the accumulator to start. vector vIntersect = uniqueNodeToElementMap_(faceNodes(0)); vector vCurrent; - // set_intersect requires a vector large enough to contain the - // max possible intersect, which cannot be larger than the entirety - // of the first vector involved. + // set_intersect requires a vector large enough to contain the + // max possible intersect, which cannot be larger than the entirety + // of the first vector involved. vector vTemp(vIntersect.size(), -1); // Find the intersection of each of the nodes' element vectors. for (int ithOnFace = 1; ithOnFace < num_nodes_per_face(); ++ithOnFace) { @@ -2404,32 +2404,32 @@ namespace ATC { if (vIntersect.size() == 2) { // We want to choose the element id of NOT the current // element to be listed as the adjacency. - - // well, but that requires more complicated memoization and + + // well, but that requires more complicated memoization and // this doesn't take much extra time. if (*cit == vIntersect[0]) { faceAdjacencies(*cit, localFaceID) = vIntersect[1]; - } + } else { faceAdjacencies(*cit, localFaceID) = vIntersect[0]; } - } + } // This means the element is on the border. else if (vIntersect.size() == 1) { faceAdjacencies(*cit, localFaceID) = INT_MAX; - } + } else { // This should never ever happen! The nodes should at least // share one element, since they are all on one face! // There should also never be more than two elements on the - // same face... that would defy mathematics and physics in + // same face... that would defy mathematics and physics in // every way. } } } } - // Sometimes we want to count the number of vectors that actually + // Sometimes we want to count the number of vectors that actually // have stuff in them. We use this. int FE_3DMesh::numNonempty(vector > & v) { @@ -2450,10 +2450,10 @@ namespace ATC { vector matches = vector(); // Search through each of the nearest elements - for (vector::iterator elem = candidates.begin(); + for (vector::iterator elem = candidates.begin(); elem < candidates.end(); elem++) { if (contains_point(*elem, query)) { - matches.push_back(*elem); // Keep track of the elements + matches.push_back(*elem); // Keep track of the elements // which contain it } } @@ -2477,7 +2477,7 @@ namespace ATC { } //----------------------------------------------------------------------- - void FE_3DMesh::distribute_mesh_data() + void FE_3DMesh::distribute_mesh_data() { myNElts_ = myElts_.size(); @@ -2531,10 +2531,10 @@ namespace ATC { borders_[1][0] = xmax; borders_[1][1] = ymax; borders_[1][2] = zmax; - L_[0] = xmax-xmin; + L_[0] = xmax-xmin; L_[1] = ymax-ymin; L_[2] = zmax-zmin; - n_[0] = hx_.size(); + n_[0] = hx_.size(); n_[1] = hy_.size(); n_[2] = hz_.size(); // Compute region size and element size @@ -2556,13 +2556,13 @@ namespace ATC { nSD_ = 3; x_.reserve(nSD_); for (int i = 0; i < nSD_; ++i) {x_.push_back(Array(n_[i]+1)); } - Array & xI = x_[0]; + Array & xI = x_[0]; xI(0) = xmin; for (int i = 0; i < n_[0]; ++i) { xI(i+1) = xI(i)+hx_(i); } - Array & yI = x_[1]; + Array & yI = x_[1]; yI(0) = ymin; for (int i = 0; i < n_[1]; ++i) { yI(i+1) = yI(i)+hy_(i); } - Array & zI = x_[2]; + Array & zI = x_[2]; zI(0) = zmin; for (int i = 0; i < n_[2]; ++i) { zI(i+1) = zI(i)+hz_(i); } @@ -2620,9 +2620,9 @@ namespace ATC { } // ------------------------------------------------------------- - // partition_mesh + // partition_mesh // ------------------------------------------------------------- - + void FE_Rectangular3DMesh::partition_mesh() { if (lammpsPartition_) { @@ -2632,7 +2632,7 @@ namespace ATC { if (partitioned_) return; - // Currently this code has been rather naively copied from + // Currently this code has been rather naively copied from // FE_Uniform3DMesh::partition_mesh() // Determine dimensions of mesh in order to partition according to largest dimension. @@ -2645,10 +2645,10 @@ namespace ATC { int numProcs; MPI_Comm_size(MPI_COMM_WORLD, &numProcs); - + int processorRank; MPI_Comm_rank(MPI_COMM_WORLD, &processorRank); - + // Spatially partition along the largest dimension. procs_.clear(); if (max(max(L_[0], L_[1]), L_[2]) == L_[0]) { @@ -2687,9 +2687,9 @@ namespace ATC { myNodes_.push_back(i); } } - + // Distribute each element to the correct processor - assign it to the processor - // which owns its node of lowest index. (this partitioning scheme is unambiguous) + // which owns its node of lowest index. (this partitioning scheme is unambiguous) myElts_.clear(); for (int i = 0; i < nElts_; ++i) { int min = INT_MAX; @@ -2705,7 +2705,7 @@ namespace ATC { /* Commented out because ghost nodes are never used and dx_ is not a member of FE_Rectangular3DMesh. - // Compute the facesets that describes the left and right boundaries + // Compute the facesets that describes the left and right boundaries // in order to determine ghost nodes. int leftMult = 0; while ((leftMult+1)*dx_[partitionAxis_] < procs_[processorRank]) { @@ -2745,13 +2745,13 @@ namespace ATC { nNodesUnique_ = 1; for (int i = 0; i < 3; i++) { nNodesUnique_ *= (n_[i] + 1 - periodicity_(i)); - } - + } + // form maximal nodeset for (int i = 0; i < nNodesUnique_; i++) { - nodeSetAll_.insert(i); + nodeSetAll_.insert(i); } - + // Create global-to-unique map: globalToUniqueMap_(ig) = iu globalToUniqueMap_.reset(nNodes_); uniqueToGlobalMap_.reset(nNodesUnique_); @@ -2762,7 +2762,7 @@ namespace ATC { for (int i = 0; i <= n_[0]; ++i) { int iper = (i == n_[0] && periodicity_(0)) ? 0 : i; int id = i + j*(n_[0]+1) + k*(n_[0]+1)*(n_[1]+1); - int uid = iper + jper*(n_[0]+1-periodicity_(0)) + int uid = iper + jper*(n_[0]+1-periodicity_(0)) + kper*(n_[0]+1-periodicity_(0))*(n_[1]+1-periodicity_(1)); globalToUniqueMap_(id) = uid; uniqueToGlobalMap_(uid) = id; @@ -2773,7 +2773,7 @@ namespace ATC { // form maximal elementset for (int i = 0; i < nElts_; i++) { - elementSetAll_.insert(i); + elementSetAll_.insert(i); } } @@ -2788,7 +2788,7 @@ namespace ATC { int shift = int(diff/L_[i]); if (diff < 0.) shift--; y -= shift*L_[i]; - } + } // project into element ix[i] = x_[i].index(y); if (fabs(y-borders_[0][i]) < tol) { ix[i] = 0; } // on the lower boundary @@ -2898,15 +2898,15 @@ namespace ATC { // ------------------------------------------------------------- // destructor // ------------------------------------------------------------- - FE_Uniform3DMesh::~FE_Uniform3DMesh() + FE_Uniform3DMesh::~FE_Uniform3DMesh() { // Clean up is currently unimplemented } // ------------------------------------------------------------- - // partition_mesh + // partition_mesh // ------------------------------------------------------------- - + void FE_Uniform3DMesh::partition_mesh() { if (lammpsPartition_) { @@ -2926,10 +2926,10 @@ namespace ATC { int numProcs; MPI_Comm_size(MPI_COMM_WORLD, &numProcs); - + int processorRank; MPI_Comm_rank(MPI_COMM_WORLD, &processorRank); - + // Spatially partition along the largest dimension. procs_.clear(); if (max(max(L_[0], L_[1]), L_[2]) == L_[0]) { @@ -2968,9 +2968,9 @@ namespace ATC { myNodes_.push_back(i); } } - + // Distribute each element to the correct processor - assign it to the processor - // which owns its node of lowest index. (this partitioning scheme is unambiguous) + // which owns its node of lowest index. (this partitioning scheme is unambiguous) myElts_.clear(); for (int i = 0; i < nElts_; ++i) { int min = INT_MAX; @@ -2983,7 +2983,7 @@ namespace ATC { } } - // Compute the facesets that describes the left and right boundaries + // Compute the facesets that describes the left and right boundaries // in order to determine ghost nodes. int leftMult = 0; while ((leftMult+1)*dx_[partitionAxis_] < procs_[processorRank]) { @@ -3020,11 +3020,11 @@ namespace ATC { // ------------------------------------------------------------- int FE_Uniform3DMesh::map_to_element(const DENS_VEC &x) const { - // countx[i] is the number of the element, where 1 is the + // countx[i] is the number of the element, where 1 is the // element adjacent to the lower border, in the ith direction int countx[3]; for (int i = 0; i < 3; ++i) { - // handle points on upper boundary; not sure why this is + // handle points on upper boundary; not sure why this is // hard-coded in, though... if (fabs(x(i)-borders_[1][i]) < tol) { countx[i] = n_[i] - 1; @@ -3032,26 +3032,26 @@ namespace ATC { // find the x, y, and z bins for the point in the mesh countx[i] = (int)floor((x(i)-borders_[0][i])/dx_[i]); } - + // handle points out-of-range [0:nx-1] w/ periodicity if (countx[i] < 0 || countx[i] >= n_[i]) { if (periodicity_(i)) { countx[i] = countx[i] % n_[i]; // handles c++ ambiguous mod problems - if (countx[i] < 0) countx[i] += n_[i]; + if (countx[i] < 0) countx[i] += n_[i]; } else { - string msg = " point maps outside " - "of mesh, coordinate " + - index_to_string(i) + " " + to_string(x(i)) + - " not in " + to_string(borders_[0][i]) + + string msg = " point maps outside " + "of mesh, coordinate " + + index_to_string(i) + " " + to_string(x(i)) + + " not in " + to_string(borders_[0][i]) + " : " + to_string(borders_[1][i]); throw ATC_Error(FILELINE,msg); } } } - int elt = countx[2]*(n_[0]*n_[1]) + - countx[1]*n_[0] + + int elt = countx[2]*(n_[0]*n_[1]) + + countx[1]*n_[0] + countx[0]; return elt; } diff --git a/lib/atc/FE_Mesh.h b/lib/atc/FE_Mesh.h index 0b2df7b656..e3a77c4239 100644 --- a/lib/atc/FE_Mesh.h +++ b/lib/atc/FE_Mesh.h @@ -31,7 +31,7 @@ namespace ATC { /** constructor */ FE_Mesh(); - + /** destructor */ virtual ~FE_Mesh(); @@ -65,41 +65,41 @@ namespace ATC { /** evaluate shape function at real coordinates */ void position(const int elem, - const VECTOR &xi, + const VECTOR &xi, DENS_VEC &x) const; /** evaluate shape function at real coordinates */ - void shape_functions(const VECTOR &x, + void shape_functions(const VECTOR &x, DENS_VEC &N, Array &nodeList) const; /** evaluate shape function at real coordinates */ - void shape_functions(const VECTOR &x, + void shape_functions(const VECTOR &x, DENS_VEC &N, Array &nodeList, const Array &) const; /** evaluate shape function at real coordinates */ - void shape_functions(const DENS_VEC &x, + void shape_functions(const DENS_VEC &x, DENS_VEC &N, DENS_MAT &dNdx, Array &nodeList) const; /** evaluate shape function at real coordinates */ - void shape_functions(const VECTOR &x, + void shape_functions(const VECTOR &x, const int eltID, DENS_VEC &N, Array &nodeList) const; /** evaluate shape function at real coordinates */ - void shape_functions(const DENS_VEC &x, + void shape_functions(const DENS_VEC &x, const int eltID, DENS_VEC &N, DENS_MAT &dNdx, Array &nodeList) const; /** evaluate shape function at real coordinates */ - void shape_function_derivatives(const DENS_VEC &x, + void shape_function_derivatives(const DENS_VEC &x, const int eltID, DENS_MAT &dNdx, Array &nodeList) const; @@ -176,7 +176,7 @@ namespace ATC { } } - /** + /** * return spatial coordinates for element nodes on eltID, * indexed xCoords(isd,inode) */ @@ -199,21 +199,21 @@ namespace ATC { virtual int map_to_element(const DENS_VEC &x) const = 0; /** map global node numbering to unique node numbering */ - int map_global_to_unique(const int global_id) const + int map_global_to_unique(const int global_id) const { return globalToUniqueMap_(global_id); } - inline const Array& global_to_unique_map(void) const + inline const Array& global_to_unique_map(void) const { return globalToUniqueMap_; } /** map unique node numbering a global node numbering */ - int map_unique_to_global(const int unique_id) + int map_unique_to_global(const int unique_id) { return uniqueToGlobalMap_(unique_id); } - inline const Array& unique_to_global_map(void) const + inline const Array& unique_to_global_map(void) const { return uniqueToGlobalMap_; } @@ -248,43 +248,43 @@ namespace ATC { /** get the minimal element set from a nodeset by name */ - void nodeset_to_minimal_elementset(const std::string &name, + void nodeset_to_minimal_elementset(const std::string &name, std::set &elemSet) const; /** get the minimal element set from a set of nodes */ - void nodeset_to_minimal_elementset(const std::set &nodeSet, + void nodeset_to_minimal_elementset(const std::set &nodeSet, std::set &elemSet) const; /** get the maximal element set from a nodeset by name */ - void nodeset_to_maximal_elementset(const std::string &name, + void nodeset_to_maximal_elementset(const std::string &name, std::set &elemSet) const; /** get the maximal element set from a set of nodes */ - void nodeset_to_maximal_elementset(const std::set &nodeSet, + void nodeset_to_maximal_elementset(const std::set &nodeSet, std::set &elemSet) const; /** get complement of element set by name */ - void elementset_complement(const std::string &name, + void elementset_complement(const std::string &name, std::set &elemSet) const; - void elementset_complement(const std::set &elemSet, + void elementset_complement(const std::set &elemSet, std::set &elemSetComplement) const; /** get the node set from an element set by name */ - void elementset_to_minimal_nodeset(const std::string &name, + void elementset_to_minimal_nodeset(const std::string &name, std::set &nodeSet) const; - void elementset_to_nodeset(const std::string &name, + void elementset_to_nodeset(const std::string &name, std::set nodeSet) const; - void elementset_to_nodeset(const std::set &elemSet, + void elementset_to_nodeset(const std::set &elemSet, std::set nodeSet) const; std::set elementset_to_nodeset(const std::string &name) const; /** convert faceset to nodeset in _unique_ node numbering */ - void faceset_to_nodeset(const std::string &name, + void faceset_to_nodeset(const std::string &name, std::set &nodeSet) const; - void faceset_to_nodeset(const std::set &faceSet, + void faceset_to_nodeset(const std::set &faceSet, std::set &nodeSet) const; - void faceset_to_nodeset_global(const std::string &name, + void faceset_to_nodeset_global(const std::string &name, std::set &nodeSet) const; - void faceset_to_nodeset_global(const std::set &faceSet, + void faceset_to_nodeset_global(const std::set &faceSet, std::set &nodeSet) const; /** get face set from the string name assigned to the set */ @@ -294,7 +294,7 @@ namespace ATC { void create_faceset(const std::string & name, double xmin, double xmax, double ymin, double ymax, - double zmin, double zmax, + double zmin, double zmax, bool outward); /** create face set with tag "name" from faces aligned with plane */ void create_faceset(const std::string & name, double x, int idir, int isgn, @@ -303,7 +303,7 @@ namespace ATC { /** cut mesh */ virtual void cut_mesh(const std::set & faceSet, const std::set & nodeSet) = 0; - + /** delete elements */ virtual void delete_elements(const std::set & elementList) = 0; @@ -330,10 +330,10 @@ namespace ATC { /** return number of faces per element */ int num_faces_per_element() const; - + /** return number of nodes per face */ int num_nodes_per_face() const; - + /** return number of integration points per face */ int num_ips_per_face() const; @@ -341,7 +341,7 @@ namespace ATC { when mesh is not partitioned. */ Array2D * connectivity(void) { return &connectivity_; } /** return a pointer to the connectivity */ - DENS_MAT * coordinates(void) { return &nodalCoords_;} + DENS_MAT * coordinates(void) { return &nodalCoords_;} /** Engine nodeMap stuff */ Array *node_map(void) { return &globalToUniqueMap_;} @@ -353,19 +353,19 @@ namespace ATC { /** local face connectivity */ const Array2D & local_face_connectivity() const; - - /** element size in each direction */ - virtual void bounding_box(const int ielem, - DENS_VEC & xmin, DENS_VEC & xmax); /** element size in each direction */ - virtual void element_size(const int ielem, - double & hx, double & hy, double & hz); + virtual void bounding_box(const int ielem, + DENS_VEC & xmin, DENS_VEC & xmax); /** element size in each direction */ - virtual double min_element_size(void) const {return 0.0 ;} + virtual void element_size(const int ielem, + double & hx, double & hy, double & hz); - /** get nodal coordinates for a given element */ + /** element size in each direction */ + virtual double min_element_size(void) const {return 0.0 ;} + + /** get nodal coordinates for a given element */ void element_field(const int eltIdx, const DENS_MAT f, DENS_MAT &local_field) { @@ -387,25 +387,25 @@ namespace ATC { virtual double coordinate_tolerance(void) const {return 1.e-8;} /** element type */ - std::string element_type(void) const ; + std::string element_type(void) const ; /** output mesh subsets */ - void output(std::string prefix) const; - + void output(std::string prefix) const; + /* Parallelization data members */ - + /** return element vector for this processor */ const std::vector & owned_elts() const { return myElts_; } - const std::vector & owned_and_ghost_elts() const { + const std::vector & owned_and_ghost_elts() const { return (decomposition_) ? myAndGhostElts_: myElts_; } bool is_owned_elt(int elt) const; - + protected: - void parse_plane(int & argIdx, int narg, char ** arg, + void parse_plane(int & argIdx, int narg, char ** arg, int & ndir, int * idir, int & isgn, double xlimits[][2]); - void parse_units(int & argIdx, int narg, char ** arg, + void parse_units(int & argIdx, int narg, char ** arg, double & xmin, double & xmax, double & ymin, double & ymax, double & zmin, double & zmax); /** will this mesh use data decomposition? */ @@ -488,9 +488,9 @@ namespace ATC { /** maps between my IDs and the total IDs */ std::map elemToMyElemMap_; - + /** Lists of ghost nodes/neighbor ghost nodes */ - std::vector ghostNodesL_; + std::vector ghostNodesL_; std::vector ghostNodesR_; std::vector shareNodesL_; std::vector shareNodesR_; @@ -509,11 +509,11 @@ namespace ATC { class FE_3DMesh : public FE_Mesh { public: /** constructor */ - FE_3DMesh(){}; + FE_3DMesh(){}; /** constructor for read-in mesh **/ // can later be extended to take nodesets, elementsets, etc. - FE_3DMesh(const std::string elementType, + FE_3DMesh(const std::string elementType, const int nNodes, const int nElements, const Array2D *connectivity, @@ -532,34 +532,34 @@ namespace ATC { /** Removes duplicate elements that appear in more than one vector within procEltLists. **/ - void prune_duplicate_elements(std::vector > &procEltLists, + void prune_duplicate_elements(std::vector > &procEltLists, int *eltToOwners); - + /** Takes procEltLists, and if there are more than nProcs of them it takes the extra elements and distributes them to other vectors in procEltLists. */ - + // processors if during pruning processors end up // elementless. This is slightly complicated because of // ghost nodes. void redistribute_extra_proclists(std::vector > &procEltLists, int *eltToOwners, int nProcs); - + /** This takes in a dense matrix and a list of elements and fills in a standard adjacency list (within the matrix) for those elements. **/ - + // the set intersection, which does redundant computations // right now, and filling in the adjacencies for both elements // simultaneously when two elements share a face. - void compute_face_adjacencies(const std::list &elts, + void compute_face_adjacencies(const std::list &elts, DENS_MAT &faceAdjacencies); /** Counts the number of nonempty vectors in a vector of vectors. **/ int numNonempty(std::vector > &v); - - /** In the partitioning, we want to sort vectors of integers by size, - and furthermore we want empty vectors to count as the "largest" + + /** In the partitioning, we want to sort vectors of integers by size, + and furthermore we want empty vectors to count as the "largest" possible vector because they dont want to count in the minimum. **/ struct vectorComparer { bool operator() (std::vector l, std::vector r) { @@ -578,12 +578,12 @@ namespace ATC { } virtual void cut_mesh(const std::set &faceSet, const std::set &nodeSet); - + virtual void delete_elements(const std::set &elementSet); /** map spatial location to element */ virtual int map_to_element(const DENS_VEC &x) const; - + /** sends out data to processors during partitioning */ void distribute_mesh_data(); protected: @@ -610,18 +610,18 @@ namespace ATC { /** * @class FE_Rectangular3DMesh - * @brief Derived class for a structured mesh with - * variable element sizes in x, y, and z directions + * @brief Derived class for a structured mesh with + * variable element sizes in x, y, and z directions */ class FE_Rectangular3DMesh : public FE_3DMesh { public: /** constructor */ - FE_Rectangular3DMesh(){}; + FE_Rectangular3DMesh(){}; FE_Rectangular3DMesh( const Array & hx, const Array & hy, const Array & hz, - const double xmin, const double xmax, + const double xmin, const double xmax, const double ymin, const double ymax, const double zmin, const double zmax, const Array periodicity, @@ -631,13 +631,13 @@ namespace ATC { /** destructor */ virtual ~FE_Rectangular3DMesh() {}; - + void partition_mesh(void); void departition_mesh(void); /** map spatial location to element */ - virtual int map_to_element(const DENS_VEC &x) const; + virtual int map_to_element(const DENS_VEC &x) const; protected: @@ -650,7 +650,7 @@ namespace ATC { /** Region size in each direction */ double L_[3]; - + /** create global-to-unique node mapping */ virtual void setup_periodicity(); // note no "tol" @@ -665,11 +665,11 @@ namespace ATC { /** * @class FE_Uniform3DMesh - * @brief Derived class for a uniform structured mesh with - * fixed element sizes in x, y, and z directions + * @brief Derived class for a uniform structured mesh with + * fixed element sizes in x, y, and z directions */ class FE_Uniform3DMesh : public FE_Rectangular3DMesh { - + public: /** constructor */ @@ -690,8 +690,8 @@ namespace ATC { void partition_mesh(void); void departition_mesh(void); - - virtual void element_size(const int /* ielem */, + + virtual void element_size(const int /* ielem */, double &hx, double &hy, double &hz) { hx = L_[0]/n_[0]; hy = L_[1]/n_[1]; hz = L_[2]/n_[2]; } @@ -699,7 +699,7 @@ namespace ATC { { return std::min(L_[0]/n_[0], std::min(L_[1]/n_[1], L_[2]/n_[2])); } /** map spatial location to element */ - virtual int map_to_element(const DENS_VEC &x) const; + virtual int map_to_element(const DENS_VEC &x) const; private: // only used by this class /** Element size in each direction */ diff --git a/lib/atc/FE_Quadrature.h b/lib/atc/FE_Quadrature.h index 922ade05cb..870b01d279 100644 --- a/lib/atc/FE_Quadrature.h +++ b/lib/atc/FE_Quadrature.h @@ -39,27 +39,27 @@ namespace ATC { ipFaceWeights.reset(numFaceIPs); // "Matrix" of integration point location - ipCoords(0,0) = 0.0; - ipCoords(1,0) = 0.0; + ipCoords(0,0) = 0.0; + ipCoords(1,0) = 0.0; ipCoords(2,0) = 0.0; // Integration point for each face - ipFaceCoords[0](0,0) = -1.0; ipFaceCoords[3](0,0) = 0.0; - ipFaceCoords[0](1,0) = 0.0; ipFaceCoords[3](1,0) = 1.0; + ipFaceCoords[0](0,0) = -1.0; ipFaceCoords[3](0,0) = 0.0; + ipFaceCoords[0](1,0) = 0.0; ipFaceCoords[3](1,0) = 1.0; ipFaceCoords[0](2,0) = 0.0; ipFaceCoords[3](2,0) = 0.0; // - ipFaceCoords[1](0,0) = 1.0; ipFaceCoords[4](0,0) = 0.0; - ipFaceCoords[1](1,0) = 0.0; ipFaceCoords[4](1,0) = 0.0; + ipFaceCoords[1](0,0) = 1.0; ipFaceCoords[4](0,0) = 0.0; + ipFaceCoords[1](1,0) = 0.0; ipFaceCoords[4](1,0) = 0.0; ipFaceCoords[1](2,0) = 0.0; ipFaceCoords[4](2,0) = -1.0; // ipFaceCoords[2](0,0) = 0.0; ipFaceCoords[5](0,0) = 0.0; - ipFaceCoords[2](1,0) = -1.0; ipFaceCoords[5](1,0) = 0.0; + ipFaceCoords[2](1,0) = -1.0; ipFaceCoords[5](1,0) = 0.0; ipFaceCoords[2](2,0) = 0.0; ipFaceCoords[5](2,0) = 1.0; - + // 2D integration scheme for the faces - ipFace2DCoords(0,0) = 0.0; + ipFace2DCoords(0,0) = 0.0; ipFace2DCoords(1,0) = 0.0; - + // Integration point weights ipWeights = 8.0; @@ -85,41 +85,41 @@ namespace ATC { // Dictates difference in node locations for nodal/GAUSS2 double a = 1.0/sqrt(3.0); if (quad == NODAL) a = 1.0; - - // Matrix of integration point locations & follows local + + // Matrix of integration point locations & follows local // conn - ipCoords(0,0) = -a; ipCoords(0,4) = -a; - ipCoords(1,0) = -a; ipCoords(1,4) = -a; + ipCoords(0,0) = -a; ipCoords(0,4) = -a; + ipCoords(1,0) = -a; ipCoords(1,4) = -a; ipCoords(2,0) = -a; ipCoords(2,4) = a; // - ipCoords(0,1) = a; ipCoords(0,5) = a; - ipCoords(1,1) = -a; ipCoords(1,5) = -a; + ipCoords(0,1) = a; ipCoords(0,5) = a; + ipCoords(1,1) = -a; ipCoords(1,5) = -a; ipCoords(2,1) = -a; ipCoords(2,5) = a; // - ipCoords(0,2) = a; ipCoords(0,6) = a; - ipCoords(1,2) = a; ipCoords(1,6) = a; + ipCoords(0,2) = a; ipCoords(0,6) = a; + ipCoords(1,2) = a; ipCoords(1,6) = a; ipCoords(2,2) = -a; ipCoords(2,6) = a; // - ipCoords(0,3) = -a; ipCoords(0,7) = -a; - ipCoords(1,3) = a; ipCoords(1,7) = a; + ipCoords(0,3) = -a; ipCoords(0,7) = -a; + ipCoords(1,3) = a; ipCoords(1,7) = a; ipCoords(2,3) = -a; ipCoords(2,7) = a; // Integration points by face - ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a; - ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1; + ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a; + ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1; ipFaceCoords[0](2,0) = -a; ipFaceCoords[3](2,0) = -a; - // - ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = a; - ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1; - ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = -a; - // - ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a; - ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1; - ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a; - // - ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = -a; - ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1; - ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = a; + // + ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = a; + ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1; + ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = -a; + // + ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a; + ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1; + ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a; + // + ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = -a; + ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1; + ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = a; ipFaceCoords[1](0,0) = 1; ipFaceCoords[4](0,0) = -a; ipFaceCoords[1](1,0) = -a; ipFaceCoords[4](1,0) = -a; @@ -136,30 +136,30 @@ namespace ATC { ipFaceCoords[1](0,3) = 1; ipFaceCoords[4](0,3) = -a; ipFaceCoords[1](1,3) = -a; ipFaceCoords[4](1,3) = a; ipFaceCoords[1](2,3) = a; ipFaceCoords[4](2,3) = -1; - - ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a; - ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a; + + ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a; + ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a; ipFaceCoords[2](2,0) = -a; ipFaceCoords[5](2,0) = 1; - // - ipFaceCoords[2](0,1) = a; ipFaceCoords[5](0,1) = a; - ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a; - ipFaceCoords[2](2,1) = -a; ipFaceCoords[5](2,1) = 1; - // - ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a; - ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a; - ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1; - // - ipFaceCoords[2](0,3) = -a; ipFaceCoords[5](0,3) = -a; - ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a; - ipFaceCoords[2](2,3) = a; ipFaceCoords[5](2,3) = 1; - - // Integration points for all faces ignoring the + // + ipFaceCoords[2](0,1) = a; ipFaceCoords[5](0,1) = a; + ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a; + ipFaceCoords[2](2,1) = -a; ipFaceCoords[5](2,1) = 1; + // + ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a; + ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a; + ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1; + // + ipFaceCoords[2](0,3) = -a; ipFaceCoords[5](0,3) = -a; + ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a; + ipFaceCoords[2](2,3) = a; ipFaceCoords[5](2,3) = 1; + + // Integration points for all faces ignoring the // redundant dim - ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a; - ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a; - // - ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a; - ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a; + ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a; + ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a; + // + ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a; + ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a; // Integration point weights ipWeights = 1.0; @@ -185,36 +185,36 @@ namespace ATC { // Use GAUSS2 for faces for now... double a = 1.0/sqrt(3.0); - - // Matrix of integration point locations - ipCoords(0,0) = 1.0; ipCoords(0,3) = 0.0; - ipCoords(1,0) = 0.0; ipCoords(1,3) = -1.0; + + // Matrix of integration point locations + ipCoords(0,0) = 1.0; ipCoords(0,3) = 0.0; + ipCoords(1,0) = 0.0; ipCoords(1,3) = -1.0; ipCoords(2,0) = 0.0; ipCoords(2,3) = 0.0; - // - ipCoords(0,1) = -1.0; ipCoords(0,4) = 0.0; - ipCoords(1,1) = 0.0; ipCoords(1,4) = 0.0; + // + ipCoords(0,1) = -1.0; ipCoords(0,4) = 0.0; + ipCoords(1,1) = 0.0; ipCoords(1,4) = 0.0; ipCoords(2,1) = 0.0; ipCoords(2,4) = 1.0; - // - ipCoords(0,2) = 0.0; ipCoords(0,5) = 0.0; - ipCoords(1,2) = 1.0; ipCoords(1,5) = 0.0; + // + ipCoords(0,2) = 0.0; ipCoords(0,5) = 0.0; + ipCoords(1,2) = 1.0; ipCoords(1,5) = 0.0; ipCoords(2,2) = 0.0; ipCoords(2,5) = -1.0; // Integration points by face - ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a; - ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1; + ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a; + ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1; ipFaceCoords[0](2,0) = -a; ipFaceCoords[3](2,0) = -a; - // - ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = -a; - ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1; - ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = a; - // - ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a; - ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1; - ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a; - // - ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = a; - ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1; - ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = -a; + // + ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = -a; + ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1; + ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = a; + // + ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a; + ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1; + ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a; + // + ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = a; + ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1; + ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = -a; ipFaceCoords[1](0,0) = 1; ipFaceCoords[4](0,0) = -a; ipFaceCoords[1](1,0) = -a; ipFaceCoords[4](1,0) = -a; @@ -231,30 +231,30 @@ namespace ATC { ipFaceCoords[1](0,3) = 1; ipFaceCoords[4](0,3) = -a; ipFaceCoords[1](1,3) = -a; ipFaceCoords[4](1,3) = a; ipFaceCoords[1](2,3) = a; ipFaceCoords[4](2,3) = -1; - - ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a; - ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a; + + ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a; + ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a; ipFaceCoords[2](2,0) = -a; ipFaceCoords[5](2,0) = 1; - // - ipFaceCoords[2](0,1) = -a; ipFaceCoords[5](0,1) = a; - ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a; - ipFaceCoords[2](2,1) = a; ipFaceCoords[5](2,1) = 1; - // - ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a; - ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a; - ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1; - // - ipFaceCoords[2](0,3) = a; ipFaceCoords[5](0,3) = -a; - ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a; - ipFaceCoords[2](2,3) = -a; ipFaceCoords[5](2,3) = 1; - - // Integration points for all faces ignoring the + // + ipFaceCoords[2](0,1) = -a; ipFaceCoords[5](0,1) = a; + ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a; + ipFaceCoords[2](2,1) = a; ipFaceCoords[5](2,1) = 1; + // + ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a; + ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a; + ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1; + // + ipFaceCoords[2](0,3) = a; ipFaceCoords[5](0,3) = -a; + ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a; + ipFaceCoords[2](2,3) = -a; ipFaceCoords[5](2,3) = 1; + + // Integration points for all faces ignoring the // redundant dim - ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a; - ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a; - // - ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a; - ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a; + ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a; + ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a; + // + ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a; + ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a; // Integration point weights ipWeights = 4.0/3.0; @@ -278,166 +278,166 @@ namespace ATC { ipFaceWeights.reset(numFaceIPs); double a = sqrt(3.0/5.0); - - // Matrix of integration point locations & follows local + + // Matrix of integration point locations & follows local // conn - ipCoords(0,0) = -a; ipCoords(0,16) = -a; - ipCoords(1,0) = -a; ipCoords(1,16) = -a; + ipCoords(0,0) = -a; ipCoords(0,16) = -a; + ipCoords(1,0) = -a; ipCoords(1,16) = -a; ipCoords(2,0) = -a; ipCoords(2,16) = 0; - // - ipCoords(0,1) = a; ipCoords(0,17) = -a; - ipCoords(1,1) = -a; ipCoords(1,17) = a; + // + ipCoords(0,1) = a; ipCoords(0,17) = -a; + ipCoords(1,1) = -a; ipCoords(1,17) = a; ipCoords(2,1) = -a; ipCoords(2,17) = 0; - // - ipCoords(0,2) = a; ipCoords(0,18) = a; - ipCoords(1,2) = a; ipCoords(1,18) = -a; + // + ipCoords(0,2) = a; ipCoords(0,18) = a; + ipCoords(1,2) = a; ipCoords(1,18) = -a; ipCoords(2,2) = -a; ipCoords(2,18) = 0; - // - ipCoords(0,3) = -a; ipCoords(0,19) = a; - ipCoords(1,3) = a; ipCoords(1,19) = a; + // + ipCoords(0,3) = -a; ipCoords(0,19) = a; + ipCoords(1,3) = a; ipCoords(1,19) = a; ipCoords(2,3) = -a; ipCoords(2,19) = 0; - ipCoords(0,4) = -a; ipCoords(0,20) = 0; - ipCoords(1,4) = -a; ipCoords(1,20) = 0; + ipCoords(0,4) = -a; ipCoords(0,20) = 0; + ipCoords(1,4) = -a; ipCoords(1,20) = 0; ipCoords(2,4) = a; ipCoords(2,20) = -a; - - ipCoords(0,5) = a; ipCoords(0,21) = 0; - ipCoords(1,5) = -a; ipCoords(1,21) = 0; + + ipCoords(0,5) = a; ipCoords(0,21) = 0; + ipCoords(1,5) = -a; ipCoords(1,21) = 0; ipCoords(2,5) = a; ipCoords(2,21) = a; - - ipCoords(0,6) = a; ipCoords(0,22) = 0; - ipCoords(1,6) = a; ipCoords(1,22) = -a; + + ipCoords(0,6) = a; ipCoords(0,22) = 0; + ipCoords(1,6) = a; ipCoords(1,22) = -a; ipCoords(2,6) = a; ipCoords(2,22) = 0; - - ipCoords(0,7) = -a; ipCoords(0,23) = 0; - ipCoords(1,7) = a; ipCoords(1,23) = a; + + ipCoords(0,7) = -a; ipCoords(0,23) = 0; + ipCoords(1,7) = a; ipCoords(1,23) = a; ipCoords(2,7) = a; ipCoords(2,23) = 0; - ipCoords(0,8) = 0; ipCoords(0,24) = -a; - ipCoords(1,8) = -a; ipCoords(1,24) = 0; + ipCoords(0,8) = 0; ipCoords(0,24) = -a; + ipCoords(1,8) = -a; ipCoords(1,24) = 0; ipCoords(2,8) = -a; ipCoords(2,24) = 0; - - ipCoords(0,9) = 0; ipCoords(0,25) = a; - ipCoords(1,9) = -a; ipCoords(1,25) = 0; + + ipCoords(0,9) = 0; ipCoords(0,25) = a; + ipCoords(1,9) = -a; ipCoords(1,25) = 0; ipCoords(2,9) = a; ipCoords(2,25) = 0; - - ipCoords(0,10) = 0; ipCoords(0,26) = 0; - ipCoords(1,10) = a; ipCoords(1,26) = 0; + + ipCoords(0,10) = 0; ipCoords(0,26) = 0; + ipCoords(1,10) = a; ipCoords(1,26) = 0; ipCoords(2,10) = -a; ipCoords(2,26) = 0; - - ipCoords(0,11) = 0; - ipCoords(1,11) = a; - ipCoords(2,11) = a; + + ipCoords(0,11) = 0; + ipCoords(1,11) = a; + ipCoords(2,11) = a; ipCoords(0,12) = -a; ipCoords(1,12) = 0; ipCoords(2,12) = -a; - + ipCoords(0,13) = -a; ipCoords(1,13) = 0; ipCoords(2,13) = a; - + ipCoords(0,14) = a; ipCoords(1,14) = 0; ipCoords(2,14) = -a; - + ipCoords(0,15) = a; ipCoords(1,15) = 0; ipCoords(2,15) = a; // Integration points by face - ipFaceCoords[0](0,0) = -1; ipFaceCoords[0](0,5) = -1; - ipFaceCoords[0](1,0) = -a; ipFaceCoords[0](1,5) = 0; + ipFaceCoords[0](0,0) = -1; ipFaceCoords[0](0,5) = -1; + ipFaceCoords[0](1,0) = -a; ipFaceCoords[0](1,5) = 0; ipFaceCoords[0](2,0) = -a; ipFaceCoords[0](2,5) = a; - // - ipFaceCoords[0](0,1) = -1; ipFaceCoords[0](0,6) = -1; - ipFaceCoords[0](1,1) = a; ipFaceCoords[0](1,6) = -a; - ipFaceCoords[0](2,1) = -a; ipFaceCoords[0](2,6) = 0; - // - ipFaceCoords[0](0,2) = -1; ipFaceCoords[0](0,7) = -1; - ipFaceCoords[0](1,2) = a; ipFaceCoords[0](1,7) = a; - ipFaceCoords[0](2,2) = a; ipFaceCoords[0](2,7) = 0; - // - ipFaceCoords[0](0,3) = -1; ipFaceCoords[0](0,8) = -1; - ipFaceCoords[0](1,3) = -a; ipFaceCoords[0](1,8) = 0; - ipFaceCoords[0](2,3) = a; ipFaceCoords[0](2,8) = 0; // - ipFaceCoords[0](0,4) = -1; - ipFaceCoords[0](1,4) = 0; - ipFaceCoords[0](2,4) = -a; - - ipFaceCoords[1](0,0) = 1; ipFaceCoords[1](0,5) = 1; - ipFaceCoords[1](1,0) = -a; ipFaceCoords[1](1,5) = 0; + ipFaceCoords[0](0,1) = -1; ipFaceCoords[0](0,6) = -1; + ipFaceCoords[0](1,1) = a; ipFaceCoords[0](1,6) = -a; + ipFaceCoords[0](2,1) = -a; ipFaceCoords[0](2,6) = 0; + // + ipFaceCoords[0](0,2) = -1; ipFaceCoords[0](0,7) = -1; + ipFaceCoords[0](1,2) = a; ipFaceCoords[0](1,7) = a; + ipFaceCoords[0](2,2) = a; ipFaceCoords[0](2,7) = 0; + // + ipFaceCoords[0](0,3) = -1; ipFaceCoords[0](0,8) = -1; + ipFaceCoords[0](1,3) = -a; ipFaceCoords[0](1,8) = 0; + ipFaceCoords[0](2,3) = a; ipFaceCoords[0](2,8) = 0; + // + ipFaceCoords[0](0,4) = -1; + ipFaceCoords[0](1,4) = 0; + ipFaceCoords[0](2,4) = -a; + + ipFaceCoords[1](0,0) = 1; ipFaceCoords[1](0,5) = 1; + ipFaceCoords[1](1,0) = -a; ipFaceCoords[1](1,5) = 0; ipFaceCoords[1](2,0) = -a; ipFaceCoords[1](2,5) = a; - // - ipFaceCoords[1](0,1) = 1; ipFaceCoords[1](0,6) = 1; - ipFaceCoords[1](1,1) = a; ipFaceCoords[1](1,6) = -a; - ipFaceCoords[1](2,1) = -a; ipFaceCoords[1](2,6) = 0; - // - ipFaceCoords[1](0,2) = 1; ipFaceCoords[1](0,7) = 1; - ipFaceCoords[1](1,2) = a; ipFaceCoords[1](1,7) = a; - ipFaceCoords[1](2,2) = a; ipFaceCoords[1](2,7) = 0; - // - ipFaceCoords[1](0,3) = 1; ipFaceCoords[1](0,8) = 1; - ipFaceCoords[1](1,3) = -a; ipFaceCoords[1](1,8) = 0; - ipFaceCoords[1](2,3) = a; ipFaceCoords[1](2,8) = 0; // - ipFaceCoords[1](0,4) = 1; - ipFaceCoords[1](1,4) = 0; - ipFaceCoords[1](2,4) = -a; - - ipFaceCoords[2](0,0) = -a; ipFaceCoords[2](0,5) = 0; - ipFaceCoords[2](1,0) = -1; ipFaceCoords[2](1,5) = -1; + ipFaceCoords[1](0,1) = 1; ipFaceCoords[1](0,6) = 1; + ipFaceCoords[1](1,1) = a; ipFaceCoords[1](1,6) = -a; + ipFaceCoords[1](2,1) = -a; ipFaceCoords[1](2,6) = 0; + // + ipFaceCoords[1](0,2) = 1; ipFaceCoords[1](0,7) = 1; + ipFaceCoords[1](1,2) = a; ipFaceCoords[1](1,7) = a; + ipFaceCoords[1](2,2) = a; ipFaceCoords[1](2,7) = 0; + // + ipFaceCoords[1](0,3) = 1; ipFaceCoords[1](0,8) = 1; + ipFaceCoords[1](1,3) = -a; ipFaceCoords[1](1,8) = 0; + ipFaceCoords[1](2,3) = a; ipFaceCoords[1](2,8) = 0; + // + ipFaceCoords[1](0,4) = 1; + ipFaceCoords[1](1,4) = 0; + ipFaceCoords[1](2,4) = -a; + + ipFaceCoords[2](0,0) = -a; ipFaceCoords[2](0,5) = 0; + ipFaceCoords[2](1,0) = -1; ipFaceCoords[2](1,5) = -1; ipFaceCoords[2](2,0) = -a; ipFaceCoords[2](2,5) = a; - // - ipFaceCoords[2](0,1) = -a; ipFaceCoords[2](0,6) = -a; - ipFaceCoords[2](1,1) = -1; ipFaceCoords[2](1,6) = -1; - ipFaceCoords[2](2,1) = a; ipFaceCoords[2](2,6) = 0; - // - ipFaceCoords[2](0,2) = a; ipFaceCoords[2](0,7) = a; - ipFaceCoords[2](1,2) = -1; ipFaceCoords[2](1,7) = -1; - ipFaceCoords[2](2,2) = a; ipFaceCoords[2](2,7) = 0; - // - ipFaceCoords[2](0,3) = a; ipFaceCoords[2](0,8) = 0; - ipFaceCoords[2](1,3) = -1; ipFaceCoords[2](1,8) = -1; - ipFaceCoords[2](2,3) = -a; ipFaceCoords[2](2,8) = 0; - // - ipFaceCoords[2](0,4) = 0; - ipFaceCoords[2](1,4) = -1; - ipFaceCoords[2](2,4) = -a; - - ipFaceCoords[3](0,0) = -a; ipFaceCoords[3](0,5) = 0; - ipFaceCoords[3](1,0) = 1; ipFaceCoords[3](1,5) = 1; + // + ipFaceCoords[2](0,1) = -a; ipFaceCoords[2](0,6) = -a; + ipFaceCoords[2](1,1) = -1; ipFaceCoords[2](1,6) = -1; + ipFaceCoords[2](2,1) = a; ipFaceCoords[2](2,6) = 0; + // + ipFaceCoords[2](0,2) = a; ipFaceCoords[2](0,7) = a; + ipFaceCoords[2](1,2) = -1; ipFaceCoords[2](1,7) = -1; + ipFaceCoords[2](2,2) = a; ipFaceCoords[2](2,7) = 0; + // + ipFaceCoords[2](0,3) = a; ipFaceCoords[2](0,8) = 0; + ipFaceCoords[2](1,3) = -1; ipFaceCoords[2](1,8) = -1; + ipFaceCoords[2](2,3) = -a; ipFaceCoords[2](2,8) = 0; + // + ipFaceCoords[2](0,4) = 0; + ipFaceCoords[2](1,4) = -1; + ipFaceCoords[2](2,4) = -a; + + ipFaceCoords[3](0,0) = -a; ipFaceCoords[3](0,5) = 0; + ipFaceCoords[3](1,0) = 1; ipFaceCoords[3](1,5) = 1; ipFaceCoords[3](2,0) = -a; ipFaceCoords[3](2,5) = a; - // - ipFaceCoords[3](0,1) = -a; ipFaceCoords[3](0,6) = -a; - ipFaceCoords[3](1,1) = 1; ipFaceCoords[3](1,6) = 1; - ipFaceCoords[3](2,1) = a; ipFaceCoords[3](2,6) = 0; - // - ipFaceCoords[3](0,2) = a; ipFaceCoords[3](0,7) = a; - ipFaceCoords[3](1,2) = 1; ipFaceCoords[3](1,7) = 1; - ipFaceCoords[3](2,2) = a; ipFaceCoords[3](2,7) = 0; - // - ipFaceCoords[3](0,3) = a; ipFaceCoords[3](0,8) = 0; - ipFaceCoords[3](1,3) = 1; ipFaceCoords[3](1,8) = 1; - ipFaceCoords[3](2,3) = -a; ipFaceCoords[3](2,8) = 0; - // - ipFaceCoords[3](0,4) = 0; - ipFaceCoords[3](1,4) = 1; - ipFaceCoords[3](2,4) = -a; - + // + ipFaceCoords[3](0,1) = -a; ipFaceCoords[3](0,6) = -a; + ipFaceCoords[3](1,1) = 1; ipFaceCoords[3](1,6) = 1; + ipFaceCoords[3](2,1) = a; ipFaceCoords[3](2,6) = 0; + // + ipFaceCoords[3](0,2) = a; ipFaceCoords[3](0,7) = a; + ipFaceCoords[3](1,2) = 1; ipFaceCoords[3](1,7) = 1; + ipFaceCoords[3](2,2) = a; ipFaceCoords[3](2,7) = 0; + // + ipFaceCoords[3](0,3) = a; ipFaceCoords[3](0,8) = 0; + ipFaceCoords[3](1,3) = 1; ipFaceCoords[3](1,8) = 1; + ipFaceCoords[3](2,3) = -a; ipFaceCoords[3](2,8) = 0; + // + ipFaceCoords[3](0,4) = 0; + ipFaceCoords[3](1,4) = 1; + ipFaceCoords[3](2,4) = -a; + ipFaceCoords[4](0,0) = -a; ipFaceCoords[4](0,5) = 0; ipFaceCoords[4](1,0) = -a; ipFaceCoords[4](1,5) = a; ipFaceCoords[4](2,0) = -1; ipFaceCoords[4](2,5) = -1; - // + // ipFaceCoords[4](0,1) = a; ipFaceCoords[4](0,6) = -a; ipFaceCoords[4](1,1) = -a; ipFaceCoords[4](1,6) = 0; ipFaceCoords[4](2,1) = -1; ipFaceCoords[4](2,6) = -1; - // + // ipFaceCoords[4](0,2) = a; ipFaceCoords[4](0,7) = a; ipFaceCoords[4](1,2) = a; ipFaceCoords[4](1,7) = 0; ipFaceCoords[4](2,2) = -1; ipFaceCoords[4](2,7) = -1; - // + // ipFaceCoords[4](0,3) = -a; ipFaceCoords[4](0,8) = 0; ipFaceCoords[4](1,3) = a; ipFaceCoords[4](1,8) = 0; ipFaceCoords[4](2,3) = -1; ipFaceCoords[4](2,8) = -1; @@ -445,19 +445,19 @@ namespace ATC { ipFaceCoords[4](0,4) = 0; ipFaceCoords[4](1,4) = -a; ipFaceCoords[4](2,4) = -1; - + ipFaceCoords[5](0,0) = -a; ipFaceCoords[5](0,5) = 0; ipFaceCoords[5](1,0) = -a; ipFaceCoords[5](1,5) = a; ipFaceCoords[5](2,0) = 1; ipFaceCoords[5](2,5) = 1; - // + // ipFaceCoords[5](0,1) = a; ipFaceCoords[5](0,6) = -a; ipFaceCoords[5](1,1) = -a; ipFaceCoords[5](1,6) = 0; ipFaceCoords[5](2,1) = 1; ipFaceCoords[5](2,6) = 1; - // + // ipFaceCoords[5](0,2) = a; ipFaceCoords[5](0,7) = a; ipFaceCoords[5](1,2) = a; ipFaceCoords[5](1,7) = 0; ipFaceCoords[5](2,2) = 1; ipFaceCoords[5](2,7) = 1; - // + // ipFaceCoords[5](0,3) = -a; ipFaceCoords[5](0,8) = 0; ipFaceCoords[5](1,3) = a; ipFaceCoords[5](1,8) = 0; ipFaceCoords[5](2,3) = 1; ipFaceCoords[5](2,8) = 1; @@ -465,23 +465,23 @@ namespace ATC { ipFaceCoords[5](0,4) = 0; ipFaceCoords[5](1,4) = -a; ipFaceCoords[5](2,4) = 1; - - // Integration points for all faces ignoring the + + // Integration points for all faces ignoring the // redundant dim - ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,5) = 0; - ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,5) = a; - // - ipFace2DCoords(0,1) = a; ipFace2DCoords(0,6) = -a; - ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,6) = 0; + ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,5) = 0; + ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,5) = a; // - ipFace2DCoords(0,2) = a; ipFace2DCoords(0,7) = a; - ipFace2DCoords(1,2) = a; ipFace2DCoords(1,7) = 0; - // - ipFace2DCoords(0,3) = -a; ipFace2DCoords(0,8) = 0; - ipFace2DCoords(1,3) = a; ipFace2DCoords(1,8) = 0; - // - ipFace2DCoords(0,4) = 0; - ipFace2DCoords(1,4) = -a; + ipFace2DCoords(0,1) = a; ipFace2DCoords(0,6) = -a; + ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,6) = 0; + // + ipFace2DCoords(0,2) = a; ipFace2DCoords(0,7) = a; + ipFace2DCoords(1,2) = a; ipFace2DCoords(1,7) = 0; + // + ipFace2DCoords(0,3) = -a; ipFace2DCoords(0,8) = 0; + ipFace2DCoords(1,3) = a; ipFace2DCoords(1,8) = 0; + // + ipFace2DCoords(0,4) = 0; + ipFace2DCoords(1,4) = -a; // Integration point weights for (int i=0; i & rhsMask // copy + const Array2D< bool > & rhsMask // copy ) : atc_(atc), feEngine_(feEngine), @@ -35,20 +35,20 @@ FieldEulerIntegrator::FieldEulerIntegrator( // ==================================================================== FieldExplicitEulerIntegrator::FieldExplicitEulerIntegrator( const FieldName fieldName, - const PhysicsModel * physicsModel, + const PhysicsModel * physicsModel, /*const*/ FE_Engine * feEngine, /*const*/ ATC_Coupling * atc, - const Array2D< bool > & rhsMask // copy + const Array2D< bool > & rhsMask // copy ) : FieldEulerIntegrator(fieldName,physicsModel,feEngine,atc,rhsMask) { } // -------------------------------------------------------------------- -// update +// update // -------------------------------------------------------------------- void FieldExplicitEulerIntegrator::update(const double dt, double /* time */, FIELDS & fields, FIELDS & rhs) -{ +{ // write and add update mass matrix to handled time variation // update mass matrix to be consistent/lumped, and handle this in apply_inverse_mass_matrix atc_->compute_rhs_vector(rhsMask_, fields, rhs, @@ -63,14 +63,14 @@ FieldExplicitEulerIntegrator::FieldExplicitEulerIntegrator( // ==================================================================== FieldImplicitEulerIntegrator::FieldImplicitEulerIntegrator( const FieldName fieldName, - const PhysicsModel * physicsModel, + const PhysicsModel * physicsModel, /*const*/ FE_Engine * feEngine, /*const*/ ATC_Coupling * atc, - const Array2D< bool > & rhsMask, // copy + const Array2D< bool > & rhsMask, // copy const double alpha ) : FieldEulerIntegrator(fieldName,physicsModel,feEngine,atc,rhsMask), alpha_(alpha), - dT_(1.0e-6), + dT_(1.0e-6), maxRestarts_(50), maxIterations_(1000), tol_(1.0e-8) @@ -78,17 +78,17 @@ FieldImplicitEulerIntegrator::FieldImplicitEulerIntegrator( } // -------------------------------------------------------------------- -// update +// update // -------------------------------------------------------------------- void FieldImplicitEulerIntegrator::update(const double dt, double time, - FIELDS & fields, FIELDS & /* rhs */) + FIELDS & fields, FIELDS & /* rhs */) { // solver handles bcs - FieldImplicitSolveOperator solver(atc_, + FieldImplicitSolveOperator solver(atc_, fields, fieldName_, rhsMask_, physicsModel_, time, dt, alpha_); DiagonalMatrix preconditioner = solver.preconditioner(); DENS_VEC rT = solver.r(); - DENS_VEC dT(nNodes_); dT = dT_; + DENS_VEC dT(nNodes_); dT = dT_; DENS_MAT H(maxRestarts_+1, maxRestarts_); double tol = tol_; // tol returns the residual int iterations = maxIterations_; // iterations returns number of iterations @@ -106,10 +106,10 @@ void FieldImplicitEulerIntegrator::update(const double dt, double time, // ==================================================================== FieldImplicitDirectEulerIntegrator::FieldImplicitDirectEulerIntegrator( const FieldName fieldName, - const PhysicsModel * physicsModel, + const PhysicsModel * physicsModel, /*const*/ FE_Engine * feEngine, /*const*/ ATC_Coupling * atc, - const Array2D< bool > & rhsMask, // copy + const Array2D< bool > & rhsMask, // copy const double alpha ) : FieldEulerIntegrator(fieldName,physicsModel,feEngine,atc,rhsMask), alpha_(alpha),solver_(nullptr) @@ -125,24 +125,24 @@ FieldImplicitDirectEulerIntegrator::~FieldImplicitDirectEulerIntegrator() } // -------------------------------------------------------------------- -// initialize +// initialize // -------------------------------------------------------------------- void FieldImplicitDirectEulerIntegrator::initialize(const double dt, double /* time */, - FIELDS & /* fields */) -{ + FIELDS & /* fields */) +{ std::pair p(fieldName_,fieldName_); Array2D rmask = atc_->rhs_mask(); - rmask(fieldName_,FLUX) = true; + rmask(fieldName_,FLUX) = true; atc_->tangent_matrix(p,rmask,physicsModel_,_K_); _lhsMK_ = (1./dt)*(_M_)- alpha_*(_K_); _rhsMK_ = (1./dt)*(_M_)+(1.+alpha_)*(_K_); } // -------------------------------------------------------------------- -// update +// update // -------------------------------------------------------------------- void FieldImplicitDirectEulerIntegrator::update(const double /* dt */, double /* time */, - FIELDS & fields, FIELDS & rhs) -{ + FIELDS & fields, FIELDS & rhs) +{ atc_->compute_rhs_vector(rhsMask_, fields, rhs, FULL_DOMAIN, physicsModel_); CLON_VEC myRhs = column( rhs[fieldName_].set_quantity(),0); diff --git a/lib/atc/FieldEulerIntegrator.h b/lib/atc/FieldEulerIntegrator.h index fc3863311c..23df8a1c18 100644 --- a/lib/atc/FieldEulerIntegrator.h +++ b/lib/atc/FieldEulerIntegrator.h @@ -60,7 +60,7 @@ class FieldEulerIntegrator { const PhysicsModel * physicsModel_; /** field name */ - FieldName fieldName_; + FieldName fieldName_; /** rhs mask */ Array2D rhsMask_; diff --git a/lib/atc/FieldManager.cpp b/lib/atc/FieldManager.cpp index 8a7fb0d50b..c8874d49d2 100644 --- a/lib/atc/FieldManager.cpp +++ b/lib/atc/FieldManager.cpp @@ -22,7 +22,7 @@ typedef PerAtomQuantity PAQ; //----------------------------------------------------------------------------- //* restricted_atom_quantity //----------------------------------------------------------------------------- - DENS_MAN * FieldManager::restricted_atom_quantity(FieldName field, string name, PAQ * atomicQuantity) + DENS_MAN * FieldManager::restricted_atom_quantity(FieldName field, string name, PAQ * atomicQuantity) { if (name == "default") { name = field_to_restriction_name(field); } DENS_MAN * quantity = interscaleManager_.dense_matrix(name); @@ -35,7 +35,7 @@ typedef PerAtomQuantity PAQ; atomicQuantity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS); } else { - + if (!atomicQuantity) { throw ATC_Error("FieldManager::restricted_atom_quantity - need to supply PAQ if restricted quantity does not already exist"); } @@ -68,18 +68,18 @@ typedef PerAtomQuantity PAQ; if (atc_->kernel_on_the_fly()) { if (atc_->kernel_based()) { - quantity = new OnTheFlyKernelAccumulationNormalized(atc_, atomic, - atc_->kernel_function(), - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyKernelAccumulationNormalized(atc_, atomic, + atc_->kernel_function(), + atc_->atom_coarsegraining_positions(), normalization); } else { - quantity = new OnTheFlyMeshAccumulationNormalized(atc_, atomic, - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyMeshAccumulationNormalized(atc_, atomic, + atc_->atom_coarsegraining_positions(), normalization); } } else { - quantity = new AtfProjection(atc_, atomic, - atc_->accumulant(), + quantity = new AtfProjection(atc_, atomic, + atc_->accumulant(), normalization); } interscaleManager_.add_dense_matrix(quantity,name); @@ -102,21 +102,21 @@ typedef PerAtomQuantity PAQ; } else if (atc_->kernel_on_the_fly()) { if (atc_->kernel_based()) { - quantity = new OnTheFlyKernelAccumulationNormalizedReferenced(atc_, - atomic, - atc_->kernel_function(), - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyKernelAccumulationNormalizedReferenced(atc_, + atomic, + atc_->kernel_function(), + atc_->atom_coarsegraining_positions(), normalization, reference); } else { - quantity = new OnTheFlyMeshAccumulationNormalizedReferenced(atc_, - atomic, - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyMeshAccumulationNormalizedReferenced(atc_, + atomic, + atc_->atom_coarsegraining_positions(), normalization, reference); } } else { - quantity = new AtfProjectionReferenced(atc_, atomic, + quantity = new AtfProjectionReferenced(atc_, atomic, atc_->accumulant(), reference, normalization); @@ -141,14 +141,14 @@ typedef PerAtomQuantity PAQ; } else if (atc_->kernel_on_the_fly()) { if (atc_->kernel_based()) { - quantity = new OnTheFlyKernelAccumulationNormalizedScaled(atc_, atomic, - atc_->kernel_function(), - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyKernelAccumulationNormalizedScaled(atc_, atomic, + atc_->kernel_function(), + atc_->atom_coarsegraining_positions(), normalization, scale); } else { - quantity = new OnTheFlyMeshAccumulationNormalizedScaled(atc_, atomic, - atc_->atom_coarsegraining_positions(), + quantity = new OnTheFlyMeshAccumulationNormalizedScaled(atc_, atomic, + atc_->atom_coarsegraining_positions(), normalization, scale); } @@ -203,7 +203,7 @@ typedef PerAtomQuantity PAQ; return projected_atom_quantity(NUMBER_DENSITY,name,atomic,atc_->accumulant_inverse_volumes()); } //----------------------------------------------------------------------------- -//* MOMENTUM +//* MOMENTUM //----------------------------------------------------------------------------- DENS_MAN * FieldManager::momentum(string name) { @@ -215,7 +215,7 @@ typedef PerAtomQuantity PAQ; return projected_atom_quantity(MOMENTUM,name,atomic,atc_->accumulant_inverse_volumes()); } //----------------------------------------------------------------------------- -//* VELOCITY +//* VELOCITY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::velocity(string name) { @@ -243,7 +243,7 @@ typedef PerAtomQuantity PAQ; return v; } //----------------------------------------------------------------------------- -//* PROJECTED_VELOCITY +//* PROJECTED_VELOCITY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::projected_velocity(string name) { @@ -251,7 +251,7 @@ typedef PerAtomQuantity PAQ; return projected_atom_quantity(PROJECTED_VELOCITY,name,atomic,atc_->accumulant_inverse_volumes()); } //----------------------------------------------------------------------------- -//* DISPLACEMENT +//* DISPLACEMENT //----------------------------------------------------------------------------- DENS_MAN * FieldManager::displacement(string name) { @@ -261,8 +261,8 @@ typedef PerAtomQuantity PAQ; PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicMassWeightedDisplacement"); if (!atomic) { - FundamentalAtomQuantity * atomMasses = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS); - FundamentalAtomQuantity * atomPositions = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION); + FundamentalAtomQuantity * atomMasses = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS); + FundamentalAtomQuantity * atomPositions = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION); atomic = new AtomicMassWeightedDisplacement(atc_,atomPositions, atomMasses, atc_->atom_reference_positions(), INTERNAL); interscaleManager_.add_per_atom_quantity(atomic,"AtomicMassWeightedDisplacement"); } @@ -296,12 +296,12 @@ typedef PerAtomQuantity PAQ; return u; } //----------------------------------------------------------------------------- -//* REFERENCE_POTENTIAL_ENERGY +//* REFERENCE_POTENTIAL_ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::reference_potential_energy(string /* name */) { DENS_MAN * rpe = interscaleManager_.dense_matrix(field_to_string(REFERENCE_POTENTIAL_ENERGY)); - if (! rpe ) { + if (! rpe ) { PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicReferencePotential"); if (!atomic) { atomic = new AtcAtomQuantity(atc_); @@ -334,7 +334,7 @@ typedef PerAtomQuantity PAQ; return rpe; } //----------------------------------------------------------------------------- -//* POTENTIAL_ENERGY +//* POTENTIAL_ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::potential_energy(string name) { @@ -352,7 +352,7 @@ typedef PerAtomQuantity PAQ; } } //----------------------------------------------------------------------------- -//* TEMPERATURE +//* TEMPERATURE //----------------------------------------------------------------------------- DENS_MAN * FieldManager::temperature(string name) { @@ -367,10 +367,10 @@ typedef PerAtomQuantity PAQ; { double Tcoef = 1./((atc_->nsd())*(atc_->lammps_interface())->kBoltzmann()); PAQ * atomic = per_atom_quantity("AtomicTwiceKineticEnergy"); - return scaled_projected_atom_quantity(KINETIC_TEMPERATURE,name,atomic,Tcoef,atc_->accumulant_weights()); + return scaled_projected_atom_quantity(KINETIC_TEMPERATURE,name,atomic,Tcoef,atc_->accumulant_weights()); } //----------------------------------------------------------------------------- -//* THERMAL_ENERGY +//* THERMAL_ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::thermal_energy(string name) { @@ -379,7 +379,7 @@ typedef PerAtomQuantity PAQ; return scaled_projected_atom_quantity(THERMAL_ENERGY,name,atomic,Ecoef,atc_->accumulant_inverse_volumes()); } //----------------------------------------------------------------------------- -//* KINETIC_ENERGY +//* KINETIC_ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::kinetic_energy(string name) { @@ -405,7 +405,7 @@ typedef PerAtomQuantity PAQ; return projected_atom_quantity(SPECIES_FLUX,name,atomic,atc_->accumulant_inverse_volumes()); } //----------------------------------------------------------------------------- -//* INTERNAL_ENERGY +//* INTERNAL_ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::internal_energy(string name) { @@ -417,7 +417,7 @@ typedef PerAtomQuantity PAQ; return ie; } //----------------------------------------------------------------------------- -//* ENERGY +//* ENERGY //----------------------------------------------------------------------------- DENS_MAN * FieldManager::energy(string name) { @@ -454,7 +454,7 @@ typedef PerAtomQuantity PAQ; return atomic; } //----------------------------------------------------------------------------- -//* 2 KE +//* 2 KE //----------------------------------------------------------------------------- PAQ * FieldManager::atomic_twice_kinetic_energy() { @@ -503,7 +503,7 @@ typedef PerAtomQuantity PAQ; PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicSpeciesVelocity"); if (!atomic) { PAQ * atomVelocity = atomic_fluctuating_velocity(); - PAQ * atomSpecies = atomic_species_vector(); + PAQ * atomSpecies = atomic_species_vector(); atomic = new SpeciesVelocity(atc_,atomVelocity,atomSpecies); interscaleManager_.add_per_atom_quantity(atomic, "AtomicSpeciesVelocity"); } @@ -529,8 +529,8 @@ typedef PerAtomQuantity PAQ; { PAQ * quantity = interscaleManager_.per_atom_quantity(field_to_prolongation_name(field)); if (!quantity) { - - + + DENS_MAN * coarseQuantity = interscaleManager_.dense_matrix(field_to_string(field)); if (!coarseQuantity) coarseQuantity = nodal_atomic_field(field); if (!coarseQuantity) throw ATC_Error("can not prolong quantity: " + field_to_string(field) + " no field registered"); diff --git a/lib/atc/FieldManager.h b/lib/atc/FieldManager.h index b12db230c5..9deb6acc0a 100644 --- a/lib/atc/FieldManager.h +++ b/lib/atc/FieldManager.h @@ -17,7 +17,7 @@ namespace ATC { PROLONGED_VELOCITY}; typedef PerAtomQuantity PAQ; /** - * @class FieldManager + * @class FieldManager * @brief Manager for constructing fields from atomic data */ class FieldManager{ @@ -26,7 +26,7 @@ namespace ATC { FieldManager(ATC_Method * atc); virtual ~FieldManager(void){}; /** this function returns a (density) field derived from atomic data */ - DENS_MAN * nodal_atomic_field(FieldName fieldName, + DENS_MAN * nodal_atomic_field(FieldName fieldName, std::string name = "default") { switch (fieldName) { case CHARGE_DENSITY: return charge_density(name); @@ -51,17 +51,17 @@ namespace ATC { } } CanonicalName string_to_canonical_name(std::string name){ - if (name == "AtomicTwiceFluctuatingKineticEnergy") + if (name == "AtomicTwiceFluctuatingKineticEnergy") return ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY; - else if (name == "AtomicTwiceKineticEnergy") + else if (name == "AtomicTwiceKineticEnergy") return ATOMIC_TWICE_KINETIC_ENERGY; - else if (name == "AtomicTwiceKineticEnergy") + else if (name == "AtomicTwiceKineticEnergy") return ATOMIC_TWICE_KINETIC_ENERGY; - else if (name == "AtomicFluctuatingVelocity") + else if (name == "AtomicFluctuatingVelocity") return ATOMIC_FLUCTUATING_VELOCITY; else if (name == "AtomicChargeVelocity") // ionic current return ATOMIC_CHARGE_VELOCITY; - else if (name == "AtomicSpeciesVelocity") // per species momentum + else if (name == "AtomicSpeciesVelocity") // per species momentum return ATOMIC_SPECIES_VELOCITY; else if (name == field_to_prolongation_name(VELOCITY)) return PROLONGED_VELOCITY; @@ -70,11 +70,11 @@ namespace ATC { } PAQ * per_atom_quantity(std::string name) { switch (string_to_canonical_name(name)) { - case ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY: + case ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY: return atomic_twice_fluctuating_kinetic_energy(); - case ATOMIC_TWICE_KINETIC_ENERGY: + case ATOMIC_TWICE_KINETIC_ENERGY: return atomic_twice_kinetic_energy(); - case ATOMIC_FLUCTUATING_VELOCITY: + case ATOMIC_FLUCTUATING_VELOCITY: return atomic_fluctuating_velocity(); case ATOMIC_CHARGE_VELOCITY: return atomic_charge_velocity(); @@ -82,7 +82,7 @@ namespace ATC { return atomic_species_velocity(); case PROLONGED_VELOCITY: return prolonged_field(VELOCITY); - default: + default: throw ATC_Error("FieldManager:: unknown PAQ"); return nullptr; } } diff --git a/lib/atc/Function.cpp b/lib/atc/Function.cpp index e73d64aaea..fb26cc0a18 100644 --- a/lib/atc/Function.cpp +++ b/lib/atc/Function.cpp @@ -89,7 +89,7 @@ namespace ATC { UXT_Function* UXT_Function_Mgr::copy_UXT_function(UXT_Function* other) { string tag = other->tag(); - + UXT_Function * returnFunction = nullptr; if (tag=="linear") { ScalarLinearFunction * other_cast = (ScalarLinearFunction*) other; @@ -103,7 +103,7 @@ namespace ATC { // ScalarLinearFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - ScalarLinearFunction::ScalarLinearFunction(int narg, double* args) + ScalarLinearFunction::ScalarLinearFunction(int narg, double* args) : UXT_Function(narg,args) { tag_ = "linear"; @@ -119,19 +119,19 @@ namespace ATC { // XT_Function //-------------------------------------------------------------------- //-------------------------------------------------------------------- - XT_Function::XT_Function(int narg, double* args) + XT_Function::XT_Function(int narg, double* args) { - if (narg > 5 ) { - x0[0] = args[0]; + if (narg > 5 ) { + x0[0] = args[0]; x0[1] = args[1]; x0[2] = args[2]; mask[0] = args[3]; mask[1] = args[4]; mask[2] = args[5]; - } + } else { - x0[0] = 0.0; + x0[0] = 0.0; x0[1] = 0.0; x0[2] = 0.0; mask[0] = 0.0; @@ -211,7 +211,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; double *dargs = (double *) alloca(sizeof(double) * narg); #endif for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]); - + return function(type, narg, dargs); } @@ -226,7 +226,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; XT_Function* XT_Function_Mgr::copy_XT_function(XT_Function* other) { string tag = other->tag(); - + XT_Function * returnFunction = nullptr; if (tag=="linear") { LinearFunction * other_cast = (LinearFunction*) other; @@ -268,14 +268,14 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // ConstantFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - ConstantFunction::ConstantFunction(int narg, double* args) + ConstantFunction::ConstantFunction(int narg, double* args) : XT_Function(narg,args), C0(args[0]) { tag_ = "constant"; } //-------------------------------------------------------------------- - ConstantFunction::ConstantFunction(double arg) + ConstantFunction::ConstantFunction(double arg) : XT_Function(1,&arg), C0(arg) { @@ -286,7 +286,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // LinearFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - LinearFunction::LinearFunction(int narg, double* args) + LinearFunction::LinearFunction(int narg, double* args) : XT_Function(narg,args) { C0 = args[6]; @@ -300,7 +300,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // PiecewiseLinearFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - PiecewiseLinearFunction::PiecewiseLinearFunction(int narg, double* args) + PiecewiseLinearFunction::PiecewiseLinearFunction(int narg, double* args) : XT_Function(narg,args) { int i=0, idx = 6, n = (narg-idx)/2; @@ -327,7 +327,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; if (index < 0) return fi(0); else if (index >= xi.size()-1 ) return fi(xi.size()-1); else { - double f = fi(index) + double f = fi(index) + (fi(index+1)-fi(index))*(s-xi(index))/(xi(index+1)-xi(index)); return f; } @@ -370,7 +370,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // QuadraticFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - QuadraticFunction::QuadraticFunction(int narg, double* args) + QuadraticFunction::QuadraticFunction(int narg, double* args) : XT_Function(narg,args) { C0 = args[6]; @@ -387,7 +387,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // SineFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - SineFunction::SineFunction(int narg, double* args) + SineFunction::SineFunction(int narg, double* args) : XT_Function(narg,args) { C = args[6]; @@ -403,7 +403,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // GaussianFunction //-------------------------------------------------------------------- //-------------------------------------------------------------------- - GaussianFunction::GaussianFunction(int narg, double* args) + GaussianFunction::GaussianFunction(int narg, double* args) : XT_Function(narg,args) { tau = args[6]; @@ -416,7 +416,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // GaussianTemporalRamp //-------------------------------------------------------------------- //-------------------------------------------------------------------- - GaussianTemporalRamp::GaussianTemporalRamp(int narg, double* args) + GaussianTemporalRamp::GaussianTemporalRamp(int narg, double* args) : GaussianFunction(narg,args) { tau_initial = args[9]; @@ -457,7 +457,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // TemporalRamp //-------------------------------------------------------------------- //-------------------------------------------------------------------- - TemporalRamp::TemporalRamp(int narg, double* args) + TemporalRamp::TemporalRamp(int narg, double* args) : XT_Function(narg,args) { f_initial = args[0]; @@ -471,7 +471,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; // RadialPower //-------------------------------------------------------------------- //-------------------------------------------------------------------- - RadialPower::RadialPower(int narg, double* args) + RadialPower::RadialPower(int narg, double* args) : XT_Function(narg,args) { C0 = args[6]; @@ -499,8 +499,8 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; fps_(i)=coef*fp; i++; } - // scale tangents - double dx, dx0 = xs_(1)-xs_(0); + // scale tangents + double dx, dx0 = xs_(1)-xs_(0); for (int i = 0; i < npts_ ; i++) { if (i == 0) { dx = xs_(1)-xs_(0); } else if (i+1 == npts_) { dx = xs_(npts_-1)-xs_(npts_-2); } @@ -512,14 +512,14 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; } - double InterpolationFunction::coordinate(double x, + double InterpolationFunction::coordinate(double x, double & f0, double & fp0, double & f1, double & fp1, double & inv_dx ) const { int i0 = xs_.index(x); int i1 = i0+1; if (i0 < 0) { double x0 = xs_(0), x1 = xs_(1); - inv_dx = 1./(x1-x0); + inv_dx = 1./(x1-x0); fp0 = fp1 = fps_(0); f1 = fs_(0); f0 = fp0*(x-xs_(0))+f1; @@ -527,7 +527,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; } else if (i1 >= npts_) { double x0 = xs_(npts_-2), x1 = xs_(npts_-1); - inv_dx = 1./(x1-x0); + inv_dx = 1./(x1-x0); fp0 = fp1 = fps_(i0); f0 = fs_(i0); f1 = fp0*(x-xs_(i0))+f0; @@ -535,7 +535,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; } else { double x0 = xs_(i0), x1 = xs_(i1); - inv_dx = 1./(x1-x0); + inv_dx = 1./(x1-x0); f0 = fs_ (i0); f1 = fs_ (i1); fp0 = fps_(i0); fp1 = fps_(i1); double t = (x-x0)*inv_dx; @@ -546,7 +546,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; { double f0,fp0,f1,fp1,inv_dx; double t = coordinate(x,f0,fp0,f1,fp1,inv_dx); - double t2 = t*t; + double t2 = t*t; double t3 = t*t2; double h00 = 2*t3 - 3*t2 + 1; double h10 = t3 - 2*t2 + t; @@ -559,7 +559,7 @@ XT_Function_Mgr * XT_Function_Mgr::myInstance_ = nullptr; { double f0,fp0,f1,fp1,inv_dx; double t = coordinate(x,f0,fp0,f1,fp1,inv_dx); - double t2 = t*t; + double t2 = t*t; double d00 = 6*t2 - 6*t; double d10 = 3*t2 - 4*t + 1; double d01 =-6*t2 + 6*t; diff --git a/lib/atc/Function.h b/lib/atc/Function.h index 0c654fa47c..7c40cf6c54 100644 --- a/lib/atc/Function.h +++ b/lib/atc/Function.h @@ -60,7 +60,7 @@ namespace ATC { }; - /** + /** * @class LinearFieldFunction * @brief Class for functions returning values linear a given field */ @@ -69,7 +69,7 @@ namespace ATC { public: LinearFieldFunction(int nargs, char** args); virtual ~LinearFieldFunction(void) {}; - + inline double f(double* u, double* /* x */, double /* t */) {return c1_*u[0]-c0_;} inline double dfd(FieldName /* field */, ARGS& /* args */) {return c1_;} @@ -124,16 +124,16 @@ namespace ATC { }; - /** + /** * @class ScalarLinearFunction - * @brief Class for functions returning values linear in space + * @brief Class for functions returning values linear in space */ class ScalarLinearFunction : public UXT_Function { public: ScalarLinearFunction(int nargs, double* args); virtual ~ScalarLinearFunction(void) {}; - + //inline double f(double* u, double* x, double t) {return c1_*(u[0]-c0_);} inline double f(double* u, double* /* x */, double /* t */) {return c1_*u[0]+c0_;} @@ -145,7 +145,7 @@ namespace ATC { /** * @class XT_Function - * @brief Base class for functions based on space and time variables + * @brief Base class for functions based on space and time variables */ class XT_Function { @@ -201,7 +201,7 @@ namespace ATC { /** * @class ConstantFunction - * @brief Class for functions returning constant values + * @brief Class for functions returning constant values */ class ConstantFunction : public XT_Function { @@ -209,33 +209,33 @@ namespace ATC { ConstantFunction(int nargs, double* args); ConstantFunction(double arg); virtual ~ConstantFunction(void) {}; - - inline double f(double* /* x */, double /* t */) + + inline double f(double* /* x */, double /* t */) {return C0;}; private : double C0; }; - /** + /** * @class LinearFunction - * @brief Class for functions returning values linear in space + * @brief Class for functions returning values linear in space */ class LinearFunction : public XT_Function { public: LinearFunction(int nargs, double* args); virtual ~LinearFunction(void) {}; - - double f(double* x, double /* t */) + + double f(double* x, double /* t */) {return mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]) + C0;}; private : double C0; }; - /** + /** * @class PiecewiseLinearFunction - * @brief Class for functions returning values piecewise linear in space + * @brief Class for functions returning values piecewise linear in space * along given direction */ @@ -243,31 +243,31 @@ namespace ATC { public: PiecewiseLinearFunction(int nargs, double* args); virtual ~PiecewiseLinearFunction(void) {}; - + double f(double* x, double t) ; private : - Array xi; - Array fi; + Array xi; + Array fi; }; - /** + /** * @class LinearTemporalRamp - * @brief Class for functions returning values linear in space and time + * @brief Class for functions returning values linear in space and time */ class LinearTemporalRamp : public XT_Function { public: LinearTemporalRamp(int nargs, double* args); ~LinearTemporalRamp(void) {}; - + double f(double* x, double t); double dfdt(double* x, double t); - + protected : double mask_slope[3]; double C0_initial, C0_slope; - + }; /** @@ -279,9 +279,9 @@ namespace ATC { public: QuadraticFunction(int nargs, double* args); virtual ~QuadraticFunction(void) {}; - - inline double f(double* x, double /* t */) - {return + + inline double f(double* x, double /* t */) + {return C2[0]*(x[0]-x0[0])*(x[0]-x0[0])+ C2[1]*(x[1]-x0[1])*(x[1]-x0[1])+ C2[2]*(x[2]-x0[2])*(x[2]-x0[2])+ @@ -295,7 +295,7 @@ namespace ATC { }; /** - * @class SineFunction + * @class SineFunction * @brief Class for functions returning values sinusoidally varying in space and time */ @@ -304,7 +304,7 @@ namespace ATC { SineFunction(int nargs, double* args); virtual ~SineFunction(void){}; - inline double f(double* x, double t) + inline double f(double* x, double t) {return C*sin( mask[0]*(x[0]-x0[0]) +mask[1]*(x[1]-x0[1]) +mask[2]*(x[2]-x0[2]) - w*t) + C0;}; @@ -324,7 +324,7 @@ namespace ATC { virtual ~GaussianFunction(void){}; // 1/(2 pi \sigma)^(n/2) exp(-1/2 x.x/\sigma^2 ) for n = dimension - inline double f(double* x, double /* t */) + inline double f(double* x, double /* t */) {return C*exp(-(mask[0]*(x[0]-x0[0])*(x[0]-x0[0]) +mask[1]*(x[1]-x0[1])*(x[1]-x0[1]) +mask[2]*(x[2]-x0[2])*(x[2]-x0[2]))/tau/tau) + C0;}; @@ -334,7 +334,7 @@ namespace ATC { }; /** - * @class GaussianTemporalRamp + * @class GaussianTemporalRamp * @brief Class for functions returning values according to a Gaussian distribution in space and linearly in time */ @@ -351,9 +351,9 @@ namespace ATC { double C_initial, C_slope; double C0_initial, C0_slope; }; - + /** - * @class TemporalRamp + * @class TemporalRamp * @brief Class for functions returning values constant in space and varying linearly in time */ @@ -361,11 +361,11 @@ namespace ATC { public: TemporalRamp(int nargs, double* args); virtual ~TemporalRamp(void) {}; - - inline double f(double* /* x */, double t) + + inline double f(double* /* x */, double t) {return f_initial + slope*t;}; - inline double dfdt(double* /* x */, double /* t */) + inline double dfdt(double* /* x */, double /* t */) {return slope;}; private : @@ -373,29 +373,29 @@ namespace ATC { }; /** - * @class RadialPower - * @brief Class for functions returning values based on distance from a fix point raised to a specified power + * @class RadialPower + * @brief Class for functions returning values based on distance from a fix point raised to a specified power */ class RadialPower : public XT_Function { public: RadialPower(int nargs, double* args); virtual ~RadialPower(void) {}; - - inline double f(double* x, double /* t */) + + inline double f(double* x, double /* t */) { double dx = x[0]-x0[0]; double dy = x[1]-x0[1]; double dz = x[2]-x0[2]; double r = mask[0]*dx*dx+mask[1]*dy*dy+mask[2]*dz*dz; r = sqrt(r); return C0*pow(r,n); }; - + private : double C0, n; }; /** * @class InterpolationFunction - * @brief Base class for interpolation functions + * @brief Base class for interpolation functions */ class InterpolationFunction { @@ -412,7 +412,7 @@ namespace ATC { double dfdt(const double t) const; protected: - double coordinate(double x, + double coordinate(double x, double & f0, double & fp0, double & f1, double & fp1, double & inv_dx) const; int npts_; Array xs_; diff --git a/lib/atc/FundamentalAtomicQuantity.cpp b/lib/atc/FundamentalAtomicQuantity.cpp index 63824bd0dd..108c0194ce 100644 --- a/lib/atc/FundamentalAtomicQuantity.cpp +++ b/lib/atc/FundamentalAtomicQuantity.cpp @@ -37,13 +37,13 @@ namespace ATC { if (atomType_ == ALL || atomType_ == PROC_GHOST) { if (nCols_==1) { // scalar double * lammpsQuantity = lammps_scalar(); - + for (int i = 0; i < atc_.nlocal_total(); i++) lammpsQuantity[i] = quantity_(i,0)/unitsConversion_; } else{ // vector double ** lammpsQuantity = lammps_vector(); - + for (int i = 0; i < atc_.nlocal_total(); i++) for (int j = 0; j < nCols_; j++) lammpsQuantity[i][j] = quantity_(i,j)/unitsConversion_; @@ -52,7 +52,7 @@ namespace ATC { // mapped copy else { int atomIndex; - + if (nCols_==1) { // scalar double * lammpsQuantity = lammps_scalar(); for (int i = 0; i < quantity_.nRows(); i++) { @@ -77,7 +77,7 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- // Class AtomMass - // Access-only operations when mass is + // Access-only operations when mass is // defined per type. //-------------------------------------------------------- //-------------------------------------------------------- @@ -98,7 +98,7 @@ namespace ATC { { const int * type = lammpsInterface_->atom_type(); const double * mass = lammpsInterface_->atom_mass(); - + if (atomType_ == ALL || atomType_ == PROC_GHOST) { for (int i = 0; i < quantity_.nRows(); i++) quantity_(i,0) = mass[type[i]]; diff --git a/lib/atc/FundamentalAtomicQuantity.h b/lib/atc/FundamentalAtomicQuantity.h index d5cf9f8a21..6a10b0e317 100644 --- a/lib/atc/FundamentalAtomicQuantity.h +++ b/lib/atc/FundamentalAtomicQuantity.h @@ -153,7 +153,7 @@ namespace ATC { // be initialized. //-------------------------------------------------------- //-------------------------------------------------------- - + class ComputedAtomQuantity : public ShallowAtomQuantity { public: @@ -220,7 +220,7 @@ namespace ATC { protected: /** pointer to Lammps compute, meant as rapid indexing only (do not use!) */ - COMPUTE_POINTER computePointer_; + COMPUTE_POINTER computePointer_; /** tag for Lammps compute */ std::string computeTag_; diff --git a/lib/atc/GMRES.h b/lib/atc/GMRES.h index a64fc70c00..269169047b 100644 --- a/lib/atc/GMRES.h +++ b/lib/atc/GMRES.h @@ -1,22 +1,22 @@ //***************************************************************** // Iterative template routine -- GMRES // -// GMRES solves the unsymmetric linear system Ax = b using the +// GMRES solves the unsymmetric linear system Ax = b using the // Generalized Minimum Residual method // -// GMRES follows the algorithm described on p. 20 of the +// GMRES follows the algorithm described on p. 20 of the // SIAM Templates book. // // The return value indicates convergence within max_iter (input) // iterations (0), or no convergence within max_iter iterations (1). // // Upon successful return, output arguments have the following values: -// +// // x -- approximate solution to Ax = b // max_iter -- the number of iterations performed before the // tolerance was reached // tol -- the residual after the final iteration -// +// //***************************************************************** #include @@ -29,12 +29,12 @@ template void GeneratePlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn); template < class Matrix, class Vector > -void +void Update(Vector &x, int k, Matrix &h, Vector &s, Vector v[]) { Vector y(s); - // Backsolve: + // Backsolve: for (int i = k; i >= 0; i--) { y(i) /= h(i,i); for (int j = i - 1; j >= 0; j--) @@ -47,7 +47,7 @@ Update(Vector &x, int k, Matrix &h, Vector &s, Vector v[]) template < class Real > -Real +Real abs(Real x) { return (x > 0 ? x : -x); @@ -56,7 +56,7 @@ abs(Real x) template < class Operator, class Vector, class Preconditioner, class Matrix, class Real > -int +int GMRES(const Operator &A, Vector &x, const Vector &b, const Preconditioner &M, Matrix &H, int &m, int &max_iter, Real &tol) @@ -64,15 +64,15 @@ GMRES(const Operator &A, Vector &x, const Vector &b, Real resid; int i, j = 1, k; Vector s(m+1), cs(m+1), sn(m+1), w; - + Vector p = inv(M)*b; Real normb = p.norm(); Vector r = inv(M) * (b - A * x); Real beta = r.norm(); - + if (normb == 0.0) normb = 1; - + if ((resid = r.norm() / normb) <= tol) { tol = resid; max_iter = 0; @@ -85,7 +85,7 @@ GMRES(const Operator &A, Vector &x, const Vector &b, v[0] = r * (1.0 / beta); // ??? r / beta s = 0.0; s(0) = beta; - + for (i = 0; i < m && j <= max_iter; i++, j++) { w = inv(M) * (A * v[i]); for (k = 0; k <= i; k++) { @@ -97,11 +97,11 @@ GMRES(const Operator &A, Vector &x, const Vector &b, for (k = 0; k < i; k++) ApplyPlaneRotation(H(k,i), H(k+1,i), cs(k), sn(k)); - + GeneratePlaneRotation(H(i,i), H(i+1,i), cs(i), sn(i)); ApplyPlaneRotation(H(i,i), H(i+1,i), cs(i), sn(i)); ApplyPlaneRotation(s(i), s(i+1), cs(i), sn(i)); - + if ((resid = abs(s(i+1)) / normb) < tol) { Update(x, i, H, s, v); tol = resid; @@ -120,14 +120,14 @@ GMRES(const Operator &A, Vector &x, const Vector &b, return 0; } } - + tol = resid; delete [] v; return 1; } -template +template void GeneratePlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn) { if (dy == 0.0) { @@ -145,7 +145,7 @@ void GeneratePlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn) } -template +template void ApplyPlaneRotation(Real &dx, Real &dy, Real &cs, Real &sn) { Real temp = cs * dx + sn * dy; diff --git a/lib/atc/GhostManager.cpp b/lib/atc/GhostManager.cpp index 1482a5a47d..f73168d9c2 100644 --- a/lib/atc/GhostManager.cpp +++ b/lib/atc/GhostManager.cpp @@ -18,7 +18,7 @@ namespace ATC { // Class GhostManager //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -30,7 +30,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -46,7 +46,7 @@ namespace ATC { bool GhostManager::modify(int narg, char **arg) { int argIndex = 0; - + /*! \page man_boundary_dynamics fix_modify AtC boundary_dynamics \section syntax fix_modify AtC boundary_dynamics < on | damped_harmonic | prescribed | coupled | none > [args] \n @@ -91,7 +91,7 @@ namespace ATC { gamma_.push_back(atof(arg[argIndex++])); mu_.push_back(atof(arg[argIndex++])); } - + boundaryDynamics_ = DAMPED_LAYERS; needReset_ = true; return true; @@ -123,7 +123,7 @@ namespace ATC { ghostModifier_ = new GhostModifier(this); return; } - + switch (boundaryDynamics_) { case VERLET: { ghostModifier_ = new GhostModifier(this); @@ -175,7 +175,7 @@ namespace ATC { } } } - + //-------------------------------------------------------- // construct_transfers // sets/constructs all required dependency managed data @@ -184,7 +184,7 @@ namespace ATC { { ghostModifier_->construct_transfers(); } - + //-------------------------------------------------------- // initialize // initialize all data and variables before a run @@ -204,7 +204,7 @@ namespace ATC { { ghostModifier_->pre_exchange(); } - + //-------------------------------------------------------- // initial_integrate_velocity // velocity update in first part of velocity-verlet @@ -213,7 +213,7 @@ namespace ATC { { ghostModifier_->init_integrate_velocity(dt); } - + //-------------------------------------------------------- // initial_integrate_position // position update in first part of velocity-verlet @@ -246,7 +246,7 @@ namespace ATC { // Class GhostModifier //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -291,7 +291,7 @@ namespace ATC { { atomTimeIntegrator_->init_integrate_velocity(dt); } - + //-------------------------------------------------------- // initial_integrate_position // position update in first part of velocity-verlet @@ -315,7 +315,7 @@ namespace ATC { // Class GhostModifierPrescribed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -353,10 +353,10 @@ namespace ATC { atomShapeFunctions, GHOST); interscaleManager.add_per_atom_quantity(atomFeDisplacement_,field_to_prolongation_name(DISPLACEMENT)+"Ghost"); - + atomRefPositions_ = interscaleManager.per_atom_quantity("AtomicGhostCoarseGrainingPositions"); } - + //-------------------------------------------------------- // post_init_integrate // after integration, fix ghost atoms' positions @@ -373,7 +373,7 @@ namespace ATC { // Class GhostModifierDampedHarmonic //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -399,7 +399,7 @@ namespace ATC { void GhostModifierDampedHarmonic::construct_transfers() { GhostModifierPrescribed::construct_transfers(); - + InterscaleManager & interscaleManager((ghostManager_->atc())->interscale_manager()); atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,GHOST); atomForces_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,GHOST); @@ -431,7 +431,7 @@ namespace ATC { atomTimeIntegrator_->init_integrate_velocity(dt); #endif } - + //-------------------------------------------------------- // initial_integrate_position // position update in first part of velocity-verlet @@ -477,7 +477,7 @@ namespace ATC { // Class GhostModifierDampedHarmonicLayers //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -489,7 +489,7 @@ namespace ATC { ghostToBoundaryDistance_(nullptr), layerId_(nullptr) { - + // do nothing } @@ -500,7 +500,7 @@ namespace ATC { void GhostModifierDampedHarmonicLayers::construct_transfers() { GhostModifierDampedHarmonic::construct_transfers(); - + InterscaleManager & interscaleManager((ghostManager_->atc())->interscale_manager()); // transfer for distance to boundary @@ -529,14 +529,14 @@ namespace ATC { //-------------------------------------------------------- // find atomic mononlayers //-------------------------------------------------------- - bool compare( pair a, pair b) { + bool compare( pair a, pair b) { return (a.second < b.second); } int GhostModifierDampedHarmonicLayers::find_layers() { DENS_MAT & d(ghostToBoundaryDistance_->set_quantity()); DenseMatrix & ids = layerId_->set_quantity(); - + // get distances for every ghost atom for sorting // size arrays of length number of processors int commSize = LammpsInterface::instance()->comm_size(); @@ -608,7 +608,7 @@ namespace ATC { ATC::LammpsInterface::instance()->print_msg_once(msg.str()); return nlayers; } - + //-------------------------------------------------------- // compute distances to boundary faces //-------------------------------------------------------- @@ -640,7 +640,7 @@ namespace ATC { feMesh->face_connectivity_unique(PAIR(elt,face),faceNodes); // identify the boundary face by the face which contains only boundary nodes - isBoundaryFace = true; + isBoundaryFace = true; for (int i = 0; i < faceNodes.size(); ++i) { if (nodeType(faceNodes(i),0) != BOUNDARY) { isBoundaryFace = false; @@ -665,7 +665,7 @@ namespace ATC { } } centroid *= -1./double(nfe); // -1 gets outward normal from ATC region => all distances should be > 0 - + // for each boundary face get the normal // ASSUMES all faces are planar feMesh->face_normal(PAIR(elt,face),0,normal); @@ -692,7 +692,7 @@ namespace ATC { } } - + //-------------------------------------------------------- // final_integrate // velocity update in second part of velocity-verlet @@ -723,7 +723,7 @@ namespace ATC { // Class GhostIntegratorVerletSwap //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- diff --git a/lib/atc/GhostManager.h b/lib/atc/GhostManager.h index 9c3bbbe939..c697eb1bb1 100644 --- a/lib/atc/GhostManager.h +++ b/lib/atc/GhostManager.h @@ -26,7 +26,7 @@ namespace ATC { /** types of ghost boundary conditions in momentum */ enum BoundaryDynamicsType { NO_BOUNDARY_DYNAMICS=0, - VERLET, // performs velocity-verlet + VERLET, // performs velocity-verlet PRESCRIBED, // forces ghost locations to conform to interpolated finite element locations DAMPED_HARMONIC, // turns ghost atoms into spring-mass-dashpot systems DAMPED_LAYERS, // oer layer DAMPED_HARMONIC @@ -113,7 +113,7 @@ namespace ATC { */ class GhostModifier { - + public: // constructor @@ -171,7 +171,7 @@ namespace ATC { */ class GhostModifierPrescribed : public GhostModifier { - + public: // constructor @@ -210,7 +210,7 @@ namespace ATC { */ class GhostModifierDampedHarmonic : public GhostModifierPrescribed { - + public: // constructor @@ -276,7 +276,7 @@ namespace ATC { */ class GhostModifierDampedHarmonicLayers : public GhostModifierDampedHarmonic { - + public: // constructor @@ -308,7 +308,7 @@ namespace ATC { // data /** distance from all ghost atoms to boundary, i.e. boundary face of containing element */ PerAtomQuantity * ghostToBoundaryDistance_; - + /** layer id for ghost atoms */ PerAtomQuantity * layerId_; @@ -327,7 +327,7 @@ namespace ATC { */ class GhostIntegratorSwap : public GhostModifier { - + public: // constructor @@ -355,7 +355,7 @@ namespace ATC { /** internal to element map */ PerAtomQuantity * atomElement_; - + /** ghost to element map */ PerAtomQuantity * atomGhostElement_; diff --git a/lib/atc/ImplicitSolveOperator.cpp b/lib/atc/ImplicitSolveOperator.cpp index d66da8a0e3..a6e8a4b09a 100644 --- a/lib/atc/ImplicitSolveOperator.cpp +++ b/lib/atc/ImplicitSolveOperator.cpp @@ -41,7 +41,7 @@ ImplicitSolveOperator::operator * (const DENS_VEC & x) const // fast field. In brief, if the ODE for the fast field can be written: // // dx/dt = R(x) - // + // // A generalized discretization can be written: // // 1/dt * (x^n+1 - x^n) = alpha * R(x^n+1) + (1-alpha) * R(x^n) @@ -120,14 +120,14 @@ FieldImplicitSolveOperator(ATC_Coupling * atc, int nNodes = f.nRows(); set fixedNodes_ = atc_->prescribed_data_manager()->fixed_nodes(fieldName_); n_ = nNodes; - vector tag(nNodes); + vector tag(nNodes); set::const_iterator it; int i = 0; for (i = 0; i < nNodes; ++i) { tag[i] = true; } for (it=fixedNodes_.begin();it!=fixedNodes_.end();++it) {tag[*it]=false;} int m = 0; for (i = 0; i < nNodes; ++i) { if (tag[i]) freeNodes_[i]= m++; } //std::cout << " nodes " << n_ << " " << nNodes << "\n"; - + // Save current field x0_.reset(n_); to_free(f,x0_); @@ -143,7 +143,7 @@ FieldImplicitSolveOperator(ATC_Coupling * atc, massMask_.reset(1); massMask_(0) = fieldName_; rhs_[fieldName_].reset(nNodes,dof_); - // Compute the RHS vector R(T^n) + // Compute the RHS vector R(T^n) R0_.reset(n_); R_ .reset(n_); R(x0_, R0_); @@ -163,7 +163,7 @@ void FieldImplicitSolveOperator::to_free(const MATRIX &r, VECTOR &v) const v(i) = r(i,0); } } -void +void FieldImplicitSolveOperator::R(const DENS_VEC &x, DENS_VEC &v ) const { DENS_MAT & f = fields_[fieldName_].set_quantity(); @@ -192,7 +192,7 @@ void FieldImplicitSolveOperator::solution(const DENS_MAT & dx, DENS_MAT &f) cons } void FieldImplicitSolveOperator::rhs(const DENS_MAT & r, DENS_MAT &rhs) const { - + to_all(column(r,0),rhs); } diff --git a/lib/atc/ImplicitSolveOperator.h b/lib/atc/ImplicitSolveOperator.h index 8b9f28dc5b..483a0b900a 100644 --- a/lib/atc/ImplicitSolveOperator.h +++ b/lib/atc/ImplicitSolveOperator.h @@ -45,7 +45,7 @@ class ImplicitSolveOperator { mutable DENS_VEC R_; // condensed current double dt_; // timestep double alpha_; // implicit/explicit parameter (0 -> explicit, else implicit) - double epsilon0_; // small parameter to compute increment + double epsilon0_; // small parameter to compute increment }; /** diff --git a/lib/atc/InterscaleOperators.cpp b/lib/atc/InterscaleOperators.cpp index eeac14adf8..994652ba0c 100644 --- a/lib/atc/InterscaleOperators.cpp +++ b/lib/atc/InterscaleOperators.cpp @@ -41,7 +41,7 @@ namespace ATC{ { prefix_ = (atc_->lammps_interface())->fix_id() + prefix_; } - + //-------------------------------------------------------- // Destructor //-------------------------------------------------------- @@ -155,7 +155,7 @@ namespace ATC{ int myIndex = index; set::iterator it; bool isTemporary = (quantity->memory_type()==TEMPORARY); - + for (it = (quantity->dependentQuantities_).begin(); it != (quantity->dependentQuantities_).end(); it++) { // make sure that if quantity isn't persistent, none of it's dependencies are if ((*it)->memory_type()==PERSISTENT && isTemporary) { @@ -454,7 +454,7 @@ namespace ATC{ { // REFACTOR add check for duplicate entries DependencyManager * quantity = nullptr; - + quantity = find_in_list(perAtomQuantities_,tag); if (quantity) return quantity; quantity = find_in_list(perAtomIntQuantities_,tag); @@ -613,7 +613,7 @@ namespace ATC{ //-------------------------------------------------------- // pack_comm //-------------------------------------------------------- - int InterscaleManager::pack_comm(int index, double *buf, + int InterscaleManager::pack_comm(int index, double *buf, int pbc_flag, int *pbc) { int size = 0; diff --git a/lib/atc/InterscaleOperators.h b/lib/atc/InterscaleOperators.h index 40c5144bf8..4c72dc5c37 100644 --- a/lib/atc/InterscaleOperators.h +++ b/lib/atc/InterscaleOperators.h @@ -35,12 +35,12 @@ namespace ATC { //-------------------------------------------------------- class InterscaleManager { - + public: - + // constructor InterscaleManager(ATC_Method * atc); - + // destructor ~InterscaleManager(); @@ -52,7 +52,7 @@ namespace ATC { /** set lammps data prefix */ void set_lammps_data_prefix(); - + /** parser/modifier */ bool modify(int narg, char **arg); @@ -183,7 +183,7 @@ namespace ATC { int unpack_exchange(int i, double *buffer); /** packs up data for parallel transfer to ghost atoms on other processors */ - int pack_comm(int index, double *buf, + int pack_comm(int index, double *buf, int pbc_flag, int *pbc); /** unpacks data after parallel transfer to ghost atoms on other processors */ @@ -196,7 +196,7 @@ namespace ATC { void copy_arrays(int i, int j); protected: - + /** pointer to access ATC methods */ ATC_Method * atc_; @@ -422,7 +422,7 @@ namespace ATC { /** helper function to pack arrays of all data in a list, only valid with comm lists */ template - void pack_comm_loop(std::vector & list, int & size, int index, double *buf, + void pack_comm_loop(std::vector & list, int & size, int index, double *buf, int pbc_flag, int *pbc) { for (typename std::vector::iterator it = list.begin(); it != list.end(); ++it) @@ -455,9 +455,9 @@ namespace ATC { private: - + InterscaleManager(); - + }; } diff --git a/lib/atc/KD_Tree.cpp b/lib/atc/KD_Tree.cpp index 181be27dc5..a41e7ca75a 100644 --- a/lib/atc/KD_Tree.cpp +++ b/lib/atc/KD_Tree.cpp @@ -3,8 +3,8 @@ using std::vector; -KD_Tree *KD_Tree::create_KD_tree(const int nNodesPerElem, const int nNodes, - const DENS_MAT *nodalCoords, const int nElems, +KD_Tree *KD_Tree::create_KD_tree(const int nNodesPerElem, const int nNodes, + const DENS_MAT *nodalCoords, const int nElems, const Array2D &conn) { vector *points = new vector(); // Initialize an empty list of Nodes for (int node = 0; node < nNodes; node++) { // Insert all nodes into list @@ -30,7 +30,7 @@ KD_Tree::~KD_Tree() { delete rightChild_; } -KD_Tree::KD_Tree(vector *points, vector *elements, +KD_Tree::KD_Tree(vector *points, vector *elements, int dimension) : candElems_(elements) { // Set up comparison functions @@ -44,14 +44,14 @@ KD_Tree::KD_Tree(vector *points, vector *elements, } // Sort points by their coordinate in the current dimension - sort(points->begin(), points->end(), compare); + sort(points->begin(), points->end(), compare); sortedPts_ = points; // Pick the median point as the root of the tree size_t nNodes = points->size(); size_t med = nNodes/2; value_ = (*sortedPts_)[med]; - + // Recursively construct the left sub-tree vector *leftPts = new vector; vector *leftElems = new vector; @@ -103,8 +103,8 @@ KD_Tree::KD_Tree(vector *points, vector *elements, vector KD_Tree::find_nearest_elements(Node query, int dimension) { // if the root coordinate is less than the query coordinate - - + + // If the query point is less that the value (split) point of this // tree, either recurse to the left or return this node's elements // if there is no left child. @@ -132,10 +132,10 @@ vector KD_Tree::find_nearest_elements(Node query, int dimension) { } vector > KD_Tree::getElemIDs(int depth) { - + vector > result; vector > temp; - + assert(depth >= 0 ); if (depth == 0) { vector candElemIDs; @@ -164,6 +164,6 @@ vector > KD_Tree::getElemIDs(int depth) { temp = rightChild_->getElemIDs(depth); result.insert(result.end(), temp.begin(), temp.end()); } - + return result; } diff --git a/lib/atc/KD_Tree.h b/lib/atc/KD_Tree.h index 3877cd4099..1ef59358e0 100644 --- a/lib/atc/KD_Tree.h +++ b/lib/atc/KD_Tree.h @@ -14,7 +14,7 @@ class Node { // Zero argument constructor just for default initialization. } - Node(int node, double x, double y, double z) + Node(int node, double x, double y, double z) : index_(node) { coords_[0] = x; @@ -26,8 +26,8 @@ class Node { double coords_[3]; double distanceSquared(Node query) { - return pow(coords_[0] - query.coords_[0], 2) - + pow(coords_[1] - query.coords_[1], 2) + return pow(coords_[0] - query.coords_[0], 2) + + pow(coords_[1] - query.coords_[1], 2) + pow(coords_[2] - query.coords_[2], 2); } @@ -58,8 +58,8 @@ typedef std::pair > Elem; class KD_Tree { public: - static KD_Tree* create_KD_tree(const int nNodesPerElement, const int nNodes, - const DENS_MAT *points, const int nElems, + static KD_Tree* create_KD_tree(const int nNodesPerElement, const int nNodes, + const DENS_MAT *points, const int nElems, const Array2D &conn); KD_Tree(std::vector *points, std::vector *elems, @@ -67,13 +67,13 @@ class KD_Tree { ~KD_Tree(); - std::vector find_nearest(DENS_VEC query) { + std::vector find_nearest(DENS_VEC query) { // Create a fake Node and find the nearest Node in the tree to it. return find_nearest_elements(Node(-1, query(0), query(1), query(2))); } - + std::vector find_nearest_elements(Node query, int dimension=0); - + std::vector > getElemIDs(int depth); private: diff --git a/lib/atc/KernelFunction.cpp b/lib/atc/KernelFunction.cpp index 6095c14284..a9695efb01 100644 --- a/lib/atc/KernelFunction.cpp +++ b/lib/atc/KernelFunction.cpp @@ -11,12 +11,12 @@ using namespace ATC_Utility; static const double tol = 1.0e-8; -static const int line_ngauss = 10; +static const int line_ngauss = 10; static double line_xg[line_ngauss], line_wg[line_ngauss]; namespace ATC { - + //======================================================================== // KernelFunctionMgr //======================================================================== @@ -36,10 +36,10 @@ namespace ATC { //------------------------------------------------------------------------ KernelFunction* KernelFunctionMgr::function(char ** arg, int narg) { - /*! \page man_kernel_function fix_modify AtC kernel + /*! \page man_kernel_function fix_modify AtC kernel \section syntax fix_modify AtC kernel - - type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, + - type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere \n - parameters :\n step = radius (double) \n @@ -54,7 +54,7 @@ namespace ATC { fix_modify AtC kernel cell 1.0 1.0 1.0 fix_modify AtC kernel quartic_sphere 10.0 \section description - + \section restrictions Must be used with the hardy AtC fix \n For bar kernel types, half-width oriented along x-direction \n @@ -80,11 +80,11 @@ namespace ATC { ptr = new KernelFunctionCell(2,parameters); } else if (strcmp(type,"cubic_bar")==0) { - double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length + double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length ptr = new KernelFunctionCubicBar(1,parameters); } else if (strcmp(type,"linear_bar")==0) { - double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length + double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length ptr = new KernelFunctionLinearBar(1,parameters); } else if (strcmp(type,"cubic_cylinder")==0) { @@ -96,7 +96,7 @@ namespace ATC { ptr = new KernelFunctionCubicSphere(1,parameters); } else if (strcmp(type,"quartic_bar")==0) { - double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length + double parameters[1] = {atof(arg[argIdx])}; // cutoff half-length ptr = new KernelFunctionQuarticBar(1,parameters); } else if (strcmp(type,"quartic_cylinder")==0) { @@ -126,7 +126,7 @@ namespace ATC { KernelFunction::KernelFunction(int /* nparameters */, double* parameters): Rc_(0),invRc_(0),nsd_(3), lammpsInterface_(LammpsInterface::instance()) - { + { Rc_ = parameters[0]; invRc_ = 1.0/Rc_; Rc_ = parameters[0]; @@ -142,8 +142,8 @@ namespace ATC { box_bounds[0][1],box_bounds[1][1], box_bounds[0][2],box_bounds[1][2]); for (int k = 0; k < 3; k++) { - box_length[k] = box_bounds[1][k] - box_bounds[0][k]; - } + box_length[k] = box_bounds[1][k] - box_bounds[0][k]; + } } // does an input node's kernel intersect bonds on this processor @@ -160,7 +160,7 @@ namespace ATC { if (i < nsd_) { kernel_bounds[0][i] -= (Rc_+lammpsInterface_->pair_cutoff()); kernel_bounds[1][i] += (Rc_+lammpsInterface_->pair_cutoff()); - contributes = contributes && (node(i) >= kernel_bounds[0][i]) + contributes = contributes && (node(i) >= kernel_bounds[0][i]) && (node(i) < kernel_bounds[1][i]); if (periodicity[i]) { if (node[i] <= box_bounds[0][i] + box_length[i]/2) { @@ -168,8 +168,8 @@ namespace ATC { } else { ghostNode[i] -= box_length[i]; } - ghostContributes = ghostContributes - && ((ghostNode(i) >= kernel_bounds[0][i]) || + ghostContributes = ghostContributes + && ((ghostNode(i) >= kernel_bounds[0][i]) || (node(i) >= kernel_bounds[0][i])) && ((ghostNode(i) < kernel_bounds[1][i]) || (node(i) < kernel_bounds[1][i])); @@ -202,12 +202,12 @@ namespace ATC { return 0.5*(lam2-lam1)*bhsum; } - // localization-volume intercepts for bond calculation + // localization-volume intercepts for bond calculation // bond intercept values assuming spherical support void KernelFunction::bond_intercepts(DENS_VEC& xa, DENS_VEC& xb, double &lam1, double &lam2) const { - if (nsd_ == 2) {// for cylinders, axis is always z! + if (nsd_ == 2) {// for cylinders, axis is always z! const int iaxis = 2; xa[iaxis] = 0.0; xb[iaxis] = 0.0; @@ -223,8 +223,8 @@ namespace ATC { bool a_in = (ra_n <= 1.0); bool b_in = (rb_n <= 1.0); if (a_in && b_in) { - lam1 = 0.0; - lam2 = 1.0; + lam1 = 0.0; + lam2 = 1.0; return; } DENS_VEC xab = xa - xb; @@ -240,7 +240,7 @@ namespace ATC { double aux = -0.5*(b-sqrt(discrim)); s1 = c/aux; s2 = aux/a; - } + } else { double aux = -0.5*(b+sqrt(discrim)); s1 = aux/a; @@ -249,15 +249,15 @@ namespace ATC { if (a_in && !b_in) { lam1 = s1; lam2 = 1.0; - } - else if (!a_in && b_in) { + } + else if (!a_in && b_in) { lam1 = 0.0; - lam2 = s2; + lam2 = s2; } else { - if (s1 >= 0.0 && s2 <= 1.0) { - lam1 = s1; - lam2 = s2; + if (s1 >= 0.0 && s2 <= 1.0) { + lam1 = s1; + lam2 = s2; } } } @@ -265,8 +265,8 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionStep::KernelFunctionStep - (int nparameters, double* parameters): - KernelFunction(nparameters, parameters) + (int nparameters, double* parameters): + KernelFunction(nparameters, parameters) { for (int k = 0; k < nsd_; k++ ) { if ((bool) periodicity[k]) { @@ -274,7 +274,7 @@ namespace ATC { throw ATC_Error("Size of localization volume is too large for periodic boundary condition"); } } - } + } } // function value @@ -284,7 +284,7 @@ namespace ATC { if (rn <= 1.0) { return 1.0; } else { return 0.0; } } - + // function derivative value void KernelFunctionStep::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const { @@ -295,8 +295,8 @@ namespace ATC { /** a step with rectangular support suitable for a rectangular grid */ // constructor KernelFunctionCell::KernelFunctionCell - (int nparameters, double* parameters): - KernelFunction(nparameters, parameters) + (int nparameters, double* parameters): + KernelFunction(nparameters, parameters) { hx = parameters[0]; hy = parameters[1]; @@ -309,7 +309,7 @@ namespace ATC { cellBounds_(3) = hy; cellBounds_(4) = -hz; cellBounds_(5) = hz; - + for (int k = 0; k < nsd_; k++ ) { if ((bool) periodicity[k]) { if (parameters[k] > 0.5*box_length[k]) { @@ -332,9 +332,9 @@ namespace ATC { for (int i=0; i<3; ++i) { kernel_bounds[0][i] -= (cellBounds_(i*2+1) + lammpsInterface_->pair_cutoff()); - kernel_bounds[1][i] += (cellBounds_(i*2+1) + + kernel_bounds[1][i] += (cellBounds_(i*2+1) + lammpsInterface_->pair_cutoff()); - contributes = contributes && (node(i) >= kernel_bounds[0][i]) + contributes = contributes && (node(i) >= kernel_bounds[0][i]) && (node(i) < kernel_bounds[1][i]); if (periodicity[i]) { if (node[i] <= box_bounds[0][i] + box_length[i]/2) { @@ -342,7 +342,7 @@ namespace ATC { } else { ghostNode[i] -= box_length[i]; } - ghostContributes = ghostContributes + ghostContributes = ghostContributes && ((ghostNode(i) >= kernel_bounds[0][i]) || (node(i) >= kernel_bounds[0][i])) && ((ghostNode(i) < kernel_bounds[1][i]) || @@ -367,13 +367,13 @@ namespace ATC { // function value double KernelFunctionCell::value(DENS_VEC& x_atom) const { - if ((cellBounds_(0) <= x_atom(0)) && (x_atom(0) < cellBounds_(1)) - && (cellBounds_(2) <= x_atom(1)) && (x_atom(1) < cellBounds_(3)) - && (cellBounds_(4) <= x_atom(2)) && (x_atom(2) < cellBounds_(5))) { - return 1.0; - } - else { - return 0.0; + if ((cellBounds_(0) <= x_atom(0)) && (x_atom(0) < cellBounds_(1)) + && (cellBounds_(2) <= x_atom(1)) && (x_atom(1) < cellBounds_(3)) + && (cellBounds_(4) <= x_atom(2)) && (x_atom(2) < cellBounds_(5))) { + return 1.0; + } + else { + return 0.0; } } @@ -382,7 +382,7 @@ namespace ATC { { deriv.reset(nsd_); } - + // bond intercept values for rectangular region : origin is the node position void KernelFunctionCell::bond_intercepts(DENS_VEC& xa, DENS_VEC& xb, double &lam1, double &lam2) const @@ -409,21 +409,21 @@ namespace ATC { double s = (cellBounds_(2*i+j) - xb(i))/xab(i); // check if between a & b if (s >= 0 && s <= 1) { - bool in_bounds = false; + bool in_bounds = false; DENS_VEC x = xb + s*xab; - if (i == 0) { + if (i == 0) { if ((cellBounds_(2) <= x(1)) && (x(1) <= cellBounds_(3)) && (cellBounds_(4) <= x(2)) && (x(2) <= cellBounds_(5))) { in_bounds = true; } } - else if (i == 1) { + else if (i == 1) { if ((cellBounds_(0) <= x(0)) && (x(0) <= cellBounds_(1)) && (cellBounds_(4) <= x(2)) && (x(2) <= cellBounds_(5))) { in_bounds = true; } } - else if (i == 2) { + else if (i == 2) { if ((cellBounds_(0) <= x(0)) && (x(0) <= cellBounds_(1)) && (cellBounds_(2) <= x(1)) && (x(1) <= cellBounds_(3))) { in_bounds = true; @@ -436,7 +436,7 @@ namespace ATC { } } } - } + } } throw ATC_Error("logic failure in HardyKernel Cell for single intersection\n"); } @@ -455,19 +455,19 @@ namespace ATC { if (s >= 0 && s <= 1) { // check if in face DENS_VEC x = xb + s*xab; - if (i == 0) { + if (i == 0) { if ((cellBounds_(2) <= x(1)) && (x(1) <= cellBounds_(3)) && (cellBounds_(4) <= x(2)) && (x(2) <= cellBounds_(5))) { ss[is++] = s; } } - else if (i == 1) { + else if (i == 1) { if ((cellBounds_(0) <= x(0)) && (x(0) <= cellBounds_(1)) && (cellBounds_(4) <= x(2)) && (x(2) <= cellBounds_(5))) { ss[is++] = s; } } - else if (i == 2) { + else if (i == 2) { if ((cellBounds_(0) <= x(0)) && (x(0) <= cellBounds_(1)) && (cellBounds_(2) <= x(1)) && (x(1) <= cellBounds_(3))) { ss[is++] = s; @@ -475,7 +475,7 @@ namespace ATC { } } } - } + } } if (is == 1) { // intersection occurs at a box edge - leave lam1 = lam2 @@ -496,8 +496,8 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionCubicSphere::KernelFunctionCubicSphere - (int nparameters, double* parameters): - KernelFunction(nparameters, parameters) + (int nparameters, double* parameters): + KernelFunction(nparameters, parameters) { for (int k = 0; k < nsd_; k++ ) { if ((bool) periodicity[k]) { @@ -515,7 +515,7 @@ namespace ATC { double rn=r/Rc_; if (rn < 1.0) { return 5.0*(1.0-3.0*rn*rn+2.0*rn*rn*rn); } else { return 0.0; } - } + } // function derivative value void KernelFunctionCubicSphere::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const @@ -526,8 +526,8 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionQuarticSphere::KernelFunctionQuarticSphere - (int nparameters, double* parameters): - KernelFunction(nparameters, parameters) + (int nparameters, double* parameters): + KernelFunction(nparameters, parameters) { for (int k = 0; k < nsd_; k++ ) { if ((bool) periodicity[k]) { @@ -539,13 +539,13 @@ namespace ATC { } // function value - double KernelFunctionQuarticSphere::value(DENS_VEC& x_atom) const + double KernelFunctionQuarticSphere::value(DENS_VEC& x_atom) const { double r=x_atom.norm(); double rn=r/Rc_; if (rn < 1.0) { return 35.0/8.0*pow((1.0-rn*rn),2); } else { return 0.0; } - } + } // function derivative value void KernelFunctionQuarticSphere::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const @@ -556,7 +556,7 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionCubicCyl::KernelFunctionCubicCyl - (int nparameters, double* parameters): + (int nparameters, double* parameters): KernelFunction(nparameters, parameters) { nsd_ = 2; @@ -578,7 +578,7 @@ namespace ATC { double rn=r/Rc_; if (rn < 1.0) { return 10.0/3.0*(1.0-3.0*rn*rn+2.0*rn*rn*rn); } else { return 0.0; } - } + } // function derivative value void KernelFunctionCubicCyl::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const @@ -589,7 +589,7 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionQuarticCyl::KernelFunctionQuarticCyl - (int nparameters, double* parameters): + (int nparameters, double* parameters): KernelFunction(nparameters, parameters) { nsd_ = 2; @@ -611,7 +611,7 @@ namespace ATC { double rn=r/Rc_; if (rn < 1.0) { return 3.0*pow((1.0-rn*rn),2); } else { return 0.0; } - } + } // function derivative value void KernelFunctionQuarticCyl::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const @@ -621,7 +621,7 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionCubicBar::KernelFunctionCubicBar - (int nparameters, double* parameters): + (int nparameters, double* parameters): KernelFunction(nparameters, parameters) { // Note: Bar is assumed to be oriented in the x(0) direction @@ -643,7 +643,7 @@ namespace ATC { double rn=r/Rc_; if (rn < 1.0) { return 2.0*(1.0-3.0*rn*rn+2.0*rn*rn*rn); } else { return 0.0; } - } + } // function derivative value void KernelFunctionCubicBar::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const @@ -654,7 +654,7 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionLinearBar::KernelFunctionLinearBar - (int nparameters, double* parameters): + (int nparameters, double* parameters): KernelFunction(nparameters, parameters) { // Note: Bar is assumed to be oriented in the z(0) direction @@ -675,7 +675,7 @@ namespace ATC { double rn=r/Rc_; if (rn < 1.0) { return 1.0-rn; } else { return 0.0; } - } + } // function derivative value void KernelFunctionLinearBar::derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const @@ -693,7 +693,7 @@ namespace ATC { //------------------------------------------------------------------------ // constructor KernelFunctionQuarticBar::KernelFunctionQuarticBar - (int nparameters, double* parameters): + (int nparameters, double* parameters): KernelFunction(nparameters, parameters) { // Note: Bar is assumed to be oriented in the x(0) direction @@ -716,7 +716,7 @@ namespace ATC { // if (rn < 1.0) { return 5.0/2.0*(1.0-6*rn*rn+8*rn*rn*rn-3*rn*rn*rn*rn); } - alternative quartic if (rn < 1.0) { return 15.0/8.0*pow((1.0-rn*rn),2); } else { return 0.0; } - } + } // function derivative value void KernelFunctionQuarticBar::derivative(const DENS_VEC& /* x_atom */, DENS_VEC& deriv) const diff --git a/lib/atc/KernelFunction.h b/lib/atc/KernelFunction.h index 6922ed9a7b..d26ab38209 100644 --- a/lib/atc/KernelFunction.h +++ b/lib/atc/KernelFunction.h @@ -9,8 +9,8 @@ namespace ATC { /** * @class KernelFunctionMgr - * @brief Base class for managing kernels - */ + * @brief Base class for managing kernels + */ class KernelFunctionMgr { public: /** Static instance of this class */ @@ -25,26 +25,26 @@ namespace ATC { }; /** - * @class KernelFunction - * @brief Base class for kernels for atom-continuum transfer - */ + * @class KernelFunction + * @brief Base class for kernels for atom-continuum transfer + */ class KernelFunction { public: - + // constructor KernelFunction(int nparameters, double* parameters); // destructor virtual ~KernelFunction() {}; // function value virtual double value(DENS_VEC& x_atom) const =0 ; - // function derivative + // function derivative virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const =0 ; // bond function value via quadrature virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const; // localization-volume intercepts for bond calculation - virtual void bond_intercepts(DENS_VEC& xa, + virtual void bond_intercepts(DENS_VEC& xa, DENS_VEC& xb, double &lam1, double &lam2) const; virtual bool node_contributes(DENS_VEC node) const; virtual bool in_support(DENS_VEC node) const; @@ -54,7 +54,7 @@ namespace ATC { protected: double invVol_; // normalization factor double Rc_, invRc_; // cutoff radius - int nsd_ ; // number of dimensions + int nsd_ ; // number of dimensions /** pointer to lammps interface class */ LammpsInterface * lammpsInterface_; @@ -67,10 +67,10 @@ namespace ATC { }; /** - * @class KernelFunctionStep + * @class KernelFunctionStep * @brief Class for defining kernel function of a step with spherical support - */ - + */ + class KernelFunctionStep : public KernelFunction { public: @@ -80,7 +80,7 @@ namespace ATC { virtual ~KernelFunctionStep() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative + // function derivative virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; // bond function value virtual double bond(DENS_VEC& /* xa */, DENS_VEC& /* xb */, double lam1, double lam2) const @@ -88,27 +88,27 @@ namespace ATC { }; /** - * @class KernelFunctionCell + * @class KernelFunctionCell * @brief Class for defining kernel function of a step with rectangular support * suitable for a rectangular grid - */ - + */ + class KernelFunctionCell : public KernelFunction { public: // constructor - KernelFunctionCell(int nparameters, double* parameters); + KernelFunctionCell(int nparameters, double* parameters); // destructor virtual ~KernelFunctionCell() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; // bond function value virtual double bond(DENS_VEC& /* xa */, DENS_VEC& /* xb */, double lam1, double lam2) const {return lam2 -lam1;} // bond intercept values : origin is the node position - void bond_intercepts(DENS_VEC& xa, DENS_VEC& xb, + void bond_intercepts(DENS_VEC& xa, DENS_VEC& xb, double &lam1, double &lam2) const; bool node_contributes(DENS_VEC node) const; bool in_support(DENS_VEC dx) const; @@ -132,8 +132,8 @@ namespace ATC { virtual ~KernelFunctionCubicSphere() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; }; /** @@ -150,8 +150,8 @@ namespace ATC { virtual ~KernelFunctionQuarticSphere() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; }; /** @@ -168,8 +168,8 @@ namespace ATC { virtual ~KernelFunctionCubicCyl() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; virtual double dimensionality_factor(void) const { return 0.5; } }; @@ -181,21 +181,21 @@ namespace ATC { class KernelFunctionQuarticCyl : public KernelFunction { public: - + // constructor KernelFunctionQuarticCyl(int nparameters, double* parameters); // destructor virtual ~KernelFunctionQuarticCyl() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; virtual double dimensionality_factor(void) const { return 0.5; } }; /** * @class KernelFunctionCubicBar - * @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support + * @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support */ class KernelFunctionCubicBar : public KernelFunction { @@ -207,14 +207,14 @@ namespace ATC { virtual ~KernelFunctionCubicBar() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; virtual double dimensionality_factor(void) const { return 0.25; } }; /** * @class KernelFunctionCubicBar - * @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support + * @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support */ class KernelFunctionLinearBar : public KernelFunction { @@ -226,8 +226,8 @@ namespace ATC { virtual ~KernelFunctionLinearBar() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; virtual double dimensionality_factor(void) const { return 0.25; } }; @@ -246,8 +246,8 @@ namespace ATC { virtual ~KernelFunctionQuarticBar() {}; // function value virtual double value(DENS_VEC& x_atom) const; - // function derivative - virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; + // function derivative + virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const; virtual double dimensionality_factor(void) const { return 0.25; } }; diff --git a/lib/atc/KinetoThermostat.cpp b/lib/atc/KinetoThermostat.cpp index 89d598c102..7b571249f3 100644 --- a/lib/atc/KinetoThermostat.cpp +++ b/lib/atc/KinetoThermostat.cpp @@ -62,9 +62,9 @@ namespace ATC { //-------------------------------------------------------- // construct_methods: // instantiations desired regulator method(s) - + // dependence, but in general there is also a - // time integrator dependence. In general the + // time integrator dependence. In general the // precedence order is: // time filter -> time integrator -> thermostat // In the future this may need to be added if @@ -92,7 +92,7 @@ namespace ATC { if (timeFilterManager->need_reset() ) { timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT_IMPLICIT); } - + if (timeFilterManager->filter_dynamics()) { switch (regulatorTarget_) { case NONE: { @@ -130,7 +130,7 @@ namespace ATC { throw ATC_Error("Unknown thermostat target in Thermostat::initialize"); } } - + AtomicRegulator::reset_method(); } else { @@ -143,7 +143,7 @@ namespace ATC { // Class VelocityRescaleCombined //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -182,7 +182,7 @@ namespace ATC { // Class ThermostatRescaleCombined //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -219,7 +219,7 @@ namespace ATC { // Class KinetoThermostatRescale //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -239,7 +239,7 @@ namespace ATC { kinetostat_ = new VelocityRescaleCombined(kinetoThermostat); // data associated with stage 3 in ATC_Method::initialize lambdaMomentum_ = atomicRegulator_->regulator_data(regulatorPrefix_+"LambdaMomentum",atc_->nsd()); - lambdaEnergy_ = atomicRegulator_->regulator_data(regulatorPrefix_+"LambdaEnergy",1); + lambdaEnergy_ = atomicRegulator_->regulator_data(regulatorPrefix_+"LambdaEnergy",1); } //-------------------------------------------------------- @@ -334,7 +334,7 @@ namespace ATC { // update thermostat thermostat_->compute_thermostat(dt); - + // update kinetostat kinetostat_->compute_kinetostat(dt); @@ -383,7 +383,7 @@ namespace ATC { // Class ThermostatRescaleMixedKePeCombined //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -447,7 +447,7 @@ namespace ATC { // Class KinetoThermostatGlcFs //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -598,7 +598,7 @@ namespace ATC { // do full prediction if we just redid the shape functions if (full_prediction()) { this->compute_lambda(dt); - + atomThermostatForces_->unfix_quantity(); // allow update of atomic force applied by lambda } @@ -612,7 +612,7 @@ namespace ATC { if (full_prediction()) atomThermostatForces_->fix_quantity(); - + // SPLIT OUT FUNCTION TO CREATE DELTA VARIABLES IN BASES, ONLY NEED THESE // update predicted nodal variables for second half of time step // velocity @@ -672,8 +672,8 @@ namespace ATC { this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy2_,0.5*dt); atc_->apply_inverse_mass_matrix(deltaEnergy2_,TEMPERATURE); myTemperature += deltaEnergy2_; - - + + isFirstTimestep_ = false; } @@ -695,7 +695,7 @@ namespace ATC { void KinetoThermostatGlcFs::output(OUTPUT_LIST & /* outputData */) { // DO NOT CALL INDIVIDUAL REGULATORS - // OUTPUT TOTAL FORCE AND TOTAL POWER + // OUTPUT TOTAL FORCE AND TOTAL POWER // OUTPUT EACH LAMBDA } diff --git a/lib/atc/KinetoThermostat.h b/lib/atc/KinetoThermostat.h index bc40f19ed1..c025e4b4f9 100644 --- a/lib/atc/KinetoThermostat.h +++ b/lib/atc/KinetoThermostat.h @@ -25,23 +25,23 @@ namespace ATC { * @brief Manager class for atom-continuum simulataneous control of momentum and thermal energy */ class KinetoThermostat : public AtomicRegulator { - + public: // constructor KinetoThermostat(ATC_Coupling * atc, const std::string & regulatorPrefix = ""); - + // destructor virtual ~KinetoThermostat(){}; - + /** parser/modifier */ virtual bool modify(int narg, char **arg); /** instantiate up the desired method(s) */ virtual void construct_methods(); - + // data access, intended for method objects /** reset the nodal power to a prescribed value */ virtual void reset_lambda_contribution(const DENS_MAT & target, @@ -56,10 +56,10 @@ namespace ATC { int couplingMaxIterations_; private: - + // DO NOT define this KinetoThermostat(); - + }; /** @@ -67,12 +67,12 @@ namespace ATC { * @brief Class for kinetostat/thermostat algorithms using the shape function matrices * (thermostats have general for of N^T w N lambda = rhs) */ - + class KinetoThermostatShapeFunction : public RegulatorMethod { - + public: - + KinetoThermostatShapeFunction(AtomicRegulator * kinetoThermostat, int couplingMaxIterations, const std::string & /* regulatorPrefix */) : RegulatorMethod(kinetoThermostat), @@ -80,7 +80,7 @@ namespace ATC { KinetoThermostatShapeFunction(AtomicRegulator * kinetoThermostat, int couplingMaxIterations) : RegulatorMethod(kinetoThermostat), couplingMaxIterations_(couplingMaxIterations) {}; - + virtual ~KinetoThermostatShapeFunction() {}; /** instantiate all needed data */ @@ -108,25 +108,25 @@ namespace ATC { * @class VelocityRescaleCombined * @brief Enforces constraints on atomic velocity based on FE temperature and velocity */ - + class VelocityRescaleCombined : public VelocityGlc { - + public: friend class KinetoThermostatRescale; // since this is basically a set of member functions for friend - + VelocityRescaleCombined(AtomicRegulator * kinetostat); - + virtual ~VelocityRescaleCombined(){}; /** pre-run initialization of method data */ virtual void initialize(); - + /** applies kinetostat to atoms */ virtual void apply_mid_predictor(double /* dt */){}; /** applies kinetostat to atoms */ virtual void apply_post_corrector(double /* dt */){}; - + /** local shape function matrices are incompatible with this mode */ virtual bool use_local_shape_functions() const {return false;}; @@ -135,10 +135,10 @@ namespace ATC { // data /** reference to AtC FE velocity */ DENS_MAN & velocity_; - + /** RHS correct based on thermostat */ DENS_MAN * thermostatCorrection_; - + // methods /** sets up appropriate rhs for kinetostat equations */ virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt); @@ -161,29 +161,29 @@ namespace ATC { // DO NOT define this VelocityRescaleCombined(); - + }; /** * @class ThermostatRescaleCombined * @brief Enforces constraint on atomic kinetic energy based on FE temperature and velocity */ - + class ThermostatRescaleCombined : public ThermostatRescale { - + public: - + ThermostatRescaleCombined(AtomicRegulator * thermostat); - + virtual ~ThermostatRescaleCombined() {}; /** pre-run initialization of method data */ virtual void initialize(); - + // deactivate un-needed methods /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double /* dt */){}; - + protected: // data @@ -201,21 +201,21 @@ namespace ATC { // DO NOT define this ThermostatRescaleCombined(); - + }; /** * @class KinetoThermostatRescale * @brief Enforces constraints on atomic kinetic energy and velocity based on FE temperature and velocity */ - + class KinetoThermostatRescale : public KinetoThermostatShapeFunction { - + public: - + KinetoThermostatRescale(AtomicRegulator * kinetoThermostat, int couplingMaxIterations); - + virtual ~KinetoThermostatRescale(); /** instantiate all needed data */ @@ -223,7 +223,7 @@ namespace ATC { /** pre-run initialization of method data */ virtual void initialize(); - + /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); @@ -233,7 +233,7 @@ namespace ATC { /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: // methods @@ -275,29 +275,29 @@ namespace ATC { // DO NOT define this KinetoThermostatRescale(); - + }; /** * @class ThermostatRescaleMixedKePeCombined * @brief Enforces constraint on atomic kinetic energy based on FE temperature and velocity when the temperature is comprised of both KE and PE contributions */ - + class ThermostatRescaleMixedKePeCombined : public ThermostatRescaleMixedKePe { - + public: - + ThermostatRescaleMixedKePeCombined(AtomicRegulator * thermostat); - + virtual ~ThermostatRescaleMixedKePeCombined() {}; /** pre-run initialization of method data */ virtual void initialize(); - + // deactivate un-needed methods /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double /* dt */){}; - + protected: // data @@ -315,7 +315,7 @@ namespace ATC { // DO NOT define this ThermostatRescaleMixedKePeCombined(); - + }; /** @@ -323,16 +323,16 @@ namespace ATC { * @brief Enforces constraint on atomic kinetic energy based on FE temperature * when the temperature is a mix of the KE and PE */ - + class KinetoThermostatRescaleMixedKePe : public KinetoThermostatRescale { - + public: - + KinetoThermostatRescaleMixedKePe(AtomicRegulator * kinetoThermostat, int couplingMaxIterations); virtual ~KinetoThermostatRescaleMixedKePe() {}; - + protected: /** creates the appropriate rescaling thermostat */ @@ -342,22 +342,22 @@ namespace ATC { // DO NOT define this KinetoThermostatRescaleMixedKePe(); - + }; /** * @class KinetoThermostatGlcFs * @brief Class for regulation algorithms based on Gaussian least constraints (GLC) for fractional step (FS) algorithsm */ - + class KinetoThermostatGlcFs : public KinetoThermostatShapeFunction { - + public: - + KinetoThermostatGlcFs(AtomicRegulator * kinetoThermostat, int couplingMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~KinetoThermostatGlcFs() {}; /** instantiate all needed data */ @@ -374,7 +374,7 @@ namespace ATC { /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); - + /** get data for output */ virtual void output(OUTPUT_LIST & outputData); @@ -494,12 +494,12 @@ namespace ATC { /* *\/ */ /* class ThermostatFlux : public ThermostatGlcFs { */ - + /* public: */ - + /* ThermostatFlux(Thermostat * thermostat, */ /* const std::string & regulatorPrefix = ""); */ - + /* virtual ~ThermostatFlux() {}; */ /* /\** instantiate all needed data *\/ */ @@ -507,7 +507,7 @@ namespace ATC { /* /\** pre-run initialization of method data *\/ */ /* virtual void initialize(); */ - + /* protected: */ /* /\** sets up appropriate rhs for thermostat equations *\/ */ @@ -539,12 +539,12 @@ namespace ATC { /* *\/ */ /* class ThermostatFixed : public ThermostatGlcFs { */ - + /* public: */ - + /* ThermostatFixed(Thermostat * thermostat, */ /* const std::string & regulatorPrefix = ""); */ - + /* virtual ~ThermostatFixed() {}; */ /* /\** instantiate all needed data *\/ */ @@ -552,7 +552,7 @@ namespace ATC { /* /\** pre-run initialization of method data *\/ */ /* virtual void initialize(); */ - + /* /\** applies thermostat to atoms in the predictor phase *\/ */ /* virtual void apply_pre_predictor(double dt); */ @@ -568,7 +568,7 @@ namespace ATC { /* /\** determine if local shape function matrices are needed *\/ */ /* virtual bool use_local_shape_functions() const {return atomicRegulator_->use_localized_lambda();}; */ - + /* protected: */ /* // methods */ @@ -639,12 +639,12 @@ namespace ATC { /* *\/ */ /* class ThermostatFluxFiltered : public ThermostatFlux { */ - + /* public: */ - + /* ThermostatFluxFiltered(Thermostat * thermostat, */ /* const std::string & regulatorPrefix = ""); */ - + /* virtual ~ThermostatFluxFiltered() {}; */ /* /\** pre-run initialization of method data *\/ */ @@ -655,7 +655,7 @@ namespace ATC { /* /\** get data for output *\/ */ /* virtual void output(OUTPUT_LIST & outputData); */ - + /* protected: */ /* /\** sets up appropriate rhs for thermostat equations *\/ */ @@ -685,19 +685,19 @@ namespace ATC { /* * @brief Class for thermostatting using the temperature matching constraint and is compatible with */ /* the fractional step time-integration with time filtering */ /* *\/ */ - + /* class ThermostatFixedFiltered : public ThermostatFixed { */ - + /* public: */ - + /* ThermostatFixedFiltered(Thermostat * thermostat, */ /* const std::string & regulatorPrefix = ""); */ - + /* virtual ~ThermostatFixedFiltered() {}; */ /* /\** get data for output *\/ */ /* virtual void output(OUTPUT_LIST & outputData); */ - + /* protected: */ /* // methods */ @@ -734,7 +734,7 @@ namespace ATC { /* ThermostatFluxFixed(Thermostat * thermostat, */ /* bool constructThermostats = true); */ - + /* virtual ~ThermostatFluxFixed(); */ /* /\** instantiate all needed data *\/ */ @@ -751,7 +751,7 @@ namespace ATC { /* /\** applies thermostat to atoms in the post-corrector phase *\/ */ /* virtual void apply_post_corrector(double dt); */ - + /* /\** get data for output *\/ */ /* virtual void output(OUTPUT_LIST & outputData); */ @@ -787,7 +787,7 @@ namespace ATC { /* public: */ /* ThermostatFluxFixedFiltered(Thermostat * thermostat); */ - + /* virtual ~ThermostatFluxFixedFiltered(){}; */ /* private: */ diff --git a/lib/atc/Kinetostat.cpp b/lib/atc/Kinetostat.cpp index 676896a2f9..21c319dbae 100644 --- a/lib/atc/Kinetostat.cpp +++ b/lib/atc/Kinetostat.cpp @@ -28,7 +28,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // modify: // parses and adjusts kinetostat state based on @@ -46,20 +46,20 @@ namespace ATC { /*! \page man_control_momentum fix_modify AtC control momentum \section syntax fix_modify AtC control momentum none \n - + fix_modify AtC control momentum rescale \n - frequency (int) = time step frequency for applying displacement and velocity rescaling \n - + fix_modify AtC control momentum glc_displacement \n - + fix_modify AtC control momentum glc_velocity \n fix_modify AtC control momentum hoover \n - fix_modify AtC control momentum flux [faceset face_set_id, interpolate] + fix_modify AtC control momentum flux [faceset face_set_id, interpolate] - face_set_id (string) = id of boundary face set, if not specified - (or not possible when the atomic domain does not line up with - mesh boundaries) defaults to an atomic-quadrature approximate + (or not possible when the atomic domain does not line up with + mesh boundaries) defaults to an atomic-quadrature approximate evaulation\n \section examples fix_modify AtC control momentum glc_velocity \n @@ -108,7 +108,7 @@ namespace ATC { foundMatch = true; } } - + if (!foundMatch) foundMatch = AtomicRegulator::modify(narg,arg); if (foundMatch) @@ -126,13 +126,13 @@ namespace ATC { DENS_MAN * lambdaForceFiltered = regulator_data("LambdaForceFiltered",nsd_); lambdaForceFiltered->set_quantity() = target; } - + //-------------------------------------------------------- // initialize: // sets up methods before a run - + // dependence, but in general there is also a - // time integrator dependence. In general the + // time integrator dependence. In general the // precedence order is: // time filter -> time integrator -> kinetostat // In the future this may need to be added if @@ -147,7 +147,7 @@ namespace ATC { if (atc_->reset_methods()) { // eliminate existing methods delete_method(); - + DENS_MAT nodalGhostForceFiltered; TimeIntegrator::TimeIntegrationType myIntegrationType = (atc_->time_integrator(VELOCITY))->time_integration_type(); TimeFilterManager * timeFilterManager = atc_->time_filter_manager(); @@ -156,9 +156,9 @@ namespace ATC { myMethod = dynamic_cast(regulatorMethod_); nodalGhostForceFiltered = (myMethod->filtered_ghost_force()).quantity(); } - + // update time filter - + if (timeFilterManager->need_reset()) { if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) { timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT_IMPLICIT); @@ -167,7 +167,7 @@ namespace ATC { timeFilter_ = timeFilterManager->construct(TimeFilterManager::IMPLICIT_UPDATE); } } - + if (timeFilterManager->filter_dynamics()) { switch (regulatorTarget_) { case NONE: { @@ -297,7 +297,7 @@ namespace ATC { // Class KinetostatShapeFunction //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -369,7 +369,7 @@ namespace ATC { // Class GlcKinetostat //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -391,7 +391,7 @@ namespace ATC { // needed fundamental quantities atomPositions_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION); - + // base class transfers KinetostatShapeFunction::construct_transfers(); } @@ -404,7 +404,7 @@ namespace ATC { { KinetostatShapeFunction::initialize(); - + // set up list of nodes using Hoover coupling // (a) nodes with prescribed values PrescribedDataManager * prescribedDataMgr(atc_->prescribed_data_manager()); @@ -455,7 +455,7 @@ namespace ATC { // Class DisplacementGlc //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -501,7 +501,7 @@ namespace ATC { else { linearSolverType_ = AtomicRegulator::CG_SOLVE; } - + // base class transfers GlcKinetostat::construct_transfers(); @@ -510,14 +510,14 @@ namespace ATC { atomKinetostatForce_ = new AtomicKinetostatForceDisplacement(atc_); interscaleManager.add_per_atom_quantity(atomKinetostatForce_, regulatorPrefix_+"AtomKinetostatForce"); - + // restricted force due to kinetostat nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_, atomKinetostatForce_, interscaleManager.per_atom_sparse_matrix("Interpolant")); interscaleManager.add_dense_matrix(nodalAtomicLambdaForce_, regulatorPrefix_+"NodalAtomicLambdaForce"); - + // nodal displacement restricted from atoms nodalAtomicMassWeightedDisplacement_ = interscaleManager.dense_matrix("NodalAtomicMassWeightedDisplacement"); } @@ -640,7 +640,7 @@ namespace ATC { DENS_MAT & nodalField, double weight) { - + DENS_MAT nodalLambdaRoc(nNodes_,nsd_); atc_->apply_inverse_mass_matrix(source, nodalLambdaRoc, @@ -666,13 +666,13 @@ namespace ATC { outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_nodalAtomicLambdaForceOut_); } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class DisplacementGlcFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -683,7 +683,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // apply_pre_filtering // applies first step of filtering to @@ -750,13 +750,13 @@ namespace ATC { outputData[regulatorPrefix_+"NodalLambdaForce"] = &lambdaForceFiltered; } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class VelocityGlc //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -805,7 +805,7 @@ namespace ATC { else { linearSolverType_ = AtomicRegulator::CG_SOLVE; } - + // base class transfers GlcKinetostat::construct_transfers(); @@ -813,18 +813,18 @@ namespace ATC { atomKinetostatForce_ = new AtomicKinetostatForceVelocity(atc_); interscaleManager.add_per_atom_quantity(atomKinetostatForce_, regulatorPrefix_+"AtomKinetostatForce"); - + // restricted force due to kinetostat nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_, atomKinetostatForce_, interscaleManager.per_atom_sparse_matrix("Interpolant")); interscaleManager.add_dense_matrix(nodalAtomicLambdaForce_, regulatorPrefix_+"NodalAtomicLambdaForce"); - + // nodal momentum restricted from atoms nodalAtomicMomentum_ = interscaleManager.dense_matrix("NodalAtomicMomentum"); - + } //-------------------------------------------------------- @@ -891,7 +891,7 @@ namespace ATC { // set up rhs DENS_MAT rhs(nNodes_,nsd_); this->set_kinetostat_rhs(rhs,dt); - + // solve linear system for lambda solve_for_lambda(rhs,lambda_->set_quantity()); #ifdef OBSOLETE @@ -975,7 +975,7 @@ namespace ATC { DENS_MAT & nodalField, double weight) { - + DENS_MAT nodalLambdaRoc(nNodes_,nsd_); atc_->apply_inverse_mass_matrix(source, nodalLambdaRoc, @@ -984,7 +984,7 @@ namespace ATC { for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) { nodalLambdaRoc(iter->first,iter->second) = 0.; } - + nodalField += weight*nodalLambdaRoc; } @@ -1000,18 +1000,18 @@ namespace ATC { outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_nodalAtomicLambdaForceOut_); } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class VelocityGlcFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data //-------------------------------------------------------- - VelocityGlcFiltered::VelocityGlcFiltered(AtomicRegulator *kinetostat) + VelocityGlcFiltered::VelocityGlcFiltered(AtomicRegulator *kinetostat) : VelocityGlc(kinetostat), nodalAtomicVelocities_(atc_->nodal_atomic_field(VELOCITY)) { @@ -1087,7 +1087,7 @@ namespace ATC { // Class StressFlux //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -1152,7 +1152,7 @@ namespace ATC { atomKinetostatForce_ = new AtomicKinetostatForceStress(atc_,atomLambdas_); interscaleManager.add_per_atom_quantity(atomKinetostatForce_, regulatorPrefix_+"AtomKinetostatForce"); - + // restricted force due to kinetostat nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_, atomKinetostatForce_, @@ -1254,7 +1254,7 @@ namespace ATC { //-------------------------------------------------------- void StressFlux::set_kinetostat_rhs(DENS_MAT & rhs, double /* dt */) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV - \sum_g N_Ig^* f_g // sources are set in ATC transfer rhs.reset(nNodes_,nsd_); @@ -1262,9 +1262,9 @@ namespace ATC { if (nodalGhostForce_) { rhs -= nodalGhostForce_->quantity(); } - + // (b) for ess. bcs - + // form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I} DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity(); atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY); @@ -1352,7 +1352,7 @@ namespace ATC { // Class StressFluxGhost //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -1409,14 +1409,14 @@ namespace ATC { //-------------------------------------------------------- void StressFluxGhost::set_kinetostat_rhs(DENS_MAT & rhs, double /* dt */) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV - \sum_g N_Ig^* f_g // sources are set in ATC transfer rhs.reset(nNodes_,nsd_); rhs = momentumSource_.quantity(); - + // (b) for ess. bcs - + // form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I} DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity(); atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY); @@ -1434,7 +1434,7 @@ namespace ATC { // Class StressFluxFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -1453,14 +1453,14 @@ namespace ATC { void StressFluxFiltered::set_kinetostat_rhs(DENS_MAT & rhs, double dt) { // set basic terms - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV - \sum_g N_Ig^* f_g // sources are set in ATC transfer rhs.reset(nNodes_,nsd_); rhs = momentumSource_.quantity() - nodalGhostForceFiltered_.quantity(); - + // (b) for ess. bcs - + // form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I} DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity(); atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY); @@ -1530,7 +1530,7 @@ namespace ATC { // Class KinetostatGlcFs //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -1597,7 +1597,7 @@ namespace ATC { void KinetostatGlcFs::initialize() { KinetostatShapeFunction::initialize(); - + TimeFilterManager * timeFilterManager = atc_->time_filter_manager(); if (!timeFilterManager->end_equilibrate()) { // we should reset lambda and lambdaForce to zero in this case @@ -1675,7 +1675,7 @@ namespace ATC { // update filtered forces timeFilter_->apply_pre_step1(lambdaForceFiltered,nodalAtomicLambdaForce,dt); - // apply lambda force to atoms and compute instantaneous lambda force + // apply lambda force to atoms and compute instantaneous lambda force this->apply_to_atoms(atomVelocities_,nodalAtomicMomentum_, atomKinetostatForce_->quantity(), nodalAtomicLambdaForce,0.5*dt); @@ -1710,13 +1710,13 @@ namespace ATC { nodalAtomicPredictedMomentum_, atomKinetostatForce_->quantity(), myNodalAtomicLambdaForce,0.5*dt); - + // update predicted nodal variables for second half of time step this->add_to_momentum(myNodalAtomicLambdaForce,deltaMomentum_,0.5*dt); atc_->apply_inverse_mass_matrix(deltaMomentum_,VELOCITY); velocity_ += deltaMomentum_; } - + //-------------------------------------------------------- // apply_post_corrector: // apply the kinetostat to the atoms in the @@ -1746,7 +1746,7 @@ namespace ATC { atc_->apply_inverse_mass_matrix(deltaMomentum_,VELOCITY); velocity_ += deltaMomentum_; - + isFirstTimestep_ = false; } @@ -1787,7 +1787,7 @@ namespace ATC { // Class KinetostatFlux //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -1838,7 +1838,7 @@ namespace ATC { // sets up space for ghost force related variables if (atc_->groupbit_ghost()) { - MatrixDependencyManager * nodeToOverlapMap = + MatrixDependencyManager * nodeToOverlapMap = interscaleManager.dense_matrix_int(regulatorPrefix_+"NodeToOverlapMap"); GhostCouplingMatrix * shapeFunctionGhost = new GhostCouplingMatrix(atc_,interscaleManager.per_atom_sparse_matrix("InterpolantGhost"), regulatedNodes_, @@ -1861,7 +1861,7 @@ namespace ATC { void KinetostatFlux::initialize() { KinetostatGlcFs::initialize(); - + TimeFilterManager * timeFilterManager = atc_->time_filter_manager(); if (!timeFilterManager->end_equilibrate()) { // we should reset lambda and lambdaForce to zero in this case @@ -1894,13 +1894,13 @@ namespace ATC { interscaleManager.add_set_int(regulatedNodes_, regulatorPrefix_+"KinetostatRegulatedNodes"); } - + // if localized monitor nodes with applied fluxes if (atomicRegulator_->use_localized_lambda()) { if ((atomicRegulator_->coupling_mode() == Kinetostat::FLUX) && (atomicRegulator_->boundary_integration_type() != NO_QUADRATURE)) { // include boundary nodes applicationNodes_ = new FluxBoundaryNodes(atc_); - + boundaryNodes_ = new BoundaryNodes(atc_); interscaleManager.add_set_int(boundaryNodes_, regulatorPrefix_+"KinetostatBoundaryNodes"); @@ -1916,7 +1916,7 @@ namespace ATC { applicationNodes_ = regulatedNodes_; } - // special set of boundary elements for boundary flux quadrature + // special set of boundary elements for boundary flux quadrature if ((atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION) && (atomicRegulator_->use_localized_lambda())) { elementMask_ = interscaleManager.dense_matrix_bool(regulatorPrefix_+"BoundaryElementMask"); @@ -1943,7 +1943,7 @@ namespace ATC { KinetostatGlcFs::apply_pre_predictor(dt); } - + //-------------------------------------------------------- // apply_post_corrector: // apply the kinetostat to the atoms in the @@ -1956,7 +1956,7 @@ namespace ATC { timeFilter_->apply_post_step1(nodalGhostForceFiltered_->set_quantity(), nodalGhostForce_->quantity(),dt); } - + // compute the kinetostat equation and update lambda KinetostatGlcFs::apply_post_corrector(dt); } @@ -1987,7 +1987,7 @@ namespace ATC { //-------------------------------------------------------- void KinetostatFlux::set_kinetostat_rhs(DENS_MAT & rhs, double /* dt */) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV - \sum_g N_Ig^* f_g // sources are set in ATC transfer rhs.reset(nNodes_,nsd_); @@ -2026,7 +2026,7 @@ namespace ATC { // Class KinetostatFluxGhost //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -2088,7 +2088,7 @@ namespace ATC { //-------------------------------------------------------- void KinetostatFluxGhost::set_kinetostat_rhs(DENS_MAT & rhs, double /* dt */) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV - \sum_g N_Ig^* f_g // sources are set in ATC transfer rhs.reset(nNodes_,nsd_); @@ -2107,7 +2107,7 @@ namespace ATC { // Class KinetostatFixed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and kinetostat data @@ -2211,14 +2211,14 @@ namespace ATC { else { throw ATC_Error("KinetostatFixed::construct_regulated_nodes - couldn't determine set of regulated nodes"); } - + interscaleManager.add_set_int(regulatedNodes_, regulatorPrefix_+"RegulatedNodes"); } applicationNodes_ = regulatedNodes_; - // special set of boundary elements for defining regulated atoms + // special set of boundary elements for defining regulated atoms if (atomicRegulator_->use_localized_lambda()) { elementMask_ = interscaleManager.dense_matrix_bool(regulatorPrefix_+"BoundaryElementMask"); if (!elementMask_) { @@ -2310,15 +2310,15 @@ namespace ATC { nodalAtomicMomentumFiltered_ = _tempNodalAtomicMomentumFiltered_; } } - + //-------------------------------------------------------- // apply_post_corrector: // apply the kinetostat to the atoms in the // post-corrector integration phase //-------------------------------------------------------- void KinetostatFixed::apply_post_corrector(double dt) - { - + { + bool halveForce = halve_force(); KinetostatGlcFs::apply_post_corrector(dt); @@ -2333,8 +2333,8 @@ namespace ATC { // 1) makes up for poor initial condition // 2) accounts for possibly large value of lambda when atomic shape function values change // from eulerian mapping after more than 1 timestep - // avoids unstable oscillations arising from - // thermostat having to correct for error introduced in lambda changing the + // avoids unstable oscillations arising from + // thermostat having to correct for error introduced in lambda changing the // shape function matrices *lambda_ *= 0.5; } @@ -2396,7 +2396,7 @@ namespace ATC { // Class KinetostatFluxFixed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- diff --git a/lib/atc/Kinetostat.h b/lib/atc/Kinetostat.h index e3e1c17e52..e8469a6bff 100644 --- a/lib/atc/Kinetostat.h +++ b/lib/atc/Kinetostat.h @@ -22,16 +22,16 @@ namespace ATC { */ class Kinetostat : public AtomicRegulator { - + public: // constructor Kinetostat(ATC_Coupling *atc, const std::string & regulatorPrefix = ""); - + // destructor virtual ~Kinetostat(){}; - + /** parser/modifier */ virtual bool modify(int narg, char **arg); @@ -53,14 +53,14 @@ namespace ATC { * @class KinetostatShapeFunction * @brief Base class for implementation of kinetostat algorithms based on FE shape functions */ - + class KinetostatShapeFunction : public RegulatorShapeFunction { - + public: - + KinetostatShapeFunction(AtomicRegulator *kinetostat, const std::string & regulatorPrefix = ""); - + virtual ~KinetostatShapeFunction(){}; /** instantiate all needed data */ @@ -95,23 +95,23 @@ namespace ATC { DENS_MAT _nodalAtomicLambdaForceOut_; // matrix for output only private: - + // DO NOT define this KinetostatShapeFunction(); }; - + /** * @class GlcKinetostat * @brief Base class for implementation of kinetostat algorithms based on Gaussian least constraints (GLC) */ - + class GlcKinetostat : public KinetostatShapeFunction { - + public: - + GlcKinetostat(AtomicRegulator *kinetostat); - + virtual ~GlcKinetostat(){}; /** instantiate all needed data */ @@ -139,30 +139,30 @@ namespace ATC { /** nodeset corresponding to Hoover coupling */ std::set > hooverNodes_; - + /** pointer to atom positions */ FundamentalAtomQuantity * atomPositions_; private: - + // DO NOT define this GlcKinetostat(); }; - + /** * @class DisplacementGlc * @brief Enforces GLC on atomic position based on FE displacement */ - + class DisplacementGlc : public GlcKinetostat { - + public: - + DisplacementGlc(AtomicRegulator * kinetostat); - + virtual ~DisplacementGlc(){}; - + /** instantiate all needed data */ virtual void construct_transfers(); @@ -177,9 +177,9 @@ namespace ATC { /** determine if local shape function matrices are needed */ virtual bool use_local_shape_functions() const {return (!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda();}; - + protected: - + // methods /** set weighting factor for in matrix Nhat^T * weights * Nhat */ virtual void set_weights(); @@ -204,36 +204,36 @@ namespace ATC { DENS_MAN & nodalDisplacements_; private: - + // DO NOT define this DisplacementGlc(); - + }; /** * @class DisplacementGlcFiltered * @brief Enforces GLC on time filtered atomic position based on FE displacement */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class DisplacementGlcFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + class DisplacementGlcFiltered : public DisplacementGlc { - + public: - + DisplacementGlcFiltered(AtomicRegulator * kinetostat); - + virtual ~DisplacementGlcFiltered(){}; /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: - + // methods /** does initial filtering operations before main computation */ virtual void apply_pre_filtering(double dt); @@ -247,29 +247,29 @@ namespace ATC { DENS_MAN & nodalAtomicDisplacements_; private: - + // DO NOT define this DisplacementGlcFiltered(); - + }; /** * @class VelocityGlc * @brief Enforces GLC on atomic velocity based on FE velocity */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class VelocityGlc //-------------------------------------------------------- //-------------------------------------------------------- - + class VelocityGlc : public GlcKinetostat { - + public: - + VelocityGlc(AtomicRegulator * kinetostat); - + virtual ~VelocityGlc(){}; /** instantiate all needed data */ @@ -277,7 +277,7 @@ namespace ATC { /** pre-run initialization of method data */ virtual void initialize(); - + /** applies kinetostat to atoms */ virtual void apply_mid_predictor(double dt); @@ -286,12 +286,12 @@ namespace ATC { /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + /** determine if local shape function matrices are needed */ virtual bool use_local_shape_functions() const {return (!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda();}; protected: - + // methods /** set weighting factor for in matrix Nhat^T * weights * Nhat */ virtual void set_weights(); @@ -321,31 +321,31 @@ namespace ATC { // DO NOT define this VelocityGlc(); - + }; /** * @class VelocityGlcFiltered * @brief Enforces GLC on time filtered atomic velocity based on FE velocity */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class VelocityGlcFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + class VelocityGlcFiltered : public VelocityGlc { - + public: - + VelocityGlcFiltered(AtomicRegulator * kinetostat); - + virtual ~VelocityGlcFiltered(){}; /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: // methods @@ -355,7 +355,7 @@ namespace ATC { virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt); /** computes the nodal FE force applied by the kinetostat */ virtual void compute_nodal_lambda_force(double dt); - + // data /** clone of FE nodal atomic velocity field */ DENS_MAN & nodalAtomicVelocities_; @@ -364,7 +364,7 @@ namespace ATC { // DO NOT define this VelocityGlcFiltered(); - + }; /** @@ -377,13 +377,13 @@ namespace ATC { // Class StressFlux //-------------------------------------------------------- //-------------------------------------------------------- - + class StressFlux : public GlcKinetostat { - + public: - + StressFlux(AtomicRegulator * kinetostat); - + virtual ~StressFlux(); /** instantiate all needed data */ @@ -408,7 +408,7 @@ namespace ATC { /** determine if local shape function matrices are needed */ virtual bool use_local_shape_functions() const {return ((!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda());}; - + protected: // data @@ -459,13 +459,13 @@ namespace ATC { // Class StressFluxGhost //-------------------------------------------------------- //-------------------------------------------------------- - + class StressFluxGhost : public StressFlux { - + public: - + StressFluxGhost(AtomicRegulator * kinetostat); - + virtual ~StressFluxGhost() {}; /** instantiate all needed data */ @@ -473,7 +473,7 @@ namespace ATC { /** compute boundary flux, requires kinetostat input since it is part of the coupling scheme */ virtual void compute_boundary_flux(FIELDS & fields); - + protected: // methods @@ -493,19 +493,19 @@ namespace ATC { * @class StressFluxFiltered * @brief Enforces GLC on time filtered atomic forces based on FE stresses or accelerations */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class StressFluxFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + class StressFluxFiltered : public StressFlux { - + public: - + StressFluxFiltered(AtomicRegulator * kinetostat); - + virtual ~StressFluxFiltered(){}; /** adds in finite element rhs contributions */ @@ -513,7 +513,7 @@ namespace ATC { /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: // data @@ -522,7 +522,7 @@ namespace ATC { // methods /** sets up appropriate rhs for kinetostat equations */ virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt); - + /** apply forces to atoms */ virtual void apply_to_atoms(PerAtomQuantity * quantity, const DENS_MAT & lambdaAtom, @@ -540,14 +540,14 @@ namespace ATC { * @brief Base class for implementation of kinetostat algorithms based on Gaussian least constraints (GLC) * when fractional step time integration is used */ - + class KinetostatGlcFs : public KinetostatShapeFunction { - + public: - + KinetostatGlcFs(AtomicRegulator *kinetostat, const std::string & regulatorPrefix = ""); - + virtual ~KinetostatGlcFs(){}; /** instantiate all needed data */ @@ -564,7 +564,7 @@ namespace ATC { /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); - + /** get data for output */ virtual void output(OUTPUT_LIST & outputData); @@ -626,7 +626,7 @@ namespace ATC { DENS_MAT _velocityDelta_; // change in velocity when lambda force is applied private: - + // DO NOT define this KinetostatGlcFs(); @@ -637,14 +637,14 @@ namespace ATC { * @brief Implementation of kinetostat algorithms based on Gaussian least constraints (GLC) * which apply stresses when fractional step time integration is used */ - + class KinetostatFlux : public KinetostatGlcFs { - + public: - + KinetostatFlux(AtomicRegulator *kinetostat, const std::string & regulatorPrefix = ""); - + virtual ~KinetostatFlux(){}; /** instantiate all needed data */ @@ -680,7 +680,7 @@ namespace ATC { // member data /** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling */ DENS_MAN & momentumSource_; - + /** force from ghost atoms restricted to nodes */ DENS_MAN * nodalGhostForce_; @@ -688,7 +688,7 @@ namespace ATC { DENS_MAN * nodalGhostForceFiltered_; private: - + // DO NOT define this KinetostatFlux(); @@ -698,14 +698,14 @@ namespace ATC { * @class KinetostatFluxGhost * @brief Implements ghost-atom boundary flux and other loads for fractional-step based kinetostats */ - + class KinetostatFluxGhost : public KinetostatFlux { - + public: - + KinetostatFluxGhost(AtomicRegulator *kinetostat, const std::string & regulatorPrefix = ""); - + virtual ~KinetostatFluxGhost(){}; /** instantiate all needed data */ @@ -726,7 +726,7 @@ namespace ATC { double dt); private: - + // DO NOT define this KinetostatFluxGhost(); @@ -737,14 +737,14 @@ namespace ATC { * @brief Implementation of kinetostat algorithms based on Gaussian least constraints (GLC) * which perform Hoover coupling when fractional step time integration is used */ - + class KinetostatFixed : public KinetostatGlcFs { - + public: - + KinetostatFixed(AtomicRegulator *kinetostat, const std::string & regulatorPrefix = ""); - + virtual ~KinetostatFixed(){}; /** instantiate all needed data */ @@ -819,7 +819,7 @@ namespace ATC { DENS_MAT _tempNodalAtomicMomentumFiltered_; // stores filtered momentum change in atoms for persistence during predictor private: - + // DO NOT define this KinetostatFixed(); @@ -836,7 +836,7 @@ namespace ATC { KinetostatFluxFixed(AtomicRegulator * kinetostat, bool constructThermostats = true); - + virtual ~KinetostatFluxFixed(); /** instantiate all needed data */ @@ -853,7 +853,7 @@ namespace ATC { /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); - + /** get data for output */ virtual void output(OUTPUT_LIST & outputData); diff --git a/lib/atc/LammpsInterface.cpp b/lib/atc/LammpsInterface.cpp index b123331ee7..ea8a64ec4c 100644 --- a/lib/atc/LammpsInterface.cpp +++ b/lib/atc/LammpsInterface.cpp @@ -16,7 +16,7 @@ #include "compute_cna_atom.h" // computes common-neighbor-analysis per atom #include "compute_coord_atom.h" // computes coordination number per atom #include "compute_ke_atom.h" // computes kinetic energy per atom -#include "modify.h" // +#include "modify.h" // #include "neighbor.h" // neighbors #include "neigh_list.h" // neighbor list #include "update.h" // timestepping information @@ -110,7 +110,7 @@ void LammpsInterface::comm_borders() const { lammps_->comm->borders(); } void LammpsInterface::sparse_allsum(SparseMatrix &toShare) const { toShare.compress(); - + // initialize MPI information int nProcs; int myRank; @@ -119,7 +119,7 @@ void LammpsInterface::sparse_allsum(SparseMatrix &toShare) const int error; - // get numbers of rows, columns, rowsCRS, and + // get numbers of rows, columns, rowsCRS, and // sizes (number of nonzero elements in matrix) SparseMatInfo *recInfo = new SparseMatInfo[nProcs]; SparseMatInfo myInfo; @@ -174,7 +174,7 @@ void LammpsInterface::sparse_allsum(SparseMatrix &toShare) const rec_ja, sizeCounts, sizeOffsets, MPI_INT, lammps_->world); if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_colarray "+to_string(error)); - + // get the array of values double *rec_vals = new double[totalSize]; error = MPI_Allgatherv(toShare.ptr(), sizeCounts[myRank], MPI_DOUBLE, @@ -182,8 +182,8 @@ void LammpsInterface::sparse_allsum(SparseMatrix &toShare) const if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_valarray "+to_string(error)); - INDEX *rec_ia_proc; - INDEX *rec_ja_proc; + INDEX *rec_ia_proc; + INDEX *rec_ja_proc; double *rec_vals_proc; for (int i = 0; i < nProcs; i++) { if (myRank != i) { @@ -191,24 +191,24 @@ void LammpsInterface::sparse_allsum(SparseMatrix &toShare) const rec_ia_proc = new INDEX[rowCounts[i]]; rec_ja_proc = new INDEX[sizeCounts[i]]; rec_vals_proc = new double[sizeCounts[i]]; - + // copy the data passed with MPI into the new spots - copy(rec_ia + rowOffsets[i], + copy(rec_ia + rowOffsets[i], rec_ia + rowOffsets[i] + rowCounts[i], rec_ia_proc); - copy(rec_ja + sizeOffsets[i], + copy(rec_ja + sizeOffsets[i], rec_ja + sizeOffsets[i] + sizeCounts[i], rec_ja_proc); - copy(rec_vals + sizeOffsets[i], + copy(rec_vals + sizeOffsets[i], rec_vals + sizeOffsets[i] + sizeCounts[i], rec_vals_proc); // Does anyone know why we have to declare tempMat here (as well as set it equal to - // something) to avoid segfaults? there are still segfaults, but they happen at a much + // something) to avoid segfaults? there are still segfaults, but they happen at a much // later stage of the game now (and for less benchmarks overall). SparseMatrix tempMat = - SparseMatrix(rec_ia_proc, rec_ja_proc, rec_vals_proc, - recInfo[i].size, recInfo[i].rows, + SparseMatrix(rec_ia_proc, rec_ja_proc, rec_vals_proc, + recInfo[i].size, recInfo[i].rows, recInfo[i].cols, recInfo[i].rowsCRS); toShare += tempMat; } @@ -259,7 +259,7 @@ int LammpsInterface::nghost() const { return lammps_->atom->nghost; } bool LammpsInterface::atoms_sorted() const { int sortfreq = lammps_->atom->sortfreq; - if (sortfreq > 0) { return true; } + if (sortfreq > 0) { return true; } else { return false; } } @@ -273,7 +273,7 @@ int LammpsInterface::ntypes() const { return lammps_->atom->ntypes; } double ** LammpsInterface::xatom() const { return lammps_->atom->x; } -int LammpsInterface::type_to_charge(int atype) const { +int LammpsInterface::type_to_charge(int atype) const { double *q = lammps_->atom->q; if (! q) return 0; int nlocal = lammps_->atom->nlocal; @@ -281,7 +281,7 @@ int LammpsInterface::type_to_charge(int atype) const { double aq = 0.0; for (int i = 0; i < nlocal; i++) { if (type[i] == atype) { - aq = q[i]; + aq = q[i]; break; } } @@ -380,7 +380,7 @@ double LammpsInterface::atom_quantity_conversion(FundamentalAtomQuantity quantit else throw ATC_Error("BAD type requested in atom_quantity_conversion"); } - + // ----------------------------------------------------------------- // domain interface methods // ----------------------------------------------------------------- @@ -391,7 +391,7 @@ int LammpsInterface::nregion() const { return lammps_->domain->nregion; } void LammpsInterface::box_bounds(double & boxxlo, double & boxxhi, double & boxylo, double & boxyhi, - double & boxzlo, double &boxzhi) const + double & boxzlo, double &boxzhi) const { if (lammps_->domain->triclinic == 0) { boxxlo = lammps_->domain->boxlo[0]; @@ -417,7 +417,7 @@ bool LammpsInterface::in_box(double * x) const box_bounds(xlo,xhi,ylo,yhi,zlo,zhi); if (x[0] >= xlo && x[0] < xhi && x[1] >= ylo && x[1] < yhi && - x[2] >= zlo && x[2] < zhi) + x[2] >= zlo && x[2] < zhi) return true; return false; } @@ -426,9 +426,9 @@ bool LammpsInterface::in_my_processor_box(double * x) const { if (x[0] >= lammps_->domain->sublo[0] && x[0] < lammps_->domain->subhi[0] && x[1] >= lammps_->domain->sublo[1] && x[1] < lammps_->domain->subhi[1] && - x[2] >= lammps_->domain->sublo[2] && x[2] < lammps_->domain->subhi[2]) + x[2] >= lammps_->domain->sublo[2] && x[2] < lammps_->domain->subhi[2]) return true; - if (! in_box(x)) + if (! in_box(x)) throw ATC_Error("point is in no processors box"); return false; } @@ -436,7 +436,7 @@ bool LammpsInterface::in_my_processor_box(double * x) const void LammpsInterface::sub_bounds(double & subxlo, double & subxhi, double & subylo, double & subyhi, - double & subzlo, double & subzhi) const + double & subzlo, double & subzhi) const { if (lammps_->domain->triclinic == 0) { subxlo = lammps_->domain->sublo[0]; @@ -457,8 +457,8 @@ int LammpsInterface::yperiodic() const { return lammps_->domain->yperiodic; } int LammpsInterface::zperiodic() const { return lammps_->domain->zperiodic; } -int LammpsInterface::nperiodic() const -{ +int LammpsInterface::nperiodic() const +{ int nprd = 0; if ( lammps_->domain->xperiodic > 0 ) { nprd++ ; } if ( lammps_->domain->yperiodic > 0 ) { nprd++ ; } @@ -467,10 +467,10 @@ int LammpsInterface::nperiodic() const } // correct posistions for periodic box -void LammpsInterface::periodicity_correction(double * x) const +void LammpsInterface::periodicity_correction(double * x) const { - int* periodicity = lammps_->domain->periodicity; - if (!refBoxIsSet_) set_reference_box(); + int* periodicity = lammps_->domain->periodicity; + if (!refBoxIsSet_) set_reference_box(); for (int m = 0; m < 3; m++) { if ((bool) periodicity[m]) { if (x[m] < lower_[m] || x[m] > upper_[m]) { @@ -483,15 +483,15 @@ void LammpsInterface::periodicity_correction(double * x) const } } -void LammpsInterface::set_reference_box(void) const +void LammpsInterface::set_reference_box(void) const { double * hi = lammps_->domain->boxhi; double * lo = lammps_->domain->boxlo; double * len = lammps_->domain->prd; for (int i = 0; i < 3; i++) { - upper_[i] = hi[i]; - lower_[i] = lo[i]; - length_[i] = len[i]; + upper_[i] = hi[i]; + lower_[i] = lo[i]; + length_[i] = len[i]; } refBoxIsSet_ = true; } @@ -503,7 +503,7 @@ double LammpsInterface::domain_yprd() const { return lammps_->domain->yprd; } double LammpsInterface::domain_zprd() const { return lammps_->domain->zprd; } -double LammpsInterface::domain_volume() const +double LammpsInterface::domain_volume() const { return (lammps_->domain->xprd)* (lammps_->domain->yprd)* @@ -520,7 +520,7 @@ int LammpsInterface::domain_triclinic() const { return lammps_->domain->triclini void LammpsInterface::box_periodicity(int & xperiodic, int & yperiodic, - int & zperiodic) const + int & zperiodic) const { xperiodic = lammps_->domain->xperiodic; yperiodic = lammps_->domain->yperiodic; @@ -548,11 +548,11 @@ bool LammpsInterface::region_bounds(const char * regionName, xscale = region_xscale(iRegion); yscale = region_yscale(iRegion); zscale = region_zscale(iRegion); - xmin = region_xlo(iRegion); + xmin = region_xlo(iRegion); xmax = region_xhi(iRegion); - ymin = region_ylo(iRegion); + ymin = region_ylo(iRegion); ymax = region_yhi(iRegion); - zmin = region_zlo(iRegion); + zmin = region_zlo(iRegion); zmax = region_zhi(iRegion); if (strcmp(region_style(iRegion),"block")==0) { return true; } else { return false; } @@ -588,10 +588,10 @@ double LammpsInterface::convert_units(double value, UnitsType in, UnitsType out, } else if (out==ATC) { if (units_style()==REAL) { - return value; + return value; } else if (units_style()==METAL) { - return convert_units(value, METAL, out, massExp, lenExp, timeExp)*1.0; + return convert_units(value, METAL, out, massExp, lenExp, timeExp)*1.0; } } else throw ATC_Error("can't convert"); @@ -602,10 +602,10 @@ double LammpsInterface::convert_units(double value, UnitsType in, UnitsType out, } else if (out==ATC) { if (units_style()==REAL) { - return convert_units(value, REAL, out, massExp, lenExp, timeExp)*1.0; + return convert_units(value, REAL, out, massExp, lenExp, timeExp)*1.0; } else if (units_style()==METAL) { - return value; + return value; } } else throw ATC_Error("can't convert"); @@ -626,9 +626,9 @@ double LammpsInterface::ylattice() const { return lammps_->domain->lattice->ylat double LammpsInterface::zlattice() const { return lammps_->domain->lattice->zlattice; } LammpsInterface::LatticeType LammpsInterface::lattice_style() const -{ - if (lammps_->domain->lattice) - return (LammpsInterface::LatticeType)lammps_->domain->lattice->style; +{ + if (lammps_->domain->lattice) + return (LammpsInterface::LatticeType)lammps_->domain->lattice->style; else throw ATC_Error("Lattice has not been defined"); } @@ -672,7 +672,7 @@ double LammpsInterface::near_neighbor_cutoff(void) const double alat = LammpsInterface::max_lattice_constant(); LatticeType type = lattice_style(); if (type == LammpsInterface::SC) { - cutoff = 0.5*(1.0+sqrt(2.0))*alat; + cutoff = 0.5*(1.0+sqrt(2.0))*alat; } else if (type == LammpsInterface::BCC) { cutoff = 0.5*(0.5*sqrt(3.0)+1.0)*alat; } else if (type == LammpsInterface::FCC) { @@ -682,16 +682,16 @@ double LammpsInterface::near_neighbor_cutoff(void) const } else if (type == LammpsInterface::DIAMOND) { cutoff = 0.5*(0.25*sqrt(3.0)+1.0/sqrt(2.0))*alat; } else if (type == LammpsInterface::SQ) { - cutoff = 0.5*(1.0+sqrt(2.0))*alat; + cutoff = 0.5*(1.0+sqrt(2.0))*alat; } else if (type == LammpsInterface::SQ2) { - cutoff = 0.5*(1.0/sqrt(2.0)+1.0)*alat; + cutoff = 0.5*(1.0/sqrt(2.0)+1.0)*alat; } else if (type == LammpsInterface::HEX) { - cutoff = 0.5*(1.0/sqrt(3.0)+1.0)*alat; + cutoff = 0.5*(1.0/sqrt(3.0)+1.0)*alat; } else { throw ATC_Error("Unknown lattice type"); } return cutoff; -} +} //* gets the unit cell vectors void LammpsInterface::unit_cell(double *a1, double *a2, double *a3) const @@ -702,7 +702,7 @@ void LammpsInterface::unit_cell(double *a1, double *a2, double *a3) const LAMMPS_NS::Lattice *lattice = lammps_->domain->lattice; // transform origin lattice->lattice2box(origin[0], origin[1], origin[2]); - + // copy reference lattice vectors memcpy(a[0], lattice->a1, 3*sizeof(double)); memcpy(a[1], lattice->a2, 3*sizeof(double)); @@ -710,7 +710,7 @@ void LammpsInterface::unit_cell(double *a1, double *a2, double *a3) const for (i=0; i<3; i++) { - lattice->lattice2box(a[i][0], a[i][1], a[i][2]); + lattice->lattice2box(a[i][0], a[i][1], a[i][2]); for (j=0; j<3; j++) a[i][j] -= origin[j]; } } @@ -727,7 +727,7 @@ int LammpsInterface::num_atoms_per_cell(void) const else if (comm_rank()==0) { //{throw ATC_Error("lattice style not currently supported by ATC");} print_msg_once("WARNING: Cannot get number of atoms per cell from lattice"); - naCell = 1; + naCell = 1; } return naCell; } @@ -736,7 +736,7 @@ int LammpsInterface::num_atoms_per_cell(void) const double LammpsInterface::volume_per_atom(void) const { double naCell = num_atoms_per_cell(); - double volPerAtom = + double volPerAtom = xlattice() * ylattice() * zlattice() / naCell; return volPerAtom; } @@ -762,24 +762,24 @@ void LammpsInterface::lattice(MATRIX &N, MATRIX &B) const double LammpsInterface::boltz() const{ return lammps_->force->boltz; } -double LammpsInterface::mvv2e() const{ return lammps_->force->mvv2e; } +double LammpsInterface::mvv2e() const{ return lammps_->force->mvv2e; } -double LammpsInterface::ftm2v()const { return lammps_->force->ftm2v; } +double LammpsInterface::ftm2v()const { return lammps_->force->ftm2v; } -double LammpsInterface::nktv2p()const{ return lammps_->force->nktv2p; } +double LammpsInterface::nktv2p()const{ return lammps_->force->nktv2p; } -double LammpsInterface::qqr2e() const{ return lammps_->force->qqr2e; } +double LammpsInterface::qqr2e() const{ return lammps_->force->qqr2e; } -double LammpsInterface::qe2f() const{ return lammps_->force->qe2f; } +double LammpsInterface::qe2f() const{ return lammps_->force->qe2f; } double LammpsInterface::dielectric()const{return lammps_->force->dielectric; } double LammpsInterface::qqrd2e()const{ return lammps_->force->qqrd2e; } double LammpsInterface::qv2e() const{ return qe2f()*ftm2v(); } -double LammpsInterface::pair_force(int i, int j, double rsq, - double & fmag_over_rmag) const -{ +double LammpsInterface::pair_force(int i, int j, double rsq, + double & fmag_over_rmag) const +{ int itype = (lammps_->atom->type)[i]; int jtype = (lammps_->atom->type)[j]; // return value is the energy @@ -789,9 +789,9 @@ double LammpsInterface::pair_force(int i, int j, double rsq, } return 0.0; } -double LammpsInterface::pair_force(int n, double rsq, - double & fmag_over_rmag) const -{ +double LammpsInterface::pair_force(int n, double rsq, + double & fmag_over_rmag) const +{ int i = bond_list_i(n); int j = bond_list_j(n); int type = bond_list_type(n); @@ -799,9 +799,9 @@ double LammpsInterface::pair_force(int n, double rsq, return lammps_->force->bond->single(type,rsq,i,j,fmag_over_rmag); } double LammpsInterface::pair_force( - map< std::pair< int,int >,int >::const_iterator itr, double rsq, + map< std::pair< int,int >,int >::const_iterator itr, double rsq, double & fmag_over_rmag, int nbonds) const -{ +{ int n = itr->second; if (n < nbonds) { return pair_force(n, rsq,fmag_over_rmag); @@ -814,9 +814,9 @@ double LammpsInterface::pair_force( } } double LammpsInterface::pair_force( - std::pair< std::pair< int,int >,int > apair, double rsq, + std::pair< std::pair< int,int >,int > apair, double rsq, double & fmag_over_rmag, int nbonds) const -{ +{ int n = apair.second; if (n < nbonds) { return pair_force(n, rsq,fmag_over_rmag); @@ -829,7 +829,7 @@ double LammpsInterface::pair_force( } } double LammpsInterface::bond_stiffness(int i, int j, double rsq0) const -{ +{ const double perturbation = 1.e-8; double rsq1 = sqrt(rsq0)+perturbation; rsq1 *= rsq1; @@ -866,7 +866,7 @@ int LammpsInterface::delete_atom(int id) const } //* insert atom -int LammpsInterface::insert_atom(int atype, int amask, +int LammpsInterface::insert_atom(int atype, int amask, double *ax, double *av, double aq) const { LAMMPS_NS::Atom * atom = lammps_->atom; @@ -874,8 +874,8 @@ int LammpsInterface::insert_atom(int atype, int amask, int m = atom->nlocal - 1; atom->mask[m] = amask; atom->v[m][0] = av[0]; - atom->v[m][1] = av[1]; - atom->v[m][2] = av[2]; + atom->v[m][1] = av[1]; + atom->v[m][2] = av[2]; if (aq != 0) atom->q[m] = aq; int nfix = lammps_->modify->nfix; @@ -903,7 +903,7 @@ int LammpsInterface::reset_ghosts(int deln) const } //* energy for interactions within the shortrange cutoff -double LammpsInterface::shortrange_energy(double *coord, +double LammpsInterface::shortrange_energy(double *coord, int itype, int id, double /* max */) const { LAMMPS_NS::Atom * atom = lammps_->atom; @@ -919,7 +919,7 @@ double LammpsInterface::shortrange_energy(double *coord, double total_energy = 0.0; for (int j = 0; j < nall; j++) { - if (id == j) continue; + if (id == j) continue; // factor_lj = special_lj[sbmask(j)]; // factor_coul = special_coul[sbmask(j)]; //j &= NEIGHMASK; @@ -942,7 +942,7 @@ double LammpsInterface::shortrange_energy(int id, double max) const return shortrange_energy(x,type,id,max); } -POTENTIAL LammpsInterface::potential() const +POTENTIAL LammpsInterface::potential() const { // find pair style - FRAGILE const int nStyles = 4; @@ -951,7 +951,7 @@ POTENTIAL LammpsInterface::potential() const "lj/cut/coul/cut", "lj/charmm/coul/long"}; LAMMPS_NS::Pair *pair = nullptr; - for (int i = 0; i < nStyles; i++){ + for (int i = 0; i < nStyles; i++){ pair = lammps_->force->pair_match(pairStyles[i].c_str(),1); if (pair != nullptr) break; } @@ -973,7 +973,7 @@ int LammpsInterface::type_to_groupbit(int itype) const return int_allmax(groupbit); } -bool LammpsInterface::epsilons(int itype, POTENTIAL pair, double * epsilon0) const +bool LammpsInterface::epsilons(int itype, POTENTIAL pair, double * epsilon0) const { // grab energy parameters char * pair_parameter = new char[8]; @@ -1002,14 +1002,14 @@ bool LammpsInterface::set_epsilons(int itype, POTENTIAL pair, double * epsilon) delete [] pair_parameter; if (epsilons == nullptr) return false; //if (epsilons == nullptr) error->all(FLERR,"Fix concentration adapted pair style parameter not supported"); - // scale interactions + // scale interactions int i1,i2; for (int i = 1; i < ntypes()+1; i++) { if (i < itype) { i1 = i; i2 = itype; } else { i2 = i; i1 = itype; } epsilons[i1][i2] = epsilon[i-1]; } - + return true; } @@ -1081,12 +1081,12 @@ void LammpsInterface::advance_random_normal (RNG_POINTER p, int n) const { } //* Boltzmann's constant in M,L,T,t units -double LammpsInterface::kBoltzmann() const { +double LammpsInterface::kBoltzmann() const { return (lammps_->force->boltz)/(lammps_->force->mvv2e); } -//* Planck's constant -double LammpsInterface::hbar() const { +//* Planck's constant +double LammpsInterface::hbar() const { const int UNITS_STYLE = (int) units_style(); double hbar = 1.0; // LJ: Dimensionless if (UNITS_STYLE == 2) hbar = 15.1685792814; // Real: KCal/mol-fs @@ -1095,15 +1095,15 @@ double LammpsInterface::hbar() const { } //* Dulong-Petit heat capacity -double LammpsInterface::heat_capacity() const { +double LammpsInterface::heat_capacity() const { double rhoCp = dimension()*kBoltzmann()/volume_per_atom(); return rhoCp; } //* reference mass density for a *unit cell* // all that is needed is a unit cell: volume, types, mass per type -double LammpsInterface::mass_density(int* numPerType) const -{ +double LammpsInterface::mass_density(int* numPerType) const +{ const double *mass = lammps_->atom->mass; if (!mass) throw ATC_Error("cannot compute a mass density: no mass"); const int ntypes = lammps_->atom->ntypes; @@ -1156,7 +1156,7 @@ double * LammpsInterface::special_coul() const return lammps_->force->special_coul; } -//* flag for newton +//* flag for newton int LammpsInterface::newton_pair() const { return lammps_->force->newton_pair; @@ -1169,25 +1169,25 @@ int LammpsInterface::newton_pair() const int LammpsInterface::ngroup() const { return lammps_->group->ngroup; } int LammpsInterface::group_bit(string name) const -{ +{ return group_bit(group_index(name)); } int LammpsInterface::group_bit(int iGroup) const -{ +{ int mybit = 0; mybit |= lammps_->group->bitmask[iGroup]; if (mybit < 0 || mybit > MAX_GROUP_BIT) { string msg("LammpsInterface::group_bit() lammps group bit "+to_string(mybit)+" is out of range 0:"+to_string(MAX_GROUP_BIT)); throw ATC_Error(msg); } - + return mybit; } int LammpsInterface::group_index(string name) const -{ - int igroup = lammps_->group->find(name.c_str()); +{ + int igroup = lammps_->group->find(name.c_str()); if (igroup == -1) { string msg("LammpsInterface::group_index() lammps group "+name+" does not exist"); throw ATC_Error(msg); @@ -1197,12 +1197,12 @@ int LammpsInterface::group_index(string name) const int LammpsInterface::group_inverse_mask(int iGroup) const { - return lammps_->group->inversemask[iGroup]; + return lammps_->group->inversemask[iGroup]; } char * LammpsInterface::group_name(int iGroup) const -{ - return lammps_->group->names[iGroup]; +{ + return lammps_->group->names[iGroup]; } void LammpsInterface::group_bounds(int iGroup, double * b) const @@ -1220,9 +1220,9 @@ double * LammpsInterface::create_1d_double_array(int length, const char *name) c return lammps_->memory->create(myArray, length, name); } -double *LammpsInterface::grow_1d_double_array(double *array, +double *LammpsInterface::grow_1d_double_array(double *array, int length, - const char *name) const + const char *name) const { return lammps_->memory->grow(array, length, name); } @@ -1240,10 +1240,10 @@ void LammpsInterface::destroy_2d_double_array(double **d) const { lammps_->memory->destroy(d); } -double **LammpsInterface::grow_2d_double_array(double **array, - int n1, - int n2, - const char *name) const +double **LammpsInterface::grow_2d_double_array(double **array, + int n1, + int n2, + const char *name) const { return lammps_->memory->grow(array, n1, n2, name); } @@ -1254,9 +1254,9 @@ int * LammpsInterface::create_1d_int_array(int length, const char *name) const { return lammps_->memory->create(myArray, length, name); } -int *LammpsInterface::grow_1d_int_array(int *array, +int *LammpsInterface::grow_1d_int_array(int *array, int length, - const char *name) const + const char *name) const { return lammps_->memory->grow(array, length, name); } @@ -1322,22 +1322,22 @@ int** LammpsInterface::bond_list() const { return lammps_->neighbor->bondlist; char * LammpsInterface::region_name(int iRegion) const { - return lammps_->domain->regions[iRegion]->id; + return lammps_->domain->regions[iRegion]->id; } char * LammpsInterface::region_style(int iRegion) const -{ - return lammps_->domain->regions[iRegion]->style; +{ + return lammps_->domain->regions[iRegion]->style; } double LammpsInterface::region_xlo(int iRegion) const { - return lammps_->domain->regions[iRegion]->extent_xlo; + return lammps_->domain->regions[iRegion]->extent_xlo; } double LammpsInterface::region_xhi(int iRegion) const { - return lammps_->domain->regions[iRegion]->extent_xhi; + return lammps_->domain->regions[iRegion]->extent_xhi; } double LammpsInterface::region_ylo(int iRegion) const @@ -1362,7 +1362,7 @@ double LammpsInterface::region_zhi(int iRegion) const double LammpsInterface::region_xscale(int iRegion) const { - return lammps_->domain->regions[iRegion]->xscale; + return lammps_->domain->regions[iRegion]->xscale; } double LammpsInterface::region_yscale(int iRegion) const @@ -1372,10 +1372,10 @@ double LammpsInterface::region_yscale(int iRegion) const double LammpsInterface::region_zscale(int iRegion) const { - return lammps_->domain->regions[iRegion]->zscale; + return lammps_->domain->regions[iRegion]->zscale; } -int LammpsInterface::region_match(int iRegion, double x, double y, double z) const { +int LammpsInterface::region_match(int iRegion, double x, double y, double z) const { return lammps_->domain->regions[iRegion]->match(x,y,z); } @@ -1429,14 +1429,14 @@ int LammpsInterface::compute_ncols_peratom(COMPUTE_POINTER computePointer) const { LAMMPS_NS::Compute* cmpt = const_to_active(computePointer); int ndof = cmpt->size_peratom_cols; - if (ndof == 0 ) ndof = 1; + if (ndof == 0 ) ndof = 1; return ndof; } double* LammpsInterface::compute_vector_peratom(COMPUTE_POINTER computePointer) const { LAMMPS_NS::Compute* cmpt = const_to_active(computePointer); - if (!(cmpt->invoked_flag & INVOKED_PERATOM)) { + if (!(cmpt->invoked_flag & INVOKED_PERATOM)) { cmpt->compute_peratom(); cmpt->invoked_flag |= INVOKED_PERATOM; } @@ -1465,7 +1465,7 @@ LAMMPS_NS::Compute * LammpsInterface::const_to_active(COMPUTE_POINTER computePoi } // ----------------------------------------------------------------- -// compute pe/atom interface methods +// compute pe/atom interface methods // - the only compute "owned" by ATC // ----------------------------------------------------------------- int LammpsInterface::create_compute_pe_peratom(void) const @@ -1473,7 +1473,7 @@ int LammpsInterface::create_compute_pe_peratom(void) const char **list = new char*[4]; string atomPeName = compute_pe_name(); list[0] = (char *) atomPeName.c_str(); - list[1] = (char *) "all"; + list[1] = (char *) "all"; list[2] = (char *) "pe/atom"; list[3] = (char *) "pair"; @@ -1518,7 +1518,7 @@ void LammpsInterface::unwrap_coordinates(int iatom, double* xatom) const int xbox,ybox,zbox; // for triclinic, need to unwrap current atom coord via h matrix - + if (lammps_->domain->triclinic == 0) { xbox = (image[iatom] & 1023) - 512; ybox = (image[iatom] >> 10 & 1023) - 512; diff --git a/lib/atc/LammpsInterface.h b/lib/atc/LammpsInterface.h index 6883a9ca0b..d4470dbd0a 100644 --- a/lib/atc/LammpsInterface.h +++ b/lib/atc/LammpsInterface.h @@ -102,7 +102,7 @@ class LammpsInterface { }; // Provides a struct for easily passing/recovering data about SparseMats - struct SparseMatInfo { + struct SparseMatInfo { INDEX rows; INDEX cols; INDEX rowsCRS; @@ -116,9 +116,9 @@ class LammpsInterface { static void Destroy(); /** Set lammps pointer */ - void set_lammps(LAMMPS_NS::LAMMPS * lammps) - { - lammps_ = lammps; + void set_lammps(LAMMPS_NS::LAMMPS * lammps) + { + lammps_ = lammps; MPI_Comm_rank(lammps_->world, & commRank_); MPI_Comm_size(lammps_->world, & commSize_); } @@ -180,7 +180,7 @@ class LammpsInterface { void sparse_allsum(SparseMatrix &toShare) const #ifdef ISOLATE_FE { - MPI_Wrappers::sparse_allsum(lammps_->world, toShare); + MPI_Wrappers::sparse_allsum(lammps_->world, toShare); } #else ; @@ -248,27 +248,27 @@ class LammpsInterface { MPI_Wrappers::stop(lammps_->world, msg); } std::string read_file(std::string filename) const; - void write_file(std::string filename, std::string contents, + void write_file(std::string filename, std::string contents, std::ofstream::openmode mode = std::ofstream::out) const { if (! comm_rank()) { std::ofstream f(filename.c_str(),mode); f << contents; f.close(); - } + } // ignore other ranks and assume they are consistent } // end MPI -------------------------------------------------------------------- void print_debug(std::string msg="") const { - std::cout << "rank " << comm_rank() << " " << msg << "\n" << std::flush; + std::cout << "rank " << comm_rank() << " " << msg << "\n" << std::flush; barrier(); } int comm_rank(void) const { return commRank_;} int comm_size(void) const { return commSize_;} bool rank_zero(void) const { return (commRank_==0);} - bool serial(void) const { + bool serial(void) const { int size = 1; MPI_Comm_size(lammps_->world,&size); return (size==1); } @@ -280,12 +280,12 @@ class LammpsInterface { std::stringstream full_msg; if (serial()) { full_msg << " ATC: " << msg << "\n"; - } + } else { full_msg << " ATC: P" << me << ", " << msg << "\n"; } std::string mesg = full_msg.str(); - + if (lammps_->screen) fprintf(lammps_->screen, "%s",mesg.c_str()); if (lammps_->logfile) fprintf(lammps_->logfile,"%s",mesg.c_str()); } @@ -312,7 +312,7 @@ class LammpsInterface { std::stringstream full_msg; if (serial()) { full_msg << " ATC: " << tag << data << "\n"; - } + } else { int commSize = comm_size(); double *recv = new double[commSize]; @@ -360,13 +360,13 @@ class LammpsInterface { int nghost() const; int nmax() const; int ntypes() const; - double ** xatom() const; - double ** vatom() const; - double ** fatom() const; - const int * atom_mask() const; + double ** xatom() const; + double ** vatom() const; + double ** fatom() const; + const int * atom_mask() const; int * atom_mask(); - int * atom_type() const; - int * atom_tag() const; + int * atom_type() const; + int * atom_tag() const; int * atom_to_molecule() const; int * num_bond() const; int ** bond_atom() const; @@ -442,7 +442,7 @@ class LammpsInterface { } /*@}*/ void minimum_image(double & dx, double & dy, double & dz) const; - void closest_image(const double * const xi, const double * const xj, double * const xjImage) const; + void closest_image(const double * const xi, const double * const xj, double * const xjImage) const; /** \name Methods that interface with Update class */ @@ -451,7 +451,7 @@ class LammpsInterface { //double minimize_energy() { return lammps_->update->minimize->ecurrent; } double minimize_energy() const { return lammps_->update->minimize->eprevious; } /*@}*/ - + /** \name Methods that interface with Lattice class */ /*@{*/ double xlattice() const; @@ -487,12 +487,12 @@ class LammpsInterface { // interface to "single" double pair_force(int i, int j, double rsq, double& fmag_over_rmag) const; // pair class double pair_force(int n, double rsq, double& fmag_over_rmag) const; // bond class - double pair_force(std::map< std::pair< int,int >,int >::const_iterator itr, double rsq, double& fmag_over_rmag, int nbonds = 0) const; - double pair_force(std::pair< std::pair< int,int >,int > apair, double rsq, double& fmag_over_rmag, int nbonds = 0) const; + double pair_force(std::map< std::pair< int,int >,int >::const_iterator itr, double rsq, double& fmag_over_rmag, int nbonds = 0) const; + double pair_force(std::pair< std::pair< int,int >,int > apair, double rsq, double& fmag_over_rmag, int nbonds = 0) const; double pair_cutoff() const; void pair_reinit() const; int single_enable() const; - LAMMPS_NS::PairEAM * pair_eam(void) const; + LAMMPS_NS::PairEAM * pair_eam(void) const; double bond_stiffness(int i, int j, double rsq) const; /*@}*/ @@ -500,12 +500,12 @@ class LammpsInterface { /*@{*/ int delete_atom(int id) const; int insert_atom(int type, int mask, double* x, double* v, double q = 0) const; - double shortrange_energy(double *x, int type, int id = -1, + double shortrange_energy(double *x, int type, int id = -1, double max = big_) const; int reset_ghosts(int dn) const; double shortrange_energy(int id, double max = big_) const; POTENTIAL potential(void) const; - int type_to_groupbit(int itype) const; + int type_to_groupbit(int itype) const; int change_type(int itype, int jtype) const; int count_type(int itype) const; bool epsilons(int type, POTENTIAL p, double * epsilons) const; @@ -549,7 +549,7 @@ class LammpsInterface { j %= n; } return factor_coul; - } + } /*@}*/ /** \name Methods that interface with Group class */ @@ -613,8 +613,8 @@ class LammpsInterface { /*@{*/ int bond_list_length() const; int ** bond_list() const; // direct access - int * bond_list(int n) const { return bond_list()[n];} - int bond_list_i(int n) const { return bond_list(n)[0];} + int * bond_list(int n) const { return bond_list()[n];} + int bond_list_i(int n) const { return bond_list(n)[0];} int bond_list_j(int n) const { return bond_list(n)[1];} int bond_list_type(int n) const { return bond_list(n)[2];} /*@}*/ @@ -636,9 +636,9 @@ class LammpsInterface { /*@}*/ /** \name Methods that interface with compute class */ - enum COMPUTE_INVOKED + enum COMPUTE_INVOKED {INVOKED_SCALAR=1,INVOKED_VECTOR=2,INVOKED_ARRAY=4,INVOKED_PERATOM=8}; - enum PER_ATOM_COMPUTE + enum PER_ATOM_COMPUTE {PE_ATOM, STRESS_ATOM, CENTRO_ATOM, @@ -662,7 +662,7 @@ class LammpsInterface { std::string compute_pe_name(void) const {return atomPeNameBase_;};// +fix_id();}; enables unique names, if desired void computes_clearstep(void) const {lammps_->modify->clearstep_compute();}; /*@}*/ - + /** Return lammps pointer -- only as a last resort! */ diff --git a/lib/atc/LinearSolver.cpp b/lib/atc/LinearSolver.cpp index 0204ddd938..06683981e7 100644 --- a/lib/atc/LinearSolver.cpp +++ b/lib/atc/LinearSolver.cpp @@ -11,7 +11,7 @@ using std::set; namespace ATC { -const double kPenalty = 1.0e4; +const double kPenalty = 1.0e4; const double kTol = 1.0e-8; const int kMaxDirect = 1000; @@ -45,7 +45,7 @@ LinearSolver::LinearSolver( maxIterations_(0), maxRestarts_(0), tol_(0), parallel_(parallel) { - // deep copy + // deep copy matrixCopy_ = A; matrixSparse_ = &matrixCopy_; setup(); @@ -63,13 +63,13 @@ LinearSolver::LinearSolver( initializedMatrix_(true), initializedInverse_(false), matrixModified_(false), - allowReinitialization_(false), + allowReinitialization_(false), homogeneousBCs_(false), bcs_(nullptr), // null implies no constraints will be added later rhs_(nullptr), rhsDense_(), b_(nullptr), matrix_(A), - matrixDense_(), + matrixDense_(), matrixFreeFree_(), matrixFreeFixed_(),matrixInverse_(), penalty_(1), maxIterations_(0), maxRestarts_(0), tol_(0), @@ -77,7 +77,7 @@ LinearSolver::LinearSolver( { // shallow copy matrixSparse_ = &A; - setup(); + setup(); } @@ -96,7 +96,7 @@ void LinearSolver::setup(void) if (solverType_ < 0) { if (nVariables_ > kMaxDirect ) { solverType_ = ITERATIVE_SOLVE_SYMMETRIC; - constraintHandlerType_ = PENALIZE_CONSTRAINTS; + constraintHandlerType_ = PENALIZE_CONSTRAINTS; } else { solverType_ = DIRECT_SOLVE; @@ -113,7 +113,7 @@ void LinearSolver::setup(void) // -------------------------------------------------------------------- // Initialize // -------------------------------------------------------------------- -void LinearSolver::allow_reinitialization(void) +void LinearSolver::allow_reinitialization(void) { if (constraintHandlerType_ == PENALIZE_CONSTRAINTS) { if (matrixModified_ ) throw ATC_Error("LinearSolver: can't allow reinitialization after matrix has been modified"); @@ -124,7 +124,7 @@ void LinearSolver::allow_reinitialization(void) void LinearSolver::initialize(const BC_SET * bcs) { - if (bcs) { + if (bcs) { if (! allowReinitialization_ ) throw ATC_Error("LinearSolver: reinitialization not allowed"); //if (! bcs_ ) throw ATC_Error("LinearSolver: adding constraints after constructing without constraints is not allowed"); // shallow --> deep copy @@ -164,7 +164,7 @@ void LinearSolver::initialize_matrix(void) add_matrix_penalty(); } else if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) { - partition_matrix(); + partition_matrix(); } initializedMatrix_ = true; } @@ -182,12 +182,12 @@ void LinearSolver::initialize_inverse(void) else { // DIRECT_SOLVE if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) { if( num_unknowns() > 0 ) { - matrixInverse_ = inv(matrixFreeFree_); + matrixInverse_ = inv(matrixFreeFree_); } } else { // NO_CONSTRAINTS || PENALIZE_CONSTRAINTS matrixDense_ = matrixSparse_->dense_copy(); // need dense for lapack - matrixInverse_ = inv(matrixDense_); + matrixInverse_ = inv(matrixDense_); } } initializedInverse_ = true; @@ -219,7 +219,7 @@ void LinearSolver::add_matrix_penalty(void) { penalty_ = kPenalty; // relative to matrix diagonal SPAR_MAT & A = matrixCopy_; - penalty_ *= (A.diag()).maxabs(); + penalty_ *= (A.diag()).maxabs(); BC_SET::const_iterator itr; for (itr = bcs_->begin(); itr != bcs_->end(); itr++) { int i = itr->first; @@ -253,7 +253,7 @@ void LinearSolver::partition_matrix(void) if (matrixDense_.nRows() == 0) matrixDense_ =matrixSparse_->dense_copy(); DENS_MAT & K = matrixDense_; - K.row_partition(freeSet_,matrixFreeFree_,matrixFreeFixed_); + K.row_partition(freeSet_,matrixFreeFree_,matrixFreeFixed_); } // -------------------------------------------------------------------- @@ -269,7 +269,7 @@ void LinearSolver::add_rhs_penalty() int size = r.nRows(); b.reset(size); for (int i = 0; i < size; i++) { - b(i) = r(i); + b(i) = r(i); } if ( ! homogeneousBCs_ ){ @@ -304,7 +304,7 @@ void LinearSolver::add_rhs_influence() for (itr = bcs_->begin(); itr != bcs_->end(); itr++,i++) { double v = itr->second; xFixed(i,0) = -v; - } + } b = matrixFreeFixed_*xFixed; // matrix and bcs have same ordering } else { @@ -314,7 +314,7 @@ void LinearSolver::add_rhs_influence() set::const_iterator iter; int i = 0; for (iter = freeSet_.begin(); iter != freeSet_.end(); iter++,i++) { - b(i) += r(*iter); + b(i) += r(*iter); } b_ = &rhsDense_; } @@ -347,15 +347,15 @@ void LinearSolver::eigen_system( DENS_MAT & eigenvalues, DENS_MAT & eigenvectors const DENS_MAT * Mp =M; DENS_MAT MM; DENS_MAT KM; - if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) { + if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) { Kp = &matrixFreeFree_; if (M) { DENS_MAT MfreeFixed; // not used - M->row_partition(freeSet_,MM,MfreeFixed); + M->row_partition(freeSet_,MM,MfreeFixed); Mp = &MM; } } - else { + else { if (matrixDense_.nRows() == 0) matrixDense_ =matrixSparse_->dense_copy(); Kp = &matrixDense_; } @@ -399,9 +399,9 @@ bool LinearSolver::solve(VECTOR & x, const VECTOR & b) } const VECTOR & r = *b_; if (solverType_ == ITERATIVE_SOLVE_SYMMETRIC) { - - - + + + if (parallel_) { A = new PAR_SPAR_MAT(LammpsInterface::instance()->world(), *matrixSparse_); } @@ -434,7 +434,7 @@ bool LinearSolver::solve(VECTOR & x, const VECTOR & b) DENS_MAT H(maxRestarts_+1, maxRestarts_); DENS_VEC xx(nVariables_); DENS_VEC bb; - bb = b; + bb = b; int convergence = GMRES(*A, xx, bb, PC, H, restarts, iterations, tol); if (convergence>0) { stringstream ss; @@ -443,7 +443,7 @@ bool LinearSolver::solve(VECTOR & x, const VECTOR & b) ss << " residual: " << tol; throw ATC_Error(ss.str()); } - x.copy(xx.ptr(),xx.nRows()); + x.copy(xx.ptr(),xx.nRows()); } else { // DIRECT_SOLVE const DENS_MAT & invA = matrixInverse_; @@ -532,7 +532,7 @@ void LinearSolver::greens_function(int I, VECTOR & G_I) ss << " residual: " << tol; throw ATC_Error(ss.str()); } - x.copy(xx.ptr(),xx.nRows()); + x.copy(xx.ptr(),xx.nRows()); } else { const DENS_MAT & invA = matrixInverse_; @@ -556,7 +556,7 @@ void LinearSolver::greens_function(int I, VECTOR & G_I) for (int i = 0; i < nVariables_; ++i) x(i) = invA(I,i); } } - + delete A; } diff --git a/lib/atc/LinearSolver.h b/lib/atc/LinearSolver.h index 1d429d8816..b1078a35ba 100644 --- a/lib/atc/LinearSolver.h +++ b/lib/atc/LinearSolver.h @@ -22,19 +22,19 @@ namespace ATC { * @brief a class to solve a system of linear equations * A x = b subject to a set of constraints { x_i = y_i } */ - + class LinearSolver { public: enum LinearSolveType { - AUTO_SOLVE=-1, + AUTO_SOLVE=-1, DIRECT_SOLVE=0, ITERATIVE_SOLVE, ITERATIVE_SOLVE_SYMMETRIC }; enum LinearSolveConstraintHandlingType { - AUTO_HANDLE_CONSTRAINTS=-1, + AUTO_HANDLE_CONSTRAINTS=-1, NO_CONSTRAINTS=0, CONDENSE_CONSTRAINTS, PENALIZE_CONSTRAINTS @@ -44,7 +44,7 @@ class LinearSolver { LinearSolver( // does not assume that A is persistent const SPAR_MAT & A, // lhs matrix "deep" copy const BC_SET & bcs, // constraints - const int solverType = AUTO_SOLVE, + const int solverType = AUTO_SOLVE, const int bcHandlerType = -1, bool parallel = false ); @@ -57,10 +57,10 @@ class LinearSolver { /** Destructor */ virtual ~LinearSolver() {}; - /** (re)initialize - - if bcs are provided the lhs matrix is re-configured - for the new constraints - - if the class is to be reused with new constraints + /** (re)initialize + - if bcs are provided the lhs matrix is re-configured + for the new constraints + - if the class is to be reused with new constraints allow_reinitialization must be called before first solve, etc */ void allow_reinitialization(void); // depending on method save a copy of A void set_homogeneous_bcs(void) { homogeneousBCs_ = true;} // for nonlinear solver, solve for increment @@ -71,15 +71,15 @@ class LinearSolver { - if a "b" is provided it is used as the new rhs */ bool solve(VECTOR & x, const VECTOR & b); - /** greens function + /** greens function - returns the solution to a Kronecker delta rhs b = {0 0 .. 1 .. 0 0} and with homogeneous constraints {x_i = 0} */ void greens_function(int I, VECTOR & G_I); /** eigensystem - - returns the e-values & e-vectors for constrained system Ax + v x = 0 + - returns the e-values & e-vectors for constrained system Ax + v x = 0 - if M is provided the eval problem : ( A + v M ) x = 0 is solved*/ - void eigen_system(DENS_MAT & eigenvalues, DENS_MAT & eigenvectors, + void eigen_system(DENS_MAT & eigenvalues, DENS_MAT & eigenvectors, const DENS_MAT * M = nullptr); /** access to penalty coefficient @@ -87,16 +87,16 @@ class LinearSolver { double penalty_coefficient(void) const {return penalty_;}; /** change iterative solver parameters */ - void set_max_iterations(const int maxIter) { + void set_max_iterations(const int maxIter) { if (solverType_ != ITERATIVE_SOLVE && solverType_ != ITERATIVE_SOLVE_SYMMETRIC ) throw ATC_Error("inappropriate parameter set in LinearSolver"); maxIterations_=maxIter; } void set_tolerance(const double tol) { tol_=tol;} - + /* access to number of unknowns */ - int num_unknowns(void) const - { + int num_unknowns(void) const + { int nUnknowns = nVariables_; if (bcs_) { nUnknowns -= bcs_->size(); } return nUnknowns; @@ -132,27 +132,27 @@ class LinearSolver { void set_fixed_values(VECTOR & x); /** constraints container */ - const BC_SET * bcs_; + const BC_SET * bcs_; /** rhs vector/s */ - const VECTOR * rhs_; + const VECTOR * rhs_; DENS_VEC rhsDense_; // modified const VECTOR * b_; // points to appropriate rhs /** lhs matrix */ - const SPAR_MAT & matrix_; + const SPAR_MAT & matrix_; SPAR_MAT matrixCopy_; // a copy that will be modified by penalty methods SPAR_MAT matrixOriginal_; // a copy that is used for re-initialization const SPAR_MAT * matrixSparse_; // points to matrix_ or matrixCopy_ - DENS_MAT matrixDense_; // a dense copy for lapack + DENS_MAT matrixDense_; // a dense copy for lapack /** partitioned matrix - condense constraints */ DENS_MAT matrixFreeFree_, matrixFreeFixed_; /** maps for free and fixed variables for partitioned matrix - condense */ - std::set freeSet_, fixedSet_; + std::set freeSet_, fixedSet_; std::map freeGlobalToCondensedMap_; /** inverse matrix matrix - direct solve */ diff --git a/lib/atc/MPI_Wrappers.cpp b/lib/atc/MPI_Wrappers.cpp index b8a8ab77b7..d49f81d925 100644 --- a/lib/atc/MPI_Wrappers.cpp +++ b/lib/atc/MPI_Wrappers.cpp @@ -221,14 +221,14 @@ namespace MPI_Wrappers { void sparse_allsum(MPI_Comm comm,SparseMatrix &toShare) const { toShare.compress(); - + // initialize MPI information int nProcs = size(comm); int myRank = rank(comm);; int error; - // get numbers of rows, columns, rowsCRS, and + // get numbers of rows, columns, rowsCRS, and // sizes (number of nonzero elements in matrix) SparseMatInfo *recInfo = new SparseMatInfo[nProcs]; SparseMatInfo myInfo; @@ -283,7 +283,7 @@ void sparse_allsum(MPI_Comm comm,SparseMatrix &toShare) const rec_ja, sizeCounts, sizeOffsets, MPI_INT, lammps_->world); if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_colarray "+to_string(error)); - + // get the array of values double *rec_vals = new double[totalSize]; error = MPI_Allgatherv(toShare.ptr(), sizeCounts[myRank], MPI_DOUBLE, @@ -291,8 +291,8 @@ void sparse_allsum(MPI_Comm comm,SparseMatrix &toShare) const if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_valarray "+to_string(error)); - INDEX *rec_ia_proc; - INDEX *rec_ja_proc; + INDEX *rec_ia_proc; + INDEX *rec_ja_proc; double *rec_vals_proc; for (int i = 0; i < nProcs; i++) { if (myRank != i) { @@ -300,24 +300,24 @@ void sparse_allsum(MPI_Comm comm,SparseMatrix &toShare) const rec_ia_proc = new INDEX[rowCounts[i]]; rec_ja_proc = new INDEX[sizeCounts[i]]; rec_vals_proc = new double[sizeCounts[i]]; - + // copy the data passed with MPI into the new spots - copy(rec_ia + rowOffsets[i], + copy(rec_ia + rowOffsets[i], rec_ia + rowOffsets[i] + rowCounts[i], rec_ia_proc); - copy(rec_ja + sizeOffsets[i], + copy(rec_ja + sizeOffsets[i], rec_ja + sizeOffsets[i] + sizeCounts[i], rec_ja_proc); - copy(rec_vals + sizeOffsets[i], + copy(rec_vals + sizeOffsets[i], rec_vals + sizeOffsets[i] + sizeCounts[i], rec_vals_proc); // Does anyone know why we have to declare tempMat here (as well as set it equal to - // something) to avoid segfaults? there are still segfaults, but they happen at a much + // something) to avoid segfaults? there are still segfaults, but they happen at a much // later stage of the game now (and for less benchmarks overall). SparseMatrix tempMat = - SparseMatrix(rec_ia_proc, rec_ja_proc, rec_vals_proc, - recInfo[i].size, recInfo[i].rows, + SparseMatrix(rec_ia_proc, rec_ja_proc, rec_vals_proc, + recInfo[i].size, recInfo[i].rows, recInfo[i].cols, recInfo[i].rowsCRS); toShare += tempMat; } @@ -330,13 +330,13 @@ void sparse_allsum(MPI_Comm comm,SparseMatrix &toShare) const } #endif - void print_msg(MPI_Comm comm, string msg) + void print_msg(MPI_Comm comm, string msg) { if (serial(comm)) { cout << " ATC: " << msg << "\n"; } else { cout << " ATC: P" << rank(comm) << ", " << msg << "\n"; } } - void print_msg_once(MPI_Comm comm, string msg, bool prefix, bool endline) + void print_msg_once(MPI_Comm comm, string msg, bool prefix, bool endline) { if (rank_zero(comm)) { if (prefix) cout << " ATC: "; diff --git a/lib/atc/Material.cpp b/lib/atc/Material.cpp index 64673d7993..5509064b9e 100644 --- a/lib/atc/Material.cpp +++ b/lib/atc/Material.cpp @@ -92,13 +92,13 @@ namespace ATC { \n end \n tag - a unique identifier for the material type which can be referenced in input decks. Multiple materials are specified using different tag regions, terminated with an 'end', in the material file. - units - the LAMMPS units system the material is based on, used as a check against the actual LAMMPS units. AtC units are consistent units using the LAMMPS length, mass, time, charge, and volts. The only units conversion occuring within AtC are LAMMPS to AtC units and charge to volts units. + units - the LAMMPS units system the material is based on, used as a check against the actual LAMMPS units. AtC units are consistent units using the LAMMPS length, mass, time, charge, and volts. The only units conversion occuring within AtC are LAMMPS to AtC units and charge to volts units. \section examples material Argon real ------- end \section description - Starts a section in which material properties can be specified. Materials are organized by material, identified by a tag, and all associated material models are specified within its scope. Unspecified material properties use defaults as indicated or are considered as null. Null material properties contribute no value to integrals using them. Material properties defined which are not part of the physics model are ignored. Functions which are specified correspond to those implemented in the code and there is no mechanism for user-specified material models unless they are added to the main code.\n + Starts a section in which material properties can be specified. Materials are organized by material, identified by a tag, and all associated material models are specified within its scope. Unspecified material properties use defaults as indicated or are considered as null. Null material properties contribute no value to integrals using them. Material properties defined which are not part of the physics model are ignored. Functions which are specified correspond to those implemented in the code and there is no mechanism for user-specified material models unless they are added to the main code.\n \section restrictions Material models are only used for evaluating finite element integrals with for physics models they are associated with. \section related @@ -112,7 +112,7 @@ namespace ATC { constantDensity_.reset(NUM_FIELDS); constantDensity_ = false; - + rhoCp_ = ATC::LammpsInterface::instance()->heat_capacity(); parameters_["heat_capacity"] = rhoCp_; heatCapacity_ = rhoCp_; @@ -122,7 +122,7 @@ namespace ATC { constantDensity_(DISPLACEMENT) = true; constantDensity_(VELOCITY) = true; - electronDragPower_ = new ElectronDragPower(); + electronDragPower_ = new ElectronDragPower(); vector line; while(fileId.good()) { @@ -133,13 +133,13 @@ namespace ATC { return; } } - /*! \page man_mat_heat_capacity material heat_capcity + /*! \page man_mat_heat_capacity material heat_capcity \section syntax heat_capacity constant\n capacity \n - end \n + end \n \section description - Overrides use of lattice heat capacity using Dulong-Petit law for continuum regions. \n + Overrides use of lattice heat capacity using Dulong-Petit law for continuum regions. \n \section restrictions Only valid with AtC models incorporating a phonon temperature: thermal, two-temperature, drift-diffusion \section related @@ -163,13 +163,13 @@ namespace ATC { } } } - /*! \page man_mat_heat_flux material heat_flux + /*! \page man_mat_heat_flux material heat_flux \section syntax heat_flux linear\n conductivity \n - end \n + end \n \section description - Specifies a heat flux proportional to the temperature gradient. \n + Specifies a heat flux proportional to the temperature gradient. \n \section restrictions Only valid with AtC models incorporating a phonon temperature: thermal, two-temperature, drift-diffusion \section related @@ -192,17 +192,17 @@ namespace ATC { } } } - /*! \page man_mat_electron_heat_flux material electron_heat_flux + /*! \page man_mat_electron_heat_flux material electron_heat_flux \section syntax electron_heat_flux \n \n - end \n + end \n null - no electron heat flux contributions \n linear - a heat flux proportional to the temperature gradient, parameter is 'conductivity'\n power_law - a heat flux proportional to the temperature gradient and ratio of electron to phonon temperatures, parameter is 'conductivity'\n thermopower - same as power_law but with an addition proportional to the electron current, parameters are 'conductivity' but it also uses the Seebeck coefficient defined elsewhere \section description - Specifies the form for the electron heat flux. \n + Specifies the form for the electron heat flux. \n \section restrictions Only valid with AtC models incorporating an electron temperature: two-temperature, drift-diffusion \section related @@ -239,25 +239,25 @@ namespace ATC { } } else if (line[1] == "thermopower") { - + if (! electronFlux_) { throw ATC_Error( "for thermopower please define electron_flux before electron_heat_flux"); } if (electronHeatFlux_) delete electronHeatFlux_; - electronHeatFlux_ = new ElectronHeatFluxThermopower(fileId, + electronHeatFlux_ = new ElectronHeatFluxThermopower(fileId, parameters_, electronFlux_); } } - /*! \page man_mat_electron_heat_capacity material electron_heat_capacity + /*! \page man_mat_electron_heat_capacity material electron_heat_capacity \section syntax electron_heat_capacity \n capacity \n - end \n + end \n no_density - if this keyword is present, the electron density does not multiply the capacity\n constant - a constant electron heat flux \n linear - a heat flux proportional to the electron temperature\n \section description - Specifies the form for the electron heat capacity. \n + Specifies the form for the electron heat capacity. \n \section restrictions Only valid with AtC models incorporating an electron temperature: two-temperature, drift-diffusion \section related @@ -296,17 +296,17 @@ namespace ATC { } } } - /*! \page man_mat_electron_phonon_exchange material electron_phonon_exchange + /*! \page man_mat_electron_phonon_exchange material electron_phonon_exchange \section syntax electron_phonon_exchange \n \n - end \n + end \n null - no electron heat flux contributions \n linear - an energy exchange proportional to the temperature difference between the electron and phonon temperatures, parameter is 'coefficient'\n power_law - same as linear, but the temperature difference is raised to a specified power, parameters are 'coefficient' and 'exponent'\n hertel - exchange proportional to temperature difference to the 5th divided by the electron temperature, the coefficient is a function of the mass enhancement and Debeye temperature, parameters are 'debeye_temperature' and 'mass_enhancement' \section description - Specifies the form for the electron/phonon heat exchange. \n + Specifies the form for the electron/phonon heat exchange. \n \section restrictions Only valid with AtC models incorporating an electron temperature: two-temperature, drift-diffusion \section related @@ -322,14 +322,14 @@ namespace ATC { } else if (line[1] == "linear") { if (electronPhononExchange_) delete electronPhononExchange_; - electronPhononExchange_ = new ElectronPhononExchangeLinear(fileId, + electronPhononExchange_ = new ElectronPhononExchangeLinear(fileId, parameters_); } else if (line[1] == "power_law") { linearSource_(TEMPERATURE) = false; linearSource_(ELECTRON_TEMPERATURE) = false; if (electronPhononExchange_) delete electronPhononExchange_; - electronPhononExchange_ = new ElectronPhononExchangePowerLaw(fileId, + electronPhononExchange_ = new ElectronPhononExchangePowerLaw(fileId, parameters_); } else if (line[1] == "hertel") { @@ -339,16 +339,16 @@ namespace ATC { electronPhononExchange_ = new ElectronPhononExchangeHertel(fileId,parameters_,this); } } - /*! \page man_mass_density material mass_density + /*! \page man_mass_density material mass_density \section syntax mass_density \n \n - end \n + end \n no entry - compute mass density from the lattice using the mass of the first type, no keyword or values\n basis - compute mass density for the given number of atoms of each type in the lattice, no keyword, values are one integer per type specifying the number of atoms of that type in the lattice\n constant - prescribed mass density, keyword = density, value = desired mass density \section description - Specifies the mass density of the system. \n + Specifies the mass density of the system. \n \section restrictions Valid for all AtC physics models. \section related @@ -401,14 +401,14 @@ namespace ATC { \section syntax stress \n \n - end \n + end \n null - no electron heat flux contributions \n linear - a stress tensor proportional to the displacements, keywords are 'modulus' and 'poissons_ratio'\n cubic - an anisotropic linear stress tensor, keywords are 'c11', 'c12', and 'c44'\n damped_cubic - same as cubic, with a damping term proportional to the velocity vector, keywords are 'c11', 'c12', 'c44', and the damping parameter 'gamma'\n cauchy_born - stress tensor is computed using the Cauchy-Born formalism from the lattice and given potential, keywords are 'pairstyle', 'linear' (linearizes the Cauchy-Born relationship), or 'temperature' (the temperature used to determine the Cauchy-Born stress). The 'pairstyle' lines are followed by values of 'lj/cut', 'lj/smooth/linear', and 'eam', the latter two of which are followed on the line by the value for the cut-off radius. The 'lj/cut' and 'lj/smooth/linear' pairstyles are followed on the next line using the keyword 'pair_coeff' followed by value of the pair-coefficients \sigma and \epsilon. \section description - Specifies the form for the mechanical stress tensor. \n + Specifies the form for the mechanical stress tensor. \n \section restrictions Only valid with AtC models incorporating a mechanical stress: elastic \section related @@ -444,7 +444,7 @@ namespace ATC { cb.inv_atom_volume = 1.0 / lmp->volume_per_atom(); cb.e2mvv = 1.0 / lmp->mvv2e(); cb.boltzmann = lmp->boltz(); - cb.atom_mass = lmp->atom_mass(1); + cb.atom_mass = lmp->atom_mass(1); if (stress_) delete stress_; stress_ = new StressCauchyBorn(fileId, cb); } @@ -457,15 +457,15 @@ namespace ATC { viscousStress_ = new ViscousStressConstant(fileId); } } - /*! \page man_body_force material body_force + /*! \page man_body_force material body_force \section syntax body_force \n \n - end \n + end \n electric_field - adds body force proportional to the electric field and charge density, no keywords or values\n viscous - adds a body force proportional to the velocity vector, keyword = gamma (damping parameter) followed by its value\n \section description - Specifies body forces acting on the system. \n + Specifies body forces acting on the system. \n \section restrictions Valid for all AtC mechanical models: elastic \section related @@ -519,10 +519,10 @@ namespace ATC { \section syntax electric_field linear\n permittivity \n - end \n + end \n Provide a value for the permittivity or use LAMMPS' value if no value is given.\n \section description - Specifies the electric displacement vector to be proportional to the electric field. \n + Specifies the electric displacement vector to be proportional to the electric field. \n \section restrictions Valid for AtC physics models using electric fields: fem_efield, drift-diffusion \section related @@ -556,7 +556,7 @@ namespace ATC { ss << ", lattice constant= " << LammpsInterface::instance()->max_lattice_constant() ; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); LammpsInterface::UnitsType utype = LammpsInterface::instance()->units_style(); - if ( utype != LammpsInterface::REAL + if ( utype != LammpsInterface::REAL && utype != LammpsInterface::METAL) { ATC::LammpsInterface::instance()->print_msg_once("WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e"); // note this is so that: perm0/e = 1 / (Epotential_units * Length) @@ -598,10 +598,10 @@ namespace ATC { } else if (line[1] == "linear") { if (electronDragPower_) delete electronDragPower_; - electronDragPower_ = new ElectronDragPowerLinear(fileId, + electronDragPower_ = new ElectronDragPowerLinear(fileId, parameters_, this); - } + } } else if (line[0] == "electron_recombination") { registry_. insert("electron_recombination"); @@ -617,24 +617,24 @@ namespace ATC { } else if (line[0] == "equilibrium_carrier_density") { electronEquilibriumDensity_ = value; - parameters_["equilibrium_carrier_density"] + parameters_["equilibrium_carrier_density"] = electronEquilibriumDensity_; } } } } - /*! \page man_mat_electron_density material electron_density + /*! \page man_mat_electron_density material electron_density \section syntax electron_density \n \n - end \n + end \n null - no electron density constitutive model, uses the state variable \n linear - density is proportional to the electric field, keyword is 'coefficient' followed by its value\n interpolation - interpolates in a look-up table contained in a file provided after the 'interpolation' word, keywords are 'scale' and 'number_of_points', followed by their values \n exponential - density is based on Boltzmann statistics for the electric potential above an activation energy, keywords are 'intrinsic_concentration', 'intrinsic_energy', and reference_temperature', followed by their values\n fermi_dirac - density is based on Fermi-Dirac statistics for the electric potential relative to an activation energy, keywords are 'fermi_energy', 'reference_temperature', 'band_edge', 'donor_ionization_energy', and 'donor_concentration' \section description - Specifies the form for the electron density. \n + Specifies the form for the electron density. \n \section restrictions Only valid with AtC models incorporating an electrons: electrostatic, two-temperature, drift-diffusion \section related @@ -664,7 +664,7 @@ namespace ATC { electronChargeDensity_ = new ElectronChargeDensityExponential(fileId, parameters_); } else if (line[1] == "fermi_dirac") { - registry_. insert("band_edge_potential"); + registry_. insert("band_edge_potential"); //linearSource_(ELECTRIC_POTENTIAL) = false; // treated as constant if (electronChargeDensity_) delete electronChargeDensity_; electronChargeDensity_ = new ElectronChargeDensityFermiDirac(fileId, parameters_); @@ -707,7 +707,7 @@ void Material::thermal_energy( const FIELD_MATS &fields, DENS_MAT &energy) const { - + const DENS_MAT & T = (fields.find(TEMPERATURE))->second; energy = heatCapacity_ * T; }; @@ -738,7 +738,7 @@ void Material::mass_density( const FIELD_MATS &fields, DENS_MAT &density) const { - + int nNodes = 0; FIELD_MATS::const_iterator field = fields.find(MASS_DENSITY); if (field != fields.end()) { @@ -760,8 +760,8 @@ void Material::electron_mass_density( const FIELD_MATS &fields, DENS_MAT &density) const { - - + + int nNodes = 0; FIELD_MATS::const_iterator field = fields.find(ELECTRON_DENSITY); //if (field != fields.end()) { @@ -873,7 +873,7 @@ bool Material::electron_recombination( recombination = n; recombination -= electronEquilibriumDensity_; recombination *= -electronRecombinationInvTau_; - return true; + return true; } //--------------------------------------------------------------------- bool Material::electron_charge_density( diff --git a/lib/atc/Material.h b/lib/atc/Material.h index 5a835d446b..58920ab48e 100644 --- a/lib/atc/Material.h +++ b/lib/atc/Material.h @@ -9,7 +9,7 @@ #include "ATC_Error.h" #include "LammpsInterface.h" -namespace ATC +namespace ATC { class BodyForce; class Stress; @@ -22,7 +22,7 @@ namespace ATC class ElectronDragPower; /** - * @class Material + * @class Material * @brief Base class for computing and storing properties and fields for a material */ @@ -42,14 +42,14 @@ namespace ATC /** check material has required interfaces */ bool check_registry(const std::set functionList) const - { + { std::set::const_iterator itr; for (itr=functionList.begin(); itr!=functionList.end(); itr++) { if (registry_.find(*itr) == registry_.end()) { std::stringstream ss; ss << "WARNING: material: [" << tag_ << "] cannot find " << *itr ; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); - } + } if (registry_.find(*itr) == registry_.end()) return false; } return true; @@ -57,7 +57,7 @@ namespace ATC /** access to material parameters */ bool parameter(const std::string name, double & value) const - { + { std::map::const_iterator iter = parameters_.find(name); if ( iter == parameters_.end()) { value = 0.0; @@ -65,37 +65,37 @@ namespace ATC } value = iter->second; return true; - } + } /** true if rhs flux is linear (per field) */ - bool linear_flux(FieldName name) const { + bool linear_flux(FieldName name) const { return linearFlux_(name); }; /** true if rhs source is linear (per field) */ - bool linear_source(FieldName name) const { + bool linear_source(FieldName name) const { return linearSource_(name); }; /** true if lhs density is constant (per field) */ - bool constant_density(FieldName name) const { + bool constant_density(FieldName name) const { return constantDensity_(name); }; /** each of these is a field function computed at a set of points */ - /** if there is only one function it is in the base class + /** if there is only one function it is in the base class ** otherwise, a subsidiary class is setup */ /* -----------------------------------------------------------------*/ /** densities */ /* -----------------------------------------------------------------*/ /** thermal energy */ void thermal_energy(const FIELD_MATS & fields, - DENS_MAT & energy) const; + DENS_MAT & energy) const; /** heat capacity */ - void heat_capacity(const FIELD_MATS & fields, + void heat_capacity(const FIELD_MATS & fields, DENS_MAT & capacity) const; /** thermal energy */ - void electron_thermal_energy(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void electron_thermal_energy(const FIELD_MATS & fields, + DENS_MAT & energy) const; /** electron capacities */ void electron_mass_density(const FIELD_MATS &fields, DENS_MAT &density) const; @@ -106,27 +106,27 @@ namespace ATC const GRAD_FIELD_MATS &gradFields, DENS_MAT_VEC &Dcapacity) const; /** kinetic energy */ - void kinetic_energy(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void kinetic_energy(const FIELD_MATS & fields, + DENS_MAT & energy) const; /** mass density */ void mass_density(const FIELD_MATS &fields, DENS_MAT &density) const; /** elastic energy */ - void elastic_energy(const FIELD_MATS & fields, + void elastic_energy(const FIELD_MATS & fields, const GRAD_FIELD_MATS & gradFields, - DENS_MAT & energy) const; + DENS_MAT & energy) const; /** permitivity */ - void permittivity(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void permittivity(const FIELD_MATS & fields, + DENS_MAT & energy) const; /** inverse effective mass */ - void inv_effective_mass(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void inv_effective_mass(const FIELD_MATS & fields, + DENS_MAT & energy) const; /** band-edge potential */ - void band_edge_potential(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void band_edge_potential(const FIELD_MATS & fields, + DENS_MAT & energy) const; /** viscosity */ - void viscosity(const FIELD_MATS & fields, - DENS_MAT & energy) const; + void viscosity(const FIELD_MATS & fields, + DENS_MAT & energy) const; /* -----------------------------------------------------------------*/ /** fluxes */ /* -----------------------------------------------------------------*/ @@ -184,13 +184,13 @@ namespace ATC virtual bool electron_recombination(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &recombination) const; - /** computes drift diffusion charge density */ + /** computes drift diffusion charge density */ virtual bool electron_charge_density(const FIELD_MATS &fields, DENS_MAT &density) const; - virtual void D_electron_charge_density(const FieldName fieldName, + virtual void D_electron_charge_density(const FieldName fieldName, const FIELD_MATS &fields, DENS_MAT &D_density) const; - /** computes momentum source */ + /** computes momentum source */ virtual bool body_force(const FIELD_MATS &fields, DENS_MAT &density) const; diff --git a/lib/atc/Matrix.cpp b/lib/atc/Matrix.cpp index 1b77796b8b..7271232aca 100644 --- a/lib/atc/Matrix.cpp +++ b/lib/atc/Matrix.cpp @@ -11,14 +11,14 @@ namespace ATC_matrix { //* performs a matrix-matrix multiply with optional transposes BLAS version // C = b*C + a*A*B //----------------------------------------------------------------------------- -void MultAB(const MATRIX &A, const MATRIX &B, DENS_MAT &C, +void MultAB(const MATRIX &A, const MATRIX &B, DENS_MAT &C, const bool At, const bool Bt, double a, double b) -{ +{ static char t[2] = {'N','T'}; char *ta=t+At, *tb=t+Bt; int sA[2] = {A.nRows(), A.nCols()}; // sizes of A int sB[2] = {B.nRows(), B.nCols()}; // sizes of B - + GCK(A, B, sA[!At]!=sB[Bt], "MultAB: matrix-matrix multiply"); if (!C.is_size(sA[At],sB[!Bt])) { @@ -33,11 +33,11 @@ void MultAB(const MATRIX &A, const MATRIX &B, DENS_MAT &C, double *pa=A.ptr(), *pb=B.ptr(), *pc=C.ptr(); #ifdef COL_STORAGE - dgemm_(ta, tb, M, N, K, &a, pa, sA, pb, sB, &b, pc, M); + dgemm_(ta, tb, M, N, K, &a, pa, sA, pb, sB, &b, pc, M); #else - dgemm_(tb, ta, N, M, K, &a, pb, sB+1, pa, sA+1, &b, pc, N); + dgemm_(tb, ta, N, M, K, &a, pb, sB+1, pa, sA+1, &b, pc, N); #endif - + } //----------------------------------------------------------------------------- @@ -54,13 +54,13 @@ DenseMatrix inv(const MATRIX& A) int *ipiv = new int[m<<1]; // need 2m storage int *iwork=ipiv+m; - + dgetrf_(&m,&m,invA.ptr(),&m,ipiv,&info); // compute LU factorization GCK(A,A,info<0,"DenseMatrix::inv() dgetrf error: Argument had bad value."); GCK(A,A,info>0,"DenseMatrix::inv() dgetrf error: Matrix not invertible."); if (info > 0) { delete [] ipiv; - invA = 0; + invA = 0; return invA; } @@ -80,9 +80,9 @@ DenseMatrix inv(const MATRIX& A) dgetri_(&m, invA.ptr(), &m, ipiv, work_dummy, &lwork, &info); GCK(A,A,info<0,"DenseMatrix::inv() dgetri error: Argument had bad value."); GCHK(info>0,"DenseMatrix::inv() dgetri error: Matrix not invertible."); - + // Work size query succeeded - lwork = (int)work_dummy[0]; + lwork = (int)work_dummy[0]; double *work = new double[lwork]; // Allocate vector of appropriate size // Compute and store matrix inverse @@ -100,21 +100,21 @@ DenseMatrix inv(const MATRIX& A) //* returns all eigenvalues & e-vectors of a pair of double precision matrices //----------------------------------------------------------------------------- -DenseMatrix eigensystem(const MATRIX& AA, const MATRIX & BB, +DenseMatrix eigensystem(const MATRIX& AA, const MATRIX & BB, DenseMatrix & eVals, bool normalize) { - DENS_MAT A(AA); // Make copy of A - DENS_MAT B(BB); + DENS_MAT A(AA); // Make copy of A + DENS_MAT B(BB); int m = A.nRows(); // size - eVals.resize(m,1); // eigenvectors + eVals.resize(m,1); // eigenvectors //A.print("A"); //B.print("B"); SQCK(A, "DenseMatrix::eigensystem(), matrix not square"); // check matrix is square SQCK(B, "DenseMatrix::eigensystem(), matrix not square"); // check matrix is square SSCK(A, B, "DenseMatrix::eigensystem(), not same size");// check same size - // workspace - int lwork=-1; //1+(NB+6+2*NMAX)*NMAX) + // workspace + int lwork=-1; //1+(NB+6+2*NMAX)*NMAX) double tmp[1]; double *work = tmp; int liwork = -1; // 3+5*NMAX @@ -133,7 +133,7 @@ DenseMatrix eigensystem(const MATRIX& AA, const MATRIX & BB, lwork = int(work[0]); liwork = iwork[0]; work = new double[lwork]; - iwork = new int[liwork]; + iwork = new int[liwork]; dsygvd_(&type,vectors,upper,&m,A.ptr(),&m,B.ptr(),&m, eVals.ptr(),work,&lwork,iwork,&liwork,&info); GCK(A,B,info!=0,"DenseMatrix::eigensystem(), error"); @@ -153,7 +153,7 @@ DenseMatrix eigensystem(const MATRIX& AA, const MATRIX & BB, } } //(A.transpose()).print("normalized e-vectors"); - } + } delete [] work; delete [] iwork; @@ -168,7 +168,7 @@ double condition_number(const MATRIX& AA) { DenseMatrix eVals, I; I.identity(AA.nRows()); - eigensystem(AA, I, eVals); + eigensystem(AA, I, eVals); // [1] William W. Hager, "Condition Estimates," SIAM J. Sci. Stat. Comput. 5, 1984, 311-316, 1984. // [2] Nicholas J. Higham and Françoise Tisseur, "A Block Algorithm for Matrix 1-Norm Estimation with an Application to 1-Norm Pseudospectra, "SIAM J. Matrix Anal. Appl., Vol. 21, 1185-1201, 2000. double max = eVals.maxabs(); @@ -178,23 +178,23 @@ double condition_number(const MATRIX& AA) //----------------------------------------------------------------------------- //* returns polar decomposition of a square double precision matrix via SVD //----------------------------------------------------------------------------- -DenseMatrix polar_decomposition(const MATRIX& AA, +DenseMatrix polar_decomposition(const MATRIX& AA, DenseMatrix & rotation, DenseMatrix & stretch, bool leftRotation) { - DENS_MAT A(AA); // Make copy of A - SQCK(A, "DenseMatrix::polar_decomposition(), matrix not square"); + DENS_MAT A(AA); // Make copy of A + SQCK(A, "DenseMatrix::polar_decomposition(), matrix not square"); int m = A.nRows(); // size - DENS_MAT D(m,1); + DENS_MAT D(m,1); DENS_MAT U(m,m), VT(m,m); // left and right SVD rotations - // workspace - int lwork=-1; + // workspace + int lwork=-1; double tmp[1]; double *work = tmp; - - // calculate singular value decomposition A = U D V^T + + // calculate singular value decomposition A = U D V^T char type[] = "A"; // all columns are returned int info; // query optimal sizes @@ -207,7 +207,7 @@ DenseMatrix polar_decomposition(const MATRIX& AA, dgesvd_(type,type,&m,&m,A.ptr(),&m,D.ptr(), U.ptr(),&m,VT.ptr(),&m, work,&lwork,&info); - + //GCK(A,B,info!=0,"DenseMatrix::polar_decomposition(), error"); GCK(A,A,info!=0,"DenseMatrix::polar_decomposition(), error"); delete [] work; @@ -218,7 +218,7 @@ DenseMatrix polar_decomposition(const MATRIX& AA, // A = R' U' = (U V^T) (V D V^T) stretch.resize(m,m); //if (leftRotation) { stretch = (VT.transpose())*D*VT; } - if (leftRotation) { + if (leftRotation) { DENS_MAT V = VT.transpose(); for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { @@ -229,7 +229,7 @@ DenseMatrix polar_decomposition(const MATRIX& AA, } // A = V' R' = (U D U^T) (U V^T) //else { stretch = U*D*(U.transpose()); } - else { + else { for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { stretch(i,j) = U(i,j)*D(j,0); @@ -237,7 +237,7 @@ DenseMatrix polar_decomposition(const MATRIX& AA, } stretch = stretch*(U.transpose()); } - return D; + return D; } //----------------------------------------------------------------------------- //* computes the determinant of a square matrix by LU decomposition (if n>3) @@ -255,7 +255,7 @@ double det(const MATRIX& A) return A(0,0)*(A(1,1)*A(2,2)-A(1,2)*A(2,1)) + A(0,1)*(A(1,2)*A(2,0)-A(1,0)*A(2,2)) + A(0,2)*(A(1,0)*A(2,1)-A(1,1)*A(2,0)); - default: break; + default: break; } // First compute LU factorization int info, *ipiv = new int[m]; @@ -271,12 +271,12 @@ double det(const MATRIX& A) det = PLUA(0,0); OddNumPivots = ipiv[0]!=(1); - for(i=1; i& A) GCK(A,A,!A.is_size(3,3), "max_eigenvalue only implemented for 3x3"); const double c0 = det(A); - const double c1 = A(1,0)*A(0,1) + A(2,0)*A(0,2) + A(1,2)*A(2,1) + const double c1 = A(1,0)*A(0,1) + A(2,0)*A(0,2) + A(1,2)*A(2,1) - A(0,0)*A(1,1) - A(0,0)*A(2,2) - A(1,1)*A(2,2); const double c2 = trace(A); double c[4] = {c0, c1, c2, -1.0}, x[3]; diff --git a/lib/atc/Matrix.h b/lib/atc/Matrix.h index c93576518c..199443facf 100644 --- a/lib/atc/Matrix.h +++ b/lib/atc/Matrix.h @@ -7,7 +7,7 @@ static const int myPrecision = 15; /** * @class Matrix - * @brief Base class for linear algebra subsystem + * @brief Base class for linear algebra subsystem */ template @@ -34,11 +34,11 @@ public: DenseMatrix pow(int n) const; DenseMatrix pow(double n) const; - // functions that return a copy + // functions that return a copy DenseMatrix transpose() const; void row_partition(const std::set & rowsIn, std::set & rows, std::set & colsC, DenseMatrix & A1, DenseMatrix & A2, bool complement=true) const; - std::set row_partition(const std::set & rows, + std::set row_partition(const std::set & rows, DenseMatrix & A1, DenseMatrix & A2) const; void map(const std::set& rows, const std::set& cols, DenseMatrix & A) const; void insert(const std::set& rows, const std::set& cols, const DenseMatrix & A); @@ -70,22 +70,22 @@ public: T col_min (INDEX i=0) const { return column(*this,i).min(); } T col_max (INDEX i=0) const { return column(*this,i).max(); } T col_stdev(INDEX i=0) const { return column(*this,i).stdev(); } - + // pure virtual functions (required to implement these) --------------------- //* reference index operator - virtual T& operator()(INDEX i, INDEX j)=0; + virtual T& operator()(INDEX i, INDEX j)=0; //* value index operator - virtual T operator()(INDEX i, INDEX j)const=0; + virtual T operator()(INDEX i, INDEX j)const=0; //* value flat index operator - virtual T& operator [](INDEX i)=0; + virtual T& operator [](INDEX i)=0; //* reference flat index operator - virtual T operator [](INDEX i) const=0; + virtual T operator [](INDEX i) const=0; //* returns the # of rows - virtual INDEX nRows() const=0; + virtual INDEX nRows() const=0; //* returns the # of columns - virtual INDEX nCols() const=0; + virtual INDEX nCols() const=0; //* returns a pointer to the data (dangerous) - virtual T * ptr() const=0; + virtual T * ptr() const=0; //* resizes the matrix, copy what fits default to OFF virtual void resize(INDEX nRows, INDEX nCols=1, bool copy=false)=0; //* resizes the matrix, zero it out default to ON @@ -93,7 +93,7 @@ public: //* resizes and copies data virtual void copy(const T * ptr, INDEX nRows, INDEX nCols=1)=0; //* create restart file - virtual void write_restart(FILE *f) const=0; + virtual void write_restart(FILE *f) const=0; //* writes a matlab command to recreate this in a variable named s virtual void matlab(std::ostream &o, const std::string &s="M") const; //* writes a mathematica command to recreate this in a variable named s @@ -106,7 +106,7 @@ public: Matrix& operator+=(const Matrix &r); Matrix& operator-=(const Matrix &r); - + Matrix& operator*=(const Matrix& R); Matrix& operator/=(const Matrix& R); Matrix& operator+=(const T v); @@ -116,7 +116,7 @@ public: Matrix& divide_zero_safe(const Matrix& B); Matrix& operator=(const T &v); - Matrix& operator=(const Matrix &c); + Matrix& operator=(const Matrix &c); virtual void set_all_elements_to(const T &v); //* adds a matrix scaled by factor s to this one. void add_scaled(const Matrix &A, const T& s); @@ -148,11 +148,11 @@ protected: virtual void _set_equal(const Matrix &r) = 0; }; -//* Matrix operations +//* Matrix operations //@{ //* Sets C as b*C + a*A[transpose?]*B[transpose?] template -void MultAB(const Matrix &A, const Matrix &B, DenseMatrix &C, +void MultAB(const Matrix &A, const Matrix &B, DenseMatrix &C, bool At=0, bool Bt=0, T a=1, T b=0); //* performs a matrix-vector multiply template @@ -166,7 +166,7 @@ DenseMatrix eigensystem(const Matrix& A, const Matrix& B DenseMatrix polar_decomposition(const Matrix& A, DenseMatrix & rotation, DenseMatrix & stretch, bool leftRotation = true); //* returns the trace of a matrix -template +template T trace(const Matrix& A) { return A.trace(); } //* computes the determinant of a square matrix double det(const Matrix& A); @@ -175,7 +175,7 @@ double max_eigenvalue(const Matrix& A); //@} //----------------------------------------------------------------------------- -// computes the sum of the difference squared of each element. +// computes the sum of the difference squared of each element. //----------------------------------------------------------------------------- template double sum_difference_squared(const Matrix& A, const Matrix &B) @@ -200,21 +200,21 @@ DenseMatrix operator*(const Matrix &A, const Matrix &B) return C; } //----------------------------------------------------------------------------- -//* Multiply a Matrix by a scalar +//* Multiply a Matrix by a scalar //----------------------------------------------------------------------------- template DenseMatrix operator*(const Matrix &M, const T s) { DenseMatrix R(M); - return R*=s; + return R*=s; } //----------------------------------------------------------------------------- -//* Multiply a Matrix by a scalar +//* Multiply a Matrix by a scalar template DenseMatrix operator*(const T s, const Matrix &M) { DenseMatrix R(M); - return R*=s; + return R*=s; } //----------------------------------------------------------------------------- //* inverse scaling operator - must always create memory @@ -247,7 +247,7 @@ DenseMatrix operator-(const Matrix &A, const Matrix &B) //----------------------------------------------------------------------------- //* performs a matrix-matrix multiply with general type implementation template -void MultAB(const Matrix &A, const Matrix &B, DenseMatrix &C, +void MultAB(const Matrix &A, const Matrix &B, DenseMatrix &C, const bool At, const bool Bt, T /* a */, T b) { const INDEX sA[2] = {A.nRows(), A.nCols()}; // m is sA[At] k is sA[!At] @@ -311,16 +311,16 @@ void Matrix::print(std::ostream &o, const std::string &name, int p) const //----------------------------------------------------------------------------- //* print operator, use cout by default template -void Matrix::print() const +void Matrix::print() const { - print(std::cout); + print(std::cout); } //----------------------------------------------------------------------------- //* named print operator, use cout by default template -void Matrix::print(const std::string &name, int p) const +void Matrix::print(const std::string &name, int p) const { - print(std::cout, name, p); + print(std::cout, name, p); } //----------------------------------------------------------------------------- //* element by element division @@ -367,8 +367,8 @@ DenseMatrix Matrix::transpose() const { DenseMatrix t(this->nCols(), this->nRows()); int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) for (INDEX j = 0; j < szj; j++) t(j,i) = (*this)(i,j); return t; @@ -381,14 +381,14 @@ DenseMatrix transpose(const Matrix &A) return A.transpose(); } //----------------------------------------------------------------------------- -//* Returns the sum of all matrix elements +//* Returns the sum of all matrix elements template T Matrix::sum() const { if (!size()) return T(0); T v = (*this)[0]; for (INDEX i=1; isize(); i++) v += (*this)[i]; - return v; + return v; } //----------------------------------------------------------------------------- //* Returns the standard deviation of the matrix @@ -399,12 +399,12 @@ T Matrix::stdev() const T mean = this->mean(); T diff = (*this)[0]-mean; T stdev = diff*diff; - for (INDEX i=1; isize(); i++) + for (INDEX i=1; isize(); i++) { diff = (*this)[i]-mean; stdev += diff*diff; } - return sqrt(stdev/T(this->size()-1)); + return sqrt(stdev/T(this->size()-1)); } //----------------------------------------------------------------------------- //* Returns the maximum of the matrix @@ -414,7 +414,7 @@ T Matrix::max() const GCHK(!this->size(), "Matrix::max() size must be > 0"); T v = (*this)[0]; for (INDEX i=1; isize(); i++) v = std::max(v, (*this)[i]); - return v; + return v; } //----------------------------------------------------------------------------- //* Returns the minimum of the matrix @@ -424,7 +424,7 @@ T Matrix::min() const GCHK(!this->size(), "Matrix::min() size must be > 0"); T v = (*this)[0]; for (INDEX i=1; isize(); i++) v = std::min(v, (*this)[i]); - return v; + return v; } //----------------------------------------------------------------------------- //* Returns the maximum absolute value of the matrix @@ -434,7 +434,7 @@ T Matrix::maxabs() const GCHK(!this->size(), "Matrix::maxabs() size must be > 0"); T v = (*this)[0]; for (INDEX i=1; isize(); i++) v = ATC_Utility::max_abs(v, (*this)[i]); - return v; + return v; } //----------------------------------------------------------------------------- //* Returns the minimum absoute value of the matrix @@ -444,28 +444,28 @@ T Matrix::minabs() const GCHK(!this->size(), "Matrix::minabs() size must be > 0"); T v = (*this)[0]; for (INDEX i=1; isize(); i++) v = ATC_Utility::min_abs(v, (*this)[i]); - return v; + return v; } //----------------------------------------------------------------------------- //* returns the L2 norm of the matrix template -T Matrix::norm() const +T Matrix::norm() const { GCHK(!this->size(), "Matrix::norm() size must be > 0"); - return sqrt(dot(*this)); + return sqrt(dot(*this)); } //----------------------------------------------------------------------------- //* returns the L2 norm of the matrix template -T Matrix::norm_sq() const +T Matrix::norm_sq() const { GCHK(!this->size(), "Matrix::norm() size must be > 0"); - return dot(*this); + return dot(*this); } //----------------------------------------------------------------------------- //* returns the average of the matrix template -T Matrix::mean() const +T Matrix::mean() const { GCHK(!this->size(), "Matrix::mean() size must be > 0"); return sum()/T(this->size()); @@ -497,7 +497,7 @@ T Matrix::trace() const //----------------------------------------------------------------------------- //* Adds a matrix to this one template -Matrix& Matrix::operator+=(const Matrix &r) +Matrix& Matrix::operator+=(const Matrix &r) { SSCK(*this, r, "operator+= or operator +"); int sz=this->size(); for(INDEX i=0; i& Matrix::operator+=(const Matrix &r) // subtracts a matrix from this one //----------------------------------------------------------------------------- template -Matrix& Matrix::operator-=(const Matrix &r) +Matrix& Matrix::operator-=(const Matrix &r) { SSCK(*this, r, "operator-= or operator -"); int sz=this->size(); for(INDEX i=0; i& Matrix::operator*=(const Matrix& R) { if ((R.nCols()==1) && (this->nCols()>1)) { // multiply every entry in a row by the same value int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) for (INDEX j = 0; j < szj; j++) { (*this)(i,j) *= R[i]; } } - else if (((R.nCols()==R.size()) && (R.nRows()==R.size())) && !((this->nCols()==this->size()) && (this->nRows()==this->size()))){ + else if (((R.nCols()==R.size()) && (R.nRows()==R.size())) && !((this->nCols()==this->size()) && (this->nRows()==this->size()))){ int szi = this->nRows(); - int szj = this->nCols(); - for (INDEX i = 0; i < szi; i++) + int szj = this->nCols(); + for (INDEX i = 0; i < szi; i++) for (INDEX j = 0; j < szj; j++) { (*this)(i,j) *= R[i]; } - } + } else { // multiply each entry by a different value int sz = this->size(); - for (INDEX i = 0; i < sz; i++) + for (INDEX i = 0; i < sz; i++) { - (*this)[i] *= R[i]; + (*this)[i] *= R[i]; } } return *this; @@ -566,10 +566,10 @@ Matrix& Matrix::operator/=(const Matrix& R) else { // divide each entry by a different value SSCK(*this, R, "operator/= or operator/"); int sz = this->size(); - for(INDEX i = 0; i < sz; i++) + for(INDEX i = 0; i < sz; i++) { - GCHK(fabs(R[i])==0,"Operator/: division by zero"); - (*this)[i] /= R[i]; + GCHK(fabs(R[i])==0,"Operator/: division by zero"); + (*this)[i] /= R[i]; } } return *this; @@ -594,10 +594,10 @@ Matrix& Matrix::divide_zero_safe(const Matrix& R) else { // divide each entry by a different value SSCK(*this, R, "operator/= or operator/"); int sz = this->size(); - for(INDEX i = 0; i < sz; i++) + for(INDEX i = 0; i < sz; i++) { if(fabs(R[i])!=0) { - (*this)[i] /= R[i]; + (*this)[i] /= R[i]; } } } @@ -607,33 +607,33 @@ Matrix& Matrix::divide_zero_safe(const Matrix& R) // scales this matrix by a constant //----------------------------------------------------------------------------- template -Matrix& Matrix::operator*=(const T v) +Matrix& Matrix::operator*=(const T v) { - int sz=this->size(); for(INDEX i=0; isize(); for(INDEX i=0; i -Matrix& Matrix::operator+=(const T v) +Matrix& Matrix::operator+=(const T v) { - int sz=this->size(); for(INDEX i=0; isize(); for(INDEX i=0; i -Matrix& Matrix::operator-=(const T v) +Matrix& Matrix::operator-=(const T v) { - int sz=this->size(); for(INDEX i=0; isize(); for(INDEX i=0; i -Matrix& Matrix::operator/=(T v) +Matrix& Matrix::operator/=(T v) { return (*this)*=(1.0/v); } @@ -650,15 +650,15 @@ Matrix& Matrix::operator=(const Matrix &r) //----------------------------------------------------------------------------- //* sets all elements to a constant template -inline Matrix& Matrix::operator=(const T &v) +inline Matrix& Matrix::operator=(const T &v) { - set_all_elements_to(v); + set_all_elements_to(v); return *this; } //----------------------------------------------------------------------------- //* sets all elements to a constant template -void Matrix::set_all_elements_to(const T &v) +void Matrix::set_all_elements_to(const T &v) { int sz=this->size(); for(INDEX i=0; i::add_scaled(const Matrix &A, const T& s) //----------------------------------------------------------------------------- //* writes a matlab command to the console template -void Matrix::matlab(const std::string &s) const +void Matrix::matlab(const std::string &s) const { - this->matlab(std::cout, s); + this->matlab(std::cout, s); } //----------------------------------------------------------------------------- //* Writes a matlab script defining the vector to the stream @@ -685,17 +685,17 @@ void Matrix::matlab(std::ostream &o, const std::string &s) const { o << s <<"=zeros(" << nRows() << ","<nRows(); - int szj = this->nCols(); + int szj = this->nCols(); for (INDEX i = 0; i < szi; i++) - for (INDEX j = 0; j < szj; j++) + for (INDEX j = 0; j < szj; j++) o << s << "("< -void Matrix::mathematica(const std::string &s) const +void Matrix::mathematica(const std::string &s) const { - this->mathematica(std::cout, s); + this->mathematica(std::cout, s); } //----------------------------------------------------------------------------- //* Writes a mathematica script defining the vector to the stream @@ -710,7 +710,7 @@ void Matrix::mathematica(std::ostream &o, const std::string &s) const for(INDEX j=1; j< nCols(); j++) o << ", " << (*this)(i,j); if (i+1 == nRows()) { o <<" } \n"; } else { o <<" }, \n"; } - + } o << "};\n"; o << std::scientific; @@ -718,16 +718,16 @@ void Matrix::mathematica(std::ostream &o, const std::string &s) const //----------------------------------------------------------------------------- //* sets all matrix elements to zero template -inline Matrix& Matrix::zero() -{ +inline Matrix& Matrix::zero() +{ set_all_elements_to(T(0)); return *this; } //----------------------------------------------------------------------------- //* sets to identity template -inline Matrix& Matrix::identity(int nrows) -{ +inline Matrix& Matrix::identity(int nrows) +{ if (nrows == 0) { SQCK(*this, "DenseMatrix::inv(), matrix not square"); // check matrix is square nrows = nRows(); @@ -739,30 +739,30 @@ inline Matrix& Matrix::identity(int nrows) //----------------------------------------------------------------------------- //* returns the total number of elements template -inline INDEX Matrix::size() const -{ - return nRows()*nCols(); +inline INDEX Matrix::size() const +{ + return nRows()*nCols(); } //----------------------------------------------------------------------------- //* returns true if (i,j) is within the range of the matrix template inline bool Matrix::in_range(INDEX i, INDEX j) const -{ - return i inline bool Matrix::is_size(INDEX rs, INDEX cs) const -{ - return nRows()==rs && nCols()==cs; +{ + return nRows()==rs && nCols()==cs; } //----------------------------------------------------------------------------- //* returns true if the matrix is square and not empty template inline bool Matrix::is_square() const -{ - return nRows()==nCols() && nRows(); +{ + return nRows()==nCols() && nRows(); } //----------------------------------------------------------------------------- //* returns true if Matrix, m, is the same size as this @@ -776,14 +776,14 @@ inline bool Matrix::same_size(const Matrix &m) const template inline bool Matrix::same_size(const Matrix &a, const Matrix &b) { - return a.same_size(b); + return a.same_size(b); } //----------------------------------------------------------------------------- //* returns true if Matrix a rows = Matrix b cols template inline bool Matrix::cols_equals_rows(const Matrix &a, const Matrix &b) { - return a.nCols() == b.nRows(); + return a.nCols() == b.nRows(); } //----------------------------------------------------------------------------- //* returns true if no value is outside of the range @@ -842,7 +842,7 @@ void merror(const Matrix &a, const Matrix &b, const std::string m) //* rows is the map for A1, (rows,colsC) is the map for A2 template -void Matrix::row_partition(const std::set & rowsIn, +void Matrix::row_partition(const std::set & rowsIn, std::set & rows, std::set & colsC, DenseMatrix & A1, DenseMatrix & A2, bool complement) const { @@ -890,7 +890,7 @@ DenseMatrix & A1, DenseMatrix & A2, bool complement) const } template -std::set Matrix::row_partition(const std::set & rows, +std::set Matrix::row_partition(const std::set & rows, DenseMatrix & A1, DenseMatrix & A2) const { // complement of set "rows" in set of this.cols is "cols" @@ -935,7 +935,7 @@ DenseMatrix & A1, DenseMatrix & A2) const //----------------------------------------------------------------------------- //* returns row & column mapped matrix template -void Matrix::map(const std::set & rows, const std::set & cols, +void Matrix::map(const std::set & rows, const std::set & cols, DenseMatrix & A ) const { if (rows.size() == 0 || cols.size() == 0 ) { @@ -957,10 +957,10 @@ DenseMatrix & A ) const } } //----------------------------------------------------------------------------- -//* inserts elements from a smaller matrix +//* inserts elements from a smaller matrix template -void Matrix::insert(const std::set & rows, const std::set & cols, -const DenseMatrix & A ) +void Matrix::insert(const std::set & rows, const std::set & cols, +const DenseMatrix & A ) { if (rows.size() == 0 || cols.size() == 0 ) return; std::set::const_iterator itrI, itrJ; @@ -976,10 +976,10 @@ const DenseMatrix & A ) } } //----------------------------------------------------------------------------- -//* assemble elements from a smaller matrix +//* assemble elements from a smaller matrix template -void Matrix::assemble(const std::set & rows, const std::set & cols, -const DenseMatrix & A ) +void Matrix::assemble(const std::set & rows, const std::set & cols, +const DenseMatrix & A ) { if (rows.size() == 0 || cols.size() == 0 ) return; std::set::const_iterator itrI, itrJ; diff --git a/lib/atc/MatrixDef.h b/lib/atc/MatrixDef.h index 7ac3e3dc5f..9e8e75f819 100644 --- a/lib/atc/MatrixDef.h +++ b/lib/atc/MatrixDef.h @@ -1,9 +1,9 @@ -#ifndef MATRIXDEF_H +#ifndef MATRIXDEF_H #define MATRIXDEF_H /****************************************************************************** * Common definitions for Matrix and Vector classes -* This header file contains macros and inline functions needed for the matrix +* This header file contains macros and inline functions needed for the matrix * classes. All error checking should be defined here as a macro so that it is * neatly disabled when ATC_PRINT_DEBUGGING is not defined ******************************************************************************/ @@ -37,7 +37,7 @@ typedef int INDEX; enum CLONE_TYPE { CLONE_ROW=0, CLONE_COL=1, CLONE_DIAG=2 }; //* @struct TRIPLET //* @brief Triplet output entity -template +template struct TRIPLET { TRIPLET(int _i=0, int _j=0, T _v=T(0)) : i(_i), j(_j), v(_v) {} INDEX i, j; T v; }; @@ -139,22 +139,22 @@ template T dot(const SparseVector &a, const SparseVector &b); //@} template CloneVector column(Matrix &c, INDEX i) { - return CloneVector(c, CLONE_COL, i); + return CloneVector(c, CLONE_COL, i); } template CloneVector row(Matrix &c, INDEX i) { return CloneVector(c, CLONE_ROW, i); } template CloneVector diagonal(Matrix &c) { - return CloneVector(c, CLONE_DIAG); + return CloneVector(c, CLONE_DIAG); } template const CloneVector column(const Matrix &c, INDEX i) { - return CloneVector(c, CLONE_COL, i); + return CloneVector(c, CLONE_COL, i); } template const CloneVector row(const Matrix &c, INDEX i) { - return CloneVector(c, CLONE_ROW, i); + return CloneVector(c, CLONE_ROW, i); } -template const CloneVector diagonal(const Matrix &c) { - return CloneVector(c, CLONE_DIAG); +template const CloneVector diagonal(const Matrix &c) { + return CloneVector(c, CLONE_DIAG); } template const SparseMatrix *sparse_cast(const Matrix *m); template const DiagonalMatrix *diag_cast(const Matrix *m); diff --git a/lib/atc/MatrixLibrary.h b/lib/atc/MatrixLibrary.h index 7cd23a28fd..cccb37cbbc 100644 --- a/lib/atc/MatrixLibrary.h +++ b/lib/atc/MatrixLibrary.h @@ -14,9 +14,9 @@ namespace ATC_matrix { template -const SparseMatrix *sparse_cast(const Matrix *m) +const SparseMatrix *sparse_cast(const Matrix *m) { - return dynamic_cast*>(m); + return dynamic_cast*>(m); } template @@ -27,7 +27,7 @@ void copy_sparse_to_matrix(const SparseMatrix *s, Matrix &m) for (INDEX i=0; isize(); i++) { triplet = s->triplet(i); - m(triplet.i, triplet.j) = triplet.v; + m(triplet.i, triplet.j) = triplet.v; } } diff --git a/lib/atc/MeshReader.cpp b/lib/atc/MeshReader.cpp index c4896ec727..fb870985a3 100644 --- a/lib/atc/MeshReader.cpp +++ b/lib/atc/MeshReader.cpp @@ -2,8 +2,8 @@ #include "LammpsInterface.h" #include "Utility.h" #ifdef HAS_EXODUS -//#include -//#include "netcdf.h" +//#include +//#include "netcdf.h" #include "exodusII.h" #endif @@ -18,8 +18,8 @@ using std::string; namespace ATC { /** constructor, takes a filename */ - MeshReader::MeshReader(string filename, - Array periodicity, + MeshReader::MeshReader(string filename, + Array periodicity, double /* tol */) : meshfile_(filename), periodicity_(periodicity), @@ -36,7 +36,7 @@ namespace ATC { } string ext = filename.substr(idx+1); - + if (ext == "mesh"){ read_mesh_file(); } else { throw ATC_Error("mesh file is of unknown type."); } } @@ -66,7 +66,7 @@ namespace ATC { for (unsigned int i=0; i < str.size(); i++) { if (isdigit(str[i])) { for (unsigned int a=i; a 0) { throw ATC_Error("problem with init "+meshfile_+" "+title); } - // coordinates + // coordinates float x[nNodes_], y[nNodes_], z[nNodes_]; error = ex_get_coord (exoid, x, y, z); if (error > 0) { throw ATC_Error("problem with getting coordinates "+meshfile_); } nodeCoords_->reset(nsd,nNodes_); DENS_MAT & nodes = *nodeCoords_; for (int i = 0; i < nNodes_; ++i) { - nodes(0,i) = x[i]; // this is a float to double conversion - nodes(1,i) = y[i]; // this is a float to double conversion - nodes(2,i) = z[i]; // this is a float to double conversion + nodes(0,i) = x[i]; // this is a float to double conversion + nodes(1,i) = y[i]; // this is a float to double conversion + nodes(2,i) = z[i]; // this is a float to double conversion } ATC::LammpsInterface::instance()->print_msg_once("read "+to_string(nNodes_)+ " nodes"); @@ -181,7 +181,7 @@ namespace ATC { error = ex_get_elem_blk_ids(exoid, blkIds); char etype[MAX_STR_LENGTH+1]; string lastType; - for (int i=0; ireset(nVerts, nElements_); int n = 0; - for (int i=0; i > >(); nodeSets_->reset(nNodeSets_); - for (int i=0; iint_allmin(&lo,&globalLo); lammps_->int_allmax(&hi,&globalHi); if (globalLo == lammps_->natoms()) throw ATC_Error("MoleculeSet:initialize - no molecules correspond to the group"); - + // molmap = vector of length nlen // set to 1 for IDs that appear in group across all procs, else 0 int nlen = globalHi-globalLo+1; int * localCount = new int[nlen]; for (i = 0; i < nlen; i++) localCount[i] = 0; - + for (i = 0; i < nlocal; i++) if (mask[i] & groupBit_) localCount[molecule[i]-globalLo]++; - + int * globalCount = new int[nlen]; lammps_->int_allsum(localCount,globalCount,nlen); - + // nmolecules = # of non-zero IDs in molmap // molmap[i] = index of molecule, skipping molecules not in group with -1 - + nMoleculesTotal_ = 0; for (i = 0; i < nlen; i++) if (globalCount[i]) nMoleculesTotal_++; @@ -209,7 +209,7 @@ namespace ATC { lammps_->forward_comm_fix(); int * numBond = lammps_->num_bond(); int ** bondAtom = lammps_->bond_atom(); - + // add in real atoms for molecules int *molecule = lammps_->atom_to_molecule(); const int *mask = lammps_->atom_mask(); @@ -217,7 +217,7 @@ namespace ATC { _atomFound_.resize(atc_->nproc_ghost()); _atomFound_ = false; int nmol = 0; - + for (int i = 0; i < nlocal; i++) { queue myQueue; if ((mask[i] & groupBit_) && !_atomFound_(i)) { @@ -245,7 +245,7 @@ namespace ATC { } nmol++; moleculeToAtoms_.insert(pair >(molecule[i],myAtoms)); - } + } } // set local molecule order MoleculeSet::set_local_molecules_to_atoms(); diff --git a/lib/atc/MoleculeSet.h b/lib/atc/MoleculeSet.h index 763f08ef4d..677f907460 100644 --- a/lib/atc/MoleculeSet.h +++ b/lib/atc/MoleculeSet.h @@ -112,7 +112,7 @@ namespace ATC { PerAtomQuantity * numBond = nullptr); virtual ~SmallMoleculeSet(); - + /** reset all data */ virtual void clear(); diff --git a/lib/atc/NonLinearSolver.cpp b/lib/atc/NonLinearSolver.cpp index c11ca9474d..a58f615e4a 100644 --- a/lib/atc/NonLinearSolver.cpp +++ b/lib/atc/NonLinearSolver.cpp @@ -1,4 +1,4 @@ -// ATC headers +// ATC headers #include "NonLinearSolver.h" #include "LinearSolver.h" #include "ATC_Error.h" @@ -32,7 +32,7 @@ namespace ATC { //-------------------------------------------------------------------- double NonLinearSolver::residual_norm(VECTOR & r) { - + if (bcs_) { DENS_VEC R = r; BC_SET::const_iterator itr; @@ -54,10 +54,10 @@ namespace ATC { } if (rNorm0_ == 0.0) rNorm0_ = 1.0; if (rNorm0_ < tol0_ ) rNorm0_ = rNorm0P_; - if (rNorm0P_ == 1.0) rNorm0P_ = rNorm0_; + if (rNorm0P_ == 1.0) rNorm0P_ = rNorm0_; rNormP_ = rNorm0_; dx_.reset(r_.nRows()); // needs to be sized for linear solver - // newton's method + // newton's method for (int iter = 0; iter < maxIterations_ ; iter++ ) { // compute tangent f_->tangent(x, r_, A_); @@ -66,7 +66,7 @@ namespace ATC { if (rNorm_ < tol_) { return true; } - SPAR_MAT Asparse(A_); + SPAR_MAT Asparse(A_); LinearSolver linearSolver(Asparse, LinearSolver::AUTO_SOLVE, parallel_); if (bcs_) { linearSolver.allow_reinitialization(); @@ -74,7 +74,7 @@ namespace ATC { if (iter > 0) linearSolver.set_homogeneous_bcs(); else { x.zero(); } // linear solve w/ bcs will replace guess } - r_ *= -1; + r_ *= -1; linearSolver.solve(dx_,r_); if (iter > 0 && rNorm_ > rNormP_) { @@ -97,9 +97,9 @@ namespace ATC { - bool NonLinearSolver::line_search(VECTOR & x) + bool NonLinearSolver::line_search(VECTOR & x) { - double rNormP = rNormP_; + double rNormP = rNormP_; double dxnorm = dx_.norm(); while ( dxnorm > tolx_) { dx_ *= 0.5; // bisection diff --git a/lib/atc/NonLinearSolver.h b/lib/atc/NonLinearSolver.h index 299408c4c3..fa41af6331 100644 --- a/lib/atc/NonLinearSolver.h +++ b/lib/atc/NonLinearSolver.h @@ -29,7 +29,7 @@ class TangentOperator { /** * @class NonLinearSolver * @brief a class to solve a system of non-linear equations - * f(x) = 0 + * f(x) = 0 */ @@ -41,7 +41,7 @@ class NonLinearSolver { }; /** Constructor */ - NonLinearSolver( + NonLinearSolver( TangentOperator * f, // provides f and f' at x, pointer for polymorphism const BC_SET * bcs = nullptr, const int dof = 0, @@ -52,7 +52,7 @@ class NonLinearSolver { virtual ~NonLinearSolver() {}; /** residual norm */ - double residual_norm(VECTOR & x); + double residual_norm(VECTOR & x); /** solve */ bool solve(VECTOR & x); // incoming: initial guess, outgoing: solution @@ -60,7 +60,7 @@ class NonLinearSolver { /** line search */ bool line_search(VECTOR & x); - + /** access to current state */ DENS_MAT & tangent() { return A_;} DENS_VEC & residual() { return r_;} @@ -87,7 +87,7 @@ class NonLinearSolver { /** flavors */ int solverType_; - /** state */ + /** state */ double rNorm0_, rNorm0P_, rNorm_, rNormP_; /** parameters & tolerances */ diff --git a/lib/atc/OutputManager.cpp b/lib/atc/OutputManager.cpp index 83257a3d21..d66fb0e8dd 100644 --- a/lib/atc/OutputManager.cpp +++ b/lib/atc/OutputManager.cpp @@ -22,11 +22,11 @@ static const int kFieldWidth = kFieldPrecison + 6; static const int kFileNameSize = 26; // HERE <<<< static string tensor_component_names[9] = {"11","12","13", - "21","22","23", - "31","32","33"}; -static string sym_tensor_component_names[6] = {"11","22","33","12","13","23"}; -static string vector_component_names[3] = {"_X","_Y","_Z"}; -static string list_component_names[26] = {"_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z"}; + "21","22","23", + "31","32","33"}; +static string sym_tensor_component_names[6] = {"11","22","33","12","13","23"}; +static string vector_component_names[3] = {"_X","_Y","_Z"}; +static string list_component_names[26] = {"_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z"}; string* get_component_names(int type) { // HERE <<<< string* componentNames = list_component_names; @@ -39,7 +39,7 @@ string* get_component_names(int type) { // HERE <<<< return componentNames; } - + //----------------------------------------------------------------------------- //* //----------------------------------------------------------------------------- @@ -95,8 +95,8 @@ void OutputManager::set_option(OutputOption option, bool value) { //----------------------------------------------------------------------------- //* //----------------------------------------------------------------------------- -void OutputManager::initialize(string outputPrefix, set & otypes) -{ +void OutputManager::initialize(string outputPrefix, set & otypes) +{ if (outputPrefix_ != outputPrefix ) { // new stream with existing object outputPrefix_ = outputPrefix; initialized_ = false; @@ -162,8 +162,8 @@ void OutputManager::read_restart_file(string fileName, RESTART_LIST *data) for (int j = 0; j < field_data->nCols(); ++j) { double myVal; if (fread(&myVal,sizeof(double),1,fp) == 1) - (*field_data)(i,j) = myVal; - + (*field_data)(i,j) = myVal; + } } } @@ -172,7 +172,7 @@ void OutputManager::read_restart_file(string fileName, RESTART_LIST *data) //----------------------------------------------------------------------------- //* //----------------------------------------------------------------------------- -void OutputManager::write_globals(void) +void OutputManager::write_globals(void) { if ( outputPrefix_ == "NULL") return; string file = outputPrefix_ + ".GLOBALS"; @@ -186,10 +186,10 @@ void OutputManager::write_globals(void) if ( firstStep_ || writeGlobalsHeader_) { text << "# time:1 "; int index = 2; - for (iter = globalData_.begin(); iter != globalData_.end(); iter++) + for (iter = globalData_.begin(); iter != globalData_.end(); iter++) { string name = iter->first; - string str; stringstream out; out << ":" << index++; + string str; stringstream out; out << ":" << index++; str = out.str(); name.append(str); text.width(kFieldWidth); text << name << " "; @@ -199,7 +199,7 @@ void OutputManager::write_globals(void) writeGlobalsHeader_ = false; // data text.width(kFieldWidth); text << outputTimes_[outputTimes_.size()-1] << " "; - for (iter = globalData_.begin(); + for (iter = globalData_.begin(); iter != globalData_.end(); iter++) { double value = iter->second; text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << value << " "; @@ -207,13 +207,13 @@ void OutputManager::write_globals(void) text << "\n"; } //----------------------------------------------------------------------------- -//* +//* //----------------------------------------------------------------------------- -void OutputManager::write_geometry(const MATRIX *coordinates, +void OutputManager::write_geometry(const MATRIX *coordinates, const Array2D *connectivities) { - if ( outputPrefix_ == "NULL") throw ATC_Error( "No outputPrefix given."); - + if ( outputPrefix_ == "NULL") throw ATC_Error( "No outputPrefix given."); + number_of_nodes_ = coordinates->nCols(); coordinates_ = coordinates; connectivities_ = connectivities; @@ -222,7 +222,7 @@ void OutputManager::write_geometry(const MATRIX *coordinates, initialized_ = true; } //----------------------------------------------------------------------------- -//* +//* //----------------------------------------------------------------------------- void OutputManager::write_geometry_ensight(void) { @@ -268,14 +268,14 @@ void OutputManager::write_geometry_ensight(void) strcpy(buffer,"coordinates"); fwrite(buffer,sizeof(char),80,fp); fwrite(&number_of_nodes_,sizeof(int),1,fp); - + int number_of_spatial_dimensions = coordinates.nRows(); - if (number_of_spatial_dimensions != 3) + if (number_of_spatial_dimensions != 3) throw ATC_Error("Ensight writer needs a 3D geometry"); - for (int i = 0; i < number_of_spatial_dimensions; ++i) + for (int i = 0; i < number_of_spatial_dimensions; ++i) { - for (int j = 0; j < number_of_nodes_; ++j) + for (int j = 0; j < number_of_nodes_; ++j) { float x = (float) coordinates(i,j); fwrite(&x,sizeof(float),1,fp); @@ -283,36 +283,36 @@ void OutputManager::write_geometry_ensight(void) } // write mesh connectivities or point "connectivities" - if (connectivities_) - { + if (connectivities_) + { dataType_ = MESH; int nodes_per_element = connectivities_->nRows(); if (nodes_per_element == 4) { strcpy(buffer,"tetra4"); } else if (nodes_per_element == 8) { strcpy(buffer,"hexa8"); } else if (nodes_per_element == 20) { strcpy(buffer,"hexa20"); } else if (nodes_per_element == 27) { strcpy(buffer,"hexa27"); } - else + else throw ATC_Error("Ensight writer does not recoginize element type"); fwrite(buffer,sizeof(char),80,fp); int number_of_elements = connectivities_->nCols(); fwrite(&number_of_elements,sizeof(int),1,fp); int number_of_nodes_per_element = connectivities_->nRows(); - for (int j = 0; j < number_of_elements; ++j) + for (int j = 0; j < number_of_elements; ++j) { - for (int i = 0; i < number_of_nodes_per_element; ++i) + for (int i = 0; i < number_of_nodes_per_element; ++i) { int inode = (*connectivities_)(i,j) +1; // 1 based numbering fwrite(&inode,sizeof(int),1,fp); } } - } - else + } + else { strcpy(buffer,"point"); fwrite(buffer,sizeof(char),80,fp); int number_of_elements = number_of_nodes_; fwrite(&number_of_elements,sizeof(int),1,fp); - for (int j = 0; j < number_of_elements; ++j) + for (int j = 0; j < number_of_elements; ++j) { int inode = j +1; // 1 based numbering fwrite(&inode,sizeof(int),1,fp); @@ -325,7 +325,7 @@ void OutputManager::write_geometry_ensight(void) fclose(fp); } //----------------------------------------------------------------------------- -//* +//* //----------------------------------------------------------------------------- void OutputManager::write_geometry_text(void) { @@ -336,14 +336,14 @@ void OutputManager::write_geometry_text(void) // open file ofstream text; text.open(geom_file_text.c_str(),ios_base::out); - if (connectivities_) - { + if (connectivities_) + { int number_of_elements = connectivities_->nCols(); int number_of_nodes_per_element = connectivities_->nRows(); - for (int j = 0; j < number_of_elements; ++j) + for (int j = 0; j < number_of_elements; ++j) { text << "#"; - for (int i = 0; i < number_of_nodes_per_element; ++i) + for (int i = 0; i < number_of_nodes_per_element; ++i) { int inode = (*connectivities_)(i,j) +1; // 1 based numbering text << setw(6) << inode; @@ -354,10 +354,10 @@ void OutputManager::write_geometry_text(void) const MATRIX & coordinates = *coordinates_; int number_of_spatial_dimensions = coordinates.nRows(); - for (int j = 0; j < number_of_nodes_; ++j) + for (int j = 0; j < number_of_nodes_; ++j) { text << setw(6) << j+1 << " "; - for (int i = 0; i < number_of_spatial_dimensions; ++i) + for (int i = 0; i < number_of_spatial_dimensions; ++i) { text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << coordinates(i,j) << " "; } @@ -368,25 +368,25 @@ void OutputManager::write_geometry_text(void) //----------------------------------------------------------------------------- /** pack "soln" into data */ //----------------------------------------------------------------------------- -void OutputManager::write_data(double time, FIELDS *soln, OUTPUT_LIST *data, const int *node_map) +void OutputManager::write_data(double time, FIELDS *soln, OUTPUT_LIST *data, const int *node_map) { // pack - OUTPUT_LIST combined_data; - if (soln) + OUTPUT_LIST combined_data; + if (soln) { FIELDS::iterator iter; - for (iter = soln->begin(); iter != soln->end(); iter++) + for (iter = soln->begin(); iter != soln->end(); iter++) { FieldName field_index = iter->first; - MATRIX* field_data = &((iter->second).set_quantity()); + MATRIX* field_data = &((iter->second).set_quantity()); string field_name = field_to_string(field_index); combined_data[field_name] = field_data; } } - if (data) + if (data) { OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { string field_name = iter->first; const MATRIX* field_data = iter->second; @@ -410,7 +410,7 @@ void OutputManager::write_data(double time, OUTPUT_LIST *data, const int *node_m if (ensightOutput_) { // write data OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { string field_name = iter->first; const MATRIX* field_data = iter->second; @@ -422,7 +422,7 @@ void OutputManager::write_data(double time, OUTPUT_LIST *data, const int *node_m // write text dump if (textOutput_) { - write_data_text(data); + write_data_text(data); if (firstStep_ && node_map) { string map_file_text = outputPrefix_ + ".MAP"; ofstream text; @@ -434,10 +434,10 @@ void OutputManager::write_data(double time, OUTPUT_LIST *data, const int *node_m } } else if (fullTextOutput_) { - write_data_text(data,node_map); + write_data_text(data,node_map); } if (vtkOutput_) { - write_data_vtk(data); + write_data_vtk(data); } // global variables @@ -471,7 +471,7 @@ void OutputManager::write_data_ensight(string field_name, const MATRIX *field_da nfiles = kFileNameSize; } string* component_names = get_component_names(type); - for (int ifile = 0; ifile < nfiles; ++ifile) + for (int ifile = 0; ifile < nfiles; ++ifile) { string comp_name; if (! custom_name(field_name,ifile,comp_name)) @@ -480,15 +480,15 @@ void OutputManager::write_data_ensight(string field_name, const MATRIX *field_da } } - for (int ifile = 0; ifile < nfiles; ++ifile) + for (int ifile = 0; ifile < nfiles; ++ifile) { // for vector/tensor to components - if ( nfiles > 1 ) - { - col_start = ifile; - col_end = ifile+1; + if ( nfiles > 1 ) + { + col_start = ifile; + col_end = ifile+1; } - + // open or append data file string data_file_name = filenames[ifile]; FILE * fp=nullptr; @@ -501,12 +501,12 @@ void OutputManager::write_data_ensight(string field_name, const MATRIX *field_da if (fp == nullptr) { throw ATC_Error("can not create Ensight data file: "+data_file_name); } - + // write data char buffer[80]; strcpy(buffer,"BEGIN TIME STEP"); fwrite(buffer,sizeof(char),80,fp); - strcpy(buffer,"field name"); + strcpy(buffer,"field name"); fwrite(buffer,sizeof(char),80,fp); // per part @@ -516,23 +516,23 @@ void OutputManager::write_data_ensight(string field_name, const MATRIX *field_da fwrite(&part_number,sizeof(int),1,fp); strcpy(buffer,"coordinates"); fwrite(buffer,sizeof(char),80,fp); - if (node_map) + if (node_map) { - for (int j = col_start; j < col_end; ++j) + for (int j = col_start; j < col_end; ++j) { - for (int i = 0; i < number_of_nodes_; ++i) + for (int i = 0; i < number_of_nodes_; ++i) { int inode = node_map[i]; float x = (float) (*field_data)(inode,j); fwrite(&x,sizeof(float),1,fp); } } - } - else + } + else { - for (int j = col_start; j < col_end; ++j) + for (int j = col_start; j < col_end; ++j) { - for (int i = 0; i < field_data->nRows(); ++i) + for (int i = 0; i < field_data->nRows(); ++i) { float x = (float) (*field_data)(i,j); fwrite(&x,sizeof(float),1,fp); @@ -552,10 +552,10 @@ void OutputManager::write_data_ensight(string field_name, const MATRIX *field_da //----------------------------------------------------------------------------- void OutputManager::write_text_data_header(OUTPUT_LIST *data, ofstream & text, int k) { - if (data) + if (data) { OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { string field_name = iter->first; int nrows = iter->second->nRows(); @@ -584,7 +584,7 @@ void OutputManager::write_text_data_header(OUTPUT_LIST *data, ofstream & text, i else { for (int i = 1; i <= ncols; i++) { string name = field_name; - string str; stringstream out; + string str; stringstream out; if (! custom_name(field_name,i-1,name)) { out <<"_"<begin(); @@ -624,19 +624,19 @@ void OutputManager::write_data_text(OUTPUT_LIST *data) const MATRIX* field_data = iter->second; nrows = field_data->nRows(); - for (int i = 0; i < nrows; ++i) + for (int i = 0; i < nrows; ++i) { text.width(6); text << i << " "; // give an ordinate for gnuplot - text.width(10); text << outputTimes_.size() << " "; + text.width(10); text << outputTimes_.size() << " "; OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { const MATRIX* field_data = iter->second; int ncols = field_data->nCols(); if (ncols > kFileNameSize) { ncols = kFileNameSize;} - for (int j = 0; j < ncols; ++j) + for (int j = 0; j < ncols; ++j) { - text.width(kFieldWidth); + text.width(kFieldWidth); text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(i,j) << " "; } } @@ -656,26 +656,26 @@ void OutputManager::write_data_text(OUTPUT_LIST *data, const int *node_map) else text.open(data_file_text.c_str(),ios_base::app); // write data label header - if (firstStep_) + if (firstStep_) { - text.width(6); text << "# index:1" << " "; - text.width(6); text << " id:2" << " "; - text.width(10); text << " step:3" << " "; - text.width(4); text << " x:4" << " "; - text.width(4); text << " y:5" << " "; - text.width(4); text << " z:6" << " "; + text.width(6); text << "# index:1" << " "; + text.width(6); text << " id:2" << " "; + text.width(10); text << " step:3" << " "; + text.width(4); text << " x:4" << " "; + text.width(4); text << " y:5" << " "; + text.width(4); text << " z:6" << " "; write_text_data_header(data,text,7); - if (connectivities_) - { + if (connectivities_) + { int number_of_elements = connectivities_->nCols(); int number_of_nodes_per_element = connectivities_->nRows(); - text << "# connectivities number_of_elements: " << number_of_elements - << " nodes_per_element: " << number_of_nodes_per_element << "\n"; - for (int j = 0; j < number_of_elements; ++j) + text << "# connectivities number_of_elements: " << number_of_elements + << " nodes_per_element: " << number_of_nodes_per_element << "\n"; + for (int j = 0; j < number_of_elements; ++j) { text << "#"; - for (int i = 0; i < number_of_nodes_per_element; ++i) + for (int i = 0; i < number_of_nodes_per_element; ++i) { int inode = (*connectivities_)(i,j) +1; // 1 based numbering text << setw(6) << inode; @@ -686,34 +686,34 @@ void OutputManager::write_data_text(OUTPUT_LIST *data, const int *node_map) } text << "# timestep " << outputTimes_.size() << " : " << outputTimes_[outputTimes_.size()-1] << "\n"; - + OUTPUT_LIST::iterator iter; iter = data->begin(); if (iter == data->end()) { throw ATC_Error(" no data in output");} int nnodes = coordinates_->nCols(); - for (int i = 0; i < nnodes; ++i) + for (int i = 0; i < nnodes; ++i) { int unode = i; if (node_map) unode = node_map[i]; - text.width(6); text << i << " "; - text.width(6); text << unode << " "; - text.width(10); text << outputTimes_.size() << " "; + text.width(6); text << i << " "; + text.width(6); text << unode << " "; + text.width(10); text << outputTimes_.size() << " "; // coordinates for (int j = 0; j < coordinates_->nRows(); ++j) { - text.width(kFieldWidth); + text.width(kFieldWidth); text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*coordinates_)(j,i) << " "; } // data OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { const MATRIX* field_data = iter->second; int ncols = field_data->nCols(); if (ncols > kFileNameSize) { ncols = kFileNameSize; } - for (int j = 0; j < ncols; ++j) + for (int j = 0; j < ncols; ++j) { - text.width(kFieldWidth); + text.width(kFieldWidth); text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(unode,j) << " "; } } @@ -740,7 +740,7 @@ void OutputManager::write_data_vtk(OUTPUT_LIST *data) text << "POINTS " << nnodes << " float\n"; for (int i = 0; i < nnodes; ++i) { for (int j = 0; j < coordinates_->nRows(); ++j) { - text.width(kFieldWidth); + text.width(kFieldWidth); text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*coordinates_)(j,i) << " "; } text << "\n"; @@ -758,7 +758,7 @@ void OutputManager::write_data_vtk(OUTPUT_LIST *data) text << "\n"; } text << "\n"; - int cell_type = 4 ; + int cell_type = 4 ; text << "CELL_TYPES " << nelems << "\n"; for (int j = 0; j < nelems; ++j) { text << cell_type << "\n"; @@ -768,12 +768,12 @@ void OutputManager::write_data_vtk(OUTPUT_LIST *data) text << "POINT_DATA " << nnodes << "\n"; text << "\n"; OUTPUT_LIST::iterator iter; - for (iter = data->begin(); iter != data->end(); iter++) + for (iter = data->begin(); iter != data->end(); iter++) { string field_name = iter->first; const MATRIX* field_data = iter->second; int ncols = field_data->nCols(); - if (ncols == 1) { + if (ncols == 1) { text << "SCALARS " << field_name << " float\n"; text << "LOOKUP_TABLE default\n"; } @@ -782,7 +782,7 @@ void OutputManager::write_data_vtk(OUTPUT_LIST *data) } for (int i = 0; i < nnodes; ++i) { for (int j = 0; j < ncols; ++j) { - text.width(kFieldWidth); + text.width(kFieldWidth); text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(i,j) << " "; } text <<"\n"; @@ -797,10 +797,10 @@ void OutputManager::write_dictionary(double /* time */, OUTPUT_LIST *data) // file names string dict_file_name = outputPrefix_ + ".case"; string geom_file_name = outputPrefix_ + ".geo"; - + // open file FILE * fp=nullptr; - if ((fp=fopen(dict_file_name.c_str(),"w")) == nullptr) + if ((fp=fopen(dict_file_name.c_str(),"w")) == nullptr) { throw ATC_Error("can not create Ensight case file"); } @@ -831,7 +831,7 @@ void OutputManager::write_dictionary(double /* time */, OUTPUT_LIST *data) string* component_names = get_component_names(type); int ndof = fieldCols; if (ndof > kFileNameSize) ndof = kFileNameSize; - for (int j = 0; j < ndof; ++j) + for (int j = 0; j < ndof; ++j) { string comp_name; if (! custom_name(field_name,j,comp_name)) @@ -844,15 +844,15 @@ void OutputManager::write_dictionary(double /* time */, OUTPUT_LIST *data) else if (type == VECTOR_OUTPUT) { fprintf(fp,"vector per node: 1 1 %s %s\n", field_name.c_str(),field_file.c_str()); - } + } else if (type == SYM_TENSOR_OUTPUT) { fprintf(fp,"tensor symm per node: 1 1 %s %s\n", field_name.c_str(),field_file.c_str()); - } + } else if (type == TENSOR_OUTPUT) { fprintf(fp,"tensor asymm per node: 1 1 %s %s\n", field_name.c_str(),field_file.c_str()); - } + } else { fprintf(fp,"scalar per node: 1 1 %s %s\n", field_name.c_str(),field_file.c_str()); diff --git a/lib/atc/OutputManager.h b/lib/atc/OutputManager.h index 4454d65265..9f16f7ecd3 100644 --- a/lib/atc/OutputManager.h +++ b/lib/atc/OutputManager.h @@ -18,13 +18,13 @@ namespace ATC { enum OutputType { ENSIGHT=0, GNUPLOT, FULL_GNUPLOT, VTK }; enum OutputDataType { POINT=0, MESH }; - enum OutputDataCardinality { SCALAR_OUTPUT=0, VECTOR_OUTPUT, TENSOR_OUTPUT, + enum OutputDataCardinality { SCALAR_OUTPUT=0, VECTOR_OUTPUT, TENSOR_OUTPUT, SYM_TENSOR_OUTPUT, LIST_OUTPUT }; enum OutputOption { OUTPUT_VECTOR_COMPONENTS=0, OUTPUT_TENSOR_COMPONENTS}; /** - * @class OutputManager - * @brief Base class for handling output desired from an AtC computation + * @class OutputManager + * @brief Base class for handling output desired from an AtC computation */ class OutputManager{ @@ -38,7 +38,7 @@ namespace ATC { void initialize(std::string outputPrefix, std::set &otypes); /** set output options */ - void set_option(OutputOption option, bool value); + void set_option(OutputOption option, bool value); // Dump text-based field info to disk for later restart void write_restart_file(std::string fileName, RESTART_LIST *data); @@ -47,9 +47,9 @@ namespace ATC { void read_restart_file(std::string fileName, RESTART_LIST *data); /** write initial/reference geometry - default is to write point data, - if connectivities are given then mesh data will be output - coordinates : num _total_ points/nodes X num spatial dim + default is to write point data, + if connectivities are given then mesh data will be output + coordinates : num _total_ points/nodes X num spatial dim connectivities : num elements X num nodes per element*/ void write_geometry(const MATRIX *coordinates, const Array2D *connectivity=nullptr); @@ -57,7 +57,7 @@ namespace ATC { /** write data from a time step specify node_map to handle periodic soln & data */ void write_data(double time, OUTPUT_LIST *data, const int *node_map=nullptr); - void write_data(double time, FIELDS *soln, OUTPUT_LIST *data, + void write_data(double time, FIELDS *soln, OUTPUT_LIST *data, const int *node_map=nullptr); /** add custom names for any field */ @@ -85,11 +85,11 @@ namespace ATC { else return LIST_OUTPUT; } bool use_component_names(int type) const { - if ( (type==LIST_OUTPUT) || + if ( (type==LIST_OUTPUT) || ((type==SYM_TENSOR_OUTPUT || type==TENSOR_OUTPUT) && tensorToComponents_) - || (type==VECTOR_OUTPUT && vectorToComponents_) ) + || (type==VECTOR_OUTPUT && vectorToComponents_) ) return true; - else + else return false; } bool custom_name(const std::string field, const int index, std::string & name) const { @@ -99,7 +99,7 @@ namespace ATC { name = names[index]; return true; } - void print_custom_names(); + void print_custom_names(); private: @@ -124,8 +124,8 @@ namespace ATC { const Array2D * connectivities_; /** number of columns of data */ int nDataCols_; - /** number of nodes */ - int number_of_nodes_; + /** number of nodes */ + int number_of_nodes_; /** data type */ int dataType_; /** base name for output files */ diff --git a/lib/atc/ParDenseMatrix.h b/lib/atc/ParDenseMatrix.h index 873bf0f410..d5d3d8ac95 100644 --- a/lib/atc/ParDenseMatrix.h +++ b/lib/atc/ParDenseMatrix.h @@ -15,7 +15,7 @@ using ATC::ATC_Error; namespace ATC_matrix { /** - * @class ParDenseMatrix + * @class ParDenseMatrix * @brief Parallelized version of DenseMatrix class. */ diff --git a/lib/atc/ParDiagonalMatrix.cpp b/lib/atc/ParDiagonalMatrix.cpp index 5888bedc04..bbbc5ab29e 100644 --- a/lib/atc/ParDiagonalMatrix.cpp +++ b/lib/atc/ParDiagonalMatrix.cpp @@ -5,7 +5,7 @@ using MPI_Wrappers::allgatherv; namespace ATC_matrix { // template<> - // void ParDiagonalMatrix::MultAB(const Matrix &B, DenseMatrix &C) const + // void ParDiagonalMatrix::MultAB(const Matrix &B, DenseMatrix &C) const // { // //SparseMatrix::compress(*this); // GCK(*this, B, this->nCols()!=B.nRows(), "ParDiagonalMatrix * Matrix"); @@ -19,7 +19,7 @@ namespace ATC_matrix { // INDEX startIndex = (myRank * nRows) / nProcs; // INDEX endIndex = ((myRank + 1) * nRows) / nProcs; - + // // Calculate the scaled rows associated with this processor // for (INDEX i = startIndex; i < endIndex; i++) { // double value = (*this)[i]; @@ -28,13 +28,13 @@ namespace ATC_matrix { // } // // Collect results on all processors - + // // consider sending only owned rows from each processor // allsum(_comm, MPI_IN_PLACE, C.ptr(), C.size()); // } template<> - void ParDiagonalMatrix::MultAB(const Matrix &B, DenseMatrix &C) const + void ParDiagonalMatrix::MultAB(const Matrix &B, DenseMatrix &C) const { //SparseMatrix::compress(*this); GCK(*this, B, this->nCols()!=B.nRows(), "ParDiagonalMatrix * Matrix"); @@ -52,7 +52,7 @@ namespace ATC_matrix { int nMajor = nRows; int nMinor = nCols; #endif - + int *majorCounts = new int[nProcs]; int *majorOffsets = new int[nProcs]; @@ -64,7 +64,7 @@ namespace ATC_matrix { INDEX myNMajor = majorCounts[myRank]; INDEX myMajorOffset = majorOffsets[myRank]; - + // Calculate the scaled values associated with this processor, in row chunks #ifdef COL_STORAGE // Column-major storage diff --git a/lib/atc/ParDiagonalMatrix.h b/lib/atc/ParDiagonalMatrix.h index 89f22b783f..dfafee6e2c 100644 --- a/lib/atc/ParDiagonalMatrix.h +++ b/lib/atc/ParDiagonalMatrix.h @@ -10,7 +10,7 @@ namespace ATC_matrix { /** - * @class ParDiagonalMatrix + * @class ParDiagonalMatrix * @brief Parallelized version of DiagonalMatrix class. */ diff --git a/lib/atc/ParSparseMatrix.cpp b/lib/atc/ParSparseMatrix.cpp index 77c8eb33d5..0365a35641 100644 --- a/lib/atc/ParSparseMatrix.cpp +++ b/lib/atc/ParSparseMatrix.cpp @@ -33,7 +33,7 @@ void ParSparseMatrix::MultMv(const Vector& v, #ifdef DISABLE_PAR_HEURISTICS // Use much more lenient heuristics to exercise parallel code if (numProcs == 1 || _size < 300) { -#else +#else // These are simple heuristics to perform multiplication in serial if // parallel will be slower. They were determined experimentally. if ( numProcs == 1 || @@ -45,7 +45,7 @@ void ParSparseMatrix::MultMv(const Vector& v, SparseMatrix::MultMv(v, c); return; } - + SparseMatrix::compress(*this); GCK(*this, v, this->nCols() != v.size(), "ParSparseMatrix * Vector") diff --git a/lib/atc/ParSparseMatrix.h b/lib/atc/ParSparseMatrix.h index b2642e87be..3b21a1c70f 100644 --- a/lib/atc/ParSparseMatrix.h +++ b/lib/atc/ParSparseMatrix.h @@ -10,13 +10,13 @@ namespace ATC_matrix { /** - * @class ParSparseMatrix + * @class ParSparseMatrix * @brief Parallelized version of SparseMatrix class. - * + * * ParSparseMatrix::MultMv is used in LinearSolver, which is then * used in NonLinearSolver, PoissonSolver, and SchrodingerSolver. These * parallelized solvers are used in the following locations: - * + * * - LinearSolver * - ExtrinsicModelDriftDiffusion.cpp (lines 511 and 522) * - AtomicRegulator.cpp (line 926) @@ -55,7 +55,7 @@ namespace ATC_matrix { template friend void ParMultAB(MPI_Comm comm, const SparseMatrix& A, const Matrix& B, DenseMatrix& C); - + private: MPI_Comm _comm; }; @@ -99,7 +99,7 @@ namespace ATC_matrix { void ParMultAB(MPI_Comm comm, const SparseMatrix& A, const Matrix& B, DenseMatrix& C) { SparseMatrix::compress(A); - + INDEX M = A.nRows(), N = B.nCols(); if (!C.is_size(M, N)) { diff --git a/lib/atc/PerAtomQuantity-inl.h b/lib/atc/PerAtomQuantity-inl.h index b570e7645b..b7c16e2348 100644 --- a/lib/atc/PerAtomQuantity-inl.h +++ b/lib/atc/PerAtomQuantity-inl.h @@ -49,17 +49,17 @@ namespace ATC { const DenseMatrix & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating if (myQuantity.nRows()>0) { // full matrix copy - + if (atomType_ == ALL || atomType_ == PROC_GHOST) { if (nCols_==1) { // scalar T * lammpsQuantity = this->lammps_scalar(); - + for (int i = 0; i < atc_.nlocal_total(); i++) lammpsQuantity[i] = myQuantity(i,0); } else{ // vector T ** lammpsQuantity = this->lammps_vector(); - + for (int i = 0; i < atc_.nlocal_total(); i++) for (int j = 0; j < nCols_; j++) lammpsQuantity[i][j] = myQuantity(i,j); @@ -119,7 +119,7 @@ namespace ATC { else { const Array & quantityToLammps = atc_.atc_to_lammps_map(); int atomIndex; - + if (nCols_==1) { // scalar const T * lammpsQuantity = this->lammps_scalar(); for (int i = 0; i < myQuantity.nRows(); i++) { @@ -141,7 +141,7 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for exchange with another proc + // pack values in local atom-based arrays for exchange with another proc //----------------------------------------------------------------- template int PerAtomQuantity::pack_exchange(int i, double *buffer) @@ -157,7 +157,7 @@ namespace ATC { } //----------------------------------------------------------------- - // unpack values in local atom-based arrays from exchange with another proc + // unpack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- template int PerAtomQuantity::unpack_exchange(int i, double *buffer) @@ -173,10 +173,10 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for passing to ghosts on another proc + // pack values in local atom-based arrays for passing to ghosts on another proc //----------------------------------------------------------------- template - int PerAtomQuantity::pack_comm(int index, double *buf, + int PerAtomQuantity::pack_comm(int index, double *buf, int /* pbc_flag */, int * /* pbc */) { if (this->need_reset()) this->reset(); @@ -202,12 +202,12 @@ namespace ATC { } //----------------------------------------------------------------- - // allocate local atom-based arrays + // allocate local atom-based arrays //----------------------------------------------------------------- template void PerAtomQuantity::grow_lammps_array(int nmax, const std::string & tag) { - + if (nCols_ == 1) this->lammpsScalar_ = lammpsInterface_->grow_array(this->lammpsScalar_,nmax,tag.c_str()); else @@ -215,7 +215,7 @@ namespace ATC { } //----------------------------------------------------------------- - // copy values within local atom-based arrays + // copy values within local atom-based arrays //----------------------------------------------------------------- template void PerAtomQuantity::copy_lammps_array(int i, int j) @@ -252,10 +252,10 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for passing to ghosts on another proc + // pack values in local atom-based arrays for passing to ghosts on another proc //----------------------------------------------------------------- template - int LammpsAtomQuantity::pack_comm(int index, double *buf, + int LammpsAtomQuantity::pack_comm(int index, double *buf, int /* pbc_flag */, int * /* pbc */) { if (this->need_reset()) this->reset(); @@ -294,7 +294,7 @@ namespace ATC { lammpsQuantity[index][k] = myQuantity(index,k); } } - + this->propagate_reset(); return bufIdx; } @@ -317,11 +317,11 @@ namespace ATC { const INT_ARRAY & atomMap(atomMap_->quantity()); if (myQuantity.nRows()>0) { // full matrix copy - + if (PerAtomQuantity::atomType_ == ALL || PerAtomQuantity::atomType_ == PROC_GHOST) { if (nCols==1) { // scalar T * lammpsQuantity = ProtectedAtomQuantity::lammps_scalar(); - + for (int i = 0; i < PerAtomQuantity::atc_.nlocal_total(); i++) { int idx = atomMap(i,0); if (idx > -1) { @@ -331,7 +331,7 @@ namespace ATC { } else{ // vector T ** lammpsQuantity = ProtectedAtomQuantity::lammps_vector(); - + for (int i = 0; i < PerAtomQuantity::atc_.nlocal_total(); i++) { int idx = atomMap(i,0); if (idx > -1) { @@ -475,10 +475,10 @@ namespace ATC { const DiagonalMatrix & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating if (myQuantity.size()>0) { // full matrix copy - + if (atomType_ == ALL || atomType_ == PROC_GHOST) { T * lammpsQuantity = this->lammps_scalar(); - + for (int i = 0; i < atc_.nlocal_total(); i++) { lammpsQuantity[i] = myQuantity(i,i); } @@ -526,7 +526,7 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for exchange with another proc + // pack values in local atom-based arrays for exchange with another proc //----------------------------------------------------------------- template int PerAtomDiagonalMatrix::pack_exchange(int i, double *buffer) @@ -536,7 +536,7 @@ namespace ATC { } //----------------------------------------------------------------- - // unpack values in local atom-based arrays from exchange with another proc + // unpack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- template int PerAtomDiagonalMatrix::unpack_exchange(int i, double *buffer) @@ -546,10 +546,10 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for passing to ghosts on another proc + // pack values in local atom-based arrays for passing to ghosts on another proc //----------------------------------------------------------------- template - int PerAtomDiagonalMatrix::pack_comm(int index, double *buf, + int PerAtomDiagonalMatrix::pack_comm(int index, double *buf, int /* pbc_flag */, int * /* pbc */) { if (this->need_reset()) this->reset(); @@ -571,7 +571,7 @@ namespace ATC { } //----------------------------------------------------------------- - // allocate local atom-based arrays + // allocate local atom-based arrays //----------------------------------------------------------------- template void PerAtomDiagonalMatrix::grow_lammps_array(int nmax, const std::string & tag) @@ -580,7 +580,7 @@ namespace ATC { } //----------------------------------------------------------------- - // copy values within local atom-based arrays + // copy values within local atom-based arrays //----------------------------------------------------------------- template void PerAtomDiagonalMatrix::copy_lammps_array(int i, int j) @@ -636,10 +636,10 @@ namespace ATC { if (myQuantity.nRows()>0) { // full matrix copy if (atomType_ == ALL || atomType_ == PROC_GHOST) { - + T ** lammpsQuantity = this->lammps_vector(); int ** lammpsColIndices = this->lammps_column_indices(); - + for (int i = 0; i < atc_.nlocal_total(); i++) { myQuantity.row(i,_values_,_colIndices_); for (int j = 0; j < _values_.size(); j++) { @@ -717,7 +717,7 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for exchange with another proc + // pack values in local atom-based arrays for exchange with another proc //----------------------------------------------------------------- template int PerAtomSparseMatrix::pack_exchange(int i, double *buffer) @@ -735,7 +735,7 @@ namespace ATC { } //----------------------------------------------------------------- - // unpack values in local atom-based arrays from exchange with another proc + // unpack values in local atom-based arrays from exchange with another proc //----------------------------------------------------------------- template int PerAtomSparseMatrix::unpack_exchange(int i, double *buffer) @@ -753,10 +753,10 @@ namespace ATC { } //----------------------------------------------------------------- - // pack values in local atom-based arrays for passing to ghosts on another proc + // pack values in local atom-based arrays for passing to ghosts on another proc //----------------------------------------------------------------- template - int PerAtomSparseMatrix::pack_comm(int /* index */, double * /* buf */, + int PerAtomSparseMatrix::pack_comm(int /* index */, double * /* buf */, int /* pbc_flag */, int */* pbc */) { return 0; @@ -772,19 +772,19 @@ namespace ATC { } //----------------------------------------------------------------- - // allocate local atom-based arrays + // allocate local atom-based arrays //----------------------------------------------------------------- template void PerAtomSparseMatrix::grow_lammps_array(int nmax, const std::string & tag) { - + this->lammpsVector_ = lammpsInterface_->grow_array(this->lammpsVector_,nmax,maxEntriesPerRow_,tag.c_str()); std::string myString(tag+std::string("Columns")); this->lammpsColIndices_ = lammpsInterface_->grow_array(this->lammpsColIndices_,nmax,maxEntriesPerRow_,myString.c_str()); } //----------------------------------------------------------------- - // copy values within local atom-based arrays + // copy values within local atom-based arrays //----------------------------------------------------------------- template void PerAtomSparseMatrix::copy_lammps_array(int i, int j) diff --git a/lib/atc/PerAtomQuantity.h b/lib/atc/PerAtomQuantity.h index a822b6a9b6..3b72431560 100644 --- a/lib/atc/PerAtomQuantity.h +++ b/lib/atc/PerAtomQuantity.h @@ -18,17 +18,17 @@ namespace ATC { template class ClonedAtomQuantity; /** - * @class PerAtomQuantity + * @class PerAtomQuantity * @brief Base class for objects that manage atomic quantities and their AtC interface */ template class PerAtomQuantity : public MatrixDependencyManager { public: - + // constructor PerAtomQuantity(ATC_Method * atc, int nCols = 1, AtomType atomType = INTERNAL); - + // destructor virtual ~PerAtomQuantity(); @@ -75,7 +75,7 @@ namespace ATC { /** resets AtC local quantity after exchange */ virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();}; - + /** returns how much lammps memory is used in this function */ virtual int memory_usage() const {return nCols_;}; @@ -112,7 +112,7 @@ namespace ATC { virtual void reset_nlocal() { this->force_reset();} protected: - + /** utility object to access ATC methods */ PaqAtcUtility atc_; @@ -137,7 +137,7 @@ namespace ATC { /** sets the quantity based on a lammps pointer */ virtual void set_quantity_to_lammps() const; - + /** gets appropriate data for lammps pointer */ virtual T * lammps_scalar() const = 0; @@ -151,17 +151,17 @@ namespace ATC { T ** lammpsVector_; private: - + // do not define PerAtomQuantity(); - + }; //-------------------------------------------------------- //-------------------------------------------------------- // Class LammpsAtomQuantity // A base class for defining objects that manage - // quantities but the lammps data forms the + // quantities but the lammps data forms the // absolute definition for the contained data. //-------------------------------------------------------- //-------------------------------------------------------- @@ -235,7 +235,7 @@ namespace ATC { virtual void reset() const; - + /** gets appropriate data for lammps pointer */ virtual T * lammps_scalar() const = 0; @@ -280,7 +280,7 @@ namespace ATC { virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;}; /** packs up data for parallel transfer to ghost atoms on other processors */ - virtual int pack_comm(int /* index */, double * /* buf */, + virtual int pack_comm(int /* index */, double * /* buf */, int /* pbc_flag */, int * /* pbc */) {return 0;}; /** unpacks data after parallel transfer to ghost atoms on other processors */ @@ -309,11 +309,11 @@ namespace ATC { //-------------------------------------------------------- // Class ClonedLammpsAtomQuantity // A base class for defining objects that manage - // quantities defined at atoms based on data in + // quantities defined at atoms based on data in // a LammpsAtomQuantity //-------------------------------------------------------- //-------------------------------------------------------- - + template class ClonedAtomQuantity : public ShallowAtomQuantity { @@ -372,11 +372,11 @@ namespace ATC { //-------------------------------------------------------- // Class ProtectedClonedAtomQuantity // A base class for defining objects that manage - // quantities defined at atoms based on data in + // quantities defined at atoms based on data in // a pointer managed in the standard lammps way. //-------------------------------------------------------- //-------------------------------------------------------- - + template class ProtectedClonedAtomQuantity : public ShallowAtomQuantity { @@ -456,8 +456,8 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- // Class AtcAtomQuantity - // A funcational base class for defining objects that - // manage quantities defined at atoms and their AtC + // A funcational base class for defining objects that + // manage quantities defined at atoms and their AtC // interface that are defined by AtC classes //-------------------------------------------------------- //-------------------------------------------------------- @@ -843,7 +843,7 @@ namespace ATC { quantity1_->register_dependence(this); quantity2_->register_dependence(this); }; - + // destructor virtual ~SummedAtomicQuantity() { @@ -880,17 +880,17 @@ namespace ATC { }; /** - * @class PerAtomDiagonalMatrix + * @class PerAtomDiagonalMatrix * @brief Base class for objects that manage atomic diagonal matrices and their AtC interface */ template class PerAtomDiagonalMatrix : public MatrixDependencyManager { public: - + // constructor PerAtomDiagonalMatrix(ATC_Method * atc, AtomType atomType = INTERNAL); - + // destructor virtual ~PerAtomDiagonalMatrix(); @@ -934,7 +934,7 @@ namespace ATC { /** resets AtC local quantity after exchange */ virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal()); this->set_quantity_to_lammps();}; - + /** returns how much lammps memory is used in this function */ virtual int memory_usage() const {return 1;}; @@ -971,7 +971,7 @@ namespace ATC { virtual void reset_nlocal() { this->force_reset();} protected: - + /** utility object to access ATC methods */ PaqAtcUtility atc_; @@ -993,7 +993,7 @@ namespace ATC { /** sets the quantity based on a lammps pointer */ virtual void set_quantity_to_lammps() const; - + /** gets appropriate data for lammps pointer */ virtual T * lammps_scalar() const = 0; @@ -1001,17 +1001,17 @@ namespace ATC { T * lammpsScalar_; private: - + // do not define PerAtomDiagonalMatrix(); - + }; //-------------------------------------------------------- //-------------------------------------------------------- // Class AtcAtomDiagonalMatrix - // A funcational base class for defining objects that - // manage diagonal matrices defined at atoms and their + // A funcational base class for defining objects that + // manage diagonal matrices defined at atoms and their // AtC interface that are defined by AtC classes //-------------------------------------------------------- //-------------------------------------------------------- @@ -1044,7 +1044,7 @@ namespace ATC { //-------------------------------------------------------- // Class ProtectedAtomDiagonalMatrix // A base class for defining objects that manage - // diagonal matrixes defined at atoms internally and + // diagonal matrixes defined at atoms internally and // do not allow for reset externally //-------------------------------------------------------- //-------------------------------------------------------- @@ -1128,10 +1128,10 @@ namespace ATC { class PerAtomSparseMatrix : public MatrixDependencyManager { public: - + // constructor PerAtomSparseMatrix(ATC_Method * atc, int nCols = 1, int maxEntriesPerRow = 1, AtomType atomType = INTERNAL); - + // destructor virtual ~PerAtomSparseMatrix(); @@ -1178,7 +1178,7 @@ namespace ATC { /** resets AtC local quantity after exchange */ virtual void post_exchange() {(this->quantity_).reset(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();}; - + /** returns how much lammps memory is used in this function */ virtual int memory_usage() const {return 2*maxEntriesPerRow_;}; @@ -1215,7 +1215,7 @@ namespace ATC { virtual void reset_nlocal() { this->set_reset();}; protected: - + /** utility object to access ATC methods */ PaqAtcUtility atc_; @@ -1243,7 +1243,7 @@ namespace ATC { /** sets the quantity based on a lammps pointer */ virtual void set_quantity_to_lammps() const; - + /** gets appropriate data for lammps pointer */ virtual T ** lammps_vector() const = 0; @@ -1261,17 +1261,17 @@ namespace ATC { mutable DenseVector _colIndices_; private: - + // do not define PerAtomSparseMatrix(); - + }; //-------------------------------------------------------- //-------------------------------------------------------- // Class AtcAtomSparseMatrix - // A funcational base class for defining objects that - // manage sparse matrices defined at atoms and their + // A funcational base class for defining objects that + // manage sparse matrices defined at atoms and their // AtC interface that are defined by AtC classes //-------------------------------------------------------- //-------------------------------------------------------- @@ -1283,7 +1283,7 @@ namespace ATC { // constructor AtcAtomSparseMatrix(ATC_Method * atc, int nCols = 1, int maxEntriesPerRow = 1, - AtomType atomType = INTERNAL) : + AtomType atomType = INTERNAL) : PerAtomSparseMatrix(atc,nCols,maxEntriesPerRow,atomType) {}; // destructor @@ -1308,7 +1308,7 @@ namespace ATC { //-------------------------------------------------------- // Class ProtectedAtomSparseMatrix // A base class for defining objects that manage - // sparse matrixes defined at atoms internally and + // sparse matrixes defined at atoms internally and // do not allow for reset externally //-------------------------------------------------------- //-------------------------------------------------------- @@ -1389,7 +1389,7 @@ namespace ATC { //-------------------------------------------------------- // Class ProtectedMappedSparseMatrix // A base class for defining objects that manage - // sparse matrices defined at atoms internally and do + // sparse matrices defined at atoms internally and do // not allow for reset externally, but are mapped in // at least one of their dimensions //-------------------------------------------------------- @@ -1415,7 +1415,7 @@ namespace ATC { /** resets AtC local quantity after exchange */ virtual void post_exchange() {this->set_reset();}; - + /** returns how much lammps memory is used in this function */ virtual int memory_usage() const {return 0;}; diff --git a/lib/atc/PerAtomQuantityLibrary.cpp b/lib/atc/PerAtomQuantityLibrary.cpp index 7f8a9b879a..917e6b51ea 100644 --- a/lib/atc/PerAtomQuantityLibrary.cpp +++ b/lib/atc/PerAtomQuantityLibrary.cpp @@ -82,13 +82,13 @@ namespace ATC { AtomInElementSet::AtomInElementSet(ATC_Method * atc, PerAtomQuantity * map, ESET eset, int type): - atc_(atc,INTERNAL), + atc_(atc,INTERNAL), map_(map),eset_(eset),type_(type), quantityToLammps_(atc_.atc_to_lammps_map()) { map_->register_dependence(this); needReset_ = true; - + } //-------------------------------------------------------- // destructor @@ -100,12 +100,12 @@ namespace ATC { //-------------------------------------------------------- // reset //-------------------------------------------------------- - void AtomInElementSet::reset() + void AtomInElementSet::reset() { if (map_->need_reset() || needReset_) { list_.clear(); INT_ARRAY map = map_->quantity(); - int * type = ATC::LammpsInterface::instance()->atom_type(); + int * type = ATC::LammpsInterface::instance()->atom_type(); ESET::const_iterator itr; const Array & quantityToLammps = atc_.atc_to_lammps_map(); for (int i = 0; i < map.size(); i++) { @@ -113,7 +113,7 @@ namespace ATC { if (map(i,0) == *itr) { int a = quantityToLammps(i); if (type[a] == type_) { - list_.push_back(ID_PAIR(i,a)); + list_.push_back(ID_PAIR(i,a)); break; } } @@ -150,7 +150,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // reset //-------------------------------------------------------- @@ -196,18 +196,18 @@ namespace ATC { int ngroup = lammpsInterface_->ngroup(); const int *mask = lammpsInterface_->atom_mask(); double * bounds; - + bounds = new double[6]; for (int i = 0; i < ngroup; ++i) { lammpsInterface_->group_bounds(i, bounds); - atomGroupVolume_[lammpsInterface_->group_bit(i)] = + atomGroupVolume_[lammpsInterface_->group_bit(i)] = (bounds[1]-bounds[0])*(bounds[3]-bounds[2])*(bounds[5]-bounds[4]); } delete [] bounds; - + INT_VECTOR localCount(ngroup); INT_VECTOR globalCount(ngroup); - + // loop over atoms localCount = 0; for (int i = 0; i < atcToLammps_.size(); ++i) { @@ -216,13 +216,13 @@ namespace ATC { localCount(j)++; } } - + // communication to get total atom counts per group lammpsInterface_->int_allsum(localCount.ptr(), globalCount.ptr(),ngroup); - + for (int i = 0; i < ngroup; ++i) { - int iGroupBit = lammpsInterface_->group_bit(i); + int iGroupBit = lammpsInterface_->group_bit(i); if (globalCount(i) > 0) atomGroupVolume_[iGroupBit] /= globalCount(i); else @@ -257,13 +257,13 @@ namespace ATC { quantity_ = lammpsInterface_->volume_per_atom(); } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class AtomVolumeElement //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -303,19 +303,19 @@ namespace ATC { _elementAtomCount_.resize(nElts); const INT_ARRAY & atomElement(atomElement_->quantity()); _elementAtomVolume_.resize(nElts); - + // determine number of atoms in each element, partial sum for (int i = 0; i < nLocal; ++i) { _elementAtomCountLocal_(atomElement(i,0)) += 1; } - + // mpi to determine total atoms lammpsInterface_->int_allsum(_elementAtomCountLocal_.ptr(),_elementAtomCount_.ptr(),nElts); - + // divide element volume by total atoms to get atomic volume if (nLocal>0) { for (int i = 0; i < nElts; ++i) { - + double minx, maxx, miny, maxy, minz, maxz; feMesh_->element_coordinates(i,_nodalCoordinates_); minx = _nodalCoordinates_(0,0); maxx = _nodalCoordinates_(0,0); @@ -333,7 +333,7 @@ namespace ATC { if (eltVol<0) eltVol *= -1.; _elementAtomVolume_(i) = eltVol/_elementAtomCount_(i); } - + for (int i = 0; i < nLocal; ++i) quantity_(i,i) = _elementAtomVolume_(atomElement(i,0)); } @@ -364,16 +364,16 @@ namespace ATC { // compute volumes and atom counts in each region int nregion = lammpsInterface_->nregion(); regionalAtomVolume_.resize(nregion); - + for (int i = 0; i < nregion; ++i) { - regionalAtomVolume_(i) = + regionalAtomVolume_(i) = (lammpsInterface_->region_xhi(i)-lammpsInterface_->region_xlo(i)) *(lammpsInterface_->region_yhi(i)-lammpsInterface_->region_ylo(i)) *(lammpsInterface_->region_zhi(i)-lammpsInterface_->region_zlo(i)); } - + INT_VECTOR localCount(nregion); - INT_VECTOR globalCount(nregion); + INT_VECTOR globalCount(nregion); // loop over atoms localCount = 0; const DENS_MAT atomicCoordinates(atomCoarseGrainingPositions->quantity()); @@ -390,7 +390,7 @@ namespace ATC { // communication to get total atom counts per group lammpsInterface_->int_allsum(localCount.ptr(), globalCount.ptr(),nregion); - + for (int i = 0; i < nregion; ++i) { if (globalCount(i) > 0) regionalAtomVolume_(i) /= globalCount(i); @@ -414,7 +414,7 @@ namespace ATC { { if (need_reset()) { PerAtomDiagonalMatrix::reset(); - const DENS_MAT & atomicCoordinates(atomCoarseGrainingPositions_->quantity()); + const DENS_MAT & atomicCoordinates(atomCoarseGrainingPositions_->quantity()); for (int i = 0; i < quantity_.nRows(); i++) { for (int iregion = 0; iregion < lammpsInterface_->nregion(); iregion++) { if (lammpsInterface_->region_match(iregion, @@ -457,7 +457,7 @@ namespace ATC { ifstream in; const int lineSize = 256; char line[lineSize]; - const char* fname = &atomVolumeFile_[0]; + const char* fname = &atomVolumeFile_[0]; // create tag to local id map for this processor map tag2id; @@ -477,13 +477,13 @@ namespace ATC { if (! in.good()) throw ATC_Error(msg); in.getline(line,lineSize); // header in.getline(line,lineSize); // blank line - in.getline(line,lineSize); // number of atoms + in.getline(line,lineSize); // number of atoms stringstream inss (line,stringstream::in | stringstream::out); inss >> natoms; // number of atoms - stringstream ss; + stringstream ss; ss << " found " << natoms << " atoms in atomic weights file"; lammpsInterface_->print_msg(ss.str()); - if (natoms != lammpsInterface_->natoms()) { + if (natoms != lammpsInterface_->natoms()) { throw ATC_Error("Incorrect number of atomic weights read-in!"); } in.getline(line,lineSize); // blank line @@ -496,7 +496,7 @@ namespace ATC { if (ATC::LammpsInterface::instance()->rank_zero()) { in.getline(line,lineSize); stringstream ss (line,stringstream::in | stringstream::out); - ss >> tag >> atomic_weight; + ss >> tag >> atomic_weight; nread++; } lammpsInterface_->int_broadcast(&nread); @@ -511,11 +511,11 @@ namespace ATC { } if (lammpsInterface_->rank_zero()) { in.close(); - stringstream ss; + stringstream ss; ss << " read " << nread << " atomic weights"; lammpsInterface_->print_msg(ss.str()); } - if (count != nlocal) + if (count != nlocal) throw ATC_Error("reset "+to_string(count)+" atoms vs "+to_string(nlocal)); } } @@ -532,7 +532,7 @@ namespace ATC { //-------------------------------------------------------- AtomNumber::AtomNumber(ATC_Method * atc, AtomType atomType) : ProtectedAtomQuantity(atc,1,atomType), - atc_(atc) + atc_(atc) { } @@ -552,32 +552,32 @@ namespace ATC { //-------------------------------------------------------- // constructor //-------------------------------------------------------- - AtomTypeVector::AtomTypeVector(ATC_Method * atc, + AtomTypeVector::AtomTypeVector(ATC_Method * atc, vector typeList, AtomType atomType) : ProtectedAtomQuantity(atc, typeList.size(), atomType), atc_(atc), ntypes_(ATC::LammpsInterface::instance()->ntypes()), - typeList_(typeList) + typeList_(typeList) { if (typeList_.size() == 0) throw ATC_Error("type list is empty"); - index_.resize(ntypes_,-1); + index_.resize(ntypes_,-1); for (unsigned int i = 0; i < typeList_.size(); i++) { index_[typeList_[i]] = i; } } - AtomTypeVector::AtomTypeVector(ATC_Method * atc, + AtomTypeVector::AtomTypeVector(ATC_Method * atc, vector typeList, vector groupList, AtomType atomType) : ProtectedAtomQuantity(atc, typeList.size()+groupList.size(), atomType), atc_(atc), ntypes_(ATC::LammpsInterface::instance()->ntypes()), typeList_(typeList), - groupList_(groupList) + groupList_(groupList) { if ((typeList_.size() == 0) && (groupList_.size() == 0)) throw ATC_Error("type/group lists are empty"); // reverse map - index_.resize(ntypes_,-1); + index_.resize(ntypes_,-1); for (unsigned int i = 0; i < typeList_.size(); i++) { index_[typeList_[i]-1] = i; } @@ -590,16 +590,16 @@ namespace ATC { int nlocal = atc_->nlocal(); quantity_.reset(nlocal,typeList_.size()+groupList_.size()); const Array & quantityToLammps = (PerAtomQuantity::atc_).atc_to_lammps_map(); - if (typeList_.size()) { - int * type = ATC::LammpsInterface::instance()->atom_type(); + if (typeList_.size()) { + int * type = ATC::LammpsInterface::instance()->atom_type(); for (int i = 0; i < nlocal; i++) { - int a = quantityToLammps(i); + int a = quantityToLammps(i); int index = index_[type[a]-1]; if (index > -1) quantity_(i,index) = 1; } } int index = typeList_.size(); - if (groupList_.size()) { + if (groupList_.size()) { const int * mask = ATC::LammpsInterface::instance()->atom_mask(); for (unsigned int j = 0; j < groupList_.size(); j++) { int group = groupList_[j]; @@ -618,7 +618,7 @@ namespace ATC { // Class XrefWrapper //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // constructor //-------------------------------------------------------- @@ -686,7 +686,7 @@ namespace ATC { //-------------------------------------------------------- void AtomicMassWeightedDisplacement::reset() const { - if (need_reset()) { + if (need_reset()) { PerAtomQuantity::reset(); const DENS_MAT & position(atomPositions_->quantity()); const DENS_MAT & mass(atomMasses_->quantity()); @@ -749,7 +749,7 @@ namespace ATC { // q = m * v quantity_ = velocity; - quantity_ *= mass; + quantity_ *= mass; } } @@ -800,7 +800,7 @@ namespace ATC { PerAtomQuantity::reset(); const DENS_MAT & mass(atomMasses_->quantity()); const DENS_MAT & velocity(atomVelocities_->quantity()); - + // q = m * (v dot v) for (int i = 0; i < quantity_.nRows(); i++) { quantity_(i,0) = velocity(i,0)*velocity(i,0); @@ -860,7 +860,7 @@ namespace ATC { PerAtomQuantity::reset(); const DENS_MAT & velocity(atomVelocities_->quantity()); const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity()); - + // q = m * (v dot v) for (int i = 0; i < quantity_.nRows(); i++) { for (int j = 0; j < velocity.nCols(); j++) { @@ -969,7 +969,7 @@ namespace ATC { PerAtomQuantity::reset(); const DENS_MAT & velocity(fluctuatingVelocities_->quantity()); const DENS_MAT & tv(atomTypeVector_->quantity()); - + for (int i = 0; i < quantity_.nRows(); i++) { int m = 0; for (int j = 0; j < velocity.nCols(); j++) { @@ -1038,7 +1038,7 @@ namespace ATC { const DENS_MAT & mass(atomMasses_->quantity()); const DENS_MAT & velocity(atomVelocities_->quantity()); const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity()); - + // q = m * (v dot v) double vRel; for (int i = 0; i < quantity_.nRows(); i++) { @@ -1102,7 +1102,7 @@ namespace ATC { PerAtomQuantity::reset(); const DENS_MAT & mass(atomMasses_->quantity()); const DENS_MAT & velocity(atomVelocities_->quantity()); - + // K = m * (v \otimes v) for (int i = 0; i < quantity_.nRows(); i++) { double m = mass(i,0); @@ -1173,7 +1173,7 @@ namespace ATC { const DENS_MAT & mass(atomMasses_->quantity()); const DENS_MAT & velocity(atomVelocities_->quantity()); const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity()); - + // K = m * (v \otimes v) for (int i = 0; i < quantity_.nRows(); i++) { double m = mass(i,0); @@ -1324,7 +1324,7 @@ namespace ATC { if (!referencePotential_) { referencePotential_ = interscaleManager.per_atom_quantity("AtomicReferencePotential"); } - + potentialEnergy_->register_dependence(this); referencePotential_->register_dependence(this); } @@ -1539,7 +1539,7 @@ namespace ATC { type_(type) { // DO NOTHING - + } //-------------------------------------------------------- @@ -1580,7 +1580,7 @@ namespace ATC { group_(group) { // DO NOTHING - + } //-------------------------------------------------------- @@ -1641,7 +1641,7 @@ namespace ATC { //-------------------------------------------------------- void AtomToNodeset::reset() const { - + //so it has been commented out. /* if (need_reset()) { @@ -1761,7 +1761,7 @@ namespace ATC { const DENS_MAT & source(source_->quantity()); const INT_ARRAY & map(map_->quantity()); quantity_.resize(map_->size(),source.nCols()); - + for (int i = 0; i < source.nRows(); i++) { int idx = map(i,0); if (idx > -1) { @@ -1901,7 +1901,7 @@ namespace ATC { // computes the classical atomic heat capacity //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // constructor //-------------------------------------------------------- @@ -2114,7 +2114,7 @@ namespace ATC { atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY, atomType); } - + atomLambdas_->register_dependence(this); atomVelocities_->register_dependence(this); } @@ -2137,7 +2137,7 @@ namespace ATC { PerAtomQuantity::reset(); const DENS_MAT & v(atomVelocities_->quantity()); const DENS_MAT & lambda(atomLambdas_->quantity()); - + // force = -lambda*v quantity_ = v; quantity_ *= lambda; @@ -2170,7 +2170,7 @@ namespace ATC { atomMass_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS, atomType); } - + atomLambda_->register_dependence(this); atomMass_->register_dependence(this); } @@ -2194,7 +2194,7 @@ namespace ATC { const DENS_MAT & m(atomMass_->quantity()); const DENS_MAT & lambda(atomLambda_->quantity()); double timeFactor = time_step_factor(0.5*atc_.dt()); - + //force = -lambda*m*(timestep factor) quantity_ = lambda; quantity_ *= m; @@ -2221,7 +2221,7 @@ namespace ATC { if (!atomLambda_) { atomLambda_ = interscaleManager.per_atom_quantity("AtomLambdaMomentum"); } - + atomLambda_->register_dependence(this); } @@ -2241,7 +2241,7 @@ namespace ATC { if (need_reset()) { PerAtomQuantity::reset(); const DENS_MAT & lambda(atomLambda_->quantity()); - + // force = -lambda quantity_ = lambda; quantity_ *= -1.; @@ -2372,7 +2372,7 @@ namespace ATC { if (!nodeToOverlapMap_) { nodeToOverlapMap_ = (atc->interscale_manager()).dense_matrix_int("NodeToOverlapMap"); } - + shapeFunction_->register_dependence(this); nodeToOverlapMap_->register_dependence(this); } @@ -2388,7 +2388,7 @@ namespace ATC { const SPAR_MAT & shapeFunction(shapeFunction_->quantity()); quantity_.reset(shapeFunction.nRows(),nNodeOverlap); // number of atoms X number of nodes overlapping MD region const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity()); - + for (int i = 0; i < shapeFunction.size(); ++i) { TRIPLET myTriplet = shapeFunction.triplet(i); int myCol = nodeToOverlapMap(myTriplet.j,0); @@ -2418,7 +2418,7 @@ namespace ATC { if (!lambdaAtomMap_) { lambdaAtomMap_ = (atc->interscale_manager()).dense_matrix_int("LambdaAtomMap"); } - + lambdaAtomMap_->register_dependence(this); } @@ -2436,7 +2436,7 @@ namespace ATC { const SPAR_MAT & shapeFunction(shapeFunction_->quantity()); const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity()); const INT_ARRAY lambdaAtomMap(lambdaAtomMap_->quantity()); - + for (int i = 0; i < shapeFunction.size(); ++i) { TRIPLET myTriplet = shapeFunction.triplet(i); int myRow = lambdaAtomMap(myTriplet.i,0); @@ -2488,7 +2488,7 @@ namespace ATC { } } quantity_.compress(); - + //int nNodes = nodeToOverlapMap_->nRows(); _activeNodes_.reset(nNodes); for (int i = 0; i < nNodes; ++i) { diff --git a/lib/atc/PerAtomQuantityLibrary.h b/lib/atc/PerAtomQuantityLibrary.h index 3e3cb78e95..2229645531 100644 --- a/lib/atc/PerAtomQuantityLibrary.h +++ b/lib/atc/PerAtomQuantityLibrary.h @@ -33,7 +33,7 @@ namespace ATC { // destructor virtual ~AtomNumber() {}; - + /** reset the quantity */ virtual void reset() const; @@ -65,7 +65,7 @@ namespace ATC { // destructor virtual ~AtomTypeVector() {}; - + /** reset the quantity */ virtual void reset() const; @@ -73,14 +73,14 @@ namespace ATC { ATC_Method * atc_; int ntypes_; std::vector typeList_,index_; // lammps->atc & atc->lammps - std::vector groupList_; + std::vector groupList_; private: AtomTypeVector(); // do not define }; - + // inherited classes are used for this task because // lammps changes pointer location so it can only be // accessed by functions @@ -88,32 +88,32 @@ namespace ATC { * @class XrefWrapper * @brief Class for wrapping the xref_ array */ - + class XrefWrapper : public ProtectedClonedAtomQuantity { - + public: - + // constructor XrefWrapper(ATC_Method * atc, AtomType atomType=INTERNAL); - + // destructor virtual ~XrefWrapper() {}; - + protected: - + /** pointer to atc to access raw pointer */ ATC_Method * atc_; /** gets appropriate pointer for lammps data */ double ** lammps_vector() const; - + private: // do not define XrefWrapper(); - + }; - + /** * @class AtomToElementMap * @brief Class for identifying the element associated with an atom @@ -158,13 +158,13 @@ namespace ATC { // constructor AtomInElementSet(ATC_Method * atc, PerAtomQuantity * map, - ESET eset, int type); + ESET eset, int type); // destructor virtual ~AtomInElementSet(); // accessors - virtual const ID_LIST & quantity(); + virtual const ID_LIST & quantity(); virtual ID_LIST & set_quantity() {return list_;} int size() {if (needReset_) reset(); return list_.size(); } ID_PAIR item(int i) {if (needReset_) reset(); return list_[i]; } @@ -251,7 +251,7 @@ namespace ATC { /** pointer to lammps interface */ const LammpsInterface * lammpsInterface_; - + /** reference to array mapping atc indices to lammps indices */ const Array & atcToLammps_; @@ -415,7 +415,7 @@ namespace ATC { * @class AtomicMassWeightedDisplacement * @brief Class for computing the precursor atomic quantity m*(x - x_ref) */ - + class AtomicMassWeightedDisplacement : public ProtectedAtomQuantity { public: @@ -437,7 +437,7 @@ namespace ATC { /** atomic positions */ PerAtomQuantity * atomPositions_; - + /** atomic masses */ PerAtomQuantity * atomMasses_; @@ -445,17 +445,17 @@ namespace ATC { PerAtomQuantity * atomReferencePositions_; private: - + // do not define AtomicMassWeightedDisplacement(); }; /** - * @class FluctuatingVelocity + * @class FluctuatingVelocity * @brief Class for computing the atomic quantity v - bar{v} */ - + class FluctuatingVelocity : public ProtectedAtomQuantity { public: @@ -480,7 +480,7 @@ namespace ATC { /** atomic mean velocities */ PerAtomQuantity * atomMeanVelocities_; private: - + // do not define FluctuatingVelocity(); @@ -490,7 +490,7 @@ namespace ATC { * @class ChargeVelcity * @brief Class for computing the atomic quantity q v' */ - + class ChargeVelocity : public ProtectedAtomQuantity { public: @@ -515,7 +515,7 @@ namespace ATC { /** atomic mean velocities */ FundamentalAtomQuantity * atomCharge_; private: - + // do not define ChargeVelocity(); @@ -525,7 +525,7 @@ namespace ATC { * @class SpeciesVelcity * @brief Class for computing the atomic quantity m^(a) v' */ - + class SpeciesVelocity : public ProtectedAtomQuantity { public: @@ -550,7 +550,7 @@ namespace ATC { /** atomic mean velocities */ PerAtomQuantity * atomTypeVector_; private: - + // do not define SpeciesVelocity(); @@ -560,7 +560,7 @@ namespace ATC { * @class AtomicMomentum * @brief Class for computing the precursor atomic quantity m*v */ - + class AtomicMomentum : public ProtectedAtomQuantity { public: @@ -586,17 +586,17 @@ namespace ATC { PerAtomQuantity * atomMasses_; private: - + // do not define AtomicMomentum(); }; /** - * @class AtomicEnergyForTemperature - * @brief Base class for accessing quantities needed for computing temperature + * @class AtomicEnergyForTemperature + * @brief Base class for accessing quantities needed for computing temperature */ - + class AtomicEnergyForTemperature : public ProtectedAtomQuantity { public: @@ -613,18 +613,18 @@ namespace ATC { virtual double kinetic_energy_multiplier() const = 0; private: - + // do not define AtomicEnergyForTemperature(); }; /** - * @class TwiceKineticEnergy - * @brief Class for computing the precursor atomic quantity m*v*v + * @class TwiceKineticEnergy + * @brief Class for computing the precursor atomic quantity m*v*v * (used when the kinetic definition of temperature is required) */ - + class TwiceKineticEnergy : public AtomicEnergyForTemperature { public: @@ -653,17 +653,17 @@ namespace ATC { PerAtomQuantity * atomMasses_; private: - + // do not define TwiceKineticEnergy(); }; /** - * @class KineticTensor - * @brief Class for computing the atomic quantity m v (x) v + * @class KineticTensor + * @brief Class for computing the atomic quantity m v (x) v */ - + class KineticTensor : public ProtectedAtomQuantity { public: @@ -689,7 +689,7 @@ namespace ATC { PerAtomQuantity * atomMasses_; private: - + // do not define KineticTensor(); @@ -697,10 +697,10 @@ namespace ATC { /** - * @class FluctuatingKineticTensor - * @brief Class for computing the atomic quantity m v (x) v + * @class FluctuatingKineticTensor + * @brief Class for computing the atomic quantity m v (x) v */ - + class FluctuatingKineticTensor : public ProtectedAtomQuantity { public: @@ -729,18 +729,18 @@ namespace ATC { /** atomic mean velocities */ PerAtomQuantity * atomMeanVelocities_; private: - + // do not define FluctuatingKineticTensor(); }; /** - * @class TwiceFluctuatingKineticEnergy - * @brief Class for computing the precursor atomic quantity m*(v-vr)*(v-vr) + * @class TwiceFluctuatingKineticEnergy + * @brief Class for computing the precursor atomic quantity m*(v-vr)*(v-vr) * (used when the kinetic definition of temperature is required) */ - + class TwiceFluctuatingKineticEnergy : public AtomicEnergyForTemperature { public: @@ -773,7 +773,7 @@ namespace ATC { PerAtomQuantity * atomMeanVelocities_; private: - + // do not define TwiceFluctuatingKineticEnergy(); @@ -781,10 +781,10 @@ namespace ATC { /** * @class MixedKePeEnergy - * @brief Class for computing the precursor atomic quantity for + * @brief Class for computing the precursor atomic quantity for * a mixed temperature definition involving both KE and PE */ - + class MixedKePeEnergy : public AtomicEnergyForTemperature { public: @@ -821,7 +821,7 @@ namespace ATC { PerAtomQuantity * potentialEnergy_; private: - + // do not define MixedKePeEnergy(); @@ -831,7 +831,7 @@ namespace ATC { * @class TotalEnergy * @brief Class for the atomic total energy */ - + class TotalEnergy : public ProtectedAtomQuantity { public: @@ -861,10 +861,10 @@ namespace ATC { /** * @class FluctuatingPotentialEnergy - * @brief Class for computing the precursor atomic quantity for + * @brief Class for computing the precursor atomic quantity for * a configurational (PE-based) temperature */ - + class FluctuatingPotentialEnergy : public AtomicEnergyForTemperature { public: @@ -893,18 +893,18 @@ namespace ATC { PerAtomQuantity * referencePotential_; private: - + // do not define FluctuatingPotentialEnergy(); }; /** - * @class DotTwiceKineticEnergy - * @brief Class for computing the precursor atomic power 2*v*f + * @class DotTwiceKineticEnergy + * @brief Class for computing the precursor atomic power 2*v*f * (used when the kinetic definition of temperature is required) */ - + class DotTwiceKineticEnergy : public ProtectedAtomQuantity { public: @@ -930,7 +930,7 @@ namespace ATC { PerAtomQuantity * atomVelocities_; private: - + // do not define DotTwiceKineticEnergy(); @@ -941,7 +941,7 @@ namespace ATC { * @brief Class for computing the quantity |v|^2 * (used for weights in the thermostat) */ - + class VelocitySquared : public ProtectedAtomQuantity { public: @@ -974,7 +974,7 @@ namespace ATC { * @brief Class for computing the 2nd order RHS fractional step * contribution to the equation for lambda, with appropriate weights */ - + class LambdaSquared : public ProtectedAtomQuantity { public: @@ -1020,12 +1020,12 @@ namespace ATC { class LargeToSmallAtomMap : public ProtectedAtomQuantity { public: - + // constructor LargeToSmallAtomMap(ATC_Method * atc, AtomType atomType = INTERNAL) : ProtectedAtomQuantity(atc,1,atomType), size_(0) {}; - + // destructor virtual ~LargeToSmallAtomMap() {}; @@ -1051,7 +1051,7 @@ namespace ATC { virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;}; /** packs up data for parallel transfer to ghost atoms on other processors */ - virtual int pack_comm(int /* index */, double * /* buf */, + virtual int pack_comm(int /* index */, double * /* buf */, int /* pbc_flag */, int * /* pbc */) {return 0;}; /** unpacks data after parallel transfer to ghost atoms on other processors */ @@ -1081,12 +1081,12 @@ namespace ATC { class AtomToType : public LargeToSmallAtomMap { public: - + // constructor AtomToType(ATC_Method * atc, int type, AtomType atomType = INTERNAL); - + // destructor virtual ~AtomToType() {}; @@ -1113,12 +1113,12 @@ namespace ATC { class AtomToGroup : public LargeToSmallAtomMap { public: - + // constructor AtomToGroup(ATC_Method * atc, int group, AtomType atomType = INTERNAL); - + // destructor virtual ~AtomToGroup() {}; @@ -1145,13 +1145,13 @@ namespace ATC { class AtomToNodeset : public LargeToSmallAtomMap { public: - + // constructor AtomToNodeset(ATC_Method * atc, SetDependencyManager * subsetNodes, PerAtomQuantity * atomElement = nullptr, AtomType atomType = INTERNAL); - + // destructor virtual ~AtomToNodeset() { atomElement_->remove_dependence(this); @@ -1190,13 +1190,13 @@ namespace ATC { class AtomToElementset : public LargeToSmallAtomMap { public: - + // constructor AtomToElementset(ATC_Method * atc, MatrixDependencyManager * elementMask, PerAtomQuantity * atomElement = nullptr, AtomType atomType = INTERNAL); - + // destructor virtual ~AtomToElementset(); @@ -1225,17 +1225,17 @@ namespace ATC { * @class MappedAtomQuantity * @brief generic reduced mapping */ - + class MappedAtomQuantity : public ProtectedMappedAtomQuantity { public: - + // constructor MappedAtomQuantity(ATC_Method * atc, PerAtomQuantity * source, LargeToSmallAtomMap * map, AtomType atomType = INTERNAL); - + // destructor virtual ~MappedAtomQuantity() { source_->remove_dependence(this); @@ -1265,7 +1265,7 @@ namespace ATC { * @brief Class for computing the quantity |v|^2 on a subset of atoms * (used for weights in the thermostat) */ - + class VelocitySquaredMapped : public ProtectedMappedAtomQuantity { public: @@ -1299,7 +1299,7 @@ namespace ATC { * @brief Class for computing the 2nd order RHS fractional step * contribution to the equation for lambda, with appropriate weights */ - + class LambdaSquaredMapped : public ProtectedMappedAtomQuantity { public: @@ -1337,10 +1337,10 @@ namespace ATC { }; /** - * @class HeatCapacity - * @brief Class for the classical atomic heat capacity + * @class HeatCapacity + * @brief Class for the classical atomic heat capacity */ - + class HeatCapacity : public ConstantQuantity { public: @@ -1354,17 +1354,17 @@ namespace ATC { protected: private: - + // do not define HeatCapacity(); }; /** - * @class AtomicVelocityRescaleFactor - * @brief Class for computing the atomic rescaling induced by the rescaling thermostat + * @class AtomicVelocityRescaleFactor + * @brief Class for computing the atomic rescaling induced by the rescaling thermostat */ - + class AtomicVelocityRescaleFactor : public ProtectedAtomQuantity { public: @@ -1386,17 +1386,17 @@ namespace ATC { PerAtomQuantity * atomLambdas_; private: - + // do not define AtomicVelocityRescaleFactor(); }; /** - * @class AtomicFluctuatingVelocityRescaled - * @brief Class for computing the atomic rescaling of the velocity fluctuations by the rescaling thermostat + * @class AtomicFluctuatingVelocityRescaled + * @brief Class for computing the atomic rescaling of the velocity fluctuations by the rescaling thermostat */ - + class AtomicFluctuatingVelocityRescaled : public ProtectedAtomQuantity { public: @@ -1422,17 +1422,17 @@ namespace ATC { PerAtomQuantity * atomFluctuatingVelocity_; private: - + // do not define AtomicFluctuatingVelocityRescaled(); }; /** - * @class AtomicCombinedRescaleThermostatError - * @brief Class for computing the atomic error in the rescaling thermostat when used in combination with a specified streaming velocity + * @class AtomicCombinedRescaleThermostatError + * @brief Class for computing the atomic error in the rescaling thermostat when used in combination with a specified streaming velocity */ - + class AtomicCombinedRescaleThermostatError : public ProtectedAtomQuantity { public: @@ -1466,17 +1466,17 @@ namespace ATC { PerAtomQuantity * atomMass_; private: - + // do not define AtomicCombinedRescaleThermostatError(); }; /** - * @class AtomicThermostatForce - * @brief Class for computing the atomic force induced by the GLC-based thermostats + * @class AtomicThermostatForce + * @brief Class for computing the atomic force induced by the GLC-based thermostats */ - + class AtomicThermostatForce : public ProtectedAtomQuantity { public: @@ -1502,17 +1502,17 @@ namespace ATC { PerAtomQuantity * atomVelocities_; private: - + // do not define AtomicThermostatForce(); }; /** - * @class AtomicKinetostatForceDisplacement - * @brief Class for computing the atomic force induced by the GLC-based kinetostats + * @class AtomicKinetostatForceDisplacement + * @brief Class for computing the atomic force induced by the GLC-based kinetostats */ - + class AtomicKinetostatForceDisplacement : public ProtectedAtomQuantity { public: @@ -1541,7 +1541,7 @@ namespace ATC { PerAtomQuantity * atomMass_; private: - + // do not define AtomicKinetostatForceDisplacement(); @@ -1549,9 +1549,9 @@ namespace ATC { /** * @class AtomicKinetostatForceVelocity - * @brief Class for computing the atomic force induced by the GLC-based kinetostats + * @brief Class for computing the atomic force induced by the GLC-based kinetostats */ - + class AtomicKinetostatForceVelocity : public AtomicKinetostatForceDisplacement { public: @@ -1580,9 +1580,9 @@ namespace ATC { /** * @class AtomicKinetostatForceStress - * @brief Class for computing the atomic force induced by the stress-based kinetostats + * @brief Class for computing the atomic force induced by the stress-based kinetostats */ - + class AtomicKinetostatForceStress : public ProtectedAtomQuantity { public: @@ -1604,7 +1604,7 @@ namespace ATC { PerAtomQuantity * atomLambda_; private: - + // do not define AtomicKinetostatForceStress(); @@ -1614,7 +1614,7 @@ namespace ATC { * @class PerAtomKernelFunction * @brief Class for computing the kernel function at each atom location */ - + class PerAtomKernelFunction : public ProtectedAtomSparseMatrix { public: @@ -1639,7 +1639,7 @@ namespace ATC { const FE_Engine * feEngine_; private: - + // do not define PerAtomKernelFunction(); @@ -1649,7 +1649,7 @@ namespace ATC { * @class PerAtomShapeFunction * @brief Class for computing the shape function at each atom location */ - + class PerAtomShapeFunction : public ProtectedAtomSparseMatrix { public: @@ -1678,7 +1678,7 @@ namespace ATC { const FE_Engine * feEngine_; private: - + // do not define PerAtomShapeFunction(); @@ -1688,7 +1688,7 @@ namespace ATC { * @class LambdaCouplingMatrix * @brief constructs the coupling matrix needed to solve for lambda, i.e. N in N^T w N L = b */ - + class LambdaCouplingMatrix : public ProtectedMappedAtomSparseMatrix { public: @@ -1697,7 +1697,7 @@ namespace ATC { LambdaCouplingMatrix(ATC_Method * atc, MatrixDependencyManager * nodeToOverlapMap = nullptr, SPAR_MAN * shapeFunction = nullptr); - + // destructor virtual ~LambdaCouplingMatrix() { shapeFunction_->remove_dependence(this); @@ -1727,7 +1727,7 @@ namespace ATC { * @brief constructs the coupling matrix needed to solve for lambda, i.e. N in N^T w N L = b * when localization is being used for the constraint */ - + class LocalLambdaCouplingMatrix : public LambdaCouplingMatrix { public: @@ -1737,7 +1737,7 @@ namespace ATC { MatrixDependencyManager * lambdaAtomMap = nullptr, MatrixDependencyManager * nodeToOverlapMap = nullptr, SPAR_MAN * shapeFunction = nullptr); - + // destructor virtual ~LocalLambdaCouplingMatrix() { lambdaAtomMap_->remove_dependence(this); @@ -1762,7 +1762,7 @@ namespace ATC { * @class GhostCouplingMatrix * @brief constructs the modified shape functions used to compute the total forces between ghost and internal atoms */ - + class GhostCouplingMatrix : public LambdaCouplingMatrix { public: @@ -1772,7 +1772,7 @@ namespace ATC { SPAR_MAN * shapeFunction, SetDependencyManager * subsetNodes, MatrixDependencyManager * nodeToOverlapMap = nullptr); - + // destructor virtual ~GhostCouplingMatrix() { subsetNodes_->remove_dependence(this); diff --git a/lib/atc/PerPairQuantity.cpp b/lib/atc/PerPairQuantity.cpp index 01308e4b39..164c387643 100644 --- a/lib/atc/PerPairQuantity.cpp +++ b/lib/atc/PerPairQuantity.cpp @@ -27,7 +27,7 @@ PairMapNeighbor::PairMapNeighbor(LammpsInterface * lammpsInterface, int groupbit { }; -void PairMapNeighbor::reset(void) const +void PairMapNeighbor::reset(void) const { int inum = lammpsInterface_->neighbor_list_inum(); int *ilist = lammpsInterface_->neighbor_list_ilist(); @@ -35,16 +35,16 @@ void PairMapNeighbor::reset(void) const int **firstneigh = lammpsInterface_->neighbor_list_firstneigh(); const int * mask = lammpsInterface_->atom_mask(); - pairMap_.clear(); + pairMap_.clear(); int pairIndex = nBonds_; std::pair< int,int > pair_ij; - for (int i = 0; i < inum; i++) { + for (int i = 0; i < inum; i++) { int lammps_i = ilist[i]; if (mask[lammps_i] & groupbit_) { for (int j = 0; j < numneigh[lammps_i]; j++) { int lammps_j = firstneigh[lammps_i][j]; lammpsInterface_->neighbor_remap(lammps_j); - pair_ij.first = lammps_i; // alpha + pair_ij.first = lammps_i; // alpha pair_ij.second = lammps_j; // beta pairMap_[pair_ij] = pairIndex; pairIndex++; @@ -67,7 +67,7 @@ PairMapBoth::PairMapBoth(LammpsInterface * lammpsInterface, int groupbit): { }; //========================================================== -DensePerPairMatrix::DensePerPairMatrix(LammpsInterface * lammpsInterface, +DensePerPairMatrix::DensePerPairMatrix(LammpsInterface * lammpsInterface, const PairMap & pairMap, int nCols): lammpsInterface_(lammpsInterface), @@ -77,20 +77,20 @@ DensePerPairMatrix::DensePerPairMatrix(LammpsInterface * lammpsInterface, }; //========================================================== -PairVirial::PairVirial(LammpsInterface * lammpsInterface, +PairVirial::PairVirial(LammpsInterface * lammpsInterface, const PairMap & pairMap, int nCols): DensePerPairMatrix(lammpsInterface,pairMap,nCols) { }; //========================================================== -PairVirialEulerian::PairVirialEulerian(LammpsInterface * lammpsInterface, +PairVirialEulerian::PairVirialEulerian(LammpsInterface * lammpsInterface, const PairMap & pairMap): PairVirial(lammpsInterface,pairMap,6) { }; -void PairVirialEulerian::reset(void) const +void PairVirialEulerian::reset(void) const { int nPairs = pairMap_.size(); quantity_.reset(nPairs,nCols_); @@ -108,7 +108,7 @@ void PairVirialEulerian::reset(void) const double delz = xa[2] - xb[2]; double rsq = delx*delx + dely*dely + delz*delz; double fforce = 0; - lammpsInterface_->pair_force(apair,rsq,fforce); + lammpsInterface_->pair_force(apair,rsq,fforce); quantity_(pairIndex,0)=-delx*delx*fforce; quantity_(pairIndex,1)=-dely*dely*fforce; quantity_(pairIndex,2)=-delz*delz*fforce; @@ -118,25 +118,25 @@ void PairVirialEulerian::reset(void) const } } //========================================================== -PairVirialLagrangian::PairVirialLagrangian(LammpsInterface * lammpsInterface, - const PairMap & pairMap, +PairVirialLagrangian::PairVirialLagrangian(LammpsInterface * lammpsInterface, + const PairMap & pairMap, double ** xRef): // const PerAtomQuantity * xRef): PairVirial(lammpsInterface,pairMap,9), xRef_(xRef) { - + }; -void PairVirialLagrangian::reset(void) const +void PairVirialLagrangian::reset(void) const { int nPairs = pairMap_.size(); quantity_.reset(nPairs,nCols_); - double **xatom = lammpsInterface_->xatom(); + double **xatom = lammpsInterface_->xatom(); - double ** xref = xRef_; + double ** xref = xRef_; for (ATOM_PAIR apair = pairMap_.start(); ! pairMap_.finished(); apair=pairMap_++){ @@ -150,12 +150,12 @@ void PairVirialLagrangian::reset(void) const double delz = xa[2] - xb[2]; double * Xa = xref[lammps_a]; double * Xb = xref[lammps_b]; - double delX = Xa[0] - Xb[0]; - double delY = Xa[1] - Xb[1]; - double delZ = Xa[2] - Xb[2]; + double delX = Xa[0] - Xb[0]; + double delY = Xa[1] - Xb[1]; + double delZ = Xa[2] - Xb[2]; double rsq = delx*delx + dely*dely + delz*delz; double fforce = 0; - lammpsInterface_->pair_force(apair,rsq,fforce); + lammpsInterface_->pair_force(apair,rsq,fforce); quantity_(pairIndex,0)=-delx*fforce*delX; quantity_(pairIndex,1)=-delx*fforce*delY; quantity_(pairIndex,2)=-delx*fforce*delZ; @@ -168,26 +168,26 @@ void PairVirialLagrangian::reset(void) const } } //========================================================== -PairPotentialHeatFlux::PairPotentialHeatFlux(LammpsInterface * lammpsInterface, +PairPotentialHeatFlux::PairPotentialHeatFlux(LammpsInterface * lammpsInterface, const PairMap & pairMap): DensePerPairMatrix(lammpsInterface,pairMap,3) { }; //========================================================== -PairPotentialHeatFluxEulerian::PairPotentialHeatFluxEulerian(LammpsInterface * lammpsInterface, - const PairMap & pairMap): +PairPotentialHeatFluxEulerian::PairPotentialHeatFluxEulerian(LammpsInterface * lammpsInterface, + const PairMap & pairMap): PairPotentialHeatFlux(lammpsInterface,pairMap) { - + }; -void PairPotentialHeatFluxEulerian::reset(void) const +void PairPotentialHeatFluxEulerian::reset(void) const { int nPairs = pairMap_.size(); quantity_.reset(nPairs,nCols_); - double **xatom = lammpsInterface_->xatom(); - double **vatom = lammpsInterface_->vatom(); + double **xatom = lammpsInterface_->xatom(); + double **vatom = lammpsInterface_->vatom(); for (ATOM_PAIR apair = pairMap_.start(); ! pairMap_.finished(); apair=pairMap_++){ int lammps_a = (apair.first).first ; @@ -200,7 +200,7 @@ void PairPotentialHeatFluxEulerian::reset(void) const double delz = xa[2] - xb[2]; double rsq = delx*delx + dely*dely + delz*delz; double fforce = 0; - lammpsInterface_->pair_force(apair,rsq,fforce); + lammpsInterface_->pair_force(apair,rsq,fforce); double* v = vatom[lammps_a]; fforce *=delx*v[0] + dely*v[1] + delz*v[2]; quantity_(pairIndex,0)=fforce*delx; @@ -209,21 +209,21 @@ void PairPotentialHeatFluxEulerian::reset(void) const } } //========================================================== -PairPotentialHeatFluxLagrangian::PairPotentialHeatFluxLagrangian(LammpsInterface * lammpsInterface, +PairPotentialHeatFluxLagrangian::PairPotentialHeatFluxLagrangian(LammpsInterface * lammpsInterface, const PairMap & pairMap, double ** xRef): PairPotentialHeatFlux(lammpsInterface,pairMap), xRef_(xRef) { - + }; -void PairPotentialHeatFluxLagrangian::reset(void) const +void PairPotentialHeatFluxLagrangian::reset(void) const { int nPairs = pairMap_.size(); quantity_.reset(nPairs,nCols_); - double **xatom = lammpsInterface_->xatom(); - double **vatom = lammpsInterface_->vatom(); + double **xatom = lammpsInterface_->xatom(); + double **vatom = lammpsInterface_->vatom(); for (ATOM_PAIR apair = pairMap_.start(); ! pairMap_.finished(); apair=pairMap_++){ @@ -237,12 +237,12 @@ void PairPotentialHeatFluxLagrangian::reset(void) const double delz = xa[2] - xb[2]; double * Xa = xRef_[lammps_a]; double * Xb = xRef_[lammps_b]; - double delX = Xa[0] - Xb[0]; - double delY = Xa[1] - Xb[1]; - double delZ = Xa[2] - Xb[2]; + double delX = Xa[0] - Xb[0]; + double delY = Xa[1] - Xb[1]; + double delZ = Xa[2] - Xb[2]; double rsq = delx*delx + dely*dely + delz*delz; double fforce = 0; - lammpsInterface_->pair_force(apair,rsq,fforce); + lammpsInterface_->pair_force(apair,rsq,fforce); double* v = vatom[lammps_a]; fforce *=delx*v[0] + dely*v[1] + delz*v[2]; quantity_(pairIndex,0)=fforce*delX; @@ -251,21 +251,21 @@ void PairPotentialHeatFluxLagrangian::reset(void) const } } //========================================================== -SparsePerPairMatrix::SparsePerPairMatrix(LammpsInterface * lammpsInterface, +SparsePerPairMatrix::SparsePerPairMatrix(LammpsInterface * lammpsInterface, const PairMap & pairMap): lammpsInterface_(lammpsInterface), pairMap_(pairMap) { }; //========================================================== -BondMatrix::BondMatrix(LammpsInterface * lammpsInterface, +BondMatrix::BondMatrix(LammpsInterface * lammpsInterface, const PairMap & pairMap, double ** x, const FE_Mesh * feMesh): SparsePerPairMatrix(lammpsInterface,pairMap), x_(x), feMesh_(feMesh) { }; //========================================================== -BondMatrixKernel::BondMatrixKernel(LammpsInterface * lammpsInterface, - const PairMap & pairMap, +BondMatrixKernel::BondMatrixKernel(LammpsInterface * lammpsInterface, + const PairMap & pairMap, double ** x, const FE_Mesh * feMesh, const KernelFunction * kernelFunction): @@ -278,7 +278,7 @@ BondMatrixKernel::BondMatrixKernel(LammpsInterface * lammpsInterface, void BondMatrixKernel::reset(void) const { int nPairs = pairMap_.size(); // needs to come after quantity for reset - int nNodes = feMesh_->num_nodes_unique(); + int nNodes = feMesh_->num_nodes_unique(); quantity_.reset(nNodes,nPairs); double lam1,lam2; int heartbeatFreq = (nNodes <= 10 ? 1 : (int) nNodes / 10); @@ -302,7 +302,7 @@ void BondMatrixKernel::reset(void) const xbI = xba + xaI; kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2); if (lam1 < lam2) { - double bondValue = invVol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); + double bondValue = invVol*(kernelFunction_->bond(xaI,xbI,lam1,lam2)); int pairIndex = apair.second; quantity_.add(I,pairIndex,bondValue); } // if lam1 < lam2 @@ -312,8 +312,8 @@ void BondMatrixKernel::reset(void) const beat.finish(); } //========================================================== -BondMatrixPartitionOfUnity::BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface, - const PairMap & pairMap, double ** x, const FE_Mesh * feMesh, +BondMatrixPartitionOfUnity::BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface, + const PairMap & pairMap, double ** x, const FE_Mesh * feMesh, const DIAG_MAN * invVols): BondMatrix(lammpsInterface,pairMap,x,feMesh), invVols_(invVols) @@ -330,11 +330,11 @@ BondMatrixPartitionOfUnity::BondMatrixPartitionOfUnity(LammpsInterface * lammpsI }; void BondMatrixPartitionOfUnity::reset(void) const { - int nNodes = feMesh_->num_nodes_unique(); - int nPairs = pairMap_.size(); + int nNodes = feMesh_->num_nodes_unique(); + int nPairs = pairMap_.size(); quantity_.reset(nNodes,nPairs); - int nodes_per_element = feMesh_->num_nodes_per_element(); - Array node_list(nodes_per_element); + int nodes_per_element = feMesh_->num_nodes_per_element(); + Array node_list(nodes_per_element); DENS_VEC shp(nodes_per_element); int heartbeatFreq = (int) nPairs / 10; HeartBeat beat("computing bond matrix ",heartbeatFreq); diff --git a/lib/atc/PerPairQuantity.h b/lib/atc/PerPairQuantity.h index 2c391f99a8..a1d507a592 100644 --- a/lib/atc/PerPairQuantity.h +++ b/lib/atc/PerPairQuantity.h @@ -18,7 +18,7 @@ namespace ATC { typedef std::pair< std::pair< int,int >,int > ATOM_PAIR; /** - * @class PairMap + * @class PairMap * @brief Base class maps of pair indices to a single index */ @@ -28,7 +28,7 @@ namespace ATC { virtual ~PairMap(void); virtual void reset(void) const = 0; - void quantity() {}; + void quantity() {}; void set_quantity() { throw ATC_Error("inappropriate access to pair map");} // lammps communication @@ -36,9 +36,9 @@ namespace ATC { virtual void rest_nlocal() {this->force_reset();}; // iterator interface - int size(void) const { - if (this->need_reset()) reset(); - return nPairs_+nBonds_; + int size(void) const { + if (this->need_reset()) reset(); + return nPairs_+nBonds_; } int num_bonds(void) const { return nBonds_; } virtual ATOM_PAIR start() const = 0; // const reset / non-const call propagte reset @@ -66,10 +66,10 @@ namespace ATC { iterator_ = pairMap_.begin(); return *iterator_;} virtual ATOM_PAIR next(void) const { iterator_++; return *iterator_;} - virtual bool finished() const { + virtual bool finished() const { return (iterator_==pairMap_.end());} protected: - mutable PAIR_MAP pairMap_; + mutable PAIR_MAP pairMap_; private: mutable PAIR_MAP_ITERATOR iterator_; PairMapNeighbor();// do not define @@ -79,12 +79,12 @@ namespace ATC { public: PairMapBond(LammpsInterface * lammpsInterface, int groupbit); virtual ~PairMapBond(void) {}; - virtual bool need_reset(void) const { return true;} + virtual bool need_reset(void) const { return true;} virtual void reset(void) const {nBonds_ = lammpsInterface_->bond_list_length(); }; ATOM_PAIR start() const { reset(); // if (needs_reset()) propagate_reset() - index_ = 0; return atom_pair(index_);} + index_ = 0; return atom_pair(index_);} ATOM_PAIR next() const {return atom_pair(++index_);} bool finished() const { return index_==nBonds_; } ATOM_PAIR atom_pair(int n) const { @@ -94,7 +94,7 @@ namespace ATC { return p; } int * bond = (lammpsInterface_->bond_list())[n]; - std::pair pair_ij(bond[0],bond[1]); + std::pair pair_ij(bond[0],bond[1]); ATOM_PAIR p(pair_ij,n); return p; } @@ -108,31 +108,31 @@ namespace ATC { PairMapBoth(LammpsInterface * lammpsInterface, int groupbit); virtual ~PairMapBoth(void) {}; virtual bool need_reset(void) const { - nBonds_ = lammpsInterface_->bond_list_length(); + nBonds_ = lammpsInterface_->bond_list_length(); return PairMapNeighbor::need_reset(); } - virtual void reset(void) const { - nBonds_ = lammpsInterface_->bond_list_length(); + virtual void reset(void) const { + nBonds_ = lammpsInterface_->bond_list_length(); PairMapNeighbor::reset(); } virtual ATOM_PAIR start(void) const { if (need_reset()) reset(); index_ = 0; - iterator_ = pairMap_.begin(); + iterator_ = pairMap_.begin(); return atom_pair(index_); // start with bonds } virtual ATOM_PAIR next(void) const { ++index_; - if (index_ < nBonds_) { return atom_pair(index_);} + if (index_ < nBonds_) { return atom_pair(index_);} else { if (index_>nBonds_) iterator_++; return *iterator_; } } ATOM_PAIR atom_pair(int n) const { int * bond = (lammpsInterface_->bond_list())[n]; - std::pair pair_ij(bond[0],bond[1]); + std::pair pair_ij(bond[0],bond[1]); ATOM_PAIR p(pair_ij,n); return p; } - virtual bool finished() const { + virtual bool finished() const { return (iterator_==pairMap_.end());} private: mutable int index_; @@ -141,18 +141,18 @@ namespace ATC { }; /** - * @class DensePerPairQuantity - * @brief Base class for objects that manage pair/bond quantities + * @class DensePerPairQuantity + * @brief Base class for objects that manage pair/bond quantities */ class DensePerPairMatrix : public MatrixDependencyManager { public: - + // constructor - DensePerPairMatrix(LammpsInterface * lammpsInterface, - const PairMap & pairMap, + DensePerPairMatrix(LammpsInterface * lammpsInterface, + const PairMap & pairMap, int nCols = 1); - + // destructor virtual ~DensePerPairMatrix(){}; @@ -171,7 +171,7 @@ namespace ATC { virtual void reset() const = 0; protected: - + /** pointer to access Lammps data */ LammpsInterface * lammpsInterface_; @@ -186,7 +186,7 @@ namespace ATC { }; /** - * @class PairVirial + * @class PairVirial * @brief f_ab (x) x_ab where (ab) -> p */ class PairVirial : public DensePerPairMatrix { @@ -201,12 +201,12 @@ namespace ATC { /** resets data, if necessary */ virtual void reset() const = 0; - + private: PairVirial(void); // do not define }; /** - * @class PairVirial + * @class PairVirial * @brief f_ab (x) x_ab where (ab) -> p */ class PairVirialEulerian : public PairVirial { @@ -221,7 +221,7 @@ namespace ATC { /** resets data, if necessary */ virtual void reset() const; - + private: PairVirialEulerian(void); // do not define }; @@ -230,7 +230,7 @@ namespace ATC { public: // constructor PairVirialLagrangian(LammpsInterface * lammpsInterface, - const PairMap & pairMap, + const PairMap & pairMap, double ** xRef); // const PerAtomQuantity * x0); @@ -242,13 +242,13 @@ namespace ATC { protected: double ** xRef_; // note difficult to make a ** const // const PerAtomQuantity * xRef_; - + private: PairVirialLagrangian(void); // do not define }; /**` - * @class PairPotentialHeatFlux + * @class PairPotentialHeatFlux * @brief f_ab v_b where (ab) -> p */ class PairPotentialHeatFlux : public DensePerPairMatrix { @@ -263,7 +263,7 @@ namespace ATC { /** resets data, if necessary */ virtual void reset() const =0; - + private: PairPotentialHeatFlux(void); // do not define }; @@ -279,7 +279,7 @@ namespace ATC { /** resets data, if necessary */ virtual void reset() const; - + private: PairPotentialHeatFluxEulerian(void); // do not define }; @@ -299,23 +299,23 @@ namespace ATC { protected: double ** xRef_; // note difficult to make a ** const //const PerAtomQuantity * x0_; - + private: PairPotentialHeatFluxLagrangian(void); // do not define }; /** - * @class SparsePerPairMatrix - * @brief Base class for objects that manage pair/bond quantities + * @class SparsePerPairMatrix + * @brief Base class for objects that manage pair/bond quantities */ class SparsePerPairMatrix : public MatrixDependencyManager { public: - + // constructor - SparsePerPairMatrix(LammpsInterface * lammpsInterface, - const PairMap & pairMap); - + SparsePerPairMatrix(LammpsInterface * lammpsInterface, + const PairMap & pairMap); + // destructor virtual ~SparsePerPairMatrix(){}; @@ -331,7 +331,7 @@ namespace ATC { virtual void reset() const = 0; protected: - + /** pointer to access Lammps data */ LammpsInterface * lammpsInterface_; @@ -362,7 +362,7 @@ namespace ATC { protected: double ** x_; const class FE_Mesh * feMesh_; - + private: BondMatrix(void); // do not define }; @@ -376,7 +376,7 @@ namespace ATC { public: // constructor BondMatrixKernel(LammpsInterface * lammpsInterface, - const PairMap & pairMap, + const PairMap & pairMap, double ** x, const class FE_Mesh * feMesh, const class KernelFunction * kernelFunction); @@ -389,7 +389,7 @@ namespace ATC { protected: const class KernelFunction * kernelFunction_; - + private: BondMatrixKernel(void); // do not define }; @@ -403,7 +403,7 @@ namespace ATC { public: // constructor BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface, - const PairMap & pairMap, + const PairMap & pairMap, double ** x, const class FE_Mesh * feMesh, const DIAG_MAN * invVol); diff --git a/lib/atc/PhysicsModel.cpp b/lib/atc/PhysicsModel.cpp index f5c342c5a0..0cef920e88 100644 --- a/lib/atc/PhysicsModel.cpp +++ b/lib/atc/PhysicsModel.cpp @@ -79,19 +79,19 @@ void PhysicsModel::parse_material_file(string fileName) stringstream ss; ss << "WARNING: material units " << units << " do not match lammps"; if (units == "SI") { - if (lammpsUnits != LammpsInterface::SI) + if (lammpsUnits != LammpsInterface::SI) ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } else if (units == "real") { - if (lammpsUnits != LammpsInterface::REAL ) + if (lammpsUnits != LammpsInterface::REAL ) ATC::LammpsInterface::instance()->print_msg_once(ss.str()); } else if (units == "metal") { - if (lammpsUnits != LammpsInterface::METAL ) + if (lammpsUnits != LammpsInterface::METAL ) ATC::LammpsInterface::instance()->print_msg_once(ss.str()); - } + } else { - throw ATC_Error("unknown units in material file"); + throw ATC_Error("unknown units in material file"); } } else { @@ -126,7 +126,7 @@ void PhysicsModel::initialize(void) for (weak = weakEqns_.begin(); weak!=weakEqns_.end(); weak++) { FieldName fieldName = weak->first; WeakEquation * weakEq = weak->second; - set needs= weakEq->needs_material_functions(); + set needs= weakEq->needs_material_functions(); vector< Material* >::iterator iter; for (iter = materials_.begin(); iter != materials_.end(); iter++) { Material * mat = *iter; @@ -136,11 +136,11 @@ void PhysicsModel::initialize(void) null_(fieldName,matId) = true; stringstream ss; ss << "WARNING: physics model: [" << type_ << "], material: [" << tag - << "] does not provide all interfaces for <" - << field_to_string(fieldName) + << "] does not provide all interfaces for <" + << field_to_string(fieldName) << "> physics and will be treated as null "; ATC::LammpsInterface::instance()->print_msg_once(ss.str()); - // if (noNull_) + // if (noNull_) //throw ATC_Error("material does not provide all interfaces for physics"); } } @@ -186,7 +186,7 @@ void PhysicsModel::num_fields(map & fieldSizes, fieldSizes[field] = size; rhsMask(field,FLUX) = weakEq->has_B_integrand(); rhsMask(field,SOURCE) = weakEq->has_N_integrand(); - } + } } //--------------------------------------------------------------------- @@ -362,7 +362,7 @@ PhysicsModelDriftDiffusionConvectionSchrodinger::PhysicsModelDriftDiffusionConve // PhysicsModelElectrostatic //--------------------------------------------------------------------- PhysicsModelElectrostatic::PhysicsModelElectrostatic(string filename): - PhysicsModel(filename) + PhysicsModel(filename) { PhysicsModel::type_ = "electrostatic"; weakEqns_[VELOCITY] = new WeakEquationMomentumElectrostatic(); @@ -373,7 +373,7 @@ PhysicsModelElectrostatic::PhysicsModelElectrostatic(string filename): // PhysicsModelElectrostaticEquilibrium //--------------------------------------------------------------------- PhysicsModelElectrostaticEquilibrium::PhysicsModelElectrostaticEquilibrium(string filename): - PhysicsModel(filename) + PhysicsModel(filename) { PhysicsModel::type_ = "equilibrium electrostatic"; weakEqns_[VELOCITY] = new WeakEquationMomentumElectrostatic(); @@ -424,20 +424,20 @@ PhysicsModelTangentOperator::PhysicsModelTangentOperator(ATC_Coupling * atc, void PhysicsModelTangentOperator::function(const VECTOR & x, DENS_VEC & r) { - CLON_VEC f = column(fields_[fieldName_].set_quantity(),dof_); + CLON_VEC f = column(fields_[fieldName_].set_quantity(),dof_); f = x; atc_->compute_rhs_vector(rhsMask_, fields_, rhs_, integrationType_, physicsModel_); CLON_VEC rhsv = column(rhs_[fieldName_].quantity(),dof_); r = rhsv; } -void PhysicsModelTangentOperator::tangent(const VECTOR & x, DENS_VEC & r, +void PhysicsModelTangentOperator::tangent(const VECTOR & x, DENS_VEC & r, MATRIX & K) { function(x,r); pair row_col(fieldName_,fieldName_); const FIELDS & fields = fields_; atc_->compute_rhs_tangent(row_col, rhsMask_, fields , stiffness_, integrationType_, physicsModel_); - K = stiffness_.dense_copy(); + K = stiffness_.dense_copy(); } }; // end namespace diff --git a/lib/atc/PhysicsModel.h b/lib/atc/PhysicsModel.h index 8479727a89..7c1108e7f7 100644 --- a/lib/atc/PhysicsModel.h +++ b/lib/atc/PhysicsModel.h @@ -13,28 +13,28 @@ #include "ATC_TypeDefs.h" #include "Utility.h" -namespace ATC +namespace ATC { class ATC_Coupling; //------------------------------------------------------------------- // @class PhysicsModel //------------------------------------------------------------------- /** - * @brief An adaptor for the FE_Engine of the specific weak form of + * @brief An adaptor for the FE_Engine of the specific weak form of * the continuum PDE for the FE_Engine. * It is assumed that the PDE fits this template: - * DENSITY(FIELDS) FIELD_RATE + * DENSITY(FIELDS) FIELD_RATE * = DIV FLUX(FIELDS, GRAD_FIELDS) + SOURCE(FIELDS,GRAD_FIELDS) * + PRESCRIBED_SOURCE(X,t) + EXTRINSIC_SOURCE(FIELDS,GRAD_FIELDS) * Also it is important to understand that the physics model only handles * extrinsic fields or surrogates of intrinsic fields */ - class PhysicsModel + class PhysicsModel { public: - // constructor + // constructor PhysicsModel(std::string fileName); // destructor @@ -44,7 +44,7 @@ namespace ATC void parse_material_file(std::string fileName); /** initialize */ - void initialize(void); + void initialize(void); // set timescale parameters based on a given lengthscale virtual void set_timescales(const double /* lengthscale */) {}; @@ -59,20 +59,20 @@ namespace ATC const Material * material(const int index) const {return materials_[index];} /** access to parameter values */ - bool parameter_value(const std::string& name, double& value, + bool parameter_value(const std::string& name, double& value, const int imat = 0) const ; /** return fields ids and length */ - void num_fields(std::map & fieldSizes, + void num_fields(std::map & fieldSizes, Array2D & rhsMask) const; /** is the material model linear */ - bool is_linear(FieldName name) const { + bool is_linear(FieldName name) const { std::vector< Material* >::const_iterator iter; for (iter = materials_.begin(); iter != materials_.end(); iter++) { Material * mat = *iter; - bool linear = mat->linear_flux(name) - && mat->linear_source(name) + bool linear = mat->linear_flux(name) + && mat->linear_source(name) && mat->constant_density(name); if (! linear) return linear; } @@ -80,7 +80,7 @@ namespace ATC } /** is rhs linear */ - bool has_linear_rhs(FieldName name) const { + bool has_linear_rhs(FieldName name) const { std::vector< Material* >::const_iterator iter; for (iter = materials_.begin(); iter != materials_.end(); iter++) { Material * mat = *iter; @@ -91,7 +91,7 @@ namespace ATC } /** is mass matrix constant */ - bool has_constant_mass(FieldName name) const { + bool has_constant_mass(FieldName name) const { std::vector< Material* >::const_iterator iter; for (iter = materials_.begin(); iter != materials_.end(); iter++) { Material * mat = *iter; @@ -103,21 +103,21 @@ namespace ATC /** access to weak equations */ const WeakEquation * weak_equation(FieldName field) const - { + { std::map::const_iterator itr = weakEqns_.find(field); if (itr == weakEqns_.end()) return nullptr; return (weakEqns_.find(field))->second; } /** requires ics */ - bool is_dynamic(FieldName field) const + bool is_dynamic(FieldName field) const { return (weak_equation(field)->type() == WeakEquation::DYNAMIC_PDE); } /** query null weak equations per material */ bool null(FieldName field, int matID) const - { + { return null_(field,matID); } @@ -126,7 +126,7 @@ namespace ATC std::map parameterValues_; /** material models */ - std::vector materials_; + std::vector materials_; std::map materialNameToIndexMap_;// maps tag to index /** weak equations */ @@ -149,7 +149,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelThermal : public PhysicsModel { - public: + public: PhysicsModelThermal(std::string filename); }; //------------------------------------------------------------------- @@ -157,7 +157,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelElastic : public PhysicsModel { - public: + public: PhysicsModelElastic(std::string filename); }; //------------------------------------------------------------------- @@ -165,16 +165,16 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelThermoElastic : public PhysicsModel { - public: + public: PhysicsModelThermoElastic(std::string filename); }; - + //------------------------------------------------------------------- // @class PhysicsModelShear //------------------------------------------------------------------- class PhysicsModelShear : public PhysicsModel { - public: + public: PhysicsModelShear(std::string filename); }; //------------------------------------------------------------------- @@ -182,7 +182,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelThermoShear : public PhysicsModel { - public: + public: PhysicsModelThermoShear(std::string filename); }; //------------------------------------------------------------------- @@ -190,7 +190,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelSpecies : public PhysicsModel { - public: + public: PhysicsModelSpecies(std::string filename); }; //------------------------------------------------------------------- @@ -198,7 +198,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelTwoTemperature : public PhysicsModel { - public: + public: PhysicsModelTwoTemperature(std::string filename); }; //------------------------------------------------------------------- @@ -206,7 +206,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusion : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusion(std::string filename); }; //------------------------------------------------------------------- @@ -214,7 +214,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionEquilibrium : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionEquilibrium(std::string filename); }; //------------------------------------------------------------------- @@ -222,7 +222,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionSchrodinger : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionSchrodinger(std::string filename); }; //------------------------------------------------------------------- @@ -230,7 +230,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionConvection : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionConvection(std::string filename); }; //------------------------------------------------------------------- @@ -238,7 +238,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionConvectionEquilibrium : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionConvectionEquilibrium(std::string filename); }; //------------------------------------------------------------------- @@ -246,7 +246,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionConvectionSchrodinger : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionConvectionSchrodinger(std::string filename); }; //------------------------------------------------------------------- @@ -254,7 +254,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelDriftDiffusionSchrodingerSlice : public PhysicsModel { - public: + public: PhysicsModelDriftDiffusionSchrodingerSlice(std::string filename); }; //------------------------------------------------------------------- @@ -262,7 +262,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelElectrostatic : public PhysicsModel { - public: + public: PhysicsModelElectrostatic(std::string filename); }; //------------------------------------------------------------------- @@ -270,7 +270,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelElectrostaticEquilibrium : public PhysicsModel { - public: + public: PhysicsModelElectrostaticEquilibrium(std::string filename); }; //------------------------------------------------------------------- @@ -278,7 +278,7 @@ namespace ATC //------------------------------------------------------------------- class PhysicsModelSpeciesElectrostatic : public PhysicsModel { - public: + public: PhysicsModelSpeciesElectrostatic(std::string filename); }; //------------------------------------------------------------------- @@ -314,7 +314,7 @@ namespace ATC FIELDS & fields_; FieldName fieldName_; int dof_; - SPAR_MAT stiffness_; + SPAR_MAT stiffness_; }; } diff --git a/lib/atc/PoissonSolver.cpp b/lib/atc/PoissonSolver.cpp index 52909fc454..3d644e6c58 100644 --- a/lib/atc/PoissonSolver.cpp +++ b/lib/atc/PoissonSolver.cpp @@ -44,24 +44,24 @@ PoissonSolver::PoissonSolver( { if (physicsModel_->has_linear_rhs(fieldName)) { linear_ = true; - rhsMask_(fieldName,FLUX) = false; + rhsMask_(fieldName,FLUX) = false; } else { - rhsMask_(fieldName,FLUX) = true; - rhsMask_(fieldName,SOURCE) = true; + rhsMask_(fieldName,FLUX) = true; + rhsMask_(fieldName,SOURCE) = true; } - + if (prescribedDataMgr_->has_robin_source(fieldName)) { - - - + + + rhsMask_(fieldName,ROBIN_SOURCE) = true; } } // -------------------------------------------------------------------- -PoissonSolver::~PoissonSolver() -{ +PoissonSolver::~PoissonSolver() +{ if (tangent_) delete tangent_; if (solverNL_) delete solverNL_; if (solver_) delete solver_; @@ -74,9 +74,9 @@ PoissonSolver::~PoissonSolver() bool PoissonSolver::modify(int /* narg */, char **arg) { bool match = false; - /*! \page man_poisson_solver fix_modify AtC poisson_solver + /*! \page man_poisson_solver fix_modify AtC poisson_solver \section syntax - fix_modify AtC poisson_solver mesh create + fix_modify AtC poisson_solver mesh create - nx ny nz = number of elements in x, y, z - region-id = id of region that is to be meshed @@ -105,7 +105,7 @@ PoissonSolver::~PoissonSolver() // feEngine_->modify(narg,arg); } - } + } return match; } // -------------------------------------------------------------------- @@ -115,16 +115,16 @@ void PoissonSolver::initialize(void) { nNodes_ = feEngine_->num_nodes(); - if (atc_->source_atomic_quadrature(fieldName_)) + if (atc_->source_atomic_quadrature(fieldName_)) integrationType_ = FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE; // compute penalty for Dirichlet boundaries - if (prescribedDataMgr_->none_fixed(fieldName_)) + if (prescribedDataMgr_->none_fixed(fieldName_)) throw ATC_Error("Poisson solver needs Dirichlet data"); const BC_SET & bcs = (prescribedDataMgr_->bcs(fieldName_))[0]; - if (linear_) { // constant rhs + if (linear_) { // constant rhs if (! solver_ ) { pair row_col(fieldName_,fieldName_); Array2D rhsMask(NUM_FIELDS,NUM_FLUX); @@ -151,10 +151,10 @@ void PoissonSolver::initialize(void) else { // print_mask(rhsMask_); if ( solverNL_ ) delete solverNL_; - tangent_ = new PhysicsModelTangentOperator(atc_,physicsModel_, rhsMask_, integrationType_, fieldName_); + tangent_ = new PhysicsModelTangentOperator(atc_,physicsModel_, rhsMask_, integrationType_, fieldName_); solverNL_ = new NonLinearSolver(tangent_,&bcs,0,parallel_); - + if (solverTol_) solverNL_->set_residual_tolerance(solverTol_); if (solverMaxIter_) solverNL_->set_max_iterations(solverMaxIter_); } @@ -173,11 +173,11 @@ bool PoissonSolver::solve(FIELDS & fields, FIELDS & rhs) if (linear_) {converged = solver_->solve(f,r);} else {converged = solverNL_->solve(f);} - if (atc_->source_atomic_quadrature(fieldName_) + if (atc_->source_atomic_quadrature(fieldName_) && LammpsInterface::instance()->atom_charge() ) set_charges(fields); return converged; } -bool PoissonSolver::solve(DENS_MAT & field, const DENS_MAT & rhs) +bool PoissonSolver::solve(DENS_MAT & field, const DENS_MAT & rhs) { CLON_VEC f = column(field,0); @@ -186,7 +186,7 @@ bool PoissonSolver::solve(DENS_MAT & field, const DENS_MAT & rhs) if (linear_) {converged = solver_->solve(f,r);} else {converged = solverNL_->solve(f);} - if (atc_->source_atomic_quadrature(fieldName_) + if (atc_->source_atomic_quadrature(fieldName_) && LammpsInterface::instance()->atom_charge() ) set_charges(atc_->fields()); return converged; } @@ -197,7 +197,7 @@ bool PoissonSolver::solve(DENS_MAT & field, const DENS_MAT & rhs) void PoissonSolver::set_charges(FIELDS & fields) { FIELD_MATS sources; - + atc_->compute_sources_at_atoms(rhsMask_, fields, physicsModel_,sources); FIELD_MATS::const_iterator nField = sources.find(fieldName_); if (nField != sources.end()) { diff --git a/lib/atc/PoissonSolver.h b/lib/atc/PoissonSolver.h index 8913c62134..cc176ee042 100644 --- a/lib/atc/PoissonSolver.h +++ b/lib/atc/PoissonSolver.h @@ -43,7 +43,7 @@ class PoissonSolver { ~PoissonSolver(); /** parser */ - bool modify(int narg, char **arg); + bool modify(int narg, char **arg); /** initialize */ void initialize(void); @@ -62,19 +62,19 @@ class PoissonSolver { } /** access to penalty coefficient */ - double penalty_coefficient() const + double penalty_coefficient() const { return solver_->penalty_coefficient(); } /** set tolerance for underlying solver */ - void set_tolerance(double tol) + void set_tolerance(double tol) { solverTol_ = tol; } /** set max iterations for underlying solver */ - void set_max_iterations(int maxIter) + void set_max_iterations(int maxIter) { solverMaxIter_ = maxIter; } @@ -83,7 +83,7 @@ class PoissonSolver { /** set atomic charges from electron model */ void set_charges(FIELDS & fields); - + /** Pointer to ATC_Tranfer */ ATC_Coupling * atc_; @@ -113,7 +113,7 @@ class PoissonSolver { /** solver */ LinearSolver * solver_; - NonLinearSolver *solverNL_; + NonLinearSolver *solverNL_; PhysicsModelTangentOperator * tangent_; int solverType_; double solverTol_; diff --git a/lib/atc/PolynomialSolver.cpp b/lib/atc/PolynomialSolver.cpp index b498b3b5bb..fc311f1e0b 100644 --- a/lib/atc/PolynomialSolver.cpp +++ b/lib/atc/PolynomialSolver.cpp @@ -59,12 +59,12 @@ namespace ATC { const double A = c[2] * c3inv; const double B = c[1] * c3inv; const double C = c[0] * c3inv; - + // substitute x = t - A/3 so t^3 + pt + q = 0 const double A2 = A*A; const double p = (1.0/3.0)*((-1.0/3.0)*A2 + B); const double q = 0.5*((2.0/27.0)*A*A2 - (1.0/3.0)*A*B + C); - + // Cardano's fomula const double p3 = p*p*p; const double D = q*q + p3; @@ -103,13 +103,13 @@ namespace ATC { } // solve ode with polynomial source : y'n + a_n-1 y'n-1 + ... = b_n x^n +... - void integrate_ode(double x, + void integrate_ode(double x, int na, double * a, double * y0, double * y, int nb, double * /* b */ ) { if (na == 2) { // particular if ( a[1] == 0) { - if ( a[0] == 0) { + if ( a[0] == 0) { y[0] = y0[0]+y0[1]*x; y[1] = y0[1]; } @@ -132,7 +132,7 @@ namespace ATC { c /= j; z *= x; y[0] += c*z; - } + } } else throw ATC_Error("can only integrate 2nd order ODEs currently"); } diff --git a/lib/atc/PrescribedDataManager.cpp b/lib/atc/PrescribedDataManager.cpp index 947191a0e4..72f6c75e79 100644 --- a/lib/atc/PrescribedDataManager.cpp +++ b/lib/atc/PrescribedDataManager.cpp @@ -18,7 +18,7 @@ namespace ATC { // PrescribedDataManager //------------------------------------------------------------------------- PrescribedDataManager::PrescribedDataManager - (FE_Engine * feEngine, + (FE_Engine * feEngine, const map & fieldSize) : fieldSizes_(fieldSize), feEngine_(feEngine) { @@ -34,8 +34,8 @@ namespace ATC { bcs_[thisField].reset(nNodes_,thisSize); for (int inode = 0; inode < nNodes_ ; ++inode) { for (int idof = 0; idof < thisSize ; ++idof) { - ics_[thisField](inode,idof) = nullptr; - bcs_[thisField](inode,idof) = nullptr; + ics_[thisField](inode,idof) = nullptr; + bcs_[thisField](inode,idof) = nullptr; } } // compact inode, value lists @@ -44,7 +44,7 @@ namespace ATC { elementSources_[thisField].reset(nElems_,thisSize); for (int ielem = 0; ielem < nElems_ ; ++ielem) { for (int idof = 0; idof < thisSize ; ++idof) { - elementSources_[thisField](ielem,idof) = nullptr; + elementSources_[thisField](ielem,idof) = nullptr; } } // node based sources @@ -70,14 +70,14 @@ namespace ATC { // construct & initialize internal data nNodes_ = feEngine_->num_nodes(); nElems_ = feEngine_->num_elements(); - + // nodal ics & essential bcs ics_[fieldName].reset(nNodes_,size); bcs_[fieldName].reset(nNodes_,size); for (int inode = 0; inode < nNodes_ ; ++inode) { for (int idof = 0; idof < size ; ++idof) { - ics_[fieldName](inode,idof) = nullptr; - bcs_[fieldName](inode,idof) = nullptr; + ics_[fieldName](inode,idof) = nullptr; + bcs_[fieldName](inode,idof) = nullptr; } } @@ -85,7 +85,7 @@ namespace ATC { elementSources_[fieldName].reset(nElems_,size); for (int ielem = 0; ielem < nElems_ ; ++ielem) { for (int idof = 0; idof < size ; ++idof) { - elementSources_[fieldName](ielem,idof) = nullptr; + elementSources_[fieldName](ielem,idof) = nullptr; } } } @@ -98,7 +98,7 @@ namespace ATC { // check to see if field exists if (fieldSizes_.find(fieldName) == fieldSizes_.end()) return; - + // delete field in maps fieldSizes_.erase(fieldName); ics_.erase(fieldName); @@ -110,28 +110,28 @@ namespace ATC { // fix_initial_field //------------------------------------------------------------------------- void PrescribedDataManager::fix_initial_field - (const string nodesetName, - const FieldName thisField, - const int thisIndex, + (const string nodesetName, + const FieldName thisField, + const int thisIndex, const XT_Function * f) { set nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName); set::const_iterator iset; for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) { int inode = *iset; - ics_[thisField](inode,thisIndex) = (XT_Function*) f; + ics_[thisField](inode,thisIndex) = (XT_Function*) f; } } //------------------------------------------------------------------------- // fix_field //------------------------------------------------------------------------- void PrescribedDataManager::fix_field - (const std::set nodeSet, - const FieldName thisField, - const int thisIndex, + (const std::set nodeSet, + const FieldName thisField, + const int thisIndex, const XT_Function * f) { - // fix fields + // fix fields set::const_iterator iset; for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) { int inode = *iset; @@ -139,9 +139,9 @@ namespace ATC { } } void PrescribedDataManager::fix_field - (const string nodesetName, - const FieldName thisField, - const int thisIndex, + (const string nodesetName, + const FieldName thisField, + const int thisIndex, const XT_Function * f) { set nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName); @@ -151,8 +151,8 @@ namespace ATC { // unfix_field //------------------------------------------------------------------------- void PrescribedDataManager::unfix_field - (const string nodesetName, - const FieldName thisField, + (const string nodesetName, + const FieldName thisField, const int thisIndex) { set nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName); @@ -167,9 +167,9 @@ namespace ATC { // fix_field //------------------------------------------------------------------------- void PrescribedDataManager::fix_field - (const int nodeId, - const FieldName thisField, - const int thisIndex, + (const int nodeId, + const FieldName thisField, + const int thisIndex, const XT_Function * f) { bcs_[thisField](nodeId,thisIndex) = (XT_Function*) f; @@ -178,8 +178,8 @@ namespace ATC { // unfix_field //------------------------------------------------------------------------- void PrescribedDataManager::unfix_field - (const int nodeId, - const FieldName thisField, + (const int nodeId, + const FieldName thisField, const int thisIndex) { bcs_[thisField](nodeId,thisIndex) = nullptr; @@ -188,12 +188,12 @@ namespace ATC { // fix_flux //------------------------------------------------------------------------- void PrescribedDataManager::fix_flux - (const string facesetName, - const FieldName thisField, - const int thisIndex, + (const string facesetName, + const FieldName thisField, + const int thisIndex, const XT_Function * f) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -203,7 +203,7 @@ namespace ATC { if (dof.size() == 0) { int ndof = (fieldSizes_.find(thisField))->second; dof.reset(ndof); - for(int i = 0; i < ndof; i++) dof(i) = nullptr; + for(int i = 0; i < ndof; i++) dof(i) = nullptr; } dof(thisIndex) = (XT_Function*) f; } @@ -212,11 +212,11 @@ namespace ATC { // unfix_flux //------------------------------------------------------------------------- void PrescribedDataManager::unfix_flux - (const string facesetName, - const FieldName thisField, - const int thisIndex) + (const string facesetName, + const FieldName thisField, + const int thisIndex) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -229,12 +229,12 @@ namespace ATC { // fix_robin //------------------------------------------------------------------------- void PrescribedDataManager::fix_robin - (const string facesetName, - const FieldName thisField, - const int thisIndex, + (const string facesetName, + const FieldName thisField, + const int thisIndex, const UXT_Function * f) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -244,7 +244,7 @@ namespace ATC { if (dof.size() == 0) { int ndof = (fieldSizes_.find(thisField))->second; dof.reset(ndof); - for(int i = 0; i < ndof; i++) dof(i) = nullptr; + for(int i = 0; i < ndof; i++) dof(i) = nullptr; } dof(thisIndex) = (UXT_Function*) f; } @@ -253,11 +253,11 @@ namespace ATC { // unfix_robin //------------------------------------------------------------------------- void PrescribedDataManager::unfix_robin - (const string facesetName, - const FieldName thisField, - const int thisIndex) + (const string facesetName, + const FieldName thisField, + const int thisIndex) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -270,10 +270,10 @@ namespace ATC { // fix_open //------------------------------------------------------------------------- void PrescribedDataManager::fix_open - (const string facesetName, + (const string facesetName, const FieldName thisField) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -285,10 +285,10 @@ namespace ATC { // unfix_open //------------------------------------------------------------------------- void PrescribedDataManager::unfix_open - (const string facesetName, - const FieldName thisField) + (const string facesetName, + const FieldName thisField) { - const set< pair > * fset + const set< pair > * fset = & ( (feEngine_->fe_mesh())->faceset(facesetName)); set< pair >::const_iterator iset; for (iset = fset->begin(); iset != fset->end(); iset++) { @@ -300,9 +300,9 @@ namespace ATC { // fix_source //------------------------------------------------------------------------- void PrescribedDataManager::fix_source - (const string elemsetName, - const FieldName thisField, - const int thisIndex, + (const string elemsetName, + const FieldName thisField, + const int thisIndex, const XT_Function *f) { set elemSet = (feEngine_->fe_mesh())->elementset(elemsetName); @@ -317,8 +317,8 @@ namespace ATC { // fix_source //------------------------------------------------------------------------- void PrescribedDataManager::fix_source - (const FieldName thisField, - const int thisIndex, + (const FieldName thisField, + const int thisIndex, const set > & s) { set >::const_iterator iset; @@ -334,8 +334,8 @@ namespace ATC { // unfix_source //------------------------------------------------------------------------- void PrescribedDataManager::unfix_source - (const string elemsetName, - const FieldName thisField, + (const string elemsetName, + const FieldName thisField, const int thisIndex) { set elemSet = (feEngine_->fe_mesh())->elementset(elemsetName); @@ -348,7 +348,7 @@ namespace ATC { //------------------------------------------------------------------------- // set_initial_conditions //------------------------------------------------------------------------- - void PrescribedDataManager::set_initial_conditions(const double t, + void PrescribedDataManager::set_initial_conditions(const double t, FIELDS &fields, FIELDS &dot_fields, FIELDS &ddot_fields, @@ -367,15 +367,15 @@ namespace ATC { for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { XT_Function *f = ics_[thisField](inode,thisIndex); if (!f) f = bcs_[thisField](inode,thisIndex); - if (f) + if (f) { - DENS_VEC coords(3); + DENS_VEC coords(3); coords = (feEngine_->fe_mesh())->nodal_coordinates(inode); double *x = coords.ptr(); myField(inode,thisIndex) = f->f(x,t); - myDotField(inode,thisIndex) = f->dfdt(x,t); - myDDotField(inode,thisIndex) = f->ddfdt(x,t); - myDDDotField(inode,thisIndex) = f->dddfdt(x,t); + myDotField(inode,thisIndex) = f->dfdt(x,t); + myDDotField(inode,thisIndex) = f->ddfdt(x,t); + myDDDotField(inode,thisIndex) = f->dddfdt(x,t); } else { myField(inode,thisIndex) = 0; @@ -397,7 +397,7 @@ namespace ATC { //------------------------------------------------------------------------- // set_fixed_fields //------------------------------------------------------------------------- - void PrescribedDataManager::set_fixed_fields(const double t, + void PrescribedDataManager::set_fixed_fields(const double t, FIELDS &fields, FIELDS &dot_fields, FIELDS &ddot_fields, @@ -408,20 +408,20 @@ namespace ATC { FieldName thisField = field->first; int thisSize = field->second; for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { - BC_SET & bcs = (bcValues_[thisField])[thisIndex]; + BC_SET & bcs = (bcValues_[thisField])[thisIndex]; bcs.clear(); for (int inode = 0; inode < nNodes_ ; ++inode) { XT_Function * f = bcs_[thisField](inode,thisIndex); if (f) { - DENS_VEC coords(3); + DENS_VEC coords(3); coords = (feEngine_->fe_mesh())->nodal_coordinates(inode); double * x = coords.ptr(); double val = f->f(x,t); - + (fields [thisField].set_quantity())(inode,thisIndex) = val; - (dot_fields [thisField].set_quantity())(inode,thisIndex) = f->dfdt(x,t); - (ddot_fields [thisField].set_quantity())(inode,thisIndex) = f->ddfdt(x,t); - (dddot_fields[thisField].set_quantity())(inode,thisIndex) = f->dddfdt(x,t); + (dot_fields [thisField].set_quantity())(inode,thisIndex) = f->dfdt(x,t); + (ddot_fields [thisField].set_quantity())(inode,thisIndex) = f->ddfdt(x,t); + (dddot_fields[thisField].set_quantity())(inode,thisIndex) = f->dddfdt(x,t); // compact set pair bc = make_pair(inode,val); bcs.insert(bc); @@ -434,7 +434,7 @@ namespace ATC { // set_fixed_field //------------------------------------------------------------------------- void PrescribedDataManager::set_fixed_field( - const double t, + const double t, const FieldName & fieldName, DENS_MAT & fieldMatrix) { @@ -447,7 +447,7 @@ namespace ATC { for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { XT_Function * f = bcs_[fieldName](inode,thisIndex); if (f) { - DENS_VEC coords(3); + DENS_VEC coords(3); coords = (feEngine_->fe_mesh())->nodal_coordinates(inode); fieldMatrix(inode,thisIndex) = f->f(coords.ptr(),t); } @@ -458,7 +458,7 @@ namespace ATC { // set_fixed_dfield //------------------------------------------------------------------------- void PrescribedDataManager::set_fixed_dfield( - const double t, + const double t, const FieldName & fieldName, DENS_MAT & dfieldMatrix) { @@ -471,7 +471,7 @@ namespace ATC { for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { XT_Function * f = bcs_[fieldName](inode,thisIndex); if (f) { - DENS_VEC coords(3); + DENS_VEC coords(3); coords = (feEngine_->fe_mesh())->nodal_coordinates(inode); dfieldMatrix(inode,thisIndex) = f->dfdt(coords.ptr(),t); } @@ -482,7 +482,7 @@ namespace ATC { // set_sources //------------------------------------------------------------------------- void PrescribedDataManager::set_sources - (double t, + (double t, FIELDS & sources) { // zero @@ -497,7 +497,7 @@ namespace ATC { } // compute boundary fluxes feEngine_->add_fluxes(fieldMask,t,faceSources_,sources); - + // compute internal sources feEngine_->add_sources(fieldMask,t,elementSources_,sources); feEngine_->add_sources(fieldMask,t,nodalSources_,sources); @@ -510,20 +510,20 @@ namespace ATC { for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { XT_Function * f = bcs_[thisField](inode,thisIndex); if (f) { - + (sources[thisField].set_quantity())(inode,thisIndex) = 0.0; } } } } - + } //------------------------------------------------------------------------- // print //------------------------------------------------------------------------- - void PrescribedDataManager::print(void) + void PrescribedDataManager::print(void) { // print and check consistency enum dataType {FREE=0,FIELD,SOURCE}; @@ -548,17 +548,17 @@ namespace ATC { for (int ielem = 0; ielem < nElems_ ; ++ielem) { for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { f = elementSources_[thisField](ielem,thisIndex); - if (f) { + if (f) { feEngine_->element_connectivity(ielem,conn); for (int i = 0; i < conn.size() ; ++i) { int inode = conn(i); - if (bcTypes(inode,thisIndex) != FIELD) + if (bcTypes(inode,thisIndex) != FIELD) { bcTypes(inode,thisIndex) = SOURCE; } } } } } - map < pair, Array < XT_Function * > > & fset + map < pair, Array < XT_Function * > > & fset = faceSources_[thisField]; map < pair, Array < XT_Function * > > ::const_iterator iset; for (iset = fset.begin(); iset != fset.end(); iset++) { @@ -566,11 +566,11 @@ namespace ATC { Array < XT_Function * > fs = iset->second; for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) { f = fs(thisIndex); - if (f) { + if (f) { feEngine_->face_connectivity(face,conn); for (int i = 0; i < conn.size() ; ++i) { int inode = conn(i); - if (bcTypes(inode,thisIndex) != FIELD) + if (bcTypes(inode,thisIndex) != FIELD) { bcTypes(inode,thisIndex) = SOURCE; } } } @@ -603,7 +603,7 @@ namespace ATC { int i = 0; for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) { int inode = *iset; - const BC_SET & allBCs + const BC_SET & allBCs = ((bcValues_.find(thisField))->second)[thisIndex]; BC_SET::const_iterator bset; for (bset = allBCs.begin(); bset != allBCs.end(); bset++) { diff --git a/lib/atc/PrescribedDataManager.h b/lib/atc/PrescribedDataManager.h index 738c34d593..330bf8ff65 100644 --- a/lib/atc/PrescribedDataManager.h +++ b/lib/atc/PrescribedDataManager.h @@ -19,8 +19,8 @@ namespace ATC { /** - * @class PrescribedDataManager - * @brief Base class for managing initial conditions, essential/natural "boundary" conditions and sources + * @class PrescribedDataManager + * @brief Base class for managing initial conditions, essential/natural "boundary" conditions and sources */ class PrescribedDataManager { @@ -29,7 +29,7 @@ namespace ATC { /** exclusive conditions: free | fixed field | flux or domain source */ //enum Bc_Type {FREE=0,FIELD,SOURCE}; - PrescribedDataManager(FE_Engine * feEngine, + PrescribedDataManager(FE_Engine * feEngine, const std::map & fieldSize); ~PrescribedDataManager(); @@ -38,34 +38,34 @@ namespace ATC { void remove_field(FieldName fieldName); /** direct access to ics */ - std::map < FieldName, Array2D < XT_Function * > > * + std::map < FieldName, Array2D < XT_Function * > > * ics(void) { return & ics_; } - const Array2D < XT_Function * > * + const Array2D < XT_Function * > * ics(FieldName fieldName) { return & ics_[fieldName]; } /** direct access to bcs */ - const std::map < FieldName, BCS > & bcs(void) const - { - return bcValues_; + const std::map < FieldName, BCS > & bcs(void) const + { + return bcValues_; } /** */ - const BCS & bcs(const FieldName fieldName) const - { - return (bcValues_.find(fieldName))->second; + const BCS & bcs(const FieldName fieldName) const + { + return (bcValues_.find(fieldName))->second; } /** */ void bcs - (const FieldName fieldName, const std::set nodes, BCS & bcs, + (const FieldName fieldName, const std::set nodes, BCS & bcs, bool local = false) const; /** */ - std::map < FieldName, Array2D < XT_Function * > > * + std::map < FieldName, Array2D < XT_Function * > > * bc_functions(void) { return & bcs_; } /** */ - const Array2D < XT_Function * > * + const Array2D < XT_Function * > * bc_functions(FieldName fieldName) { return & bcs_[fieldName]; } /** */ ROBIN_SURFACE_SOURCE * robin_functions(void) { return & faceSourcesRobin_; } - bool has_robin_source(FieldName fieldName) const { + bool has_robin_source(FieldName fieldName) const { return ((faceSourcesRobin_.find(fieldName)->second).size() > 0) ; } /** */ @@ -73,33 +73,33 @@ namespace ATC { robin_functions(FieldName fieldName) { return & faceSourcesRobin_[fieldName]; } /** */ OPEN_SURFACE * open_faces(void) { return & facesOpen_; } - bool has_open_face(FieldName fieldName) const { + bool has_open_face(FieldName fieldName) const { return ((facesOpen_.find(fieldName)->second).size() > 0) ; } /** */ const std::set * open_faces(FieldName fieldName) { return & facesOpen_[fieldName]; } - + /** query initial state */ - bool is_initially_fixed(const int node, + bool is_initially_fixed(const int node, const FieldName thisField, const int thisIndex=0) const - { - return ((ics_.find(thisField)->second))(node,thisIndex) ? true : false ; + { + return ((ics_.find(thisField)->second))(node,thisIndex) ? true : false ; } /** query state */ - bool is_fixed(const int node, + bool is_fixed(const int node, const FieldName thisField, const int thisIndex=0) const - { - return ((bcs_.find(thisField)->second))(node,thisIndex) ? true : false ; + { + return ((bcs_.find(thisField)->second))(node,thisIndex) ? true : false ; } /** */ std::set fixed_nodes( const FieldName thisField, const int thisIndex=0) const - { + { std::set fixed; const Array2D < XT_Function *> & bcs = bcs_.find(thisField)->second; for (int node = 0; node < bcs.nRows() ; node++) { @@ -122,7 +122,7 @@ namespace ATC { bool all_fixed( const FieldName thisField, const int thisIndex=-1) const - { + { if (thisIndex < 0) { // static_casts are to iterface with std::vector without compiler warngings bool allFixed = (fixed_nodes(thisField,0).size() == static_cast(nNodes_) ); @@ -140,7 +140,7 @@ namespace ATC { bool none_fixed( const FieldName thisField, const int thisIndex=0) const - { + { return (fixed_nodes(thisField,thisIndex).size() == 0 ) && (faceSourcesRobin_.size() == 0) && (facesOpen_.size() == 0); @@ -150,9 +150,9 @@ namespace ATC { std::set flux_face_nodes( const FieldName thisField, const int thisIndex=0) const - { + { std::set fluxes; - //list of nodes to insert. + //list of nodes to insert. //1 for nodes to insert, 0 for nodes not to insert. int *toInsert = new int[nNodes_]; for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0; @@ -188,7 +188,7 @@ namespace ATC { std::set fluxes, const int thisIndex=0) const { - //list of nodes to insert. + //list of nodes to insert. //1 for nodes to insert, 0 for nodes not to insert. int *toInsert = new int[nNodes_]; for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0; @@ -221,9 +221,9 @@ namespace ATC { std::set flux_element_nodes( const FieldName thisField, const int thisIndex=0) const - { + { std::set fluxes; - //list of nodes to insert. + //list of nodes to insert. //1 for nodes to insert, 0 for nodes not to insert. int *toInsert = new int[nNodes_]; for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0; @@ -256,7 +256,7 @@ namespace ATC { std::set fluxes, const int thisIndex=0) const { - //list of nodes to insert. + //list of nodes to insert. //1 for nodes to insert, 0 for nodes not to insert. int *toInsert = new int[nNodes_]; for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0; @@ -286,51 +286,51 @@ namespace ATC { bool no_fluxes( const FieldName thisField, const int thisIndex=0) const - { + { return ((flux_element_nodes(thisField,thisIndex).size() == 0) && (flux_face_nodes(thisField,thisIndex).size() == 0)); } - + /** set initial field values */ - void fix_initial_field (const std::string nodesetName, - const FieldName thisField, - const int thisIndex, + void fix_initial_field (const std::string nodesetName, + const FieldName thisField, + const int thisIndex, const XT_Function * f); /** un/set field values at fixed nodesets */ - void fix_field (const std::set nodeset, - const FieldName thisField, - const int thisIndex, + void fix_field (const std::set nodeset, + const FieldName thisField, + const int thisIndex, const XT_Function * f); /** un/set field values at fixed nodesets */ - void fix_field (const std::string nodesetName, - const FieldName thisField, - const int thisIndex, + void fix_field (const std::string nodesetName, + const FieldName thisField, + const int thisIndex, const XT_Function * f); - void unfix_field (const std::string nodesetName, - const FieldName thisField, - const int thisIndex); + void unfix_field (const std::string nodesetName, + const FieldName thisField, + const int thisIndex); /** un/set field values at fixed nodes */ - void fix_field (const int nodeId, - const FieldName thisField, - const int thisIndex, + void fix_field (const int nodeId, + const FieldName thisField, + const int thisIndex, const XT_Function * f); - void unfix_field (const int nodeId, - const FieldName thisField, - const int thisIndex); + void unfix_field (const int nodeId, + const FieldName thisField, + const int thisIndex); /** un/set fluxes */ void fix_flux (const std::string facesetName, - const FieldName thisField, - const int thisIndex, + const FieldName thisField, + const int thisIndex, const XT_Function * f); void unfix_flux(const std::string facesetName, - const FieldName thisField, + const FieldName thisField, const int thisIndex); void fix_robin (const std::string facesetName, - const FieldName thisField, - const int thisIndex, + const FieldName thisField, + const int thisIndex, const UXT_Function * f); void unfix_robin(const std::string facesetName, - const FieldName thisField, + const FieldName thisField, const int thisIndex); void fix_open (const std::string facesetName, const FieldName thisField); @@ -338,37 +338,37 @@ namespace ATC { const FieldName thisField); /** un/set sources */ void fix_source(const std::string elemsetName, - const FieldName thisField, - const int thisIndex, + const FieldName thisField, + const int thisIndex, const XT_Function * f); - void fix_source( const FieldName thisField, - const int thisIndex, + void fix_source( const FieldName thisField, + const int thisIndex, const std::set > & source); void unfix_source(const std::string elemsetName, - const FieldName thisField, + const FieldName thisField, const int thisIndex); /** get initial conditions */ - void set_initial_conditions(const double time, + void set_initial_conditions(const double time, FIELDS & fields, FIELDS & dot_fields, FIELDS & ddot_fields, FIELDS & dddot_fields); /** get "boundary" conditions on fields */ - void set_fixed_fields(const double time, + void set_fixed_fields(const double time, FIELDS & fields, FIELDS & dot_fields, FIELDS & ddot_fields, FIELDS & dddot_fields); /** get "boundary" conditions on a single field */ - void set_fixed_field(const double time, + void set_fixed_field(const double time, const FieldName & fieldName, DENS_MAT & fieldMatrix); /** get "boundary" conditions on a single time derivative field */ - void set_fixed_dfield(const double time, + void set_fixed_dfield(const double time, const FieldName & fieldName, DENS_MAT & dfieldMatrix); /** get "sources" (flux and sources: divided by leading coef of ODE) */ - void set_sources(const double time, + void set_sources(const double time, FIELDS & sources); /** debugging status output */ @@ -396,13 +396,13 @@ namespace ATC { std::map < FieldName, Array2D < XT_Function * > > bcs_; /** sources : XT_Function * f = faceSources_[field][face](idof) */ - std::map < FieldName, std::map < std::pair , Array < XT_Function * > > > + std::map < FieldName, std::map < std::pair , Array < XT_Function * > > > faceSources_; /** sources : UXT_Function * f = faceSourcesRobin_[field][face](idof) */ - std::map < FieldName, std::map < std::pair , Array < UXT_Function * > > > + std::map < FieldName, std::map < std::pair , Array < UXT_Function * > > > faceSourcesRobin_; /** sources : facesOpen_[field][face] */ - std::map < FieldName, std::set < std::pair > > + std::map < FieldName, std::set < std::pair > > facesOpen_; /** sources : XT_Function * f = elementSources_[field](ielem,idof) */ std::map < FieldName, Array2D < XT_Function * > > elementSources_; diff --git a/lib/atc/Quadrature.cpp b/lib/atc/Quadrature.cpp index 94fe4a701c..d36031d89e 100644 --- a/lib/atc/Quadrature.cpp +++ b/lib/atc/Quadrature.cpp @@ -36,7 +36,7 @@ Quadrature::Quadrature() } // ----------------------------------------------------------------- -// line quadrature: positions & weights +// line quadrature: positions & weights // ----------------------------------------------------------------- /** domain of integration is -1 to 1 */ void Quadrature::set_line_quadrature(const int ng, double* xg, double* wg) @@ -74,7 +74,7 @@ void Quadrature::set_line_quadrature(const int ng, double* xg, double* wg) xg[9] = 0.97390653; wg[9] = 0.06667134; } else { - throw ATC_Error("Invalid choice of number of quadrature points"); + throw ATC_Error("Invalid choice of number of quadrature points"); } } diff --git a/lib/atc/Quadrature.h b/lib/atc/Quadrature.h index 7854e9c3f3..35aab4994c 100644 --- a/lib/atc/Quadrature.h +++ b/lib/atc/Quadrature.h @@ -2,9 +2,9 @@ #define QUADRATURE_H namespace ATC { -/** - * @class Quadrature - * @brief create quadrature lists +/** + * @class Quadrature + * @brief create quadrature lists */ class Quadrature { public: diff --git a/lib/atc/SchrodingerSolver.cpp b/lib/atc/SchrodingerSolver.cpp index 3819562a70..a59191a229 100644 --- a/lib/atc/SchrodingerSolver.cpp +++ b/lib/atc/SchrodingerSolver.cpp @@ -18,12 +18,12 @@ using std::min; using ATC_Utility::to_string; using ATC_Utility::sgn; -const double zero_tol = 1.e-12; -const double f_tol = 1.e-8; +const double zero_tol = 1.e-12; +const double f_tol = 1.e-8; namespace ATC { -enum oneDconservationEnum {ONED_DENSITY=0, ONED_FLUX, ONED_GLOBAL_FLUX}; +enum oneDconservationEnum {ONED_DENSITY=0, ONED_FLUX, ONED_GLOBAL_FLUX}; @@ -61,7 +61,7 @@ double fermi_dirac(const double E, const double T) //----------------------------------------------------- void SchrodingerSolver::initialize() { - SPAR_MAT sparseM; + SPAR_MAT sparseM; atc_->fe_engine()->compute_mass_matrix(sparseM); M_ = sparseM.dense_copy(); } @@ -83,7 +83,7 @@ double fermi_dirac(const double E, const double T) atc_->element_to_material_map(), stiffness_); DENS_MAT K(stiffness_.dense_copy()); set fixedNodes = prescribedDataMgr_->fixed_nodes(ELECTRON_WAVEFUNCTION); - const BC_SET & bcs + const BC_SET & bcs = (prescribedDataMgr_->bcs(ELECTRON_WAVEFUNCTION))[0]; DENS_MAT & psi = (atc_->field(ELECTRON_WAVEFUNCTION)).set_quantity(); DENS_MAT & eVecs = (atc_->field(ELECTRON_WAVEFUNCTIONS)).set_quantity(); @@ -97,13 +97,13 @@ double fermi_dirac(const double E, const double T) return true; } // (1) Helmholtz solve for inhomongeneous bcs - + LinearSolver helmholtzSolver_(K,bcs,LinearSolver::AUTO_SOLVE,-1,parallel_); - + psi.reset(nNodes_,1); - // (2) Eigenvalue solve + // (2) Eigenvalue solve helmholtzSolver_.eigen_system(eVals,eVecs,&M_); - return true; + return true; } //======================================================== @@ -119,7 +119,7 @@ double fermi_dirac(const double E, const double T) const Array< double > & oneDdxs, bool parallel ) - : SchrodingerSolver(fieldName, physicsModel, feEngine, prescribedDataMgr, + : SchrodingerSolver(fieldName, physicsModel, feEngine, prescribedDataMgr, atc, parallel), oneDslices_(oneDslices), oneDdxs_(oneDdxs) @@ -144,7 +144,7 @@ double fermi_dirac(const double E, const double T) DENS_MAT & Ef = (atc_->field(FERMI_ENERGY)).set_quantity(); DENS_MAT & n = (atc_->field(ELECTRON_DENSITY)).set_quantity(); DENS_MAT & T = (atc_->field(ELECTRON_TEMPERATURE)).set_quantity(); - + // stiffness = K + V M SPAR_MAT stiffness_; Array2D rhsMask(NUM_FIELDS,NUM_FLUX); @@ -158,7 +158,7 @@ double fermi_dirac(const double E, const double T) atc_->element_to_material_map(), stiffness_); DENS_MAT K(stiffness_.dense_copy()); - // Eigenvalue solve + // Eigenvalue solve DENS_MAT K1,M1; int nslices = oneDslices_.size(); DENS_MAT b ; @@ -186,24 +186,24 @@ double fermi_dirac(const double E, const double T) eigensolver.eigen_system(evals1,evecs1,&M1); eindex.clear(); for (int j = 0; j < snodes; j++) eindex.insert(iEVal++); - eVals.insert(eindex,one, evals1); + eVals.insert(eindex,one, evals1); eindex.clear(); for (int j = 0; j < snodes; j++) eindex.insert(j); eVecs.insert(slice,eindex,evecs1); // slice charge density n1.reset(snodes,1); - + set::const_iterator iset; double aveE_f = 0; - for (iset = slice.begin(); iset != slice.end(); iset++) { - int gnode = *iset; + for (iset = slice.begin(); iset != slice.end(); iset++) { + int gnode = *iset; aveE_f += Ef(gnode,0); } aveE_f /= snodes; -//#define VERBOSE +//#define VERBOSE #ifdef VERBOSE stringstream ss; - ss << " slice "+to_string(islice+1)+" E_f "+to_string(aveE_f) << "\n" + ss << " slice "+to_string(islice+1)+" E_f "+to_string(aveE_f) << "\n" << "#-----------------------------------------------\n" << "# E-Ef f psi n\n" << "#-----------------------------------------------\n"; @@ -211,17 +211,17 @@ double fermi_dirac(const double E, const double T) // B: compute charge density on slice int node = 0; for (iset = slice.begin(); iset != slice.end(); iset++) { // node - int gnode = *iset; + int gnode = *iset; double temp = T(gnode,0); for (int mode = 0; mode < snodes-nfixed; mode++) { double Ei = evals1(mode,0); double E = Ei-aveE_f; - double f = fermi_dirac(E,temp); + double f = fermi_dirac(E,temp); double psi1 = evecs1(node,mode); // 2nd index corresp to evals order #ifdef VERBOSE ss << node<<":"<set_fixed_nodes(); Te = alpha*Te0; - + schrodingerSolver_->solve(atc_->fields()); - + for (int l = 0; l < nNodes_; l++) { int count = 0; double T_e = Te(l,0); for (int m = 0; m < nNodes_; m++) { double f = fermi_dirac(E_I(m,0), T_e); - if (f > tol) count++; + if (f > tol) count++; } } // compute charge density DENS_MAN & n = atc_->field(ELECTRON_DENSITY); //(n.quantity()).print("DENSITY"); atc_->nodal_projection(ELECTRON_DENSITY,physicsModel_,n); - atc_->set_fixed_nodes(); - - + atc_->set_fixed_nodes(); + + // solve poisson eqn for electric potential atc_->set_fixed_nodes(); Te = alpha*Te0; poissonSolver_->solve(atc_->fields(),rhs); - + //DENS_MAT dn = n; //DENS_MAT dpsi = psi; //DENS_MAT dphi = phi; @@ -421,7 +421,7 @@ double fermi_dirac(const double E, const double T) //dn -= nPrev; //dpsi -= psiPrev; //dphi -= phiPrev; - + norm = (n.quantity()-nPrev).norm(); if (i == 0 && j==0) norm0 = (n.quantity()).norm(); //normPrev = norm; @@ -436,11 +436,11 @@ double fermi_dirac(const double E, const double T) // Tmax_ *= 0.5; } } - + //=================================================================== // SliceSchrodingerPoissonSolver //=================================================================== - SliceSchrodingerPoissonSolver::SliceSchrodingerPoissonSolver( + SliceSchrodingerPoissonSolver::SliceSchrodingerPoissonSolver( /*const*/ ATC_Coupling * atc, SchrodingerSolver * schrodingerSolver, PoissonSolver * poissonSolver, @@ -479,37 +479,37 @@ double fermi_dirac(const double E, const double T) Array2D nHistory(nslices,2); // target for constraint - double target = 0.0; + double target = 0.0; set & slice = oneDslices_(0); // note assume first slice is fixed - if (oneDconserve_ == ONED_FLUX) atc_->set_sources(); + if (oneDconserve_ == ONED_FLUX) atc_->set_sources(); DENS_MAT & nSource = (atc_->source(ELECTRON_DENSITY)).set_quantity(); - for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { + for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { if (oneDconserve_ == ONED_FLUX) target += nSource(*iset,0); else target += n(*iset,0); } - target /= slice.size(); + target /= slice.size(); #ifdef VERBOSE if (oneDconserve_ == ONED_FLUX) { if (target > 0) ATC::LammpsInterface::instance()->print_msg_once(" influx target "+ to_string(target)); else ATC::LammpsInterface::instance()->print_msg_once(" efflux target "+ to_string(target)); } #endif - + // A: self consistency loop between Phi and n(psi_i) double error = 1.0; - for (int i = 0; i < maxConsistencyIter_ ; ++i) { + for (int i = 0; i < maxConsistencyIter_ ; ++i) { atc_->set_fixed_nodes(); - if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) - poissonSolver_->solve(atc_->fields(),rhs); + if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) + poissonSolver_->solve(atc_->fields(),rhs); if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) { // iterate on Ef - //if (i==0) Ef = -1.0*phi;// E ~ -|e| \Phi, charge of electron e = 1 - Ef = -1.0*phi; - + //if (i==0) Ef = -1.0*phi;// E ~ -|e| \Phi, charge of electron e = 1 + Ef = -1.0*phi; + Ef +=Ef_shift_; // B: conservation constraint - for (int j = 0; j < maxConstraintIter_ ; ++j) { + for (int j = 0; j < maxConstraintIter_ ; ++j) { schrodingerSolver_->solve(atc_->fields()); // n(E_f) atc_->set_fixed_nodes(); error = update_fermi_energy(target,(j==0),fluxes);// root finder @@ -517,7 +517,7 @@ double fermi_dirac(const double E, const double T) ATC::LammpsInterface::instance()->print_msg_once(to_string(i)+":"+to_string(j)+" constraint_error "+to_string(error)+" / "+to_string(tol*target)+"\n"); #endif // exit condition based on constraint satisfaction - if (error < tol*fabs(target)) break; + if (error < tol*fabs(target)) break; } // loop j : flux constraint // error based on change in field (Cauchy convergence) if (i == 0) { @@ -556,7 +556,7 @@ double fermi_dirac(const double E, const double T) rhsMask(ELECTRON_DENSITY,FLUX) = true; //#define WIP_REJ atc_->compute_flux(rhsMask,atc_->fields_,fluxes,physicsModel_); - y = & ( fluxes[ELECTRON_DENSITY][oneDcoor_] ); + y = & ( fluxes[ELECTRON_DENSITY][oneDcoor_] ); } BCS bcs; double error = 0; @@ -571,10 +571,10 @@ double fermi_dirac(const double E, const double T) atc_->prescribedDataMgr_->bcs(ELECTRON_WAVEFUNCTION,slice,bcs,true); const BC_SET & bc = bcs[0]; int nFixed = bc.size(); - if (nFixed == nSlice) continue; // skip if all fixed + if (nFixed == nSlice) continue; // skip if all fixed double Y = 0.0, X = 0.0; double nAve = 0., phiAve = 0.; - for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { + for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; X += Ef(gnode,0); Y += (*y)(gnode,0); @@ -585,14 +585,14 @@ double fermi_dirac(const double E, const double T) Y /= nSlice; nAve /= nSlice; phiAve /= nSlice; - // now adjust Ef for each slice - double dY = Y - EfHistory_(islice,0); + // now adjust Ef for each slice + double dY = Y - EfHistory_(islice,0); double dX = X - EfHistory_(islice,1); - double err = target - Y; + double err = target - Y; if (target*Y < -zero_tol*target) { #ifdef VERBOSE cStr = " opp. SIGNS"; -#else +#else ATC::LammpsInterface::instance()->print_msg_once("WARNING: slice "+to_string(islice)+" target and quantity opposite signs "+to_string(Y)); #endif } @@ -601,21 +601,21 @@ double fermi_dirac(const double E, const double T) if (first) { dEf = (err < 0) ? -safe_dEf_ : safe_dEf_; } - else { + else { if (fabs(dY) < zero_tol*dX) throw ATC_Error("zero increment in conserved field on slice:"+to_string(islice)); dEf = err / dY * dX; if (fabs(dEf) > safe_dEf_) { dEf = safe_dEf_* dEf / fabs(dEf); #ifdef VERBOSE Estr = " !!"; -#else +#else ATC::LammpsInterface::instance()->print_msg_once("WARNING: slice "+to_string(islice)+ " large Delta E_f "+to_string(dEf)); #endif } } - for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { + for (set::const_iterator iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; - Ef(gnode,0) += dEf; + Ef(gnode,0) += dEf; } EfHistory_(islice,0) = Y; EfHistory_(islice,1) = X; @@ -624,14 +624,14 @@ double fermi_dirac(const double E, const double T) ATC::LammpsInterface::instance()->print_msg_once(" slice"+to_string(islice,2) +cStr+to_string(4,Y/target) +Estr+to_string(4,X)+" n"+to_string(5,nAve)+" phi"+to_string(4,phiAve)); //ATC::LammpsInterface::instance()->print_msg_once(" slice "+to_string(islice) +cStr+to_string(4,Y/target) +" E_f"+to_string(4,X)+dEstr+to_string(4,X-EfHistory_(std::max(0,islice-1),1))+" n"+to_string(4,nAve)+" phi"+to_string(4,phiAve)+" "+to_string(nFixed)+" dn "+to_string(4,dnAve)+" dphi "+to_string(4,dphiAve)); #endif - } // loop slice + } // loop slice return error; } //=================================================================== // GlobalSliceSchrodingerPoissonSolver //=================================================================== - GlobalSliceSchrodingerPoissonSolver::GlobalSliceSchrodingerPoissonSolver( + GlobalSliceSchrodingerPoissonSolver::GlobalSliceSchrodingerPoissonSolver( /*const*/ ATC_Coupling * atc, SchrodingerSolver * schrodingerSolver, PoissonSolver * poissonSolver, @@ -642,11 +642,11 @@ double fermi_dirac(const double E, const double T) double Ef0, double alpha, double safe_dEf, - double tol, + double tol, double mu, double D ) : SliceSchrodingerPoissonSolver(atc,schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter,maxConstraintIter,oneDconserve,0,0), - solver_(nullptr), + solver_(nullptr), mobility_(mu),diffusivity_(D) { Ef0_ = Ef0; @@ -680,10 +680,10 @@ double fermi_dirac(const double E, const double T) } A(0,0) = -2; A(0,1) = 1; - A(m-1,m-1) = -2; - A(m-1,m-2) = 1; + A(m-1,m-1) = -2; + A(m-1,m-2) = 1; //if (nfixed_ == 1) { A(m-1,m-1) = -1; } - double dx = oneDdxs_(0); + double dx = oneDdxs_(0); A *= 1./dx; A.print("stiffness",4); SPAR_MAT K(A); @@ -703,14 +703,14 @@ double fermi_dirac(const double E, const double T) B.print("gradient",4); SPAR_MAT G(B); G_ = G; - + DENS_MAT C(nNodes_,nNodes_); // local to ATC nodemap: k --> gnode = *iset int k = 0; set::const_iterator iset; for (int islice = 0; islice < nslices_; islice++) { set & slice = oneDslices_(islice); - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { double v = 0.5/dx; if ( k < sliceSize_ || k+1 > (nslices_-1)*sliceSize_ ) v *=2.0; if (islice > 0) { C(k,k-sliceSize_) += v; } @@ -732,7 +732,7 @@ double fermi_dirac(const double E, const double T) ATC::LammpsInterface::instance()->print_msg_once("schrodinger-poisson solver: Dirichlet INLET, Dirichlet; OUTLET"); else if (nfixed_ ==1) ATC::LammpsInterface::instance()->print_msg_once("schrodinger-poisson solver: Dirichlet INLET, Neumann; OUTLET"); - else + else ATC_Error("schrodinger-poisson solver:too many fixed"); } GlobalSliceSchrodingerPoissonSolver::~GlobalSliceSchrodingerPoissonSolver(void) { @@ -746,10 +746,10 @@ double fermi_dirac(const double E, const double T) DENS_MAT & Ef = (atc_->field(FERMI_ENERGY)).set_quantity(); Ef.reset(phi.nRows(),1); norm_ = norm0_ = 1.0; - for (int i = 0; i < maxConstraintIter_ ; ++i) { + for (int i = 0; i < maxConstraintIter_ ; ++i) { atc_->set_fixed_nodes(); if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) { - poissonSolver_->solve(atc_->fields(),rhs); + poissonSolver_->solve(atc_->fields(),rhs); } else { ATC::LammpsInterface::instance()->print_msg_once("WARNING: phi is fixed"); @@ -771,10 +771,10 @@ double fermi_dirac(const double E, const double T) report(i+1); if (i == 0 && norm_ > tol_) norm0_ = norm_; else { if (norm_ < tol_*norm0_) break; } - } + } } //-------------------------------------------------------------------------- - void GlobalSliceSchrodingerPoissonSolver::exponential_electron_density() + void GlobalSliceSchrodingerPoissonSolver::exponential_electron_density() { std::cout << "******************HACK******************\n"; @@ -786,12 +786,12 @@ double fermi_dirac(const double E, const double T) for (int islice = 0; islice < nslices_; islice++) { set & slice = oneDslices_(islice); double aveE_f = 0.0; - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; aveE_f += Ef(gnode,0); } aveE_f /= slice.size(); - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; //std::cout << phi(gnode,0)+aveE_f << "\n"; //n(gnode,0) = -n0*exp(-(phi(gnode,0)+aveE_f)/(kBeV_*T)); @@ -806,7 +806,7 @@ double fermi_dirac(const double E, const double T) } } //-------------------------------------------------------------------------- - void GlobalSliceSchrodingerPoissonSolver::report(int i) + void GlobalSliceSchrodingerPoissonSolver::report(int i) { const DENS_MAT & phi = (atc_->fields_[ELECTRIC_POTENTIAL]).quantity(); const DENS_MAT & n = (atc_->fields_[ELECTRON_DENSITY] ).quantity(); @@ -852,8 +852,8 @@ double fermi_dirac(const double E, const double T) int j = nslices_-1; double lambdaN = 0.; std::string space = "*"; - if (nfixed_ == 1) { - lambdaN = lambda_(nslices_-2); + if (nfixed_ == 1) { + lambdaN = lambda_(nslices_-2); space = " "; } ss << to_string(nslices_,2) << space << to_string(6,dJn) << " " << to_string(6,lambdaN) << " " << to_string(6,F_(j)) << " " << to_string(6,Phi_(j)) << " " << to_string(6,n_(j)) << " " << to_string(6,J_(j)) << "\n"; @@ -874,7 +874,7 @@ double fermi_dirac(const double E, const double T) // grad phi for (int islice = 0; islice < nslices_; islice++) { set & slice = oneDslices_(islice); - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; f(k) = phi(gnode,0); k++; @@ -887,7 +887,7 @@ double fermi_dirac(const double E, const double T) // grad n for (int islice = 0; islice < nslices_; islice++) { set & slice = oneDslices_(islice); - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; f(k) = n(gnode,0); k++; @@ -906,7 +906,7 @@ double fermi_dirac(const double E, const double T) for (int islice = 0; islice < nslices_; islice++) { set & slice = oneDslices_(islice); J_(islice) = 0; - for (iset = slice.begin(); iset != slice.end(); iset++) { + for (iset = slice.begin(); iset != slice.end(); iset++) { J_(islice) += flux_(k); k++; } @@ -914,10 +914,10 @@ double fermi_dirac(const double E, const double T) //std::cout << islice << " J " << J_(islice) << "\n"; } //J_.print("J"); - dJ_ = G_*J_; + dJ_ = G_*J_; } //-------------------------------------------------------------------------- - void GlobalSliceSchrodingerPoissonSolver::update_fermi_level() + void GlobalSliceSchrodingerPoissonSolver::update_fermi_level() { DENS_MAT & Ef = (atc_->field(FERMI_ENERGY) ).set_quantity(); @@ -941,7 +941,7 @@ double fermi_dirac(const double E, const double T) Phi_(islice) = Phi; // average potential N /= slice.size(); n_(islice) = N; // average electron density - + //F_(j) += min(fabs(alpha_*lambda),safe_dEf_)*sgn(lambda); for (iset = slice.begin(); iset != slice.end(); iset++) { int gnode = *iset; diff --git a/lib/atc/SchrodingerSolver.h b/lib/atc/SchrodingerSolver.h index e2addc48a3..e81572af84 100644 --- a/lib/atc/SchrodingerSolver.h +++ b/lib/atc/SchrodingerSolver.h @@ -21,7 +21,7 @@ class PoissonSolver; /** * @class SchrodingerSolver - * @brief a class to solve the (time-independent) Schrodinger equation + * @brief a class to solve the (time-independent) Schrodinger equation */ class SchrodingerSolver { @@ -47,13 +47,13 @@ class SchrodingerSolver { void initialize(void); /** solve */ - virtual bool solve(FIELDS & fields); + virtual bool solve(FIELDS & fields); + - protected: - + /** Pointer to ATC */ ATC_Coupling * atc_; @@ -109,10 +109,10 @@ class SliceSchrodingerSolver : public SchrodingerSolver { void initialize(void); /** solve */ - virtual bool solve(FIELDS & fields); + virtual bool solve(FIELDS & fields); - Array< std::set > & slices(void){ return oneDslices_;} - Array< double > & dxs(void){ return oneDdxs_;} + Array< std::set > & slices(void){ return oneDslices_;} + Array< double > & dxs(void){ return oneDdxs_;} protected: @@ -177,7 +177,7 @@ class SliceSchrodingerPoissonSolver : public SchrodingerPoissonSolver { ); protected: int nslices_; - double update_fermi_energy(double target, bool first, + double update_fermi_energy(double target, bool first, GRAD_FIELD_MATS & fluxes); int oneDconserve_; int oneDcoor_; @@ -236,7 +236,7 @@ class GlobalSliceSchrodingerPoissonSolver : public SliceSchrodingerPoissonSolver /** * @class SchrodingerSolver - * @brief a manager class + * @brief a manager class */ class SchrodingerPoissonManager { public: @@ -247,7 +247,7 @@ class SchrodingerPoissonManager { bool modify(int narg, char **arg); /** initialize */ - SchrodingerPoissonSolver * initialize( + SchrodingerPoissonSolver * initialize( /*const*/ ATC_Coupling * atc, SchrodingerSolver * schrodingerSolver, PoissonSolver * poissonSolver, diff --git a/lib/atc/ShapeFunction.h b/lib/atc/ShapeFunction.h index 62b2138cd7..4b38b6296e 100644 --- a/lib/atc/ShapeFunction.h +++ b/lib/atc/ShapeFunction.h @@ -25,34 +25,34 @@ namespace ATC { * @class FeEngineInterface * @class Base class for defining interfaces to the finite element engine to handle different shape functions */ - + class FeEngineInterface { - + public: - + // constructor FeEngineInterface(FE_Engine * feEngine, DENS_MAN * coordinates) : feEngine_(feEngine), coordinates_(coordinates) {}; // destructor virtual ~FeEngineInterface() {}; - + /** evaluate shape function at a set of coordinates */ virtual void evaluate_shape_function(int index, POINT_VAL & data) = 0; - + protected: - + /** pointer to the engine */ FE_Engine * feEngine_; - + /** quantity defining locations */ DENS_MAN * coordinates_; - + private: - + // do not define FeEngineInterface(); - + }; /** @@ -63,7 +63,7 @@ namespace ATC { class FeEngineInterfacePu : public FeEngineInterface { public: - + // constructor FeEngineInterfacePu(FE_Engine * feEngine) : FeEngineInterface(feEngine) {}; @@ -94,7 +94,7 @@ namespace ATC { class FeEngineInterfaceMls : public FeEngineInterface { public: - + // constructor FeEngineInterfaceMls(FE_Engine * feEngine) : FeEngineInterface(feEngine) {}; @@ -130,7 +130,7 @@ namespace ATC { ShapeFunctionBase(FE_Engine * feEngine, DENS_MAN * coordinates) : DependencyManager(), feEngineInterface_(feEngine), coordinates_(coordinates) {coordinates_->register_dependence(this)}; - + // destructor virtual ~ShapeFunctionBase() {coordinates_->remove_dependence(this)}; @@ -184,7 +184,7 @@ namespace ATC { * @class ShapeFunction * @class Defines general shape functions for restriction and interpolation */ - + class ShapeFunction : public ShapeFunctionBase { public: @@ -229,7 +229,7 @@ namespace ATC { /** apply a reset if needed */ virtual void reset(); - + /** storage for shape function values, indexed by rows of coordinates */ vector values; @@ -239,7 +239,7 @@ namespace ATC { ShapeFunction(); }; - + /** * @class ShapeFunctionAtomic * @class Defines shape functions for restriction and interpolation for atomic data @@ -329,7 +329,7 @@ namespace ATC { // destructor virtual ~ShapeFunctionAtomicMask() {mask_->remove_dependence(this);}; - + protected: @@ -350,7 +350,7 @@ namespace ATC { * @class ShapeFunctionGrad * @class Defines general shape gradients functions for restriction and interpolation */ - + class ShapeFunctionGrad : public ShapeFunctionBase { public: @@ -395,7 +395,7 @@ namespace ATC { /** apply a reset if needed */ virtual void reset(); - + /** storage for shape function gradients, indexed by rows of coordinates */ vector values; @@ -405,7 +405,7 @@ namespace ATC { ShapeFunctionGrad(); }; - + /** * @class ShapeFunctionGradAtomic * @class Defines shape functions gradients for restriction and interpolation for atomic data @@ -495,7 +495,7 @@ namespace ATC { // destructor virtual ~ShapeFunctionGradAtomicMask() {mask_->remove_dependence(this);}; - + protected: diff --git a/lib/atc/SparseMatrix-inl.h b/lib/atc/SparseMatrix-inl.h index 2923d6daa5..3a46c193f2 100644 --- a/lib/atc/SparseMatrix-inl.h +++ b/lib/atc/SparseMatrix-inl.h @@ -6,17 +6,17 @@ namespace ATC_matrix { -template +template TRI_COORD::TRI_COORD(INDEX row, INDEX col) : i(row), j(col) {} -template -TRI_COORD::TRI_COORD(INDEX row, INDEX col, T val, bool add_to) +template +TRI_COORD::TRI_COORD(INDEX row, INDEX col, T val, bool add_to) : i(row), j(col), v(val), add(add_to) {} - + //----------------------------------------------------------------------------- // default constructor - creates an empty sparsematrix with specified size //----------------------------------------------------------------------------- template -SparseMatrix::SparseMatrix(INDEX rows, INDEX cols) +SparseMatrix::SparseMatrix(INDEX rows, INDEX cols) : _val(nullptr), _ia(nullptr), _ja(nullptr), _size(0), _nRowsCRS(0), hasTemplate_(false), _nRows(rows),_nCols(cols) {} //----------------------------------------------------------------------------- @@ -26,16 +26,16 @@ template SparseMatrix::SparseMatrix(const SparseMatrix& C) : Matrix(), _val(nullptr), _ia(nullptr), _ja(nullptr), hasTemplate_(false) { - _copy(C); + _copy(C); } //----------------------------------------------------------------------------- // copy constructor - converts from DenseMatrix //----------------------------------------------------------------------------- template -SparseMatrix::SparseMatrix(const DenseMatrix& C) +SparseMatrix::SparseMatrix(const DenseMatrix& C) : Matrix(), _val(nullptr), _ia(nullptr), _ja(nullptr), hasTemplate_(false) { - reset(C); + reset(C); } //----------------------------------------------------------------------------- @@ -43,9 +43,9 @@ SparseMatrix::SparseMatrix(const DenseMatrix& C) // an array of col indeces, and an array of nonzero values. //----------------------------------------------------------------------------- template -SparseMatrix::SparseMatrix(INDEX* rows, INDEX* cols, T* vals, +SparseMatrix::SparseMatrix(INDEX* rows, INDEX* cols, T* vals, INDEX size, INDEX nRows, INDEX nCols, INDEX nRowsCRS) - : hasTemplate_(true) + : hasTemplate_(true) { _val = vals; _ia = rows; @@ -77,7 +77,7 @@ void SparseMatrix::_create(INDEX size, INDEX nrows) ERROR_FOR_BACKTRACE exit(EXIT_FAILURE); } - if (!_ia) return; + if (!_ia) return; // automatically handle the ends of rowpointer *_ia = 0; // first non-zero is the zero index _ia[_nRowsCRS] = _size; // last row pointer is the size @@ -88,7 +88,7 @@ void SparseMatrix::_create(INDEX size, INDEX nrows) template void SparseMatrix::_delete() { - + std::vector >().swap(_tri); // completely deletes _tri if (_val) delete [] _val; if (_ia) delete [] _ia; @@ -101,7 +101,7 @@ void SparseMatrix::_delete() // full memory copy of C into this //----------------------------------------------------------------------------- template -void SparseMatrix::_copy(const SparseMatrix &C) +void SparseMatrix::_copy(const SparseMatrix &C) { compress(C); _delete(); @@ -116,7 +116,7 @@ void SparseMatrix::_copy(const SparseMatrix &C) _nCols = C._nCols; _nRows = C._nRows; if (_nCols > 0 && _nRows > 0) hasTemplate_ = true; // needs if since map seems to call the copy instead of the default constructor -} +} // this version is accessible to derived classes template void SparseMatrix::copy(const SparseMatrix &C) @@ -138,21 +138,21 @@ void SparseMatrix::_set_equal(const Matrix &r) for (INDEX i=0; i*>(ptr_r)) this->reset(r); else - { + { std::cout <<"Error in general sparse matrix assignment\n"; exit(1); } -} +} // General flat index by value operator (by nth nonzero) -template inline T SparseMatrix::operator[](INDEX i) const +template inline T SparseMatrix::operator[](INDEX i) const { - VICK(i); return _val[i]; + VICK(i); return _val[i]; } // General flat index by reference operator (by nth nonzero) template inline T& SparseMatrix::operator[](INDEX i) { - VICK(i); return _val[i]; + VICK(i); return _val[i]; } template @@ -163,7 +163,7 @@ T SparseMatrix::_zero = T(0); //----------------------------------------------------------------------------- template bool triplet_comparision(const TRI_COORD &x, const TRI_COORD &y) -{ +{ const bool row_less = (x.i) < (y.i); const bool row_equal = (x.i) == (y.i); const bool col_less = (x.j) < (y.j); @@ -174,7 +174,7 @@ bool triplet_comparision(const TRI_COORD &x, const TRI_COORD &y) //----------------------------------------------------------------------------- template bool triplets_equal(const TRI_COORD &x, const TRI_COORD &y) -{ +{ return x.i==y.i && x.j==y.j; } //----------------------------------------------------------------------------- @@ -217,12 +217,12 @@ SparseMatrix operator*(const SparseMatrix &A, const DiagonalMatrix& D) { GCK(A, D, A.nCols()!=D.nRows(),"SparseMatrix * DiagonalMatrix") SparseMatrix C(A); // C has same sparcity as A - + // C(i,j) = A(i,k) * D(k, j) * j==k INDEX i, ij; - for (i=0; i operator*(const SparseMatrix &A, const SparseMatrix &B) SparseMatrix C(A.nRows(), B.nCols()); if (At.empty() || B.empty()) return C; - + INDEX k, ki, kj; INDEX K = std::min(At._nRowsCRS, B._nRowsCRS); for (k=0; k::compress() // Sort and find the number of unique triplets. // Triplet values will all be not present in existing CRS structure. - const INDEX nUnique = CountUniqueTriplets(); + const INDEX nUnique = CountUniqueTriplets(); // Max number of rows in new CRS structure. const INDEX nRows = std::max((INDEX)_tri.back().i+1, _nRowsCRS); - + // make a new CRS structure INDEX *ia = new INDEX [nRows+1]; INDEX *ja = new INDEX [nUnique]; @@ -296,7 +296,7 @@ void SparseMatrix::compress() INDEX i; for (i=1; i::compress() for (i=0; i=_size)) { next = nextTRI; // advance the triplet counter, and skip voided TRIPLET entries @@ -324,7 +324,7 @@ void SparseMatrix::compress() else if (crs_pt < _size) { next = nextCRS; // Advance the CRS counter, don't set next if we are at the end. - if (++crs_pt < _size) { + if (++crs_pt < _size) { // advance to the row corresponding to this value while (crs_pt >= _ia[crs_row+1]) { crs_row++; @@ -360,8 +360,8 @@ INDEX SparseMatrix::CountUniqueTriplets() if (_tri.empty()) return _size; std::sort(_tri.begin(), _tri.end(), triplet_comparision); INDEX nUnique=1 + _size; - - typename std::vector >::reverse_iterator t; + + typename std::vector >::reverse_iterator t; // Loop backwards over all new triplets. for (t = _tri.rbegin(); t+1!=_tri.rend(); ++t) { // If this triplet is the same as the preceding one. @@ -388,7 +388,7 @@ bool SparseMatrix::has_entry(INDEX i, INDEX j) const template bool SparseMatrix::has_entry_uncompressed(INDEX i, INDEX j) const { - for (unsigned k=0; k<_tri.size() ; k++) { + for (unsigned k=0; k<_tri.size() ; k++) { if (_tri[k].i == i && _tri[k].j == j) return true; } return false; @@ -416,7 +416,7 @@ bool SparseMatrix::has_template(void) const // Index by copy operator - return zero if not found //----------------------------------------------------------------------------- template -T SparseMatrix::operator()(INDEX i, INDEX j) const +T SparseMatrix::operator()(INDEX i, INDEX j) const { MICK(i,j); // Matrix Index ChecKing compress(*this); @@ -438,7 +438,7 @@ T& SparseMatrix::operator()(INDEX i, INDEX j) if (f>=_ia[i] && f<_ia[i+1] && _ja[f] == j) return _val[f]; } // NEVER use index operator as LHS to modify values not already in the - // sparcity pattern - the crude check below will only catch this on the + // sparcity pattern - the crude check below will only catch this on the // second infraction. if (_zero != T(0)) std::cout << "Use add or set for SparseMatrix\n"; return _zero; @@ -489,7 +489,7 @@ TRIPLET SparseMatrix::triplet(INDEX i) const if (i >= _ia[_nRowsCRS]) { gerror("ERROR: tried indexing triplet of sparse matrix beyond range"); } - + INDEX row(std::lower_bound(_ia, _ia+_nRowsCRS, i)-_ia); row -= _ia[row] != i; return TRIPLET(row, _ja[i], _val[i]); @@ -511,11 +511,11 @@ void SparseMatrix::reset(INDEX rows, INDEX cols, bool /* zero */) template void SparseMatrix::resize(INDEX rows, INDEX cols, bool copy) { -//if (copy) throw; +//if (copy) throw; if (_nRowsCRS>rows) { _delete(); } - if (copy) + if (copy) _nRows = rows; _nCols = cols; // a check on this would be expensive } @@ -523,7 +523,7 @@ void SparseMatrix::resize(INDEX rows, INDEX cols, bool copy) // get sparsity from DenseMatrix, if TOL < 0, then only zero values are added //----------------------------------------------------------------------------- template -void SparseMatrix::reset(const DenseMatrix& D, double TOL) +void SparseMatrix::reset(const DenseMatrix& D, double TOL) { _delete(); // clears all values // if TOL is specified then TOL = TOL^2 * max(abs(D))^2 @@ -558,8 +558,8 @@ void SparseMatrix::dense_copy(DenseMatrix & D ) const { SparseMatrix::compress(*this); D.reset(nRows(),nCols()); - for (INDEX i=0; i<_nRowsCRS; i++) - for (INDEX j=_ia[i]; j<_ia[i+1]; j++) + for (INDEX i=0; i<_nRowsCRS; i++) + for (INDEX j=_ia[i]; j<_ia[i+1]; j++) D(i, _ja[j]) = _val[j]; } template @@ -573,15 +573,15 @@ DenseMatrix SparseMatrix::dense_copy(void) const // returns true if the matrix has no non-zero elements //----------------------------------------------------------------------------- template -bool SparseMatrix::empty() const +bool SparseMatrix::empty() const { - return _size==0 && _tri.empty(); + return _size==0 && _tri.empty(); } //----------------------------------------------------------------------------- -// returns the number of rows specified by the user +// returns the number of rows specified by the user //----------------------------------------------------------------------------- template -inline INDEX SparseMatrix::nRows() const +inline INDEX SparseMatrix::nRows() const { return _nRows; } @@ -589,12 +589,12 @@ inline INDEX SparseMatrix::nRows() const // returns ?????????????????????? //----------------------------------------------------------------------------- template -inline INDEX SparseMatrix::nRowsCRS() const +inline INDEX SparseMatrix::nRowsCRS() const { return _nRowsCRS; } //----------------------------------------------------------------------------- -// returns the number of columns specified by the user +// returns the number of columns specified by the user //----------------------------------------------------------------------------- template inline INDEX SparseMatrix::nCols() const @@ -605,21 +605,21 @@ inline INDEX SparseMatrix::nCols() const // returns the number of non-zeros in the matrix //----------------------------------------------------------------------------- template -INDEX SparseMatrix::size() const +INDEX SparseMatrix::size() const { compress(*this); - return _size; + return _size; } //----------------------------------------------------------------------------- // returns the number of nonzero elements in a row //----------------------------------------------------------------------------- template -INDEX SparseMatrix::RowSize(INDEX r) const +INDEX SparseMatrix::RowSize(INDEX r) const { compress(*this); GCHK(r>=_nRows, "Rowsize: invalid row"); if (r >= _nRowsCRS) return 0; - return _ia[r+1]-_ia[r]; + return _ia[r+1]-_ia[r]; } //----------------------------------------------------------------------------- // returns a pointer to the data, causes a compress @@ -628,22 +628,22 @@ template T* SparseMatrix::ptr() const { compress(*this); - return _val; + return _val; } template INDEX* SparseMatrix::rows() const { compress(*this); - return _ia; + return _ia; } template INDEX* SparseMatrix::cols() const { compress(*this); - return _ja; + return _ja; } //----------------------------------------------------------------------------- -// returns true if (i,j) falls in the user specified range +// returns true if (i,j) falls in the user specified range //----------------------------------------------------------------------------- template bool SparseMatrix::in_range(INDEX i, INDEX j) const @@ -654,7 +654,7 @@ bool SparseMatrix::in_range(INDEX i, INDEX j) const // assigns this sparsematrix from another one - full memory copy //----------------------------------------------------------------------------- template -SparseMatrix& SparseMatrix::operator=(const SparseMatrix &C) +SparseMatrix& SparseMatrix::operator=(const SparseMatrix &C) { _delete(); _copy(C); @@ -673,7 +673,7 @@ SparseMatrix& SparseMatrix::operator=(const T v) // scales this sparse matrix by a constant //----------------------------------------------------------------------------- template -void SparseMatrix::set_all_elements_to(const T &a) +void SparseMatrix::set_all_elements_to(const T &a) { compress(*this); for (INDEX i=0; i::set_all_elements_to(const T &a) // scales this sparse matrix by a constant //----------------------------------------------------------------------------- template -SparseMatrix& SparseMatrix::operator*=(const T &a) +SparseMatrix& SparseMatrix::operator*=(const T &a) { compress(*this); for (INDEX i=0; i& SparseMatrix::operator*=(const SparseMatrix &a) } //----------------------------------------------------------------------------- -// Adds two sparse matrices together. +// Adds two sparse matrices together. //----------------------------------------------------------------------------- template -SparseMatrix& SparseMatrix::operator+=(const SparseMatrix & R) +SparseMatrix& SparseMatrix::operator+=(const SparseMatrix & R) { compress(R); @@ -711,16 +711,16 @@ SparseMatrix& SparseMatrix::operator+=(const SparseMatrix & R) T *Rval = R.ptr(); int nRowsCRS = R.nRowsCRS(); - + int rowR, colR; T valR; - for (rowR = 0; rowR < nRowsCRS; ++rowR) { + for (rowR = 0; rowR < nRowsCRS; ++rowR) { for (int j = Ria[rowR]; j < Ria[rowR+1]; ++j) { colR = Rja[j]; valR = Rval[j]; - - // Because we simply want to add the value, we call add and let compress + + // Because we simply want to add the value, we call add and let compress // take care of the rest--we don't have to worry about extant entries. add(rowR, colR, valR); } @@ -729,13 +729,13 @@ SparseMatrix& SparseMatrix::operator+=(const SparseMatrix & R) } //----------------------------------------------------------------------------- -// Return matrix transpose +// Return matrix transpose //----------------------------------------------------------------------------- template -SparseMatrix SparseMatrix::transpose() const +SparseMatrix SparseMatrix::transpose() const { compress(*this); - SparseMatrix At(nCols(), nRows()); + SparseMatrix At(nCols(), nRows()); for (INDEX i=0; i<_nRowsCRS; i++) for (INDEX ij=_ia[i]; ij<_ia[i+1]; ij++) @@ -753,7 +753,7 @@ SparseMatrix& SparseMatrix::row_scale(const Vector &v) compress(*this); INDEX i,ij; GCK(*this, v, v.size()!=nRows(), "Incompatible Vector length in row_scale."); - for(i=0; i<_nRowsCRS; i++) + for(i=0; i<_nRowsCRS; i++) for(ij=_ia[i]; ij<_ia[i+1]; ij++) _val[ij] *= v[i]; return *this; } @@ -766,7 +766,7 @@ SparseMatrix& SparseMatrix::col_scale(const Vector &v) compress(*this); INDEX i,ij; GCK(*this, v, v.size()!=nCols(), "Incompatible Vector length in col_scale."); - for(i=0; i<_nRowsCRS; i++) + for(i=0; i<_nRowsCRS; i++) for(ij=_ia[i]; ij<_ia[i+1]; ij++) _val[ij] *= v[_ja[ij]]; return *this; } @@ -780,7 +780,7 @@ DenseVector SparseMatrix::col_sum() const INDEX i,ij; GCHK(!nRows(), "SparseMatrix::Matrix not initialized in col_sum.") DenseVector csum(nCols()); - for(i=0; i<_nRowsCRS; i++) + for(i=0; i<_nRowsCRS; i++) for(ij=_ia[i]; ij<_ia[i+1]; ij++) csum(_ja[ij]) += _val[ij]; return(csum); } @@ -793,8 +793,8 @@ DenseVector SparseMatrix::column_count() const compress(*this); INDEX i,j; DenseVector counts(nCols()); - - for (i=0; i<_nRowsCRS; i++) + + for (i=0; i<_nRowsCRS; i++) for(j=_ia[i]; j<_ia[i+1]; j++) counts(_ja[j])++; return(counts); } @@ -802,7 +802,7 @@ DenseVector SparseMatrix::column_count() const // Writes a the nonzeros of a row to a vector //----------------------------------------------------------------------------- template -void SparseMatrix::row(INDEX i, DenseVector& row, DenseVector& indx) const +void SparseMatrix::row(INDEX i, DenseVector& row, DenseVector& indx) const { compress(*this); GCHK(i>=nRows(), "get_row() - invalid row number"); @@ -814,7 +814,7 @@ void SparseMatrix::row(INDEX i, DenseVector& row, DenseVector& indx row.resize(RowSize(i)); indx.resize(row.size()); INDEX idx=0, ij; - for(ij=_ia[i]; ij<_ia[i+1]; ij++) + for(ij=_ia[i]; ij<_ia[i+1]; ij++) { row(idx) = _val[ij]; indx(idx++) = _ja[ij]; @@ -825,7 +825,7 @@ void SparseMatrix::row(INDEX i, DenseVector& row, DenseVector& indx //----------------------------------------------------------------------------- template void SparseMatrix:: -weighted_least_squares(const SparseMatrix &N, const DiagonalMatrix &D) +weighted_least_squares(const SparseMatrix &N, const DiagonalMatrix &D) { compress(N); GCK(N,D,N.nRows()!=D.nRows(),"SparseMatrix::WeightedLeastSquares()"); @@ -841,17 +841,17 @@ weighted_least_squares(const SparseMatrix &N, const DiagonalMatrix &D) compress(); } //----------------------------------------------------------------------------- -// Return a diagonal matrix containing the diagonal entries of this matrix +// Return a diagonal matrix containing the diagonal entries of this matrix //----------------------------------------------------------------------------- template -DiagonalMatrix SparseMatrix::diag() const +DiagonalMatrix SparseMatrix::diag() const { compress(*this); DiagonalMatrix D(nRows(), true); // initialized to zero INDEX i, ij; for (i=0; i<_nRowsCRS; i++) - { - for(ij=_ia[i]; ij<_ia[i+1]; ij++) + { + for(ij=_ia[i]; ij<_ia[i+1]; ij++) { if (_ja[ij]>=i) // have we reached or passed the diagonal? { @@ -866,14 +866,14 @@ DiagonalMatrix SparseMatrix::diag() const // Return a diagonal matrix containing row-sum lumped entries of the matrix //----------------------------------------------------------------------------- template -DiagonalMatrix SparseMatrix::row_sum_lump() const +DiagonalMatrix SparseMatrix::row_sum_lump() const { compress(*this); DiagonalMatrix D(nRows(), true); // initialized to zero INDEX i, ij; for (i=0; i<_nRowsCRS; i++) - { - for(ij=_ia[i]; ij<_ia[i+1]; ij++) + { + for(ij=_ia[i]; ij<_ia[i+1]; ij++) { D(i,i) += _val[ij]; } @@ -884,14 +884,14 @@ DiagonalMatrix SparseMatrix::row_sum_lump() const // output function - builds a string with each nonzero triplet value //----------------------------------------------------------------------------- template -std::string SparseMatrix::to_string() const +std::string SparseMatrix::to_string() const { compress(*this); - std::string out; + std::string out; INDEX i, ij; for(i=0; i<_nRowsCRS; i++) { - for(ij=_ia[i]; ij<_ia[i+1]; ij++) + for(ij=_ia[i]; ij<_ia[i+1]; ij++) { if (ij) out += "\n"; // append newline if not first nonzero out += "(" + ATC_Utility::to_string(i) + ", "; // append "(i," @@ -905,7 +905,7 @@ std::string SparseMatrix::to_string() const // returns the maximum value in the row //----------------------------------------------------------------------------- template -T SparseMatrix::row_max(INDEX row) const +T SparseMatrix::row_max(INDEX row) const { compress(*this); if (!RowSize(row)) return (T)0; // if there are no nonzeros in the row @@ -918,7 +918,7 @@ T SparseMatrix::row_max(INDEX row) const // returns the minimum value in the row //----------------------------------------------------------------------------- template -T SparseMatrix::row_min(INDEX row) const +T SparseMatrix::row_min(INDEX row) const { compress(*this); if (!RowSize(row)) return (T)0; // if there are no nonzeros in the row @@ -931,13 +931,13 @@ T SparseMatrix::row_min(INDEX row) const // prints a histogram of the values of a row to the screen //----------------------------------------------------------------------------- template -void SparseMatrix::print_row_histogram(const std::string &name, INDEX nbins) const +void SparseMatrix::print_row_histogram(const std::string &name, INDEX nbins) const { compress(*this); std::cout << "Begin histogram " << name << "\n"; - std::cout << "# rows: " << _nRows << " columns: " << _nCols + std::cout << "# rows: " << _nRows << " columns: " << _nCols << " size: " << _size << "\n"; - for(INDEX i=0; i<_nRows; i++) + for(INDEX i=0; i<_nRows; i++) { print_row_histogram(i, nbins); std::cout << "\n"; @@ -948,7 +948,7 @@ void SparseMatrix::print_row_histogram(const std::string &name, INDEX nbins) // prints a histogram of the values of a row to the screen //----------------------------------------------------------------------------- template -void SparseMatrix::print_row_histogram(INDEX row, INDEX nbins) const +void SparseMatrix::print_row_histogram(INDEX row, INDEX nbins) const { compress(*this); if (!nbins) nbins++; @@ -958,9 +958,9 @@ void SparseMatrix::print_row_histogram(INDEX row, INDEX nbins) const const T range = max-min; const double bin_size = range/double(nbins); if (range<=0.0) counts[nbins-1]=RowSize(row); - else + else { - for(INDEX ij=_ia[row]; ij<_ia[row+1]; ij++) + for(INDEX ij=_ia[row]; ij<_ia[row+1]; ij++) { INDEX bin = INDEX((_val[ij]-min)/bin_size); counts[bin-(bin==nbins)]++; @@ -969,7 +969,7 @@ void SparseMatrix::print_row_histogram(INDEX row, INDEX nbins) const std::cout<::print_row_histogram(INDEX row, INDEX nbins) const // prints the triplets the screen //----------------------------------------------------------------------------- template -void SparseMatrix::print_triplets() const +void SparseMatrix::print_triplets() const { typename std::vector >::const_iterator t; std::string out; @@ -999,13 +999,13 @@ void SparseMatrix::print_triplets() const // Outputs a string to a sparse Matlab type //----------------------------------------------------------------------------- template -void SparseMatrix::matlab(std::ostream &o, const std::string &s) const +void SparseMatrix::matlab(std::ostream &o, const std::string &s) const { compress(*this); INDEX i, ij; o << s <<" = sparse(" << nRows() << "," << nCols() << ");\n"; o << std::showbase << std::scientific; - for(i=0; i<_nRowsCRS; i++) + for(i=0; i<_nRowsCRS; i++) for(ij=_ia[i]; ij<_ia[i+1]; ij++) o<::matlab(std::ostream &o, const std::string &s) const template void SparseMatrix::binary_write(std::fstream& f) const { - compress(*this); - f.write((char*)&_size, sizeof(INDEX)); // writes number of nonzeros + compress(*this); + f.write((char*)&_size, sizeof(INDEX)); // writes number of nonzeros f.write((char*)&_nRowsCRS, sizeof(INDEX)); // writes number of rows in crs f.write((char*)&_nRows, sizeof(INDEX)); // write matrix rows f.write((char*)&_nCols, sizeof(INDEX)); // write number of columns if (!_size) return; - f.write((char*)_val, sizeof(T) *_size); - f.write((char*)_ja, sizeof(INDEX)*_size); - f.write((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1)); + f.write((char*)_val, sizeof(T) *_size); + f.write((char*)_ja, sizeof(INDEX)*_size); + f.write((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1)); } //----------------------------------------------------------------------------- // Reads a SparseMatrix from a binary file. (wipes out any original data) @@ -1041,7 +1041,7 @@ void SparseMatrix::binary_read(std::fstream& f) _create(_size,_nRowsCRS); f.read((char*)_val, sizeof(T)*_size); f.read((char*)_ja, sizeof(INDEX)*_size); - f.read((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1)); + f.read((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1)); } //----------------------------------------------------------------------------- diff --git a/lib/atc/SparseMatrix.h b/lib/atc/SparseMatrix.h index 700d2f3af6..2d219c8963 100644 --- a/lib/atc/SparseMatrix.h +++ b/lib/atc/SparseMatrix.h @@ -10,7 +10,7 @@ namespace ATC_matrix { * @struct TRI_COORD * @brief Triplet SparseMatrix entry */ -template +template struct TRI_COORD { TRI_COORD(INDEX row=0, INDEX col=0); @@ -25,7 +25,7 @@ void ParMultAB(MPI_Comm comm, const SparseMatrix& A, const Matrix& B, Dens /** * @class SparseMatrix - * @brief Stores data in triplet format or CRS format + * @brief Stores data in triplet format or CRS format */ template class SparseMatrix : public Matrix @@ -50,10 +50,10 @@ public: SparseMatrix(INDEX rows=0, INDEX cols=0); SparseMatrix(const SparseMatrix& c); SparseMatrix(const DenseMatrix& c); - SparseMatrix(INDEX* rows, INDEX* cols, T* vals, INDEX size, + SparseMatrix(INDEX* rows, INDEX* cols, T* vals, INDEX size, INDEX nRows, INDEX nCols, INDEX nRowsCRS); virtual ~SparseMatrix() { _delete(); } - + //* General index by value (requires a binary search on the row) T operator()(INDEX i, INDEX j) const; //* General index by reference (requires a binary search on the row) @@ -74,10 +74,10 @@ public: //* only changes the bounds of the matrix, no deletion void resize(INDEX rows=0, INDEX cols=0, bool zero=true); //* reset - from DenseMatrix - this will be SLOW - void reset(const DenseMatrix& D, double TOL=-1.0); + void reset(const DenseMatrix& D, double TOL=-1.0); //* copy data void copy(const T * ptr, INDEX rows=0, INDEX cols=0); - + void dense_copy(DenseMatrix& D) const; DenseMatrix dense_copy(void) const; @@ -87,7 +87,7 @@ public: INDEX nRows() const; INDEX nRowsCRS() const; //* returns the user-specified number of cols - INDEX nCols() const; + INDEX nCols() const; //* returns the number of non-zero elements INDEX size() const; //* returns the number of non-zeros in a row @@ -248,23 +248,23 @@ public: //! Reads a SparseMatrix from a binary file. (wipes out any original data) void binary_read(std::fstream& f); //* Dump templated type to disk; operation not safe for all types - void write_restart(FILE *f) const; + void write_restart(FILE *f) const; /* * \section Utility functions */ //* converts all triplets and merges with CRS - void compress(); + void compress(); //* converts T to CRS - static void compress(const SparseMatrix &C); + static void compress(const SparseMatrix &C); //* sorts and returns the # of unique triplets - INDEX CountUniqueTriplets(); + INDEX CountUniqueTriplets(); private: //* creates a CRS structure void _create(INDEX size, INDEX nrows); //* clears all memory and nulls references - void _delete(); + void _delete(); //* copies all data from another SparseMatrix void _copy(const SparseMatrix &C); //* general sparse matrix assignment @@ -279,7 +279,7 @@ protected: T * _val; // matrix non-zeros INDEX *_ia, *_ja; // ptrs to rows, column indexes INDEX _size, _nRowsCRS; // # of non-zeros, rows - bool hasTemplate_; + bool hasTemplate_; void copy(const SparseMatrix &C); @@ -287,7 +287,7 @@ protected: mutable std::vector > _tri; /* * \section User specified variables - */ + */ INDEX _nRows, _nCols; static T _zero; }; diff --git a/lib/atc/SparseVector-inl.h b/lib/atc/SparseVector-inl.h index 7f2c844bd6..81fed4d538 100644 --- a/lib/atc/SparseVector-inl.h +++ b/lib/atc/SparseVector-inl.h @@ -10,7 +10,7 @@ SparseVector sparse_rand(INDEX n, INDEX fill, int seed=1234) srand(seed); const double rmax_inv = 1.0/double(RAND_MAX); SparseVector r(n); - while (r.size() &a, const SparseVector &b) STORE::const_iterator bi=b.data_.find(ai->first); if (bi == b.data_.end()) continue; v += ai->second * bi->second; - } + } return v; } // Computes the product of a SparseMatrix transpose with a SparseVector (M'*v). @@ -70,7 +70,7 @@ SparseVector operator*(const SparseMatrix &M, const SparseVector &v) } if (yi!=0.0) y(i)+=yi; } - return y; + return y; } // computes the product of a SparseMatrix transpose with a SparseVector (M'*v). @@ -81,7 +81,7 @@ SparseVector operator*(const SparseVector &v, const SparseMatrix &M) for (INDEX i=0; isecond * M._v[ij]; } return y; @@ -104,7 +104,7 @@ std::string SparseVector::to_string() const return str; } -// Indexes the ith component of the vector or returns zero if not found. +// Indexes the ith component of the vector or returns zero if not found. template T SparseVector::operator()(INDEX i, INDEX /* j */) const { @@ -113,27 +113,27 @@ T SparseVector::operator()(INDEX i, INDEX /* j */) const return it->second; } -// Indexes the ith component of the vector or returns zero if not found. +// Indexes the ith component of the vector or returns zero if not found. template T& SparseVector::operator()(INDEX i, INDEX /* j */) { - return data_[i]; + return data_[i]; } -// Indexes the ith component of the vector or returns zero if not found. +// Indexes the ith component of the vector or returns zero if not found. template T SparseVector::operator[](INDEX i) const { return (*this)(i); } -// Indexes the ith component of the vector or returns zero if not found. +// Indexes the ith component of the vector or returns zero if not found. template T& SparseVector::operator[](INDEX i) { return (*this)(i); } // Returns a pair (index, value) for a nonzero in the vector. -template +template std::pair SparseVector::pair(INDEX i) const { STORE::const_iterator it=data_.begin() + i; @@ -141,7 +141,7 @@ std::pair SparseVector::pair(INDEX i) const } //* Adds SparseVector x, scaled by s to this one. Can be different sparcity. -template +template void SparseVector::add_scaled(SparseVector& x, const T& s) { STORE::const_iterator it; @@ -212,7 +212,7 @@ void SparseVector::write_restart(FILE */* F */) const { } -// writes a stream to a matlab script to recreate this variable +// writes a stream to a matlab script to recreate this variable template void SparseVector::matlab(std::ostream &o, const std::string &s) const { diff --git a/lib/atc/SparseVector.h b/lib/atc/SparseVector.h index d387b45b66..e2d6720193 100644 --- a/lib/atc/SparseVector.h +++ b/lib/atc/SparseVector.h @@ -12,8 +12,8 @@ template class SparseVector; template T dot(const SparseVector &a, const SparseVector &b); /** - * @class SparseVector - * @brief Class for vectors that contain a majority of zero elements and provides relevant operations + * @class SparseVector + * @brief Class for vectors that contain a majority of zero elements and provides relevant operations */ template @@ -37,17 +37,17 @@ class SparseVector : public Vector { public: //* Constructor - sets length of vector (NOT # of nonzeros). SparseVector(INDEX length=0); - //* Copies another SparseVector - SparseVector(const SparseVector &c); + //* Copies another SparseVector + SparseVector(const SparseVector &c); //* Copies a general Vector (avoid if possible, its going to be slow). - SparseVector(const Vector &c); + SparseVector(const Vector &c); //* Overrides output to string function to list only nonzeros and indices. std::string to_string() const; //* Indexing operators (w/ const overloading). //@{ T operator()(INDEX i, INDEX j=0) const; - + T& operator()(INDEX i, INDEX j=0); T operator[](INDEX i) const; T& operator[](INDEX i); @@ -88,9 +88,9 @@ protected: //@{ SparseVector(const Matrix &c); SparseVector& operator=(Matrix &c); - T* ptr() const {return nullptr; } + T* ptr() const {return nullptr; } //@} - + STORE data_; //*> sparse data structure INDEX length_; //*> number of rows }; @@ -98,6 +98,6 @@ protected: } // end namespace #include "SparseVector-inl.h" -#undef STORE +#undef STORE #endif diff --git a/lib/atc/SpeciesTimeIntegrator.cpp b/lib/atc/SpeciesTimeIntegrator.cpp index 3215b159f8..98e4e10268 100644 --- a/lib/atc/SpeciesTimeIntegrator.cpp +++ b/lib/atc/SpeciesTimeIntegrator.cpp @@ -24,7 +24,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor // Grab data from ATC - //-------------------------------------------------------- + //-------------------------------------------------------- SpeciesTimeIntegrator::SpeciesTimeIntegrator(ATC_CouplingMass * atc, TimeIntegrationType timeIntegrationType) : TimeIntegrator(atc, timeIntegrationType), @@ -88,7 +88,7 @@ namespace ATC { //-------------------------------------------------------- void SpeciesTimeIntegrator::pack_fields(RESTART_LIST & data) { - + TimeIntegrator::pack_fields(data); } @@ -101,7 +101,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor // Grab data from ATC - //-------------------------------------------------------- + //-------------------------------------------------------- SpeciesIntegrationMethod::SpeciesIntegrationMethod(SpeciesTimeIntegrator * speciesTimeIntegrator, const map > & moleculeIds) : TimeIntegrationMethod(speciesTimeIntegrator), @@ -124,10 +124,10 @@ namespace ATC { void SpeciesIntegrationMethod::construct_transfers() { InterscaleManager & interscaleManager = atc_->interscale_manager(); - + // get existing data nodalAtomicMassDensity_ = interscaleManager.dense_matrix(field_to_intrinsic_name(MASS_DENSITY)); - if (atc_->has_tracked_species()) + if (atc_->has_tracked_species()) nodalAtomicSpeciesConcentration_ = interscaleManager.dense_matrix(field_to_intrinsic_name(SPECIES_CONCENTRATION)); } @@ -139,7 +139,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- SpeciesTimeIntegratorFractionalStep::SpeciesTimeIntegratorFractionalStep(SpeciesTimeIntegrator * speciesTimeIntegrator, const map > & moleculeIds) : SpeciesIntegrationMethod(speciesTimeIntegrator,moleculeIds) @@ -161,10 +161,10 @@ namespace ATC { } if (!timeFilterManager->end_equilibrate()) { - nodalAtomicSpeciesConcentrationFiltered_ = nodalAtomicSpeciesConcentration_->quantity(); + nodalAtomicSpeciesConcentrationFiltered_ = nodalAtomicSpeciesConcentration_->quantity(); } - + pre_final_integrate1(0.); } @@ -172,7 +172,7 @@ namespace ATC { // pre_initial_integrate1 //-------------------------------------------------------- void SpeciesTimeIntegratorFractionalStep::pre_initial_integrate1(double dt) - { + { const DENS_MAT & my(nodalAtomicSpeciesConcentration_->quantity()); // updated filtered energy using explicit-implicit scheme timeFilter_->apply_pre_step1(nodalAtomicSpeciesConcentrationFiltered_.set_quantity(), @@ -182,15 +182,15 @@ namespace ATC { //-------------------------------------------------------- // pre_final_integrate1 - // first time integration computations + // first time integration computations // before FractionalStep step 2 //-------------------------------------------------------- void SpeciesTimeIntegratorFractionalStep::pre_final_integrate1(double /* dt */) { // Compute MD contribution to FEM equation - - - massDensity_ = nodalAtomicMassDensity_->quantity(); + + + massDensity_ = nodalAtomicMassDensity_->quantity(); speciesConcentration_ = nodalAtomicSpeciesConcentration_->quantity(); atc_->set_fixed_nodes(); } @@ -204,7 +204,7 @@ namespace ATC { timeFilter_->apply_post_step1( nodalAtomicSpeciesConcentrationFiltered_.set_quantity(), nodalAtomicSpeciesConcentration_->quantity(),dt); - speciesConcentration_ = nodalAtomicSpeciesConcentrationFiltered_.quantity(); + speciesConcentration_ = nodalAtomicSpeciesConcentrationFiltered_.quantity(); } //-------------------------------------------------------- @@ -213,7 +213,7 @@ namespace ATC { //-------------------------------------------------------- void SpeciesTimeIntegratorFractionalStep::post_process() { - + map >::const_iterator molecule; for (molecule = moleculeIds_.begin(); molecule != moleculeIds_.end(); molecule++) { DENS_MAN & nodalMoleculeMassDensityOut(atc_->tagged_dens_man(molecule->first)); diff --git a/lib/atc/SpeciesTimeIntegrator.h b/lib/atc/SpeciesTimeIntegrator.h index 64cc07022c..01e1659a09 100644 --- a/lib/atc/SpeciesTimeIntegrator.h +++ b/lib/atc/SpeciesTimeIntegrator.h @@ -13,48 +13,48 @@ namespace ATC { // forward declarations class ATC_CouplingMass; class SpeciesIntegrationMethod; - + /** * @class SpeciesTimeIntegrator * @brief Class for various time integrators for species FE quantities in the Eulerian frame * (handles parsing and stores basic data structures) */ - + class SpeciesTimeIntegrator : public TimeIntegrator { - + public: - + // constructor SpeciesTimeIntegrator(ATC_CouplingMass * atc, TimeIntegrationType timeIntegrationType); - + // destructor virtual ~SpeciesTimeIntegrator(){}; - + /** parser/modifier */ virtual bool modify(int narg, char **arg); - + /** create objects to implement requested numerical method */ virtual void construct_methods(); - + /** pack persistent fields */ virtual void pack_fields(RESTART_LIST & data); - + DENS_MAN & nodal_atomic_species_concentration_filtered() { return nodalAtomicSpeciesConcentrationFiltered_; } protected: - + /** sets of molecules tracked */ const std::map > & moleculeIds_; /** data */ DENS_MAN nodalAtomicSpeciesConcentrationFiltered_; - + private: - + // DO NOT define this SpeciesTimeIntegrator(); - + }; /** @@ -63,31 +63,31 @@ namespace ATC { */ class SpeciesIntegrationMethod : public TimeIntegrationMethod { - + public: - + // constructor SpeciesIntegrationMethod(SpeciesTimeIntegrator * speciesTimeIntegrator, const std::map > & moleculeIds); - + // destructor virtual ~SpeciesIntegrationMethod() {nodalAtomicMassDensity_=nullptr;}; /** create and get necessary transfer operators */ virtual void construct_transfers(); - + protected: /** time filtering object */ TimeFilter * timeFilter_; /** finite element mass density field */ DENS_MAN & massDensity_; - + /** atomic nodal mass density field */ // OBSOLETE? DENS_MAN & nodalAtomicMassDensityOut_; DENS_MAN * nodalAtomicMassDensity_; - + /** finite element mass density field */ DENS_MAN & speciesConcentration_; DENS_MAN * nodalAtomicSpeciesConcentration_; @@ -100,7 +100,7 @@ namespace ATC { // DO NOT define this SpeciesIntegrationMethod(); - + }; /** @@ -111,19 +111,19 @@ namespace ATC { */ class SpeciesTimeIntegratorFractionalStep : public SpeciesIntegrationMethod { - + public: - + // constructor SpeciesTimeIntegratorFractionalStep(SpeciesTimeIntegrator * speciesTimeIntegrator, const std::map > & moleculeIds); - + // destructor virtual ~SpeciesTimeIntegratorFractionalStep(){}; /** pre time integration */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer virtual void pre_initial_integrate1(double dt); virtual void pre_final_integrate1(double dt); @@ -131,12 +131,12 @@ namespace ATC { /** post processing step before output */ virtual void post_process(); - + private: - + // DO NOT define this SpeciesTimeIntegratorFractionalStep(); - + }; /** * @class SpeciesTimeIntegratorFractionalStepFiltered @@ -146,19 +146,19 @@ namespace ATC { */ class SpeciesTimeIntegratorFractionalStepFiltered : public SpeciesTimeIntegratorFractionalStep { - + public: - + // constructor SpeciesTimeIntegratorFractionalStepFiltered(SpeciesTimeIntegrator * speciesTimeIntegrator, const std::map > & moleculeIds); - + // destructor virtual ~SpeciesTimeIntegratorFractionalStepFiltered(){}; /** pre time integration */ virtual void initialize() {}; - + // time step methods, corresponding to ATC_Transfer /** first part of pre_final_integrate */ virtual void pre_final_integrate1(double dt); @@ -167,10 +167,10 @@ namespace ATC { virtual void post_process(){}; private: - + // DO NOT define this SpeciesTimeIntegratorFractionalStepFiltered(); - + }; }; diff --git a/lib/atc/Stress.cpp b/lib/atc/Stress.cpp index a1445bd8ea..90608dad15 100644 --- a/lib/atc/Stress.cpp +++ b/lib/atc/Stress.cpp @@ -1,9 +1,9 @@ #include "Stress.h" #include "CauchyBorn.h" #include "CBLattice.h" -#include "CbLjCut.h" -#include "CbLjSmoothLinear.h" -#include "CbEam.h" +#include "CbLjCut.h" +#include "CbLjSmoothLinear.h" +#include "CbEam.h" #include "ATC_Error.h" #include "LammpsInterface.h" #include "VoigtOperations.h" @@ -24,7 +24,7 @@ using std::fstream; namespace ATC { //============================================================================= -// extracts a stress at an integration point +// extracts a stress at an integration point // Note: Utility function: not in header //============================================================================= DENS_MAT extract_stress(const DENS_MAT_VEC &sigma, INDEX ip=0) @@ -41,7 +41,7 @@ double compute_pressure(const DENS_MAT_VEC &sigma, const DENS_MAT &F) { // pressure in units (mass-velocity^2)/Volume (LAMMPS real) double p = (sigma[0](0,0) + sigma[1](0,1) + sigma[2](0,2)) * (1.0/3.0); - p *= 1.0e14/6.0221415; // convert from units real to Pa + p *= 1.0e14/6.0221415; // convert from units real to Pa p *= 1.0/101235.0; // convert from Pa to ATM return p * pow(det(F), -1.0/3.0); // convert from PK2 to Cauchy stress } @@ -55,7 +55,7 @@ void deformation_gradient(const DENS_MAT_VEC &du, INDEX q, MATRIX &F) for (INDEX j=0; jsecond)[0]).nRows(); energy.reset(nRows,1); ATC::LammpsInterface::instance()->print_msg("WARNING: returning dummy elastic energy"); - + } //============================================================================= // isotropic linear elastic //============================================================================= -StressLinearElastic::StressLinearElastic(fstream &fileId) +StressLinearElastic::StressLinearElastic(fstream &fileId) : StressCubicElastic(), E_(0), nu_(0), mu_(0), lambda_(0) { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); @@ -88,8 +88,8 @@ StressLinearElastic::StressLinearElastic(fstream &fileId) StressCubicElastic::c11_ = E_*(1-nu_)/(1+nu_)/(1-2*nu_); StressCubicElastic::c12_ = E_*nu_ /(1+nu_)/(1-2*nu_); StressCubicElastic::c44_ = E_/(1+nu_)/2; - if (nu_ < 0.0 || nu_ > 1.0) - throw ATC_Error("bad linear elastic constants"); + if (nu_ < 0.0 || nu_ > 1.0) + throw ATC_Error("bad linear elastic constants"); if (lambda_ < 0.0 || mu_ < 0.0) throw ATC_Error("bad continuum material parameter"); return; @@ -141,7 +141,7 @@ StressLinearElastic::StressLinearElastic(fstream &fileId) //============================================================================= // cubic elastic //============================================================================= -StressCubicElastic::StressCubicElastic(fstream &fileId) +StressCubicElastic::StressCubicElastic(fstream &fileId) : c11_(0), c12_(0), c44_(0) { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); @@ -152,16 +152,16 @@ StressCubicElastic::StressCubicElastic(fstream &fileId) else if (line[0]=="c11") c11_ = str2dbl(line[1]); else if (line[0]=="c12") c12_ = str2dbl(line[1]); else if (line[0]=="c44") c44_ = str2dbl(line[1]); - else throw ATC_Error( "unrecognized material function"); + else throw ATC_Error( "unrecognized material function"); } } //--------------------------------------------------------------------------- // compute the stress at N integration points from the displacement gradient -// T_{ij} = 1/2*C_{ijkl}*(u_{k,l} + u_{l,k}) +// T_{ij} = 1/2*C_{ijkl}*(u_{k,l} + u_{l,k}) //--------------------------------------------------------------------------- void StressCubicElastic::stress(const FIELD_MATS & /* fields */, const GRAD_FIELD_MATS &gradFields, - DENS_MAT_VEC &sigma) + DENS_MAT_VEC &sigma) { GRAD_FIELD_MATS::const_iterator du_itr = gradFields.find(DISPLACEMENT); const DENS_MAT_VEC &du = du_itr->second; @@ -197,7 +197,7 @@ StressCubicElastic::StressCubicElastic(fstream &fileId) //--------------------------------------------------------------------------- // compute the elastic energy at N integration points from displacement gradient // E = 1/8*C_{ijkl}* (u_{k,l} + u_{l,k})* (u_{i,j} + u_{j,i})*rho ? -// = 1/2 (4 c44 (u12^2 + u13^2 + u23^2) + 2 c12 (u11 u22 + u11 u33 + u22 u33) +// = 1/2 (4 c44 (u12^2 + u13^2 + u23^2) + 2 c12 (u11 u22 + u11 u33 + u22 u33) // + c11 (u11^2 + u22^2 + u33^2)) //--------------------------------------------------------------------------- void StressCubicElastic::elastic_energy(const FIELD_MATS & /* fields */, @@ -223,21 +223,21 @@ StressCubicElastic::StressCubicElastic(fstream &fileId) const double c44 = c44_; //double scale = (ATC::LammpsInterface::instance()->mvv2e()); for (INDEX gp=0; gp line; @@ -315,8 +315,8 @@ StressCauchyBorn::StressCauchyBorn(fstream &fileId, CbData &cb) if (line.empty()) continue; // skip blank lines else if (line[0]=="end") { delete cblattice_; - if (!potential_) throw ATC_Error( "no potential defined"); - cblattice_ = new CBLattice(cbdata_.cell_vectors, cbdata_.basis_vectors); + if (!potential_) throw ATC_Error( "no potential defined"); + cblattice_ = new CBLattice(cbdata_.cell_vectors, cbdata_.basis_vectors); return; } else if (line[0] == "pair_style") { @@ -324,7 +324,7 @@ StressCauchyBorn::StressCauchyBorn(fstream &fileId, CbData &cb) if (line.size()<3) throw(ATC_Error("no lj/cut cutoff radius")); const double rc = str2dbl(line[2]); while (!fileId.eof()) { // find next pair_coeff command - command_line(fileId, line); + command_line(fileId, line); if (line.size() && line[0]=="pair_coeff") break; } if (line[0] != "pair_coeff" || line.size() != 3) { @@ -346,7 +346,7 @@ StressCauchyBorn::StressCauchyBorn(fstream &fileId, CbData &cb) delete potential_; potential_ = new CbLjSmoothLinear(str2dbl(line[1]), str2dbl(line[2]), rc); } - else if (line[1] == "eam") { // Embedded atom method potential + else if (line[1] == "eam") { // Embedded atom method potential delete potential_; potential_ = new CbEam(); } @@ -356,7 +356,7 @@ StressCauchyBorn::StressCauchyBorn(fstream &fileId, CbData &cb) else if (line[0] == "temperature" && line.size() == 2) { fixed_temperature_ = str2dbl(line[1]); } - else if (line[0]=="material" || line[0]=="stress") /* ignore this */; + else if (line[0]=="material" || line[0]=="stress") /* ignore this */; else throw ATC_Error( "Unrecognized Cauchy-Born parameter: "+line[0]+"."); } @@ -374,13 +374,13 @@ StressCauchyBorn::~StressCauchyBorn() //============================================================================== // initialize //============================================================================== -void StressCauchyBorn::initialize(void) +void StressCauchyBorn::initialize(void) { if (!initialized_) { if (makeLinear_) linearize(); stringstream ss; - double k = stiffness()*cbdata_.e2mvv; + double k = stiffness()*cbdata_.e2mvv; double m = cbdata_.atom_mass; double w0 = sqrt(k*m); ss << "CB stiffness: " << stiffness() << " Einstein freq: " << w0; @@ -403,8 +403,8 @@ double StressCauchyBorn::stiffness(void) const //============================================================================== // compute the stress at N integration points from the displacement gradient //============================================================================== -void StressCauchyBorn::stress(const FIELD_MATS &fields, - const GRAD_FIELD_MATS &gradFields, +void StressCauchyBorn::stress(const FIELD_MATS &fields, + const GRAD_FIELD_MATS &gradFields, DENS_MAT_VEC &sigma) { if (cubicMat_) { @@ -418,9 +418,9 @@ void StressCauchyBorn::stress(const FIELD_MATS &fields, // negative because stress must return (-) stress const double fact = -cbdata_.inv_atom_volume * cbdata_.e2mvv; const DENS_MAT_VEC &du(disp_gradient->second); - const INDEX num_integration_pts = du.front().nRows(); + const INDEX num_integration_pts = du.front().nRows(); const INDEX nsd = du.size(); - DENS_MAT F(nsd,nsd); // displacement gradient + DENS_MAT F(nsd,nsd); // displacement gradient bool temp_varies = (temp != fields.end()); sigma.assign(nsd, DENS_MAT(num_integration_pts, nsd)); StressAtIP S(sigma); // wrapper for quadrature points. @@ -440,8 +440,8 @@ void StressCauchyBorn::stress(const FIELD_MATS &fields, cb_stress(args, S); // copy symmetric part of stress and scale by V0 - for (INDEX i=0; i0)/potential(T=0) energy density. [mvv/L^3] //============================================================================== -void StressCauchyBorn::elastic_energy(const FIELD_MATS &fields, +void StressCauchyBorn::elastic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &energy) const { @@ -471,14 +471,14 @@ void StressCauchyBorn::elastic_energy(const FIELD_MATS &fields, energy[gp] = cb_energy(StressArgs(vac, potential_, cbdata_.boltzmann, cbdata_.hbar, T)); } // Scaling factor - scale by atomic volume and energy conversion. - + energy *= cbdata_.inv_atom_volume * cbdata_.e2mvv; } //============================================================================== // Computes entropic energy density. [mvv/L^3] //============================================================================== -void StressCauchyBorn::entropic_energy(const FIELD_MATS &fields, +void StressCauchyBorn::entropic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &energy) const { @@ -504,7 +504,7 @@ void StressCauchyBorn::entropic_energy(const FIELD_MATS &fields, void StressCauchyBorn::linearize(MATRIX *F) { if (cubicMat_) delete cubicMat_; - DENS_MAT C; + DENS_MAT C; if (F) tangent(*F, C); else tangent(eye(3,3), C); cubicMat_ = new StressCubicElastic(C(0,0), C(0,1), C(3,3)); @@ -514,7 +514,7 @@ void StressCauchyBorn::linearize(MATRIX *F) double c12 = C(0,1)/cbdata_.e2mvv; double c44 = C(3,3)/cbdata_.e2mvv; ss << "created cubic stress function:" - << "\n lammps ATC units" + << "\n lammps ATC units" << "\n c11=" << c11 << " " << C(0,0) << "\n c12=" << c12 << " " << C(0,1) << "\n c44=" << c44 << " " << C(3,3); @@ -546,7 +546,7 @@ DENS_VEC StressCauchyBorn::elasticity_tensor(const VECTOR &Fv, MATRIX &C, const } DENS_VEC StressCauchyBorn::elasticity_tensor(const MATRIX &F, MATRIX &C, const ElasticityTensorType type) const { - double T = 0; + double T = 0; AtomCluster vac; cblattice_->atom_cluster(F, potential_->cutoff_radius(), vac); if (vac.size() < 4) throw ATC_Error("StressCauchyBorn::second_elasticity_tensor cluster does not have sufficient atoms"); @@ -569,7 +569,7 @@ DENS_VEC StressCauchyBorn::elasticity_tensor(const MATRIX &F, MATRIX &C, const E C.reset(size,size); for (INDEX a=0; aphi_r(d); // computes phi' double phi_rr = potential_->phi_rr(d); // computes phi'' double fact1 = 0.5*phi_r*rinv; // 1/2 see Philips - double fact2 = 0.5*(phi_rr - phi_r*rinv) * rinv*rinv; + double fact2 = 0.5*(phi_rr - phi_r*rinv) * rinv*rinv; if (hasEAM) { double rho_r = potential_->rho_r(d); // computes rho' double rho_rr = potential_->rho_rr(d); // computes rho'' fact1 += embed_p*rho_r*rinv; - fact2 += embed_p*(rho_rr - rho_r*rinv) * rinv*rinv; + fact2 += embed_p*(rho_rr - rho_r*rinv) * rinv*rinv; Zfp += Z*(rho_r*rinv); } for (INDEX i=0; i0)/potential(T=0) energy density + DENS_MAT_VEC &stress)=0; + //* Computes free (T>0)/potential(T=0) energy density //* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) ) virtual void elastic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &energy) const; //* Returns the material tangent at a given deformation gradient. - virtual void tangent(const MATRIX & /* F */, MATRIX & /* C */) const + virtual void tangent(const MATRIX & /* F */, MATRIX & /* C */) const {throw ATC_Error("Stress::tangent: unimplemented function");} }; @@ -44,7 +44,7 @@ namespace ATC { /** * @class StressCubicElastic * @brief Class for computing stress for a cubic elastic material - */ + */ class StressCubicElastic : public Stress { @@ -69,7 +69,7 @@ namespace ATC { /** * @class StressCubicElasticDamped * @brief Class for computing stress for a cubic elastic material w/ damping - */ + */ class StressCubicElasticDamped : public StressCubicElastic { @@ -85,8 +85,8 @@ namespace ATC { }; /** - * @class StressLinearElastic - * @brief Class for computing stress for a linear elastic material + * @class StressLinearElastic + * @brief Class for computing stress for a linear elastic material */ class StressLinearElastic : public StressCubicElastic @@ -99,7 +99,7 @@ namespace ATC { protected: double E_, nu_; double mu_, lambda_; - }; + }; // forward declarations needed by StressCauchyBorn class CbPotential; @@ -120,7 +120,7 @@ namespace ATC { /** * @class StressCauchyBorn - * @brief Class for computing the stress and elastic constants for a + * @brief Class for computing the stress and elastic constants for a * @brief Cauchy-Born material. */ @@ -129,17 +129,17 @@ namespace ATC { { public: StressCauchyBorn(std::fstream &matfile, CbData &cb); - virtual ~StressCauchyBorn(); + virtual ~StressCauchyBorn(); virtual void initialize(void); //* Returns the stress computed from a 0K Cauchy-Born approxmation. virtual void stress(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT_VEC &flux); - //* Computes free (T>0)/potential(T=0) energy density + //* Computes free (T>0)/potential(T=0) energy density //* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) ) - virtual void elastic_energy(const FIELD_MATS &fields, + virtual void elastic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &energy) const; - //* Computes entropic energy density + //* Computes entropic energy density void entropic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, DENS_MAT &energy) const; //* Returns the material tangent at a given deformation gradient. @@ -171,13 +171,13 @@ namespace ATC { void function(const VECTOR & F, DENS_VEC & R) { DENS_MAT B; - tangent(F,R,B); + tangent(F,R,B); } void tangent(const VECTOR & F, DENS_VEC & R, MATRIX & B) { cbP_ = cauchyBornStress_->elasticity_tensor(F, B); - - R = cbP_ - targetP_; + + R = cbP_ - targetP_; } private: StressCauchyBorn * cauchyBornStress_; @@ -195,13 +195,13 @@ namespace ATC { void function(const VECTOR & U, DENS_VEC & r) { DENS_MAT C; - tangent(U,r,C); + tangent(U,r,C); } void tangent(const VECTOR & U, DENS_VEC & r, MATRIX & C) { cbS_ = cauchyBornStress_->elasticity_tensor(U, C, SECOND_ELASTICITY_TENSOR); - - r = cbS_ - targetS_; + + r = cbS_ - targetS_; } private: StressCauchyBorn * cauchyBornStress_; @@ -209,4 +209,4 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/ThermalTimeIntegrator.cpp b/lib/atc/ThermalTimeIntegrator.cpp index 8c0b8d6dae..514f41af0c 100644 --- a/lib/atc/ThermalTimeIntegrator.cpp +++ b/lib/atc/ThermalTimeIntegrator.cpp @@ -16,7 +16,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor - //-------------------------------------------------------- + //-------------------------------------------------------- ThermalTimeIntegrator::ThermalTimeIntegrator(ATC_Coupling * atc, TimeIntegrationType timeIntegrationType) : TimeIntegrator(atc, timeIntegrationType) @@ -38,7 +38,7 @@ namespace ATC { \section syntax fix_modify AtC time_integration \n - descriptor (string) = time integration type \n - + various time integration methods for the finite elements\n \section description gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, thermostats based on controlling power \n @@ -50,7 +50,7 @@ namespace ATC { \section related see \ref man_fix_atc \section default - none + none */ if (strcmp(arg[argIndex],"gear")==0) { timeIntegrationType_ = GEAR; @@ -90,12 +90,12 @@ namespace ATC { throw ATC_Error("Unknown time integration type in ThermalTimeIntegrator::Initialize()"); } } - + if (timeFilterManager_->filter_dynamics()) { switch (timeIntegrationType_) { case GEAR: { timeIntegrationMethod_ = new ThermalTimeIntegratorGearFiltered(this); - break; + break; } case FRACTIONAL_STEP: { timeIntegrationMethod_ = new ThermalTimeIntegratorFractionalStepFiltered(this); @@ -167,7 +167,7 @@ namespace ATC { nodalAtomicTemperature_ = (atc_->interscale_manager()).dense_matrix("NodalAtomicTemperature"); } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class ThermalIntegratorGear @@ -193,9 +193,9 @@ namespace ATC { { ThermalIntegrationMethod::construct_transfers(); InterscaleManager & interscaleManager = atc_->interscale_manager(); - + // add in power computation - DotTwiceKineticEnergy * dotTwiceKineticEnergy = + DotTwiceKineticEnergy * dotTwiceKineticEnergy = new DotTwiceKineticEnergy(atc_); interscaleManager.add_per_atom_quantity(dotTwiceKineticEnergy,"DotTwiceKineticEnergy"); nodalAtomicPower_ = new AtfShapeFunctionRestriction(atc_, @@ -252,7 +252,7 @@ namespace ATC { timeFilter_->apply_post_step2(nodalAtomicPowerFiltered_.set_quantity(), myNodalAtomicPower,dt); temperatureRhs_ += myNodalAtomicPower; - + // Finish updating temperature _temperatureResidual_.resize(atc_->num_nodes(),1); atc_->apply_inverse_mass_matrix(temperatureRhs_.quantity(), @@ -260,7 +260,7 @@ namespace ATC { TEMPERATURE); _temperatureResidual_ -= temperatureRoc_.quantity(); _temperatureResidual_ *= dt; - + gear1_3_correct(temperature_.set_quantity(), temperatureRoc_.set_quantity(), temperature2Roc_.set_quantity(), @@ -303,7 +303,7 @@ namespace ATC { temperature3Roc_(atc_->field_3roc(TEMPERATURE)) { // do nothing - + // specifically if history data is required and we need another time filter object for the fields } @@ -323,7 +323,7 @@ namespace ATC { //-------------------------------------------------------- // post_final_integrate1 - // first time integration computations + // first time integration computations // after Verlet step 2 //-------------------------------------------------------- void ThermalTimeIntegratorGearFiltered::post_final_integrate1(double dt) @@ -331,7 +331,7 @@ namespace ATC { DENS_MAT & myNodalAtomicPowerFiltered(nodalAtomicPowerFiltered_.set_quantity()); timeFilter_->apply_post_step2(myNodalAtomicPowerFiltered,nodalAtomicPower_->quantity(),dt); temperatureRhs_ += myNodalAtomicPowerFiltered; - + // Finish updating temperature _temperatureResidual_.resize(atc_->num_nodes(),1); atc_->apply_inverse_mass_matrix(temperatureRhs_.quantity(), @@ -429,7 +429,7 @@ namespace ATC { if (!timeFilterManager->end_equilibrate()) { // implies an initial condition of the instantaneous atomic energy // for the corresponding filtered variable, consistent with the temperature - nodalAtomicEnergyFiltered_ = nodalAtomicEnergy_->quantity(); + nodalAtomicEnergyFiltered_ = nodalAtomicEnergy_->quantity(); nodalAtomicPowerFiltered_.reset(atc_->num_nodes(),1); } } @@ -457,7 +457,7 @@ namespace ATC { apply_gear_predictor(dt); // update filtered nodal atomic power - + // that way thermostat and integrator can be consistent timeFilter_->apply_pre_step1(nodalAtomicPowerFiltered_.set_quantity(), nodalAtomicPower_,dt); @@ -472,16 +472,16 @@ namespace ATC { //-------------------------------------------------------- void ThermalTimeIntegratorFractionalStep::pre_final_integrate1(double dt) { - + // before the new rhs is computed but after atomic velocity is updated // to allow for general notions of temperature beyond kinetic. // compute change in restricted atomic energy nodalAtomicPower_ += nodalAtomicEnergy_->quantity(); - + // update FE temperature with change in temperature from MD compute_temperature_delta(nodalAtomicPower_,dt); temperature_ += atomicTemperatureDelta_.quantity(); - + // approximation to power for output nodalAtomicPower_ /= dt; timeFilter_->apply_post_step1(nodalAtomicPowerFiltered_.set_quantity(), diff --git a/lib/atc/ThermalTimeIntegrator.h b/lib/atc/ThermalTimeIntegrator.h index 8f5175d8a2..4e90c1df1d 100644 --- a/lib/atc/ThermalTimeIntegrator.h +++ b/lib/atc/ThermalTimeIntegrator.h @@ -17,13 +17,13 @@ namespace ATC { */ class ThermalTimeIntegrator : public TimeIntegrator { - + public: - + // constructor ThermalTimeIntegrator(ATC_Coupling * atc, TimeIntegrationType timeIntegrationType); - + // destructor virtual ~ThermalTimeIntegrator(){}; @@ -39,15 +39,15 @@ namespace ATC { // Member data access /** access for filtered atomic power */ DENS_MAN & nodal_atomic_power_filtered(){return nodalAtomicPowerFiltered_;}; - + /** access for filtered atomic energy */ // note: nodalAtomicEnergy_ should always be reset as it tracks the original energy + MD evolution DENS_MAN & nodal_atomic_energy_filtered(){return nodalAtomicEnergyFiltered_;}; - + protected: /** filtered atomic power */ - + DENS_MAN nodalAtomicPowerFiltered_; /** filtered atomic energy due initial conditions and MD updates */ @@ -57,7 +57,7 @@ namespace ATC { // DO NOT define this ThermalTimeIntegrator(); - + }; /** @@ -66,12 +66,12 @@ namespace ATC { */ class ThermalIntegrationMethod : public TimeIntegrationMethod { - + public: - + // constructor ThermalIntegrationMethod(ThermalTimeIntegrator * thermalTimeIntegrator); - + // destructor virtual ~ThermalIntegrationMethod() {}; @@ -112,21 +112,21 @@ namespace ATC { // DO NOT define this ThermalIntegrationMethod(); - + }; /** * @class ThermalTimeIntegratorGear - * @brief Class uses 3rd order Gear integration for time integration of FE temperature field + * @brief Class uses 3rd order Gear integration for time integration of FE temperature field */ class ThermalTimeIntegratorGear : public ThermalIntegrationMethod { - + public: - + // constructor ThermalTimeIntegratorGear(ThermalTimeIntegrator * ThermalTimeIntegrator); - + // destructor virtual ~ThermalTimeIntegratorGear() {}; @@ -135,7 +135,7 @@ namespace ATC { /** pre time integration initialization of data */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer /** second part of pre_initial_integrate */ virtual void pre_initial_integrate2(double dt); @@ -157,10 +157,10 @@ namespace ATC { AtfShapeFunctionRestriction * nodalAtomicPower_; private: - + // DO NOT define this ThermalTimeIntegratorGear(); - + }; /** @@ -169,15 +169,15 @@ namespace ATC { */ class ThermalTimeIntegratorGearFiltered : public ThermalTimeIntegratorGear { - + public: - + // constructor ThermalTimeIntegratorGearFiltered(ThermalTimeIntegrator * thermalTimeIntegrator); - + // destructor virtual ~ThermalTimeIntegratorGearFiltered(){}; - + // time step methods, corresponding to ATC_Transfer /** second part of pre_initial_integrate */ virtual void pre_initial_integrate2(double dt); @@ -188,7 +188,7 @@ namespace ATC { /** parallel post-processing operations pre-output */ virtual void post_process(); - + protected: /** finite element temperature 3rd time derivative */ @@ -198,16 +198,16 @@ namespace ATC { // DO NOT define this ThermalTimeIntegratorGearFiltered(); - + }; /** - * @class ThermalTimeIntegratorFractionalStep + * @class ThermalTimeIntegratorFractionalStep * @brief Class for using 3rd order Gear integration to update FE contributions to temperature field - * (Uses same update for the atomic contributions to the finite - * elements as are used by the LAMMPS integration scheme + * (Uses same update for the atomic contributions to the finite + * elements as are used by the LAMMPS integration scheme * for the atomic velocities and positions, i.e. Verlet.) - */ + */ class ThermalTimeIntegratorFractionalStep : public ThermalIntegrationMethod { @@ -215,16 +215,16 @@ namespace ATC { // constructor ThermalTimeIntegratorFractionalStep(ThermalTimeIntegrator * ThermalTimeIntegrator); - + // destructor virtual ~ThermalTimeIntegratorFractionalStep() {}; - + /** create and get necessary transfer operators */ virtual void construct_transfers(); /** pre time integration initialization of data */ virtual void initialize(); - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -303,10 +303,10 @@ namespace ATC { // constructor ThermalTimeIntegratorFractionalStepFiltered(ThermalTimeIntegrator * ThermalTimeIntegrator); - + // destructor virtual ~ThermalTimeIntegratorFractionalStepFiltered(); - + // time step methods, corresponding to ATC_Transfer /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); diff --git a/lib/atc/Thermostat.cpp b/lib/atc/Thermostat.cpp index 217f2394e2..2b5d469a12 100644 --- a/lib/atc/Thermostat.cpp +++ b/lib/atc/Thermostat.cpp @@ -38,13 +38,13 @@ namespace ATC { int argIndex = 0; if (strcmp(arg[argIndex],"thermal")==0) { argIndex++; - + // thermostat type - /*! \page man_control_thermal fix_modify AtC control thermal + /*! \page man_control_thermal fix_modify AtC control thermal \section syntax fix_modify AtC control thermal - control_type (string) = none | rescale | hoover | flux\n - + fix_modify AtC control thermal rescale \n - frequency (int) = time step frequency for applying velocity rescaling \n @@ -53,8 +53,8 @@ namespace ATC { fix_modify AtC control thermal flux \n - boundary_integration_type (string) = faceset | interpolate\n - face_set_id (string), optional = id of boundary face set, if not specified - (or not possible when the atomic domain does not line up with - mesh boundaries) defaults to an atomic-quadrature approximate + (or not possible when the atomic domain does not line up with + mesh boundaries) defaults to an atomic-quadrature approximate evaulation, does not work with interpolate\n \section examples fix_modify AtC control thermal none \n @@ -63,7 +63,7 @@ namespace ATC { fix_modify AtC control thermal flux \n fix_modify AtC control thermal flux faceset bndy_faces \n \section description - Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms. + Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms. \section restrictions only for be used with specific transfers : thermal (rescale, hoover, flux), two_temperature (flux) \n @@ -106,7 +106,7 @@ namespace ATC { couplingMode_ = FLUX; howOften_ = 1; argIndex++; - + boundaryIntegrationType_ = atc_->parse_boundary_integration(narg-argIndex,&arg[argIndex],boundaryFaceSet_); foundMatch = true; } @@ -157,9 +157,9 @@ namespace ATC { //-------------------------------------------------------- // construct_methods: // instantiations desired regulator method(s) - + // dependence, but in general there is also a - // time integrator dependence. In general the + // time integrator dependence. In general the // precedence order is: // time filter -> time integrator -> thermostat // In the future this may need to be added if @@ -186,7 +186,7 @@ namespace ATC { timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT_IMPLICIT); } } - + if (timeFilterManager->filter_dynamics()) { switch (regulatorTarget_) { case NONE: { @@ -346,7 +346,7 @@ namespace ATC { throw ATC_Error("Unknown thermostat target in Thermostat::initialize"); } } - + AtomicRegulator::reset_method(); } else { @@ -359,7 +359,7 @@ namespace ATC { // Class ThermostatShapeFunction //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -418,7 +418,7 @@ namespace ATC { // Class ThermostatRescale //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -487,7 +487,7 @@ namespace ATC { { // compute right-hand side this->set_rhs(_rhs_); - + // solve equations solve_for_lambda(_rhs_,lambda_->set_quantity()); } @@ -550,7 +550,7 @@ namespace ATC { InterscaleManager & interscaleManager(atc_->interscale_manager()); // get fluctuating PE at nodes - nodalAtomicFluctuatingPotentialEnergy_ = + nodalAtomicFluctuatingPotentialEnergy_ = interscaleManager.dense_matrix("NodalAtomicFluctuatingPotentialEnergy"); } @@ -598,7 +598,7 @@ namespace ATC { // Class ThermostatFsSolver //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -720,20 +720,20 @@ namespace ATC { if (error < tolerance_) break; } - + if (error >= tolerance_) { stringstream message; message << "WARNING: Iterative solve for lambda failed to converge after " << lambdaMaxIterations_ << " iterations, final tolerance was " << error << "\n"; ATC::LammpsInterface::instance()->print_msg(message.str()); } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class ThermostatGlcFs //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -787,7 +787,7 @@ namespace ATC { // get data from manager atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS), nodalAtomicEnergy_ = interscaleManager.dense_matrix("NodalAtomicEnergy"); - + // thermostat forces based on lambda and the atomic velocities atomThermostatForces_ = new AtomicThermostatForce(atc_,atomLambdas_); interscaleManager.add_per_atom_quantity(atomThermostatForces_, @@ -816,7 +816,7 @@ namespace ATC { void ThermostatGlcFs::initialize() { RegulatorMethod::initialize(); - + TimeFilterManager * timeFilterManager = atc_->time_filter_manager(); if (!timeFilterManager->end_equilibrate()) { // we should reset lambda and lambdaForce to zero in this case @@ -939,7 +939,7 @@ namespace ATC { // do full prediction if we just redid the shape functions if (full_prediction()) { this->compute_lambda(dt); - + atomThermostatForces_->unfix_quantity(); // allow update of atomic force applied by lambda } @@ -952,7 +952,7 @@ namespace ATC { if (full_prediction()) atomThermostatForces_->fix_quantity(); - + // update predicted nodal variables for second half of time step this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy2_,0.5*dt); // following manipulations performed this way for efficiency @@ -979,7 +979,7 @@ namespace ATC { // apply lambda force to atoms and compute instantaneous lambda power for second half of time step DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity()); // allow computation of force applied by lambda using current velocities - atomThermostatForces_->unfix_quantity(); + atomThermostatForces_->unfix_quantity(); atomThermostatForces_->quantity(); atomThermostatForces_->fix_quantity(); apply_to_atoms(atomVelocities_,nodalAtomicEnergy_, @@ -994,8 +994,8 @@ namespace ATC { this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy2_,0.5*dt); atc_->apply_inverse_mass_matrix(deltaEnergy2_,TEMPERATURE); myTemperature += deltaEnergy2_; - - + + isFirstTimestep_ = false; } @@ -1016,7 +1016,7 @@ namespace ATC { // solve linear system for lambda guess DENS_MAT & lambda(lambda_->set_quantity()); solve_for_lambda(rhs_,lambda); - + // iterate to solution if (iterateSolution) { iterate_lambda(rhs_); @@ -1031,7 +1031,7 @@ namespace ATC { //-------------------------------------------------------- void ThermostatGlcFs::compute_boundary_flux(FIELDS & fields) { - + lambdaSolver_->compute_boundary_flux(fields); } @@ -1057,7 +1057,7 @@ namespace ATC { // Class ThermostatSolverFlux //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and thermostat data @@ -1135,13 +1135,13 @@ namespace ATC { interscaleManager.add_set_int(regulatedNodes_, regulatorPrefix_+"ThermostatRegulatedNodes"); } - + // if localized monitor nodes with applied fluxes if (atomicRegulator_->use_localized_lambda()) { if ((atomicRegulator_->coupling_mode() == Thermostat::FLUX) && (atomicRegulator_->boundary_integration_type() != NO_QUADRATURE)) { // include boundary nodes applicationNodes_ = new FluxBoundaryNodes(atc_); - + boundaryNodes_ = new BoundaryNodes(atc_); interscaleManager.add_set_int(boundaryNodes_, regulatorPrefix_+"ThermostatBoundaryNodes"); @@ -1157,7 +1157,7 @@ namespace ATC { applicationNodes_ = regulatedNodes_; } - // special set of boundary elements for boundary flux quadrature + // special set of boundary elements for boundary flux quadrature if ((atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION) && (atomicRegulator_->use_localized_lambda())) { elementMask_ = interscaleManager.dense_matrix_bool(regulatorPrefix_+"BoundaryElementMask"); @@ -1227,10 +1227,10 @@ namespace ATC { void ThermostatIntegratorFlux::set_thermostat_rhs(DENS_MAT & rhs, double /* dt */) { - + // only tested with flux != 0 + ess bc = 0 - // (a) for flux based : + // (a) for flux based : // form rhs : 2/3kB * W_I^-1 * \int N_I r dV // vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I // fluxes are set in ATC transfer @@ -1259,7 +1259,7 @@ namespace ATC { // Class ThermostatSolverFixed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and thermostat data @@ -1357,14 +1357,14 @@ namespace ATC { else { throw ATC_Error("ThermostatSolverFixed::construct_regulated_nodes - couldn't determine set of regulated nodes"); } - + interscaleManager.add_set_int(regulatedNodes_, regulatorPrefix_+"ThermostatRegulatedNodes"); } applicationNodes_ = regulatedNodes_; - // special set of boundary elements for defining regulated atoms + // special set of boundary elements for defining regulated atoms if (atomicRegulator_->use_localized_lambda()) { elementMask_ = interscaleManager.dense_matrix_bool(regulatorPrefix_+"BoundaryElementMask"); if (!elementMask_) { @@ -1380,7 +1380,7 @@ namespace ATC { // Class ThermostatIntegratorFixed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and thermostat data @@ -1552,11 +1552,11 @@ namespace ATC { //-------------------------------------------------------- void ThermostatIntegratorFixed::apply_post_corrector(double dt) { - + bool halveForce = halve_force(); ThermostatGlcFs::apply_post_corrector(dt); - + // update filtered energy with lambda power DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity()); timeFilter_->apply_post_step2(nodalAtomicEnergyFiltered_.set_quantity(), @@ -1567,8 +1567,8 @@ namespace ATC { // 1) makes up for poor initial condition // 2) accounts for possibly large value of lambda when atomic shape function values change // from eulerian mapping after more than 1 timestep - // avoids unstable oscillations arising from - // thermostat having to correct for error introduced in lambda changing the + // avoids unstable oscillations arising from + // thermostat having to correct for error introduced in lambda changing the // shape function matrices lambdaSolver_->scale_lambda(0.5); firstHalfAtomForces_ = atomThermostatForcesPredVel_; @@ -1589,11 +1589,11 @@ namespace ATC { double /* dt */) { deltaEnergy.resize(nNodes_,1); - + SetDependencyManager * myRegulatedNodes = (atc_->interscale_manager()).set_int(regulatorPrefix_+"ThermostatRegulatedNodes"); const set & regulatedNodes(myRegulatedNodes->quantity()); - + for (int i = 0; i < nNodes_; i++) { if (regulatedNodes.find(i) != regulatedNodes.end()) { deltaEnergy(i,0) = 0.; @@ -1620,7 +1620,7 @@ namespace ATC { const set & regulatedNodes(myRegulatedNodes->quantity()); double factor = (1./dt)/keMultiplier_; rhs.resize(nNodes_,1); - + for (int i = 0; i < nNodes_; i++) { if (regulatedNodes.find(i) != regulatedNodes.end()) { rhs(i,0) = factor*(deltaNodalAtomicEnergy_(i,0) - deltaFeEnergy_(i,0)); @@ -1636,7 +1636,7 @@ namespace ATC { // Class ThermostatIntegratorFluxFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and thermostat data @@ -1707,24 +1707,24 @@ namespace ATC { void ThermostatIntegratorFluxFiltered::set_thermostat_rhs(DENS_MAT & rhs, double dt) { - + // only tested with flux != 0 + ess bc = 0 - // (a) for flux based : + // (a) for flux based : // form rhs : 2/3kB * W_I^-1 * \int N_I r dV // vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I // fluxes are set in ATC transfer // invert heatSource_ to get unfiltered source // relevant coefficients from time filter - + double coefF1 = timeFilter_->filtered_coefficient_pre_s1(2.*dt); double coefF2 = timeFilter_->filtered_coefficient_post_s1(2.*dt); double coefU1 = timeFilter_->unfiltered_coefficient_pre_s1(2.*dt); double coefU2 = timeFilter_->unfiltered_coefficient_post_s1(2.*dt); const DENS_MAT & heatSource(heatSource_.quantity()); - SetDependencyManager * myApplicationNodes = + SetDependencyManager * myApplicationNodes = (atc_->interscale_manager()).set_int(regulatorPrefix_+"ThermostatApplicationNodes"); const set & applicationNodes(myApplicationNodes->quantity()); rhs.resize(nNodes_,1); @@ -1761,7 +1761,7 @@ namespace ATC { // Class ThermostatIntegratorFixedFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor // Grab references to ATC and thermostat data @@ -1780,8 +1780,8 @@ namespace ATC { // the change in the nodal atomic energy // that has occurred over the past timestep //-------------------------------------------------------- - - + + void ThermostatIntegratorFixedFiltered::initialize_delta_nodal_atomic_energy(double dt) { // initialize delta energy @@ -1846,7 +1846,7 @@ namespace ATC { double factor = (1./dt)/keMultiplier_; factor /= timeFilter_->unfiltered_coefficient_post_s1(2.*dt); rhs.resize(nNodes_,1); - + for (int i = 0; i < nNodes_; i++) { if (regulatedNodes.find(i) != regulatedNodes.end()) { rhs(i,0) = factor*(deltaNodalAtomicEnergy_(i,0) - deltaFeEnergy_(i,0)); @@ -1879,7 +1879,7 @@ namespace ATC { // Class ThermostatFluxFixed //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -1989,7 +1989,7 @@ namespace ATC { // Class ThermostatFluxFixedFiltered //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -2015,7 +2015,7 @@ namespace ATC { // Class ThermostatGlc //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -2128,13 +2128,13 @@ namespace ATC { // get managed data nodalAtomicPower_ = interscaleManager.dense_matrix("NodalAtomicPower"); - + // power induced by lambda - DotTwiceKineticEnergy * atomicLambdaPower = + DotTwiceKineticEnergy * atomicLambdaPower = new DotTwiceKineticEnergy(atc_,atomThermostatForces_); interscaleManager.add_per_atom_quantity(atomicLambdaPower, regulatorPrefix_+"AtomicLambdaPower"); - + // restriction to nodes of power induced by lambda nodalAtomicLambdaPower_ = new AtfShapeFunctionRestriction(atc_, atomicLambdaPower, @@ -2211,15 +2211,15 @@ namespace ATC { //-------------------------------------------------------- void ThermostatPowerVerlet::set_thermostat_rhs(DENS_MAT & rhs_nodes) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV // vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I // fluxes are set in ATC transfer rhs_nodes = heatSource_.quantity(); - + // (b) for ess. bcs // form rhs : {sum_a (2 * N_Ia * v_ia * f_ia) - (dtheta/dt)_I} - + // replace rhs for prescribed nodes const DENS_MAT & myNodalAtomicPower(nodalAtomicPower_->quantity()); const DIAG_MAT & myMdMassMatrix(mdMassMatrix_.quantity()); @@ -2241,7 +2241,7 @@ namespace ATC { { // set up rhs set_thermostat_rhs(_rhs_); - + // solve linear system for lambda DENS_MAT & myLambda(lambda_->set_quantity()); solve_for_lambda(_rhs_,myLambda); @@ -2292,7 +2292,7 @@ namespace ATC { { // set up data consistent with stage 3 of ATC_Method::initialize lambdaHoover_ = atomicRegulator_->regulator_data(regulatorPrefix_+"LambdaHoover",1); - + } //-------------------------------------------------------- @@ -2313,18 +2313,18 @@ namespace ATC { AtomicThermostatForce * atomHooverThermostatForces = new AtomicThermostatForce(atc_,atomHooverLambdas); interscaleManager.add_per_atom_quantity(atomHooverThermostatForces, regulatorPrefix_+"AtomHooverThermostatForce"); - SummedAtomicQuantity * atomTotalThermostatForces = + SummedAtomicQuantity * atomTotalThermostatForces = new SummedAtomicQuantity(atc_,atomThermostatForces_,atomHooverThermostatForces); interscaleManager.add_per_atom_quantity(atomTotalThermostatForces, regulatorPrefix_+"AtomTotalThermostatForce"); atomThermostatForces_ = atomTotalThermostatForces; - + // transfers dependent on time integration method - DotTwiceKineticEnergy * atomicHooverLambdaPower = + DotTwiceKineticEnergy * atomicHooverLambdaPower = new DotTwiceKineticEnergy(atc_,atomHooverThermostatForces); interscaleManager.add_per_atom_quantity(atomicHooverLambdaPower, regulatorPrefix_+"AtomicHooverLambdaPower"); - + nodalAtomicHooverLambdaPower_ = new AtfShapeFunctionRestriction(atc_, atomicHooverLambdaPower, interscaleManager.per_atom_sparse_matrix("Interpolant")); @@ -2354,14 +2354,14 @@ namespace ATC { // apply prescribed/extrinsic sources and fixed nodes ThermostatPowerVerlet::compute_thermostat(0.5*dt); _nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity(); // save power from lambda in power-based thermostat - + // set up Hoover rhs set_hoover_rhs(_rhs_); - + // solve linear system for lambda DENS_MAT & myLambda(lambdaHoover_->set_quantity()); solve_for_lambda(_rhs_,myLambda); - + // compute force applied by lambda // compute nodal atomic power from Hoover coupling // only add in contribution to uncoupled nodes @@ -2384,7 +2384,7 @@ namespace ATC { //-------------------------------------------------------- // add_to_nodal_lambda_power: - // determines the power exerted by the Hoover + // determines the power exerted by the Hoover // thermostat at each FE node //-------------------------------------------------------- void ThermostatHooverVerlet::add_to_lambda_power(const DENS_MAT & /* myLambdaForce */, @@ -2429,7 +2429,7 @@ namespace ATC { void ThermostatPowerVerletFiltered::compute_boundary_flux(FIELDS & fields) { ThermostatPowerVerlet::compute_boundary_flux(fields); - + // compute boundary flux rate of change fluxRoc_[TEMPERATURE] = 0.; atc_->compute_boundary_flux(fieldMask_, @@ -2438,11 +2438,11 @@ namespace ATC { atomMaterialGroups_, shpFcnDerivs_); - + // compute extrinsic model rate of change (atc_->extrinsic_model_manager()).set_sources(fieldsRoc_,fluxRoc_); - heatSourceRoc_ = fluxRoc_[TEMPERATURE].quantity(); + heatSourceRoc_ = fluxRoc_[TEMPERATURE].quantity(); } //-------------------------------------------------------- @@ -2464,7 +2464,7 @@ namespace ATC { //-------------------------------------------------------- void ThermostatPowerVerletFiltered::set_thermostat_rhs(DENS_MAT & rhs_nodes) { - // (a) for flux based : + // (a) for flux based : // form rhs : \int N_I r dV // vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I // fluxes are set in ATC transfer @@ -2529,18 +2529,18 @@ namespace ATC { AtomicThermostatForce * atomHooverThermostatForces = new AtomicThermostatForce(atc_,atomHooverLambdas); interscaleManager.add_per_atom_quantity(atomHooverThermostatForces, regulatorPrefix_+"AtomHooverThermostatForce"); - SummedAtomicQuantity * atomTotalThermostatForces = + SummedAtomicQuantity * atomTotalThermostatForces = new SummedAtomicQuantity(atc_,atomThermostatForces_,atomHooverThermostatForces); interscaleManager.add_per_atom_quantity(atomTotalThermostatForces, regulatorPrefix_+"AtomTotalThermostatForce"); atomThermostatForces_ = atomTotalThermostatForces; - + // transfers dependent on time integration method - DotTwiceKineticEnergy * atomicHooverLambdaPower = + DotTwiceKineticEnergy * atomicHooverLambdaPower = new DotTwiceKineticEnergy(atc_,atomHooverThermostatForces); interscaleManager.add_per_atom_quantity(atomicHooverLambdaPower, regulatorPrefix_+"AtomicHooverLambdaPower"); - + nodalAtomicHooverLambdaPower_ = new AtfShapeFunctionRestriction(atc_, atomicHooverLambdaPower, interscaleManager.per_atom_sparse_matrix("Interpolant")); @@ -2559,15 +2559,15 @@ namespace ATC { // apply prescribed/extrinsic sources and fixed nodes ThermostatPowerVerletFiltered::compute_thermostat(0.5*dt); _nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity(); // save power from lambda in power-based thermostat - + // set up Hoover rhs set_hoover_rhs(_rhs_); - + // solve linear system for lambda DENS_MAT & myLambda(lambdaHoover_->set_quantity()); solve_for_lambda(_rhs_,myLambda); - - + + // compute force applied by lambda // compute nodal atomic power from Hoover coupling // only add in contribution to uncoupled nodes @@ -2590,7 +2590,7 @@ namespace ATC { //-------------------------------------------------------- // add_to_nodal_lambda_power: - // determines the power exerted by the Hoover + // determines the power exerted by the Hoover // thermostat at each FE node //-------------------------------------------------------- void ThermostatHooverVerletFiltered::add_to_lambda_power(const DENS_MAT & /* myLambdaForce */, diff --git a/lib/atc/Thermostat.h b/lib/atc/Thermostat.h index 3764d0b835..2222dea452 100644 --- a/lib/atc/Thermostat.h +++ b/lib/atc/Thermostat.h @@ -22,22 +22,22 @@ namespace ATC { * @brief Manager class for atom-continuum control of thermal energy */ class Thermostat : public AtomicRegulator { - + public: // constructor Thermostat(ATC_Coupling * atc, const std::string & regulatorPrefix = ""); - + // destructor virtual ~Thermostat(){}; - + /** parser/modifier */ virtual bool modify(int narg, char **arg); /** instantiate up the desired method(s) */ virtual void construct_methods(); - + // data access, intended for method objects /** reset the nodal power to a prescribed value */ virtual void reset_lambda_contribution(const DENS_MAT & target); @@ -57,10 +57,10 @@ namespace ATC { int lambdaMaxIterations_; private: - + // DO NOT define this Thermostat(); - + }; /** @@ -68,15 +68,15 @@ namespace ATC { * @brief Class for thermostat algorithms using the shape function matrices * (thermostats have general for of N^T w N lambda = rhs) */ - + class ThermostatShapeFunction : public RegulatorShapeFunction { - + public: - + ThermostatShapeFunction(AtomicRegulator * thermostat, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatShapeFunction() {}; /** instantiate all needed data */ @@ -89,9 +89,9 @@ namespace ATC { virtual void set_weights(); // member data - + /** MD mass matrix */ - DIAG_MAN & mdMassMatrix_; + DIAG_MAN & mdMassMatrix_; /** pointer to atom velocities */ FundamentalAtomQuantity * atomVelocities_; @@ -110,20 +110,20 @@ namespace ATC { * @class ThermostatRescale * @brief Enforces constraint on atomic kinetic energy based on FE temperature */ - + class ThermostatRescale : public ThermostatShapeFunction { - + public: friend class KinetoThermostatRescale; // since this is sometimes used as a set of member functions for friend - + ThermostatRescale(AtomicRegulator * thermostat); - + virtual ~ThermostatRescale() {}; /** instantiate all needed data */ virtual void construct_transfers(); - + /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); @@ -133,7 +133,7 @@ namespace ATC { /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: /** set weighting factor for in matrix Nhat^T * weights * Nhat */ @@ -147,7 +147,7 @@ namespace ATC { /** construct the RHS vector */ virtual void set_rhs(DENS_MAT & rhs); - + /** FE temperature field */ DENS_MAN & nodalTemperature_; @@ -161,7 +161,7 @@ namespace ATC { // DO NOT define this ThermostatRescale(); - + }; /** @@ -169,13 +169,13 @@ namespace ATC { * @brief Enforces constraint on atomic kinetic energy based on FE temperature * when the temperature is a mix of the KE and PE */ - + class ThermostatRescaleMixedKePe : public ThermostatRescale { - + public: - + ThermostatRescaleMixedKePe(AtomicRegulator * thermostat); - + virtual ~ThermostatRescaleMixedKePe() {}; /** instantiate all needed data */ @@ -183,7 +183,7 @@ namespace ATC { /** pre-run initialization of method data */ virtual void initialize(); - + protected: /** set weighting factor for in matrix Nhat^T * weights * Nhat */ @@ -205,7 +205,7 @@ namespace ATC { // DO NOT define this ThermostatRescaleMixedKePe(); - + }; /** @@ -213,16 +213,16 @@ namespace ATC { * @brief Class for solving the linear system for lambda * (thermostats have general for of N^T w N lambda = rhs) */ - + class ThermostatFsSolver : public RegulatorShapeFunction { - + public: - + ThermostatFsSolver(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatFsSolver() {}; /** pre-run initialization of method data */ @@ -240,7 +240,7 @@ namespace ATC { protected: - // methods + // methods /** solves the non-linear equation for lambda iteratively */ void iterate_lambda(const MATRIX & rhs); @@ -277,15 +277,15 @@ namespace ATC { * @class ThermostatGlcFs * @brief Class for thermostat algorithms which perform the time-integration component of the fractional step method */ - + class ThermostatGlcFs : public RegulatorMethod { - + public: - + ThermostatGlcFs(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatGlcFs() {}; /** instantiate all needed data */ @@ -302,10 +302,10 @@ namespace ATC { /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); - + /** compute boundary flux, requires regulator input since it is part of the coupling scheme */ virtual void compute_boundary_flux(FIELDS & fields); - + /** get data for output */ virtual void output(OUTPUT_LIST & outputData); @@ -343,9 +343,9 @@ namespace ATC { /** solver for lambda linear system */ ThermostatFsSolver * lambdaSolver_; - + /** MD mass matrix */ - DIAG_MAN & mdMassMatrix_; + DIAG_MAN & mdMassMatrix_; /** pointer to atom velocities */ FundamentalAtomQuantity * atomVelocities_; @@ -413,18 +413,18 @@ namespace ATC { */ class ThermostatSolverFlux : public ThermostatFsSolver { - + public: - + ThermostatSolverFlux(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatSolverFlux() {}; /** instantiate all needed data */ virtual void construct_transfers(); - + protected: // methods @@ -444,18 +444,18 @@ namespace ATC { */ class ThermostatIntegratorFlux : public ThermostatGlcFs { - + public: - + ThermostatIntegratorFlux(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatIntegratorFlux() {}; /** pre-run initialization of method data */ virtual void initialize(); - + protected: /** sets up appropriate rhs for thermostat equations */ @@ -484,18 +484,18 @@ namespace ATC { */ class ThermostatSolverFixed : public ThermostatFsSolver { - + public: - + ThermostatSolverFixed(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatSolverFixed() {}; /** instantiate all needed data */ virtual void construct_transfers(); - + protected: // methods @@ -515,13 +515,13 @@ namespace ATC { */ class ThermostatIntegratorFixed : public ThermostatGlcFs { - + public: - + ThermostatIntegratorFixed(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatIntegratorFixed() {}; /** instantiate all needed data */ @@ -529,7 +529,7 @@ namespace ATC { /** pre-run initialization of method data */ virtual void initialize(); - + /** applies thermostat to atoms in the predictor phase */ virtual void apply_pre_predictor(double dt); @@ -545,7 +545,7 @@ namespace ATC { /** determine if local shape function matrices are needed */ virtual bool use_local_shape_functions() const {return atomicRegulator_->use_localized_lambda();}; - + protected: // methods @@ -613,13 +613,13 @@ namespace ATC { */ class ThermostatIntegratorFluxFiltered : public ThermostatIntegratorFlux { - + public: - + ThermostatIntegratorFluxFiltered(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatIntegratorFluxFiltered() {}; /** pre-run initialization of method data */ @@ -630,7 +630,7 @@ namespace ATC { /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: /** sets up appropriate rhs for thermostat equations */ @@ -660,20 +660,20 @@ namespace ATC { * @brief Class for thermostatting using the temperature matching constraint and is compatible with the fractional step time-integration with time filtering */ - + class ThermostatIntegratorFixedFiltered : public ThermostatIntegratorFixed { - + public: - + ThermostatIntegratorFixedFiltered(AtomicRegulator * thermostat, int lambdaMaxIterations, const std::string & regulatorPrefix = ""); - + virtual ~ThermostatIntegratorFixedFiltered() {}; /** get data for output */ virtual void output(OUTPUT_LIST & outputData); - + protected: // methods @@ -711,7 +711,7 @@ namespace ATC { ThermostatFluxFixed(AtomicRegulator * thermostat, int lambdaMaxIterations, bool constructThermostats = true); - + virtual ~ThermostatFluxFixed(); /** instantiate all needed data */ @@ -728,7 +728,7 @@ namespace ATC { /** applies thermostat to atoms in the post-corrector phase */ virtual void apply_post_corrector(double dt); - + /** get data for output */ virtual void output(OUTPUT_LIST & outputData); @@ -765,7 +765,7 @@ namespace ATC { ThermostatFluxFixedFiltered(AtomicRegulator * thermostat, int lambdaMaxIterations); - + virtual ~ThermostatFluxFixedFiltered(){}; private: @@ -779,13 +779,13 @@ namespace ATC { * @class ThermostatGlc * @brief Class for thermostat algorithms based on Gaussian least constraints (GLC) */ - + class ThermostatGlc : public ThermostatShapeFunction { - + public: - + ThermostatGlc(AtomicRegulator * thermostat); - + virtual ~ThermostatGlc() {}; /** instantiate all needed data */ @@ -795,7 +795,7 @@ namespace ATC { // methods /** apply forces to atoms */ - virtual void apply_to_atoms(PerAtomQuantity * atomicVelocity, + virtual void apply_to_atoms(PerAtomQuantity * atomicVelocity, const DENS_MAT & lambdaForce, double dt); @@ -830,21 +830,21 @@ namespace ATC { * @brief Class for thermostatting using the heat flux matching constraint and is compatible with the Gear time-integration */ - + class ThermostatPowerVerlet : public ThermostatGlc { - + public: ThermostatPowerVerlet(AtomicRegulator * thermostat); - + virtual ~ThermostatPowerVerlet() {}; /** instantiate all needed data */ virtual void construct_transfers(); - + /** pre-run initialization of method data */ virtual void initialize(); - + /** applies thermostat to atoms in the predictor phase */ virtual void apply_pre_predictor(double dt); @@ -895,19 +895,19 @@ namespace ATC { ThermostatPowerVerlet(); }; - + /** * @class ThermostatHooverVerlet * @brief Classfor thermostatting using the temperature matching constraint and is compatible with - Gear time-integration + Gear time-integration */ - + class ThermostatHooverVerlet : public ThermostatPowerVerlet { - + public: ThermostatHooverVerlet(AtomicRegulator * thermostat); - + virtual ~ThermostatHooverVerlet() {}; /** instantiate all needed data */ @@ -956,13 +956,13 @@ namespace ATC { * @brief Class for thermostatting using the heat flux matching constraint and is compatible with Gear time-integration with time filtering */ - + class ThermostatPowerVerletFiltered : public ThermostatPowerVerlet { - + public: ThermostatPowerVerletFiltered(AtomicRegulator * thermostat); - + virtual ~ThermostatPowerVerletFiltered(){}; /** get data for output */ @@ -987,7 +987,7 @@ namespace ATC { /** references to ATC field rates of changing for inverting the filtered heat sources */ FIELDS & fieldsRoc_; - + /** flux rate of changes for inverting filtered fluxes */ FIELDS fluxRoc_; @@ -1006,21 +1006,21 @@ namespace ATC { * @brief Class for thermostatting using the temperature matching constraint and is compatible with Gear time-integration with time filtering */ - + class ThermostatHooverVerletFiltered : public ThermostatPowerVerletFiltered { - + public: ThermostatHooverVerletFiltered(AtomicRegulator * thermostat); - + virtual ~ThermostatHooverVerletFiltered() {}; /** instantiate all needed data */ virtual void construct_transfers(); - + /** final tasks of a run */ virtual void finish() {}; - + /** compute boundary flux, requires thermostat input since it is part of the coupling scheme */ virtual void compute_boundary_flux(FIELDS & /* fields */) {boundaryFlux_[TEMPERATURE] = 0.;}; diff --git a/lib/atc/TimeFilter.cpp b/lib/atc/TimeFilter.cpp index ece3429c86..6cb4309cfc 100644 --- a/lib/atc/TimeFilter.cpp +++ b/lib/atc/TimeFilter.cpp @@ -10,7 +10,7 @@ namespace ATC { // Class TimeFilterManager //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -25,7 +25,7 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -35,7 +35,7 @@ namespace ATC { for (it = timeFilterSet_.begin(); it != timeFilterSet_.end(); it++) if (*it) delete *it; } - + //-------------------------------------------------------- // modify // parses input commands @@ -43,7 +43,7 @@ namespace ATC { bool TimeFilterManager::modify(int /* narg */, char ** arg) { bool foundMatch = false; - + // filter scale size /*! \page man_filter_scale fix_modify AtC filter scale \section syntax @@ -96,7 +96,7 @@ namespace ATC { \section default off */ - else if (strcmp(arg[0],"on")==0) { + else if (strcmp(arg[0],"on")==0) { if (filterScale_<=0. && filterType_ != STEP_FILTER) throw ATC_Error("Filtering time scale not initialized"); useFilter_ = true; @@ -110,7 +110,7 @@ namespace ATC { equilibrateFilter_ = false; foundMatch = true; } - else if (strcmp(arg[0],"off")==0) { + else if (strcmp(arg[0],"off")==0) { useFilter_ = false; equilibrateFilter_ = false; endEquilibrate_ = false; @@ -127,8 +127,8 @@ namespace ATC { foundMatch = true; } - // filter type - /*! \page man_filter_type fix_modify AtC filter type + // filter type + /*! \page man_filter_type fix_modify AtC filter type \section syntax fix_modify AtC filter type \n @@ -146,16 +146,16 @@ namespace ATC { \ref man_filter_scale \section default - No default. + No default. */ - else if (strcmp(arg[0],"type")==0) { - if (strcmp(arg[1],"exponential")==0) { + else if (strcmp(arg[0],"type")==0) { + if (strcmp(arg[1],"exponential")==0) { filterType_ = EXPONENTIAL_FILTER; } - else if (strcmp(arg[1],"step")==0) { + else if (strcmp(arg[1],"step")==0) { filterType_ = STEP_FILTER; } - else if (strcmp(arg[1],"no_filter")==0) { + else if (strcmp(arg[1],"no_filter")==0) { filterType_ = NO_FILTER; } else throw ATC_Error("Not a supported time filter type"); @@ -180,51 +180,51 @@ namespace ATC { // construct // instantiates the filter //-------------------------------------------------------- - + TimeFilter * TimeFilterManager::construct(const FilterIntegrationType intType) { TimeFilter * newTimeFilter; if (useFilter_ || equilibrateFilter_) { if (filterType_ == EXPONENTIAL_FILTER) { if (intType == IMPLICIT_EXPLICIT) { - newTimeFilter = new TimeFilterImplicitExplicit(*this); + newTimeFilter = new TimeFilterImplicitExplicit(*this); } else if (intType == EXPLICIT_IMPLICIT) { - newTimeFilter = new TimeFilterExplicitImplicit(*this); + newTimeFilter = new TimeFilterExplicitImplicit(*this); } else if (intType == EXPLICIT) { - newTimeFilter = new TimeFilterExplicit(*this); + newTimeFilter = new TimeFilterExplicit(*this); } else if (intType == IMPLICIT) { - newTimeFilter = new TimeFilterImplicit(*this); + newTimeFilter = new TimeFilterImplicit(*this); } else if (intType == IMPLICIT_UPDATE) { - newTimeFilter = new TimeFilterImplicitUpdate(*this); + newTimeFilter = new TimeFilterImplicitUpdate(*this); } else if (intType == CRANK_NICHOLSON) { - newTimeFilter = new TimeFilterCrankNicolson(*this); + newTimeFilter = new TimeFilterCrankNicolson(*this); } else { // default to return base class - newTimeFilter = new TimeFilter(*this); + newTimeFilter = new TimeFilter(*this); } } else if (filterType_ == STEP_FILTER) { - newTimeFilter = new TimeFilterStep(*this); + newTimeFilter = new TimeFilterStep(*this); } else newTimeFilter = nullptr; } else { // default to return base class - newTimeFilter = new TimeFilter(*this); + newTimeFilter = new TimeFilter(*this); } timeFilterSet_.insert(newTimeFilter); return newTimeFilter; } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilter //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -275,13 +275,13 @@ namespace ATC { unFilteredQuantityOld_.reset(target.nRows(),target.nCols()); unFilteredQuantityOld_ = target; } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterExplicit //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -290,13 +290,13 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterImplicit //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -305,13 +305,13 @@ namespace ATC { { // do nothing } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterImplicitExplicit //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -326,7 +326,7 @@ namespace ATC { // Class TimeFilterExplicitImplicit //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -341,7 +341,7 @@ namespace ATC { // Class TimeFilterImplicitUpdate //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -356,7 +356,7 @@ namespace ATC { // Class TimeFilterStep //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- diff --git a/lib/atc/TimeFilter.h b/lib/atc/TimeFilter.h index 321d9bb8e6..07ca91efef 100644 --- a/lib/atc/TimeFilter.h +++ b/lib/atc/TimeFilter.h @@ -1,4 +1,4 @@ -// The type of filter used should be determined by the +// The type of filter used should be determined by the // integrator since filtering much match the time integration scheme @@ -29,7 +29,7 @@ namespace ATC { //-------------------------------------------------------- class TimeFilterManager { - + public: /** enumeration for the functional form underlying the filter */ @@ -49,13 +49,13 @@ namespace ATC { IMPLICIT, IMPLICIT_UPDATE }; - + // constructor TimeFilterManager(ATC_Method * atc); - + // destructor ~TimeFilterManager(); - + /** parser/modifier */ bool modify(int narg, char **arg); @@ -64,10 +64,10 @@ namespace ATC { /** get filter base function */ TimeFilterType filter_type() const {return filterType_;}; - + /** return filtering time scale */ double filter_scale() const {return filterScale_;}; - + /** check if dynamics should be filtering */ bool filter_dynamics() const {return useFilter_;}; @@ -85,26 +85,26 @@ namespace ATC { /** construct the appropriate time filter */ TimeFilter * construct(const FilterIntegrationType type = CRANK_NICHOLSON); - + protected: TimeFilterManager(){}; - + /** pointer to access ATC methods */ ATC_Method * atc_; /** description of underlying function form of filter */ TimeFilterType filterType_; - + /** filtering time scale */ double filterScale_; - + /** flag to see if filtering is active */ bool useFilter_; /** flag to see if we are equilibrating the filtered variables */ bool equilibrateFilter_; - + /** flag to reset data */ bool needReset_; @@ -113,7 +113,7 @@ namespace ATC { /** set to store all time filters for later deletion */ std::set timeFilterSet_; - + }; /** @@ -130,12 +130,12 @@ namespace ATC { class TimeFilter { - + public: - + // constructor TimeFilter(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilter(){}; @@ -144,67 +144,67 @@ namespace ATC { /** pre time integration with a target for an initial condition */ virtual void initialize(const MATRIX & /* target */){initialize();}; - + /** Step 1: apply first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & /* filteredQuantity */, const MATRIX & unFilteredQuantity, double /* dt */) { TimeFilter::unFilteredQuantityOld_ = unFilteredQuantity;} - + /** Step 2: apply second step in a time filter update in pre integration phase */ virtual void apply_pre_step2(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** Step 3: apply first step in a time filter update in post integration phase */ virtual void apply_post_step1(MATRIX & filteredQuantity, const MATRIX & unFilteredQuantity, - double /* dt */) + double /* dt */) { filteredQuantity = unFilteredQuantity;}; - + /** Step 4: apply second step in a time filter update in post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, const MATRIX & unFilteredQuantity, double /* dt */) { filteredQuantity = unFilteredQuantity;} - + /** coefficient multipling unfiltered terms in apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double /* dt */){return 0.;}; /** coefficient multipling old filtered terms in apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double /* dt */){return 0.;}; - + /** coefficient multipling unfiltered terms in apply_post_step1 method */ virtual double unfiltered_coefficient_post_s1(double /* dt */){return 0.;}; /** coefficient multipling old filtered terms in apply_post_step1 method */ virtual double filtered_coefficient_post_s1(double /* dt */){return 0.;}; - + /** coefficient multipling unfiltered terms in apply_pre_step2 method */ virtual double unfiltered_coefficient_pre_s2(double /* dt */){return 0.;}; /** coefficient multipling old filtered terms in apply_pre_step2 method */ virtual double filtered_coefficient_pre_s2(double /* dt */){return 0.;}; - + /** coefficient multipling unfiltered terms in apply_post_step2 method */ virtual double unfiltered_coefficient_post_s2(double /* dt */){return 0.;}; /** coefficient multipling old filtered terms in apply_post_step2 method */ virtual double filtered_coefficient_post_s2(double /* dt */){return 0.;}; - + /** rate of filtered quantity to be called in post integration phase */ virtual void rate(MATRIX & rate, const MATRIX & /* filteredQuantity */, const MATRIX & unFilteredQuantity, double dt = 0.0) - { rate = 1/dt*(unFilteredQuantity - TimeFilter::unFilteredQuantityOld_);}; + { rate = 1/dt*(unFilteredQuantity - TimeFilter::unFilteredQuantityOld_);}; protected: - + TimeFilter(){}; /** pointer to access ATC methods */ @@ -218,7 +218,7 @@ namespace ATC { /** member data to track old unfiltered values */ DENS_MAT unFilteredQuantityOld_; - + }; /** @@ -234,29 +234,29 @@ namespace ATC { //-------------------------------------------------------- class TimeFilterExponential : public TimeFilter { - + public: - + // constructor TimeFilterExponential(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterExponential(){}; /** apply first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply second step in a time filter update in pre integration phase */ virtual void apply_pre_step2(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply first step in a time filter update in post integration phase */ virtual void apply_post_step1(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply second step in a time filter update in post integration phase */ virtual void apply_post_step2(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, @@ -279,14 +279,14 @@ namespace ATC { protected: TimeFilterExponential(){}; - + //-------------------------------------------------------- //-------------------------------------------------------- // filter integration functions not associated // with any particular class //-------------------------------------------------------- //-------------------------------------------------------- - + void update_filter(MATRIX & filteredQuantity, const MATRIX & unfilteredQuantity, MATRIX & unfilteredQuantityOld, @@ -313,12 +313,12 @@ namespace ATC { double filtered_coef(double tau, double dt) { return 1./(1./dt+1./(2.*tau))*( 1./dt-1./(2*tau) ); }; - + void update_filter_implicit(MATRIX & filteredQuantity, const MATRIX & unfilteredQuantity, double tau, double dt) - { + { filteredQuantity /= 1.0 + dt/tau; filteredQuantity += (dt)/(tau+dt)*unfilteredQuantity; } @@ -328,13 +328,13 @@ namespace ATC { double tau, double dt) { filteredQuantity += (1./(1.+dt/tau))*(dt/tau)*unfilteredQuantity; }; - + double unfiltered_coef_implicit(double tau, double dt) { return (1./(1.+dt/tau))*(dt/tau); }; double filtered_coef_implicit(double tau, double dt) { return (1./(1.+dt/tau)); }; - + void update_filter_explicit(MATRIX & filteredQuantity, const MATRIX & unfilteredQuantity, double tau, @@ -343,13 +343,13 @@ namespace ATC { filteredQuantity *= (1.-(dt/tau)); filteredQuantity += (dt/tau)*unfilteredQuantity; } - + void add_to_filter_explicit(MATRIX & filteredQuantity, const MATRIX & unfilteredQuantity, double tau, double dt) { filteredQuantity += (dt/tau)*unfilteredQuantity; }; - + double unfiltered_coef_explicit(double tau, double dt) { return (dt/tau); }; @@ -362,28 +362,28 @@ namespace ATC { * @class TimeFilterCrankNicolson * @brief Time Filter using Crank-Nicolson advancement of filtered quantity ODE's */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterCrankNicolson //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterCrankNicolson : public TimeFilterExponential { - + public: - + // constructor TimeFilterCrankNicolson(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterCrankNicolson(){}; /** pre time integration */ virtual void initialize(){throw ATC_Error("TimeFilterCrankNicolson::initialize() an initial condition is required for this time filter");}; - + /** pre time integration with an initial condition */ virtual void initialize(const MATRIX & target); - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, @@ -395,31 +395,31 @@ namespace ATC { MATRIX const & unFilteredQuantity, double dt) { add_to_filter(filteredQuantity,unFilteredQuantity,unFilteredQuantityOld_,TimeFilter::filterScale_,dt); }; - + /** applies second step in a time filter update in the post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter(filteredQuantity,unFilteredQuantity,unFilteredQuantityOld_,TimeFilter::filterScale_,dt); }; - + /** return coefficient multipling unfiltered terms in the apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef(TimeFilter::filterScale_,dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_post_step2 method */ virtual double filtered_coefficient_post_s2(double dt){return filtered_coef(TimeFilter::filterScale_,dt);}; - + protected: - + TimeFilterCrankNicolson(); - + }; - + /** * @class TimeFilterExplicit * @brief Time Filter using explicit advancement of filtered quantity ODE's @@ -431,15 +431,15 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterExplicit : public TimeFilterExponential { - + public: - + // constructor TimeFilterExplicit(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterExplicit(){}; - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, @@ -451,31 +451,31 @@ namespace ATC { MATRIX const & unFilteredQuantity, double dt) { add_to_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); }; - + /** applies second step in a time filter update in the post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); }; - + /** return coefficient multipling unfiltered terms in the apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_post_step2 method */ virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,dt);}; - + protected: - + TimeFilterExplicit(); - + }; - + /** * @class TimeFilterImplicit * @brief Time Filter using implicit advancement of filtered quantity ODE's @@ -487,21 +487,21 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterImplicit : public TimeFilterExponential { - + public: - + // constructor TimeFilterImplicit(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterImplicit(){}; - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); }; - + /** applies second step in a time filter update in the post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, @@ -513,19 +513,19 @@ namespace ATC { /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_post_step2 method */ virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);}; - + protected: - + TimeFilterImplicit(); - + }; - + /** * @class TimeFilterImplicitExplicit * @brief Time Filter using two-step implicit/explicit advancement of filtered quantity ODE's @@ -537,43 +537,43 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterImplicitExplicit : public TimeFilterExponential { - + public: - + // constructor TimeFilterImplicitExplicit(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterImplicitExplicit(){}; - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); }; - + /** applies second step in a time filter update in the post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); }; - + /** return coefficient multipling unfiltered terms in the apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,0.5*dt);}; /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,0.5*dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,0.5*dt);}; /** return coefficient multipling old filtered terms in the apply_post_step2 method */ virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,0.5*dt);}; - + protected: - + TimeFilterImplicitExplicit(); - + }; /** @@ -587,15 +587,15 @@ namespace ATC { //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterExplicitImplicit : public TimeFilterExponential { - + public: - + // constructor TimeFilterExplicitImplicit(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterExplicitImplicit(){}; - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, @@ -619,13 +619,13 @@ namespace ATC { MATRIX const & unFilteredQuantity, double dt) { add_to_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); }; - + /** return coefficient multipling unfiltered terms in the apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,0.5*dt);}; /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,0.5*dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,0.5*dt);}; @@ -633,61 +633,61 @@ namespace ATC { virtual double filtered_coefficient_post_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,0.5*dt);}; protected: - + TimeFilterExplicitImplicit(); - + }; /** * @class TimeFilterImplicitUpdate * @brief Time Filter using implicit advancement of filtered quantity ODE's but adds on contribution at the end of the second step */ - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterImplicitUpdate //-------------------------------------------------------- //-------------------------------------------------------- class TimeFilterImplicitUpdate : public TimeFilterExponential { - + public: - + // constructor TimeFilterImplicitUpdate(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterImplicitUpdate(){}; - + /** applies first step in a time filter update in the pre integration phase */ virtual void apply_pre_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); }; - + /** applies second step in a time filter update in the post integration phase */ virtual void apply_post_step1(MATRIX & filteredQuantity, MATRIX const & unFilteredQuantity, double dt) { add_to_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); }; - + /** return coefficient multipling unfiltered terms in the apply_pre_step1 method */ virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_pre_step1 method */ virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);}; - + /** return coefficient multipling unfiltered terms in the apply_post_step2 method */ virtual double unfiltered_coefficient_post_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);}; /** return coefficient multipling old filtered terms in the apply_post_step2 method */ virtual double filtered_coefficient_post_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);}; - + protected: - + TimeFilterImplicitUpdate(); - + }; - + //-------------------------------------------------------- //-------------------------------------------------------- // Class TimeFilterStep @@ -695,12 +695,12 @@ namespace ATC { //-------------------------------------------------------- class TimeFilterStep : public TimeFilter { - + public: - + // constructor TimeFilterStep(TimeFilterManager & timeFilterManager); - + // destructor virtual ~TimeFilterStep(){}; @@ -711,23 +711,23 @@ namespace ATC { virtual void apply_pre_step1(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply second step in a time filter update in pre integration phase */ virtual void apply_pre_step2(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply first step in a time filter update in post integration phase */ virtual void apply_post_step1(MATRIX & /* filteredQuantity */, const MATRIX & /* unFilteredQuantity */, double /* dt */) {}; - + /** apply second step in a time filter update in post integration phase */ virtual void apply_post_step2(MATRIX & filteredQuantity, const MATRIX & unFilteredQuantity, - double dt) + double dt) { update_filter(filteredQuantity, unFilteredQuantity, - TimeFilter::unFilteredQuantityOld_, TimeFilter::filterScale_, dt); + TimeFilter::unFilteredQuantityOld_, TimeFilter::filterScale_, dt); } /** time rate of filtered quantity */ @@ -745,9 +745,9 @@ namespace ATC { protected: TimeFilterStep(){}; - + double elapsedTime_; - + void update_filter(MATRIX & filteredQuantity, const MATRIX & unfilteredQuantity, MATRIX & unfilteredQuantitySum, @@ -764,10 +764,10 @@ namespace ATC { else { // a running average elapsedTime_ += dt; unfilteredQuantitySum += unfilteredQuantity*dt; - filteredQuantity = unfilteredQuantitySum; + filteredQuantity = unfilteredQuantitySum; filteredQuantity /= elapsedTime_; } - if (elapsedTime_ >= tau && tau > 0) { + if (elapsedTime_ >= tau && tau > 0) { elapsedTime_ = 0.0; } }; diff --git a/lib/atc/TimeIntegrator.cpp b/lib/atc/TimeIntegrator.cpp index f370d17170..85d1193117 100644 --- a/lib/atc/TimeIntegrator.cpp +++ b/lib/atc/TimeIntegrator.cpp @@ -10,7 +10,7 @@ namespace ATC { // Class AtomTimeIntegratorType //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -45,14 +45,14 @@ namespace ATC { void AtomTimeIntegratorType::init_integrate_velocity(double dt) { const DENS_MAT & m(mass_->quantity()); - + _deltaQuantity_ = force_->quantity(); _deltaQuantity_ /= m; _deltaQuantity_ *= 0.5*dt; (*velocity_) += _deltaQuantity_; } - + //-------------------------------------------------------- // initial_integrate_position // position update in first part of velocity-verlet @@ -84,7 +84,7 @@ namespace ATC { // Class TimeIntegrator //-------------------------------------------------------- //-------------------------------------------------------- - + //-------------------------------------------------------- // Constructor //-------------------------------------------------------- @@ -170,7 +170,7 @@ namespace ATC { //-------------------------------------------------------- // pre_final_integrate1 - // first time integration computations + // first time integration computations // before Verlet step 2 //-------------------------------------------------------- void TimeIntegrator::pre_final_integrate1(double dt) @@ -190,7 +190,7 @@ namespace ATC { //-------------------------------------------------------- // post_final_integrate1 - // first time integration computations + // first time integration computations // after Verlet step 2 //-------------------------------------------------------- void TimeIntegrator::post_final_integrate1(double dt) @@ -270,7 +270,7 @@ namespace ATC { void TimeIntegrator::pack_fields(RESTART_LIST & data) { timeIntegrationMethod_->pack_fields(data); - + //timeFilter_->pack_fields(data); } @@ -292,7 +292,7 @@ namespace ATC { //-------------------------------------------------------- // Constructor // Grab data from ATC - //-------------------------------------------------------- + //-------------------------------------------------------- TimeIntegrationMethod::TimeIntegrationMethod(TimeIntegrator * timeIntegrator) : timeIntegrator_(timeIntegrator), atc_(timeIntegrator_->atc()) diff --git a/lib/atc/TimeIntegrator.h b/lib/atc/TimeIntegrator.h index ccb9b9f426..109aedc195 100644 --- a/lib/atc/TimeIntegrator.h +++ b/lib/atc/TimeIntegrator.h @@ -18,7 +18,7 @@ namespace ATC { */ class AtomTimeIntegrator { - + public: // constructor @@ -29,7 +29,7 @@ namespace ATC { /** create and get necessary transfer operators */ virtual void construct_transfers(){}; - + /** Predictor phase, Verlet first step for velocity */ virtual void init_integrate_velocity(double /* dt */){}; @@ -47,7 +47,7 @@ namespace ATC { */ class AtomTimeIntegratorType : public AtomTimeIntegrator { - + public: // constructor @@ -58,7 +58,7 @@ namespace ATC { /** create and get necessary transfer operators */ virtual void construct_transfers(); - + /** Predictor phase, Verlet first step for velocity */ virtual void init_integrate_velocity(double dt); @@ -102,9 +102,9 @@ namespace ATC { * @class TimeIntegrator * @brief Base class for various time integrators for FE quantities */ - + class TimeIntegrator { - + public: /** types of time integration */ @@ -119,14 +119,14 @@ namespace ATC { CRANK_NICOLSON, DIRECT }; - + // constructor TimeIntegrator(ATC_Coupling * atc, TimeIntegrationType timeIntegrationType = STEADY); - + // destructor virtual ~TimeIntegrator(); - + /** parser/modifier */ virtual bool modify(int /* narg */, char ** /* arg */){return false;}; @@ -141,7 +141,7 @@ namespace ATC { /** flag if reset is needed */ bool need_reset() const {return needReset_;}; - + // time step methods, corresponding to ATC_Coupling /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double dt); @@ -152,12 +152,12 @@ namespace ATC { virtual void post_initial_integrate1(double dt); /** second part of post_initial_integrate */ virtual void post_initial_integrate2(double dt); - + /** first part of pre_final_integrate */ virtual void pre_final_integrate1(double dt); /** second part of pre_final_integrate */ virtual void pre_final_integrate2(double dt); - + /** first part of post_final_integrate */ virtual void post_final_integrate1(double dt); /** second part of post_final_integrate */ @@ -206,19 +206,19 @@ namespace ATC { /** pointer to time integrator method */ TimeIntegrationMethod * timeIntegrationMethod_; - + /** pointer to access ATC methods */ ATC_Coupling * atc_; - + /** time filter for specific updates */ TimeFilter * timeFilter_; /** time filter manager for getting time filtering info */ TimeFilterManager * timeFilterManager_; - + /** type of integration scheme being used */ TimeIntegrationType timeIntegrationType_; - + /** flat to reset data */ bool needReset_; @@ -235,12 +235,12 @@ namespace ATC { */ class TimeIntegrationMethod { - + public: - + // constructor TimeIntegrationMethod(TimeIntegrator * timeIntegrator); - + // destructor virtual ~TimeIntegrationMethod(){}; @@ -248,7 +248,7 @@ namespace ATC { virtual void construct_transfers(){}; /** pre time integration */ virtual void initialize(){}; - + // time step methods, corresponding to ATC_Coupling and TimeIntegrator /** first part of pre_initial_integrate */ virtual void pre_initial_integrate1(double /* dt */){}; @@ -259,12 +259,12 @@ namespace ATC { virtual void post_initial_integrate1(double /* dt */){}; /** second part of post_initial_integrate */ virtual void post_initial_integrate2(double /* dt */){}; - + /** first part of pre_final_integrate */ virtual void pre_final_integrate1(double /* dt */){}; /** second part of pre_final_integrate */ virtual void pre_final_integrate2(double /* dt */){}; - + /** first part of post_final_integrate */ virtual void post_final_integrate1(double /* dt */){}; /** second part of post_final_integrate */ @@ -288,7 +288,7 @@ namespace ATC { /** finalize any states */ virtual void finish(){}; - + protected: /** owning time integrator */ @@ -358,7 +358,7 @@ namespace ATC { dot_f = dot_f + (1./dt)*R_f; ddot_f = ddot_f + (1./dt/dt)*R_f; }; - + inline void explicit_1(MATRIX & f, const MATRIX & dot_f, double dt) diff --git a/lib/atc/TransferLibrary.cpp b/lib/atc/TransferLibrary.cpp index b77a91fd2e..bfce8da9c5 100644 --- a/lib/atc/TransferLibrary.cpp +++ b/lib/atc/TransferLibrary.cpp @@ -37,7 +37,7 @@ namespace ATC { shapeFunction_(shapeFunction), lammpsInterface_(atc->lammps_interface()), feEngine_(atc->fe_engine()), - tol_(1.e-10) + tol_(1.e-10) { shapeFunction_->register_dependence(this); } @@ -65,7 +65,7 @@ namespace ATC { _scale_.resize(nNodes); for (int i = 0; i < nNodes; i++) { - if ((abs(lhs(i,i)) > 0.)) + if ((abs(lhs(i,i)) > 0.)) _scale_(i) = 1.; else _scale_(i) = 0.; @@ -78,7 +78,7 @@ namespace ATC { } } lhs.compress(); - + // solve equation LinearSolver solver(lhs, ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC, true); solver.set_max_iterations(lhs.nRows()); @@ -146,7 +146,7 @@ namespace ATC { shapeFunction_(shapeFunction), atomElement_(atomElement), feEngine_(atc->fe_engine()), - tol_(1.e-10) + tol_(1.e-10) { shapeFunction_->register_dependence(this); if (!atomElement_) { @@ -162,7 +162,7 @@ namespace ATC { void NodalAtomVolumeElement::reset_quantity() const { // Using analyses by G. Wagner and J. Templeton, weights ~ phi*M^{-1}*V - // where phi are the dimensionless shape/weighting functions, + // where phi are the dimensionless shape/weighting functions, // M is the "mass" matrix M_IJ, // V is the vector of nodal and element volumes // @@ -185,11 +185,11 @@ namespace ATC { int thisCol = nNodes+atomElement(a,0); nodEltShpFcnMatrix.set(a,thisCol,1); } - + SPAR_MAT neMassMatrix(neSize,neSize); atc_->compute_consistent_md_mass_matrix(nodEltShpFcnMatrix,neMassMatrix); - - // form vector of nodal and elemental volumes + + // form vector of nodal and elemental volumes _nodeVolumesMatrix_.resize(nNodes,nNodes); feEngine_->compute_lumped_mass_matrix(_nodeVolumesMatrix_); _nodeVolumes_.resize(nNodes); @@ -217,13 +217,13 @@ namespace ATC { averageEltVolume += (maxx-minx)*(maxy-miny)*(maxz-minz); } averageEltVolume /= nElts; - + // correct entries of mass matrix if no atoms in shape function support double totalNodalVolume = _nodeVolumes_.sum(); double averageNodalVolume = totalNodalVolume/nNodes; _scale_.resize(neSize); for (int i = 0; i < neSize; i++) { - if ((abs(neMassMatrix(i,i)) > 0.)) { + if ((abs(neMassMatrix(i,i)) > 0.)) { _scale_(i) = 1.; } else { printf("No atoms are in support of node/element %i\n",i); @@ -234,7 +234,7 @@ namespace ATC { for (int i = 0; i < neSize; i++) { if (_scale_(i) < 0.5) { neMassMatrix.set(i,i,1.); - if (i < nNodes) { + if (i < nNodes) { _nodeElementVolumes_(i) = averageNodalVolume; } else { _nodeElementVolumes_(i) = averageEltVolume; @@ -242,11 +242,11 @@ namespace ATC { } } neMassMatrix.compress(); - + // solve equation LinearSolver solver(neMassMatrix, ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC, true); solver.set_max_iterations(neMassMatrix.nRows()); - double myTol = 1.e-10; + double myTol = 1.e-10; solver.set_tolerance(myTol); quantity_.resize(neSize,0); CLON_VEC tempQuantity(quantity_,CLONE_COL,0); @@ -329,7 +329,7 @@ namespace ATC { if (!hasGhost_) { hasGhost_ = (atc->interscale_manager()).dense_matrix_int("ElementHasGhost"); } - + hasInternal_->register_dependence(this); if (hasGhost_) hasGhost_->register_dependence(this); } @@ -354,7 +354,7 @@ namespace ATC { quantity_(i,0) = !hasInternal(i,0); } } - + const set & nullElements = feEngine_->null_elements(); set::const_iterator iset; for (iset = nullElements.begin(); iset != nullElements.end(); iset++) { @@ -421,7 +421,7 @@ namespace ATC { SetDependencyManager * nodeSet) : nodeSet_(nodeSet), feMesh_((atc->fe_engine())->fe_mesh()) - { + { nodeSet_->register_dependence(this); } @@ -483,15 +483,15 @@ namespace ATC { _nodesGhost_.reset(nNodes_); _nodesGhost_ = 0; Array nodes; - - - + + + vector myElems = feEngine_->fe_mesh()->owned_elts(); if (hasGhost_) { const INT_ARRAY & hasGhost(hasGhost_->quantity()) ; // iterate through all elements owned by this processor - - + + for (vector::iterator elemsIter = myElems.begin(); elemsIter != myElems.end(); ++elemsIter) @@ -510,7 +510,7 @@ namespace ATC { } } // sum up partial result arrays - + lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesInternal_.ptr(), _nodesInternal_.size()); lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesGhost_.ptr(), _nodesGhost_.size()); } @@ -582,9 +582,9 @@ namespace ATC { _nodesGhost_.reset(nNodes_); _nodesGhost_ = 0; Array nodes; - - - + + + vector myElems = feEngine_->fe_mesh()->owned_elts(); // iterate through all elements owned by this processor for (vector::iterator elemsIter = myElems.begin(); @@ -605,7 +605,7 @@ namespace ATC { } } } - + // sum up partial result arrays lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesInternal_.ptr(), _nodesInternal_.size()); lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesGhost_.ptr(), _nodesGhost_.size()); @@ -882,7 +882,7 @@ namespace ATC { } } } - + //-------------------------------------------------------- //-------------------------------------------------------- // Class MappedQuantity @@ -967,7 +967,7 @@ namespace ATC { { const INT_ARRAY & nodeType(nodalGeometryType_->quantity()); quantity_.clear(); - + for (int i = 0; i < nodeType.size(); ++i) { if (nodeType(i,0) != FE_ONLY) { quantity_.insert(i); @@ -981,7 +981,7 @@ namespace ATC { void RegulatedNodes::insert_boundary_nodes() const { const INT_ARRAY & nodeType(nodalGeometryType_->quantity()); - + for (int i = 0; i < nodeType.size(); ++i) { if (nodeType(i,0) == BOUNDARY) { quantity_.insert(i); @@ -1012,7 +1012,7 @@ namespace ATC { //-------------------------------------------------------- void RegulatedNodes::insert_fixed_nodes() const { - + const INT_ARRAY & nodeType(nodalGeometryType_->quantity()); map::const_iterator fs_iter; @@ -1038,7 +1038,7 @@ namespace ATC { const INT_ARRAY & nodeType(nodalGeometryType_->quantity()); set::const_iterator inode; map::const_iterator fs_iter; - + for (fs_iter = fieldSizes_.begin(); fs_iter != fieldSizes_.end(); fs_iter++) { for (int j = 0; j < fs_iter->second; j++) { set faceFluxNodes = prescribedDataManager_->flux_face_nodes(fs_iter->first,j); @@ -1104,7 +1104,7 @@ namespace ATC { void FluxNodes::reset_quantity() const { quantity_.clear(); - + // a) they have a fixed face flux RegulatedNodes::insert_face_fluxes(); @@ -1161,7 +1161,7 @@ namespace ATC { void FixedNodes::reset_quantity() const { quantity_.clear(); - + // a) they are a fixed node RegulatedNodes::insert_fixed_nodes(); } @@ -1533,7 +1533,7 @@ namespace ATC { DENS_MAN* atomCoarseGrainingPositions): atc_(atc), source_(source), - kernelFunction_(kernelFunction), + kernelFunction_(kernelFunction), atomCoarseGrainingPositions_(atomCoarseGrainingPositions), feMesh_((atc_->fe_engine())->fe_mesh()) { @@ -1551,7 +1551,7 @@ namespace ATC { int nNodes = feMesh_->num_nodes_unique(); quantity_.resize(nNodes,source.nCols()); _quantityLocal_.reset(nNodes,source.nCols()); - + if (source.nRows()>0) { DENS_VEC xI(positions.nCols()),xa(positions.nCols()),xaI(positions.nCols()); double val; @@ -1696,7 +1696,7 @@ namespace ATC { _localWeights_ = (accumulant_->quantity()).col_sum(); } lammpsInterface_->allsum(_localWeights_.ptr(),_weights_.ptr(),nNodes); - + // assign weights quantity_.resize(nNodes,nNodes); for (int i = 0; i < nNodes; i++) { @@ -1732,7 +1732,7 @@ namespace ATC { { const DENS_MAT & weights(weights_->quantity()); int nNodes = weights.nRows(); - + // assign weights quantity_.resize(nNodes,nNodes); for (int i = 0; i < nNodes; i++) { @@ -1756,7 +1756,7 @@ namespace ATC { //-------------------------------------------------------- KernelInverseVolumes::KernelInverseVolumes(ATC_Method * atc, KernelFunction* kernelFunction): - kernelFunction_(kernelFunction), + kernelFunction_(kernelFunction), feMesh_((atc->fe_engine())->fe_mesh()) { // do nothing @@ -1807,7 +1807,7 @@ namespace ATC { quantity_.resize(nNodes,source.nCols()); _quantityLocal_.reset(nNodes,source.nCols()); DENS_VEC xj(atc_->nsd()); - + if (source.nRows()>0) { for (int j = 0; j < source.nRows(); j++) { for (int k = 0; k < atc_->nsd(); k++) { @@ -1820,7 +1820,7 @@ namespace ATC { //quantity_(inode,k) += shp(I)*source(j,k); _quantityLocal_(inode,k) += shp(I)*source(j,k); } - } + } } } // accumulate across processors @@ -1946,7 +1946,7 @@ namespace ATC { //-------------------------------------------------------- void NativeShapeFunctionGradient::reset_quantity() const { - feEngine_->compute_gradient_matrix(quantity_); + feEngine_->compute_gradient_matrix(quantity_); } //-------------------------------------------------------- @@ -1971,7 +1971,7 @@ namespace ATC { //-------------------------------------------------------- // destructor //-------------------------------------------------------- - OnTheFlyShapeFunctionProlongation::~OnTheFlyShapeFunctionProlongation() + OnTheFlyShapeFunctionProlongation::~OnTheFlyShapeFunctionProlongation() { atomCoarseGrainingPositions_->remove_dependence(this); }; diff --git a/lib/atc/TransferLibrary.h b/lib/atc/TransferLibrary.h index d1f27e5e6d..0f33e8071b 100644 --- a/lib/atc/TransferLibrary.h +++ b/lib/atc/TransferLibrary.h @@ -25,14 +25,14 @@ namespace ATC { * @class NodalAtomVolume * @brief Computes the nodal volumes which coarse grain the volume per atom */ - + class NodalAtomVolume : public DenseMatrixTransfer { public: - + // constructor NodalAtomVolume(ATC_Method * atc, SPAR_MAN * shapeFunction); - + // destructor virtual ~NodalAtomVolume() {shapeFunction_->remove_dependence(this);}; @@ -81,14 +81,14 @@ namespace ATC { * @class NodalVolume * @brief Computes the nodal volumes associated with the support of each nodal shape function */ - + class NodalVolume : public NodalAtomVolume { public: - + // constructor NodalVolume(ATC_Method * atc, SPAR_MAN * shapeFunction) : NodalAtomVolume(atc,shapeFunction) {}; - + // destructor virtual ~NodalVolume() {}; @@ -108,15 +108,15 @@ namespace ATC { * @class NodalAtomVolumeElement * @brief Computes the nodal volumes which coarse grain the volume per atom based on element volumes */ - + class NodalAtomVolumeElement : public DenseMatrixTransfer { public: - + // constructor NodalAtomVolumeElement(ATC_Method * atc, SPAR_MAN * shapeFunction, PerAtomQuantity * atomElement=nullptr); - + // destructor virtual ~NodalAtomVolumeElement() { shapeFunction_->remove_dependence(this); @@ -170,11 +170,11 @@ namespace ATC { class AtomTypeElement : public DenseMatrixTransfer { public: - + // constructor AtomTypeElement(ATC_Coupling * atc, PerAtomQuantity * atomElement = nullptr); - + // destructor virtual ~AtomTypeElement() { atomElement_->remove_dependence(this); @@ -208,12 +208,12 @@ namespace ATC { class ElementMask : public DenseMatrixTransfer { public: - + // constructor ElementMask(ATC_Coupling * atc, MatrixDependencyManager * hasInternal = nullptr, MatrixDependencyManager * hasGhost = nullptr); - + // destructor virtual ~ElementMask() { hasInternal_->remove_dependence(this); @@ -248,11 +248,11 @@ namespace ATC { class AtomElementMask : public DenseMatrixTransfer { public: - + // constructor AtomElementMask(ATC_Coupling * atc, MatrixDependencyManager * hasAtoms = nullptr); - + // destructor virtual ~AtomElementMask() { hasAtoms_->remove_dependence(this); @@ -280,16 +280,16 @@ namespace ATC { * @class NodalGeometryType * @brief Computes the computational geometry associated with each node with respect to the FE and MD regions */ - + class NodalGeometryType : public DenseMatrixTransfer { public: - + // constructor NodalGeometryType(ATC_Coupling * atc, MatrixDependencyManager * hasInternal = nullptr, MatrixDependencyManager * hasGhost = nullptr); - + // destructor virtual ~NodalGeometryType() { hasInternal_->remove_dependence(this); @@ -331,15 +331,15 @@ namespace ATC { * @class NodalGeometryTypeElementSet * @brief Divdes nodes into MD, FE, and boundary based on if they are connected to nodes in internal and not internal */ - + class NodalGeometryTypeElementSet : public DenseMatrixTransfer { public: - + // constructor NodalGeometryTypeElementSet(ATC_Coupling * atc, MatrixDependencyManager * hasInternal = nullptr); - + // destructor virtual ~NodalGeometryTypeElementSet() { hasInternal_->remove_dependence(this); @@ -381,10 +381,10 @@ namespace ATC { class LargeToSmallMap : public DenseMatrixTransfer { public: - + // constructor LargeToSmallMap() : size_(0) {}; - + // destructor virtual ~LargeToSmallMap() {}; @@ -400,17 +400,17 @@ namespace ATC { /** * @class NodeToSubset - * @brief mapping from all nodes to a subset + * @brief mapping from all nodes to a subset */ class NodeToSubset : public LargeToSmallMap { public: - + // constructor NodeToSubset(ATC_Method * atc, SetDependencyManager * subsetNodes); - + // destructor virtual ~NodeToSubset() { subsetNodes_->remove_dependence(this); @@ -420,7 +420,7 @@ namespace ATC { virtual void reset_quantity() const; protected: - + /** pointer to atc to get the number of nodes */ const ATC_Method * atc_; @@ -436,16 +436,16 @@ namespace ATC { /** * @class SubsetToNode - * @brief mapping from a subset of nodes to all nodes + * @brief mapping from a subset of nodes to all nodes */ class SubsetToNode : public DenseMatrixTransfer { public: - + // constructor SubsetToNode(NodeToSubset * nodeToSubset); - + // destructor virtual ~SubsetToNode() { nodeToSubset_->remove_dependence(this); @@ -470,16 +470,16 @@ namespace ATC { * @class ReducedSparseMatrix * @brief reduction of a sparse matrix to only those columns consistent with the map */ - + class ReducedSparseMatrix : public SparseMatrixTransfer { public: - + // constructor ReducedSparseMatrix(ATC_Method * atc, SPAR_MAN * source, LargeToSmallAtomMap * map); - + // destructor virtual ~ReducedSparseMatrix(); @@ -509,17 +509,17 @@ namespace ATC { * @class RowMappedSparseMatrix * @brief mapping of rows from a sparse matrix to a new sparse matrix */ - + class RowMappedSparseMatrix : public ReducedSparseMatrix { public: - + // constructor RowMappedSparseMatrix(ATC_Method * atc, SPAR_MAN * source, LargeToSmallAtomMap * map) : ReducedSparseMatrix(atc,source,map) {}; - + // destructor virtual ~RowMappedSparseMatrix() {}; @@ -539,16 +539,16 @@ namespace ATC { * @class RowMappedSparseMatrixVector * @brief mapping of rows from a vector sparse matrices to a new vector of sparse matrices */ - + class RowMappedSparseMatrixVector : public VectorTransfer { public: - + // constructor RowMappedSparseMatrixVector(ATC_Method * atc, VectorDependencyManager * source, LargeToSmallAtomMap * map); - + // destructor virtual ~RowMappedSparseMatrixVector(); @@ -578,16 +578,16 @@ namespace ATC { * @class MappedDiagonalMatrix * @brief mapping of a diagonal matrix to a new diagronal matrix */ - + class MappedDiagonalMatrix : public DiagonalMatrixTransfer { public: - + // constructor MappedDiagonalMatrix(ATC_Method * atc, DIAG_MAN * source, LargeToSmallAtomMap * map); - + // destructor virtual ~MappedDiagonalMatrix(); @@ -613,16 +613,16 @@ namespace ATC { * @class MappedQuantity * @brief generic reduced mapping */ - + class MappedQuantity : public DenseMatrixTransfer { public: - + // constructor MappedQuantity(ATC_Method * atc, DENS_MAN * source, LargeToSmallMap * map); - + // destructor virtual ~MappedQuantity() { source_->remove_dependence(this); @@ -655,12 +655,12 @@ namespace ATC { class RegulatedNodes : public SetTransfer { public: - + // constructor RegulatedNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr); - + // destructor virtual ~RegulatedNodes() { nodalGeometryType_->remove_dependence(this); @@ -717,13 +717,13 @@ namespace ATC { class FluxNodes : public RegulatedNodes { public: - + // constructor FluxNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : RegulatedNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~FluxNodes() {}; @@ -747,13 +747,13 @@ namespace ATC { class BoundaryNodes : public RegulatedNodes { public: - + // constructor BoundaryNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : RegulatedNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~BoundaryNodes() {}; @@ -777,13 +777,13 @@ namespace ATC { class FluxBoundaryNodes : public FluxNodes { public: - + // constructor FluxBoundaryNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : FluxNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~FluxBoundaryNodes() {}; @@ -807,13 +807,13 @@ namespace ATC { class AllRegulatedNodes : public FluxBoundaryNodes { public: - + // constructor AllRegulatedNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : FluxBoundaryNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~AllRegulatedNodes() {}; @@ -837,13 +837,13 @@ namespace ATC { class FixedNodes : public RegulatedNodes { public: - + // constructor FixedNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : RegulatedNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~FixedNodes() {}; @@ -867,13 +867,13 @@ namespace ATC { class FixedBoundaryNodes : public FixedNodes { public: - + // constructor FixedBoundaryNodes(ATC_Coupling * atc, FieldName fieldName = NUM_TOTAL_FIELDS, MatrixDependencyManager * nodalGeometryType = nullptr) : FixedNodes(atc,fieldName,nodalGeometryType) {}; - + // destructor virtual ~FixedBoundaryNodes() {}; @@ -896,7 +896,7 @@ namespace ATC { class ElementMaskNodeSet : public DenseMatrixTransfer { public: - + // constructor ElementMaskNodeSet(ATC_Coupling * atc, SetDependencyManager * nodeSet); @@ -962,7 +962,7 @@ namespace ATC { * @class Interpolant * @brief constructs the spatial values of the shape functions */ - + class Interpolant : public SparseMatrixTransfer { public: @@ -970,8 +970,8 @@ namespace ATC { // constructor Interpolant(ATC_Method * atc, MatrixDependencyManager* pointToElementMap, - DENS_MAN* pointPositions); - + DENS_MAN* pointPositions); + // destructor virtual ~Interpolant() { pointToElementMap_->remove_dependence(this); @@ -1005,7 +1005,7 @@ namespace ATC { * @class InterpolantGradient * @brief constructs the spatial derivatives of the shape functions */ - + class InterpolantGradient : public VectorTransfer { public: @@ -1013,8 +1013,8 @@ namespace ATC { // constructor InterpolantGradient(ATC_Method * atc, MatrixDependencyManager* pointToElementMap, - DENS_MAN* pointPositions); - + DENS_MAN* pointPositions); + // destructor virtual ~InterpolantGradient(); @@ -1045,7 +1045,7 @@ namespace ATC { * @class PerAtomShapeFunctionGradient * @brief constructs the spatial derivatives of the shape functions at each atom */ - + class PerAtomShapeFunctionGradient : public VectorTransfer { public: @@ -1055,8 +1055,8 @@ namespace ATC { MatrixDependencyManager* atomToElementMap = nullptr, DENS_MAN* atomPositions = nullptr, const std::string & tag = "AtomicShapeFunctionGradient", - AtomType atomType = INTERNAL); - + AtomType atomType = INTERNAL); + // destructor virtual ~PerAtomShapeFunctionGradient(); @@ -1090,7 +1090,7 @@ namespace ATC { * @class InterpolantSmallMolecule * @brief constructs the spatial values of the shape functions for small molecules */ - + class InterpolantSmallMolecule : public Interpolant { public: @@ -1099,8 +1099,8 @@ namespace ATC { InterpolantSmallMolecule(ATC_Method * atc, MatrixDependencyManager* moleculeToElementMap, DENS_MAN* moleculePositions, - MoleculeSet * moleculeSet); - + MoleculeSet * moleculeSet); + // destructor virtual ~InterpolantSmallMolecule(); @@ -1134,10 +1134,10 @@ namespace ATC { class DenseMatrixQuotient : public DenseMatrixTransfer { public: - + // constructor DenseMatrixQuotient(DENS_MAN * matrixNumerator, DENS_MAN * matrixDenominator); - + // destructor virtual ~DenseMatrixQuotient() { matrixNumerator_->remove_dependence(this); @@ -1151,8 +1151,8 @@ namespace ATC { virtual int nCols() const {return matrixNumerator_->nCols();}; protected: - - DENS_MAN* matrixNumerator_; + + DENS_MAN* matrixNumerator_; DENS_MAN* matrixDenominator_; private: @@ -1170,10 +1170,10 @@ namespace ATC { class DenseMatrixSum : public DenseMatrixTransfer { public: - + // constructor DenseMatrixSum(DENS_MAN * matrixOne, DENS_MAN * matrixTwo); - + // destructor virtual ~DenseMatrixSum() { matrixOne_->remove_dependence(this); @@ -1187,8 +1187,8 @@ namespace ATC { virtual int nCols() const {return matrixOne_->nCols();}; protected: - - DENS_MAN* matrixOne_; + + DENS_MAN* matrixOne_; DENS_MAN* matrixTwo_; private: @@ -1206,10 +1206,10 @@ namespace ATC { class DenseMatrixDelta : public DenseMatrixTransfer { public: - + // constructor DenseMatrixDelta(DENS_MAN * current, DENS_MAT * reference); - + // destructor virtual ~DenseMatrixDelta() { matrix_->remove_dependence(this); @@ -1219,8 +1219,8 @@ namespace ATC { virtual void reset_quantity() const; protected: - - DENS_MAN* matrix_; + + DENS_MAN* matrix_; DENS_MAT* reference_; private: @@ -1234,7 +1234,7 @@ namespace ATC { * @class OnTheFlyKernelAccumulation * @brief implements the accumulant on the fly */ - + class OnTheFlyKernelAccumulation : public DenseMatrixTransfer { public: @@ -1243,8 +1243,8 @@ namespace ATC { OnTheFlyKernelAccumulation(ATC_Method * atc, PerAtomQuantity * source, KernelFunction* kernelFunction, - DENS_MAN* atomCoarseGrainingPositions); - + DENS_MAN* atomCoarseGrainingPositions); + // destructor virtual ~OnTheFlyKernelAccumulation() { source_->remove_dependence(this); @@ -1285,7 +1285,7 @@ namespace ATC { * @class OnTheFlyKernelAccumulationNormalized * @brief implements a normalized accumulant on the fly */ - + class OnTheFlyKernelAccumulationNormalized : public OnTheFlyKernelAccumulation { public: @@ -1296,7 +1296,7 @@ namespace ATC { KernelFunction* kernelFunction, DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights); - + // destructor virtual ~OnTheFlyKernelAccumulationNormalized() { weights_->remove_dependence(this); @@ -1320,7 +1320,7 @@ namespace ATC { * @class OnTheFlyKernelAccumulationNormalizedReferenced * @brief implements a normalized referenced accumulant on the fly */ - + class OnTheFlyKernelAccumulationNormalizedReferenced : public OnTheFlyKernelAccumulationNormalized { public: @@ -1332,7 +1332,7 @@ namespace ATC { DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights, DENS_MAN * reference); - + // destructor virtual ~OnTheFlyKernelAccumulationNormalizedReferenced() { reference_->remove_dependence(this); @@ -1357,7 +1357,7 @@ namespace ATC { * @class OnTheFlyKernelNormalizedAccumulationScaled * @brief implements a scaled accumulant on the fly */ - + class OnTheFlyKernelAccumulationNormalizedScaled : public OnTheFlyKernelAccumulationNormalized { public: @@ -1369,7 +1369,7 @@ namespace ATC { DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights, const double scale); - + // destructor virtual ~OnTheFlyKernelAccumulationNormalizedScaled() { atomCoarseGrainingPositions_->remove_dependence(this); @@ -1397,10 +1397,10 @@ namespace ATC { class AccumulantWeights : public DiagonalMatrixTransfer { public: - + // constructor AccumulantWeights(SPAR_MAN * accumulant); - + // destructor virtual ~AccumulantWeights() { accumulant_->remove_dependence(this); @@ -1410,7 +1410,7 @@ namespace ATC { virtual void reset_quantity() const; protected: - + SPAR_MAN* accumulant_; // workspace @@ -1432,10 +1432,10 @@ namespace ATC { class OnTheFlyKernelWeights : public DiagonalMatrixTransfer { public: - + // constructor OnTheFlyKernelWeights(DENS_MAN * weights); - + // destructor virtual ~OnTheFlyKernelWeights() { weights_->remove_dependence(this); @@ -1445,7 +1445,7 @@ namespace ATC { virtual void reset_quantity() const; protected: - + DENS_MAN* weights_; private: @@ -1463,11 +1463,11 @@ namespace ATC { class KernelInverseVolumes : public DiagonalMatrixTransfer { public: - + // constructor KernelInverseVolumes(ATC_Method * atc, KernelFunction* kernelFunction); - + // destructor virtual ~KernelInverseVolumes() {}; @@ -1475,7 +1475,7 @@ namespace ATC { virtual void reset_quantity() const; protected: - + /** kernel function being used */ KernelFunction* kernelFunction_; @@ -1493,7 +1493,7 @@ namespace ATC { * @class OnTheFlyMeshAccumulation * @brief implements the mesh-based accumulant on the fly */ - + class OnTheFlyMeshAccumulation : public DenseMatrixTransfer { public: @@ -1501,8 +1501,8 @@ namespace ATC { // constructor OnTheFlyMeshAccumulation(ATC_Method * atc, PerAtomQuantity * source, - DENS_MAN* atomCoarseGrainingPositions); - + DENS_MAN* atomCoarseGrainingPositions); + // destructor virtual ~OnTheFlyMeshAccumulation() { source_->remove_dependence(this); @@ -1513,7 +1513,7 @@ namespace ATC { virtual void reset_quantity() const; /** access nCols_ */ - virtual int nCols() const { return source_->nCols(); } + virtual int nCols() const { return source_->nCols(); } protected: @@ -1543,7 +1543,7 @@ namespace ATC { * @class OnTheFlyMeshAccumulationNormalized * @brief implements a normalized mesh-based accumulant on the fly */ - + class OnTheFlyMeshAccumulationNormalized : public OnTheFlyMeshAccumulation { public: @@ -1553,7 +1553,7 @@ namespace ATC { PerAtomQuantity * source, DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights); - + // destructor virtual ~OnTheFlyMeshAccumulationNormalized() { weights_->remove_dependence(this); @@ -1577,7 +1577,7 @@ namespace ATC { * @class OnTheFlyMeshAccumulationNormalizedReferenced * @brief implements a normalized referenced mesh-based accumulant on the fly */ - + class OnTheFlyMeshAccumulationNormalizedReferenced : public OnTheFlyMeshAccumulationNormalized { public: @@ -1588,7 +1588,7 @@ namespace ATC { DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights, DENS_MAN * reference); - + // destructor virtual ~OnTheFlyMeshAccumulationNormalizedReferenced() { reference_->remove_dependence(this); @@ -1613,7 +1613,7 @@ namespace ATC { * @class OnTheFlyMeshAccumulationNormalizedScaled * @brief implements a scaled mesh-based accumulant on the fly */ - + class OnTheFlyMeshAccumulationNormalizedScaled : public OnTheFlyMeshAccumulationNormalized { public: @@ -1624,7 +1624,7 @@ namespace ATC { DENS_MAN* atomCoarseGrainingPositions, DIAG_MAN* weights, const double scale); - + // destructor virtual ~OnTheFlyMeshAccumulationNormalizedScaled() { atomCoarseGrainingPositions_->remove_dependence(this); @@ -1648,14 +1648,14 @@ namespace ATC { * @class NativeShapeFunctionGradient * @brief constructs the spatial derivatives of the shape functions */ - + class NativeShapeFunctionGradient : public VectorTransfer { public: // constructor NativeShapeFunctionGradient(ATC_Method * atc); - + // destructor virtual ~NativeShapeFunctionGradient(); @@ -1680,7 +1680,7 @@ namespace ATC { * @class OnTheFlyShapeFunctionProlongation * @brief implements the interpolant on the fly */ - + class OnTheFlyShapeFunctionProlongation : public FeToAtomTransfer { public: @@ -1688,8 +1688,8 @@ namespace ATC { // constructor OnTheFlyShapeFunctionProlongation(ATC_Method * atc, DENS_MAN * source, - DENS_MAN * atomCoarseGrainingPositions); - + DENS_MAN * atomCoarseGrainingPositions); + // destructor virtual ~OnTheFlyShapeFunctionProlongation(); diff --git a/lib/atc/TransferOperator.cpp b/lib/atc/TransferOperator.cpp index ab91141c6a..a4edb8a710 100644 --- a/lib/atc/TransferOperator.cpp +++ b/lib/atc/TransferOperator.cpp @@ -157,9 +157,9 @@ namespace ATC { // reallocate memory only if sizing has changed const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity()); quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols()); - + local_restriction(sourceMatrix,shapeFunctionMatrix); - + // communicate for total restriction int count = quantity_.nRows()*quantity_.nCols(); lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count); @@ -221,9 +221,9 @@ namespace ATC { // reallocate memory only if sizing has changed const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity()); quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols()); - + local_restriction(sourceMatrix,shapeFunctionMatrix); - + // communicate for total restriction int count = quantity_.nRows()*quantity_.nCols(); lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count); @@ -322,15 +322,15 @@ namespace ATC { // reallocate memory only if sizing has changed const SPAR_MAT & accumulantMatrix(accumulant_->quantity()); quantity_.resize(accumulantMatrix.nCols(),sourceMatrix.nCols()); - + local_restriction(sourceMatrix,accumulantMatrix); - + // communicate for total restriction int count = quantity_.nRows()*quantity_.nCols(); lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count); if (weights_) { CLON_VEC w(weights_->quantity()); - quantity_ *= w; + quantity_ *= w; } } @@ -551,10 +551,10 @@ namespace ATC { const DENS_MAT & positions(coarseGrainingPositions_->quantity()); // reallocate memory only if sizing has changed quantity_.resize(atc_->num_nodes(),sourceMatrix.nCols()); - + local_restriction(sourceMatrix,positions, kernelFunction_); - + // communicate for total restriction int count = quantity_.nRows()*quantity_.nCols(); lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count); @@ -854,7 +854,7 @@ namespace ATC { _temp_ = shapeFunctionMatrix*sourceMatrix; for (int i = 0; i < quantity_.size(); ++i) { quantity_(i,i) = _temp_(i,0); - } + } } } } diff --git a/lib/atc/TransferOperator.h b/lib/atc/TransferOperator.h index 5cf578b77c..665a0d3cdb 100644 --- a/lib/atc/TransferOperator.h +++ b/lib/atc/TransferOperator.h @@ -15,28 +15,28 @@ namespace ATC { class FE_Mesh; /** - * @class DenseMatrixTransfer + * @class DenseMatrixTransfer * @brief Class for defining objects that generate dense matrix quantities from other matrix quantities */ template class DenseMatrixTransfer : public MatrixDependencyManager { public: - + // constructor DenseMatrixTransfer() : MatrixDependencyManager(), lammpsInterface_(LammpsInterface::instance()) {}; - + // destructor virtual ~DenseMatrixTransfer() {}; /** apply transfer operator */ virtual const DenseMatrix & quantity() const { if (this->need_reset()) { - this->reset_quantity(); + this->reset_quantity(); MatrixDependencyManager::needReset_ = false; - } + } return MatrixDependencyManager::quantity_; }; @@ -92,19 +92,19 @@ namespace ATC { }; /** - * @class SparseMatrixTransfer + * @class SparseMatrixTransfer * @brief Class for defining objects that generate dense matrix quantities from other matrix quantities */ template class SparseMatrixTransfer : public MatrixDependencyManager { public: - + // constructor SparseMatrixTransfer() : MatrixDependencyManager(), lammpsInterface_(LammpsInterface::instance()) {}; - + // destructor virtual ~SparseMatrixTransfer() {}; @@ -163,19 +163,19 @@ namespace ATC { }; /** - * @class DiagonalMatrixTransfer + * @class DiagonalMatrixTransfer * @brief Class for defining objects that generate diagonal matrix quantities from other matrix quantities */ template class DiagonalMatrixTransfer : public MatrixDependencyManager { public: - + // constructor DiagonalMatrixTransfer() : MatrixDependencyManager(), lammpsInterface_(LammpsInterface::instance()) {}; - + // destructor virtual ~DiagonalMatrixTransfer() {}; @@ -234,18 +234,18 @@ namespace ATC { }; /** - * @class SetTransfer + * @class SetTransfer * @brief Class for defining objects that generate sets using prescribed algorithms */ template class SetTransfer : public SetDependencyManager { public: - + // constructor SetTransfer() : SetDependencyManager() {}; - + // destructor virtual ~SetTransfer() {}; @@ -264,18 +264,18 @@ namespace ATC { }; /** - * @class VectorTransfer + * @class VectorTransfer * @brief Class for defining objects that generate sets using prescribed algorithms */ template class VectorTransfer : public VectorDependencyManager { public: - + // constructor VectorTransfer() : VectorDependencyManager() {}; - + // destructor virtual ~VectorTransfer() {}; @@ -294,18 +294,18 @@ namespace ATC { }; /** - * @class AtomToFeTransfer - * @brief Class for defining objects to transfer atomistic quantities to FE quantities + * @class AtomToFeTransfer + * @brief Class for defining objects to transfer atomistic quantities to FE quantities */ class AtomToFeTransfer : public DenseMatrixTransfer { public: - + // constructor AtomToFeTransfer(ATC_Method * atc, PerAtomQuantity * source); - + // destructor virtual ~AtomToFeTransfer(); @@ -325,18 +325,18 @@ namespace ATC { }; /** - * @class AtomDiagonalMatrixToFeTransfer - * @brief Class for defining objects to transfer atomistic quantities to FE quantities + * @class AtomDiagonalMatrixToFeTransfer + * @brief Class for defining objects to transfer atomistic quantities to FE quantities */ class AtomDiagonalMatrixToFeTransfer : public DenseMatrixTransfer { public: - + // constructor AtomDiagonalMatrixToFeTransfer(ATC_Method * atc, PerAtomDiagonalMatrix * source); - + // destructor virtual ~AtomDiagonalMatrixToFeTransfer(); @@ -363,12 +363,12 @@ namespace ATC { class FeToAtomTransfer : public ProtectedAtomQuantity { public: - + // constructor FeToAtomTransfer(ATC_Method * atc, DENS_MAN * source, AtomType atomType = INTERNAL); - + // destructor virtual ~FeToAtomTransfer(); @@ -392,11 +392,11 @@ namespace ATC { class FeToAtomDiagonalMatrix : public ProtectedAtomDiagonalMatrix { public: - + // constructor FeToAtomDiagonalMatrix(ATC_Method * atc, DENS_MAN * source); - + // destructor virtual ~FeToAtomDiagonalMatrix(); @@ -420,11 +420,11 @@ namespace ATC { class MatToMatTransfer : public DenseMatrixTransfer { public: - + // constructor MatToMatTransfer(MatrixDependencyManager * source) : source_(source) {source_->register_dependence(this);}; - + // destructor virtual ~MatToMatTransfer() {source_->remove_dependence(this);}; @@ -445,16 +445,16 @@ namespace ATC { * @brief Class for defining objects that transfer atomistic quantities to FE using shape functions * (implements restrict_volumetric_quantity) */ - + class AtfShapeFunctionRestriction : public AtomToFeTransfer { public: - + // constructor AtfShapeFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * shapeFunction); - + // destructor virtual ~AtfShapeFunctionRestriction(); @@ -467,8 +467,8 @@ namespace ATC { SPAR_MAN * shapeFunction_; /** persistent workspace */ - - + + mutable DENS_MAT _workspace_; /** applies restriction operation across all processors */ @@ -493,12 +493,12 @@ namespace ATC { class AdmtfShapeFunctionRestriction : public AtomDiagonalMatrixToFeTransfer { public: - + // constructor AdmtfShapeFunctionRestriction(ATC_Method * atc, PerAtomDiagonalMatrix * source, SPAR_MAN * shapeFunction); - + // destructor virtual ~AdmtfShapeFunctionRestriction(); @@ -511,8 +511,8 @@ namespace ATC { SPAR_MAN * shapeFunction_; /** persistent workspace */ - - + + mutable DENS_MAT _workspace_; /** applies restriction operation across all processors */ @@ -531,19 +531,19 @@ namespace ATC { /** * @class AtfProjection - * @brief + * @brief */ class AtfProjection : public AtomToFeTransfer { public: - + // constructor AtfProjection(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * accumulant, DIAG_MAN * weights = nullptr); - + // destructor virtual ~AtfProjection(); @@ -561,8 +561,8 @@ namespace ATC { DENS_MAT * reference_; /** persistent workspace */ - - + + mutable DENS_MAT _workspace_; /** applies restriction operation across all processors */ @@ -581,14 +581,14 @@ namespace ATC { class AtfProjectionScaled : public AtfProjection { public: - + // constructor AtfProjectionScaled(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * accumulant, const double scale, DIAG_MAN * weights = nullptr); - + // destructor virtual ~AtfProjectionScaled(); @@ -608,20 +608,20 @@ namespace ATC { /** * @class AtfProjectionReferenced - * @brief + * @brief */ class AtfProjectionReferenced : public AtfProjection { public: - + // constructor AtfProjectionReferenced(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * accumulant, DENS_MAN * reference, DIAG_MAN * weights = nullptr); - + // destructor virtual ~AtfProjectionReferenced(); @@ -651,13 +651,13 @@ namespace ATC { class AtfWeightedShapeFunctionRestriction : public AtfShapeFunctionRestriction { public: - + // constructor AtfWeightedShapeFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * shapeFunction, DIAG_MAN * weights); - + // destructor virtual ~AtfWeightedShapeFunctionRestriction() {weights_->remove_dependence(this);}; @@ -686,13 +686,13 @@ namespace ATC { class AtfNodeWeightedShapeFunctionRestriction : public AtfShapeFunctionRestriction { public: - + // constructor AtfNodeWeightedShapeFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, SPAR_MAN * shapeFunction, DIAG_MAN * weights); - + // destructor virtual ~AtfNodeWeightedShapeFunctionRestriction() {weights_->remove_dependence(this);}; @@ -721,12 +721,12 @@ namespace ATC { class AtfShapeFunctionProjection : public MatToMatTransfer { public: - + // constructor - AtfShapeFunctionProjection(ATC_Method * atc, + AtfShapeFunctionProjection(ATC_Method * atc, DENS_MAN * source, FieldName thisField); - + // destructor virtual ~AtfShapeFunctionProjection(); @@ -751,19 +751,19 @@ namespace ATC { /** * @class AtfShapeFunctionMdProjection * @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region - * (implements project_md/project_md_volumetric_quantity assuming + * (implements project_md/project_md_volumetric_quantity assuming * restrict_unscaled/restrict_volumetric_quantity has been applied) */ class AtfShapeFunctionMdProjection : public MatToMatTransfer { public: - + // constructor - AtfShapeFunctionMdProjection(ATC_Method * atc, + AtfShapeFunctionMdProjection(ATC_Method * atc, DENS_MAN * source, FieldName thisField); - + // destructor virtual ~AtfShapeFunctionMdProjection(); @@ -788,20 +788,20 @@ namespace ATC { /** * @class AtfShapeFunctionMdProjectionScaled * @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region with a scaling factor - * (implements project_md/project_md_volumetric_quantity assuming + * (implements project_md/project_md_volumetric_quantity assuming * restrict_unscaled/restrict_volumetric_quantity has been applied) */ class AtfShapeFunctionMdProjectionScaled : public AtfShapeFunctionMdProjection { public: - + // constructor AtfShapeFunctionMdProjectionScaled(ATC_Method * atc, DENS_MAN * source, double scale, FieldName thisField); - + // destructor virtual ~AtfShapeFunctionMdProjectionScaled(); @@ -823,20 +823,20 @@ namespace ATC { /** * @class AtfShapeFunctionMdProjectionReferenced * @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region with respect to a reference - * (implements project_md/project_md_volumetric_quantity assuming + * (implements project_md/project_md_volumetric_quantity assuming * restrict_unscaled/restrict_volumetric_quantity has been applied) */ class AtfShapeFunctionMdProjectionReferenced : public AtfShapeFunctionMdProjection { public: - + // constructor AtfShapeFunctionMdProjectionReferenced(ATC_Method * atc, DENS_MAN * source, DENS_MAN * reference, FieldName thisField); - + // destructor virtual ~AtfShapeFunctionMdProjectionReferenced(); @@ -863,13 +863,13 @@ namespace ATC { class AtfKernelFunctionRestriction : public AtomToFeTransfer { public: - + // constructor AtfKernelFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, PerAtomQuantity * coarseGrainingPositions, KernelFunction * kernelFunction); - + // destructor virtual ~AtfKernelFunctionRestriction(); @@ -888,8 +888,8 @@ namespace ATC { const FE_Mesh * feMesh_; /** persistent workspace */ - - + + mutable DENS_MAT _workspace_; mutable DENS_VEC _xI_, _xa_, _xaI_; @@ -917,14 +917,14 @@ namespace ATC { class AtfWeightedKernelFunctionRestriction : public AtfKernelFunctionRestriction { public: - + // constructor AtfWeightedKernelFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, PerAtomQuantity * coarseGrainingPositions, KernelFunction * kernelFunction, DIAG_MAN * weights); - + // destructor virtual ~AtfWeightedKernelFunctionRestriction() {weights_->remove_dependence(this);}; @@ -954,14 +954,14 @@ namespace ATC { class AtfNodeWeightedKernelFunctionRestriction : public AtfKernelFunctionRestriction { public: - + // constructor AtfNodeWeightedKernelFunctionRestriction(ATC_Method * atc, PerAtomQuantity * source, PerAtomQuantity * coarseGrainingPositions, KernelFunction * kernelFunction, DIAG_MAN * weights); - + // destructor virtual ~AtfNodeWeightedKernelFunctionRestriction() {weights_->remove_dependence(this);}; @@ -989,13 +989,13 @@ namespace ATC { class FtaShapeFunctionProlongation : public FeToAtomTransfer { public: - + // constructor FtaShapeFunctionProlongation(ATC_Method * atc, DENS_MAN * source, SPAR_MAN * shapeFunction, AtomType atomType = INTERNAL); - + // destructor virtual ~FtaShapeFunctionProlongation(); @@ -1023,12 +1023,12 @@ namespace ATC { class FtaShapeFunctionProlongationDiagonalMatrix : public FeToAtomDiagonalMatrix { public: - + // constructor FtaShapeFunctionProlongationDiagonalMatrix(ATC_Method * atc, DENS_MAN * source, SPAR_MAN * shapeFunction); - + // destructor virtual ~FtaShapeFunctionProlongationDiagonalMatrix(); @@ -1056,68 +1056,68 @@ namespace ATC { */ class MatToGradBySparse : public MatToMatTransfer { - public: + public: - //constructor + //constructor MatToGradBySparse(ATC_Method * atc, DENS_MAN * source, VectorDependencyManager * gradientMatrices); //destructor virtual ~MatToGradBySparse(); - // apply transfer operator + // apply transfer operator virtual void reset_quantity() const; protected: - + // pointer to sparseMatrix VectorDependencyManager * gradientMatrices_; - private: + private: // do not define MatToGradBySparse(); - + }; /** * transfer from dense to dense by diagonal matrix multiplier for anything - **/ + **/ class DiagonalMatrixMultiply : public MatToMatTransfer { - public: + public: - //constructor + //constructor DiagonalMatrixMultiply(DENS_MAN * source, DIAG_MAN * diagonalMatrix); //destructor virtual ~DiagonalMatrixMultiply(); - // apply transfer operator + // apply transfer operator virtual void reset_quantity() const; protected: - + // pointer to sparseMatrix DIAG_MAN * diagonalMatrix_; - private: + private: // do not define DiagonalMatrixMultiply(); - + }; #ifdef ATC_WHO /** // class sparse matrix multiplier for anything //delete later -**/ +**/ class SparseMatrixMultiply : public MatToMatTransfer { - public: + public: - //constructor + //constructor SparseMatrixMultiply(ATC_Method * atc, DENS_MAN * source, SPAR_MAN * sparseMatrix); @@ -1125,18 +1125,18 @@ namespace ATC { virtual ~SparseMatrixMultiply(); protected: - + // pointer to sparseMatrix SPAR_MAN * sparseMatrix_; - - // apply transfer operator + + // apply transfer operator virtual const DENS_MAT & quantity() const; - private: + private: // do not define SparseMatrixMultiply(); - + }; #endif diff --git a/lib/atc/Utility.h b/lib/atc/Utility.h index 6693df9323..e8f9a50ffa 100644 --- a/lib/atc/Utility.h +++ b/lib/atc/Utility.h @@ -22,8 +22,8 @@ namespace ATC_Utility /** constants */ static const double Pi_ = 4.0*atan(1.0); static const double Big_ = 1.e20; - const static double parsetol_ = 1.0e-8; - //const static double parsetol_ = 1.0e-10; + const static double parsetol_ = 1.0e-8; + //const static double parsetol_ = 1.0e-10; const static double parsebig_ = 1.0e10; /** scalar triple product */ @@ -59,36 +59,36 @@ namespace ATC_Utility return ( (dblL > dblR) || ((dblL <= (dblR + \ std::numeric_limits::epsilon() * \ - tolMult * std::max(fabs(dblL), fabs(dblR)))) && + tolMult * std::max(fabs(dblL), fabs(dblR)))) && (dblR <= (dblL + \ std::numeric_limits::epsilon() * \ tolMult * std::max(fabs(dblL), fabs(dblR)))))); } inline double tolerance(double x, double tol = parsetol_) { - return std::max(tol,tol*fabs(x)); + return std::max(tol,tol*fabs(x)); } inline double nudge_up(double x) { return x+tolerance(x); } inline double nudge_down(double x) { return x-tolerance(x); } inline double parse_min(const char * arg) { if (std::strcmp(arg,"INF") == 0) return -parsebig_; else if (std::strcmp(arg,"-INF") == 0) return -parsebig_; - else return (atof(arg)); - } - inline double parse_max(const char * arg) { - if (std::strcmp(arg,"INF") == 0) return parsebig_; + else return (atof(arg)); + } + inline double parse_max(const char * arg) { + if (std::strcmp(arg,"INF") == 0) return parsebig_; else return (atof(arg)); - } + } inline double parse_minmax(const char * arg) { if (std::strcmp(arg,"-INF") == 0) return -parsebig_; else if (std::strcmp(arg,"INF") == 0) return parsebig_; - else return atof(arg); - } + else return atof(arg); + } inline void split_values(double & min, double & max) { min = nudge_down(min); max = nudge_up(max); - } - + } + /** Returns true if the value v is between min & max */ template @@ -121,7 +121,7 @@ namespace ATC_Utility static double t = t_new; double dt = t_new - t; t = t_new; - return dt; + return dt; } /** A simple timer */ inline double timer() @@ -129,10 +129,10 @@ namespace ATC_Utility double t_new = clock() / (double) CLOCKS_PER_SEC; static double t = t_new; // done once at first time the function is evoked double dt = t_new - t; - return dt; + return dt; } /** Binary search between low & high for value (assumes array is sorted) */ - + template inline int search_sorted(const T* A, T value, int low, int high) { @@ -187,7 +187,7 @@ namespace ATC_Utility inline std::string to_string(int precision, const double v) { char b[50]; - sprintf(b, "%*.*f",4+precision,precision, v); + sprintf(b, "%*.*f",4+precision,precision, v); std::string s(b); return s; } @@ -222,7 +222,7 @@ namespace ATC_Utility inline double str2dbl(const std::string &s) { return str2T(s, double(0.0)); } /** tests if conversion to double is possible */ - inline bool is_dbl(const std::string &s) + inline bool is_dbl(const std::string &s) { char *endptr; strtod(s.c_str(), &endptr); @@ -236,7 +236,7 @@ namespace ATC_Utility while (it != s.end() && std::isdigit(*it)) ++it; return !s.empty() && it == s.end(); } - + /** convert a string to an int */ inline int str2int(const std::string &s) { return str2T(s, int(4)); } @@ -268,7 +268,7 @@ namespace ATC_Utility std::transform(s.begin(),s.end(),s.begin(),static_cast(toupper)); return s; } - + /** removes any whitespace from the beginning or end of string */ static std::string& trim(std::string &s) { @@ -289,10 +289,10 @@ namespace ATC_Utility { begin = s.find_first_not_of(del, end); // find beginning of fragment end = s.find_first_of(del,begin); - if (begin != std::string::npos) // safe if end is npos-1 - ss.push_back(s.substr(begin,end-begin)); + if (begin != std::string::npos) // safe if end is npos-1 + ss.push_back(s.substr(begin,end-begin)); } - } + } static std::string cap(std::string & s) { s[0] = toupper(s[0]); @@ -310,7 +310,7 @@ namespace ATC_Utility } return name; } - + //* scans a string for a list of commands delimited by ', \t' with # comments //* @param line The input line to be parsed //* @cs A vector of strings parsed from the input line @@ -321,7 +321,7 @@ namespace ATC_Utility to_lower(trim(line)); split(line, cs); } - + //* reads a single line from a file and splits it into a vector of strings //* returns the number of strings in the vector inline int command_line(std::fstream &fid, std::vector &cs) diff --git a/lib/atc/Vector.cpp b/lib/atc/Vector.cpp index 36a840119b..2f8dce6e5a 100644 --- a/lib/atc/Vector.cpp +++ b/lib/atc/Vector.cpp @@ -10,7 +10,7 @@ void MultMv(const Matrix &A, const Vector &v, DenseVector: matrix-vector multiply"); if (c.size() != sA[At]) { @@ -25,9 +25,9 @@ void MultMv(const Matrix &A, const Vector &v, DenseVector -//void MultMv(const Matrix &A, const Vector &v, DenseVector &c, +//void MultMv(const Matrix &A, const Vector &v, DenseVector &c, // const bool At=0, T a=1, T b=0); /****************************************************************************** @@ -40,7 +40,7 @@ public: virtual void copy(const T * ptr, INDEX nRows, INDEX nCols=1)=0; void write_restart(FILE *f) const; // will be virtual - + // output to matlab using Matrix::matlab; void matlab(std::ostream &o, const std::string &s="v") const; @@ -60,7 +60,7 @@ public: /////////////////////////////////////////////////////////////////////////////// //* performs a matrix-vector multiply with default naive implementation template -void MultMv(const Matrix &A, const Vector &v, DenseVector &c, +void MultMv(const Matrix &A, const Vector &v, DenseVector &c, const bool At, T /* a */, T b) { const INDEX sA[2] = {A.nRows(), A.nCols()}; // m is sA[At] k is sA[!At] @@ -95,12 +95,12 @@ DenseVector operator*(const Vector &a, const Matrix &B) return c; } /////////////////////////////////////////////////////////////////////////////// -//* Multiply a vector by a scalar +//* Multiply a vector by a scalar template DenseVector operator*(const Vector &v, const T s) { DenseVector r(v); - r*=s; + r*=s; return r; } /////////////////////////////////////////////////////////////////////////////// @@ -109,7 +109,7 @@ template DenseVector operator*(const T s, const Vector &v) { DenseVector r(v); - r*=s; + r*=s; return r; } /////////////////////////////////////////////////////////////////////////////// @@ -148,8 +148,8 @@ template std::string Vector::to_string() const { std::string s; - int sz = this->size(); - for (INDEX i = 0; i < sz; i++) + int sz = this->size(); + for (INDEX i = 0; i < sz; i++) s += std::string(i?"\t":"") + ATC_Utility::to_string((*this)[i],myPrecision); return s; } @@ -159,8 +159,8 @@ template void Vector::matlab(std::ostream &o, const std::string &s) const { o << s <<"=zeros(" << this->size() << ",1);\n"; - int sz = this->size(); - for (INDEX i = 0; i < sz; i++) + int sz = this->size(); + for (INDEX i = 0; i < sz; i++) o << s << "("<::write_restart(FILE *f) const template inline INDEX Vector::nCols() const { - return 1; + return 1; } /////////////////////////////////////////////////////////////////////////////// //* returns true if INDEX i is within the range of the vector template -bool Vector::in_range(INDEX i) const +bool Vector::in_range(INDEX i) const { - return isize(); + return isize(); } /////////////////////////////////////////////////////////////////////////////// //* returns true if m has the same number of elements this vector template -bool Vector::same_size(const Vector &m) const +bool Vector::same_size(const Vector &m) const { - return this->size() == m.size(); + return this->size() == m.size(); } /////////////////////////////////////////////////////////////////////////////// //* returns true if a and b have the same number of elements template inline bool Vector::same_size(const Vector &a, const Vector &b) { - return a.same_size(b); + return a.same_size(b); } //---------------------------------------------------------------------------- // general matrix assignment (for densely packed matrices) @@ -209,9 +209,9 @@ void Vector::_set_equal(const Matrix &r) this->resize(r.nRows(), r.nCols()); const Matrix *pr = &r; #ifdef OBSOLETE - if (const SparseMatrix *ps = dynamic_cast*>(pr))//sparse_cast(pr)) + if (const SparseMatrix *ps = dynamic_cast*>(pr))//sparse_cast(pr)) copy_sparse_to_matrix(ps, *this); - + else if (dynamic_cast*>(pr))//diag_cast(pr)) // r is Diagonal? { this->zero(); diff --git a/lib/atc/ViscousStress.cpp b/lib/atc/ViscousStress.cpp index 305769af68..f21e6827dd 100644 --- a/lib/atc/ViscousStress.cpp +++ b/lib/atc/ViscousStress.cpp @@ -14,7 +14,7 @@ namespace ATC { //============================================================================= // isotropic constant viscosity //============================================================================= -ViscousStressConstant::ViscousStressConstant(fstream &fileId) +ViscousStressConstant::ViscousStressConstant(fstream &fileId) : ViscousStress(), viscosity_(0) { if (!fileId.is_open()) throw ATC_Error("cannot open material file"); @@ -22,7 +22,7 @@ ViscousStressConstant::ViscousStressConstant(fstream &fileId) while(fileId.good()) { command_line(fileId, line); if (line[0] == "end") { - if (viscosity_ < 0.0) + if (viscosity_ < 0.0) throw ATC_Error("ViscousStressConstant:: bad constant viscosity"); return; } @@ -74,7 +74,7 @@ void ViscousStressConstant::viscosity(const FIELD_MATS &fields, DENS_MAT &coefs) const { const DENS_MAT & v = (fields.find(VELOCITY))->second; - + coefs.resize(v.nRows(),v.nCols()); coefs = -1.*viscosity_; } diff --git a/lib/atc/ViscousStress.h b/lib/atc/ViscousStress.h index 1636aa5bc3..6d901a3010 100644 --- a/lib/atc/ViscousStress.h +++ b/lib/atc/ViscousStress.h @@ -12,7 +12,7 @@ namespace ATC { /** * @class ViscousStress - * @brief Base class that defines interface for a constitutive law + * @brief Base class that defines interface for a constitutive law * @brief that computes viscous stresses given all field and gradient information. */ class ViscousStress @@ -27,12 +27,12 @@ namespace ATC { //* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) ) virtual void viscous_stress(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, - DENS_MAT_VEC &stress)=0; + DENS_MAT_VEC &stress)=0; virtual void viscosity(const FIELD_MATS & /* fields */, DENS_MAT & /* coefs */) const {throw ATC_Error("ViscousStress::viscosity: unimplemented function");} //* Returns the derivative of the stress tensor for a given strain-rate tensor. - virtual void tangent(const MATRIX & /* F */, MATRIX & /* C */) const + virtual void tangent(const MATRIX & /* F */, MATRIX & /* C */) const {throw ATC_Error("ViscousStress::tangent: unimplemented function");} }; @@ -41,7 +41,7 @@ namespace ATC { * @class ViscousStressConstant * @brief Class for computing stress for a constant viscosity material * assuming divergence-free flow - */ + */ class ViscousStressConstant : public ViscousStress { @@ -61,4 +61,4 @@ namespace ATC { }; } -#endif +#endif diff --git a/lib/atc/VoigtOperations.h b/lib/atc/VoigtOperations.h index 73ce7918ae..6f3fdd1c96 100644 --- a/lib/atc/VoigtOperations.h +++ b/lib/atc/VoigtOperations.h @@ -5,17 +5,17 @@ -// Voigt indexing puts a symmetric 3x3 matrix into a +// Voigt indexing puts a symmetric 3x3 matrix into a // vector form: [0 1 2 3 4 5] // -// matrix form: [[ 0 5 4 ] +// matrix form: [[ 0 5 4 ] // [ 5 1 3 ] // [ 4 3 2 ]] // // unsymmetric version // vector form: [0 1 2 3 4 5 6 7 8] // -// matrix form: [[ 0 5 4 ] +// matrix form: [[ 0 5 4 ] // [ 8 1 3 ] // [ 7 6 2 ]] @@ -34,10 +34,10 @@ namespace voigt3 { //* Inputs 6-length vectors A, B inline DENS_VEC dsymm(const DENS_VEC &A, const DENS_VEC &B) { - DENS_VEC C(6,false); + DENS_VEC C(6,false); C(0) = A(0)*B(0)+A(5)*B(5)+A(4)*B(4); C(1) = A(5)*B(5)+A(1)*B(1)+A(3)*B(3); - C(2) = A(4)*B(4)+A(3)*B(3)+A(2)*B(2); + C(2) = A(4)*B(4)+A(3)*B(3)+A(2)*B(2); C(3) = A(5)*B(4)+A(1)*B(3)+A(3)*B(2); C(4) = A(0)*B(4)+A(5)*B(3)+A(4)*B(2); C(5) = A(0)*B(5)+A(5)*B(1)+A(4)*B(3); @@ -62,21 +62,21 @@ namespace voigt3 { inline DENS_MAT derivative_of_square(const DENS_VEC &C) { DENS_MAT D(6,6); - D(0,0)=2.0*C(0); D(0,1)=0.0; D(0,2)=0.0; - D(1,0)=0.0; D(1,1)=2.0*C(1); D(1,2)=0.0; - D(2,0)=0.0; D(2,1)=0.0; D(2,2)=2.0*C(2); + D(0,0)=2.0*C(0); D(0,1)=0.0; D(0,2)=0.0; + D(1,0)=0.0; D(1,1)=2.0*C(1); D(1,2)=0.0; + D(2,0)=0.0; D(2,1)=0.0; D(2,2)=2.0*C(2); D(0,3)=0.0; D(0,4)=2.0*C(4); D(0,5)=2.0*C(5); D(1,3)=2.0*C(3); D(1,4)=0.0; D(1,5)=2.0*C(5); D(2,3)=2.0*C(3); D(2,4)=2.0*C(4); D(2,5)=0.0; - D(3,0)=0.0; D(3,1)=C(3); D(3,2)=C(3); - D(4,0)=C(4); D(4,1)=0.0; D(4,2)=C(4); - D(5,0)=C(5); D(5,1)=C(5); D(5,2)=0.0; - + D(3,0)=0.0; D(3,1)=C(3); D(3,2)=C(3); + D(4,0)=C(4); D(4,1)=0.0; D(4,2)=C(4); + D(5,0)=C(5); D(5,1)=C(5); D(5,2)=0.0; + D(3,3)=C(1)+C(2); D(3,4)=C(5); D(3,5)=C(4); D(4,3)=C(5); D(4,4)=C(0)+C(2); D(4,5)=C(3); - D(5,3)=C(4); D(5,4)=C(3); D(5,5)=C(0)+C(1); + D(5,3)=C(4); D(5,4)=C(3); D(5,5)=C(0)+C(1); return D; } @@ -102,9 +102,9 @@ namespace voigt3 { DENS_VEC I(voigt_size,false); for (INDEX i=0; i needs; return needs; - } + } }; }; diff --git a/lib/atc/WeakEquationDiffusion.cpp b/lib/atc/WeakEquationDiffusion.cpp index 5470d30b1b..643b7956ba 100644 --- a/lib/atc/WeakEquationDiffusion.cpp +++ b/lib/atc/WeakEquationDiffusion.cpp @@ -14,7 +14,7 @@ namespace ATC { // Constructor //-------------------------------------------------------------- WeakEquationDiffusion::WeakEquationDiffusion() - : WeakEquation(DYNAMIC_PDE,SPECIES_CONCENTRATION,1) + : WeakEquation(DYNAMIC_PDE,SPECIES_CONCENTRATION,1) {} //-------------------------------------------------------------- // Destructor @@ -47,4 +47,4 @@ void WeakEquationDiffusion::B_integrand( } }; // end namespace - + diff --git a/lib/atc/WeakEquationDiffusion.h b/lib/atc/WeakEquationDiffusion.h index 057f499382..5e60d9cfbf 100644 --- a/lib/atc/WeakEquationDiffusion.h +++ b/lib/atc/WeakEquationDiffusion.h @@ -12,19 +12,19 @@ namespace ATC{ * @class WeakEquationDiffusion * @brief species diffusion * c q,t = div q --> - * int M c q,t = int B q + * int M c q,t = int B q */ class WeakEquationDiffusion : public WeakEquation { public: - - // constructor + + // constructor WeakEquationDiffusion(); // destructor virtual ~WeakEquationDiffusion(); - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, @@ -43,7 +43,7 @@ class WeakEquationDiffusion : public WeakEquation { { std::set needs; return needs; - } + } }; }; diff --git a/lib/atc/WeakEquationElectronContinuity.cpp b/lib/atc/WeakEquationElectronContinuity.cpp index 193da6e2c7..4c5024c1b1 100644 --- a/lib/atc/WeakEquationElectronContinuity.cpp +++ b/lib/atc/WeakEquationElectronContinuity.cpp @@ -29,7 +29,7 @@ void WeakEquationElectronContinuity::M_integrand( { FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY); const DENS_MAT & n = nField->second; - density.resize(n.nRows(),n.nCols()); + density.resize(n.nRows(),n.nCols()); density = 1; } @@ -77,7 +77,7 @@ void WeakEquationElectronEquilibrium::M_integrand( { FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY); const DENS_MAT & n = nField->second; - density.reset(n.nRows(),n.nCols()); + density.reset(n.nRows(),n.nCols()); density = 1; } diff --git a/lib/atc/WeakEquationElectronContinuity.h b/lib/atc/WeakEquationElectronContinuity.h index f7e00246da..7f667118c0 100644 --- a/lib/atc/WeakEquationElectronContinuity.h +++ b/lib/atc/WeakEquationElectronContinuity.h @@ -10,7 +10,7 @@ namespace ATC{ /** * @class WeakEquationElectronContinuity - * @brief Electron continuity + * @brief Electron continuity * n,t = div J + (G-R) --> * M n,t = int B J + int N (G-R) */ @@ -18,13 +18,13 @@ namespace ATC{ class WeakEquationElectronContinuity : public WeakEquation { public: - - // constructor + + // constructor WeakEquationElectronContinuity(); // destructor virtual ~WeakEquationElectronContinuity(); - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, @@ -40,7 +40,7 @@ class WeakEquationElectronContinuity : public WeakEquation { /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} - virtual bool N_integrand(const FIELD_MATS &fields, + virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const; @@ -57,7 +57,7 @@ class WeakEquationElectronContinuity : public WeakEquation { /** * @class WeakEquationElectronEquilibrium - * @brief Electron continuity from equilibrium + * @brief Electron continuity from equilibrium * n = n(\phi) * M n = int N n(\phi) */ @@ -65,15 +65,15 @@ class WeakEquationElectronContinuity : public WeakEquation { class WeakEquationElectronEquilibrium : public WeakEquation { public: - - // constructor + + // constructor WeakEquationElectronEquilibrium(); // destructor virtual ~WeakEquationElectronEquilibrium(); - + /** density that used to form the mass matrix */ - + virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, const Material * material, @@ -81,12 +81,12 @@ class WeakEquationElectronEquilibrium : public WeakEquation { /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} - virtual bool N_integrand(const FIELD_MATS &fields, + virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const; - - + + /** flux that is integrated with B = Grad N as its weight */ virtual bool has_B_integrand(void) const {return true;} virtual void B_integrand(const FIELD_MATS &fields, diff --git a/lib/atc/WeakEquationElectronMomentum.cpp b/lib/atc/WeakEquationElectronMomentum.cpp index c4728c7bd5..7ccd6370bf 100644 --- a/lib/atc/WeakEquationElectronMomentum.cpp +++ b/lib/atc/WeakEquationElectronMomentum.cpp @@ -28,7 +28,7 @@ void WeakEquationElectronMomentum::convection(const FIELD_MATS &fields, // set up mass density FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY); const DENS_MAT & n = nField->second; - DENS_MAT nMe(n.nRows(),n.nCols()); + DENS_MAT nMe(n.nRows(),n.nCols()); material->inv_effective_mass(fields,nMe); nMe = n.div_by_element(nMe); @@ -38,7 +38,7 @@ void WeakEquationElectronMomentum::convection(const FIELD_MATS &fields, const CLON_VEC u(velocity,CLONE_COL,0); const CLON_VEC v(velocity,CLONE_COL,1); const CLON_VEC w(velocity,CLONE_COL,2); - flux[0] = velocity; + flux[0] = velocity; flux[1] = velocity; flux[2] = velocity; CLON_VEC nuu(flux[0],CLONE_COL,0); @@ -50,7 +50,7 @@ void WeakEquationElectronMomentum::convection(const FIELD_MATS &fields, CLON_VEC nwu(flux[0],CLONE_COL,2); CLON_VEC nwv(flux[1],CLONE_COL,2); CLON_VEC nww(flux[2],CLONE_COL,2); - + for (int i = 0; i < n.nRows(); i++) { // tensor product of velocities nuu(i) *= nMe(i,0)*u(i); @@ -126,17 +126,17 @@ void WeakEquationElectronMomentumDDM::thermal_stress(const FIELD_MATS &fields, // ith velocity component has thermal stress of // d_i n * Cp * Te - DENS_MAT nCp(DTe[0].nRows(),DTe[0].nCols()); + DENS_MAT nCp(DTe[0].nRows(),DTe[0].nCols()); material->electron_heat_capacity(fields,nCp); nCp *= 2./3.; // correction to capacity account for convection - + tsx += nCp.mult_by_element(DTe[0]); tsy += nCp.mult_by_element(DTe[1]); tsz += nCp.mult_by_element(DTe[2]); - + FIELD_MATS::const_iterator tField = fields.find(ELECTRON_TEMPERATURE); const DENS_MAT & Te = tField->second; - + material->D_electron_heat_capacity(fields,gradFields,_dnCp_); for (int i = 0; i < nsd_; i++) _dnCp_[i] *= 2./3.; // correction to capacity account for convection @@ -173,7 +173,7 @@ bool WeakEquationElectronMomentumDDM::N_integrand( FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY); const DENS_MAT & n = nField->second; - + CLON_VEC tsx(flux,CLONE_COL,0); CLON_VEC tsy(flux,CLONE_COL,1); CLON_VEC tsz(flux,CLONE_COL,2); diff --git a/lib/atc/WeakEquationElectronMomentum.h b/lib/atc/WeakEquationElectronMomentum.h index 0010b012cd..66e8b5b005 100644 --- a/lib/atc/WeakEquationElectronMomentum.h +++ b/lib/atc/WeakEquationElectronMomentum.h @@ -12,9 +12,9 @@ namespace ATC{ /** * @class WeakEquationElectronMomentum - * @brief Electron momentum + * @brief Electron momentum * rho v,t = div P --> - * int M rho v,t = int B P + * int M rho v,t = int B P */ class WeakEquationElectronMomentum : public WeakEquation { @@ -25,7 +25,7 @@ namespace ATC{ // destructor virtual ~WeakEquationElectronMomentum(); - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, @@ -38,7 +38,7 @@ namespace ATC{ const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT_VEC &flux) const ; - + /** necessary interfaces */ virtual std::set needs_material_functions(void) const { @@ -59,7 +59,7 @@ namespace ATC{ * @class WeakEquationElectronMomentumDDM * @brief Electron momentum - drift diffusion * rho v,t = div P --> - * int M rho v,t = int B P + * int M rho v,t = int B P */ class WeakEquationElectronMomentumDDM : public WeakEquationElectronMomentum { @@ -67,29 +67,29 @@ namespace ATC{ public: // constructor WeakEquationElectronMomentumDDM(); - + // destructor virtual ~WeakEquationElectronMomentumDDM(); - + /** density that used to form the mass matrix */ virtual void M_integrand(const FIELD_MATS &fields, const Material * material, DENS_MAT &density ) const ; - + /** flux that is integrated with grad N as its weight */ virtual bool has_B_integrand(void) const {return false;} virtual void B_integrand(const FIELD_MATS & /* fields */, const GRAD_FIELD_MATS & /* grad_fields */, const Material * /* material */, DENS_MAT_VEC &/* flux */) const {}; - + /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const ; - + /** necessary interfaces */ virtual std::set needs_material_functions(void) const { @@ -100,7 +100,7 @@ namespace ATC{ needs.insert("electric_displacement"); return needs; } - + protected: /** computes thermal stresses arising from convection */ virtual void thermal_stress(const FIELD_MATS &fields, @@ -112,6 +112,6 @@ namespace ATC{ mutable DENS_MAT_VEC _dnCp_; mutable DENS_MAT_VEC _electricForce_; }; - + }; #endif diff --git a/lib/atc/WeakEquationElectronTemperature.cpp b/lib/atc/WeakEquationElectronTemperature.cpp index 72315dd1e6..368db1005e 100644 --- a/lib/atc/WeakEquationElectronTemperature.cpp +++ b/lib/atc/WeakEquationElectronTemperature.cpp @@ -86,8 +86,8 @@ WeakEquationElectronTemperatureJouleHeating::WeakEquationElectronTemperatureJoul //eV2E_ = (ATC::LammpsInterface::instance()->qe2f()) // * (ATC::LammpsInterface::instance()->ftm2v()); eV2E_ = ATC::LammpsInterface::instance()->qv2e(); - int nSD = 3; - _J_.assign(nSD, DENS_MAT()); + int nSD = 3; + _J_.assign(nSD, DENS_MAT()); _E_.assign(nSD, DENS_MAT()); } //-------------------------------------------------------------- @@ -130,18 +130,18 @@ bool WeakEquationElectronTemperatureJouleHeating::N_integrand( const Material * material, DENS_MAT &flux) const { - + // call base class to get electron_temperature terms WeakEquationElectronTemperature::N_integrand(fields, grad_fields, material, flux); // Joule heating = -I.grad Psi = J.grad Psi \approx J.E - DENS_MAT jouleHeating; - material->electron_flux (fields, grad_fields, _J_); + DENS_MAT jouleHeating; + material->electron_flux (fields, grad_fields, _J_); material->electric_field(fields, grad_fields, _E_); jouleHeating = _J_[0].mult_by_element(_E_[0]); for (DENS_MAT_VEC::size_type i=1; i < _J_.size(); i++) jouleHeating += _J_[i].mult_by_element(_E_[i]); jouleHeating *= eV2E_; - flux -= jouleHeating; + flux -= jouleHeating; return true; } @@ -155,8 +155,8 @@ bool WeakEquationElectronTemperatureJouleHeating::N_integrand( WeakEquationElectronTemperatureConvection::WeakEquationElectronTemperatureConvection() : WeakEquationElectronTemperatureJouleHeating() { - int nSD = 3; - _convectiveFlux_.assign(nSD, DENS_MAT()); + int nSD = 3; + _convectiveFlux_.assign(nSD, DENS_MAT()); } //-------------------------------------------------------------- @@ -175,7 +175,7 @@ void WeakEquationElectronTemperatureConvection::B_integrand( DENS_MAT_VEC &flux) const { // add diffusion term - + WeakEquationElectronTemperatureJouleHeating::B_integrand(fields, grad_fields, material, flux); //flux[0] = 0.; //flux[1] = 0.; @@ -204,8 +204,8 @@ bool WeakEquationElectronTemperatureConvection::N_integrand( DENS_MAT capacity; material->electron_heat_capacity(fields, capacity); capacity *= 2./3.; // correction in DDM equations - - + + //FIELD_MATS::const_iterator dField = fields.find(ELECTRON_DENSITY); FIELD_MATS::const_iterator tField = fields.find(ELECTRON_TEMPERATURE); //const DENS_MAT & density = dField->second; @@ -221,10 +221,10 @@ bool WeakEquationElectronTemperatureConvection::N_integrand( //keExchange *= density; keExchange *= temperature; keExchange *= capacity; - + flux -= keExchange; #endif - return true; + return true; } }; // end namespace diff --git a/lib/atc/WeakEquationElectronTemperature.h b/lib/atc/WeakEquationElectronTemperature.h index 1a5ecbab00..cf7ea97350 100644 --- a/lib/atc/WeakEquationElectronTemperature.h +++ b/lib/atc/WeakEquationElectronTemperature.h @@ -10,21 +10,21 @@ namespace ATC{ /** * @class WeakEquationElectronTemperature - * @brief Electron temperature - * c T_e,t = div q_e + g(T_e-T_p) --> + * @brief Electron temperature + * c T_e,t = div q_e + g(T_e-T_p) --> * int M c T_e,t = int B q_e + int N g */ class WeakEquationElectronTemperature : public WeakEquation { public: - - // constructor + + // constructor WeakEquationElectronTemperature(); // destructor virtual ~WeakEquationElectronTemperature(); - + /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return true;} virtual void E_integrand(const FIELD_MATS &fields, @@ -47,7 +47,7 @@ class WeakEquationElectronTemperature : public WeakEquation { /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} - virtual bool N_integrand(const FIELD_MATS &fields, + virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const ; @@ -68,21 +68,21 @@ class WeakEquationElectronTemperature : public WeakEquation { /** * @class WeakEquationElectronTemperatureJouleHeating * @brief Electron temperature with Joule heating - * c T_e,t = div q_e + g(T_e-T_p) + J.E --> + * c T_e,t = div q_e + g(T_e-T_p) + J.E --> * int M c T_e,t = int B q_e + int N ( g + J.E) */ -class WeakEquationElectronTemperatureJouleHeating : - public WeakEquationElectronTemperature +class WeakEquationElectronTemperatureJouleHeating : + public WeakEquationElectronTemperature { public: - - // constructor + + // constructor WeakEquationElectronTemperatureJouleHeating(); // destructor virtual ~WeakEquationElectronTemperatureJouleHeating(); - + /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return true;} virtual void E_integrand(const FIELD_MATS &fields, @@ -105,7 +105,7 @@ class WeakEquationElectronTemperatureJouleHeating : /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} - virtual bool N_integrand(const FIELD_MATS &fields, + virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const; @@ -113,7 +113,7 @@ class WeakEquationElectronTemperatureJouleHeating : /** necessary interfaces */ virtual std::set needs_material_functions(void) const { - std::set needs + std::set needs = WeakEquationElectronTemperature::needs_material_functions(); needs.insert("electric_field"); return needs; @@ -121,7 +121,7 @@ class WeakEquationElectronTemperatureJouleHeating : protected: - + /** conversion factor for charge * voltage --> mass length^2 / time^2 */ double eV2E_; @@ -131,16 +131,16 @@ class WeakEquationElectronTemperatureJouleHeating : /** * @class WeakEquationElectronTemperatureConvection * @brief Electron temperature with convection - * c ( T_e,t + grad m_e J.E T_e / e ) = div q_e + g(T_e-T_p) + c n T_e grad J.E/(n e) --> + * c ( T_e,t + grad m_e J.E T_e / e ) = div q_e + g(T_e-T_p) + c n T_e grad J.E/(n e) --> * int M c T_e,t = int B ( q_e - c m_e J.E T_e / e ) + int N ( g + c n T_e grad J.E/(n e) ) */ -class WeakEquationElectronTemperatureConvection : +class WeakEquationElectronTemperatureConvection : public WeakEquationElectronTemperatureJouleHeating { public: - - // constructor + + // constructor WeakEquationElectronTemperatureConvection(); // destructor @@ -155,7 +155,7 @@ class WeakEquationElectronTemperatureConvection : /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return true;} - virtual bool N_integrand(const FIELD_MATS &fields, + virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &flux) const; @@ -163,7 +163,7 @@ class WeakEquationElectronTemperatureConvection : /** necessary interfaces */ virtual std::set needs_material_functions(void) const { - std::set needs + std::set needs = WeakEquationElectronTemperature::needs_material_functions(); needs.insert("electron_drag_power"); return needs; @@ -173,7 +173,7 @@ class WeakEquationElectronTemperatureConvection : /** workspace variable for the convective flux */ mutable DENS_MAT_VEC _convectiveFlux_; - + }; }; // end namespace diff --git a/lib/atc/WeakEquationMassDiffusion.cpp b/lib/atc/WeakEquationMassDiffusion.cpp index 47ca01bbe4..122d3ee891 100644 --- a/lib/atc/WeakEquationMassDiffusion.cpp +++ b/lib/atc/WeakEquationMassDiffusion.cpp @@ -47,4 +47,4 @@ void WeakEquationMassDiffusion::B_integrand( } }; // end namespace - + diff --git a/lib/atc/WeakEquationMassDiffusion.h b/lib/atc/WeakEquationMassDiffusion.h index 5b3a654300..7239e248cb 100644 --- a/lib/atc/WeakEquationMassDiffusion.h +++ b/lib/atc/WeakEquationMassDiffusion.h @@ -10,7 +10,7 @@ namespace ATC{ /** * @class WeakEquationMassDiffusion - * @brief Mass diffusion + * @brief Mass diffusion * c rho,t = div rho --> * int M c rho,t = int B rho */ @@ -18,13 +18,13 @@ namespace ATC{ class WeakEquationMassDiffusion : public WeakEquation { public: - - // constructor + + // constructor WeakEquationMassDiffusion(); // destructor virtual ~WeakEquationMassDiffusion(); - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, diff --git a/lib/atc/WeakEquationMomentum.cpp b/lib/atc/WeakEquationMomentum.cpp index 39400d3167..d38ea0121f 100644 --- a/lib/atc/WeakEquationMomentum.cpp +++ b/lib/atc/WeakEquationMomentum.cpp @@ -49,7 +49,7 @@ bool WeakEquationMomentum::N_integrand( const Material * material, DENS_MAT &flux) const { - return material->body_force(fields, flux); + return material->body_force(fields, flux); } //-------------------------------------------------------------- @@ -73,7 +73,7 @@ WeakEquationMomentumElectrostatic::WeakEquationMomentumElectrostatic() { // convert charge * electric field --> force qE2f_ = (ATC::LammpsInterface::instance()->qe2f()); - _E_.assign(3, DENS_MAT()); + _E_.assign(3, DENS_MAT()); } //-------------------------------------------------------------- @@ -81,21 +81,21 @@ bool WeakEquationMomentumElectrostatic::N_integrand( const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, - DENS_MAT &flux) const + DENS_MAT &flux) const { material->electric_field(fields, grad_fields, _E_); // "conversion" of grad scalar to vector field int nsd = _E_.size(); - flux.resize(_E_[0].nRows(),nsd); + flux.resize(_E_[0].nRows(),nsd); FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY); const DENS_MAT & n = nField->second; for (int i=0; i < nsd; i++) { CLON_VEC fi = column(flux,i); fi = _E_[i]; - fi *= -qE2f_*n; + fi *= -qE2f_*n; } - return true; + return true; } //============================================================== // Class WeakEquationMomentumDiffusion @@ -152,6 +152,6 @@ bool WeakEquationMomentumDiffusion::N_integrand( const Material * material, DENS_MAT &flux) const { - return material->body_force(fields, flux); + return material->body_force(fields, flux); } }; // END namespace diff --git a/lib/atc/WeakEquationMomentum.h b/lib/atc/WeakEquationMomentum.h index cb1e829e98..bf47c8b1cc 100644 --- a/lib/atc/WeakEquationMomentum.h +++ b/lib/atc/WeakEquationMomentum.h @@ -12,9 +12,9 @@ class Material; /** * @class WeakEquationMomentum - * @brief Momentum + * @brief Momentum * rho v,t = div P --> - * int M rho v,t = int B P + * int M rho v,t = int B P */ class WeakEquationMomentum : public WeakEquation { @@ -33,7 +33,7 @@ class WeakEquationMomentum : public WeakEquation { const GRAD_FIELD_MATS &grad_fields, const Material * material, DENS_MAT &energy ) const; - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, @@ -80,7 +80,7 @@ class WeakEquationMomentumElectrostatic : public WeakEquationMomentum { // destructor virtual ~WeakEquationMomentumElectrostatic(){}; - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, @@ -93,7 +93,7 @@ class WeakEquationMomentumElectrostatic : public WeakEquationMomentum { virtual void B_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, - DENS_MAT_VEC &flux) const + DENS_MAT_VEC &flux) const { WeakEquationMomentum::B_integrand(fields, grad_fields, material, flux); } /** flux that is integrated with N as its weight */ @@ -101,7 +101,7 @@ class WeakEquationMomentumElectrostatic : public WeakEquationMomentum { virtual bool N_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, - DENS_MAT &flux) const ; + DENS_MAT &flux) const ; /** necessary interfaces */ virtual std::set needs_material_functions(void) const @@ -133,7 +133,7 @@ class WeakEquationMomentumDiffusion : public WeakEquation { /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return false;} - + /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return true;} virtual void M_integrand(const FIELD_MATS &fields, diff --git a/lib/atc/WeakEquationPhononTemperature.cpp b/lib/atc/WeakEquationPhononTemperature.cpp index fe1ac894bd..aec735deea 100644 --- a/lib/atc/WeakEquationPhononTemperature.cpp +++ b/lib/atc/WeakEquationPhononTemperature.cpp @@ -69,12 +69,12 @@ WeakEquationPhononTemperatureExchange::WeakEquationPhononTemperatureExchange() //--------------------------------------------------------------------- WeakEquationPhononTemperatureExchange::~WeakEquationPhononTemperatureExchange(void) {} - + //--------------------------------------------------------------------- // compute energy //--------------------------------------------------------------------- void WeakEquationPhononTemperatureExchange::E_integrand( - const FIELD_MATS &fields, + const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields, const Material * material, DENS_MAT &energy ) const @@ -121,4 +121,4 @@ bool WeakEquationPhononTemperatureExchange::N_integrand( }; // end namespace - + diff --git a/lib/atc/WeakEquationPhononTemperature.h b/lib/atc/WeakEquationPhononTemperature.h index f3dfcac527..b0ffe5e9ab 100644 --- a/lib/atc/WeakEquationPhononTemperature.h +++ b/lib/atc/WeakEquationPhononTemperature.h @@ -10,21 +10,21 @@ namespace ATC{ /** * @class WeakEquationPhononTemperature - * @brief Phonon temperature + * @brief Phonon temperature * c T_p,t = div q_p --> - * int M c T_p,t = int B q_p + * int M c T_p,t = int B q_p */ class WeakEquationPhononTemperature : public WeakEquation { public: - - // constructor + + // constructor WeakEquationPhononTemperature(); // destructor virtual ~WeakEquationPhononTemperature(); - + /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return true;} virtual void E_integrand(const FIELD_MATS &fields, @@ -63,17 +63,17 @@ class WeakEquationPhononTemperature : public WeakEquation { * int M c T_p,t = int B q_p + int N g */ -class WeakEquationPhononTemperatureExchange : +class WeakEquationPhononTemperatureExchange : public WeakEquationPhononTemperature { public: - - // constructor + + // constructor WeakEquationPhononTemperatureExchange(); // destructor virtual ~WeakEquationPhononTemperatureExchange(); - + /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return true;} virtual void E_integrand(const FIELD_MATS &fields, diff --git a/lib/atc/WeakEquationPoisson.cpp b/lib/atc/WeakEquationPoisson.cpp index 4440c02bd3..75a9684e20 100644 --- a/lib/atc/WeakEquationPoisson.cpp +++ b/lib/atc/WeakEquationPoisson.cpp @@ -10,9 +10,9 @@ namespace ATC { //============================================================== // R = B^T flux + N source = 0 -// 0 = B^T perm B phi - N rho_+ +// 0 = B^T perm B phi - N rho_+ + - //-------------------------------------------------------------- // Constructor //-------------------------------------------------------------- @@ -86,7 +86,7 @@ bool WeakEquationPoissonConstantRHS::N_integrand( FIELD_MATS::const_iterator nIter = fields.find(ELECTRON_DENSITY); if (nIter != fields.end()) { const DENS_MAT & n = nIter->second; - flux = -1.0*n; + flux = -1.0*n; return true; } return false; diff --git a/lib/atc/WeakEquationPoisson.h b/lib/atc/WeakEquationPoisson.h index b004b350ce..3a95ee91df 100644 --- a/lib/atc/WeakEquationPoisson.h +++ b/lib/atc/WeakEquationPoisson.h @@ -18,13 +18,13 @@ namespace ATC{ class WeakEquationPoisson : public WeakEquation { public: - - // constructor + + // constructor WeakEquationPoisson(); // destructor virtual ~WeakEquationPoisson(){}; - + /** flux that is integrated with B = Grad N as its weight */ virtual bool has_B_integrand(void) const {return true;} virtual void B_integrand(const FIELD_MATS &fields, @@ -74,19 +74,19 @@ class WeakEquationPoisson : public WeakEquation { class WeakEquationPoissonConstantRHS : public WeakEquationPoisson { public: - - // constructor + + // constructor WeakEquationPoissonConstantRHS(); // destructor virtual ~WeakEquationPoissonConstantRHS(){}; - + /** flux that is integrated with B = Grad N as its weight */ virtual bool has_B_integrand(void) const {return true;} virtual void B_integrand(const FIELD_MATS &fields, const GRAD_FIELD_MATS &grad_fields, const Material * material, - DENS_MAT_VEC &flux) const + DENS_MAT_VEC &flux) const { WeakEquationPoisson::B_integrand(fields, grad_fields, material, flux) ; } /** flux that is integrated with N as its weight */ diff --git a/lib/atc/WeakEquationSchrodinger.h b/lib/atc/WeakEquationSchrodinger.h index c7d46fa5d2..f46b7fdb72 100644 --- a/lib/atc/WeakEquationSchrodinger.h +++ b/lib/atc/WeakEquationSchrodinger.h @@ -1,5 +1,5 @@ #ifndef WEAK_EQUATION_SCHRODINGER_H -#define WEAK_EQUATION_SCHRODINGER_H +#define WEAK_EQUATION_SCHRODINGER_H #include #include @@ -11,20 +11,20 @@ namespace ATC{ /** * @class WeakEquationSchrodinger * @brief Schrodinger equation - * -hbar^2 /2 1/m^* psi,xx + phi psi = E psi + * -hbar^2 /2 1/m^* psi,xx + phi psi = E psi * (-c*B^T B + phi N^T N) psi = E N^T N psi */ class WeakEquationSchrodinger : public WeakEquation { public: - - // constructor + + // constructor WeakEquationSchrodinger(); // destructor virtual ~WeakEquationSchrodinger(); - + /** RHS stiffness matrix */ virtual bool has_BB_tangent_coefficients(void) const {return true;} virtual void BB_tangent_coefficients(const FieldName field, diff --git a/lib/awpmd/README b/lib/awpmd/README index d829361a1b..2c7a2aeda0 100644 --- a/lib/awpmd/README +++ b/lib/awpmd/README @@ -5,7 +5,7 @@ valuev at physik.hu-berlin.de June 2011 This is version 0.9 of the AWPMD library taken from JIHT GridMD project. -It contains interface to calculate electronic and electron-ion Hamiltonian, +It contains interface to calculate electronic and electron-ion Hamiltonian, norm matrix and forces for AWPMD method. AWPMD is an open source program distributed under the terms diff --git a/lib/awpmd/ivutils/include/lapack_inter.h b/lib/awpmd/ivutils/include/lapack_inter.h index e4497fc840..ac3e062b5b 100644 --- a/lib/awpmd/ivutils/include/lapack_inter.h +++ b/lib/awpmd/ivutils/include/lapack_inter.h @@ -20,7 +20,7 @@ typedef complex lapack_complex_double; inline void ZPPTRI( char* uplo, const lapack_int* n, lapack_complex_double* ap, lapack_int* info ){ ZPPTRI(uplo, (int*)n, (MKL_Complex16*)ap, (int*)info); } - + #else #define DGETRF dgetrf_ @@ -32,17 +32,17 @@ typedef complex lapack_complex_double; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - void dgetrf_( const lapack_int* m, const lapack_int* n, double* a, const lapack_int* lda, + void dgetrf_( const lapack_int* m, const lapack_int* n, double* a, const lapack_int* lda, lapack_int* ipiv, lapack_int* info ); - void dgetrs_( const char* trans, const lapack_int* n, const lapack_int* nrhs, - const double* a, const lapack_int* lda, const lapack_int* ipiv, + void dgetrs_( const char* trans, const lapack_int* n, const lapack_int* nrhs, + const double* a, const lapack_int* lda, const lapack_int* ipiv, double* b, const lapack_int* ldb, lapack_int* info ); - void dgetri_( const lapack_int* n, double* a, const lapack_int* lda, - const lapack_int* ipiv, double* work, const lapack_int* lwork, + void dgetri_( const lapack_int* n, double* a, const lapack_int* lda, + const lapack_int* ipiv, double* work, const lapack_int* lwork, lapack_int* info ); - void zpptrf_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, + void zpptrf_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, lapack_int* info ); - void zpptri_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, + void zpptri_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, lapack_int* info ); #ifdef __cplusplus } diff --git a/lib/awpmd/ivutils/include/logexc.h b/lib/awpmd/ivutils/include/logexc.h index 2eebfcc0ce..46f0406f1e 100644 --- a/lib/awpmd/ivutils/include/logexc.h +++ b/lib/awpmd/ivutils/include/logexc.h @@ -32,7 +32,7 @@ enum vbLEVELS{ vblMESS3 = 0x20, ///< report messages of level 3 (not important) vblMESS4 = 0x40, ///< report messages of level 4 (anything possible) vblALLMESS = vblMESS1|vblMESS2|vblMESS3|vblMESS4, ///< report all messages - vblPROGR = 0x80, ///< report progress + vblPROGR = 0x80, ///< report progress vblALL = 0xffff }; @@ -43,7 +43,7 @@ enum vbLEVELS{ template struct log_exception_traits{ /// exception level according to the vbLEVELS - static int level(const exc_t & /* signal */){ return vblFATAL; } + static int level(const exc_t & /* signal */){ return vblFATAL; } /// the string name of exception category static string name(const exc_t & /* signal */){ return typeid(exc_t).name();} /// adds some more explanations to the description @@ -60,9 +60,9 @@ struct log_exception_traits{ template<> struct log_exception_traits{ /// exception level according to the vbLEVELS - static int level(const int &signal){ return signal; } + static int level(const int &signal){ return signal; } /// the string name of exception category - static string name(const int &signal){ + static string name(const int &signal){ if(signal&vblFATAL) return "fatal error"; else if(signal&vblOERR) @@ -88,8 +88,8 @@ struct log_exception_traits{ /// vbLEVELS exceptions act as integers template<> struct log_exception_traits{ - static int level(const enum vbLEVELS &signal){ return log_exception_traits::level(signal); } - static string name(const enum vbLEVELS &signal){ return log_exception_traits::name(signal); } + static int level(const enum vbLEVELS &signal){ return log_exception_traits::level(signal); } + static string name(const enum vbLEVELS &signal){ return log_exception_traits::name(signal); } static enum vbLEVELS add_words(const enum vbLEVELS &orig, const char * /* words */){ return orig; } @@ -99,7 +99,7 @@ struct log_exception_traits{ /// message(signal,errcode, text) is used to either throw an exception or return errorcode /// At first, the the level of error is determined via log_exception_traits<>::level(signal) /// For integer (enum) signals the level is the signal itself. -/// Then text is printed, if signal level is listed in output levels or (or in extra outlevels, if they are set) +/// Then text is printed, if signal level is listed in output levels or (or in extra outlevels, if they are set) /// via log_text() function. /// If level has vblERR bit, the behaviour is controlled by the flag specified in set_throw(flag): /// flag=0: nothing done; @@ -121,13 +121,13 @@ protected: int throw_ex; int outlevel, eoutlevel; int stoplevel, estoplevel; - + static message_logger *glogp; /// used to restore the previous global logger message_logger *prev, *next; public: - - message_logger(const string &descriptor_="", int out_level=vblALLBAD|vblMESS1, + + message_logger(const string &descriptor_="", int out_level=vblALLBAD|vblMESS1, int stop_level=vblFATAL, int throw_exceptions=0, int use_globally=0) :descriptor(descriptor_),prev(nullptr),next(nullptr){ set_throw(throw_exceptions); @@ -137,11 +137,11 @@ public: set_global(true); } } - + /// returns a reference to global logger /// if not set, links with default message_logger static message_logger &global(); - + /// sets/unsets this logger as the global logger int set_global(bool set){ if(set){ @@ -154,7 +154,7 @@ public: } else{ if(glogp!=this) // was not set as the global - return -1; + return -1; glogp=prev; if(glogp) glogp->next=nullptr; @@ -162,7 +162,7 @@ public: } return 1; } - + virtual void set_throw(int throw_exceptions){ throw_ex=throw_exceptions; } @@ -177,7 +177,7 @@ public: eoutlevel=out_level; estoplevel=stop_level; } - + template int message(const exc_t &signal, int errcode, const char *what, ...){ int level=log_exception_traits::level(signal); @@ -189,15 +189,15 @@ public: log_text(level,log_exception_traits::name(signal).c_str(),buff); } if(level&vblERR){ - if(throw_ex==1) // throws exc_t exception + if(throw_ex==1) // throws exc_t exception throw log_exception_traits::add_words(signal,buff); - else if(throw_ex==2) // throws pair<>(int,const char*) exception + else if(throw_ex==2) // throws pair<>(int,const char*) exception throw make_pair(errcode,what); - else if(throw_ex==3) // throws int exception + else if(throw_ex==3) // throws int exception throw errcode; - } + } if(level&(estoplevel ? estoplevel: stoplevel) ){ // needs to stop - exit(errcode); + exit(errcode); } return errcode; } @@ -210,7 +210,7 @@ public: printf("%s\n",messtext); } - /// checks that the deleted one is not in global logger chain + /// checks that the deleted one is not in global logger chain ~message_logger(){ if(prev){ prev->next=next; @@ -231,7 +231,7 @@ int message(const exc_t &signal, int errcode, const char *what, ...){ vsnprintf(buff,1024,what,args); return message_logger::glogp->message(signal,errcode,buff); } - else + else return -1; } @@ -240,8 +240,8 @@ class stdfile_logger: public message_logger { protected: FILE *fout, *ferr; public: - stdfile_logger(const string &descriptor_="", int throw_exceptions=0, - FILE *out=stdout, FILE *err=stderr, + stdfile_logger(const string &descriptor_="", int throw_exceptions=0, + FILE *out=stdout, FILE *err=stderr, int out_level=vblALLBAD|vblMESS1,int stop_level=vblFATAL, int use_globally=0) : message_logger(descriptor_,out_level,stop_level,throw_exceptions,use_globally),fout(nullptr), ferr(nullptr){ @@ -253,7 +253,7 @@ public: fclose(fout); fout=out; } - + virtual void set_err(FILE *err, int close_prev=0){ if(close_prev && ferr && ferr!=stderr && ferr !=stdout) fclose(ferr); @@ -272,7 +272,7 @@ public: } }; -/// format a string +/// format a string const char *logfmt(const char *format,...); /// macros with common usage @@ -295,7 +295,7 @@ const char *logfmt(const char *format,...); /// where level and name are defined whithin a class struct log_exception { /// exception level according to the vbLEVELS - static int level(const log_exception &signal){ return vblFATAL; } + static int level(const log_exception &signal){ return vblFATAL; } /// the string name of exception category static string name(const log_exception &signal){ return "undefined exception";} }; @@ -303,8 +303,8 @@ struct log_exception { /// log_exceptions act as themselves template<> struct log_exception_traits{ - static int level(const log_exception &signal){ return log_exception::level(signal); } - static string name(const log_exception &signal){ return log_exception::name(signal); } + static int level(const log_exception &signal){ return log_exception::level(signal); } + static string name(const log_exception &signal){ return log_exception::name(signal); } }; # endif diff --git a/lib/awpmd/ivutils/include/wavepacket.h b/lib/awpmd/ivutils/include/wavepacket.h index 337a056e79..5a787f0809 100644 --- a/lib/awpmd/ivutils/include/wavepacket.h +++ b/lib/awpmd/ivutils/include/wavepacket.h @@ -12,7 +12,7 @@ using namespace std; -/** @file wpmd.h +/** @file wpmd.h @brief Classes to handle Gaussian Wave Packets. */ // Constants @@ -89,7 +89,7 @@ public: WavePacket operator*(const WavePacket& other) const { return WavePacket(a+other.a,b+other.b,lz+other.lz); } - + /// returns the integral of w(x) over 3D space cdouble integral() const { cdouble z = lz + b.norm2()/(4.*a); @@ -171,7 +171,7 @@ public: ///\en Transforms derivatives of a function with respect to WP parameters /// from internal into physical representation, i. e.:\n /// from df/d{are,aim,b0re,b0im,b1re,b1im,b2re,b2im} (8 values accessed by input iterator d_it in the given order)\n - /// to df/d{x0,x1,x2}, df/d{p0,p1,p2}, df/dw, df/dpw + /// to df/d{x0,x1,x2}, df/d{p0,p1,p2}, df/dw, df/dpw /// The supplied inputs (val) are modified by op: val=op(val,phys_der). /// Use operation=eq_second for the supplied inputs to be replaced by new physical derivative values. /// The input and output locations may coinside, an internal buffer is used for transformation. @@ -189,7 +189,7 @@ public: for(int i=0;i<3;i++){ dfn[i]= 2*real(a)*dfdi[2+2*i]+2*imag(a)*dfdi[2+2*i+1]; dfn[3+i]= dfdi[2+2*i+1]*(/*m_electron*/1./h_p) ; //*(h_plank/m_electron); - dfn[7]+=-(r[i]*dfdi[2+2*i+1]/w)/h_p; + dfn[7]+=-(r[i]*dfdi[2+2*i+1]/w)/h_p; dfn[6]+=-2*r[i]*(t*dfdi[2+2*i]+imag(a)*dfdi[2+2*i+1]/w); } int i=0; @@ -201,7 +201,7 @@ public: *dfdpw=op(*dfdpw,dfn[i++]); } - + ///\en Compares the wave packet to another on a per component basis. /// \return \retval 0 if all component differences are 0 within tolerance \a tol (EQUAL), /// \retval -1 for LESS @@ -229,7 +229,7 @@ public: for(int i=0;i<3;i++){ fe_x[ic1+k1][i]+= -2*real(wk.a)*E_der[s1][indw1+8*k1+2+2*i]-2*imag(wk.a)*E_der[s1][indw1+8*k1+2+2*i+1]; fe_p[ic1+k1][i]+= (-E_der[s1][indw1+8*k1+2+2*i+1])*(m_electron/h_plank); //*(h_plank/m_electron); - fe_pw[ic1+k1]+=(r[i]*E_der[s1][indw1+8*k1+2+2*i+1]/w)/h_plank; + fe_pw[ic1+k1]+=(r[i]*E_der[s1][indw1+8*k1+2+2*i+1]/w)/h_plank; fe_w[ic1+k1]+=2*r[i]*(t*E_der[s1][indw1+8*k1+2+2*i]+imag(wk.a)*E_der[s1][indw1+8*k1+2+2*i+1]/w); } #endif diff --git a/lib/awpmd/systems/interact/TCP/tcpdefs.h b/lib/awpmd/systems/interact/TCP/tcpdefs.h index e1e0b3553c..ac070c1daf 100644 --- a/lib/awpmd/systems/interact/TCP/tcpdefs.h +++ b/lib/awpmd/systems/interact/TCP/tcpdefs.h @@ -14,4 +14,4 @@ const double coul_pref=14.39965172693122; // e^2/(4*pi*eps0), eV*A const double eV_to_K=11604.447517053462; // Temperature in K correspondent to 1eV # endif -# endif \ No newline at end of file +# endif diff --git a/lib/awpmd/systems/interact/TCP/wpmd.cpp b/lib/awpmd/systems/interact/TCP/wpmd.cpp index 660d7c21d7..def5a9cdca 100644 --- a/lib/awpmd/systems/interact/TCP/wpmd.cpp +++ b/lib/awpmd/systems/interact/TCP/wpmd.cpp @@ -4,13 +4,13 @@ // Calculates derivative overlap matrix IDD void OverlapDeriv::calc_der_overlap(bool self, cdouble cc1, cdouble c2){ - cVector_3 I3 = I1 * ((bb_4a + 2.5) / w12.a); + cVector_3 I3 = I1 * ((bb_4a + 2.5) / w12.a); cdouble I4 = I0 * ( bb_4a *(bb_4a + 5.) + 3.75 ) / w12.a / w12.a; // calculate derivatives <(phi_k)'_q_k | (phi_l)'_q_l>: IDD.set(0, 0, I4 - (d1.l + d2.l)*I2 + d1.l*d2.l*I0 ); // over a_k_re and a_l_re IDD.set(0, 1, i_unit*( I4 - (d1.l + d2.m)*I2 + d1.l*d2.m*I0 ) ); // over a_k_re and a_l_im - if(!self) + if(!self) IDD.set(1, 0, i_unit1*( I4 + (d1.m - d2.l)*I2 - d1.m*d2.l*I0 ) ); // over a_k_im and a_l_re else IDD.set(1,0, conj(IDD(0,1))); @@ -33,7 +33,7 @@ void OverlapDeriv::calc_der_overlap(bool self, cdouble cc1, cdouble c2){ IDD.set((i+1)*2, 1, conj(IDD(1,(i+1)*2)) ); // over b_k_re and a_l_im IDD.set((i+1)*2+1, 1, conj(IDD(1,(i+1)*2+1)) ); // over b_k_im and a_l_im } - + for(int j=0;j<3;j++){ if(!self || j>=i){ cdouble I2ij = I0 / w12.a * @@ -62,10 +62,10 @@ void OverlapDeriv::calc_der_overlap(bool self, cdouble cc1, cdouble c2){ IDD.set((j+1)*2+1,(i+1)*2+1, conj(IDD((i+1)*2+1,(j+1)*2+1 )) ); } } // j - } // i + } // i if(real(cc1)){ // adding terms for split-packet - + IDD.set(8, 0, c2*da2_re() ); // over c_1_re and a_2_re IDD.set(8, 1, c2*da2_im() ); // over c_1_re and a_2_im IDD.set(9, 0, -i_unit*c2*da2_re() ); // over c_1_im and a_2_re @@ -105,7 +105,7 @@ WavePacket AWPMD::create_wp(Vector_3 &x, Vector_3 &v, double &w, double &pw, dou w=w0; pw=0.; } - + double rw; if(Lextra>0){ // width PBC, keeping the width are within [0,Lextra] w=fmod(w,Lextra); @@ -139,11 +139,11 @@ void AWPMD::resize(int flag){ M[s].init(ne[s],nvar[s]); L[s].init(ne[s],nvar[s]); } - } + } Eiep.assign((size_t)ni,0); Eiip.assign((size_t)ni,0); - + } @@ -153,7 +153,7 @@ void AWPMD::resize(int flag){ //e 0x4 -- PBC along Z //e cell specifies the lengths of the simulation box in all directions //e if PBCs are used, the corresponding coordinates of electrons and ions -//e in periodic directions must be within a range [0, cell[per_dir]) +//e in periodic directions must be within a range [0, cell[per_dir]) //e @returns 1 if OK int AWPMD::set_pbc(const Vector_3P pcell, int pbc_){ if(!pcell) @@ -212,9 +212,9 @@ int AWPMD::set_ions(int n, double* q, Vector_3P x) } //e same as interaction, but using Hartee factorization (no antisymmetrization) -int AWPMD::interaction_hartree(int flag, Vector_3P fi, Vector_3P fe_x, +int AWPMD::interaction_hartree(int flag, Vector_3P fi, Vector_3P fe_x, Vector_3P fe_p, double *fe_w, double *fe_pw, Vector_2P fe_c){ - + // 0. resizing the arrays if needed enum APPROX tmp=HARTREE; swap(tmp,approx); // do not need large matrices @@ -222,7 +222,7 @@ int AWPMD::interaction_hartree(int flag, Vector_3P fi, Vector_3P fe_x, swap(tmp,approx); //1. clearing forces clear_forces(flag,fi,fe_x,fe_p,fe_w,fe_pw,fe_c); - + Eee = Ew = 0.; for(int s1=0;s1<2;s1++){ Ee[s1]=0.; @@ -246,9 +246,9 @@ int AWPMD::interaction_hartree(int flag, Vector_3P fi, Vector_3P fe_x, if(constraint == HARM) Ew += harm_w0_4 * w1*w1; // width force contribution //double dE=2*Epot/w; - //if(d->fw1)d->fw1[c1]+=dE; + //if(d->fw1)d->fw1[c1]+=dE; //if(fw2 && fw2!=fw1)fw2[c1]+=dE; - + // e-e interaction for(int s2=s1;s2<2;s2++){ for(int c2=(s1==s2 ? c1+1 : 0) ;c2fw2){ d->fw2[c2]+=sgn2*dEw*w2; } - }*/ + }*/ } } // e-i interaction @@ -328,14 +328,14 @@ int AWPMD::interaction_hartree(int flag, Vector_3P fi, Vector_3P fe_x, //e initializes internal buffers for calculations (set_electrons must be called first) //int init(){} -//e calculates interaction in the system of ni ions + electrons +//e calculates interaction in the system of ni ions + electrons //e the electonic subsystem must be previously setup by set_electrons, ionic by set_ions //e the iterators are describing ionic system only // 0x1 -- give back ion forces // 0x2 -- add ion forces to the existing set // 0x4 -- calculate derivatives for electronic time step (NOT IMPLEMENTED) //e if PBCs are used the coords must be within a range [0, cell) -int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, +int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, Vector_3P fe_p, double *fe_w, double *fe_pw, Vector_2P fe_c){ if(approx==HARTREE) return interaction_hartree(flag,fi,fe_x,fe_p,fe_w,fe_pw,fe_c); @@ -343,7 +343,7 @@ int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, resize(flag); // 1. clearing forces clear_forces(flag,fi,fe_x,fe_p,fe_w,fe_pw,fe_c); - + //2. calculating overlap matrix for(int s=0;s<2;s++){ int nes = ne[s]; @@ -370,10 +370,10 @@ int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, ZPPTRF("L",&nes,Y[s].arr,&info); // analyze return code here if(info<0) - return LOGERR(info,logfmt("AWPMD.interacton: call to ZPTRF failed (exitcode %d)!",info),LINFO); + return LOGERR(info,logfmt("AWPMD.interacton: call to ZPTRF failed (exitcode %d)!",info),LINFO); ZPPTRI("L",&nes,Y[s].arr,&info); if(info<0) - return LOGERR(info,logfmt("AWPMD.interacton: call to ZPTRI failed (exitcode %d)!",info),LINFO); + return LOGERR(info,logfmt("AWPMD.interacton: call to ZPTRI failed (exitcode %d)!",info),LINFO); /*f1=fopen(logfmt("matrY_%d.d",s),"wt"); @@ -402,7 +402,7 @@ int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, WavePacket& wl=wp[s][l]; if(pbc) ndr=move_to_image(wl,wk); - + WavePacket wkl=wl*conj(wk); //Vector_3 rrkl=wkl.get_r(); cVector_3 v1=wl.b*conj(wk.a)-conj(wk.b)*wl.a; @@ -421,13 +421,13 @@ int AWPMD::interaction(int flag, Vector_3P fi, Vector_3P fe_x, // e-i energy cdouble sum(0.,0.); - for(int i=0;i: @@ -640,7 +640,7 @@ void AWPMD::norm_matrix(int s){ IDD.set(k8+(i+1)*2, l8+1, i_unit1*( I3[i] - dl.m*I1[i] + dk.u[i]*(I2 - dl.m*I0) ) ); // over b_k_re and a_l_im IDD.set(k8+(i+1)*2+1, l8+1, -I3[i] + dl.m*I1[i] - dk.v[i]*(dl.m*I0 - I2) ); // over b_k_im and a_l_im } - + for(j=0;j<3;j++){ cdouble I2ij = I0 / wkl.a * (i==j ? wkl.b[i]*wkl.b[i] / wkl.a / 4 + 0.5 @@ -675,7 +675,7 @@ void AWPMD::norm_matrix(int s){ for(qi=0; qi split_c[2]; ///<\en split coefficients for electrons (c_re, c_im) or (psi,phi) depending on the norm mode vector nspl[2]; ///<\en number of wave packets for each electron (size is ne[i]) - + vector wf_norm[2]; ///<\en norms for each electron - vector wf_norm_der[2]; ///<\en norm derivative - vector ovl_der[2]; ///<\en overlap derivative: \ + vector wf_norm_der[2]; ///<\en norm derivative + vector ovl_der[2]; ///<\en overlap derivative: \ vector E_der[2]; ///<\en energy derivative with respect to {a,b} coordinates - vector< cdouble > Lh[2]; ///<\en Substitute for L in Hartree case: block matrices 1x(10*nspl[i]) + vector< cdouble > Lh[2]; ///<\en Substitute for L in Hartree case: block matrices 1x(10*nspl[i]) vector< sqmatrix > Normh[2]; ///<\en Substitute for Norm in Hartree case: block matrices ///\en resizes all internal arrays according to new electrons (wavepackets) added virtual void resize(int flag); - + public: AWPMD_split():s_add(0),spl_add(0){} //virtual ~AWPMD_split() {}; this line causes a segmentation fault, temporarily disabling - - + + ///\en Prepares to setup a new system of particles using \ref add_ion(), /// \ref add_electron() and \ref add_split(). - /// There is no need to call this function when using + /// There is no need to call this function when using /// \ref set_electrons() and \ref set_ions() to setup particles. virtual void reset(){ for(int s=0;s<2;s++){ split_c[s].clear(); - nspl[s].clear(); + nspl[s].clear(); } s_add=0; spl_add=0; @@ -112,7 +112,7 @@ public: /// If PBCs are used the coords must be within the range [0, cell) /// the \a splits array defines the number of wavepackets required for each electron /// the data for splits should be placed in the corresponding data arrays - /// \a c array contains the splits mixing coefficints + /// \a c array contains the splits mixing coefficints /// \a n is the number of electrons of a given spin component /// Electron velocity v is multiplied by mass to obtain momentum. /// Default mass (-1) means me. @@ -134,12 +134,12 @@ public: /// \return global id of the wavepacket (starting from 0 for each spin s) /// Electron velocity v is multiplied by mass to obtain momentum. /// Default mass (-1) means me. - /// The tags must be nonzero, >0 for the local particle, <0 for ghost particle. + /// The tags must be nonzero, >0 for the local particle, <0 for ghost particle. /// Unique particle id is abs(tag). - /// Default tag (0) means inserting the current particle id as local particle. + /// Default tag (0) means inserting the current particle id as local particle. int add_split(Vector_3 &x, Vector_3 &v, double &w, double &pw, Vector_2 &c, double mass=-1, double q=-1., int tag=0); - - + + ///\en gets current electronic coordinates, and (optionally) number of wave packets for each electron int get_electrons(int spin, Vector_3P x, Vector_3P v, double* w, double* pw, cdouble *c, int *splits=nullptr, double mass=-1); @@ -147,16 +147,16 @@ public: void eterm_deriv(int ic1,int s1, int c1,int k1,int ic2,int s2, int c2,int j2,cdouble pref, const OverlapDeriv &o,cdouble v,cdouble dv_aj_conj, cdouble dv_ak,cVector_3 dv_bj_conj, cVector_3 dv_bk); - + ///\en adds the derivatives of Y for the term v*Y[s](c2,c1) void y_deriv(cdouble v,int s, int c2, int c1); - + ///\en Calculates block norms an derivatives void calc_norms(int flag); - + ///\en Prepares force arrays according to \a flag setting for interaction() - virtual void clear_forces(int flagi,Vector_3P fi, Vector_3P fe_x, + virtual void clear_forces(int flagi,Vector_3P fi, Vector_3P fe_x, Vector_3P fe_p, double *fe_w, double *fe_pw, Vector_2P fe_c); ///\en Calcualtes the overlap between two electrons taking all split WPs into account. @@ -164,10 +164,10 @@ public: cdouble overlap(int ic1, int s1, int c1,int ic2, int s2, int c2); //e same as interaction, but using Hartee factorization (no antisymmetrization) - int interaction_hartree(int flag=0, Vector_3P fi=nullptr, Vector_3P fe_x=nullptr, + int interaction_hartree(int flag=0, Vector_3P fi=nullptr, Vector_3P fe_x=nullptr, Vector_3P fe_p=nullptr, double *fe_w=nullptr, double *fe_pw=nullptr, Vector_2P fe_c=nullptr); - ///\en Calculates interaction in the system of ni ions + electrons + ///\en Calculates interaction in the system of ni ions + electrons /// the electonic subsystem must be previously setup by set_electrons, ionic by set_ions /// 0x1 -- give back ion forces \n /// 0x2 -- add ion forces to the existing set \n @@ -178,19 +178,19 @@ public: /// the forces may be obtained then using \ref get_el_forces() for all WPs \n /// or separately for each WP using \ref get_wp_force() /// if PBCs are used the coords must be within a range [0, cell) - int interaction(int flag=0, Vector_3P fi=nullptr, Vector_3P fe_x=nullptr, + int interaction(int flag=0, Vector_3P fi=nullptr, Vector_3P fe_x=nullptr, Vector_3P fe_p=nullptr, double *fe_w=nullptr, double *fe_pw=nullptr, Vector_2P fe_c=nullptr); ///\en Get electronic forcess in the arrays provided, using calculated internal representation /// Valid flag settings are:\n /// 0x4 -- overwrite existing forces \n /// 0x8 -- add electronic forces to the existing arrays \n - void get_el_forces(int flag, Vector_3P fe_x, + void get_el_forces(int flag, Vector_3P fe_x, Vector_3P fe_p, double *fe_w, double *fe_pw, Vector_2P fe_c); - + void get_wp_force(int s, int ispl, Vector_3P fe_x, Vector_3P fe_p, double *fe_w, double *fe_pw, Vector_2P fe_c){ - WavePacket wk=wp[s][ispl]; + WavePacket wk=wp[s][ispl]; int indw1=8*ispl; int indn1=(nvar[s]/10)*8+2*ispl; wk.int2phys_der< eq_minus_second >(E_der[s].begin()+indw1,(double *)fe_x,(double *)fe_p,fe_w,fe_pw,1./one_h); diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index d0f83c70a7..d418acd0c1 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -601,16 +601,16 @@ int colvarproxy_script::run_force_callback() int colvarproxy_script::run_colvar_callback(std::string const & /* name */, - std::vector const & /* cvcs */, - colvarvalue & /* value */) + std::vector const & /* cvcs */, + colvarvalue & /* value */) { return COLVARS_NOT_IMPLEMENTED; } int colvarproxy_script::run_colvar_gradient_callback(std::string const & /* name */, - std::vector const & /* cvcs */, - std::vector > & /* gradient */) + std::vector const & /* cvcs */, + std::vector > & /* gradient */) { return COLVARS_NOT_IMPLEMENTED; } diff --git a/lib/gpu/cudpp_mini/cudpp.cpp b/lib/gpu/cudpp_mini/cudpp.cpp index 9506320748..4acea78c8a 100644 --- a/lib/gpu/cudpp_mini/cudpp.cpp +++ b/lib/gpu/cudpp_mini/cudpp.cpp @@ -3,18 +3,18 @@ // ------------------------------------------------------------- // $Revision: 5632 $ // $Date: 2009-07-01 14:36:01 +1000 (Wed, 01 Jul 2009) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt in // the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * cudpp.cpp * * @brief Main library source file. Implements wrappers for public - * interface. - * + * interface. + * * Main library source file. Implements wrappers for public * interface. These wrappers call application-level operators. * As this grows we may decide to partition into multiple source @@ -25,12 +25,12 @@ * \defgroup publicInterface CUDPP Public Interface * The CUDA public interface comprises the functions, structs, and enums * defined in cudpp.h. Public interface functions call functions in the - * \link cudpp_app Application-Level\endlink interface. The public + * \link cudpp_app Application-Level\endlink interface. The public * interface functions include Plan Interface functions and Algorithm * Interface functions. Plan Interface functions are used for creating * CUDPP Plan objects which contain configuration details, intermediate - * storage space, and in the case of cudppSparseMatrix(), data. The - * Algorithm Interface is the set of functions that do the real work + * storage space, and in the case of cudppSparseMatrix(), data. The + * Algorithm Interface is the set of functions that do the real work * of CUDPP, such as cudppScan() and cudppSparseMatrixVectorMultiply. * * @{ @@ -53,10 +53,10 @@ * @brief Performs a scan operation of numElements on its input in * GPU memory (d_in) and places the output in GPU memory * (d_out), with the scan parameters specified in the plan pointed to by - * planHandle. - - * The input to a scan operation is an input array, a binary associative - * operator (like + or max), and an identity element for that operator + * planHandle. + + * The input to a scan operation is an input array, a binary associative + * operator (like + or max), and an identity element for that operator * (+'s identity is 0). The output of scan is the same size as its input. * Informally, the output at each element is the result of operator * applied to each input that comes before it. For instance, the @@ -71,27 +71,27 @@ * @htmlonly⊕@endhtmlonly@latexonly$\oplus$@endlatexonly ... * @htmlonly⊕@endhtmlonly@latexonly$\oplus$@endlatexonly * ini-1. - * - * CUDPP supports "exclusive" and "inclusive" scans. For the ADD operator, - * an exclusive scan computes the sum of all input elements before the - * current element, while an inclusive scan computes the sum of all input - * elements up to and including the current element. - * + * + * CUDPP supports "exclusive" and "inclusive" scans. For the ADD operator, + * an exclusive scan computes the sum of all input elements before the + * current element, while an inclusive scan computes the sum of all input + * elements up to and including the current element. + * * Before calling scan, create an internal plan using cudppPlan(). - * - * After you are finished with the scan plan, clean up with cudppDestroyPlan(). - * + * + * After you are finished with the scan plan, clean up with cudppDestroyPlan(). + * * @param[in] planHandle Handle to plan for this scan * @param[out] d_out output of scan, in GPU memory * @param[in] d_in input to scan, in GPU memory * @param[in] numElements number of elements to scan - * + * * @see cudppPlan, cudppDestroyPlan */ CUDPP_DLL CUDPPResult cudppScan(CUDPPHandle planHandle, - void *d_out, - const void *d_in, + void *d_out, + const void *d_in, size_t numElements) { CUDPPScanPlan *plan = (CUDPPScanPlan*)CUDPPPlanManager::GetPlan(planHandle); @@ -101,7 +101,7 @@ CUDPPResult cudppScan(CUDPPHandle planHandle, return CUDPP_SUCCESS; } else - { + { return CUDPP_ERROR_UNKNOWN; //! @todo Return more specific errors } } @@ -110,17 +110,17 @@ CUDPPResult cudppScan(CUDPPHandle planHandle, * @brief Performs a segmented scan operation of numElements on its input in * GPU memory (d_idata) and places the output in GPU memory * (d_out), with the scan parameters specified in the plan pointed to by - * planHandle. - + * planHandle. + * The input to a segmented scan operation is an input array of data, - * an input array of flags which demarcate segments, a binary associative - * operator (like + or max), and an identity element for that operator + * an input array of flags which demarcate segments, a binary associative + * operator (like + or max), and an identity element for that operator * (+'s identity is 0). The array of flags is the same length as the input - * with 1 marking the the first element of a segment and 0 otherwise. The - * output of segmented scan is the same size as its input. Informally, the - * output at each element is the result of operator applied to each input - * that comes before it in that segment. For instance, the output of - * segmented sum-scan at each element is the sum of all the input elements + * with 1 marking the the first element of a segment and 0 otherwise. The + * output of segmented scan is the same size as its input. Informally, the + * output at each element is the result of operator applied to each input + * that comes before it in that segment. For instance, the output of + * segmented sum-scan at each element is the sum of all the input elements * before that input in that segment. * * More formally, for associative operator @@ -132,32 +132,32 @@ CUDPPResult cudppScan(CUDPPHandle planHandle, * @htmlonly⊕@endhtmlonly@latexonly$\oplus$@endlatexonly * ini-1. * k is the index of the first element of the segment in which i lies - * - * We support both "exclusive" and "inclusive" variants. For a segmented sum-scan, - * the exclusive variant computes the sum of all input elements before the - * current element in that segment, while the inclusive variant computes the - * sum of all input elements up to and including the current element, in - * that segment. - * + * + * We support both "exclusive" and "inclusive" variants. For a segmented sum-scan, + * the exclusive variant computes the sum of all input elements before the + * current element in that segment, while the inclusive variant computes the + * sum of all input elements up to and including the current element, in + * that segment. + * * Before calling segmented scan, create an internal plan using cudppPlan(). - * - * After you are finished with the scan plan, clean up with cudppDestroyPlan(). + * + * After you are finished with the scan plan, clean up with cudppDestroyPlan(). * @param[in] planHandle Handle to plan for this scan * @param[out] d_out output of segmented scan, in GPU memory * @param[in] d_idata input data to segmented scan, in GPU memory * @param[in] d_iflags input flags to segmented scan, in GPU memory * @param[in] numElements number of elements to perform segmented scan on - * + * * @see cudppPlan, cudppDestroyPlan - + CUDPP_DLL CUDPPResult cudppSegmentedScan(CUDPPHandle planHandle, - void *d_out, + void *d_out, const void *d_idata, const unsigned int *d_iflags, size_t numElements) { - CUDPPSegmentedScanPlan *plan = + CUDPPSegmentedScanPlan *plan = (CUDPPSegmentedScanPlan*)CUDPPPlanManager::GetPlan(planHandle); if (plan != nullptr) { @@ -165,7 +165,7 @@ CUDPPResult cudppSegmentedScan(CUDPPHandle planHandle, return CUDPP_SUCCESS; } else - { + { return CUDPP_ERROR_UNKNOWN; //! @todo Return more specific errors } } @@ -173,29 +173,29 @@ CUDPPResult cudppSegmentedScan(CUDPPHandle planHandle, /** * @brief Performs numRows parallel scan operations of numElements * each on its input (d_in) and places the output in d_out, - * with the scan parameters set by config. Exactly like cudppScan + * with the scan parameters set by config. Exactly like cudppScan * except that it runs on multiple rows in parallel. - * + * * Note that to achieve good performance with cudppMultiScan one should * allocate the device arrays passed to it so that all rows are aligned * to the correct boundaries for the architecture the app is running on. - * The easy way to do this is to use cudaMallocPitch() to allocate a - * 2D array on the device. Use the \a rowPitch parameter to cudppPlan() - * to specify this pitch. The easiest way is to pass the device pitch + * The easy way to do this is to use cudaMallocPitch() to allocate a + * 2D array on the device. Use the \a rowPitch parameter to cudppPlan() + * to specify this pitch. The easiest way is to pass the device pitch * returned by cudaMallocPitch to cudppPlan() via \a rowPitch. - * + * * @param[in] planHandle handle to CUDPPScanPlan * @param[out] d_out output of scan, in GPU memory * @param[in] d_in input to scan, in GPU memory * @param[in] numElements number of elements (per row) to scan * @param[in] numRows number of rows to scan in parallel - * + * * @see cudppScan, cudppPlan CUDPP_DLL CUDPPResult cudppMultiScan(CUDPPHandle planHandle, - void *d_out, - const void *d_in, + void *d_out, + const void *d_in, size_t numElements, size_t numRows) { @@ -206,23 +206,23 @@ CUDPPResult cudppMultiScan(CUDPPHandle planHandle, return CUDPP_SUCCESS; } else - { + { return CUDPP_ERROR_UNKNOWN; //! @todo Return more specific errors } } */ /** - * @brief Given an array \a d_in and an array of 1/0 flags in \a + * @brief Given an array \a d_in and an array of 1/0 flags in \a * deviceValid, returns a compacted array in \a d_out of corresponding * only the "valid" values from \a d_in. - * + * * Takes as input an array of elements in GPU memory * (\a d_in) and an equal-sized unsigned int array in GPU memory * (\a deviceValid) that indicate which of those input elements are * valid. The output is a packed array, in GPU memory, of only those * elements marked as valid. - * + * * Internally, uses cudppScan. * * Example: @@ -237,7 +237,7 @@ CUDPPResult cudppMultiScan(CUDPPHandle planHandle, * wants is a final compacted array. Often one just wants the array of indices * to which each input element should go in the output. The split() routine used * in radix sort might make more sense to expose. - * + * * @param[in] planHandle handle to CUDPPCompactPlan * @param[out] d_out compacted output * @param[out] d_numValidElements set during cudppCompact; is set with the @@ -248,16 +248,16 @@ CUDPPResult cudppMultiScan(CUDPPHandle planHandle, CUDPP_DLL CUDPPResult cudppCompact(CUDPPHandle planHandle, - void *d_out, + void *d_out, size_t *d_numValidElements, - const void *d_in, + const void *d_in, const unsigned int *d_isValid, size_t numElements) { CUDPPCompactPlan *plan = (CUDPPCompactPlan*)CUDPPPlanManager::GetPlan(planHandle); if (plan != nullptr) { - cudppCompactDispatch(d_out, d_numValidElements, d_in, d_isValid, + cudppCompactDispatch(d_out, d_numValidElements, d_in, d_isValid, numElements, plan); return CUDPP_SUCCESS; } @@ -269,12 +269,12 @@ CUDPPResult cudppCompact(CUDPPHandle planHandle, */ /** * @brief Sorts key-value pairs or keys only - * + * * Takes as input an array of keys in GPU memory * (d_keys) and an optional array of corresponding values, - * and outputs sorted arrays of keys and (optionally) values in place. - * Key-value and key-only sort is selected through the configuration of - * the plan, using the options CUDPP_OPTION_KEYS_ONLY and + * and outputs sorted arrays of keys and (optionally) values in place. + * Key-value and key-only sort is selected through the configuration of + * the plan, using the options CUDPP_OPTION_KEYS_ONLY and * CUDPP_OPTION_KEY_VALUE_PAIRS. * * Supported key types are CUDPP_FLOAT and CUDPP_UINT. Values can be @@ -282,11 +282,11 @@ CUDPPResult cudppCompact(CUDPPHandle planHandle, * and cast to unsigned int). * * @todo Determine if we need to provide an "out of place" sort interface. - * + * * @param[in] planHandle handle to CUDPPSortPlan * @param[out] d_keys keys by which key-value pairs will be sorted * @param[in] d_values values to be sorted - * @param[in] keyBits the number of least significant bits in each element + * @param[in] keyBits the number of least significant bits in each element * of d_keys to sort by * @param[in] numElements number of elements in d_keys and d_values * @@ -295,7 +295,7 @@ CUDPPResult cudppCompact(CUDPPHandle planHandle, CUDPP_DLL CUDPPResult cudppSort(CUDPPHandle planHandle, void *d_keys, - void *d_values, + void *d_values, int keyBits, size_t numElements) { @@ -320,17 +320,17 @@ CUDPPResult cudppSort(CUDPPHandle planHandle, * @param sparseMatrixHandle Handle to a sparse matrix object created with cudppSparseMatrix() * @param d_y The output vector, y * @param d_x The input vector, x - * + * * @see cudppSparseMatrix, cudppDestroySparseMatrix - + CUDPP_DLL CUDPPResult cudppSparseMatrixVectorMultiply(CUDPPHandle sparseMatrixHandle, void *d_y, const void *d_x) { - CUDPPSparseMatrixVectorMultiplyPlan *plan = + CUDPPSparseMatrixVectorMultiplyPlan *plan = (CUDPPSparseMatrixVectorMultiplyPlan*)CUDPPPlanManager::GetPlan(sparseMatrixHandle); - + if (plan != nullptr) { cudppSparseMatrixVectorMultiplyDispatch(d_y, d_x, plan); @@ -345,15 +345,15 @@ CUDPPResult cudppSparseMatrixVectorMultiply(CUDPPHandle sparseMatrixHandl /** * @brief Rand puts \a numElements random 32-bit elements into \a d_out * - + * Outputs \a numElements random values to \a d_out. \a d_out must be of * type unsigned int, allocated in device memory. - * + * * The algorithm used for the random number generation is stored in \a planHandle. * Depending on the specification of the pseudo random number generator(PRNG), * the generator may have one or more seeds. To set the seed, use cudppRandSeed(). - * - * @todo Currently only MD5 PRNG is supported. We may provide more rand routines in + * + * @todo Currently only MD5 PRNG is supported. We may provide more rand routines in * the future. * * @param[in] planHandle Handle to plan for rand @@ -361,7 +361,7 @@ CUDPPResult cudppSparseMatrixVectorMultiply(CUDPPHandle sparseMatrixHandl * @param[out] d_out output of rand, in GPU memory. Should be an array of unsigned integers. * * @see cudppPlan, CUDPPConfiguration, CUDPPAlgorithm - + CUDPP_DLL CUDPPResult cudppRand(CUDPPHandle planHandle,void * d_out, size_t numElements) { @@ -379,16 +379,16 @@ CUDPPResult cudppRand(CUDPPHandle planHandle,void * d_out, size_t numElements) /**@brief Sets the seed used for rand * - * The seed is crucial to any random number generator as it allows a - * sequence of random numbers to be replicated. Since there may be - * multiple different rand algorithms in CUDPP, cudppRandSeed - * uses \a planHandle to determine which seed to set. Each rand - * algorithm has its own unique set of seeds depending on what + * The seed is crucial to any random number generator as it allows a + * sequence of random numbers to be replicated. Since there may be + * multiple different rand algorithms in CUDPP, cudppRandSeed + * uses \a planHandle to determine which seed to set. Each rand + * algorithm has its own unique set of seeds depending on what * the algorithm needs. * * @param[in] planHandle the handle to the plan which specifies which rand seed to set * @param[in] seed the value which the internal cudpp seed will be set to - + CUDPP_DLL CUDPPResult cudppRandSeed(const CUDPPHandle planHandle, unsigned int seed) { diff --git a/lib/gpu/cudpp_mini/cudpp.h b/lib/gpu/cudpp_mini/cudpp.h index 2f38d780a5..da2bb9b79c 100644 --- a/lib/gpu/cudpp_mini/cudpp.h +++ b/lib/gpu/cudpp_mini/cudpp.h @@ -3,21 +3,21 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt in // the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * cudpp.h - * + * * @brief Main library header file. Defines public interface. * - * The CUDPP public interface is a C-only interface to enable - * linking with code written in other languages (e.g. C, C++, - * and Fortran). While the internals of CUDPP are not limited - * to C (C++ features are used), the public interface is + * The CUDPP public interface is a C-only interface to enable + * linking with code written in other languages (e.g. C, C++, + * and Fortran). While the internals of CUDPP are not limited + * to C (C++ features are used), the public interface is * entirely C (thus it is declared "extern C"). */ @@ -25,53 +25,53 @@ * \mainpage * * \section introduction Introduction - * + * * CUDPP is the CUDA Data Parallel Primitives Library. CUDPP is a - * library of data-parallel algorithm primitives such as - * parallel-prefix-sum ("scan"), parallel sort and parallel reduction. - * Primitives such as these are important building blocks for a wide - * variety of data-parallel algorithms, including sorting, stream - * compaction, and building data structures such as trees and + * library of data-parallel algorithm primitives such as + * parallel-prefix-sum ("scan"), parallel sort and parallel reduction. + * Primitives such as these are important building blocks for a wide + * variety of data-parallel algorithms, including sorting, stream + * compaction, and building data structures such as trees and * summed-area tables. * * \section overview Overview Presentation - * + * * A brief set of slides that describe the features, design principles, * applications and impact of CUDPP is available here: * CUDPP Presentation. * * \section homepage Homepage * Homepage for CUDPP: http://code.google.com/p/cudpp - * + * * Announcements and discussion of CUDPP are hosted on the * CUDPP Google Group. - * + * * \section getting-started Getting Started with CUDPP * - * You may want to start by browsing the \link publicInterface CUDPP Public - * Interface\endlink. For information on building CUDPP, see + * You may want to start by browsing the \link publicInterface CUDPP Public + * Interface\endlink. For information on building CUDPP, see * \ref building-cudpp "Building CUDPP". * - * The "apps" subdirectory included with CUDPP has a few source code samples + * The "apps" subdirectory included with CUDPP has a few source code samples * that use CUDPP: - * - \ref example_simpleCUDPP "simpleCUDPP", a simple example of using + * - \ref example_simpleCUDPP "simpleCUDPP", a simple example of using * cudppScan() - * - satGL, an example of using cudppMultiScan() to generate a summed-area - * table (SAT) of a scene rendered in real time. The SAT is then used to simulate + * - satGL, an example of using cudppMultiScan() to generate a summed-area + * table (SAT) of a scene rendered in real time. The SAT is then used to simulate * depth of field blur. - * - cudpp_testrig, a comprehensive test application for all the functionality + * - cudpp_testrig, a comprehensive test application for all the functionality * of CUDPP * - * We have also provided a code walkthrough of the + * We have also provided a code walkthrough of the * \ref example_simpleCUDPP "simpleCUDPP" example. * * \section getting-help Getting Help and Reporting Problems * - * To get help using CUDPP, please use the + * To get help using CUDPP, please use the * CUDPP Google Group. * - * To report CUDPP bugs or request features, you may use either the above - * CUDPP Google Group, or you can file an issue directly using + * To report CUDPP bugs or request features, you may use either the above + * CUDPP Google Group, or you can file an issue directly using * Google Code. * * \section release-notes Release Notes @@ -79,111 +79,111 @@ * For specific release details see the \ref changelog "Change Log". * * This release (1.1.1) is a bugfix release to CUDPP 1.1 that includes - * fixes to support CUDA 3.0 and the new NVIDIA Fermi architecture, + * fixes to support CUDA 3.0 and the new NVIDIA Fermi architecture, * including GeForce 400 series and Tesla 20 series GPUs. It also has * bug fixes for 64-bit OSes. - * + * * \section opSys Operating System Support - * + * * This release (1.1.1) has been thoroughly tested on the following OSes. * - Windows XP (32-bit) (CUDA 2.2, 3.0) * - Windows 7 (64-bit) (CUDA 3.0) * - Redhat Enterprise Linux 5 (64-bit) (CUDA 3.0) * - and Mac OS X 10.6 (Snow Leopard, 64-bit) (CUDA 3.0) * - * We expect CUDPP to build and run correctly on other flavors of Linux - * and Windows, but these are not actively tested by the developers at + * We expect CUDPP to build and run correctly on other flavors of Linux + * and Windows, but these are not actively tested by the developers at * this time. * - * Notes: CUDPP is not compatible with CUDA 2.1. A compiler bug in 2.1 - * causes the compiler to crash. Also, starting with CUDPP 1.1.1, we are - * no longer testing CUDA device emulation, because it is deprecated in - * CUDA 3.0 and will be removed from future CUDA versions. + * Notes: CUDPP is not compatible with CUDA 2.1. A compiler bug in 2.1 + * causes the compiler to crash. Also, starting with CUDPP 1.1.1, we are + * no longer testing CUDA device emulation, because it is deprecated in + * CUDA 3.0 and will be removed from future CUDA versions. * * \section cuda CUDA * CUDPP is implemented in - * CUDA C/C++. It requires the - * CUDA Toolkit version 2.2 or later. Please see the NVIDIA - * CUDA homepage to download - * CUDA as well as the CUDA Programming Guide and CUDA SDK, which includes many - * CUDA code examples. Some of the samples in the CUDA SDK (including + * CUDA C/C++. It requires the + * CUDA Toolkit version 2.2 or later. Please see the NVIDIA + * CUDA homepage to download + * CUDA as well as the CUDA Programming Guide and CUDA SDK, which includes many + * CUDA code examples. Some of the samples in the CUDA SDK (including * "marchingCubes", "lineOfSight", and radixSort) also use CUDPP. * * \section design-goals Design Goals * Design goals for CUDPP include: - * + * * - Performance. We aim to provide best-of-class performance for our - * primitives. We welcome suggestions and contributions that will improve - * CUDPP performance. We also want to provide primitives that can be easily - * benchmarked, and compared against other implementations on GPUs and other + * primitives. We welcome suggestions and contributions that will improve + * CUDPP performance. We also want to provide primitives that can be easily + * benchmarked, and compared against other implementations on GPUs and other * processors. * - Modularity. We want our primitives to be easily included in other * applications. To that end we have made the following design decisions: - * - CUDPP is provided as a library that can link against other applications. + * - CUDPP is provided as a library that can link against other applications. * - CUDPP calls run on the GPU on GPU data. Thus they can be used - * as standalone calls on the GPU (on GPU data initialized by the - * calling application) and, more importantly, as GPU components in larger + * as standalone calls on the GPU (on GPU data initialized by the + * calling application) and, more importantly, as GPU components in larger * CPU/GPU applications. * - CUDPP is implemented as 4 layers: - * -# The \link publicInterface Public Interface\endlink is the external - * library interface, which is the intended entry point for most - * applications. The public interface calls into the + * -# The \link publicInterface Public Interface\endlink is the external + * library interface, which is the intended entry point for most + * applications. The public interface calls into the * \link cudpp_app Application-Level API\endlink. * -# The \link cudpp_app Application-Level API\endlink comprises functions - * callable from CPU code. These functions execute code jointly on the - * CPU (host) and the GPU by calling into the + * callable from CPU code. These functions execute code jointly on the + * CPU (host) and the GPU by calling into the * \link cudpp_kernel Kernel-Level API\endlink below them. * -# The \link cudpp_kernel Kernel-Level API\endlink comprises functions - * that run entirely on the GPU across an entire grid of thread blocks. - * These functions may call into the \link cudpp_cta CTA-Level API\endlink + * that run entirely on the GPU across an entire grid of thread blocks. + * These functions may call into the \link cudpp_cta CTA-Level API\endlink * below them. - * -# The \link cudpp_cta CTA-Level API\endlink comprises functions that run - * entirely on the GPU within a single Cooperative Thread Array (CTA, - * aka thread block). These are low-level functions that implement core - * data-parallel algorithms, typically by processing data within shared + * -# The \link cudpp_cta CTA-Level API\endlink comprises functions that run + * entirely on the GPU within a single Cooperative Thread Array (CTA, + * aka thread block). These are low-level functions that implement core + * data-parallel algorithms, typically by processing data within shared * (CUDA \c __shared__) memory. * - * Programmers may use any of the lower three CUDPP layers in their own - * programs by building the source directly into their application. However, - * the typical usage of CUDPP is to link to the library and invoke functions in - * the CUDPP \link publicInterface Public Interface\endlink, as in the - * \ref example_simpleCUDPP "simpleCUDPP", satGL, and cudpp_testrig application + * Programmers may use any of the lower three CUDPP layers in their own + * programs by building the source directly into their application. However, + * the typical usage of CUDPP is to link to the library and invoke functions in + * the CUDPP \link publicInterface Public Interface\endlink, as in the + * \ref example_simpleCUDPP "simpleCUDPP", satGL, and cudpp_testrig application * examples included in the CUDPP distribution. * - * In the future, if and when CUDA supports building device-level libraries, we - * hope to enhance CUDPP to ease the use of CUDPP internal algorithms at all + * In the future, if and when CUDA supports building device-level libraries, we + * hope to enhance CUDPP to ease the use of CUDPP internal algorithms at all * levels. * * \subsection uses Use Cases * We expect the normal use of CUDPP will be in one of two ways: - * -# Linking the CUDPP library against another application. + * -# Linking the CUDPP library against another application. * -# Running our "test" application, cudpp_testrig, that exercises * CUDPP functionality. * * \section references References * The following publications describe work incorporated in CUDPP. - * + * * - Mark Harris, Shubhabrata Sengupta, and John D. Owens. "Parallel Prefix Sum (Scan) with CUDA". In Hubert Nguyen, editor, GPU Gems 3, chapter 39, pages 851–876. Addison Wesley, August 2007. http://graphics.idav.ucdavis.edu/publications/print_pub?pub_id=916 * - Shubhabrata Sengupta, Mark Harris, Yao Zhang, and John D. Owens. "Scan Primitives for GPU Computing". In Graphics Hardware 2007, pages 97–106, August 2007. http://graphics.idav.ucdavis.edu/publications/print_pub?pub_id=915 * - Shubhabrata Sengupta, Mark Harris, and Michael Garland. "Efficient parallel scan algorithms for GPUs". NVIDIA Technical Report NVR-2008-003, December 2008. http://mgarland.org/papers.html#segscan-tr * - Nadathur Satish, Mark Harris, and Michael Garland. "Designing Efficient Sorting Algorithms for Manycore GPUs". In Proceedings of the 23rd IEEE International Parallel & Distributed Processing Symposium, May 2009. http://mgarland.org/papers.html#gpusort * - Stanley Tzeng, Li-Yi Wei. "Parallel White Noise Generation on a GPU via Cryptographic Hash". In Proceedings of the 2008 Symposium on Interactive 3D Graphics and Games, pages 79–87, February 2008. http://research.microsoft.com/apps/pubs/default.aspx?id=70502 * - * Many researchers are using CUDPP in their work, and there are many publications - * that have used it \ref cudpp_refs "(references)". If your work uses CUDPP, please + * Many researchers are using CUDPP in their work, and there are many publications + * that have used it \ref cudpp_refs "(references)". If your work uses CUDPP, please * let us know by sending us a reference (preferably in BibTeX format) to your work. - * + * * \section citing Citing CUDPP * * If you make use of CUDPP primitives in your work and want to cite - * CUDPP (thanks!), we would prefer for you to cite the appropriate - * papers above, since they form the core of CUDPP. To be more specific, - * the GPU Gems paper describes (unsegmented) scan, multi-scan for - * summed-area tables, and stream compaction. The NVIDIA technical report - * describes the current scan and segmented scan algorithms used in the - * library, and the Graphics Hardware paper describes an earlier - * implementation of segmented scan, quicksort, and sparse matrix-vector - * multiply. The IPDPS paper describes the radix sort used in CUDPP, and + * CUDPP (thanks!), we would prefer for you to cite the appropriate + * papers above, since they form the core of CUDPP. To be more specific, + * the GPU Gems paper describes (unsegmented) scan, multi-scan for + * summed-area tables, and stream compaction. The NVIDIA technical report + * describes the current scan and segmented scan algorithms used in the + * library, and the Graphics Hardware paper describes an earlier + * implementation of segmented scan, quicksort, and sparse matrix-vector + * multiply. The IPDPS paper describes the radix sort used in CUDPP, and * the I3D paper describes the random number generation algorithm. * * \section credits Credits @@ -194,17 +194,17 @@ * - Stanley Tzeng, University of California, Davis * - Yao Zhang, University of California, Davis * - Andrew Davidson, University of California, Davis (formerly Louisiana State University) - * + * * \subsection contributors Other CUDPP Contributors * - Nadatur Satish, University of California, Berkeley * * \subsection acknowledgments Acknowledgments * - * Thanks to Jim Ahrens, Timo Aila, Nathan Bell, Ian Buck, Guy Blelloch, - * Jeff Bolz, Michael Garland, Jeff Inman, Eric Lengyel, Samuli Laine, - * David Luebke, Pat McCormick, and Richard Vuduc for their contributions - * during the development of this library. - * + * Thanks to Jim Ahrens, Timo Aila, Nathan Bell, Ian Buck, Guy Blelloch, + * Jeff Bolz, Michael Garland, Jeff Inman, Eric Lengyel, Samuli Laine, + * David Luebke, Pat McCormick, and Richard Vuduc for their contributions + * during the development of this library. + * * CUDPP Developers from UC Davis thank their funding agencies: * - Department of Energy Early Career Principal Investigator Award * DE-FG02-04ER25609 @@ -214,12 +214,12 @@ * - Generous hardware donations from NVIDIA * * \section license-overview CUDPP Copyright and Software License - * CUDPP is copyright The Regents of the University of California, Davis campus - * and NVIDIA Corporation. The library, examples, and all source code are - * released under the BSD license, designed to encourage reuse of this software - * in other projects, both commercial and non-commercial. For details, please - * see the \ref license page. - * + * CUDPP is copyright The Regents of the University of California, Davis campus + * and NVIDIA Corporation. The library, examples, and all source code are + * released under the BSD license, designed to encourage reuse of this software + * in other projects, both commercial and non-commercial. For details, please + * see the \ref license page. + * * Note that prior to release 1.1 of CUDPP, the license used was a modified * BSD license. With release 1.1, this license was replaced with the pure BSD * license to facilitate the use of open source hosting of the code. @@ -230,26 +230,26 @@ * * \section licenseBSD CUDPP License * - * CUDPP is released under the + * CUDPP is released under the * BSD license. - * + * * @include license.txt * */ -/** +/** * @page changelog CUDPP Change Log * * @include changelog.txt */ -/** +/** * @page cudpp_refs Publications that use CUDPP * * @htmlinclude doc/bib/cudpp_refs.html */ -/** +/** * @page cudpp_refs_bib Bibliography for publications that use CUDPP * * @htmlinclude doc/bib/cudpp_refs_bib.html @@ -258,43 +258,43 @@ /** * @page building-cudpp Building CUDPP * - * CUDPP has currently been tested in Windows XP, Windows Vista, Mac OS X + * CUDPP has currently been tested in Windows XP, Windows Vista, Mac OS X * and Linux. See \ref release-notes for release specific platform support. * * \section build-win32 Building CUDPP on Windows XP * - * CUDPP can be built using either or MSVC 8 (2005) or MSVC 9 (2008). To - * build, open cudpp/cudpp.sln. Then you can build the library - * using the "build" command as you would with any other workspace. There are - * four configurations: debug, release, emudebug, and emurelease. The first - * two are self-explanatory. The second two are built to use CUDA device + * CUDPP can be built using either or MSVC 8 (2005) or MSVC 9 (2008). To + * build, open cudpp/cudpp.sln. Then you can build the library + * using the "build" command as you would with any other workspace. There are + * four configurations: debug, release, emudebug, and emurelease. The first + * two are self-explanatory. The second two are built to use CUDA device * emulation, meaning they will be run (slowly) on the CPU. * * \section build-linux Building CUDPP on Linux and Mac OS X * - * CUDPP can be built using standard g++ and Make tools on Linux, by typing - * "make" in the "cudpp/" subdirectory. Before building CUDPP, you should - * first build the CUDA Utility Library (libcutil) by typing "make; make dbg=1" - * in the "common/" subdirectory. This will generate libcutil.a and - * libcutilD.a. - * - * The makefile for CUDPP and all sample applications take the optional + * CUDPP can be built using standard g++ and Make tools on Linux, by typing + * "make" in the "cudpp/" subdirectory. Before building CUDPP, you should + * first build the CUDA Utility Library (libcutil) by typing "make; make dbg=1" + * in the "common/" subdirectory. This will generate libcutil.a and + * libcutilD.a. + * + * The makefile for CUDPP and all sample applications take the optional * arguments "emu=1" and "dbg=1". The former builds CUDPP for device emulation, * and the latter for debugging. The two flags can be combined. "verbose=1" * can be used to see all compiler output. * * \section build-apps Building CUDPP Sample Applications - * - * The sample applications in the "apps/" subdirectory can be built exactly - * like CUDPP is--either by opening the appropriate .sln/.vcproj file in MSVC + * + * The sample applications in the "apps/" subdirectory can be built exactly + * like CUDPP is--either by opening the appropriate .sln/.vcproj file in MSVC * in Windows, or using "make" in Linux. * * On some Linux installations you will get linker errors relating to "-lXi" - * and "-lXmu". To fix this, you will need to install libXi and libXmu. On - * Debian and Ubuntu, for example, you can simply run - * "sudo apt-get install libxi-dev", and + * and "-lXmu". To fix this, you will need to install libXi and libXmu. On + * Debian and Ubuntu, for example, you can simply run + * "sudo apt-get install libxi-dev", and * "sudo apt-get install libxmu-dev" - * + * */ #ifndef __CUDPP_H__ @@ -312,7 +312,7 @@ extern "C" { enum CUDPPResult { CUDPP_SUCCESS = 0, /**< No error. */ - CUDPP_ERROR_INVALID_HANDLE, /**< Specified handle (for example, + CUDPP_ERROR_INVALID_HANDLE, /**< Specified handle (for example, to a plan) is invalid. **/ CUDPP_ERROR_ILLEGAL_CONFIGURATION, /**< Specified configuration is illegal. For example, an @@ -321,9 +321,9 @@ enum CUDPPResult CUDPP_ERROR_UNKNOWN = 9999 /**< Unknown or untraceable error. */ }; -/** +/** * @brief Options for configuring CUDPP algorithms. - * + * * @see CUDPPConfiguration, cudppPlan, CUDPPAlgorithm */ enum CUDPPOption @@ -344,13 +344,13 @@ enum CUDPPOption * the CTAs (blocks) with no * communication between blocks. * @todo Currently ignored. */ - CUDPP_OPTION_KEYS_ONLY = 0x20, /**< No associated value to a key + CUDPP_OPTION_KEYS_ONLY = 0x20, /**< No associated value to a key * (for global radix sort) */ CUDPP_OPTION_KEY_VALUE_PAIRS = 0x40, /**< Each key has an associated value */ }; -/** +/** * @brief Datatypes supported by CUDPP algorithms. * * @see CUDPPConfiguration, cudppPlan @@ -364,7 +364,7 @@ enum CUDPPDatatype CUDPP_FLOAT //!< Float type (C float) }; -/** +/** * @brief Operators supported by CUDPP algorithms (currently scan and * segmented scan). * @@ -383,7 +383,7 @@ enum CUDPPOperator /** * @brief Algorithms supported by CUDPP. Used to create appropriate plans using * cudppPlan. -* +* * @see CUDPPConfiguration, cudppPlan */ enum CUDPPAlgorithm @@ -415,7 +415,7 @@ struct CUDPPConfiguration #define CUDPP_INVALID_HANDLE 0xC0DABAD1 typedef size_t CUDPPHandle; -/* To use CUDPP as a static library, #define CUDPP_STATIC_LIB before +/* To use CUDPP as a static library, #define CUDPP_STATIC_LIB before * including cudpp.h */ #define CUDPP_STATIC_LIB @@ -438,10 +438,10 @@ typedef size_t CUDPPHandle; // Plan allocation (for scan, sort, and compact) CUDPP_DLL -CUDPPResult cudppPlan(CUDPPHandle *planHandle, - CUDPPConfiguration config, - size_t n, - size_t rows, +CUDPPResult cudppPlan(CUDPPHandle *planHandle, + CUDPPConfiguration config, + size_t n, + size_t rows, size_t rowPitch); CUDPP_DLL @@ -451,46 +451,46 @@ CUDPPResult cudppDestroyPlan(CUDPPHandle plan); CUDPP_DLL CUDPPResult cudppScan(CUDPPHandle planHandle, - void *d_out, - const void *d_in, + void *d_out, + const void *d_in, size_t numElements); CUDPP_DLL CUDPPResult cudppMultiScan(CUDPPHandle planHandle, - void *d_out, - const void *d_in, + void *d_out, + const void *d_in, size_t numElements, size_t numRows); CUDPP_DLL CUDPPResult cudppSegmentedScan(CUDPPHandle planHandle, - void *d_out, + void *d_out, const void *d_idata, const unsigned int *d_iflags, size_t numElements); CUDPP_DLL CUDPPResult cudppCompact(CUDPPHandle planHandle, - void *d_out, + void *d_out, size_t *d_numValidElements, - const void *d_in, + const void *d_in, const unsigned int *d_isValid, size_t numElements); CUDPP_DLL CUDPPResult cudppSort(CUDPPHandle planHandle, - void *d_keys, - void *d_values, + void *d_keys, + void *d_values, int keybits, size_t numElements); // Sparse matrix allocation CUDPP_DLL -CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, - CUDPPConfiguration config, - size_t n, - size_t rows, +CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, + CUDPPConfiguration config, + size_t n, + size_t rows, const void *A, const unsigned int *h_rowIndices, const unsigned int *h_indices); diff --git a/lib/gpu/cudpp_mini/cudpp_globals.h b/lib/gpu/cudpp_mini/cudpp_globals.h index b0db9cf922..162aef6eb9 100644 --- a/lib/gpu/cudpp_mini/cudpp_globals.h +++ b/lib/gpu/cudpp_mini/cudpp_globals.h @@ -3,17 +3,17 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt in // the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * cudpp_globals.h * * @brief Global declarations defining machine characteristics of GPU target - * These are currently set for best performance on G8X GPUs. The optimal + * These are currently set for best performance on G8X GPUs. The optimal * parameters may change on future GPUs. In the future, we hope to make * CUDPP a self-tuning library. */ @@ -31,7 +31,7 @@ const int LOG_SIZEOF_FLOAT = 2; /**< log_2(sizeof(float)) */ const int SCAN_ELTS_PER_THREAD = 8; /**< Number of elements per scan thread */ const int SEGSCAN_ELTS_PER_THREAD = 8; /**< Number of elements per segmented scan thread */ -const int maxSharedMemoryPerBlock = 16384; /**< Number of bytes of shared +const int maxSharedMemoryPerBlock = 16384; /**< Number of bytes of shared memory in each block */ const int maxThreadsPerBlock = CTA_SIZE; /**< Maximum number of * threads in a CTA */ diff --git a/lib/gpu/cudpp_mini/cudpp_maximal_launch.cpp b/lib/gpu/cudpp_mini/cudpp_maximal_launch.cpp index 1a7542e68c..f8c54edb58 100644 --- a/lib/gpu/cudpp_mini/cudpp_maximal_launch.cpp +++ b/lib/gpu/cudpp_mini/cudpp_maximal_launch.cpp @@ -3,10 +3,10 @@ // ------------------------------------------------------------- // $Revision$ // $Date$ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- +// ------------------------------------------------------------- #include "cudpp_maximal_launch.h" #include @@ -25,12 +25,12 @@ inline size_t ceiling(size_t x, size_t f) } extern "C" -size_t maxBlocks(cudaFuncAttributes &attribs, - cudaDeviceProp &devprop, +size_t maxBlocks(cudaFuncAttributes &attribs, + cudaDeviceProp &devprop, size_t bytesDynamicSharedMem, size_t threadsPerBlock) { - + // Determine the maximum number of CTAs that can be run simultaneously for each kernel // This is equivalent to the calculation done in the CUDA Occupancy Calculator spreadsheet const unsigned int regAllocationUnit = (devprop.major < 2 && devprop.minor < 2) ? 256 : 512; // in registers @@ -48,7 +48,7 @@ size_t maxBlocks(cudaFuncAttributes &attribs, size_t regsPerCTA = attribs.numRegs * devprop.warpSize * numWarps; // Round up to multiple of register allocation unit size regsPerCTA = ceiling(regsPerCTA, regAllocationUnit); - + size_t smemBytes = attribs.sharedSizeBytes + bytesDynamicSharedMem; size_t smemPerCTA = ceiling(smemBytes, smemAllocationUnit); @@ -60,7 +60,7 @@ size_t maxBlocks(cudaFuncAttributes &attribs, } extern "C" -size_t maxBlocksFromPointer(void* kernel, +size_t maxBlocksFromPointer(void* kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock) { diff --git a/lib/gpu/cudpp_mini/cudpp_maximal_launch.h b/lib/gpu/cudpp_mini/cudpp_maximal_launch.h index a8ffc3f978..85d21f1dbe 100644 --- a/lib/gpu/cudpp_mini/cudpp_maximal_launch.h +++ b/lib/gpu/cudpp_mini/cudpp_maximal_launch.h @@ -3,30 +3,30 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- +// ------------------------------------------------------------- #ifndef _MAXIMAL_LAUNCH_H_ #define _MAXIMAL_LAUNCH_H_ - + #include "cuda_runtime.h" extern "C" -size_t maxBlocks(cudaFuncAttributes &attribs, - cudaDeviceProp &devprop, +size_t maxBlocks(cudaFuncAttributes &attribs, + cudaDeviceProp &devprop, size_t bytesDynamicSharedMem, size_t threadsPerBlock); extern "C" -size_t maxBlocksFromPointer(void* kernel, +size_t maxBlocksFromPointer(void* kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock); #ifdef __cplusplus template -size_t maxBlocks(T kernel, +size_t maxBlocks(T kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock) { diff --git a/lib/gpu/cudpp_mini/cudpp_plan.cpp b/lib/gpu/cudpp_mini/cudpp_plan.cpp index 8ea99a23fe..e1c9f649bf 100644 --- a/lib/gpu/cudpp_mini/cudpp_plan.cpp +++ b/lib/gpu/cudpp_mini/cudpp_plan.cpp @@ -3,11 +3,11 @@ // ------------------------------------------------------------- // $Revision: 3572$ // $Date: 2007-11-19 13:58:06 +0000 (Mon, 19 Nov 2007) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + #include "cudpp.h" #include "cudpp_plan_manager.h" #include "cudpp_scan.h" @@ -43,21 +43,21 @@ CUDPPResult validateOptions(CUDPPConfiguration config, size_t /*numElements*/, s */ -/** @brief Create a CUDPP plan - * +/** @brief Create a CUDPP plan + * * A plan is a data structure containing state and intermediate storage space - * that CUDPP uses to execute algorithms on data. A plan is created by + * that CUDPP uses to execute algorithms on data. A plan is created by * passing to cudppPlan() a CUDPPConfiguration that specifies the algorithm, * operator, datatype, and options. The size of the data must also be passed - * to cudppPlan(), in the \a numElements, \a numRows, and \a rowPitch + * to cudppPlan(), in the \a numElements, \a numRows, and \a rowPitch * arguments. These sizes are used to allocate internal storage space at the * time the plan is created. The CUDPP planner may use the sizes, options, * and information about the present hardware to choose optimal settings. * * Note that \a numElements is the maximum size of the array to be processed - * with this plan. That means that a plan may be re-used to process (for - * example, to sort or scan) smaller arrays. - * + * with this plan. That means that a plan may be re-used to process (for + * example, to sort or scan) smaller arrays. + * * @param[out] planHandle A pointer to an opaque handle to the internal plan * @param[in] config The configuration struct specifying algorithm and options * @param[in] numElements The maximum number of elements to be processed @@ -65,10 +65,10 @@ CUDPPResult validateOptions(CUDPPConfiguration config, size_t /*numElements*/, s * @param[in] rowPitch The pitch of the rows of input data, in elements */ CUDPP_DLL -CUDPPResult cudppPlan(CUDPPHandle *planHandle, - CUDPPConfiguration config, - size_t numElements, - size_t numRows, +CUDPPResult cudppPlan(CUDPPHandle *planHandle, + CUDPPConfiguration config, + size_t numElements, + size_t numRows, size_t rowPitch) { CUDPPResult result = CUDPP_SUCCESS; @@ -114,7 +114,7 @@ CUDPPResult cudppPlan(CUDPPHandle *planHandle, case CUDPP_REDUCE:*/ default: //! @todo: implement cudppReduce() - return CUDPP_ERROR_ILLEGAL_CONFIGURATION; + return CUDPP_ERROR_ILLEGAL_CONFIGURATION; break; } @@ -129,7 +129,7 @@ CUDPPResult cudppPlan(CUDPPHandle *planHandle, * * Deletes the plan referred to by \a planHandle and all associated internal * storage. - * + * * @param[in] planHandle The CUDPPHandle to the plan to be destroyed */ CUDPP_DLL @@ -141,29 +141,29 @@ CUDPPResult cudppDestroyPlan(CUDPPHandle planHandle) return CUDPP_SUCCESS; } -/** @brief Create a CUDPP Sparse Matrix Object +/** @brief Create a CUDPP Sparse Matrix Object * * The sparse matrix plan is a data structure containing state and intermediate storage space - * that CUDPP uses to perform sparse matrix dense vector multiply. This plan is created by - * passing to CUDPPSparseMatrixVectorMultiplyPlan() a CUDPPConfiguration that specifies the + * that CUDPP uses to perform sparse matrix dense vector multiply. This plan is created by + * passing to CUDPPSparseMatrixVectorMultiplyPlan() a CUDPPConfiguration that specifies the * algorithm (sprarse matrix-dense vector multiply) and datatype, along with the sparse matrix * itself in CSR format. The number of non-zero elements in the sparse matrix must also be passed - * as \a numNonZeroElements. This is used to allocate internal storage space at the time the + * as \a numNonZeroElements. This is used to allocate internal storage space at the time the * sparse matrix plan is created. * * @param[out] sparseMatrixHandle A pointer to an opaque handle to the sparse matrix object * @param[in] config The configuration struct specifying algorithm and options - * @param[in] numNonZeroElements The number of non zero elements in the sparse matrix + * @param[in] numNonZeroElements The number of non zero elements in the sparse matrix * @param[in] numRows This is the number of rows in y, x and A for y = A * x * @param[in] A The matrix data * @param[in] h_rowIndices An array containing the index of the start of each row in \a A * @param[in] h_indices An array containing the index of each nonzero element in \a A - + CUDPP_DLL -CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, - CUDPPConfiguration config, - size_t numNonZeroElements, - size_t numRows, +CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, + CUDPPConfiguration config, + size_t numNonZeroElements, + size_t numRows, const void *A, const unsigned int *h_rowIndices, const unsigned int *h_indices) @@ -172,7 +172,7 @@ CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, CUDPPPlan *sparseMatrix; - if ((config.algorithm != CUDPP_SPMVMULT) || + if ((config.algorithm != CUDPP_SPMVMULT) || (numNonZeroElements <= 0) || (numRows <= 0)) { result = CUDPP_ERROR_ILLEGAL_CONFIGURATION; @@ -184,8 +184,8 @@ CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, return result; } - sparseMatrix = - new CUDPPSparseMatrixVectorMultiplyPlan(config, numNonZeroElements, A, + sparseMatrix = + new CUDPPSparseMatrixVectorMultiplyPlan(config, numNonZeroElements, A, h_rowIndices, h_indices, numRows); *sparseMatrixHandle = CUDPPPlanManager::AddPlan(sparseMatrix); @@ -197,11 +197,11 @@ CUDPPResult cudppSparseMatrix(CUDPPHandle *sparseMatrixHandle, */ /** @brief Destroy a CUDPP Sparse Matrix Object * - * Deletes the sparse matrix data and plan referred to by \a sparseMatrixHandle + * Deletes the sparse matrix data and plan referred to by \a sparseMatrixHandle * and all associated internal storage. - * + * * @param[in] sparseMatrixHandle The CUDPPHandle to the matrix object to be destroyed - + CUDPP_DLL CUDPPResult cudppDestroySparseMatrix(CUDPPHandle sparseMatrixHandle) { @@ -213,15 +213,15 @@ CUDPPResult cudppDestroySparseMatrix(CUDPPHandle sparseMatrixHandle) /** @brief Plan base class constructor - * + * * @param[in] config The configuration struct specifying algorithm and options * @param[in] numElements The maximum number of elements to be processed * @param[in] numRows The number of rows (for 2D operations) to be processed * @param[in] rowPitch The pitch of the rows of input data, in elements */ -CUDPPPlan::CUDPPPlan(CUDPPConfiguration config, - size_t numElements, - size_t numRows, +CUDPPPlan::CUDPPPlan(CUDPPConfiguration config, + size_t numElements, + size_t numRows, size_t rowPitch) : m_config(config), m_numElements(numElements), @@ -231,15 +231,15 @@ CUDPPPlan::CUDPPPlan(CUDPPConfiguration config, } /** @brief Scan Plan constructor -* +* * @param[in] config The configuration struct specifying algorithm and options * @param[in] numElements The maximum number of elements to be scanned * @param[in] numRows The maximum number of rows (for 2D operations) to be scanned * @param[in] rowPitch The pitch of the rows of input data, in elements */ -CUDPPScanPlan::CUDPPScanPlan(CUDPPConfiguration config, - size_t numElements, - size_t numRows, +CUDPPScanPlan::CUDPPScanPlan(CUDPPConfiguration config, + size_t numElements, + size_t numRows, size_t rowPitch) : CUDPPPlan(config, numElements, numRows, rowPitch), m_blockSums(0), @@ -258,11 +258,11 @@ CUDPPScanPlan::~CUDPPScanPlan() } /** @brief SegmentedScan Plan constructor -* +* * @param[in] config The configuration struct specifying options * @param[in] numElements The maximum number of elements to be scanned -CUDPPSegmentedScanPlan::CUDPPSegmentedScanPlan(CUDPPConfiguration config, +CUDPPSegmentedScanPlan::CUDPPSegmentedScanPlan(CUDPPConfiguration config, size_t numElements) : CUDPPPlan(config, numElements, 1, 0), m_blockSums(0), @@ -274,43 +274,43 @@ CUDPPSegmentedScanPlan::CUDPPSegmentedScanPlan(CUDPPConfiguration config, allocSegmentedScanStorage(this); } */ -/** @brief SegmentedScan plan destructor +/** @brief SegmentedScan plan destructor CUDPPSegmentedScanPlan::~CUDPPSegmentedScanPlan() { freeSegmentedScanStorage(this); } */ /** @brief Compact Plan constructor -* +* * @param[in] config The configuration struct specifying options * @param[in] numElements The maximum number of elements to be compacted * @param[in] numRows The number of rows (for 2D operations) to be compacted * @param[in] rowPitch The pitch of the rows of input data, in elements -CUDPPCompactPlan::CUDPPCompactPlan(CUDPPConfiguration config, - size_t numElements, - size_t numRows, +CUDPPCompactPlan::CUDPPCompactPlan(CUDPPConfiguration config, + size_t numElements, + size_t numRows, size_t rowPitch) : CUDPPPlan(config, numElements, numRows, rowPitch), m_d_outputIndices(0) { assert(numRows == 1); //!< @todo Add support for multirow compaction - CUDPPConfiguration scanConfig = - { - CUDPP_SCAN, - CUDPP_ADD, - CUDPP_UINT, - (config.options & CUDPP_OPTION_BACKWARD) ? - CUDPP_OPTION_BACKWARD | CUDPP_OPTION_EXCLUSIVE : - CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE + CUDPPConfiguration scanConfig = + { + CUDPP_SCAN, + CUDPP_ADD, + CUDPP_UINT, + (config.options & CUDPP_OPTION_BACKWARD) ? + CUDPP_OPTION_BACKWARD | CUDPP_OPTION_EXCLUSIVE : + CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE }; m_scanPlan = new CUDPPScanPlan(scanConfig, numElements, numRows, rowPitch); allocCompactStorage(this); } */ -/** @brief Compact plan destructor +/** @brief Compact plan destructor CUDPPCompactPlan::~CUDPPCompactPlan() { delete m_scanPlan; @@ -318,7 +318,7 @@ CUDPPCompactPlan::~CUDPPCompactPlan() } */ /** @brief Sort Plan constructor -* +* * @param[in] config The configuration struct specifying algorithm and options * @param[in] numElements The maximum number of elements to be sorted */ @@ -328,12 +328,12 @@ CUDPPCompactPlan::~CUDPPCompactPlan() m_d_temp(0), m_d_tempAddress(0) { - CUDPPConfiguration scanConfig = - { - CUDPP_SCAN, - CUDPP_ADD, - CUDPP_UINT, - CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE + CUDPPConfiguration scanConfig = + { + CUDPP_SCAN, + CUDPP_ADD, + CUDPP_UINT, + CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE }; //if (config.algorithm == CUDPP_SORT_RADIX_GLOBAL) @@ -354,31 +354,31 @@ CUDPPCompactPlan::~CUDPPCompactPlan() CUDPPRadixSortPlan::CUDPPRadixSortPlan(CUDPPConfiguration config, size_t numElements) : CUDPPPlan(config, numElements, 1, 0), m_scanPlan(0), - m_tempKeys(0), + m_tempKeys(0), m_tempValues(0), m_counters(0), m_countersSum(0), - m_blockOffsets(0) + m_blockOffsets(0) { size_t numBlocks2 = ((numElements % (SORT_CTA_SIZE * 2)) == 0) ? (numElements / (SORT_CTA_SIZE * 2)) : (numElements / (SORT_CTA_SIZE * 2) + 1); - CUDPPConfiguration scanConfig = - { - CUDPP_SCAN, - CUDPP_ADD, - CUDPP_UINT, - CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE - }; + CUDPPConfiguration scanConfig = + { + CUDPP_SCAN, + CUDPP_ADD, + CUDPP_UINT, + CUDPP_OPTION_FORWARD | CUDPP_OPTION_EXCLUSIVE + }; if(m_config.options == CUDPP_OPTION_KEYS_ONLY) m_bKeysOnly = true; else m_bKeysOnly = false; - m_scanPlan = new CUDPPScanPlan(scanConfig, numBlocks2*16, 1, 0); - - allocRadixSortStorage(this); + m_scanPlan = new CUDPPScanPlan(scanConfig, numBlocks2*16, 1, 0); + + allocRadixSortStorage(this); } CUDPPRadixSortPlan::~CUDPPRadixSortPlan() @@ -388,11 +388,11 @@ CUDPPRadixSortPlan::~CUDPPRadixSortPlan() } /** @brief SparseMatrixVectorMultiply Plan constructor -* +* * @param[in] config The configuration struct specifying options * @param[in] numNonZeroElements The number of non-zero elements in sparse matrix * @param[in] A Array of non-zero matrix elements -* @param[in] rowIndex Array of indices of the first element of each row +* @param[in] rowIndex Array of indices of the first element of each row * in the "flattened" version of the sparse matrix * @param[in] index Array of indices of non-zero elements in the matrix * @param[in] numRows The number of rows in the sparse matrix @@ -412,14 +412,14 @@ CUDPPSparseMatrixVectorMultiplyPlan::CUDPPSparseMatrixVectorMultiplyPlan( m_d_rowFinalIndex(0), m_rowFinalIndex(0), m_numRows(numRows), - m_numNonZeroElements(numNonZeroElements) + m_numNonZeroElements(numNonZeroElements) { - CUDPPConfiguration segScanConfig = - { - CUDPP_SEGMENTED_SCAN, - CUDPP_ADD, - config.datatype, - (CUDPP_OPTION_FORWARD | CUDPP_OPTION_INCLUSIVE) + CUDPPConfiguration segScanConfig = + { + CUDPP_SEGMENTED_SCAN, + CUDPP_ADD, + config.datatype, + (CUDPP_OPTION_FORWARD | CUDPP_OPTION_INCLUSIVE) }; m_segmentedScanPlan = new CUDPPSegmentedScanPlan(segScanConfig, m_numNonZeroElements); @@ -437,7 +437,7 @@ CUDPPSparseMatrixVectorMultiplyPlan::CUDPPSparseMatrixVectorMultiplyPlan( allocSparseMatrixVectorMultiplyStorage(this, A, rowIndex, index); } */ -/** @brief Sparse matrix-vector plan destructor +/** @brief Sparse matrix-vector plan destructor CUDPPSparseMatrixVectorMultiplyPlan::~CUDPPSparseMatrixVectorMultiplyPlan() { freeSparseMatrixVectorMultiplyStorage(this); @@ -448,12 +448,12 @@ CUDPPSparseMatrixVectorMultiplyPlan::~CUDPPSparseMatrixVectorMultiplyPlan() /** @brief CUDPP Rand Plan Constructor * @param[in] config The configuration struct specifying options * @param[in] num_elements The number of elements to generate random bits for - -CUDPPRandPlan::CUDPPRandPlan(CUDPPConfiguration config, size_t num_elements) + +CUDPPRandPlan::CUDPPRandPlan(CUDPPConfiguration config, size_t num_elements) : CUDPPPlan(config, num_elements, 1, 0), m_seed(0) { - + } */ diff --git a/lib/gpu/cudpp_mini/cudpp_plan.h b/lib/gpu/cudpp_mini/cudpp_plan.h index 675adbecf3..86bce747ba 100644 --- a/lib/gpu/cudpp_mini/cudpp_plan.h +++ b/lib/gpu/cudpp_mini/cudpp_plan.h @@ -99,7 +99,7 @@ class CUDPPRadixSortPlan : public CUDPPPlan public: CUDPPRadixSortPlan(CUDPPConfiguration config, size_t numElements); virtual ~CUDPPRadixSortPlan(); - + bool m_bKeysOnly; bool m_bManualCoalesce; bool m_bUsePersistentCTAs; diff --git a/lib/gpu/cudpp_mini/cudpp_plan_manager.cpp b/lib/gpu/cudpp_mini/cudpp_plan_manager.cpp index 33c8621d29..202a33dc32 100644 --- a/lib/gpu/cudpp_mini/cudpp_plan_manager.cpp +++ b/lib/gpu/cudpp_mini/cudpp_plan_manager.cpp @@ -3,20 +3,20 @@ // ------------------------------------------------------------- // $Revision: 3572$ // $Date: 2007-11-19 13:58:06 +0000 (Mon, 19 Nov 2007) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- +// ------------------------------------------------------------- #include "cudpp.h" #include "cudpp_plan.h" #include "cudpp_plan_manager.h" #include "cudpp_maximal_launch.h" - + typedef void* KernelPointer; extern "C" size_t getNumCTAs(KernelPointer kernel) { - return CUDPPPlanManager::numCTAs(kernel); + return CUDPPPlanManager::numCTAs(kernel); } extern "C" void compNumCTAs(KernelPointer kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock) { @@ -24,23 +24,23 @@ extern "C" void compNumCTAs(KernelPointer kernel, size_t bytesDynamicSharedMem, } //! @internal Instantiate the plan manager singleton object -void CUDPPPlanManager::Instantiate() -{ - if (nullptr == m_instance) - m_instance = new CUDPPPlanManager; +void CUDPPPlanManager::Instantiate() +{ + if (nullptr == m_instance) + m_instance = new CUDPPPlanManager; } //! @internal Destroy the plan manager singleton object -void CUDPPPlanManager::Destroy() -{ - if (nullptr != m_instance) - { - delete m_instance; - m_instance = nullptr; - } +void CUDPPPlanManager::Destroy() +{ + if (nullptr != m_instance) + { + delete m_instance; + m_instance = nullptr; + } } -/** @brief Plan Manager destructor +/** @brief Plan Manager destructor * Destroys all plans as well as the plan manager. */ CUDPPPlanManager::~CUDPPPlanManager() @@ -59,8 +59,8 @@ CUDPPPlanManager::~CUDPPPlanManager() } /** @brief Add a plan to the plan manager -* -* @returns a valid CUDPPHandle if the plan was successfully added, or +* +* @returns a valid CUDPPHandle if the plan was successfully added, or * CUDPP_INVALID_HANDLE otherwise * @param[in] plan The plan to add */ @@ -75,11 +75,11 @@ CUDPPHandle CUDPPPlanManager::AddPlan(CUDPPPlan* plan) if (ret.second == true) return handle; else - return CUDPP_INVALID_HANDLE; + return CUDPP_INVALID_HANDLE; } /** @brief Remove a plan from the plan manager -* +* * @returns true if the plan was successfully removed, false otherwise * @param[in] handle The handle to the plan to remove */ @@ -106,15 +106,15 @@ bool CUDPPPlanManager::RemovePlan(CUDPPHandle handle) } return true; - } + } else { return false; - } + } } /** @brief Get a plan from the plan manager by handle -* +* * @returns A pointer to the plan if found, or nullptr otherwise * @param handle The handle to the requested plan */ diff --git a/lib/gpu/cudpp_mini/cudpp_plan_manager.h b/lib/gpu/cudpp_mini/cudpp_plan_manager.h index 1ccdca5168..68164921b3 100644 --- a/lib/gpu/cudpp_mini/cudpp_plan_manager.h +++ b/lib/gpu/cudpp_mini/cudpp_plan_manager.h @@ -3,20 +3,20 @@ // ------------------------------------------------------------- // $Revision: 3572$ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- +// ------------------------------------------------------------- #ifndef __CUDPP_PLAN_MANAGER_H__ #define __CUDPP_PLAN_MANAGER_H__ - + #include class CUDPPPlan; typedef void* KernelPointer; /** @brief Singleton manager class for CUDPPPlan objects - * + * * This class manages all active plans in CUDPP. It is a singleton class, * meaning that only one instance can exist. It is created automatically the * first time AddPlan() is called, and destroyed when the last plan is removed @@ -28,19 +28,19 @@ public: static CUDPPHandle AddPlan(CUDPPPlan* plan); static bool RemovePlan(CUDPPHandle handle); static CUDPPPlan* GetPlan(CUDPPHandle handle); - + static size_t numCTAs(KernelPointer kernel); - static void computeNumCTAs(KernelPointer kernel, - size_t bytesDynamicSharedMem, + static void computeNumCTAs(KernelPointer kernel, + size_t bytesDynamicSharedMem, size_t threadsPerBlock); - + protected: static CUDPPPlanManager* m_instance; std::map plans; std::map numCTAsTable; private: - + //! @internal Instantiate the plan manager singleton object static void Instantiate(); diff --git a/lib/gpu/cudpp_mini/cudpp_radixsort.h b/lib/gpu/cudpp_mini/cudpp_radixsort.h index b977017d30..58c4ff2848 100644 --- a/lib/gpu/cudpp_mini/cudpp_radixsort.h +++ b/lib/gpu/cudpp_mini/cudpp_radixsort.h @@ -3,14 +3,14 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- +// ------------------------------------------------------------- #ifndef __RADIXSORT_H__ #define __RADIXSORT_H__ - -#define SORT_CTA_SIZE 256 //This CTA_SIZE must equal 16 * number of radices + +#define SORT_CTA_SIZE 256 //This CTA_SIZE must equal 16 * number of radices #include "cudpp_globals.h" #include "cudpp.h" diff --git a/lib/gpu/cudpp_mini/cudpp_scan.h b/lib/gpu/cudpp_mini/cudpp_scan.h index af4729b297..932b019e2f 100644 --- a/lib/gpu/cudpp_mini/cudpp_scan.h +++ b/lib/gpu/cudpp_mini/cudpp_scan.h @@ -3,11 +3,11 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- -// This source code is distributed under the terms of license.txt +// ------------------------------------------------------------- +// This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * cudpp_scan.h @@ -27,8 +27,8 @@ extern "C" void freeScanStorage(CUDPPScanPlan *plan); extern "C" -void cudppScanDispatch(void *d_out, - const void *d_in, +void cudppScanDispatch(void *d_out, + const void *d_in, size_t numElements, size_t numRows, const CUDPPScanPlan *plan); diff --git a/lib/gpu/cudpp_mini/cudpp_util.h b/lib/gpu/cudpp_mini/cudpp_util.h index e1c21f3fe6..1b04a1df2f 100644 --- a/lib/gpu/cudpp_mini/cudpp_util.h +++ b/lib/gpu/cudpp_mini/cudpp_util.h @@ -3,11 +3,11 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- +// ------------------------------------------------------------- // This source code is distributed under the terms of license.txt in // the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * cudpp_util.h @@ -40,7 +40,7 @@ * @param n Value to be checked to see if it is a power of two * @returns True if \a n is a power of two, false otherwise */ -inline bool +inline bool isPowerOfTwo(int n) { return ((n&(n-1))==0) ; @@ -64,8 +64,8 @@ isMultiple(int n, int f) * @param n Input value * @returns The smallest power f two larger than \a n */ -inline int -ceilPow2(int n) +inline int +ceilPow2(int n) { double log2n = log2((double)n); if (isPowerOfTwo(n)) @@ -78,7 +78,7 @@ ceilPow2(int n) * @param n Input value * @returns The largest power of two smaller than \a n. */ -inline int +inline int floorPow2(int n) { #ifdef WIN32 @@ -93,16 +93,16 @@ floorPow2(int n) } /** @brief Returns the maximum value for type \a T. - * + * * Implemented using template specialization on \a T. */ -template +template __host__ __device__ inline T getMax() { return 0; } /** @brief Returns the minimum value for type \a T. -* +* * Implemented using template specialization on \a T. */ -template +template __host__ __device__ inline T getMin() { return 0; } // type specializations for the above // getMax @@ -118,22 +118,22 @@ template <> __host__ __device__ inline float getMin() { return -FLT_MAX; } template <> __host__ __device__ inline char getMin() { return (char)INT_MIN; } template <> __host__ __device__ inline unsigned char getMin() { return (unsigned char)0; } -/** @brief Returns the maximum of three values. - * @param a First value. - * @param b Second value. - * @param c Third value. +/** @brief Returns the maximum of three values. + * @param a First value. + * @param b Second value. + * @param c Third value. * @returns The maximum of \a a, \a b and \a c. */ template inline int max3(T a, T b, T c) -{ +{ return (a > b) ? ((a > c)? a : c) : ((b > c) ? b : c); } /** @brief Utility template struct for generating small vector types from scalar types * - * Given a base scalar type (\c int, \c float, etc.) and a vector length (1 through 4) as - * template parameters, this struct defines a vector type (\c float3, \c int4, etc.) of the + * Given a base scalar type (\c int, \c float, etc.) and a vector length (1 through 4) as + * template parameters, this struct defines a vector type (\c float3, \c int4, etc.) of the * specified length and base type. For example: * \code * template @@ -145,8 +145,8 @@ inline int max3(T a, T b, T c) * \endcode * * This functionality is implemented using template specialization. Currently specializations - * for int, float, and unsigned int vectors of lengths 2-4 are defined. Note that this results - * in types being generated at compile time -- there is no runtime cost. typeToVector is used by + * for int, float, and unsigned int vectors of lengths 2-4 are defined. Note that this results + * in types being generated at compile time -- there is no runtime cost. typeToVector is used by * the optimized scan \c __device__ functions in scan_cta.cu. */ template @@ -202,15 +202,15 @@ struct typeToVector }; /** @brief Templatized operator class used by scan and segmented scan - * - * This Operator class is used to allow generic support of binary - * associative operators in scan. It defines two member functions, - * op() and identity(), that are used in place of + and 0 (for - * example) in the scan and segmented scan code. Because this is - * template code, all decisions in the code are made at compile - * time, resulting in optimal operator code. Currently the operators - * CUDPP_ADD, CUDPP_MULTIPLY, CUDPP_MIN, and CUDPP_MAX are supported. - * Operator is implemented using template specialization for the + * + * This Operator class is used to allow generic support of binary + * associative operators in scan. It defines two member functions, + * op() and identity(), that are used in place of + and 0 (for + * example) in the scan and segmented scan code. Because this is + * template code, all decisions in the code are made at compile + * time, resulting in optimal operator code. Currently the operators + * CUDPP_ADD, CUDPP_MULTIPLY, CUDPP_MIN, and CUDPP_MAX are supported. + * Operator is implemented using template specialization for the * types \c int, \c unsigned int, and \c float. */ template @@ -226,15 +226,15 @@ public: { switch (oper) { - case CUDPP_ADD: + case CUDPP_ADD: return a + b; case CUDPP_MULTIPLY: return a * b; case CUDPP_MIN: return min(a, b); - case CUDPP_MAX: + case CUDPP_MAX: return max(a, b); - } + } } /** Returns the identity element defined for type \a T */ @@ -251,15 +251,15 @@ public: switch (oper) { default: - case CUDPP_ADD: + case CUDPP_ADD: return a + b; case CUDPP_MULTIPLY: return a * b; case CUDPP_MIN: return min(a, b); - case CUDPP_MAX: + case CUDPP_MAX: return max(a, b); - } + } } static __device__ int identity() @@ -288,15 +288,15 @@ public: switch (oper) { default: - case CUDPP_ADD: + case CUDPP_ADD: return a + b; case CUDPP_MULTIPLY: return a * b; case CUDPP_MIN: return min(a, b); - case CUDPP_MAX: + case CUDPP_MAX: return max(a, b); - } + } } static __device__ unsigned int identity() @@ -326,15 +326,15 @@ public: switch (oper) { default: - case CUDPP_ADD: + case CUDPP_ADD: return a + b; case CUDPP_MULTIPLY: return a * b; case CUDPP_MIN: return min(a, b); - case CUDPP_MAX: + case CUDPP_MAX: return max(a, b); - } + } } static __device__ float identity() diff --git a/lib/gpu/cudpp_mini/sharedmem.h b/lib/gpu/cudpp_mini/sharedmem.h index 14721cfd30..82de5d6466 100644 --- a/lib/gpu/cudpp_mini/sharedmem.h +++ b/lib/gpu/cudpp_mini/sharedmem.h @@ -3,11 +3,11 @@ // ------------------------------------------------------------- // $Revision: 5289 $ // $Date: 2010-11-23 13:04:43 -0700 (Tue, 23 Nov 2010) $ -// ------------------------------------------------------------- -// This source code is distributed under the terms of license.txt +// ------------------------------------------------------------- +// This source code is distributed under the terms of license.txt // in the root directory of this source distribution. -// ------------------------------------------------------------- - +// ------------------------------------------------------------- + /** * @file * sharedmem.h @@ -15,18 +15,18 @@ * @brief Shared memory declaration struct for templatized types. * * Because dynamically sized shared memory arrays are declared "extern" in CUDA, - * we can't templatize their types directly. To get around this, we declare a - * simple wrapper struct that will declare the extern array with a different + * we can't templatize their types directly. To get around this, we declare a + * simple wrapper struct that will declare the extern array with a different * name depending on the type. This avoids linker errors about multiple * definitions. - * - * To use dynamically allocated shared memory in a templatized __global__ or + * + * To use dynamically allocated shared memory in a templatized __global__ or * __device__ function, just replace code like this: * *
  *  template
  *  __global__ void
- *  foo( T* d_out, T* d_in) 
+ *  foo( T* d_out, T* d_in)
  *  {
  *      // Shared mem size is determined by the host app at run time
  *      extern __shared__  T sdata[];
@@ -35,12 +35,12 @@
  *      ...
  *  }
  * 
- * + * * With this *
  *  template
  *  __global__ void
- *  foo( T* d_out, T* d_in) 
+ *  foo( T* d_out, T* d_in)
  *  {
  *      // Shared mem size is determined by the host app at run time
  *      SharedMemory smem;
@@ -57,13 +57,13 @@
 
 
 /** @brief Wrapper class for templatized dynamic shared memory arrays.
-  * 
+  *
   * This struct uses template specialization on the type \a T to declare
   * a differently named dynamic shared memory array for each type
   * (\code extern __shared__ T s_type[] \endcode).
-  * 
+  *
   * Currently there are specializations for the following types:
-  * \c int, \c uint, \c char, \c uchar, \c short, \c ushort, \c long, 
+  * \c int, \c uint, \c char, \c uchar, \c short, \c ushort, \c long,
   * \c unsigned long, \c bool, \c float, and \c double. One can also specialize it
   * for user defined types.
   */
@@ -71,8 +71,8 @@ template 
 struct SharedMemory
 {
     /** Return a pointer to the runtime-sized shared memory array. **/
-    __device__ T* getPointer() 
-    { 
+    __device__ T* getPointer()
+    {
         extern __device__ void Error_UnsupportedType(); // Ensure that we won't compile any un-specialized types
         Error_UnsupportedType();
         return (T*)0;
@@ -87,73 +87,73 @@ struct SharedMemory
 template <>
 struct SharedMemory 
 {
-    __device__ int* getPointer() { extern __shared__ int s_int[]; return s_int; }      
+    __device__ int* getPointer() { extern __shared__ int s_int[]; return s_int; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ unsigned int* getPointer() { extern __shared__ unsigned int s_uint[]; return s_uint; }    
+    __device__ unsigned int* getPointer() { extern __shared__ unsigned int s_uint[]; return s_uint; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ char* getPointer() { extern __shared__ char s_char[]; return s_char; }    
+    __device__ char* getPointer() { extern __shared__ char s_char[]; return s_char; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ unsigned char* getPointer() { extern __shared__ unsigned char s_uchar[]; return s_uchar; }    
+    __device__ unsigned char* getPointer() { extern __shared__ unsigned char s_uchar[]; return s_uchar; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ short* getPointer() { extern __shared__ short s_short[]; return s_short; }    
+    __device__ short* getPointer() { extern __shared__ short s_short[]; return s_short; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ unsigned short* getPointer() { extern __shared__ unsigned short s_ushort[]; return s_ushort; }    
+    __device__ unsigned short* getPointer() { extern __shared__ unsigned short s_ushort[]; return s_ushort; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ long* getPointer() { extern __shared__ long s_long[]; return s_long; }    
+    __device__ long* getPointer() { extern __shared__ long s_long[]; return s_long; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ unsigned long* getPointer() { extern __shared__ unsigned long s_ulong[]; return s_ulong; }    
+    __device__ unsigned long* getPointer() { extern __shared__ unsigned long s_ulong[]; return s_ulong; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ bool* getPointer() { extern __shared__ bool s_bool[]; return s_bool; }    
+    __device__ bool* getPointer() { extern __shared__ bool s_bool[]; return s_bool; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ float* getPointer() { extern __shared__ float s_float[]; return s_float; }    
+    __device__ float* getPointer() { extern __shared__ float s_float[]; return s_float; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ double* getPointer() { extern __shared__ double s_double[]; return s_double; }    
+    __device__ double* getPointer() { extern __shared__ double s_double[]; return s_double; }
 };
 
 template <>
 struct SharedMemory 
 {
-    __device__ uchar4* getPointer() { extern __shared__ uchar4 s_uchar4[]; return s_uchar4; }    
+    __device__ uchar4* getPointer() { extern __shared__ uchar4 s_uchar4[]; return s_uchar4; }
 };
 
 
diff --git a/lib/gpu/geryon/README b/lib/gpu/geryon/README
index 018e9cff7f..df236bad85 100644
--- a/lib/gpu/geryon/README
+++ b/lib/gpu/geryon/README
@@ -6,7 +6,7 @@ Geryon
 
    Copyright (2010) 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 
+   certain rights in this software.  This software is distributed under
    the Simplified BSD License.
 
 Geryon is intended to be a simple library for managing the CUDA Runtime,
@@ -21,11 +21,11 @@ CUDA Driver, and OpenCL APIs with a consistent interface:
     * Simple routines for data I/O
     * Simple classes for managing device timing
     * Simple classes for managing kernel compilation and execution
-    
-Geryon does not require building (although a Makefile is provided for testing 
-purposes). The library is a set of header files that can be included with 
+
+Geryon does not require building (although a Makefile is provided for testing
+purposes). The library is a set of header files that can be included with
 your code.
 
-Documentation and examples are provided at 
+Documentation and examples are provided at
 
 http://users.nccs.gov/~wb8/geryon/index.htm
diff --git a/lib/gpu/geryon/file_to_cstr.sh b/lib/gpu/geryon/file_to_cstr.sh
index b0f6428b34..bd51603618 100755
--- a/lib/gpu/geryon/file_to_cstr.sh
+++ b/lib/gpu/geryon/file_to_cstr.sh
@@ -1,12 +1,12 @@
 #!/bin/sh
 
-# convert ptx assembly output into 
+# convert ptx assembly output into
 # a c-style string constant written
 # in portable posix shell script.
 # requires: sed, rm, mv
 #
 # Author: Axel Kohlmeyer, Temple University
- 
+
 num_args=$#
 
 # Check command-line arguments
@@ -26,14 +26,14 @@ string_name=$1
 eval output=\${$num_args}
 shift
 
-# remove temporary file in case we're interrupted. 
+# remove temporary file in case we're interrupted.
 cleanup () {
   rm -f $output
 }
 trap cleanup INT QUIT TERM
 
-# loop over arguments and convert to 
-# string constant. 
+# loop over arguments and convert to
+# string constant.
 i=2
 echo "const char * $string_name = " > $output
 while [ $i -lt $num_args ]
diff --git a/lib/gpu/geryon/hip_device.h b/lib/gpu/geryon/hip_device.h
index 11100cbea1..bcfd880712 100644
--- a/lib/gpu/geryon/hip_device.h
+++ b/lib/gpu/geryon/hip_device.h
@@ -233,13 +233,13 @@ class UCL_Device {
   /// Get the maximum number of threads per block in dimension 'dim'
   inline size_t group_size_dim(const int i, const int dim)
     { return _properties[i].maxThreadsDim[dim];}
-  
+
   /// Get the shared local memory size in bytes
   inline size_t slm_size() { return slm_size(_device); }
   /// Get the shared local memory size in bytes
   inline size_t slm_size(const int i)
     { return _properties[i].sharedMemPerBlock; }
- 
+
   /// Return the maximum memory pitch in bytes for current device
   inline size_t max_pitch() { return max_pitch(_device); }
   /// Return the maximum memory pitch in bytes
diff --git a/lib/gpu/geryon/hip_kernel.h b/lib/gpu/geryon/hip_kernel.h
index fbb08e12b1..d03f99d1cf 100644
--- a/lib/gpu/geryon/hip_kernel.h
+++ b/lib/gpu/geryon/hip_kernel.h
@@ -162,7 +162,7 @@ class UCL_Kernel {
     const auto aligned_size = (old_size+alignof(dtype)-1) & ~(alignof(dtype)-1);
     const auto arg_size = sizeof(dtype);
     _hip_kernel_args.resize(aligned_size + arg_size);
-    *((dtype*)(&_hip_kernel_args[aligned_size])) = *arg; 
+    *((dtype*)(&_hip_kernel_args[aligned_size])) = *arg;
     _num_args++;
     if (_num_args>UCL_MAX_KERNEL_ARGS) assert(0==1);
   }
@@ -195,7 +195,7 @@ class UCL_Kernel {
     _num_blocks[0]=num_blocks;
     _num_blocks[1]=1;
     _num_blocks[2]=1;
-    
+
     _block_size[0]=block_size;
     _block_size[1]=1;
     _block_size[2]=1;
diff --git a/lib/gpu/geryon/hip_texture.h b/lib/gpu/geryon/hip_texture.h
index 8738f6e2ea..3c2db98323 100644
--- a/lib/gpu/geryon/hip_texture.h
+++ b/lib/gpu/geryon/hip_texture.h
@@ -17,7 +17,7 @@ namespace ucl_hip {
 
 #ifdef __HIP_PLATFORM_NVCC__
 inline hipError_t hipModuleGetTexRef(CUtexref* texRef, hipModule_t hmod, const char* name){
-  return hipCUResultTohipError(cuModuleGetTexRef(texRef, hmod, name)); 
+  return hipCUResultTohipError(cuModuleGetTexRef(texRef, hmod, name));
 }
 inline hipError_t hipTexRefSetFormat(CUtexref tex, hipArray_Format fmt, int NumPackedComponents) {
     return hipCUResultTohipError(cuTexRefSetFormat(tex, (CUarray_format)fmt, NumPackedComponents ));
@@ -37,9 +37,9 @@ class UCL_Texture {
     { get_texture(prog,texture_name); }
   /// Set the texture reference for this object
   inline void get_texture(UCL_Program &prog, const char *texture_name)
-    { 
+    {
   #ifdef __HIP_PLATFORM_NVCC__
-      CU_SAFE_CALL(hipModuleGetTexRef(&_tex, prog._module, texture_name)); 
+      CU_SAFE_CALL(hipModuleGetTexRef(&_tex, prog._module, texture_name));
   #else
       size_t _global_var_size;
       CU_SAFE_CALL(hipModuleGetGlobal(&_device_ptr_to_global_var, &_global_var_size, prog._module, texture_name));
@@ -119,13 +119,13 @@ class UCL_Const {
   inline void get_global(UCL_Program &prog, const char *global_name) {
     _cq=prog.cq();
     CU_SAFE_CALL(hipModuleGetGlobal(&_global, &_global_bytes, prog._module,
-				    global_name)); 
+                                    global_name));
   }
   /// Copy from array on host to const memory
   template 
   inline void update_device(UCL_H_Vec &src, const int numel) {
     CU_SAFE_CALL(hipMemcpyHtoDAsync(_global, src.begin(), numel*sizeof(numtyp),
-				    _cq));
+                                    _cq));
   }
   /// Get device ptr associated with object
   inline const hipDeviceptr_t * begin() const { return &_global; }
diff --git a/lib/gpu/geryon/nvd_device.h b/lib/gpu/geryon/nvd_device.h
index 52b2ed478e..d5963fd39f 100644
--- a/lib/gpu/geryon/nvd_device.h
+++ b/lib/gpu/geryon/nvd_device.h
@@ -247,7 +247,7 @@ class UCL_Device {
   /// Get the maximum number of threads per block in dimension 'dim'
   inline size_t group_size_dim(const int i, const int dim)
     { return _properties[i].maxThreadsDim[dim]; }
-  
+
   /// Get the shared local memory size in bytes
   inline size_t slm_size() { return slm_size(_device); }
   /// Get the shared local memory size in bytes
diff --git a/lib/gpu/geryon/nvd_texture.h b/lib/gpu/geryon/nvd_texture.h
index 65f4ad9ef5..d7d65da903 100644
--- a/lib/gpu/geryon/nvd_texture.h
+++ b/lib/gpu/geryon/nvd_texture.h
@@ -113,13 +113,13 @@ class UCL_Const {
   inline void get_global(UCL_Program &prog, const char *global_name) {
     _cq=prog.cq();
     CU_SAFE_CALL(cuModuleGetGlobal(&_global, &_global_bytes, prog._module,
-				   global_name)); 
+                                   global_name));
   }
   /// Copy from array on host to const memory
   template 
   inline void update_device(UCL_H_Vec &src, const int numel) {
     CU_SAFE_CALL(cuMemcpyHtoDAsync(_global, src.begin(), numel*sizeof(numtyp),
-				   _cq));
+                                   _cq));
   }
   /// Get device ptr associated with object
   inline const CUdeviceptr * begin() const { return &_global; }
diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h
index a8e5020f00..1847b0463b 100644
--- a/lib/gpu/geryon/ocl_device.h
+++ b/lib/gpu/geryon/ocl_device.h
@@ -71,7 +71,7 @@ inline bool _shared_mem_device(cl_device_id &device) {
   #else
   cl_device_type device_type;
   CL_SAFE_CALL(clGetDeviceInfo(device,CL_DEVICE_TYPE,
-			       sizeof(device_type),&device_type,NULL));
+                               sizeof(device_type),&device_type,NULL));
   return (device_type==CL_DEVICE_TYPE_CPU);
   #endif
 }
@@ -221,7 +221,7 @@ class UCL_Device {
   /// Returns preferred vector width
   inline int preferred_fp64_width(const int i)
     {return _properties[i].preferred_vector_width64;}
-  
+
   /// Returns true if double precision is support for the current device
   inline bool double_precision() { return double_precision(_device); }
   /// Returns true if double precision is support for the device
@@ -356,12 +356,12 @@ class UCL_Device {
 
   /// Automatically set the platform by type, vendor, and/or CU count
   /** If first_device is positive, search restricted to platforms containing
-    * this device IDs. If ndevices is positive, search is restricted 
+    * this device IDs. If ndevices is positive, search is restricted
     * to platforms with at least that many devices  **/
   inline int auto_set_platform(const enum UCL_DEVICE_TYPE type=UCL_GPU,
-			       const std::string vendor="",
-			       const int ndevices=-1,
-			       const int first_device=-1);
+                               const std::string vendor="",
+                               const int ndevices=-1,
+                               const int first_device=-1);
 
  private:
   int _num_platforms;          // Number of platforms
@@ -467,9 +467,9 @@ int UCL_Device::set_platform(int pid) {
     #ifdef CL_VERSION_1_2
     cl_device_affinity_domain adomain;
     CL_SAFE_CALL(clGetDeviceInfo(device_list[i],
-				 CL_DEVICE_PARTITION_AFFINITY_DOMAIN,
-				 sizeof(cl_device_affinity_domain),
-				 &adomain,NULL));
+                                 CL_DEVICE_PARTITION_AFFINITY_DOMAIN,
+                                 sizeof(cl_device_affinity_domain),
+                                 &adomain,NULL));
 
     cl_device_partition_property props[3];
     props[0]=CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN;
@@ -477,11 +477,11 @@ int UCL_Device::set_platform(int pid) {
     props[2]=0;
     if (adomain & CL_DEVICE_AFFINITY_DOMAIN_NUMA)
       CL_SAFE_CALL(clCreateSubDevices(device_list[i], props, 0, NULL,
-				      &num_subdevices));
+                                      &num_subdevices));
     if (num_subdevices > 1) {
       subdevice_list = new cl_device_id[num_subdevices];
       CL_SAFE_CALL(clCreateSubDevices(device_list[i], props, num_subdevices,
-				      subdevice_list, &num_subdevices));
+                                      subdevice_list, &num_subdevices));
     }
     #endif
 
@@ -596,8 +596,8 @@ void UCL_Device::add_properties(cl_device_id device_list) {
 
   cl_device_partition_property pinfo[4];
   CL_SAFE_CALL(clGetDeviceInfo(device_list, CL_DEVICE_PARTITION_TYPE,
-			       4*sizeof(cl_device_partition_property),
-			       &pinfo, &return_bytes));
+                               4*sizeof(cl_device_partition_property),
+                               &pinfo, &return_bytes));
   if (return_bytes == 0) op.is_subdevice=false;
   else if (pinfo[0]) op.is_subdevice=true;
   else op.is_subdevice=false;
@@ -627,10 +627,10 @@ void UCL_Device::add_properties(cl_device_id device_list) {
 
   size_t ext_str_size_ret;
   CL_SAFE_CALL(clGetDeviceInfo(device_list, CL_DEVICE_EXTENSIONS, 0, nullptr,
-			       &ext_str_size_ret));
+                               &ext_str_size_ret));
   char buffer2[ext_str_size_ret];
   CL_SAFE_CALL(clGetDeviceInfo(device_list, CL_DEVICE_EXTENSIONS,
-			       ext_str_size_ret, buffer2, nullptr));
+                               ext_str_size_ret, buffer2, nullptr));
   #if defined(CL_VERSION_2_1) || defined(CL_VERSION_3_0)
   if (op.cl_device_version >= 210) {
     if ((std::string(buffer2).find("cl_khr_subgroups") != std::string::npos) ||
@@ -650,10 +650,10 @@ void UCL_Device::add_properties(cl_device_id device_list) {
     #endif
     cl_uint major, minor;
     CL_SAFE_CALL(clGetDeviceInfo(device_list,
-				 CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV,
+                                 CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV,
                                  sizeof(cl_uint), &major, nullptr));
     CL_SAFE_CALL(clGetDeviceInfo(device_list,
-				 CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV,
+                                 CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV,
                                  sizeof(cl_uint), &minor, nullptr));
     double arch = static_cast(minor)/10+major;
     if (arch >= 3.0)
@@ -730,12 +730,12 @@ void UCL_Device::print_all(std::ostream &out) {
           << device_type_name(i).c_str() << std::endl;
       out << "  Supported OpenCL Version:                      "
           << _properties[i].cl_device_version / 100 << "."
-	  << _properties[i].cl_device_version % 100 << std::endl;
+          << _properties[i].cl_device_version % 100 << std::endl;
       out << "  Is a subdevice:                                ";
       if (is_subdevice(i))
-	out << "Yes\n";
+        out << "Yes\n";
       else
-	out << "No\n";
+        out << "No\n";
       out << "  Double precision support:                      ";
       if (double_precision(i))
         out << "Yes\n";
@@ -814,9 +814,9 @@ void UCL_Device::print_all(std::ostream &out) {
 }
 
 int UCL_Device::auto_set_platform(const enum UCL_DEVICE_TYPE type,
-				  const std::string vendor,
-				  const int ndevices,
-				  const int first_device) {
+                                  const std::string vendor,
+                                  const int ndevices,
+                                  const int first_device) {
   if (_num_platforms < 2) return set_platform(0);
 
   int last_device = -1;
@@ -826,7 +826,7 @@ int UCL_Device::auto_set_platform(const enum UCL_DEVICE_TYPE type,
     else
       last_device = first_device;
   }
-  
+
   bool vendor_match=false;
   bool type_match=false;
   int max_cus=0;
@@ -852,39 +852,39 @@ int UCL_Device::auto_set_platform(const enum UCL_DEVICE_TYPE type,
     if (vendor_upper!="") {
       std::string pname = platform_name();
       for (int i=0; i='a')
-	  pname[i]=toupper(pname[i]);
+        if (pname[i]<='z' && pname[i]>='a')
+          pname[i]=toupper(pname[i]);
 
       if (pname.find(vendor_upper)!=std::string::npos) {
-	if (vendor_match == false) {
-	  best_platform=n;
-	  max_cus=0;
-	  vendor_match=true;
-	}
+        if (vendor_match == false) {
+          best_platform=n;
+          max_cus=0;
+          vendor_match=true;
+        }
       } else if (vendor_match)
-	continue;
+        continue;
     }
 
     if (type != UCL_DEFAULT) {
       bool ptype_matched=false;
       for (int d=first_id; d<=last_id; d++) {
-	if (type==device_type(d)) {
-	  if (type_match == false) {
-	    best_platform=n;
-	    max_cus=0;
-	    type_match=true;
-	    ptype_matched=true;
-	  }
-	}
+        if (type==device_type(d)) {
+          if (type_match == false) {
+            best_platform=n;
+            max_cus=0;
+            type_match=true;
+            ptype_matched=true;
+          }
+        }
       }
       if (type_match==true && ptype_matched==false)
-	continue;
+        continue;
     }
 
     for (int d=first_id; d<=last_id; d++) {
       if (cus(d) > max_cus) {
-	best_platform=n;
-	max_cus=cus(d);
+        best_platform=n;
+        max_cus=cus(d);
       }
     }
   }
diff --git a/lib/gpu/geryon/ocl_kernel.h b/lib/gpu/geryon/ocl_kernel.h
index 23f9baa09e..14a319f391 100644
--- a/lib/gpu/geryon/ocl_kernel.h
+++ b/lib/gpu/geryon/ocl_kernel.h
@@ -113,31 +113,31 @@ class UCL_Program {
     {
       size_t ms;
       CL_SAFE_CALL(clGetProgramBuildInfo(_program,_device,CL_PROGRAM_BUILD_LOG,
-					 0,NULL,&ms));
+                                         0,NULL,&ms));
       char *build_log = new char[ms];
       CL_SAFE_CALL(clGetProgramBuildInfo(_program,_device,CL_PROGRAM_BUILD_LOG,
-					 ms,build_log, NULL));
+                                         ms,build_log, NULL));
       std::cout << std::endl << std::endl
-		<< "--------------------------------------------------------\n"
-		<< "   UCL PROGRAM DUMP\n"
-		<< "--------------------------------------------------------\n"
-		<< flags << std::endl
-		<< "--------------------------------------------------------\n"
-		<< prog << std::endl
-		<< "--------------------------------------------------------\n"
-		<< build_log
-		<< "--------------------------------------------------------\n"
-		<< std::endl << std::endl;
+                << "--------------------------------------------------------\n"
+                << "   UCL PROGRAM DUMP\n"
+                << "--------------------------------------------------------\n"
+                << flags << std::endl
+                << "--------------------------------------------------------\n"
+                << prog << std::endl
+                << "--------------------------------------------------------\n"
+                << build_log
+                << "--------------------------------------------------------\n"
+                << std::endl << std::endl;
     }
     #endif
-    
+
     if (build_status != CL_SUCCESS || log!=NULL) {
       size_t ms;
       CL_SAFE_CALL(clGetProgramBuildInfo(_program,_device,CL_PROGRAM_BUILD_LOG,
-					 0,NULL,&ms));
+                                         0,NULL,&ms));
       char *build_log = new char[ms];
       CL_SAFE_CALL(clGetProgramBuildInfo(_program,_device,CL_PROGRAM_BUILD_LOG,
-					 ms,build_log, NULL));
+                                         ms,build_log, NULL));
 
       if (log!=nullptr)
         *log=std::string(build_log);
@@ -150,25 +150,25 @@ class UCL_Program {
           << build_status << ") ...\n"
           << "----------------------------------------------------------\n";
         std::cerr << build_log << std::endl;
-	std::cerr <<
-	  "----------------------------------------------------------\n"
-	  << std::endl << std::endl;
+        std::cerr <<
+          "----------------------------------------------------------\n"
+          << std::endl << std::endl;
         #endif
-	if (foutput != NULL) {
-	  fprintf(foutput,"\n\n");
-	  fprintf(foutput,
-	    "----------------------------------------------------------\n");
-	  fprintf(foutput,
-		  " UCL Error: Error compiling OpenCL Program (%d) ...\n",
-		  build_status);
-	  fprintf(foutput,
-	    "----------------------------------------------------------\n");
-	  fprintf(foutput,"%s\n",build_log);
-	  fprintf(foutput,
-	    "----------------------------------------------------------\n");
-	  fprintf(foutput,"\n\n");
-	}
-	delete[] build_log;
+        if (foutput != NULL) {
+          fprintf(foutput,"\n\n");
+          fprintf(foutput,
+            "----------------------------------------------------------\n");
+          fprintf(foutput,
+                  " UCL Error: Error compiling OpenCL Program (%d) ...\n",
+                  build_status);
+          fprintf(foutput,
+            "----------------------------------------------------------\n");
+          fprintf(foutput,"%s\n",build_log);
+          fprintf(foutput,
+            "----------------------------------------------------------\n");
+          fprintf(foutput,"\n\n");
+        }
+        delete[] build_log;
         return UCL_COMPILE_ERROR;
       } else delete[] build_log;
     }
diff --git a/lib/gpu/geryon/ucl_get_devices.cpp b/lib/gpu/geryon/ucl_get_devices.cpp
index 5654bb40bd..994554a252 100644
--- a/lib/gpu/geryon/ucl_get_devices.cpp
+++ b/lib/gpu/geryon/ucl_get_devices.cpp
@@ -17,7 +17,7 @@
 /* -----------------------------------------------------------------------
    Copyright (2009) 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 
+   certain rights in this software.  This software is distributed under
    the Simplified BSD License.
    ----------------------------------------------------------------------- */
 
diff --git a/lib/gpu/geryon/ucl_vector.h b/lib/gpu/geryon/ucl_vector.h
index c03fd31fce..0939bae31e 100644
--- a/lib/gpu/geryon/ucl_vector.h
+++ b/lib/gpu/geryon/ucl_vector.h
@@ -164,7 +164,7 @@ class UCL_Vector {
   inline void sync() { host.sync(); }
   /// Assert that any ops in associate command queue have been issued to device
   inline void flush() { ucl_flush(host.cq()); }
-  
+
   ///Get the size of a row on the host (including any padding) in elements
   inline size_t row_size() const { return host.row_size(); }
   /// Get the size of a row on the host(including any padding) in bytes
diff --git a/lib/gpu/lal_lj_smooth.cpp b/lib/gpu/lal_lj_smooth.cpp
index 42ffdabcf2..8391b46b2c 100644
--- a/lib/gpu/lal_lj_smooth.cpp
+++ b/lib/gpu/lal_lj_smooth.cpp
@@ -96,11 +96,11 @@ int LJSMOOTHT::init(const int ntypes,
   lj3.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY);
   this->atom->type_pack4(ntypes,lj_types,lj3,host_write,host_lj3,host_lj4,
                          host_offset);
-  
+
   ljsw.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY);
   this->atom->type_pack4(ntypes,lj_types,ljsw,host_write,host_ljsw1,host_ljsw2,
                          host_ljsw3,host_ljsw4);
-  
+
   ljsw0.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY);
   this->atom->type_pack2(ntypes,lj_types,ljsw0,host_write,host_ljsw0,cut_inner);
 
diff --git a/lib/gpu/lal_lj_smooth.h b/lib/gpu/lal_lj_smooth.h
index 1ab517ece6..b33d17ca3d 100644
--- a/lib/gpu/lal_lj_smooth.h
+++ b/lib/gpu/lal_lj_smooth.h
@@ -40,7 +40,7 @@ class LJSMOOTH : public BaseAtomic {
            const int nlocal, const int nall, const int max_nbors,
            const int maxspecial, const double cell_size,
            const double gpu_split, FILE *screen,
-           double **host_ljsw0, double **host_ljsw1, double **host_ljsw2, 
+           double **host_ljsw0, double **host_ljsw1, double **host_ljsw2,
            double **host_ljsw3, double **host_ljsw4,
            double **cut_inner, double **cut_inner_sq);
 
@@ -48,7 +48,7 @@ class LJSMOOTH : public BaseAtomic {
   void reinit(const int ntypes, double **host_cutsq,
               double **host_lj1, double **host_lj2, double **host_lj3,
               double **host_lj4, double **host_offset,
-              double **host_ljsw0, double **host_ljsw1, double **host_ljsw2, 
+              double **host_ljsw0, double **host_ljsw1, double **host_ljsw2,
               double **host_ljsw3, double **host_ljsw4,
               double **cut_inner, double **cut_inner_sq);
 
diff --git a/lib/h5md/README b/lib/h5md/README
index a6d4d8206b..dd19e98c31 100644
--- a/lib/h5md/README
+++ b/lib/h5md/README
@@ -26,7 +26,7 @@ To use the h5md dump style in lammps, execute
 make -f Makefile.h5cc
 in this directory then
 make yes-h5md
-in the src directory of LAMMPS to rebuild LAMMPS. 
+in the src directory of LAMMPS to rebuild LAMMPS.
 
 Note that you must have the h5cc compiler installed to use
 Makefile.h5cc.  It should be part
diff --git a/lib/latte/README b/lib/latte/README
index bdf67dd59c..efd37b9ff0 100644
--- a/lib/latte/README
+++ b/lib/latte/README
@@ -23,7 +23,7 @@ Instructions:
    or tarball, unpack the tarball either in this /lib/latte
    directory or somewhere else on your system.
 
-2. Modify the makefile.CHOICES according to your system architecture 
+2. Modify the makefile.CHOICES according to your system architecture
    and compilers.  Check that the MAKELIB flag is ON in makefile.CHOICES
    and finally, build the code via the make command
    % make
diff --git a/lib/mdi/.gitignore b/lib/mdi/.gitignore
index 7fcc712431..c9c23624e1 100644
--- a/lib/mdi/.gitignore
+++ b/lib/mdi/.gitignore
@@ -66,4 +66,4 @@ build/
 libmdi.a
 mdi.h
 includelink
-liblink
\ No newline at end of file
+liblink
diff --git a/lib/mesont/README b/lib/mesont/README
index 3ed47bf218..1884cdb7e9 100644
--- a/lib/mesont/README
+++ b/lib/mesont/README
@@ -1,67 +1,67 @@
-MESONT is a LAMMPS package for simulation of nanomechanics of carbon 
-nanotubes (CNTs). The model is based on a coarse-grained representation 
-of CNTs as "flexible cylinders" consisting of a variable number of 
-segments. Internal interactions within a CNT and the van der Waals 
-interaction between the tubes are described by a mesoscopic force 
-field designed and parameterized based on the results of atomic-level 
-molecular dynamics simulations. The description of the force field 
+MESONT is a LAMMPS package for simulation of nanomechanics of carbon
+nanotubes (CNTs). The model is based on a coarse-grained representation
+of CNTs as "flexible cylinders" consisting of a variable number of
+segments. Internal interactions within a CNT and the van der Waals
+interaction between the tubes are described by a mesoscopic force
+field designed and parameterized based on the results of atomic-level
+molecular dynamics simulations. The description of the force field
 is provided in the papers listed below.
 
-This folder contains a Fortran library implementing basic level functions 
-describing stretching, bending, and intertube components of the CNT tubular 
+This folder contains a Fortran library implementing basic level functions
+describing stretching, bending, and intertube components of the CNT tubular
 potential model (TPM) mesoscopic force field.
 
-This library was created by Alexey N. Volkov, University of Alabama, 
+This library was created by Alexey N. Volkov, University of Alabama,
 avolkov1@ua.edu.
 
 --
 
 References:
 
-L. V. Zhigilei, C. Wei, and D. Srivastava, Mesoscopic model for dynamic 
+L. V. Zhigilei, C. Wei, and D. Srivastava, Mesoscopic model for dynamic
 simulations of carbon nanotubes, Phys. Rev. B 71, 165417, 2005.
 
-A. N. Volkov and L. V. Zhigilei, Structural stability of carbon nanotube 
+A. N. Volkov and L. V. Zhigilei, Structural stability of carbon nanotube
 films: The role of bending buckling, ACS Nano 4, 6187-6195, 2010.
 
-A. N. Volkov, K. R. Simov, and L. V. Zhigilei, Mesoscopic model for simulation 
-of CNT-based materials, Proceedings of the ASME International Mechanical 
-Engineering Congress and Exposition (IMECE2008), ASME paper IMECE2008-68021, 
+A. N. Volkov, K. R. Simov, and L. V. Zhigilei, Mesoscopic model for simulation
+of CNT-based materials, Proceedings of the ASME International Mechanical
+Engineering Congress and Exposition (IMECE2008), ASME paper IMECE2008-68021,
 2008.
 
-A. N. Volkov and L. V. Zhigilei, Mesoscopic interaction potential for carbon 
-nanotubes of arbitrary length and orientation, J. Phys. Chem. C 114, 5513-5531, 
+A. N. Volkov and L. V. Zhigilei, Mesoscopic interaction potential for carbon
+nanotubes of arbitrary length and orientation, J. Phys. Chem. C 114, 5513-5531,
 2010.
 
-B. K. Wittmaack, A. H. Banna, A. N. Volkov, L. V. Zhigilei, Mesoscopic 
-modeling of structural self-organization of carbon nanotubes into vertically 
+B. K. Wittmaack, A. H. Banna, A. N. Volkov, L. V. Zhigilei, Mesoscopic
+modeling of structural self-organization of carbon nanotubes into vertically
 aligned networks of nanotube bundles, Carbon 130, 69-86, 2018.
 
-B. K. Wittmaack, A. N. Volkov, L. V. Zhigilei, Mesoscopic modeling of the 
-uniaxial compression and recovery of vertically aligned carbon nanotube 
+B. K. Wittmaack, A. N. Volkov, L. V. Zhigilei, Mesoscopic modeling of the
+uniaxial compression and recovery of vertically aligned carbon nanotube
 forests, Compos. Sci. Technol. 166, 66-85, 2018.
 
-B. K. Wittmaack, A. N. Volkov, L. V. Zhigilei, Phase transformation as the 
-mechanism of mechanical deformation of vertically aligned carbon nanotube 
+B. K. Wittmaack, A. N. Volkov, L. V. Zhigilei, Phase transformation as the
+mechanism of mechanical deformation of vertically aligned carbon nanotube
 arrays: Insights from mesoscopic modeling, Carbon 143, 587-597, 2019.
 
-A. N. Volkov and L. V. Zhigilei, Scaling laws and mesoscopic modeling of 
-thermal conductivity in carbon nanotube materials, Phys. Rev. Lett. 104, 
+A. N. Volkov and L. V. Zhigilei, Scaling laws and mesoscopic modeling of
+thermal conductivity in carbon nanotube materials, Phys. Rev. Lett. 104,
 215902, 2010.
 
-A. N. Volkov, T. Shiga, D. Nicholson, J. Shiomi, and L. V. Zhigilei, Effect 
-of bending buckling of carbon nanotubes on thermal conductivity of carbon 
+A. N. Volkov, T. Shiga, D. Nicholson, J. Shiomi, and L. V. Zhigilei, Effect
+of bending buckling of carbon nanotubes on thermal conductivity of carbon
 nanotube materials, J. Appl. Phys. 111, 053501, 2012.
 
-A. N. Volkov and L. V. Zhigilei, Heat conduction in carbon nanotube materials: 
-Strong effect of intrinsic thermal conductivity of carbon nanotubes, Appl. 
+A. N. Volkov and L. V. Zhigilei, Heat conduction in carbon nanotube materials:
+Strong effect of intrinsic thermal conductivity of carbon nanotubes, Appl.
 Phys. Lett. 101, 043113, 2012.
 
-W. M. Jacobs, D. A. Nicholson, H. Zemer, A. N. Volkov, and L. V. Zhigilei, 
-Acoustic energy dissipation and thermalization in carbon nanotubes: Atomistic 
+W. M. Jacobs, D. A. Nicholson, H. Zemer, A. N. Volkov, and L. V. Zhigilei,
+Acoustic energy dissipation and thermalization in carbon nanotubes: Atomistic
 modeling and mesoscopic description, Phys. Rev. B 86, 165414, 2012.
 
-A. N. Volkov and A. H. Banna, Mesoscopic computational model of covalent 
-cross-links and mechanisms of load transfer in cross-linked carbon nanotube 
+A. N. Volkov and A. H. Banna, Mesoscopic computational model of covalent
+cross-links and mechanisms of load transfer in cross-linked carbon nanotube
 films with continuous networks of bundles, Comp. Mater. Sci. 176, 109410, 2020.
 
diff --git a/lib/message/Install.py b/lib/message/Install.py
index 829d58b5f8..0aa433d6ec 100644
--- a/lib/message/Install.py
+++ b/lib/message/Install.py
@@ -21,7 +21,7 @@ HELP = """
 Syntax from src dir: make lib-message args="-m"
                  or: make lib-message args="-s -z"
 Syntax from lib dir: python Install.py -m
-                 or: python Install.py -s -z 
+                 or: python Install.py -s -z
 
 Example:
 
diff --git a/lib/message/cslib/src/cslib.cpp b/lib/message/cslib/src/cslib.cpp
index 0bc9648a09..7e19c83f6b 100644
--- a/lib/message/cslib/src/cslib.cpp
+++ b/lib/message/cslib/src/cslib.cpp
@@ -40,14 +40,14 @@ CSlib::CSlib(int csflag, const char *mode, const void *ptr, const void *pcomm)
   else myworld = 0;
 
 #ifdef MPI_NO
-  if (pcomm) 
+  if (pcomm)
     error_all("constructor(): CSlib invoked with MPI_Comm "
               "but built w/out MPI support");
 #endif
 #ifdef MPI_YES              // NOTE: this could be OK to allow ??
                             // would allow a parallel app to invoke CSlib
                             //   in parallel and/or in serial
-  if (!pcomm) 
+  if (!pcomm)
     error_all("constructor(): CSlib invoked w/out MPI_Comm "
               "but built with MPI support");
 #endif
@@ -63,7 +63,7 @@ CSlib::CSlib(int csflag, const char *mode, const void *ptr, const void *pcomm)
 
     if (strcmp(mode,"file") == 0) msg = new MsgFile(csflag,ptr);
     else if (strcmp(mode,"zmq") == 0) msg = new MsgZMQ(csflag,ptr);
-    else if (strcmp(mode,"mpi/one") == 0) 
+    else if (strcmp(mode,"mpi/one") == 0)
       error_all("constructor(): No mpi/one mode for serial lib usage");
     else if (strcmp(mode,"mpi/two") == 0)
       error_all("constructor(): No mpi/two mode for serial lib usage");
@@ -93,9 +93,9 @@ CSlib::CSlib(int csflag, const char *mode, const void *ptr, const void *pcomm)
   allids = nullptr;
   maxfieldbytes = 0;
   fielddata = nullptr;
-  
+
   pad = "\0\0\0\0\0\0\0";    // just length 7 since will have trailing nullptr
-  
+
   nsend = nrecv = 0;
 }
 
@@ -106,7 +106,7 @@ CSlib::~CSlib()
   deallocate_fields();
   sfree(header);
   sfree(buf);
-  
+
   sfree(recvcounts);
   sfree(displs);
   sfree(allids);
@@ -127,7 +127,7 @@ void CSlib::send(int msgID_caller, int nfield_caller)
 
   fieldcount = 0;
   nbuf = 0;
-  
+
   if (fieldcount == nfield) send_message();
 }
 
@@ -174,7 +174,7 @@ void CSlib::pack(int id, int ftype, int flen, void *data)
     error_all("pack(): Reuse of field ID");
   if (ftype < 1 || ftype > MAXTYPE) error_all("pack(): Invalid ftype");
   if (flen < 0) error_all("pack(): Invalid flen");
-    
+
   fieldID[fieldcount] = id;
   fieldtype[fieldcount] = ftype;
   fieldlen[fieldcount] = flen;
@@ -185,7 +185,7 @@ void CSlib::pack(int id, int ftype, int flen, void *data)
   memcpy(&buf[nbuf],data,nbytes);
   memcpy(&buf[nbuf+nbytes],pad,nbytesround-nbytes);
   nbuf += nbytesround;
-  
+
   fieldcount++;
   if (fieldcount == nfield) send_message();
 }
@@ -193,7 +193,7 @@ void CSlib::pack(int id, int ftype, int flen, void *data)
 /* ---------------------------------------------------------------------- */
 
 void CSlib::pack_parallel(int id, int ftype,
-			  int nlocal, int *ids, int nper, void *data)
+                          int nlocal, int *ids, int nper, void *data)
 {
   int i,j,k,m;
 
@@ -214,7 +214,7 @@ void CSlib::pack_parallel(int id, int ftype,
   fieldID[fieldcount] = id;
   fieldtype[fieldcount] = ftype;
   fieldlen[fieldcount] = flen;
-  
+
   // nlocal datums, each of nper length, from all procs
   // final data in buf = datums for all natoms, ordered by ids
 
@@ -238,7 +238,7 @@ void CSlib::pack_parallel(int id, int ftype,
 
   MPI_Allgatherv(ids,nlocal,MPI_INT,allids,
                  recvcounts,displs,MPI_INT,world);
-  
+
   int nlocalsize = nper*nlocal;
   MPI_Allgather(&nlocalsize,1,MPI_INT,recvcounts,1,MPI_INT,world);
 
@@ -254,22 +254,22 @@ void CSlib::pack_parallel(int id, int ftype,
     if (ids) {
       if (nbytes > maxfieldbytes) {
         sfree(fielddata);
-        maxfieldbytes = nbytes;   
+        maxfieldbytes = nbytes;
         fielddata = (char *) smalloc(maxfieldbytes);
       }
       alldata = (int *) fielddata;
     } else alldata = (int *) &buf[nbuf];
     MPI_Allgatherv(data,nlocalsize,MPI_INT,alldata,
-		   recvcounts,displs,MPI_INT,world);
+                   recvcounts,displs,MPI_INT,world);
     if (ids) {
       int *bufptr = (int *) &buf[nbuf];
       m = 0;
       for (i = 0; i < nglobal; i++) {
-	j = (allids[i]-1) * nper;
-	if (nper == 1) bufptr[j] = alldata[m++];
-	else
-	  for (k = 0; k < nper; k++)
-	    bufptr[j++] = alldata[m++];
+        j = (allids[i]-1) * nper;
+        if (nper == 1) bufptr[j] = alldata[m++];
+        else
+          for (k = 0; k < nper; k++)
+            bufptr[j++] = alldata[m++];
       }
     }
 
@@ -278,32 +278,32 @@ void CSlib::pack_parallel(int id, int ftype,
     if (ids) {
       if (nbytes > maxfieldbytes) {
         sfree(fielddata);
-        maxfieldbytes = nbytes;   
+        maxfieldbytes = nbytes;
         fielddata = (char *) smalloc(maxfieldbytes);
       }
       alldata = (int64_t *) fielddata;
     } else alldata = (int64_t *) &buf[nbuf];
     // NOTE: may be just MPI_LONG on some machines
     MPI_Allgatherv(data,nlocalsize,MPI_LONG_LONG,alldata,
-		   recvcounts,displs,MPI_LONG_LONG,world);
+                   recvcounts,displs,MPI_LONG_LONG,world);
     if (ids) {
       int64_t *bufptr = (int64_t *) &buf[nbuf];
       m = 0;
       for (i = 0; i < nglobal; i++) {
-	j = (allids[i]-1) * nper;
-	if (nper == 1) bufptr[j] = alldata[m++];
-	else
-	  for (k = 0; k < nper; k++)
-	    bufptr[j++] = alldata[m++];
+        j = (allids[i]-1) * nper;
+        if (nper == 1) bufptr[j] = alldata[m++];
+        else
+          for (k = 0; k < nper; k++)
+            bufptr[j++] = alldata[m++];
       }
     }
-    
+
   } else if (ftype == 3) {
     float *alldata;
     if (ids) {
       if (nbytes > maxfieldbytes) {
         sfree(fielddata);
-        maxfieldbytes = nbytes;   
+        maxfieldbytes = nbytes;
         fielddata = (char *) smalloc(maxfieldbytes);
       }
       alldata = (float *) fielddata;
@@ -314,11 +314,11 @@ void CSlib::pack_parallel(int id, int ftype,
       float *bufptr = (float *) &buf[nbuf];
       m = 0;
       for (i = 0; i < nglobal; i++) {
-	j = (allids[i]-1) * nper;
-	if (nper == 1) bufptr[j] = alldata[m++];
-	else
-	  for (k = 0; k < nper; k++)
-	    bufptr[j++] = alldata[m++];
+        j = (allids[i]-1) * nper;
+        if (nper == 1) bufptr[j] = alldata[m++];
+        else
+          for (k = 0; k < nper; k++)
+            bufptr[j++] = alldata[m++];
       }
     }
 
@@ -327,7 +327,7 @@ void CSlib::pack_parallel(int id, int ftype,
     if (ids) {
       if (nbytes > maxfieldbytes) {
         sfree(fielddata);
-        maxfieldbytes = nbytes;   
+        maxfieldbytes = nbytes;
         fielddata = (char *) smalloc(maxfieldbytes);
       }
       alldata = (double *) fielddata;
@@ -338,11 +338,11 @@ void CSlib::pack_parallel(int id, int ftype,
       double *bufptr = (double *) &buf[nbuf];
       m = 0;
       for (i = 0; i < nglobal; i++) {
-	j = (allids[i]-1) * nper;
-	if (nper == 1) bufptr[j] = alldata[m++];
-	else
-	  for (k = 0; k < nper; k++)
-	    bufptr[j++] = alldata[m++];
+        j = (allids[i]-1) * nper;
+        if (nper == 1) bufptr[j] = alldata[m++];
+        else
+          for (k = 0; k < nper; k++)
+            bufptr[j++] = alldata[m++];
       }
     }
 
@@ -352,7 +352,7 @@ void CSlib::pack_parallel(int id, int ftype,
     if (ids) {
       if (nbytes > maxfieldbytes) {
         sfree(fielddata);
-        maxfieldbytes = nbytes;   
+        maxfieldbytes = nbytes;
         fielddata = (char *) smalloc(maxfieldbytes);
       }
       alldata = (char *) fielddata;
@@ -363,9 +363,9 @@ void CSlib::pack_parallel(int id, int ftype,
       char *bufptr = (char *) &buf[nbuf];
       m = 0;
       for (i = 0; i < nglobal; i++) {
-	j = (allids[i]-1) * nper;
-	memcpy(&bufptr[j],&alldata[m],nper);
-	m += nper;
+        j = (allids[i]-1) * nper;
+        memcpy(&bufptr[j],&alldata[m],nper);
+        m += nper;
       }
     }
     */
@@ -399,14 +399,14 @@ void CSlib::send_message()
 
 /* ---------------------------------------------------------------------- */
 
-int CSlib::recv(int &nfield_caller, int *&fieldID_caller, 
-		int *&fieldtype_caller, int *&fieldlen_caller)
+int CSlib::recv(int &nfield_caller, int *&fieldID_caller,
+                int *&fieldtype_caller, int *&fieldlen_caller)
 {
   msg->recv(maxheader,header,maxbuf,buf);
   nrecv++;
 
   // unpack header message
-  
+
   int m = 0;
   msgID = header[m++];
   nfield = header[m++];
@@ -423,7 +423,7 @@ int CSlib::recv(int &nfield_caller, int *&fieldID_caller,
     onefield(fieldtype[ifield],fieldlen[ifield],nbytes,nbytesround);
     nbuf += nbytesround;
   }
-  
+
   // return message parameters
 
   nfield_caller = nfield;
@@ -513,7 +513,7 @@ void CSlib::unpack(int id, void *data)
 {
   int ifield = find_field(id,nfield);
   if (ifield < 0) error_all("unpack(): Unknown field ID");
-  
+
   int ftype = fieldtype[ifield];
   int nbytes = fieldlen[ifield];
   if (ftype == 1) nbytes *= sizeof(int);
@@ -541,7 +541,7 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     MPI_Scan(&nlocal,&upto,1,MPI_INT,MPI_SUM,world);
     upto -= nlocal;
   }
-  
+
   if (fieldtype[ifield] == 1) {
     int *local = (int *) data;
     int *global = (int *) &buf[fieldoffset[ifield]];
@@ -549,13 +549,13 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     else {
       m = 0;
       for (i = 0; i < nlocal; i++) {
-	j = (ids[i]-1) * nper;
-	if (nper == 1) local[m++] = global[j];
-	else
-	  for (k = 0; k < nper; k++)
-	    local[m++] = global[j++];
+        j = (ids[i]-1) * nper;
+        if (nper == 1) local[m++] = global[j];
+        else
+          for (k = 0; k < nper; k++)
+            local[m++] = global[j++];
       }
-    } 
+    }
 
   } else if (fieldtype[ifield] == 2) {
     int64_t *local = (int64_t *) data;
@@ -564,11 +564,11 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     else {
       m = 0;
       for (i = 0; i < nlocal; i++) {
-	j = (ids[i]-1) * nper;
-	if (nper == 1) local[m++] = global[j];
-	else
-	  for (k = 0; k < nper; k++)
-	    local[m++] = global[j++];
+        j = (ids[i]-1) * nper;
+        if (nper == 1) local[m++] = global[j];
+        else
+          for (k = 0; k < nper; k++)
+            local[m++] = global[j++];
       }
     }
 
@@ -579,14 +579,14 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     else {
       m = 0;
       for (i = 0; i < nlocal; i++) {
-	j = (ids[i]-1) * nper;
-	if (nper == 1) local[m++] = global[j];
-	else
-	  for (k = 0; k < nper; k++)
-	    local[m++] = global[j++];
+        j = (ids[i]-1) * nper;
+        if (nper == 1) local[m++] = global[j];
+        else
+          for (k = 0; k < nper; k++)
+            local[m++] = global[j++];
       }
     }
-    
+
   } else if (fieldtype[ifield] == 4) {
     double *local = (double *) data;
     double *global = (double *) &buf[fieldoffset[ifield]];
@@ -594,14 +594,14 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     else {
       m = 0;
       for (i = 0; i < nlocal; i++) {
-	j = (ids[i]-1) * nper;
-	if (nper == 1) local[m++] = global[j];
-	else
-	  for (k = 0; k < nper; k++)
-	    local[m++] = global[j++];
+        j = (ids[i]-1) * nper;
+        if (nper == 1) local[m++] = global[j];
+        else
+          for (k = 0; k < nper; k++)
+            local[m++] = global[j++];
       }
     }
-    
+
     /* eventually ftype = BYTE, but not yet
   } else if (fieldtype[ifield] == 5) {
     char *local = (char *) data;
@@ -610,9 +610,9 @@ void CSlib::unpack_parallel(int id, int nlocal, int *ids, int nper, void *data)
     else {
       m = 0;
       for (i = 0; i < nlocal; i++) {
-	j = (ids[i]-1) * nper;
-	memcpy(&local[m],&global[j],nper);
-	m += nper;
+        j = (ids[i]-1) * nper;
+        memcpy(&local[m],&global[j],nper);
+        m += nper;
       }
     }
     */
@@ -635,7 +635,7 @@ void CSlib::onefield(int ftype, int flen, int &nbytes, int &nbytesround)
 {
   int64_t bigbytes,bigbytesround;
   int64_t biglen = flen;
-  
+
   if (ftype == 1) bigbytes = biglen * sizeof(int);
   else if (ftype == 2) bigbytes = biglen * sizeof(int64_t);
   else if (ftype == 3) bigbytes = biglen * sizeof(float);
@@ -675,7 +675,7 @@ void CSlib::allocate_fields()
 
   nheader = 2;
   nheader += 3 * nfield;
-  
+
   if (nfield > maxfield) {
     deallocate_fields();
     maxfield = nfield;
@@ -684,7 +684,7 @@ void CSlib::allocate_fields()
     fieldlen = new int[maxfield];
     fieldoffset = new int[maxfield];
   }
-  
+
   if (nheader > maxheader) {
     sfree(header);
     maxheader = nheader;
@@ -724,7 +724,7 @@ void *CSlib::srealloc(void *ptr, int nbytes)
     sfree(ptr);
     return nullptr;
   }
-  
+
   ptr = realloc(ptr,nbytes);
   if (ptr == nullptr) {
     char str[128];
diff --git a/lib/message/cslib/src/cslib.h b/lib/message/cslib/src/cslib.h
index f2bf006881..ad7c853344 100644
--- a/lib/message/cslib/src/cslib.h
+++ b/lib/message/cslib/src/cslib.h
@@ -52,7 +52,7 @@ class CSlib {
   void unpack_parallel(int, int, int *, int, void *);
 
   int extract(int);
-  
+
  private:
   uint64_t myworld;    // really MPI_Comm, but avoids use of mpi.h in this file
                        // so apps can include this file w/ no MPI on system
diff --git a/lib/message/cslib/src/cslib.py b/lib/message/cslib/src/cslib.py
index 0ba3516255..673c524a3f 100644
--- a/lib/message/cslib/src/cslib.py
+++ b/lib/message/cslib/src/cslib.py
@@ -42,11 +42,11 @@ except:
 class CSlib:
 
   # instantiate CSlib thru its C-interface
-  
+
   def __init__(self,csflag,mode,ptr,comm):
 
     # load libcslib.so
-    
+
     try:
       if comm: self.lib = CDLL("libcsmpi.so",RTLD_GLOBAL)
       else: self.lib = CDLL("libcsnompi.so",RTLD_GLOBAL)
@@ -66,35 +66,35 @@ class CSlib:
 
     self.lib.cslib_send.argtypes = [c_void_p,c_int,c_int]
     self.lib.cslib_send.restype = None
-    
+
     self.lib.cslib_pack_int.argtypes = [c_void_p,c_int,c_int]
     self.lib.cslib_pack_int.restype = None
-    
+
     self.lib.cslib_pack_int64.argtypes = [c_void_p,c_int,c_longlong]
     self.lib.cslib_pack_int64.restype = None
-    
+
     self.lib.cslib_pack_float.argtypes = [c_void_p,c_int,c_float]
     self.lib.cslib_pack_float.restype = None
-    
+
     self.lib.cslib_pack_double.argtypes = [c_void_p,c_int,c_double]
     self.lib.cslib_pack_double.restype = None
-    
+
     self.lib.cslib_pack_string.argtypes = [c_void_p,c_int,c_char_p]
     self.lib.cslib_pack_string.restype = None
-    
+
     self.lib.cslib_pack.argtypes = [c_void_p,c_int,c_int,c_int,c_void_p]
     self.lib.cslib_pack.restype = None
-    
+
     self.lib.cslib_pack_parallel.argtypes = [c_void_p,c_int,c_int,c_int,
                                              POINTER(c_int),c_int,c_void_p]
     self.lib.cslib_pack_parallel.restype = None
-    
+
     self.lib.cslib_recv.argtypes = [c_void_p,POINTER(c_int),
                                     POINTER(POINTER(c_int)),
                                     POINTER(POINTER(c_int)),
                                     POINTER(POINTER(c_int))]
     self.lib.cslib_recv.restype = c_int
-    
+
     self.lib.cslib_unpack_int.argtypes = [c_void_p,c_int]
     self.lib.cslib_unpack_int.restype = c_int
 
@@ -128,7 +128,7 @@ class CSlib:
     # create an instance of CSlib with or w/out MPI communicator
 
     self.cs = c_void_p()
-    
+
     if not comm:
       self.lib.cslib_open(csflag,mode,ptr,None,byref(self.cs))
     elif not mpi4pyflag:
@@ -144,7 +144,7 @@ class CSlib:
       self.lib.cslib_open(csflag,mode,ptrcopy,comm_ptr,byref(self.cs))
 
   # destroy instance of CSlib
-  
+
   def __del__(self):
     if self.cs: self.lib.cslib_close(self.cs)
 
@@ -153,13 +153,13 @@ class CSlib:
     self.lib = None
 
   # send a message
-  
+
   def send(self,msgID,nfield):
     self.nfield = nfield
     self.lib.cslib_send(self.cs,msgID,nfield)
 
   # pack one field of message
-  
+
   def pack_int(self,id,value):
     self.lib.cslib_pack_int(self.cs,id,value)
 
@@ -185,24 +185,24 @@ class CSlib:
     self.lib.cslib_pack_parallel(self.cs,id,ftype,nlocal,cids,nper,cdata)
 
   # convert input data to a ctypes vector to pass to CSlib
-  
+
   def data_convert(self,ftype,flen,data):
-       
+
     # tflag = type of data
     # tflag = 1 if data is list or tuple
     # tflag = 2 if data is Numpy array
     # tflag = 3 if data is ctypes vector
     # same usage of tflag as in unpack function
-    
+
     txttype = str(type(data))
     if "numpy" in txttype: tflag = 2
     elif "c_" in txttype: tflag = 3
     else: tflag = 1
-    
+
     # create ctypes vector out of data to pass to lib
     # cdata = ctypes vector to return
     # NOTE: error check on ftype and tflag everywhere, also flen
-    
+
     if ftype == 1:
       if tflag == 1: cdata = (flen * c_int)(*data)
       elif tflag == 2: cdata = data.ctypes.data_as(POINTER(c_int))
@@ -223,7 +223,7 @@ class CSlib:
     return cdata
 
   # receive a message
-  
+
   def recv(self):
     self.lib.cslib_recv.restype = c_int
     nfield = c_int()
@@ -235,18 +235,18 @@ class CSlib:
 
     # copy returned C args to native Python int and lists
     # store them in class so unpack() methods can access the info
-    
+
     self.nfield = nfield = nfield.value
     self.fieldID = fieldID[:nfield]
     self.fieldtype = fieldtype[:nfield]
     self.fieldlen = fieldlen[:nfield]
-    
+
     return msgID,self.nfield,self.fieldID,self.fieldtype,self.fieldlen
 
   # unpack one field of message
   # tflag = type of data to return
   # 3 = ctypes vector is default, since no conversion required
-  
+
   def unpack_int(self,id):
     return self.lib.cslib_unpack_int(self.cs,id)
 
@@ -267,7 +267,7 @@ class CSlib:
 
     # reset data type of return so can morph by tflag
     # cannot do this for the generic c_void_p returned by CSlib
-    
+
     if self.fieldtype[index] == 1:
       self.lib.cslib_unpack.restype = POINTER(c_int)
     elif self.fieldtype[index] == 2:
@@ -287,7 +287,7 @@ class CSlib:
     # tflag = 3 to return data as ctypes vector
     # same usage of tflag as in pack functions
     # tflag = 2,3 should NOT perform a data copy
-    
+
     if tflag == 1:
       data = cdata[:self.fieldlen[index]]
     elif tflag == 2:
@@ -297,11 +297,11 @@ class CSlib:
       data = np.ctypeslib.as_array(cdata,shape=(self.fieldlen[index],))
     elif tflag == 3:
       data = cdata
-      
+
     return data
 
   # handle data array like pack() or unpack_parallel() ??
-  
+
   def unpack_data(self,id,tflag=3):
     index = self.fieldID.index(id)
 
@@ -312,14 +312,14 @@ class CSlib:
   #       as opposed to creating this cdata
   #       does that make any performance difference ?
   #       e.g. should we allow CSlib to populate an existing Numpy array's memory
-  
+
   def unpack_parallel(self,id,nlocal,ids,nper,tflag=3):
     cids = self.data_convert(1,nlocal,ids)
 
     # allocate memory for the returned data
     # pass cdata ptr to the memory to CSlib unpack_parallel()
     # this resets data type of last unpack_parallel() arg
-    
+
     index = self.fieldID.index(id)
     if self.fieldtype[index] == 1: cdata = (nper*nlocal * c_int)()
     elif self.fieldtype[index] == 2: cdata = (nlocal*nper * c_longlong)()
@@ -334,7 +334,7 @@ class CSlib:
     # tflag = 2 to return data as Numpy array
     # tflag = 3 to return data as ctypes vector
     # same usage of tflag as in pack functions
-    
+
     if tflag == 1:
       data = cdata[:nper*nlocal]
     elif tflag == 2:
@@ -353,10 +353,10 @@ class CSlib:
       data = np.ctypeslib.as_array(cdata,shape=(nlocal*nper,))
     elif tflag == 3:
       data = cdata
-      
+
     return data
 
   # extract a library value
-  
+
   def extract(self,flag):
    return self.lib.cslib_extract(self.cs,flag)
diff --git a/lib/message/cslib/src/cslib_wrap.cpp b/lib/message/cslib/src/cslib_wrap.cpp
index 44f5047037..08a768a3ac 100644
--- a/lib/message/cslib/src/cslib_wrap.cpp
+++ b/lib/message/cslib/src/cslib_wrap.cpp
@@ -31,7 +31,7 @@ using namespace CSLIB_NS;
 
 // ----------------------------------------------------------------------
 
-void cslib_open(int csflag, const char *mode, const void *ptr, 
+void cslib_open(int csflag, const char *mode, const void *ptr,
                 const void *pcomm, void **csptr)
 {
   CSlib *cs = new CSlib(csflag,mode,ptr,pcomm);
@@ -40,7 +40,7 @@ void cslib_open(int csflag, const char *mode, const void *ptr,
 
 // ----------------------------------------------------------------------
 
-void cslib_open_fortran(int csflag, const char *mode, const char *str, 
+void cslib_open_fortran(int csflag, const char *mode, const char *str,
                         const void *pcomm, void **csptr)
 {
   MPI_Comm ccomm;
@@ -48,7 +48,7 @@ void cslib_open_fortran(int csflag, const char *mode, const char *str,
 
   if (pcomm) {
     MPI_Fint *fcomm = (MPI_Fint *) pcomm;
-    ccomm = MPI_Comm_f2c(*fcomm); 
+    ccomm = MPI_Comm_f2c(*fcomm);
     pccomm = &ccomm;
   }
 
@@ -58,7 +58,7 @@ void cslib_open_fortran(int csflag, const char *mode, const char *str,
 
 // ----------------------------------------------------------------------
 
-void cslib_open_fortran_mpi_one(int csflag, const char *mode, 
+void cslib_open_fortran_mpi_one(int csflag, const char *mode,
                                 const void *pboth, const void *pcomm,
                                 void **csptr)
 {
@@ -66,11 +66,11 @@ void cslib_open_fortran_mpi_one(int csflag, const char *mode,
   void *pccomm,*pcboth;
 
   MPI_Fint *fcomm = (MPI_Fint *) pcomm;
-  ccomm = MPI_Comm_f2c(*fcomm); 
+  ccomm = MPI_Comm_f2c(*fcomm);
   pccomm = &ccomm;
 
   MPI_Fint *fboth = (MPI_Fint *) pboth;
-  cboth = MPI_Comm_f2c(*fboth); 
+  cboth = MPI_Comm_f2c(*fboth);
   pcboth = &cboth;
 
   CSlib *cs = new CSlib(csflag,mode,pcboth,pccomm);
@@ -152,8 +152,8 @@ void cslib_pack_parallel(void *ptr, int id, int ftype,
 
 // ----------------------------------------------------------------------
 
-int cslib_recv(void *ptr, int *nfield_caller, 
-	       int **fieldID_caller, int **fieldtype_caller, 
+int cslib_recv(void *ptr, int *nfield_caller,
+	       int **fieldID_caller, int **fieldtype_caller,
 	       int **fieldlen_caller)
 {
   CSlib *cs = (CSlib *) ptr;
@@ -227,7 +227,7 @@ void cslib_unpack_data(void *ptr, int id, void *data)
 
 // ----------------------------------------------------------------------
 
-void cslib_unpack_parallel(void *ptr, int id, int nlocal, int *ids, 
+void cslib_unpack_parallel(void *ptr, int id, int nlocal, int *ids,
 			   int nper, void *data)
 {
   CSlib *cs = (CSlib *) ptr;
diff --git a/lib/message/cslib/src/cslib_wrap.h b/lib/message/cslib/src/cslib_wrap.h
index bf7df029c3..a5a80c0fa3 100644
--- a/lib/message/cslib/src/cslib_wrap.h
+++ b/lib/message/cslib/src/cslib_wrap.h
@@ -22,7 +22,7 @@ extern "C" {
 
 void cslib_open(int, const char *, const void *, const void *, void **);
 void cslib_open_fortran(int, const char *, const char *, const void *, void **);
-void cslib_open_fortran_mpi_one(int, const char *, const void *, 
+void cslib_open_fortran_mpi_one(int, const char *, const void *,
                                 const void *, void **);
 void cslib_close(void *);
 
@@ -48,7 +48,7 @@ void cslib_unpack_data(void *, int, void *);
 void cslib_unpack_parallel(void *, int, int, int *, int, void *);
 
 int cslib_extract(void *, int);
-  
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/message/cslib/src/msg_file.cpp b/lib/message/cslib/src/msg_file.cpp
index 83423e7223..51c3db4c1e 100644
--- a/lib/message/cslib/src/msg_file.cpp
+++ b/lib/message/cslib/src/msg_file.cpp
@@ -32,7 +32,7 @@ using namespace CSLIB_NS;
 
 /* ---------------------------------------------------------------------- */
 
-MsgFile::MsgFile(int csflag, const void *ptr, MPI_Comm cworld) : 
+MsgFile::MsgFile(int csflag, const void *ptr, MPI_Comm cworld) :
   Msg(csflag, ptr, cworld)
 {
   char *filename = (char *) ptr;
@@ -68,14 +68,14 @@ void MsgFile::init(char *filename)
 void MsgFile::send(int nheader, int *header, int nbuf, char *buf)
 {
   char filename[MAXLINE];
-  
+
   lengths[0] = nheader;
   lengths[1] = nbuf;
-  
+
   if (me == 0) {
     if (client) sprintf(filename,"%s.%s",fileroot,"client");
     else if (server) sprintf(filename,"%s.%s",fileroot,"server");
-    
+
     fp = fopen(filename,"wb");
     if (!fp) error_one("send(): Could not open send message file");
     fwrite(lengths,sizeof(int),2,fp);
@@ -83,7 +83,7 @@ void MsgFile::send(int nheader, int *header, int nbuf, char *buf)
     fwrite(buf,1,nbuf,fp);
     fclose(fp);
   }
-  
+
   // create empty signal file
 
   if (me == 0) {
@@ -113,7 +113,7 @@ void MsgFile::recv(int &maxheader, int *&header, int &maxbuf, char *&buf)
       usleep(delay);
     }
     fclose(fp);
-  
+
     if (client) sprintf(filename,"%s.%s",fileroot,"server");
     else if (server) sprintf(filename,"%s.%s",fileroot,"client");
     fp = fopen(filename,"rb");
@@ -121,14 +121,14 @@ void MsgFile::recv(int &maxheader, int *&header, int &maxbuf, char *&buf)
   }
 
   // read and broadcast data
-  
+
   if (me == 0) fread(lengths,sizeof(int),2,fp);
   if (nprocs > 1) MPI_Bcast(lengths,2,MPI_INT,0,world);
 
   int nheader = lengths[0];
   int nbuf = lengths[1];
   allocate(nheader,maxheader,header,nbuf,maxbuf,buf);
-  
+
   if (me == 0) fread(header,sizeof(int),nheader,fp);
   if (nprocs > 1) MPI_Bcast(header,nheader,MPI_INT,0,world);
 
diff --git a/lib/message/cslib/src/msg_mpi_one.cpp b/lib/message/cslib/src/msg_mpi_one.cpp
index 1837c06ce7..3c9d6bab14 100644
--- a/lib/message/cslib/src/msg_mpi_one.cpp
+++ b/lib/message/cslib/src/msg_mpi_one.cpp
@@ -29,7 +29,7 @@ using namespace CSLIB_NS;
 
 /* ---------------------------------------------------------------------- */
 
-MsgMPIOne::MsgMPIOne(int csflag, const void *ptr, MPI_Comm cworld) : 
+MsgMPIOne::MsgMPIOne(int csflag, const void *ptr, MPI_Comm cworld) :
   Msg(csflag, ptr, cworld)
 {
   // NOTE: ideally would skip this call if mpi/two
diff --git a/lib/message/cslib/src/msg_mpi_two.cpp b/lib/message/cslib/src/msg_mpi_two.cpp
index fefdb42ec9..cd70cd9f66 100644
--- a/lib/message/cslib/src/msg_mpi_two.cpp
+++ b/lib/message/cslib/src/msg_mpi_two.cpp
@@ -29,7 +29,7 @@ using namespace CSLIB_NS;
 
 /* ---------------------------------------------------------------------- */
 
-MsgMPITwo::MsgMPITwo(int csflag, const void *ptr, MPI_Comm cworld) : 
+MsgMPITwo::MsgMPITwo(int csflag, const void *ptr, MPI_Comm cworld) :
   MsgMPIOne(csflag, ptr, cworld)
 {
   char *filename = (char *) ptr;
@@ -61,14 +61,14 @@ void MsgMPITwo::init(char *filename)
       //printf("Client port: %s\n",port);
       fclose(fp);
     }
-  
+
     MPI_Bcast(port,MPI_MAX_PORT_NAME,MPI_CHAR,0,world);
-    MPI_Comm_connect(port,MPI_INFO_NULL,0,world,&bothcomm); 
+    MPI_Comm_connect(port,MPI_INFO_NULL,0,world,&bothcomm);
     //if (me == 0) printf("CLIENT comm connect\n");
     if (me == 0) unlink(filename);
 
   } else if (server) {
-    MPI_Open_port(MPI_INFO_NULL,port); 
+    MPI_Open_port(MPI_INFO_NULL,port);
 
     if (me == 0) {
       //printf("Server name: %s\n",port);
@@ -76,8 +76,8 @@ void MsgMPITwo::init(char *filename)
       fprintf(fp,"%s",port);
       fclose(fp);
     }
-    
-    MPI_Comm_accept(port,MPI_INFO_NULL,0,world,&bothcomm); 
+
+    MPI_Comm_accept(port,MPI_INFO_NULL,0,world,&bothcomm);
     //if (me == 0) printf("SERVER comm accept\n");
   }
 
diff --git a/lib/message/cslib/src/msg_zmq.cpp b/lib/message/cslib/src/msg_zmq.cpp
index 5e57548b69..76875e5051 100644
--- a/lib/message/cslib/src/msg_zmq.cpp
+++ b/lib/message/cslib/src/msg_zmq.cpp
@@ -65,7 +65,7 @@ void MsgZMQ::init(char *port)
     char *socket_name = new char[n];
     strcpy(socket_name,"tcp://");
     strcat(socket_name,port);
-  
+
     if (client) {
       context = zmq_ctx_new();
       socket = zmq_socket(context,ZMQ_REQ);
diff --git a/lib/molfile/README b/lib/molfile/README
index 9960b5a836..ccdce2fc7f 100644
--- a/lib/molfile/README
+++ b/lib/molfile/README
@@ -10,7 +10,7 @@ NOTE: while the programming interface (API) of the VMD molfile plugins
 is backward compatible (i.e. you can expect to be able to compile this
 package for plugins from newer VMD packages), the binary interface
 (ABI) is not.  So it is necessary to compile this package with the
-VMD molfile plugin header files (vmdplugin.h and molfile_plugin.h) 
+VMD molfile plugin header files (vmdplugin.h and molfile_plugin.h)
 matching VMD installation that the (binary) plugin files are taken from.
 These header files can be found inside the VMD installation tree under
 "plugins/include". For convenience, this package includes a set of
diff --git a/lib/pace/Install.py b/lib/pace/Install.py
index 140d65c819..e90ae8c312 100644
--- a/lib/pace/Install.py
+++ b/lib/pace/Install.py
@@ -19,8 +19,8 @@ version = 'v.2021.4.9'
 
 # known checksums for different PACE versions. used to validate the download.
 checksums = { \
-        'v.2021.2.3.upd2' : '8fd1162724d349b930e474927197f20d', 
-        'v.2021.4.9'      : '4db54962fbd6adcf8c18d46e1798ceb5',          
+        'v.2021.2.3.upd2' : '8fd1162724d349b930e474927197f20d',
+        'v.2021.4.9'      : '4db54962fbd6adcf8c18d46e1798ceb5',
         }
 
 
@@ -33,8 +33,8 @@ parser = ArgumentParser(prog='Install.py',
 HELP = """
 Syntax from src dir: make lib-pace args="-b"
                  or: make lib-pace args="-b -v version"
-Syntax from lib dir: python Install.py -b 
-                 or: python Install.py -b -v version 
+Syntax from lib dir: python Install.py -b
+                 or: python Install.py -b -v version
 
 Examples:
 
diff --git a/lib/poems/README b/lib/poems/README
index e0ded85e46..1db3a66e89 100644
--- a/lib/poems/README
+++ b/lib/poems/README
@@ -27,7 +27,7 @@ Rudranarayan Mukherjee (mukher@rpi.edu) - include "[POEMS]" in the subject
 
 or by mail:
 Prof. Kurt S. Anderson
-4006 Jonsson Engineering Center 	
+4006 Jonsson Engineering Center
 Rensselaer Polytechnic Institute
 110 8th Street,
 Troy, NY 12180-3510, U.S.A.
@@ -53,8 +53,8 @@ make -f Makefile.g++
 When you are done building this library, two files should
 exist in this directory:
 
-libpoems.a		the library LAMMPS will link against
-Makefile.lammps		settings the LAMMPS Makefile will import
+libpoems.a              the library LAMMPS will link against
+Makefile.lammps         settings the LAMMPS Makefile will import
 
 Makefile.lammps is created by the make command, by copying one of the
 Makefile.lammps.* files.  See the EXTRAMAKE setting at the top of the
diff --git a/lib/poems/bodies.h b/lib/poems/bodies.h
index e47a4c80e5..8169cc0ae6 100644
--- a/lib/poems/bodies.h
+++ b/lib/poems/bodies.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: bodies.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/body.cpp b/lib/poems/body.cpp
index 4ef05dd1e6..1fc31243c8 100644
--- a/lib/poems/body.cpp
+++ b/lib/poems/body.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: body.cpp                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 #include "bodies.h"
 #include "point.h"
 
diff --git a/lib/poems/body.h b/lib/poems/body.h
index f8e0f6a5a3..b8c045094d 100644
--- a/lib/poems/body.h
+++ b/lib/poems/body.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: body.h                                                  *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 
 #ifndef BODY_H
 #define BODY_H
@@ -33,7 +33,7 @@ enum BodyType {
   PARTICLE = 1,
   RIGIDBODY = 2
 };
-  
+
 class Point;
 class Joint;
 class CompBody;
@@ -42,7 +42,7 @@ class Body : public POEMSObject {
 public:
   double mass;
   Mat3x3 inertia;
-  
+
   Vect3 r;
   Vect3 v;
   Vect3 v_k;
@@ -54,13 +54,13 @@ public:
   Vect3 alpha;
   Vect3 alpha_t;
   double KE;
-  
+
 
   List joints;
   List points;
 
   Body();
-  
+
   bool ReadIn(std::istream& in);
   void WriteOut(std::ostream& out);
   bool ReadInPoints(std::istream& in);
@@ -68,7 +68,7 @@ public:
   Point* GetPoint(int p);
   void AddJoint(Joint* joint);
   void AddPoint(Point* point);
-  
+
   virtual bool ReadInBodyData(std::istream& in) = 0;
   virtual void WriteOutBodyData(std::ostream& out) = 0;
   virtual ~Body();
diff --git a/lib/poems/body23joint.cpp b/lib/poems/body23joint.cpp
index 8cd0a95bca..2f024a9a58 100644
--- a/lib/poems/body23joint.cpp
+++ b/lib/poems/body23joint.cpp
@@ -2,8 +2,8 @@
  *_________________________________________________________________________*
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
- *      FILE NAME: body23joint.cpp			                                       *
- *      AUTHORS: See Author List                                           * 
+ *      FILE NAME: body23joint.cpp                                         *
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 
 #include "body23joint.h"
 #include "point.h"
@@ -45,15 +45,15 @@ void Body23Joint::WriteOutJointData(std::ostream& out){
 }
 
 Matrix Body23Joint::GetForward_sP(){
-	Vect3 temp = -(point2->position);  // This is vector from joint to CM
-	Matrix sP(6,2);
-	sP.Zeros();
-	
-	sP(2,1) =1.0;
-	sP(3,2) =1.0;	
-	sP(5,2) = temp(1);
-	sP(6,1) = -temp(1);	
-	return sP;    
+  Vect3 temp = -(point2->position);  // This is vector from joint to CM
+  Matrix sP(6,2);
+  sP.Zeros();
+
+  sP(2,1) =1.0;
+  sP(3,2) =1.0;
+  sP(5,2) = temp(1);
+  sP(6,1) = -temp(1);
+  return sP;
 }
 
 void Body23Joint::UpdateForward_sP( Matrix& sP){
@@ -62,132 +62,132 @@ void Body23Joint::UpdateForward_sP( Matrix& sP){
 }
 
 Matrix Body23Joint::GetBackward_sP(){
-	cout<<" -----------"<position);  // This is vector from CM to joint 
-	Matrix sP(6,2);
-	sP.Zeros();
-	sP(2,1) =1.0;
-	sP(3,2) =1.0;
-	
-	sP(5,2) = temp(1);
-	sP(6,1) = -temp(1);
-	
-	return sP;    
+  cout<<" -----------"<position);  // This is vector from CM to joint
+  Matrix sP(6,2);
+  sP.Zeros();
+  sP(2,1) =1.0;
+  sP(3,2) =1.0;
+
+  sP(5,2) = temp(1);
+  sP(6,1) = -temp(1);
+
+  return sP;
 }
 
-void Body23Joint::UpdateBackward_sP( Matrix& sP){  
+void Body23Joint::UpdateBackward_sP( Matrix& sP){
   // sP is constant, do nothing.
 }
 
 void Body23Joint::ComputeLocalTransform(){
-	Mat3x3 ko_C_k;
-	// Obtain the transformation matrix from euler parameters
-	EP_Transformation(q, ko_C_k);
-	FastMult(pk_C_ko,ko_C_k,pk_C_k);
-	}  
+  Mat3x3 ko_C_k;
+  // Obtain the transformation matrix from euler parameters
+  EP_Transformation(q, ko_C_k);
+  FastMult(pk_C_ko,ko_C_k,pk_C_k);
+  }
 
 
 void Body23Joint::ForwardKinematics(){
   Vect3 result1,result2,result3,result4,result5;
   Vect3 pk_w_k;
-  
-  
+
+
   //cout<<"Check in spherical "<position,result1); // parents basis      
-  FastAdd(result1,point1->position,r12);      
-  
-  // compute position vector r21 
-  FastNegMult(k_C_pk,r12,r21); 
+  ComputeForwardTransforms();
+
 
-  
   //----------------------------------//
-  // COMPUTE GLOBAL LOCATION  
-  FastMult(body1->n_C_k,(body1->GetPoint(2))->position,result1);    
-  FastAdd(result1,body1->r,result1);  
-  FastNegMult(body2->n_C_k,(body2->GetPoint(1))->position,result2);  
-  FastAdd(result1,result2,body2->r);  
-    
+  // COMPUTE POSITION VECTOR R12 aka GAMMA
+
+  FastNegMult(pk_C_k,point2->position,result1); // parents basis
+  FastAdd(result1,point1->position,r12);
+
+  // compute position vector r21
+  FastNegMult(k_C_pk,r12,r21);
+
+
+  //----------------------------------//
+  // COMPUTE GLOBAL LOCATION
+  FastMult(body1->n_C_k,(body1->GetPoint(2))->position,result1);
+  FastAdd(result1,body1->r,result1);
+  FastNegMult(body2->n_C_k,(body2->GetPoint(1))->position,result2);
+  FastAdd(result1,result2,body2->r);
+
   ColMatrix temp_u(3);
-  qdot_to_u(q, temp_u, qdot);  
-  
-  temp_u(1)=0.0; 
+  qdot_to_u(q, temp_u, qdot);
+
+  temp_u(1)=0.0;
   u(1) = temp_u(2);
   u(2) = temp_u(3);
-  
 
-  //-----------------------------------  
-  // angular velocities  
-  
+
+  //-----------------------------------
+  // angular velocities
+
   FastAssign(temp_u,pk_w_k);
-  FastTMult(pk_C_k,body1->omega_k,result1);        
+  FastTMult(pk_C_k,body1->omega_k,result1);
   FastAdd(result1,pk_w_k,body2->omega_k);
-  FastMult(body2->n_C_k,body2->omega_k,body2->omega);  // June 1 checked with Lammps       
-  //-----------------------------------  
-  
-  // compute velocities  
-  FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);  
+  FastMult(body2->n_C_k,body2->omega_k,body2->omega);  // June 1 checked with Lammps
+  //-----------------------------------
+
+  // compute velocities
+  FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);
   FastAdd(body1->v_k,result1,result2);
-  FastTMult(pk_C_k,result2,result1); // In body basis  
-  
-  FastCross((body2->GetPoint(1))->position,body2->omega_k,result2);                   
-  FastAdd(result1,result2,body2->v_k);    // In body basis   
-  FastMult(body2->n_C_k,body2->v_k,body2->v); 
-  
+  FastTMult(pk_C_k,result2,result1); // In body basis
+
+  FastCross((body2->GetPoint(1))->position,body2->omega_k,result2);
+  FastAdd(result1,result2,body2->v_k);    // In body basis
+  FastMult(body2->n_C_k,body2->v_k,body2->v);
+
   //------------------------------------------
-  //Compute the KE   
+  //Compute the KE
   Matrix tempke;
-  tempke = T(body2->v_k)*(body2->v_k);    
+  tempke = T(body2->v_k)*(body2->v_k);
   double ke = 0.0;
-  ke = body2->mass*tempke(1,1);    
+  ke = body2->mass*tempke(1,1);
   FastMult(body2->inertia,body2->omega_k,result1);
-  tempke= T(body2->omega_k)*result1;  
+  tempke= T(body2->omega_k)*result1;
   ke = 0.5*ke + 0.5*tempke(1,1);
   body2->KE=ke;
-  
-  //-----------------------------------  
-  // compute state explicit angular acceleration  // Has to be in body basis    
-  FastTMult(pk_C_k,body1->alpha_t,result2);  
+
+  //-----------------------------------
+  // compute state explicit angular acceleration  // Has to be in body basis
+  FastTMult(pk_C_k,body1->alpha_t,result2);
   FastCross(body2->omega_k,pk_w_k,result1);
-  FastAdd(result1,result2,body2->alpha_t); 
-   
-  //-----------------------------------  
-  // compute state explicit acceleration   
-  // NEED TO DO THIS COMPLETELY IN BODY BASIS 
-  
+  FastAdd(result1,result2,body2->alpha_t);
+
+  //-----------------------------------
+  // compute state explicit acceleration
+  // NEED TO DO THIS COMPLETELY IN BODY BASIS
+
   FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);
-  FastCross(body1->omega_k,result1,result2); 
-  FastTMult(pk_C_k,result2,result1); 
-  
-  //FastCross(body2->omega_k,-(body2->GetPoint(1))->position,result3);  
-  FastCross((body2->GetPoint(1))->position,body2->omega_k,result3);  
-  FastCross(body2->omega_k,result3,result2);    
-  FastAdd(result1,result2,result3); //wxwxr in body basis  
-  
-  FastCross(body1->alpha_t,(body1->GetPoint(2))->position,result4); 
-    
-  FastTMult(pk_C_k,result4,result5);  
+  FastCross(body1->omega_k,result1,result2);
+  FastTMult(pk_C_k,result2,result1);
+
+  //FastCross(body2->omega_k,-(body2->GetPoint(1))->position,result3);
+  FastCross((body2->GetPoint(1))->position,body2->omega_k,result3);
+  FastCross(body2->omega_k,result3,result2);
+  FastAdd(result1,result2,result3); //wxwxr in body basis
+
+  FastCross(body1->alpha_t,(body1->GetPoint(2))->position,result4);
+
+  FastTMult(pk_C_k,result4,result5);
   FastAssign(result5,result4);
-  
-  FastCross((body2->GetPoint(1))->position,body2->alpha_t,result2);   
-  FastAdd(result2,result4,result1); //alphaxr in body basis  
-  
+
+  FastCross((body2->GetPoint(1))->position,body2->alpha_t,result2);
+  FastAdd(result2,result4,result1); //alphaxr in body basis
+
   FastTMult(pk_C_k,body1->a_t,result2);
-  FastTripleSum(result3,result1,result2,body2->a_t);     // in body basis  
-  
-  
-  //-----------------------------------    
+  FastTripleSum(result3,result1,result2,body2->a_t);     // in body basis
+
+
+  //-----------------------------------
 }
 
 // NOTE: NOT USING BACKWARDKINEMATICS AT PRESENT
@@ -198,13 +198,13 @@ void Body23Joint::BackwardKinematics(){
 
   // orientations
   ComputeBackwardTransforms();
-  
+
 
   // compute position vector r21
   //r21 = point2->position - k_C_pk * point1->position;
   FastMult(k_C_pk,point1->position,result1);
   FastSubt(point2->position,result1,r21);
-  
+
 
   // compute position vector r21
   FastNegMult(pk_C_k,r21,r12);
@@ -223,7 +223,7 @@ void Body23Joint::BackwardKinematics(){
   EP_Derivatives(q,u,qdot);
 
   // angular velocities
- 
+
   FastMult(body2->n_C_k,u,result2);
   FastAdd(body2->omega,result2,body1->omega);
   FastAssign(u,k_w_pk);
@@ -243,7 +243,7 @@ void Body23Joint::BackwardKinematics(){
   FastCross(body1->omega_k,k_w_pk,result1);
   FastMult(pk_C_k,body2->alpha_t,result2);
   FastAdd(result1,result2,body1->alpha_t);
-  
+
   // compute state explicit acceleration
   FastCross(body2->alpha_t,point2->position,result1);
   FastCross(body2->omega_k,point2->position,result2);
@@ -256,5 +256,5 @@ void Body23Joint::BackwardKinematics(){
   FastCross(body1->omega_k,result2,result3);
 
   FastTripleSum(result5,result1,result3,body1->a_t);
-  
+
 }
diff --git a/lib/poems/colmatmap.cpp b/lib/poems/colmatmap.cpp
index 1954e7ff15..69ec4ec1b0 100644
--- a/lib/poems/colmatmap.cpp
+++ b/lib/poems/colmatmap.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: colmatmap.cpp                                           *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -23,28 +23,28 @@
 using namespace std;
 
 ColMatMap::ColMatMap(){
-	numrows = 0;
-	elements = 0;
+  numrows = 0;
+  elements = 0;
 }
 
 ColMatMap::~ColMatMap(){
-	delete [] elements;
+  delete [] elements;
 }
 
 ColMatMap::ColMatMap(const ColMatMap& A){  // copy constructor
-	numrows = 0;
-	elements = 0;
-	Dim(A.numrows);
-	for(int i=0;inumrows) || (i<1)){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
-	return *(elements[i-1]);
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
+  return *(elements[i-1]);
 }
 
 double ColMatMap::Get_1int(int i) const{
-	if((i>numrows) || (i<1)){
-		cerr << "matrix index exceeded in Get" << endl;
-		exit(1);
-	}
-	return *(elements[i-1]);
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index exceeded in Get" << endl;
+    exit(1);
+  }
+  return *(elements[i-1]);
 }
 
 void ColMatMap::Set_1int(int i, double value){
-	if((i>numrows) || (i<1)){
-		cerr << "matrix index exceeded in Set" << endl;
-		exit(1);
-	}
-	*(elements[i-1]) = value;
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index exceeded in Set" << endl;
+    exit(1);
+  }
+  *(elements[i-1]) = value;
 }
 
 double ColMatMap::BasicGet_1int(int i) const{
-	return *(elements[i]);
+  return *(elements[i]);
 }
 
 void ColMatMap::SetElementPointer(int i, double* p){
-	elements[i] = p;
+  elements[i] = p;
 }
 
 double* ColMatMap::GetElementPointer(int i){
-	return elements[i];
+  return elements[i];
 }
 
 void ColMatMap::BasicSet_1int(int i, double value){
-	*(elements[i]) = value;
+  *(elements[i]) = value;
 }
 
 void ColMatMap::BasicIncrement_1int(int i, double value){
-	*(elements[i]) += value;
+  *(elements[i]) += value;
 }
 
 void ColMatMap::AssignVM(const VirtualMatrix& A){
-	if(A.GetNumRows() != numrows){
-		cerr << "dimension mismatch in ColMatMap assignment" << endl;
-		exit(0);
-	}
-	if( A.GetNumCols() != 1 ){
-		cerr << "error trying to write a 2D matrix to a collumn" << endl;
-		exit(1);
-	}
-	for(int i=0;i> n;
-	Dim(n);
-	for(int i=0;i> elements[i];
-	return c;
+  int n;
+  c >> n;
+  Dim(n);
+  for(int i=0;i> elements[i];
+  return c;
 }
 
 ostream& ColMatrix::WriteData(ostream& c) const{  //output
-	c << numrows << ' ';
-	for(int i=0;inumrows) || (i<1)){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
-	return elements[i-1];
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
+  return elements[i-1];
 }
 
 double ColMatrix::Get_1int(int i) const{
-	if((i>numrows) || (i<1)){
-		cerr << "matrix index exceeded in Get" << endl;
-		exit(1);
-	}
-	return elements[i-1];
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index exceeded in Get" << endl;
+    exit(1);
+  }
+  return elements[i-1];
 }
 
 void ColMatrix::Set_1int(int i, double value){
-	if((i>numrows) || (i<1)){
-		cerr << "matrix index exceeded in Set" << endl;
-		exit(1);
-	}
-	elements[i-1] = value;
+  if((i>numrows) || (i<1)){
+    cerr << "matrix index exceeded in Set" << endl;
+    exit(1);
+  }
+  elements[i-1] = value;
 }
 
 double ColMatrix::BasicGet_1int(int i) const{
-	return elements[i];
+  return elements[i];
 }
 
 double* ColMatrix::GetElementPointer(int i){
-	return &(elements[i]);
+  return &(elements[i]);
 }
 
 void ColMatrix::BasicSet_1int(int i, double value){
-	elements[i] = value;
+  elements[i] = value;
 }
 
 void ColMatrix::BasicIncrement_1int(int i, double value){
-	elements[i] += value;
+  elements[i] += value;
 }
 
 void ColMatrix::AssignVM(const VirtualMatrix& A){
-	if( A.GetNumCols() != 1 ){
-		cerr << "error trying to write a 2D matrix to a collumn" << endl;
-		exit(1);
-	}
-	Dim( A.GetNumRows() );
-	for(int i=0;i value){
-			value = elements[i];
-			index = i;
-		}
+  value = elements[0];
+  index = 0;
+  for(int i=1;i value){
+      value = elements[i];
+      index = i;
+    }
 }
 
 void ColMatrix::BasicMin(double& value, int& index){
-	value = elements[0];
-	index = 0;
-	for(int i=1;i=0;i--){
-		temp=C.rows[i][k];
-		for (j=i+1;j=0;i--){
+    temp=C.rows[i][k];
+    for (j=i+1;j=0;i--){
-		temp=C.rows[i][k];
-		for (j=i+1;j=0;i--){
+    temp=C.rows[i][k];
+    for (j=i+1;j=0;i--){
-		temp=C.rows[i][k];
-		for (j=i+1;j=0;i--){
+    temp=C.rows[i][k];
+    for (j=i+1;j=0;i--){
-		temp=C.rows[i][k];
-		for (j=i+1;j=0;i--){
+    temp=C.rows[i][k];
+    for (j=i+1;j=0;i--){
-		temp=C_temp.rows[k][i];
-		for (j=i+1;j=0;i--){
+    temp=C_temp.rows[k][i];
+    for (j=i+1;j
-   
+
 
 FreeBodyJoint::FreeBodyJoint(){
-  DimQandU(7,6);  
+  DimQandU(7,6);
 }
 
 FreeBodyJoint::~FreeBodyJoint(){
@@ -45,112 +45,112 @@ void FreeBodyJoint::WriteOutJointData(std::ostream& out){
 }
 
 void FreeBodyJoint::ComputeLocalTransform(){
-  Mat3x3 ko_C_k;  
-  EP_Transformation(q, ko_C_k);   
-  FastMult(pk_C_ko,ko_C_k,pk_C_k);  
+  Mat3x3 ko_C_k;
+  EP_Transformation(q, ko_C_k);
+  FastMult(pk_C_ko,ko_C_k,pk_C_k);
 }
 
 Matrix FreeBodyJoint::GetForward_sP(){
   Mat6x6 sP;
-  //sP.Identity();      
-  
-  sP.Zeros();  
+  //sP.Identity();
+
+  sP.Zeros();
   Mat3x3 temp0=T(pk_C_k);
   for(int i=1;i<4;i++){
-	  sP(i,i)=1.0;
-	  for(int j=1;j<4;j++){
-		  sP(3+i,3+j)=temp0(i,j);
-		  }
-	  } 	  	  
-  return sP;    
+    sP(i,i)=1.0;
+    for(int j=1;j<4;j++){
+      sP(3+i,3+j)=temp0(i,j);
+      }
+    }
+  return sP;
 }
 
 Matrix FreeBodyJoint::GetBackward_sP(){
   Mat6x6 sP;
-  sP.Identity();        
+  sP.Identity();
   sP =-1.0*sP;
   cout<<"Did I come here in "<r);  
-    
-  //COMMENT STEP3: CALCULATE QDOT  
+
+  FastAssign(r12,body2->r);
+
+  //COMMENT STEP3: CALCULATE QDOT
   qdot_to_u(q, u, qdot);
-  
-  
+
+
   Vect3 WN;
   WN.BasicSet(0,u.BasicGet(0));
   WN.BasicSet(1,u.BasicGet(1));
   WN.BasicSet(2,u.BasicGet(2));
-    
-  Vect3 VN; 
+
+  Vect3 VN;
   VN.BasicSet(0,u.BasicGet(3));
   VN.BasicSet(1,u.BasicGet(4));
-  VN.BasicSet(2,u.BasicGet(5));  
-    
-  FastAssign(WN,body2->omega_k);  
- 
-  Vect3 pk_w_k;
-  FastMult(body2->n_C_k,WN,pk_w_k);      
-  FastAssign(pk_w_k,body2->omega);
-  
+  VN.BasicSet(2,u.BasicGet(5));
+
+  FastAssign(WN,body2->omega_k);
+
+  Vect3 pk_w_k;
+  FastMult(body2->n_C_k,WN,pk_w_k);
+  FastAssign(pk_w_k,body2->omega);
+
+
+
+  //COMMENT STEP5: CALCULATE VELOCITES
+  FastAssign(VN,body2->v);
+  FastTMult(body2->n_C_k,body2->v,body2->v_k);
+
+
+  //CALCULATE KE
 
-  
-  //COMMENT STEP5: CALCULATE VELOCITES        
-  FastAssign(VN,body2->v);    
-  FastTMult(body2->n_C_k,body2->v,body2->v_k);        
-  
-  
-  //CALCULATE KE          
- 
   Matrix tempke;
-  tempke = T(body2->v)*(body2->v);    
+  tempke = T(body2->v)*(body2->v);
   double ke = 0.0;
-  ke = body2->mass*tempke(1,1);  
+  ke = body2->mass*tempke(1,1);
   FastMult(body2->inertia,body2->omega_k,result1);
-  tempke= T(body2->omega_k)*result1;  
+  tempke= T(body2->omega_k)*result1;
   ke = 0.5*ke + 0.5*tempke(1,1);
   body2->KE=ke;
- 
-  
+
+
   //COMMENT STEP6: CALCULATE STATE EXPLICIT ANGULAR ACCELERATIONS
   body2->alpha_t.Zeros();
-    
-    
+
+
   //COMMENT STEP7: CALCULATE STATE EXPLICIT ACCELERATIONS
-  body2->a_t.Zeros();   
-  
+  body2->a_t.Zeros();
+
   }
 
 void FreeBodyJoint::BackwardKinematics(){
 cout<<"Did I come here "<>setprecision(20)>> qo >> setprecision(20)>>qdoto >> setprecision(20)>>pk_C_ko; 
+  in >>setprecision(20)>> qo >> setprecision(20)>>qdoto >> setprecision(20)>>pk_C_ko;
   q = qo;
   qdot = qdoto;
   EP_Normalize(q);
-  
+
   return ReadInJointData(in);
 }
 
 void Joint::ResetQdot(){
-  //EP_Derivatives(q,u,qdot);  
+  //EP_Derivatives(q,u,qdot);
   qdot_to_u(q,u,qdot);
 }
 
 void Joint::ResetQ(){
-  EP_Normalize(q); 
+  EP_Normalize(q);
 }
 
 void Joint::SetInitialState(ColMatrix& a, ColMatrix& adot){
   if( (qo.GetNumRows() != a.GetNumRows()) || (qdoto.GetNumRows() != adot.GetNumRows()) ){
-	  cout<n_C_k = body1->n_C_k * pk_C_k;
-  FastMult(body1->n_C_k,pk_C_k,body2->n_C_k);   
+  FastMult(body1->n_C_k,pk_C_k,body2->n_C_k);
   }
 
 void Joint::ComputeBackwardGlobalTransform(){
@@ -241,8 +241,8 @@ Joint* NewJoint(int type){
     case REVOLUTEJOINT : return new RevoluteJoint;
     case PRISMATICJOINT : return new PrismaticJoint;
     case SPHERICALJOINT : return new SphericalJoint;
-	 case BODY23JOINT : return new Body23Joint;
-	 case MIXEDJOINT : return new MixedJoint;
+   case BODY23JOINT : return new Body23Joint;
+   case MIXEDJOINT : return new MixedJoint;
     default : return 0; // error
   }
 }
diff --git a/lib/poems/joints.h b/lib/poems/joints.h
index 240a272bdd..0d8dc71626 100644
--- a/lib/poems/joints.h
+++ b/lib/poems/joints.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: joints.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/mat3x3.cpp b/lib/poems/mat3x3.cpp
index df24d4b108..f8dc8928bb 100644
--- a/lib/poems/mat3x3.cpp
+++ b/lib/poems/mat3x3.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat3x3.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -42,7 +42,7 @@ Mat3x3::Mat3x3(const VirtualMatrix& A){
     cerr << "illegal matrix size" << endl;
     exit(0);
   }
-  
+
   for(int i=0;i<3;i++)
     for(int j=0;j<3;j++)
       elements[i][j] = A.BasicGet(i,j);
diff --git a/lib/poems/mat3x3.h b/lib/poems/mat3x3.h
index 4362b3ad9c..b7c0e2dffa 100644
--- a/lib/poems/mat3x3.h
+++ b/lib/poems/mat3x3.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat3x3.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -68,16 +68,16 @@ public:
   friend void FastMult(Mat3x3& A, Mat3x3& B, Mat3x3& C);
   friend void FastMultT(Mat3x3& A, Mat3x3& B, Mat3x3& C);
   friend void FastAssignT(Mat3x3& A, Mat3x3& C);
-  friend void FastMult(Mat3x3& A, Vect3& B, ColMatrix& C);  
-  
+  friend void FastMult(Mat3x3& A, Vect3& B, ColMatrix& C);
+
   friend void OnPopulateSC(Vect3& gamma, Mat3x3& C, Mat6x6& SC);
   friend void OnPopulateSI(Mat3x3& inertia, double mass, Mat6x6& sI);
 
   friend void FastMult(Mat3x3& A, ColMatrix& B, Vect3& C);
-  
+
   friend void EP_Transformation(ColMatrix& q, Mat3x3& C);
   friend void EP_FromTransformation(ColMatrix& q, Mat3x3& C);
-  
+
 };
 
 #endif
diff --git a/lib/poems/mat4x4.cpp b/lib/poems/mat4x4.cpp
index 4a611a6796..086637282b 100644
--- a/lib/poems/mat4x4.cpp
+++ b/lib/poems/mat4x4.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat4x4.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -42,7 +42,7 @@ Mat4x4::Mat4x4(const VirtualMatrix& A){
     cerr << "illegal matrix size" << endl;
     exit(0);
   }
-  
+
   for(int i=0;i<4;i++)
     for(int j=0;j<4;j++)
       elements[i][j] = A.BasicGet(i,j);
diff --git a/lib/poems/mat4x4.h b/lib/poems/mat4x4.h
index d7942b248e..aac09a67af 100644
--- a/lib/poems/mat4x4.h
+++ b/lib/poems/mat4x4.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat4x4.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -26,12 +26,12 @@ class Vect4;
 
 class Mat4x4 : public VirtualMatrix  {
   double elements[4][4];
-public: 
+public:
   Mat4x4();
   ~Mat4x4();
   Mat4x4(const Mat4x4& A);  // copy constructor
   Mat4x4(const VirtualMatrix& A);  // copy constructor
-  
+
   double& operator_2int (int i, int j); // array access
   double Get_2int(int i, int j) const;
   void Set_2int(int i, int j, double value);
diff --git a/lib/poems/mat6x6.cpp b/lib/poems/mat6x6.cpp
index 16bffc5026..b79c0490fc 100644
--- a/lib/poems/mat6x6.cpp
+++ b/lib/poems/mat6x6.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat6x6.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/mat6x6.h b/lib/poems/mat6x6.h
index 11951b0442..35f0974657 100644
--- a/lib/poems/mat6x6.h
+++ b/lib/poems/mat6x6.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: mat6x6.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/matrices.h b/lib/poems/matrices.h
index 7a7e2c4b58..ff7dddd3e6 100644
--- a/lib/poems/matrices.h
+++ b/lib/poems/matrices.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: matrices.h                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/matrix.cpp b/lib/poems/matrix.cpp
index f05d6f815c..31c141bff7 100644
--- a/lib/poems/matrix.cpp
+++ b/lib/poems/matrix.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: matrix.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/matrix.h b/lib/poems/matrix.h
index 63699b9835..c34f8677cc 100644
--- a/lib/poems/matrix.h
+++ b/lib/poems/matrix.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: matrix.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -71,7 +71,7 @@ public:
   friend void FastMult(Mat6x6& A, Matrix& B, Matrix& C);
   friend void FastMult(Matrix& A, ColMatrix& B, Vect6& C);
   friend void FastMultT(Matrix& A, Matrix& B, Mat6x6& C);
-  
+
 };
 
 #endif
diff --git a/lib/poems/matrixfun.cpp b/lib/poems/matrixfun.cpp
index 9aa2818555..9c20d7cac9 100644
--- a/lib/poems/matrixfun.cpp
+++ b/lib/poems/matrixfun.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: matrixfun.cpp                                           *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -31,11 +31,11 @@ VirtualMatrix* NewMatrix(int type){
     {
       case MATRIX : return new Matrix;
       case COLMATRIX : return new ColMatrix;
-      case ROWMATRIX : return new RowMatrix;		
+      case ROWMATRIX : return new RowMatrix;
       case MAT3X3 : return new Mat3x3;
-		case MAT4X4 : return new Mat4x4;
+    case MAT4X4 : return new Mat4x4;
       case VECT3 : return new Vect3;
-		case VECT4 : return new Vect4;
+    case VECT4 : return new Vect4;
       default  : return 0; // error!
     }
 }
@@ -45,76 +45,76 @@ VirtualMatrix* NewMatrix(int type){
 //
 
 Matrix T(const VirtualMatrix& A){
-	int numrows = A.GetNumRows();
-	int numcols = A.GetNumCols();
-	Matrix C(numcols,numrows);
-	for(int i=0;i 1)
-		EP_Normalize(q);
+}
+
+void MixedJoint::ForwardKinematics(){
+  if(numrots > 1)
+    EP_Normalize(q);
 
   // COMMENT STEP1: CALCULATE ORIENTATIONS
-  ComputeForwardTransforms();  
-  
-    
+  ComputeForwardTransforms();
+
+
   //COMMENT STEP2: CALCULATE POSITION VECTORS
-  Vect3 result1, result2, result3, result4;   
+  Vect3 result1, result2, result3, result4;
   result1.Zeros();
   for (int k=0; k<3; k++){
-	  if( dofs(3+k) != 0.0 ){
-		  if (numrots > 1)
-			  result1.BasicSet(k,q.BasicGet(4 + k));
-		  else
-			  result1.BasicSet(k,q.BasicGet(numrots + k));
-	  }  
+    if( dofs(3+k) != 0.0 ){
+      if (numrots > 1)
+        result1.BasicSet(k,q.BasicGet(4 + k));
+      else
+        result1.BasicSet(k,q.BasicGet(numrots + k));
+    }
   }
-    
-  
-  
-  FastAssign(result1,r12);     // r12 in parents basis  i.e. Newtonian  
-  FastNegMult(k_C_pk,r12,r21);	    // r21 in body basis           
-  
-  FastAssign(r12,body2->r);  // This is right     
-    
-  //COMMENT STEP3: CALCULATE QDOT  
+
+
+
+  FastAssign(result1,r12);     // r12 in parents basis  i.e. Newtonian
+  FastNegMult(k_C_pk,r12,r21);      // r21 in body basis
+
+  FastAssign(r12,body2->r);  // This is right
+
+  //COMMENT STEP3: CALCULATE QDOT
   int pp = 0;
   if (numrots > 1){
-	  ColMatrix temp_u(3+numtrans);
-	  qdot_to_u(q,temp_u,qdot);
-	  for (int k=1;k<=6;k++){
-		  if(dofs(k) != 0.0){
-			  u.BasicSet(pp,temp_u.BasicGet(k-1));			  
-			  pp = pp+1;
-		  }		  
-	  }
+    ColMatrix temp_u(3+numtrans);
+    qdot_to_u(q,temp_u,qdot);
+    for (int k=1;k<=6;k++){
+      if(dofs(k) != 0.0){
+        u.BasicSet(pp,temp_u.BasicGet(k-1));
+        pp = pp+1;
+      }
+    }
   }
   else u = qdot;
 
-  
-  
+
+
   Vect3 WN; WN.Zeros();
   int p = 0;
   for (int k=0;k<3;k++){
-	  if(dofs(k+1) != 0.0){
-		  WN.BasicSet(k,u.BasicGet(p));
-		  p=p+1;
-	  }
+    if(dofs(k+1) != 0.0){
+      WN.BasicSet(k,u.BasicGet(p));
+      p=p+1;
+    }
   }// WN is in body basis
 
-  
-  Vect3 VN; VN.Zeros();  
-  for (int k=0;k<3;k++){
-	  if( dofs(3+k+1) != 0.0 ) {
-		  VN.BasicSet(k,u.BasicGet(p));
-		  p=p+1;
-	  }
-  }// VN is the vector of translational velocities in Newtonian basis
-    
-  FastAssign(WN,body2->omega_k);  
 
-  // cout<<"Angular Velocity "<omega_k);
+
+  // cout<<"Angular Velocity "<n_C_k,WN,pk_w_k);      
+  FastMult(body2->n_C_k,WN,pk_w_k);
   FastAssign(pk_w_k,body2->omega);
-  
-  
-  
-  //COMMENT STEP5: CALCULATE VELOCITES        
-  FastAssign(VN,body2->v);    
-  FastTMult(body2->n_C_k,body2->v,body2->v_k);        
-  
-  
-  //CALCULATE KE          
- 
+
+
+
+  //COMMENT STEP5: CALCULATE VELOCITES
+  FastAssign(VN,body2->v);
+  FastTMult(body2->n_C_k,body2->v,body2->v_k);
+
+
+  //CALCULATE KE
+
   Matrix tempke;
-  tempke = T(body2->v)*(body2->v);    
+  tempke = T(body2->v)*(body2->v);
   double ke = 0.0;
-  ke = body2->mass*tempke(1,1);    
+  ke = body2->mass*tempke(1,1);
   FastMult(body2->inertia,body2->omega_k,result1);
-  tempke= T(body2->omega_k)*result1;  
+  tempke= T(body2->omega_k)*result1;
   ke = 0.5*ke + 0.5*tempke(1,1);
   body2->KE=ke;
-  
-  
+
+
   //COMMENT STEP6: CALCULATE STATE EXPLICIT ANGULAR ACCELERATIONS
   body2->alpha_t.Zeros();
-      
-    
+
+
   //COMMENT STEP7: CALCULATE STATE EXPLICIT ACCELERATIONS
-  body2->a_t.Zeros();   
-  
+  body2->a_t.Zeros();
+
   }
 
 void MixedJoint::BackwardKinematics(){
 cout<<"Did I come here "<GetID() ) return 0;
   ID++;
-  system_body->SetID(ID);  
+  system_body->SetID(ID);
 
   // setup inertial frame
   SetupInertialFrame();
@@ -68,7 +68,7 @@ int OnBody::RecursiveSetup (InertialFrame* basebody){
     tempID = child->RecursiveSetup(ID,this,joint);
     if( tempID ){
       children.Append(child);
-      ID = tempID;      
+      ID = tempID;
     }
     else delete child;
 
@@ -80,14 +80,14 @@ int OnBody::RecursiveSetup (InertialFrame* basebody){
 
 int OnBody::RecursiveSetup(int ID, OnBody* parentbody, Joint* sys_joint){
   // initialize the topology and system analogs
-  parent = parentbody;  
+  parent = parentbody;
   system_joint = sys_joint;
   system_body = system_joint->OtherBody(parentbody->system_body);
-  
-    
+
+
   // record that the traversal algorithm has been here
   if( system_body->GetID() ) return 0;
-  ID++;  
+  ID++;
 
   // perform the local setup operations
   Setup();
@@ -114,7 +114,7 @@ int OnBody::RecursiveSetup(int ID, OnBody* parentbody, Joint* sys_joint){
     ele = ele->next;
   }
 
-  return ID;  
+  return ID;
 }
 
 void OnBody::SetupInertialFrame(){
@@ -123,26 +123,26 @@ void OnBody::SetupInertialFrame(){
     cerr << "ERROR: attempting to setup inertial frame for non-inertial body" << endl;
     exit(1);
   }
-  
+
   // setup gravity
-  Vect3 neg_gravity = -((InertialFrame*) system_body)->GetGravity();  
+  Vect3 neg_gravity = -((InertialFrame*) system_body)->GetGravity();
   sAhat.Zeros();
   Set6DLinearVector(sAhat,neg_gravity);
-  
+
 }
 
 
-void OnBody::Setup(){  
-  
+void OnBody::Setup(){
+
   // get the direction of the joint
   if( system_joint->GetBody2() == system_body ) joint_dir = FORWARD;
   else joint_dir = BACKWARD;
 
   // set the function pointers for the joint direction
-  if( joint_dir == FORWARD ){    
+  if( joint_dir == FORWARD ){
     kinfun = &Joint::ForwardKinematics;
     updatesP = &Joint::UpdateForward_sP;
-    gamma = system_joint->GetR12(); 
+    gamma = system_joint->GetR12();
     pk_C_k = system_joint->Get_pkCk();
   } else {
     kinfun = &Joint::BackwardKinematics;
@@ -155,7 +155,7 @@ void OnBody::Setup(){
 
   // sI
   OnPopulateSI(system_body->inertia, system_body->mass, sI);
-	
+
   // sP
   if( joint_dir == FORWARD )
     sP = system_joint->GetForward_sP();
@@ -167,12 +167,12 @@ void OnBody::Setup(){
   sMinv = sM;
   sPsMinv = sP;
   sIhatsP = sP;
-  
+
 
   // get the state and state derivative column matrix pointers
   q = system_joint->GetQ();
   u = system_joint->GetU();
-  qdot = system_joint->GetQdot();  
+  qdot = system_joint->GetQdot();
   udot = system_joint->GetUdot();
   qdotdot = system_joint->GetQdotdot();
   }
@@ -182,13 +182,13 @@ void OnBody::RecursiveKinematics(){
   // Perform local kinematics recursively outward
   ListElement* ele = children.GetHeadElement();
   while(ele){
-    child = ele->value;    
+    child = ele->value;
     child->LocalKinematics();
     child->RecursiveKinematics();
-    Mat3x3 result=*child->pk_C_k;           
+    Mat3x3 result=*child->pk_C_k;
     ele = ele->next;
   }
-  
+
 }
 
 void OnBody::RecursiveTriangularization(){
@@ -221,7 +221,7 @@ void OnBody::LocalKinematics(){
   // do the directional kinematics
   (system_joint->*kinfun)();
   (system_joint->*updatesP)( sP );
-  OnPopulateSC( *gamma, *pk_C_k, sSC );      
+  OnPopulateSC( *gamma, *pk_C_k, sSC );
 }
 
 Mat3x3 OnBody::GetN_C_K(){
@@ -229,171 +229,171 @@ Mat3x3 nck=system_body->n_C_k;
 return nck;
 }
 
- 
+
 int OnBody::GetBodyID(){
 int ID=system_body->GetID();
 return ID;
 }
 
-Vect3 OnBody::LocalCart(){  
-  (system_joint->*kinfun)();  
-  Vect3 RR=system_body->r;  
+Vect3 OnBody::LocalCart(){
+  (system_joint->*kinfun)();
+  Vect3 RR=system_body->r;
   return RR;
 }
 
-  
-  
-void OnBody::LocalTriangularization(Vect3& Torque, Vect3& Force){	  
 
-	Vect3 Iw,wIw,Ialpha,wIwIalpha,ma,Bforce,Bforce_ma,Btorque,Btorque_wIwIalpha;
+
+void OnBody::LocalTriangularization(Vect3& Torque, Vect3& Force){
+
+  Vect3 Iw,wIw,Ialpha,wIwIalpha,ma,Bforce,Bforce_ma,Btorque,Btorque_wIwIalpha;
   Iw.Zeros();wIw.Zeros();wIwIalpha.Zeros();ma.Zeros();
-	Bforce.Zeros();Bforce_ma.Zeros();Btorque.Zeros();Btorque_wIwIalpha.Zeros();
-     
-	FastMult(system_body->inertia,system_body->omega_k,Iw);  
-	FastCross(Iw,system_body->omega_k,wIw);  
-  
-	FastMult(system_body->inertia, system_body->alpha_t, Ialpha);    
-	FastSubt(wIw,Ialpha,wIwIalpha); 
-	FastMult(-system_body->mass,system_body->a_t,ma);    
-	
-	
-	Mat3x3 k_C_n=T(system_body->n_C_k);      
-	Bforce=k_C_n*Force;
-	Btorque=k_C_n*Torque;  
-	
-	FastAdd(Bforce,ma,Bforce_ma);       
-	FastAdd(Btorque,wIwIalpha,Btorque_wIwIalpha);	  
-	OnPopulateSVect(Btorque_wIwIalpha,Bforce_ma,sF);
-  
-  
-	sIhat = sI;    
-	sFhat = sF;     
-	Mat6x6 sPsMinvsPT;
-	Mat6x6 sIhatsPsMsPT;
-	Mat6x6 sUsIhatsPsMsPT;
-	Mat6x6 sTsIhat;
-	Mat6x6 sTsIhatsSCT;
-	Vect6 sTsFhat;
-	Mat6x6 sU;
-	sU.Identity();  
-  
-	OnBody* child;
-	ListElement* ele = children.GetHeadElement();
-  
-	while(ele){
-		child = ele->value;
-    
-		FastMultT(child->sIhatsP,child->sPsMinv,sIhatsPsMsPT); 
-		FastSubt(sU,sIhatsPsMsPT,sUsIhatsPsMsPT);              
-		FastMult(child->sSC,sUsIhatsPsMsPT,child->sT);         
-        
-		FastMult(child->sT,child->sIhat,sTsIhat);
-		FastMultT(sTsIhat,child->sSC,sTsIhatsSCT); 
-		FastAdd(sIhat,sTsIhatsSCT,sIhat);
-    
-		FastMult(child->sT,child->sFhat,sTsFhat);
-		FastAdd(sFhat,sTsFhat,sFhat);            
-		ele = ele->next;
-	}  
-  
-	FastMult(sIhat,sP,sIhatsP);   
-	FastTMult(sP,sIhatsP,sM);       
-	sMinv=SymInverse(sM);    
-	FastMult(sP,sMinv,sPsMinv);	
+  Bforce.Zeros();Bforce_ma.Zeros();Btorque.Zeros();Btorque_wIwIalpha.Zeros();
+
+  FastMult(system_body->inertia,system_body->omega_k,Iw);
+  FastCross(Iw,system_body->omega_k,wIw);
+
+  FastMult(system_body->inertia, system_body->alpha_t, Ialpha);
+  FastSubt(wIw,Ialpha,wIwIalpha);
+  FastMult(-system_body->mass,system_body->a_t,ma);
+
+
+  Mat3x3 k_C_n=T(system_body->n_C_k);
+  Bforce=k_C_n*Force;
+  Btorque=k_C_n*Torque;
+
+  FastAdd(Bforce,ma,Bforce_ma);
+  FastAdd(Btorque,wIwIalpha,Btorque_wIwIalpha);
+  OnPopulateSVect(Btorque_wIwIalpha,Bforce_ma,sF);
+
+
+  sIhat = sI;
+  sFhat = sF;
+  Mat6x6 sPsMinvsPT;
+  Mat6x6 sIhatsPsMsPT;
+  Mat6x6 sUsIhatsPsMsPT;
+  Mat6x6 sTsIhat;
+  Mat6x6 sTsIhatsSCT;
+  Vect6 sTsFhat;
+  Mat6x6 sU;
+  sU.Identity();
+
+  OnBody* child;
+  ListElement* ele = children.GetHeadElement();
+
+  while(ele){
+    child = ele->value;
+
+    FastMultT(child->sIhatsP,child->sPsMinv,sIhatsPsMsPT);
+    FastSubt(sU,sIhatsPsMsPT,sUsIhatsPsMsPT);
+    FastMult(child->sSC,sUsIhatsPsMsPT,child->sT);
+
+    FastMult(child->sT,child->sIhat,sTsIhat);
+    FastMultT(sTsIhat,child->sSC,sTsIhatsSCT);
+    FastAdd(sIhat,sTsIhatsSCT,sIhat);
+
+    FastMult(child->sT,child->sFhat,sTsFhat);
+    FastAdd(sFhat,sTsFhat,sFhat);
+    ele = ele->next;
+  }
+
+  FastMult(sIhat,sP,sIhatsP);
+  FastTMult(sP,sIhatsP,sM);
+  sMinv=SymInverse(sM);
+  FastMult(sP,sMinv,sPsMinv);
 }
 
-void OnBody::LocalForwardSubstitution(){  
-	Vect6 sSCTsAhat;
-	Vect6 sIhatsSCTsAhat;
-	Vect6 sFsIhatsSCTsAhat;
-	Vect6 sPudot;
-	int type = system_joint->GetType();
-	if(type == 1){
-		FastTMult(sSC,parent->sAhat,sSCTsAhat);
-		FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);       
-		FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
-		FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);		
-  
-		ColMatrix result1=*udot;      
-		ColMatrix result2=*qdot;
-		ColMatrix result3=*q;
-		int num=result1.GetNumRows();
-		ColMatrix result4(num+1);
-		result4.Zeros();		
-		EPdotdot_udot(result1, result2, result3, result4);
-		FastAssign(result4, *qdotdot);    
-		FastMult(sP,*udot,sPudot);      
-		FastAdd(sSCTsAhat,sPudot,sAhat);		
-	}
-	else if (type == 4){		
-		FastTMult(sSC,parent->sAhat,sSCTsAhat);
-		FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);       
-		FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
-		FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);
-		
-		ColMatrix result1=*udot;      		
-		ColMatrix result2=*qdot;
-		ColMatrix result3=*q;
-		int num=result1.GetNumRows();
-		ColMatrix result4(num+1);
-		result4.Zeros();
-		
-		EPdotdot_udot(result1, result2, result3, result4);
-		FastAssign(result4, *qdotdot);    
-		FastMult(sP,*udot,sPudot);      
-		FastAdd(sSCTsAhat,sPudot,sAhat);
-	}	
-	else if (type == 5){		
-		FastTMult(sSC,parent->sAhat,sSCTsAhat);
-		FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);       
-		FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
-		FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);				
-		ColMatrix temp_u = *udot;
-		
-		ColMatrix result1(3);		
-		result1(1)=0.0;
-		result1(2)=temp_u(1);      		
-		result1(3)=temp_u(2); 		
-		ColMatrix result2=*qdot;
-		ColMatrix result3=*q;
-		int num=result1.GetNumRows();
-		ColMatrix result4(num+1);
-		result4.Zeros();
-		
-		EPdotdot_udot(result1, result2, result3, result4);		
-		FastAssign(result4, *qdotdot);    
-		FastMult(sP,*udot,sPudot);      
-		FastAdd(sSCTsAhat,sPudot,sAhat);
-	}
-	else if (type == 6){		
-		FastTMult(sSC,parent->sAhat,sSCTsAhat);
-		FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);       
-		FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
-		FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);				
-		ColMatrix temp_u = *udot;
-		int tt = temp_u.GetNumRows() + 1;
-		ColMatrix result1(tt);				
-		result1(1)=0.0;
-		for (int k =2; k<=tt; k++){
-			result1(k)=temp_u(k-1);      				
-		}			
-		ColMatrix result2=*qdot;
-		ColMatrix result3=*q;
-		int num=result1.GetNumRows();
-		ColMatrix result4(num+1);
-		result4.Zeros();
-		
-		EPdotdot_udot(result1, result2, result3, result4);		
-		FastAssign(result4, *qdotdot);    
-		FastMult(sP,*udot,sPudot);      
-		FastAdd(sSCTsAhat,sPudot,sAhat);
-	}		
-	else{
-		cout<<"Joint type not recognized in onbody.cpp LocalForwardSubsitution() "<GetType();
+  if(type == 1){
+    FastTMult(sSC,parent->sAhat,sSCTsAhat);
+    FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);
+    FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
+    FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);
+
+    ColMatrix result1=*udot;
+    ColMatrix result2=*qdot;
+    ColMatrix result3=*q;
+    int num=result1.GetNumRows();
+    ColMatrix result4(num+1);
+    result4.Zeros();
+    EPdotdot_udot(result1, result2, result3, result4);
+    FastAssign(result4, *qdotdot);
+    FastMult(sP,*udot,sPudot);
+    FastAdd(sSCTsAhat,sPudot,sAhat);
+  }
+  else if (type == 4){
+    FastTMult(sSC,parent->sAhat,sSCTsAhat);
+    FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);
+    FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
+    FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);
+
+    ColMatrix result1=*udot;
+    ColMatrix result2=*qdot;
+    ColMatrix result3=*q;
+    int num=result1.GetNumRows();
+    ColMatrix result4(num+1);
+    result4.Zeros();
+
+    EPdotdot_udot(result1, result2, result3, result4);
+    FastAssign(result4, *qdotdot);
+    FastMult(sP,*udot,sPudot);
+    FastAdd(sSCTsAhat,sPudot,sAhat);
+  }
+  else if (type == 5){
+    FastTMult(sSC,parent->sAhat,sSCTsAhat);
+    FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);
+    FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
+    FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);
+    ColMatrix temp_u = *udot;
+
+    ColMatrix result1(3);
+    result1(1)=0.0;
+    result1(2)=temp_u(1);
+    result1(3)=temp_u(2);
+    ColMatrix result2=*qdot;
+    ColMatrix result3=*q;
+    int num=result1.GetNumRows();
+    ColMatrix result4(num+1);
+    result4.Zeros();
+
+    EPdotdot_udot(result1, result2, result3, result4);
+    FastAssign(result4, *qdotdot);
+    FastMult(sP,*udot,sPudot);
+    FastAdd(sSCTsAhat,sPudot,sAhat);
+  }
+  else if (type == 6){
+    FastTMult(sSC,parent->sAhat,sSCTsAhat);
+    FastMult(sIhat,sSCTsAhat,sIhatsSCTsAhat);
+    FastSubt(sFhat,sIhatsSCTsAhat,sFsIhatsSCTsAhat);
+    FastTMult(sPsMinv,sFsIhatsSCTsAhat,*udot);
+    ColMatrix temp_u = *udot;
+    int tt = temp_u.GetNumRows() + 1;
+    ColMatrix result1(tt);
+    result1(1)=0.0;
+    for (int k =2; k<=tt; k++){
+      result1(k)=temp_u(k-1);
+    }
+    ColMatrix result2=*qdot;
+    ColMatrix result3=*q;
+    int num=result1.GetNumRows();
+    ColMatrix result4(num+1);
+    result4.Zeros();
+
+    EPdotdot_udot(result1, result2, result3, result4);
+    FastAssign(result4, *qdotdot);
+    FastMult(sP,*udot,sPudot);
+    FastAdd(sSCTsAhat,sPudot,sAhat);
+  }
+  else{
+    cout<<"Joint type not recognized in onbody.cpp LocalForwardSubsitution() "<ClearBodyIDs();
-  
+
 
   // error check for inertial frame
   Body* sysbasebody = system->bodies.GetHeadElement()->value;
@@ -72,77 +72,77 @@ void OnSolver::CreateModel(){
     cerr << "ERROR: unable to create O(n) model" << endl;
     exit(1);
   }
-  
-  
-  
+
+
+
   bodyarray = new OnBody* [numbodies];
-  
-  CreateTopologyArray(0,&inertialframe);	  
-  
-  CreateStateMatrixMaps();  
+
+  CreateTopologyArray(0,&inertialframe);
+
+  CreateStateMatrixMaps();
 }
 
 int OnSolver::CreateTopologyArray(int num, OnBody* body){
   int i = num;
-  bodyarray[i] = body;    
+  bodyarray[i] = body;
   i++;
 
-  
+
   OnBody* child;
-  ListElement* ele = body->children.GetHeadElement();    
-  
+  ListElement* ele = body->children.GetHeadElement();
+
   while(ele){
-    child = ele->value;    
+    child = ele->value;
     i = CreateTopologyArray(i,child);
-    ele = ele->next;        
-  }  
-  return i;  
+    ele = ele->next;
+  }
+  return i;
 }
 
 void OnSolver::CreateStateMatrixMaps(){
-  
-	
+
+
   int numstates=0;
-  for(int i=1;iq->GetNumRows();       
-  
+  for(int i=1;iq->GetNumRows();
+
   state.Dim(numstates);
   statedot.Dim(numstates);
-  statedoubledot.Dim(numstates); 
+  statedoubledot.Dim(numstates);
+
 
-  
   int count=0;
-  
+
   for(int i=1;iq->GetNumRows();j++){
-		  state.SetElementPointer(count,bodyarray[i]->q->GetElementPointer(j));      
-		  statedot.SetElementPointer(count,bodyarray[i]->qdot->GetElementPointer(j));        	
-		  statedoubledot.SetElementPointer(count,bodyarray[i]->qdotdot->GetElementPointer(j));       
-		  count++;      
-	  }        
+    for(int j=0;jq->GetNumRows();j++){
+      state.SetElementPointer(count,bodyarray[i]->q->GetElementPointer(j));
+      statedot.SetElementPointer(count,bodyarray[i]->qdot->GetElementPointer(j));
+      statedoubledot.SetElementPointer(count,bodyarray[i]->qdotdot->GetElementPointer(j));
+      count++;
+    }
   }
 }
 
 
 void OnSolver::Solve(double time, Matrix& FF){
-	system->SetTime(time);
-	for(int i=1;iLocalKinematics();
-	
-	Vect3 Torque; Torque.Zeros();
-	Vect3 Force; Force.Zeros();
-	
-	for(int i=numbodies-1;i>0;i--){
-		Torque(1)=FF(1,i);     
-		Torque(2)=FF(2,i);
-		Torque(3)=FF(3,i);		
-		Force(1)=FF(4,i);     
-		Force(2)=FF(5,i);
-		Force(3)=FF(6,i);   
-		bodyarray[i]->LocalTriangularization(Torque,Force);
-	}
-   	
-	for(int i=1;iLocalForwardSubstitution();
-	}  
+  system->SetTime(time);
+  for(int i=1;iLocalKinematics();
+
+  Vect3 Torque; Torque.Zeros();
+  Vect3 Force; Force.Zeros();
+
+  for(int i=numbodies-1;i>0;i--){
+    Torque(1)=FF(1,i);
+    Torque(2)=FF(2,i);
+    Torque(3)=FF(3,i);
+    Force(1)=FF(4,i);
+    Force(2)=FF(5,i);
+    Force(3)=FF(6,i);
+    bodyarray[i]->LocalTriangularization(Torque,Force);
+  }
+
+  for(int i=1;iLocalForwardSubstitution();
+  }
 }
diff --git a/lib/poems/particle.cpp b/lib/poems/particle.cpp
index 3496bc1906..1993136923 100644
--- a/lib/poems/particle.cpp
+++ b/lib/poems/particle.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: particle.cpp                                            *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/particle.h b/lib/poems/particle.h
index 20aa4831ea..20fce695af 100644
--- a/lib/poems/particle.h
+++ b/lib/poems/particle.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: particle.h                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -23,7 +23,7 @@
 
 
 class Particle : public Body  {
-public: 
+public:
   Particle();
   ~Particle();
   BodyType GetType();
diff --git a/lib/poems/poemsobject.cpp b/lib/poems/poemsobject.cpp
index 7c3f1ca872..5f221f1242 100644
--- a/lib/poems/poemsobject.cpp
+++ b/lib/poems/poemsobject.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: poemsobject.cpp                                         *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 
 #include "poemsobject.h"
 #include 
diff --git a/lib/poems/poemsobject.h b/lib/poems/poemsobject.h
index 63b2915638..df92f0b51b 100644
--- a/lib/poems/poemsobject.h
+++ b/lib/poems/poemsobject.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: poemsobject.cpp                                         *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 
 #ifndef POEMSOBJECT_H
 #define POEMSOBJECT_H
@@ -23,7 +23,7 @@
 class POEMSObject {
   char* name;
   int ID;
-public: 
+public:
   POEMSObject();
   virtual ~POEMSObject();
   void ChangeName(const char* newname);
diff --git a/lib/poems/poemstreenode.cpp b/lib/poems/poemstreenode.cpp
index 0b475c0a85..d1fd965752 100644
--- a/lib/poems/poemstreenode.cpp
+++ b/lib/poems/poemstreenode.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: poemstreenode.cpp                                       *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -20,7 +20,7 @@
 // constructor; initialize the data and pointer fields
 // A null pointer value assigns a empty subtree
 TreeNode::TreeNode (const int & item, TreeNode *lptr,TreeNode *rptr,
-					int balfac):data(item), left(lptr), right(rptr), balanceFactor(balfac)
+          int balfac):data(item), left(lptr), right(rptr), balanceFactor(balfac)
 {
 }
 
@@ -29,21 +29,21 @@ TreeNode::TreeNode (const int & item, TreeNode *lptr,TreeNode *rptr,
 // return left
 TreeNode* TreeNode::Left(void)
 {
-	return left;
+  return left;
 }
 
 // return right
 TreeNode* TreeNode::Right(void)
 {
-	return right;
+  return right;
 }
 
 int TreeNode::GetBalanceFactor(void)
 {
-	return balanceFactor;
+  return balanceFactor;
 }
 
 int TreeNode::GetData(void)
 {
-	return data;
+  return data;
 }
diff --git a/lib/poems/point.cpp b/lib/poems/point.cpp
index 4383844736..66bf8d0373 100644
--- a/lib/poems/point.cpp
+++ b/lib/poems/point.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: point.cpp                                                  *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/point.h b/lib/poems/point.h
index 746a527cd7..477c7f43e8 100644
--- a/lib/poems/point.h
+++ b/lib/poems/point.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: point.h                                                  *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -29,14 +29,14 @@ enum PointType {
 };
 
 class Point : public POEMSObject {
-public: 
+public:
   Vect3 position;
 
-  Point();   
-  bool ReadIn(std::istream& in);  
+  Point();
+  bool ReadIn(std::istream& in);
   void WriteOut(std::ostream& out);
-  
-  virtual ~Point();  
+
+  virtual ~Point();
   virtual PointType GetType() = 0;
   virtual Vect3 GetPoint() = 0;
   virtual bool ReadInPointData(std::istream& in) = 0;
diff --git a/lib/poems/prismaticjoint.cpp b/lib/poems/prismaticjoint.cpp
index 7c01667a86..e0a0e7b87a 100644
--- a/lib/poems/prismaticjoint.cpp
+++ b/lib/poems/prismaticjoint.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: prismaticjoint.cpp                                      *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -41,7 +41,7 @@ bool PrismaticJoint::ReadInJointData(std::istream& in){
   // init the constant transforms
   pk_C_k = pk_C_ko;
   k_C_pk = T(pk_C_k);
-    
+
   return true;
 }
 
@@ -100,7 +100,7 @@ void PrismaticJoint::ForwardKinematics(){
 
   // compute position vector r21
   FastNegMult(k_C_pk,r12,r21);
-  
+
   // compute global location
   // body2->r = body1->r + body1->n_C_k * r12;
   FastMult(body1->n_C_k,r12,result1);
@@ -115,7 +115,7 @@ void PrismaticJoint::ForwardKinematics(){
   //body2->omega_k = T(pk_C_k) * body1->omega_k;
   FastAssign(body1->omega,body2->omega);
   FastMult(k_C_pk,body1->omega_k,body2->omega_k);
-  
+
   // compute velocities
   Vect3 pk_v_k;
   Vect3 wxgamma;
diff --git a/lib/poems/prismaticjoint.h b/lib/poems/prismaticjoint.h
index 17cf050a78..ed0bc88cc2 100644
--- a/lib/poems/prismaticjoint.h
+++ b/lib/poems/prismaticjoint.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: prismaticjoint.cpp                                       *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/revolutejoint.cpp b/lib/poems/revolutejoint.cpp
index ec5b1bec02..eef83dc978 100644
--- a/lib/poems/revolutejoint.cpp
+++ b/lib/poems/revolutejoint.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: revolutejoint.cpp                                        *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -101,7 +101,7 @@ void RevoluteJoint::ForwardKinematics(){
 
   // compute position vector r12
   //r12 = point1->position - pk_C_k * point2->position;
-  FastMult(pk_C_k,point2->position,result1); 
+  FastMult(pk_C_k,point2->position,result1);
   FastSubt(point1->position,result1,r12);// Jacks comment: needs flipping!!!
 
   // compute position vector r21
diff --git a/lib/poems/revolutejoint.h b/lib/poems/revolutejoint.h
index 478d48dbb9..fd8cdc69e2 100644
--- a/lib/poems/revolutejoint.h
+++ b/lib/poems/revolutejoint.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: revolutejoint.h                                         *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -27,7 +27,7 @@
 class RevoluteJoint : public Joint  {
   Vect3 axis_pk; // unit vector in body1 basis
   Vect3 axis_k;  // unit vector in body2 basis
-public: 
+public:
   RevoluteJoint();
   ~RevoluteJoint();
   JointType GetType();
diff --git a/lib/poems/rigidbody.cpp b/lib/poems/rigidbody.cpp
index 3ac424f9e9..92963f93da 100644
--- a/lib/poems/rigidbody.cpp
+++ b/lib/poems/rigidbody.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: rigidbody.cpp                                           *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/rigidbody.h b/lib/poems/rigidbody.h
index 0bb2a3ece2..bdadc4a50f 100644
--- a/lib/poems/rigidbody.h
+++ b/lib/poems/rigidbody.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: rigidbody.h                                             *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -21,7 +21,7 @@
 #include "body.h"
 
 class RigidBody : public Body  {
-public: 
+public:
   RigidBody();
   ~RigidBody();
   BodyType GetType();
diff --git a/lib/poems/rowmatrix.cpp b/lib/poems/rowmatrix.cpp
index feb185070e..41e24911aa 100644
--- a/lib/poems/rowmatrix.cpp
+++ b/lib/poems/rowmatrix.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: rowmatrix.cpp                                           *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/rowmatrix.h b/lib/poems/rowmatrix.h
index b04113e8ed..e64e3f09c5 100644
--- a/lib/poems/rowmatrix.h
+++ b/lib/poems/rowmatrix.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: rowmatrix.h                                             *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/solver.cpp b/lib/poems/solver.cpp
index 7b1e718b93..8380553d92 100644
--- a/lib/poems/solver.cpp
+++ b/lib/poems/solver.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: solver.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -37,16 +37,16 @@ system->ComputeForces();
 
 SolverType Solver::GetSolverType()
 {
-	return type;
+  return type;
 }
 
 Solver * Solver::GetSolver(SolverType solverToMake) //returning a pointer to a new Solver object of the appropriate type
 {
-	switch((int)solverToMake)
-	{
-		case ONSOLVER: return new OnSolver();
-		default: return nullptr;
-	}
+  switch((int)solverToMake)
+  {
+    case ONSOLVER: return new OnSolver();
+    default: return nullptr;
+  }
 }
 
 ColMatMap* Solver::GetState(){
diff --git a/lib/poems/solver.h b/lib/poems/solver.h
index 45564dd1ef..1ac219bc71 100644
--- a/lib/poems/solver.h
+++ b/lib/poems/solver.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: solver.h                                                *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:       anderk5@rpi.edu                                     *
  *_________________________________________________________________________*/
 
@@ -28,11 +28,11 @@ class Solver{
 protected:
   System* system;
 
-  
+
   double time;
   ColMatMap state;
   ColMatMap statedot;
-  ColMatMap statedoubledot;  
+  ColMatMap statedoubledot;
 
   SolverType type;
 
@@ -47,10 +47,10 @@ public:
 
   virtual void DeleteModel() = 0;
   virtual void CreateModel() = 0;
-  virtual void Solve(double time, Matrix& FF) = 0;  
-  
-    
-    
+  virtual void Solve(double time, Matrix& FF) = 0;
+
+
+
   ColMatMap* GetState();
   ColMatMap* GetStateDerivative();
   ColMatMap* GetStateDerivativeDerivative();
diff --git a/lib/poems/sphericaljoint.cpp b/lib/poems/sphericaljoint.cpp
index fb5330db17..aadd3ebd67 100644
--- a/lib/poems/sphericaljoint.cpp
+++ b/lib/poems/sphericaljoint.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: sphericaljoint.cpp                                      *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,10 +11,10 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
- 
+
 
 #include "sphericaljoint.h"
 #include "point.h"
@@ -44,24 +44,24 @@ bool SphericalJoint::ReadInJointData(std::istream& in){
 void SphericalJoint::WriteOutJointData(std::ostream& out){
 }
 
-Matrix SphericalJoint::GetForward_sP(){  
+Matrix SphericalJoint::GetForward_sP(){
   Mat3x3 sPa,sPl;
   Matrix sP(6,3);
-  sPa.Identity();    
+  sPa.Identity();
   sPl.Zeros();
-  Vect3 temp = -(point2->position);  
-  
+  Vect3 temp = -(point2->position);
+
   sPl(1,2) = temp(3);
   sPl(1,3) = -temp(2);
-  
+
   sPl(2,1) = -temp(3);
   sPl(2,3) = temp(1);
-  
-  sPl(3,1) = temp(2);  
+
+  sPl(3,1) = temp(2);
   sPl(3,2) = -temp(1);
-         
-  sP=Stack(sPa,sPl);  
-  return sP;    
+
+  sP=Stack(sPa,sPl);
+  return sP;
 }
 
 void SphericalJoint::UpdateForward_sP( Matrix& sP){
@@ -70,128 +70,128 @@ void SphericalJoint::UpdateForward_sP( Matrix& sP){
 }
 
 Matrix SphericalJoint::GetBackward_sP(){
-	cout<<" -----------"<position(1));  
-  sPl(2,3)=-(point2->position(1));   
+  sPa.Identity();
+  sPl.Zeros();
+  sPl(3,2)=(point2->position(1));
+  sPl(2,3)=-(point2->position(1));
   sP=Stack(sPa,sPl);
-  return sP;    
+  return sP;
 }
 
-void SphericalJoint::UpdateBackward_sP( Matrix& sP){  
+void SphericalJoint::UpdateBackward_sP( Matrix& sP){
   // sP is constant, do nothing.
 }
 
 void SphericalJoint::ComputeLocalTransform(){
-	Mat3x3 ko_C_k;
-	// Obtain the transformation matrix from euler parameters
-	EP_Transformation(q, ko_C_k);
-	FastMult(pk_C_ko,ko_C_k,pk_C_k);
-	}  
+  Mat3x3 ko_C_k;
+  // Obtain the transformation matrix from euler parameters
+  EP_Transformation(q, ko_C_k);
+  FastMult(pk_C_ko,ko_C_k,pk_C_k);
+  }
 
 
 void SphericalJoint::ForwardKinematics(){
   Vect3 result1,result2,result3,result4,result5;
   Vect3 pk_w_k;
-  
+
   //cout<<"Check in spherical "<position,result1); // parents basis      
-  FastAdd(result1,point1->position,r12);      
-  
-  // compute position vector r21 
-  FastNegMult(k_C_pk,r12,r21); 
+  // COMPUTE POSITION VECTOR R12 aka GAMMA
+
+  FastNegMult(pk_C_k,point2->position,result1); // parents basis
+  FastAdd(result1,point1->position,r12);
+
+  // compute position vector r21
+  FastNegMult(k_C_pk,r12,r21);
+
+
 
-  
-  
   //----------------------------------//
-  // COMPUTE GLOBAL LOCATION  
-  FastMult(body1->n_C_k,(body1->GetPoint(2))->position,result1);    
-  FastAdd(result1,body1->r,result1);  
-  FastNegMult(body2->n_C_k,(body2->GetPoint(1))->position,result2);  
-  FastAdd(result1,result2,body2->r);  
-  
-  qdot_to_u(q, u, qdot);  
-  
+  // COMPUTE GLOBAL LOCATION
+  FastMult(body1->n_C_k,(body1->GetPoint(2))->position,result1);
+  FastAdd(result1,body1->r,result1);
+  FastNegMult(body2->n_C_k,(body2->GetPoint(1))->position,result2);
+  FastAdd(result1,result2,body2->r);
+
+  qdot_to_u(q, u, qdot);
+
+
+  //-----------------------------------
+  // angular velocities
 
-  //-----------------------------------  
-  // angular velocities  
-  
   FastAssign(u,pk_w_k);
-  FastTMult(pk_C_k,body1->omega_k,result1);        
+  FastTMult(pk_C_k,body1->omega_k,result1);
   FastAdd(result1,pk_w_k,body2->omega_k);
-  FastMult(body2->n_C_k,body2->omega_k,body2->omega); 
+  FastMult(body2->n_C_k,body2->omega_k,body2->omega);
 
-  
-  
-  //-----------------------------------  
-  
-  // compute velocities  
-  FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);  
+
+
+  //-----------------------------------
+
+  // compute velocities
+  FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);
   FastAdd(body1->v_k,result1,result2);
-  FastTMult(pk_C_k,result2,result1); // In body basis  
-  
-  FastCross((body2->GetPoint(1))->position,body2->omega_k,result2);                 
-  FastAdd(result1,result2,body2->v_k);    // In body basis     
-  FastMult(body2->n_C_k,body2->v_k,body2->v); 
-  
-  
+  FastTMult(pk_C_k,result2,result1); // In body basis
+
+  FastCross((body2->GetPoint(1))->position,body2->omega_k,result2);
+  FastAdd(result1,result2,body2->v_k);    // In body basis
+  FastMult(body2->n_C_k,body2->v_k,body2->v);
+
+
   //------------------------------------------
-  //Compute the KE   
+  //Compute the KE
   Matrix tempke;
-  tempke = T(body2->v)*(body2->v);    
+  tempke = T(body2->v)*(body2->v);
   double ke = 0.0;
-  ke = body2->mass*tempke(1,1);  
+  ke = body2->mass*tempke(1,1);
   FastMult(body2->inertia,body2->omega_k,result1);
-  tempke= T(body2->omega_k)*result1;  
+  tempke= T(body2->omega_k)*result1;
   ke = 0.5*ke + 0.5*tempke(1,1);
   body2->KE=ke;
 
-  //-----------------------------------  
-  // compute state explicit angular acceleration  // Has to be in body basis    
-  FastTMult(pk_C_k,body1->alpha_t,result2);  
+  //-----------------------------------
+  // compute state explicit angular acceleration  // Has to be in body basis
+  FastTMult(pk_C_k,body1->alpha_t,result2);
   FastCross(body2->omega_k,pk_w_k,result1);
-  FastAdd(result1,result2,body2->alpha_t); 
-   
-  //-----------------------------------  
-  // compute state explicit acceleration   
-  // NEED TO DO THIS COMPLETELY IN BODY BASIS 
-  
+  FastAdd(result1,result2,body2->alpha_t);
+
+  //-----------------------------------
+  // compute state explicit acceleration
+  // NEED TO DO THIS COMPLETELY IN BODY BASIS
+
   FastCross(body1->omega_k,(body1->GetPoint(2))->position,result1);
-  FastCross(body1->omega_k,result1,result2); 
-  FastTMult(pk_C_k,result2,result1); 
-  
-  //FastCross(body2->omega_k,-(body2->GetPoint(1))->position,result3);  
-  FastCross((body2->GetPoint(1))->position,body2->omega_k,result3);  
-  FastCross(body2->omega_k,result3,result2);    
-  FastAdd(result1,result2,result3); //wxwxr in body basis  
-  
-  FastCross(body1->alpha_t,(body1->GetPoint(2))->position,result4); 
-  FastTMult(pk_C_k,result4,result5);  
+  FastCross(body1->omega_k,result1,result2);
+  FastTMult(pk_C_k,result2,result1);
+
+  //FastCross(body2->omega_k,-(body2->GetPoint(1))->position,result3);
+  FastCross((body2->GetPoint(1))->position,body2->omega_k,result3);
+  FastCross(body2->omega_k,result3,result2);
+  FastAdd(result1,result2,result3); //wxwxr in body basis
+
+  FastCross(body1->alpha_t,(body1->GetPoint(2))->position,result4);
+  FastTMult(pk_C_k,result4,result5);
   FastAssign(result5,result4);
-  
-  FastCross((body2->GetPoint(1))->position,body2->alpha_t,result2);   
-  FastAdd(result2,result4,result1); //alphaxr in body basis  
-  
+
+  FastCross((body2->GetPoint(1))->position,body2->alpha_t,result2);
+  FastAdd(result2,result4,result1); //alphaxr in body basis
+
   FastTMult(pk_C_k,body1->a_t,result2);
-  FastTripleSum(result3,result1,result2,body2->a_t);     // in body basis  
-  
-  
-  //-----------------------------------    
+  FastTripleSum(result3,result1,result2,body2->a_t);     // in body basis
+
+
+  //-----------------------------------
 }
 
 // NOTE: NOT USING BACKWARDKINEMATICS AT PRESENT
@@ -202,13 +202,13 @@ void SphericalJoint::BackwardKinematics(){
 
   // orientations
   ComputeBackwardTransforms();
-  
+
 
   // compute position vector r21
   //r21 = point2->position - k_C_pk * point1->position;
   FastMult(k_C_pk,point1->position,result1);
   FastSubt(point2->position,result1,r21);
-  
+
 
   // compute position vector r21
   FastNegMult(pk_C_k,r21,r12);
@@ -227,7 +227,7 @@ void SphericalJoint::BackwardKinematics(){
   EP_Derivatives(q,u,qdot);
 
   // angular velocities
- 
+
   FastMult(body2->n_C_k,u,result2);
   FastAdd(body2->omega,result2,body1->omega);
   FastAssign(u,k_w_pk);
@@ -247,7 +247,7 @@ void SphericalJoint::BackwardKinematics(){
   FastCross(body1->omega_k,k_w_pk,result1);
   FastMult(pk_C_k,body2->alpha_t,result2);
   FastAdd(result1,result2,body1->alpha_t);
-  
+
   // compute state explicit acceleration
   FastCross(body2->alpha_t,point2->position,result1);
   FastCross(body2->omega_k,point2->position,result2);
@@ -260,5 +260,5 @@ void SphericalJoint::BackwardKinematics(){
   FastCross(body1->omega_k,result2,result3);
 
   FastTripleSum(result5,result1,result3,body1->a_t);
-  
+
 }
diff --git a/lib/poems/sphericaljoint.h b/lib/poems/sphericaljoint.h
index ef29f8e38e..390f2fefe4 100644
--- a/lib/poems/sphericaljoint.h
+++ b/lib/poems/sphericaljoint.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: sphericaljoint.h                                        *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/system.cpp b/lib/poems/system.cpp
index 23554f4117..59107e46d7 100644
--- a/lib/poems/system.cpp
+++ b/lib/poems/system.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: system.cpp                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -23,7 +23,7 @@
 
 
 System::System(){
-	mappings = nullptr;
+  mappings = nullptr;
 }
 
 System::~System(){
@@ -42,7 +42,7 @@ int System::GetNumBodies(){
 
 int * System::GetMappings()
 {
-	return mappings;
+  return mappings;
 }
 
 void System::AddBody(Body* body){
@@ -61,16 +61,16 @@ double System::GetTime(){
   return time;
 }
 
-void System::ComputeForces(){	
-	// NOT DOING ANYTHING AT THIS TIME
-  }  
-  
+void System::ComputeForces(){
+  // NOT DOING ANYTHING AT THIS TIME
+  }
+
 bool System::ReadIn(istream& in){
   int numbodies;
   Body* body;
   int bodytype;
   char bodyname[256];
-  int index;  
+  int index;
 
   // get number of bodies
   in >> numbodies;
@@ -148,12 +148,12 @@ bool System::ReadIn(istream& in){
       delete [] bodyarray;
       return false;
     }
-    
+
     joint->SetBodies(bodyarray[body1], bodyarray[body2]);
 
     bodyarray[body1]->AddJoint(joint);
     bodyarray[body2]->AddJoint(joint);
-    
+
     in >> point1 >> point2;
 
     joint->SetPoints(bodyarray[body1]->GetPoint(point1),bodyarray[body2]->GetPoint(point2));
@@ -186,7 +186,7 @@ void System::WriteOut(ostream& out){
 
     // set the body ID for later identification
     body->SetID(i);
-    
+
     // write out the data
     body->WriteOut(out);
 
@@ -194,7 +194,7 @@ void System::WriteOut(ostream& out){
   }
 
   // number of joints
-  out << joints.GetNumElements() << endl;  
+  out << joints.GetNumElements() << endl;
 
   // joints loop
   i = 0;
@@ -209,7 +209,7 @@ void System::WriteOut(ostream& out){
 
     // write out the data
     joint->WriteOut(out);
-    
+
     i++; j_ele = j_ele->next;
   }
 }
@@ -235,68 +235,68 @@ void System::ClearJointIDs(){
 
 void System::Create_DegenerateSystem(int& nfree, int*freelist, double *&masstotal, double **&inertia, double **&xcm, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space){
 
- //-------------------------------------------------------------------------//    
-  // Declaring Temporary Entities 
-  //-------------------------------------------------------------------------//   
+ //-------------------------------------------------------------------------//
+  // Declaring Temporary Entities
+  //-------------------------------------------------------------------------//
      Body* body = nullptr;
      Body* prev;
      Body* Inertial;
      Point* origin;
      Joint* joint;
-     Point* point_CM; 
-     Point* point_p;  
-     Point* point_k;  
+     Point* point_CM;
+     Point* point_p;
+     Point* point_k;
      Point* point_ch = nullptr;
-     Vect3 r1,r2,r3,v1,v2,v3; 
+     Vect3 r1,r2,r3,v1,v2,v3;
      Mat3x3 IM, N, PKCK,PKCN ;
      ColMatrix qo, uo, q, qdot,w;
-     
-	 mappings = new int[nfree];
-	 for(int i = 0; i < nfree; i++)
-	 {
-		 mappings[i] = freelist[i];		 
-	 }
+
+   mappings = new int[nfree];
+   for(int i = 0; i < nfree; i++)
+   {
+     mappings[i] = freelist[i];
+   }
      qo.Dim(4);
      uo.Dim(3);
      q.Dim(4);
-     qdot.Dim(4);     
+     qdot.Dim(4);
      PKCN.Identity();
      PKCK.Identity();
      w.Dim(3);
-	
-//-------------------------------------------------------------------------//    
-  // Setting up Inertial Frame, gravity and Origin  
-  //-------------------------------------------------------------------------//
-     Inertial= new InertialFrame;  
-     AddBody(Inertial);
-     
-     Vect3 temp1;  
-     temp1.Zeros();  
-     ((InertialFrame*) Inertial)->SetGravity(temp1);    
-     origin= new FixedPoint(temp1);
-     Inertial->AddPoint(origin);    
+
+//-------------------------------------------------------------------------//
+  // Setting up Inertial Frame, gravity and Origin
+  //-------------------------------------------------------------------------//
+     Inertial= new InertialFrame;
+     AddBody(Inertial);
+
+     Vect3 temp1;
+     temp1.Zeros();
+     ((InertialFrame*) Inertial)->SetGravity(temp1);
+     origin= new FixedPoint(temp1);
+     Inertial->AddPoint(origin);
+//-------------------------------------------------------------------------//
+  double ** xh1 = new double*[nfree];
+  double ** xh2 = new double*[nfree];
+
+  for (int i=0; imass=masstotal[mappings[i]-1];
      IM(1,1)=inertia[mappings[i]-1][0];
      IM(2,2)=inertia[mappings[i]-1][1];
@@ -307,49 +307,49 @@ void System::Create_DegenerateSystem(int& nfree, int*freelist, double *&masstota
      IM(2,1)=IM(1,2);
      IM(3,1)=IM(1,3);
      IM(3,2)=IM(2,3);
-     body->inertia = IM;   
+     body->inertia = IM;
+
+//-------------------------------------------------------//
+
+
+      for (int k=0;k<3;k++){
+          r1(k+1)=xh1[i][k]-xcm[mappings[i]-1][k];
+       r3(k+1) = xcm[mappings[i]-1][k];
+       r3(k+1)=xh2[i][k]-xcm[mappings[i]-1][k];
+      }
+
+     r2.Zeros();
+
+     for (int k=1;k<=3;k++){
+          N(k,1)=ex_space[mappings[i]-1][k-1];
+          N(k,2)=ey_space[mappings[i]-1][k-1];
+          N(k,3)=ez_space[mappings[i]-1][k-1];
+         }
 
-//-------------------------------------------------------//                  
-    
-    
-	    for (int k=0;k<3;k++){ 
-          r1(k+1)=xh1[i][k]-xcm[mappings[i]-1][k];     
-			 r3(k+1) = xcm[mappings[i]-1][k];
-			 r3(k+1)=xh2[i][k]-xcm[mappings[i]-1][k]; 	  
-	    }
-	  
-     r2.Zeros(); 
-     
-     for (int k=1;k<=3;k++){     
-          N(k,1)=ex_space[mappings[i]-1][k-1];              
-          N(k,2)=ey_space[mappings[i]-1][k-1];              
-          N(k,3)=ez_space[mappings[i]-1][k-1];              
-         }                  
-     
      PKCK=T(N);
      PKCN=T(N);
-    
-     q.Zeros();     
+
+     q.Zeros();
      EP_FromTransformation(q,N);
-                    
+
      r1=PKCN*r1;
      r3=PKCN*r3;
-     
+
      for (int k=1;k<=3;k++){
-     w(k)=omega[mappings[i]-1][k-1];                                   
-     }     
-     
+     w(k)=omega[mappings[i]-1][k-1];
+     }
+
      Vect3 cart_r, cart_v;
      for (int k=1;k<=3;k++){
-	     cart_r(k)=xcm[mappings[i]-1][k-1];	     
-	     cart_v(k)=vcm[mappings[i]-1][k-1];
-	     }
-	     	     
-	     w=PKCN*w;     
-	     EP_Derivatives(q,w,qdot);
-	     
-     
-//-------------------------------------------------------------------------//    
+       cart_r(k)=xcm[mappings[i]-1][k-1];
+       cart_v(k)=vcm[mappings[i]-1][k-1];
+       }
+
+       w=PKCN*w;
+       EP_Derivatives(q,w,qdot);
+
+
+//-------------------------------------------------------------------------//
 // Create bodies and joints with associated properties for POEMS
 //-------------------------------------------------------------------------//
 
@@ -359,12 +359,12 @@ void System::Create_DegenerateSystem(int& nfree, int*freelist, double *&masstota
      body->AddPoint(point_CM);
      body->AddPoint(point_k);
      body->AddPoint(point_ch);
-     AddBody(body);    
-   
+     AddBody(body);
+
      Mat3x3 One;
-     One.Identity();	
-	  ColMatrix qq=Stack(q,cart_r);
-          ColMatrix vv=Stack(qdot,cart_v);          
+     One.Identity();
+    ColMatrix qq=Stack(q,cart_r);
+          ColMatrix vv=Stack(qdot,cart_v);
           joint=new FreeBodyJoint;
           AddJoint(joint);
           joint->SetBodies(prev,body);
@@ -374,225 +374,225 @@ void System::Create_DegenerateSystem(int& nfree, int*freelist, double *&masstota
           joint->SetZeroOrientation(One);
           joint->DimQandU(7,6);
           joint->SetInitialState(qq,vv);
-          joint->ForwardKinematics();                             
+          joint->ForwardKinematics();
   }
   for(int i = 0; i < nfree; i++) {
-	  delete [] xh1[i];
-	  delete [] xh2[i];
+    delete [] xh1[i];
+    delete [] xh2[i];
   }
   delete [] xh1;
-  delete [] xh2;  
+  delete [] xh2;
 }
 
 
 void System::Create_System_LAMMPS(int numbodies, double *mass,double **inertia, double ** xcm, double ** xjoint,double **vcm,double **omega,double **ex_space, double **ey_space, double **ez_space, int b, int * mapping, int count){
 
-	//-------------------------------------------------------------------------//    
-  // Declaring Temporary Entities 
-	//-------------------------------------------------------------------------//   
-  	
-	Body* body = nullptr;
-	Body* prev;
-	Body* Inertial;
-	Point* origin;
-	Joint* joint;
-	Point* point_CM;   
-	Point* point_p;    
-	Point* point_k;    
-	Point* point_ch = nullptr;  
-	Vect3 r1,r2,r3,v1,v2,v3; 
-	Mat3x3 IM, N, PKCK,PKCN ;
-	ColMatrix qo, uo, q, qdot,w;
-	Vect3 cart_r, cart_v;
-	mappings = new int[b];
-	for(int i = 0; i < b; i++){
-		mappings[i] = mapping[i];		 
-	}	 
-	 
-     
-	qo.Dim(4);
-	uo.Dim(3);
-	q.Dim(4);
-	qdot.Dim(4);     
-	PKCN.Identity();
-	PKCK.Identity();
-	w.Dim(3);
-	
-	//-------------------------------------------------------------------------//    
-  // Setting up Inertial Frame, gravity and Origin  
-	//-------------------------------------------------------------------------//
-	Inertial= new InertialFrame;  
-	AddBody(Inertial);
-     
-	Vect3 temp1;  
-	temp1.Zeros();  
-	((InertialFrame*) Inertial)->SetGravity(temp1);    
-	origin= new FixedPoint(temp1);
-	Inertial->AddPoint(origin);    
-	//-------------------------------------------------------------------------//
+  //-------------------------------------------------------------------------//
+  // Declaring Temporary Entities
+  //-------------------------------------------------------------------------//
 
-	double ** xh1;
-	double ** xh2;
-		  
-	xh1 = new double*[b];		  
-	xh2 = new double*[b];
-		  
-	
-	for (int i=0; iSetGravity(temp1);
+  origin= new FixedPoint(temp1);
+  Inertial->AddPoint(origin);
+  //-------------------------------------------------------------------------//
+
+  double ** xh1;
+  double ** xh2;
+
+  xh1 = new double*[b];
+  xh2 = new double*[b];
+
+
+  for (int i=0; imass=mass[mapping[i]-1];
-		IM(1,1)=inertia[mapping[i]-1][0];
-		IM(2,2)=inertia[mapping[i]-1][1];
-		IM(3,3)=inertia[mapping[i]-1][2];
-		IM(1,2)=0.0;
-		IM(1,3)=0.0;
-		IM(2,3)=0.0;
-		IM(2,1)=IM(1,2);
-		IM(3,1)=IM(1,3);
-		IM(3,2)=IM(2,3);
-		body->inertia = IM;   
-     
-		//-------------------------------------------------------//
-             
-		for (int k=0;k<3;k++){
-			r1(k+1)=xh1[i][k]-xcm[mapping[i]-1][k]; 
-			r3(k+1)=xh2[i][k]-xcm[mapping[i]-1][k]; 
-		}
-		r2.Zeros();   
-     
-		for (int k=1;k<=3;k++){     
-			N(k,1)=ex_space[mapping[i]-1][k-1];              
-			N(k,2)=ey_space[mapping[i]-1][k-1];              
-			N(k,3)=ez_space[mapping[i]-1][k-1];              
-		}
-	 
-         
-		if (i==0){
-			PKCK=T(N);     
-			PKCN=T(N);     
-	     
-			q.Zeros();	     
-			EP_FromTransformation(q,N);
-	     
-			r1=PKCN*r1;
-			r3=PKCN*r3;
-	     
-			for (int k=1;k<=3;k++){     
-				w(k)=omega[mappings[i]-1][k-1];
-			}	     
-	     
-			for (int k=1;k<=3;k++){
-				cart_r(k)=xcm[mappings[i]-1][k-1];		     
-				cart_v(k)=vcm[mappings[i]-1][k-1];
-			}
-			w=PKCN*w;     
-			EP_Derivatives(q,w,qdot);    
-		 
-		}                 
-		else{	     
-			PKCK=PKCN*N;   
-			PKCN=T(N);     
-    
-			q.Zeros();
-			EP_FromTransformation(q,PKCK);
-               
-			r1=PKCN*r1;
-			r3=PKCN*r3;
-     
-			for (int k=1;k<=3;k++){     
-				w(k)=omega[mapping[i]-1][k-1]-omega[mapping[i-1]-1][k-1];                         
-			}
-    	
-			w=PKCN*w; 
-			EP_Derivatives(q, w, qdot);        
-		}  
-        
-	
-		//-------------------------------------------------------------------------//    
-// Create bodies and joints with associated properties for POEMS
-		//-------------------------------------------------------------------------//
+  //-------------------------------------------------------------------------//
+  for(int i=0;imass=mass[mapping[i]-1];
+    IM(1,1)=inertia[mapping[i]-1][0];
+    IM(2,2)=inertia[mapping[i]-1][1];
+    IM(3,3)=inertia[mapping[i]-1][2];
+    IM(1,2)=0.0;
+    IM(1,3)=0.0;
+    IM(2,3)=0.0;
+    IM(2,1)=IM(1,2);
+    IM(3,1)=IM(1,3);
+    IM(3,2)=IM(2,3);
+    body->inertia = IM;
+
+    //-------------------------------------------------------//
+
+    for (int k=0;k<3;k++){
+      r1(k+1)=xh1[i][k]-xcm[mapping[i]-1][k];
+      r3(k+1)=xh2[i][k]-xcm[mapping[i]-1][k];
+    }
+    r2.Zeros();
+
+    for (int k=1;k<=3;k++){
+      N(k,1)=ex_space[mapping[i]-1][k-1];
+      N(k,2)=ey_space[mapping[i]-1][k-1];
+      N(k,3)=ez_space[mapping[i]-1][k-1];
+    }
+
+
+    if (i==0){
+      PKCK=T(N);
+      PKCN=T(N);
+
+      q.Zeros();
+      EP_FromTransformation(q,N);
+
+      r1=PKCN*r1;
+      r3=PKCN*r3;
+
+      for (int k=1;k<=3;k++){
+        w(k)=omega[mappings[i]-1][k-1];
+      }
+
+      for (int k=1;k<=3;k++){
+        cart_r(k)=xcm[mappings[i]-1][k-1];
+        cart_v(k)=vcm[mappings[i]-1][k-1];
+      }
+      w=PKCN*w;
+      EP_Derivatives(q,w,qdot);
+
+    }
+    else{
+      PKCK=PKCN*N;
+      PKCN=T(N);
+
+      q.Zeros();
+      EP_FromTransformation(q,PKCK);
+
+      r1=PKCN*r1;
+      r3=PKCN*r3;
+
+      for (int k=1;k<=3;k++){
+        w(k)=omega[mapping[i]-1][k-1]-omega[mapping[i-1]-1][k-1];
+      }
+
+      w=PKCN*w;
+      EP_Derivatives(q, w, qdot);
+    }
+
+
+    //-------------------------------------------------------------------------//
+// Create bodies and joints with associated properties for POEMS
+    //-------------------------------------------------------------------------//
+
+    point_CM = new FixedPoint(r2);
+    point_k = new FixedPoint(r1);
+    point_ch = new FixedPoint(r3);
+    body->AddPoint(point_CM);
+    body->AddPoint(point_k);
+    body->AddPoint(point_ch);
+    AddBody(body);
+
+    Mat3x3 One;
+    One.Identity();
+    if (i==0){
+      ColMatrix qq=Stack(q,cart_r);
+      ColMatrix vv=Stack(qdot,cart_v);
+      joint=new FreeBodyJoint;
+      AddJoint(joint);
+      joint->SetBodies(prev,body);
+      body->AddJoint(joint);
+      prev->AddJoint(joint);
+      joint->SetPoints(point_p,point_k);
+      joint->SetZeroOrientation(One);
+      joint->DimQandU(7,6);
+      joint->SetInitialState(qq,vv);
+      joint->ForwardKinematics();
+    }
+    else{
+      joint= new SphericalJoint;
+      AddJoint(joint);
+      joint->SetBodies(prev,body);
+      body->AddJoint(joint);
+      prev->AddJoint(joint);
+      joint->SetPoints(point_p,point_k);
+      joint->SetZeroOrientation(One);
+      joint->DimQandU(4,3);
+      joint->SetInitialState(q,qdot);
+      joint->ForwardKinematics();
+    }
+  }
+  for(int i = 0; i < b; i++)
+  {
+    delete [] xh1[i];
+    delete [] xh2[i];
+  }
+  delete [] xh1;
+  delete [] xh2;
 
-		point_CM = new FixedPoint(r2);
-		point_k = new FixedPoint(r1);
-		point_ch = new FixedPoint(r3);
-		body->AddPoint(point_CM);
-		body->AddPoint(point_k);
-		body->AddPoint(point_ch);
-		AddBody(body);    
-   
-		Mat3x3 One;
-		One.Identity();	
-		if (i==0){	  
-			ColMatrix qq=Stack(q,cart_r);
-			ColMatrix vv=Stack(qdot,cart_v);          
-			joint=new FreeBodyJoint;
-			AddJoint(joint);
-			joint->SetBodies(prev,body);
-			body->AddJoint(joint);
-			prev->AddJoint(joint);
-			joint->SetPoints(point_p,point_k);
-			joint->SetZeroOrientation(One);
-			joint->DimQandU(7,6);
-			joint->SetInitialState(qq,vv);  	  
-			joint->ForwardKinematics();  
-		}    
-		else{	     
-			joint= new SphericalJoint;
-			AddJoint(joint);
-			joint->SetBodies(prev,body);
-			body->AddJoint(joint);
-			prev->AddJoint(joint);
-			joint->SetPoints(point_p,point_k);          
-			joint->SetZeroOrientation(One);
-			joint->DimQandU(4,3);
-			joint->SetInitialState(q,qdot);
-			joint->ForwardKinematics();  
-		}
-	}
-	for(int i = 0; i < b; i++)
-	{
-		delete [] xh1[i];
-		delete [] xh2[i];
-	}
-	delete [] xh1;
-	delete [] xh2;
-  
 }
diff --git a/lib/poems/vect3.cpp b/lib/poems/vect3.cpp
index 03c5d7bc00..d0cb53ff15 100644
--- a/lib/poems/vect3.cpp
+++ b/lib/poems/vect3.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect3.cpp                                               *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -48,10 +48,10 @@ Vect3::Vect3(const VirtualMatrix& A){  // copy constructor
 }
 
 double& Vect3::operator_1int (int i){ // array access
-	if(i<1 || i>3){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
+  if(i<1 || i>3){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
   return elements[i-1];
 }
 
diff --git a/lib/poems/vect3.h b/lib/poems/vect3.h
index ababe18e51..0eb4450174 100644
--- a/lib/poems/vect3.h
+++ b/lib/poems/vect3.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect3.h                                              *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -78,7 +78,7 @@ public:
   friend void FastMult(Mat3x3& A, ColMatrix& B, Vect3& C);
   friend void FastAssign(ColMatrix&A, Vect3& C);
   friend void FastMult(Mat3x3& A, Vect3& B, ColMatrix& C);
-  
+
 };
 
 #endif
diff --git a/lib/poems/vect4.cpp b/lib/poems/vect4.cpp
index 3b5afddc50..86b014d129 100644
--- a/lib/poems/vect4.cpp
+++ b/lib/poems/vect4.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect4.cpp                                               *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/vect4.h b/lib/poems/vect4.h
index 695f5e158a..81a3c2143c 100644
--- a/lib/poems/vect4.h
+++ b/lib/poems/vect4.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect4.h                                                 *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -39,7 +39,7 @@ public:
   void BasicSet_1int(int i, double value);
   void BasicIncrement_1int(int i, double value);
 
-  
+
   void Const(double value);
   MatrixType GetType() const;
   std::ostream& WriteData(std::ostream& c) const;
diff --git a/lib/poems/vect6.cpp b/lib/poems/vect6.cpp
index eb65d24f16..e3fe07e1ea 100644
--- a/lib/poems/vect6.cpp
+++ b/lib/poems/vect6.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect6.cpp                                               *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -51,11 +51,11 @@ Vect6::Vect6(const VirtualMatrix& A){  // copy constructor
 }
 
 double& Vect6::operator_1int (int i){ // array access
-	if(i<1 || i>6){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
-	return elements[i-1];
+  if(i<1 || i>6){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
+  return elements[i-1];
 }
 
 double Vect6::Get_1int(int i) const{
diff --git a/lib/poems/vect6.h b/lib/poems/vect6.h
index c346c852ef..1127daf80e 100644
--- a/lib/poems/vect6.h
+++ b/lib/poems/vect6.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: vect6.h                                                 *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
diff --git a/lib/poems/virtualcolmatrix.cpp b/lib/poems/virtualcolmatrix.cpp
index 3a6c6e22cd..e004458731 100644
--- a/lib/poems/virtualcolmatrix.cpp
+++ b/lib/poems/virtualcolmatrix.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: virtualcolmatrix.cpp                                    *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -29,11 +29,11 @@ VirtualColMatrix::~VirtualColMatrix(){
 }
 
 double& VirtualColMatrix::operator_2int(int i, int j){
-	if(j!=1){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
-	return (*this).operator_1int(i);
+  if(j!=1){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
+  return (*this).operator_1int(i);
 }
 
 double VirtualColMatrix::Get_2int(int i, int j) const{
diff --git a/lib/poems/virtualmatrix.cpp b/lib/poems/virtualmatrix.cpp
index 19d5946961..938c69c037 100644
--- a/lib/poems/virtualmatrix.cpp
+++ b/lib/poems/virtualmatrix.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: virtualmatrix.cpp                                       *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -38,84 +38,84 @@ int VirtualMatrix::GetNumCols() const {
 }
 
 double& VirtualMatrix::operator() (int i, int j){ // array access
-	return operator_2int(i,j);
+  return operator_2int(i,j);
 }
 
 double VirtualMatrix::Get(int i, int j) const{
-	return Get_2int(i,j);
+  return Get_2int(i,j);
 }
 
 void VirtualMatrix::Set(int i, int j, double value){
-	Set_2int(i,j,value);
+  Set_2int(i,j,value);
 }
 
 double VirtualMatrix::BasicGet(int i, int j) const{
-	return BasicGet_2int(i,j);
+  return BasicGet_2int(i,j);
 }
 
 void VirtualMatrix::BasicSet(int i, int j, double value){
-	BasicSet_2int(i,j,value);
+  BasicSet_2int(i,j,value);
 }
 
 void VirtualMatrix::BasicIncrement(int i, int j, double value){
-	BasicIncrement_2int(i,j,value);
+  BasicIncrement_2int(i,j,value);
 }
 
 double& VirtualMatrix::operator() (int i){
-	return operator_1int(i);
+  return operator_1int(i);
 }
 
 double VirtualMatrix::Get(int i) const{
-	return Get_1int(i);
+  return Get_1int(i);
 }
 
 void VirtualMatrix::Set(int i, double value){
-	Set_1int(i, value);
+  Set_1int(i, value);
 }
 
 double VirtualMatrix::BasicGet(int i) const{
-	return BasicGet_1int(i);
+  return BasicGet_1int(i);
 }
 
 void VirtualMatrix::BasicSet(int i, double value){
-	BasicSet_1int(i, value);
+  BasicSet_1int(i, value);
 }
 
 void VirtualMatrix::BasicIncrement(int i, double value){
-	BasicIncrement_1int(i, value);
+  BasicIncrement_1int(i, value);
 }
 
 double& VirtualMatrix::operator_1int (int i) {
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
-	return *(new double);
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
+  return *(new double);
 }
 
 double VirtualMatrix::Get_1int(int i) const {
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
-	return 0.0;
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
+  return 0.0;
 }
 
 void VirtualMatrix::Set_1int(int i, double value){
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
 }
 
 double VirtualMatrix::BasicGet_1int(int i) const {
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
-	return 0.0;
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
+  return 0.0;
 }
 
 void VirtualMatrix::BasicSet_1int(int i, double value) {
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
 }
 
 void VirtualMatrix::BasicIncrement_1int(int i, double value){
-	cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
-	exit(0);
+  cerr << "Error: single dimensional access is not defined for matrices of type " << GetType() << endl;
+  exit(0);
 }
 
 void VirtualMatrix::Zeros(){
@@ -132,8 +132,8 @@ ostream& VirtualMatrix::WriteData(ostream& c) const {
 }
 
 istream& VirtualMatrix::ReadData(istream& c){
-	cerr << "Error: no input definition for matrices of type " << GetType() << endl;
-	exit(0);
+  cerr << "Error: no input definition for matrices of type " << GetType() << endl;
+  exit(0);
 }
 
 //
diff --git a/lib/poems/virtualrowmatrix.cpp b/lib/poems/virtualrowmatrix.cpp
index 1a12cfbfd9..6d2976a584 100644
--- a/lib/poems/virtualrowmatrix.cpp
+++ b/lib/poems/virtualrowmatrix.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: virtualrowmatrix.cpp                                    *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -30,10 +30,10 @@ VirtualRowMatrix::~VirtualRowMatrix(){
 }
 
 double& VirtualRowMatrix::operator_2int (int i, int j){
-	if(i!=1){
-		cerr << "matrix index invalid in operator ()" << endl;
-		exit(1);
-	}
+  if(i!=1){
+    cerr << "matrix index invalid in operator ()" << endl;
+    exit(1);
+  }
   return (*this).operator_1int(j);
 }
 
diff --git a/lib/poems/virtualrowmatrix.h b/lib/poems/virtualrowmatrix.h
index 68b39f137d..9b1a3bbc44 100644
--- a/lib/poems/virtualrowmatrix.h
+++ b/lib/poems/virtualrowmatrix.h
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: virtualrowmatrix.h                                      *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -22,7 +22,7 @@
 #include "virtualmatrix.h"
 
 class VirtualRowMatrix : public VirtualMatrix  {
-public: 
+public:
   VirtualRowMatrix();
   ~VirtualRowMatrix();
   double& operator_2int (int i, int j); // array access
@@ -31,7 +31,7 @@ public:
   double BasicGet_2int(int i, int j) const;
   void BasicSet_2int(int i, int j, double value);
   void BasicIncrement_2int(int i, int j, double value);
-  
+
   virtual double& operator_1int (int i) = 0; // array access
   virtual double Get_1int(int i) const = 0;
   virtual void Set_1int(int i, double value) = 0;
diff --git a/lib/poems/workspace.cpp b/lib/poems/workspace.cpp
index 21819d4c02..655772b954 100644
--- a/lib/poems/workspace.cpp
+++ b/lib/poems/workspace.cpp
@@ -3,7 +3,7 @@
  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
  *      DESCRIPTION: SEE READ-ME                                           *
  *      FILE NAME: workspace.cpp                                           *
- *      AUTHORS: See Author List                                           * 
+ *      AUTHORS: See Author List                                           *
  *      GRANTS: See Grants List                                            *
  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
  *      LICENSE: Please see License Agreement                              *
@@ -11,7 +11,7 @@
  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
  *                     Computational Dynamics Lab                          *
  *                     Rensselaer Polytechnic Institute                    *
- *                     110 8th St. Troy NY 12180                           * 
+ *                     110 8th St. Troy NY 12180                           *
  *      CONTACT:        anderk5@rpi.edu                                    *
  *_________________________________________________________________________*/
 
@@ -32,34 +32,34 @@ void Workspace::allocateNewSystem() {
   currentIndex++;
   if(currentIndex < maxAlloc)
   {
-	  system[currentIndex].system = new System;
+    system[currentIndex].system = new System;
   }
   else
   {
-	  maxAlloc = (maxAlloc + 1) * 2; 
-									 
-	  SysData * tempPtrSys = new SysData[maxAlloc];
-	  for(int i = 0; i < currentIndex; i++)
-	  {
-		  tempPtrSys[i] = system[i];
-	  }
-	  delete [] system;				  
-	  system = tempPtrSys;
-	  system[currentIndex].system = new System; 
+    maxAlloc = (maxAlloc + 1) * 2;
+
+    SysData * tempPtrSys = new SysData[maxAlloc];
+    for(int i = 0; i < currentIndex; i++)
+    {
+      tempPtrSys[i] = system[i];
+    }
+    delete [] system;
+    system = tempPtrSys;
+    system[currentIndex].system = new System;
   }
 }
 
 Workspace::Workspace(){
-	currentIndex = -1; 
-	maxAlloc = 0;		
-	system = nullptr;		
+  currentIndex = -1;
+  maxAlloc = 0;
+  system = nullptr;
 }
 
 Workspace::~Workspace(){
   for(int i = 0; i <= currentIndex; i++){
-	  delete system[i].system;
+    delete system[i].system;
   }
-  delete [] system;						
+  delete [] system;
 }
 
 
@@ -79,111 +79,111 @@ bool Workspace::LoadFile(char* filename){
 }
 
 void Workspace::SetLammpsValues(double dtv, double dthalf, double tempcon){
-	Thalf = dthalf;
-	Tfull = dtv;
-	ConFac = tempcon;	
+  Thalf = dthalf;
+  Tfull = dtv;
+  ConFac = tempcon;
 }
 
 
 bool Workspace::MakeSystem(int& nbody, double *&masstotal, double **&inertia, double **&xcm, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space, int &njoint, int **&jointbody, double **&xjoint, int& nfree, int*freelist, double dthalf, double dtv, double tempcon, double KE){
-	
-	SetLammpsValues(dtv, dthalf, tempcon);		
-	
-if(njoint){		
-	SystemProcessor sys;	
-	sys.processArray(jointbody, njoint);  	
-	List * results = sys.getSystemData();		
 
-	int numsyschains = results->GetNumElements();	
-	int headvalue = 0;
-	List * newresults = results;	
-	ListElement * tempNode = results->GetHeadElement();			
-	int stop = 1;
-	int counter = 1;
-	for(int n = 1; n<=numsyschains; n++){						
-		while(stop){			
-			if ( (*(tempNode->value->listOfNodes.GetHeadElement()->value) == (headvalue+1) ) || (*(tempNode->value->listOfNodes.GetTailElement()->value) == (headvalue+1) ) ) {			
-			newresults->Append(tempNode->value);								
-			headvalue = headvalue + tempNode->value->listOfNodes.GetNumElements();						
-			tempNode = results->GetHeadElement();					
-			stop = 0;			
-			counter ++;						
-		}		
-		else{						
-			tempNode = tempNode->next;						
-		}				
-		}
-		stop=1;			
-	}		
-	
-	ListElement * TNode = newresults->GetHeadElement();
-	ListElement * TTNode = newresults->GetHeadElement();
-	for(int kk=1; kk<=numsyschains; kk++){		
-		if(kk!=numsyschains)
-			TTNode = TNode->next;
-		newresults->Remove(TNode);			
-		if(kk!=numsyschains)
-			TNode = TTNode;		
-	}
-	ListElement * NodeValue = newresults->GetHeadElement();
-	int count = 0; 	
-	int * array;
-	int ** arrayFromChain;
-	int numElementsInSystem;
-	int ttk = 0;
-	
-		
-	while(NodeValue != nullptr) {
-		array = new int[NodeValue->value->listOfNodes.GetNumElements()];
-		arrayFromChain = NodeValue->value->listOfNodes.CreateArray();
-		numElementsInSystem = NodeValue->value->listOfNodes.GetNumElements();								
-		for(counter = 0; counter < numElementsInSystem; counter++){
-			array[counter] = *arrayFromChain[counter];
-		}
-				
-		SetKE(1,KE);
-		allocateNewSystem();			
-		system[currentIndex].system->Create_System_LAMMPS(nbody,masstotal,inertia,xcm,xjoint,vcm,omega,ex_space,ey_space,ez_space, numElementsInSystem, array, count);					
-		
-		system[currentIndex].solver = ONSOLVER;
-		ttk = ttk + 1;		
-		count = ttk;
-		delete [] array;
-		delete [] arrayFromChain;
-		NodeValue= NodeValue->next;						
-	}
+  SetLammpsValues(dtv, dthalf, tempcon);
+
+if(njoint){
+  SystemProcessor sys;
+  sys.processArray(jointbody, njoint);
+  List * results = sys.getSystemData();
+
+  int numsyschains = results->GetNumElements();
+  int headvalue = 0;
+  List * newresults = results;
+  ListElement * tempNode = results->GetHeadElement();
+  int stop = 1;
+  int counter = 1;
+  for(int n = 1; n<=numsyschains; n++){
+    while(stop){
+      if ( (*(tempNode->value->listOfNodes.GetHeadElement()->value) == (headvalue+1) ) || (*(tempNode->value->listOfNodes.GetTailElement()->value) == (headvalue+1) ) ) {
+      newresults->Append(tempNode->value);
+      headvalue = headvalue + tempNode->value->listOfNodes.GetNumElements();
+      tempNode = results->GetHeadElement();
+      stop = 0;
+      counter ++;
+    }
+    else{
+      tempNode = tempNode->next;
+    }
+    }
+    stop=1;
+  }
+
+  ListElement * TNode = newresults->GetHeadElement();
+  ListElement * TTNode = newresults->GetHeadElement();
+  for(int kk=1; kk<=numsyschains; kk++){
+    if(kk!=numsyschains)
+      TTNode = TNode->next;
+    newresults->Remove(TNode);
+    if(kk!=numsyschains)
+      TNode = TTNode;
+  }
+  ListElement * NodeValue = newresults->GetHeadElement();
+  int count = 0;
+  int * array;
+  int ** arrayFromChain;
+  int numElementsInSystem;
+  int ttk = 0;
+
+
+  while(NodeValue != nullptr) {
+    array = new int[NodeValue->value->listOfNodes.GetNumElements()];
+    arrayFromChain = NodeValue->value->listOfNodes.CreateArray();
+    numElementsInSystem = NodeValue->value->listOfNodes.GetNumElements();
+    for(counter = 0; counter < numElementsInSystem; counter++){
+      array[counter] = *arrayFromChain[counter];
+    }
+
+    SetKE(1,KE);
+    allocateNewSystem();
+    system[currentIndex].system->Create_System_LAMMPS(nbody,masstotal,inertia,xcm,xjoint,vcm,omega,ex_space,ey_space,ez_space, numElementsInSystem, array, count);
+
+    system[currentIndex].solver = ONSOLVER;
+    ttk = ttk + 1;
+    count = ttk;
+    delete [] array;
+    delete [] arrayFromChain;
+    NodeValue= NodeValue->next;
+  }
 }
 if(nfree){
-	MakeDegenerateSystem(nfree,freelist,masstotal,inertia,xcm,vcm,omega,ex_space,ey_space,ez_space);
+  MakeDegenerateSystem(nfree,freelist,masstotal,inertia,xcm,vcm,omega,ex_space,ey_space,ez_space);
 }
-	return true;
+  return true;
 }
 
 
 bool Workspace::MakeDegenerateSystem(int& nfree, int*freelist, double *&masstotal, double **&inertia, double **&xcm, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space){
-	allocateNewSystem();
-	system[currentIndex].system->Create_DegenerateSystem(nfree,freelist,masstotal,inertia,xcm,vcm,omega,ex_space,ey_space,ez_space);
-	system[currentIndex].solver = ONSOLVER;
-	return true;			
-} 
+  allocateNewSystem();
+  system[currentIndex].system->Create_DegenerateSystem(nfree,freelist,masstotal,inertia,xcm,vcm,omega,ex_space,ey_space,ez_space);
+  system[currentIndex].solver = ONSOLVER;
+  return true;
+}
 
-bool Workspace::SaveFile(char* filename, int index){ 
+bool Workspace::SaveFile(char* filename, int index){
   if(index < 0){
-	  index = currentIndex; 
+    index = currentIndex;
   }
   ofstream file;
 
   file.open(filename, ofstream::out);
-  
+
   if( !file.is_open() ){
     cerr << "File '" << filename << "' could not be opened." << endl;
     return false;
   }
   if(index >= 0 && index <= currentIndex){
-	  system[index].system->WriteOut(file);
+    system[index].system->WriteOut(file);
   }
   else {
-	  cerr << "Error, requested system index " << index << ", minimum index 0 and maximum index " << currentIndex << endl;
+    cerr << "Error, requested system index " << index << ", minimum index 0 and maximum index " << currentIndex << endl;
   }
   file.close();
   return true;
@@ -191,299 +191,299 @@ bool Workspace::SaveFile(char* filename, int index){
 
 
 System* Workspace::GetSystem(int index){
-	if(index <= currentIndex){
-		if(index >= 0){
-			return system[index].system;			
-		}
-		else{
-			return system[currentIndex].system; 
-		}
-	}
-	else{
-		return nullptr;
-	}
+  if(index <= currentIndex){
+    if(index >= 0){
+      return system[index].system;
+    }
+    else{
+      return system[currentIndex].system;
+    }
+  }
+  else{
+    return nullptr;
+  }
 }
 
 void Workspace::AddSolver(Solver* s, int index){
-	if(currentIndex >= index){
-		if(index >= 0){
-			system[index].solver = (int)s->GetSolverType();
-		}
-		else{
-			system[currentIndex].solver = (int)s->GetSolverType();
-		}
-	}
-	else{
-		cout << "Error adding solver to index " << index << endl;
-	}
+  if(currentIndex >= index){
+    if(index >= 0){
+      system[index].solver = (int)s->GetSolverType();
+    }
+    else{
+      system[currentIndex].solver = (int)s->GetSolverType();
+    }
+  }
+  else{
+    cout << "Error adding solver to index " << index << endl;
+  }
 }
 
 int Workspace::getNumberOfSystems(){
-	return currentIndex + 1;
+  return currentIndex + 1;
 }
 
 
 
-void Workspace::SetKE(int temp, double SysKE){	
+void Workspace::SetKE(int temp, double SysKE){
 KE_val = SysKE;
 FirstTime =temp;
 }
-    
+
 
 void Workspace::LobattoOne(double **&xcm, double **&vcm,double **&omega,double **&torque, double **&fcm, double **&ex_space, double **&ey_space, double **&ez_space){
-	
-	int numsys = currentIndex;
-	int numbodies;
-	double time = 0.0;
-	int * mappings;
-	double SysKE=0.0;
-		
-	for (int i = 0; i <= numsys; i++){
-		mappings = system[i].system->GetMappings();
-		numbodies = system[i].system->GetNumBodies() - 1;
-		Matrix FF(6,numbodies);
-		FF.Zeros();
-		for (int j=1; j<=numbodies; j++){
-			FF(1,j)  = torque[mappings[j - 1]-1][0]*ConFac;
-			FF(2,j)  = torque[mappings[j - 1]-1][1]*ConFac;
-			FF(3,j)  = torque[mappings[j - 1]-1][2]*ConFac;
-			
-			FF(4,j)  = fcm[mappings[j - 1]-1][0]*ConFac;
-			FF(5,j)  = fcm[mappings[j - 1]-1][1]*ConFac;
-			FF(6,j)  = fcm[mappings[j - 1]-1][2]*ConFac;
-		}
-		
-		//------------------------------------//
-		// Get a solver and solve that system.
-		Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);				
-		theSolver->SetSystem(system[i].system);	
-		theSolver->Solve(time, FF);	
-		
-		
-		theSolver->Solve(time, FF);		
-		ColMatrix tempx = *((*theSolver).GetState());
-		ColMatrix tempv = *((*theSolver).GetStateDerivative());
-		ColMatrix tempa = *((*theSolver).GetStateDerivativeDerivative());
-		
-		
-		for(int numint =0 ; numint<3; numint++){
-			theSolver->Solve(time, FF);
-			tempa = *((*theSolver).GetStateDerivativeDerivative());
-			*((*theSolver).GetStateDerivative())= tempv + Thalf*tempa;
-		}
-		
-		ColMatrix TempV= *((*theSolver).GetStateDerivative());
-		*((*theSolver).GetState())= tempx + Tfull*TempV;
-				
-		int numjoints = system[i].system->joints.GetNumElements();
-		for(int k = 0; k < numjoints; k++){
-			system[i].system->joints(k)->ForwardKinematics();
-		}		
-		
-		for(int k = 0; k < numbodies; k++){
-			Vect3 temp1 =system[i].system->bodies(k+1)->r;
-			Vect3 temp2 =system[i].system->bodies(k+1)->v;
-			Vect3 temp3 =system[i].system->bodies(k+1)->omega;
-			Mat3x3 temp4 =system[i].system->bodies(k+1)->n_C_k;			
-			for(int m = 0; m < 3; m++){
-				xcm[mappings[k]-1][m]   = temp1(m+1);
-				vcm[mappings[k]-1][m]   = temp2(m+1);
-				omega[mappings[k]-1][m] = temp3(m+1);				
-				ex_space[mappings[k]-1][m] = temp4(m+1,1);				
-				ey_space[mappings[k]-1][m] = temp4(m+1,2);
-				ez_space[mappings[k]-1][m] = temp4(m+1,3);				
-			}			
-			SysKE = SysKE + system[i].system->bodies(k+1)->KE;
-		} 		
-		delete theSolver;		      
-	}	
+
+  int numsys = currentIndex;
+  int numbodies;
+  double time = 0.0;
+  int * mappings;
+  double SysKE=0.0;
+
+  for (int i = 0; i <= numsys; i++){
+    mappings = system[i].system->GetMappings();
+    numbodies = system[i].system->GetNumBodies() - 1;
+    Matrix FF(6,numbodies);
+    FF.Zeros();
+    for (int j=1; j<=numbodies; j++){
+      FF(1,j)  = torque[mappings[j - 1]-1][0]*ConFac;
+      FF(2,j)  = torque[mappings[j - 1]-1][1]*ConFac;
+      FF(3,j)  = torque[mappings[j - 1]-1][2]*ConFac;
+
+      FF(4,j)  = fcm[mappings[j - 1]-1][0]*ConFac;
+      FF(5,j)  = fcm[mappings[j - 1]-1][1]*ConFac;
+      FF(6,j)  = fcm[mappings[j - 1]-1][2]*ConFac;
+    }
+
+    //------------------------------------//
+    // Get a solver and solve that system.
+    Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);
+    theSolver->SetSystem(system[i].system);
+    theSolver->Solve(time, FF);
+
+
+    theSolver->Solve(time, FF);
+    ColMatrix tempx = *((*theSolver).GetState());
+    ColMatrix tempv = *((*theSolver).GetStateDerivative());
+    ColMatrix tempa = *((*theSolver).GetStateDerivativeDerivative());
+
+
+    for(int numint =0 ; numint<3; numint++){
+      theSolver->Solve(time, FF);
+      tempa = *((*theSolver).GetStateDerivativeDerivative());
+      *((*theSolver).GetStateDerivative())= tempv + Thalf*tempa;
+    }
+
+    ColMatrix TempV= *((*theSolver).GetStateDerivative());
+    *((*theSolver).GetState())= tempx + Tfull*TempV;
+
+    int numjoints = system[i].system->joints.GetNumElements();
+    for(int k = 0; k < numjoints; k++){
+      system[i].system->joints(k)->ForwardKinematics();
+    }
+
+    for(int k = 0; k < numbodies; k++){
+      Vect3 temp1 =system[i].system->bodies(k+1)->r;
+      Vect3 temp2 =system[i].system->bodies(k+1)->v;
+      Vect3 temp3 =system[i].system->bodies(k+1)->omega;
+      Mat3x3 temp4 =system[i].system->bodies(k+1)->n_C_k;
+      for(int m = 0; m < 3; m++){
+        xcm[mappings[k]-1][m]   = temp1(m+1);
+        vcm[mappings[k]-1][m]   = temp2(m+1);
+        omega[mappings[k]-1][m] = temp3(m+1);
+        ex_space[mappings[k]-1][m] = temp4(m+1,1);
+        ey_space[mappings[k]-1][m] = temp4(m+1,2);
+        ez_space[mappings[k]-1][m] = temp4(m+1,3);
+      }
+      SysKE = SysKE + system[i].system->bodies(k+1)->KE;
+    }
+    delete theSolver;
+  }
 }
 
 void Workspace::LobattoTwo(double **&vcm,double **&omega,double **&torque, double **&fcm){
-	int numsys = currentIndex;
-	int numbodies;				
-	double time = 0.0;   
-	int * mappings;
-	double SysKE =0.0;		
-	for (int i = 0; i <= numsys; i++){
-		mappings = system[i].system->GetMappings();
-		numbodies = system[i].system->GetNumBodies() - 1;
-		Matrix FF(6,numbodies);				
-				
-		for (int j=1; j<=numbodies; j++){
-			FF(1,j)  = torque[mappings[j - 1]-1][0]*ConFac;
-			FF(2,j)  = torque[mappings[j - 1]-1][1]*ConFac;
-			FF(3,j)  = torque[mappings[j - 1]-1][2]*ConFac;
-			FF(4,j)  = fcm[mappings[j - 1]-1][0]*ConFac;
-			FF(5,j)  = fcm[mappings[j - 1]-1][1]*ConFac;
-			FF(6,j)  = fcm[mappings[j - 1]-1][2]*ConFac;
-		}			
-		
-		//------------------------------------//
-		// Get a solver and solve that system.		
-		Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);		
-		theSolver->SetSystem(system[i].system);    			
-		theSolver->Solve(time, FF);		
-		ColMatrix tempv = *((*theSolver).GetStateDerivative());
-		ColMatrix tempa = *((*theSolver).GetStateDerivativeDerivative());
-		*((*theSolver).GetStateDerivative()) = tempv + Thalf*tempa;
-		
-						
-		int numjoints = system[i].system->joints.GetNumElements();
-		for(int k = 0; k < numjoints; k++){
-			system[i].system->joints(k)->ForwardKinematics(); 
-		}				
-		    		
-		for(int k = 0; k < numbodies; k++){
-			Vect3 temp1 =system[i].system->bodies(k+1)->r;			
-			Vect3 temp2 =system[i].system->bodies(k+1)->v;	    	
-			Vect3 temp3 =system[i].system->bodies(k+1)->omega;
-			SysKE = SysKE + system[i].system->bodies(k+1)->KE;
-			for(int m = 0; m < 3; m++){
-				vcm[mappings[k]-1][m]   = temp2(m+1);
-				omega[mappings[k]-1][m] = temp3(m+1);
-			}			
-		}
-		delete theSolver;
-	}	
+  int numsys = currentIndex;
+  int numbodies;
+  double time = 0.0;
+  int * mappings;
+  double SysKE =0.0;
+  for (int i = 0; i <= numsys; i++){
+    mappings = system[i].system->GetMappings();
+    numbodies = system[i].system->GetNumBodies() - 1;
+    Matrix FF(6,numbodies);
+
+    for (int j=1; j<=numbodies; j++){
+      FF(1,j)  = torque[mappings[j - 1]-1][0]*ConFac;
+      FF(2,j)  = torque[mappings[j - 1]-1][1]*ConFac;
+      FF(3,j)  = torque[mappings[j - 1]-1][2]*ConFac;
+      FF(4,j)  = fcm[mappings[j - 1]-1][0]*ConFac;
+      FF(5,j)  = fcm[mappings[j - 1]-1][1]*ConFac;
+      FF(6,j)  = fcm[mappings[j - 1]-1][2]*ConFac;
+    }
+
+    //------------------------------------//
+    // Get a solver and solve that system.
+    Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);
+    theSolver->SetSystem(system[i].system);
+    theSolver->Solve(time, FF);
+    ColMatrix tempv = *((*theSolver).GetStateDerivative());
+    ColMatrix tempa = *((*theSolver).GetStateDerivativeDerivative());
+    *((*theSolver).GetStateDerivative()) = tempv + Thalf*tempa;
+
+
+    int numjoints = system[i].system->joints.GetNumElements();
+    for(int k = 0; k < numjoints; k++){
+      system[i].system->joints(k)->ForwardKinematics();
+    }
+
+    for(int k = 0; k < numbodies; k++){
+      Vect3 temp1 =system[i].system->bodies(k+1)->r;
+      Vect3 temp2 =system[i].system->bodies(k+1)->v;
+      Vect3 temp3 =system[i].system->bodies(k+1)->omega;
+      SysKE = SysKE + system[i].system->bodies(k+1)->KE;
+      for(int m = 0; m < 3; m++){
+        vcm[mappings[k]-1][m]   = temp2(m+1);
+        omega[mappings[k]-1][m] = temp3(m+1);
+      }
+    }
+    delete theSolver;
+  }
 }
 
-    
- 
+
+
   void Workspace::RKStep(double **&xcm, double **&vcm,double **&omega,double **&torque, double **&fcm, double **&ex_space, double **&ey_space, double **&ez_space){
-	
-	  double a[6];
-	  double b[6][6];
-	  double c[6];
-	  //double e[6];
-	 
-	  a[1] = 0.2;
-	  a[2] = 0.3;
-	  a[3] = 0.6;
-	  a[4] = 1.0;
-	  a[5] = 0.875;
 
-	  b[1][0] = 0.2;
-	  b[2][0] = 0.075;           b[2][1] = 0.225;
-	  b[3][0] = 0.3;             b[3][1] = -0.9;        b[3][2] = 1.2;
-	  b[4][0] = -11.0/54.0;      b[4][1] = 2.5;         b[4][2] = -70.0/27.0;    b[4][3] = 35.0/27.0;
-	  b[5][0] = 1631.0/55296.0; b[5][1] = 175.0/512.0; b[5][2] = 575.0/13824.0; b[5][3] = 44275.0/110592.0; b[5][4] = 253.0/4096.0;
+    double a[6];
+    double b[6][6];
+    double c[6];
+    //double e[6];
 
-	  c[0] = 37.0/378.0;
-	  c[1] = 0.0;
-	  c[2] = 250.0/621.0;
-	  c[3] = 125.0/594.0;
-	  c[4] = 0.0;
-	  c[5] = 512.0/1771.0;
+    a[1] = 0.2;
+    a[2] = 0.3;
+    a[3] = 0.6;
+    a[4] = 1.0;
+    a[5] = 0.875;
 
-	  int numsys = currentIndex; 
-	  int numbodies;				
-	  double time = 0.0;   
-	  int * mappings;
-	  double SysKE =0.0;
+    b[1][0] = 0.2;
+    b[2][0] = 0.075;           b[2][1] = 0.225;
+    b[3][0] = 0.3;             b[3][1] = -0.9;        b[3][2] = 1.2;
+    b[4][0] = -11.0/54.0;      b[4][1] = 2.5;         b[4][2] = -70.0/27.0;    b[4][3] = 35.0/27.0;
+    b[5][0] = 1631.0/55296.0; b[5][1] = 175.0/512.0; b[5][2] = 575.0/13824.0; b[5][3] = 44275.0/110592.0; b[5][4] = 253.0/4096.0;
 
-	  
-	  for (int i = 0; i <= numsys; i++){
-		  mappings = system[i].system->GetMappings();  
+    c[0] = 37.0/378.0;
+    c[1] = 0.0;
+    c[2] = 250.0/621.0;
+    c[3] = 125.0/594.0;
+    c[4] = 0.0;
+    c[5] = 512.0/1771.0;
 
-		  numbodies = system[i].system->GetNumBodies() - 1;
-		  Matrix FF(6,numbodies);
-		  for (int j=1; j<=numbodies; j++){
-			  FF(1,j)  = ConFac*torque[mappings[j - 1]-1][0];
-			  FF(2,j)  = ConFac*torque[mappings[j - 1]-1][1];
-			  FF(3,j)  = ConFac*torque[mappings[j - 1]-1][2];            			   
+    int numsys = currentIndex;
+    int numbodies;
+    double time = 0.0;
+    int * mappings;
+    double SysKE =0.0;
 
-			  FF(4,j)  = ConFac*fcm[mappings[j - 1]-1][0];
-			  FF(5,j)  = ConFac*fcm[mappings[j - 1]-1][1];
-			  FF(6,j)  = ConFac*fcm[mappings[j - 1]-1][2];
-		  }					  
-		
-		
-		  //------------------------------------//
-		// Get a solver and solve that system.		
-		  Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);		
-		  theSolver->SetSystem(system[i].system);    			
-		  theSolver->Solve(time, FF);	
-	
-		  ColMatrix initial_x;  
-		  ColMatrix initial_xdot;
-		  ColMatMap* x;
-		  ColMatMap* xdot;
-		  ColMatMap* xdotdot;
-	
-		  x = theSolver->GetState();  
-		  xdot = theSolver->GetStateDerivative();
-		  xdotdot=theSolver->GetStateDerivativeDerivative(); 
-	
-		  initial_x = *x;  
-		  initial_xdot = *xdot;  
-		  ColMatrix f[6];
-		  ColMatrix ff[6];
-	
-		  ff[0] = initial_xdot; 
-		  f[0] = *xdotdot; 
-	
-		  for(int ii=1;ii<6;ii++){
-			  time = a[ii] * Tfull;		
-			  (*x) = initial_x;		
-			  (*xdot) = initial_xdot;		
-			  for(int j=0;jSolve(time,FF);    
-			  f[ii] = (*xdotdot);
-			  ff[ii] = (*xdot);
-		  }  	
-  
-	
-		  (*x) = initial_x + (c[0]*Tfull)*ff[0] + (c[2]*Tfull)*ff[2] + (c[3]*Tfull)*ff[3] + (c[5]*Tfull)*ff[5];  
-	
-		  (*xdot) = initial_xdot + (c[0]*Tfull)*f[0] + (c[2]*Tfull)*f[2] + (c[3]*Tfull)*f[3] + (c[5]*Tfull)*f[5];  
-	
-	
-		  int numjoints = system[i].system->joints.GetNumElements();
-		  for(int k = 0; k < numjoints; k++){
-			  system[i].system->joints(k)->ForwardKinematics();
-		  }		      
-						      	
-		
-		  for(int k = 0; k < numbodies; k++){
-			  Vect3 temp1 =system[i].system->bodies(k+1)->r;
-			  Vect3 temp2 =system[i].system->bodies(k+1)->v;
-			  Vect3 temp3 =system[i].system->bodies(k+1)->omega;
-			  Mat3x3 temp4 =system[i].system->bodies(k+1)->n_C_k;
-			  SysKE = SysKE + system[i].system->bodies(k+1)->KE;			  
-			  for(int m = 0; m < 3; m++){
-				  xcm[mappings[k]-1][m]   = temp1(m+1);
-				  vcm[mappings[k]-1][m]   = temp2(m+1);
-				  omega[mappings[k]-1][m] = temp3(m+1);
-				
-				  ex_space[mappings[k]-1][m] = temp4(m+1,1);				
-				  ey_space[mappings[k]-1][m] = temp4(m+1,2);
-				  ez_space[mappings[k]-1][m] = temp4(m+1,3);
-			  }         
-		  } 		
-		  delete theSolver;		      
-	  }	 	
+
+    for (int i = 0; i <= numsys; i++){
+      mappings = system[i].system->GetMappings();
+
+      numbodies = system[i].system->GetNumBodies() - 1;
+      Matrix FF(6,numbodies);
+      for (int j=1; j<=numbodies; j++){
+        FF(1,j)  = ConFac*torque[mappings[j - 1]-1][0];
+        FF(2,j)  = ConFac*torque[mappings[j - 1]-1][1];
+        FF(3,j)  = ConFac*torque[mappings[j - 1]-1][2];
+
+        FF(4,j)  = ConFac*fcm[mappings[j - 1]-1][0];
+        FF(5,j)  = ConFac*fcm[mappings[j - 1]-1][1];
+        FF(6,j)  = ConFac*fcm[mappings[j - 1]-1][2];
+      }
+
+
+      //------------------------------------//
+    // Get a solver and solve that system.
+      Solver * theSolver = Solver::GetSolver((SolverType)system[i].solver);
+      theSolver->SetSystem(system[i].system);
+      theSolver->Solve(time, FF);
+
+      ColMatrix initial_x;
+      ColMatrix initial_xdot;
+      ColMatMap* x;
+      ColMatMap* xdot;
+      ColMatMap* xdotdot;
+
+      x = theSolver->GetState();
+      xdot = theSolver->GetStateDerivative();
+      xdotdot=theSolver->GetStateDerivativeDerivative();
+
+      initial_x = *x;
+      initial_xdot = *xdot;
+      ColMatrix f[6];
+      ColMatrix ff[6];
+
+      ff[0] = initial_xdot;
+      f[0] = *xdotdot;
+
+      for(int ii=1;ii<6;ii++){
+        time = a[ii] * Tfull;
+        (*x) = initial_x;
+        (*xdot) = initial_xdot;
+        for(int j=0;jSolve(time,FF);
+        f[ii] = (*xdotdot);
+        ff[ii] = (*xdot);
+      }
+
+
+      (*x) = initial_x + (c[0]*Tfull)*ff[0] + (c[2]*Tfull)*ff[2] + (c[3]*Tfull)*ff[3] + (c[5]*Tfull)*ff[5];
+
+      (*xdot) = initial_xdot + (c[0]*Tfull)*f[0] + (c[2]*Tfull)*f[2] + (c[3]*Tfull)*f[3] + (c[5]*Tfull)*f[5];
+
+
+      int numjoints = system[i].system->joints.GetNumElements();
+      for(int k = 0; k < numjoints; k++){
+        system[i].system->joints(k)->ForwardKinematics();
+      }
+
+
+      for(int k = 0; k < numbodies; k++){
+        Vect3 temp1 =system[i].system->bodies(k+1)->r;
+        Vect3 temp2 =system[i].system->bodies(k+1)->v;
+        Vect3 temp3 =system[i].system->bodies(k+1)->omega;
+        Mat3x3 temp4 =system[i].system->bodies(k+1)->n_C_k;
+        SysKE = SysKE + system[i].system->bodies(k+1)->KE;
+        for(int m = 0; m < 3; m++){
+          xcm[mappings[k]-1][m]   = temp1(m+1);
+          vcm[mappings[k]-1][m]   = temp2(m+1);
+          omega[mappings[k]-1][m] = temp3(m+1);
+
+          ex_space[mappings[k]-1][m] = temp4(m+1,1);
+          ey_space[mappings[k]-1][m] = temp4(m+1,2);
+          ez_space[mappings[k]-1][m] = temp4(m+1,3);
+        }
+      }
+      delete theSolver;
+    }
   }
 
 
 void Workspace::WriteFile(char * filename){
-	int numsys = currentIndex; 
-	int numbodies;				
-		  
-	
-	for (int i = 0; i <= numsys; i++){
-		numbodies = system[i].system->GetNumBodies() - 1;  	
-		ofstream outfile;
-		outfile.open(filename,ofstream::out | ios::app);		
-		outfile << numbodies<bodies(k+1)->r;
-			outfile<<1<<"\t"<GetNumBodies() - 1;
+    ofstream outfile;
+    outfile.open(filename,ofstream::out | ios::app);
+    outfile << numbodies<bodies(k+1)->r;
+      outfile<<1<<"\t"< for the Makefile 
+directory and now edit the Makefile. for the Makefile
 configuration used to compile LAMMPS and also update the directory
 and library settings for the Quantum ESPRESSO installation.
 
@@ -182,7 +182,7 @@ flags that will need to be used in addition to the various libraries
 from _both_ packages. Please see the provided example(s).
 
 "make -f Makefile. all" will now recurse through both the
-Quantum ESPRESSO and LAMMPS directories to compile all files that 
+Quantum ESPRESSO and LAMMPS directories to compile all files that
 require recompilation and then link the combined QM/MM executable.
 
 If you want to only update the local objects and the QM/MM executable,
@@ -190,7 +190,7 @@ you can use "make -f Makefile. pwqmmm.x"
 
 Please refer to the specific LAMMPS and Quantum ESPRESSO documentation
 for details on how to set up compilation for each package and make
-sure you have a set of settings and flags that allow you to build 
+sure you have a set of settings and flags that allow you to build
 each package successfully, so that it can run on its own.
 
 -------------------------------------------------
@@ -253,7 +253,7 @@ this is a regular input which in addition contains the line
 
 tqmmm = .true.
 
-in the &CONTROL namelist. This will make the include QE code 
+in the &CONTROL namelist. This will make the include QE code
 connect to the LAMMPS code and receive updated positions while
 it sends QM forces back to the MM code.
 
diff --git a/lib/qmmm/libqmmm.c b/lib/qmmm/libqmmm.c
index 667a44e35d..b5db2da02f 100644
--- a/lib/qmmm/libqmmm.c
+++ b/lib/qmmm/libqmmm.c
@@ -73,7 +73,7 @@ int read_qmmm_config(const char *file, qmmm_config_t *cfg)
             if ((ptr[i]=='\0') || (ptr[i]==' ') || (ptr[i]=='\t'))
                 break;
             ptr[i] = tolower(ptr[i]);
-        }   
+        }
 
         /* handle keywords */
         if (strncmp(ptr,"mode",4) == 0) {
@@ -205,7 +205,7 @@ int read_qmmm_config(const char *file, qmmm_config_t *cfg)
                     lineno, file, buf);
             return QMMM_ERROR;
         }
-        
+
         if (feof(fp)) break;
     }
 
@@ -239,7 +239,7 @@ const char *check_qmmm_config(qmmm_config_t *cfg) {
     } else if (cfg->maout == NULL) {
         msg = "MM master output file not set";
     } else if (cfg->slout == NULL) {
-        msg = "MM slave output file not set";    
+        msg = "MM slave output file not set";
     }
     return msg;
 }
diff --git a/lib/qmmm/libqmmm.h b/lib/qmmm/libqmmm.h
index 9b58867083..7264586570 100644
--- a/lib/qmmm/libqmmm.h
+++ b/lib/qmmm/libqmmm.h
@@ -52,7 +52,7 @@ typedef struct {
 
 /* declare a global variable for the QM/MM setup.
    thus there can be only one QM/MM coupling currently */
-extern qmmm_config_t qmmmcfg;    
+extern qmmm_config_t qmmmcfg;
 
 /* read and parse global QM/MM configuration file and
  * store the result in a qmmm_config_t struct */
diff --git a/lib/qmmm/pwqmmm.c b/lib/qmmm/pwqmmm.c
index 445b4ece69..99b2aed513 100644
--- a/lib/qmmm/pwqmmm.c
+++ b/lib/qmmm/pwqmmm.c
@@ -79,7 +79,7 @@ int main(int argc, char **argv)
         const char *msg;
 
         msg = check_qmmm_config(&qmmmcfg);
-        
+
         if ((nqm < 1) || (qmmmcfg.nmm < 2)) {
             msg = "Need at least 2 MM and 1 QM processes";
         }
@@ -236,7 +236,7 @@ int main(int argc, char **argv)
             }
         }
 
-        /* parse additional support command line flags for LAMMPS */  
+        /* parse additional support command line flags for LAMMPS */
 
         if (qmmmcfg.maarg != NULL) {
             char *ptr = strtok(qmmmcfg.maarg,delim);
@@ -308,7 +308,7 @@ int main(int argc, char **argv)
             }
         }
 
-        /* parse additional support command line flags for LAMMPS */  
+        /* parse additional support command line flags for LAMMPS */
 
         if (qmmmcfg.slarg != NULL) {
             char *ptr = strtok(qmmmcfg.maarg,delim);
diff --git a/lib/scafacos/README b/lib/scafacos/README
index c8181ac7ae..2a9e2f312a 100644
--- a/lib/scafacos/README
+++ b/lib/scafacos/README
@@ -36,7 +36,7 @@ Instructions:
     command in the scafacos base-folder.
 
 3.) If you downloaded the library as a tarball, please extract the file
-    to somewhere in your file system, or if you finished running 
+    to somewhere in your file system, or if you finished running
     './bootstrap', please run './configure' in the base folder.
     Important flags for './configure' are:
       --prefix=:       sets the directory the compiled files will

From bc91d0585757789df7c876dbccc3e92aa3f59fca Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 22 Aug 2021 20:46:58 -0400
Subject: [PATCH 060/437] fix typo

---
 .github/CODEOWNERS | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index f2a73c3cf2..7508d8e4c1 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -129,7 +129,7 @@ src/math_eigen_impl.h     @jewettaij
 tools/msi2lmp/*       @akohlmey
 tools/emacs/*         @HaoZeke
 tools/singularity/*   @akohlmey @rbberger
-tools/code_standard/* @rbberger
+tools/coding_standard/* @rbberger
 tools/valgrind/*      @akohlmey
 tools/swig/*          @akohlmey
 tools/offline/*       @rbberger

From 0c7cf3cdaa1285d17a89e1d12dbe9a8a75fff14c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 22 Aug 2021 22:47:09 -0400
Subject: [PATCH 061/437] protect against use with Python 2.x, use full
 absolute directory path internally

---
 tools/coding_standard/homepage.py    | 14 ++++++++++----
 tools/coding_standard/permissions.py | 10 ++++++++--
 tools/coding_standard/whitespace.py  | 10 ++++++++--
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/tools/coding_standard/homepage.py b/tools/coding_standard/homepage.py
index 444befec36..7c5975a03f 100644
--- a/tools/coding_standard/homepage.py
+++ b/tools/coding_standard/homepage.py
@@ -2,8 +2,13 @@
 # Utility for detecting incorrect LAMMPS homepage URLs
 #
 # Written by Richard Berger (Temple University)
-import os
+from __future__ import print_function
 import sys
+
+if sys.version_info.major < 3:
+    sys.exit('This script must be run with Python 3.x')
+
+import os
 import glob
 import re
 import yaml
@@ -119,6 +124,7 @@ def main():
     parser.add_argument('-v', '--verbose', action='store_true', help='verbose output')
     parser.add_argument('DIRECTORY', help='directory (or file) that should be checked')
     args = parser.parse_args()
+    lammpsdir = os.path.abspath(os.path.expanduser(args.DIRECTORY))
 
     if args.config:
         with open(args.config, 'r') as cfile:
@@ -126,12 +132,12 @@ def main():
     else:
         config = yaml.load(DEFAULT_CONFIG, Loader=yaml.FullLoader)
 
-    if os.path.isdir(args.DIRECTORY):
-        if not check_folder(args.DIRECTORY, config, args.fix, args.verbose):
+    if os.path.isdir(lammpsdir):
+        if not check_folder(lammpsdir, config, args.fix, args.verbose):
            sys.exit(1)
     else:
         success = True
-        path = os.path.normpath(args.DIRECTORY)
+        path = os.path.normpath(lammpsdir)
 
         if args.verbose:
             print("Checking file:", path)
diff --git a/tools/coding_standard/permissions.py b/tools/coding_standard/permissions.py
index 266e92d30c..57ea3c90a5 100644
--- a/tools/coding_standard/permissions.py
+++ b/tools/coding_standard/permissions.py
@@ -2,8 +2,13 @@
 # Utility for detecting and fixing file permission issues in LAMMPS
 #
 # Written by Richard Berger (Temple University)
-import os
+from __future__ import print_function
 import sys
+
+if sys.version_info.major < 3:
+    sys.exit('This script must be run with Python 3.x')
+
+import os
 import glob
 import yaml
 import argparse
@@ -82,6 +87,7 @@ def main():
     parser.add_argument('-v', '--verbose', action='store_true', help='verbose output')
     parser.add_argument('DIRECTORY', help='directory that should be checked')
     args = parser.parse_args()
+    lammpsdir = os.path.abspath(os.path.expanduser(args.DIRECTORY))
 
     if args.config:
         with open(args.config, 'r') as cfile:
@@ -89,7 +95,7 @@ def main():
     else:
         config = yaml.load(DEFAULT_CONFIG, Loader=yaml.FullLoader)
 
-    if not check_folder(args.DIRECTORY, config, args.fix, args.verbose):
+    if not check_folder(lammpsdir, config, args.fix, args.verbose):
         sys.exit(1)
 
 if __name__ == "__main__":
diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py
index bad1ebd295..081aa6ca94 100644
--- a/tools/coding_standard/whitespace.py
+++ b/tools/coding_standard/whitespace.py
@@ -2,8 +2,13 @@
 # Utility for detecting and fixing whitespace issues in LAMMPS
 #
 # Written by Richard Berger (Temple University)
-import os
+from __future__ import print_function
 import sys
+
+if sys.version_info.major < 3:
+    sys.exit('This script must be run with Python 3.x')
+
+import os
 import glob
 import re
 import yaml
@@ -170,6 +175,7 @@ def main():
     parser.add_argument('-v', '--verbose', action='store_true', help='verbose output')
     parser.add_argument('DIRECTORY', help='directory that should be checked')
     args = parser.parse_args()
+    lammpsdir = os.path.abspath(os.path.expanduser(args.DIRECTORY))
 
     if args.config:
         with open(args.config, 'r') as cfile:
@@ -177,7 +183,7 @@ def main():
     else:
         config = yaml.load(DEFAULT_CONFIG, Loader=yaml.FullLoader)
 
-    if not check_folder(args.DIRECTORY, config, args.fix, args.verbose):
+    if not check_folder(lammpsdir, config, args.fix, args.verbose):
         sys.exit(1)
 
 if __name__ == "__main__":

From 0f8b331d8f1f4b7fb971a53703d669f78f509792 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 22 Aug 2021 22:47:55 -0400
Subject: [PATCH 062/437] enable check/fix scripts in traditional makefile

---
 src/Makefile | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/Makefile b/src/Makefile
index 1527adfd07..6f93af04c6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -474,6 +474,24 @@ tar:
 	@cd STUBS; $(MAKE)
 	@echo "Created $(ROOT)_src.tar.gz"
 
+check-whitespace:
+	$(PYTHON) ../tools/coding_standard/whitespace.py ..
+
+fix-whitespace:
+	$(PYTHON) ../tools/coding_standard/whitespace.py .. -f
+
+check-permissions:
+	$(PYTHON) ../tools/coding_standard/permissions.py ..
+
+fix-permissions:
+	$(PYTHON) ../tools/coding_standard/permissions.py .. -f
+
+check-homepage:
+	$(PYTHON) ../tools/coding_standard/homepage.py ..
+
+fix-homepage:
+	$(PYTHON) ../tools/coding_standard/homepage.py .. -f
+
 # Package management
 
 package:

From 0dea376e1a12276958dae0d0cefcd1519d1c4a78 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Mon, 23 Aug 2021 14:56:33 -0600
Subject: [PATCH 063/437] restart support for TTM fixes

---
 src/EXTRA-FIX/fix_ttm.cpp      | 169 ++++++++++++++++++---------------
 src/EXTRA-FIX/fix_ttm.h        |   2 +-
 src/EXTRA-FIX/fix_ttm_grid.cpp | 147 ++++++++++++++++++++--------
 src/EXTRA-FIX/fix_ttm_grid.h   |   4 +
 src/fix.h                      |   3 +
 src/gridcomm.cpp               |  75 +++++++++++++++
 src/gridcomm.h                 |   1 +
 src/modify.cpp                 |  22 +++--
 8 files changed, 299 insertions(+), 124 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index eaf095d329..798ab97dca 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -37,8 +37,11 @@ using namespace LAMMPS_NS;
 using namespace FixConst;
 
 #define MAXLINE 1024
-#define OFFSET 16384    // to avoid outside-of-box atoms being rounded incorrectly
-#define SHIFT 0.5       // 0.5 for nearest grid point, 0.0 for lower-left grid point
+//#define OFFSET 16384    // to avoid outside-of-box atoms being rounded incorrectly
+//#define SHIFT 0.5       // 0.5 for nearest grid point, 0.0 for lower-left grid point
+
+#define OFFSET 0    // to avoid outside-of-box atoms being rounded incorrectly
+#define SHIFT 0.0       // 0.5 for nearest grid point, 0.0 for lower-left grid point
 
 /* ---------------------------------------------------------------------- */
 
@@ -114,7 +117,6 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   ngridtotal = totalgrid;
 
   // allocate per-atom flangevin and zero it
-  // NOTE: is init to zero necessary?
 
   flangevin = nullptr;
   grow_arrays(atom->nmax);
@@ -130,33 +132,13 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   atom->add_callback(Atom::GROW);
   atom->add_callback(Atom::RESTART);
 
+  // determines which class deallocate_grid() is called from
+
   deallocate_flag = 0;
 }
 
 /* ---------------------------------------------------------------------- */
 
-void FixTTM::post_constructor()
-{
-  // allocate 3d grid variables
-
-  allocate_grid();
-
-  // zero net_energy_transfer
-  // in case compute_vector accesses it on timestep 0
-
-  outflag = 0;
-  for (int ix = 0; ix < nxgrid; ix++)
-    for (int iy = 0; iy < nygrid; iy++)
-      for (int iz = 0; iz < nzgrid; iz++)
-        net_energy_transfer_all[ix][iy][iz] = 0;
-
-  // set initial electron temperatures from user input file
-
-  read_electron_temperatures(infile);
-}
-
-/* ---------------------------------------------------------------------- */
-
 FixTTM::~FixTTM()
 {
   delete [] infile;
@@ -173,6 +155,26 @@ FixTTM::~FixTTM()
 
 /* ---------------------------------------------------------------------- */
 
+void FixTTM::post_constructor()
+{
+  // allocate global grid on each proc
+  // needs to be done in post_contructor() beccause is virtual method
+
+  allocate_grid();
+
+  // zero net_energy_transfer
+  // in case compute_vector accesses it on timestep 0
+
+  outflag = 0;
+  memset(&net_energy_transfer[0][0][0],0,ngridtotal*sizeof(double));
+
+  // set initial electron temperatures from user input file
+
+  read_electron_temperatures(infile);
+}
+
+/* ---------------------------------------------------------------------- */
+
 int FixTTM::setmask()
 {
   int mask = 0;
@@ -269,10 +271,10 @@ void FixTTM::post_force(int /*vflag*/)
       if (iy >= nygrid) iy -= nygrid;
       if (iz >= nzgrid) iz -= nzgrid;
 
-      if (T_electron[ix][iy][iz] < 0)
+      if (T_electron[iz][iy][ix] < 0)
         error->all(FLERR,"Electronic temperature dropped below zero");
 
-      double tsqrt = sqrt(T_electron[ix][iy][iz]);
+      double tsqrt = sqrt(T_electron[iz][iy][ix]);
 
       gamma1 = gfactor1[type[i]];
       double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
@@ -320,10 +322,10 @@ void FixTTM::end_of_step()
   int nlocal = atom->nlocal;
 
   outflag = 0;
-  for (ix = 0; ix < nxgrid; ix++)
+  for (iz = 0; iz < nzgrid; iz++)
     for (iy = 0; iy < nygrid; iy++)
-      for (iz = 0; iz < nzgrid; iz++)
-        net_energy_transfer[ix][iy][iz] = 0;
+      for (ix = 0; ix < nxgrid; ix++)
+        net_energy_transfer[iz][iy][ix] = 0;
 
   for (int i = 0; i < nlocal; i++)
     if (mask[i] & groupbit) {
@@ -339,7 +341,7 @@ void FixTTM::end_of_step()
       if (ix >= nxgrid) ix -= nxgrid;
       if (iy >= nygrid) iy -= nygrid;
       if (iz >= nzgrid) iz -= nzgrid;
-      net_energy_transfer[ix][iy][iz] +=
+      net_energy_transfer[iz][iy][ix] +=
         (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
          flangevin[i][2]*v[i][2]);
     }
@@ -375,18 +377,18 @@ void FixTTM::end_of_step()
   // finite difference iterations to update T_electron
 
   for (int istep = 0; istep < num_inner_timesteps; istep++) {
-
-    for (ix = 0; ix < nxgrid; ix++)
+    
+    for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
-        for (iz = 0; iz < nzgrid; iz++)
-          T_electron_old[ix][iy][iz] =
-            T_electron[ix][iy][iz];
+        for (ix = 0; ix < nxgrid; ix++)
+          T_electron_old[iz][iy][ix] =
+            T_electron[iz][iy][ix];
 
     // compute new electron T profile
 
-    for (ix = 0; ix < nxgrid; ix++)
+    for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
-        for (iz = 0; iz < nzgrid; iz++) {
+        for (ix = 0; ix < nxgrid; ix++) {
           int right_xnode = ix + 1;
           int right_ynode = iy + 1;
           int right_znode = iz + 1;
@@ -400,22 +402,22 @@ void FixTTM::end_of_step()
           if (left_ynode == -1) left_ynode = nygrid - 1;
           if (left_znode == -1) left_znode = nzgrid - 1;
 
-          T_electron[ix][iy][iz] =
-            T_electron_old[ix][iy][iz] +
+          T_electron[iz][iy][ix] =
+            T_electron_old[iz][iy][ix] +
             inner_dt/(electronic_specific_heat*electronic_density) *
             (electronic_thermal_conductivity *
 
-             ((T_electron_old[right_xnode][iy][iz] +
-               T_electron_old[left_xnode][iy][iz] -
-               2*T_electron_old[ix][iy][iz])/dx/dx +
-              (T_electron_old[ix][right_ynode][iz] +
-               T_electron_old[ix][left_ynode][iz] -
-               2*T_electron_old[ix][iy][iz])/dy/dy +
-              (T_electron_old[ix][iy][right_znode] +
-               T_electron_old[ix][iy][left_znode] -
-               2*T_electron_old[ix][iy][iz])/dz/dz) -
-
-             (net_energy_transfer_all[ix][iy][iz])/del_vol);
+             ((T_electron_old[iz][iy][right_xnode] +
+               T_electron_old[iz][iy][left_xnode] -
+               2*T_electron_old[iz][iy][ix])/dx/dx +
+              (T_electron_old[iz][right_ynode][ix] +
+               T_electron_old[iz][left_ynode][ix] -
+               2*T_electron_old[iz][iy][ix])/dy/dy +
+              (T_electron_old[right_znode][iy][iz] +
+               T_electron_old[left_znode][iy][ix] -
+               2*T_electron_old[iz][iy][ix])/dz/dz) -
+             
+             (net_energy_transfer_all[iz][iy][ix])/del_vol);
         }
   }
 }
@@ -462,18 +464,18 @@ void FixTTM::read_electron_temperatures(const char *filename)
     if (T_tmp < 0.0)
       error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
 
-    T_electron[ix][iy][iz] = T_tmp;
-    T_initial_set[ix][iy][iz] = 1;
+    T_electron[iz][iy][ix] = T_tmp;
+    T_initial_set[iz][iy][ix] = 1;
   }
 
   fclose(fp);
 
   // check completeness of input data
 
-  for (int ix = 0; ix < nxgrid; ix++)
+  for (int iz = 0; iz < nzgrid; iz++)
     for (int iy = 0; iy < nygrid; iy++)
-      for (int iz = 0; iz < nzgrid; iz++)
-        if (T_initial_set[ix][iy][iz] == 0)
+      for (int ix = 0; ix < nxgrid; ix++)
+        if (T_initial_set[iz][iy][ix] == 0)
           error->one(FLERR,"Initial temperatures not all set in fix ttm");
 
   memory->destroy(T_initial_set);
@@ -494,7 +496,7 @@ void FixTTM::reset_dt()
 
 void FixTTM::grow_arrays(int ngrow)
 {
-  memory->grow(flangevin,ngrow,3,"TTM:flangevin");
+  memory->grow(flangevin,ngrow,3,"ttm:flangevin");
 }
 
 /* ----------------------------------------------------------------------
@@ -504,15 +506,20 @@ void FixTTM::grow_arrays(int ngrow)
 void FixTTM::write_restart(FILE *fp)
 {
   double *rlist;
-  memory->create(rlist,nxgrid*nygrid*nzgrid+1,"TTM:rlist");
+  memory->create(rlist,nxgrid*nygrid*nzgrid+4,"ttm:rlist");
 
   int n = 0;
+  rlist[n++] = nxgrid;
+  rlist[n++] = nygrid;
+  rlist[n++] = nzgrid;
   rlist[n++] = seed;
 
-  for (int ix = 0; ix < nxgrid; ix++)
+  // store global grid values
+
+  for (int iz = 0; iz < nzgrid; iz++)
     for (int iy = 0; iy < nygrid; iy++)
-      for (int iz = 0; iz < nzgrid; iz++)
-        rlist[n++] =  T_electron[ix][iy][iz];
+      for (int ix = 0; ix < nxgrid; ix++)
+        rlist[n++] =  T_electron[iz][iy][ix];
 
   if (comm->me == 0) {
     int size = n * sizeof(double);
@@ -532,18 +539,28 @@ void FixTTM::restart(char *buf)
   int n = 0;
   double *rlist = (double *) buf;
 
+  // check that restart grid size is same as current grid size
+
+  int nxgrid_old = static_cast (rlist[n++]);
+  int nygrid_old = static_cast (rlist[n++]);
+  int nzgrid_old = static_cast (rlist[n++]);
+
+  if (nxgrid_old != nxgrid || nygrid_old != nygrid || nzgrid_old != nzgrid)
+    error->all(FLERR,"Must restart fix ttm with same grid size");
+
   // change RN seed from initial seed, to avoid same Langevin factors
-  // just increment by 1, since for RanMars that is new RN streamd
+  // just increment by 1, since for RanMars that is a new RN stream
 
   seed = static_cast (rlist[n++]) + 1;
-
-  for (int ix = 0; ix < nxgrid; ix++)
-    for (int iy = 0; iy < nygrid; iy++)
-      for (int iz = 0; iz < nzgrid; iz++)
-        T_electron[ix][iy][iz] = rlist[n++];
-
   delete random;
   random = new RanMars(lmp,seed+comm->me);
+
+  // restore global grid values
+
+  for (int iz = 0; iz < nzgrid; iz++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int ix = 0; ix < nxgrid; ix++)
+        T_electron[iz][iy][ix] = rlist[n++];
 }
 
 /* ----------------------------------------------------------------------
@@ -617,14 +634,14 @@ double FixTTM::compute_vector(int n)
     double dz = domain->zprd/nzgrid;
     double del_vol = dx*dy*dz;
 
-    for (ix = 0; ix < nxgrid; ix++)
+    for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
-        for (iz = 0; iz < nzgrid; iz++) {
+        for (ix = 0; ix < nxgrid; ix++) {
           e_energy +=
-            T_electron[ix][iy][iz]*electronic_specific_heat*
+            T_electron[iz][iy][ix]*electronic_specific_heat*
             electronic_density*del_vol;
           transfer_energy +=
-            net_energy_transfer_all[ix][iy][iz]*update->dt;
+            net_energy_transfer_all[iz][iy][ix]*update->dt;
         }
 
     outflag = 1;
@@ -653,11 +670,11 @@ double FixTTM::memory_usage()
 
 void FixTTM::allocate_grid()
 {
-  memory->create(T_electron_old,nxgrid,nygrid,nzgrid,"ttm:T_electron_old");
-  memory->create(T_electron,nxgrid,nygrid,nzgrid,"ttm:T_electron");
-  memory->create(net_energy_transfer,nxgrid,nygrid,nzgrid,
+  memory->create(T_electron_old,nzgrid,nygrid,nxgrid,"ttm:T_electron_old");
+  memory->create(T_electron,nzgrid,nygrid,nxgrid,"ttm:T_electron");
+  memory->create(net_energy_transfer,nzgrid,nygrid,nxgrid,
                  "ttm:net_energy_transfer");
-  memory->create(net_energy_transfer_all,nxgrid,nygrid,nzgrid,
+  memory->create(net_energy_transfer_all,nzgrid,nygrid,nxgrid,
                  "ttm:net_energy_transfer_all");
 }
 
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index a7e7e0ea45..0b8900977e 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -30,7 +30,7 @@ class FixTTM : public Fix {
   virtual ~FixTTM();
   virtual void post_constructor();
   int setmask();
-  void init();
+  virtual void init();
   void setup(int);
   void post_force_setup(int);
   virtual void post_force(int);
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 3ca94e10b4..b9e52b1d68 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -43,7 +43,10 @@ static constexpr int CHUNK = 1024;
 /* ---------------------------------------------------------------------- */
 
 FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : 
-  FixTTM(lmp, narg, arg) {}
+  FixTTM(lmp, narg, arg)
+{
+  skin_original = neighbor->skin;
+}
 
 /* ---------------------------------------------------------------------- */
 
@@ -57,13 +60,15 @@ FixTTMGrid::~FixTTMGrid()
 
 void FixTTMGrid::post_constructor()
 {
-  // allocate 3d grid variables
+  // allocate global grid on each proc
+  // needs to be done in post_contructor() beccause is virtual method
 
   allocate_grid();
 
   // zero net_energy_transfer
   // in case compute_vector accesses it on timestep 0
 
+  outflag = 0;
   memset(&net_energy_transfer[nzlo_out][nylo_out][nxlo_out],0,
          ngridout*sizeof(double));
 
@@ -74,6 +79,16 @@ void FixTTMGrid::post_constructor()
 
 /* ---------------------------------------------------------------------- */
 
+void FixTTMGrid::init()
+{
+  FixTTM::init();
+
+  if (neighbor->skin > skin_original)
+    error->all(FLERR,"Cannot extend neighbor skin after fix ttm/griddefined");
+}
+
+/* ---------------------------------------------------------------------- */
+
 void FixTTMGrid::post_force(int /*vflag*/)
 {
   int ix,iy,iz;
@@ -232,10 +247,6 @@ void FixTTMGrid::end_of_step()
 
   gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
                    gc_buf1,gc_buf2,MPI_DOUBLE);
-
-  // assign electron temperature to each atom for fix output
-
-
 }
 
 /* ----------------------------------------------------------------------
@@ -411,8 +422,6 @@ void FixTTMGrid::allocate_grid()
   //   global grid that I own without ghost cells
   // both non-tiled and tiled proc layouts use 0-1 fractional subdomain info
 
-  // NOTE: replace with comm->partition_grid()
-
   if (comm->layout != Comm::LAYOUT_TILED) {
     nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nxgrid);
     nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nxgrid) - 1;
@@ -481,11 +490,11 @@ void FixTTMGrid::allocate_grid()
   memory->create(gc_buf2,ngc_buf2,"ttm/grid:gc_buf2");
 
   memory->create3d_offset(T_electron_old,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm:T_electron_old");
+                          nxlo_out,nxhi_out,"ttm/grid:T_electron_old");
   memory->create3d_offset(T_electron,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm:T_electron");
+                          nxlo_out,nxhi_out,"ttm/grid:T_electron");
   memory->create3d_offset(net_energy_transfer,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm:net_energy_transfer");
+                          nxlo_out,nxhi_out,"ttm/grid:net_energy_transfer");
 }
 
 /* ----------------------------------------------------------------------
@@ -503,32 +512,6 @@ void FixTTMGrid::deallocate_grid()
   memory->destroy3d_offset(net_energy_transfer,nzlo_out,nylo_out,nxlo_out);
 }
 
-/* ----------------------------------------------------------------------
-   use state info from restart file to restart the Fix
-------------------------------------------------------------------------- */
-
-void FixTTMGrid::restart(char *buf)
-{
-  int ix,iy,iz;
-
-  int n = 0;
-  double *rlist = (double *) buf;
-
-  // the seed must be changed from the initial seed
-  // NOTE: 0.5 is whacky, could go to zero
-  // NOTE: maybe GridComm should provide a method to pack a grid with bounds
-
-  seed = static_cast (0.5*rlist[n++]);
-
-  for (iz = nzlo_in; iz <= nzhi_in; iz++)
-    for (iy = nylo_in; iy <= nyhi_in; iy++)
-      for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        T_electron[iz][iy][ix] = rlist[n++];
-
-  delete random;
-  random = new RanMars(lmp,seed+comm->me);
-}
-
 /* ----------------------------------------------------------------------
    pack entire state of Fix into one write
 ------------------------------------------------------------------------- */
@@ -538,12 +521,17 @@ void FixTTMGrid::write_restart(FILE *fp)
   int ix,iy,iz;
 
   double *rlist;
-  memory->create(rlist,nxgrid*nygrid*nzgrid+1,"TTM:rlist");
+  memory->create(rlist,nxgrid*nygrid*nzgrid+4,"ttm/grid:rlist");
 
   int n = 0;
+  rlist[n++] = nxgrid;
+  rlist[n++] = nygrid;
+  rlist[n++] = nzgrid;
   rlist[n++] = seed;
 
-  // NOTE: this is a parallel grid now, not a serial grid
+  // gather rest of rlist on proc 0 as global grid values
+
+  gc->gather(GridComm::FIX,this,1,sizeof(double),0,&rlist[4],MPI_DOUBLE);
 
   for (iz = nzlo_in; iz <= nzhi_in; iz++)
     for (iy = nylo_in; iy <= nyhi_in; iy++)
@@ -559,6 +547,86 @@ void FixTTMGrid::write_restart(FILE *fp)
   memory->destroy(rlist);
 }
 
+/* ----------------------------------------------------------------------
+   use state info from restart file to restart the Fix
+------------------------------------------------------------------------- */
+
+void FixTTMGrid::restart(char *buf)
+{
+  int ix,iy,iz;
+
+  int n = 0;
+  double *rlist = (double *) buf;
+
+  // check that restart grid size is same as current grid size
+
+  int nxgrid_old = static_cast (rlist[n++]);
+  int nygrid_old = static_cast (rlist[n++]);
+  int nzgrid_old = static_cast (rlist[n++]);
+
+  if (nxgrid_old != nxgrid || nygrid_old != nygrid || nzgrid_old != nzgrid)
+    error->all(FLERR,"Must restart fix ttm/grid with same grid size");
+
+  // change RN seed from initial seed, to avoid same Langevin factors
+  // just increment by 1, since for RanMars that is a new RN stream
+
+  seed = static_cast (rlist[n++]) + 1;
+  delete random;
+  random = new RanMars(lmp,seed+comm->me);
+
+  // extract this proc's local grid values from global grid in rlist
+
+  int iglobal;
+
+  for (iz = nzlo_in; iz <= nzhi_in; iz++)
+    for (iy = nylo_in; iy <= nyhi_in; iy++)
+      for (ix = nxlo_in; ix <= nxhi_in; ix++) {
+        iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
+        T_electron[iz][iy][ix] = rlist[n+iglobal];
+      }
+}
+
+/* ----------------------------------------------------------------------
+   pack values from local grid into buf
+------------------------------------------------------------------------- */
+
+void FixTTMGrid::pack_gather_grid(int which, void *vbuf)
+{
+  int ix,iy,iz;
+
+  double *buf = (double *) vbuf;
+
+  int m = 0;
+  for (iz = nzlo_in; iz <= nzhi_in; iz++)
+    for (iy = nylo_in; iy <= nyhi_in; iy++)
+      for (ix = nxlo_in; ix <= nxhi_in; ix++)
+        buf[m++] = T_electron[iz][iy][ix];
+}
+
+/* ----------------------------------------------------------------------
+   unpack values from buf into global gbuf based on their indices
+------------------------------------------------------------------------- */
+
+void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
+                                    int xlo, int xhi, int ylo, int yhi, 
+                                    int zlo, int zhi)
+{
+  int ix,iy,iz;
+
+  double *buf = (double *) vbuf;
+  double *gbuf = (double *) vgbuf;
+
+  int iglobal;
+  int ilocal = 0;
+
+  for (iz = zlo; iz <= zhi; iz++)
+    for (iy = ylo; iy <= yhi; iy++)
+      for (ix = xlo; ix <= xhi; ix++) {
+        iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
+        gbuf[iglobal] = buf[ilocal++];
+      }
+}
+
 /* ----------------------------------------------------------------------
    return the energy of the electronic subsystem 
    or the net_energy transfer between the subsystems
@@ -609,4 +677,3 @@ double FixTTMGrid::memory_usage()
   bytes += (double)3*ngridout * sizeof(double);
   return bytes;
 }
-
diff --git a/src/EXTRA-FIX/fix_ttm_grid.h b/src/EXTRA-FIX/fix_ttm_grid.h
index 617612d641..dec5ca871b 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.h
+++ b/src/EXTRA-FIX/fix_ttm_grid.h
@@ -29,6 +29,7 @@ class FixTTMGrid : public FixTTM {
   FixTTMGrid(class LAMMPS *, int, char **);
   ~FixTTMGrid();
   void post_constructor();
+  void init();
   void post_force(int);
   void end_of_step();
 
@@ -38,6 +39,8 @@ class FixTTMGrid : public FixTTM {
   void unpack_forward_grid(int, void *, int, int *);
   void pack_reverse_grid(int, void *, int, int *);
   void unpack_reverse_grid(int, void *, int, int *);
+  void pack_gather_grid(int, void *);
+  void unpack_gather_grid(int, void *, void *, int, int, int, int, int, int);
 
   void write_restart(FILE *);
   void restart(char *);
@@ -49,6 +52,7 @@ class FixTTMGrid : public FixTTM {
   int nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in;
   int nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out;
   double delxinv,delyinv,delzinv;
+  double skin_original;
 
   class GridComm *gc;
   int ngc_buf1,ngc_buf2;
diff --git a/src/fix.h b/src/fix.h
index a48c4eeb6a..cacbf04a2a 100644
--- a/src/fix.h
+++ b/src/fix.h
@@ -209,6 +209,9 @@ class Fix : protected Pointers {
   virtual void unpack_forward_grid(int, void *, int, int *) {};
   virtual void pack_reverse_grid(int, void *, int, int *) {};
   virtual void unpack_reverse_grid(int, void *, int, int *) {};
+  virtual void pack_gather_grid(int, void *) {};
+  virtual void unpack_gather_grid(int, void *, void *, 
+                                  int, int, int, int, int, int) {};
 
   virtual double compute_scalar() { return 0.0; }
   virtual double compute_vector(int) { return 0.0; }
diff --git a/src/gridcomm.cpp b/src/gridcomm.cpp
index fc6d8296d8..098a410a54 100644
--- a/src/gridcomm.cpp
+++ b/src/gridcomm.cpp
@@ -1125,6 +1125,81 @@ reverse_comm_tiled(T *ptr, int nper, int nbyte, int which,
   }
 }
 
+/* ----------------------------------------------------------------------
+   gather global grid values to proc 0
+   proc 0 pings each proc for its contribution
+   pack/unpack operations are performed by caller via callbacks
+------------------------------------------------------------------------- */
+
+void GridComm::gather(int caller, void *ptr, int nper, int nbyte, int which,
+                      void *buf, MPI_Datatype datatype)
+{
+  int me = comm->me;
+  Fix *fptr = (Fix *) ptr;
+
+  // maxsize = max grid data owned by any proc
+
+  int mysize = (inxhi-inxlo+1) * (inyhi-inylo+1) * (inzhi-inzlo+1);
+  mysize *= nper;
+  int maxsize;
+  MPI_Allreduce(&mysize,&maxsize,1,MPI_INT,MPI_MAX,world);
+
+  // pack my data via callback to caller
+
+  char *mybuf;
+  if (me == 0) memory->create(mybuf,maxsize*nbyte,"GridComm:mybuf");
+  else memory->create(mybuf,mysize*nbyte,"GridComm:mybuf");
+  fptr->pack_gather_grid(which,mybuf);
+
+  // ping each proc for its data
+  // unpack into full buffer via callback to caller
+
+  int xlo,xhi,ylo,yhi,zlo,zhi,tmp;
+  int bounds[6];
+
+  if (me == 0) {
+    MPI_Status status;
+    MPI_Request request;
+
+    for (int iproc = 0; iproc < nprocs; iproc++) {
+      if (iproc) {
+        MPI_Irecv(mybuf,maxsize,datatype,iproc,0,world,&request);
+        MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
+        MPI_Wait(&request,&status);
+        MPI_Recv(bounds,6,MPI_INT,iproc,0,world,&status);
+        xlo = bounds[0];
+        xhi = bounds[1];
+        ylo = bounds[2];
+        yhi = bounds[3];
+        zlo = bounds[4];
+        zhi = bounds[5];
+      } else {
+        xlo = inxlo;
+        xhi = inxhi;
+        ylo = inylo;
+        yhi = inyhi;
+        zlo = inzlo;
+        zhi = inzhi;
+      }
+
+      fptr->unpack_gather_grid(which,mybuf,buf,xlo,xhi,ylo,yhi,zlo,zhi);
+    }
+
+  } else {
+    MPI_Recv(&tmp,0,MPI_INT,0,0,world,MPI_STATUS_IGNORE);
+    MPI_Rsend(mybuf,mysize,datatype,0,0,world);
+    bounds[0] = inxlo;
+    bounds[1] = inxhi;
+    bounds[2] = inylo;
+    bounds[3] = inyhi;
+    bounds[4] = inzlo;
+    bounds[5] = inzhi;
+    MPI_Send(bounds,6,MPI_INT,0,0,world);
+  }
+
+  memory->destroy(mybuf);
+}
+
 /* ----------------------------------------------------------------------
    create swap stencil for grid own/ghost communication
    swaps covers all 3 dimensions and both directions
diff --git a/src/gridcomm.h b/src/gridcomm.h
index 86f2c30297..4b3c3de1b8 100644
--- a/src/gridcomm.h
+++ b/src/gridcomm.h
@@ -31,6 +31,7 @@ class GridComm : protected Pointers {
   int ghost_adjacent();
   void forward_comm(int, void *, int, int, int, void *, void *, MPI_Datatype);
   void reverse_comm(int, void *, int, int, int, void *, void *, MPI_Datatype);
+  void gather(int, void *, int, int, int, void *, MPI_Datatype);
 
  protected:
   int me, nprocs;
diff --git a/src/modify.cpp b/src/modify.cpp
index 995b3b82ac..06b3c6cdb9 100644
--- a/src/modify.cpp
+++ b/src/modify.cpp
@@ -915,6 +915,18 @@ Fix *Modify::add_fix(int narg, char **arg, int trysuffix)
   if (fix[ifix] == nullptr)
     error->all(FLERR,utils::check_packages_for_style("fix",arg[2],lmp));
 
+  // increment nfix (if new)
+
+  if (newflag) nfix++;
+
+  // post_constructor() can call virtual methods in parent or child
+  //   which would otherwise not yet be visible in child class
+  // post_constructor() allows new fix to create other fixes
+  // nfix increment must come first so recursive call to add_fix within
+  //   post_constructor() will see updated nfix
+
+  fix[ifix]->post_constructor();
+
   // check if Fix is in restart_global list
   // if yes, pass state info to the Fix so it can reset itself
 
@@ -946,15 +958,12 @@ Fix *Modify::add_fix(int narg, char **arg, int trysuffix)
                        fix[ifix]->style,fix[ifix]->id);
     }
 
-  // increment nfix (if new)
   // set fix mask values
-  // post_constructor() allows new fix to create other fixes
-  // nfix increment comes first so that recursive call to add_fix within
-  //   post_constructor() will see updated nfix
 
-  if (newflag) nfix++;
   fmask[ifix] = fix[ifix]->setmask();
-  fix[ifix]->post_constructor();
+
+  // return pointer to fix
+
   return fix[ifix];
 }
 
@@ -973,7 +982,6 @@ Fix *Modify::add_fix(const std::string &fixcmd, int trysuffix)
   return add_fix(args.size(),newarg.data(),trysuffix);
 }
 
-
 /* ----------------------------------------------------------------------
    replace replaceID fix with a new fix
    this is used by callers to preserve ordering of fixes

From 6bc8da05b90b15f70e619eb39520966294920cb2 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 17:06:30 -0400
Subject: [PATCH 064/437] reformat unittest tree with clang-format

---
 unittest/commands/test_groups.cpp             |   6 +-
 unittest/commands/test_kim_commands.cpp       |   3 +-
 unittest/commands/test_lattice_region.cpp     |   3 +-
 unittest/commands/test_mpi_load_balancing.cpp | 196 +++++++++---------
 unittest/commands/test_reset_ids.cpp          |   3 +-
 unittest/commands/test_simple_commands.cpp    |   8 +-
 unittest/commands/test_variables.cpp          |  15 +-
 unittest/force-styles/test_config_reader.cpp  |   2 +-
 unittest/force-styles/test_fix_timestep.cpp   |   3 +-
 unittest/force-styles/test_main.cpp           |  12 +-
 unittest/force-styles/test_main.h             |   4 +-
 unittest/force-styles/test_pair_style.cpp     |   8 +-
 unittest/force-styles/yaml_writer.cpp         |   8 +-
 unittest/formats/compressed_dump_test.h       |  31 +--
 .../formats/compressed_dump_test_main.cpp     |  18 +-
 unittest/formats/test_atom_styles.cpp         |   8 +-
 .../formats/test_dump_atom_compressed.cpp     |  37 ++--
 unittest/formats/test_dump_cfg.cpp            |   3 +-
 unittest/formats/test_dump_cfg_compressed.cpp |  47 +++--
 .../formats/test_dump_custom_compressed.cpp   |  46 ++--
 unittest/formats/test_dump_local.cpp          |   6 +-
 .../formats/test_dump_local_compressed.cpp    |  65 +++---
 unittest/formats/test_dump_xyz_compressed.cpp |  37 ++--
 .../test_eim_potential_file_reader.cpp        |   4 +-
 unittest/formats/test_file_operations.cpp     |  39 ++--
 unittest/formats/test_image_flags.cpp         |   2 +-
 unittest/formats/test_molecule_file.cpp       |  17 +-
 unittest/formats/test_pair_unit_convert.cpp   |   2 +-
 .../formats/test_potential_file_reader.cpp    |   4 +-
 unittest/formats/test_text_file_reader.cpp    |  17 +-
 unittest/python/test_python_package.cpp       |  31 +--
 unittest/testing/core.h                       |  90 ++++----
 unittest/testing/mpitesting.h                 | 147 +++++++------
 unittest/testing/test_mpi_main.h              |   4 +-
 unittest/testing/utils.h                      |   2 -
 unittest/utils/test_tokenizer.cpp             |   4 +-
 unittest/utils/test_utils.cpp                 |  22 +-
 37 files changed, 501 insertions(+), 453 deletions(-)

diff --git a/unittest/commands/test_groups.cpp b/unittest/commands/test_groups.cpp
index f938de3467..e238e630d5 100644
--- a/unittest/commands/test_groups.cpp
+++ b/unittest/commands/test_groups.cpp
@@ -20,9 +20,9 @@
 #include "input.h"
 #include "region.h"
 
+#include "../testing/core.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -74,7 +74,7 @@ protected:
         END_HIDE_OUTPUT();
 
         atomic_system();
-    
+
         BEGIN_HIDE_OUTPUT();
         command("variable molid atom floor(id/4)+1");
         command("variable charge atom 2.0*sin(PI/32*id)");
@@ -245,7 +245,7 @@ TEST_F(GroupTest, Molecular)
     ASSERT_EQ(group->count(group->find("three")), 15);
     ASSERT_DOUBLE_EQ(group->mass(group->find("half")), 40);
     ASSERT_DOUBLE_EQ(group->mass(group->find("half"), domain->find_region("top")), 10);
-    ASSERT_NEAR(group->charge(group->find("top")), 0,1.0e-14);
+    ASSERT_NEAR(group->charge(group->find("top")), 0, 1.0e-14);
     ASSERT_DOUBLE_EQ(group->charge(group->find("right"), domain->find_region("top")), 0);
 
     TEST_FAILURE(".*ERROR: Illegal group command.*", command("group three include xxx"););
diff --git a/unittest/commands/test_kim_commands.cpp b/unittest/commands/test_kim_commands.cpp
index 526fd8163f..a70176cc92 100644
--- a/unittest/commands/test_kim_commands.cpp
+++ b/unittest/commands/test_kim_commands.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "fmt/format.h"
 #include "info.h"
 #include "input.h"
@@ -22,7 +23,6 @@
 #include "variable.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -36,7 +36,6 @@ namespace LAMMPS_NS {
 using ::testing::MatchesRegex;
 using ::testing::StrEq;
 
-
 class KimCommandsTest : public LAMMPSTest {
 protected:
     Variable *variable;
diff --git a/unittest/commands/test_lattice_region.cpp b/unittest/commands/test_lattice_region.cpp
index a4b76f02ef..5fbabcf173 100644
--- a/unittest/commands/test_lattice_region.cpp
+++ b/unittest/commands/test_lattice_region.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "atom.h"
 #include "domain.h"
 #include "fmt/format.h"
@@ -22,7 +23,6 @@
 #include "utils.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -40,7 +40,6 @@ using ::testing::ExitedWithCode;
 using ::testing::MatchesRegex;
 using ::testing::StrEq;
 
-
 class LatticeRegionTest : public LAMMPSTest {
 protected:
     void SetUp() override
diff --git a/unittest/commands/test_mpi_load_balancing.cpp b/unittest/commands/test_mpi_load_balancing.cpp
index 39e39e5da8..bc5f07beb1 100644
--- a/unittest/commands/test_mpi_load_balancing.cpp
+++ b/unittest/commands/test_mpi_load_balancing.cpp
@@ -1,14 +1,14 @@
 // unit tests for checking LAMMPS MPI load balancing
 
 #define LAMMPS_LIB_MPI 1
-#include "lammps.h"
 #include "atom.h"
 #include "comm.h"
 #include "domain.h"
-#include "neighbor.h"
-#include "input.h"
-#include "timer.h"
 #include "info.h"
+#include "input.h"
+#include "lammps.h"
+#include "neighbor.h"
+#include "timer.h"
 #include 
 
 #include "gmock/gmock.h"
@@ -21,8 +21,7 @@ using ::testing::HasSubstr;
 using ::testing::StartsWith;
 using ::testing::StrEq;
 
-namespace LAMMPS_NS
-{
+namespace LAMMPS_NS {
 
 class MPILoadBalanceTest : public ::testing::Test {
 public:
@@ -54,7 +53,6 @@ protected:
         command("create_box      1 box");
         command("mass            1 1.0");
 
-
         command("pair_style      lj/cut 2.5");
         command("pair_coeff      1 1 1.0 1.0 2.5");
 
@@ -85,55 +83,55 @@ TEST_F(MPILoadBalanceTest, grid_yz)
     ASSERT_EQ(lmp->comm->nprocs, 4);
 
     // initial state
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 8);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 8);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
     }
 
     command("balance 1 x uniform y 0.125 z uniform");
 
     // state after balance command
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 4);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 4);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 4);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 4);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
     }
 
     command("balance 1 x uniform y 0.125 z 0.125");
 
     // state after second balance command
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
     }
 }
 
@@ -150,37 +148,37 @@ TEST_F(MPILoadBalanceTest, rcb)
     command("create_atoms 1 single 5 5 5");
 
     // initial state
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 8);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 8);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
     }
 
     command("balance 1 rcb");
 
     // state after balance command
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 2);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 2);
+            break;
     }
 
     // box dimensions should have minimal size
@@ -209,19 +207,19 @@ TEST_F(MPILoadBalanceTest, rcb_min_size)
     command("create_atoms 1 single 0.25 0.25 0.25");
 
     // initial state
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 8);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 8);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
     }
 
     // this should fail and not change the boxes
@@ -229,19 +227,19 @@ TEST_F(MPILoadBalanceTest, rcb_min_size)
     command("balance 1 rcb");
 
     // state after balance command
-    switch(lmp->comm->me) {
-      case 0:
-        ASSERT_EQ(lmp->atom->nlocal, 8);
-        break;
-      case 1:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 2:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
-      case 3:
-        ASSERT_EQ(lmp->atom->nlocal, 0);
-        break;
+    switch (lmp->comm->me) {
+        case 0:
+            ASSERT_EQ(lmp->atom->nlocal, 8);
+            break;
+        case 1:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 2:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
+        case 3:
+            ASSERT_EQ(lmp->atom->nlocal, 0);
+            break;
     }
 
     // box dimensions should have minimal size
@@ -254,4 +252,4 @@ TEST_F(MPILoadBalanceTest, rcb_min_size)
     ASSERT_GT(dz, lmp->neighbor->skin);
 }
 
-}
+} // namespace LAMMPS_NS
diff --git a/unittest/commands/test_reset_ids.cpp b/unittest/commands/test_reset_ids.cpp
index 61da99b876..bc9d39dc37 100644
--- a/unittest/commands/test_reset_ids.cpp
+++ b/unittest/commands/test_reset_ids.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "atom.h"
 #include "fmt/format.h"
 #include "info.h"
@@ -21,7 +22,6 @@
 #include "utils.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -36,7 +36,6 @@ using ::testing::MatchesRegex;
 
 #define GETIDX(i) lmp->atom->map(i)
 
-
 #define STRINGIFY(val) XSTR(val)
 #define XSTR(val) #val
 
diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp
index deb379ee41..8b57c26af1 100644
--- a/unittest/commands/test_simple_commands.cpp
+++ b/unittest/commands/test_simple_commands.cpp
@@ -23,10 +23,10 @@
 #include "utils.h"
 #include "variable.h"
 
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
 #include "../testing/core.h"
 #include "../testing/utils.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 
 #include 
 #include 
@@ -37,7 +37,6 @@
 // whether to print verbose output (i.e. not capturing LAMMPS screen output).
 bool verbose = false;
 
-
 using LAMMPS_NS::utils::split_words;
 
 namespace LAMMPS_NS {
@@ -205,7 +204,8 @@ TEST_F(SimpleCommandsTest, Processors)
     ASSERT_EQ(lmp->comm->user_procgrid[2], 0);
 
     TEST_FAILURE(".*ERROR: Illegal processors command .*", command("processors -1 0 0"););
-    TEST_FAILURE(".*ERROR: Specified processors != physical processors.*", command("processors 100 100 100"););
+    TEST_FAILURE(".*ERROR: Specified processors != physical processors.*",
+                 command("processors 100 100 100"););
 }
 
 TEST_F(SimpleCommandsTest, Quit)
diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp
index 574fe42ad8..9d8932d0f0 100644
--- a/unittest/commands/test_variables.cpp
+++ b/unittest/commands/test_variables.cpp
@@ -22,9 +22,9 @@
 #include "region.h"
 #include "variable.h"
 
+#include "../testing/core.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -40,7 +40,6 @@ using ::testing::ExitedWithCode;
 using ::testing::MatchesRegex;
 using ::testing::StrEq;
 
-
 class VariableTest : public LAMMPSTest {
 protected:
     Group *group;
@@ -50,7 +49,7 @@ protected:
     void SetUp() override
     {
         testbinary = "VariableTest";
-        args = {"-log", "none", "-echo", "screen", "-nocite", "-v",   "num",  "1"};
+        args       = {"-log", "none", "-echo", "screen", "-nocite", "-v", "num", "1"};
         LAMMPSTest::SetUp();
         group    = lmp->group;
         domain   = lmp->domain;
@@ -162,8 +161,8 @@ TEST_F(VariableTest, CreateDelete)
     variable->internal_set(variable->find("ten"), 2.5);
     ASSERT_THAT(variable->retrieve("ten"), StrEq("2.5"));
     ASSERT_THAT(variable->retrieve("file"), StrEq("0"));
-    FILE *fp = fopen("MYFILE","w");
-    fputs(" ",fp);
+    FILE *fp = fopen("MYFILE", "w");
+    fputs(" ", fp);
     fclose(fp);
     ASSERT_THAT(variable->retrieve("file"), StrEq("1"));
     unlink("MYFILE");
@@ -218,7 +217,9 @@ TEST_F(VariableTest, CreateDelete)
 
 TEST_F(VariableTest, AtomicSystem)
 {
-    HIDE_OUTPUT([&] { command("atom_modify map array"); });
+    HIDE_OUTPUT([&] {
+        command("atom_modify map array");
+    });
     atomic_system();
     file_vars();
 
@@ -443,7 +444,7 @@ TEST_F(VariableTest, IfCommand)
     BEGIN_CAPTURE_OUTPUT();
     command("if x!=x|^a!=b then 'print \"bingo!\"'");
     text = END_CAPTURE_OUTPUT();
-    
+
     ASSERT_THAT(text, MatchesRegex(".*bingo!.*"));
 
     TEST_FAILURE(".*ERROR: Invalid Boolean syntax in if command.*",
diff --git a/unittest/force-styles/test_config_reader.cpp b/unittest/force-styles/test_config_reader.cpp
index 41621ff3aa..726bd90a93 100644
--- a/unittest/force-styles/test_config_reader.cpp
+++ b/unittest/force-styles/test_config_reader.cpp
@@ -13,9 +13,9 @@
 
 #include "test_config_reader.h"
 #include "test_config.h"
+#include "utils.h"
 #include "yaml.h"
 #include "yaml_reader.h"
-#include "utils.h"
 
 #include 
 #include 
diff --git a/unittest/force-styles/test_fix_timestep.cpp b/unittest/force-styles/test_fix_timestep.cpp
index 38d03358e2..362a632713 100644
--- a/unittest/force-styles/test_fix_timestep.cpp
+++ b/unittest/force-styles/test_fix_timestep.cpp
@@ -938,8 +938,7 @@ TEST(FixTimestep, omp)
     // rigid fixes need work to test properly with r-RESPA,
     // also, torque is not supported by respa/omp
     ifix = lmp->modify->find_fix("test");
-    if (!utils::strmatch(lmp->modify->fix[ifix]->style, "^rigid")
-        && !lmp->atom->torque) {
+    if (!utils::strmatch(lmp->modify->fix[ifix]->style, "^rigid") && !lmp->atom->torque) {
 
         if (!verbose) ::testing::internal::CaptureStdout();
         cleanup_lammps(lmp, test_config);
diff --git a/unittest/force-styles/test_main.cpp b/unittest/force-styles/test_main.cpp
index c7a64682cf..5b2663a6cf 100644
--- a/unittest/force-styles/test_main.cpp
+++ b/unittest/force-styles/test_main.cpp
@@ -41,15 +41,13 @@ bool read_yaml_file(const char *infile, TestConfig &config)
 }
 
 // write out common header items for yaml files
-void write_yaml_header(YamlWriter *writer,
-                       TestConfig *cfg,
-                       const char *version)
+void write_yaml_header(YamlWriter *writer, TestConfig *cfg, const char *version)
 {
     // lammps_version
     writer->emit("lammps_version", version);
 
     // date_generated
-    std::time_t now = time(NULL);
+    std::time_t now   = time(NULL);
     std::string block = trim(ctime(&now));
     writer->emit("date_generated", block);
 
@@ -59,8 +57,10 @@ void write_yaml_header(YamlWriter *writer,
     // skip tests
     block.clear();
     for (auto &skip : cfg->skip_tests) {
-        if (block.empty()) block = skip;
-        else block += " " + skip;
+        if (block.empty())
+            block = skip;
+        else
+            block += " " + skip;
     }
     writer->emit("skip_tests", block);
 
diff --git a/unittest/force-styles/test_main.h b/unittest/force-styles/test_main.h
index f8971c64bf..3a9651e621 100644
--- a/unittest/force-styles/test_main.h
+++ b/unittest/force-styles/test_main.h
@@ -23,8 +23,7 @@ extern bool verbose;
 extern std::string INPUT_FOLDER;
 
 // convenience method to write out common entries
-void write_yaml_header(class YamlWriter *writer, TestConfig *cfg,
-                       const char *version);
+void write_yaml_header(class YamlWriter *writer, TestConfig *cfg, const char *version);
 
 #define EXPECT_FP_LE_WITH_EPS(val1, val2, eps)                \
     do {                                                      \
@@ -42,4 +41,3 @@ static const char PATH_SEP = '/';
 #endif
 
 #endif
-
diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp
index a14e568fb7..c4adbe4138 100644
--- a/unittest/force-styles/test_pair_style.cpp
+++ b/unittest/force-styles/test_pair_style.cpp
@@ -279,7 +279,8 @@ void generate_yaml_file(const char *outfile, const TestConfig &config)
     // init_stress
     auto stress = lmp->force->pair->virial;
     // avoid false positives on tiny stresses. force to zero instead.
-    for (int i = 0; i < 6; ++i) if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0;
+    for (int i = 0; i < 6; ++i)
+        if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0;
     block = fmt::format("{:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e}", stress[0],
                         stress[1], stress[2], stress[3], stress[4], stress[5]);
     writer.emit_block("init_stress", block);
@@ -305,8 +306,9 @@ void generate_yaml_file(const char *outfile, const TestConfig &config)
     // run_stress
     stress = lmp->force->pair->virial;
     // avoid false positives on tiny stresses. force to zero instead.
-    for (int i = 0; i < 6; ++i) if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0;
-    block  = fmt::format("{:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e}", stress[0],
+    for (int i = 0; i < 6; ++i)
+        if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0;
+    block = fmt::format("{:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e}", stress[0],
                         stress[1], stress[2], stress[3], stress[4], stress[5]);
     writer.emit_block("run_stress", block);
 
diff --git a/unittest/force-styles/yaml_writer.cpp b/unittest/force-styles/yaml_writer.cpp
index efbb9b7654..feaa3d52eb 100644
--- a/unittest/force-styles/yaml_writer.cpp
+++ b/unittest/force-styles/yaml_writer.cpp
@@ -12,8 +12,8 @@
 ------------------------------------------------------------------------- */
 
 #include "yaml_writer.h"
-#include "yaml.h"
 #include "fmt/format.h"
+#include "yaml.h"
 
 #include 
 #include 
@@ -52,17 +52,17 @@ YamlWriter::~YamlWriter()
 
 void YamlWriter::emit(const std::string &key, const double value)
 {
-    emit(key,fmt::format("{}",value));
+    emit(key, fmt::format("{}", value));
 }
 
 void YamlWriter::emit(const std::string &key, const long value)
 {
-    emit(key,fmt::format("{}",value));
+    emit(key, fmt::format("{}", value));
 }
 
 void YamlWriter::emit(const std::string &key, const int value)
 {
-    emit(key,fmt::format("{}",value));
+    emit(key, fmt::format("{}", value));
 }
 
 void YamlWriter::emit(const std::string &key, const std::string &value)
diff --git a/unittest/formats/compressed_dump_test.h b/unittest/formats/compressed_dump_test.h
index a8293a9279..9b2dbc905b 100644
--- a/unittest/formats/compressed_dump_test.h
+++ b/unittest/formats/compressed_dump_test.h
@@ -17,9 +17,9 @@
 #include "../testing/systems/melt.h"
 #include 
 
-extern const char * COMPRESS_SUFFIX;
-extern const char * COMPRESS_EXTENSION;
-extern char * COMPRESS_BINARY;
+extern const char *COMPRESS_SUFFIX;
+extern const char *COMPRESS_EXTENSION;
+extern char *COMPRESS_BINARY;
 
 class CompressedDumpTest : public MeltTest {
 protected:
@@ -27,19 +27,23 @@ protected:
     std::string compression_style;
 
 public:
-    CompressedDumpTest(const std::string & dump_style) : MeltTest(), dump_style(dump_style) {
+    CompressedDumpTest(const std::string &dump_style) : MeltTest(), dump_style(dump_style)
+    {
         compression_style = fmt::format("{}/{}", dump_style, COMPRESS_SUFFIX);
     }
 
-    std::string text_dump_filename(std::string ident) {
+    std::string text_dump_filename(std::string ident)
+    {
         return fmt::format("dump_{}_text_{}", COMPRESS_SUFFIX, ident);
     }
 
-    std::string compressed_dump_filename(std::string ident) {
+    std::string compressed_dump_filename(std::string ident)
+    {
         return fmt::format("dump_{}_compressed_{}.{}", COMPRESS_SUFFIX, ident, COMPRESS_EXTENSION);
     }
 
-    std::string converted_dump_filename(std::string ident) {
+    std::string converted_dump_filename(std::string ident)
+    {
         return fmt::format("dump_{}_compressed_{}", COMPRESS_SUFFIX, ident);
     }
 
@@ -64,21 +68,22 @@ public:
     }
 
     void generate_text_and_compressed_dump(std::string text_file, std::string compressed_file,
-                                           std::string dump_options, std::string dump_modify_options, int ntimesteps)
+                                           std::string dump_options,
+                                           std::string dump_modify_options, int ntimesteps)
     {
-        generate_text_and_compressed_dump(text_file, compressed_file,
-                                          dump_options, dump_options,
+        generate_text_and_compressed_dump(text_file, compressed_file, dump_options, dump_options,
                                           dump_modify_options, dump_modify_options, ntimesteps);
     }
 
     void generate_text_and_compressed_dump(std::string text_file, std::string compressed_file,
                                            std::string text_options, std::string compressed_options,
-                                           std::string text_modify_options, std::string compressed_modify_options,
-                                           int ntimesteps)
+                                           std::string text_modify_options,
+                                           std::string compressed_modify_options, int ntimesteps)
     {
         BEGIN_HIDE_OUTPUT();
         command(fmt::format("dump id0 all {} 1 {} {}", dump_style, text_file, text_options));
-        command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_file, compressed_options));
+        command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_file,
+                            compressed_options));
 
         if (!text_modify_options.empty()) {
             command(fmt::format("dump_modify id0 {}", text_modify_options));
diff --git a/unittest/formats/compressed_dump_test_main.cpp b/unittest/formats/compressed_dump_test_main.cpp
index 3c45ac45c7..e85f616776 100644
--- a/unittest/formats/compressed_dump_test_main.cpp
+++ b/unittest/formats/compressed_dump_test_main.cpp
@@ -11,8 +11,8 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
-#include "compressed_dump_test.h"
 #include "../testing/utils.h"
+#include "compressed_dump_test.h"
 #include "fmt/format.h"
 #include "utils.h"
 #include "gmock/gmock.h"
@@ -20,10 +20,10 @@
 
 #include 
 
-const char * COMPRESS_SUFFIX = nullptr;
-const char * COMPRESS_EXTENSION = nullptr;
-char * COMPRESS_BINARY = nullptr;
-bool verbose = false;
+const char *COMPRESS_SUFFIX    = nullptr;
+const char *COMPRESS_EXTENSION = nullptr;
+char *COMPRESS_BINARY          = nullptr;
+bool verbose                   = false;
 
 int main(int argc, char **argv)
 {
@@ -35,11 +35,11 @@ int main(int argc, char **argv)
         return 1;
     }
 
-    if(strcmp(argv[1], "gz") == 0) {
-        COMPRESS_SUFFIX = "gz";
+    if (strcmp(argv[1], "gz") == 0) {
+        COMPRESS_SUFFIX    = "gz";
         COMPRESS_EXTENSION = "gz";
-    } else if(strcmp(argv[1], "zstd") == 0) {
-        COMPRESS_SUFFIX = "zstd";
+    } else if (strcmp(argv[1], "zstd") == 0) {
+        COMPRESS_SUFFIX    = "zstd";
         COMPRESS_EXTENSION = "zst";
     } else {
         std::cerr << "usage: " << argv[0] << " (gz|zstd)\n\n" << std::endl;
diff --git a/unittest/formats/test_atom_styles.cpp b/unittest/formats/test_atom_styles.cpp
index 71c1ed882f..59c0e1350c 100644
--- a/unittest/formats/test_atom_styles.cpp
+++ b/unittest/formats/test_atom_styles.cpp
@@ -4751,10 +4751,10 @@ TEST_F(AtomStyleTest, property_atom)
     expected.has_mass_setflag = true;
     expected.has_sametag      = true;
     expected.has_extra        = true;
-    expected.has_ivname         = true;
-    expected.has_dvname         = true;
-    expected.has_ianame         = true;
-    expected.has_daname         = true;
+    expected.has_ivname       = true;
+    expected.has_dvname       = true;
+    expected.has_ianame       = true;
+    expected.has_daname       = true;
     expected.nextra_store     = 12;
 
     ASSERT_ATOM_STATE_EQ(lmp->atom, expected);
diff --git a/unittest/formats/test_dump_atom_compressed.cpp b/unittest/formats/test_dump_atom_compressed.cpp
index 86297ac84c..dcc3d49d6e 100644
--- a/unittest/formats/test_dump_atom_compressed.cpp
+++ b/unittest/formats/test_dump_atom_compressed.cpp
@@ -20,13 +20,11 @@
 
 #include 
 
-
 using ::testing::Eq;
 
 class DumpAtomCompressTest : public CompressedDumpTest {
 public:
-    DumpAtomCompressTest() : CompressedDumpTest("atom") {
-    }
+    DumpAtomCompressTest() : CompressedDumpTest("atom") {}
 };
 
 //-------------------------------------------------------------------------------------------------
@@ -40,8 +38,9 @@ TEST_F(DumpAtomCompressTest, compressed_run0)
     auto text_file       = text_dump_filename("run0.melt");
     auto compressed_file = compressed_dump_filename("run0.melt");
 
-    if(compression_style == "atom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum yes", 0);
+    if (compression_style == "atom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum yes",
+                                          0);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 0);
     }
@@ -68,8 +67,9 @@ TEST_F(DumpAtomCompressTest, compressed_no_buffer_run0)
     auto text_file       = text_dump_filename("no_buffer_run0.melt");
     auto compressed_file = compressed_dump_filename("no_buffer_run0.melt");
 
-    if(compression_style == "atom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, "", "", "buffer no", "buffer no checksum yes", 0);
+    if (compression_style == "atom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, "", "", "buffer no",
+                                          "buffer no checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "buffer no", 0);
     }
@@ -103,7 +103,7 @@ TEST_F(DumpAtomCompressTest, compressed_multi_file_run1)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto compressed_file_1 = compressed_dump_filename(base_name_1);
 
-    if(compression_style == "atom/zstd") {
+    if (compression_style == "atom/zstd") {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum no", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 1);
@@ -369,12 +369,13 @@ TEST_F(DumpAtomCompressTest, compressed_modify_bad_param)
     if (compression_style != "atom/gz") GTEST_SKIP();
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {}", compression_style, compressed_dump_filename("modify_bad_param_run0_*.melt")));
+    command(fmt::format("dump id1 all {} 1 {}", compression_style,
+                        compressed_dump_filename("modify_bad_param_run0_*.melt")));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 compression_level 12"););
 }
 
 TEST_F(DumpAtomCompressTest, compressed_modify_multi_bad_param)
@@ -382,12 +383,13 @@ TEST_F(DumpAtomCompressTest, compressed_modify_multi_bad_param)
     if (compression_style != "atom/gz") GTEST_SKIP();
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {}", compression_style, compressed_dump_filename("modify_multi_bad_param_run0_*.melt")));
+    command(fmt::format("dump id1 all {} 1 {}", compression_style,
+                        compressed_dump_filename("modify_multi_bad_param_run0_*.melt")));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 pad 3 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 pad 3 compression_level 12"););
 }
 
 TEST_F(DumpAtomCompressTest, compressed_modify_clevel_run0)
@@ -398,7 +400,8 @@ TEST_F(DumpAtomCompressTest, compressed_modify_clevel_run0)
     auto text_file       = text_dump_filename(base_name);
     auto compressed_file = compressed_dump_filename(base_name);
 
-    generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3", 0);
+    generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3",
+                                      0);
 
     TearDown();
 
diff --git a/unittest/formats/test_dump_cfg.cpp b/unittest/formats/test_dump_cfg.cpp
index 0acc8bc732..a180c6b342 100644
--- a/unittest/formats/test_dump_cfg.cpp
+++ b/unittest/formats/test_dump_cfg.cpp
@@ -97,7 +97,8 @@ TEST_F(DumpCfgTest, write_dump)
     ASSERT_THAT(lines[0], Eq("Number of particles = 32"));
     delete_file("dump_cfg0.melt.cfg");
 
-    TEST_FAILURE(".*ERROR: Unrecognized dump style 'xxx'.*", command("write_dump all xxx test.xxx"););
+    TEST_FAILURE(".*ERROR: Unrecognized dump style 'xxx'.*",
+                 command("write_dump all xxx test.xxx"););
 }
 
 TEST_F(DumpCfgTest, unwrap_run0)
diff --git a/unittest/formats/test_dump_cfg_compressed.cpp b/unittest/formats/test_dump_cfg_compressed.cpp
index 99da96c766..67d7084ab9 100644
--- a/unittest/formats/test_dump_cfg_compressed.cpp
+++ b/unittest/formats/test_dump_cfg_compressed.cpp
@@ -20,13 +20,11 @@
 
 #include 
 
-
 using ::testing::Eq;
 
 class DumpCfgCompressTest : public CompressedDumpTest {
 public:
-    DumpCfgCompressTest() : CompressedDumpTest("cfg") {
-    }
+    DumpCfgCompressTest() : CompressedDumpTest("cfg") {}
 };
 
 //-------------------------------------------------------------------------------------------------
@@ -46,8 +44,9 @@ TEST_F(DumpCfgCompressTest, compressed_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
 
-    if(compression_style == "cfg/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "", "checksum yes", 0);
+    if (compression_style == "cfg/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "",
+                                          "checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
     }
@@ -79,8 +78,9 @@ TEST_F(DumpCfgCompressTest, compressed_no_buffer_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
 
-    if(compression_style == "cfg/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "buffer no", "buffer no", 0);
+    if (compression_style == "cfg/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "buffer no",
+                                          "buffer no", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "buffer no", 0);
     }
@@ -110,7 +110,7 @@ TEST_F(DumpCfgCompressTest, compressed_unwrap_run0)
     auto base_name_0       = "unwrap_run0.melt.cfg";
     auto text_file_0       = text_dump_filename(base_name_0);
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
-    auto fields            = "mass type xsu ysu zsu id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
+    auto fields = "mass type xsu ysu zsu id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
 
     generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
 
@@ -143,8 +143,9 @@ TEST_F(DumpCfgCompressTest, compressed_multi_file_run1)
     auto compressed_file_1 = compressed_dump_filename(base_name_1);
     auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
 
-    if(compression_style == "cfg/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "checksum no", 1);
+    if (compression_style == "cfg/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                          "checksum no", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "", 1);
     }
@@ -262,28 +263,31 @@ TEST_F(DumpCfgCompressTest, compressed_modify_bad_param)
 {
     if (compression_style != "cfg/gz") GTEST_SKIP();
 
-    auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
+    auto fields = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_bad_param_run0_*.melt.cfg"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_bad_param_run0_*.melt.cfg"), fields));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 compression_level 12"););
 }
 
 TEST_F(DumpCfgCompressTest, compressed_modify_multi_bad_param)
 {
     if (compression_style != "cfg/gz") GTEST_SKIP();
 
-    auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
+    auto fields = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_multi_bad_param_run0_*.melt.cfg"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_multi_bad_param_run0_*.melt.cfg"),
+                        fields));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 pad 3 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 pad 3 compression_level 12"););
 }
 
 TEST_F(DumpCfgCompressTest, compressed_modify_clevel_run0)
@@ -298,7 +302,8 @@ TEST_F(DumpCfgCompressTest, compressed_modify_clevel_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "mass type xs ys zs id proc procp1 x y z ix iy iz vx vy vz fx fy fz";
 
-    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "compression_level 3", 0);
+    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                      "compression_level 3", 0);
 
     TearDown();
 
diff --git a/unittest/formats/test_dump_custom_compressed.cpp b/unittest/formats/test_dump_custom_compressed.cpp
index dabca80a6e..a69fd98c41 100644
--- a/unittest/formats/test_dump_custom_compressed.cpp
+++ b/unittest/formats/test_dump_custom_compressed.cpp
@@ -20,13 +20,11 @@
 
 #include 
 
-
 using ::testing::Eq;
 
 class DumpCustomCompressTest : public CompressedDumpTest {
 public:
-    DumpCustomCompressTest() : CompressedDumpTest("custom") {
-    }
+    DumpCustomCompressTest() : CompressedDumpTest("custom") {}
 };
 
 TEST_F(DumpCustomCompressTest, compressed_run1)
@@ -38,8 +36,9 @@ TEST_F(DumpCustomCompressTest, compressed_run1)
     auto compressed_file = compressed_dump_filename(base_name);
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
 
-    if(compression_style == "custom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "units yes", "units yes checksum yes", 1);
+    if (compression_style == "custom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "units yes",
+                                          "units yes checksum yes", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "units yes", 1);
     }
@@ -67,8 +66,9 @@ TEST_F(DumpCustomCompressTest, compressed_with_time_run1)
     auto compressed_file = compressed_dump_filename(base_name);
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
 
-    if(compression_style == "custom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "time yes", "time yes checksum yes", 1);
+    if (compression_style == "custom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "time yes",
+                                          "time yes checksum yes", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "time yes", 1);
     }
@@ -96,8 +96,9 @@ TEST_F(DumpCustomCompressTest, compressed_no_buffer_run1)
     auto compressed_file = compressed_dump_filename(base_name);
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
 
-    if(compression_style == "custom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "buffer no", "buffer no checksum yes", 1);
+    if (compression_style == "custom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "buffer no",
+                                          "buffer no checksum yes", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "buffer no", 1);
     }
@@ -158,8 +159,9 @@ TEST_F(DumpCustomCompressTest, compressed_multi_file_run1)
     auto compressed_file_1 = compressed_dump_filename(base_name_1);
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
 
-    if(compression_style == "custom/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "checksum no", 1);
+    if (compression_style == "custom/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                          "checksum no", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "", 1);
     }
@@ -278,11 +280,12 @@ TEST_F(DumpCustomCompressTest, compressed_modify_bad_param)
     if (compression_style != "custom/gz") GTEST_SKIP();
 
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_bad_param_run0_*.melt.custom"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_bad_param_run0_*.melt.custom"), fields));
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 compression_level 12"););
 }
 
 TEST_F(DumpCustomCompressTest, compressed_modify_multi_bad_param)
@@ -290,11 +293,13 @@ TEST_F(DumpCustomCompressTest, compressed_modify_multi_bad_param)
     if (compression_style != "custom/gz") GTEST_SKIP();
 
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_multi_bad_param_run0_*.melt.custom"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_multi_bad_param_run0_*.melt.custom"),
+                        fields));
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 pad 3 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 pad 3 compression_level 12"););
 }
 
 TEST_F(DumpCustomCompressTest, compressed_modify_clevel_run0)
@@ -306,7 +311,8 @@ TEST_F(DumpCustomCompressTest, compressed_modify_clevel_run0)
     auto compressed_file = compressed_dump_filename(base_name);
 
     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
-    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "compression_level 3", 0);
+    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                      "compression_level 3", 0);
 
     TearDown();
 
diff --git a/unittest/formats/test_dump_local.cpp b/unittest/formats/test_dump_local.cpp
index b18e3da054..3b8b36f06f 100644
--- a/unittest/formats/test_dump_local.cpp
+++ b/unittest/formats/test_dump_local.cpp
@@ -39,7 +39,8 @@ public:
         END_HIDE_OUTPUT();
     }
 
-    void generate_dump(std::string dump_file, std::string dump_options, std::string dump_modify_options, int ntimesteps)
+    void generate_dump(std::string dump_file, std::string dump_options,
+                       std::string dump_modify_options, int ntimesteps)
     {
         BEGIN_HIDE_OUTPUT();
         command(fmt::format("dump id all {} 1 {} {}", dump_style, dump_file, dump_options));
@@ -59,7 +60,8 @@ public:
         END_HIDE_OUTPUT();
     }
 
-    void SetUp() override {
+    void SetUp() override
+    {
         MeltTest::SetUp();
 
         BEGIN_HIDE_OUTPUT();
diff --git a/unittest/formats/test_dump_local_compressed.cpp b/unittest/formats/test_dump_local_compressed.cpp
index 8636be347a..2f4c6086c2 100644
--- a/unittest/formats/test_dump_local_compressed.cpp
+++ b/unittest/formats/test_dump_local_compressed.cpp
@@ -20,15 +20,14 @@
 
 #include 
 
-
 using ::testing::Eq;
 
 class DumpLocalCompressTest : public CompressedDumpTest {
 public:
-    DumpLocalCompressTest() : CompressedDumpTest("local") {
-    }
+    DumpLocalCompressTest() : CompressedDumpTest("local") {}
 
-    void SetUp() override {
+    void SetUp() override
+    {
         CompressedDumpTest::SetUp();
 
         BEGIN_HIDE_OUTPUT();
@@ -49,8 +48,9 @@ TEST_F(DumpLocalCompressTest, compressed_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "", "checksum yes", 0);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "",
+                                          "checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
     }
@@ -81,8 +81,9 @@ TEST_F(DumpLocalCompressTest, compressed_no_buffer_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "buffer no", "buffer no checksum yes", 0);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "buffer no",
+                                          "buffer no checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "buffer no", 0);
     }
@@ -113,8 +114,9 @@ TEST_F(DumpLocalCompressTest, compressed_with_time_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "time yes", "time yes checksum yes", 0);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "time yes",
+                                          "time yes checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "time yes", 0);
     }
@@ -145,8 +147,9 @@ TEST_F(DumpLocalCompressTest, compressed_with_units_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "units yes", "units yes checksum yes", 0);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "units yes",
+                                          "units yes checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "units yes", 0);
     }
@@ -178,8 +181,9 @@ TEST_F(DumpLocalCompressTest, compressed_triclinic_run0)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "", "checksum yes", 0);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "",
+                                          "checksum yes", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
     }
@@ -213,8 +217,9 @@ TEST_F(DumpLocalCompressTest, compressed_multi_file_run1)
     auto compressed_file_1 = compressed_dump_filename(base_name_1);
     auto fields            = "index c_comp[1]";
 
-    if(compression_style == "local/zstd") {
-        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "checksum no", 1);
+    if (compression_style == "local/zstd") {
+        generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                          "checksum no", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, fields, "", 1);
     }
@@ -332,30 +337,33 @@ TEST_F(DumpLocalCompressTest, compressed_modify_bad_param)
 {
     if (compression_style != "local/gz") GTEST_SKIP();
 
-    auto fields            = "index c_comp[1]";
+    auto fields = "index c_comp[1]";
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_bad_param_run0_*.melt.local"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_bad_param_run0_*.melt.local"), fields));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 compression_level 12"););
 }
 
 TEST_F(DumpLocalCompressTest, compressed_modify_multi_bad_param)
 {
     if (compression_style != "local/gz") GTEST_SKIP();
 
-    auto fields            = "index c_comp[1]";
+    auto fields = "index c_comp[1]";
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {} {}", compression_style, compressed_dump_filename("modify_multi_bad_param_run0_*.melt.local"), fields));
+    command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
+                        compressed_dump_filename("modify_multi_bad_param_run0_*.melt.local"),
+                        fields));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 pad 3 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 pad 3 compression_level 12"););
 }
 
 TEST_F(DumpLocalCompressTest, compressed_modify_clevel_run0)
@@ -365,9 +373,10 @@ TEST_F(DumpLocalCompressTest, compressed_modify_clevel_run0)
     auto base_name       = "modify_clevel_run0.melt.local";
     auto text_file       = text_dump_filename(base_name);
     auto compressed_file = compressed_dump_filename(base_name);
-    auto fields            = "index c_comp[1]";
+    auto fields          = "index c_comp[1]";
 
-    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "", "compression_level 3", 0);
+    generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
+                                      "compression_level 3", 0);
 
     TearDown();
 
diff --git a/unittest/formats/test_dump_xyz_compressed.cpp b/unittest/formats/test_dump_xyz_compressed.cpp
index 4cf31571ee..a851129c6c 100644
--- a/unittest/formats/test_dump_xyz_compressed.cpp
+++ b/unittest/formats/test_dump_xyz_compressed.cpp
@@ -20,13 +20,11 @@
 
 #include 
 
-
 using ::testing::Eq;
 
 class DumpXYZCompressTest : public CompressedDumpTest {
 public:
-    DumpXYZCompressTest() : CompressedDumpTest("xyz") {
-    }
+    DumpXYZCompressTest() : CompressedDumpTest("xyz") {}
 };
 
 TEST_F(DumpXYZCompressTest, compressed_run0)
@@ -40,8 +38,9 @@ TEST_F(DumpXYZCompressTest, compressed_run0)
     auto text_file_0       = text_dump_filename(base_name_0);
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
 
-    if(compression_style == "xyz/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, "", "", "", "checksum yes", 0);
+    if (compression_style == "xyz/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, "", "", "", "checksum yes",
+                                          0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, "", "", 0);
     }
@@ -71,8 +70,9 @@ TEST_F(DumpXYZCompressTest, compressed_no_buffer_run0)
     auto text_file_0       = text_dump_filename(base_name_0);
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
 
-    if(compression_style == "xyz/zstd") {
-        generate_text_and_compressed_dump(text_files, compressed_files, "", "", "buffer no", "buffer no", 0);
+    if (compression_style == "xyz/zstd") {
+        generate_text_and_compressed_dump(text_files, compressed_files, "", "", "buffer no",
+                                          "buffer no", 0);
     } else {
         generate_text_and_compressed_dump(text_files, compressed_files, "", "buffer no", 0);
     }
@@ -105,7 +105,7 @@ TEST_F(DumpXYZCompressTest, compressed_multi_file_run1)
     auto compressed_file_0 = compressed_dump_filename(base_name_0);
     auto compressed_file_1 = compressed_dump_filename(base_name_1);
 
-    if(compression_style == "xyz/zstd") {
+    if (compression_style == "xyz/zstd") {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum no", 1);
     } else {
         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 1);
@@ -223,12 +223,13 @@ TEST_F(DumpXYZCompressTest, compressed_modify_bad_param)
     if (compression_style != "xyz/gz") GTEST_SKIP();
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {}", compression_style, compressed_dump_filename("modify_bad_param_run0_*.melt.xyz")));
+    command(fmt::format("dump id1 all {} 1 {}", compression_style,
+                        compressed_dump_filename("modify_bad_param_run0_*.melt.xyz")));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 compression_level 12"););
 }
 
 TEST_F(DumpXYZCompressTest, compressed_modify_multi_bad_param)
@@ -236,12 +237,13 @@ TEST_F(DumpXYZCompressTest, compressed_modify_multi_bad_param)
     if (compression_style != "xyz/gz") GTEST_SKIP();
 
     BEGIN_HIDE_OUTPUT();
-    command(fmt::format("dump id1 all {} 1 {}", compression_style, compressed_dump_filename("modify_multi_bad_param_run0_*.melt.xyz")));
+    command(fmt::format("dump id1 all {} 1 {}", compression_style,
+                        compressed_dump_filename("modify_multi_bad_param_run0_*.melt.xyz")));
     END_HIDE_OUTPUT();
 
-    TEST_FAILURE(".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
-        command("dump_modify id1 pad 3 compression_level 12");
-    );
+    TEST_FAILURE(
+        ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
+        command("dump_modify id1 pad 3 compression_level 12"););
 }
 
 TEST_F(DumpXYZCompressTest, compressed_modify_clevel_run0)
@@ -252,7 +254,8 @@ TEST_F(DumpXYZCompressTest, compressed_modify_clevel_run0)
     auto text_file       = text_dump_filename(base_name);
     auto compressed_file = compressed_dump_filename(base_name);
 
-    generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3", 0);
+    generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3",
+                                      0);
 
     TearDown();
 
diff --git a/unittest/formats/test_eim_potential_file_reader.cpp b/unittest/formats/test_eim_potential_file_reader.cpp
index 762252c312..532df11c3f 100644
--- a/unittest/formats/test_eim_potential_file_reader.cpp
+++ b/unittest/formats/test_eim_potential_file_reader.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "MANYBODY/pair_eim.h"
 #include "info.h"
 #include "input.h"
@@ -18,7 +19,6 @@
 #include "utils.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -39,7 +39,7 @@ protected:
         testbinary = "EIMPotentialFileReaderTest";
         LAMMPSTest::SetUp();
         ASSERT_NE(lmp, nullptr);
-    
+
         BEGIN_HIDE_OUTPUT();
         command("units metal");
         END_HIDE_OUTPUT();
diff --git a/unittest/formats/test_file_operations.cpp b/unittest/formats/test_file_operations.cpp
index 0f7362674c..08baed2e54 100644
--- a/unittest/formats/test_file_operations.cpp
+++ b/unittest/formats/test_file_operations.cpp
@@ -56,13 +56,15 @@ protected:
         out.open("file_with_long_lines_test.txt", std::ios_base::out | std::ios_base::binary);
         ASSERT_TRUE(out.good());
         out << "zero ##########################################################"
-            "##################################################################"
-            "##################################################################"
-            "############################################################\n";
+               "##################################################################"
+               "##################################################################"
+               "############################################################\n";
         out << "one line\ntwo_lines\n\n";
-        for (int i = 0; i < 100; ++i) out << "one two ";
+        for (int i = 0; i < 100; ++i)
+            out << "one two ";
         out << "\nthree\nfour five #";
-        for (int i = 0; i < 1000; ++i) out << '#';
+        for (int i = 0; i < 1000; ++i)
+            out << '#';
         out.close();
     }
 
@@ -74,7 +76,7 @@ protected:
     }
 };
 
-static constexpr int MAX_BUF_SIZE=128;
+static constexpr int MAX_BUF_SIZE = 128;
 
 TEST_F(FileOperationsTest, safe_fgets)
 {
@@ -123,51 +125,51 @@ TEST_F(FileOperationsTest, fgets_trunc)
     memset(buf, 0, MAX_BUF_SIZE);
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
     ASSERT_THAT(buf, StrEq("one line\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     // read line of exactly the buffer length
     memset(buf, 0, MAX_BUF_SIZE);
     ptr = utils::fgets_trunc(buf, sizeof("two_lines\n"), fp);
     ASSERT_THAT(buf, StrEq("two_lines\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     memset(buf, 0, MAX_BUF_SIZE);
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
     ASSERT_THAT(buf, StrEq("\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     memset(buf, 0, MAX_BUF_SIZE);
     ptr = utils::fgets_trunc(buf, 4, fp);
     ASSERT_THAT(buf, StrEq("no\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
-    ASSERT_EQ(ptr,nullptr);
+    ASSERT_EQ(ptr, nullptr);
     fclose(fp);
 
     fp = fopen("file_with_long_lines_test.txt", "r");
-    ASSERT_NE(fp,nullptr);
+    ASSERT_NE(fp, nullptr);
 
     memset(buf, 0, MAX_BUF_SIZE);
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
     ASSERT_THAT(buf, StrEq("zero ##########################################################"
                            "###############################################################\n"));
 
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
     ASSERT_THAT(buf, StrEq("one line\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
     ASSERT_THAT(buf, StrEq("two_lines\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
     ASSERT_THAT(buf, StrEq("\n"));
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
 
     ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
-    ASSERT_NE(ptr,nullptr);
+    ASSERT_NE(ptr, nullptr);
     ASSERT_THAT(buf, StrEq("one two one two one two one two one two one two one two one two "
                            "one two one two one two one two one two one two one two one tw\n"));
 
@@ -286,8 +288,7 @@ TEST_F(FileOperationsTest, error_all_one)
     command("echo none");
     command("log none");
     END_HIDE_OUTPUT();
-    TEST_FAILURE(".*ERROR: exit \\(testme.cpp:10\\).*",
-                 lmp->error->all("testme.cpp", 10, "exit"););
+    TEST_FAILURE(".*ERROR: exit \\(testme.cpp:10\\).*", lmp->error->all("testme.cpp", 10, "exit"););
     TEST_FAILURE(".*ERROR: exit too \\(testme.cpp:10\\).*",
                  lmp->error->all("testme.cpp", 10, "exit {}", "too"););
     TEST_FAILURE(".*ERROR: argument not found \\(testme.cpp:10\\).*",
diff --git a/unittest/formats/test_image_flags.cpp b/unittest/formats/test_image_flags.cpp
index 59fc6f0f6a..2486d49031 100644
--- a/unittest/formats/test_image_flags.cpp
+++ b/unittest/formats/test_image_flags.cpp
@@ -11,11 +11,11 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "atom.h"
 #include "input.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
diff --git a/unittest/formats/test_molecule_file.cpp b/unittest/formats/test_molecule_file.cpp
index d13a90524c..5a3e3ca750 100644
--- a/unittest/formats/test_molecule_file.cpp
+++ b/unittest/formats/test_molecule_file.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "atom.h"
 #include "info.h"
 #include "input.h"
@@ -19,7 +20,6 @@
 #include "utils.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
@@ -34,8 +34,7 @@ using utils::split_words;
 
 #define test_name test_info_->name()
 
-
-static void create_molecule_files(const std::string & h2o_filename, const std::string & co2_filename)
+static void create_molecule_files(const std::string &h2o_filename, const std::string &co2_filename)
 {
     // create molecule files
     const char h2o_file[] = "# Water molecule. SPC/E model.\n\n3 atoms\n2 bonds\n1 angles\n\n"
@@ -77,11 +76,10 @@ bool verbose = false;
 
 class MoleculeFileTest : public LAMMPSTest {
 protected:
-    static void SetUpTestSuite() {
-        create_molecule_files("moltest.h2o.mol", "moltest.co2.mol");
-    }
+    static void SetUpTestSuite() { create_molecule_files("moltest.h2o.mol", "moltest.co2.mol"); }
 
-    static void TearDownTestSuite() {
+    static void TearDownTestSuite()
+    {
         remove("moltest.h2o.mol");
         remove("moltest.co2.mol");
     }
@@ -93,10 +91,7 @@ protected:
         ASSERT_NE(lmp, nullptr);
     }
 
-    void TearDown() override
-    {
-        LAMMPSTest::TearDown();
-    }
+    void TearDown() override { LAMMPSTest::TearDown(); }
 
     void run_mol_cmd(const std::string &name, const std::string &args, const std::string &content)
     {
diff --git a/unittest/formats/test_pair_unit_convert.cpp b/unittest/formats/test_pair_unit_convert.cpp
index 597471727e..e989f5c7f6 100644
--- a/unittest/formats/test_pair_unit_convert.cpp
+++ b/unittest/formats/test_pair_unit_convert.cpp
@@ -11,6 +11,7 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "../testing/core.h"
 #include "atom.h"
 #include "force.h"
 #include "info.h"
@@ -20,7 +21,6 @@
 #include "thermo.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "../testing/core.h"
 
 #include 
 #include 
diff --git a/unittest/formats/test_potential_file_reader.cpp b/unittest/formats/test_potential_file_reader.cpp
index af6abfa25f..5f7148b7e4 100644
--- a/unittest/formats/test_potential_file_reader.cpp
+++ b/unittest/formats/test_potential_file_reader.cpp
@@ -20,9 +20,9 @@
 #include "MANYBODY/pair_tersoff.h"
 #include "MANYBODY/pair_tersoff_mod.h"
 #include "MANYBODY/pair_tersoff_mod_c.h"
+#include "MANYBODY/pair_tersoff_table.h"
 #include "MANYBODY/pair_tersoff_zbl.h"
 #include "MANYBODY/pair_vashishta.h"
-#include "MANYBODY/pair_tersoff_table.h"
 #include "info.h"
 #include "input.h"
 #include "potential_file_reader.h"
@@ -318,7 +318,7 @@ TEST_F(OpenPotentialTest, No_file)
     command("units metal");
     FILE *fp = utils::open_potential("Unknown.sw", lmp, &convert_flag);
     END_HIDE_OUTPUT();
-    ASSERT_EQ(fp,nullptr);
+    ASSERT_EQ(fp, nullptr);
 }
 
 int main(int argc, char **argv)
diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp
index 7e5f3921f5..4e1f608d25 100644
--- a/unittest/formats/test_text_file_reader.cpp
+++ b/unittest/formats/test_text_file_reader.cpp
@@ -78,18 +78,17 @@ TEST_F(TextFileReaderTest, permissions)
 
 TEST_F(TextFileReaderTest, nofp)
 {
-    ASSERT_THROW({ TextFileReader reader(nullptr, "test"); },
-                 FileReaderException);
+    ASSERT_THROW({ TextFileReader reader(nullptr, "test"); }, FileReaderException);
 }
 
 TEST_F(TextFileReaderTest, usefp)
 {
     test_files();
-    FILE *fp = fopen("text_reader_two.file","r");
-    ASSERT_NE(fp,nullptr);
+    FILE *fp = fopen("text_reader_two.file", "r");
+    ASSERT_NE(fp, nullptr);
 
     auto reader = new TextFileReader(fp, "test");
-    auto line              = reader->next_line();
+    auto line   = reader->next_line();
     ASSERT_STREQ(line, "4  ");
     line = reader->next_line(1);
     ASSERT_STREQ(line, "4 0.5   ");
@@ -100,14 +99,14 @@ TEST_F(TextFileReaderTest, usefp)
     ASSERT_STREQ(values.next_string().c_str(), "1.5");
     ASSERT_NE(reader->next_line(), nullptr);
     double data[20];
-    ASSERT_THROW({ reader->next_dvector(data,20); }, FileReaderException);
+    ASSERT_THROW({ reader->next_dvector(data, 20); }, FileReaderException);
     ASSERT_THROW({ reader->skip_line(); }, EOFException);
     ASSERT_EQ(reader->next_line(), nullptr);
     delete reader;
 
     // check that we reached EOF and the destructor didn't close the file.
-    ASSERT_EQ(feof(fp),1);
-    ASSERT_EQ(fclose(fp),0);
+    ASSERT_EQ(feof(fp), 1);
+    ASSERT_EQ(fclose(fp), 0);
 }
 
 TEST_F(TextFileReaderTest, comments)
@@ -126,7 +125,7 @@ TEST_F(TextFileReaderTest, comments)
     ASSERT_STREQ(values.next_string().c_str(), "1.5");
     ASSERT_NE(reader.next_line(), nullptr);
     double data[20];
-    ASSERT_THROW({ reader.next_dvector(data,20); }, FileReaderException);
+    ASSERT_THROW({ reader.next_dvector(data, 20); }, FileReaderException);
     ASSERT_THROW({ reader.skip_line(); }, EOFException);
     ASSERT_EQ(reader.next_line(), nullptr);
 }
diff --git a/unittest/python/test_python_package.cpp b/unittest/python/test_python_package.cpp
index 735d49ac51..ac40a2eae4 100644
--- a/unittest/python/test_python_package.cpp
+++ b/unittest/python/test_python_package.cpp
@@ -14,15 +14,15 @@
 #include "atom.h"
 #include "info.h"
 #include "input.h"
-#include "variable.h"
 #include "library.h"
+#include "variable.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 
 #include 
 #include 
-#include 
 #include 
+#include 
 
 #include "../testing/core.h"
 #include "../testing/systems/melt.h"
@@ -32,16 +32,17 @@
 #define XSTR(val) #val
 std::string INPUT_FOLDER = STRINGIFY(TEST_INPUT_FOLDER);
 
-const char * LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent metus.";
+const char *LOREM_IPSUM =
+    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent metus.";
 bool verbose = false;
 
 using LAMMPS_NS::utils::split_words;
 
 namespace LAMMPS_NS {
-using ::testing::MatchesRegex;
-using ::testing::StrEq;
 using ::testing::Eq;
 using ::testing::HasSubstr;
+using ::testing::MatchesRegex;
+using ::testing::StrEq;
 
 class PythonPackageTest : public LAMMPSTest {
 protected:
@@ -115,7 +116,8 @@ TEST_F(PythonPackageTest, InvokeFunctionPassString)
     // execute python function, passing string as argument
     HIDE_OUTPUT([&] {
         command("variable val python bool_to_val");
-        command("python bool_to_val input 1 \"true\" format sf return v_val file ${input_dir}/func.py");
+        command(
+            "python bool_to_val input 1 \"true\" format sf return v_val file ${input_dir}/func.py");
     });
 
     ASSERT_EQ(get_variable_value("val"), 1.0);
@@ -126,7 +128,8 @@ TEST_F(PythonPackageTest, InvokeFunctionPassStringVariable)
     // execute python function, passing string variable as argument
     HIDE_OUTPUT([&] {
         command("variable val python bool_to_val");
-        command("python bool_to_val input 1 v_str format sf return v_val file ${input_dir}/func.py");
+        command(
+            "python bool_to_val input 1 v_str format sf return v_val file ${input_dir}/func.py");
     });
 
     HIDE_OUTPUT([&] {
@@ -147,7 +150,8 @@ TEST_F(PythonPackageTest, InvokeStringFunction)
     // execute python function, passing string variable as argument
     HIDE_OUTPUT([&] {
         command("variable str python val_to_bool");
-        command("python val_to_bool input 1 v_val format is return v_str file ${input_dir}/func.py");
+        command(
+            "python val_to_bool input 1 v_val format is return v_str file ${input_dir}/func.py");
     });
 
     HIDE_OUTPUT([&] {
@@ -264,8 +268,7 @@ TEST_F(PythonPackageTest, RunSourceInline)
         command("python xyz source \"\"\"\n"
                 "from __future__ import print_function\n"
                 "print(2+2)\n"
-                "\"\"\""
-        );
+                "\"\"\"");
     });
 
     ASSERT_THAT(output, HasSubstr("4"));
@@ -287,9 +290,9 @@ TEST_F(FixPythonInvokeTest, end_of_step)
     });
 
     auto lines = utils::split_lines(output);
-    int count = 0;
+    int count  = 0;
 
-    for(auto & line : lines) {
+    for (auto &line : lines) {
         if (line == "PYTHON_END_OF_STEP") ++count;
     }
 
@@ -312,9 +315,9 @@ TEST_F(FixPythonInvokeTest, post_force)
     });
 
     auto lines = utils::split_lines(output);
-    int count = 0;
+    int count  = 0;
 
-    for(auto & line : lines) {
+    for (auto &line : lines) {
         if (line == "PYTHON_POST_FORCE") ++count;
     }
 
diff --git a/unittest/testing/core.h b/unittest/testing/core.h
index e332d57d8f..6867d88587 100644
--- a/unittest/testing/core.h
+++ b/unittest/testing/core.h
@@ -13,38 +13,37 @@
 #ifndef TESTING_CORE__H
 #define TESTING_CORE__H
 
+#include "exceptions.h"
 #include "info.h"
 #include "input.h"
 #include "lammps.h"
 #include "variable.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "exceptions.h"
 
 #include 
-#include 
 #include 
+#include 
 
 using namespace LAMMPS_NS;
 
 using ::testing::MatchesRegex;
 
-#define TEST_FAILURE(errmsg, ...)                                 \
-    if (Info::has_exceptions()) {                                 \
-        ::testing::internal::CaptureStdout();                     \
-        ASSERT_ANY_THROW({__VA_ARGS__});                          \
-        auto mesg = ::testing::internal::GetCapturedStdout();     \
-        ASSERT_THAT(mesg, MatchesRegex(errmsg));                  \
-    } else {                                                      \
-        if (Info::get_mpi_vendor() != "Open MPI") {               \
-            ::testing::internal::CaptureStdout();                 \
-            ASSERT_DEATH({__VA_ARGS__}, "");                      \
-            auto mesg = ::testing::internal::GetCapturedStdout(); \
-            ASSERT_THAT(mesg, MatchesRegex(errmsg));              \
-        }                                                         \
-        else { \
-           std::cerr << "[          ] [ INFO ] Skipping death test (no exception support) \n";   \
-        } \
+#define TEST_FAILURE(errmsg, ...)                                                               \
+    if (Info::has_exceptions()) {                                                               \
+        ::testing::internal::CaptureStdout();                                                   \
+        ASSERT_ANY_THROW({__VA_ARGS__});                                                        \
+        auto mesg = ::testing::internal::GetCapturedStdout();                                   \
+        ASSERT_THAT(mesg, MatchesRegex(errmsg));                                                \
+    } else {                                                                                    \
+        if (Info::get_mpi_vendor() != "Open MPI") {                                             \
+            ::testing::internal::CaptureStdout();                                               \
+            ASSERT_DEATH({__VA_ARGS__}, "");                                                    \
+            auto mesg = ::testing::internal::GetCapturedStdout();                               \
+            ASSERT_THAT(mesg, MatchesRegex(errmsg));                                            \
+        } else {                                                                                \
+            std::cerr << "[          ] [ INFO ] Skipping death test (no exception support) \n"; \
+        }                                                                                       \
     }
 
 // whether to print verbose output (i.e. not capturing LAMMPS screen output).
@@ -54,40 +53,43 @@ class LAMMPSTest : public ::testing::Test {
 public:
     void command(const std::string &line) { lmp->input->one(line.c_str()); }
 
-    void BEGIN_HIDE_OUTPUT() {
+    void BEGIN_HIDE_OUTPUT()
+    {
         if (!verbose) ::testing::internal::CaptureStdout();
     }
 
-    void END_HIDE_OUTPUT() {
+    void END_HIDE_OUTPUT()
+    {
         if (!verbose) ::testing::internal::GetCapturedStdout();
     }
 
-    void BEGIN_CAPTURE_OUTPUT() {
-        ::testing::internal::CaptureStdout();
-    }
+    void BEGIN_CAPTURE_OUTPUT() { ::testing::internal::CaptureStdout(); }
 
-    std::string END_CAPTURE_OUTPUT() {
+    std::string END_CAPTURE_OUTPUT()
+    {
         auto output = ::testing::internal::GetCapturedStdout();
         if (verbose) std::cout << output;
         return output;
     }
 
-    void HIDE_OUTPUT(std::function f) {
+    void HIDE_OUTPUT(std::function f)
+    {
         if (!verbose) ::testing::internal::CaptureStdout();
         try {
             f();
-        } catch(LAMMPSException & e) {
+        } catch (LAMMPSException &e) {
             if (!verbose) std::cout << ::testing::internal::GetCapturedStdout();
             throw e;
         }
         if (!verbose) ::testing::internal::GetCapturedStdout();
     }
 
-    std::string CAPTURE_OUTPUT(std::function f) {
+    std::string CAPTURE_OUTPUT(std::function f)
+    {
         ::testing::internal::CaptureStdout();
         try {
             f();
-        } catch(LAMMPSException & e) {
+        } catch (LAMMPSException &e) {
             if (verbose) std::cout << ::testing::internal::GetCapturedStdout();
             throw e;
         }
@@ -96,43 +98,45 @@ public:
         return output;
     }
 
-    double get_variable_value(const std::string & name) {
-        char * str = utils::strdup(fmt::format("v_{}", name));
+    double get_variable_value(const std::string &name)
+    {
+        char *str    = utils::strdup(fmt::format("v_{}", name));
         double value = lmp->input->variable->compute_equal(str);
-        delete [] str;
+        delete[] str;
         return value;
     }
 
-    std::string get_variable_string(const std::string & name) {
+    std::string get_variable_string(const std::string &name)
+    {
         return lmp->input->variable->retrieve(name.c_str());
     }
 
 protected:
-    std::string testbinary = "LAMMPSTest";
+    std::string testbinary        = "LAMMPSTest";
     std::vector args = {"-log", "none", "-echo", "screen", "-nocite"};
     LAMMPS *lmp;
     Info *info;
 
     void SetUp() override
     {
-        int argc = args.size() + 1;
-        char ** argv = new char*[argc];
-        argv[0] = utils::strdup(testbinary);
-        for(int i = 1; i < argc; i++) {
-            argv[i] = utils::strdup(args[i-1]);
+        int argc    = args.size() + 1;
+        char **argv = new char *[argc];
+        argv[0]     = utils::strdup(testbinary);
+        for (int i = 1; i < argc; i++) {
+            argv[i] = utils::strdup(args[i - 1]);
         }
 
         HIDE_OUTPUT([&] {
-            lmp = new LAMMPS(argc, argv, MPI_COMM_WORLD);
+            lmp  = new LAMMPS(argc, argv, MPI_COMM_WORLD);
             info = new Info(lmp);
         });
         InitSystem();
 
-        for(int i = 0; i < argc; i++) {
-            delete [] argv[i];
+        for (int i = 0; i < argc; i++) {
+            delete[] argv[i];
             argv[i] = nullptr;
         }
-        delete [] argv;
+        delete[] argv;
     }
 
     virtual void InitSystem() {}
@@ -143,7 +147,7 @@ protected:
             delete info;
             delete lmp;
             info = nullptr;
-            lmp = nullptr;
+            lmp  = nullptr;
         });
         std::cout.flush();
     }
diff --git a/unittest/testing/mpitesting.h b/unittest/testing/mpitesting.h
index b7c9479696..a69337e1c0 100644
--- a/unittest/testing/mpitesting.h
+++ b/unittest/testing/mpitesting.h
@@ -16,78 +16,87 @@
 #include 
 #include 
 
-using ::testing::TestEventListener;
 using ::testing::TestCase;
+using ::testing::TestEventListener;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
 using ::testing::TestSuite;
 using ::testing::UnitTest;
-using ::testing::TestPartResult;
-using ::testing::TestInfo;
 
 class MPIPrinter : public TestEventListener {
     MPI_Comm comm;
-    TestEventListener * default_listener;
+    TestEventListener *default_listener;
     int me;
     int nprocs;
-    char * buffer;
+    char *buffer;
     size_t buffer_size;
     std::deque results;
     bool finalize_test;
+
 public:
-    MPIPrinter(TestEventListener * default_listener) : default_listener(default_listener) {
+    MPIPrinter(TestEventListener *default_listener) : default_listener(default_listener)
+    {
         comm = MPI_COMM_WORLD;
         MPI_Comm_rank(comm, &me);
         MPI_Comm_size(comm, &nprocs);
-        buffer_size = 1024;
-        buffer = new char[buffer_size];
+        buffer_size   = 1024;
+        buffer        = new char[buffer_size];
         finalize_test = false;
     }
 
-    ~MPIPrinter() override {
+    ~MPIPrinter() override
+    {
         delete default_listener;
         default_listener = nullptr;
 
-        delete [] buffer;
-        buffer = nullptr;
+        delete[] buffer;
+        buffer      = nullptr;
         buffer_size = 0;
     }
 
-    virtual void OnTestProgramStart(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnTestProgramStart(unit_test);
+    virtual void OnTestProgramStart(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnTestProgramStart(unit_test);
     }
 
-    virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration) override {
-        if(me == 0) default_listener->OnTestIterationStart(unit_test, iteration);
+    virtual void OnTestIterationStart(const UnitTest &unit_test, int iteration) override
+    {
+        if (me == 0) default_listener->OnTestIterationStart(unit_test, iteration);
     }
 
-    virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnEnvironmentsSetUpStart(unit_test);
+    virtual void OnEnvironmentsSetUpStart(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnEnvironmentsSetUpStart(unit_test);
     }
 
-    virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnEnvironmentsSetUpEnd(unit_test);
+    virtual void OnEnvironmentsSetUpEnd(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnEnvironmentsSetUpEnd(unit_test);
     }
 
-    virtual void OnTestSuiteStart(const TestSuite& test_suite) override {
-        if(me == 0) default_listener->OnTestSuiteStart(test_suite);
+    virtual void OnTestSuiteStart(const TestSuite &test_suite) override
+    {
+        if (me == 0) default_listener->OnTestSuiteStart(test_suite);
     }
 
     //  Legacy API is deprecated but still available
 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
-    virtual void OnTestCaseStart(const TestCase& test_case) override {
-        if(me == 0) default_listener->OnTestSuiteStart(test_case);
+    virtual void OnTestCaseStart(const TestCase &test_case) override
+    {
+        if (me == 0) default_listener->OnTestSuiteStart(test_case);
     }
-#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
+#endif //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
 
-
-    virtual void OnTestStart(const TestInfo& test_info) override {
+    virtual void OnTestStart(const TestInfo &test_info) override
+    {
         // Called before a test starts.
-        if(me == 0) default_listener->OnTestStart(test_info);
+        if (me == 0) default_listener->OnTestStart(test_info);
         results.clear();
         finalize_test = false;
     }
 
-
-    virtual void OnTestPartResult(const TestPartResult& test_part_result) override {
+    virtual void OnTestPartResult(const TestPartResult &test_part_result) override
+    {
         // Called after a failed assertion or a SUCCESS().
         // test_part_result()
 
@@ -98,52 +107,55 @@ public:
             std::istringstream msg(test_part_result.message());
             std::string line;
 
-            while(std::getline(msg, line)) {
+            while (std::getline(msg, line)) {
                 proc_message << "[Rank " << me << "] " << line << std::endl;
             }
 
-            results.push_back(TestPartResult(test_part_result.type(), test_part_result.file_name(), test_part_result.line_number(), proc_message.str().c_str()));
+            results.push_back(TestPartResult(test_part_result.type(), test_part_result.file_name(),
+                                             test_part_result.line_number(),
+                                             proc_message.str().c_str()));
         }
     }
 
-    virtual void OnTestEnd(const TestInfo& test_info) override {
+    virtual void OnTestEnd(const TestInfo &test_info) override
+    {
         // Called after a test ends.
         MPI_Barrier(comm);
 
         // other procs send their test part results
-        if(me != 0) {
+        if (me != 0) {
             int nresults = results.size();
             MPI_Send(&nresults, 1, MPI_INT, 0, 0, comm);
 
-            for(auto& test_part_result : results) {
+            for (auto &test_part_result : results) {
 
                 int type = test_part_result.type();
                 MPI_Send(&type, 1, MPI_INT, 0, 0, comm);
 
-                const char * str = test_part_result.file_name();
-                int length = 0;
-                if(str) length = strlen(str)+1;
+                const char *str = test_part_result.file_name();
+                int length      = 0;
+                if (str) length = strlen(str) + 1;
                 MPI_Send(&length, 1, MPI_INT, 0, 0, comm);
-                if(str) MPI_Send(str, length, MPI_CHAR, 0, 0, comm);
+                if (str) MPI_Send(str, length, MPI_CHAR, 0, 0, comm);
 
                 int lineno = test_part_result.line_number();
                 MPI_Send(&lineno, 1, MPI_INT, 0, 0, comm);
 
-                str = test_part_result.message();
+                str    = test_part_result.message();
                 length = 0;
-                if(str) length = strlen(str)+1;
+                if (str) length = strlen(str) + 1;
                 MPI_Send(&length, 1, MPI_INT, 0, 0, comm);
-                if(str) MPI_Send(str, length, MPI_CHAR, 0, 0, comm);
+                if (str) MPI_Send(str, length, MPI_CHAR, 0, 0, comm);
             }
         }
 
-        if(me == 0) {
+        if (me == 0) {
             // collect results from other procs
-            for(int p = 1; p < nprocs; p++) {
+            for (int p = 1; p < nprocs; p++) {
                 int nresults = 0;
                 MPI_Recv(&nresults, 1, MPI_INT, p, 0, comm, MPI_STATUS_IGNORE);
 
-                for(int r = 0; r < nresults; r++) {
+                for (int r = 0; r < nresults; r++) {
 
                     int type;
                     MPI_Recv(&type, 1, MPI_INT, p, 0, comm, MPI_STATUS_IGNORE);
@@ -154,8 +166,8 @@ public:
 
                     if (length > 0) {
                         if (length > buffer_size) {
-                            delete [] buffer;
-                            buffer = new char[length];
+                            delete[] buffer;
+                            buffer      = new char[length];
                             buffer_size = length;
                         }
                         MPI_Recv(buffer, length, MPI_CHAR, p, 0, comm, MPI_STATUS_IGNORE);
@@ -170,15 +182,16 @@ public:
 
                     if (length > 0) {
                         if (length > buffer_size) {
-                            delete [] buffer;
-                            buffer = new char[length];
+                            delete[] buffer;
+                            buffer      = new char[length];
                             buffer_size = length;
                         }
                         MPI_Recv(buffer, length, MPI_CHAR, p, 0, comm, MPI_STATUS_IGNORE);
                         message = std::string(buffer);
                     }
 
-                    results.push_back(TestPartResult((TestPartResult::Type)type, file_name.c_str(), lineno, message.c_str()));
+                    results.push_back(TestPartResult((TestPartResult::Type)type, file_name.c_str(),
+                                                     lineno, message.c_str()));
                 }
             }
 
@@ -186,9 +199,9 @@ public:
             finalize_test = true;
 
             // add all failures
-            while(!results.empty()) {
+            while (!results.empty()) {
                 auto result = results.front();
-                if(result.failed()) {
+                if (result.failed()) {
                     ADD_FAILURE_AT(result.file_name(), result.line_number()) << result.message();
                 } else {
                     default_listener->OnTestPartResult(result);
@@ -200,29 +213,35 @@ public:
         }
     }
 
-    virtual void OnTestSuiteEnd(const TestSuite& test_suite) override {
-        if(me == 0) default_listener->OnTestSuiteEnd(test_suite);
+    virtual void OnTestSuiteEnd(const TestSuite &test_suite) override
+    {
+        if (me == 0) default_listener->OnTestSuiteEnd(test_suite);
     }
 
 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
-    virtual void OnTestCaseEnd(const TestCase& test_case) override {
-        if(me == 0) default_listener->OnTestCaseEnd(test_case);
+    virtual void OnTestCaseEnd(const TestCase &test_case) override
+    {
+        if (me == 0) default_listener->OnTestCaseEnd(test_case);
     }
-#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
+#endif //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_
 
-    virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnEnvironmentsTearDownStart(unit_test);
+    virtual void OnEnvironmentsTearDownStart(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnEnvironmentsTearDownStart(unit_test);
     }
 
-    virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnEnvironmentsTearDownEnd(unit_test);
+    virtual void OnEnvironmentsTearDownEnd(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnEnvironmentsTearDownEnd(unit_test);
     }
 
-    virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override {
-        if(me == 0) default_listener->OnTestIterationEnd(unit_test, iteration);
+    virtual void OnTestIterationEnd(const UnitTest &unit_test, int iteration) override
+    {
+        if (me == 0) default_listener->OnTestIterationEnd(unit_test, iteration);
     }
 
-    virtual void OnTestProgramEnd(const UnitTest& unit_test) override {
-        if(me == 0) default_listener->OnTestProgramEnd(unit_test);
+    virtual void OnTestProgramEnd(const UnitTest &unit_test) override
+    {
+        if (me == 0) default_listener->OnTestProgramEnd(unit_test);
     }
 };
diff --git a/unittest/testing/test_mpi_main.h b/unittest/testing/test_mpi_main.h
index 9e8ac4504a..ad78e3ace0 100644
--- a/unittest/testing/test_mpi_main.h
+++ b/unittest/testing/test_mpi_main.h
@@ -11,10 +11,10 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
+#include "mpitesting.h"
 #include "utils.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "mpitesting.h"
 
 #include 
 #include 
@@ -53,7 +53,7 @@ int main(int argc, char **argv)
         }
     }
 
-    auto & listeners = UnitTest::GetInstance()->listeners();
+    auto &listeners = UnitTest::GetInstance()->listeners();
 
     // Remove default listener
     auto default_listener = listeners.Release(listeners.default_result_printer());
diff --git a/unittest/testing/utils.h b/unittest/testing/utils.h
index d4748e4ae8..46dc9b5694 100644
--- a/unittest/testing/utils.h
+++ b/unittest/testing/utils.h
@@ -71,6 +71,4 @@ static bool file_exists(const std::string &filename)
 #define ASSERT_FILE_NOT_EXISTS(NAME) ASSERT_FALSE(file_exists(NAME))
 #define ASSERT_FILE_EQUAL(FILE_A, FILE_B) ASSERT_TRUE(equal_lines(FILE_A, FILE_B))
 
-
-
 #endif
diff --git a/unittest/utils/test_tokenizer.cpp b/unittest/utils/test_tokenizer.cpp
index 698283ea53..e895d96576 100644
--- a/unittest/utils/test_tokenizer.cpp
+++ b/unittest/utils/test_tokenizer.cpp
@@ -110,7 +110,7 @@ TEST(Tokenizer, copy_assignment)
     ASSERT_THAT(t.next(), Eq("word"));
     ASSERT_EQ(t.count(), 2);
     Tokenizer v = u;
-    u = t;
+    u           = t;
     ASSERT_THAT(u.next(), Eq("test"));
     ASSERT_THAT(u.next(), Eq("word"));
     ASSERT_EQ(u.count(), 2);
@@ -265,7 +265,7 @@ TEST(ValueTokenizer, copy_assignment)
     ASSERT_THAT(t.next_string(), Eq("word"));
     ASSERT_EQ(t.count(), 2);
     ValueTokenizer v = u;
-    u = t;
+    u                = t;
     ASSERT_THAT(u.next_string(), Eq("test"));
     ASSERT_THAT(u.next_string(), Eq("word"));
     ASSERT_EQ(u.count(), 2);
diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp
index 44cd865a21..8c2845e817 100644
--- a/unittest/utils/test_utils.cpp
+++ b/unittest/utils/test_utils.cpp
@@ -478,17 +478,17 @@ TEST(Utils, strmatch_opt_char)
 {
     ASSERT_TRUE(utils::strmatch("rigid", "^r?igid"));
     ASSERT_TRUE(utils::strmatch("igid", "^r?igid"));
-    ASSERT_TRUE(utils::strmatch("c_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("f_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("v_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("i_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("d_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("i2_name","^[cfvid]2?_name"));
-    ASSERT_TRUE(utils::strmatch("d2_name","^[cfvid]2?_name"));
-    ASSERT_FALSE(utils::strmatch("d2name","^[cfvid]2?_name"));
-    ASSERT_FALSE(utils::strmatch("i1_name","^[cfvid]2?_name"));
-    ASSERT_FALSE(utils::strmatch("V_name","^[cfvid]2?_name"));
-    ASSERT_FALSE(utils::strmatch("x_name","^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("c_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("f_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("v_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("i_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("d_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("i2_name", "^[cfvid]2?_name"));
+    ASSERT_TRUE(utils::strmatch("d2_name", "^[cfvid]2?_name"));
+    ASSERT_FALSE(utils::strmatch("d2name", "^[cfvid]2?_name"));
+    ASSERT_FALSE(utils::strmatch("i1_name", "^[cfvid]2?_name"));
+    ASSERT_FALSE(utils::strmatch("V_name", "^[cfvid]2?_name"));
+    ASSERT_FALSE(utils::strmatch("x_name", "^[cfvid]2?_name"));
 }
 
 TEST(Utils, strmatch_dot)

From 2cfc629388419436f334badbad9496bd34281d5d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 18:21:47 -0400
Subject: [PATCH 065/437] reformat REAXFF headers with clang-format

---
 src/REAXFF/compute_spec_atom.h  |   2 +-
 src/REAXFF/fix_qeq_reaxff.h     |  40 +--
 src/REAXFF/fix_reaxff.h         |  14 +-
 src/REAXFF/fix_reaxff_bonds.h   |   2 +-
 src/REAXFF/fix_reaxff_species.h |   2 +-
 src/REAXFF/pair_reaxff.h        |  14 +-
 src/REAXFF/reaxff_api.h         | 403 ++++++++++-----------
 src/REAXFF/reaxff_defs.h        |  53 ++-
 src/REAXFF/reaxff_inline.h      | 114 +++---
 src/REAXFF/reaxff_types.h       | 595 ++++++++++++++++----------------
 10 files changed, 617 insertions(+), 622 deletions(-)

diff --git a/src/REAXFF/compute_spec_atom.h b/src/REAXFF/compute_spec_atom.h
index 61dd63e272..3974f38354 100644
--- a/src/REAXFF/compute_spec_atom.h
+++ b/src/REAXFF/compute_spec_atom.h
@@ -78,7 +78,7 @@ class ComputeSpecAtom : public Compute {
   class PairReaxFF *reaxff;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/fix_qeq_reaxff.h b/src/REAXFF/fix_qeq_reaxff.h
index b787bb9c7a..ab037aea6b 100644
--- a/src/REAXFF/fix_qeq_reaxff.h
+++ b/src/REAXFF/fix_qeq_reaxff.h
@@ -43,7 +43,7 @@ class FixQEqReaxFF : public Fix {
   int setmask();
   virtual void post_constructor();
   virtual void init();
-  void init_list(int,class NeighList *);
+  void init_list(int, class NeighList *);
   virtual void init_storage();
   void setup_pre_force(int);
   virtual void pre_force(int);
@@ -57,7 +57,7 @@ class FixQEqReaxFF : public Fix {
   virtual double compute_scalar();
 
  protected:
-  int nevery,reaxflag;
+  int nevery, reaxflag;
   int matvecs;
   int nn, NN, m_fill;
   int n_cap, nmax, m_cap;
@@ -67,11 +67,11 @@ class FixQEqReaxFF : public Fix {
   class PairReaxFF *reaxff;
   int *ilist, *jlist, *numneigh, **firstneigh;
 
-  double swa, swb;      // lower/upper Taper cutoff radius
-  double Tap[8];        // Taper function
-  double tolerance;     // tolerance for the norm of the rel residual in CG
+  double swa, swb;     // lower/upper Taper cutoff radius
+  double Tap[8];       // Taper function
+  double tolerance;    // tolerance for the norm of the rel residual in CG
 
-  double *chi,*eta,*gamma;  // qeq parameters
+  double *chi, *eta, *gamma;    // qeq parameters
   double **shld;
 
   // fictitious charges
@@ -80,7 +80,7 @@ class FixQEqReaxFF : public Fix {
   double **s_hist, **t_hist;
   int nprev;
 
-  typedef struct{
+  typedef struct {
     int n, m;
     int *firstnbr;
     int *numnbrs;
@@ -97,8 +97,8 @@ class FixQEqReaxFF : public Fix {
   double *p, *q, *r, *d;
   int imax, maxwarn;
 
-  char *pertype_option;  // argument to determine how per-type info is obtained
-  virtual void pertype_parameters(char*);
+  char *pertype_option;    // argument to determine how per-type info is obtained
+  virtual void pertype_parameters(char *);
   void init_shielding();
   void init_taper();
   virtual void allocate_storage();
@@ -111,11 +111,11 @@ class FixQEqReaxFF : public Fix {
   virtual void init_matvec();
   void init_H();
   virtual void compute_H();
-  double calculate_H(double,double);
+  double calculate_H(double, double);
   virtual void calculate_Q();
 
-  virtual int CG(double*,double*);
-  virtual void sparse_matvec(sparse_matrix*,double*,double*);
+  virtual int CG(double *, double *);
+  virtual void sparse_matvec(sparse_matrix *, double *, double *);
 
   virtual int pack_forward_comm(int, int *, double *, int, int *);
   virtual void unpack_forward_comm(int, int, double *);
@@ -127,19 +127,19 @@ class FixQEqReaxFF : public Fix {
   virtual int pack_exchange(int, double *);
   virtual int unpack_exchange(int, double *);
 
-  virtual double parallel_norm(double*, int);
-  virtual double parallel_dot(double*, double*, int);
-  virtual double parallel_vector_acc(double*, int);
+  virtual double parallel_norm(double *, int);
+  virtual double parallel_dot(double *, double *, int);
+  virtual double parallel_vector_acc(double *, int);
 
-  virtual void vector_sum(double*,double,double*,double,double*,int);
-  virtual void vector_add(double*, double, double*,int);
+  virtual void vector_sum(double *, double, double *, double, double *, int);
+  virtual void vector_add(double *, double, double *, int);
 
   // dual CG support
-  int dual_enabled;  // 0: Original, separate s & t optimization; 1: dual optimization
-  int matvecs_s, matvecs_t; // Iteration count for each system
+  int dual_enabled;            // 0: Original, separate s & t optimization; 1: dual optimization
+  int matvecs_s, matvecs_t;    // Iteration count for each system
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/fix_reaxff.h b/src/REAXFF/fix_reaxff.h
index 0b18f6d118..165be197be 100644
--- a/src/REAXFF/fix_reaxff.h
+++ b/src/REAXFF/fix_reaxff.h
@@ -40,7 +40,7 @@ class FixReaxFF : public Fix {
   friend class PairReaxFFOMP;
 
  public:
-  FixReaxFF(class LAMMPS *,int, char **);
+  FixReaxFF(class LAMMPS *, int, char **);
   ~FixReaxFF();
   int setmask();
 
@@ -53,14 +53,14 @@ class FixReaxFF : public Fix {
   void unpack_forward_comm(int, int, double *);
 
  private:
-  int maxbonds;              // max # of bonds for any atom
-  int maxhbonds;             // max # of Hbonds for any atom
-  int *num_bonds;            // # of bonds for each atom
-  int *num_hbonds;           // # of Hbonds for each atom
-  int oldnmax;               // arrays' size before growing
+  int maxbonds;       // max # of bonds for any atom
+  int maxhbonds;      // max # of Hbonds for any atom
+  int *num_bonds;     // # of bonds for each atom
+  int *num_hbonds;    // # of Hbonds for each atom
+  int oldnmax;        // arrays' size before growing
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/fix_reaxff_bonds.h b/src/REAXFF/fix_reaxff_bonds.h
index ceb763b205..4c2fd535ea 100644
--- a/src/REAXFF/fix_reaxff_bonds.h
+++ b/src/REAXFF/fix_reaxff_bonds.h
@@ -56,7 +56,7 @@ class FixReaxFFBonds : public Fix {
   class PairReaxFF *reaxff;
   class NeighList *list;
 };
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h
index b65ea49476..bcfcf2b6dd 100644
--- a/src/REAXFF/fix_reaxff_species.h
+++ b/src/REAXFF/fix_reaxff_species.h
@@ -81,7 +81,7 @@ class FixReaxFFSpecies : public Fix {
   class FixAveAtom *f_SPECBOND;
   class PairReaxFF *reaxff;
 };
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/pair_reaxff.h b/src/REAXFF/pair_reaxff.h
index f9f3b636c3..846d4e8408 100644
--- a/src/REAXFF/pair_reaxff.h
+++ b/src/REAXFF/pair_reaxff.h
@@ -35,9 +35,9 @@ PairStyle(reax/c,PairReaxFF);
 #include "pair.h"
 
 namespace ReaxFF {
-  struct API;
-  struct far_neighbor_data;
-}
+struct API;
+struct far_neighbor_data;
+}    // namespace ReaxFF
 
 namespace LAMMPS_NS {
 
@@ -53,17 +53,17 @@ class PairReaxFF : public Pair {
   void *extract(const char *, int &);
   int fixbond_flag, fixspecies_flag;
   int **tmpid;
-  double **tmpbo,**tmpr;
+  double **tmpbo, **tmpr;
 
   ReaxFF::API *api;
   typedef double rvec[3];
 
-protected:
+ protected:
   char *fix_id;
   double cutmax;
   class FixReaxFF *fix_reaxff;
 
-  double *chi,*eta,*gamma;
+  double *chi, *eta, *gamma;
   int qeqflag;
   int setup_flag;
   int firstwarn;
@@ -84,7 +84,7 @@ protected:
   double memory_usage();
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h
index 540012ab8f..68eb7d25a2 100644
--- a/src/REAXFF/reaxff_api.h
+++ b/src/REAXFF/reaxff_api.h
@@ -25,202 +25,215 @@
 
 #include 
 
-namespace ReaxFF
+namespace ReaxFF {
+// per instance data
+struct API {
+  control_params *control;
+  reax_system *system;
+  simulation_data *data;
+  storage *workspace;
+  reax_list *lists;
+};
+
+// exported Functions
+
+// allocate
+
+extern void Allocate_Workspace(control_params *, storage *, int);
+extern void DeAllocate_System(reax_system *);
+extern void DeAllocate_Workspace(control_params *, storage *);
+extern void PreAllocate_Space(reax_system *, storage *);
+extern void ReAllocate(reax_system *, control_params *, simulation_data *, storage *, reax_list **);
+
+// bond orders
+
+extern void BO(reax_system *, storage *, reax_list **);
+extern int BOp(storage *, reax_list *, double, int, int, far_neighbor_data *,
+               single_body_parameters *, single_body_parameters *, two_body_parameters *);
+extern void Add_dBond_to_Forces(reax_system *, int, int, storage *, reax_list **);
+
+// bonds
+
+extern void Bonds(reax_system *, simulation_data *, storage *, reax_list **);
+
+// control
+
+extern void Read_Control_File(const char *, control_params *);
+
+// ffield
+
+extern void Read_Force_Field(const char *, reax_interaction *, control_params *, MPI_Comm);
+
+// forces
+
+extern void Compute_Forces(reax_system *, control_params *, simulation_data *, storage *,
+                           reax_list **);
+extern void Estimate_Storages(reax_system *, control_params *, reax_list **, int *, int *, int *,
+                              int *);
+
+// hydrogen bonds
+
+extern void Hydrogen_Bonds(reax_system *, simulation_data *, storage *, reax_list **);
+
+// init md
+
+extern void Init_System(reax_system *, control_params *);
+extern void Init_Simulation_Data(simulation_data *);
+extern void Init_Workspace(reax_system *, control_params *, storage *);
+extern void Initialize(reax_system *, control_params *, simulation_data *, storage *, reax_list **,
+                       MPI_Comm);
+
+// lists
+
+extern void Make_List(int, int, int, reax_list *);
+extern void Delete_List(reax_list *);
+
+inline int Start_Index(int i, reax_list *l)
 {
-  // per instance data
-  struct API {
-    control_params *control;
-    reax_system *system;
-    simulation_data *data;
-    storage *workspace;
-    reax_list *lists;
-  };
-
-  // exported Functions
-
-  // allocate
-
-  extern void Allocate_Workspace(control_params *, storage *, int);
-  extern void DeAllocate_System(reax_system *);
-  extern void DeAllocate_Workspace(control_params *, storage *);
-  extern void PreAllocate_Space(reax_system *, storage *);
-  extern void ReAllocate(reax_system *, control_params *, simulation_data *,
-                         storage *, reax_list **);
-
-  // bond orders
-
-  extern void BO(reax_system *, storage *, reax_list **);
-  extern int BOp(storage *, reax_list *, double, int, int, far_neighbor_data *,
-                 single_body_parameters *, single_body_parameters *,
-                 two_body_parameters *);
-  extern void Add_dBond_to_Forces(reax_system*, int, int, storage*, reax_list**);
-
-  // bonds
-
-  extern void Bonds(reax_system *, simulation_data *, storage *, reax_list **);
-
-  // control
-
-  extern void Read_Control_File(const char *, control_params *);
-
-  // ffield
-
-  extern void Read_Force_Field(const char *, reax_interaction *,
-                               control_params *, MPI_Comm);
-
-  // forces
-
-  extern void Compute_Forces(reax_system *, control_params *,
-                             simulation_data *, storage *, reax_list **);
-  extern void Estimate_Storages(reax_system *, control_params *, reax_list **,
-                                int *, int *, int *, int *);
-
-  // hydrogen bonds
-
-  extern void Hydrogen_Bonds(reax_system *, simulation_data *, storage *, reax_list **);
-
-  // init md
-
-  extern void Init_System(reax_system *, control_params *);
-  extern void Init_Simulation_Data(simulation_data *);
-  extern void Init_Workspace(reax_system *, control_params *, storage *);
-  extern void Initialize(reax_system *, control_params *, simulation_data *,
-                         storage *, reax_list **, MPI_Comm);
-
-  // lists
-
-  extern void Make_List(int, int, int, reax_list *);
-  extern void Delete_List(reax_list*);
-
-  inline int Start_Index(int i, reax_list *l) { return l->index[i]; }
-  inline int End_Index(int i, reax_list *l) { return l->end_index[i]; }
-  inline void Set_Start_Index(int i, int val, reax_list *l) {
-    l->index[i] = val;
-  }
-  inline void Set_End_Index(int i, int val, reax_list *l) {
-    l->end_index[i] = val;
-  }
-  inline int Num_Entries(int i, reax_list *l) {
-    return l->end_index[i] - l->index[i];
-  }
-
-  // lookup
-
-  extern void Init_Lookup_Tables(reax_system *, control_params *,
-                                 storage *, MPI_Comm);
-  extern void Deallocate_Lookup_Tables(reax_system *);
-  extern void Natural_Cubic_Spline(LAMMPS_NS::Error*, const double *,
-                                   const double *, cubic_spline_coef *,
-                                   unsigned int);
-  extern void Complete_Cubic_Spline(LAMMPS_NS::Error*, const double *,
-                                    const double *, double v0, double vlast,
-                                    cubic_spline_coef *coef, unsigned int n);
-
-  // multi body
-
-  extern void Atom_Energy(reax_system *, control_params *, simulation_data *,
-                          storage *, reax_list **);
-
-  // nonbonded
-
-  extern void Compute_Polarization_Energy(reax_system *, simulation_data *);
-  extern void vdW_Coulomb_Energy(reax_system *, control_params *,
-                                 simulation_data *, storage *, reax_list **);
-  extern void Tabulated_vdW_Coulomb_Energy(reax_system *, control_params *,
-                                           simulation_data *, storage *,
-                                           reax_list **);
-  extern void LR_vdW_Coulomb(reax_system *, storage *, control_params *,
-                             int, int, double, LR_data *);
-
-  // reset tools
-
-  extern void Reset(reax_system *, control_params *, simulation_data *,
-                    storage *, reax_list **);
-  extern void Reset_Simulation_Data(simulation_data *);
-  extern void Reset_Workspace(reax_system *, storage *);
-
-  // toolbox
-
-  extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const std::string &);
-  extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const std::string &);
-  extern void sfree(LAMMPS_NS::Error *, void *, const std::string &);
-
-  // torsion angles
-
-  extern double Calculate_Omega(rvec, double, rvec, double, rvec, double,
-                                rvec, double, three_body_interaction_data *,
-                                three_body_interaction_data *, rvec, rvec,
-                                rvec, rvec);
-  extern void Torsion_Angles(reax_system *, control_params *,
-                             simulation_data *, storage *, reax_list **);
-
-  // valence angles
-
-  extern void Calculate_Theta(rvec, double, rvec, double, double *, double *);
-  extern void Calculate_dCos_Theta(rvec, double, rvec, double,
-                                   rvec *, rvec *, rvec *);
-  extern void Valence_Angles(reax_system *, control_params *,
-                             simulation_data *, storage *, reax_list **);
-
-  // vector
-
-  inline void rvec_Add(rvec ret, rvec v) {
-    ret[0] += v[0]; ret[1] += v[1]; ret[2] += v[2];
-  }
-
-  inline void rvec_Copy(rvec dest, rvec src) {
-    dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2];
-  }
-
-  inline void rvec_Cross(rvec ret, rvec v1, rvec v2)
-  {
-    ret[0] = v1[1] * v2[2] - v1[2] * v2[1];
-    ret[1] = v1[2] * v2[0] - v1[0] * v2[2];
-    ret[2] = v1[0] * v2[1] - v1[1] * v2[0];
-  }
-
-  inline double rvec_Dot(rvec v1, rvec v2) {
-    return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
-  }
-
-  inline double rvec_Norm(rvec v) {
-    return sqrt(SQR(v[0]) + SQR(v[1]) + SQR(v[2]));
-  }
-
-  inline void rvec_Scale(rvec ret, double c, rvec v) {
-    ret[0] = c * v[0]; ret[1] = c * v[1]; ret[2] = c * v[2];
-  }
-
-  inline void rvec_ScaledAdd(rvec ret, double c, rvec v) {
-    ret[0] += c * v[0], ret[1] += c * v[1], ret[2] += c * v[2];
-  }
-
-  inline void rvec_ScaledSum(rvec ret, double c1, rvec v1 ,double c2, rvec v2)
-  {
-    ret[0] = c1 * v1[0] + c2 * v2[0];
-    ret[1] = c1 * v1[1] + c2 * v2[1];
-    ret[2] = c1 * v1[2] + c2 * v2[2];
-  }
-
-  inline void ivec_MakeZero(ivec v) { v[0] = v[1] = v[2] = 0; }
-
-  inline void ivec_Copy(ivec dest, ivec src) {
-    dest[0] = src[0], dest[1] = src[1], dest[2] = src[2];
-  }
-
-  inline void ivec_Scale(ivec dest, double C, ivec src)
-  {
-  dest[0] = (int)(C * src[0]);
-  dest[1] = (int)(C * src[1]);
-  dest[2] = (int)(C * src[2]);
-  }
-
-  inline void ivec_Sum(ivec dest, ivec v1, ivec v2)
-  {
-    dest[0] = v1[0] + v2[0];
-    dest[1] = v1[1] + v2[1];
-    dest[2] = v1[2] + v2[2];
-  }
+  return l->index[i];
+}
+inline int End_Index(int i, reax_list *l)
+{
+  return l->end_index[i];
+}
+inline void Set_Start_Index(int i, int val, reax_list *l)
+{
+  l->index[i] = val;
+}
+inline void Set_End_Index(int i, int val, reax_list *l)
+{
+  l->end_index[i] = val;
+}
+inline int Num_Entries(int i, reax_list *l)
+{
+  return l->end_index[i] - l->index[i];
 }
 
+// lookup
+
+extern void Init_Lookup_Tables(reax_system *, control_params *, storage *, MPI_Comm);
+extern void Deallocate_Lookup_Tables(reax_system *);
+extern void Natural_Cubic_Spline(LAMMPS_NS::Error *, const double *, const double *,
+                                 cubic_spline_coef *, unsigned int);
+extern void Complete_Cubic_Spline(LAMMPS_NS::Error *, const double *, const double *, double v0,
+                                  double vlast, cubic_spline_coef *coef, unsigned int n);
+
+// multi body
+
+extern void Atom_Energy(reax_system *, control_params *, simulation_data *, storage *,
+                        reax_list **);
+
+// nonbonded
+
+extern void Compute_Polarization_Energy(reax_system *, simulation_data *);
+extern void vdW_Coulomb_Energy(reax_system *, control_params *, simulation_data *, storage *,
+                               reax_list **);
+extern void Tabulated_vdW_Coulomb_Energy(reax_system *, control_params *, simulation_data *,
+                                         storage *, reax_list **);
+extern void LR_vdW_Coulomb(reax_system *, storage *, control_params *, int, int, double, LR_data *);
+
+// reset tools
+
+extern void Reset(reax_system *, control_params *, simulation_data *, storage *, reax_list **);
+extern void Reset_Simulation_Data(simulation_data *);
+extern void Reset_Workspace(reax_system *, storage *);
+
+// toolbox
+
+extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const std::string &);
+extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const std::string &);
+extern void sfree(LAMMPS_NS::Error *, void *, const std::string &);
+
+// torsion angles
+
+extern double Calculate_Omega(rvec, double, rvec, double, rvec, double, rvec, double,
+                              three_body_interaction_data *, three_body_interaction_data *, rvec,
+                              rvec, rvec, rvec);
+extern void Torsion_Angles(reax_system *, control_params *, simulation_data *, storage *,
+                           reax_list **);
+
+// valence angles
+
+extern void Calculate_Theta(rvec, double, rvec, double, double *, double *);
+extern void Calculate_dCos_Theta(rvec, double, rvec, double, rvec *, rvec *, rvec *);
+extern void Valence_Angles(reax_system *, control_params *, simulation_data *, storage *,
+                           reax_list **);
+
+// vector
+
+inline void rvec_Add(rvec ret, rvec v)
+{
+  ret[0] += v[0];
+  ret[1] += v[1];
+  ret[2] += v[2];
+}
+
+inline void rvec_Copy(rvec dest, rvec src)
+{
+  dest[0] = src[0];
+  dest[1] = src[1];
+  dest[2] = src[2];
+}
+
+inline void rvec_Cross(rvec ret, rvec v1, rvec v2)
+{
+  ret[0] = v1[1] * v2[2] - v1[2] * v2[1];
+  ret[1] = v1[2] * v2[0] - v1[0] * v2[2];
+  ret[2] = v1[0] * v2[1] - v1[1] * v2[0];
+}
+
+inline double rvec_Dot(rvec v1, rvec v2)
+{
+  return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
+}
+
+inline double rvec_Norm(rvec v)
+{
+  return sqrt(SQR(v[0]) + SQR(v[1]) + SQR(v[2]));
+}
+
+inline void rvec_Scale(rvec ret, double c, rvec v)
+{
+  ret[0] = c * v[0];
+  ret[1] = c * v[1];
+  ret[2] = c * v[2];
+}
+
+inline void rvec_ScaledAdd(rvec ret, double c, rvec v)
+{
+  ret[0] += c * v[0], ret[1] += c * v[1], ret[2] += c * v[2];
+}
+
+inline void rvec_ScaledSum(rvec ret, double c1, rvec v1, double c2, rvec v2)
+{
+  ret[0] = c1 * v1[0] + c2 * v2[0];
+  ret[1] = c1 * v1[1] + c2 * v2[1];
+  ret[2] = c1 * v1[2] + c2 * v2[2];
+}
+
+inline void ivec_MakeZero(ivec v)
+{
+  v[0] = v[1] = v[2] = 0;
+}
+
+inline void ivec_Copy(ivec dest, ivec src)
+{
+  dest[0] = src[0], dest[1] = src[1], dest[2] = src[2];
+}
+
+inline void ivec_Scale(ivec dest, double C, ivec src)
+{
+  dest[0] = (int) (C * src[0]);
+  dest[1] = (int) (C * src[1]);
+  dest[2] = (int) (C * src[2]);
+}
+
+inline void ivec_Sum(ivec dest, ivec v1, ivec v2)
+{
+  dest[0] = v1[0] + v2[0];
+  dest[1] = v1[1] + v2[1];
+  dest[2] = v1[2] + v2[2];
+}
+}    // namespace ReaxFF
+
 #endif
diff --git a/src/REAXFF/reaxff_defs.h b/src/REAXFF/reaxff_defs.h
index c6df5de0ea..45fa182728 100644
--- a/src/REAXFF/reaxff_defs.h
+++ b/src/REAXFF/reaxff_defs.h
@@ -25,42 +25,41 @@
 #define inline __inline__
 #endif /*IBMC*/
 
-#define SQR(x)        ((x)*(x))
-#define CUBE(x)       ((x)*(x)*(x))
-#define DEG2RAD(a)    ((a)*constPI/180.0)
-#define RAD2DEG(a)    ((a)*180.0/constPI)
-#define MAX3(x,y,z)   MAX(MAX(x,y), z)
+#define SQR(x) ((x) * (x))
+#define CUBE(x) ((x) * (x) * (x))
+#define DEG2RAD(a) ((a) *constPI / 180.0)
+#define RAD2DEG(a) ((a) *180.0 / constPI)
+#define MAX3(x, y, z) MAX(MAX(x, y), z)
 
-#define constPI        3.14159265
-#define C_ele          332.06371
-#define EV_to_KCALpMOL 14.400000   // ElectronVolt --> KCAL per MOLe
-#define KCALpMOL_to_EV 23.02       // 23.060549 //KCAL per MOLe --> ElectronVolt
+#define constPI 3.14159265
+#define C_ele 332.06371
+#define EV_to_KCALpMOL 14.400000    // ElectronVolt --> KCAL per MOLe
+#define KCALpMOL_to_EV 23.02        // 23.060549 //KCAL per MOLe --> ElectronVolt
 
-#define HB_THRESHOLD   1e-2  // 0.01
+#define HB_THRESHOLD 1e-2    // 0.01
 
-#define REAX_MIN_CAP    50
-#define REAX_MIN_NBRS   100
-#define MIN_HENTRIES    100
-#define MAX_BONDS       30
-#define MIN_BONDS       25
+#define REAX_MIN_CAP 50
+#define REAX_MIN_NBRS 100
+#define MIN_HENTRIES 100
+#define MAX_BONDS 30
+#define MIN_BONDS 25
 #define REAX_MIN_HBONDS 25
-#define MIN_3BODIES     1000
-#define REAX_SAFE_ZONE  1.2
+#define MIN_3BODIES 1000
+#define REAX_SAFE_ZONE 1.2
 #define REAX_SAFER_ZONE 1.4
-#define DANGER_ZONE     0.90
-#define LOOSE_ZONE      0.75
+#define DANGER_ZONE 0.90
+#define LOOSE_ZONE 0.75
 
 #define MAXREAXBOND 24 /* used in fix_reaxff_bonds.cpp and pair_reaxff.cpp */
 #define MAXSPECBOND 24 /* used in fix_reaxff_species.cpp and pair_reaxff.cpp */
 
-#define REAX_MAX_3BODY_PARAM    5
-#define REAX_MAX_4BODY_PARAM    5
+#define REAX_MAX_3BODY_PARAM 5
+#define REAX_MAX_4BODY_PARAM 5
 
-namespace ReaxFF
-{
-  /******************* ENUMERATORS *************************/
-  enum {BONDS, THREE_BODIES, HBONDS, FAR_NBRS, LIST_N};
-  enum {TYP_BOND, TYP_THREE_BODY, TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_N};
-}
+namespace ReaxFF {
+/******************* ENUMERATORS *************************/
+enum { BONDS, THREE_BODIES, HBONDS, FAR_NBRS, LIST_N };
+enum { TYP_BOND, TYP_THREE_BODY, TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_N };
+}    // namespace ReaxFF
 
 #endif
diff --git a/src/REAXFF/reaxff_inline.h b/src/REAXFF/reaxff_inline.h
index a53ab4bb05..b07f02631d 100644
--- a/src/REAXFF/reaxff_inline.h
+++ b/src/REAXFF/reaxff_inline.h
@@ -21,68 +21,70 @@
 #ifndef LMP_REAXFF_INLINE_H
 #define LMP_REAXFF_INLINE_H
 
-#include "accelerator_kokkos.h" // for LAMMPS_INLINE
+#include "accelerator_kokkos.h"    // for LAMMPS_INLINE
 
-namespace ReaxFF
-{
-  struct LR_data
+namespace ReaxFF {
+struct LR_data {
+  double H;
+  double e_vdW, CEvd;
+  double e_ele, CEclmb;
+
+  LAMMPS_INLINE
+  LR_data() {}
+
+  LAMMPS_INLINE
+  void operator=(const LR_data &rhs)
   {
-    double H;
-    double e_vdW, CEvd;
-    double e_ele, CEclmb;
-
-    LAMMPS_INLINE
-    LR_data() {}
-
-    LAMMPS_INLINE
-    void operator = (const LR_data& rhs) {
-      H      = rhs.H;
-      e_vdW  = rhs.e_vdW;
-      CEvd   = rhs.CEvd;
-      e_ele  = rhs.e_ele;
-      CEclmb = rhs.CEclmb;
-    }
-    LAMMPS_INLINE
-    void operator = (const LR_data& rhs) volatile {
-      H      = rhs.H;
-      e_vdW  = rhs.e_vdW;
-      CEvd   = rhs.CEvd;
-      e_ele  = rhs.e_ele;
-      CEclmb = rhs.CEclmb;
-    }
-  };
-
-  struct cubic_spline_coef
+    H = rhs.H;
+    e_vdW = rhs.e_vdW;
+    CEvd = rhs.CEvd;
+    e_ele = rhs.e_ele;
+    CEclmb = rhs.CEclmb;
+  }
+  LAMMPS_INLINE
+  void operator=(const LR_data &rhs) volatile
   {
-    double a, b, c, d;
+    H = rhs.H;
+    e_vdW = rhs.e_vdW;
+    CEvd = rhs.CEvd;
+    e_ele = rhs.e_ele;
+    CEclmb = rhs.CEclmb;
+  }
+};
 
-    LAMMPS_INLINE
-    cubic_spline_coef() {}
+struct cubic_spline_coef {
+  double a, b, c, d;
 
-    LAMMPS_INLINE
-    cubic_spline_coef(const cubic_spline_coef &_c) {
-      a = _c.a;
-      b = _c.b;
-      c = _c.c;
-      d = _c.d;
-    }
+  LAMMPS_INLINE
+  cubic_spline_coef() {}
 
-    LAMMPS_INLINE
-    void operator=(const cubic_spline_coef &rhs) {
-      a = rhs.a;
-      b = rhs.b;
-      c = rhs.c;
-      d = rhs.d;
-    }
+  LAMMPS_INLINE
+  cubic_spline_coef(const cubic_spline_coef &_c)
+  {
+    a = _c.a;
+    b = _c.b;
+    c = _c.c;
+    d = _c.d;
+  }
 
-    LAMMPS_INLINE
-    void operator=(const cubic_spline_coef &rhs) volatile {
-      a = rhs.a;
-      b = rhs.b;
-      c = rhs.c;
-      d = rhs.d;
-    }
-  };
-}
+  LAMMPS_INLINE
+  void operator=(const cubic_spline_coef &rhs)
+  {
+    a = rhs.a;
+    b = rhs.b;
+    c = rhs.c;
+    d = rhs.d;
+  }
+
+  LAMMPS_INLINE
+  void operator=(const cubic_spline_coef &rhs) volatile
+  {
+    a = rhs.a;
+    b = rhs.b;
+    c = rhs.c;
+    d = rhs.d;
+  }
+};
+}    // namespace ReaxFF
 
 #endif
diff --git a/src/REAXFF/reaxff_types.h b/src/REAXFF/reaxff_types.h
index e57244c66b..6bd752f58a 100644
--- a/src/REAXFF/reaxff_types.h
+++ b/src/REAXFF/reaxff_types.h
@@ -28,374 +28,355 @@
 
 // forward declarations
 namespace LAMMPS_NS {
-  class Error;
-  class LAMMPS;
-  class Memory;
-  class Pair;
-}
+class Error;
+class LAMMPS;
+class Memory;
+class Pair;
+}    // namespace LAMMPS_NS
 
-namespace ReaxFF
-{
-  /********************** TYPE DEFINITIONS ********************/
-  typedef int ivec[3];
-  typedef double rvec[3];
-  typedef double rvec2[2];
+namespace ReaxFF {
+/********************** TYPE DEFINITIONS ********************/
+typedef int ivec[3];
+typedef double rvec[3];
+typedef double rvec2[2];
 
-  // import LAMMPS' definition of tagint and bigint
-  typedef LAMMPS_NS::tagint rc_tagint;
-  typedef LAMMPS_NS::bigint rc_bigint;
+// import LAMMPS' definition of tagint and bigint
+typedef LAMMPS_NS::tagint rc_tagint;
+typedef LAMMPS_NS::bigint rc_bigint;
 
-  struct global_parameters
-  {
-    int n_global;
-    int vdw_type;
-    double *l;
-  };
+struct global_parameters {
+  int n_global;
+  int vdw_type;
+  double *l;
+};
 
-  struct single_body_parameters
-  {
-    char name[4];    // two character atom name
-    double r_s;
-    double valency;  // Valency of the atom
-    double mass;     // Mass of atom
-    double r_vdw;
-    double epsilon;
-    double gamma;
-    double r_pi;
-    double valency_e;
-    double nlp_opt;
+struct single_body_parameters {
+  char name[4];    // two character atom name
+  double r_s;
+  double valency;    // Valency of the atom
+  double mass;       // Mass of atom
+  double r_vdw;
+  double epsilon;
+  double gamma;
+  double r_pi;
+  double valency_e;
+  double nlp_opt;
 
-    /* Line two in field file */
-    double alpha;
-    double gamma_w;
-    double valency_boc;
-    double p_ovun5;
-    double chi;
-    double eta;
-    int  p_hbond; // 1 for H, 2 for hbonding atoms (O,S,P,N), 0 for others
+  /* Line two in field file */
+  double alpha;
+  double gamma_w;
+  double valency_boc;
+  double p_ovun5;
+  double chi;
+  double eta;
+  int p_hbond;    // 1 for H, 2 for hbonding atoms (O,S,P,N), 0 for others
 
-    /* Line three in field file */
-    double r_pi_pi;
-    double p_lp2;
-    double b_o_131;
-    double b_o_132;
-    double b_o_133;
+  /* Line three in field file */
+  double r_pi_pi;
+  double p_lp2;
+  double b_o_131;
+  double b_o_132;
+  double b_o_133;
 
-    /* Line four in the field file */
-    double p_ovun2;
-    double p_val3;
-    double valency_val;
-    double p_val5;
-    double rcore2;
-    double ecore2;
-    double acore2;
+  /* Line four in the field file */
+  double p_ovun2;
+  double p_val3;
+  double valency_val;
+  double p_val5;
+  double rcore2;
+  double ecore2;
+  double acore2;
 
-    /* Line five in the ffield file, only for lgvdw yes */
-    double lgcij;
-    double lgre;
+  /* Line five in the ffield file, only for lgvdw yes */
+  double lgcij;
+  double lgre;
+};
 
-  };
+/* Two Body Parameters */
+struct two_body_parameters {
+  /* Bond Order parameters */
+  double p_bo1, p_bo2, p_bo3, p_bo4, p_bo5, p_bo6;
+  double r_s, r_p, r_pp;    // r_o distances in BO formula
+  double p_boc3, p_boc4, p_boc5;
 
-  /* Two Body Parameters */
-  struct two_body_parameters {
-    /* Bond Order parameters */
-    double p_bo1,p_bo2,p_bo3,p_bo4,p_bo5,p_bo6;
-    double r_s, r_p, r_pp;  // r_o distances in BO formula
-    double p_boc3, p_boc4, p_boc5;
+  /* Bond Energy parameters */
+  double p_be1, p_be2;
+  double De_s, De_p, De_pp;
 
-    /* Bond Energy parameters */
-    double p_be1, p_be2;
-    double De_s, De_p, De_pp;
+  /* Over/Under coordination parameters */
+  double p_ovun1;
 
-    /* Over/Under coordination parameters */
-    double p_ovun1;
+  /* Van der Waal interaction parameters */
+  double D;
+  double alpha;
+  double r_vdW;
+  double gamma_w;
+  double rcore, ecore, acore;
+  double lgcij, lgre;
 
-    /* Van der Waal interaction parameters */
-    double D;
-    double alpha;
-    double r_vdW;
-    double gamma_w;
-    double rcore, ecore, acore;
-    double lgcij, lgre;
+  /* electrostatic parameters */
+  double gamma;    // note: this parameter is gamma^-3 and not gamma.
 
-    /* electrostatic parameters */
-    double gamma; // note: this parameter is gamma^-3 and not gamma.
+  double v13cor, ovc;
+};
 
-    double v13cor, ovc;
-  };
+struct dbond_coefficients {
+  double C1dbo, C2dbo, C3dbo;
+  double C1dbopi, C2dbopi, C3dbopi, C4dbopi;
+  double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2;
+  double C1dDelta, C2dDelta, C3dDelta;
+};
 
-  struct dbond_coefficients {
-    double C1dbo, C2dbo, C3dbo;
-    double C1dbopi, C2dbopi, C3dbopi, C4dbopi;
-    double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2;
-    double C1dDelta, C2dDelta, C3dDelta;
-  };
+/* 3-body parameters */
+struct three_body_parameters {
+  /* valence angle */
+  double theta_00;
+  double p_val1, p_val2, p_val4, p_val7;
 
-  /* 3-body parameters */
-  struct three_body_parameters {
-    /* valence angle */
-    double theta_00;
-    double p_val1, p_val2, p_val4, p_val7;
+  /* penalty */
+  double p_pen1;
 
-    /* penalty */
-    double p_pen1;
+  /* 3-body conjugation */
+  double p_coa1;
+};
 
-    /* 3-body conjugation */
-    double p_coa1;
-  };
+struct three_body_header {
+  int cnt;
+  three_body_parameters prm[REAX_MAX_3BODY_PARAM];
+};
 
-  struct three_body_header
-  {
-    int cnt;
-    three_body_parameters prm[REAX_MAX_3BODY_PARAM];
-  };
+/* hydrogen-bond parameters */
+struct hbond_parameters {
+  double r0_hb, p_hb1, p_hb2, p_hb3;
+};
 
-  /* hydrogen-bond parameters */
-  struct hbond_parameters
-  {
-    double r0_hb, p_hb1, p_hb2, p_hb3;
-  };
+/* 4-body parameters */
+struct four_body_parameters {
+  double V1, V2, V3;
 
-  /* 4-body parameters */
-  struct four_body_parameters
-  {
-    double V1, V2, V3;
+  /* torsion angle */
+  double p_tor1;
 
-    /* torsion angle */
-    double p_tor1;
+  /* 4-body conjugation */
+  double p_cot1;
+};
 
-    /* 4-body conjugation */
-    double p_cot1;
-  };
+struct four_body_header {
+  int cnt;
+  four_body_parameters prm[REAX_MAX_4BODY_PARAM];
+};
 
-  struct four_body_header
-  {
-    int cnt;
-    four_body_parameters prm[REAX_MAX_4BODY_PARAM];
-  };
+struct reax_interaction {
+  int num_atom_types;
+  global_parameters gp;
+  single_body_parameters *sbp;
+  two_body_parameters **tbp;
+  three_body_header ***thbp;
+  hbond_parameters ***hbp;
+  four_body_header ****fbp;
+};
 
-  struct reax_interaction
-  {
-    int num_atom_types;
-    global_parameters gp;
-    single_body_parameters *sbp;
-    two_body_parameters **tbp;
-    three_body_header ***thbp;
-    hbond_parameters ***hbp;
-    four_body_header ****fbp;
-  };
+struct reax_atom {
+  rc_tagint orig_id;
+  int type;
+  char name[8];
 
-  struct reax_atom
-  {
-    rc_tagint  orig_id;
-    int  type;
-    char name[8];
+  rvec x;      // position
+  rvec v;      // velocity
+  rvec f;      // force
+  double q;    // charge
 
-    rvec x; // position
-    rvec v; // velocity
-    rvec f; // force
-    double q; // charge
+  int Hindex;
+  int num_bonds;
+  int num_hbonds;
+};
 
-    int Hindex;
-    int num_bonds;
-    int num_hbonds;
-  };
+struct LR_lookup_table;    // forward declaration
+struct reax_system {
+  reax_interaction reax_param;
 
-  struct LR_lookup_table;  // forward declaration
-  struct reax_system
-  {
-    reax_interaction reax_param;
+  rc_bigint bigN;
+  int n, N, numH;
+  int local_cap, total_cap, Hcap;
+  int wsize, my_rank, num_nbrs;
+  reax_atom *my_atoms;
 
-    rc_bigint        bigN;
-    int              n, N, numH;
-    int              local_cap, total_cap, Hcap;
-    int              wsize, my_rank, num_nbrs;
-    reax_atom       *my_atoms;
+  LAMMPS_NS::Error *error_ptr;
+  LAMMPS_NS::Pair *pair_ptr;
+  LAMMPS_NS::Memory *mem_ptr;
 
-    LAMMPS_NS::Error *error_ptr;
-    LAMMPS_NS::Pair  *pair_ptr;
-    LAMMPS_NS::Memory *mem_ptr;
+  int my_bonds;
+  int mincap, minhbonds;
+  double safezone, saferzone;
 
-    int my_bonds;
-    int mincap,minhbonds;
-    double safezone, saferzone;
+  LR_lookup_table **LR;
 
-    LR_lookup_table **LR;
+  int omp_active;
+};
 
-    int omp_active;
-  };
+/* system control parameters */
+struct control_params {
+  int nthreads;
 
-  /* system control parameters */
-  struct control_params
-  {
-    int  nthreads;
+  double bond_cut;
+  double nonb_cut, nonb_low;
+  double hbond_cut;
 
-    double bond_cut;
-    double nonb_cut, nonb_low;
-    double hbond_cut;
+  double bg_cut;
+  double bo_cut;
+  double thb_cut;
+  double thb_cutsq;
 
-    double bg_cut;
-    double bo_cut;
-    double thb_cut;
-    double thb_cutsq;
+  int tabulate;
 
-    int tabulate;
+  int lgflag;
+  int enobondsflag;
+  LAMMPS_NS::Error *error_ptr;
+  LAMMPS_NS::LAMMPS *lmp_ptr;
+  int me;
+};
 
-    int lgflag;
-    int enobondsflag;
-    LAMMPS_NS::Error  *error_ptr;
-    LAMMPS_NS::LAMMPS *lmp_ptr;
-    int me;
-  };
+struct energy_data {
+  double e_bond;    // Total bond energy
+  double e_ov;      // Total over coordination
+  double e_un;      // Total under coordination energy
+  double e_lp;      // Total under coordination energy
+  double e_ang;     // Total valance angle energy
+  double e_pen;     // Total penalty energy
+  double e_coa;     // Total three body conjgation energy
+  double e_hb;      // Total Hydrogen bond energy
+  double e_tor;     // Total torsional energy
+  double e_con;     // Total four body conjugation energy
+  double e_vdW;     // Total van der Waals energy
+  double e_ele;     // Total electrostatics energy
+  double e_pol;     // Polarization energy
+};
 
-  struct energy_data
-  {
-    double e_bond;                     // Total bond energy
-    double e_ov;                       // Total over coordination
-    double e_un;                       // Total under coordination energy
-    double e_lp;                       // Total under coordination energy
-    double e_ang;                      // Total valance angle energy
-    double e_pen;                      // Total penalty energy
-    double e_coa;                      // Total three body conjgation energy
-    double e_hb;                       // Total Hydrogen bond energy
-    double e_tor;                      // Total torsional energy
-    double e_con;                      // Total four body conjugation energy
-    double e_vdW;                      // Total van der Waals energy
-    double e_ele;                      // Total electrostatics energy
-    double e_pol;                      // Polarization energy
-  };
+struct simulation_data {
+  rc_bigint step;
+  energy_data my_en;    // per MPI rank energies
+};
 
-  struct simulation_data
-  {
-    rc_bigint  step;
-    energy_data my_en;            // per MPI rank energies
-  };
+struct three_body_interaction_data {
+  int thb;
+  int pthb;    // pointer to the third body on the central atom's nbrlist
+  double theta, cos_theta;
+  rvec dcos_di, dcos_dj, dcos_dk;
+};
 
-  struct three_body_interaction_data
-  {
-    int thb;
-    int pthb; // pointer to the third body on the central atom's nbrlist
-    double theta, cos_theta;
-    rvec dcos_di, dcos_dj, dcos_dk;
-  };
+struct far_neighbor_data {
+  int nbr;
+  ivec rel_box;
+  double d;
+  rvec dvec;
+};
 
-  struct far_neighbor_data {
-    int nbr;
-    ivec rel_box;
-    double d;
-    rvec dvec;
-  };
+struct hbond_data {
+  int nbr;
+  int scl;
+  far_neighbor_data *ptr;
+};
 
-  struct hbond_data {
-    int nbr;
-    int scl;
-    far_neighbor_data *ptr;
-  };
+struct bond_order_data {
+  double BO, BO_s, BO_pi, BO_pi2;
+  double Cdbo, Cdbopi, Cdbopi2;
+  double C1dbo, C2dbo, C3dbo;
+  double C1dbopi, C2dbopi, C3dbopi, C4dbopi;
+  double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2;
+  rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2;
+  double *CdboReduction;
+};
 
-  struct bond_order_data {
-    double BO, BO_s, BO_pi, BO_pi2;
-    double Cdbo, Cdbopi, Cdbopi2;
-    double C1dbo, C2dbo, C3dbo;
-    double C1dbopi, C2dbopi, C3dbopi, C4dbopi;
-    double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2;
-    rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2;
-    double *CdboReduction;
-  };
+struct bond_data {
+  int nbr;
+  int sym_index;
+  int dbond_index;
+  ivec rel_box;
+  double d;
+  rvec dvec;
+  bond_order_data bo_data;
+};
 
-  struct bond_data {
-    int nbr;
-    int sym_index;
-    int dbond_index;
-    ivec rel_box;
-    double d;
-    rvec dvec;
-    bond_order_data bo_data;
-  };
+struct sparse_matrix_entry {
+  int j;
+  double val;
+};
 
-  struct sparse_matrix_entry {
-    int j;
-    double val;
-  };
+struct sparse_matrix {
+  int cap, n, m;
+  int *start, *end;
+  sparse_matrix_entry *entries;
+};
 
-  struct sparse_matrix {
-    int cap, n, m;
-    int *start, *end;
-    sparse_matrix_entry *entries;
-  };
+struct reallocate_data {
+  int num_far;
+  int H, Htop;
+  int hbonds, num_hbonds;
+  int bonds, num_bonds;
+  int num_3body;
+};
 
-  struct reallocate_data {
-    int num_far;
-    int H, Htop;
-    int hbonds, num_hbonds;
-    int bonds, num_bonds;
-    int num_3body;
-  };
+struct storage {
+  int allocated;
 
-  struct storage
-  {
-    int allocated;
+  /* bond order related storage */
+  double *total_bond_order;
+  double *Deltap, *Deltap_boc;
+  double *Delta, *Delta_lp, *Delta_lp_temp, *Delta_e, *Delta_boc, *Delta_val;
+  double *dDelta_lp, *dDelta_lp_temp;
+  double *nlp, *nlp_temp, *Clp, *vlpex;
+  rvec *dDeltap_self;
+  int *bond_mark;
 
-    /* bond order related storage */
-    double *total_bond_order;
-    double *Deltap, *Deltap_boc;
-    double *Delta, *Delta_lp, *Delta_lp_temp, *Delta_e, *Delta_boc, *Delta_val;
-    double *dDelta_lp, *dDelta_lp_temp;
-    double *nlp, *nlp_temp, *Clp, *vlpex;
-    rvec *dDeltap_self;
-    int *bond_mark;
+  /* Taper */
+  double Tap[8];    //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0;
 
-    /* Taper */
-    double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0;
+  /* force calculations */
+  double *CdDelta;    // coefficient of dDelta
+  rvec *f;
 
-    /* force calculations */
-    double *CdDelta;  // coefficient of dDelta
-    rvec *f;
+  /* omp */
+  rvec *forceReduction;
+  double *CdDeltaReduction;
+  int *valence_angle_atom_myoffset;
 
-    /* omp */
-    rvec *forceReduction;
-    double *CdDeltaReduction;
-    int *valence_angle_atom_myoffset;
+  reallocate_data realloc;
+};
 
-    reallocate_data realloc;
-  };
+union list_type {
+  three_body_interaction_data *three_body_list;
+  bond_data *bond_list;
+  far_neighbor_data *far_nbr_list;
+  hbond_data *hbond_list;
+};
 
-  union list_type
-  {
-    three_body_interaction_data *three_body_list;
-    bond_data          *bond_list;
-    far_neighbor_data  *far_nbr_list;
-    hbond_data         *hbond_list;
-  };
+struct reax_list {
+  int allocated;
 
-  struct reax_list
-  {
-    int allocated;
+  int n;
+  int num_intrs;
 
-    int n;
-    int num_intrs;
+  int *index;
+  int *end_index;
 
-    int *index;
-    int *end_index;
+  int type;
+  list_type select;
+  class LAMMPS_NS::Error *error_ptr;
+};
 
-    int type;
-    list_type select;
-    class LAMMPS_NS::Error     *error_ptr;
-  };
+struct LR_lookup_table {
+  double xmin, xmax;
+  int n;
+  double dx, inv_dx;
+  double a;
+  double m;
+  double c;
 
-  struct LR_lookup_table
-  {
-    double xmin, xmax;
-    int n;
-    double dx, inv_dx;
-    double a;
-    double m;
-    double c;
-
-    LR_data *y;
-    cubic_spline_coef *H;
-    cubic_spline_coef *vdW, *CEvd;
-    cubic_spline_coef *ele, *CEclmb;
-  };
-}
+  LR_data *y;
+  cubic_spline_coef *H;
+  cubic_spline_coef *vdW, *CEvd;
+  cubic_spline_coef *ele, *CEclmb;
+};
+}    // namespace ReaxFF
 
 #endif

From fec77e49bd3607c668152ee5d74cbdbe5655923e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 18:22:12 -0400
Subject: [PATCH 066/437] add clang-format commands to Makefile

---
 src/Makefile | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/Makefile b/src/Makefile
index 6f93af04c6..f9c71d7d98 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -492,6 +492,13 @@ check-homepage:
 fix-homepage:
 	$(PYTHON) ../tools/coding_standard/homepage.py .. -f
 
+format-src:
+	clang-format -i --style=file *.cpp *.h */*.cpp */*.h
+
+format-tests:
+	clang-format -i --style=file ../unittest/*/*.cpp ../unittest/*/*.h
+
+
 # Package management
 
 package:

From 6b6e63f77f966acc2beaeab530ffc79da103cf7e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 18:36:07 -0400
Subject: [PATCH 067/437] avoid redundant defines

---
 src/KOKKOS/pair_reaxff_kokkos.h | 2 --
 src/REAXFF/fix_qeq_reaxff.cpp   | 6 ++----
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h
index e60533f61e..bfa4e6fb4a 100644
--- a/src/KOKKOS/pair_reaxff_kokkos.h
+++ b/src/KOKKOS/pair_reaxff_kokkos.h
@@ -37,8 +37,6 @@ PairStyle(reax/c/kk/host,PairReaxFFKokkos);
 #define HB_THRESHOLD   1e-2  // 0.01
 #define MAX_BONDS      30
 
-#define SQR(x)        ((x)*(x))
-
 #include "reaxff_inline.h"
 
 namespace LAMMPS_NS {
diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp
index 8c3b7df190..06c9414fbd 100644
--- a/src/REAXFF/fix_qeq_reaxff.cpp
+++ b/src/REAXFF/fix_qeq_reaxff.cpp
@@ -53,9 +53,7 @@ public:
   const char *what() const noexcept { return message.c_str(); }
 };
 
-#define EV_TO_KCAL_PER_MOL 14.4
-#define SQR(x) ((x)*(x))
-#define CUBE(x) ((x)*(x)*(x))
+static constexpr double EV_TO_KCAL_PER_MOL = 14.4;
 
 static const char cite_fix_qeq_reaxff[] =
   "fix qeq/reaxff command:\n\n"
@@ -689,7 +687,7 @@ double FixQEqReaxFF::calculate_H(double r, double gamma)
   Taper = Taper * r + Tap[0];
 
   denom = r * r * r + gamma;
-  denom = pow(denom,0.3333333333333);
+  denom = pow(denom,1.0/3.0);
 
   return Taper * EV_TO_KCAL_PER_MOL / denom;
 }

From d44edeb32ea31108df1d5729bdec97726102a1fc Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 18:36:44 -0400
Subject: [PATCH 068/437] make clang-format custom targets in CMake similar to
 the ones in GNU make

---
 cmake/CMakeLists.txt    | 7 +++++++
 unittest/CMakeLists.txt | 6 ++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index a778c89d42..06297ca919 100644
--- a/cmake/CMakeLists.txt
+++ b/cmake/CMakeLists.txt
@@ -769,6 +769,13 @@ endif()
 include(Testing)
 include(CodeCoverage)
 include(CodingStandard)
+find_package(ClangFormat 8.0)
+
+if(ClangFormat_FOUND)
+  add_custom_target(format-src
+    COMMAND ${ClangFormat_EXECUTABLE} --verbose -i -style=file *.cpp *.h */*.cpp */*.h
+    WORKING_DIRECTORY ${LAMMPS_SOURCE_DIR})
+endif()
 
 get_target_property(DEFINES lammps COMPILE_DEFINITIONS)
 include(FeatureSummary)
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 2d86fa2663..bb746c13ec 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -55,9 +55,7 @@ add_subdirectory(force-styles)
 find_package(ClangFormat 8.0)
 
 if(ClangFormat_FOUND)
-  set(UNITTEST_SOURCES)
-  file(GLOB_RECURSE UNITTEST_SOURCES *.cpp *.h)
   add_custom_target(format-tests
-    COMMAND ${ClangFormat_EXECUTABLE} --verbose -i -style=file ${UNITTEST_SOURCES}
-    DEPENDS ${UNITTEST_SOURCES})
+    COMMAND ${ClangFormat_EXECUTABLE} --verbose -i -style=file */*.cpp */*.h
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
 endif()

From cb19806020c155026e539e2792739fd538584ed9 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 20:34:44 -0400
Subject: [PATCH 069/437] update ReaxFF reference data due to use of more
 precise constants in fix qeq/reax

---
 .../tests/atomic-pair-reaxff.yaml             | 269 +++++++++---------
 .../tests/atomic-pair-reaxff_lgvdw.yaml       | 269 +++++++++---------
 .../tests/atomic-pair-reaxff_noqeq.yaml       |   7 +-
 .../tests/atomic-pair-reaxff_tabulate.yaml    | 269 +++++++++---------
 4 files changed, 409 insertions(+), 405 deletions(-)

diff --git a/unittest/force-styles/tests/atomic-pair-reaxff.yaml b/unittest/force-styles/tests/atomic-pair-reaxff.yaml
index d5bed64ae6..2f706e58c6 100644
--- a/unittest/force-styles/tests/atomic-pair-reaxff.yaml
+++ b/unittest/force-styles/tests/atomic-pair-reaxff.yaml
@@ -1,7 +1,8 @@
 ---
-lammps_version: 2 Jul 2021
-date_generated: Wed Jul 21 15:49:45 2021
+lammps_version: 30 Jul 2021
+date_generated: Mon Aug 23 20:32:03 2021
 epsilon: 2e-11
+skip_tests:
 prerequisites: ! |
   pair reaxff
   fix qeq/reaxff
@@ -35,141 +36,141 @@ pair_coeff: ! |
 extract: ! ""
 natoms: 64
 init_vdwl: -3296.3503506624793
-init_coul: -327.06551252279587
+init_coul: -327.06551252279405
 init_stress: ! |-
-  -1.0522112314759656e+03 -1.2629480788292419e+03 -8.6765541430728797e+02 -2.5149818635822544e+02  2.0624598409299588e+02 -6.4309968343216440e+02
+  -1.0522112314759529e+03 -1.2629480788292253e+03 -8.6765541430727546e+02 -2.5149818635822436e+02  2.0624598409299585e+02 -6.4309968343216588e+02
 init_forces: ! |2
-    1 -8.8484559491557889e+01 -2.5824737864578672e+01  1.0916228789487677e+02
-    2 -1.1227736122976222e+02 -1.8092349731667619e+02 -2.2420586526896258e+02
-    3 -1.7210817575849026e+02  1.8292439782308693e+02  1.3552618819720610e+01
-    4  3.2997500231085269e+01 -5.1076027616185407e+01  9.0475628837095528e+01
-    5  1.8144778146274791e+02  1.6797701000587494e+01 -8.1725507301127109e+01
-    6  1.3634094180728098e+02 -3.0056789474000180e+02  2.9661495129805985e+01
-    7 -5.3287158661291791e+01 -1.2872927610192625e+02 -1.6347871108897493e+02
-    8 -1.5334883257588757e+02  4.0171483324130705e+01  1.5317461163041000e+02
-    9  1.8364155867634015e+01  8.1986572088186833e+01  2.8272397798081524e+01
-   10  8.4246730110712562e+01  1.4177487113456959e+02  1.2330079878579957e+02
-   11 -4.3218423112520917e+01  6.5551082199289681e+01  1.3464882148706636e+02
-   12 -9.7317470492933836e+01 -2.6234999414154061e+01  7.2277941881646433e+00
-   13 -6.3183329836753892e+01 -4.7368101002971272e+01 -3.7592654029315028e+01
-   14  7.8642975316486144e+01 -6.7997612991897398e+01 -9.9044775614596077e+01
-   15 -6.6373732796038979e+01  2.1787558547532149e+02  8.0103149369093416e+01
-   16  1.9216166082224373e+02  5.3228015320734841e+01  6.6260214054210607e+01
-   17  1.4496007689503060e+02 -3.9700923044583725e+01 -9.7503851828130109e+01
-   18 -4.4989550233790240e+01 -1.9360605894359739e+02  1.1274792197022477e+02
-   19  2.6657528138945764e+02  3.7189510796650950e+02 -3.3847307488287709e+02
-   20 -7.6341040242469404e+01 -8.8478925962203348e+01  1.3557778212060665e+00
-   21 -7.1188591900926752e+01 -5.1591439985136596e+01 -1.2279442803769271e+02
-   22  1.5504836733039957e+02 -1.3094504458746079e+02  8.1474408030760628e+01
-   23  7.8015302036861712e+01 -1.3272310040521580e+01 -2.2771427736544119e+01
-   24 -2.0546718065741095e+02  2.1611071031053456e+02 -1.2423208053538964e+02
-   25 -1.1402686646199034e+02  1.9100238121128135e+02 -8.3504908417580054e+01
-   26  2.8663576552098777e+02 -2.1773884754170615e+02  2.3144300100087472e+02
-   27 -6.3247409025611177e+01  6.9122196748087077e+01  1.8606936744368775e+02
-   28 -3.5426011055935045e+00  3.8764809029451875e+01  3.2874001946768900e+01
-   29 -7.1069178571876577e+01  3.5485903180427727e+01  2.7311648896320222e+01
-   30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123534e+02
-   31 -1.3970409889743331e+02  1.6660943915628047e+02 -1.2913930522474698e+02
-   32  2.7179130444112264e+01 -6.0169059447629905e+01 -1.7669495182022038e+02
-   33 -6.2659679124099576e+01 -6.4422131921795383e+01  6.4150928205326579e+01
-   34 -2.2119065265693525e+01  1.0450386886830510e+02 -7.3998379587547845e+01
-   35  2.6982987783286291e+02 -2.1519317040003423e+02  1.3051628460669625e+02
-   36  1.0368628874516659e+02  1.8817377639779619e+02 -1.9748944223870336e+02
-   37 -1.8009522406836996e+02  1.2993653092243866e+02 -6.3523043394051889e+01
-   38 -2.9571205878459978e+02  1.0441609933482223e+02  1.5582204859042622e+02
-   39  8.7398805727029284e+01 -6.0025559644669265e+01  2.2209742009837157e+01
-   40  2.0540672579010842e+01 -1.0735874009092362e+02  5.8655918369892206e+01
-   41 -5.8895846271372335e+01  1.1852345624639781e+01 -6.6147257724570267e+01
-   42 -9.6895512314642517e+01  3.8928741136688721e+01 -7.5791929957116153e+01
-   43  2.2476051812062425e+02  9.5505204283237461e+01  1.2309042240718746e+02
-   44  8.9817373579488660e+01 -1.0616333580628947e+02 -8.6321519086255464e+01
-   45  1.7202629662584418e+01  1.2890307246697841e+02  5.2916171301068438e+01
-   46  1.3547783972601877e+01 -2.9276223331260034e+01  2.2187412696867373e+01
-   47  3.3389762514712125e+01 -1.9217585014965050e+02 -6.9956213241088321e+01
-   48  7.3631720332112678e+01 -2.0953007324688531e+02 -2.3183566221404764e+01
-   49 -3.7589944473227263e+02 -2.4083165714763936e+01  1.0770339502610540e+02
-   50  3.8603083564823876e+01 -7.3616481568799330e+01  9.0414065019644610e+01
-   51  1.3736420686706188e+02 -1.0204157331506994e+02  1.5813725581150808e+02
-   52 -1.0797257051087827e+02  1.1876975735151170e+02 -1.3295758126486243e+02
-   53 -5.3807540206295386e+01  3.3259462625854701e+02 -3.8426833262903415e-03
-   54 -1.0690184616186778e+01  6.2820270853646484e+01  1.8343158343321133e+02
-   55  1.1231900459987581e+02 -1.7906654831317167e+02  7.6533681064340868e+01
-   56 -4.1027190034916501e+01 -1.4085413191133770e+02  3.7483064289953184e+01
-   57  9.9904315214040494e+01  7.0938939080461608e+01 -6.8654961257661554e+01
-   58 -2.7563642882026748e+01 -6.7445498717142298e+00 -1.8442640542823217e+01
-   59 -6.6628933617875447e+01  1.0613066354110043e+02  8.7736153919831693e+01
-   60 -1.7748415247438984e+01  6.3757605316872557e+01 -1.5086907478326543e+02
-   61 -3.3560907195791373e+01 -1.0076987083174085e+02 -7.4536106106935819e+01
-   62  1.5883428926665005e+01 -5.8433760297908881e+00  2.8392494016034934e+01
-   63  1.3294494001298784e+02 -1.2724568063770243e+02 -6.4886848316806294e+01
-   64  1.0738157273930993e+02  1.2062173788161542e+02  7.4541400611710799e+01
+    1 -8.8484559491557576e+01 -2.5824737864578474e+01  1.0916228789487663e+02
+    2 -1.1227736122976231e+02 -1.8092349731667568e+02 -2.2420586526896210e+02
+    3 -1.7210817575849001e+02  1.8292439782308699e+02  1.3552618819720600e+01
+    4  3.2997500231086512e+01 -5.1076027616186423e+01  9.0475628837094987e+01
+    5  1.8144778146274754e+02  1.6797701000586258e+01 -8.1725507301126484e+01
+    6  1.3634094180728138e+02 -3.0056789474000107e+02  2.9661495129806241e+01
+    7 -5.3287158661291443e+01 -1.2872927610192636e+02 -1.6347871108897522e+02
+    8 -1.5334883257588731e+02  4.0171483324130968e+01  1.5317461163041025e+02
+    9  1.8364155867633905e+01  8.1986572088188041e+01  2.8272397798080572e+01
+   10  8.4246730110712335e+01  1.4177487113456957e+02  1.2330079878579940e+02
+   11 -4.3218423112520789e+01  6.5551082199289695e+01  1.3464882148706644e+02
+   12 -9.7317470492933708e+01 -2.6234999414153897e+01  7.2277941881646690e+00
+   13 -6.3183329836754375e+01 -4.7368101002971763e+01 -3.7592654029315270e+01
+   14  7.8642975316486883e+01 -6.7997612991897341e+01 -9.9044775614594982e+01
+   15 -6.6373732796039107e+01  2.1787558547532043e+02  8.0103149369093344e+01
+   16  1.9216166082224314e+02  5.3228015320734926e+01  6.6260214054210081e+01
+   17  1.4496007689503062e+02 -3.9700923044583710e+01 -9.7503851828130095e+01
+   18 -4.4989550233790261e+01 -1.9360605894359642e+02  1.1274792197022478e+02
+   19  2.6657528138945804e+02  3.7189510796650745e+02 -3.3847307488287669e+02
+   20 -7.6341040242469091e+01 -8.8478925962202780e+01  1.3557778212056153e+00
+   21 -7.1188591900927420e+01 -5.1591439985137015e+01 -1.2279442803769207e+02
+   22  1.5504836733039960e+02 -1.3094504458746056e+02  8.1474408030760486e+01
+   23  7.8015302036862593e+01 -1.3272310040520148e+01 -2.2771427736544595e+01
+   24 -2.0546718065741135e+02  2.1611071031053424e+02 -1.2423208053538949e+02
+   25 -1.1402686646199029e+02  1.9100238121128146e+02 -8.3504908417580012e+01
+   26  2.8663576552098777e+02 -2.1773884754170624e+02  2.3144300100087486e+02
+   27 -6.3247409025611496e+01  6.9122196748086992e+01  1.8606936744368636e+02
+   28 -3.5426011055935565e+00  3.8764809029452159e+01  3.2874001946768921e+01
+   29 -7.1069178571876549e+01  3.5485903180427400e+01  2.7311648896320079e+01
+   30 -1.7036987830119909e+02 -1.9851827590031249e+02 -1.1511401829123544e+02
+   31 -1.3970409889743348e+02  1.6660943915628044e+02 -1.2913930522474664e+02
+   32  2.7179130444112555e+01 -6.0169059447629756e+01 -1.7669495182022018e+02
+   33 -6.2659679124099306e+01 -6.4422131921795099e+01  6.4150928205326267e+01
+   34 -2.2119065265693525e+01  1.0450386886830492e+02 -7.3998379587547646e+01
+   35  2.6982987783286018e+02 -2.1519317040003440e+02  1.3051628460669710e+02
+   36  1.0368628874516730e+02  1.8817377639779588e+02 -1.9748944223870336e+02
+   37 -1.8009522406837104e+02  1.2993653092243764e+02 -6.3523043394051243e+01
+   38 -2.9571205878460017e+02  1.0441609933482263e+02  1.5582204859042571e+02
+   39  8.7398805727029966e+01 -6.0025559644668739e+01  2.2209742009837775e+01
+   40  2.0540672579010657e+01 -1.0735874009092251e+02  5.8655918369892035e+01
+   41 -5.8895846271371049e+01  1.1852345624640863e+01 -6.6147257724571631e+01
+   42 -9.6895512314643625e+01  3.8928741136688558e+01 -7.5791929957114633e+01
+   43  2.2476051812062411e+02  9.5505204283237532e+01  1.2309042240718757e+02
+   44  8.9817373579488688e+01 -1.0616333580628816e+02 -8.6321519086255464e+01
+   45  1.7202629662584872e+01  1.2890307246697708e+02  5.2916171301067237e+01
+   46  1.3547783972602119e+01 -2.9276223331259811e+01  2.2187412696867874e+01
+   47  3.3389762514712146e+01 -1.9217585014965024e+02 -6.9956213241088335e+01
+   48  7.3631720332111271e+01 -2.0953007324688463e+02 -2.3183566221404689e+01
+   49 -3.7589944473227075e+02 -2.4083165714764295e+01  1.0770339502610511e+02
+   50  3.8603083564822633e+01 -7.3616481568798903e+01  9.0414065019643530e+01
+   51  1.3736420686706222e+02 -1.0204157331507010e+02  1.5813725581150817e+02
+   52 -1.0797257051087884e+02  1.1876975735151218e+02 -1.3295758126486228e+02
+   53 -5.3807540206295457e+01  3.3259462625854701e+02 -3.8426833262548143e-03
+   54 -1.0690184616186478e+01  6.2820270853646576e+01  1.8343158343321142e+02
+   55  1.1231900459987587e+02 -1.7906654831317175e+02  7.6533681064340797e+01
+   56 -4.1027190034915932e+01 -1.4085413191133824e+02  3.7483064289953155e+01
+   57  9.9904315214039713e+01  7.0938939080462006e+01 -6.8654961257660744e+01
+   58 -2.7563642882026500e+01 -6.7445498717147609e+00 -1.8442640542822897e+01
+   59 -6.6628933617874523e+01  1.0613066354110011e+02  8.7736153919830500e+01
+   60 -1.7748415247438214e+01  6.3757605316872365e+01 -1.5086907478326515e+02
+   61 -3.3560907195792048e+01 -1.0076987083174087e+02 -7.4536106106935421e+01
+   62  1.5883428926665001e+01 -5.8433760297910968e+00  2.8392494016034437e+01
+   63  1.3294494001298756e+02 -1.2724568063770263e+02 -6.4886848316805384e+01
+   64  1.0738157273930983e+02  1.2062173788161350e+02  7.4541400611711396e+01
 run_vdwl: -3296.346882377749
-run_coul: -327.0653995073912
+run_coul: -327.06539950739005
 run_stress: ! |-
-  -1.0521225462925122e+03 -1.2628780139889511e+03 -8.6757617693086104e+02 -2.5158592653603904e+02  2.0619472152426832e+02 -6.4312943979323666e+02
+  -1.0521225462924954e+03 -1.2628780139889352e+03 -8.6757617693084944e+02 -2.5158592653603768e+02  2.0619472152426559e+02 -6.4312943979323916e+02
 run_forces: ! |2
-    1 -8.8486129396001502e+01 -2.5824483374473179e+01  1.0916517213634110e+02
-    2 -1.1227648453173391e+02 -1.8093214754186130e+02 -2.2420118533940348e+02
-    3 -1.7210894875994978e+02  1.8292263268451674e+02  1.3551979435686095e+01
-    4  3.2999405001009350e+01 -5.1077312719545880e+01  9.0478579144069585e+01
-    5  1.8144963583123231e+02  1.6798391906831846e+01 -8.1723378082075712e+01
-    6  1.3640835897739439e+02 -3.0059507544862095e+02  2.9594750460783359e+01
-    7 -5.3287619129789448e+01 -1.2872953167026756e+02 -1.6348317368624123e+02
-    8 -1.5334990952322434e+02  4.0171746946780829e+01  1.5317542403106131e+02
-    9  1.8362961213927182e+01  8.1984428717784269e+01  2.8273598253027302e+01
-   10  8.4245458094789058e+01  1.4177227430519352e+02  1.2329899933660965e+02
-   11 -4.3217035356344425e+01  6.5547850976510773e+01  1.3463983671946411e+02
-   12 -9.7319343004573128e+01 -2.6236499899232264e+01  7.2232061905742331e+00
-   13 -6.3184735475530417e+01 -4.7368090836538116e+01 -3.7590268076036132e+01
-   14  7.8642680121804005e+01 -6.7994653297646451e+01 -9.9042134233434012e+01
-   15 -6.6371195967082826e+01  2.1787700653339661e+02  8.0102624694807389e+01
-   16  1.9215832443892597e+02  5.3231888618093954e+01  6.6253846562695017e+01
-   17  1.4496126989603121e+02 -3.9700366098757279e+01 -9.7506725874209309e+01
-   18 -4.4989211400008635e+01 -1.9360716191976442e+02  1.1274798810455859e+02
-   19  2.6657546213782734e+02  3.7189369483257695e+02 -3.3847202166068030e+02
-   20 -7.6352829159880955e+01 -8.8469178952301633e+01  1.3384778817072787e+00
-   21 -7.1188597560667404e+01 -5.1592404200740077e+01 -1.2279357314243526e+02
-   22  1.5504965184741243e+02 -1.3094582932680530e+02  8.1473922626938020e+01
-   23  7.8017376001392918e+01 -1.3263023728607578e+01 -2.2771654676273979e+01
-   24 -2.0547634460482251e+02  2.1612342044348730e+02 -1.2423651650061711e+02
-   25 -1.1402944116091902e+02  1.9100648219391277e+02 -8.3505645569845370e+01
-   26  2.8664542299410527e+02 -2.1774609219880722e+02  2.3144720166994415e+02
-   27 -6.3243843868043086e+01  6.9123801262965259e+01  1.8607035157681676e+02
-   28 -3.5444604841998202e+00  3.8760531647714458e+01  3.2869123667281691e+01
-   29 -7.1069494158179211e+01  3.5486459158760596e+01  2.7311657876181030e+01
-   30 -1.7037059987992404e+02 -1.9851840131669360e+02 -1.1511410156295638e+02
-   31 -1.3970663440086005e+02  1.6660841802305001e+02 -1.2914070628112793e+02
-   32  2.7179939937138435e+01 -6.0162678551485499e+01 -1.7668459764117441e+02
-   33 -6.2659124615698147e+01 -6.4421915847941477e+01  6.4151176691093468e+01
-   34 -2.2118740875419469e+01  1.0450303589341145e+02 -7.3997370482692958e+01
-   35  2.6987081482968881e+02 -2.1523754104000349e+02  1.3052736086179610e+02
-   36  1.0368798521815542e+02  1.8816694370725344e+02 -1.9748485159172907e+02
-   37 -1.8012152564003850e+02  1.2997662140302853e+02 -6.3547259053587815e+01
-   38 -2.9571525697590823e+02  1.0441941743734586e+02  1.5582112543442355e+02
-   39  8.7399620724575229e+01 -6.0025787992411310e+01  2.2209357601282100e+01
-   40  2.0541458171950950e+01 -1.0735817059033015e+02  5.8656280350524284e+01
-   41 -5.8893965304899957e+01  1.1850504754314873e+01 -6.6138932259022440e+01
-   42 -9.6894702780992304e+01  3.8926449644174781e+01 -7.5794133002764809e+01
-   43  2.2475651760389385e+02  9.5503072846836503e+01  1.2308683766845402e+02
-   44  8.9821846939843127e+01 -1.0615882525757857e+02 -8.6326896770189890e+01
-   45  1.7193681344342274e+01  1.2889564928820624e+02  5.2922372841252461e+01
-   46  1.3549091739280328e+01 -2.9276447091757490e+01  2.2187152043656504e+01
-   47  3.3389460345593179e+01 -1.9217121673024417e+02 -6.9954603582952572e+01
-   48  7.3644268618852792e+01 -2.0953201921822824e+02 -2.3192562071413271e+01
-   49 -3.7593958318941031e+02 -2.4028439106859906e+01  1.0779151134441003e+02
-   50  3.8603926624328523e+01 -7.3615255297989492e+01  9.0412505212292430e+01
-   51  1.3736689552214156e+02 -1.0204490780187869e+02  1.5814099219652564e+02
-   52 -1.0797151154267748e+02  1.1876989597626186e+02 -1.3296150756377079e+02
-   53 -5.3843453069456565e+01  3.3257024143956778e+02 -2.3416395383840438e-02
-   54 -1.0678049522667443e+01  6.2807424617056597e+01  1.8344969045860518e+02
-   55  1.1232135576105661e+02 -1.7906994470561881e+02  7.6534265234548187e+01
-   56 -4.1035945990527694e+01 -1.4084577238065074e+02  3.7489705598247951e+01
-   57  9.9903872061946146e+01  7.0936213558024505e+01 -6.8656338416452499e+01
-   58 -2.7563844572724129e+01 -6.7426705471926915e+00 -1.8442803060445037e+01
-   59 -6.6637290503389465e+01  1.0613630918459928e+02  8.7741455199772943e+01
-   60 -1.7749706497437348e+01  6.3756413885635929e+01 -1.5086911682892702e+02
-   61 -3.3559889608749927e+01 -1.0076809277084796e+02 -7.4536003122046253e+01
-   62  1.5883833834736409e+01 -5.8439916924703361e+00  2.8393403991146915e+01
-   63  1.3294237052896716e+02 -1.2724619636183061e+02 -6.4882384014219113e+01
-   64  1.0738250214938944e+02  1.2062290362868877e+02  7.4541927445529197e+01
+    1 -8.8486129396001218e+01 -2.5824483374473036e+01  1.0916517213634087e+02
+    2 -1.1227648453173404e+02 -1.8093214754186079e+02 -2.2420118533940303e+02
+    3 -1.7210894875994950e+02  1.8292263268451674e+02  1.3551979435685961e+01
+    4  3.2999405001010643e+01 -5.1077312719546981e+01  9.0478579144069144e+01
+    5  1.8144963583123194e+02  1.6798391906830979e+01 -8.1723378082075044e+01
+    6  1.3640835897739478e+02 -3.0059507544862021e+02  2.9594750460783587e+01
+    7 -5.3287619129788844e+01 -1.2872953167026776e+02 -1.6348317368624151e+02
+    8 -1.5334990952322408e+02  4.0171746946781077e+01  1.5317542403106148e+02
+    9  1.8362961213927182e+01  8.1984428717785391e+01  2.8273598253026371e+01
+   10  8.4245458094788816e+01  1.4177227430519349e+02  1.2329899933660948e+02
+   11 -4.3217035356344297e+01  6.5547850976510787e+01  1.3463983671946414e+02
+   12 -9.7319343004572985e+01 -2.6236499899232058e+01  7.2232061905743059e+00
+   13 -6.3184735475530928e+01 -4.7368090836538634e+01 -3.7590268076036381e+01
+   14  7.8642680121804801e+01 -6.7994653297646380e+01 -9.9042134233432975e+01
+   15 -6.6371195967082940e+01  2.1787700653339559e+02  8.0102624694807346e+01
+   16  1.9215832443892546e+02  5.3231888618094061e+01  6.6253846562694534e+01
+   17  1.4496126989603124e+02 -3.9700366098757236e+01 -9.7506725874209351e+01
+   18 -4.4989211400008664e+01 -1.9360716191976348e+02  1.1274798810455860e+02
+   19  2.6657546213782763e+02  3.7189369483257491e+02 -3.3847202166067979e+02
+   20 -7.6352829159880756e+01 -8.8469178952300979e+01  1.3384778817068639e+00
+   21 -7.1188597560667986e+01 -5.1592404200740368e+01 -1.2279357314243465e+02
+   22  1.5504965184741243e+02 -1.3094582932680512e+02  8.1473922626937920e+01
+   23  7.8017376001393998e+01 -1.3263023728606166e+01 -2.2771654676274697e+01
+   24 -2.0547634460482288e+02  2.1612342044348708e+02 -1.2423651650061697e+02
+   25 -1.1402944116091899e+02  1.9100648219391283e+02 -8.3505645569845328e+01
+   26  2.8664542299410522e+02 -2.1774609219880730e+02  2.3144720166994426e+02
+   27 -6.3243843868043413e+01  6.9123801262965202e+01  1.8607035157681540e+02
+   28 -3.5444604841998948e+00  3.8760531647714707e+01  3.2869123667281748e+01
+   29 -7.1069494158179182e+01  3.5486459158760333e+01  2.7311657876180927e+01
+   30 -1.7037059987992401e+02 -1.9851840131669331e+02 -1.1511410156295651e+02
+   31 -1.3970663440086025e+02  1.6660841802304981e+02 -1.2914070628112756e+02
+   32  2.7179939937138652e+01 -6.0162678551485335e+01 -1.7668459764117409e+02
+   33 -6.2659124615697849e+01 -6.4421915847941165e+01  6.4151176691093141e+01
+   34 -2.2118740875419427e+01  1.0450303589341122e+02 -7.3997370482692745e+01
+   35  2.6987081482968597e+02 -2.1523754104000369e+02  1.3052736086179686e+02
+   36  1.0368798521815600e+02  1.8816694370725310e+02 -1.9748485159172913e+02
+   37 -1.8012152564003969e+02  1.2997662140302771e+02 -6.3547259053586927e+01
+   38 -2.9571525697590874e+02  1.0441941743734624e+02  1.5582112543442304e+02
+   39  8.7399620724575939e+01 -6.0025787992410734e+01  2.2209357601282722e+01
+   40  2.0541458171950772e+01 -1.0735817059032904e+02  5.8656280350524156e+01
+   41 -5.8893965304898771e+01  1.1850504754315740e+01 -6.6138932259023889e+01
+   42 -9.6894702780993356e+01  3.8926449644174937e+01 -7.5794133002763360e+01
+   43  2.2475651760389374e+02  9.5503072846836602e+01  1.2308683766845417e+02
+   44  8.9821846939843198e+01 -1.0615882525757729e+02 -8.6326896770189904e+01
+   45  1.7193681344342732e+01  1.2889564928820488e+02  5.2922372841251153e+01
+   46  1.3549091739280518e+01 -2.9276447091757351e+01  2.2187152043657001e+01
+   47  3.3389460345593193e+01 -1.9217121673024394e+02 -6.9954603582952615e+01
+   48  7.3644268618851228e+01 -2.0953201921822756e+02 -2.3192562071413256e+01
+   49 -3.7593958318940844e+02 -2.4028439106860226e+01  1.0779151134440963e+02
+   50  3.8603926624327279e+01 -7.3615255297989023e+01  9.0412505212291279e+01
+   51  1.3736689552214187e+02 -1.0204490780187885e+02  1.5814099219652562e+02
+   52 -1.0797151154267804e+02  1.1876989597626228e+02 -1.3296150756377062e+02
+   53 -5.3843453069456608e+01  3.3257024143956778e+02 -2.3416395383755173e-02
+   54 -1.0678049522667131e+01  6.2807424617056697e+01  1.8344969045860529e+02
+   55  1.1232135576105669e+02 -1.7906994470561887e+02  7.6534265234548087e+01
+   56 -4.1035945990527210e+01 -1.4084577238065111e+02  3.7489705598247944e+01
+   57  9.9903872061945378e+01  7.0936213558024932e+01 -6.8656338416451703e+01
+   58 -2.7563844572723873e+01 -6.7426705471932156e+00 -1.8442803060444724e+01
+   59 -6.6637290503388542e+01  1.0613630918459900e+02  8.7741455199771877e+01
+   60 -1.7749706497436613e+01  6.3756413885635709e+01 -1.5086911682892671e+02
+   61 -3.3559889608750574e+01 -1.0076809277084796e+02 -7.4536003122045898e+01
+   62  1.5883833834736391e+01 -5.8439916924705493e+00  2.8393403991146428e+01
+   63  1.3294237052896685e+02 -1.2724619636183077e+02 -6.4882384014218175e+01
+   64  1.0738250214938935e+02  1.2062290362868680e+02  7.4541927445529822e+01
 ...
diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml
index b124a6b00b..5a50b0f7d3 100644
--- a/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml
+++ b/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml
@@ -1,7 +1,8 @@
 ---
-lammps_version: 2 Jul 2021
-date_generated: Wed Jul 21 15:49:47 2021
+lammps_version: 30 Jul 2021
+date_generated: Mon Aug 23 20:32:03 2021
 epsilon: 3e-12
+skip_tests:
 prerequisites: ! |
   pair reaxff
   fix qeq/reaxff
@@ -35,141 +36,141 @@ pair_coeff: ! |
 extract: ! ""
 natoms: 64
 init_vdwl: -2454.3149508399256
-init_coul: -344.1380904917976
+init_coul: -344.1380904917979
 init_stress: ! |2-
-   4.8195587070292022e+03  4.4865954368949333e+03  3.2679588293062807e+03 -1.8469678134590695e+03  7.6556385424846383e+02 -4.9517278307742527e+02
+   4.8195587070292204e+03  4.4865954368949615e+03  3.2679588293062939e+03 -1.8469678134590631e+03  7.6556385424846258e+02 -4.9517278307742424e+02
 init_forces: ! |2
-    1 -1.9811664067580179e+02 -1.5618748554879582e+02 -1.0716617094919901e+02
-    2 -4.1075966889759549e+01 -6.7708246449675826e+01 -4.2506724189242625e+01
-    3  3.1596544789529435e+01  8.8571277602644230e+01  1.4850846557451499e+02
-    4  1.7447178183928099e+02  3.2866954415453542e+01 -3.1178861314762706e+01
-    5  1.1873199005659021e+02  5.9095115842131932e+01  2.3739439807686179e+02
-    6  1.3052453610124783e+03 -4.4208109447713036e+02 -1.4245452171137993e+03
-    7 -8.7153363585941023e+01 -1.0895261162467335e+02 -3.5604687372058106e+02
-    8 -9.1047579854191568e+01  4.4450937169776367e+01  1.1879559986803960e+02
-    9  4.7456602925193202e+01  1.7227642506022178e+02 -1.4638226748446902e+01
-   10  6.3508986324759796e+01  4.8590610415561791e+01  1.1075535682642935e+01
-   11 -5.1919052217198654e+01  7.3820742396411859e+01  5.1375340691983297e+01
-   12 -1.0171933720752882e+02 -1.9845958414353014e+01 -1.7437665462751710e+01
-   13 -7.3048376131504796e+01 -4.5586627360377697e+01  2.8533062846208718e+01
-   14  8.6287140258369817e+01 -4.1664353236768306e+01  1.7094340432182349e+01
-   15 -3.5690271737605421e+01  1.2671711108383721e+02  4.5865072089126137e+01
-   16  1.0608232372370769e+02  3.5980003156299816e+01  1.8676593635940495e+01
-   17  2.3577630118103411e+02 -9.8579505236746911e+01  4.1005658232556200e+01
-   18 -2.0815299273687735e+01 -1.1578579968450295e+02  6.5566787154472507e+01
-   19  4.3265264076046989e+01  1.0913234729250236e+02  3.0900987497773690e+02
-   20 -1.0086773950039242e+02  7.4841212143883340e+01 -1.6547856280073117e+02
-   21 -8.5974538718179744e+01 -4.5982868874733214e+00 -7.3066508052444064e+01
-   22  1.3343492132570225e+02 -1.2211943449611955e+02  9.0328124087551771e+01
-   23  5.2985077374887155e+01  2.0040750326966961e+01 -9.0416982004666124e+00
-   24 -1.8957025969382852e+02  8.1671696884795935e+01 -1.2920621849543528e+01
-   25 -1.0067836293726948e+02  1.3220054680372053e+02 -4.8975895235994550e+01
-   26  2.1849478729429609e+02 -1.9386903120078870e+02  1.7116657218419911e+02
-   27 -3.7478069218092713e+01  3.0044804022729696e+01  9.3872627169948643e+01
-   28  9.9359193467603504e+01 -5.5156189036814489e+01 -3.1541196450035862e+01
-   29 -3.9530012231991570e+01  5.6689953230829886e+01  2.5358584427671758e+01
-   30 -9.7652246814367359e+01 -2.2271920242502716e+02 -1.4460601547049507e+02
-   31 -4.6192346966779525e+01  7.2790084189834928e+01  3.1159158603346764e+01
-   32  1.2013060628467285e+01 -3.4474347848945321e+01 -1.0622600014669140e+02
-   33  5.2551051115345523e+01  4.2704675585248637e+01 -3.0154896799401911e+01
-   34  1.6822864099952500e+02 -1.6889974455004834e-02  1.1832622696299902e+02
-   35  5.1185090023661456e+02 -1.3214021604987863e+03  1.1319907541000696e+03
-   36 -1.4331382529302426e+01  9.9702896436313011e+01 -1.3159358421899239e+02
-   37 -8.9317756897655045e+02  1.3544128453102783e+03 -7.5922493710251524e+02
-   38 -3.8384748878233427e+02  1.2143676601363948e+02  1.7580047976723321e+02
-   39  1.6381134310552267e+02 -1.2998574463953721e+01 -7.8542909545441532e+01
-   40  6.1412235617277204e+01 -2.0153615037331058e+01  4.3186957794586569e+01
-   41  1.3114484088383939e+01  1.7854214885793560e+00  3.3683765652624942e+01
-   42 -6.4838533708029473e+01  5.2662237041257001e+01 -6.8645855319469405e+01
-   43  2.0925885626252014e+02  8.2942516657430232e+01  1.1786724503954686e+02
-   44 -3.8463410277622415e+01 -7.5319916775508815e+01 -1.3445887472637642e+02
-   45 -3.4797907366084097e+01  7.6266761873332939e+01  4.3023416525122514e+01
-   46  2.3463432665038606e+01 -1.5313857576705701e+01 -3.8707451594223872e+00
-   47 -3.7271493199629653e+01 -5.4876511333920178e+01 -1.9275411927395869e+01
-   48  2.8275275023555378e+02 -1.7973942289882839e+02 -6.0167953907638991e+02
-   49 -2.0529905689923417e+03 -6.7838314309842517e+01  7.6230272883402574e+02
-   50  1.3292222637274611e+02 -9.8795036249084106e+01  9.9132259532945980e+01
-   51  2.6168921895029303e+02 -1.9761595427509062e+02  2.4062513751852873e+02
-   52 -1.2257063176561179e+02  1.3353869954874421e+02 -1.1598337420807965e+02
-   53  3.8021621191835851e+02  8.1199705966172485e+02  2.7057346247419935e+02
-   54  6.9440336670547069e+01 -1.1592524541887394e+02  2.2072297942372259e+02
-   55  8.7300666059627744e+01 -1.3907353173150562e+02  5.9541107879138558e+01
-   56  3.4771676857170337e+02 -2.4546959502036671e+02 -3.5077189358394361e+02
-   57  6.1706174952483430e+01  7.9893925286373715e+01  3.4373445887630369e+00
-   58  3.7240798760941445e+01 -1.2919400623491822e+02  3.9695110774075808e+01
-   59 -5.2076445103995343e+02  2.1046582886974139e+02  1.7083299176148785e+02
-   60 -7.8657547105875310e+01 -2.3005356890255410e+01 -1.2454833328198774e+02
-   61 -3.9633103573229910e+01 -5.5165443660352402e+01 -4.0780192434587690e+01
-   62 -1.8742346202622748e+01 -1.3844690899539831e+01  2.2586546200036359e+00
-   63  6.5150947885422283e+01  7.1009493033300544e+01 -8.4093092375006009e+01
-   64  4.0079516427458060e+01  9.6476598333945972e+01  9.1213458480138428e+01
+    1 -1.9811664067580159e+02 -1.5618748554879568e+02 -1.0716617094919916e+02
+    2 -4.1075966889759641e+01 -6.7708246449675286e+01 -4.2506724189242021e+01
+    3  3.1596544789529464e+01  8.8571277602644372e+01  1.4850846557451493e+02
+    4  1.7447178183928258e+02  3.2866954415452341e+01 -3.1178861314763104e+01
+    5  1.1873199005658965e+02  5.9095115842130738e+01  2.3739439807686244e+02
+    6  1.3052453610124785e+03 -4.4208109447712940e+02 -1.4245452171137986e+03
+    7 -8.7153363585940426e+01 -1.0895261162467359e+02 -3.5604687372058174e+02
+    8 -9.1047579854191298e+01  4.4450937169776779e+01  1.1879559986803987e+02
+    9  4.7456602925193152e+01  1.7227642506022326e+02 -1.4638226748448135e+01
+   10  6.3508986324759455e+01  4.8590610415561628e+01  1.1075535682642681e+01
+   11 -5.1919052217198583e+01  7.3820742396411902e+01  5.1375340691983368e+01
+   12 -1.0171933720752850e+02 -1.9845958414352879e+01 -1.7437665462751557e+01
+   13 -7.3048376131505080e+01 -4.5586627360378003e+01  2.8533062846208615e+01
+   14  8.6287140258370783e+01 -4.1664353236768285e+01  1.7094340432183635e+01
+   15 -3.5690271737605578e+01  1.2671711108383596e+02  4.5865072089126130e+01
+   16  1.0608232372370705e+02  3.5980003156299965e+01  1.8676593635939877e+01
+   17  2.3577630118103406e+02 -9.8579505236746954e+01  4.1005658232556264e+01
+   18 -2.0815299273687838e+01 -1.1578579968450181e+02  6.5566787154472564e+01
+   19  4.3265264076047565e+01  1.0913234729250026e+02  3.0900987497773781e+02
+   20 -1.0086773950039212e+02  7.4841212143884178e+01 -1.6547856280073174e+02
+   21 -8.5974538718180185e+01 -4.5982868874736553e+00 -7.3066508052443197e+01
+   22  1.3343492132570228e+02 -1.2211943449611935e+02  9.0328124087551714e+01
+   23  5.2985077374888242e+01  2.0040750326968670e+01 -9.0416982004676285e+00
+   24 -1.8957025969382900e+02  8.1671696884795594e+01 -1.2920621849543304e+01
+   25 -1.0067836293726943e+02  1.3220054680372061e+02 -4.8975895235994514e+01
+   26  2.1849478729429595e+02 -1.9386903120078873e+02  1.7116657218419905e+02
+   27 -3.7478069218093054e+01  3.0044804022729668e+01  9.3872627169946981e+01
+   28  9.9359193467603447e+01 -5.5156189036814197e+01 -3.1541196450035862e+01
+   29 -3.9530012231991577e+01  5.6689953230829516e+01  2.5358584427671591e+01
+   30 -9.7652246814367359e+01 -2.2271920242502677e+02 -1.4460601547049527e+02
+   31 -4.6192346966779660e+01  7.2790084189834801e+01  3.1159158603347159e+01
+   32  1.2013060628467482e+01 -3.4474347848945179e+01 -1.0622600014669111e+02
+   33  5.2551051115345899e+01  4.2704675585248992e+01 -3.0154896799402348e+01
+   34  1.6822864099952508e+02 -1.6889974455174411e-02  1.1832622696299923e+02
+   35  5.1185090023661138e+02 -1.3214021604987868e+03  1.1319907541000705e+03
+   36 -1.4331382529301770e+01  9.9702896436312813e+01 -1.3159358421899253e+02
+   37 -8.9317756897655170e+02  1.3544128453102769e+03 -7.5922493710251410e+02
+   38 -3.8384748878233495e+02  1.2143676601363995e+02  1.7580047976723245e+02
+   39  1.6381134310552315e+02 -1.2998574463953297e+01 -7.8542909545440992e+01
+   40  6.1412235617277069e+01 -2.0153615037329580e+01  4.3186957794586327e+01
+   41  1.3114484088385700e+01  1.7854214885807362e+00  3.3683765652623272e+01
+   42 -6.4838533708030567e+01  5.2662237041256951e+01 -6.8645855319467699e+01
+   43  2.0925885626251986e+02  8.2942516657430446e+01  1.1786724503954716e+02
+   44 -3.8463410277622316e+01 -7.5319916775507551e+01 -1.3445887472637637e+02
+   45 -3.4797907366083635e+01  7.6266761873331220e+01  4.3023416525121014e+01
+   46  2.3463432665038884e+01 -1.5313857576705434e+01 -3.8707451594217472e+00
+   47 -3.7271493199629667e+01 -5.4876511333919964e+01 -1.9275411927395901e+01
+   48  2.8275275023555270e+02 -1.7973942289882777e+02 -6.0167953907639026e+02
+   49 -2.0529905689923398e+03 -6.7838314309842900e+01  7.6230272883402529e+02
+   50  1.3292222637274469e+02 -9.8795036249083523e+01  9.9132259532944744e+01
+   51  2.6168921895029325e+02 -1.9761595427509093e+02  2.4062513751852859e+02
+   52 -1.2257063176561259e+02  1.3353869954874475e+02 -1.1598337420807951e+02
+   53  3.8021621191835879e+02  8.1199705966172496e+02  2.7057346247419935e+02
+   54  6.9440336670547481e+01 -1.1592524541887384e+02  2.2072297942372268e+02
+   55  8.7300666059627844e+01 -1.3907353173150571e+02  5.9541107879138451e+01
+   56  3.4771676857170365e+02 -2.4546959502036736e+02 -3.5077189358394327e+02
+   57  6.1706174952482442e+01  7.9893925286374284e+01  3.4373445887641214e+00
+   58  3.7240798760941850e+01 -1.2919400623491885e+02  3.9695110774076205e+01
+   59 -5.2076445103995263e+02  2.1046582886974133e+02  1.7083299176148688e+02
+   60 -7.8657547105874528e+01 -2.3005356890255712e+01 -1.2454833328198735e+02
+   61 -3.9633103573230692e+01 -5.5165443660352508e+01 -4.0780192434587299e+01
+   62 -1.8742346202622745e+01 -1.3844690899540067e+01  2.2586546200029356e+00
+   63  6.5150947885421942e+01  7.1009493033300245e+01 -8.4093092375004943e+01
+   64  4.0079516427458039e+01  9.6476598333943798e+01  9.1213458480139110e+01
 run_vdwl: -2454.3233099608155
-run_coul: -344.1379608070739
+run_coul: -344.1379608070727
 run_stress: ! |2-
-   4.8194587329953692e+03  4.4865895224706946e+03  3.2679446938086485e+03 -1.8471163065259320e+03  7.6545324620049041e+02 -4.9527853267789004e+02
+   4.8194587329953774e+03  4.4865895224707238e+03  3.2679446938086630e+03 -1.8471163065259302e+03  7.6545324620048859e+02 -4.9527853267789408e+02
 run_forces: ! |2
-    1 -1.9811556407056102e+02 -1.5618143620847070e+02 -1.0716119874908739e+02
-    2 -4.1073968384374822e+01 -6.7710647015369261e+01 -4.2502864658157385e+01
-    3  3.1592798331689583e+01  8.8575236369726497e+01  1.4850890801985437e+02
-    4  1.7447282006187959e+02  3.2862369867970457e+01 -3.1175721266394834e+01
-    5  1.1873112974792329e+02  5.9090963929048314e+01  2.3738916225937453e+02
-    6  1.3053008444613586e+03 -4.4210323642713996e+02 -1.4246081409032695e+03
-    7 -8.7152343512651953e+01 -1.0895314566818776e+02 -3.5604721285130660e+02
-    8 -9.1046846091347703e+01  4.4451665481009499e+01  1.1879618751723051e+02
-    9  4.7463133585713919e+01  1.7228438483982211e+02 -1.4645071927693349e+01
-   10  6.3506921990797963e+01  4.8587688349158142e+01  1.1073324095443047e+01
-   11 -5.1917951887543467e+01  7.3818630188510312e+01  5.1369234828489176e+01
-   12 -1.0172154753205889e+02 -1.9847809999838830e+01 -1.7441731987232995e+01
-   13 -7.3048126072731876e+01 -4.5586545373889699e+01  2.8534758158919548e+01
-   14  8.6288077929554404e+01 -4.1660634795038867e+01  1.7096747148188040e+01
-   15 -3.5688114877422024e+01  1.2671728980619932e+02  4.5864235397118847e+01
-   16  1.0608395201173666e+02  3.5983845233526999e+01  1.8672925070386196e+01
-   17  2.3576828121395238e+02 -9.8577850318505440e+01  4.1004495565128614e+01
-   18 -2.0815095995902730e+01 -1.1578710179047432e+02  6.5566934287391277e+01
-   19  4.3264252619509840e+01  1.0912982970441865e+02  3.0901253523346554e+02
-   20 -1.0088948935029293e+02  7.4849484282711913e+01 -1.6550538409007382e+02
-   21 -8.5974038585183081e+01 -4.5987854992617692e+00 -7.3065890363335626e+01
-   22  1.3343130763213867e+02 -1.2211553430043763e+02  9.0325064574872258e+01
-   23  5.2984912690315262e+01  2.0042805349785073e+01 -9.0417924141684995e+00
-   24 -1.8954830238390488e+02  8.1645824240163975e+01 -1.2893974448861021e+01
-   25 -1.0068116183998590e+02  1.3220505876703564e+02 -4.8977129584747814e+01
-   26  2.1847179335289815e+02 -1.9385136258527231e+02  1.7114800244815055e+02
-   27 -3.7476307441658179e+01  3.0046433191315703e+01  9.3873685757283724e+01
-   28  9.9355970623229169e+01 -5.5158350569168121e+01 -3.1544144508393824e+01
-   29 -3.9530224377035040e+01  5.6690552166969916e+01  2.5358784555346112e+01
-   30 -9.7652510697052577e+01 -2.2271892169387456e+02 -1.4460597467192858e+02
-   31 -4.6194950503295701e+01  7.2792554749932393e+01  3.1151667586195508e+01
-   32  1.2014466624027643e+01 -3.4469133688337770e+01 -1.0621837802800977e+02
-   33  5.2553699854339705e+01  4.2706400148046903e+01 -3.0154323622364597e+01
-   34  1.6822906612351349e+02 -1.7651825961909302e-02  1.1832699040444521e+02
-   35  5.1193507571856611e+02 -1.3215008853106001e+03  1.1320319719742361e+03
-   36 -1.4340338085502884e+01  9.9690347849156851e+01 -1.3158127406978679e+02
-   37 -8.9323390159980192e+02  1.3545163222654817e+03 -7.5929442355796743e+02
-   38 -3.8384755818822509e+02  1.2143789174035302e+02  1.7579570815453908e+02
-   39  1.6381197094628516e+02 -1.2998258674043829e+01 -7.8543109639931160e+01
-   40  6.1411228642100035e+01 -2.0154566391139259e+01  4.3186834298875652e+01
-   41  1.3119781105415534e+01  1.7920555043075754e+00  3.3686007139293856e+01
-   42 -6.4838490750749202e+01  5.2660553302313680e+01 -6.8647362072367542e+01
-   43  2.0926308211689772e+02  8.2945847275902722e+01  1.1786850503407652e+02
-   44 -3.8461829626420936e+01 -7.5317323697263234e+01 -1.3445959877777375e+02
-   45 -3.4805239678702840e+01  7.6262295586966090e+01  4.3024220690600863e+01
-   46  2.3465031078234958e+01 -1.5312554894709733e+01 -3.8725170500358588e+00
-   47 -3.7271036720207924e+01 -5.4879638482209749e+01 -1.9275876359755912e+01
-   48  2.8270391245290489e+02 -1.7971102191169686e+02 -6.0165064633346822e+02
-   49 -2.0529526126133587e+03 -6.7744467074995427e+01  7.6241869031244289e+02
-   50  1.3291615685330387e+02 -9.8801239572742261e+01  9.9131933784099587e+01
-   51  2.6169570171244874e+02 -1.9762541199560968e+02  2.4063463246277209e+02
-   52 -1.2256816067286560e+02  1.3353356136884042e+02 -1.1597765595389475e+02
-   53  3.8012282364003789e+02  8.1194045374755683e+02  2.7050484440708351e+02
-   54  6.9456553969440762e+01 -1.1593864337324271e+02  2.2074869335520950e+02
-   55  8.7303368709848343e+01 -1.3907755259033479e+02  5.9542185087028599e+01
-   56  3.4769731101937145e+02 -2.4546533348164240e+02 -3.5075782168770780e+02
-   57  6.1706155820465291e+01  7.9892471516403972e+01  3.4375912204692454e+00
-   58  3.7237511516193933e+01 -1.2919240641738722e+02  3.9695822512620310e+01
-   59 -5.2071132643271164e+02  2.1045883047165898e+02  1.7082619476821390e+02
-   60 -7.8658294909200450e+01 -2.3007149625533501e+01 -1.2454738729229325e+02
-   61 -3.9624794908666537e+01 -5.5169201638846069e+01 -4.0777145486525072e+01
-   62 -1.8741606623350247e+01 -1.3845552517299250e+01  2.2601936169388566e+00
-   63  6.5142845574860644e+01  7.0992677773634597e+01 -8.4109461087571191e+01
-   64  4.0079794681812906e+01  9.6475030340595453e+01  9.1215541718322228e+01
+    1 -1.9811556407056088e+02 -1.5618143620847064e+02 -1.0716119874908756e+02
+    2 -4.1073968384374929e+01 -6.7710647015368721e+01 -4.2502864658156838e+01
+    3  3.1592798331689615e+01  8.8575236369726582e+01  1.4850890801985429e+02
+    4  1.7447282006188135e+02  3.2862369867969377e+01 -3.1175721266395321e+01
+    5  1.1873112974792295e+02  5.9090963929047163e+01  2.3738916225937521e+02
+    6  1.3053008444613590e+03 -4.4210323642713900e+02 -1.4246081409032688e+03
+    7 -8.7152343512651242e+01 -1.0895314566818800e+02 -3.5604721285130728e+02
+    8 -9.1046846091347419e+01  4.4451665481009826e+01  1.1879618751723078e+02
+    9  4.7463133585714033e+01  1.7228438483982359e+02 -1.4645071927694708e+01
+   10  6.3506921990797643e+01  4.8587688349158064e+01  1.1073324095442819e+01
+   11 -5.1917951887543289e+01  7.3818630188510255e+01  5.1369234828489255e+01
+   12 -1.0172154753205881e+02 -1.9847809999838582e+01 -1.7441731987232863e+01
+   13 -7.3048126072732174e+01 -4.5586545373889997e+01  2.8534758158919409e+01
+   14  8.6288077929555229e+01 -4.1660634795038746e+01  1.7096747148189305e+01
+   15 -3.5688114877422194e+01  1.2671728980619812e+02  4.5864235397118840e+01
+   16  1.0608395201173600e+02  3.5983845233527155e+01  1.8672925070385567e+01
+   17  2.3576828121395229e+02 -9.8577850318505497e+01  4.1004495565128636e+01
+   18 -2.0815095995902841e+01 -1.1578710179047313e+02  6.5566934287391334e+01
+   19  4.3264252619510422e+01  1.0912982970441605e+02  3.0901253523346622e+02
+   20 -1.0088948935029266e+02  7.4849484282712737e+01 -1.6550538409007447e+02
+   21 -8.5974038585183592e+01 -4.5987854992621955e+00 -7.3065890363334759e+01
+   22  1.3343130763213867e+02 -1.2211553430043745e+02  9.0325064574872144e+01
+   23  5.2984912690316413e+01  2.0042805349786828e+01 -9.0417924141693788e+00
+   24 -1.8954830238390542e+02  8.1645824240163648e+01 -1.2893974448860810e+01
+   25 -1.0068116183998585e+02  1.3220505876703569e+02 -4.8977129584747772e+01
+   26  2.1847179335289812e+02 -1.9385136258527231e+02  1.7114800244815055e+02
+   27 -3.7476307441658555e+01  3.0046433191315668e+01  9.3873685757282061e+01
+   28  9.9355970623229155e+01 -5.5158350569167858e+01 -3.1544144508393771e+01
+   29 -3.9530224377034997e+01  5.6690552166969582e+01  2.5358784555345935e+01
+   30 -9.7652510697052577e+01 -2.2271892169387428e+02 -1.4460597467192878e+02
+   31 -4.6194950503295814e+01  7.2792554749932236e+01  3.1151667586195831e+01
+   32  1.2014466624027840e+01 -3.4469133688337621e+01 -1.0621837802800951e+02
+   33  5.2553699854340117e+01  4.2706400148047273e+01 -3.0154323622365027e+01
+   34  1.6822906612351355e+02 -1.7651825962111040e-02  1.1832699040444544e+02
+   35  5.1193507571856304e+02 -1.3215008853105999e+03  1.1320319719742367e+03
+   36 -1.4340338085502257e+01  9.9690347849156424e+01 -1.3158127406978670e+02
+   37 -8.9323390159980318e+02  1.3545163222654803e+03 -7.5929442355796618e+02
+   38 -3.8384755818822572e+02  1.2143789174035349e+02  1.7579570815453832e+02
+   39  1.6381197094628581e+02 -1.2998258674043434e+01 -7.8543109639930535e+01
+   40  6.1411228642099886e+01 -2.0154566391137791e+01  4.3186834298875425e+01
+   41  1.3119781105417216e+01  1.7920555043088842e+00  3.3686007139292201e+01
+   42 -6.4838490750750282e+01  5.2660553302313524e+01 -6.8647362072365695e+01
+   43  2.0926308211689741e+02  8.2945847275902850e+01  1.1786850503407675e+02
+   44 -3.8461829626420851e+01 -7.5317323697261926e+01 -1.3445959877777369e+02
+   45 -3.4805239678702364e+01  7.6262295586964342e+01  4.3024220690599236e+01
+   46  2.3465031078235281e+01 -1.5312554894709550e+01 -3.8725170500352220e+00
+   47 -3.7271036720207910e+01 -5.4879638482209522e+01 -1.9275876359755962e+01
+   48  2.8270391245290335e+02 -1.7971102191169626e+02 -6.0165064633346822e+02
+   49 -2.0529526126133560e+03 -6.7744467074995839e+01  7.6241869031244244e+02
+   50  1.3291615685330240e+02 -9.8801239572741693e+01  9.9131933784098351e+01
+   51  2.6169570171244902e+02 -1.9762541199560980e+02  2.4063463246277200e+02
+   52 -1.2256816067286644e+02  1.3353356136884102e+02 -1.1597765595389454e+02
+   53  3.8012282364003795e+02  8.1194045374755660e+02  2.7050484440708345e+02
+   54  6.9456553969441146e+01 -1.1593864337324254e+02  2.2074869335520964e+02
+   55  8.7303368709848456e+01 -1.3907755259033485e+02  5.9542185087028500e+01
+   56  3.4769731101937191e+02 -2.4546533348164306e+02 -3.5075782168770769e+02
+   57  6.1706155820464353e+01  7.9892471516404527e+01  3.4375912204703756e+00
+   58  3.7237511516194317e+01 -1.2919240641738787e+02  3.9695822512620701e+01
+   59 -5.2071132643271108e+02  2.1045883047165887e+02  1.7082619476821273e+02
+   60 -7.8658294909199697e+01 -2.3007149625533788e+01 -1.2454738729229290e+02
+   61 -3.9624794908667297e+01 -5.5169201638846154e+01 -4.0777145486524688e+01
+   62 -1.8741606623350233e+01 -1.3845552517299485e+01  2.2601936169381780e+00
+   63  6.5142845574860317e+01  7.0992677773634298e+01 -8.4109461087570082e+01
+   64  4.0079794681812878e+01  9.6475030340593307e+01  9.1215541718322896e+01
 ...
diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml
index de9527d99e..4fb058a2af 100644
--- a/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml
+++ b/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml
@@ -1,7 +1,8 @@
 ---
-lammps_version: 2 Jul 2021
-date_generated: Wed Jul 21 15:49:48 2021
+lammps_version: 30 Jul 2021
+date_generated: Mon Aug 23 20:32:04 2021
 epsilon: 5e-13
+skip_tests:
 prerequisites: ! |
   pair reaxff
 pre_commands: ! |
@@ -152,7 +153,7 @@ run_forces: ! |2
    47  2.3513270166768126e+02  1.7331295501003882e+02 -4.6450664399000594e+01
    48 -7.0870567240295701e+00 -2.1510840134220823e+02  2.8256287551251637e+02
    49  2.4924760680789757e+02 -2.5986199354026777e+01 -1.9539743684221281e+02
-   50  9.0194077117530171e+01  2.6674400385736777e+02  4.8189887304663053e+01
+   50  9.0194077117530142e+01  2.6674400385736777e+02  4.8189887304663053e+01
    51  2.7001321252850289e+02 -2.5024728349358162e+02  3.3082537396992757e+02
    52  2.6774804404985809e+02 -1.3486815275053038e+02 -1.0995893066873337e+02
    53 -3.0038420314626609e+02  1.7427256870890602e+02 -2.8369883331393498e+02
diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml
index 59a7f2eea4..dd8f5d8103 100644
--- a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml
+++ b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml
@@ -1,7 +1,8 @@
 ---
-lammps_version: 2 Jul 2021
-date_generated: Wed Jul 21 15:49:50 2021
+lammps_version: 30 Jul 2021
+date_generated: Mon Aug 23 20:32:05 2021
 epsilon: 1e-12
+skip_tests:
 prerequisites: ! |
   pair reaxff
   fix qeq/reaxff
@@ -36,141 +37,141 @@ pair_coeff: ! |
 extract: ! ""
 natoms: 64
 init_vdwl: -3248.7357862540734
-init_coul: -327.0655125227952
+init_coul: -327.0655125227951
 init_stress: ! |-
-  -9.1835020319343971e+02 -1.1070721188680495e+03 -7.1558466813462803e+02 -2.3040889388184610e+02  1.9640581541966480e+02 -6.6002885423290161e+02
+  -9.1835020319342993e+02 -1.1070721188680361e+03 -7.1558466813461689e+02 -2.3040889388184749e+02  1.9640581541966318e+02 -6.6002885423290252e+02
 init_forces: ! |2
-    1 -8.8484243142053771e+01 -2.5824351291806110e+01  1.0916231386685256e+02
-    2 -1.0451347832614756e+02 -1.8136974287862066e+02 -2.1792749625845636e+02
-    3 -1.7141330932870599e+02  1.8106971255162949e+02  1.2675253960497342e+01
-    4  3.2218812838204855e+01 -5.1411756251266183e+01  9.0007306757969360e+01
-    5  1.8144819687099243e+02  1.6798395592380508e+01 -8.1726053808337866e+01
-    6  1.3634126802325463e+02 -3.0056831863560092e+02  2.9662272655036702e+01
-    7 -5.2968391883957104e+01 -1.2850613949952665e+02 -1.6373506942005375e+02
-    8 -1.5240314403220790e+02  4.1133257093807174e+01  1.5386487473711946e+02
-    9  3.2812532468307580e+01  1.0176367686189141e+02  1.4294427965088833e+01
-   10  7.9509811085534523e+01  1.3053732532659751e+02  1.1246398073074913e+02
-   11 -4.3144361329385013e+01  6.5763458097239592e+01  1.3482625633510347e+02
-   12 -9.6706456479566398e+01 -2.5878068074726777e+01  7.8323180467847324e+00
-   13 -6.3851121453490386e+01 -4.6607020158192661e+01 -3.6458352736129626e+01
-   14  7.8283848679559611e+01 -6.3646790831912028e+01 -8.9030561188058030e+01
-   15 -6.4212540181982106e+01  2.1093128152294148e+02  7.9060299592798927e+01
-   16  1.8608410345576596e+02  5.8084942932974329e+01  5.8538920003760360e+01
-   17  1.4285494615811757e+02 -3.9754521764346144e+01 -9.7686742464543357e+01
-   18 -4.1881548239260340e+01 -1.8476992042512617e+02  1.0708048360801492e+02
-   19  2.6677589878662843e+02  3.7179534199157007e+02 -3.3866575926816614e+02
-   20 -7.3520359401756977e+01 -8.3905077072099573e+01 -2.3854316876052761e-01
-   21 -7.2528668519170537e+01 -5.5898051886914395e+01 -1.1976059789267006e+02
-   22  1.5613953224968657e+02 -1.3200393155013327e+02  8.2112641076919701e+01
-   23  8.1833165091702966e+01 -1.7531644917125725e+01 -2.5648343293479527e+01
-   24 -2.1833127742352659e+02  1.9453922798678227e+02 -1.0817823414171309e+02
-   25 -1.1414613109864892e+02  1.9088917707975912e+02 -8.3362585828151580e+01
-   26  2.8281696751420094e+02 -2.1478267582733662e+02  2.2873793580282313e+02
-   27 -5.9769124622217880e+01  6.5221508924768301e+01  1.7553584075622149e+02
-   28 -2.9606162623424428e+00  3.8183918395203612e+01  3.2190129571074365e+01
-   29 -7.1069178571897922e+01  3.5485903180456219e+01  2.7311648896337690e+01
-   30 -1.7036975157904502e+02 -1.9851849204561248e+02 -1.1511387046436192e+02
-   31 -1.3744101014029056e+02  1.6223817575815926e+02 -1.1915340963940670e+02
-   32  2.7247730686207166e+01 -6.0237587331413046e+01 -1.7664910575209962e+02
-   33 -6.1822971861324099e+01 -6.2648749988189138e+01  6.4194672454603221e+01
-   34 -1.7144145154614467e+01  9.9612835226783488e+01 -6.7437146990430065e+01
-   35  2.7024145652918202e+02 -2.1533864682645725e+02  1.3021380112890154e+02
-   36  1.0192185945862101e+02  1.8671686332443795e+02 -1.9864174410201804e+02
-   37 -1.7944122400067201e+02  1.2994089095714961e+02 -6.4321354857450956e+01
-   38 -2.9675055634802868e+02  1.0371104129720520e+02  1.5526989537725160e+02
-   39  8.6949523213895688e+01 -5.9975159120196956e+01  2.1780252234486241e+01
-   40  2.1612729980868444e+01 -1.0242580356371295e+02  5.7270724021457731e+01
-   41 -5.7836015722979198e+01  1.2268076597657853e+01 -6.6177893589402757e+01
-   42 -9.4774792026636959e+01  3.6872244003648007e+01 -7.5003138682741707e+01
-   43  2.2327470123469598e+02  9.5798787537490540e+01  1.2250410628715086e+02
-   44  8.7959342085865842e+01 -9.8740455124804612e+01 -8.4938709742755563e+01
-   45  1.4089093363544151e+01  1.2499300233485907e+02  5.5864237375372056e+01
-   46  1.3547776948110229e+01 -2.9276229642219498e+01  2.2187402435965936e+01
-   47  3.3448457824361142e+01 -1.9209977417392156e+02 -6.9989895706263411e+01
-   48  6.7827627502625162e+01 -2.0361789453088662e+02 -2.8571736118815590e+01
-   49 -3.7476005148434911e+02 -2.4452451195186555e+01  1.0764661193358336e+02
-   50  4.0090993029105427e+01 -7.3201402054245932e+01  8.9025922810974976e+01
-   51  1.3736420686697005e+02 -1.0204157331499377e+02  1.5813725581140889e+02
-   52 -1.1253479916199434e+02  1.2293268076535988e+02 -1.2940078007359961e+02
-   53 -5.3560738472921159e+01  3.3353082884518022e+02 -1.1314448604069298e+00
-   54 -1.0678339177259721e+01  6.2810937621378216e+01  1.8344988318246158e+02
-   55  1.1231900459987534e+02 -1.7906654831317346e+02  7.6533681064342304e+01
-   56 -4.7772143767870858e+01 -1.3536779754026813e+02  3.4054518546944287e+01
-   57  9.6541690594806283e+01  7.5093838528685495e+01 -6.0858704719314126e+01
-   58 -2.0459002696752535e+01 -1.1535051272093602e+01 -1.4282722385693351e+01
-   59 -6.9459404830701061e+01  1.0185761321965333e+02  8.3383492919159224e+01
-   60 -1.6658947285275733e+01  6.4062738321772926e+01 -1.5162708730048112e+02
-   61 -3.5221540644535281e+01 -1.0209415023871215e+02 -7.4154806308030501e+01
-   62  1.5375061601631639e+01 -6.3257038363614946e+00  2.7511178147389174e+01
-   63  1.3464841040549379e+02 -1.2416888785900632e+02 -5.8961420295344659e+01
-   64  1.0701063550375258e+02  1.1895268715876720e+02  7.4448770962530929e+01
+    1 -8.8484243142053515e+01 -2.5824351291805911e+01  1.0916231386685236e+02
+    2 -1.0451347832614758e+02 -1.8136974287862017e+02 -2.1792749625845585e+02
+    3 -1.7141330932870576e+02  1.8106971255162952e+02  1.2675253960497237e+01
+    4  3.2218812838206141e+01 -5.1411756251267207e+01  9.0007306757968763e+01
+    5  1.8144819687099201e+02  1.6798395592379507e+01 -8.1726053808337198e+01
+    6  1.3634126802325500e+02 -3.0056831863560024e+02  2.9662272655036944e+01
+    7 -5.2968391883956642e+01 -1.2850613949952682e+02 -1.6373506942005392e+02
+    8 -1.5240314403220765e+02  4.1133257093807401e+01  1.5386487473711964e+02
+    9  3.2812532468307644e+01  1.0176367686189263e+02  1.4294427965087884e+01
+   10  7.9509811085534338e+01  1.3053732532659745e+02  1.1246398073074891e+02
+   11 -4.3144361329384928e+01  6.5763458097239578e+01  1.3482625633510355e+02
+   12 -9.6706456479566242e+01 -2.5878068074726670e+01  7.8323180467847902e+00
+   13 -6.3851121453490826e+01 -4.6607020158193130e+01 -3.6458352736129804e+01
+   14  7.8283848679560407e+01 -6.3646790831912000e+01 -8.9030561188056907e+01
+   15 -6.4212540181982206e+01  2.1093128152294048e+02  7.9060299592798870e+01
+   16  1.8608410345576542e+02  5.8084942932974435e+01  5.8538920003759820e+01
+   17  1.4285494615811757e+02 -3.9754521764346073e+01 -9.7686742464543400e+01
+   18 -4.1881548239260361e+01 -1.8476992042512521e+02  1.0708048360801494e+02
+   19  2.6677589878662894e+02  3.7179534199156791e+02 -3.3866575926816569e+02
+   20 -7.3520359401756707e+01 -8.3905077072098976e+01 -2.3854316876095305e-01
+   21 -7.2528668519171163e+01 -5.5898051886914701e+01 -1.1976059789266944e+02
+   22  1.5613953224968660e+02 -1.3200393155013305e+02  8.2112641076919502e+01
+   23  8.1833165091703748e+01 -1.7531644917124240e+01 -2.5648343293479975e+01
+   24 -2.1833127742352698e+02  1.9453922798678192e+02 -1.0817823414171293e+02
+   25 -1.1414613109864887e+02  1.9088917707975926e+02 -8.3362585828151552e+01
+   26  2.8281696751420094e+02 -2.1478267582733670e+02  2.2873793580282324e+02
+   27 -5.9769124622218207e+01  6.5221508924768258e+01  1.7553584075622010e+02
+   28 -2.9606162623425121e+00  3.8183918395203868e+01  3.2190129571074380e+01
+   29 -7.1069178571897908e+01  3.5485903180455900e+01  2.7311648896337541e+01
+   30 -1.7036975157904510e+02 -1.9851849204561219e+02 -1.1511387046436201e+02
+   31 -1.3744101014029070e+02  1.6223817575815920e+02 -1.1915340963940626e+02
+   32  2.7247730686207433e+01 -6.0237587331412904e+01 -1.7664910575209942e+02
+   33 -6.1822971861323794e+01 -6.2648749988188868e+01  6.4194672454602852e+01
+   34 -1.7144145154614449e+01  9.9612835226783318e+01 -6.7437146990429881e+01
+   35  2.7024145652917929e+02 -2.1533864682645751e+02  1.3021380112890239e+02
+   36  1.0192185945862155e+02  1.8671686332443750e+02 -1.9864174410201804e+02
+   37 -1.7944122400067309e+02  1.2994089095714867e+02 -6.4321354857450302e+01
+   38 -2.9675055634802914e+02  1.0371104129720563e+02  1.5526989537725115e+02
+   39  8.6949523213896370e+01 -5.9975159120196373e+01  2.1780252234486852e+01
+   40  2.1612729980868302e+01 -1.0242580356371187e+02  5.7270724021457596e+01
+   41 -5.7836015722977898e+01  1.2268076597658890e+01 -6.6177893589404093e+01
+   42 -9.4774792026638053e+01  3.6872244003647779e+01 -7.5003138682740200e+01
+   43  2.2327470123469584e+02  9.5798787537490597e+01  1.2250410628715098e+02
+   44  8.7959342085865856e+01 -9.8740455124803333e+01 -8.4938709742755620e+01
+   45  1.4089093363544627e+01  1.2499300233485771e+02  5.5864237375370912e+01
+   46  1.3547776948110462e+01 -2.9276229642219235e+01  2.2187402435966465e+01
+   47  3.3448457824361121e+01 -1.9209977417392133e+02 -6.9989895706263383e+01
+   48  6.7827627502623770e+01 -2.0361789453088591e+02 -2.8571736118815522e+01
+   49 -3.7476005148434723e+02 -2.4452451195186867e+01  1.0764661193358305e+02
+   50  4.0090993029104212e+01 -7.3201402054245477e+01  8.9025922810973825e+01
+   51  1.3736420686697036e+02 -1.0204157331499393e+02  1.5813725581140881e+02
+   52 -1.1253479916199494e+02  1.2293268076536030e+02 -1.2940078007359944e+02
+   53 -5.3560738472921315e+01  3.3353082884518039e+02 -1.1314448604068374e+00
+   54 -1.0678339177259399e+01  6.2810937621378287e+01  1.8344988318246166e+02
+   55  1.1231900459987541e+02 -1.7906654831317354e+02  7.6533681064342233e+01
+   56 -4.7772143767870254e+01 -1.3536779754026884e+02  3.4054518546944315e+01
+   57  9.6541690594805473e+01  7.5093838528685893e+01 -6.0858704719313309e+01
+   58 -2.0459002696752282e+01 -1.1535051272094138e+01 -1.4282722385693017e+01
+   59 -6.9459404830700208e+01  1.0185761321965293e+02  8.3383492919158030e+01
+   60 -1.6658947285274955e+01  6.4062738321772684e+01 -1.5162708730048084e+02
+   61 -3.5221540644535935e+01 -1.0209415023871219e+02 -7.4154806308030118e+01
+   62  1.5375061601631625e+01 -6.3257038363617211e+00  2.7511178147388687e+01
+   63  1.3464841040549354e+02 -1.2416888785900652e+02 -5.8961420295343736e+01
+   64  1.0701063550375243e+02  1.1895268715876527e+02  7.4448770962531555e+01
 run_vdwl: -3248.732462206598
-run_coul: -327.0653994771387
+run_coul: -327.06539947713827
 run_stress: ! |-
-  -9.1826184153105646e+02 -1.1070021528099112e+03 -7.1550580149015627e+02 -2.3049698812231000e+02  1.9635464153062134e+02 -6.6005793264639556e+02
+  -9.1826184153105157e+02 -1.1070021528098894e+03 -7.1550580149014127e+02 -2.3049698812230326e+02  1.9635464153061940e+02 -6.6005793264640170e+02
 run_forces: ! |2
-    1 -8.8485813027206135e+01 -2.5824096764125731e+01  1.0916519811125200e+02
-    2 -1.0451269244764350e+02 -1.8137828885716391e+02 -2.1792302517211851e+02
-    3 -1.7141411648636486e+02  1.8106803267132440e+02  1.2674658958989427e+01
-    4  3.2220655253010918e+01 -5.1413086231064995e+01  9.0010227071396415e+01
-    5  1.8145005123751957e+02  1.6799086578426838e+01 -8.1723924656170610e+01
-    6  1.3640868425590003e+02 -3.0059549892327158e+02  2.9595528779455435e+01
-    7 -5.2968868171259714e+01 -1.2850640761855155e+02 -1.6373951876943804e+02
-    8 -1.5240417232930932e+02  4.1133578832982636e+01  1.5386572595284764e+02
-    9  3.2811395144161132e+01  1.0176141517530590e+02  1.4295529169373282e+01
-   10  7.9508569375402331e+01  1.3053469081285709e+02  1.1246210158699030e+02
-   11 -4.3142968406859097e+01  6.5760241919953813e+01  1.3481728343070949e+02
-   12 -9.6708250458847061e+01 -2.5879521605003742e+01  7.8278088000700370e+00
-   13 -6.3852523341823229e+01 -4.6607003335506541e+01 -3.6455965991574878e+01
-   14  7.8283534745824241e+01 -6.3643851884097224e+01 -8.9027881489336167e+01
-   15 -6.4209962316685690e+01  2.1093255387179667e+02  7.9059692211125295e+01
-   16  1.8608085162130908e+02  5.8088780803195142e+01  5.8532604899053133e+01
-   17  1.4285609630789864e+02 -3.9754014601715795e+01 -9.7689588113924316e+01
-   18 -4.1881237955183380e+01 -1.8477109777149900e+02  1.0708061287038571e+02
-   19  2.6677609377410010e+02  3.7179392086487712e+02 -3.3866472006706340e+02
-   20 -7.3532190353883053e+01 -8.3895301502997967e+01 -2.5591151698956521e-01
-   21 -7.2528695460850088e+01 -5.5899068566579977e+01 -1.1975970158720035e+02
-   22  1.5614083463623413e+02 -1.3200472837628527e+02  8.2112156159808862e+01
-   23  8.1835290134891864e+01 -1.7522433028942352e+01 -2.5648597332802964e+01
-   24 -2.1834038832017541e+02  1.9455197293610073e+02 -1.0818261235148486e+02
-   25 -1.1414871301032666e+02  1.9089327234338913e+02 -8.3363315092572321e+01
-   26  2.8282661127556162e+02 -2.1478990451658228e+02  2.2874215408671137e+02
-   27 -5.9765619577841541e+01  6.5223096224356439e+01  1.7553677772771840e+02
-   28 -2.9624987519851178e+00  3.8179667154298812e+01  3.2185280629057068e+01
-   29 -7.1069494187081830e+01  3.5486459200488405e+01  2.7311657807311473e+01
-   30 -1.7037047317028475e+02 -1.9851861739498079e+02 -1.1511395377375433e+02
-   31 -1.3744346258178373e+02  1.6223725554250467e+02 -1.1915482471876425e+02
-   32  2.7248541074999881e+01 -6.0231207974705420e+01 -1.7663875080811843e+02
-   33 -6.1822398570959159e+01 -6.2648503570177034e+01  6.4194898940197774e+01
-   34 -1.7143769208529751e+01  9.9611942509072080e+01 -6.7436075885014986e+01
-   35  2.7028238194296250e+02 -2.1538301386687783e+02  1.3022488558865331e+02
-   36  1.0192362247594350e+02  1.8671008619975410e+02 -1.9863711527085917e+02
-   37 -1.7946751638141498e+02  1.2998098195714172e+02 -6.4345576150932828e+01
-   38 -2.9675376021752186e+02  1.0371435865032235e+02  1.5526896750689886e+02
-   39  8.6950332148131110e+01 -5.9975388525042071e+01  2.1779869753193026e+01
-   40  2.1613442490343314e+01 -1.0242529062335393e+02  5.7271060256879871e+01
-   41 -5.7834219239599364e+01  1.2266148111030034e+01 -6.6169611760840596e+01
-   42 -9.4774021509187506e+01  3.6869981851995398e+01 -7.5005285702022690e+01
-   43  2.2327078175416062e+02  9.5796580610065675e+01  1.2250057895428364e+02
-   44  8.7963372590925985e+01 -9.8736166841311601e+01 -8.4943701327958038e+01
-   45  1.4080569929277486e+01  1.2498603359504315e+02  5.5870075675508232e+01
-   46  1.3549084713162147e+01 -2.9276453411015140e+01  2.2187141786216618e+01
-   47  3.3448153520154271e+01 -1.9209514330879989e+02 -6.9988284949882569e+01
-   48  6.7840148074199092e+01 -2.0361975956922109e+02 -2.8580806381848255e+01
-   49 -3.7480020999441365e+02 -2.4397739069897636e+01  1.0773474200196219e+02
-   50  4.0091767398974682e+01 -7.3200211843412504e+01  8.9024460533547696e+01
-   51  1.3736689552057061e+02 -1.0204490779999098e+02  1.5814099219631356e+02
-   52 -1.1253380764229996e+02  1.2293290174735381e+02 -1.2940467151627450e+02
-   53 -5.3596650492501162e+01  3.3350644289105031e+02 -1.1510223807932007e+00
-   54 -1.0666202581574661e+01  6.2798090272532008e+01  1.8346799239172421e+02
-   55  1.1232135575968968e+02 -1.7906994470748415e+02  7.6534265236354301e+01
-   56 -4.7780797026174810e+01 -1.3535955159718563e+02  3.4061208199866719e+01
-   57  9.6541265005138698e+01  7.5091144884198556e+01 -6.0860069746425658e+01
-   58 -2.0459328007572669e+01 -1.1533053731831259e+01 -1.4282938438265617e+01
-   59 -6.9467796604507981e+01  1.0186323697055799e+02  8.3388794196804326e+01
-   60 -1.6660217426514606e+01  6.4061566362647113e+01 -1.5162714312949211e+02
-   61 -3.5220536021452787e+01 -1.0209241739133054e+02 -7.4154706185261915e+01
-   62  1.5375483178245885e+01 -6.3263099051314251e+00  2.7512110875657893e+01
-   63  1.3464595988109866e+02 -1.2416936634154256e+02 -5.8957063242418101e+01
-   64  1.0701154605982798e+02  1.1895382951205715e+02  7.4449321163285845e+01
+    1 -8.8485813027205879e+01 -2.5824096764125525e+01  1.0916519811125180e+02
+    2 -1.0451269244764356e+02 -1.8137828885716345e+02 -2.1792302517211803e+02
+    3 -1.7141411648636472e+02  1.8106803267132443e+02  1.2674658958989310e+01
+    4  3.2220655253012147e+01 -5.1413086231066018e+01  9.0010227071395775e+01
+    5  1.8145005123751906e+02  1.6799086578425971e+01 -8.1723924656170112e+01
+    6  1.3640868425590043e+02 -3.0059549892327095e+02  2.9595528779455464e+01
+    7 -5.2968868171259274e+01 -1.2850640761855169e+02 -1.6373951876943821e+02
+    8 -1.5240417232930909e+02  4.1133578832982849e+01  1.5386572595284787e+02
+    9  3.2811395144161125e+01  1.0176141517530712e+02  1.4295529169372347e+01
+   10  7.9508569375402061e+01  1.3053469081285704e+02  1.1246210158699010e+02
+   11 -4.3142968406858984e+01  6.5760241919953870e+01  1.3481728343070949e+02
+   12 -9.6708250458846805e+01 -2.5879521605003482e+01  7.8278088000700956e+00
+   13 -6.3852523341823662e+01 -4.6607003335506974e+01 -3.6455965991574999e+01
+   14  7.8283534745824994e+01 -6.3643851884097195e+01 -8.9027881489334987e+01
+   15 -6.4209962316685761e+01  2.1093255387179562e+02  7.9059692211125224e+01
+   16  1.8608085162130848e+02  5.8088780803195213e+01  5.8532604899052622e+01
+   17  1.4285609630789867e+02 -3.9754014601715731e+01 -9.7689588113924316e+01
+   18 -4.1881237955183408e+01 -1.8477109777149803e+02  1.0708061287038574e+02
+   19  2.6677609377410056e+02  3.7179392086487513e+02 -3.3866472006706277e+02
+   20 -7.3532190353882811e+01 -8.3895301502997327e+01 -2.5591151699003645e-01
+   21 -7.2528695460850884e+01 -5.5899068566580368e+01 -1.1975970158719973e+02
+   22  1.5614083463623408e+02 -1.3200472837628507e+02  8.2112156159808734e+01
+   23  8.1835290134892873e+01 -1.7522433028940874e+01 -2.5648597332803881e+01
+   24 -2.1834038832017586e+02  1.9455197293610044e+02 -1.0818261235148471e+02
+   25 -1.1414871301032660e+02  1.9089327234338924e+02 -8.3363315092572293e+01
+   26  2.8282661127556150e+02 -2.1478990451658234e+02  2.2874215408671139e+02
+   27 -5.9765619577841832e+01  6.5223096224356397e+01  1.7553677772771701e+02
+   28 -2.9624987519851897e+00  3.8179667154298997e+01  3.2185280629057125e+01
+   29 -7.1069494187081887e+01  3.5486459200488106e+01  2.7311657807311299e+01
+   30 -1.7037047317028481e+02 -1.9851861739498051e+02 -1.1511395377375443e+02
+   31 -1.3744346258178393e+02  1.6223725554250453e+02 -1.1915482471876388e+02
+   32  2.7248541075000094e+01 -6.0231207974705242e+01 -1.7663875080811815e+02
+   33 -6.1822398570958846e+01 -6.2648503570176707e+01  6.4194898940197433e+01
+   34 -1.7143769208529715e+01  9.9611942509071866e+01 -6.7436075885014773e+01
+   35  2.7028238194295989e+02 -2.1538301386687783e+02  1.3022488558865422e+02
+   36  1.0192362247594411e+02  1.8671008619975396e+02 -1.9863711527085906e+02
+   37 -1.7946751638141629e+02  1.2998098195714053e+02 -6.4345576150932018e+01
+   38 -2.9675376021752220e+02  1.0371435865032272e+02  1.5526896750689843e+02
+   39  8.6950332148131821e+01 -5.9975388525041552e+01  2.1779869753193609e+01
+   40  2.1613442490343157e+01 -1.0242529062335275e+02  5.7271060256879721e+01
+   41 -5.7834219239598042e+01  1.2266148111030933e+01 -6.6169611760841988e+01
+   42 -9.4774021509188572e+01  3.6869981851995284e+01 -7.5005285702020970e+01
+   43  2.2327078175416045e+02  9.5796580610065718e+01  1.2250057895428380e+02
+   44  8.7963372590925957e+01 -9.8736166841310350e+01 -8.4943701327958024e+01
+   45  1.4080569929277932e+01  1.2498603359504180e+02  5.5870075675506833e+01
+   46  1.3549084713162397e+01 -2.9276453411014931e+01  2.2187141786217122e+01
+   47  3.3448153520154300e+01 -1.9209514330879966e+02 -6.9988284949882612e+01
+   48  6.7840148074197515e+01 -2.0361975956922043e+02 -2.8580806381848195e+01
+   49 -3.7480020999441189e+02 -2.4397739069897924e+01  1.0773474200196188e+02
+   50  4.0091767398973481e+01 -7.3200211843412120e+01  8.9024460533546659e+01
+   51  1.3736689552057086e+02 -1.0204490779999115e+02  1.5814099219631345e+02
+   52 -1.1253380764230057e+02  1.2293290174735424e+02 -1.2940467151627436e+02
+   53 -5.3596650492501226e+01  3.3350644289105054e+02 -1.1510223807931013e+00
+   54 -1.0666202581574392e+01  6.2798090272532065e+01  1.8346799239172432e+02
+   55  1.1232135575968978e+02 -1.7906994470748421e+02  7.6534265236354258e+01
+   56 -4.7780797026174341e+01 -1.3535955159718625e+02  3.4061208199866691e+01
+   57  9.6541265005137859e+01  7.5091144884198968e+01 -6.0860069746424841e+01
+   58 -2.0459328007572417e+01 -1.1533053731831775e+01 -1.4282938438265299e+01
+   59 -6.9467796604507171e+01  1.0186323697055771e+02  8.3388794196803403e+01
+   60 -1.6660217426513878e+01  6.4061566362646886e+01 -1.5162714312949183e+02
+   61 -3.5220536021453441e+01 -1.0209241739133059e+02 -7.4154706185261531e+01
+   62  1.5375483178245876e+01 -6.3263099051316445e+00  2.7512110875657353e+01
+   63  1.3464595988109846e+02 -1.2416936634154274e+02 -5.8957063242417227e+01
+   64  1.0701154605982788e+02  1.1895382951205521e+02  7.4449321163286456e+01
 ...

From 8f71979ba16db69de719a4620bf2874d2304ec86 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 20:46:09 -0400
Subject: [PATCH 070/437] update formatting in src folder with clang-format

---
 src/arg_info.cpp            |  4 +-
 src/atom.h                  |  2 +-
 src/atom_vec.h              |  2 +-
 src/compute_property_atom.h |  2 +-
 src/dump_custom.h           | 92 ++++++++++++++++++-------------------
 src/fix_property_atom.h     | 14 +++---
 src/library.h               |  3 +-
 src/main.cpp                |  2 +-
 8 files changed, 61 insertions(+), 60 deletions(-)

diff --git a/src/arg_info.cpp b/src/arg_info.cpp
index 5063b6b471..4bdbfc8c92 100644
--- a/src/arg_info.cpp
+++ b/src/arg_info.cpp
@@ -30,8 +30,8 @@ using namespace LAMMPS_NS;
 
 ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), index1(-1), index2(-1)
 {
-  if (((arg.size() > 3) && (arg[1] == '2') && (arg[2] == '_'))
-      || ((arg.size() > 2) && (arg[1] == '_'))) {
+  if (((arg.size() > 3) && (arg[1] == '2') && (arg[2] == '_')) ||
+      ((arg.size() > 2) && (arg[1] == '_'))) {
     if ((arg[0] == 'c') && (allowed & COMPUTE))
       type = COMPUTE;
     else if ((arg[0] == 'f') && (allowed & FIX))
diff --git a/src/atom.h b/src/atom.h
index a16f1e2752..e196d2d135 100644
--- a/src/atom.h
+++ b/src/atom.h
@@ -163,7 +163,7 @@ class Atom : protected Pointers {
 
   // DIELECTRIC package
 
-  double *area,*ed,*em,*epsilon,*curvature,*q_unscaled;
+  double *area, *ed, *em, *epsilon, *curvature, *q_unscaled;
 
   // end of customization section
   // --------------------------------------------------------------------
diff --git a/src/atom_vec.h b/src/atom_vec.h
index ad3b4c6626..0a86d1122c 100644
--- a/src/atom_vec.h
+++ b/src/atom_vec.h
@@ -129,7 +129,7 @@ class AtomVec : protected Pointers {
   virtual void data_atom_bonus(int, char **) {}
   virtual void data_body(int, int, int, int *, double *) {}
 
-  virtual void data_bonds_post(int, int , tagint, tagint, tagint) {}
+  virtual void data_bonds_post(int, int, tagint, tagint, tagint) {}
 
   virtual void pack_data(double **);
   virtual void write_data(FILE *, int, double **);
diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h
index d8b1cae449..5a7fe787bd 100644
--- a/src/compute_property_atom.h
+++ b/src/compute_property_atom.h
@@ -35,7 +35,7 @@ class ComputePropertyAtom : public Compute {
  private:
   int nvalues;
   int nmax;
-  int *index,*colindex;
+  int *index, *colindex;
   double *buf;
   class AtomVecEllipsoid *avec_ellipsoid;
   class AtomVecLine *avec_line;
diff --git a/src/dump_custom.h b/src/dump_custom.h
index 4077a9374b..4209d8e46f 100644
--- a/src/dump_custom.h
+++ b/src/dump_custom.h
@@ -38,62 +38,62 @@ class DumpCustom : public Dump {
   int iregion;       // -1 if no region, else which region
   char *idregion;    // region ID
 
-  int nthresh;        // # of defined thresholds
-  int nthreshlast;    // # of defined thresholds with value = LAST
-
-  int *thresh_array;       // array to threshold on for each nthresh
-  int *thresh_op;          // threshold operation for each nthresh
-  double *thresh_value;    // threshold value for each nthresh
-  int *thresh_last;        // for threshold value = LAST,
-                           // index into thresh_fix
-                           // -1 if not LAST, value is numeric
-
+  int nthresh;                    // # of defined thresholds
+  int nthreshlast;                // # of defined thresholds with value = LAST
+                                  //
+  int *thresh_array;              // array to threshold on for each nthresh
+  int *thresh_op;                 // threshold operation for each nthresh
+  double *thresh_value;           // threshold value for each nthresh
+  int *thresh_last;               // for threshold value = LAST,
+                                  // index into thresh_fix
+                                  // -1 if not LAST, value is numeric
+                                  //
   class FixStore **thresh_fix;    // stores values for each threshold LAST
   char **thresh_fixID;            // IDs of thresh_fixes
   int *thresh_first;              // 1 the first time a FixStore values accessed
 
-  int expand;     // flag for whether field args were expanded
-  char **earg;    // field names with wildcard expansion
-  int nargnew;    // size of earg
-
-  int *vtype;        // type of each vector (INT, DOUBLE)
-  char **vformat;    // format string for each vector element
-
-  char *columns;    // column labels
-
+  int expand;         // flag for whether field args were expanded
+  char **earg;        // field names with wildcard expansion
+  int nargnew;        // size of earg
+                      //
+  int *vtype;         // type of each vector (INT, DOUBLE)
+  char **vformat;     // format string for each vector element
+                      //
+  char *columns;      // column labels
+                      //
   int nchoose;        // # of selected atoms
   int maxlocal;       // size of atom selection and variable arrays
   int *choose;        // local indices of selected atoms
   double *dchoose;    // value for each atom to threshold against
   int *clist;         // compressed list of indices of selected atoms
 
-  int nfield;       // # of keywords listed by user
-  int ioptional;    // index of start of optional args
-
-  int *field2index;     // which compute,fix,variable,custom calcs this field
-  int *argindex;        // index into compute,fix,custom per-atom data
-                        // 0 for per-atom vector, 1-N for cols of per-atom array
-
-  int ncompute;              // # of Computes accessed by dump
-  char **id_compute;         // their IDs
-  class Compute **compute;   // list of ptrs to the Computes
-
-  int nfix;                  // # of Fixes used by dump
-  char **id_fix;             // their IDs
-  class Fix **fix;           // list of ptrs to the Fixes
-
-  int nvariable;             // # of Variables used by dump
-  char **id_variable;        // their names
-  int *variable;             // list of Variable indices in Variable class
-  double **vbuf;             // local storage for variable evaluation
-
-  int ncustom;               // # of Custom atom properties used by dump
-  char **id_custom;          // their names
-  int *custom;               // list of Custom indices in Atom class
-  int *custom_flag;          // list of IVEC,DVEC,IARRAY,DARRAY styles
-
-  int ntypes;                // # of atom types
-  char **typenames;          // array of element names for each type
+  int nfield;                 // # of keywords listed by user
+  int ioptional;              // index of start of optional args
+                              //
+  int *field2index;           // which compute,fix,variable,custom calcs this field
+  int *argindex;              // index into compute,fix,custom per-atom data
+                              // 0 for per-atom vector, 1-N for cols of per-atom array
+                              //
+  int ncompute;               // # of Computes accessed by dump
+  char **id_compute;          // their IDs
+  class Compute **compute;    // list of ptrs to the Computes
+                              //
+  int nfix;                   // # of Fixes used by dump
+  char **id_fix;              // their IDs
+  class Fix **fix;            // list of ptrs to the Fixes
+                              //
+  int nvariable;              // # of Variables used by dump
+  char **id_variable;         // their names
+  int *variable;              // list of Variable indices in Variable class
+  double **vbuf;              // local storage for variable evaluation
+                              //
+  int ncustom;                // # of Custom atom properties used by dump
+  char **id_custom;           // their names
+  int *custom;                // list of Custom indices in Atom class
+  int *custom_flag;           // list of IVEC,DVEC,IARRAY,DARRAY styles
+                              //
+  int ntypes;                 // # of atom types
+  char **typenames;           // array of element names for each type
 
   // private methods
 
diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h
index d7f2b56751..08cee7d94c 100644
--- a/src/fix_property_atom.h
+++ b/src/fix_property_atom.h
@@ -52,14 +52,14 @@ class FixPropertyAtom : public Fix {
 
  protected:
   int nvalue, border;
-  int molecule_flag, q_flag, rmass_flag;  // flags for specific fields
-  int *style;                             // style of each value, see enum
-  int *index;                             // indices into atom custom data structs
-  int *cols;                              // columns per value, for arrays
-  char *astyle;                           // atom style at instantiation
+  int molecule_flag, q_flag, rmass_flag;    // flags for specific fields
+  int *style;                               // style of each value, see enum
+  int *index;                               // indices into atom custom data structs
+  int *cols;                                // columns per value, for arrays
+  char *astyle;                             // atom style at instantiation
 
-  int values_peratom;   // # of values per atom, including multiple for arrays
-  int nmax_old;         // length of peratom arrays the last time they grew
+  int values_peratom;    // # of values per atom, including multiple for arrays
+  int nmax_old;          // length of peratom arrays the last time they grew
 };
 
 }    // namespace LAMMPS_NS
diff --git a/src/library.h b/src/library.h
index 91146e8526..17943e3808 100644
--- a/src/library.h
+++ b/src/library.h
@@ -228,7 +228,8 @@ void lammps_decode_image_flags(int64_t image, int *flags);
 
 #if defined(LAMMPS_BIGBIG)
 typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **);
-void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr);
+void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr,
+                                      void *ptr);
 #elif defined(LAMMPS_SMALLBIG)
 typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **);
 void lammps_set_fix_external_callback(void *, const char *, FixExternalFnPtr, void *);
diff --git a/src/main.cpp b/src/main.cpp
index d65247c224..608ef4ae5b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,8 +13,8 @@
 
 #include "lammps.h"
 
-#include "input.h"
 #include "accelerator_kokkos.h"
+#include "input.h"
 #if defined(LAMMPS_EXCEPTIONS)
 #include "exceptions.h"
 #endif

From 686f41731f2d98b87666cb95472c7d4401056846 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 20:55:41 -0400
Subject: [PATCH 071/437] disable applying clang-format to all "style" classes
 in the KOKKOS package (for now)

---
 src/KOKKOS/angle_charmm_kokkos.h                        | 1 +
 src/KOKKOS/angle_class2_kokkos.h                        | 1 +
 src/KOKKOS/angle_cosine_kokkos.h                        | 1 +
 src/KOKKOS/angle_harmonic_kokkos.h                      | 1 +
 src/KOKKOS/atom_vec_angle_kokkos.h                      | 1 +
 src/KOKKOS/atom_vec_atomic_kokkos.h                     | 1 +
 src/KOKKOS/atom_vec_bond_kokkos.h                       | 1 +
 src/KOKKOS/atom_vec_charge_kokkos.h                     | 1 +
 src/KOKKOS/atom_vec_dpd_kokkos.h                        | 1 +
 src/KOKKOS/atom_vec_full_kokkos.h                       | 1 +
 src/KOKKOS/atom_vec_hybrid_kokkos.h                     | 1 +
 src/KOKKOS/atom_vec_molecular_kokkos.h                  | 1 +
 src/KOKKOS/atom_vec_sphere_kokkos.h                     | 1 +
 src/KOKKOS/atom_vec_spin_kokkos.h                       | 1 +
 src/KOKKOS/bond_class2_kokkos.h                         | 1 +
 src/KOKKOS/bond_fene_kokkos.h                           | 1 +
 src/KOKKOS/bond_harmonic_kokkos.h                       | 1 +
 src/KOKKOS/compute_coord_atom_kokkos.h                  | 1 +
 src/KOKKOS/compute_orientorder_atom_kokkos.h            | 1 +
 src/KOKKOS/compute_temp_kokkos.h                        | 1 +
 src/KOKKOS/dihedral_charmm_kokkos.h                     | 1 +
 src/KOKKOS/dihedral_class2_kokkos.h                     | 1 +
 src/KOKKOS/dihedral_harmonic_kokkos.h                   | 1 +
 src/KOKKOS/dihedral_opls_kokkos.h                       | 1 +
 src/KOKKOS/fix_deform_kokkos.h                          | 1 +
 src/KOKKOS/fix_dpd_energy_kokkos.h                      | 1 +
 src/KOKKOS/fix_enforce2d_kokkos.h                       | 1 +
 src/KOKKOS/fix_eos_table_rx_kokkos.h                    | 1 +
 src/KOKKOS/fix_freeze_kokkos.h                          | 1 +
 src/KOKKOS/fix_gravity_kokkos.h                         | 1 +
 src/KOKKOS/fix_langevin_kokkos.h                        | 1 +
 src/KOKKOS/fix_minimize_kokkos.h                        | 1 +
 src/KOKKOS/fix_momentum_kokkos.h                        | 1 +
 src/KOKKOS/fix_neigh_history_kokkos.h                   | 1 +
 src/KOKKOS/fix_nph_kokkos.h                             | 1 +
 src/KOKKOS/fix_npt_kokkos.h                             | 1 +
 src/KOKKOS/fix_nve_kokkos.h                             | 1 +
 src/KOKKOS/fix_nve_sphere_kokkos.h                      | 1 +
 src/KOKKOS/fix_nvt_kokkos.h                             | 1 +
 src/KOKKOS/fix_property_atom_kokkos.h                   | 1 +
 src/KOKKOS/fix_qeq_reaxff_kokkos.h                      | 1 +
 src/KOKKOS/fix_reaxff_bonds_kokkos.h                    | 1 +
 src/KOKKOS/fix_reaxff_species_kokkos.h                  | 1 +
 src/KOKKOS/fix_rx_kokkos.h                              | 1 +
 src/KOKKOS/fix_setforce_kokkos.h                        | 1 +
 src/KOKKOS/fix_shake_kokkos.h                           | 1 +
 src/KOKKOS/fix_shardlow_kokkos.h                        | 1 +
 src/KOKKOS/fix_wall_lj93_kokkos.h                       | 1 +
 src/KOKKOS/fix_wall_reflect_kokkos.h                    | 1 +
 src/KOKKOS/improper_class2_kokkos.h                     | 1 +
 src/KOKKOS/improper_harmonic_kokkos.h                   | 1 +
 src/KOKKOS/min_cg_kokkos.h                              | 1 +
 src/KOKKOS/nbin_kokkos.h                                | 1 +
 src/KOKKOS/nbin_ssa_kokkos.h                            | 1 +
 src/KOKKOS/npair_copy_kokkos.h                          | 1 +
 src/KOKKOS/npair_halffull_kokkos.h                      | 1 +
 src/KOKKOS/npair_kokkos.h                               | 1 +
 src/KOKKOS/npair_skip_kokkos.h                          | 1 +
 src/KOKKOS/npair_ssa_kokkos.h                           | 1 +
 src/KOKKOS/pair_buck_coul_cut_kokkos.h                  | 1 +
 src/KOKKOS/pair_buck_coul_long_kokkos.h                 | 1 +
 src/KOKKOS/pair_buck_kokkos.h                           | 1 +
 src/KOKKOS/pair_coul_cut_kokkos.h                       | 1 +
 src/KOKKOS/pair_coul_debye_kokkos.h                     | 1 +
 src/KOKKOS/pair_coul_dsf_kokkos.h                       | 1 +
 src/KOKKOS/pair_coul_long_kokkos.h                      | 1 +
 src/KOKKOS/pair_coul_wolf_kokkos.h                      | 1 +
 src/KOKKOS/pair_dpd_fdt_energy_kokkos.h                 | 1 +
 src/KOKKOS/pair_eam_alloy_kokkos.h                      | 1 +
 src/KOKKOS/pair_eam_fs_kokkos.h                         | 1 +
 src/KOKKOS/pair_eam_kokkos.h                            | 1 +
 src/KOKKOS/pair_exp6_rx_kokkos.h                        | 1 +
 src/KOKKOS/pair_gran_hooke_history_kokkos.h             | 1 +
 src/KOKKOS/pair_hybrid_kokkos.h                         | 1 +
 src/KOKKOS/pair_hybrid_overlay_kokkos.h                 | 1 +
 src/KOKKOS/pair_kokkos.h                                | 1 +
 src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h | 1 +
 src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h          | 1 +
 src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h            | 1 +
 src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h             | 1 +
 src/KOKKOS/pair_lj_class2_coul_long_kokkos.h            | 1 +
 src/KOKKOS/pair_lj_class2_kokkos.h                      | 1 +
 src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h                | 1 +
 src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h              | 1 +
 src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h                | 1 +
 src/KOKKOS/pair_lj_cut_coul_long_kokkos.h               | 1 +
 src/KOKKOS/pair_lj_cut_kokkos.h                         | 1 +
 src/KOKKOS/pair_lj_expand_kokkos.h                      | 1 +
 src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h        | 1 +
 src/KOKKOS/pair_lj_gromacs_kokkos.h                     | 1 +
 src/KOKKOS/pair_lj_sdk_kokkos.h                         | 1 +
 src/KOKKOS/pair_morse_kokkos.h                          | 1 +
 src/KOKKOS/pair_multi_lucy_rx_kokkos.h                  | 1 +
 src/KOKKOS/pair_reaxff_kokkos.h                         | 1 +
 src/KOKKOS/pair_snap_kokkos.h                           | 1 +
 src/KOKKOS/pair_sw_kokkos.h                             | 1 +
 src/KOKKOS/pair_table_kokkos.h                          | 1 +
 src/KOKKOS/pair_table_rx_kokkos.h                       | 1 +
 src/KOKKOS/pair_tersoff_kokkos.h                        | 1 +
 src/KOKKOS/pair_tersoff_mod_kokkos.h                    | 1 +
 src/KOKKOS/pair_tersoff_zbl_kokkos.h                    | 1 +
 src/KOKKOS/pair_vashishta_kokkos.h                      | 1 +
 src/KOKKOS/pair_yukawa_kokkos.h                         | 1 +
 src/KOKKOS/pair_zbl_kokkos.h                            | 1 +
 src/KOKKOS/pppm_kokkos.h                                | 1 +
 src/KOKKOS/region_block_kokkos.h                        | 1 +
 src/KOKKOS/verlet_kokkos.h                              | 1 +
 107 files changed, 107 insertions(+)

diff --git a/src/KOKKOS/angle_charmm_kokkos.h b/src/KOKKOS/angle_charmm_kokkos.h
index 0a606401a8..0103c4fc0b 100644
--- a/src/KOKKOS/angle_charmm_kokkos.h
+++ b/src/KOKKOS/angle_charmm_kokkos.h
@@ -20,6 +20,7 @@ AngleStyle(charmm/kk/host,AngleCharmmKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ANGLE_CHARMM_KOKKOS_H
 #define LMP_ANGLE_CHARMM_KOKKOS_H
 
diff --git a/src/KOKKOS/angle_class2_kokkos.h b/src/KOKKOS/angle_class2_kokkos.h
index 1a7650fddf..b047b3d578 100644
--- a/src/KOKKOS/angle_class2_kokkos.h
+++ b/src/KOKKOS/angle_class2_kokkos.h
@@ -20,6 +20,7 @@ AngleStyle(class2/kk/host,AngleClass2Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ANGLE_CLASS2_KOKKOS_H
 #define LMP_ANGLE_CLASS2_KOKKOS_H
 
diff --git a/src/KOKKOS/angle_cosine_kokkos.h b/src/KOKKOS/angle_cosine_kokkos.h
index 6510cc8ecd..173e380fae 100644
--- a/src/KOKKOS/angle_cosine_kokkos.h
+++ b/src/KOKKOS/angle_cosine_kokkos.h
@@ -20,6 +20,7 @@ AngleStyle(cosine/kk/host,AngleCosineKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ANGLE_COSINE_KOKKOS_H
 #define LMP_ANGLE_COSINE_KOKKOS_H
 
diff --git a/src/KOKKOS/angle_harmonic_kokkos.h b/src/KOKKOS/angle_harmonic_kokkos.h
index df8b75c8bf..6bbd744022 100644
--- a/src/KOKKOS/angle_harmonic_kokkos.h
+++ b/src/KOKKOS/angle_harmonic_kokkos.h
@@ -20,6 +20,7 @@ AngleStyle(harmonic/kk/host,AngleHarmonicKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ANGLE_HARMONIC_KOKKOS_H
 #define LMP_ANGLE_HARMONIC_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_angle_kokkos.h b/src/KOKKOS/atom_vec_angle_kokkos.h
index e80c0caca8..d567c8f727 100644
--- a/src/KOKKOS/atom_vec_angle_kokkos.h
+++ b/src/KOKKOS/atom_vec_angle_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(angle/kk/host,AtomVecAngleKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_ANGLE_KOKKOS_H
 #define LMP_ATOM_VEC_ANGLE_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.h b/src/KOKKOS/atom_vec_atomic_kokkos.h
index 77d7719baa..ae2898def1 100644
--- a/src/KOKKOS/atom_vec_atomic_kokkos.h
+++ b/src/KOKKOS/atom_vec_atomic_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(atomic/kk/host,AtomVecAtomicKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_ATOMIC_KOKKOS_H
 #define LMP_ATOM_VEC_ATOMIC_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_bond_kokkos.h b/src/KOKKOS/atom_vec_bond_kokkos.h
index 8038775d02..84b4998222 100644
--- a/src/KOKKOS/atom_vec_bond_kokkos.h
+++ b/src/KOKKOS/atom_vec_bond_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(bond/kk/host,AtomVecBondKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_BOND_KOKKOS_H
 #define LMP_ATOM_VEC_BOND_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_charge_kokkos.h b/src/KOKKOS/atom_vec_charge_kokkos.h
index db1d5cb85b..39bb64e464 100644
--- a/src/KOKKOS/atom_vec_charge_kokkos.h
+++ b/src/KOKKOS/atom_vec_charge_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(charge/kk/host,AtomVecChargeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_CHARGE_KOKKOS_H
 #define LMP_ATOM_VEC_CHARGE_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.h b/src/KOKKOS/atom_vec_dpd_kokkos.h
index 80a51430fa..3c99b77b91 100644
--- a/src/KOKKOS/atom_vec_dpd_kokkos.h
+++ b/src/KOKKOS/atom_vec_dpd_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(dpd/kk/host,AtomVecDPDKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_DPD_KOKKOS_H
 #define LMP_ATOM_VEC_DPD_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_full_kokkos.h b/src/KOKKOS/atom_vec_full_kokkos.h
index 7246344b9f..317445a57f 100644
--- a/src/KOKKOS/atom_vec_full_kokkos.h
+++ b/src/KOKKOS/atom_vec_full_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(full/kk/host,AtomVecFullKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_FULL_KOKKOS_H
 #define LMP_ATOM_VEC_FULL_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_hybrid_kokkos.h b/src/KOKKOS/atom_vec_hybrid_kokkos.h
index 8b19c9dc76..b18a2f6567 100644
--- a/src/KOKKOS/atom_vec_hybrid_kokkos.h
+++ b/src/KOKKOS/atom_vec_hybrid_kokkos.h
@@ -18,6 +18,7 @@ AtomStyle(hybrid/kk,AtomVecHybridKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_HYBRID_KOKKOS_H
 #define LMP_ATOM_VEC_HYBRID_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.h b/src/KOKKOS/atom_vec_molecular_kokkos.h
index b07fefb7f4..098d724d0e 100644
--- a/src/KOKKOS/atom_vec_molecular_kokkos.h
+++ b/src/KOKKOS/atom_vec_molecular_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(molecular/kk/host,AtomVecMolecularKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_MOLECULAR_KOKKOS_H
 #define LMP_ATOM_VEC_MOLECULAR_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_sphere_kokkos.h b/src/KOKKOS/atom_vec_sphere_kokkos.h
index 6d8f779421..c99c69d7ea 100644
--- a/src/KOKKOS/atom_vec_sphere_kokkos.h
+++ b/src/KOKKOS/atom_vec_sphere_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(sphere/kk/host,AtomVecSphereKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_SPHERE_KOKKOS_H
 #define LMP_ATOM_VEC_SPHERE_KOKKOS_H
 
diff --git a/src/KOKKOS/atom_vec_spin_kokkos.h b/src/KOKKOS/atom_vec_spin_kokkos.h
index 615322329e..b993909439 100644
--- a/src/KOKKOS/atom_vec_spin_kokkos.h
+++ b/src/KOKKOS/atom_vec_spin_kokkos.h
@@ -20,6 +20,7 @@ AtomStyle(spin/kk/host,AtomVecSpinKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_ATOM_VEC_SPIN_KOKKOS_H
 #define LMP_ATOM_VEC_SPIN_KOKKOS_H
 
diff --git a/src/KOKKOS/bond_class2_kokkos.h b/src/KOKKOS/bond_class2_kokkos.h
index d0d8b5cd89..c584695424 100644
--- a/src/KOKKOS/bond_class2_kokkos.h
+++ b/src/KOKKOS/bond_class2_kokkos.h
@@ -20,6 +20,7 @@ BondStyle(class2/kk/host,BondClass2Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_BOND_CLASS2_KOKKOS_H
 #define LMP_BOND_CLASS2_KOKKOS_H
 
diff --git a/src/KOKKOS/bond_fene_kokkos.h b/src/KOKKOS/bond_fene_kokkos.h
index 5f5d0055e4..0b47e27547 100644
--- a/src/KOKKOS/bond_fene_kokkos.h
+++ b/src/KOKKOS/bond_fene_kokkos.h
@@ -20,6 +20,7 @@ BondStyle(fene/kk/host,BondFENEKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_BOND_FENE_KOKKOS_H
 #define LMP_BOND_FENE_KOKKOS_H
 
diff --git a/src/KOKKOS/bond_harmonic_kokkos.h b/src/KOKKOS/bond_harmonic_kokkos.h
index be0da91232..c7b301ce2f 100644
--- a/src/KOKKOS/bond_harmonic_kokkos.h
+++ b/src/KOKKOS/bond_harmonic_kokkos.h
@@ -20,6 +20,7 @@ BondStyle(harmonic/kk/host,BondHarmonicKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_BOND_HARMONIC_KOKKOS_H
 #define LMP_BOND_HARMONIC_KOKKOS_H
 
diff --git a/src/KOKKOS/compute_coord_atom_kokkos.h b/src/KOKKOS/compute_coord_atom_kokkos.h
index 49e56546dc..9f1d7a5921 100644
--- a/src/KOKKOS/compute_coord_atom_kokkos.h
+++ b/src/KOKKOS/compute_coord_atom_kokkos.h
@@ -20,6 +20,7 @@ ComputeStyle(coord/atom/kk/host,ComputeCoordAtomKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_COMPUTE_COORD_ATOM_KOKKOS_H
 #define LMP_COMPUTE_COORD_ATOM_KOKKOS_H
 
diff --git a/src/KOKKOS/compute_orientorder_atom_kokkos.h b/src/KOKKOS/compute_orientorder_atom_kokkos.h
index 7ecb7388d3..bac13645fe 100644
--- a/src/KOKKOS/compute_orientorder_atom_kokkos.h
+++ b/src/KOKKOS/compute_orientorder_atom_kokkos.h
@@ -20,6 +20,7 @@ ComputeStyle(orientorder/atom/kk/host,ComputeOrientOrderAtomKokkos)
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_COMPUTE_ORIENTORDER_ATOM_KOKKOS_H
 #define LMP_COMPUTE_ORIENTORDER_ATOM_KOKKOS_H
 
diff --git a/src/KOKKOS/compute_temp_kokkos.h b/src/KOKKOS/compute_temp_kokkos.h
index 792e2e17db..4320330f16 100644
--- a/src/KOKKOS/compute_temp_kokkos.h
+++ b/src/KOKKOS/compute_temp_kokkos.h
@@ -20,6 +20,7 @@ ComputeStyle(temp/kk/host,ComputeTempKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_COMPUTE_TEMP_KOKKOS_H
 #define LMP_COMPUTE_TEMP_KOKKOS_H
 
diff --git a/src/KOKKOS/dihedral_charmm_kokkos.h b/src/KOKKOS/dihedral_charmm_kokkos.h
index 7821823e64..2ba13753bb 100644
--- a/src/KOKKOS/dihedral_charmm_kokkos.h
+++ b/src/KOKKOS/dihedral_charmm_kokkos.h
@@ -20,6 +20,7 @@ DihedralStyle(charmm/kk/host,DihedralCharmmKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_DIHEDRAL_CHARMM_KOKKOS_H
 #define LMP_DIHEDRAL_CHARMM_KOKKOS_H
 
diff --git a/src/KOKKOS/dihedral_class2_kokkos.h b/src/KOKKOS/dihedral_class2_kokkos.h
index 746b7f8de0..c9d2026246 100644
--- a/src/KOKKOS/dihedral_class2_kokkos.h
+++ b/src/KOKKOS/dihedral_class2_kokkos.h
@@ -20,6 +20,7 @@ DihedralStyle(class2/kk/host,DihedralClass2Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_DIHEDRAL_CLASS2_KOKKOS_H
 #define LMP_DIHEDRAL_CLASS2_KOKKOS_H
 
diff --git a/src/KOKKOS/dihedral_harmonic_kokkos.h b/src/KOKKOS/dihedral_harmonic_kokkos.h
index 3c9beb8852..bebe1b054a 100644
--- a/src/KOKKOS/dihedral_harmonic_kokkos.h
+++ b/src/KOKKOS/dihedral_harmonic_kokkos.h
@@ -20,6 +20,7 @@ DihedralStyle(harmonic/kk/host,DihedralHarmonicKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_DIHEDRAL_HARMONIC_KOKKOS_H
 #define LMP_DIHEDRAL_HARMONIC_KOKKOS_H
 
diff --git a/src/KOKKOS/dihedral_opls_kokkos.h b/src/KOKKOS/dihedral_opls_kokkos.h
index e2a0827dc9..d14d81ff44 100644
--- a/src/KOKKOS/dihedral_opls_kokkos.h
+++ b/src/KOKKOS/dihedral_opls_kokkos.h
@@ -20,6 +20,7 @@ DihedralStyle(opls/kk/host,DihedralOPLSKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_DIHEDRAL_OPLS_KOKKOS_H
 #define LMP_DIHEDRAL_OPLS_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_deform_kokkos.h b/src/KOKKOS/fix_deform_kokkos.h
index 90bdab1439..484a616728 100644
--- a/src/KOKKOS/fix_deform_kokkos.h
+++ b/src/KOKKOS/fix_deform_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(deform/kk/host,FixDeformKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_DEFORM_KOKKOS_H
 #define LMP_FIX_DEFORM_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_dpd_energy_kokkos.h b/src/KOKKOS/fix_dpd_energy_kokkos.h
index 0f88e279dd..592aa4b8f5 100644
--- a/src/KOKKOS/fix_dpd_energy_kokkos.h
+++ b/src/KOKKOS/fix_dpd_energy_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(dpd/energy/kk/host,FixDPDenergyKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_DPDE_KOKKOS_H
 #define LMP_FIX_DPDE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h
index 0dc613d729..79e77acb43 100644
--- a/src/KOKKOS/fix_enforce2d_kokkos.h
+++ b/src/KOKKOS/fix_enforce2d_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(enforce2d/kk/host,FixEnforce2DKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_ENFORCE2D_KOKKOS_H
 #define LMP_FIX_ENFORCE2D_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.h b/src/KOKKOS/fix_eos_table_rx_kokkos.h
index da54f38905..d9adb7cf61 100644
--- a/src/KOKKOS/fix_eos_table_rx_kokkos.h
+++ b/src/KOKKOS/fix_eos_table_rx_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(eos/table/rx/kk/host,FixEOStableRXKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_EOS_TABLE_RX_KOKKOS_H
 #define LMP_FIX_EOS_TABLE_RX_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_freeze_kokkos.h b/src/KOKKOS/fix_freeze_kokkos.h
index c7f1e304d2..1cde7bc7e0 100644
--- a/src/KOKKOS/fix_freeze_kokkos.h
+++ b/src/KOKKOS/fix_freeze_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(freeze/kk/host,FixFreezeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_FREEZE_KOKKOS_H
 #define LMP_FIX_FREEZE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_gravity_kokkos.h b/src/KOKKOS/fix_gravity_kokkos.h
index 87acdb55ff..66198e1a8e 100644
--- a/src/KOKKOS/fix_gravity_kokkos.h
+++ b/src/KOKKOS/fix_gravity_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(gravity/kk/host,FixGravityKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_GRAVITY_KOKKOS_H
 #define LMP_FIX_GRAVITY_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_langevin_kokkos.h b/src/KOKKOS/fix_langevin_kokkos.h
index b1b017a435..d82878df02 100644
--- a/src/KOKKOS/fix_langevin_kokkos.h
+++ b/src/KOKKOS/fix_langevin_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(langevin/kk/host,FixLangevinKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_LANGEVIN_KOKKOS_H
 #define LMP_FIX_LANGEVIN_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_minimize_kokkos.h b/src/KOKKOS/fix_minimize_kokkos.h
index 02509a117b..3b5c8ce96c 100644
--- a/src/KOKKOS/fix_minimize_kokkos.h
+++ b/src/KOKKOS/fix_minimize_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(MINIMIZE/kk/host,FixMinimizeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_MINIMIZE_KOKKOS_H
 #define LMP_FIX_MINIMIZE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_momentum_kokkos.h b/src/KOKKOS/fix_momentum_kokkos.h
index 9acdd95c52..0de8d260cc 100644
--- a/src/KOKKOS/fix_momentum_kokkos.h
+++ b/src/KOKKOS/fix_momentum_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(momentum/kk/host,FixMomentumKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_MOMENTUM_KOKKOS_H
 #define LMP_FIX_MOMENTUM_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_neigh_history_kokkos.h b/src/KOKKOS/fix_neigh_history_kokkos.h
index 67d264cf9a..4fd4d71313 100644
--- a/src/KOKKOS/fix_neigh_history_kokkos.h
+++ b/src/KOKKOS/fix_neigh_history_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(NEIGH_HISTORY/KK/HOST,FixNeighHistoryKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_NEIGH_HISTORY_KOKKOS_H
 #define LMP_FIX_NEIGH_HISTORY_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_nph_kokkos.h b/src/KOKKOS/fix_nph_kokkos.h
index a85394bb5b..c58b2012da 100644
--- a/src/KOKKOS/fix_nph_kokkos.h
+++ b/src/KOKKOS/fix_nph_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(nph/kk/host,FixNPHKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_NPH_KOKKOS_H
 #define LMP_FIX_NPH_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_npt_kokkos.h b/src/KOKKOS/fix_npt_kokkos.h
index 778d2e7f44..e162881939 100644
--- a/src/KOKKOS/fix_npt_kokkos.h
+++ b/src/KOKKOS/fix_npt_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(npt/kk/host,FixNPTKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_NPT_KOKKOS_H
 #define LMP_FIX_NPT_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_nve_kokkos.h b/src/KOKKOS/fix_nve_kokkos.h
index 59d39c73d6..859a3fc14b 100644
--- a/src/KOKKOS/fix_nve_kokkos.h
+++ b/src/KOKKOS/fix_nve_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(nve/kk/host,FixNVEKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_NVE_KOKKOS_H
 #define LMP_FIX_NVE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.h b/src/KOKKOS/fix_nve_sphere_kokkos.h
index a40ec2331f..19ae7862af 100644
--- a/src/KOKKOS/fix_nve_sphere_kokkos.h
+++ b/src/KOKKOS/fix_nve_sphere_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(nve/sphere/kk/host,FixNVESphereKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_NVE_SPHERE_KOKKOS_H
 #define LMP_FIX_NVE_SPHERE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_nvt_kokkos.h b/src/KOKKOS/fix_nvt_kokkos.h
index f1644909e3..32e985537b 100644
--- a/src/KOKKOS/fix_nvt_kokkos.h
+++ b/src/KOKKOS/fix_nvt_kokkos.h
@@ -21,6 +21,7 @@ FixStyle(nvt/kk/host,FixNVTKokkos);
 #else
 
 
+// clang-format off
 #ifndef LMP_FIX_NVT_KOKKOS_H
 #define LMP_FIX_NVT_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h
index c3e6c31dc1..bd5898e7ae 100644
--- a/src/KOKKOS/fix_property_atom_kokkos.h
+++ b/src/KOKKOS/fix_property_atom_kokkos.h
@@ -18,6 +18,7 @@ FixStyle(property/atom/kk,FixPropertyAtomKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_PROPERTY_ATOM_KOKKOS_H
 #define LMP_FIX_PROPERTY_ATOM_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.h b/src/KOKKOS/fix_qeq_reaxff_kokkos.h
index 71c0808b0f..2e84cd348d 100644
--- a/src/KOKKOS/fix_qeq_reaxff_kokkos.h
+++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.h
@@ -23,6 +23,7 @@ FixStyle(qeq/reax/kk/host,FixQEqReaxFFKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_QEQ_REAXFF_KOKKOS_H
 #define LMP_FIX_QEQ_REAXFF_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_reaxff_bonds_kokkos.h b/src/KOKKOS/fix_reaxff_bonds_kokkos.h
index b39dfa3c17..d56f528aaa 100644
--- a/src/KOKKOS/fix_reaxff_bonds_kokkos.h
+++ b/src/KOKKOS/fix_reaxff_bonds_kokkos.h
@@ -23,6 +23,7 @@ FixStyle(reax/c/bonds/kk/host,FixReaxFFBondsKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_REAXFF_BONDS_KOKKOS_H
 #define LMP_FIX_REAXFF_BONDS_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_reaxff_species_kokkos.h b/src/KOKKOS/fix_reaxff_species_kokkos.h
index ad9d02319d..31c11f3a1e 100644
--- a/src/KOKKOS/fix_reaxff_species_kokkos.h
+++ b/src/KOKKOS/fix_reaxff_species_kokkos.h
@@ -23,6 +23,7 @@ FixStyle(reax/c/species/kk/host,FixReaxFFSpeciesKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_REAXFF_SPECIES_KOKKOS_H
 #define LMP_FIX_REAXFF_SPECIES_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_rx_kokkos.h b/src/KOKKOS/fix_rx_kokkos.h
index cb9a0d3d38..3837cf7927 100644
--- a/src/KOKKOS/fix_rx_kokkos.h
+++ b/src/KOKKOS/fix_rx_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(rx/kk/host,FixRxKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_RX_KOKKOS_H
 #define LMP_FIX_RX_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_setforce_kokkos.h b/src/KOKKOS/fix_setforce_kokkos.h
index fc165c4d2f..282588664c 100644
--- a/src/KOKKOS/fix_setforce_kokkos.h
+++ b/src/KOKKOS/fix_setforce_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(setforce/kk/host,FixSetForceKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_SET_FORCE_KOKKOS_H
 #define LMP_FIX_SET_FORCE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_shake_kokkos.h b/src/KOKKOS/fix_shake_kokkos.h
index 12e082a903..67456a81b7 100644
--- a/src/KOKKOS/fix_shake_kokkos.h
+++ b/src/KOKKOS/fix_shake_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(shake/kk/host,FixShakeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_SHAKE_KOKKOS_H
 #define LMP_FIX_SHAKE_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_shardlow_kokkos.h b/src/KOKKOS/fix_shardlow_kokkos.h
index bab8f08cb9..bd78643526 100644
--- a/src/KOKKOS/fix_shardlow_kokkos.h
+++ b/src/KOKKOS/fix_shardlow_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(shardlow/kk/host,FixShardlowKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_SHARDLOW_KOKKOS_H
 #define LMP_FIX_SHARDLOW_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_wall_lj93_kokkos.h b/src/KOKKOS/fix_wall_lj93_kokkos.h
index e7c12f3a70..c215b59b32 100644
--- a/src/KOKKOS/fix_wall_lj93_kokkos.h
+++ b/src/KOKKOS/fix_wall_lj93_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(wall/lj93/kk/host,FixWallLJ93Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_WALL_LJ93_KOKKOS_H
 #define LMP_FIX_WALL_LJ93_KOKKOS_H
 
diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.h b/src/KOKKOS/fix_wall_reflect_kokkos.h
index caf43120f4..02b578564f 100644
--- a/src/KOKKOS/fix_wall_reflect_kokkos.h
+++ b/src/KOKKOS/fix_wall_reflect_kokkos.h
@@ -20,6 +20,7 @@ FixStyle(wall/reflect/kk/host,FixWallReflectKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_FIX_WALL_REFLECT_KOKKOS_H
 #define LMP_FIX_WALL_REFLECT_KOKKOS_H
 
diff --git a/src/KOKKOS/improper_class2_kokkos.h b/src/KOKKOS/improper_class2_kokkos.h
index c9cb384df1..3cb5c16d65 100644
--- a/src/KOKKOS/improper_class2_kokkos.h
+++ b/src/KOKKOS/improper_class2_kokkos.h
@@ -20,6 +20,7 @@ ImproperStyle(class2/kk/host,ImproperClass2Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_IMPROPER_CLASS2_KOKKOS_H
 #define LMP_IMPROPER_CLASS2_KOKKOS_H
 
diff --git a/src/KOKKOS/improper_harmonic_kokkos.h b/src/KOKKOS/improper_harmonic_kokkos.h
index 8d89efaff8..799f935ecb 100644
--- a/src/KOKKOS/improper_harmonic_kokkos.h
+++ b/src/KOKKOS/improper_harmonic_kokkos.h
@@ -20,6 +20,7 @@ ImproperStyle(harmonic/kk/host,ImproperHarmonicKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_IMPROPER_HARMONIC_KOKKOS_H
 #define LMP_IMPROPER_HARMONIC_KOKKOS_H
 
diff --git a/src/KOKKOS/min_cg_kokkos.h b/src/KOKKOS/min_cg_kokkos.h
index 105887f14e..326dadf7e0 100644
--- a/src/KOKKOS/min_cg_kokkos.h
+++ b/src/KOKKOS/min_cg_kokkos.h
@@ -20,6 +20,7 @@ MinimizeStyle(cg/kk/host,MinCGKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_MIN_CG_KOKKOS_H
 #define LMP_MIN_CG_KOKKOS_H
 
diff --git a/src/KOKKOS/nbin_kokkos.h b/src/KOKKOS/nbin_kokkos.h
index d2c5617ff7..532729791d 100644
--- a/src/KOKKOS/nbin_kokkos.h
+++ b/src/KOKKOS/nbin_kokkos.h
@@ -24,6 +24,7 @@ NBinStyle(kk/device,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NBIN_KOKKOS_H
 #define LMP_NBIN_KOKKOS_H
 
diff --git a/src/KOKKOS/nbin_ssa_kokkos.h b/src/KOKKOS/nbin_ssa_kokkos.h
index 825733c2b0..d042186a3c 100644
--- a/src/KOKKOS/nbin_ssa_kokkos.h
+++ b/src/KOKKOS/nbin_ssa_kokkos.h
@@ -24,6 +24,7 @@ NBinStyle(ssa/kk/device,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NBIN_SSA_KOKKOS_H
 #define LMP_NBIN_SSA_KOKKOS_H
 
diff --git a/src/KOKKOS/npair_copy_kokkos.h b/src/KOKKOS/npair_copy_kokkos.h
index 61e4fffdde..43f4922d11 100644
--- a/src/KOKKOS/npair_copy_kokkos.h
+++ b/src/KOKKOS/npair_copy_kokkos.h
@@ -24,6 +24,7 @@ NPairStyle(copy/kk/host,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NPAIR_COPY_KOKKOS_H
 #define LMP_NPAIR_COPY_KOKKOS_H
 
diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h
index 553f10c27b..83ac95cc02 100644
--- a/src/KOKKOS/npair_halffull_kokkos.h
+++ b/src/KOKKOS/npair_halffull_kokkos.h
@@ -122,6 +122,7 @@ NPairStyle(halffull/newtoff/skip/ghost/kk/host,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NPAIR_HALFFULL_KOKKOS_H
 #define LMP_NPAIR_HALFFULL_KOKKOS_H
 
diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h
index b6fc41db02..919bd420d2 100644
--- a/src/KOKKOS/npair_kokkos.h
+++ b/src/KOKKOS/npair_kokkos.h
@@ -86,6 +86,7 @@ NPairStyle(half/size/bin/kk/device,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NPAIR_KOKKOS_H
 #define LMP_NPAIR_KOKKOS_H
 
diff --git a/src/KOKKOS/npair_skip_kokkos.h b/src/KOKKOS/npair_skip_kokkos.h
index 729a478ff2..91f1a13e68 100644
--- a/src/KOKKOS/npair_skip_kokkos.h
+++ b/src/KOKKOS/npair_skip_kokkos.h
@@ -44,6 +44,7 @@ NPairStyle(skip/ghost/kk/host,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NPAIR_SKIP_KOKKOS_H
 #define LMP_NPAIR_SKIP_KOKKOS_H
 
diff --git a/src/KOKKOS/npair_ssa_kokkos.h b/src/KOKKOS/npair_ssa_kokkos.h
index 559831548e..4d9ce36c87 100644
--- a/src/KOKKOS/npair_ssa_kokkos.h
+++ b/src/KOKKOS/npair_ssa_kokkos.h
@@ -26,6 +26,7 @@ NPairStyle(half/bin/newton/ssa/kk/device,
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_NPAIR_SSA_KOKKOS_H
 #define LMP_NPAIR_SSA_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.h b/src/KOKKOS/pair_buck_coul_cut_kokkos.h
index c41defe486..8db6e012d5 100644
--- a/src/KOKKOS/pair_buck_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(buck/coul/cut/kk/host,PairBuckCoulCutKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_BUCK_COUL_CUT_KOKKOS_H
 #define LMP_PAIR_BUCK_COUL_CUT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.h b/src/KOKKOS/pair_buck_coul_long_kokkos.h
index d855709fc1..739ef6d90d 100644
--- a/src/KOKKOS/pair_buck_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_buck_coul_long_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(buck/coul/long/kk/host,PairBuckCoulLongKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_BUCK_COUL_LONG_KOKKOS_H
 #define LMP_PAIR_BUCK_COUL_LONG_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_buck_kokkos.h b/src/KOKKOS/pair_buck_kokkos.h
index e1859c2522..8afeeb971f 100644
--- a/src/KOKKOS/pair_buck_kokkos.h
+++ b/src/KOKKOS/pair_buck_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(buck/kk/host,PairBuckKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_BUCK_KOKKOS_H
 #define LMP_PAIR_BUCK_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_coul_cut_kokkos.h b/src/KOKKOS/pair_coul_cut_kokkos.h
index b76e793487..5253ab5512 100644
--- a/src/KOKKOS/pair_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_coul_cut_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(coul/cut/kk/host,PairCoulCutKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_COUL_CUT_KOKKOS_H
 #define LMP_PAIR_COUL_CUT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_coul_debye_kokkos.h b/src/KOKKOS/pair_coul_debye_kokkos.h
index 88f5bc9693..589bf49b9a 100644
--- a/src/KOKKOS/pair_coul_debye_kokkos.h
+++ b/src/KOKKOS/pair_coul_debye_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(coul/debye/kk/host,PairCoulDebyeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_COUL_DEBYE_KOKKOS_H
 #define LMP_PAIR_COUL_DEBYE_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.h b/src/KOKKOS/pair_coul_dsf_kokkos.h
index 357b8d1382..1e15e6039b 100644
--- a/src/KOKKOS/pair_coul_dsf_kokkos.h
+++ b/src/KOKKOS/pair_coul_dsf_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(coul/dsf/kk/host,PairCoulDSFKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_COUL_DSF_KOKKOS_H
 #define LMP_PAIR_COUL_DSF_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_coul_long_kokkos.h b/src/KOKKOS/pair_coul_long_kokkos.h
index 85d6028808..713a96584b 100644
--- a/src/KOKKOS/pair_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_coul_long_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(coul/long/kk/host,PairCoulLongKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_COUL_LONG_KOKKOS_H
 #define LMP_PAIR_COUL_LONG_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.h b/src/KOKKOS/pair_coul_wolf_kokkos.h
index 0ff8b4dc90..b11e529da0 100644
--- a/src/KOKKOS/pair_coul_wolf_kokkos.h
+++ b/src/KOKKOS/pair_coul_wolf_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(coul/wolf/kk/host,PairCoulWolfKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_COUL_WOLF_KOKKOS_H
 #define LMP_PAIR_COUL_WOLF_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
index 58e7797de5..17ff4ec03b 100644
--- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
+++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(dpd/fdt/energy/kk/host,PairDPDfdtEnergyKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_DPD_FDT_ENERGY_KOKKOS_H
 #define LMP_PAIR_DPD_FDT_ENERGY_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.h b/src/KOKKOS/pair_eam_alloy_kokkos.h
index 4d533c9bf6..662c2a6056 100644
--- a/src/KOKKOS/pair_eam_alloy_kokkos.h
+++ b/src/KOKKOS/pair_eam_alloy_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(eam/alloy/kk/host,PairEAMAlloyKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_EAM_ALLOY_KOKKOS_H
 #define LMP_PAIR_EAM_ALLOY_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_eam_fs_kokkos.h b/src/KOKKOS/pair_eam_fs_kokkos.h
index 016b3ae922..04438272a3 100644
--- a/src/KOKKOS/pair_eam_fs_kokkos.h
+++ b/src/KOKKOS/pair_eam_fs_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(eam/fs/kk/host,PairEAMFSKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_EAM_FS_KOKKOS_H
 #define LMP_PAIR_EAM_FS_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_eam_kokkos.h b/src/KOKKOS/pair_eam_kokkos.h
index 6920eb1022..be7acc0336 100644
--- a/src/KOKKOS/pair_eam_kokkos.h
+++ b/src/KOKKOS/pair_eam_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(eam/kk/host,PairEAMKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_EAM_KOKKOS_H
 #define LMP_PAIR_EAM_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.h b/src/KOKKOS/pair_exp6_rx_kokkos.h
index b3363f39f6..8235573c06 100644
--- a/src/KOKKOS/pair_exp6_rx_kokkos.h
+++ b/src/KOKKOS/pair_exp6_rx_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(exp6/rx/kk/host,PairExp6rxKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_EXP6_RX_KOKKOS_H
 #define LMP_PAIR_EXP6_RX_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.h b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
index 638901c5af..6a87a48a02 100644
--- a/src/KOKKOS/pair_gran_hooke_history_kokkos.h
+++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(gran/hooke/history/kk/host,PairGranHookeHistoryKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_GRAN_HOOKE_HISTORY_KOKKOS_H
 #define LMP_PAIR_GRAN_HOOKE_HISTORY_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_hybrid_kokkos.h b/src/KOKKOS/pair_hybrid_kokkos.h
index 3a222618d3..8e1c62b15c 100644
--- a/src/KOKKOS/pair_hybrid_kokkos.h
+++ b/src/KOKKOS/pair_hybrid_kokkos.h
@@ -18,6 +18,7 @@ PairStyle(hybrid/kk,PairHybridKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_HYBRID_KOKKOS_H
 #define LMP_PAIR_HYBRID_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_hybrid_overlay_kokkos.h b/src/KOKKOS/pair_hybrid_overlay_kokkos.h
index aeef5c311c..0912f0b28f 100644
--- a/src/KOKKOS/pair_hybrid_overlay_kokkos.h
+++ b/src/KOKKOS/pair_hybrid_overlay_kokkos.h
@@ -18,6 +18,7 @@ PairStyle(hybrid/overlay/kk,PairHybridOverlayKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_HYBRID_OVERLAY_KOKKOS_H
 #define LMP_PAIR_HYBRID_OVERLAY_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h
index 91fd034f74..4e0d0b1f88 100644
--- a/src/KOKKOS/pair_kokkos.h
+++ b/src/KOKKOS/pair_kokkos.h
@@ -16,6 +16,7 @@
 
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_KOKKOS_H
 #define LMP_PAIR_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
index 197e388114..2200873052 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/charmm/coul/charmm/implicit/kk/host,PairLJCharmmCoulCharmmImplicitK
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CHARMM_COUL_CHARMM_IMPLICIT_KOKKOS_H
 #define LMP_PAIR_LJ_CHARMM_COUL_CHARMM_IMPLICIT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
index 31f7d4a9c0..5cdd016fee 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/charmm/coul/charmm/kk/host,PairLJCharmmCoulCharmmKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CHARMM_COUL_LONG_KOKKOS_H
 #define LMP_PAIR_LJ_CHARMM_COUL_LONG_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
index a89b8fe5a1..a4c3b7db7f 100644
--- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/class2/coul/cut/kk/host,PairLJClass2CoulCutKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CLASS2_COUL_CUT_KOKKOS_H
 #define LMP_PAIR_LJ_CLASS2_COUL_CUT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
index 6ffe8cd6ff..4e05961d1d 100644
--- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/class2/coul/long/kk/host,PairLJClass2CoulLongKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CLASS2_COUL_LONG_KOKKOS_H
 #define LMP_PAIR_LJ_CLASS2_COUL_LONG_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_class2_kokkos.h b/src/KOKKOS/pair_lj_class2_kokkos.h
index e6b1fa9d37..e0a6c7eb0c 100644
--- a/src/KOKKOS/pair_lj_class2_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/class2/kk/host,PairLJClass2Kokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CLASS2_KOKKOS_H
 #define LMP_PAIR_LJ_CLASS2_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
index bc4a9ffeeb..43c2c7bf06 100644
--- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/cut/coul/cut/kk/host,PairLJCutCoulCutKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CUT_COUL_CUT_KOKKOS_H
 #define LMP_PAIR_LJ_CUT_COUL_CUT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
index b0e25f606b..966fd780bc 100644
--- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/cut/coul/debye/kk/host,PairLJCutCoulDebyeKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CUT_COUL_DEBYE_KOKKOS_H
 #define LMP_PAIR_LJ_CUT_COUL_DEBYE_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
index bf013d4837..65e7ce4959 100644
--- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/cut/coul/dsf/kk/host,PairLJCutCoulDSFKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CUT_COUL_DSF_KOKKOS_H
 #define LMP_PAIR_LJ_CUT_COUL_DSF_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
index 3b3067dd0e..4735b3b218 100644
--- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/cut/coul/long/kk/host,PairLJCutCoulLongKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CUT_COUL_LONG_KOKKOS_H
 #define LMP_PAIR_LJ_CUT_COUL_LONG_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_kokkos.h
index 5722145815..a4ebaa660e 100644
--- a/src/KOKKOS/pair_lj_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/cut/kk/host,PairLJCutKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_CUT_KOKKOS_H
 #define LMP_PAIR_LJ_CUT_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_expand_kokkos.h b/src/KOKKOS/pair_lj_expand_kokkos.h
index 8fe9bd7aa2..bdbefdd6bc 100644
--- a/src/KOKKOS/pair_lj_expand_kokkos.h
+++ b/src/KOKKOS/pair_lj_expand_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/expand/kk/host,PairLJExpandKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_EXPAND_KOKKOS_H
 #define LMP_PAIR_LJ_EXPAND_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
index 13357e2e5c..3351df36e1 100644
--- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
+++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/gromacs/coul/gromacs/kk/host,PairLJGromacsCoulGromacsKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_GROMACS_KOKKOS_H
 #define LMP_PAIR_LJ_GROMACS_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.h b/src/KOKKOS/pair_lj_sdk_kokkos.h
index 1855715155..dada53edd1 100644
--- a/src/KOKKOS/pair_lj_sdk_kokkos.h
+++ b/src/KOKKOS/pair_lj_sdk_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(lj/sdk/kk/host,PairLJSDKKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_LJ_SDK_KOKKOS_H
 #define LMP_PAIR_LJ_SDK_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_morse_kokkos.h b/src/KOKKOS/pair_morse_kokkos.h
index 4a29289a30..db621a2a12 100644
--- a/src/KOKKOS/pair_morse_kokkos.h
+++ b/src/KOKKOS/pair_morse_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(morse/kk/host,PairMorseKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_MORSE_KOKKOS_H
 #define LMP_PAIR_MORSE_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
index 3e2d898b76..2b41d62439 100644
--- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
+++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(multi/lucy/rx/kk/host,PairMultiLucyRXKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_MULTI_LUCY_RX_KOKKOS_H
 #define LMP_PAIR_MULTI_LUCY_RX_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h
index bfa4e6fb4a..d15a5abb01 100644
--- a/src/KOKKOS/pair_reaxff_kokkos.h
+++ b/src/KOKKOS/pair_reaxff_kokkos.h
@@ -24,6 +24,7 @@ PairStyle(reax/c/kk/host,PairReaxFFKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_REAXC_KOKKOS_H
 #define LMP_PAIR_REAXC_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h
index 5cc3c5db17..89757ef4f1 100644
--- a/src/KOKKOS/pair_snap_kokkos.h
+++ b/src/KOKKOS/pair_snap_kokkos.h
@@ -24,6 +24,7 @@ PairStyle(snap/kk/host,PairSNAPKokkosDevice);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_SNAP_KOKKOS_H
 #define LMP_PAIR_SNAP_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_sw_kokkos.h b/src/KOKKOS/pair_sw_kokkos.h
index eeda79415b..b477d4e42f 100644
--- a/src/KOKKOS/pair_sw_kokkos.h
+++ b/src/KOKKOS/pair_sw_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(sw/kk/host,PairSWKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_SW_KOKKOS_H
 #define LMP_PAIR_SW_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_table_kokkos.h b/src/KOKKOS/pair_table_kokkos.h
index 0075fbdde2..a0c64cb14f 100644
--- a/src/KOKKOS/pair_table_kokkos.h
+++ b/src/KOKKOS/pair_table_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(table/kk/host,PairTableKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_TABLE_KOKKOS_H
 #define LMP_PAIR_TABLE_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_table_rx_kokkos.h b/src/KOKKOS/pair_table_rx_kokkos.h
index 7d2e40cd81..8a7c29de11 100644
--- a/src/KOKKOS/pair_table_rx_kokkos.h
+++ b/src/KOKKOS/pair_table_rx_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(table/rx/kk/host,PairTableRXKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_TABLE_RX_KOKKOS_H
 #define LMP_PAIR_TABLE_RX_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_tersoff_kokkos.h b/src/KOKKOS/pair_tersoff_kokkos.h
index 8e9f6eb88a..0bdcf2ae24 100644
--- a/src/KOKKOS/pair_tersoff_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(tersoff/kk/host,PairTersoffKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_TERSOFF_KOKKOS_H
 #define LMP_PAIR_TERSOFF_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.h b/src/KOKKOS/pair_tersoff_mod_kokkos.h
index 4bf9e98249..580ab02f6b 100644
--- a/src/KOKKOS/pair_tersoff_mod_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_mod_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(tersoff/mod/kk/host,PairTersoffMODKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_TERSOFF_MOD_KOKKOS_H
 #define LMP_PAIR_TERSOFF_MOD_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.h b/src/KOKKOS/pair_tersoff_zbl_kokkos.h
index 0a8701a91f..e97d3af999 100644
--- a/src/KOKKOS/pair_tersoff_zbl_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.h
@@ -21,6 +21,7 @@ PairStyle(tersoff/zbl/kk/host,PairTersoffZBLKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_TERSOFF_ZBL_KOKKOS_H
 #define LMP_PAIR_TERSOFF_ZBL_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_vashishta_kokkos.h b/src/KOKKOS/pair_vashishta_kokkos.h
index 541f4ebc8b..f4c1621476 100644
--- a/src/KOKKOS/pair_vashishta_kokkos.h
+++ b/src/KOKKOS/pair_vashishta_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(vashishta/kk/host,PairVashishtaKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_VASHISHTA_KOKKOS_H
 #define LMP_PAIR_VASHISHTA_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h
index cd478e30ed..d563b8a574 100644
--- a/src/KOKKOS/pair_yukawa_kokkos.h
+++ b/src/KOKKOS/pair_yukawa_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(yukawa/kk/host,PairYukawaKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_YUKAWA_KOKKOS_H
 #define LMP_PAIR_YUKAWA_KOKKOS_H
 
diff --git a/src/KOKKOS/pair_zbl_kokkos.h b/src/KOKKOS/pair_zbl_kokkos.h
index 5b1d6e8d7d..09ef00dc17 100644
--- a/src/KOKKOS/pair_zbl_kokkos.h
+++ b/src/KOKKOS/pair_zbl_kokkos.h
@@ -20,6 +20,7 @@ PairStyle(zbl/kk/host,PairZBLKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_ZBL_KOKKOS_H
 #define LMP_PAIR_ZBL_KOKKOS_H
 
diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h
index 6b7b7f1f89..20849d1195 100644
--- a/src/KOKKOS/pppm_kokkos.h
+++ b/src/KOKKOS/pppm_kokkos.h
@@ -20,6 +20,7 @@ KSpaceStyle(pppm/kk/host,PPPMKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PPPM_KOKKOS_H
 #define LMP_PPPM_KOKKOS_H
 
diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h
index 5067ff789b..8f393d5530 100644
--- a/src/KOKKOS/region_block_kokkos.h
+++ b/src/KOKKOS/region_block_kokkos.h
@@ -20,6 +20,7 @@ RegionStyle(block/kk/host,RegBlockKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_REGION_BLOCK_KOKKOS_H
 #define LMP_REGION_BLOCK_KOKKOS_H
 
diff --git a/src/KOKKOS/verlet_kokkos.h b/src/KOKKOS/verlet_kokkos.h
index 36f084bf7f..90d07f322b 100644
--- a/src/KOKKOS/verlet_kokkos.h
+++ b/src/KOKKOS/verlet_kokkos.h
@@ -20,6 +20,7 @@ IntegrateStyle(verlet/kk/host,VerletKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_VERLET_KOKKOS_H
 #define LMP_VERLET_KOKKOS_H
 

From 9a19a814e44f32b455ee0873134500cd48270d6c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:05:48 -0400
Subject: [PATCH 072/437] apply clang-format to packages

---
 src/CG-DNA/atom_vec_oxdna.cpp                 |   3 +-
 src/CG-DNA/bond_oxdna_fene.cpp                | 221 +++++----
 src/COMPRESS/zstd_file_writer.h               |   1 -
 src/DIELECTRIC/fix_polarize_bem_gmres.cpp     |  25 +-
 src/DIELECTRIC/fix_polarize_bem_icc.cpp       |   3 +-
 src/DIELECTRIC/fix_polarize_functional.cpp    |  33 +-
 src/DIELECTRIC/pair_coul_cut_dielectric.cpp   | 109 ++---
 .../pair_lj_long_coul_long_dielectric.cpp     |   3 +-
 src/DIPOLE/angle_dipole.cpp                   |   2 +-
 src/FEP/pair_morse_soft.cpp                   | 282 ++++++------
 src/GRANULAR/compute_fabric.cpp               |   1 -
 src/GRANULAR/pair_gran_hooke_history.cpp      | 422 +++++++++---------
 src/INTEL/angle_charmm_intel.h                |  23 +-
 src/INTEL/angle_harmonic_intel.h              |  23 +-
 src/INTEL/bond_fene_intel.h                   |  23 +-
 src/INTEL/bond_harmonic_intel.h               |  23 +-
 src/INTEL/dihedral_charmm_intel.h             |  29 +-
 src/INTEL/dihedral_fourier_intel.h            |  28 +-
 src/INTEL/dihedral_harmonic_intel.h           |  25 +-
 src/INTEL/dihedral_opls_intel.h               |  23 +-
 src/INTEL/fix_intel.h                         | 312 ++++++-------
 src/INTEL/fix_npt_intel.h                     |   2 +-
 src/INTEL/fix_nve_asphere_intel.h             |   2 +-
 src/INTEL/fix_nve_intel.h                     |   2 +-
 src/INTEL/fix_nvt_intel.h                     |   2 +-
 src/INTEL/fix_nvt_sllod_intel.h               |   3 +-
 src/INTEL/improper_cvff_intel.h               |  26 +-
 src/INTEL/improper_harmonic_intel.h           |  25 +-
 src/INTEL/nbin_intel.h                        |  13 +-
 src/INTEL/npair_full_bin_ghost_intel.h        |  12 +-
 src/INTEL/npair_full_bin_intel.h              |   7 +-
 src/INTEL/npair_half_bin_newton_intel.h       |   7 +-
 src/INTEL/npair_half_bin_newton_tri_intel.h   |   7 +-
 src/INTEL/npair_halffull_newton_intel.h       |  11 +-
 src/INTEL/npair_skip_intel.h                  |   7 +-
 src/INTEL/pair_airebo_intel.h                 |  29 +-
 src/INTEL/pair_airebo_morse_intel.h           |   2 +-
 src/INTEL/pair_buck_coul_cut_intel.h          |  43 +-
 src/INTEL/pair_buck_coul_long_intel.h         |  43 +-
 src/INTEL/pair_buck_intel.h                   |  45 +-
 src/INTEL/pair_dpd_intel.h                    |  33 +-
 src/INTEL/pair_eam_alloy_intel.h              |   2 +-
 src/INTEL/pair_eam_fs_intel.h                 |   2 +-
 src/INTEL/pair_eam_intel.h                    |  45 +-
 src/INTEL/pair_gayberne_intel.h               |  42 +-
 src/INTEL/pair_lj_charmm_coul_charmm_intel.h  |  28 +-
 src/INTEL/pair_lj_charmm_coul_long_intel.h    |  35 +-
 src/INTEL/pair_lj_cut_coul_long_intel.h       |  41 +-
 src/INTEL/pair_lj_cut_intel.h                 |  27 +-
 src/INTEL/pair_lj_long_coul_long_intel.h      |  15 +-
 src/INTEL/pair_rebo_intel.h                   |   2 +-
 src/INTEL/pair_sw_intel.h                     |  23 +-
 src/INTEL/pair_tersoff_intel.h                |  74 +--
 src/INTEL/pppm_disp_intel.h                   | 394 ++++++++--------
 src/INTEL/pppm_intel.h                        |  53 ++-
 src/INTEL/verlet_lrt_intel.h                  |  36 +-
 src/KOKKOS/atom_map_kokkos.cpp                |   4 +-
 src/KOKKOS/fix_nvt_kokkos.h                   |   1 -
 src/MANYBODY/pair_edip.cpp                    |   2 +-
 src/MC/fix_charge_regulation.h                |  16 +-
 src/MDI/fix_mdi_engine.cpp                    |   3 +-
 src/MDI/mdi_engine.cpp                        |   2 +-
 src/MGPT/pair_mgpt.h                          |   2 +-
 src/MISC/pair_tracker.cpp                     |   2 +-
 src/ML-HDNNP/pair_hdnnp.cpp                   | 220 ++++-----
 src/ML-HDNNP/pair_hdnnp.h                     |   6 +-
 src/ML-IAP/mliap_descriptor.cpp               |   6 +-
 src/ML-IAP/mliap_model.h                      |   8 +-
 src/ML-IAP/mliap_model_nn.h                   |   6 +-
 src/ML-RANN/pair_rann.h                       | 234 +++++-----
 src/ML-RANN/rann_activation.h                 |  40 +-
 src/ML-RANN/rann_activation_linear.h          |  47 +-
 src/ML-RANN/rann_activation_sig_i.h           |  51 ++-
 src/ML-RANN/rann_fingerprint.h                |   2 +-
 src/ML-RANN/rann_fingerprint_bond.h           |  64 +--
 src/ML-RANN/rann_fingerprint_bondscreened.h   |  69 +--
 .../rann_fingerprint_bondscreenedspin.h       |  69 +--
 src/ML-RANN/rann_fingerprint_bondspin.h       |  67 +--
 src/ML-RANN/rann_fingerprint_radial.h         |  44 +-
 src/ML-RANN/rann_fingerprint_radialscreened.h |  45 +-
 .../rann_fingerprint_radialscreenedspin.h     |  46 +-
 src/ML-RANN/rann_fingerprint_radialspin.h     |  44 +-
 src/ML-SNAP/pair_snap.h                       |   2 +-
 src/MPIIO/dump_atom_mpiio.cpp                 |   2 +-
 src/MPIIO/dump_custom_mpiio.cpp               |   2 +-
 .../pair_lj_cut_coul_cut_dielectric_omp.cpp   |   3 +-
 .../pair_lj_cut_coul_cut_dielectric_omp.h     |   4 +-
 .../pair_lj_cut_coul_long_dielectric_omp.h    |   4 +-
 src/OPENMP/pair_reaxff_omp.h                  |  32 +-
 src/OPENMP/reaxff_omp.h                       | 130 +++---
 src/OPENMP/thr_omp.h                          |   6 +-
 src/SRD/fix_srd.cpp                           |  18 +-
 src/TALLY/compute_force_tally.cpp             |   2 +-
 src/TALLY/compute_heat_flux_tally.cpp         |   2 +-
 src/TALLY/compute_heat_flux_virial_tally.cpp  |   2 +-
 src/TALLY/compute_pe_tally.cpp                |   2 +-
 src/TALLY/compute_stress_tally.cpp            |   2 +-
 97 files changed, 2029 insertions(+), 2038 deletions(-)

diff --git a/src/CG-DNA/atom_vec_oxdna.cpp b/src/CG-DNA/atom_vec_oxdna.cpp
index f5d56eef31..2da35b37b3 100644
--- a/src/CG-DNA/atom_vec_oxdna.cpp
+++ b/src/CG-DNA/atom_vec_oxdna.cpp
@@ -49,7 +49,8 @@ AtomVecOxdna::AtomVecOxdna(LAMMPS *lmp) : AtomVec(lmp)
 
   setup_fields();
 
-  if(!force->newton_bond) error->warning(FLERR,"Write_data command requires newton on to preserve 3'->5' bond polarity");
+  if (!force->newton_bond)
+    error->warning(FLERR, "Write_data command requires newton on to preserve 3'->5' bond polarity");
 }
 
 /* ---------------------------------------------------------------------- */
diff --git a/src/CG-DNA/bond_oxdna_fene.cpp b/src/CG-DNA/bond_oxdna_fene.cpp
index 5a332a0b8c..6b720f6a7f 100644
--- a/src/CG-DNA/bond_oxdna_fene.cpp
+++ b/src/CG-DNA/bond_oxdna_fene.cpp
@@ -17,12 +17,12 @@
 #include "bond_oxdna_fene.h"
 
 #include "atom.h"
-#include "neighbor.h"
 #include "comm.h"
-#include "update.h"
+#include "error.h"
 #include "force.h"
 #include "memory.h"
-#include "error.h"
+#include "neighbor.h"
+#include "update.h"
 
 #include "atom_vec_ellipsoid.h"
 #include "math_extra.h"
@@ -43,54 +43,52 @@ BondOxdnaFene::~BondOxdnaFene()
   }
 }
 
-
 /* ----------------------------------------------------------------------
     compute vector COM-sugar-phosphate backbone interaction site in oxDNA
 ------------------------------------------------------------------------- */
-void BondOxdnaFene::compute_interaction_sites(double e1[3], double /*e2*/[3],
-  double /*e3*/[3], double r[3]) const
+void BondOxdnaFene::compute_interaction_sites(double e1[3], double /*e2*/[3], double /*e3*/[3],
+                                              double r[3]) const
 {
-  constexpr double d_cs=-0.4;
+  constexpr double d_cs = -0.4;
 
-  r[0] = d_cs*e1[0];
-  r[1] = d_cs*e1[1];
-  r[2] = d_cs*e1[2];
+  r[0] = d_cs * e1[0];
+  r[1] = d_cs * e1[1];
+  r[2] = d_cs * e1[2];
 }
 
 /* ----------------------------------------------------------------------
    tally energy and virial into global and per-atom accumulators
 ------------------------------------------------------------------------- */
 
-void BondOxdnaFene::ev_tally_xyz(int i, int j, int nlocal, int newton_bond,
-                    double ebond,
-                    double fx, double fy, double fz,
-                    double delx, double dely, double delz)
+void BondOxdnaFene::ev_tally_xyz(int i, int j, int nlocal, int newton_bond, double ebond, double fx,
+                                 double fy, double fz, double delx, double dely, double delz)
 {
-  double ebondhalf,v[6];
+  double ebondhalf, v[6];
 
   if (eflag_either) {
     if (eflag_global) {
-      if (newton_bond) energy += ebond;
+      if (newton_bond)
+        energy += ebond;
       else {
-        ebondhalf = 0.5*ebond;
+        ebondhalf = 0.5 * ebond;
         if (i < nlocal) energy += ebondhalf;
         if (j < nlocal) energy += ebondhalf;
       }
     }
     if (eflag_atom) {
-      ebondhalf = 0.5*ebond;
+      ebondhalf = 0.5 * ebond;
       if (newton_bond || i < nlocal) eatom[i] += ebondhalf;
       if (newton_bond || j < nlocal) eatom[j] += ebondhalf;
     }
   }
 
   if (vflag_either) {
-    v[0] = delx*fx;
-    v[1] = dely*fy;
-    v[2] = delz*fz;
-    v[3] = delx*fy;
-    v[4] = delx*fz;
-    v[5] = dely*fz;
+    v[0] = delx * fx;
+    v[1] = dely * fy;
+    v[2] = delz * fz;
+    v[3] = delx * fy;
+    v[4] = delx * fz;
+    v[5] = dely * fz;
 
     if (vflag_global) {
       if (newton_bond) {
@@ -102,40 +100,40 @@ void BondOxdnaFene::ev_tally_xyz(int i, int j, int nlocal, int newton_bond,
         virial[5] += v[5];
       } else {
         if (i < nlocal) {
-          virial[0] += 0.5*v[0];
-          virial[1] += 0.5*v[1];
-          virial[2] += 0.5*v[2];
-          virial[3] += 0.5*v[3];
-          virial[4] += 0.5*v[4];
-          virial[5] += 0.5*v[5];
+          virial[0] += 0.5 * v[0];
+          virial[1] += 0.5 * v[1];
+          virial[2] += 0.5 * v[2];
+          virial[3] += 0.5 * v[3];
+          virial[4] += 0.5 * v[4];
+          virial[5] += 0.5 * v[5];
         }
         if (j < nlocal) {
-          virial[0] += 0.5*v[0];
-          virial[1] += 0.5*v[1];
-          virial[2] += 0.5*v[2];
-          virial[3] += 0.5*v[3];
-          virial[4] += 0.5*v[4];
-          virial[5] += 0.5*v[5];
+          virial[0] += 0.5 * v[0];
+          virial[1] += 0.5 * v[1];
+          virial[2] += 0.5 * v[2];
+          virial[3] += 0.5 * v[3];
+          virial[4] += 0.5 * v[4];
+          virial[5] += 0.5 * v[5];
         }
       }
     }
 
     if (vflag_atom) {
       if (newton_bond || i < nlocal) {
-        vatom[i][0] += 0.5*v[0];
-        vatom[i][1] += 0.5*v[1];
-        vatom[i][2] += 0.5*v[2];
-        vatom[i][3] += 0.5*v[3];
-        vatom[i][4] += 0.5*v[4];
-        vatom[i][5] += 0.5*v[5];
+        vatom[i][0] += 0.5 * v[0];
+        vatom[i][1] += 0.5 * v[1];
+        vatom[i][2] += 0.5 * v[2];
+        vatom[i][3] += 0.5 * v[3];
+        vatom[i][4] += 0.5 * v[4];
+        vatom[i][5] += 0.5 * v[5];
       }
       if (newton_bond || j < nlocal) {
-        vatom[j][0] += 0.5*v[0];
-        vatom[j][1] += 0.5*v[1];
-        vatom[j][2] += 0.5*v[2];
-        vatom[j][3] += 0.5*v[3];
-        vatom[j][4] += 0.5*v[4];
-        vatom[j][5] += 0.5*v[5];
+        vatom[j][0] += 0.5 * v[0];
+        vatom[j][1] += 0.5 * v[1];
+        vatom[j][2] += 0.5 * v[2];
+        vatom[j][3] += 0.5 * v[3];
+        vatom[j][4] += 0.5 * v[4];
+        vatom[j][5] += 0.5 * v[5];
       }
     }
   }
@@ -147,16 +145,16 @@ void BondOxdnaFene::ev_tally_xyz(int i, int j, int nlocal, int newton_bond,
 ------------------------------------------------------------------------- */
 void BondOxdnaFene::compute(int eflag, int vflag)
 {
-  int a,b,in,type;
-  double delf[3],delta[3],deltb[3]; // force, torque increment;;
-  double delr[3],ebond,fbond;
-  double rsq,Deltasq,rlogarg;
-  double r,rr0,rr0sq;
+  int a, b, in, type;
+  double delf[3], delta[3], deltb[3];    // force, torque increment;;
+  double delr[3], ebond, fbond;
+  double rsq, Deltasq, rlogarg;
+  double r, rr0, rr0sq;
   // vectors COM-backbone site in lab frame
-  double ra_cs[3],rb_cs[3];
+  double ra_cs[3], rb_cs[3];
 
-  double *qa,ax[3],ay[3],az[3];
-  double *qb,bx[3],by[3],bz[3];
+  double *qa, ax[3], ay[3], az[3];
+  double *qb, bx[3], by[3], bz[3];
 
   double **x = atom->x;
   double **f = atom->f;
@@ -172,7 +170,7 @@ void BondOxdnaFene::compute(int eflag, int vflag)
   int newton_bond = force->newton_bond;
 
   ebond = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   // loop over FENE bonds
 
@@ -182,47 +180,45 @@ void BondOxdnaFene::compute(int eflag, int vflag)
     b = bondlist[in][0];
     type = bondlist[in][2];
 
-    qa=bonus[ellipsoid[a]].quat;
-    MathExtra::q_to_exyz(qa,ax,ay,az);
-    qb=bonus[ellipsoid[b]].quat;
-    MathExtra::q_to_exyz(qb,bx,by,bz);
+    qa = bonus[ellipsoid[a]].quat;
+    MathExtra::q_to_exyz(qa, ax, ay, az);
+    qb = bonus[ellipsoid[b]].quat;
+    MathExtra::q_to_exyz(qb, bx, by, bz);
 
     // vector COM-backbone site a and b
-    compute_interaction_sites(ax,ay,az,ra_cs);
-    compute_interaction_sites(bx,by,bz,rb_cs);
+    compute_interaction_sites(ax, ay, az, ra_cs);
+    compute_interaction_sites(bx, by, bz, rb_cs);
 
     // vector backbone site b to a
     delr[0] = x[a][0] + ra_cs[0] - x[b][0] - rb_cs[0];
     delr[1] = x[a][1] + ra_cs[1] - x[b][1] - rb_cs[1];
     delr[2] = x[a][2] + ra_cs[2] - x[b][2] - rb_cs[2];
-    rsq = delr[0]*delr[0] + delr[1]*delr[1] + delr[2]*delr[2];
+    rsq = delr[0] * delr[0] + delr[1] * delr[1] + delr[2] * delr[2];
     r = sqrt(rsq);
 
     rr0 = r - r0[type];
-    rr0sq = rr0*rr0;
+    rr0sq = rr0 * rr0;
     Deltasq = Delta[type] * Delta[type];
-    rlogarg = 1.0 - rr0sq/Deltasq;
+    rlogarg = 1.0 - rr0sq / Deltasq;
 
     // if r -> Delta, then rlogarg < 0.0 which is an error
     // issue a warning and reset rlogarg = epsilon
     // if r > 2*Delta something serious is wrong, abort
 
     if (rlogarg < 0.1) {
-      error->warning(FLERR,"FENE bond too long: {} {} {} {}",
-                     update->ntimestep,atom->tag[a],atom->tag[b],r);
+      error->warning(FLERR, "FENE bond too long: {} {} {} {}", update->ntimestep, atom->tag[a],
+                     atom->tag[b], r);
       rlogarg = 0.1;
     }
 
-    fbond = -k[type]*rr0/rlogarg/Deltasq/r;
-    delf[0] = delr[0]*fbond;
-    delf[1] = delr[1]*fbond;
-    delf[2] = delr[2]*fbond;
+    fbond = -k[type] * rr0 / rlogarg / Deltasq / r;
+    delf[0] = delr[0] * fbond;
+    delf[1] = delr[1] * fbond;
+    delf[2] = delr[2] * fbond;
 
     // energy
 
-    if (eflag) {
-      ebond = -0.5 * k[type]*log(rlogarg);
-    }
+    if (eflag) { ebond = -0.5 * k[type] * log(rlogarg); }
 
     // apply force and torque to each of 2 atoms
 
@@ -232,12 +228,11 @@ void BondOxdnaFene::compute(int eflag, int vflag)
       f[a][1] += delf[1];
       f[a][2] += delf[2];
 
-      MathExtra::cross3(ra_cs,delf,delta);
+      MathExtra::cross3(ra_cs, delf, delta);
 
       torque[a][0] += delta[0];
       torque[a][1] += delta[1];
       torque[a][2] += delta[2];
-
     }
 
     if (newton_bond || b < nlocal) {
@@ -246,23 +241,21 @@ void BondOxdnaFene::compute(int eflag, int vflag)
       f[b][1] -= delf[1];
       f[b][2] -= delf[2];
 
-      MathExtra::cross3(rb_cs,delf,deltb);
+      MathExtra::cross3(rb_cs, delf, deltb);
 
       torque[b][0] -= deltb[0];
       torque[b][1] -= deltb[1];
       torque[b][2] -= deltb[2];
-
     }
 
     // increment energy and virial
     // NOTE: The virial is calculated on the 'molecular' basis.
     // (see G. Ciccotti and J.P. Ryckaert, Comp. Phys. Rep. 4, 345-392 (1986))
 
-    if (evflag) ev_tally_xyz(a,b,nlocal,newton_bond,ebond,
-        delf[0],delf[1],delf[2],x[a][0]-x[b][0],x[a][1]-x[b][1],x[a][2]-x[b][2]);
-
+    if (evflag)
+      ev_tally_xyz(a, b, nlocal, newton_bond, ebond, delf[0], delf[1], delf[2], x[a][0] - x[b][0],
+                   x[a][1] - x[b][1], x[a][2] - x[b][2]);
   }
-
 }
 
 /* ---------------------------------------------------------------------- */
@@ -272,13 +265,12 @@ void BondOxdnaFene::allocate()
   allocated = 1;
   int n = atom->nbondtypes;
 
-  memory->create(k,n+1,"bond:k");
-  memory->create(Delta,n+1,"bond:Delta");
-  memory->create(r0,n+1,"bond:r0");
-  memory->create(setflag,n+1,"bond:setflag");
+  memory->create(k, n + 1, "bond:k");
+  memory->create(Delta, n + 1, "bond:Delta");
+  memory->create(r0, n + 1, "bond:r0");
+  memory->create(setflag, n + 1, "bond:setflag");
 
   for (int i = 1; i <= n; i++) setflag[i] = 0;
-
 }
 
 /* ----------------------------------------------------------------------
@@ -287,15 +279,15 @@ void BondOxdnaFene::allocate()
 
 void BondOxdnaFene::coeff(int narg, char **arg)
 {
-  if (narg != 4) error->all(FLERR,"Incorrect args for bond coefficients in oxdna/fene");
+  if (narg != 4) error->all(FLERR, "Incorrect args for bond coefficients in oxdna/fene");
   if (!allocated) allocate();
 
-  int ilo,ihi;
-  utils::bounds(FLERR,arg[0],1,atom->nbondtypes,ilo,ihi,error);
+  int ilo, ihi;
+  utils::bounds(FLERR, arg[0], 1, atom->nbondtypes, ilo, ihi, error);
 
-  double k_one = utils::numeric(FLERR,arg[1],false,lmp);
-  double Delta_one = utils::numeric(FLERR,arg[2],false,lmp);
-  double r0_one = utils::numeric(FLERR,arg[3],false,lmp);
+  double k_one = utils::numeric(FLERR, arg[1], false, lmp);
+  double Delta_one = utils::numeric(FLERR, arg[2], false, lmp);
+  double r0_one = utils::numeric(FLERR, arg[3], false, lmp);
 
   int count = 0;
 
@@ -307,8 +299,7 @@ void BondOxdnaFene::coeff(int narg, char **arg)
     count++;
   }
 
-  if (count == 0) error->all(FLERR,"Incorrect args for bond coefficients in oxdna/fene");
-
+  if (count == 0) error->all(FLERR, "Incorrect args for bond coefficients in oxdna/fene");
 }
 
 /* ----------------------------------------------------------------------
@@ -318,7 +309,9 @@ void BondOxdnaFene::coeff(int narg, char **arg)
 void BondOxdnaFene::init_style()
 {
   if (force->special_lj[1] != 0.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0)
-    error->all(FLERR,"Must use 'special_bonds lj 0 1 1' with bond style oxdna/fene, oxdna2/fene or oxrna2/fene");
+    error->all(
+        FLERR,
+        "Must use 'special_bonds lj 0 1 1' with bond style oxdna/fene, oxdna2/fene or oxrna2/fene");
 }
 
 /* ---------------------------------------------------------------------- */
@@ -334,9 +327,9 @@ double BondOxdnaFene::equilibrium_distance(int i)
 
 void BondOxdnaFene::write_restart(FILE *fp)
 {
-  fwrite(&k[1],sizeof(double),atom->nbondtypes,fp);
-  fwrite(&Delta[1],sizeof(double),atom->nbondtypes,fp);
-  fwrite(&r0[1],sizeof(double),atom->nbondtypes,fp);
+  fwrite(&k[1], sizeof(double), atom->nbondtypes, fp);
+  fwrite(&Delta[1], sizeof(double), atom->nbondtypes, fp);
+  fwrite(&r0[1], sizeof(double), atom->nbondtypes, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -348,13 +341,13 @@ void BondOxdnaFene::read_restart(FILE *fp)
   allocate();
 
   if (comm->me == 0) {
-    utils::sfread(FLERR,&k[1],sizeof(double),atom->nbondtypes,fp,nullptr,error);
-    utils::sfread(FLERR,&Delta[1],sizeof(double),atom->nbondtypes,fp,nullptr,error);
-    utils::sfread(FLERR,&r0[1],sizeof(double),atom->nbondtypes,fp,nullptr,error);
+    utils::sfread(FLERR, &k[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
+    utils::sfread(FLERR, &Delta[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
+    utils::sfread(FLERR, &r0[1], sizeof(double), atom->nbondtypes, fp, nullptr, error);
   }
-  MPI_Bcast(&k[1],atom->nbondtypes,MPI_DOUBLE,0,world);
-  MPI_Bcast(&Delta[1],atom->nbondtypes,MPI_DOUBLE,0,world);
-  MPI_Bcast(&r0[1],atom->nbondtypes,MPI_DOUBLE,0,world);
+  MPI_Bcast(&k[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&Delta[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&r0[1], atom->nbondtypes, MPI_DOUBLE, 0, world);
 
   for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1;
 }
@@ -366,32 +359,30 @@ void BondOxdnaFene::read_restart(FILE *fp)
 void BondOxdnaFene::write_data(FILE *fp)
 {
   for (int i = 1; i <= atom->nbondtypes; i++)
-    fprintf(fp,"%d %g %g %g\n",i,k[i],r0[i],Delta[i]);
+    fprintf(fp, "%d %g %g %g\n", i, k[i], r0[i], Delta[i]);
 }
 
 /* ---------------------------------------------------------------------- */
 
-double BondOxdnaFene::single(int type, double rsq, int /*i*/, int /*j*/,
-                        double &fforce)
+double BondOxdnaFene::single(int type, double rsq, int /*i*/, int /*j*/, double &fforce)
 {
   double r = sqrt(rsq);
   double rr0 = r - r0[type];
-  double rr0sq = rr0*rr0;
+  double rr0sq = rr0 * rr0;
   double Deltasq = Delta[type] * Delta[type];
-  double rlogarg = 1.0 - rr0sq/Deltasq;
+  double rlogarg = 1.0 - rr0sq / Deltasq;
 
   // if r -> Delta, then rlogarg < 0.0 which is an error
   // issue a warning and reset rlogarg = epsilon
   // if r > 2*Delta something serious is wrong, abort
 
   if (rlogarg < 0.1) {
-    error->warning(FLERR,"FENE bond too long: {} {:.8}",
-                   update->ntimestep,sqrt(rsq));
+    error->warning(FLERR, "FENE bond too long: {} {:.8}", update->ntimestep, sqrt(rsq));
     rlogarg = 0.1;
   }
 
-  double eng = -0.5 * k[type]*log(rlogarg);
-  fforce = -k[type]*rr0/rlogarg/Deltasq/r;
+  double eng = -0.5 * k[type] * log(rlogarg);
+  fforce = -k[type] * rr0 / rlogarg / Deltasq / r;
 
   return eng;
 }
diff --git a/src/COMPRESS/zstd_file_writer.h b/src/COMPRESS/zstd_file_writer.h
index 3789d52122..3fde376b47 100644
--- a/src/COMPRESS/zstd_file_writer.h
+++ b/src/COMPRESS/zstd_file_writer.h
@@ -29,7 +29,6 @@
 #error must have at least zstd version 1.4 to compile with -DLAMMPS_ZSTD
 #endif
 
-
 namespace LAMMPS_NS {
 
 class ZstdFileWriter : public FileWriter {
diff --git a/src/DIELECTRIC/fix_polarize_bem_gmres.cpp b/src/DIELECTRIC/fix_polarize_bem_gmres.cpp
index 667f0efc26..62febf13c2 100644
--- a/src/DIELECTRIC/fix_polarize_bem_gmres.cpp
+++ b/src/DIELECTRIC/fix_polarize_bem_gmres.cpp
@@ -431,7 +431,7 @@ void FixPolarizeBEMGMRES::gmres_solve(double *x, double *r)
 
     // fill up h with zero
 
-    memset(h, 0, (size_t)(mr + 1) * mr * sizeof(double));
+    memset(h, 0, (size_t) (mr + 1) * mr * sizeof(double));
 
     // the inner loop k = 1..(n-1)
     // build up the k-th Krylov space,
@@ -524,7 +524,7 @@ void FixPolarizeBEMGMRES::gmres_solve(double *x, double *r)
 
 #ifdef _POLARIZE_DEBUG
       if (comm->me == 0)
-        error->warning(FLERR,"itr = {}: k = {}, norm(r) = {} norm(b) = {}", itr, k, rho, normb);
+        error->warning(FLERR, "itr = {}: k = {}, norm(r) = {} norm(b) = {}", itr, k, rho, normb);
 #endif
       if (rho <= rho_tol && rho <= tol_abs) break;
     }
@@ -742,17 +742,17 @@ double FixPolarizeBEMGMRES::vec_dot(const double *a1, const double *a2, int n)
 double FixPolarizeBEMGMRES::memory_usage()
 {
   double bytes = 0;
-  bytes += mat_dim * sizeof(double);          // induced_charges
-  bytes += mat_dim * sizeof(double);          // buffer
-  bytes += mat_dim * sizeof(double);          // rhs
-  bytes += atom->nmax * sizeof(double);       // induced_charge_idx
-  bytes += atom->nmax * sizeof(double);       // q_backup
-  bytes += mr * sizeof(double);               // c
-  bytes += (mr + 1) * sizeof(double);         // g
+  bytes += mat_dim * sizeof(double);                   // induced_charges
+  bytes += mat_dim * sizeof(double);                   // buffer
+  bytes += mat_dim * sizeof(double);                   // rhs
+  bytes += atom->nmax * sizeof(double);                // induced_charge_idx
+  bytes += atom->nmax * sizeof(double);                // q_backup
+  bytes += mr * sizeof(double);                        // c
+  bytes += (mr + 1) * sizeof(double);                  // g
   bytes += (double) (mr + 1) * mr * sizeof(double);    // h
-  bytes += mat_dim * sizeof(double);          // r
+  bytes += mat_dim * sizeof(double);                   // r
   bytes += (double) mr * (mr + 1) * sizeof(double);    // s
-  bytes += mat_dim * sizeof(double);          // v
+  bytes += mat_dim * sizeof(double);                   // v
   bytes += (double) (mr + 1) * mr * sizeof(double);    // y
   return bytes;
 }
@@ -868,7 +868,8 @@ void FixPolarizeBEMGMRES::set_arrays(int i)
 
 /* ---------------------------------------------------------------------- */
 
-int FixPolarizeBEMGMRES::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/)
+int FixPolarizeBEMGMRES::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,
+                                           int * /*pbc*/)
 {
   int m;
   for (m = 0; m < n; m++) buf[m] = atom->q[list[m]];
diff --git a/src/DIELECTRIC/fix_polarize_bem_icc.cpp b/src/DIELECTRIC/fix_polarize_bem_icc.cpp
index 10f4c62958..da9b8eb055 100644
--- a/src/DIELECTRIC/fix_polarize_bem_icc.cpp
+++ b/src/DIELECTRIC/fix_polarize_bem_icc.cpp
@@ -396,7 +396,8 @@ int FixPolarizeBEMICC::modify_param(int narg, char **arg)
 
 /* ---------------------------------------------------------------------- */
 
-int FixPolarizeBEMICC::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/)
+int FixPolarizeBEMICC::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,
+                                         int * /*pbc*/)
 {
   int m;
   for (m = 0; m < n; m++) buf[m] = atom->q[list[m]];
diff --git a/src/DIELECTRIC/fix_polarize_functional.cpp b/src/DIELECTRIC/fix_polarize_functional.cpp
index e082ba79ce..84f68e79b1 100644
--- a/src/DIELECTRIC/fix_polarize_functional.cpp
+++ b/src/DIELECTRIC/fix_polarize_functional.cpp
@@ -538,7 +538,8 @@ int FixPolarizeFunctional::unpack_exchange(int nlocal, double *buf)
 
 /* ---------------------------------------------------------------------- */
 
-int FixPolarizeFunctional::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/)
+int FixPolarizeFunctional::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,
+                                             int * /*pbc*/)
 {
   int m;
   for (m = 0; m < n; m++) buf[m] = atom->q[list[m]];
@@ -591,21 +592,21 @@ void FixPolarizeFunctional::set_arrays(int i)
 double FixPolarizeFunctional::memory_usage()
 {
   double bytes = 0;
-  bytes += square(num_induced_charges) * sizeof(double);            // inverse_matrix
-  bytes += square(num_induced_charges) * sizeof(double);            // Rww
-  bytes += square(num_induced_charges) * sizeof(double);            // G1ww
-  bytes += square(num_induced_charges) * sizeof(double);            // ndotGww
-  bytes += square(num_induced_charges) * sizeof(double);            // G2ww
-  bytes += square(num_induced_charges) * sizeof(double);            // G3ww
-  bytes += num_induced_charges * sizeof(double);                    // qiRqwVector
-  bytes += num_induced_charges * sizeof(double);                    // sum2G2wq
-  bytes += num_induced_charges * sizeof(double);                    // sum1G2qw
-  bytes += num_induced_charges * sizeof(double);                    // sum1G1qw_epsilon
-  bytes += num_induced_charges * sizeof(double);                    // sum2ndotGwq_epsilon
-  bytes += (double)num_ions * num_induced_charges * sizeof(double); // G1qw_real
-  bytes += nmax * sizeof(int);                                      // induced_charge_idx
-  bytes += nmax * sizeof(int);                                      // ion_idx
-  bytes += num_induced_charges * sizeof(double);                    // induced_charges
+  bytes += square(num_induced_charges) * sizeof(double);                // inverse_matrix
+  bytes += square(num_induced_charges) * sizeof(double);                // Rww
+  bytes += square(num_induced_charges) * sizeof(double);                // G1ww
+  bytes += square(num_induced_charges) * sizeof(double);                // ndotGww
+  bytes += square(num_induced_charges) * sizeof(double);                // G2ww
+  bytes += square(num_induced_charges) * sizeof(double);                // G3ww
+  bytes += num_induced_charges * sizeof(double);                        // qiRqwVector
+  bytes += num_induced_charges * sizeof(double);                        // sum2G2wq
+  bytes += num_induced_charges * sizeof(double);                        // sum1G2qw
+  bytes += num_induced_charges * sizeof(double);                        // sum1G1qw_epsilon
+  bytes += num_induced_charges * sizeof(double);                        // sum2ndotGwq_epsilon
+  bytes += (double) num_ions * num_induced_charges * sizeof(double);    // G1qw_real
+  bytes += nmax * sizeof(int);                                          // induced_charge_idx
+  bytes += nmax * sizeof(int);                                          // ion_idx
+  bytes += num_induced_charges * sizeof(double);                        // induced_charges
   return bytes;
 }
 
diff --git a/src/DIELECTRIC/pair_coul_cut_dielectric.cpp b/src/DIELECTRIC/pair_coul_cut_dielectric.cpp
index d5ead44512..9c3be2a80a 100644
--- a/src/DIELECTRIC/pair_coul_cut_dielectric.cpp
+++ b/src/DIELECTRIC/pair_coul_cut_dielectric.cpp
@@ -22,11 +22,11 @@
 #include "comm.h"
 #include "error.h"
 #include "force.h"
-#include "neighbor.h"
+#include "math_const.h"
+#include "memory.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
-#include "memory.h"
-#include "math_const.h"
+#include "neighbor.h"
 
 #include 
 #include 
@@ -55,28 +55,28 @@ PairCoulCutDielectric::~PairCoulCutDielectric()
 
 void PairCoulCutDielectric::compute(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double qtmp,etmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul;
-  double fpair_i,fpair_j;
-  double rsq,r2inv,rinv,forcecoul,factor_coul,efield_i;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double qtmp, etmp, xtmp, ytmp, ztmp, delx, dely, delz, ecoul;
+  double fpair_i, fpair_j;
+  double rsq, r2inv, rinv, forcecoul, factor_coul, efield_i;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   if (atom->nmax > nmax) {
     memory->destroy(efield);
     nmax = atom->nmax;
-    memory->create(efield,nmax,3,"pair:efield");
+    memory->create(efield, nmax, 3, "pair:efield");
   }
 
   ecoul = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   double **x = atom->x;
   double **f = atom->f;
   double *q = atom->q;
-  double* eps = atom->epsilon;
-  double** norm = atom->mu;
-  double* curvature = atom->curvature;
-  double* area = atom->area;
+  double *eps = atom->epsilon;
+  double **norm = atom->mu;
+  double *curvature = atom->curvature;
+  double *area = atom->area;
   int *type = atom->type;
   int nlocal = atom->nlocal;
   double *special_coul = force->special_coul;
@@ -105,10 +105,10 @@ void PairCoulCutDielectric::compute(int eflag, int vflag)
 
     double curvature_threshold = sqrt(area[i]);
     if (curvature[i] < curvature_threshold) {
-      double sf = curvature[i]/(4.0*MY_PIS*curvature_threshold) * area[i]*q[i];
-      efield[i][0] = sf*norm[i][0];
-      efield[i][1] = sf*norm[i][1];
-      efield[i][2] = sf*norm[i][2];
+      double sf = curvature[i] / (4.0 * MY_PIS * curvature_threshold) * area[i] * q[i];
+      efield[i][0] = sf * norm[i][0];
+      efield[i][1] = sf * norm[i][1];
+      efield[i][2] = sf * norm[i][2];
     } else {
       efield[i][0] = efield[i][1] = efield[i][2] = 0;
     }
@@ -121,37 +121,37 @@ void PairCoulCutDielectric::compute(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       jtype = type[j];
 
       if (rsq < cutsq[itype][jtype] && rsq > EPSILON) {
-        r2inv = 1.0/rsq;
+        r2inv = 1.0 / rsq;
         rinv = sqrt(r2inv);
-        efield_i = scale[itype][jtype] * q[j]*rinv;
-        forcecoul = qtmp*efield_i;
+        efield_i = scale[itype][jtype] * q[j] * rinv;
+        forcecoul = qtmp * efield_i;
 
-        fpair_i = factor_coul*etmp*forcecoul*r2inv;
-        f[i][0] += delx*fpair_i;
-        f[i][1] += dely*fpair_i;
-        f[i][2] += delz*fpair_i;
+        fpair_i = factor_coul * etmp * forcecoul * r2inv;
+        f[i][0] += delx * fpair_i;
+        f[i][1] += dely * fpair_i;
+        f[i][2] += delz * fpair_i;
 
-        efield_i *= (factor_coul*etmp*r2inv);
-        efield[i][0] += delx*efield_i;
-        efield[i][1] += dely*efield_i;
-        efield[i][2] += delz*efield_i;
+        efield_i *= (factor_coul * etmp * r2inv);
+        efield[i][0] += delx * efield_i;
+        efield[i][1] += dely * efield_i;
+        efield[i][2] += delz * efield_i;
 
         if (newton_pair && j >= nlocal) {
-          fpair_j = factor_coul*eps[j]*forcecoul*r2inv;
-          f[j][0] -= delx*fpair_j;
-          f[j][1] -= dely*fpair_j;
-          f[j][2] -= delz*fpair_j;
+          fpair_j = factor_coul * eps[j] * forcecoul * r2inv;
+          f[j][0] -= delx * fpair_j;
+          f[j][1] -= dely * fpair_j;
+          f[j][2] -= delz * fpair_j;
         }
 
         if (eflag) {
-          ecoul = factor_coul * qqrd2e * scale[itype][jtype] * qtmp*q[j]*(etmp+eps[j])*rinv;
+          ecoul = factor_coul * qqrd2e * scale[itype][jtype] * qtmp * q[j] * (etmp + eps[j]) * rinv;
           ecoul *= 0.5;
         }
-        if (evflag) ev_tally_full(i,0.0,ecoul,fpair_i,delx,dely,delz);
+        if (evflag) ev_tally_full(i, 0.0, ecoul, fpair_i, delx, dely, delz);
       }
     }
   }
@@ -159,7 +159,6 @@ void PairCoulCutDielectric::compute(int eflag, int vflag)
   if (vflag_fdotr) virial_fdotr_compute();
 }
 
-
 /* ----------------------------------------------------------------------
    init specific to this pair style
 ------------------------------------------------------------------------- */
@@ -167,34 +166,36 @@ void PairCoulCutDielectric::compute(int eflag, int vflag)
 void PairCoulCutDielectric::init_style()
 {
   avec = (AtomVecDielectric *) atom->style_match("dielectric");
-  if (!avec) error->all(FLERR,"Pair coul/cut/dielectric requires atom style dielectric");
+  if (!avec) error->all(FLERR, "Pair coul/cut/dielectric requires atom style dielectric");
 
-  int irequest = neighbor->request(this,instance_me);
+  int irequest = neighbor->request(this, instance_me);
   neighbor->requests[irequest]->half = 0;
   neighbor->requests[irequest]->full = 1;
 }
 
 /* ---------------------------------------------------------------------- */
 
-double PairCoulCutDielectric::single(int i, int j, int /*itype*/, int /*jtype*/,
-                                     double rsq,
-                                     double factor_coul, double /*factor_lj*/,
-                                     double &fforce)
+double PairCoulCutDielectric::single(int i, int j, int /*itype*/, int /*jtype*/, double rsq,
+                                     double factor_coul, double /*factor_lj*/, double &fforce)
 {
-  double r2inv,phicoul,ei,ej;
-  double* eps = atom->epsilon;
+  double r2inv, phicoul, ei, ej;
+  double *eps = atom->epsilon;
 
-  r2inv = 1.0/rsq;
-  fforce = force->qqrd2e * atom->q[i]*atom->q[j]*sqrt(r2inv)*eps[i];
+  r2inv = 1.0 / rsq;
+  fforce = force->qqrd2e * atom->q[i] * atom->q[j] * sqrt(r2inv) * eps[i];
 
   double eng = 0.0;
-  if (eps[i] == 1) ei = 0;
-  else ei = eps[i];
-  if (eps[j] == 1) ej = 0;
-  else ej = eps[j];
-  phicoul = force->qqrd2e * atom->q[i]*atom->q[j]*sqrt(r2inv);
-  phicoul *= 0.5*(ei+ej);
-  eng += factor_coul*phicoul;
+  if (eps[i] == 1)
+    ei = 0;
+  else
+    ei = eps[i];
+  if (eps[j] == 1)
+    ej = 0;
+  else
+    ej = eps[j];
+  phicoul = force->qqrd2e * atom->q[i] * atom->q[j] * sqrt(r2inv);
+  phicoul *= 0.5 * (ei + ej);
+  eng += factor_coul * phicoul;
 
   return eng;
 }
diff --git a/src/DIELECTRIC/pair_lj_long_coul_long_dielectric.cpp b/src/DIELECTRIC/pair_lj_long_coul_long_dielectric.cpp
index 0d0c7074bb..922e24f0ea 100644
--- a/src/DIELECTRIC/pair_lj_long_coul_long_dielectric.cpp
+++ b/src/DIELECTRIC/pair_lj_long_coul_long_dielectric.cpp
@@ -267,7 +267,8 @@ void PairLJLongCoulLongDielectric::compute(int eflag, int vflag)
             if (eflag) evdwl = f * (rn * (rn * lj3i[jtype] - lj4i[jtype]) - offseti[jtype]);
           }
         }
-      } else force_lj = evdwl = 0.0;
+      } else
+        force_lj = evdwl = 0.0;
 
       fpair_i = (force_coul * etmp + force_lj) * r2inv;
       f[i][0] += delx * fpair_i;
diff --git a/src/DIPOLE/angle_dipole.cpp b/src/DIPOLE/angle_dipole.cpp
index f7724e2b56..b3d269fdb7 100644
--- a/src/DIPOLE/angle_dipole.cpp
+++ b/src/DIPOLE/angle_dipole.cpp
@@ -184,7 +184,7 @@ void AngleDipole::coeff(int narg, char **arg)
 void AngleDipole::init_style()
 {
   if (!atom->mu_flag || !atom->torque_flag)
-    error->all(FLERR,"Angle style dipole requires atom attributes mu and torque");
+    error->all(FLERR, "Angle style dipole requires atom attributes mu and torque");
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/FEP/pair_morse_soft.cpp b/src/FEP/pair_morse_soft.cpp
index db7c4eca6c..c7c10b249e 100644
--- a/src/FEP/pair_morse_soft.cpp
+++ b/src/FEP/pair_morse_soft.cpp
@@ -15,11 +15,11 @@
 
 #include "atom.h"
 #include "comm.h"
-#include "force.h"
-#include "neigh_list.h"
-#include "memory.h"
-#include "math_special.h"
 #include "error.h"
+#include "force.h"
+#include "math_special.h"
+#include "memory.h"
+#include "neigh_list.h"
 
 #include 
 #include 
@@ -35,25 +35,23 @@ using namespace MathSpecial;
 
 PairMorseSoft::~PairMorseSoft()
 {
-  if (allocated) {
-    memory->destroy(lambda);
-  }
+  if (allocated) { memory->destroy(lambda); }
 }
 
 /* ---------------------------------------------------------------------- */
 
 void PairMorseSoft::compute(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
-  double rsq,r,dr,dexp,dexp2,dexp3,factor_lj;
-  double ea,phi,V0,iea2;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair;
+  double rsq, r, dr, dexp, dexp2, dexp3, factor_lj;
+  double ea, phi, V0, iea2;
   double D, a, x0, l, B, s1, llf;
 
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   evdwl = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   double **x = atom->x;
   double **f = atom->f;
@@ -86,68 +84,64 @@ void PairMorseSoft::compute(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       jtype = type[j];
 
       if (rsq < cutsq[itype][jtype]) {
         r = sqrt(rsq);
         dr = r - r0[itype][jtype];
 
-        D  = d0[itype][jtype];
-        a  = alpha[itype][jtype];
+        D = d0[itype][jtype];
+        a = alpha[itype][jtype];
         x0 = r0[itype][jtype];
-        dexp = exp( -a * dr );
-        dexp2 = dexp*dexp;
-        dexp3 = dexp2*dexp;
+        dexp = exp(-a * dr);
+        dexp2 = dexp * dexp;
+        dexp3 = dexp2 * dexp;
 
         l = lambda[itype][jtype];
 
-        ea  = exp( a * x0 );
-        iea2 = exp( -2.*a*x0 );
+        ea = exp(a * x0);
+        iea2 = exp(-2. * a * x0);
 
-        V0 = D * dexp * ( dexp - 2.0 );
-        B = -2.0 * D * iea2 * ( ea - 1.0 ) / 3.0;
+        V0 = D * dexp * (dexp - 2.0);
+        B = -2.0 * D * iea2 * (ea - 1.0) / 3.0;
 
         if (l >= shift_range) {
-          s1  = (l - 1.0) / (shift_range - 1.0);
-          phi = V0 + B*dexp3 * s1;
+          s1 = (l - 1.0) / (shift_range - 1.0);
+          phi = V0 + B * dexp3 * s1;
 
           // Force computation:
-          fpair = 3.0*a*B*dexp3*s1 + 2.0*a*D*(dexp2 - dexp);
+          fpair = 3.0 * a * B * dexp3 * s1 + 2.0 * a * D * (dexp2 - dexp);
           fpair /= r;
         } else {
-          llf = MathSpecial::powint( l / shift_range, nlambda );
-          phi = V0 + B*dexp3;
+          llf = MathSpecial::powint(l / shift_range, nlambda);
+          phi = V0 + B * dexp3;
           phi *= llf;
 
           // Force computation:
           if (r == 0.0) {
             fpair = 0.0;
           } else {
-            fpair = 3.0*a*B*dexp3 + 2.0*a*D*(dexp2 - dexp);
+            fpair = 3.0 * a * B * dexp3 + 2.0 * a * D * (dexp2 - dexp);
             fpair *= llf / r;
           }
         }
 
         fpair *= factor_lj;
 
-
-        f[i][0] += delx*fpair;
-        f[i][1] += dely*fpair;
-        f[i][2] += delz*fpair;
+        f[i][0] += delx * fpair;
+        f[i][1] += dely * fpair;
+        f[i][2] += delz * fpair;
 
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fpair;
-          f[j][1] -= dely*fpair;
-          f[j][2] -= delz*fpair;
+          f[j][0] -= delx * fpair;
+          f[j][1] -= dely * fpair;
+          f[j][2] -= delz * fpair;
         }
 
-        if (eflag) {
-          evdwl = phi*factor_lj;
-        }
+        if (eflag) { evdwl = phi * factor_lj; }
 
-        if (evflag) ev_tally(i,j,nlocal,newton_pair,
-                             evdwl,0.0,fpair,delx,dely,delz);
+        if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
       }
     }
   }
@@ -163,7 +157,7 @@ void PairMorseSoft::allocate()
 {
   PairMorse::allocate();
   int n = atom->ntypes;
-  memory->create(lambda,n+1,n+1,"pair:lambda");
+  memory->create(lambda, n + 1, n + 1, "pair:lambda");
 }
 
 /* ----------------------------------------------------------------------
@@ -172,35 +166,35 @@ void PairMorseSoft::allocate()
 
 void PairMorseSoft::coeff(int narg, char **arg)
 {
-  if (narg < 6 || narg > 7) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (narg < 6 || narg > 7) error->all(FLERR, "Incorrect args for pair coefficients");
   if (!allocated) allocate();
 
-  int ilo,ihi,jlo,jhi;
-  utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
-  utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
+  int ilo, ihi, jlo, jhi;
+  utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
+  utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
 
-  double d0_one     = utils::numeric(FLERR,arg[2],false,lmp);
-  double alpha_one  = utils::numeric(FLERR,arg[3],false,lmp);
-  double r0_one     = utils::numeric(FLERR,arg[4],false,lmp);
-  double lambda_one = utils::numeric(FLERR,arg[5],false,lmp);
+  double d0_one = utils::numeric(FLERR, arg[2], false, lmp);
+  double alpha_one = utils::numeric(FLERR, arg[3], false, lmp);
+  double r0_one = utils::numeric(FLERR, arg[4], false, lmp);
+  double lambda_one = utils::numeric(FLERR, arg[5], false, lmp);
 
   double cut_one = cut_global;
-  if (narg == 7) cut_one = utils::numeric(FLERR,arg[6],false,lmp);
+  if (narg == 7) cut_one = utils::numeric(FLERR, arg[6], false, lmp);
 
   int count = 0;
   for (int i = ilo; i <= ihi; i++) {
-    for (int j = MAX(jlo,i); j <= jhi; j++) {
-      d0[i][j]      = d0_one;
-      alpha[i][j]   = alpha_one;
-      r0[i][j]      = r0_one;
-      lambda[i][j]  = lambda_one;
-      cut[i][j]     = cut_one;
+    for (int j = MAX(jlo, i); j <= jhi; j++) {
+      d0[i][j] = d0_one;
+      alpha[i][j] = alpha_one;
+      r0[i][j] = r0_one;
+      lambda[i][j] = lambda_one;
+      cut[i][j] = cut_one;
       setflag[i][j] = 1;
       count++;
     }
   }
 
-  if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
 }
 
 /* ----------------------------------------------------------------------
@@ -209,65 +203,64 @@ void PairMorseSoft::coeff(int narg, char **arg)
 
 void PairMorseSoft::settings(int narg, char **arg)
 {
-  if (narg != 3) error->all(FLERR,"Illegal pair_style command");
+  if (narg != 3) error->all(FLERR, "Illegal pair_style command");
 
-  nlambda     = utils::inumeric(FLERR,arg[0],false,lmp);
-  shift_range = utils::numeric(FLERR,arg[1],false,lmp);
-  cut_global  = utils::numeric(FLERR,arg[2],false,lmp);
+  nlambda = utils::inumeric(FLERR, arg[0], false, lmp);
+  shift_range = utils::numeric(FLERR, arg[1], false, lmp);
+  cut_global = utils::numeric(FLERR, arg[2], false, lmp);
 
   // reset cutoffs that have been explicitly set
 
   if (allocated) {
-    int i,j;
+    int i, j;
     for (i = 1; i <= atom->ntypes; i++)
       for (j = i; j <= atom->ntypes; j++)
         if (setflag[i][j]) cut[i][j] = cut_global;
   }
 }
 
-
 /* ----------------------------------------------------------------------
    init for one type pair i,j and corresponding j,i
 ------------------------------------------------------------------------- */
 
 double PairMorseSoft::init_one(int i, int j)
 {
-  if (setflag[i][j] == 0)
-    error->all(FLERR,"All pair coeffs are not set");
+  if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set");
 
-  morse1[i][j] = 2.0*d0[i][j]*alpha[i][j];
+  morse1[i][j] = 2.0 * d0[i][j] * alpha[i][j];
 
   if (offset_flag) {
     double l, s1, V0, B, llf;
     double alpha_dr = -alpha[i][j] * (cut[i][j] - r0[i][j]);
-    double D  = d0[i][j];
-    double a  = alpha[i][j];
+    double D = d0[i][j];
+    double a = alpha[i][j];
     double x0 = r0[i][j];
-    double dexp  = exp( alpha_dr );
-    double dexp2 = dexp*dexp;
-    double dexp3 = dexp2*dexp;
+    double dexp = exp(alpha_dr);
+    double dexp2 = dexp * dexp;
+    double dexp3 = dexp2 * dexp;
 
     l = lambda[i][j];
 
-    double ea  = exp( a*x0 );
-    double iea2 = exp( -2.*a*x0 );
+    double ea = exp(a * x0);
+    double iea2 = exp(-2. * a * x0);
 
-    V0 = D * dexp * ( dexp - 2.0 );
-    B = -2.0 * D * iea2 * ( ea - 1.0 ) / 3.0;
+    V0 = D * dexp * (dexp - 2.0);
+    B = -2.0 * D * iea2 * (ea - 1.0) / 3.0;
 
     if (l >= shift_range) {
-      s1  = (l - 1.0) / (shift_range - 1.0);
-      offset[i][j] = V0 + B*dexp3 * s1;
+      s1 = (l - 1.0) / (shift_range - 1.0);
+      offset[i][j] = V0 + B * dexp3 * s1;
     } else {
-      llf = MathSpecial::powint( l / shift_range, nlambda );
-      offset[i][j] = V0 + B*dexp3;
+      llf = MathSpecial::powint(l / shift_range, nlambda);
+      offset[i][j] = V0 + B * dexp3;
       offset[i][j] *= llf;
     }
-  } else offset[i][j] = 0.0;
+  } else
+    offset[i][j] = 0.0;
 
-  d0[j][i]     = d0[i][j];
-  alpha[j][i]  = alpha[i][j];
-  r0[j][i]     = r0[i][j];
+  d0[j][i] = d0[i][j];
+  alpha[j][i] = alpha[i][j];
+  r0[j][i] = r0[i][j];
   morse1[j][i] = morse1[i][j];
   lambda[j][i] = lambda[i][j];
   offset[j][i] = offset[i][j];
@@ -283,16 +276,16 @@ void PairMorseSoft::write_restart(FILE *fp)
 {
   write_restart_settings(fp);
 
-  int i,j;
+  int i, j;
   for (i = 1; i <= atom->ntypes; i++) {
     for (j = i; j <= atom->ntypes; j++) {
-      fwrite(&setflag[i][j],sizeof(int),1,fp);
+      fwrite(&setflag[i][j], sizeof(int), 1, fp);
       if (setflag[i][j]) {
-        fwrite(&d0[i][j],sizeof(double),1,fp);
-        fwrite(&alpha[i][j],sizeof(double),1,fp);
-        fwrite(&r0[i][j],sizeof(double),1,fp);
-        fwrite(&lambda[i][j],sizeof(double),1,fp);
-        fwrite(&cut[i][j],sizeof(double),1,fp);
+        fwrite(&d0[i][j], sizeof(double), 1, fp);
+        fwrite(&alpha[i][j], sizeof(double), 1, fp);
+        fwrite(&r0[i][j], sizeof(double), 1, fp);
+        fwrite(&lambda[i][j], sizeof(double), 1, fp);
+        fwrite(&cut[i][j], sizeof(double), 1, fp);
       }
     }
   }
@@ -308,25 +301,25 @@ void PairMorseSoft::read_restart(FILE *fp)
 
   allocate();
 
-  int i,j;
+  int i, j;
   int me = comm->me;
   for (i = 1; i <= atom->ntypes; i++) {
     for (j = i; j <= atom->ntypes; j++) {
-      if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error);
-      MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
+      if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error);
+      MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world);
       if (setflag[i][j]) {
         if (me == 0) {
-          utils::sfread(FLERR,&d0[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&alpha[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&r0[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&lambda[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&cut[i][j],sizeof(double),1,fp,nullptr,error);
+          utils::sfread(FLERR, &d0[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &alpha[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &r0[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &lambda[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error);
         }
-        MPI_Bcast(&d0[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&alpha[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&r0[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&lambda[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
+        MPI_Bcast(&d0[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&alpha[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&r0[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&lambda[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world);
       }
     }
   }
@@ -338,11 +331,11 @@ void PairMorseSoft::read_restart(FILE *fp)
 
 void PairMorseSoft::write_restart_settings(FILE *fp)
 {
-  fwrite(&nlambda,sizeof(double),1,fp);
-  fwrite(&shift_range,sizeof(double),1,fp);
-  fwrite(&cut_global,sizeof(double),1,fp);
-  fwrite(&offset_flag,sizeof(int),1,fp);
-  fwrite(&mix_flag,sizeof(int),1,fp);
+  fwrite(&nlambda, sizeof(double), 1, fp);
+  fwrite(&shift_range, sizeof(double), 1, fp);
+  fwrite(&cut_global, sizeof(double), 1, fp);
+  fwrite(&offset_flag, sizeof(int), 1, fp);
+  fwrite(&mix_flag, sizeof(int), 1, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -353,20 +346,19 @@ void PairMorseSoft::read_restart_settings(FILE *fp)
 {
   int me = comm->me;
   if (me == 0) {
-    utils::sfread(FLERR,&nlambda,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&shift_range,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error);
+    utils::sfread(FLERR, &nlambda, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &shift_range, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &cut_global, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &offset_flag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &mix_flag, sizeof(int), 1, fp, nullptr, error);
   }
-  MPI_Bcast(&nlambda,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&shift_range,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&offset_flag,1,MPI_INT,0,world);
-  MPI_Bcast(&mix_flag,1,MPI_INT,0,world);
+  MPI_Bcast(&nlambda, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&shift_range, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&cut_global, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&offset_flag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&mix_flag, 1, MPI_INT, 0, world);
 }
 
-
 /* ----------------------------------------------------------------------
    proc 0 writes to data file
 ------------------------------------------------------------------------- */
@@ -374,8 +366,7 @@ void PairMorseSoft::read_restart_settings(FILE *fp)
 void PairMorseSoft::write_data(FILE *fp)
 {
   for (int i = 1; i <= atom->ntypes; i++)
-    fprintf(fp,"%d %g %g %g %g\n",i,d0[i][i],alpha[i][i],r0[i][i],
-            lambda[i][i]);
+    fprintf(fp, "%d %g %g %g %g\n", i, d0[i][i], alpha[i][i], r0[i][i], lambda[i][i]);
 }
 
 /* ----------------------------------------------------------------------
@@ -386,61 +377,60 @@ void PairMorseSoft::write_data_all(FILE *fp)
 {
   for (int i = 1; i <= atom->ntypes; i++)
     for (int j = i; j <= atom->ntypes; j++)
-      fprintf(fp,"%d %d %g %g %g %g %g\n",i,j,d0[i][j],alpha[i][j],r0[i][j],
-              lambda[i][j],cut[i][j]);
+      fprintf(fp, "%d %d %g %g %g %g %g\n", i, j, d0[i][j], alpha[i][j], r0[i][j], lambda[i][j],
+              cut[i][j]);
 }
 
 /* ---------------------------------------------------------------------- */
 
 double PairMorseSoft::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
-                             double /*factor_coul*/, double factor_lj,
-                             double &fforce)
+                             double /*factor_coul*/, double factor_lj, double &fforce)
 {
   double r, dr, dexp, dexp2, dexp3, phi;
   double B, D, a, ea, iea2;
   double x0, V0, s1, l, llf;
 
-  D  = d0[itype][jtype];
-  a  = alpha[itype][jtype];
+  D = d0[itype][jtype];
+  a = alpha[itype][jtype];
   x0 = r0[itype][jtype];
   r = sqrt(rsq);
   dr = r - r0[itype][jtype];
-  dexp = exp( -a * dr );
-  dexp2 = dexp*dexp;
-  dexp3 = dexp2*dexp;
+  dexp = exp(-a * dr);
+  dexp2 = dexp * dexp;
+  dexp3 = dexp2 * dexp;
 
   l = lambda[itype][jtype];
 
-  ea  = exp( a * x0 );
-  iea2 = exp( -2.*a*x0 );
+  ea = exp(a * x0);
+  iea2 = exp(-2. * a * x0);
 
-  V0 = D * dexp * ( dexp - 2.0 );
-  B = -2.0 * D * iea2 * ( ea - 1.0 ) / 3.0;
+  V0 = D * dexp * (dexp - 2.0);
+  B = -2.0 * D * iea2 * (ea - 1.0) / 3.0;
 
   if (l >= shift_range) {
-    s1  = (l - 1.0) / (shift_range - 1.0);
-    phi = V0 + B*dexp3 * s1;
+    s1 = (l - 1.0) / (shift_range - 1.0);
+    phi = V0 + B * dexp3 * s1;
 
     // Force computation:
-    fforce = 3.0*a*B*dexp3*s1 + 2.0*a*D*(dexp2 - dexp);
+    fforce = 3.0 * a * B * dexp3 * s1 + 2.0 * a * D * (dexp2 - dexp);
     fforce /= r;
   } else {
-    llf = MathSpecial::powint( l / shift_range, nlambda );
-    phi = V0 + B*dexp3;
+    llf = MathSpecial::powint(l / shift_range, nlambda);
+    phi = V0 + B * dexp3;
     phi *= llf;
 
     // Force computation:
     if (r == 0.0) {
       fforce = 0.0;
     } else {
-      fforce = 3.0*a*B*dexp3 + 2.0*a*D*(dexp2 - dexp);
+      fforce = 3.0 * a * B * dexp3 + 2.0 * a * D * (dexp2 - dexp);
       fforce *= llf / r;
     }
   }
 
   fforce *= factor_lj;
   phi -= offset[itype][jtype];
-  return factor_lj*phi;
+  return factor_lj * phi;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -448,9 +438,9 @@ double PairMorseSoft::single(int /*i*/, int /*j*/, int itype, int jtype, double
 void *PairMorseSoft::extract(const char *str, int &dim)
 {
   dim = 2;
-  if (strcmp(str,"d0") == 0) return (void *) d0;
-  if (strcmp(str,"r0") == 0) return (void *) r0;
-  if (strcmp(str,"alpha") == 0) return (void *) alpha;
-  if (strcmp(str,"lambda") == 0) return (void *) lambda;
+  if (strcmp(str, "d0") == 0) return (void *) d0;
+  if (strcmp(str, "r0") == 0) return (void *) r0;
+  if (strcmp(str, "alpha") == 0) return (void *) alpha;
+  if (strcmp(str, "lambda") == 0) return (void *) lambda;
   return nullptr;
 }
diff --git a/src/GRANULAR/compute_fabric.cpp b/src/GRANULAR/compute_fabric.cpp
index a09327e2d5..341e32b867 100644
--- a/src/GRANULAR/compute_fabric.cpp
+++ b/src/GRANULAR/compute_fabric.cpp
@@ -592,4 +592,3 @@ double ComputeFabric::compute_scalar()
   scalar = nc;
   return nc;
 }
-
diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp
index e6013b9940..9bf2ae12d2 100644
--- a/src/GRANULAR/pair_gran_hooke_history.cpp
+++ b/src/GRANULAR/pair_gran_hooke_history.cpp
@@ -67,8 +67,8 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp)
   // this is so final order of Modify:fix will conform to input script
 
   fix_history = nullptr;
-  fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_HH_DUMMY"
-                                           + std::to_string(instance_me) + " all DUMMY");
+  fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_HH_DUMMY" + std::to_string(instance_me) +
+                                           " all DUMMY");
 }
 
 /* ---------------------------------------------------------------------- */
@@ -77,19 +77,21 @@ PairGranHookeHistory::~PairGranHookeHistory()
 {
   if (copymode) return;
 
-  delete [] svector;
+  delete[] svector;
 
-  if (!fix_history) modify->delete_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me));
-  else modify->delete_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me));
+  if (!fix_history)
+    modify->delete_fix("NEIGH_HISTORY_HH_DUMMY" + std::to_string(instance_me));
+  else
+    modify->delete_fix("NEIGH_HISTORY_HH" + std::to_string(instance_me));
 
   if (allocated) {
     memory->destroy(setflag);
     memory->destroy(cutsq);
 
-    delete [] onerad_dynamic;
-    delete [] onerad_frozen;
-    delete [] maxrad_dynamic;
-    delete [] maxrad_frozen;
+    delete[] onerad_dynamic;
+    delete[] onerad_frozen;
+    delete[] maxrad_dynamic;
+    delete[] maxrad_frozen;
   }
 
   memory->destroy(mass_rigid);
@@ -99,20 +101,20 @@ PairGranHookeHistory::~PairGranHookeHistory()
 
 void PairGranHookeHistory::compute(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum;
-  double xtmp,ytmp,ztmp,delx,dely,delz,fx,fy,fz;
-  double radi,radj,radsum,rsq,r,rinv,rsqinv;
-  double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3;
-  double wr1,wr2,wr3;
-  double vtr1,vtr2,vtr3,vrel;
-  double mi,mj,meff,damp,ccel,tor1,tor2,tor3;
-  double fn,fs,fs1,fs2,fs3;
-  double shrmag,rsht;
-  int *ilist,*jlist,*numneigh,**firstneigh;
-  int *touch,**firsttouch;
-  double *shear,*allshear,**firstshear;
+  int i, j, ii, jj, inum, jnum;
+  double xtmp, ytmp, ztmp, delx, dely, delz, fx, fy, fz;
+  double radi, radj, radsum, rsq, r, rinv, rsqinv;
+  double vr1, vr2, vr3, vnnr, vn1, vn2, vn3, vt1, vt2, vt3;
+  double wr1, wr2, wr3;
+  double vtr1, vtr2, vtr3, vrel;
+  double mi, mj, meff, damp, ccel, tor1, tor2, tor3;
+  double fn, fs, fs1, fs2, fs3;
+  double shrmag, rsht;
+  int *ilist, *jlist, *numneigh, **firstneigh;
+  int *touch, **firsttouch;
+  double *shear, *allshear, **firstshear;
 
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   int shearupdate = 1;
   if (update->setupflag) shearupdate = 0;
@@ -123,17 +125,19 @@ void PairGranHookeHistory::compute(int eflag, int vflag)
 
   if (fix_rigid && neighbor->ago == 0) {
     int tmp;
-    int *body = (int *) fix_rigid->extract("body",tmp);
-    double *mass_body = (double *) fix_rigid->extract("masstotal",tmp);
+    int *body = (int *) fix_rigid->extract("body", tmp);
+    double *mass_body = (double *) fix_rigid->extract("masstotal", tmp);
     if (atom->nmax > nmax) {
       memory->destroy(mass_rigid);
       nmax = atom->nmax;
-      memory->create(mass_rigid,nmax,"pair:mass_rigid");
+      memory->create(mass_rigid, nmax, "pair:mass_rigid");
     }
     int nlocal = atom->nlocal;
     for (i = 0; i < nlocal; i++)
-      if (body[i] >= 0) mass_rigid[i] = mass_body[body[i]];
-      else mass_rigid[i] = 0.0;
+      if (body[i] >= 0)
+        mass_rigid[i] = mass_body[body[i]];
+      else
+        mass_rigid[i] = 0.0;
     comm->forward_comm_pair(this);
   }
 
@@ -175,24 +179,24 @@ void PairGranHookeHistory::compute(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       radj = radius[j];
       radsum = radi + radj;
 
-      if (rsq >= radsum*radsum) {
+      if (rsq >= radsum * radsum) {
 
         // unset non-touching neighbors
 
         touch[jj] = 0;
-        shear = &allshear[3*jj];
+        shear = &allshear[3 * jj];
         shear[0] = 0.0;
         shear[1] = 0.0;
         shear[2] = 0.0;
 
       } else {
         r = sqrt(rsq);
-        rinv = 1.0/r;
-        rsqinv = 1.0/rsq;
+        rinv = 1.0 / r;
+        rsqinv = 1.0 / rsq;
 
         // relative translational velocity
 
@@ -202,10 +206,10 @@ void PairGranHookeHistory::compute(int eflag, int vflag)
 
         // normal component
 
-        vnnr = vr1*delx + vr2*dely + vr3*delz;
-        vn1 = delx*vnnr * rsqinv;
-        vn2 = dely*vnnr * rsqinv;
-        vn3 = delz*vnnr * rsqinv;
+        vnnr = vr1 * delx + vr2 * dely + vr3 * delz;
+        vn1 = delx * vnnr * rsqinv;
+        vn2 = dely * vnnr * rsqinv;
+        vn3 = delz * vnnr * rsqinv;
 
         // tangential component
 
@@ -215,9 +219,9 @@ void PairGranHookeHistory::compute(int eflag, int vflag)
 
         // relative rotational velocity
 
-        wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv;
-        wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv;
-        wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv;
+        wr1 = (radi * omega[i][0] + radj * omega[j][0]) * rinv;
+        wr2 = (radi * omega[i][1] + radj * omega[j][1]) * rinv;
+        wr3 = (radi * omega[i][2] + radj * omega[j][2]) * rinv;
 
         // meff = effective mass of pair of particles
         // if I or J part of rigid body, use body mass
@@ -230,99 +234,98 @@ void PairGranHookeHistory::compute(int eflag, int vflag)
           if (mass_rigid[j] > 0.0) mj = mass_rigid[j];
         }
 
-        meff = mi*mj / (mi+mj);
+        meff = mi * mj / (mi + mj);
         if (mask[i] & freeze_group_bit) meff = mj;
         if (mask[j] & freeze_group_bit) meff = mi;
 
         // normal forces = Hookian contact + normal velocity damping
 
-        damp = meff*gamman*vnnr*rsqinv;
-        ccel = kn*(radsum-r)*rinv - damp;
+        damp = meff * gamman * vnnr * rsqinv;
+        ccel = kn * (radsum - r) * rinv - damp;
         if (limit_damping && (ccel < 0.0)) ccel = 0.0;
 
         // relative velocities
 
-        vtr1 = vt1 - (delz*wr2-dely*wr3);
-        vtr2 = vt2 - (delx*wr3-delz*wr1);
-        vtr3 = vt3 - (dely*wr1-delx*wr2);
-        vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3;
+        vtr1 = vt1 - (delz * wr2 - dely * wr3);
+        vtr2 = vt2 - (delx * wr3 - delz * wr1);
+        vtr3 = vt3 - (dely * wr1 - delx * wr2);
+        vrel = vtr1 * vtr1 + vtr2 * vtr2 + vtr3 * vtr3;
         vrel = sqrt(vrel);
 
         // shear history effects
 
         touch[jj] = 1;
-        shear = &allshear[3*jj];
+        shear = &allshear[3 * jj];
 
         if (shearupdate) {
-          shear[0] += vtr1*dt;
-          shear[1] += vtr2*dt;
-          shear[2] += vtr3*dt;
+          shear[0] += vtr1 * dt;
+          shear[1] += vtr2 * dt;
+          shear[2] += vtr3 * dt;
         }
-        shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] +
-                      shear[2]*shear[2]);
+        shrmag = sqrt(shear[0] * shear[0] + shear[1] * shear[1] + shear[2] * shear[2]);
 
         // rotate shear displacements
 
-        rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz;
+        rsht = shear[0] * delx + shear[1] * dely + shear[2] * delz;
         rsht *= rsqinv;
         if (shearupdate) {
-          shear[0] -= rsht*delx;
-          shear[1] -= rsht*dely;
-          shear[2] -= rsht*delz;
+          shear[0] -= rsht * delx;
+          shear[1] -= rsht * dely;
+          shear[2] -= rsht * delz;
         }
 
         // tangential forces = shear + tangential velocity damping
 
-        fs1 = - (kt*shear[0] + meff*gammat*vtr1);
-        fs2 = - (kt*shear[1] + meff*gammat*vtr2);
-        fs3 = - (kt*shear[2] + meff*gammat*vtr3);
+        fs1 = -(kt * shear[0] + meff * gammat * vtr1);
+        fs2 = -(kt * shear[1] + meff * gammat * vtr2);
+        fs3 = -(kt * shear[2] + meff * gammat * vtr3);
 
         // rescale frictional displacements and forces if needed
 
-        fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3);
-        fn = xmu * fabs(ccel*r);
+        fs = sqrt(fs1 * fs1 + fs2 * fs2 + fs3 * fs3);
+        fn = xmu * fabs(ccel * r);
 
         if (fs > fn) {
           if (shrmag != 0.0) {
-            shear[0] = (fn/fs) * (shear[0] + meff*gammat*vtr1/kt) -
-              meff*gammat*vtr1/kt;
-            shear[1] = (fn/fs) * (shear[1] + meff*gammat*vtr2/kt) -
-              meff*gammat*vtr2/kt;
-            shear[2] = (fn/fs) * (shear[2] + meff*gammat*vtr3/kt) -
-              meff*gammat*vtr3/kt;
-            fs1 *= fn/fs;
-            fs2 *= fn/fs;
-            fs3 *= fn/fs;
-          } else fs1 = fs2 = fs3 = 0.0;
+            shear[0] =
+                (fn / fs) * (shear[0] + meff * gammat * vtr1 / kt) - meff * gammat * vtr1 / kt;
+            shear[1] =
+                (fn / fs) * (shear[1] + meff * gammat * vtr2 / kt) - meff * gammat * vtr2 / kt;
+            shear[2] =
+                (fn / fs) * (shear[2] + meff * gammat * vtr3 / kt) - meff * gammat * vtr3 / kt;
+            fs1 *= fn / fs;
+            fs2 *= fn / fs;
+            fs3 *= fn / fs;
+          } else
+            fs1 = fs2 = fs3 = 0.0;
         }
 
         // forces & torques
 
-        fx = delx*ccel + fs1;
-        fy = dely*ccel + fs2;
-        fz = delz*ccel + fs3;
+        fx = delx * ccel + fs1;
+        fy = dely * ccel + fs2;
+        fz = delz * ccel + fs3;
         f[i][0] += fx;
         f[i][1] += fy;
         f[i][2] += fz;
 
-        tor1 = rinv * (dely*fs3 - delz*fs2);
-        tor2 = rinv * (delz*fs1 - delx*fs3);
-        tor3 = rinv * (delx*fs2 - dely*fs1);
-        torque[i][0] -= radi*tor1;
-        torque[i][1] -= radi*tor2;
-        torque[i][2] -= radi*tor3;
+        tor1 = rinv * (dely * fs3 - delz * fs2);
+        tor2 = rinv * (delz * fs1 - delx * fs3);
+        tor3 = rinv * (delx * fs2 - dely * fs1);
+        torque[i][0] -= radi * tor1;
+        torque[i][1] -= radi * tor2;
+        torque[i][2] -= radi * tor3;
 
         if (newton_pair || j < nlocal) {
           f[j][0] -= fx;
           f[j][1] -= fy;
           f[j][2] -= fz;
-          torque[j][0] -= radj*tor1;
-          torque[j][1] -= radj*tor2;
-          torque[j][2] -= radj*tor3;
+          torque[j][0] -= radj * tor1;
+          torque[j][1] -= radj * tor2;
+          torque[j][2] -= radj * tor3;
         }
 
-        if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,
-                                 0.0,0.0,fx,fy,fz,delx,dely,delz);
+        if (evflag) ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fx, fy, fz, delx, dely, delz);
       }
     }
   }
@@ -339,17 +342,16 @@ void PairGranHookeHistory::allocate()
   allocated = 1;
   int n = atom->ntypes;
 
-  memory->create(setflag,n+1,n+1,"pair:setflag");
+  memory->create(setflag, n + 1, n + 1, "pair:setflag");
   for (int i = 1; i <= n; i++)
-    for (int j = i; j <= n; j++)
-      setflag[i][j] = 0;
+    for (int j = i; j <= n; j++) setflag[i][j] = 0;
 
-  memory->create(cutsq,n+1,n+1,"pair:cutsq");
+  memory->create(cutsq, n + 1, n + 1, "pair:cutsq");
 
-  onerad_dynamic = new double[n+1];
-  onerad_frozen = new double[n+1];
-  maxrad_dynamic = new double[n+1];
-  maxrad_frozen = new double[n+1];
+  onerad_dynamic = new double[n + 1];
+  onerad_frozen = new double[n + 1];
+  maxrad_dynamic = new double[n + 1];
+  maxrad_frozen = new double[n + 1];
 }
 
 /* ----------------------------------------------------------------------
@@ -358,29 +360,35 @@ void PairGranHookeHistory::allocate()
 
 void PairGranHookeHistory::settings(int narg, char **arg)
 {
-  if (narg != 6 && narg != 7) error->all(FLERR,"Illegal pair_style command");
+  if (narg != 6 && narg != 7) error->all(FLERR, "Illegal pair_style command");
 
-  kn = utils::numeric(FLERR,arg[0],false,lmp);
-  if (strcmp(arg[1],"NULL") == 0) kt = kn * 2.0/7.0;
-  else kt = utils::numeric(FLERR,arg[1],false,lmp);
+  kn = utils::numeric(FLERR, arg[0], false, lmp);
+  if (strcmp(arg[1], "NULL") == 0)
+    kt = kn * 2.0 / 7.0;
+  else
+    kt = utils::numeric(FLERR, arg[1], false, lmp);
 
-  gamman = utils::numeric(FLERR,arg[2],false,lmp);
-  if (strcmp(arg[3],"NULL") == 0) gammat = 0.5 * gamman;
-  else gammat = utils::numeric(FLERR,arg[3],false,lmp);
+  gamman = utils::numeric(FLERR, arg[2], false, lmp);
+  if (strcmp(arg[3], "NULL") == 0)
+    gammat = 0.5 * gamman;
+  else
+    gammat = utils::numeric(FLERR, arg[3], false, lmp);
 
-  xmu = utils::numeric(FLERR,arg[4],false,lmp);
-  dampflag = utils::inumeric(FLERR,arg[5],false,lmp);
+  xmu = utils::numeric(FLERR, arg[4], false, lmp);
+  dampflag = utils::inumeric(FLERR, arg[5], false, lmp);
   if (dampflag == 0) gammat = 0.0;
 
   limit_damping = 0;
   if (narg == 7) {
-    if (strcmp(arg[6], "limit_damping") == 0) limit_damping = 1;
-    else error->all(FLERR,"Illegal pair_style command");
+    if (strcmp(arg[6], "limit_damping") == 0)
+      limit_damping = 1;
+    else
+      error->all(FLERR, "Illegal pair_style command");
   }
 
-  if (kn < 0.0 || kt < 0.0 || gamman < 0.0 || gammat < 0.0 ||
-      xmu < 0.0 || xmu > 10000.0 || dampflag < 0 || dampflag > 1)
-    error->all(FLERR,"Illegal pair_style command");
+  if (kn < 0.0 || kt < 0.0 || gamman < 0.0 || gammat < 0.0 || xmu < 0.0 || xmu > 10000.0 ||
+      dampflag < 0 || dampflag > 1)
+    error->all(FLERR, "Illegal pair_style command");
 }
 
 /* ----------------------------------------------------------------------
@@ -389,22 +397,22 @@ void PairGranHookeHistory::settings(int narg, char **arg)
 
 void PairGranHookeHistory::coeff(int narg, char **arg)
 {
-  if (narg > 2) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (narg > 2) error->all(FLERR, "Incorrect args for pair coefficients");
   if (!allocated) allocate();
 
-  int ilo,ihi,jlo,jhi;
-  utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
-  utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
+  int ilo, ihi, jlo, jhi;
+  utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
+  utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
 
   int count = 0;
   for (int i = ilo; i <= ihi; i++) {
-    for (int j = MAX(jlo,i); j <= jhi; j++) {
+    for (int j = MAX(jlo, i); j <= jhi; j++) {
       setflag[i][j] = 1;
       count++;
     }
   }
 
-  if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
 }
 
 /* ----------------------------------------------------------------------
@@ -418,13 +426,13 @@ void PairGranHookeHistory::init_style()
   // error and warning checks
 
   if (!atom->radius_flag || !atom->rmass_flag)
-    error->all(FLERR,"Pair granular requires atom attributes radius, rmass");
+    error->all(FLERR, "Pair granular requires atom attributes radius, rmass");
   if (comm->ghost_velocity == 0)
-    error->all(FLERR,"Pair granular requires ghost atoms store velocity");
+    error->all(FLERR, "Pair granular requires ghost atoms store velocity");
 
   // need a granular neigh list
 
-  int irequest = neighbor->request(this,instance_me);
+  int irequest = neighbor->request(this, instance_me);
   neighbor->requests[irequest]->size = 1;
   if (history) neighbor->requests[irequest]->history = 1;
 
@@ -436,16 +444,18 @@ void PairGranHookeHistory::init_style()
 
   if (history && (fix_history == nullptr)) {
     auto cmd = fmt::format("NEIGH_HISTORY_HH{} all NEIGH_HISTORY {}", instance_me, size_history);
-    fix_history = (FixNeighHistory *) modify->replace_fix("NEIGH_HISTORY_HH_DUMMY"
-                                                          + std::to_string(instance_me),cmd,1);
+    fix_history = (FixNeighHistory *) modify->replace_fix(
+        "NEIGH_HISTORY_HH_DUMMY" + std::to_string(instance_me), cmd, 1);
     fix_history->pair = this;
   }
 
   // check for FixFreeze and set freeze_group_bit
 
   int ifreeze = modify->find_fix_by_style("^freeze");
-  if (ifreeze < 0) freeze_group_bit = 0;
-  else freeze_group_bit = modify->fix[ifreeze]->groupbit;
+  if (ifreeze < 0)
+    freeze_group_bit = 0;
+  else
+    freeze_group_bit = modify->fix[ifreeze]->groupbit;
 
   // check for FixRigid so can extract rigid body masses
   // FIXME: this only catches the first rigid fix, there may be multiple.
@@ -458,7 +468,7 @@ void PairGranHookeHistory::init_style()
   // check for FixPour and FixDeposit so can extract particle radii
 
   int ipour = modify->find_fix_by_style("^pour");
-  int idep  = modify->find_fix_by_style("^deposit");
+  int idep = modify->find_fix_by_style("^deposit");
 
   // set maxrad_dynamic and maxrad_frozen for each type
   // include future FixPour and FixDeposit particles as dynamic
@@ -468,13 +478,11 @@ void PairGranHookeHistory::init_style()
     onerad_dynamic[i] = onerad_frozen[i] = 0.0;
     if (ipour >= 0) {
       itype = i;
-      onerad_dynamic[i] =
-        *((double *) modify->fix[ipour]->extract("radius",itype));
+      onerad_dynamic[i] = *((double *) modify->fix[ipour]->extract("radius", itype));
     }
     if (idep >= 0) {
       itype = i;
-      onerad_dynamic[i] =
-        *((double *) modify->fix[idep]->extract("radius",itype));
+      onerad_dynamic[i] = *((double *) modify->fix[idep]->extract("radius", itype));
     }
   }
 
@@ -485,18 +493,18 @@ void PairGranHookeHistory::init_style()
 
   for (i = 0; i < nlocal; i++)
     if (mask[i] & freeze_group_bit)
-      onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]],radius[i]);
+      onerad_frozen[type[i]] = MAX(onerad_frozen[type[i]], radius[i]);
     else
-      onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]);
+      onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]], radius[i]);
 
-  MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world);
-  MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world);
+  MPI_Allreduce(&onerad_dynamic[1], &maxrad_dynamic[1], atom->ntypes, MPI_DOUBLE, MPI_MAX, world);
+  MPI_Allreduce(&onerad_frozen[1], &maxrad_frozen[1], atom->ntypes, MPI_DOUBLE, MPI_MAX, world);
 
   // set fix which stores history info
 
   if (history) {
-    int ifix = modify->find_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me));
-    if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID");
+    int ifix = modify->find_fix("NEIGH_HISTORY_HH" + std::to_string(instance_me));
+    if (ifix < 0) error->all(FLERR, "Could not find pair fix neigh history ID");
     fix_history = (FixNeighHistory *) modify->fix[ifix];
   }
 }
@@ -512,9 +520,9 @@ double PairGranHookeHistory::init_one(int i, int j)
   // cutoff = sum of max I,J radii for
   // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen
 
-  double cutoff = maxrad_dynamic[i]+maxrad_dynamic[j];
-  cutoff = MAX(cutoff,maxrad_frozen[i]+maxrad_dynamic[j]);
-  cutoff = MAX(cutoff,maxrad_dynamic[i]+maxrad_frozen[j]);
+  double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j];
+  cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]);
+  cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]);
   return cutoff;
 }
 
@@ -526,10 +534,9 @@ void PairGranHookeHistory::write_restart(FILE *fp)
 {
   write_restart_settings(fp);
 
-  int i,j;
+  int i, j;
   for (i = 1; i <= atom->ntypes; i++)
-    for (j = i; j <= atom->ntypes; j++)
-      fwrite(&setflag[i][j],sizeof(int),1,fp);
+    for (j = i; j <= atom->ntypes; j++) fwrite(&setflag[i][j], sizeof(int), 1, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -541,12 +548,12 @@ void PairGranHookeHistory::read_restart(FILE *fp)
   read_restart_settings(fp);
   allocate();
 
-  int i,j;
+  int i, j;
   int me = comm->me;
   for (i = 1; i <= atom->ntypes; i++)
     for (j = i; j <= atom->ntypes; j++) {
-      if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error);
-      MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
+      if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error);
+      MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world);
     }
 }
 
@@ -556,12 +563,12 @@ void PairGranHookeHistory::read_restart(FILE *fp)
 
 void PairGranHookeHistory::write_restart_settings(FILE *fp)
 {
-  fwrite(&kn,sizeof(double),1,fp);
-  fwrite(&kt,sizeof(double),1,fp);
-  fwrite(&gamman,sizeof(double),1,fp);
-  fwrite(&gammat,sizeof(double),1,fp);
-  fwrite(&xmu,sizeof(double),1,fp);
-  fwrite(&dampflag,sizeof(int),1,fp);
+  fwrite(&kn, sizeof(double), 1, fp);
+  fwrite(&kt, sizeof(double), 1, fp);
+  fwrite(&gamman, sizeof(double), 1, fp);
+  fwrite(&gammat, sizeof(double), 1, fp);
+  fwrite(&xmu, sizeof(double), 1, fp);
+  fwrite(&dampflag, sizeof(int), 1, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -571,19 +578,19 @@ void PairGranHookeHistory::write_restart_settings(FILE *fp)
 void PairGranHookeHistory::read_restart_settings(FILE *fp)
 {
   if (comm->me == 0) {
-    utils::sfread(FLERR,&kn,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&kt,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&gamman,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&gammat,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&xmu,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&dampflag,sizeof(int),1,fp,nullptr,error);
+    utils::sfread(FLERR, &kn, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &kt, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &gamman, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &gammat, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &xmu, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &dampflag, sizeof(int), 1, fp, nullptr, error);
   }
-  MPI_Bcast(&kn,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&kt,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&gamman,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&gammat,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&xmu,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&dampflag,1,MPI_INT,0,world);
+  MPI_Bcast(&kn, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&kt, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&gamman, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&gammat, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&xmu, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&dampflag, 1, MPI_INT, 0, world);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -595,32 +602,30 @@ void PairGranHookeHistory::reset_dt()
 
 /* ---------------------------------------------------------------------- */
 
-double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
-                                    double rsq,
-                                    double /*factor_coul*/, double /*factor_lj*/,
-                                    double &fforce)
+double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/, double rsq,
+                                    double /*factor_coul*/, double /*factor_lj*/, double &fforce)
 {
-  double radi,radj,radsum;
-  double r,rinv,rsqinv,delx,dely,delz;
-  double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3,wr1,wr2,wr3;
-  double mi,mj,meff,damp,ccel;
-  double vtr1,vtr2,vtr3,vrel,shrmag,rsht;
-  double fs1,fs2,fs3,fs,fn;
+  double radi, radj, radsum;
+  double r, rinv, rsqinv, delx, dely, delz;
+  double vr1, vr2, vr3, vnnr, vn1, vn2, vn3, vt1, vt2, vt3, wr1, wr2, wr3;
+  double mi, mj, meff, damp, ccel;
+  double vtr1, vtr2, vtr3, vrel, shrmag, rsht;
+  double fs1, fs2, fs3, fs, fn;
 
   double *radius = atom->radius;
   radi = radius[i];
   radj = radius[j];
   radsum = radi + radj;
 
-  if (rsq >= radsum*radsum) {
+  if (rsq >= radsum * radsum) {
     fforce = 0.0;
     for (int m = 0; m < single_extra; m++) svector[m] = 0.0;
     return 0.0;
   }
 
   r = sqrt(rsq);
-  rinv = 1.0/r;
-  rsqinv = 1.0/rsq;
+  rinv = 1.0 / r;
+  rsqinv = 1.0 / rsq;
 
   // relative translational velocity
 
@@ -636,10 +641,10 @@ double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
   dely = x[i][1] - x[j][1];
   delz = x[i][2] - x[j][2];
 
-  vnnr = vr1*delx + vr2*dely + vr3*delz;
-  vn1 = delx*vnnr * rsqinv;
-  vn2 = dely*vnnr * rsqinv;
-  vn3 = delz*vnnr * rsqinv;
+  vnnr = vr1 * delx + vr2 * dely + vr3 * delz;
+  vn1 = delx * vnnr * rsqinv;
+  vn2 = dely * vnnr * rsqinv;
+  vn3 = delz * vnnr * rsqinv;
 
   // tangential component
 
@@ -650,9 +655,9 @@ double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
   // relative rotational velocity
 
   double **omega = atom->omega;
-  wr1 = (radi*omega[i][0] + radj*omega[j][0]) * rinv;
-  wr2 = (radi*omega[i][1] + radj*omega[j][1]) * rinv;
-  wr3 = (radi*omega[i][2] + radj*omega[j][2]) * rinv;
+  wr1 = (radi * omega[i][0] + radj * omega[j][0]) * rinv;
+  wr2 = (radi * omega[i][1] + radj * omega[j][1]) * rinv;
+  wr3 = (radi * omega[i][2] + radj * omega[j][2]) * rinv;
 
   // meff = effective mass of pair of particles
   // if I or J part of rigid body, use body mass
@@ -669,22 +674,22 @@ double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
     if (mass_rigid[j] > 0.0) mj = mass_rigid[j];
   }
 
-  meff = mi*mj / (mi+mj);
+  meff = mi * mj / (mi + mj);
   if (mask[i] & freeze_group_bit) meff = mj;
   if (mask[j] & freeze_group_bit) meff = mi;
 
   // normal forces = Hookian contact + normal velocity damping
 
-  damp = meff*gamman*vnnr*rsqinv;
-  ccel = kn*(radsum-r)*rinv - damp;
-  if(limit_damping && (ccel < 0.0)) ccel = 0.0;
+  damp = meff * gamman * vnnr * rsqinv;
+  ccel = kn * (radsum - r) * rinv - damp;
+  if (limit_damping && (ccel < 0.0)) ccel = 0.0;
 
   // relative velocities
 
-  vtr1 = vt1 - (delz*wr2-dely*wr3);
-  vtr2 = vt2 - (delx*wr3-delz*wr1);
-  vtr3 = vt3 - (dely*wr1-delx*wr2);
-  vrel = vtr1*vtr1 + vtr2*vtr2 + vtr3*vtr3;
+  vtr1 = vt1 - (delz * wr2 - dely * wr3);
+  vtr2 = vt2 - (delx * wr3 - delz * wr1);
+  vtr3 = vt3 - (dely * wr1 - delx * wr2);
+  vrel = vtr1 * vtr1 + vtr2 * vtr2 + vtr3 * vtr3;
   vrel = sqrt(vrel);
 
   // shear history effects
@@ -703,33 +708,33 @@ double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
     if (jlist[neighprev] == j) break;
   }
 
-  double *shear = &allshear[3*neighprev];
-  shrmag = sqrt(shear[0]*shear[0] + shear[1]*shear[1] +
-                shear[2]*shear[2]);
+  double *shear = &allshear[3 * neighprev];
+  shrmag = sqrt(shear[0] * shear[0] + shear[1] * shear[1] + shear[2] * shear[2]);
 
   // rotate shear displacements
 
-  rsht = shear[0]*delx + shear[1]*dely + shear[2]*delz;
+  rsht = shear[0] * delx + shear[1] * dely + shear[2] * delz;
   rsht *= rsqinv;
 
   // tangential forces = shear + tangential velocity damping
 
-  fs1 = - (kt*shear[0] + meff*gammat*vtr1);
-  fs2 = - (kt*shear[1] + meff*gammat*vtr2);
-  fs3 = - (kt*shear[2] + meff*gammat*vtr3);
+  fs1 = -(kt * shear[0] + meff * gammat * vtr1);
+  fs2 = -(kt * shear[1] + meff * gammat * vtr2);
+  fs3 = -(kt * shear[2] + meff * gammat * vtr3);
 
   // rescale frictional displacements and forces if needed
 
-  fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3);
-  fn = xmu * fabs(ccel*r);
+  fs = sqrt(fs1 * fs1 + fs2 * fs2 + fs3 * fs3);
+  fn = xmu * fabs(ccel * r);
 
   if (fs > fn) {
     if (shrmag != 0.0) {
-      fs1 *= fn/fs;
-      fs2 *= fn/fs;
-      fs3 *= fn/fs;
-      fs *= fn/fs;
-    } else fs1 = fs2 = fs3 = fs = 0.0;
+      fs1 *= fn / fs;
+      fs2 *= fn / fs;
+      fs3 *= fn / fs;
+      fs *= fn / fs;
+    } else
+      fs1 = fs2 = fs3 = fs = 0.0;
   }
 
   // set force and return no energy
@@ -754,10 +759,10 @@ double PairGranHookeHistory::single(int i, int j, int /*itype*/, int /*jtype*/,
 
 /* ---------------------------------------------------------------------- */
 
-int PairGranHookeHistory::pack_forward_comm(int n, int *list, double *buf,
-                                            int /*pbc_flag*/, int * /*pbc*/)
+int PairGranHookeHistory::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,
+                                            int * /*pbc*/)
 {
-  int i,j,m;
+  int i, j, m;
 
   m = 0;
   for (i = 0; i < n; i++) {
@@ -771,12 +776,11 @@ int PairGranHookeHistory::pack_forward_comm(int n, int *list, double *buf,
 
 void PairGranHookeHistory::unpack_forward_comm(int n, int first, double *buf)
 {
-  int i,m,last;
+  int i, m, last;
 
   m = 0;
   last = first + n;
-  for (i = first; i < last; i++)
-    mass_rigid[i] = buf[m++];
+  for (i = first; i < last; i++) mass_rigid[i] = buf[m++];
 }
 
 /* ----------------------------------------------------------------------
@@ -785,7 +789,7 @@ void PairGranHookeHistory::unpack_forward_comm(int n, int first, double *buf)
 
 double PairGranHookeHistory::memory_usage()
 {
-  double bytes = (double)nmax * sizeof(double);
+  double bytes = (double) nmax * sizeof(double);
   return bytes;
 }
 
@@ -795,7 +799,7 @@ double PairGranHookeHistory::memory_usage()
 
 double PairGranHookeHistory::atom2cut(int i)
 {
-  double cut = atom->radius[i]*2;
+  double cut = atom->radius[i] * 2;
   return cut;
 }
 
@@ -805,6 +809,6 @@ double PairGranHookeHistory::atom2cut(int i)
 
 double PairGranHookeHistory::radii2cut(double r1, double r2)
 {
-  double cut = r1+r2;
+  double cut = r1 + r2;
   return cut;
 }
diff --git a/src/INTEL/angle_charmm_intel.h b/src/INTEL/angle_charmm_intel.h
index ede6b46609..942ac942a1 100644
--- a/src/INTEL/angle_charmm_intel.h
+++ b/src/INTEL/angle_charmm_intel.h
@@ -42,26 +42,25 @@ class AngleCharmmIntel : public AngleCharmm {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k, theta0, k_ub, r_ub; } fc_packed1;
+    typedef struct {
+      flt_t k, theta0, k_ub, r_ub;
+    } fc_packed1;
 
     fc_packed1 *fc;
-    ForceConst() : _nangletypes(0)  {}
+    ForceConst() : _nangletypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nangletypes, Memory *memory);
@@ -74,7 +73,7 @@ class AngleCharmmIntel : public AngleCharmm {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/angle_harmonic_intel.h b/src/INTEL/angle_harmonic_intel.h
index 67983b2868..10bdcd9546 100644
--- a/src/INTEL/angle_harmonic_intel.h
+++ b/src/INTEL/angle_harmonic_intel.h
@@ -42,26 +42,25 @@ class AngleHarmonicIntel : public AngleHarmonic {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k, theta0; } fc_packed1;
+    typedef struct {
+      flt_t k, theta0;
+    } fc_packed1;
 
     fc_packed1 *fc;
-    ForceConst() : _nangletypes(0)  {}
+    ForceConst() : _nangletypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nangletypes, Memory *memory);
@@ -74,7 +73,7 @@ class AngleHarmonicIntel : public AngleHarmonic {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/bond_fene_intel.h b/src/INTEL/bond_fene_intel.h
index 938bd1515f..0c71f1a9d0 100644
--- a/src/INTEL/bond_fene_intel.h
+++ b/src/INTEL/bond_fene_intel.h
@@ -42,26 +42,25 @@ class BondFENEIntel : public BondFENE {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k, ir0sq, sigma, epsilon; } fc_packed1;
+    typedef struct {
+      flt_t k, ir0sq, sigma, epsilon;
+    } fc_packed1;
     fc_packed1 *fc;
 
-    ForceConst() : _nbondtypes(0)  {}
+    ForceConst() : _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nbondtypes, Memory *memory);
@@ -74,7 +73,7 @@ class BondFENEIntel : public BondFENE {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/bond_harmonic_intel.h b/src/INTEL/bond_harmonic_intel.h
index 1744153a77..612f4e7ca1 100644
--- a/src/INTEL/bond_harmonic_intel.h
+++ b/src/INTEL/bond_harmonic_intel.h
@@ -42,26 +42,25 @@ class BondHarmonicIntel : public BondHarmonic {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k, r0; } fc_packed1;
+    typedef struct {
+      flt_t k, r0;
+    } fc_packed1;
     fc_packed1 *fc;
 
-    ForceConst() : _nbondtypes(0)  {}
+    ForceConst() : _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nbondtypes, Memory *memory);
@@ -74,7 +73,7 @@ class BondHarmonicIntel : public BondHarmonic {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/dihedral_charmm_intel.h b/src/INTEL/dihedral_charmm_intel.h
index 9e17f46dd9..ec213f5d75 100644
--- a/src/INTEL/dihedral_charmm_intel.h
+++ b/src/INTEL/dihedral_charmm_intel.h
@@ -42,31 +42,32 @@ class DihedralCharmmIntel : public DihedralCharmm {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t lj1, lj2, lj3, lj4; } fc_packed1;
-    typedef struct { flt_t cos_shift, sin_shift, k;
-                     int multiplicity; } fc_packed3;
+    typedef struct {
+      flt_t lj1, lj2, lj3, lj4;
+    } fc_packed1;
+    typedef struct {
+      flt_t cos_shift, sin_shift, k;
+      int multiplicity;
+    } fc_packed3;
 
     fc_packed1 **ljp;
     fc_packed3 *bp;
     flt_t *weight;
 
-    ForceConst() : _npairtypes(0), _nbondtypes(0)  {}
+    ForceConst() : _npairtypes(0), _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, 0, nullptr); }
 
     void set_ntypes(const int npairtypes, const int nbondtypes, Memory *memory);
@@ -79,7 +80,7 @@ class DihedralCharmmIntel : public DihedralCharmm {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/dihedral_fourier_intel.h b/src/INTEL/dihedral_fourier_intel.h
index 5c480981c5..3b1f594c28 100644
--- a/src/INTEL/dihedral_fourier_intel.h
+++ b/src/INTEL/dihedral_fourier_intel.h
@@ -42,32 +42,30 @@ class DihedralFourierIntel : public DihedralFourier {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cos_shift, sin_shift, k;
-      int multiplicity; } fc_packed1;
+    typedef struct {
+      flt_t cos_shift, sin_shift, k;
+      int multiplicity;
+    } fc_packed1;
 
     fc_packed1 **bp;
 
-    ForceConst() : _nbondtypes(0)  {}
+    ForceConst() : _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr, nullptr, nullptr); }
 
-    void set_ntypes(const int nbondtypes, int *setflag, int *nterms,
-                    Memory *memory);
+    void set_ntypes(const int nbondtypes, int *setflag, int *nterms, Memory *memory);
 
    private:
     int _nbondtypes, _maxnterms;
@@ -77,7 +75,7 @@ class DihedralFourierIntel : public DihedralFourier {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/dihedral_harmonic_intel.h b/src/INTEL/dihedral_harmonic_intel.h
index 7508edbec1..388df11e4f 100644
--- a/src/INTEL/dihedral_harmonic_intel.h
+++ b/src/INTEL/dihedral_harmonic_intel.h
@@ -42,28 +42,27 @@ class DihedralHarmonicIntel : public DihedralHarmonic {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cos_shift, sin_shift, k;
-                     int multiplicity; } fc_packed1;
+    typedef struct {
+      flt_t cos_shift, sin_shift, k;
+      int multiplicity;
+    } fc_packed1;
 
     fc_packed1 *bp;
 
-    ForceConst() : _nbondtypes(0)  {}
+    ForceConst() : _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nbondtypes, Memory *memory);
@@ -76,7 +75,7 @@ class DihedralHarmonicIntel : public DihedralHarmonic {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/dihedral_opls_intel.h b/src/INTEL/dihedral_opls_intel.h
index 456a5af9b9..98206b184f 100644
--- a/src/INTEL/dihedral_opls_intel.h
+++ b/src/INTEL/dihedral_opls_intel.h
@@ -42,27 +42,26 @@ class DihedralOPLSIntel : public DihedralOPLS {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k1, k2, k3, k4; } fc_packed1;
+    typedef struct {
+      flt_t k1, k2, k3, k4;
+    } fc_packed1;
 
     fc_packed1 *bp;
 
-    ForceConst() : _nbondtypes(0)  {}
+    ForceConst() : _nbondtypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nbondtypes, Memory *memory);
@@ -75,7 +74,7 @@ class DihedralOPLSIntel : public DihedralOPLS {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/fix_intel.h b/src/INTEL/fix_intel.h
index 8e5d2b524d..8e2ca5e7d1 100644
--- a/src/INTEL/fix_intel.h
+++ b/src/INTEL/fix_intel.h
@@ -25,11 +25,11 @@ FixStyle(INTEL,FixIntel);
 #ifndef LMP_FIX_INTEL_H
 #define LMP_FIX_INTEL_H
 
-#include "fix.h"
-#include "intel_buffers.h"
-#include "force.h"
-#include "pair.h"
 #include "error.h"
+#include "fix.h"
+#include "force.h"
+#include "intel_buffers.h"
+#include "pair.h"
 #include "update.h"
 
 namespace LAMMPS_NS {
@@ -48,13 +48,12 @@ class FixIntel : public Fix {
   void setup_pre_reverse(int eflag = 0, int vflag = 0);
 
   bool pair_hybrid_check();
-  void pair_init_check(const bool cdmessage=false);
+  void pair_init_check(const bool cdmessage = false);
   void bond_init_check();
   void kspace_init_check();
 
   void pre_reverse(int eflag = 0, int vflag = 0);
-  inline void min_pre_reverse(int eflag = 0, int vflag = 0)
-    { pre_reverse(eflag, vflag); }
+  inline void min_pre_reverse(int eflag = 0, int vflag = 0) { pre_reverse(eflag, vflag); }
 
   void post_run() { _print_pkg_info = 1; }
 
@@ -63,45 +62,55 @@ class FixIntel : public Fix {
 
   double memory_usage();
 
-  typedef struct { double x,y,z; } lmp_ft;
+  typedef struct {
+    double x, y, z;
+  } lmp_ft;
 
-  enum {PREC_MODE_SINGLE, PREC_MODE_MIXED, PREC_MODE_DOUBLE};
+  enum { PREC_MODE_SINGLE, PREC_MODE_MIXED, PREC_MODE_DOUBLE };
 
   inline int precision() { return _precision_mode; }
-  inline IntelBuffers * get_single_buffers()
-    { return _single_buffers; }
-  inline IntelBuffers * get_mixed_buffers()
-    { return _mixed_buffers; }
-  inline IntelBuffers * get_double_buffers()
-    { return _double_buffers; }
+  inline IntelBuffers *get_single_buffers() { return _single_buffers; }
+  inline IntelBuffers *get_mixed_buffers() { return _mixed_buffers; }
+  inline IntelBuffers *get_double_buffers() { return _double_buffers; }
 
   inline int nbor_pack_width() const { return _nbor_pack_width; }
   inline void nbor_pack_width(const int w) { _nbor_pack_width = w; }
   inline int three_body_neighbor() { return _three_body_neighbor; }
   inline void three_body_neighbor(const int i) { _three_body_neighbor = i; }
 
-  inline int need_zero(const int tid) {
-    if (_need_reduce == 0 && tid > 0) return 1;
-    else if (_zero_master && tid == 0) { _zero_master = 0; return 1; }
-    else return 0;
+  inline int need_zero(const int tid)
+  {
+    if (_need_reduce == 0 && tid > 0)
+      return 1;
+    else if (_zero_master && tid == 0) {
+      _zero_master = 0;
+      return 1;
+    } else
+      return 0;
   }
-  inline void set_reduce_flag() { if (_nthreads > 1) _need_reduce = 1; }
-  inline int lrt() {
+  inline void set_reduce_flag()
+  {
+    if (_nthreads > 1) _need_reduce = 1;
+  }
+  inline int lrt()
+  {
     if (force->kspace_match("^pppm/.*intel$", 0) && update->whichflag == 1)
       return _lrt;
-    else return 0;
+    else
+      return 0;
   }
-  inline int pppm_table() {
+  inline int pppm_table()
+  {
     if (force->kspace_match("^pppm/.*intel$", 0))
       return INTEL_P3M_TABLE;
-    else return 0;
+    else
+      return 0;
   }
 
-
  protected:
-  IntelBuffers *_single_buffers;
-  IntelBuffers *_mixed_buffers;
-  IntelBuffers *_double_buffers;
+  IntelBuffers *_single_buffers;
+  IntelBuffers *_mixed_buffers;
+  IntelBuffers *_double_buffers;
 
   int _precision_mode, _nthreads, _nbor_pack_width, _three_body_neighbor;
   int _pair_intel_count, _pair_hybrid_flag, _print_pkg_info;
@@ -109,24 +118,20 @@ class FixIntel : public Fix {
   int _pair_hybrid_zero, _hybrid_nonpair, _zero_master;
 
  public:
-  inline int* get_overflow_flag() { return _overflow_flag; }
-  inline int* get_off_overflow_flag() { return _off_overflow_flag; }
-  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                               double *ev_in, const int offload,
-                               const int eatom = 0, const int vatom = 0,
+  inline int *get_overflow_flag() { return _overflow_flag; }
+  inline int *get_off_overflow_flag() { return _off_overflow_flag; }
+  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in, double *ev_in,
+                               const int offload, const int eatom = 0, const int vatom = 0,
                                const int rflag = 0);
-  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                               double *ev_in, const int offload,
-                               const int eatom = 0, const int vatom = 0,
+  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in, double *ev_in,
+                               const int offload, const int eatom = 0, const int vatom = 0,
                                const int rflag = 0);
-  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                               float *ev_in, const int offload,
-                               const int eatom = 0, const int vatom = 0,
+  inline void add_result_array(IntelBuffers::vec3_acc_t *f_in, float *ev_in,
+                               const int offload, const int eatom = 0, const int vatom = 0,
                                const int rflag = 0);
-  inline void get_buffern(const int offload, int &nlocal, int &nall,
-                          int &minlocal);
+  inline void get_buffern(const int offload, int &nlocal, int &nall, int &minlocal);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   void post_force(int vflag);
   inline int coprocessor_number() { return _cop; }
   inline int full_host_list() { return _full_host_list; }
@@ -135,9 +140,19 @@ class FixIntel : public Fix {
   inline int offload_end_neighbor();
   inline int offload_end_pair();
   inline int host_start_neighbor()
-    { if (_offload_noghost) return 0; else return offload_end_neighbor(); }
+  {
+    if (_offload_noghost)
+      return 0;
+    else
+      return offload_end_neighbor();
+  }
   inline int host_start_pair()
-    { if (_offload_noghost) return 0; else return offload_end_pair(); }
+  {
+    if (_offload_noghost)
+      return 0;
+    else
+      return offload_end_pair();
+  }
   inline int offload_nlocal() { return _offload_nlocal; }
   inline int offload_nall() { return _offload_nall; }
   inline int offload_min_ghost() { return _offload_min_ghost; }
@@ -149,18 +164,19 @@ class FixIntel : public Fix {
   inline int separate_buffers() { return _separate_buffers; }
   inline int offload_noghost() { return _offload_noghost; }
   inline void set_offload_noghost(const int v)
-    { if (_offload_ghost < 0) _offload_noghost = v; }
+  {
+    if (_offload_ghost < 0) _offload_noghost = v;
+  }
   inline void set_neighbor_host_sizes();
 
-  inline void zero_timers()
-    { memset(_timers, 0, sizeof(double) * NUM_ITIMERS); }
+  inline void zero_timers() { memset(_timers, 0, sizeof(double) * NUM_ITIMERS); }
   inline void start_watch(const int which) { _stopwatch[which] = MPI_Wtime(); }
   inline double stop_watch(const int which);
-  inline double * off_watch_pair() { return _stopwatch_offload_pair; }
-  inline double * off_watch_neighbor() { return _stopwatch_offload_neighbor; }
+  inline double *off_watch_pair() { return _stopwatch_offload_pair; }
+  inline double *off_watch_neighbor() { return _stopwatch_offload_neighbor; }
   inline void balance_stamp();
   inline void acc_timers();
-  #else
+#else
   inline int offload_end_neighbor() { return 0; }
   inline int offload_end_pair() { return 0; }
   inline int host_start_neighbor() { return 0; }
@@ -168,27 +184,27 @@ class FixIntel : public Fix {
   inline void zero_timers() {}
   inline void start_watch(const int /*which*/) {}
   inline double stop_watch(const int /*which*/) { return 0.0; }
-  double * off_watch_pair() { return nullptr; }
-  double * off_watch_neighbor() { return nullptr; }
+  double *off_watch_pair() { return nullptr; }
+  double *off_watch_neighbor() { return nullptr; }
   inline void balance_stamp() {}
   inline void acc_timers() {}
   inline int separate_buffers() { return 0; }
-  #endif
+#endif
 
  protected:
   int _overflow_flag[5];
-  _alignvar(int _off_overflow_flag[5],64);
+  _alignvar(int _off_overflow_flag[5], 64);
   int _allow_separate_buffers, _offload_ghost, _lrt;
 
-  IntelBuffers::vec3_acc_t *_force_array_s;
-  IntelBuffers::vec3_acc_t *_force_array_m;
-  IntelBuffers::vec3_acc_t *_force_array_d;
+  IntelBuffers::vec3_acc_t *_force_array_s;
+  IntelBuffers::vec3_acc_t *_force_array_m;
+  IntelBuffers::vec3_acc_t *_force_array_d;
   float *_ev_array_s;
   double *_ev_array_d;
   int _results_eatom, _results_vatom;
   int _need_reduce;
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   double _balance_pair_time, _balance_other_time;
   int _offload_nlocal, _offload_nall, _offload_min_ghost, _offload_nghost;
   int _host_min_local, _host_min_ghost, _host_nall;
@@ -198,9 +214,9 @@ class FixIntel : public Fix {
   void output_timing_data();
   FILE *_tscreen;
 
-  IntelBuffers::vec3_acc_t *_off_force_array_s;
-  IntelBuffers::vec3_acc_t *_off_force_array_m;
-  IntelBuffers::vec3_acc_t *_off_force_array_d;
+  IntelBuffers::vec3_acc_t *_off_force_array_s;
+  IntelBuffers::vec3_acc_t *_off_force_array_m;
+  IntelBuffers::vec3_acc_t *_off_force_array_d;
   float *_off_ev_array_s;
   double *_off_ev_array_d;
   int _off_results_eatom, _off_results_vatom;
@@ -208,48 +224,42 @@ class FixIntel : public Fix {
 
   int get_ppn(int &);
   int set_host_affinity(const int);
-  #endif
+#endif
   void check_neighbor_intel();
 
   double _offload_balance, _balance_neighbor, _balance_pair, _balance_fixed;
   double _timers[NUM_ITIMERS];
   double _stopwatch[NUM_ITIMERS];
-  _alignvar(double _stopwatch_offload_neighbor[1],64);
-  _alignvar(double _stopwatch_offload_pair[1],64);
+  _alignvar(double _stopwatch_offload_neighbor[1], 64);
+  _alignvar(double _stopwatch_offload_pair[1], 64);
 
   void _sync_main_arrays(const int prereverse);
 
-  template 
-  void reduce_results(ft * _noalias const f_in);
+  template  void reduce_results(ft *_noalias const f_in);
 
   template 
-  inline void add_results(const ft * _noalias const f_in,
-                          const acc_t * _noalias const ev_global,
-                          const int eatom, const int vatom,
-                          const int offload);
+  inline void add_results(const ft *_noalias const f_in, const acc_t *_noalias const ev_global,
+                          const int eatom, const int vatom, const int offload);
 
   template 
-  inline void add_oresults(const ft * _noalias const f_in,
-                           const acc_t * _noalias const ev_global,
-                           const int eatom, const int vatom,
-                           const int out_offset, const int nall);
+  inline void add_oresults(const ft *_noalias const f_in, const acc_t *_noalias const ev_global,
+                           const int eatom, const int vatom, const int out_offset, const int nall);
 
   int _offload_affinity_balanced, _offload_threads, _offload_tpc;
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _max_offload_threads, _offload_cores, _offload_affinity_set;
   int _im_real_space_task;
   MPI_Comm _real_space_comm;
   template 
-  inline void add_off_results(const ft * _noalias const f_in,
-                              const acc_t * _noalias const ev_global);
-  #endif
+  inline void add_off_results(const ft *_noalias const f_in, const acc_t *_noalias const ev_global);
+#endif
 };
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::get_buffern(const int offload, int &nlocal, int &nall,
-                           int &minlocal) {
-  #ifdef _LMP_INTEL_OFFLOAD
+void FixIntel::get_buffern(const int offload, int &nlocal, int &nall, int &minlocal)
+{
+#ifdef _LMP_INTEL_OFFLOAD
   if (_separate_buffers) {
     if (offload) {
       if (neighbor->ago != 0) {
@@ -273,7 +283,7 @@ void FixIntel::get_buffern(const int offload, int &nlocal, int &nall,
   if (_offload_noghost && offload)
     nall = atom->nlocal;
   else
-  #endif
+#endif
     nall = atom->nlocal + atom->nghost;
   nlocal = atom->nlocal;
   minlocal = 0;
@@ -281,102 +291,97 @@ void FixIntel::get_buffern(const int offload, int &nlocal, int &nall,
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                                double *ev_in, const int offload,
-                                const int eatom, const int vatom,
-                                const int rflag) {
-  #ifdef _LMP_INTEL_OFFLOAD
+void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in, double *ev_in,
+                                const int offload, const int eatom, const int vatom,
+                                const int rflag)
+{
+#ifdef _LMP_INTEL_OFFLOAD
   if (offload) {
     _off_results_eatom = eatom;
     _off_results_vatom = vatom;
     _off_force_array_d = f_in;
     _off_ev_array_d = ev_in;
-    if (_pair_hybrid_flag && force->pair->fdotr_is_set())
-       _sync_main_arrays(1);
+    if (_pair_hybrid_flag && force->pair->fdotr_is_set()) _sync_main_arrays(1);
     return;
   }
-  #endif
+#endif
 
   _force_array_d = f_in;
   _ev_array_d = ev_in;
   _results_eatom = eatom;
   _results_vatom = vatom;
-  #ifndef _LMP_INTEL_OFFLOAD
+#ifndef _LMP_INTEL_OFFLOAD
   if (rflag != 2 && _nthreads > 1 && force->newton) _need_reduce = 1;
-  #endif
+#endif
 
   if (_overflow_flag[LMP_OVERFLOW])
     error->one(FLERR, "Neighbor list overflow, boost neigh_modify one");
 
-  if (_pair_hybrid_flag > 1 ||
-      (_pair_hybrid_flag && force->pair->fdotr_is_set())) _sync_main_arrays(0);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                                double *ev_in, const int offload,
-                                const int eatom, const int vatom,
-                                const int rflag) {
-  #ifdef _LMP_INTEL_OFFLOAD
-  if (offload) {
-    _off_results_eatom = eatom;
-    _off_results_vatom = vatom;
-    _off_force_array_m = f_in;
-    _off_ev_array_d = ev_in;
-    if (_pair_hybrid_flag && force->pair->fdotr_is_set())
-       _sync_main_arrays(1);
-    return;
-  }
-  #endif
-
-  _force_array_m = f_in;
-  _ev_array_d = ev_in;
-  _results_eatom = eatom;
-  _results_vatom = vatom;
-  #ifndef _LMP_INTEL_OFFLOAD
-  if (rflag != 2 && _nthreads > 1 && force->newton) _need_reduce = 1;
-  #endif
-
-  if (_overflow_flag[LMP_OVERFLOW])
-    error->one(FLERR, "Neighbor list overflow, boost neigh_modify one");
-
-  if (_pair_hybrid_flag > 1 ||
-      (_pair_hybrid_flag && force->pair->fdotr_is_set()))
+  if (_pair_hybrid_flag > 1 || (_pair_hybrid_flag && force->pair->fdotr_is_set()))
     _sync_main_arrays(0);
 }
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in,
-                                float *ev_in, const int offload,
-                                const int eatom, const int vatom,
-                                const int rflag) {
-  #ifdef _LMP_INTEL_OFFLOAD
+void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in, double *ev_in,
+                                const int offload, const int eatom, const int vatom,
+                                const int rflag)
+{
+#ifdef _LMP_INTEL_OFFLOAD
+  if (offload) {
+    _off_results_eatom = eatom;
+    _off_results_vatom = vatom;
+    _off_force_array_m = f_in;
+    _off_ev_array_d = ev_in;
+    if (_pair_hybrid_flag && force->pair->fdotr_is_set()) _sync_main_arrays(1);
+    return;
+  }
+#endif
+
+  _force_array_m = f_in;
+  _ev_array_d = ev_in;
+  _results_eatom = eatom;
+  _results_vatom = vatom;
+#ifndef _LMP_INTEL_OFFLOAD
+  if (rflag != 2 && _nthreads > 1 && force->newton) _need_reduce = 1;
+#endif
+
+  if (_overflow_flag[LMP_OVERFLOW])
+    error->one(FLERR, "Neighbor list overflow, boost neigh_modify one");
+
+  if (_pair_hybrid_flag > 1 || (_pair_hybrid_flag && force->pair->fdotr_is_set()))
+    _sync_main_arrays(0);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in, float *ev_in,
+                                const int offload, const int eatom, const int vatom,
+                                const int rflag)
+{
+#ifdef _LMP_INTEL_OFFLOAD
   if (offload) {
     _off_results_eatom = eatom;
     _off_results_vatom = vatom;
     _off_force_array_s = f_in;
     _off_ev_array_s = ev_in;
-    if (_pair_hybrid_flag && force->pair->fdotr_is_set())
-       _sync_main_arrays(1);
+    if (_pair_hybrid_flag && force->pair->fdotr_is_set()) _sync_main_arrays(1);
     return;
   }
-  #endif
+#endif
 
   _force_array_s = f_in;
   _ev_array_s = ev_in;
   _results_eatom = eatom;
   _results_vatom = vatom;
-  #ifndef _LMP_INTEL_OFFLOAD
+#ifndef _LMP_INTEL_OFFLOAD
   if (rflag != 2 && _nthreads > 1 && force->newton) _need_reduce = 1;
-  #endif
+#endif
 
   if (_overflow_flag[LMP_OVERFLOW])
     error->one(FLERR, "Neighbor list overflow, boost neigh_modify one");
 
-  if (_pair_hybrid_flag > 1 ||
-      (_pair_hybrid_flag && force->pair->fdotr_is_set()))
+  if (_pair_hybrid_flag > 1 || (_pair_hybrid_flag && force->pair->fdotr_is_set()))
     _sync_main_arrays(0);
 }
 
@@ -386,10 +391,10 @@ void FixIntel::add_result_array(IntelBuffers::vec3_acc_t *f_in,
 
 /* ---------------------------------------------------------------------- */
 
-int FixIntel::offload_end_neighbor() {
+int FixIntel::offload_end_neighbor()
+{
   if (_offload_balance < 0.0) {
-    if (atom->nlocal < 2)
-      error->one(FLERR,"Too few atoms for load balancing offload");
+    if (atom->nlocal < 2) error->one(FLERR, "Too few atoms for load balancing offload");
     double granularity = 1.0 / atom->nlocal;
     if (_balance_neighbor < granularity)
       _balance_neighbor = granularity + 1e-10;
@@ -399,14 +404,18 @@ int FixIntel::offload_end_neighbor() {
   return _balance_neighbor * atom->nlocal;
 }
 
-int FixIntel::offload_end_pair() {
-  if (neighbor->ago == 0) return _balance_neighbor * atom->nlocal;
-  else return _balance_pair * atom->nlocal;
+int FixIntel::offload_end_pair()
+{
+  if (neighbor->ago == 0)
+    return _balance_neighbor * atom->nlocal;
+  else
+    return _balance_pair * atom->nlocal;
 }
 
 /* ---------------------------------------------------------------------- */
 
-double FixIntel::stop_watch(const int which) {
+double FixIntel::stop_watch(const int which)
+{
   double elapsed = MPI_Wtime() - _stopwatch[which];
   _timers[which] += elapsed;
   return elapsed;
@@ -414,7 +423,8 @@ double FixIntel::stop_watch(const int which) {
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::balance_stamp() {
+void FixIntel::balance_stamp()
+{
   if (_offload_balance < 0.0) {
     double ct = MPI_Wtime();
     _balance_other_time = ct;
@@ -424,7 +434,8 @@ void FixIntel::balance_stamp() {
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::acc_timers() {
+void FixIntel::acc_timers()
+{
   _timers[TIME_OFFLOAD_PAIR] += *_stopwatch_offload_pair;
   if (neighbor->ago == 0) {
     _timers[TIME_OFFLOAD_NEIGHBOR] += *_stopwatch_offload_neighbor;
@@ -437,7 +448,8 @@ void FixIntel::acc_timers() {
 
 /* ---------------------------------------------------------------------- */
 
-void FixIntel::set_neighbor_host_sizes() {
+void FixIntel::set_neighbor_host_sizes()
+{
   _host_min_local = _overflow_flag[LMP_LOCAL_MIN];
   _host_min_ghost = _overflow_flag[LMP_GHOST_MIN];
   _host_used_local = atom->nlocal - _host_min_local;
@@ -450,7 +462,7 @@ void FixIntel::set_neighbor_host_sizes() {
 
 #endif
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/fix_npt_intel.h b/src/INTEL/fix_npt_intel.h
index 5bf0c6dbe6..17d3793a9b 100644
--- a/src/INTEL/fix_npt_intel.h
+++ b/src/INTEL/fix_npt_intel.h
@@ -35,7 +35,7 @@ class FixNPTIntel : public FixNHIntel {
   ~FixNPTIntel() {}
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/fix_nve_asphere_intel.h b/src/INTEL/fix_nve_asphere_intel.h
index 39d87a2a73..2b09f99548 100644
--- a/src/INTEL/fix_nve_asphere_intel.h
+++ b/src/INTEL/fix_nve_asphere_intel.h
@@ -46,7 +46,7 @@ class FixNVEAsphereIntel : public FixNVE {
   class AtomVecEllipsoid *avec;
 };
 
-}
+}    // namespace LAMMPS_NS
 #endif
 #endif
 
diff --git a/src/INTEL/fix_nve_intel.h b/src/INTEL/fix_nve_intel.h
index 17ead378a9..b37b5eaf65 100644
--- a/src/INTEL/fix_nve_intel.h
+++ b/src/INTEL/fix_nve_intel.h
@@ -44,7 +44,7 @@ class FixNVEIntel : public FixNVE {
   int _nlocal3, _nlocal_max;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/fix_nvt_intel.h b/src/INTEL/fix_nvt_intel.h
index 28cd3a4ebc..93834c189e 100644
--- a/src/INTEL/fix_nvt_intel.h
+++ b/src/INTEL/fix_nvt_intel.h
@@ -35,7 +35,7 @@ class FixNVTIntel : public FixNHIntel {
   ~FixNVTIntel() {}
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/fix_nvt_sllod_intel.h b/src/INTEL/fix_nvt_sllod_intel.h
index a08893f85e..12f116dcba 100644
--- a/src/INTEL/fix_nvt_sllod_intel.h
+++ b/src/INTEL/fix_nvt_sllod_intel.h
@@ -41,7 +41,7 @@ class FixNVTSllodIntel : public FixNHIntel {
   void nh_v_temp();
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
@@ -70,4 +70,3 @@ E: Using fix nvt/sllod with no fix deform defined
 Self-explanatory.
 
 */
-
diff --git a/src/INTEL/improper_cvff_intel.h b/src/INTEL/improper_cvff_intel.h
index 2c740ba90b..6ea95d0ff4 100644
--- a/src/INTEL/improper_cvff_intel.h
+++ b/src/INTEL/improper_cvff_intel.h
@@ -25,8 +25,8 @@ ImproperStyle(cvff/intel,ImproperCvffIntel);
 #ifndef LMP_IMPROPER_CVFF_INTEL_H
 #define LMP_IMPROPER_CVFF_INTEL_H
 
-#include "improper_cvff.h"
 #include "fix_intel.h"
+#include "improper_cvff.h"
 
 namespace LAMMPS_NS {
 
@@ -42,27 +42,27 @@ class ImproperCvffIntel : public ImproperCvff {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k; int sign, multiplicity; } fc_packed1;
+    typedef struct {
+      flt_t k;
+      int sign, multiplicity;
+    } fc_packed1;
 
     fc_packed1 *fc;
 
-    ForceConst() : _nimpropertypes(0)  {}
+    ForceConst() : _nimpropertypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nimpropertypes, Memory *memory);
@@ -75,7 +75,7 @@ class ImproperCvffIntel : public ImproperCvff {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/improper_harmonic_intel.h b/src/INTEL/improper_harmonic_intel.h
index 14ca7b12d6..3b9c5d2ec9 100644
--- a/src/INTEL/improper_harmonic_intel.h
+++ b/src/INTEL/improper_harmonic_intel.h
@@ -25,8 +25,8 @@ ImproperStyle(harmonic/intel,ImproperHarmonicIntel);
 #ifndef LMP_IMPROPER_HARMONIC_INTEL_H
 #define LMP_IMPROPER_HARMONIC_INTEL_H
 
-#include "improper_harmonic.h"
 #include "fix_intel.h"
+#include "improper_harmonic.h"
 
 namespace LAMMPS_NS {
 
@@ -42,27 +42,26 @@ class ImproperHarmonicIntel : public ImproperHarmonic {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int vflag, IntelBuffers * buffers,
-            const ForceConst &fc);
+  void eval(const int vflag, IntelBuffers *buffers, const ForceConst &fc);
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t k, chi; } fc_packed1;
+    typedef struct {
+      flt_t k, chi;
+    } fc_packed1;
 
     fc_packed1 *fc;
 
-    ForceConst() : _nimpropertypes(0)  {}
+    ForceConst() : _nimpropertypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr); }
 
     void set_ntypes(const int nimpropertypes, Memory *memory);
@@ -75,7 +74,7 @@ class ImproperHarmonicIntel : public ImproperHarmonic {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/nbin_intel.h b/src/INTEL/nbin_intel.h
index 488e1ace6b..dbed37b347 100644
--- a/src/INTEL/nbin_intel.h
+++ b/src/INTEL/nbin_intel.h
@@ -23,9 +23,9 @@ NBinStyle(intel,
 #ifndef LMP_NBIN_INTEL_H
 #define LMP_NBIN_INTEL_H
 
-#include "nbin_standard.h"
 #include "fix_intel.h"
 #include "memory.h"
+#include "nbin_standard.h"
 
 namespace LAMMPS_NS {
 
@@ -35,7 +35,7 @@ class NBinIntel : public NBinStandard {
   ~NBinIntel();
   void bin_atoms_setup(int);
   void bin_atoms();
-  int * get_binpacked() { return _binpacked; }
+  int *get_binpacked() { return _binpacked; }
 
  private:
   FixIntel *_fix;
@@ -43,15 +43,14 @@ class NBinIntel : public NBinStandard {
   int _precision_mode;
   double memory_usage();
 
-  template 
-  void bin_atoms(IntelBuffers *);
+  template  void bin_atoms(IntelBuffers *);
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _cop, _offload_alloc;
-  #endif
+#endif
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_full_bin_ghost_intel.h b/src/INTEL/npair_full_bin_ghost_intel.h
index b4a1176d17..3830b07e6d 100644
--- a/src/INTEL/npair_full_bin_ghost_intel.h
+++ b/src/INTEL/npair_full_bin_ghost_intel.h
@@ -37,16 +37,16 @@ class NPairFullBinGhostIntel : public NPairIntel {
   NPairFullBinGhostIntel(class LAMMPS *);
   ~NPairFullBinGhostIntel() {}
   void build(class NeighList *);
+
  private:
-  template
-  void fbi(NeighList * list, IntelBuffers * buffers);
-  template
-  void fbi(const int offload, NeighList * list,
-           IntelBuffers * buffers,
+  template 
+  void fbi(NeighList *list, IntelBuffers *buffers);
+  template 
+  void fbi(const int offload, NeighList *list, IntelBuffers *buffers,
            const int astart, const int aend);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_full_bin_intel.h b/src/INTEL/npair_full_bin_intel.h
index f77557d840..720780898c 100644
--- a/src/INTEL/npair_full_bin_intel.h
+++ b/src/INTEL/npair_full_bin_intel.h
@@ -24,8 +24,8 @@ NPairStyle(full/bin/intel,
 #ifndef LMP_NPAIR_FULL_BIN_INTEL_H
 #define LMP_NPAIR_FULL_BIN_INTEL_H
 
-#include "npair_intel.h"
 #include "fix_intel.h"
+#include "npair_intel.h"
 
 namespace LAMMPS_NS {
 
@@ -36,11 +36,10 @@ class NPairFullBinIntel : public NPairIntel {
   void build(class NeighList *);
 
  private:
-  template 
-  void fbi(NeighList *, IntelBuffers *);
+  template  void fbi(NeighList *, IntelBuffers *);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_half_bin_newton_intel.h b/src/INTEL/npair_half_bin_newton_intel.h
index 18a6f0c103..9c9dcab703 100644
--- a/src/INTEL/npair_half_bin_newton_intel.h
+++ b/src/INTEL/npair_half_bin_newton_intel.h
@@ -23,8 +23,8 @@ NPairStyle(half/bin/newton/intel,
 #ifndef LMP_NPAIR_HALF_BIN_NEWTON_INTEL_H
 #define LMP_NPAIR_HALF_BIN_NEWTON_INTEL_H
 
-#include "npair_intel.h"
 #include "fix_intel.h"
+#include "npair_intel.h"
 
 namespace LAMMPS_NS {
 
@@ -35,11 +35,10 @@ class NPairHalfBinNewtonIntel : public NPairIntel {
   void build(class NeighList *);
 
  private:
-  template 
-  void hbni(NeighList *, IntelBuffers *);
+  template  void hbni(NeighList *, IntelBuffers *);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_half_bin_newton_tri_intel.h b/src/INTEL/npair_half_bin_newton_tri_intel.h
index 4603913e49..0d6f577b3d 100644
--- a/src/INTEL/npair_half_bin_newton_tri_intel.h
+++ b/src/INTEL/npair_half_bin_newton_tri_intel.h
@@ -23,8 +23,8 @@ NPairStyle(half/bin/newton/tri/intel,
 #ifndef LMP_NPAIR_HALF_BIN_NEWTON_INTEL_TRI_H
 #define LMP_NPAIR_HALF_BIN_NEWTON_INTEL_TRI_H
 
-#include "npair_intel.h"
 #include "fix_intel.h"
+#include "npair_intel.h"
 
 namespace LAMMPS_NS {
 
@@ -35,11 +35,10 @@ class NPairHalfBinNewtonTriIntel : public NPairIntel {
   void build(class NeighList *);
 
  private:
-  template 
-  void hbnti(NeighList *, IntelBuffers *);
+  template  void hbnti(NeighList *, IntelBuffers *);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_halffull_newton_intel.h b/src/INTEL/npair_halffull_newton_intel.h
index 614d975926..ea751c2421 100644
--- a/src/INTEL/npair_halffull_newton_intel.h
+++ b/src/INTEL/npair_halffull_newton_intel.h
@@ -33,14 +33,13 @@ NPairStyle(halffull/newton/skip/intel,
 #ifndef LMP_NPAIR_HALFFULL_NEWTON_INTEL_H
 #define LMP_NPAIR_HALFFULL_NEWTON_INTEL_H
 
-#include "npair.h"
 #include "fix_intel.h"
+#include "npair.h"
 
 #if defined(_OPENMP)
 #include 
 #endif
 
-
 namespace LAMMPS_NS {
 
 class NPairHalffullNewtonIntel : public NPair {
@@ -52,14 +51,12 @@ class NPairHalffullNewtonIntel : public NPair {
  protected:
   FixIntel *_fix;
 
-  template
-  void build_t(NeighList *, IntelBuffers *);
+  template  void build_t(NeighList *, IntelBuffers *);
 
-  template
-  void build_t3(NeighList *, int *);
+  template  void build_t3(NeighList *, int *);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/npair_skip_intel.h b/src/INTEL/npair_skip_intel.h
index e431a23e69..2c77b24cd5 100644
--- a/src/INTEL/npair_skip_intel.h
+++ b/src/INTEL/npair_skip_intel.h
@@ -31,14 +31,13 @@ NPairStyle(skip/ghost/intel,
 #ifndef LMP_NPAIR_SKIP_INTEL_H
 #define LMP_NPAIR_SKIP_INTEL_H
 
-#include "npair.h"
 #include "fix_intel.h"
+#include "npair.h"
 
 #if defined(_OPENMP)
 #include 
 #endif
 
-
 namespace LAMMPS_NS {
 
 class NPairSkipIntel : public NPair {
@@ -52,11 +51,11 @@ class NPairSkipIntel : public NPair {
   FixIntel *_fix;
   int *_inum_starts, *_inum_counts, *_full_props;
 
-  template
+  template 
   void build_t(NeighList *, int *numhalf, int *cnumneigh, int *numhalf_skip);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_airebo_intel.h b/src/INTEL/pair_airebo_intel.h
index 47093f1c29..32ae3a6581 100644
--- a/src/INTEL/pair_airebo_intel.h
+++ b/src/INTEL/pair_airebo_intel.h
@@ -25,14 +25,13 @@ PairStyle(airebo/intel,PairAIREBOIntel);
 #ifndef LMP_PAIR_AIREBO_INTEL_H
 #define LMP_PAIR_AIREBO_INTEL_H
 
-#include "pair.h"
 #include "fix_intel.h"
+#include "pair.h"
 #include "pair_airebo.h"
 
 namespace LAMMPS_NS {
 
-template
-struct PairAIREBOIntelParam;
+template  struct PairAIREBOIntelParam;
 
 class PairAIREBOIntel : public PairAIREBO {
  public:
@@ -40,32 +39,28 @@ class PairAIREBOIntel : public PairAIREBO {
   virtual ~PairAIREBOIntel();
   virtual void compute(int, int);
   virtual void init_style();
- protected:
 
+ protected:
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers);
+  void compute(int eflag, int vflag, IntelBuffers *buffers);
 
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const int astart, const int aend);
 
-  template 
-  void pack_force_const(IntelBuffers * buffers);
+  template  void pack_force_const(IntelBuffers *buffers);
 
-  template 
-  PairAIREBOIntelParam get_param();
+  template  PairAIREBOIntelParam get_param();
 
-  FixIntel * fix;
+  FixIntel *fix;
   int _cop;
 
-  int * REBO_cnumneigh;
-  int * REBO_num_skin;
-  int * REBO_list_data;
-
+  int *REBO_cnumneigh;
+  int *REBO_num_skin;
+  int *REBO_list_data;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_airebo_morse_intel.h b/src/INTEL/pair_airebo_morse_intel.h
index fb8e3dcf14..75d5808e85 100644
--- a/src/INTEL/pair_airebo_morse_intel.h
+++ b/src/INTEL/pair_airebo_morse_intel.h
@@ -35,7 +35,7 @@ class PairAIREBOMorseIntel : public PairAIREBOIntel {
   virtual void settings(int, char **);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_buck_coul_cut_intel.h b/src/INTEL/pair_buck_coul_cut_intel.h
index 793446f05e..9fe35affe4 100644
--- a/src/INTEL/pair_buck_coul_cut_intel.h
+++ b/src/INTEL/pair_buck_coul_cut_intel.h
@@ -26,8 +26,8 @@ PairStyle(buck/coul/cut/intel,PairBuckCoulCutIntel);
 #ifndef LMP_PAIR_BUCK_COUL_CUT_INTEL_H
 #define LMP_PAIR_BUCK_COUL_CUT_INTEL_H
 
-#include "pair_buck_coul_cut.h"
 #include "fix_intel.h"
+#include "pair_buck_coul_cut.h"
 
 namespace LAMMPS_NS {
 
@@ -38,7 +38,10 @@ class PairBuckCoulCutIntel : public PairBuckCoulCut {
   virtual ~PairBuckCoulCutIntel();
   virtual void compute(int, int);
   void init_style();
-  typedef struct { float x, y, z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
@@ -47,36 +50,38 @@ class PairBuckCoulCutIntel : public PairBuckCoulCut {
   template  class ForceConst;
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers * buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
 
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t buck1, buck2, rhoinv, pad; } c_force_t;
-    typedef struct { flt_t cutsq, cut_ljsq, cut_coulsq, pad; } c_cut_t;
-    typedef struct { flt_t a, c, offset, pad; } c_energy_t;
-    _alignvar(flt_t special_coul[4],64);
-    _alignvar(flt_t special_lj[4],64);
+    typedef struct {
+      flt_t buck1, buck2, rhoinv, pad;
+    } c_force_t;
+    typedef struct {
+      flt_t cutsq, cut_ljsq, cut_coulsq, pad;
+    } c_cut_t;
+    typedef struct {
+      flt_t a, c, offset, pad;
+    } c_energy_t;
+    _alignvar(flt_t special_coul[4], 64);
+    _alignvar(flt_t special_lj[4], 64);
 
     c_force_t **c_force;
     c_energy_t **c_energy;
     c_cut_t **c_cut;
 
     ForceConst() : _ntypes(0), _ntable(0) {}
-    ~ForceConst() { set_ntypes(0,0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int ntable, Memory *memory,
-                    const int cop);
+    void set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop);
 
    private:
     int _ntypes, _ntable, _cop;
@@ -86,7 +91,7 @@ class PairBuckCoulCutIntel : public PairBuckCoulCut {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
-#endif // LMP_PAIR_BUCK_COUL_CUT_INTEL_H
+#endif    // LMP_PAIR_BUCK_COUL_CUT_INTEL_H
 #endif
diff --git a/src/INTEL/pair_buck_coul_long_intel.h b/src/INTEL/pair_buck_coul_long_intel.h
index c9fc6d8f0f..01865afc56 100644
--- a/src/INTEL/pair_buck_coul_long_intel.h
+++ b/src/INTEL/pair_buck_coul_long_intel.h
@@ -25,8 +25,8 @@ PairStyle(buck/coul/long/intel,PairBuckCoulLongIntel);
 #ifndef LMP_PAIR_BUCK_COUL_LONG_INTEL_H
 #define LMP_PAIR_BUCK_COUL_LONG_INTEL_H
 
-#include "pair_buck_coul_long.h"
 #include "fix_intel.h"
+#include "pair_buck_coul_long.h"
 
 namespace LAMMPS_NS {
 
@@ -37,7 +37,10 @@ class PairBuckCoulLongIntel : public PairBuckCoulLong {
   virtual ~PairBuckCoulLongIntel();
   virtual void compute(int, int);
   void init_style();
-  typedef struct { float x, y, z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
@@ -46,26 +49,29 @@ class PairBuckCoulLongIntel : public PairBuckCoulLong {
   template  class ForceConst;
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers * buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
 
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cutsq, cut_ljsq, buck1, buck2; } c_force_t;
-    typedef struct { flt_t a, c, offset, pad; } c_energy_t;
-    typedef struct { flt_t r, dr, f, df; } table_t;
-    _alignvar(flt_t special_coul[4],64);
-    _alignvar(flt_t special_lj[4],64);
+    typedef struct {
+      flt_t cutsq, cut_ljsq, buck1, buck2;
+    } c_force_t;
+    typedef struct {
+      flt_t a, c, offset, pad;
+    } c_energy_t;
+    typedef struct {
+      flt_t r, dr, f, df;
+    } table_t;
+    _alignvar(flt_t special_coul[4], 64);
+    _alignvar(flt_t special_lj[4], 64);
     flt_t g_ewald, tabinnersq;
     c_force_t **c_force;
     c_energy_t **c_energy;
@@ -74,10 +80,9 @@ class PairBuckCoulLongIntel : public PairBuckCoulLong {
     flt_t *etable, *detable, *ctable, *dctable;
 
     ForceConst() : _ntypes(0), _ntable(0) {}
-    ~ForceConst() { set_ntypes(0,0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int ntable, Memory *memory,
-                    const int cop);
+    void set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop);
 
    private:
     int _ntypes, _ntable, _cop;
@@ -87,7 +92,7 @@ class PairBuckCoulLongIntel : public PairBuckCoulLong {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
-#endif // LMP_PAIR_BUCK_COUL_LONG_INTEL_H
+#endif    // LMP_PAIR_BUCK_COUL_LONG_INTEL_H
 #endif
diff --git a/src/INTEL/pair_buck_intel.h b/src/INTEL/pair_buck_intel.h
index 38615a86ec..307c8eb7b0 100644
--- a/src/INTEL/pair_buck_intel.h
+++ b/src/INTEL/pair_buck_intel.h
@@ -25,57 +25,60 @@ PairStyle(buck/intel,PairBuckIntel);
 #ifndef LMP_PAIR_BUCK_INTEL_H
 #define LMP_PAIR_BUCK_INTEL_H
 
-#include "pair_buck.h"
 #include "fix_intel.h"
+#include "pair_buck.h"
 
 namespace LAMMPS_NS {
 
 class PairBuckIntel : public PairBuck {
 
-public:
+ public:
   PairBuckIntel(class LAMMPS *);
   virtual ~PairBuckIntel();
   virtual void compute(int, int);
   void init_style();
-  typedef struct { float x, y, z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
-private:
+ private:
   FixIntel *fix;
   int _cop;
 
   template  class ForceConst;
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers * buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
 
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
 
-  public:
-    typedef struct { flt_t buck1, buck2, rhoinv, cutsq; } c_force_t;
-    typedef struct { flt_t a, c, offset, pad; } c_energy_t;
-    _alignvar(flt_t special_lj[4],64);
+   public:
+    typedef struct {
+      flt_t buck1, buck2, rhoinv, cutsq;
+    } c_force_t;
+    typedef struct {
+      flt_t a, c, offset, pad;
+    } c_energy_t;
+    _alignvar(flt_t special_lj[4], 64);
 
     c_force_t **c_force;
     c_energy_t **c_energy;
 
     ForceConst() : _ntypes(0) {}
-    ~ForceConst() { set_ntypes(0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, Memory *memory,
-                    const int cop);
+    void set_ntypes(const int ntypes, Memory *memory, const int cop);
 
-  private:
+   private:
     int _ntypes, _cop;
     Memory *_memory;
   };
@@ -84,7 +87,7 @@ private:
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
-#endif // LMP_PAIR_BUCK_INTEL_H
+#endif    // LMP_PAIR_BUCK_INTEL_H
 #endif
diff --git a/src/INTEL/pair_dpd_intel.h b/src/INTEL/pair_dpd_intel.h
index 2553638947..3e5c9b7d69 100644
--- a/src/INTEL/pair_dpd_intel.h
+++ b/src/INTEL/pair_dpd_intel.h
@@ -26,8 +26,8 @@ PairStyle(dpd/intel,PairDPDIntel);
 #ifndef LMP_PAIR_DPD_INTEL_H
 #define LMP_PAIR_DPD_INTEL_H
 
-#include "pair_dpd.h"
 #include "fix_intel.h"
+#include "pair_dpd.h"
 
 #ifdef LMP_USE_MKL_RNG
 #include "mkl_vsl.h"
@@ -52,42 +52,41 @@ class PairDPDIntel : public PairDPD {
   FixIntel *fix;
   int _cop, _onetype, _nrandom_thread;
 
-  #ifdef LMP_USE_MKL_RNG
+#ifdef LMP_USE_MKL_RNG
   VSLStreamStatePtr *random_thread;
-  #else
+#else
   RanMars **random_thread;
-  #endif
+#endif
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t icut, a0, gamma, sigma; } fc_packed1;
+    typedef struct {
+      flt_t icut, a0, gamma, sigma;
+    } fc_packed1;
 
-    _alignvar(flt_t special_lj[4],64);
+    _alignvar(flt_t special_lj[4], 64);
     fc_packed1 **param;
     flt_t **rand_buffer_thread;
     int *rngi;
 
-    ForceConst() : _ntypes(0)  {}
+    ForceConst() : _ntypes(0) {}
     ~ForceConst() { set_ntypes(0, 0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int nthreads, const int max_nbors,
-                    Memory *memory, const int cop);
+    void set_ntypes(const int ntypes, const int nthreads, const int max_nbors, Memory *memory,
+                    const int cop);
 
    private:
     int _ntypes, _cop;
@@ -97,7 +96,7 @@ class PairDPDIntel : public PairDPD {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_eam_alloy_intel.h b/src/INTEL/pair_eam_alloy_intel.h
index d1805da2c5..07f7df11ca 100644
--- a/src/INTEL/pair_eam_alloy_intel.h
+++ b/src/INTEL/pair_eam_alloy_intel.h
@@ -38,7 +38,7 @@ class PairEAMAlloyIntel : virtual public PairEAMIntel {
   void file2array();
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_eam_fs_intel.h b/src/INTEL/pair_eam_fs_intel.h
index 619d6b46e6..103e3a9c4b 100644
--- a/src/INTEL/pair_eam_fs_intel.h
+++ b/src/INTEL/pair_eam_fs_intel.h
@@ -38,7 +38,7 @@ class PairEAMFSIntel : virtual public PairEAMIntel {
   void file2array();
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_eam_intel.h b/src/INTEL/pair_eam_intel.h
index 9817625f07..6ea6a6b06c 100644
--- a/src/INTEL/pair_eam_intel.h
+++ b/src/INTEL/pair_eam_intel.h
@@ -21,15 +21,14 @@ PairStyle(eam/intel,PairEAMIntel);
 #ifndef LMP_PAIR_EAM_INTEL_H
 #define LMP_PAIR_EAM_INTEL_H
 
-#include "pair_eam.h"
 #include "fix_intel.h"
+#include "pair_eam.h"
 
 namespace LAMMPS_NS {
 
-
 class PairEAMIntel : public PairEAM {
  public:
-  friend class FixSemiGrandCanonicalMC;   // Alex Stukowski option
+  friend class FixSemiGrandCanonicalMC;    // Alex Stukowski option
 
   PairEAMIntel(class LAMMPS *);
   virtual ~PairEAMIntel();
@@ -39,53 +38,49 @@ class PairEAMIntel : public PairEAM {
   void unpack_forward_comm(int, int, double *);
 
  protected:
-
   FixIntel *fix;
   int _cop, _onetype, _ccache_stride;
   float *fp_float;
 
-  template 
-  int pack_forward_comm(int, int *, double *, flt_t *);
-  template 
-  void unpack_forward_comm(int, int, double *, flt_t *);
+  template  int pack_forward_comm(int, int *, double *, flt_t *);
+  template  void unpack_forward_comm(int, int, double *, flt_t *);
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
-  template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  template 
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
 
-  template 
-  class ForceConst {
-  public:
-    typedef struct { flt_t a, b, c, d; } fc_packed1;
-    typedef struct { flt_t a, b, c, d, e, f, g, h; } fc_packed2;
+  template  class ForceConst {
+   public:
+    typedef struct {
+      flt_t a, b, c, d;
+    } fc_packed1;
+    typedef struct {
+      flt_t a, b, c, d, e, f, g, h;
+    } fc_packed2;
 
     flt_t **scale_f;
     fc_packed1 *rhor_spline_f, *rhor_spline_e;
     fc_packed1 *frho_spline_f, *frho_spline_e;
     fc_packed2 *z2r_spline_t;
 
-    ForceConst() : _ntypes(0), _nr(0)  {}
+    ForceConst() : _ntypes(0), _nr(0) {}
     ~ForceConst() { set_ntypes(0, 0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int nr, const int nrho,
-                    Memory *memory, const int cop);
+    void set_ntypes(const int ntypes, const int nr, const int nrho, Memory *memory, const int cop);
     inline int rhor_jstride() const { return _nr; }
     inline int rhor_istride() const { return _nr * _ntypes; }
     inline int frho_stride() const { return _nrho; }
 
-  private:
+   private:
     int _ntypes, _nr, _nrho, _cop;
     Memory *_memory;
   };
@@ -93,7 +88,7 @@ class PairEAMIntel : public PairEAM {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_gayberne_intel.h b/src/INTEL/pair_gayberne_intel.h
index b726055c6b..67132770bf 100644
--- a/src/INTEL/pair_gayberne_intel.h
+++ b/src/INTEL/pair_gayberne_intel.h
@@ -25,8 +25,8 @@ PairStyle(gayberne/intel,PairGayBerneIntel);
 #ifndef LMP_PAIR_GAYBERNE_INTEL_H
 #define LMP_PAIR_GAYBERNE_INTEL_H
 
-#include "pair_gayberne.h"
 #include "fix_intel.h"
+#include "pair_gayberne.h"
 
 namespace LAMMPS_NS {
 
@@ -42,31 +42,32 @@ class PairGayBerneIntel : public PairGayBerne {
   template  class ForceConst;
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
     typedef struct {
       flt_t cutsq, lj1, lj2, offset, sigma, epsilon, lshape;
       int form;
     } fc_packed1;
-    typedef struct { flt_t lj3, lj4; } fc_packed2;
-    typedef struct { flt_t shape2[4], well[4]; } fc_packed3;
+    typedef struct {
+      flt_t lj3, lj4;
+    } fc_packed2;
+    typedef struct {
+      flt_t shape2[4], well[4];
+    } fc_packed3;
 
-    _alignvar(flt_t special_lj[4],64);
-    _alignvar(flt_t gamma,64);
-    _alignvar(flt_t upsilon,64);
-    _alignvar(flt_t mu,64);
+    _alignvar(flt_t special_lj[4], 64);
+    _alignvar(flt_t gamma, 64);
+    _alignvar(flt_t upsilon, 64);
+    _alignvar(flt_t mu, 64);
     fc_packed1 **ijc;
     fc_packed2 **lj34;
     fc_packed3 *ic;
@@ -74,11 +75,11 @@ class PairGayBerneIntel : public PairGayBerne {
     flt_t **rsq_form, **delx_form, **dely_form, **delz_form;
     int **jtype_form, **jlist_form;
 
-    ForceConst() : _ntypes(0)  {}
+    ForceConst() : _ntypes(0) {}
     ~ForceConst() { set_ntypes(0, 0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int one_length,
-                    const int nthreads, Memory *memory, const int cop);
+    void set_ntypes(const int ntypes, const int one_length, const int nthreads, Memory *memory,
+                    const int cop);
 
    private:
     int _ntypes, _cop;
@@ -89,15 +90,14 @@ class PairGayBerneIntel : public PairGayBerne {
   ForceConst force_const_double;
   int _max_nbors;
 
-  double gayberne_lj(const int i, const int j, double a1[3][3],
-                     double b1[3][3], double g1[3][3], double *r12,
-                     const double rsq, double *fforce, double *ttor);
+  double gayberne_lj(const int i, const int j, double a1[3][3], double b1[3][3], double g1[3][3],
+                     double *r12, const double rsq, double *fforce, double *ttor);
 
   FixIntel *fix;
   int _cop;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_lj_charmm_coul_charmm_intel.h b/src/INTEL/pair_lj_charmm_coul_charmm_intel.h
index cf868787e6..69cf1bcf17 100644
--- a/src/INTEL/pair_lj_charmm_coul_charmm_intel.h
+++ b/src/INTEL/pair_lj_charmm_coul_charmm_intel.h
@@ -25,8 +25,8 @@ PairStyle(lj/charmm/coul/charmm/intel,PairLJCharmmCoulCharmmIntel);
 #ifndef LMP_PAIR_LJ_CHARMM_COUL_CHARMM_INTEL_H
 #define LMP_PAIR_LJ_CHARMM_COUL_CHARMM_INTEL_H
 
-#include "pair_lj_charmm_coul_charmm.h"
 #include "fix_intel.h"
+#include "pair_lj_charmm_coul_charmm.h"
 
 namespace LAMMPS_NS {
 
@@ -39,7 +39,10 @@ class PairLJCharmmCoulCharmmIntel : public PairLJCharmmCoulCharmm {
   virtual void compute(int, int);
   void init_style();
 
-  typedef struct { float x,y,z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
@@ -47,30 +50,27 @@ class PairLJCharmmCoulCharmmIntel : public PairLJCharmmCoulCharmm {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    _alignvar(flt_t special_coul[4],64);
-    _alignvar(flt_t special_lj[4],64);
+    _alignvar(flt_t special_coul[4], 64);
+    _alignvar(flt_t special_lj[4], 64);
     flt_t **cutsq;
     flt_t cut_coulsq, cut_ljsq;
     flt_t cut_coul_innersq, cut_lj_innersq;
-    typename IntelBuffers::vec4_t **lj;
+    typename IntelBuffers::vec4_t **lj;
 
     ForceConst() : _ntypes(0) {}
-    ~ForceConst() { set_ntypes(0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, nullptr, _cop); }
 
     void set_ntypes(const int ntypes, Memory *memory, const int cop);
 
@@ -82,7 +82,7 @@ class PairLJCharmmCoulCharmmIntel : public PairLJCharmmCoulCharmm {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_lj_charmm_coul_long_intel.h b/src/INTEL/pair_lj_charmm_coul_long_intel.h
index b860fda3e3..95366b6218 100644
--- a/src/INTEL/pair_lj_charmm_coul_long_intel.h
+++ b/src/INTEL/pair_lj_charmm_coul_long_intel.h
@@ -25,8 +25,8 @@ PairStyle(lj/charmm/coul/long/intel,PairLJCharmmCoulLongIntel);
 #ifndef LMP_PAIR_LJ_CHARMM_COUL_LONG_INTEL_H
 #define LMP_PAIR_LJ_CHARMM_COUL_LONG_INTEL_H
 
-#include "pair_lj_charmm_coul_long.h"
 #include "fix_intel.h"
+#include "pair_lj_charmm_coul_long.h"
 
 namespace LAMMPS_NS {
 
@@ -39,7 +39,10 @@ class PairLJCharmmCoulLongIntel : public PairLJCharmmCoulLong {
   virtual void compute(int, int);
   void init_style();
 
-  typedef struct { float x,y,z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
@@ -47,36 +50,34 @@ class PairLJCharmmCoulLongIntel : public PairLJCharmmCoulLong {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t r, dr, f, df; } table_t;
-    _alignvar(flt_t special_coul[4],64);
-    _alignvar(flt_t special_lj[4],64);
+    typedef struct {
+      flt_t r, dr, f, df;
+    } table_t;
+    _alignvar(flt_t special_coul[4], 64);
+    _alignvar(flt_t special_lj[4], 64);
     flt_t **cutsq, g_ewald, tabinnersq;
     flt_t cut_coulsq, cut_ljsq;
     flt_t cut_lj_innersq;
     table_t *table;
     flt_t *etable, *detable, *ctable, *dctable;
-    typename IntelBuffers::vec2_t **lj;
+    typename IntelBuffers::vec2_t **lj;
 
     ForceConst() : _ntypes(0), _ntable(0) {}
-    ~ForceConst() { set_ntypes(0,0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int ntable, Memory *memory,
-                    const int cop);
+    void set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop);
 
    private:
     int _ntypes, _ntable, _cop;
@@ -86,7 +87,7 @@ class PairLJCharmmCoulLongIntel : public PairLJCharmmCoulLong {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_lj_cut_coul_long_intel.h b/src/INTEL/pair_lj_cut_coul_long_intel.h
index 4be9cbd1f5..c72c9a9ded 100644
--- a/src/INTEL/pair_lj_cut_coul_long_intel.h
+++ b/src/INTEL/pair_lj_cut_coul_long_intel.h
@@ -25,8 +25,8 @@ PairStyle(lj/cut/coul/long/intel,PairLJCutCoulLongIntel);
 #ifndef LMP_PAIR_LJ_CUT_COUL_LONG_INTEL_H
 #define LMP_PAIR_LJ_CUT_COUL_LONG_INTEL_H
 
-#include "pair_lj_cut_coul_long.h"
 #include "fix_intel.h"
+#include "pair_lj_cut_coul_long.h"
 
 namespace LAMMPS_NS {
 
@@ -39,7 +39,10 @@ class PairLJCutCoulLongIntel : public PairLJCutCoulLong {
   virtual void compute(int, int);
   void init_style();
 
-  typedef struct { float x,y,z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
@@ -47,26 +50,29 @@ class PairLJCutCoulLongIntel : public PairLJCutCoulLong {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cutsq, cut_ljsq, lj1, lj2; } c_force_t;
-    typedef struct { flt_t lj3, lj4, offset, pad; } c_energy_t;
-    typedef struct { flt_t r, dr, f, df; } table_t;
-    _alignvar(flt_t special_coul[4],64);
-    _alignvar(flt_t special_lj[4],64);
+    typedef struct {
+      flt_t cutsq, cut_ljsq, lj1, lj2;
+    } c_force_t;
+    typedef struct {
+      flt_t lj3, lj4, offset, pad;
+    } c_energy_t;
+    typedef struct {
+      flt_t r, dr, f, df;
+    } table_t;
+    _alignvar(flt_t special_coul[4], 64);
+    _alignvar(flt_t special_lj[4], 64);
     flt_t g_ewald, tabinnersq;
     c_force_t **c_force;
     c_energy_t **c_energy;
@@ -74,10 +80,9 @@ class PairLJCutCoulLongIntel : public PairLJCutCoulLong {
     flt_t *etable, *detable, *ctable, *dctable;
 
     ForceConst() : _ntypes(0), _ntable(0) {}
-    ~ForceConst() { set_ntypes(0,0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, 0, nullptr, _cop); }
 
-    void set_ntypes(const int ntypes, const int ntable, Memory *memory,
-                    const int cop);
+    void set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop);
 
    private:
     int _ntypes, _ntable, _cop;
@@ -87,7 +92,7 @@ class PairLJCutCoulLongIntel : public PairLJCutCoulLong {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_lj_cut_intel.h b/src/INTEL/pair_lj_cut_intel.h
index a5a48148f2..6003a376a0 100644
--- a/src/INTEL/pair_lj_cut_intel.h
+++ b/src/INTEL/pair_lj_cut_intel.h
@@ -25,8 +25,8 @@ PairStyle(lj/cut/intel,PairLJCutIntel);
 #ifndef LMP_PAIR_LJ_CUT_INTEL_H
 #define LMP_PAIR_LJ_CUT_INTEL_H
 
-#include "pair_lj_cut.h"
 #include "fix_intel.h"
+#include "pair_lj_cut.h"
 
 namespace LAMMPS_NS {
 
@@ -44,30 +44,31 @@ class PairLJCutIntel : public PairLJCut {
 
   template  class ForceConst;
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   // ----------------------------------------------------------------------
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cutsq, lj1, lj2, offset; } fc_packed1;
-    typedef struct { flt_t lj3, lj4; } fc_packed2;
+    typedef struct {
+      flt_t cutsq, lj1, lj2, offset;
+    } fc_packed1;
+    typedef struct {
+      flt_t lj3, lj4;
+    } fc_packed2;
 
-    _alignvar(flt_t special_lj[4],64);
+    _alignvar(flt_t special_lj[4], 64);
     fc_packed1 **ljc12o;
     fc_packed2 **lj34;
 
-    ForceConst() : _ntypes(0)  {}
+    ForceConst() : _ntypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr, _cop); }
 
     void set_ntypes(const int ntypes, Memory *memory, const int cop);
@@ -80,7 +81,7 @@ class PairLJCutIntel : public PairLJCut {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_lj_long_coul_long_intel.h b/src/INTEL/pair_lj_long_coul_long_intel.h
index d1213dda62..6faa2519a3 100644
--- a/src/INTEL/pair_lj_long_coul_long_intel.h
+++ b/src/INTEL/pair_lj_long_coul_long_intel.h
@@ -25,16 +25,15 @@ PairStyle(lj/long/coul/long/intel,PairLJLongCoulLongIntel);
 #ifndef LMP_PAIR_LJ_LONG_COUL_LONG_INTEL_H
 #define LMP_PAIR_LJ_LONG_COUL_LONG_INTEL_H
 
-#include "pair_lj_long_coul_long.h"
 #include "fix_intel.h"
+#include "pair_lj_long_coul_long.h"
 
 namespace LAMMPS_NS {
-  class PairLJLongCoulLongIntel : public PairLJLongCoulLong {
-  public:
-    PairLJLongCoulLongIntel(class LAMMPS *);
-    virtual ~PairLJLongCoulLongIntel();
-
-  };
-}
+class PairLJLongCoulLongIntel : public PairLJLongCoulLong {
+ public:
+  PairLJLongCoulLongIntel(class LAMMPS *);
+  virtual ~PairLJLongCoulLongIntel();
+};
+}    // namespace LAMMPS_NS
 #endif
 #endif
diff --git a/src/INTEL/pair_rebo_intel.h b/src/INTEL/pair_rebo_intel.h
index 0946e297c4..76b915a1d8 100644
--- a/src/INTEL/pair_rebo_intel.h
+++ b/src/INTEL/pair_rebo_intel.h
@@ -35,7 +35,7 @@ class PairREBOIntel : public PairAIREBOIntel {
   virtual void settings(int, char **);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_sw_intel.h b/src/INTEL/pair_sw_intel.h
index a60c2b0a0d..55da7eb261 100644
--- a/src/INTEL/pair_sw_intel.h
+++ b/src/INTEL/pair_sw_intel.h
@@ -25,8 +25,8 @@ PairStyle(sw/intel,PairSWIntel);
 #ifndef LMP_PAIR_SW_INTEL_H
 #define LMP_PAIR_SW_INTEL_H
 
-#include "pair_sw.h"
 #include "fix_intel.h"
+#include "pair_sw.h"
 
 namespace LAMMPS_NS {
 
@@ -45,26 +45,23 @@ class PairSWIntel : public PairSW {
   virtual void allocate();
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers, const ForceConst &fc,
-            const int astart, const int aend);
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
+            const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 
   int _ccache_stride, _spq, _onetype, _onetype3;
-  #ifdef LMP_USE_AVXCD
+#ifdef LMP_USE_AVXCD
   int _ccache_stride3;
-  #endif
+#endif
 
   // ----------------------------------------------------------------------
 
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
     typedef struct {
       flt_t cutsq, cut, sigma_gamma, pad;
@@ -88,7 +85,7 @@ class PairSWIntel : public PairSW {
     fc_packed2 **p2e;
     fc_packed3 ***p3;
 
-    ForceConst() : p2(0), p2f(0), p2f2(0), p2e(0), p3(0), _ntypes(0)  {}
+    ForceConst() : p2(0), p2f(0), p2f2(0), p2e(0), p3(0), _ntypes(0) {}
     ~ForceConst() { set_ntypes(0, nullptr, _cop); }
 
     void set_ntypes(const int ntypes, Memory *memory, const int cop);
@@ -101,7 +98,7 @@ class PairSWIntel : public PairSW {
   ForceConst force_const_double;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/pair_tersoff_intel.h b/src/INTEL/pair_tersoff_intel.h
index b40ce19787..6748e4aa16 100644
--- a/src/INTEL/pair_tersoff_intel.h
+++ b/src/INTEL/pair_tersoff_intel.h
@@ -24,8 +24,8 @@ PairStyle(tersoff/intel,PairTersoffIntel);
 #ifndef LMP_PAIR_TERSOFF_INTEL_H
 #define LMP_PAIR_TERSOFF_INTEL_H
 
-#include "pair.h"
 #include "fix_intel.h"
+#include "pair.h"
 #include "pair_tersoff.h"
 
 #ifdef __INTEL_COMPILER
@@ -39,38 +39,52 @@ class PairTersoffIntel : public PairTersoff {
   void init_style();
 
  protected:
-  typedef struct { float x,y,z; int w; } sng4_t;
+  typedef struct {
+    float x, y, z;
+    int w;
+  } sng4_t;
 
  private:
   FixIntel *fix;
   int _cop;
 
-  public: // wo needs secrets?
+ public:    // wo needs secrets?
   // ----------------------------------------------------------------------
   //
-  template 
-  class ForceConst {
+  template  class ForceConst {
    public:
-    typedef struct { flt_t cutsq; } c_cutoff_t;
-    typedef struct { flt_t bigr, bigd, lam1, biga; } c_first_loop_t;
-    typedef struct { flt_t lam2, beta, bigb, powern, c1, c2, c3, c4; } c_second_loop_t;
-    typedef struct { flt_t lam3, bigr, bigd, c2, d2, h, gamma, powermint; } c_inner_loop_t;
-    typedef struct { flt_t cutsq, pad[3];
-                     flt_t bigr, bigd, lam1, biga;
-                     flt_t lam2, beta, bigb, powern;
-                     flt_t c1, c2, c3, c4; } c_outer_t;
-    typedef struct { flt_t cutsq, pad[7];
-                     flt_t lam3, powermint, bigr, bigd;
-                     flt_t c2, d2, h, gamma; } c_inner_t;
-    c_cutoff_t * * c_cutoff_outer;
-    c_cutoff_t * * * c_cutoff_inner;
-    c_first_loop_t * * c_first_loop;
-    c_second_loop_t * * c_second_loop;
-    c_inner_loop_t * * * c_inner_loop;
-    c_outer_t * * c_outer;
-    c_inner_t * * * c_inner;
+    typedef struct {
+      flt_t cutsq;
+    } c_cutoff_t;
+    typedef struct {
+      flt_t bigr, bigd, lam1, biga;
+    } c_first_loop_t;
+    typedef struct {
+      flt_t lam2, beta, bigb, powern, c1, c2, c3, c4;
+    } c_second_loop_t;
+    typedef struct {
+      flt_t lam3, bigr, bigd, c2, d2, h, gamma, powermint;
+    } c_inner_loop_t;
+    typedef struct {
+      flt_t cutsq, pad[3];
+      flt_t bigr, bigd, lam1, biga;
+      flt_t lam2, beta, bigb, powern;
+      flt_t c1, c2, c3, c4;
+    } c_outer_t;
+    typedef struct {
+      flt_t cutsq, pad[7];
+      flt_t lam3, powermint, bigr, bigd;
+      flt_t c2, d2, h, gamma;
+    } c_inner_t;
+    c_cutoff_t **c_cutoff_outer;
+    c_cutoff_t ***c_cutoff_inner;
+    c_first_loop_t **c_first_loop;
+    c_second_loop_t **c_second_loop;
+    c_inner_loop_t ***c_inner_loop;
+    c_outer_t **c_outer;
+    c_inner_t ***c_inner;
     ForceConst() : _ntypes(0) {}
-    ~ForceConst() { set_ntypes(0,nullptr,_cop); }
+    ~ForceConst() { set_ntypes(0, nullptr, _cop); }
 
     void set_ntypes(const int ntypes, Memory *memory, const int cop);
 
@@ -82,20 +96,18 @@ class PairTersoffIntel : public PairTersoff {
   ForceConst force_const_double;
 
   template 
-  void compute(int eflag, int vflag, IntelBuffers *buffers,
+  void compute(int eflag, int vflag, IntelBuffers *buffers,
                const ForceConst &fc);
   template 
-  void eval(const int offload, const int vflag,
-            IntelBuffers * buffers,
+  void eval(const int offload, const int vflag, IntelBuffers *buffers,
             const ForceConst &fc, const int astart, const int aend);
 
   template 
-  void pack_force_const(ForceConst &fc,
-                        IntelBuffers *buffers);
+  void pack_force_const(ForceConst &fc, IntelBuffers *buffers);
 };
 
-}
-#endif // __INTEL_COMPILER
+}    // namespace LAMMPS_NS
+#endif    // __INTEL_COMPILER
 
 #endif
 #endif
diff --git a/src/INTEL/pppm_disp_intel.h b/src/INTEL/pppm_disp_intel.h
index bc6ed2f54f..2bac82ec9a 100644
--- a/src/INTEL/pppm_disp_intel.h
+++ b/src/INTEL/pppm_disp_intel.h
@@ -25,212 +25,204 @@ KSpaceStyle(pppm/disp/intel,PPPMDispIntel);
 #ifndef LMP_PPPMINTEL_DISP_H
 #define LMP_PPPMINTEL_DISP_H
 
-#include "pppm_disp.h"
 #include "fix_intel.h"
+#include "pppm_disp.h"
 
 namespace LAMMPS_NS {
 
-  class PPPMDispIntel : public PPPMDisp {
-  public:
-    PPPMDispIntel(class LAMMPS *);
-    virtual ~PPPMDispIntel();
-    virtual void init();
-    virtual void compute(int, int);
+class PPPMDispIntel : public PPPMDisp {
+ public:
+  PPPMDispIntel(class LAMMPS *);
+  virtual ~PPPMDispIntel();
+  virtual void init();
+  virtual void compute(int, int);
 
-    #ifdef _LMP_INTEL_OFFLOAD
-    int use_base();
-    #endif
-
-  protected:
-    FixIntel *fix;
-
-    int _use_lrt;
-    FFT_SCALAR **perthread_density;
-    FFT_SCALAR *particle_ekx;
-    FFT_SCALAR *particle_eky;
-    FFT_SCALAR *particle_ekz;
-    FFT_SCALAR *particle_ekx0;
-    FFT_SCALAR *particle_eky0;
-    FFT_SCALAR *particle_ekz0;
-    FFT_SCALAR *particle_ekx1;
-    FFT_SCALAR *particle_eky1;
-    FFT_SCALAR *particle_ekz1;
-    FFT_SCALAR *particle_ekx2;
-    FFT_SCALAR *particle_eky2;
-    FFT_SCALAR *particle_ekz2;
-    FFT_SCALAR *particle_ekx3;
-    FFT_SCALAR *particle_eky3;
-    FFT_SCALAR *particle_ekz3;
-    FFT_SCALAR *particle_ekx4;
-    FFT_SCALAR *particle_eky4;
-    FFT_SCALAR *particle_ekz4;
-    FFT_SCALAR *particle_ekx5;
-    FFT_SCALAR *particle_eky5;
-    FFT_SCALAR *particle_ekz5;
-    FFT_SCALAR *particle_ekx6;
-    FFT_SCALAR *particle_eky6;
-    FFT_SCALAR *particle_ekz6;
-
-    int _use_table;
-    int rho_points;
-    FFT_SCALAR **rho_lookup;
-    FFT_SCALAR **rho6_lookup;
-    FFT_SCALAR **drho_lookup;
-    FFT_SCALAR **drho6_lookup;
-    FFT_SCALAR half_rho_scale, half_rho_scale_plus;
-
-    int _use_packing;
-
-    #ifdef _LMP_INTEL_OFFLOAD
-    int _use_base;
-    #endif
-
-    template
-    void particle_map(double, double, double,
-                      double, int **, int, int,
-                      int, int, int,
-                      int, int, int,
-                      IntelBuffers *buffers);
-
-    template
-    void make_rho_c(IntelBuffers *buffers);
-    template
-    void make_rho_c(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        make_rho_c(buffers);
-      } else {
-        make_rho_c(buffers);
-      }
-    }
-
-    template
-    void make_rho_g(IntelBuffers *buffers);
-    template
-    void make_rho_g(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        make_rho_g(buffers);
-      } else {
-        make_rho_g(buffers);
-      }
-    }
-
-    template
-    void make_rho_a(IntelBuffers *buffers);
-    template
-    void make_rho_a(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        make_rho_a(buffers);
-      } else {
-        make_rho_a(buffers);
-      }
-    }
-
-
-    template
-    void make_rho_none(IntelBuffers *buffers);
-    template
-    void make_rho_none(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        make_rho_none(buffers);
-      } else {
-        make_rho_none(buffers);
-      }
-    }
-
-
-    template
-    void fieldforce_c_ik(IntelBuffers *buffers);
-    template
-    void fieldforce_c_ik(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_c_ik(buffers);
-      } else {
-        fieldforce_c_ik(buffers);
-      }
-    }
-
-    template
-    void fieldforce_c_ad(IntelBuffers *buffers);
-    template
-    void fieldforce_c_ad(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_c_ad(buffers);
-      } else {
-        fieldforce_c_ad(buffers);
-      }
-    }
-
-    template
-    void fieldforce_g_ik(IntelBuffers *buffers);
-    template
-    void fieldforce_g_ik(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_g_ik(buffers);
-      } else {
-        fieldforce_g_ik(buffers);
-      }
-    }
-
-    template
-    void fieldforce_g_ad(IntelBuffers *buffers);
-    template
-    void fieldforce_g_ad(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_g_ad(buffers);
-      } else {
-        fieldforce_g_ad(buffers);
-      }
-    }
-
-    template
-    void fieldforce_a_ik(IntelBuffers *buffers);
-    template
-    void fieldforce_a_ik(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_a_ik(buffers);
-      } else {
-        fieldforce_a_ik(buffers);
-      }
-    }
-
-    template
-    void fieldforce_a_ad(IntelBuffers *buffers);
-    template
-    void fieldforce_a_ad(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_a_ad(buffers);
-      } else {
-        fieldforce_a_ad(buffers);
-      }
-    }
-    template
-    void fieldforce_none_ik(IntelBuffers *buffers);
-     template
-    void fieldforce_none_ik(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_none_ik(buffers);
-      } else {
-        fieldforce_none_ik(buffers);
-      }
-    }
-
-    template
-    void fieldforce_none_ad(IntelBuffers *buffers);
-    template
-    void fieldforce_none_ad(IntelBuffers *buffers) {
-      if (_use_table == 1) {
-        fieldforce_none_ad(buffers);
-      } else {
-        fieldforce_none_ad(buffers);
-      }
-    }
-
-    void precompute_rho();
-
-  };
-
-}
-#endif
+#ifdef _LMP_INTEL_OFFLOAD
+  int use_base();
 #endif
 
+ protected:
+  FixIntel *fix;
 
+  int _use_lrt;
+  FFT_SCALAR **perthread_density;
+  FFT_SCALAR *particle_ekx;
+  FFT_SCALAR *particle_eky;
+  FFT_SCALAR *particle_ekz;
+  FFT_SCALAR *particle_ekx0;
+  FFT_SCALAR *particle_eky0;
+  FFT_SCALAR *particle_ekz0;
+  FFT_SCALAR *particle_ekx1;
+  FFT_SCALAR *particle_eky1;
+  FFT_SCALAR *particle_ekz1;
+  FFT_SCALAR *particle_ekx2;
+  FFT_SCALAR *particle_eky2;
+  FFT_SCALAR *particle_ekz2;
+  FFT_SCALAR *particle_ekx3;
+  FFT_SCALAR *particle_eky3;
+  FFT_SCALAR *particle_ekz3;
+  FFT_SCALAR *particle_ekx4;
+  FFT_SCALAR *particle_eky4;
+  FFT_SCALAR *particle_ekz4;
+  FFT_SCALAR *particle_ekx5;
+  FFT_SCALAR *particle_eky5;
+  FFT_SCALAR *particle_ekz5;
+  FFT_SCALAR *particle_ekx6;
+  FFT_SCALAR *particle_eky6;
+  FFT_SCALAR *particle_ekz6;
+
+  int _use_table;
+  int rho_points;
+  FFT_SCALAR **rho_lookup;
+  FFT_SCALAR **rho6_lookup;
+  FFT_SCALAR **drho_lookup;
+  FFT_SCALAR **drho6_lookup;
+  FFT_SCALAR half_rho_scale, half_rho_scale_plus;
+
+  int _use_packing;
+
+#ifdef _LMP_INTEL_OFFLOAD
+  int _use_base;
+#endif
+
+  template 
+  void particle_map(double, double, double, double, int **, int, int, int, int, int, int, int, int,
+                    IntelBuffers *buffers);
+
+  template 
+  void make_rho_c(IntelBuffers *buffers);
+  template  void make_rho_c(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      make_rho_c(buffers);
+    } else {
+      make_rho_c(buffers);
+    }
+  }
+
+  template 
+  void make_rho_g(IntelBuffers *buffers);
+  template  void make_rho_g(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      make_rho_g(buffers);
+    } else {
+      make_rho_g(buffers);
+    }
+  }
+
+  template 
+  void make_rho_a(IntelBuffers *buffers);
+  template  void make_rho_a(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      make_rho_a(buffers);
+    } else {
+      make_rho_a(buffers);
+    }
+  }
+
+  template 
+  void make_rho_none(IntelBuffers *buffers);
+  template  void make_rho_none(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      make_rho_none(buffers);
+    } else {
+      make_rho_none(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_c_ik(IntelBuffers *buffers);
+  template  void fieldforce_c_ik(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_c_ik(buffers);
+    } else {
+      fieldforce_c_ik(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_c_ad(IntelBuffers *buffers);
+  template  void fieldforce_c_ad(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_c_ad(buffers);
+    } else {
+      fieldforce_c_ad(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_g_ik(IntelBuffers *buffers);
+  template  void fieldforce_g_ik(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_g_ik(buffers);
+    } else {
+      fieldforce_g_ik(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_g_ad(IntelBuffers *buffers);
+  template  void fieldforce_g_ad(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_g_ad(buffers);
+    } else {
+      fieldforce_g_ad(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_a_ik(IntelBuffers *buffers);
+  template  void fieldforce_a_ik(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_a_ik(buffers);
+    } else {
+      fieldforce_a_ik(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_a_ad(IntelBuffers *buffers);
+  template  void fieldforce_a_ad(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_a_ad(buffers);
+    } else {
+      fieldforce_a_ad(buffers);
+    }
+  }
+  template 
+  void fieldforce_none_ik(IntelBuffers *buffers);
+  template  void fieldforce_none_ik(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_none_ik(buffers);
+    } else {
+      fieldforce_none_ik(buffers);
+    }
+  }
+
+  template 
+  void fieldforce_none_ad(IntelBuffers *buffers);
+  template  void fieldforce_none_ad(IntelBuffers *buffers)
+  {
+    if (_use_table == 1) {
+      fieldforce_none_ad(buffers);
+    } else {
+      fieldforce_none_ad(buffers);
+    }
+  }
+
+  void precompute_rho();
+};
+
+}    // namespace LAMMPS_NS
+#endif
+#endif
diff --git a/src/INTEL/pppm_intel.h b/src/INTEL/pppm_intel.h
index c0e66996c1..c6b3d83aa5 100644
--- a/src/INTEL/pppm_intel.h
+++ b/src/INTEL/pppm_intel.h
@@ -28,8 +28,8 @@ KSpaceStyle(pppm/intel,PPPMIntel);
 #ifndef LMP_PPPMINTEL_H
 #define LMP_PPPMINTEL_H
 
-#include "pppm.h"
 #include "fix_intel.h"
+#include "pppm.h"
 
 namespace LAMMPS_NS {
 
@@ -44,9 +44,9 @@ class PPPMIntel : public PPPM {
   void compute_second(int, int);
   void pack_buffers();
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int use_base();
-  #endif
+#endif
 
  protected:
   FixIntel *fix;
@@ -63,53 +63,50 @@ class PPPMIntel : public PPPM {
   FFT_SCALAR **drho_lookup;
   FFT_SCALAR half_rho_scale, half_rho_scale_plus;
 
-  #ifdef _LMP_INTEL_OFFLOAD
+#ifdef _LMP_INTEL_OFFLOAD
   int _use_base;
-  #endif
+#endif
 
   virtual void allocate();
 
-  template
-  void test_function(IntelBuffers *buffers);
+  template  void test_function(IntelBuffers *buffers);
 
   void precompute_rho();
-  template
-  void particle_map(IntelBuffers *buffers);
-  template
-  void make_rho(IntelBuffers *buffers);
-  template
-  void make_rho(IntelBuffers *buffers) {
+  template  void particle_map(IntelBuffers *buffers);
+  template 
+  void make_rho(IntelBuffers *buffers);
+  template  void make_rho(IntelBuffers *buffers)
+  {
     if (_use_table == 1) {
-      make_rho(buffers);
+      make_rho(buffers);
     } else {
-      make_rho(buffers);
+      make_rho(buffers);
     }
   }
-  template
-  void fieldforce_ik(IntelBuffers *buffers);
-  template
-  void fieldforce_ik(IntelBuffers *buffers) {
+  template 
+  void fieldforce_ik(IntelBuffers *buffers);
+  template  void fieldforce_ik(IntelBuffers *buffers)
+  {
     if (_use_table == 1) {
       fieldforce_ik(buffers);
     } else {
       fieldforce_ik(buffers);
     }
   }
-  template
-  void fieldforce_ad(IntelBuffers *buffers);
-  template
-  void fieldforce_ad(IntelBuffers *buffers) {
+  template 
+  void fieldforce_ad(IntelBuffers *buffers);
+  template  void fieldforce_ad(IntelBuffers *buffers)
+  {
     if (_use_table == 1) {
-      fieldforce_ad(buffers);
+      fieldforce_ad(buffers);
     } else {
-      fieldforce_ad(buffers);
+      fieldforce_ad(buffers);
     }
   }
-  FFT_SCALAR ***create3d_offset(FFT_SCALAR ***&, int, int, int,
-                                int, int, int, const char *name);
+  FFT_SCALAR ***create3d_offset(FFT_SCALAR ***&, int, int, int, int, int, int, const char *name);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/INTEL/verlet_lrt_intel.h b/src/INTEL/verlet_lrt_intel.h
index daa159e29a..e13d2b44f6 100644
--- a/src/INTEL/verlet_lrt_intel.h
+++ b/src/INTEL/verlet_lrt_intel.h
@@ -21,24 +21,24 @@ IntegrateStyle(verlet/lrt/intel,VerletLRTIntel);
 #ifndef LMP_VERLET_LRT_INTEL_H
 #define LMP_VERLET_LRT_INTEL_H
 
-#include "verlet.h"
 #include "pppm_intel.h"
+#include "verlet.h"
 
 #ifdef LMP_INTEL_USELRT
-  #if defined(LMP_INTEL_LRT11) || defined(__APPLE__)
-    #if __cplusplus > 199711L
-      #define _LMP_INTEL_LRT_11
-      #include 
-    #else
-      #undef LMP_INTEL_USELRT
-      #ifdef LMP_INTEL_LRT11
-        #error C++11 support required for LMP_INTEL_LRT11 define
-      #endif
-    #endif
-  #else
-    #define _LMP_INTEL_LRT_PTHREAD
-    #include 
-  #endif
+#if defined(LMP_INTEL_LRT11) || defined(__APPLE__)
+#if __cplusplus > 199711L
+#define _LMP_INTEL_LRT_11
+#include 
+#else
+#undef LMP_INTEL_USELRT
+#ifdef LMP_INTEL_LRT11
+#error C++11 support required for LMP_INTEL_LRT11 define
+#endif
+#endif
+#else
+#define _LMP_INTEL_LRT_PTHREAD
+#include 
+#endif
 #endif
 
 namespace LAMMPS_NS {
@@ -54,17 +54,17 @@ class VerletLRTIntel : public Verlet {
  protected:
   PPPMIntel *_intel_kspace;
 
-  #if defined(_LMP_INTEL_LRT_PTHREAD)
+#if defined(_LMP_INTEL_LRT_PTHREAD)
   static void *k_launch_loop(void *context);
   pthread_t _kspace_thread;
   pthread_attr_t _kspace_attr;
   pthread_mutex_t _kmutex;
   pthread_cond_t _kcond;
   int _kspace_ready, _kspace_done, _krun_n;
-  #endif
+#endif
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/KOKKOS/atom_map_kokkos.cpp b/src/KOKKOS/atom_map_kokkos.cpp
index 8d0d1243ac..a76941bd8f 100644
--- a/src/KOKKOS/atom_map_kokkos.cpp
+++ b/src/KOKKOS/atom_map_kokkos.cpp
@@ -111,7 +111,7 @@ void AtomKokkos::map_init(int check)
 
       // use "view" template method to avoid unnecessary deep_copy
 
-      auto h_map_hash = k_map_hash.view(); // get type
+      auto h_map_hash = k_map_hash.view();    // get type
       h_map_hash = decltype(h_map_hash)(map_nhash);
       k_map_hash.view() = h_map_hash;
     }
@@ -261,7 +261,7 @@ void AtomKokkos::map_set()
         if (modify->fix[n]->execution_space == Device) device_hash_flag = 1;
 
     if (device_hash_flag) {
-      Kokkos::deep_copy(d_map_hash,h_map_hash);
+      Kokkos::deep_copy(d_map_hash, h_map_hash);
       k_map_hash.view() = d_map_hash;
     }
   }
diff --git a/src/KOKKOS/fix_nvt_kokkos.h b/src/KOKKOS/fix_nvt_kokkos.h
index 32e985537b..5da5fc309b 100644
--- a/src/KOKKOS/fix_nvt_kokkos.h
+++ b/src/KOKKOS/fix_nvt_kokkos.h
@@ -20,7 +20,6 @@ FixStyle(nvt/kk/host,FixNVTKokkos);
 // clang-format on
 #else
 
-
 // clang-format off
 #ifndef LMP_FIX_NVT_KOKKOS_H
 #define LMP_FIX_NVT_KOKKOS_H
diff --git a/src/MANYBODY/pair_edip.cpp b/src/MANYBODY/pair_edip.cpp
index 5efc5b7980..837ec2a3c7 100644
--- a/src/MANYBODY/pair_edip.cpp
+++ b/src/MANYBODY/pair_edip.cpp
@@ -778,7 +778,7 @@ void PairEDIP::read_file(char *file)
   if (comm->me == 0) {
     fp = utils::open_potential(file, lmp, nullptr);
     if (fp == nullptr)
-      error->one(FLERR,"Cannot open EDIP potential file {}: {}", file,utils::getsyserror());
+      error->one(FLERR, "Cannot open EDIP potential file {}: {}", file, utils::getsyserror());
   }
 
   // read each set of params from potential file
diff --git a/src/MC/fix_charge_regulation.h b/src/MC/fix_charge_regulation.h
index 2b50c7be5b..9fde2d0563 100644
--- a/src/MC/fix_charge_regulation.h
+++ b/src/MC/fix_charge_regulation.h
@@ -61,9 +61,9 @@ class FixChargeRegulation : public Fix {
   double
       llength_unit_in_nm;    // LAMMPS unit of length in nm, needed since chemical potentials are in units of mol/l
   double pH, pKa, pKb, pKs, pI_plus,
-      pI_minus;          // chemical potentials and equilibrium constant in log10 base
+      pI_minus;    // chemical potentials and equilibrium constant in log10 base
   double c10pH, c10pKa, c10pKb, c10pOH, c10pI_plus,
-      c10pI_minus;       // 10 raised to chemical potential value, in units of concentration [mol/liter]
+      c10pI_minus;    // 10 raised to chemical potential value, in units of concentration [mol/liter]
   double pmcmoves[3];    // mc move attempt probability: acid, base, ion pair exchange
   double pmcc;           // mc move cumulative attempt probability
   int npart_xrd;         // # of particles (ions) within xrd
@@ -71,17 +71,17 @@ class FixChargeRegulation : public Fix {
   double vlocal_xrd;     // # local volume within xrd
   bool
       only_salt_flag;    // true if performing only salt insertion/deletion, no acid/base dissociation.
-  bool add_tags_flag;    // true if each inserted atom gets its unique atom tag
-  int groupbitall;       // group bitmask for inserted atoms
-  int ngroups;           // number of group-ids for inserted atoms
-  char **groupstrings;   // list of group-ids for inserted atoms
+  bool add_tags_flag;     // true if each inserted atom gets its unique atom tag
+  int groupbitall;        // group bitmask for inserted atoms
+  int ngroups;            // number of group-ids for inserted atoms
+  char **groupstrings;    // list of group-ids for inserted atoms
 
   // counters
   unsigned long int nacid_attempts, nacid_successes, nbase_attempts, nbase_successes,
       nsalt_attempts, nsalt_successes;
   int nacid_neutral, nacid_charged, nbase_neutral, nbase_charged, ncation,
-      nanion;            // particle type counts
-  int cr_nmax;           //  max number of local particles
+      nanion;     // particle type counts
+  int cr_nmax;    //  max number of local particles
   double reservoir_temperature;
   double beta, sigma, volume,
       volume_rx;            // inverse temperature, speed, total volume, reacting volume
diff --git a/src/MDI/fix_mdi_engine.cpp b/src/MDI/fix_mdi_engine.cpp
index 81eb87a0f3..a898647563 100644
--- a/src/MDI/fix_mdi_engine.cpp
+++ b/src/MDI/fix_mdi_engine.cpp
@@ -886,7 +886,8 @@ void FixMDIEngine::receive_cell(Error *error)
   double small = std::numeric_limits::min();
   if (fabs(celldata[1]) > small or fabs(celldata[2]) > small or fabs(celldata[3]) > small or
       fabs(celldata[5]) > small or fabs(celldata[6]) > small or fabs(celldata[7]) > small) {
-    error->all(FLERR, "MDI: LAMMPS currently only supports the >CELL command for orthogonal cell vectors");
+    error->all(FLERR,
+               "MDI: LAMMPS currently only supports the >CELL command for orthogonal cell vectors");
   }
 
   // set the new LAMMPS cell dimensions
diff --git a/src/MDI/mdi_engine.cpp b/src/MDI/mdi_engine.cpp
index a1159f7402..9bd9258dfc 100644
--- a/src/MDI/mdi_engine.cpp
+++ b/src/MDI/mdi_engine.cpp
@@ -340,6 +340,6 @@ char *MDIEngine::mdi_optg()
 
   if (strcmp(command, "@DEFAULT") == 0 || strcmp(command, "EXIT") == 0) return command;
 
-  error->all(FLERR,"MDI reached end of OPTG simulation with invalid command: {}", command);
+  error->all(FLERR, "MDI reached end of OPTG simulation with invalid command: {}", command);
   return nullptr;
 }
diff --git a/src/MGPT/pair_mgpt.h b/src/MGPT/pair_mgpt.h
index 227e5e9a50..e2ccda14da 100644
--- a/src/MGPT/pair_mgpt.h
+++ b/src/MGPT/pair_mgpt.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
@@ -28,6 +27,7 @@ PairStyle(mgpt,PairMGPT);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_PAIR_MGPT_H
 #define LMP_PAIR_MGPT_H
 
diff --git a/src/MISC/pair_tracker.cpp b/src/MISC/pair_tracker.cpp
index f2fdb71081..003f2f3dd0 100644
--- a/src/MISC/pair_tracker.cpp
+++ b/src/MISC/pair_tracker.cpp
@@ -435,7 +435,7 @@ void PairTracker::read_restart_settings(FILE *fp)
 /* ---------------------------------------------------------------------- */
 
 double PairTracker::single(int /*i*/, int /*j*/, int /*itype*/, int /*jtype*/, double /*rsq*/,
-                           double /*factor_coul*/, double /*factor_lj*/, double &/*fforce*/)
+                           double /*factor_coul*/, double /*factor_lj*/, double & /*fforce*/)
 {
   return 0.0;
 }
diff --git a/src/ML-HDNNP/pair_hdnnp.cpp b/src/ML-HDNNP/pair_hdnnp.cpp
index 7aeacad588..eabc0bcfa0 100644
--- a/src/ML-HDNNP/pair_hdnnp.cpp
+++ b/src/ML-HDNNP/pair_hdnnp.cpp
@@ -25,28 +25,29 @@
 #include "comm.h"
 #include "error.h"
 #include "memory.h"
-#include "neighbor.h"
 #include "neigh_list.h"
 #include "neigh_request.h"
+#include "neighbor.h"
 #include "update.h"
 
-#include "InterfaceLammps.h" // n2p2 interface header
+#include "InterfaceLammps.h"    // n2p2 interface header
 
 using namespace LAMMPS_NS;
 
 static const char cite_user_hdnnp_package[] =
-  "ML-HDNNP package: 10.1021/acs.jctc.8b00770\n\n"
-  "@Article{Singraber19,\n"
-  " author = {Singraber, Andreas and Behler, J{\"o}rg and Dellago, Christoph},\n"
-  " title = {Library-{{Based LAMMPS Implementation}} of {{High}}-{{Dimensional Neural Network Potentials}}},\n"
-  " year = {2019},\n"
-  " month = mar,\n"
-  " volume = {15},\n"
-  " pages = {1827--1840},\n"
-  " doi = {10.1021/acs.jctc.8b00770},\n"
-  " journal = {J.~Chem.~Theory~Comput.},\n"
-  " number = {3}\n"
-  "}\n\n";
+    "ML-HDNNP package: 10.1021/acs.jctc.8b00770\n\n"
+    "@Article{Singraber19,\n"
+    " author = {Singraber, Andreas and Behler, J{\"o}rg and Dellago, Christoph},\n"
+    " title = {Library-{{Based LAMMPS Implementation}} of {{High}}-{{Dimensional Neural Network "
+    "Potentials}}},\n"
+    " year = {2019},\n"
+    " month = mar,\n"
+    " volume = {15},\n"
+    " pages = {1827--1840},\n"
+    " doi = {10.1021/acs.jctc.8b00770},\n"
+    " journal = {J.~Chem.~Theory~Comput.},\n"
+    " number = {3}\n"
+    "}\n\n";
 
 /* ---------------------------------------------------------------------- */
 
@@ -54,12 +55,13 @@ PairHDNNP::PairHDNNP(LAMMPS *lmp) : Pair(lmp)
 {
   if (lmp->citeme) lmp->citeme->add(cite_user_hdnnp_package);
 
-  single_enable = 0;           // 1 if single() routine exists
-  restartinfo = 0;             // 1 if pair style writes restart info
-  one_coeff = 1;               // 1 if allows only one coeff * * call
-  manybody_flag = 1;           // 1 if a manybody potential
-  unit_convert_flag = 0;       // TODO: Check possible values. value != 0 indicates support for unit conversion.
-  reinitflag = 0;              // 1 if compatible with fix adapt and alike
+  single_enable = 0;    // 1 if single() routine exists
+  restartinfo = 0;      // 1 if pair style writes restart info
+  one_coeff = 1;        // 1 if allows only one coeff * * call
+  manybody_flag = 1;    // 1 if a manybody potential
+  unit_convert_flag =
+      0;    // TODO: Check possible values. value != 0 indicates support for unit conversion.
+  reinitflag = 0;    // 1 if compatible with fix adapt and alike
 
   interface = new nnp::InterfaceLammps();
 }
@@ -77,10 +79,10 @@ PairHDNNP::~PairHDNNP()
 
 void PairHDNNP::compute(int eflag, int vflag)
 {
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   // Set number of local atoms and add element.
-  interface->setLocalAtoms(atom->nlocal,atom->type);
+  interface->setLocalAtoms(atom->nlocal, atom->type);
   // Transfer tags separately. Interface::setLocalTags is overloaded internally
   // to work with both -DLAMMPS_SMALLBIG (tagint = int) and -DLAMMPS_BIGBIG
   // (tagint = int64_t)
@@ -93,21 +95,18 @@ void PairHDNNP::compute(int eflag, int vflag)
   interface->process();
 
   // Do all stuff related to extrapolation warnings.
-  if(showew == true || showewsum > 0 || maxew >= 0) {
-    handleExtrapolationWarnings();
-  }
+  if (showew == true || showewsum > 0 || maxew >= 0) { handleExtrapolationWarnings(); }
 
   // Calculate forces of local and ghost atoms.
   interface->getForces(atom->f);
 
   // Add energy contribution to total energy.
   if (eflag_global)
-     ev_tally(0,0,atom->nlocal,1,interface->getEnergy(),0.0,0.0,0.0,0.0,0.0);
+    ev_tally(0, 0, atom->nlocal, 1, interface->getEnergy(), 0.0, 0.0, 0.0, 0.0, 0.0);
 
   // Add atomic energy if requested (CAUTION: no physical meaning!).
   if (eflag_atom)
-    for (int i = 0; i < atom->nlocal; ++i)
-      eatom[i] = interface->getAtomicEnergy(i);
+    for (int i = 0; i < atom->nlocal; ++i) eatom[i] = interface->getAtomicEnergy(i);
 
   // If virial needed calculate via F dot r.
   if (vflag_fdotr) virial_fdotr_compute();
@@ -121,9 +120,9 @@ void PairHDNNP::settings(int narg, char **arg)
 {
   int iarg = 0;
 
-  if (narg < 1) error->all(FLERR,"Illegal pair_style command");
+  if (narg < 1) error->all(FLERR, "Illegal pair_style command");
 
-  maxCutoffRadius = utils::numeric(FLERR,arg[0],false,lmp);
+  maxCutoffRadius = utils::numeric(FLERR, arg[0], false, lmp);
   iarg++;
 
   // default settings
@@ -137,61 +136,55 @@ void PairHDNNP::settings(int narg, char **arg)
   numExtrapolationWarningsTotal = 0;
   numExtrapolationWarningsSummary = 0;
 
-  while(iarg < narg) {
+  while (iarg < narg) {
     // set HDNNP directory
-    if (strcmp(arg[iarg],"dir") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
+    if (strcmp(arg[iarg], "dir") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
       delete[] directory;
-      directory = utils::strdup(arg[iarg+1]);
+      directory = utils::strdup(arg[iarg + 1]);
       iarg += 2;
-    // show extrapolation warnings
-    } else if (strcmp(arg[iarg],"showew") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      if (strcmp(arg[iarg+1],"yes") == 0)
+      // show extrapolation warnings
+    } else if (strcmp(arg[iarg], "showew") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      if (strcmp(arg[iarg + 1], "yes") == 0)
         showew = true;
-      else if (strcmp(arg[iarg+1],"no") == 0)
+      else if (strcmp(arg[iarg + 1], "no") == 0)
         showew = false;
       else
-        error->all(FLERR,"Illegal pair_style command");
+        error->all(FLERR, "Illegal pair_style command");
       iarg += 2;
-    // show extrapolation warning summary
-    } else if (strcmp(arg[iarg],"showewsum") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      showewsum = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
+      // show extrapolation warning summary
+    } else if (strcmp(arg[iarg], "showewsum") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      showewsum = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
       iarg += 2;
-    // maximum allowed extrapolation warnings
-    } else if (strcmp(arg[iarg],"maxew") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      maxew = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
+      // maximum allowed extrapolation warnings
+    } else if (strcmp(arg[iarg], "maxew") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      maxew = utils::inumeric(FLERR, arg[iarg + 1], false, lmp);
       iarg += 2;
-    // reset extrapolation warning counter
-    } else if (strcmp(arg[iarg],"resetew") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      if (strcmp(arg[iarg+1],"yes") == 0)
+      // reset extrapolation warning counter
+    } else if (strcmp(arg[iarg], "resetew") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      if (strcmp(arg[iarg + 1], "yes") == 0)
         resetew = true;
-      else if (strcmp(arg[iarg+1],"no") == 0)
+      else if (strcmp(arg[iarg + 1], "no") == 0)
         resetew = false;
       else
-        error->all(FLERR,"Illegal pair_style command");
+        error->all(FLERR, "Illegal pair_style command");
       iarg += 2;
-    // length unit conversion factor
-    } else if (strcmp(arg[iarg],"cflength") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      cflength = utils::numeric(FLERR,arg[iarg+1],false,lmp);
+      // length unit conversion factor
+    } else if (strcmp(arg[iarg], "cflength") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      cflength = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
       iarg += 2;
-    // energy unit conversion factor
-    } else if (strcmp(arg[iarg],"cfenergy") == 0) {
-      if (iarg+2 > narg)
-        error->all(FLERR,"Illegal pair_style command");
-      cfenergy = utils::numeric(FLERR,arg[iarg+1],false,lmp);
+      // energy unit conversion factor
+    } else if (strcmp(arg[iarg], "cfenergy") == 0) {
+      if (iarg + 2 > narg) error->all(FLERR, "Illegal pair_style command");
+      cfenergy = utils::numeric(FLERR, arg[iarg + 1], false, lmp);
       iarg += 2;
-    } else error->all(FLERR,"Illegal pair_style command");
+    } else
+      error->all(FLERR, "Illegal pair_style command");
   }
 }
 
@@ -205,21 +198,20 @@ void PairHDNNP::coeff(int narg, char **arg)
 
   if (!allocated) allocate();
 
-  if (narg != 2 + n)
-    error->all(FLERR,"Incorrect args for pair coefficients");
+  if (narg != 2 + n) error->all(FLERR, "Incorrect args for pair coefficients");
 
-  if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0)
-    error->all(FLERR,"Incorrect args for pair coefficients");
+  if (strcmp(arg[0], "*") != 0 || strcmp(arg[1], "*") != 0)
+    error->all(FLERR, "Incorrect args for pair coefficients");
 
-  int *map = new int[n+1];
+  int *map = new int[n + 1];
   for (int i = 0; i < n; i++) map[i] = 0;
 
   emap = "";
   for (int i = 2; i < narg; i++) {
-    if (strcmp(arg[i],"NULL") != 0) {
+    if (strcmp(arg[i], "NULL") != 0) {
       if (i != 2) emap += ",";
-      emap += std::to_string(i-1) + ":" + arg[i];
-      map[i-1] = 1;
+      emap += std::to_string(i - 1) + ":" + arg[i];
+      map[i - 1] = 1;
     }
   }
 
@@ -231,7 +223,7 @@ void PairHDNNP::coeff(int narg, char **arg)
         count++;
       }
 
-  if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
 
   delete[] map;
 }
@@ -251,29 +243,18 @@ void PairHDNNP::init_style()
 
   // Activate screen and logfile output only for rank 0.
   if (comm->me == 0) {
-    if (lmp->screen != nullptr)
-      interface->log.registerCFilePointer(&(lmp->screen));
-    if (lmp->logfile != nullptr)
-      interface->log.registerCFilePointer(&(lmp->logfile));
+    if (lmp->screen != nullptr) interface->log.registerCFilePointer(&(lmp->screen));
+    if (lmp->logfile != nullptr) interface->log.registerCFilePointer(&(lmp->logfile));
   }
 
   // Initialize interface on all processors.
-  interface->initialize(directory,
-                        emap.c_str(),
-                        showew,
-                        resetew,
-                        showewsum,
-                        maxew,
-                        cflength,
-                        cfenergy,
-                        maxCutoffRadius,
-                        atom->ntypes,
-                        comm->me);
+  interface->initialize(directory, emap.c_str(), showew, resetew, showewsum, maxew, cflength,
+                        cfenergy, maxCutoffRadius, atom->ntypes, comm->me);
 
   // LAMMPS cutoff radius (given via pair_coeff) should not be smaller than
   // maximum symmetry function cutoff radius.
   if (maxCutoffRadius < interface->getMaxCutoffRadius())
-    error->all(FLERR,"Inconsistent cutoff radius");
+    error->all(FLERR, "Inconsistent cutoff radius");
 }
 
 /* ----------------------------------------------------------------------
@@ -294,12 +275,11 @@ void PairHDNNP::allocate()
   allocated = 1;
   int n = atom->ntypes;
 
-  memory->create(setflag,n+1,n+1,"pair:setflag");
+  memory->create(setflag, n + 1, n + 1, "pair:setflag");
   for (int i = 1; i <= n; i++)
-    for (int j = i; j <= n; j++)
-      setflag[i][j] = 0;
+    for (int j = i; j <= n; j++) setflag[i][j] = 0;
 
-  memory->create(cutsq,n+1,n+1,"pair:cutsq"); // TODO: Is this required?
+  memory->create(cutsq, n + 1, n + 1, "pair:cutsq");    // TODO: Is this required?
 }
 
 void PairHDNNP::transferNeighborList()
@@ -315,9 +295,7 @@ void PairHDNNP::transferNeighborList()
       double dy = atom->x[i][1] - atom->x[j][1];
       double dz = atom->x[i][2] - atom->x[j][2];
       double d2 = dx * dx + dy * dy + dz * dz;
-      if (d2 <= rc2) {
-        interface->addNeighbor(i,j,atom->tag[j],atom->type[j],dx,dy,dz,d2);
-      }
+      if (d2 <= rc2) { interface->addNeighbor(i, j, atom->tag[j], atom->type[j], dx, dy, dz, d2); }
     }
   }
 }
@@ -325,29 +303,29 @@ void PairHDNNP::transferNeighborList()
 void PairHDNNP::handleExtrapolationWarnings()
 {
   // Get number of extrapolation warnings for local atoms.
-  long numCurrentEW = (long)interface->getNumExtrapolationWarnings();
+  long numCurrentEW = (long) interface->getNumExtrapolationWarnings();
 
   // Update (or set, resetew == true) total warnings counter.
-  if (resetew) numExtrapolationWarningsTotal = numCurrentEW;
-  else numExtrapolationWarningsTotal += numCurrentEW;
+  if (resetew)
+    numExtrapolationWarningsTotal = numCurrentEW;
+  else
+    numExtrapolationWarningsTotal += numCurrentEW;
 
   // Update warnings summary counter.
-  if(showewsum > 0) {
-    numExtrapolationWarningsSummary += numCurrentEW;
-  }
+  if (showewsum > 0) { numExtrapolationWarningsSummary += numCurrentEW; }
 
   // If requested write extrapolation warnings.
   // Requires communication of all symmetry functions statistics entries to
   // rank 0.
-  if(showew > 0) {
+  if (showew > 0) {
     // First collect an overview of extrapolation warnings per process.
     long *numEWPerProc = nullptr;
-    if(comm->me == 0) numEWPerProc = new long[comm->nprocs];
+    if (comm->me == 0) numEWPerProc = new long[comm->nprocs];
     MPI_Gather(&numCurrentEW, 1, MPI_LONG, numEWPerProc, 1, MPI_LONG, 0, world);
 
-    if(comm->me == 0) {
-      for(int i=1;inprocs;i++) {
-        if(numEWPerProc[i] > 0) {
+    if (comm->me == 0) {
+      for (int i = 1; i < comm->nprocs; i++) {
+        if (numEWPerProc[i] > 0) {
           long bs = 0;
           MPI_Status ms;
           // Get buffer size.
@@ -360,8 +338,7 @@ void PairHDNNP::handleExtrapolationWarnings()
         }
       }
       interface->writeExtrapolationWarnings();
-    }
-    else if(numCurrentEW > 0) {
+    } else if (numCurrentEW > 0) {
       // Get desired buffer length for all extrapolation warning entries.
       long bs = interface->getEWBufferSize();
       // Allocate and fill buffer.
@@ -373,18 +350,17 @@ void PairHDNNP::handleExtrapolationWarnings()
       delete[] buf;
     }
 
-    if(comm->me == 0) delete[] numEWPerProc;
+    if (comm->me == 0) delete[] numEWPerProc;
   }
 
   // If requested gather number of warnings to display summary.
-  if(showewsum > 0 && update->ntimestep % showewsum == 0) {
+  if (showewsum > 0 && update->ntimestep % showewsum == 0) {
     long globalEW = 0;
     // Communicate the sum over all processors to proc 0.
-    MPI_Reduce(&numExtrapolationWarningsSummary,
-               &globalEW, 1, MPI_LONG, MPI_SUM, 0, world);
+    MPI_Reduce(&numExtrapolationWarningsSummary, &globalEW, 1, MPI_LONG, MPI_SUM, 0, world);
     // Write to screen or logfile.
-    if(comm->me == 0)
-      utils::logmesg(lmp,"### NNP EW SUMMARY ### TS: {:10d} EW {:10d} EWPERSTEP {:10.3e}\n",
+    if (comm->me == 0)
+      utils::logmesg(lmp, "### NNP EW SUMMARY ### TS: {:10d} EW {:10d} EWPERSTEP {:10.3e}\n",
                      update->ntimestep, globalEW, double(globalEW) / showewsum);
     // Reset summary counter.
     numExtrapolationWarningsSummary = 0;
@@ -392,7 +368,7 @@ void PairHDNNP::handleExtrapolationWarnings()
 
   // Stop if maximum number of extrapolation warnings is exceeded.
   if (numExtrapolationWarningsTotal > maxew) {
-    error->one(FLERR,"Too many extrapolation warnings");
+    error->one(FLERR, "Too many extrapolation warnings");
   }
 
   // Reset internal extrapolation warnings counters.
diff --git a/src/ML-HDNNP/pair_hdnnp.h b/src/ML-HDNNP/pair_hdnnp.h
index c7cbc8188a..3c42fa60be 100644
--- a/src/ML-HDNNP/pair_hdnnp.h
+++ b/src/ML-HDNNP/pair_hdnnp.h
@@ -30,7 +30,7 @@ PairStyle(hdnnp,PairHDNNP);
 #include "pair.h"
 
 namespace nnp {
-    class InterfaceLammps;
+class InterfaceLammps;
 }
 
 namespace LAMMPS_NS {
@@ -38,7 +38,6 @@ namespace LAMMPS_NS {
 class PairHDNNP : public Pair {
 
  public:
-
   PairHDNNP(class LAMMPS *);
   virtual ~PairHDNNP();
   virtual void compute(int, int);
@@ -48,7 +47,6 @@ class PairHDNNP : public Pair {
   virtual double init_one(int, int);
 
  protected:
-
   virtual void allocate();
   void transferNeighborList();
   void handleExtrapolationWarnings();
@@ -67,7 +65,7 @@ class PairHDNNP : public Pair {
   nnp::InterfaceLammps *interface;
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/ML-IAP/mliap_descriptor.cpp b/src/ML-IAP/mliap_descriptor.cpp
index 4d9b22a49e..ff8cfb43a9 100644
--- a/src/ML-IAP/mliap_descriptor.cpp
+++ b/src/ML-IAP/mliap_descriptor.cpp
@@ -47,9 +47,9 @@ MLIAPDescriptor::~MLIAPDescriptor()
 
 double MLIAPDescriptor::memory_usage()
 {
-  double bytes = (double)nelements*sizeof(double);      // radelem
-  bytes += (double)nelements*sizeof(double);            // welem
-  bytes += (double)nelements*nelements*sizeof(double);  // cutsq
+  double bytes = (double) nelements * sizeof(double);          // radelem
+  bytes += (double) nelements * sizeof(double);                // welem
+  bytes += (double) nelements * nelements * sizeof(double);    // cutsq
 
   return bytes;
 }
diff --git a/src/ML-IAP/mliap_model.h b/src/ML-IAP/mliap_model.h
index 187c1698b8..3a73065b04 100644
--- a/src/ML-IAP/mliap_model.h
+++ b/src/ML-IAP/mliap_model.h
@@ -31,10 +31,10 @@ class MLIAPModel : protected Pointers {
   virtual void compute_force_gradients(class MLIAPData *) = 0;
   virtual void init();
   virtual double memory_usage() = 0;
-  int nelements;        // # of unique elements
-  int nonlinearflag;    // 1 if gradient() requires descriptors
-  int ndescriptors;     // number of descriptors
-  int nparams;          // number of parameters per element
+  int nelements;         // # of unique elements
+  int nonlinearflag;     // 1 if gradient() requires descriptors
+  int ndescriptors;      // number of descriptors
+  int nparams;           // number of parameters per element
   double **coeffelem;    // element coefficients
 
  protected:
diff --git a/src/ML-IAP/mliap_model_nn.h b/src/ML-IAP/mliap_model_nn.h
index 34950a3c32..2795678c05 100644
--- a/src/ML-IAP/mliap_model_nn.h
+++ b/src/ML-IAP/mliap_model_nn.h
@@ -32,9 +32,9 @@ class MLIAPModelNN : public MLIAPModel {
   int nlayers;    // number of layers per element
 
  protected:
-  int *activation;       // activation functions
-  int *nnodes;           // number of nodes per layer
-  double ***scale;       // element scale values
+  int *activation;    // activation functions
+  int *nnodes;        // number of nodes per layer
+  double ***scale;    // element scale values
   virtual void read_coeffs(char *);
 
   inline double sigm(double x, double &deriv)
diff --git a/src/ML-RANN/pair_rann.h b/src/ML-RANN/pair_rann.h
index 6c047775d4..adc3431ba7 100644
--- a/src/ML-RANN/pair_rann.h
+++ b/src/ML-RANN/pair_rann.h
@@ -39,128 +39,138 @@ PairStyle(rann,PairRANN);
 
 #include "pair.h"
 
-#include 
 #include 
+#include 
 
 namespace LAMMPS_NS {
 
-  namespace RANN {
-    //forward declarations
-    class Activation;
-    class Fingerprint;
-  }
+namespace RANN {
+  //forward declarations
+  class Activation;
+  class Fingerprint;
+}    // namespace RANN
 
-  class PairRANN : public Pair {
-   public:
-    //inherited functions
-    PairRANN(class LAMMPS *);
-    ~PairRANN();
-    void compute(int, int);
-    void settings(int, char **);
-    void coeff(int, char **);
-    void init_style();
-    double init_one(int, int);
-    void init_list(int , NeighList *);
-    void errorf(const char*,int,const char*);
-    int factorial(int);
+class PairRANN : public Pair {
+ public:
+  //inherited functions
+  PairRANN(class LAMMPS *);
+  ~PairRANN();
+  void compute(int, int);
+  void settings(int, char **);
+  void coeff(int, char **);
+  void init_style();
+  double init_one(int, int);
+  void init_list(int, NeighList *);
+  void errorf(const char *, int, const char *);
+  int factorial(int);
 
-    RANN::Fingerprint *create_fingerprint(const char *);
-    RANN::Activation *create_activation(const char *);
+  RANN::Fingerprint *create_fingerprint(const char *);
+  RANN::Activation *create_activation(const char *);
 
-    //global variables
-    int nelements;                // # of elements (distinct from LAMMPS atom types since multiple atom types can be mapped to one element)
-    int nelementsp;        // nelements+1
-    char **elements;              // names of elements
-    char **elementsp;        // names of elements with "all" appended as the last "element"
-    double *mass;                 // mass of each element
-    double cutmax;        // max radial distance for neighbor lists
-    int *map;                     // mapping from atom types to elements
-    int *fingerprintcount;    // static variable used in initialization
-    int *fingerprintlength;       // # of input neurons defined by fingerprints of each element.
-    int *fingerprintperelement;   // # of fingerprints for each element
-    bool doscreen;//screening is calculated if any defined fingerprint uses it
-    bool allscreen;//all fingerprints use screening so screened neighbors can be completely ignored
-    bool dospin;
-    int res;//Resolution of function tables for cubic interpolation.
-    int memguess;
-    double *screening_min;
-    double *screening_max;
-    bool **weightdefined;
-    bool **biasdefined;
-    int nmax1;
-    int nmax2;
-    int fmax;
-    int fnmax;
-    //memory actively written to during each compute:
-    double *xn,*yn,*zn,*Sik,*dSikx,*dSiky,*dSikz,*dSijkx,*dSijky,*dSijkz,*sx,*sy,*sz,**dSijkxc,**dSijkyc,**dSijkzc,*dfeaturesx,*dfeaturesy,*dfeaturesz,*features;
-    double *layer,*sum,*sum1,**dlayerx,**dlayery,**dlayerz,**dlayersumx,**dlayersumy,**dlayersumz;
-    double **dsx,**dsy,**dsz,**dssumx,**dssumy,**dssumz;
-    int *tn,*jl;
-    bool *Bij;
+  //global variables
+  int nelements;    // # of elements (distinct from LAMMPS atom types since multiple atom types can be mapped to one element)
+  int nelementsp;                // nelements+1
+  char **elements;               // names of elements
+  char **elementsp;              // names of elements with "all" appended as the last "element"
+  double *mass;                  // mass of each element
+  double cutmax;                 // max radial distance for neighbor lists
+  int *map;                      // mapping from atom types to elements
+  int *fingerprintcount;         // static variable used in initialization
+  int *fingerprintlength;        // # of input neurons defined by fingerprints of each element.
+  int *fingerprintperelement;    // # of fingerprints for each element
+  bool doscreen;                 //screening is calculated if any defined fingerprint uses it
+  bool
+      allscreen;    //all fingerprints use screening so screened neighbors can be completely ignored
+  bool dospin;
+  int res;    //Resolution of function tables for cubic interpolation.
+  int memguess;
+  double *screening_min;
+  double *screening_max;
+  bool **weightdefined;
+  bool **biasdefined;
+  int nmax1;
+  int nmax2;
+  int fmax;
+  int fnmax;
+  //memory actively written to during each compute:
+  double *xn, *yn, *zn, *Sik, *dSikx, *dSiky, *dSikz, *dSijkx, *dSijky, *dSijkz, *sx, *sy, *sz,
+      **dSijkxc, **dSijkyc, **dSijkzc, *dfeaturesx, *dfeaturesy, *dfeaturesz, *features;
+  double *layer, *sum, *sum1, **dlayerx, **dlayery, **dlayerz, **dlayersumx, **dlayersumy,
+      **dlayersumz;
+  double **dsx, **dsy, **dsz, **dssumx, **dssumy, **dssumz;
+  int *tn, *jl;
+  bool *Bij;
 
-    struct Simulation{
-      int *id;
-      bool forces;
-      bool spins;
-      double **x;
-      double **f;
-      double **s;
-      double box[3][3];
-      double origin[3];
-      double **features;
-      double **dfx;
-      double **dfy;
-      double **dfz;
-      double **dsx;
-      double **dsy;
-      double **dsz;
-      int *ilist,*numneigh,**firstneigh,*type,inum,gnum;
-    };
-
-    struct NNarchitecture{
-      int layers;
-      int *dimensions;//vector of length layers with entries for neurons per layer
-      double **Weights;
-      double **Biases;
-      int *activations;//unused
-      int maxlayer;//longest layer (for memory allocation)
-    };
-
-    Simulation *sims;
-    NNarchitecture *net;//array of networks, 1 for each element.
-
-   protected:
-     RANN::Activation ***activation;
-     RANN::Fingerprint ***fingerprints;
-
-   private:
-    //new functions
-    void allocate(const std::vector &);//called after reading element list, but before reading the rest of the potential
-    void deallocate();
-    void read_file(char *);//read potential file
-    void read_atom_types(std::vector,char*,int);
-    void read_fpe(std::vector,std::vector,char*,int);//fingerprints per element. Count total fingerprints defined for each 1st element in element combinations
-    void read_fingerprints(std::vector,std::vector,char*,int);
-    void read_fingerprint_constants(std::vector,std::vector,char*,int);
-    void read_network_layers(std::vector,std::vector,char*,int);//include input and output layer (hidden layers + 2)
-    void read_layer_size(std::vector,std::vector,char*,int);
-    void read_weight(std::vector,std::vector,FILE*,char*,int*);//weights should be formatted as properly shaped matrices
-    void read_bias(std::vector,std::vector,FILE*,char*,int*);//biases should be formatted as properly shaped vectors
-    void read_activation_functions(std::vector,std::vector,char*,int);
-    void read_screening(std::vector,std::vector,char*,int);
-    void read_mass(const std::vector &, const std::vector &,const char*,int);
-    bool check_potential();//after finishing reading potential file
-    void propagateforward(double *,double **,int,int);//called by compute to get force and energy
-    void propagateforwardspin(double *,double **,double**,int,int);//called by compute to get force and energy
-    void screening(int,int,int);
-    void cull_neighbor_list(int *,int,int);
-    void screen_neighbor_list(int *);
+  struct Simulation {
+    int *id;
+    bool forces;
+    bool spins;
+    double **x;
+    double **f;
+    double **s;
+    double box[3][3];
+    double origin[3];
+    double **features;
+    double **dfx;
+    double **dfy;
+    double **dfz;
+    double **dsx;
+    double **dsy;
+    double **dsz;
+    int *ilist, *numneigh, **firstneigh, *type, inum, gnum;
   };
 
-}
+  struct NNarchitecture {
+    int layers;
+    int *dimensions;    //vector of length layers with entries for neurons per layer
+    double **Weights;
+    double **Biases;
+    int *activations;    //unused
+    int maxlayer;        //longest layer (for memory allocation)
+  };
+
+  Simulation *sims;
+  NNarchitecture *net;    //array of networks, 1 for each element.
+
+ protected:
+  RANN::Activation ***activation;
+  RANN::Fingerprint ***fingerprints;
+
+ private:
+  //new functions
+  void allocate(
+      const std::vector
+          &);    //called after reading element list, but before reading the rest of the potential
+  void deallocate();
+  void read_file(char *);    //read potential file
+  void read_atom_types(std::vector, char *, int);
+  void read_fpe(
+      std::vector, std::vector, char *,
+      int);    //fingerprints per element. Count total fingerprints defined for each 1st element in element combinations
+  void read_fingerprints(std::vector, std::vector, char *, int);
+  void read_fingerprint_constants(std::vector, std::vector, char *, int);
+  void read_network_layers(std::vector, std::vector, char *,
+                           int);    //include input and output layer (hidden layers + 2)
+  void read_layer_size(std::vector, std::vector, char *, int);
+  void read_weight(std::vector, std::vector, FILE *, char *,
+                   int *);    //weights should be formatted as properly shaped matrices
+  void read_bias(std::vector, std::vector, FILE *, char *,
+                 int *);    //biases should be formatted as properly shaped vectors
+  void read_activation_functions(std::vector, std::vector, char *, int);
+  void read_screening(std::vector, std::vector, char *, int);
+  void read_mass(const std::vector &, const std::vector &, const char *,
+                 int);
+  bool check_potential();    //after finishing reading potential file
+  void propagateforward(double *, double **, int,
+                        int);    //called by compute to get force and energy
+  void propagateforwardspin(double *, double **, double **, int,
+                            int);    //called by compute to get force and energy
+  void screening(int, int, int);
+  void cull_neighbor_list(int *, int, int);
+  void screen_neighbor_list(int *);
+};
+
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
-
-
-
diff --git a/src/ML-RANN/rann_activation.h b/src/ML-RANN/rann_activation.h
index 045d37a273..ce2074acda 100644
--- a/src/ML-RANN/rann_activation.h
+++ b/src/ML-RANN/rann_activation.h
@@ -31,11 +31,10 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #ifndef LMP_RANN_ACTIVATION_H
 #define LMP_RANN_ACTIVATION_H
 
-
 namespace LAMMPS_NS {
-  namespace RANN {
-    class Activation {
-    public:
+namespace RANN {
+  class Activation {
+   public:
     Activation(class PairRANN *);
     virtual ~Activation();
     virtual double activation_function(double);
@@ -43,30 +42,23 @@ namespace LAMMPS_NS {
     virtual double ddactivation_function(double);
     bool empty;
     const char *style;
-    };
+  };
 
-    Activation::Activation(PairRANN *) {
+  Activation::Activation(PairRANN *)
+  {
     empty = true;
     style = "empty";
-    }
-
-    Activation::~Activation() {
-    }
-
-    //default is linear activation (no change).
-    double Activation::activation_function(double A) {
-    return A;
-    }
-
-    double Activation::dactivation_function(double) {
-    return 1.0;
-    }
-
-    double Activation::ddactivation_function(double) {
-    return 0.0;
-    }
   }
-}
 
+  Activation::~Activation() {}
+
+  //default is linear activation (no change).
+  double Activation::activation_function(double A) { return A; }
+
+  double Activation::dactivation_function(double) { return 1.0; }
+
+  double Activation::ddactivation_function(double) { return 0.0; }
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* RANN_ACTIVATION_H_ */
diff --git a/src/ML-RANN/rann_activation_linear.h b/src/ML-RANN/rann_activation_linear.h
index 4afc4bc61d..930ce70ee0 100644
--- a/src/ML-RANN/rann_activation_linear.h
+++ b/src/ML-RANN/rann_activation_linear.h
@@ -33,35 +33,28 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_activation.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Activation_linear : public Activation {
-    public:
-      Activation_linear(class PairRANN *);
-      double activation_function(double);
-      double dactivation_function(double);
-      double ddactivation_function(double);
-    };
+  class Activation_linear : public Activation {
+   public:
+    Activation_linear(class PairRANN *);
+    double activation_function(double);
+    double dactivation_function(double);
+    double ddactivation_function(double);
+  };
 
-    Activation_linear::Activation_linear(PairRANN *_pair) : Activation(_pair) {
-      empty = false;
-      style = "linear";
-    }
-
-    double Activation_linear::activation_function(double A)
-    {
-      return A;
-    }
-
-    double Activation_linear::dactivation_function(double)
-    {
-      return 1.0;
-    }
-
-    double Activation_linear::ddactivation_function(double) {
-      return 0.0;
-    }
+  Activation_linear::Activation_linear(PairRANN *_pair) : Activation(_pair)
+  {
+    empty = false;
+    style = "linear";
   }
-}
+
+  double Activation_linear::activation_function(double A) { return A; }
+
+  double Activation_linear::dactivation_function(double) { return 1.0; }
+
+  double Activation_linear::ddactivation_function(double) { return 0.0; }
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* ACTIVATION_LINEAR_H_ */
diff --git a/src/ML-RANN/rann_activation_sig_i.h b/src/ML-RANN/rann_activation_sig_i.h
index 9983862b31..fc82fe300d 100644
--- a/src/ML-RANN/rann_activation_sig_i.h
+++ b/src/ML-RANN/rann_activation_sig_i.h
@@ -34,37 +34,42 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_activation.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Activation_sigI : public Activation {
-    public:
+  class Activation_sigI : public Activation {
+   public:
     Activation_sigI(class PairRANN *);
     double activation_function(double);
     double dactivation_function(double);
     double ddactivation_function(double);
-    };
+  };
 
-    Activation_sigI::Activation_sigI(PairRANN *_pair) : Activation(_pair) {
+  Activation_sigI::Activation_sigI(PairRANN *_pair) : Activation(_pair)
+  {
     empty = false;
     style = "sigI";
-    }
-
-    double Activation_sigI::activation_function(double in) {
-    if (in>34)return in;
-    return 0.1*in + 0.9*log(exp(in) + 1);
-    }
-
-    double Activation_sigI::dactivation_function(double in) {
-    if (in>34)return 1;
-    return 0.1 + 0.9/(exp(in)+1)*exp(in);
-    }
-
-    double Activation_sigI::ddactivation_function(double in) {
-    if (in>34)return 0;
-    return 0.9*exp(in)/(exp(in)+1)/(exp(in)+1);;
-    }
-
   }
-}
+
+  double Activation_sigI::activation_function(double in)
+  {
+    if (in > 34) return in;
+    return 0.1 * in + 0.9 * log(exp(in) + 1);
+  }
+
+  double Activation_sigI::dactivation_function(double in)
+  {
+    if (in > 34) return 1;
+    return 0.1 + 0.9 / (exp(in) + 1) * exp(in);
+  }
+
+  double Activation_sigI::ddactivation_function(double in)
+  {
+    if (in > 34) return 0;
+    return 0.9 * exp(in) / (exp(in) + 1) / (exp(in) + 1);
+    ;
+  }
+
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* ACTIVATION_SIGI_H_ */
diff --git a/src/ML-RANN/rann_fingerprint.h b/src/ML-RANN/rann_fingerprint.h
index 5a32a1c74d..628a4c025a 100644
--- a/src/ML-RANN/rann_fingerprint.h
+++ b/src/ML-RANN/rann_fingerprint.h
@@ -74,7 +74,7 @@ namespace RANN {
     {
     }
 
-    virtual int get_length(){return 0;};
+    virtual int get_length() { return 0; };
     virtual double cutofffunction(double, double, double);
     virtual void generate_rinvssqrttable();
     bool spin;
diff --git a/src/ML-RANN/rann_fingerprint_bond.h b/src/ML-RANN/rann_fingerprint_bond.h
index 041c29a742..cc844993cc 100644
--- a/src/ML-RANN/rann_fingerprint_bond.h
+++ b/src/ML-RANN/rann_fingerprint_bond.h
@@ -34,39 +34,41 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Fingerprint_bond : public Fingerprint {
-     public:
-      Fingerprint_bond(PairRANN *);
-      ~Fingerprint_bond();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,int,int,double *,double *,double *,int *,int,int *);
-      void do3bodyfeatureset_doubleneighborloop(double *,double *,double *,double *,int,int,double *,double *,double *,int *,int,int *);
-      void do3bodyfeatureset_singleneighborloop(double *,double *,double *,double *,int,int,double *,double *,double *,int *,int,int *);
-      void generate_exp_cut_table();
-      void generate_coefficients();
-      int get_length();
+  class Fingerprint_bond : public Fingerprint {
+   public:
+    Fingerprint_bond(PairRANN *);
+    ~Fingerprint_bond();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, int, int, double *, double *,
+                             double *, int *, int, int *);
+    void do3bodyfeatureset_doubleneighborloop(double *, double *, double *, double *, int, int,
+                                              double *, double *, double *, int *, int, int *);
+    void do3bodyfeatureset_singleneighborloop(double *, double *, double *, double *, int, int,
+                                              double *, double *, double *, int *, int, int *);
+    void generate_exp_cut_table();
+    void generate_coefficients();
+    int get_length();
 
-      double *expcuttable;
-      double *dfctable;
-      double dr;
-      double *alpha_k;
-      double re;
-      int **coeff;
-      int **coeffx;
-      int **coeffy;
-      int **coeffz;
-      int kmax;
-      int mlength;
-      int **Mf;
+    double *expcuttable;
+    double *dfctable;
+    double dr;
+    double *alpha_k;
+    double re;
+    int **coeff;
+    int **coeffx;
+    int **coeffy;
+    int **coeffz;
+    int kmax;
+    int mlength;
+    int **Mf;
+  };
 
-    };
-
-  }
-}
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_BOND_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_bondscreened.h b/src/ML-RANN/rann_fingerprint_bondscreened.h
index 71083cc04f..17f2874f7b 100644
--- a/src/ML-RANN/rann_fingerprint_bondscreened.h
+++ b/src/ML-RANN/rann_fingerprint_bondscreened.h
@@ -34,39 +34,46 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Fingerprint_bondscreened : public Fingerprint {
-     public:
-      Fingerprint_bondscreened(PairRANN *);
-      ~Fingerprint_bondscreened();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      void do3bodyfeatureset_doubleneighborloop(double *,double *,double *,double *,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      void do3bodyfeatureset_singleneighborloop(double *,double *,double *,double *,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      void generate_exp_cut_table();
-      void generate_coefficients();
-      int get_length();
+  class Fingerprint_bondscreened : public Fingerprint {
+   public:
+    Fingerprint_bondscreened(PairRANN *);
+    ~Fingerprint_bondscreened();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, double *, double *, double *,
+                             double *, double *, double *, double *, bool *, int, int, double *,
+                             double *, double *, int *, int, int *);
+    void do3bodyfeatureset_doubleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, double *,
+                                              double *, bool *, int, int, double *, double *,
+                                              double *, int *, int, int *);
+    void do3bodyfeatureset_singleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, double *,
+                                              double *, bool *, int, int, double *, double *,
+                                              double *, int *, int, int *);
+    void generate_exp_cut_table();
+    void generate_coefficients();
+    int get_length();
 
-      double *expcuttable;
-      double *dfctable;
-      double dr;
-      double *alpha_k;
-      double re;
-      int **coeff;
-      int **coeffx;
-      int **coeffy;
-      int **coeffz;
-      int kmax;
-      int mlength;
-      int **Mf;
+    double *expcuttable;
+    double *dfctable;
+    double dr;
+    double *alpha_k;
+    double re;
+    int **coeff;
+    int **coeffx;
+    int **coeffy;
+    int **coeffz;
+    int kmax;
+    int mlength;
+    int **Mf;
+  };
+}    // namespace RANN
 
-    };
-  }
-
-}
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_BOND_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_bondscreenedspin.h b/src/ML-RANN/rann_fingerprint_bondscreenedspin.h
index 6a0df27f80..306fa9ae75 100644
--- a/src/ML-RANN/rann_fingerprint_bondscreenedspin.h
+++ b/src/ML-RANN/rann_fingerprint_bondscreenedspin.h
@@ -34,39 +34,46 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Fingerprint_bondscreenedspin : public Fingerprint {
-     public:
-      Fingerprint_bondscreenedspin(PairRANN *);
-      ~Fingerprint_bondscreenedspin();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      void do3bodyfeatureset_doubleneighborloop(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int *);
-      void do3bodyfeatureset_singleneighborloop(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      void generate_exp_cut_table();
-      void generate_coefficients();
-      int get_length();
+  class Fingerprint_bondscreenedspin : public Fingerprint {
+   public:
+    Fingerprint_bondscreenedspin(PairRANN *);
+    ~Fingerprint_bondscreenedspin();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, double *, double *, double *,
+                             double *, double *, double *, double *, double *, double *, double *,
+                             bool *, int, int, double *, double *, double *, int *, int, int *);
+    void do3bodyfeatureset_doubleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, bool *, int,
+                                              int, double *, double *, double *, int *, int, int *);
+    void do3bodyfeatureset_singleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, double *,
+                                              double *, double *, double *, double *, bool *, int,
+                                              int, double *, double *, double *, int *, int, int *);
+    void generate_exp_cut_table();
+    void generate_coefficients();
+    int get_length();
 
-      double *expcuttable;
-      double *dfctable;
-      double dr;
-      double *alpha_k;
-      double re;
-      int **coeff;
-      int **coeffx;
-      int **coeffy;
-      int **coeffz;
-      int kmax;
-      int mlength;
-      int **Mf;
+    double *expcuttable;
+    double *dfctable;
+    double dr;
+    double *alpha_k;
+    double re;
+    int **coeff;
+    int **coeffx;
+    int **coeffy;
+    int **coeffz;
+    int kmax;
+    int mlength;
+    int **Mf;
+  };
 
-    };
-
-  }
-}
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_BOND_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_bondspin.h b/src/ML-RANN/rann_fingerprint_bondspin.h
index 9ab8008189..e3577fdb3a 100644
--- a/src/ML-RANN/rann_fingerprint_bondspin.h
+++ b/src/ML-RANN/rann_fingerprint_bondspin.h
@@ -34,38 +34,43 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
-    class Fingerprint_bondspin : public Fingerprint {
-     public:
-      Fingerprint_bondspin(PairRANN *);
-      ~Fingerprint_bondspin();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      virtual void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,int,int,double*,double*,double*,int*,int,int*);//spin
-      void do3bodyfeatureset_doubleneighborloop(double*,double*,double*,double*,double*,double*,double*,int,int,double*,double*,double*,int*,int,int*);
-      void do3bodyfeatureset_singleneighborloop(double*,double*,double*,double*,double*,double*,double*,int,int,double*,double*,double*,int*,int,int*);
-      void generate_exp_cut_table();
-      void generate_coefficients();
-      int get_length();
+namespace RANN {
+  class Fingerprint_bondspin : public Fingerprint {
+   public:
+    Fingerprint_bondspin(PairRANN *);
+    ~Fingerprint_bondspin();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    virtual void compute_fingerprint(double *, double *, double *, double *, double *, double *,
+                                     double *, int, int, double *, double *, double *, int *, int,
+                                     int *);    //spin
+    void do3bodyfeatureset_doubleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, int, int, double *, double *,
+                                              double *, int *, int, int *);
+    void do3bodyfeatureset_singleneighborloop(double *, double *, double *, double *, double *,
+                                              double *, double *, int, int, double *, double *,
+                                              double *, int *, int, int *);
+    void generate_exp_cut_table();
+    void generate_coefficients();
+    int get_length();
 
-      double *expcuttable;
-      double *dfctable;
-      double dr;
-      double *alpha_k;
-      double re;
-      int **coeff;
-      int **coeffx;
-      int **coeffy;
-      int **coeffz;
-      int kmax;
-      int mlength;
-      int **Mf;
+    double *expcuttable;
+    double *dfctable;
+    double dr;
+    double *alpha_k;
+    double re;
+    int **coeff;
+    int **coeffx;
+    int **coeffy;
+    int **coeffz;
+    int kmax;
+    int mlength;
+    int **Mf;
+  };
 
-    };
-
-  }
-}
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_BOND_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_radial.h b/src/ML-RANN/rann_fingerprint_radial.h
index d5a73a486c..1b5e6bf479 100644
--- a/src/ML-RANN/rann_fingerprint_radial.h
+++ b/src/ML-RANN/rann_fingerprint_radial.h
@@ -34,30 +34,30 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
+namespace RANN {
 
-    class Fingerprint_radial : public Fingerprint {
-     public:
-      Fingerprint_radial(PairRANN *);
-      ~Fingerprint_radial();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,int,int,double*,double*,double*,int*,int,int*);
-      int get_length();
+  class Fingerprint_radial : public Fingerprint {
+   public:
+    Fingerprint_radial(PairRANN *);
+    ~Fingerprint_radial();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, int, int, double *, double *,
+                             double *, int *, int, int *);
+    int get_length();
 
-      double *radialtable;
-      double *dfctable;
-      double dr;
-      double *alpha;
-      double re;
-      int nmax;//highest term
-      int omin;//lowest term
+    double *radialtable;
+    double *dfctable;
+    double dr;
+    double *alpha;
+    double re;
+    int nmax;    //highest term
+    int omin;    //lowest term
+  };
 
-    };
-
-  }
-}
+}    // namespace RANN
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_RADIAL_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_radialscreened.h b/src/ML-RANN/rann_fingerprint_radialscreened.h
index ef7d612902..180bc5823d 100644
--- a/src/ML-RANN/rann_fingerprint_radialscreened.h
+++ b/src/ML-RANN/rann_fingerprint_radialscreened.h
@@ -34,29 +34,30 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
-    class Fingerprint_radialscreened : public Fingerprint {
-     public:
-      Fingerprint_radialscreened(PairRANN *);
-      ~Fingerprint_radialscreened();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);
-      int get_length();
+namespace RANN {
+  class Fingerprint_radialscreened : public Fingerprint {
+   public:
+    Fingerprint_radialscreened(PairRANN *);
+    ~Fingerprint_radialscreened();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, double *, double *, double *,
+                             double *, double *, double *, double *, bool *, int, int, double *,
+                             double *, double *, int *, int, int *);
+    int get_length();
 
-      double *radialtable;
-      double *dfctable;
-      double dr;
-      double *alpha;
-      double re;
-      int nmax;//highest term
-      int omin;//lowest term
+    double *radialtable;
+    double *dfctable;
+    double dr;
+    double *alpha;
+    double re;
+    int nmax;    //highest term
+    int omin;    //lowest term
+  };
+}    // namespace RANN
 
-    };
-}
-
-}
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_RADIALSCREENED_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_radialscreenedspin.h b/src/ML-RANN/rann_fingerprint_radialscreenedspin.h
index 646a0b93f1..5bf3cc07ef 100644
--- a/src/ML-RANN/rann_fingerprint_radialscreenedspin.h
+++ b/src/ML-RANN/rann_fingerprint_radialscreenedspin.h
@@ -34,29 +34,31 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
-    class Fingerprint_radialscreenedspin : public Fingerprint {
-     public:
-      Fingerprint_radialscreenedspin(PairRANN *);
-      ~Fingerprint_radialscreenedspin();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      virtual void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,bool*,int,int,double*,double*,double*,int*,int,int*);//spin,screen
-      int get_length();
+namespace RANN {
+  class Fingerprint_radialscreenedspin : public Fingerprint {
+   public:
+    Fingerprint_radialscreenedspin(PairRANN *);
+    ~Fingerprint_radialscreenedspin();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    virtual void compute_fingerprint(double *, double *, double *, double *, double *, double *,
+                                     double *, double *, double *, double *, double *, double *,
+                                     double *, double *, bool *, int, int, double *, double *,
+                                     double *, int *, int, int *);    //spin,screen
+    int get_length();
 
-      double *radialtable;
-      double *dfctable;
-      double dr;
-      double *alpha;
-      double re;
-      int nmax;//highest term
-      int omin;//lowest term
+    double *radialtable;
+    double *dfctable;
+    double dr;
+    double *alpha;
+    double re;
+    int nmax;    //highest term
+    int omin;    //lowest term
+  };
+}    // namespace RANN
 
-    };
-  }
-
-}
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_RADIALSCREENED_H_ */
diff --git a/src/ML-RANN/rann_fingerprint_radialspin.h b/src/ML-RANN/rann_fingerprint_radialspin.h
index 90c3ce1f22..3bab1a0e28 100644
--- a/src/ML-RANN/rann_fingerprint_radialspin.h
+++ b/src/ML-RANN/rann_fingerprint_radialspin.h
@@ -34,29 +34,29 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918
 #include "rann_fingerprint.h"
 
 namespace LAMMPS_NS {
-  namespace RANN {
-    class Fingerprint_radialspin : public Fingerprint {
-     public:
-      Fingerprint_radialspin(PairRANN *);
-      ~Fingerprint_radialspin();
-      bool parse_values(std::string,std::vector);
-      void write_values(FILE *);
-      void init(int*,int);
-      void allocate();
-      void compute_fingerprint(double*,double*,double*,double*,double*,double*,double*,int,int,double*,double*,double*,int*,int,int*);
-      int get_length();
+namespace RANN {
+  class Fingerprint_radialspin : public Fingerprint {
+   public:
+    Fingerprint_radialspin(PairRANN *);
+    ~Fingerprint_radialspin();
+    bool parse_values(std::string, std::vector);
+    void write_values(FILE *);
+    void init(int *, int);
+    void allocate();
+    void compute_fingerprint(double *, double *, double *, double *, double *, double *, double *,
+                             int, int, double *, double *, double *, int *, int, int *);
+    int get_length();
 
-      double *radialtable;
-      double *dfctable;
-      double dr;
-      double *alpha;
-      double re;
-      int nmax;//highest term
-      int omin;//lowest term
+    double *radialtable;
+    double *dfctable;
+    double dr;
+    double *alpha;
+    double re;
+    int nmax;    //highest term
+    int omin;    //lowest term
+  };
+}    // namespace RANN
 
-    };
-  }
-
-}
+}    // namespace LAMMPS_NS
 
 #endif /* FINGERPRINT_RADIAL_H_ */
diff --git a/src/ML-SNAP/pair_snap.h b/src/ML-SNAP/pair_snap.h
index afce4bf895..af24685ec1 100644
--- a/src/ML-SNAP/pair_snap.h
+++ b/src/ML-SNAP/pair_snap.h
@@ -56,7 +56,7 @@ class PairSNAP : public Pair {
   double **coeffelem;     // element bispectrum coefficients
   double **beta;          // betas for all atoms in list
   double **bispectrum;    // bispectrum components for all atoms in list
-  double **scale;               // for thermodynamic integration
+  double **scale;         // for thermodynamic integration
   int twojmax, switchflag, bzeroflag, bnormflag;
   int chemflag, wselfallflag;
   int chunksize;
diff --git a/src/MPIIO/dump_atom_mpiio.cpp b/src/MPIIO/dump_atom_mpiio.cpp
index c5f8f8c165..dc3dffbf80 100644
--- a/src/MPIIO/dump_atom_mpiio.cpp
+++ b/src/MPIIO/dump_atom_mpiio.cpp
@@ -114,7 +114,7 @@ void DumpAtomMPIIO::openfile()
 
     mpifo = 0;
 
-    MPI_File_set_size(mpifh, (MPI_Offset)(headerSize + sumFileSize));
+    MPI_File_set_size(mpifh, (MPI_Offset) (headerSize + sumFileSize));
     currentFileSize = (headerSize + sumFileSize);
   }
 }
diff --git a/src/MPIIO/dump_custom_mpiio.cpp b/src/MPIIO/dump_custom_mpiio.cpp
index e17d54e76a..5e7ce7dbb7 100644
--- a/src/MPIIO/dump_custom_mpiio.cpp
+++ b/src/MPIIO/dump_custom_mpiio.cpp
@@ -129,7 +129,7 @@ void DumpCustomMPIIO::openfile()
 
     mpifo = 0;
 
-    MPI_File_set_size(mpifh, (MPI_Offset)(headerSize + sumFileSize));
+    MPI_File_set_size(mpifh, (MPI_Offset) (headerSize + sumFileSize));
     currentFileSize = (headerSize + sumFileSize);
   }
 }
diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp
index eacb774372..2bcc710d42 100644
--- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp
+++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp
@@ -221,7 +221,8 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th
         }
 
         if (EVFLAG)
-          ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair_i, delx, dely, delz, thr);
+          ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair_i, delx, dely, delz,
+                       thr);
       }
     }
     f[i].x += fxtmp;
diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h
index f13313b511..093d0a8a42 100644
--- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h
+++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h
@@ -33,10 +33,10 @@ class PairLJCutCoulCutDielectricOMP : public PairLJCutCoulCutDielectric, public
 
  protected:
   template 
-  void eval(int ifrom, int ito, ThrData * const thr);
+  void eval(int ifrom, int ito, ThrData *const thr);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h
index ab4c6ebdae..0d13c4a92e 100644
--- a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h
+++ b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h
@@ -34,10 +34,10 @@ class PairLJCutCoulLongDielectricOMP : public PairLJCutCoulLongDielectric, publi
 
  protected:
   template 
-  void eval(int ifrom, int ito, ThrData * const thr);
+  void eval(int ifrom, int ito, ThrData *const thr);
 };
 
-}
+}    // namespace LAMMPS_NS
 
 #endif
 #endif
diff --git a/src/OPENMP/pair_reaxff_omp.h b/src/OPENMP/pair_reaxff_omp.h
index cced5861be..3e8ebac284 100644
--- a/src/OPENMP/pair_reaxff_omp.h
+++ b/src/OPENMP/pair_reaxff_omp.h
@@ -48,31 +48,29 @@ class PairReaxFFOMP : public PairReaxFF, public ThrOMP {
     reduce_thr(styleparm, eflagparm, vflagparm, thrparm);
   }
 
-  inline void ev_tally_thr_proxy(const int iparm, const int jparm,
-                                 const int nlocalparm, const int newton_pairparm,
-                                 const double evdwlparm, const double ecoulparm,
-                                 const double fpairparm, const double delxparm,
-                                 const double delyparm, const double delzparm,
-                                 ThrData *const thrparm)
+  inline void ev_tally_thr_proxy(const int iparm, const int jparm, const int nlocalparm,
+                                 const int newton_pairparm, const double evdwlparm,
+                                 const double ecoulparm, const double fpairparm,
+                                 const double delxparm, const double delyparm,
+                                 const double delzparm, ThrData *const thrparm)
   {
-    ev_tally_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm,
-                 fpairparm, delxparm, delyparm, delzparm, thrparm);
+    ev_tally_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, fpairparm,
+                 delxparm, delyparm, delzparm, thrparm);
   }
 
-  inline void ev_tally_xyz_thr_proxy(const int iparm, const int jparm,
-                                     const int nlocalparm, const int newton_pairparm,
-                                     const double evdwlparm, const double ecoulparm,
-                                     const double fxparm, const double fyparm, const double fzparm,
+  inline void ev_tally_xyz_thr_proxy(const int iparm, const int jparm, const int nlocalparm,
+                                     const int newton_pairparm, const double evdwlparm,
+                                     const double ecoulparm, const double fxparm,
+                                     const double fyparm, const double fzparm,
                                      const double delxparm, const double delyparm,
                                      const double delzparm, ThrData *const thrparm)
   {
-    ev_tally_xyz_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm,
-                     fxparm, fyparm, fzparm, delxparm, delyparm, delzparm, thrparm);
+    ev_tally_xyz_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, fxparm,
+                     fyparm, fzparm, delxparm, delyparm, delzparm, thrparm);
   }
 
-  inline void ev_tally3_thr_proxy(int i, int j, int k, double evdwl,
-                                  double ecoul, double *fj, double *fk, double *drji, double *drki,
-                                  ThrData *const thrparm)
+  inline void ev_tally3_thr_proxy(int i, int j, int k, double evdwl, double ecoul, double *fj,
+                                  double *fk, double *drji, double *drki, ThrData *const thrparm)
   {
     ev_tally3_thr(this, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm);
   }
diff --git a/src/OPENMP/reaxff_omp.h b/src/OPENMP/reaxff_omp.h
index 252e5f0e9d..a8fda4d247 100644
--- a/src/OPENMP/reaxff_omp.h
+++ b/src/OPENMP/reaxff_omp.h
@@ -27,77 +27,73 @@
 #include 
 #endif
 
-namespace ReaxFF
+namespace ReaxFF {
+// exported Functions
+
+// bond orders OpenMP
+
+extern void Add_dBond_to_ForcesOMP(reax_system *, int, int, storage *, reax_list **);
+extern void Add_dBond_to_Forces_NPTOMP(reax_system *, int, int, storage *, reax_list **);
+extern int BOp_OMP(storage *, reax_list *, double, int, int, far_neighbor_data *,
+                   single_body_parameters *, single_body_parameters *, two_body_parameters *, int,
+                   double, double, double, double, double, double, double);
+
+extern void BOOMP(reax_system *, storage *, reax_list **);
+
+// bonds OpenMP
+
+extern void BondsOMP(reax_system *, simulation_data *, storage *, reax_list **);
+
+// forces OpenMP
+
+extern void Compute_ForcesOMP(reax_system *, control_params *, simulation_data *, storage *,
+                              reax_list **);
+
+// hydrogen bonds
+
+extern void Hydrogen_BondsOMP(reax_system *, control_params *, simulation_data *, storage *,
+                              reax_list **);
+
+// init md OpenMP
+
+extern void InitializeOMP(reax_system *, control_params *, simulation_data *, storage *,
+                          reax_list **, MPI_Comm);
+
+// multi body
+
+extern void Atom_EnergyOMP(reax_system *, simulation_data *, storage *, reax_list **);
+
+// nonbonded
+
+extern void vdW_Coulomb_Energy_OMP(reax_system *, control_params *, simulation_data *, storage *,
+                                   reax_list **);
+extern void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *, control_params *, simulation_data *,
+                                             storage *, reax_list **);
+extern void LR_vdW_CoulombOMP(reax_system *, storage *, control_params *, int, int, double,
+                              LR_data *);
+
+// torsion angles
+
+extern void Torsion_AnglesOMP(reax_system *, control_params *, simulation_data *, storage *,
+                              reax_list **);
+
+// valence angles
+
+extern void Calculate_ThetaOMP(rvec, double, rvec, double, double *, double *);
+extern void Calculate_dCos_ThetaOMP(rvec, double, rvec, double, rvec *, rvec *, rvec *);
+extern void Valence_AnglesOMP(reax_system *, control_params *, simulation_data *, storage *,
+                              reax_list **);
+
+// OpenMP helpers
+
+inline int get_tid()
 {
-  // exported Functions
-
-  // bond orders OpenMP
-
-  extern void Add_dBond_to_ForcesOMP(reax_system *, int, int, storage *, reax_list **);
-  extern void Add_dBond_to_Forces_NPTOMP(reax_system *, int, int, storage *, reax_list **);
-  extern int BOp_OMP(storage *, reax_list *, double, int, int, far_neighbor_data *,
-                     single_body_parameters *, single_body_parameters *,
-                     two_body_parameters *, int, double, double, double,
-                     double, double, double, double);
-
-  extern void BOOMP(reax_system *, storage *, reax_list **);
-
-  // bonds OpenMP
-
-  extern void BondsOMP(reax_system *, simulation_data *,
-                       storage *, reax_list **);
-
-  // forces OpenMP
-
-  extern void Compute_ForcesOMP(reax_system *, control_params *,
-                                simulation_data *, storage *, reax_list **);
-
-  // hydrogen bonds
-
-  extern void Hydrogen_BondsOMP(reax_system *, control_params *,
-                                simulation_data *, storage *, reax_list **);
-
-  // init md OpenMP
-
-  extern void InitializeOMP(reax_system *, control_params *, simulation_data *,
-                            storage *, reax_list **,MPI_Comm);
-
-  // multi body
-
-  extern void Atom_EnergyOMP(reax_system *, simulation_data *, storage *, reax_list **);
-
-  // nonbonded
-
-  extern void vdW_Coulomb_Energy_OMP(reax_system *, control_params *,
-                                     simulation_data *, storage *, reax_list **);
-  extern void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *, control_params *,
-                                               simulation_data *, storage *,
-                                               reax_list **);
-  extern void LR_vdW_CoulombOMP(reax_system *, storage *, control_params *,
-                                int, int, double, LR_data *);
-
-  // torsion angles
-
-  extern void Torsion_AnglesOMP(reax_system *, control_params *,
-                                simulation_data *, storage *, reax_list **);
-
-  // valence angles
-
-  extern void Calculate_ThetaOMP(rvec, double, rvec, double, double *, double *);
-  extern void Calculate_dCos_ThetaOMP(rvec, double, rvec, double,
-                                      rvec *, rvec *, rvec *);
-  extern void Valence_AnglesOMP(reax_system *, control_params *, simulation_data *,
-                                storage *, reax_list **);
-
-  // OpenMP helpers
-
-  inline int get_tid() {
 #if defined(_OPENMP)
-    return omp_get_thread_num();
+  return omp_get_thread_num();
 #else
-    return 0;
+  return 0;
 #endif
-  }
 }
+}    // namespace ReaxFF
 
 #endif
diff --git a/src/OPENMP/thr_omp.h b/src/OPENMP/thr_omp.h
index 02fdbdf25b..c35ca9a056 100644
--- a/src/OPENMP/thr_omp.h
+++ b/src/OPENMP/thr_omp.h
@@ -135,8 +135,10 @@ class ThrOMP {
   void ev_tally_xyz_full_thr(Pair *const, const int, const double, const double, const double,
                              const double, const double, const double, const double, const double,
                              ThrData *const);
-  void v_tally2_thr(Pair *const, const int, const int, const double, const double *const, ThrData *const);
-  void v_tally2_newton_thr(Pair *const, const int, const double *const, const double *const, ThrData *const);
+  void v_tally2_thr(Pair *const, const int, const int, const double, const double *const,
+                    ThrData *const);
+  void v_tally2_newton_thr(Pair *const, const int, const double *const, const double *const,
+                           ThrData *const);
   void ev_tally3_thr(Pair *const, const int, const int, const int, const double, const double,
                      const double *const, const double *const, const double *const,
                      const double *const, ThrData *const);
diff --git a/src/SRD/fix_srd.cpp b/src/SRD/fix_srd.cpp
index 04fb33eec4..22fade7bf3 100644
--- a/src/SRD/fix_srd.cpp
+++ b/src/SRD/fix_srd.cpp
@@ -1340,13 +1340,17 @@ void FixSRD::collisions_single()
               std::string mesg;
               if (type != WALL)
                 mesg = fmt::format("SRD particle {} started inside big particle {} on step {} "
-                                   " bounce {}", tag[i], tag[j], update->ntimestep, ibounce + 1);
+                                   " bounce {}",
+                                   tag[i], tag[j], update->ntimestep, ibounce + 1);
               else
                 mesg = fmt::format("SRD particle {} started inside wall {} on step {} "
-                                   "bounce {}", tag[i], j, update->ntimestep, ibounce + 1);
+                                   "bounce {}",
+                                   tag[i], j, update->ntimestep, ibounce + 1);
 
-              if (insideflag == INSIDE_ERROR) error->one(FLERR, mesg);
-              else error->warning(FLERR, mesg);
+              if (insideflag == INSIDE_ERROR)
+                error->one(FLERR, mesg);
+              else
+                error->warning(FLERR, mesg);
             }
             break;
           }
@@ -1490,10 +1494,12 @@ void FixSRD::collisions_multi()
               std::string mesg;
               if (type != WALL)
                 mesg = fmt::format("SRD particle {} started inside big particle {} on step {} "
-                                   "bounce {}", tag[i], tag[j], update->ntimestep, ibounce + 1);
+                                   "bounce {}",
+                                   tag[i], tag[j], update->ntimestep, ibounce + 1);
               else
                 mesg = fmt::format("SRD particle {} started inside wall {} on step {} "
-                                   "bounce {}", tag[i], j, update->ntimestep, ibounce + 1);
+                                   "bounce {}",
+                                   tag[i], j, update->ntimestep, ibounce + 1);
 
               if (insideflag == INSIDE_ERROR) error->one(FLERR, mesg);
               error->warning(FLERR, mesg);
diff --git a/src/TALLY/compute_force_tally.cpp b/src/TALLY/compute_force_tally.cpp
index 8216269fe0..1a01d3f661 100644
--- a/src/TALLY/compute_force_tally.cpp
+++ b/src/TALLY/compute_force_tally.cpp
@@ -214,6 +214,6 @@ void ComputeForceTally::compute_peratom()
 
 double ComputeForceTally::memory_usage()
 {
-  double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double);
+  double bytes = (nmax < 0) ? 0 : nmax * (double) size_peratom_cols * sizeof(double);
   return bytes;
 }
diff --git a/src/TALLY/compute_heat_flux_tally.cpp b/src/TALLY/compute_heat_flux_tally.cpp
index 7bff99eeb7..c11cd61b12 100644
--- a/src/TALLY/compute_heat_flux_tally.cpp
+++ b/src/TALLY/compute_heat_flux_tally.cpp
@@ -281,6 +281,6 @@ void ComputeHeatFluxTally::compute_vector()
 
 double ComputeHeatFluxTally::memory_usage()
 {
-  double bytes = (nmax < 0) ? 0 : nmax * (double)comm_reverse * sizeof(double);
+  double bytes = (nmax < 0) ? 0 : nmax * (double) comm_reverse * sizeof(double);
   return bytes;
 }
diff --git a/src/TALLY/compute_heat_flux_virial_tally.cpp b/src/TALLY/compute_heat_flux_virial_tally.cpp
index 8605b9c546..ddf56cb4d8 100644
--- a/src/TALLY/compute_heat_flux_virial_tally.cpp
+++ b/src/TALLY/compute_heat_flux_virial_tally.cpp
@@ -233,6 +233,6 @@ void ComputeHeatFluxVirialTally::compute_peratom()
 
 double ComputeHeatFluxVirialTally::memory_usage()
 {
-  double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double);
+  double bytes = (nmax < 0) ? 0 : nmax * (double) size_peratom_cols * sizeof(double);
   return bytes;
 }
diff --git a/src/TALLY/compute_pe_tally.cpp b/src/TALLY/compute_pe_tally.cpp
index 07cb500e44..a455b3f7d6 100644
--- a/src/TALLY/compute_pe_tally.cpp
+++ b/src/TALLY/compute_pe_tally.cpp
@@ -203,6 +203,6 @@ void ComputePETally::compute_peratom()
 
 double ComputePETally::memory_usage()
 {
-  double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double);
+  double bytes = (nmax < 0) ? 0 : nmax * (double) size_peratom_cols * sizeof(double);
   return bytes;
 }
diff --git a/src/TALLY/compute_stress_tally.cpp b/src/TALLY/compute_stress_tally.cpp
index dea65ade26..05fc362e62 100644
--- a/src/TALLY/compute_stress_tally.cpp
+++ b/src/TALLY/compute_stress_tally.cpp
@@ -253,6 +253,6 @@ void ComputeStressTally::compute_peratom()
 
 double ComputeStressTally::memory_usage()
 {
-  double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double);
+  double bytes = (nmax < 0) ? 0 : nmax * (double) size_peratom_cols * sizeof(double);
   return bytes;
 }

From 1bd6e563699976eeeea38f5deb2ba129eb8921c0 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:06:56 -0400
Subject: [PATCH 073/437] simplify code using utils::strdup()

---
 src/KOKKOS/atom_kokkos.cpp | 65 ++++++++++++++------------------------
 1 file changed, 24 insertions(+), 41 deletions(-)

diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp
index 5fb9840a48..e55a672972 100644
--- a/src/KOKKOS/atom_kokkos.cpp
+++ b/src/KOKKOS/atom_kokkos.cpp
@@ -264,58 +264,41 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols)
   if (flag == 0 && cols == 0) {
     index = nivector;
     nivector++;
-    ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *),
-                                        "atom:ivname");
-    int n = strlen(name) + 1;
-    ivname[index] = new char[n];
-    strcpy(ivname[index],name);
-    ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *),
-                                        "atom:ivector");
-    memory->create(ivector[index],nmax,"atom:ivector");
+    ivname = (char **) memory->srealloc(ivname, nivector * sizeof(char *), "atom:ivname");
+    ivname[index] = utils::strdup(name);
+    ivector = (int **) memory->srealloc(ivector, nivector * sizeof(int *), "atom:ivector");
+    memory->create(ivector[index], nmax, "atom:ivector");
 
   } else if (flag == 1 && cols == 0) {
     index = ndvector;
     ndvector++;
-    dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *),
-                                        "atom:dvname");
-    int n = strlen(name) + 1;
-    dvname[index] = new char[n];
-    strcpy(dvname[index],name);
-    dvector = (double **) memory->srealloc(dvector,ndvector*sizeof(double *),
-                                           "atom:dvector");
-    this->sync(Device,DVECTOR_MASK);
-    memoryKK->grow_kokkos(k_dvector,dvector,ndvector,nmax,
-                        "atom:dvector");
-    this->modified(Device,DVECTOR_MASK);
+    dvname = (char **) memory->srealloc(dvname, ndvector * sizeof(char *), "atom:dvname");
+    dvname[index] = utils::strdup(name);
+    dvector = (double **) memory->srealloc(dvector, ndvector * sizeof(double *), "atom:dvector");
+    this->sync(Device, DVECTOR_MASK);
+    memoryKK->grow_kokkos(k_dvector, dvector, ndvector, nmax, "atom:dvector");
+    this->modified(Device, DVECTOR_MASK);
 
   } else if (flag == 0 && cols) {
     index = niarray;
     niarray++;
-    ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *),
-                                        "atom:ianame");
-    int n = strlen(name) + 1;
-    ianame[index] = new char[n];
-    strcpy(ianame[index],name);
-    iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **),
-                                        "atom:iarray");
-    memory->create(iarray[index],nmax,cols,"atom:iarray");
+    ianame = (char **) memory->srealloc(ianame, niarray * sizeof(char *), "atom:ianame");
+    ianame[index] = utils::strdup(name);
+    iarray = (int ***) memory->srealloc(iarray, niarray * sizeof(int **), "atom:iarray");
+    memory->create(iarray[index], nmax, cols, "atom:iarray");
 
-    icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols");
+    icols = (int *) memory->srealloc(icols, niarray * sizeof(int), "atom:icols");
     icols[index] = cols;
 
   } else if (flag == 1 && cols) {
     index = ndarray;
     ndarray++;
-    daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *),
-                                        "atom:daname");
-    int n = strlen(name) + 1;
-    daname[index] = new char[n];
-    strcpy(daname[index],name);
-    darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **),
-                                           "atom:darray");
-    memory->create(darray[index],nmax,cols,"atom:darray");
+    daname = (char **) memory->srealloc(daname, ndarray * sizeof(char *), "atom:daname");
+    daname[index] = utils::strdup(name);
+    darray = (double ***) memory->srealloc(darray, ndarray * sizeof(double **), "atom:darray");
+    memory->create(darray[index], nmax, cols, "atom:darray");
 
-    dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols");
+    dcols = (int *) memory->srealloc(dcols, ndarray * sizeof(int), "atom:dcols");
     dcols[index] = cols;
   }
 
@@ -333,24 +316,24 @@ void AtomKokkos::remove_custom(int index, int flag, int cols)
   if (flag == 0 && cols == 0) {
     memory->destroy(ivector[index]);
     ivector[index] = NULL;
-    delete [] ivname[index];
+    delete[] ivname[index];
     ivname[index] = NULL;
 
   } else if (flag == 1 && cols == 0) {
     dvector[index] = NULL;
-    delete [] dvname[index];
+    delete[] dvname[index];
     dvname[index] = NULL;
 
   } else if (flag == 0 && cols) {
     memory->destroy(iarray[index]);
     iarray[index] = NULL;
-    delete [] ianame[index];
+    delete[] ianame[index];
     ianame[index] = NULL;
 
   } else if (flag == 1 && cols) {
     memory->destroy(darray[index]);
     darray[index] = NULL;
-    delete [] daname[index];
+    delete[] daname[index];
     daname[index] = NULL;
   }
 }

From 7fe6e95d3a9d104c6c65154bbd23bff397b6d15a Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:11:05 -0400
Subject: [PATCH 074/437] make clang-format processing verbose to show progress

---
 src/Makefile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index f9c71d7d98..4e6fb5cea9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -493,10 +493,10 @@ fix-homepage:
 	$(PYTHON) ../tools/coding_standard/homepage.py .. -f
 
 format-src:
-	clang-format -i --style=file *.cpp *.h */*.cpp */*.h
+	clang-format -i --verbose --style=file *.cpp *.h */*.cpp */*.h
 
 format-tests:
-	clang-format -i --style=file ../unittest/*/*.cpp ../unittest/*/*.h
+	clang-format -i --verbose --style=file ../unittest/*/*.cpp ../unittest/*/*.h
 
 
 # Package management

From 7b3755bcf42f2281408ea522227efd0c20e23ca5 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:17:04 -0400
Subject: [PATCH 075/437] remove redundant '// clang-format off' marker

---
 src/KOKKOS/angle_charmm_kokkos.h                        | 1 -
 src/KOKKOS/angle_class2_kokkos.h                        | 1 -
 src/KOKKOS/angle_cosine_kokkos.h                        | 1 -
 src/KOKKOS/angle_harmonic_kokkos.h                      | 1 -
 src/KOKKOS/atom_vec_angle_kokkos.h                      | 1 -
 src/KOKKOS/atom_vec_atomic_kokkos.h                     | 1 -
 src/KOKKOS/atom_vec_bond_kokkos.h                       | 1 -
 src/KOKKOS/atom_vec_charge_kokkos.h                     | 1 -
 src/KOKKOS/atom_vec_dpd_kokkos.h                        | 1 -
 src/KOKKOS/atom_vec_full_kokkos.h                       | 1 -
 src/KOKKOS/atom_vec_hybrid_kokkos.h                     | 1 -
 src/KOKKOS/atom_vec_molecular_kokkos.h                  | 1 -
 src/KOKKOS/atom_vec_sphere_kokkos.h                     | 1 -
 src/KOKKOS/atom_vec_spin_kokkos.h                       | 1 -
 src/KOKKOS/bond_class2_kokkos.h                         | 1 -
 src/KOKKOS/bond_fene_kokkos.h                           | 1 -
 src/KOKKOS/bond_harmonic_kokkos.h                       | 1 -
 src/KOKKOS/compute_coord_atom_kokkos.h                  | 1 -
 src/KOKKOS/compute_orientorder_atom_kokkos.h            | 1 -
 src/KOKKOS/compute_temp_kokkos.h                        | 1 -
 src/KOKKOS/dihedral_charmm_kokkos.h                     | 1 -
 src/KOKKOS/dihedral_class2_kokkos.h                     | 1 -
 src/KOKKOS/dihedral_harmonic_kokkos.h                   | 1 -
 src/KOKKOS/dihedral_opls_kokkos.h                       | 1 -
 src/KOKKOS/fix_deform_kokkos.h                          | 1 -
 src/KOKKOS/fix_dpd_energy_kokkos.h                      | 1 -
 src/KOKKOS/fix_enforce2d_kokkos.h                       | 1 -
 src/KOKKOS/fix_eos_table_rx_kokkos.h                    | 1 -
 src/KOKKOS/fix_freeze_kokkos.h                          | 1 -
 src/KOKKOS/fix_gravity_kokkos.h                         | 1 -
 src/KOKKOS/fix_langevin_kokkos.h                        | 1 -
 src/KOKKOS/fix_minimize_kokkos.h                        | 1 -
 src/KOKKOS/fix_momentum_kokkos.h                        | 1 -
 src/KOKKOS/fix_neigh_history_kokkos.h                   | 1 -
 src/KOKKOS/fix_nph_kokkos.h                             | 1 -
 src/KOKKOS/fix_npt_kokkos.h                             | 1 -
 src/KOKKOS/fix_nve_kokkos.h                             | 1 -
 src/KOKKOS/fix_nve_sphere_kokkos.h                      | 1 -
 src/KOKKOS/fix_nvt_kokkos.h                             | 1 -
 src/KOKKOS/fix_property_atom_kokkos.h                   | 1 -
 src/KOKKOS/fix_qeq_reaxff_kokkos.h                      | 1 -
 src/KOKKOS/fix_reaxff_bonds_kokkos.h                    | 1 -
 src/KOKKOS/fix_reaxff_species_kokkos.h                  | 1 -
 src/KOKKOS/fix_rx_kokkos.h                              | 1 -
 src/KOKKOS/fix_setforce_kokkos.h                        | 1 -
 src/KOKKOS/fix_shake_kokkos.h                           | 1 -
 src/KOKKOS/fix_shardlow_kokkos.h                        | 1 -
 src/KOKKOS/fix_wall_lj93_kokkos.h                       | 1 -
 src/KOKKOS/fix_wall_reflect_kokkos.h                    | 1 -
 src/KOKKOS/improper_class2_kokkos.h                     | 1 -
 src/KOKKOS/improper_harmonic_kokkos.h                   | 1 -
 src/KOKKOS/min_cg_kokkos.h                              | 1 -
 src/KOKKOS/nbin_kokkos.h                                | 1 -
 src/KOKKOS/nbin_ssa_kokkos.h                            | 1 -
 src/KOKKOS/npair_copy_kokkos.h                          | 1 -
 src/KOKKOS/npair_halffull_kokkos.h                      | 1 -
 src/KOKKOS/npair_kokkos.h                               | 1 -
 src/KOKKOS/npair_skip_kokkos.h                          | 1 -
 src/KOKKOS/npair_ssa_kokkos.h                           | 1 -
 src/KOKKOS/pair_buck_coul_cut_kokkos.h                  | 1 -
 src/KOKKOS/pair_buck_coul_long_kokkos.h                 | 1 -
 src/KOKKOS/pair_buck_kokkos.h                           | 1 -
 src/KOKKOS/pair_coul_cut_kokkos.h                       | 1 -
 src/KOKKOS/pair_coul_debye_kokkos.h                     | 1 -
 src/KOKKOS/pair_coul_dsf_kokkos.h                       | 1 -
 src/KOKKOS/pair_coul_long_kokkos.h                      | 1 -
 src/KOKKOS/pair_coul_wolf_kokkos.h                      | 1 -
 src/KOKKOS/pair_dpd_fdt_energy_kokkos.h                 | 1 -
 src/KOKKOS/pair_eam_alloy_kokkos.h                      | 2 --
 src/KOKKOS/pair_eam_fs_kokkos.h                         | 2 --
 src/KOKKOS/pair_eam_kokkos.h                            | 2 --
 src/KOKKOS/pair_exp6_rx_kokkos.h                        | 1 -
 src/KOKKOS/pair_gran_hooke_history_kokkos.h             | 1 -
 src/KOKKOS/pair_hybrid_kokkos.h                         | 1 -
 src/KOKKOS/pair_hybrid_overlay_kokkos.h                 | 1 -
 src/KOKKOS/pair_kokkos.h                                | 1 -
 src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h | 1 -
 src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h          | 1 -
 src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h            | 1 -
 src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h             | 1 -
 src/KOKKOS/pair_lj_class2_coul_long_kokkos.h            | 1 -
 src/KOKKOS/pair_lj_class2_kokkos.h                      | 1 -
 src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h                | 1 -
 src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h              | 1 -
 src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h                | 1 -
 src/KOKKOS/pair_lj_cut_coul_long_kokkos.h               | 1 -
 src/KOKKOS/pair_lj_cut_kokkos.h                         | 1 -
 src/KOKKOS/pair_lj_expand_kokkos.h                      | 1 -
 src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h        | 1 -
 src/KOKKOS/pair_lj_gromacs_kokkos.h                     | 1 -
 src/KOKKOS/pair_lj_sdk_kokkos.h                         | 1 -
 src/KOKKOS/pair_morse_kokkos.h                          | 1 -
 src/KOKKOS/pair_multi_lucy_rx_kokkos.h                  | 1 -
 src/KOKKOS/pair_reaxff_kokkos.h                         | 2 --
 src/KOKKOS/pair_snap_kokkos.h                           | 1 -
 src/KOKKOS/pair_sw_kokkos.h                             | 1 -
 src/KOKKOS/pair_table_kokkos.h                          | 1 -
 src/KOKKOS/pair_table_rx_kokkos.h                       | 1 -
 src/KOKKOS/pair_tersoff_kokkos.h                        | 2 --
 src/KOKKOS/pair_tersoff_mod_kokkos.h                    | 2 --
 src/KOKKOS/pair_tersoff_zbl_kokkos.h                    | 2 --
 src/KOKKOS/pair_vashishta_kokkos.h                      | 1 -
 src/KOKKOS/pair_yukawa_kokkos.h                         | 1 -
 src/KOKKOS/pair_zbl_kokkos.h                            | 1 -
 src/KOKKOS/pppm_kokkos.h                                | 1 -
 src/KOKKOS/region_block_kokkos.h                        | 1 -
 src/KOKKOS/verlet_kokkos.h                              | 1 -
 107 files changed, 114 deletions(-)

diff --git a/src/KOKKOS/angle_charmm_kokkos.h b/src/KOKKOS/angle_charmm_kokkos.h
index 0103c4fc0b..73f2e7447c 100644
--- a/src/KOKKOS/angle_charmm_kokkos.h
+++ b/src/KOKKOS/angle_charmm_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/angle_class2_kokkos.h b/src/KOKKOS/angle_class2_kokkos.h
index b047b3d578..26b147e1b1 100644
--- a/src/KOKKOS/angle_class2_kokkos.h
+++ b/src/KOKKOS/angle_class2_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/angle_cosine_kokkos.h b/src/KOKKOS/angle_cosine_kokkos.h
index 173e380fae..e23fe622a7 100644
--- a/src/KOKKOS/angle_cosine_kokkos.h
+++ b/src/KOKKOS/angle_cosine_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/angle_harmonic_kokkos.h b/src/KOKKOS/angle_harmonic_kokkos.h
index 6bbd744022..f32aca6044 100644
--- a/src/KOKKOS/angle_harmonic_kokkos.h
+++ b/src/KOKKOS/angle_harmonic_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_angle_kokkos.h b/src/KOKKOS/atom_vec_angle_kokkos.h
index d567c8f727..9de0c043eb 100644
--- a/src/KOKKOS/atom_vec_angle_kokkos.h
+++ b/src/KOKKOS/atom_vec_angle_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.h b/src/KOKKOS/atom_vec_atomic_kokkos.h
index ae2898def1..231c95cd3b 100644
--- a/src/KOKKOS/atom_vec_atomic_kokkos.h
+++ b/src/KOKKOS/atom_vec_atomic_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale AtomicKokkos/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_bond_kokkos.h b/src/KOKKOS/atom_vec_bond_kokkos.h
index 84b4998222..350aeef2d7 100644
--- a/src/KOKKOS/atom_vec_bond_kokkos.h
+++ b/src/KOKKOS/atom_vec_bond_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_charge_kokkos.h b/src/KOKKOS/atom_vec_charge_kokkos.h
index 39bb64e464..2e1ba97e8d 100644
--- a/src/KOKKOS/atom_vec_charge_kokkos.h
+++ b/src/KOKKOS/atom_vec_charge_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.h b/src/KOKKOS/atom_vec_dpd_kokkos.h
index 3c99b77b91..c7d523cb34 100644
--- a/src/KOKKOS/atom_vec_dpd_kokkos.h
+++ b/src/KOKKOS/atom_vec_dpd_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale AtomicKokkos/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_full_kokkos.h b/src/KOKKOS/atom_vec_full_kokkos.h
index 317445a57f..c751eb840d 100644
--- a/src/KOKKOS/atom_vec_full_kokkos.h
+++ b/src/KOKKOS/atom_vec_full_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_hybrid_kokkos.h b/src/KOKKOS/atom_vec_hybrid_kokkos.h
index b18a2f6567..4c1907ddc6 100644
--- a/src/KOKKOS/atom_vec_hybrid_kokkos.h
+++ b/src/KOKKOS/atom_vec_hybrid_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.h b/src/KOKKOS/atom_vec_molecular_kokkos.h
index 098d724d0e..fab833469c 100644
--- a/src/KOKKOS/atom_vec_molecular_kokkos.h
+++ b/src/KOKKOS/atom_vec_molecular_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_sphere_kokkos.h b/src/KOKKOS/atom_vec_sphere_kokkos.h
index c99c69d7ea..72eb7a665e 100644
--- a/src/KOKKOS/atom_vec_sphere_kokkos.h
+++ b/src/KOKKOS/atom_vec_sphere_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/atom_vec_spin_kokkos.h b/src/KOKKOS/atom_vec_spin_kokkos.h
index b993909439..6438da9eaa 100644
--- a/src/KOKKOS/atom_vec_spin_kokkos.h
+++ b/src/KOKKOS/atom_vec_spin_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/bond_class2_kokkos.h b/src/KOKKOS/bond_class2_kokkos.h
index c584695424..52136030aa 100644
--- a/src/KOKKOS/bond_class2_kokkos.h
+++ b/src/KOKKOS/bond_class2_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/bond_fene_kokkos.h b/src/KOKKOS/bond_fene_kokkos.h
index 0b47e27547..d52289990c 100644
--- a/src/KOKKOS/bond_fene_kokkos.h
+++ b/src/KOKKOS/bond_fene_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/bond_harmonic_kokkos.h b/src/KOKKOS/bond_harmonic_kokkos.h
index c7b301ce2f..8bd6dc4477 100644
--- a/src/KOKKOS/bond_harmonic_kokkos.h
+++ b/src/KOKKOS/bond_harmonic_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/compute_coord_atom_kokkos.h b/src/KOKKOS/compute_coord_atom_kokkos.h
index 9f1d7a5921..f67b52564c 100644
--- a/src/KOKKOS/compute_coord_atom_kokkos.h
+++ b/src/KOKKOS/compute_coord_atom_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/compute_orientorder_atom_kokkos.h b/src/KOKKOS/compute_orientorder_atom_kokkos.h
index bac13645fe..56d06b7936 100644
--- a/src/KOKKOS/compute_orientorder_atom_kokkos.h
+++ b/src/KOKKOS/compute_orientorder_atom_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/compute_temp_kokkos.h b/src/KOKKOS/compute_temp_kokkos.h
index 4320330f16..9ba486de86 100644
--- a/src/KOKKOS/compute_temp_kokkos.h
+++ b/src/KOKKOS/compute_temp_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/dihedral_charmm_kokkos.h b/src/KOKKOS/dihedral_charmm_kokkos.h
index 2ba13753bb..bea6cb9995 100644
--- a/src/KOKKOS/dihedral_charmm_kokkos.h
+++ b/src/KOKKOS/dihedral_charmm_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/dihedral_class2_kokkos.h b/src/KOKKOS/dihedral_class2_kokkos.h
index c9d2026246..8f4fbc2c8a 100644
--- a/src/KOKKOS/dihedral_class2_kokkos.h
+++ b/src/KOKKOS/dihedral_class2_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/dihedral_harmonic_kokkos.h b/src/KOKKOS/dihedral_harmonic_kokkos.h
index bebe1b054a..874a517402 100644
--- a/src/KOKKOS/dihedral_harmonic_kokkos.h
+++ b/src/KOKKOS/dihedral_harmonic_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/dihedral_opls_kokkos.h b/src/KOKKOS/dihedral_opls_kokkos.h
index d14d81ff44..b0e468f993 100644
--- a/src/KOKKOS/dihedral_opls_kokkos.h
+++ b/src/KOKKOS/dihedral_opls_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_deform_kokkos.h b/src/KOKKOS/fix_deform_kokkos.h
index 484a616728..e0835b5e0a 100644
--- a/src/KOKKOS/fix_deform_kokkos.h
+++ b/src/KOKKOS/fix_deform_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_dpd_energy_kokkos.h b/src/KOKKOS/fix_dpd_energy_kokkos.h
index 592aa4b8f5..2986b9707c 100644
--- a/src/KOKKOS/fix_dpd_energy_kokkos.h
+++ b/src/KOKKOS/fix_dpd_energy_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h
index 79e77acb43..9edd332e91 100644
--- a/src/KOKKOS/fix_enforce2d_kokkos.h
+++ b/src/KOKKOS/fix_enforce2d_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_eos_table_rx_kokkos.h b/src/KOKKOS/fix_eos_table_rx_kokkos.h
index d9adb7cf61..66d9a70390 100644
--- a/src/KOKKOS/fix_eos_table_rx_kokkos.h
+++ b/src/KOKKOS/fix_eos_table_rx_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_freeze_kokkos.h b/src/KOKKOS/fix_freeze_kokkos.h
index 1cde7bc7e0..dcfc14bd3d 100644
--- a/src/KOKKOS/fix_freeze_kokkos.h
+++ b/src/KOKKOS/fix_freeze_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_gravity_kokkos.h b/src/KOKKOS/fix_gravity_kokkos.h
index 66198e1a8e..3526b94d4c 100644
--- a/src/KOKKOS/fix_gravity_kokkos.h
+++ b/src/KOKKOS/fix_gravity_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_langevin_kokkos.h b/src/KOKKOS/fix_langevin_kokkos.h
index d82878df02..ffd5a17da5 100644
--- a/src/KOKKOS/fix_langevin_kokkos.h
+++ b/src/KOKKOS/fix_langevin_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_minimize_kokkos.h b/src/KOKKOS/fix_minimize_kokkos.h
index 3b5c8ce96c..a86788cc02 100644
--- a/src/KOKKOS/fix_minimize_kokkos.h
+++ b/src/KOKKOS/fix_minimize_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_momentum_kokkos.h b/src/KOKKOS/fix_momentum_kokkos.h
index 0de8d260cc..8dc3053acf 100644
--- a/src/KOKKOS/fix_momentum_kokkos.h
+++ b/src/KOKKOS/fix_momentum_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_neigh_history_kokkos.h b/src/KOKKOS/fix_neigh_history_kokkos.h
index 4fd4d71313..acc1e9c408 100644
--- a/src/KOKKOS/fix_neigh_history_kokkos.h
+++ b/src/KOKKOS/fix_neigh_history_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_nph_kokkos.h b/src/KOKKOS/fix_nph_kokkos.h
index c58b2012da..8d91930c32 100644
--- a/src/KOKKOS/fix_nph_kokkos.h
+++ b/src/KOKKOS/fix_nph_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_npt_kokkos.h b/src/KOKKOS/fix_npt_kokkos.h
index e162881939..b70e130c35 100644
--- a/src/KOKKOS/fix_npt_kokkos.h
+++ b/src/KOKKOS/fix_npt_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_nve_kokkos.h b/src/KOKKOS/fix_nve_kokkos.h
index 859a3fc14b..8d2aefb694 100644
--- a/src/KOKKOS/fix_nve_kokkos.h
+++ b/src/KOKKOS/fix_nve_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.h b/src/KOKKOS/fix_nve_sphere_kokkos.h
index 19ae7862af..888a1baa0d 100644
--- a/src/KOKKOS/fix_nve_sphere_kokkos.h
+++ b/src/KOKKOS/fix_nve_sphere_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_nvt_kokkos.h b/src/KOKKOS/fix_nvt_kokkos.h
index 5da5fc309b..054a083034 100644
--- a/src/KOKKOS/fix_nvt_kokkos.h
+++ b/src/KOKKOS/fix_nvt_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_property_atom_kokkos.h b/src/KOKKOS/fix_property_atom_kokkos.h
index bd5898e7ae..7f3e5758b1 100644
--- a/src/KOKKOS/fix_property_atom_kokkos.h
+++ b/src/KOKKOS/fix_property_atom_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.h b/src/KOKKOS/fix_qeq_reaxff_kokkos.h
index 2e84cd348d..3965770236 100644
--- a/src/KOKKOS/fix_qeq_reaxff_kokkos.h
+++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_reaxff_bonds_kokkos.h b/src/KOKKOS/fix_reaxff_bonds_kokkos.h
index d56f528aaa..b161f67ced 100644
--- a/src/KOKKOS/fix_reaxff_bonds_kokkos.h
+++ b/src/KOKKOS/fix_reaxff_bonds_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_reaxff_species_kokkos.h b/src/KOKKOS/fix_reaxff_species_kokkos.h
index 31c11f3a1e..2f7d94cdad 100644
--- a/src/KOKKOS/fix_reaxff_species_kokkos.h
+++ b/src/KOKKOS/fix_reaxff_species_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_rx_kokkos.h b/src/KOKKOS/fix_rx_kokkos.h
index 3837cf7927..a782958045 100644
--- a/src/KOKKOS/fix_rx_kokkos.h
+++ b/src/KOKKOS/fix_rx_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_setforce_kokkos.h b/src/KOKKOS/fix_setforce_kokkos.h
index 282588664c..e39ef82325 100644
--- a/src/KOKKOS/fix_setforce_kokkos.h
+++ b/src/KOKKOS/fix_setforce_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_shake_kokkos.h b/src/KOKKOS/fix_shake_kokkos.h
index 67456a81b7..a9967f22ec 100644
--- a/src/KOKKOS/fix_shake_kokkos.h
+++ b/src/KOKKOS/fix_shake_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_shardlow_kokkos.h b/src/KOKKOS/fix_shardlow_kokkos.h
index bd78643526..0770ef6f6f 100644
--- a/src/KOKKOS/fix_shardlow_kokkos.h
+++ b/src/KOKKOS/fix_shardlow_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_wall_lj93_kokkos.h b/src/KOKKOS/fix_wall_lj93_kokkos.h
index c215b59b32..e07789f378 100644
--- a/src/KOKKOS/fix_wall_lj93_kokkos.h
+++ b/src/KOKKOS/fix_wall_lj93_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.h b/src/KOKKOS/fix_wall_reflect_kokkos.h
index 02b578564f..3e068c06df 100644
--- a/src/KOKKOS/fix_wall_reflect_kokkos.h
+++ b/src/KOKKOS/fix_wall_reflect_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/improper_class2_kokkos.h b/src/KOKKOS/improper_class2_kokkos.h
index 3cb5c16d65..9656526e49 100644
--- a/src/KOKKOS/improper_class2_kokkos.h
+++ b/src/KOKKOS/improper_class2_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/improper_harmonic_kokkos.h b/src/KOKKOS/improper_harmonic_kokkos.h
index 799f935ecb..ad683f314d 100644
--- a/src/KOKKOS/improper_harmonic_kokkos.h
+++ b/src/KOKKOS/improper_harmonic_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/min_cg_kokkos.h b/src/KOKKOS/min_cg_kokkos.h
index 326dadf7e0..3947693a9b 100644
--- a/src/KOKKOS/min_cg_kokkos.h
+++ b/src/KOKKOS/min_cg_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/nbin_kokkos.h b/src/KOKKOS/nbin_kokkos.h
index 532729791d..1f6569177c 100644
--- a/src/KOKKOS/nbin_kokkos.h
+++ b/src/KOKKOS/nbin_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/nbin_ssa_kokkos.h b/src/KOKKOS/nbin_ssa_kokkos.h
index d042186a3c..eb5ade3e48 100644
--- a/src/KOKKOS/nbin_ssa_kokkos.h
+++ b/src/KOKKOS/nbin_ssa_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/npair_copy_kokkos.h b/src/KOKKOS/npair_copy_kokkos.h
index 43f4922d11..b272275650 100644
--- a/src/KOKKOS/npair_copy_kokkos.h
+++ b/src/KOKKOS/npair_copy_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/npair_halffull_kokkos.h b/src/KOKKOS/npair_halffull_kokkos.h
index 83ac95cc02..f6b1fbf08e 100644
--- a/src/KOKKOS/npair_halffull_kokkos.h
+++ b/src/KOKKOS/npair_halffull_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h
index 919bd420d2..339d7e425d 100644
--- a/src/KOKKOS/npair_kokkos.h
+++ b/src/KOKKOS/npair_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/npair_skip_kokkos.h b/src/KOKKOS/npair_skip_kokkos.h
index 91f1a13e68..2024a1e214 100644
--- a/src/KOKKOS/npair_skip_kokkos.h
+++ b/src/KOKKOS/npair_skip_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/npair_ssa_kokkos.h b/src/KOKKOS/npair_ssa_kokkos.h
index 4d9ce36c87..ed99f54e1e 100644
--- a/src/KOKKOS/npair_ssa_kokkos.h
+++ b/src/KOKKOS/npair_ssa_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_buck_coul_cut_kokkos.h b/src/KOKKOS/pair_buck_coul_cut_kokkos.h
index 8db6e012d5..265d625a65 100644
--- a/src/KOKKOS/pair_buck_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_buck_coul_long_kokkos.h b/src/KOKKOS/pair_buck_coul_long_kokkos.h
index 739ef6d90d..3a1a8ad9ab 100644
--- a/src/KOKKOS/pair_buck_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_buck_coul_long_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_buck_kokkos.h b/src/KOKKOS/pair_buck_kokkos.h
index 8afeeb971f..7f5f63df3c 100644
--- a/src/KOKKOS/pair_buck_kokkos.h
+++ b/src/KOKKOS/pair_buck_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_coul_cut_kokkos.h b/src/KOKKOS/pair_coul_cut_kokkos.h
index 5253ab5512..434abb81c7 100644
--- a/src/KOKKOS/pair_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_coul_cut_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_coul_debye_kokkos.h b/src/KOKKOS/pair_coul_debye_kokkos.h
index 589bf49b9a..87f45c01da 100644
--- a/src/KOKKOS/pair_coul_debye_kokkos.h
+++ b/src/KOKKOS/pair_coul_debye_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.h b/src/KOKKOS/pair_coul_dsf_kokkos.h
index 1e15e6039b..74c3ed2bb7 100644
--- a/src/KOKKOS/pair_coul_dsf_kokkos.h
+++ b/src/KOKKOS/pair_coul_dsf_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_coul_long_kokkos.h b/src/KOKKOS/pair_coul_long_kokkos.h
index 713a96584b..37e2734f35 100644
--- a/src/KOKKOS/pair_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_coul_long_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.h b/src/KOKKOS/pair_coul_wolf_kokkos.h
index b11e529da0..afcda38733 100644
--- a/src/KOKKOS/pair_coul_wolf_kokkos.h
+++ b/src/KOKKOS/pair_coul_wolf_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
index 17ff4ec03b..db471cbd5f 100644
--- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
+++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.h b/src/KOKKOS/pair_eam_alloy_kokkos.h
index 662c2a6056..4f10cc8f27 100644
--- a/src/KOKKOS/pair_eam_alloy_kokkos.h
+++ b/src/KOKKOS/pair_eam_alloy_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_eam_fs_kokkos.h b/src/KOKKOS/pair_eam_fs_kokkos.h
index 04438272a3..34b924e6e8 100644
--- a/src/KOKKOS/pair_eam_fs_kokkos.h
+++ b/src/KOKKOS/pair_eam_fs_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_eam_kokkos.h b/src/KOKKOS/pair_eam_kokkos.h
index be7acc0336..02eded90e3 100644
--- a/src/KOKKOS/pair_eam_kokkos.h
+++ b/src/KOKKOS/pair_eam_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.h b/src/KOKKOS/pair_exp6_rx_kokkos.h
index 8235573c06..4d20c59482 100644
--- a/src/KOKKOS/pair_exp6_rx_kokkos.h
+++ b/src/KOKKOS/pair_exp6_rx_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.h b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
index 6a87a48a02..6b887c0df4 100644
--- a/src/KOKKOS/pair_gran_hooke_history_kokkos.h
+++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_hybrid_kokkos.h b/src/KOKKOS/pair_hybrid_kokkos.h
index 8e1c62b15c..fbabe4162c 100644
--- a/src/KOKKOS/pair_hybrid_kokkos.h
+++ b/src/KOKKOS/pair_hybrid_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_hybrid_overlay_kokkos.h b/src/KOKKOS/pair_hybrid_overlay_kokkos.h
index 0912f0b28f..fc8efd038b 100644
--- a/src/KOKKOS/pair_hybrid_overlay_kokkos.h
+++ b/src/KOKKOS/pair_hybrid_overlay_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h
index 4e0d0b1f88..65fffd58ad 100644
--- a/src/KOKKOS/pair_kokkos.h
+++ b/src/KOKKOS/pair_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
index 2200873052..6bd1b8e61b 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
index 5cdd016fee..4fc65d596e 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h
index 983c9fa3e9..01d9b73a53 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
index a4c3b7db7f..78d3b0c96e 100644
--- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
index 4e05961d1d..7f21ec61dd 100644
--- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_class2_kokkos.h b/src/KOKKOS/pair_lj_class2_kokkos.h
index e0a6c7eb0c..cffaca174e 100644
--- a/src/KOKKOS/pair_lj_class2_kokkos.h
+++ b/src/KOKKOS/pair_lj_class2_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
index 43c2c7bf06..9e87daf9bb 100644
--- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
index 966fd780bc..f93a70e9e3 100644
--- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
index 65e7ce4959..96518e6d29 100644
--- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
index 4735b3b218..dee1e352b0 100644
--- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_cut_kokkos.h b/src/KOKKOS/pair_lj_cut_kokkos.h
index a4ebaa660e..28b6a33189 100644
--- a/src/KOKKOS/pair_lj_cut_kokkos.h
+++ b/src/KOKKOS/pair_lj_cut_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_expand_kokkos.h b/src/KOKKOS/pair_lj_expand_kokkos.h
index bdbefdd6bc..47941a9fa1 100644
--- a/src/KOKKOS/pair_lj_expand_kokkos.h
+++ b/src/KOKKOS/pair_lj_expand_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
index 3351df36e1..760dfc6d4c 100644
--- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
+++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_gromacs_kokkos.h b/src/KOKKOS/pair_lj_gromacs_kokkos.h
index 0c55d0625d..a72bdf4b99 100644
--- a/src/KOKKOS/pair_lj_gromacs_kokkos.h
+++ b/src/KOKKOS/pair_lj_gromacs_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_lj_sdk_kokkos.h b/src/KOKKOS/pair_lj_sdk_kokkos.h
index dada53edd1..5b8717c387 100644
--- a/src/KOKKOS/pair_lj_sdk_kokkos.h
+++ b/src/KOKKOS/pair_lj_sdk_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_morse_kokkos.h b/src/KOKKOS/pair_morse_kokkos.h
index db621a2a12..f8f86d6127 100644
--- a/src/KOKKOS/pair_morse_kokkos.h
+++ b/src/KOKKOS/pair_morse_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
index 2b41d62439..1ce752a2ac 100644
--- a/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
+++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h
index d15a5abb01..5ed89bf62f 100644
--- a/src/KOKKOS/pair_reaxff_kokkos.h
+++ b/src/KOKKOS/pair_reaxff_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h
index 89757ef4f1..d9e15afd54 100644
--- a/src/KOKKOS/pair_snap_kokkos.h
+++ b/src/KOKKOS/pair_snap_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_sw_kokkos.h b/src/KOKKOS/pair_sw_kokkos.h
index b477d4e42f..2192740674 100644
--- a/src/KOKKOS/pair_sw_kokkos.h
+++ b/src/KOKKOS/pair_sw_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_table_kokkos.h b/src/KOKKOS/pair_table_kokkos.h
index a0c64cb14f..accc763cc5 100644
--- a/src/KOKKOS/pair_table_kokkos.h
+++ b/src/KOKKOS/pair_table_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_table_rx_kokkos.h b/src/KOKKOS/pair_table_rx_kokkos.h
index 8a7c29de11..e8203445ca 100644
--- a/src/KOKKOS/pair_table_rx_kokkos.h
+++ b/src/KOKKOS/pair_table_rx_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_tersoff_kokkos.h b/src/KOKKOS/pair_tersoff_kokkos.h
index 0bdcf2ae24..e61791df39 100644
--- a/src/KOKKOS/pair_tersoff_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.h b/src/KOKKOS/pair_tersoff_mod_kokkos.h
index 580ab02f6b..ee589c62cd 100644
--- a/src/KOKKOS/pair_tersoff_mod_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_mod_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.h b/src/KOKKOS/pair_tersoff_zbl_kokkos.h
index e97d3af999..718932026d 100644
--- a/src/KOKKOS/pair_tersoff_zbl_kokkos.h
+++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.h
@@ -1,6 +1,4 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
-
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
    Steve Plimpton, sjplimp@sandia.gov
diff --git a/src/KOKKOS/pair_vashishta_kokkos.h b/src/KOKKOS/pair_vashishta_kokkos.h
index f4c1621476..e7be57a3b6 100644
--- a/src/KOKKOS/pair_vashishta_kokkos.h
+++ b/src/KOKKOS/pair_vashishta_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_yukawa_kokkos.h b/src/KOKKOS/pair_yukawa_kokkos.h
index d563b8a574..454c9a5eb7 100644
--- a/src/KOKKOS/pair_yukawa_kokkos.h
+++ b/src/KOKKOS/pair_yukawa_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pair_zbl_kokkos.h b/src/KOKKOS/pair_zbl_kokkos.h
index 09ef00dc17..ac8f150b7c 100644
--- a/src/KOKKOS/pair_zbl_kokkos.h
+++ b/src/KOKKOS/pair_zbl_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/pppm_kokkos.h b/src/KOKKOS/pppm_kokkos.h
index 20849d1195..d5d28d649f 100644
--- a/src/KOKKOS/pppm_kokkos.h
+++ b/src/KOKKOS/pppm_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h
index 8f393d5530..dc57a09bda 100644
--- a/src/KOKKOS/region_block_kokkos.h
+++ b/src/KOKKOS/region_block_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
diff --git a/src/KOKKOS/verlet_kokkos.h b/src/KOKKOS/verlet_kokkos.h
index 90d07f322b..b90a114370 100644
--- a/src/KOKKOS/verlet_kokkos.h
+++ b/src/KOKKOS/verlet_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories

From 1ee1471b56c37720785566b89b140bf3d73270ee Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:42:48 -0400
Subject: [PATCH 076/437] fix spelling errors

---
 doc/src/fix_bond_swap.rst | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst
index dbbaceb61f..58557e1c0b 100644
--- a/doc/src/fix_bond_swap.rst
+++ b/doc/src/fix_bond_swap.rst
@@ -65,7 +65,7 @@ The second use case is a collection of polymer chains with some
 fraction of their sites identified as "sticker" sites.  Initially each
 polymer chain is isolated from the others in a topological sense, and
 there is an intra-chain bond between every pair of sticker sites on
-the same chain.  Over time, bonds swap so that inter-moleculer sticker
+the same chain.  Over time, bonds swap so that inter-molecular sticker
 bonds are created.  This models a vitrification-style process whereby
 the polymer chains all become interconnected.  For this use case, if
 angles are defined they should not include bonds between sticker
@@ -97,7 +97,7 @@ means that bond pairs which straddle processor boundaries are not
 eligible for swapping on this step.
 
 (3) The distances between 4 pairs of atoms -- (A1,A2), (B1,B2),
-(A1,B2), (B1,A2) -- must all be less thann the specified *cutoff*\ .
+(A1,B2), (B1,A2) -- must all be less than the specified *cutoff*\ .
 
 (4) The molecule IDs of A1 and B1 must be the same (see below).
 
@@ -116,7 +116,7 @@ Boltzmann constant, and T is the current temperature of the system.
 
    IMPORTANT: Whether the swap is accepted or rejected, no other swaps
    are attempted by this processor on this timestep.  No other
-   eliglble 4-tuples of atoms are considered.  This means that each
+   eligible 4-tuples of atoms are considered.  This means that each
    processor will perform either a single swap or none on timesteps
    this fix is invoked.
 

From d72d8fa938de3580521e0de5fb7d3b1d88ce62f5 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:43:06 -0400
Subject: [PATCH 077/437] we require python 3.5 or later

---
 tools/coding_standard/homepage.py    | 5 ++++-
 tools/coding_standard/permissions.py | 5 ++++-
 tools/coding_standard/whitespace.py  | 5 ++++-
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/tools/coding_standard/homepage.py b/tools/coding_standard/homepage.py
index 7c5975a03f..8d3f158a24 100644
--- a/tools/coding_standard/homepage.py
+++ b/tools/coding_standard/homepage.py
@@ -6,7 +6,10 @@ from __future__ import print_function
 import sys
 
 if sys.version_info.major < 3:
-    sys.exit('This script must be run with Python 3.x')
+    sys.exit('This script must be run with Python 3.5 or later')
+
+if sys.version_info.minor < 5:
+    sys.exit('This script must be run with Python 3.5 or later')
 
 import os
 import glob
diff --git a/tools/coding_standard/permissions.py b/tools/coding_standard/permissions.py
index 57ea3c90a5..f76cfc1883 100644
--- a/tools/coding_standard/permissions.py
+++ b/tools/coding_standard/permissions.py
@@ -6,7 +6,10 @@ from __future__ import print_function
 import sys
 
 if sys.version_info.major < 3:
-    sys.exit('This script must be run with Python 3.x')
+    sys.exit('This script must be run with Python 3.5 or later')
+
+if sys.version_info.minor < 5:
+    sys.exit('This script must be run with Python 3.5 or later')
 
 import os
 import glob
diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py
index 081aa6ca94..5bf3e1084e 100644
--- a/tools/coding_standard/whitespace.py
+++ b/tools/coding_standard/whitespace.py
@@ -6,7 +6,10 @@ from __future__ import print_function
 import sys
 
 if sys.version_info.major < 3:
-    sys.exit('This script must be run with Python 3.x')
+    sys.exit('This script must be run with Python 3.5 or later')
+
+if sys.version_info.minor < 5:
+    sys.exit('This script must be run with Python 3.5 or later')
 
 import os
 import glob

From c84ebd1c93e9ebbea8984e6156b955a8e5f36082 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:43:49 -0400
Subject: [PATCH 078/437] update docs for build options for development

---
 doc/src/Build_development.rst | 77 +++++++++++++++++++++++------------
 1 file changed, 52 insertions(+), 25 deletions(-)

diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst
index a15d91c629..de515b50a1 100644
--- a/doc/src/Build_development.rst
+++ b/doc/src/Build_development.rst
@@ -1,15 +1,15 @@
-Development build options (CMake only)
-======================================
+Development build options
+=========================
 
-The CMake build procedure of LAMMPS offers a few extra options which are
+The build procedures in LAMMPS offers a few extra options which are
 useful during development, testing or debugging.
 
 ----------
 
 .. _compilation:
 
-Monitor compilation flags
--------------------------
+Monitor compilation flags (CMake only)
+--------------------------------------
 
 Sometimes it is necessary to verify the complete sequence of compilation flags
 generated by the CMake build. To enable a more verbose output during
@@ -30,8 +30,8 @@ variable VERBOSE set to 1:
 
 .. _clang-tidy:
 
-Enable static code analysis with clang-tidy
--------------------------------------------
+Enable static code analysis with clang-tidy (CMake only)
+--------------------------------------------------------
 
 The `clang-tidy tool `_ is a
 static code analysis tool to diagnose (and potentially fix) typical
@@ -52,8 +52,8 @@ significantly more time consuming than the compilation itself.
 
 .. _iwyu_processing:
 
-Report missing and unneeded '#include' statements
--------------------------------------------------
+Report missing and unneeded '#include' statements (CMake only)
+--------------------------------------------------------------
 
 The conventions for how and when to use and order include statements in
 LAMMPS are `documented in a separate file `_
@@ -86,8 +86,8 @@ on recording all commands required to do the compilation.
 
 .. _sanitizer:
 
-Address, Undefined Behavior, and Thread Sanitizer Support
----------------------------------------------------------
+Address, Undefined Behavior, and Thread Sanitizer Support (CMake only)
+----------------------------------------------------------------------
 
 Compilers such as GCC and Clang support generating instrumented binaries
 which use different sanitizer libraries to detect problems in the code
@@ -116,8 +116,8 @@ compilation and linking stages.  This is done through setting the
 
 .. _testing:
 
-Code Coverage and Unit Testing
-------------------------------
+Code Coverage and Unit Testing (CMake only)
+-------------------------------------------
 
 The LAMMPS code is subject to multiple levels of automated testing
 during development: integration testing (i.e. whether the code compiles
@@ -464,7 +464,8 @@ Coding style utilities
 
 To aid with enforcing some of the coding style conventions in LAMMPS
 some additional build targets have been added. These require Python 3.5
-or later and will only work on Unix-like operating and file systems.
+or later and will only work properly on Unix-like operating and file systems.
+
 The following options are available.
 
 .. code-block:: bash
@@ -476,17 +477,43 @@ The following options are available.
    make check-permissions   # search for files with permissions issues
    make fix-permissions     # correct permissions issues in files
 
+These should help to replace all TAB characters with blanks and remove
+any trailing whitespace.  Also all LAMMPS homepage URL references can be
+updated to the location change from lammps.sandia.gov to www.lammps.org.
+And the permission check can remove executable permissions from non-executable
+files (like source code).
+
+Clang-format support
+--------------------
+
 For the code in the ``unittest`` and ``src`` trees we are transitioning
 to use the `clang-format` tool to assist with having a consistent source
-code style.  The `clang-format` command bundled with Clang version 8.0
-or later is required.  The configuration is in files ``.clang-format``
-in the respective folders.  Since the modifications from `clang-format`
-can be significant and - especially for "legacy style code" - also is
-not always improving readability, a large number of files currently have
-a ``// clang-format off`` at the top, which will disable the processing.
-Over time, files will be refactored and updated to that `clang-format`
-may be applied to them (at least in part).
+code formatting style.  The `clang-format` command bundled with Clang
+version 8.0 or later is required.  The configuration is in files called
+``.clang-format`` in the respective folders.  Since the modifications
+from `clang-format` can be significant and - especially for "legacy
+style code" - they are not always improving readability, a large number
+of files currently have a ``// clang-format off`` at the top, which will
+disable the processing.  As of fall 2021 all files have been either
+"protected" this way or are enabled for full or partial `clang-format`
+processing.  Over time, the "protected" files will be refactored and
+updated so that `clang-format` may be applied to them as well.
 
-If `clang-format` is available, the source code files in the ``unittest``
-tree can be updated to conform to the formatting settings using
-``make format-tests`` and the files in ``src`` with ``make format-src``.
+It is recommended for all newly contributed files to use the clang-format
+processing while writing the code or do the coding style processing
+(including the scripts mentioned in the previous paragraph)
+
+If `clang-format` is available, files can be updated individually with
+commands like the following:
+
+.. code-block:: bash
+
+   $ clang-format -i some_file.cpp
+
+
+The following target are available for both, GNU make and CMake:
+
+.. code-block:: bash
+
+   make format-src       # apply clang-format to all files in src and the package folders
+   make format-tests     # apply clang-format to all files in the unittest tree

From 49c9f4597f0467381bbfc9642047bfc8a4bf2cc1 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:46:54 -0400
Subject: [PATCH 079/437] apply clang-format

---
 src/comm.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/comm.h b/src/comm.h
index 2ab999bab3..817d1230a2 100644
--- a/src/comm.h
+++ b/src/comm.h
@@ -107,8 +107,7 @@ class Comm : protected Pointers {
 
   // partition a global regular grid by proc sub-domains
 
-  void partition_grid(int, int, int, double,
-                      int &, int &, int &, int &, int &, int &);
+  void partition_grid(int, int, int, double, int &, int &, int &, int &, int &, int &);
 
   // memory usage
 

From 3bce886ab7177793221ea09e7ea4ae2286287fd4 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 22:16:39 -0400
Subject: [PATCH 080/437] workaround style checker issue

---
 doc/src/Build_development.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst
index de515b50a1..b93e2857fd 100644
--- a/doc/src/Build_development.rst
+++ b/doc/src/Build_development.rst
@@ -479,7 +479,7 @@ The following options are available.
 
 These should help to replace all TAB characters with blanks and remove
 any trailing whitespace.  Also all LAMMPS homepage URL references can be
-updated to the location change from lammps.sandia.gov to www.lammps.org.
+updated to the location change from Sandia to the lammps.org domain.
 And the permission check can remove executable permissions from non-executable
 files (like source code).
 

From e6455c215389b357095058b7099d5bc11acf6bef Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 21:42:48 -0400
Subject: [PATCH 081/437] fix spelling errors

---
 doc/src/fix_bond_swap.rst | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst
index dbbaceb61f..58557e1c0b 100644
--- a/doc/src/fix_bond_swap.rst
+++ b/doc/src/fix_bond_swap.rst
@@ -65,7 +65,7 @@ The second use case is a collection of polymer chains with some
 fraction of their sites identified as "sticker" sites.  Initially each
 polymer chain is isolated from the others in a topological sense, and
 there is an intra-chain bond between every pair of sticker sites on
-the same chain.  Over time, bonds swap so that inter-moleculer sticker
+the same chain.  Over time, bonds swap so that inter-molecular sticker
 bonds are created.  This models a vitrification-style process whereby
 the polymer chains all become interconnected.  For this use case, if
 angles are defined they should not include bonds between sticker
@@ -97,7 +97,7 @@ means that bond pairs which straddle processor boundaries are not
 eligible for swapping on this step.
 
 (3) The distances between 4 pairs of atoms -- (A1,A2), (B1,B2),
-(A1,B2), (B1,A2) -- must all be less thann the specified *cutoff*\ .
+(A1,B2), (B1,A2) -- must all be less than the specified *cutoff*\ .
 
 (4) The molecule IDs of A1 and B1 must be the same (see below).
 
@@ -116,7 +116,7 @@ Boltzmann constant, and T is the current temperature of the system.
 
    IMPORTANT: Whether the swap is accepted or rejected, no other swaps
    are attempted by this processor on this timestep.  No other
-   eliglble 4-tuples of atoms are considered.  This means that each
+   eligible 4-tuples of atoms are considered.  This means that each
    processor will perform either a single swap or none on timesteps
    this fix is invoked.
 

From 897dfdfb19dc1cac354577b2733aa01da8dade72 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 23:24:06 -0400
Subject: [PATCH 082/437] some updates to authors list

---
 doc/src/Intro_authors.rst | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst
index 720221d4b7..fc609e12cf 100644
--- a/doc/src/Intro_authors.rst
+++ b/doc/src/Intro_authors.rst
@@ -29,7 +29,7 @@ The following folks deserve special recognition.  Many of the packages
 they have written are unique for an MD code and LAMMPS would not be as
 general-purpose as it is without their expertise and efforts.
 
-* Metin Aktulga (MSU), REAXFF package for C version of ReaxFF
+* Metin Aktulga (MSU), REAXFF package for C/C++ version of ReaxFF
 * Mike Brown (Intel), GPU and INTEL packages
 * Colin Denniston (U Western Ontario), LATBOLTZ package
 * Georg Ganzenmuller (EMI), MACHDYN and SPH packages
@@ -37,9 +37,10 @@ general-purpose as it is without their expertise and efforts.
 * Reese Jones (Sandia) and colleagues, ATC package for atom/continuum coupling
 * Christoph Kloss (DCS Computing), LIGGGHTS code for granular materials, built on top of LAMMPS
 * Rudra Mukherjee (JPL), POEMS package for articulated rigid body motion
-* Trung Ngyuen (Northwestern U), GPU and RIGID and BODY packages
+* Trung Ngyuen (Northwestern U), GPU, RIGID, BODY, and DIELECTRIC packages
 * Mike Parks (Sandia), PERI package for Peridynamics
 * Roy Pollock (LLNL), Ewald and PPPM solvers
+* Julien Tranchida (Sandia), SPIN package
 * Christian Trott (Sandia), CUDA and KOKKOS packages
 * Ilya Valuev (JIHT), AWPMD package for wave packet MD
 * Greg Wagner (Northwestern U), MEAM package for MEAM potential

From d561fe34579d01415e4c5e7461d271099f121b25 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 23:24:47 -0400
Subject: [PATCH 083/437] clarify license terms description and reduce
 redundancy. mention LGPL verison

---
 doc/src/Intro_opensource.rst | 55 +++++++++++++++++++++++++-----------
 1 file changed, 38 insertions(+), 17 deletions(-)

diff --git a/doc/src/Intro_opensource.rst b/doc/src/Intro_opensource.rst
index 635982fd18..fa857e5014 100644
--- a/doc/src/Intro_opensource.rst
+++ b/doc/src/Intro_opensource.rst
@@ -1,40 +1,61 @@
 LAMMPS open-source license
 --------------------------
 
-LAMMPS is a freely-available open-source code, distributed under the
-terms of the `GNU Public License Version 2 `_, which means you can
-use or modify the code however you wish for your own purposes, but have
-to adhere to certain rules when redistributing it or software derived
+GPL version of LAMMPS
+^^^^^^^^^^^^^^^^^^^^^
+
+LAMMPS is an open-source code, available free-of-charge, and distributed
+under the terms of the `GNU Public License Version 2 `_ (GPLv2),
+which means you can use or modify the code however you wish for your own
+purposes, but have to adhere to certain rules when redistributing it -
+specifically in binary form - or are distributing software derived
 from it or that includes parts of it.
 
-LAMMPS comes with no warranty of any kind.  As each source file states
-in its header, it is a copyrighted code that is distributed free-of-
-charge, under the terms of the `GNU Public License Version 2 `_
-(GPLv2).  This is often referred to as open-source distribution - see
-`www.gnu.org `_ or `www.opensource.org `_.  The
-legal text of the GPL is in the LICENSE file included in the LAMMPS
-distribution.
+LAMMPS comes with no warranty of any kind.
+
+As each source file states in its header, it is a copyrighted code, and
+thus not in the public domain. For more information about open-source
+software and open-source distribution, see `www.gnu.org `_
+or `www.opensource.org `_.  The legal text of the GPL as it
+applies to LAMMPS is in the LICENSE file included in the LAMMPS distribution.
 
 .. _gpl: https://github.com/lammps/lammps/blob/master/LICENSE
 
+.. _lgpl: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+
 .. _gnuorg: http://www.gnu.org
 
 .. _opensource: http://www.opensource.org
 
-Here is a summary of what the GPL means for LAMMPS users:
+Here is a more specific summary of what the GPL means for LAMMPS users:
 
-(1) Anyone is free to use, modify, or extend LAMMPS in any way they
+(1) Anyone is free to use, copy, modify, or extend LAMMPS in any way they
 choose, including for commercial purposes.
 
 (2) If you **distribute** a modified version of LAMMPS, it must remain
-open-source, meaning you distribute **all** of it under the terms of
-the GPL.  You should clearly annotate such a code as a derivative version
-of LAMMPS.
+open-source, meaning you are required to distribute **all** of it under
+the terms of the GPL.  You should clearly annotate such a modified code
+as a derivative version of LAMMPS.
 
 (3) If you release any code that includes or uses LAMMPS source code,
 then it must also be open-sourced, meaning you distribute it under
-the terms of the GPL.
+the terms of the GPL.  You may write code that interfaces LAMMPS to
+a differently licensed library.  In that case the code that provides
+the interface must be licensed GPL, but not necessarily that library
+unless you are distributing binaries that require the library to run.
 
 (4) If you give LAMMPS files to someone else, the GPL LICENSE file and
 source file headers (including the copyright and GPL notices) should
 remain part of the code.
+
+
+LGPL version of LAMMPS
+^^^^^^^^^^^^^^^^^^^^^^
+
+We occasionally make stable LAMMPS releases available under the `GNU
+Lesser Public License v2.1 `_.  This is on request only and with
+non-LGPL compliant files removed.  This allows uses linking non-GPL
+compatible software with the (otherwise unmodified) LAMMPS library
+or loading it dynamically at runtime.  Any **modifications** to
+the LAMMPS code however, even with the LGPL licensed version, must still
+be made available under the same open source terms as LAMMPS itself.

From 4fb67c0cc61840d62c3d354070610b4d18d9ea6d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 23:25:16 -0400
Subject: [PATCH 084/437] mention pre-C++-11 version as C++-98 version.

---
 doc/src/Intro_overview.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/src/Intro_overview.rst b/doc/src/Intro_overview.rst
index a25f91bc48..96140479ac 100644
--- a/doc/src/Intro_overview.rst
+++ b/doc/src/Intro_overview.rst
@@ -19,8 +19,8 @@ supercomputers.
 .. _lws: https://www.lammps.org
 
 LAMMPS is written in C++ and requires a compiler that is at least
-compatible with the C++-11 standard.
-Earlier versions were written in F77 and F90.  See the `History page
+compatible with the C++-11 standard.  Earlier versions were written in
+F77, F90, and C++-98.  See the `History page
 `_ of the website for details.  All
 versions can be downloaded from the `LAMMPS website `_.
 

From d34083dd544de034b3b7bd362f4209a1a6e795ac Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 23 Aug 2021 23:25:25 -0400
Subject: [PATCH 085/437] update false positives

---
 doc/utils/sphinx-config/false_positives.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index 6b40fcde71..52bd0ee67a 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -1689,6 +1689,7 @@ Lett
 Leuven
 Leven
 Lewy
+LGPL
 lgvdw
 Liang
 libatc

From 3dc142c0b00d9860c3ceb908a23cf0a28ff80cba Mon Sep 17 00:00:00 2001
From: Emily Kahl 
Date: Tue, 24 Aug 2021 16:23:05 +1000
Subject: [PATCH 086/437] Added fix_nvt_sllod_kokkos and
 compute_temp_deform_kokkos to Install.sh

---
 src/KOKKOS/Install.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh
index 5e7285a75f..e23dd11500 100755
--- a/src/KOKKOS/Install.sh
+++ b/src/KOKKOS/Install.sh
@@ -43,7 +43,7 @@ elif (test $mode = 0) then
   fi
 fi
 
-# list of files with optional dependcies
+# list of files with optional dependencies
 
 action angle_charmm_kokkos.cpp angle_charmm.cpp
 action angle_charmm_kokkos.h angle_charmm.h
@@ -94,6 +94,8 @@ action compute_orientorder_atom_kokkos.cpp
 action compute_orientorder_atom_kokkos.h
 action compute_temp_kokkos.cpp
 action compute_temp_kokkos.h
+action compute_temp_deform_kokkos.cpp
+action compute_temp_deform_kokkos.h
 action dihedral_charmm_kokkos.cpp dihedral_charmm.cpp
 action dihedral_charmm_kokkos.h dihedral_charmm.h
 action dihedral_class2_kokkos.cpp dihedral_class2.cpp
@@ -135,6 +137,8 @@ action fix_nve_sphere_kokkos.cpp
 action fix_nve_sphere_kokkos.h
 action fix_nvt_kokkos.cpp
 action fix_nvt_kokkos.h
+action fix_nvt_sllod_kokkos.cpp
+action fix_nvt_sllod_kokkos.h
 action fix_property_atom_kokkos.cpp
 action fix_property_atom_kokkos.h
 action fix_qeq_reaxff_kokkos.cpp fix_qeq_reaxff.cpp

From 862cb43fa9a4c3d8dbb1219245ff6f605df93912 Mon Sep 17 00:00:00 2001
From: Vsevak 
Date: Tue, 24 Aug 2021 17:07:51 +0300
Subject: [PATCH 087/437] Enable unittest for GPU lj/cut/tip4p/long

---
 unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long.yaml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long.yaml
index 2e76bdcb57..d1bed9430b 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long.yaml
@@ -2,7 +2,6 @@
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:49 2021
 epsilon: 1e-13
-skip_tests: gpu
 prerequisites: ! |
   atom full
   pair lj/cut/tip4p/long

From 1c7cc428463f99e59f6c4a3a1e61956dbacad0a8 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 10:28:57 -0400
Subject: [PATCH 088/437] fix parallel programming bug in interlayer pair
 styles

---
 src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 17 ++++++++---------
 src/INTERLAYER/pair_lebedeva_z.cpp          | 18 +++++++++---------
 2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
index 70672ac670..d172d4e9bf 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
@@ -339,16 +339,15 @@ void PairKolmogorovCrespiZ::read_file(char *filename)
       nparams++;
       if (nparams >= pow(atom->ntypes, 3)) break;
     }
-
-    MPI_Bcast(&nparams, 1, MPI_INT, 0, world);
-    MPI_Bcast(&maxparam, 1, MPI_INT, 0, world);
-
-    if (comm->me != 0) {
-      params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params");
-    }
-
-    MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world);
   }
+  MPI_Bcast(&nparams, 1, MPI_INT, 0, world);
+  MPI_Bcast(&maxparam, 1, MPI_INT, 0, world);
+
+  if (comm->me != 0) {
+    params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params");
+  }
+
+  MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world);
 
   memory->destroy(elem2param);
   memory->create(elem2param, nelements, nelements, "pair:elem2param");
diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp
index d78c4bfbbc..76f56e402c 100644
--- a/src/INTERLAYER/pair_lebedeva_z.cpp
+++ b/src/INTERLAYER/pair_lebedeva_z.cpp
@@ -336,17 +336,17 @@ void PairLebedevaZ::read_file(char *filename)
       nparams++;
       if (nparams >= pow(atom->ntypes,3)) break;
     }
-
-    MPI_Bcast(&nparams, 1, MPI_INT, 0, world);
-    MPI_Bcast(&maxparam, 1, MPI_INT, 0, world);
-
-    if (comm->me != 0) {
-      params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params");
-    }
-
-    MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world);
   }
 
+  MPI_Bcast(&nparams, 1, MPI_INT, 0, world);
+  MPI_Bcast(&maxparam, 1, MPI_INT, 0, world);
+
+  if (comm->me != 0) {
+    params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params");
+  }
+
+  MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world);
+
   memory->destroy(elem2param);
   memory->create(elem2param,nelements,nelements,"pair:elem2param");
   for (int i = 0; i < nelements; i++) {

From af14e3227d03d07bca5dfa8bf969b0ca6c848eb5 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 10:32:10 -0400
Subject: [PATCH 089/437] skip folders/files in lib with downloaded content

---
 tools/coding_standard/whitespace.py | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py
index 5bf3e1084e..2f84e1aa6d 100644
--- a/tools/coding_standard/whitespace.py
+++ b/tools/coding_standard/whitespace.py
@@ -31,7 +31,16 @@ include:
 exclude:
     - lib/colvars/Install.py
     - lib/gpu/geryon/file_to_cstr.sh
+    - lib/hdnnp
+    - lib/kim
     - lib/kokkos
+    - lib/machdyn
+    - lib/mdi
+    - lib/mscg
+    - lib/pace
+    - lib/plumed
+    - lib/quip
+    - lib/scafacos
     - src/Make.sh
 patterns:
     - "*.c"

From a26da031aa830bee204432807cbc34afe50bd5f5 Mon Sep 17 00:00:00 2001
From: Richard Berger 
Date: Tue, 24 Aug 2021 11:27:30 -0400
Subject: [PATCH 090/437] Use .coveragerc to configure Python coverage
 reporting

---
 cmake/.coveragerc.in             | 10 ++++++++++
 cmake/Modules/CodeCoverage.cmake | 10 ++++++----
 unittest/python/CMakeLists.txt   |  2 +-
 3 files changed, 17 insertions(+), 5 deletions(-)
 create mode 100644 cmake/.coveragerc.in

diff --git a/cmake/.coveragerc.in b/cmake/.coveragerc.in
new file mode 100644
index 0000000000..3dc467d4d0
--- /dev/null
+++ b/cmake/.coveragerc.in
@@ -0,0 +1,10 @@
+[run]
+source = @LAMMPS_PYTHON_DIR@
+parallel=True
+branch=True
+omit=*/install.py
+     */setup.py
+
+[paths]
+sources = python
+          @LAMMPS_PYTHON_DIR@
diff --git a/cmake/Modules/CodeCoverage.cmake b/cmake/Modules/CodeCoverage.cmake
index 054e08fc1a..21a651e519 100644
--- a/cmake/Modules/CodeCoverage.cmake
+++ b/cmake/Modules/CodeCoverage.cmake
@@ -54,6 +54,8 @@ if(ENABLE_COVERAGE)
 
     if(COVERAGE_FOUND)
         set(PYTHON_COVERAGE_HTML_DIR ${CMAKE_BINARY_DIR}/python_coverage_html)
+        configure_file(.coveragerc.in ${CMAKE_BINARY_DIR}/.coveragerc @ONLY)
+
         add_custom_command(
             OUTPUT ${CMAKE_BINARY_DIR}/unittest/python/.coverage
             COMMAND ${COVERAGE_BINARY} combine
@@ -63,16 +65,16 @@ if(ENABLE_COVERAGE)
 
         add_custom_target(
             gen_python_coverage_html
-            COMMAND ${COVERAGE_BINARY} html -d ${PYTHON_COVERAGE_HTML_DIR}
-            DEPENDS ${CMAKE_BINARY_DIR}/unittest/python/.coverage
+            COMMAND ${COVERAGE_BINARY} html --rcfile=${CMAKE_BINARY_DIR}/.coveragerc -d ${PYTHON_COVERAGE_HTML_DIR}
+            DEPENDS ${CMAKE_BINARY_DIR}/unittest/python/.coverage ${CMAKE_BINARY_DIR}/.coveragerc
             WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/unittest/python
             COMMENT "Generating HTML Python coverage report..."
         )
 
         add_custom_target(
             gen_python_coverage_xml
-            COMMAND ${COVERAGE_BINARY} xml -o ${CMAKE_BINARY_DIR}/python_coverage.xml
-            DEPENDS ${CMAKE_BINARY_DIR}/unittest/python/.coverage
+            COMMAND ${COVERAGE_BINARY} xml --rcfile=${CMAKE_BINARY_DIR}/.coveragerc -o ${CMAKE_BINARY_DIR}/python_coverage.xml
+            DEPENDS ${CMAKE_BINARY_DIR}/unittest/python/.coverage ${CMAKE_BINARY_DIR}/.coveragerc
             WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/unittest/python
             COMMENT "Generating XML Python coverage report..."
         )
diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt
index 6832f7e028..d76f73aceb 100644
--- a/unittest/python/CMakeLists.txt
+++ b/unittest/python/CMakeLists.txt
@@ -46,7 +46,7 @@ if(Python_EXECUTABLE)
     find_package_handle_standard_args(COVERAGE DEFAULT_MSG COVERAGE_BINARY)
 
     if(COVERAGE_FOUND)
-        set(PYTHON_TEST_RUNNER ${Python_EXECUTABLE} -u ${COVERAGE_BINARY} run --parallel-mode --include=${LAMMPS_PYTHON_DIR}/lammps/*.py --omit=${LAMMPS_PYTHON_DIR}/install.py)
+        set(PYTHON_TEST_RUNNER ${Python_EXECUTABLE} -u ${COVERAGE_BINARY} run --rcfile=${CMAKE_BINARY_DIR}/.coveragerc)
     else()
         set(PYTHON_TEST_RUNNER ${Python_EXECUTABLE} -u)
     endif()

From 0bb26ff296eeaceaa505da02d3a09910fd76e14a Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 12:13:06 -0400
Subject: [PATCH 091/437] make fix qeq/reaxff/kk consistent with REAXFF package
 version

---
 src/KOKKOS/fix_qeq_reaxff_kokkos.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp
index 77bd013ad4..6761ab9b0e 100644
--- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp
+++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp
@@ -695,7 +695,7 @@ double FixQEqReaxFFKokkos::calculate_H_k(const F_FLOAT &r, const F_F
   taper = taper * r + d_tap[0];
 
   denom = r * r * r + shld;
-  denom = pow(denom,0.3333333333333);
+  denom = pow(denom,1.0/3.0);
 
   return taper * EV_TO_KCAL_PER_MOL / denom;
 }

From eaf5e085422f27acec1014d56ed94c0eaed215b2 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 14:27:20 -0400
Subject: [PATCH 092/437] detect invalid use and silence compiler warnings

---
 src/atom.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/atom.cpp b/src/atom.cpp
index 4135298673..111ce7c93c 100644
--- a/src/atom.cpp
+++ b/src/atom.cpp
@@ -2471,7 +2471,7 @@ This function is called, e.g. from :doc:`fix property/atom `.
  */
 int Atom::add_custom(const char *name, int flag, int cols)
 {
-  int index;
+  int index = -1;
 
   if ((flag == 0) && (cols == 0)) {
     index = nivector;
@@ -2511,7 +2511,8 @@ int Atom::add_custom(const char *name, int flag, int cols)
     dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols");
     dcols[index] = cols;
   }
-
+  if (index < 0)
+    error->all(FLERR,"Invalid call to Atom::add_custom()");
   return index;
 }
 

From 22391307987bbc884dee7e3cd1cfb541b85915a5 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 15:41:28 -0400
Subject: [PATCH 093/437] randomize bilayer data file positions to make
 interlayer tests more reliable

---
 unittest/force-styles/tests/data.bilayer      | 128 ++++++-----
 .../tests/manybody-pair-drip.yaml             | 204 +++++++++---------
 .../tests/manybody-pair-drip_real.yaml        | 204 +++++++++---------
 .../tests/manybody-pair-ilp-graphene-hbn.yaml | 202 ++++++++---------
 ...anybody-pair-ilp-graphene-hbn_notaper.yaml | 202 ++++++++---------
 .../manybody-pair-kolmogorov_crespi_full.yaml | 202 ++++++++---------
 ...y-pair-kolmogorov_crespi_full_notaper.yaml | 202 ++++++++---------
 7 files changed, 669 insertions(+), 675 deletions(-)

diff --git a/unittest/force-styles/tests/data.bilayer b/unittest/force-styles/tests/data.bilayer
index 101bb02480..ceb8a821d7 100644
--- a/unittest/force-styles/tests/data.bilayer
+++ b/unittest/force-styles/tests/data.bilayer
@@ -1,72 +1,66 @@
-LAMMPS data file. CGCMM style. atom_style full generated by VMD/TopoTools v1.8 on Sun Aug 15 17:12:56 EDT 2021
- 48 atoms
- 0 bonds
- 0 angles
- 0 dihedrals
- 0 impropers
- 3 atom types
- 0 bond types
- 0 angle types
- 0 dihedral types
- 0 improper types
- 0 7.38  xlo xhi
- 0 8.58  ylo yhi
- 0 10.0  zlo zhi
+LAMMPS data file via write_data, version 30 Jul 2021, timestep = 0
 
- Masses
+48 atoms
+3 atom types
 
- 1 11.000000 # 1
- 2 14.000000 # 2
- 3 12.000000 # 3
+0 7.38 xlo xhi
+0 8.58 ylo yhi
+-0.010057298274271795 10 zlo zhi
 
- Atoms # full
+Masses
 
-1 1 2 -0.420000 0.000000 0.715000 0.000000 # 2 
-2 1 1 0.420000 0.000000 2.145000 0.000000 # 1 
-3 1 2 -0.420000 1.238416 2.860000 0.000000 # 2 
-4 1 1 0.420000 1.238416 4.290000 0.000000 # 1 
-5 1 2 -0.420000 0.000000 5.005000 0.000000 # 2 
-6 1 1 0.420000 0.000000 6.435000 0.000000 # 1 
-7 1 2 -0.420000 1.238416 7.150000 0.000000 # 2 
-8 1 1 0.420000 1.238416 8.580000 0.000000 # 1 
-9 1 2 -0.420000 2.476833 0.715000 0.000000 # 2 
-10 1 1 0.420000 2.476833 2.145000 0.000000 # 1 
-11 1 2 -0.420000 3.715249 2.860000 0.000000 # 2 
-12 1 1 0.420000 3.715249 4.290000 0.000000 # 1 
-13 1 2 -0.420000 2.476833 5.005000 0.000000 # 2 
-14 1 1 0.420000 2.476833 6.435000 0.000000 # 1 
-15 1 2 -0.420000 3.715249 7.150000 0.000000 # 2 
-16 1 1 0.420000 3.715249 8.580000 0.000000 # 1 
-17 1 2 -0.420000 4.953665 0.715000 0.000000 # 2 
-18 1 1 0.420000 4.953665 2.145000 0.000000 # 1 
-19 1 2 -0.420000 6.192081 2.860000 0.000000 # 2 
-20 1 1 0.420000 6.192081 4.290000 0.000000 # 1 
-21 1 2 -0.420000 4.953665 5.005000 0.000000 # 2 
-22 1 1 0.420000 4.953665 6.435000 0.000000 # 1 
-23 1 2 -0.420000 6.192081 7.150000 0.000000 # 2 
-24 1 1 0.420000 6.192081 8.580000 0.000000 # 1 
-25 2 3 0.000000 1.238416 1.430000 3.330000 # 3 
-26 2 3 0.000000 0.000000 2.145000 3.330000 # 3 
-27 2 3 0.000000 0.000000 3.575000 3.330000 # 3 
-28 2 3 0.000000 1.238416 4.290000 3.330000 # 3 
-29 2 3 0.000000 1.238416 5.720000 3.330000 # 3 
-30 2 3 0.000000 0.000000 6.435000 3.330000 # 3 
-31 2 3 0.000000 0.000000 7.865000 3.330000 # 3 
-32 2 3 0.000000 1.238416 8.580000 3.330000 # 3 
-33 2 3 0.000000 3.715249 1.430000 3.330000 # 3 
-34 2 3 0.000000 2.476833 2.145000 3.330000 # 3 
-35 2 3 0.000000 2.476833 3.575000 3.330000 # 3 
-36 2 3 0.000000 3.715249 4.290000 3.330000 # 3 
-37 2 3 0.000000 3.715249 5.720000 3.330000 # 3 
-38 2 3 0.000000 2.476833 6.435000 3.330000 # 3 
-39 2 3 0.000000 2.476833 7.865000 3.330000 # 3 
-40 2 3 0.000000 3.715249 8.580000 3.330000 # 3 
-41 2 3 0.000000 6.192081 1.430000 3.330000 # 3 
-42 2 3 0.000000 4.953665 2.145000 3.330000 # 3 
-43 2 3 0.000000 4.953665 3.575000 3.330000 # 3 
-44 2 3 0.000000 6.192081 4.290000 3.330000 # 3 
-45 2 3 0.000000 6.192081 5.720000 3.330000 # 3 
-46 2 3 0.000000 4.953665 6.435000 3.330000 # 3 
-47 2 3 0.000000 4.953665 7.865000 3.330000 # 3 
-48 2 3 0.000000 6.192081 8.580000 3.330000 # 3 
+1 11
+2 14
+3 12
+
+Atoms # full
+
+1 1 2 -0.42 7.377582386921897 0.7221769963191714 0.0037771363154878545 -1 0 0
+2 1 1 0.42 7.378315948261095 2.1411424242268047 0.005723979908844447 -1 0 0
+3 1 2 -0.42 1.2447887970776952 2.8676004848245533 0.001348446268284902 0 0 0
+4 1 1 0.42 1.2414656689644874 4.28578628613883 0.00011113531427045186 0 0 0
+5 1 2 -0.42 0.002474815180746286 4.9992187428028405 -0.005589712651255407 0 0 0
+6 1 1 0.42 7.379979983665971 6.4385854739759045 0.0010611130348691324 -1 0 0
+7 1 2 -0.42 1.2317585840471603 7.158810080624563 -0.008974942974268898 0 0 0
+8 1 1 0.42 1.2352508770341066 0.0037783122313107898 0.002093671640424837 0 1 0
+9 1 2 -0.42 2.4773332782542727 0.7231766195586773 0.004444922690486966 0 0 0
+10 1 1 0.42 2.4830271537615816 2.1501422709017723 0.006147046087378192 0 0 0
+11 1 2 -0.42 3.709595948985172 2.8691715937849 0.006976742817543793 0 0 0
+12 1 1 0.42 3.7240167199015244 4.289068384919813 0.002345347298470022 0 0 0
+13 1 2 -0.42 2.4712325868621394 4.998856391973726 0.004379902423536359 0 0 0
+14 1 1 0.42 2.474562437522464 6.433656440055303 -0.0012119905144032052 0 0 0
+15 1 2 -0.42 3.725038325222275 7.159189010774339 -0.0002959156829379106 0 0 0
+16 1 1 0.42 3.706133972373436 0.0037306803342563467 0.0015443778464311643 0 1 0
+17 1 2 -0.42 4.956689237720773 0.7233633730273523 0.0032104707105134024 0 0 0
+18 1 1 0.42 4.962115477057346 2.152167902820356 -0.009057298274271795 0 0 0
+19 1 2 -0.42 6.184281256484653 2.869710737578436 0.008366480776279456 0 0 0
+20 1 1 0.42 6.188803450864838 4.284231685327474 -0.008064701146476297 0 0 0
+21 1 2 -0.42 4.949812422011079 5.0147217402047115 -0.006712379416782586 0 0 0
+22 1 1 0.42 4.948281204520974 6.429549384016799 -0.00850282965158244 0 0 0
+23 1 2 -0.42 6.194837058886999 7.1510817137970974 0.0003637878086249291 0 0 0
+24 1 1 0.42 6.197894966950315 8.5753425339448 0.0019680102504640875 0 0 0
+25 2 3 0 1.2443079194694104 1.4354905223825436 3.3292096834113867 0 0 0
+26 2 3 0 0.005953551957362122 2.146347747385198 3.3215903030250176 0 0 0
+27 2 3 0 0.008405194319042002 3.581100920138928 3.3281647749562584 0 0 0
+28 2 3 0 1.2344840653089975 4.28597364831994 3.339107313230218 0 0 0
+29 2 3 0 1.2459826328321986 5.712398010763525 3.3233669025652888 0 0 0
+30 2 3 0 0.0011015360109049533 6.428515735279543 3.328962843282597 0 0 0
+31 2 3 0 0.0053187626578466785 7.857443990429139 3.336147142535144 0 0 0
+32 2 3 0 1.2375058991604755 0.003935190110437195 3.328740186117934 0 1 0
+33 2 3 0 3.722777594386544 1.4230858546509806 3.3239591190330495 0 0 0
+34 2 3 0 2.477738590136957 2.145253431839055 3.329428918999354 0 0 0
+35 2 3 0 2.47490377328119 3.5704865369598786 3.332226684676589 0 0 0
+36 2 3 0 3.7109409527732264 4.284650259616156 3.3369133687377506 0 0 0
+37 2 3 0 3.7215294678437676 5.715823050199925 3.3280047101471597 0 0 0
+38 2 3 0 2.4731365114325135 6.42811664625216 3.321473560073168 0 0 0
+39 2 3 0 2.4849857361078898 7.868035765305644 3.3321074919552114 0 0 0
+40 2 3 0 3.7175249488002753 8.571871486223243 3.334068954044054 0 0 0
+41 2 3 0 6.201483231089492 1.433297921099373 3.338159917163737 0 0 0
+42 2 3 0 4.951929076909173 2.149340612475919 3.3226738827688034 0 0 0
+43 2 3 0 4.960270928343071 3.580837662003859 3.3235852988546646 0 0 0
+44 2 3 0 6.190455345511372 4.287625009635288 3.3335369402978277 0 0 0
+45 2 3 0 6.192023154106657 5.727784070585754 3.3368743347641425 0 0 0
+46 2 3 0 4.951470112194179 6.42552064756887 3.3305236900088024 0 0 0
+47 2 3 0 4.954889130658072 7.858963970208524 3.3224472946591894 0 0 0
+48 2 3 0 6.191151024308316 0.00989854985843345 3.3349274706910026 0 1 0
 
diff --git a/unittest/force-styles/tests/manybody-pair-drip.yaml b/unittest/force-styles/tests/manybody-pair-drip.yaml
index e5d4915c4d..8fc2bb892b 100644
--- a/unittest/force-styles/tests/manybody-pair-drip.yaml
+++ b/unittest/force-styles/tests/manybody-pair-drip.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:48 2021
-epsilon: 5e-14
+date_generated: Tue Aug 24 15:36:39 2021
+epsilon: 2e-13
 skip_tests: single
 prerequisites: ! |
   pair drip
@@ -16,110 +16,110 @@ pair_coeff: ! |
   * * drip C.drip C C C
 extract: ! ""
 natoms: 48
-init_vdwl: -1.1171061429439093
+init_vdwl: -1.1165820288113353
 init_coul: 0
 init_stress: ! |-
-  -6.9372049706365035e-01 -6.9064113154966333e-01  1.1515233668963607e+00  0.0000000000000000e+00  0.0000000000000000e+00 -1.4292420626121039e-02
+  -6.9202029395419495e-01 -6.8748326656871916e-01  1.1598469113436700e+00 -8.7520222366446450e-04 -7.4904268268328076e-03 -4.8018384975223698e-03
 init_forces: ! |2
-    1  1.4969082430352958e-03 -3.2939836241196573e-05 -1.3240430862322900e-02
-    2  8.0767187286290179e-04  1.0588928659053852e-03 -3.1123566690577253e-02
-    3 -3.4497099855045673e-04  3.4248846132303140e-05 -1.0175437155229471e-02
-    4 -2.4589156252144417e-04  1.8156645561760292e-05 -2.9695125191752228e-02
-    5  1.4969082430352932e-03 -3.2939836241182343e-05 -1.3240430862323165e-02
-    6  8.0767187286288694e-04  1.0588928659049949e-03 -3.1123566690577420e-02
-    7 -3.4497099855038821e-04  3.4248846132523362e-05 -1.0175437155229110e-02
-    8 -2.4589156252142683e-04  1.8156645561707817e-05 -2.9695125191752388e-02
-    9 -1.3423014800966740e-04  7.4485503462573500e-08 -1.0127230298720345e-02
-   10 -1.2282979196216780e-04 -5.3179137282562149e-06 -2.9857221873835556e-02
-   11  1.3420646745295351e-04  7.2570324572774139e-08 -1.0127289412755367e-02
-   12  1.2281957667447806e-04 -5.2981576756526129e-06 -2.9857246714720800e-02
-   13 -1.3423014800966089e-04  7.4485503475472118e-08 -1.0127230298720606e-02
-   14 -1.2282979196215913e-04 -5.3179137286977698e-06 -2.9857221873835549e-02
-   15  1.3420646745295687e-04  7.2570324835217239e-08 -1.0127289412755180e-02
-   16  1.2281957667447502e-04 -5.2981576756378754e-06 -2.9857246714720957e-02
-   17  3.4500424726267094e-04  3.4247597717764226e-05 -1.0175497243327751e-02
-   18  2.4590943990438825e-04  1.8176873676577221e-05 -2.9695147824251051e-02
-   19 -1.4969178111888977e-03 -3.2939169475935731e-05 -1.3240431836380913e-02
-   20 -8.0767953495986997e-04  1.0588933379664879e-03 -3.1123564482199977e-02
-   21  3.4500424726266232e-04  3.4247597717770589e-05 -1.0175497243328002e-02
-   22  2.4590943990438212e-04  1.8176873676178533e-05 -2.9695147824251072e-02
-   23 -1.4969178111887745e-03 -3.2939169475980779e-05 -1.3240431836380712e-02
-   24 -8.0767953495988450e-04  1.0588933379664870e-03 -3.1123564482199943e-02
-   25 -3.4497099855045933e-04 -3.4248846132324567e-05  1.0175437155229457e-02
-   26  8.0767187286290309e-04 -1.0588928659053826e-03  3.1123566690577247e-02
-   27  1.4969082430351102e-03  3.2939836241083992e-05  1.3240430862322843e-02
-   28 -2.4589156252142509e-04 -1.8156645561688708e-05  2.9695125191752263e-02
-   29 -3.4497099855046193e-04 -3.4248846132538534e-05  1.0175437155229280e-02
-   30  8.0767187286257902e-04 -1.0588928659051909e-03  3.1123566690576712e-02
-   31  1.4969082430352915e-03  3.2939836241593784e-05  1.3240430862323165e-02
-   32 -2.4589156252143897e-04 -1.8156645561741183e-05  2.9695125191752519e-02
-   33  1.3420646745296197e-04 -7.2570324595813435e-08  1.0127289412755341e-02
-   34 -1.2282979196217170e-04  5.3179137282585121e-06  2.9857221873835549e-02
-   35 -1.3423014800966349e-04 -7.4485503448870201e-08  1.0127230298720332e-02
-   36  1.2281957667447611e-04  5.2981576756533134e-06  2.9857246714720946e-02
-   37  1.3420646745295709e-04 -7.2570324815599003e-08  1.0127289412755423e-02
-   38 -1.2282979196223502e-04  5.3179137282683716e-06  2.9857221873835008e-02
-   39 -1.3423014800966436e-04 -7.4485503047341829e-08  1.0127230298720473e-02
-   40  1.2281957667448912e-04  5.2981576756629069e-06  2.9857246714721068e-02
-   41 -1.4969178111890833e-03  3.2939169476025510e-05  1.3240431836380942e-02
-   42  2.4590943990438738e-04 -1.8176873676568727e-05  2.9695147824251211e-02
-   43  3.4500424726266921e-04 -3.4247597717747861e-05  1.0175497243327740e-02
-   44 -8.0767953495988342e-04 -1.0588933379665052e-03  3.1123564482200137e-02
-   45 -1.4969178111890772e-03  3.2939169475814605e-05  1.3240431836381151e-02
-   46  2.4590943990439947e-04 -1.8176873676638302e-05  2.9695147824250822e-02
-   47  3.4500424726267181e-04 -3.4247597717339300e-05  1.0175497243327872e-02
-   48 -8.0767953495988081e-04 -1.0588933379665191e-03  3.1123564482200175e-02
-run_vdwl: -1.117107802396835
+    1  1.4410960759987860e-03 -1.0169393511311969e-03 -1.4285790452588352e-02
+    2  3.4022682581723486e-04  1.2797267794660613e-03 -3.1898882299555655e-02
+    3 -2.6365196949846605e-04  2.0444656479657366e-04 -1.1310141731659772e-02
+    4  3.2407051817817667e-04 -4.6232566789062061e-04 -2.9910736659103317e-02
+    5  8.6245599980334670e-04  1.9925559001726770e-04 -1.2745556995400132e-02
+    6  5.1905954665549387e-04  1.1276332993411060e-03 -3.0823356931780860e-02
+    7 -1.6088212112039344e-04  1.4230630104907803e-04 -8.0118146476316210e-03
+    8 -4.5244202184603708e-04 -1.4652059326166248e-04 -3.0139505526382837e-02
+    9 -8.3793846695301086e-05 -4.1141009708683870e-04 -1.0952073086473545e-02
+   10  1.0558775462631573e-04  3.2338361212355486e-04 -3.0862434540746431e-02
+   11  6.9846394554382257e-05  1.7181288265826418e-05 -1.0563492234071459e-02
+   12 -8.0680668202737346e-04 -4.0664776842267906e-04 -2.9407396519018757e-02
+   13  4.1248090507395221e-04 -8.1127163583308737e-04 -1.1037445663309341e-02
+   14  2.3332834021886836e-04  5.5940029155014345e-04 -2.9697888304764254e-02
+   15 -4.4744269608917094e-04 -6.4403133698428692e-04 -1.0302570659537293e-02
+   16  1.0107877556045320e-04 -1.7601743406948410e-04 -3.0441022553442356e-02
+   17  7.8768348766012383e-04 -4.8291459018732613e-04 -1.0709636748495333e-02
+   18  7.5773135601624533e-04 -1.0604660666195195e-04 -2.9052190107973087e-02
+   19 -8.2398465651566956e-04 -5.1763577844063228e-04 -1.3883168800746705e-02
+   20 -2.6540769941738171e-04  1.4544086540562453e-03 -2.9616876954433820e-02
+   21  6.9059687932033500e-04 -6.1172176278914724e-04 -9.9930475935883847e-03
+   22  5.1903723762132471e-04 -1.5794695217515297e-04 -2.8872098166177262e-02
+   23 -1.2999619581249811e-03  5.3108588030229464e-04 -1.2422412311642437e-02
+   24 -3.2646002927880701e-04  1.5480656986689182e-03 -3.0724921923396969e-02
+   25 -4.4212417028449604e-04 -3.2702381810661659e-05  1.0257965385900172e-02
+   26  1.2029502887653701e-03 -6.6888137281991044e-04  3.1679674370803115e-02
+   27  1.1284078949731725e-03 -2.7744804554502567e-08  1.3174439787097793e-02
+   28 -7.2378810157200900e-04  2.4335522727010964e-04  2.9873966714653963e-02
+   29 -1.0532667049880620e-03  7.4516834828237087e-04  1.0732704837844071e-02
+   30  1.3915165126589146e-03 -1.4093630775334669e-03  3.0800252954615828e-02
+   31  1.5526924204556959e-03  3.4345958973841973e-04  1.3180996180850283e-02
+   32 -9.2849293773583576e-05 -3.6968402535136977e-04  3.0310755683442978e-02
+   33  7.8803390168056056e-04  6.3187665376786251e-04  1.1208481276473217e-02
+   34 -4.4157950916471657e-04 -5.9161318279014972e-05  3.0896928862652544e-02
+   35  1.4605341896907487e-06  5.5778782038553513e-04  1.0464193387876497e-02
+   36  7.5306447932736915e-04  6.4063420801843522e-04  2.9446521968998895e-02
+   37 -5.1528521366996614e-04  4.5022774275057587e-04  1.0102890474288698e-02
+   38 -2.3334594837893120e-04  5.5982996138683090e-04  2.9312847420603871e-02
+   39 -8.4030878956306652e-04 -8.2858897733969887e-04  9.9599841364338727e-03
+   40  3.1176074857063333e-04  1.5729382377064493e-04  2.9568116551467322e-02
+   41 -2.2702343316618858e-03 -1.0402600019059252e-04  1.2321255863902722e-02
+   42 -1.6832158820563115e-04 -3.1137531486982874e-04  3.0275446479194841e-02
+   43  5.5659858411658816e-05  1.9307504152509409e-04  1.1910098296920838e-02
+   44 -9.5047806768623015e-04 -6.2997063031185760e-05  3.0133790104729902e-02
+   45 -1.4273485464754289e-03 -8.2386789692773265e-04  1.1604494193079552e-02
+   46  3.2400797488582719e-04  2.8804516968589326e-05  2.9006167509805069e-02
+   47  4.4459915420986282e-04  2.0256445461834481e-04  1.0421995955857405e-02
+   48 -1.0286699191962320e-03 -1.5188666002277826e-03  3.1020493014426428e-02
+run_vdwl: -1.116583686929748
 run_coul: 0
 run_stress: ! |-
-  -6.9372331738514981e-01 -6.9064389597684106e-01  1.1514755915204005e+00  0.0000000000000000e+00  0.0000000000000000e+00 -1.4292266024218578e-02
+  -6.9202313126699333e-01 -6.8748607721639632e-01  1.1597991092003139e+00 -8.7520711561815342e-04 -7.4903484534890319e-03 -4.8017742857855358e-03
 run_forces: ! |2
-    1  1.4968783498999268e-03 -3.2942052376323016e-05 -1.3240066826206463e-02
-    2  8.0765258918550525e-04  1.0588876993623385e-03 -3.1122680612106914e-02
-    3 -3.4497601095719033e-04  3.4248722599748424e-05 -1.0175117216209249e-02
-    4 -2.4589406964898274e-04  1.8152777475380989e-05 -2.9694273916151235e-02
-    5  1.4968783498999624e-03 -3.2942052376244425e-05 -1.3240066826206844e-02
-    6  8.0765258918545808e-04  1.0588876993621239e-03 -3.1122680612107538e-02
-    7 -3.4497601095719900e-04  3.4248722599828465e-05 -1.0175117216209020e-02
-    8 -2.4589406964903478e-04  1.8152777475390449e-05 -2.9694273916151363e-02
-    9 -1.3423039571159017e-04  7.4352071961005858e-08 -1.0126910355491514e-02
-   10 -1.2282852371682442e-04 -5.3193547176900636e-06 -2.9856374341201718e-02
-   11  1.3420671579929917e-04  7.2436845184776077e-08 -1.0126969468728588e-02
-   12  1.2281830883230783e-04 -5.2995986749039537e-06 -2.9856399181457216e-02
-   13 -1.3423039571157673e-04  7.4352071584718248e-08 -1.0126910355491585e-02
-   14 -1.2282852371668521e-04 -5.3193547179922104e-06 -2.9856374341201371e-02
-   15  1.3420671579938970e-04  7.2436845150855372e-08 -1.0126969468727908e-02
-   16  1.2281830883232204e-04 -5.2995986749016624e-06 -2.9856399181457466e-02
-   17  3.4500925912102327e-04  3.4247474141055654e-05 -1.0175177303529336e-02
-   18  2.4591194664583894e-04  1.8173005537505662e-05 -2.9694296547973523e-02
-   19 -1.4968879181501723e-03 -3.2941385606868446e-05 -1.3240067800288987e-02
-   20 -8.0766025129906183e-04  1.0588881713794161e-03 -3.1122678403683279e-02
-   21  3.4500925912095290e-04  3.4247474141253548e-05 -1.0175177303529138e-02
-   22  2.4591194664620069e-04  1.8173005537513167e-05 -2.9694296547973627e-02
-   23 -1.4968879181501166e-03 -3.2941385606789733e-05 -1.3240067800288646e-02
-   24 -8.0766025129901347e-04  1.0588881713797244e-03 -3.1122678403683594e-02
-   25 -3.4497543410367832e-04 -3.4248542243049007e-05  1.0175095227569254e-02
-   26  8.0765525409005174e-04 -1.0588882853031821e-03  3.1122706902410268e-02
-   27  1.4968776819200879e-03  3.2942887158314040e-05  1.3240038417764373e-02
-   28 -2.4589307728119323e-04 -1.8153131107501511e-05  2.9694296702257997e-02
-   29 -3.4497543410356470e-04 -3.4248542242962311e-05  1.0175095227569283e-02
-   30  8.0765525408991665e-04 -1.0588882853032810e-03  3.1122706902410369e-02
-   31  1.4968776819200670e-03  3.2942887158584385e-05  1.3240038417764520e-02
-   32 -2.4589307728105619e-04 -1.8153131107580197e-05  2.9694296702258274e-02
-   33  1.3420649407712329e-04 -7.2457679971971299e-08  1.0126947778852728e-02
-   34 -1.2282857182875856e-04  5.3192999898934757e-06  2.9856397351700922e-02
-   35 -1.3423017399030691e-04 -7.4372916307303659e-08  1.0126888665729796e-02
-   36  1.2281835687551147e-04  5.2995439452943477e-06  2.9856422192021229e-02
-   37  1.3420649407688346e-04 -7.2457680016867857e-08  1.0126947778853273e-02
-   38 -1.2282857182861024e-04  5.3192999901346361e-06  2.9856397351700859e-02
-   39 -1.3423017399036286e-04 -7.4372916328267513e-08  1.0126888665730093e-02
-   40  1.2281835687550854e-04  5.2995439452834599e-06  2.9856422192021292e-02
-   41 -1.4968872501543050e-03  3.2942220392413755e-05  1.3240039391837519e-02
-   42  2.4591095432896623e-04 -1.8173359176526104e-05  2.9694319334136906e-02
-   43  3.4500868225182334e-04 -3.4247293770650532e-05  1.0175155314768796e-02
-   44 -8.0766291618553391e-04 -1.0588887573257195e-03  3.1122704693977713e-02
-   45 -1.4968872501544524e-03  3.2942220392554349e-05  1.3240039391837150e-02
-   46  2.4591095432885027e-04 -1.8173359176560751e-05  2.9694319334136628e-02
-   47  3.4500868225184405e-04 -3.4247293770696435e-05  1.0175155314768848e-02
-   48 -8.0766291618553099e-04 -1.0588887573256150e-03  3.1122704693978008e-02
+    1  1.4410673596325797e-03 -1.0169304521115965e-03 -1.4285401568186428e-02
+    2  3.4021335312064239e-04  1.2797191122651606e-03 -3.1897958840992731e-02
+    3 -2.6365414554435206e-04  2.0444568729883803e-04 -1.1309803039904094e-02
+    4  3.2406270803533865e-04 -4.6232160096735283e-04 -2.9909889579305883e-02
+    5  8.6243700250479213e-04  1.9924903099012974e-04 -1.2745204024321596e-02
+    6  5.1904688928447039e-04  1.1276312199052507e-03 -3.0822480729154136e-02
+    7 -1.6089060336456785e-04  1.4230793176456209e-04 -8.0115332340635770e-03
+    8 -4.5244256523595955e-04 -1.4652373014613116e-04 -3.0138640813371177e-02
+    9 -8.3793558681813027e-05 -4.1140467969865357e-04 -1.0951736791345751e-02
+   10  1.0558934928096841e-04  3.2337794650378108e-04 -3.0861548668457323e-02
+   11  6.9845541769924624e-05  1.7180670901979288e-05 -1.0563164513517073e-02
+   12 -8.0679481796061916e-04 -4.0664748662187143e-04 -2.9406560679161624e-02
+   13  4.1247302768956506e-04 -8.1126591131716001e-04 -1.1037106445845180e-02
+   14  2.3332396247183456e-04  5.5939100731725207e-04 -2.9697039899835066e-02
+   15 -4.4743716863518879e-04 -6.4402351400352417e-04 -1.0302248028000090e-02
+   16  1.0107676498898814e-04 -1.7601612323562735e-04 -3.0440160861088226e-02
+   17  7.8768398889356335e-04 -4.8290699580335434e-04 -1.0709307785601542e-02
+   18  7.5772587814272661e-04 -1.0604331840892354e-04 -2.9051355476222663e-02
+   19 -8.2396507652227567e-04 -5.1763481147044346e-04 -1.3882787481952484e-02
+   20 -2.6539902077711439e-04  1.4543922016699269e-03 -2.9616038510215568e-02
+   21  6.9059519132396775e-04 -6.1171669311730020e-04 -9.9927403128011426e-03
+   22  5.1903378657992805e-04 -1.5794713465069979e-04 -2.8871277173751864e-02
+   23 -1.2999304876387561e-03  5.3107732945463688e-04 -1.2422061766959291e-02
+   24 -3.2644539359692542e-04  1.5480516514320667e-03 -3.0724047265085791e-02
+   25 -4.4212891241347113e-04 -3.2697766181911145e-05  1.0257616370513183e-02
+   26  1.2029313214847238e-03 -6.6888291982682407e-04  3.1678775972923956e-02
+   27  1.1283890792386422e-03 -2.8542217957172600e-08  1.3174047524615399e-02
+   28 -7.2378412563897741e-04  2.4335495682349174e-04  2.9873149619175456e-02
+   29 -1.0532619377677580e-03  7.4515643613297378e-04  1.0732343526110863e-02
+   30  1.3914911640253280e-03 -1.4093576056224714e-03  3.0799402494171169e-02
+   31  1.5526628138436077e-03  3.4346152193312973e-04  1.3180608561349179e-02
+   32 -9.2853455508014825e-05 -3.6966978881082394e-04  3.0309911553159243e-02
+   33  7.8802353059772515e-04  6.3186818726301624e-04  1.1208113889006823e-02
+   34 -4.4157767037679690e-04 -5.9159130843379026e-05  3.0896068470685031e-02
+   35  1.4552473121265397e-06  5.5777693731219765e-04  1.0463857570582444e-02
+   36  7.5305807476735965e-04  6.4063119252587969e-04  2.9445714727166269e-02
+   37 -5.1527886711158206e-04  4.5022029011034236e-04  1.0102553591648427e-02
+   38 -2.3334071714133271e-04  5.5981947321851779e-04  2.9312019903716846e-02
+   39 -8.4029973392166224e-04 -8.2857530655882402e-04  9.9596391825485173e-03
+   40  3.1175727776466388e-04  1.5729483520098114e-04  2.9567298942710162e-02
+   41 -2.2701903109886260e-03 -1.0402124774515768e-04  1.2320885381156934e-02
+   42 -1.6831498396996131e-04 -3.1136792853859915e-04  3.0274601848989606e-02
+   43  5.5664724581996916e-05  1.9307476178885243e-04  1.1909723052594356e-02
+   44 -9.5046209166255765e-04 -6.3004473120715018e-05  3.0132966879057418e-02
+   45 -1.4273207846817208e-03 -8.2385448535969076e-04  1.1604140080847982e-02
+   46  3.2400780661911109e-04  2.8806285981541469e-05  2.9005364916792991e-02
+   47  4.4459996506777412e-04  2.0256574589517135e-04  1.0421645129745381e-02
+   48 -1.0286493798823708e-03 -1.5188527673106898e-03  3.1019644299872643e-02
 ...
diff --git a/unittest/force-styles/tests/manybody-pair-drip_real.yaml b/unittest/force-styles/tests/manybody-pair-drip_real.yaml
index 3f680a8c96..bec2fb5f7b 100644
--- a/unittest/force-styles/tests/manybody-pair-drip_real.yaml
+++ b/unittest/force-styles/tests/manybody-pair-drip_real.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:48 2021
-epsilon: 1e-13
+date_generated: Tue Aug 24 15:36:41 2021
+epsilon: 5e-13
 skip_tests: single
 prerequisites: ! |
   pair drip
@@ -17,110 +17,110 @@ pair_coeff: ! |
   * * drip C.drip C C C
 extract: ! ""
 natoms: 48
-init_vdwl: -25.761080947558458
+init_vdwl: -25.748994587923356
 init_coul: 0
 init_stress: ! |-
-  -1.5997575514840701e+01 -1.5926563655516432e+01  2.6554761026958538e+01  0.0000000000000000e+00  0.0000000000000000e+00 -3.2959106617730394e-01
+  -1.5958367897725125e+01 -1.5853741555387963e+01  2.6746706531539260e+01 -2.0182643763721416e-02 -1.7273335487108957e-01 -1.1073303196221104e-01
 init_forces: ! |2
-    1  3.4519525887018621e-02 -7.5961070769214878e-04 -3.0533160468170939e-01
-    2  1.8625356800076362e-02  2.4418650819961668e-02 -7.1772653472282411e-01
-    3 -7.9552206156518063e-03  7.8979719442743949e-04 -2.3465116711459008e-01
-    4 -5.6703944262123662e-03  4.1870221465274693e-04 -6.8478588954553776e-01
-    5  3.4519525887018870e-02 -7.5961070769172225e-04 -3.0533160468171572e-01
-    6  1.8625356800076116e-02  2.4418650819952412e-02 -7.1772653472282877e-01
-    7 -7.9552206156503213e-03  7.8979719443244851e-04 -2.3465116711458173e-01
-    8 -5.6703944262118111e-03  4.1870221465155517e-04 -6.8478588954554198e-01
-    9 -3.0954209054540674e-03  1.7176766023297568e-06 -2.3353949053792569e-01
-   10 -2.8325224362034315e-03 -1.2263401010803219e-04 -6.8852392802545803e-01
-   11  3.0948748188155822e-03  1.6735115258234307e-06 -2.3354085374002706e-01
-   12  2.8322868660610179e-03 -1.2217842468890391e-04 -6.8852450086990813e-01
-   13 -3.0954209054540466e-03  1.7176766026706842e-06 -2.3353949053793166e-01
-   14 -2.8325224362032025e-03 -1.2263401011821111e-04 -6.8852392802545703e-01
-   15  3.0948748188158390e-03  1.6735115316409009e-06 -2.3354085374002267e-01
-   16  2.8322868660610422e-03 -1.2217842468845727e-04 -6.8852450086991235e-01
-   17  7.9559873492091142e-03  7.8976840530281534e-04 -2.3465255277912508e-01
-   18  5.6708066884776521e-03  4.1916868608569068e-04 -6.8478641146338481e-01
-   19 -3.4519746533893940e-02 -7.5959533171951130e-04 -3.0533162714402262e-01
-   20 -1.8625533492238975e-02  2.4418661705949665e-02 -7.1772648379643234e-01
-   21  7.9559873492090170e-03  7.8976840530288451e-04 -2.3465255277913122e-01
-   22  5.6708066884775948e-03  4.1916868607656490e-04 -6.8478641146338504e-01
-   23 -3.4519746533890970e-02 -7.5959533171988253e-04 -3.0533162714401807e-01
-   24 -1.8625533492239343e-02  2.4418661705949762e-02 -7.1772648379643167e-01
-   25 -7.9552206156520144e-03 -7.8979719442783024e-04  2.3465116711458947e-01
-   26  1.8625356800076404e-02 -2.4418650819961502e-02  7.1772653472282488e-01
-   27  3.4519525887014679e-02  7.5961070768970737e-04  3.0533160468170817e-01
-   28 -5.6703944262120054e-03 -4.1870221465108506e-04  6.8478588954553898e-01
-   29 -7.9552206156520144e-03 -7.8979719443283481e-04  2.3465116711458581e-01
-   30  1.8625356800069229e-02 -2.4418650819957533e-02  7.1772653472281345e-01
-   31  3.4519525887018704e-02  7.5961070770124480e-04  3.0533160468171566e-01
-   32 -5.6703944262122274e-03 -4.1870221465243294e-04  6.8478588954554442e-01
-   33  3.0948748188157731e-03 -1.6735115261055401e-06  2.3354085374002662e-01
-   34 -2.8325224362035009e-03  1.2263401010814570e-04  6.8852392802545770e-01
-   35 -3.0954209054540674e-03 -1.7176766021075496e-06  2.3353949053792544e-01
-   36  2.8322868660609277e-03  1.2217842468872730e-04  6.8852450086991090e-01
-   37  3.0948748188157002e-03 -1.6735115312395288e-06  2.3354085374002845e-01
-   38 -2.8325224362050205e-03  1.2263401010865604e-04  6.8852392802544404e-01
-   39 -3.0954209054541784e-03 -1.7176765926834780e-06  2.3353949053792869e-01
-   40  2.8322868660613752e-03  1.2217842468919974e-04  6.8852450086991468e-01
-   41 -3.4519746533897999e-02  7.5959533172142307e-04  3.0533162714402334e-01
-   42  5.6708066884776503e-03 -4.1916868608571941e-04  6.8478641146338692e-01
-   43  7.9559873492091281e-03 -7.8976840530235466e-04  2.3465255277912495e-01
-   44 -1.8625533492239322e-02 -2.4418661705950095e-02  7.1772648379643567e-01
-   45 -3.4519746533897937e-02  7.5959533171621586e-04  3.0533162714402778e-01
-   46  5.6708066884779687e-03 -4.1916868608703228e-04  6.8478641146337782e-01
-   47  7.9559873492089893e-03 -7.8976840529313373e-04  2.3465255277912772e-01
-   48 -1.8625533492239322e-02 -2.4418661705950414e-02  7.1772648379643678e-01
-run_vdwl: -25.76108094759681
+    1  3.3232466674277615e-02 -2.3451179736789157e-02 -3.2943817073564596e-01
+    2  7.8458173878729071e-03  2.9511202104489435e-02 -7.3560573831413523e-01
+    3 -6.0799591615661869e-03  4.7146500253728817e-03 -2.6081807759988473e-01
+    4  7.4732440639032616e-03 -1.0661483718349234e-02 -6.8975800835334788e-01
+    5  1.9888708843808861e-02  4.5949432971171935e-03 -2.9391954162471828e-01
+    6  1.1969798109566981e-02  2.6003842953487285e-02 -7.1080353286982367e-01
+    7 -3.7100300373209133e-03  3.2816614283510343e-03 -1.8475684426062652e-01
+    8 -1.0433561414439643e-02 -3.3788453204195538e-03 -6.9503354402692197e-01
+    9 -1.9323321076154532e-03 -9.4873427029657786e-03 -2.5256081806220482e-01
+   10  2.4349115893603085e-03  7.4574036331723059e-03 -7.1170468398617626e-01
+   11  1.6106962040949510e-03  3.9620993993718555e-04 -2.4359993027492452e-01
+   12 -1.8605405024419774e-02 -9.3775207894519329e-03 -6.7815070838926095e-01
+   13  9.5120361230222328e-03 -1.8708369310438993e-02 -2.5452955655358278e-01
+   14  5.3806796227059278e-03  1.2900077833906291e-02 -6.8484960844854192e-01
+   15 -1.0318274217856395e-02 -1.4851716204061447e-02 -2.3758293552022253e-01
+   16  2.3309320566716786e-03 -4.0590586632136055e-03 -7.0198669220376253e-01
+   17  1.8164413663677100e-02 -1.1136275569829808e-02 -2.4697010301087788e-01
+   18  1.7473701064249236e-02 -2.4454929692114937e-03 -6.6995945354222997e-01
+   19 -1.9001538546827838e-02 -1.1936965232883413e-02 -3.2015349440489077e-01
+   20 -6.1204472573920671e-03  3.3539462032888240e-02 -6.8298144223469248e-01
+   21  1.5925543174813862e-02 -1.4106639685165670e-02 -2.3044516369127779e-01
+   22  1.1969283650991303e-02 -3.6423434300359558e-03 -6.6580643449394206e-01
+   23 -2.9977836433477532e-02  1.2247131965919100e-02 -2.8646764781083356e-01
+   24 -7.5283475017253083e-03  3.5699244899373796e-02 -7.0853356753567021e-01
+   25 -1.0195626092930038e-02 -7.5413487816127639e-04  2.3655431342185476e-01
+   26  2.7740694078638165e-02 -1.5424771673100995e-02  7.3055068313195015e-01
+   27  2.6021705554016006e-02 -6.3981042505711905e-07  3.0380981425791853e-01
+   28 -1.6690950981918112e-02  5.6119051428686253e-03  6.8891007324764719e-01
+   29 -2.4288908460445822e-02  1.7183991208814628e-02  2.4750206581563999e-01
+   30  3.2089134724480099e-02 -3.2500686308251155e-02  7.1027074247231392e-01
+   31  3.5805939643847373e-02  7.9203666986826932e-03  3.0396100829731115e-01
+   32 -2.1411556886809409e-03 -8.5251165811325441e-03  6.9898266666506625e-01
+   33  1.8172494403365477e-02  1.4571422536169575e-02  2.5847373169169469e-01
+   34 -1.0183065908488859e-02 -1.3642924790778152e-03  7.1250014198671274e-01
+   35  3.3680720247508678e-05  1.2862893363603918e-02  2.4131004436660192e-01
+   36  1.7366080325688205e-02  1.4773376545085223e-02  6.7905296274567539e-01
+   37 -1.1882759918811714e-02  1.0382498922859170e-02  2.3297820082396822e-01
+   38 -5.3810856765438425e-03  1.2909986256228958e-02  6.7597035427235896e-01
+   39 -1.9377982016849454e-02 -1.9107716712801780e-02  2.2968270221745701e-01
+   40  7.1893740186897287e-03  3.6272819304602882e-03  6.8185700057282317e-01
+   41 -5.2352850046770774e-02 -2.3988966746689333e-03  2.8413492459106704e-01
+   42 -3.8815882325739948e-03 -7.1804857059461717e-03  6.9816841703034993e-01
+   43  1.2835468922352423e-03  4.4524164557667254e-03  2.7465340537095984e-01
+   44 -2.1918546053303713e-02 -1.4527468588869409e-03  6.9490174326583898e-01
+   45 -3.2915441096075387e-02 -1.8998846006629343e-02  2.6760600695972642e-01
+   46  7.4718017812452665e-03  6.6424797497523528e-04  6.6889814716206641e-01
+   47  1.0252700581015179e-02  4.6712475313845240e-03  2.4033694841785191e-01
+   48 -2.3721693076450560e-02 -3.5025897659015641e-02  7.1534959916333785e-01
+run_vdwl: -25.748994587961594
 run_coul: 0
 run_stress: ! |-
-  -1.5997575514905400e+01 -1.5926563655580109e+01  2.6554761025857829e+01  0.0000000000000000e+00  0.0000000000000000e+00 -3.2959106617393824e-01
+  -1.5958367897790582e+01 -1.5853741555452789e+01  2.6746706530436910e+01 -2.0182643763822727e-02 -1.7273335486937064e-01 -1.1073303196070017e-01
 run_forces: ! |2
-    1  3.4519525886308772e-02 -7.5961070774262620e-04 -3.0533160467333686e-01
-    2  1.8625356799616053e-02  2.4418650819844623e-02 -7.1772653470240710e-01
-    3 -7.9552206157541827e-03  7.8979719442180435e-04 -2.3465116710721118e-01
-    4 -5.6703944262564421e-03  4.1870221456883055e-04 -6.8478588952590880e-01
-    5  3.4519525886310021e-02 -7.5961070774873795e-04 -3.0533160467333753e-01
-    6  1.8625356799618166e-02  2.4418650819839099e-02 -7.1772653470240300e-01
-    7 -7.9552206157587901e-03  7.8979719441955800e-04 -2.3465116710720937e-01
-    8 -5.6703944262596895e-03  4.1870221457031374e-04 -6.8478588952590624e-01
-    9 -3.0954209054729134e-03  1.7176766005387110e-06 -2.3353949053056158e-01
-   10 -2.8325224361802070e-03 -1.2263401013539680e-04 -6.8852392800592355e-01
-   11  3.0948748188260634e-03  1.6735115258329308e-06 -2.3354085373267006e-01
-   12  2.8322868660322353e-03 -1.2217842471453093e-04 -6.8852450085037853e-01
-   13 -3.0954209054753073e-03  1.7176766069530950e-06 -2.3353949053056008e-01
-   14 -2.8325224361808454e-03 -1.2263401013228948e-04 -6.8852392800592477e-01
-   15  3.0948748188205331e-03  1.6735115311816390e-06 -2.3354085373266414e-01
-   16  2.8322868660327627e-03 -1.2217842471338395e-04 -6.8852450085039274e-01
-   17  7.9559873493214514e-03  7.8976840529372907e-04 -2.3465255277175306e-01
-   18  5.6708066885325613e-03  4.1916868600858607e-04 -6.8478641144376085e-01
-   19 -3.4519746533186305e-02 -7.5959533177047444e-04 -3.0533162713566037e-01
-   20 -1.8625533491780335e-02  2.4418661705826062e-02 -7.1772648377602155e-01
-   21  7.9559873493208408e-03  7.8976840529406105e-04 -2.3465255277176264e-01
-   22  5.6708066885322672e-03  4.1916868600612250e-04 -6.8478641144375973e-01
-   23 -3.4519746533190690e-02 -7.5959533177689758e-04 -3.0533162713565520e-01
-   24 -1.8625533491779738e-02  2.4418661705826118e-02 -7.1772648377601034e-01
-   25 -7.9552206157391669e-03 -7.8979719442920414e-04  2.3465116710670758e-01
-   26  1.8625356799678291e-02 -2.4418650819855600e-02  7.1772653470301284e-01
-   27  3.4519525886291424e-02  7.5961070776537666e-04  3.0533160467268600e-01
-   28 -5.6703944262409822e-03 -4.1870221457090788e-04  6.8478588952643626e-01
-   29 -7.9552206157410682e-03 -7.8979719442770382e-04  2.3465116710671441e-01
-   30  1.8625356799682243e-02 -2.4418650819853061e-02  7.1772653470300518e-01
-   31  3.4519525886292479e-02  7.5961070776900104e-04  3.0533160467267750e-01
-   32 -5.6703944262390393e-03 -4.1870221457093217e-04  6.8478588952643404e-01
-   33  3.0948748188169527e-03 -1.6735115285445503e-06  2.3354085373217337e-01
-   34 -2.8325224361862578e-03  1.2263401013536189e-04  6.8852392800645301e-01
-   35 -3.0954209054732881e-03 -1.7176766016382667e-06  2.3353949053006548e-01
-   36  2.8322868660402949e-03  1.2217842471530459e-04  6.8852450085089545e-01
-   37  3.0948748188168972e-03 -1.6735115254575963e-06  2.3354085373216871e-01
-   38 -2.8325224361834475e-03  1.2263401013282052e-04  6.8852392800645179e-01
-   39 -3.0954209054684656e-03 -1.7176766061726881e-06  2.3353949053006878e-01
-   40  2.8322868660383624e-03  1.2217842471120666e-04  6.8852450085090100e-01
-   41 -3.4519746533171393e-02  7.5959533179549132e-04  3.0533162713500450e-01
-   42  5.6708066885105355e-03 -4.1916868600979897e-04  6.8478641144428143e-01
-   43  7.9559873493117838e-03 -7.8976840530148860e-04  2.3465255277124522e-01
-   44 -1.8625533491841401e-02 -2.4418661705844322e-02  7.1772648377662540e-01
-   45 -3.4519746533172420e-02  7.5959533179765766e-04  3.0533162713500039e-01
-   46  5.6708066885161846e-03 -4.1916868600924408e-04  6.8478641144429175e-01
-   47  7.9559873493104671e-03 -7.8976840529732212e-04  2.3465255277125016e-01
-   48 -1.8625533491844991e-02 -2.4418661705839853e-02  7.1772648377662085e-01
+    1  3.3232466673603925e-02 -2.3451179736581364e-02 -3.2943817072666159e-01
+    2  7.8458173875610767e-03  2.9511202104307844e-02 -7.3560573829285403e-01
+    3 -6.0799591616052390e-03  4.7146500253611758e-03 -2.6081807759204945e-01
+    4  7.4732440637195474e-03 -1.0661483718244682e-02 -6.8975800833382717e-01
+    5  1.9888708843375319e-02  4.5949432969627276e-03 -2.9391954161659561e-01
+    6  1.1969798109273027e-02  2.6003842953440198e-02 -7.1080353284963105e-01
+    7 -3.7100300375245698e-03  3.2816614283844234e-03 -1.8475684425413691e-01
+    8 -1.0433561414444806e-02 -3.3788453204890486e-03 -6.9503354400697570e-01
+    9 -1.9323321076097494e-03 -9.4873427028344722e-03 -2.5256081805444464e-01
+   10  2.4349115894006096e-03  7.4574036330466607e-03 -7.1170468396575204e-01
+   11  1.6106962040720110e-03  3.9620993991182238e-04 -2.4359993026735374e-01
+   12 -1.8605405024143186e-02 -9.3775207894465605e-03 -6.7815070836997315e-01
+   13  9.5120361228382758e-03 -1.8708369310301523e-02 -2.5452955654576032e-01
+   14  5.3806796226078812e-03  1.2900077833684159e-02 -6.8484960842898190e-01
+   15 -1.0318274217731294e-02 -1.4851716203887599e-02 -2.3758293551278534e-01
+   16  2.3309320566239217e-03 -4.0590586631889629e-03 -7.0198669218388887e-01
+   17  1.8164413663688182e-02 -1.1136275569662546e-02 -2.4697010300330244e-01
+   18  1.7473701064127156e-02 -2.4454929691368607e-03 -6.6995945352296271e-01
+   19 -1.9001538546371412e-02 -1.1936965232863280e-02 -3.2015349439609270e-01
+   20 -6.1204472571880350e-03  3.3539462032504894e-02 -6.8298144221533896e-01
+   21  1.5925543174786588e-02 -1.4106639685039014e-02 -2.3044516368419699e-01
+   22  1.1969283650911211e-02 -3.6423434300448931e-03 -6.6580643447502708e-01
+   23 -2.9977836432749601e-02  1.2247131965719723e-02 -2.8646764780275830e-01
+   24 -7.5283475013889463e-03  3.5699244899051213e-02 -7.0853356751550400e-01
+   25 -1.0195626093040311e-02 -7.5413487806321768e-04  2.3655431341379374e-01
+   26  2.7740694078188643e-02 -1.5424771673140200e-02  7.3055068311122062e-01
+   27  2.6021705553580521e-02 -6.3981043668670523e-07  3.0380981424887532e-01
+   28 -1.6690950981827740e-02  5.6119051428654473e-03  6.8891007322881070e-01
+   29 -2.4288908460331618e-02  1.7183991208536684e-02  2.4750206580730749e-01
+   30  3.2089134723898072e-02 -3.2500686308123847e-02  7.1027074245271349e-01
+   31  3.5805939643156814e-02  7.9203666987223836e-03  3.0396100828839323e-01
+   32 -2.1411556887768191e-03 -8.5251165808079149e-03  6.9898266664559761e-01
+   33  1.8172494403130901e-02  1.4571422535984015e-02  2.5847373168321763e-01
+   34 -1.0183065908438912e-02 -1.3642924790249356e-03  7.1250014196684597e-01
+   35  3.3680720125689456e-05  1.2862893363347519e-02  2.4131004435885933e-01
+   36  1.7366080325535500e-02  1.4773376545013242e-02  6.7905296272705584e-01
+   37 -1.1882759918671326e-02  1.0382498922691556e-02  2.3297820081621270e-01
+   38 -5.3810856764184706e-03  1.2909986255981252e-02  6.7597035425328478e-01
+   39 -1.9377982016639442e-02 -1.9107716712486199e-02  2.2968270220950934e-01
+   40  7.1893740186104935e-03  3.6272819304872779e-03  6.8185700055396836e-01
+   41 -5.2352850045758140e-02 -2.3988966745579934e-03  2.8413492458254475e-01
+   42 -3.8815882324230670e-03 -7.1804857057699081e-03  6.9816841701089072e-01
+   43  1.2835468923389926e-03  4.4524164557554063e-03  2.7465340536230420e-01
+   44 -2.1918546052938477e-02 -1.4527468590590654e-03  6.9490174324682552e-01
+   45 -3.2915441095437911e-02 -1.8998846006314036e-02  2.6760600695155001e-01
+   46  7.4718017812403677e-03  6.6424797501287390e-04  6.6889814714355988e-01
+   47  1.0252700581037237e-02  4.6712475314227018e-03  2.4033694840974448e-01
+   48 -2.3721693075972734e-02 -3.5025897658690686e-02  7.1534959914376572e-01
 ...
diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
index 81f72ec0a9..442761256a 100644
--- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
+++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
@@ -1,6 +1,6 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:49 2021
+date_generated: Tue Aug 24 15:36:42 2021
 epsilon: 5e-12
 skip_tests: single
 prerequisites: ! |
@@ -16,110 +16,110 @@ pair_coeff: ! |
   * * ilp/graphene/hbn BNCH.ILP B N C
 extract: ! ""
 natoms: 48
-init_vdwl: -1.387500902597699
+init_vdwl: -1.38586930540158
 init_coul: 0
 init_stress: ! |-
-  -1.0950745163741815e+00 -1.0965448791525116e+00 -5.5691185658268150e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.1949269093120441e-03
+  -1.0930001998423704e+00 -1.0932039710097909e+00 -5.4519530849503672e-01 -2.5389316033816024e-03 -8.2572847962160655e-03  1.5729186460755471e-02
 init_forces: ! |2
-    1  2.0033364707962020e-03  3.2526065174565133e-18 -4.7626541030897668e-02
-    2 -1.1368359972830505e-05  9.1814113875668727e-05  4.2488212564737199e-02
-    3 -5.5278100417535583e-05 -1.1058862159352145e-17 -4.4732824814754067e-02
-    4 -2.3915922842134181e-04  2.2249364734195330e-06  4.0890453270282665e-02
-    5  2.0033364707962020e-03  4.1199682554449168e-18 -4.7626541030897619e-02
-    6 -1.1368359972813158e-05  9.1814113875680762e-05  4.2488212564737102e-02
-    7 -5.5278100417523006e-05 -3.7404974950749903e-17 -4.4732824814753921e-02
-    8 -2.3915922842133140e-04  2.2249364733897175e-06  4.0890453270282998e-02
-    9 -5.2020828171993284e-05 -2.0193265462542520e-18 -4.4737801821738435e-02
-   10 -1.2511640292790002e-04 -4.3335410390344704e-06  4.1581628715790360e-02
-   11  5.1983198952135928e-05 -1.1150341717655610e-17 -4.4737856331164172e-02
-   12  1.2512171341779051e-04 -4.3318158884542686e-06  4.1581659199143604e-02
-   13 -5.2020828171995019e-05 -1.0299920638612292e-18 -4.4737801821738400e-02
-   14 -1.2511640292792257e-04 -4.3335410390036926e-06  4.1581628715790221e-02
-   15  5.1983198952134085e-05 -2.2639496614212939e-17 -4.4737856331164047e-02
-   16  1.2512171341781285e-04 -4.3318158884359524e-06  4.1581659199143896e-02
-   17  5.5317942397928804e-05 -1.3694193416497087e-17 -4.4732879184470137e-02
-   18  2.3916128102602216e-04  2.2268062502434974e-06  4.0890470745578923e-02
-   19 -2.0033386835566994e-03  5.0537162006743762e-18 -4.7626540891187855e-02
-   20  1.1360996878247132e-05  9.1814258501936069e-05  4.2488199556680040e-02
-   21  5.5317942397930972e-05  2.0466433588032032e-18 -4.4732879184470033e-02
-   22  2.3916128102602656e-04  2.2268062502461309e-06  4.0890470745578937e-02
-   23 -2.0033386835567038e-03 -4.0058358597583202e-17 -4.7626540891187820e-02
-   24  1.1360996878233309e-05  9.1814258501946586e-05  4.2488199556680414e-02
-   25 -1.6486800709624230e-04 -1.8127313551345855e-05 -1.0796056549805585e-03
-   26  9.7415698381275641e-04 -8.3284301802344016e-04  5.3751455194570915e-03
-   27  1.0178111270105904e-03  7.4102890414775549e-04 -6.3746876686657586e-04
-   28 -1.2956932174262685e-04  1.5902377077926376e-05  5.3232551286718586e-03
-   29 -1.6486800709624447e-04 -1.8127313551316636e-05 -1.0796056549805698e-03
-   30  9.7415698381273170e-04 -8.3284301802343886e-04  5.3751455194570958e-03
-   31  1.0178111270106190e-03  7.4102890414773901e-04 -6.3746876686670770e-04
-   32 -1.2956932174261818e-04  1.5902377077917892e-05  5.3232551286718872e-03
-   33  9.2654152308404886e-05  4.0850279627708816e-06 -1.6053564303655610e-03
-   34 -8.4466761317455313e-05  2.6270005211736469e-07  4.7609191024683460e-03
-   35 -9.2670469782459453e-05  4.0708409869095536e-06 -1.6053645864696963e-03
-   36  8.4450760061533046e-05  2.4678792568258345e-07  4.7609196893467782e-03
-   37  9.2654152308405103e-05  4.0850279628000907e-06 -1.6053564303655061e-03
-   38 -8.4466761317482635e-05  2.6270005213547426e-07  4.7609191024683400e-03
-   39 -9.2670469782453165e-05  4.0708409868783421e-06 -1.6053645864697198e-03
-   40  8.4450760061528275e-05  2.4678792566386402e-07  4.7609196893469690e-03
-   41 -1.0178163233209149e-03  7.4102846801620556e-04 -6.3745882808595152e-04
-   42  1.2958970254336804e-04  1.5886756456806513e-05  5.3232663025057810e-03
-   43  1.6488952088059271e-04 -1.8113562707041957e-05 -1.0795875600957813e-03
-   44 -9.7416136335758238e-04 -8.3284272651813762e-04  5.3751561064124811e-03
-   45 -1.0178163233209125e-03  7.4102846801622031e-04 -6.3745882808583789e-04
-   46  1.2958970254337579e-04  1.5886756456791148e-05  5.3232663025058772e-03
-   47  1.6488952088058748e-04 -1.8113562707049496e-05 -1.0795875600958203e-03
-   48 -9.7416136335759366e-04 -8.3284272651814803e-04  5.3751561064124855e-03
-run_vdwl: -1.3875037702379507
+    1  2.4610339078490156e-03 -8.0941385855730190e-04 -4.8326320178295704e-02
+    2 -7.6823457808184028e-05  1.2178164101129890e-04  4.0491563547179248e-02
+    3 -2.7989019303446697e-04 -4.2818591562088177e-04 -4.5665324303695104e-02
+    4 -1.4655567762950333e-04 -8.6680976002445587e-05  4.2136499393241260e-02
+    5  1.6314412126618326e-03  7.5110836700830776e-04 -4.6536568012388584e-02
+    6 -8.8332355467278029e-05  7.5115350335386150e-05  4.2128877215948171e-02
+    7  3.1198948690565895e-04 -3.3541388806001166e-04 -4.2495615365868149e-02
+    8 -2.1805348015989552e-04 -1.3826488757541857e-05  4.0578899191401174e-02
+    9 -4.4904512524362701e-05 -4.1154090129608741e-04 -4.5855565210911935e-02
+   10 -1.2323451051768179e-04  8.6264442684110871e-05  4.0668676624147859e-02
+   11 -1.0854434805428821e-04 -3.7090492506527267e-04 -4.5942449788609993e-02
+   12  4.6983227876560727e-05 -5.2640770951859743e-06  4.1217227427237428e-02
+   13  6.2620754206681064e-04 -4.4911660756678990e-04 -4.5820603084748390e-02
+   14 -3.5471628020556159e-05  6.0296576111739782e-05  4.0459297609754974e-02
+   15 -6.4693600870479543e-04 -9.2841742831606920e-04 -4.4974490674305451e-02
+   16  1.3091534548570136e-05  6.5568167095355679e-06  4.1412981663374780e-02
+   17  3.5154915181880703e-04 -1.1634457578910866e-03 -4.5343907116033116e-02
+   18  3.5988934248684066e-04 -1.9967020478526597e-05  4.2526080539534605e-02
+   19 -5.1060958159006851e-04 -6.5235063390981158e-04 -4.9165535254196160e-02
+   20  8.3862359922141791e-05  1.8418236907131663e-04  4.4009996268400277e-02
+   21  2.7114492988966756e-04 -1.0607028804670161e-03 -4.3924470701810402e-02
+   22  2.5537051199923667e-04 -9.8456498670628683e-05  4.2964910239546426e-02
+   23 -1.7689370446294437e-03  6.9490491450984154e-04 -4.7088542968708194e-02
+   24  1.0581657686660245e-04  1.2486032149241973e-04  4.1999455527881133e-02
+   25 -5.8076747055472826e-04  2.0877090146123080e-04 -7.1819543429712997e-04
+   26  1.0058553084468674e-03 -2.7830702485256119e-04  7.6613217224462387e-03
+   27  6.8107690004202449e-04  1.0764595573614904e-04 -2.8530069000922906e-04
+   28 -4.9687080543206474e-04  4.6141640541676795e-04  3.6147002799277426e-03
+   29 -7.3540356657639467e-04  9.9589268765556765e-04 -3.2018443040131468e-04
+   30  1.4169363539265211e-03 -1.1084987800204032e-03  5.2281223130184844e-03
+   31  9.6010838366544608e-04  9.4102147965306401e-04 -1.6078876173775368e-03
+   32 -3.4281227905939068e-05 -1.0944024974507546e-04  5.6563897988656919e-03
+   33  3.7576300426288550e-05  5.7279170049296399e-04  1.9395320057938748e-04
+   34 -1.5735822500533968e-04  5.0778670318717329e-06  5.8734806295344310e-03
+   35  1.0275939445448298e-04  5.4063092113845333e-06 -1.3717905360514479e-03
+   36  7.0175855099543702e-04  6.8891472849395927e-04  3.8597118791517831e-03
+   37 -4.3947158571972661e-04  3.7526900909219170e-04 -1.7336967954020652e-03
+   38 -1.2587448373275328e-04  5.4296662277744255e-04  5.9243764669461383e-03
+   39 -5.7206916834739649e-04 -6.4282692313546411e-04 -2.4614647452408890e-03
+   40  2.8775914220648428e-04  4.1508757889834963e-04  3.6588005827141844e-03
+   41 -1.1942380066354095e-03  1.2095128528955136e-03 -2.0148238613329496e-03
+   42 -3.1598596308341767e-04  6.4011884378217544e-05  7.1660415833885143e-03
+   43 -3.8041449696108674e-04  5.9236844564084824e-04  4.6350641626885617e-04
+   44 -1.2292721527122721e-03 -1.3107003812311478e-04  4.2826039565963892e-03
+   45 -7.0593613957831982e-04  2.2874145949107236e-04 -2.3918845050906030e-03
+   46  1.7489891034240860e-04  3.7341072873999420e-04  4.4219325077152769e-03
+   47  4.1892602604155088e-04  5.9153899601868795e-04  5.3104446221308328e-04
+   48 -1.2897989650539343e-03 -1.3810855383878410e-03  4.9141702277601985e-03
+run_vdwl: -1.385872195382714
 run_coul: 0
 run_stress: ! |-
-  -1.0950798483072388e+00 -1.0965501776879543e+00 -5.5691866561084535e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.1949322419481606e-03
+  -1.0930055687255709e+00 -1.0932093234223756e+00 -5.4520237057596543e-01 -2.5389055976560446e-03 -8.2571965021650887e-03  1.5728975928521384e-02
 run_forces: ! |2
-    1  2.0033030003525137e-03  8.9435705391029130e-10 -4.7625968392020532e-02
-    2 -1.1367384359795837e-05  9.1815719224718032e-05  4.2487909883465465e-02
-    3 -5.5282089115551557e-05 -2.6135646989168017e-09 -4.4732313434801885e-02
-    4 -2.3915909829547773e-04  2.2249799837368439e-06  4.0890200928313990e-02
-    5  2.0033030003524860e-03  8.9435706106602564e-10 -4.7625968392020428e-02
-    6 -1.1367384359823613e-05  9.1815719224701660e-05  4.2487909883465430e-02
-    7 -5.5282089115578446e-05 -2.6135647671131183e-09 -4.4732313434801836e-02
-    8 -2.3915909829547773e-04  2.2249799837172199e-06  4.0890200928314566e-02
-    9 -5.2020641072548406e-05  6.7005638625767475e-10 -4.4737290402994602e-02
-   10 -1.2511670468712049e-04 -4.3337535831548628e-06  4.1581350530843775e-02
-   11  5.1983012539478048e-05  6.7012239660759799e-10 -4.4737344911317957e-02
-   12  1.2512201515433533e-04 -4.3320284013805789e-06  4.1581381013272169e-02
-   13 -5.2020641072554044e-05  6.7005629369391428e-10 -4.4737290402994609e-02
-   14 -1.2511670468714348e-04 -4.3337535831713291e-06  4.1581350530843830e-02
-   15  5.1983012539505370e-05  6.7012235105247202e-10 -4.4737344911317853e-02
-   16  1.2512201515432167e-04 -4.3320284013572685e-06  4.1581381013272294e-02
-   17  5.5321930482132663e-05 -2.6135608037222913e-09 -4.4732367803430914e-02
-   18  2.3916115092586794e-04  2.2268497947506605e-06  4.0890218403155591e-02
-   19 -2.0033052131855867e-03  8.9429471662265853e-10 -4.7625968252325866e-02
-   20  1.1360021262163687e-05  9.1815863853997803e-05  4.2487896875878589e-02
-   21  5.5321930482154889e-05 -2.6135608655374853e-09 -4.4732367803430817e-02
-   22  2.3916115092584907e-04  2.2268497947312516e-06  4.0890218403155654e-02
-   23 -2.0033052131855616e-03  8.9429479706876566e-10 -4.7625968252325804e-02
-   24  1.1360021262174096e-05  9.1815863853997342e-05  4.2487896875878825e-02
-   25 -1.6486945106528091e-04 -1.8126101379958718e-05 -1.0797429438547676e-03
-   26  9.7414016722233848e-04 -8.3283489942476445e-04  5.3750161101709729e-03
-   27  1.0177937442917731e-03  7.4101905540415944e-04 -6.3761022896437550e-04
-   28 -1.2957001720401498e-04  1.5902818724243767e-05  5.3231291183569798e-03
-   29 -1.6486945106529950e-04 -1.8126101379940937e-05 -1.0797429438548231e-03
-   30  9.7414016722235670e-04 -8.3283489942476228e-04  5.3750161101709625e-03
-   31  1.0177937442917692e-03  7.4101905540416161e-04 -6.3761022896433907e-04
-   32 -1.2957001720399937e-04  1.5902818724231570e-05  5.3231291183569417e-03
-   33  9.2652190820307180e-05  4.0847599754035413e-06 -1.6054772616410785e-03
-   34 -8.4465929960344556e-05  2.6265700116475746e-07  4.7608118750052195e-03
-   35 -9.2668507953961839e-05  4.0705731901608693e-06 -1.6054854176848882e-03
-   36  8.4449929025630626e-05  2.4674500177709956e-07  4.7608124618308432e-03
-   37  9.2652190820296772e-05  4.0847599754594472e-06 -1.6054772616411949e-03
-   38 -8.4465929960378383e-05  2.6265700123594889e-07  4.7608118750052542e-03
-   39 -9.2668507953971814e-05  4.0705731901478047e-06 -1.6054854176848756e-03
-   40  8.4449929025618483e-05  2.4674500176496539e-07  4.7608124618310956e-03
-   41 -1.0177989405882203e-03  7.4101861929748436e-04 -6.3760029049130570e-04
-   42  1.2959039767826896e-04  1.5887198241880077e-05  5.3231402917910302e-03
-   43  1.6489096449514255e-04 -1.8112350701529705e-05 -1.0797248493375658e-03
-   44 -9.7414454676205060e-04 -8.3283460790769116e-04  5.3750266967793276e-03
-   45 -1.0177989405881721e-03  7.4101861929751580e-04 -6.3760029049122590e-04
-   46  1.2959039767822169e-04  1.5887198241890099e-05  5.3231402917910502e-03
-   47  1.6489096449514865e-04 -1.8112350701541984e-05 -1.0797248493375228e-03
-   48 -9.7414454676203553e-04 -8.3283460790775058e-04  5.3750266967792192e-03
+    1  2.4609940069194088e-03 -8.0940157232910247e-04 -4.8325726970834988e-02
+    2 -7.6822848838547145e-05  1.2178328219749613e-04  4.0491291892786760e-02
+    3 -2.7988727505423236e-04 -4.2818132394118510e-04 -4.5664791886851373e-02
+    4 -1.4655494241735609e-04 -8.6680649376635584e-05  4.2136217440761937e-02
+    5  1.6314157154273569e-03  7.5109177962938900e-04 -4.6536021294724568e-02
+    6 -8.8331701994542403e-05  7.5117489176432426e-05  4.2128582280312542e-02
+    7  3.1198158197327059e-04 -3.3541096202997485e-04 -4.2495150569119976e-02
+    8 -2.1805403321291817e-04 -1.3827095570804907e-05  4.0578648564210895e-02
+    9 -4.4902850375367438e-05 -4.1153264699865012e-04 -4.5855023771171212e-02
+   10 -1.2323411017352900e-04  8.6264434948909476e-05  4.0668404690806285e-02
+   11 -1.0853721290544427e-04 -3.7090420095698014e-04 -4.5941911266724381e-02
+   12  4.6983413331934875e-05 -5.2641664381669891e-06  4.1216962896723150e-02
+   13  6.2619550238134179e-04 -4.4911367415724149e-04 -4.5820068049292902e-02
+   14 -3.5471795900222924e-05  6.0296345227544218e-05  4.0459040402743181e-02
+   15 -6.4692333287009476e-04 -9.2840440504242752e-04 -4.4973973956255839e-02
+   16  1.3091881904414094e-05  6.5566700471060033e-06  4.1412700547655577e-02
+   17  3.5154775899092324e-04 -1.1634232178762392e-03 -4.5343379769377648e-02
+   18  3.5988964364730208e-04 -1.9966661473108192e-05  4.2525807559503005e-02
+   19 -5.1060598395690773e-04 -6.5234194237526557e-04 -4.9164926688241531e-02
+   20  8.3862049523019723e-05  1.8418457418230890e-04  4.4009687490766621e-02
+   21  2.7114678744075095e-04 -1.0606899693139744e-03 -4.3923977143238875e-02
+   22  2.5537070627513553e-04 -9.8456189341286418e-05  4.2964626625974375e-02
+   23 -1.7689101402960281e-03  6.9489387637498791e-04 -4.7087985757714730e-02
+   24  1.0581628773364730e-04  1.2486060659532840e-04  4.1999172097783623e-02
+   25 -5.8076307908786276e-04  2.0876640447796849e-04 -7.1833852655823257e-04
+   26  1.0058383735703060e-03 -2.7830742425273818e-04  7.6611522529092535e-03
+   27  6.8106375490991321e-04  1.0764755411731127e-04 -2.8545056402054340e-04
+   28 -4.9686489809480823e-04  4.6140925013471001e-04  3.6145987053758238e-03
+   29 -7.3539529011730975e-04  9.9587775186411875e-04 -3.2033012451395705e-04
+   30  1.4169112871911462e-03 -1.1084870356386106e-03  5.2280008041790463e-03
+   31  9.6009292992426374e-04  9.4101463479531592e-04 -1.6080091845228125e-03
+   32 -3.4282276314532515e-05 -1.0943558732934332e-04  5.6562625510517073e-03
+   33  3.7577920134084604e-05  5.7278519005128127e-04  1.9379541278532380e-04
+   34 -1.5735846521140046e-04  5.0775739409873255e-06  5.8733503852292871e-03
+   35  1.0275573902186427e-04  5.4104173309866264e-06 -1.3719169525187674e-03
+   36  7.0174696432084545e-04  6.8890519718149224e-04  3.8596115083405613e-03
+   37 -4.3946717316729834e-04  3.7526593412663743e-04 -1.7338118741875162e-03
+   38 -1.2587116502840202e-04  5.4295618013077893e-04  5.9242533967379203e-03
+   39 -5.7206105243227078e-04 -6.4281579229026630e-04 -2.4615699421645025e-03
+   40  2.8775479574152420e-04  4.1508178729798107e-04  3.6587116047810363e-03
+   41 -1.1942225333102237e-03  1.2094954185316630e-03 -2.0149490846922040e-03
+   42 -3.1597810971585615e-04  6.4012288133276593e-05  7.1658710238005335e-03
+   43 -3.8040275175381421e-04  5.9235495429672857e-04  4.6334024424133464e-04
+   44 -1.2292519361513381e-03 -1.3107292145424741e-04  4.2824841677020263e-03
+   45 -7.0592870699901227e-04  2.2873758554906764e-04 -2.3920016760467832e-03
+   46  1.7490093749952047e-04  3.7340604342296136e-04  4.4218197134706944e-03
+   47  4.1892034467561773e-04  5.9152891234926929e-04  5.3087618174124781e-04
+   48 -1.2897747171583328e-03 -1.3810646979258219e-03  4.9140446103991871e-03
 ...
diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
index f54aa4f85b..7b7854daaf 100644
--- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
+++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
@@ -1,6 +1,6 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:49 2021
+date_generated: Tue Aug 24 15:36:45 2021
 epsilon: 5e-12
 skip_tests: single
 prerequisites: ! |
@@ -17,110 +17,110 @@ pair_coeff: ! |
   * * ilp/graphene/hbn BNCH.ILP B N C
 extract: ! ""
 natoms: 48
-init_vdwl: -1.743417069575419
+init_vdwl: -1.7413582303398039
 init_coul: 0
 init_stress: ! |-
-  -1.4159677678324094e+00 -1.4175957592828763e+00 -8.2079275196077894e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.2386435158561861e-03
+  -1.4134286921946488e+00 -1.4137999850717609e+00 -8.0828016569767047e-01 -2.6412849629299149e-03 -8.5490424515184647e-03  1.6336078227096977e-02
 init_forces: ! |2
-    1  2.0850484065019883e-03  3.6862873864507151e-18 -5.0318618251118635e-02
-    2 -6.3446817540543932e-06  9.5024077809279612e-05  4.2760561141837801e-02
-    3 -4.9554482434026152e-05 -8.1315162936412833e-18 -4.7333694009245655e-02
-    4 -2.3873708476733480e-04  1.4944038076278483e-06  4.1104339963197040e-02
-    5  2.0850484065019900e-03  3.0357660829594124e-18 -5.0318618251118601e-02
-    6 -6.3446817540370459e-06  9.5024077809283949e-05  4.2760561141837863e-02
-    7 -4.9554482434004034e-05 -2.0003530082357557e-17 -4.7333694009245551e-02
-    8 -2.3873708476732872e-04  1.4944038076165726e-06  4.1104339963197123e-02
-    9 -5.1133673114476565e-05 -4.2825985813177425e-18 -4.7328374000982235e-02
-   10 -1.2855382161618828e-04 -3.5892733150040340e-06  4.1845863048816843e-02
-   11  5.1094314571888079e-05 -9.2394353886499081e-18 -4.7328430254607333e-02
-   12  1.2855900637380436e-04 -3.5874635791496971e-06  4.1845894619109855e-02
-   13 -5.1133673114468758e-05  5.4210108624275222e-20 -4.7328374000982200e-02
-   14 -1.2855382161621300e-04 -3.5892733149839627e-06  4.1845863048816802e-02
-   15  5.1094314571888079e-05 -1.8460236052460222e-17 -4.7328430254607312e-02
-   16  1.2855900637382496e-04 -3.5874635791107064e-06  4.1845894619109890e-02
-   17  4.9595925523595848e-05 -4.7802304378296440e-18 -4.7333750316999074e-02
-   18  2.3873932915433548e-04  1.4963296466885558e-06  4.1104357563481929e-02
-   19 -2.0850504910489491e-03  1.0522849122417783e-17 -5.0318618305247004e-02
-   20  6.3372526094387688e-06  9.5024193912500820e-05  4.2760547171829859e-02
-   21  4.9595925523599209e-05  1.0509561293057731e-18 -4.7333750316998997e-02
-   22  2.3873932915433646e-04  1.4963296466837175e-06  4.1104357563481873e-02
-   23 -2.0850504910489630e-03 -4.2831809164689798e-17 -5.0318618305246844e-02
-   24  6.3372526094248910e-06  9.5024193912522829e-05  4.2760547171829762e-02
-   25 -1.6288457344696859e-04 -1.8238152247257184e-05  9.5379191188832164e-05
-   26  1.0182995551939961e-03 -8.6641525713797730e-04  6.5970295316636436e-03
-   27  1.0604041695539059e-03  7.7139117932867849e-04  5.4135994220887943e-04
-   28 -1.2540699375438325e-04  1.6743748439636654e-05  6.5543328981639889e-03
-   29 -1.6288457344698247e-04 -1.8238152247225959e-05  9.5379191188821322e-05
-   30  1.0182995551939649e-03 -8.6641525713797123e-04  6.5970295316634528e-03
-   31  1.0604041695539443e-03  7.7139117932868467e-04  5.4135994220893408e-04
-   32 -1.2540699375435983e-04  1.6743748439636546e-05  6.5543328981640713e-03
-   33  9.3725416939480027e-05  3.9426681303011716e-06 -4.6805765375060782e-04
-   34 -8.5944868650094253e-05 -3.3863756950810271e-07  5.9498944235440096e-03
-   35 -9.3742626080580566e-05  3.9279108845123400e-06 -4.6806588898556445e-04
-   36  8.5927904006221408e-05 -3.5520455114131738e-07  5.9498948560586119e-03
-   37  9.3725416939479159e-05  3.9426681303317868e-06 -4.6805765375057583e-04
-   38 -8.5944868650128080e-05 -3.3863756950880066e-07  5.9498944235437754e-03
-   39 -9.3742626080576229e-05  3.9279108844955619e-06 -4.6806588898545658e-04
-   40  8.5927904006218372e-05 -3.5520455114406897e-07  5.9498948560586301e-03
-   41 -1.0604093518345942e-03  7.7139074370169154e-04  5.4137060014462714e-04
-   42  1.2542828980921278e-04  1.6727500981786547e-05  6.5543447221730429e-03
-   43  1.6290696486873053e-04 -1.8223830628457046e-05  9.5398084359375981e-05
-   44 -1.0183038866049599e-03 -8.6641493761418803e-04  6.5970409231580918e-03
-   45 -1.0604093518345931e-03  7.7139074370171051e-04  5.4137060014457867e-04
-   46  1.2542828980922080e-04  1.6727500981764446e-05  6.5543447221731157e-03
-   47  1.6290696486873449e-04 -1.8223830628478516e-05  9.5398084359388924e-05
-   48 -1.0183038866049608e-03 -8.6641493761419497e-04  6.5970409231580329e-03
-run_vdwl: -1.7434201284130086
+    1  2.5671506894731589e-03 -8.3786084034401720e-04 -5.1036081136598070e-02
+    2 -7.5079308172634036e-05  1.2466726713768431e-04  4.0679917300844255e-02
+    3 -2.8828548641257135e-04 -4.5271584742210630e-04 -4.8293609404927766e-02
+    4 -1.4406200819607178e-04 -9.0001621977869580e-05  4.2392989076184280e-02
+    5  1.7027760046386372e-03  7.8656972507755028e-04 -4.9200918526109132e-02
+    6 -8.7712879599942568e-05  7.9491090947944639e-05  4.2392682052601084e-02
+    7  3.3258301690107647e-04 -3.5343521878259120e-04 -4.5022284535523836e-02
+    8 -2.2002998670154778e-04 -1.7356100673202577e-05  4.0787466276355475e-02
+    9 -4.6124486891179102e-05 -4.2325496992418857e-04 -4.8476400478716812e-02
+   10 -1.2591075539270013e-04  9.1455894947501561e-05  4.0885563712970939e-02
+   11 -1.1121626521394328e-04 -3.9116263339664792e-04 -4.8561395234903652e-02
+   12  4.6266631092390905e-05 -5.2845610714268243e-06  4.1449898905742528e-02
+   13  6.5246777492991353e-04 -4.5488207212499997e-04 -4.8442632457694250e-02
+   14 -3.7624647384854049e-05  6.2159752780010906e-05  4.0689933230887272e-02
+   15 -6.7285426313034690e-04 -9.6735405502104742e-04 -4.7566236949345711e-02
+   16  1.3704135992268461e-05  7.1930314305085428e-06  4.1666168986186899e-02
+   17  3.5234574640921536e-04 -1.2108273358484576e-03 -4.7956687606570347e-02
+   18  3.6283524563443081e-04 -2.1752269825311187e-05  4.2842397977493833e-02
+   19 -5.3430456642273823e-04 -6.7700037087304395e-04 -5.1893923237905579e-02
+   20  8.0067959801897917e-05  1.9199369028371848e-04  4.4356830365229041e-02
+   21  2.7070606898295466e-04 -1.1057160681550810e-03 -4.6504111757274966e-02
+   22  2.5925181999668259e-04 -1.0296802574297572e-04  4.3289088562630709e-02
+   23 -1.8442144850956180e-03  7.2762916990287002e-04 -4.9761642545012238e-02
+   24  1.0565711266344427e-04  1.2749698548653304e-04  4.2248585111624319e-02
+   25 -5.9585941678375444e-04  2.1641115663733300e-04  4.7131750632772949e-04
+   26  1.0453876277010951e-03 -2.8662462788158621e-04  8.9672658900977250e-03
+   27  7.0591323191921676e-04  1.1127960120069355e-04  9.0379438337785147e-04
+   28 -5.0909483279438714e-04  4.8707390653000772e-04  4.7643452885263934e-03
+   29 -7.5339417220817361e-04  1.0345992260147568e-03  8.8882429050538610e-04
+   30  1.4754521501772330e-03 -1.1568947634004825e-03  6.4416485674728616e-03
+   31  9.9739315711739164e-04  9.7533261901202716e-04 -4.7434454092814583e-04
+   32 -2.3838748070060742e-05 -1.1304983014188410e-04  6.8987427167466562e-03
+   33  3.8361879230719041e-05  5.9152255209474951e-04  1.3986602688146547e-03
+   34 -1.5699650292389650e-04  2.9194139622446815e-06  7.0911508869187581e-03
+   35  1.1245649251074219e-04  5.8020176212730487e-06 -2.4336213107647281e-04
+   36  7.2964500568976475e-04  7.1816700068531782e-04  5.0077761904869190e-03
+   37 -4.6186238269460621e-04  3.9291682284746084e-04 -6.0313849816674985e-04
+   38 -1.2542641974595987e-04  5.6120140189761859e-04  7.1683129612172937e-03
+   39 -5.8579483766297603e-04 -6.7104614260792494e-04 -1.3611900696946619e-03
+   40  2.9992651288639509e-04  4.2930651464219362e-04  4.7876360010713475e-03
+   41 -1.2437725060055766e-03  1.2620406155116949e-03 -9.1037381589832982e-04
+   42 -3.3539848726949059e-04  6.6612059436303974e-05  8.4701991083487964e-03
+   43 -3.9978628743584353e-04  6.1521767436610152e-04  1.6982833241619140e-03
+   44 -1.2826808362133742e-03 -1.3921127049583705e-04  5.4675328860112962e-03
+   45 -7.3349603322586166e-04  2.4256895185880898e-04 -1.2875010419578902e-03
+   46  1.7217369575183144e-04  3.9114708549249091e-04  5.6131585227578709e-03
+   47  4.2507179882718263e-04  6.1626846104424152e-04  1.7649745339438007e-03
+   48 -1.3527731566796476e-03 -1.4406450631389688e-03  6.1106890827670301e-03
+run_vdwl: -1.7413613136648298
 run_coul: 0
 run_stress: ! |-
-  -1.4159735399871292e+00 -1.4176014949571309e+00 -8.2080149187142926e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.2386484789055200e-03
+  -1.4134345040702818e+00 -1.4138057787629810e+00 -8.0828916748788793e-01 -2.6412564399016744e-03 -8.5489449819476510e-03  1.6335849121510891e-02
 run_forces: ! |2
-    1  2.0850117908114097e-03  1.0161463491389217e-09 -5.0317981439628325e-02
-    2 -6.3437194577726987e-06  9.5025701239061859e-05  4.2760248404172425e-02
-    3 -4.9558828649647491e-05 -2.8627617254290035e-09 -4.7333123186150738e-02
-    4 -2.3873691985811830e-04  1.4944553106552229e-06  4.1104081968794406e-02
-    5  2.0850117908114453e-03  1.0161464421634681e-09 -5.0317981439628387e-02
-    6 -6.3437194577657598e-06  9.5025701239022950e-05  4.2760248404172314e-02
-    7 -4.9558828649683053e-05 -2.8627618450165031e-09 -4.7333123186150801e-02
-    8 -2.3873691985809662e-04  1.4944553106461156e-06  4.1104081968794330e-02
-    9 -5.1133422593300278e-05  7.5547760714921204e-10 -4.7327803360874096e-02
-   10 -1.2855412188890643e-04 -3.5895010384140685e-06  4.1845576403891582e-02
-   11  5.1094064803271807e-05  7.5555079194951369e-10 -4.7327859613308917e-02
-   12  1.2855930662305235e-04 -3.5876912710547494e-06  4.1845607973177879e-02
-   13 -5.1133422593287268e-05  7.5547762723405729e-10 -4.7327803360874242e-02
-   14 -1.2855412188890339e-04 -3.5895010383977919e-06  4.1845576403891596e-02
-   15  5.1094064803272566e-05  7.5555075467328774e-10 -4.7327859613308966e-02
-   16  1.2855930662306232e-04 -3.5876912710024113e-06  4.1845607973177948e-02
-   17  4.9600271065325580e-05 -2.8627573902157001e-09 -4.7333179492726606e-02
-   18  2.3873916427060956e-04  1.4963811844738990e-06  4.1104099568595440e-02
-   19 -2.0850138754365875e-03  1.0160778065162400e-09 -5.0317981493768628e-02
-   20  6.3362903110811795e-06  9.5025817345494392e-05  4.2760234434687100e-02
-   21  4.9600271065314522e-05 -2.8627574752175739e-09 -4.7333179492726564e-02
-   22  2.3873916427059666e-04  1.4963811844658860e-06  4.1104099568595440e-02
-   23 -2.0850138754366235e-03  1.0160777921810544e-09 -5.0317981493768635e-02
-   24  6.3362903110742406e-06  9.5025817345493959e-05  4.2760234434687017e-02
-   25 -1.6288606984034650e-04 -1.8236722175475704e-05  9.5216967993063707e-05
-   26  1.0182812312861281e-03 -8.6640626373293709e-04  6.5968711299294047e-03
-   27  1.0603851126650126e-03  7.7138037180120864e-04  5.4119317677753243e-04
-   28 -1.2540771098643044e-04  1.6744137902604281e-05  6.5541778235511557e-03
-   29 -1.6288606984038928e-04 -1.8236722175416289e-05  9.5216967993082789e-05
-   30  1.0182812312861922e-03 -8.6640626373294402e-04  6.5968711299294082e-03
-   31  1.0603851126649892e-03  7.7138037180129147e-04  5.4119317677749253e-04
-   32 -1.2540771098645993e-04  1.6744137902621953e-05  6.5541778235512944e-03
-   33  9.3723257649716975e-05  3.9423316345507744e-06 -4.6820173818218168e-04
-   34 -8.5943962571135429e-05 -3.3866278074822816e-07  5.9497600753296263e-03
-   35 -9.3740466418232955e-05  3.9275746001192263e-06 -4.6820997335027752e-04
-   36  8.5926998277192305e-05 -3.5522961929919531e-07  5.9497605077923395e-03
-   37  9.3723257649690628e-05  3.9423316345445131e-06 -4.6820173818211392e-04
-   38 -8.5943962571131960e-05 -3.3866278074772671e-07  5.9497600753297061e-03
-   39 -9.3740466418205850e-05  3.9275746001722167e-06 -4.6820997335035645e-04
-   40  8.5926998277160646e-05 -3.5522961930283416e-07  5.9497605077923222e-03
-   41 -1.0603902949286239e-03  7.7137993620434483e-04  5.4120383437409529e-04
-   42  1.2542900668491156e-04  1.6727890598687433e-05  6.5541896471255070e-03
-   43  1.6290846087229721e-04 -1.8222400738173032e-05  9.5235860757960438e-05
-   44 -1.0182855626908293e-03 -8.6640594419860580e-04  6.5968825210400628e-03
-   45 -1.0603902949286009e-03  7.7137993620434917e-04  5.4120383437400075e-04
-   46  1.2542900668490961e-04  1.6727890598721233e-05  6.5541896471255886e-03
-   47  1.6290846087231749e-04 -1.8222400738211376e-05  9.5235860757975237e-05
-   48 -1.0182855626908007e-03 -8.6640594419857295e-04  6.5968825210402865e-03
+    1  2.5671069317156946e-03 -8.3784748622451677e-04 -5.1035422353424897e-02
+    2 -7.5078660431280697e-05  1.2466894068441879e-04  4.0679640015975134e-02
+    3 -2.8828222070861930e-04 -4.5271063068668852e-04 -4.8293016009692991e-02
+    4 -1.4406124862828204e-04 -9.0001239249681299e-05  4.2392698375035044e-02
+    5  1.7027479618599520e-03  7.8655155527332680e-04 -4.9200309431395639e-02
+    6 -8.7712151111431111e-05  7.9493272325145201e-05  4.2392377826466342e-02
+    7  3.3257433268158495e-04 -3.5343190630449746e-04 -4.5021763970252524e-02
+    8 -2.2003052260134021e-04 -1.7356654735586603e-05  4.0787210168996092e-02
+    9 -4.6122628526387623e-05 -4.2324611616067641e-04 -4.8475797684687988e-02
+   10 -1.2591030160492974e-04  9.1455808782197882e-05  4.0885285111349159e-02
+   11 -1.1120852050748912e-04 -3.9116166997766016e-04 -4.8560795739075201e-02
+   12  4.6266856592107244e-05 -5.2847075459255751e-06  4.1449627520166392e-02
+   13  6.5245464520849363e-04 -4.5487894789080158e-04 -4.8442036485576837e-02
+   14 -3.7624862825607827e-05  6.2159419287636660e-05  4.0689669960074649e-02
+   15 -6.7284046211318015e-04 -9.6733976598340171e-04 -4.7565660766662930e-02
+   16  1.3704563115169745e-05  7.1929183212948243e-06  4.1665879631313046e-02
+   17  3.5234429785830821e-04 -1.2108026434225379e-03 -4.7956099842218117e-02
+   18  3.6283539800015707e-04 -2.1751834977917593e-05  4.2842115834581848e-02
+   19 -5.3430067459146475e-04 -6.7699076712118898e-04 -5.1893248195074890e-02
+   20  8.0067631436594490e-05  1.9199577717410272e-04  4.4356509251295417e-02
+   21  2.7070817748155987e-04 -1.1057017890780325e-03 -4.6503559959193794e-02
+   22  2.5925191776026096e-04 -1.0296760159363033e-04  4.3288794705141333e-02
+   23 -1.8441850074936330e-03  7.2761697736138198e-04 -4.9761022378471902e-02
+   24  1.0565676776159950e-04  1.2749723476606362e-04  4.2248293219115704e-02
+   25 -5.9585451021696182e-04  2.1640639607864025e-04  4.7114874751477080e-04
+   26  1.0453692437877231e-03 -2.8662506725380277e-04  8.9670633005856336e-03
+   27  7.0589906505207555e-04  1.1128140868864322e-04  9.0361854811791056e-04
+   28 -5.0908832361770510e-04  4.8706590396432539e-04  4.7642176528582547e-03
+   29 -7.5338509261032660e-04  1.0345829810439421e-03  8.8865240545560505e-04
+   30  1.4754248973631234e-03 -1.1568817076731742e-03  6.4414985161040036e-03
+   31  9.9737630177424786e-04  9.7532502560874047e-04 -4.7448946945127454e-04
+   32 -2.3839900990695571e-05 -1.1304495074488221e-04  6.8985860488112805e-03
+   33  3.8363508295354183e-05  5.9151530177011056e-04  1.3984758350279918e-03
+   34 -1.5699679563740878e-04  2.9191691751159093e-06  7.0909914856595929e-03
+   35  1.1245238949755777e-04  5.8063509827796967e-06 -2.4351202431714138e-04
+   36  7.2963238396686701e-04  7.1815661636541093e-04  5.0076498433107557e-03
+   37 -4.6185741822893714e-04  3.9291330387253819e-04 -6.0327630742922826e-04
+   38 -1.2542291741247241e-04  5.6119015898891159e-04  7.1681606949559294e-03
+   39 -5.8578599337169536e-04 -6.7103392539062581e-04 -1.3613169389676742e-03
+   40  2.9992166808446435e-04  4.2930027852655433e-04  4.7875220868096729e-03
+   41 -1.2437554051579060e-03  1.2620214208313983e-03 -9.1052192567291036e-04
+   42 -3.3538993566218202e-04  6.6612328072330551e-05  8.4699959588109205e-03
+   43 -3.9977362536516620e-04  6.1520314872321510e-04  1.6980894994330193e-03
+   44 -1.2826587463211528e-03 -1.3921416264003162e-04  5.4673856596931985e-03
+   45 -7.3348779583301917e-04  2.4256471430180029e-04 -1.2876405242036421e-03
+   46  1.7217585843614476e-04  3.9114182832181052e-04  5.6130185122816581e-03
+   47  4.2506556290596465e-04  6.1625753588710557e-04  1.7647784184589349e-03
+   48 -1.3527466390657683e-03 -1.4406222005236080e-03  6.1105351723711654e-03
 ...
diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml
index a166d66af1..aa14a037d9 100644
--- a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml
+++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml
@@ -1,6 +1,6 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:49 2021
+date_generated: Tue Aug 24 15:36:47 2021
 epsilon: 5e-12
 skip_tests: single
 prerequisites: ! |
@@ -17,110 +17,110 @@ pair_coeff: ! |
   * * kolmogorov/crespi/full CH_taper.KC C C C
 extract: ! ""
 natoms: 48
-init_vdwl: -1.2500397419624312
+init_vdwl: -1.2504009944747907
 init_coul: 0
 init_stress: ! |-
-  -1.0004429195951223e+00 -1.0032930381066463e+00  4.3070815061895146e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.7133324489474716e-02
+  -9.9937588621335804e-01 -1.0000549664406271e+00  4.2993515475088256e-01 -1.0321402621276921e-03 -2.6508652354193526e-02  3.5775561054487807e-03
 init_forces: ! |2
-    1  2.8687289997477317e-03 -7.8062556418956319e-18  3.6613830361686965e-02
-    2  1.3226962450822509e-03  1.2611200091842689e-03 -6.4703224388507563e-02
-    3 -3.4774444393605684e-04 -1.3010426069826053e-17  3.8050724789394384e-02
-    4 -3.4400661847007637e-04  3.0925839103697773e-05 -6.5875665183461635e-02
-    5  2.8687289997477005e-03 -1.5612511283791264e-17  3.6613830361687000e-02
-    6  1.3226962450822808e-03  1.2611200091843045e-03 -6.4703224388507549e-02
-    7 -3.4774444393598919e-04 -5.2150124496552763e-17  3.8050724789394412e-02
-    8 -3.4400661847007550e-04  3.0925839103693002e-05 -6.5875665183461662e-02
-    9 -1.2644907900887740e-04 -8.1315162936412833e-18  3.8649557617062728e-02
-   10 -1.1324543171146572e-04 -5.6284413155996182e-06 -6.5027903599930381e-02
-   11  1.2639947077019444e-04 -2.2215980140585789e-17  3.8649533308935571e-02
-   12  1.1322659571519420e-04 -5.6051326608156769e-06 -6.5027878367048986e-02
-   13 -1.2644907900885008e-04  2.3256136599814070e-17  3.8649557617062749e-02
-   14 -1.1324543171150085e-04 -5.6284413155611291e-06 -6.5027903599930395e-02
-   15  1.2639947077014381e-04 -7.0749273952362690e-17  3.8649533308935564e-02
-   16  1.1322659571522879e-04 -5.6051326608175471e-06 -6.5027878367048930e-02
-   17  3.4780347512676035e-04  3.1573153108904045e-19  3.8050688506524509e-02
-   18  3.4403466466237793e-04  3.0949865189355873e-05 -6.5875656847228403e-02
-   19 -2.8687384226996960e-03  1.2450087305437732e-17  3.6613818386944344e-02
-   20 -1.3227054552782821e-03  1.2611207266151373e-03 -6.4703241285155699e-02
-   21  3.4780347512675867e-04  2.4633623930286376e-17  3.8050688506524544e-02
-   22  3.4403466466237533e-04  3.0949865189391902e-05 -6.5875656847228389e-02
-   23 -2.8687384226997285e-03 -1.2114236094873442e-16  3.6613818386944393e-02
-   24 -1.3227054552782968e-03  1.2611207266151575e-03 -6.4703241285155685e-02
-   25 -3.4774444393599700e-04 -9.2157184661267877e-18 -3.8050724789394322e-02
-   26  1.3226962450822511e-03 -1.2611200091842659e-03  6.4703224388507466e-02
-   27  2.8687289997476766e-03 -2.1250362580715887e-17 -3.6613830361686889e-02
-   28 -3.4400661847007550e-04 -3.0925839103686985e-05  6.5875665183461676e-02
-   29 -3.4774444393599092e-04  3.0357660829594124e-17 -3.8050724789394301e-02
-   30  1.3226962450822149e-03 -1.2611200091842295e-03  6.4703224388507424e-02
-   31  2.8687289997477408e-03 -3.0791341698588326e-17 -3.6613830361686910e-02
-   32 -3.4400661847004514e-04 -3.0925839103694330e-05  6.5875665183461649e-02
-   33  1.2639947077014197e-04  1.9363173174233306e-17 -3.8649533308935488e-02
-   34 -1.1324543171148133e-04  5.6284413156027252e-06  6.5027903599930423e-02
-   35 -1.2644907900888000e-04 -9.8391347153059527e-18 -3.8649557617062437e-02
-   36  1.1322659571522738e-04  5.6051326608073988e-06  6.5027878367048986e-02
-   37  1.2639947077014413e-04  4.6109085516735093e-17 -3.8649533308935564e-02
-   38 -1.1324543171150865e-04  5.6284413156129404e-06  6.5027903599930312e-02
-   39 -1.2644907900887783e-04 -5.0401848493419887e-17 -3.8649557617062492e-02
-   40  1.1322659571519420e-04  5.6051326607950474e-06  6.5027878367048930e-02
-   41 -2.8687384226997710e-03  4.7556214837339464e-17 -3.6613818386944108e-02
-   42  3.4403466466238080e-04 -3.0949865189344834e-05  6.5875656847228375e-02
-   43  3.4780347512678995e-04  2.7966275061258421e-17 -3.8050688506524606e-02
-   44 -1.3227054552783079e-03 -1.2611207266151391e-03  6.4703241285155699e-02
-   45 -2.8687384226997693e-03  3.0234814582462649e-17 -3.6613818386944066e-02
-   46  3.4403466466241371e-04 -3.0949865189357960e-05  6.5875656847228403e-02
-   47  3.4780347512675510e-04 -4.1431557823760033e-17 -3.8050688506524565e-02
-   48 -1.3227054552782990e-03 -1.2611207266151820e-03  6.4703241285155616e-02
-run_vdwl: -1.250048655581655
+    1  3.6741977296817214e-03 -1.0229641033089357e-03  3.6050598286323773e-02
+    2  1.1228048505955328e-03  1.6260001235216366e-03 -6.9915514494061512e-02
+    3 -8.0263804389515536e-04 -7.8054142409220465e-04  3.7423752203911045e-02
+    4  5.2905890482453886e-04 -2.6660891986977193e-05 -6.2949951679195801e-02
+    5  2.3747397845779541e-03  1.1069918417071542e-03  3.5749378944516262e-02
+    6  2.1361390761049817e-03  1.5311822673314498e-03 -6.5538703818661767e-02
+    7  4.1113944201536749e-04 -7.4226696363606254e-04  3.7231357029322766e-02
+    8 -3.6293069921929100e-04 -4.1792920591827683e-04 -6.7041988117625240e-02
+    9 -6.7567684541213792e-05 -5.4683858871309163e-04  3.8584447182734363e-02
+   10  8.3703032725978383e-04  3.1274393347030375e-04 -6.7426207981870295e-02
+   11  7.6972254238782717e-05 -7.5635616799940618e-04  4.0304172540280687e-02
+   12  9.1949774781644789e-04  7.9375688632077012e-05 -6.4417122131659177e-02
+   13  8.6168104672523869e-04 -4.5216546396937169e-04  3.9667089495175389e-02
+   14  1.5404866318924348e-04  9.5701680799534607e-04 -6.7437367157563669e-02
+   15 -9.5143336291351262e-04 -1.5478931364188030e-03  3.8652043624424468e-02
+   16  5.0932423595171044e-05  6.6343349270142626e-04 -6.4978708477968702e-02
+   17  5.9845840464981047e-04 -1.6803578425037512e-03  3.8517765052240409e-02
+   18  1.0027251103784654e-03  3.6389809344473028e-04 -6.3081650255180893e-02
+   19 -6.8469130631403172e-04 -1.0012004014665335e-03  3.8200820830772898e-02
+   20 -9.0597154181006534e-04  1.5072901036096238e-03 -6.0431599283672394e-02
+   21  6.2502601715616851e-04 -1.6298948749282841e-03  3.5552400201000957e-02
+   22  1.0610150451927157e-05  6.5523853057832904e-04 -6.1624211674849522e-02
+   23 -2.6858239463745156e-03  9.7704990029999690e-04  3.6806526274162810e-02
+   24 -9.7990355040882275e-04 -2.6364878660689443e-04 -6.4804496163587397e-02
+   25 -9.9178318725343714e-04 -2.9791597396435637e-06 -3.8560242214034937e-02
+   26  1.4063694267467438e-03 -1.7645058974936640e-04  6.9272929106935568e-02
+   27  1.4040917079447780e-03 -1.5354287269199992e-03 -3.6863862200675189e-02
+   28 -7.9589073250701907e-04  7.6684151630055151e-05  6.1787433330410840e-02
+   29 -1.3454048099355946e-03  1.7192801435465354e-03 -3.9047318157065580e-02
+   30  1.0800716705062206e-03 -2.1759013252742438e-03  6.5488372519033194e-02
+   31  2.5828460888672328e-03  6.3668525788806475e-04 -3.6248438099394334e-02
+   32 -1.7422793202447918e-04  3.9801240577118889e-04  6.7293933186886992e-02
+   33  4.9336990699592976e-04  1.7399247540870930e-03 -3.9361750124123948e-02
+   34 -7.0861968784997897e-04 -1.0779297898309275e-04  6.6982337220476265e-02
+   35  7.3393673410456720e-04  6.6256971526147061e-04 -3.7789967198382235e-02
+   36 -1.1649777508201484e-03  7.6734390873931936e-05  6.2960301164193919e-02
+   37 -1.7492911968589838e-03  1.2667558142713635e-03 -3.8885908384449192e-02
+   38  3.3065638747931028e-04  9.3136542389919894e-05  6.8503220023298464e-02
+   39 -1.4038652077725464e-03 -1.2146648711443984e-03 -3.7920985454243078e-02
+   40  1.0445094111275711e-03 -3.3348687744225403e-04  6.2323823114510714e-02
+   41 -3.8543227776677144e-03  5.9241129713389306e-04 -3.5401989313202945e-02
+   42 -6.4426504417376641e-04 -3.4647462137221609e-04  6.7581618654938044e-02
+   43 -3.3609683042563269e-04 -1.2920027086862771e-04 -3.9165813804050230e-02
+   44 -1.3121828793557890e-03 -2.3790845828507482e-04  6.1419902010626644e-02
+   45 -2.3567677369656322e-03 -7.9567726510944639e-04 -3.4159081403384459e-02
+   46  1.0801227073635948e-03  8.6900071217663384e-05  6.2655301167539201e-02
+   47  4.9418643058574477e-04  8.6815716220649253e-04 -3.9577211407235038e-02
+   48 -1.7565664958955529e-03 -7.2789493132733958e-05  6.3620565832423606e-02
+run_vdwl: -1.2504098739729748
 run_coul: 0
 run_stress: ! |-
-  -1.0004370065912216e+00 -1.0032870501278353e+00  4.3059909389948547e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.7133053394138682e-02
+  -9.9936987513863307e-01 -1.0000490662171573e+00  4.2982659200235462e-01 -1.0322429741975237e-03 -2.6508476134144317e-02  3.5778284842948815e-03
 run_forces: ! |2
-    1  2.8687040337510585e-03 -2.1727982419360303e-08  3.6613767230361242e-02
-    2  1.3226761216838419e-03  1.2611192610103965e-03 -6.4700278384581700e-02
-    3 -3.4774048959829596e-04 -6.5329695842506266e-09  3.8050693623452148e-02
-    4 -3.4399690449135600e-04  3.0931288630288282e-05 -6.5872679966618428e-02
-    5  2.8687040337509414e-03 -2.1727982416324537e-08  3.6613767230361215e-02
-    6  1.3226761216838328e-03  1.2611192610103637e-03 -6.4700278384581755e-02
-    7 -3.4774048959831157e-04 -6.5329697417852023e-09  3.8050693623452293e-02
-    8 -3.4399690449132131e-04  3.0931288630341516e-05 -6.5872679966618358e-02
-    9 -1.2644870195377845e-04 -9.8156702533244537e-11  3.8649526065561227e-02
-   10 -1.1324486560407342e-04 -5.6284938931148765e-06 -6.5024950822206537e-02
-   11  1.2639909409585960e-04 -9.8445711624968110e-11  3.8649501756815911e-02
-   12  1.1322602979076438e-04 -5.6051853390437709e-06 -6.5024925590218899e-02
-   13 -1.2644870195375113e-04 -9.8156632886807482e-11  3.8649526065561317e-02
-   14 -1.1324486560405911e-04 -5.6284938930792740e-06 -6.5024950822206565e-02
-   15  1.2639909409583455e-04 -9.8445744733791953e-11  3.8649501756815870e-02
-   16  1.1322602979075462e-04 -5.6051853390539302e-06 -6.5024925590218899e-02
-   17  3.4779952031141985e-04 -6.5333858894565295e-09  3.8050657339932729e-02
-   18  3.4402495029270961e-04  3.0955314710129699e-05 -6.5872671630637689e-02
-   19 -2.8687134566054494e-03 -2.1728110080698652e-08  3.6613755255587549e-02
-   20 -1.3226853316725558e-03  1.2611199785361846e-03 -6.4700295280588876e-02
-   21  3.4779952031157007e-04 -6.5333859204723350e-09  3.8050657339932889e-02
-   22  3.4402495029267491e-04  3.0955314710011826e-05 -6.5872671630637619e-02
-   23 -2.8687134566054233e-03 -2.1728109989627787e-08  3.6613755255587500e-02
-   24 -1.3226853316725203e-03  1.2611199785360946e-03 -6.4700295280588946e-02
-   25 -3.4774026620067611e-04  5.4788299566664936e-09 -3.8050694958508775e-02
-   26  1.3226758258096682e-03 -1.2611202352806649e-03  6.4700279759489457e-02
-   27  2.8687023920407370e-03  2.3305742741057400e-08 -3.6613767021966469e-02
-   28 -3.4399811208785710e-04 -3.0930750484966575e-05  6.5872680514205861e-02
-   29 -3.4774026620052866e-04  5.4788301344756499e-09 -3.8050694958508983e-02
-   30  1.3226758258096626e-03 -1.2611202352806358e-03  6.4700279759489457e-02
-   31  2.8687023920407314e-03  2.3305742749297337e-08 -3.6613767021966427e-02
-   32 -3.4399811208790654e-04 -3.0930750484980141e-05  6.5872680514205958e-02
-   33  1.2639885814274838e-04  1.7430860588435232e-10 -3.8649502722412493e-02
-   34 -1.1324494267667476e-04  5.6283305711724153e-06  6.5024950991958153e-02
-   35 -1.2644846597469278e-04  1.7397032093721936e-10 -3.8649527031188770e-02
-   36  1.1322610689165884e-04  5.6050219889952428e-06  6.5024925759978203e-02
-   37  1.2639885814283360e-04  1.7430877254486095e-10 -3.8649502722412549e-02
-   38 -1.1324494267669341e-04  5.6283305709431489e-06  6.5024950991958139e-02
-   39 -1.2644846597468064e-04  1.7397049817716951e-10 -3.8649527031188825e-02
-   40  1.1322610689166047e-04  5.6050219889600113e-06  6.5024925759978369e-02
-   41 -2.8687118148861238e-03  2.3305846951219172e-08 -3.6613755047197015e-02
-   42  3.4402615788549601e-04 -3.0954776578351879e-05  6.5872672178240693e-02
-   43  3.4779929687850922e-04  5.4792724940850910e-09 -3.8050658674962379e-02
-   44 -1.3226850358229400e-03 -1.2611209527917432e-03  6.4700296655504905e-02
-   45 -2.8687118148861242e-03  2.3305846874457658e-08 -3.6613755047197084e-02
-   46  3.4402615788544478e-04 -3.0954776578295039e-05  6.5872672178240735e-02
-   47  3.4779929687843897e-04  5.4792724213126788e-09 -3.8050658674962212e-02
-   48 -1.3226850358228897e-03 -1.2611209527918239e-03  6.4700296655504780e-02
+    1  3.6741691975029581e-03 -1.0229871421580526e-03  3.6050530025906281e-02
+    2  1.1227921193014082e-03  1.6259870341875716e-03 -6.9912188310138110e-02
+    3 -8.0262575686418976e-04 -7.8053695949266487e-04  3.7423704515313912e-02
+    4  5.2905609847367537e-04 -2.6654395328295035e-05 -6.2947184182195678e-02
+    5  2.3747095488121481e-03  1.1069587035628763e-03  3.5749325846115995e-02
+    6  2.1361000566259124e-03  1.5311732714813019e-03 -6.5535708962713768e-02
+    7  4.1113889781728766e-04 -7.4226829646699757e-04  3.7231368457459980e-02
+    8 -3.6291731806742042e-04 -4.1791164880922887e-04 -6.7038918951433712e-02
+    9 -6.7570474513034638e-05 -5.4684426183841022e-04  3.8584411326469885e-02
+   10  8.3701125613325168e-04  3.1273073770282704e-04 -6.7423081498739421e-02
+   11  7.6985684709962783e-05 -7.5635817928419767e-04  4.0304124898807213e-02
+   12  9.1947304797009217e-04  7.9374425705052294e-05 -6.4414254216165437e-02
+   13  8.6167203749816642e-04 -4.5216714840892042e-04  3.9667029244414849e-02
+   14  1.5405060318326655e-04  9.5699770497460778e-04 -6.7434226234504804e-02
+   15 -9.5142546122452449e-04 -1.5478963169718038e-03  3.8652019177077342e-02
+   16  5.0932976574468488e-05  6.6341353598349106e-04 -6.4975798284669775e-02
+   17  5.9847070987311389e-04 -1.6803298615155474e-03  3.8517725818853210e-02
+   18  1.0027116328843830e-03  3.6388996787454462e-04 -6.3078763161296847e-02
+   19 -6.8469943409668914e-04 -1.0012195649349563e-03  3.8200747700365557e-02
+   20 -9.0595079384803796e-04  1.5072945474581172e-03 -6.0428934099631557e-02
+   21  6.2503299746955962e-04 -1.6298743741651773e-03  3.5552390276823172e-02
+   22  1.0606855899034941e-05  6.5522241344806334e-04 -6.1621482978662948e-02
+   23 -2.6857930199209968e-03  9.7701501877829632e-04  3.6806463415713003e-02
+   24 -9.7988402432926049e-04 -2.6360905898699876e-04 -6.4801592934849550e-02
+   25 -9.9177650514132264e-04 -2.9749741115472732e-06 -3.8560199992301730e-02
+   26  1.4063438489595912e-03 -1.7647086111514335e-04  6.9269634056662671e-02
+   27  1.4040902799584685e-03 -1.5353807665690793e-03 -3.6863805708285076e-02
+   28 -7.9587897165075278e-04  7.6677410178542700e-05  6.1784694067447098e-02
+   29 -1.3454017096032000e-03  1.7192795631010469e-03 -3.9047278683656546e-02
+   30  1.0800553143186507e-03 -2.1758812931223781e-03  6.5485374935756790e-02
+   31  2.5828271383404027e-03  6.3671302339979655e-04 -3.6248380958934713e-02
+   32 -1.7422254069942482e-04  3.9799290238358865e-04  6.7290850944434030e-02
+   33  4.9335647587368282e-04  1.7399008987367872e-03 -3.9361699297976421e-02
+   34 -7.0861028763521093e-04 -1.0778449734119870e-04  6.6979221310754469e-02
+   35  7.3392150247315055e-04  6.6257276139929078e-04 -3.7789954535635037e-02
+   36 -1.1649443522892947e-03  7.6740700646779947e-05  6.2957470236494062e-02
+   37 -1.7492708489133450e-03  1.2667448756481490e-03 -3.8885868512193354e-02
+   38  3.3064351263846579e-04  9.3140678084776377e-05  6.8500054487413836e-02
+   39 -1.4038546084894550e-03 -1.2146451215997596e-03 -3.7920961219836492e-02
+   40  1.0444893111192185e-03 -3.3346895357722788e-04  6.2320981380163128e-02
+   41 -3.8542779561979933e-03  5.9241274013200327e-04 -3.5401941575416832e-02
+   42 -6.4426220276000610e-04 -3.4646934457282738e-04  6.7578620533114572e-02
+   43 -3.3610005890149277e-04 -1.2917556683196676e-04 -3.9165759975059451e-02
+   44 -1.3121716243135058e-03 -2.3792084909504211e-04  6.1417223055191830e-02
+   45 -2.3567498071797215e-03 -7.9565006404630695e-04 -3.4159038131169342e-02
+   46  1.0801093023979562e-03  8.6901137417266978e-05  6.2652553436780320e-02
+   47  4.9417543987152854e-04  8.6816115997776389e-04 -3.9577178203993348e-02
+   48 -1.7565380900407569e-03 -7.2815711919122815e-05  6.3617681461928394e-02
 ...
diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml
index 8049df3f76..dfa6249013 100644
--- a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml
+++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml
@@ -1,6 +1,6 @@
 ---
 lammps_version: 30 Jul 2021
-date_generated: Tue Aug 17 15:09:50 2021
+date_generated: Tue Aug 24 15:36:49 2021
 epsilon: 5e-12
 skip_tests: single
 prerequisites: ! |
@@ -17,110 +17,110 @@ pair_coeff: ! |
   * * kolmogorov/crespi/full CH.KC C C C
 extract: ! ""
 natoms: 48
-init_vdwl: -1.2319861234762621
+init_vdwl: -1.23233116008364
 init_coul: 0
 init_stress: ! |-
-  -1.1008420461559216e+00 -1.1059574121005133e+00  1.9501897055379741e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.5182584087439038e-02
+  -1.0998026814576654e+00 -1.1029768921651573e+00  1.9227618627869217e-01 -8.9391891437776237e-04 -2.6573328510275926e-02  4.9220093399077770e-03
 init_forces: ! |2
-    1  2.7578315641555162e-03 -3.0357660829594124e-18  4.1533172062176493e-02
-    2  1.2588944124766973e-03  1.1188632453424979e-03 -6.5272327121384435e-02
-    3 -2.7478683204608390e-04 -8.0230960763927328e-18  4.2197936430518210e-02
-    4 -2.9454797299274370e-04  2.5016995713589751e-05 -6.6888523602123898e-02
-    5  2.7578315641554889e-03 -1.5178830414797062e-17  4.1533172062176521e-02
-    6  1.2588944124767164e-03  1.1188632453425370e-03 -6.5272327121384408e-02
-    7 -2.7478683204601537e-04 -5.8221656662471588e-17  4.2197936430518279e-02
-    8 -2.9454797299274544e-04  2.5016995713579072e-05 -6.6888523602123925e-02
-    9 -9.9550461818177349e-05 -4.5672016515951874e-18  4.2881244934310968e-02
-   10 -8.9376686817712898e-05 -3.9953386427702976e-06 -6.5900411970681708e-02
-   11  9.9502582131880363e-05 -1.8143445730187113e-17  4.2881235234728650e-02
-   12  8.9358399770402756e-05 -3.9749130157838919e-06 -6.5900379165394929e-02
-   13 -9.9550461818153496e-05  2.3418766925686896e-17  4.2881244934310996e-02
-   14 -8.9376686817732847e-05 -3.9953386427169006e-06 -6.5900411970681708e-02
-   15  9.9502582131827562e-05 -7.7708496647004022e-17  4.2881235234728796e-02
-   16  8.9358399770424440e-05 -3.9749130157734564e-06 -6.5900379165394957e-02
-   17  2.7484214272895964e-04 -4.4452289071905682e-18  4.2197913495242940e-02
-   18  2.9457391733397659e-04  2.5037988057733265e-05 -6.6888509865507970e-02
-   19 -2.7578389951520565e-03  1.2809996898682004e-17  4.1533158826483590e-02
-   20 -1.2589020697706256e-03  1.1188638120596694e-03 -6.5272346190055328e-02
-   21  2.7484214272896311e-04  2.3479753297889205e-17  4.2197913495243079e-02
-   22  2.9457391733397653e-04  2.5037988057775138e-05 -6.6888509865507970e-02
-   23 -2.7578389951520709e-03 -1.2185643619304939e-16  4.1533158826483604e-02
-   24 -1.2589020697706512e-03  1.1188638120596733e-03 -6.5272346190055328e-02
-   25 -2.7478683204603272e-04 -1.2468324983583301e-18 -4.2197936430518238e-02
-   26  1.2588944124767121e-03 -1.1188632453425023e-03  6.5272327121384421e-02
-   27  2.7578315641554356e-03 -2.6020852139652106e-17 -4.1533172062176479e-02
-   28 -2.9454797299273850e-04 -2.5016995713583283e-05  6.6888523602123814e-02
-   29 -2.7478683204602925e-04  3.7892865928368380e-17 -4.2197936430518307e-02
-   30  1.2588944124766739e-03 -1.1188632453424724e-03  6.5272327121384463e-02
-   31  2.7578315641555275e-03 -4.0115480381963664e-17 -4.1533172062176452e-02
-   32 -2.9454797299271942e-04 -2.5016995713586458e-05  6.6888523602123898e-02
-   33  9.9502582131834392e-05 -3.7269449679189215e-20 -4.2881235234728567e-02
-   34 -8.9376686817722005e-05  3.9953386427603932e-06  6.5900411970681694e-02
-   35 -9.9550461818180818e-05 -1.3674499900473425e-17 -4.2881244934310996e-02
-   36  8.9358399770429102e-05  3.9749130157800633e-06  6.5900379165395040e-02
-   37  9.9502582131827453e-05  5.1780818131549888e-17 -4.2881235234728608e-02
-   38 -8.9376686817744123e-05  3.9953386427840043e-06  6.5900411970681763e-02
-   39 -9.9550461818177349e-05 -5.0740661672321608e-17 -4.2881244934311093e-02
-   40  8.9358399770403624e-05  3.9749130157660754e-06  6.5900379165395012e-02
-   41 -2.7578389951520938e-03  4.5756190415085270e-17 -4.1533158826483570e-02
-   42  2.9457391733397973e-04 -2.5037988057731659e-05  6.6888509865507983e-02
-   43  2.7484214272898382e-04  2.2246473326686944e-17 -4.2197913495242927e-02
-   44 -1.2589020697706568e-03 -1.1188638120596731e-03  6.5272346190055355e-02
-   45 -2.7578389951520886e-03  4.0782412948808019e-17 -4.1533158826483549e-02
-   46  2.9457391733400050e-04 -2.5037988057726919e-05  6.6888509865508053e-02
-   47  2.7484214272895785e-04 -3.1658915194813543e-17 -4.2197913495243017e-02
-   48 -1.2589020697706581e-03 -1.1188638120597041e-03  6.5272346190055328e-02
-run_vdwl: -1.23199571764252
+    1  3.6704505238833174e-03 -8.5656009736481448e-04  4.1191444583741792e-02
+    2  1.1686304633146372e-03  1.4729584018140481e-03 -7.1255303478677687e-02
+    3 -7.9006214430815506e-04 -8.9702261327957169e-04  4.1814552815387790e-02
+    4  5.0813941535022590e-04  7.5226549440562398e-05 -6.3436246326155160e-02
+    5  2.4094086316230620e-03  1.1493012829934986e-03  4.0583005477936335e-02
+    6  2.1422294207205303e-03  1.3655176116431427e-03 -6.6330437867913400e-02
+    7  4.8857202733681212e-04 -8.3890161524717316e-04  4.1010122743153174e-02
+    8 -2.6253592699607576e-04 -3.7449972132109170e-04 -6.8110534561197797e-02
+    9 -4.5618889139013158e-05 -4.8612181125458771e-04  4.2947567128669664e-02
+   10  8.4898584328510539e-04  2.5723125827342269e-04 -6.8511442790721785e-02
+   11  7.8987470721455393e-05 -8.1846109260194741e-04  4.4565180655765813e-02
+   12  1.0719941499454150e-03  1.5887178976417405e-04 -6.5290607843250886e-02
+   13  8.2976868796629660e-04 -2.7228777351535232e-04  4.4027286825985064e-02
+   14  1.2641799120364366e-04  8.4753137008232666e-04 -6.8776483710975236e-02
+   15 -9.3971909503349734e-04 -1.5103202526082864e-03  4.2886036167252596e-02
+   16  8.7567786967665388e-05  7.2956204355222173e-04 -6.5669769617765258e-02
+   17  4.3432017477567058e-04 -1.6965612487661948e-03  4.2744452842837566e-02
+   18  8.3941353084066473e-04  4.0493293883253476e-04 -6.3871438029649660e-02
+   19 -5.4381320918428999e-04 -9.7030380412054819e-04  4.3185603252586670e-02
+   20 -9.1930073722010328e-04  1.2861790483301410e-03 -6.0621042107391755e-02
+   21  4.7840221336411441e-04 -1.6393514669338562e-03  3.9777134110375104e-02
+   22 -7.9771913123767644e-05  7.4546176337635236e-04 -6.2148844940719448e-02
+   23 -2.6104288591186618e-03  9.2017355376193273e-04  4.1537243526647463e-02
+   24 -1.0255308653845333e-03 -5.4502867569371401e-04 -6.5373495496634057e-02
+   25 -9.4960140784434511e-04 -1.7019717784014579e-05 -4.2697506345307210e-02
+   26  1.2344722560936336e-03 -3.8349946011568149e-05  7.0636093375678902e-02
+   27  1.2428953995717636e-03 -1.6532144426257725e-03 -4.1748374073562071e-02
+   28 -6.5888091276410186e-04  6.9803078036718467e-05  6.2023125313055351e-02
+   29 -1.1714493859076639e-03  1.6597167563551329e-03 -4.3224957906713900e-02
+   30  8.9057038012172948e-04 -1.9959394520495783e-03  6.6249589884535359e-02
+   31  2.4328395299393108e-03  6.2211658698696536e-04 -4.1255680072499357e-02
+   32 -1.2886977697624180e-04  4.9707075886967940e-04  6.8385848619119949e-02
+   33  3.1108062630869678e-04  1.7256636914627522e-03 -4.3713256703242123e-02
+   34 -6.1682250345716956e-04 -1.0668475351233773e-04  6.7987777588143339e-02
+   35  7.8440122828677501e-04  5.7128161368852229e-04 -4.2120516004724093e-02
+   36 -1.3214342195871380e-03 -2.8705014290814758e-05  6.3580066381277237e-02
+   37 -1.7646996651863847e-03  1.2578520157736357e-03 -4.3118574062115451e-02
+   38  4.1583190169441463e-04 -3.0503217005470453e-05  7.0105349729387395e-02
+   39 -1.3062783065386561e-03 -1.1031484516492020e-03 -4.2166922219325394e-02
+   40  1.0305890899256890e-03 -3.4586178800178024e-04  6.2921201933323206e-02
+   41 -3.6508576993639027e-03  6.6871723181689390e-04 -4.0240881680364514e-02
+   42 -6.4043946608870108e-04 -2.6284729289265075e-04  6.8674098703166320e-02
+   43 -3.9082881164995934e-04 -2.2938708144633622e-04 -4.3609890368044239e-02
+   44 -1.2383724658718181e-03 -2.7315617816773988e-04  6.1613431116180284e-02
+   45 -2.2137967458001860e-03 -6.5794077112197777e-04 -3.8836095682756616e-02
+   46  1.0465055526229891e-03  1.4402940837347089e-04  6.3327626322980932e-02
+   47  3.9583157938213030e-04  8.6660222810260945e-04 -4.3627560931968463e-02
+   48 -1.6991928687015354e-03  1.5237729793566654e-04  6.3982023724488440e-02
+run_vdwl: -1.2323407220805949
 run_coul: 0
 run_stress: ! |-
-  -1.1008368563459114e+00 -1.1059521765455493e+00  1.9490358494782456e-01  0.0000000000000000e+00  0.0000000000000000e+00 -1.5182325192586004e-02
+  -1.0997973993429271e+00 -1.1029717427552215e+00  1.9216131055165983e-01 -8.9401661692762907e-04 -2.6573168774115911e-02  4.9223159479302100e-03
 run_forces: ! |2
-    1  2.7578115049012742e-03 -1.9626239461520076e-08  4.1533149398200540e-02
-    2  1.2588780003755895e-03  1.1188632817004094e-03 -6.5269251575709356e-02
-    3 -2.7478278369621328e-04 -8.0919896562527821e-09  4.2197938643984578e-02
-    4 -2.9453830408723066e-04  2.5020943380932455e-05 -6.6885376194640786e-02
-    5  2.7578115049012399e-03 -1.9626239401238435e-08  4.1533149398200533e-02
-    6  1.2588780003755804e-03  1.1188632817005241e-03 -6.5269251575709369e-02
-    7 -2.7478278369620027e-04 -8.0919897266175031e-09  4.2197938643984703e-02
-    8 -2.9453830408726275e-04  2.5020943380984985e-05 -6.6885376194640717e-02
-    9 -9.9547742435301782e-05  5.3780414950783170e-10  4.2881247142594836e-02
-   10 -8.9376031411733843e-05 -3.9945836714521966e-06 -6.5897312884941883e-02
-   11  9.9499863028555701e-05  5.3758629572208002e-10  4.2881237442533686e-02
-   12  8.9357744478893550e-05 -3.9741580967872346e-06 -6.5897280081132562e-02
-   13 -9.9547742435326502e-05  5.3780415244873009e-10  4.2881247142594815e-02
-   14 -8.9376031411742083e-05 -3.9945836714029874e-06 -6.5897312884941855e-02
-   15  9.9499863028584324e-05  5.3758624475780164e-10  4.2881237442533790e-02
-   16  8.9357744478909922e-05 -3.9741580967885712e-06 -6.5897280081132506e-02
-   17  2.7483809396297375e-04 -8.0923733428147151e-09  4.2197915708206225e-02
-   18  2.9456424811194113e-04  2.5041935720938094e-05 -6.6885362458577291e-02
-   19 -2.7578189357608937e-03 -1.9626405105166717e-08  4.1533136162484115e-02
-   20 -1.2588856574676647e-03  1.1188638484657578e-03 -6.5269270643456764e-02
-   21  2.7483809396295635e-04 -8.0923732598465674e-09  4.2197915708206198e-02
-   22  2.9456424811196807e-04  2.5041935720825544e-05 -6.6885362458577347e-02
-   23 -2.7578189357608239e-03 -1.9626405201000025e-08  4.1533136162484163e-02
-   24 -1.2588856574676222e-03  1.1188638484657888e-03 -6.5269270643456764e-02
-   25 -2.7478267042781689e-04  7.1340099726084627e-09 -4.2197938717095443e-02
-   26  1.2588775889140107e-03 -1.1188640762445925e-03  6.5269251688086116e-02
-   27  2.7578100488037834e-03  2.0885614337388253e-08 -4.1533148778323065e-02
-   28 -2.9453931478136321e-04 -2.5020438627362798e-05  6.6885376801770646e-02
-   29 -2.7478267042784551e-04  7.1340098782286636e-09 -4.2197938717095346e-02
-   30  1.2588775889140823e-03 -1.1188640762446068e-03  6.5269251688086075e-02
-   31  2.7578100488038111e-03  2.0885614449061077e-08 -4.1533148778323238e-02
-   32 -2.9453931478134934e-04 -2.5020438627452736e-05  6.6885376801770674e-02
-   33  9.9499775923898881e-05 -4.3747681398428797e-10 -4.2881238156016258e-02
-   34 -8.9376188707950260e-05  3.9944719903915248e-06  6.5897312332129893e-02
-   35 -9.9547655306991140e-05 -4.3773580745386231e-10 -4.2881247856090716e-02
-   36  8.9357901801402086e-05  3.9740463921778550e-06  6.5897279528304625e-02
-   37  9.9499775923880232e-05 -4.3747670817970846e-10 -4.2881238156016264e-02
-   38 -8.9376188707982352e-05  3.9944719903545984e-06  6.5897312332129851e-02
-   39 -9.9547655306996777e-05 -4.3773581847206689e-10 -4.2881247856090876e-02
-   40  8.9357901801374873e-05  3.9740463922260334e-06  6.5897279528304431e-02
-   41 -2.7578174796584810e-03  2.0885758518950235e-08 -4.1533135542592893e-02
-   42  2.9456525880115910e-04 -2.5041430978732462e-05  6.6885363065714659e-02
-   43  2.7483798066595783e-04  7.1344129854552851e-09 -4.2197915781289633e-02
-   44 -1.2588852460277825e-03 -1.1188646429977976e-03  6.5269270755856881e-02
-   45 -2.7578174796584042e-03  2.0885758549338389e-08 -4.1533135542592900e-02
-   46  2.9456525880111129e-04 -2.5041430978583333e-05  6.6885363065714618e-02
-   47  2.7483798066597242e-04  7.1344129112194118e-09 -4.2197915781289751e-02
-   48 -1.2588852460277678e-03 -1.1188646429978574e-03  6.5269270755856937e-02
+    1  3.6704277244667587e-03 -8.5658919117837212e-04  4.1191414175853695e-02
+    2  1.1686230931329173e-03  1.4729477662173724e-03 -7.1251760016220855e-02
+    3 -7.9004790339973381e-04 -8.9701338917496677e-04  4.1814539913402199e-02
+    4  5.0813591144889536e-04  7.5231239227128272e-05 -6.3433381263633765e-02
+    5  2.4093859320673192e-03  1.1492652204168237e-03  4.0582992641865316e-02
+    6  2.1421973197266243e-03  1.3655087332524118e-03 -6.6327289076912474e-02
+    7  4.8857125455762339e-04 -8.3890475839157330e-04  4.1010166991166115e-02
+    8 -2.6252293235319059e-04 -3.7448328717136416e-04 -6.8107296512654250e-02
+    9 -4.5617528947323408e-05 -4.8612919830625729e-04  4.2947563969449536e-02
+   10  8.4896568728670208e-04  2.5721668905168501e-04 -6.8508143024552937e-02
+   11  7.9002820038977370e-05 -8.1846278515754147e-04  4.4565168058603076e-02
+   12  1.0719661316084715e-03  1.5886888950254413e-04 -6.5287603573858155e-02
+   13  8.2976049917073613e-04 -2.7229626113208568e-04  4.4027260160056078e-02
+   14  1.2641994946759787e-04  8.4751320391575997e-04 -6.8773136978292557e-02
+   15 -9.3970695971524315e-04 -1.5103229550957231e-03  4.2886045691579347e-02
+   16  8.7570546763918677e-05  7.2954145458750382e-04 -6.5666736342869625e-02
+   17  4.3433078264718412e-04 -1.6965377983918077e-03  4.2744447240288586e-02
+   18  8.3939793364319669e-04  4.0492250115430891e-04 -6.3868398606238774e-02
+   19 -5.4383027722561142e-04 -9.7031407104404479e-04  4.3185570539974218e-02
+   20 -9.1928268785672915e-04  1.2861824709901476e-03 -6.0618292140364884e-02
+   21  4.7841090009416107e-04 -1.6393339301988938e-03  3.9777162973257008e-02
+   22 -7.9775883020756261e-05  7.4544527532379964e-04 -6.2146004596023145e-02
+   23 -2.6104093087951697e-03  9.2014438370599939e-04  4.1537221494509453e-02
+   24 -1.0255151864740422e-03 -5.4498519956392951e-04 -6.5370473552257946e-02
+   25 -9.4959169309045575e-04 -1.7018039012474395e-05 -4.2697496256975970e-02
+   26  1.2344495867245694e-03 -3.8370673380269758e-05  7.0632582403421879e-02
+   27  1.2428967009875331e-03 -1.6531608659394025e-03 -4.1748358234908044e-02
+   28 -6.5886686581895400e-04  6.9797448177834955e-05  6.2020287126584923e-02
+   29 -1.1714497050630706e-03  1.6597133714093197e-03 -4.3224947348511476e-02
+   30  8.9055962568533814e-04 -1.9959187617719560e-03  6.6246440342255547e-02
+   31  2.4328239392956154e-03  6.2214569312400931e-04 -4.1255663018001446e-02
+   32 -1.2886455296015837e-04  4.9705269314680080e-04  6.8382596224289494e-02
+   33  3.1106849764848282e-04  1.7256403450447376e-03 -4.3713239720373692e-02
+   34 -6.1681221359189548e-04 -1.0667622773528310e-04  6.7984487100161320e-02
+   35  7.8438614052878846e-04  5.7129184828285566e-04 -4.2120541014401894e-02
+   36 -1.3214010734594332e-03 -2.8698936855300100e-05  6.3577101615876680e-02
+   37 -1.7646787377185969e-03  1.2578426248841964e-03 -4.3118570210133822e-02
+   38  4.1581902109396034e-04 -3.0496800609577946e-05  7.0101977339004792e-02
+   39 -1.3062650414300365e-03 -1.1031265382733892e-03 -4.2166930126020727e-02
+   40  1.0305669350427777e-03 -3.4584238149556665e-04  6.2918234998817421e-02
+   41 -3.6508263792337666e-03  6.6871501711911641e-04 -4.0240875457830505e-02
+   42 -6.4043563425334902e-04 -2.6284078549004705e-04  6.8670949820558838e-02
+   43 -3.9082998872544492e-04 -2.2936260697189366e-04 -4.3609870908952908e-02
+   44 -1.2383631333186497e-03 -2.7316999371132289e-04  6.1610666172108003e-02
+   45 -2.2137870003022661e-03 -6.5791927225205161e-04 -3.8836093285544354e-02
+   46  1.0464904451784837e-03  1.4403449019820825e-04  6.3324762440917018e-02
+   47  3.9582054731925130e-04  8.6660577748977786e-04 -4.3627558648003627e-02
+   48 -1.6991672388720820e-03  1.5234757208263419e-04  6.3979020479536977e-02
 ...

From 2150fb74131e6df8600c1cef1b8bfc654dda9288 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 15:41:42 -0400
Subject: [PATCH 094/437] adjust epsilon for portability

---
 unittest/force-styles/tests/fix-timestep-addtorque_const.yaml | 2 +-
 unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
index 00041030fd..011aa3af02 100644
--- a/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
+++ b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:22:56 2021
-epsilon: 9e-12
+epsilon: 1.5e-11
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
index 6ed72bd4ac..60d74f61de 100644
--- a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
+++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:15:09 2021
-epsilon: 2e-13
+epsilon: 4e-13
 skip_tests:
 prerequisites: ! |
   atom full

From 588f821ac8b44f35367948f9d6f5e0377882e0f7 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Tue, 24 Aug 2021 13:46:29 -0600
Subject: [PATCH 095/437] add support for text output and restart output

---
 src/EXTRA-FIX/fix_ttm.cpp      |  69 ++++++++++++++++---
 src/EXTRA-FIX/fix_ttm.h        |  12 ++--
 src/EXTRA-FIX/fix_ttm_grid.cpp | 120 +++++++++++++++++++++++++--------
 src/EXTRA-FIX/fix_ttm_grid.h   |   4 +-
 4 files changed, 163 insertions(+), 42 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 798ab97dca..4da2721ac4 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -21,6 +21,7 @@
 
 #include 
 #include 
+#include 
 #include "atom.h"
 #include "force.h"
 #include "update.h"
@@ -52,7 +53,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   T_electron(nullptr), T_electron_old(nullptr), 
   net_energy_transfer(nullptr), net_energy_transfer_all(nullptr)
 {
-  if (narg != 14) error->all(FLERR,"Illegal fix ttm command");
+  if (narg < 13) error->all(FLERR,"Illegal fix ttm command");
 
   vector_flag = 1;
   size_vector = 2;
@@ -73,9 +74,25 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   nygrid = utils::inumeric(FLERR,arg[11],false,lmp);
   nzgrid = utils::inumeric(FLERR,arg[12],false,lmp);
 
-  int n = strlen(arg[13]) + 1;
-  infile = new char[n];
-  strcpy(infile,arg[13]);
+  infile = outfile = NULL;
+
+  int iarg = 13;
+  while (iarg < narg) {
+    if (strcmp(arg[iarg],"infile") == 0) {
+      if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm command");
+      int n = strlen(arg[iarg+1]) + 1;
+      infile = new char[n];
+      strcpy(infile,arg[iarg+1]);
+      iarg += 2;
+    } else if (strcmp(arg[iarg],"outfile") == 0) {
+      if (iarg+3 > narg) error->all(FLERR,"Illegal fix ttm command");
+      outevery = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
+      int n = strlen(arg[iarg+2]) + 1;
+      outfile = new char[n];
+      strcpy(outfile,arg[iarg+2]);
+      iarg += 3;
+    } else error->all(FLERR,"Illegal fix ttm command");
+  }
 
   // error check
 
@@ -162,6 +179,10 @@ void FixTTM::post_constructor()
 
   allocate_grid();
 
+  // zero electron temperatures (default)
+
+  memset(&T_electron[0][0][0],0,ngridtotal*sizeof(double));
+
   // zero net_energy_transfer
   // in case compute_vector accesses it on timestep 0
 
@@ -170,7 +191,7 @@ void FixTTM::post_constructor()
 
   // set initial electron temperatures from user input file
 
-  read_electron_temperatures(infile);
+  if (infile) read_electron_temperatures(infile);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -413,18 +434,28 @@ void FixTTM::end_of_step()
               (T_electron_old[iz][right_ynode][ix] +
                T_electron_old[iz][left_ynode][ix] -
                2*T_electron_old[iz][iy][ix])/dy/dy +
-              (T_electron_old[right_znode][iy][iz] +
+              (T_electron_old[right_znode][iy][ix] +
                T_electron_old[left_znode][iy][ix] -
                2*T_electron_old[iz][iy][ix])/dz/dz) -
              
              (net_energy_transfer_all[iz][iy][ix])/del_vol);
         }
   }
+
+  // output of grid temperatures to file
+
+  if (outfile && (update->ntimestep % outevery == 0)) {
+    char *newfile = new char[strlen(outfile) + 16];
+    strcpy(newfile,outfile);
+    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
+
+    write_electron_temperatures((const char *) newfile);
+  }
 }
 
 /* ----------------------------------------------------------------------
    read in initial electron temperatures from a user-specified file
-   only called by proc 0
+   only read by proc 0, grid values are Bcast to other procs
 ------------------------------------------------------------------------- */
 
 void FixTTM::read_electron_temperatures(const char *filename)
@@ -476,13 +507,35 @@ void FixTTM::read_electron_temperatures(const char *filename)
     for (int iy = 0; iy < nygrid; iy++)
       for (int ix = 0; ix < nxgrid; ix++)
         if (T_initial_set[iz][iy][ix] == 0)
-          error->one(FLERR,"Initial temperatures not all set in fix ttm");
+          error->all(FLERR,"Fix ttm infile did not set all temperatures");
 
   memory->destroy(T_initial_set);
 
   MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);
 }
 
+/* ----------------------------------------------------------------------
+   write out current electron temperatures to user-specified file
+   only written by proc 0
+------------------------------------------------------------------------- */
+
+void FixTTM::write_electron_temperatures(const char *filename)
+{
+  if (comm->me) return;
+ 
+  FILE *fp = fopen(filename,"w");
+  if (!fp) error->one(FLERR,"Fix ttm could not open output file");
+
+  int ix,iy,iz;
+
+  for (iz = 0; iz < nzgrid; iz++)
+    for (iy = 0; iy < nygrid; iy++)
+      for (ix = 0; ix < nxgrid; ix++)
+        fprintf(fp,"%d %d %d %20.16g\n",ix,iy,iz,T_electron[iz][iy][ix]);
+
+  fclose(fp);
+}
+
 /* ---------------------------------------------------------------------- */
 
 void FixTTM::reset_dt()
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index 0b8900977e..9d48339a70 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -54,22 +54,24 @@ class FixTTM : public Fix {
   int nxgrid, nygrid, nzgrid;     // size of global grid
   int ngridtotal;                 // total size of global grid
   int deallocate_flag;
-  int outflag;
+  int outflag,outevery;
   double shift;
   double e_energy,transfer_energy;
+  char *infile,*outfile;
 
   class RanMars *random;
-  char *infile;
-  double *gfactor1, *gfactor2, *ratio, **flangevin;
-  double ***T_electron, ***T_electron_old;
-  double ***net_energy_transfer, ***net_energy_transfer_all;
   double electronic_specific_heat, electronic_density;
   double electronic_thermal_conductivity;
   double gamma_p, gamma_s, v_0, v_0_sq;
 
+  double *gfactor1, *gfactor2, *ratio, **flangevin;
+  double ***T_electron, ***T_electron_old;
+  double ***net_energy_transfer, ***net_energy_transfer_all;
+
   virtual void allocate_grid();
   virtual void deallocate_grid();
   virtual void read_electron_temperatures(const char *);
+  virtual void write_electron_temperatures(const char *);
 };
 
 }    // namespace LAMMPS_NS
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index b9e52b1d68..5e7eb225c7 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -38,7 +38,9 @@ using namespace FixConst;
 static constexpr int MAXLINE = 256;
 static constexpr int CHUNK = 1024;
 
-#define OFFSET 16384
+//#define OFFSET 16384
+
+#define OFFSET 0
 
 /* ---------------------------------------------------------------------- */
 
@@ -65,6 +67,10 @@ void FixTTMGrid::post_constructor()
 
   allocate_grid();
 
+  // zero electron temperatures (default)
+
+  memset(&T_electron[nzlo_out][nylo_out][nxlo_out],0,ngridout*sizeof(double));
+  
   // zero net_energy_transfer
   // in case compute_vector accesses it on timestep 0
 
@@ -74,7 +80,7 @@ void FixTTMGrid::post_constructor()
 
   // set initial electron temperatures from user input file
 
-  read_electron_temperatures(infile);
+  if (infile) read_electron_temperatures(infile);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -247,6 +253,16 @@ void FixTTMGrid::end_of_step()
 
   gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
                    gc_buf1,gc_buf2,MPI_DOUBLE);
+
+  // output of grid temperatures to file
+
+  if (outfile && (update->ntimestep % outevery == 0)) {
+    char *newfile = new char[strlen(outfile) + 16];
+    strcpy(newfile,outfile);
+    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
+
+    write_electron_temperatures((const char *) newfile);
+  }
 }
 
 /* ----------------------------------------------------------------------
@@ -261,9 +277,10 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
 
   int me = comm->me;
 
-  // initialize my own+ghost grid values to zero
-
-  memset(&T_electron[nzlo_out][nylo_out][nxlo_out],0,ngridout*sizeof(double));
+  int ***T_initial_set;
+  memory->create3d_offset(T_initial_set,nzlo_in,nzhi_in,nylo_in,nyhi_in,
+                          nxlo_in,nxhi_in,"ttm/grid:T_initial_set");
+  memset(&T_initial_set[nzlo_in][nylo_in][nxlo_in],0,ngridmine*sizeof(int));
 
   // proc 0 opens file
 
@@ -320,9 +337,11 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
       
       if (ix >= nxlo_in && ix <= nxhi_in &&
           iy >= nylo_in && iy <= nyhi_in &&
-          iz >= nzlo_in && iz <= nzhi_in)
+          iz >= nzlo_in && iz <= nzhi_in) {
         T_electron[iz][iy][ix] = utils::numeric(FLERR,values[3],true,lmp);
-      
+        T_initial_set[iz][iy][ix] = 1;
+      }
+
       buf = next + 1;
     }
 
@@ -338,20 +357,24 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
   delete [] values;
   delete [] buffer;
 
-  // check that all owned temperature values are > 0.0
+  // check completeness of input data
 
   int flag = 0;
 
   for (iz = nzlo_in; iz <= nzhi_in; iz++)
     for (iy = nylo_in; iy <= nyhi_in; iy++)
       for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        if (T_electron[iz][iy][ix] <= 0.0) flag = 1;
+        if (T_initial_set[iz][iy][ix] == 0) {
+          flag = 1;
+          printf("UNSET %d %d %d\n",ix,iy,iz);
+        }
 
   int flagall;
   MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
   if (flagall) 
-    error->all(FLERR,
-               "Fix ttm infile did not set all temperatures or some are <= 0.0");
+    error->all(FLERR,"Fix ttm/grid infile did not set all temperatures");
+
+  memory->destroy3d_offset(T_initial_set,nzlo_in,nylo_in,nxlo_in);
 
   // communicate new T_electron values to ghost grid points
 
@@ -359,6 +382,23 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
                    gc_buf1,gc_buf2,MPI_DOUBLE);
 }
 
+/* ----------------------------------------------------------------------
+   write out current electron temperatures to user-specified file
+   only written by proc 0
+------------------------------------------------------------------------- */
+
+void FixTTMGrid::write_electron_temperatures(const char *filename)
+{
+  if (comm->me == 0) {
+    FPout = fopen(filename,"w");
+    if (!FPout) error->one(FLERR,"Fix ttm/grid could not open output file");
+  }
+
+  gc->gather(GridComm::FIX,this,1,sizeof(double),1,NULL,MPI_DOUBLE);
+  
+  if (comm->me == 0) fclose(FPout);
+}
+
 /* ----------------------------------------------------------------------
    pack own values to buf to send to another proc
 ------------------------------------------------------------------------- */
@@ -417,6 +457,14 @@ void FixTTMGrid::unpack_reverse_grid(int flag, void *vbuf, int nlist, int *list)
 
 void FixTTMGrid::allocate_grid()
 {
+  // partition global grid across procs
+  // n xyz lo/hi in = lower/upper bounds of global grid this proc owns
+  // indices range from 0 to N-1 inclusive in each dim
+
+  comm->partition_grid(nxgrid,nygrid,nzgrid,0.0,
+                       nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in);
+
+  /*
   // global indices of grid range from 0 to N-1
   // nlo_in,nhi_in = lower/upper limits of the 3d sub-brick of
   //   global grid that I own without ghost cells
@@ -442,6 +490,7 @@ void FixTTMGrid::allocate_grid()
     nzlo_in = static_cast (comm->mysplit[1][0] * nzgrid);
     nzhi_in = static_cast (comm->mysplit[1][1] * nzgrid) - 1;
   }
+  */
 
   // nlo,nhi = min/max index of global grid pt my owned atoms can be mapped to
   // finite difference stencil requires extra grid pt around my owned grid pts
@@ -480,6 +529,10 @@ void FixTTMGrid::allocate_grid()
     error->one(FLERR,"Too many owned+ghost grid points in fix ttm");
   ngridout = totalmine;
 
+  totalmine = (bigint) (nxhi_in-nxlo_in+1) * (nyhi_in-nylo_in+1) * 
+    (nzhi_in-nzlo_in+1);
+  ngridmine = totalmine;
+
   gc = new GridComm(lmp,world,nxgrid,nygrid,nzgrid,
                     nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in,
                     nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out);
@@ -520,8 +573,9 @@ void FixTTMGrid::write_restart(FILE *fp)
 {
   int ix,iy,iz;
 
+  int rsize = nxgrid*nygrid*nzgrid + 4;
   double *rlist;
-  memory->create(rlist,nxgrid*nygrid*nzgrid+4,"ttm/grid:rlist");
+  memory->create(rlist,rsize,"ttm/grid:rlist");
 
   int n = 0;
   rlist[n++] = nxgrid;
@@ -533,15 +587,10 @@ void FixTTMGrid::write_restart(FILE *fp)
 
   gc->gather(GridComm::FIX,this,1,sizeof(double),0,&rlist[4],MPI_DOUBLE);
 
-  for (iz = nzlo_in; iz <= nzhi_in; iz++)
-    for (iy = nylo_in; iy <= nyhi_in; iy++)
-      for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        rlist[n++] =  T_electron[iz][iy][ix];
-
   if (comm->me == 0) {
-    int size = n * sizeof(double);
+    int size = rsize * sizeof(double);
     fwrite(&size,sizeof(int),1,fp);
-    fwrite(rlist,sizeof(double),n,fp);
+    fwrite(rlist,sizeof(double),rsize,fp);
   }
 
   memory->destroy(rlist);
@@ -588,6 +637,7 @@ void FixTTMGrid::restart(char *buf)
 
 /* ----------------------------------------------------------------------
    pack values from local grid into buf
+   used by which = 0 and 1
 ------------------------------------------------------------------------- */
 
 void FixTTMGrid::pack_gather_grid(int which, void *vbuf)
@@ -604,7 +654,8 @@ void FixTTMGrid::pack_gather_grid(int which, void *vbuf)
 }
 
 /* ----------------------------------------------------------------------
-   unpack values from buf into global gbuf based on their indices
+   which = 0: unpack values from buf into global gbuf based on their indices
+   which = 1: print values from buf to FPout file
 ------------------------------------------------------------------------- */
 
 void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
@@ -616,15 +667,28 @@ void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
   double *buf = (double *) vbuf;
   double *gbuf = (double *) vgbuf;
 
-  int iglobal;
-  int ilocal = 0;
+  if (which == 0) {
+    int iglobal;
+    int ilocal = 0;
 
-  for (iz = zlo; iz <= zhi; iz++)
-    for (iy = ylo; iy <= yhi; iy++)
-      for (ix = xlo; ix <= xhi; ix++) {
-        iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
-        gbuf[iglobal] = buf[ilocal++];
-      }
+    for (iz = zlo; iz <= zhi; iz++)
+      for (iy = ylo; iy <= yhi; iy++)
+        for (ix = xlo; ix <= xhi; ix++) {
+          iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
+          gbuf[iglobal] = buf[ilocal++];
+        }
+
+  } else if (which == 1) {
+    int ilocal = 0;
+    double value;
+
+    for (iz = zlo; iz <= zhi; iz++)
+      for (iy = ylo; iy <= yhi; iy++)
+        for (ix = xlo; ix <= xhi; ix++) {
+          value = buf[ilocal++];
+          fprintf(FPout,"%d %d %d %20.16g\n",ix,iy,iz,value);
+        }
+  }
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/EXTRA-FIX/fix_ttm_grid.h b/src/EXTRA-FIX/fix_ttm_grid.h
index dec5ca871b..526306c6c7 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.h
+++ b/src/EXTRA-FIX/fix_ttm_grid.h
@@ -48,11 +48,12 @@ class FixTTMGrid : public FixTTM {
   double memory_usage();
 
  private:
-  int ngridout;
+  int ngridmine,ngridout;
   int nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in;
   int nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out;
   double delxinv,delyinv,delzinv;
   double skin_original;
+  FILE *FPout;
 
   class GridComm *gc;
   int ngc_buf1,ngc_buf2;
@@ -61,6 +62,7 @@ class FixTTMGrid : public FixTTM {
   void allocate_grid();
   void deallocate_grid();
   void read_electron_temperatures(const char *);
+  void write_electron_temperatures(const char *);
 };
 
 }    // namespace LAMMPS_NS

From dfc03bd10753a85dd1bbcbcb07a88ab1534f1da3 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 15:49:41 -0400
Subject: [PATCH 096/437] avoid 32bit integer overflow on 64-bit storage sizes

---
 src/fix_property_atom.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp
index 7df49f4bc4..bd214fc049 100644
--- a/src/fix_property_atom.cpp
+++ b/src/fix_property_atom.cpp
@@ -485,8 +485,8 @@ double FixPropertyAtom::memory_usage()
     else if (style[m] == RMASS) bytes = atom->nmax * sizeof(double);
     else if (style[m] == IVEC) bytes = atom->nmax * sizeof(int);
     else if (style[m] == DVEC) bytes = atom->nmax * sizeof(double);
-    else if (style[m] == IARRAY) bytes = atom->nmax * cols[m] * sizeof(int);
-    else if (style[m] == DARRAY) bytes = atom->nmax * cols[m] * sizeof(double);
+    else if (style[m] == IARRAY) bytes = (size_t) atom->nmax * cols[m] * sizeof(int);
+    else if (style[m] == DARRAY) bytes = (size_t) atom->nmax * cols[m] * sizeof(double);
   }
   return bytes;
 }
@@ -523,11 +523,11 @@ void FixPropertyAtom::grow_arrays(int nmax)
       memset(&atom->dvector[index[nv]][nmax_old],0,nbytes);
     } else if (style[nv] == IARRAY) {
       memory->grow(atom->iarray[index[nv]],nmax,cols[nv],"atom:iarray");
-      size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(int);
+      size_t nbytes = (size_t) (nmax-nmax_old) * cols[nv] * sizeof(int);
       if (nbytes) memset(&atom->iarray[index[nv]][nmax_old][0],0,nbytes);
     } else if (style[nv] == DARRAY) {
       memory->grow(atom->darray[index[nv]],nmax,cols[nv],"atom:darray");
-      size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(double);
+      size_t nbytes = (size_t) (nmax-nmax_old) * cols[nv] * sizeof(double);
       if (nbytes) memset(&atom->darray[index[nv]][nmax_old][0],0,nbytes);
     }
   }

From ccbf39d2c916e74308a7b3fa4ad499d57c600e1f Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 16:00:26 -0400
Subject: [PATCH 097/437] add unit tests using pppm and ewald with a tilted box

---
 .../tests/kspace-ewald_tilted.yaml            | 94 +++++++++++++++++++
 .../tests/kspace-pppm_tilted.yaml             | 92 ++++++++++++++++++
 2 files changed, 186 insertions(+)
 create mode 100644 unittest/force-styles/tests/kspace-ewald_tilted.yaml
 create mode 100644 unittest/force-styles/tests/kspace-pppm_tilted.yaml

diff --git a/unittest/force-styles/tests/kspace-ewald_tilted.yaml b/unittest/force-styles/tests/kspace-ewald_tilted.yaml
new file mode 100644
index 0000000000..18d6278187
--- /dev/null
+++ b/unittest/force-styles/tests/kspace-ewald_tilted.yaml
@@ -0,0 +1,94 @@
+---
+lammps_version: 30 Jul 2021
+date_generated: Tue Aug 24 16:00:03 2021
+epsilon: 8.5e-14
+skip_tests:
+prerequisites: ! |
+  atom full
+  pair coul/long
+  kspace ewald
+pre_commands: ! ""
+post_commands: ! |
+  pair_modify mix arithmetic
+  pair_modify table 0
+  pair_modify compute no
+  group none empty
+  change_box all triclinic
+  change_box none xy final 0.5 xz final 0.5 yz final 0.5
+  kspace_style ewald 1.0e-6
+  kspace_modify gewald 0.3
+input_file: in.fourmol
+pair_style: coul/long 8.0
+pair_coeff: ! |
+  * *
+extract: ! ""
+natoms: 29
+init_vdwl: 0
+init_coul: 0
+init_stress: ! |2-
+   0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00
+init_forces: ! |2
+    1 -5.3448670515756946e-01  7.8599782106382812e-02  2.0710927588803751e-01
+    2  2.2178420089971082e-01 -2.7643402434627568e-01 -1.2760374351052742e-01
+    3 -3.4754319998885001e-02 -9.3504708496478690e-03  1.9886382422593211e-02
+    4  1.6445863380462616e-01  2.8359395290019698e-02 -7.8729303809635401e-02
+    5  1.6233641307706351e-01  7.5986707200382503e-02 -3.6930511107003808e-02
+    6  5.6637631370696451e-01  4.1893463304019041e-01 -6.7664491982745634e-01
+    7 -3.3948920528780069e-01 -3.9999223701116160e-01  4.0048374439634377e-01
+    8 -1.4238445302733072e-01 -6.2030995164738334e-01  3.3646022882523446e-01
+    9  1.8321468690702236e-01  3.2329505791288987e-01  5.5419174179294289e-02
+   10 -5.1536377515236292e-02  1.1099268040025226e-01 -1.4084559805296692e-02
+   11 -8.4444394935712291e-02  1.5159947723172223e-01 -3.9463118427389220e-02
+   12  4.5970202214672301e-01 -4.2545537704155284e-01  3.2406840753999723e-02
+   13 -1.5666599035798093e-01  1.1527633374087305e-01  2.7654374124323384e-02
+   14 -1.7363583497646881e-01  1.3581078235758284e-01  1.0662571297963025e-02
+   15 -1.3881062069365652e-01  8.5530348257713926e-02 -1.3048746581823758e-02
+   16 -3.3884433626020932e-01  4.3401859035700502e-01  5.3769217618752685e-01
+   17  1.3001440137507966e-01 -4.1589115651366521e-01 -7.9670451166464484e-01
+   18  7.5681379375335611e-01  1.5582935725479723e+00 -1.4210097554885777e+00
+   19 -2.8085336420242663e-01 -7.8741407964003718e-01  7.8245857403750418e-01
+   20 -4.0594967301158125e-01 -7.0553497589712044e-01  7.5613349420219689e-01
+   21  5.0704592271800275e-01  5.6580880704147107e-01 -1.1619399232386021e+00
+   22 -2.8704161808189710e-01 -1.3216031203060810e-01  5.8097825566381744e-01
+   23 -2.8642030339820157e-01 -3.0776190804563458e-01  5.5724240346862619e-01
+   24  8.9772331662676536e-02  1.7084621364125749e+00 -3.1646797639105334e-01
+   25  1.3203890191695800e-01 -6.8368673665866730e-01  2.4609923757704671e-01
+   26 -2.4575213176251201e-01 -9.4797999409036526e-01  8.5244090147042331e-02
+   27 -8.6290089809075665e-01  1.6205604497958011e+00 -9.3012639603990466e-01
+   28  5.6895188209221181e-01 -9.0851861726847494e-01  5.3413668936060954e-01
+   29  4.2146072269782930e-01 -7.9103891265223736e-01  4.4268595335975636e-01
+run_vdwl: 0
+run_coul: 0
+run_stress: ! |2-
+   0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00
+run_forces: ! |2
+    1 -5.3334348792473663e-01  7.8785708829614623e-02  2.0952494330848997e-01
+    2  2.2047697818092868e-01 -2.7713623100478413e-01 -1.2893818878633795e-01
+    3 -3.4736144178054582e-02 -9.3340960282083715e-03  1.9999043638795875e-02
+    4  1.6460652383725125e-01  2.8241875764049424e-02 -7.9113572796586790e-02
+    5  1.6215649863110154e-01  7.5978103359921431e-02 -3.7484057379720333e-02
+    6  5.6599278205644532e-01  4.1851641614579382e-01 -6.7992950478127434e-01
+    7 -3.3968790345085564e-01 -4.0048941901454138e-01  4.0256715056329251e-01
+    8 -1.4127588913092420e-01 -6.2017022889258322e-01  3.3993571378136456e-01
+    9  1.8227911587148210e-01  3.2295764963388313e-01  5.3201479166533922e-02
+   10 -5.1700413623535821e-02  1.1111482057473794e-01 -1.4551185576318685e-02
+   11 -8.4630638764449165e-02  1.5198576029820277e-01 -3.9867702658817644e-02
+   12  4.6027933614580008e-01 -4.2553026862869375e-01  3.4381287211854843e-02
+   13 -1.5686137135126832e-01  1.1537512460453701e-01  2.7055222353983506e-02
+   14 -1.7378447342619111e-01  1.3594753630000173e-01  1.0206866580498939e-02
+   15 -1.3885301533726085e-01  8.5409407767259818e-02 -1.3828540594015035e-02
+   16 -3.4001275168031081e-01  4.3481964910483151e-01  5.3551094197240323e-01
+   17  1.3095652292939247e-01 -4.1543488278945484e-01 -7.9439775989272843e-01
+   18  7.6130155207510231e-01  1.5641161174020948e+00 -1.4166082689671402e+00
+   19 -2.8201484020970297e-01 -7.8931009820541154e-01  7.8114406552076276e-01
+   20 -4.0864600217287589e-01 -7.0869378747084499e-01  7.5398290929506750e-01
+   21  5.0731879438820993e-01  5.5710526946109051e-01 -1.1569855994010214e+00
+   22 -2.8670662557005039e-01 -1.2787743295502346e-01  5.7883709816985718e-01
+   23 -2.8655446637042009e-01 -3.0420640641646041e-01  5.5485906877201041e-01
+   24  9.1000147200901771e-02  1.7036643907704361e+00 -3.1478809556214382e-01
+   25  1.3087682966252198e-01 -6.8159119768456733e-01  2.4475033518411687e-01
+   26 -2.4585864030573110e-01 -9.4550397751699744e-01  8.4357627318536146e-02
+   27 -8.6391407541084209e-01  1.6204449844939783e+00 -9.2544999434421571e-01
+   28  5.6947333589361271e-01 -9.0807662135609435e-01  5.3159257072970112e-01
+   29  4.2186232203445834e-01 -7.9110816654676352e-01  4.4003614717305051e-01
+...
diff --git a/unittest/force-styles/tests/kspace-pppm_tilted.yaml b/unittest/force-styles/tests/kspace-pppm_tilted.yaml
new file mode 100644
index 0000000000..9e649fb584
--- /dev/null
+++ b/unittest/force-styles/tests/kspace-pppm_tilted.yaml
@@ -0,0 +1,92 @@
+---
+lammps_version: 30 Jul 2021
+date_generated: Tue Aug 24 15:57:51 2021
+epsilon: 8.5e-14
+skip_tests: gpu
+prerequisites: ! |
+  atom full
+  pair coul/long
+  kspace pppm
+pre_commands: ! ""
+post_commands: ! |
+  pair_modify compute no
+  group none empty
+  change_box all triclinic
+  change_box none xy final 0.5 xz final 0.5 yz final 0.5
+  kspace_style pppm 1.0e-6
+  kspace_modify gewald 0.3
+input_file: in.fourmol
+pair_style: coul/long 8.0
+pair_coeff: ! |
+  * *
+extract: ! ""
+natoms: 29
+init_vdwl: 0
+init_coul: 0
+init_stress: ! |2-
+   0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00
+init_forces: ! |2
+    1 -5.3455805973222437e-01  7.8698684976257607e-02  2.0711314888470955e-01
+    2  2.2184568573854779e-01 -2.7647431277628187e-01 -1.2757452052704132e-01
+    3 -3.4757340736885710e-02 -9.3470470522295339e-03  1.9885688602828643e-02
+    4  1.6445912101334906e-01  2.8345927313968042e-02 -7.8722927625643938e-02
+    5  1.6234688533111721e-01  7.5972054420001711e-02 -3.6936297075666272e-02
+    6  5.6653284543285287e-01  4.1888106452174662e-01 -6.7663104705782029e-01
+    7 -3.3961547966725153e-01 -4.0001344965273866e-01  4.0047632273598788e-01
+    8 -1.4242862568200385e-01 -6.2031296063117003e-01  3.3640454007119630e-01
+    9  1.8322344081844300e-01  3.2327686261589661e-01  5.5386729810616965e-02
+   10 -5.1553080010261633e-02  1.1100399113998416e-01 -1.4071507835405114e-02
+   11 -8.4457368938472652e-02  1.5161839580411990e-01 -3.9440958631538105e-02
+   12  4.5980547268228616e-01 -4.2545520083096022e-01  3.2346370702025180e-02
+   13 -1.5668051885818224e-01  1.1528021365610482e-01  2.7670519478048963e-02
+   14 -1.7366274753772379e-01  1.3580748800890222e-01  1.0678928186624024e-02
+   15 -1.3885054474562650e-01  8.5524833610521669e-02 -1.3032936810854641e-02
+   16 -3.3897150894267869e-01  4.3411449803827901e-01  5.3768221413168005e-01
+   17  1.3014158705307541e-01 -4.1604199493225014e-01 -7.9661148361636958e-01
+   18  7.5708876110784495e-01  1.5585543643937958e+00 -1.4210365830174345e+00
+   19 -2.8092848433130602e-01 -7.8754421733994284e-01  7.8241552040791995e-01
+   20 -4.0612757709741132e-01 -7.0559006327161899e-01  7.5613258856438037e-01
+   21  5.0705834349462331e-01  5.6563606920657128e-01 -1.1618762247785586e+00
+   22 -2.8713969353176505e-01 -1.3207924257384354e-01  5.8092858221716182e-01
+   23 -2.8635179770885089e-01 -3.0768005507572388e-01  5.5725013443463101e-01
+   24  8.9526815583228531e-02  1.7085267386261080e+00 -3.1637922752625725e-01
+   25  1.3221275453613066e-01 -6.8367421676295925e-01  2.4606100899682085e-01
+   26 -2.4566560537364829e-01 -9.4805075799955063e-01  8.5189439084190730e-02
+   27 -8.6309787765015977e-01  1.6208482668327251e+00 -9.3002361778513165e-01
+   28  5.6908530015070713e-01 -9.0863521385805213e-01  5.3409478726214277e-01
+   29  4.2151929760224643e-01 -7.9119072040766358e-01  4.4262080871675447e-01
+run_vdwl: 0
+run_coul: 0
+run_stress: ! |2-
+   0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00  0.0000000000000000e+00
+run_forces: ! |2
+    1 -5.3341524273838670e-01  7.8884674939725091e-02  2.0952884187592027e-01
+    2  2.2053862671009264e-01 -2.7717619362233042e-01 -1.2890890936582325e-01
+    3 -3.4739178886093409e-02 -9.3306643617397569e-03  1.9998343085423885e-02
+    4  1.6460700475024034e-01  2.8228421828984558e-02 -7.9107215740923997e-02
+    5  1.6216701187759877e-01  7.5963404417154726e-02 -3.7489825158728236e-02
+    6  5.6614970689446376e-01  4.1846264904575808e-01 -6.7991524653327151e-01
+    7 -3.3981435908481461e-01 -4.0051061086052664e-01  4.0255950152039277e-01
+    8 -1.4132007772975100e-01 -6.2017341508474122e-01  3.3987971621673863e-01
+    9  1.8228775562277319e-01  3.2293964093791572e-01  5.3169053903539536e-02
+   10 -5.1717127183107316e-02  1.1112616730977573e-01 -1.4538101134574682e-02
+   11 -8.4643572966643127e-02  1.5200466657141215e-01 -3.9845494278253207e-02
+   12  4.6038275088773778e-01 -4.2553018369271028e-01  3.4320674023104583e-02
+   13 -1.5687586888416111e-01  1.1537899385275338e-01  2.7071393350961193e-02
+   14 -1.7381133625143649e-01  1.3594429135543404e-01  1.0223314006551567e-02
+   15 -1.3889297621381996e-01  8.5403895543124345e-02 -1.3812667490434579e-02
+   16 -3.4014003160232759e-01  4.3491574681114664e-01  5.3550096704789363e-01
+   17  1.3108396775726161e-01 -4.1558591174484305e-01 -7.9430457925084896e-01
+   18  7.6157630236804819e-01  1.5643765431579519e+00 -1.4166351052972370e+00
+   19 -2.8208991751960732e-01 -7.8944028837125158e-01  7.8110106092889642e-01
+   20 -4.0882363546770967e-01 -7.0874851093129665e-01  7.5398203566194200e-01
+   21  5.0733201140702333e-01  5.5693234394333690e-01 -1.1569217174451907e+00
+   22 -2.8680524489422227e-01 -1.2779625227872668e-01  5.7878726247278034e-01
+   23 -2.8648626378267200e-01 -3.0412446280189631e-01  5.5486674848935513e-01
+   24  9.0753920598062088e-02  1.7037291068699667e+00 -3.1469859811934520e-01
+   25  1.3105114795772563e-01 -6.8157888628951457e-01  2.4471165738173106e-01
+   26 -2.4577186819945190e-01 -9.4557474632785432e-01  8.4302506574447683e-02
+   27 -8.6411178235841868e-01  1.6207327144466275e+00 -9.2534662609109775e-01
+   28  5.6960687175236380e-01 -9.0819316709272491e-01  5.3155039440194063e-01
+   29  4.2192140517923227e-01 -7.9125996757091022e-01  4.3997061496410916e-01
+...

From 30fc6e3790a90b1103c00207985fa79def0d826a Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Tue, 24 Aug 2021 17:17:54 -0600
Subject: [PATCH 098/437] consistency between fix TTM variants

---
 src/EXTRA-FIX/fix_ttm.cpp      |  77 ++++++-----
 src/EXTRA-FIX/fix_ttm.h        |   4 +
 src/EXTRA-FIX/fix_ttm_grid.cpp |  19 +--
 src/EXTRA-FIX/fix_ttm_mod.cpp  | 238 ++++++++++++++++++---------------
 src/EXTRA-FIX/fix_ttm_mod.h    |  16 ++-
 src/gridcomm.cpp               |   5 +-
 6 files changed, 197 insertions(+), 162 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 4da2721ac4..00136d069b 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -38,11 +38,15 @@ using namespace LAMMPS_NS;
 using namespace FixConst;
 
 #define MAXLINE 1024
-//#define OFFSET 16384    // to avoid outside-of-box atoms being rounded incorrectly
-//#define SHIFT 0.5       // 0.5 for nearest grid point, 0.0 for lower-left grid point
 
-#define OFFSET 0    // to avoid outside-of-box atoms being rounded incorrectly
-#define SHIFT 0.0       // 0.5 for nearest grid point, 0.0 for lower-left grid point
+// OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
+// SHIFT = 0.0 assigns atoms to lower-left grid pt
+// SHIFT = 0.5 assigns atoms to nearest grid pt
+// use SHIFT = 0.0 for now since it allows fix ave/chunk 
+//   to spatially average consistent with the TTM grid
+
+#define OFFSET 0      // change to 16384 when done debugging vs ttm/old
+#define SHIFT 0.0
 
 /* ---------------------------------------------------------------------- */
 
@@ -108,11 +112,11 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   if (gamma_s < 0.0) error->all(FLERR,"Fix ttm gamma_s must be >= 0.0");
   if (v_0 < 0.0) error->all(FLERR,"Fix ttm v_0 must be >= 0.0");
   if (nxgrid <= 0 || nygrid <= 0 || nzgrid <= 0)
-    error->all(FLERR,"Fix ttm number of nodes must be > 0");
+    error->all(FLERR,"Fix ttm grid sizes must be > 0");
 
   v_0_sq = v_0*v_0;
 
-  // OFFSET to make
+  // grid OFFSET to perform
   // SHIFT to map atom to nearest or lower-left grid point
 
   shift = OFFSET + SHIFT;
@@ -126,7 +130,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   gfactor1 = new double[atom->ntypes+1];
   gfactor2 = new double[atom->ntypes+1];
 
-  // check for allowed maxium number of total grid nodes
+  // check for allowed maximum number of total grid points
 
   bigint totalgrid = (bigint) nxgrid * nygrid * nzgrid;
   if (totalgrid > MAXSMALLINT)
@@ -216,6 +220,14 @@ void FixTTM::init()
   if (domain->triclinic)
     error->all(FLERR,"Cannot use fix ttm with triclinic box");
 
+  // to allow this, would have to reset grid bounds dynamically
+  // for RCB balancing would have to reassign grid pts to procs
+  //   and create a new GridComm, and pass old GC data to new GC
+
+  if (domain->box_change)
+    error->all(FLERR,"Cannot use fix ttm with "
+               "changing box shape, size, or sub-domains");
+
   // set force prefactors
 
   for (int i = 1; i <= atom->ntypes; i++) {
@@ -293,7 +305,7 @@ void FixTTM::post_force(int /*vflag*/)
       if (iz >= nzgrid) iz -= nzgrid;
 
       if (T_electron[iz][iy][ix] < 0)
-        error->all(FLERR,"Electronic temperature dropped below zero");
+        error->one(FLERR,"Electronic temperature dropped below zero");
 
       double tsqrt = sqrt(T_electron[iz][iy][ix]);
 
@@ -402,47 +414,46 @@ void FixTTM::end_of_step()
     for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
         for (ix = 0; ix < nxgrid; ix++)
-          T_electron_old[iz][iy][ix] =
-            T_electron[iz][iy][ix];
+          T_electron_old[iz][iy][ix] = T_electron[iz][iy][ix];
 
     // compute new electron T profile
 
     for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
         for (ix = 0; ix < nxgrid; ix++) {
-          int right_xnode = ix + 1;
-          int right_ynode = iy + 1;
-          int right_znode = iz + 1;
-          if (right_xnode == nxgrid) right_xnode = 0;
-          if (right_ynode == nygrid) right_ynode = 0;
-          if (right_znode == nzgrid) right_znode = 0;
-          int left_xnode = ix - 1;
-          int left_ynode = iy - 1;
-          int left_znode = iz - 1;
-          if (left_xnode == -1) left_xnode = nxgrid - 1;
-          if (left_ynode == -1) left_ynode = nygrid - 1;
-          if (left_znode == -1) left_znode = nzgrid - 1;
+          int xright = ix + 1;
+          int yright = iy + 1;
+          int zright = iz + 1;
+          if (xright == nxgrid) xright = 0;
+          if (yright == nygrid) yright = 0;
+          if (zright == nzgrid) zright = 0;
+          int xleft = ix - 1;
+          int yleft = iy - 1;
+          int zleft = iz - 1;
+          if (xleft == -1) xleft = nxgrid - 1;
+          if (yleft == -1) yleft = nygrid - 1;
+          if (zleft == -1) zleft = nzgrid - 1;
 
           T_electron[iz][iy][ix] =
             T_electron_old[iz][iy][ix] +
             inner_dt/(electronic_specific_heat*electronic_density) *
             (electronic_thermal_conductivity *
 
-             ((T_electron_old[iz][iy][right_xnode] +
-               T_electron_old[iz][iy][left_xnode] -
+             ((T_electron_old[iz][iy][xright] +
+               T_electron_old[iz][iy][xleft] -
                2*T_electron_old[iz][iy][ix])/dx/dx +
-              (T_electron_old[iz][right_ynode][ix] +
-               T_electron_old[iz][left_ynode][ix] -
+              (T_electron_old[iz][yright][ix] +
+               T_electron_old[iz][yleft][ix] -
                2*T_electron_old[iz][iy][ix])/dy/dy +
-              (T_electron_old[right_znode][iy][ix] +
-               T_electron_old[left_znode][iy][ix] -
+              (T_electron_old[zright][iy][ix] +
+               T_electron_old[zleft][iy][ix] -
                2*T_electron_old[iz][iy][ix])/dz/dz) -
              
              (net_energy_transfer_all[iz][iy][ix])/del_vol);
         }
   }
 
-  // output of grid temperatures to file
+  // output of grid electron temperatures to file
 
   if (outfile && (update->ntimestep % outevery == 0)) {
     char *newfile = new char[strlen(outfile) + 16];
@@ -490,7 +501,7 @@ void FixTTM::read_electron_temperatures(const char *filename)
     if ((ix < 0) || (ix >= nxgrid)
         || (iy < 0) || (iy >= nygrid)
         || (iz < 0) || (iz >= nzgrid))
-      error->one(FLERR,"Fix ttm invalide node index in fix ttm input");
+      error->one(FLERR,"Fix ttm invalid grid index in fix ttm input");
 
     if (T_tmp < 0.0)
       error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
@@ -706,14 +717,14 @@ double FixTTM::compute_vector(int n)
 }
 
 /* ----------------------------------------------------------------------
-   memory usage for flangevin and 3d grid
+   memory usage for flangevin and 3d grids
 ------------------------------------------------------------------------- */
 
 double FixTTM::memory_usage()
 {
   double bytes = 0.0;
-  bytes += (double)atom->nmax * 3 * sizeof(double);
-  bytes += (double)4*ngridtotal * sizeof(int);
+  bytes += (double) atom->nmax * 3 * sizeof(double);
+  bytes += (double) 4*ngridtotal * sizeof(int);
   return bytes;
 }
 
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index 9d48339a70..5268142232 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -67,6 +67,10 @@ class FixTTM : public Fix {
   double *gfactor1, *gfactor2, *ratio, **flangevin;
   double ***T_electron, ***T_electron_old;
   double ***net_energy_transfer, ***net_energy_transfer_all;
+  double ***T_atomic;
+  int ***nsum, ***nsum_all;
+  double ***sum_vsq, ***sum_vsq_all;
+  double ***sum_mass_vsq, ***sum_mass_vsq_all;
 
   virtual void allocate_grid();
   virtual void deallocate_grid();
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 5e7eb225c7..cabc2a6b1c 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -132,6 +132,9 @@ void FixTTMGrid::post_force(int /*vflag*/)
         continue;
       }
 
+      if (T_electron[iz][iy][ix] < 0)
+        error->one(FLERR,"Electronic temperature dropped below zero");
+
       double tsqrt = sqrt(T_electron[iz][iy][ix]);
 
       gamma1 = gfactor1[type[i]];
@@ -235,20 +238,6 @@ void FixTTMGrid::end_of_step()
         }
   }
 
-  // check that all temperatures are >= 0.0
-
-  int flag = 0;
-
-  for (iz = nzlo_in; iz <= nzhi_in; iz++)
-    for (iy = nylo_in; iy <= nyhi_in; iy++)
-      for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        if (T_electron[iz][iy][ix] < 0.0) flag = 1;
-
-  int flagall;
-  MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
-  if (flagall) 
-    error->all(FLERR,"Fix ttm electron temperature became negative");
-
   // communicate new T_electron values to ghost grid points
 
   gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
@@ -333,7 +322,7 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
 
       if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid ||
           iz < 0 || iz >= nzgrid)
-        error->all(FLERR,"Fix ttm/grid invalid node index in input");
+        error->all(FLERR,"Fix ttm/grid invalid grid index in input");
       
       if (ix >= nxlo_in && ix <= nxhi_in &&
           iy >= nylo_in && iy <= nyhi_in &&
diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 7d89d89e6f..4ddaeadc00 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -42,6 +42,15 @@ using namespace MathConst;
 
 #define MAXLINE 1024
 
+// OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
+// SHIFT = 0.0 assigns atoms to lower-left grid pt
+// SHIFT = 0.5 assigns atoms to nearest grid pt
+// use SHIFT = 0.0 for now since it allows fix ave/chunk 
+//   to spatially average consistent with the TTM grid
+
+#define OFFSET 0      // change to 16384 when done debugging vs ttm/old
+#define SHIFT 0.0
+
 static const char cite_fix_ttm_mod[] =
   "fix ttm/mod command:\n\n"
   "@article{Pisarev2014,\n"
@@ -75,7 +84,8 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
 {
   if (lmp->citeme) lmp->citeme->add(cite_fix_ttm_mod);
 
-  if (narg < 9) error->all(FLERR,"Illegal fix ttm/mod command");
+  if (narg < 8) error->all(FLERR,"Illegal fix ttm/mod command");
+
   vector_flag = 1;
   size_vector = 2;
   global_freq = 1;
@@ -85,33 +95,49 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   restart_global = 1;
 
   seed = utils::inumeric(FLERR,arg[3],false,lmp);
-  if (seed <= 0)
-    error->all(FLERR,"Invalid random number seed in fix ttm/mod command");
 
   nxnodes = utils::inumeric(FLERR,arg[5],false,lmp);
   nynodes = utils::inumeric(FLERR,arg[6],false,lmp);
   nznodes = utils::inumeric(FLERR,arg[7],false,lmp);
-  if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0)
-    error->all(FLERR,"Fix ttm/mod number of nodes must be > 0");
 
-  total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes;
-  if (total_nnodes > MAXSMALLINT)
-    error->all(FLERR,"Too many nodes in fix ttm/mod");
+  infile = outfile = NULL;
 
-  nfileevery = utils::inumeric(FLERR,arg[9],false,lmp);
-  if (nfileevery > 0) {
-    if (narg != 11) error->all(FLERR,"Illegal fix ttm/mod command");
-    if (comm->me == 0) {
-      fp = fopen(arg[10],"w");
-      if (fp == nullptr)
-        error->one(FLERR,"Cannot open fix ttm/mod file {}: {}",arg[10],utils::getsyserror());
-    }
+  int iarg = 8;
+  while (iarg < narg) {
+    if (strcmp(arg[iarg],"infile") == 0) {
+      if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
+      int n = strlen(arg[iarg+1]) + 1;
+      infile = new char[n];
+      strcpy(infile,arg[iarg+1]);
+      iarg += 2;
+    } else if (strcmp(arg[iarg],"outfile") == 0) {
+      if (iarg+3 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
+      outevery = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
+      int n = strlen(arg[iarg+2]) + 1;
+      outfile = new char[n];
+      strcpy(outfile,arg[iarg+2]);
+      iarg += 3;
+    } else error->all(FLERR,"Illegal fix ttm/mod command");
   }
 
-  read_parameters(arg[4]);
+  // error check
+
+  if (seed <= 0)
+    error->all(FLERR,"Invalid random number seed in fix ttm/mod command");
+  if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0)
+    error->all(FLERR,"Fix ttm/mod grid sizes must be > 0");
+
+  // check for allowed maximum number of total grid points
+  
+  bigint total_nnodes = (bigint) nxnodes * nynodes * nznodes;
+  if (total_nnodes > MAXSMALLINT)
+    error->all(FLERR,"Too many grid points in fix ttm/mod");
+  ngridtotal = total_nnodes;
 
   // t_surface is determined by electronic temperature (not constant)
 
+  read_parameters(arg[4]);
+
   t_surface_l = surface_l;
   mult_factor = intensity;
   duration = 0.0;
@@ -127,13 +153,18 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   if (ionic_density <= 0.0) error->all(FLERR,"Fix ttm/mod ionic_density must be > 0.0");
   if (surface_l < 0) error->all(FLERR,"Surface coordinates must be >= 0");
   if (surface_l >= surface_r) error->all(FLERR, "Left surface coordinate must be less than right surface coordinate");
+
   // initialize Marsaglia RNG with processor-unique seed
+
   random = new RanMars(lmp,seed + comm->me);
+
   // allocate per-type arrays for force prefactors
+
   gfactor1 = new double[atom->ntypes+1];
   gfactor2 = new double[atom->ntypes+1];
+
   // allocate 3d grid variables
-  total_nnodes = (bigint)nxnodes*nynodes*nznodes;
+
   memory->create(nsum,nxnodes,nynodes,nznodes,"ttm/mod:nsum");
   memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm/mod:nsum_all");
   memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq");
@@ -151,6 +182,11 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   flangevin = nullptr;
   grow_arrays(atom->nmax);
 
+  // grid OFFSET to perform
+  // SHIFT to map atom to nearest or lower-left grid point
+
+  shift = OFFSET + SHIFT;
+
   // zero out the flangevin array
 
   for (int i = 0; i < atom->nmax; i++) {
@@ -162,10 +198,14 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   atom->add_callback(Atom::GROW);
   atom->add_callback(Atom::RESTART);
 
-  // set initial electron temperatures from user input file
+  // zero electron temperatures (default)
+  // if specified, read initial electron temperatures from file
 
-  if (comm->me == 0) read_initial_electron_temperatures(arg[8]);
-  MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world);
+  memset(&T_electron[0][0][0],0,ngridtotal*sizeof(double));
+  if (infile) {
+    if (comm->me == 0) read_electron_temperatures(infile);
+    MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);
+  }
 }
 
 /* ---------------------------------------------------------------------- */
@@ -268,9 +308,9 @@ void FixTTMMod::post_force(int /*vflag*/)
       double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
       double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
       double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes);
-      int iynode = static_cast(yscale*nynodes);
-      int iznode = static_cast(zscale*nznodes);
+      int ixnode = static_cast(xscale*nxnodes + shift) - OFFSET;
+      int iynode = static_cast(yscale*nynodes + shift) - OFFSET;
+      int iznode = static_cast(zscale*nznodes + shift) - OFFSET;
       while (ixnode > nxnodes-1) ixnode -= nxnodes;
       while (iynode > nynodes-1) iynode -= nynodes;
       while (iznode > nznodes-1) iznode -= nznodes;
@@ -539,11 +579,11 @@ void FixTTMMod::read_parameters(const char *filename)
    only called by proc 0
 ------------------------------------------------------------------------- */
 
-void FixTTMMod::read_initial_electron_temperatures(const char *filename)
+void FixTTMMod::read_electron_temperatures(const char *filename)
 {
   int ***T_initial_set;
   memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm/mod:T_initial_set");
-  memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int));
+  memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
 
   std::string name = utils::get_potential_file_path(filename);
   if (name.empty())
@@ -556,6 +596,7 @@ void FixTTMMod::read_initial_electron_temperatures(const char *filename)
   char line[MAXLINE];
   int ixnode,iynode,iznode;
   double T_tmp;
+
   while (1) {
     if (fgets(line,MAXLINE,fpr) == nullptr) break;
     ValueTokenizer values(line);
@@ -578,6 +619,7 @@ void FixTTMMod::read_initial_electron_temperatures(const char *filename)
     T_electron[ixnode][iynode][iznode] = T_tmp;
     T_initial_set[ixnode][iynode][iznode] = 1;
   }
+
   fclose(fpr);
 
   // check completeness of input data
@@ -591,6 +633,31 @@ void FixTTMMod::read_initial_electron_temperatures(const char *filename)
   memory->destroy(T_initial_set);
 }
 
+/* ----------------------------------------------------------------------
+   write out current electron temperatures to user-specified file
+   only written by proc 0
+------------------------------------------------------------------------- */
+
+void FixTTMMod::write_electron_temperatures(const char *filename)
+{
+  if (comm->me) return;
+ 
+  FILE *fp = fopen(filename,"w");
+  if (!fp) error->one(FLERR,"Fix ttm/mod could not open output file");
+
+  int ix,iy,iz;
+
+  for (ix = 0; ix < nxnodes; ix++)
+    for (iy = 0; iy < nynodes; iy++)
+      for (iz = 0; iz < nznodes; iz++) {
+        if (movsur == 1 && T_electron[ix][iy][iz] == 0.0) 
+          T_electron[ix][iy][iz] = electron_temperature_min;
+        fprintf(fp,"%d %d %d %20.16g\n",ix,iy,iz,T_electron[ix][iy][iz]);
+      }
+
+  fclose(fp);
+}
+
 /* ---------------------------------------------------------------------- */
 
 el_heat_capacity_thermal_conductivity FixTTMMod::el_properties(double T_e)
@@ -616,6 +683,9 @@ double FixTTMMod::el_sp_heat_integral(double T_e)
   else
     return electronic_density*((esheat_0 + C_limit)*T_e + esheat_1*T_temp*T_e/2.0 + esheat_2*T_temp*T_temp*T_e/3.0 + esheat_3*pow(T_temp,3)*T_e/4.0 + esheat_4*pow(T_temp,4)*T_e/5.0);
 }
+
+/* ---------------------------------------------------------------------- */
+
 void FixTTMMod::end_of_step()
 {
   double **x = atom->x;
@@ -647,9 +717,9 @@ void FixTTMMod::end_of_step()
       double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
       double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
       double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes);
-      int iynode = static_cast(yscale*nynodes);
-      int iznode = static_cast(zscale*nznodes);
+      int ixnode = static_cast(xscale*nxnodes + shift) - OFFSET;
+      int iynode = static_cast(yscale*nynodes + shift) - OFFSET;
+      int iznode = static_cast(zscale*nznodes + shift) - OFFSET;
       while (ixnode > nxnodes-1) ixnode -= nxnodes;
       while (iynode > nynodes-1) iynode -= nynodes;
       while (iznode > nznodes-1) iznode -= nznodes;
@@ -666,7 +736,7 @@ void FixTTMMod::end_of_step()
 
   MPI_Allreduce(&net_energy_transfer[0][0][0],
                 &net_energy_transfer_all[0][0][0],
-                total_nnodes,MPI_DOUBLE,MPI_SUM,world);
+                ngridtotal,MPI_DOUBLE,MPI_SUM,world);
 
   double dx = domain->xprd/nxnodes;
   double dy = domain->yprd/nynodes;
@@ -800,79 +870,14 @@ void FixTTMMod::end_of_step()
 
   } while (stability_criterion < 0.0);
 
-  // output nodal temperatures for current timestep
+  // output of grid electron temperatures to file
 
-  if ((nfileevery) && !(update->ntimestep % nfileevery)) {
+  if (outfile && (update->ntimestep % outevery == 0)) {
+    char *newfile = new char[strlen(outfile) + 16];
+    strcpy(newfile,outfile);
+    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
 
-    // compute atomic Ta for each grid point
-
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++) {
-          nsum[ixnode][iynode][iznode] = 0;
-          nsum_all[ixnode][iynode][iznode] = 0;
-          sum_vsq[ixnode][iynode][iznode] = 0.0;
-          sum_mass_vsq[ixnode][iynode][iznode] = 0.0;
-          sum_vsq_all[ixnode][iynode][iznode] = 0.0;
-          sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0;
-        }
-
-    double massone;
-    for (int i = 0; i < nlocal; i++)
-      if (mask[i] & groupbit) {
-        if (rmass) massone = rmass[i];
-        else massone = mass[type[i]];
-        double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-        double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-        double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-        int ixnode = static_cast(xscale*nxnodes);
-        int iynode = static_cast(yscale*nynodes);
-        int iznode = static_cast(zscale*nznodes);
-        while (ixnode > nxnodes-1) ixnode -= nxnodes;
-        while (iynode > nynodes-1) iynode -= nynodes;
-        while (iznode > nznodes-1) iznode -= nznodes;
-        while (ixnode < 0) ixnode += nxnodes;
-        while (iynode < 0) iynode += nynodes;
-        while (iznode < 0) iznode += nznodes;
-        double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
-        nsum[ixnode][iynode][iznode] += 1;
-        sum_vsq[ixnode][iynode][iznode] += vsq;
-        sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq;
-      }
-
-    MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes,
-                  MPI_INT,MPI_SUM,world);
-    MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes,
-                  MPI_DOUBLE,MPI_SUM,world);
-    MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0],
-                  total_nnodes,MPI_DOUBLE,MPI_SUM,world);
-    MPI_Allreduce(&t_surface_l,&surface_l,1,MPI_INT,MPI_MIN,world);
-
-    if (comm->me == 0) {
-      fmt::print(fp,"{}",update->ntimestep);
-
-      double T_a;
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++) {
-            T_a = 0;
-            if (nsum_all[ixnode][iynode][iznode] > 0) {
-              T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/
-                (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e);
-              if (movsur == 1) {
-                if (T_electron[ixnode][iynode][iznode]==0.0) T_electron[ixnode][iynode][iznode] = electron_temperature_min;
-              }
-            }
-            fmt::print(fp," {}",T_a);
-          }
-
-      fputs("\t",fp);
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++)
-            fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]);
-      fputs("\n",fp);
-    }
+    write_electron_temperatures((const char *) newfile);
   }
 }
 
@@ -883,8 +888,8 @@ void FixTTMMod::end_of_step()
 double FixTTMMod::memory_usage()
 {
   double bytes = 0.0;
-  bytes += (double)5*total_nnodes * sizeof(int);
-  bytes += (double)14*total_nnodes * sizeof(double);
+  bytes += (double)5*ngridtotal * sizeof(int);
+  bytes += (double)14*ngridtotal * sizeof(double);
   return bytes;
 }
 
@@ -930,9 +935,12 @@ double FixTTMMod::compute_vector(int n)
 void FixTTMMod::write_restart(FILE *fp)
 {
   double *rlist;
-  memory->create(rlist,nxnodes*nynodes*nznodes+1,"ttm/mod:rlist");
+  memory->create(rlist,nxnodes*nynodes*nznodes+4,"ttm/mod:rlist");
 
   int n = 0;
+  rlist[n++] = nxnodes;
+  rlist[n++] = nynodes;
+  rlist[n++] = nznodes;
   rlist[n++] = seed;
 
   for (int ixnode = 0; ixnode < nxnodes; ixnode++)
@@ -958,17 +966,28 @@ void FixTTMMod::restart(char *buf)
   int n = 0;
   double *rlist = (double *) buf;
 
-  // the seed must be changed from the initial seed
+  // check that restart grid size is same as current grid size
 
-  seed = static_cast (0.5*rlist[n++]);
+  int nxnodes_old = static_cast (rlist[n++]);
+  int nynodes_old = static_cast (rlist[n++]);
+  int nznodes_old = static_cast (rlist[n++]);
+
+  if (nxnodes_old != nxnodes || nynodes_old != nynodes || nznodes_old != nznodes)
+    error->all(FLERR,"Must restart fix ttm with same grid size");
+
+  // change RN seed from initial seed, to avoid same Langevin factors
+  // just increment by 1, since for RanMars that is a new RN stream
+
+  seed = static_cast (rlist[n++]) + 1;
+  delete random;
+  random = new RanMars(lmp,seed+comm->me);
+
+  // restore global frid values
 
   for (int ixnode = 0; ixnode < nxnodes; ixnode++)
     for (int iynode = 0; iynode < nynodes; iynode++)
       for (int iznode = 0; iznode < nznodes; iznode++)
         T_electron[ixnode][iynode][iznode] = rlist[n++];
-
-  delete random;
-  random = new RanMars(lmp,seed+comm->me);
 }
 
 /* ----------------------------------------------------------------------
@@ -978,6 +997,7 @@ void FixTTMMod::restart(char *buf)
 int FixTTMMod::pack_restart(int i, double *buf)
 {
   // pack buf[0] this way because other fixes unpack it
+
   buf[0] = 4;
   buf[1] = flangevin[i][0];
   buf[2] = flangevin[i][1];
diff --git a/src/EXTRA-FIX/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h
index c14f6ee4e0..883b799b09 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.h
+++ b/src/EXTRA-FIX/fix_ttm_mod.h
@@ -53,23 +53,31 @@ class FixTTMMod : public Fix {
   double compute_vector(int);
 
  private:
-  int nfileevery;
   int nlevels_respa;
   int seed;
+  int outevery;
+  double shift;
+  char *infile,*outfile;
+
   class RanMars *random;
   FILE *fp;
+
   int nxnodes, nynodes, nznodes;
+  int ngridtotal;
   bigint total_nnodes;
+
   int ***nsum, ***nsum_all;
   double *gfactor1, *gfactor2, *ratio, **flangevin;
   double ***T_electron, ***T_electron_old, ***T_electron_first;
   double ***sum_vsq, ***sum_mass_vsq;
   double ***sum_vsq_all, ***sum_mass_vsq_all;
   double ***net_energy_transfer, ***net_energy_transfer_all;
+
   double gamma_p, gamma_s, v_0, v_0_sq;
   int skin_layer, surface_l, surface_r, t_surface_l, t_surface_r;
   int movsur;
-  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4, C_limit, electronic_density;
+  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4, 
+    C_limit, electronic_density;
   double el_th_diff, T_damp;
   double intensity, width, duration, surface_double;
   double mult_factor, ttm_dt;
@@ -77,8 +85,10 @@ class FixTTMMod : public Fix {
   double electron_temperature_min;
   el_heat_capacity_thermal_conductivity el_properties(double);
   double el_sp_heat_integral(double);
+
   void read_parameters(const char *);
-  void read_initial_electron_temperatures(const char *);
+  void read_electron_temperatures(const char *);
+  void write_electron_temperatures(const char *);
 };
 
 }    // namespace LAMMPS_NS
diff --git a/src/gridcomm.cpp b/src/gridcomm.cpp
index 098a410a54..d403b706d3 100644
--- a/src/gridcomm.cpp
+++ b/src/gridcomm.cpp
@@ -1126,9 +1126,10 @@ reverse_comm_tiled(T *ptr, int nper, int nbyte, int which,
 }
 
 /* ----------------------------------------------------------------------
-   gather global grid values to proc 0
-   proc 0 pings each proc for its contribution
+   gather global grid values to proc 0, one grid chunk at a time
+   proc 0 pings each proc for its grid chunk
    pack/unpack operations are performed by caller via callbacks
+   caller can decide whether to store chunks, output them, etc
 ------------------------------------------------------------------------- */
 
 void GridComm::gather(int caller, void *ptr, int nper, int nbyte, int which,

From 857d0d255d624f809c6a4eff795c09b1d068d968 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Tue, 24 Aug 2021 17:25:53 -0600
Subject: [PATCH 099/437] change OFFSET to correct value

---
 src/EXTRA-FIX/fix_ttm_mod.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 4ddaeadc00..7603d70a8a 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -48,7 +48,7 @@ using namespace MathConst;
 // use SHIFT = 0.0 for now since it allows fix ave/chunk 
 //   to spatially average consistent with the TTM grid
 
-#define OFFSET 0      // change to 16384 when done debugging vs ttm/old
+#define OFFSET 16384
 #define SHIFT 0.0
 
 static const char cite_fix_ttm_mod[] =

From d79c42ac41e3e12448860ef87ecd5f58df10f546 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 22:20:23 -0400
Subject: [PATCH 100/437] improve error messages for incorrect/inconsistent
 table data

---
 src/pair_table.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/pair_table.cpp b/src/pair_table.cpp
index f064d56377..c6bf50cef9 100644
--- a/src/pair_table.cpp
+++ b/src/pair_table.cpp
@@ -291,9 +291,8 @@ void PairTable::coeff(int narg, char **arg)
     rlo = tb->rlo;
     rhi = tb->rhi;
   }
-  if (tb->cut <= rlo || tb->cut > rhi)
-    error->all(FLERR,"Invalid pair table cutoff");
-  if (rlo <= 0.0) error->all(FLERR,"Invalid pair table cutoff");
+  if (tb->cut <= rlo || tb->cut > rhi) error->all(FLERR, "Pair table cutoff outside of table");
+  if (rlo <= 0.0) error->all(FLERR, "Invalid pair table lower boundary");
 
   // match = 1 if don't need to spline read-in tables
   // this is only the case if r values needed by final tables

From 7ddfa382dc9603d1fd7f0643213786dccaeff4b8 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 22:20:58 -0400
Subject: [PATCH 101/437] enable and process pair style table with clang-format

---
 src/pair_table.cpp | 600 +++++++++++++++++++++++----------------------
 1 file changed, 307 insertions(+), 293 deletions(-)

diff --git a/src/pair_table.cpp b/src/pair_table.cpp
index c6bf50cef9..60272b5276 100644
--- a/src/pair_table.cpp
+++ b/src/pair_table.cpp
@@ -1,4 +1,3 @@
-// clang-format off
 /* ----------------------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
@@ -18,24 +17,21 @@
 
 #include "pair_table.h"
 
-#include 
-
-#include 
-
 #include "atom.h"
-#include "force.h"
 #include "comm.h"
-#include "neigh_list.h"
-#include "memory.h"
 #include "error.h"
-
-#include "tokenizer.h"
+#include "force.h"
+#include "memory.h"
+#include "neigh_list.h"
 #include "table_file_reader.h"
+#include "tokenizer.h"
 
+#include 
+#include 
 
 using namespace LAMMPS_NS;
 
-enum{NONE,RLINEAR,RSQ,BMP};
+enum { NONE, RLINEAR, RSQ, BMP };
 
 #define EPSILONR 1.0e-6
 
@@ -68,17 +64,17 @@ PairTable::~PairTable()
 
 void PairTable::compute(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype,itable;
-  double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
-  double rsq,factor_lj,fraction,value,a,b;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype, itable;
+  double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair;
+  double rsq, factor_lj, fraction, value, a, b;
+  int *ilist, *jlist, *numneigh, **firstneigh;
   Table *tb;
 
   union_int_float_t rsq_lookup;
   int tlm1 = tablength - 1;
 
   evdwl = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   double **x = atom->x;
   double **f = atom->f;
@@ -111,71 +107,70 @@ void PairTable::compute(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       jtype = type[j];
 
       if (rsq < cutsq[itype][jtype]) {
         tb = &tables[tabindex[itype][jtype]];
         if (rsq < tb->innersq)
-          error->one(FLERR,"Pair distance < table inner cutoff: "
-                                       "ijtype {} {} dist {}",itype,jtype,sqrt(rsq));
+          error->one(FLERR, "Pair distance < table inner cutoff: ijtype {} {} dist {}", itype,
+                     jtype, sqrt(rsq));
         if (tabstyle == LOOKUP) {
-          itable = static_cast ((rsq - tb->innersq) * tb->invdelta);
+          itable = static_cast((rsq - tb->innersq) * tb->invdelta);
           if (itable >= tlm1)
-            error->one(FLERR,"Pair distance > table outer cutoff: "
-                                         "ijtype {} {} dist {}",itype,jtype,sqrt(rsq));
+            error->one(FLERR, "Pair distance > table outer cutoff: ijtype {} {} dist {}", itype,
+                       jtype, sqrt(rsq));
           fpair = factor_lj * tb->f[itable];
         } else if (tabstyle == LINEAR) {
-          itable = static_cast ((rsq - tb->innersq) * tb->invdelta);
+          itable = static_cast((rsq - tb->innersq) * tb->invdelta);
           if (itable >= tlm1)
-            error->one(FLERR,"Pair distance > table outer cutoff: "
-                                         "ijtype {} {} dist {}",itype,jtype,sqrt(rsq));
+            error->one(FLERR, "Pair distance > table outer cutoff: ijtype {} {} dist {}", itype,
+                       jtype, sqrt(rsq));
           fraction = (rsq - tb->rsq[itable]) * tb->invdelta;
-          value = tb->f[itable] + fraction*tb->df[itable];
+          value = tb->f[itable] + fraction * tb->df[itable];
           fpair = factor_lj * value;
         } else if (tabstyle == SPLINE) {
-          itable = static_cast ((rsq - tb->innersq) * tb->invdelta);
+          itable = static_cast((rsq - tb->innersq) * tb->invdelta);
           if (itable >= tlm1)
-            error->one(FLERR,"Pair distance > table outer cutoff: "
-                                         "ijtype {} {} dist {}",itype,jtype,sqrt(rsq));
+            error->one(FLERR, "Pair distance > table outer cutoff: ijtype {} {} dist {}", itype,
+                       jtype, sqrt(rsq));
           b = (rsq - tb->rsq[itable]) * tb->invdelta;
           a = 1.0 - b;
-          value = a * tb->f[itable] + b * tb->f[itable+1] +
-            ((a*a*a-a)*tb->f2[itable] + (b*b*b-b)*tb->f2[itable+1]) *
-            tb->deltasq6;
+          value = a * tb->f[itable] + b * tb->f[itable + 1] +
+              ((a * a * a - a) * tb->f2[itable] + (b * b * b - b) * tb->f2[itable + 1]) *
+                  tb->deltasq6;
           fpair = factor_lj * value;
         } else {
           rsq_lookup.f = rsq;
           itable = rsq_lookup.i & tb->nmask;
           itable >>= tb->nshiftbits;
           fraction = (rsq_lookup.f - tb->rsq[itable]) * tb->drsq[itable];
-          value = tb->f[itable] + fraction*tb->df[itable];
+          value = tb->f[itable] + fraction * tb->df[itable];
           fpair = factor_lj * value;
         }
 
-        f[i][0] += delx*fpair;
-        f[i][1] += dely*fpair;
-        f[i][2] += delz*fpair;
+        f[i][0] += delx * fpair;
+        f[i][1] += dely * fpair;
+        f[i][2] += delz * fpair;
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fpair;
-          f[j][1] -= dely*fpair;
-          f[j][2] -= delz*fpair;
+          f[j][0] -= delx * fpair;
+          f[j][1] -= dely * fpair;
+          f[j][2] -= delz * fpair;
         }
 
         if (eflag) {
           if (tabstyle == LOOKUP)
             evdwl = tb->e[itable];
           else if (tabstyle == LINEAR || tabstyle == BITMAP)
-            evdwl = tb->e[itable] + fraction*tb->de[itable];
+            evdwl = tb->e[itable] + fraction * tb->de[itable];
           else
-            evdwl = a * tb->e[itable] + b * tb->e[itable+1] +
-              ((a*a*a-a)*tb->e2[itable] + (b*b*b-b)*tb->e2[itable+1]) *
-              tb->deltasq6;
+            evdwl = a * tb->e[itable] + b * tb->e[itable + 1] +
+                ((a * a * a - a) * tb->e2[itable] + (b * b * b - b) * tb->e2[itable + 1]) *
+                    tb->deltasq6;
           evdwl *= factor_lj;
         }
 
-        if (evflag) ev_tally(i,j,nlocal,newton_pair,
-                             evdwl,0.0,fpair,delx,dely,delz);
+        if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
       }
     }
   }
@@ -192,13 +187,13 @@ void PairTable::allocate()
   allocated = 1;
   const int nt = atom->ntypes + 1;
 
-  memory->create(setflag,nt,nt,"pair:setflag");
-  memory->create(cutsq,nt,nt,"pair:cutsq");
-  memory->create(tabindex,nt,nt,"pair:tabindex");
+  memory->create(setflag, nt, nt, "pair:setflag");
+  memory->create(cutsq, nt, nt, "pair:cutsq");
+  memory->create(tabindex, nt, nt, "pair:tabindex");
 
-  memset(&setflag[0][0],0,sizeof(int)*nt*nt);
-  memset(&cutsq[0][0],0,sizeof(double)*nt*nt);
-  memset(&tabindex[0][0],0,sizeof(int)*nt*nt);
+  memset(&setflag[0][0], 0, sizeof(int) * nt * nt);
+  memset(&cutsq[0][0], 0, sizeof(double) * nt * nt);
+  memset(&tabindex[0][0], 0, sizeof(int) * nt * nt);
 }
 
 /* ----------------------------------------------------------------------
@@ -207,30 +202,41 @@ void PairTable::allocate()
 
 void PairTable::settings(int narg, char **arg)
 {
-  if (narg < 2) error->all(FLERR,"Illegal pair_style command");
+  if (narg < 2) error->all(FLERR, "Illegal pair_style command");
 
   // new settings
 
-  if (strcmp(arg[0],"lookup") == 0) tabstyle = LOOKUP;
-  else if (strcmp(arg[0],"linear") == 0) tabstyle = LINEAR;
-  else if (strcmp(arg[0],"spline") == 0) tabstyle = SPLINE;
-  else if (strcmp(arg[0],"bitmap") == 0) tabstyle = BITMAP;
-  else error->all(FLERR,"Unknown table style in pair_style command: {}", arg[0]);
+  if (strcmp(arg[0], "lookup") == 0)
+    tabstyle = LOOKUP;
+  else if (strcmp(arg[0], "linear") == 0)
+    tabstyle = LINEAR;
+  else if (strcmp(arg[0], "spline") == 0)
+    tabstyle = SPLINE;
+  else if (strcmp(arg[0], "bitmap") == 0)
+    tabstyle = BITMAP;
+  else
+    error->all(FLERR, "Unknown table style in pair_style command: {}", arg[0]);
 
-  tablength = utils::inumeric(FLERR,arg[1],false,lmp);
-  if (tablength < 2) error->all(FLERR,"Illegal number of pair table entries");
+  tablength = utils::inumeric(FLERR, arg[1], false, lmp);
+  if (tablength < 2) error->all(FLERR, "Illegal number of pair table entries");
 
   // optional keywords
   // assert the tabulation is compatible with a specific long-range solver
 
   int iarg = 2;
   while (iarg < narg) {
-    if (strcmp(arg[iarg],"ewald") == 0) ewaldflag = 1;
-    else if (strcmp(arg[iarg],"pppm") == 0) pppmflag = 1;
-    else if (strcmp(arg[iarg],"msm") == 0) msmflag = 1;
-    else if (strcmp(arg[iarg],"dispersion") == 0) dispersionflag = 1;
-    else if (strcmp(arg[iarg],"tip4p") == 0) tip4pflag = 1;
-    else error->all(FLERR,"Illegal pair_style command");
+    if (strcmp(arg[iarg], "ewald") == 0)
+      ewaldflag = 1;
+    else if (strcmp(arg[iarg], "pppm") == 0)
+      pppmflag = 1;
+    else if (strcmp(arg[iarg], "msm") == 0)
+      msmflag = 1;
+    else if (strcmp(arg[iarg], "dispersion") == 0)
+      dispersionflag = 1;
+    else if (strcmp(arg[iarg], "tip4p") == 0)
+      tip4pflag = 1;
+    else
+      error->all(FLERR, "Illegal pair_style command");
     iarg++;
   }
 
@@ -256,37 +262,39 @@ void PairTable::settings(int narg, char **arg)
 
 void PairTable::coeff(int narg, char **arg)
 {
-  if (narg != 4 && narg != 5) error->all(FLERR,"Illegal pair_coeff command");
+  if (narg != 4 && narg != 5) error->all(FLERR, "Illegal pair_coeff command");
   if (!allocated) allocate();
 
-  int ilo,ihi,jlo,jhi;
-  utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
-  utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
+  int ilo, ihi, jlo, jhi;
+  utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
+  utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
 
   int me;
-  MPI_Comm_rank(world,&me);
-  tables = (Table *)
-    memory->srealloc(tables,(ntables+1)*sizeof(Table),"pair:tables");
+  MPI_Comm_rank(world, &me);
+  tables = (Table *) memory->srealloc(tables, (ntables + 1) * sizeof(Table), "pair:tables");
   Table *tb = &tables[ntables];
   null_table(tb);
-  if (me == 0) read_table(tb,arg[2],arg[3]);
+  if (me == 0) read_table(tb, arg[2], arg[3]);
   bcast_table(tb);
 
   // set table cutoff
 
-  if (narg == 5) tb->cut = utils::numeric(FLERR,arg[4],false,lmp);
-  else if (tb->rflag) tb->cut = tb->rhi;
-  else tb->cut = tb->rfile[tb->ninput-1];
+  if (narg == 5)
+    tb->cut = utils::numeric(FLERR, arg[4], false, lmp);
+  else if (tb->rflag)
+    tb->cut = tb->rhi;
+  else
+    tb->cut = tb->rfile[tb->ninput - 1];
 
   // error check on table parameters
   // insure cutoff is within table
   // for BITMAP tables, file values can be in non-ascending order
 
-  if (tb->ninput <= 1) error->one(FLERR,"Invalid pair table length");
-  double rlo,rhi;
+  if (tb->ninput <= 1) error->one(FLERR, "Invalid pair table length");
+  double rlo, rhi;
   if (tb->rflag == 0) {
     rlo = tb->rfile[0];
-    rhi = tb->rfile[tb->ninput-1];
+    rhi = tb->rfile[tb->ninput - 1];
   } else {
     rlo = tb->rlo;
     rhi = tb->rhi;
@@ -300,12 +308,12 @@ void PairTable::coeff(int narg, char **arg)
   // for tabstyle SPLINE, always need to build spline tables
 
   tb->match = 0;
-  if (tabstyle == LINEAR && tb->ninput == tablength &&
-      tb->rflag == RSQ && tb->rhi == tb->cut) tb->match = 1;
-  if (tabstyle == BITMAP && tb->ninput == 1 << tablength &&
-      tb->rflag == BMP && tb->rhi == tb->cut) tb->match = 1;
+  if (tabstyle == LINEAR && tb->ninput == tablength && tb->rflag == RSQ && tb->rhi == tb->cut)
+    tb->match = 1;
+  if (tabstyle == BITMAP && tb->ninput == 1 << tablength && tb->rflag == BMP && tb->rhi == tb->cut)
+    tb->match = 1;
   if (tb->rflag == BMP && tb->match == 0)
-    error->all(FLERR,"Bitmapped table in file does not match requested table");
+    error->all(FLERR, "Bitmapped table in file does not match requested table");
 
   // spline read-in values and compute r,e,f vectors within table
 
@@ -316,14 +324,14 @@ void PairTable::coeff(int narg, char **arg)
 
   int count = 0;
   for (int i = ilo; i <= ihi; i++) {
-    for (int j = MAX(jlo,i); j <= jhi; j++) {
+    for (int j = MAX(jlo, i); j <= jhi; j++) {
       tabindex[i][j] = ntables;
       setflag[i][j] = 1;
       count++;
     }
   }
 
-  if (count == 0) error->all(FLERR,"Illegal pair_coeff command");
+  if (count == 0) error->all(FLERR, "Illegal pair_coeff command");
   ntables++;
 }
 
@@ -333,7 +341,7 @@ void PairTable::coeff(int narg, char **arg)
 
 double PairTable::init_one(int i, int j)
 {
-  if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
+  if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set");
 
   tabindex[j][i] = tabindex[i][j];
 
@@ -354,39 +362,36 @@ void PairTable::read_table(Table *tb, char *file, char *keyword)
   // transparently convert units for supported conversions
 
   int unit_convert = reader.get_unit_convert();
-  double conversion_factor = utils::get_conversion_factor(utils::ENERGY,
-                                                          unit_convert);
+  double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert);
   char *line = reader.find_section_start(keyword);
 
-  if (!line) {
-    error->one(FLERR,"Did not find keyword in table file");
-  }
+  if (!line) { error->one(FLERR, "Did not find keyword in table file"); }
 
   // read args on 2nd line of section
   // allocate table arrays for file values
 
   line = reader.next_line();
   param_extract(tb, line);
-  memory->create(tb->rfile,tb->ninput,"pair:rfile");
-  memory->create(tb->efile,tb->ninput,"pair:efile");
-  memory->create(tb->ffile,tb->ninput,"pair:ffile");
+  memory->create(tb->rfile, tb->ninput, "pair:rfile");
+  memory->create(tb->efile, tb->ninput, "pair:efile");
+  memory->create(tb->ffile, tb->ninput, "pair:ffile");
 
   // setup bitmap parameters for table to read in
 
   tb->ntablebits = 0;
-  int masklo,maskhi,nmask,nshiftbits;
+  int masklo, maskhi, nmask, nshiftbits;
   if (tb->rflag == BMP) {
     while (1 << tb->ntablebits < tb->ninput) tb->ntablebits++;
     if (1 << tb->ntablebits != tb->ninput)
-      error->one(FLERR,"Bitmapped table is incorrect length in table file");
-    init_bitmap(tb->rlo,tb->rhi,tb->ntablebits,masklo,maskhi,nmask,nshiftbits);
+      error->one(FLERR, "Bitmapped table is incorrect length in table file");
+    init_bitmap(tb->rlo, tb->rhi, tb->ntablebits, masklo, maskhi, nmask, nshiftbits);
   }
 
   // read r,e,f table values from file
   // if rflag set, compute r
   // if rflag not set, use r from file
 
-  double rfile,rnew;
+  double rfile, rnew;
   union_int_float_t rsq_lookup;
 
   int rerror = 0;
@@ -408,22 +413,21 @@ void PairTable::read_table(Table *tb, char *file, char *keyword)
 
     rnew = rfile;
     if (tb->rflag == RLINEAR)
-      rnew = tb->rlo + (tb->rhi - tb->rlo)*i/(tb->ninput-1);
+      rnew = tb->rlo + (tb->rhi - tb->rlo) * i / (tb->ninput - 1);
     else if (tb->rflag == RSQ) {
-      rnew = tb->rlo*tb->rlo +
-        (tb->rhi*tb->rhi - tb->rlo*tb->rlo)*i/(tb->ninput-1);
+      rnew = tb->rlo * tb->rlo + (tb->rhi * tb->rhi - tb->rlo * tb->rlo) * i / (tb->ninput - 1);
       rnew = sqrt(rnew);
     } else if (tb->rflag == BMP) {
       rsq_lookup.i = i << nshiftbits;
       rsq_lookup.i |= masklo;
-      if (rsq_lookup.f < tb->rlo*tb->rlo) {
+      if (rsq_lookup.f < tb->rlo * tb->rlo) {
         rsq_lookup.i = i << nshiftbits;
         rsq_lookup.i |= maskhi;
       }
       rnew = sqrtf(rsq_lookup.f);
     }
 
-    if (tb->rflag && fabs(rnew-rfile)/rfile > EPSILONR) rerror++;
+    if (tb->rflag && fabs(rnew - rfile) / rfile > EPSILONR) rerror++;
 
     tb->rfile[i] = rnew;
   }
@@ -433,23 +437,23 @@ void PairTable::read_table(Table *tb, char *file, char *keyword)
   // skip two end points since do not have surrounding secants
   // inflection point is where curvature changes sign
 
-  double r,e,f,rprev,rnext,eprev,enext,fleft,fright;
+  double r, e, f, rprev, rnext, eprev, enext, fleft, fright;
 
   int ferror = 0;
 
   // bitmapped tables do not follow regular ordering, so we cannot check them here
 
   if (tb->rflag != BMP) {
-    for (int i = 1; i < tb->ninput-1; i++) {
+    for (int i = 1; i < tb->ninput - 1; i++) {
       r = tb->rfile[i];
-      rprev = tb->rfile[i-1];
-      rnext = tb->rfile[i+1];
+      rprev = tb->rfile[i - 1];
+      rnext = tb->rfile[i + 1];
       e = tb->efile[i];
-      eprev = tb->efile[i-1];
-      enext = tb->efile[i+1];
+      eprev = tb->efile[i - 1];
+      enext = tb->efile[i + 1];
       f = tb->ffile[i];
-      fleft = - (e-eprev) / (r-rprev);
-      fright = - (enext-e) / (rnext-r);
+      fleft = -(e - eprev) / (r - rprev);
+      fright = -(enext - e) / (rnext - r);
       if (f < fleft && f < fright) ferror++;
       if (f > fleft && f > fright) ferror++;
       //printf("Values %d: %g %g %g\n",i,r,e,f);
@@ -458,23 +462,26 @@ void PairTable::read_table(Table *tb, char *file, char *keyword)
   }
 
   if (ferror)
-    error->warning(FLERR,"{} of {} force values in table {} are inconsistent "
-                   "with -dE/dr.\nWARNING:  Should only be flagged at "
-                   "inflection points",ferror,tb->ninput,keyword);
+    error->warning(FLERR,
+                   "{} of {} force values in table {} are inconsistent with -dE/dr.\n"
+                   "WARNING:  Should only be flagged at inflection points",
+                   ferror, tb->ninput, keyword);
 
   // warn if re-computed distance values differ from file values
 
   if (rerror)
-    error->warning(FLERR,"{} of {} distance values in table {} with relative "
-                   "error\nWARNING:  over {} to re-computed values",
-                   rerror,tb->ninput,EPSILONR,keyword);
+    error->warning(FLERR,
+                   "{} of {} distance values in table {} with relative error\n"
+                   "WARNING:  over {} to re-computed values",
+                   rerror, tb->ninput, EPSILONR, keyword);
 
   // warn if data was read incompletely, e.g. columns were missing
 
   if (cerror)
-    error->warning(FLERR,"{} of {} lines in table {} were incomplete\n"
+    error->warning(FLERR,
+                   "{} of {} lines in table {} were incomplete\n"
                    "WARNING:  or could not be parsed completely",
-                   cerror,tb->ninput,keyword);
+                   cerror, tb->ninput, keyword);
 }
 
 /* ----------------------------------------------------------------------
@@ -485,29 +492,29 @@ void PairTable::read_table(Table *tb, char *file, char *keyword)
 
 void PairTable::bcast_table(Table *tb)
 {
-  MPI_Bcast(&tb->ninput,1,MPI_INT,0,world);
+  MPI_Bcast(&tb->ninput, 1, MPI_INT, 0, world);
 
   int me;
-  MPI_Comm_rank(world,&me);
+  MPI_Comm_rank(world, &me);
   if (me > 0) {
-    memory->create(tb->rfile,tb->ninput,"pair:rfile");
-    memory->create(tb->efile,tb->ninput,"pair:efile");
-    memory->create(tb->ffile,tb->ninput,"pair:ffile");
+    memory->create(tb->rfile, tb->ninput, "pair:rfile");
+    memory->create(tb->efile, tb->ninput, "pair:efile");
+    memory->create(tb->ffile, tb->ninput, "pair:ffile");
   }
 
-  MPI_Bcast(tb->rfile,tb->ninput,MPI_DOUBLE,0,world);
-  MPI_Bcast(tb->efile,tb->ninput,MPI_DOUBLE,0,world);
-  MPI_Bcast(tb->ffile,tb->ninput,MPI_DOUBLE,0,world);
+  MPI_Bcast(tb->rfile, tb->ninput, MPI_DOUBLE, 0, world);
+  MPI_Bcast(tb->efile, tb->ninput, MPI_DOUBLE, 0, world);
+  MPI_Bcast(tb->ffile, tb->ninput, MPI_DOUBLE, 0, world);
 
-  MPI_Bcast(&tb->rflag,1,MPI_INT,0,world);
+  MPI_Bcast(&tb->rflag, 1, MPI_INT, 0, world);
   if (tb->rflag) {
-    MPI_Bcast(&tb->rlo,1,MPI_DOUBLE,0,world);
-    MPI_Bcast(&tb->rhi,1,MPI_DOUBLE,0,world);
+    MPI_Bcast(&tb->rlo, 1, MPI_DOUBLE, 0, world);
+    MPI_Bcast(&tb->rhi, 1, MPI_DOUBLE, 0, world);
   }
-  MPI_Bcast(&tb->fpflag,1,MPI_INT,0,world);
+  MPI_Bcast(&tb->fpflag, 1, MPI_INT, 0, world);
   if (tb->fpflag) {
-    MPI_Bcast(&tb->fplo,1,MPI_DOUBLE,0,world);
-    MPI_Bcast(&tb->fphi,1,MPI_DOUBLE,0,world);
+    MPI_Bcast(&tb->fplo, 1, MPI_DOUBLE, 0, world);
+    MPI_Bcast(&tb->fphi, 1, MPI_DOUBLE, 0, world);
   }
 }
 
@@ -518,22 +525,22 @@ void PairTable::bcast_table(Table *tb)
 
 void PairTable::spline_table(Table *tb)
 {
-  memory->create(tb->e2file,tb->ninput,"pair:e2file");
-  memory->create(tb->f2file,tb->ninput,"pair:f2file");
+  memory->create(tb->e2file, tb->ninput, "pair:e2file");
+  memory->create(tb->f2file, tb->ninput, "pair:f2file");
 
-  double ep0 = - tb->ffile[0];
-  double epn = - tb->ffile[tb->ninput-1];
-  spline(tb->rfile,tb->efile,tb->ninput,ep0,epn,tb->e2file);
+  double ep0 = -tb->ffile[0];
+  double epn = -tb->ffile[tb->ninput - 1];
+  spline(tb->rfile, tb->efile, tb->ninput, ep0, epn, tb->e2file);
 
   if (tb->fpflag == 0) {
     tb->fplo = (tb->ffile[1] - tb->ffile[0]) / (tb->rfile[1] - tb->rfile[0]);
-    tb->fphi = (tb->ffile[tb->ninput-1] - tb->ffile[tb->ninput-2]) /
-      (tb->rfile[tb->ninput-1] - tb->rfile[tb->ninput-2]);
+    tb->fphi = (tb->ffile[tb->ninput - 1] - tb->ffile[tb->ninput - 2]) /
+        (tb->rfile[tb->ninput - 1] - tb->rfile[tb->ninput - 2]);
   }
 
   double fp0 = tb->fplo;
   double fpn = tb->fphi;
-  spline(tb->rfile,tb->ffile,tb->ninput,fp0,fpn,tb->f2file);
+  spline(tb->rfile, tb->ffile, tb->ninput, fp0, fpn, tb->f2file);
 }
 
 /* ----------------------------------------------------------------------
@@ -556,9 +563,12 @@ void PairTable::param_extract(Table *tb, char *line)
       if (word == "N") {
         tb->ninput = values.next_int();
       } else if ((word == "R") || (word == "RSQ") || (word == "BITMAP")) {
-        if (word == "R") tb->rflag = RLINEAR;
-        else if (word == "RSQ") tb->rflag = RSQ;
-        else if (word == "BITMAP") tb->rflag = BMP;
+        if (word == "R")
+          tb->rflag = RLINEAR;
+        else if (word == "RSQ")
+          tb->rflag = RSQ;
+        else if (word == "BITMAP")
+          tb->rflag = BMP;
         tb->rlo = values.next_double();
         tb->rhi = values.next_double();
       } else if (word == "FPRIME") {
@@ -566,14 +576,14 @@ void PairTable::param_extract(Table *tb, char *line)
         tb->fplo = values.next_double();
         tb->fphi = values.next_double();
       } else {
-        error->one(FLERR,"Invalid keyword {} in pair table parameters", word);
+        error->one(FLERR, "Invalid keyword {} in pair table parameters", word);
       }
     }
   } catch (TokenizerException &e) {
     error->one(FLERR, e.what());
   }
 
-  if (tb->ninput == 0) error->one(FLERR,"Pair table parameters did not set N");
+  if (tb->ninput == 0) error->one(FLERR, "Pair table parameters did not set N");
 }
 
 /* ----------------------------------------------------------------------
@@ -582,18 +592,20 @@ void PairTable::param_extract(Table *tb, char *line)
 
 void PairTable::compute_table(Table *tb)
 {
-  int tlm1 = tablength-1;
+  int tlm1 = tablength - 1;
 
   // inner = inner table bound
   // cut = outer table bound
   // delta = table spacing in rsq for N-1 bins
 
   double inner;
-  if (tb->rflag) inner = tb->rlo;
-  else inner = tb->rfile[0];
-  tb->innersq = inner*inner;
-  tb->delta = (tb->cut*tb->cut - tb->innersq) / tlm1;
-  tb->invdelta = 1.0/tb->delta;
+  if (tb->rflag)
+    inner = tb->rlo;
+  else
+    inner = tb->rfile[0];
+  tb->innersq = inner * inner;
+  tb->delta = (tb->cut * tb->cut - tb->innersq) / tlm1;
+  tb->invdelta = 1.0 / tb->delta;
 
   // direct lookup tables
   // N-1 evenly spaced bins in rsq from inner to cut
@@ -603,15 +615,15 @@ void PairTable::compute_table(Table *tb)
   // e,f are never a match to read-in values, always computed via spline interp
 
   if (tabstyle == LOOKUP) {
-    memory->create(tb->e,tlm1,"pair:e");
-    memory->create(tb->f,tlm1,"pair:f");
+    memory->create(tb->e, tlm1, "pair:e");
+    memory->create(tb->f, tlm1, "pair:f");
 
-    double r,rsq;
+    double r, rsq;
     for (int i = 0; i < tlm1; i++) {
-      rsq = tb->innersq + (i+0.5)*tb->delta;
+      rsq = tb->innersq + (i + 0.5) * tb->delta;
       r = sqrt(rsq);
-      tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r);
-      tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r;
+      tb->e[i] = splint(tb->rfile, tb->efile, tb->e2file, tb->ninput, r);
+      tb->f[i] = splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, r) / r;
     }
   }
 
@@ -624,29 +636,29 @@ void PairTable::compute_table(Table *tb)
   // e,f can match read-in values, else compute via spline interp
 
   if (tabstyle == LINEAR) {
-    memory->create(tb->rsq,tablength,"pair:rsq");
-    memory->create(tb->e,tablength,"pair:e");
-    memory->create(tb->f,tablength,"pair:f");
-    memory->create(tb->de,tlm1,"pair:de");
-    memory->create(tb->df,tlm1,"pair:df");
+    memory->create(tb->rsq, tablength, "pair:rsq");
+    memory->create(tb->e, tablength, "pair:e");
+    memory->create(tb->f, tablength, "pair:f");
+    memory->create(tb->de, tlm1, "pair:de");
+    memory->create(tb->df, tlm1, "pair:df");
 
-    double r,rsq;
+    double r, rsq;
     for (int i = 0; i < tablength; i++) {
-      rsq = tb->innersq + i*tb->delta;
+      rsq = tb->innersq + i * tb->delta;
       r = sqrt(rsq);
       tb->rsq[i] = rsq;
       if (tb->match) {
         tb->e[i] = tb->efile[i];
-        tb->f[i] = tb->ffile[i]/r;
+        tb->f[i] = tb->ffile[i] / r;
       } else {
-        tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r);
-        tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r;
+        tb->e[i] = splint(tb->rfile, tb->efile, tb->e2file, tb->ninput, r);
+        tb->f[i] = splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, r) / r;
       }
     }
 
     for (int i = 0; i < tlm1; i++) {
-      tb->de[i] = tb->e[i+1] - tb->e[i];
-      tb->df[i] = tb->f[i+1] - tb->f[i];
+      tb->de[i] = tb->e[i + 1] - tb->e[i];
+      tb->df[i] = tb->f[i + 1] - tb->f[i];
     }
   }
 
@@ -659,25 +671,25 @@ void PairTable::compute_table(Table *tb)
   // e,f can match read-in values, else compute via spline interp
 
   if (tabstyle == SPLINE) {
-    memory->create(tb->rsq,tablength,"pair:rsq");
-    memory->create(tb->e,tablength,"pair:e");
-    memory->create(tb->f,tablength,"pair:f");
-    memory->create(tb->e2,tablength,"pair:e2");
-    memory->create(tb->f2,tablength,"pair:f2");
+    memory->create(tb->rsq, tablength, "pair:rsq");
+    memory->create(tb->e, tablength, "pair:e");
+    memory->create(tb->f, tablength, "pair:f");
+    memory->create(tb->e2, tablength, "pair:e2");
+    memory->create(tb->f2, tablength, "pair:f2");
 
-    tb->deltasq6 = tb->delta*tb->delta / 6.0;
+    tb->deltasq6 = tb->delta * tb->delta / 6.0;
 
-    double r,rsq;
+    double r, rsq;
     for (int i = 0; i < tablength; i++) {
-      rsq = tb->innersq + i*tb->delta;
+      rsq = tb->innersq + i * tb->delta;
       r = sqrt(rsq);
       tb->rsq[i] = rsq;
       if (tb->match) {
         tb->e[i] = tb->efile[i];
-        tb->f[i] = tb->ffile[i]/r;
+        tb->f[i] = tb->ffile[i] / r;
       } else {
-        tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r);
-        tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r);
+        tb->e[i] = splint(tb->rfile, tb->efile, tb->e2file, tb->ninput, r);
+        tb->f[i] = splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, r);
       }
     }
 
@@ -685,38 +697,39 @@ void PairTable::compute_table(Table *tb)
     // h(r) = e(r) and g(r) = r^2
     // dh/dg = (de/dr) / 2r = -f/2r
 
-    double ep0 = - tb->f[0] / (2.0 * sqrt(tb->innersq));
-    double epn = - tb->f[tlm1] / (2.0 * tb->cut);
-    spline(tb->rsq,tb->e,tablength,ep0,epn,tb->e2);
+    double ep0 = -tb->f[0] / (2.0 * sqrt(tb->innersq));
+    double epn = -tb->f[tlm1] / (2.0 * tb->cut);
+    spline(tb->rsq, tb->e, tablength, ep0, epn, tb->e2);
 
     // fp0,fpn = dh/dg at inner and at cut
     // h(r) = f(r)/r and g(r) = r^2
     // dh/dg = (1/r df/dr - f/r^2) / 2r
     // dh/dg in secant approx = (f(r2)/r2 - f(r1)/r1) / (g(r2) - g(r1))
 
-    double fp0,fpn;
+    double fp0, fpn;
     double secant_factor = 0.1;
-    if (tb->fpflag) fp0 = (tb->fplo/sqrt(tb->innersq) - tb->f[0]/tb->innersq) /
-      (2.0 * sqrt(tb->innersq));
+    if (tb->fpflag)
+      fp0 = (tb->fplo / sqrt(tb->innersq) - tb->f[0] / tb->innersq) / (2.0 * sqrt(tb->innersq));
     else {
       double rsq1 = tb->innersq;
-      double rsq2 = rsq1 + secant_factor*tb->delta;
-      fp0 = (splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,sqrt(rsq2)) /
-             sqrt(rsq2) - tb->f[0] / sqrt(rsq1)) / (secant_factor*tb->delta);
+      double rsq2 = rsq1 + secant_factor * tb->delta;
+      fp0 = (splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, sqrt(rsq2)) / sqrt(rsq2) -
+             tb->f[0] / sqrt(rsq1)) /
+          (secant_factor * tb->delta);
     }
 
-    if (tb->fpflag && tb->cut == tb->rfile[tb->ninput-1]) fpn =
-      (tb->fphi/tb->cut - tb->f[tlm1]/(tb->cut*tb->cut)) / (2.0 * tb->cut);
+    if (tb->fpflag && tb->cut == tb->rfile[tb->ninput - 1])
+      fpn = (tb->fphi / tb->cut - tb->f[tlm1] / (tb->cut * tb->cut)) / (2.0 * tb->cut);
     else {
       double rsq2 = tb->cut * tb->cut;
-      double rsq1 = rsq2 - secant_factor*tb->delta;
+      double rsq1 = rsq2 - secant_factor * tb->delta;
       fpn = (tb->f[tlm1] / sqrt(rsq2) -
-             splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,sqrt(rsq1)) /
-             sqrt(rsq1)) / (secant_factor*tb->delta);
+             splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, sqrt(rsq1)) / sqrt(rsq1)) /
+          (secant_factor * tb->delta);
     }
 
     for (int i = 0; i < tablength; i++) tb->f[i] /= sqrt(tb->rsq[i]);
-    spline(tb->rsq,tb->f,tablength,fp0,fpn,tb->f2);
+    spline(tb->rsq, tb->f, tablength, fp0, fpn, tb->f2);
   }
 
   // bitmapped linear tables
@@ -727,21 +740,21 @@ void PairTable::compute_table(Table *tb)
   if (tabstyle == BITMAP) {
     double r;
     union_int_float_t rsq_lookup;
-    int masklo,maskhi;
+    int masklo, maskhi;
 
     // linear lookup tables of length ntable = 2^n
     // stored value = value at lower edge of bin
 
-    init_bitmap(inner,tb->cut,tablength,masklo,maskhi,tb->nmask,tb->nshiftbits);
+    init_bitmap(inner, tb->cut, tablength, masklo, maskhi, tb->nmask, tb->nshiftbits);
     int ntable = 1 << tablength;
     int ntablem1 = ntable - 1;
 
-    memory->create(tb->rsq,ntable,"pair:rsq");
-    memory->create(tb->e,ntable,"pair:e");
-    memory->create(tb->f,ntable,"pair:f");
-    memory->create(tb->de,ntable,"pair:de");
-    memory->create(tb->df,ntable,"pair:df");
-    memory->create(tb->drsq,ntable,"pair:drsq");
+    memory->create(tb->rsq, ntable, "pair:rsq");
+    memory->create(tb->e, ntable, "pair:e");
+    memory->create(tb->f, ntable, "pair:f");
+    memory->create(tb->de, ntable, "pair:de");
+    memory->create(tb->df, ntable, "pair:df");
+    memory->create(tb->drsq, ntable, "pair:drsq");
 
     union_int_float_t minrsq_lookup;
     minrsq_lookup.i = 0 << tb->nshiftbits;
@@ -758,20 +771,20 @@ void PairTable::compute_table(Table *tb)
       tb->rsq[i] = rsq_lookup.f;
       if (tb->match) {
         tb->e[i] = tb->efile[i];
-        tb->f[i] = tb->ffile[i]/r;
+        tb->f[i] = tb->ffile[i] / r;
       } else {
-        tb->e[i] = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r);
-        tb->f[i] = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r;
+        tb->e[i] = splint(tb->rfile, tb->efile, tb->e2file, tb->ninput, r);
+        tb->f[i] = splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, r) / r;
       }
-      minrsq_lookup.f = MIN(minrsq_lookup.f,rsq_lookup.f);
+      minrsq_lookup.f = MIN(minrsq_lookup.f, rsq_lookup.f);
     }
 
     tb->innersq = minrsq_lookup.f;
 
     for (int i = 0; i < ntablem1; i++) {
-      tb->de[i] = tb->e[i+1] - tb->e[i];
-      tb->df[i] = tb->f[i+1] - tb->f[i];
-      tb->drsq[i] = 1.0/(tb->rsq[i+1] - tb->rsq[i]);
+      tb->de[i] = tb->e[i + 1] - tb->e[i];
+      tb->df[i] = tb->f[i + 1] - tb->f[i];
+      tb->drsq[i] = 1.0 / (tb->rsq[i + 1] - tb->rsq[i]);
     }
 
     // get the delta values for the last table entries
@@ -779,7 +792,7 @@ void PairTable::compute_table(Table *tb)
 
     tb->de[ntablem1] = tb->e[0] - tb->e[ntablem1];
     tb->df[ntablem1] = tb->f[0] - tb->f[ntablem1];
-    tb->drsq[ntablem1] = 1.0/(tb->rsq[0] - tb->rsq[ntablem1]);
+    tb->drsq[ntablem1] = 1.0 / (tb->rsq[0] - tb->rsq[ntablem1]);
 
     // get the correct delta values at itablemax
     // smallest r is in bin itablemin
@@ -791,7 +804,7 @@ void PairTable::compute_table(Table *tb)
     //   if tb->match, data at cut*cut is unavailable, so we'll take
     //   deltas at itablemax-1 as a good approximation
 
-    double e_tmp,f_tmp;
+    double e_tmp, f_tmp;
     int itablemin = minrsq_lookup.i & tb->nmask;
     itablemin >>= tb->nshiftbits;
     int itablemax = itablemin - 1;
@@ -800,19 +813,19 @@ void PairTable::compute_table(Table *tb)
     if (itablemax == 0) itablemaxm1 = ntablem1;
     rsq_lookup.i = itablemax << tb->nshiftbits;
     rsq_lookup.i |= maskhi;
-    if (rsq_lookup.f < tb->cut*tb->cut) {
+    if (rsq_lookup.f < tb->cut * tb->cut) {
       if (tb->match) {
         tb->de[itablemax] = tb->de[itablemaxm1];
         tb->df[itablemax] = tb->df[itablemaxm1];
         tb->drsq[itablemax] = tb->drsq[itablemaxm1];
       } else {
-            rsq_lookup.f = tb->cut*tb->cut;
+        rsq_lookup.f = tb->cut * tb->cut;
         r = sqrtf(rsq_lookup.f);
-        e_tmp = splint(tb->rfile,tb->efile,tb->e2file,tb->ninput,r);
-        f_tmp = splint(tb->rfile,tb->ffile,tb->f2file,tb->ninput,r)/r;
+        e_tmp = splint(tb->rfile, tb->efile, tb->e2file, tb->ninput, r);
+        f_tmp = splint(tb->rfile, tb->ffile, tb->f2file, tb->ninput, r) / r;
         tb->de[itablemax] = e_tmp - tb->e[itablemax];
         tb->df[itablemax] = f_tmp - tb->f[itablemax];
-        tb->drsq[itablemax] = 1.0/(rsq_lookup.f - tb->rsq[itablemax]);
+        tb->drsq[itablemax] = 1.0 / (rsq_lookup.f - tb->rsq[itablemax]);
       }
     }
   }
@@ -856,55 +869,58 @@ void PairTable::free_table(Table *tb)
    spline and splint routines modified from Numerical Recipes
 ------------------------------------------------------------------------- */
 
-void PairTable::spline(double *x, double *y, int n,
-                       double yp1, double ypn, double *y2)
+void PairTable::spline(double *x, double *y, int n, double yp1, double ypn, double *y2)
 {
-  int i,k;
-  double p,qn,sig,un;
+  int i, k;
+  double p, qn, sig, un;
   double *u = new double[n];
 
-  if (yp1 > 0.99e30) y2[0] = u[0] = 0.0;
+  if (yp1 > 0.99e30)
+    y2[0] = u[0] = 0.0;
   else {
     y2[0] = -0.5;
-    u[0] = (3.0/(x[1]-x[0])) * ((y[1]-y[0]) / (x[1]-x[0]) - yp1);
+    u[0] = (3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp1);
   }
-  for (i = 1; i < n-1; i++) {
-    sig = (x[i]-x[i-1]) / (x[i+1]-x[i-1]);
-    p = sig*y2[i-1] + 2.0;
-    y2[i] = (sig-1.0) / p;
-    u[i] = (y[i+1]-y[i]) / (x[i+1]-x[i]) - (y[i]-y[i-1]) / (x[i]-x[i-1]);
-    u[i] = (6.0*u[i] / (x[i+1]-x[i-1]) - sig*u[i-1]) / p;
+  for (i = 1; i < n - 1; i++) {
+    sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]);
+    p = sig * y2[i - 1] + 2.0;
+    y2[i] = (sig - 1.0) / p;
+    u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
+    u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
   }
-  if (ypn > 0.99e30) qn = un = 0.0;
+  if (ypn > 0.99e30)
+    qn = un = 0.0;
   else {
     qn = 0.5;
-    un = (3.0/(x[n-1]-x[n-2])) * (ypn - (y[n-1]-y[n-2]) / (x[n-1]-x[n-2]));
+    un = (3.0 / (x[n - 1] - x[n - 2])) * (ypn - (y[n - 1] - y[n - 2]) / (x[n - 1] - x[n - 2]));
   }
-  y2[n-1] = (un-qn*u[n-2]) / (qn*y2[n-2] + 1.0);
-  for (k = n-2; k >= 0; k--) y2[k] = y2[k]*y2[k+1] + u[k];
+  y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
+  for (k = n - 2; k >= 0; k--) y2[k] = y2[k] * y2[k + 1] + u[k];
 
-  delete [] u;
+  delete[] u;
 }
 
 /* ---------------------------------------------------------------------- */
 
 double PairTable::splint(double *xa, double *ya, double *y2a, int n, double x)
 {
-  int klo,khi,k;
-  double h,b,a,y;
+  int klo, khi, k;
+  double h, b, a, y;
 
   klo = 0;
-  khi = n-1;
-  while (khi-klo > 1) {
-    k = (khi+klo) >> 1;
-    if (xa[k] > x) khi = k;
-    else klo = k;
+  khi = n - 1;
+  while (khi - klo > 1) {
+    k = (khi + klo) >> 1;
+    if (xa[k] > x)
+      khi = k;
+    else
+      klo = k;
   }
-  h = xa[khi]-xa[klo];
-  a = (xa[khi]-x) / h;
-  b = (x-xa[klo]) / h;
-  y = a*ya[klo] + b*ya[khi] +
-    ((a*a*a-a)*y2a[klo] + (b*b*b-b)*y2a[khi]) * (h*h)/6.0;
+  h = xa[khi] - xa[klo];
+  a = (xa[khi] - x) / h;
+  b = (x - xa[klo]) / h;
+  y = a * ya[klo] + b * ya[khi] +
+      ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0;
   return y;
 }
 
@@ -933,13 +949,13 @@ void PairTable::read_restart(FILE *fp)
 
 void PairTable::write_restart_settings(FILE *fp)
 {
-  fwrite(&tabstyle,sizeof(int),1,fp);
-  fwrite(&tablength,sizeof(int),1,fp);
-  fwrite(&ewaldflag,sizeof(int),1,fp);
-  fwrite(&pppmflag,sizeof(int),1,fp);
-  fwrite(&msmflag,sizeof(int),1,fp);
-  fwrite(&dispersionflag,sizeof(int),1,fp);
-  fwrite(&tip4pflag,sizeof(int),1,fp);
+  fwrite(&tabstyle, sizeof(int), 1, fp);
+  fwrite(&tablength, sizeof(int), 1, fp);
+  fwrite(&ewaldflag, sizeof(int), 1, fp);
+  fwrite(&pppmflag, sizeof(int), 1, fp);
+  fwrite(&msmflag, sizeof(int), 1, fp);
+  fwrite(&dispersionflag, sizeof(int), 1, fp);
+  fwrite(&tip4pflag, sizeof(int), 1, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -949,54 +965,52 @@ void PairTable::write_restart_settings(FILE *fp)
 void PairTable::read_restart_settings(FILE *fp)
 {
   if (comm->me == 0) {
-    utils::sfread(FLERR,&tabstyle,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&tablength,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&ewaldflag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&pppmflag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&msmflag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&dispersionflag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&tip4pflag,sizeof(int),1,fp,nullptr,error);
+    utils::sfread(FLERR, &tabstyle, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &tablength, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &ewaldflag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &pppmflag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &msmflag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &dispersionflag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &tip4pflag, sizeof(int), 1, fp, nullptr, error);
   }
-  MPI_Bcast(&tabstyle,1,MPI_INT,0,world);
-  MPI_Bcast(&tablength,1,MPI_INT,0,world);
-  MPI_Bcast(&ewaldflag,1,MPI_INT,0,world);
-  MPI_Bcast(&pppmflag,1,MPI_INT,0,world);
-  MPI_Bcast(&msmflag,1,MPI_INT,0,world);
-  MPI_Bcast(&dispersionflag,1,MPI_INT,0,world);
-  MPI_Bcast(&tip4pflag,1,MPI_INT,0,world);
+  MPI_Bcast(&tabstyle, 1, MPI_INT, 0, world);
+  MPI_Bcast(&tablength, 1, MPI_INT, 0, world);
+  MPI_Bcast(&ewaldflag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&pppmflag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&msmflag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&dispersionflag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&tip4pflag, 1, MPI_INT, 0, world);
 }
 
 /* ---------------------------------------------------------------------- */
 
 double PairTable::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
-                         double /*factor_coul*/, double factor_lj,
-                         double &fforce)
+                         double /*factor_coul*/, double factor_lj, double &fforce)
 {
   int itable;
-  double fraction,value,a,b,phi;
+  double fraction, value, a, b, phi;
   int tlm1 = tablength - 1;
 
   Table *tb = &tables[tabindex[itype][jtype]];
-  if (rsq < tb->innersq) error->one(FLERR,"Pair distance < table inner cutoff");
+  if (rsq < tb->innersq) error->one(FLERR, "Pair distance < table inner cutoff");
 
   if (tabstyle == LOOKUP) {
-    itable = static_cast ((rsq-tb->innersq) * tb->invdelta);
-    if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff");
+    itable = static_cast((rsq - tb->innersq) * tb->invdelta);
+    if (itable >= tlm1) error->one(FLERR, "Pair distance > table outer cutoff");
     fforce = factor_lj * tb->f[itable];
   } else if (tabstyle == LINEAR) {
-    itable = static_cast ((rsq-tb->innersq) * tb->invdelta);
-    if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff");
+    itable = static_cast((rsq - tb->innersq) * tb->invdelta);
+    if (itable >= tlm1) error->one(FLERR, "Pair distance > table outer cutoff");
     fraction = (rsq - tb->rsq[itable]) * tb->invdelta;
-    value = tb->f[itable] + fraction*tb->df[itable];
+    value = tb->f[itable] + fraction * tb->df[itable];
     fforce = factor_lj * value;
   } else if (tabstyle == SPLINE) {
-    itable = static_cast ((rsq-tb->innersq) * tb->invdelta);
-    if (itable >= tlm1) error->one(FLERR,"Pair distance > table outer cutoff");
+    itable = static_cast((rsq - tb->innersq) * tb->invdelta);
+    if (itable >= tlm1) error->one(FLERR, "Pair distance > table outer cutoff");
     b = (rsq - tb->rsq[itable]) * tb->invdelta;
     a = 1.0 - b;
-    value = a * tb->f[itable] + b * tb->f[itable+1] +
-      ((a*a*a-a)*tb->f2[itable] + (b*b*b-b)*tb->f2[itable+1]) *
-      tb->deltasq6;
+    value = a * tb->f[itable] + b * tb->f[itable + 1] +
+        ((a * a * a - a) * tb->f2[itable] + (b * b * b - b) * tb->f2[itable + 1]) * tb->deltasq6;
     fforce = factor_lj * value;
   } else {
     union_int_float_t rsq_lookup;
@@ -1004,18 +1018,18 @@ double PairTable::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
     itable = rsq_lookup.i & tb->nmask;
     itable >>= tb->nshiftbits;
     fraction = (rsq_lookup.f - tb->rsq[itable]) * tb->drsq[itable];
-    value = tb->f[itable] + fraction*tb->df[itable];
+    value = tb->f[itable] + fraction * tb->df[itable];
     fforce = factor_lj * value;
   }
 
   if (tabstyle == LOOKUP)
     phi = tb->e[itable];
   else if (tabstyle == LINEAR || tabstyle == BITMAP)
-    phi = tb->e[itable] + fraction*tb->de[itable];
+    phi = tb->e[itable] + fraction * tb->de[itable];
   else
-    phi = a * tb->e[itable] + b * tb->e[itable+1] +
-      ((a*a*a-a)*tb->e2[itable] + (b*b*b-b)*tb->e2[itable+1]) * tb->deltasq6;
-  return factor_lj*phi;
+    phi = a * tb->e[itable] + b * tb->e[itable + 1] +
+        ((a * a * a - a) * tb->e2[itable] + (b * b * b - b) * tb->e2[itable + 1]) * tb->deltasq6;
+  return factor_lj * phi;
 }
 
 /* ----------------------------------------------------------------------
@@ -1027,8 +1041,8 @@ double PairTable::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
 
 void *PairTable::extract(const char *str, int &dim)
 {
-  if (strcmp(str,"cut_coul") != 0) return nullptr;
-  if (ntables == 0) error->all(FLERR,"All pair coeffs are not set");
+  if (strcmp(str, "cut_coul") != 0) return nullptr;
+  if (ntables == 0) error->all(FLERR, "All pair coeffs are not set");
 
   // only check for cutoff consistency if claiming to be KSpace compatible
 
@@ -1036,9 +1050,9 @@ void *PairTable::extract(const char *str, int &dim)
     double cut_coul = tables[0].cut;
     for (int m = 1; m < ntables; m++)
       if (tables[m].cut != cut_coul)
-        error->all(FLERR,
-                   "Pair table cutoffs must all be equal to use with KSpace");
+        error->all(FLERR, "Pair table cutoffs must all be equal to use with KSpace");
     dim = 0;
     return &tables[0].cut;
-  } else return nullptr;
+  } else
+    return nullptr;
 }

From a1e0341d8c5cee83fe1d7dd48baab09c8902f6dc Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 22:45:54 -0400
Subject: [PATCH 102/437] detect and update output for OpenMP version 5.1

---
 src/info.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/info.cpp b/src/info.cpp
index 7c0eb572db..a936ed8bd3 100644
--- a/src/info.cpp
+++ b/src/info.cpp
@@ -1356,8 +1356,10 @@ std::string Info::get_openmp_info()
 // Supported OpenMP version corresponds to the release date of the
 // specifications as posted at https://www.openmp.org/specifications/
 
-#if _OPENMP > 201811
-  return "OpenMP newer than version 5.0";
+#if _OPENMP > 202011
+  return "OpenMP newer than version 5.1";
+#elif _OPENMP == 202011
+  return "OpenMP 5.1";
 #elif _OPENMP == 201811
   return "OpenMP 5.0";
 #elif _OPENMP == 201611

From e4e08972f86b1cb36ffec6a55b79ce9eb02fd823 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 23:02:49 -0400
Subject: [PATCH 103/437] update overview text

---
 doc/src/Intro_overview.rst | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/doc/src/Intro_overview.rst b/doc/src/Intro_overview.rst
index 96140479ac..11a331015b 100644
--- a/doc/src/Intro_overview.rst
+++ b/doc/src/Intro_overview.rst
@@ -10,24 +10,26 @@ conditions.  It can model 2d or 3d systems with only a few particles
 up to millions or billions.
 
 LAMMPS can be built and run on a laptop or desktop machine, but is
-designed for parallel computers.  It will run on any parallel machine
-that supports the `MPI `_ message-passing library.  This includes
-shared-memory boxes and distributed-memory clusters and
-supercomputers.
+designed for parallel computers.  It will run in serial and on any
+parallel machine that supports the `MPI `_ message-passing
+library.  This includes shared-memory boxes and distributed-memory
+clusters and supercomputers. Parts of LAMMPS also support
+`OpenMP multi-threading `_, vectorization and GPU acceleration.
 
 .. _mpi: https://en.wikipedia.org/wiki/Message_Passing_Interface
 .. _lws: https://www.lammps.org
+.. _omp: https://www.openmp.org
 
 LAMMPS is written in C++ and requires a compiler that is at least
 compatible with the C++-11 standard.  Earlier versions were written in
 F77, F90, and C++-98.  See the `History page
 `_ of the website for details.  All
-versions can be downloaded from the `LAMMPS website `_.
+versions can be downloaded as source code from the `LAMMPS website
+`_.
 
-LAMMPS is designed to be easy to modify or extend with new
-capabilities, such as new force fields, atom types, boundary
-conditions, or diagnostics.  See the :doc:`Modify ` page for
-more details.
+LAMMPS is designed to be easy to modify or extend with new capabilities,
+such as new force fields, atom types, boundary conditions, or
+diagnostics.  See the :doc:`Modify ` page for more details.
 
 In the most general sense, LAMMPS integrates Newton's equations of
 motion for a collection of interacting particles.  A single particle
@@ -47,4 +49,5 @@ MPI parallelization to partition the simulation domain into small
 sub-domains of equal computational cost, one of which is assigned to
 each processor.  Processors communicate and store "ghost" atom
 information for atoms that border their sub-domain.  Multi-threading
-parallelization with with particle-decomposition can be used in addition.
+parallelization and GPU acceleration with with particle-decomposition
+can be used in addition.

From 026d7bd11236aa449d3cbdad48dc3a5def4dfbbf Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 23:26:22 -0400
Subject: [PATCH 104/437] update description of development model and release
 cycles

---
 doc/src/Manual_version.rst | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/doc/src/Manual_version.rst b/doc/src/Manual_version.rst
index a57c8512a6..8a9023dcc6 100644
--- a/doc/src/Manual_version.rst
+++ b/doc/src/Manual_version.rst
@@ -2,12 +2,21 @@ What does a LAMMPS version mean
 -------------------------------
 
 The LAMMPS "version" is the date when it was released, such as 1 May
-2014. LAMMPS is updated continuously.  Whenever we fix a bug or add a
-feature, we release it in the next *patch* release, which are
-typically made every couple of weeks.  Info on patch releases are on
-`this website page `_. Every few
-months, the latest patch release is subjected to more thorough testing
-and labeled as a *stable* version.
+2014.  LAMMPS is updated continuously and we aim to keep it working
+correctly and reliably at all times.  You can follow its development
+in a public `git repository on GitHub `_.
+
+Whenever we fix a bug or update or add a feature, it will be merged into
+the `master` branch of the git repository.  When a sufficient number of
+changes have accumulated *and* the software passes a set of automated
+tests, we release it in the next *patch* release, which are made every
+few weeks.  Info on patch releases are on `this website page
+`_.
+
+Once or twice a year, only bugfixes and small, non-intrusive changes are
+included for a period of time, and the code is subjected to more detailed
+and thorough testing than the default automated testing.  The latest
+patch release after such a period is then labeled as a *stable* version.
 
 Each version of LAMMPS contains all the features and bug-fixes up to
 and including its version date.

From c6145e029a3686efcfe5812563fd7b86450e7e32 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 23:46:06 -0400
Subject: [PATCH 105/437] update features list

---
 doc/src/Intro_features.rst | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst
index f1c04bdb23..a153b84939 100644
--- a/doc/src/Intro_features.rst
+++ b/doc/src/Intro_features.rst
@@ -27,19 +27,19 @@ General features
 * distributed memory message-passing parallelism (MPI)
 * shared memory multi-threading parallelism (OpenMP)
 * spatial decomposition of simulation domain for MPI parallelism
-* particle decomposition inside of spatial decomposition for OpenMP parallelism
+* particle decomposition inside of spatial decomposition for OpenMP and GPU parallelism
 * GPLv2 licensed open-source distribution
 * highly portable C++-11
 * modular code with most functionality in optional packages
-* only depends on MPI library for basic parallel functionality
+* only depends on MPI library for basic parallel functionality, MPI stub for serial compilation
 * other libraries are optional and only required for specific packages
-* GPU (CUDA and OpenCL), Intel Xeon Phi, and OpenMP support for many code features
+* GPU (CUDA, OpenCL, HIP, SYCL), Intel Xeon Phi, and OpenMP support for many code features
 * easy to extend with new features and functionality
 * runs from an input script
 * syntax for defining and using variables and formulas
 * syntax for looping over runs and breaking out of loops
 * run one or multiple simulations simultaneously (in parallel) from one script
-* build as library, invoke LAMMPS through library interface or provided Python wrapper
+* build as library, invoke LAMMPS through library interface or provided Python wrapper or SWIG based wrappers
 * couple with other codes: LAMMPS calls other code, other code calls LAMMPS, umbrella code calls both
 
 .. _particle:
@@ -57,8 +57,9 @@ Particle and model types
 * granular materials
 * coarse-grained mesoscale models
 * finite-size spherical and ellipsoidal particles
-* finite-size  line segment (2d) and triangle (3d) particles
+* finite-size line segment (2d) and triangle (3d) particles
 * point dipole particles
+* particles with magnetic spin
 * rigid collections of particles
 * hybrid combinations of these
 
@@ -74,24 +75,26 @@ commands)
 
 * pairwise potentials: Lennard-Jones, Buckingham, Morse, Born-Mayer-Huggins, Yukawa, soft, class 2 (COMPASS), hydrogen bond, tabulated
 * charged pairwise potentials: Coulombic, point-dipole
-* many-body potentials: EAM, Finnis/Sinclair EAM, modified EAM (MEAM), embedded ion method (EIM), EDIP, ADP, Stillinger-Weber, Tersoff, REBO, AIREBO, ReaxFF, COMB, SNAP, Streitz-Mintmire, 3-body polymorphic
-* long-range interactions for charge, point-dipoles, and LJ dispersion:     Ewald, Wolf, PPPM (similar to particle-mesh Ewald)
+* many-body potentials: EAM, Finnis/Sinclair EAM, modified EAM (MEAM), embedded ion method (EIM), EDIP, ADP, Stillinger-Weber, Tersoff, REBO, AIREBO, ReaxFF, COMB, Streitz-Mintmire, 3-body polymorphic, BOP, Vashishta
+* machine learning potentials: SNAP, GAP, ACE, N2P2, RANN, AGNI
+* long-range interactions for charge, point-dipoles, and LJ dispersion:  Ewald, Wolf, PPPM (similar to particle-mesh Ewald), MSM
 * polarization models: :doc:`QEq `,     :doc:`core/shell model `,     :doc:`Drude dipole model `
 * charge equilibration (QEq via dynamic, point, shielded, Slater methods)
 * coarse-grained potentials: DPD, GayBerne, REsquared, colloidal, DLVO
 * mesoscopic potentials: granular, Peridynamics, SPH
 * electron force field (eFF, AWPMD)
-* bond potentials: harmonic, FENE, Morse, nonlinear, class 2,     quartic (breakable)
-* angle potentials: harmonic, CHARMM, cosine, cosine/squared, cosine/periodic,     class 2 (COMPASS)
-* dihedral potentials: harmonic, CHARMM, multi-harmonic, helix,     class 2 (COMPASS), OPLS
-* improper potentials: harmonic, cvff, umbrella, class 2 (COMPASS)
+* bond potentials: harmonic, FENE, Morse, nonlinear, class 2, quartic (breakable), tabulated
+* angle potentials: harmonic, CHARMM, cosine, cosine/squared, cosine/periodic, class 2 (COMPASS), tabulated
+* dihedral potentials: harmonic, CHARMM, multi-harmonic, helix, class 2 (COMPASS), OPLS, tabulated
+* improper potentials: harmonic, cvff, umbrella, class 2 (COMPASS), tabulated
 * polymer potentials: all-atom, united-atom, bead-spring, breakable
 * water potentials: TIP3P, TIP4P, SPC
+* interlayer potentials for graphene and analogues
 * implicit solvent potentials: hydrodynamic lubrication, Debye
-* force-field compatibility with common CHARMM, AMBER, DREIDING,     OPLS, GROMACS, COMPASS options
+* force-field compatibility with common CHARMM, AMBER, DREIDING, OPLS, GROMACS, COMPASS options
 * access to the `OpenKIM Repository `_ of potentials via     :doc:`kim command `
-* hybrid potentials: multiple pair, bond, angle, dihedral, improper     potentials can be used in one simulation
-* overlaid potentials: superposition of multiple pair potentials
+* hybrid potentials: multiple pair, bond, angle, dihedral, improper potentials can be used in one simulation
+* overlaid potentials: superposition of multiple pair potentials (including many-body), optional with selectable scale factor
 
 .. _create:
 

From 0a07f4eae05fc30a4dd1d1dd64d980bfdc2532ed Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 24 Aug 2021 23:46:16 -0400
Subject: [PATCH 106/437] spelling issues

---
 doc/src/Intro_features.rst                  | 2 +-
 doc/src/Manual_version.rst                  | 2 +-
 doc/utils/sphinx-config/false_positives.txt | 1 +
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst
index a153b84939..f1b7dc93f0 100644
--- a/doc/src/Intro_features.rst
+++ b/doc/src/Intro_features.rst
@@ -94,7 +94,7 @@ commands)
 * force-field compatibility with common CHARMM, AMBER, DREIDING, OPLS, GROMACS, COMPASS options
 * access to the `OpenKIM Repository `_ of potentials via     :doc:`kim command `
 * hybrid potentials: multiple pair, bond, angle, dihedral, improper potentials can be used in one simulation
-* overlaid potentials: superposition of multiple pair potentials (including many-body), optional with selectable scale factor
+* overlaid potentials: superposition of multiple pair potentials (including many-body) with optional scale factor
 
 .. _create:
 
diff --git a/doc/src/Manual_version.rst b/doc/src/Manual_version.rst
index 8a9023dcc6..ae9bd556c4 100644
--- a/doc/src/Manual_version.rst
+++ b/doc/src/Manual_version.rst
@@ -13,7 +13,7 @@ tests, we release it in the next *patch* release, which are made every
 few weeks.  Info on patch releases are on `this website page
 `_.
 
-Once or twice a year, only bugfixes and small, non-intrusive changes are
+Once or twice a year, only bug fixes and small, non-intrusive changes are
 included for a period of time, and the code is subjected to more detailed
 and thorough testing than the default automated testing.  The latest
 patch release after such a period is then labeled as a *stable* version.
diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index 52bd0ee67a..62f58f3ef5 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -1174,6 +1174,7 @@ googletest
 Gordan
 Goudeau
 GPa
+GPL
 gpu
 gpuID
 gpus

From d9579c4ecde27b88dd7cc1e3eb014547fdaba433 Mon Sep 17 00:00:00 2001
From: Xiaohui Duan 
Date: Wed, 25 Aug 2021 14:55:28 +0800
Subject: [PATCH 107/437] Changed the virial computation method for
 pair/ilp/graphene/hbn and pair/kolmogorov/crespi/full from fk x rkj to fk x
 rki

---
 src/INTERLAYER/pair_ilp_graphene_hbn.cpp       | 12 ++++++------
 src/INTERLAYER/pair_kolmogorov_crespi_full.cpp | 12 ++++++------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
index 43070c5156..a50af25f8e 100644
--- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
+++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
@@ -482,7 +482,7 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */)
   double dprodnorm1[3] = {0.0, 0.0, 0.0};
   double fp1[3] = {0.0, 0.0, 0.0};
   double fprod1[3] = {0.0, 0.0, 0.0};
-  double delkj[3] = {0.0, 0.0, 0.0};
+  double delki[3] = {0.0, 0.0, 0.0};
   double fk[3] = {0.0, 0.0, 0.0};
 
   inum = list->inum;
@@ -588,12 +588,12 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */)
           f[k][0] += fk[0];
           f[k][1] += fk[1];
           f[k][2] += fk[2];
-          delkj[0] = x[k][0] - x[j][0];
-          delkj[1] = x[k][1] - x[j][1];
-          delkj[2] = x[k][2] - x[j][2];
+          delki[0] = x[k][0] - x[i][0];
+          delki[1] = x[k][1] - x[i][1];
+          delki[2] = x[k][2] - x[i][2];
           if (evflag)
-            ev_tally_xyz(k, j, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delkj[0],
-                         delkj[1], delkj[2]);
+            ev_tally_xyz(k, i, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delki[0],
+                         delki[1], delki[2]);
         }
 
         if (eflag) pvector[1] += evdwl = Tap * Vilp;
diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
index e8db858218..fa011d2769 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
@@ -478,7 +478,7 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */)
   double dprodnorm1[3] = {0.0, 0.0, 0.0};
   double fp1[3] = {0.0, 0.0, 0.0};
   double fprod1[3] = {0.0, 0.0, 0.0};
-  double delkj[3] = {0.0, 0.0, 0.0};
+  double delki[3] = {0.0, 0.0, 0.0};
   double fk[3] = {0.0, 0.0, 0.0};
 
   inum = list->inum;
@@ -585,12 +585,12 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */)
           f[k][0] += fk[0];
           f[k][1] += fk[1];
           f[k][2] += fk[2];
-          delkj[0] = x[k][0] - x[j][0];
-          delkj[1] = x[k][1] - x[j][1];
-          delkj[2] = x[k][2] - x[j][2];
+          delki[0] = x[k][0] - x[i][0];
+          delki[1] = x[k][1] - x[i][1];
+          delki[2] = x[k][2] - x[i][2];
           if (evflag)
-            ev_tally_xyz(k, j, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delkj[0],
-                         delkj[1], delkj[2]);
+            ev_tally_xyz(k, j, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delki[0],
+                         delki[1], delki[2]);
         }
 
         if (eflag) {

From 61b9d4a19f208f0899aab38e5c867d17a842d145 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:27:19 -0400
Subject: [PATCH 108/437] update epsilon

---
 unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml | 2 +-
 .../tests/manybody-pair-ilp-graphene-hbn_notaper.yaml           | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
index 442761256a..ec91e147ad 100644
--- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
+++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Tue Aug 24 15:36:42 2021
-epsilon: 5e-12
+epsilon: 5e-13
 skip_tests: single
 prerequisites: ! |
   pair ilp/graphene/hbn
diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
index 7b7854daaf..51d72dc40b 100644
--- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
+++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Tue Aug 24 15:36:45 2021
-epsilon: 5e-12
+epsilon: 9e-13
 skip_tests: single
 prerequisites: ! |
   pair ilp/graphene/hbn

From b1e40a05bce6a02150f0d183dcf30a0aac22d5ae Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:27:46 -0400
Subject: [PATCH 109/437] disallow newton pair off

---
 src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 13 +++++++++++++
 src/INTERLAYER/pair_kolmogorov_crespi_z.h   |  1 +
 src/INTERLAYER/pair_lebedeva_z.cpp          | 13 +++++++++++++
 src/INTERLAYER/pair_lebedeva_z.h            |  1 +
 4 files changed, 28 insertions(+)

diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
index d172d4e9bf..6d39ead50d 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
@@ -28,6 +28,7 @@
 #include "error.h"
 #include "force.h"
 #include "memory.h"
+#include "neighbor.h"
 #include "neigh_list.h"
 #include "potential_file_reader.h"
 #include "tokenizer.h"
@@ -228,6 +229,18 @@ void PairKolmogorovCrespiZ::coeff(int narg, char **arg)
   if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
 }
 
+/* ----------------------------------------------------------------------
+   init specific to this pair style
+------------------------------------------------------------------------- */
+
+void PairKolmogorovCrespiZ::init_style()
+{
+  if (force->newton_pair == 0)
+    error->all(FLERR,"Pair style kolmogorov/crespi/z requires newton pair on");
+
+  neighbor->request(this,instance_me);
+}
+
 /* ----------------------------------------------------------------------
    init for one type pair i,j and corresponding j,i
 ------------------------------------------------------------------------- */
diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.h b/src/INTERLAYER/pair_kolmogorov_crespi_z.h
index fc07dcb96e..dc73f838a2 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_z.h
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.h
@@ -32,6 +32,7 @@ class PairKolmogorovCrespiZ : public Pair {
   virtual void compute(int, int);
   void settings(int, char **);
   void coeff(int, char **);
+  void init_style();
   double init_one(int, int);
 
   static constexpr int NPARAMS_PER_LINE = 11;
diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp
index 76f56e402c..f2dae6b468 100644
--- a/src/INTERLAYER/pair_lebedeva_z.cpp
+++ b/src/INTERLAYER/pair_lebedeva_z.cpp
@@ -30,6 +30,7 @@
 #include "error.h"
 #include "force.h"
 #include "memory.h"
+#include "neighbor.h"
 #include "neigh_list.h"
 #include "potential_file_reader.h"
 #include "tokenizer.h"
@@ -226,6 +227,18 @@ void PairLebedevaZ::coeff(int narg, char **arg)
   if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
 }
 
+/* ----------------------------------------------------------------------
+   init specific to this pair style
+------------------------------------------------------------------------- */
+
+void PairLebedevaZ::init_style()
+{
+  if (force->newton_pair == 0)
+    error->all(FLERR,"Pair style lebedeva/z requires newton pair on");
+
+  neighbor->request(this,instance_me);
+}
+
 /* ----------------------------------------------------------------------
    init for one type pair i,j and corresponding j,i
 ------------------------------------------------------------------------- */
diff --git a/src/INTERLAYER/pair_lebedeva_z.h b/src/INTERLAYER/pair_lebedeva_z.h
index 9b2fbd56f8..9b715b185d 100644
--- a/src/INTERLAYER/pair_lebedeva_z.h
+++ b/src/INTERLAYER/pair_lebedeva_z.h
@@ -32,6 +32,7 @@ class PairLebedevaZ : public Pair {
   virtual void compute(int, int);
   void settings(int, char **);
   void coeff(int, char **);
+  void init_style();
   double init_one(int, int);
 
   static constexpr int NPARAMS_PER_LINE = 12;

From 3a8faa8966cab9bb069e25a22b9ad8f7c3a52e1b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:28:32 -0400
Subject: [PATCH 110/437] correct stress tally

---
 src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
index 6d39ead50d..8f219656b7 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp
@@ -159,7 +159,18 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag)
         if (eflag) { evdwl = -p.A * p.z06 / r6 + exp1 * sumCff - offset[itype][jtype]; }
 
         if (evflag) {
-          ev_tally_xyz(i, j, nlocal, newton_pair, evdwl, 0, fsum, fsum, fpair, delx, dely, delz);
+          ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
+          if (vflag_either) {
+            double fi[3],fj[3];
+            fi[0] = delx * fpair1;
+            fi[1] = dely * fpair1;
+            fi[2] = 0;
+            fj[0] = -delx * fpair1;
+            fj[1] = -dely * fpair1;
+            fj[2] = 0;
+            v_tally2_newton(i,fi,x[i]);
+            v_tally2_newton(j,fj,x[j]);
+          }
         }
       }
     }

From b55673f0a6dc362e17dec67b274db2729e4b8477 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:28:43 -0400
Subject: [PATCH 111/437] add unit test

---
 .../manybody-pair-kolmogorov_crespi_z.yaml    | 126 ++++++++++++++++++
 1 file changed, 126 insertions(+)
 create mode 100644 unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_z.yaml

diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_z.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_z.yaml
new file mode 100644
index 0000000000..e59d9851ea
--- /dev/null
+++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_z.yaml
@@ -0,0 +1,126 @@
+---
+lammps_version: 30 Jul 2021
+date_generated: Wed Aug 25 07:14:32 2021
+epsilon: 5e-13
+skip_tests: single
+prerequisites: ! |
+  pair kolmogorov/crespi/z
+  atom full
+pre_commands: ! |
+  variable newton_pair delete
+  variable newton_pair index on
+  comm_modify cutoff 16.0
+post_commands: ! ""
+input_file: in.bilayer
+pair_style: hybrid/overlay kolmogorov/crespi/z 16.0
+pair_coeff: ! |
+  * * kolmogorov/crespi/z CC.KC C C C
+extract: ! ""
+natoms: 48
+init_vdwl: 198.0484319961999
+init_coul: 0
+init_stress: ! |2-
+   9.0644144509597231e+02  8.9737534362016413e+02  7.8864194018366904e-02  1.3395398220874608e+01 -4.9535241455594091e-02 -4.1528134881522460e-02
+init_forces: ! |2
+    1  5.3348343168299364e+00  2.3256189721350444e+00  5.9504392386259146e-02
+    2  4.7785621527530342e+00 -4.8710602042279216e-01 -5.4545469377135704e-02
+    3 -1.1168915294289388e+00 -2.2258126428430529e+00  7.6694447112156047e-04
+    4 -8.7376468728230750e-01  9.4368851040723767e-01 -6.5035584323277940e-02
+    5  4.5198005903247083e+00  4.1074740900536115e+00 -8.7371673089977342e-03
+    6  5.4375288146880560e+00 -5.1433571466681745e+00  3.9305504185418012e-02
+    7  1.2208890790894600e+00 -8.1641085765920174e-01 -1.3352360017193796e-01
+    8  5.1272116716286398e-01  9.4573486892721448e-01 -2.3098407688269464e-02
+    9 -1.2245959963594422e+00 -2.0770946714225141e-01  6.9969480853388305e-02
+   10 -8.8885237560966313e-01 -2.0499261472624675e-01 -3.4810693026357802e-02
+   11  1.9468399313314946e+00 -1.4601851313728398e+00  1.7461147245031688e-01
+   12 -1.2551831833489862e+00  1.4409985043171267e+00 -4.8786671942592785e-02
+   13  1.7962484655931472e+00  4.6873536554649775e-01  1.2159470710170561e-01
+   14  6.6355426847723775e-01  7.5459771250948848e-01 -6.4703184753148332e-02
+   15 -1.8330891813231542e+00 -9.6544971678660785e-01  9.2874061497501575e-02
+   16  1.6495997243364415e+00  9.4316823200447530e-01 -8.2500788376204837e-02
+   17 -4.0551683248019244e-01 -1.3309232404571960e+00  1.3977808129699970e-01
+   18 -2.5936966695670343e+00  1.4487734047563544e-02 -3.5274782552890943e-01
+   19 -2.1849314733348804e+00  1.4963776468245567e+00  2.9708567327927388e-01
+   20 -5.3746957562109285e+00 -6.5377450284914451e-01 -2.0449521917474445e-01
+   21  1.3965321100494394e+00 -1.8059816967447822e+00  7.3098332187937036e-03
+   22  1.4817298761363022e+00  1.9756480967446886e+00 -1.8178328755798240e-01
+   23 -6.8319886477141365e+00  2.4816632014983186e+00  8.2288261378643118e-02
+   24 -6.1503292584983935e+00 -2.5975546507901619e+00 -7.7747869600525793e-02
+   25 -4.0689924035772707e-01 -6.9766837313218799e-01  5.4064280156258457e-04
+   26  5.4964695690187284e+00  4.4599199628874597e+00 -1.5558133808590582e-01
+   27  2.9588537182133194e+00 -4.4726792744060955e+00 -1.2562457242223085e-01
+   28  1.8598345487845340e+00  4.2753662763121908e-01  2.8228562141788732e-01
+   29 -1.4276121634554422e+00  1.7279605732811201e-01 -1.6954267562027564e-01
+   30  6.8063069498886151e+00  3.3265237574791175e+00 -1.1164523995449715e-02
+   31  3.3330705409412462e+00 -2.3935228868743899e+00  5.4308072787988736e-02
+   32  6.5570509945031452e-01 -2.4020200255842300e-01  1.2488157505501848e-03
+   33 -1.0518824551221366e+00  9.2103155336168557e-02 -1.3403035827576482e-01
+   34  1.7482905720327369e+00 -6.9882734694619375e-01  8.5963700326871298e-02
+   35 -4.7864899070045958e-01  5.5517876373522757e-01 -9.8516598579710055e-02
+   36  4.6225124648585708e-01 -7.6767830527676009e-02  2.3141667885030026e-01
+   37 -1.6763571363729157e+00 -2.6966956770052142e-01 -7.9944027029069206e-02
+   38  1.5531744170606854e+00  1.3208552831167166e+00 -4.3997039333437564e-02
+   39 -1.9055815073324109e+00 -1.2428954744396123e+00  2.1923526204960873e-02
+   40  9.2892557021092592e-01  8.5429365461048679e-01  2.1536217788766898e-01
+   41 -6.6580658991677408e+00 -2.3642327420628977e+00  2.0651675580736870e-01
+   42  1.0367950245250726e+00 -1.7458171945604464e-01 -3.8087724538496348e-02
+   43 -1.5035413732329261e+00 -4.8083649653131499e-01 -1.8931363891155159e-01
+   44 -3.4795302876086018e+00  4.7781264447100362e+00  1.5372288335058557e-01
+   45 -5.4074323973878604e+00 -5.2594483396748704e+00  8.3974349281692146e-02
+   46  2.0992650359812742e-01  1.2850079800303573e+00  8.8048698665581765e-02
+   47  9.4179948121221568e-01 -2.7853182799762966e-01 -2.4469757628271135e-01
+   48 -4.0011566962981933e+00  1.3785869488895595e+00  1.1261550665224510e-01
+run_vdwl: 198.00550676651036
+run_coul: 0
+run_stress: ! |2-
+   9.0585872912972786e+02  8.9758748110647025e+02  7.8698273590959100e-02  1.3075281480044731e+01 -4.8004210940133248e-02 -4.0161387221796921e-02
+run_forces: ! |2
+    1  5.2047926052306615e+00  2.2473762345413713e+00  5.9584161887120422e-02
+    2  4.6851084413822441e+00 -4.5109570909076058e-01 -5.4631713906825148e-02
+    3 -1.0871364193814106e+00 -2.1758176996411080e+00  7.4359782647119219e-04
+    4 -8.4326816249892556e-01  9.1320184255414583e-01 -6.5081754962167560e-02
+    5  4.4077640872864858e+00  3.9987715974360869e+00 -8.8927779586276609e-03
+    6  5.2961853754680419e+00 -5.0091995670577543e+00  3.9531346151420128e-02
+    7  1.2232813384076739e+00 -7.8791514344192659e-01 -1.3366520068056503e-01
+    8  5.1780217527319117e-01  9.1100972674650826e-01 -2.3201828250186143e-02
+    9 -1.1995203432218362e+00 -2.1003683620550301e-01  7.0101271966858530e-02
+   10 -8.7081374776204634e-01 -1.9805140233706198e-01 -3.4922611021479207e-02
+   11  1.9105397974468521e+00 -1.4293028888308517e+00  1.7510054284391999e-01
+   12 -1.2360348257379639e+00  1.4116741818791763e+00 -4.8939093649939924e-02
+   13  1.7652214835045452e+00  4.7399251700912959e-01  1.2178382298739600e-01
+   14  6.5330363946844416e-01  7.3889002333158638e-01 -6.4786848085368900e-02
+   15 -1.8124305214064478e+00 -9.4915083795291133e-01  9.3101630312107816e-02
+   16  1.6219108447222075e+00  9.2796174511555340e-01 -8.2700791251682795e-02
+   17 -4.1251544698973341e-01 -1.2922662476541500e+00  1.4011406917661748e-01
+   18 -2.5570034807038446e+00 -4.9200132308853534e-03 -3.5347516590234479e-01
+   19 -2.1351583321036722e+00  1.4356976393975065e+00  2.9769355899243943e-01
+   20 -5.2454589471468500e+00 -6.0532361400571932e-01 -2.0491595935035967e-01
+   21  1.3537552322457542e+00 -1.7532382249360461e+00  7.5188508574378556e-03
+   22  1.4365722918861625e+00  1.9257045388296903e+00 -1.8217267708850063e-01
+   23 -6.6590997631958242e+00  2.3878062837927017e+00  8.2628510513121659e-02
+   24 -6.0126039818523171e+00 -2.5069716481174056e+00 -7.7863657685253315e-02
+   25 -3.8051133644700968e-01 -7.0070235165347861e-01  6.3129746853828397e-04
+   26  5.3520470921524552e+00  4.3283909827095890e+00 -1.5518428255682115e-01
+   27  2.8762473085047304e+00 -4.3529586341691164e+00 -1.2555733763592616e-01
+   28  1.8354657954975644e+00  4.3104037769018572e-01  2.8279096525716740e-01
+   29 -1.3746974494369300e+00  1.6368530839773068e-01 -1.6993837598648334e-01
+   30  6.6309050826647642e+00  3.2230008065601901e+00 -1.0765163657435461e-02
+   31  3.2562153401168414e+00 -2.3137944305780080e+00  5.4413474745743338e-02
+   32  6.5301371153639831e-01 -2.2920387673350820e-01  1.1847629503530972e-03
+   33 -1.0254564068259704e+00  9.4758329916654144e-02 -1.3435237894415628e-01
+   34  1.7199891938475140e+00 -6.8641678832453279e-01  8.6197024462564678e-02
+   35 -4.6383967769379036e-01  5.3907891364408822e-01 -9.8916740573149739e-02
+   36  4.5126364328583846e-01 -7.4609604284228470e-02  2.3187673050533439e-01
+   37 -1.6486423085242807e+00 -2.6734336022719585e-01 -8.0108728515440458e-02
+   38  1.5213997908194694e+00  1.2977726934903238e+00 -4.4040408696588443e-02
+   39 -1.8716947574176781e+00 -1.2174414924135113e+00  2.1972664763825492e-02
+   40  9.0881764590515479e-01  8.3247720986674256e-01  2.1574041468876645e-01
+   41 -6.4955140525184083e+00 -2.2774843374359843e+00  2.0620960628596371e-01
+   42  9.9538467078611481e-01 -1.6108870456182192e-01 -3.8291833141328536e-02
+   43 -1.4869366470437115e+00 -4.8493272764325579e-01 -1.8970248367384740e-01
+   44 -3.3928896765296992e+00  4.6562783524005944e+00  1.5372779614991433e-01
+   45 -5.2554020392703000e+00 -5.1162888483334887e+00  8.3656017747003500e-02
+   46  1.8331941409439106e-01  1.2759666131041416e+00  8.8227595664385206e-02
+   47  9.1776164643045643e-01 -2.8051166092520152e-01 -2.4525920026234527e-01
+   48 -3.9114393242553431e+00  1.3215307313717093e+00  1.1283729923235016e-01
+...

From ce0f1478cbd72da5326e443d8041683244956d7a Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:39:17 -0400
Subject: [PATCH 112/437] correct stress tally to give results consistent with
 fdotr

---
 src/INTERLAYER/pair_lebedeva_z.cpp | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp
index f2dae6b468..cd788fdba6 100644
--- a/src/INTERLAYER/pair_lebedeva_z.cpp
+++ b/src/INTERLAYER/pair_lebedeva_z.cpp
@@ -138,16 +138,16 @@ void PairLebedevaZ::compute(int eflag, int vflag)
         // derivatives
         fpair = -6.0*p.A*p.z06/r8+p.B*p.alpha*exp1/r; // used for x,y,z
         der   = p.D1+2*p.D2*rhosq-p.lambda1*sumD; // used for x,y
-        fxy   = fpair - 2*p.C*exp2*exp3*der;
-        fz    = fpair + 2*p.C*p.lambda2*sumD*exp2*exp3;
+        fxy   = 2*p.C*exp2*exp3*der;
+        fz    = 2*p.C*p.lambda2*sumD*exp2*exp3;
 
-        f[i][0] += delx*fxy;
-        f[i][1] += dely*fxy;
-        f[i][2] += delz*fz;
+        f[i][0] += delx*(fpair-fxy);
+        f[i][1] += dely*(fpair-fxy);
+        f[i][2] += delz*(fpair+fz);
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fxy;
-          f[j][1] -= dely*fxy;
-          f[j][2] -= delz*fz;
+          f[j][0] -= delx*(fpair-fxy);
+          f[j][1] -= dely*(fpair-fxy);
+          f[j][2] -= delz*(fpair+fz);
         }
 
         if (eflag) {
@@ -155,8 +155,18 @@ void PairLebedevaZ::compute(int eflag, int vflag)
         }
 
         if (evflag) {
-          ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0,
-                       -fxy,-fxy,-fz,delx,dely,delz);
+          ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
+          if (vflag_either) {
+            double fi[3],fj[3];
+            fi[0] = -delx * fxy;
+            fi[1] = -dely * fxy;
+            fi[2] =  delz * fz;
+            fj[0] =  delx * fxy;
+            fj[1] =  dely * fxy;
+            fj[2] = -delz * fz;
+            v_tally2_newton(i,fi,x[i]);
+            v_tally2_newton(j,fj,x[j]);
+          }
         }
       }
     }

From cc98f9b1e6851d99ec3d7fa46764851ca9f76990 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:39:23 -0400
Subject: [PATCH 113/437] add unit test

---
 .../tests/manybody-pair-lebedeva_z.yaml       | 126 ++++++++++++++++++
 1 file changed, 126 insertions(+)
 create mode 100644 unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml

diff --git a/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml b/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml
new file mode 100644
index 0000000000..b2792314db
--- /dev/null
+++ b/unittest/force-styles/tests/manybody-pair-lebedeva_z.yaml
@@ -0,0 +1,126 @@
+---
+lammps_version: 30 Jul 2021
+date_generated: Wed Aug 25 07:37:07 2021
+epsilon: 1e-13
+skip_tests: single
+prerequisites: ! |
+  pair lebedeva/z
+  atom full
+pre_commands: ! |
+  variable newton_pair delete
+  variable newton_pair index on
+  comm_modify cutoff 16.0
+post_commands: ! ""
+input_file: in.bilayer
+pair_style: hybrid/overlay lebedeva/z 16.0
+pair_coeff: ! |
+  * * lebedeva/z CC.Lebedeva C C C
+extract: ! ""
+natoms: 48
+init_vdwl: 2360.887727742073
+init_coul: 0
+init_stress: ! |2-
+   7.1534438224572805e+03  7.1506071494705675e+03  1.2432957453131402e-01  6.0801570724187187e+01 -4.2416974189084528e-01 -4.1193916014148946e-01
+init_forces: ! |2
+    1  2.1495840130577207e+01  1.0830550834363393e+01  1.8137935918334763e-01
+    2  2.0432731679228027e+01 -2.9803402182512952e+00  2.9547234413851053e-01
+    3 -4.8985060153967197e+00 -9.7128366215365034e+00 -6.9787959311850667e-01
+    4 -3.6336312277240337e+00  4.1491536645549818e+00 -2.2535747714880212e-02
+    5  1.8637039516057627e+01  1.8350545450408632e+01 -8.4963587797541951e-01
+    6  2.1978509714772208e+01 -2.2896971858809632e+01  1.5851082487276531e+00
+    7  5.7882981559251903e+00 -3.2747398381846722e+00 -2.6785186626013253e+00
+    8  2.8011201872602243e+00  4.0130567460874573e+00  6.5391174106545358e-01
+    9 -5.5183912180745445e+00 -6.4520286657390269e-01  3.3999108034370462e-01
+   10 -3.5784163550133425e+00 -1.3312366585172366e+00  5.1839410343883674e-01
+   11  8.0095778679754766e+00 -6.4486468807024986e+00  1.9129315188663290e+00
+   12 -4.6638820420353078e+00  6.2807012948457972e+00  2.3504043197356642e-01
+   13  7.6647668430934512e+00  1.9936538042703436e+00  1.1077257631646276e+00
+   14  3.1311603921764752e+00  3.1681317810687362e+00  8.1724855683560527e-02
+   15 -7.4177741005960760e+00 -3.6505902172992770e+00  6.7596130715178948e-01
+   16  6.6349798189248572e+00  4.0113344780571598e+00 -2.4779218479758697e-01
+   17 -2.2003527625519665e+00 -5.7933643791213587e+00  1.3743201013525028e+00
+   18 -1.1422558611501209e+01 -8.5134419415816898e-02 -4.2438172886105301e+00
+   19 -8.9840415627894235e+00  7.7367145470319567e+00  3.6142925031041941e+00
+   20 -2.2423164044595801e+01 -3.3938768287238785e+00 -2.0489354166661800e+00
+   21  5.9629731843596563e+00 -6.9343942521608160e+00 -5.8664287078268817e-01
+   22  5.9735322471575731e+00  8.0207062046718356e+00 -1.7623238911668899e+00
+   23 -2.8380233720233623e+01  1.0629383056285256e+01  5.5374728115562033e-01
+   24 -2.5388637572879826e+01 -1.2036571731634098e+01 -1.6563407517598749e-01
+   25 -1.1960099659227481e+00 -2.9857363969328112e+00  7.0740379131610465e-01
+   26  2.1855105137482354e+01  1.9266727846260551e+01 -3.2075250208177759e+00
+   27  1.1983637463605305e+01 -1.9312471189040942e+01 -1.0914235916432231e+00
+   28  7.9838045946520513e+00  1.7083340737692789e+00  3.2133634689936934e+00
+   29 -5.4044069600908227e+00  7.9664368305733579e-01 -1.8142413401046531e+00
+   30  2.7745905271455314e+01  1.3837114040403961e+01 -1.0723560560378711e+00
+   31  1.4134615358350846e+01 -1.1778617115530899e+01  1.4851182928657196e+00
+   32  2.7028435497781427e+00 -9.1442329169715875e-01 -9.9390439365278682e-01
+   33 -4.2985646797249810e+00 -3.5098056165265207e-02 -1.2995310686118902e+00
+   34  8.0623725935775532e+00 -3.1802252812619694e+00  2.5059613168559131e-01
+   35 -2.0609840526644319e+00  2.4635581697784499e+00 -7.6644502196185194e-01
+   36  1.3862350630299518e+00 -8.1449634234505619e-01  2.4775330435834246e+00
+   37 -6.9582179612899253e+00 -8.6615786847650111e-01 -4.7949410796544534e-01
+   38  6.1801653738680029e+00  5.9380560495578978e+00 -1.7084039437786178e+00
+   39 -8.1244143916555842e+00 -5.2662515652224942e+00  1.0469396716401302e+00
+   40  3.9250266079613696e+00  3.5329495713403900e+00  2.2118775484068798e+00
+   41 -2.6931455570294290e+01 -9.9358510179082646e+00  3.5881896941421649e+00
+   42  3.7477747246379050e+00 -5.9755802511749734e-01 -1.5638895204839454e+00
+   43 -6.3748444831369673e+00 -1.5247249006280454e+00 -2.0982562793122876e+00
+   44 -1.4267039472778967e+01  2.0748902403760514e+01  1.2889303111832842e+00
+   45 -2.1335389998564661e+01 -2.2000115281198475e+01  1.8418216646303314e+00
+   46  1.9531801570887555e-01  5.1858679287942744e+00  3.7725144324396798e-01
+   47  4.4311536448901796e+00 -1.5561076109049006e+00 -2.9395615603743455e+00
+   48 -1.7383570366990149e+01  7.2896550849931154e+00  7.1972181231369481e-01
+run_vdwl: 2360.161327097515
+run_coul: 0
+run_stress: ! |2-
+   7.1445643663484225e+03  7.1567044663163206e+03  1.4212147439906483e-01  5.5300304683013415e+01 -3.8306950064604117e-01 -3.7050895704103859e-01
+run_forces: ! |2
+    1  1.9420842377589814e+01  9.5013325689417290e+00  1.7609721453381699e-01
+    2  1.8737496812823327e+01 -2.3387226029304533e+00  2.8921104855356095e-01
+    3 -4.3186299346546519e+00 -8.7512311086837755e+00 -7.1766066501390724e-01
+    4 -3.1319003905903462e+00  3.5590072460392959e+00 -1.7526561412397581e-02
+    5  1.6792199910926755e+01  1.6365454560952386e+01 -8.7014653085458926e-01
+    6  1.9846363618686624e+01 -2.0547191727012070e+01  1.6401889500191840e+00
+    7  5.7060815032621450e+00 -2.7308400499434482e+00 -2.7349933966093021e+00
+    8  2.7832474870715203e+00  3.3541698848498811e+00  6.7444512159616843e-01
+    9 -5.0369085795409738e+00 -7.1557268283779596e-01  3.3931051877154195e-01
+   10 -3.2587873527306841e+00 -1.1421718240221135e+00  5.2120602713186126e-01
+   11  7.3473632320692364e+00 -5.8522771304925305e+00  1.9694215885096660e+00
+   12 -4.3709295021800614e+00  5.7558282413702671e+00  2.2798139296144487e-01
+   13  7.1157033827049156e+00  2.0708755120774378e+00  1.1223248028420918e+00
+   14  2.9354573009373257e+00  2.8768154160414960e+00  8.8449732870980000e-02
+   15 -7.0770925041064343e+00 -3.3845374889571276e+00  6.9850724887806404e-01
+   16  6.1301527532850457e+00  3.7577496751492410e+00 -2.6446269330583860e-01
+   17 -2.2230286618405661e+00 -5.0347473778524323e+00  1.4239799728780795e+00
+   18 -1.0680153318678943e+01 -4.6261341933955091e-01 -4.3648787425781155e+00
+   19 -8.1293677902039505e+00  6.5848221071033120e+00  3.7145536094962806e+00
+   20 -2.0282191094695960e+01 -2.6088565663707506e+00 -2.1059479066196873e+00
+   21  5.2175784187354264e+00 -6.0117971841792297e+00 -5.7199203340714710e-01
+   22  5.1792796776909444e+00  7.1430799174956237e+00 -1.8047321470174762e+00
+   23 -2.5542280937496248e+01  9.1486765335424298e+00  5.6899803320652897e-01
+   24 -2.3159629396461831e+01 -1.0537329911456288e+01 -1.7599965042786367e-01
+   25 -8.2943513848947825e-01 -3.0608845039274488e+00  7.4559253728086750e-01
+   26  1.9714500510226785e+01  1.7065989119046563e+01 -3.2695187340288125e+00
+   27  1.0655560826908285e+01 -1.7250583198713180e+01 -1.1064618206558723e+00
+   28  7.5120916165120573e+00  1.8342454816641347e+00  3.2947715166978280e+00
+   29 -4.5511588873314359e+00  5.4714534489459932e-01 -1.8543163433849958e+00
+   30  2.5056830873002568e+01  1.2224500875079812e+01 -1.0900210710668765e+00
+   31  1.2755552118209442e+01 -1.0312275039533361e+01  1.5249935384025117e+00
+   32  2.6130622723957986e+00 -6.6120078334970622e-01 -1.0317112350634094e+00
+   33 -3.8349355209272096e+00  1.7846636245871572e-05 -1.3306890346164337e+00
+   34  7.5576490353003374e+00 -2.9269687180604316e+00  2.6493636248773594e-01
+   35 -1.8356473512671103e+00  2.1374316961831799e+00 -8.1710932703289629e-01
+   36  1.2276849720950831e+00 -7.3662599658881855e-01  2.5433673098673775e+00
+   37 -6.5245701545521069e+00 -8.9514389622931190e-01 -4.9304572868283220e-01
+   38  5.6884643265805819e+00  5.5229894692236927e+00 -1.7348379610509388e+00
+   39 -7.5364203867882367e+00 -4.7990902146466885e+00  1.0719307064205941e+00
+   40  3.6004916907143132e+00  3.1260993214823030e+00  2.2699993659629172e+00
+   41 -2.4399724005125218e+01 -8.5963646372860989e+00  3.6630925900218325e+00
+   42  3.0786439237296608e+00 -2.9358018340297787e-01 -1.6007207650212871e+00
+   43 -6.0460115568958637e+00 -1.6664688787351791e+00 -2.1504955263884811e+00
+   44 -1.2868653460795150e+01  1.8641178885202173e+01  1.3109589266412400e+00
+   45 -1.9113266617394892e+01 -1.9622611791991883e+01  1.8639264872259769e+00
+   46 -1.6835385400618069e-01  5.0741627690987547e+00  3.9265433469144118e-01
+   47  3.9981010581382925e+00 -1.6376840923679119e+00 -3.0166184775741640e+00
+   48 -1.5751323302842609e+01  6.2857985368367890e+00  7.2298741386372622e-01
+...

From 1c0ac4adb7a312ddaa51de486269cc2c337d4500 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 07:57:16 -0400
Subject: [PATCH 114/437] correct citation string

---
 src/INTERLAYER/pair_ilp_graphene_hbn.cpp       | 1 +
 src/INTERLAYER/pair_kolmogorov_crespi_full.cpp | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
index 43070c5156..c9e83d5bc8 100644
--- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
+++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp
@@ -47,6 +47,7 @@ using namespace InterLayer;
 #define PGDELTA 1
 
 static const char cite_ilp[] =
+    "ilp/graphene/hbn potential doi:10.1021/acs.nanolett.8b02848\n"
     "@Article{Ouyang2018\n"
     " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n"
     " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n"
diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
index e8db858218..11dd458bf7 100644
--- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
+++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp
@@ -47,6 +47,7 @@ using namespace InterLayer;
 #define PGDELTA 1
 
 static const char cite_kc[] =
+    "kolmogorov/crespi/full potential doi:10.1021/acs.nanolett.8b02848\n"
     "@Article{Ouyang2018\n"
     " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n"
     " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n"

From ae94a60d4aa534f92199f9d0b95b244cfa8f04ae Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Wed, 25 Aug 2021 12:42:47 -0600
Subject: [PATCH 115/437] more debugging

---
 src/EXTRA-FIX/fix_ttm.cpp      | 15 +++++++++++----
 src/EXTRA-FIX/fix_ttm_grid.cpp | 28 ----------------------------
 src/EXTRA-FIX/fix_ttm_old.cpp  |  3 ++-
 3 files changed, 13 insertions(+), 33 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 00136d069b..2af3685b4d 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -187,11 +187,11 @@ void FixTTM::post_constructor()
 
   memset(&T_electron[0][0][0],0,ngridtotal*sizeof(double));
 
-  // zero net_energy_transfer
+  // zero net_energy_transfer_all
   // in case compute_vector accesses it on timestep 0
 
   outflag = 0;
-  memset(&net_energy_transfer[0][0][0],0,ngridtotal*sizeof(double));
+  memset(&net_energy_transfer_all[0][0][0],0,ngridtotal*sizeof(double));
 
   // set initial electron temperatures from user input file
 
@@ -354,11 +354,10 @@ void FixTTM::end_of_step()
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
-  outflag = 0;
   for (iz = 0; iz < nzgrid; iz++)
     for (iy = 0; iy < nygrid; iy++)
       for (ix = 0; ix < nxgrid; ix++)
-        net_energy_transfer[iz][iy][ix] = 0;
+        net_energy_transfer[iz][iy][ix] = 0.0;
 
   for (int i = 0; i < nlocal; i++)
     if (mask[i] & groupbit) {
@@ -377,8 +376,13 @@ void FixTTM::end_of_step()
       net_energy_transfer[iz][iy][ix] +=
         (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
          flangevin[i][2]*v[i][2]);
+      //printf("FLANG i %d xyz %g %g %g\n",i,
+      //       flangevin[i][0],
+      //       flangevin[i][1],
+      //       flangevin[i][2]);
     }
 
+  outflag = 0;
   MPI_Allreduce(&net_energy_transfer[0][0][0],
                 &net_energy_transfer_all[0][0][0],
                 ngridtotal,MPI_DOUBLE,MPI_SUM,world);
@@ -706,8 +710,11 @@ double FixTTM::compute_vector(int n)
             electronic_density*del_vol;
           transfer_energy +=
             net_energy_transfer_all[iz][iy][ix]*update->dt;
+          //printf("TRANSFER %d %d %d %g\n",ix,iy,iz,transfer_energy);
         }
 
+    //printf("TRANSFER %g\n",transfer_energy);
+
     outflag = 1;
   }
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index cabc2a6b1c..4ded3448d6 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -453,34 +453,6 @@ void FixTTMGrid::allocate_grid()
   comm->partition_grid(nxgrid,nygrid,nzgrid,0.0,
                        nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in);
 
-  /*
-  // global indices of grid range from 0 to N-1
-  // nlo_in,nhi_in = lower/upper limits of the 3d sub-brick of
-  //   global grid that I own without ghost cells
-  // both non-tiled and tiled proc layouts use 0-1 fractional subdomain info
-
-  if (comm->layout != Comm::LAYOUT_TILED) {
-    nxlo_in = static_cast (comm->xsplit[comm->myloc[0]] * nxgrid);
-    nxhi_in = static_cast (comm->xsplit[comm->myloc[0]+1] * nxgrid) - 1;
-
-    nylo_in = static_cast (comm->ysplit[comm->myloc[1]] * nygrid);
-    nyhi_in = static_cast (comm->ysplit[comm->myloc[1]+1] * nygrid) - 1;
-
-    nzlo_in = static_cast (comm->zsplit[comm->myloc[2]] * nzgrid);
-    nzhi_in = static_cast (comm->zsplit[comm->myloc[2]+1] * nzgrid) - 1;
-
-  } else {
-    nxlo_in = static_cast (comm->mysplit[0][0] * nxgrid);
-    nxhi_in = static_cast (comm->mysplit[0][1] * nxgrid) - 1;
-
-    nylo_in = static_cast (comm->mysplit[1][0] * nygrid);
-    nyhi_in = static_cast (comm->mysplit[1][1] * nygrid) - 1;
-
-    nzlo_in = static_cast (comm->mysplit[1][0] * nzgrid);
-    nzhi_in = static_cast (comm->mysplit[1][1] * nzgrid) - 1;
-  }
-  */
-
   // nlo,nhi = min/max index of global grid pt my owned atoms can be mapped to
   // finite difference stencil requires extra grid pt around my owned grid pts
   // max of these 2 quantities is the ghost cells needed in each dim
diff --git a/src/EXTRA-FIX/fix_ttm_old.cpp b/src/EXTRA-FIX/fix_ttm_old.cpp
index 80db9e3fc2..43d1b7f3f6 100644
--- a/src/EXTRA-FIX/fix_ttm_old.cpp
+++ b/src/EXTRA-FIX/fix_ttm_old.cpp
@@ -640,7 +640,8 @@ void FixTTMOld::restart(char *buf)
 
   // the seed must be changed from the initial seed
 
-  seed = static_cast (0.5*rlist[n++]);
+  seed = static_cast (rlist[n++]) + 1;
+  //seed = static_cast (0.5*rlist[n++]);
 
   for (int ixnode = 0; ixnode < nxnodes; ixnode++)
     for (int iynode = 0; iynode < nynodes; iynode++)

From abd4a6cfa3ff2e30abec17f847745b2f13b98b56 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 16:41:25 -0400
Subject: [PATCH 116/437] remove calls to Modify::end_of_step() during the
 full_energy() functions

the fixes atom/swap, gcmc, widom, and charge_regulation would call
Modify::end_of_step() in order to make certain that all energy contributions
to the total energy are properly tallied. However, this is no longer
true and it causes lots of unexpected problems, since fixes like
fix ave/time, fix store/state, fix print and many more are called at
the wrong time during a timestep and possibly multiple times which can
lead to very unexpected and incorrect results. fix atc and fix colvars
are currently the only fixes that signal that they contribute to the
global energy *and* run during Modify::end_of_step(). However, they
do not perform any actions related to the global energy in those calls.
---
 src/MC/fix_atom_swap.cpp         | 1 -
 src/MC/fix_charge_regulation.cpp | 2 +-
 src/MC/fix_gcmc.cpp              | 3 +--
 src/MC/fix_widom.cpp             | 3 +--
 4 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/src/MC/fix_atom_swap.cpp b/src/MC/fix_atom_swap.cpp
index e2fa4823bf..84c060a557 100644
--- a/src/MC/fix_atom_swap.cpp
+++ b/src/MC/fix_atom_swap.cpp
@@ -516,7 +516,6 @@ double FixAtomSwap::energy_full()
   if (force->kspace) force->kspace->compute(eflag,vflag);
 
   if (modify->n_post_force) modify->post_force(vflag);
-  if (modify->n_end_of_step) modify->end_of_step();
 
   update->eflag_global = update->ntimestep;
   double total_energy = c_pe->compute_scalar();
diff --git a/src/MC/fix_charge_regulation.cpp b/src/MC/fix_charge_regulation.cpp
index 2d04af50b8..2497b3d976 100644
--- a/src/MC/fix_charge_regulation.cpp
+++ b/src/MC/fix_charge_regulation.cpp
@@ -1108,7 +1108,7 @@ double FixChargeRegulation::energy_full() {
 
   if (modify->n_pre_reverse) modify->pre_reverse(eflag,vflag);
   if (modify->n_post_force) modify->post_force(vflag);
-  if (modify->n_end_of_step) modify->end_of_step();
+
   update->eflag_global = update->ntimestep;
   double total_energy = c_pe->compute_scalar();
   return total_energy;
diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp
index fc1b1c03db..3420c23e82 100644
--- a/src/MC/fix_gcmc.cpp
+++ b/src/MC/fix_gcmc.cpp
@@ -2319,10 +2319,9 @@ double FixGCMC::energy_full()
 
   if (modify->n_pre_reverse) modify->pre_reverse(eflag,vflag);
   if (modify->n_post_force) modify->post_force(vflag);
-  if (modify->n_end_of_step) modify->end_of_step();
 
   // NOTE: all fixes with energy_global_flag set and which
-  //   operate at pre_force() or post_force() or end_of_step()
+  //   operate at pre_force() or post_force()
   //   and which user has enabled via fix_modify energy yes,
   //   will contribute to total MC energy via pe->compute_scalar()
 
diff --git a/src/MC/fix_widom.cpp b/src/MC/fix_widom.cpp
index 7b4a749f2e..f3204ca800 100644
--- a/src/MC/fix_widom.cpp
+++ b/src/MC/fix_widom.cpp
@@ -1053,10 +1053,9 @@ double FixWidom::energy_full()
 
   if (modify->n_pre_reverse) modify->pre_reverse(eflag,vflag);
   if (modify->n_pre_force) modify->pre_force(vflag);
-  if (modify->n_end_of_step) modify->end_of_step();
 
   // NOTE: all fixes with energy_global_flag set and which
-  //   operate at pre_force() or post_force() or end_of_step()
+  //   operate at pre_force() or post_force()
   //   and which user has enabled via fix_modify energy yes,
   //   will contribute to total MC energy via pe->compute_scalar()
 

From a0dfae987600a608dc5dc37ff2e25215f192cfd1 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Wed, 25 Aug 2021 16:28:40 -0600
Subject: [PATCH 117/437] more debugging of restarts

---
 src/EXTRA-FIX/fix_ttm.cpp      | 48 ++++++++++++++++------------------
 src/EXTRA-FIX/fix_ttm_grid.cpp | 33 ++++++++++++-----------
 2 files changed, 41 insertions(+), 40 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 2af3685b4d..db7142e66b 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -287,16 +287,18 @@ void FixTTM::post_force(int /*vflag*/)
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
+  double *boxlo = domain->boxlo;
+  double dxinv = nxgrid/domain->xprd;
+  double dyinv = nygrid/domain->yprd;
+  double dzinv = nzgrid/domain->zprd;
+
   // apply damping and thermostat to all atoms in fix group
 
   for (int i = 0; i < nlocal; i++) {
     if (mask[i] & groupbit) {
-      xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-      yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-      zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      ix = static_cast(xscale*nxgrid + shift) - OFFSET;
-      iy = static_cast(yscale*nygrid + shift) - OFFSET;
-      iz = static_cast(zscale*nzgrid + shift) - OFFSET;
+      ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET;
+      iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET;
+      iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET;
       if (ix < 0) ix += nxgrid;
       if (iy < 0) iy += nygrid;
       if (iz < 0) iz += nzgrid;
@@ -354,6 +356,11 @@ void FixTTM::end_of_step()
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
+  double *boxlo = domain->boxlo;
+  double dxinv = nxgrid/domain->xprd;
+  double dyinv = nygrid/domain->yprd;
+  double dzinv = nzgrid/domain->zprd;
+
   for (iz = 0; iz < nzgrid; iz++)
     for (iy = 0; iy < nygrid; iy++)
       for (ix = 0; ix < nxgrid; ix++)
@@ -361,25 +368,19 @@ void FixTTM::end_of_step()
 
   for (int i = 0; i < nlocal; i++)
     if (mask[i] & groupbit) {
-      xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-      yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-      zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      ix = static_cast(xscale*nxgrid + shift) - OFFSET;
-      iy = static_cast(yscale*nygrid + shift) - OFFSET;
-      iz = static_cast(zscale*nzgrid + shift) - OFFSET;
+      ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET;
+      iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET;
+      iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET;
       if (ix < 0) ix += nxgrid;
       if (iy < 0) iy += nygrid;
       if (iz < 0) iz += nzgrid;
       if (ix >= nxgrid) ix -= nxgrid;
       if (iy >= nygrid) iy -= nygrid;
       if (iz >= nzgrid) iz -= nzgrid;
+
       net_energy_transfer[iz][iy][ix] +=
         (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
          flangevin[i][2]*v[i][2]);
-      //printf("FLANG i %d xyz %g %g %g\n",i,
-      //       flangevin[i][0],
-      //       flangevin[i][1],
-      //       flangevin[i][2]);
     }
 
   outflag = 0;
@@ -443,15 +444,12 @@ void FixTTM::end_of_step()
             inner_dt/(electronic_specific_heat*electronic_density) *
             (electronic_thermal_conductivity *
 
-             ((T_electron_old[iz][iy][xright] +
-               T_electron_old[iz][iy][xleft] -
-               2*T_electron_old[iz][iy][ix])/dx/dx +
-              (T_electron_old[iz][yright][ix] +
-               T_electron_old[iz][yleft][ix] -
-               2*T_electron_old[iz][iy][ix])/dy/dy +
-              (T_electron_old[zright][iy][ix] +
-               T_electron_old[zleft][iy][ix] -
-               2*T_electron_old[iz][iy][ix])/dz/dz) -
+             ((T_electron_old[iz][iy][xright] + T_electron_old[iz][iy][xleft] -
+               2.0*T_electron_old[iz][iy][ix])/dx/dx +
+              (T_electron_old[iz][yright][ix] + T_electron_old[iz][yleft][ix] -
+               2.0*T_electron_old[iz][iy][ix])/dy/dy +
+              (T_electron_old[zright][iy][ix] + T_electron_old[zleft][iy][ix] -
+               2.0*T_electron_old[iz][iy][ix])/dz/dz) -
              
              (net_energy_transfer_all[iz][iy][ix])/del_vol);
         }
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 4ded3448d6..4e7b06c668 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -79,8 +79,13 @@ void FixTTMGrid::post_constructor()
          ngridout*sizeof(double));
 
   // set initial electron temperatures from user input file
+  // communicate new T_electron values to ghost grid points
 
-  if (infile) read_electron_temperatures(infile);
+  if (infile) {
+    read_electron_temperatures(infile);
+    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
+                     gc_buf1,gc_buf2,MPI_DOUBLE);
+  }
 }
 
 /* ---------------------------------------------------------------------- */
@@ -118,7 +123,6 @@ void FixTTMGrid::post_force(int /*vflag*/)
 
   for (int i = 0; i < nlocal; i++) {
     if (mask[i] & groupbit) {
-
       ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET;
       iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET;
       iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET;
@@ -183,6 +187,7 @@ void FixTTMGrid::end_of_step()
       ix = static_cast ((x[i][0]-boxlo[0])*dxinv + shift) - OFFSET;
       iy = static_cast ((x[i][1]-boxlo[1])*dyinv + shift) - OFFSET;
       iz = static_cast ((x[i][2]-boxlo[2])*dzinv + shift) - OFFSET;
+
       net_energy_transfer[iz][iy][ix] +=
         (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
          flangevin[i][2]*v[i][2]);
@@ -228,21 +233,21 @@ void FixTTMGrid::end_of_step()
             (electronic_thermal_conductivity *
 
              ((T_electron_old[iz][iy][ix-1] + T_electron_old[iz][iy][ix+1] -
-               2*T_electron_old[iz][iy][ix])*dxinv*dxinv +
+               2.0*T_electron_old[iz][iy][ix])*dxinv*dxinv +
               (T_electron_old[iz][iy-1][ix] + T_electron_old[iz][iy+1][ix] -
-               2*T_electron_old[iz][iy][ix])*dyinv*dyinv +
+               2.0*T_electron_old[iz][iy][ix])*dyinv*dyinv +
               (T_electron_old[iz-1][iy][ix] + T_electron_old[iz+1][iy][ix] -
-               2*T_electron_old[iz][iy][ix])*dzinv*dzinv) -
+               2.0*T_electron_old[iz][iy][ix])*dzinv*dzinv) -
              
              net_energy_transfer[iz][iy][ix]/volgrid);
         }
+
+    // communicate new T_electron values to ghost grid points
+
+    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
+                     gc_buf1,gc_buf2,MPI_DOUBLE);
   }
 
-  // communicate new T_electron values to ghost grid points
-
-  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
-                   gc_buf1,gc_buf2,MPI_DOUBLE);
-
   // output of grid temperatures to file
 
   if (outfile && (update->ntimestep % outevery == 0)) {
@@ -364,11 +369,6 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
     error->all(FLERR,"Fix ttm/grid infile did not set all temperatures");
 
   memory->destroy3d_offset(T_initial_set,nzlo_in,nylo_in,nxlo_in);
-
-  // communicate new T_electron values to ghost grid points
-
-  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
-                   gc_buf1,gc_buf2,MPI_DOUBLE);
 }
 
 /* ----------------------------------------------------------------------
@@ -593,6 +593,9 @@ void FixTTMGrid::restart(char *buf)
       for (ix = nxlo_in; ix <= nxhi_in; ix++) {
         iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
         T_electron[iz][iy][ix] = rlist[n+iglobal];
+        if (ix == 0 && iy == 0 & iz == 0)
+          printf("READRESTART 000 n+iglobal %d %d value %g\n",n,iglobal,
+                 T_electron[ix][iy][iz]);
       }
 }
 

From 4846d8283e529542e2be1214a3e074d2e93eebef Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 18:38:08 -0400
Subject: [PATCH 118/437] convert chain.f to fortran 90+ style free format file
 chain.f90

this is to maintain compatibility with some newer fortran compilers
that do not support legacy style fortran by default anymore.
---
 cmake/Modules/Tools.cmake |   2 +-
 doc/src/Tools.rst         |   2 +-
 tools/chain.f             | 321 ------------------------------------
 tools/chain.f90           | 333 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 335 insertions(+), 323 deletions(-)
 delete mode 100644 tools/chain.f
 create mode 100644 tools/chain.f90

diff --git a/cmake/Modules/Tools.cmake b/cmake/Modules/Tools.cmake
index 29b21dc390..40d3048dcc 100644
--- a/cmake/Modules/Tools.cmake
+++ b/cmake/Modules/Tools.cmake
@@ -9,7 +9,7 @@ if(BUILD_TOOLS)
     check_language(Fortran)
     if(CMAKE_Fortran_COMPILER)
       enable_language(Fortran)
-      add_executable(chain.x ${LAMMPS_TOOLS_DIR}/chain.f)
+      add_executable(chain.x ${LAMMPS_TOOLS_DIR}/chain.f90)
       target_link_libraries(chain.x PRIVATE ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
       install(TARGETS chain.x DESTINATION ${CMAKE_INSTALL_BINDIR})
     else()
diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst
index 72cfc7db9e..5822286e5f 100644
--- a/doc/src/Tools.rst
+++ b/doc/src/Tools.rst
@@ -172,7 +172,7 @@ Chris Lorenz (chris.lorenz at kcl.ac.uk), King's College London.
 chain tool
 ----------------------
 
-The file chain.f creates a LAMMPS data file containing bead-spring
+The file chain.f90 creates a LAMMPS data file containing bead-spring
 polymer chains and/or monomer solvent atoms.  It uses a text file
 containing chain definition parameters as an input.  The created
 chains and solvent atoms can strongly overlap, so LAMMPS needs to run
diff --git a/tools/chain.f b/tools/chain.f
deleted file mode 100644
index 52481f5d0d..0000000000
--- a/tools/chain.f
+++ /dev/null
@@ -1,321 +0,0 @@
-c Create LAMMPS data file for collection of
-c   polymer bead-spring chains of various lengths and bead sizes
-c Syntax: chain < def.chain > data.file
-c   def.chain is input file that specifies the chains
-c   data.file is output file that will be input for LAMMPS
-c includes image flags in data file so chains can be unraveled later
-
-      program chain
-
-      integer swaptype
-      integer, allocatable :: nchain(:),nmonomer(:)
-      integer, allocatable :: ntype(:),nbondtype(:)
-      integer, allocatable :: type(:),molecule(:)
-      integer, allocatable :: imagex(:),imagey(:),imagez(:)
-      real*8, allocatable :: x(:),y(:),z(:)
-      real*8, allocatable :: bondlength(:),restrict(:)
-      common xprd,yprd,zprd,xboundlo,xboundhi,
-     $     yboundlo,yboundhi,zboundlo,zboundhi
-      real*8 random
- 900  format(a)
- 901  format(2f15.6,a)
- 902  format(i3,f5.1)
- 903  format(i10,i8,i8,3f10.4,3i4)
- 904  format(i9,i3,2i9)
-
-c read chain definitions
-
-      read (5,*)
-      read (5,*)
-      read (5,*) rhostar
-      read (5,*) iseed
-      read (5,*) nsets
-      read (5,*) swaptype
-
-      allocate(nchain(nsets))
-      allocate(nmonomer(nsets))
-      allocate(ntype(nsets))
-      allocate(nbondtype(nsets))
-      allocate(bondlength(nsets))
-      allocate(restrict(nsets))
-
-      do iset = 1,nsets
-        read (5,*)
-        read (5,*) nchain(iset)
-        read (5,*) nmonomer(iset)
-        read (5,*) ntype(iset)
-        read (5,*) nbondtype(iset)
-        read (5,*) bondlength(iset)
-        read (5,*) restrict(iset)
-      enddo
-
-c natoms = total # of monomers
-
-      natoms = 0
-      do iset = 1,nsets
-        natoms = natoms + nchain(iset)*nmonomer(iset)
-      enddo
-
-      allocate(x(natoms))
-      allocate(y(natoms))
-      allocate(z(natoms))
-      allocate(type(natoms))
-      allocate(molecule(natoms))
-      allocate(imagex(natoms))
-      allocate(imagey(natoms))
-      allocate(imagez(natoms))
-
-c setup box size (sigma = 1.0)
-
-      volume = natoms/rhostar
-      xprd = volume**(1.0/3.0)
-      yprd = xprd
-      zprd = xprd
-
-      xboundlo = -xprd/2.0
-      xboundhi = -xboundlo
-      yboundlo = xboundlo
-      yboundhi = xboundhi
-      zboundlo = xboundlo
-      zboundhi = xboundhi
-
-c generate random chains
-c loop over sets and chains in each set
-      
-      n = 0
-      nmolecule = 0
-
-      do iset = 1,nsets
-        do ichain = 1,nchain(iset)
-          nmolecule = nmolecule + 1
-
-c random starting point for the chain in the box
-
-          x1 = 0.0
-          y1 = 0.0
-          z1 = 0.0
-          x2 = xboundlo + random(iseed)*xprd
-          y2 = yboundlo + random(iseed)*yprd
-          z2 = zboundlo + random(iseed)*zprd
-
-c store 1st monomer of chain
-c 1st monomer is always in original box (image = 0)
-
-          call pbc(x2,y2,z2)
-          n = n + 1
-          x(n) = x2
-          y(n) = y2
-          z(n) = z2
-          type(n) = ntype(iset)
-          imagex(n) = 0
-          imagey(n) = 0
-          imagez(n) = 0
-          if (swaptype == 0) then
-            molecule(n) = nmolecule
-          else
-            molecule(n) = 1
-          endif
-
-c generate rest of monomers in this chain
-
-          do imonomer = 2,nmonomer(iset)
-
-            x0 = x1
-            y0 = y1
-            z0 = z1
-            x1 = x2
-            y1 = y2
-            z1 = z2
-
-c random point inside sphere of unit radius
-
- 10         xinner = 2.0*random(iseed) - 1.0
-            yinner = 2.0*random(iseed) - 1.0
-            zinner = 2.0*random(iseed) - 1.0
-            rsq = xinner*xinner + yinner*yinner + zinner*zinner
-            if (rsq > 1.0) goto 10
-
-c project point to surface of sphere of unit radius
-
-            r = sqrt(rsq)
-            xsurf = xinner/r
-            ysurf = yinner/r
-            zsurf = zinner/r
-
-c create new point by scaling unit offsets by bondlength (sigma = 1.0)
-
-            x2 = x1 + xsurf*bondlength(iset)
-            y2 = y1 + ysurf*bondlength(iset)
-            z2 = z1 + zsurf*bondlength(iset)
-
-c check that new point meets restriction requirement
-c only for 3rd monomer and beyond
-
-            dx = x2 - x0
-            dy = y2 - y0
-            dz = z2 - z0
-            r = sqrt(dx*dx + dy*dy + dz*dz)
-
-            if (imonomer > 2 .and. r <= restrict(iset)) goto 10
-
-c store new point
-c if delta to previous bead is large, then increment/decrement image flag
-
-            call pbc(x2,y2,z2)
-            n = n + 1
-            x(n) = x2
-            y(n) = y2
-            z(n) = z2
-            type(n) = ntype(iset)
-
-            if (abs(x(n)-x(n-1)) < 2.0*bondlength(iset)) then
-              imagex(n) = imagex(n-1)
-            else if (x(n) - x(n-1) < 0.0) then
-              imagex(n) = imagex(n-1) + 1
-            else if (x(n) - x(n-1) > 0.0) then
-              imagex(n) = imagex(n-1) - 1
-            endif
-
-            if (abs(y(n)-y(n-1)) < 2.0*bondlength(iset)) then
-              imagey(n) = imagey(n-1)
-            else if (y(n) - y(n-1) < 0.0) then
-              imagey(n) = imagey(n-1) + 1
-            else if (y(n) - y(n-1) > 0.0) then
-              imagey(n) = imagey(n-1) - 1
-            endif
-
-            if (abs(z(n)-z(n-1)) < 2.0*bondlength(iset)) then
-              imagez(n) = imagez(n-1)
-            else if (z(n) - z(n-1) < 0.0) then
-              imagez(n) = imagez(n-1) + 1
-            else if (z(n) - z(n-1) > 0.0) then
-              imagez(n) = imagez(n-1) - 1
-            endif
-
-            if (swaptype == 0) then
-              molecule(n) = nmolecule
-            else if (swaptype == 1) then
-              molecule(n) = imonomer
-            else if (swaptype == 2) then
-              if (imonomer <= nmonomer(iset)/2) then
-                molecule(n) = imonomer
-              else
-                molecule(n) = nmonomer(iset)+1-imonomer
-              endif
-            endif
-
-          enddo
-
-        enddo
-      enddo
-
-c compute quantities needed for LAMMPS file
-
-      nbonds = 0
-      ntypes = 0
-      nbondtypes = 0
-      do iset = 1,nsets
-        nbonds = nbonds + nchain(iset)*(nmonomer(iset)-1)
-        if (ntype(iset) > ntypes) ntypes = ntype(iset)
-        if (nbondtype(iset) > nbondtypes)
-     $       nbondtypes = nbondtype(iset)
-      enddo
-
-c write out LAMMPS file
-
-      write (6,900) 'LAMMPS FENE chain data file'
-      write (6,*)
-
-      write (6,*) natoms,' atoms'
-      write (6,*) nbonds,' bonds'
-      write (6,*) 0,' angles'
-      write (6,*) 0,' dihedrals'
-      write (6,*) 0,' impropers'
-      write (6,*)
-
-      write (6,*) ntypes,' atom types'
-      write (6,*) nbondtypes,' bond types'
-      write (6,*) 0,' angle types'
-      write (6,*) 0,' dihedral types'
-      write (6,*) 0,' improper types'
-      write (6,*)
-
-      write (6,901) xboundlo,xboundhi,' xlo xhi'
-      write (6,901) yboundlo,yboundhi,' ylo yhi'
-      write (6,901) zboundlo,zboundhi,' zlo zhi'
-
-      write (6,*)
-      write (6,900) 'Masses'
-      write (6,*)
-
-      do i = 1,ntypes
-        write (6,902) i,1.0
-      enddo
-
-      write (6,*)
-      write (6,900) 'Atoms'
-      write (6,*)
-
-      do i = 1,natoms
-        write (6,903) i,molecule(i),type(i),x(i),y(i),z(i),
-     $       imagex(i),imagey(i),imagez(i)
-      enddo
-
-      if (nbonds > 0) then
-
-        write (6,*)
-        write (6,900) 'Bonds'
-        write (6,*)
-
-        n = 0
-        m = 0
-        do iset = 1,nsets
-          do ichain = 1,nchain(iset)
-            do imonomer = 1,nmonomer(iset)
-              n = n + 1
-              if (imonomer /= nmonomer(iset)) then
-                m = m + 1
-                write (6,904) m,nbondtype(iset),n,n+1
-              endif
-            enddo
-          enddo
-        enddo
-
-      endif
-
-      end
-
-c ************
-c Subroutines
-c ************
-
-c periodic boundary conditions - map atom back into periodic box
-
-      subroutine pbc(x,y,z)
-      common xprd,yprd,zprd,xboundlo,xboundhi,
-     $     yboundlo,yboundhi,zboundlo,zboundhi
-
-      if (x < xboundlo) x = x + xprd
-      if (x >= xboundhi) x = x - xprd
-      if (y < yboundlo) y = y + yprd
-      if (y >= yboundhi) y = y - yprd
-      if (z < zboundlo) z = z + zprd
-      if (z >= zboundhi) z = z - zprd
-
-      return
-      end
-
-
-c RNG from Numerical Recipes
-      
-      real*8 function random(iseed)
-      real*8 aa,mm,sseed
-      parameter (aa=16807.0D0,mm=2147483647.0D0)
-      
-      sseed = iseed
-      sseed = mod(aa*sseed,mm)
-      random = sseed/mm
-      iseed = sseed
-
-      return
-      end
diff --git a/tools/chain.f90 b/tools/chain.f90
new file mode 100644
index 0000000000..1efb421cae
--- /dev/null
+++ b/tools/chain.f90
@@ -0,0 +1,333 @@
+! Create LAMMPS data file for collection of
+!   polymer bead-spring chains of various lengths and bead sizes
+! Syntax: chain < def.chain > data.file
+!   def.chain is input file that specifies the chains
+!   data.file is output file that will be input for LAMMPS
+! includes image flags in data file so chains can be unraveled later
+
+MODULE box
+  IMPLICIT NONE
+  PUBLIC
+  REAL(KIND=8) :: xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,zboundlo,zboundhi
+
+CONTAINS
+
+  ! periodic boundary conditions - map atom back into periodic box
+
+  SUBROUTINE pbc(x,y,z)
+    REAL(KIND=8), INTENT(inout) :: x,y,z
+
+    IF (x < xboundlo) x = x + xprd
+    IF (x >= xboundhi) x = x - xprd
+    IF (y < yboundlo) y = y + yprd
+    IF (y >= yboundhi) y = y - yprd
+    IF (z < zboundlo) z = z + zprd
+    IF (z >= zboundhi) z = z - zprd
+
+  END SUBROUTINE pbc
+END MODULE box
+
+MODULE rng
+  IMPLICIT NONE
+
+CONTAINS
+
+  ! *very* minimal random number generator
+
+  REAL(KIND=8) FUNCTION random(iseed)
+    IMPLICIT NONE
+    INTEGER, INTENT(inout) :: iseed
+    REAL(KIND=8), PARAMETER :: aa=16807.0_8, mm=2147483647.0_8
+    REAL(KIND=8) :: sseed
+
+    sseed = REAL(iseed)
+    sseed = MOD(aa*sseed,mm)
+    random = sseed/mm
+    iseed = INT(sseed)
+  END FUNCTION random
+END MODULE rng
+
+PROGRAM chain
+  USE box
+  USE rng
+  IMPLICIT NONE
+
+  INTEGER, ALLOCATABLE :: nchain(:),nmonomer(:)
+  INTEGER, ALLOCATABLE :: ntype(:),nbondtype(:)
+  INTEGER, ALLOCATABLE :: atomtype(:),molecule(:)
+  INTEGER, ALLOCATABLE :: imagex(:),imagey(:),imagez(:)
+  REAL(kind=8), ALLOCATABLE :: x(:),y(:),z(:)
+  REAL(kind=8), ALLOCATABLE :: bondlength(:),restrict(:)
+  INTEGER :: i, n, m, nmolecule, natoms, ntypes, nbonds, nbondtypes
+  INTEGER :: swaptype, iseed, nsets, iset, ichain, imonomer
+  REAL(kind=8) :: r, rhostar, volume, rsq, xinner, yinner, zinner, xsurf, ysurf, zsurf
+  REAL(kind=8) :: x0, y0, z0, x1, y1, z1, x2, y2, z2, dx, dy, dz
+
+  LOGICAL :: again
+
+  ! read chain definitions
+
+  READ (5,*)
+  READ (5,*)
+  READ (5,*) rhostar
+  READ (5,*) iseed
+  READ (5,*) nsets
+  READ (5,*) swaptype
+
+  ALLOCATE(nchain(nsets))
+  ALLOCATE(nmonomer(nsets))
+  ALLOCATE(ntype(nsets))
+  ALLOCATE(nbondtype(nsets))
+  ALLOCATE(bondlength(nsets))
+  ALLOCATE(restrict(nsets))
+
+  DO iset = 1,nsets
+      READ (5,*)
+      READ (5,*) nchain(iset)
+      READ (5,*) nmonomer(iset)
+      READ (5,*) ntype(iset)
+      READ (5,*) nbondtype(iset)
+      READ (5,*) bondlength(iset)
+      READ (5,*) restrict(iset)
+  ENDDO
+
+  ! natoms = total # of monomers
+
+  natoms = 0
+  DO iset = 1,nsets
+      natoms = natoms + nchain(iset)*nmonomer(iset)
+  ENDDO
+
+  ALLOCATE(x(natoms))
+  ALLOCATE(y(natoms))
+  ALLOCATE(z(natoms))
+  ALLOCATE(atomtype(natoms))
+  ALLOCATE(molecule(natoms))
+  ALLOCATE(imagex(natoms))
+  ALLOCATE(imagey(natoms))
+  ALLOCATE(imagez(natoms))
+
+  ! setup box size (sigma = 1.0)
+
+  volume = natoms/rhostar
+  xprd = volume**(1.0/3.0)
+  yprd = xprd
+  zprd = xprd
+
+  xboundlo = -xprd/2.0
+  xboundhi = -xboundlo
+  yboundlo = xboundlo
+  yboundhi = xboundhi
+  zboundlo = xboundlo
+  zboundhi = xboundhi
+
+  ! generate random chains
+  ! loop over sets and chains in each set
+
+  n = 0
+  nmolecule = 0
+
+  DO iset = 1,nsets
+      DO ichain = 1,nchain(iset)
+          nmolecule = nmolecule + 1
+
+          ! random starting point for the chain in the box
+
+          x1 = 0.0
+          y1 = 0.0
+          z1 = 0.0
+          x2 = xboundlo + random(iseed)*xprd
+          y2 = yboundlo + random(iseed)*yprd
+          z2 = zboundlo + random(iseed)*zprd
+
+          ! store 1st monomer of chain
+          ! 1st monomer is always in original box (image = 0)
+
+          CALL pbc(x2,y2,z2)
+
+          n = n + 1
+          x(n) = x2
+          y(n) = y2
+          z(n) = z2
+          atomtype(n) = ntype(iset)
+          imagex(n) = 0
+          imagey(n) = 0
+          imagez(n) = 0
+          IF (swaptype == 0) THEN
+              molecule(n) = nmolecule
+          ELSE
+              molecule(n) = 1
+          END IF
+
+          ! generate rest of monomers in this chain
+
+          DO imonomer = 2, nmonomer(iset)
+
+              x0 = x1
+              y0 = y1
+              z0 = z1
+              x1 = x2
+              y1 = y2
+              z1 = z2
+
+              again = .TRUE.
+              DO WHILE (again)
+                  ! random point inside sphere of unit radius
+
+                  xinner = 2.0*random(iseed) - 1.0
+                  yinner = 2.0*random(iseed) - 1.0
+                  zinner = 2.0*random(iseed) - 1.0
+                  rsq = xinner*xinner + yinner*yinner + zinner*zinner
+                  IF (rsq > 1.0) CYCLE
+
+                  ! project point to surface of sphere of unit radius
+
+                  r = SQRT(rsq)
+                  xsurf = xinner/r
+                  ysurf = yinner/r
+                  zsurf = zinner/r
+
+                  ! create new point by scaling unit offsets by bondlength (sigma = 1.0)
+
+                  x2 = x1 + xsurf*bondlength(iset)
+                  y2 = y1 + ysurf*bondlength(iset)
+                  z2 = z1 + zsurf*bondlength(iset)
+
+                  ! check that new point meets restriction requirement
+                  ! only for 3rd monomer and beyond
+
+                  dx = x2 - x0
+                  dy = y2 - y0
+                  dz = z2 - z0
+                  r = SQRT(dx*dx + dy*dy + dz*dz)
+
+                  IF (imonomer > 2 .AND. r <= restrict(iset)) CYCLE
+
+                  ! store new point
+                  again = .FALSE.
+
+                  ! if delta to previous bead is large, then increment/decrement image flag
+
+                  CALL pbc(x2,y2,z2)
+                  n = n + 1
+                  x(n) = x2
+                  y(n) = y2
+                  z(n) = z2
+                  atomtype(n) = ntype(iset)
+
+                  IF (ABS(x(n)-x(n-1)) < 2.0*bondlength(iset)) THEN
+                      imagex(n) = imagex(n-1)
+                  ELSE IF (x(n) - x(n-1) < 0.0) THEN
+                      imagex(n) = imagex(n-1) + 1
+                  ELSE IF (x(n) - x(n-1) > 0.0) THEN
+                      imagex(n) = imagex(n-1) - 1
+                  ENDIF
+
+                  IF (ABS(y(n)-y(n-1)) < 2.0*bondlength(iset)) THEN
+                      imagey(n) = imagey(n-1)
+                  ELSE IF (y(n) - y(n-1) < 0.0) THEN
+                      imagey(n) = imagey(n-1) + 1
+                  ELSE IF (y(n) - y(n-1) > 0.0) THEN
+                      imagey(n) = imagey(n-1) - 1
+                  ENDIF
+
+                  IF (ABS(z(n)-z(n-1)) < 2.0*bondlength(iset)) THEN
+                      imagez(n) = imagez(n-1)
+                  ELSE IF (z(n) - z(n-1) < 0.0) THEN
+                      imagez(n) = imagez(n-1) + 1
+                  ELSE IF (z(n) - z(n-1) > 0.0) THEN
+                      imagez(n) = imagez(n-1) - 1
+                  ENDIF
+
+                  IF (swaptype == 0) THEN
+                      molecule(n) = nmolecule
+                  ELSE IF (swaptype == 1) THEN
+                      molecule(n) = imonomer
+                  ELSE IF (swaptype == 2) THEN
+                      IF (imonomer <= nmonomer(iset)/2) THEN
+                          molecule(n) = imonomer
+                      ELSE
+                          molecule(n) = nmonomer(iset)+1-imonomer
+                      ENDIF
+                  ENDIF
+              ENDDO
+          ENDDO
+
+      ENDDO
+  ENDDO
+
+  ! compute quantities needed for LAMMPS file
+
+  nbonds = 0
+  ntypes = 0
+  nbondtypes = 0
+  DO iset = 1,nsets
+      nbonds = nbonds + nchain(iset)*(nmonomer(iset)-1)
+      IF (ntype(iset) > ntypes) ntypes = ntype(iset)
+      IF (nbondtype(iset) > nbondtypes) nbondtypes = nbondtype(iset)
+  ENDDO
+
+  ! write out LAMMPS file
+
+  WRITE (6,*) 'LAMMPS FENE chain data file'
+  WRITE (6,*)
+
+  WRITE (6,*) natoms,' atoms'
+  WRITE (6,*) nbonds,' bonds'
+  WRITE (6,*) 0,' angles'
+  WRITE (6,*) 0,' dihedrals'
+  WRITE (6,*) 0,' impropers'
+  WRITE (6,*)
+
+  WRITE (6,*) ntypes,' atom types'
+  WRITE (6,*) nbondtypes,' bond types'
+  WRITE (6,*) 0,' angle types'
+  WRITE (6,*) 0,' dihedral types'
+  WRITE (6,*) 0,' improper types'
+  WRITE (6,*)
+
+  WRITE (6,'(2F15.6,A)') xboundlo,xboundhi,' xlo xhi'
+  WRITE (6,'(2F15.6,A)') yboundlo,yboundhi,' ylo yhi'
+  WRITE (6,'(2F15.6,A)') zboundlo,zboundhi,' zlo zhi'
+
+  WRITE (6,*)
+  WRITE (6,*) 'Masses'
+  WRITE (6,*)
+
+  DO i = 1,ntypes
+      WRITE (6,'(i3,f5.1)') i,1.0
+  ENDDO
+
+  WRITE (6,*)
+  WRITE (6,*) 'Atoms'
+  WRITE (6,*)
+
+  DO i = 1,natoms
+      WRITE (6,'(I10,I8,I8,3F10.4,3I4)') i,molecule(i),atomtype(i),x(i),y(i),z(i), &
+          imagex(i),imagey(i),imagez(i)
+  ENDDO
+
+  IF (nbonds > 0) THEN
+      WRITE (6,*)
+      WRITE (6,*) 'Bonds'
+      WRITE (6,*)
+
+      n = 0
+      m = 0
+      DO iset = 1,nsets
+          DO ichain = 1,nchain(iset)
+              DO imonomer = 1,nmonomer(iset)
+                  n = n + 1
+                  IF (imonomer /= nmonomer(iset)) THEN
+                      m = m + 1
+                      WRITE (6,'(i9,i3,2i9)') m,nbondtype(iset),n,n+1
+                  ENDIF
+              ENDDO
+          ENDDO
+      ENDDO
+  ENDIF
+
+  DEALLOCATE(nchain, nmonomer, ntype, nbondtype, bondlength, restrict)
+  DEALLOCATE(x, y, z, atomtype, molecule, imagex, imagey, imagez)
+
+END PROGRAM chain

From a2d77593bb4a6c236dffff55ed0348570bb0af03 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 22:01:42 -0400
Subject: [PATCH 119/437] fix typo

---
 src/MOFFF/README | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MOFFF/README b/src/MOFFF/README
index fa3cb0ef87..6d7f111cb5 100644
--- a/src/MOFFF/README
+++ b/src/MOFFF/README
@@ -20,7 +20,7 @@ charges (dsf and long-range treatment of charges)
 out-of-plane angle
 
 See the file doc/drude_tutorial.html for getting started.
-See the doc pages for "pair_style buck6d/coul/gauss", "anlge_style class2",
+See the doc pages for "pair_style buck6d/coul/gauss", "angle_style class2",
 "angle_style cosine/buck6d", and "improper_style inversion/harmonic"
 commands to get started. Also see the above mentioned website and
 literature for further documentation about the force field.

From c3083785b7ffb4c8410b579e891fbd681821aef7 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 22:02:02 -0400
Subject: [PATCH 120/437] list some more features

---
 doc/src/Intro_features.rst | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst
index f1b7dc93f0..337acbe6ce 100644
--- a/doc/src/Intro_features.rst
+++ b/doc/src/Intro_features.rst
@@ -58,9 +58,10 @@ Particle and model types
 * coarse-grained mesoscale models
 * finite-size spherical and ellipsoidal particles
 * finite-size line segment (2d) and triangle (3d) particles
+* finite-size rounded polygons (2d) and polyhedra (3d) particles
 * point dipole particles
 * particles with magnetic spin
-* rigid collections of particles
+* rigid collections of n particles
 * hybrid combinations of these
 
 .. _ff:
@@ -81,15 +82,17 @@ commands)
 * polarization models: :doc:`QEq `,     :doc:`core/shell model `,     :doc:`Drude dipole model `
 * charge equilibration (QEq via dynamic, point, shielded, Slater methods)
 * coarse-grained potentials: DPD, GayBerne, REsquared, colloidal, DLVO
-* mesoscopic potentials: granular, Peridynamics, SPH
+* mesoscopic potentials: granular, Peridynamics, SPH, mesoscopic tubular potential (MESONT)
+* semi-empirical potentials: multi-ion generalized pseudopotential theory (MGPT), second moment tight binding + QEq (SMTB-Q), density functional tight-binding (LATTE) 
 * electron force field (eFF, AWPMD)
 * bond potentials: harmonic, FENE, Morse, nonlinear, class 2, quartic (breakable), tabulated
 * angle potentials: harmonic, CHARMM, cosine, cosine/squared, cosine/periodic, class 2 (COMPASS), tabulated
 * dihedral potentials: harmonic, CHARMM, multi-harmonic, helix, class 2 (COMPASS), OPLS, tabulated
 * improper potentials: harmonic, cvff, umbrella, class 2 (COMPASS), tabulated
 * polymer potentials: all-atom, united-atom, bead-spring, breakable
-* water potentials: TIP3P, TIP4P, SPC
+* water potentials: TIP3P, TIP4P, SPC, SPC/E and variants
 * interlayer potentials for graphene and analogues
+* metal-organic framework potentials (QuickFF, MO-FF)
 * implicit solvent potentials: hydrodynamic lubrication, Debye
 * force-field compatibility with common CHARMM, AMBER, DREIDING, OPLS, GROMACS, COMPASS options
 * access to the `OpenKIM Repository `_ of potentials via     :doc:`kim command `
@@ -127,9 +130,10 @@ Ensembles, constraints, and boundary conditions
 * harmonic (umbrella) constraint forces
 * rigid body constraints
 * SHAKE bond and angle constraints
-* Monte Carlo bond breaking, formation, swapping
+* motion constraints to manifold surfaces
+* Monte Carlo bond breaking, formation, swapping, template based reaction modeling
 * atom/molecule insertion and deletion
-* walls of various kinds
+* walls of various kinds, static and moving
 * non-equilibrium molecular dynamics (NEMD)
 * variety of additional boundary conditions and constraints
 
@@ -153,6 +157,7 @@ Diagnostics
 ^^^^^^^^^^^
 
 * see various flavors of the :doc:`fix ` and :doc:`compute ` commands
+* introspection command for system, simulation, and compile time settings and configurations
 
 .. _output:
 
@@ -167,8 +172,9 @@ Output
 * parallel I/O of dump and restart files
 * per-atom quantities (energy, stress, centro-symmetry parameter, CNA, etc)
 * user-defined system-wide (log file) or per-atom (dump file) calculations
-* spatial and time averaging of per-atom quantities
-* time averaging of system-wide quantities
+* custom partitioning (chunks) for binning, and static or dynamic grouping of atoms for analysis
+* spatial, time, and per-chunk averaging of per-atom quantities
+* time averaging and histogramming of system-wide quantities
 * atom snapshots in native, XYZ, XTC, DCD, CFG formats
 
 .. _replica1:
@@ -181,7 +187,7 @@ Multi-replica models
 * :doc:`parallel replica dynamics `
 * :doc:`temperature accelerated dynamics `
 * :doc:`parallel tempering `
-* :doc:`path-integral MD `
+* path-integral MD: `first variant `, `second variant `
 * multi-walker collective variables with :doc:`Colvars ` and :doc:`Plumed `
 
 .. _prepost:
@@ -213,11 +219,12 @@ page for details.
 These are LAMMPS capabilities which you may not think of as typical
 classical MD options:
 
-* :doc:`static ` and :doc:`dynamic load-balancing `
+* :doc:`static ` and :doc:`dynamic load-balancing `, optional with recursive bisectioning decomposition
 * :doc:`generalized aspherical particles `
 * :doc:`stochastic rotation dynamics (SRD) `
-* :doc:`real-time visualization and interactive MD `
+* :doc:`real-time visualization and interactive MD `, :doc:`built-in renderer for images and movies `
 * calculate :doc:`virtual diffraction patterns `
+* calculate :doc:`finite temperature phonon dispersion ` and the :doc:`dynamical matrix of minimized structures `
 * :doc:`atom-to-continuum coupling ` with finite elements
 * coupled rigid body integration via the :doc:`POEMS ` library
 * :doc:`QM/MM coupling `

From 5361af70822064b79ae0d135f9535e7930abc1a4 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 22:47:20 -0400
Subject: [PATCH 121/437] notes on reducing disk space requirements when
 building LAMMPS from source

---
 doc/src/Build.rst           |  1 +
 doc/src/Build_diskspace.rst | 45 +++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 doc/src/Build_diskspace.rst

diff --git a/doc/src/Build.rst b/doc/src/Build.rst
index 6dee21206b..7e4f749743 100644
--- a/doc/src/Build.rst
+++ b/doc/src/Build.rst
@@ -22,4 +22,5 @@ page.
    Build_extras
    Build_manual
    Build_windows
+   Build_diskspace
    Build_development
diff --git a/doc/src/Build_diskspace.rst b/doc/src/Build_diskspace.rst
new file mode 100644
index 0000000000..e7ff42902e
--- /dev/null
+++ b/doc/src/Build_diskspace.rst
@@ -0,0 +1,45 @@
+Notes for saving disk space when building LAMMPS from source
+------------------------------------------------------------
+
+LAMMPS is a large software project with a large number of source files,
+extensive documentation, and a large collection of example files.
+When downloading LAMMPS by cloning the
+`git repository from GitHub `_ this
+will by default also download the entire commit history since September 2006.
+Compiling LAMMPS will add the storage requirements of the compiled object
+files and libraries to the tally.
+
+In a user account on an HPC cluster with filesystem quotas or in other
+environments with restricted disk space capacity it may be needed to
+reduce the storage requirements. Here are some suggestions:
+
+- Create a so-called shallow repository by cloning only the last commit
+  instead of the full project history by using ``git clone git@github.com:lammps/lammps --depth=1 --branch=master``.
+  This reduces the downloaded size to about half.  With ``--depth=1`` it is not possible to check out different
+  versions/branches of LAMMPS, using ``--depth=1000`` will make multiple recent versions available at little
+  extra storage needs (the entire git history had nearly 30,000 commits in fall 2021).
+
+- Download a tar archive from either the `download section on the LAMMPS homepage `_
+  or from the `LAMMPS releases page on GitHub `_ these will not
+  contain the git history at all.
+
+- Build LAMMPS without the debug flag (remove ``-g`` from the machine makefile or use ``-DCMAKE_BUILD_TYPE=Release``)
+  or use the ``strip`` command on the LAMMPS executable when no more debugging would be needed.  The strip command
+  may also be applied to the LAMMPS shared library. The static library may be deleted entirely.
+
+- Delete compiled object files and libraries after copying the LAMMPS executable to a permanent location.
+  When using the traditional build process, one may use ``make clean-`` or ``make clean-all``
+  to delete object files in the src folder.  For CMake based builds, one may use ``make clean`` or just
+  delete the entire build folder.
+
+- The folders containing the documentation tree (doc), the examples (examples) are not needed to build and
+  run LAMMPS and can be safely deleted.  Some files in the potentials folder are large and may be deleted,
+  if not needed.  The largest of those files (occupying about 120 Mbyte combined) will only be downloaded on
+  demand, when the corresponding package is installed.
+
+- When using the CMake build procedure, the compilation can be done on a (local) scratch storage that will not
+  count toward the quota.  A local scratch file system may offer the additional benefit of speeding up creating
+  object files and linking with libraries compared to a networked file system.  Also with CMake (and unlike with
+  the traditional make) it is possible to compile LAMMPS executables with different settings and packages included
+  from the same source tree since all the configuration information is stored in the build folder.  So it is
+  not necessary to have multiple copies of LAMMPS.

From 8468d89ec8dca51c83252624fc738e09211c7447 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 23:31:53 -0400
Subject: [PATCH 122/437] tweak epsilon for passing test on macOS

---
 unittest/force-styles/tests/kspace-pppm_tilted.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/unittest/force-styles/tests/kspace-pppm_tilted.yaml b/unittest/force-styles/tests/kspace-pppm_tilted.yaml
index 9e649fb584..cf1a7a2c87 100644
--- a/unittest/force-styles/tests/kspace-pppm_tilted.yaml
+++ b/unittest/force-styles/tests/kspace-pppm_tilted.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Tue Aug 24 15:57:51 2021
-epsilon: 8.5e-14
+epsilon: 1e-13
 skip_tests: gpu
 prerequisites: ! |
   atom full

From fe4ec9d1ea2ffac53737b17379bebff89f71dcd7 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 23:36:12 -0400
Subject: [PATCH 123/437] select Fortran 2003 as standard for compiling bundled
 Fortran code

---
 cmake/presets/clang.cmake | 6 +++---
 cmake/presets/gcc.cmake   | 8 ++++----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/cmake/presets/clang.cmake b/cmake/presets/clang.cmake
index 073bcec3f2..a0d654ad35 100644
--- a/cmake/presets/clang.cmake
+++ b/cmake/presets/clang.cmake
@@ -10,9 +10,9 @@ set(CMAKE_Fortran_COMPILER ${CLANG_FORTRAN} CACHE STRING "" FORCE)
 set(CMAKE_CXX_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
 set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -Wextra -g -std=f95" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG -std=f95" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f95" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -Wextra -g -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
 set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
 set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
diff --git a/cmake/presets/gcc.cmake b/cmake/presets/gcc.cmake
index 7942b2a4ce..c2dbacf674 100644
--- a/cmake/presets/gcc.cmake
+++ b/cmake/presets/gcc.cmake
@@ -1,4 +1,4 @@
-# preset that will restore gcc/g++ with support for MPI and OpenMP (on Linux boxes)
+# preset that will explicitly request gcc/g++ compilers with support for MPI and OpenMP
 
 set(CMAKE_CXX_COMPILER "g++" CACHE STRING "" FORCE)
 set(CMAKE_C_COMPILER "gcc" CACHE STRING "" FORCE)
@@ -15,9 +15,9 @@ set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -DNDEBUG" CACHE STRING "" FORCE)
 set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
 set(MPI_Fortran "gfortran" CACHE STRING "" FORCE)
 set(MPI_Fortran_COMPILER "mpifort" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -g" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g -O2 -DNDEBUG" CACHE STRING "" FORCE)
-set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -g -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g -O2 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
 unset(HAVE_OMP_H_INCLUDE CACHE)
 
 set(OpenMP_C "gcc" CACHE STRING "" FORCE)

From 45e599cb33694768140d3bdcdb42ade288953f28 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 23:42:07 -0400
Subject: [PATCH 124/437] modernize Fortran

---
 lib/mesont/TubePotMono.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/mesont/TubePotMono.f90 b/lib/mesont/TubePotMono.f90
index 65e58ecf7a..8c19043a67 100644
--- a/lib/mesont/TubePotMono.f90
+++ b/lib/mesont/TubePotMono.f90
@@ -72,7 +72,7 @@ implicit none
 !---------------------------------------------------------------------------------------------------
         
         integer(c_int)                               :: TPMStartMode = 1
-        character*512                                :: TPMFile      = 'MESONT-TABTP.xrs'
+        character(len=512)                           :: TPMFile      = 'MESONT-TABTP.xrs'
         integer(c_int)                               :: TPMUnitID    ! Unit for the tabulated potential file
         
         integer(c_int)                               :: TPMNZ        = TPMNZMAX
@@ -1643,7 +1643,7 @@ contains !**********************************************************************
         subroutine TPMInit ( ChiIndM, ChiIndN ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         integer(c_int), intent(in)      :: ChiIndM, ChiIndN
         real(c_double)                  :: RT, DX
-        character*512                   :: PDate
+        character(len=512)              :: PDate
         !-------------------------------------------------------------------------------------------
                 TPPotType = TP_POT_MONO_R
         

From 61855c5058a0e88fb2a445fdf1ae549c8d57e894 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 23:46:48 -0400
Subject: [PATCH 125/437] apply whitespace checking/fixing also to free-format
 Fortran files

---
 lib/mesont/CNTPot.f90               | 182 +++++++--------
 lib/mesont/ExportCNT.f90            | 100 ++++----
 lib/mesont/LinFun2.f90              |  20 +-
 lib/mesont/Spline1.f90              |  30 +--
 lib/mesont/Spline2.f90              |  26 +--
 lib/mesont/TPMForceField.f90        | 140 +++++------
 lib/mesont/TPMGeom.f90              |  18 +-
 lib/mesont/TPMLib.f90               |  18 +-
 lib/mesont/TPMM0.f90                |  34 +--
 lib/mesont/TPMM1.f90                |  62 ++---
 lib/mesont/TubePotBase.f90          |  88 +++----
 lib/mesont/TubePotMono.f90          | 348 ++++++++++++++--------------
 lib/mesont/TubePotTrue.f90          |  60 ++---
 tools/coding_standard/whitespace.py |   1 +
 14 files changed, 564 insertions(+), 563 deletions(-)

diff --git a/lib/mesont/CNTPot.f90 b/lib/mesont/CNTPot.f90
index 4a130074fd..5c83ce63e5 100644
--- a/lib/mesont/CNTPot.f90
+++ b/lib/mesont/CNTPot.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module CNTPot !*************************************************************************************
 !
@@ -21,34 +21,34 @@ module CNTPot !*****************************************************************
 !
 ! Carbon nanotubes internal potentials:
 !       CNTSTRH0, harmonic stretching potential of type 0 with constant Young's modulus
-!       CNTSTRH1, harmonic stretching potential of type 1 with variable Young's modulus 
+!       CNTSTRH1, harmonic stretching potential of type 1 with variable Young's modulus
 !       CNTSTRNH0, non-harmonic stretching with fracture potential of type 0
 !       CNTSTRNH1, non-harmonic stretching with fracture potential of type 1
 !       CNTBNDH, harmonic bending potential
 !       CNTBNDHB, harmonic bending-buckling potential
-!       CNTBNDHBF, harmonic bending-buckling potential with fracture 
+!       CNTBNDHBF, harmonic bending-buckling potential with fracture
 !       CNTTRS, torsion potential
 !       CNTBRT, breathing potential
 !
 ! The functional form and force constants of harmonic stretching, bending and
-! torsion potentials are taken from: 
+! torsion potentials are taken from:
 ! L.V. Zhigilei, Ch. Wei, D. Srivastava, Phys. Rev. B 71, 165417 (2005)
 !
-! The model of stress-strain curve for the non-harmonic potential with fracture 
+! The model of stress-strain curve for the non-harmonic potential with fracture
 ! is developed and parameterized using the following constants
-! -- Young's modulus 
+! -- Young's modulus
 ! -- maximum linear strain (only for the NH potential of type 1)
 ! -- tensile strength (or fracture strain)
 ! -- strain at failure (or fracture strain)
 ! -- maximum strain.
 ! All these parameters are assumed to be independent of CNT radius or chriality type.
-! In this model, the true strain at failure CNTSTREft and true tensile strength 
+! In this model, the true strain at failure CNTSTREft and true tensile strength
 ! CNTSTRSft are slightly different from the imposed values CNTSTREf and CNTSTRSf.
 !
-! The non-harmonic stretching potentials of types 0 and 1 are different from 
+! The non-harmonic stretching potentials of types 0 and 1 are different from
 ! each other by the functional form of the stress-strain curve
 !
-! Different parameterizations of CNTSTRH0, CNTSTRNH0 and CNTSTRNH1 potentials can be chosen, 
+! Different parameterizations of CNTSTRH0, CNTSTRNH0 and CNTSTRNH1 potentials can be chosen,
 ! see subroutine CNTSTRSetParameterization
 !
 !---------------------------------------------------------------------------------------------------
@@ -75,47 +75,47 @@ implicit none
         integer(c_int), parameter            :: CNTPOT_BFRACTURE     = 5
 
         ! Harmonic stretching model (constant Young's modulus)
-        integer(c_int), parameter            :: CNTSTRMODEL_H0       = 0     
+        integer(c_int), parameter            :: CNTSTRMODEL_H0       = 0
         ! Harmonic stretching model (Young's modulus depends on radius)
-        integer(c_int), parameter            :: CNTSTRMODEL_H1       = 1     
+        integer(c_int), parameter            :: CNTSTRMODEL_H1       = 1
         ! Non-harmonic stretching with fracture, potential of type 0
-        integer(c_int), parameter            :: CNTSTRMODEL_NH0F     = 2     
+        integer(c_int), parameter            :: CNTSTRMODEL_NH0F     = 2
         ! Non-harmonic stretching without fracture, potential of type 1
-        integer(c_int), parameter            :: CNTSTRMODEL_NH1      = 3     
+        integer(c_int), parameter            :: CNTSTRMODEL_NH1      = 3
         ! Non-harmonic stretching with fracture, potential of type 1
-        integer(c_int), parameter            :: CNTSTRMODEL_NH1F     = 4     
-        ! Harmonic stretching model + axial buckling 
-        integer(c_int), parameter            :: CNTSTRMODEL_H1B      = 5     
+        integer(c_int), parameter            :: CNTSTRMODEL_NH1F     = 4
+        ! Harmonic stretching model + axial buckling
+        integer(c_int), parameter            :: CNTSTRMODEL_H1B      = 5
         ! Harmonic stretching model + axial buckling + hysteresis
-        integer(c_int), parameter            :: CNTSTRMODEL_H1BH     = 6     
+        integer(c_int), parameter            :: CNTSTRMODEL_H1BH     = 6
 
         integer(c_int), parameter            :: CNTBNDMODEL_H        = 0     ! Harmonic bending model
         integer(c_int), parameter            :: CNTBNDMODEL_HB       = 1     ! Harmonic bending - buckling model
         integer(c_int), parameter            :: CNTBNDMODEL_HBF      = 2     ! Harmonic bending - buckling - fracture model
         integer(c_int), parameter            :: CNTBNDMODEL_HBH      = 3     ! Harmonic bending - buckling + Hysteresis
-        
+
         integer(c_int), parameter            :: CNTPOTNMAX           = 4000  ! Maximum number of points in the interpolation tables
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Parameters of potentials
 !---------------------------------------------------------------------------------------------------
 
         ! Stretching potential
-        
+
         ! Type of the bending model
         integer(c_int)                       :: CNTSTRModel  = CNTSTRMODEL_H1
         ! Type of parameterization
-        integer(c_int)                       :: CNTSTRParams = 0             
+        integer(c_int)                       :: CNTSTRParams = 0
         ! Type of dependence of the Young's modulus on tube radius
-        integer(c_int)                       :: CNTSTRYMT = 0                
-        
+        integer(c_int)                       :: CNTSTRYMT = 0
+
         ! Parameters of non-harmonic potential and fracture model
-        real(c_double)                          :: CNTSTRR0     = 6.8d+00       ! Reference radius of nanotubes (A) 
-                                                                                ! (this parameter is not used for the model 
-                                                                                ! parametrization, but only for calculation of the 
+        real(c_double)                          :: CNTSTRR0     = 6.8d+00       ! Reference radius of nanotubes (A)
+                                                                                ! (this parameter is not used for the model
+                                                                                ! parametrization, but only for calculation of the
                                                                                 ! force constant in eV/A)
-        real(c_double)                          :: CNTSTRD0     = 3.4d+00       ! CNT wall thickness (A) 
-        real(c_double)                          :: CNTSTREmin   = -0.4d+00      ! Minimum strain in tabulated potential 
+        real(c_double)                          :: CNTSTRD0     = 3.4d+00       ! CNT wall thickness (A)
+        real(c_double)                          :: CNTSTREmin   = -0.4d+00      ! Minimum strain in tabulated potential
         real(c_double)                          :: CNTSTREmax   = 0.13d+00      ! Maximum strain in tabulated potential.
                                                                                 ! Simultaneously, U=0 if E> CNTSTREmax
         real(c_double)                          :: CNTSTREl     = 5.0d-02       ! Maximum linear strain
@@ -129,17 +129,17 @@ implicit none
         real(c_double)                          :: CNTSTRSi                     ! Maximum stress (not used in the model) (Pa)
         real(c_double)                          :: CNTSTRDf                     ! dF/dE at failure
 
-        real(c_double)                          :: CNTSTRAA, CNTSTRBB           ! 
+        real(c_double)                          :: CNTSTRAA, CNTSTRBB           !
         real(c_double)                          :: CNTSTRAAA, CNTSTRBBB         ! Auxiliary constants
-        real(c_double)                          :: CNTSTRUl, CNTSTRUf           ! 
-       
+        real(c_double)                          :: CNTSTRUl, CNTSTRUf           !
+
         ! Axial buckling - hysteresis approach
-        real(c_double)                          :: CNTSTREc     = -0.0142d+00   ! The minimum buckling strain    
-        real(c_double)                          :: CNTSTREc1    = -0.04d+00     ! Critical axial buckling strain 
+        real(c_double)                          :: CNTSTREc     = -0.0142d+00   ! The minimum buckling strain
+        real(c_double)                          :: CNTSTREc1    = -0.04d+00     ! Critical axial buckling strain
         real(c_double)                          :: CNTSTREc2    = -0.45d+00     ! Maximum buckling strain
-        
+
         ! Bending potential
-        
+
         integer(c_int)                       :: CNTBNDModel  = CNTBNDMODEL_H    ! Type of the bending model
         ! Buckling model parameters
         real(c_double)                          :: CNTBNDN      = 1.0d+00       ! Buckling exponent
@@ -149,9 +149,9 @@ implicit none
         real(c_double)                          :: CNTBNDTF     = M_PI * 120.0d+00 / 180.0d+00 ! Fracture buckling angle (rad)
         real(c_double)                          :: CNTBNDN1
         real(c_double)                          :: CNTBNDC2
-        
+
 contains !******************************************************************************************
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Stretching potential
 !---------------------------------------------------------------------------------------------------
@@ -167,7 +167,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
         integer(c_int), intent(in) :: PType
         !-------------------------------------------------------------------------------------------
-                select case ( PType ) 
+                select case ( PType )
                         case ( 0 ) ! This parametrization is based on averaged exp. data of Ref. [1]
                                 CNTSTRR0     = 6.8d+00       ! Ref. [1]
                                 CNTSTRD0     = 3.4d+00       ! Ref. [1]
@@ -180,7 +180,7 @@ contains !**********************************************************************
                         case ( 1 ) ! This parameterization is taken from Ref. [2] for (10,10) CNTs.
                                    ! These values are obtained in MD simulations with REBO potential.
                                    ! Values of Young's modulus, tensile strength and stress here
-                                   ! are close to those obtained in Ref. [3] for pristine (defectless) 
+                                   ! are close to those obtained in Ref. [3] for pristine (defectless)
                                    ! (5,5) CNT in semi-empirical QM calculations based on PM3 model
                                 CNTSTRR0     = 6.785d+00     ! Calculated with the usual formula for (10,10) CNT
                                 CNTSTRD0     = 3.35d+00      ! Ref. [2]
@@ -190,7 +190,7 @@ contains !**********************************************************************
                                 CNTSTREf     = 27.9d-02      ! Corresponds to maximum strain in Ref. [2]
                                 CNTSTRS0     = 1.031e+12     ! Ref. [2]
                                 CNTSTRSf     = 148.5d+09     ! Corresponds to tensile strength in Ref. [2]
-                        case ( 2 ) ! This parametrization is taken from Ref. [3] for (5,5) CNTs 
+                        case ( 2 ) ! This parametrization is taken from Ref. [3] for (5,5) CNTs
                                    ! with one atom vacancy defect obtained with the semi-empirical QM PM3 model
                                 CNTSTRR0     = 3.43d+00      ! Ref. [3]
                                 CNTSTRD0     = 3.4d+00       ! Ref. [3]
@@ -246,14 +246,14 @@ contains !**********************************************************************
         !
         ! Stretching without fracture, harmonic potential, with axial buckling without hysteresis
         !
-        
-        integer(c_int) function CNTSTRH1BCalc ( U, dUdL, L, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
+
+        integer(c_int) function CNTSTRH1BCalc ( U, dUdL, L, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! Young's modulus depends on R, see [4].
         ! Axial buckling without hysteresis.
-        !-------------------------------------------------------------------------------------------  
+        !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)     :: U, dUdL
         real(c_double), intent(in)      :: L, R0, L0
-        real(c_double)                  :: E, K, Kbcl, dUbcl, d, ud 
+        real(c_double)                  :: E, K, Kbcl, dUbcl, d, ud
         !-------------------------------------------------------------------------------------------
                 E    = ( L - L0 ) / L0
                 K    = 86.64d+00 + 100.56d+00 * R0
@@ -266,7 +266,7 @@ contains !**********************************************************************
                         dUbcl = 0.5d+00 * L0 * K * CNTSTREc * CNTSTREc - Kbcl * CNTSTREc
                         U = Kbcl * E + dUbcl
                         dUdL = Kbcl / L0
-                        CNTSTRH1BCalc = CNTPOT_STRETCHING  
+                        CNTSTRH1BCalc = CNTPOT_STRETCHING
                 else    ! Return to harmonic potential
                         d = -0.0142794
                         dUdL = K * ( d + E - CNTSTREc2 )
@@ -274,7 +274,7 @@ contains !**********************************************************************
                         Ud = 0.5d+00 * L0 * K * d * d
                         U = 0.5d+00 * L0 *  (d+E-CNTSTREc2) * dUdL + dUbcl - Ud
                         CNTSTRH1BCalc = CNTPOT_STRETCHING
-                end if        
+                end if
         end function CNTSTRH1BCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         !
@@ -290,7 +290,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
         real(c_double)                  :: E, K, dUbcl, Ebcl, Kbcl, Edu
         real(c_double)                  :: C, DE, t
-        !------------------------------------------------------------------------------------------- 
+        !-------------------------------------------------------------------------------------------
                 E = ( L - L0 ) / L0
                 K = 86.64d+00 + 100.56d+00 * R0
                 Kbcl = -10.98d+00 * L0
@@ -319,7 +319,7 @@ contains !**********************************************************************
                                 dUdL = Kbcl / L0
                                 CNTSTRH1BHCalc = CNTPOT_SBUCKLING
                                 Ebuc = 0.5d+00 * L0 * K * CNTSTREc1 * CNTSTREc1 - Kbcl * CNTSTREc1 - dUbcl
-                        else ! Already buckled 
+                        else ! Already buckled
                                 dUbcl = 0.5d+00 * L0 * K * CNTSTREc * CNTSTREc - Kbcl * CNTSTREc
                                 U = Kbcl * E + dUbcl
                                 dUdL = Kbcl / L0
@@ -331,7 +331,7 @@ contains !**********************************************************************
                         U = 0.5d+00 * L0 * E * dUdL
                         CNTSTRH1BHCalc = CNTPOT_STRETCHING
                         Ebuc = 0.0d+00
-                end if   
+                end if
         end function CNTSTRH1BHCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         !
@@ -345,26 +345,26 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 E = ( L - L0 ) / L0
                 if ( E < CNTSTREf ) then
-                        dUdL = ( CNTSTRAA - CNTSTRBB * E ) * E 
+                        dUdL = ( CNTSTRAA - CNTSTRBB * E ) * E
                         U    = ( CNTSTRAAA - CNTSTRBBB * E ) * E * E
                         CNTSTRNH0FCalc = CNTPOT_STRETCHING
-                else 
+                else
                         dUdL = 0.0d+00
                         U    = 0.0d+00
                         CNTSTRNH0FCalc = CNTPOT_SFRACTURE
                 end if
                 U    = L0 * R0 * U
-                dUdL = R0 * dUdL 
+                dUdL = R0 * dUdL
         end function CNTSTRNH0FCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CNTSTRNH0Init () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double)          :: S
         !-------------------------------------------------------------------------------------------
                 S        = M_2PI * CNTSTRD0 * 1.0e-20 / K_MDFU
                 CNTSTRSl = CNTSTRS0 * CNTSTREl
-                CNTSTRF0 = CNTSTRS0 * S                   
-                CNTSTRFl = CNTSTRSl * S 
-                CNTSTRFf = CNTSTRSf * S 
+                CNTSTRF0 = CNTSTRS0 * S
+                CNTSTRFl = CNTSTRSl * S
+                CNTSTRFf = CNTSTRSf * S
                 CNTSTRAA = CNTSTRF0
                 CNTSTRBB = ( CNTSTRF0 * CNTSTREf - CNTSTRFf ) / ( CNTSTREf * CNTSTREf )
                 CNTSTRAAA= CNTSTRAA / 2.0d+00
@@ -375,11 +375,11 @@ contains !**********************************************************************
                 CNTSTRSi = 0.0d+00
                 CNTSTRDf = 0.0d+00
         end subroutine CNTSTRNH0Init !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         !
         ! Stretching without fracture, non-harmonic potential of type 1
         !
-        
+
         integer(c_int) function CNTSTRNH1Calc ( U, dUdL, L, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)     :: U, dUdL
         real(c_double), intent(in)      :: L, R0, L0
@@ -390,7 +390,7 @@ contains !**********************************************************************
                         dUdL = CNTSTRF0 * E
                         U    = 0.5d+00 * E * dUdL
                         CNTSTRNH1Calc = CNTPOT_STRETCHING
-                else 
+                else
                         DE   = E - CNTSTREl
                         C    = 1.0 + CNTSTRBB * DE
                         dUdL = CNTSTRFl + CNTSTRAA * ( 1.0d+00 - 1.0d+00 / C )
@@ -398,13 +398,13 @@ contains !**********************************************************************
                 end if
                 CNTSTRNH1Calc = CNTPOT_STRETCHING
                 U    = L0 * R0 * U
-                dUdL = R0 * dUdL 
+                dUdL = R0 * dUdL
         end function CNTSTRNH1Calc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         !
         ! Stretching with fracture, non-harmonic potential of type 1
         !
-        
+
         integer(c_int) function CNTSTRNH1FCalc ( U, dUdL, L, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)     :: U, dUdL
         real(c_double), intent(in)      :: L, R0, L0
@@ -421,24 +421,24 @@ contains !**********************************************************************
                         dUdL = CNTSTRFl + CNTSTRAA * ( 1.0d+00 - 1.0d+00 / C )
                         U    = CNTSTRUl + CNTSTRAAA * DE - CNTSTRBBB * dlog ( C )
                         CNTSTRNH1FCalc = CNTPOT_STRETCHING
-                else 
+                else
                         dUdL = 0.0d+00
                         U    = 0.0d+00
                         CNTSTRNH1FCalc = CNTPOT_SFRACTURE
                 end if
                 U    = L0 * R0 * U
-                dUdL = R0 * dUdL 
+                dUdL = R0 * dUdL
         end function CNTSTRNH1FCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CNTSTRNH1Init () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double)          :: S, C, E, t
         integer(c_int)       :: i, CaseID
         !-------------------------------------------------------------------------------------------
                 S        = M_2PI * CNTSTRD0 * 1.0e-20 / K_MDFU
                 CNTSTRSl = CNTSTRS0 * CNTSTREl
-                CNTSTRF0 = CNTSTRS0 * S                   
-                CNTSTRFl = CNTSTRSl * S 
-                CNTSTRFf = CNTSTRSf * S 
+                CNTSTRF0 = CNTSTRS0 * S
+                CNTSTRFl = CNTSTRSl * S
+                CNTSTRFf = CNTSTRSf * S
                 CNTSTRAA = ( CNTSTRFf - CNTSTRFl ) * ( CNTSTREf * CNTSTRF0 - CNTSTRFl ) / ( CNTSTREf * CNTSTRF0 - CNTSTRFf )
                 CNTSTRBB = CNTSTRF0 / CNTSTRAA
                 CNTSTRAAA= CNTSTRFl + CNTSTRAA
@@ -449,7 +449,7 @@ contains !**********************************************************************
                 CNTSTRUl = 0.5d+00 * CNTSTRFl * CNTSTREl
                 CNTSTRUf = CNTSTRUl + ( CNTSTRFl + CNTSTRAA ) * ( CNTSTREf - CNTSTREl ) - CNTSTRAA * dlog ( C ) / CNTSTRBB
         end subroutine CNTSTRNH1Init !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                
+
         !
         ! General
         !
@@ -477,7 +477,7 @@ contains !**********************************************************************
                                 CNTSTRCalc = CNTSTRH1BHCalc ( U, dUdL, L, R0, L0, ABF, Ebuc )
                 end select
         end function CNTSTRCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CNTSTRInit ( STRModel, STRParams, YMType, Rref ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         integer(c_int), intent(in)   :: STRModel, STRParams, YMType
         real(c_double), intent(in)      :: Rref
@@ -498,13 +498,13 @@ contains !**********************************************************************
                         else
                                 call CNTSTRNH1Init ()
                         end if
-                end if 
+                end if
         end subroutine CNTSTRInit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Bending potentials
 !---------------------------------------------------------------------------------------------------
-        
+
         subroutine BendingGradients ( K, G0, G1, G2, R0, R1, R2 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(inout)                   :: K
         real(c_double), dimension(0:2), intent(inout)   :: G0, G1, G2
@@ -525,7 +525,7 @@ contains !**********************************************************************
                 G2 = G2 / L2
                 G1 = - ( G0 + G2 )
         end subroutine BendingGradients !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function CNTBNDHCalc ( U, dUdC, C, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! Bending model of type 0:Harmonic bending potential.
         !-------------------------------------------------------------------------------------------
@@ -554,10 +554,10 @@ contains !**********************************************************************
                 ! Check the condition for buckling
                 if ( C2 .ge. CNTBNDC2 ) then ! Buckling takes place
                         Theta= M_PI - acos ( C )
-                        Kbnd = 63.8d+00 * R0**2.93d+00 
+                        Kbnd = 63.8d+00 * R0**2.93d+00
                         Kbcl = CNTBNDB * Kbnd / CNTBNDR
-                        DUbcl= Kbnd * ( CNTBNDB * ( M_PI - 2.0d+00 * atan ( 2.0 * CNTBNDR / L0 ) ) - 0.5d+00 * L0 / CNTBNDR ) & 
-                                / CNTBNDR 
+                        DUbcl= Kbnd * ( CNTBNDB * ( M_PI - 2.0d+00 * atan ( 2.0 * CNTBNDR / L0 ) ) - 0.5d+00 * L0 / CNTBNDR ) &
+                                / CNTBNDR
                         U    = Kbcl * abs( Theta )**CNTBNDN - DUbcl
                         dUdC = Kbcl * CNTBNDN * abs( Theta )**CNTBNDN1 / sqrt ( 1.0d+00 - C * C )
                         CNTBNDHBCalc = CNTPOT_BBUCKLING
@@ -568,7 +568,7 @@ contains !**********************************************************************
                         CNTBNDHBCalc = CNTPOT_BENDING
                 end if
         end function CNTBNDHBCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function CNTBNDHBFCalc ( U, dUdC, C, R0, L0 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)             :: U, dUdC
         real(c_double), intent(in)              :: C, R0, L0
@@ -586,10 +586,10 @@ contains !**********************************************************************
                                 dUdC = 0.0d+00
                                 CNTBNDHBFCalc = CNTPOT_BFRACTURE
                         else
-                                Kbnd = 63.8d+00 * R0**2.93d+00 
+                                Kbnd = 63.8d+00 * R0**2.93d+00
                                 Kbcl = CNTBNDB * Kbnd / CNTBNDR
                                 DUbcl= Kbnd * ( CNTBNDB * ( M_PI - 2.0d+00 * atan ( 2.0 * CNTBNDR / L0 ) ) - &
-                                  0.5d+00 * L0 / CNTBNDR ) / CNTBNDR 
+                                  0.5d+00 * L0 / CNTBNDR ) / CNTBNDR
                                 U    = Kbcl * abs ( Theta )**CNTBNDN - DUbcl
                                 dUdC = Kbcl * CNTBNDN * abs ( Theta )**CNTBNDN1 / sqrt ( 1.0d+00 - C * C )
                                 CNTBNDHBFCalc = CNTPOT_BBUCKLING
@@ -601,7 +601,7 @@ contains !**********************************************************************
                         CNTBNDHBFCalc = CNTPOT_BENDING
                 end if
         end function CNTBNDHBFCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                
+
         integer(c_int) function CNTBNDHBHCalc ( U, dUdC, C, R0, L0, BBF, Ebuc ) !!!!!!!!!!!!!!!!!!!!
         ! Bending model of type 1: Harmonic bending potential with buckling with hysteresis approach.
         !-------------------------------------------------------------------------------------------
@@ -611,16 +611,16 @@ contains !**********************************************************************
         real(c_double)                          :: E1, E2, C2, Kbnd, Kbcl,Theta,DUbcl, Ubcl, Cmin,Rmax
         !-------------------------------------------------------------------------------------------
                 Rmax = 340.0d+00
-                Cmin = 1.0/(Rmax*Rmax)          
+                Cmin = 1.0/(Rmax*Rmax)
                 E1 = 1.0d+00 - C
-                E2 = 1.0d+00 + C      
+                E2 = 1.0d+00 + C
                 ! Calculate the square of curvature
                 C2 = 4.0d+00 * E2 / ( L0 * L0 * E1 )
                 Theta = M_PI - acos ( C )
-                if ( C2 .lt. Cmin ) then  ! Harmonic bending   
+                if ( C2 .lt. Cmin ) then  ! Harmonic bending
                         Kbnd = 2.0d+00 * ( 63.8d+00 * R0**2.93d+00 ) / L0
                         U    = Kbnd * E2 / E1
-                        dUdC = 2.0d+00 * Kbnd / ( E1 * E1 )              
+                        dUdC = 2.0d+00 * Kbnd / ( E1 * E1 )
                         CNTBNDHBHCalc = CNTPOT_BENDING
                         Ebuc = 0.0
                 else if ( C2 .ge. Cmin .and. C2 .lt. CNTBNDC2 ) then  ! Potential depends on buckling flag of a node
@@ -640,7 +640,7 @@ contains !**********************************************************************
                                 dUdC = Kbcl * CNTBNDN * abs( Theta )**CNTBNDN1 / sqrt ( 1.0d+00 - C * C )
                                 Ebuc = 0.0d+00
                                 CNTBNDHBHCalc = CNTPOT_BBUCKLING
-                        end if                      
+                        end if
                    else ! Greater than buckling critical point
                         if ( BBF .eq. 1 ) then ! Already buckled
                                 Theta= M_PI - acos ( C )
@@ -653,7 +653,7 @@ contains !**********************************************************************
                                 Ebuc = 0.0d00
                                 CNTBNDHBHCalc = CNTPOT_BBUCKLING
                         else ! Newly buckled
-                                Theta= M_PI - acos ( C )   
+                                Theta= M_PI - acos ( C )
                                 Kbnd = 63.8d+00 * R0**2.93d+00
                                 Kbcl = CNTBNDB * Kbnd / CNTBNDR
                                 DUbcl= 2.0d+00*Kbnd * &
@@ -666,11 +666,11 @@ contains !**********************************************************************
                         end if
                 end if
         end function CNTBNDHBHCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         !
         ! General
         !
-        
+
         integer(c_int) function CNTBNDCalc ( U, dUdC, C, R0, L0, BBF, Ebuc ) !!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)             :: U, dUdC, Ebuc
         real(c_double), intent(in)              :: C, R0, L0
@@ -688,7 +688,7 @@ contains !**********************************************************************
                                 CNTBNDCalc = CNTBNDHBHCalc ( U, dUdC, C, R0, L0, BBF, Ebuc )
                 end select
         end function CNTBNDCalc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CNTBNDInit ( BNDModel ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         integer(c_int), intent(in)   :: BNDModel
         real(c_double)                  :: A, E
@@ -710,5 +710,5 @@ contains !**********************************************************************
                 call CNTSTRInit ( STRModel, STRParams, YMType, Rref )
                 call CNTBNDInit ( BNDModel )
         end subroutine InitCNTPotModule !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module CNTPot !*********************************************************************************
diff --git a/lib/mesont/ExportCNT.f90 b/lib/mesont/ExportCNT.f90
index 20166a956e..039503d51e 100644
--- a/lib/mesont/ExportCNT.f90
+++ b/lib/mesont/ExportCNT.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Maxim Shugaev (UVA), mvs9t@virginia.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module ExportCNT !**********************************************************************************
 
@@ -28,122 +28,122 @@ contains
         bind(c, name = "mesont_lib_InitCNTPotModule")
         integer(c_int), intent(in)      :: STRModel, STRParams, YMType, BNDModel
         real(c_double), intent(in)      :: Rref
-        
+
         call InitCNTPotModule(STRModel, STRParams, YMType, BNDModel, Rref)
     endsubroutine
-    
+
     subroutine TPBInit_() &
         bind(c, name = "mesont_lib_TPBInit")
-        
+
         call TPBInit()
     endsubroutine
 
     subroutine TPMInit_(M, N) &
         bind(c, name = "mesont_lib_TPMInit")
         integer(c_int), intent(in) :: M, N
-        
+
         call TPMInit(M, N)
     endsubroutine
-    
+
     subroutine SetTablePath_(TPMFile_, N) &
         bind(c, name = "mesont_lib_SetTablePath")
         integer(c_int), intent(in)                      :: N
         character(c_char), intent(in), dimension(N)     :: TPMFile_
         integer                                         :: i
-        
+
         do i = 1, len(TPMFile)
             if (i <= N) then
                 TPMFile(i:i) = TPMFile_(i)
-            else 
+            else
                 TPMFile(i:i) = ' '
             endif
         enddo
     endsubroutine
-    
+
     function get_R_ () &
         bind(c, name = "mesont_lib_get_R")
         real(c_double) :: get_R_
         get_R_ = TPMR1
         return
     endfunction
-        
+
 
     subroutine TubeStretchingForceField_(U1, U2, F1, F2, S1, S2, X1, X2, R12, L12) &
         bind(c, name = "mesont_lib_TubeStretchingForceField")
-        ! Interaction energies associated with nodes X1 and X2                
-        real(c_double), intent(inout)                           :: U1, U2       
+        ! Interaction energies associated with nodes X1 and X2
+        real(c_double), intent(inout)                           :: U1, U2
         ! Forces exerted on nodes X1 and X2
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2       
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2
         ! Contributions of nodes X1 and X2 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2       
-        ! Coordinates of the segment nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2
+        ! Coordinates of the segment nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2
         ! Radius of a nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R12          
+        real(c_double), intent(in)                              :: R12
         ! Equilibrium length of segment (X1,X2)
-        real(c_double), intent(in)                              :: L12          
-        
+        real(c_double), intent(in)                              :: L12
+
         call TubeStretchingForceField(U1, U2, F1, F2, S1, S2, X1, X2, R12, L12)
     endsubroutine
 
     subroutine TubeBendingForceField_(U1, U2, U3, F1, F2, F3, S1, S2, S3, X1, X2, X3, R123, L123, BBF2) &
         bind(c, name = "mesont_lib_TubeBendingForceField")
         ! Interaction energies associated with nodes X1, X2, and X3
-        real(c_double), intent(inout)                           :: U1, U2, U3   
+        real(c_double), intent(inout)                           :: U1, U2, U3
         ! Forces exerted on nodes X1, X2, and X3
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2, F3   
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2, F3
         ! Contributions of nodes X1, X2, and X3 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2, S3   
-        ! Coordinates of nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2, X3   
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2, S3
+        ! Coordinates of nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2, X3
         ! Radius of nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R123         
+        real(c_double), intent(in)                              :: R123
         ! Equilibrium length of segment (X1,X2) and (X2,X3) (It is assumed to be the same for both segments)
-        real(c_double), intent(in)                              :: L123         
+        real(c_double), intent(in)                              :: L123
         integer(c_int), intent(inout)                           :: BBF2
-        
+
         call TubeBendingForceField(U1, U2, U3, F1, F2, F3, S1, S2, S3, X1, X2, X3, R123, L123, BBF2 )
     endsubroutine
 
     subroutine SegmentTubeForceField_(U1,U2,U,F1,F2,F,Fe,S1,S2,S,Se,X1,X2,R12,N,X,Xe,BBF,R,E1,E2,Ee,TPMType)&
         bind(c, name = "mesont_lib_SegmentTubeForceField")
         ! Number of nodes in array X
-        integer(c_int), intent(in)                              :: N            
+        integer(c_int), intent(in)                              :: N
         ! Interaction energies associated with nodes X1 and X2
-        real(c_double), intent(inout)                           :: U1, U2       
+        real(c_double), intent(inout)                           :: U1, U2
         ! Interaction energies associated with nodes X
-        real(c_double), intent(inout), dimension(0:N-1)         :: U            
+        real(c_double), intent(inout), dimension(0:N-1)         :: U
         ! Forces exerted on nodes X1 and X2
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2       
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2
         ! Forces exerted on nodes X
-        real(c_double), intent(inout), dimension(0:2,0:N-1)     :: F            
+        real(c_double), intent(inout), dimension(0:2,0:N-1)     :: F
         ! Force exerted on node Xe (can be updated only if Ee > 0)
-        real(c_double), intent(inout), dimension(0:2)           :: Fe           
+        real(c_double), intent(inout), dimension(0:2)           :: Fe
         ! Contributions of nodes X1 and X2 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2
         ! Contributions of nodes X to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2,0:N-1) :: S            
+        real(c_double), intent(inout), dimension(0:2,0:2,0:N-1) :: S
         ! Contributions of node Xe to the virial stress tensor (can be updated only if Ee > 0)
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: Se           
-        ! Coordinates of the segment nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: Se
+        ! Coordinates of the segment nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2
         ! Radius of nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R12          
+        real(c_double), intent(in)                              :: R12
         ! Coordinates of the nanotube nodes
-        real(c_double), intent(in), dimension(0:2,0:N-1)        :: X            
+        real(c_double), intent(in), dimension(0:2,0:N-1)        :: X
         ! Additional node of the extended chain if Ee > 0
-        real(c_double), intent(in), dimension(0:2)              :: Xe        
-        ! Bending buckling flags (BBF(i) = 1 in a case of buckling in node i)   
-        integer(c_int), intent(in), dimension(0:N-1)            :: BBF          
+        real(c_double), intent(in), dimension(0:2)              :: Xe
+        ! Bending buckling flags (BBF(i) = 1 in a case of buckling in node i)
+        integer(c_int), intent(in), dimension(0:N-1)            :: BBF
         ! Radius of nanotube X
-        real(c_double), intent(in)                              :: R         
-        ! E1 = 1 if the chain node 0 is a CNT end; E2 = 1 if the chain node N-1 is a CNT end;   
-        integer(c_int), intent(in)                           :: E1, E2       
+        real(c_double), intent(in)                              :: R
+        ! E1 = 1 if the chain node 0 is a CNT end; E2 = 1 if the chain node N-1 is a CNT end;
+        integer(c_int), intent(in)                           :: E1, E2
         ! Parameter defining the type of the extended chain (0,1,2)
-        integer(c_int), intent(in)                           :: Ee           
+        integer(c_int), intent(in)                           :: Ee
         ! Type of the tubular potential (0 or 1)
-        integer(c_int), intent(in)                           :: TPMType      
-        
+        integer(c_int), intent(in)                           :: TPMType
+
         call SegmentTubeForceField(U1, U2, U, F1, F2, F, Fe, S1, S2, S, Se, X1, X2, R12, N, X, Xe, BBF, R, E1, E2, Ee, TPMType)
     endsubroutine
 
diff --git a/lib/mesont/LinFun2.f90 b/lib/mesont/LinFun2.f90
index 8d01a25eda..d0c10088e9 100644
--- a/lib/mesont/LinFun2.f90
+++ b/lib/mesont/LinFun2.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module LinFun2 !************************************************************************************
 !
@@ -26,7 +26,7 @@ module LinFun2 !****************************************************************
 !***************************************************************************************************
 use iso_c_binding, only : c_int, c_double, c_char
 implicit none
-        
+
 contains !******************************************************************************************
 
         real(c_double) function CalcLinFun1_0 ( i, X, N, P, F ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -42,7 +42,7 @@ contains !**********************************************************************
                 A  = 1.0d+00 - A0
                 CalcLinFun1_0 = A0 * F(i1) + A * F(i)
         end function CalcLinFun1_0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CalcLinFun1_1 ( S, Sx1, i, X, N, P, F, Fx ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)                             :: S, Sx1
         integer(c_int), intent(in)                           :: i, N
@@ -78,7 +78,7 @@ contains !**********************************************************************
                 G0 = B0 * F(i1,j1) + B * F(i1,j)
                 CalcLinFun2_0 = A0 * G0 + A * G
         end function CalcLinFun2_0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine CalcLinFun2_1 ( S, Sx1, Sy1, i, j, X, Y, N1, N2, P1, P2, F, Fx, Fy ) !!!!!!!!!!!!
         real(c_double), intent(out)                             :: S, Sx1, Sy1
         integer(c_int), intent(in)                           :: i, j, N1, N2
@@ -95,19 +95,19 @@ contains !**********************************************************************
                 A  = 1.0d+00 - A0
                 B0 = ( P2(j) - Y ) / ( P2(j) - P2(j1) )
                 B  = 1.0d+00 - B0
-                
+
                 G  = B0 * F(i,j1) + B * F(i,j)
                 G0 = B0 * F(i1,j1) + B * F(i1,j)
                 S = A0 * G0 + A * G
-                
+
                 G  = B0 * Fx(i,j1) + B * Fx(i,j)
                 G0 = B0 * Fx(i1,j1) + B * Fx(i1,j)
                 Sx1 = A0 * G0 + A * G
-                
+
                 G  = B0 * Fy(i,j1) + B * Fy(i,j)
                 G0 = B0 * Fy(i1,j1) + B * Fy(i1,j)
                 Sy1 = A0 * G0 + A * G
-                
+
         end subroutine CalcLinFun2_1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module LinFun2 !********************************************************************************
diff --git a/lib/mesont/Spline1.f90 b/lib/mesont/Spline1.f90
index bd796e35cc..95d7317049 100644
--- a/lib/mesont/Spline1.f90
+++ b/lib/mesont/Spline1.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module Spline1 !************************************************************************************
 !
@@ -64,7 +64,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 X(0) = F(0) / K1(0)
                 F(0) = - K2(0) / K1(0)
-                do i = 1, N - 1 
+                do i = 1, N - 1
                         D    = - ( K1(i) + F(i-1) * K0(i) )
                         X(i) = ( K0(i) * X(i-1) - F(i) ) / D
                         F(i) = K2(i) / D
@@ -85,8 +85,8 @@ contains !**********************************************************************
                         K0(i) = P(i) - P(i-1)
                         K1(i) = ( F(i) - F(i-1) ) / K0(i)
                 end do
-                select case ( CL ) 
-                        case (1) 
+                select case ( CL )
+                        case (1)
                                 K1(0) = 2.0d+00 / 3.0d+00
                                 K2(0) = 1.0d+00 / 3.0d+00
                                 D (0) = 2 * ( K1(1) - M(0) ) / K0(1)
@@ -98,14 +98,14 @@ contains !**********************************************************************
                                 K1(0) = 1.0d+00
                                 K2(0) = 0.0d+00
                                 D(0)  = 0.0d+00
-                end select 
+                end select
                 Z = K1(N-1)
-                do i = 1, N - 2 
+                do i = 1, N - 2
                         D(i)  = 6.0d+00 * ( K1(i+1) - K1(i) )
                         K2(i) = K0(i+1)
                         K1(i) = 2.0d+00 * ( K2(i) + K0(i) )
                 end do
-                select case ( CR ) 
+                select case ( CR )
                         case (1)
                                 D(N-1)  = 2.0d+00 * ( M(N-1) - Z ) / K0(N-1)
                                 K1(N-1) = 2.0d+00 / 3.0d+00
@@ -118,14 +118,14 @@ contains !**********************************************************************
                                 K1(N-1) = 1.0d+00
                                 K0(N-1) = 0.0d+00
                                 D(N-1)  = 0.0d+00
-                end select 
+                end select
                 call sprogonka3 ( N, K0, K1, K2, D, M )
         end subroutine CreateSpline1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         real(c_double) function CalcSpline1_0 ( i, X, N, P, F, M ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         integer(c_int), intent(in)                   :: i, N
         real(c_double), intent(in)                      :: X
-        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M        
+        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M
         integer(c_int)                               :: j
         real(c_double)                                  :: HL, HR, H, H6, H26, HR2, HL2, HRH, HLH
         !-------------------------------------------------------------------------------------------
@@ -147,7 +147,7 @@ contains !**********************************************************************
         real(c_double), intent(out)                     :: S, S1
         integer(c_int), intent(in)                   :: i, N
         real(c_double), intent(in)                      :: X
-        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M        
+        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M
         integer(c_int)                               :: j
         real(c_double)                                  :: HL, HR, H, H6, H26, HR2, HL2, HRH, HLH
         !-------------------------------------------------------------------------------------------
@@ -169,7 +169,7 @@ contains !**********************************************************************
         real(c_double), intent(out)                     :: S, S1, S2
         integer(c_int), intent(in)                   :: i, N
         real(c_double), intent(in)                      :: X
-        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M        
+        real(c_double), dimension(0:N-1), intent(in)    :: P, F, M
         integer(c_int)                               :: j
         real(c_double)                                  :: HL, HR, H, H6, H26, HR2, HL2, HRH, HLH
         !-------------------------------------------------------------------------------------------
@@ -185,7 +185,7 @@ contains !**********************************************************************
                 HRH = HR / H
                 S  = ( M(j) * HR2 * HRH + M(i) * HL2 * HLH ) / 6.0d+00 + ( F(j) - M(j) * H26 ) * HRH + ( F(i) - M(i) * H26 ) * HLH
                 S1 = ( ( M(i) * HL2 - M(j) * HR2 ) / 2.0d+00 + F(i) - F(j) ) / H - H6 * ( M(i) - M(j) )
-                S2 = M(j) * HRH + M(i) * HLH 
+                S2 = M(j) * HRH + M(i) * HLH
         end subroutine CalcSpline1_2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module Spline1 !********************************************************************************
diff --git a/lib/mesont/Spline2.f90 b/lib/mesont/Spline2.f90
index b449f25c07..2dd7fb131b 100644
--- a/lib/mesont/Spline2.f90
+++ b/lib/mesont/Spline2.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module Spline2 !************************************************************************************
 !
@@ -79,7 +79,7 @@ contains !**********************************************************************
                 Fxx = 0.0d+00
                 Fyy = 0.0d+00
                 Fxxyy = 0.0d+00
-                
+
                 do II = 0, N2A
                         FF(0:N1-1) = F(0:N1-1,II)
                         MM(0)    = Fxx(0,II)
@@ -87,7 +87,7 @@ contains !**********************************************************************
                         call CreateSpline1 ( CL, CR, N1, P1, FF, MM, DD, K0, K1, K2 )
                         Fxx(0:N1-1,II) = MM(0:N1-1)
                 end do
-                
+
                 do II = N2A + 1, N2 - 1
                         FF(0:N1-N1A-1) = F(N1A:N1-1,II)
                         MM(0) = Fxx(N1A,II)
@@ -103,7 +103,7 @@ contains !**********************************************************************
                         call CreateSpline1 ( CD, CU, N2A + 1, P2, FF, MM, DD, K0, K1, K2 )
                         Fyy(II,0:N2A) = MM(0:N2A)
                 end do
-                
+
                 do II = N1A, N1 - 1
                         MM(0) = Fyy(II,0)
                         MM(N-1) = Fyy(II,N2-1)
@@ -111,19 +111,19 @@ contains !**********************************************************************
                         call CreateSpline1 ( CD, CU, N2, P2, FF, MM, DD, K0, K1, K2 )
                         Fyy(II,0:N2-1) = MM(0:N2-1)
                 end do
-                
+
                 FF(0:N1-1) = Fyy(0:N1-1,0)
                 call CreateSpline1 ( 3, 3, N1, P1, FF, MM, DD, K0, K1, K2 )
                 Fxxyy(0:N1-1,0) = MM(0:N1-1)
-                
+
                 FF(0:N1A) = Fyy(0:N1A,N2A)
                 call CreateSpline1 ( 3, 3, N1A + 1, P1, FF, MM, DD, K0, K1, K2 )
                 Fxxyy(0:N1A,N2A) = MM(0:N1A)
-                
+
                 FF(0:N1-N1A-1) = Fyy(N1A:N1-1,N2-1 )
                 call CreateSpline1 ( 3, 3, N1-N1A, P1, FF, MM, DD, K0, K1, K2 )
                 Fxxyy(N1A:N1-1,N2-1) = MM(0:N1-N1A-1)
-                
+
                 do II = 1, N1A
                         MM(0) = Fxxyy(II,0)
                         MM(N2A) = Fxxyy(II,N2A)
@@ -131,7 +131,7 @@ contains !**********************************************************************
                         call CreateSpline1 ( 2 , 2, N2A + 1, P2, FF, MM, DD, K0, K1, K2 )
                         Fxxyy(II,0:N2A) = MM(0:N2A)
                 end do
-                
+
                 do II = N1A + 1, N1 - 2
                         MM(0) = Fxxyy(II,0)
                         MM(N-1) = Fxxyy(II,N2-1)
@@ -139,9 +139,9 @@ contains !**********************************************************************
                         call CreateSpline1 ( 2 , 2, N2, P2, FF, MM, DD, K0, K1, K2 )
                         Fxxyy(II,0:N2-1) = MM(0:N2-1)
                 end do
-                
+
         end subroutine CreateSpline2Ext !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         real(c_double) function CalcSpline2_0 ( i, j, X, Y, N1, N2, P1, P2, F, Fxx, Fyy, Fxxyy ) !!!
         integer(c_int), intent(in)                              :: i, j, N1, N2
         real(c_double), intent(in)                              :: X, Y
@@ -182,5 +182,5 @@ contains !**********************************************************************
                 call ValueSpline1_1 ( S, Sx1, X, P1(i), P1(i1), Gy_0, Gy_1,Gxxy_0, Gxxy_1, P1(i) - P1(i1) )
                 Sy1 = ValueSpline1_0 ( X, P1(i), P1(i1), Gyy_0, Gyy_1,Gxxyy_0, Gxxyy_1, P1(i) - P1(i1) )
         end subroutine CalcSpline2_1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module Spline2 !********************************************************************************
diff --git a/lib/mesont/TPMForceField.f90 b/lib/mesont/TPMForceField.f90
index a7312e09f8..5fa0514eea 100644
--- a/lib/mesont/TPMForceField.f90
+++ b/lib/mesont/TPMForceField.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TPMForceField !******************************************************************************
 !
@@ -32,32 +32,32 @@ use iso_c_binding, only : c_int, c_double, c_char
 implicit none
 
 contains !******************************************************************************************
-        
+
         subroutine TubeStretchingForceField ( U1, U2, F1, F2, S1, S2, X1, X2, R12, L12 ) !!!!!!!!!!!
         ! Interaction energies associated with nodes X1 and X2
-        real(c_double), intent(inout)                           :: U1, U2       
+        real(c_double), intent(inout)                           :: U1, U2
         ! Forces exerted on nodes X1 and X2
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2       
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2
         ! Contributions of nodes X1 and X2 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2       
-        ! Coordinates of the segment nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2
+        ! Coordinates of the segment nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2
         ! Radius of a nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R12          
+        real(c_double), intent(in)                              :: R12
         ! Equilibrium length of segment (X1,X2)
-        real(c_double), intent(in)                              :: L12          
+        real(c_double), intent(in)                              :: L12
         !-------------------------------------------------------------------------------------------
         integer(c_int)                                       :: ii, jj, Event
         real(c_double)                                          :: U, F, LL, S, Ubcl
         real(c_double), dimension(0:2)                          :: DX, FF
         !-------------------------------------------------------------------------------------------
-                DX = X2 - X1 
+                DX = X2 - X1
                 LL = S_V3norm3 ( DX )
                 Event = CNTSTRCalc ( U, F, LL, R12, L12, 0, Ubcl )
 
                 U = U / 2.0d+00
                 FF = DX * F / LL
-                
+
                 F1 = F1 + FF
                 U1 = U1 + U
 
@@ -68,25 +68,25 @@ contains !**********************************************************************
                 do ii = 0, 2
                         do jj = 0, 2
                                 S = - 0.5d+00 * DX(ii) * FF(jj)
-                                S1(ii,jj) = S1(ii,jj) + S 
-                                S2(ii,jj) = S2(ii,jj) + S 
+                                S1(ii,jj) = S1(ii,jj) + S
+                                S2(ii,jj) = S2(ii,jj) + S
                         end do
                 end do
         end subroutine TubeStretchingForceField !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-        subroutine TubeBendingForceField ( U1, U2, U3, F1, F2, F3, S1, S2, S3, X1, X2, X3, R123, L123, BBF2 ) 
+        subroutine TubeBendingForceField ( U1, U2, U3, F1, F2, F3, S1, S2, S3, X1, X2, X3, R123, L123, BBF2 )
         ! Interaction energies associated with nodes X1, X2, and X3
-        real(c_double), intent(inout)                           :: U1, U2, U3   
+        real(c_double), intent(inout)                           :: U1, U2, U3
         ! Forces exerted on nodes X1, X2, and X3
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2, F3   
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2, F3
         ! Contributions of nodes X1, X2, and X3 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2, S3   
-        ! Coordinates of nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2, X3   
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2, S3
+        ! Coordinates of nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2, X3
         ! Radius of nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R123         
+        real(c_double), intent(in)                              :: R123
         ! Equilibrium length of segment (X1,X2) and (X2,X3) (It is assumed to be the same for both segments)
-        real(c_double), intent(in)                              :: L123         
+        real(c_double), intent(in)                              :: L123
         integer(c_int), intent(inout)                           :: BBF2
         !-------------------------------------------------------------------------------------------
         integer(c_int)                                          :: ii, jj, Event
@@ -105,9 +105,9 @@ contains !**********************************************************************
                 U = U / 4.0d+00
                 F = - F
 
-                F1 = F1 + G0 * F 
-                F2 = F2 + G1 * F 
-                F3 = F3 + G2 * F 
+                F1 = F1 + G0 * F
+                F2 = F2 + G1 * F
+                F3 = F3 + G2 * F
 
                 U1 = U1 + U
                 U2 = U2 + 2.0d+00 * U
@@ -117,16 +117,16 @@ contains !**********************************************************************
                 do ii = 0, 2
                         do jj = 0, 2
                                 S = 0.5d+00 * ( X1(ii) - X2(ii) ) * G0(jj)
-                                S1(ii,jj) = S1(ii,jj) + S 
-                                S2(ii,jj) = S2(ii,jj) + S 
+                                S1(ii,jj) = S1(ii,jj) + S
+                                S2(ii,jj) = S2(ii,jj) + S
                                 S = 0.5d+00 * ( X3(ii) - X2(ii) ) * G2(jj)
-                                S3(ii,jj) = S3(ii,jj) + S 
-                                S2(ii,jj) = S2(ii,jj) + S 
+                                S3(ii,jj) = S3(ii,jj) + S
+                                S2(ii,jj) = S2(ii,jj) + S
                         end do
                 end do
         end subroutine TubeBendingForceField !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-        ! The purpose of subroutine SegmentTubeForceField is to calculate interaction forces 
+        ! The purpose of subroutine SegmentTubeForceField is to calculate interaction forces
         ! (as well potential energies and components of the virial stress tensor) between a segment
         ! (X1,X2) and a sequence of segments which belongs to a single CNT.
 
@@ -134,7 +134,7 @@ contains !**********************************************************************
         ! neighbor list of segment (X1,X2).
 
         ! The nodes in X are assumed to be ordered according to their physical appearance in the nanotube.
-        ! It means that (X(i),X(i+1)) are either correspond to a real segment or divided by segments 
+        ! It means that (X(i),X(i+1)) are either correspond to a real segment or divided by segments
         ! that do not belong to a nanotube.
 
         ! Concept of the extended chain:
@@ -143,45 +143,45 @@ contains !**********************************************************************
         ! If node Xe follows XN and Xe is the nanotube end, then the extended chain is (X1,...,XN,Xe) and Ee = 2.
         ! In all other cases, the extended chain coincides with (X1,...,XN) and Ee = 0.
         ! If the extended chain contains additional node, then non-zero force is exerted on this node.
-        
+
         subroutine SegmentTubeForceField ( U1, U2, U, F1, F2, F, Fe, S1, S2, S, Se, X1, X2, R12, N, X, Xe,&
-          BBF, R, E1, E2, Ee, TPMType ) 
+          BBF, R, E1, E2, Ee, TPMType )
         ! Number of nodes in array X
-        integer(c_int), intent(in)                              :: N            
-        ! Interaction energies associated with nodes X1 and X2 
-        real(c_double), intent(inout)                           :: U1, U2       
+        integer(c_int), intent(in)                              :: N
+        ! Interaction energies associated with nodes X1 and X2
+        real(c_double), intent(inout)                           :: U1, U2
         ! Interaction energies associated with nodes X
-        real(c_double), intent(inout), dimension(0:N-1)         :: U            
+        real(c_double), intent(inout), dimension(0:N-1)         :: U
         ! Forces exerted on nodes X1 and X2
-        real(c_double), intent(inout), dimension(0:2)           :: F1, F2       
+        real(c_double), intent(inout), dimension(0:2)           :: F1, F2
         ! Forces exerted on nodes X
-        real(c_double), intent(inout), dimension(0:2,0:N-1)     :: F            
+        real(c_double), intent(inout), dimension(0:2,0:N-1)     :: F
         ! Force exerted on node Xe (can be updated only if Ee > 0)
-        real(c_double), intent(inout), dimension(0:2)           :: Fe           
+        real(c_double), intent(inout), dimension(0:2)           :: Fe
         ! Contributions of nodes X1 and X2 to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: S1, S2
         ! Contributions of nodes X to the virial stress tensor
-        real(c_double), intent(inout), dimension(0:2,0:2,0:N-1) :: S            
+        real(c_double), intent(inout), dimension(0:2,0:2,0:N-1) :: S
         ! Contributions of node Xe to the virial stress tensor (can be updated only if Ee > 0)
-        real(c_double), intent(inout), dimension(0:2,0:2)       :: Se           
-        ! Coordinates of the segment nodes 
-        real(c_double), intent(in), dimension(0:2)              :: X1, X2       
+        real(c_double), intent(inout), dimension(0:2,0:2)       :: Se
+        ! Coordinates of the segment nodes
+        real(c_double), intent(in), dimension(0:2)              :: X1, X2
         ! Radius of a nanotube the segment (X1,X2) belongs to
-        real(c_double), intent(in)                              :: R12          
+        real(c_double), intent(in)                              :: R12
         ! Coordinates of the nanotube nodes
-        real(c_double), intent(in), dimension(0:2,0:N-1)        :: X            
+        real(c_double), intent(in), dimension(0:2,0:N-1)        :: X
         ! Additional node of the extended chain if Ee > 0
-        real(c_double), intent(in), dimension(0:2)              :: Xe           
+        real(c_double), intent(in), dimension(0:2)              :: Xe
         ! Bending buckling flags (BBF(i) = 1 in a case of buckling in node i)
-        integer(c_int), intent(in), dimension(0:N-1)            :: BBF          
+        integer(c_int), intent(in), dimension(0:N-1)            :: BBF
         ! Radius of nanotube X
-        real(c_double), intent(in)                              :: R            
+        real(c_double), intent(in)                              :: R
         ! E1 = 1 if the chain node 0 is a CNT end; E1 = 2 if the chain node N-1 is a CNT end
-        integer(c_int), intent(in)                              :: E1, E2       
+        integer(c_int), intent(in)                              :: E1, E2
         ! Parameter defining the type of the extended chain (0,1,2)
-        integer(c_int), intent(in)                              :: Ee           
+        integer(c_int), intent(in)                              :: Ee
         ! Type of the tubular potential (0 or 1)
-        integer(c_int), intent(in)                              :: TPMType      
+        integer(c_int), intent(in)                              :: TPMType
         !-------------------------------------------------------------------------------------------
         integer(c_int)                                          :: k, ii, jj, IntSign
         integer(c_int)                                          :: BType, EType, LocalTPMType
@@ -191,18 +191,18 @@ contains !**********************************************************************
         real(c_double), dimension(0:2)                          :: G, DG, DQ, XX
         real(c_double)                                          :: UT, DR, DS, DS1
         ! Interaction energies associated with nodes X1 and X2
-        real(c_double)                                          :: xU1, xU2     
+        real(c_double)                                          :: xU1, xU2
         ! Interaction energies associated with nodes X
-        real(c_double), dimension(0:N-1)                        :: xU           
+        real(c_double), dimension(0:N-1)                        :: xU
         ! Forces exerted on nodes X1 and X2
-        real(c_double), dimension(0:2)                          :: xF1, xF2     
+        real(c_double), dimension(0:2)                          :: xF1, xF2
         ! Forces exerted on nodes X
-        real(c_double), dimension(0:2,0:N-1)                    :: xF           
+        real(c_double), dimension(0:2,0:N-1)                    :: xF
         ! Force exerted on node Xe (can be updated only if Ee > 0)
-        real(c_double), dimension(0:2)                          :: xFe          
+        real(c_double), dimension(0:2)                          :: xFe
         !-------------------------------------------------------------------------------------------
 
-                ! Looking for a buckling point 
+                ! Looking for a buckling point
                 BType = 0
                 do k = 0, N - 1
                         if ( BBF(k) == 1 ) then
@@ -212,7 +212,7 @@ contains !**********************************************************************
                 end do
 
                 ! Choosing the LocalTPMType and Etype.
-                ! LocalTPMType is set to 0 if both ends of the chain are nanotube ends or the chain contains a buckling point. 
+                ! LocalTPMType is set to 0 if both ends of the chain are nanotube ends or the chain contains a buckling point.
                 ! Overwise, LocalTPMType = TPMType.
                 if ( BType == 1 ) then
                         LocalTPMType = 0
@@ -231,7 +231,7 @@ contains !**********************************************************************
                         if ( EType1 .and. EType2 ) then
                                 LocalTPMType = 0
                         else
-                                LocalTPMType = TPMType 
+                                LocalTPMType = TPMType
                                 if ( EType1 ) then
                                         EType = 1
                                 else if ( EType2 ) then
@@ -241,7 +241,7 @@ contains !**********************************************************************
                                 end if
                         end if
                 end if
-                                        
+
                 if ( LocalTPMType == 0 ) then
                         IntSign = TPMInteractionFW0 ( QQ, UT, xU1, xU2, xU, xF1, xF2, xF, G1, G2, X1, X2, N, N, X )
                 else
@@ -263,10 +263,10 @@ contains !**********************************************************************
 
                 ! Contributions to the virial stresses tensor
                 do ii = 0, 2
-                        DR = 0.125d+00 * ( X2(ii) - X1(ii) ) 
+                        DR = 0.125d+00 * ( X2(ii) - X1(ii) )
                         do jj = 0, 2
                                 DS = DR * ( xF2(jj) - xF1(jj) )
-                                S1(ii,jj) = S1(ii,jj) + DS 
+                                S1(ii,jj) = S1(ii,jj) + DS
                                 S2(ii,jj) = S2(ii,jj) + DS
                         end do
                 end do
@@ -278,24 +278,24 @@ contains !**********************************************************************
                         do ii = 0, 2
                                 do jj = 0, 2
                                         DS = DQ(ii) * xFe(jj)
-                                        S1(ii,jj) = S1(ii,jj) + DS 
+                                        S1(ii,jj) = S1(ii,jj) + DS
                                         S2(ii,jj) = S1(ii,jj) + DS
                                         Se(ii,jj) = Se(ii,jj) + DS
                                 end do
                         end do
                 end if
                 do k = 0, N - 2
-                        DQ = 0.5d+00 * ( X(0:2,k+1) + X(0:2,k) ) - XX 
+                        DQ = 0.5d+00 * ( X(0:2,k+1) + X(0:2,k) ) - XX
                         call ApplyPeriodicBC ( DQ )
-                        DQ = 0.125d+00 * DQ 
-                        G  = G1(0:2,k+1) + G2(0:2,k) 
+                        DQ = 0.125d+00 * DQ
+                        G  = G1(0:2,k+1) + G2(0:2,k)
                         DG = G1(0:2,k+1) - G2(0:2,k)
                         do ii = 0, 2
-                                DR = 0.125d+00 * ( X(ii,k+1) - X(ii,k) ) 
+                                DR = 0.125d+00 * ( X(ii,k+1) - X(ii,k) )
                                 do jj = 0, 2
                                         DS  = DQ(ii) * G(jj)
                                         DS1 = DS + DR * DG(jj)
-                                        S1(ii,jj) = S1(ii,jj) + DS 
+                                        S1(ii,jj) = S1(ii,jj) + DS
                                         S2(ii,jj) = S2(ii,jj) + DS
                                         S(ii,jj,k) = S(ii,jj,k) + DS1
                                         S(ii,jj,k+1) = S(ii,jj,k+1) + DS1
diff --git a/lib/mesont/TPMGeom.f90 b/lib/mesont/TPMGeom.f90
index c5b8fcfaa7..638f2cd27e 100644
--- a/lib/mesont/TPMGeom.f90
+++ b/lib/mesont/TPMGeom.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TPMGeom !************************************************************************************
 !
@@ -39,20 +39,20 @@ implicit none
 !---------------------------------------------------------------------------------------------------
 ! Global variables
 !---------------------------------------------------------------------------------------------------
-        
+
         ! Coordinates of the whole domain
         real(c_double)                  :: DomXmin, DomXmax, DomYmin, DomYmax, DomZmin, DomZmax
         real(c_double)                  :: DomLX, DomLY, DomLZ
         real(c_double)                  :: DomLXhalf, DomLYhalf, DomLZhalf
-        
-        ! Boundary conditions 
+
+        ! Boundary conditions
         integer(c_int)               :: BC_X            = 0
         integer(c_int)               :: BC_Y            = 0
         integer(c_int)               :: BC_Z            = 0
 
         ! Skin parameter in NBL and related algorithms
         real(c_double)                  :: Rskin        = 1.0d+00
-        
+
 contains !******************************************************************************************
 
         subroutine ApplyPeriodicBC ( R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -111,12 +111,12 @@ contains !**********************************************************************
         !      cosA, cosine of the angle between lines.
         !      D1, D2, displacements.
         !      L12, unit vector directed along the closest distance.
-        !-------------------------------------------------------------------------------------------      
+        !-------------------------------------------------------------------------------------------
         real(c_double), intent(inout)                   :: H, cosA, D1, D2
         real(c_double), dimension(0:2), intent(out)     :: L12
         real(c_double), dimension(0:2), intent(in)      :: R1, L1, R2, L2
         !-------------------------------------------------------------------------------------------
-        real(c_double), intent(in)                      :: Prec 
+        real(c_double), intent(in)                      :: Prec
         real(c_double), dimension(0:2)                  :: Q1, Q2, R
         real(c_double)                                  :: C, DD1, DD2, C1, C2
         !-------------------------------------------------------------------------------------------
@@ -151,5 +151,5 @@ contains !**********************************************************************
                         L12 = L12 / H
                 end if
         end function LineLine !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module TPMGeom !********************************************************************************
diff --git a/lib/mesont/TPMLib.f90 b/lib/mesont/TPMLib.f90
index 3a186917c0..c3c9f5eb4d 100644
--- a/lib/mesont/TPMLib.f90
+++ b/lib/mesont/TPMLib.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TPMLib !*************************************************************************************
 !
@@ -61,7 +61,7 @@ contains !**********************************************************************
 !---------------------------------------------------------------------------------------------------
 ! Simple mathematical functions
 !---------------------------------------------------------------------------------------------------
-        
+
         real(c_double) function rad ( X ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: X
         !-------------------------------------------------------------------------------------------
@@ -76,7 +76,7 @@ contains !**********************************************************************
 
         integer(c_int) function signum ( X )  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: X
-        !-------------------------------------------------------------------------------------------   
+        !-------------------------------------------------------------------------------------------
                 if ( X > 0 ) then
                         signum = 1
                 else if ( X < 0 ) then
@@ -111,7 +111,7 @@ contains !**********************************************************************
         subroutine V3_ort ( V ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), dimension(0:2), intent(inout)   :: V
         !-------------------------------------------------------------------------------------------
-        real(c_double)                                  :: Vabs 
+        real(c_double)                                  :: Vabs
         !-------------------------------------------------------------------------------------------
                 Vabs = S_V3norm3 ( V )
                 V(0) = V(0) / Vabs
@@ -131,7 +131,7 @@ contains !**********************************************************************
 !---------------------------------------------------------------------------------------------------
 ! Handling of spherical and Euler angles
 !---------------------------------------------------------------------------------------------------
-        
+
         subroutine RotationMatrix3  ( M, Psi, Tet, Phi ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! Ksi, Tet and Phi are Euler angles
         !-------------------------------------------------------------------------------------------
@@ -156,7 +156,7 @@ contains !**********************************************************************
                 M(2,1) = - sT * cK
                 M(2,2) = cT
         end subroutine RotationMatrix3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine EulerAngles ( Psi, Tet, L ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)                     :: Tet, Psi
         real(c_double), dimension(0:2), intent(in)      :: L
@@ -165,7 +165,7 @@ contains !**********************************************************************
                 Psi = atan2 ( L(1), L(0) )
                 if ( Psi > M_3PI_2 ) then
                         Psi = Psi - M_3PI_2
-                else 
+                else
                         Psi = Psi + M_PI_2
                 end if
         end subroutine EulerAngles !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -211,5 +211,5 @@ contains !**********************************************************************
                 close ( unit = Fuid )
                 Fuid = -1
         end subroutine CloseFile !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module TPMLib !*********************************************************************************
diff --git a/lib/mesont/TPMM0.f90 b/lib/mesont/TPMM0.f90
index bd2e598b69..d2b38fe558 100644
--- a/lib/mesont/TPMM0.f90
+++ b/lib/mesont/TPMM0.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TPMM0 !**************************************************************************************
 !
@@ -32,7 +32,7 @@ use iso_c_binding, only : c_int, c_double, c_char
 implicit none
 
 contains !******************************************************************************************
-        
+
         integer(c_int) function TPMInteractionFSS ( Q, U, F1_1, F1_2, F2_1, F2_2, R1_1, R1_2, R2_1, R2_2, EType )
         real(c_double), intent(inout)                   :: Q, U
         real(c_double), dimension(0:2), intent(inout)   :: F1_1, F1_2, F2_1, F2_2
@@ -48,9 +48,9 @@ contains !**********************************************************************
                 L2 = S_V3norm3 ( Laxis2 )
                 Laxis2 = Laxis2 / L2
                 if ( EType < 2 ) then
-                        TPMInteractionFSS = TPMInteractionF ( Q, U, F1_1, F1_2, F2_1, F2_2, Fd, R1_1, R1_2, R2_1, R2_2, 1 ) 
+                        TPMInteractionFSS = TPMInteractionF ( Q, U, F1_1, F1_2, F2_1, F2_2, Fd, R1_1, R1_2, R2_1, R2_2, 1 )
                         R2_3 = R2_2 + R2_2 - R2_1
-                        IntSign = TPMInteractionF ( Qa, Ua, F1_1a, F1_2a, F2_1a, F2_2a, Fd, R1_1, R1_2, R2_2, R2_3, 1 ) 
+                        IntSign = TPMInteractionF ( Qa, Ua, F1_1a, F1_2a, F2_1a, F2_2a, Fd, R1_1, R1_2, R2_2, R2_3, 1 )
                         if ( IntSign > 0 ) then
                                 TPMInteractionFSS = 1
                                 call TPMSegmentForces ( F2_1a, F2_2a, F1_1a, F1_2a, R1_1, R1_2, R2, Laxis2, L2 )
@@ -59,7 +59,7 @@ contains !**********************************************************************
                                 F2_1a = F2_1a - F
                         end if
                 else
-                        TPMInteractionFSS = TPMInteractionF ( Q, U, F1_1, F1_2, F2_1, F2_2, Fd, R1_1, R1_2, R2_1, R2_2, 2 ) 
+                        TPMInteractionFSS = TPMInteractionF ( Q, U, F1_1, F1_2, F2_1, F2_2, Fd, R1_1, R1_2, R2_1, R2_2, 2 )
                         R2_3 = R2_1 + R2_1 - R2_2
                         IntSign = TPMInteractionF ( Qa, Ua, F1_1a, F1_2a, F2_1a, F2_2a, Fd, R1_1, R1_2, R2_1, R2_3, 1 )
                         if ( IntSign > 0 ) then
@@ -74,13 +74,13 @@ contains !**********************************************************************
                         Q = Q - Qa
                         if ( Q < 0.0d+00 ) Q = 0.0d+00
                         U = U - Ua
-                        F2_1 = F2_1 - F2_1a 
-                        F2_2 = F2_2 - F2_2a 
+                        F2_1 = F2_1 - F2_1a
+                        F2_2 = F2_2 - F2_2a
                         F1_1 = F1_1 - F1_1a
                         F1_2 = F1_2 - F1_2a
                 end if
         end function TPMInteractionFSS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMInteractionFW0 ( QQ, U, U1, U2, UU, F1, F2, F, G1, G2, R1, R2, N, NMAX, R )
         real(c_double), intent(inout)                           :: U, U1, U2
         integer(c_int), intent(in)                              :: N, NMAX
@@ -142,7 +142,7 @@ contains !**********************************************************************
                                         if ( D < Dmina ) Dmina = D
                                 end if
                         end if
-                        
+
                         DR = R1 - R(0:2,i+1)
                         call ApplyPeriodicBC ( DR )
                         Dminb = sqr ( DR(0) ) + sqr ( DR(1) ) + sqr ( DR(2) )
@@ -165,20 +165,20 @@ contains !**********************************************************************
                                         if ( D < Dminb ) Dminb = D
                                 end if
                         end if
-                        
+
                         if ( Dmina < Dminb ) then
                                 EType = 1
                         else
                                 EType = 2
                         end if
-                        
-                        if ( TPMInteractionFSS ( QQ(i), Ua, F1_1a, F1_2a, F2_1a, F2_2a, R1, R2, R(0:2,i), R(0:2,i+1), & 
+
+                        if ( TPMInteractionFSS ( QQ(i), Ua, F1_1a, F1_2a, F2_1a, F2_2a, R1, R2, R(0:2,i), R(0:2,i+1), &
                         EType ) > 0 ) then
                                                         TPMInteractionFW0 = 1
                                 U = U + Ua
-                                Ua = 0.25d+00 * Ua 
-                                U1 = U1 + Ua 
-                                U2 = U2 + Ua 
+                                Ua = 0.25d+00 * Ua
+                                U1 = U1 + Ua
+                                U2 = U2 + Ua
                                 UU(i) = UU(i) + Ua
                                 UU(i+1) = UU(i+1) + Ua
                                 F1 = F1 + F1_1a
@@ -190,5 +190,5 @@ contains !**********************************************************************
                         end if
                 end do
         end function TPMInteractionFW0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module TPMM0 !**********************************************************************************
diff --git a/lib/mesont/TPMM1.f90 b/lib/mesont/TPMM1.f90
index d6c8a193db..d8186683ca 100644
--- a/lib/mesont/TPMM1.f90
+++ b/lib/mesont/TPMM1.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TPMM1 !**************************************************************************************
 !
@@ -56,9 +56,9 @@ implicit none
         real(c_double), dimension(0:TPM_MAX_CHAIN-1)            :: W, C
         real(c_double), dimension(0:2)                          :: RR, E10
         real(c_double)                                          :: L10, D10
-        
+
 contains !******************************************************************************************
-        
+
         subroutine PairWeight1 ( W, E1_1, E1_2, E2_1, E2_2, R2_1, R2_2 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)                     :: W
         real(c_double), dimension(0:2), intent(out)     :: E1_1, E1_2, E2_1, E2_2
@@ -78,7 +78,7 @@ contains !**********************************************************************
                         E2_2 = 0.0d+00
                         return
                 end if
-                E20 = 0.5d+00 * ( R2_2 - R2_1 ) 
+                E20 = 0.5d+00 * ( R2_2 - R2_1 )
                 L20 = sqrt ( S_V3xx ( E20 ) + sqr ( TPMR2 ) )
                 D20 = L10 + L20 + TPBRcutoff + RSkin
                 if ( D > D20 * D20 ) then
@@ -96,12 +96,12 @@ contains !**********************************************************************
                 t = ( D - D10 ) / D20
                 W = 1.0d+00 - t * t * ( 3.0d+00 - 2.0d+00 * t )
                 dWdD = 3.0d+00 * t * ( t - 1.0d+00 ) / D20
-                E1_1 = dWdD * ( t * E10 - E ) 
-                E1_2 = dWdD * ( - t * E10 - E ) 
-                E2_1 = dWdD * ( E + t * E20 ) 
-                E2_2 = dWdD * ( E - t * E20 ) 
+                E1_1 = dWdD * ( t * E10 - E )
+                E1_2 = dWdD * ( - t * E10 - E )
+                E2_1 = dWdD * ( E + t * E20 )
+                E2_2 = dWdD * ( E - t * E20 )
         end subroutine PairWeight1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function EndWeight1 ( W, E1_1, E1_2, E2_1, E2_2, R1_1, R1_2, R2_1, R2_2 ) !!!
         real(c_double), intent(out)                     :: W
         real(c_double), dimension(0:2), intent(out)     :: E1_1, E1_2, E2_1, E2_2
@@ -114,7 +114,7 @@ contains !**********************************************************************
                 E = 0.5d+00 * ( R2_1 + R2_2 - ( R1_1 + R1_2 ) )
                 call ApplyPeriodicBC ( E )
                 D = S_V3norm3 ( E )
-                E20 = 0.5d+00 * ( R2_2 - R2_1 ) 
+                E20 = 0.5d+00 * ( R2_2 - R2_1 )
                 L20 = sqrt ( S_V3xx ( E20 ) + sqr ( TPMR2 ) )
                 D1 = L10 + L20 + TPBRcutoff + RSkin
                 if ( D < D1 ) then
@@ -126,7 +126,7 @@ contains !**********************************************************************
                         E2_2 = 0.0d+00
                         return
                 end if
-                D2 = D1 + TPMC3  
+                D2 = D1 + TPMC3
                 if ( D > D2 ) then
                         EndWeight1 = 2
                         W = 0.0d+00
@@ -142,13 +142,13 @@ contains !**********************************************************************
                 t = ( D - D1 ) / TPMC3
                 W = 1.0d+00 - t * t * ( 3.0d+00 - 2.0d+00 * t )
                 dWdD = 3.0d+00 * t * ( t - 1.0d+00 ) / TPMC3
-                E1_1 = dWdD * ( E10 - E ) 
-                E1_2 = dWdD * ( - E10 - E ) 
-                E2_1 = dWdD * ( E + E20 ) 
-                E2_2 = dWdD * ( E - E20 ) 
+                E1_1 = dWdD * ( E10 - E )
+                E1_2 = dWdD * ( - E10 - E )
+                E2_1 = dWdD * ( E + E20 )
+                E2_2 = dWdD * ( E - E20 )
         end function EndWeight1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-        integer(c_int) function TPMInteractionFC1 ( Q, U, F1, F2, P1, P2, Pe, Pe1, R1, R2, Q1, Q2, Qe, Qe1, EType ) 
+        integer(c_int) function TPMInteractionFC1 ( Q, U, F1, F2, P1, P2, Pe, Pe1, R1, R2, Q1, Q2, Qe, Qe1, EType )
         real(c_double), intent(out)                     :: Q, U
         real(c_double), dimension(0:2), intent(out)     :: F1, F2, P1, P2, Pe, Pe1
         real(c_double), dimension(0:2), intent(in)      :: R1, R2, Q1, Q2, Qe, Qe1
@@ -196,11 +196,11 @@ contains !**********************************************************************
                                 end if
                                 call TPMSegmentForces ( P1a, P2a, F1a, F2a, R1, R2, QX, M, L )
                         end if
-                        
+
                         if ( CaseID > 0 ) then
                                 IntSignb = TPMInteractionF ( Qb, Ub, F1b, F2b, P1b, P2b, Peeb, R1, R2, Q1, Q2, 0 )
                         end if
-                        
+
                         if ( CaseID == 0 ) then
                                 TPMInteractionFC1 = IntSigna
                                 Q   = Qa
@@ -226,7 +226,7 @@ contains !**********************************************************************
                                 TPMInteractionFC1 = 0
                                 if ( IntSigna > 0 .or. IntSignb > 0 ) TPMInteractionFC1 = 1
                                 W1  = 1.0d+00 - W
-                                DU  = Ub - Ua 
+                                DU  = Ub - Ua
                                 Q   = W * Qa + W1 * Qb
                                 U   = W * Ua + W1 * Ub
                                 Pe  = ( W * Peea / D ) * Me
@@ -240,7 +240,7 @@ contains !**********************************************************************
                         end if
                 end if
         end function TPMInteractionFC1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMInteractionFW1 ( QQ, U, U1, U2, UU, F1, F2, F, Fe, G1, G2, R1, R2, N, NMAX, R, Re, EType )
         real(c_double), intent(out)                             :: U, U1, U2
         integer(c_int), intent(in)                              :: N, NMAX, EType
@@ -251,7 +251,7 @@ contains !**********************************************************************
         real(c_double), dimension(0:2,0:NMAX-1), intent(in)     :: R
         !-------------------------------------------------------------------------------------------
         integer(c_int)                                          :: i, j
-        real(c_double)                                          :: Q, WW, DD 
+        real(c_double)                                          :: Q, WW, DD
         !-------------------------------------------------------------------------------------------
                 Q1 = 0.0d+00
                 Q2 = 0.0d+00
@@ -259,7 +259,7 @@ contains !**********************************************************************
                 Z1  = 0.0d+00
                 Z2  = 0.0d+00
                 TPMInteractionFW1 = 0
-                E10 = 0.5d+00 * ( R2 - R1 ) 
+                E10 = 0.5d+00 * ( R2 - R1 )
                 L10 = sqrt ( S_V3xx ( E10 ) + sqr ( TPMR1 ) )
                 D10 = TPMR1 + TPMR2 + TPMC123 * TPBRcutoff + RSkin
                 E10 = E10 / L10
@@ -293,10 +293,10 @@ contains !**********************************************************************
                         Qe = 0.0d+00
                         Qe1 = 0.0d+00
                 end if
-                
-                TPMInteractionFW1 = TPMInteractionFC1 ( Q, U, F1, F2, S1, S2, Pe, Pe1, R1, R2, Q1, Q2, Qe, Qe1, EType ) 
+
+                TPMInteractionFW1 = TPMInteractionFC1 ( Q, U, F1, F2, S1, S2, Pe, Pe1, R1, R2, Q1, Q2, Qe, Qe1, EType )
                 if ( TPMInteractionFW1 == 0 ) return
-                
+
                 W(0:N-2)  = W(0:N-2) / WW
                 E1(0:2,0:N-2) = E1(0:2,0:N-2) / WW
                 E2(0:2,0:N-2) = E2(0:2,0:N-2) / WW
@@ -322,7 +322,7 @@ contains !**********************************************************************
                 do j = 0, N - 2
                         if ( j == 0 ) then
                                 DR = EE1(0:2,0) * ( 1.0d+00 - W(0) )
-                        else 
+                        else
                                 DR = - W(j) * EE1(0:2,0)
                         end if
                         F(0:2,0) = F(0:2,0) + C(j) * DR
@@ -337,8 +337,8 @@ contains !**********************************************************************
                                 else if ( j == i - 1 ) then
                                         G1(0:2,i) = G1(0:2,i) + C(j) * ( EE2(0:2,j) - W(j) * EE2(0:2,i-1) )
                                         G2(0:2,i) = G2(0:2,i) - C(j) * W(j) * EE1(0:2,i)
-                                else 
-                                        G1(0:2,i) = G1(0:2,i) - C(j) * W(j) * EE2(0:2,i-1) 
+                                else
+                                        G1(0:2,i) = G1(0:2,i) - C(j) * W(j) * EE2(0:2,i-1)
                                         G2(0:2,i) = G2(0:2,i) - C(j) * W(j) * EE1(0:2,i)
                                 end if
                         end do
@@ -348,7 +348,7 @@ contains !**********************************************************************
                 do j = 0, N - 2
                         if ( j == N - 2 ) then
                                 DR = EE2(0:2,N-2) * ( 1.0d+00 - W(N-2) )
-                        else 
+                        else
                                 DR = - W(j) * EE2(0:2,N-2)
                         end if
                         F(0:2,N-1) = F(0:2,N-1) + C(j) * DR
@@ -368,5 +368,5 @@ contains !**********************************************************************
                 G1(0:2,N-1) = F(0:2,N-1)
                 G2(0:2,0) = F(0:2,0)
         end function TPMInteractionFW1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module TPMM1 !**********************************************************************************
diff --git a/lib/mesont/TubePotBase.f90 b/lib/mesont/TubePotBase.f90
index dbb15c1457..d278a2390f 100644
--- a/lib/mesont/TubePotBase.f90
+++ b/lib/mesont/TubePotBase.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TubePotBase !********************************************************************************
 !
@@ -25,10 +25,10 @@ module TubePotBase !************************************************************
 !
 !---------------------------------------------------------------------------------------------------
 !
-! This module contains basic parameters for all modules involved into calculations of tubular 
+! This module contains basic parameters for all modules involved into calculations of tubular
 ! potentials.
-! 
-! It includes definitions of 
+!
+! It includes definitions of
 !   -- TPBU, Lennard-Jones (12-6) potential
 !   -- TPBQ, Transfer function
 !
@@ -43,7 +43,7 @@ implicit none
 !---------------------------------------------------------------------------------------------------
 ! Constants
 !---------------------------------------------------------------------------------------------------
-        
+
         ! Types of the potential with respect to the breathing mode
         integer(c_int), parameter            :: TP_POT_MONO_R           = 0
         integer(c_int), parameter            :: TP_POT_POLY_R           = 1
@@ -56,7 +56,7 @@ implicit none
 
         ! Mass of C atom
         real(c_double), parameter               :: TPBMc                = 12.0107d+00            ! (Da)
-        
+
         ! Parameters of the Van der Waals interaction between carbon atoms in graphene sheets, see
         ! Stuart S.J., Tutein A.B., Harrison J.A., J. Chem. Phys. 112(14), 2000
         real(c_double), parameter               :: TPBEcc               = 0.00284d+00           ! (eV)
@@ -66,73 +66,73 @@ implicit none
         ! Dresselhaus et al, Carbon 33(7), 1995
         real(c_double), parameter               :: TPBAcc               = 1.421d+00             ! (A)
         real(c_double), parameter               :: TPBDcc               = 4.0d+00 / ( TPBConstD * TPBAcc * TPBAcc ) ! (1/A^2)
-        
+
         ! Specific heat of carbon nanotubes
         real(c_double), parameter               :: TPBSHcc              = 600.0d+00 / K_MDCU    ! (eV/(Da*K))
-        
+
         ! Cutoff distances for the interactomic potential and transfer function.
         ! Changes in these parameters can result in necessity to change some numerical parameters too.
         real(c_double), parameter               :: TPBRmincc            = 0.001d+00 * TPBScc    ! (A)
         real(c_double), parameter               :: TPBRcutoffcc         = 3.0d+00 * TPBScc      ! (A)
         real(c_double), parameter               :: TPBRcutoff1cc        = 2.16d+00 * TPBScc     ! (A)
-        
+
         ! Parameters of the transfer function for non-bonded interaction between carbon atoms
         real(c_double), parameter               :: TPBQScc              = 7.0d+00               ! (A)
         real(c_double), parameter               :: TPBQRcutoff1cc       = 8.0d+00               ! (A)
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Global variables
 !---------------------------------------------------------------------------------------------------
-        
+
         ! Set to .true. to generate diagnostic and warning messages
-        logical         :: TPErrCheck           = .true. 
-        character*512   :: TPErrMsg             = ''                    
-        
-        real(c_double)  :: TPGeomPrec           = 1.0d-06       ! Geometric precision, see TPInt  
+        logical         :: TPErrCheck           = .true.
+        character*512   :: TPErrMsg             = ''
+
+        real(c_double)  :: TPGeomPrec           = 1.0d-06       ! Geometric precision, see TPInt
         integer(c_int)  :: TPPotType            = TP_POT_MONO_R ! Type of the potential with respect to the breathing mode
-        
+
         ! Parameters of the interatomic potential and atoms distribution at the surface
         ! of the tube
-        
+
         real(c_double)  :: TPBM                 = TPBMc          ! Mass of an atom (Da)
         real(c_double)  :: TPBE                 = TPBEcc         ! Depth of the energy well in (12-6) LJ interatomic potential (eV)
         real(c_double)  :: TPBS                 = TPBScc         ! Sigma parameter of (12-6) LJ interatomic potential (A)
         real(c_double)  :: TPBD                 = TPBDcc         ! Numerical density of atoms at the tube surface (1/A^2)
         real(c_double)  :: TPBSH                = TPBSHcc        ! Specific heat (eV/(Da*K))
-        
+
         real(c_double)  :: TPBRmin              = TPBRmincc      ! (A)
         real(c_double)  :: TPBRcutoff           = TPBRcutoffcc   ! (A)
         real(c_double)  :: TPBRcutoff1          = TPBRcutoff1cc  ! (A)
 
         ! Parameters of the transfer function
-        
+
         real(c_double)  :: TPBQS                = TPBQScc       ! Sigma parameter of the transfer function (A)
         real(c_double)  :: TPBQRcutoff1         = TPBQRcutoff1cc! (A)
-        
+
         ! Auxiliary variables
-                
+
         real(c_double)  :: TPBE4, TPBE24, TPBDRcutoff, TPBQDRcutoff
         real(c_double)  :: TPBQR0                               ! Constant-value distance for the transfer function (A)
-        
+
         ! Table of inter-particle potential, force, and transfer function
-        
+
         integer(c_int)                          :: TPBN                 = TPBNMAX
         real(c_double)                          :: TPBDR
         real(c_double), dimension(0:TPBNMAX-1)  :: TPBQ
         real(c_double), dimension(0:TPBNMAX-1)  :: TPBU, TPBdUdR
-        
+
 contains !******************************************************************************************
 
         integer(c_int) function TPBsizeof () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                 TPBsizeof = 8 * ( size ( TPBQ ) + size ( TPBU ) + size ( TPBdUdR ) )
         end function TPBsizeof !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Interpolation
 !---------------------------------------------------------------------------------------------------
 
         real(c_double) function TPBQInt0 ( R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        real(c_double), intent(in)      :: R 
+        real(c_double), intent(in)      :: R
         !-------------------------------------------------------------------------------------------
         real(c_double)                  :: Z, RR
         integer(c_int)                  :: i
@@ -140,7 +140,7 @@ contains !**********************************************************************
                 if ( R < TPBRmin ) then
                         !call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10)' ) ': R < Rmin: R=', R, ', Rmin=', TPBRmin
-                        !call Error ( 'TPBQInt0', TPErrMsg )        
+                        !call Error ( 'TPBQInt0', TPErrMsg )
                 elseif ( R > TPBRcutoff ) then
                         TPBQInt0 = 0.0d+00
                         return
@@ -149,11 +149,11 @@ contains !**********************************************************************
                 i    = int ( RR )
                 RR   = RR - i
                 Z    = 1.0d+00 - RR
-                TPBQInt0 = TPBQ(i) * Z + TPBQ(i+1) * RR    
+                TPBQInt0 = TPBQ(i) * Z + TPBQ(i+1) * RR
         end function TPBQInt0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         real(c_double) function TPBUInt0 ( R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        real(c_double), intent(in)      :: R 
+        real(c_double), intent(in)      :: R
         !-------------------------------------------------------------------------------------------
         real(c_double)                  :: Z, RR
         integer(c_int)                  :: i
@@ -161,7 +161,7 @@ contains !**********************************************************************
                 if ( R < TPBRmin ) then
                         !call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10)' ) ': R < Rmin: R=', R, ', Rmin=', TPBRmin
-                        !call Error ( 'TPBUInt0', TPErrMsg )        
+                        !call Error ( 'TPBUInt0', TPErrMsg )
                 elseif ( R > TPBRcutoff ) then
                         TPBUInt0 = 0.0d+00
                         return
@@ -170,12 +170,12 @@ contains !**********************************************************************
                 i    = int ( RR )
                 RR   = RR - i
                 Z    = 1.0d+00 - RR
-                TPBUInt0 = TPBU(i) * Z + TPBU(i+1) * RR    
+                TPBUInt0 = TPBU(i) * Z + TPBU(i+1) * RR
         end function TPBUInt0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPBUInt1 ( U, dUdR, R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)     :: U, dUdR
-        real(c_double), intent(in)      :: R 
+        real(c_double), intent(in)      :: R
         !-------------------------------------------------------------------------------------------
         real(c_double)                  :: Z, RR
         integer(c_int)                  :: i
@@ -183,7 +183,7 @@ contains !**********************************************************************
                 if ( R < TPBRmin ) then
                         !call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10)' ) ': R < Rmin: R=', R, ', Rmin=', TPBRmin
-                        !call Error ( 'TPBUInt1', TPErrMsg )        
+                        !call Error ( 'TPBUInt1', TPErrMsg )
                 elseif ( R > TPBRcutoff ) then
                         TPBU = 0.0d+00
                         TPBdUdR = 0.0d+00
@@ -193,14 +193,14 @@ contains !**********************************************************************
                 i    = int ( RR )
                 RR   = RR - i
                 Z    = 1.0d+00 - RR
-                U    = TPBU(i) * Z + TPBU(i+1) * RR    
+                U    = TPBU(i) * Z + TPBU(i+1) * RR
                 dUdR = TPBdUdR(i) * Z + TPBdUdR(i+1) * RR
         end subroutine TPBUInt1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Calculation
 !---------------------------------------------------------------------------------------------------
-        
+
         real(c_double) function TPBQCalc0 ( R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: R
         !-------------------------------------------------------------------------------------------
@@ -210,7 +210,7 @@ contains !**********************************************************************
                         TPBQCalc0 = 0.0d+00
                 else if ( R < TPBQR0 ) then
                         TPBQCalc0 = 1.0d+00
-                else 
+                else
                         Z = TPBQS / R
                         Z = Z * Z * Z
                         Z = Z * Z
@@ -222,7 +222,7 @@ contains !**********************************************************************
                         endif
                 endif
         end function TPBQCalc0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         real(c_double) function TPBUCalc0 ( R ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: R
         !-------------------------------------------------------------------------------------------
@@ -230,7 +230,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 if ( R > TPBRcutoff ) then
                         TPBUCalc0 = 0.0d+00
-                else 
+                else
                         Z = TPBS / R
                         Z = Z * Z * Z
                         Z = Z * Z
@@ -251,7 +251,7 @@ contains !**********************************************************************
                 if ( R > TPBRcutoff ) then
                         U    = 0.0d+00
                         dUdR = 0.0d+00
-                else 
+                else
                         Z    = TPBS / R
                         Z    = Z * Z * Z
                         Z    = Z * Z
@@ -266,7 +266,7 @@ contains !**********************************************************************
                         endif
                 endif
         end subroutine TPBUCalc1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPBSegmentForces ( F1, F2, F, M, Laxis, L ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), dimension(0:2), intent(out)     :: F1, F2
         real(c_double), dimension(0:2), intent(in)      :: F, M, Laxis
@@ -284,7 +284,7 @@ contains !**********************************************************************
 !---------------------------------------------------------------------------------------------------
 ! Initialization
 !---------------------------------------------------------------------------------------------------
-        
+
         subroutine TPBInit () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double)          :: R
         integer(c_int)       :: i
diff --git a/lib/mesont/TubePotMono.f90 b/lib/mesont/TubePotMono.f90
index 8c19043a67..fc66d15c65 100644
--- a/lib/mesont/TubePotMono.f90
+++ b/lib/mesont/TubePotMono.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TubePotMono !********************************************************************************
 !
@@ -27,22 +27,22 @@ module TubePotMono !************************************************************
 !
 ! Four potentials and transfer functions are calculated in this module:
 !
-! 1. SSTP (segment - semi-infinite tube parallel): Linear density of the potential along 
-!    the segment axis which is produced by a parallel semi-infinite tube. 2D tables for this potential 
+! 1. SSTP (segment - semi-infinite tube parallel): Linear density of the potential along
+!    the segment axis which is produced by a parallel semi-infinite tube. 2D tables for this potential
 !    are generated at initialization or can be loaded from a file.
 !
-! 2. STP (segment - tube parallel): Linear density of the potential along the segment axis 
-!    which is produced by a parallel infinite tubes. This is only a particular case of the SSTP potential, 
-!    but it is considered separately for computational efficiency. 1D tables of this potential are taken 
+! 2. STP (segment - tube parallel): Linear density of the potential along the segment axis
+!    which is produced by a parallel infinite tubes. This is only a particular case of the SSTP potential,
+!    but it is considered separately for computational efficiency. 1D tables of this potential are taken
 !    from 2D tables of SSTP potential.
 !
 ! 3. SST (segment - semi-infinite tube): Potential for a segment produced by an arbitrary-
-!    oriented semi-infinite tube. This potential can not be kept in 2D tables, therefore, all 
-!    data are calculated 'on fly' with the help of SSTP potential and numerical integration along the 
+!    oriented semi-infinite tube. This potential can not be kept in 2D tables, therefore, all
+!    data are calculated 'on fly' with the help of SSTP potential and numerical integration along the
 !    segment axis
 !
-! 4. ST (segment - tube): Potential for a segment produced by an arbitrary-oriented 
-!    infinitely long tube. 2D tables for this potential are generated at initialization or can be 
+! 4. ST (segment - tube): Potential for a segment produced by an arbitrary-oriented
+!    infinitely long tube. 2D tables for this potential are generated at initialization or can be
 !    loaded from a file.
 !
 !***************************************************************************************************
@@ -62,77 +62,77 @@ implicit none
 
         integer(c_int), parameter                    :: TPMNZMAX     = 129
         integer(c_int), parameter                    :: TPMNEMAX     = 128
-        
-        integer(c_int), parameter                    :: TPMNHMAX     = 1001  
-        integer(c_int), parameter                    :: TPMNXMAX     = 1001 
-        integer(c_int), parameter                    :: TPMNMAX      = 1001 
-        
+
+        integer(c_int), parameter                    :: TPMNHMAX     = 1001
+        integer(c_int), parameter                    :: TPMNXMAX     = 1001
+        integer(c_int), parameter                    :: TPMNMAX      = 1001
+
 !---------------------------------------------------------------------------------------------------
 ! Global variables
 !---------------------------------------------------------------------------------------------------
-        
+
         integer(c_int)                               :: TPMStartMode = 1
         character(len=512)                           :: TPMFile      = 'MESONT-TABTP.xrs'
         integer(c_int)                               :: TPMUnitID    ! Unit for the tabulated potential file
-        
+
         integer(c_int)                               :: TPMNZ        = TPMNZMAX
         integer(c_int)                               :: TPMNZ1       = TPMNZMAX - 1
         integer(c_int)                               :: TPMNE        = TPMNEMAX
         integer(c_int)                               :: TPMNE1       = TPMNEMAX - 1
-        
+
         integer(c_int)                               :: TPMNH        = TPMNHMAX
         integer(c_int)                               :: TPMNH1       = TPMNHMAX - 1
         integer(c_int)                               :: TPMNX        = TPMNXMAX
         integer(c_int)                               :: TPMNX1       = TPMNXMAX - 1
-        
-        integer                                      :: TPMChiIndM   ! Chirality index M 
+
+        integer                                      :: TPMChiIndM   ! Chirality index M
         integer                                      :: TPMChiIndN   ! Chirality index N
         real(c_double)                               :: TPMR1
         real(c_double)                               :: TPMR2
-        
+
         real(c_double)                               :: TPMHmax
         real(c_double)                               :: TPMDH
-        
+
         ! Parameters of empirical correction functions
-        
+
         integer(c_int)                               :: TPMAN        = 20
         real(c_double)                               :: TPMAHmin
         real(c_double)                               :: TPMAHmax
         real(c_double)                               :: TPMADH
         real(c_double), dimension(0:TPMNHMAX-1)      :: TPMAH, TPMAF, TPMAFxx
-        
+
         ! Fitting parameters that depend on the SWCNT chirality
 
         real(c_double)                               :: TPMCaA       = 0.22d+00 ! 0.22 for (10,10) CNTs
         real(c_double)                               :: TPMCeA       = 0.35d+00 ! 0.35 for (10,10) CNTs
         real(c_double)                               :: TPMAHmin0    = 10.0d+00 ! 10.0 A for (10,10) CNTs
-        
+
         ! Parameters of SSTP integrator
-        
+
         real(c_double)                               :: TPMDE
         real(c_double), dimension(0:TPMNEMAX-1)      :: TPMCE, TPMSE
-        
+
         ! Additional parameters for SSTP potential
 
         real(c_double)                               :: TPMSSTPDelta = 0.25d+00
         integer(c_int)                               :: TPMSSTPNH
         integer(c_int)                               :: TPMSSTPNX
-        
+
         real(c_double)                               :: TPMSSTPX1
         real(c_double)                               :: TPMSSTPXmax
         real(c_double)                               :: TPMSSTPDX
-        
+
         real(c_double), dimension(0:TPMNHMAX-1,0:TPMNXMAX-1) :: TPMSSTPG
         real(c_double), dimension(0:TPMNHMAX-1,0:TPMNXMAX-1) :: TPMSSTPF, TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy
         real(c_double), dimension(0:TPMNHMAX-1)      :: TPMSSTPH
         real(c_double), dimension(0:TPMNXMAX-1)      :: TPMSSTPX
-        
+
         ! Additional parameters for STP potential
-        
+
         ! In calculations of this potential, some parameters of SSTP potential are also used.
         ! In particular, STP potential has no its own integrator. All data comes from SSTP integrator.
         ! It does not result in any computational inefficiency unless the STP potential is used without SSTP one.
-        
+
         integer(c_int)                               :: TPMNN        = 10
         real(c_double), dimension(0:TPMNHMAX-1)      :: TPMSTPG
         real(c_double), dimension(0:TPMNHMAX-1)      :: TPMSTPF, TPMSTPFxx
@@ -140,25 +140,25 @@ implicit none
         ! Parameters for ST potential
 
         ! Minimum gap dh for ST-potential
-        real(c_double)                               :: TPMSTDelta   = 1.0d+00       
+        real(c_double)                               :: TPMSTDelta   = 1.0d+00
         ! Number of subdivisions for every grid step in ST-integrator
-        integer(c_int)                               :: TPMSTNXS     = 10            
+        integer(c_int)                               :: TPMSTNXS     = 10
         real(c_double)                               :: TPMSTXmax
         real(c_double)                               :: TPMSTH1
         real(c_double)                               :: TPMSTH2
         real(c_double)                               :: TPMSTDH12
-        
+
         real(c_double), dimension(0:TPMNHMAX-1,0:TPMNXMAX-1) :: TPMSTG
         real(c_double), dimension(0:TPMNHMAX-1,0:TPMNXMAX-1) :: TPMSTF, TPMSTFxx, TPMSTFyy, TPMSTFxxyy
         real(c_double), dimension(0:TPMNHMAX-1) :: TPMSTH
         real(c_double), dimension(0:TPMNXMAX-1) :: TPMSTX
-        
+
         ! Switching parameters
-        
+
         ! Height switch (at H=0 in SST-potential)
         integer(c_int)                               :: TPMHSwitch   = 0             ! 1, use h-switch; 0, do not use the switch
         real(c_double)                               :: TPMHS        = 3.0d+00       ! Switch height, Angstrom
-        
+
         ! Angle switch
         integer(c_int)                               :: TPMASwitch   = 0             ! 1, use a-switch; 0, do not use the switch
         real(c_double)                               :: TPMAS        = 3.0d+00       ! Switch angle, degree
@@ -220,7 +220,7 @@ contains !**********************************************************************
                                 R2Y = TPMR1 * TPMSE(j)
                                 R2Z = Zmin - D
                                 do k = 0, TPMNZ1 ! Integration over the length of the second tube
-                                        R = sqr ( R2X - R1X ) + sqr ( R2Y - R1Y ) + sqr ( R2Z ) 
+                                        R = sqr ( R2X - R1X ) + sqr ( R2Y - R1Y ) + sqr ( R2Z )
                                         if ( R < Rcutoff2 ) then
                                                 R = dsqrt ( R )
                                                 if ( k == 0 .or. k == TPMNZ1 ) then
@@ -239,7 +239,7 @@ contains !**********************************************************************
                 Q = Q * C
                 U = U * sqr ( TPBD ) * C
         end subroutine TPMSSTPIntegrator !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMSSTPInt0 ( Q, U, H, X ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function returns the transfer function Q and potential U for the SSTP potential
         ! calculated by interpolation in the table without switch.
@@ -253,7 +253,7 @@ contains !**********************************************************************
                 i = 1 + int ( H / TPMDH )
                 j = 1 + int ( ( X + TPMSSTPXMax ) / TPMSSTPDX )
                 if ( ( i < TPMSSTPNH ) .and. ( j > TPMSSTPNX ) ) then
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg (TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10)' ) 'Tubes intersect each other: H=', H, ', X=', X
                         !call Error ( 'TPMSSTPInt0', TPErrMsg )
@@ -273,7 +273,7 @@ contains !**********************************************************************
                 else
                         XX = X
                 end if
-                Q = CalcLinFun2_0 ( i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPG ) 
+                Q = CalcLinFun2_0 ( i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPG )
                 U = CalcSpline2_0 ( i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPF, TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy )
                 TPMSSTPInt0 = 1
         end function TPMSSTPInt0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -303,7 +303,7 @@ contains !**********************************************************************
                         end if
                 end if
         end function TPMSSTPInt0S !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMSSTPInt1 ( Q, U, Uh, Ux, H, X ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function returns the transfer function Q, potential U, and derivatives Uh=dU/dH and
         ! Ux=dU/dX for the SSTP potential calculated by interpolation in the table without switch
@@ -317,7 +317,7 @@ contains !**********************************************************************
                 i = 1 + int ( H / TPMDH )
                 j = 1 + int ( ( X + TPMSSTPXMax ) / TPMSSTPDX )
                 if ( ( i < TPMSSTPNH ) .and. ( j > TPMSSTPNX ) ) then
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10)' ) 'Tubes intersect each other: H=', H, ', X=', X
                         !call Error ( 'TPMSSTPInt1', TPErrMsg )
@@ -339,15 +339,15 @@ contains !**********************************************************************
                 else
                         XX = X
                 end if
-                Q = CalcLinFun2_0 ( i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPG ) 
+                Q = CalcLinFun2_0 ( i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPG )
                 call CalcSpline2_1 ( U, Uh, Ux, i, j, H, XX, TPMNH, TPMNX, TPMSSTPH, TPMSSTPX, TPMSSTPF, &
-                        TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy ) 
+                        TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy )
                 TPMSSTPInt1 = 1
         end function TPMSSTPInt1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMSSTPInt1S ( Q, U, Uh, Ux, H, X ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function returns the transfer function Q, potential U, and derivatives Uh=dU/dH and
-        ! Ux=dU/dX for the SSTP potential calculated by interpolation in the table and switch to 
+        ! Ux=dU/dX for the SSTP potential calculated by interpolation in the table and switch to
         ! the case of zero H.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)     :: Q, U, Uh, Ux
@@ -375,7 +375,7 @@ contains !**********************************************************************
                         end if
                 end if
         end function TPMSSTPInt1S !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPMSSTPWrite () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function writes the table of the SSTP potential to a disk file.
         !-------------------------------------------------------------------------------------------
@@ -412,7 +412,7 @@ contains !**********************************************************************
                         end do
                 end do
         end subroutine TPMSSTPRead !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPMSSTPInit () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function calculates the table of the SSTP potential.
         !-------------------------------------------------------------------------------------------
@@ -424,7 +424,7 @@ contains !**********************************************************************
                 TPMDE = M_2PI / TPMNE
                 E = 0.0d+00
                 do i = 0, TPMNE1
-                        TPMCE(i) = cos ( E ) 
+                        TPMCE(i) = cos ( E )
                         TPMSE(i) = sin ( E )
                         E = E + TPMDE
                 end do
@@ -444,7 +444,7 @@ contains !**********************************************************************
                                 do j = 0, TPMNX1
                                         if ( ( i .ge. TPMSSTPNH ) .or. ( j .le. TPMSSTPNX ) ) then
                                                 call TPMSSTPIntegrator ( TPMSSTPG(i,j), TPMSSTPF(i,j), TPMSSTPH(i), TPMSSTPX(j) )
-                                                print '(2i5,a,e20.10,a,e20.10,a,e20.10,a,e20.10)', i, j, ' H=', TPMSSTPH(i), & 
+                                                print '(2i5,a,e20.10,a,e20.10,a,e20.10,a,e20.10)', i, j, ' H=', TPMSSTPH(i), &
                                                         ', X=', TPMSSTPX(j), ', Q=', TPMSSTPG(i,j), ', U=', TPMSSTPF(i,j)
                                         end if
                                 end do
@@ -454,11 +454,11 @@ contains !**********************************************************************
                         call TPMSSTPRead ()
                 end if
                 call CreateSpline2Ext ( 3, 3, 3, 3, TPMNH, TPMSSTPNH, TPMNX, TPMSSTPNX, TPMNMAX, TPMSSTPH, TPMSSTPX, &
-                        TPMSSTPF, TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy, FF, MM, DD, K0, K1, K2 )                
+                        TPMSSTPF, TPMSSTPFxx, TPMSSTPFyy, TPMSSTPFxxyy, FF, MM, DD, K0, K1, K2 )
         end subroutine TPMSSTPInit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 !---------------------------------------------------------------------------------------------------
-! STP potential for an infinite tube interacting with a parallel segment. No actual initialization 
+! STP potential for an infinite tube interacting with a parallel segment. No actual initialization
 ! is necessary for this potential, since the data are taken from the table for the SSTP potential.
 !---------------------------------------------------------------------------------------------------
 
@@ -473,7 +473,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 i = 1 + int ( H / TPMDH )
                 if ( i < TPMSSTPNH ) then
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10)' ) 'Tubes intersect each other: H=', H
                         !call Error ( 'TPMSTPInt0', TPErrMsg )
@@ -485,13 +485,13 @@ contains !**********************************************************************
                         return
                 end if
                 if ( i == TPMNH ) i = TPMNH - 1
-                Q = CalcLinFun1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPG ) 
-                U = CalcSpline1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPF, TPMSTPFxx ) 
+                Q = CalcLinFun1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPG )
+                U = CalcSpline1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPF, TPMSTPFxx )
                 TPMSTPInt0 = 1
         end function TPMSTPInt0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         integer(c_int) function TPMSTPInt1 ( Q, U, dUdH, H ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the transfer function Q, potential U, and derivative dUdH for 
+        ! This function returns the transfer function Q, potential U, and derivative dUdH for
         ! the STP potential calculated by interpolation in the table.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)     :: Q, U, dUdH
@@ -500,7 +500,7 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 i = 1 + int ( H / TPMDH )
                 if ( i < TPMSSTPNH ) then
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg ( TPErrMsg )
                         !write ( TPErrMsg, '(a,e20.10)' ) 'Tubes intersect each other: H=', H
                         !call Error ( 'TPMSTPInt0', TPErrMsg )
@@ -512,11 +512,11 @@ contains !**********************************************************************
                         TPMSTPInt1 = 0
                         return
                 end if
-                Q = CalcLinFun1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPG ) 
-                call CalcSpline1_1 ( U, dUdH, i, H, TPMNH, TPMSSTPH, TPMSTPF, TPMSTPFxx ) 
+                Q = CalcLinFun1_0 ( i, H, TPMNH, TPMSSTPH, TPMSTPG )
+                call CalcSpline1_1 ( U, dUdH, i, H, TPMNH, TPMSSTPH, TPMSTPF, TPMSTPFxx )
                 TPMSTPInt1 = 1
         end function TPMSTPInt1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPMSTPInit () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ! This function initializes the table of the STP potential
         !-------------------------------------------------------------------------------------------
@@ -524,7 +524,7 @@ contains !**********************************************************************
                 TPMSTPF(0:TPMNH1)   = TPMSSTPF(0:TPMNH1,TPMNX1)
                 TPMSTPFxx(0:TPMNH1) = TPMSSTPFxx(0:TPMNH1,TPMNX1)
         end subroutine TPMSTPInit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Fitting functions for the SST and ST potentials.
 ! This correction functions are chosen empirically to improve accuracy of the SST and ST potentials.
@@ -567,14 +567,14 @@ contains !**********************************************************************
                         X = - ( X1_2 - X1_1 ) / 2.0d+00
                         do j = 0, ( TPTNXMAX - 1 ) / 2
                                 HH = sqrt ( TPMAH(i) * TPMAH(i) + sqr ( X * sin ( M_PI_2 ) ) )
-                                IntSign = TPMSTPInt0 ( Qb, Ub, HH ) 
+                                IntSign = TPMSTPInt0 ( Qb, Ub, HH )
                                 call TPTSetSegPosition2 ( TPTSeg1, R1_1, R1_2 )
                                 call TPTSetSegPosition2 ( TPTSeg2, R2_1, R2_2 )
-                                IntSign = TPTSectionPotential ( Qa, Ua, Fa, Ma, TPTSeg1, j, TPTSeg2 ) 
+                                IntSign = TPTSectionPotential ( Qa, Ua, Fa, Ma, TPTSeg1, j, TPTSeg2 )
                                 if ( j == 0 ) then
                                         Uamin = Ua
                                         Ubmin = Ub
-                                else 
+                                else
                                         if ( Ua < Uamin ) then
                                                 Uamin = Ua
                                         end if
@@ -614,7 +614,7 @@ contains !**********************************************************************
                         return
                 end if
                 i = 1 + int ( ( H - TPMAHmin ) / TPMADH )
-                TPMA0 = CalcSpline1_0 ( i, H, TPMAN, TPMAH, TPMAF, TPMAFxx ) 
+                TPMA0 = CalcSpline1_0 ( i, H, TPMAN, TPMAH, TPMAF, TPMAFxx )
         end function TPMA0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         subroutine TPMA1 ( A, Ah, H ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -646,9 +646,9 @@ contains !**********************************************************************
                 i = 1 + int ( ( H - TPMAHmin ) / TPMADH )
                 call CalcSpline1_1 ( A, Ah, i, H, TPMAN, TPMAH, TPMAF, TPMAFxx )
         end subroutine TPMA1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         real(c_double) function TPMCu0 ( H, cosA, sinA ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the correction function for the magnitude of the potential. 
+        ! This function returns the correction function for the magnitude of the potential.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(in)      :: H, cosA, sinA
         !-------------------------------------------------------------------------------------------
@@ -656,7 +656,7 @@ contains !**********************************************************************
         end function TPMCu0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         subroutine TPMCu1 ( Cu, CuH, CuA, H, cosA, sinA ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! The subroutine calculates the correction function Cu for the magnitude of the potential and 
+        ! The subroutine calculates the correction function Cu for the magnitude of the potential and
         ! its derivatives CuH and CuA.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(ouT)     :: Cu, CuH, CuA
@@ -664,7 +664,7 @@ contains !**********************************************************************
         real(c_double)                  :: AA, AAh, D
         !-------------------------------------------------------------------------------------------
                 call TPMA1 ( AA, AAh, H )
-                D = sqr ( sinA ) 
+                D = sqr ( sinA )
                 AA = AA - 1.0d+00
                 Cu = 1.0d+00 + AA * D
                 CuH = AAh * D
@@ -672,7 +672,7 @@ contains !**********************************************************************
         end subroutine TPMCu1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         real(c_double) function TPMCa0 ( cosA, sinA ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the correction function for the argument of the potential. 
+        ! This function returns the correction function for the argument of the potential.
         ! If correction is not necessary, it should return sinA.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(in)      :: cosA, sinA
@@ -681,21 +681,21 @@ contains !**********************************************************************
         end function TPMCa0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         subroutine TPMCa1 ( Ca, CaA, Ka, KaA, cosA, sinA ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This subroutine calculates the correction function Cu for the depth of the potential well 
-        ! and its derivatives CuH and CuA. If correction is not necessary, it returns Ca = sinA 
+        ! This subroutine calculates the correction function Cu for the depth of the potential well
+        ! and its derivatives CuH and CuA. If correction is not necessary, it returns Ca = sinA
         ! and CaA = cosA.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)     :: Ca, CaA, Ka, KaA
         real(c_double), intent(in)      :: cosA, sinA
         !-------------------------------------------------------------------------------------------
                 Ka  = 1.0d+00 / ( 1.0d+00 - TPMCaA * sqr ( sinA ) )
-                Ca = sinA * Ka 
+                Ca = sinA * Ka
                 KaA = 2.0d+00 * TPMCaA * sinA * cosA * sqr ( Ka )
                 CaA = cosA * Ka + sinA * KaA
         end subroutine TPMCa1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         real(c_double) function TPMCe0 ( sinA ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the correction function for the argument of the potential. 
+        ! This function returns the correction function for the argument of the potential.
         ! If correction is not necessary, it returns sinA.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(in)      :: sinA
@@ -713,19 +713,19 @@ contains !**********************************************************************
                 CeA = - 2.0d+00 * TPMCeA * sinA * cosA
                 Ke = TPMCeA
         end subroutine TPMCe1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
-! SST potential for the semi-infinite tube interacting with segment. 
-! This potential does not need any initialization. All necessary data is taken from tables of the 
+! SST potential for the semi-infinite tube interacting with segment.
+! This potential does not need any initialization. All necessary data is taken from tables of the
 ! SSTP potential.
 !---------------------------------------------------------------------------------------------------
 
         integer(c_int) function TPMSSTPotential ( Q, U, X1, X2, H, cosA, D, N ) !!!!!!!!!!!!!!!!!!!!
-        ! This function calculates the transfer function Q and potential U applied to a segment 
-        ! from a semi-infinite tube based on the numerical integration (trapezoidal rule) along the segment 
-        ! axis for non-parallel objects. 
+        ! This function calculates the transfer function Q and potential U applied to a segment
+        ! from a semi-infinite tube based on the numerical integration (trapezoidal rule) along the segment
+        ! axis for non-parallel objects.
         ! Relative position of the nanotube and segment is given by axial positions of the segment
-        ! ends X1 and X2, height H, cosA= cos(A), where A is the cross-axis angle, and the displacement 
+        ! ends X1 and X2, height H, cosA= cos(A), where A is the cross-axis angle, and the displacement
         ! D of a nanotube end.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)     :: Q, U
@@ -761,7 +761,7 @@ contains !**********************************************************************
         end function TPMSSTPotential !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         integer(c_int) function TPMSSTPotentialPar ( Q, U, R1_1, Laxis1, R2_1, Laxis2, L1, N ) !!!!!
-        ! Potential for a segment and a semi-infinite tube is calculated by the numerical 
+        ! Potential for a segment and a semi-infinite tube is calculated by the numerical
         ! integration (trapezoidal rule) along the segment axis for parallel objects.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)                     :: Q, U
@@ -799,9 +799,9 @@ contains !**********************************************************************
                 Q = Q * DX
                 U = U * DX
         end function TPMSSTPotentialPar !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMSSTForces ( Q, U, F1, F2, Fd, X1, X2, H, cosA, D, N ) !!!!!!!!!!!
-        ! Potential and forces applied to the segment from a semi-infinite tube are calculated 
+        ! Potential and forces applied to the segment from a semi-infinite tube are calculated
         ! by the numerical integration (trapezoidal rule) along the segment axis.
         ! Non-parallel case.
         !-------------------------------------------------------------------------------------------
@@ -859,7 +859,7 @@ contains !**********************************************************************
                         X   = X + DX
                 end do
                 if ( TPMSSTForces == 0 ) return
-                
+
                 C   = DX * Cu
                 I0  = I0 * C
                 Ih  = Ih * C
@@ -868,7 +868,7 @@ contains !**********************************************************************
                 Ix  = Ix * C
                 Ix1 = Ix1 * C
 
-                DX  = X2 - X1 
+                DX  = X2 - X1
 
                 Q  = Q * C
                 U  = I0
@@ -877,23 +877,23 @@ contains !**********************************************************************
 
                 C1 = Ka * Ka * Ih1
                 C  = h * ( C1 + cosA * Ke * Ix ) / DX
-                F1(0) = X2 * Uh - C 
+                F1(0) = X2 * Uh - C
                 F2(0) = C - X1 * Uh
-                
+
                 C = ( cosA * sinA * C1 + ( Ke * sinA - sinA ) * Ix ) / DX
-                F1(1) = Ua - X2 * C 
+                F1(1) = Ua - X2 * C
                 F2(1) = X1 * C - Ua
-                
+
                 C1 = Ca * Ca * Ih1 + cosA * Ix
                 C2 = Ca * Ca * Ih2 + cosA * Ix1
                 F1(2) = ( U - X2 * C1 + C2 ) / DX
                 F2(2) = ( X1 * C1 - C2 - U ) / DX
-                
+
                 Fd = Ce * Ix
         end function TPMSSTForces !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-        integer(c_int) function TPMSSTForcesPar ( Q, U, F1, F2, Fd, R1_1, Laxis1, R2_1, Laxis2, L1, N ) 
-        ! Potential and forces applied to the segment from a semi-infinite tube are calculated by 
+        integer(c_int) function TPMSSTForcesPar ( Q, U, F1, F2, Fd, R1_1, Laxis1, R2_1, Laxis2, L1, N )
+        ! Potential and forces applied to the segment from a semi-infinite tube are calculated by
         ! the numerical integration (trapezoidal rule) along the segment axis.
         ! Parallel case
         !-------------------------------------------------------------------------------------------
@@ -942,8 +942,8 @@ contains !**********************************************************************
                                         U  = U + Us
                                         Fd = Fd + Usx
                                 end if
-                                F1 = F1 + Gamma * Fs 
-                                F2 = F2 + Beta * Fs 
+                                F1 = F1 + Gamma * Fs
+                                F2 = F2 + Beta * Fs
                         end if
                         X = X + DX
                 end do
@@ -954,15 +954,15 @@ contains !**********************************************************************
                 F1 = DX * F1 + Fs
                 F2 = DX * F2 - Fs
         end function TPMSSTForcesPar !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! ST: Potential for a infinite tube interacting with a segment
 !--------------------------------------------------------------------------------------------------
-        
+
         !
         ! These functions are used to smooth boundaries in (H,X) domain for ST potential
         !
-        
+
         real(c_double) function TPMSTXMin0 ( H ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: H
         !-------------------------------------------------------------------------------------------
@@ -979,7 +979,7 @@ contains !**********************************************************************
                 TPMSTXMin0 = sqrt ( TPMSTH2 * TPMSTH2 - H * H ) &
                         * ( 1.0d+00 - X * X * X * ( 3.0d+00 * X * ( 2.0d+00 * X - 5.0d+00 ) + 10.0d+00 ) )
         end function TPMSTXMin0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         real(c_double) function TPMSTXMax0 ( H ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: H
         !-------------------------------------------------------------------------------------------
@@ -1005,11 +1005,11 @@ contains !**********************************************************************
                 F = 1.0d+00 - X * X * X * ( 3.0d+00 * X * ( 2.0d+00 * X - 5.0d+00 ) + 10.0d+00 )
                 X = X * ( X - 1.0d+00 )
                 dFdX = - 30.0d+00 * X * X
-                XMin = sqrt ( TPMSTH2 * TPMSTH2 - H * H ) 
+                XMin = sqrt ( TPMSTH2 * TPMSTH2 - H * H )
                 dXMindH = - H * F / XMin + XMin * dFdX / TPMSTDH12
                 XMin = XMin * F
         end subroutine TPMSTXMin1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPMSTXMax1 ( XMax, dXMaxdH, H ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)     :: XMax, dXMaxdH
         real(c_double), intent(in)      :: H
@@ -1017,11 +1017,11 @@ contains !**********************************************************************
                 XMax    = sqrt ( TPMSTXMax * TPMSTXMax - H * H )
                 dXMaxdH = - H / XMax
         end subroutine TPMSTXMax1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         !
         ! ST (segment-tube) table
         !
-        
+
         subroutine TPMSTIntegrator ( G, F, Q, U, H, X, DX ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(inout)   :: G, F, Q, U
         real(c_double), intent(in)      :: H, X, DX
@@ -1036,7 +1036,7 @@ contains !**********************************************************************
                 U = 0.0d+00
                 HH  = dsqrt ( sqr ( H ) + sqr ( X ) )
                 if ( HH > TPMHmax ) return
-                IntSign = TPMSTPInt0 ( Q, U, HH ) 
+                IntSign = TPMSTPInt0 ( Q, U, HH )
                 if ( IntSign == 1 ) then
                         G = G + Q * DDX
                         F = F + U * DDX
@@ -1059,10 +1059,10 @@ contains !**********************************************************************
                         G = 0.0d+00
                         F = 0.0d+00
                         TPMSTInt0 = 2
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg ( TPErrMsg )
                         !all Error ( 'TPMSTInt0', 'H < 0' )
-                        !!return 
+                        !!return
                 end if
                 S = signum ( X )
                 XA = dabs ( X )
@@ -1074,7 +1074,7 @@ contains !**********************************************************************
                 if ( XXX < 0.0d+00 ) then
                         j  = 1
                         XXXX = 0.0d+00
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10,a,e20.10)' ) 'X < XMin, X=', XA, ', XMin=', XMin, ', H=', H
                         !call Error ( 'TPMSTInt0', TPErrMsg )
                 else if ( XXX .ge. 1.0d+00 ) then
@@ -1084,8 +1084,8 @@ contains !**********************************************************************
                         XXXX = XXX
                         j = 1 + int ( XXXX * TPMNX1 )
                 end if
-                G = S * CalcLinFun2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTG ) 
-                F = S * CalcSpline2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTF, TPMSTFxx, TPMSTFyy, TPMSTFxxyy ) 
+                G = S * CalcLinFun2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTG )
+                F = S * CalcSpline2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTF, TPMSTFxx, TPMSTFyy, TPMSTFxxyy )
                 TPMSTInt0 = 1
         end function TPMSTInt0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -1109,10 +1109,10 @@ contains !**********************************************************************
                         Fh = 0.0d+00
                         Fx = 0.0d+00
                         TPMSTInt1 = 2
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !!call PrintStdLogMsg ( trim ( TPErrMsg ) )
                         !call Error ( 'TPMSTInt1', 'H < 0' )
-                        !!return 
+                        !!return
                 end if
                 S = signum ( X )
                 XA = dabs ( X )
@@ -1126,7 +1126,7 @@ contains !**********************************************************************
                         j  = 1
                         XXX = 0.0d+00
                         XXXX = 0.0d+00
-                        !call PrintTPErrMsg ()        
+                        !call PrintTPErrMsg ()
                         !write ( TPErrMsg, '(a,e20.10,a,e20.10,a,e20.10)' ) 'X < XMin, X=', XA, ', XMin=', XMin, ', H=', H
                         !call Error ( 'TPMSTInt', TPErrMsg )
                 else if ( XXX .ge. 1.0d+00 ) then
@@ -1134,19 +1134,19 @@ contains !**********************************************************************
                         XXX = 1.0d+00
                         XXXX = 1.0d+00
                 else
-                        XXXX = XXX 
+                        XXXX = XXX
                         j = 1 + int ( XXXX * TPMNX1 )
                 end if
-                G = S * CalcLinFun2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTG ) 
+                G = S * CalcLinFun2_0 ( i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, TPMSTG )
                 call CalcSpline2_1 ( F, Fh, Fx, i, j, H, XXXX, TPMNH, TPMNX, TPMSTH, TPMSTX, &
-                        TPMSTF, TPMSTFxx, TPMSTFyy, TPMSTFxxyy ) 
+                        TPMSTF, TPMSTFxx, TPMSTFyy, TPMSTFxxyy )
                 Fx = Fx / DX
                 Fh = Fh - Fx * ( dXMaxdH * XXX + dXMindH * ( 1.0d+00 - XXX ) )
                 F = F * S
                 Fh = Fh * S
                 TPMSTInt1 = 1
         end function TPMSTInt1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMSTPotential ( Q, U, X1, X2, H, cosA, CaseID ) !!!!!!!!!!!!!!!!!!!
         real(c_double), intent(out)     :: Q, U
         real(c_double), intent(in)      :: X1, X2, H, cosA
@@ -1157,7 +1157,7 @@ contains !**********************************************************************
                 if ( CaseID == MD_LINES_PAR ) then
                         TPMSTPotential = TPMSTPInt0 ( Q, U, H )
                         U = U * ( X2 - X1 )
-                        return 
+                        return
                 end if
                 TPMSTPotential = 0
                 sinA = dsqrt ( 1.0d+00 - cosA * cosA )
@@ -1192,12 +1192,12 @@ contains !**********************************************************************
                         F2(2) = - U
                         Q     = Q * DX
                         U     = U * DX
-                        return 
+                        return
                 end if
 
                 sinA = dsqrt ( 1.0d+00 - cosA * cosA )
                 call TPMCa1 ( Ca, CaA, Ka, KaA, cosA, sinA )
-                IntSign1 = TPMSTInt1  ( GG1, FF1, Fh1, Fx1, H, X1 * Ca )               
+                IntSign1 = TPMSTInt1  ( GG1, FF1, Fh1, Fx1, H, X1 * Ca )
                 IntSign2 = TPMSTInt1  ( GG2, FF2, Fh2, Fx2, H, X2 * Ca )
                 if ( ( IntSign1 .ne. 1 ) .and. ( IntSign2 .ne. 1 ) ) then
                         Q = 0.0d+00
@@ -1205,11 +1205,11 @@ contains !**********************************************************************
                         F1 = 0.0d+00
                         F2 = 0.0d+00
                         TPMSTForces = 0
-                        return 
+                        return
                 end if
-                
+
                 call TPMCu1 ( Cu, CuH, CuA, H, cosA, sinA )
-                
+
                 Q = Cu * ( GG2 - GG1 ) / Ca
                 U = Cu * ( FF2 - FF1 ) / Ca
 
@@ -1218,19 +1218,19 @@ contains !**********************************************************************
                 D = CuH * U / Cu + Cu * ( Fh2 - Fh1 ) / Ca
                 F1(0) = ( X2 * D - C ) / DX
                 F2(0) = ( C - X1 * D ) / DX
-                
+
                 C = cosA * B
                 D = ( CuA / Cu - CaA / Ca ) * U + CaA * Cu * ( X2 * Fx2 - X1 * Fx1 ) / Ca
                 F1(1) = ( D - X2 * C ) / DX
                 F2(1) = ( X1 * C - D ) / DX
-                
+
                 F1(2) = Cu * Fx1
                 F2(2) = - Cu * Fx2
-                
+
                 TPMSTForces = 1
         end function TPMSTForces !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-        integer(c_int) function TPMSTForceTorque( Qi, Ui, Fi, Ti, Q, U, F, T, Psi, PsiA, Cap, L, H, cosA, CaseID ) 
+        integer(c_int) function TPMSTForceTorque( Qi, Ui, Fi, Ti, Q, U, F, T, Psi, PsiA, Cap, L, H, cosA, CaseID )
         real(c_double), intent(out)                     :: Qi, Ui, Fi, Ti, Q, U, F, T, Psi, PsiA, Cap
         real(c_double), intent(in)                      :: L, H, cosA
         integer(c_int), intent(in)                      :: CaseID
@@ -1254,14 +1254,14 @@ contains !**********************************************************************
                         Psi = 0.0d+00
                         PsiA = 0.0d+00
                         Cap = 0.0d+00
-                        return 
+                        return
                 end if
-                
+
                 L2 = 0.5d+00 * L
                 sinA = dsqrt ( 1.0d+00 - cosA * cosA )
                 call TPMCa1 ( Ca, CaA, Ka, KaA, cosA, sinA )
-                IntSign = TPMSTInt1  ( GG, FF, Fh, Fx, H, L2 * Ca )               
-                IntSign = TPMSTInt1  ( GGi, FFi, Fhi, Fxi, H, TPMSTXmax )               
+                IntSign = TPMSTInt1  ( GG, FF, Fh, Fx, H, L2 * Ca )
+                IntSign = TPMSTInt1  ( GGi, FFi, Fhi, Fxi, H, TPMSTXmax )
                 if ( IntSign .ne. 1 ) then
                         Qi = 0.0d+00
                         Ui = 0.0d+00
@@ -1275,11 +1275,11 @@ contains !**********************************************************************
                         PsiA = 0.0d+00
                         Cap  = 0.0d+00
                         TPMSTForceTorque = 0
-                        return 
+                        return
                 end if
-                
+
                 call TPMCu1 ( Cu, CuH, CuA, H, cosA, sinA )
-                
+
                 Psi = Cu / Ca
                 PsiA = ( CuA * Ca - Cu * CaA ) / Ca / Ca
                 Cap = CuA / Cu - KaA / Ka - cosA / sinA
@@ -1287,16 +1287,16 @@ contains !**********************************************************************
                 Ui = 2.0d+00 * Psi * FFi
                 Fi = - 2.0d+00 * ( CuH * FFi / Ca + Psi * Fhi )
                 Ti = - Cap * Ui
-                
+
                 Q = 2.0d+00 * Cu * GG / Ca
                 U = 2.0d+00 * Cu * FF / Ca
                 F = - 2.0d+00 * ( CuH * FF / Ca + Psi * Fh )
                 T = - 2.0d+00 * ( ( CuA * Ka - Cu * KaA ) / ( Ka * Ka * sinA ) - Cu * cosA / ( Ka * sinA * sinA ) ) * FF &
                     - 2.0d+00 * Cu / ( Ka * sinA ) * Fx * L2 * ( KaA * sinA + Ka * cosA )
-                
+
                 TPMSTForceTorque = 1
         end function TPMSTForceTorque !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPMSTInit () !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double)                          :: X, Q, U, DX, DDX, XMin, XMax
         integer(c_int)                          :: i, j, k
@@ -1307,7 +1307,7 @@ contains !**********************************************************************
                 TPMSTDH12 = TPMSTH2 - TPMSTH1
                 TPMSTXmax = TPMHMax + TPMSTDelta
                 DX = 1.0 / TPMNX1
-                do j = 0, TPMNX1  
+                do j = 0, TPMNX1
                         TPMSTX(j) = DX * j
                 end do
                 do i = 0, TPMNH1
@@ -1323,7 +1323,7 @@ contains !**********************************************************************
                         TPMSTF(i,0) = 0.0d+00
                         TPMSTFyy(i,0) = U
                         TPMSTFyy(i,TPMNX1) = 0.0d+00
-                        do j = 1, TPMNX1  
+                        do j = 1, TPMNX1
                                 TPMSTG(i,j) = TPMSTG(i,j-1)
                                 TPMSTF(i,j) = TPMSTF(i,j-1)
                                 do k = 0, TPMSTNXS - 1
@@ -1334,18 +1334,18 @@ contains !**********************************************************************
                         end do
                 end do
                 call CreateSpline2 ( 3, 3, 3, 3, TPMNH, TPMNX, TPMNMAX, TPMSTH, TPMSTX, TPMSTF, TPMSTFxx, &
-                        TPMSTFyy, TPMSTFxxyy, FF, MM, DD, K0, K1, K2 )                
+                        TPMSTFyy, TPMSTFxxyy, FF, MM, DD, K0, K1, K2 )
         end subroutine TPMSTInit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 !---------------------------------------------------------------------------------------------------
-! Interaction functions: They can be used for calculation of the potential and forces between a 
+! Interaction functions: They can be used for calculation of the potential and forces between a
 ! segment and an  infinite or semi-infinite nanotube.
 !---------------------------------------------------------------------------------------------------
 
         subroutine TPMSegmentForces ( F2_1, F2_2, F1_1, F1_2, R1_1, R1_2, R2, Laxis2, L2 ) !!!!!!!!!
         real(c_double), dimension(0:2), intent(out)     :: F2_1, F2_2
         real(c_double), dimension(0:2), intent(in)      :: F1_1, F1_2, R1_1, R1_2, R2, Laxis2
-        real(c_double), intent(in)                      :: L2 
+        real(c_double), intent(in)                      :: L2
         !-------------------------------------------------------------------------------------------
         real(c_double), dimension(0:2)                  :: F, M, RR
         !-------------------------------------------------------------------------------------------
@@ -1389,11 +1389,11 @@ contains !**********************************************************************
                 L2 = S_V3norm3 ( Laxis2 )
                 Laxis1 = Laxis1 / L1
                 Laxis2 = Laxis2 / L2
-                L1 = 0.5d+00 * L1 
+                L1 = 0.5d+00 * L1
                 L2 = 0.5d+00 * L2
                 if ( SType2 == 2 ) Laxis2 = - Laxis2
                 GeomID = LineLine ( H, cosA, D1, D2, L12, R1, Laxis1, R2, Laxis2, TPGeomPrec )
-                
+
                 ! Angle switch
                 if ( TPMASwitch == 0 ) then
                         if ( GeomID == MD_LINES_PAR ) then
@@ -1414,7 +1414,7 @@ contains !**********************************************************************
                                 SwitchID = 1
                         end if
                 end if
-                
+
                 if ( SwitchID < 2 ) then
                         D2 = D2 - L2
                         if ( SType2 == 0 ) then
@@ -1429,14 +1429,14 @@ contains !**********************************************************************
                         Ly = Ly * S
                         if ( IntSigna > 0 ) then
                                 F1_1a = F1(0) * L12 + F1(1) * Ly + F1(2) * Laxis1
-                                F1_2a = F2(0) * L12 + F2(1) * Ly + F2(2) * Laxis1 
+                                F1_2a = F2(0) * L12 + F2(1) * Ly + F2(2) * Laxis1
                         else
                                 F1_1a = 0.0d+00
                                 F1_2a = 0.0d+00
                         end if
                 end if
-                
-                if ( SwitchID > 0 ) then 
+
+                if ( SwitchID > 0 ) then
                         if ( SType2 == 0 ) then
                                 call LinePoint ( H, L12, R2, Laxis2, R1 )
                                 L12 = L12 - R1
@@ -1451,7 +1451,7 @@ contains !**********************************************************************
                                         else
                                                 L12 = L12 / H
                                                 F1_1b = F1(0) * L12 + F1(2) * Laxis1
-                                                F1_2b = F2(0) * L12 + F2(2) * Laxis1 
+                                                F1_2b = F2(0) * L12 + F2(2) * Laxis1
                                         end if
                                 else
                                         F1_1b = 0.0d+00
@@ -1480,7 +1480,7 @@ contains !**********************************************************************
                         F1_2 = F1_2b
                         Fd   = Fdb
                         TPMInteractionF = IntSignb
-                else 
+                else
                         W1   = 1.0d+00 - W
                         Q    = W * Qa + W1 * Qb
                         U    = W * Ua + W1 * Ub
@@ -1490,7 +1490,7 @@ contains !**********************************************************************
                         Fd   = W * Fda + W1 * Fdb
                         TPMInteractionF = 0
                         if ( IntSigna > 0 .or. IntSignb > 0 ) TPMInteractionF = 1
-                end if      
+                end if
 
                 ! Calculation of forces for the complimentary tube
                 if ( SType2 == 2 ) Laxis2 = - Laxis2
@@ -1510,7 +1510,7 @@ contains !**********************************************************************
                         F2_1 = F2_1 - DR
                 end if
         end function TPMInteractionF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPMInteractionU ( Q, U, R1_1, R1_2, R2_1, R2_2, SType2 ) !!!!!!!!!!!
         real(c_double), intent(inout)                   :: Q, U
         real(c_double), dimension(0:2), intent(in)      :: R1_1, R1_2, R2_1, R2_2
@@ -1560,7 +1560,7 @@ contains !**********************************************************************
                                 IntSigna = TPMSSTPotential  ( Qa, Ua, D1 - L1, D1 + L1, H, cosA, D2 - L2, TPMNN )
                         end if
                 end if
-                
+
                 if ( SwitchID > 0 ) then
                         if ( Stype2 == 0 ) then
                                 call LinePoint ( H, L12, R2, Laxis2, R1 )
@@ -1573,7 +1573,7 @@ contains !**********************************************************************
                                 IntSignb = TPMSSTPotentialPar ( Qb, Ub, R1_1, Laxis1, R2_2, Laxis2, 2.0d+00 * L1, TPMNN )
                         end if
                 end if
-                
+
                 if ( SwitchID == 0 ) then
                         Q = Qa
                         U = Ua
@@ -1612,14 +1612,14 @@ contains !**********************************************************************
                 D2 = 2.0d+00 * Delta
                 do i = 0, 2
                         DD = - Delta
-                        do j = 0 , 1  
-                                RR = R1_1 
+                        do j = 0 , 1
+                                RR = R1_1
                                 RR(i) = RR(i) + DD
                                 IntSign = TPMInteractionU ( QQ, U1_1(j,i), RR, R1_2, R2_1, R2_2, SType2 )
-                                RR = R1_2 
+                                RR = R1_2
                                 RR(i) = RR(i) + DD
                                 IntSign = TPMInteractionU ( QQ, U1_2(j,i), R1_1, RR, R2_1, R2_2, SType2 )
-                                RR = R2_1 
+                                RR = R2_1
                                 RR(i) = RR(i) + DD;
                                 IntSign = TPMInteractionU ( QQ, U2_1(j,i), R1_1, R1_2, RR, R2_2, SType2 )
                                 RR = R2_2
@@ -1635,7 +1635,7 @@ contains !**********************************************************************
                         F2_2(i) = ( U2_2(0,i) - U2_2(1,i) ) / D2
                 end do
         end function TPMInteractionFNum !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Initialization
 !---------------------------------------------------------------------------------------------------
@@ -1646,7 +1646,7 @@ contains !**********************************************************************
         character(len=512)              :: PDate
         !-------------------------------------------------------------------------------------------
                 TPPotType = TP_POT_MONO_R
-        
+
                 ! Here we calculate the radius of nanotubes
                 RT = TPBAcc * sqrt ( 3.0d+00 * ( ChiIndM * ChiIndM + ChiIndN * ChiIndN + ChiIndM * ChiIndN ) ) / M_2PI
 
@@ -1661,7 +1661,7 @@ contains !**********************************************************************
 
                 TPMHmax = TPMR1 + TPMR2 + TPBRcutoff
                 TPMDH   = TPMHmax / TPMNH1
-                
+
                 ! Parameters of the angle switch
                 TPMASMin = sqr ( cos ( rad ( TPMAS ) ) )
                 TPMASMax = 1.0d+00 - TPGeomPrec
@@ -1669,30 +1669,30 @@ contains !**********************************************************************
 
                 if ( TPMStartMode == 1 ) then
                         TPMUnitID = OpenFile ( TPMFile, 'rt', '' )
-                        read ( unit = TPMUnitID, fmt = '()' ) 
-                        read ( unit = TPMUnitID, fmt = '()' ) 
-                        read ( unit = TPMUnitID, fmt = '()' ) 
+                        read ( unit = TPMUnitID, fmt = '()' )
+                        read ( unit = TPMUnitID, fmt = '()' )
+                        read ( unit = TPMUnitID, fmt = '()' )
                 else
                         TPMUnitID = OpenFile ( TPMFile, 'wt', '' )
                         call fdate( PDate )
-                        write ( unit = TPMUnitID, fmt = '(a,a)' ) 'DATE ', PDate 
+                        write ( unit = TPMUnitID, fmt = '(a,a)' ) 'DATE ', PDate
                         write ( unit = TPMUnitID, fmt = '(a,i3,a,i3,a)' ) &
                               'Tabulated data of the tubular potential for (', ChiIndM, ',', ChiIndN, ') CNTs'
                         write ( unit = TPMUnitID, fmt = '(a)' ) &
                               'A. N. Volkov, L. V. Zhigilei, J. Phys. Chem. C 114, 5513-5531, 2010. doi: 10.1021/jp906142h'
                 end if
-                
+
                 call TPMSSTPInit ()
-                
+
                 call TPMSTPInit ()
-                
+
                 DX = TPMR1 + TPMR2 + TPBRcutoff
-                call TPMAInit ( - DX, DX, - DX, DX )                
-                
+                call TPMAInit ( - DX, DX, - DX, DX )
+
                 call TPMSTInit ()
 
                 call CloseFile ( TPMUnitID )
-                
+
         end subroutine TPMInit !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 end module TubePotMono !****************************************************************************
diff --git a/lib/mesont/TubePotTrue.f90 b/lib/mesont/TubePotTrue.f90
index 2cb300cc32..98e7450a99 100644
--- a/lib/mesont/TubePotTrue.f90
+++ b/lib/mesont/TubePotTrue.f90
@@ -9,9 +9,9 @@
 !   the GNU General Public License.
 !
 !   See the README file in the top-level LAMMPS directory.
-!   
+!
 !   Contributing author: Alexey N. Volkov, UA, avolkov1@ua.edu
-!------------------------------------------------------------------------- 
+!-------------------------------------------------------------------------
 
 module TubePotTrue !********************************************************************************
 !
@@ -25,8 +25,8 @@ module TubePotTrue !************************************************************
 !
 !---------------------------------------------------------------------------------------------------
 !
-! This module implements calculation of the true potential and transfer functions for interaction 
-! between two cylinder segments of nanotubes by direct integration over the surfaces of both 
+! This module implements calculation of the true potential and transfer functions for interaction
+! between two cylinder segments of nanotubes by direct integration over the surfaces of both
 ! segments.
 !
 !***************************************************************************************************
@@ -55,15 +55,15 @@ implicit none
         integer(c_int)               :: NX, NE                          ! Number of nodes for numerical integration
         real(c_double)                  :: DX, DE                       ! Spacings
         real(c_double), dimension(0:2,0:2) :: M                         ! Transformation matrix
-        real(c_double), dimension(0:TPTNXMAX-1,0:TPTNXMAX-1,0:2) :: Rtab! Node coordinates        
+        real(c_double), dimension(0:TPTNXMAX-1,0:TPTNXMAX-1,0:2) :: Rtab! Node coordinates
         end type TPTSEG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 !---------------------------------------------------------------------------------------------------
 ! Global variables
 !---------------------------------------------------------------------------------------------------
-        
+
         type(TPTSEG)    :: TPTSeg1, TPTSeg2     ! Two segments
-        
+
 contains !******************************************************************************************
 
         subroutine TPTSegAxisVector ( S, Laxis ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -96,11 +96,11 @@ contains !**********************************************************************
         !-------------------------------------------------------------------------------------------
                 call TPTSegAxisVector ( S, Laxis )
                 call TPTSegRadVector ( S, Lrad, Eps )
-                R(0) = S%X + X * Laxis(0) + S%R * Lrad(0)        
+                R(0) = S%X + X * Laxis(0) + S%R * Lrad(0)
                 R(1) = S%Y + X * Laxis(1) + S%R * Lrad(1)
                 R(2) = S%Z + X * Laxis(2) + S%R * Lrad(2)
         end subroutine TPTRadiusVector !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPTCalcSegNodeTable ( S ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         type(TPTSEG), intent(inout)     :: S
         !-------------------------------------------------------------------------------------------
@@ -111,7 +111,7 @@ contains !**********************************************************************
                 call RotationMatrix3 ( S%M, S%Psi, S%Theta, S%Phi )
                 do i = 0, S%NX - 1
                         Eps = 0.0d+00
-                        do j = 0, S%NE - 1 
+                        do j = 0, S%NE - 1
                                 call TPTRadiusVector ( S, S%Rtab(i,j,0:2), X, Eps )
                                 Eps = Eps + S%DE
                         end do
@@ -133,12 +133,12 @@ contains !**********************************************************************
                 S%Z  = Rcenter(2)
                 call TPTCalcSegNodeTable ( S )
         end subroutine TPTSetSegPosition1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         subroutine TPTSetSegPosition2 ( S, R1, R2 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         type(TPTSEG), intent(inout)                     :: S
         real(c_double), dimension(0:2), intent(in)      :: R1, R2
         !-------------------------------------------------------------------------------------------
-        real(c_double), dimension(0:2)                  :: R, Laxis 
+        real(c_double), dimension(0:2)                  :: R, Laxis
         real(c_double)                                  :: L
         !-------------------------------------------------------------------------------------------
                 R = 0.5 * ( R1 + R2 )
@@ -147,7 +147,7 @@ contains !**********************************************************************
                 Laxis = Laxis / L
                 call TPTSetSegPosition1 ( S, R, Laxis, L )
         end subroutine TPTSetSegPosition2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPTCheckIntersection ( S1, S2 ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         type(TPTSEG), intent(in)        :: S1, S2
         !-------------------------------------------------------------------------------------------
@@ -193,7 +193,7 @@ contains !**********************************************************************
                         Xmin = 0.0d+00
                         Xmax = 0.0d+00
                         TPTCalcPointRange = 0
-                        return 
+                        return
                 end if
                 Distance = sqrt ( TPBRcutoff * TPBRcutoff - Distance * Distance )
                 Xmin = Displacement - Distance
@@ -218,13 +218,13 @@ contains !**********************************************************************
                 R2_2(1) = - X2_2 * sin ( A )
                 R2_2(2) = X2_2 * cos ( A )
         end subroutine TPTGetEnds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Tubular potential
 !---------------------------------------------------------------------------------------------------
-        
+
         integer(c_int) function TPTPointPotential ( Q, U, F, R, S ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the potential U and force F applied to an atom in position R and 
+        ! This function returns the potential U and force F applied to an atom in position R and
         ! produced by the segment S.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)                     :: Q, U
@@ -243,7 +243,7 @@ contains !**********************************************************************
                 F = 0.0d+00
                 if ( TPTCalcPointRange ( S, Xmin, Xmax, R ) == 0 ) return
                 X = - S%L / 2.0
-                do i = 0, S%NX - 1 
+                do i = 0, S%NX - 1
                         if ( X > Xmin .and. X < Xmax ) then
                                 QQ = 0.0d+00
                                 UU = 0.0d+00
@@ -264,7 +264,7 @@ contains !**********************************************************************
                                         Q = Q + 0.5d+00 * QQ
                                         U = U + 0.5d+00 * UU
                                         F = F + 0.5d+00 * FF
-                                else 
+                                else
                                         Q = Q + QQ
                                         U = U + UU
                                         F = F + FF
@@ -279,7 +279,7 @@ contains !**********************************************************************
         end function TPTPointPotential !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         integer(c_int) function TPTSectionPotential ( Q, U, F, M, S, i, Ssource ) !!!!!!!!!!!!!!!!!!
-        ! This function returns the potential U, force F and torque M produced by the segment Ssource 
+        ! This function returns the potential U, force F and torque M produced by the segment Ssource
         ! and applied to the i-th circular cross-section of the segment S.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)                     :: Q, U
@@ -290,7 +290,7 @@ contains !**********************************************************************
         integer(c_int)                                  :: j
         real(c_double), dimension(0:2)                  :: R, Fp, Mp, Lrad
         real(c_double)                                  :: Qp, Up, Eps
-        real(c_double)                                  :: Coeff 
+        real(c_double)                                  :: Coeff
         !-------------------------------------------------------------------------------------------
                 TPTSectionPotential = 0
                 Q = 0.0d+00
@@ -321,7 +321,7 @@ contains !**********************************************************************
         end function TPTSectionPotential !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
         integer(c_int) function TPTSegmentPotential ( Q, U, F, M, S, Ssource ) !!!!!!!!!!!!!!!!!!!!!!
-        ! This function returns the potential U, force F and torque M produced by the segment 
+        ! This function returns the potential U, force F and torque M produced by the segment
         ! Ssource and applied to the segment S.
         !-------------------------------------------------------------------------------------------
         real(c_double), intent(out)                     :: Q, U
@@ -340,7 +340,7 @@ contains !**********************************************************************
                          TPTSegmentPotential = 2
                         return
                 end if
-                do i = 0, S%NX - 1 
+                do i = 0, S%NX - 1
                         if ( TPTSectionPotential ( Qc, Uc, Fc, Mc, S, i, Ssource ) == 1 ) then
                                 if ( i == 0 .or. i == S%NX - 1 ) then
                                         Q = Q + 0.5d+00 * Qc
@@ -355,17 +355,17 @@ contains !**********************************************************************
                                 end if
                                 TPTSegmentPotential = 1
                         end if
-                end do           
+                end do
                 Q = Q * S%DX
                 U = U * S%DX
                 F = F * S%DX
                 M = M * S%DX
         end function TPTSegmentPotential !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
 !---------------------------------------------------------------------------------------------------
 ! Forces
 !---------------------------------------------------------------------------------------------------
-        
+
         subroutine TPTSegmentForces ( F1, F2, F, M, Laxis, L ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), dimension(0:2), intent(out)     :: F1, F2
         real(c_double), dimension(0:2), intent(in)      :: F, M, Laxis
@@ -376,10 +376,10 @@ contains !**********************************************************************
                 FF = 0.5d+00 * F
                 MM = M / L
                 call V3_V3xxV3 ( FFF, MM, Laxis )
-                F1 = FF - FFF 
-                F2 = FF + FFF 
+                F1 = FF - FFF
+                F2 = FF + FFF
         end subroutine TPTSegmentForces !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-        
+
         integer(c_int) function TPTInteractionF ( Q, U, F1_1, F1_2, F2_1, F2_2, R1_1, R1_2, R2_1, R2_2 )
         ! This function returns the potential and forces applied to the ends of segments.
         !-------------------------------------------------------------------------------------------
@@ -413,7 +413,7 @@ contains !**********************************************************************
 !---------------------------------------------------------------------------------------------------
 ! Initialization
 !---------------------------------------------------------------------------------------------------
-        
+
         subroutine TPTInit ( R1, R2, NX, NE ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         real(c_double), intent(in)      :: R1, R2
         integer(c_int), intent(in)   :: NX, NE
diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py
index 2f84e1aa6d..18fb3308df 100644
--- a/tools/coding_standard/whitespace.py
+++ b/tools/coding_standard/whitespace.py
@@ -51,6 +51,7 @@ patterns:
     - "*.py"
     - "*.rst"
     - "*.sh"
+    - "*.f90"
     - ".gitignore"
     - "README"
     - "requirements.txt"

From 9dd1dcab30f77c8cc528d92b8213b01a750a2894 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 25 Aug 2021 23:56:20 -0400
Subject: [PATCH 126/437] remove call to non-portable FDATE() function (a GNU
 Fortran extension)

---
 lib/mesont/TubePotMono.f90 | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lib/mesont/TubePotMono.f90 b/lib/mesont/TubePotMono.f90
index fc66d15c65..f59c810e4f 100644
--- a/lib/mesont/TubePotMono.f90
+++ b/lib/mesont/TubePotMono.f90
@@ -1674,8 +1674,7 @@ contains !**********************************************************************
                         read ( unit = TPMUnitID, fmt = '()' )
                 else
                         TPMUnitID = OpenFile ( TPMFile, 'wt', '' )
-                        call fdate( PDate )
-                        write ( unit = TPMUnitID, fmt = '(a,a)' ) 'DATE ', PDate
+                        write ( unit = TPMUnitID, fmt = '(a,a)' ) 'DATE (unknown)'
                         write ( unit = TPMUnitID, fmt = '(a,i3,a,i3,a)' ) &
                               'Tabulated data of the tubular potential for (', ChiIndM, ',', ChiIndN, ') CNTs'
                         write ( unit = TPMUnitID, fmt = '(a)' ) &

From f13fe138cc597a955473563657e3818a17a2cb2b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 00:35:31 -0400
Subject: [PATCH 127/437] apply clang-format

---
 tools/binary2txt.cpp | 138 ++++++++++++++++++++++---------------------
 1 file changed, 71 insertions(+), 67 deletions(-)

diff --git a/tools/binary2txt.cpp b/tools/binary2txt.cpp
index 58e2e36db0..8abaafd093 100644
--- a/tools/binary2txt.cpp
+++ b/tools/binary2txt.cpp
@@ -19,8 +19,8 @@
 // Syntax: binary2txt file1 file2 ...
 // Creates:           file1.txt file2.txt ...
 
-#include 
-#include 
+#include 
+#include 
 
 // these must match settings in src/lmptype.h which builds LAMMPS with
 //   -DLAMMPS_SMALLBIG (the default), -DLAMMPS_BIGBIG, or -DLAMMPS_SMALLSMALL
@@ -57,10 +57,10 @@ typedef int64_t bigint;
 
 int main(int narg, char **arg)
 {
-  int i,j,k,m,n;
-  bigint ntimestep,natoms;
-  int size_one,nchunk,triclinic;
-  double xlo,xhi,ylo,yhi,zlo,zhi,xy,xz,yz;
+  int i, j, k, m, n;
+  bigint ntimestep, natoms;
+  int size_one, nchunk, triclinic;
+  double xlo, xhi, ylo, yhi, zlo, zhi, xy, xz, yz;
   int boundary[3][2];
   char boundstr[9];
 
@@ -75,25 +75,25 @@ int main(int narg, char **arg)
   // loop over files
 
   for (int iarg = 1; iarg < narg; iarg++) {
-    printf("%s:",arg[iarg]);
+    printf("%s:", arg[iarg]);
     fflush(stdout);
-    FILE *fp = fopen(arg[iarg],"rb");
+    FILE *fp = fopen(arg[iarg], "rb");
     if (!fp) {
-      printf("ERROR: Could not open %s\n",arg[iarg]);
+      printf("ERROR: Could not open %s\n", arg[iarg]);
       return 1;
     }
 
     n = strlen(arg[iarg]) + 1 + 4;
     char *filetxt = new char[n];
-    strcpy(filetxt,arg[iarg]);
-    strcat(filetxt,".txt");
-    FILE *fptxt = fopen(filetxt,"w");
-    delete [] filetxt;
+    strcpy(filetxt, arg[iarg]);
+    strcat(filetxt, ".txt");
+    FILE *fptxt = fopen(filetxt, "w");
+    delete[] filetxt;
 
     // detect newer format
-    char * magic_string = nullptr;
-    char * columns = nullptr;
-    char * unit_style = nullptr;
+    char *magic_string = nullptr;
+    char *columns = nullptr;
+    char *unit_style = nullptr;
 
     // loop over snapshots in file
 
@@ -101,7 +101,7 @@ int main(int narg, char **arg)
       int endian = 0x0001;
       int revision = 0x0001;
 
-      fread(&ntimestep,sizeof(bigint),1,fp);
+      fread(&ntimestep, sizeof(bigint), 1, fp);
 
       // detect end-of-file
 
@@ -116,7 +116,7 @@ int main(int narg, char **arg)
         // first bigint encodes negative format name length
         bigint magic_string_len = -ntimestep;
 
-        delete [] magic_string;
+        delete[] magic_string;
         magic_string = new char[magic_string_len + 1];
         fread(magic_string, sizeof(char), magic_string_len, fp);
         magic_string[magic_string_len] = '\0';
@@ -128,24 +128,24 @@ int main(int narg, char **arg)
         fread(&revision, sizeof(int), 1, fp);
 
         // read the real ntimestep
-        fread(&ntimestep,sizeof(bigint),1,fp);
+        fread(&ntimestep, sizeof(bigint), 1, fp);
       }
 
-      fread(&natoms,sizeof(bigint),1,fp);
-      fread(&triclinic,sizeof(int),1,fp);
-      fread(&boundary[0][0],6*sizeof(int),1,fp);
-      fread(&xlo,sizeof(double),1,fp);
-      fread(&xhi,sizeof(double),1,fp);
-      fread(&ylo,sizeof(double),1,fp);
-      fread(&yhi,sizeof(double),1,fp);
-      fread(&zlo,sizeof(double),1,fp);
-      fread(&zhi,sizeof(double),1,fp);
+      fread(&natoms, sizeof(bigint), 1, fp);
+      fread(&triclinic, sizeof(int), 1, fp);
+      fread(&boundary[0][0], 6 * sizeof(int), 1, fp);
+      fread(&xlo, sizeof(double), 1, fp);
+      fread(&xhi, sizeof(double), 1, fp);
+      fread(&ylo, sizeof(double), 1, fp);
+      fread(&yhi, sizeof(double), 1, fp);
+      fread(&zlo, sizeof(double), 1, fp);
+      fread(&zhi, sizeof(double), 1, fp);
       if (triclinic) {
-        fread(&xy,sizeof(double),1,fp);
-        fread(&xz,sizeof(double),1,fp);
-        fread(&yz,sizeof(double),1,fp);
+        fread(&xy, sizeof(double), 1, fp);
+        fread(&xz, sizeof(double), 1, fp);
+        fread(&yz, sizeof(double), 1, fp);
       }
-      fread(&size_one,sizeof(int),1,fp);
+      fread(&size_one, sizeof(int), 1, fp);
 
       if (magic_string && revision > 0x0001) {
         // newer format includes units string, columns string
@@ -155,8 +155,8 @@ int main(int narg, char **arg)
 
         if (len > 0) {
           // has units
-          delete [] unit_style;
-          unit_style = new char[len+1];
+          delete[] unit_style;
+          unit_style = new char[len + 1];
           fread(unit_style, sizeof(char), len, fp);
           unit_style[len] = '\0';
           fprintf(fptxt, "ITEM: UNITS\n");
@@ -173,90 +173,94 @@ int main(int narg, char **arg)
         }
 
         fread(&len, sizeof(int), 1, fp);
-        delete [] columns;
-        columns = new char[len+1];
+        delete[] columns;
+        columns = new char[len + 1];
         fread(columns, sizeof(char), len, fp);
         columns[len] = '\0';
       }
 
-      fread(&nchunk,sizeof(int),1,fp);
+      fread(&nchunk, sizeof(int), 1, fp);
 
-      fprintf(fptxt,"ITEM: TIMESTEP\n");
-      fprintf(fptxt,BIGINT_FORMAT "\n",ntimestep);
-      fprintf(fptxt,"ITEM: NUMBER OF ATOMS\n");
-      fprintf(fptxt,BIGINT_FORMAT "\n",natoms);
+      fprintf(fptxt, "ITEM: TIMESTEP\n");
+      fprintf(fptxt, BIGINT_FORMAT "\n", ntimestep);
+      fprintf(fptxt, "ITEM: NUMBER OF ATOMS\n");
+      fprintf(fptxt, BIGINT_FORMAT "\n", natoms);
 
       m = 0;
       for (int idim = 0; idim < 3; idim++) {
         for (int iside = 0; iside < 2; iside++) {
-          if (boundary[idim][iside] == 0) boundstr[m++] = 'p';
-          else if (boundary[idim][iside] == 1) boundstr[m++] = 'f';
-          else if (boundary[idim][iside] == 2) boundstr[m++] = 's';
-          else if (boundary[idim][iside] == 3) boundstr[m++] = 'm';
+          if (boundary[idim][iside] == 0)
+            boundstr[m++] = 'p';
+          else if (boundary[idim][iside] == 1)
+            boundstr[m++] = 'f';
+          else if (boundary[idim][iside] == 2)
+            boundstr[m++] = 's';
+          else if (boundary[idim][iside] == 3)
+            boundstr[m++] = 'm';
         }
         boundstr[m++] = ' ';
       }
       boundstr[8] = '\0';
 
       if (!triclinic) {
-        fprintf(fptxt,"ITEM: BOX BOUNDS %s\n",boundstr);
-        fprintf(fptxt,"%-1.16e %-1.16e\n",xlo,xhi);
-        fprintf(fptxt,"%-1.16e %-1.16e\n",ylo,yhi);
-        fprintf(fptxt,"%-1.16e %-1.16e\n",zlo,zhi);
+        fprintf(fptxt, "ITEM: BOX BOUNDS %s\n", boundstr);
+        fprintf(fptxt, "%-1.16e %-1.16e\n", xlo, xhi);
+        fprintf(fptxt, "%-1.16e %-1.16e\n", ylo, yhi);
+        fprintf(fptxt, "%-1.16e %-1.16e\n", zlo, zhi);
       } else {
-        fprintf(fptxt,"ITEM: BOX BOUNDS xy xz yz %s\n",boundstr);
-        fprintf(fptxt,"%-1.16e %-1.16e %-1.16e\n",xlo,xhi,xy);
-        fprintf(fptxt,"%-1.16e %-1.16e %-1.16e\n",ylo,yhi,xz);
-        fprintf(fptxt,"%-1.16e %-1.16e %-1.16e\n",zlo,zhi,yz);
+        fprintf(fptxt, "ITEM: BOX BOUNDS xy xz yz %s\n", boundstr);
+        fprintf(fptxt, "%-1.16e %-1.16e %-1.16e\n", xlo, xhi, xy);
+        fprintf(fptxt, "%-1.16e %-1.16e %-1.16e\n", ylo, yhi, xz);
+        fprintf(fptxt, "%-1.16e %-1.16e %-1.16e\n", zlo, zhi, yz);
       }
 
       if (columns)
-        fprintf(fptxt,"ITEM: ATOMS %s\n", columns);
+        fprintf(fptxt, "ITEM: ATOMS %s\n", columns);
       else
-        fprintf(fptxt,"ITEM: ATOMS\n");
+        fprintf(fptxt, "ITEM: ATOMS\n");
 
       // loop over processor chunks in file
 
       for (i = 0; i < nchunk; i++) {
-        fread(&n,sizeof(int),1,fp);
+        fread(&n, sizeof(int), 1, fp);
 
         // extend buffer to fit chunk size
 
         if (n > maxbuf) {
-          if (buf) delete [] buf;
+          if (buf) delete[] buf;
           buf = new double[n];
           maxbuf = n;
         }
 
         // read chunk and write as size_one values per line
 
-        fread(buf,sizeof(double),n,fp);
+        fread(buf, sizeof(double), n, fp);
         n /= size_one;
         m = 0;
         for (j = 0; j < n; j++) {
           for (k = 0; k < size_one; k++) {
-            if(k+1 < size_one) {
-              fprintf(fptxt,"%g ",buf[m++]);
+            if (k + 1 < size_one) {
+              fprintf(fptxt, "%g ", buf[m++]);
             } else {
-              fprintf(fptxt,"%g",buf[m++]);
+              fprintf(fptxt, "%g", buf[m++]);
             }
           }
-          fprintf(fptxt,"\n");
+          fprintf(fptxt, "\n");
         }
       }
 
-      printf(" " BIGINT_FORMAT,ntimestep);
+      printf(" " BIGINT_FORMAT, ntimestep);
       fflush(stdout);
     }
     printf("\n");
-    delete [] columns;
-    delete [] magic_string;
-    delete [] unit_style;
+    delete[] columns;
+    delete[] magic_string;
+    delete[] unit_style;
     columns = nullptr;
     magic_string = nullptr;
     unit_style = nullptr;
   }
 
-  if (buf) delete [] buf;
+  if (buf) delete[] buf;
   return 0;
 }

From 4b707b868466015188742f7e5bccdaa95642fd1e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 00:35:43 -0400
Subject: [PATCH 128/437] small tweak

---
 tools/chain.f90 | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/tools/chain.f90 b/tools/chain.f90
index 1efb421cae..b5f258f607 100644
--- a/tools/chain.f90
+++ b/tools/chain.f90
@@ -56,12 +56,12 @@ PROGRAM chain
   INTEGER, ALLOCATABLE :: ntype(:),nbondtype(:)
   INTEGER, ALLOCATABLE :: atomtype(:),molecule(:)
   INTEGER, ALLOCATABLE :: imagex(:),imagey(:),imagez(:)
-  REAL(kind=8), ALLOCATABLE :: x(:),y(:),z(:)
-  REAL(kind=8), ALLOCATABLE :: bondlength(:),restrict(:)
+  REAL(KIND=8), ALLOCATABLE :: x(:),y(:),z(:)
+  REAL(KIND=8), ALLOCATABLE :: bondlength(:),restrict(:)
   INTEGER :: i, n, m, nmolecule, natoms, ntypes, nbonds, nbondtypes
   INTEGER :: swaptype, iseed, nsets, iset, ichain, imonomer
-  REAL(kind=8) :: r, rhostar, volume, rsq, xinner, yinner, zinner, xsurf, ysurf, zsurf
-  REAL(kind=8) :: x0, y0, z0, x1, y1, z1, x2, y2, z2, dx, dy, dz
+  REAL(KIND=8) :: r, rhostar, volume, rsq, xinner, yinner, zinner, xsurf, ysurf, zsurf
+  REAL(KIND=8) :: x0, y0, z0, x1, y1, z1, x2, y2, z2, dx, dy, dz
 
   LOGICAL :: again
 
@@ -299,7 +299,7 @@ PROGRAM chain
   ENDDO
 
   WRITE (6,*)
-  WRITE (6,*) 'Atoms'
+  WRITE (6,*) 'Atoms # molecular'
   WRITE (6,*)
 
   DO i = 1,natoms

From 0aded3931b16d79288c692851ea6938b9a58d3b8 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 00:36:03 -0400
Subject: [PATCH 129/437] convert to Fortran 2003

---
 tools/micelle2d.f   | 233 --------------------------------------------
 tools/micelle2d.f90 | 231 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 231 insertions(+), 233 deletions(-)
 delete mode 100644 tools/micelle2d.f
 create mode 100644 tools/micelle2d.f90

diff --git a/tools/micelle2d.f b/tools/micelle2d.f
deleted file mode 100644
index 7bc879fcf9..0000000000
--- a/tools/micelle2d.f
+++ /dev/null
@@ -1,233 +0,0 @@
-c Create LAMMPS 2003 input file for 2d LJ simulation of micelles
-c
-c Syntax: micelle2d < def.micelle2d > data.file
-c
-c def file contains size of system and number to turn into surfactants
-c attaches a random surfactant tail(s) to random head
-c if nonflag is set, will attach 2nd-neighbor bonds in surfactant
-c solvent atoms = type 1
-c micelle heads = type 2
-c micelle tails = type 3,4,5,etc.
-
-      program micelle2d
-      parameter (maxatom=100000,maxbond=10000)
-      real*4 x(2,maxatom)
-      integer type(maxatom),molecule(maxatom)
-      integer bondatom(2,maxbond),bondtype(maxbond)
-      common xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,
-     $     zboundlo,zboundhi
- 999  format (3i7,3f8.3)
- 998  format (4i7)
-
-      read (5,*)
-      read (5,*)
-      read (5,*) rhostar
-      read (5,*) iseed
-      read (5,*) nx,ny
-      read (5,*) nsurf
-      read (5,*) r0
-      read (5,*) ntails
-      read (5,*) nonflag
-      
-      natoms = nx*ny
-      if (natoms+nsurf*ntails.gt.maxatom) then
-        write (6,*) 'Too many atoms - boost maxatom'
-        call exit(0)
-      endif
-
-      nbonds = nsurf*ntails
-      if (nonflag.eq.1) nbonds = nbonds + nsurf*(ntails-1)
-      if (nbonds.gt.maxbond) then
-        write (6,*) 'Too many surfactants - boost maxbond'
-        call exit(0)
-      endif
-
-c box size
-
-      rlattice = (1.0/rhostar) ** 0.5
-
-      xboundlo = 0.0
-      xboundhi = nx*rlattice
-      yboundlo = 0.0
-      yboundhi = ny*rlattice
-      zboundlo = -0.1
-      zboundhi = 0.1
-      
-      sigma = 1.0
-
-      xprd = xboundhi - xboundlo
-      yprd = yboundhi - yboundlo
-      zprd = zboundhi - zboundlo
-
-c initial square lattice of solvents
-
-      m = 0
-      do j = 1,ny
-        do i = 1,nx
-          m = m + 1
-          x(1,m) = xboundlo + (i-1)*rlattice
-          x(2,m) = yboundlo + (j-1)*rlattice
-          molecule(m) = 0
-          type(m) = 1
-        enddo
-      enddo
-
-c turn some into surfactants with molecule ID
-c  head changes to type 2
-c  create ntails for each head of types 3,4,...
-c  each tail is at distance r0 away in straight line with random orientation
-
-      do i = 1,nsurf
-
- 10     m = random(iseed)*natoms + 1
-        if (m.gt.natoms) m = natoms
-        if (molecule(m) .ne. 0) goto 10
-
-        molecule(m) = i
-        type(m) = 2
-
-        angle = random(iseed)*2.0*3.1415926
-        do j = 1,ntails
-          k = (i-1)*ntails + j 
-          x(1,natoms+k) = x(1,m) + cos(angle)*j*r0*sigma
-          x(2,natoms+k) = x(2,m) + sin(angle)*j*r0*sigma
-          molecule(natoms+k) = i
-          type(natoms+k) = 2+j
-          call pbc(x(1,natoms+k),x(2,natoms+k))
-          if (j.eq.1) bondatom(1,k) = m
-          if (j.ne.1) bondatom(1,k) = natoms+k-1
-          bondatom(2,k) = natoms+k
-          bondtype(k) = 1
-        enddo
-
-      enddo
-
-c if nonflag is set, add (ntails-1) 2nd nearest neighbor bonds to end
-c   of bond list
-c k = location in bondatom list where nearest neighbor bonds for
-c     this surfactant are stored
-
-      if (nonflag.eq.1) then
-
-        nbonds = nsurf*ntails
-        do i = 1,nsurf
-          do j = 1,ntails-1
-            k = (i-1)*ntails + j
-            nbonds = nbonds + 1
-            bondatom(1,nbonds) = bondatom(1,k)
-            bondatom(2,nbonds) = bondatom(2,k+1)
-            bondtype(nbonds) = 2
-          enddo
-        enddo
-
-      endif
-
-c write LAMMPS data file
-
-      natoms = natoms + nsurf*ntails
-      nbonds = nsurf*ntails
-      if (nonflag.eq.1) nbonds = nbonds + nsurf*(ntails-1)
-      ntypes = 2 + ntails
-      nbondtypes = 1
-      if (nonflag.eq.1) nbondtypes = 2
-
-      if (nsurf.eq.0) then
-        ntypes = 1
-        nbondtypes = 0
-      endif
-
-      write (6,*) 'LAMMPS 2d micelle data file'
-      write (6,*)
-
-      write (6,*) natoms,' atoms'
-      write (6,*) nbonds,' bonds'
-      write (6,*) 0,' angles'
-      write (6,*) 0,' dihedrals'
-      write (6,*) 0,' impropers'
-      write (6,*)
-
-      write (6,*) ntypes,' atom types'
-      write (6,*) nbondtypes,' bond types'
-      write (6,*) 0,' angle types'
-      write (6,*) 0,' dihedral types'
-      write (6,*) 0,' improper types'
-      write (6,*)
-
-      write (6,*) xboundlo,xboundhi,' xlo xhi'
-      write (6,*) yboundlo,yboundhi,' ylo yhi'
-      write (6,*) zboundlo,zboundhi,' zlo zhi'
-
-      write (6,*)
-      write (6,*) 'Masses'
-      write (6,*)
-
-      do i = 1,ntypes
-        write (6,*) i,1.0
-      enddo
-
-      write (6,*)
-      write (6,*) 'Atoms'
-      write (6,*)
-
-      do i = 1,natoms
-        write (6,999) i,molecule(i),type(i),x(1,i),x(2,i),0.0
-      enddo
-
-      if (nsurf.gt.0) then
-
-        write (6,*)
-        write (6,*) 'Bonds'
-        write (6,*)
-
-        do i = 1,nbonds
-          write (6,998) i,bondtype(i),bondatom(1,i),bondatom(2,i)
-        enddo
-      
-      endif
-
-c write Xmovie bond geometry file
-
-      open(1,file='bond.micelle')
-
-      write (1,*) 'ITEM: BONDS'
-      do i = 1,nbonds
-        write (1,*) bondtype(i),bondatom(1,i),bondatom(2,i)
-      enddo
-
-      close(1)
-
-      end
-
-
-c ************
-c Subroutines
-c ************
-
-c periodic boundary conditions - map atom back into periodic box
-
-      subroutine pbc(x,y)
-      common xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,
-     $     zboundlo,zboundhi
-
-      if (x.lt.xboundlo) x = x + xprd
-      if (x.ge.xboundhi) x = x - xprd
-      if (y.lt.yboundlo) y = y + yprd
-      if (y.ge.yboundhi) y = y - yprd
-
-      return
-      end
-
-
-c RNG - compute in double precision, return single
-      
-      real*4 function random(iseed)
-      real*8 aa,mm,sseed
-      parameter (aa=16807.0D0,mm=2147483647.0D0)
-      
-      sseed = iseed
-      sseed = mod(aa*sseed,mm)
-      random = sseed/mm
-      iseed = sseed
-
-      return
-      end
diff --git a/tools/micelle2d.f90 b/tools/micelle2d.f90
new file mode 100644
index 0000000000..19d8e513c7
--- /dev/null
+++ b/tools/micelle2d.f90
@@ -0,0 +1,231 @@
+! Create LAMMPS data file for 2d LJ simulation of micelles
+!
+! Syntax: micelle2d < def.micelle2d > data.file
+!
+! def file contains size of system and number to turn into surfactants
+! attaches a random surfactant tail(s) to random head
+! if nonflag is set, will attach 2nd-neighbor bonds in surfactant
+! solvent atoms = type 1
+! micelle heads = type 2
+! micelle tails = type 3,4,5,etc.
+
+MODULE box
+  IMPLICIT NONE
+  PUBLIC
+  REAL(KIND=8) :: xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,zboundlo,zboundhi
+
+CONTAINS
+
+  ! periodic boundary conditions - map atom back into periodic box
+
+  SUBROUTINE pbc(x,y)
+    REAL(KIND=8), INTENT(inout) :: x,y
+
+    IF (x < xboundlo) x = x + xprd
+    IF (x >= xboundhi) x = x - xprd
+    IF (y < yboundlo) y = y + yprd
+    IF (y >= yboundhi) y = y - yprd
+
+  END SUBROUTINE pbc
+END MODULE box
+
+MODULE rng
+  IMPLICIT NONE
+
+CONTAINS
+
+  ! *very* minimal random number generator
+
+  REAL(KIND=8) FUNCTION random(iseed)
+    IMPLICIT NONE
+    INTEGER, INTENT(inout) :: iseed
+    REAL(KIND=8), PARAMETER :: aa=16807.0_8, mm=2147483647.0_8
+    REAL(KIND=8) :: sseed
+
+    sseed = REAL(iseed)
+    sseed = MOD(aa*sseed,mm)
+    random = sseed/mm
+    iseed = INT(sseed)
+  END FUNCTION random
+END MODULE rng
+
+PROGRAM micelle2d
+  USE box
+  USE rng
+  IMPLICIT NONE
+
+  REAL(kind=8), ALLOCATABLE :: x(:,:)
+  INTEGER, ALLOCATABLE :: atomtype(:), molecule(:)
+  INTEGER, ALLOCATABLE :: bondatom(:,:),bondtype(:)
+  INTEGER :: natoms, maxatom, ntypes, nbonds, nbondtypes, iseed
+  INTEGER :: i, j, k, m, nx, ny, nsurf, ntails, nonflag
+  REAL(kind=8) :: rhostar, rlattice, sigma, angle,r0
+  REAL(kind=8), parameter :: pi = 3.14159265358979323846_8
+  LOGICAL :: again
+
+  READ(5,*)
+  READ(5,*)
+  READ(5,*) rhostar
+  READ(5,*) iseed
+  READ(5,*) nx,ny
+  READ(5,*) nsurf
+  READ(5,*) r0
+  READ(5,*) ntails
+  READ(5,*) nonflag
+
+  natoms = nx*ny
+  maxatom = natoms + nsurf*ntails
+  ALLOCATE(x(2,maxatom), molecule(maxatom), atomtype(maxatom))
+
+  nbonds = nsurf*ntails
+  IF (nonflag.EQ.1) nbonds = nbonds + nsurf*(ntails-1)
+  ALLOCATE(bondatom(2,nbonds), bondtype(nbonds))
+
+! box size
+
+  rlattice = (1.0_8/rhostar) ** 0.5_8
+
+  xboundlo = 0.0_8
+  xboundhi = nx*rlattice
+  yboundlo = 0.0_8
+  yboundhi = ny*rlattice
+  zboundlo = -0.1_8
+  zboundhi = 0.1_8
+
+  sigma = 1.0_8
+
+  xprd = xboundhi - xboundlo
+  yprd = yboundhi - yboundlo
+  zprd = zboundhi - zboundlo
+
+! initial square lattice of solvents
+
+  m = 0
+  DO j = 1,ny
+      DO i = 1,nx
+          m = m + 1
+          x(1,m) = xboundlo + (i-1)*rlattice
+          x(2,m) = yboundlo + (j-1)*rlattice
+          molecule(m) = 0
+          atomtype(m) = 1
+      ENDDO
+  ENDDO
+
+! turn some into surfactants with molecule ID
+!  head changes to type 2
+!  create ntails for each head of types 3,4,...
+!  each tail is at distance r0 away in straight line with random orientation
+
+  DO i = 1,nsurf
+
+      again = .TRUE.
+      DO WHILE(again)
+          m = INT(random(iseed)*natoms + 1)
+          IF (m > natoms) m = natoms
+          IF (molecule(m) /= 0) CYCLE
+          again = .FALSE.
+      END DO
+      molecule(m) = i
+      atomtype(m) = 2
+
+      angle = random(iseed)*2.0_8*pi
+      DO j = 1,ntails
+          k = (i-1)*ntails + j
+          x(1,natoms+k) = x(1,m) + COS(angle)*j*r0*sigma
+          x(2,natoms+k) = x(2,m) + SIN(angle)*j*r0*sigma
+          molecule(natoms+k) = i
+          atomtype(natoms+k) = 2+j
+          CALL pbc(x(1,natoms+k),x(2,natoms+k))
+          IF (j == 1) bondatom(1,k) = m
+          IF (j /= 1) bondatom(1,k) = natoms+k-1
+          bondatom(2,k) = natoms+k
+          bondtype(k) = 1
+      ENDDO
+
+  ENDDO
+
+! if nonflag is set, add (ntails-1) 2nd nearest neighbor bonds to end
+!   of bond list
+! k = location in bondatom list where nearest neighbor bonds for
+!     this surfactant are stored
+
+  IF (nonflag == 1) THEN
+
+      nbonds = nsurf*ntails
+      DO i = 1,nsurf
+          DO j = 1,ntails-1
+              k = (i-1)*ntails + j
+              nbonds = nbonds + 1
+              bondatom(1,nbonds) = bondatom(1,k)
+              bondatom(2,nbonds) = bondatom(2,k+1)
+              bondtype(nbonds) = 2
+          ENDDO
+      ENDDO
+
+  ENDIF
+
+! write LAMMPS data file
+
+  natoms = natoms + nsurf*ntails
+  nbonds = nsurf*ntails
+  IF (nonflag == 1) nbonds = nbonds + nsurf*(ntails-1)
+  ntypes = 2 + ntails
+  nbondtypes = 1
+  IF (nonflag == 1) nbondtypes = 2
+
+  IF (nsurf == 0) THEN
+      ntypes = 1
+      nbondtypes = 0
+  ENDIF
+
+  WRITE (6,*) 'LAMMPS 2d micelle data file'
+  WRITE (6,*)
+
+  WRITE (6,*) natoms,' atoms'
+  WRITE (6,*) nbonds,' bonds'
+  WRITE (6,*) 0,' angles'
+  WRITE (6,*) 0,' dihedrals'
+  WRITE (6,*) 0,' impropers'
+  WRITE (6,*)
+
+  WRITE (6,*) ntypes,' atom types'
+  WRITE (6,*) nbondtypes,' bond types'
+  WRITE (6,*) 0,' angle types'
+  WRITE (6,*) 0,' dihedral types'
+  WRITE (6,*) 0,' improper types'
+  WRITE (6,*)
+
+  WRITE (6,*) xboundlo,xboundhi,' xlo xhi'
+  WRITE (6,*) yboundlo,yboundhi,' ylo yhi'
+  WRITE (6,*) zboundlo,zboundhi,' zlo zhi'
+
+  WRITE (6,*)
+  WRITE (6,*) 'Masses'
+  WRITE (6,*)
+
+  DO i = 1,ntypes
+      WRITE (6,*) i,1.0
+  ENDDO
+
+  WRITE (6,*)
+  WRITE (6,*) 'Atoms # molecular'
+  WRITE (6,*)
+
+  DO i = 1,natoms
+      WRITE (6,'(3I7,3F8.3)') i,molecule(i),atomtype(i),x(1,i),x(2,i),0.0
+  ENDDO
+
+  IF (nsurf > 0) THEN
+
+      WRITE (6,*)
+      WRITE (6,*) 'Bonds'
+      WRITE (6,*)
+
+      DO i = 1,nbonds
+          WRITE (6,'(4I7)') i,bondtype(i),bondatom(1,i),bondatom(2,i)
+      ENDDO
+
+  ENDIF
+
+  DEALLOCATE(x,molecule,atomtype,bondtype,bondatom)
+END PROGRAM micelle2d

From 2845269bdbea5dcdf2d396ed82df29d08537dd5a Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 01:00:08 -0400
Subject: [PATCH 130/437] use MBytes consistently

---
 doc/src/Build_diskspace.rst                 | 2 +-
 doc/src/fix_halt.rst                        | 4 ++--
 doc/src/fix_qtb.rst                         | 2 +-
 doc/utils/sphinx-config/false_positives.txt | 1 -
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/doc/src/Build_diskspace.rst b/doc/src/Build_diskspace.rst
index e7ff42902e..48ab21fd70 100644
--- a/doc/src/Build_diskspace.rst
+++ b/doc/src/Build_diskspace.rst
@@ -34,7 +34,7 @@ reduce the storage requirements. Here are some suggestions:
 
 - The folders containing the documentation tree (doc), the examples (examples) are not needed to build and
   run LAMMPS and can be safely deleted.  Some files in the potentials folder are large and may be deleted,
-  if not needed.  The largest of those files (occupying about 120 Mbyte combined) will only be downloaded on
+  if not needed.  The largest of those files (occupying about 120 MBytes combined) will only be downloaded on
   demand, when the corresponding package is installed.
 
 - When using the CMake build procedure, the compilation can be done on a (local) scratch storage that will not
diff --git a/doc/src/fix_halt.rst b/doc/src/fix_halt.rst
index d7f7f75515..46d5cd89bb 100644
--- a/doc/src/fix_halt.rst
+++ b/doc/src/fix_halt.rst
@@ -19,7 +19,7 @@ Syntax
 
        bondmax = length of longest bond in the system (in length units)
        tlimit = elapsed CPU time (in seconds)
-       diskfree = free disk space (in megabytes)
+       diskfree = free disk space (in MBytes)
        v_name = name of :doc:`equal-style variable `
 
 * operator = "<" or "<=" or ">" or ">=" or "==" or "!=" or "\|\^"
@@ -81,7 +81,7 @@ the timer frequently across a large number of processors may be
 non-negligible.
 
 The *diskfree* attribute will check for available disk space (in
-megabytes) on supported operating systems. By default it will
+MBytes) on supported operating systems. By default it will
 check the file system of the current working directory.  This
 can be changed with the optional *path* keyword, which will take
 the path to a file or folder on the file system to be checked
diff --git a/doc/src/fix_qtb.rst b/doc/src/fix_qtb.rst
index e6975748c4..c41a58a8f4 100644
--- a/doc/src/fix_qtb.rst
+++ b/doc/src/fix_qtb.rst
@@ -128,7 +128,7 @@ spectrum while consumes more memory.  With fixed *f_max* and
 :math:`\gamma`, *N_f* should be big enough to converge the classical
 temperature :math:`T^{cl}` as a function of target quantum bath
 temperature. Memory usage per processor could be from 10 to 100
-Mbytes.
+MBytes.
 
 .. note::
 
diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index 62f58f3ef5..7e3886e2fd 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -1891,7 +1891,6 @@ maxX
 Mayergoyz
 Mayoral
 mbt
-Mbytes
 MBytes
 mc
 McLachlan

From 484f2f4c95e980bb80dc694e32204bedc0656332 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 01:05:14 -0400
Subject: [PATCH 131/437] must exclude two more folders from whitespace
 checking

---
 tools/coding_standard/whitespace.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py
index 2f84e1aa6d..ab7e9bbf6c 100644
--- a/tools/coding_standard/whitespace.py
+++ b/tools/coding_standard/whitespace.py
@@ -34,6 +34,7 @@ exclude:
     - lib/hdnnp
     - lib/kim
     - lib/kokkos
+    - lib/latte
     - lib/machdyn
     - lib/mdi
     - lib/mscg
@@ -41,6 +42,7 @@ exclude:
     - lib/plumed
     - lib/quip
     - lib/scafacos
+    - lib/voronoi
     - src/Make.sh
 patterns:
     - "*.c"

From 1d33bd1264b0ab46f6d585bcd62827dffeb133c2 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 01:05:25 -0400
Subject: [PATCH 132/437] whitespace

---
 doc/src/Intro_features.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst
index 337acbe6ce..2b0409b007 100644
--- a/doc/src/Intro_features.rst
+++ b/doc/src/Intro_features.rst
@@ -83,7 +83,7 @@ commands)
 * charge equilibration (QEq via dynamic, point, shielded, Slater methods)
 * coarse-grained potentials: DPD, GayBerne, REsquared, colloidal, DLVO
 * mesoscopic potentials: granular, Peridynamics, SPH, mesoscopic tubular potential (MESONT)
-* semi-empirical potentials: multi-ion generalized pseudopotential theory (MGPT), second moment tight binding + QEq (SMTB-Q), density functional tight-binding (LATTE) 
+* semi-empirical potentials: multi-ion generalized pseudopotential theory (MGPT), second moment tight binding + QEq (SMTB-Q), density functional tight-binding (LATTE)
 * electron force field (eFF, AWPMD)
 * bond potentials: harmonic, FENE, Morse, nonlinear, class 2, quartic (breakable), tabulated
 * angle potentials: harmonic, CHARMM, cosine, cosine/squared, cosine/periodic, class 2 (COMPASS), tabulated

From 49a81d6fbab74b6a02fc3d58772f6af1aef76d0c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 06:30:16 -0400
Subject: [PATCH 133/437] silence compiler warnings

---
 lib/gpu/geryon/ocl_timer.h | 1 -
 lib/gpu/geryon/ucl_d_vec.h | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/lib/gpu/geryon/ocl_timer.h b/lib/gpu/geryon/ocl_timer.h
index ca74312d51..71efe2d2c0 100644
--- a/lib/gpu/geryon/ocl_timer.h
+++ b/lib/gpu/geryon/ocl_timer.h
@@ -139,7 +139,6 @@ class UCL_Timer {
   cl_event start_event, stop_event;
   cl_command_queue _cq;
   double _total_time;
-  double t_factor;
   bool _initialized;
   bool has_measured_time;
 };
diff --git a/lib/gpu/geryon/ucl_d_vec.h b/lib/gpu/geryon/ucl_d_vec.h
index e791f18f29..6c10568f86 100644
--- a/lib/gpu/geryon/ucl_d_vec.h
+++ b/lib/gpu/geryon/ucl_d_vec.h
@@ -39,7 +39,7 @@ class UCL_D_Vec : public UCL_BaseMat {
   };
   typedef numtyp data_type;
 
- UCL_D_Vec() : _cols(0), _row_bytes(0) {}
+ UCL_D_Vec() : _row_bytes(0), _cols(0) {}
   ~UCL_D_Vec() { _device_free(*this); }
 
   /// Construct with n columns

From e20d66ac19b56f6cbad2efcac788687a8a2aaf4b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 06:36:17 -0400
Subject: [PATCH 134/437] avoid module name conflict

---
 tools/chain.f90     | 12 ++++++------
 tools/micelle2d.f90 | 12 ++++++------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/tools/chain.f90 b/tools/chain.f90
index b5f258f607..5fed083e63 100644
--- a/tools/chain.f90
+++ b/tools/chain.f90
@@ -5,7 +5,7 @@
 !   data.file is output file that will be input for LAMMPS
 ! includes image flags in data file so chains can be unraveled later
 
-MODULE box
+MODULE boxchain
   IMPLICIT NONE
   PUBLIC
   REAL(KIND=8) :: xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,zboundlo,zboundhi
@@ -25,9 +25,9 @@ CONTAINS
     IF (z >= zboundhi) z = z - zprd
 
   END SUBROUTINE pbc
-END MODULE box
+END MODULE boxchain
 
-MODULE rng
+MODULE rngchain
   IMPLICIT NONE
 
 CONTAINS
@@ -45,11 +45,11 @@ CONTAINS
     random = sseed/mm
     iseed = INT(sseed)
   END FUNCTION random
-END MODULE rng
+END MODULE rngchain
 
 PROGRAM chain
-  USE box
-  USE rng
+  USE boxchain
+  USE rngchain
   IMPLICIT NONE
 
   INTEGER, ALLOCATABLE :: nchain(:),nmonomer(:)
diff --git a/tools/micelle2d.f90 b/tools/micelle2d.f90
index 19d8e513c7..a7a6b20568 100644
--- a/tools/micelle2d.f90
+++ b/tools/micelle2d.f90
@@ -9,7 +9,7 @@
 ! micelle heads = type 2
 ! micelle tails = type 3,4,5,etc.
 
-MODULE box
+MODULE boxmicelle
   IMPLICIT NONE
   PUBLIC
   REAL(KIND=8) :: xprd,yprd,zprd,xboundlo,xboundhi,yboundlo,yboundhi,zboundlo,zboundhi
@@ -27,9 +27,9 @@ CONTAINS
     IF (y >= yboundhi) y = y - yprd
 
   END SUBROUTINE pbc
-END MODULE box
+END MODULE boxmicelle
 
-MODULE rng
+MODULE rngmicelle
   IMPLICIT NONE
 
 CONTAINS
@@ -47,11 +47,11 @@ CONTAINS
     random = sseed/mm
     iseed = INT(sseed)
   END FUNCTION random
-END MODULE rng
+END MODULE rngmicelle
 
 PROGRAM micelle2d
-  USE box
-  USE rng
+  USE boxmicelle
+  USE rngmicelle
   IMPLICIT NONE
 
   REAL(kind=8), ALLOCATABLE :: x(:,:)

From 84896fc7d4c320cc2d9c531474b3cd15fa38484e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 06:36:27 -0400
Subject: [PATCH 135/437] add building micelle2d.x

---
 cmake/Modules/Tools.cmake | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/cmake/Modules/Tools.cmake b/cmake/Modules/Tools.cmake
index 40d3048dcc..146764dbd5 100644
--- a/cmake/Modules/Tools.cmake
+++ b/cmake/Modules/Tools.cmake
@@ -11,12 +11,14 @@ if(BUILD_TOOLS)
       enable_language(Fortran)
       add_executable(chain.x ${LAMMPS_TOOLS_DIR}/chain.f90)
       target_link_libraries(chain.x PRIVATE ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
-      install(TARGETS chain.x DESTINATION ${CMAKE_INSTALL_BINDIR})
+      add_executable(micelle2d.x ${LAMMPS_TOOLS_DIR}/micelle2d.f90)
+      target_link_libraries(micelle2d.x PRIVATE ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
+      install(TARGETS chain.x micelle2d.x DESTINATION ${CMAKE_INSTALL_BINDIR})
     else()
-      message(WARNING "No suitable Fortran compiler found, skipping build of 'chain.x'")
+      message(WARNING "No suitable Fortran compiler found, skipping build of 'chain.x' and 'micelle2d.x'")
     endif()
   else()
-    message(WARNING "CMake build doesn't support fortran, skipping build of 'chain.x'")
+    message(WARNING "CMake build doesn't support Fortran, skipping build of 'chain.x' and 'micelle2d.x'")
   endif()
 
   enable_language(C)

From a7f4bbffcfc60fdf25a25e2c9f6c039622aa58dd Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 07:10:47 -0400
Subject: [PATCH 136/437] avoid segfault when trying to apply (strict) pbc or
 convert to/from fractional coordinates on an MPI rank without atoms

---
 src/OPENMP/domain_omp.cpp | 10 +++++++---
 src/domain.cpp            |  3 ++-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/OPENMP/domain_omp.cpp b/src/OPENMP/domain_omp.cpp
index 94a0b094a7..dffb58e2da 100644
--- a/src/OPENMP/domain_omp.cpp
+++ b/src/OPENMP/domain_omp.cpp
@@ -37,6 +37,9 @@ typedef struct { double x,y,z; } dbl3_t;
 
 void DomainOMP::pbc()
 {
+  const int nlocal = atom->nlocal;
+  if (!nlocal) return;
+
   dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
   dbl3_t * _noalias const v = (dbl3_t *)&atom->v[0][0];
   const double * _noalias const lo     = (triclinic == 0) ? boxlo : boxlo_lamda;
@@ -44,7 +47,6 @@ void DomainOMP::pbc()
   const double * _noalias const period = (triclinic == 0) ? prd   : prd_lamda;
   const int * _noalias const mask  = atom->mask;
   imageint    * _noalias const image = atom->image;
-  const int nlocal = atom->nlocal;
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
@@ -141,8 +143,9 @@ void DomainOMP::pbc()
 
 void DomainOMP::lamda2x(int n)
 {
-  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
   const int num = n;
+  if (!n) return;
+  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
@@ -161,8 +164,9 @@ void DomainOMP::lamda2x(int n)
 
 void DomainOMP::x2lamda(int n)
 {
-  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
   const int num = n;
+  if (!n) return;
+  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
diff --git a/src/domain.cpp b/src/domain.cpp
index 7df82fbfb3..958c3f09db 100644
--- a/src/domain.cpp
+++ b/src/domain.cpp
@@ -528,10 +528,11 @@ void Domain::reset_box()
 
 void Domain::pbc()
 {
+  int nlocal = atom->nlocal;
+  if (!nlocal) return;
   int i;
   imageint idim,otherdims;
   double *lo,*hi,*period;
-  int nlocal = atom->nlocal;
   double **x = atom->x;
   double **v = atom->v;
   int *mask = atom->mask;

From 0d8c58db0205d933788942431bd63b0968c078b0 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 07:41:57 -0400
Subject: [PATCH 137/437] synchronize DomainOMP::pbc() code with Domain::pbc()

---
 src/OPENMP/domain_omp.cpp | 60 ++++++++++++++++++++++++---------------
 src/domain.cpp            |  2 +-
 2 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/src/OPENMP/domain_omp.cpp b/src/OPENMP/domain_omp.cpp
index dffb58e2da..40be2f997a 100644
--- a/src/OPENMP/domain_omp.cpp
+++ b/src/OPENMP/domain_omp.cpp
@@ -1,4 +1,3 @@
-// clang-format off
 /* ----------------------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
@@ -16,13 +15,16 @@
    Contributing author : Axel Kohlmeyer (Temple U)
 ------------------------------------------------------------------------- */
 
-#include "omp_compat.h"
 #include "accelerator_omp.h"
 #include "atom.h"
+#include "error.h"
+#include "omp_compat.h"
 
 using namespace LAMMPS_NS;
 
-typedef struct { double x,y,z; } dbl3_t;
+typedef struct {
+  double x, y, z;
+} dbl3_t;
 
 /* ----------------------------------------------------------------------
    enforce PBC and modify box image flags for each atom
@@ -40,19 +42,32 @@ void DomainOMP::pbc()
   const int nlocal = atom->nlocal;
   if (!nlocal) return;
 
-  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
-  dbl3_t * _noalias const v = (dbl3_t *)&atom->v[0][0];
-  const double * _noalias const lo     = (triclinic == 0) ? boxlo : boxlo_lamda;
-  const double * _noalias const hi     = (triclinic == 0) ? boxhi : boxhi_lamda;
-  const double * _noalias const period = (triclinic == 0) ? prd   : prd_lamda;
-  const int * _noalias const mask  = atom->mask;
-  imageint    * _noalias const image = atom->image;
+  // verify owned atoms have valid numerical coords
+  // may not if computed pairwise force between 2 atoms at same location
+
+  const double *_noalias const coord = &atom->x[0][0];
+  const int n3 = 3 * nlocal;
+  int flag = 0;
+#if defined(_OPENMP)    // clang-format off
+#pragma omp parallel for LMP_DEFAULT_NONE schedule(static) reduction(+:flag)
+#endif    // clang-format on
+  for (int i = 0; i < n3; i++)
+    if (!std::isfinite(coord[i])) flag = 1;
+  if (flag) error->one(FLERR, "Non-numeric atom coords - simulation unstable");
+
+  dbl3_t *_noalias const x = (dbl3_t *) &atom->x[0][0];
+  dbl3_t *_noalias const v = (dbl3_t *) &atom->v[0][0];
+  const double *_noalias const lo = (triclinic == 0) ? boxlo : boxlo_lamda;
+  const double *_noalias const hi = (triclinic == 0) ? boxhi : boxhi_lamda;
+  const double *_noalias const period = (triclinic == 0) ? prd : prd_lamda;
+  const int *_noalias const mask = atom->mask;
+  imageint *_noalias const image = atom->image;
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
 #endif
   for (int i = 0; i < nlocal; i++) {
-    imageint idim,otherdims;
+    imageint idim, otherdims;
 
     if (xperiodic) {
       if (x[i].x < lo[0]) {
@@ -66,7 +81,7 @@ void DomainOMP::pbc()
       }
       if (x[i].x >= hi[0]) {
         x[i].x -= period[0];
-        x[i].x = MAX(x[i].x,lo[0]);
+        x[i].x = MAX(x[i].x, lo[0]);
         if (deform_vremap && mask[i] & deform_groupbit) v[i].x -= h_rate[0];
         idim = image[i] & IMGMASK;
         otherdims = image[i] ^ idim;
@@ -91,7 +106,7 @@ void DomainOMP::pbc()
       }
       if (x[i].y >= hi[1]) {
         x[i].y -= period[1];
-        x[i].y = MAX(x[i].y,lo[1]);
+        x[i].y = MAX(x[i].y, lo[1]);
         if (deform_vremap && mask[i] & deform_groupbit) {
           v[i].x -= h_rate[5];
           v[i].y -= h_rate[1];
@@ -120,7 +135,7 @@ void DomainOMP::pbc()
       }
       if (x[i].z >= hi[2]) {
         x[i].z -= period[2];
-        x[i].z = MAX(x[i].z,lo[2]);
+        x[i].z = MAX(x[i].z, lo[2]);
         if (deform_vremap && mask[i] & deform_groupbit) {
           v[i].x -= h_rate[4];
           v[i].y -= h_rate[3];
@@ -145,15 +160,15 @@ void DomainOMP::lamda2x(int n)
 {
   const int num = n;
   if (!n) return;
-  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
+  dbl3_t *_noalias const x = (dbl3_t *) &atom->x[0][0];
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
 #endif
   for (int i = 0; i < num; i++) {
-    x[i].x = h[0]*x[i].x + h[5]*x[i].y + h[4]*x[i].z + boxlo[0];
-    x[i].y = h[1]*x[i].y + h[3]*x[i].z + boxlo[1];
-    x[i].z = h[2]*x[i].z + boxlo[2];
+    x[i].x = h[0] * x[i].x + h[5] * x[i].y + h[4] * x[i].z + boxlo[0];
+    x[i].y = h[1] * x[i].y + h[3] * x[i].z + boxlo[1];
+    x[i].z = h[2] * x[i].z + boxlo[2];
   }
 }
 
@@ -166,7 +181,7 @@ void DomainOMP::x2lamda(int n)
 {
   const int num = n;
   if (!n) return;
-  dbl3_t * _noalias const x = (dbl3_t *)&atom->x[0][0];
+  dbl3_t *_noalias const x = (dbl3_t *) &atom->x[0][0];
 
 #if defined(_OPENMP)
 #pragma omp parallel for LMP_DEFAULT_NONE schedule(static)
@@ -176,9 +191,8 @@ void DomainOMP::x2lamda(int n)
     double delta1 = x[i].y - boxlo[1];
     double delta2 = x[i].z - boxlo[2];
 
-    x[i].x = h_inv[0]*delta0 + h_inv[5]*delta1 + h_inv[4]*delta2;
-    x[i].y = h_inv[1]*delta1 + h_inv[3]*delta2;
-    x[i].z = h_inv[2]*delta2;
+    x[i].x = h_inv[0] * delta0 + h_inv[5] * delta1 + h_inv[4] * delta2;
+    x[i].y = h_inv[1] * delta1 + h_inv[3] * delta2;
+    x[i].z = h_inv[2] * delta2;
   }
 }
-
diff --git a/src/domain.cpp b/src/domain.cpp
index 958c3f09db..daaf41338f 100644
--- a/src/domain.cpp
+++ b/src/domain.cpp
@@ -543,7 +543,7 @@ void Domain::pbc()
 
   double *coord;
   int n3 = 3*nlocal;
-  coord = &x[0][0];  // note: x is always initialized to at least one element.
+  coord = &x[0][0];
   int flag = 0;
   for (i = 0; i < n3; i++)
     if (!std::isfinite(*coord++)) flag = 1;

From 45854bab0cc471f090348ee4e8daabebc2fd4139 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 07:46:24 -0400
Subject: [PATCH 138/437] step version strings for next patch release

---
 doc/lammps.1  | 2 +-
 src/version.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/lammps.1 b/doc/lammps.1
index a111f7e092..e7b9ef8e6b 100644
--- a/doc/lammps.1
+++ b/doc/lammps.1
@@ -1,4 +1,4 @@
-.TH LAMMPS "30 July 2021" "2021-07-30"
+.TH LAMMPS "27 August 2021" "2021-08-27"
 .SH NAME
 .B LAMMPS
 \- Molecular Dynamics Simulator.
diff --git a/src/version.h b/src/version.h
index a48d6f1873..7d355757eb 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "30 Jul 2021"
+#define LAMMPS_VERSION "27 Aug 2021"

From 7e5782a81b2e0e51a92d1adaf3683100ece6ed4a Mon Sep 17 00:00:00 2001
From: Stan Gerald Moore 
Date: Thu, 26 Aug 2021 08:21:16 -0600
Subject: [PATCH 139/437] Fix deallocation issue in
 pair_lj_charmm_coul_charmm_kokkos

---
 src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
index 66064d58b2..982ec9d99e 100644
--- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
+++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp
@@ -69,7 +69,7 @@ PairLJCharmmCoulCharmmKokkos::~PairLJCharmmCoulCharmmKokkos()
   if (allocated) {
     memoryKK->destroy_kokkos(k_eatom,eatom);
     memoryKK->destroy_kokkos(k_vatom,vatom);
-    k_cutsq = DAT::tdual_ffloat_2d();
+    memoryKK->destroy_kokkos(k_cutsq,cutsq);
   }
 }
 

From 0e8facdcbbc69ada65fa51c4aa3a835f1a924a2a Mon Sep 17 00:00:00 2001
From: Stan Gerald Moore 
Date: Thu, 26 Aug 2021 08:58:58 -0600
Subject: [PATCH 140/437] Makefile.kokkos: fix (standard_in) 1: syntax error
 (kokkos PR4173)

---
 lib/kokkos/Makefile.kokkos | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos
index 013d2b3ede..2a984eefb6 100644
--- a/lib/kokkos/Makefile.kokkos
+++ b/lib/kokkos/Makefile.kokkos
@@ -406,8 +406,8 @@ KOKKOS_INTERNAL_USE_ISA_POWERPCBE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POW
 KOKKOS_INTERNAL_USE_TM            := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_SKX))
 
 # Incompatible flags?
-KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1" | bc ))
-KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1" | bc))
+KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc )
+KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1") | bc)
 
 ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MULTIHOST), 1)
   $(error Defined Multiple Host architectures: KOKKOS_ARCH=$(KOKKOS_ARCH) )

From be98d0bbd95a67400c5900504fc585a1b6e69811 Mon Sep 17 00:00:00 2001
From: Stan Gerald Moore 
Date: Thu, 26 Aug 2021 09:36:16 -0600
Subject: [PATCH 141/437] Fix memory issue in fix_nvt_sllod_kokkos

---
 src/KOKKOS/fix_nvt_sllod_kokkos.cpp |  7 ++++---
 src/KOKKOS/fix_nvt_sllod_kokkos.h   | 19 +++++++++++--------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp
index d0af72f17f..5ba0e6b666 100644
--- a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp
+++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp
@@ -65,8 +65,6 @@ void FixNVTSllodKokkos::init()
 {
   FixNHKokkos::init();
 
-  vdelu = typename ArrayTypes::t_v_array("nvt/sllod/kk:vdelu", atomKK->nlocal);
-
   if (!this->temperature->tempbias)
     this->error->all(FLERR,"Temperature for fix nvt/sllod does not have a bias");
 
@@ -100,7 +98,7 @@ void FixNVTSllodKokkos::nh_v_temp()
   //   calculate temperature since some computes require temp
   //   computed on current nlocal atoms to remove bias
 
-  if (nondeformbias){
+  if (nondeformbias) {
     atomKK->sync(this->temperature->execution_space,this->temperature->datamask_read);
     this->temperature->compute_scalar();
     atomKK->modified(this->temperature->execution_space,this->temperature->datamask_modify);
@@ -115,6 +113,9 @@ void FixNVTSllodKokkos::nh_v_temp()
 
   d_h_two = Few(h_two);
 
+  if (vdelu.extent(0) < atomKK->nmax)
+    vdelu = typename AT::t_v_array(Kokkos::NoInit("nvt/sllod/kk:vdelu"), atomKK->nmax);
+
   this->copymode = 1;
   Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this);
   this->copymode = 0;
diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.h b/src/KOKKOS/fix_nvt_sllod_kokkos.h
index 6057ce44d0..84e57ab2c3 100644
--- a/src/KOKKOS/fix_nvt_sllod_kokkos.h
+++ b/src/KOKKOS/fix_nvt_sllod_kokkos.h
@@ -35,6 +35,9 @@ struct TagFixNVTSllod_temp2{};
 template
 class FixNVTSllodKokkos : public FixNHKokkos {
  public:
+  typedef DeviceType device_type;
+  typedef ArrayTypes AT;
+
   FixNVTSllodKokkos(class LAMMPS *, int, char **);
   ~FixNVTSllodKokkos() {}
   void init();
@@ -51,14 +54,14 @@ class FixNVTSllodKokkos : public FixNHKokkos {
   void nh_v_temp();
 
  protected:
-  typename ArrayTypes::t_x_array x;
-  typename ArrayTypes::t_v_array v;
-  typename ArrayTypes::t_v_array vdelu;
-  typename ArrayTypes::t_f_array_const f;
-  typename ArrayTypes::t_float_1d rmass;
-  typename ArrayTypes::t_float_1d mass;
-  typename ArrayTypes::t_int_1d type;
-  typename ArrayTypes::t_int_1d mask;
+  typename AT::t_x_array x;
+  typename AT::t_v_array v;
+  typename AT::t_v_array vdelu;
+  typename AT::t_f_array_const f;
+  typename AT::t_float_1d rmass;
+  typename AT::t_float_1d mass;
+  typename AT::t_int_1d type;
+  typename AT::t_int_1d mask;
 
   Few d_h_two;
 

From 0fb03072b161fc09ee5b6710a38727561c34f505 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 10:08:34 -0600
Subject: [PATCH 142/437] restart bug fix in new fix ttm/grid

---
 src/EXTRA-FIX/fix_ttm_grid.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 4e7b06c668..a02b5291a1 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -593,10 +593,12 @@ void FixTTMGrid::restart(char *buf)
       for (ix = nxlo_in; ix <= nxhi_in; ix++) {
         iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
         T_electron[iz][iy][ix] = rlist[n+iglobal];
-        if (ix == 0 && iy == 0 & iz == 0)
-          printf("READRESTART 000 n+iglobal %d %d value %g\n",n,iglobal,
-                 T_electron[ix][iy][iz]);
       }
+
+  // communicate new T_electron values to ghost grid points
+
+  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
+                   gc_buf1,gc_buf2,MPI_DOUBLE);
 }
 
 /* ----------------------------------------------------------------------

From cbe27096b37ef9eaa47f125f9a7c7253fc899a1c Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 10:19:22 -0600
Subject: [PATCH 143/437] final tweaks

---
 src/EXTRA-FIX/fix_ttm.cpp      | 2 +-
 src/EXTRA-FIX/fix_ttm_grid.cpp | 4 +---
 src/EXTRA-FIX/fix_ttm_mod.cpp  | 1 -
 3 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index db7142e66b..edc481726b 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -45,7 +45,7 @@ using namespace FixConst;
 // use SHIFT = 0.0 for now since it allows fix ave/chunk 
 //   to spatially average consistent with the TTM grid
 
-#define OFFSET 0      // change to 16384 when done debugging vs ttm/old
+#define OFFSET 16384
 #define SHIFT 0.0
 
 /* ---------------------------------------------------------------------- */
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index a02b5291a1..06ebe418b1 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -38,9 +38,7 @@ using namespace FixConst;
 static constexpr int MAXLINE = 256;
 static constexpr int CHUNK = 1024;
 
-//#define OFFSET 16384
-
-#define OFFSET 0
+#define OFFSET 16384
 
 /* ---------------------------------------------------------------------- */
 
diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 7603d70a8a..8c5178159d 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -304,7 +304,6 @@ void FixTTMMod::post_force(int /*vflag*/)
 
   for (int i = 0; i < nlocal; i++) {
     if (mask[i] & groupbit) {
-
       double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
       double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
       double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;

From beffa0d1a1aad45daad7cebf42248fce40a84168 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 10:19:56 -0600
Subject: [PATCH 144/437] remove old fix ttm

---
 src/EXTRA-FIX/fix_ttm_old.cpp | 705 ----------------------------------
 src/EXTRA-FIX/fix_ttm_old.h   | 155 --------
 2 files changed, 860 deletions(-)
 delete mode 100644 src/EXTRA-FIX/fix_ttm_old.cpp
 delete mode 100644 src/EXTRA-FIX/fix_ttm_old.h

diff --git a/src/EXTRA-FIX/fix_ttm_old.cpp b/src/EXTRA-FIX/fix_ttm_old.cpp
deleted file mode 100644
index 43d1b7f3f6..0000000000
--- a/src/EXTRA-FIX/fix_ttm_old.cpp
+++ /dev/null
@@ -1,705 +0,0 @@
-// clang-format off
-/* ----------------------------------------------------------------------
-   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
-   https://www.lammps.org/, 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 authors: Paul Crozier (SNL)
-                         Carolyn Phillips (University of Michigan)
-------------------------------------------------------------------------- */
-
-#include "fix_ttm_old.h"
-
-#include 
-#include 
-#include "atom.h"
-#include "force.h"
-#include "update.h"
-#include "domain.h"
-#include "respa.h"
-#include "comm.h"
-#include "random_mars.h"
-#include "memory.h"
-#include "error.h"
-
-
-#include "tokenizer.h"
-
-using namespace LAMMPS_NS;
-using namespace FixConst;
-
-#define MAXLINE 1024
-
-/* ---------------------------------------------------------------------- */
-
-FixTTMOld::FixTTMOld(LAMMPS *lmp, int narg, char **arg) :
-  Fix(lmp, narg, arg),
-  random(nullptr), fp(nullptr), nsum(nullptr), nsum_all(nullptr),
-  gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), flangevin(nullptr),
-  T_electron(nullptr), T_electron_old(nullptr), sum_vsq(nullptr), sum_mass_vsq(nullptr),
-  sum_vsq_all(nullptr), sum_mass_vsq_all(nullptr), net_energy_transfer(nullptr),
-  net_energy_transfer_all(nullptr)
-{
-  if (narg < 15) error->all(FLERR,"Illegal fix ttm command");
-
-  vector_flag = 1;
-  size_vector = 2;
-  global_freq = 1;
-  extvector = 1;
-  nevery = 1;
-  restart_peratom = 1;
-  restart_global = 1;
-
-  seed = utils::inumeric(FLERR,arg[3],false,lmp);
-  electronic_specific_heat = utils::numeric(FLERR,arg[4],false,lmp);
-  electronic_density = utils::numeric(FLERR,arg[5],false,lmp);
-  electronic_thermal_conductivity = utils::numeric(FLERR,arg[6],false,lmp);
-  gamma_p = utils::numeric(FLERR,arg[7],false,lmp);
-  gamma_s = utils::numeric(FLERR,arg[8],false,lmp);
-  v_0 = utils::numeric(FLERR,arg[9],false,lmp);
-  nxnodes = utils::inumeric(FLERR,arg[10],false,lmp);
-  nynodes = utils::inumeric(FLERR,arg[11],false,lmp);
-  nznodes = utils::inumeric(FLERR,arg[12],false,lmp);
-  nfileevery = utils::inumeric(FLERR,arg[14],false,lmp);
-
-  if (nfileevery) {
-    if (narg != 16) error->all(FLERR,"Illegal fix ttm command");
-    if (comm->me == 0) {
-      fp = fopen(arg[15],"w");
-      if (fp == nullptr)
-        error->one(FLERR,"Cannot open output file {}: {}",
-                                     arg[15], utils::getsyserror());
-    }
-  }
-
-  // error check
-
-  if (seed <= 0)
-    error->all(FLERR,"Invalid random number seed in fix ttm command");
-  if (electronic_specific_heat <= 0.0)
-    error->all(FLERR,"Fix ttm electronic_specific_heat must be > 0.0");
-  if (electronic_density <= 0.0)
-    error->all(FLERR,"Fix ttm electronic_density must be > 0.0");
-  if (electronic_thermal_conductivity < 0.0)
-    error->all(FLERR,"Fix ttm electronic_thermal_conductivity must be >= 0.0");
-  if (gamma_p <= 0.0) error->all(FLERR,"Fix ttm gamma_p must be > 0.0");
-  if (gamma_s < 0.0) error->all(FLERR,"Fix ttm gamma_s must be >= 0.0");
-  if (v_0 < 0.0) error->all(FLERR,"Fix ttm v_0 must be >= 0.0");
-  if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0)
-    error->all(FLERR,"Fix ttm number of nodes must be > 0");
-
-  v_0_sq = v_0*v_0;
-
-  // initialize Marsaglia RNG with processor-unique seed
-
-  random = new RanMars(lmp,seed + comm->me);
-
-  // allocate per-type arrays for force prefactors
-
-  gfactor1 = new double[atom->ntypes+1];
-  gfactor2 = new double[atom->ntypes+1];
-
-  // allocate 3d grid variables
-  // check for allowed maxium number of total grid nodes
-
-  total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes;
-  if (total_nnodes > MAXSMALLINT)
-    error->all(FLERR,"Too many nodes in fix ttm");
-
-  memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum");
-  memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all");
-  memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq");
-  memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq");
-  memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all");
-  memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes,
-                 "ttm:sum_mass_vsq_all");
-  memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm:T_electron_old");
-  memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm:T_electron");
-  memory->create(net_energy_transfer,nxnodes,nynodes,nznodes,
-                 "TTM:net_energy_transfer");
-  memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes,
-                 "TTM:net_energy_transfer_all");
-
-  flangevin = nullptr;
-  grow_arrays(atom->nmax);
-
-  // zero out the flangevin array
-
-  for (int i = 0; i < atom->nmax; i++) {
-    flangevin[i][0] = 0;
-    flangevin[i][1] = 0;
-    flangevin[i][2] = 0;
-  }
-
-  atom->add_callback(Atom::GROW);
-  atom->add_callback(Atom::RESTART);
-
-  // set initial electron temperatures from user input file
-
-  if (comm->me == 0) read_initial_electron_temperatures(arg[13]);
-  MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world);
-}
-
-/* ---------------------------------------------------------------------- */
-
-FixTTMOld::~FixTTMOld()
-{
-  if (fp) fclose(fp);
-
-  delete random;
-
-  delete [] gfactor1;
-  delete [] gfactor2;
-
-  memory->destroy(nsum);
-  memory->destroy(nsum_all);
-  memory->destroy(sum_vsq);
-  memory->destroy(sum_mass_vsq);
-  memory->destroy(sum_vsq_all);
-  memory->destroy(sum_mass_vsq_all);
-  memory->destroy(T_electron_old);
-  memory->destroy(T_electron);
-  memory->destroy(flangevin);
-  memory->destroy(net_energy_transfer);
-  memory->destroy(net_energy_transfer_all);
-}
-
-/* ---------------------------------------------------------------------- */
-
-int FixTTMOld::setmask()
-{
-  int mask = 0;
-  mask |= POST_FORCE;
-  mask |= POST_FORCE_RESPA;
-  mask |= END_OF_STEP;
-  return mask;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::init()
-{
-  if (domain->dimension == 2)
-    error->all(FLERR,"Cannot use fix ttm with 2d simulation");
-  if (domain->nonperiodic != 0)
-    error->all(FLERR,"Cannot use non-periodic boundares with fix ttm");
-  if (domain->triclinic)
-    error->all(FLERR,"Cannot use fix ttm with triclinic box");
-
-  // set force prefactors
-
-  for (int i = 1; i <= atom->ntypes; i++) {
-    gfactor1[i] = - gamma_p / force->ftm2v;
-    gfactor2[i] =
-      sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v;
-  }
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        net_energy_transfer_all[ixnode][iynode][iznode] = 0;
-
-  if (utils::strmatch(update->integrate_style,"^respa"))
-    nlevels_respa = ((Respa *) update->integrate)->nlevels;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::setup(int vflag)
-{
-  if (utils::strmatch(update->integrate_style,"^verlet")) {
-    post_force_setup(vflag);
-  } else {
-    ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1);
-    post_force_respa_setup(vflag,nlevels_respa-1,0);
-    ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::post_force(int /*vflag*/)
-{
-  double **x = atom->x;
-  double **v = atom->v;
-  double **f = atom->f;
-  int *type = atom->type;
-  int *mask = atom->mask;
-  int nlocal = atom->nlocal;
-
-  double gamma1,gamma2;
-
-  // apply damping and thermostat to all atoms in fix group
-
-  for (int i = 0; i < nlocal; i++) {
-    if (mask[i] & groupbit) {
-
-      double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-      double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-      double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes);
-      int iynode = static_cast(yscale*nynodes);
-      int iznode = static_cast(zscale*nznodes);
-      while (ixnode > nxnodes-1) ixnode -= nxnodes;
-      while (iynode > nynodes-1) iynode -= nynodes;
-      while (iznode > nznodes-1) iznode -= nznodes;
-      while (ixnode < 0) ixnode += nxnodes;
-      while (iynode < 0) iynode += nynodes;
-      while (iznode < 0) iznode += nznodes;
-
-      if (T_electron[ixnode][iynode][iznode] < 0)
-        error->all(FLERR,"Electronic temperature dropped below zero");
-
-      double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]);
-
-      gamma1 = gfactor1[type[i]];
-      double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
-      if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p;
-      gamma2 = gfactor2[type[i]] * tsqrt;
-
-      flangevin[i][0] = gamma1*v[i][0] + gamma2*(random->uniform()-0.5);
-      flangevin[i][1] = gamma1*v[i][1] + gamma2*(random->uniform()-0.5);
-      flangevin[i][2] = gamma1*v[i][2] + gamma2*(random->uniform()-0.5);
-
-      f[i][0] += flangevin[i][0];
-      f[i][1] += flangevin[i][1];
-      f[i][2] += flangevin[i][2];
-    }
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::post_force_setup(int /*vflag*/)
-{
-  double **f = atom->f;
-  int *mask = atom->mask;
-  int nlocal = atom->nlocal;
-
-  // apply langevin forces that have been stored from previous run
-
-  for (int i = 0; i < nlocal; i++) {
-    if (mask[i] & groupbit) {
-      f[i][0] += flangevin[i][0];
-      f[i][1] += flangevin[i][1];
-      f[i][2] += flangevin[i][2];
-    }
-  }
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::post_force_respa(int vflag, int ilevel, int /*iloop*/)
-{
-  if (ilevel == nlevels_respa-1) post_force(vflag);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::post_force_respa_setup(int vflag, int ilevel, int /*iloop*/)
-{
-  if (ilevel == nlevels_respa-1) post_force_setup(vflag);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::reset_dt()
-{
-  for (int i = 1; i <= atom->ntypes; i++)
-    gfactor2[i] =
-      sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v;
-}
-
-/* ----------------------------------------------------------------------
-   read in initial electron temperatures from a user-specified file
-   only called by proc 0
-------------------------------------------------------------------------- */
-
-void FixTTMOld::read_initial_electron_temperatures(const char *filename)
-{
-  int ***T_initial_set;
-  memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set");
-  memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int));
-
-  std::string name = utils::get_potential_file_path(filename);
-  if (name.empty())
-    error->one(FLERR,"Cannot open input file: {}",
-                                 filename);
-  FILE *fpr = fopen(name.c_str(),"r");
-
-  // read initial electron temperature values from file
-
-  char line[MAXLINE];
-  int ixnode,iynode,iznode;
-  double T_tmp;
-  while (1) {
-    if (fgets(line,MAXLINE,fpr) == nullptr) break;
-    ValueTokenizer values(line);
-    if (values.has_next()) ixnode = values.next_int();
-    if (values.has_next()) iynode = values.next_int();
-    if (values.has_next()) iznode = values.next_int();
-    if (values.has_next()) T_tmp  = values.next_double();
-    else error->one(FLERR,"Incorrect format in fix ttm input file");
-
-    // check correctness of input data
-
-    if ((ixnode < 0) || (ixnode >= nxnodes)
-        || (iynode < 0) || (iynode >= nynodes)
-        || (iznode < 0) || (iznode >= nznodes))
-      error->one(FLERR,"Fix ttm invalide node index in fix ttm input");
-
-    if (T_tmp < 0.0)
-      error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
-
-    T_electron[ixnode][iynode][iznode] = T_tmp;
-    T_initial_set[ixnode][iynode][iznode] = 1;
-  }
-  fclose(fpr);
-
-  // check completeness of input data
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        if (T_initial_set[ixnode][iynode][iznode] == 0)
-          error->one(FLERR,"Initial temperatures not all set in fix ttm");
-
-  memory->destroy(T_initial_set);
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::end_of_step()
-{
-  double **x = atom->x;
-  double **v = atom->v;
-  double *mass = atom->mass;
-  double *rmass = atom->rmass;
-  int *type = atom->type;
-  int *mask = atom->mask;
-  int nlocal = atom->nlocal;
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        net_energy_transfer[ixnode][iynode][iznode] = 0;
-
-  for (int i = 0; i < nlocal; i++)
-    if (mask[i] & groupbit) {
-      double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-      double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-      double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes);
-      int iynode = static_cast(yscale*nynodes);
-      int iznode = static_cast(zscale*nznodes);
-      while (ixnode > nxnodes-1) ixnode -= nxnodes;
-      while (iynode > nynodes-1) iynode -= nynodes;
-      while (iznode > nznodes-1) iznode -= nznodes;
-      while (ixnode < 0) ixnode += nxnodes;
-      while (iynode < 0) iynode += nynodes;
-      while (iznode < 0) iznode += nznodes;
-      net_energy_transfer[ixnode][iynode][iznode] +=
-        (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
-         flangevin[i][2]*v[i][2]);
-    }
-
-  MPI_Allreduce(&net_energy_transfer[0][0][0],
-                &net_energy_transfer_all[0][0][0],
-                total_nnodes,MPI_DOUBLE,MPI_SUM,world);
-
-  double dx = domain->xprd/nxnodes;
-  double dy = domain->yprd/nynodes;
-  double dz = domain->zprd/nznodes;
-  double del_vol = dx*dy*dz;
-
-  // num_inner_timesteps = # of inner steps (thermal solves)
-  // required this MD step to maintain a stable explicit solve
-
-  int num_inner_timesteps = 1;
-  double inner_dt = update->dt;
-  double stability_criterion = 1.0 -
-    2.0*inner_dt/(electronic_specific_heat*electronic_density) *
-    (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz));
-  if (stability_criterion < 0.0) {
-    inner_dt = 0.5*(electronic_specific_heat*electronic_density) /
-      (electronic_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz));
-    num_inner_timesteps = static_cast(update->dt/inner_dt) + 1;
-    inner_dt = update->dt/double(num_inner_timesteps);
-    if (num_inner_timesteps > 1000000)
-      error->warning(FLERR,"Too many inner timesteps in fix ttm");
-  }
-
-  for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps;
-       ith_inner_timestep++) {
-
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++)
-          T_electron_old[ixnode][iynode][iznode] =
-            T_electron[ixnode][iynode][iznode];
-
-    // compute new electron T profile
-
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++) {
-          int right_xnode = ixnode + 1;
-          int right_ynode = iynode + 1;
-          int right_znode = iznode + 1;
-          if (right_xnode == nxnodes) right_xnode = 0;
-          if (right_ynode == nynodes) right_ynode = 0;
-          if (right_znode == nznodes) right_znode = 0;
-          int left_xnode = ixnode - 1;
-          int left_ynode = iynode - 1;
-          int left_znode = iznode - 1;
-          if (left_xnode == -1) left_xnode = nxnodes - 1;
-          if (left_ynode == -1) left_ynode = nynodes - 1;
-          if (left_znode == -1) left_znode = nznodes - 1;
-          T_electron[ixnode][iynode][iznode] =
-            T_electron_old[ixnode][iynode][iznode] +
-            inner_dt/(electronic_specific_heat*electronic_density) *
-            (electronic_thermal_conductivity *
-             ((T_electron_old[right_xnode][iynode][iznode] +
-               T_electron_old[left_xnode][iynode][iznode] -
-               2*T_electron_old[ixnode][iynode][iznode])/dx/dx +
-              (T_electron_old[ixnode][right_ynode][iznode] +
-               T_electron_old[ixnode][left_ynode][iznode] -
-               2*T_electron_old[ixnode][iynode][iznode])/dy/dy +
-              (T_electron_old[ixnode][iynode][right_znode] +
-               T_electron_old[ixnode][iynode][left_znode] -
-               2*T_electron_old[ixnode][iynode][iznode])/dz/dz) -
-             (net_energy_transfer_all[ixnode][iynode][iznode])/del_vol);
-        }
-  }
-
-  // output nodal temperatures for current timestep
-
-  if ((nfileevery) && !(update->ntimestep % nfileevery)) {
-
-    // compute atomic Ta for each grid point
-
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++) {
-          nsum[ixnode][iynode][iznode] = 0;
-          nsum_all[ixnode][iynode][iznode] = 0;
-          sum_vsq[ixnode][iynode][iznode] = 0.0;
-          sum_mass_vsq[ixnode][iynode][iznode] = 0.0;
-          sum_vsq_all[ixnode][iynode][iznode] = 0.0;
-          sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0;
-        }
-
-    double massone;
-    for (int i = 0; i < nlocal; i++)
-      if (mask[i] & groupbit) {
-        if (rmass) massone = rmass[i];
-        else massone = mass[type[i]];
-        double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
-        double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
-        double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-        int ixnode = static_cast(xscale*nxnodes);
-        int iynode = static_cast(yscale*nynodes);
-        int iznode = static_cast(zscale*nznodes);
-        while (ixnode > nxnodes-1) ixnode -= nxnodes;
-        while (iynode > nynodes-1) iynode -= nynodes;
-        while (iznode > nznodes-1) iznode -= nznodes;
-        while (ixnode < 0) ixnode += nxnodes;
-        while (iynode < 0) iynode += nynodes;
-        while (iznode < 0) iznode += nznodes;
-        double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
-        nsum[ixnode][iynode][iznode] += 1;
-        sum_vsq[ixnode][iynode][iznode] += vsq;
-        sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq;
-      }
-
-    MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes,
-                  MPI_INT,MPI_SUM,world);
-    MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes,
-                  MPI_DOUBLE,MPI_SUM,world);
-    MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0],
-                  total_nnodes,MPI_DOUBLE,MPI_SUM,world);
-
-    if (comm->me == 0) {
-      fmt::print(fp,"{}",update->ntimestep);
-
-      double T_a;
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++) {
-            T_a = 0;
-            if (nsum_all[ixnode][iynode][iznode] > 0)
-              T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/
-                (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e);
-            fmt::print(fp," {}",T_a);
-          }
-
-      fputs("\t",fp);
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++)
-            fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]);
-      fputs("\n",fp);
-    }
-  }
-}
-
-/* ----------------------------------------------------------------------
-   memory usage of 3d grid
-------------------------------------------------------------------------- */
-
-double FixTTMOld::memory_usage()
-{
-  double bytes = 0.0;
-  bytes += (double)5*total_nnodes * sizeof(int);
-  bytes += (double)14*total_nnodes * sizeof(double);
-  return bytes;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void FixTTMOld::grow_arrays(int ngrow)
-{
-
- memory->grow(flangevin,ngrow,3,"TTM:flangevin");
-
-}
-
-/* ----------------------------------------------------------------------
-   return the energy of the electronic subsystem or the net_energy transfer
-   between the subsystems
-------------------------------------------------------------------------- */
-
-double FixTTMOld::compute_vector(int n)
-{
-  double e_energy = 0.0;
-  double transfer_energy = 0.0;
-
-  double dx = domain->xprd/nxnodes;
-  double dy = domain->yprd/nynodes;
-  double dz = domain->zprd/nznodes;
-  double del_vol = dx*dy*dz;
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++) {
-        e_energy +=
-          T_electron[ixnode][iynode][iznode]*electronic_specific_heat*
-          electronic_density*del_vol;
-        transfer_energy +=
-          net_energy_transfer_all[ixnode][iynode][iznode]*update->dt;
-      }
-
-  if (n == 0) return e_energy;
-  if (n == 1) return transfer_energy;
-  return 0.0;
-}
-
-/* ----------------------------------------------------------------------
-   pack entire state of Fix into one write
-------------------------------------------------------------------------- */
-
-void FixTTMOld::write_restart(FILE *fp)
-{
-  double *rlist;
-  memory->create(rlist,nxnodes*nynodes*nznodes+1,"TTM:rlist");
-
-  int n = 0;
-  rlist[n++] = seed;
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        rlist[n++] =  T_electron[ixnode][iynode][iznode];
-
-  if (comm->me == 0) {
-    int size = n * sizeof(double);
-    fwrite(&size,sizeof(int),1,fp);
-    fwrite(rlist,sizeof(double),n,fp);
-  }
-
-  memory->destroy(rlist);
-}
-
-/* ----------------------------------------------------------------------
-   use state info from restart file to restart the Fix
-------------------------------------------------------------------------- */
-
-void FixTTMOld::restart(char *buf)
-{
-  int n = 0;
-  double *rlist = (double *) buf;
-
-  // the seed must be changed from the initial seed
-
-  seed = static_cast (rlist[n++]) + 1;
-  //seed = static_cast (0.5*rlist[n++]);
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        T_electron[ixnode][iynode][iznode] = rlist[n++];
-
-  delete random;
-  random = new RanMars(lmp,seed+comm->me);
-}
-
-/* ----------------------------------------------------------------------
-   pack values in local atom-based arrays for restart file
-------------------------------------------------------------------------- */
-
-int FixTTMOld::pack_restart(int i, double *buf)
-{
-  // pack buf[0] this way because other fixes unpack it
-  buf[0] = 4;
-  buf[1] = flangevin[i][0];
-  buf[2] = flangevin[i][1];
-  buf[3] = flangevin[i][2];
-  return 4;
-}
-
-/* ----------------------------------------------------------------------
-   unpack values from atom->extra array to restart the fix
-------------------------------------------------------------------------- */
-
-void FixTTMOld::unpack_restart(int nlocal, int nth)
-{
-  double **extra = atom->extra;
-
-  // skip to Nth set of extra values
-  // unpack the Nth first values this way because other fixes pack them
-
-  int m = 0;
-  for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]);
-  m++;
-
-  flangevin[nlocal][0] = extra[nlocal][m++];
-  flangevin[nlocal][1] = extra[nlocal][m++];
-  flangevin[nlocal][2] = extra[nlocal][m++];
-}
-
-/* ----------------------------------------------------------------------
-   maxsize of any atom's restart data
-------------------------------------------------------------------------- */
-
-int FixTTMOld::maxsize_restart()
-{
-  return 4;
-}
-
-/* ----------------------------------------------------------------------
-   size of atom nlocal's restart data
-------------------------------------------------------------------------- */
-
-int FixTTMOld::size_restart(int /*nlocal*/)
-{
-  return 4;
-}
diff --git a/src/EXTRA-FIX/fix_ttm_old.h b/src/EXTRA-FIX/fix_ttm_old.h
deleted file mode 100644
index 078e7d4cb7..0000000000
--- a/src/EXTRA-FIX/fix_ttm_old.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- c++ -*- ----------------------------------------------------------
-   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
-   https://www.lammps.org/, 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.
-------------------------------------------------------------------------- */
-
-#ifdef FIX_CLASS
-// clang-format off
-FixStyle(ttm/old,FixTTMOld);
-// clang-format on
-#else
-
-#ifndef LMP_FIX_TTM_OLD_H
-#define LMP_FIX_TTM_OLD_H
-
-#include "fix.h"
-
-namespace LAMMPS_NS {
-
-class FixTTMOld : public Fix {
- public:
-  FixTTMOld(class LAMMPS *, int, char **);
-  ~FixTTMOld();
-  int setmask();
-  void init();
-  void setup(int);
-  void post_force(int);
-  void post_force_respa(int, int, int);
-  void post_force_setup(int);
-  void post_force_respa_setup(int, int, int);
-  void end_of_step();
-  void reset_dt();
-  void write_restart(FILE *);
-  void restart(char *);
-  int pack_restart(int, double *);
-  void unpack_restart(int, int);
-  int size_restart(int);
-  int maxsize_restart();
-  double memory_usage();
-  void grow_arrays(int);
-  double compute_vector(int);
-
- private:
-  int nfileevery;
-  int nlevels_respa;
-  int seed;
-  class RanMars *random;
-  FILE *fp;
-  int nxnodes, nynodes, nznodes;
-  bigint total_nnodes;
-  int ***nsum, ***nsum_all;
-  double *gfactor1, *gfactor2, *ratio, **flangevin;
-  double ***T_electron, ***T_electron_old;
-  double ***sum_vsq, ***sum_mass_vsq;
-  double ***sum_vsq_all, ***sum_mass_vsq_all;
-  double ***net_energy_transfer, ***net_energy_transfer_all;
-  double electronic_specific_heat, electronic_density;
-  double electronic_thermal_conductivity;
-  double gamma_p, gamma_s, v_0, v_0_sq;
-
-  void read_initial_electron_temperatures(const char *);
-};
-
-}    // namespace LAMMPS_NS
-
-#endif
-#endif
-
-/* ERROR/WARNING messages:
-
-E: Illegal ... command
-
-Self-explanatory.  Check the input script syntax and compare to the
-documentation for the command.  You can use -echo screen as a
-command-line option when running LAMMPS to see the offending line.
-
-E: Cannot open file %s
-
-The specified file cannot be opened.  Check that the path and name are
-correct. If the file is a compressed file, also check that the gzip
-executable can be found and run.
-
-E: Cannot open fix ttm file %s
-
-The output file for the fix ttm command cannot be opened.  Check that
-the path and name are correct.
-
-E: Invalid random number seed in fix ttm command
-
-Random number seed must be > 0.
-
-E: Fix ttm electronic_specific_heat must be > 0.0
-
-Self-explanatory.
-
-E: Fix ttm electronic_density must be > 0.0
-
-Self-explanatory.
-
-E: Fix ttm electronic_thermal_conductivity must be >= 0.0
-
-Self-explanatory.
-
-E: Fix ttm gamma_p must be > 0.0
-
-Self-explanatory.
-
-E: Fix ttm gamma_s must be >= 0.0
-
-Self-explanatory.
-
-E: Fix ttm v_0 must be >= 0.0
-
-Self-explanatory.
-
-E: Fix ttm number of nodes must be > 0
-
-Self-explanatory.
-
-E: Cannot use fix ttm with 2d simulation
-
-This is a current restriction of this fix due to the grid it creates.
-
-E: Cannot use non-periodic boundares with fix ttm
-
-This fix requires a fully periodic simulation box.
-
-E: Cannot use fix ttm with triclinic box
-
-This is a current restriction of this fix due to the grid it creates.
-
-E: Electronic temperature dropped below zero
-
-Something has gone wrong with the fix ttm electron temperature model.
-
-E: Fix ttm electron temperatures must be > 0.0
-
-Self-explanatory.
-
-E: Initial temperatures not all set in fix ttm
-
-Self-explanatory.
-
-W: Too many inner timesteps in fix ttm
-
-Self-explanatory.
-
-*/

From d38549e05fcb6577af834dcdb4098529f3e25e65 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Thu, 26 Aug 2021 11:03:57 -0600
Subject: [PATCH 145/437] Update ancient Kokkos Arch in
 Makefile.kokkos_cuda_mpi

---
 src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi
index 3971cc6c06..c6071cf747 100644
--- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi
+++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi
@@ -23,7 +23,7 @@ ARCHIVE =	ar
 ARFLAGS =	-rc
 SHLIBFLAGS =	-shared
 KOKKOS_DEVICES = Cuda
-KOKKOS_ARCH = Kepler35
+KOKKOS_ARCH = Volta70
 
 # ---------------------------------------------------------------------
 # LAMMPS-specific settings, all OPTIONAL

From 7b3e7d3d3a201ff2f18b25007a932b2c6201f4cd Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 11:52:07 -0600
Subject: [PATCH 146/437] allow for command-line setting of initial temp

---
 doc/src/fix_ttm.rst                     |  240 +-
 doc/src/rerun.rst                       |   30 +-
 doc/src/velocity.rst                    |   28 +-
 examples/README                         |    1 +
 examples/ttm/FeVoter-ChenRecheck.fs     | 4606 +++++++++++++++++++++++
 examples/ttm/in.ttm                     |   42 +
 examples/ttm/in.ttm.grid                |   42 +
 examples/ttm/log.26Aug21.ttm.g++.1      |  118 +
 examples/ttm/log.26Aug21.ttm.g++.4      |  118 +
 examples/ttm/log.26Aug21.ttm.grid.g++.1 |  118 +
 examples/ttm/log.26Aug21.ttm.grid.g++.4 |  118 +
 examples/ttm/pot_iron.mod               |    2 +
 src/EXTRA-FIX/fix_ttm.cpp               |   21 +-
 src/EXTRA-FIX/fix_ttm.h                 |    2 +-
 src/EXTRA-FIX/fix_ttm_grid.cpp          |    8 +-
 src/EXTRA-FIX/fix_ttm_mod.cpp           |   19 +-
 16 files changed, 5379 insertions(+), 134 deletions(-)
 create mode 100644 examples/ttm/FeVoter-ChenRecheck.fs
 create mode 100644 examples/ttm/in.ttm
 create mode 100644 examples/ttm/in.ttm.grid
 create mode 100644 examples/ttm/log.26Aug21.ttm.g++.1
 create mode 100644 examples/ttm/log.26Aug21.ttm.g++.4
 create mode 100644 examples/ttm/log.26Aug21.ttm.grid.g++.1
 create mode 100644 examples/ttm/log.26Aug21.ttm.grid.g++.4
 create mode 100644 examples/ttm/pot_iron.mod

diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index ee416304c4..184324fa1a 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -4,6 +4,9 @@
 fix ttm command
 ===============
 
+fix ttm/grid command
+===============
+
 fix ttm/mod command
 ===================
 
@@ -12,13 +15,13 @@ Syntax
 
 .. parsed-literal::
 
-   fix ID group-ID ttm seed C_e rho_e kappa_e gamma_p gamma_s v_0 Nx Ny Nz T_infile N T_outfile
-   fix ID group-ID ttm/mod seed init_file Nx Ny Nz T_infile N T_outfile
+   fix ID group-ID ttm seed C_e rho_e kappa_e gamma_p gamma_s v_0 Nx Ny Nz keyword value ... 
+   fix ID group-ID ttm/mod seed init_file Nx Ny Nz keyword value ...
 
 * ID, group-ID are documented in :doc:`fix ` command
-* style = *ttm* or *ttm_mod*
+* style = *ttm* or *ttm/grid* or *ttm/mod*
 * seed = random number seed to use for white noise (positive integer)
-* remaining arguments for fix ttm:
+* remaining arguments for fix ttm or fix ttm/grid
 
   .. parsed-literal::
 
@@ -31,9 +34,6 @@ Syntax
        Nx = number of thermal solve grid points in the x-direction (positive integer)
        Ny = number of thermal solve grid points in the y-direction (positive integer)
        Nz = number of thermal solve grid points in the z-direction (positive integer)
-       T_infile = filename to read initial electronic temperature from
-       N = dump TTM temperatures every this many timesteps, 0 = no dump
-       T_outfile = filename to write TTM temperatures to (only needed if N > 0)
 
 * remaining arguments for fix ttm/mod:
 
@@ -43,18 +43,29 @@ Syntax
        Nx = number of thermal solve grid points in the x-direction (positive integer)
        Ny = number of thermal solve grid points in the y-direction (positive integer)
        Nz = number of thermal solve grid points in the z-direction (positive integer)
-       T_infile = filename to read initial electronic temperature from
-       N = dump TTM temperatures every this many timesteps, 0 = no dump
-       T_outfile = filename to write TTM temperatures to (only needed if N > 0)
+
+* zero or more keyword/value(s) pairs may be appended
+* keyword = *set* or *infile" or *outfile"
+
+  .. parsed-literal::
+
+       *set* value = Tinit
+         Tinit = initial electronic temperature at all grid points (temperature units)
+       *infile* value = file.in with grid values for electronic temperatures
+       *outfile* values = Nout file.out
+         Nout = dump grid temperatures every this many timesteps
+         file.out = filename to write grid temperatures to
 
 Examples
 """"""""
 
 .. code-block:: LAMMPS
 
-   fix 2 all ttm 699489 1.0 1.0 10 0.1 0.0 2.0 1 12 1 initialTs 1000 T.out
-   fix 2 all ttm 123456 1.0 1.0 1.0 1.0 1.0 5.0 5 5 5 Te.in 1 Te.out
-   fix 2 all ttm/mod 34277 parameters.txt 5 5 5 T_init 10 T_out
+   fix 2 all ttm 699489 1.0 1.0 10 0.1 0.0 2.0 1 12 1 infile initial outfile 1000 T.out
+   fix 3 all ttm/grid 123456 1.0 1.0 1.0 1.0 1.0 5.0 5 5 5 infile Te.in
+   fix 4 all ttm/mod 34277 parameters.txt 5 5 5 infile T_init outfile 10 T_out
+
+Example input scripts using these commands can be found in examples/ttm.
 
 Description
 """""""""""
@@ -62,36 +73,48 @@ Description
 Use a two-temperature model (TTM) to represent heat transfer through
 and between electronic and atomic subsystems.  LAMMPS models the
 atomic subsystem as usual with a molecular dynamics model and the
-classical force field specified by the user, but the electronic
-subsystem is modeled as a continuum, or a background "gas", on a
-regular grid.  Energy can be transferred spatially within the grid
-representing the electrons.  Energy can also be transferred between
-the electronic and the atomic subsystems.  The algorithm underlying
-this fix was derived by D. M.  Duffy and A. M. Rutherford and is
-discussed in two J Physics: Condensed Matter papers: :ref:`(Duffy) `
-and :ref:`(Rutherford) `.  They used this algorithm in cascade
-simulations where a primary knock-on atom (PKA) was initialized with a
-high velocity to simulate a radiation event.
+classical force field specified by the user.  The electronic subsystem
+is modeled as a continuum, or a background "gas", on a regular grid
+which overlays the simulation domain.  Energy can be transferred
+spatially within the grid representing the electrons.  Energy can also
+be transferred between the electronic and atomic subsystems.  The
+algorithm underlying this fix was derived by D. M.  Duffy
+and A. M. Rutherford and is discussed in two J Physics: Condensed
+Matter papers: :ref:`(Duffy) ` and :ref:`(Rutherford)
+`.  They used this algorithm in cascade simulations where
+a primary knock-on atom (PKA) was initialized with a high velocity to
+simulate a radiation event.
 
-The description in this sub-section applies to both fix ttm and fix
-ttm/mod.  Fix ttm/mod adds options to account for external heat
-sources (e.g. at a surface) and for specifying parameters that allow
-the electronic heat capacity to depend strongly on electronic
-temperature.  It is more expensive computationally than fix ttm
-because it treats the thermal diffusion equation as non-linear.  More
-details on fix ttm/mod are given below.
+The description in this sub-section applies to all 3 of the fixes: fix
+ttm, fix ttm/grid, and fix ttm/mod.
+
+Fix ttm/grid distributes the regular grid across processors consistent
+with the subdomains of atoms owned by each processor, but is otherwise
+identical to fix ttm.  Note that fix ttm stores a copy of the grid on
+each processor, which is fine when the overall grid is reasonably
+small.  For very large grids you should use fix ttt/grid instead.
+
+Fix ttm/mod adds options to account for external heat sources (e.g. at
+a surface) and for specifying parameters that allow the electronic
+heat capacity to depend strongly on electronic temperature.  It is
+more expensive computationally than fix ttm because it treats the
+thermal diffusion equation as non-linear.  More details on fix ttm/mod
+are given below.
 
 Heat transfer between the electronic and atomic subsystems is carried
-out via an inhomogeneous Langevin thermostat.  This thermostat differs
-from the regular Langevin thermostat (:doc:`fix langevin `) in three important ways.  First, the
-Langevin thermostat is applied uniformly to all atoms in the
+out via an inhomogeneous Langevin thermostat.  Only atoms in the fix
+group contribute to and are affected by this heat transfer.  
+
+This thermostatting differs from the regular Langevin thermostat
+(:doc:`fix langevin `) in three important ways.  First,
+the Langevin thermostat is applied uniformly to all atoms in the
 user-specified group for a single target temperature, whereas the TTM
-fix applies Langevin thermostatting locally to atoms within the
+fixes apply Langevin thermostatting locally to atoms within the
 volumes represented by the user-specified grid points with a target
 temperature specific to that grid point.  Second, the Langevin
 thermostat couples the temperature of the atoms to an infinite heat
-reservoir, whereas the heat reservoir for fix TTM is finite and
-represents the local electrons.  Third, the TTM fix allows users to
+reservoir, whereas the heat reservoir for the TTM fixes is finite and
+represents the local electrons.  Third, the TTM fixes allow users to
 specify not just one friction coefficient, but rather two independent
 friction coefficients: one for the electron-ion interactions
 (*gamma_p*), and one for electron stopping (*gamma_s*).
@@ -123,26 +146,54 @@ as that in equation 6 of :ref:`(Duffy) `, with the exception that the
 electronic density is explicitly represented, rather than being part
 of the specific heat parameter.
 
-Currently, fix ttm assumes that none of the user-supplied parameters
-will vary with temperature. Note that :ref:`(Duffy) ` used a tanh()
-functional form for the temperature dependence of the electronic
-specific heat, but ignored temperature dependencies of any of the
-other parameters.  See more discussion below for fix ttm/mod.
+Currently, the TTM fixes assume that none of the user-supplied
+parameters will vary with temperature. Note that :ref:`(Duffy)
+` used a tanh() functional form for the temperature dependence
+of the electronic specific heat, but ignored temperature dependencies
+of any of the other parameters.  See more discussion below for fix
+ttm/mod.
 
-These fixes require use of periodic boundary conditions and a 3D
-simulation.  Periodic boundary conditions are also used in the heat
-equation solve for the electronic subsystem.  This varies from the
-approach of :ref:`(Rutherford) ` where the atomic subsystem was
+..note::
+
+  These fixes do not perform time integration of the atoms in the fix
+  group, they only rescale their velocities.  Thus a time integration
+  fix such as :doc:`fix nve ` should be used in conjunction
+  with these fixes.  These fixes should not normally be used on atoms
+  that have their temperature controlled by another thermostatting
+  fix, e.g. :doc:`fix nvt ` or :doc:`fix langevin
+  `.
+
+..note::
+
+  These fixes require use of an orthogonal 3d simulation box with
+  periodic boundary conditions in all dimensions.  They also require
+  that the size and shape of the simulation box do not vary
+  dynamically, e.g. due to use of the :doc:`fix npt ` command.
+  Likewise, the size/shape of processor subdomains cannot vary due to
+  dynamic load-balancing via use of the :doc:`fix balance
+  ` command.  It is possible however to load balance
+  before the simulation starts using the :doc:`balance `
+  command, so that each processor has a different size subdomain.
+
+Periodic boundary conditions are also used in the heat equation solve
+for the electronic subsystem.  This varies from the approach of
+:ref:`(Rutherford) ` where the atomic subsystem was
 embedded within a larger continuum representation of the electronic
 subsystem.
 
-The initial electronic temperature input file, *T_infile*, is a text
-file LAMMPS reads in with no header and with four numeric columns
-(ix,iy,iz,Temp) and with a number of rows equal to the number of
-user-specified grid points (Nx by Ny by Nz).  The ix,iy,iz are node
-indices from 0 to nxnodes-1, etc.  For example, the initial electronic
-temperatures on a 1 by 2 by 3 grid could be specified in a *T_infile*
-as follows:
+The *set* keyword specifies a *Tinit* temperature value to initialize
+the value stored on all grid points.
+
+The *infile* keyword specifies an input file of electronic
+temperatures for each grid point to be read in to initialize the grid.
+By default the temperatures are all zero when the grid is created.
+The input file is a text file with no header.  Each line contains four
+numeric columns: ix,iy,iz,Temperature.  The number of lines must be
+equal to the number of user-specified grid points (Nx by Ny by Nz).
+The ix,iy,iz are grid point indices ranging from 0 to nxnodes-1
+inclusive in each dimension.  The lines can appear in any order.  For
+example, the initial electronic temperatures on a 1 by 2 by 3 grid
+could be specified in the file as follows:
 
 .. parsed-literal::
 
@@ -155,34 +206,27 @@ as follows:
 
 where the electronic temperatures along the y=0 plane have been set to
 1.0, and the electronic temperatures along the y=1 plane have been set
-to 2.0.  The order of lines in this file is no important.  If all the
-nodal values are not specified, LAMMPS will generate an error.
+to 2.0.  If all the grid point values are not specified, LAMMPS will
+generate an error.
 
-The temperature output file, *T_oufile*, is created and written by
-this fix.  Temperatures for both the electronic and atomic subsystems
-at every node and every N timesteps are output.  If N is specified as
-zero, no output is generated, and no output filename is needed.  The
-format of the output is as follows.  One long line is written every
-output timestep.  The timestep itself is given in the first column.
-The next Nx\*Ny\*Nz columns contain the temperatures for the atomic
-subsystem, and the final Nx\*Ny\*Nz columns contain the temperatures for
-the electronic subsystem.  The ordering of the Nx\*Ny\*Nz columns is
-with the z index varying fastest, y the next fastest, and x the
-slowest.
+..note::
 
-These fixes do not change the coordinates of their atoms; they only
-scales their velocities.  Thus a time integration fix (e.g. :doc:`fix nve `) should still be used to time integrate the affected
-atoms.  The fixes should not normally be used on atoms that have their
-temperature controlled by another fix - e.g. :doc:`fix nvt ` or
-:doc:`fix langevin `.
+  The electronic temperature at each grid point must be a non-zero
+  positive value, both initially, and as the temperature evovles over
+  time.  Thus you must use either the *set* or *infile* keyword or be
+  restarting a simulation that used this fix previously.
 
-.. note::
+The *outfile* keyword has 2 values.  The first value *Nout* triggers
+output of the electronic temperatures for each grid point every Nout
+timesteps.  The second value is the filename for output which will
+be suffixed by the timestep.  The format of each output file is exactly
+the same as the input temperature file.
 
-   The current implementations of these fixes create a copy of the
-   electron grid that overlays the entire simulation domain, for each
-   processor.  Values on the grid are summed across all processors.  Thus
-   you should insure that this grid is not too large, else your
-   simulation could incur high memory and communication costs.
+Note that the atomic temperature for atoms in each grid cell can also
+be computed and output by the :doc:`fix ave/chunk `
+command using the :doc:`compute chunk/atom `
+command to create a 3d array of chunks consistent with the grid used
+by this fix.
 
 ----------
 
@@ -222,7 +266,8 @@ acting on an ion is:
 
 .. math::
 
-  {\vec F}_i = - \partial U / \partial {\vec r}_i + {\vec F}_{langevin} - \nabla P_e/n_{ion}
+  {\vec F}_i = - \partial U / \partial {\vec r}_i + {\vec
+  F}_{langevin} - \nabla P_e/n_{ion}
 
 where F_langevin is a force from Langevin thermostat simulating
 electron-phonon coupling, and nabla P_e/n_ion is the electron blast
@@ -246,7 +291,9 @@ is calculated as
 
 .. math::
 
-  \nabla_x P_e = \left[\frac{C_e{}T_e(x)\lambda}{(x+\lambda)^2} + \frac{x}{x+\lambda}\frac{(C_e{}T_e)_{x+\Delta x}-(C_e{}T_e)_{x}}{\Delta x} \right]
+  \nabla_x P_e = \left[\frac{C_e{}T_e(x)\lambda}{(x+\lambda)^2} +
+  \frac{x}{x+\lambda}\frac{(C_e{}T_e)_{x+\Delta
+  x}-(C_e{}T_e)_{x}}{\Delta x} \right]
 
 where lambda is the electron mean free path (see :ref:`(Norman) `,
 :ref:`(Pisarev) `)
@@ -286,10 +333,12 @@ Restart, fix_modify, output, run start/stop, minimize info
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
 These fixes write the state of the electronic subsystem and the energy
-exchange between the subsystems to :doc:`binary restart files `.  See the :doc:`read_restart ` command
-for info on how to re-specify a fix in an input script that reads a
+exchange between the subsystems to :doc:`binary restart files
+`.  See the :doc:`read_restart ` command for
+info on how to re-specify a fix in an input script that reads a
 restart file, so that the operation of the fix continues in an
-uninterrupted fashion.
+uninterrupted fashion.  Note that the restart script must define the
+same size grid as the original script.
 
 Because the state of the random number generator is not saved in the
 restart files, this means you cannot do "exact" restarts with this
@@ -297,16 +346,16 @@ fix, where the simulation continues on the same as if no restart had
 taken place.  However, in a statistical sense, a restarted simulation
 should produce the same behavior.
 
-None of the :doc:`fix_modify ` options are relevant to these
-fixes.
+None of the :doc:`fix_modify ` options are relevant to
+these fixes.
 
-Both fixes compute 2 output quantities stored in a vector of length 2,
-which can be accessed by various :doc:`output commands `.
-The first quantity is the total energy of the electronic
-subsystem. The second quantity is the energy transferred from the
-electronic to the atomic subsystem on that timestep. Note that the
-velocity verlet integrator applies the fix ttm forces to the atomic
-subsystem as two half-step velocity updates: one on the current
+These fixes compute 2 output quantities stored in a vector of length
+2, which can be accessed by various :doc:`output commands
+`.  The first quantity is the total energy of the
+electronic subsystem.  The second quantity is the energy transferred
+from the electronic to the atomic subsystem on that timestep. Note
+that the velocity verlet integrator applies the fix ttm forces to the
+atomic subsystem as two half-step velocity updates: one on the current
 timestep and one on the subsequent timestep.  Consequently, the change
 in the atomic subsystem energy is lagged by half a timestep relative
 to the change in the electronic subsystem energy. As a result of this,
@@ -322,13 +371,12 @@ of the :doc:`run ` command.  The fixes are not invoked during
 Restrictions
 """"""""""""
 
-Fix *ttm* and *ttm/mod* are part of the EXTRA-FIX package. They are
-only enabled if LAMMPS was built with that package.
-See the :doc:`Build package ` page for more info.
+All these fixes are part of the EXTRA-FIX package. They are only
+enabled if LAMMPS was built with that package.  See the :doc:`Build
+package ` page for more info.
 
-These fixes can only be used for 3d simulations and orthogonal
-simulation boxes.  You must also use periodic
-:doc:`boundary ` conditions.
+As mentioned above, these fixes require 3d simulations and orthogonal
+simulation boxes periodic in all 3 dimensions.
 
 Related commands
 """"""""""""""""
diff --git a/doc/src/rerun.rst b/doc/src/rerun.rst
index 21c6f68643..f6ea0973e1 100644
--- a/doc/src/rerun.rst
+++ b/doc/src/rerun.rst
@@ -175,24 +175,28 @@ include and perform all the usual operations of an input script that
 uses the :doc:`run ` command.  There are a few exceptions and
 points to consider, as discussed here.
 
-Fixes that perform time integration, such as :doc:`fix nve ` or
-:doc:`fix npt ` are not invoked, since no time integration is
-performed.  Fixes that perturb or constrain the forces on atoms will
-be invoked, just as they would during a normal run.  Examples are :doc:`fix indent ` and :doc:`fix langevin `.  So you
-should think carefully as to whether that makes sense for the manner
-in which you are reprocessing the dump snapshots.
+Fixes that perform time integration, such as :doc:`fix nve `
+or :doc:`fix npt ` are not invoked, since no time integration
+is performed.  Fixes that perturb or constrain the forces on atoms
+will be invoked, just as they would during a normal run.  Examples are
+:doc:`fix indent ` and :doc:`fix langevin `.
+So you should think carefully as to whether that makes sense for the
+manner in which you are reprocessing the dump snapshots.
 
-If you only want the rerun script to perform an analysis that does
-not involve pair interactions, such as use compute msd to calculated
-displacements over time, you do not need to define a :doc:`pair style `, which may also mean neighbor lists will not
-need to be calculated which saves time.  The :doc:`comm_modify cutoff ` command can also be used to insure ghost
-atoms are acquired from far enough away for operations like bond and
-angle evaluations, if no pair style is being used.
+If you only want the rerun script to perform an analysis that does not
+involve pair interactions, such as use compute msd to calculated
+displacements over time, you do not need to define a :doc:`pair style
+`, which may also mean neighbor lists will not need to be
+calculated which saves time.  The :doc:`comm_modify cutoff
+` command can also be used to insure ghost atoms are
+acquired from far enough away for operations like bond and angle
+evaluations, if no pair style is being used.
 
 Every time a snapshot is read, the timestep for the simulation is
 reset, as if the :doc:`reset_timestep ` command were
 used.  This command has some restrictions as to what fixes can be
-defined.  See its page for details.  For example, the :doc:`fix deposit ` and :doc:`fix dt/reset ` fixes
+defined.  See its page for details.  For example, the :doc:`fix
+deposit ` and :doc:`fix dt/reset ` fixes
 are in this category.  They also make no sense to use with a rerun
 command.
 
diff --git a/doc/src/velocity.rst b/doc/src/velocity.rst
index 0c8de5b854..cd283de399 100644
--- a/doc/src/velocity.rst
+++ b/doc/src/velocity.rst
@@ -92,25 +92,25 @@ velocity field.
 The *scale* style computes the current temperature of the group of
 atoms and then rescales the velocities to the specified temperature.
 
-The *ramp* style is similar to that used by the :doc:`compute temp/ramp ` command.  Velocities ramped
-uniformly from vlo to vhi are applied to dimension vx, or vy, or vz.
-The value assigned to a particular atom depends on its relative
-coordinate value (in dim) from clo to chi.  For the example above, an
-atom with y-coordinate of 10 (1/4 of the way from 5 to 25), would be
-assigned a x-velocity of 1.25 (1/4 of the way from 0.0 to 5.0).  Atoms
-outside the coordinate bounds (less than 5 or greater than 25 in this
-case), are assigned velocities equal to vlo or vhi (0.0 or 5.0 in this
-case).
+The *ramp* style is similar to that used by the :doc:`compute
+temp/ramp ` command.  Velocities ramped uniformly
+from vlo to vhi are applied to dimension vx, or vy, or vz.  The value
+assigned to a particular atom depends on its relative coordinate value
+(in dim) from clo to chi.  For the example above, an atom with
+y-coordinate of 10 (1/4 of the way from 5 to 25), would be assigned a
+x-velocity of 1.25 (1/4 of the way from 0.0 to 5.0).  Atoms outside
+the coordinate bounds (less than 5 or greater than 25 in this case),
+are assigned velocities equal to vlo or vhi (0.0 or 5.0 in this case).
 
 The *zero* style adjusts the velocities of the group of atoms so that
 the aggregate linear or angular momentum is zero.  No other changes
 are made to the velocities of the atoms.  If the *rigid* option is
 specified (see below), then the zeroing is performed on individual
-rigid bodies, as defined by the :doc:`fix rigid or fix rigid/small ` commands.  In other words, zero linear
-will set the linear momentum of each rigid body to zero, and zero
-angular will set the angular momentum of each rigid body to zero.
-This is done by adjusting the velocities of the atoms in each rigid
-body.
+rigid bodies, as defined by the :doc:`fix rigid or fix rigid/small
+` commands.  In other words, zero linear will set the
+linear momentum of each rigid body to zero, and zero angular will set
+the angular momentum of each rigid body to zero.  This is done by
+adjusting the velocities of the atoms in each rigid body.
 
 All temperatures specified in the velocity command are in temperature
 units; see the :doc:`units ` command.  The units of velocities and
diff --git a/examples/README b/examples/README
index 9e873b49b9..76ddf77498 100644
--- a/examples/README
+++ b/examples/README
@@ -114,6 +114,7 @@ tad:      temperature-accelerated dynamics of vacancy diffusion in bulk Si
 template: examples for using atom_style template and comparing to atom style molecular
 tersoff:  regression test input for Tersoff variants
 threebody: regression test input for a variety of threebody potentials
+ttm:      two-temeperature model examples
 vashishta: models using the Vashishta potential
 voronoi:  Voronoi tesselation via compute voronoi/atom command
 wall:     use of reflective walls with different stochastic models
diff --git a/examples/ttm/FeVoter-ChenRecheck.fs b/examples/ttm/FeVoter-ChenRecheck.fs
new file mode 100644
index 0000000000..1d7eb0bd3a
--- /dev/null
+++ b/examples/ttm/FeVoter-ChenRecheck.fs
@@ -0,0 +1,4606 @@
+ My transcription of Voter Chen 
+ from the potential file from Tim Germann 
+ 4/4/2016 (Fembed, rhoatomic, phipair)
+1   Fe
+3000  2.7915816152066654e-6   10000  0.0004524   4.524
+26  55.85   2.87  bcc
+              0  -0.79395541130871E0  -0.97373788441046E0  -0.10896006180792E1  -0.11759534709491E1
+-0.12447984733467E1  -0.13018961056419E1  -0.13505005179897E1  -0.13926464893073E1  -0.14296982548672E1
+-0.14626190981611E1  -0.14921160996901E1  -0.15187250288449E1  -0.15428621070094E1  -0.15648577598736E1
+-0.15849789112574E1  -0.16034443822871E1  -0.16204361204241E1  -0.1636107061927E1  -0.16505869597989E1
+-0.16639871993477E1  -0.16764038348153E1  -0.16879203472668E1  -0.16986100807586E1  -0.17085376629779E1
+-0.17177599325665E1  -0.17263279769279E1  -0.17342872480389E1  -0.17416784832022E1  -0.17485385011835E1
+-0.17549008289582E1  -0.17607954059781E1  -0.17662499208085E1  -0.17712896096966E1  -0.17759373804232E1
+-0.17802144364243E1  -0.17841403783433E1  -0.1787732945564E1  -0.17910090691012E1  -0.17939838627922E1
+-0.1796671785428E1  -0.1799086127315E1  -0.18012393577778E1  -0.18031133671671E1  -0.18046003093578E1
+-0.18057098932139E1  -0.18064644261379E1  -0.18068845672559E1  -0.18069890298749E1  -0.18067953652118E1
+-0.18063195558552E1  -0.18055764935024E1  -0.18045798377181E1  -0.18033424742025E1  -0.18018760550675E1
+-0.1800191816349E1  -0.1798299895423E1  -0.17962099103763E1  -0.17939309845112E1  -0.17914712099674E1
+-0.17888387525323E1  -0.17860408670916E1  -0.17830844700077E1  -0.17799761636234E1  -0.17767221070622E1
+-0.17733279473156E1  -0.17697992626795E1  -0.17661412436743E1  -0.17623587329223E1  -0.17584563755726E1
+-0.17544386265262E1  -0.17503093394205E1  -0.1746072887359E1   -0.174173259035E1  -0.17372922764117E1
+-0.1732755283485E1  -0.17281248172223E1  -0.17234039679407E1  -0.17185957006217E1  -0.17137025596536E1
+-0.17087275717331E1  -0.17036729777054E1  -0.16985414640841E1  -0.16933352547209E1  -0.16880564780777E1
+-0.16827073973404E1  -0.16772900560579E1  -0.16718063694637E1  -0.16662581711845E1  -0.16606473898282E1
+-0.16549757839179E1  -0.16492447973722E1  -0.16434563108117E1  -0.1637611657078E1  -0.16317123941462E1
+-0.16257600004798E1  -0.16197558147978E1  -0.16137011444858E1  -0.16075972603296E1  -0.16014453995499E1
+-0.15952467652173E1  -0.1589002528347E1  -0.15827138299404E1  -0.15763815711164E1  -0.15700069469862E1
+-0.15635909333234E1  -0.15571344306349E1  -0.15506384283815E1  -0.15441038969763E1  -0.15375314933704E1
+-0.15309222600597E1  -0.15242769918622E1  -0.15175964648332E1  -0.15108814376675E1  -0.15041326518757E1
+-0.14973508320429E1  -0.14905366870669E1  -0.14836909058044E1  -0.14768141691118E1  -0.1469907139505E1
+-0.14629703758517E1  -0.14560044671972E1  -0.14490101323441E1  -0.1441987794457E1  -0.14349381211267E1
+-0.14278615880222E1  -0.14207587827735E1  -0.14136301195382E1  -0.14064762419748E1  -0.13992974911646E1
+-0.13920943931718E1  -0.13848674517477E1  -0.13776171017031E1  -0.13703437660937E1  -0.13630477945996E1
+-0.13557296904683E1  -0.13483898449455E1  -0.13410286522481E1  -0.13336464992978E1  -0.13262437566239E1
+-0.13188207843313E1   -0.131137788857E1  -0.13039154871085E1  -0.1296433916383E1  -0.12889335345909E1
+-0.12814145866646E1  -0.12738773983737E1  -0.12663223637609E1  -0.12587497021936E1  -0.12511597174437E1
+-0.12435527795616E1  -0.1235929017924E1  -0.12282888867109E1  -0.12206324769036E1  -0.12129602034923E1
+-0.12052722379659E1  -0.11975688376355E1  -0.11898503277262E1  -0.11821168227083E1  -0.11743686277441E1
+-0.11666060056846E1  -0.11588291794975E1  -0.11510382479628E1  -0.11432335388256E1  -0.11354152614176E1
+-0.11275836101127E1  -0.11197387864983E1  -0.11118809923523E1  -0.11040104136839E1  -0.10961272388801E1
+-0.1088231661504E1  -0.10803238662282E1  -0.10724040245365E1  -0.10644723227941E1  -0.10565289373038E1
+-0.1048574043073E1  -0.10406078035769E1  -0.10326303883614E1  -0.10246419363382E1  -0.10166425719205E1
+-0.10086325143559E1  -0.10006119187903E1  -0.99258090773476E0  -0.98453957068765E0  -0.97648815195561E0
+-0.96842677376409E0  -0.96035546603204E0  -0.9522745088491E0  -0.94418394221332E0  -0.93608392530594E0
+-0.9279746207178E0  -0.91985606612037E0  -0.91172850488967E0  -0.90359191451101E0  -0.89544655735942E0
+-0.88729243537507E0  -0.87912974463787E0  -0.87095857088822E0  -0.86277899085954E0  -0.85459120761419E0
+-0.84639519322239E0  -0.8381911529234E0  -0.82997920950322E0  -0.82175934737788E0   -0.813531755936E0
+ -0.805296549792E0  -0.79705379533626E0  -0.7888035351519E0  -0.78054593596043E0  -0.77228108600028E0
+-0.76400907269621E0  -0.75572995776098E0   -0.747443812483E0  -0.73915076284561E0  -0.73085089256469E0
+-0.72254428355471E0  -0.71423101615189E0  -0.70591116977814E0  -0.69758482166759E0  -0.68925205083668E0
+-0.68091293402157E0  -0.67256754752303E0  -0.66421158403223E0  -0.65583067812319E0  -0.64742401709209E0
+-0.63899204070781E0  -0.6305351839364E0  -0.62205387034781E0  -0.6135485180479E0  -0.60501953649207E0
+-0.59646732749201E0  -0.58789228539804E0  -0.57929476356652E0  -0.57067496630881E0  -0.56203345908053E0
+-0.55337061071586E0  -0.54468677946105E0  -0.53598231835682E0  -0.52725728153479E0  -0.51851225448089E0
+-0.50974760688104E0  -0.50096366648295E0  -0.49216040314182E0  -0.48333844448316E0  -0.47449813382775E0
+-0.46563953545981E0  -0.45676299684443E0  -0.44786899746824E0  -0.43895754632733E0  -0.43002901663422E0
+-0.42108386939356E0  -0.41212192502099E0  -0.40314386004635E0  -0.39414975566028E0  -0.38513980105004E0
+-0.37611447959895E0  -0.36707362577462E0  -0.35801795967776E0  -0.3489471957329E0  -0.33986205494689E0
+-0.33076232102721E0  -0.32164862459804E0  -0.3125207659386E0  -0.30337939696328E0  -0.29422422372366E0
+-0.28505594153086E0  -0.27587432869089E0  -0.26667989991963E0  -0.25747268565303E0  -0.24825287012179E0
+-0.23902083532771E0  -0.22977635590324E0  -0.2205200138812E0  -0.21125183129736E0  -0.20197188425114E0
+-0.19268056400437E0  -0.1833778451171E0  -0.17406390538864E0  -0.16473906221818E0  -0.15540335444593E0
+-0.14605685688145E0   -0.136699900063E0  -0.12733262490725E0  -0.11795495215909E0  -0.10856722941178E0
+-0.99169614309124E-1  -0.89762232229278E-1  -0.8034503379362E-1  -0.70918335524611E-1  -0.61482279936515E-1
+-0.52036988338297E-1  -0.42582551387731E-1  -0.33119001249779E-1  -0.23646602439931E-1  -0.14165461234213E-1
+-0.46756958895336E-2   0.48225703428742E-2   0.14329222845464E-1   0.23844262632323E-1   0.33367466818521E-1
+ 0.42898716214859E-1   0.52437899348478E-1   0.61984920596885E-1   0.71539677047653E-1   0.81102054938355E-1
+ 0.90671950643626E-1   0.10024927648289E0   0.10983393063518E0   0.11942580552375E0   0.12902481533664E0
+ 0.13863088240408E0   0.14824388023496E0   0.15786371320489E0   0.16749029784154E0   0.1771235497297E0
+ 0.18676336628784E0   0.19640965584211E0   0.20606235882675E0   0.21572137189559E0   0.22538661913291E0
+ 0.23505802982716E0   0.24473551476305E0   0.25441897824488E0   0.26410834531613E0   0.27380355480829E0
+ 0.2835045075848E0   0.29321159824905E0   0.3029273531564E0   0.31265214771259E0   0.32238585079406E0
+ 0.33212836485611E0   0.34187963062685E0   0.3516395256441E0   0.36140788850889E0   0.37118460539049E0
+ 0.38096954926881E0   0.39076262601961E0   0.40056373392939E0   0.41037289521628E0   0.42018989979465E0
+ 0.43001462332746E0   0.43984694886826E0   0.44968679193928E0   0.45953417149325E0   0.46938893468917E0
+ 0.47925092551049E0   0.48912004958807E0   0.49899622010939E0   0.50887953272795E0   0.51876969823827E0
+ 0.52866661580579E0   0.53857025119313E0   0.54848067028998E0   0.55839758438064E0   0.56832092878908E0
+ 0.57825071880538E0   0.58818687952471E0   0.59812922402108E0   0.6080776770441E0   0.61803237078673E0
+ 0.62799299988538E0   0.63795947082261E0   0.64793199499564E0   0.65791022460468E0   0.66789407614338E0
+ 0.67788376872066E0   0.68787893919222E0   0.69787956323923E0   0.70788578121809E0   0.71789726083952E0
+ 0.72791407790358E0   0.73793619122856E0   0.74796337693536E0   0.75799581186545E0    0.768033225679E0
+ 0.77807562240874E0   0.78812303354915E0   0.79817518684201E0   0.80823230437044E0   0.81829407373667E0
+ 0.82836058204713E0   0.8384317384239E0   0.84850741330807E0   0.85858772567875E0   0.86867235717073E0
+ 0.87876159619764E0   0.88885504692613E0   0.89895292448681E0   0.9090549765402E0   0.91916130375759E0
+ 0.92927173360511E0   0.93938632268519E0   0.94950492409163E0   0.95962758277769E0   0.96975414866703E0
+ 0.97988469356239E0   0.99001902634177E0   0.10001572708796E1   0.10102991989649E1   0.10204449470354E1
+ 0.10305942768228E1   0.10407473644555E1   0.10509039383638E1   0.10610641675877E1   0.10712278368713E1
+ 0.10813950109641E1   0.10915656040959E1   0.11017395588425E1   0.11119169074901E1   0.11220974829525E1
+ 0.11322814307592E1   0.11424685366474E1   0.11526588471025E1   0.11628523327879E1   0.11730488490939E1
+ 0.11832485620265E1   0.11934512350315E1   0.12036569210515E1   0.12138656170441E1   0.12240771516728E1
+ 0.12342916928265E1   0.12445090413858E1   0.12547291779191E1   0.1264952202488E1   0.12751779329394E1
+ 0.12854063661115E1   0.12956375678939E1   0.13058713773583E1   0.13161078048533E1   0.13263469022411E1
+ 0.13365885053253E1   0.13468326465991E1   0.13570793460411E1   0.13673284981527E1   0.13775800321027E1
+ 0.13878341040736E1   0.13980905104016E1   0.1408349247005E1   0.14186103522656E1   0.14288737827675E1
+ 0.14391394450805E1   0.14494073469188E1   0.14596775352903E1   0.14699498943696E1   0.14802243936255E1
+ 0.14905010438473E1   0.15007798600285E1   0.15110607301807E1   0.15213436549296E1   0.15316286284656E1
+ 0.15419156612107E1   0.15522046557072E1   0.1562495606962E1   0.15727884925663E1   0.15830833613918E1
+ 0.15933800938582E1   0.16036787027682E1   0.16139791251548E1   0.16242814378901E1   0.16345855451765E1
+ 0.16448914444559E1   0.16551990746798E1   0.16655084518347E1   0.16758195692811E1   0.16861324079574E1
+ 0.16964469016446E1   0.1706763057513E1   0.17170808261603E1   0.1727400230825E1   0.17377212534386E1
+ 0.17480438645722E1   0.17583680069593E1   0.17686937008044E1   0.17790208909363E1   0.17893495928111E1
+ 0.17996797991771E1   0.18100114790812E1   0.18203445940464E1     0.18306791341E1   0.18410150813774E1
+ 0.1851352414409E1   0.18616911240245E1   0.18720311986047E1   0.18823726369522E1   0.18927153878824E1
+ 0.19030594521572E1   0.19134047956671E1   0.19237514199224E1   0.19340992924735E1   0.19444484144087E1
+ 0.19547987471425E1   0.19651503108247E1   0.19755030709105E1   0.19858570292776E1   0.19962121337208E1
+ 0.20065684027983E1   0.20169257904004E1   0.2027284311888E1   0.20376439264438E1   0.20480046411158E1
+ 0.20583664273591E1   0.20687292788198E1   0.20790931812529E1   0.20894581131612E1   0.20998240776469E1
+ 0.21101910335528E1   0.21205590087433E1   0.2130927943884E1   0.21412978736149E1   0.21516687440983E1
+ 0.21620405708448E1   0.21724133176904E1   0.2182786987152E1   0.21931615621411E1   0.22035370230788E1
+ 0.22139133784281E1   0.22242905875759E1   0.22346686697062E1   0.22450475829135E1   0.22554273405722E1
+ 0.22658079129266E1   0.22761892979358E1   0.22865714861712E1   0.22969544500947E1   0.23073382110401E1
+ 0.23177227107886E1   0.23281079983888E1   0.23384939996079E1   0.23488807613585E1   0.23592682237482E1
+ 0.23696564140837E1   0.23800453042147E1   0.23904348859371E1   0.24008251588699E1   0.24112160863593E1
+ 0.24216076996439E1   0.24319999455665E1   0.24423928462361E1   0.24527863736931E1   0.24631805202639E1
+ 0.24735752930914E1   0.24839706520934E1   0.2494366627692E1   0.25047631657503E1   0.25151603025274E1
+ 0.2525557990417E1   0.25359562443309E1   0.25463550488811E1   0.25567543936729E1   0.25671542926928E1
+ 0.25775546967019E1   0.25879556289659E1   0.25983570624095E1   0.26087589883386E1   0.2619161420767E1
+ 0.26295643125512E1   0.26399677053108E1   0.26503715372352E1   0.26607758584069E1   0.26711806202537E1
+ 0.26815858290069E1   0.26919914771153E1   0.27023975418303E1   0.27128040389617E1   0.27232109403048E1
+ 0.27336182444855E1   0.27440259627964E1   0.27544340582846E1   0.2764842565318E1   0.27752514248206E1
+ 0.27856606663169E1   0.27960702669765E1   0.28064802090847E1   0.28168905309552E1   0.28273011774577E1
+ 0.28377121790417E1   0.28481234958427E1   0.28585351329218E1   0.28689470966737E1   0.28793593553972E1
+ 0.28897719425624E1   0.2900184821216E1   0.29105979797661E1   0.29210114421587E1   0.29314251570459E1
+ 0.29418391712041E1   0.29522534436256E1   0.29626679766507E1   0.29730827752863E1   0.29834978006745E1
+ 0.29939130923263E1   0.30043286123361E1   0.30147443712076E1   0.30251603587637E1   0.3035576554868E1
+ 0.30459929763643E1   0.30564096119054E1   0.30668264453823E1   0.30772434913258E1   0.30876607112862E1
+ 0.30980781365294E1   0.31084957464564E1   0.3118913524441E1   0.31293314944836E1   0.3139749605835E1
+ 0.31501679091085E1   0.31605863607657E1   0.31710049606978E1   0.31814237222113E1   0.31918426139312E1
+ 0.32022616569194E1   0.32126808349305E1   0.32231001310391E1   0.32335195649734E1   0.32439391207332E1
+ 0.32543587805765E1   0.32647785729666E1   0.32751984482426E1   0.32856184485823E1   0.32960385421209E1
+ 0.33064587110352E1   0.33168790040062E1   0.33272993567334E1   0.33377198025509E1   0.33481403273358E1
+ 0.33585609130199E1   0.33689815872498E1   0.33794023141066E1   0.33898230952229E1   0.34002439563952E1
+ 0.34106648554729E1   0.34210858036944E1   0.34315068103388E1   0.34419278374734E1   0.34523489240921E1
+ 0.34627700370515E1   0.34731911699568E1   0.34836123531215E1   0.34940335357965E1   0.35044547514516E1
+ 0.35148759854201E1   0.3525297216749E1   0.35357184764322E1   0.35461397302105E1   0.35565609824922E1
+ 0.35669822473184E1   0.35774034970423E1   0.35878247338951E1   0.35982459785576E1   0.36086671895052E1
+ 0.36190883890512E1   0.36295095789644E1   0.3639930717448E1   0.36503518561494E1   0.36607729553125E1
+ 0.36711940057673E1   0.36816150454191E1   0.36920360250154E1   0.37024569663252E1   0.3712877871199E1
+ 0.37232987135137E1   0.37337195104943E1   0.37441402564535E1   0.37545609355815E1   0.37649815615928E1
+ 0.37754021268955E1   0.37858226101559E1   0.37962430441091E1   0.38066634018433E1   0.38170836682288E1
+ 0.38275038837561E1   0.38379240047511E1   0.3848344037173E1   0.38587640040426E1   0.38691838628013E1
+ 0.38796036394904E1   0.38900233332936E1   0.39004429124551E1   0.39108624085131E1   0.39212818044331E1
+ 0.39317010824461E1    0.394212027292E1   0.39525393531062E1   0.39629583072219E1   0.39733771694175E1
+ 0.39837959095427E1   0.3994214519924E1   0.40046330375145E1   0.40150514115648E1   0.40254696567419E1
+ 0.40358878045566E1   0.40463057988174E1   0.40567236687493E1   0.40671414160666E1   0.40775590141566E1
+ 0.40879764806251E1   0.40983938151183E1   0.41088109982072E1   0.41192280363955E1   0.41296449466902E1
+ 0.41400616877571E1   0.41504782896922E1   0.41608947474885E1   0.4171311035404E1   0.4181727181657E1
+ 0.41921431679614E1   0.42025589891198E1   0.42129746488329E1   0.42233901607882E1   0.42338054835153E1
+ 0.42442206562261E1   0.42546356695596E1   0.42650504795424E1   0.4275465154475E1   0.42858796324786E1
+ 0.42962939352953E1   0.4306708070136E1   0.43171220233407E1   0.43275357885689E1   0.43379493771952E1
+ 0.43483627900903E1   0.43587759939201E1   0.43691890355973E1   0.43796018726991E1   0.43900145207634E1
+ 0.44004269717626E1   0.44108392488539E1   0.44212513003354E1   0.44316631743441E1   0.44420748549615E1
+ 0.44524863116562E1   0.44628975890822E1   0.44733086570893E1   0.44837195109971E1   0.44941301638399E1
+ 0.45045406248967E1   0.45149508454863E1   0.45253608843855E1   0.45357706931578E1   0.45461803033142E1
+ 0.45565896733571E1   0.4566998859968E1   0.45774078011865E1   0.45878165338568E1   0.4598225050006E1
+ 0.46086333499606E1   0.46190413983459E1   0.46294492660202E1   0.46398568720025E1   0.46502642564568E1
+ 0.4660671430703E1   0.46710783716387E1   0.46814850551001E1   0.46918915510478E1   0.4702297776623E1
+ 0.47127037843981E1   0.47231095515157E1   0.47335150959623E1    0.474392037371E1   0.4754325447862E1
+ 0.47647302538729E1   0.47751348374578E1   0.47855391529832E1   0.47959432640421E1   0.48063470946059E1
+ 0.48167506930565E1    0.482715405221E1   0.48375571595493E1   0.48479600002984E1   0.48583626236285E1
+ 0.48687649763684E1   0.4879167064042E1   0.48895689345959E1   0.48999705250901E1   0.49103718646679E1
+ 0.49207729498464E1   0.49311737955645E1   0.49415743452226E1   0.49519746728629E1   0.49623747185115E1
+ 0.49727745155023E1   0.49831740334129E1   0.49935733115639E1   0.50039723194241E1   0.50143710449932E1
+ 0.50247695350749E1   0.50351677410151E1   0.50455656856715E1   0.50559633490708E1   0.50663607741255E1
+ 0.50767578906029E1   0.50871547597015E1   0.50975513674618E1   0.51079476746449E1   0.51183437272382E1
+ 0.51287395077448E1   0.51391350163822E1   0.51495302263473E1   0.51599251899403E1   0.51703198623714E1
+ 0.51807142492733E1   0.51911083801703E1   0.52015022119052E1   0.5211895781295E1   0.52222890415633E1
+ 0.52326820519493E1   0.52430747725338E1   0.52534671856568E1   0.5263859361061E1   0.52742512164319E1
+ 0.52846427930492E1   0.52950340857428E1   0.53054251058326E1   0.53158158317127E1   0.53262062484441E1
+ 0.53365964211709E1   0.53469862670887E1   0.53573758260352E1   0.53677651287319E1   0.53781541050006E1
+ 0.53885428093458E1   0.5398931206828E1   0.54093193272438E1   0.54197071588106E1   0.54300946671876E1
+ 0.54404819166208E1   0.5450868854021E1   0.5461255486327E1   0.5471641848587E1   0.54820278959022E1
+ 0.5492413652627E1   0.55027990971281E1   0.55131842671206E1   0.5523569145543E1   0.55339536782173E1
+ 0.55443379528187E1   0.55547219297002E1   0.55651055676365E1   0.55754889396629E1   0.55858720047448E1
+ 0.55962547507186E1   0.56066372167143E1   0.56170193611801E1   0.56274012111914E1   0.56377827623398E1
+ 0.56481639860535E1   0.56585449366735E1   0.56689255670426E1    0.567930587463E1   0.5689685911709E1
+ 0.57000656205096E1   0.57104450149096E1   0.5720824123073E1   0.57312029088901E1   0.57415813904566E1
+ 0.57519595591464E1   0.57623374197487E1   0.57727149861141E1   0.57830922222692E1   0.57934691440238E1
+ 0.58038457894194E1   0.58142220945365E1   0.58245980768447E1   0.58349737894879E1   0.58453491618254E1
+ 0.58557242129595E1   0.58660989760337E1   0.58764734139861E1   0.58868475328305E1   0.58972213524583E1
+ 0.5907594840107E1   0.59179680250832E1   0.5928340907115E1   0.59387134362694E1   0.59490856791326E1
+ 0.59594576216635E1   0.59698292025822E1   0.5980200485264E1   0.59905714870152E1   0.60009421253854E1
+ 0.60113124449741E1   0.60216824928025E1   0.60320521900392E1   0.60424215555962E1   0.6052790632413E1
+ 0.60631593879993E1   0.60735278005042E1   0.60838959120238E1   0.6094263709415E1   0.61046311699835E1
+ 0.61149983233897E1   0.61253651535517E1   0.61357316552721E1   0.61460978495037E1   0.61564637301783E1
+ 0.61668292479889E1   0.61771944829642E1   0.6187559405607E1   0.61979239617396E1   0.62082882152541E1
+ 0.62186521761916E1   0.62290157834898E1   0.62393790519789E1   0.62497420384762E1   0.62601047004504E1
+ 0.62704669927305E1   0.62808289900662E1   0.62911906949882E1   0.63015520271685E1   0.63119130368664E1
+ 0.63222737570623E1   0.6332634143592E1   0.63429941772987E1   0.63533539016933E1   0.63637133335383E1
+ 0.63740723941925E1   0.63844311400108E1   0.63947895693606E1   0.64051476813982E1   0.64155054493476E1
+ 0.64258628959576E1   0.64362200299359E1   0.64465768234179E1   0.64569332919958E1   0.64672894340913E1
+ 0.64776452565889E1   0.64880007492844E1   0.64983559089939E1   0.65087107453232E1   0.65190652620274E1
+ 0.65294194419905E1   0.65397732928317E1   0.65501268313677E1   0.65604800279108E1   0.65708328949238E1
+ 0.65811854418491E1   0.65915376622921E1   0.66018895473818E1   0.66122411048734E1   0.66225923447808E1
+ 0.66329432456341E1   0.66432938164676E1   0.66536440656623E1   0.66639939914224E1   0.66743435729582E1
+ 0.66846928317396E1   0.6695041768202E1   0.67053903745084E1   0.67157386412438E1   0.67260865893065E1
+ 0.67364342038391E1   0.67467814896035E1   0.67571284505726E1   0.67674750764334E1   0.67778213685464E1
+ 0.67881673394831E1   0.67985129888084E1   0.6808858290127E1   0.68192032612082E1   0.68295479176711E1
+ 0.68398922510258E1   0.68502362274758E1   0.68605798816612E1   0.68709232171739E1   0.68812662355649E1
+ 0.68916088901396E1   0.69019512251979E1   0.6912293236223E1   0.6922634940385E1   0.69329762777102E1
+ 0.69433172850427E1   0.69536579713351E1   0.69639983566695E1   0.69743383833304E1   0.69846780614676E1
+ 0.69950174231091E1   0.70053564875749E1   0.70156952055307E1   0.70260336424744E1   0.70363721732157E1
+ 0.70467108593886E1   0.70570496667883E1    0.706738861166E1   0.70777277056501E1   0.70880669387178E1
+ 0.70984062853385E1   0.71087457584379E1   0.71190853723563E1   0.71294251204541E1   0.71397649761185E1
+ 0.71501049478396E1   0.71604450385561E1   0.71707852691392E1   0.71811256033433E1   0.71914660399439E1
+ 0.72018065780975E1   0.72121472542945E1   0.72224880344663E1   0.72328289017145E1   0.72431698653727E1
+ 0.72535109525163E1   0.72638521389815E1   0.72741934048767E1   0.72845347667466E1   0.72948762393124E1
+ 0.73052177923423E1   0.73155594276323E1   0.73259011541077E1   0.73362429828436E1   0.73465848822746E1
+ 0.73569268483192E1   0.73672689110187E1   0.73776110626178E1   0.73879532808848E1   0.73982955662007E1
+ 0.74086379203071E1   0.74189803638029E1   0.74293228735857E1   0.74396654460907E1   0.74500080740526E1
+ 0.74603507778254E1   0.74706935471233E1   0.74810363774019E1   0.7491379252144E1   0.75017221909417E1
+ 0.75120652014686E1   0.75224082526222E1   0.75327513446745E1   0.75430944956395E1   0.75534377176262E1
+ 0.7563780968838E1   0.75741242519688E1   0.75844675852501E1   0.7594810990941E1   0.76051544162785E1
+ 0.76154978707323E1   0.76258413703297E1   0.76361849200233E1   0.76465284943433E1   0.76568720936433E1
+ 0.76672157323998E1   0.76775594077557E1   0.76879031069216E1   0.76982468311763E1   0.77085905755131E1
+ 0.77189343528845E1   0.7729278158583E1   0.77396219797375E1   0.77499658112052E1   0.77603096659114E1
+ 0.77706535489175E1   0.77809974466721E1   0.77913413425764E1   0.78016852521408E1   0.78120291933248E1
+ 0.78223731390532E1   0.78327170784685E1   0.78430610199246E1   0.78534049958848E1   0.78637489692055E1
+ 0.78740929296552E1   0.78844368892342E1   0.78947808716435E1   0.79051248499439E1   0.79154688119446E1
+ 0.79258127676051E1   0.79361567306944E1   0.79465006938924E1   0.7956844636301E1   0.79671885734033E1
+ 0.79775324939339E1   0.79878764211313E1   0.79982203276752E1   0.80085642180011E1   0.80189080845443E1
+ 0.8029251948965E1   0.8039595800433E1   0.80499396289074E1   0.80602834223608E1   0.80706271978546E1
+ 0.80809709735933E1   0.80913147174403E1   0.81016584227559E1   0.81120020977853E1   0.81223457791277E1
+ 0.81326894191087E1   0.81430330144359E1   0.81533765765107E1   0.8163720126939E1   0.81740636483328E1
+ 0.81844071205828E1   0.81947505535939E1   0.82050939617066E1   0.82154373431249E1   0.82257806707463E1
+ 0.82361239543669E1   0.82464672051161E1   0.82568104217422E1   0.82671535926531E1   0.82774967190462E1
+ 0.82878397951526E1   0.82981828263058E1   0.83085258212406E1   0.83188687635214E1   0.83292116509167E1
+ 0.83395544858757E1   0.83498972825755E1   0.8360240034322E1   0.83705827210605E1   0.8380925342274E1
+ 0.8391267918643E1   0.84016104567529E1   0.84119529228069E1   0.84222953199073E1   0.84326376660135E1
+ 0.84429799711937E1   0.84533222077468E1   0.84636643693597E1   0.84740064666449E1   0.84843485186503E1
+ 0.84946905045591E1   0.85050324119359E1   0.8515374250223E1   0.85257160335974E1   0.85360577550387E1
+ 0.85463993989003E1   0.85567409729919E1   0.85670824727691E1   0.85774239083274E1   0.85877652716667E1
+ 0.85981065563922E1   0.86084477632932E1   0.86187888945736E1   0.86291299594311E1   0.8639470952015E1
+ 0.86498118597266E1   0.86601526772868E1   0.86704934283968E1   0.86808341153151E1   0.8691174702939E1
+ 0.87015151973638E1   0.87118556093926E1   0.87221959600324E1   0.87325362248746E1   0.87428763895245E1
+ 0.87532164619278E1   0.87635564677447E1   0.87738963924717E1   0.87842362170063E1   0.87945759418383E1
+ 0.88049155815803E1   0.88152551450215E1   0.88255946099847E1   0.88359339728507E1   0.8846273244368E1
+ 0.88566124279925E1   0.88669515241868E1   0.88772905196716E1   0.88876294181207E1   0.88979682144725E1
+ 0.89083069245642E1   0.89186455370759E1   0.8928984054783E1   0.89393224569233E1   0.89496607512792E1
+ 0.89599989632935E1   0.8970337078027E1   0.89806750805679E1   0.89910129695828E1   0.90013507620789E1
+ 0.90116884672808E1   0.90220260627119E1   0.90323635387395E1   0.90427009001253E1   0.90530381819451E1
+ 0.90633753578037E1   0.90737124107211E1   0.90840493428199E1   0.90943861678963E1   0.9104722902903E1
+ 0.91150595193768E1   0.91253960120116E1   0.9135732391719E1   0.91460686692204E1   0.9156404839019E1
+ 0.91667408863936E1    0.917707681763E1   0.91874126307688E1   0.91977483361233E1   0.92080839275981E1
+ 0.92184193993156E1   0.92287547505409E1   0.92390899738455E1   0.92494250923861E1   0.92597600919313E1
+ 0.92700949681273E1   0.92804297097628E1   0.92907643275593E1   0.93010988408912E1   0.93114332378672E1
+ 0.93217674986229E1   0.93321016249543E1   0.93424356344399E1   0.93527695374745E1   0.93631033086427E1
+ 0.93734369405974E1   0.93837704408489E1   0.93941038319555E1   0.94044371025699E1   0.94147702340253E1
+ 0.94251032254236E1   0.94354360928468E1   0.94457688458189E1   0.94561014670877E1   0.94664339455511E1
+ 0.94767662926651E1   0.94870985031779E1   0.94974305923278E1   0.95077625484684E1   0.95180943628648E1
+ 0.95284260457486E1   0.95387575896637E1    0.954908900759E1   0.95594202921804E1   0.95697514404962E1
+ 0.95800824417344E1   0.95904133052556E1   0.96007440447745E1   0.9611074650114E1   0.96214051086752E1
+ 0.96317354180907E1   0.96420655909866E1   0.96523956427102E1   0.96627255534787E1   0.96730553088157E1
+ 0.96833849146805E1   0.96937143932231E1   0.97040437421034E1   0.97143729396883E1   0.97247019827397E1
+  0.973503087904E1   0.9745359647474E1   0.97556882788985E1   0.97660167533949E1   0.97763450726503E1
+ 0.97866732549506E1   0.9797001295398E1   0.98073291963053E1   0.98176569395225E1   0.98279845351723E1
+ 0.98383119784927E1   0.98486392772661E1   0.98589664360097E1   0.98692934380428E1   0.98796202937058E1
+ 0.98899469882501E1   0.99002735363427E1   0.99105999479156E1   0.99209262080571E1   0.99312523050935E1
+ 0.9941578243569E1   0.99519040352119E1   0.99622296933556E1   0.99725551920949E1   0.99828805237562E1
+ 0.99932056949247E1   0.10003530722825E2   0.10013855618016E2   0.10024180341584E2   0.10034504899489E2
+ 0.10044829298425E2   0.10055153555617E2   0.10065477669514E2   0.10075801611516E2   0.10086125387393E2
+ 0.10096449007212E2   0.10106772479437E2   0.10117095802924E2   0.10127418954708E2   0.10137741943005E2
+ 0.10148064775081E2   0.10158387448434E2   0.10168709974926E2   0.10179032330695E2   0.10189354525126E2
+ 0.10199676554875E2   0.10209998421817E2   0.1022032014141E2   0.10230641695912E2   0.10240963086002E2
+ 0.10251284302428E2   0.10261605356757E2   0.10271926264307E2   0.10282247010167E2   0.10292567582528E2
+ 0.10302887979837E2   0.10313208212898E2   0.10323528303753E2   0.10333848229189E2   0.10344167974568E2
+ 0.10354487546011E2   0.10364806952064E2   0.10375126218467E2   0.10385445312214E2   0.10395764226067E2
+ 0.10406082964297E2   0.10416401541572E2   0.10426719968694E2   0.10437038223351E2   0.1044735629765E2
+ 0.10457674199375E2   0.10467991938348E2   0.10478309514896E2   0.10488626923088E2   0.10498944148528E2
+ 0.10509261207243E2   0.10519578092187E2   0.10529894810705E2   0.10540211363887E2   0.10550527743814E2
+ 0.10560843950867E2   0.10571159976475E2   0.1058147583348E2   0.10591791527653E2   0.10602107054094E2
+ 0.10612422400287E2   0.10622737563484E2   0.10633052551847E2   0.10643367384289E2   0.10653682047449E2
+ 0.10663996525408E2   0.10674310818874E2   0.10684624936091E2   0.10694938896762E2   0.10705252690218E2
+ 0.10715566294936E2   0.10725879714426E2   0.10736192956471E2   0.10746506037696E2   0.10756818954346E2
+ 0.10767131679374E2   0.10777444219555E2   0.10787756583869E2   0.10798068778056E2   0.10808380808459E2
+ 0.10818692651157E2   0.10829004306396E2   0.1083931578936E2   0.10849627089408E2    0.108599382211E2
+ 0.10870249165522E2   0.10880559929533E2   0.10890870513732E2   0.10901180909709E2   0.10911491138172E2
+ 0.10921801188319E2   0.10932111061266E2   0.1094242074757E2   0.10952730244945E2   0.10963039566316E2
+ 0.10973348718542E2   0.10983657692505E2   0.10993966476479E2   0.11004275068721E2   0.11014583480442E2
+ 0.11024891725957E2   0.11035199797971E2   0.11045507673901E2   0.11055815359296E2   0.11066122857803E2
+ 0.11076430191381E2   0.1108673735478E2   0.11097044310801E2   0.1110735107158E2   0.11117657648627E2
+ 0.11127964053834E2   0.11138270285107E2   0.11148576325191E2   0.11158882171313E2   0.11169187834139E2
+ 0.11179493314377E2   0.11189798618693E2   0.11200103740284E2   0.11210408668375E2   0.11220713410857E2
+ 0.11231017966832E2   0.11241322335403E2   0.1125162653382E2   0.11261930538873E2    0.112722343618E2
+ 0.11282537983635E2   0.11292841405902E2   0.11303144658668E2   0.11313447727078E2   0.11323750607185E2
+ 0.11334053290825E2   0.1134435577887E2   0.11354658088789E2   0.11364960226269E2   0.11375262175093E2
+ 0.11385563924049E2   0.11395865477599E2   0.11406166844997E2   0.11416468042868E2   0.11426769056436E2
+ 0.11437069869075E2   0.11447370478036E2   0.11457670885633E2   0.11467971126561E2   0.11478271182559E2
+ 0.11488571039207E2   0.11498870698573E2   0.11509170169091E2   0.11519469454898E2   0.11529768559586E2
+ 0.11540067475863E2   0.11550366191863E2   0.11560664715724E2   0.11570963054466E2   0.11581261199734E2
+ 0.11591559169108E2   0.11601856921852E2   0.1161215448711E2   0.11622451855738E2   0.1163274902722E2
+ 0.11643046021582E2   0.11653342828349E2   0.11663639441697E2   0.11673935859886E2   0.11684232078097E2
+ 0.1169452810455E2   0.11704823955571E2   0.11715119622181E2   0.11725415085494E2   0.11735710327823E2
+ 0.11746005374421E2   0.11756300245614E2   0.11766594933429E2   0.11776889422764E2   0.11787183709211E2
+ 0.11797477795247E2   0.11807771695891E2   0.1181806542162E2   0.11828358953359E2   0.11838652279679E2
+ 0.1184894540575E2   0.11859238323845E2   0.11869531057066E2   0.11879823604405E2   0.11890115950951E2
+ 0.1190040809431E2   0.11910700045339E2   0.11920991806786E2   0.11931283379005E2   0.11941574762921E2
+ 0.11951865943432E2   0.11962156931422E2   0.11972447713639E2   0.11982738281649E2   0.11993028675396E2
+ 0.12003318868922E2   0.1201360886873E2   0.12023898670957E2   0.12034188270812E2   0.12044477677738E2
+ 0.12054766902538E2   0.12065055935199E2   0.12075344769325E2   0.12085633380317E2   0.12095921783442E2
+ 0.12106210003979E2   0.12116498043042E2   0.12126785882238E2   0.12137073516015E2   0.12147360946985E2
+ 0.12157648182659E2   0.12167935238384E2   0.12178222109752E2   0.12188508758993E2   0.12198795189183E2
+ 0.12209081419749E2   0.12219367467809E2   0.12229653330451E2   0.12239938994258E2   0.12250224451967E2
+ 0.1226050970812E2   0.12270794770175E2   0.12281079639736E2   0.12291364313239E2   0.12301648768425E2
+ 0.12311933019009E2   0.12322217078868E2   0.12332500939566E2   0.1234278460701E2   0.12353068085606E2
+ 0.12363351363164E2   0.12373634442161E2   0.12383917314106E2   0.12394199963326E2   0.12404482426147E2
+ 0.12414764692666E2   0.12425046766365E2   0.12435328639978E2   0.1244561030654E2   0.12455891772744E2
+ 0.1246617305168E2   0.12476454140952E2   0.12486735003716E2   0.12497015659265E2   0.12507296111001E2
+ 0.12517576365373E2   0.1252785643702E2   0.12538136322405E2   0.12548415998698E2   0.12558695466524E2
+ 0.1256897471587E2   0.12579253760478E2   0.12589532627585E2   0.12599811290797E2   0.1261008974636E2
+ 0.12620367996993E2   0.12630646048085E2   0.1264092391169E2   0.1265120159238E2   0.12661479034808E2
+ 0.12671756268387E2   0.12682033303977E2   0.12692310142801E2   0.12702586788615E2   0.12712863241146E2
+ 0.12723139492639E2   0.12733415539366E2   0.12743691370525E2   0.12753966985707E2   0.12764242408368E2
+ 0.12774517637719E2   0.12784792668836E2   0.12795067500003E2   0.12805342131302E2   0.12815616555277E2
+ 0.12825890756283E2   0.12836164764631E2   0.12846438578963E2   0.12856712188038E2   0.12866985589736E2
+ 0.12877258786967E2   0.12887531787079E2   0.12897804613038E2   0.12908077205278E2   0.12918349585678E2
+ 0.12928621758644E2   0.12938893726818E2   0.12949165508104E2   0.12959437109197E2   0.12969708504543E2
+ 0.12979979678444E2   0.12990250622408E2   0.13000521367266E2   0.13010791925536E2   0.13021062292536E2
+ 0.13031332457329E2   0.13041602413166E2   0.13051872162685E2   0.13062141691112E2   0.1307241101861E2
+ 0.13082680153179E2   0.1309294908467E2   0.13103217811259E2   0.13113486338388E2   0.13123754668098E2
+ 0.13134022770811E2   0.13144290677167E2   0.13154558376797E2   0.13164825875607E2   0.1317509317474E2
+ 0.13185360270387E2   0.13195627162383E2   0.13205893853531E2   0.13216160322717E2   0.13226426594429E2
+ 0.13236692659879E2   0.13246958518495E2   0.13257224178032E2   0.13267489649294E2   0.13277754915137E2
+ 0.1328801995156E2   0.1329828478115E2   0.13308549404395E2   0.13318813828181E2   0.13329078063882E2
+ 0.13339342119525E2   0.13349605938021E2   0.13359869528621E2   0.13370132915435E2   0.13380396106273E2
+ 0.13390659110195E2   0.13400921926223E2   0.13411184532424E2   0.13421446895327E2   0.13431709044567E2
+ 0.13441971001802E2   0.13452232771824E2   0.13462494347447E2   0.13472755715665E2   0.13483016867716E2
+ 0.13493277789041E2   0.13503538510607E2   0.13513799037911E2   0.13524059370708E2   0.13534319503474E2
+ 0.13544579429052E2   0.13554839131878E2   0.13565098615244E2   0.13575357900239E2   0.13585616991679E2
+ 0.13595875887769E2   0.13606134582929E2   0.13616393068072E2   0.13626651309809E2   0.13636909348277E2
+ 0.13647167200074E2   0.13657424863025E2   0.13667682325291E2   0.13677939580479E2   0.13688196586546E2
+ 0.13698453384854E2   0.13708709996084E2   0.13718966420236E2   0.13729222647104E2   0.13739478663765E2
+ 0.13749734437972E2   0.13759989996257E2   0.13770245370048E2   0.13780500554993E2   0.13790755540478E2
+ 0.13801010317251E2   0.13811264860006E2   0.13821519179492E2   0.13831773310675E2   0.13842027254371E2
+ 0.13852281001737E2   0.13862534539439E2   0.13872787843123E2   0.13883040930069E2   0.13893293818779E2
+ 0.13903546516874E2   0.13913799022175E2   0.13924051322031E2   0.13934303387052E2   0.13944555237512E2
+ 0.13954806885654E2   0.13965058339507E2   0.1397530960084E2   0.13985560661216E2   0.1399581148703E2
+ 0.14006062098963E2   0.1401631250613E2   0.14026562713429E2   0.14036812727935E2   0.14047062552233E2
+ 0.14057312136935E2   0.14067561506668E2   0.14077810672178E2   0.14088059636052E2   0.14098308404956E2
+ 0.14108556988551E2   0.14118805326835E2   0.14129053458176E2   0.14139301383119E2   0.14149549103977E2
+ 0.14159796628095E2   0.14170043959966E2   0.14180291057002E2   0.14190537946687E2   0.14200784631878E2
+ 0.14211031114889E2   0.14221277397488E2   0.14231523463348E2   0.14241769320632E2   0.14252014972743E2
+ 0.14262260418591E2   0.1427250566185E2   0.14282750698575E2   0.14292995580331E2   0.14303240948491E2
+ 0.14313486891491E2   0.14323733434775E2   0.14333980579295E2   0.1434422845825E2   0.14354476979667E2
+ 0.14364726110619E2   0.14374975840902E2   0.14385226157047E2   0.14395477107897E2   0.14405728776993E2
+ 0.14415981025011E2   0.1442623385889E2   0.14436487279991E2   0.14446741280968E2   0.14456996015019E2
+ 0.1446725133466E2   0.1447750722057E2   0.1448776367411E2   0.14498020698953E2   0.14508278395917E2
+ 0.1451853673167E2   0.14528795622399E2   0.14539055063886E2   0.14549315054092E2   0.14559575640499E2
+ 0.14569836930185E2   0.14580098767364E2   0.14590361143057E2   0.14600624054134E2   0.14610887509983E2
+ 0.14621151662716E2   0.14631416373011E2   0.14641681624405E2   0.14651947404924E2   0.14662213708583E2
+ 0.14672480676199E2   0.14682748192398E2   0.14693016243572E2   0.14703284827002E2   0.14713553931938E2
+ 0.14723823664777E2   0.14734093952592E2   0.14744364756472E2   0.14754636073559E2   0.14764907899635E2
+ 0.14775180355655E2   0.14785453367603E2   0.14795726875752E2   0.14806000884182E2   0.14816275396023E2
+ 0.14826550495767E2   0.1483682616763E2   0.14847102331339E2   0.14857378985126E2   0.1486765612899E2
+ 0.1487793385096E2   0.14888212118246E2   0.14898490870576E2   0.14908770109445E2   0.1491904983295E2
+ 0.14929330133608E2   0.14939610965433E2   0.14949892263389E2   0.14960174026932E2   0.14970456258648E2
+ 0.14980739088606E2   0.14991022436533E2   0.15001306239298E2   0.15011590493909E2   0.15021875201182E2
+ 0.1503216049037E2   0.1504244628569E2   0.15052732539114E2   0.15063019240438E2   0.15073306383675E2
+ 0.15083594116991E2   0.15093882297391E2   0.15104170930724E2   0.15114460019168E2   0.1512474957524E2
+ 0.15135039690642E2   0.1514533023408E2   0.15155621210722E2   0.15165912622748E2   0.1517620452417E2
+ 0.1518649696914E2   0.15196789835207E2   0.15207083118968E2   0.15217376820969E2   0.15227671044612E2
+ 0.15237965744047E2   0.15248260867163E2   0.15258556410559E2   0.15268852366072E2   0.15279148866629E2
+ 0.15289445797263E2   0.1529974313389E2   0.1531004087243E2   0.15320339055196E2   0.1533063776872E2
+ 0.1534093688198E2   0.15351236392934E2   0.15361536300359E2   0.15371836688744E2   0.15382137527615E2
+ 0.1539243876867E2   0.15402740411094E2   0.15413042448218E2   0.15423345012292E2   0.15433647956644E2
+ 0.15443951279916E2   0.15454254985644E2   0.15464559150292E2   0.15474863791411E2   0.15485168803422E2
+ 0.15495474184012E2   0.15505779934404E2   0.15516086178683E2   0.1552639282297E2   0.15536699848352E2
+ 0.1554700724966E2   0.15557315058051E2   0.15567623316246E2   0.15577931933631E2   0.15588240914697E2
+ 0.15598550264477E2   0.15608860111002E2   0.15619170327601E2   0.15629480894003E2   0.15639791810616E2
+ 0.15650103130093E2   0.15660414894069E2   0.15670727012473E2   0.15681039482312E2   0.15691352299505E2
+ 0.15701665584462E2   0.15711979222215E2   0.15722293202014E2   0.15732607520732E2   0.15742922249798E2
+ 0.15753237393158E2   0.15763552869721E2   0.15773868678127E2   0.15784184844227E2   0.15794501449246E2
+ 0.15804818380939E2   0.15815135644339E2   0.15825453242983E2   0.15835771276329E2   0.15846089663287E2
+ 0.15856408368347E2   0.15866727387698E2   0.15877046780253E2     0.15887366572E2   0.15897686691781E2
+ 0.15908007133063E2   0.15918327900883E2   0.15928649086126E2   0.15938970578177E2   0.15949292375676E2
+ 0.15959614479303E2   0.15969937037905E2   0.15980259912024E2   0.15990583081385E2   0.16000906545175E2
+ 0.16011230382304E2   0.1602155457223E2   0.16031879072637E2   0.16042203881078E2   0.16052529026667E2
+ 0.16062854541108E2   0.16073180343581E2   0.16083506436127E2   0.16093832838884E2   0.1610415964641E2
+ 0.16114486749452E2   0.16124814138621E2   0.16135141803851E2   0.16145469863917E2   0.16155798220997E2
+ 0.16166126858761E2   0.1617645577245E2   0.16186785074581E2   0.16197114677398E2   0.16207444553281E2
+ 0.16217774702776E2   0.1622810520248E2   0.16238436015797E2   0.16248767100955E2   0.16259098459451E2
+ 0.16269430150607E2   0.16279762171838E2   0.16290094456066E2   0.16300427000844E2   0.16310759846988E2
+ 0.16321093027696E2   0.16331426478205E2   0.16341760197426E2   0.16352094213116E2   0.16362428562282E2
+ 0.16372763158799E2   0.16383098004028E2   0.16393433125045E2   0.16403768608246E2   0.16414104348322E2
+ 0.16424440337791E2   0.16434776584135E2   0.16445113171302E2   0.1645544999793E2   0.16465787069188E2
+ 0.16476124405893E2   0.16486462107367E2   0.16496800040818E2   0.1650713820475E2   0.16517476610318E2
+ 0.16527815356302E2   0.1653815434297E2   0.16548493571004E2    0.165588330536E2   0.16569172867903E2
+ 0.16579512906292E2   0.16589853169583E2   0.16600193671791E2   0.16610534509242E2   0.16620875577175E2
+ 0.16631216873411E2   0.16641558413053E2   0.1665190026236E2   0.16662242334801E2   0.16672584628879E2
+ 0.16682927165139E2   0.16693270000588E2   0.16703613065156E2   0.16713956352178E2   0.16724299878117E2
+ 0.16734643700795E2   0.16744987733137E2   0.16755331973238E2   0.16765676460283E2     0.16776021234E2
+ 0.16786366218469E2   0.16796711413146E2   0.16807056873407E2   0.16817402584556E2   0.16827748493533E2
+ 0.16838094601561E2   0.16848440977212E2   0.16858787615727E2   0.16869134456829E2   0.16879481493038E2
+ 0.16889828797007E2   0.16900176320572E2   0.16910524035433E2   0.1692087194227E2   0.16931220161222E2
+ 0.16941568586029E2   0.16951917198866E2   0.16962265999598E2   0.16972615078294E2   0.16982964344205E2
+ 0.16993313801548E2   0.17003663483521E2   0.17014013435976E2   0.17024363566801E2    0.170347138745E2
+ 0.17045064404652E2   0.17055415231817E2   0.17065766651646E2    0.170761187987E2   0.17086472023734E2
+ 0.17096826161982E2   0.17107181063646E2   0.17117536726956E2   0.17127893544575E2   0.17138251171052E2
+ 0.17148609556864E2   0.17158968757385E2   0.17169329093301E2   0.17179690175354E2   0.17190052003544E2
+ 0.17200414747805E2   0.17210778490997E2   0.17221142971754E2   0.17231508191029E2   0.17241874442159E2
+ 0.17252241565279E2   0.17262609419569E2   0.17272978006254E2   0.17283347706974E2   0.17293718149069E2
+ 0.17304089311313E2   0.17314461300375E2   0.17324834335988E2   0.17335208082227E2   0.17345582534601E2
+ 0.17355957919238E2   0.17366334190831E2   0.17376711162437E2   0.1738708883392E2   0.1739746759726E2
+ 0.17407847101703E2   0.17418227293234E2   0.17428608257841E2   0.17438990226004E2   0.17449372876765E2
+ 0.17459756213525E2   0.1747014048976E2   0.17480525618527E2   0.17490911416695E2   0.17501297880725E2
+ 0.17511685396068E2   0.17522073603533E2   0.17532462478358E2   0.17542852152109E2   0.17553242780573E2
+ 0.17563634063606E2   0.17574025996856E2   0.17584418858559E2   0.17594812498236E2   0.17605206788673E2
+ 0.17615601766335E2   0.17625997764287E2   0.17636394401708E2   0.17646791676556E2   0.17657189791556E2
+ 0.17667588741945E2   0.17677988323231E2   0.17688388532012E2   0.17698789746118E2   0.17709191619829E2
+ 0.17719594119946E2   0.1772999738307E2   0.17740401521585E2   0.17750806275622E2   0.17761211641372E2
+ 0.17771617934622E2   0.17782024921218E2   0.17792432523064E2   0.17802840844108E2   0.17813250053739E2
+ 0.17823659859301E2   0.17834070258615E2   0.17844481545429E2   0.17854893527766E2   0.17865306110795E2
+ 0.17875719389484E2   0.17886133552271E2   0.17896548296837E2   0.17906963621687E2   0.17917379801655E2
+ 0.17927796665989E2   0.17938214117546E2   0.17948632255238E2   0.1795905126043E2   0.17969470830938E2
+ 0.17979890965539E2   0.17990311945053E2   0.18000733590295E2   0.18011155803574E2   0.18021578689383E2
+ 0.18032002424461E2   0.18042426713154E2   0.18052851552197E2   0.18063277238059E2   0.18073703552369E2
+ 0.1808413041839E2   0.18094557966736E2   0.18104986319452E2   0.18115415214219E2   0.18125844646819E2
+ 0.18136274948006E2   0.18146705828253E2   0.1815713724538E2   0.18167569367283E2   0.18178002222805E2
+ 0.18188435613031E2   0.18198869552111E2   0.18209304364133E2   0.18219739702423E2   0.1823017556426E2
+ 0.18240612172506E2   0.18251049433962E2   0.18261487214884E2   0.18271925599082E2   0.18282364781526E2
+ 0.18292804477722E2   0.18303244686037E2   0.18313685689196E2   0.18324127257672E2   0.18334569329287E2
+ 0.18345012067173E2   0.18355455519087E2   0.18365899470737E2   0.18376343938724E2   0.18386789232169E2
+ 0.18397235013106E2   0.18407681280855E2   0.18418128279638E2   0.18428575895304E2   0.18439024004176E2
+ 0.1844947271442E2   0.1845992213393E2   0.18470372027053E2   0.18480822393111E2   0.18491273581226E2
+ 0.18501725260097E2   0.18512177420203E2   0.18522630282907E2   0.18533083733785E2   0.18543537646985E2
+ 0.18553992128903E2   0.1856444731029E2   0.18574902957129E2   0.18585359070642E2    0.185958160039E2
+ 0.18606273391723E2   0.18616731228943E2   0.18627189745087E2   0.18637648825868E2   0.18648108358222E2
+ 0.18658568469499E2   0.18669029244325E2   0.18679490467868E2   0.18689952165433E2   0.18700414613217E2
+ 0.1871087749992E2   0.18721340824727E2   0.18731804852268E2   0.18742269385261E2   0.18752734353364E2
+ 0.18763199934949E2   0.18773666108245E2   0.18784132710393E2   0.18794599821802E2   0.18805067611047E2
+ 0.18815535819348E2   0.18826004445752E2   0.1883647381734E2   0.18846943626759E2   0.18857413860405E2
+ 0.18867884747396E2   0.18878356136165E2   0.18888827933377E2   0.18899300292233E2   0.18909773230827E2
+ 0.18920246581266E2   0.18930720423143E2   0.18941194933332E2   0.1895166984244E2   0.18962145147202E2
+ 0.18972621164358E2   0.18983097579345E2   0.18993574391074E2   0.19004051856557E2   0.19014529803138E2
+ 0.19025008146188E2    0.190354870468E2   0.19045966475586E2   0.1905644628846E2   0.19066926593453E2
+ 0.19077407495872E2   0.19087888789455E2   0.19098370522229E2   0.19108852905084E2    0.191193356606E2
+ 0.1912981878755E2   0.19140302582405E2   0.19150786773866E2   0.19161271343837E2   0.19171756524432E2
+ 0.19182242155512E2   0.19192728157483E2   0.19203214703138E2   0.19213701738463E2   0.19224189137875E2
+ 0.19234677033216E2   0.19245165467206E2   0.1925565426406E2   0.19266143504868E2   0.19276633331538E2
+ 0.19287123510867E2   0.19297614070204E2   0.19308105267104E2   0.19318596811085E2   0.1932908870065E2
+ 0.19339581222337E2   0.19350074118181E2   0.19360567367772E2   0.19371061202273E2   0.19381555439366E2
+ 0.19392050016466E2   0.19402545124596E2   0.19413040671646E2   0.19423536558159E2   0.19434032947401E2
+ 0.19444529818422E2   0.19455027025368E2   0.19465524685383E2   0.19476022843367E2   0.19486521326255E2
+ 0.19497020219491E2   0.19507519644982E2   0.19518019409255E2   0.19528519574488E2   0.19539020290207E2
+ 0.19549521321851E2   0.19560022693093E2   0.19570524645979E2   0.19581026913701E2   0.19591529495714E2
+ 0.19602032701004E2   0.19612536225485E2   0.19623040064529E2   0.19633544463855E2   0.19644049197066E2
+ 0.19654554235588E2    0.196650598114E2   0.19675565753341E2   0.19686072007397E2   0.19696578787177E2
+ 0.19707085936351E2   0.19717593382539E2   0.19728101312272E2   0.19738609634258E2   0.1974911825489E2
+ 0.19759627342877E2   0.19770136837946E2   0.19780646630708E2   0.19791156877629E2   0.1980166753272E2
+ 0.19812178475436E2   0.19822689845235E2   0.19833201644158E2    0.198437137288E2   0.19854226217396E2
+ 0.19864739150082E2   0.19875252368759E2   0.1988576598173E2   0.19896280037566E2   0.19906794372183E2
+ 0.19917309085039E2   0.19927824235453E2   0.19938339662336E2   0.19948855463239E2   0.19959371720886E2
+ 0.19969888254864E2   0.19980405151979E2   0.19990922490871E2   0.20001440096026E2   0.20011958049623E2
+ 0.20022476444997E2    0.200329951099E2   0.2004351412964E2   0.20054033611021E2   0.20064553352952E2
+ 0.20075073426453E2   0.2008559393384E2   0.20096114698375E2   0.20106635799242E2   0.20117157338894E2
+ 0.20127679143857E2   0.20138201301615E2   0.20148723881967E2   0.20159246710622E2   0.20169769868672E2
+ 0.2018029344292E2   0.20190817266016E2   0.20201341427077E2   0.20211866017807E2   0.20222390858201E2
+ 0.20232916037378E2   0.20243441610575E2   0.20253967423369E2   0.20264493574808E2   0.20275020120405E2
+ 0.20285546907231E2   0.20296074041818E2   0.20306601564304E2   0.20317129325978E2   0.20327657439224E2
+ 0.20338185908122E2   0.20348714609406E2   0.20359243675051E2   0.20369773088185E2   0.20380302732616E2
+ 0.20390832749162E2   0.20401363101906E2   0.20411893682817E2   0.20422424636797E2   0.20432955911327E2
+ 0.20443487412392E2   0.20454019295096E2   0.20464551469507E2   0.20475083865827E2   0.20485616678345E2
+ 0.20496149765698E2   0.20506683071831E2   0.20517216796476E2   0.20527750772689E2   0.20538284961424E2
+ 0.20548819572072E2   0.20559354416601E2   0.2056988947406E2   0.20580424992071E2   0.20590960725053E2
+ 0.20601496690556E2   0.20612033065183E2   0.20622569643487E2   0.20633106464244E2   0.20643643677118E2
+ 0.20654181101832E2   0.20664718804103E2   0.20675256882843E2   0.20685795161315E2   0.20696333718024E2
+ 0.20706872613106E2   0.20717411705063E2   0.20727951098386E2   0.2073849080709E2   0.20749030719742E2
+ 0.20759570982878E2   0.20770111522754E2   0.20780652252156E2   0.20791193322518E2   0.20801734645266E2
+ 0.20812276158901E2   0.20822818053224E2   0.20833360175442E2   0.20843902489773E2   0.20854445207785E2
+ 0.20864988116821E2   0.20875531229671E2   0.20886074713956E2   0.20896618384911E2   0.2090716229315E2
+ 0.2091770654466E2   0.20928250982297E2   0.20938795689598E2   0.20949340706021E2   0.20959885898638E2
+ 0.20970431371804E2   0.2098097713137E2   0.20991523069715E2   0.21002069317318E2   0.21012615804789E2
+ 0.21023162466822E2   0.21033709489133E2   0.21044256715938E2   0.2105480411227E2   0.21065351884527E2
+ 0.21075899825359E2   0.21086447961569E2   0.21096996436561E2   0.21107545080944E2   0.21118093960297E2
+  0.211286431485E2   0.21139192504733E2   0.21149742127638E2   0.21160292007418E2   0.21170842045977E2
+ 0.21181392372432E2   0.21191942922566E2   0.21202493634062E2   0.21213044695226E2   0.21223595944828E2
+ 0.21234147361644E2   0.21244699109351E2   0.21255251011211E2   0.21265803110897E2   0.21276355509093E2
+ 0.21286908063481E2   0.21297460858691E2   0.21308013929961E2   0.21318567155927E2   0.21329120644619E2
+ 0.21339674347057E2   0.2135022819494E2   0.21360782339971E2   0.21371336670584E2   0.21381891160656E2
+ 0.21392445988693E2   0.21403000961495E2   0.21413556124233E2   0.2142411156235E2   0.21434667141558E2
+ 0.2144522294526E2    0.214557789906E2   0.21466335177983E2   0.21476891628908E2   0.21487448288681E2
+ 0.21498005095123E2   0.21508562191367E2   0.21519119437681E2   0.21529676842366E2   0.21540234542159E2
+ 0.21550792376647E2   0.2156135040978E2   0.21571908688359E2   0.21582467102314E2   0.21593025760901E2
+ 0.21603584616089E2   0.2161414360162E2   0.21624702869742E2   0.21635262288206E2   0.2164582184749E2
+ 0.21656381686507E2   0.21666941658315E2   0.21677501824549E2   0.21688062225617E2   0.21698622753082E2
+ 0.21709183510347E2   0.21719744455644E2   0.21730305521895E2   0.21740866844613E2   0.21751428311279E2
+ 0.2176198991618E2   0.21772551811698E2   0.2178311382926E2   0.21793676028865E2   0.21804238439087E2
+ 0.21814800963597E2   0.21825363704437E2   0.21835926617662E2   0.21846489646943E2   0.21857052947386E2
+ 0.21867616383206E2   0.2187817997277E2   0.21888743795399E2   0.21899307727147E2   0.21909871838897E2
+ 0.21920436139904E2   0.2193100055098E2   0.21941565190904E2   0.21952129992736E2   0.21962694922053E2
+ 0.21973260098722E2   0.21983825378658E2   0.21994390809889E2   0.22004956446567E2   0.22015522189369E2
+ 0.22026088133535E2   0.22036654239338E2    0.220472204514E2   0.22057786919386E2   0.22068353497578E2
+ 0.22078920207473E2   0.22089487122543E2   0.2210005413843E2   0.22110621335273E2   0.22121188701371E2
+ 0.22131756168288E2   0.22142323857793E2   0.22152891669886E2   0.22163459603886E2   0.22174027748367E2
+ 0.22184595989719E2   0.22195164396245E2   0.22205732968897E2   0.22216301634476E2   0.22226870497065E2
+ 0.22237439491221E2   0.22248008602386E2   0.22258577923895E2   0.22269147337107E2   0.22279716902431E2
+ 0.22290286630886E2   0.22300856447779E2   0.22311426452975E2   0.22321996575452E2   0.22332566798339E2
+ 0.22343137241774E2   0.22353707776368E2   0.22364278461985E2   0.22374849298081E2   0.22385420215539E2
+ 0.22395991310687E2   0.2240656251713E2   0.22417133823031E2   0.22427705331112E2   0.22438276928039E2
+ 0.22448848679118E2   0.22459420570744E2   0.22469992540195E2   0.22480564688288E2   0.22491136933662E2
+ 0.22501709276045E2   0.22512281795846E2   0.22522854402452E2   0.22533427173959E2   0.22544000075264E2
+ 0.22554573051264E2   0.22565146200329E2   0.22575719434157E2   0.22586292769892E2   0.22596866268352E2
+ 0.22607439843547E2   0.22618013573711E2   0.2262858742796E2   0.2263916135976E2   0.22649735469932E2
+ 0.22660309649629E2   0.22670883938851E2   0.22681458365763E2   0.22692032862745E2   0.22702607518777E2
+ 0.22713182276716E2   0.22723757121187E2   0.22734332133417E2   0.22744907210001E2   0.22755482401553E2
+ 0.22766057714741E2   0.22776633095277E2   0.22787208640441E2   0.22797784258124E2   0.22808359966013E2
+ 0.22818935824653E2   0.22829511749689E2   0.22840087809694E2   0.22850663963169E2   0.22861240184537E2
+ 0.22871816564411E2   0.22882393004015E2   0.22892969549471E2   0.22903546204316E2   0.22914122919027E2
+ 0.2292469979823E2   0.22935276747367E2   0.22945853780723E2   0.22956430945239E2   0.22967008166081E2
+ 0.22977585502572E2   0.22988162921378E2   0.22998740402362E2    0.230093180326E2   0.23019895723928E2
+ 0.23030473530768E2   0.23041051434073E2   0.23051629389623E2   0.23062207474564E2   0.23072785618417E2
+ 0.23083363845673E2   0.23093942178102E2   0.23104520563456E2   0.23115099085276E2   0.2312567768356E2
+ 0.23136256354634E2   0.2314683513537E2   0.23157413961958E2   0.23167992884465E2   0.23178571885614E2
+  0.231891509386E2   0.23199730127235E2   0.23210309369613E2   0.23220888712809E2   0.23231468138591E2
+ 0.23242047607776E2   0.23252627191656E2   0.23263206824382E2   0.23273786528401E2   0.23284366330245E2
+ 0.23294946177804E2   0.23305526136794E2   0.23316106160683E2   0.23326686254913E2   0.23337266439213E2
+ 0.23347846661882E2   0.23358426972579E2   0.23369007351168E2   0.23379587786494E2   0.23390168322773E2
+ 0.23400748899734E2   0.23411329563499E2   0.23421910297742E2   0.23432491078108E2   0.23443071958476E2
+ 0.23453652876939E2   0.23464233871323E2   0.23474814932374E2   0.23485396028665E2   0.23495977227406E2
+  0.235065584671E2   0.23517139781354E2   0.23527721164044E2   0.23538302581157E2   0.23548884097863E2
+ 0.23559465651985E2   0.23570047262979E2   0.23580628939689E2   0.23591210647011E2   0.23601792437328E2
+ 0.23612374277306E2   0.23622956183271E2   0.23633538162436E2   0.23644120172621E2   0.23654702254644E2
+ 0.23665284373539E2   0.23675866536244E2   0.23686448767522E2   0.2369703102846E2   0.23707613366134E2
+ 0.23718195753741E2   0.23728778196044E2   0.2373936070134E2   0.23749943231807E2   0.23760525822548E2
+ 0.23771108448391E2   0.23781691110425E2   0.23792273834773E2   0.23802856589326E2   0.23813439431228E2
+ 0.23824022309049E2   0.23834605222788E2   0.23845188188638E2   0.23855771176256E2   0.23866354220747E2
+ 0.23876937297619E2   0.23887520406737E2   0.23898103580345E2   0.23908686780349E2   0.23919270049469E2
+ 0.23929853348658E2   0.23940436679141E2   0.23951020053569E2   0.2396160344623E2   0.23972186886782E2
+ 0.23982770362029E2   0.23993353875372E2   0.24003937434838E2   0.24014521014713E2   0.24025104655677E2
+ 0.24035688318003E2   0.24046272005499E2   0.2405685573422E2   0.24067439480764E2   0.24078023281051E2
+ 0.2408860709957E2   0.24099190942579E2   0.24109774829671E2   0.24120358735674E2   0.24130942694331E2
+ 0.24141526667683E2   0.24152110663484E2   0.24162694697653E2   0.24173278748421E2   0.24183862838374E2
+ 0.24194446940571E2   0.24205031064946E2   0.2421561522456E2   0.2422619940118E2   0.2423678362338E2
+ 0.24247367859186E2   0.24257952124652E2   0.24268536406581E2   0.24279120698442E2   0.24289705017786E2
+ 0.24300289347471E2   0.24310873702327E2   0.24321458085618E2   0.24332042490951E2   0.24342626928529E2
+ 0.24353211374678E2   0.24363795838243E2   0.24374380312557E2   0.24384964797483E2   0.2439554929928E2
+ 0.24406133808152E2   0.24416718339745E2   0.24427302896101E2   0.24437887485383E2   0.24448472081195E2
+ 0.24459056679729E2   0.24469641287378E2   0.2448022590115E2   0.24490810526079E2    0.245013951623E2
+ 0.24511979804508E2   0.24522564478145E2   0.24533149158448E2   0.24543733853446E2   0.24554318553887E2
+ 0.24564903258272E2   0.24575487964291E2   0.24586072671806E2   0.2459665738558E2   0.24607242109286E2
+ 0.24617826843604E2   0.24628411591392E2   0.24638996343398E2   0.24649581100574E2   0.24660165856118E2
+ 0.24670750609076E2   0.24681335365163E2   0.24691920122611E2   0.24702504887679E2   0.24713089651249E2
+ 0.24723674410602E2   0.24734259178663E2   0.24744843953662E2   0.24755428724716E2   0.24766013493593E2
+ 0.24776598254306E2   0.24787183014612E2   0.24797767774373E2   0.24808352528283E2   0.24818937279881E2
+ 0.24829522020458E2   0.2484010676294E2   0.2485069150964E2   0.24861276247359E2   0.24871860979637E2
+ 0.24882445708241E2   0.24893030431811E2   0.24903615135516E2   0.24914199829426E2   0.24924784512587E2
+ 0.2493536919085E2   0.24945953867344E2   0.24956538537988E2   0.24967123203053E2   0.2497770785737E2
+ 0.24988292494136E2   0.24998877120289E2   0.25009461723584E2   0.25020046318988E2   0.25030630890855E2
+ 0.25041215457279E2   0.25051800017716E2   0.25062384572984E2   0.25072969125258E2   0.25083553640933E2
+ 0.25094138144907E2   0.25104722623574E2   0.25115307081561E2   0.25125891525125E2   0.25136475944744E2
+ 0.25147060359872E2   0.25157644768743E2   0.25168229160469E2   0.25178813529339E2   0.25189397869228E2
+ 0.25199982197144E2   0.25210566484515E2   0.25221150760185E2   0.25231735004427E2   0.25242319232613E2
+ 0.25252903446513E2   0.25263487645992E2   0.25274071837851E2   0.25284655979505E2    0.252952401032E2
+ 0.25305824193016E2   0.25316408255757E2   0.25326992301899E2   0.25337576314707E2   0.2534816031527E2
+ 0.25358744273383E2   0.25369328216803E2   0.25379912140357E2   0.2539049602636E2   0.25401079895628E2
+ 0.25411663708841E2   0.25422247509536E2   0.25432831275537E2   0.25443415012421E2   0.25453998719509E2
+ 0.25464582389726E2   0.25475166047153E2   0.25485749656961E2   0.25496333247992E2   0.25506916791812E2
+ 0.25517500309372E2   0.25528083805028E2   0.25538667245988E2   0.25549250669262E2   0.25559834027908E2
+ 0.25570417369819E2   0.25581000677988E2   0.25591583953095E2   0.25602167205208E2   0.25612750403851E2
+ 0.25623333584671E2   0.25633916696237E2   0.25644499783314E2   0.25655082827396E2   0.25665665824811E2
+ 0.25676248793518E2   0.25686831712972E2   0.25697414617868E2   0.25707997472559E2   0.25718580296229E2
+ 0.25729163069421E2   0.25739745788872E2   0.25750328477437E2   0.25760911095117E2   0.2577149369334E2
+ 0.25782076225848E2   0.25792658740261E2   0.25803241226645E2   0.2581382365575E2   0.25824406052473E2
+ 0.25834988368786E2   0.25845570663467E2   0.25856152885084E2   0.25866735073504E2   0.25877317208182E2
+ 0.25887899297144E2   0.25898481359303E2    0.259090633601E2   0.25919645340761E2   0.25930227237882E2
+ 0.25940809098813E2   0.2595139089743E2   0.25961972637678E2   0.25972554340646E2   0.2598313597994E2
+ 0.25993717599642E2   0.26004299136756E2   0.26014880644619E2   0.26025462093841E2   0.26036043486056E2
+ 0.26046624836228E2   0.26057206103814E2   0.26067787347726E2   0.26078368504562E2   0.26088949631465E2
+ 0.26099530685714E2   0.26110111693975E2   0.26120692661147E2   0.26131273552264E2   0.26141854419706E2
+ 0.26152435177623E2   0.26163015912682E2   0.26173596574134E2   0.26184177184973E2   0.26194757738668E2
+ 0.26205338213722E2   0.26215918655714E2   0.26226499008317E2   0.26237079337245E2   0.26247659579098E2
+ 0.26258239778908E2   0.26268819915317E2   0.26279399977166E2   0.26289979995068E2   0.26300559911472E2
+ 0.26311139801345E2   0.26321719588631E2   0.26332299345032E2   0.26342879033812E2   0.26353458661776E2
+ 0.26364038238309E2   0.26374617723821E2   0.26385197181712E2   0.26395776514976E2   0.26406355819668E2
+ 0.26416935025174E2   0.26427514176802E2   0.26438093260401E2   0.26448672286312E2   0.2645925128297E2
+ 0.26469830161668E2   0.26480409010976E2   0.26490987740419E2   0.2650156642782E2   0.26512145028961E2
+ 0.26522723558808E2   0.26533302029879E2   0.26543880411288E2   0.26554458765485E2   0.26565037008252E2
+ 0.26575615221631E2   0.26586193326163E2   0.26596771371784E2   0.26607349335906E2   0.26617927212135E2
+ 0.26628505037887E2   0.2663908275493E2   0.26649660444897E2   0.2666023802044E2   0.26670815559656E2
+ 0.26681393004857E2   0.26691970376995E2   0.2670254767335E2   0.26713124870926E2   0.26723702026734E2
+ 0.26734279058321E2   0.2674485606052E2   0.26755432937411E2   0.26766009769675E2   0.26776586512685E2
+ 0.26787163182769E2   0.26797739791356E2   0.26808316283205E2   0.26818892736006E2   0.26829469048804E2
+ 0.26840045332214E2   0.26850621497935E2   0.26861197606648E2   0.26871773617807E2   0.26882349549102E2
+ 0.26892925421076E2   0.26903501177129E2   0.26914076899984E2   0.26924652477258E2   0.26935228023103E2
+ 0.26945803442143E2   0.26956378799685E2   0.26966954058722E2   0.26977529225104E2   0.26988104325498E2
+ 0.26998679317319E2   0.27009254279343E2   0.27019829088167E2   0.2703040386529E2   0.27040978510982E2
+ 0.27051553094496E2   0.27062127576375E2   0.27072701962742E2   0.27083276278904E2   0.27093850465268E2
+ 0.27104424613399E2   0.27114998627106E2   0.27125572610745E2   0.27136146462272E2   0.27146720250669E2
+ 0.27157293923689E2   0.27167867500789E2   0.2717844099816E2   0.27189014372535E2   0.27199587703508E2
+ 0.27210160879104E2   0.27220734025856E2   0.27231307044442E2   0.27241880007245E2   0.27252452844875E2
+ 0.27263025594613E2   0.27273598255914E2   0.27284170792042E2   0.27294743271026E2   0.27305315595721E2
+ 0.27315887888307E2   0.27326460032047E2   0.27337032135242E2   0.2734760411272E2   0.27358176009108E2
+ 0.27368747798011E2   0.27379319471538E2   0.2738989107241E2   0.27400462529606E2   0.27411033950067E2
+ 0.27421605201816E2   0.27432176420913E2   0.2744274748817E2   0.27453318495561E2   0.2746388938676E2
+ 0.27474460179182E2   0.27485030880717E2   0.27495601446468E2   0.27506171953986E2   0.27516742302045E2
+ 0.27527312617451E2   0.27537882754622E2   0.27548452849343E2   0.27559022804742E2   0.27569592683133E2
+ 0.27580162449685E2   0.27590732100316E2   0.2760130166768E2   0.27611871097899E2   0.27622440483491E2
+ 0.27633009681053E2   0.27643578843784E2   0.27654147825014E2   0.27664716756992E2   0.2767528555754E2
+ 0.27685854271554E2   0.27696422877268E2   0.27706991361346E2   0.27717559769505E2   0.27728128016844E2
+ 0.27738696220373E2   0.27749264230429E2   0.27759832205655E2   0.27770399998019E2   0.27780967736505E2
+ 0.27791535340839E2   0.27802102856464E2   0.2781267026542E2   0.27823237545666E2   0.27833804746455E2
+ 0.27844371779078E2   0.27854938765441E2   0.2786550554799E2   0.27876072296526E2   0.27886638859207E2
+ 0.27897205372636E2   0.27907771753546E2   0.27918338041392E2   0.27928904207876E2   0.27939470242112E2
+ 0.27950036186006E2   0.27960601969897E2   0.27971167700999E2   0.27981733230191E2   0.27992298725097E2
+ 0.2800286402136E2   0.28013429275174E2   0.28023994384494E2   0.28034559407283E2   0.28045124290477E2
+ 0.28055689049859E2   0.28066253703116E2   0.28076818200997E2   0.2808738262976E2   0.28097946876752E2
+ 0.45437337287424E-5   0.45396580133992E-5   0.45355848227549E-5   0.45315141583465E-5   0.45274460393158E-5
+ 0.45233804551641E-5   0.45193175072177E-5   0.4515257203871E-5   0.45111997367094E-5   0.45071453352842E-5
+ 0.45030942353219E-5   0.4499046893577E-5   0.44950038522627E-5   0.44909658300168E-5   0.44869337400011E-5
+ 0.44829087205391E-5   0.44788921675136E-5   0.44748857684322E-5   0.44708915380713E-5   0.44669118556134E-5
+ 0.4462949503191E-5   0.44590077057561E-5   0.44550901721937E-5   0.44512011376023E-5   0.44473454066628E-5
+ 0.44435283980237E-5   0.44397561896285E-5   0.44360355649147E-5   0.44323740598168E-5   0.44287800105048E-5
+ 0.44252626017946E-5   0.4421831916165E-5   0.44184989833217E-5   0.44152758302471E-5   0.44121755316773E-5
+ 0.4409212260951E-5   0.44064013411737E-5   0.44037592966449E-5   0.44013039044952E-5   0.43990542464847E-5
+ 0.4397030760911E-5   0.43952552945822E-5   0.4393751154807E-5   0.43925431613575E-5   0.43916576983625E-5
+ 0.43911227660874E-5   0.43909680325625E-5   0.43912248850182E-5   0.43919264810905E-5   0.43931077997593E-5
+ 0.43948056919844E-5   0.43970589310041E-5   0.43999082622645E-5   0.44033964529458E-5   0.44075683410558E-5
+ 0.44124708840612E-5   0.44181532070258E-5   0.44246666502312E-5   0.44320648162501E-5   0.44404036164489E-5
+ 0.4449741316894E-5   0.4460138583638E-5   0.4471658527364E-5   0.44843667473649E-5   0.44983313748386E-5
+ 0.45136231154771E-5   0.45303152913325E-5   0.45484838819399E-5   0.45682075646814E-5   0.45895677543734E-5
+ 0.46126486420617E-5   0.46375372330106E-5   0.46643233838698E-5   0.46930998390078E-5   0.47239622659968E-5
+ 0.47570092902396E-5   0.47923425287253E-5   0.48300666229034E-5   0.48702892706682E-5   0.4913121257441E-5
+ 0.49586764863448E-5   0.50070720074612E-5   0.50584280461629E-5   0.51128680305151E-5   0.51705186177391E-5
+ 0.52315097197334E-5   0.52959745276452E-5   0.53640495354905E-5   0.54358745628162E-5   0.55115927764021E-5
+ 0.55913507109992E-5   0.56752982891025E-5   0.57635888397544E-5   0.58563791163798E-5   0.59538293136492E-5
+ 0.60561030833705E-5   0.61633675494085E-5   0.62757933216332E-5   0.63935545088961E-5   0.65168287310365E-5
+ 0.66457971299179E-5   0.67806443794982E-5   0.69215586949333E-5   0.70687318407179E-5   0.72223591378668E-5
+ 0.73826394701375E-5   0.75497752892999E-5   0.77239726194557E-5   0.79054410604113E-5   0.80943937901087E-5
+ 0.82910475661191E-5   0.84956227262046E-5   0.87083431879515E-5   0.89294364474822E-5   0.91591335772508E-5
+ 0.93976692229275E-5   0.96452815993795E-5   0.99022124857533E-5   0.10168707219665E-4   0.10445014690508E-4
+ 0.10731387331879E-4   0.11028081113137E-4   0.11335355530097E-4   0.11653473594871E-4   0.11982701824855E-4
+ 0.12323310230881E-4   0.12675572304537E-4   0.13039765004658E-4   0.13416168743009E-4   0.13805067369153E-4
+ 0.14206748154527E-4   0.14621501775726E-4   0.15049622297002E-4     0.15491407152E-4   0.15947157124726E-4
+ 0.16417176329757E-4   0.1690177219172E-4   0.17401255424021E-4   0.1791594000686E-4   0.18446143164529E-4
+ 0.18992185341994E-4    0.195543901808E-4   0.20133084494268E-4   0.20728598242032E-4   0.21341264503905E-4
+ 0.21971419453083E-4   0.22619402328712E-4   0.23285555407813E-4   0.23970223976581E-4   0.24673756301074E-4
+ 0.25396503597288E-4   0.26138820000645E-4   0.26901062534893E-4   0.27683591080427E-4   0.28486768342058E-4
+ 0.29310959816215E-4   0.30156533757613E-4   0.31023861145386E-4   0.31913315648692E-4   0.32825273591818E-4
+ 0.33760113918772E-4   0.34718218157394E-4   0.35699970382974E-4   0.36705757181417E-4   0.37735967611931E-4
+ 0.3879099316928E-4   0.3987122774559E-4   0.40977067591728E-4   0.42108911278268E-4   0.43267159656041E-4
+ 0.44452215816299E-4   0.45664485050478E-4   0.46904374809598E-4   0.4817229466329E-4   0.49468656258467E-4
+ 0.50793873277647E-4   0.52148361396947E-4   0.53532538243749E-4   0.54946823354041E-4   0.56391638129468E-4
+ 0.57867405794077E-4   0.59374551350775E-4   0.60913501537522E-4   0.62484684783247E-4   0.64088531163512E-4
+ 0.65725472355929E-4   0.67395941595343E-4   0.69100373628786E-4   0.7083920467021E-4   0.72612872355016E-4
+ 0.74421815694383E-4   0.76266475029412E-4   0.78147291985079E-4   0.8006470942403E-4   0.82019171400206E-4
+ 0.8401112311232E-4   0.86041010857188E-4   0.88109281982928E-4   0.90216384842028E-4   0.92362768744308E-4
+ 0.94548883909765E-4   0.96775181421319E-4   0.99042113177476E-4   0.1013501318449E-3   0.10369969081092E-3
+ 0.10609124413597E-3   0.10852524650594E-3   0.11100215318458E-3   0.1135224199657E-3   0.1160865031255E-3
+ 0.11869485937478E-3   0.12134794581116E-3   0.12404621987129E-3   0.12679013928306E-3   0.12958016201782E-3
+ 0.13241674624262E-3   0.13530035027246E-3   0.13823143252255E-3   0.14121045146066E-3   0.1442378655595E-3
+ 0.14731413324907E-3   0.15043971286923E-3   0.15361506262214E-3   0.15684064052496E-3   0.1601169043625E-3
+ 0.16344431163999E-3   0.16682331953598E-3   0.17025438485531E-3   0.17373796398217E-3   0.17727451283329E-3
+ 0.18086448681129E-3   0.18450834075806E-3   0.18820652890835E-3   0.19195950484349E-3   0.19576772144522E-3
+ 0.19963163084967E-3   0.20355168440157E-3   0.20752833260848E-3   0.21156202509534E-3   0.21565321055911E-3
+ 0.21980233672357E-3   0.22400985029434E-3   0.22827619691412E-3   0.23260182111806E-3   0.23698716628934E-3
+ 0.24143267461499E-3   0.24593878704191E-3   0.25050594323307E-3   0.25513458152397E-3   0.25982513887928E-3
+ 0.26457805084977E-3   0.26939375152942E-3   0.27427267351278E-3   0.27921524785259E-3   0.28422190401763E-3
+ 0.28929306985082E-3   0.29442917152758E-3   0.29963063351446E-3   0.30489787852801E-3   0.31023132749393E-3
+ 0.31563139950652E-3   0.3210985117883E-3   0.32663307965008E-3   0.33223551645112E-3   0.33790623355976E-3
+ 0.34364564031419E-3   0.34945414398357E-3   0.35533214972951E-3   0.36128006056771E-3   0.36729827733003E-3
+ 0.37338719862681E-3   0.37954722080949E-3   0.38577873793356E-3   0.39208214172181E-3   0.39845782152795E-3
+ 0.40490616430045E-3   0.4114275545468E-3   0.41802237429803E-3   0.42469100307361E-3   0.43143381784662E-3
+ 0.43825119300931E-3   0.44514350033896E-3   0.45211110896411E-3   0.45915438533106E-3   0.46627369317081E-3
+ 0.47346939346625E-3   0.48074184441976E-3   0.48809140142114E-3   0.49551841701588E-3   0.50302324087376E-3
+ 0.51060621975787E-3   0.51826769749392E-3   0.52600801493991E-3   0.53382750995622E-3   0.54172651737597E-3
+ 0.54970536897584E-3   0.55776439344714E-3   0.56590391636732E-3   0.57412426017186E-3   0.58242574412641E-3
+ 0.59080868429949E-3   0.59927339353533E-3   0.60782018142726E-3   0.6164493542914E-3   0.62516121514069E-3
+ 0.63395606365934E-3   0.64283419617766E-3   0.6517959056472E-3   0.66084148161631E-3   0.6699712102061E-3
+ 0.67918537408669E-3   0.68848425245391E-3   0.69786812100636E-3   0.70733725192282E-3   0.71689191384004E-3
+ 0.72653237183096E-3   0.73625888738321E-3   0.7460717183781E-3   0.75597111906988E-3   0.76595734006544E-3
+ 0.77603062830439E-3   0.78619122703948E-3   0.79643937581741E-3   0.80677531046006E-3    0.817199263046E-3
+ 0.8277114618925E-3   0.83831213153781E-3   0.84900149272387E-3   0.85977976237938E-3   0.87064715360328E-3
+ 0.88160387564851E-3   0.89265013390628E-3   0.90378612989059E-3   0.91501206122319E-3   0.92632812161892E-3
+ 0.93773450087137E-3   0.94923138483897E-3   0.9608189554314E-3   0.9724973905964E-3   0.98426686430694E-3
+ 0.99612754654877E-3   0.10080796033083E-2   0.1020123196561E-2   0.10322584842598E-2   0.10444856203243E-2
+ 0.10568047546302E-2   0.10692160329986E-2   0.10817195971866E-2   0.10943155848777E-2   0.11070041296723E-2
+ 0.11197853610789E-2   0.11326594045062E-2   0.11456263812542E-2   0.1158686408507E-2   0.1171839599325E-2
+ 0.11850860626384E-2   0.11984259032399E-2   0.12118592217787E-2   0.12253861147543E-2   0.1239006674511E-2
+ 0.12527209892327E-2   0.12665291429375E-2   0.12804312154737E-2   0.12944272825147E-2   0.13085174155559E-2
+ 0.13227016819107E-2   0.1336980144707E-2   0.13513528628848E-2   0.13658198911932E-2   0.13803812801881E-2
+ 0.13950370762308E-2   0.14097873214856E-2   0.14246320539191E-2   0.14395713072991E-2   0.14546051111938E-2
+ 0.14697334909717E-2   0.14849564678016E-2   0.15002740586525E-2   0.15156862762949E-2   0.15311931293012E-2
+ 0.15467946220474E-2   0.15624907547142E-2   0.15782815232893E-2   0.15941669195695E-2   0.16101469311629E-2
+ 0.16262215414919E-2   0.16423907297966E-2   0.16586544711377E-2   0.16750127364002E-2   0.16914654922979E-2
+ 0.17080127013772E-2   0.17246543220218E-2   0.17413903084576E-2   0.17582206107578E-2   0.17751451748483E-2
+ 0.17921639425135E-2   0.18092768514022E-2   0.18264838350339E-2   0.18437848228053E-2   0.18611797399972E-2
+ 0.18786685077816E-2   0.18962510432288E-2   0.19139272593155E-2   0.19316970649321E-2   0.19495603648914E-2
+ 0.19675170599367E-2   0.19855670467505E-2   0.20037102179635E-2   0.20219464621637E-2   0.2040275663906E-2
+ 0.20586977037216E-2   0.20772124581282E-2   0.20958197996402E-2   0.21145195967788E-2   0.21333117140828E-2
+ 0.21521960121197E-2   0.21711723474967E-2   0.21902405728719E-2   0.22094005369661E-2   0.22286520845748E-2
+ 0.22479950565796E-2   0.22674292899613E-2   0.22869546178119E-2   0.23065708693474E-2   0.23262778699207E-2
+ 0.23460754410352E-2   0.23659634003573E-2   0.23859415617311E-2   0.2406009735191E-2   0.24261677269768E-2
+ 0.2446415339547E-2   0.24667523715939E-2   0.24871786180577E-2   0.25076938701417E-2   0.25282979153269E-2
+ 0.25489905373876E-2   0.25697715164064E-2   0.25906406287902E-2   0.26115976472855E-2   0.26326423409946E-2
+ 0.26537744753917E-2   0.26749938123391E-2   0.2696300110104E-2   0.27176931233745E-2   0.27391726032773E-2
+ 0.27607382973937E-2   0.27823899497778E-2   0.28041273009731E-2    0.282595008803E-2   0.28478580445241E-2
+ 0.28698509005733E-2   0.2891928382856E-2   0.29140902146294E-2   0.29363361157476E-2   0.29586658026802E-2
+ 0.29810789885306E-2   0.30035753830547E-2   0.30261546926804E-2   0.30488166205256E-2   0.30715608664183E-2
+ 0.30943871269151E-2   0.31172950953212E-2   0.31402844617095E-2   0.31633549129407E-2   0.31865061326827E-2
+ 0.32097378014308E-2   0.32330495965276E-2   0.32564411921831E-2   0.32799122594955E-2   0.33034624664708E-2
+ 0.3327091478044E-2   0.33507989560994E-2   0.33745845594914E-2   0.33984479440655E-2   0.34223887626789E-2
+ 0.3446406665222E-2   0.34705012986394E-2   0.34946723069511E-2   0.35189193312737E-2   0.35432420098423E-2
+ 0.35676399780318E-2   0.35921128683784E-2   0.36166603106016E-2   0.36412819316259E-2   0.36659773556028E-2
+ 0.36907462039324E-2   0.37155880952862E-2   0.37405026456287E-2   0.37654894682394E-2   0.37905481737361E-2
+ 0.38156783700961E-2   0.38408796626795E-2   0.38661516542513E-2   0.38914939450041E-2   0.39169061325808E-2
+ 0.39423878120971E-2   0.39679385761647E-2   0.39935580149138E-2   0.40192457160158E-2   0.40450012647068E-2
+ 0.40708242438104E-2   0.40967142337604E-2   0.41226708126244E-2   0.41486935561267E-2   0.41747820376714E-2
+ 0.42009358283659E-2   0.42271544970443E-2   0.42534376102902E-2   0.42797847324604E-2   0.43061954257085E-2
+ 0.43326692500079E-2   0.43592057631758E-2   0.43858045208962E-2   0.44124650767437E-2   0.4439186982207E-2
+ 0.44659697867126E-2   0.44928130376484E-2   0.45197162803872E-2   0.45466790583104E-2   0.45737009128319E-2
+ 0.46007813834216E-2   0.46279200076292E-2   0.46551163211077E-2   0.46823698576378E-2   0.47096801491508E-2
+ 0.4737046725753E-2   0.47644691157493E-2   0.47919468456669E-2   0.48194794402793E-2   0.48470664226297E-2
+ 0.48747073140554E-2   0.49024016342111E-2   0.49301489010928E-2   0.49579486310619E-2   0.49858003388685E-2
+ 0.50137035376757E-2   0.50416577390831E-2   0.50696624531504E-2   0.50977171884217E-2   0.51258214519488E-2
+ 0.5153974749315E-2   0.51821765846591E-2   0.52104264606988E-2   0.52387238787545E-2   0.52670683387732E-2
+ 0.52954593393518E-2   0.53238963777608E-2   0.53523789499683E-2   0.53809065506632E-2   0.54094786732787E-2
+ 0.54380948100163E-2   0.54667544518688E-2   0.54954570886442E-2   0.55242022089889E-2   0.55529893004111E-2
+ 0.55818178493045E-2   0.56106873409712E-2   0.56395972596456E-2   0.56685470885169E-2   0.56975363097532E-2
+ 0.5726564404524E-2   0.57556308530241E-2   0.57847351344957E-2   0.58138767272526E-2   0.58430551087025E-2
+ 0.58722697553703E-2   0.5901520142921E-2   0.59308057461823E-2   0.59601260391682E-2   0.5989480495101E-2
+ 0.60188685864345E-2   0.60482897848765E-2   0.60777435614119E-2   0.61072293863246E-2   0.61367467292204E-2
+ 0.61662950590498E-2   0.61958738441298E-2   0.62254825521668E-2   0.62551206502785E-2   0.62847876050167E-2
+ 0.63144828823888E-2   0.63442059478806E-2   0.63739562664778E-2   0.64037333026886E-2   0.64335365205651E-2
+ 0.64633653837254E-2   0.64932193553755E-2   0.6523097898331E-2   0.65530004750387E-2   0.65829265475982E-2
+ 0.66128755777836E-2   0.66428470270648E-2   0.6672840356629E-2   0.67028550274019E-2   0.67328905000691E-2
+ 0.67629462350973E-2   0.67930216927552E-2   0.68231163331348E-2   0.68532296161721E-2   0.68833610016681E-2
+ 0.69135099493095E-2   0.69436759186898E-2   0.69738583693293E-2   0.70040567606963E-2   0.7034270552227E-2
+ 0.70644992033464E-2   0.70947421734884E-2   0.71249989221159E-2   0.71552689087412E-2   0.71855515929461E-2
+ 0.72158464344014E-2   0.72461528928874E-2   0.72764704283135E-2   0.73067985007376E-2   0.73371365703863E-2
+ 0.7367484097674E-2   0.73978405432227E-2   0.7428205367881E-2   0.74585780327437E-2   0.7488957999171E-2
+ 0.75193447288072E-2   0.75497376836003E-2   0.75801363258205E-2   0.76105401180791E-2   0.76409485233474E-2
+ 0.76713610049751E-2   0.77017770267091E-2   0.77321960527118E-2   0.77626175475796E-2   0.77930409763607E-2
+ 0.78234658045741E-2   0.7853891498227E-2   0.7884317523833E-2   0.79147433484299E-2   0.79451684395977E-2
+ 0.79755922654761E-2   0.8006014294782E-2   0.80364339968272E-2   0.80668508415359E-2   0.80972642994616E-2
+ 0.81276738418045E-2   0.81580789404287E-2   0.8188479067879E-2   0.82188736973978E-2   0.82492623029423E-2
+ 0.82796443592005E-2   0.83100193416083E-2   0.83403867263658E-2   0.83707459904539E-2   0.84010966116501E-2
+ 0.84314380685453E-2   0.84617698405594E-2   0.84920914079573E-2   0.85224022518652E-2   0.8552701854286E-2
+ 0.85829896981149E-2   0.86132652671552E-2   0.86435280461336E-2   0.86737775207158E-2   0.87040131775212E-2
+ 0.87342345041388E-2   0.87644409891416E-2   0.87946321221017E-2   0.88248073936054E-2   0.88549662952675E-2
+ 0.88851083197462E-2   0.89152329607575E-2   0.89453397130898E-2   0.89754280726178E-2   0.9005497536317E-2
+ 0.90355476022776E-2   0.90655777697189E-2   0.90955875390024E-2   0.91255764116462E-2   0.91555438903387E-2
+ 0.91854894789514E-2   0.92154126825534E-2   0.92453130074237E-2   0.92751899610652E-2   0.93050430522176E-2
+  0.933487179087E-2   0.93646756882745E-2   0.93944542569584E-2   0.94242070107374E-2   0.94539334647278E-2
+ 0.94836331353589E-2   0.95133055403859E-2   0.95429501989017E-2   0.95725666313491E-2   0.96021543595331E-2
+ 0.96317129066325E-2   0.9661241797212E-2   0.96907405572339E-2   0.97202087140694E-2   0.97496457965106E-2
+ 0.97790513347816E-2   0.98084248605497E-2   0.9837765906937E-2   0.9867074008531E-2   0.98963487013959E-2
+ 0.99255895230834E-2   0.99547960126432E-2   0.99839677106341E-2   0.10013104159134E-1   0.10042204901752E-1
+ 0.10071269483635E-1   0.10100297451481E-1   0.10129288353552E-1   0.10158241739675E-1   0.10187157161261E-1
+ 0.10216034171311E-1   0.10244872324425E-1   0.10273671176813E-1   0.10302430286304E-1   0.10331149212355E-1
+ 0.10359827516062E-1   0.10388464760167E-1   0.10417060509066E-1   0.10445614328824E-1   0.10474125787177E-1
+ 0.10502594453544E-1   0.10531019899034E-1   0.10559401696458E-1   0.10587739420334E-1   0.10616032646897E-1
+ 0.10644280954104E-1   0.10672483921649E-1   0.10700641130964E-1   0.1072875216523E-1   0.10756816609386E-1
+ 0.10784834050134E-1   0.10812804075949E-1   0.10840726277084E-1   0.10868600245579E-1   0.10896425575271E-1
+ 0.10924201861793E-1   0.10951928702592E-1   0.10979605696927E-1   0.11007232445881E-1   0.11034808552365E-1
+ 0.11062333621127E-1   0.11089807258757E-1   0.11117229073693E-1   0.1114459867623E-1   0.11171915678525E-1
+  0.111991796946E-1   0.11226390340355E-1   0.11253547233567E-1    0.112806499939E-1   0.1130769824291E-1
+ 0.11334691604051E-1   0.11361629702678E-1   0.11388512166057E-1   0.11415338623368E-1   0.11442108705708E-1
+ 0.11468822046101E-1   0.11495478279499E-1   0.11522077042791E-1   0.11548617974804E-1   0.11575100716311E-1
+ 0.11601524910032E-1   0.11627890200645E-1   0.11654196234782E-1   0.11680442661042E-1   0.11706629129989E-1
+ 0.11732755294161E-1   0.1175882080807E-1   0.11784825328209E-1   0.11810768513055E-1   0.11836650023073E-1
+ 0.11862469520721E-1   0.11888226670452E-1   0.11913921138716E-1   0.11939552593971E-1   0.11965120706675E-1
+ 0.11990625149302E-1   0.12016065596334E-1   0.12041441724273E-1   0.12066753211639E-1   0.12091999738972E-1
+ 0.12117180988842E-1   0.12142296645844E-1   0.12167346396605E-1   0.12192329929785E-1   0.12217246936082E-1
+ 0.1224209710823E-1   0.12266880141008E-1   0.12291595731235E-1   0.12316243577778E-1   0.12340823381552E-1
+ 0.12365334845521E-1   0.12389777674701E-1   0.12414151576164E-1   0.12438456259036E-1   0.12462691434502E-1
+ 0.12486856815806E-1   0.12510952118251E-1   0.12534977059206E-1   0.12558931358102E-1   0.12582814736435E-1
+ 0.12606626917768E-1   0.12630367627732E-1   0.12654036594027E-1   0.12677633546422E-1   0.12701158216757E-1
+ 0.12724610338946E-1   0.12747989648973E-1   0.12771295884896E-1   0.12794528786848E-1   0.12817688097035E-1
+ 0.12840773559739E-1   0.12863784921318E-1   0.12886721930204E-1   0.12909584336908E-1   0.12932371894014E-1
+ 0.12955084356186E-1   0.12977721480162E-1   0.13000283024756E-1   0.13022768750861E-1   0.13045178421445E-1
+ 0.13067511801552E-1   0.13089768658302E-1   0.13111948760889E-1   0.13134051880583E-1   0.13156077790731E-1
+ 0.13178026266748E-1   0.13199897086128E-1   0.13221690028434E-1   0.13243404875302E-1   0.13265041410439E-1
+ 0.1328659941962E-1   0.13308078690692E-1   0.13329479013568E-1   0.13350800180227E-1   0.13372041984715E-1
+ 0.13393204223142E-1   0.13414286693681E-1   0.13435289196566E-1   0.13456211534092E-1   0.13477053510612E-1
+ 0.13497814932537E-1   0.13518495608332E-1   0.13539095348517E-1   0.13559613965664E-1   0.13580051274393E-1
+ 0.13600407091376E-1   0.13620681235327E-1   0.13640873527009E-1   0.13660983789224E-1   0.13681011846814E-1
+ 0.13700957526662E-1   0.13720820657683E-1   0.13740601070828E-1   0.13760298599079E-1   0.13779913077444E-1
+ 0.13799444342961E-1   0.13818892234688E-1   0.13838256593708E-1   0.13857537263119E-1   0.13876734088036E-1
+ 0.13895846915588E-1   0.13914875594913E-1   0.13933819977156E-1   0.13952679915468E-1   0.13971455264999E-1
+ 0.13990145882901E-1   0.14008751628319E-1   0.1402727236239E-1   0.14045707948242E-1   0.14064058250986E-1
+ 0.14082323137719E-1   0.14100502477514E-1   0.14118596141424E-1   0.1413660400247E-1   0.14154525935645E-1
+ 0.14172361817906E-1   0.14190111528173E-1   0.14207774947325E-1   0.14225351958193E-1   0.14242842445561E-1
+ 0.14260246296161E-1   0.14277563398665E-1   0.14294793643689E-1   0.14311936923781E-1   0.14328993133423E-1
+ 0.14345962169023E-1   0.14362843928915E-1   0.14379638313351E-1   0.14396345224498E-1   0.14412964566437E-1
+ 0.14429496245153E-1   0.14445940168536E-1   0.14462296246375E-1   0.14478564390352E-1   0.1449474451404E-1
+ 0.14510836532896E-1   0.14526840364261E-1   0.1454275592735E-1   0.14558583143252E-1   0.14574321934923E-1
+ 0.1458997222718E-1   0.14605533946703E-1   0.14621007022021E-1   0.14636391383515E-1   0.14651686963409E-1
+ 0.14666893695766E-1   0.14682011516486E-1   0.14697040363295E-1   0.14711980175747E-1   0.14726830895215E-1
+ 0.14741592464887E-1   0.14756264829761E-1   0.14770847936639E-1   0.14785341734126E-1   0.14799746172619E-1
+ 0.14814061204304E-1   0.14828286783155E-1   0.14842422864923E-1   0.14856469407132E-1   0.14870426369078E-1
+ 0.14884293711819E-1   0.14898071398171E-1   0.14911759392703E-1   0.14925357661732E-1   0.14938866173318E-1
+ 0.14952284897255E-1   0.14965613805071E-1   0.14978852870019E-1   0.14992002067071E-1   0.15005061372917E-1
+ 0.15018030765952E-1   0.15030910226277E-1   0.15043699735691E-1   0.15056399277684E-1   0.15069008837434E-1
+ 0.15081528401799E-1   0.15093957959313E-1   0.15106297500178E-1   0.15118547016261E-1   0.15130706501087E-1
+ 0.15142775949832E-1   0.15154755359318E-1   0.1516664472801E-1   0.15178444056003E-1   0.15190153345024E-1
+ 0.15201772598422E-1   0.15213301821162E-1   0.15224741019819E-1   0.15236090202575E-1   0.15247349379208E-1
+ 0.1525851856109E-1   0.15269597761179E-1   0.15280586994015E-1   0.1529148627571E-1   0.15302295623946E-1
+ 0.15313015057965E-1   0.15323644598569E-1   0.15334184268106E-1   0.15344634090468E-1   0.15354994091087E-1
+ 0.15365264296923E-1   0.15375444736463E-1   0.15385535439713E-1   0.15395536438189E-1   0.15405447764916E-1
+ 0.15415269454417E-1   0.15425001542708E-1   0.15434644067295E-1   0.15444197067162E-1   0.15453660582769E-1
+ 0.15463034656043E-1   0.15472319330374E-1   0.15481514650606E-1   0.15490620663033E-1   0.15499637415392E-1
+ 0.15508564956853E-1   0.15517403338019E-1   0.15526152610915E-1   0.15534812828983E-1   0.15543384047072E-1
+ 0.15551866321441E-1   0.15560259709739E-1   0.15568564271012E-1   0.15576780065686E-1   0.15584907155566E-1
+ 0.15592945603828E-1   0.15600895475012E-1   0.15608756835018E-1   0.15616529751094E-1   0.15624214291835E-1
+ 0.15631810527174E-1   0.15639318528376E-1   0.1564673836803E-1   0.15654070120043E-1   0.15661313859635E-1
+ 0.15668469663331E-1   0.15675537608953E-1   0.15682517775618E-1   0.15689410243725E-1   0.15696215094954E-1
+ 0.15702932412255E-1   0.15709562279844E-1   0.15716104783197E-1   0.1572256000904E-1   0.15728928045345E-1
+ 0.15735208981323E-1   0.15741402907416E-1   0.15747509915293E-1   0.15753530097839E-1   0.15759463549154E-1
+ 0.1576531036454E-1    0.157710706405E-1   0.15776744474728E-1   0.15782331966101E-1   0.15787833214679E-1
+ 0.15793248321688E-1   0.15798577389525E-1   0.1580382052174E-1   0.15808977823038E-1   0.15814049399267E-1
+ 0.15819035357415E-1   0.15823935805599E-1   0.15828750853063E-1   0.15833480610167E-1   0.15838125188385E-1
+ 0.15842684700293E-1   0.15847159259566E-1   0.15851548980972E-1   0.15855853980359E-1   0.15860074374657E-1
+ 0.15864210281867E-1   0.1586826182105E-1   0.15872229112331E-1   0.15876112276881E-1   0.15879911436918E-1
+ 0.15883626715697E-1   0.15887258237503E-1   0.15890806127647E-1   0.15894270512457E-1   0.1589765151927E-1
+ 0.15900949276432E-1   0.1590416391328E-1   0.15907295560149E-1   0.15910344348352E-1   0.15913310410184E-1
+ 0.1591619387891E-1   0.15918994888757E-1   0.15921713574912E-1   0.15924350073514E-1   0.15926904521643E-1
+ 0.1592937705732E-1   0.15931767819496E-1   0.15934076948046E-1   0.15936304583764E-1   0.15938450868355E-1
+ 0.15940515944429E-1   0.15942499955493E-1   0.15944403045949E-1   0.15946225361079E-1   0.15947967047048E-1
+ 0.1594962825089E-1   0.15951209120507E-1   0.15952709804658E-1   0.15954130452954E-1   0.15955471215854E-1
+ 0.15956732244654E-1   0.15957913691485E-1   0.15959015709301E-1   0.1596003845188E-1   0.1596098207381E-1
+ 0.15961846730488E-1   0.1596263257811E-1   0.15963339773666E-1   0.15963968474934E-1   0.15964518840474E-1
+ 0.1596499102962E-1   0.15965385202472E-1   0.15965701519895E-1   0.15965940143509E-1   0.15966101235681E-1
+ 0.15966184959522E-1   0.1596619147888E-1   0.15966120958333E-1   0.1596597356318E-1   0.15965749459441E-1
+ 0.15965448813845E-1   0.15965071793825E-1   0.15964618567515E-1   0.15964089303738E-1   0.15963484172005E-1
+ 0.15962803342507E-1   0.15962046986106E-1   0.15961215274333E-1   0.1596030837938E-1   0.15959326474092E-1
+ 0.15958269731964E-1   0.15957138327134E-1   0.15955932434374E-1   0.15954652229086E-1    0.159532978873E-1
+ 0.15951869585658E-1   0.15950367501417E-1   0.15948791812439E-1   0.15947142697185E-1   0.1594542033471E-1
+ 0.15943624904655E-1   0.15941756587243E-1   0.15939815563273E-1   0.15937802014111E-1   0.15935716121689E-1
+ 0.15933558068495E-1   0.15931328037566E-1   0.15929026212486E-1   0.15926652777381E-1   0.15924207916905E-1
+ 0.15921691816244E-1   0.15919104661103E-1   0.15916446637703E-1   0.15913717932775E-1   0.15910918733554E-1
+ 0.15908049227774E-1   0.15905109603659E-1   0.15902100049922E-1   0.15899020755754E-1   0.15895871910822E-1
+ 0.15892653705264E-1   0.15889366329677E-1   0.1588600997512E-1   0.15882584833102E-1   0.15879091095577E-1
+ 0.15875528954941E-1   0.15871898604025E-1   0.15868200236088E-1   0.15864434044813E-1   0.15860600224302E-1
+ 0.15856698969067E-1   0.15852730474029E-1   0.15848694934509E-1   0.15844592546224E-1   0.1584042350528E-1
+ 0.15836188008169E-1   0.15831886251762E-1   0.15827518433302E-1    0.158230847504E-1   0.15818585401033E-1
+ 0.15814020583532E-1   0.15809390496579E-1   0.15804695339206E-1   0.15799935310784E-1   0.15795110611017E-1
+ 0.15790221439945E-1   0.15785267997928E-1   0.15780250485649E-1   0.15775169104102E-1   0.15770024054592E-1
+ 0.15764815538729E-1   0.1575954375842E-1   0.15754208915865E-1   0.15748811213553E-1   0.15743350854255E-1
+ 0.15737828041022E-1   0.15732242977175E-1   0.15726595866305E-1   0.15720886912262E-1   0.15715116319157E-1
+ 0.15709284291351E-1   0.15703391033453E-1   0.15697436750314E-1   0.15691421647021E-1   0.15685345928895E-1
+ 0.15679209801484E-1   0.15673013470555E-1   0.15666757142097E-1   0.15660441022307E-1   0.15654065317593E-1
+ 0.15647630234562E-1   0.15641135980021E-1   0.15634582760969E-1   0.15627970784594E-1   0.15621300258264E-1
+ 0.1561457138953E-1   0.15607784386111E-1    0.156009394559E-1   0.15594036806951E-1   0.15587076647478E-1
+ 0.1558005918585E-1   0.15572984630585E-1   0.15565853190347E-1   0.1555866507394E-1   0.15551420490306E-1
+ 0.15544119648515E-1   0.15536762757767E-1   0.15529350027383E-1   0.15521881666801E-1   0.15514357885573E-1
+ 0.1550677889336E-1   0.15499144899925E-1   0.15491456115134E-1   0.15483712748946E-1   0.15475915011412E-1
+ 0.15468063112668E-1   0.15460157262932E-1   0.15452197672502E-1   0.15444184551748E-1   0.15436118111107E-1
+ 0.15427998561083E-1   0.15419826112241E-1   0.15411600975199E-1   0.15403323360629E-1   0.15394993479251E-1
+ 0.15386611541827E-1   0.15378177759158E-1   0.15369692342082E-1   0.15361155501466E-1   0.15352567448203E-1
+ 0.15343928393211E-1   0.15335238547426E-1   0.15326498121796E-1   0.15317707327281E-1   0.15308866374848E-1
+ 0.15299975475466E-1   0.15291034840101E-1   0.15282044679714E-1   0.15273005205257E-1   0.15263916627667E-1
+ 0.15254779157866E-1   0.1524559300675E-1   0.15236358385196E-1   0.15227075504045E-1   0.1521774457411E-1
+ 0.15208365806166E-1   0.15198939410946E-1   0.15189465599139E-1   0.15179944581387E-1   0.15170376568278E-1
+ 0.15160761770347E-1   0.15151100398067E-1   0.15141392661849E-1   0.15131638772038E-1   0.15121838938907E-1
+ 0.15111993372657E-1   0.1510210228341E-1   0.15092165881206E-1   0.15082184376002E-1   0.15072157977666E-1
+ 0.15062086895973E-1   0.15051971340605E-1   0.15041811521143E-1   0.15031607647066E-1   0.15021359927748E-1
+ 0.15011068572454E-1   0.15000733790335E-1   0.14990355790426E-1   0.14979934781644E-1   0.14969470972783E-1
+ 0.14958964572509E-1   0.1494841578936E-1   0.14937824831742E-1   0.14927191907924E-1   0.14916517226035E-1
+ 0.14905800994062E-1   0.14895043419848E-1   0.14884244711085E-1   0.14873405075313E-1   0.14862524719917E-1
+ 0.14851603852125E-1   0.14840642679001E-1   0.14829641407446E-1   0.14818600244193E-1   0.14807519395803E-1
+ 0.14796399068664E-1   0.14785239468989E-1   0.14774040802807E-1   0.14762803275967E-1   0.14751527094132E-1
+ 0.14740212462774E-1   0.14728859587177E-1   0.14717468672426E-1   0.14706039923411E-1   0.14694573544822E-1
+ 0.14683069741143E-1   0.14671528716654E-1   0.14659950675426E-1   0.14648335821317E-1   0.14636684357971E-1
+ 0.14624996488814E-1   0.14613272417054E-1   0.14601512345673E-1   0.1458971647743E-1   0.14577885014855E-1
+ 0.14566018160246E-1   0.14554116115668E-1   0.14542179082951E-1   0.14530207263684E-1   0.14518200859217E-1
+ 0.14506160070654E-1   0.14494085098852E-1   0.14481976144421E-1   0.14469833407718E-1   0.14457657088846E-1
+ 0.1444544738765E-1   0.14433204503719E-1   0.14420928636377E-1   0.14408619984685E-1   0.1439627874744E-1
+ 0.14383905123165E-1   0.14371499310117E-1   0.14359061506276E-1   0.14346591909346E-1   0.14334090716755E-1
+ 0.14321558125649E-1   0.14308994332891E-1   0.14296399535057E-1   0.1428377392844E-1   0.14271117709038E-1
+ 0.14258431072561E-1   0.14245714214423E-1   0.14232967329741E-1   0.14220190613336E-1   0.14207384259727E-1
+ 0.14194548463128E-1   0.1418168341745E-1   0.14168789316299E-1   0.14155866352967E-1   0.14142914720439E-1
+ 0.14129934611384E-1   0.14116926218158E-1   0.14103889732797E-1   0.1409082534702E-1   0.14077733252224E-1
+ 0.1406461363948E-1   0.14051466699539E-1   0.1403829262282E-1   0.14025091599414E-1   0.14011863819084E-1
+ 0.13998609471256E-1   0.13985328745023E-1   0.13972021829141E-1   0.13958688912029E-1   0.13945330181764E-1
+ 0.13931945826081E-1   0.13918536032371E-1   0.1390510098768E-1   0.13891640878707E-1    0.138781558918E-1
+ 0.13864646212958E-1   0.13851112027826E-1   0.13837553521696E-1   0.13823970879503E-1   0.13810364285825E-1
+ 0.1379673392488E-1   0.13783079980526E-1   0.13769402636257E-1   0.13755702075205E-1   0.13741978480135E-1
+ 0.13728232033444E-1   0.13714462917162E-1   0.13700671312948E-1   0.13686857402087E-1   0.13673021365495E-1
+ 0.1365916338371E-1   0.13645283636893E-1   0.1363138230483E-1   0.13617459566926E-1   0.13603515602205E-1
+ 0.13589550589311E-1   0.13575564706502E-1   0.13561558131653E-1   0.13547531042251E-1   0.13533483615398E-1
+ 0.13519416027806E-1   0.13505328455795E-1   0.13491221075295E-1   0.13477094061844E-1   0.13462947590585E-1
+ 0.13448781836265E-1   0.13434596973236E-1   0.13420393175451E-1   0.13406170616464E-1   0.13391929469429E-1
+ 0.13377669907098E-1   0.13363392101822E-1   0.13349096225547E-1   0.13334782449813E-1   0.13320450945756E-1
+ 0.13306101884104E-1   0.13291735435177E-1   0.13277351768884E-1   0.13262951054726E-1   0.13248533461791E-1
+ 0.13234099158755E-1   0.1321964831388E-1   0.13205181095013E-1   0.13190697669586E-1   0.13176198204615E-1
+ 0.13161682866697E-1   0.13147151822012E-1   0.13132605236319E-1   0.13118043274957E-1   0.13103466102844E-1
+ 0.13088873884476E-1   0.13074266783924E-1   0.13059644964837E-1   0.13045008590437E-1   0.13030357823524E-1
+ 0.13015692826466E-1   0.13001013761208E-1   0.12986320789264E-1   0.12971614071719E-1   0.12956893769231E-1
+ 0.12942160042024E-1   0.12927413049891E-1   0.12912652952194E-1   0.12897879907861E-1   0.12883094075388E-1
+ 0.12868295612834E-1   0.12853484677824E-1   0.12838661427548E-1   0.12823826018759E-1   0.12808978607772E-1
+ 0.12794119350465E-1   0.12779248402277E-1   0.12764365918208E-1   0.12749472052819E-1   0.1273456696023E-1
+ 0.1271965079412E-1   0.12704723707726E-1   0.12689785853845E-1   0.12674837384828E-1   0.12659878452585E-1
+ 0.12644909208582E-1   0.12629929803841E-1   0.12614940388938E-1   0.12599941114006E-1   0.12584932128728E-1
+ 0.12569913582346E-1   0.1255488562365E-1   0.12539848400988E-1   0.12524802062257E-1   0.12509746754905E-1
+ 0.12494682625936E-1    0.124796098219E-1   0.12464528488902E-1   0.12449438772593E-1   0.12434340818178E-1
+ 0.12419234770409E-1   0.12404120773588E-1   0.12388998971566E-1   0.12373869507742E-1   0.12358732525063E-1
+ 0.12343588166026E-1   0.12328436572673E-1   0.12313277886593E-1   0.12298112248925E-1   0.12282939800351E-1
+ 0.12267760681103E-1   0.12252575030957E-1   0.12237382989236E-1   0.12222184694807E-1   0.12206980286084E-1
+ 0.12191769901027E-1   0.12176553677139E-1   0.1216133175147E-1   0.12146104260614E-1   0.12130871340707E-1
+ 0.12115633127435E-1   0.12100389756022E-1   0.12085141361241E-1   0.12069888077406E-1   0.12054630038377E-1
+ 0.12039367377556E-1   0.12024100227888E-1   0.12008828721865E-1   0.11993552991518E-1   0.11978273168426E-1
+ 0.11962989383707E-1   0.11947701768025E-1   0.11932410451587E-1   0.11917115564141E-1   0.11901817234981E-1
+ 0.11886515592943E-1   0.11871210766405E-1   0.1185590288329E-1   0.11840592071062E-1   0.11825278456732E-1
+ 0.11809962166848E-1   0.11794643327508E-1   0.11779322064348E-1   0.1176399850255E-1   0.11748672766839E-1
+ 0.11733344981482E-1   0.11718015270292E-1   0.11702683756623E-1   0.11687350563374E-1   0.11672015812989E-1
+ 0.11656679627453E-1   0.11641342128297E-1   0.11626003436596E-1   0.11610663672969E-1   0.1159532295758E-1
+ 0.11579981410136E-1   0.1156463914989E-1   0.1154929629564E-1   0.11533952965728E-1   0.11518609278044E-1
+ 0.11503265350019E-1   0.11487921298634E-1   0.11472577240413E-1   0.11457233291427E-1   0.11441889567295E-1
+ 0.11426546183179E-1   0.11411203253791E-1   0.11395860893388E-1   0.11380519215775E-1   0.11365178334305E-1
+ 0.11349838361879E-1   0.11334499410944E-1   0.11319161593497E-1   0.11303825021084E-1   0.11288489804799E-1
+ 0.11273156055286E-1   0.11257823882738E-1   0.11242493396899E-1   0.1122716470706E-1   0.11211837922066E-1
+ 0.11196513150312E-1   0.11181190499744E-1   0.11165870077858E-1   0.11150551991705E-1   0.11135236347886E-1
+ 0.11119923252555E-1   0.11104612811419E-1   0.1108930512974E-1   0.11074000312332E-1   0.11058698463564E-1
+ 0.11043399687359E-1   0.11028104087196E-1   0.11012811766109E-1   0.10997522826687E-1   0.10982237371077E-1
+ 0.10966955500981E-1   0.1095167731766E-1   0.10936402921931E-1   0.1092113241417E-1   0.10905865894311E-1
+ 0.10890603461848E-1   0.10875345215833E-1   0.10860091254879E-1   0.1084484167716E-1   0.10829596580409E-1
+ 0.10814356061923E-1   0.10799120218558E-1   0.10783889146734E-1   0.10768662942436E-1   0.10753441701208E-1
+ 0.10738225518162E-1   0.10723014487972E-1   0.10707808704878E-1   0.10692608262687E-1   0.10677413254769E-1
+ 0.10662223774063E-1   0.10647039913075E-1   0.10631861763878E-1   0.10616689418115E-1   0.10601522966996E-1
+ 0.10586362501301E-1   0.10571208111381E-1   0.10556059887158E-1   0.10540917918123E-1   0.10525782293341E-1
+ 0.10510653101449E-1   0.10495530430656E-1   0.10480414368748E-1   0.1046530500308E-1   0.10450202420588E-1
+ 0.10435106707778E-1   0.10420017950736E-1   0.10404936235123E-1   0.10389861646178E-1   0.10374794268719E-1
+ 0.10359734187141E-1   0.10344681485419E-1   0.10329636247109E-1   0.10314598555348E-1   0.10299568492852E-1
+ 0.10284546141922E-1   0.10269531584439E-1   0.10254524901869E-1   0.10239526175263E-1   0.10224535485255E-1
+ 0.10209552912065E-1   0.10194578535499E-1   0.10179612434952E-1   0.10164654689403E-1   0.10149705377422E-1
+ 0.10134764577167E-1   0.10119832366386E-1   0.10104908822418E-1   0.1008999402219E-1   0.10075088042226E-1
+ 0.10060190958639E-1   0.10045302847137E-1   0.1003042378302E-1   0.10015553841185E-1   0.10000693096124E-1
+ 0.99858416219255E-2   0.9970999492274E-2   0.99561667804529E-2   0.99413435593438E-2   0.99265299014278E-2
+ 0.9911725878786E-2   0.98969315631004E-2   0.98821470256546E-2   0.98673723373349E-2   0.98526075686305E-2
+ 0.98378527896348E-2   0.98231080700458E-2   0.98083734791672E-2   0.97936490859091E-2   0.97789349587886E-2
+ 0.97642311659309E-2   0.97495377750698E-2   0.97348548535488E-2   0.97201824683216E-2   0.97055206859533E-2
+ 0.96908695726207E-2   0.96762291941137E-2   0.96615996158355E-2   0.96469809028039E-2   0.9632373119652E-2
+ 0.96177763306288E-2   0.96031905996004E-2   0.95886159900506E-2   0.95740525650817E-2   0.95595003874154E-2
+ 0.95449595193937E-2   0.95304300229796E-2   0.95159119597583E-2   0.95014053909374E-2   0.94869103773484E-2
+ 0.94724269794472E-2   0.94579552573149E-2   0.94434952706589E-2   0.94290470788137E-2   0.94146107407416E-2
+ 0.94001863150337E-2   0.93857738599107E-2   0.93713734332239E-2   0.93569850924557E-2   0.93426088947209E-2
+ 0.93282448967676E-2   0.93138931549775E-2   0.92995537253674E-2   0.92852266635897E-2   0.92709120249336E-2
+ 0.92566098643255E-2   0.92423202363304E-2   0.92280431951526E-2   0.92137787946364E-2   0.91995270882672E-2
+ 0.91852881291724E-2   0.9171061970122E-2    0.915684866353E-2   0.91426482614549E-2   0.91284608156006E-2
+ 0.91142863773177E-2   0.91001249976038E-2   0.90859767271049E-2   0.90718416161161E-2   0.90577197145825E-2
+ 0.90436110721001E-2   0.90295157379169E-2   0.90154337609335E-2   0.90013651897041E-2   0.89873100724377E-2
+ 0.89732684569987E-2   0.89592403909078E-2   0.89452259213432E-2   0.89312250951412E-2   0.89172379587973E-2
+ 0.89032645584672E-2   0.88893049399675E-2   0.88753591487767E-2   0.88614272300361E-2   0.88475092285511E-2
+ 0.88336051887914E-2   0.88197151548926E-2   0.88058391706567E-2   0.87919772795533E-2   0.87781295247203E-2
+ 0.87642959489652E-2   0.87504765947655E-2   0.87366715042699E-2   0.87228807192996E-2   0.87091042813486E-2
+ 0.8695342231585E-2   0.86815946108517E-2   0.86678614596678E-2   0.8654142818229E-2   0.86404387264089E-2
+ 0.86267492237597E-2   0.86130743495133E-2   0.85994141425822E-2   0.85857686415605E-2   0.85721378847247E-2
+ 0.85585219100347E-2   0.85449207551348E-2   0.85313344573546E-2    0.851776305371E-2   0.85042065809039E-2
+ 0.84906650753277E-2   0.84771385730616E-2   0.84636271098759E-2   0.8450130721232E-2   0.84366494422829E-2
+ 0.84231833078749E-2   0.84097323525479E-2   0.83962966105366E-2   0.83828761157714E-2   0.83694709018795E-2
+ 0.83560810021854E-2   0.83427064497126E-2   0.83293472771838E-2   0.83160035170223E-2   0.83026752013528E-2
+ 0.82893623620024E-2   0.82760650305014E-2   0.82627832380846E-2   0.82495170156918E-2   0.8236266393969E-2
+ 0.82230314032695E-2   0.82098120736545E-2   0.81966084348942E-2   0.8183420516469E-2    0.817024834757E-2
+ 0.81570919571004E-2   0.81439513736759E-2   0.81308266256263E-2   0.8117717740996E-2   0.81046247475451E-2
+ 0.80915476727503E-2   0.8078486543806E-2   0.80654413876249E-2   0.80524122308395E-2   0.80393990998025E-2
+ 0.8026402020588E-2   0.80134210189925E-2   0.80004561205359E-2   0.79875073504621E-2   0.79745747337404E-2
+ 0.7961658295066E-2   0.79487580588613E-2   0.79358740492768E-2   0.79230062901919E-2   0.79101548052159E-2
+ 0.7897319617689E-2   0.78845007506833E-2   0.78716982270034E-2   0.78589120691879E-2   0.78461422995099E-2
+ 0.78333889399782E-2   0.7820652012338E-2   0.7807931538072E-2   0.77952275384015E-2   0.7782540034287E-2
+ 0.77698690464294E-2   0.77572145952708E-2   0.77445767009955E-2   0.7731955383531E-2   0.77193506625489E-2
+ 0.77067625574656E-2   0.76941910874438E-2   0.76816362713927E-2   0.76690981279697E-2   0.76565766755807E-2
+ 0.76440719323814E-2   0.76315839162783E-2   0.76191126449291E-2   0.76066581357444E-2   0.75942204058879E-2
+ 0.7581799472278E-2   0.75693953515882E-2   0.75570080602481E-2   0.75446376144449E-2   0.75322840301236E-2
+ 0.7519947322988E-2   0.75076275085024E-2   0.74953246018916E-2   0.74830386181423E-2   0.74707695720039E-2
+ 0.74585174779894E-2   0.74462823503766E-2   0.74340642032086E-2   0.74218630502949E-2   0.74096789052125E-2
+ 0.73975117813065E-2   0.73853616916912E-2   0.73732286492511E-2   0.73611126666417E-2   0.73490137562903E-2
+ 0.73369319303972E-2   0.73248672009363E-2   0.73128195796562E-2   0.73007890780813E-2   0.72887757075121E-2
+ 0.72767794790269E-2   0.72648004034819E-2   0.7252838491513E-2   0.72408937535357E-2   0.72289661997469E-2
+ 0.72170558401253E-2   0.72051626844324E-2   0.71932867422135E-2   0.71814280227985E-2   0.71695865353027E-2
+ 0.71577622886282E-2   0.7145955291464E-2   0.71341655522876E-2   0.71223930793654E-2   0.71106378807541E-2
+ 0.7098899964301E-2   0.70871793376454E-2   0.70754760082192E-2   0.70637899832478E-2   0.70521212697512E-2
+ 0.70404698745447E-2   0.70288358042398E-2   0.7017219065245E-2   0.70056196637669E-2   0.69940376058111E-2
+ 0.69824728971827E-2   0.69709255434876E-2   0.69593955501331E-2   0.69478829223289E-2   0.69363876650881E-2
+ 0.69249097832276E-2   0.69134492813696E-2   0.69020061639421E-2   0.68905804351797E-2   0.68791720991247E-2
+ 0.68677811596278E-2   0.68564076203492E-2   0.6845051484759E-2   0.68337127561387E-2   0.68223914375813E-2
+ 0.6811087531993E-2   0.67998010420932E-2   0.67885319704162E-2   0.67772803193112E-2   0.6766046090944E-2
+ 0.67548292872972E-2   0.67436299101712E-2   0.67324479611853E-2   0.67212834417784E-2   0.67101363532097E-2
+ 0.66990066965598E-2   0.66878944727312E-2   0.66767996824495E-2   0.6665722326264E-2   0.66546624045488E-2
+ 0.66436199175033E-2   0.66325948651531E-2   0.66215872473511E-2   0.66105970637781E-2   0.65996243139436E-2
+ 0.65886689971869E-2   0.65777311126775E-2   0.65668106594163E-2   0.65559076362362E-2   0.6545022041803E-2
+ 0.65341538746164E-2   0.65233031330104E-2   0.65124698151545E-2   0.65016539190542E-2   0.64908554425522E-2
+ 0.64800743833288E-2   0.6469310738903E-2   0.64585645066332E-2   0.6447835683718E-2   0.6437124267197E-2
+ 0.64264302539516E-2   0.64157536407059E-2   0.64050944240273E-2   0.63944526003275E-2   0.63838281658632E-2
+ 0.63732211167368E-2   0.63626314488975E-2   0.63520591581418E-2   0.63415042401142E-2   0.63309666903084E-2
+ 0.63204465040678E-2   0.63099436765863E-2   0.62994582029089E-2   0.62889900779332E-2   0.62785392964091E-2
+ 0.62681058529406E-2   0.62576897419858E-2   0.62472909578582E-2   0.62369094947272E-2   0.62265453466189E-2
+ 0.62161985074169E-2   0.62058689708633E-2   0.61955567305588E-2   0.61852617799642E-2   0.61749841124008E-2
+ 0.61647237210512E-2   0.61544805989601E-2   0.6144254739035E-2   0.61340461340469E-2   0.61238547766313E-2
+ 0.61136806592886E-2   0.61035237743852E-2   0.60933841141539E-2   0.60832616706949E-2   0.60731564359765E-2
+ 0.60630684018357E-2   0.60529975599792E-2   0.60429439019839E-2   0.60329074192975E-2   0.60228881032398E-2
+ 0.60128859450028E-2   0.60029009356519E-2   0.59929330661262E-2   0.59829823272397E-2   0.59730487096816E-2
+ 0.59631322040173E-2   0.5953232800689E-2   0.59433504900165E-2   0.59334852621977E-2   0.59236371073096E-2
+ 0.59138060153088E-2   0.59039919760323E-2   0.58941949791984E-2   0.58844150144069E-2   0.58746520711404E-2
+ 0.58649061387644E-2   0.58551772065287E-2   0.58454652635673E-2   0.58357702988999E-2   0.5826092301432E-2
+ 0.58164312599558E-2   0.58067871631509E-2   0.57971599995852E-2   0.57875497577151E-2   0.57779564258865E-2
+ 0.57683799923356E-2   0.57588204451893E-2   0.57492777724661E-2   0.57397519620765E-2   0.5730243001824E-2
+ 0.57207508794057E-2   0.57112755824128E-2   0.57018170983313E-2   0.56923754145431E-2   0.56829505183258E-2
+ 0.56735423968543E-2   0.56641510372008E-2   0.56547764263359E-2   0.56454185511289E-2   0.56360773983487E-2
+ 0.56267529546643E-2   0.56174452066456E-2   0.56081541407641E-2   0.55988797433931E-2   0.55896220008089E-2
+ 0.55803808991914E-2   0.55711564246241E-2   0.55619485630957E-2   0.55527573004999E-2   0.55435826226365E-2
+ 0.5534424515212E-2   0.55252829638401E-2   0.55161579540424E-2   0.55070494712489E-2   0.54979575007989E-2
+ 0.54888820279415E-2   0.54798230378361E-2   0.54707805155531E-2   0.54617544460747E-2   0.54527448142952E-2
+ 0.54437516050218E-2   0.54347748029753E-2   0.54258143927906E-2   0.54168703590171E-2   0.54079426861198E-2
+ 0.53990313584795E-2   0.53901363603936E-2   0.53812576760765E-2   0.53723952896606E-2   0.53635491851964E-2
+ 0.53547193466534E-2   0.53459057579208E-2   0.53371084028077E-2   0.53283272650441E-2   0.53195623282812E-2
+ 0.53108135760921E-2   0.53020809919726E-2   0.52933645593412E-2   0.52846642615403E-2   0.52759800818366E-2
+ 0.52673120034214E-2   0.52586600094115E-2   0.52500240828497E-2   0.52414042067052E-2   0.52328003638744E-2
+ 0.52242125371815E-2   0.52156407093787E-2   0.52070848631471E-2   0.51985449810972E-2   0.51900210457694E-2
+ 0.51815130396347E-2   0.51730209450949E-2   0.51645447444837E-2   0.51560844200666E-2   0.51476399540423E-2
+ 0.51392113285423E-2   0.51307985256321E-2   0.51224015273115E-2   0.51140203155152E-2   0.51056548721135E-2
+ 0.50973051789124E-2   0.50889712176546E-2   0.50806529700199E-2   0.50723504176254E-2   0.50640635420266E-2
+ 0.50557923247175E-2   0.50475367471314E-2   0.50392967906413E-2   0.50310724365602E-2   0.50228636661421E-2
+ 0.50146704605822E-2   0.50064928010175E-2   0.49983306685272E-2   0.49901840441336E-2   0.4982052908802E-2
+ 0.49739372434418E-2   0.49658370289066E-2   0.4957752245995E-2   0.4949682875451E-2   0.49416288979642E-2
+ 0.4933590294171E-2   0.49255670446543E-2   0.49175591299447E-2   0.49095665305204E-2   0.49015892268082E-2
+ 0.48936271991836E-2   0.48856804279715E-2   0.48777488934469E-2   0.48698325758346E-2   0.48619314553108E-2
+ 0.48540455120026E-2   0.4846174725989E-2   0.48383190773015E-2   0.48304785459239E-2   0.48226531117936E-2
+ 0.48148427548016E-2   0.4807047454793E-2   0.47992671915675E-2   0.47915019448801E-2   0.47837516944412E-2
+ 0.47760164199173E-2   0.47682961009315E-2   0.47605907170637E-2   0.47529002478514E-2   0.47452246727899E-2
+ 0.47375639713328E-2   0.47299181228926E-2   0.4722287106841E-2   0.47146709025094E-2   0.47070694891894E-2
+ 0.46994828461331E-2   0.46919109525538E-2   0.46843537876262E-2   0.46768113304868E-2   0.46692835602348E-2
+ 0.46617704559318E-2   0.46542719966031E-2   0.46467881612373E-2   0.46393189287874E-2   0.46318642781707E-2
+ 0.46244241882696E-2   0.4616998637932E-2   0.46095876059714E-2   0.46021910711678E-2   0.45948090122678E-2
+ 0.4587441407985E-2   0.45800882370006E-2   0.45727494779637E-2   0.45654251094919E-2   0.45581151101713E-2
+ 0.45508194585575E-2   0.45435381331753E-2   0.45362711125199E-2   0.45290183750566E-2   0.45217798992217E-2
+ 0.45145556634226E-2   0.45073456460385E-2   0.45001498254202E-2   0.44929681798914E-2   0.44858006877484E-2
+ 0.44786473272606E-2   0.44715080766712E-2   0.44643829141972E-2   0.44572718180302E-2   0.44501747663363E-2
+ 0.4443091737257E-2   0.44360227089092E-2   0.44289676593857E-2   0.44219265667558E-2   0.44148994090653E-2
+ 0.4407886164337E-2   0.44008868105714E-2   0.43939013257466E-2   0.43869296878189E-2   0.43799718747233E-2
+ 0.43730278643735E-2   0.43660976346627E-2   0.43591811634638E-2   0.43522784286294E-2   0.43453894079928E-2
+ 0.43385140793679E-2   0.43316524205499E-2   0.43248044093152E-2   0.43179700234221E-2   0.43111492406113E-2
+ 0.43043420386058E-2   0.42975483951115E-2   0.42907682878177E-2   0.4284001694397E-2   0.42772485925062E-2
+ 0.42705089597862E-2   0.42637827738627E-2   0.42570700123461E-2   0.42503706528324E-2   0.4243684672903E-2
+ 0.42370120501254E-2   0.42303527620533E-2   0.42237067862273E-2   0.42170741001745E-2   0.42104546814099E-2
+ 0.42038485074357E-2   0.41972555557422E-2   0.4190675803808E-2   0.41841092291004E-2   0.41775558090755E-2
+ 0.41710155211787E-2   0.41644883428451E-2   0.41579742514994E-2   0.41514732245569E-2   0.41449852394231E-2
+ 0.41385102734945E-2   0.41320483041589E-2   0.41255993087952E-2   0.41191632647744E-2   0.41127401494594E-2
+ 0.41063299402056E-2   0.40999326143611E-2   0.40935481492668E-2   0.40871765222571E-2   0.40808177106599E-2
+ 0.40744716917972E-2   0.40681384429848E-2   0.40618179415334E-2   0.40555101647482E-2   0.40492150899296E-2
+ 0.40429326943733E-2   0.40366629553708E-2   0.40304058502093E-2   0.40241613561724E-2   0.40179294505402E-2
+ 0.40117101105896E-2   0.40055033135945E-2   0.39993090368263E-2   0.39931272575539E-2   0.39869579530442E-2
+ 0.39808011005623E-2   0.39746566773716E-2   0.39685246607345E-2   0.39624050279123E-2   0.39562977561655E-2
+ 0.39502028227544E-2   0.39441202049387E-2   0.39380498799787E-2   0.39319918251346E-2   0.39259460176675E-2
+ 0.39199124348393E-2   0.3913891053913E-2   0.3907881852153E-2   0.39018848068254E-2   0.38958998951982E-2
+ 0.38899270945416E-2   0.38839663821281E-2   0.38780177352329E-2   0.38720811311344E-2   0.38661565471137E-2
+ 0.38602439604557E-2   0.38543433484488E-2   0.38484546883854E-2   0.38425779575619E-2   0.38367131332793E-2
+ 0.3830860192843E-2   0.38250191135636E-2   0.38191898727566E-2   0.38133724477429E-2   0.38075668158489E-2
+ 0.3801772954407E-2   0.37959908407556E-2   0.37902204522393E-2   0.37844617662094E-2   0.37787147600237E-2
+ 0.37729794110473E-2   0.37672556966521E-2   0.37615435942179E-2   0.37558430811319E-2   0.3750154134789E-2
+ 0.37444767325926E-2   0.37388108519541E-2   0.37331564702935E-2   0.37275135650398E-2   0.37218821136273E-2
+ 0.37162620935086E-2   0.3710653482148E-2   0.37050562570215E-2   0.36994703955861E-2   0.36938958753116E-2
+ 0.36883326736951E-2   0.36827807682528E-2   0.36772401365092E-2    0.367171075599E-2   0.36661926042336E-2
+ 0.36606856587916E-2   0.36551898972309E-2   0.36497052971367E-2   0.36442318360833E-2   0.36387694916564E-2
+ 0.3633318241454E-2   0.36278780631108E-2   0.36224489342669E-2   0.36170308325711E-2   0.36116237356835E-2
+ 0.36062276212769E-2   0.36008424670427E-2   0.35954682506882E-2   0.35901049499287E-2   0.35847525424814E-2
+ 0.35794110060754E-2   0.35740803184751E-2   0.35687604574584E-2   0.35634514008164E-2   0.35581531263468E-2
+ 0.35528656118621E-2   0.35475888351976E-2   0.35423227742068E-2   0.35370674067671E-2   0.35318227107388E-2
+ 0.35265886640045E-2    0.352136524447E-2   0.35161524300714E-2   0.35109501987542E-2   0.35057585284821E-2
+ 0.35005773972382E-2   0.3495406783023E-2   0.34902466638315E-2   0.34850970176772E-2   0.34799578226082E-2
+ 0.34748290566964E-2   0.34697106980314E-2   0.34646027247053E-2   0.34595051148308E-2   0.34544178465435E-2
+ 0.34493408980039E-2   0.34442742473979E-2   0.34392178729029E-2   0.34341717527163E-2   0.34291358650565E-2
+ 0.34241101881831E-2   0.34190947003695E-2   0.34140893799014E-2   0.34090942050822E-2   0.34041091542329E-2
+ 0.33991342057074E-2   0.33941693378808E-2   0.33892145291389E-2   0.33842697578743E-2   0.33793350024972E-2
+ 0.33744102414644E-2    0.336949545325E-2   0.33645906163474E-2   0.33596957092625E-2   0.33548107105237E-2
+ 0.33499355986856E-2   0.33450703523265E-2   0.33402149500502E-2   0.33353693704614E-2   0.33305335921903E-2
+ 0.33257075938953E-2   0.33208913542648E-2   0.3316084852007E-2   0.33112880658479E-2   0.33065009745356E-2
+ 0.33017235568416E-2   0.32969557915681E-2   0.32921976575453E-2   0.32874491336062E-2   0.32827101986021E-2
+ 0.3277980831405E-2   0.32732610109381E-2   0.32685507161387E-2   0.32638499259673E-2   0.32591586194078E-2
+ 0.32544767754766E-2   0.32498043731893E-2   0.32451413915874E-2   0.32404878097396E-2   0.32358436067585E-2
+ 0.32312087617764E-2   0.32265832539422E-2   0.32219670624277E-2   0.32173601664291E-2   0.32127625451756E-2
+ 0.32081741779233E-2   0.32035950439441E-2   0.31990251225263E-2   0.31944643929803E-2   0.31899128346641E-2
+ 0.31853704269567E-2   0.31808371492613E-2   0.31763129810017E-2   0.31717979016273E-2   0.31672918906187E-2
+ 0.31627949274837E-2   0.31583069917598E-2   0.31538280629886E-2   0.31493581207408E-2   0.31448971446229E-2
+ 0.31404451142761E-2   0.31360020093662E-2   0.3131567809578E-2   0.31271424946237E-2   0.31227260442433E-2
+ 0.31183184382092E-2   0.31139196563248E-2   0.3109529678404E-2   0.31051484842853E-2   0.31007760538332E-2
+ 0.30964123669601E-2   0.30920574035999E-2   0.30877111437108E-2   0.30833735672769E-2   0.30790446543087E-2
+ 0.30747243848507E-2   0.30704127389766E-2   0.30661096967844E-2   0.30618152383871E-2   0.30575293439254E-2
+ 0.30532519935824E-2   0.30489831675695E-2   0.30447228461238E-2   0.30404710095137E-2   0.30362276380404E-2
+ 0.30319927120221E-2   0.30277662117988E-2   0.30235481177352E-2   0.30193384102477E-2   0.30151370697765E-2
+ 0.30109440767883E-2   0.30067594117733E-2   0.30025830552497E-2   0.2998414987773E-2   0.29942551899293E-2
+ 0.29901036423361E-2   0.2985960325617E-2   0.29818252204274E-2   0.29776983074644E-2   0.29735795674613E-2
+ 0.29694689811788E-2   0.29653665294004E-2   0.29612721929408E-2   0.2957185952645E-2   0.29531077893903E-2
+ 0.29490376840894E-2   0.29449756176667E-2   0.29409215710754E-2   0.29368755252978E-2   0.29328374613698E-2
+ 0.29288073603526E-2   0.29247852033291E-2   0.2920770971408E-2   0.29167646457254E-2   0.29127662074644E-2
+ 0.29087756378374E-2   0.2904792918081E-2   0.29008180294479E-2   0.28968509532218E-2   0.28928916707324E-2
+ 0.28889401633388E-2   0.28849964124289E-2   0.28810603994217E-2   0.28771321057662E-2   0.28732115129431E-2
+ 0.28692986024639E-2   0.28653933558783E-2   0.28614957547439E-2   0.28576057806528E-2   0.28537234152337E-2
+ 0.28498486401585E-2   0.28459814371238E-2   0.28421217878595E-2   0.28382696741286E-2   0.28344250777266E-2
+ 0.28305879804575E-2   0.28267583641585E-2   0.2822936210713E-2   0.28191215020413E-2   0.28153142200939E-2
+ 0.28115143468429E-2   0.28077218642935E-2   0.28039367544847E-2   0.28001589994911E-2   0.27963885814246E-2
+ 0.27926254824073E-2   0.27888696845924E-2   0.27851211701662E-2   0.27813799213678E-2   0.27776459204624E-2
+ 0.27739191497406E-2   0.27701995915223E-2   0.27664872281581E-2   0.27627820420396E-2   0.27590840155909E-2
+ 0.27553931312619E-2   0.27517093715241E-2   0.27480327188792E-2   0.27443631558784E-2   0.27407006651033E-2
+ 0.27370452291658E-2   0.27333968307036E-2   0.27297554523858E-2   0.27261210769201E-2   0.27224936870482E-2
+ 0.27188732655482E-2   0.27152597952091E-2   0.27116532588564E-2   0.27080536393525E-2   0.27044609195998E-2
+  0.270087508253E-2   0.26972961111041E-2   0.26937239883147E-2   0.2690158697187E-2   0.26866002207839E-2
+ 0.26830485422039E-2   0.26795036445645E-2   0.26759655110114E-2   0.26724341247209E-2   0.26689094689208E-2
+ 0.26653915268642E-2   0.26618802818373E-2    0.265837571716E-2   0.26548778161918E-2   0.26513865623024E-2
+ 0.26479019388958E-2   0.26444239294107E-2   0.26409525173334E-2   0.26374876861784E-2   0.26340294194884E-2
+ 0.26305777008372E-2   0.26271325138309E-2   0.26236938421132E-2   0.26202616693619E-2   0.26168359792807E-2
+ 0.26134167555987E-2   0.26100039820747E-2   0.26065976425181E-2   0.26031977207675E-2   0.25998042006931E-2
+ 0.25964170661921E-2   0.25930363011952E-2   0.25896618896687E-2   0.25862938156127E-2   0.25829320630623E-2
+ 0.25795766160699E-2   0.25762274587225E-2   0.25728845751457E-2   0.25695479495035E-2   0.25662175659901E-2
+ 0.25628934088298E-2   0.25595754622795E-2   0.25562637106289E-2   0.25529581382026E-2   0.25496587293613E-2
+ 0.25463654684864E-2   0.25430783399895E-2   0.25397973283134E-2   0.25365224179506E-2   0.25332535934208E-2
+ 0.25299908392745E-2   0.25267341400922E-2   0.2523483480487E-2   0.2520238845108E-2   0.25170002186376E-2
+ 0.25137675857888E-2   0.25105409312973E-2   0.25073202399308E-2   0.25041054965008E-2   0.25008966858512E-2
+ 0.24976937928562E-2   0.2494496802426E-2   0.24913056995069E-2   0.24881204690674E-2   0.24849410961002E-2
+ 0.24817675656271E-2   0.24785998627254E-2   0.24754379724999E-2   0.24722818800858E-2   0.24691315706452E-2
+ 0.24659870293726E-2   0.24628482415002E-2   0.24597151922942E-2   0.24565878670549E-2   0.24534662510964E-2
+ 0.24503503297668E-2   0.24472400884566E-2   0.24441355125956E-2   0.24410365876453E-2   0.24379432990883E-2
+ 0.24348556324409E-2   0.24317735732536E-2   0.24286971071172E-2   0.24256262196584E-2   0.24225608965166E-2
+ 0.24195011233618E-2   0.24164468858963E-2   0.2413398169873E-2   0.24103549610709E-2   0.24073172452993E-2
+ 0.24042850083987E-2   0.24012582362415E-2   0.23982369147339E-2   0.2395221029816E-2   0.23922105674566E-2
+ 0.2389205513647E-2   0.2386205854409E-2   0.23832115758107E-2   0.23802226639516E-2   0.2377239104962E-2
+ 0.23742608849999E-2   0.23712879902552E-2   0.23683204069525E-2   0.23653581213488E-2   0.23624011197392E-2
+ 0.23594493884298E-2   0.23565029137614E-2   0.23535616821116E-2   0.23506256799017E-2   0.23476948935805E-2
+ 0.23447693096252E-2   0.2341848914546E-2   0.23389336948859E-2   0.23360236372065E-2   0.23331187281014E-2
+ 0.23302189542049E-2   0.23273243021869E-2   0.23244347587477E-2   0.23215503106135E-2   0.23186709445434E-2
+ 0.23157966473283E-2   0.23129274057922E-2   0.23100632067929E-2   0.23072040372102E-2   0.23043498839555E-2
+ 0.23015007339714E-2   0.22986565742398E-2   0.22958173917713E-2   0.22929831736062E-2   0.2290153906815E-2
+ 0.22873295784974E-2   0.22845101757924E-2   0.22816956858702E-2   0.22788860959274E-2   0.22760813931822E-2
+ 0.22732815648841E-2   0.22704865983246E-2   0.22676964808245E-2   0.22649111997347E-2   0.22621307424366E-2
+ 0.22593550963416E-2   0.22565842488936E-2   0.22538181875675E-2   0.22510568998734E-2   0.22483003733361E-2
+ 0.22455485955131E-2   0.22428015539977E-2   0.22400592364225E-2   0.22373216304493E-2   0.22345887237627E-2
+ 0.22318605040781E-2   0.2229136959142E-2   0.22264180767358E-2   0.22237038446732E-2   0.22209942507896E-2
+ 0.22182892829479E-2   0.22155889290386E-2   0.22128931769997E-2   0.22102020147944E-2   0.22075154304146E-2
+ 0.22048334118801E-2   0.22021559472462E-2   0.21994830245861E-2   0.21968146320026E-2   0.21941507576303E-2
+ 0.21914913896471E-2   0.21888365162582E-2   0.21861861256927E-2   0.21835402062083E-2   0.2180898746092E-2
+ 0.21782617336666E-2   0.21756291572855E-2   0.21730010053262E-2   0.21703772661896E-2   0.21677579283039E-2
+ 0.21651429801422E-2   0.2162532410205E-2   0.21599262070212E-2   0.21573243591436E-2   0.21547268551538E-2
+ 0.21521336836695E-2   0.21495448333394E-2   0.21469602928455E-2   0.21443800508777E-2   0.21418040961588E-2
+ 0.21392324174477E-2   0.21366650035402E-2   0.21341018432586E-2   0.21315429254508E-2   0.21289882389948E-2
+ 0.21264377727974E-2   0.21238915157938E-2   0.21213494569507E-2   0.21188115852577E-2   0.21162778897315E-2
+ 0.21137483594168E-2   0.21112229833973E-2   0.21087017507823E-2   0.21061846507089E-2   0.21036716723423E-2
+ 0.21011628048754E-2   0.20986580375329E-2   0.2096157359569E-2   0.20936607602647E-2   0.20911682289204E-2
+ 0.20886797548652E-2   0.20861953274649E-2   0.20837149361147E-2   0.2081238570236E-2   0.20787662192797E-2
+ 0.20762978727266E-2   0.20738335200813E-2   0.2071373150872E-2   0.2068916754654E-2   0.20664643210204E-2
+ 0.20640158395898E-2   0.20615713000085E-2   0.20591306919488E-2    0.205669400511E-2   0.20542612292232E-2
+ 0.20518323540482E-2   0.20494073693744E-2   0.20469862650048E-2   0.20445690307722E-2   0.20421556565423E-2
+ 0.2039746132213E-2   0.20373404477067E-2   0.20349385929742E-2   0.20325405579935E-2   0.20301463327699E-2
+ 0.20277559073345E-2   0.20253692717488E-2   0.20229864160947E-2   0.20206073304804E-2   0.20182320050403E-2
+ 0.20158604299472E-2   0.20134925953977E-2   0.20111284916136E-2   0.20087681088427E-2   0.20064114373604E-2
+ 0.20040584674683E-2   0.2001709189496E-2   0.19993635937988E-2   0.19970216707553E-2   0.19946834107703E-2
+ 0.19923488042801E-2   0.19900178417476E-2   0.19876905136615E-2   0.19853668105379E-2   0.19830467229191E-2
+ 0.19807302413735E-2   0.19784173564961E-2   0.19761080589112E-2   0.19738023392594E-2   0.19715001882085E-2
+ 0.19692015964552E-2   0.19669065547295E-2   0.19646150537853E-2     0.19623270844E-2   0.19600426373773E-2
+ 0.19577617035481E-2   0.19554842737628E-2   0.1953210338898E-2   0.19509398898606E-2   0.19486729175855E-2
+ 0.19464094130336E-2   0.19441493671862E-2   0.19418927710503E-2   0.19396396156607E-2   0.19373898920819E-2
+ 0.19351435914068E-2   0.19329007047414E-2   0.19306612232175E-2   0.1928425137993E-2   0.19261924402573E-2
+ 0.19239631212215E-2   0.19217371721243E-2   0.19195145842309E-2   0.19172953488312E-2   0.19150794572382E-2
+ 0.19128669007923E-2   0.19106576708564E-2   0.19084517588122E-2   0.19062491560658E-2   0.19040498540571E-2
+ 0.19018538442497E-2   0.18996611181312E-2   0.18974716672142E-2   0.18952854830355E-2   0.18931025571569E-2
+ 0.18909228811643E-2   0.18887464466723E-2   0.18865732453072E-2   0.18844032687216E-2   0.18822365085962E-2
+ 0.18800729566428E-2   0.18779126045963E-2   0.18757554442107E-2   0.18736014672647E-2   0.18714506655614E-2
+ 0.18693030309305E-2   0.18671585552269E-2   0.1865017230324E-2   0.18628790481173E-2   0.18607440005247E-2
+ 0.18586120794968E-2   0.18564832770045E-2   0.1854357585043E-2   0.18522349956324E-2   0.18501155008181E-2
+ 0.18479990926621E-2   0.18458857632504E-2   0.18437755046928E-2   0.18416683091263E-2   0.18395641687091E-2
+ 0.18374630756241E-2   0.18353650220781E-2   0.18332700003012E-2   0.1831178002545E-2   0.18290890210857E-2
+ 0.18270030482211E-2   0.18249200762698E-2   0.18228400975734E-2   0.18207631044994E-2   0.18186890894371E-2
+ 0.1816618044799E-2   0.1814549963022E-2   0.18124848365653E-2   0.18104226579106E-2   0.1808363419563E-2
+ 0.18063071140531E-2   0.1804253733922E-2   0.18022032717353E-2   0.18001557200849E-2   0.17981110715912E-2
+ 0.1796069318895E-2   0.17940304546559E-2   0.17919944715559E-2   0.17899613622996E-2   0.17879311196165E-2
+ 0.17859037362608E-2      0.1783879205E-2   0.17818575186219E-2   0.17798386699345E-2   0.17778226517819E-2
+ 0.17758094570266E-2   0.17737990785502E-2   0.17717915092525E-2   0.17697867420541E-2   0.17677847699047E-2
+ 0.17657855857754E-2   0.17637891826577E-2   0.17617955535551E-2   0.17598046914932E-2   0.17578165895269E-2
+ 0.17558312407334E-2   0.17538486382093E-2   0.17518687750753E-2   0.17498916444762E-2   0.17479172395707E-2
+ 0.17459455535314E-2   0.17439765795495E-2   0.17420103108555E-2   0.17400467406978E-2   0.17380858623438E-2
+ 0.17361276690768E-2   0.17341721542017E-2   0.17322193110472E-2   0.17302691329636E-2   0.17283216133227E-2
+ 0.17263767455091E-2   0.17244345229293E-2   0.17224949390132E-2   0.17205579872137E-2   0.17186236610033E-2
+ 0.17166919538734E-2   0.17147628593352E-2   0.17128363709212E-2   0.17109124821881E-2   0.17089911867155E-2
+ 0.1707072478092E-2   0.17051563499243E-2   0.17032427958388E-2   0.17013318094963E-2   0.16994233845748E-2
+ 0.16975175147677E-2   0.16956141937858E-2   0.16937134153589E-2   0.16918151732434E-2   0.16899194612149E-2
+ 0.16880262730672E-2   0.16861356026069E-2   0.16842474436604E-2   0.16823617900803E-2   0.16804786357391E-2
+ 0.16785979745276E-2   0.16767198003557E-2   0.16748441071527E-2   0.16729708888672E-2   0.16711001394665E-2
+ 0.16692318529393E-2   0.16673660232879E-2   0.16655026445338E-2   0.16636417107195E-2   0.16617832159106E-2
+ 0.16599271541902E-2    0.165807351966E-2   0.16562223064414E-2   0.16543735086753E-2   0.1652527120514E-2
+ 0.1650683136129E-2   0.1648841549715E-2   0.16470023554876E-2    0.164516554768E-2   0.16433311205427E-2
+ 0.16414990683454E-2   0.16396693853759E-2   0.1637842065941E-2   0.16360171043677E-2   0.16341944949958E-2
+ 0.16323742321831E-2   0.16305563103057E-2   0.16287407237629E-2   0.16269274669696E-2    0.162511653436E-2
+ 0.16233079203873E-2   0.1621501619523E-2   0.1619697626254E-2   0.16178959350867E-2   0.16160965405442E-2
+ 0.16142994371648E-2   0.16125046195036E-2   0.16107120821387E-2   0.16089218196653E-2   0.16071338266959E-2
+ 0.16053480978593E-2   0.16035646278011E-2   0.16017834111871E-2   0.16000044427022E-2   0.15982277170523E-2
+ 0.1596453228946E-2   0.15946809731119E-2   0.15929109442988E-2   0.15911431372793E-2   0.15893775468411E-2
+ 0.15876141677865E-2   0.15858529949349E-2   0.1584094023123E-2   0.15823372472065E-2   0.15805826620598E-2
+ 0.15788302625684E-2   0.15770800436322E-2   0.15753320001656E-2   0.15735861271127E-2   0.15718424194304E-2
+ 0.15701008720917E-2   0.15683614800847E-2   0.15666242384174E-2   0.15648891421073E-2   0.15631561861885E-2
+ 0.15614253657118E-2   0.15596966757512E-2   0.15579701113949E-2   0.15562456677464E-2   0.1554523339925E-2
+ 0.15528031230655E-2   0.15510850123226E-2   0.15493690028683E-2   0.15476550898866E-2   0.15459432685721E-2
+ 0.15442335341341E-2   0.15425258818085E-2   0.15408203068454E-2   0.15391168045105E-2   0.15374153700825E-2
+ 0.15357159988566E-2   0.1534018686145E-2   0.15323234272759E-2   0.15306302175949E-2   0.15289390524567E-2
+ 0.15272499272331E-2   0.15255628373127E-2   0.15238777781012E-2   0.15221947450185E-2   0.15205137335011E-2
+ 0.15188347390009E-2   0.15171577569847E-2   0.15154827829353E-2   0.15138098123527E-2   0.15121388407467E-2
+ 0.15104698636403E-2   0.15088028765703E-2   0.15071378750996E-2   0.15054748548038E-2   0.15038138112708E-2
+ 0.15021547401002E-2   0.15004976369055E-2   0.14988424973227E-2   0.14971893170025E-2   0.14955380916094E-2
+ 0.14938888168131E-2   0.14922414882981E-2   0.1490596101772E-2   0.14889526529588E-2   0.14873111375962E-2
+ 0.14856715514319E-2   0.14840338902305E-2   0.14823981497696E-2   0.14807643258398E-2   0.14791324142454E-2
+ 0.1477502410809E-2   0.14758743113668E-2   0.1474248111769E-2   0.14726238078783E-2   0.14710013955703E-2
+ 0.14693808707395E-2   0.14677622292961E-2   0.14661454671663E-2   0.14645305802756E-2   0.14629175645654E-2
+ 0.14613064159971E-2   0.14596971305513E-2   0.14580897042223E-2   0.14564841330102E-2   0.14548804129294E-2
+ 0.14532785400093E-2   0.14516785102988E-2   0.1450080319862E-2   0.14484839647665E-2   0.14468894410921E-2
+ 0.14452967449316E-2   0.14437058724018E-2   0.14421168196298E-2   0.1440529582755E-2   0.14389441579293E-2
+ 0.1437360541318E-2   0.14357787291007E-2   0.14341987174706E-2   0.14326205026334E-2   0.14310440808038E-2
+ 0.14294694482091E-2   0.14278966010949E-2   0.14263255357198E-2   0.14247562483552E-2   0.14231887352831E-2
+ 0.1421622992798E-2   0.14200590172098E-2   0.14184968048428E-2   0.14169363520375E-2   0.14153776551342E-2
+ 0.14138207104874E-2   0.14122655144667E-2   0.14107120634629E-2   0.14091603538776E-2   0.14076103821203E-2
+ 0.1406062144613E-2   0.14045156377915E-2   0.1402970858101E-2   0.14014278019991E-2   0.13998864659582E-2
+ 0.13983468464646E-2   0.13968089400165E-2   0.13952727431223E-2   0.13937382523027E-2   0.13922054640911E-2
+ 0.13906743750345E-2   0.13891449816929E-2   0.13876172806343E-2   0.1386091268439E-2   0.13845669416995E-2
+ 0.13830442970214E-2   0.13815233310212E-2   0.13800040403287E-2   0.1378486421587E-2   0.13769704714507E-2
+ 0.13754561865838E-2   0.13739435636632E-2   0.13724325993768E-2   0.13709232904234E-2   0.13694156335136E-2
+ 0.13679096253695E-2   0.13664052627242E-2   0.13649025423219E-2   0.13634014609234E-2   0.13619020152997E-2
+ 0.13604042022317E-2   0.13589080185109E-2   0.13574134609429E-2   0.13559205263375E-2   0.13544292115166E-2
+ 0.13529395133151E-2   0.13514514285829E-2   0.13499649541781E-2   0.13484800869727E-2   0.13469968238496E-2
+ 0.13455151617032E-2   0.13440350974344E-2   0.13425566279574E-2   0.13410797501958E-2   0.13396044610835E-2
+ 0.13381307575636E-2   0.13366586365964E-2   0.1335188095151E-2   0.13337191302072E-2   0.13322517387558E-2
+ 0.13307859178006E-2   0.1329321664349E-2   0.13278589754192E-2   0.13263978480401E-2   0.13249382792576E-2
+ 0.13234802661265E-2   0.13220238057102E-2   0.13205688950817E-2   0.13191155313227E-2   0.13176637115326E-2
+ 0.13162134328213E-2   0.13147646923049E-2   0.13133174871022E-2   0.13118718143416E-2   0.1310427671173E-2
+ 0.13089850547559E-2   0.13075439622588E-2   0.13061043908561E-2   0.13046663377326E-2   0.13032298000861E-2
+ 0.13017947751253E-2   0.13003612600711E-2   0.12989292521443E-2   0.12974987485777E-2   0.12960697466162E-2
+ 0.12946422435184E-2   0.12932162365521E-2   0.12917917229917E-2   0.12903687001217E-2   0.12889471652363E-2
+ 0.12875271156424E-2   0.12861085486582E-2   0.12846914616052E-2   0.12832758518125E-2   0.12818617166175E-2
+ 0.12804490533774E-2   0.12790378594567E-2   0.12776281322271E-2   0.12762198690676E-2   0.12748130673658E-2
+ 0.1273407724524E-2   0.12720038379547E-2   0.12706014050788E-2   0.12692004233161E-2   0.12678008900958E-2
+ 0.12664028028661E-2   0.12650061590864E-2   0.12636109562257E-2   0.12622171917534E-2   0.12608248631517E-2
+ 0.12594339679107E-2   0.12580445035281E-2   0.12566564675088E-2   0.12552698573739E-2   0.1253884670653E-2
+ 0.12525009048833E-2   0.12511185576071E-2   0.12497376263755E-2   0.1248358108752E-2   0.12469800023099E-2
+ 0.12456033046329E-2   0.12442280133036E-2   0.12428541259151E-2   0.12414816400722E-2   0.12401105533917E-2
+ 0.12387408634993E-2   0.12373725680238E-2   0.12360056646029E-2   0.12346401508835E-2   0.12332760245265E-2
+ 0.12319132832019E-2   0.12305519245807E-2   0.12291919463414E-2   0.12278333461711E-2   0.12264761217695E-2
+ 0.12251202708429E-2   0.12237657911064E-2   0.12224126802838E-2   0.1221060936106E-2   0.12197105563145E-2
+ 0.12183615386597E-2   0.12170138808988E-2   0.12156675807895E-2   0.12143226360971E-2   0.12129790446039E-2
+ 0.12116368041013E-2   0.12102959123882E-2   0.1208956367266E-2   0.12076181665458E-2   0.1206281308047E-2
+ 0.12049457895973E-2   0.12036116090332E-2   0.12022787641956E-2   0.12009472529337E-2   0.11996170731049E-2
+ 0.11982882225758E-2   0.11969606992192E-2   0.1195634500918E-2   0.11943096255633E-2   0.11929860710552E-2
+ 0.11916638352917E-2   0.11903429161789E-2   0.1189023311636E-2   0.11877050195945E-2   0.11863880379937E-2
+ 0.1185072364771E-2   0.11837579978725E-2   0.11824449352533E-2   0.11811331748794E-2   0.11798227147242E-2
+ 0.11785135527644E-2   0.11772056869831E-2   0.11758991153712E-2   0.11745938359302E-2   0.1173289846668E-2
+ 0.11719871455987E-2   0.11706857307434E-2   0.11693856001301E-2   0.11680867517945E-2   0.11667891837796E-2
+ 0.1165492894135E-2   0.11641978809158E-2   0.11629041421845E-2   0.11616116760115E-2   0.11603204804741E-2
+ 0.1159030553656E-2   0.11577418936496E-2   0.11564544985535E-2   0.1155168366473E-2   0.11538834955197E-2
+ 0.11525998838145E-2   0.11513175294784E-2   0.11500364306397E-2   0.11487565854351E-2   0.11474779920136E-2
+ 0.11462006485302E-2   0.11449245531419E-2   0.11436497040125E-2   0.11423760993126E-2   0.11411037372214E-2
+ 0.11398326159254E-2   0.11385627336145E-2   0.11372940884833E-2   0.11360266787306E-2   0.1134760502572E-2
+ 0.11334955582274E-2   0.11322318439211E-2   0.11309693578798E-2   0.11297080983384E-2   0.11284480635379E-2
+ 0.11271892517253E-2   0.11259316611532E-2   0.11246752900857E-2   0.11234201367928E-2   0.1122166199547E-2
+ 0.11209134766253E-2   0.11196619663101E-2   0.11184116668957E-2   0.11171625766817E-2   0.11159146939722E-2
+ 0.11146680170744E-2   0.11134225443011E-2   0.11121782739754E-2   0.11109352044261E-2   0.11096933339876E-2
+ 0.11084526609987E-2   0.1107213183804E-2   0.11059749007552E-2   0.11047378102097E-2   0.11035019105322E-2
+ 0.11022672000886E-2   0.1101033677251E-2   0.1099801340399E-2   0.10985701879212E-2   0.10973402182119E-2
+ 0.1096111429667E-2   0.10948838206879E-2   0.10936573896821E-2   0.1092432135066E-2   0.10912080552622E-2
+ 0.10899851486946E-2   0.10887634137914E-2   0.10875428489853E-2   0.10863234527213E-2   0.10851052234476E-2
+ 0.1083888159618E-2   0.10826722596914E-2   0.10814575221326E-2   0.10802439454107E-2   0.10790315280001E-2
+ 0.10778202683812E-2   0.10766101650376E-2   0.10754012164584E-2   0.10741934211394E-2   0.10729867775816E-2
+ 0.10717812842899E-2   0.1070576939779E-2   0.10693737425692E-2   0.10681716911828E-2   0.10669707841436E-2
+ 0.10657710199806E-2   0.10645723972323E-2   0.10633749144414E-2   0.10621785701553E-2   0.10609833629284E-2
+ 0.10597892913193E-2   0.10585963538916E-2   0.10574045492139E-2   0.10562138758621E-2   0.10550243324083E-2
+ 0.10538359174302E-2   0.10526486295147E-2   0.10514624672588E-2   0.10502774292634E-2   0.10490935141293E-2
+ 0.10479107204632E-2   0.10467290468767E-2   0.1045548491987E-2   0.10443690544163E-2   0.10431907327902E-2
+ 0.10420135257382E-2   0.10408374318945E-2   0.10396624499006E-2   0.1038488578402E-2   0.10373158160482E-2
+ 0.10361441614936E-2   0.10349736133961E-2   0.10338041704206E-2   0.10326358312367E-2   0.1031468594518E-2
+ 0.10303024589396E-2   0.10291374231814E-2   0.10279734859306E-2   0.10268106458791E-2   0.10256489017234E-2
+ 0.10244882521622E-2   0.10233286958988E-2   0.1022170231642E-2   0.10210128581056E-2   0.10198565740088E-2
+ 0.1018701378071E-2   0.1017547269016E-2   0.10163942455728E-2   0.10152423064793E-2   0.10140914504768E-2
+ 0.10129416763084E-2   0.10117929827212E-2   0.10106453684672E-2   0.10094988323012E-2   0.10083533729825E-2
+ 0.10072089892747E-2   0.10060656799457E-2   0.10049234437654E-2   0.10037822795138E-2   0.1002642185974E-2
+ 0.10015031619327E-2   0.10003652061774E-2   0.99922831750221E-3   0.99809249470252E-3   0.99695773657736E-3
+ 0.9958240419292E-3   0.99469140956999E-3   0.99355983831428E-3   0.99242932697934E-3   0.99129987438552E-3
+ 0.9901714793568E-3   0.98904414072337E-3   0.98791785731947E-3   0.98679262798227E-3   0.98566845154933E-3
+ 0.98454532686194E-3   0.98342325276926E-3   0.98230222812443E-3   0.98118225178403E-3   0.98006332260686E-3
+ 0.97894543945555E-3   0.97782860119746E-3   0.97671280670431E-3   0.97559805485315E-3   0.97448434451865E-3
+ 0.97337167458004E-3   0.97226004392136E-3   0.97114945143354E-3   0.9700398960103E-3   0.96893137654754E-3
+ 0.96782389194462E-3   0.96671744110438E-3   0.96561202293524E-3   0.9645076363499E-3   0.96340428026136E-3
+ 0.9623019535843E-3   0.96120065523579E-3   0.96010038414312E-3   0.95900113923502E-3   0.95790291944354E-3
+ 0.95680572370408E-3   0.95570955095727E-3   0.95461440014232E-3   0.95352027020152E-3   0.95242716008057E-3
+ 0.95133506873389E-3   0.95024399511782E-3   0.94915393819082E-3   0.94806489691412E-3   0.94697687025202E-3
+ 0.94588985717387E-3   0.94480385665253E-3   0.94371886766292E-3   0.94263488918043E-3   0.94155192018339E-3
+ 0.9404699596574E-3   0.93938900659106E-3   0.9383090599758E-3   0.93723011880524E-3   0.93615218207618E-3
+ 0.9350752487893E-3   0.9339993179488E-3   0.93292438856366E-3   0.93185045963986E-3   0.93077753018748E-3
+ 0.92970559922115E-3   0.92863466576158E-3   0.92756472883173E-3   0.92649578745594E-3   0.92542784066154E-3
+ 0.92436088747891E-3   0.92329492694313E-3   0.92222995809312E-3   0.9211659799672E-3   0.92010299160525E-3
+ 0.91904099204897E-3   0.91797998034979E-3   0.91691995556022E-3   0.91586091673492E-3   0.9148028629301E-3
+ 0.91374579320467E-3   0.91268970662253E-3   0.91163460225073E-3   0.91058047915901E-3   0.90952733641516E-3
+ 0.90847517308998E-3   0.90742398826071E-3   0.90637378100847E-3   0.90532455041635E-3   0.90427629556965E-3
+ 0.90322901555745E-3   0.90218270947004E-3   0.90113737639805E-3   0.90009301543433E-3   0.89904962567881E-3
+ 0.89800720623354E-3   0.89696575620289E-3   0.89592527469283E-3   0.8948857608119E-3   0.89384721367229E-3
+ 0.89280963238917E-3   0.89177301608165E-3   0.89073736386548E-3   0.88970267485982E-3   0.88866894818843E-3
+ 0.8876361829804E-3   0.88660437836683E-3   0.88557353347895E-3   0.88454364745065E-3   0.88351471941854E-3
+ 0.88248674852331E-3   0.88145973390893E-3   0.8804336747183E-3   0.87940857009583E-3   0.87838441918775E-3
+ 0.87736122114818E-3   0.87633897513219E-3   0.87531768029648E-3   0.87429733579929E-3   0.87327794080104E-3
+ 0.87225949446622E-3   0.87124199596194E-3   0.87022544445724E-3   0.86920983911965E-3   0.86819517911902E-3
+ 0.8671814636312E-3   0.86616869183499E-3   0.86515686291118E-3   0.86414597604092E-3   0.86313603040795E-3
+ 0.86212702519885E-3   0.86111895960316E-3   0.86011183281396E-3   0.85910564402163E-3   0.85810039241923E-3
+ 0.85709607720264E-3   0.85609269757319E-3   0.85509025273283E-3   0.85408874188623E-3   0.85308816424053E-3
+ 0.85208851900614E-3   0.85108980538974E-3   0.85009202260089E-3   0.84909516985369E-3   0.84809924636666E-3
+ 0.84710425135993E-3   0.84611018405342E-3   0.84511704366936E-3   0.84412482943235E-3   0.84313354057032E-3
+ 0.84214317631416E-3   0.84115373589305E-3   0.84016521853763E-3   0.83917762348024E-3   0.83819094995985E-3
+ 0.83720519721599E-3   0.83622036448968E-3   0.83523645102348E-3   0.83425345606181E-3   0.8332713788519E-3
+ 0.83229021864328E-3   0.83130997468677E-3   0.83033064623226E-3   0.82935223253131E-3   0.82837473284094E-3
+ 0.82739814642034E-3   0.8264224725303E-3   0.82544771043171E-3   0.82447385938748E-3   0.82350091866327E-3
+ 0.82252888752723E-3   0.82155776525073E-3   0.82058755110163E-3   0.81961824435034E-3   0.81864984426996E-3
+ 0.81768235013839E-3   0.81671576123439E-3   0.81575007683752E-3   0.81478529622903E-3   0.81382141869184E-3
+ 0.81285844351168E-3   0.81189636997669E-3   0.81093519737441E-3   0.80997492499254E-3   0.80901555211954E-3
+ 0.80805707805113E-3   0.80709950208313E-3   0.80614282351287E-3   0.80518704163911E-3   0.80423215576379E-3
+ 0.80327816518669E-3   0.80232506920893E-3   0.80137286713318E-3   0.80042155826811E-3   0.79947114192279E-3
+ 0.79852161740702E-3   0.79757298403171E-3   0.79662524110904E-3   0.79567838795454E-3   0.79473242388549E-3
+ 0.7937873482197E-3   0.79284316027381E-3   0.79189985936581E-3   0.79095744481887E-3   0.7900159159576E-3
+ 0.78907527210778E-3   0.78813551259576E-3   0.78719663674941E-3   0.78625864389878E-3   0.78532153337572E-3
+ 0.78438530451514E-3   0.78344995664793E-3   0.7825154891073E-3   0.78158190122922E-3   0.78064919235399E-3
+ 0.77971736182268E-3   0.7787864089761E-3   0.77785633315645E-3   0.77692713370738E-3   0.77599880997538E-3
+ 0.77507136130898E-3   0.77414478705539E-3   0.77321908656207E-3   0.77229425917689E-3   0.77137030425449E-3
+ 0.7704472211494E-3   0.76952500921698E-3   0.76860366781306E-3   0.7676831962946E-3   0.76676359402144E-3
+ 0.76584486035506E-3   0.76492699465824E-3   0.76400999629092E-3   0.76309386461462E-3   0.76217859899507E-3
+ 0.76126419880038E-3   0.76035066339917E-3   0.75943799216109E-3   0.75852618445795E-3   0.75761523966147E-3
+ 0.75670515714232E-3   0.75579593627201E-3   0.75488757642732E-3   0.75398007698586E-3   0.75307343732618E-3
+ 0.75216765682666E-3   0.75126273486688E-3   0.75035867082882E-3   0.74945546409613E-3   0.74855311405485E-3
+ 0.74765162008684E-3   0.74675098157606E-3   0.74585119790909E-3   0.7449522684758E-3   0.74405419266658E-3
+ 0.74315696987185E-3   0.74226059948316E-3   0.74136508089331E-3   0.74047041349729E-3   0.73957659669211E-3
+ 0.73868362987271E-3   0.73779151243425E-3   0.73690024377223E-3   0.73600982328856E-3   0.7351202503848E-3
+ 0.73423152446291E-3   0.73334364492493E-3   0.73245661117372E-3   0.73157042261522E-3   0.73068507865667E-3
+ 0.72980057870599E-3   0.72891692216816E-3   0.72803410844929E-3   0.72715213695997E-3   0.72627100711255E-3
+ 0.72539071832013E-3   0.72451126999488E-3   0.72363266155032E-3   0.72275489240152E-3   0.7218779619652E-3
+ 0.72100186966018E-3   0.72012661490211E-3   0.71925219710794E-3   0.71837861569604E-3   0.71750587008881E-3
+ 0.71663395970837E-3   0.71576288397781E-3   0.71489264232134E-3   0.71402323416517E-3   0.71315465893177E-3
+ 0.71228691604512E-3   0.71142000493203E-3   0.71055392502226E-3   0.70968867574604E-3   0.70882425653268E-3
+ 0.70796066681252E-3   0.70709790601704E-3   0.70623597357976E-3   0.70537486893592E-3   0.70451459151831E-3
+ 0.70365514075998E-3   0.70279651609443E-3   0.70193871696064E-3   0.70108174279715E-3   0.70022559304265E-3
+ 0.69937026713606E-3   0.6985157645169E-3   0.69766208462709E-3   0.69680922690963E-3   0.69595719080774E-3
+ 0.69510597576224E-3   0.6942555812147E-3   0.69340600661094E-3   0.69255725139794E-3   0.69170931502316E-3
+ 0.69086219693339E-3   0.69001589657639E-3   0.6891704134013E-3   0.6883257468585E-3   0.68748189640041E-3
+ 0.68663886147565E-3   0.68579664153409E-3   0.68495523602715E-3   0.68411464441008E-3   0.68327486613816E-3
+ 0.68243590066593E-3   0.68159774744849E-3   0.68076040594159E-3   0.67992387560338E-3   0.67908815589322E-3
+ 0.6782532462689E-3   0.67741914618734E-3   0.67658585510528E-3   0.67575337248544E-3   0.67492169778989E-3
+ 0.67409083048112E-3   0.67326077002187E-3   0.67243151587688E-3   0.67160306750851E-3   0.6707754243795E-3
+ 0.66994858595311E-3   0.66912255169695E-3   0.66829732107814E-3   0.66747289356405E-3   0.66664926862238E-3
+ 0.66582644572144E-3   0.66500442433079E-3   0.66418320392097E-3   0.66336278396246E-3   0.66254316392431E-3
+ 0.66172434327602E-3   0.66090632149045E-3   0.66008909804106E-3   0.65927267240167E-3   0.65845704404604E-3
+ 0.6576422124485E-3   0.65682817708453E-3   0.65601493743057E-3   0.65520249296501E-3   0.65439084316198E-3
+ 0.65357998749701E-3   0.65276992544714E-3   0.65196065649248E-3   0.65115218011292E-3   0.65034449578807E-3
+ 0.64953760299808E-3   0.64873150122365E-3   0.64792618994677E-3   0.64712166865066E-3   0.64631793681692E-3
+ 0.64551499392669E-3   0.64471283946076E-3   0.64391147290515E-3   0.64311089374509E-3   0.64231110146601E-3
+ 0.64151209555311E-3   0.64071387549208E-3   0.63991644077007E-3   0.63911979087497E-3   0.63832392529532E-3
+ 0.63752884351685E-3   0.63673454502593E-3   0.63594102931184E-3   0.63514829586537E-3   0.63435634417719E-3
+  0.633565173738E-3   0.63277478403985E-3   0.63198517457415E-3   0.63119634483066E-3   0.63040829429918E-3
+ 0.6296210224738E-3   0.62883452884883E-3   0.62804881291874E-3   0.62726387417714E-3   0.62647971211827E-3
+ 0.62569632623753E-3   0.62491371603103E-3   0.62413188099647E-3   0.6233508206276E-3   0.62257053441928E-3
+ 0.62179102186806E-3   0.62101228247312E-3   0.62023431573349E-3   0.61945712114732E-3   0.61868069821323E-3
+ 0.61790504643034E-3   0.61713016529898E-3   0.61635605432049E-3   0.61558271299442E-3   0.61481014081997E-3
+ 0.61403833729606E-3   0.61326730192631E-3   0.61249703421365E-3   0.61172753366077E-3   0.61095879976989E-3
+ 0.6101908320433E-3   0.60942362998562E-3   0.60865719310203E-3   0.60789152089788E-3   0.60712661287516E-3
+ 0.60636246853639E-3   0.60559908738747E-3   0.60483646893543E-3   0.60407461268745E-3   0.60331351814923E-3
+ 0.60255318482715E-3   0.60179361222844E-3   0.6010347998614E-3   0.60027674723557E-3   0.59951945385724E-3
+ 0.59876291923325E-3   0.59800714287116E-3   0.59725212428148E-3   0.59649786297388E-3   0.59574435845867E-3
+ 0.59499161024672E-3   0.59423961785019E-3   0.59348838077723E-3   0.59273789853697E-3   0.59198817064035E-3
+ 0.59123919660038E-3   0.59049097592985E-3   0.58974350814081E-3   0.58899679274569E-3   0.58825082925736E-3
+ 0.58750561718952E-3   0.58676115605692E-3   0.58601744537223E-3   0.58527448464787E-3   0.5845322733962E-3
+ 0.58379081113344E-3   0.58305009737506E-3   0.58231013163643E-3   0.58157091343281E-3   0.58083244227967E-3
+ 0.58009471769353E-3   0.57935773919144E-3   0.57862150629038E-3   0.57788601850509E-3   0.57715127535054E-3
+ 0.57641727634459E-3   0.5756840210057E-3   0.57495150885235E-3   0.57421973940225E-3   0.57348871217352E-3
+ 0.57275842668489E-3   0.57202888245561E-3   0.57130007900619E-3   0.57057201585401E-3   0.56984469251701E-3
+ 0.56911810851393E-3   0.56839226336602E-3   0.56766715659407E-3   0.56694278771847E-3   0.56621915625973E-3
+ 0.56549626173854E-3   0.56477410367667E-3   0.56405268159663E-3   0.56333199501951E-3   0.56261204346524E-3
+ 0.56189282645336E-3   0.56117434350767E-3   0.56045659415115E-3   0.55973957790685E-3   0.55902329429799E-3
+ 0.55830774284916E-3   0.55759292308219E-3   0.55687883451873E-3   0.55616547668047E-3   0.55545284909303E-3
+ 0.55474095128125E-3   0.55402978276942E-3   0.55331934308146E-3   0.55260963174121E-3   0.55190064827442E-3
+ 0.55119239220711E-3   0.5504848630648E-3   0.54977806037066E-3   0.54907198364787E-3    0.548366632423E-3
+ 0.54766200622294E-3   0.5469581045745E-3   0.54625492700331E-3   0.54555247303542E-3   0.54485074219756E-3
+ 0.54414973401688E-3   0.54344944802162E-3   0.54274988373697E-3   0.54205104068879E-3   0.5413529184037E-3
+ 0.5406555164102E-3   0.53995883423637E-3   0.53926287141002E-3   0.53856762745914E-3   0.53787310191183E-3
+ 0.53717929429679E-3   0.53648620414339E-3   0.53579383097963E-3   0.53510217433283E-3   0.53441123372974E-3
+ 0.53372100870095E-3   0.53303149877629E-3   0.53234270348539E-3   0.5316546223572E-3   0.53096725492077E-3
+ 0.53028060070634E-3   0.52959465924455E-3   0.5289094300663E-3   0.52822491269968E-3   0.52754110667314E-3
+ 0.52685801151716E-3   0.5261756267632E-3   0.52549395194231E-3   0.52481298658555E-3   0.5241327302247E-3
+ 0.52345318239084E-3   0.52277434261324E-3    0.522096210421E-3   0.52141878534643E-3   0.52074206692183E-3
+ 0.52006605467936E-3   0.51939074815029E-3   0.51871614686611E-3    0.518042250359E-3   0.51736905816152E-3
+ 0.51669656980732E-3   0.51602478482648E-3   0.5153537027498E-3   0.51468332310912E-3   0.51401364543816E-3
+ 0.51334466927035E-3   0.5126763941381E-3   0.51200881957391E-3   0.51134194511041E-3   0.51067577028161E-3
+ 0.51001029462212E-3   0.50934551766433E-3   0.50868143893984E-3   0.50801805797973E-3   0.50735537431937E-3
+ 0.50669338749306E-3   0.50603209703481E-3   0.50537150247792E-3   0.50471160335576E-3   0.50405239920289E-3
+ 0.50339388955423E-3   0.50273607394465E-3   0.50207895190633E-3   0.5014225229716E-3   0.50076678667521E-3
+ 0.5001117425527E-3   0.49945739013961E-3   0.49880372896979E-3   0.4981507585775E-3   0.49749847849753E-3
+ 0.49684688826539E-3   0.49619598741737E-3   0.49554577548696E-3   0.49489625200786E-3   0.49424741651409E-3
+ 0.49359926854198E-3   0.49295180762692E-3   0.49230503330474E-3   0.49165894511151E-3   0.49101354258441E-3
+ 0.49036882525653E-3   0.48972479266175E-3   0.48908144433524E-3   0.48843877981395E-3   0.48779679863436E-3
+ 0.48715550033214E-3   0.4865148844431E-3   0.4858749505032E-3   0.48523569804887E-3   0.48459712661716E-3
+ 0.48395923574341E-3   0.48332202496258E-3   0.48268549380933E-3   0.48204964182124E-3   0.48141446853519E-3
+ 0.4807799734877E-3   0.48014615621494E-3   0.47951301625276E-3   0.47888055313868E-3   0.47824876641045E-3
+ 0.47761765560549E-3   0.47698722025824E-3   0.4763574599032E-3   0.47572837407785E-3   0.47509996232029E-3
+ 0.47447222416857E-3   0.47384515915865E-3   0.47321876682685E-3   0.47259304671034E-3   0.47196799834722E-3
+ 0.47134362127659E-3   0.47071991503353E-3   0.47009687915354E-3   0.46947451317272E-3   0.46885281662991E-3
+ 0.46823178906329E-3   0.46761143001012E-3   0.46699173900752E-3   0.46637271559262E-3   0.46575435930364E-3
+ 0.46513666967918E-3   0.46451964625649E-3   0.46390328857169E-3   0.46328759616054E-3   0.46267256856183E-3
+ 0.46205820531366E-3   0.46144450595405E-3   0.46083147002121E-3   0.46021909705419E-3   0.45960738658987E-3
+ 0.45899633816487E-3   0.45838595131575E-3   0.45777622558151E-3   0.45716716050037E-3   0.45655875561049E-3
+ 0.45595101044997E-3   0.45534392455691E-3   0.4547374974697E-3   0.45413172872703E-3   0.45352661786729E-3
+ 0.45292216442715E-3   0.45231836794322E-3   0.45171522795426E-3   0.4511127439992E-3   0.45051091561679E-3
+ 0.44990974234508E-3   0.44930922372226E-3   0.44870935928686E-3   0.44811014857769E-3   0.44751159113449E-3
+ 0.4469136864939E-3   0.44631643419293E-3   0.44571983376928E-3   0.44512388476279E-3   0.44452858671292E-3
+ 0.44393393915787E-3   0.44333994163574E-3   0.44274659368462E-3   0.4421538948441E-3   0.4415618446541E-3
+ 0.44097044265274E-3   0.44037968837706E-3   0.43978958136347E-3   0.43920012115234E-3   0.43861130728314E-3
+ 0.43802313929503E-3   0.43743561672628E-3   0.43684873911528E-3   0.43626250600124E-3   0.4356769169236E-3
+ 0.43509197142201E-3   0.4345076690336E-3   0.4339240092957E-3   0.43334099174728E-3   0.43275861592818E-3
+ 0.43217688137783E-3   0.43159578763527E-3   0.43101533424008E-3   0.43043552073129E-3   0.42985634664651E-3
+ 0.42927781152314E-3   0.42869991490087E-3   0.42812265631938E-3   0.4275460353182E-3   0.42697005143602E-3
+ 0.42639470421165E-3   0.42581999318439E-3   0.42524591789378E-3   0.42467247788027E-3   0.42409967268118E-3
+ 0.42352750183443E-3   0.42295596487859E-3   0.42238506135379E-3   0.42181479079975E-3   0.42124515275552E-3
+ 0.42067614676012E-3   0.4201077723526E-3   0.41954002907291E-3   0.4189729164615E-3   0.41840643405695E-3
+ 0.41784058139706E-3   0.41727535801903E-3   0.41671076346375E-3   0.41614679727112E-3   0.41558345898071E-3
+ 0.41502074813146E-3   0.41445866426226E-3   0.41389720691302E-3   0.41333637562385E-3   0.41277616993488E-3
+ 0.41221658938379E-3   0.41165763350846E-3   0.41109930184849E-3   0.41054159394406E-3   0.40998450933528E-3
+ 0.40942804756111E-3   0.40887220816067E-3   0.40831699067348E-3   0.40776239463976E-3   0.40720841960046E-3
+ 0.40665506509362E-3   0.40610233065737E-3   0.40555021583008E-3   0.40499872015256E-3   0.40444784316475E-3
+ 0.40389758440652E-3   0.40334794341783E-3   0.40279891973955E-3   0.40225051290933E-3   0.40170272246525E-3
+ 0.40115554794654E-3   0.40060898889402E-3   0.4000630448482E-3   0.39951771534839E-3   0.39897299993396E-3
+ 0.39842889814444E-3   0.39788540952012E-3   0.39734253360178E-3   0.39680026992836E-3   0.39625861803827E-3
+ 0.39571757746947E-3   0.39517714776326E-3   0.3946373284601E-3   0.39409811909997E-3   0.39355951922217E-3
+ 0.39302152836588E-3   0.39248414607164E-3   0.39194737188011E-3   0.39141120533175E-3   0.39087564596477E-3
+ 0.39034069331758E-3   0.3898063469303E-3   0.38927260634342E-3   0.38873947109718E-3   0.38820694073142E-3
+ 0.38767501478598E-3   0.38714369280098E-3   0.38661297431686E-3   0.3860828588749E-3   0.38555334601354E-3
+ 0.38502443527141E-3   0.38449612618752E-3   0.38396841830316E-3   0.38344131115897E-3    0.382914804295E-3
+ 0.38238889725123E-3   0.38186358956757E-3   0.38133888078465E-3   0.38081477044344E-3   0.38029125808382E-3
+ 0.37976834324454E-3   0.3792460254638E-3   0.37872430428314E-3   0.37820317924349E-3   0.37768264988555E-3
+ 0.37716271574958E-3   0.37664337637669E-3   0.37612463130633E-3   0.37560648007767E-3   0.37508892222965E-3
+ 0.37457195730376E-3   0.37405558484074E-3   0.37353980438112E-3   0.37302461546521E-3   0.37251001763326E-3
+ 0.37199601042615E-3   0.37148259338502E-3   0.37096976605065E-3   0.37045752796197E-3   0.36994587865782E-3
+ 0.36943481767929E-3   0.36892434456766E-3   0.36841445886411E-3   0.36790516010883E-3   0.36739644784216E-3
+ 0.36688832160491E-3   0.36638078093829E-3   0.36587382538441E-3   0.36536745448222E-3   0.36486166777104E-3
+ 0.3643564647908E-3   0.36385184508353E-3   0.36334780819083E-3   0.36284435365328E-3   0.36234148101137E-3
+ 0.3618391898056E-3   0.36133747957765E-3   0.36083634986955E-3   0.36033580022184E-3   0.35983583017401E-3
+ 0.35933643926502E-3   0.35883762703736E-3   0.35833939303275E-3   0.35784173679268E-3   0.35734465785777E-3
+ 0.35684815576874E-3   0.35635223006717E-3   0.35585688029491E-3   0.3553621059941E-3   0.35486790670413E-3
+ 0.35437428196467E-3   0.35388123131702E-3   0.35338875430354E-3   0.35289685046611E-3   0.35240551934628E-3
+ 0.35191476048615E-3   0.35142457342734E-3   0.35093495770982E-3   0.35044591287341E-3   0.34995743846036E-3
+ 0.34946953401292E-3   0.3489821990732E-3   0.34849543318254E-3   0.34800923588246E-3   0.3475236067148E-3
+ 0.34703854522154E-3   0.34655405094533E-3   0.34607012342668E-3   0.34558676220642E-3   0.34510396682597E-3
+ 0.34462173682806E-3   0.34414007175521E-3   0.34365897114919E-3   0.34317843455174E-3   0.34269846150472E-3
+ 0.34221905155071E-3   0.34174020423264E-3   0.34126191909225E-3   0.34078419567082E-3   0.34030703350933E-3
+ 0.33983043215084E-3   0.33935439113777E-3   0.3388789100126E-3   0.33840398831779E-3   0.33792962559574E-3
+ 0.33745582138922E-3   0.33698257524125E-3   0.33650988669497E-3   0.33603775529151E-3   0.33556618057224E-3
+ 0.33509516207989E-3   0.33462469935776E-3   0.3341547919489E-3   0.33368543939614E-3   0.33321664124244E-3
+ 0.33274839703081E-3   0.33228070630435E-3   0.33181356860677E-3   0.33134698348021E-3   0.33088095046683E-3
+ 0.33041546910896E-3   0.32995053895054E-3   0.32948615953491E-3   0.3290223304056E-3   0.3285590511063E-3
+ 0.3280963211814E-3   0.32763414017291E-3   0.32717250762331E-3   0.32671142307574E-3   0.32625088607446E-3
+ 0.32579089616344E-3   0.32533145288625E-3   0.32487255578647E-3   0.32441420440779E-3   0.32395639829443E-3
+ 0.32349913699099E-3   0.32304242004088E-3   0.3225862469872E-3   0.32213061737287E-3   0.32167553074269E-3
+ 0.32122098664095E-3   0.32076698461191E-3   0.32031352419986E-3   0.31986060494902E-3   0.31940822640406E-3
+ 0.31895638810987E-3   0.31850508961131E-3   0.31805433045168E-3   0.31760411017439E-3   0.31715442832427E-3
+ 0.31670528444654E-3   0.31625667808636E-3   0.3158086087883E-3   0.31536107609706E-3   0.31491407955769E-3
+ 0.31446761871565E-3   0.31402169311715E-3   0.31357630230603E-3   0.3131314458263E-3   0.31268712322232E-3
+ 0.31224333404049E-3   0.31180007782672E-3   0.31135735412641E-3   0.31091516248486E-3   0.31047350244739E-3
+ 0.31003237356014E-3   0.30959177536955E-3   0.30915170742124E-3   0.3087121692598E-3   0.3082731604296E-3
+ 0.30783468047751E-3   0.30739672895005E-3   0.30695930539362E-3   0.30652240935458E-3   0.30608604038009E-3
+ 0.30565019801568E-3   0.30521488180661E-3   0.30478009129786E-3   0.30434582603731E-3   0.30391208557224E-3
+ 0.30347886944943E-3   0.30304617721519E-3   0.30261400841582E-3   0.30218236259871E-3   0.30175123931137E-3
+ 0.30132063810113E-3   0.30089055851391E-3   0.30046100009564E-3   0.30003196239397E-3   0.29960344495689E-3
+ 0.29917544733239E-3   0.29874796906743E-3   0.29832100970923E-3   0.29789456880553E-3   0.29746864590455E-3
+ 0.2970432405553E-3   0.29661835230422E-3   0.29619398069809E-3   0.29577012528421E-3   0.29534678561179E-3
+ 0.29492396122964E-3   0.29450165168593E-3   0.29407985652883E-3   0.2936585753066E-3   0.29323780756816E-3
+ 0.29281755286279E-3   0.29239781073888E-3   0.29197858074416E-3   0.29155986242596E-3   0.2911416553343E-3
+ 0.29072395901878E-3   0.29030677302884E-3   0.28989009691325E-3   0.28947393022088E-3   0.28905827250146E-3
+ 0.28864312330499E-3   0.28822848218178E-3   0.2878143486801E-3   0.28740072234855E-3   0.28698760273688E-3
+ 0.28657498939572E-3   0.28616288187534E-3   0.28575127972609E-3   0.28534018249874E-3   0.28492958974377E-3
+ 0.28451950101031E-3   0.28410991584747E-3   0.28370083380633E-3   0.28329225443814E-3   0.2828841772941E-3
+ 0.2824766019247E-3   0.28206952788066E-3   0.28166295471311E-3   0.2812568819735E-3   0.28085130921384E-3
+ 0.2804462359844E-3   0.28004166183585E-3   0.2796375863193E-3   0.27923400898691E-3   0.27883092939058E-3
+ 0.27842834708216E-3   0.2780262616136E-3   0.2776246725369E-3   0.27722357940448E-3   0.2768229817692E-3
+ 0.27642287918299E-3   0.27602327119732E-3   0.27562415736323E-3   0.27522553723452E-3   0.27482741036448E-3
+ 0.27442977630621E-3   0.27403263461218E-3   0.27363598483488E-3   0.27323982652801E-3   0.27284415924551E-3
+ 0.27244898254151E-3    0.272054295968E-3   0.27166009907729E-3   0.27126639142316E-3   0.27087317256015E-3
+ 0.2704804420429E-3   0.27008819942487E-3   0.26969644425984E-3   0.26930517610204E-3   0.26891439450648E-3
+ 0.2685240990288E-3   0.26813428922251E-3   0.2677449646412E-3   0.26735612483867E-3   0.26696776937086E-3
+ 0.26657989779316E-3   0.26619250966091E-3   0.26580560452958E-3   0.26541918195542E-3   0.2650332414927E-3
+ 0.26464778269619E-3   0.26426280512128E-3   0.26387830832441E-3   0.2634942918619E-3   0.26311075528969E-3
+ 0.26272769816379E-3   0.26234512004037E-3   0.26196302047643E-3   0.26158139902943E-3   0.26120025525554E-3
+ 0.26081958871054E-3   0.26043939894996E-3   0.26005968553198E-3   0.25968044801426E-3   0.25930168595425E-3
+  0.258923398909E-3   0.25854558643568E-3   0.25816824809232E-3   0.25779138343716E-3   0.25741499202852E-3
+ 0.25703907342344E-3   0.25666362717918E-3   0.25628865285416E-3   0.25591415000728E-3   0.2555401181975E-3
+ 0.25516655698313E-3   0.2547934659226E-3   0.25442084457493E-3   0.25404869249981E-3   0.25367700925775E-3
+ 0.25330579440676E-3   0.2529350475051E-3   0.2525647681114E-3   0.25219495578659E-3   0.25182561009127E-3
+ 0.25145673058526E-3   0.2510883168283E-3   0.25072036838015E-3   0.25035288480182E-3   0.24998586565443E-3
+ 0.2496193104986E-3   0.2492532188943E-3   0.24888759040154E-3   0.24852242458181E-3   0.24815772099649E-3
+ 0.24779347920701E-3   0.24742969877513E-3   0.24706637926316E-3   0.24670352023235E-3   0.24634112124381E-3
+ 0.24597918185862E-3   0.24561770163971E-3   0.24525668014964E-3   0.24489611695098E-3   0.24453601160624E-3
+  0.244176363678E-3   0.24381717272949E-3   0.24345843832429E-3   0.24310016002589E-3   0.24274233739633E-3
+ 0.24238496999773E-3   0.2420280573941E-3   0.24167159914991E-3   0.24131559482969E-3   0.24096004399696E-3
+ 0.2406049462156E-3   0.24025030105001E-3   0.23989610806512E-3   0.23954236682654E-3   0.23918907689793E-3
+ 0.23883623784332E-3   0.23848384922716E-3   0.23813191061547E-3   0.23778042157401E-3   0.23742938166827E-3
+ 0.23707879046383E-3   0.23672864752639E-3   0.23637895242227E-3   0.23602970471813E-3   0.23568090398009E-3
+ 0.23533254977378E-3   0.2349846416648E-3   0.23463717922045E-3   0.23429016200783E-3   0.23394358959412E-3
+ 0.23359746154653E-3   0.2332517774324E-3   0.23290653681945E-3   0.23256173927565E-3   0.23221738436937E-3
+ 0.23187347166758E-3   0.23153000073757E-3   0.23118697114756E-3   0.23084438246659E-3   0.2305022342635E-3
+ 0.23016052610724E-3   0.22981925756719E-3   0.22947842821262E-3   0.2291380376119E-3   0.2287980853335E-3
+ 0.22845857094736E-3   0.22811949402366E-3   0.22778085413267E-3   0.2274426508442E-3   0.22710488372826E-3
+ 0.22676755235543E-3   0.22643065629667E-3   0.22609419512371E-3   0.22575816840632E-3   0.22542257571478E-3
+ 0.22508741661987E-3   0.22475269069358E-3   0.22441839750769E-3   0.22408453663396E-3   0.22375110764431E-3
+ 0.22341811011081E-3   0.22308554360598E-3   0.2227534077028E-3   0.2224217019736E-3   0.22209042599034E-3
+ 0.22175957932479E-3   0.22142916155095E-3   0.22109917224253E-3   0.2207696109732E-3   0.22044047731618E-3
+ 0.22011177084488E-3   0.21978349113357E-3   0.21945563775682E-3   0.21912821028942E-3   0.21880120830498E-3
+ 0.21847463137747E-3   0.21814847908173E-3   0.21782275099307E-3   0.21749744668691E-3   0.2171725657385E-3
+ 0.21684810772329E-3   0.21652407221704E-3   0.21620045879599E-3    0.215877267037E-3   0.21555449651555E-3
+ 0.21523214680727E-3   0.21491021748794E-3   0.21458870813522E-3   0.21426761832639E-3   0.2139469476388E-3
+ 0.21362669564991E-3   0.21330686193805E-3   0.21298744607981E-3   0.21266844765233E-3   0.2123498662333E-3
+ 0.21203170140153E-3   0.21171395273563E-3   0.21139661981428E-3   0.21107970221633E-3   0.21076319952085E-3
+ 0.2104471113071E-3   0.21013143715486E-3   0.20981617664335E-3   0.20950132935169E-3   0.2091868948589E-3
+ 0.20887287274576E-3   0.2085592625928E-3   0.20824606398058E-3   0.20793327648964E-3   0.20762089970061E-3
+ 0.20730893319482E-3   0.20699737655393E-3   0.20668622935975E-3   0.20637549119292E-3   0.2060651616344E-3
+ 0.20575524026622E-3   0.20544572667094E-3   0.20513662043108E-3   0.20482792112929E-3   0.20451962834846E-3
+ 0.20421174167162E-3   0.20390426068192E-3   0.20359718496304E-3    0.203290514098E-3   0.20298424766996E-3
+ 0.20267838526239E-3   0.20237292645995E-3   0.2020678708473E-3   0.20176321800888E-3   0.20145896752919E-3
+ 0.20115511899277E-3   0.20085167198525E-3   0.20054862609248E-3   0.20024598089994E-3   0.1999437359925E-3
+ 0.19964189095515E-3   0.19934044537439E-3   0.19903939883668E-3   0.1987387509286E-3   0.19843850123713E-3
+ 0.19813864934984E-3   0.19783919485339E-3   0.19754013733434E-3   0.19724147637926E-3   0.19694321157654E-3
+ 0.19664534251427E-3   0.19634786878065E-3   0.19605078996397E-3   0.19575410565272E-3   0.19545781543576E-3
+ 0.19516191890233E-3   0.19486641564174E-3   0.19457130524237E-3   0.19427658729273E-3   0.19398226138282E-3
+ 0.1936883271031E-3   0.19339478404419E-3   0.19310163179614E-3   0.1928088699494E-3   0.19251649809479E-3
+ 0.1922245158235E-3   0.19193292272746E-3   0.19164171839708E-3   0.19135090242309E-3   0.19106047439667E-3
+ 0.19077043391075E-3   0.19048078055821E-3   0.19019151393132E-3   0.18990263362237E-3   0.18961413922386E-3
+ 0.18932603032935E-3   0.18903830653261E-3   0.18875096742704E-3   0.18846401260557E-3   0.18817744166122E-3
+ 0.18789125418859E-3   0.18760544978227E-3   0.18732002803692E-3   0.18703498854714E-3   0.1867503309076E-3
+ 0.18646605471379E-3   0.18618215956159E-3   0.18589864504742E-3   0.1856155107658E-3   0.18533275631171E-3
+ 0.18505038128131E-3   0.18476838527183E-3   0.18448676788039E-3   0.18420552870392E-3   0.18392466733986E-3
+ 0.1836441833857E-3   0.18336407643808E-3   0.18308434609374E-3   0.18280499195105E-3   0.18252601360876E-3
+ 0.18224741066576E-3   0.18196918272029E-3   0.18169132937097E-3   0.18141385021695E-3   0.18113674485779E-3
+ 0.18086001289361E-3   0.18058365392341E-3   0.18030766754658E-3   0.18003205336294E-3   0.17975681097349E-3
+ 0.17948193997928E-3    0.179207439981E-3   0.17893331057947E-3   0.17865955137573E-3   0.17838616197171E-3
+ 0.17811314196972E-3   0.17784049097148E-3   0.17756820857847E-3   0.17729629439201E-3   0.1770247480156E-3
+ 0.17675356905257E-3   0.17648275710626E-3   0.17621231177954E-3   0.1759422326755E-3   0.17567251939825E-3
+ 0.17540317155226E-3   0.17513418874234E-3   0.17486557057186E-3   0.17459731664453E-3   0.17432942656529E-3
+ 0.17406189993989E-3   0.17379473637424E-3   0.17352793547359E-3   0.17326149684362E-3   0.17299542009034E-3
+ 0.17272970482023E-3   0.17246435064021E-3   0.17219935715656E-3   0.17193472397567E-3   0.17167045070419E-3
+ 0.17140653695001E-3   0.17114298232081E-3   0.17087978642468E-3   0.17061694887002E-3   0.17035446926607E-3
+ 0.17009234722035E-3   0.16983058234101E-3   0.16956917423675E-3   0.16930812251733E-3   0.16904742679248E-3
+ 0.16878708667188E-3   0.16852710176538E-3   0.16826747168308E-3   0.16800819603574E-3   0.16774927443453E-3
+ 0.16749070649011E-3   0.16723249181307E-3   0.16697463001405E-3   0.16671712070517E-3   0.16645996349837E-3
+ 0.16620315800581E-3   0.16594670383983E-3   0.16569060061303E-3   0.16543484793825E-3   0.16517944542868E-3
+ 0.16492439269778E-3   0.16466968935841E-3   0.16441533502365E-3   0.16416132930759E-3   0.16390767182486E-3
+ 0.16365436219038E-3   0.16340140001848E-3   0.16314878492392E-3   0.16289651652184E-3   0.16264459442796E-3
+ 0.16239301825847E-3   0.16214178762871E-3   0.16189090215421E-3   0.16164036145086E-3   0.16139016513582E-3
+ 0.16114031282626E-3   0.16089080413922E-3   0.16064163869188E-3   0.16039281610156E-3   0.16014433598644E-3
+ 0.15989619796498E-3   0.15964840165549E-3   0.15940094667588E-3   0.15915383264416E-3   0.15890705917979E-3
+ 0.15866062590232E-3   0.15841453243144E-3   0.15816877838685E-3   0.15792336338879E-3   0.15767828705727E-3
+ 0.15743354901245E-3   0.15718914887456E-3   0.15694508626496E-3   0.15670136080501E-3   0.15645797211622E-3
+ 0.1562149198202E-3   0.1559722035387E-3   0.15572982289423E-3   0.15548777750957E-3   0.15524606700772E-3
+ 0.15500469101091E-3   0.15476364914177E-3   0.15452294102377E-3   0.15428256628076E-3   0.15404252453666E-3
+ 0.1538028154158E-3   0.15356343854268E-3   0.15332439354207E-3   0.15308568003903E-3   0.15284729765933E-3
+ 0.15260924602762E-3   0.15237152476885E-3   0.1521341335084E-3   0.1518970718732E-3   0.15166033949016E-3
+ 0.15142393598584E-3   0.15118786098692E-3   0.15095211412029E-3   0.15071669501373E-3   0.15048160329533E-3
+ 0.15024683859292E-3   0.15001240053407E-3   0.1497782887464E-3   0.14954450285908E-3   0.14931104250132E-3
+ 0.14907790730246E-3   0.14884509689178E-3   0.14861261089885E-3   0.14838044895372E-3   0.14814861068675E-3
+ 0.1479170957288E-3   0.14768590370983E-3   0.14745503426023E-3   0.14722448701107E-3   0.14699426159416E-3
+ 0.14676435764121E-3   0.14653477478444E-3   0.14630551265643E-3   0.14607657088987E-3   0.14584794911674E-3
+ 0.14561964696931E-3   0.14539166408095E-3   0.14516400008533E-3   0.14493665461622E-3   0.14470962730777E-3
+ 0.14448291779439E-3   0.14425652571062E-3   0.14403045069116E-3   0.14380469237119E-3   0.14357925038564E-3
+ 0.1433541243697E-3   0.14312931395896E-3   0.14290481878964E-3   0.14268063849814E-3   0.14245677272096E-3
+ 0.1422332210948E-3   0.14200998325652E-3   0.14178705884392E-3   0.1415644474952E-3   0.14134214884805E-3
+ 0.1411201625398E-3   0.14089848820786E-3   0.14067712549146E-3   0.14045607402972E-3   0.14023533346194E-3
+ 0.14001490342733E-3   0.13979478356537E-3   0.13957497351614E-3   0.13935547292004E-3   0.13913628141784E-3
+ 0.13891739864955E-3   0.13869882425559E-3   0.13848055787711E-3   0.13826259915584E-3   0.13804494773369E-3
+ 0.13782760325256E-3   0.13761056535468E-3   0.13739383368256E-3   0.13717740787913E-3   0.13696128758785E-3
+ 0.13674547245157E-3   0.13652996211332E-3   0.13631475621634E-3   0.13609985440529E-3   0.1358852563248E-3
+ 0.13567096161951E-3   0.13545696993409E-3   0.13524328091371E-3   0.13502989420352E-3    0.134816809449E-3
+ 0.13460402629592E-3   0.13439154439056E-3   0.1341793633794E-3   0.1339674829091E-3   0.1337559026266E-3
+ 0.13354462217905E-3   0.13333364121409E-3   0.13312295937972E-3   0.13291257632381E-3   0.13270249169425E-3
+ 0.13249270513911E-3   0.13228321630743E-3   0.13207402484833E-3   0.13186513041114E-3   0.13165653264542E-3
+ 0.13144823120087E-3   0.13124022572788E-3   0.13103251587719E-3   0.1308251012999E-3   0.13061798164594E-3
+ 0.13041115656558E-3   0.13020462571038E-3   0.12999838873257E-3   0.12979244528473E-3   0.12958679501862E-3
+ 0.12938143758645E-3   0.12917637264092E-3   0.12897159983555E-3   0.12876711882443E-3   0.12856292926036E-3
+ 0.12835903079641E-3   0.12815542308594E-3   0.12795210578411E-3   0.12774907854593E-3   0.1275463410263E-3
+ 0.12734389288023E-3   0.12714173376306E-3   0.12693986333057E-3   0.12673828123891E-3   0.12653698714426E-3
+ 0.12633598070267E-3   0.1261352615703E-3   0.12593482940451E-3   0.12573468386282E-3   0.12553482460294E-3
+ 0.12533525128272E-3   0.12513596356056E-3   0.12493696109457E-3   0.12473824354295E-3   0.12453981056398E-3
+ 0.12434166181729E-3   0.12414379696249E-3   0.12394621565935E-3   0.12374891756771E-3   0.12355190234762E-3
+ 0.12335516965982E-3   0.12315871916537E-3   0.12296255052559E-3   0.12276666340111E-3   0.12257105745283E-3
+ 0.12237573234276E-3   0.12218068773339E-3   0.12198592328755E-3   0.12179143866745E-3   0.1215972335357E-3
+ 0.12140330755548E-3   0.12120966039065E-3   0.12101629170559E-3   0.1208232011637E-3   0.12063038842873E-3
+ 0.12043785316481E-3   0.12024559503719E-3   0.12005361371118E-3   0.11986190885208E-3   0.11967048012544E-3
+ 0.11947932719702E-3   0.11928844973316E-3   0.11909784740055E-3   0.11890751986583E-3   0.11871746679552E-3
+ 0.11852768785623E-3   0.11833818271589E-3   0.11814895104259E-3   0.11795999250457E-3   0.11777130676987E-3
+ 0.11758289350683E-3   0.11739475238445E-3   0.11720688307211E-3   0.11701928523961E-3   0.11683195855601E-3
+ 0.1166449026908E-3   0.1164581173141E-3   0.11627160209669E-3   0.11608535670942E-3   0.11589938082339E-3
+ 0.11571367411003E-3   0.11552823624102E-3   0.11534306688789E-3   0.1151581657225E-3   0.11497353241725E-3
+ 0.11478916664478E-3   0.11460506807796E-3   0.1144212363901E-3   0.11423767125476E-3   0.11405437234572E-3
+ 0.11387133933704E-3   0.11368857190326E-3   0.1135060697186E-3   0.11332383245766E-3   0.11314185979536E-3
+ 0.11296015140719E-3   0.1127787069688E-3   0.11259752615614E-3   0.11241660864544E-3   0.11223595411317E-3
+ 0.11205556223617E-3   0.11187543269171E-3   0.11169556515697E-3   0.11151595930908E-3   0.11133661482525E-3
+ 0.11115753138403E-3    0.110978708664E-3   0.11080014634397E-3   0.11062184410275E-3   0.11044380161954E-3
+ 0.11026601857379E-3   0.11008849464523E-3   0.10991122951393E-3   0.10973422285988E-3   0.10955747436331E-3
+ 0.10938098370504E-3   0.10920475056642E-3   0.10902877462906E-3   0.10885305557445E-3   0.10867759308441E-3
+ 0.10850238684111E-3   0.10832743652722E-3   0.10815274182593E-3   0.10797830241983E-3   0.10780411799169E-3
+ 0.10763018822448E-3   0.10745651280264E-3   0.1072830914105E-3   0.10710992373256E-3   0.10693700945353E-3
+ 0.10676434825877E-3   0.10659193983291E-3    0.106419783861E-3   0.10624788002852E-3   0.10607622802177E-3
+ 0.10590482752705E-3   0.10573367823103E-3   0.10556277982063E-3   0.10539213198306E-3   0.10522173440573E-3
+ 0.10505158677654E-3   0.10488168878326E-3   0.1047120401137E-3   0.10454264045579E-3   0.10437348949861E-3
+ 0.10420458693126E-3   0.10403593244309E-3   0.10386752572379E-3   0.10369936646338E-3   0.10353145435195E-3
+ 0.10336378907993E-3   0.10319637033812E-3   0.10302919781701E-3   0.10286227120736E-3   0.10269559020068E-3
+ 0.10252915448904E-3   0.10236296376473E-3   0.10219701771994E-3   0.10203131604719E-3   0.10186585843936E-3
+ 0.1017006445897E-3   0.10153567419194E-3   0.10137094693942E-3   0.10120646252576E-3   0.10104222064485E-3
+ 0.10087822099143E-3   0.10071446326027E-3   0.10055094714647E-3   0.10038767234545E-3   0.10022463855286E-3
+ 0.10006184546464E-3   0.99899292777104E-4   0.99736980186669E-4   0.99574907389622E-4   0.99413074082448E-4
+ 0.99251479962603E-4   0.99090124727749E-4   0.98929008075757E-4   0.98768129704786E-4   0.98607489313479E-4
+ 0.98447086600257E-4   0.98286921263619E-4   0.98126993002185E-4   0.97967301515791E-4   0.97807846504289E-4
+ 0.97648627667717E-4   0.97489644706223E-4   0.97330897320198E-4   0.97172385210597E-4    0.970141080787E-4
+ 0.96856065626052E-4   0.96698257553768E-4   0.96540683563286E-4   0.96383343356824E-4   0.96226236637048E-4
+ 0.96069363106845E-4   0.95912722469092E-4   0.95756314426994E-4   0.95600138684099E-4   0.95444194944334E-4
+ 0.95288482912091E-4   0.95133002291363E-4   0.94977752786436E-4   0.94822734101921E-4   0.94667945943289E-4
+ 0.9451338801612E-4   0.94359060026123E-4   0.94204961679239E-4   0.94051092681646E-4   0.93897452740041E-4
+ 0.93744041561455E-4   0.93590858852942E-4   0.93437904321477E-4   0.93285177674221E-4   0.93132678619323E-4
+ 0.92980406865117E-4   0.92828362120154E-4   0.92676544093056E-4   0.92524952492722E-4   0.92373587028501E-4
+ 0.92222447410082E-4   0.92071533347602E-4   0.91920844550631E-4   0.91770380729132E-4   0.91620141593641E-4
+ 0.91470126855343E-4   0.9132033622553E-4   0.91170769415711E-4   0.91021426137763E-4    0.908723061038E-4
+ 0.90723409025651E-4   0.90574734615419E-4   0.90426282586008E-4   0.90278052650695E-4   0.90130044522982E-4
+ 0.89982257916401E-4   0.89834692544791E-4   0.89687348122354E-4   0.89540224363655E-4   0.8939332098375E-4
+ 0.89246637697209E-4   0.89100174218932E-4   0.88953930264191E-4   0.88807905549111E-4   0.8866209978995E-4
+ 0.88516512703011E-4   0.88371144004823E-4   0.88225993412166E-4   0.88081060642388E-4   0.87936345413166E-4
+ 0.87791847442137E-4   0.87647566446914E-4   0.87503502145288E-4   0.87359654256038E-4   0.8721602249808E-4
+ 0.87072606590549E-4   0.86929406252703E-4   0.8678642120407E-4   0.86643651164609E-4   0.86501095854606E-4
+ 0.86358754994732E-4   0.86216628305213E-4   0.86074715506634E-4   0.85933016320174E-4   0.85791530467554E-4
+ 0.85650257670692E-4   0.85509197651557E-4   0.85368350132415E-4   0.85227714835835E-4   0.85087291484789E-4
+ 0.84947079802669E-4   0.84807079512614E-4   0.84667290337965E-4   0.84527712002289E-4   0.84388344230104E-4
+ 0.84249186745955E-4   0.84110239274661E-4   0.83971501541306E-4   0.83832973271507E-4   0.83694654190386E-4
+ 0.83556544023432E-4   0.83418642496538E-4   0.83280949336341E-4   0.83143464269629E-4   0.83006187023256E-4
+ 0.82869117324325E-4    0.827322549002E-4   0.82595599478743E-4   0.82459150788158E-4   0.8232290855659E-4
+ 0.82186872512234E-4   0.82051042383452E-4   0.81915417899562E-4   0.8177999878998E-4   0.81644784784349E-4
+ 0.81509775612479E-4   0.81374971004431E-4   0.81240370690694E-4   0.81105974402076E-4   0.80971781869719E-4
+ 0.8083779282438E-4   0.80704006997142E-4   0.8057042411974E-4   0.80437043924402E-4   0.80303866143589E-4
+ 0.80170890509718E-4   0.80038116755523E-4   0.79905544614068E-4   0.79773173818836E-4   0.79641004103723E-4
+ 0.79509035202333E-4   0.79377266848509E-4   0.79245698776365E-4   0.79114330720852E-4   0.78983162417025E-4
+ 0.78852193600108E-4   0.78721424005536E-4   0.78590853368966E-4   0.78460481426567E-4   0.78330307914816E-4
+ 0.78200332570285E-4   0.78070555129406E-4   0.77940975328821E-4   0.77811592906072E-4   0.77682407598925E-4
+ 0.77553419145354E-4   0.77424627283554E-4   0.77296031752164E-4   0.77167632289726E-4   0.77039428634888E-4
+ 0.76911420526436E-4   0.76783607704153E-4   0.76655989907887E-4   0.76528566877693E-4   0.76401338353773E-4
+ 0.76274304076576E-4   0.76147463787011E-4   0.76020817226295E-4   0.75894364135917E-4   0.75768104257094E-4
+ 0.75642037331348E-4   0.75516163100835E-4   0.75390481308118E-4   0.7526499169599E-4   0.75139694007282E-4
+ 0.75014587985128E-4   0.74889673372982E-4   0.74764949914678E-4   0.74640417354463E-4   0.74516075436289E-4
+ 0.74391923904378E-4   0.7426796250325E-4   0.7414419097819E-4   0.74020609074603E-4   0.73897216538049E-4
+ 0.7377401311431E-4   0.73650998549405E-4   0.73528172589815E-4   0.73405534982332E-4   0.73283085473819E-4
+ 0.7316082381109E-4   0.73038749741159E-4   0.72916863011886E-4   0.72795163371337E-4   0.72673650567791E-4
+ 0.72552324349621E-4   0.7243118446547E-4   0.72310230664381E-4   0.72189462695711E-4   0.72068880309237E-4
+ 0.71948483254305E-4   0.71828271280635E-4   0.7170824413842E-4   0.7158840157842E-4   0.71468743351498E-4
+ 0.71349269208807E-4   0.71229978901833E-4   0.71110872182298E-4   0.70991948801676E-4   0.70873208511717E-4
+ 0.70754651064872E-4   0.70636276213953E-4   0.70518083712004E-4   0.70400073312079E-4   0.70282244767538E-4
+ 0.70164597832071E-4   0.70047132259718E-4   0.6992984780492E-4   0.69812744221851E-4   0.69695821264981E-4
+ 0.69579078689098E-4   0.69462516249645E-4   0.69346133702209E-4   0.6922993080254E-4   0.69113907306622E-4
+ 0.68998062970684E-4   0.6888239755137E-4   0.68766910805646E-4   0.68651602490519E-4   0.68536472363006E-4
+ 0.68421520180305E-4   0.68306745700462E-4   0.68192148681685E-4   0.68077728882393E-4   0.67963486061118E-4
+ 0.67849419976663E-4   0.67735530388201E-4   0.67621817055204E-4   0.67508279737497E-4   0.67394918194625E-4
+ 0.67281732186451E-4   0.67168721473338E-4   0.67055885816138E-4   0.66943224975917E-4   0.66830738713771E-4
+ 0.6671842679108E-4   0.66606288969512E-4   0.66494325011124E-4   0.66382534678343E-4   0.66270917733433E-4
+ 0.66159473938847E-4   0.66048203057251E-4   0.65937104852136E-4   0.65826179087057E-4   0.65715425525811E-4
+ 0.65604843932434E-4   0.65494434071406E-4   0.65384195706938E-4   0.65274128603553E-4   0.65164232526115E-4
+ 0.65054507240085E-4   0.64944952511085E-4   0.64835568104873E-4   0.64726353787445E-4   0.64617309325038E-4
+ 0.64508434484314E-4   0.64399729032255E-4   0.64291192735836E-4   0.64182825362089E-4   0.64074626678214E-4
+ 0.63966596452249E-4   0.63858734452348E-4   0.63751040446883E-4   0.63643514204386E-4   0.63536155493639E-4
+ 0.63428964083783E-4   0.63321939744253E-4   0.63215082244794E-4   0.63108391354912E-4   0.63001866844414E-4
+ 0.62895508483626E-4   0.62789316043298E-4   0.62683289294389E-4   0.62577428007934E-4   0.62471731955247E-4
+ 0.62366200907925E-4   0.62260834637916E-4   0.62155632917539E-4   0.62050595518937E-4   0.61945722214474E-4
+ 0.61841012776753E-4   0.61736466979106E-4   0.6163208459498E-4   0.61527865397996E-4   0.61423809161978E-4
+ 0.61319915660976E-4   0.61216184669454E-4   0.61112615962161E-4   0.61009209313984E-4   0.60905964499746E-4
+ 0.60802881294486E-4   0.60699959473942E-4   0.60597198814083E-4   0.60494599091075E-4   0.6039216008133E-4
+ 0.60289881561644E-4   0.60187763308763E-4   0.60085805099532E-4   0.59984006710926E-4   0.59882367920822E-4
+ 0.59780888507173E-4   0.59679568248128E-4   0.59578406921971E-4   0.5947740430724E-4   0.59376560182835E-4
+ 0.59275874327937E-4   0.59175346521992E-4   0.59074976544295E-4   0.58974764174416E-4   0.58874709192441E-4
+ 0.58774811378825E-4   0.58675070514233E-4   0.58575486379432E-4   0.58476058755463E-4   0.58376787423641E-4
+ 0.58277672165591E-4   0.58178712763301E-4   0.58079908998605E-4   0.57981260653574E-4   0.57882767510542E-4
+ 0.57784429352495E-4   0.57686245962556E-4   0.57588217123993E-4   0.57490342620275E-4   0.5739262223508E-4
+ 0.57295055752546E-4   0.57197642957078E-4   0.57100383633172E-4   0.57003277565294E-4   0.56906324538107E-4
+ 0.56809524336995E-4   0.56712876747547E-4   0.56616381555561E-4   0.56520038546919E-4   0.5642384750776E-4
+ 0.56327808224578E-4   0.56231920484154E-4   0.56136184073646E-4   0.56040598779898E-4   0.55945164390091E-4
+ 0.55849880691803E-4   0.55754747473097E-4   0.55659764522154E-4   0.55564931627422E-4   0.55470248577643E-4
+ 0.55375715161793E-4   0.55281331168687E-4   0.55187096387399E-4   0.55093010607566E-4   0.54999073619159E-4
+ 0.5490528521237E-4   0.5481164517742E-4   0.54718153304803E-4   0.54624809385323E-4   0.54531613210127E-4
+ 0.54438564570723E-4   0.54345663258379E-4   0.5425290906463E-4   0.54160301781299E-4   0.54067841200804E-4
+ 0.53975527115701E-4   0.53883359318694E-4    0.537913376027E-4   0.53699461760848E-4   0.53607731586689E-4
+ 0.53516146874059E-4   0.53424707416836E-4   0.53333413008898E-4   0.53242263444292E-4   0.53151258517838E-4
+ 0.5306039802452E-4   0.52969681759518E-4   0.52879109518076E-4   0.52788681095693E-4   0.5269839628823E-4
+ 0.52608254891825E-4   0.52518256702936E-4   0.52428401517803E-4   0.52338689132977E-4   0.52249119345402E-4
+ 0.52159691952434E-4   0.5207040675161E-4   0.51981263540606E-4   0.51892262117339E-4   0.51803402279977E-4
+ 0.51714683826996E-4   0.51626106557203E-4   0.51537670269335E-4   0.51449374762306E-4   0.51361219835223E-4
+ 0.51273205287871E-4   0.51185330920119E-4   0.51097596532065E-4   0.51010001924038E-4   0.5092254689676E-4
+ 0.5083523125073E-4   0.50748054786717E-4   0.50661017305801E-4   0.50574118609631E-4   0.50487358500015E-4
+ 0.5040073677884E-4   0.50314253248204E-4   0.50227907710422E-4   0.50141699968236E-4   0.50055629824654E-4
+ 0.4996969708271E-4   0.49883901545489E-4   0.49798243016236E-4   0.49712721298926E-4   0.49627336197668E-4
+ 0.49542087516758E-4   0.49456975060598E-4   0.49371998633815E-4   0.4928715804141E-4   0.49202453088652E-4
+ 0.49117883581095E-4   0.49033449324084E-4   0.48949150123247E-4   0.48864985784653E-4   0.48780956114762E-4
+ 0.48697060920229E-4   0.48613300007767E-4   0.48529673184341E-4   0.48446180257177E-4   0.48362821033825E-4
+ 0.48279595322158E-4   0.48196502929933E-4   0.48113543665096E-4   0.48030717335808E-4   0.47948023750874E-4
+ 0.47865462719205E-4   0.4778303404988E-4   0.47700737552168E-4   0.47618573035561E-4   0.47536540309858E-4
+ 0.47454639185122E-4   0.47372869471569E-4   0.4729123097942E-4   0.47209723519088E-4   0.47128346901551E-4
+ 0.47047100938014E-4   0.46965985439872E-4   0.46885000218702E-4   0.46804145086412E-4   0.46723419854947E-4
+ 0.46642824336369E-4   0.46562358342886E-4   0.4648202168737E-4   0.4640181418281E-4   0.4632173564238E-4
+ 0.46241785879379E-4   0.46161964707308E-4   0.46082271940064E-4   0.46002707391802E-4   0.45923270876925E-4
+ 0.45843962209634E-4   0.45764781204404E-4   0.4568572767617E-4   0.45606801440211E-4   0.45528002311994E-4
+ 0.45449330107079E-4   0.45370784641282E-4   0.45292365730654E-4   0.45214073191514E-4   0.45135906840496E-4
+ 0.45057866494151E-4   0.44979951969239E-4   0.44902163082747E-4   0.44824499652229E-4   0.44746961495372E-4
+    0.4466954843E-4   0.44592260274124E-4   0.44515096845961E-4   0.44438057964073E-4   0.44361143447262E-4
+ 0.4428435311446E-4   0.44207686784623E-4   0.44131144276895E-4   0.44054725410972E-4   0.43978430006751E-4
+ 0.43902257884326E-4   0.43826208863877E-4   0.43750282765817E-4   0.43674479410862E-4   0.43598798619986E-4
+ 0.43523240214481E-4   0.43447804015454E-4   0.43372489844299E-4   0.43297297522733E-4   0.43222226872876E-4
+ 0.43147277716975E-4   0.43072449877507E-4   0.42997743177206E-4   0.42923157439025E-4   0.42848692485826E-4
+ 0.42774348140715E-4   0.42700124227228E-4   0.42626020569183E-4   0.42552036990577E-4   0.42478173315573E-4
+ 0.42404429368559E-4   0.42330804974154E-4   0.42257299957204E-4   0.42183914142874E-4   0.42110647356246E-4
+ 0.42037499422626E-4   0.41964470167558E-4   0.41891559417079E-4   0.41818766997363E-4   0.41746092734732E-4
+ 0.41673536455701E-4   0.41601097986986E-4   0.41528777155627E-4   0.41456573788909E-4   0.41384487714211E-4
+ 0.41312518758956E-4   0.41240666750738E-4   0.41168931517714E-4   0.4109731288821E-4   0.41025810690741E-4
+ 0.40954424753926E-4   0.40883154906608E-4   0.40812000977921E-4   0.40740962797245E-4   0.40670040194251E-4
+ 0.40599232998436E-4   0.40528541039565E-4   0.40457964147754E-4   0.40387502153495E-4   0.40317154887458E-4
+ 0.40246922180388E-4   0.40176803863255E-4   0.4010679976725E-4   0.4003690972388E-4   0.39967133564923E-4
+ 0.39897471122114E-4   0.39827922227347E-4   0.39758486712694E-4   0.39689164410767E-4   0.39619955154269E-4
+ 0.39550858776124E-4   0.39481875109483E-4   0.39413003987822E-4   0.39344245244472E-4   0.39275598713008E-4
+ 0.39207064227259E-4   0.39138641621485E-4   0.39070330730089E-4   0.39002131387622E-4   0.38934043428832E-4
+ 0.38866066688661E-4   0.38798201002369E-4   0.38730446205464E-4   0.38662802133506E-4   0.38595268622112E-4
+ 0.38527845507049E-4   0.38460532624679E-4   0.38393329811495E-4   0.38326236904168E-4   0.3825925373949E-4
+ 0.38192380154458E-4   0.38125615986358E-4   0.38058961072704E-4   0.37992415251264E-4   0.37925978359692E-4
+ 0.37859650235881E-4   0.37793430718082E-4   0.37727319644877E-4   0.37661316855031E-4   0.3759542218737E-4
+ 0.37529635480938E-4   0.37463956575008E-4   0.37398385309154E-4   0.37332921523224E-4   0.37267565056987E-4
+ 0.37202315750376E-4   0.37137173443505E-4   0.37072137977065E-4   0.37007209191859E-4   0.36942386928803E-4
+ 0.36877671028956E-4   0.36813061333556E-4   0.3674855768421E-4   0.36684159922732E-4   0.36619867891078E-4
+ 0.36555681431188E-4   0.36491600385196E-4   0.36427624595692E-4   0.36363753905472E-4   0.36299988157493E-4
+ 0.36236327194925E-4   0.3617277086122E-4   0.36109318999848E-4   0.3604597145436E-4   0.35982728068438E-4
+ 0.35919588686382E-4   0.35856553152596E-4   0.35793621311646E-4   0.35730793008198E-4   0.35668068087123E-4
+ 0.35605446393585E-4   0.35542927772966E-4   0.35480512070869E-4   0.3541819913283E-4   0.35355988804609E-4
+ 0.35293880932314E-4   0.3523187536234E-4   0.35169971941264E-4   0.35108170515736E-4   0.35046470932616E-4
+ 0.34984873038993E-4   0.34923376682239E-4   0.34861981709988E-4   0.34800687969793E-4   0.34739495309394E-4
+ 0.3467840357673E-4   0.3461741262019E-4   0.34556522288285E-4   0.34495732429679E-4   0.34435042893213E-4
+ 0.34374453527897E-4   0.34313964183056E-4   0.34253574708228E-4   0.34193284953063E-4   0.34133094767222E-4
+ 0.34073004000536E-4   0.34013012503309E-4   0.33953120126029E-4   0.33893326719356E-4   0.33833632134041E-4
+ 0.33774036221042E-4   0.33714538831569E-4   0.33655139817048E-4   0.33595839029188E-4   0.33536636319567E-4
+ 0.33477531540015E-4   0.33418524542625E-4   0.33359615179832E-4   0.33300803304186E-4   0.3324208876845E-4
+ 0.33183471425607E-4   0.3312495112884E-4   0.33066527731273E-4   0.33008201086248E-4   0.32949971047452E-4
+ 0.32891837468819E-4   0.32833800204452E-4   0.32775859108578E-4   0.32718014035615E-4   0.32660264840202E-4
+ 0.32602611377215E-4   0.32545053501797E-4   0.32487591069003E-4   0.32430223934079E-4   0.32372951952478E-4
+ 0.32315774980095E-4   0.32258692872949E-4   0.32201705487177E-4   0.32144812679084E-4   0.32088014305151E-4
+ 0.32031310222145E-4   0.31974700287039E-4   0.31918184356907E-4   0.31861762288882E-4   0.31805433940263E-4
+ 0.31749199168764E-4   0.31693057832261E-4   0.31637009788796E-4   0.31581054896548E-4   0.3152519301388E-4
+ 0.31469423999395E-4   0.31413747711903E-4   0.31358164010466E-4   0.31302672754041E-4   0.31247273801813E-4
+ 0.31191967013248E-4   0.31136752248121E-4   0.31081629366363E-4     0.31026598228E-4   0.30971658693243E-4
+  0.309168106225E-4   0.30862053876456E-4   0.30807388316039E-4   0.30752813802131E-4   0.30698330195737E-4
+ 0.30643937358002E-4   0.30589635150619E-4   0.30535423435346E-4   0.30481302074111E-4   0.30427270929011E-4
+ 0.30373329862432E-4   0.3031947873666E-4   0.30265717414182E-4   0.30212045757701E-4   0.30158463630319E-4
+ 0.30104970895261E-4   0.30051567415871E-4   0.29998253055666E-4   0.29945027678338E-4   0.2989189114782E-4
+ 0.29838843328258E-4   0.29785884083881E-4   0.29733013278996E-4   0.29680230778053E-4   0.29627536445941E-4
+ 0.29574930147685E-4   0.29522411748468E-4   0.29469981113593E-4   0.29417638108539E-4   0.29365382599033E-4
+ 0.29313214451004E-4   0.2926113353061E-4   0.2920913970389E-4   0.29157232837104E-4   0.29105412796809E-4
+ 0.29053679449863E-4   0.29002032663265E-4   0.28950472304108E-4   0.28898998239672E-4   0.28847610337426E-4
+ 0.28796308465061E-4   0.28745092490498E-4   0.28693962281651E-4   0.28642917706579E-4    0.285919586335E-4
+ 0.2854108493106E-4   0.28490296468007E-4   0.28439593113238E-4   0.28388974735805E-4   0.28338441204936E-4
+ 0.28287992390068E-4   0.28237628160833E-4   0.2818734838701E-4   0.28137152938403E-4   0.28087041684973E-4
+ 0.28037014497059E-4   0.27987071245187E-4   0.27937211800037E-4   0.27887436032414E-4   0.27837743813365E-4
+ 0.27788135014007E-4   0.27738609505562E-4   0.27689167159379E-4   0.27639807847237E-4   0.27590531441036E-4
+ 0.27541337812823E-4   0.27492226834751E-4   0.27443198379143E-4   0.27394252318572E-4   0.27345388525795E-4
+ 0.27296606873768E-4   0.27247907235397E-4   0.27199289483783E-4   0.27150753492315E-4   0.27102299134631E-4
+ 0.27053926284523E-4   0.27005634815865E-4   0.26957424602722E-4   0.26909295519339E-4   0.2686124744017E-4
+ 0.26813280239882E-4   0.26765393793155E-4   0.26717587974832E-4   0.26669862659921E-4   0.2662221772376E-4
+ 0.26574653041802E-4   0.26527168489657E-4   0.26479763943102E-4   0.26432439278067E-4   0.26385194370698E-4
+ 0.26338029097332E-4   0.26290943334425E-4   0.26243936958473E-4   0.26197009846124E-4   0.26150161874382E-4
+ 0.26103392920416E-4   0.26056702861544E-4   0.26010091575196E-4   0.25963558938973E-4   0.25917104830678E-4
+  0.258707291283E-4   0.25824431710069E-4   0.25778212454118E-4   0.25732071238792E-4   0.2568600794266E-4
+ 0.25640022444588E-4   0.2559411462354E-4   0.25548284358667E-4   0.25502531529312E-4   0.25456856014995E-4
+ 0.25411257695155E-4   0.2536573644941E-4   0.25320292157713E-4   0.25274924700252E-4   0.25229633957372E-4
+ 0.25184419809451E-4   0.2513928213706E-4   0.25094220820955E-4   0.25049235742102E-4   0.25004326781681E-4
+ 0.24959493820842E-4   0.24914736740898E-4   0.24870055423335E-4   0.24825449749971E-4   0.24780919602734E-4
+ 0.24736464863688E-4   0.24692085415048E-4   0.24647781139188E-4   0.24603551918683E-4   0.24559397636293E-4
+ 0.2451531817488E-4   0.24471313417375E-4   0.24427383246843E-4    0.243835275467E-4   0.24339746200509E-4
+ 0.24296039091979E-4   0.24252406104906E-4   0.2420884712325E-4   0.24165362031188E-4   0.24121950713079E-4
+ 0.24078613053499E-4   0.24035348936933E-4   0.23992158248069E-4   0.23949040871824E-4   0.2390599669338E-4
+ 0.23863025598049E-4   0.23820127471244E-4   0.23777302198538E-4   0.23734549665672E-4   0.23691869758575E-4
+ 0.23649262363369E-4   0.23606727366225E-4   0.23564264653437E-4   0.23521874111435E-4   0.23479555626984E-4
+ 0.23437309086938E-4   0.23395134378322E-4   0.23353031388334E-4   0.23311000004405E-4   0.23269040113886E-4
+  0.232271516043E-4   0.23185334363348E-4   0.23143588279064E-4   0.23101913239589E-4   0.23060309133173E-4
+ 0.23018775848211E-4   0.22977313273244E-4   0.22935921297038E-4   0.22894599808533E-4   0.22853348696742E-4
+ 0.22812167850729E-4   0.22771057159671E-4   0.22730016513163E-4   0.22689045800917E-4   0.22648144912779E-4
+ 0.22607313738643E-4   0.22566552168562E-4   0.22525860092827E-4   0.22485237401902E-4   0.22444683986441E-4
+ 0.2240419973703E-4   0.22363784544447E-4   0.22323438299693E-4   0.22283160893993E-4   0.2224295221869E-4
+ 0.22202812165269E-4   0.22162740625367E-4   0.22122737490774E-4   0.22082802653439E-4   0.22042936005504E-4
+ 0.22003137439151E-4   0.21963406846691E-4   0.2192374412057E-4   0.21884149153553E-4   0.21844621838503E-4
+ 0.21805162068421E-4   0.21765769736435E-4   0.21726444735818E-4   0.21687186960043E-4   0.21647996302749E-4
+ 0.21608872657697E-4   0.21569815918662E-4   0.21530825979563E-4   0.2149190273462E-4   0.21453046078215E-4
+ 0.21414255904847E-4   0.21375532109185E-4   0.21336874586094E-4   0.21298283230478E-4   0.21259757937296E-4
+ 0.21221298601621E-4   0.21182905118924E-4   0.21144577384772E-4   0.2110631529486E-4   0.21068118744966E-4
+ 0.21029987631017E-4   0.20991921849149E-4   0.20953921295662E-4   0.20915985867021E-4   0.20878115459659E-4
+ 0.2084030997018E-4   0.20802569295415E-4   0.20764893332401E-4   0.20727281978311E-4   0.20689735130393E-4
+ 0.20652252686047E-4   0.20614834542831E-4   0.20577480598502E-4   0.20540190750995E-4   0.20502964898243E-4
+ 0.20465802938309E-4   0.20428704769399E-4   0.20391670290017E-4   0.20354699398767E-4   0.20317791994374E-4
+ 0.20280947975696E-4   0.20244167241732E-4   0.20207449691655E-4   0.20170795224796E-4   0.20134203740599E-4
+ 0.20097675138563E-4   0.20061209318325E-4   0.20024806179779E-4   0.19988465622966E-4   0.19952187548054E-4
+ 0.19915971855331E-4   0.19879818445226E-4   0.19843727218327E-4   0.1980769807537E-4   0.19771730917279E-4
+ 0.19735825644962E-4   0.19699982159495E-4   0.19664200362125E-4   0.19628480154313E-4   0.19592821437611E-4
+ 0.19557224113759E-4   0.19521688084655E-4   0.19486213252346E-4   0.19450799518841E-4   0.19415446786312E-4
+ 0.19380154957162E-4   0.19344923933973E-4   0.19309753619448E-4   0.19274643916404E-4   0.19239594727804E-4
+ 0.19204605956752E-4   0.19169677506499E-4   0.19134809280474E-4   0.19100001182128E-4   0.19065253115047E-4
+ 0.19030564982957E-4   0.18995936689854E-4   0.18961368139838E-4   0.1892685923711E-4   0.18892409885991E-4
+ 0.18858019990928E-4   0.18823689456578E-4   0.18789418187745E-4   0.18755206089319E-4   0.18721053066232E-4
+ 0.18686959023535E-4   0.1865292386658E-4   0.18618947500852E-4   0.18585029831954E-4   0.18551170765557E-4
+ 0.18517370207479E-4   0.18483628063708E-4   0.18449944240386E-4   0.18416318643832E-4   0.18382751180321E-4
+ 0.18349241756293E-4   0.18315790278369E-4   0.18282396653396E-4   0.18249060788332E-4   0.18215782590217E-4
+ 0.18182561966229E-4   0.18149398823679E-4   0.18116293070053E-4   0.18083244612993E-4   0.18050253360183E-4
+ 0.18017319219409E-4   0.17984442098573E-4   0.17951621905853E-4   0.17918858549502E-4   0.17886151937922E-4
+ 0.17853501979676E-4   0.17820908583515E-4   0.17788371658125E-4   0.17755891112336E-4   0.17723466855124E-4
+ 0.17691098795743E-4   0.17658786843537E-4   0.17626530907945E-4   0.17594330898533E-4   0.17562186724991E-4
+ 0.1753009829718E-4   0.17498065525104E-4   0.17466088318851E-4   0.17434166588561E-4   0.17402300244475E-4
+ 0.17370489197156E-4   0.17338733357283E-4   0.17307032635645E-4   0.17275386943051E-4   0.17243796190444E-4
+ 0.17212260288993E-4   0.17180779150021E-4   0.17149352685019E-4   0.1711798080538E-4   0.17086663422672E-4
+ 0.17055400448651E-4   0.17024191795278E-4   0.16993037374625E-4   0.16961937098834E-4   0.1693089088018E-4
+ 0.16899898631072E-4   0.16868960264096E-4   0.1683807569199E-4   0.16807244827512E-4   0.16776467583521E-4
+ 0.16745743873002E-4   0.16715073609182E-4   0.16684456705375E-4   0.16653893075023E-4   0.16623382631703E-4
+ 0.16592925289117E-4   0.16562520961082E-4   0.16532169561559E-4   0.16501871004625E-4    0.164716252044E-4
+ 0.16441432075128E-4   0.16411291531267E-4   0.16381203487411E-4   0.16351167858256E-4   0.16321184558654E-4
+ 0.16291253503611E-4   0.1626137460818E-4   0.1623154778746E-4   0.16201772956653E-4   0.16172050031267E-4
+ 0.16142378926896E-4   0.16112759559247E-4   0.16083191844113E-4   0.16053675697404E-4   0.16024211035205E-4
+ 0.15994797773734E-4   0.15965435829361E-4   0.15936125118402E-4   0.15906865557322E-4   0.15877657062783E-4
+ 0.15848499551631E-4   0.15819392940824E-4   0.15790337147376E-4   0.15761332088438E-4   0.15732377681287E-4
+ 0.15703473843352E-4   0.15674620492208E-4   0.15645817545458E-4   0.15617064920815E-4   0.15588362536109E-4
+  0.155597103094E-4   0.15531108158843E-4   0.15502556002691E-4    0.154740537593E-4   0.15445601347132E-4
+ 0.15417198684842E-4   0.15388845691209E-4   0.15360542285104E-4   0.15332288385409E-4   0.15304083911121E-4
+ 0.1527592878149E-4   0.15247822915891E-4   0.15219766233813E-4   0.15191758654789E-4   0.15163800098479E-4
+ 0.15135890484701E-4   0.15108029733416E-4   0.15080217764749E-4   0.15052454498762E-4   0.1502473985566E-4
+ 0.14997073755804E-4   0.1496945611977E-4   0.14941886868213E-4   0.14914365921899E-4   0.14886893201723E-4
+ 0.14859468628713E-4   0.14832092123883E-4   0.14804763608378E-4   0.14777483003536E-4   0.14750250230858E-4
+ 0.14723065211967E-4   0.14695927868503E-4   0.14668838122231E-4   0.14641795895062E-4   0.14614801109094E-4
+ 0.14587853686579E-4   0.14560953549701E-4   0.14534100620751E-4   0.14507294822141E-4   0.14480536076567E-4
+ 0.14453824306792E-4   0.14427159435661E-4   0.14400541386115E-4   0.14373970081207E-4   0.14347445444151E-4
+ 0.14320967398283E-4   0.14294535867021E-4   0.14268150773832E-4   0.14241812042289E-4   0.14215519596177E-4
+ 0.14189273359386E-4   0.14163073255915E-4   0.14136919209853E-4   0.14110811145405E-4   0.14084748986902E-4
+ 0.14058732658796E-4   0.14032762085683E-4   0.14006837192154E-4   0.1398095790293E-4   0.13955124142878E-4
+ 0.13929335837038E-4   0.13903592910549E-4   0.13877895288625E-4   0.13852242896591E-4   0.13826635659885E-4
+ 0.13801073504087E-4    0.137755563549E-4   0.13750084138082E-4   0.13724656779483E-4   0.13699274205054E-4
+ 0.13673936340932E-4   0.13648643113329E-4   0.13623394448585E-4   0.13598190273188E-4   0.13573030513772E-4
+ 0.13547915096935E-4   0.13522843949393E-4   0.13497816997983E-4   0.13472834169744E-4   0.13447895391796E-4
+ 0.13423000591354E-4   0.13398149695736E-4   0.13373342632363E-4   0.13348579328801E-4   0.13323859712738E-4
+ 0.13299183711929E-4   0.13274551254172E-4   0.13249962267352E-4   0.13225416679607E-4   0.13200914419166E-4
+ 0.13176455414355E-4   0.13152039593564E-4   0.13127666885303E-4   0.13103337218198E-4   0.13079050520989E-4
+ 0.1305480672254E-4   0.13030605751743E-4   0.13006447537601E-4   0.12982332009266E-4   0.12958259096048E-4
+ 0.12934228727369E-4   0.12910240832673E-4   0.12886295341508E-4   0.12862392183542E-4   0.12838531288632E-4
+ 0.12814712586754E-4   0.12790936007877E-4   0.1276720148205E-4   0.12743508939413E-4   0.12719858310357E-4
+ 0.12696249525335E-4   0.12672682514893E-4   0.12649157209664E-4   0.12625673540384E-4   0.12602231437925E-4
+ 0.12578830833268E-4   0.12555471657493E-4   0.12532153841702E-4   0.12508877317102E-4   0.12485642015077E-4
+ 0.12462447867124E-4   0.12439294804819E-4   0.12416182759887E-4   0.12393111664171E-4   0.12370081449557E-4
+ 0.12347092047966E-4   0.12324143391409E-4   0.12301235412136E-4   0.12278368042474E-4   0.12255541214845E-4
+ 0.12232754861747E-4   0.12210008915784E-4   0.12187303309682E-4   0.12164637976279E-4   0.12142012848531E-4
+ 0.12119427859394E-4   0.12096882941934E-4   0.12074378029369E-4   0.12051913055062E-4   0.12029487952473E-4
+ 0.12007102655109E-4   0.11984757096583E-4   0.11962451210616E-4   0.1194018493107E-4   0.11917958191926E-4
+ 0.11895770927176E-4   0.11873623070896E-4   0.11851514557252E-4   0.11829445320642E-4   0.11807415295536E-4
+ 0.11785424416467E-4   0.11763472618045E-4   0.11741559834963E-4   0.11719686002099E-4   0.11697851054425E-4
+ 0.11676054926991E-4   0.11654297554862E-4   0.11632578873211E-4   0.11610898817379E-4   0.11589257322817E-4
+ 0.11567654325066E-4   0.11546089759733E-4   0.11524563562519E-4   0.11503075669258E-4   0.11481626015905E-4
+ 0.11460214538556E-4   0.11438841173236E-4   0.11417505856091E-4   0.11396208523394E-4   0.11374949111609E-4
+ 0.11353727557261E-4   0.11332543796967E-4   0.11311397767453E-4   0.11290289405559E-4   0.11269218648095E-4
+ 0.11248185431984E-4   0.11227189694307E-4   0.11206231372284E-4   0.11185310403209E-4   0.11164426724457E-4
+ 0.11143580273498E-4   0.11122770987907E-4   0.11101998805366E-4   0.1108126366369E-4   0.11060565500682E-4
+ 0.11039904254235E-4   0.11019279862335E-4   0.10998692263181E-4   0.10978141395041E-4   0.10957627196242E-4
+ 0.10937149605189E-4   0.10916708560356E-4   0.10896304000418E-4   0.10875935864139E-4   0.10855604090339E-4
+ 0.10835308617828E-4   0.1081504938551E-4   0.10794826332506E-4   0.10774639398033E-4   0.10754488521388E-4
+ 0.10734373641925E-4   0.10714294699097E-4   0.10694251632468E-4    0.106742443817E-4   0.1065427288659E-4
+ 0.1063433708689E-4   0.10614436922469E-4   0.10594572333319E-4   0.10574743259598E-4   0.10554949641537E-4
+ 0.10535191419426E-4   0.10515468533653E-4   0.10495780924698E-4   0.1047612853314E-4   0.10456511299665E-4
+ 0.10436929165011E-4   0.10417382069992E-4   0.10397869955502E-4   0.10378392762599E-4   0.10358950432397E-4
+ 0.10339542906118E-4    0.103201701251E-4   0.10300832030819E-4   0.10281528564685E-4   0.10262259668195E-4
+ 0.10243025282947E-4   0.10223825350783E-4   0.10204659813604E-4   0.10185528613338E-4   0.10166431691981E-4
+ 0.10147368991613E-4   0.10128340454475E-4   0.10109346022888E-4   0.10090385639242E-4   0.10071459245973E-4
+ 0.10052566785609E-4   0.10033708200815E-4   0.10014883434341E-4   0.99960924290196E-5   0.99773351277725E-5
+ 0.99586114736043E-5   0.99399214096218E-5   0.99212648790253E-5   0.99026418251304E-5   0.9884052191236E-5
+ 0.98654959207454E-5   0.9846972957182E-5   0.98284832442064E-5   0.98100267255547E-5   0.97916033450194E-5
+ 0.9773213046482E-5   0.97548557739142E-5   0.97365314713972E-5   0.97182400831149E-5   0.96999815532801E-5
+ 0.96817558261756E-5   0.96635628461587E-5   0.96454025577695E-5   0.96272749056077E-5   0.9609179834349E-5
+ 0.95911172887422E-5   0.95730872136189E-5   0.95550895539244E-5   0.95371242546953E-5   0.95191912610485E-5
+ 0.95012905181195E-5   0.94834219711304E-5   0.94655855654496E-5   0.94477812465428E-5   0.94300089599495E-5
+ 0.94122686512903E-5   0.93945602662892E-5   0.93768837507237E-5   0.9359239050419E-5   0.93416261112741E-5
+ 0.93240448793564E-5   0.93064953008047E-5   0.92889773218358E-5   0.92714908887294E-5   0.92540359478488E-5
+ 0.92366124456633E-5   0.92192203287331E-5   0.92018595437192E-5   0.91845300372739E-5   0.9167231756147E-5
+ 0.91499646472059E-5   0.91327286574372E-5   0.91155237339002E-5   0.9098349823714E-5   0.90812068740825E-5
+ 0.90640948322958E-5   0.90470136457441E-5   0.90299632619185E-5   0.90129436283288E-5   0.89959546925552E-5
+ 0.89789964022521E-5   0.89620687052491E-5   0.89451715494331E-5   0.89283048827576E-5   0.89114686532434E-5
+ 0.88946628089884E-5   0.88778872982078E-5   0.88611420692019E-5   0.88444270703403E-5   0.88277422500115E-5
+ 0.88110875566837E-5   0.87944629389743E-5   0.87778683455887E-5   0.87613037253082E-5   0.87447690269617E-5
+ 0.87282641994634E-5   0.8711789191822E-5   0.8695343953138E-5   0.86789284326153E-5   0.86625425794515E-5
+ 0.86461863429345E-5   0.86298596724467E-5   0.86135625175027E-5   0.85972948276746E-5   0.85810565526158E-5
+ 0.85648476420648E-5   0.85486680458521E-5   0.85325177138084E-5   0.8516396595853E-5   0.85003046420232E-5
+ 0.84842418024635E-5   0.84682080273918E-5   0.84522032670727E-5   0.84362274718531E-5   0.84202805921648E-5
+ 0.84043625785375E-5   0.83884733815958E-5   0.83726129519768E-5   0.83567812403894E-5   0.83409781976185E-5
+ 0.83252037746021E-5   0.83094579223353E-5   0.8293740591877E-5   0.82780517343549E-5   0.82623913009688E-5
+ 0.82467592430264E-5   0.82311555119156E-5   0.82155800590859E-5   0.82000328360154E-5   0.81845137942559E-5
+ 0.8169022885499E-5   0.81535600615137E-5   0.81381252741406E-5   0.8122718475272E-5   0.8107339616878E-5
+ 0.80919886510215E-5   0.80766655298503E-5   0.80613702056136E-5   0.80461026305432E-5   0.80308627569619E-5
+ 0.80156505372872E-5   0.80004659240592E-5   0.79853088698802E-5   0.79701793274082E-5   0.79550772493752E-5
+ 0.79400025885893E-5   0.79249552979516E-5   0.79099353304491E-5   0.78949426391046E-5   0.78799771769968E-5
+ 0.7865038897265E-5   0.78501277532038E-5   0.78352436981556E-5   0.78203866855374E-5   0.78055566688425E-5
+ 0.77907536016616E-5   0.77759774375935E-5   0.77612281303096E-5   0.77465056335573E-5   0.77318099012211E-5
+ 0.77171408872419E-5   0.77024985456198E-5   0.76878828304219E-5   0.76732936957839E-5   0.76587310959432E-5
+ 0.76441949852139E-5   0.76296853179628E-5   0.76152020485889E-5   0.76007451315576E-5   0.75863145214752E-5
+ 0.75719101730161E-5   0.75575320409218E-5   0.75431800799821E-5   0.7528854245061E-5   0.75145544911109E-5
+ 0.75002807731634E-5   0.74860330463423E-5   0.74718112657596E-5   0.74576153866118E-5   0.74434453641911E-5
+ 0.74293011539023E-5   0.74151827112135E-5   0.74010899916338E-5   0.73870229507441E-5   0.73729815441987E-5
+ 0.7358965727748E-5   0.73449754572235E-5   0.73310106884811E-5   0.73170713774323E-5   0.73031574800494E-5
+ 0.72892689524502E-5   0.72754057508017E-5   0.72615678313342E-5   0.72477551503378E-5   0.72339676641693E-5
+ 0.72202053292787E-5   0.72064681021902E-5   0.71927559394947E-5   0.71790687977958E-5   0.7165406633769E-5
+ 0.71517694042064E-5   0.71381570659806E-5   0.71245695760236E-5   0.71110068913347E-5   0.70974689689965E-5
+ 0.70839557661367E-5   0.70704672399212E-5   0.70570033475767E-5   0.70435640464634E-5   0.70301492940014E-5
+ 0.70167590476741E-5   0.7003393265015E-5   0.69900519036248E-5   0.69767349211919E-5   0.6963442275479E-5
+ 0.69501739243323E-5   0.69369298255879E-5   0.6923709937162E-5   0.69105142170654E-5   0.68973426234075E-5
+ 0.68841951143563E-5   0.68710716481286E-5   0.68579721830104E-5   0.68448966773567E-5   0.68318450896005E-5
+ 0.68188173782538E-5   0.6805813501855E-5   0.67928334190006E-5   0.67798770883481E-5   0.67669444686813E-5
+ 0.67540355188337E-5   0.67411501976985E-5   0.67282884642283E-5   0.67154502774393E-5   0.67026355964324E-5
+ 0.66898443803793E-5   0.66770765885103E-5   0.66643321800766E-5   0.66516111143961E-5   0.66389133508958E-5
+ 0.6626238849074E-5   0.66135875684896E-5   0.66009594687533E-5   0.65883545095427E-5   0.65757726506069E-5
+ 0.65632138517659E-5   0.65506780729229E-5   0.65381652739845E-5   0.65256754149283E-5   0.65132084558063E-5
+ 0.65007643567772E-5   0.64883430780465E-5   0.64759445798858E-5   0.64635688226351E-5   0.64512157667098E-5
+ 0.64388853725272E-5   0.64265776005767E-5   0.64142924114399E-5   0.64020297657848E-5   0.63897896243369E-5
+ 0.63775719478671E-5   0.63653766972118E-5   0.63532038332745E-5   0.63410533170337E-5   0.63289251095452E-5
+ 0.63168191718802E-5   0.63047354651675E-5   0.62926739505961E-5   0.62806345894774E-5   0.62686173431695E-5
+ 0.62566221730831E-5   0.62446490406844E-5   0.62326979074998E-5   0.62207687351378E-5   0.62088614852725E-5
+ 0.61969761196303E-5   0.61851125999635E-5   0.61732708880843E-5   0.61614509459128E-5   0.61496527354328E-5
+ 0.61378762186861E-5    0.612612135776E-5   0.61143881148059E-5   0.61026764520443E-5   0.60909863317623E-5
+ 0.6079317716325E-5   0.60676705681003E-5   0.60560448495257E-5   0.60444405231117E-5   0.60328575514641E-5
+ 0.60212958972404E-5   0.60097555231444E-5   0.59982363919394E-5   0.59867384664494E-5   0.59752617095764E-5
+ 0.59638060842912E-5   0.59523715535935E-5   0.59409580805264E-5   0.59295656281828E-5   0.59181941597798E-5
+ 0.59068436385742E-5   0.58955140278832E-5   0.58842052910866E-5   0.58729173916423E-5   0.5861650293016E-5
+ 0.58504039587311E-5   0.58391783523718E-5   0.58279734376315E-5   0.58167891782488E-5   0.58056255380128E-5
+ 0.57944824807677E-5   0.57833599704136E-5   0.57722579709283E-5   0.57611764463521E-5   0.57501153607701E-5
+ 0.57390746782949E-5   0.57280543630939E-5   0.57170543794415E-5   0.57060746916686E-5   0.56951152641608E-5
+ 0.56841760613452E-5   0.5673257047708E-5   0.56623581878061E-5   0.56514794462605E-5   0.5640620787767E-5
+ 0.56297821770132E-5   0.56189635787564E-5   0.56081649578274E-5   0.55973862791447E-5   0.55866275076765E-5
+ 0.55758886084329E-5   0.55651695464812E-5   0.5554470286947E-5   0.55437907950277E-5   0.55331310359864E-5
+ 0.55224909751107E-5   0.55118705777335E-5   0.55012698092362E-5   0.54906886351143E-5   0.54801270209038E-5
+ 0.54695849321928E-5   0.54590623346188E-5   0.54485591938744E-5   0.54380754757217E-5   0.54276111459826E-5
+ 0.54171661705349E-5   0.54067405152697E-5   0.53963341461363E-5   0.53859470291737E-5   0.53755791304871E-5
+ 0.53652304162286E-5   0.53549008526069E-5   0.53445904058962E-5   0.53342990424089E-5   0.53240267284868E-5
+ 0.53137734305222E-5   0.53035391150115E-5   0.52933237485003E-5   0.52831272975859E-5   0.52729497289074E-5
+ 0.52627910091591E-5   0.52526511051019E-5   0.52425299835556E-5   0.5232427611407E-5   0.52223439555421E-5
+ 0.52122789829097E-5   0.5202232660532E-5   0.51922049555091E-5   0.51821958349901E-5   0.51722052661616E-5
+ 0.51622332162658E-5   0.51522796526005E-5   0.51423445425297E-5   0.51324278534803E-5   0.51225295528993E-5
+ 0.51126496082789E-5   0.51027879871582E-5   0.50929446571858E-5   0.50831195860494E-5   0.50733127414815E-5
+ 0.50635240912582E-5   0.50537536032062E-5   0.50440012452273E-5   0.5034266985279E-5   0.50245507913668E-5
+ 0.50148526315084E-5   0.50051724737751E-5   0.49955102863293E-5   0.4985866037392E-5   0.49762396952341E-5
+ 0.49666312281616E-5   0.4957040604536E-5   0.49474677927772E-5   0.49379127613632E-5   0.49283754788374E-5
+ 0.49188559137489E-5   0.49093540347033E-5   0.48998698103647E-5   0.48904032094802E-5   0.4880954200835E-5
+ 0.48715227532696E-5   0.48621088356788E-5   0.48527124170187E-5   0.48433334662486E-5   0.48339719523863E-5
+ 0.48246278445204E-5   0.48153011118076E-5   0.48059917234508E-5   0.47966996486925E-5   0.47874248568274E-5
+ 0.4778167317203E-5   0.4768926999227E-5   0.47597038723675E-5   0.47504979061093E-5   0.47413090699829E-5
+ 0.47321373335672E-5   0.47229826665343E-5   0.47138450385949E-5   0.47047244195037E-5   0.46956207790604E-5
+ 0.46865340871116E-5   0.46774643135728E-5   0.46684114284124E-5   0.46593754016403E-5   0.4650356203283E-5
+ 0.46413538034154E-5   0.46323681722019E-5   0.46233992798595E-5   0.46144470966518E-5   0.46055115928743E-5
+ 0.45965927388745E-5   0.45876905050568E-5   0.45788048618806E-5   0.45699357798673E-5   0.45610832295396E-5
+ 0.45522471814759E-5   0.45434276063122E-5   0.45346244747629E-5   0.45258377575835E-5   0.45170674255662E-5
+ 0.45083134495512E-5   0.44995758004268E-5   0.44908544491435E-5   0.44821493667065E-5   0.44734605241459E-5
+ 0.44647878925261E-5   0.44561314429501E-5   0.44474911466238E-5   0.44388669747862E-5   0.44302588987224E-5
+ 0.44216668897611E-5   0.44130909192935E-5   0.44045309587253E-5   0.43959869795078E-5   0.43874589531391E-5
+ 0.43789468512047E-5   0.43704506453271E-5   0.43619703071683E-5   0.43535058084338E-5   0.43450571208747E-5
+ 0.43366242163022E-5   0.43282070665776E-5   0.43198056435997E-5   0.43114199192912E-5   0.43030498656185E-5
+ 0.42946954546309E-5   0.42863566584238E-5   0.42780334491363E-5   0.42697257989426E-5   0.42614336800645E-5
+ 0.42531570647777E-5   0.42448959254077E-5   0.42366502343399E-5   0.42284199639584E-5   0.42202050867019E-5
+ 0.42120055750659E-5   0.4203821401616E-5   0.41956525389576E-5   0.41874989597298E-5   0.41793606366174E-5
+ 0.41712375423515E-5   0.41631296497215E-5   0.4155036931569E-5   0.41469593607558E-5   0.41388969101792E-5
+ 0.41308495527734E-5   0.41228172615681E-5   0.41148000096249E-5   0.41067977700461E-5   0.40988105159703E-5
+ 0.40908382205811E-5   0.4082880857119E-5   0.40749383988722E-5   0.40670108191739E-5   0.40590980913695E-5
+ 0.40512001888508E-5   0.40433170850794E-5   0.40354487535702E-5   0.40275951678769E-5   0.40197563015949E-5
+ 0.40119321283722E-5   0.40041226218895E-5   0.39963277558525E-5   0.39885475040075E-5   0.39807818401801E-5
+ 0.39730307382367E-5   0.3965294172085E-5   0.39575721156679E-5   0.39498645429736E-5   0.39421714280391E-5
+ 0.39344927449476E-5   0.39268284678348E-5   0.39191785708437E-5   0.39115430281657E-5   0.39039218140483E-5
+   0.38963149028E-5   0.38887222687681E-5   0.38811438863325E-5   0.38735797299166E-5   0.38660297739882E-5
+ 0.38584939930668E-5   0.38509723617215E-5   0.38434648545405E-5   0.38359714461489E-5   0.38284921112097E-5
+ 0.38210268244658E-5   0.38135755606919E-5   0.38061382947024E-5   0.37987150013494E-5   0.37913056555257E-5
+ 0.37839102321785E-5   0.37765287062999E-5   0.37691610529214E-5   0.37618072470885E-5   0.37544672638893E-5
+ 0.37471410784796E-5   0.37398286660623E-5   0.37325300018803E-5   0.37252450612057E-5   0.37179738193545E-5
+ 0.37107162516888E-5   0.37034723336183E-5   0.36962420406042E-5   0.36890253481126E-5   0.36818222316539E-5
+ 0.36746326667846E-5   0.36674566291314E-5   0.36602940943521E-5   0.3653145038143E-5   0.36460094362425E-5
+ 0.36388872644384E-5   0.36317784985259E-5   0.36246831143455E-5   0.36176010877926E-5   0.36105323948181E-5
+ 0.36034770114095E-5   0.35964349135853E-5   0.35894060774058E-5   0.35823904789733E-5   0.35753880944362E-5
+ 0.35683988999903E-5   0.35614228718491E-5   0.35544599862623E-5   0.35475102195175E-5   0.35405735479748E-5
+ 0.35336499480251E-5   0.35267393960955E-5   0.35198418686496E-5   0.35129573421899E-5   0.35060857932673E-5
+ 0.34992271984742E-5   0.34923815344394E-5   0.34855487778113E-5   0.34787289052776E-5   0.34719218935877E-5
+ 0.3465127719532E-5   0.34583463599386E-5   0.34515777916685E-5   0.34448219916223E-5   0.34380789367441E-5
+ 0.34313486040205E-5   0.34246309704876E-5   0.34179260131848E-5   0.34112337091946E-5   0.34045540356451E-5
+ 0.33978869697266E-5   0.33912324886618E-5   0.3384590569704E-5   0.33779611901443E-5   0.33713443273126E-5
+ 0.33647399585854E-5   0.33581480613823E-5   0.3351568613146E-5   0.33450015913469E-5   0.33384469734869E-5
+ 0.33319047371452E-5   0.33253748599284E-5   0.33188573194806E-5   0.33123520934831E-5   0.33058591596672E-5
+ 0.32993784957723E-5   0.32929100795726E-5   0.32864538888791E-5   0.32800099015788E-5   0.32735780955871E-5
+ 0.32671584488479E-5   0.32607509393377E-5   0.32543555450691E-5   0.3247972244106E-5   0.32416010145506E-5
+ 0.32352418345364E-5   0.3228894682216E-5   0.32225595357782E-5   0.32162363734728E-5   0.3209925173587E-5
+ 0.3203625914443E-5   0.31973385743931E-5   0.31910631318274E-5   0.31847995651771E-5   0.31785478529124E-5
+ 0.31723079735494E-5   0.31660799056096E-5   0.31598636276563E-5   0.31536591182962E-5    0.314746635619E-5
+ 0.31412853200308E-5   0.31351159885391E-5   0.31289583404715E-5   0.31228123546209E-5   0.31166780098276E-5
+ 0.31105552849731E-5   0.31044441589552E-5   0.30983446106993E-5   0.30922566191588E-5   0.30861801633656E-5
+ 0.30801152223766E-5   0.30740617752805E-5   0.30680198011923E-5   0.30619892792624E-5   0.30559701886899E-5
+ 0.30499625087118E-5   0.30439662186007E-5   0.30379812976378E-5   0.30320077251427E-5   0.3026045480487E-5
+ 0.30200945430847E-5   0.30141548923789E-5   0.3008226507852E-5   0.30023093690258E-5   0.29964034554486E-5
+ 0.29905087466872E-5   0.29846252223408E-5   0.29787528620715E-5   0.29728916455748E-5   0.29670415525791E-5
+ 0.2961202562836E-5   0.29553746561324E-5   0.29495578122991E-5   0.29437520112057E-5   0.29379572327645E-5
+ 0.29321734568861E-5   0.29264006635222E-5   0.29206388326681E-5   0.29148879443701E-5   0.29091479787049E-5
+ 0.29034189157731E-5    0.289770073571E-5   0.28919934186857E-5   0.2886296944913E-5   0.28806112946435E-5
+ 0.28749364481444E-5   0.28692723857112E-5   0.28636190876692E-5   0.28579765344085E-5   0.28523447063444E-5
+ 0.28467235839231E-5    0.284111314762E-5   0.28355133779431E-5   0.28299242554432E-5   0.28243457607067E-5
+ 0.28187778743521E-5   0.28132205770066E-5   0.2807673849331E-5   0.28021376720423E-5   0.27966120258965E-5
+ 0.27910968916822E-5   0.27855922502048E-5   0.27800980823062E-5   0.27746143688655E-5   0.27691410908001E-5
+ 0.27636782290668E-5   0.27582257646301E-5   0.2752783678489E-5   0.27473519516782E-5   0.27419305652837E-5
+ 0.2736519500417E-5   0.27311187382226E-5   0.27257282598783E-5   0.27203480466009E-5   0.27149780796143E-5
+ 0.2709618340179E-5   0.27042688095963E-5   0.26989294692101E-5   0.26936003003928E-5   0.26882812845451E-5
+ 0.26829724030997E-5   0.26776736375225E-5   0.26723849693155E-5   0.26671063800187E-5   0.26618378511856E-5
+ 0.26565793643978E-5   0.26513309012665E-5   0.26460924434607E-5   0.26408639726737E-5   0.26356454706277E-5
+ 0.26304369190743E-5   0.26252382997946E-5   0.26200495946107E-5   0.26148707853784E-5   0.26097018539812E-5
+ 0.26045427823126E-5   0.25993935522972E-5   0.25942541459131E-5   0.25891245451725E-5   0.25840047321167E-5
+ 0.25788946888097E-5   0.25737943973481E-5   0.25687038398625E-5   0.25636229985174E-5   0.25585518555154E-5
+ 0.25534903930642E-5   0.25484385934049E-5   0.25433964388137E-5   0.25383639116164E-5   0.25333409941644E-5
+ 0.25283276688329E-5   0.25233239180271E-5   0.25183297241821E-5   0.25133450697709E-5   0.25083699372996E-5
+ 0.2503404309294E-5   0.24984481683024E-5   0.24935014968992E-5   0.24885642777146E-5   0.24836364934027E-5
+ 0.24787181266468E-5    0.247380916016E-5   0.24689095766934E-5   0.24640193590085E-5   0.24591384898953E-5
+ 0.24542669521725E-5   0.2449404728711E-5   0.24445518024049E-5   0.24397081561758E-5   0.24348737729732E-5
+ 0.24300486357763E-5   0.24252327275979E-5   0.24204260314825E-5   0.24156285305006E-5   0.24108402077377E-5
+ 0.2406061046308E-5   0.24012910293736E-5   0.23965301401265E-5   0.23917783617863E-5   0.23870356775967E-5
+ 0.23823020708315E-5   0.23775775247959E-5   0.23728620228253E-5   0.23681555482915E-5   0.23634580845717E-5
+ 0.23587696150759E-5   0.23540901232476E-5   0.23494195925723E-5   0.23447580065603E-5   0.23401053487472E-5
+ 0.23354616026976E-5   0.23308267520051E-5   0.23262007802932E-5   0.23215836712176E-5   0.23169754084534E-5
+ 0.23123759756995E-5   0.2307785356678E-5   0.2303203535164E-5   0.22986304949554E-5   0.22940662198753E-5
+ 0.22895106937685E-5   0.22849639005061E-5   0.22804258240002E-5   0.22758964481923E-5   0.22713757570529E-5
+ 0.2266863734557E-5   0.22623603647106E-5   0.22578656315604E-5   0.22533795191868E-5   0.22489020116943E-5
+ 0.22444330932153E-5   0.22399727479138E-5   0.22355209599761E-5   0.22310777136042E-5   0.2226642993026E-5
+ 0.22222167825162E-5   0.22177990663764E-5   0.22133898289342E-5   0.22089890545369E-5   0.22045967275598E-5
+ 0.22002128324111E-5   0.21958373535288E-5   0.21914702753844E-5   0.21871115824517E-5   0.21827612592362E-5
+ 0.21784192902766E-5   0.21740856601492E-5   0.21697603534546E-5   0.2165443354815E-5   0.21611346488795E-5
+ 0.21568342203244E-5   0.21525420538595E-5   0.21482581342259E-5   0.21439824461757E-5   0.21397149744818E-5
+ 0.2135455703939E-5   0.21312046193999E-5   0.2126961705736E-5   0.21227269478413E-5   0.21185003306296E-5
+ 0.21142818390414E-5   0.21100714580522E-5   0.21058691726655E-5    0.210167496791E-5   0.2097488828823E-5
+ 0.20933107404687E-5   0.20891406879521E-5   0.20849786564083E-5   0.20808246309974E-5   0.2076678596898E-5
+ 0.20725405393161E-5   0.20684104434861E-5   0.20642882946713E-5   0.2060174078167E-5   0.20560677792736E-5
+ 0.20519693833179E-5   0.20478788756547E-5   0.20437962416828E-5   0.20397214668201E-5   0.20356545365094E-5
+ 0.20315954362195E-5   0.20275441514511E-5   0.20235006677071E-5   0.2019464970519E-5   0.20154370454523E-5
+ 0.2011416878108E-5   0.2007404454109E-5   0.20033997590992E-5   0.19994027787486E-5   0.19954134987527E-5
+ 0.19914319048333E-5   0.1987457982741E-5   0.19834917182414E-5   0.19795330971228E-5   0.19755821051961E-5
+ 0.19716387283156E-5   0.19677029523557E-5   0.19637747632131E-5   0.1959854146806E-5   0.19559410890765E-5
+ 0.19520355759995E-5   0.19481375935758E-5   0.1944247127829E-5   0.19403641647913E-5   0.1936488690519E-5
+ 0.19326206911101E-5   0.19287601526906E-5   0.19249070614104E-5   0.19210614034309E-5    0.191722316494E-5
+ 0.19133923321547E-5   0.19095688913209E-5   0.19057528287126E-5   0.19019441306098E-5   0.18981427833188E-5
+ 0.18943487731723E-5   0.18905620865371E-5     0.18867827098E-5   0.1883010629372E-5   0.18792458316881E-5
+ 0.18754883032064E-5   0.18717380304126E-5   0.18679949998189E-5   0.18642591979536E-5   0.18605306113618E-5
+ 0.18568092266093E-5   0.18530950303055E-5   0.18493880090788E-5   0.18456881495806E-5   0.1841995438485E-5
+ 0.1838309862495E-5   0.18346314083249E-5   0.1830960062711E-5   0.18272958124121E-5   0.18236386442252E-5
+ 0.18199885449659E-5   0.18163455014723E-5   0.18127095006049E-5   0.18090805292463E-5   0.18054585743076E-5
+ 0.18018436227246E-5   0.17982356614532E-5   0.1794634677459E-5   0.17910406577301E-5   0.17874535892937E-5
+ 0.17838734592004E-5   0.17803002545226E-5   0.17767339623508E-5   0.17731745697984E-5   0.17696220640051E-5
+ 0.1766076432135E-5   0.17625376613815E-5   0.17590057389387E-5   0.17554806520266E-5   0.17519623878919E-5
+ 0.17484509338171E-5   0.17449462771045E-5   0.17414484050721E-5    0.173795730506E-5   0.17344729644308E-5
+ 0.17309953705761E-5   0.17275245109115E-5   0.17240603728665E-5   0.17206029438873E-5   0.17171522114397E-5
+ 0.17137081630303E-5   0.17102707861837E-5   0.17068400684449E-5   0.17034159973778E-5   0.16999985605675E-5
+ 0.16965877456276E-5   0.16931835401955E-5   0.16897859319322E-5   0.16863949084998E-5   0.16830104575842E-5
+ 0.1679632566906E-5   0.16762612242142E-5   0.16728964172767E-5   0.16695381338795E-5   0.16661863618342E-5
+ 0.16628410889705E-5    0.165950230313E-5   0.16561699921748E-5   0.16528441440032E-5   0.16495247465342E-5
+ 0.16462117877076E-5   0.16429052554797E-5   0.16396051378282E-5   0.16363114227568E-5   0.16330240982921E-5
+ 0.16297431524893E-5   0.16264685734001E-5   0.16232003491023E-5   0.16199384677002E-5   0.16166829173314E-5
+ 0.16134336861522E-5   0.16101907623325E-5   0.16069541340633E-5   0.16037237895568E-5   0.16004997170527E-5
+ 0.15972819048144E-5   0.15940703411147E-5   0.15908650142426E-5   0.15876659125042E-5   0.15844730242495E-5
+ 0.15812863378432E-5   0.15781058416686E-5   0.15749315241268E-5   0.15717633736406E-5   0.15686013786544E-5
+ 0.15654455276342E-5   0.15622958090666E-5   0.15591522114509E-5   0.15560147233067E-5   0.15528833331816E-5
+ 0.15497580296467E-5   0.15466388012931E-5   0.15435256367267E-5   0.15404185245743E-5   0.15373174534852E-5
+ 0.15342224121319E-5   0.15311333892116E-5   0.15280503734257E-5   0.15249733534962E-5   0.15219023181664E-5
+ 0.15188372562149E-5   0.1515778156436E-5   0.15127250076414E-5   0.15096777986629E-5   0.15066365183567E-5
+ 0.15036011555844E-5   0.15005716992294E-5   0.14975481382002E-5   0.14945304614322E-5   0.1491518657879E-5
+ 0.1488512716509E-5   0.14855126263107E-5   0.14825183762924E-5   0.14795299554878E-5   0.1476547352953E-5
+ 0.14735705577521E-5   0.14705995589661E-5   0.14676343456938E-5   0.14646749070695E-5   0.14617212322428E-5
+ 0.14587733103809E-5   0.14558311306685E-5   0.14528946823091E-5   0.14499639545304E-5   0.14470389365799E-5
+ 0.14441196177238E-5   0.14412059872365E-5   0.14382980344122E-5   0.14353957485734E-5   0.14324991190633E-5
+ 0.14296081352427E-5   0.14267227864907E-5   0.1423843062206E-5   0.14209689518062E-5   0.14181004447277E-5
+ 0.14152375304296E-5   0.14123801983797E-5   0.1409528438065E-5   0.14066822389933E-5   0.14038415906996E-5
+ 0.14010064827353E-5   0.13981769046686E-5   0.13953528460861E-5   0.13925342965928E-5   0.13897212458156E-5
+ 0.13869136834016E-5   0.13841115990115E-5   0.13813149823194E-5   0.1378523823017E-5   0.13757381108255E-5
+ 0.13729578354816E-5   0.13701829867404E-5   0.13674135543786E-5   0.13646495281957E-5   0.13618908979953E-5
+ 0.13591376535969E-5   0.13563897848367E-5   0.13536472815899E-5   0.13509101337449E-5   0.13481783312039E-5
+ 0.13454518638833E-5   0.13427307217181E-5   0.13400148946668E-5   0.13373043727061E-5   0.13345991458295E-5
+ 0.13318992040408E-5   0.13292045373615E-5   0.13265151358397E-5   0.13238309895423E-5   0.13211520885534E-5
+ 0.13184784229713E-5   0.13158099829122E-5   0.13131467585129E-5    0.131048873993E-5   0.1307835917342E-5
+ 0.13051882809296E-5   0.13025458208939E-5   0.12999085274556E-5   0.12972763908607E-5   0.12946494013698E-5
+ 0.12920275492611E-5   0.12894108248301E-5   0.12867992183903E-5   0.12841927202718E-5   0.12815913208241E-5
+ 0.12789950104106E-5   0.12764037794093E-5   0.12738176182141E-5   0.12712365172457E-5   0.12686604669397E-5
+ 0.12660894577486E-5   0.12635234801417E-5   0.12609625246053E-5   0.12584065816438E-5   0.12558556417798E-5
+ 0.1253309695554E-5   0.1250768733514E-5   0.12482327462251E-5   0.12457017242764E-5   0.12431756582784E-5
+ 0.12406545388561E-5   0.12381383566512E-5   0.12356271023247E-5   0.12331207665517E-5   0.12306193400144E-5
+ 0.12281228134106E-5   0.12256311774697E-5   0.12231444229378E-5   0.12206625405772E-5   0.12181855211598E-5
+ 0.12157133554758E-5   0.12132460343345E-5   0.12107835485631E-5   0.12083258890093E-5   0.12058730465229E-5
+ 0.12034250119721E-5   0.12009817762455E-5   0.11985433302569E-5   0.11961096649349E-5   0.11936807712189E-5
+ 0.11912566400644E-5   0.11888372624438E-5   0.11864226293501E-5   0.11840127317933E-5   0.11816075607944E-5
+ 0.11792071073885E-5   0.11768113626246E-5   0.11744203175793E-5   0.11720339633425E-5   0.11696522910189E-5
+ 0.11672752917269E-5   0.11649029566004E-5   0.1162535276794E-5   0.11601722434789E-5   0.11578138478425E-5
+ 0.11554600810793E-5   0.11531109344006E-5   0.11507663990394E-5   0.1148426466247E-5   0.11460911272898E-5
+ 0.1143760373447E-5   0.11414341960139E-5   0.11391125863028E-5   0.11367955356441E-5   0.11344830353874E-5
+ 0.11321750768854E-5   0.11298716515066E-5   0.11275727506357E-5   0.11252783656861E-5   0.11229884880829E-5
+ 0.11207031092648E-5   0.11184222206858E-5   0.11161458138195E-5   0.11138738801428E-5   0.11116064111502E-5
+ 0.1109343398355E-5   0.11070848332917E-5   0.11048307075079E-5   0.11025810125657E-5   0.11003357400425E-5
+ 0.10980948815316E-5   0.1095858428641E-5   0.10936263729968E-5   0.10913987062344E-5   0.10891754200028E-5
+ 0.10869565059645E-5   0.1084741955808E-5   0.10825317612336E-5   0.1080325913956E-5   0.10781244057043E-5
+ 0.10759272282214E-5   0.10737343732696E-5   0.10715458326273E-5   0.10693615980873E-5   0.1067181661445E-5
+ 0.10650060145112E-5   0.1062834649122E-5   0.10606675571312E-5   0.10585047304065E-5   0.10563461608243E-5
+ 0.10541918402771E-5   0.10520417606737E-5   0.10498959139401E-5   0.10477542920194E-5   0.10456168868591E-5
+ 0.10434836904221E-5   0.10413546946872E-5   0.10392298916553E-5   0.10371092733397E-5   0.10349928317666E-5
+ 0.10328805589761E-5   0.1030772447023E-5   0.10286684879785E-5   0.10265686739299E-5   0.10244729969749E-5
+ 0.1022381449221E-5   0.10202940227884E-5   0.1018210709824E-5   0.10161315024869E-5   0.10140563929498E-5
+ 0.10119853733984E-5   0.10099184360365E-5   0.1007855573074E-5   0.1005796776733E-5   0.10037420392489E-5
+ 0.10016913528837E-5   0.99964470991014E-6   0.99760210261345E-6   0.99556352329182E-6   0.9935289642574E-6
+ 0.99149841783872E-6   0.9894718763792E-6   0.98744933223509E-6   0.98543077776963E-6   0.98341620535974E-6
+ 0.98140560740418E-6   0.97939897631665E-6   0.97739630452412E-6   0.97539758446372E-6   0.97340280858701E-6
+ 0.97141196936086E-6   0.96942505926727E-6   0.96744207080483E-6   0.96546299647562E-6   0.96348782879657E-6
+    0.9615165603E-6   0.95954918353868E-6   0.95758569107732E-6   0.95562607549164E-6   0.95367032937069E-6
+ 0.95171844531692E-6   0.9497704159495E-6   0.94782623390222E-6   0.9458858918179E-6   0.94394938234948E-6
+ 0.94201669816173E-6   0.9400878319433E-6   0.93816277639399E-6   0.93624152422622E-6   0.93432406816363E-6
+ 0.93241040094323E-6   0.93050051531773E-6   0.92859440405381E-6   0.92669205993251E-6   0.92479347573937E-6
+ 0.92289864427407E-6   0.92100755835418E-6   0.91912021081354E-6   0.91723659449733E-6   0.91535670226398E-6
+ 0.91348052698648E-6   0.91160806154919E-6   0.9097392988435E-6   0.90787423177352E-6   0.90601285326406E-6
+ 0.90415515625307E-6   0.90230113369086E-6   0.90045077853819E-6   0.8986040837691E-6   0.89676104237179E-6
+ 0.89492164734817E-6   0.89308589171578E-6   0.89125376849526E-6   0.88942527072154E-6   0.88760039144438E-6
+ 0.88577912373193E-6   0.88396146066365E-6   0.8821473953292E-6   0.88033692083088E-6   0.87853003028372E-6
+ 0.87672671681779E-6   0.87492697357702E-6   0.87313079371343E-6   0.87133817038932E-6   0.86954909677785E-6
+ 0.86776356607451E-6   0.86598157148475E-6   0.86420310622582E-6   0.86242816352577E-6   0.86065673662496E-6
+ 0.8588888187787E-6   0.85712440325535E-6   0.85536348333603E-6   0.85360605230661E-6   0.85185210346593E-6
+ 0.85010163013019E-6   0.8483546256302E-6   0.84661108330873E-6   0.84487099651716E-6   0.84313435861974E-6
+ 0.84140116299384E-6   0.83967140303091E-6   0.83794507213669E-6   0.83622216372116E-6   0.83450267120635E-6
+ 0.83278658802681E-6   0.83107390763662E-6   0.82936462349921E-6   0.82765872909005E-6   0.82595621789675E-6
+ 0.82425708342192E-6   0.82256131917062E-6   0.82086891866155E-6   0.81917987542777E-6   0.81749418301879E-6
+ 0.81581183499482E-6   0.81413282492565E-6   0.8124571463929E-6   0.81078479299024E-6   0.8091157583255E-6
+ 0.80745003601982E-6   0.80578761970065E-6   0.80412850300526E-6   0.80247267958119E-6   0.8008201430977E-6
+ 0.79917088723306E-6   0.7975249056762E-6   0.79588219212604E-6   0.79424274029283E-6   0.79260654390157E-6
+ 0.79097359668938E-6   0.78934389240469E-6   0.78771742480037E-6   0.78609418764121E-6   0.78447417470913E-6
+ 0.78285737979912E-6   0.78124379671723E-6   0.77963341927786E-6   0.77802624130733E-6   0.77642225664442E-6
+ 0.7748214591407E-6   0.77322384266131E-6   0.77162940107477E-6   0.77003812826136E-6   0.76845001811344E-6
+ 0.76686506454098E-6   0.76528326146337E-6   0.76370460280987E-6   0.76212908252057E-6   0.76055669454653E-6
+ 0.75898743285235E-6   0.75742129141463E-6   0.75585826421825E-6   0.75429834525568E-6   0.75274152852946E-6
+ 0.75118780806124E-6   0.74963717788234E-6   0.74808963203467E-6   0.74654516457082E-6   0.74500376955664E-6
+ 0.74346544106392E-6   0.74193017317424E-6   0.74039795997927E-6   0.73886879558969E-6   0.73734267412496E-6
+ 0.7358195897143E-6   0.73429953649649E-6   0.73278250862079E-6   0.73126850025043E-6   0.7297575055599E-6
+ 0.72824951873366E-6   0.72674453396115E-6   0.72524254544264E-6   0.72374354739483E-6   0.72224753404606E-6
+ 0.72075449963495E-6   0.71926443840811E-6   0.7177773446232E-6   0.71629321254966E-6   0.71481203646856E-6
+ 0.71333381067371E-6   0.71185852946194E-6   0.71038618714134E-6   0.70891677803178E-6   0.70745029646908E-6
+ 0.70598673679833E-6   0.70452609337289E-6   0.7030683605563E-6   0.70161353272238E-6   0.70016160425825E-6
+ 0.69871256956215E-6   0.69726642303945E-6   0.69582315910308E-6   0.69438277217538E-6   0.69294525669649E-6
+ 0.69151060711534E-6   0.69007881789068E-6   0.68864988349027E-6   0.68722379839214E-6   0.68580055708606E-6
+ 0.68438015407256E-6   0.68296258386333E-6   0.68154784097377E-6   0.68013591993019E-6   0.67872681527236E-6
+ 0.67732052155275E-6   0.67591703333269E-6   0.67451634518329E-6   0.67311845168685E-6   0.67172334743474E-6
+ 0.67033102702416E-6   0.66894148506217E-6   0.66755471617104E-6   0.66617071498334E-6   0.66478947614126E-6
+ 0.66341099429491E-6   0.66203526410455E-6   0.66066228024162E-6   0.65929203738834E-6   0.65792453023899E-6
+ 0.65655975348995E-6   0.65519770184865E-6   0.65383837003382E-6   0.65248175277837E-6   0.65112784482394E-6
+ 0.64977664092009E-6   0.64842813582596E-6   0.64708232431041E-6   0.64573920115463E-6   0.64439876115044E-6
+ 0.6430609990955E-6   0.64172590979488E-6   0.6403934880621E-6   0.63906372872838E-6   0.63773662663253E-6
+ 0.63641217662245E-6   0.63509037355439E-6   0.63377121229417E-6   0.6324546877188E-6   0.63114079471533E-6
+ 0.62982952818079E-6   0.62852088301593E-6   0.62721485413152E-6   0.62591143645144E-6   0.62461062491091E-6
+ 0.62331241445422E-6   0.62201680003272E-6   0.62072377660764E-6   0.61943333915011E-6   0.61814548264195E-6
+ 0.61686020207597E-6   0.61557749244852E-6   0.61429734876506E-6   0.61301976604054E-6   0.61174473930529E-6
+ 0.61047226359677E-6   0.6092023339616E-6   0.60793494545565E-6   0.60667009314651E-6   0.60540777210349E-6
+ 0.60414797740641E-6   0.60289070414608E-6   0.6016359474263E-6   0.60038370235914E-6   0.59913396406367E-6
+ 0.59788672766803E-6   0.59664198830961E-6   0.59539974113701E-6   0.59415998130888E-6   0.59292270398891E-6
+ 0.59168790434829E-6   0.59045557756597E-6   0.58922571883771E-6   0.58799832336619E-6   0.58677338636231E-6
+ 0.58555090304447E-6   0.58433086863981E-6   0.58311327838688E-6   0.58189812753349E-6   0.58068541133632E-6
+ 0.57947512505552E-6   0.57826726396045E-6   0.57706182333335E-6   0.57585879846662E-6   0.57465818466121E-6
+ 0.5734599772244E-6   0.57226417147274E-6   0.57107076273221E-6   0.56987974633863E-6   0.56869111763808E-6
+ 0.56750487197984E-6   0.56632100472209E-6   0.56513951123218E-6   0.56396038689071E-6   0.56278362708558E-6
+ 0.56160922721246E-6   0.56043718267541E-6   0.5592674888869E-6   0.55810014126955E-6   0.55693513525512E-6
+ 0.55577246628211E-6   0.55461212979495E-6   0.55345412124601E-6   0.55229843610152E-6   0.55114506983534E-6
+ 0.54999401792947E-6   0.54884527587458E-6   0.5476988391713E-6   0.54655470332497E-6   0.54541286384839E-6
+ 0.5442733162622E-6   0.54313605610098E-6   0.54200107890613E-6   0.54086838022693E-6   0.53973795562041E-6
+ 0.53860980065166E-6   0.5374839108958E-6   0.53636028193669E-6   0.53523890936604E-6   0.53411978877943E-6
+ 0.53300291578069E-6   0.53188828598628E-6   0.5307758950218E-6   0.52966573852083E-6   0.52855781212248E-6
+ 0.52745211147448E-6   0.52634863223373E-6   0.52524737006641E-6   0.52414832064843E-6   0.52305147965776E-6
+ 0.52195684278105E-6   0.52086440571384E-6   0.51977416416397E-6   0.51868611384612E-6   0.51760025048201E-6
+ 0.51651656980124E-6   0.51543506754138E-6   0.51435573944923E-6   0.5132785812803E-6   0.51220358879596E-6
+ 0.51113075776352E-6   0.5100600839574E-6   0.50899156316559E-6   0.50792519118295E-6   0.50686096381189E-6
+ 0.50579887686162E-6   0.50473892614937E-6   0.50368110750109E-6   0.50262541675092E-6   0.50157184974165E-6
+ 0.50052040231933E-6   0.49947107033835E-6   0.49842384966313E-6   0.4973787361678E-6   0.49633572573331E-6
+ 0.49529481424824E-6   0.49425599760968E-6   0.49321927172179E-6   0.4921846324931E-6   0.49115207583974E-6
+ 0.49012159768943E-6   0.48909319397791E-6   0.48806686064829E-6   0.4870425936497E-6   0.48602038893907E-6
+ 0.48500024248187E-6   0.48398215025181E-6   0.4829661082318E-6   0.48195211240663E-6   0.48094015876939E-6
+ 0.47993024332176E-6   0.47892236207646E-6   0.47791651105288E-6   0.47691268627643E-6   0.47591088377988E-6
+ 0.47491109960344E-6   0.4739133297966E-6   0.47291757041683E-6   0.47192381752662E-6   0.47093206719421E-6
+ 0.46994231549446E-6   0.46895455851508E-6   0.46796879234989E-6   0.46698501309972E-6   0.46600321687161E-6
+ 0.46502339977987E-6   0.46404555794771E-6   0.46306968750604E-6   0.4620957845935E-6   0.4611238453514E-6
+ 0.46015386592891E-6   0.45918584248494E-6   0.45821977118712E-6   0.45725564820994E-6   0.4562934697337E-6
+ 0.45533323194613E-6   0.45437493104252E-6   0.45341856322613E-6   0.45246412470854E-6   0.45151161170463E-6
+ 0.45056102043623E-6   0.44961234713234E-6   0.44866558803332E-6   0.44772073938509E-6   0.44677779744073E-6
+ 0.44583675846044E-6   0.44489761871334E-6   0.44396037447007E-6   0.44302502200926E-6   0.4420915576178E-6
+ 0.44115997759254E-6   0.44023027823663E-6   0.43930245585873E-6   0.43837650677449E-6   0.43745242730657E-6
+ 0.43653021378606E-6   0.43560986255171E-6   0.43469136994642E-6   0.43377473231879E-6   0.43285994602327E-6
+ 0.43194700742718E-6   0.43103591290313E-6   0.43012665883007E-6   0.42921924159265E-6   0.4283136575823E-6
+ 0.42740990319898E-6   0.42650797484975E-6   0.42560786894854E-6   0.42470958191223E-6   0.42381311016482E-6
+ 0.42291845013967E-6   0.42202559827794E-6   0.42113455102723E-6   0.42024530484051E-6   0.41935785617771E-6
+ 0.41847220150586E-6   0.41758833729949E-6   0.41670626004104E-6   0.41582596621529E-6   0.41494745231373E-6
+ 0.41407071483477E-6   0.41319575028769E-6   0.41232255518734E-6   0.41145112605398E-6   0.41058145941408E-6
+ 0.40971355180049E-6   0.40884739975446E-6   0.40798299982402E-6   0.40712034856243E-6   0.40625944252733E-6
+ 0.4054002782825E-6   0.40454285240222E-6   0.40368716146668E-6   0.4028332020623E-6   0.40198097078222E-6
+ 0.40113046422733E-6   0.40028167900182E-6   0.39943461171537E-6   0.39858925898335E-6   0.39774561743305E-6
+ 0.39690368369675E-6   0.39606345441241E-6   0.39522492622342E-6   0.39438809577932E-6   0.39355295973805E-6
+ 0.39271951476416E-6   0.39188775752825E-6   0.39105768470338E-6   0.39022929296902E-6   0.3894025790144E-6
+ 0.38857753953581E-6   0.38775417123571E-6   0.3869324708206E-6   0.38611243500359E-6   0.38529406050482E-6
+ 0.3844773440517E-6   0.38366228237906E-6   0.38284887222317E-6   0.38203711032685E-6   0.38122699343969E-6
+ 0.38041851832104E-6   0.37961168173542E-6   0.37880648045254E-6   0.37800291124804E-6   0.37720097090372E-6
+ 0.37640065620841E-6   0.37560196395745E-6   0.37480489095101E-6   0.37400943399393E-6   0.37321558989666E-6
+ 0.37242335547925E-6   0.37163272756723E-6   0.37084370299192E-6   0.37005627858991E-6   0.36927045120379E-6
+ 0.36848621768302E-6   0.36770357488338E-6   0.36692251966727E-6   0.36614304889945E-6   0.36536515945109E-6
+ 0.36458884820096E-6   0.36381411203526E-6   0.3630409478455E-6   0.36226935252876E-6   0.36149932298858E-6
+ 0.36073085613408E-6   0.35996394887806E-6   0.35919859813917E-6   0.35843480084438E-6   0.35767255392678E-6
+ 0.35691185432514E-6   0.35615269898305E-6   0.35539508484999E-6   0.35463900888191E-6   0.35388446804109E-6
+ 0.35313145929677E-6   0.35237997961986E-6   0.35163002598753E-6   0.35088159538342E-6   0.35013468479954E-6
+ 0.34938929123304E-6   0.3486454116857E-6   0.34790304316489E-6   0.34716218268362E-6   0.34642282726199E-6
+ 0.34568497392613E-6   0.34494861970618E-6   0.34421376163674E-6   0.3434803967575E-6   0.34274852211759E-6
+ 0.34201813477094E-6   0.34128923177686E-6   0.34056181019954E-6   0.33983586710873E-6   0.33911139958077E-6
+ 0.33838840469783E-6   0.33766687954809E-6   0.33694682122187E-6   0.33622822681543E-6   0.33551109343243E-6
+ 0.33479541818326E-6   0.33408119818366E-6   0.33336843055344E-6   0.33265711241815E-6   0.33194724090912E-6
+ 0.33123881316411E-6   0.3305318263272E-6   0.32982627754469E-6   0.32912216396809E-6   0.32841948275428E-6
+ 0.32771823106933E-6   0.32701840608346E-6   0.32632000497218E-6   0.32562302491634E-6   0.32492746310342E-6
+ 0.32423331672278E-6   0.32354058296976E-6   0.32284925904575E-6   0.32215934215923E-6   0.32147082952352E-6
+ 0.32078371835674E-6   0.32009800588229E-6   0.31941368932885E-6   0.31873076593144E-6   0.31804923293095E-6
+ 0.31736908757153E-6   0.3166903271016E-6   0.31601294877416E-6   0.31533694985163E-6   0.31466232760059E-6
+ 0.31398907929252E-6   0.31331720220348E-6   0.31264669361465E-6   0.3119775508135E-6   0.31130977109293E-6
+ 0.31064335175113E-6   0.30997829008866E-6   0.30931458341149E-6   0.30865222903262E-6   0.30799122427099E-6
+ 0.30733156645058E-6   0.30667325289922E-6   0.30601628095006E-6   0.30536064794173E-6   0.30470635121879E-6
+ 0.30405338813167E-6   0.30340175603279E-6   0.3027514522796E-6   0.30210247423482E-6   0.30145481926906E-6
+ 0.30080848475722E-6   0.30016346807861E-6   0.29951976661736E-6   0.2988773777624E-6   0.29823629890897E-6
+ 0.29759652745754E-6   0.29695806081258E-6   0.29632089638172E-6   0.29568503157724E-6   0.2950504638197E-6
+ 0.29441719053426E-6   0.2937852091508E-6   0.29315451710374E-6   0.2925251118333E-6   0.29189699078295E-6
+ 0.29127015140046E-6   0.29064459113801E-6    0.290020307456E-6   0.28939729781881E-6   0.28877555969539E-6
+ 0.28815509055901E-6   0.28753588788778E-6   0.28691794916548E-6   0.28630127188096E-6   0.28568585352777E-6
+ 0.2850716916022E-6   0.28445878360542E-6   0.2838471270452E-6   0.28323671943457E-6   0.28262755829126E-6
+ 0.28201964113671E-6   0.28141296549723E-6   0.28080752890437E-6   0.28020332889507E-6   0.27960036301186E-6
+ 0.27899862879883E-6    0.278398123805E-6   0.27779884558442E-6   0.27720079169827E-6   0.27660395971181E-6
+ 0.27600834719427E-6   0.27541395171936E-6   0.27482077086526E-6   0.27422880221625E-6   0.27363804336153E-6
+ 0.27304849189362E-6   0.27246014540813E-6   0.27187300150488E-6   0.27128705779177E-6   0.27070231188079E-6
+ 0.27011876138829E-6   0.26953640393431E-6   0.26895523714357E-6   0.26837525864607E-6   0.26779646607665E-6
+ 0.26721885707531E-6   0.26664242928351E-6   0.26606718034767E-6   0.26549310792001E-6   0.26492020965862E-6
+ 0.26434848322552E-6   0.26377792628701E-6   0.26320853651431E-6   0.26264031158293E-6   0.26207324917083E-6
+ 0.26150734696039E-6   0.26094260264063E-6   0.26037901390535E-6   0.2598165784526E-6   0.25925529398402E-6
+ 0.2586951582058E-6   0.25813616882892E-6   0.25757832356903E-6   0.25702162014691E-6   0.25646605628534E-6
+ 0.25591162971177E-6   0.25535833815838E-6   0.25480617936326E-6   0.25425515106831E-6   0.25370525101968E-6
+ 0.25315647696784E-6   0.25260882666763E-6   0.25206229787843E-6   0.25151688836441E-6   0.25097259589304E-6
+ 0.25042941823525E-6   0.24988735316581E-6   0.24934639846659E-6   0.24880655192319E-6   0.24826781132527E-6
+ 0.24773017446607E-6   0.24719363914303E-6   0.2466582031588E-6   0.24612386432049E-6   0.2455906204398E-6
+ 0.24505846932993E-6   0.24452740880872E-6   0.24399743669942E-6   0.24346855083041E-6   0.24294074903399E-6
+  0.242414029146E-6   0.24188838900653E-6   0.24136382646002E-6   0.24084033935553E-6   0.24031792554684E-6
+ 0.23979658288999E-6   0.23927630924497E-6   0.23875710247583E-6   0.2382389604531E-6   0.23772188105056E-6
+ 0.23720586214618E-6   0.23669090162205E-6   0.23617699736534E-6   0.23566414726441E-6   0.23515234921207E-6
+ 0.23464160110585E-6   0.23413190084919E-6   0.23362324634927E-6   0.23311563551618E-6   0.23260906626395E-6
+ 0.23210353651067E-6   0.23159904417979E-6   0.23109558719904E-6   0.23059316349859E-6   0.23009177101166E-6
+ 0.22959140767487E-6   0.22909207143248E-6   0.22859376023188E-6   0.22809647202411E-6   0.22760020476329E-6
+ 0.22710495640757E-6   0.22661072491997E-6   0.22611750826763E-6   0.22562530442175E-6   0.22513411135532E-6
+ 0.22464392704548E-6   0.22415474947459E-6   0.22366657662961E-6   0.22317940650123E-6   0.2226932370833E-6
+ 0.22220806637375E-6   0.22172389237449E-6   0.22124071309157E-6   0.22075852653538E-6   0.2202773307186E-6
+ 0.21979712365771E-6   0.21931790337306E-6   0.21883966789061E-6   0.21836241523969E-6   0.21788614345305E-6
+ 0.21741085056711E-6   0.21693653462179E-6   0.21646319366217E-6   0.21599082573715E-6   0.21551942889874E-6
+ 0.21504900120119E-6   0.21457954070242E-6   0.21411104546632E-6   0.2136435135603E-6   0.21317694305535E-6
+ 0.21271133202631E-6   0.21224667855233E-6   0.21178298071495E-6   0.21132023659896E-6   0.21085844429258E-6
+ 0.21039760188988E-6   0.20993770748795E-6   0.20947875918757E-6   0.20902075509313E-6   0.20856369331273E-6
+ 0.20810757195825E-6   0.2076523891454E-6   0.20719814299354E-6   0.20674483162449E-6   0.20629245316373E-6
+ 0.2058410057414E-6   0.20539048749163E-6   0.20494089655196E-6   0.20449223106335E-6   0.20404448917035E-6
+ 0.20359766902132E-6   0.2031517687685E-6   0.20270678656837E-6   0.20226272057886E-6   0.20181956896149E-6
+ 0.20137732988159E-6   0.20093600151011E-6   0.2004955820211E-6   0.20005606959141E-6   0.19961746240122E-6
+ 0.19917975863406E-6   0.19874295647839E-6   0.19830705412626E-6   0.19787204977233E-6   0.19743794161359E-6
+ 0.19700472785044E-6   0.19657240668878E-6   0.19614097633772E-6   0.19571043500974E-6   0.19528078092058E-6
+ 0.19485201228948E-6   0.19442412733933E-6   0.19399712429661E-6   0.19357100139172E-6   0.19314575685652E-6
+ 0.19272138892652E-6   0.19229789584156E-6   0.19187527584599E-6   0.19145352718724E-6   0.19103264811563E-6
+ 0.1906126368852E-6   0.19019349175333E-6   0.18977521097965E-6   0.18935779282713E-6   0.18894123556341E-6
+ 0.18852553745972E-6   0.18811069679058E-6   0.18769671183334E-6   0.18728358086882E-6   0.18687130218138E-6
+ 0.18645987405891E-6   0.18604929479314E-6   0.1856395626775E-6   0.18523067600884E-6   0.18482263308763E-6
+ 0.18441543221889E-6   0.18400907171071E-6   0.1836035498739E-6   0.18319886502248E-6   0.18279501547361E-6
+ 0.1823919995489E-6   0.18198981557335E-6   0.18158846187426E-6   0.18118793678126E-6   0.18078823862711E-6
+ 0.18038936574971E-6   0.17999131648978E-6   0.17959408919123E-6   0.17919768220117E-6   0.17880209386993E-6
+ 0.17840732255115E-6   0.1780133666018E-6   0.17762022438238E-6   0.17722789425491E-6   0.17683637458477E-6
+ 0.17644566374143E-6   0.17605576009826E-6   0.17566666203165E-6   0.17527836792053E-6   0.17489087614703E-6
+ 0.17450418509662E-6   0.17411829315844E-6   0.17373319872523E-6   0.17334890019121E-6   0.17296539595357E-6
+ 0.17258268441254E-6   0.17220076397341E-6   0.17181963304391E-6   0.17143929003494E-6   0.17105973336058E-6
+ 0.17068096143873E-6   0.17030297268818E-6   0.16992576553108E-6   0.16954933839311E-6   0.1691736897044E-6
+ 0.16879881789783E-6   0.16842472140875E-6   0.16805139867552E-6   0.16767884813958E-6   0.16730706824598E-6
+ 0.16693605744302E-6   0.16656581418121E-6   0.1661963369136E-6   0.16582762409594E-6   0.16545967418885E-6
+ 0.16509248565548E-6   0.16472605696191E-6   0.16436038657702E-6   0.16399547297266E-6    0.163631314624E-6
+ 0.16326791000935E-6   0.16290525761015E-6   0.16254335590929E-6   0.16218220339278E-6   0.16182179855053E-6
+ 0.16146213987598E-6   0.16110322586548E-6   0.16074505501745E-6   0.16038762583333E-6   0.16003093681778E-6
+  0.159674986479E-6   0.15931977332855E-6   0.15896529587913E-6   0.15861155264628E-6   0.1582585421485E-6
+ 0.15790626290888E-6   0.15755471345297E-6   0.15720389230884E-6   0.15685379800725E-6   0.15650442908161E-6
+ 0.15615578406936E-6   0.15580786151081E-6   0.15546065994863E-6   0.15511417792702E-6   0.15476841399292E-6
+ 0.15442336669805E-6   0.15407903459686E-6   0.1537354162465E-6   0.15339251020663E-6   0.1530503150402E-6
+ 0.15270882931226E-6   0.15236805159039E-6   0.15202798044477E-6   0.15168861444971E-6   0.15134995218192E-6
+ 0.15101199222088E-6   0.15067473314885E-6   0.15033817355085E-6   0.15000231201483E-6   0.14966714713164E-6
+ 0.14933267749494E-6      0.1489989017E-6   0.14866581834479E-6   0.14833342603116E-6   0.14800172336408E-6
+ 0.14767070895131E-6   0.1473403814023E-6   0.14701073932935E-6   0.14668178134786E-6   0.14635350607651E-6
+ 0.14602591213714E-6   0.14569899815242E-6   0.14537276274778E-6   0.14504720455148E-6   0.1447223221961E-6
+ 0.14439811431649E-6   0.14407457954974E-6   0.14375171653547E-6   0.1434295239158E-6   0.14310800033651E-6
+ 0.14278714444609E-6   0.14246695489506E-6   0.14214743033566E-6   0.14182856942267E-6   0.14151037081509E-6
+ 0.14119283317438E-6   0.14087595516451E-6   0.14055973545189E-6   0.14024417270556E-6   0.13992926559739E-6
+ 0.13961501280197E-6   0.13930141299686E-6   0.13898846486072E-6   0.13867616707508E-6   0.13836451832451E-6
+ 0.13805351729678E-6   0.13774316268186E-6   0.13743345317262E-6   0.13712438746462E-6   0.13681596425595E-6
+ 0.13650818224605E-6   0.13620104013693E-6   0.13589453663427E-6   0.1355886704466E-6   0.13528344028494E-6
+ 0.13497884486204E-6   0.13467488289334E-6   0.13437155309707E-6   0.13406885419424E-6   0.13376678490864E-6
+ 0.13346534396553E-6   0.13316453009279E-6   0.1328643420209E-6   0.13256477848358E-6   0.13226583821681E-6
+ 0.13196751995896E-6   0.13166982245086E-6   0.13137274443571E-6   0.13107628465974E-6   0.13078044187175E-6
+ 0.13048521482248E-6   0.13019060226453E-6   0.12989660295272E-6   0.12960321564589E-6   0.12931043910511E-6
+ 0.12901827209375E-6   0.12872671337701E-6   0.12843576172244E-6   0.12814541590091E-6   0.12785567468595E-6
+ 0.12756653685381E-6   0.12727800118097E-6   0.12699006644661E-6   0.12670273143323E-6   0.12641599492658E-6
+ 0.12612985571465E-6   0.12584431258701E-6   0.12555936433569E-6   0.12527500975527E-6   0.12499124764326E-6
+ 0.1247080767999E-6   0.12442549602638E-6   0.12414350412606E-6   0.12386209990456E-6   0.12358128217163E-6
+ 0.12330104973874E-6   0.12302140141974E-6   0.12274233603082E-6   0.12246385239098E-6   0.12218594932018E-6
+ 0.12190862564088E-6   0.1216318801781E-6   0.12135571176004E-6   0.12108011921699E-6   0.12080510138127E-6
+ 0.12053065708746E-6   0.12025678517237E-6   0.11998348447574E-6   0.11971075383976E-6   0.11943859210815E-6
+ 0.1191669981264E-6   0.11889597074201E-6   0.11862550880645E-6   0.11835561117306E-6   0.11808627669737E-6
+ 0.11781750423694E-6   0.11754929265162E-6   0.11728164080369E-6   0.11701454755774E-6   0.11674801178071E-6
+ 0.11648203234102E-6   0.11621660810943E-6   0.11595173795933E-6   0.1156874207666E-6   0.11542365540923E-6
+ 0.11516044076738E-6   0.11489777572337E-6   0.11463565916182E-6   0.11437408996988E-6   0.11411306703719E-6
+ 0.1138525892545E-6   0.11359265551466E-6   0.11333326471275E-6   0.11307441574712E-6   0.11281610751802E-6
+ 0.11255833892769E-6   0.11230110888046E-6   0.11204441628262E-6   0.11178826004345E-6   0.11153263907444E-6
+ 0.11127755228887E-6   0.1110229986012E-6   0.11076897692801E-6   0.11051548618927E-6   0.11026252530704E-6
+ 0.1100100932054E-6   0.10975818881052E-6   0.10950681105101E-6   0.10925595885695E-6   0.10900563116019E-6
+ 0.10875582689434E-6   0.10850654499696E-6   0.10825778440732E-6   0.10800954406655E-6   0.10776182291743E-6
+ 0.10751461990481E-6   0.10726793397625E-6   0.10702176408145E-6   0.10677610917225E-6   0.10653096820136E-6
+ 0.10628634012363E-6   0.10604222389691E-6   0.1057986184815E-6   0.10555552283979E-6   0.1053129359354E-6
+ 0.10507085673421E-6   0.10482928420429E-6   0.10458821731603E-6   0.10434765504208E-6   0.1041075963562E-6
+ 0.10386804023415E-6   0.10362898565379E-6   0.10339043159608E-6   0.10315237704371E-6   0.10291482098116E-6
+ 0.10267776239483E-6   0.10244120027311E-6   0.10220513360673E-6   0.10196956138854E-6   0.10173448261306E-6
+ 0.10149989627625E-6   0.1012658013759E-6   0.10103219691302E-6   0.10079908189053E-6   0.10056645531325E-6
+ 0.10033431618752E-6   0.10010266352173E-6   0.99871496326507E-7   0.99640813614546E-7   0.99410614400777E-7
+ 0.99180897700947E-7   0.98951662532931E-7   0.98722907916934E-7   0.98494632875696E-7   0.98266836433621E-7
+ 0.98039517617095E-7   0.97812675454566E-7   0.97586308976399E-7   0.97360417214004E-7   0.97134999200744E-7
+ 0.96910053972677E-7   0.96685580567987E-7   0.96461578026692E-7   0.96238045390396E-7   0.9601498170266E-7
+ 0.95792386009076E-7   0.95570257357299E-7   0.95348594797169E-7   0.95127397379411E-7   0.94906664156685E-7
+ 0.94686394183654E-7   0.94466586517759E-7   0.94247240218073E-7   0.94028354345321E-7   0.93809927962043E-7
+ 0.93591960132604E-7   0.93374449923632E-7   0.93157396403705E-7   0.92940798642864E-7   0.9272465571253E-7
+ 0.92508966685816E-7   0.9229373063883E-7   0.92078946649351E-7   0.91864613796915E-7   0.91650731162641E-7
+ 0.91437297829488E-7   0.91224312882497E-7   0.91011775408616E-7   0.90799684496804E-7   0.90588039236844E-7
+ 0.90376838720462E-7   0.90166082041619E-7   0.89955768296528E-7   0.89745896583095E-7   0.89536466000724E-7
+ 0.89327475650639E-7   0.89118924635911E-7   0.88910812061683E-7   0.88703137035072E-7   0.88495898664247E-7
+ 0.8828909605902E-7   0.88082728330889E-7   0.87876794594206E-7   0.87671293964718E-7   0.87466225559956E-7
+ 0.87261588499227E-7   0.87057381903948E-7   0.86853604896281E-7   0.8665025660024E-7   0.86447336141755E-7
+ 0.86244842649236E-7   0.86042775252633E-7   0.85841133083409E-7   0.85639915274728E-7   0.85439120961455E-7
+ 0.85238749280571E-7   0.85038799370872E-7   0.84839270372438E-7   0.84640161426701E-7   0.84441471676648E-7
+ 0.8424320026807E-7   0.84045346348233E-7   0.83847909066043E-7   0.83650887571928E-7   0.83454281017991E-7
+ 0.83258088558302E-7   0.83062309348705E-7   0.82866942546851E-7   0.82671987311152E-7   0.82477442801796E-7
+ 0.82283308181153E-7   0.82089582613639E-7   0.81896265265242E-7   0.81703355303318E-7   0.81510851896922E-7
+ 0.81318754216844E-7   0.81127061435752E-7   0.80935772728172E-7   0.80744887269542E-7   0.80554404236874E-7
+ 0.80364322808795E-7   0.80174642166532E-7   0.79985361492682E-7   0.79796479971345E-7   0.79607996788167E-7
+ 0.79419911130371E-7   0.79232222187153E-7   0.7904492914938E-7   0.78858031209365E-7   0.78671527560507E-7
+ 0.78485417397764E-7   0.7829969991848E-7   0.78114374321595E-7   0.77929439807554E-7   0.77744895578472E-7
+ 0.77560740838264E-7   0.77376974791968E-7   0.77193596645954E-7   0.77010605607997E-7   0.76828000888533E-7
+ 0.76645781699299E-7   0.76463947253552E-7   0.76282496765991E-7   0.76101429452866E-7   0.75920744532244E-7
+ 0.75740441223817E-7   0.75560518748891E-7   0.75380976329625E-7   0.75201813189776E-7   0.75023028555162E-7
+ 0.74844621653408E-7   0.74666591713636E-7   0.74488937966195E-7   0.74311659643027E-7   0.74134755977708E-7
+ 0.7395822620557E-7   0.73782069563675E-7   0.73606285289852E-7   0.73430872623436E-7   0.73255830805311E-7
+ 0.73081159078728E-7   0.72906856688222E-7   0.72732922879686E-7   0.7255935690046E-7   0.72386157999326E-7
+ 0.72213325426961E-7   0.72040858435579E-7   0.71868756278666E-7   0.71697018210748E-7   0.7152564348775E-7
+ 0.71354631367953E-7   0.71183981111075E-7   0.71013691978257E-7   0.70843763231878E-7   0.70674194135815E-7
+ 0.70504983955624E-7   0.70336131958418E-7   0.70167637413008E-7   0.69999499588791E-7   0.69831717756769E-7
+ 0.69664291189679E-7   0.6949721916219E-7   0.69330500950222E-7   0.6916413583115E-7   0.68998123083884E-7
+ 0.68832461988799E-7   0.6866715182711E-7   0.68502191881489E-7   0.68337581436582E-7   0.68173319778639E-7
+ 0.68009406195293E-7   0.67845839975369E-7   0.67682620409148E-7   0.67519746788449E-7   0.67357218406679E-7
+ 0.6719503455887E-7   0.67033194540714E-7   0.66871697649342E-7   0.66710543183372E-7   0.66549730443547E-7
+ 0.66389258731826E-7    0.662291273514E-7   0.66069335606812E-7   0.65909882803943E-7   0.65750768250479E-7
+ 0.65591991255538E-7   0.65433551129334E-7   0.65275447183076E-7   0.65117678729244E-7   0.64960245082593E-7
+ 0.64803145559138E-7   0.64646379476214E-7   0.64489946152329E-7   0.64333844907361E-7   0.64178075062775E-7
+ 0.64022635941473E-7   0.63867526867877E-7   0.63712747167002E-7   0.63558296165324E-7   0.6340417319099E-7
+ 0.63250377573872E-7   0.63096908645088E-7   0.62943765736904E-7   0.62790948182945E-7   0.62638455318211E-7
+ 0.6248628647924E-7   0.62334441004023E-7   0.62182918231426E-7   0.62031717501545E-7   0.6188083815572E-7
+ 0.61730279537413E-7   0.61580040991134E-7   0.61430121862737E-7   0.6128052149943E-7   0.61131239249975E-7
+ 0.60982274463737E-7   0.60833626491453E-7   0.60685294685278E-7   0.60537278399248E-7   0.60389576988543E-7
+ 0.60242189809491E-7   0.6009511621969E-7   0.59948355577999E-7   0.59801907244899E-7   0.59655770582215E-7
+ 0.59509944952752E-7   0.59364429720315E-7   0.59219224249857E-7   0.59074327908477E-7   0.5892974006439E-7
+ 0.58785460087026E-7   0.58641487346918E-7   0.58497821215849E-7   0.58354461067123E-7   0.58211406275375E-7
+  0.580686562166E-7   0.57926210267366E-7   0.57784067805572E-7   0.57642228210734E-7   0.57500690863915E-7
+ 0.57359455147353E-7   0.57218520444313E-7   0.57077886139325E-7   0.5693755161822E-7   0.56797516268279E-7
+ 0.56657779478149E-7   0.56518340637188E-7   0.56379199135924E-7   0.56240354366077E-7   0.56101805721328E-7
+ 0.55963552596382E-7   0.55825594387072E-7   0.55687930490393E-7   0.55550560304497E-7   0.55413483229071E-7
+ 0.5527669866504E-7   0.55140206014423E-7   0.55004004680027E-7   0.54868094065833E-7   0.54732473577607E-7
+ 0.54597142622323E-7   0.5446210060807E-7   0.54327346944227E-7   0.54192881041503E-7   0.54058702311463E-7
+ 0.53924810166657E-7   0.5379120402069E-7   0.53657883289156E-7   0.53524847388636E-7   0.53392095736848E-7
+ 0.53259627752593E-7   0.53127442855814E-7   0.52995540467853E-7   0.52863920011271E-7   0.52732580909847E-7
+ 0.52601522587961E-7   0.52470744471192E-7   0.52340245986674E-7   0.52210026562921E-7   0.52080085629547E-7
+ 0.5195042261711E-7   0.51821036957342E-7   0.51691928083204E-7   0.51563095428999E-7   0.51434538430312E-7
+ 0.51306256523309E-7   0.51178249145265E-7   0.51050515734602E-7   0.50923055731565E-7   0.50795868577347E-7
+ 0.50668953714155E-7   0.50542310585274E-7   0.50415938635059E-7   0.5028983730931E-7   0.50164006054954E-7
+ 0.50038444319902E-7   0.49913151552871E-7   0.49788127203623E-7   0.49663370723632E-7   0.4953888156546E-7
+ 0.49414659182737E-7   0.49290703030051E-7   0.49167012563088E-7   0.49043587238806E-7   0.48920426515339E-7
+ 0.48797529852085E-7   0.48674896708895E-7   0.48552526546818E-7   0.48430418828183E-7   0.48308573016779E-7
+ 0.48186988577307E-7   0.48065664975614E-7   0.47944601678687E-7   0.47823798154616E-7   0.47703253872089E-7
+ 0.47582968300881E-7   0.47462940912263E-7   0.4734317117873E-7   0.47223658573793E-7   0.47104402571875E-7
+ 0.46985402648485E-7   0.46866658280272E-7   0.46748168945076E-7   0.46629934121932E-7   0.46511953290432E-7
+ 0.46394225931221E-7   0.46276751526046E-7   0.46159529558261E-7   0.46042559512117E-7   0.45925840872807E-7
+ 0.45809373126541E-7   0.45693155760526E-7   0.45577188263299E-7   0.45461470124447E-7   0.45346000834433E-7
+ 0.45230779884495E-7   0.45115806766831E-7   0.45001080975257E-7   0.44886602004548E-7   0.44772369350471E-7
+ 0.44658382509735E-7   0.44544640980051E-7   0.44431144260302E-7   0.44317891850449E-7   0.44204883251589E-7
+ 0.44092117965285E-7   0.4397959549418E-7   0.4386731534216E-7   0.43755277014431E-7   0.43643480017106E-7
+ 0.43531923857188E-7   0.43420608042684E-7   0.43309532082627E-7   0.43198695487214E-7   0.43088097767726E-7
+ 0.42977738436101E-7   0.42867617005186E-7   0.42757732988726E-7   0.42648085902156E-7   0.42538675261668E-7
+ 0.42429500584444E-7   0.4232056138865E-7   0.42211857193603E-7   0.42103387519146E-7   0.41995151886119E-7
+ 0.41887149816414E-7   0.41779380833354E-7   0.41671844461109E-7   0.4156454022471E-7   0.41457467650132E-7
+ 0.41350626264279E-7   0.41244015595311E-7   0.41137635172365E-7   0.41031484525336E-7   0.40925563184876E-7
+ 0.40819870682494E-7   0.4071440655127E-7   0.40609170325122E-7   0.40504161538889E-7   0.40399379728292E-7
+ 0.40294824429981E-7   0.40190495181692E-7   0.40086391522147E-7   0.39982512991086E-7   0.39878859128749E-7
+ 0.39775429476348E-7   0.3967222357629E-7   0.39569240972162E-7   0.39466481208422E-7   0.39363943830288E-7
+ 0.39261628383916E-7   0.39159534416433E-7   0.39057661476095E-7   0.38956009112144E-7   0.38854576874395E-7
+ 0.38753364313525E-7   0.3865237098109E-7   0.38551596430126E-7   0.38451040214418E-7   0.38350701888615E-7
+ 0.38250581008231E-7   0.38150677129631E-7   0.38050989810362E-7   0.37951518608881E-7   0.37852263084475E-7
+ 0.37753222797027E-7   0.37654397307277E-7   0.37555786177322E-7   0.37457388970177E-7   0.37359205249683E-7
+ 0.37261234580624E-7   0.37163476528768E-7   0.37065930660561E-7   0.36968596543183E-7   0.3687147374458E-7
+ 0.36774561834229E-7   0.36677860382333E-7   0.36581368959949E-7   0.36485087138936E-7   0.36389014491997E-7
+ 0.36293150592903E-7   0.36197495016336E-7   0.36102047337891E-7   0.36006807133612E-7   0.35911773980429E-7
+ 0.35816947456446E-7   0.35722327140826E-7   0.3562791261354E-7   0.35533703455266E-7   0.35439699247556E-7
+ 0.35345899572871E-7   0.35252304014681E-7   0.35158912157371E-7   0.35065723585867E-7   0.3497273788592E-7
+ 0.34879954644124E-7   0.34787373448369E-7   0.34694993887244E-7   0.34602815550167E-7   0.34510838027391E-7
+ 0.34419060909965E-7   0.34327483789958E-7   0.3423610626028E-7   0.34144927914608E-7   0.34053948347261E-7
+ 0.33963167153336E-7   0.33872583929156E-7   0.33782198271866E-7    0.336920097794E-7   0.33602018050488E-7
+ 0.33512222684665E-7   0.33422623282381E-7   0.33333219444957E-7   0.33244010774636E-7   0.33154996874098E-7
+ 0.33066177346887E-7   0.32977551797487E-7   0.32889119831471E-7   0.32800881055083E-7   0.32712835075452E-7
+ 0.32624981500546E-7   0.32537319939159E-7   0.32449850000581E-7   0.32362571294907E-7   0.32275483433312E-7
+ 0.32188586027886E-7   0.32101878691464E-7   0.32015361037618E-7   0.31929032680702E-7   0.31842893235932E-7
+ 0.31756942319438E-7   0.3167117954822E-7   0.31585604539723E-7   0.31500216912171E-7   0.31415016284595E-7
+ 0.3133000227724E-7   0.31245174511002E-7   0.31160532607509E-7   0.31076076189152E-7   0.3099180487904E-7
+ 0.30907718301327E-7   0.30823816080935E-7   0.3074009784344E-7   0.3065656321499E-7   0.3057321182242E-7
+ 0.30490043293842E-7   0.30407057258089E-7   0.30324253344724E-7   0.30241631183977E-7   0.3015919040682E-7
+ 0.30076930645143E-7   0.29994851531652E-7   0.29912952699893E-7   0.29831233783768E-7   0.29749694417975E-7
+ 0.29668334238138E-7   0.29587152880892E-7   0.29506149983531E-7   0.29425325184032E-7   0.29344678121113E-7
+ 0.29264208434254E-7   0.29183915763835E-7   0.29103799751018E-7   0.29023860037491E-7   0.2894409626562E-7
+ 0.28864508078426E-7   0.28785095120192E-7   0.28705857035755E-7   0.2862679347071E-7   0.28547904071408E-7
+ 0.28469188485037E-7   0.28390646359207E-7   0.28312277342256E-7   0.28234081083297E-7   0.28156057232554E-7
+ 0.28078205440856E-7   0.28000525359697E-7   0.27923016641275E-7   0.27845678938467E-7   0.27768511905106E-7
+ 0.27691515195736E-7   0.27614688465493E-7   0.27538031370075E-7   0.27461543565797E-7    0.273852247102E-7
+ 0.2730907446145E-7   0.27233092478393E-7   0.27157278420504E-7   0.27081631947934E-7   0.27006152721705E-7
+ 0.26930840403585E-7   0.2685569465609E-7   0.26780715142111E-7   0.26705901525256E-7   0.2663125347002E-7
+ 0.26556770641793E-7   0.26482452706576E-7   0.26408299331027E-7   0.26334310182483E-7   0.26260484928996E-7
+ 0.26186823239458E-7   0.26113324783497E-7   0.26039989231174E-7   0.25966816253183E-7   0.25893805520846E-7
+ 0.25820956706683E-7   0.25748269483743E-7   0.25675743525717E-7   0.25603378506947E-7   0.25531174102395E-7
+ 0.25459129987924E-7   0.25387245840064E-7   0.25315521335976E-7   0.25243956153282E-7   0.25172549970231E-7
+ 0.25101302466087E-7   0.2503021332081E-7   0.24959282214954E-7   0.24888508829828E-7   0.24817892847446E-7
+ 0.24747433950348E-7   0.24677131821627E-7   0.24606986144936E-7   0.24536996605075E-7   0.24467162887388E-7
+ 0.24397484677858E-7   0.24327961663087E-7   0.24258593530299E-7   0.24189379967509E-7   0.24120320663405E-7
+ 0.24051415307347E-7   0.2398266358912E-7   0.23914065199147E-7   0.23845619828691E-7   0.23777327169798E-7
+ 0.23709186915087E-7   0.23641198757807E-7   0.23573362391823E-7   0.23505677511678E-7   0.23438143812667E-7
+ 0.23370760990751E-7   0.23303528742338E-7   0.23236446764442E-7   0.23169514754687E-7   0.23102732411696E-7
+ 0.23036099434599E-7   0.22969615523149E-7   0.22903280377726E-7   0.22837093699262E-7   0.22771055189557E-7
+ 0.22705164551016E-7   0.22639421486606E-7   0.22573825699728E-7   0.22508376894346E-7   0.22443074775422E-7
+ 0.22377919048532E-7   0.22312909419831E-7   0.22248045596053E-7   0.2218332728452E-7   0.22118754193265E-7
+ 0.22054326030992E-7   0.21990042507067E-7   0.21925903331212E-7   0.21861908213776E-7   0.21798056865806E-7
+ 0.21734348999187E-7   0.21670784326277E-7   0.21607362560131E-7   0.21544083414426E-7   0.21480946603455E-7
+ 0.21417951841881E-7   0.21355098844945E-7   0.21292387328728E-7   0.21229817010022E-7   0.21167387606155E-7
+ 0.21105098835008E-7   0.21042950415045E-7   0.20980942065363E-7   0.20919073505746E-7   0.20857344456585E-7
+ 0.2079575463871E-7   0.20734303773519E-7   0.20672991582998E-7   0.2061181779001E-7   0.20550782117898E-7
+ 0.20489884290589E-7   0.20429124032592E-7   0.20368501068927E-7   0.20308015125424E-7   0.2024766592846E-7
+ 0.20187453204922E-7   0.20127376682133E-7   0.2006743608791E-7   0.20007631151046E-7   0.19947961600867E-7
+ 0.1988842716724E-7   0.19829027580565E-7   0.1976976257178E-7    0.197106318725E-7   0.19651635214949E-7
+ 0.19592772331955E-7   0.19534042956687E-7   0.1947544682288E-7   0.19416983664954E-7   0.1935865321811E-7
+ 0.19300455218029E-7   0.19242389400894E-7   0.19184455503428E-7   0.19126653262917E-7   0.19068982417406E-7
+ 0.19011442705489E-7   0.18954033866149E-7   0.18896755638865E-7   0.18839607763584E-7   0.18782589981252E-7
+ 0.18725702033198E-7   0.18668943661327E-7   0.18612314608131E-7   0.18555814616692E-7   0.18499443430465E-7
+ 0.18443200793429E-7   0.18387086450131E-7   0.18331100145966E-7   0.18275241626769E-7   0.18219510638877E-7
+ 0.1816390692915E-7   0.18108430244927E-7   0.18053080334336E-7   0.17997856945994E-7   0.17942759828984E-7
+ 0.17887788732835E-7   0.17832943407528E-7   0.17778223603922E-7   0.17723629073347E-7   0.17669159567637E-7
+ 0.17614814839161E-7   0.17560594640761E-7   0.1750649872593E-7   0.1745252684871E-7   0.1739867876368E-7
+ 0.17344954225797E-7   0.17291352990521E-7   0.17237874813959E-7   0.17184519452875E-7   0.17131286664475E-7
+ 0.1707817620651E-7   0.17025187837224E-7   0.16972321315385E-7   0.16919576400405E-7   0.16866952852209E-7
+ 0.1681445043111E-7   0.16762068897894E-7   0.16709808013795E-7   0.1665766754095E-7   0.16605647241874E-7
+ 0.1655374687958E-7   0.16501966217574E-7   0.16450305019803E-7   0.16398763050931E-7    0.163473400761E-7
+ 0.1629603586093E-7   0.16244850171416E-7   0.16193782773999E-7   0.16142833435885E-7   0.16092001924801E-7
+ 0.1604128800891E-7   0.15990691456958E-7   0.15940212038191E-7   0.1588984952228E-7   0.15839603679326E-7
+ 0.15789474279824E-7   0.15739461095143E-7   0.15689563897045E-7   0.15639782457773E-7   0.15590116550075E-7
+ 0.15540565947138E-7   0.15491130422743E-7   0.15441809751168E-7   0.15392603707174E-7   0.1534351206592E-7
+ 0.15294534603011E-7   0.15245671094668E-7   0.15196921317702E-7   0.1514828504933E-7   0.15099762067288E-7
+ 0.15051352149751E-7   0.15003055075397E-7   0.14954870623508E-7   0.14906798573836E-7   0.14858838706483E-7
+ 0.14810990801993E-7   0.14763254641343E-7   0.14715630006336E-7   0.14668116679116E-7   0.14620714442301E-7
+ 0.14573423078975E-7   0.1452624237262E-7   0.14479172107393E-7   0.14432212067886E-7   0.1438536203912E-7
+ 0.14338621806474E-7   0.14291991155716E-7   0.14245469873388E-7   0.14199057746493E-7   0.14152754562454E-7
+ 0.14106560109139E-7   0.14060474174828E-7   0.14014496548367E-7   0.13968627019124E-7   0.13922865376932E-7
+ 0.13877211411928E-7   0.13831664914693E-7   0.13786225676329E-7   0.13740893488592E-7   0.13695668143568E-7
+ 0.13650549433881E-7   0.13605537152612E-7   0.13560631093292E-7   0.13515831049792E-7   0.13471136816385E-7
+ 0.13426548187971E-7   0.13382064959992E-7   0.1333768692826E-7   0.13293413889061E-7   0.1324924563908E-7
+ 0.13205181975485E-7   0.13161222695984E-7   0.13117367598717E-7   0.13073616482166E-7   0.13029969145229E-7
+ 0.12986425387221E-7   0.12942985008202E-7   0.12899647808558E-7    0.128564135891E-7   0.12813282151065E-7
+ 0.12770253296039E-7   0.12727326826306E-7   0.1268450254451E-7   0.12641780253698E-7   0.12599159757279E-7
+ 0.12556640859029E-7   0.12514223363394E-7   0.12471907075215E-7   0.12429691799729E-7   0.12387577342686E-7
+ 0.12345563510185E-7   0.12303650108839E-7   0.12261836945723E-7   0.12220123828341E-7   0.12178510564499E-7
+ 0.12136996962402E-7   0.12095582830761E-7   0.12054267978878E-7   0.12013052216364E-7   0.11971935353319E-7
+ 0.11930917200233E-7   0.11889997568001E-7   0.11849176268049E-7   0.11808453112187E-7   0.11767827912599E-7
+ 0.11727300481866E-7   0.11686870632887E-7   0.11646538179298E-7   0.11606302935008E-7   0.11566164714376E-7
+ 0.11526123332242E-7   0.1148617860386E-7   0.11446330344769E-7   0.11406578370891E-7   0.11366922498559E-7
+  0.113273625448E-7   0.11287898326927E-7   0.11248529662668E-7   0.11209256370146E-7   0.11170078267827E-7
+ 0.11130995174773E-7   0.11092006910385E-7   0.11053113294443E-7    0.110143141471E-7   0.10975609288805E-7
+ 0.10936998540702E-7   0.10898481724276E-7   0.10860058661385E-7   0.10821729174296E-7    0.107834930856E-7
+ 0.10745350218417E-7   0.1070730039629E-7   0.10669343443128E-7   0.10631479183189E-7   0.10593707441084E-7
+ 0.10556028041895E-7   0.10518440811205E-7   0.10480945574885E-7   0.10443542159303E-7   0.10406230391172E-7
+ 0.10369010097587E-7   0.10331881106144E-7   0.10294843244792E-7   0.10257896341815E-7   0.10221040225854E-7
+ 0.10184274725861E-7   0.10147599671488E-7   0.10111014892635E-7   0.10074520219609E-7   0.10038115483127E-7
+  0.100018005142E-7   0.99655751443898E-8   0.99294392056006E-8   0.98933925300963E-8    0.985743495047E-8
+ 0.98215662996129E-8   0.97857864110068E-8   0.97500951185305E-8   0.97144922563608E-8   0.96789776591658E-8
+ 0.9643551161947E-8   0.96082126000538E-8   0.95729618091827E-8   0.95377986252994E-8   0.95027228850362E-8
+ 0.9467734425311E-8   0.94328330833988E-8   0.93980186969912E-8   0.93632911040666E-8   0.93286501430946E-8
+ 0.92940956529207E-8   0.92596274727343E-8   0.92252454420422E-8   0.91909494006551E-8   0.9156739188873E-8
+ 0.9122614647471E-8   0.90885756174901E-8   0.90546219403983E-8   0.90207534579727E-8   0.89869700123648E-8
+ 0.8953271446209E-8   0.89196576024495E-8   0.88861283243508E-8   0.88526834555079E-8   0.88193228398138E-8
+ 0.87860463218106E-8   0.87528537462664E-8   0.87197449583285E-8   0.8686719803517E-8   0.86537781276128E-8
+ 0.86209197769475E-8   0.85881445981489E-8   0.85554524381767E-8   0.85228431443106E-8   0.8490316564089E-8
+ 0.84578725456319E-8   0.84255109374042E-8   0.83932315881645E-8   0.83610343470801E-8   0.83289190635861E-8
+ 0.82968855875519E-8   0.82649337692506E-8   0.8233063459264E-8   0.82012745084779E-8   0.81695667680759E-8
+  0.813794008963E-8   0.81063943252388E-8   0.80749293272095E-8   0.80435449482952E-8   0.80122410415829E-8
+ 0.79810174604789E-8   0.79498740586968E-8   0.79188106902161E-8     0.78878272095E-8   0.78569234714343E-8
+ 0.78260993311451E-8   0.7795354644177E-8   0.77646892663426E-8   0.7734103053819E-8   0.77035958632275E-8
+ 0.76731675514659E-8   0.7642817975747E-8   0.76125469935837E-8   0.75823544627826E-8   0.75522402417361E-8
+ 0.75222041890383E-8   0.74922461636556E-8   0.74623660249011E-8   0.74325636323199E-8   0.74028388459867E-8
+ 0.73731915262281E-8   0.73436215336865E-8   0.73141287293207E-8   0.72847129743136E-8   0.72553741304106E-8
+ 0.7226112059649E-8   0.71969266243459E-8   0.71678176872172E-8   0.71387851112108E-8   0.71098287596969E-8
+ 0.7080948496408E-8   0.70521441853541E-8   0.70234156908522E-8   0.69947628774783E-8   0.6966185610193E-8
+ 0.69376837544306E-8   0.69092571758276E-8   0.68809057404139E-8     0.68526293145E-8   0.68244277646837E-8
+ 0.67963009580373E-8   0.67682487618737E-8   0.67402710438114E-8   0.67123676717705E-8   0.66845385138676E-8
+ 0.6656783438858E-8   0.66291023156615E-8   0.66014950135383E-8   0.65739614021255E-8   0.65465013513193E-8
+ 0.65191147313305E-8   0.64918014126383E-8   0.64645612660106E-8   0.64373941627507E-8   0.64102999743402E-8
+ 0.63832785726234E-8   0.63563298297599E-8   0.6329453618122E-8   0.63026498105914E-8   0.62759182802669E-8
+ 0.62492589005472E-8   0.62226715451349E-8   0.61961560879232E-8   0.6169712403362E-8   0.61433403661441E-8
+ 0.61170398512311E-8   0.60908107339634E-8   0.60646528898825E-8   0.6038566194944E-8   0.60125505254259E-8
+ 0.59866057578533E-8   0.5960731769071E-8   0.59349284361434E-8   0.59091956365143E-8   0.58835332480497E-8
+ 0.58579411487942E-8   0.58324192171867E-8   0.5806967331908E-8   0.5781585371919E-8   0.5756273216621E-8
+ 0.57310307456277E-8   0.57058578388515E-8   0.56807543764812E-8   0.56557202388992E-8   0.56307553070759E-8
+ 0.56058594621314E-8   0.55810325855055E-8   0.55562745589688E-8   0.55315852644732E-8   0.55069645844413E-8
+ 0.54824124015303E-8   0.54579285986628E-8   0.54335130590686E-8   0.54091656661592E-8   0.53848863038127E-8
+ 0.53606748562106E-8   0.53365312077246E-8   0.53124552431695E-8   0.52884468475635E-8   0.52645059062109E-8
+ 0.52406323047038E-8   0.5216825928795E-8   0.51930866647906E-8   0.51694143991906E-8   0.51458090187582E-8
+ 0.51222704106173E-8   0.50987984620638E-8   0.50753930608021E-8   0.50520540948208E-8   0.5028781452334E-8
+ 0.50055750218742E-8   0.49824346921586E-8   0.49593603522836E-8   0.49363518917244E-8   0.49134092001122E-8
+ 0.48905321674716E-8   0.48677206840311E-8   0.48449746402952E-8   0.48222939271773E-8   0.47996784357756E-8
+ 0.47771280574848E-8   0.47546426839479E-8   0.47322222070002E-8   0.47098665190211E-8   0.46875755125178E-8
+ 0.46653490803112E-8   0.46431871155291E-8   0.46210895114531E-8   0.45990561618354E-8   0.45770869606212E-8
+ 0.45551818020094E-8   0.45333405804963E-8   0.45115631907291E-8   0.44898495278205E-8   0.44681994871419E-8
+ 0.44466129642565E-8   0.44250898551148E-8   0.44036300558215E-8   0.43822334628276E-8   0.43608999729092E-8
+ 0.43396294830253E-8   0.43184218904511E-8   0.42972770926485E-8   0.42761949873693E-8   0.42551754728037E-8
+ 0.42342184472559E-8   0.42133238094112E-8   0.41924914582004E-8   0.41717212927681E-8   0.41510132125688E-8
+ 0.41303671172098E-8   0.41097829066822E-8   0.40892604813165E-8   0.4068799741578E-8   0.40484005883244E-8
+ 0.40280629225782E-8   0.40077866456387E-8   0.39875716591844E-8   0.39674178650508E-8   0.39473251653742E-8
+ 0.3927293462509E-8   0.39073226590029E-8   0.38874126579061E-8   0.38675633623753E-8   0.3847774675879E-8
+ 0.38280465021665E-8   0.38083787451145E-8   0.37887713090768E-8   0.37692240985563E-8   0.37497370183043E-8
+ 0.3730309973356E-8   0.37109428688681E-8   0.36916356104686E-8   0.36723881039987E-8   0.36532002554872E-8
+ 0.3634071971331E-8   0.36150031580542E-8   0.35959937225289E-8   0.35770435719186E-8   0.35581526135426E-8
+ 0.35393207550515E-8   0.35205479042438E-8   0.35018339692119E-8   0.34831788584444E-8   0.34645824805339E-8
+ 0.34460447444312E-8   0.34275655592855E-8   0.34091448344409E-8   0.33907824796619E-8   0.33724784048405E-8
+ 0.33542325201495E-8   0.33360447360114E-8   0.33179149629486E-8   0.32998431120282E-8   0.32818290943994E-8
+ 0.32638728214839E-8   0.32459742050344E-8   0.32281331569438E-8   0.32103495894117E-8   0.31926234148233E-8
+ 0.31749545457604E-8   0.31573428952726E-8   0.31397883764948E-8   0.31222909028734E-8   0.31048503881079E-8
+ 0.30874667460069E-8   0.30701398908559E-8   0.30528697370518E-8   0.30356561992369E-8   0.30184991923239E-8
+ 0.30013986313201E-8   0.29843544317099E-8   0.29673665091461E-8   0.29504347794679E-8   0.29335591588659E-8
+ 0.29167395636315E-8   0.28999759104088E-8   0.28832681160994E-8   0.28666160977425E-8   0.28500197727131E-8
+ 0.28334790585015E-8   0.28169938728966E-8   0.28005641340447E-8   0.27841897601741E-8   0.27678706698845E-8
+ 0.27516067819375E-8   0.27353980152904E-8   0.2719244289291E-8   0.27031455233915E-8   0.26871016373294E-8
+ 0.26711125510648E-8   0.26551781846571E-8   0.26392984586838E-8   0.26234732937881E-8   0.26077026108763E-8
+ 0.2591986331144E-8   0.25763243758705E-8   0.25607166667617E-8   0.25451631256764E-8   0.2529663674664E-8
+ 0.25142182360752E-8   0.24988267323451E-8   0.24834890863008E-8   0.24682052210085E-8   0.24529750596347E-8
+ 0.24377985257669E-8   0.24226755430905E-8   0.24076060355377E-8   0.23925899272998E-8   0.23776271426374E-8
+ 0.23627176062907E-8   0.23478612431236E-8   0.23330579781899E-8   0.23183077368829E-8   0.23036104446702E-8
+ 0.22889660273772E-8   0.22743744110503E-8   0.22598355218628E-8   0.22453492863257E-8   0.22309156310343E-8
+ 0.22165344828913E-8   0.2202205769121E-8   0.21879294170118E-8   0.21737053542293E-8   0.21595335085626E-8
+ 0.21454138080025E-8   0.21313461809102E-8   0.21173305557257E-8   0.21033668611824E-8   0.20894550262061E-8
+ 0.20755949798272E-8   0.20617866515616E-8   0.20480299709706E-8   0.20343248678838E-8   0.2020671272398E-8
+ 0.20070691146709E-8   0.19935183252967E-8   0.19800188349802E-8   0.19665705746185E-8   0.19531734754039E-8
+ 0.19398274685874E-8   0.1926532485817E-8   0.19132884589379E-8   0.19000953199027E-8   0.18869530010503E-8
+ 0.1873861434779E-8   0.18608205537782E-8   0.1847830291015E-8   0.18348905795335E-8   0.18220013527211E-8
+ 0.18091625440664E-8   0.17963740872728E-8   0.17836359164294E-8   0.17709479656568E-8   0.17583101694258E-8
+ 0.17457224623899E-8   0.17331847793267E-8   0.17206970553519E-8   0.17082592256377E-8   0.16958712256711E-8
+ 0.16835329912228E-8   0.16712444581072E-8   0.16590055625388E-8   0.16468162408136E-8   0.1634676429438E-8
+ 0.16225860652608E-8   0.16105450851877E-8   0.15985534264313E-8   0.15866110263652E-8   0.15747178224734E-8
+ 0.15628737526991E-8   0.15510787550106E-8   0.1539332767651E-8   0.15276357291067E-8   0.15159875779031E-8
+ 0.15043882530168E-8   0.14928376934916E-8   0.14813358385703E-8   0.14698826277814E-8   0.14584780006873E-8
+ 0.14471218972575E-8   0.14358142576161E-8   0.14245550219986E-8   0.14133441310169E-8   0.14021815253175E-8
+ 0.13910671458468E-8   0.1380000933798E-8   0.1368982830417E-8   0.13580127773235E-8   0.13470907161958E-8
+ 0.13362165889394E-8   0.13253903378091E-8   0.13146119050805E-8   0.13038812333771E-8   0.12931982654627E-8
+ 0.12825629442184E-8   0.12719752129299E-8   0.1261435014915E-8   0.12509422937578E-8   0.12404969932603E-8
+ 0.1230099057243E-8   0.12197484300268E-8   0.12094450559491E-8   0.1199188879566E-8   0.11889798457411E-8
+ 0.11788178993743E-8   0.11687029856965E-8   0.11586350500641E-8   0.1148614037955E-8   0.11386398952695E-8
+ 0.11287125679142E-8   0.11188320020871E-8   0.11089981442051E-8   0.10992109407043E-8   0.10894703384876E-8
+ 0.10797762844802E-8   0.10701287258193E-8   0.10605276099147E-8   0.10509728841874E-8   0.10414644964778E-8
+ 0.10320023947388E-8   0.10225865270434E-8   0.10132168418255E-8   0.10038932875308E-8   0.99461581291927E-9
+ 0.98538436696771E-9   0.97619889868979E-9   0.96705935748975E-9   0.9579656927937E-9   0.94891785426876E-9
+ 0.93991579189863E-9   0.93095945566753E-9   0.92204879593196E-9   0.91318376314949E-9   0.90436430790552E-9
+ 0.89559038116497E-9   0.88686193390299E-9   0.87817891737919E-9   0.86954128304455E-9   0.86094898236697E-9
+ 0.85240196730295E-9   0.8439001898006E-9   0.83544360203504E-9   0.82703215645755E-9   0.81866580551804E-9
+ 0.81034450207307E-9   0.80206819906904E-9   0.79383684958206E-9   0.7856504070162E-9   0.77750882477299E-9
+ 0.76941205659796E-9   0.76136005643338E-9   0.7533527782413E-9   0.74539017641903E-9   0.73747220536915E-9
+ 0.72959881971711E-9   0.72176997434501E-9   0.71398562412332E-9   0.70624572436187E-9   0.69855023043884E-9
+ 0.69089909786481E-9   0.68329228249571E-9   0.67572974017645E-9   0.66821142708396E-9   0.66073729957538E-9
+ 0.65330731404453E-9   0.64592142727766E-9   0.63857959605665E-9   0.63128177741818E-9   0.62402792868402E-9
+ 0.61681800715775E-9   0.60965197053985E-9   0.60252977659042E-9   0.59545138321117E-9   0.58841674866232E-9
+ 0.58142583119155E-9   0.57447858935321E-9   0.5675749818608E-9   0.56071496745478E-9   0.55389850533995E-9
+ 0.54712555469291E-9   0.54039607493279E-9   0.53371002573334E-9   0.5270673667464E-9   0.52046805805195E-9
+  0.513912059776E-9   0.50739933218727E-9   0.50092983587373E-9   0.49450353139729E-9   0.48812037968166E-9
+ 0.48178034180677E-9   0.47548337888466E-9   0.46922945243971E-9   0.46301852397244E-9   0.45685055524039E-9
+ 0.45072550825645E-9   0.44464334501494E-9   0.4386040279051E-9   0.43260751934817E-9   0.42665378192188E-9
+ 0.42074277856306E-9   0.41487447216691E-9   0.40904882597325E-9   0.40326580336268E-9   0.39752536775921E-9
+ 0.39182748297861E-9   0.38617211280688E-9   0.38055922130181E-9   0.37498877277488E-9   0.36946073150145E-9
+ 0.36397506218172E-9   0.35853172953115E-9   0.35313069842504E-9   0.3477719340757E-9   0.34245540166062E-9
+ 0.3371810666906E-9   0.33194889480009E-9   0.32675885166346E-9   0.32161090339652E-9   0.31650501606728E-9
+ 0.31144115600553E-9   0.30641928977184E-9   0.30143938388553E-9   0.29650140531945E-9   0.29160532104631E-9
+ 0.28675109820007E-9   0.28193870422214E-9   0.27716810650584E-9   0.27243927282697E-9   0.2677521710755E-9
+ 0.26310676918588E-9   0.25850303549529E-9   0.25394093829395E-9   0.24942044614898E-9   0.24494152785499E-9
+ 0.24050415216685E-9   0.23610828827002E-9   0.23175390533593E-9   0.22744097271348E-9   0.22316946008327E-9
+ 0.21893933706796E-9   0.21475057365543E-9   0.21060313993236E-9   0.20649700603633E-9   0.20243214251796E-9
+ 0.19840851987489E-9   0.19442610887509E-9   0.19048488049615E-9   0.18658480565926E-9   0.18272585577367E-9
+ 0.17890800220841E-9   0.17513121651304E-9   0.17139547054702E-9   0.16770073611467E-9   0.16404698538605E-9
+ 0.16043419061536E-9   0.15686232411332E-9   0.15333135860924E-9   0.14984126676494E-9   0.14639202152787E-9
+ 0.14298359605017E-9   0.13961596342417E-9   0.13628909722518E-9   0.13300297097923E-9   0.12975755839786E-9
+ 0.12655283348588E-9   0.12338877017912E-9   0.12026534281907E-9   0.11718252581754E-9   0.11414029364777E-9
+ 0.11113862117488E-9   0.10817748319439E-9   0.10525685480233E-9   0.1023767112925E-9   0.99537027899513E-10
+ 0.96737780327785E-10   0.93978944218651E-10   0.9126049541571E-10   0.88582410066305E-10   0.85944664241151E-10
+ 0.83347234408258E-10   0.80790097091558E-10   0.78273228884193E-10   0.7579660677513E-10   0.73360207677622E-10
+ 0.7096400880429E-10   0.68607987549117E-10   0.66292121243707E-10   0.64016387717586E-10   0.61780764722758E-10
+ 0.59585230215763E-10   0.57429762438993E-10   0.5531433955358E-10   0.53238940136073E-10   0.51203542804478E-10
+ 0.49208126252848E-10   0.47252669554284E-10   0.45337151697468E-10   0.43461551993433E-10   0.41625849926816E-10
+ 0.39830024924883E-10   0.38074056895759E-10   0.36357925667986E-10   0.34681611281053E-10   0.33045094050383E-10
+ 0.31448354202707E-10   0.29891372396657E-10   0.28374129315374E-10   0.26896605724987E-10   0.25458782771274E-10
+ 0.24060641508354E-10   0.22702163317708E-10   0.2138332973998E-10   0.20104122265926E-10   0.18864522858568E-10
+ 0.17664513392887E-10   0.16504075967777E-10   0.15383192957389E-10   0.14301846640821E-10   0.13260019730933E-10
+ 0.12257694950099E-10   0.11294855112714E-10   0.10371483410682E-10   0.94875629374466E-11   0.86430771202916E-11
+ 0.78380095310327E-11   0.70723436946325E-11   0.63460636168343E-11   0.56591532053074E-11   0.50115965977311E-11
+ 0.44033781949971E-11   0.38344822972775E-11   0.33048936536186E-11   0.28145970062726E-11   0.23635771978531E-11
+ 0.19518194401425E-11   0.15793088385718E-11   0.12460308477349E-11   0.95197105416845E-12   0.69711500364319E-12
+ 0.48144871423007E-12   0.30495809990602E-12   0.16762931441037E-12   0.69448766761193E-13   0.10402885315998E-13
+              0.   0.69359921501914E-1   0.13853998370442E0   0.20754052459671E0   0.27636188161334E0
+ 0.34500439163036E0   0.41346839097836E0   0.48175421541995E0   0.54986220018139E0   0.61779267993589E0
+ 0.68554598878954E0   0.75312246031861E0   0.82052242754039E0   0.88774622292626E0   0.95479417840045E0
+ 0.10216666253409E1    0.108836389458E1   0.11548863164056E1   0.12212342205616E1   0.12874079362492E1
+ 0.13534077921271E1   0.14192341163129E1   0.14848872363837E1   0.1550367479377E1   0.16156751717912E1
+ 0.1680810639587E1   0.17457742081879E1   0.18105662024807E1   0.18751869468171E1   0.19396367650138E1
+ 0.20039159803538E1   0.20680249155867E1   0.21319638929302E1   0.21957332340705E1   0.22593332601628E1
+ 0.2322764291833E1   0.23860266491776E1   0.24491206517651E1   0.25120466186365E1   0.25748048683063E1
+ 0.26373957187633E1   0.26998194874711E1   0.27620764913694E1   0.28241670468744E1   0.28860914698797E1
+ 0.29478500757573E1   0.30094431793581E1   0.3070871095013E1   0.31321341365334E1   0.31932326172122E1
+ 0.32541668498245E1   0.33149371466286E1   0.33755438193663E1   0.34359871792644E1   0.34962675370347E1
+ 0.35563852028756E1   0.36163404864722E1   0.36761336969975E1   0.3735765143113E1   0.37952351329696E1
+ 0.38545439742083E1   0.39136919739609E1   0.39726794388512E1   0.40315066749951E1   0.4090173988002E1
+ 0.41486816829753E1   0.42070300645131E1   0.42652194367091E1   0.43232501031535E1   0.43811223669335E1
+ 0.44388365306342E1   0.44963928963395E1   0.45537917656326E1   0.4611033439597E1   0.46681182188171E1
+ 0.47250464033792E1   0.4781818292872E1   0.48384341863875E1   0.48948943825217E1   0.49511991793756E1
+ 0.50073488745554E1   0.5063343765174E1   0.51191841478512E1   0.51748703187147E1   0.52304025734007E1
+ 0.52857812070549E1   0.53410065143331E1   0.53960787894019E1   0.54509983259394E1   0.55057654171363E1
+ 0.55603803556963E1   0.5614843433837E1   0.56691549432906E1   0.57233151753047E1   0.57773244206428E1
+ 0.58311829695856E1   0.58848911119312E1   0.5938449136996E1   0.59918573336156E1   0.60451159901452E1
+ 0.60982253944609E1   0.61511858339599E1   0.62039975955614E1   0.62566609657073E1   0.63091762303634E1
+ 0.63615436750192E1   0.64137635846896E1   0.6465836243915E1   0.65177619367623E1   0.65695409468254E1
+ 0.66211735572264E1   0.66726600506158E1   0.67240007091735E1   0.67751958146095E1   0.68262456481644E1
+ 0.68771504906107E1   0.69279106222528E1   0.69785263229282E1   0.70289978720081E1   0.7079325548398E1
+ 0.71295096305386E1   0.71795503964065E1   0.72294481235146E1   0.72792030889134E1   0.7328815569191E1
+ 0.73782858404747E1   0.74276141784306E1   0.74768008582654E1   0.75258461547264E1   0.75747503421024E1
+ 0.76235136942246E1   0.76721364844669E1   0.77206189857472E1   0.77689614705274E1   0.78171642108146E1
+ 0.78652274781617E1   0.79131515436681E1   0.79609366779802E1   0.80085831512923E1   0.80560912333474E1
+ 0.81034611934376E1   0.81506933004051E1   0.81977878226424E1   0.82447450280938E1   0.82915651842554E1
+ 0.83382485581759E1   0.83847954164577E1   0.8431206025257E1   0.84774806502851E1   0.85236195568085E1
+ 0.85696230096502E1   0.86154912731896E1   0.8661224611364E1   0.87068232876687E1   0.87522875651582E1
+ 0.87976177064463E1   0.88428139737071E1   0.88878766286758E1   0.8932805932649E1   0.89776021464859E1
+ 0.90222655306084E1   0.90667963450022E1   0.91111948492172E1   0.91554613023686E1   0.91995959631369E1
+ 0.92435990897692E1   0.92874709400795E1   0.93312117714495E1   0.93748218408294E1   0.94183014047383E1
+ 0.94616507192648E1   0.95048700400683E1   0.95479596223789E1   0.95909197209984E1   0.96337505903011E1
+ 0.96764524842342E1   0.97190256563185E1   0.97614703596494E1   0.9803786846897E1   0.98459753703073E1
+ 0.98880361817023E1   0.99299695324812E1   0.99717756736209E1   0.10013454855676E2   0.10055007328781E2
+ 0.10096433342649E2   0.10137733146574E2   0.10178906989431E2   0.10219955119675E2   0.10260877785346E2
+ 0.10301675234064E2   0.10342347713033E2   0.10382895469043E2   0.10423318748467E2   0.10463617797264E2
+ 0.10503792860979E2   0.10543844184744E2   0.10583772013277E2   0.10623576590886E2   0.10663258161466E2
+ 0.10702816968501E2   0.10742253255067E2   0.10781567263829E2   0.10820759237043E2   0.10859829416557E2
+ 0.10898778043811E2   0.1093760535984E2   0.1097631160527E2   0.11014897020324E2   0.11053361844817E2
+ 0.11091706318162E2   0.11129930679368E2   0.11168035167038E2   0.11206020019377E2   0.11243885474184E2
+ 0.11281631768859E2    0.113192591404E2   0.11356767825407E2   0.11394158060078E2   0.11431430080215E2
+ 0.11468584121218E2   0.11505620418093E2   0.11542539205448E2   0.11579340717494E2   0.11616025188045E2
+ 0.11652592850524E2   0.11689043937956E2   0.11725378682973E2   0.11761597317813E2   0.11797700074324E2
+ 0.11833687183959E2   0.11869558877781E2   0.11905315386462E2   0.11940956940283E2   0.11976483769137E2
+ 0.12011896102527E2   0.12047194169567E2   0.12082378198983E2   0.12117448419117E2   0.1215240505792E2
+ 0.1218724834296E2   0.12221978501418E2   0.12256595760091E2   0.12291100345392E2   0.1232549248335E2
+ 0.12359772399611E2   0.12393940319438E2   0.12427996467714E2   0.12461941068938E2   0.12495774347232E2
+ 0.12529496526334E2   0.12563107829606E2   0.12596608480029E2   0.12629998700206E2   0.12663278712364E2
+ 0.1269644873835E2   0.12729508999637E2   0.12762459717321E2   0.12795301112124E2   0.1282803340439E2
+ 0.12860656814093E2   0.12893171560831E2   0.12925577863829E2   0.1295787594194E2   0.12990066013646E2
+ 0.13022148297057E2   0.13054123009911E2   0.13085990369578E2   0.13117750593057E2   0.13149403896981E2
+ 0.1318095049761E2   0.13212390610839E2   0.13243724452197E2   0.13274952236843E2   0.13306074179572E2
+ 0.13337090494814E2   0.13368001396632E2   0.13398807098727E2   0.13429507814434E2   0.13460103756727E2
+ 0.13490595138216E2   0.13520982171148E2   0.13551265067411E2   0.13581444038529E2   0.13611519295669E2
+ 0.13641491049635E2   0.13671359510874E2   0.13701124889473E2   0.13730787395161E2   0.1376034723731E2
+ 0.13789804624934E2   0.13819159766692E2   0.13848412870886E2   0.13877564145462E2   0.13906613798012E2
+ 0.13935562035775E2   0.13964409065634E2   0.1399315509412E2   0.14021800327412E2   0.14050344971335E2
+ 0.14078789231364E2   0.14107133312624E2   0.14135377419887E2   0.14163521757577E2   0.14191566529769E2
+ 0.14219511940187E2   0.14247358192209E2   0.14275105488865E2   0.14302754032837E2   0.1433030402646E2
+ 0.14357755671725E2   0.14385109170276E2   0.14412364723412E2   0.14439522532088E2   0.14466582796915E2
+ 0.14493545718162E2   0.14520411495752E2   0.14547180329268E2   0.14573852417952E2   0.14600427960702E2
+ 0.14626907156079E2    0.146532902023E2   0.14679577297245E2   0.14705768638455E2   0.1473186442313E2
+ 0.14757864848135E2   0.14783770109996E2   0.14809580404902E2   0.14835295928705E2   0.14860916876923E2
+ 0.14886443444738E2   0.14911875826995E2   0.14937214218207E2   0.14962458812554E2   0.14987609803879E2
+ 0.15012667385696E2   0.15037631751185E2   0.15062503093195E2   0.15087281604243E2   0.15111967476515E2
+ 0.15136560901869E2   0.15161062071831E2    0.151854711776E2   0.15209788410043E2   0.15234013959704E2
+ 0.15258148016794E2   0.15282190771202E2   0.15306142412486E2   0.1533000312988E2   0.15353773112294E2
+ 0.1537745254831E2   0.15401041626188E2   0.15424540533862E2   0.15447949458944E2   0.15471268588723E2
+ 0.15494498110163E2   0.15517638209911E2   0.15540689074287E2   0.15563650889294E2   0.15586523840612E2
+ 0.15609308113604E2   0.15632003893311E2   0.15654611364456E2   0.15677130711443E2   0.15699562118358E2
+ 0.15721905768972E2   0.15744161846735E2   0.15766330534784E2   0.15788412015939E2   0.15810406472703E2
+ 0.15832314087266E2   0.15854135041503E2   0.15875869516975E2   0.15897517694929E2    0.159190797563E2
+ 0.15940555881709E2   0.15961946251467E2   0.15983251045573E2   0.16004470443713E2   0.16025604625264E2
+ 0.16046653769294E2   0.1606761805456E2   0.1608849765951E2   0.16109292762284E2   0.16130003540714E2
+ 0.16150630172323E2   0.16171172834329E2   0.16191631703641E2   0.16212006956865E2   0.16232298770298E2
+ 0.16252507319933E2   0.1627263278146E2   0.16292675330262E2   0.1631263514142E2   0.16332512389712E2
+ 0.16352307249612E2   0.16372019895292E2   0.16391650500622E2   0.16411199239171E2   0.16430666284209E2
+ 0.16450051808701E2   0.16469355985316E2   0.16488578986422E2   0.16507720984089E2   0.16526782150087E2
+ 0.16545762655889E2   0.16564662672669E2   0.16583482371306E2   0.16602221922382E2   0.16620881496181E2
+ 0.16639461262692E2   0.1665796139161E2   0.16676382052334E2   0.1669472341397E2   0.16712985645328E2
+ 0.16731168914926E2   0.16749273390989E2   0.1676729924145E2   0.16785246633949E2   0.16803115735834E2
+ 0.16820906714164E2   0.16838619735706E2   0.16856254966937E2   0.16873812574044E2   0.16891292722924E2
+ 0.16908695579188E2   0.16926021308156E2   0.16943270074862E2   0.1696044204405E2   0.1697753738018E2
+ 0.16994556247423E2   0.17011498809666E2   0.17028365230509E2   0.17045155673267E2   0.17061870300971E2
+ 0.17078509276367E2   0.17095072761918E2   0.17111560919802E2   0.17127973911916E2   0.17144311899874E2
+ 0.17160575045007E2   0.17176763508366E2   0.17192877450718E2   0.17208917032554E2   0.1722488241408E2
+ 0.17240773755225E2   0.17256591215638E2   0.17272334954689E2   0.17288005131469E2   0.17303601904792E2
+ 0.17319125433193E2   0.17334575874932E2   0.17349953387991E2   0.17365258130074E2   0.17380490258613E2
+ 0.1739564993076E2   0.17410737303397E2   0.17425752533128E2   0.17440695776284E2   0.17455567188921E2
+ 0.17470366926825E2   0.17485095145506E2   0.17499752000203E2   0.17514337645883E2   0.17528852237241E2
+ 0.17543295928702E2   0.17557668874419E2   0.17571971228276E2   0.17586203143886E2   0.17600364774594E2
+ 0.17614456273475E2   0.17628477793335E2   0.17642429486715E2   0.17656311505885E2   0.17670124002848E2
+ 0.17683867129342E2   0.17697541036838E2   0.1771114587654E2   0.17724681799387E2   0.17738148956054E2
+ 0.17751547496951E2   0.17764877572221E2   0.17778139331747E2   0.17791332925146E2   0.17804458501774E2
+ 0.17817516210721E2   0.17830506200819E2   0.17843428620635E2   0.17856283618477E2   0.1786907134239E2
+ 0.1788179194016E2   0.17894445559312E2   0.17907032347112E2   0.17919552450566E2   0.17932006016422E2
+ 0.17944393191168E2   0.17956714121036E2   0.17968968951998E2   0.17981157829772E2   0.17993280899815E2
+ 0.18005338307331E2   0.18017330197268E2   0.18029256714315E2   0.18041118002909E2   0.18052914207232E2
+ 0.18064645471209E2   0.18076311938515E2   0.18087913752568E2   0.18099451056535E2   0.18110923993328E2
+ 0.18122332705609E2   0.18133677335788E2   0.1814495802602E2   0.18156174918213E2   0.18167328154023E2
+ 0.18178417874853E2   0.18189444221861E2   0.1820040733595E2   0.18211307357779E2   0.18222144427753E2
+ 0.18232918686034E2   0.18243630272532E2   0.1825427932691E2   0.18264865988586E2   0.18275390396729E2
+ 0.18285852690262E2   0.18296253007864E2   0.18306591487964E2   0.18316868268751E2   0.18327083488166E2
+ 0.18337237283906E2   0.18347329793423E2   0.18357361153928E2   0.18367331502387E2   0.18377240975523E2
+ 0.18387089709816E2   0.18396877841506E2   0.1840660550659E2   0.18416272840822E2   0.18425879979718E2
+ 0.18435427058551E2   0.18444914212356E2   0.18454341575927E2   0.18463709283817E2   0.18473017470343E2
+ 0.18482266269582E2   0.18491455815372E2   0.18500586241314E2   0.18509657680771E2   0.18518670266869E2
+ 0.18527624132497E2   0.18536519410308E2   0.1854535623272E2   0.18554134731913E2   0.18562855039833E2
+ 0.18571517288192E2   0.18580121608466E2   0.18588668131897E2   0.18597156989494E2   0.18605588312033E2
+ 0.18613962230056E2   0.18622278873872E2   0.18630538373559E2   0.18638740858963E2   0.18646886459697E2
+ 0.18654975305144E2   0.18663007524456E2   0.18670983246556E2   0.18678902600133E2   0.18686765713651E2
+ 0.18694572715343E2   0.1870232373321E2   0.1871001889503E2   0.18717658328348E2   0.18725242160484E2
+ 0.18732770518528E2   0.18740243529347E2   0.18747661319576E2   0.18755024015628E2   0.18762331743688E2
+ 0.18769584629715E2   0.18776782799443E2   0.18783926378383E2   0.18791015491818E2   0.18798050264809E2
+ 0.18805030822193E2   0.18811957288583E2   0.18818829788369E2   0.18825648445718E2   0.18832413384575E2
+ 0.18839124728663E2   0.18845782601482E2   0.18852387126312E2   0.18858938426213E2   0.1886543662402E2
+ 0.18871881842354E2   0.1887827420361E2   0.18884613829967E2   0.18890900843385E2   0.18897135365602E2
+ 0.18903317518141E2   0.18909447422305E2   0.18915525199178E2   0.18921550969629E2   0.18927524854309E2
+ 0.18933446973652E2   0.18939317447874E2   0.18945136396979E2   0.1895090394075E2   0.18956620198759E2
+ 0.1896228529036E2   0.18967899334695E2   0.18973462450689E2   0.18978974757054E2   0.1898443637229E2
+ 0.1898984741468E2   0.18995208002297E2   0.19000518253001E2   0.19005778284438E2   0.19010988214044E2
+ 0.19016148159042E2   0.19021258236445E2   0.19026318563054E2   0.19031329255459E2   0.19036290430041E2
+ 0.19041202202971E2   0.19046064690209E2   0.19050878007508E2   0.19055642270409E2   0.19060357594247E2
+ 0.19065024094147E2   0.19069641885029E2   0.19074211081602E2   0.19078731798369E2   0.19083204149627E2
+ 0.19087628249465E2   0.19092004211767E2   0.1909633215021E2   0.19100612178267E2   0.19104844409203E2
+ 0.19109028956081E2   0.19113165931758E2   0.19117255448887E2   0.19121297619917E2   0.19125292557092E2
+ 0.19129240372457E2   0.19133141177848E2   0.19136995084904E2   0.19140802205058E2   0.19144562649543E2
+ 0.19148276529389E2   0.19151943955426E2   0.19155565038282E2   0.19159139888384E2   0.19162668615961E2
+ 0.19166151331039E2   0.19169588143446E2   0.1917297916281E2   0.19176324498561E2   0.19179624259929E2
+ 0.19182878555945E2   0.19186087495445E2   0.19189251187064E2   0.19192369739241E2   0.19195443260218E2
+ 0.19198471858039E2   0.19201455640553E2   0.19204394715412E2   0.19207289190072E2   0.19210139171793E2
+ 0.19212944767643E2   0.1921570608449E2   0.19218423229011E2   0.19221096307688E2   0.19223725426808E2
+ 0.19226310692466E2   0.19228852210561E2   0.19231350086803E2   0.19233804426706E2   0.19236215335592E2
+ 0.19238582918592E2   0.19240907280645E2   0.19243188526498E2   0.19245426760707E2   0.19247622087637E2
+ 0.19249774611462E2   0.19251884436168E2   0.19253951665549E2   0.19255976403209E2   0.19257958752564E2
+ 0.19259898816841E2   0.19261796699077E2   0.19263652502123E2   0.19265466328638E2   0.19267238281098E2
+ 0.19268968461787E2   0.19270656972805E2   0.19272303916064E2   0.19273909393289E2   0.19275473506019E2
+ 0.19276996355608E2   0.19278478043223E2   0.19279918669846E2   0.19281318336275E2   0.19282677143121E2
+ 0.19283995190813E2   0.19285272579594E2   0.19286509409524E2   0.19287705780479E2   0.19288861792153E2
+ 0.19289977544055E2   0.19291053135512E2   0.1929208866567E2   0.19293084233491E2   0.19294039937757E2
+ 0.19294955877067E2   0.19295832149839E2   0.1929666885431E2   0.19297466088539E2    0.192982239504E2
+ 0.19298942537592E2   0.19299621947629E2   0.1930026227785E2   0.19300863625413E2   0.19301426087298E2
+ 0.19301949760304E2   0.19302434741054E2   0.19302881125993E2   0.19303289011388E2   0.19303658493328E2
+ 0.19303989667725E2   0.19304282630314E2   0.19304537476655E2   0.1930475430213E2   0.19304933201945E2
+ 0.19305074271132E2   0.19305177604546E2   0.19305243296867E2   0.19305271442601E2   0.19305262136079E2
+ 0.19305215471458E2   0.19305131542721E2   0.19305010443676E2   0.19304852267959E2   0.19304657109034E2
+ 0.19304425060188E2   0.19304156214541E2   0.19303850665036E2   0.19303508504447E2   0.19303129825373E2
+ 0.19302714720247E2   0.19302263281324E2   0.19301775600694E2   0.19301251770273E2   0.19300691881809E2
+ 0.19300096026876E2   0.19299464296883E2   0.19298796783067E2   0.19298093576496E2   0.19297354768069E2
+ 0.19296580448516E2    0.192957707084E2   0.19294925638115E2   0.19294045327886E2   0.19293129867773E2
+ 0.19292179347667E2   0.19291193857291E2   0.19290173486204E2   0.19289118323796E2   0.19288028459293E2
+ 0.19286903981752E2   0.19285744980068E2   0.19284551542968E2   0.19283323759015E2   0.19282061716606E2
+ 0.19280765503975E2   0.19279435209191E2   0.19278070920158E2   0.19276672724618E2   0.19275240710148E2
+ 0.19273774964163E2   0.19272275573913E2   0.19270742626489E2   0.19269176208814E2   0.19267576407655E2
+ 0.19265943309612E2   0.19264277001127E2   0.19262577568478E2   0.19260845097783E2   0.19259079674999E2
+ 0.19257281385923E2   0.19255450316191E2   0.19253586551279E2   0.19251690176503E2   0.1924976127702E2
+ 0.19247799937828E2   0.19245806243764E2   0.19243780279508E2   0.19241722129582E2   0.19239631878348E2
+ 0.19237509610012E2   0.1923535540862E2   0.19233169358062E2   0.1923095154207E2   0.19228702044221E2
+ 0.19226420947933E2   0.19224108336469E2   0.19221764292934E2   0.19219388900279E2   0.19216982241299E2
+ 0.19214544398632E2   0.19212075454764E2   0.19209575492022E2   0.19207044592582E2   0.19204482838464E2
+ 0.19201890311533E2   0.19199267093502E2   0.19196613265929E2   0.1919392891022E2   0.19191214107625E2
+ 0.19188468939245E2   0.19185693486025E2   0.1918288782876E2   0.19180052048091E2   0.19177186224508E2
+ 0.19174290438351E2   0.19171364769805E2   0.19168409298907E2   0.19165424105542E2   0.19162409269443E2
+ 0.19159364870196E2   0.19156290987233E2   0.19153187699839E2   0.19150055087148E2   0.19146893228145E2
+ 0.19143702201666E2   0.19140482086397E2   0.19137232960876E2   0.19133954903493E2   0.19130647992491E2
+ 0.19127312305961E2   0.19123947921851E2   0.19120554917958E2   0.19117133371935E2   0.19113683361284E2
+ 0.19110204963365E2   0.19106698255387E2   0.19103163314417E2   0.19099600217372E2   0.19096009041025E2
+ 0.19092389862006E2   0.19088742756795E2   0.19085067801729E2   0.19081365073003E2   0.19077634646663E2
+ 0.19073876598612E2   0.19070091004612E2   0.19066277940277E2   0.19062437481079E2   0.19058569702347E2
+ 0.19054674679267E2   0.19050752486881E2   0.19046803200089E2   0.1904282689365E2   0.19038823642177E2
+ 0.19034793520146E2   0.19030736601887E2   0.19026652961591E2   0.19022542673306E2   0.19018405810941E2
+ 0.19014242448263E2   0.19010052658899E2   0.19005836516334E2   0.19001594093915E2   0.18997325464849E2
+ 0.18993030702202E2    0.189887098789E2   0.18984363067734E2   0.18979990341351E2   0.18975591772262E2
+ 0.1897116743284E2   0.18966717395318E2   0.18962241731791E2   0.18957740514218E2   0.18953213814419E2
+ 0.18948661704078E2   0.18944084254739E2   0.18939481537813E2   0.18934853624571E2   0.1893020058615E2
+ 0.18925522493549E2   0.18920819417632E2   0.18916091429128E2   0.18911338598628E2   0.1890656099659E2
+ 0.18901758693337E2   0.18896931759054E2   0.18892080263796E2   0.1888720427748E2   0.1888230386989E2
+ 0.18877379110676E2   0.18872430069355E2   0.18867456815309E2   0.18862459417789E2   0.1885743794591E2
+ 0.18852392468656E2   0.18847323054878E2   0.18842229773294E2   0.18837112692492E2   0.18831971880924E2
+ 0.18826807406914E2   0.18821619338653E2   0.18816407744201E2   0.18811172691486E2   0.18805914248306E2
+ 0.18800632482328E2   0.18795327461089E2   0.18789999251994E2   0.18784647922321E2   0.18779273539216E2
+ 0.18773876169696E2   0.18768455880649E2   0.18763012738832E2   0.18757546810876E2   0.18752058163282E2
+ 0.1874654686242E2   0.18741012974537E2   0.18735456565747E2   0.18729877702038E2   0.18724276449271E2
+ 0.18718652873179E2   0.18713007039367E2   0.18707339013314E2   0.18701648860372E2   0.18695936645766E2
+ 0.18690202434594E2   0.1868444629183E2   0.18678668282321E2   0.18672868470786E2   0.18667046921822E2
+ 0.18661203699899E2   0.1865533886936E2   0.18649452494427E2   0.18643544639195E2   0.18637615367634E2
+ 0.18631664743591E2   0.18625692830788E2   0.18619699692823E2   0.18613685393172E2   0.18607649995185E2
+ 0.18601593562091E2   0.18595516156995E2   0.18589417842879E2   0.18583298682601E2    0.185771587389E2
+ 0.1857099807439E2   0.18564816751564E2   0.18558614832792E2   0.18552392380324E2   0.18546149456288E2
+ 0.1853988612269E2   0.18533602441415E2   0.1852729847423E2   0.18520974282777E2   0.18514629928581E2
+ 0.18508265473044E2   0.18501880977452E2   0.18495476502966E2   0.18489052110631E2   0.18482607861372E2
+ 0.18476143815995E2   0.18469660035185E2   0.1846315657951E2   0.18456633509419E2   0.18450090885243E2
+ 0.18443528767194E2   0.18436947215367E2   0.18430346289737E2   0.18423726050164E2   0.18417086556389E2
+ 0.18410427868036E2   0.18403750044613E2   0.18397053145509E2   0.18390337229998E2   0.18383602357238E2
+ 0.1837684858627E2   0.18370075976017E2   0.1836328458529E2   0.18356474472781E2   0.18349645697069E2
+ 0.18342798316616E2   0.18335932389769E2   0.18329047974762E2   0.18322145129711E2   0.1831522391262E2
+ 0.18308284381379E2   0.18301326593762E2   0.1829435060743E2   0.1828735647993E2   0.18280344268696E2
+ 0.18273314031048E2   0.18266265824193E2   0.18259199705226E2   0.18252115731127E2   0.18245013958766E2
+ 0.18237894444899E2   0.18230757246169E2   0.18223602419109E2   0.18216430020139E2   0.18209240105567E2
+ 0.18202032731591E2   0.18194807954296E2   0.18187565829656E2   0.18180306413536E2   0.18173029761689E2
+ 0.18165735929756E2   0.1815842497327E2   0.18151096947654E2   0.18143751908218E2   0.18136389910165E2
+ 0.18129011008587E2   0.18121615258468E2   0.18114202714681E2   0.18106773431991E2   0.18099327465055E2
+ 0.18091864868418E2   0.1808438569652E2   0.18076890003692E2   0.18069377844155E2   0.18061849272023E2
+ 0.18054304341304E2   0.18046743105895E2   0.18039165619589E2   0.18031571936069E2   0.18023962108913E2
+ 0.1801633619159E2   0.18008694237465E2   0.18001036299795E2   0.1799336243173E2   0.17985672686314E2
+ 0.17977967116486E2   0.1797024577508E2   0.17962508714821E2   0.17954755988332E2   0.1794698764813E2
+ 0.17939203746625E2   0.17931404336123E2   0.17923589468828E2   0.17915759196835E2   0.17907913572138E2
+ 0.17900052646624E2   0.17892176472079E2   0.17884285100184E2   0.17876378582514E2   0.17868456970545E2
+ 0.17860520315645E2   0.17852568669082E2   0.17844602082019E2   0.17836620605519E2   0.1782862429054E2
+ 0.17820613187938E2   0.17812587348466E2   0.17804546822777E2   0.1779649166142E2   0.17788421914843E2
+ 0.17780337633394E2   0.17772238867316E2   0.17764125666754E2   0.17755998081751E2   0.17747856162247E2
+ 0.17739699958085E2   0.17731529519005E2   0.17723344894647E2   0.17715146134551E2   0.17706933288157E2
+ 0.17698706404805E2   0.17690465533735E2   0.17682210724087E2   0.17673942024904E2   0.17665659485127E2
+  0.176573631536E2   0.17649053079066E2   0.17640729310171E2   0.17632391895463E2   0.17624040883389E2
+ 0.17615676322301E2   0.17607298260451E2   0.17598906745992E2   0.17590501826983E2   0.17582083551382E2
+ 0.17573651967052E2   0.17565207121757E2   0.17556749063164E2   0.17548277838845E2   0.17539793496274E2
+ 0.17531296082828E2   0.17522785645788E2   0.1751426223234E2   0.17505725889573E2   0.17497176664478E2
+ 0.17488614603955E2   0.17480039754803E2   0.17471452163731E2   0.17462851877349E2   0.17454238942172E2
+ 0.17445613404623E2   0.17436975311027E2   0.17428324707617E2   0.17419661640528E2   0.17410986155806E2
+ 0.17402298299398E2   0.1739359811716E2   0.17384885654853E2   0.17376160958145E2   0.17367424072609E2
+ 0.17358675043727E2   0.17349913916885E2   0.1734114073738E2   0.17332355550413E2   0.17323558401092E2
+ 0.17314749334436E2   0.17305928395367E2   0.17297095628718E2   0.1728825107923E2   0.1727939479155E2
+ 0.17270526810235E2   0.17261647179749E2   0.17252755944467E2   0.17243853148671E2   0.17234938836551E2
+ 0.17226013052207E2   0.1721707583965E2   0.17208127242798E2   0.17199167305479E2   0.17190196071432E2
+ 0.17181213584303E2   0.17172219887651E2   0.17163215024943E2   0.17154199039558E2   0.17145171974785E2
+ 0.17136133873822E2   0.1712708477978E2   0.17118024735679E2   0.17108953784451E2   0.1709987196894E2
+  0.170907793319E2   0.17081675915997E2   0.17072561763808E2   0.17063436917824E2   0.17054301420445E2
+ 0.17045155313986E2   0.17035998640671E2   0.1702683144264E2   0.17017653761943E2   0.17008465640544E2
+ 0.16999267120318E2   0.16990058243056E2   0.1698083905046E2   0.16971609584146E2   0.16962369885643E2
+ 0.16953119996394E2   0.16943859957757E2   0.16934589811001E2   0.16925309597311E2   0.16916019357787E2
+ 0.16906719133441E2   0.16897408965202E2   0.16888088893911E2   0.16878758960327E2   0.1686941920512E2
+ 0.16860069668879E2   0.16850710392105E2   0.16841341415217E2   0.16831962778548E2   0.16822574522347E2
+ 0.16813176686779E2   0.16803769311924E2   0.1679435243778E2   0.16784926104259E2   0.16775490351192E2
+ 0.16766045218324E2   0.16756590745317E2   0.16747126971753E2   0.16737653937126E2   0.16728171680852E2
+ 0.1671868024226E2   0.16709179660599E2   0.16699669975034E2   0.1669015122465E2   0.16680623448448E2
+ 0.16671086685347E2   0.16661540974184E2   0.16651986353715E2   0.16642422862613E2   0.16632850539473E2
+ 0.16623269422804E2   0.16613679551037E2   0.16604080962521E2   0.16594473695524E2   0.16584857788232E2
+ 0.16575233278754E2   0.16565600205115E2   0.1655595860526E2   0.16546308517056E2   0.16536649978287E2
+ 0.16526983026661E2   0.16517307699801E2   0.16507624035255E2   0.16497932070489E2   0.1648823184289E2
+ 0.16478523389767E2   0.16468806748347E2   0.16459081955781E2   0.16449349049141E2   0.16439608065417E2
+ 0.16429859041525E2   0.16420102014299E2   0.16410337020496E2   0.16400564096796E2   0.16390783279799E2
+ 0.16380994606028E2   0.16371198111929E2   0.16361393833868E2   0.16351581808137E2   0.16341762070947E2
+ 0.16331934658435E2   0.16322099606659E2    0.163122569516E2   0.16302406729163E2   0.16292548975177E2
+ 0.16282683725392E2   0.16272811015484E2   0.16262930881051E2   0.16253043357617E2   0.16243148480627E2
+ 0.16233246285452E2   0.16223336807388E2   0.16213420081654E2   0.16203496143394E2   0.16193565027675E2
+ 0.16183626769493E2   0.16173681403763E2   0.16163728965331E2   0.16153769488964E2   0.16143803009355E2
+ 0.16133829561125E2   0.16123849178817E2   0.16113861896902E2   0.16103867749776E2   0.16093866771761E2
+ 0.16083858997106E2   0.16073844459984E2   0.16063823194497E2   0.1605379523467E2   0.16043760614459E2
+ 0.16033719367744E2   0.16023671528331E2   0.16013617129956E2   0.16003556206278E2   0.15993488790888E2
+ 0.15983414917301E2   0.15973334618959E2   0.15963247929235E2   0.15953154881426E2   0.1594305550876E2
+ 0.15932949844391E2   0.15922837921401E2   0.15912719772802E2   0.15902595431533E2   0.1589246493046E2
+ 0.15882328302381E2   0.15872185580021E2   0.15862036796034E2   0.15851881983001E2   0.15841721173437E2
+ 0.1583155439978E2   0.15821381694403E2   0.15811203089606E2   0.15801018617616E2   0.15790828310595E2
+ 0.15780632200632E2   0.15770430319745E2   0.15760222699883E2   0.15750009372927E2   0.15739790370686E2
+  0.157295657249E2   0.1571933546724E2   0.15709099629308E2   0.15698858242636E2   0.15688611338687E2
+ 0.15678358948856E2   0.15668101104467E2   0.15657837836779E2   0.15647569176979E2   0.15637295156187E2
+ 0.15627015805455E2   0.15616731155766E2   0.15606441238034E2   0.15596146083108E2   0.15585845721766E2
+ 0.15575540184721E2   0.15565229502615E2   0.15554913706027E2   0.15544592825464E2   0.15534266891368E2
+ 0.15523935934115E2   0.15513599984012E2   0.15503259071299E2   0.15492913226151E2   0.15482562478675E2
+ 0.15472206858912E2   0.15461846396835E2   0.15451481122354E2   0.1544111106531E2   0.15430736255477E2
+ 0.15420356722567E2   0.15409972496224E2   0.15399583606024E2   0.15389190081481E2   0.15378791952041E2
+ 0.15368389247087E2   0.15357981995934E2   0.15347570227833E2   0.15337153971972E2   0.1532673325747E2
+ 0.15316308113385E2   0.15305878568707E2   0.15295444652365E2   0.15285006393219E2   0.1527456382007E2
+ 0.1526411696165E2   0.1525366584663E2   0.15243210503615E2   0.15232750961146E2   0.15222287247704E2
+  0.152118193917E2   0.15201347421488E2   0.15190871365353E2   0.15180391251519E2   0.15169907108149E2
+ 0.15159418963338E2   0.15148926845123E2   0.15138430781474E2   0.15127930800301E2   0.15117426929449E2
+ 0.15106919196703E2   0.15096407629784E2   0.15085892256351E2     0.15075373104E2   0.15064850200266E2
+ 0.15054323572621E2   0.15043793248477E2   0.15033259255181E2   0.15022721620021E2   0.15012180370223E2
+ 0.15001635532951E2   0.14991087135306E2   0.14980535204332E2   0.14969979767008E2   0.14959420850253E2
+ 0.14948858480926E2   0.14938292685824E2   0.14927723491685E2   0.14917150925184E2   0.14906575012937E2
+  0.148959957815E2   0.14885413257368E2   0.14874827466975E2   0.14864238436696E2   0.14853646192847E2
+ 0.14843050761681E2   0.14832452169396E2   0.14821850442126E2   0.14811245605947E2   0.14800637686875E2
+ 0.1479002671087E2   0.14779412703827E2   0.14768795691588E2   0.1475817569993E2   0.14747552754577E2
+ 0.14736926881189E2   0.14726298105371E2   0.14715666452668E2   0.14705031948566E2   0.14694394618493E2
+ 0.14683754487819E2   0.14673111581857E2   0.14662465925859E2   0.14651817545022E2   0.14641166464483E2
+ 0.14630512709322E2   0.14619856304562E2   0.14609197275167E2   0.14598535646046E2   0.14587871442048E2
+ 0.14577204687966E2   0.14566535408535E2   0.14555863628436E2   0.14545189372288E2   0.14534512664657E2
+ 0.14523833530051E2   0.14513151992922E2   0.14502468077665E2   0.14491781808618E2   0.14481093210063E2
+ 0.14470402306227E2   0.1445970912128E2   0.14449013679334E2   0.14438316004449E2   0.14427616120626E2
+ 0.14416914051811E2   0.14406209821896E2   0.14395503454716E2   0.14384794974049E2   0.14374084403622E2
+ 0.14363371767102E2   0.14352657088105E2   0.14341940390189E2   0.14331221696858E2   0.14320501031562E2
+ 0.14309778417695E2   0.14299053878597E2   0.14288327437553E2   0.14277599117795E2   0.14266868942498E2
+ 0.14256136934786E2   0.14245403117727E2   0.14234667514334E2   0.14223930147568E2   0.14213191040335E2
+ 0.14202450215487E2   0.14191707695825E2   0.14180963504092E2   0.14170217662981E2   0.1415947019513E2
+ 0.14148721123125E2   0.14137970469497E2   0.14127218256725E2   0.14116464507236E2   0.14105709243403E2
+ 0.14094952487545E2   0.1408419426193E2   0.14073434588773E2   0.14062673490236E2   0.1405191098843E2
+ 0.14041147105412E2   0.14030381863188E2   0.1401961528371E2   0.1400884738888E2   0.13998078200548E2
+ 0.1398730774051E2   0.13976536030512E2   0.13965763092249E2   0.13954988947362E2   0.13944213617443E2
+ 0.13933437124031E2   0.13922659488615E2   0.13911880732631E2   0.13901100877465E2   0.13890319944452E2
+ 0.13879537954876E2   0.13868754929971E2   0.13857970890918E2   0.13847185858849E2   0.13836399854846E2
+ 0.13825612899939E2   0.13814825015109E2   0.13804036221285E2   0.13793246539347E2   0.13782455990125E2
+ 0.13771664594399E2   0.13760872372898E2   0.13750079346303E2   0.13739285535244E2    0.137284909603E2
+ 0.13717695642004E2   0.13706899600836E2   0.13696102857229E2   0.13685305431566E2   0.13674507344179E2
+ 0.13663708615355E2   0.13652909265328E2   0.13642109314284E2   0.13631308782362E2   0.1362050768965E2
+ 0.13609706056189E2   0.1359890390197E2   0.13588101246936E2   0.13577298110983E2   0.13566494513956E2
+ 0.13555690475654E2   0.13544886015828E2   0.13534081154178E2   0.1352327591036E2   0.13512470303978E2
+ 0.13501664354593E2   0.13490858081713E2   0.13480051504804E2   0.13469244643279E2   0.13458437516507E2
+ 0.13447630143809E2   0.13436822544458E2   0.1342601473768E2   0.13415206742655E2   0.13404398578515E2
+ 0.13393590264345E2   0.13382781819183E2   0.13371973262021E2   0.13361164611804E2   0.13350355887431E2
+ 0.13339547107752E2   0.13328738291574E2   0.13317929457655E2   0.13307120624709E2   0.13296311811402E2
+ 0.13285503036355E2   0.13274694318143E2   0.13263885675293E2   0.13253077126289E2   0.13242268689569E2
+ 0.13231460383523E2   0.13220652226497E2   0.13209844236793E2   0.13199036432664E2   0.1318822883232E2
+ 0.13177421453927E2   0.13166614315603E2   0.13155807435422E2   0.13145000831414E2   0.13134194521562E2
+ 0.13123388523807E2   0.13112582856043E2   0.13101777536119E2   0.13090972581843E2   0.13080168010974E2
+ 0.13069363841228E2   0.13058560090279E2   0.13047756775754E2   0.13036953915237E2   0.13026151526267E2
+ 0.1301534962634E2   0.13004548232908E2   0.12993747363379E2   0.12982947035117E2   0.12972147265442E2
+ 0.1296134807163E2   0.12950549470917E2   0.1293975148049E2   0.12928954117496E2   0.1291815739904E2
+ 0.12907361342179E2   0.12896565963933E2   0.12885771281273E2   0.12874977311131E2   0.12864184070395E2
+ 0.1285339157591E2   0.12842599844478E2   0.12831808892859E2   0.1282101873777E2   0.12810229395886E2
+ 0.12799440883839E2   0.12788653218218E2   0.12777866415571E2   0.12767080492404E2   0.1275629546518E2
+ 0.1274551135032E2   0.12734728164203E2   0.12723945923167E2   0.12713164643508E2   0.12702384341479E2
+ 0.12691605033293E2   0.12680826735121E2   0.12670049463091E2   0.12659273233291E2   0.12648498061768E2
+ 0.12637723964527E2   0.12626950957532E2   0.12616179056707E2   0.12605408277932E2   0.12594638637049E2
+ 0.12583870149857E2   0.12573102832117E2   0.12562336699547E2   0.12551571767824E2   0.12540808052585E2
+ 0.12530045569429E2   0.1251928433391E2   0.12508524361545E2   0.1249776566781E2   0.1248700826814E2
+ 0.12476252177931E2   0.12465497412538E2   0.12454743987276E2   0.12443991917421E2   0.12433241218209E2
+ 0.12422491904835E2   0.12411743992455E2   0.12400997496187E2   0.12390252431108E2   0.12379508812254E2
+ 0.12368766654624E2   0.12358025973178E2   0.12347286782835E2   0.12336549098474E2   0.12325812934939E2
+ 0.12315078307031E2   0.12304345229513E2   0.1229361371711E2   0.12282883784509E2   0.12272155446355E2
+ 0.12261428717258E2   0.12250703611788E2   0.12239980144474E2   0.12229258329811E2   0.12218538182253E2
+ 0.12207819716216E2   0.12197102946078E2   0.12186387886179E2   0.12175674550821E2   0.12164962954266E2
+ 0.12154253110742E2   0.12143545034435E2   0.12132838739497E2   0.12122134240039E2   0.12111431550136E2
+ 0.12100730683825E2   0.12090031655106E2   0.12079334477941E2   0.12068639166255E2   0.12057945733935E2
+ 0.12047254194831E2   0.12036564562757E2   0.12025876851489E2   0.12015191074765E2   0.12004507246287E2
+ 0.11993825379721E2   0.11983145488695E2    0.119724675868E2   0.11961791687592E2   0.11951117804588E2
+ 0.1194044595127E2   0.11929776141084E2   0.11919108387438E2   0.11908442703704E2   0.1189777910322E2
+ 0.11887117599284E2   0.11876458205162E2   0.1186580093408E2   0.1185514579923E2   0.11844492813769E2
+ 0.11833841990816E2   0.11823193343456E2   0.11812546884737E2   0.11801902627672E2   0.11791260585238E2
+ 0.11780620770377E2   0.11769983195995E2   0.11759347874964E2   0.11748714820118E2   0.11738084044258E2
+ 0.11727455560149E2   0.11716829380521E2   0.1170620551807E2   0.11695583985454E2   0.11684964795299E2
+ 0.11674347960196E2   0.11663733492699E2   0.11653121405329E2   0.11642511710573E2   0.1163190442088E2
+ 0.1162129954867E2   0.11610697106323E2   0.11600097106187E2   0.11589499560578E2   0.11578904481773E2
+ 0.11568311882017E2   0.11557721773523E2   0.11547134168467E2   0.11536549078992E2   0.11525966517207E2
+ 0.11515386495187E2   0.11504809024973E2   0.11494234118573E2   0.11483661787961E2   0.11473092045076E2
+ 0.11462524901827E2   0.11451960370085E2   0.11441398461692E2   0.11430839188452E2   0.11420282562139E2
+ 0.11409728594493E2   0.11399177297221E2   0.11388628681996E2   0.11378082760458E2   0.11367539544216E2
+ 0.11356999044843E2   0.11346461273882E2   0.11335926242841E2   0.11325393963197E2   0.11314864446392E2
+ 0.11304337703838E2   0.11293813746913E2   0.11283292586964E2   0.11272774235302E2   0.1126225870321E2
+ 0.11251746001936E2   0.11241236142697E2   0.11230729136676E2   0.11220224995027E2   0.11209723728869E2
+ 0.1119922534929E2   0.11188729867346E2   0.11178237294063E2   0.11167747640431E2   0.11157260917413E2
+ 0.11146777135937E2    0.111362963069E2   0.11125818441169E2   0.11115343549578E2   0.11104871642929E2
+ 0.11094402731994E2   0.11083936827514E2   0.11073473940197E2   0.11063014080721E2   0.11052557259732E2
+ 0.11042103487847E2   0.11031652775648E2   0.11021205133691E2   0.11010760572497E2   0.11000319102558E2
+ 0.10989880734335E2   0.10979445478258E2   0.10969013344727E2   0.10958584344111E2   0.10948158486747E2
+ 0.10937735782944E2   0.10927316242979E2   0.10916899877099E2   0.10906486695521E2   0.10896076708432E2
+ 0.10885669925986E2   0.10875266358312E2   0.10864866015504E2   0.10854468907628E2   0.10844075044721E2
+ 0.10833684436789E2   0.10823297093807E2   0.10812913025723E2   0.10802532242452E2   0.10792154753882E2
+ 0.10781780569871E2   0.10771409700246E2   0.10761042154805E2   0.10750677943317E2   0.10740317075523E2
+ 0.1072995956113E2   0.10719605409822E2   0.10709254631248E2   0.10698907235032E2   0.10688563230768E2
+ 0.10678222628018E2   0.10667885436318E2   0.10657551665175E2   0.10647221324067E2   0.10636894422441E2
+ 0.10626570969717E2   0.10616250975287E2   0.10605934448513E2   0.10595621398729E2   0.1058531183524E2
+ 0.10575005767322E2   0.10564703204225E2   0.10554404155168E2   0.10544108629342E2   0.10533816635911E2
+ 0.1052352818401E2   0.10513243282746E2   0.10502961941198E2   0.10492684168416E2   0.10482409973424E2
+ 0.10472139365215E2   0.10461872352758E2   0.1045160894499E2   0.10441349150824E2   0.10431092979142E2
+ 0.10420840438802E2   0.1041059153863E2   0.10400346287428E2   0.10390104693968E2   0.10379866766997E2
+ 0.10369632515233E2   0.10359401947367E2   0.10349175072062E2   0.10338951897954E2   0.10328732433654E2
+ 0.10318516687743E2   0.10308304668775E2   0.1029809638528E2   0.10287891845757E2   0.10277691058682E2
+  0.102674940325E2   0.10257300775633E2   0.10247111296473E2   0.10236925603388E2   0.10226743704719E2
+ 0.10216565608777E2   0.10206391323851E2   0.10196220858201E2   0.10186054220062E2   0.10175891417639E2
+ 0.10165732459116E2   0.10155577352646E2   0.10145426106359E2   0.10135278728357E2   0.10125135226716E2
+ 0.10114995609487E2   0.10104859884694E2   0.10094728060335E2   0.10084600144383E2   0.10074476144783E2
+ 0.10064356069457E2    0.100542399263E2   0.10044127723179E2   0.1003401946794E2   0.10023915168398E2
+ 0.10013814832347E2   0.10003718467554E2   0.99936260817583E1   0.99835376826768E1   0.99734532779995E1
+ 0.99633728753914E1   0.99532964824923E1   0.99432241069165E1   0.99331557562533E1   0.99230914380668E1
+ 0.99130311598962E1   0.99029749292554E1   0.98929227536335E1   0.98828746404945E1   0.98728305972778E1
+ 0.98627906313976E1   0.98527547502435E1   0.98427229611804E1   0.98326952715486E1   0.98226716886634E1
+ 0.98126522198158E1   0.98026368722723E1   0.97926256532747E1   0.97826185700405E1   0.97726156297627E1
+ 0.97626168396101E1   0.97526222067271E1   0.97426317382338E1   0.97326454412262E1   0.97226633227761E1
+ 0.97126853899313E1   0.97027116497153E1   0.96927421091278E1   0.96827767751444E1   0.9672815654717E1
+ 0.96628587547734E1   0.96529060822177E1   0.96429576439303E1   0.96330134467675E1   0.96230734975625E1
+ 0.96131378031244E1   0.9603206370239E1   0.95932792056684E1   0.95833563161513E1   0.95734377084028E1
+ 0.9563523389115E1   0.95536133649561E1   0.95437076425715E1   0.9533806228583E1   0.95239091295894E1
+ 0.95140163521662E1   0.9504127902866E1   0.94942437882181E1   0.94843640147288E1   0.94744885888816E1
+ 0.94646175171369E1   0.94547508059323E1   0.94448884616825E1   0.94350304907795E1   0.94251768995925E1
+ 0.9415327694468E1   0.94054828817299E1   0.93956424676793E1   0.93858064585951E1   0.93759748607333E1
+ 0.93661476803276E1   0.93563249235893E1   0.93465065967073E1   0.93366927058482E1   0.93268832571561E1
+ 0.93170782567531E1   0.93072777107391E1   0.92974816251916E1   0.92876900061663E1   0.92779028596965E1
+ 0.92681201917937E1   0.92583420084475E1   0.92485683156253E1   0.92387991192728E1   0.92290344253138E1
+ 0.92192742396503E1   0.92095185681626E1   0.91997674167091E1   0.91900207911268E1   0.91802786972309E1
+ 0.91705411408151E1   0.91608081276514E1   0.91510796634906E1   0.91413557540617E1   0.91316364050726E1
+ 0.91219216222097E1   0.9112211411138E1   0.91025057775014E1   0.90928047269225E1   0.90831082650027E1
+ 0.90734163973222E1   0.90637291294401E1   0.90540464668945E1   0.90443684152026E1   0.90346949798603E1
+ 0.90250261663429E1   0.90153619801045E1   0.90057024265787E1   0.89960475111781E1   0.89863972392945E1
+ 0.8976751616299E1   0.89671106475421E1   0.89574743383536E1   0.89478426940428E1   0.89382157198982E1
+ 0.89285934211882E1   0.89189758031604E1   0.89093628710421E1   0.88997546300401E1   0.8890151085341E1
+ 0.88805522421112E1   0.88709581054964E1   0.88613686806227E1   0.88517839725955E1   0.88422039865003E1
+ 0.88326287274025E1   0.88230582003474E1   0.88134924103603E1   0.88039313624466E1   0.87943750615917E1
+ 0.87848235127612E1   0.87752767209006E1   0.87657346909359E1   0.87561974277732E1   0.87466649362988E1
+ 0.87371372213796E1   0.87276142878625E1   0.8718096140575E1   0.8708582784325E1   0.86990742239008E1
+ 0.86895704640715E1   0.86800715095863E1   0.86705773651754E1   0.86610880355495E1   0.86516035253998E1
+ 0.86421238393986E1   0.86326489821987E1   0.86231789584336E1   0.86137137727179E1   0.86042534296469E1
+ 0.85947979337969E1   0.85853472897252E1   0.85759015019699E1   0.85664605750503E1   0.85570245134668E1
+ 0.85475933217008E1   0.8538167004215E1   0.8528745565453E1    0.851932900984E1   0.85099173417822E1
+ 0.85005105656673E1   0.84911086858641E1   0.84817117067232E1   0.84723196325761E1   0.84629324677361E1
+ 0.8453550216498E1   0.84441728831381E1   0.84348004719141E1   0.84254329870656E1   0.84160704328137E1
+ 0.84067128133613E1   0.83973601328927E1   0.83880123955745E1   0.83786696055547E1   0.83693317669634E1
+ 0.83599988839122E1   0.83506709604952E1   0.83413480007879E1   0.83320300088482E1   0.83227169887158E1
+ 0.83134089444126E1   0.83041058799426E1   0.82948077992917E1   0.82855147064285E1   0.82762266053033E1
+ 0.82669434998489E1   0.82576653939805E1   0.82483922915954E1   0.82391241965735E1   0.82298611127768E1
+ 0.82206030440501E1   0.82113499942205E1   0.82021019670975E1   0.81928589664734E1   0.8183620996123E1
+ 0.81743880598037E1   0.81651601612556E1   0.81559373042014E1   0.81467194923467E1   0.81375067293797E1
+ 0.81282990189716E1   0.81190963647763E1   0.81098987704307E1   0.81007062395545E1   0.80915187757504E1
+ 0.80823363826042E1   0.80731590636845E1   0.80639868225432E1   0.80548196627151E1   0.80456575877182E1
+ 0.80365006010539E1   0.80273487062064E1   0.80182019066435E1   0.8009060205816E1   0.79999236071583E1
+ 0.79907921140878E1   0.79816657300055E1   0.79725444582959E1   0.79634283023268E1   0.79543172654495E1
+ 0.79452113509988E1   0.79361105622933E1   0.79270149026348E1   0.79179243753091E1   0.79088389835854E1
+ 0.78997587307167E1   0.78906836199398E1   0.78816136544752E1   0.78725488375271E1   0.78634891722837E1
+ 0.78544346619171E1   0.78453853095832E1   0.78363411184217E1   0.78273020915566E1   0.78182682320956E1
+ 0.78092395431307E1   0.78002160277379E1   0.77911976889771E1   0.77821845298927E1   0.7773176553513E1
+ 0.77641737628506E1   0.77551761609024E1   0.77461837506495E1   0.77371965350574E1   0.77282145170759E1
+ 0.77192376996391E1   0.77102660856656E1   0.77012996780586E1   0.76923384797055E1   0.76833824934783E1
+ 0.76744317222337E1   0.76654861688128E1   0.76565458360413E1   0.76476107267299E1   0.76386808436735E1
+ 0.76297561896519E1   0.76208367674298E1   0.76119225797566E1   0.76030136293662E1   0.75941099189779E1
+ 0.75852114512955E1   0.75763182290077E1   0.75674302547884E1   0.75585475312962E1   0.75496700611749E1
+ 0.75407978470532E1   0.7531930891545E1   0.75230691972492E1    0.751421276675E1   0.75053616026165E1
+ 0.74965157074032E1   0.74876750836499E1   0.74788397338815E1   0.74700096606082E1   0.74611848663256E1
+ 0.74523653535147E1   0.74435511246418E1   0.74347421821587E1   0.74259385285025E1   0.74171401660961E1
+ 0.74083470973477E1   0.7399559324651E1   0.73907768503854E1   0.73819996769158E1   0.7373227806593E1
+ 0.73644612417532E1   0.73556999847185E1   0.73469440377965E1   0.73381934032809E1   0.7329448083451E1
+ 0.73207080805718E1   0.73119733968945E1   0.7303244034656E1   0.7294519996079E1   0.72858012833725E1
+ 0.72770878987312E1   0.7268379844336E1   0.72596771223536E1   0.7250979734937E1   0.72422876842253E1
+ 0.72336009723436E1   0.72249196014034E1   0.72162435735022E1   0.72075728907237E1   0.71989075551381E1
+ 0.71902475688017E1   0.71815929337571E1   0.71729436520334E1   0.7164299725646E1   0.71556611565967E1
+ 0.71470279468737E1   0.71384000984519E1   0.71297776132924E1   0.7121160493343E1   0.71125487405381E1
+ 0.71039423567985E1   0.70953413440319E1   0.70867457041323E1   0.70781554389808E1   0.70695705504448E1
+ 0.70609910403787E1   0.70524169106236E1   0.70438481630074E1   0.70352847993448E1   0.70267268214373E1
+ 0.70181742310735E1   0.70096270300288E1   0.70010852200654E1   0.69925488029326E1   0.69840177803668E1
+ 0.69754921540912E1   0.69669719258163E1   0.69584570972395E1   0.69499476700454E1   0.69414436459058E1
+ 0.69329450264796E1   0.69244518134129E1   0.69159640083391E1   0.69074816128787E1   0.68990046286397E1
+ 0.68905330572173E1   0.68820669001941E1   0.68736061591399E1   0.68651508356122E1   0.68567009311557E1
+ 0.68482564473026E1   0.68398173855727E1   0.68313837474731E1   0.68229555344988E1   0.68145327481319E1
+ 0.68061153898426E1   0.67977034610882E1   0.67892969633142E1   0.67808958979533E1   0.67725002664262E1
+ 0.67641100701412E1   0.67557253104946E1   0.67473459888701E1   0.67389721066396E1   0.67306036651626E1
+ 0.67222406657866E1   0.67138831098469E1   0.67055309986669E1   0.66971843335578E1   0.66888431158188E1
+ 0.66805073467372E1   0.66721770275882E1   0.66638521596353E1   0.66555327441299E1   0.66472187823115E1
+ 0.66389102754079E1   0.66306072246349E1   0.66223096311967E1   0.66140174962855E1   0.6605730821082E1
+ 0.65974496067549E1   0.65891738544615E1   0.65809035653472E1   0.65726387405459E1   0.65643793811799E1
+ 0.65561254883597E1   0.65478770631846E1   0.6539634106742E1   0.65313966201081E1   0.65231646043473E1
+ 0.65149380605129E1   0.65067169896465E1   0.64985013927785E1   0.64902912709276E1   0.64820866251016E1
+ 0.64738874562967E1   0.64656937654977E1   0.64575055536784E1   0.64493228218012E1   0.64411455708173E1
+ 0.64329738016668E1   0.64248075152784E1   0.64166467125699E1   0.64084913944478E1   0.64003415618014E1
+ 0.63921972155256E1   0.63840583565079E1   0.63759249856281E1   0.63677971037069E1   0.63596747115598E1
+ 0.63515578100169E1   0.63434463999102E1   0.63353404820538E1   0.63272400572469E1   0.63191451262773E1
+ 0.63110556899247E1   0.63029717489637E1   0.6294893304173E1   0.62868203562735E1   0.62787529059738E1
+ 0.62706909539729E1   0.6262634501005E1   0.6254583547778E1   0.62465380949864E1   0.62384981433124E1
+ 0.6230463693426E1   0.62224347459956E1   0.62144113016853E1   0.6206393361135E1   0.61983809249449E1
+ 0.61903739937005E1   0.61823725680241E1   0.61743766485244E1   0.61663862357956E1   0.61584013304126E1
+ 0.61504219329404E1   0.61424480439399E1   0.61344796639643E1   0.61265167935722E1   0.61185594332562E1
+ 0.61106075835061E1   0.61026612448188E1   0.60947204177125E1   0.60867851026845E1   0.6078855300212E1
+ 0.60709310107677E1   0.60630122348163E1   0.60550989727757E1   0.6047191225054E1   0.60392889920814E1
+ 0.60313922742891E1   0.60235010720975E1   0.60156153858914E1   0.60077352160498E1   0.59998605629494E1
+ 0.59919914269701E1   0.59841278084936E1   0.59762697078424E1   0.59684171253312E1   0.5960570061269E1
+ 0.59527285159915E1   0.59448924898134E1   0.59370619830339E1   0.59292369959405E1   0.5921417528807E1
+ 0.59136035819178E1   0.59057951555532E1   0.58979922499628E1   0.5890194865356E1   0.58824030019273E1
+ 0.58746166599181E1   0.58668358395522E1   0.58590605410401E1   0.58512907645744E1   0.58435265103392E1
+ 0.58357677785151E1   0.58280145692758E1   0.58202668827991E1   0.58125247191979E1   0.58047880785826E1
+ 0.5797056961076E1   0.57893313668198E1    0.578161129594E1   0.57738967485328E1   0.57661877246882E1
+ 0.57584842244884E1   0.57507862480144E1   0.57430937953468E1   0.57354068665283E1   0.57277254615854E1
+ 0.57200495805291E1   0.5712379223413E1   0.57047143902643E1   0.56970550811006E1   0.56894012959299E1
+ 0.56817530347711E1   0.56741102975783E1     0.56664730843E1   0.56588413948836E1   0.56512152293144E1
+ 0.56435945875574E1   0.56359794695507E1   0.56283698752206E1   0.56207658044826E1   0.56131672572657E1
+ 0.56055742334951E1   0.55979867330631E1   0.55904047558297E1   0.55828283016373E1   0.55752573703816E1
+ 0.55676919619387E1   0.55601320761712E1   0.55525777129166E1   0.55450288720048E1   0.55374855532717E1
+ 0.55299477565482E1   0.55224154816638E1   0.55148887283928E1   0.55073674965084E1   0.54998517857932E1
+ 0.54923415960376E1   0.54848369270164E1   0.54773377784916E1   0.54698441502165E1   0.54623560419377E1
+ 0.54548734533992E1   0.54473963843489E1   0.54399248344891E1   0.54324588035081E1   0.54249982910814E1
+ 0.5417543296934E1   0.54100938207694E1   0.54026498622685E1   0.53952114210926E1   0.53877784968915E1
+ 0.53803510893357E1   0.53729291980882E1   0.53655128227945E1   0.53581019630559E1   0.53506966184623E1
+ 0.53432967886436E1   0.53359024732237E1   0.53285136718141E1   0.53211303840054E1   0.53137526093944E1
+ 0.53063803475503E1   0.52990135980208E1   0.52916523603371E1   0.52842966340718E1   0.52769464187781E1
+ 0.52696017139977E1   0.52622625192547E1   0.52549288340643E1   0.52476006579481E1   0.52402779904235E1
+ 0.52329608310047E1   0.52256491791514E1   0.52183430343195E1   0.52110423959854E1   0.52037472636346E1
+ 0.51964576367416E1   0.51891735147533E1   0.51818948971143E1   0.5174621783263E1   0.51673541726343E1
+ 0.51600920646649E1   0.51528354587545E1   0.51455843542928E1   0.51383387506613E1   0.51310986472732E1
+ 0.51238640435229E1   0.51166349387913E1   0.51094113324487E1   0.51021932238602E1   0.50949806123833E1
+ 0.50877734973716E1   0.50805718781666E1   0.50733757540908E1   0.5066185124457E1   0.50589999885909E1
+ 0.50518203458103E1   0.50446461954241E1   0.50374775367294E1   0.50303143690133E1   0.50231566915661E1
+ 0.50160045036756E1   0.50088578046373E1   0.50017165936846E1   0.49945808700554E1   0.49874506329902E1
+ 0.49803258817438E1   0.49732066155502E1   0.49660928336476E1   0.4958984535271E1   0.49518817196497E1
+ 0.49447843859628E1   0.49376925333879E1   0.49306061611207E1   0.49235252683599E1   0.49164498542939E1
+ 0.49093799180928E1   0.49023154589213E1   0.4895256475941E1   0.48882029683132E1   0.48811549352027E1
+ 0.48741123757315E1   0.48670752890157E1   0.48600436741674E1   0.48530175303177E1   0.48459968565801E1
+ 0.48389816520642E1   0.48319719158742E1   0.48249676471078E1   0.48179688448527E1   0.48109755081966E1
+ 0.48039876362115E1   0.47970052279484E1   0.47900282824492E1   0.47830567987752E1   0.47760907759776E1
+ 0.47691302130988E1   0.4762175109177E1   0.47552254632424E1   0.47482812743203E1   0.47413425414312E1
+ 0.47344092636006E1   0.47274814398048E1    0.472055906902E1   0.47136421502302E1   0.47067306824339E1
+ 0.46998246646174E1   0.46929240957487E1   0.46860289747894E1   0.46791393006964E1   0.46722550724336E1
+ 0.46653762889675E1   0.46585029492248E1   0.46516350521171E1   0.46447725965439E1   0.46379155814495E1
+ 0.46310640057539E1   0.46242178683725E1   0.46173771682161E1   0.46105419042069E1   0.46037120752092E1
+ 0.45968876800844E1   0.45900687176939E1   0.45832551869335E1   0.45764470866832E1   0.45696444158017E1
+ 0.45628471731377E1   0.45560553575313E1   0.45492689678419E1   0.45424880029257E1   0.45357124616116E1
+ 0.45289423426986E1   0.45221776449731E1   0.45154183672699E1   0.45086645084097E1   0.45019160672025E1
+ 0.44951730424378E1   0.44884354328999E1   0.44817032373799E1   0.4474976454667E1   0.44682550835518E1
+ 0.44615391227748E1   0.44548285710776E1   0.44481234272125E1   0.44414236899414E1   0.44347293580142E1
+ 0.44280404301698E1   0.44213569051404E1   0.44146787816546E1   0.44080060584454E1   0.44013387342514E1
+ 0.43946768077674E1   0.43880202776768E1   0.43813691426541E1   0.43747234014164E1   0.43680830526602E1
+ 0.43614480950727E1   0.43548185273328E1   0.43481943481175E1   0.43415755560921E1   0.43349621499199E1
+ 0.43283541282571E1   0.43217514897458E1   0.43151542330203E1   0.43085623567243E1   0.43019758594959E1
+ 0.42953947399637E1   0.42888189967625E1   0.42822486285284E1   0.42756836338704E1   0.42691240113751E1
+ 0.42625697596168E1   0.42560208772138E1   0.42494773627678E1   0.42429392148721E1   0.42364064321056E1
+ 0.42298790130414E1   0.42233569562587E1   0.4216840260335E1   0.42103289238484E1   0.42038229453252E1
+ 0.41973223232908E1   0.41908270562913E1   0.41843371428847E1   0.41778525816215E1   0.41713733710243E1
+ 0.41648995096132E1   0.41584309959083E1   0.41519678284404E1   0.41455100057445E1   0.41390575263087E1
+ 0.41326103886128E1   0.41261685911319E1   0.41197321323767E1   0.41133010108408E1   0.41068752250075E1
+ 0.41004547733522E1   0.40940396543423E1   0.40876298664549E1   0.4081225408165E1   0.40748262779331E1
+ 0.40684324741875E1   0.40620439953489E1   0.40556608398714E1   0.40492830062035E1   0.40429104927854E1
+ 0.40365432980447E1   0.40301814204069E1   0.40238248582933E1   0.40174736101204E1   0.40111276743113E1
+ 0.40047870492504E1   0.39984517333218E1   0.39921217249142E1   0.3985797022433E1   0.39794776242706E1
+ 0.39731635288124E1   0.39668547344422E1   0.39605512395415E1   0.3954253042459E1   0.39479601415394E1
+ 0.39416725351447E1   0.39353902216421E1   0.39291131993962E1   0.39228414667402E1   0.39165750220071E1
+ 0.39103138635321E1   0.39040579896605E1   0.38978073987396E1   0.3891562089077E1   0.38853220589766E1
+ 0.38790873067402E1   0.3872857830687E1   0.3866633629122E1   0.38604147003495E1   0.38542010426702E1
+  0.384799265438E1    0.384178953377E1   0.38355916791343E1   0.38293990887513E1   0.38232117608753E1
+ 0.38170296937475E1   0.38108528856543E1   0.38046813348752E1   0.3798515039682E1   0.37923539983143E1
+ 0.37861982090114E1   0.37800476700236E1   0.37739023796025E1   0.37677623360044E1   0.37616275374374E1
+ 0.37554979821119E1   0.37493736682477E1   0.37432545940814E1   0.37371407578417E1   0.3731032157736E1
+ 0.37249287919677E1   0.37188306587376E1   0.37127377562595E1   0.37066500827507E1   0.37005676363907E1
+ 0.36944904153449E1   0.36884184177668E1   0.36823516418625E1   0.36762900858148E1   0.36702337478027E1
+ 0.36641826260016E1   0.36581367185996E1   0.36520960237328E1   0.36460605395356E1   0.36400302641432E1
+ 0.36340051957246E1   0.36279853324347E1   0.3621970672414E1   0.36159612137961E1   0.36099569547079E1
+ 0.36039578932928E1   0.35979640276922E1   0.35919753560276E1   0.35859918763965E1   0.35800135868903E1
+ 0.35740404856313E1   0.35680725707327E1   0.35621098403014E1   0.35561522924334E1   0.35501999252181E1
+ 0.35442527367553E1   0.35383107251455E1   0.35323738884955E1   0.35264422248549E1   0.35205157322782E1
+ 0.35145944088345E1   0.35086782526088E1   0.35027672616753E1   0.34968614340966E1   0.34909607679337E1
+ 0.34850652612443E1   0.34791749120811E1   0.34732897185014E1    0.346740967854E1   0.34615347902237E1
+ 0.34556650515697E1   0.34498004606347E1   0.34439410154633E1   0.34380867140843E1   0.34322375545109E1
+ 0.34263935347494E1   0.34205546528311E1   0.34147209067839E1   0.34088922946257E1   0.34030688143371E1
+ 0.33972504638936E1   0.33914372413063E1   0.3385629144588E1   0.33798261717452E1   0.33740283207607E1
+ 0.33682355896262E1   0.33624479763197E1   0.33566654788072E1   0.33508880950437E1   0.33451158230172E1
+ 0.33393486607045E1   0.33335866060768E1   0.33278296570968E1   0.33220778117266E1   0.33163310679233E1
+ 0.33105894236417E1   0.33048528768379E1   0.32991214254419E1   0.32933950673805E1   0.32876738005939E1
+ 0.32819576230319E1   0.32762465326387E1   0.32705405273411E1   0.32648396050656E1   0.32591437637369E1
+ 0.32534530012803E1   0.32477673156242E1   0.32420867046732E1   0.32364111663263E1   0.3230740698478E1
+ 0.32250752990478E1   0.32194149659436E1   0.32137596970669E1   0.32081094903138E1   0.32024643435768E1
+ 0.31968242547508E1   0.31911892217299E1   0.31855592424004E1   0.31799343146287E1   0.31743144362756E1
+ 0.31686996052242E1   0.31630898193553E1   0.31574850765449E1   0.31518853746546E1   0.31462907115435E1
+ 0.31407010850755E1   0.31351164931167E1   0.31295369335416E1   0.31239624041782E1   0.3118392902858E1
+ 0.31128284274189E1   0.3107268975721E1   0.31017145456129E1   0.30961651349346E1   0.30906207415258E1
+ 0.30850813632269E1   0.30795469978481E1   0.3074017643198E1   0.30684932971017E1   0.3062973957391E1
+ 0.3057459621893E1   0.30519502884186E1   0.30464459547777E1   0.30409466187809E1   0.30354522782433E1
+ 0.30299629309865E1   0.3024478574796E1   0.30189992074534E1   0.30135248267385E1   0.3008055430462E1
+ 0.30025910164221E1   0.29971315824083E1   0.29916771262048E1   0.29862276455913E1   0.29807831383557E1
+ 0.29753436022854E1   0.29699090351566E1   0.29644794347253E1   0.2959054798743E1   0.2953635124985E1
+ 0.2948220411222E1   0.29428106552199E1   0.29374058547381E1   0.29320060075335E1   0.29266111113638E1
+ 0.29212211639858E1   0.2915836163164E1   0.29104561066239E1   0.29050809920935E1   0.28997108173096E1
+ 0.28943455800264E1   0.28889852779923E1   0.28836299089373E1   0.28782794705893E1   0.2872933960675E1
+ 0.28675933769302E1   0.28622577170922E1   0.28569269788767E1   0.28516011599902E1   0.28462802581317E1
+ 0.28409642710325E1   0.28356531964111E1   0.28303470319817E1   0.28250457754535E1   0.28197494245428E1
+ 0.28144579769408E1   0.28091714303357E1   0.28038897824158E1   0.27986130308927E1   0.27933411734714E1
+ 0.27880742078416E1   0.27828121316869E1   0.27775549426851E1   0.27723026385351E1   0.2767055216933E1
+ 0.27618126755596E1   0.27565750120757E1   0.2751342224136E1   0.27461143094275E1   0.27408912656314E1
+ 0.27356730904236E1   0.27304597814638E1   0.27252513364093E1   0.27200477529286E1   0.27148490286924E1
+ 0.27096551613757E1   0.27044661486136E1   0.2699281988046E1   0.26941026773213E1   0.26889282140992E1
+ 0.26837585960325E1   0.26785938207669E1   0.26734338859466E1   0.26682787892138E1   0.2663128528214E1
+ 0.26579831005973E1    0.265284250399E1   0.26477067360109E1   0.26425757942733E1   0.26374496764222E1
+ 0.26323283800909E1   0.26272119029071E1   0.26221002424934E1    0.261699339647E1   0.26118913624606E1
+ 0.26067941380892E1   0.26017017209752E1   0.25966141087162E1   0.25915312989056E1   0.25864532891595E1
+ 0.25813800770957E1   0.25763116603274E1   0.25712480364569E1   0.25661892030915E1   0.2561135157829E1
+ 0.25560858982577E1   0.25510414219598E1   0.25460017265386E1   0.25409668095913E1   0.25359366687113E1
+ 0.25309113014845E1   0.25258907054938E1   0.25208748783291E1   0.25158638175812E1   0.2510857520843E1
+ 0.25058559856764E1   0.25008592096461E1   0.24958671903262E1   0.24908799252987E1   0.24858974121409E1
+ 0.24809196484215E1   0.24759466317069E1   0.24709783595641E1   0.24660148295673E1   0.24610560392961E1
+ 0.24561019863006E1   0.24511526681262E1   0.24462080823151E1   0.24412682264382E1   0.24363330980563E1
+ 0.24314026947236E1   0.24264770139891E1   0.24215560533968E1   0.24166398105046E1   0.24117282828698E1
+ 0.2406821468042E1   0.24019193635468E1   0.23970219669093E1   0.23921292756745E1   0.23872412873862E1
+ 0.23823579995839E1   0.23774794098042E1   0.23726055155817E1   0.23677363144511E1   0.23628718039464E1
+ 0.23580119816105E1   0.23531568449519E1   0.23483063914818E1   0.23434606187167E1   0.23386195241922E1
+ 0.23337831054338E1   0.23289513599652E1   0.23241242853103E1   0.23193018789953E1   0.23144841385182E1
+ 0.23096710613795E1   0.23048626450906E1   0.23000588871683E1   0.22952597851251E1   0.22904653364677E1
+ 0.22856755387012E1   0.2280890389331E1   0.22761098858658E1   0.22713340258184E1   0.22665628066796E1
+ 0.22617962259381E1   0.22570342810815E1   0.22522769696137E1   0.22475242890301E1   0.22427762368258E1
+ 0.22380328104957E1   0.2233294007533E1   0.2228559825428E1   0.2223830261674E1   0.22191053137575E1
+ 0.22143849791503E1   0.22096692553196E1   0.22049581397557E1   0.22002516299465E1   0.21955497233767E1
+ 0.21908524175219E1   0.21861597098573E1   0.21814715978611E1   0.21767880790121E1   0.21721091507952E1
+ 0.21674348106668E1   0.21627650560872E1   0.2158099884521E1   0.21534392934434E1   0.21487832803239E1
+ 0.21441318426282E1   0.2139484977821E1   0.21348426833651E1   0.21302049567275E1   0.21255717953783E1
+ 0.21209431967715E1   0.21163191583543E1   0.21116996775681E1   0.21070847518808E1   0.21024743787499E1
+ 0.20978685556318E1   0.20932672799816E1   0.20886705492612E1   0.20840783609098E1   0.20794907123654E1
+ 0.20749076010664E1   0.2070329024469E1   0.2065754980023E1   0.20611854651721E1   0.20566204773573E1
+ 0.20520600140147E1   0.20475040725964E1   0.2042952650554E1   0.20384057453274E1   0.20338633543371E1
+ 0.20293254750015E1   0.20247921047649E1   0.20202632410669E1   0.20157388813443E1   0.20112190230276E1
+ 0.2006703663545E1   0.20021928003311E1   0.19976864308223E1   0.19931845524629E1   0.1988687162657E1
+ 0.19841942588131E1   0.19797058383523E1   0.1975221898714E1   0.19707424373342E1   0.19662674516281E1
+ 0.19617969390113E1     0.19573308969E1   0.19528693227234E1   0.19484122139134E1   0.1943959567879E1
+ 0.1939511382023E1   0.1935067653744E1   0.19306283804695E1   0.19261935596164E1   0.19217631885995E1
+ 0.19173372648307E1   0.1912915785721E1   0.19084987486833E1   0.19040861511322E1   0.18996779904797E1
+ 0.18952742641178E1   0.18908749694359E1   0.18864801038448E1   0.1882089664758E1   0.1877703649585E1
+ 0.18733220557297E1   0.18689448806023E1   0.18645721216016E1   0.18602037761138E1   0.18558398415191E1
+ 0.1851480315229E1   0.18471251946492E1   0.18427744771816E1   0.18384281602168E1   0.18340862411451E1
+ 0.18297487173649E1   0.18254155862761E1   0.18210868452816E1   0.18167624917584E1   0.18124425230869E1
+ 0.18081269366559E1   0.18038157298626E1   0.1799508900101E1   0.17952064447577E1   0.17909083612194E1
+ 0.17866146468727E1   0.17823252991083E1   0.17780403153207E1   0.17737596928871E1   0.17694834291808E1
+ 0.1765211521573E1   0.17609439674573E1   0.17566807642202E1   0.17524219092439E1   0.17481673999068E1
+ 0.17439172335849E1   0.17396714076633E1   0.17354299195273E1   0.17311927665579E1   0.17269599461187E1
+ 0.17227314555718E1   0.17185072922981E1   0.17142874536791E1   0.17100719370943E1   0.17058607399146E1
+ 0.17016538595115E1   0.16974512932591E1   0.16932530385338E1   0.16890590927179E1   0.16848694531686E1
+ 0.16806841172458E1   0.16765030823129E1   0.16723263457484E1   0.16681539049234E1   0.16639857572087E1
+ 0.16598218999761E1   0.16556623306001E1   0.16515070464324E1   0.16473560448267E1   0.16432093231479E1
+ 0.16390668787682E1   0.16349287090576E1   0.16307948113766E1   0.16266651830859E1   0.16225398215481E1
+ 0.16184187241301E1   0.16143018882036E1   0.16101893111204E1   0.16060809902302E1   0.16019769228819E1
+ 0.15978771064457E1   0.15937815382854E1   0.15896902157599E1   0.15856031362257E1   0.15815202970366E1
+ 0.15774416955558E1   0.15733673291471E1   0.15692971951682E1   0.15652312909616E1   0.15611696138672E1
+ 0.15571121612469E1   0.15530589304617E1   0.15490099188709E1   0.15449651238238E1   0.15409245426702E1
+ 0.15368881727651E1   0.15328560114656E1   0.15288280561357E1   0.15248043041117E1   0.15207847527341E1
+ 0.15167693993489E1   0.15127582413152E1   0.15087512759885E1   0.15047485007168E1   0.15007499128474E1
+ 0.14967555097273E1   0.14927652887106E1   0.14887792471538E1   0.14847973824002E1   0.14808196917875E1
+ 0.14768461726489E1   0.14728768223413E1   0.14689116382132E1   0.14649506176132E1   0.1460993757891E1
+ 0.14570410564034E1   0.14530925104848E1   0.14491481174689E1   0.14452078746902E1   0.14412717795042E1
+ 0.14373398292604E1   0.14334120213025E1   0.14294883529717E1   0.14255688216074E1   0.14216534245586E1
+ 0.14177421591749E1   0.14138350227989E1   0.14099320127612E1    0.140603312639E1   0.14021383610339E1
+ 0.13982477140395E1   0.13943611827514E1   0.13904787645081E1   0.13866004566479E1   0.13827262565138E1
+ 0.13788561614504E1   0.13749901688081E1   0.1371128275912E1   0.13672704800908E1   0.13634167786806E1
+ 0.1359567169029E1   0.13557216484801E1   0.13518802143712E1   0.13480428640396E1   0.13442095948229E1
+ 0.13403804040641E1   0.13365552891098E1   0.13327342472922E1   0.13289172759395E1   0.13251043723762E1
+ 0.13212955339505E1   0.13174907580035E1   0.1313690041874E1   0.13098933828974E1   0.1306100778408E1
+ 0.1302312225747E1   0.12985277222568E1   0.12947472652782E1   0.12909708521353E1   0.12871984801524E1
+ 0.12834301466681E1   0.12796658490241E1   0.12759055845583E1   0.12721493506103E1   0.12683971445232E1
+ 0.12646489636321E1   0.12609048052615E1   0.12571646667331E1   0.12534285453907E1   0.12496964385749E1
+ 0.12459683436243E1   0.12422442578714E1   0.12385241786489E1   0.12348081032947E1   0.12310960291486E1
+ 0.12273879535538E1   0.12236838738328E1   0.12199837873112E1   0.12162876913221E1   0.12125955832073E1
+ 0.12089074603065E1   0.12052233199526E1   0.12015431594785E1   0.11978669762183E1   0.11941947675125E1
+ 0.11905265307052E1   0.11868622631249E1   0.11832019620969E1   0.1179545624945E1   0.1175893249014E1
+ 0.11722448316425E1   0.11686003701667E1   0.11649598619201E1   0.11613233042348E1   0.11576906944508E1
+ 0.11540620299089E1   0.11504373079474E1   0.11468165258903E1   0.11431996810614E1   0.11395867707996E1
+ 0.11359777924458E1   0.11323727433396E1   0.11287716208136E1   0.11251744222013E1   0.11215811448398E1
+ 0.11179917860693E1   0.11144063432359E1   0.11108248136639E1   0.11072471946802E1   0.11036734836153E1
+ 0.11001036778133E1   0.10965377746122E1   0.10929757713515E1   0.1089417665372E1   0.10858634540179E1
+ 0.10823131346135E1   0.10787667044854E1    0.107522416097E1   0.10716855014106E1   0.10681507231485E1
+ 0.10646198235197E1   0.10610927998607E1   0.10575696495094E1   0.1054050369808E1   0.10505349581033E1
+ 0.1047023411726E1   0.10435157280045E1   0.10400119042671E1   0.10365119378627E1   0.10330158261349E1
+ 0.10295235664234E1   0.1026035156066E1   0.10225505923997E1   0.1019069872768E1   0.10155929945154E1
+ 0.10121199549832E1   0.10086507515022E1   0.10051853814027E1   0.10017238420292E1   0.9982661307263E0
+ 0.99481224483789E0   0.99136218170387E0   0.98791593866443E0   0.98447351306299E0   0.98103490224493E0
+ 0.97760010356233E0   0.97416911434473E0   0.97074193192532E0   0.96731855364238E0   0.96389897684715E0
+ 0.96048319888773E0   0.95707121710676E0   0.95366302884699E0   0.9502586314516E0   0.94685802226843E0
+ 0.9434611986483E0   0.94006815793265E0   0.93667889745847E0   0.93329341455869E0   0.92991170658894E0
+ 0.9265337708982E0   0.92315960483521E0   0.91978920574797E0   0.91642257099069E0   0.91305969790297E0
+ 0.90970058382416E0   0.90634522609423E0   0.90299362206944E0   0.89964576910209E0   0.89630166454099E0
+ 0.89296130573357E0   0.88962469002593E0   0.8862918147731E0   0.88296267733113E0   0.87963727505097E0
+ 0.8763156052729E0   0.87299766533589E0   0.86968345259722E0   0.86637296441344E0   0.86306619814001E0
+ 0.85976315112655E0   0.8564638207234E0   0.85316820428561E0   0.84987629917038E0   0.84658810274041E0
+ 0.84330361233777E0   0.84002282530852E0   0.83674573900441E0   0.83347235078698E0   0.83020265801514E0
+ 0.82693665804443E0   0.82367434823085E0   0.82041572593103E0   0.81716078850482E0   0.81390953331545E0
+ 0.81066195771692E0   0.80741805906034E0   0.80417783469447E0   0.80094128198636E0   0.79770839829839E0
+ 0.79447918099175E0   0.79125362742561E0   0.78803173495889E0   0.78481350095595E0   0.78159892278269E0
+ 0.77838799780484E0   0.77518072337488E0   0.77197709684619E0   0.76877711558396E0   0.76558077695671E0
+ 0.76238807833073E0   0.75919901707286E0   0.75601359055368E0   0.75283179613832E0   0.74965363118438E0
+ 0.74647909304838E0   0.74330817910239E0   0.74014088671664E0   0.73697721326074E0   0.73381715610276E0
+ 0.73066071261142E0   0.72750788015731E0   0.72435865611226E0   0.72121303785178E0   0.71807102273776E0
+ 0.71493260813427E0   0.7117977914115E0   0.70866656994692E0   0.70553894111727E0   0.70241490229358E0
+ 0.69929445084756E0   0.69617758415226E0   0.69306429958734E0   0.68995459453566E0   0.6868484663679E0
+ 0.68374591245254E0   0.68064693015722E0   0.67755151686633E0   0.67445966995981E0   0.67137138681689E0
+ 0.66828666481607E0   0.66520550133548E0   0.66212789375812E0   0.65905383946877E0   0.65598333585099E0
+ 0.65291638027659E0   0.64985297011753E0   0.64679310275945E0   0.64373677559048E0   0.64068398599833E0
+ 0.63763473136451E0   0.63458900907191E0   0.6315468165069E0   0.62850815105903E0   0.62547301012311E0
+ 0.62244139107683E0   0.6194132913003E0   0.6163887081768E0   0.61336763910161E0   0.6103500814657E0
+ 0.60733603266117E0   0.60432549008161E0   0.60131845112417E0   0.59831491317056E0   0.59531487360517E0
+   0.59231832982E0   0.58932527921351E0   0.58633571918291E0   0.58334964712188E0   0.58036706042512E0
+ 0.57738795648864E0   0.57441233271176E0   0.57144018649765E0   0.56847151523876E0   0.56550631632663E0
+ 0.56254458715254E0   0.55958632512339E0   0.55663152764292E0   0.5536801921123E0   0.55073231593105E0
+ 0.54778789649759E0   0.54484693121988E0   0.54190941750685E0   0.53897535276475E0   0.53604473438859E0
+ 0.53311755977379E0   0.53019382632987E0   0.52727353146748E0   0.52435667259669E0   0.52144324712399E0
+ 0.51853325245698E0   0.51562668600608E0   0.51272354518373E0   0.5098238274077E0   0.50692753008002E0
+ 0.50403465060572E0   0.50114518639368E0   0.49825913486283E0   0.49537649342989E0   0.49249725950927E0
+ 0.48962143051579E0   0.48674900386488E0   0.48387997697616E0   0.48101434727214E0   0.47815211216841E0
+ 0.47529326907695E0   0.47243781540792E0   0.46958574858768E0   0.46673706603805E0   0.46389176518204E0
+ 0.46104984344505E0   0.45821129825788E0   0.45537612703744E0   0.45254432720071E0   0.44971589616566E0
+ 0.44689083136476E0   0.44406913022707E0   0.44125079018024E0   0.43843580865157E0   0.43562418306784E0
+ 0.43281591086237E0   0.43001098947022E0   0.42720941632298E0   0.4244111888433E0   0.42161630445317E0
+ 0.41882476059054E0   0.41603655469351E0   0.4132516841997E0   0.41047014654225E0   0.4076919391559E0
+ 0.40491705947856E0   0.40214550495002E0   0.39937727301473E0   0.39661236110323E0   0.39385076664927E0
+ 0.39109248709096E0   0.38833751987442E0   0.38558586244466E0   0.38283751224361E0   0.38009246671387E0
+ 0.37735072329895E0   0.37461227944735E0   0.37187713261055E0    0.369145280232E0   0.36641671975259E0
+ 0.36369144861136E0   0.36096946426458E0   0.35825076416467E0   0.35553534576345E0   0.3528232065111E0
+ 0.35011434385827E0   0.3474087552603E0   0.34470643817415E0   0.3420073900574E0   0.33931160835754E0
+ 0.33661909052336E0   0.3339298340129E0   0.33124383628756E0   0.32856109480712E0   0.32588160703313E0
+ 0.32320537043049E0   0.32053238246005E0   0.31786264057599E0   0.31519614223162E0   0.31253288489558E0
+ 0.30987286603573E0   0.30721608311964E0   0.30456253361103E0   0.30191221497464E0   0.29926512467976E0
+ 0.29662126019783E0   0.29398061900437E0   0.29134319856036E0   0.28870899633006E0   0.28607800978339E0
+ 0.28345023639762E0    0.280825673649E0   0.27820431901089E0   0.27558616995773E0   0.27297122396513E0
+ 0.2703594785124E0   0.26775093108203E0   0.26514557914893E0   0.2625434201867E0   0.25994445166824E0
+ 0.2573486710805E0   0.25475607590743E0   0.25216666363257E0   0.24958043173887E0   0.24699737770963E0
+ 0.24441749903243E0   0.24184079319652E0   0.23926725769104E0   0.23669688999694E0   0.23412968759614E0
+ 0.23156564797996E0   0.22900476864205E0   0.22644704707596E0   0.22389248077321E0   0.22134106722659E0
+ 0.21879280393087E0   0.21624768838288E0   0.21370571808376E0   0.21116689052381E0   0.20863120319511E0
+ 0.20609865359228E0   0.20356923921983E0   0.20104295757942E0   0.19851980617389E0   0.19599978250762E0
+ 0.19348288408859E0   0.19096910841255E0   0.18845845297782E0   0.18595091528925E0   0.18344649285786E0
+ 0.18094518319426E0   0.17844698380558E0   0.17595189220029E0   0.17345990588841E0   0.17097102238382E0
+ 0.16848523920381E0   0.16600255385714E0    0.163522963852E0   0.16104646669656E0   0.15857305991265E0
+ 0.15610274101944E0   0.15363550753514E0   0.15117135697735E0   0.14871028686386E0   0.1462522947179E0
+ 0.1437973780643E0   0.14134553442683E0   0.13889676132176E0   0.13645105626588E0   0.13400841678685E0
+ 0.13156884041397E0   0.12913232467665E0   0.12669886710131E0   0.12426846521575E0   0.12184111655066E0
+ 0.11941681863911E0   0.11699556901877E0    0.114577365215E0   0.11216220475583E0   0.10975008517261E0
+ 0.1073410040057E0   0.10493495879418E0   0.10253194707503E0   0.10013196638589E0   0.97735014265197E-1
+ 0.9534108825608E-1   0.9295018590413E-1   0.90562304749816E-1   0.88177442330717E-1   0.85795596183148E-1
+ 0.83416763857824E-1   0.81040942902465E-1    0.786681308656E-1   0.7629832529692E-1   0.73931523750827E-1
+ 0.71567723772534E-1   0.69206922907447E-1   0.66849118701805E-1   0.64494308714245E-1   0.62142490501237E-1
+ 0.59793661618037E-1   0.57447819619658E-1   0.55104962061322E-1   0.52765086503818E-1   0.50428190509455E-1
+ 0.48094271638857E-1   0.45763327446578E-1   0.43435355487397E-1   0.4111035332727E-1   0.38788318532958E-1
+ 0.36469248671398E-1   0.34153141307082E-1   0.31839994005777E-1   0.29529804336391E-1   0.27222569869861E-1
+ 0.24918288181762E-1   0.2261695683551E-1   0.20318573397731E-1   0.18023135438988E-1   0.15730640537578E-1
+ 0.13441086271038E-1   0.1115447021459E-1   0.88707899443598E-2   0.65900430375683E-2   0.43122270758305E-2
+ 0.20373396434173E-2  -0.23462168099993E-3  -0.25036593205453E-2  -0.47697756996174E-2  -0.70329732283716E-2
+-0.92932543196477E-2  -0.11550621386308E-1  -0.13805076842261E-1  -0.16056623100746E-1  -0.18305262570498E-1
+-0.20550997658506E-1  -0.22793830770661E-1  -0.2503376432134E-1  -0.27270800723351E-1  -0.2950494238152E-1
+-0.31736191697175E-1  -0.33964551072488E-1  -0.36190022908638E-1  -0.38412609603707E-1  -0.40632313558076E-1
+-0.42849137176896E-1  -0.45063082865404E-1  -0.47274153017314E-1  -0.49482350026254E-1  -0.51687676285619E-1
+-0.53890134190969E-1  -0.56089726136707E-1  -0.58286454513624E-1  -0.60480321710472E-1  -0.62671330112091E-1
+-0.64859482114608E-1  -0.67044780111156E-1  -0.69227226490132E-1  -0.71406823633248E-1  -0.73583573922637E-1
+-0.75757479742749E-1  -0.7792854347685E-1  -0.80096767506867E-1  -0.8226215421095E-1  -0.84424705964415E-1
+-0.86584425148315E-1  -0.8874131414463E-1  -0.90895375335807E-1  -0.93046611091783E-1  -0.95195023784629E-1
+-0.97340615786579E-1  -0.99483389470458E-1  -0.10162334720852E0  -0.10376049136832E0  -0.10589482431574E0
+-0.10802634841625E0  -0.11015506604253E0  -0.11228097956597E0  -0.11440409134959E0  -0.11652440375369E0
+-0.11864191913816E0  -0.1207566398655E0  -0.12286856829658E0  -0.12497770678989E0  -0.12708405770123E0
+-0.12918762338253E0  -0.13128840619492E0  -0.13338640849775E0  -0.13548163264804E0  -0.13757408099382E0
+-0.13966375588521E0  -0.14175065967116E0  -0.14383479469914E0  -0.14591616331313E0  -0.14799476786652E0
+-0.15007061071019E0  -0.15214369418977E0  -0.15421402064546E0  -0.15628159241742E0  -0.15834641184815E0
+-0.16040848127876E0  -0.1624678030488E0  -0.16452437949417E0  -0.16657821294777E0  -0.16862930574875E0
+-0.17067766023652E0  -0.17272327875027E0  -0.17476616361782E0  -0.17680631716874E0  -0.17884374173294E0
+-0.18087843964059E0  -0.18291041322131E0  -0.1849396647999E0  -0.18696619669953E0  -0.18899001124365E0
+-0.19101111076165E0  -0.19302949758206E0  -0.19504517402445E0  -0.19705814240648E0  -0.1990684050453E0
+-0.20107596426042E0  -0.20308082236978E0  -0.20508298168865E0  -0.20708244452992E0  -0.20907921320252E0
+-0.21107329002468E0  -0.21306467731232E0  -0.21505337737847E0  -0.21703939252828E0  -0.21902272506753E0
+-0.22100337730359E0  -0.22298135154304E0  -0.22495665009158E0  -0.22692927525017E0  -0.2288992293176E0
+-0.23086651459639E0  -0.23283113339135E0  -0.23479308800794E0  -0.23675238073946E0  -0.23870901388103E0
+ -0.240662989727E0  -0.24261431057106E0  -0.24456297870301E0  -0.24650899641825E0  -0.24845236601178E0
+-0.25039308977772E0  -0.25233117000081E0  -0.25426660896698E0  -0.25619940896241E0  -0.25812957227304E0
+-0.26005710118424E0  -0.26198199797695E0  -0.2639042649305E0  -0.2658239043249E0  -0.26774091844463E0
+-0.2696553095735E0  -0.27156707998657E0  -0.27347623195765E0  -0.27538276775998E0  -0.27728668966878E0
+-0.27918799995793E0  -0.28108670089813E0  -0.28298279475778E0  -0.28487628380121E0  -0.28676717030262E0
+-0.2886554565333E0  -0.29054114476113E0  -0.29242423724707E0  -0.29430473625246E0  -0.29618264404011E0
+-0.29805796287185E0  -0.29993069500829E0  -0.30180084270615E0  -0.30366840821981E0  -0.30553339380737E0
+-0.30739580172812E0  -0.30925563424171E0  -0.31111289359731E0  -0.31296758204577E0  -0.31481970183709E0
+-0.31666925522075E0  -0.31851624444515E0  -0.32036067175661E0  -0.3222025393997E0  -0.32404184961751E0
+-0.32587860465832E0  -0.32771280676909E0  -0.32954445819063E0  -0.33137356116057E0  -0.3332001179166E0
+-0.3350241306959E0  -0.33684560173288E0  -0.33866453326294E0  -0.34048092752455E0  -0.34229478675593E0
+-0.34410611318643E0  -0.34591490904473E0  -0.34772117655895E0  -0.34952491795879E0  -0.35132613547272E0
+-0.35312483132584E0  -0.35492100774122E0  -0.35671466693844E0  -0.35850581114559E0  -0.36029444258791E0
+-0.36208056348697E0  -0.36386417605887E0  -0.36564528251971E0  -0.36742388508665E0  -0.36919998597564E0
+-0.37097358740133E0  -0.37274469157493E0  -0.3745133007051E0  -0.37627941700458E0  -0.37804304268665E0
+-0.37980417996474E0  -0.38156283104195E0  -0.38331899812279E0  -0.3850726834114E0  -0.38682388911195E0
+-0.38857261742762E0  -0.39031887055825E0  -0.39206265070197E0  -0.39380396005599E0  -0.39554280082266E0
+-0.39727917520313E0  -0.39901308539158E0  -0.40074453357954E0  -0.40247352195765E0  -0.40420005271907E0
+-0.40592412805525E0  -0.4076457501552E0  -0.40936492120512E0  -0.41108164338791E0  -0.41279591889354E0
+-0.41450774991035E0  -0.4162171386246E0  -0.41792408721485E0  -0.41962859786102E0  -0.42133067274176E0
+-0.42303031403427E0  -0.42472752391234E0  -0.42642230455739E0  -0.42811465814829E0  -0.42980458685967E0
+-0.43149209286131E0  -0.43317717832303E0  -0.43485984541519E0  -0.43654009630678E0  -0.43821793316541E0
+-0.43989335815651E0  -0.4415663734427E0  -0.44323698119036E0  -0.44490518356577E0  -0.44657098273503E0
+-0.44823438085459E0  -0.44989538008195E0  -0.45155398257471E0  -0.45321019049058E0  -0.4548640059865E0
+-0.45651543121504E0  -0.45816446832708E0  -0.45981111947332E0  -0.46145538680945E0  -0.46309727249028E0
+-0.46473677866241E0  -0.46637390747024E0  -0.46800866105737E0  -0.46964104157015E0  -0.47127105115293E0
+-0.47289869194773E0  -0.47452396609431E0  -0.47614687572931E0  -0.4777674229954E0  -0.47938561003328E0
+-0.48100143898134E0  -0.48261491197193E0  -0.48422603113786E0  -0.48583479861149E0  -0.48744121652408E0
+-0.4890452870057E0  -0.49064701218447E0  -0.49224639418612E0  -0.49384343513809E0  -0.49543813716889E0
+-0.49703050240698E0  -0.49862053297252E0  -0.5002082309866E0  -0.50179359856898E0  -0.50337663783688E0
+-0.5049573509037E0  -0.50653573988982E0  -0.50811180691539E0  -0.50968555409981E0  -0.51125698355135E0
+-0.51282609737984E0  -0.51439289769549E0  -0.51595738660845E0  -0.51751956622761E0  -0.51907943865889E0
+-0.52063700600669E0  -0.52219227037515E0  -0.52374523387048E0  -0.52529589859773E0  -0.52684426665702E0
+-0.52839034014719E0  -0.52993412116638E0  -0.5314756118116E0  -0.53301481417895E0  -0.53455173036259E0
+-0.53608636245505E0  -0.53761871254524E0  -0.53914878272879E0  -0.54067657509914E0  -0.5422020917467E0
+-0.54372533475549E0  -0.54524630620941E0  -0.5467650081941E0  -0.54828144279418E0  -0.54979561209304E0
+-0.55130751816991E0  -0.55281716310196E0  -0.55432454896934E0  -0.55582967785325E0  -0.55733255183527E0
+-0.55883317298666E0  -0.56033154337998E0  -0.56182766508704E0  -0.56332154017943E0  -0.56481317072694E0
+-0.56630255879852E0  -0.56778970646152E0  -0.56927461578176E0  -0.57075728882722E0  -0.57223772766484E0
+-0.57371593435716E0   -0.575191910964E0  -0.57666565954508E0  -0.57813718215848E0  -0.5796064808599E0
+-0.58107355770571E0  -0.58253841475529E0  -0.58400105406752E0   -0.585461477693E0  -0.58691968768146E0
+-0.5883756860819E0  -0.58982947494454E0  -0.59128105631773E0  -0.59273043224799E0  -0.59417760478037E0
+-0.59562257595735E0  -0.59706534782488E0  -0.59850592242703E0  -0.59994430180528E0  -0.60138048799715E0
+-0.60281448303944E0  -0.60424628896975E0  -0.60567590782464E0  -0.60710334163943E0  -0.60852859244462E0
+-0.60995166226831E0  -0.61137255314323E0  -0.61279126710308E0  -0.61420780618213E0  -0.61562217240216E0
+-0.61703436778663E0  -0.61844439435913E0  -0.61985225414437E0  -0.62125794916535E0  -0.62266148144212E0
+-0.62406285299324E0  -0.62546206583621E0  -0.62685912199071E0  -0.62825402347504E0  -0.62964677230358E0
+-0.63103737048863E0  -0.63242582004182E0  -0.63381212297407E0  -0.63519628129521E0  -0.63657829701333E0
+-0.63795817213441E0  -0.63933590866123E0  -0.64071150860204E0  -0.6420849739637E0  -0.64345630675123E0
+ -0.644825508962E0  -0.64619258259406E0  -0.64755752964561E0  -0.64892035211384E0  -0.65028105199332E0
+-0.6516396312815E0  -0.65299609197418E0  -0.6543504360642E0  -0.65570266554086E0  -0.65705278239256E0
+-0.65840078860875E0  -0.6597466861776E0  -0.66109047708577E0  -0.66243216331632E0  -0.6637717468503E0
+-0.66510922967164E0  -0.66644461376403E0  -0.66777790111022E0  -0.66910909368698E0  -0.67043819347168E0
+-0.67176520244009E0  -0.67309012256635E0  -0.67441295582337E0  -0.6757337041834E0  -0.67705236961679E0
+-0.67836895409292E0  -0.6796834595835E0  -0.68099588805915E0  -0.68230624148538E0  -0.68361452182577E0
+-0.6849207310431E0  -0.68622487110034E0  -0.6875269439591E0  -0.68882695157904E0  -0.69012489591776E0
+-0.69142077892987E0  -0.69271460257505E0  -0.69400636881125E0  -0.69529607959426E0  -0.6965837368739E0
+-0.69786934259999E0  -0.69915289872279E0  -0.70043440719155E0  -0.70171386995437E0  -0.70299128895648E0
+-0.70426666614122E0  -0.70554000345313E0  -0.70681130283773E0  -0.7080805662406E0  -0.7093477955989E0
+-0.71061299285018E0  -0.71187615993109E0  -0.7131372987775E0  -0.7143964113219E0  -0.71565349950056E0
+-0.71690856524929E0  -0.71816161050318E0  -0.71941263718907E0  -0.72066164723456E0  -0.72190864256695E0
+-0.7231536251131E0  -0.72439659679853E0  -0.72563755954655E0  -0.72687651527892E0  -0.72811346591677E0
+-0.72934841338266E0  -0.73058135959803E0  -0.73181230647995E0  -0.73304125594413E0  -0.73426820990546E0
+-0.7354931702778E0  -0.73671613897369E0  -0.73793711790446E0  -0.73915610898026E0  -0.74037311410898E0
+-0.74158813520022E0  -0.74280117416196E0  -0.7440122329004E0  -0.74522131331861E0  -0.7464284173191E0
+-0.74763354680348E0  -0.74883670367224E0  -0.75003788982482E0  -0.75123710715784E0  -0.75243435756591E0
+-0.75362964294526E0  -0.75482296519269E0  -0.75601432620493E0  -0.75720372787078E0  -0.75839117207935E0
+-0.75957666071913E0  -0.76076019567912E0   -0.761941778847E0  -0.76312141210748E0  -0.76429909734382E0
+-0.76547483643798E0  -0.76664863127337E0  -0.76782048373154E0  -0.76899039569206E0  -0.77015836903284E0
+-0.77132440563192E0  -0.77248850736284E0  -0.77365067609791E0  -0.77481091370962E0  -0.77596922207284E0
+-0.7771256030613E0  -0.77828005854306E0  -0.77943259038508E0  -0.7805832004535E0  -0.78173189061428E0
+-0.78287866273231E0  -0.78402351867005E0  -0.78516646028821E0  -0.78630748944421E0  -0.78744660800152E0
+-0.78858381782095E0  -0.78971912076068E0  -0.79085251867455E0  -0.79198401341652E0  -0.79311360683937E0
+-0.79424130079464E0  -0.79536709713257E0  -0.79649099770253E0  -0.79761300435141E0  -0.79873311892739E0
+-0.7998513432785E0  -0.80096767925289E0  -0.80208212869088E0  -0.8031946934333E0  -0.80430537532042E0
+-0.80541417619263E0  -0.80652109788919E0  -0.80762614224618E0  -0.80872931109825E0  -0.80983060627881E0
+-0.81093002962386E0  -0.81202758296779E0  -0.81312326814133E0  -0.81421708697313E0  -0.81530904129084E0
+-0.81639913292229E0  -0.8174873636941E0  -0.81857373543088E0  -0.8196582499547E0  -0.82074090908521E0
+-0.82182171464585E0  -0.82290066845861E0  -0.82397777234387E0  -0.82505302811731E0  -0.82612643759506E0
+-0.82719800259118E0  -0.82826772491815E0  -0.82933560638564E0  -0.83040164880838E0  -0.83146585399892E0
+-0.83252822376662E0  -0.83358875991667E0  -0.83464746425331E0  -0.83570433858273E0  -0.83675938470978E0
+-0.83781260443776E0  -0.83886399956625E0  -0.83991357189334E0  -0.84096132321885E0  -0.84200725534222E0
+-0.84305137006192E0  -0.84409366917163E0  -0.84513415446513E0  -0.84617282773475E0  -0.84720969077129E0
+-0.84824474536374E0  -0.84927799330197E0  -0.85030943637431E0  -0.8513390763677E0  -0.85236691506765E0
+-0.85339295425894E0  -0.85441719572411E0  -0.85543964124423E0  -0.85646029259912E0  -0.85747915156846E0
+-0.85849621993086E0  -0.85951149946275E0  -0.86052499193823E0  -0.86153669912879E0  -0.8625466228103E0
+-0.8635547647571E0  -0.86456112674153E0  -0.86556571053019E0  -0.86656851788926E0  -0.86756955058617E0
+-0.8685688103877E0  -0.86956629905972E0  -0.87056201836326E0  -0.87155597005826E0  -0.87254815590559E0
+-0.87353857766703E0  -0.87452723710354E0  -0.87551413597054E0  -0.87649927602325E0  -0.8774826590158E0
+-0.87846428670089E0  -0.87944416082886E0  -0.88042228315187E0  -0.88139865542136E0  -0.88237327938761E0
+-0.88334615679671E0  -0.88431728939477E0  -0.88528667892629E0  -0.88625432713427E0  -0.88722023576058E0
+-0.88818440654605E0  -0.88914684122985E0  -0.89010754155029E0  -0.89106650924647E0  -0.89202374605621E0
+-0.8929792537142E0  -0.89393303395374E0  -0.8948850885072E0  -0.89583541910595E0  -0.89678402748042E0
+-0.89773091535909E0  -0.89867608446861E0  -0.89961953653286E0  -0.90056127328012E0  -0.90150129643687E0
+-0.90243960772733E0  -0.90337620887068E0  -0.9043111015859E0  -0.90524428759226E0  -0.90617576860795E0
+-0.90710554634978E0  -0.90803362253286E0  -0.90895999887066E0  -0.9098846770767E0  -0.91080765886421E0
+-0.9117289459461E0  -0.91264854002989E0  -0.9135664428227E0  -0.91448265603096E0  -0.91539718136133E0
+-0.91631002051937E0  -0.91722117520758E0  -0.91813064712688E0  -0.91903843797671E0  -0.91994454945935E0
+-0.92084898327542E0  -0.9217517411222E0  -0.9226528246945E0  -0.92355223568697E0  -0.92444997579225E0
+-0.92534604670127E0  -0.92624045010471E0  -0.92713318769499E0  -0.92802426116343E0  -0.92891367219656E0
+-0.92980142247966E0  -0.93068751369708E0  -0.93157194753343E0  -0.93245472567211E0  -0.93333584979415E0
+-0.93421532157874E0  -0.93509314270267E0  -0.93596931484637E0  -0.93684383968809E0  -0.93771671890414E0
+-0.93858795416778E0  -0.93945754715193E0  -0.94032549952813E0  -0.94119181296666E0  -0.94205648913659E0
+-0.94291952970618E0  -0.94378093634195E0  -0.9446407107101E0  -0.9454988544761E0  -0.94635536930463E0
+-0.94721025685701E0  -0.94806351879402E0  -0.94891515677531E0  -0.94976517245934E0  -0.95061356750357E0
+-0.9514603435637E0  -0.95230550229405E0  -0.95314904534763E0  -0.95399097437856E0  -0.95483129103947E0
+-0.95566999698052E0  -0.95650709385017E0  -0.95734258329591E0  -0.95817646696448E0  -0.95900874650161E0
+-0.95983942355135E0  -0.96066849975561E0  -0.96149597675434E0  -0.96232185618961E0  -0.96314613970226E0
+-0.96396882893173E0  -0.96478992551362E0  -0.96560943108318E0  -0.96642734727481E0  -0.96724367572181E0
+-0.96805841805558E0  -0.9688715759084E0  -0.9696831509113E0  -0.97049314469312E0  -0.97130155887973E0
+-0.97210839509574E0  -0.97291365496707E0  -0.97371734011838E0  -0.97451945217293E0  -0.97531999275095E0
+-0.97611896347119E0  -0.97691636595357E0  -0.97771220181757E0  -0.97850647268225E0  -0.97929918016075E0
+-0.98009032586599E0  -0.98087991141077E0  -0.98166793840819E0  -0.98245440847086E0  -0.98323932320629E0
+-0.98402268422074E0  -0.98480449311969E0  -0.98558475151235E0  -0.98636346100613E0  -0.98714062320418E0
+-0.98791623970777E0  -0.98869031211748E0  -0.98946284203328E0  -0.99023383105372E0  -0.99100328077624E0
+-0.99177119279711E0  -0.99253756871095E0  -0.99330241011249E0  -0.99406571859508E0  -0.99482749575083E0
+-0.99558774317034E0  -0.99634646244355E0  -0.99710365515826E0  -0.99785932290094E0  -0.99861346725712E0
+-0.99936608981091E0  -0.10001171921445E1  -0.10008667758405E1  -0.1001614842482E1  -0.10023613936517E1
+-0.10031064309262E1  -0.10038499558817E1  -0.10045919700937E1  -0.10053324751373E1  -0.10060714725848E1
+-0.10068089640104E1  -0.1007544950988E1  -0.1008279435091E1  -0.10090124178854E1  -0.10097439009375E1
+-0.10104738858139E1  -0.10112023740817E1  -0.1011929367307E1  -0.10126548670518E1  -0.10133788748772E1
+-0.10141013923432E1  -0.10148224210115E1  -0.10155419624417E1  -0.10162600181913E1  -0.10169765898161E1
+-0.10176916788712E1  -0.10184052869108E1  -0.10191174154887E1  -0.1019828066156E1  -0.10205372404618E1
+-0.10212449399531E1  -0.10219511661801E1  -0.10226559206912E1  -0.10233592050329E1  -0.10240610207494E1
+-0.10247613693849E1  -0.10254602524807E1  -0.10261576715769E1  -0.10268536282121E1  -0.10275481239263E1
+-0.10282411602571E1  -0.10289327387415E1  -0.10296228609154E1  -0.10303115283147E1  -0.10309987424708E1
+-0.10316845049146E1  -0.10323688171759E1  -0.10330516807853E1  -0.1033733097272E1  -0.10344130681623E1
+-0.10350915949809E1  -0.1035768679251E1  -0.10364443224988E1  -0.10371185262486E1  -0.10377912920219E1
+-0.10384626213374E1  -0.10391325157129E1  -0.10398009766669E1  -0.10404680057166E1  -0.10411336043776E1
+-0.1041797774164E1  -0.10424605165889E1  -0.10431218331645E1  -0.10437817254018E1  -0.10444401948109E1
+-0.10450972428998E1  -0.10457528711757E1  -0.10464070811448E1  -0.10470598743127E1  -0.10477112521838E1
+-0.10483612162604E1  -0.10490097680436E1  -0.10496569090338E1  -0.10503026407312E1  -0.10509469646347E1
+-0.10515898822414E1  -0.10522313950471E1  -0.10528715045472E1  -0.10535102122335E1  -0.10541475195961E1
+-0.1054783428127E1  -0.10554179393186E1  -0.10560510546631E1  -0.10566827756455E1  -0.10573131037509E1
+-0.1057942040464E1  -0.1058569587271E1  -0.10591957456567E1  -0.10598205171024E1  -0.10604439030881E1
+-0.10610659050929E1  -0.10616865245966E1  -0.10623057630773E1  -0.10629236220115E1  -0.1063540102874E1
+-0.10641552071393E1  -0.10647689362797E1  -0.10653812917661E1  -0.10659922750689E1  -0.10666018876584E1
+-0.10672101310027E1  -0.10678170065699E1  -0.10684225158269E1  -0.10690266602396E1  -0.10696294412705E1
+-0.10702308603811E1  -0.10708309190331E1  -0.10714296186867E1  -0.10720269608005E1  -0.10726229468342E1
+-0.10732175782459E1  -0.10738108564921E1  -0.10744027830262E1  -0.10749933593011E1  -0.10755825867693E1
+-0.1076170466882E1  -0.10767570010892E1   -0.107734219084E1  -0.10779260375821E1  -0.10785085427627E1
+-0.1079089707828E1  -0.10796695342231E1  -0.10802480233911E1  -0.10808251767744E1  -0.10814009958141E1
+ -0.108197548195E1  -0.10825486366211E1  -0.10831204612646E1  -0.10836909573164E1  -0.10842601262115E1
+-0.10848279693854E1  -0.10853944882717E1  -0.10859596843031E1  -0.10865235589106E1  -0.10870861135253E1
+-0.10876473495745E1  -0.10882072684849E1  -0.10887658716828E1  -0.10893231605938E1  -0.10898791366417E1
+-0.10904338012502E1  -0.10909871558419E1  -0.10915392018381E1  -0.10920899406585E1  -0.10926393737223E1
+-0.10931875024465E1  -0.10937343282466E1  -0.10942798525365E1  -0.10948240767319E1  -0.10953670022466E1
+-0.10959086304928E1  -0.10964489628806E1  -0.10969880008194E1  -0.10975257457181E1  -0.10980621989843E1
+-0.10985973620246E1  -0.10991312362436E1  -0.10996638230447E1  -0.11001951238313E1  -0.11007251400063E1
+-0.11012538729713E1  -0.11017813241251E1  -0.11023074948661E1  -0.11028323865915E1  -0.11033560006979E1
+-0.11038783385814E1  -0.1104399401635E1  -0.11049191912507E1  -0.11054377088197E1  -0.11059549557343E1
+-0.11064709333858E1  -0.11069856431621E1  -0.11074990864498E1  -0.11080112646344E1  -0.11085221791023E1
+-0.11090318312385E1  -0.11095402224259E1  -0.11100473540454E1  -0.11105532274754E1  -0.11110578440979E1
+-0.11115612052934E1  -0.11120633124406E1  -0.11125641669137E1  -0.11130637700868E1  -0.11135621233342E1
+-0.11140592280299E1  -0.11145550855464E1  -0.11150496972539E1  -0.11155430645215E1  -0.11160351887179E1
+-0.11165260712114E1  -0.11170157133689E1  -0.11175041165562E1  -0.1117991282138E1  -0.1118477211478E1
+-0.11189619059375E1  -0.11194453668772E1  -0.11199275956567E1  -0.11204085936343E1  -0.11208883621665E1
+-0.11213669026119E1  -0.11218442163272E1  -0.11223203046672E1  -0.11227951689844E1  -0.11232688106304E1
+-0.11237412309568E1  -0.11242124313137E1  -0.11246824130502E1  -0.11251511775143E1  -0.11256187260535E1
+-0.11260850600131E1  -0.1126550180737E1  -0.11270140895681E1  -0.11274767878502E1  -0.11279382769263E1
+-0.11283985581366E1  -0.11288576328186E1  -0.11293155023084E1  -0.11297721679449E1  -0.11302276310654E1
+-0.11306818930055E1  -0.11311349550977E1  -0.11315868186736E1  -0.11320374850654E1  -0.11324869556046E1
+-0.11329352316215E1  -0.11333823144436E1  -0.1133828205398E1  -0.11342729058109E1  -0.11347164170074E1
+-0.1135158740311E1  -0.11355998770458E1  -0.11360398285347E1  -0.11364785960991E1  -0.11369161810574E1
+-0.11373525847274E1  -0.1137787808427E1  -0.11382218534725E1  -0.11386547211792E1  -0.11390864128627E1
+-0.11395169298374E1  -0.11399462734156E1  -0.11403744449076E1  -0.11408014456223E1  -0.11412272768698E1
+-0.11416519399585E1  -0.11420754361954E1  -0.11424977668858E1  -0.11429189333335E1  -0.11433389368431E1
+-0.11437577787182E1  -0.11441754602611E1  -0.11445919827715E1  -0.11450073475485E1  -0.11454215558904E1
+-0.11458346090943E1  -0.11462465084561E1  -0.11466572552715E1  -0.11470668508354E1  -0.1147475296441E1
+-0.11478825933795E1  -0.11482887429412E1  -0.11486937464168E1  -0.11490976050961E1  -0.11495003202678E1
+-0.11499018932169E1  -0.11503023252272E1  -0.11507016175838E1  -0.11510997715717E1  -0.1151496788475E1
+-0.1151892669574E1  -0.11522874161491E1  -0.11526810294792E1  -0.11530735108422E1  -0.11534648615137E1
+-0.11538550827712E1  -0.11542441758908E1  -0.11546321421477E1  -0.11550189828134E1  -0.1155404699159E1
+-0.11557892924556E1  -0.11561727639739E1  -0.11565551149841E1  -0.11569363467523E1  -0.11573164605442E1
+-0.11576954576251E1  -0.11580733392608E1  -0.11584501067156E1  -0.11588257612518E1  -0.11592003041303E1
+-0.11595737366115E1  -0.11599460599548E1  -0.11603172754185E1   -0.116068738426E1  -0.11610563877358E1
+-0.11614242871016E1  -0.11617910836109E1  -0.11621567785167E1  -0.11625213730708E1  -0.11628848685246E1
+-0.11632472661281E1  -0.11636085671302E1  -0.11639687727784E1  -0.11643278843193E1  -0.11646859029992E1
+-0.1165042830063E1  -0.11653986667546E1  -0.11657534143164E1  -0.11661070739899E1  -0.11664596470163E1
+-0.1166811134636E1  -0.11671615380876E1  -0.11675108586074E1  -0.11678590974299E1  -0.11682062557923E1
+-0.11685523349302E1  -0.11688973360781E1  -0.11692412604668E1  -0.11695841093268E1  -0.11699258838884E1
+-0.11702665853814E1  -0.11706062150341E1  -0.11709447740736E1  -0.1171282263726E1  -0.11716186852165E1
+-0.11719540397692E1  -0.11722883286071E1  -0.11726215529526E1  -0.1172953714027E1  -0.11732848130507E1
+-0.11736148512426E1  -0.11739438298216E1  -0.11742717500038E1  -0.11745986130039E1  -0.11749244200349E1
+-0.1175249172313E1  -0.11755728710525E1  -0.11758955174654E1  -0.11762171127615E1  -0.11765376581499E1
+-0.11768571548398E1  -0.11771756040392E1  -0.1177493006955E1  -0.11778093647924E1  -0.11781246787555E1
+-0.11784389500483E1  -0.1178752179874E1  -0.11790643694345E1  -0.11793755199306E1  -0.11796856325628E1
+-0.11799947085294E1  -0.11803027490271E1  -0.11806097552506E1  -0.11809157283969E1  -0.11812206696613E1
+-0.1181524580238E1  -0.11818274613191E1  -0.11821293140969E1  -0.11824301397611E1  -0.11827299395004E1
+-0.1183028714502E1  -0.11833264659553E1  -0.11836231950488E1  -0.11839189029678E1  -0.11842135908947E1
+-0.11845072600101E1  -0.11847999114992E1  -0.11850915465451E1  -0.11853821663294E1  -0.11856717720296E1
+-0.11859603648229E1  -0.11862479458872E1  -0.11865345163998E1  -0.11868200775365E1  -0.11871046304715E1
+-0.11873881763785E1  -0.11876707164297E1  -0.11879522517959E1  -0.11882327836467E1  -0.11885123131525E1
+-0.11887908414827E1  -0.11890683698052E1  -0.11893448992858E1  -0.11896204310895E1  -0.11898949663809E1
+-0.11901685063235E1  -0.11904410520796E1  -0.11907126048111E1  -0.11909831656788E1  -0.11912527358422E1
+-0.11915213164598E1  -0.11917889086893E1  -0.11920555136868E1  -0.11923211326076E1  -0.11925857666061E1
+-0.11928494168364E1  -0.11931120844518E1  -0.11933737706035E1  -0.11936344764414E1  -0.11938942031146E1
+-0.11941529517728E1  -0.11944107235645E1  -0.11946675196363E1  -0.11949233411328E1  -0.11951781891973E1
+-0.1195432064975E1  -0.11956849696094E1  -0.11959369042426E1  -0.11961878700149E1  -0.11964378680658E1
+-0.11966868995342E1  -0.11969349655575E1  -0.11971820672724E1  -0.11974282058151E1  -0.11976733823207E1
+-0.11979175979231E1  -0.11981608537554E1  -0.11984031509497E1  -0.11986444906368E1  -0.11988848739468E1
+-0.11991243020087E1  -0.11993627759504E1  -0.11996002968988E1   -0.119983686598E1  -0.12000724843195E1
+-0.12003071530417E1  -0.12005408732693E1  -0.12007736461244E1  -0.12010054727284E1  -0.12012363542023E1
+-0.12014662916668E1  -0.12016952862388E1  -0.12019233390352E1  -0.12021504511721E1  -0.12023766237652E1
+-0.12026018579292E1  -0.12028261547775E1  -0.12030495154228E1  -0.12032719409766E1  -0.12034934325501E1
+-0.12037139912533E1  -0.12039336181948E1  -0.12041523144815E1  -0.12043700812191E1  -0.12045869195145E1
+-0.12048028304728E1  -0.12050178151983E1  -0.12052318747939E1  -0.12054450103625E1  -0.12056572230044E1
+-0.1205868513819E1  -0.12060788839051E1  -0.12062883343609E1  -0.12064968662833E1  -0.12067044807688E1
+-0.12069111789136E1  -0.1207116961813E1  -0.12073218305591E1  -0.12075257862432E1  -0.12077288299566E1
+-0.12079309627913E1  -0.12081321858383E1  -0.12083325001853E1  -0.12085319069193E1  -0.12087304071265E1
+-0.12089280018929E1  -0.12091246923034E1  -0.12093204794418E1  -0.1209515364391E1  -0.12097093482328E1
+-0.12099024320483E1  -0.12100946169178E1  -0.12102859039204E1  -0.12104762941347E1  -0.12106657886387E1
+-0.12108543885079E1  -0.12110420948169E1  -0.12112289086394E1  -0.12114148310501E1  -0.12115998631223E1
+-0.12117840059275E1  -0.12119672605358E1  -0.12121496280165E1  -0.12123311094388E1  -0.12125117058714E1
+-0.1212691418381E1  -0.12128702480324E1  -0.12130481958893E1  -0.1213225263017E1  -0.12134014504797E1
+-0.12135767593404E1  -0.12137511906591E1  -0.12139247454949E1  -0.1214097424908E1  -0.12142692299579E1
+-0.12144401617034E1  -0.12146102211994E1  -0.12147794095005E1  -0.12149477276611E1  -0.12151151767361E1
+-0.12152817577794E1  -0.12154474718424E1  -0.12156123199763E1  -0.12157763032312E1  -0.12159394226562E1
+-0.12161016793001E1  -0.12162630742097E1  -0.12164236084304E1  -0.12165832830064E1  -0.12167420989838E1
+-0.12169000574069E1  -0.12170571593189E1  -0.12172134057614E1  -0.12173687977757E1  -0.12175233364011E1
+-0.12176770226763E1  -0.1217829857639E1  -0.12179818423266E1  -0.12181329777758E1  -0.12182832650215E1
+-0.12184327050976E1  -0.12185812990369E1  -0.12187290478733E1  -0.12188759526395E1  -0.12190220143662E1
+-0.12191672340826E1  -0.12193116128172E1  -0.12194551515981E1  -0.12195978514523E1  -0.1219739713406E1
+-0.1219880738485E1  -0.12200209277146E1  -0.12201602821173E1  -0.12202988027146E1  -0.12204364905267E1
+-0.12205733465763E1  -0.12207093718849E1  -0.1220844567471E1  -0.12209789343514E1  -0.12211124735416E1
+-0.12212451860586E1  -0.12213770729179E1  -0.12215081351339E1  -0.12216383737209E1  -0.12217677896927E1
+-0.12218963840603E1  -0.12220241578334E1  -0.12221511120209E1  -0.12222772476329E1  -0.12224025656782E1
+-0.12225270671636E1  -0.12226507530946E1  -0.1222773624475E1  -0.12228956823107E1  -0.12230169276059E1
+-0.12231373613637E1  -0.12232569845847E1  -0.12233757982685E1  -0.12234938034159E1  -0.1223611001027E1
+-0.12237273921009E1  -0.12238429776341E1  -0.12239577586228E1  -0.12240717360622E1  -0.12241849109465E1
+-0.12242972842682E1  -0.12244088570212E1  -0.1224519630198E1  -0.12246296047897E1  -0.12247387817864E1
+-0.12248471621773E1  -0.12249547469506E1  -0.12250615370934E1  -0.12251675335922E1  -0.12252727374325E1
+-0.12253771495986E1  -0.12254807710749E1  -0.12255836028451E1  -0.1225685645893E1  -0.12257869011982E1
+-0.12258873697401E1  -0.12259870524979E1  -0.12260859504509E1  -0.12261840645768E1  -0.12262813958528E1
+-0.12263779452551E1  -0.12264737137592E1  -0.12265687023382E1  -0.12266629119637E1  -0.1226756343609E1
+-0.12268489982472E1  -0.12269408768513E1  -0.12270319803889E1  -0.12271223098278E1  -0.12272118661354E1
+-0.12273006502797E1  -0.12273886632273E1  -0.12274759059435E1  -0.12275623793929E1  -0.12276480845391E1
+-0.12277330223452E1  -0.12278171937741E1  -0.12279005997862E1  -0.12279832413407E1  -0.12280651193953E1
+-0.12281462349101E1  -0.12282265888435E1  -0.12283061821526E1  -0.12283850157928E1  -0.1228463090719E1
+-0.12285404078851E1  -0.12286169682441E1  -0.12286927727481E1  -0.12287678223485E1  -0.12288421179957E1
+-0.12289156606397E1  -0.12289884512299E1  -0.12290604907151E1  -0.1229131780042E1  -0.12292023201569E1
+-0.12292721120052E1  -0.12293411565312E1  -0.12294094546781E1  -0.12294770073891E1  -0.12295438156064E1
+-0.12296098802715E1  -0.12296752023242E1  -0.12297397827036E1  -0.12298036223483E1  -0.12298667221962E1
+-0.12299290831839E1  -0.12299907062482E1  -0.12300515923254E1  -0.12301117423498E1  -0.12301711572537E1
+-0.12302298379684E1  -0.12302877854261E1  -0.12303450005578E1  -0.12304014842937E1  -0.12304572375633E1
+-0.12305122612949E1  -0.12305665564165E1  -0.12306201238549E1  -0.12306729645369E1  -0.12307250793859E1
+-0.1230776469325E1  -0.12308271352773E1  -0.12308770781661E1  -0.12309262989137E1  -0.12309747984403E1
+-0.12310225776657E1  -0.12310696375088E1  -0.12311159788877E1  -0.12311616027197E1  -0.12312065099215E1
+-0.12312507014091E1  -0.1231294178098E1  -0.12313369409012E1  -0.12313789907309E1  -0.12314203284993E1
+-0.12314609551189E1  -0.12315008715019E1  -0.12315400785567E1  -0.12315785771915E1  -0.12316163683137E1
+-0.12316534528318E1  -0.12316898316531E1  -0.12317255056826E1  -0.12317604758246E1  -0.12317947429822E1
+-0.12318283080592E1  -0.12318611719584E1  -0.1231893335581E1  -0.12319247998273E1  -0.12319555655969E1
+-0.12319856337886E1  -0.12320150053003E1  -0.12320436810292E1  -0.12320716618726E1  -0.12320989487274E1
+-0.12321255424878E1  -0.1232151444047E1  -0.12321766542974E1  -0.12322011741321E1  -0.1232225004443E1
+-0.12322481461206E1  -0.1232270600054E1  -0.12322923671313E1  -0.12323134482412E1  -0.12323338442709E1
+-0.12323535561068E1  -0.12323725846362E1  -0.12323909307463E1  -0.12324085953195E1  -0.12324255792374E1
+-0.12324418833804E1  -0.12324575086318E1  -0.12324724558724E1  -0.12324867259827E1  -0.12325003198426E1
+-0.12325132383322E1  -0.12325254823271E1  -0.12325370527028E1  -0.12325479503344E1  -0.12325581760986E1
+-0.12325677308714E1  -0.12325766155251E1  -0.12325848309308E1  -0.1232592377959E1  -0.12325992574829E1
+-0.12326054703749E1  -0.12326110175041E1  -0.12326158997374E1  -0.12326201179415E1  -0.12326236729835E1
+-0.12326265657293E1  -0.12326287970441E1  -0.1232630367794E1  -0.1232631278845E1  -0.12326315310587E1
+-0.12326311252953E1  -0.12326300624145E1  -0.12326283432789E1  -0.12326259687499E1  -0.12326229396861E1
+-0.1232619256944E1  -0.12326149213786E1  -0.12326099338488E1  -0.12326042952118E1  -0.12325980063231E1
+-0.12325910680351E1  -0.12325834811994E1  -0.12325752466696E1  -0.12325663652984E1  -0.12325568379379E1
+-0.12325466654365E1  -0.12325358486421E1  -0.12325243884036E1  -0.12325122855696E1  -0.12324995409884E1
+-0.12324861555054E1  -0.12324721299663E1  -0.12324574652155E1  -0.1232442162096E1  -0.12324262214494E1
+-0.12324096441185E1  -0.12323924309452E1  -0.12323745827703E1  -0.12323561004338E1  -0.12323369847754E1
+-0.12323172366329E1  -0.12322968568431E1  -0.12322758462415E1  -0.12322542056651E1  -0.12322319359497E1
+-0.12322090379296E1  -0.12321855124378E1  -0.12321613603064E1  -0.12321365823675E1  -0.12321111794528E1
+-0.12320851523926E1  -0.12320585020163E1  -0.12320312291518E1  -0.12320033346276E1  -0.12319748192719E1
+-0.12319456839127E1  -0.12319159293737E1  -0.1231885556478E1  -0.12318545660494E1  -0.1231822958913E1
+-0.12317907358937E1  -0.12317578978118E1  -0.12317244454872E1  -0.12316903797395E1  -0.12316557013887E1
+-0.12316204112536E1  -0.12315845101521E1  -0.12315479989014E1  -0.12315108783176E1  -0.12314731492168E1
+-0.12314348124145E1  -0.12313958687249E1  -0.12313563189601E1  -0.12313161639313E1  -0.12312754044512E1
+-0.12312340413316E1  -0.12311920753834E1  -0.12311495074149E1  -0.12311063382338E1  -0.12310625686486E1
+-0.12310181994672E1  -0.12309732314977E1  -0.12309276655437E1  -0.12308815024089E1  -0.1230834742897E1
+-0.12307873878122E1  -0.12307394379574E1  -0.12306908941342E1  -0.12306417571433E1  -0.12305920277849E1
+-0.12305417068585E1  -0.12304907951627E1  -0.12304392934956E1  -0.12303872026547E1  -0.12303345234368E1
+-0.12302812566374E1  -0.12302274030512E1  -0.12301729634724E1  -0.12301179386947E1  -0.12300623295112E1
+-0.1230006136713E1   -0.122994936109E1  -0.12298920034319E1  -0.12298340645299E1  -0.12297755451743E1
+-0.12297164461526E1  -0.12296567682514E1  -0.12295965122568E1  -0.1229535678955E1  -0.12294742691312E1
+-0.12294122835698E1  -0.12293497230545E1  -0.12292865883682E1  -0.12292228802929E1  -0.12291585996093E1
+-0.1229093747098E1  -0.12290283235392E1  -0.12289623297117E1  -0.12288957663946E1  -0.12288286343663E1
+-0.12287609344048E1  -0.12286926672847E1  -0.12286238337805E1  -0.12285544346663E1  -0.12284844707161E1
+-0.12284139427018E1  -0.12283428513974E1  -0.12282711975759E1  -0.12281989820088E1  -0.12281262054654E1
+-0.12280528687149E1  -0.12279789725254E1  -0.12279045176642E1  -0.12278295048975E1  -0.12277539349933E1
+-0.1227677808718E1  -0.12276011268371E1  -0.12275238901151E1  -0.12274460993174E1  -0.12273677552041E1
+-0.1227288858535E1  -0.12272094100702E1  -0.12271294105731E1  -0.12270488608057E1  -0.12269677615269E1
+-0.12268861134946E1  -0.12268039174667E1  -0.12267211741992E1  -0.12266378844473E1  -0.12265540489665E1
+-0.12264696685121E1  -0.12263847438384E1  -0.12262992756989E1  -0.12262132648466E1  -0.12261267120334E1
+-0.12260396180096E1  -0.12259519835242E1  -0.12258638093281E1  -0.12257750961717E1  -0.12256858448051E1
+-0.12255960559732E1  -0.12255057304212E1  -0.12254148688951E1  -0.12253234721407E1  -0.12252315409017E1
+-0.12251390759237E1  -0.12250460779512E1  -0.12249525477272E1  -0.12248584859922E1  -0.12247638934867E1
+-0.12246687709505E1  -0.12245731191224E1  -0.12244769387402E1  -0.12243802305437E1  -0.12242829952718E1
+-0.12241852336612E1  -0.12240869464471E1  -0.12239881343639E1  -0.1223888798147E1  -0.12237889385303E1
+-0.12236885562472E1  -0.12235876520294E1  -0.12234862266078E1  -0.12233842807139E1  -0.12232818150783E1
+-0.12231788304308E1  -0.12230753275002E1  -0.12229713070144E1  -0.12228667697012E1  -0.12227617162875E1
+-0.12226561475006E1  -0.12225500640641E1  -0.12224434667012E1  -0.12223363561355E1  -0.12222287330916E1
+-0.1222120598293E1  -0.12220119524615E1  -0.12219027963188E1  -0.12217931305859E1  -0.12216829559804E1
+-0.12215722732191E1  -0.12214610830208E1  -0.12213493861048E1  -0.12212371831899E1  -0.12211244749906E1
+-0.12210112622219E1  -0.12208975455984E1  -0.12207833258347E1  -0.12206686036451E1  -0.12205533797417E1
+-0.12204376548359E1  -0.12203214296385E1  -0.12202047048606E1  -0.12200874812121E1  -0.12199697594021E1
+-0.12198515401391E1   -0.121973282413E1  -0.12196136120831E1  -0.1219493904706E1  -0.12193737027045E1
+-0.12192530067818E1  -0.12191318176399E1  -0.12190101359842E1  -0.12188879625192E1  -0.12187652979485E1
+-0.12186421429721E1  -0.12185184982901E1  -0.12183943646027E1   -0.121826974261E1  -0.12181446330112E1
+-0.12180190365038E1  -0.12178929537848E1  -0.12177663855509E1  -0.12176393324984E1  -0.12175117953225E1
+-0.12173837747184E1  -0.12172552713809E1  -0.12171262860037E1  -0.12169968192785E1  -0.12168668718967E1
+-0.12167364445494E1  -0.12166055379271E1  -0.1216474152719E1  -0.12163422896156E1  -0.12162099493067E1
+-0.12160771324802E1  -0.12159438398226E1  -0.12158100720198E1  -0.12156758297577E1  -0.12155411137213E1
+-0.1215405924595E1  -0.12152702630628E1  -0.12151341298081E1  -0.12149975255135E1  -0.12148604508608E1
+-0.12147229065316E1  -0.12145848932057E1  -0.12144464115628E1  -0.12143074622818E1  -0.12141680460413E1
+-0.12140281635188E1  -0.12138878153918E1  -0.12137470023371E1  -0.12136057250307E1  -0.1213463984147E1
+-0.12133217803601E1  -0.12131791143437E1  -0.12130359867714E1  -0.12128923983161E1  -0.12127483496487E1
+-0.12126038414392E1  -0.12124588743582E1  -0.12123134490761E1  -0.12121675662631E1  -0.12120212265872E1
+-0.1211874430716E1  -0.12117271793165E1  -0.12115794730551E1  -0.12114313125978E1  -0.12112826986094E1
+-0.12111336317535E1  -0.12109841126933E1  -0.1210834142093E1  -0.1210683720616E1  -0.12105328489242E1
+-0.12103815276783E1  -0.12102297575389E1  -0.1210077539165E1  -0.12099248732152E1  -0.12097717603473E1
+-0.12096182012201E1  -0.12094641964913E1  -0.12093097468176E1  -0.12091548528548E1  -0.12089995152581E1
+-0.12088437346828E1  -0.12086875117841E1  -0.12085308472146E1  -0.12083737416253E1  -0.12082161956656E1
+-0.12080582099884E1  -0.1207899785245E1  -0.12077409220859E1  -0.12075816211605E1  -0.12074218831176E1
+-0.12072617086054E1  -0.12071010982714E1  -0.12069400527623E1  -0.12067785727242E1  -0.12066166588028E1
+-0.12064543116425E1  -0.12062915318871E1  -0.12061283201793E1  -0.12059646771623E1  -0.12058006034781E1
+-0.12056360997684E1  -0.12054711666758E1  -0.12053058048433E1  -0.12051400149086E1  -0.12049737975084E1
+-0.12048071532786E1  -0.12046400828595E1  -0.12044725868899E1  -0.12043046660061E1  -0.12041363208432E1
+-0.12039675520353E1  -0.12037983602183E1  -0.12036287460275E1  -0.12034587100964E1  -0.12032882530557E1
+-0.12031173755351E1  -0.12029460781668E1  -0.12027743615822E1  -0.12026022264117E1  -0.12024296732854E1
+-0.12022567028338E1  -0.12020833156844E1  -0.12019095124635E1  -0.12017352937964E1  -0.12015606603106E1
+-0.12013856126319E1  -0.12012101513858E1  -0.12010342771968E1  -0.1200857990689E1  -0.12006812924854E1
+-0.12005041832083E1  -0.12003266634796E1  -0.12001487339204E1  -0.11999703951519E1  -0.11997916477935E1
+-0.1199612492464E1  -0.11994329297806E1  -0.11992529603629E1  -0.1199072584829E1  -0.1198891803796E1
+-0.1198710617881E1  -0.11985290277014E1  -0.11983470338703E1  -0.11981646369999E1  -0.1197981837702E1
+-0.11977986365921E1  -0.11976150342841E1   -0.119743103139E1  -0.11972466285205E1  -0.11970618262857E1
+-0.11968766252963E1  -0.11966910261623E1  -0.11965050294925E1  -0.11963186358942E1  -0.11961318459736E1
+-0.11959446603386E1  -0.11957570795961E1  -0.11955691043526E1  -0.11953807352123E1  -0.11951919727793E1
+-0.11950028176577E1  -0.11948132704517E1  -0.11946233317658E1  -0.11944330021996E1  -0.11942422823527E1
+-0.11940511728253E1  -0.11938596742193E1  -0.11936677871351E1  -0.11934755121718E1  -0.11932828499282E1
+-0.11930898010023E1  -0.11928963659902E1  -0.11927025454873E1  -0.11925083400896E1  -0.11923137503932E1
+-0.11921187769931E1  -0.11919234204832E1  -0.11917276814567E1  -0.11915315605067E1  -0.11913350582263E1
+-0.11911381752094E1  -0.11909409120449E1  -0.11907432693218E1  -0.11905452476284E1  -0.11903468475558E1
+-0.11901480696935E1  -0.11899489146296E1  -0.11897493829518E1  -0.11895494752471E1  -0.11893491921019E1
+-0.11891485341021E1  -0.11889475018326E1  -0.11887460958765E1  -0.1188544316815E1  -0.11883421652336E1
+-0.11881396417166E1  -0.11879367468475E1  -0.11877334812061E1  -0.11875298453721E1  -0.11873258399262E1
+-0.1187121465449E1  -0.11869167225208E1  -0.11867116117187E1  -0.11865061336195E1  -0.11863002888006E1
+-0.11860940778391E1  -0.11858875013115E1  -0.11856805597934E1   -0.118547325386E1  -0.11852655840858E1
+-0.11850575510444E1  -0.1184849155309E1  -0.11846403974518E1  -0.11844312780445E1  -0.11842217976574E1
+-0.11840119568625E1  -0.11838017562302E1  -0.11835911963307E1  -0.11833802777335E1  -0.11831690010092E1
+-0.11829573667236E1  -0.11827453754428E1  -0.11825330277327E1  -0.11823203241596E1  -0.11821072652879E1
+-0.11818938516839E1  -0.11816800839138E1  -0.11814659625442E1  -0.11812514881353E1  -0.11810366612478E1
+-0.11808214824437E1  -0.11806059522858E1  -0.11803900713367E1  -0.1180173840155E1  -0.11799572592991E1
+-0.11797403293274E1  -0.11795230508008E1  -0.11793054242792E1  -0.11790874503196E1  -0.11788691294777E1
+-0.11786504623095E1  -0.11784314493702E1  -0.11782120912136E1  -0.11779923883947E1  -0.1177772341469E1
+-0.11775519509925E1  -0.11773312175157E1  -0.11771101415894E1  -0.11768887237645E1  -0.11766669645939E1
+-0.11764448646298E1  -0.11762224244212E1  -0.11759996445168E1  -0.11757765254645E1  -0.11755530678132E1
+-0.11753292721107E1  -0.11751051389041E1  -0.11748806687397E1  -0.11746558621623E1  -0.11744307197191E1
+-0.11742052419568E1  -0.11739794294204E1  -0.11737532826513E1  -0.11735268021902E1  -0.11732999885808E1
+-0.11730728423664E1  -0.11728453640894E1  -0.11726175542898E1  -0.11723894135083E1  -0.11721609422841E1
+-0.11719321411556E1  -0.11717030106592E1  -0.11714735513355E1  -0.11712437637237E1  -0.11710136483615E1
+-0.1170783205784E1  -0.11705524365261E1  -0.11703213411235E1  -0.11700899201114E1  -0.11698581740248E1
+-0.11696261033957E1  -0.11693937087558E1  -0.11691609906377E1  -0.11689279495745E1  -0.11686945860984E1
+-0.11684609007401E1  -0.11682268940302E1  -0.11679925664985E1  -0.11677579186742E1  -0.11675229510863E1
+-0.11672876642622E1  -0.11670520587285E1  -0.11668161350114E1  -0.11665798936381E1  -0.1166343335135E1
+-0.11661064600275E1  -0.11658692688399E1  -0.11656317620954E1  -0.11653939403196E1  -0.11651558040373E1
+-0.11649173537714E1  -0.11646785900414E1  -0.1164439513366E1  -0.11642001242671E1  -0.11639604232656E1
+-0.11637204108811E1  -0.11634800876346E1  -0.11632394540469E1  -0.11629985106356E1  -0.1162757257917E1
+-0.11625156964065E1  -0.11622738266216E1  -0.11620316490786E1  -0.1161789164293E1  -0.11615463727791E1
+-0.11613032750499E1  -0.11610598716209E1  -0.11608161630074E1  -0.1160572149724E1  -0.11603278322798E1
+-0.11600832111844E1  -0.11598382869492E1  -0.11595930600857E1  -0.11593475311047E1  -0.11591017005153E1
+-0.11588555688257E1  -0.11586091365446E1  -0.11583624041812E1  -0.11581153722449E1  -0.1157868041241E1
+-0.11576204116743E1  -0.11573724840497E1  -0.11571242588736E1  -0.11568757366513E1  -0.11566269178868E1
+-0.11563778030833E1  -0.1156128392743E1  -0.11558786873699E1  -0.11556286874674E1  -0.1155378393537E1
+-0.11551278060781E1  -0.11548769255884E1  -0.11546257525699E1  -0.11543742875236E1  -0.11541225309497E1
+-0.11538704833444E1  -0.11536181452036E1  -0.11533655170253E1  -0.11531125993077E1  -0.11528593925487E1
+-0.11526058972425E1  -0.11523521138838E1  -0.11520980429667E1  -0.11518436849854E1  -0.11515890404329E1
+-0.11513341098029E1  -0.11510788935886E1  -0.11508233922823E1  -0.11505676063754E1  -0.11503115363588E1
+-0.1150055182723E1  -0.11497985459578E1  -0.11495416265525E1  -0.11492844249958E1  -0.11490269417752E1
+-0.11487691773789E1  -0.11485111322951E1  -0.11482528070121E1  -0.11479942020153E1  -0.11477353177901E1
+-0.11474761548214E1  -0.11472167135935E1  -0.11469569945891E1  -0.11466969982928E1  -0.11464367251891E1
+-0.11461761757621E1  -0.11459153504932E1  -0.11456542498642E1  -0.11453928743559E1  -0.11451312244482E1
+-0.11448693006196E1  -0.11446071033509E1  -0.11443446331217E1  -0.11440818904109E1  -0.11438188756965E1
+-0.1143555589456E1  -0.11432920321666E1  -0.11430282043046E1  -0.11427641063462E1  -0.11424997387665E1
+-0.11422351020401E1  -0.11419701966414E1  -0.11417050230451E1  -0.11414395817253E1  -0.11411738731546E1
+-0.11409078978053E1  -0.11406416561494E1  -0.11403751486587E1  -0.11401083758052E1  -0.11398413380583E1
+-0.11395740358868E1  -0.11393064697586E1  -0.11390386401441E1  -0.11387705475126E1  -0.11385021923323E1
+-0.11382335750705E1  -0.11379646961945E1  -0.11376955561704E1  -0.11374261554643E1  -0.11371564945416E1
+-0.11368865738666E1  -0.11366163939033E1  -0.11363459551158E1  -0.11360752579679E1  -0.11358043029228E1
+-0.11355330904428E1  -0.11352616209901E1  -0.11349898950262E1  -0.11347179130115E1  -0.11344456754059E1
+ -0.113417318267E1  -0.11339004352639E1  -0.11336274336466E1  -0.11333541782755E1  -0.11330806696069E1
+-0.11328069080994E1  -0.11325328942113E1  -0.11322586284005E1  -0.11319841111216E1  -0.11317093428299E1
+-0.11314343239799E1  -0.11311590550261E1  -0.11308835364214E1  -0.11306077686203E1  -0.11303317520766E1
+-0.11300554872433E1  -0.11297789745716E1  -0.11295022145126E1  -0.11292252075177E1  -0.11289479540379E1
+-0.11286704545238E1  -0.11283927094244E1  -0.11281147191887E1  -0.11278364842651E1  -0.11275580051014E1
+-0.11272792821438E1  -0.11270003158416E1  -0.11267211066434E1  -0.11264416549961E1  -0.11261619613432E1
+-0.1125882026128E1  -0.1125601849796E1  -0.11253214327919E1  -0.11250407755598E1  -0.11247598785429E1
+-0.11244787421838E1  -0.11241973669252E1  -0.11239157532099E1  -0.11236339014808E1  -0.11233518121771E1
+-0.11230694857382E1  -0.11227869226035E1  -0.11225041232131E1  -0.11222210880056E1  -0.11219378174202E1
+-0.11216543118961E1  -0.11213705718721E1  -0.11210865977829E1  -0.11208023900625E1  -0.11205179491481E1
+-0.11202332754776E1  -0.11199483694897E1  -0.11196632316153E1  -0.11193778622861E1  -0.11190922619354E1
+-0.11188064309995E1  -0.11185203699149E1  -0.11182340791117E1  -0.11179475590202E1  -0.11176608100704E1
+-0.11173738326943E1  -0.11170866273225E1  -0.11167991943849E1  -0.11165115343108E1  -0.11162236475284E1
+-0.11159355344678E1  -0.11156471955583E1  -0.11153586312279E1  -0.11150698419022E1  -0.11147808280069E1
+-0.11144915899685E1  -0.1114202128213E1  -0.11139124431656E1  -0.11136225352513E1  -0.11133324048946E1
+-0.11130420525198E1  -0.11127514785511E1  -0.11124606834131E1  -0.11121696675263E1  -0.11118784313114E1
+-0.11115869751897E1  -0.11112952995831E1  -0.11110034049126E1  -0.11107112915983E1  -0.11104189600596E1
+-0.11101264107155E1  -0.11098336439861E1  -0.11095406602913E1  -0.11092474600485E1  -0.11089540436737E1
+-0.11086604115828E1  -0.11083665641928E1  -0.11080725019192E1  -0.1107778225178E1  -0.11074837343853E1
+-0.11071890299578E1  -0.11068941123082E1  -0.1106598981849E1  -0.11063036389929E1  -0.11060080841535E1
+-0.1105712317744E1  -0.11054163401761E1  -0.11051201518611E1  -0.11048237532096E1  -0.11045271446332E1
+-0.11042303265439E1  -0.1103933299351E1  -0.11036360634616E1  -0.11033386192818E1  -0.11030409672216E1
+-0.11027431076898E1  -0.11024450410944E1  -0.11021467678423E1   -0.110184828834E1  -0.11015496029941E1
+-0.11012507122109E1  -0.1100951616397E1  -0.11006523159549E1  -0.11003528112872E1  -0.11000531027973E1
+-0.10997531908898E1  -0.10994530759681E1  -0.10991527584345E1  -0.10988522386906E1  -0.1098551517138E1
+-0.10982505941788E1  -0.10979494702151E1  -0.10976481456465E1  -0.10973466208718E1  -0.10970448962898E1
+-0.10967429722996E1  -0.10964408492996E1  -0.10961385276879E1  -0.10958360078628E1  -0.10955332902219E1
+-0.10952303751619E1  -0.10949272630796E1  -0.10946239543709E1  -0.10943204494302E1  -0.10940167486515E1
+-0.10937128524294E1  -0.10934087611579E1  -0.10931044752298E1  -0.10927999950404E1  -0.10924953209844E1
+-0.10921904534541E1  -0.10918853928393E1  -0.10915801395298E1  -0.10912746939172E1  -0.10909690563917E1
+-0.10906632273435E1  -0.10903572071633E1  -0.10900509962413E1  -0.10897445949665E1  -0.1089438003728E1
+-0.1089131222915E1  -0.10888242529125E1  -0.10885170941052E1  -0.10882097468801E1  -0.1087902211625E1
+-0.1087594488728E1  -0.10872865785729E1  -0.10869784815436E1  -0.10866701980243E1  -0.10863617284003E1
+-0.10860530730566E1  -0.10857442323753E1  -0.1085435206738E1  -0.10851259965255E1  -0.10848166021221E1
+-0.10845070239109E1  -0.10841972622729E1  -0.10838873175878E1  -0.10835771902348E1  -0.10832668805943E1
+-0.10829563890458E1  -0.10826457159684E1  -0.10823348617399E1  -0.10820238267376E1  -0.10817126113397E1
+-0.10814012159242E1  -0.10810896408687E1  -0.1080777886549E1  -0.10804659533402E1  -0.10801538416186E1
+-0.10798415517604E1  -0.10795290841434E1  -0.10792164391379E1  -0.10789036171148E1  -0.10785906184462E1
+-0.10782774435088E1  -0.10779640926782E1  -0.10776505663255E1  -0.10773368648214E1  -0.10770229885368E1
+-0.10767089378429E1  -0.10763947131101E1  -0.10760803147084E1  -0.10757657430074E1  -0.10754509983759E1
+-0.1075136081183E1  -0.10748209917971E1  -0.10745057305862E1  -0.10741902979189E1  -0.10738746941637E1
+-0.10735589196862E1  -0.10732429748513E1  -0.10729268600239E1  -0.10726105755706E1  -0.10722941218568E1
+-0.10719774992476E1  -0.10716607081078E1  -0.10713437488027E1  -0.10710266216944E1  -0.1070709327146E1
+-0.10703918655195E1  -0.10700742371769E1  -0.10697564424789E1  -0.10694384817875E1  -0.10691203554642E1
+-0.10688020638699E1  -0.10684836073645E1  -0.10681649863074E1  -0.10678462010587E1  -0.10675272519784E1
+-0.10672081394282E1  -0.1066888863762E1  -0.10665694253342E1  -0.10662498245014E1  -0.10659300616243E1
+-0.1065610137064E1  -0.10652900511735E1  -0.10649698043057E1  -0.1064649396814E1  -0.10643288290567E1
+-0.10640081013915E1  -0.10636872141717E1  -0.10633661677484E1  -0.10630449624727E1  -0.10627235986991E1
+-0.10624020767801E1  -0.10620803970682E1  -0.1061758559916E1  -0.10614365656771E1  -0.10611144147003E1
+-0.10607921073339E1  -0.10604696439267E1  -0.10601470248305E1  -0.10598242503961E1  -0.10595013209718E1
+-0.10591782369054E1  -0.10588549985435E1  -0.10585316062356E1  -0.10582080603308E1  -0.10578843611758E1
+-0.1057560509115E1  -0.10572365044918E1  -0.10569123476537E1  -0.10565880389474E1  -0.10562635787187E1
+-0.10559389673108E1  -0.10556142050665E1  -0.10552892923303E1  -0.10549642294467E1  -0.10546390167603E1
+-0.10543136546117E1  -0.10539881433415E1  -0.10536624832912E1  -0.10533366748037E1  -0.10530107182213E1
+-0.10526846138837E1  -0.1052358362131E1  -0.10520319633028E1  -0.10517054177382E1  -0.10513787257753E1
+-0.10510518877532E1  -0.10507249040107E1  -0.10503977748859E1  -0.10500705007162E1  -0.10497430818389E1
+-0.10494155185903E1  -0.10490878113062E1  -0.10487599603212E1  -0.10484319659721E1  -0.10481038285953E1
+-0.10477755485263E1  -0.10474471260982E1  -0.10471185616446E1  -0.10467898554987E1  -0.10464610079933E1
+-0.10461320194603E1  -0.1045802890234E1  -0.10454736206482E1  -0.10451442110345E1  -0.10448146617221E1
+-0.10444849730387E1  -0.10441551453176E1  -0.1043825178891E1  -0.10434950740897E1  -0.10431648312405E1
+-0.10428344506697E1  -0.10425039327076E1  -0.10421732776849E1  -0.10418424859321E1  -0.10415115577729E1
+-0.10411804935311E1  -0.10408492935337E1   -0.104051795811E1  -0.10401864875897E1  -0.10398548822953E1
+-0.10395231425499E1  -0.10391912686774E1  -0.10388592610042E1  -0.10385271198561E1  -0.10381948455561E1
+-0.10378624384267E1  -0.10375298987901E1  -0.10371972269695E1  -0.1036864423287E1  -0.10365314880645E1
+-0.10361984216235E1  -0.10358652242843E1  -0.10355318963687E1  -0.10351984381982E1  -0.10348648500932E1
+-0.10345311323717E1  -0.10341972853522E1  -0.10338633093533E1  -0.10335292046933E1  -0.10331949716898E1
+-0.10328606106616E1  -0.10325261219272E1  -0.10321915058034E1  -0.10318567626066E1  -0.10315218926531E1
+-0.10311868962581E1  -0.10308517737359E1  -0.10305165254015E1  -0.10301811515711E1  -0.10298456525607E1
+-0.10295100286837E1  -0.10291742802533E1  -0.10288384075824E1  -0.10285024109837E1  -0.10281662907696E1
+-0.10278300472519E1  -0.10274936807423E1  -0.10271571915509E1  -0.10268205799905E1  -0.10264838463732E1
+ -0.102614699101E1  -0.10258100142106E1  -0.10254729162854E1  -0.10251356975426E1  -0.10247983582902E1
+-0.10244608988356E1  -0.10241233194878E1  -0.10237856205548E1  -0.1023447802344E1  -0.10231098651624E1
+-0.10227718093158E1  -0.10224336351122E1  -0.10220953428595E1  -0.10217569328636E1  -0.1021418405428E1
+-0.10210797608562E1  -0.10207409994531E1  -0.10204021215228E1  -0.10200631273689E1  -0.10197240172961E1
+-0.10193847916086E1  -0.10190454506091E1  -0.10187059945997E1  -0.10183664238822E1  -0.10180267387582E1
+-0.10176869395286E1  -0.10173470264945E1  -0.10170069999567E1  -0.1016666860216E1  -0.1016326607572E1
+-0.10159862423242E1  -0.10156457647716E1  -0.10153051752138E1  -0.10149644739505E1  -0.10146236612793E1
+-0.10142827374972E1  -0.10139417029011E1  -0.1013600557788E1  -0.10132593024539E1  -0.10129179371956E1
+-0.10125764623111E1  -0.10122348780992E1  -0.10118931848532E1  -0.10115513828664E1  -0.10112094724325E1
+-0.1010867453846E1    -0.10105253274E1  -0.10101830933888E1  -0.10098407521069E1  -0.10094983038482E1
+-0.10091557489053E1  -0.10088130875715E1  -0.10084703201386E1  -0.10081274468962E1  -0.10077844681334E1
+-0.10074413841422E1  -0.10070981952144E1  -0.10067549016408E1  -0.10064115037098E1  -0.1006068001709E1
+-0.10057243959288E1  -0.10053806866609E1  -0.10050368741976E1  -0.1004692958822E1  -0.10043489408181E1
+-0.10040048204729E1  -0.1003660598077E1  -0.10033162739215E1  -0.10029718482898E1  -0.10026273214658E1
+-0.10022826937338E1  -0.10019379653815E1  -0.10015931366963E1  -0.1001248207962E1  -0.10009031794611E1
+-0.10005580514762E1  -0.1000212824292E1  -0.99986749819199E0  -0.99952207345943E0  -0.99917655037736E0
+-0.99883092922845E0  -0.99848521029492E0  -0.99813939385889E0  -0.99779348020198E0  -0.99744746960444E0
+-0.99710136234679E0  -0.99675515870876E0  -0.9964088589696E0  -0.99606246340756E0  -0.99571597230386E0
+-0.99536938593901E0  -0.99502270459167E0  -0.99467592853869E0  -0.99432905805646E0  -0.99398209342371E0
+-0.99363503491834E0  -0.9932878828177E0  -0.99294063739823E0  -0.99259329893601E0  -0.99224586770744E0
+-0.99189834398885E0  -0.99155072805682E0  -0.99120302018399E0  -0.99085522064288E0  -0.99050732970782E0
+-0.99015934765453E0  -0.98981127475896E0  -0.98946311129238E0  -0.9891148575259E0  -0.98876651373139E0
+-0.9884180801845E0  -0.98806955716159E0  -0.98772094493164E0  -0.98737224376244E0  -0.98702345392101E0
+-0.98667457568269E0  -0.98632560932111E0  -0.98597655510608E0  -0.9856274133045E0  -0.98527818418179E0
+-0.98492886801083E0  -0.98457946506311E0  -0.98422997560841E0  -0.98388039991168E0  -0.98353073823834E0
+-0.98318099085633E0  -0.98283115803323E0  -0.98248124003575E0  -0.98213123713135E0  -0.98178114958739E0
+-0.98143097766963E0  -0.98108072164272E0  -0.98073038177089E0  -0.98037995831977E0  -0.98002945155462E0
+-0.97967886173979E0  -0.97932818913746E0  -0.97897743400834E0  -0.97862659661796E0  -0.97827567723201E0
+-0.97792467611599E0  -0.97757359352861E0  -0.97722242972976E0  -0.97687118498085E0  -0.97651985954399E0
+-0.97616845367994E0  -0.97581696765034E0  -0.9754654017164E0  -0.97511375613867E0  -0.97476203117646E0
+-0.97441022708975E0  -0.97405834413667E0  -0.97370638257486E0  -0.97335434266149E0  -0.97300222465649E0
+-0.97265002881916E0  -0.97229775540668E0  -0.97194540467502E0  -0.97159297687857E0  -0.97124047227705E0
+-0.97088789112909E0  -0.97053523369148E0  -0.97018250021719E0  -0.96982969095933E0  -0.96947680617368E0
+-0.96912384611545E0  -0.96877081103928E0  -0.96841770119941E0  -0.96806451684965E0  -0.96771125824383E0
+-0.9673579256356E0  -0.9670045192793E0  -0.96665103942559E0  -0.96629748632535E0  -0.96594386023005E0
+-0.96559016139271E0  -0.96523639006593E0  -0.96488254649998E0  -0.96452863094473E0  -0.96417464364987E0
+-0.96382058486704E0  -0.96346645484804E0  -0.96311225384129E0  -0.96275798209369E0  -0.96240363985049E0
+-0.96204922736392E0  -0.96169474488418E0  -0.96134019266004E0  -0.96098557093809E0  -0.9606308799661E0
+-0.9602761199898E0  -0.95992129125437E0  -0.9595663940048E0  -0.95921142848934E0  -0.95885639495521E0
+-0.95850129364785E0  -0.9581461248119E0  -0.9577908886916E0  -0.95743558553255E0  -0.95708021558007E0
+-0.9567247790782E0  -0.95636927626916E0  -0.95601370739486E0  -0.95565807269892E0  -0.95530237242427E0
+-0.95494660681341E0  -0.9545907761092E0  -0.95423488055443E0  -0.95387892039045E0  -0.95352289585793E0
+-0.95316680719719E0  -0.95281065464959E0  -0.95245443845597E0  -0.95209815885648E0  -0.95174181609038E0
+-0.95138541039665E0  -0.95102894201475E0  -0.95067241118365E0  -0.95031581814201E0  -0.94995916312843E0
+-0.94960244638141E0  -0.94924566813848E0  -0.94888882863677E0  -0.94853192811328E0  -0.94817496680456E0
+-0.94781794494656E0  -0.94746086277561E0  -0.94710372052858E0  -0.9467465184423E0  -0.94638925675143E0
+-0.94603193569067E0  -0.94567455549458E0  -0.94531711639746E0  -0.94495961863307E0  -0.94460206243548E0
+-0.94424444803858E0  -0.94388677567571E0  -0.94352904558043E0  -0.94317125798651E0  -0.94281341312616E0
+-0.94245551122992E0  -0.9420975525273E0  -0.9417395372517E0  -0.94138146563569E0  -0.9410233379111E0
+-0.9406651543076E0  -0.94030691505462E0  -0.93994862038307E0  -0.93959027052397E0  -0.93923186570868E0
+-0.9388734061639E0  -0.9385148921169E0  -0.93815632379596E0  -0.93779770143026E0  -0.93743902524785E0
+-0.93708029547714E0  -0.93672151234609E0  -0.93636267608236E0  -0.93600378691347E0  -0.93564484506755E0
+-0.93528585076998E0  -0.93492680424556E0  -0.93456770571885E0  -0.93420855541597E0  -0.93384935356175E0
+-0.93349010038147E0  -0.93313079610081E0  -0.93277144094551E0  -0.9324120351389E0  -0.93205257890454E0
+-0.93169307246581E0  -0.93133351604576E0  -0.93097390986696E0  -0.93061425415228E0  -0.93025454912427E0
+-0.92989479500506E0  -0.92953499201702E0  -0.9291751403823E0  -0.92881524032227E0  -0.92845529205768E0
+-0.92809529580963E0  -0.92773525179769E0  -0.92737516024103E0  -0.92701502135909E0  -0.9266548353729E0
+-0.92629460250301E0  -0.92593432296816E0  -0.92557399698682E0  -0.92521362477738E0  -0.92485320655789E0
+-0.92449274254572E0  -0.92413223295887E0  -0.92377167801562E0  -0.92341107793466E0  -0.92305043293134E0
+-0.92268974322126E0  -0.92232900902024E0  -0.92196823054523E0  -0.92160740801231E0  -0.92124654163723E0
+-0.92088563163557E0  -0.92052467822284E0  -0.92016368161279E0  -0.91980264201934E0  -0.91944155965637E0
+-0.91908043473765E0  -0.91871926747533E0  -0.91835805808503E0  -0.91799680678205E0  -0.91763551377989E0
+-0.91727417928772E0  -0.91691280351392E0  -0.91655138667271E0  -0.91618992897817E0  -0.91582843064387E0
+-0.91546689187856E0  -0.91510531289158E0  -0.91474369389381E0  -0.91438203509672E0  -0.91402033671186E0
+-0.91365859894774E0  -0.91329682201322E0  -0.91293500611732E0  -0.9125731514697E0  -0.91221125827994E0
+-0.91184932675577E0  -0.91148735710448E0  -0.91112534953306E0  -0.91076330425104E0  -0.91040122146782E0
+-0.91003910138985E0  -0.90967694422216E0  -0.90931475016852E0  -0.90895251943806E0  -0.90859025223835E0
+-0.90822794877583E0  -0.9078656092549E0  -0.90750323388058E0  -0.90714082285742E0  -0.90677837638945E0
+-0.90641589468038E0  -0.90605337793591E0  -0.90569082636112E0  -0.90532824015968E0  -0.90496561953462E0
+-0.90460296468906E0  -0.90424027582567E0  -0.90387755314676E0  -0.90351479685463E0  -0.90315200715178E0
+-0.90278918424046E0  -0.90242632832203E0  -0.90206343959762E0  -0.90170051826817E0  -0.90133756453459E0
+-0.90097457859752E0  -0.9006115606572E0  -0.90024851091353E0  -0.89988542956597E0  -0.89952231681459E0
+-0.89915917285906E0  -0.89879599789853E0  -0.89843279213155E0  -0.89806955575645E0  -0.89770628897162E0
+-0.89734299197514E0  -0.89697966496483E0  -0.89661630813805E0  -0.89625292169207E0  -0.8958895058237E0
+-0.8955260607294E0  -0.89516258660539E0  -0.89479908364791E0  -0.89443555205285E0  -0.89407199201587E0
+-0.89370840373254E0  -0.8933447873978E0  -0.89298114320718E0  -0.89261747135607E0  -0.8922537720395E0
+-0.89189004545021E0  -0.89152629178077E0  -0.89116251122523E0  -0.89079870397772E0  -0.89043487023178E0
+-0.89007101018062E0  -0.8897071240178E0  -0.88934321193559E0  -0.88897927412488E0  -0.88861531077601E0
+-0.88825132208154E0  -0.88788730823341E0  -0.88752326942312E0  -0.88715920584123E0  -0.88679511767776E0
+-0.88643100512384E0  -0.88606686837076E0  -0.88570270761045E0  -0.88533852302957E0  -0.88497431481526E0
+-0.88461008315634E0  -0.88424582824332E0  -0.8838815502658E0  -0.88351724941215E0  -0.88315292587078E0
+-0.88278857982984E0  -0.88242421147696E0  -0.88205982100007E0  -0.88169540858574E0  -0.88133097442004E0
+-0.88096651868849E0  -0.88060204157877E0  -0.88023754327795E0  -0.87987302397196E0  -0.87950848384562E0
+-0.87914392308291E0  -0.87877934187064E0  -0.87841474039514E0  -0.87805011884197E0  -0.87768547739374E0
+-0.87732081623289E0  -0.87695613554423E0  -0.87659143551275E0  -0.87622671632335E0  -0.87586197815749E0
+-0.8754972211966E0  -0.87513244562372E0  -0.87476765162311E0  -0.87440283937979E0  -0.87403800907326E0
+-0.87367316088344E0  -0.87330829499087E0  -0.8729434115789E0  -0.8725785108298E0  -0.87221359292455E0
+-0.87184865804401E0  -0.87148370636941E0  -0.87111873807907E0  -0.87075375335123E0  -0.87038875236557E0
+-0.87002373530267E0  -0.86965870234303E0  -0.86929365366451E0  -0.86892858944495E0  -0.86856350986251E0
+-0.86819841509695E0  -0.86783330532823E0  -0.86746818073292E0  -0.86710304148709E0  -0.86673788776653E0
+  -0.86637271975E0  -0.86600753761539E0  -0.86564234153923E0  -0.86527713169712E0  -0.86491190826419E0
+-0.86454667141724E0  -0.86418142133272E0  -0.86381615818626E0  -0.86345088215151E0  -0.86308559340121E0
+-0.86272029211162E0  -0.86235497845903E0  -0.86198965261951E0  -0.86162431476477E0  -0.86125896506712E0
+-0.8608936037001E0  -0.86052823083785E0  -0.86016284665397E0  -0.85979745132119E0  -0.85943204501221E0
+-0.85906662789949E0  -0.85870120015523E0  -0.85833576195213E0  -0.85797031346072E0  -0.85760485485085E0
+-0.85723938629187E0  -0.85687390795837E0  -0.85650842002457E0  -0.85614292266031E0  -0.85577741603324E0
+-0.85541190031042E0  -0.85504637566377E0  -0.8546808422634E0  -0.85431530027908E0  -0.85394974988016E0
+-0.85358419123677E0  -0.85321862451629E0  -0.85285304988566E0  -0.8524874675116E0  -0.85212187756443E0
+-0.85175628021343E0  -0.85139067562626E0  -0.8510250639698E0  -0.85065944541136E0  -0.85029382011724E0
+-0.84992818825347E0  -0.8495625499863E0  -0.84919690548266E0  -0.84883125490966E0  -0.84846559843196E0
+-0.84809993621393E0  -0.84773426841978E0  -0.8473685952163E0  -0.84700291676919E0  -0.84663723324349E0
+-0.84627154480389E0  -0.84590585161639E0  -0.84554015384217E0  -0.84517445164268E0  -0.84480874518084E0
+-0.84444303462219E0  -0.84407732013153E0  -0.84371160187121E0  -0.84334588000359E0  -0.84298015469101E0
+-0.84261442609588E0  -0.84224869438076E0  -0.84188295970685E0  -0.84151722223472E0  -0.8411514821244E0
+-0.8407857395379E0  -0.84041999463609E0  -0.84005424757994E0  -0.83968849853068E0  -0.83932274764974E0
+-0.83895699509652E0  -0.83859124103052E0  -0.83822548561118E0  -0.83785972899713E0  -0.83749397134615E0
+-0.83712821281786E0  -0.83676245357229E0  -0.8363966937699E0  -0.83603093356672E0  -0.83566517311919E0
+-0.83529941258495E0  -0.83493365212318E0  -0.83456789189328E0  -0.83420213205079E0  -0.8338363727513E0
+-0.83347061415055E0  -0.83310485640652E0  -0.83273909967629E0  -0.83237334411609E0  -0.83200758988194E0
+-0.83164183713021E0  -0.8312760860151E0  -0.83091033669062E0  -0.83054458931174E0  -0.83017884403461E0
+-0.82981310101575E0  -0.82944736040778E0  -0.82908162236326E0  -0.82871588703507E0  -0.82835015457945E0
+-0.82798442515227E0  -0.82761869890614E0   -0.827252975993E0  -0.82688725656497E0  -0.82652154077472E0
+-0.82615582877428E0  -0.8257901207158E0  -0.8254244167516E0  -0.8250587170331E0  -0.82469302171294E0
+-0.82432733094362E0  -0.82396164487708E0  -0.82359596366283E0  -0.82323028745084E0  -0.82286461639141E0
+-0.82249895063453E0  -0.82213329032923E0  -0.8217676356275E0  -0.82140198668048E0  -0.82103634363818E0
+-0.82067070664961E0  -0.82030507586508E0  -0.81993945143148E0  -0.81957383349568E0  -0.81920822220497E0
+-0.81884261770932E0  -0.8184770201575E0  -0.81811142969761E0  -0.81774584647752E0  -0.81738027064515E0
+-0.81701470234738E0  -0.81664914173103E0  -0.81628358894302E0  -0.8159180441303E0  -0.81555250744046E0
+-0.81518697901805E0  -0.81482145900726E0  -0.81445594755307E0  -0.8140904448042E0  -0.81372495090955E0
+-0.81335946601263E0  -0.81299399025627E0  -0.81262852378319E0  -0.81226306673988E0  -0.81189761927183E0
+-0.81153218152301E0  -0.8111667536363E0  -0.81080133575317E0    -0.81043592802E0  -0.81007053058262E0
+-0.80970514358533E0  -0.80933976716797E0  -0.80897440147035E0  -0.80860904663631E0  -0.8082437028097E0
+-0.80787837013396E0  -0.8075130487498E0  -0.80714773879779E0  -0.80678244042013E0  -0.80641715375991E0
+-0.80605187896185E0  -0.80568661616306E0  -0.80532136550158E0  -0.80495612711667E0  -0.80459090115131E0
+-0.80422568774729E0  -0.80386048704439E0  -0.8034952991823E0  -0.80313012430075E0  -0.80276496253884E0
+-0.80239981403555E0  -0.80203467892982E0  -0.80166955736043E0  -0.80130444946619E0  -0.80093935538499E0
+-0.80057427525418E0  -0.80020920921167E0  -0.79984415739715E0  -0.79947911995101E0  -0.7991140970087E0
+-0.79874908870537E0  -0.79838409517619E0  -0.79801911655969E0  -0.79765415299284E0  -0.79728920461251E0
+-0.7969242715554E0  -0.79655935395822E0  -0.7961944519568E0  -0.79582956568759E0   -0.795464695286E0
+-0.79509984088538E0  -0.79473500261807E0  -0.79437018062071E0  -0.79400537502963E0  -0.79364058598069E0
+-0.79327581360714E0  -0.7929110580426E0  -0.79254631942121E0  -0.7921815978772E0  -0.79181689354537E0
+-0.79145220655725E0  -0.79108753704449E0  -0.79072288513966E0  -0.79035825097726E0  -0.78999363469138E0
+-0.78962903641389E0  -0.78926445627662E0  -0.78889989441138E0  -0.78853535095026E0  -0.78817082602521E0
+-0.78780631976742E0  -0.78744183230765E0  -0.78707736377612E0  -0.78671291430459E0  -0.78634848402428E0
+-0.78598407306587E0  -0.78561968155927E0  -0.78525530963411E0  -0.78489095742083E0  -0.78452662504974E0
+-0.78416231265087E0  -0.78379802035278E0  -0.78343374828391E0  -0.7830694965735E0  -0.7827052653509E0
+-0.78234105474511E0  -0.78197686488461E0  -0.78161269589812E0  -0.78124854791364E0  -0.7808844210582E0
+-0.78052031545829E0  -0.78015623124224E0  -0.77979216853798E0  -0.77942812747312E0  -0.77906410817416E0
+-0.77870011076729E0  -0.77833613537965E0  -0.77797218213851E0  -0.77760825117167E0  -0.77724434260316E0
+-0.77688045655736E0  -0.77651659315966E0  -0.77615275253677E0  -0.77578893481489E0  -0.77542514011888E0
+-0.7750613685735E0  -0.77469762030346E0  -0.77433389543405E0  -0.77397019409105E0  -0.7736065163977E0
+-0.7732428624765E0  -0.77287923244925E0  -0.77251562644156E0  -0.77215204457775E0  -0.7717884869815E0
+-0.77142495377577E0  -0.77106144508346E0  -0.77069796102771E0  -0.77033450173174E0  -0.76997106731838E0
+-0.76960765790816E0  -0.76924427362119E0  -0.76888091458008E0  -0.76851758090775E0  -0.76815427272685E0
+-0.76779099015798E0  -0.76742773332187E0  -0.76706450233974E0  -0.76670129733325E0  -0.76633811842497E0
+-0.76597496573321E0  -0.76561183937632E0  -0.76524873947317E0  -0.76488566614598E0  -0.7645226195162E0
+-0.76415959970302E0  -0.76379660682525E0  -0.76343364100185E0  -0.76307070235169E0  -0.76270779099326E0
+-0.76234490704523E0  -0.76198205062638E0  -0.76161922185519E0  -0.76125642084988E0  -0.76089364772838E0
+-0.76053090260856E0  -0.76016818560877E0  -0.75980549684795E0  -0.75944283644223E0  -0.75908020450715E0
+-0.75871760115785E0  -0.7583550265129E0  -0.75799248068973E0   -0.757629963805E0  -0.75726747597471E0
+-0.75690501731484E0  -0.75654258794156E0   -0.756180187971E0  -0.75581781751884E0  -0.75545547669949E0
+-0.75509316562685E0  -0.75473088441663E0  -0.75436863318454E0  -0.75400641204601E0  -0.75364422111506E0
+-0.75328206050578E0  -0.75291993033251E0  -0.75255783070973E0  -0.75219576175242E0  -0.75183372357285E0
+-0.75147171628355E0  -0.75110973999726E0  -0.75074779482776E0  -0.75038588088782E0  -0.7500239982909E0
+-0.74966214715039E0  -0.74930032757959E0  -0.74893853969022E0  -0.74857678359465E0  -0.74821505940443E0
+-0.74785336723062E0  -0.74749170718363E0  -0.74713007937577E0  -0.74676848391836E0  -0.74640692092278E0
+ -0.746045390501E0  -0.7456838927658E0  -0.74532242782634E0  -0.7449609957914E0  -0.74459959676953E0
+-0.74423823087297E0  -0.74387689821315E0  -0.74351559889967E0  -0.74315433304105E0   -0.742793100745E0
+-0.7424319021227E0  -0.74207073728463E0  -0.74170960634027E0  -0.74134850939681E0  -0.74098744656145E0
+-0.74062641794325E0  -0.74026542365102E0  -0.73990446379321E0  -0.73954353847792E0  -0.73918264781324E0
+-0.73882179190689E0  -0.73846097086631E0  -0.7381001847993E0  -0.73773943381212E0  -0.73737871801102E0
+-0.73701803750252E0  -0.73665739239399E0  -0.73629678279226E0  -0.73593620880383E0  -0.73557567053499E0
+-0.73521516809192E0  -0.73485470158077E0  -0.73449427110809E0  -0.73413387677886E0  -0.73377351869731E0
+-0.73341319696686E0  -0.73305291169413E0  -0.7326926629847E0  -0.73233245094362E0  -0.73197227567498E0
+-0.73161213728264E0  -0.73125203587148E0  -0.73089197154637E0  -0.73053194441195E0  -0.73017195457069E0
+-0.72981200212519E0  -0.72945208717897E0  -0.72909220983571E0  -0.72873237019828E0  -0.72837256837068E0
+-0.72801280445696E0  -0.72765307855995E0  -0.72729339078042E0  -0.72693374121869E0  -0.72657412997816E0
+-0.72621455716185E0  -0.72585502287238E0  -0.72549552721055E0  -0.72513607027709E0  -0.72477665217383E0
+-0.72441727300282E0  -0.72405793286639E0  -0.72369863186409E0  -0.72333937009573E0  -0.72298014766174E0
+-0.72262096466351E0  -0.72226182120244E0  -0.72190271737779E0  -0.72154365328872E0  -0.7211846290344E0
+-0.72082564471582E0  -0.72046670043374E0  -0.72010779628713E0  -0.71974893237437E0  -0.71939010879359E0
+-0.71903132564454E0  -0.71867258302636E0  -0.71831388103775E0  -0.71795521977683E0  -0.71759659934151E0
+-0.71723801983024E0  -0.71687948134125E0  -0.71652098397256E0  -0.7161625278215E0  -0.71580411298536E0
+-0.71544573956155E0  -0.71508740764739E0  -0.71472911734008E0  -0.71437086873631E0  -0.71401266193239E0
+-0.71365449702515E0  -0.7132963741121E0  -0.71293829329168E0  -0.71258025465791E0  -0.71222225830491E0
+-0.71186430432724E0  -0.71150639282272E0  -0.71114852388804E0  -0.71079069761879E0  -0.71043291411039E0
+ -0.710075173459E0  -0.70971747575746E0  -0.70935982109861E0  -0.70900220957696E0  -0.70864464128882E0
+-0.70828711633011E0  -0.7079296347944E0  -0.70757219677562E0  -0.7072148023676E0  -0.70685745166408E0
+-0.7065001447588E0  -0.70614288174487E0  -0.70578566271511E0  -0.70542848776196E0  -0.70507135697927E0
+-0.7047142704604E0  -0.70435722829816E0  -0.70400023058481E0  -0.70364327741226E0  -0.7032863688735E0
+-0.70292950506135E0  -0.7025726860682E0  -0.70221591198495E0  -0.70185918290264E0  -0.70150249891285E0
+-0.70114586010705E0  -0.70078926657641E0  -0.70043271841218E0  -0.70007621570512E0  -0.69971975854638E0
+-0.6993633470274E0  -0.69900698124059E0  -0.69865066127421E0  -0.69829438721686E0  -0.69793815915768E0
+-0.69758197718829E0  -0.69722584139939E0  -0.69686975188075E0  -0.69651370872204E0  -0.69615771201311E0
+-0.69580176184244E0  -0.69544585829853E0  -0.69509000147031E0  -0.69473419144689E0  -0.69437842831739E0
+-0.69402271216976E0  -0.69366704309175E0  -0.69331142117136E0  -0.69295584649788E0  -0.69260031916081E0
+-0.69224483924698E0  -0.6918894068429E0  -0.69153402203501E0  -0.69117868491155E0  -0.69082339555986E0
+-0.69046815406724E0  -0.69011296052091E0  -0.68975781500795E0  -0.68940271761518E0  -0.68904766842965E0
+-0.68869266753783E0  -0.68833771502487E0  -0.68798281097547E0  -0.68762795547637E0  -0.68727314861425E0
+-0.68691839047557E0  -0.68656368114512E0  -0.6862090207077E0  -0.68585440924887E0  -0.68549984685456E0
+-0.68514533361166E0  -0.68479086960261E0  -0.68443645491022E0  -0.68408208961835E0  -0.68372777381372E0
+-0.68337350758272E0  -0.68301929100858E0  -0.68266512417439E0  -0.68231100716326E0  -0.68195694006016E0
+-0.68160292295015E0  -0.68124895591602E0  -0.6808950390394E0  -0.68054117240056E0  -0.68018735608546E0
+-0.6798335901786E0  -0.67947987476345E0  -0.67912620992138E0  -0.67877259573372E0  -0.67841903228372E0
+-0.67806551965458E0  -0.67771205792937E0  -0.67735864718823E0  -0.6770052875114E0  -0.67665197898082E0
+-0.67629872167907E0  -0.67594551568818E0  -0.67559236108964E0  -0.67523925796544E0  -0.67488620639666E0
+-0.67453320646285E0  -0.67418025824324E0  -0.67382736181921E0  -0.67347451727181E0  -0.67312172468177E0
+-0.67276898412928E0  -0.67241629569443E0  -0.67206365945743E0  -0.67171107549848E0  -0.67135854389823E0
+-0.67100606473499E0  -0.67065363808728E0  -0.67030126403411E0  -0.66994894265534E0  -0.66959667403039E0
+-0.66924445823811E0  -0.66889229535721E0  -0.66854018546632E0  -0.66818812864424E0  -0.66783612497009E0
+-0.66748417452155E0  -0.66713227737572E0  -0.66678043360894E0  -0.66642864330084E0  -0.6660769065302E0
+-0.66572522337492E0  -0.66537359391157E0  -0.66502201821641E0  -0.66467049636768E0  -0.66431902844352E0
+-0.66396761452172E0  -0.66361625467735E0  -0.66326494898551E0  -0.66291369752322E0  -0.66256250036792E0
+-0.66221135759712E0  -0.66186026928568E0  -0.66150923550849E0  -0.66115825634155E0  -0.66080733186232E0
+-0.66045646214912E0  -0.66010564727515E0  -0.65975488731378E0  -0.65940418233882E0  -0.6590535324277E0
+-0.65870293765707E0  -0.65835239810146E0  -0.65800191383488E0  -0.65765148493133E0  -0.65730111146579E0
+-0.65695079351285E0  -0.65660053114675E0  -0.6562503244413E0  -0.65590017347011E0  -0.65555007830733E0
+-0.6552000390268E0  -0.65485005570223E0  -0.65450012840745E0  -0.65415025721645E0  -0.65380044220211E0
+-0.65345068343696E0  -0.65310098099331E0  -0.65275133494459E0  -0.6524017453638E0  -0.65205221232356E0
+-0.65170273589616E0  -0.65135331615332E0  -0.65100395316821E0  -0.65065464701389E0  -0.65030539776294E0
+-0.64995620548593E0  -0.64960707025352E0  -0.64925799213757E0    -0.64890897121E0  -0.64856000754247E0
+-0.64821110120598E0  -0.64786225227122E0  -0.64751346080945E0  -0.64716472689241E0  -0.64681605059233E0
+-0.64646743197853E0  -0.64611887112063E0  -0.64577036808846E0  -0.64542192295294E0  -0.64507353578455E0
+-0.64472520665318E0  -0.64437693562851E0  -0.64402872277987E0  -0.64368056817795E0  -0.64333247189343E0
+-0.64298443399558E0  -0.64263645455261E0  -0.64228853363249E0  -0.64194067130494E0  -0.64159286763889E0
+-0.64124512270326E0  -0.64089743656782E0  -0.64054980930319E0  -0.64020224097628E0  -0.63985473165345E0
+-0.63950728140073E0  -0.63915989028861E0  -0.63881255838642E0  -0.63846528576214E0  -0.63811807248283E0
+-0.6377709186151E0  -0.63742382422776E0  -0.63707678938946E0  -0.63672981416798E0  -0.63638289862842E0
+-0.63603604283558E0  -0.63568924685748E0  -0.63534251076226E0  -0.63499583461779E0  -0.63464921848948E0
+-0.63430266244315E0  -0.63395616654521E0  -0.63360973086243E0  -0.63326335546173E0  -0.63291704040827E0
+-0.6325707857674E0  -0.6322245916046E0  -0.63187845798589E0  -0.63153238497688E0  -0.63118637264306E0
+-0.63084042104974E0  -0.63049453026202E0  -0.63014870034566E0  -0.62980293136681E0  -0.62945722338973E0
+-0.62911157647759E0  -0.62876599069251E0  -0.62842046610117E0  -0.62807500276924E0  -0.62772960076147E0
+-0.62738426014066E0  -0.62703898096904E0  -0.6266937633121E0  -0.62634860723554E0  -0.62600351280499E0
+-0.62565848008081E0  -0.62531350912396E0  -0.62496859999794E0  -0.62462375276741E0  -0.62427896749601E0
+-0.62393424424738E0  -0.6235895830857E0  -0.62324498407401E0  -0.62290044727297E0  -0.6225559727432E0
+-0.62221156054776E0  -0.62186721074925E0  -0.62152292340985E0  -0.62117869859265E0  -0.62083453636088E0
+-0.62049043677625E0  -0.6201463998998E0  -0.61980242579273E0  -0.61945851451656E0  -0.61911466613247E0
+-0.61877088070165E0  -0.61842715828536E0  -0.61808349894446E0  -0.61773990274022E0  -0.61739636973369E0
+-0.6170528999857E0  -0.61670949355763E0  -0.61636615051159E0  -0.61602287090706E0  -0.61567965480254E0
+-0.6153365022555E0  -0.61499341332857E0  -0.61465038808296E0   -0.614307426579E0  -0.61396452887558E0
+-0.61362169503141E0  -0.61327892510699E0  -0.61293621916277E0  -0.61259357725897E0  -0.61225099945295E0
+-0.61190848580223E0  -0.61156603636602E0  -0.61122365120396E0  -0.61088133037514E0  -0.61053907393847E0
+-0.61019688195276E0  -0.60985475447672E0  -0.60951269156904E0  -0.6091706932892E0  -0.60882875969392E0
+-0.60848689083992E0  -0.60814508678407E0  -0.60780334758533E0  -0.60746167330152E0  -0.60712006399079E0
+-0.60677851971134E0  -0.60643704052196E0  -0.60609562647836E0  -0.60575427763683E0  -0.60541299405412E0
+-0.60507177578758E0  -0.6047306228939E0  -0.60438953543021E0  -0.60404851345349E0  -0.60370755702055E0
+-0.60336666618769E0  -0.60302584101133E0  -0.6026850815476E0  -0.60234438785249E0  -0.60200375998204E0
+-0.60166319799177E0  -0.60132270193685E0  -0.60098227187306E0  -0.60064190785684E0  -0.60030160994433E0
+-0.59996137819099E0  -0.59962121265267E0  -0.5992811133849E0  -0.59894108044104E0  -0.59860111387403E0
+-0.59826121373955E0  -0.59792138009368E0  -0.59758161299234E0  -0.59724191248925E0  -0.59690227863863E0
+-0.59656271149485E0  -0.59622321111246E0  -0.59588377754609E0  -0.59554441084933E0  -0.59520511107584E0
+-0.59486587827925E0  -0.59452671251323E0  -0.59418761383112E0  -0.59384858228655E0  -0.59350961793298E0
+-0.59317072082332E0  -0.59283189101229E0  -0.59249312855503E0  -0.59215443350421E0  -0.59181580591036E0
+-0.59147724582289E0  -0.59113875329726E0  -0.59080032838778E0  -0.59046197114803E0  -0.59012368162928E0
+-0.58978545988367E0  -0.58944730596302E0  -0.58910921991893E0  -0.58877120180256E0  -0.58843325166698E0
+-0.58809536956476E0  -0.58775755554773E0  -0.5874198096671E0  -0.58708213197381E0  -0.58674452252005E0
+-0.58640698135787E0  -0.58606950853887E0  -0.58573210411306E0  -0.58539476813054E0  -0.58505750064242E0
+-0.58472030169972E0  -0.58438317135312E0  -0.58404610965365E0  -0.58370911665211E0  -0.58337219239916E0
+-0.58303533694538E0  -0.5826985503418E0  -0.58236183263769E0  -0.58202518388243E0  -0.58168860412563E0
+-0.58135209341768E0  -0.58101565180852E0  -0.58067927934788E0  -0.58034297608542E0  -0.58000674207066E0
+-0.57967057735306E0  -0.57933448198218E0  -0.57899845600699E0  -0.57866249947611E0  -0.57832661243746E0
+-0.57799079494113E0  -0.57765504703684E0  -0.57731936877367E0  -0.5769837601989E0  -0.57664822135925E0
+-0.57631275230451E0  -0.5759773530846E0  -0.57564202374936E0  -0.57530676434484E0  -0.57497157491768E0
+-0.57463645551583E0  -0.57430140618792E0  -0.57396642698179E0  -0.57363151794579E0  -0.57329667912866E0
+-0.57296191057809E0  -0.57262721233926E0  -0.57229258445663E0  -0.57195802697904E0  -0.57162353995514E0
+-0.57128912343315E0  -0.57095477745936E0  -0.57062050208081E0  -0.57028629734406E0  -0.56995216329538E0
+-0.56961809998095E0  -0.56928410744723E0  -0.56895018574036E0  -0.56861633490654E0  -0.56828255499228E0
+-0.56794884604386E0  -0.56761520810733E0  -0.56728164122857E0  -0.56694814545339E0  -0.56661472082797E0
+-0.56628136739894E0  -0.56594808521117E0  -0.56561487430874E0  -0.56528173473473E0  -0.56494866653654E0
+-0.56461566976026E0  -0.56428274445147E0  -0.56394989065489E0  -0.5636171084155E0  -0.56328439777813E0
+-0.56295175878768E0  -0.56261919148898E0  -0.56228669592548E0  -0.56195427214034E0  -0.56162192017819E0
+-0.56128964008415E0  -0.56095743190306E0  -0.56062529567878E0  -0.56029323145525E0  -0.5599612392765E0
+-0.55962931918675E0  -0.55929747123051E0  -0.55896569545074E0  -0.55863399189043E0  -0.55830236059262E0
+-0.55797080160072E0  -0.55763931495742E0  -0.55730790070643E0  -0.55697655889175E0  -0.55664528955789E0
+-0.55631409274613E0  -0.55598296849836E0  -0.55565191685701E0  -0.55532093786535E0  -0.55499003156595E0
+-0.55465919800172E0  -0.5543284372155E0  -0.55399774924998E0  -0.55366713414716E0  -0.55333659194943E0
+-0.55300612269847E0  -0.55267572643568E0  -0.55234540320197E0  -0.55201515304018E0  -0.55168497599265E0
+-0.55135487210113E0  -0.55102484140655E0  -0.55069488394947E0  -0.55036499977215E0  -0.55003518891665E0
+-0.54970545142478E0  -0.54937578733651E0  -0.54904619669207E0  -0.54871667953244E0  -0.54838723589861E0
+-0.54805786583107E0  -0.5477285693713E0  -0.54739934656049E0  -0.54707019743944E0  -0.5467411220485E0
+-0.54641212042888E0  -0.54608319261949E0  -0.54575433865917E0  -0.54542555858708E0  -0.54509685244456E0
+-0.54476822027204E0  -0.54443966210969E0  -0.54411117799761E0  -0.54378276797622E0  -0.54345443208431E0
+-0.54312617036106E0  -0.54279798284569E0  -0.54246986957747E0  -0.54214183059535E0  -0.54181386593869E0
+-0.54148597564655E0  -0.54115815975794E0  -0.54083041831259E0  -0.54050275135068E0  -0.54017515891013E0
+-0.53984764102846E0  -0.53952019774298E0  -0.53919282909334E0  -0.53886553511846E0  -0.53853831585678E0
+-0.5382111713463E0  -0.53788410162452E0  -0.53755710673065E0  -0.53723018670398E0  -0.53690334158311E0
+-0.53657657140363E0  -0.53624987620097E0  -0.5359232560138E0  -0.53559671088101E0  -0.53527024084116E0
+-0.53494384593122E0  -0.53461752618865E0  -0.53429128165072E0  -0.53396511235455E0  -0.53363901833734E0
+-0.53331299963584E0  -0.53298705628678E0  -0.53266118832686E0  -0.53233539579301E0  -0.53200967872185E0
+-0.53168403715021E0  -0.53135847111476E0  -0.53103298065192E0   -0.530707565799E0  -0.53038222659373E0
+ -0.530056963072E0  -0.52973177526844E0  -0.52940666321737E0  -0.52908162695571E0  -0.52875666651935E0
+-0.52843178194427E0   -0.528106973267E0   -0.527782240524E0  -0.52745758375092E0  -0.52713300298344E0
+-0.52680849825747E0  -0.52648406960734E0  -0.52615971706739E0  -0.52583544067282E0  -0.52551124045927E0
+-0.52518711646157E0  -0.52486306871565E0  -0.52453909725747E0  -0.52421520212228E0  -0.52389138334348E0
+-0.52356764095461E0  -0.52324397499057E0  -0.52292038548611E0  -0.52259687247568E0  -0.52227343599399E0
+-0.52195007607546E0  -0.52162679275463E0  -0.52130358606607E0  -0.52098045604532E0  -0.52065740272448E0
+-0.52033442613591E0  -0.52001152631294E0  -0.51968870329133E0  -0.51936595710681E0  -0.51904328779195E0
+-0.51872069537923E0  -0.51839817990122E0  -0.51807574139246E0  -0.51775337988707E0  -0.51743109541815E0
+-0.51710888801832E0  -0.51678675772004E0  -0.51646470455684E0  -0.51614272856187E0  -0.51582082976812E0
+-0.51549900820831E0  -0.51517726391484E0  -0.51485559692095E0  -0.51453400725996E0  -0.51421249496521E0
+-0.51389106006741E0  -0.51356970259723E0  -0.51324842258737E0  -0.51292722007136E0  -0.5126060950828E0
+-0.51228504765267E0  -0.51196407781241E0  -0.51164318559387E0  -0.5113223710297E0  -0.51100163415283E0
+-0.51068097499405E0  -0.51036039358412E0  -0.51003988995389E0  -0.50971946413551E0  -0.50939911616026E0
+-0.50907884605997E0  -0.50875865386663E0  -0.50843853961274E0  -0.5081185033282E0  -0.5077985450436E0
+-0.50747866478958E0  -0.50715886259687E0  -0.50683913849526E0  -0.50651949251664E0  -0.50619992469275E0
+-0.50588043505508E0  -0.50556102363322E0  -0.5052416904571E0  -0.50492243555721E0  -0.50460325896417E0
+-0.50428416070848E0  -0.50396514082017E0  -0.5036461993294E0  -0.50332733626615E0  -0.50300855166017E0
+-0.50268984554042E0  -0.50237121793798E0  -0.50205266888392E0  -0.50173419840897E0  -0.50141580654099E0
+-0.50109749330819E0  -0.50077925874027E0  -0.50046110286715E0  -0.50014302571828E0  -0.49982502732338E0
+-0.49950710771204E0  -0.49918926691367E0  -0.49887150495742E0  -0.49855382187302E0  -0.49823621768854E0
+-0.49791869243207E0  -0.49760124613181E0  -0.49728387881711E0  -0.49696659051648E0  -0.49664938125906E0
+-0.49633225107409E0  -0.49601519999102E0  -0.49569822803748E0  -0.49538133524157E0  -0.49506452163143E0
+-0.49474778723531E0  -0.49443113208141E0  -0.49411455619751E0  -0.49379805961098E0  -0.49348164234941E0
+-0.49316530444247E0  -0.49284904592031E0  -0.49253286680948E0  -0.49221676713582E0  -0.49190074692493E0
+ -0.491584806206E0  -0.49126894500692E0  -0.49095316335541E0  -0.49063746127895E0  -0.49032183880518E0
+-0.49000629596126E0  -0.48969083277442E0  -0.4893754492718E0  -0.48906014548025E0  -0.48874492142658E0
+-0.48842977713768E0  -0.48811471264044E0  -0.4877997279617E0  -0.48748482312788E0  -0.48716999816497E0
+-0.48685525309986E0  -0.48654058796025E0  -0.48622600277461E0  -0.48591149756753E0  -0.48559707236417E0
+-0.48528272719004E0  -0.48496846207207E0  -0.48465427703644E0  -0.48434017210948E0  -0.4840261473175E0
+-0.48371220268677E0  -0.48339833824309E0  -0.48308455401257E0  -0.48277085002078E0  -0.48245722629289E0
+-0.48214368285387E0  -0.48183021972957E0  -0.48151683694526E0  -0.48120353452638E0  -0.4808903124994E0
+-0.48057717089118E0  -0.48026410972612E0  -0.4799511290283E0  -0.47963822882173E0  -0.4793254091326E0
+-0.47901266998665E0  -0.47870001140868E0  -0.47838743342279E0  -0.47807493605231E0  -0.47776251932371E0
+-0.47745018326304E0  -0.47713792789555E0  -0.47682575324414E0  -0.4765136593317E0  -0.47620164618342E0
+-0.47588971382448E0  -0.47557786227993E0  -0.4752660915732E0  -0.47495440172765E0  -0.47464279276775E0
+-0.47433126471857E0  -0.47401981760581E0  -0.4737084514518E0  -0.47339716627944E0  -0.47308596211205E0
+-0.47277483897422E0    -0.47246379689E0  -0.47215283588309E0  -0.4718419559771E0  -0.47153115719558E0
+-0.47122043956225E0  -0.47090980310105E0  -0.47059924783501E0  -0.47028877378661E0  -0.46997838097751E0
+-0.4696680694325E0  -0.46935783917559E0  -0.46904769023031E0  -0.46873762261911E0  -0.46842763636475E0
+-0.46811773149012E0  -0.46780790801804E0  -0.46749816597128E0  -0.46718850537229E0  -0.46687892624316E0
+-0.46656942860679E0  -0.46626001248633E0  -0.46595067790531E0  -0.4656414248852E0  -0.46533225344777E0
+-0.46502316361515E0  -0.46471415541027E0  -0.4644052288562E0  -0.46409638397431E0  -0.46378762078579E0
+-0.46347893931184E0  -0.46317033957563E0  -0.46286182159969E0  -0.46255338540608E0  -0.46224503101664E0
+-0.46193675845383E0  -0.46162856773821E0  -0.46132045889052E0  -0.46101243193203E0  -0.46070448688506E0
+-0.46039662377161E0  -0.46008884261297E0  -0.45978114343044E0  -0.4594735262453E0  -0.45916599107902E0
+-0.45885853795324E0  -0.45855116688877E0  -0.45824387790609E0  -0.45793667102531E0  -0.45762954626822E0
+-0.45732250365606E0  -0.45701554320982E0  -0.4567086649501E0  -0.4564018688973E0  -0.45609515507256E0
+-0.45578852349703E0  -0.45548197419175E0  -0.45517550717617E0  -0.45486912246967E0  -0.45456282009296E0
+-0.45425660006702E0  -0.45395046241277E0  -0.45364440715004E0  -0.45333843429874E0  -0.45303254387906E0
+-0.45272673591171E0  -0.45242101041782E0  -0.4521153674163E0  -0.45180980692606E0  -0.45150432896615E0
+-0.45119893355753E0  -0.45089362072067E0  -0.45058839047517E0  -0.45028324284035E0  -0.44997817783532E0
+-0.44967319548043E0  -0.44936829579596E0  -0.44906347880134E0  -0.44875874451497E0  -0.44845409295493E0
+-0.44814952414128E0  -0.44784503809366E0  -0.44754063483151E0  -0.44723631437418E0  -0.44693207674142E0
+-0.44662792195181E0  -0.4463238500236E0  -0.44601986097476E0  -0.44571595482506E0  -0.44541213159368E0
+-0.44510839129953E0  -0.44480473396114E0  -0.4445011595968E0  -0.44419766822568E0  -0.44389425986701E0
+-0.4435909345397E0  -0.44328769226103E0  -0.44298453304818E0  -0.44268145691995E0  -0.44237846389532E0
+-0.44207555399308E0  -0.44177272723118E0  -0.44146998362759E0  -0.44116732320056E0  -0.44086474596853E0
+-0.44056225195031E0  -0.44025984116299E0  -0.43995751362377E0  -0.43965526935003E0  -0.43935310836024E0
+-0.43905103067247E0  -0.43874903630443E0  -0.43844712527369E0  -0.43814529759768E0  -0.43784355329453E0
+-0.43754189238253E0  -0.43724031487898E0  -0.43693882080036E0  -0.43663741016274E0  -0.43633608298439E0
+-0.43603483928309E0  -0.43573367907635E0  -0.43543260238108E0  -0.43513160921414E0  -0.43483069959292E0
+-0.43452987353489E0  -0.43422913105766E0  -0.4339284721772E0  -0.43362789690961E0  -0.43332740527171E0
+-0.43302699728079E0  -0.43272667295372E0  -0.43242643230752E0  -0.43212627535931E0  -0.43182620212593E0
+-0.43152621262307E0  -0.43122630686634E0  -0.43092648487253E0  -0.43062674665844E0  -0.43032709224063E0
+-0.4300275216355E0  -0.42972803485935E0  -0.42942863192858E0  -0.42912931285957E0  -0.42883007766924E0
+-0.42853092637266E0  -0.42823185898498E0  -0.42793287552179E0      -0.427633976E0  -0.42733516043628E0
+-0.42703642884624E0  -0.4267377812453E0  -0.42643921764885E0  -0.42614073807341E0  -0.42584234253553E0
+-0.4255440310506E0  -0.42524580363327E0  -0.42494766029777E0  -0.42464960106065E0  -0.42435162593776E0
+-0.42405373494476E0  -0.42375592809683E0  -0.42345820540901E0  -0.42316056689696E0  -0.42286301257639E0
+-0.42256554246304E0  -0.42226815657104E0  -0.4219708549146E0  -0.42167363750882E0  -0.4213765043692E0
+-0.42107945551093E0   -0.420782490949E0  -0.42048561069833E0  -0.42018881477386E0  -0.41989210319061E0
+-0.41959547596386E0  -0.41929893310779E0  -0.41900247463651E0  -0.41870610056408E0  -0.41840981090561E0
+-0.41811360567563E0  -0.4178174848889E0  -0.41752144856032E0  -0.41722549670531E0  -0.41692962933707E0
+-0.41663384646922E0  -0.4163381481157E0  -0.41604253429127E0  -0.41574700501021E0  -0.41545156028684E0
+-0.41515620013541E0  -0.41486092457011E0  -0.41456573360521E0  -0.41427062725536E0  -0.4139756055341E0
+-0.4136806684545E0  -0.4133858160291E0  -0.41309104827288E0  -0.41279636520007E0  -0.41250176682463E0
+-0.4122072531601E0    -0.41191282422E0  -0.41161848001819E0  -0.4113242205686E0  -0.41103004588508E0
+-0.41073595598032E0  -0.41044195086695E0  -0.41014803055856E0  -0.40985419506902E0  -0.4095604444121E0
+-0.40926677860083E0  -0.4089731976483E0  -0.40867970156778E0  -0.40838629037294E0  -0.40809296407788E0
+-0.40779972269476E0  -0.4075065662357E0  -0.40721349471293E0  -0.40692050814048E0  -0.40662760653192E0
+-0.40633478990009E0  -0.40604205825761E0  -0.40574941161694E0  -0.40545684999142E0  -0.40516437339435E0
+-0.40487198183841E0  -0.40457967533548E0  -0.40428745389717E0  -0.40399531753667E0  -0.40370326626689E0
+-0.40341130010054E0  -0.4031194190504E0  -0.40282762312969E0  -0.4025359123503E0  -0.40224428672374E0
+-0.40195274626116E0  -0.40166129097594E0  -0.4013699208808E0  -0.40107863598811E0  -0.40078743630978E0
+-0.40049632185759E0  -0.4002052926441E0  -0.39991434868186E0  -0.39962348998326E0  -0.39933271655928E0
+-0.39904202842079E0  -0.3987514255801E0  -0.39846090804976E0  -0.39817047584224E0  -0.39788012896889E0
+-0.39758986744123E0  -0.39729969127104E0  -0.39700960047042E0  -0.39671959505175E0  -0.39642967502589E0
+-0.39613984040376E0  -0.39585009119645E0  -0.39556042741612E0  -0.39527084907458E0  -0.39498135618327E0
+-0.3946919487535E0  -0.39440262679643E0  -0.39411339032389E0  -0.39382423934775E0  -0.39353517387919E0
+-0.39324619392867E0  -0.39295729950635E0  -0.39266849062409E0  -0.39237976729337E0  -0.39209112952551E0
+-0.39180257733135E0  -0.39151411072154E0  -0.39122572970748E0  -0.39093743430074E0  -0.39064922451312E0
+-0.39036110035423E0  -0.39007306183393E0  -0.38978510896296E0  -0.38949724175281E0  -0.38920946021461E0
+-0.38892176435911E0  -0.38863415419724E0  -0.38834662973975E0  -0.38805919099675E0  -0.3877718379783E0
+-0.38748457069504E0  -0.38719738915762E0  -0.38691029337646E0  -0.38662328336229E0  -0.38633635912565E0
+-0.38604952067708E0  -0.38576276802713E0  -0.38547610118681E0  -0.38518952016551E0  -0.38490302497271E0
+-0.38461661561821E0  -0.38433029211302E0  -0.3840440544679E0  -0.38375790269276E0  -0.38347183679734E0
+-0.38318585679127E0  -0.38289996268541E0  -0.38261415449062E0  -0.38232843221666E0  -0.38204279587254E0
+-0.38175724546687E0  -0.38147178101048E0  -0.38118640251365E0  -0.38090110998641E0  -0.38061590343831E0
+-0.38033078287868E0  -0.38004574831771E0  -0.3797607997657E0  -0.37947593723309E0  -0.37919116072813E0
+-0.37890647025918E0  -0.37862186583593E0  -0.3783373474688E0  -0.37805291516816E0  -0.3777685689429E0
+-0.37748430880207E0  -0.37720013475499E0  -0.37691604681175E0  -0.37663204498273E0  -0.37634812927646E0
+-0.3760642997013E0  -0.37578055626561E0  -0.37549689897963E0  -0.37521332785295E0  -0.37492984289494E0
+-0.37464644411482E0  -0.37436313152228E0  -0.37407990512562E0  -0.37379676493329E0  -0.37351371095404E0
+-0.37323074319745E0  -0.37294786167283E0  -0.37266506638904E0  -0.37238235735486E0  -0.37209973457897E0
+-0.37181719807084E0  -0.37153474784008E0  -0.37125238389517E0  -0.3709701062441E0  -0.37068791489442E0
+-0.37040580985582E0  -0.37012379113734E0  -0.36984185874781E0  -0.36956001269569E0  -0.3692782529893E0
+-0.36899657963757E0  -0.36871499264952E0  -0.36843349203408E0  -0.36815207779894E0  -0.3678707499518E0
+-0.36758950850123E0  -0.36730835345604E0  -0.36702728482493E0  -0.36674630261613E0  -0.36646540683787E0
+-0.36618459749852E0  -0.36590387460674E0  -0.36562323817141E0  -0.36534268820021E0  -0.36506222470079E0
+-0.36478184768084E0  -0.36450155714898E0  -0.36422135311336E0  -0.36394123558223E0  -0.36366120456385E0
+-0.36338126006638E0  -0.36310140209801E0  -0.36282163066709E0  -0.36254194578155E0  -0.36226234744871E0
+-0.36198283567563E0  -0.36170341047069E0   -0.361424071842E0  -0.36114481979751E0  -0.36086565434544E0
+-0.36058657549426E0  -0.36030758325142E0  -0.36002867762399E0  -0.35974985861879E0  -0.35947112624429E0
+-0.35919248050842E0  -0.35891392141897E0  -0.3586354489835E0  -0.35835706320941E0  -0.35807876410466E0
+-0.35780055167725E0  -0.35752242593503E0  -0.35724438688462E0  -0.35696643453251E0  -0.35668856888647E0
+-0.35641078995458E0  -0.3561330977448E0  -0.35585549226414E0  -0.35557797351962E0  -0.35530054151868E0
+-0.35502319626924E0  -0.35474593777961E0  -0.3544687660561E0  -0.35419168110509E0  -0.3539146829332E0
+-0.35363777154854E0  -0.35336094695883E0  -0.35308420917119E0  -0.35280755819258E0  -0.35253099402987E0
+-0.35225451669063E0  -0.35197812618239E0  -0.35170182251219E0  -0.35142560568652E0  -0.35114947571177E0
+-0.35087343259526E0  -0.35059747634403E0  -0.35032160696507E0  -0.35004582446549E0  -0.34977012885216E0
+-0.34949452013225E0   -0.349218998313E0  -0.3489435634019E0  -0.34866821540481E0  -0.3483929543278E0
+-0.34811778017751E0  -0.34784269296119E0  -0.34756769268555E0  -0.34729277935774E0   -0.347017952985E0
+-0.34674321357431E0  -0.34646856113154E0  -0.34619399566254E0  -0.34591951717417E0  -0.34564512567334E0
+-0.34537082116677E0  -0.34509660366109E0  -0.34482247316276E0  -0.34454842967849E0  -0.34427447321516E0
+-0.34400060378017E0  -0.34372682137893E0  -0.34345312601698E0  -0.34317951770019E0  -0.34290599643602E0
+-0.34263256223153E0  -0.34235921509295E0  -0.34208595502637E0  -0.34181278203779E0  -0.34153969613415E0
+-0.34126669732235E0  -0.34099378560855E0  -0.34072096099831E0  -0.34044822349687E0  -0.34017557311121E0
+-0.33990300984784E0  -0.33963053371317E0  -0.33935814471319E0  -0.33908584285373E0  -0.33881362814136E0
+-0.33854150058276E0  -0.33826946018473E0  -0.33799750695229E0  -0.33772564089062E0  -0.33745386200579E0
+-0.33718217030447E0  -0.33691056579322E0  -0.33663904847772E0  -0.33636761836363E0  -0.33609627545687E0
+-0.33582501976411E0  -0.33555385129229E0  -0.33528277004661E0  -0.33501177603207E0  -0.33474086925362E0
+-0.33447004971816E0  -0.33419931743189E0  -0.33392867240089E0  -0.33365811463119E0  -0.33338764412939E0
+-0.33311726090029E0  -0.33284696494892E0  -0.33257675628067E0  -0.33230663490206E0  -0.33203660081922E0
+-0.33176665403784E0  -0.33149679456356E0  -0.33122702240193E0  -0.33095733755911E0  -0.33068774004143E0
+-0.33041822985425E0  -0.33014880700242E0  -0.32987947149028E0  -0.32961022332458E0  -0.32934106251142E0
+-0.32907198905662E0  -0.32880300296546E0  -0.32853410424313E0  -0.32826529289552E0  -0.32799656892854E0
+-0.32772793234807E0  -0.32745938315896E0  -0.32719092136616E0  -0.32692254697515E0  -0.32665425999165E0
+-0.32638606042108E0  -0.32611794826908E0  -0.32584992354111E0  -0.3255819862427E0  -0.32531413637956E0
+-0.32504637395779E0  -0.32477869898208E0  -0.32451111145703E0  -0.32424361138729E0  -0.32397619877904E0
+-0.32370887363797E0  -0.32344163596944E0  -0.32317448577866E0  -0.32290742307068E0  -0.32264044785125E0
+-0.3223735601261E0  -0.32210675990054E0  -0.3218400471791E0  -0.32157342196608E0  -0.3213068842672E0
+-0.32104043408796E0  -0.3207740714337E0  -0.32050779630994E0  -0.32024160872256E0  -0.31997550867637E0
+-0.31970949617575E0  -0.3194435712247E0  -0.3191777338294E0  -0.31891198399536E0  -0.31864632172787E0
+-0.31838074703185E0  -0.31811525991215E0  -0.31784986037417E0  -0.31758454842336E0  -0.31731932406504E0
+-0.31705418730364E0  -0.31678913814359E0  -0.31652417659003E0  -0.31625930264823E0  -0.31599451632322E0
+-0.31572981762023E0  -0.31546520654434E0  -0.31520068310067E0  -0.31493624729433E0  -0.31467189913065E0
+-0.31440763861417E0  -0.31414346574942E0  -0.31387938054097E0  -0.31361538299413E0  -0.31335147311378E0
+-0.31308765090502E0  -0.31282391637297E0  -0.31256026952263E0  -0.31229671035908E0  -0.31203323888759E0
+-0.31176985511294E0  -0.31150655903931E0  -0.31124335067052E0  -0.31098023001215E0  -0.31071719706945E0
+-0.31045425184753E0  -0.3101913943511E0  -0.30992862458479E0  -0.30966594255366E0  -0.30940334826287E0
+-0.30914084171776E0  -0.30887842292237E0  -0.3086160918809E0   -0.308353848598E0  -0.30809169307882E0
+-0.30782962532801E0  -0.3075676453508E0  -0.3073057531524E0  -0.30704394873788E0  -0.30678223211127E0
+-0.30652060327662E0  -0.30625906223884E0  -0.30599760900292E0  -0.30573624357361E0  -0.30547496595584E0
+-0.30521377615445E0  -0.30495267417425E0  -0.30469166002007E0  -0.30443073369703E0  -0.30416989520925E0
+-0.30390914456083E0  -0.30364848175606E0  -0.30338790680037E0  -0.30312741969892E0  -0.30286702045627E0
+-0.30260670907682E0  -0.30234648556485E0  -0.30208634992565E0  -0.30182630216448E0  -0.30156634228589E0
+-0.30130647029381E0  -0.30104668619185E0  -0.30078698998545E0  -0.30052738167962E0  -0.30026786127923E0
+-0.30000842878877E0  -0.2997490842127E0  -0.29948982755585E0  -0.29923065882305E0  -0.29897157801923E0
+-0.29871258514849E0  -0.29845368021499E0  -0.29819486322329E0  -0.29793613417824E0  -0.29767749308437E0
+-0.29741893994654E0  -0.29716047476949E0  -0.29690209755794E0  -0.29664380831661E0  -0.29638560705046E0
+-0.29612749376369E0  -0.29586946846037E0  -0.29561153114444E0  -0.29535368182118E0  -0.2950959204953E0
+-0.29483824717165E0  -0.29458066185508E0  -0.29432316455104E0  -0.29406575526309E0  -0.29380843399503E0
+-0.29355120075099E0  -0.29329405553631E0  -0.29303699835583E0  -0.29278002921422E0  -0.29252314811608E0
+-0.29226635506602E0  -0.29200965006877E0  -0.29175303312915E0  -0.29149650425159E0  -0.29124006344035E0
+-0.29098371069943E0  -0.29072744603379E0  -0.29047126944806E0  -0.29021518094685E0  -0.28995918053488E0
+-0.28970326821671E0  -0.28944744399713E0  -0.28919170788099E0  -0.28893605987317E0  -0.2886804999776E0
+-0.28842502819816E0  -0.28816964453949E0  -0.28791434900663E0  -0.28765914160441E0  -0.28740402233738E0
+-0.28714899121005E0  -0.28689404822705E0  -0.28663919339333E0  -0.28638442671412E0  -0.28612974819344E0
+-0.28587515783522E0  -0.28562065564338E0  -0.28536624162332E0    -0.28511191578E0  -0.28485767811805E0
+-0.28460352864195E0  -0.28434946735594E0  -0.28409549426522E0  -0.2838416093749E0  -0.28358781268969E0
+-0.28333410421356E0  -0.28308048395035E0  -0.28282695190502E0  -0.28257350808235E0  -0.28232015248695E0
+ -0.282066885124E0  -0.28181370599888E0  -0.28156061511594E0  -0.28130761247914E0  -0.28105469809212E0
+-0.2808018719604E0  -0.28054913408892E0  -0.28029648448248E0  -0.28004392314566E0  -0.27979145008288E0
+-0.27953906529921E0  -0.27928676879975E0  -0.27903456058953E0  -0.27878244067249E0  -0.27853040905247E0
+-0.27827846573439E0  -0.27802661072348E0  -0.27777484402484E0  -0.27752316564298E0  -0.27727157558241E0
+-0.27702007384792E0  -0.2767686604447E0  -0.27651733537816E0  -0.27626609865247E0  -0.27601495027176E0
+-0.2757638902403E0  -0.27551291856342E0   -0.275262035246E0  -0.27501124029296E0  -0.27476053370916E0
+-0.27450991549934E0  -0.27425938566867E0  -0.27400894422239E0  -0.27375859116529E0  -0.2735083265016E0
+-0.2732581502353E0  -0.27300806237173E0  -0.27275806291595E0  -0.27250815187293E0  -0.27225832924758E0
+-0.27200859504457E0  -0.27175894926907E0  -0.27150939192638E0  -0.27125992302207E0  -0.27101054256012E0
+-0.27076125054469E0  -0.27051204698056E0  -0.27026293187322E0  -0.27001390522766E0  -0.26976496704921E0
+-0.26951611734335E0  -0.26926735611539E0  -0.26901868336931E0  -0.26877009910894E0  -0.26852160333969E0
+-0.26827319606721E0  -0.26802487729702E0  -0.26777664703391E0  -0.26752850528277E0  -0.2672804520487E0
+-0.26703248733704E0  -0.26678461115328E0   -0.266536823502E0  -0.26628912438782E0  -0.26604151381545E0
+-0.26579399179051E0  -0.26554655831825E0  -0.26529921340386E0  -0.26505195705245E0  -0.26480478926898E0
+-0.26455771005912E0  -0.26431071942854E0  -0.26406381738235E0  -0.26381700392512E0  -0.26357027906113E0
+-0.2633236427962E0  -0.26307709513579E0  -0.26283063608527E0  -0.26258426564994E0  -0.26233798383492E0
+-0.26209179064576E0  -0.26184568608809E0  -0.2615996701677E0  -0.26135374288908E0  -0.26110790425671E0
+-0.26086215427594E0  -0.26061649295281E0  -0.26037092029326E0  -0.26012543630234E0  -0.25988004098515E0
+-0.25963473434694E0  -0.25938951639374E0  -0.25914438713163E0  -0.25889934656565E0  -0.25865439470073E0
+-0.2584095315417E0  -0.25816475709455E0  -0.25792007136467E0  -0.25767547435778E0  -0.25743096607993E0
+-0.25718654653746E0  -0.25694221573519E0  -0.25669797367811E0  -0.25645382037148E0  -0.25620975582128E0
+-0.25596578003303E0  -0.25572189301261E0  -0.25547809476591E0  -0.25523438529875E0  -0.2549907646169E0
+-0.25474723272633E0  -0.25450378963257E0  -0.25426043534084E0  -0.25401716985588E0  -0.25377399318434E0
+-0.25353090533242E0  -0.25328790630613E0  -0.25304499611104E0  -0.25280217475263E0  -0.25255944223707E0
+-0.25231679857056E0  -0.25207424375931E0  -0.25183177780862E0  -0.25158940072377E0  -0.25134711251073E0
+-0.25110491317584E0  -0.25086280272515E0  -0.25062078116479E0  -0.25037884850079E0  -0.25013700473924E0
+-0.24989524988636E0  -0.24965358394854E0  -0.24941200693145E0  -0.24917051884067E0  -0.24892911968166E0
+-0.24868780946133E0  -0.24844658818619E0  -0.24820545586242E0  -0.24796441249606E0  -0.24772345809286E0
+-0.24748259265967E0  -0.24724181620322E0  -0.24700112872986E0  -0.24676053024513E0  -0.24652002075427E0
+-0.24627960026418E0  -0.24603926878162E0  -0.24579902631315E0  -0.2455588728654E0  -0.24531880844526E0
+-0.24507883305891E0  -0.24483894671216E0  -0.24459914941041E0  -0.24435944116101E0  -0.24411982197075E0
+-0.24388029184626E0  -0.24364085079397E0  -0.24340149882009E0  -0.24316223593166E0  -0.24292306213577E0
+-0.24268397743946E0  -0.24244498184858E0  -0.24220607536893E0  -0.24196725800737E0  -0.24172852977111E0
+-0.24148989066714E0  -0.24125134070221E0  -0.24101287988303E0  -0.24077450821645E0  -0.24053622570947E0
+-0.2402980323692E0  -0.24005992820222E0  -0.23982191321508E0  -0.23958398741432E0  -0.23934615080731E0
+-0.23910840340104E0  -0.23887074520257E0  -0.23863317621894E0  -0.23839569645689E0  -0.23815830592406E0
+-0.23792100462806E0  -0.23768379257601E0  -0.23744666977431E0  -0.23720963622908E0  -0.23697269194815E0
+-0.23673583693916E0  -0.23649907120959E0  -0.2362623947665E0  -0.23602580761686E0  -0.23578930976819E0
+-0.23555290122813E0  -0.23531658200444E0  -0.23508035210397E0  -0.23484421153366E0  -0.2346081603008E0
+-0.23437219841323E0  -0.23413632587831E0  -0.23390054270393E0  -0.23366484889797E0  -0.23342924446826E0
+-0.23319372942173E0  -0.23295830376522E0  -0.23272296750661E0  -0.23248772065399E0  -0.23225256321527E0
+-0.23201749519813E0  -0.23178251661016E0  -0.23154762745922E0  -0.23131282775343E0  -0.23107811750115E0
+-0.23084349670962E0  -0.2306089653861E0  -0.23037452353798E0  -0.23014017117392E0  -0.22990590830211E0
+-0.22967173493065E0  -0.22943765106762E0  -0.22920365672108E0  -0.22896975189924E0  -0.22873593661039E0
+-0.22850221086258E0  -0.22826857466362E0  -0.22803502802103E0  -0.22780157094352E0  -0.22756820343958E0
+-0.22733492551759E0  -0.22710173718589E0  -0.22686863845263E0  -0.22663562932643E0  -0.22640270981601E0
+-0.22616987993023E0  -0.22593713967685E0  -0.22570448906361E0  -0.22547192809897E0  -0.22523945679207E0
+-0.22500707515169E0  -0.22477478318653E0  -0.22454258090526E0  -0.22431046831661E0  -0.22407844542938E0
+-0.22384651225247E0  -0.22361466879446E0  -0.22338291506387E0  -0.2231512510691E0  -0.22291967681942E0
+-0.22268819232363E0  -0.22245679759083E0  -0.22222549263037E0  -0.22199427745181E0  -0.22176315206359E0
+-0.22153211647419E0  -0.22130117069235E0  -0.22107031472782E0  -0.22083954858998E0  -0.22060887228804E0
+-0.22037828583114E0  -0.22014778922826E0  -0.21991738248931E0  -0.21968706562421E0  -0.21945683864214E0
+-0.21922670155173E0  -0.21899665436116E0  -0.21876669708086E0  -0.2185368297207E0  -0.21830705229042E0
+-0.21807736479951E0  -0.21784776725732E0  -0.21761825967382E0  -0.21738884205907E0  -0.2171595144232E0
+-0.21693027677519E0  -0.21670112912399E0  -0.21647207147944E0  -0.21624310385198E0  -0.2160142262518E0
+-0.21578543868871E0  -0.21555674117246E0  -0.21532813371298E0  -0.2150996163208E0  -0.21487118900652E0
+-0.21464285177983E0  -0.21441460465033E0  -0.21418644762752E0  -0.21395838072242E0  -0.2137304039456E0
+-0.21350251730736E0  -0.21327472081785E0  -0.21304701448678E0  -0.21281939832542E0  -0.21259187234484E0
+-0.21236443655571E0  -0.21213709096759E0  -0.21190983558974E0  -0.21168267043347E0  -0.21145559550998E0
+-0.21122861083027E0  -0.21100171640511E0  -0.21077491224558E0  -0.21054819836224E0  -0.21032157476541E0
+-0.21009504146482E0  -0.20986859847242E0  -0.20964224579953E0  -0.20941598345732E0  -0.20918981145668E0
+-0.20896372980835E0  -0.20873773852375E0  -0.20851183761433E0  -0.20828602709149E0  -0.20806030696598E0
+-0.20783467724845E0  -0.20760913795029E0  -0.20738368908323E0  -0.20715833065875E0  -0.20693306268837E0
+-0.20670788518352E0  -0.20648279815577E0  -0.20625780161702E0  -0.20603289557936E0  -0.20580808005395E0
+-0.20558335505184E0  -0.20535872058413E0  -0.20513417666338E0  -0.20490972330163E0  -0.20468536051085E0
+-0.20446108830301E0  -0.20423690668996E0  -0.20401281568392E0  -0.20378881529705E0  -0.2035649055414E0
+-0.20334108642876E0  -0.2031173579706E0  -0.20289372017958E0  -0.20267017306822E0  -0.20244671664893E0
+-0.20222335093407E0  -0.2020000759358E0  -0.20177689166678E0  -0.20155379813982E0  -0.20133079536793E0
+-0.20110788336299E0  -0.20088506213689E0  -0.20066233170213E0  -0.20043969207204E0  -0.20021714325949E0
+-0.19999468527754E0  -0.19977231813931E0  -0.1995500418579E0  -0.19932785644558E0  -0.19910576191439E0
+-0.19888375827767E0  -0.19866184554914E0  -0.19844002374241E0  -0.19821829287034E0  -0.19799665294584E0
+-0.1977751039822E0  -0.19755364599317E0  -0.19733227899266E0  -0.19711100299355E0  -0.19688981800868E0
+-0.19666872405103E0  -0.19644772113493E0  -0.19622680927428E0  -0.19600598848272E0  -0.19578525877382E0
+-0.19556462016091E0  -0.19534407265844E0  -0.19512361628069E0  -0.19490325104154E0  -0.19468297695442E0
+-0.19446279403242E0  -0.19424270229022E0  -0.19402270174219E0  -0.19380279240263E0  -0.19358297428566E0
+-0.19336324740524E0  -0.19314361177588E0  -0.19292406741217E0  -0.19270461432873E0  -0.19248525253971E0
+-0.19226598205922E0  -0.19204680290176E0  -0.19182771508222E0  -0.19160871861517E0  -0.19138981351555E0
+-0.19117099979817E0  -0.19095227747785E0  -0.19073364656976E0  -0.19051510708917E0  -0.19029665905072E0
+-0.19007830246888E0  -0.1898600373579E0  -0.18964186373372E0  -0.18942378161159E0  -0.18920579100699E0
+-0.18898789193555E0  -0.18877008441325E0  -0.18855236845485E0  -0.18833474407518E0  -0.18811721128929E0
+-0.18789977011333E0  -0.18768242056289E0  -0.18746516265386E0  -0.18724799640215E0  -0.18703092182358E0
+-0.18681393893412E0  -0.18659704774975E0  -0.18638024828634E0  -0.18616354055965E0  -0.18594692458511E0
+-0.1857304003793E0  -0.1855139679585E0  -0.18529762733894E0  -0.18508137853706E0  -0.18486522156899E0
+-0.18464915645144E0  -0.18443318320122E0  -0.18421730183521E0  -0.18400151236932E0  -0.18378581481938E0
+-0.18357020920212E0  -0.18335469553488E0  -0.18313927383486E0  -0.18292394411869E0  -0.18270870640291E0
+-0.18249356070434E0  -0.1822785070408E0  -0.18206354543017E0  -0.18184867588904E0  -0.18163389843385E0
+-0.18141921308088E0  -0.18120461984857E0  -0.18099011875472E0  -0.18077570981688E0  -0.18056139305243E0
+-0.18034716847851E0  -0.18013303611325E0  -0.17991899597462E0  -0.17970504808044E0  -0.17949119244807E0
+-0.17927742909462E0  -0.17906375803844E0  -0.17885017929784E0  -0.17863669289094E0  -0.17842329883617E0
+-0.17820999715206E0  -0.17799678785669E0  -0.1777836709679E0  -0.17757064650307E0  -0.17735771448144E0
+-0.1771448749217E0  -0.17693212784251E0  -0.17671947326262E0  -0.1765069112006E0  -0.17629444167541E0
+-0.17608206470601E0  -0.1758697803114E0  -0.17565758851009E0  -0.17544548932031E0  -0.17523348276133E0
+-0.17502156885288E0  -0.17480974761458E0  -0.17459801906548E0  -0.17438638322461E0  -0.17417484011129E0
+-0.17396338974544E0  -0.17375203214692E0  -0.17354076733501E0  -0.17332959532891E0  -0.17311851614774E0
+-0.17290752981211E0  -0.1726966363422E0  -0.17248583575793E0  -0.17227512807907E0  -0.17206451332499E0
+-0.1718539915166E0  -0.17164356267448E0  -0.17143322681896E0  -0.17122298396993E0  -0.17101283414704E0
+-0.17080277737118E0  -0.17059281366307E0  -0.17038294304333E0  -0.17017316553279E0  -0.16996348115207E0
+-0.16975388992213E0  -0.16954439186406E0  -0.1693349869991E0  -0.16912567534776E0  -0.1689164569304E0
+-0.16870733176802E0  -0.16849829988261E0  -0.16828936129581E0   -0.168080516029E0  -0.16787176410361E0
+-0.16766310554109E0  -0.16745454036285E0  -0.16724606858998E0  -0.16703769024441E0  -0.16682940534833E0
+-0.16662121392385E0  -0.16641311599269E0  -0.16620511157639E0  -0.16599720069703E0  -0.16578938337752E0
+-0.16558165964092E0  -0.1653740295088E0  -0.16516649300274E0  -0.16495905014445E0  -0.16475170095734E0
+-0.16454444546414E0  -0.16433728368766E0  -0.16413021565072E0  -0.16392324137598E0  -0.16371636088668E0
+-0.16350957420603E0  -0.16330288135699E0  -0.16309628236224E0  -0.16288977724398E0  -0.16268336602617E0
+-0.16247704873249E0  -0.16227082538649E0  -0.16206469601161E0  -0.16185866063104E0  -0.1616527192687E0
+-0.16144687194867E0  -0.1612411186951E0  -0.16103545953131E0  -0.16082989448058E0  -0.16062442356681E0
+-0.16041904681464E0  -0.16021376424826E0  -0.16000857589212E0  -0.1598034817706E0  -0.15959848190808E0
+-0.15939357632925E0  -0.1591887650587E0  -0.15898404812102E0  -0.15877942554077E0  -0.1585748973423E0
+-0.15837046355088E0  -0.1581661241912E0  -0.15796187928844E0  -0.15775772886826E0  -0.15755367295644E0
+-0.15734971157769E0  -0.15714584475672E0  -0.15694207251847E0  -0.15673839488917E0  -0.15653481189441E0
+-0.15633132356012E0  -0.15612792991225E0  -0.15592463097669E0  -0.15572142677945E0  -0.15551831734642E0
+-0.15531530270364E0  -0.1551123828773E0  -0.15490955789325E0  -0.1547068277781E0  -0.15450419255816E0
+-0.15430165225983E0  -0.15409920691004E0  -0.1538968565353E0  -0.15369460116267E0  -0.15349244081929E0
+-0.15329037553239E0  -0.15308840532842E0  -0.15288653023371E0  -0.15268475027544E0  -0.15248306548152E0
+-0.15228147587954E0  -0.15207998149691E0  -0.15187858236096E0  -0.15167727849916E0  -0.15147606993968E0
+-0.15127495671062E0  -0.15107393883959E0  -0.15087301635409E0  -0.15067218928143E0  -0.1504714576506E0
+-0.15027082149004E0  -0.15007028082811E0  -0.14986983569314E0  -0.1496694861131E0  -0.1494692321171E0
+-0.14926907373402E0  -0.14906901099262E0  -0.14886904392142E0  -0.14866917254852E0  -0.14846939690342E0
+-0.14826971701566E0  -0.14807013291465E0  -0.14787064462963E0  -0.14767125218987E0  -0.14747195562479E0
+-0.14727275496393E0  -0.14707365023654E0  -0.1468746414726E0  -0.14667572870172E0  -0.14647691195372E0
+-0.1462781912591E0  -0.14607956664796E0  -0.14588103815074E0  -0.14568260579791E0  -0.14548426961995E0
+-0.14528602964698E0  -0.1450878859089E0  -0.1448898384364E0  -0.14469188726059E0  -0.14449403241215E0
+-0.1442962739223E0  -0.14409861182191E0  -0.14390104614212E0  -0.14370357691467E0  -0.14350620417134E0
+-0.14330892794314E0  -0.14311174826101E0  -0.14291466515583E0  -0.14271767866002E0  -0.14252078880536E0
+-0.14232399562387E0  -0.14212729914771E0  -0.14193069940871E0  -0.14173419643951E0  -0.14153779027258E0
+-0.14134148094028E0  -0.14114526847475E0  -0.14094915290781E0  -0.1407531342725E0  -0.14055721260177E0
+-0.14036138792842E0  -0.14016566028554E0  -0.1399700297058E0  -0.13977449622262E0  -0.13957905986978E0
+-0.13938372068129E0  -0.13918847868978E0  -0.13899333392796E0  -0.13879828642915E0  -0.13860333622802E0
+-0.13840848335857E0   -0.138213727855E0  -0.13801906975157E0  -0.13782450908255E0  -0.13763004588164E0
+-0.13743568018215E0  -0.13724141201882E0  -0.13704724142693E0  -0.13685316844148E0  -0.13665919309713E0
+-0.13646531542848E0  -0.13627153547045E0  -0.13607785325849E0  -0.13588426882793E0  -0.13569078221386E0
+-0.13549739345124E0  -0.1353041025751E0  -0.13511090962169E0  -0.13491781462686E0  -0.13472481762641E0
+-0.13453191865616E0  -0.13433911775146E0  -0.13414641494932E0  -0.13395381028636E0  -0.13376130379894E0
+-0.13356889552301E0  -0.13337658549416E0  -0.13318437374959E0  -0.13299226032623E0  -0.13280024526093E0
+-0.1326083285909E0  -0.13241651035304E0  -0.13222479058473E0  -0.13203316932347E0  -0.13184164660674E0
+-0.13165022247179E0  -0.13145889695558E0  -0.13126767009578E0  -0.13107654193091E0  -0.13088551249921E0
+-0.13069458183863E0  -0.13050374998698E0  -0.13031301698222E0  -0.13012238286341E0  -0.12993184766937E0
+-0.12974141143856E0  -0.12955107420931E0  -0.1293608360196E0  -0.12917069690924E0  -0.12898065691732E0
+-0.12879071608313E0  -0.12860087444609E0  -0.12841113204553E0  -0.12822148892092E0  -0.12803194511149E0
+-0.12784250065663E0  -0.12765315559686E0  -0.12746390997233E0  -0.12727476382307E0  -0.12708571718906E0
+-0.12689677010994E0   -0.126707922627E0  -0.12651917478121E0  -0.12633052661315E0  -0.12614197816311E0
+-0.1259535294708E0  -0.12576518057814E0  -0.12557693152663E0  -0.12538878235764E0  -0.12520073311237E0
+-0.12501278383161E0  -0.12482493455739E0  -0.12463718533192E0  -0.12444953619738E0  -0.12426198719517E0
+-0.12407453836651E0  -0.12388718975354E0  -0.12369994139916E0  -0.1235127933458E0  -0.1233257456362E0
+-0.12313879831298E0  -0.1229519514188E0  -0.12276520499686E0  -0.12257855909016E0  -0.12239201374171E0
+-0.12220556899443E0  -0.12201922489091E0  -0.12183298147558E0  -0.12164683879225E0  -0.12146079688473E0
+-0.12127485579675E0  -0.12108901557151E0  -0.12090327625397E0  -0.12071763788874E0  -0.12053210052032E0
+-0.12034666419276E0  -0.12016132894988E0  -0.11997609483668E0  -0.11979096189814E0  -0.11960593017891E0
+-0.11942099972486E0  -0.11923617058165E0  -0.11905144279456E0  -0.1188668164086E0  -0.1186822914683E0
+-0.11849786802019E0  -0.11831354611018E0  -0.11812932578427E0  -0.11794520708875E0  -0.11776119006954E0
+-0.11757727477335E0  -0.11739346124693E0  -0.11720974953697E0  -0.11702613969001E0  -0.11684263175228E0
+-0.11665922577086E0  -0.11647592179339E0  -0.1162927198672E0  -0.11610962003964E0  -0.11592662235782E0
+-0.1157437268692E0  -0.11556093362238E0  -0.11537824266575E0  -0.11519565404707E0  -0.11501316781396E0
+-0.11483078401394E0  -0.11464850269636E0  -0.11446632390986E0  -0.11428424770324E0  -0.11410227412532E0
+-0.11392040322446E0  -0.11373863505049E0  -0.11355696965287E0  -0.11337540708098E0  -0.11319394738406E0
+-0.11301259061086E0  -0.11283133681168E0  -0.11265018603676E0  -0.11246913833617E0  -0.11228819376017E0
+-0.11210735235855E0  -0.11192661418206E0  -0.11174597928188E0  -0.11156544770934E0  -0.11138501951453E0
+-0.1112046947475E0   -0.111024473459E0  -0.11084435570138E0  -0.11066434152628E0  -0.11048443098546E0
+-0.1103046241307E0  -0.11012492101378E0  -0.10994532168647E0  -0.10976582620007E0  -0.10958643460701E0
+-0.10940714696021E0  -0.1092279633121E0  -0.10904888371564E0  -0.10886990822347E0  -0.10869103688851E0
+-0.10851226976426E0  -0.10833360690402E0  -0.10815504836103E0  -0.10797659418841E0  -0.10779824443927E0
+-0.10761999916815E0  -0.10744185842893E0  -0.10726382227587E0  -0.10708589076336E0  -0.1069080639454E0
+-0.10673034187709E0  -0.10655272461324E0  -0.10637521220861E0  -0.10619780471793E0  -0.10602050219539E0
+-0.10584330469686E0  -0.10566621227794E0  -0.10548922499413E0  -0.10531234290141E0  -0.10513556605539E0
+-0.10495889451226E0  -0.10478232832839E0    -0.10460586756E0  -0.1044295122635E0  -0.10425326249502E0
+-0.10407711831117E0  -0.1039010797693E0  -0.1037251469262E0  -0.10354931983938E0  -0.10337359856616E0
+-0.10319798316387E0  -0.10302247369062E0  -0.10284707020427E0  -0.10267177276266E0  -0.10249658142362E0
+-0.10232149624447E0  -0.10214651728455E0  -0.10197164460238E0  -0.1017968782568E0  -0.10162221830699E0
+-0.10144766481205E0  -0.10127321783099E0  -0.10109887742263E0  -0.1009246436459E0  -0.10075051656126E0
+-0.10057649622849E0  -0.10040258270767E0  -0.10022877605895E0  -0.10005507634214E0  -0.99881483618255E-1
+-0.9970799794796E-1  -0.99534619391916E-1  -0.99361348010803E-1  -0.99188183864639E-1  -0.99015127015451E-1
+-0.98842177524877E-1  -0.98669335454488E-1  -0.98496600866026E-1  -0.98323973820788E-1  -0.98151454381128E-1
+-0.97979042609592E-1  -0.97806738568599E-1  -0.97634542320406E-1  -0.97462453926958E-1  -0.97290473451003E-1
+-0.97118600956112E-1  -0.96946836505297E-1  -0.96775180162113E-1  -0.96603631989881E-1  -0.96432192052037E-1
+-0.96260860412857E-1  -0.96089637136278E-1  -0.9591852228637E-1  -0.95747515927168E-1  -0.95576618122383E-1
+-0.95405828937344E-1  -0.95235148436654E-1  -0.95064576685339E-1  -0.94894113748816E-1  -0.94723759692022E-1
+-0.94553514580843E-1  -0.94383378480951E-1  -0.94213351458033E-1  -0.94043433577913E-1  -0.93873624905836E-1
+-0.93703925508512E-1  -0.93534335452749E-1  -0.93364854805018E-1  -0.93195483632544E-1  -0.93026222002308E-1
+-0.92857069981357E-1  -0.92688027636797E-1  -0.92519095035031E-1  -0.92350272244591E-1  -0.92181559333431E-1
+-0.92012956369541E-1  -0.91844463421238E-1  -0.91676080556357E-1  -0.91507807843769E-1  -0.91339645352403E-1
+-0.91171593151048E-1  -0.9100365130868E-1  -0.90835819893847E-1  -0.90668098975965E-1  -0.90500488625067E-1
+-0.90332988910656E-1  -0.90165599902925E-1  -0.89998321671689E-1  -0.89831154287039E-1  -0.89664097820026E-1
+-0.89497152341387E-1  -0.89330317921772E-1  -0.89163594631721E-1  -0.88996982541564E-1  -0.88830481723491E-1
+-0.88664092248925E-1  -0.88497814189628E-1  -0.88331647617583E-1  -0.8816559260413E-1  -0.87999649222323E-1
+-0.87833817544804E-1  -0.87668097644163E-1  -0.87502489592831E-1  -0.87336993462691E-1  -0.87171609327415E-1
+-0.87006337260617E-1  -0.86841177335668E-1  -0.86676129626523E-1  -0.86511194206635E-1  -0.8634637115022E-1
+-0.86181660531919E-1  -0.86017062426117E-1  -0.85852576907352E-1  -0.85688204049875E-1  -0.85523943928354E-1
+-0.85359796618506E-1  -0.85195762195252E-1  -0.85031840734587E-1  -0.84868032312484E-1  -0.84704337004818E-1
+ -0.845407548876E-1  -0.84377286036433E-1  -0.8421393052786E-1  -0.84050688438882E-1  -0.83887559845806E-1
+-0.8372454482633E-1  -0.8356164345759E-1  -0.83398855816978E-1  -0.83236181982417E-1  -0.83073622031502E-1
+-0.82911176042248E-1  -0.82748844092513E-1  -0.82586626260056E-1  -0.82424522624197E-1  -0.82262533263527E-1
+-0.82100658257128E-1  -0.81938897684292E-1  -0.81777251623727E-1  -0.8161572015572E-1  -0.81454303360046E-1
+-0.81293001316573E-1  -0.81131814105318E-1  -0.80970741805674E-1  -0.8080978449874E-1  -0.80648942265399E-1
+-0.80488215186405E-1  -0.80327603343133E-1  -0.80167106816356E-1  -0.80006725687858E-1  -0.79846460039795E-1
+-0.79686309954081E-1  -0.79526275512729E-1  -0.79366356797439E-1  -0.79206553890482E-1  -0.79046866875083E-1
+-0.78887295833707E-1  -0.78727840849885E-1  -0.78568502006916E-1  -0.78409279388047E-1  -0.78250173077601E-1
+-0.78091183159526E-1  -0.77932309717851E-1  -0.77773552836607E-1  -0.77614912599182E-1  -0.77456389091371E-1
+-0.77297982398016E-1  -0.77139692604327E-1  -0.76981519796035E-1  -0.76823464058604E-1  -0.76665525477753E-1
+-0.76507704138961E-1  -0.7635000012778E-1  -0.76192413531504E-1  -0.76034944436661E-1  -0.7587759293018E-1
+-0.75720359099071E-1  -0.75563243029875E-1  -0.75406244810791E-1  -0.75249364529407E-1  -0.75092602273527E-1
+-0.74935958131218E-1  -0.74779432189906E-1  -0.74623024538671E-1  -0.7446673526621E-1  -0.74310564461218E-1
+-0.74154512213285E-1  -0.73998578611398E-1  -0.73842763745341E-1  -0.73687067705062E-1  -0.73531490580223E-1
+-0.7337603246121E-1  -0.73220693437842E-1  -0.7306547360067E-1  -0.72910373041091E-1  -0.72755391849835E-1
+-0.72600530118547E-1  -0.72445787938543E-1  -0.7229116540125E-1  -0.72136662599254E-1  -0.71982279624691E-1
+-0.71828016569861E-1  -0.71673873527024E-1  -0.71519850587926E-1  -0.71365947846713E-1  -0.71212165396635E-1
+-0.71058503331217E-1  -0.70904961744253E-1  -0.7075154072887E-1  -0.70598240379939E-1  -0.7044506079194E-1
+-0.70292002059361E-1  -0.70139064277045E-1  -0.6998624753922E-1  -0.69833551941487E-1  -0.69680977579569E-1
+-0.69528524548705E-1  -0.69376192945584E-1  -0.69223982866404E-1  -0.6907189440749E-1  -0.6891992766528E-1
+-0.68768082735369E-1  -0.68616359715867E-1  -0.68464758704263E-1  -0.68313279798063E-1  -0.68161923095151E-1
+-0.68010688692744E-1  -0.67859576689563E-1  -0.67708587184465E-1  -0.67557720276082E-1  -0.67406976063284E-1
+-0.67256354644435E-1  -0.67105856118919E-1  -0.6695548058694E-1  -0.66805228147993E-1  -0.66655098902566E-1
+ -0.665050929507E-1  -0.66355210392706E-1  -0.66205451330057E-1  -0.66055815863719E-1  -0.65906304094932E-1
+-0.65756916124846E-1  -0.65607652054278E-1  -0.65458511986198E-1  -0.6530949602264E-1  -0.65160604266162E-1
+-0.65011836819699E-1  -0.64863193785514E-1  -0.64714675267467E-1  -0.64566281368923E-1  -0.64418012193384E-1
+-0.64269867844857E-1  -0.64121848426648E-1  -0.63973954043556E-1  -0.63826184800335E-1  -0.63678540801425E-1
+-0.63531022152534E-1  -0.63383628958658E-1  -0.63236361325521E-1  -0.63089219359318E-1  -0.62942203165767E-1
+-0.62795312851428E-1  -0.62648548522347E-1  -0.62501910285021E-1  -0.62355398247241E-1  -0.62209012515895E-1
+-0.62062753199023E-1  -0.61916620404653E-1  -0.61770614240682E-1  -0.61624734815416E-1  -0.61478982236522E-1
+-0.61333356612928E-1  -0.61187858054265E-1  -0.61042486669362E-1  -0.60897242568402E-1  -0.60752125860973E-1
+-0.60607136657026E-1  -0.60462275067404E-1  -0.60317541202422E-1  -0.60172935173002E-1  -0.60028457089895E-1
+-0.5988410706367E-1  -0.59739885206873E-1  -0.5959579163112E-1  -0.59451826448679E-1  -0.59307989772151E-1
+-0.59164281713426E-1  -0.59020702386174E-1  -0.58877251903392E-1  -0.58733930378354E-1  -0.58590737924901E-1
+-0.58447674656122E-1  -0.58304740686706E-1  -0.58161936131116E-1  -0.58019261103629E-1  -0.57876715719931E-1
+-0.57734300094944E-1  -0.57592014344343E-1  -0.57449858584139E-1  -0.57307832929833E-1  -0.57165937498084E-1
+-0.5702417240486E-1  -0.56882537766759E-1  -0.56741033701543E-1  -0.56599660326135E-1  -0.56458417758561E-1
+-0.56317306116624E-1  -0.56176325518031E-1  -0.56035476081941E-1  -0.55894757926853E-1  -0.55754171171749E-1
+-0.55613715935787E-1  -0.55473392337338E-1  -0.55333200497235E-1  -0.55193140535282E-1  -0.55053212571787E-1
+-0.54913416727869E-1  -0.54773753124115E-1  -0.54634221881804E-1  -0.54494823121941E-1  -0.54355556965528E-1
+-0.54216423535446E-1  -0.5407742295362E-1  -0.5393855534277E-1  -0.53799820825843E-1  -0.53661219525116E-1
+-0.53522751564845E-1  -0.53384417068551E-1  -0.53246216160046E-1  -0.53108148963561E-1  -0.52970215602453E-1
+-0.52832416202239E-1  -0.52694750888017E-1  -0.5255721978482E-1  -0.52419823018748E-1  -0.52282560715103E-1
+-0.52145433000354E-1  -0.52008440001264E-1  -0.51871581844155E-1  -0.51734858656334E-1  -0.51598270564415E-1
+-0.51461817695838E-1  -0.51325500179107E-1  -0.51189318141834E-1  -0.51053271712973E-1  -0.50917361021086E-1
+-0.50781586194803E-1  -0.50645947364156E-1  -0.5051044465848E-1  -0.50375078207722E-1  -0.50239848141914E-1
+-0.5010475459044E-1  -0.49969797685133E-1  -0.49834977556796E-1  -0.49700294336783E-1  -0.49565748157072E-1
+-0.49431339148793E-1  -0.49297067444904E-1  -0.49162933177946E-1  -0.49028936480494E-1  -0.48895077485854E-1
+-0.48761356326483E-1  -0.4862777313648E-1  -0.48494328050175E-1  -0.48361021201277E-1  -0.48227852725203E-1
+-0.48094822756662E-1  -0.47961931430791E-1  -0.47829178883159E-1  -0.47696565248404E-1  -0.47564090663511E-1
+-0.47431755264821E-1  -0.4729955918878E-1  -0.47167502572933E-1  -0.47035585553947E-1  -0.46903808269847E-1
+-0.46772170858809E-1  -0.46640673458629E-1  -0.46509316208176E-1  -0.46378099245529E-1  -0.46247022709802E-1
+-0.46116086741053E-1  -0.45985291478414E-1  -0.45854637062568E-1  -0.45724123633639E-1  -0.45593751331993E-1
+-0.45463520299339E-1  -0.45333430676632E-1  -0.45203482605634E-1  -0.45073676228091E-1  -0.4494401168527E-1
+-0.44814489120762E-1  -0.44685108677094E-1  -0.44555870497522E-1  -0.44426774725893E-1  -0.44297821505134E-1
+-0.44169010980252E-1  -0.44040343295637E-1  -0.43911818595842E-1  -0.43783437026142E-1  -0.43655198730869E-1
+-0.43527103856308E-1  -0.43399152548786E-1  -0.43271344954192E-1  -0.4314368121983E-1  -0.43016161492129E-1
+-0.42888785918529E-1  -0.42761554647199E-1  -0.42634467825596E-1  -0.42507525602391E-1  -0.42380728125629E-1
+-0.42254075543822E-1  -0.4212756800706E-1  -0.42001205664321E-1  -0.4187498866606E-1  -0.41748917162726E-1
+-0.41622991304509E-1  -0.41497211242638E-1  -0.41371577127475E-1  -0.41246089110683E-1  -0.41120747344746E-1
+-0.4099555198118E-1  -0.40870503173274E-1  -0.40745601073551E-1  -0.40620845834989E-1  -0.40496237611867E-1
+-0.4037177655766E-1  -0.40247462826804E-1  -0.40123296573583E-1  -0.39999277951982E-1  -0.39875407118283E-1
+-0.39751684227641E-1  -0.39628109436114E-1  -0.3950468290027E-1  -0.39381404775706E-1  -0.39258275220356E-1
+-0.39135294391312E-1  -0.39012462445991E-1  -0.38889779542575E-1  -0.3876724583823E-1  -0.38644861492276E-1
+-0.38522626663846E-1  -0.38400541511784E-1  -0.38278606196418E-1  -0.38156820877101E-1  -0.38035185714414E-1
+-0.3791370086954E-1  -0.37792366502907E-1  -0.37671182776409E-1  -0.37550149851118E-1  -0.37429267888807E-1
+-0.3730853705271E-1  -0.37187957504968E-1  -0.3706752940926E-1  -0.3694725292902E-1  -0.36827128227505E-1
+-0.36707155469772E-1  -0.36587334819973E-1  -0.36467666443088E-1  -0.36348150504463E-1  -0.36228787168409E-1
+-0.36109576602108E-1  -0.35990518971544E-1  -0.35871614443301E-1  -0.35752863185063E-1  -0.35634265363689E-1
+-0.35515821147273E-1  -0.35397530703599E-1  -0.35279394200352E-1  -0.35161411807381E-1  -0.35043583693357E-1
+-0.34925910028096E-1  -0.34808390981827E-1  -0.3469102672387E-1  -0.34573817425942E-1  -0.34456763258799E-1
+-0.34339864393684E-1  -0.34223121002591E-1  -0.34106533256407E-1  -0.33990101328483E-1  -0.33873825391736E-1
+-0.33757705618965E-1  -0.33641742184438E-1  -0.33525935261368E-1  -0.33410285024449E-1  -0.3329479164882E-1
+-0.33179455308941E-1  -0.33064276180804E-1  -0.32949254439479E-1  -0.3283439026097E-1  -0.32719683822615E-1
+-0.32605135300613E-1  -0.32490744872951E-1  -0.32376512717167E-1  -0.3226243901081E-1  -0.32148523933252E-1
+-0.32034767662892E-1  -0.31921170379101E-1  -0.31807732261456E-1  -0.31694453488649E-1  -0.31581334242332E-1
+-0.31468374702902E-1  -0.31355575051454E-1  -0.31242935469973E-1  -0.31130456139335E-1  -0.31018137242712E-1
+-0.3090597896277E-1  -0.30793981482194E-1  -0.30682144984848E-1  -0.30570469653482E-1  -0.30458955672778E-1
+-0.30347603227776E-1  -0.30236412502702E-1  -0.30125383683925E-1  -0.3001451695686E-1  -0.29903812507597E-1
+-0.29793270522984E-1  -0.29682891188679E-1  -0.29572674693065E-1  -0.29462621223823E-1  -0.29352730968721E-1
+-0.29243004117005E-1  -0.29133440856785E-1  -0.29024041377881E-1  -0.28914805870362E-1  -0.28805734523706E-1
+-0.28696827529071E-1  -0.28588085076565E-1  -0.28479507357478E-1  -0.28371094564288E-1  -0.28262846888285E-1
+-0.28154764522828E-1  -0.28046847660595E-1  -0.27939096494502E-1  -0.27831511219196E-1  -0.27724092028276E-1
+-0.27616839116594E-1  -0.27509752679074E-1  -0.27402832909958E-1  -0.27296080006278E-1  -0.27189494163756E-1
+-0.27083075579076E-1  -0.26976824449796E-1   -0.268707409723E-1  -0.2676482534547E-1  -0.26659077767455E-1
+-0.26553498436605E-1  -0.26448087552488E-1  -0.26342845313461E-1  -0.26237771920083E-1  -0.26132867573032E-1
+-0.26028132472373E-1  -0.25923566820195E-1  -0.25819170817429E-1  -0.25714944666218E-1  -0.25610888569685E-1
+-0.25507002729938E-1  -0.25403287350917E-1  -0.25299742635773E-1  -0.25196368788121E-1  -0.25093166013538E-1
+-0.24990134516227E-1  -0.24887274502234E-1  -0.24784586177637E-1  -0.24682069748069E-1  -0.24579725420934E-1
+-0.24477553402472E-1  -0.24375553900356E-1  -0.24273727123273E-1  -0.24172073278662E-1  -0.24070592576392E-1
+-0.23969285225387E-1  -0.23868151435045E-1  -0.23767191416411E-1  -0.23666405379404E-1  -0.23565793535479E-1
+-0.2346535609598E-1  -0.23365093271775E-1  -0.23265005276474E-1  -0.23165092322306E-1  -0.23065354622682E-1
+-0.22965792391772E-1  -0.22866405842485E-1  -0.2276719519062E-1  -0.22668160650938E-1  -0.22569302438627E-1
+-0.22470620770081E-1  -0.22372115860399E-1  -0.2227378792717E-1  -0.22175637187827E-1  -0.22077663859382E-1
+-0.2197986816091E-1  -0.21882250310218E-1  -0.21784810526604E-1  -0.21687549030194E-1  -0.21590466040048E-1
+-0.21493561777374E-1  -0.21396836462323E-1  -0.21300290315814E-1  -0.2120392356061E-1  -0.21107736418103E-1
+-0.21011729111639E-1  -0.20915901864314E-1  -0.20820254898907E-1  -0.20724788440649E-1  -0.20629502713519E-1
+-0.20534397942646E-1  -0.2043947435374E-1  -0.20344732171142E-1  -0.20250171622715E-1  -0.20155792934854E-1
+-0.2006159633468E-1  -0.19967582050795E-1  -0.19873750310629E-1  -0.1978010134345E-1  -0.19686635378192E-1
+-0.19593352643555E-1  -0.19500253370898E-1  -0.19407337790118E-1  -0.19314606132573E-1  -0.19222058630232E-1
+-0.19129695513816E-1  -0.19037517017182E-1  -0.18945523372908E-1  -0.18853714814234E-1  -0.18762091575579E-1
+-0.18670653889962E-1  -0.1857940199324E-1  -0.18488336120816E-1  -0.18397456507891E-1  -0.18306763391743E-1
+-0.18216257008281E-1  -0.1812593759518E-1  -0.18035805390748E-1  -0.17945860632259E-1  -0.17856103559389E-1
+-0.17766534410557E-1  -0.17677153425233E-1  -0.17587960844558E-1  -0.1749895690823E-1  -0.17410141858277E-1
+-0.17321515936216E-1  -0.1723307938349E-1  -0.17144832443905E-1  -0.17056775359926E-1  -0.16968908375475E-1
+-0.16881231734886E-1  -0.1679374568131E-1  -0.1670645046139E-1  -0.16619346320248E-1  -0.1653243350392E-1
+-0.16445712259735E-1  -0.16359182833582E-1  -0.16272845474163E-1  -0.16186700429588E-1  -0.16100747947943E-1
+-0.16014988279135E-1  -0.1592942167164E-1  -0.15844048376113E-1  -0.15758868643716E-1  -0.15673882724491E-1
+-0.15589090871456E-1  -0.15504493336298E-1  -0.15420090371615E-1  -0.15335882231149E-1  -0.15251869167143E-1
+-0.15168051435022E-1  -0.15084429289435E-1  -0.15001002985088E-1  -0.14917772778737E-1  -0.14834738925653E-1
+-0.14751901683223E-1  -0.14669261309223E-1  -0.14586818060533E-1  -0.1450457219655E-1  -0.14422523975283E-1
+-0.14340673656075E-1  -0.14259021499761E-1  -0.14177567765669E-1  -0.1409631271583E-1  -0.14015256611462E-1
+-0.13934399713992E-1  -0.13853742287145E-1  -0.13773284593205E-1  -0.13693026896243E-1  -0.13612969460541E-1
+-0.13533112549428E-1  -0.13453456429632E-1  -0.13374001366267E-1  -0.13294747625663E-1  -0.13215695475347E-1
+-0.13136845181332E-1  -0.13058197012776E-1  -0.1297975123793E-1  -0.12901508125277E-1  -0.12823467945162E-1
+-0.12745630966379E-1  -0.12667997460231E-1  -0.12590567698238E-1  -0.12513341951052E-1  -0.12436320492178E-1
+-0.12359503593606E-1  -0.12282891528748E-1  -0.12206484572278E-1  -0.12130282997446E-1  -0.12054287080265E-1
+-0.11978497095747E-1  -0.11902913319345E-1  -0.11827536028876E-1  -0.11752365500465E-1  -0.11677402012599E-1
+-0.11602645843877E-1   -0.115280972722E-1  -0.11453756578059E-1  -0.11379624040417E-1  -0.11305699939897E-1
+-0.11231984558431E-1  -0.11158478176347E-1  -0.11085181077152E-1   -0.110120935432E-1  -0.10939215857354E-1
+-0.10866548304625E-1  -0.10794091168489E-1  -0.10721844734613E-1  -0.10649809288624E-1  -0.10577985115448E-1
+-0.10506372503329E-1  -0.10434971738796E-1  -0.10363783109921E-1  -0.10292806905871E-1  -0.10222043414196E-1
+-0.10151492925988E-1  -0.10081155731075E-1  -0.10011032119816E-1  -0.99411223843916E-2  -0.98714268153058E-2
+-0.98019457059869E-2  -0.97326793497653E-2  -0.96636280393476E-2  -0.9594792070268E-2  -0.95261717364224E-2
+-0.94577673334865E-2  -0.93895791582458E-2  -0.93216075059667E-2  -0.92538526751067E-2  -0.91863149627669E-2
+-0.91189946668395E-2  -0.90518920874418E-2  -0.89850075229411E-2  -0.8918341274373E-2  -0.88518936425522E-2
+-0.87856649277817E-2  -0.87196554334094E-2  -0.86538654611327E-2  -0.85882953143085E-2  -0.85229452972182E-2
+-0.84578157124263E-2  -0.8392906866587E-2  -0.83282190646842E-2  -0.82637526125457E-2  -0.8199507817989E-2
+-0.81354849872057E-2  -0.8071684428996E-2  -0.80081064518274E-2  -0.79447513637513E-2  -0.78816194760488E-2
+-0.78187110981859E-2  -0.77560265415225E-2  -0.7693566118342E-2  -0.7631330139224E-2  -0.75693189187635E-2
+ -0.750753276988E-2  -0.74459720063764E-2  -0.73846369438196E-2  -0.73235278959913E-2  -0.72626451799881E-2
+-0.72019891124506E-2  -0.7141560009677E-2  -0.70813581908106E-2  -0.70213839732225E-2  -0.69616376764267E-2
+-0.69021196208248E-2  -0.68428301253034E-2  -0.67837695122858E-2   -0.672493810252E-2  -0.66663362179233E-2
+-0.66079641825044E-2  -0.65498223184311E-2  -0.64919109509276E-2  -0.64342304046587E-2  -0.63767810040769E-2
+-0.63195630766745E-2  -0.62625769481602E-2  -0.62058229462606E-2  -0.61493013994065E-2  -0.60930126344403E-2
+-0.60369569824404E-2  -0.59811347726094E-2  -0.59255463353105E-2  -0.58701920027361E-2  -0.58150721052304E-2
+-0.57601869765454E-2  -0.5705536949763E-2  -0.56511223578497E-2  -0.55969435364683E-2  -0.55430008194189E-2
+-0.54892945430302E-2  -0.54358250443567E-2  -0.53825926589493E-2  -0.53295977262603E-2  -0.52768405839694E-2
+-0.5224321570971E-2  -0.51720410278663E-2  -0.51199992933473E-2  -0.50681967098436E-2  -0.50166336189356E-2
+-0.49653103621922E-2  -0.49142272840079E-2  -0.48633847268691E-2  -0.48127830358068E-2  -0.4762422556441E-2
+ -0.471230363307E-2  -0.4662426613645E-2  -0.46127918442799E-2  -0.4563399672608E-2  -0.45142504481635E-2
+-0.44653445185353E-2  -0.44166822348735E-2  -0.43682639473838E-2  -0.43200900064021E-2  -0.42721607652032E-2
+-0.42244765751456E-2  -0.41770377900601E-2  -0.41298447642027E-2  -0.40828978505068E-2  -0.40361974060823E-2
+-0.3989743786037E-2  -0.39435373470098E-2  -0.38975784473373E-2  -0.38518674433957E-2  -0.3806404695438E-2
+-0.3761190562638E-2  -0.3716225404397E-2  -0.36715095828078E-2  -0.3627043457958E-2  -0.35828273928826E-2
+-0.35388617509931E-2  -0.34951468944828E-2  -0.34516831894087E-2  -0.34084709998559E-2  -0.33655106916246E-2
+-0.33228026322158E-2  -0.32803471871992E-2  -0.32381447259118E-2  -0.31961956164694E-2  -0.31545002273991E-2
+-0.3113058930206E-2  -0.30718720942826E-2  -0.30309400919635E-2  -0.29902632958295E-2  -0.29498420773923E-2
+-0.2909676811895E-2  -0.28697678725756E-2  -0.28301156345865E-2  -0.27907204747678E-2  -0.27515827679157E-2
+-0.27127028929136E-2  -0.26740812272646E-2  -0.26357181489942E-2  -0.2597614038967E-2  -0.25597692759878E-2
+-0.25221842418255E-2  -0.24848593183363E-2  -0.24477948863602E-2  -0.24109913308536E-2  -0.23744490346383E-2
+-0.23381683824739E-2  -0.23021497606445E-2  -0.22663935533626E-2  -0.22309001492386E-2  -0.21956699353456E-2
+-0.21607032993868E-2  -0.21260006317063E-2    -0.20915623205E-2  -0.20573887573766E-2  -0.20234803339328E-2
+-0.19898374408541E-2  -0.19564604727016E-2  -0.19233498219054E-2  -0.18905058830361E-2  -0.18579290521592E-2
+-0.18256197232867E-2  -0.17935782947833E-2  -0.17618051633236E-2  -0.17303007264211E-2  -0.16990653844146E-2
+-0.16680995354233E-2  -0.16374035809723E-2  -0.16069779224277E-2  -0.15768229603685E-2  -0.15469390993403E-2
+-0.15173267417187E-2  -0.14879862920661E-2  -0.14589181563082E-2  -0.14301227382033E-2  -0.14016004463895E-2
+-0.13733516875783E-2  -0.13453768694367E-2  -0.13176764023128E-2  -0.12902506943617E-2  -0.12631001572428E-2
+-0.12362252023122E-2  -0.12096262402571E-2  -0.11833036858108E-2  -0.11572579514239E-2  -0.11314894519422E-2
+-0.11059986035264E-2  -0.10807858201516E-2  -0.10558515207616E-2  -0.10311961222483E-2  -0.1006820042596E-2
+-0.98272370234785E-3  -0.95890751975361E-3  -0.93537191697686E-3  -0.91211731574287E-3  -0.88914413721881E-3
+-0.86645280643732E-3  -0.84404374613503E-3  -0.82191738165305E-3  -0.80007413958656E-3  -0.77851444436237E-3
+-0.75723872538819E-3  -0.73624740986458E-3  -0.71554092630809E-3  -0.69511970587808E-3  -0.67498417738758E-3
+-0.65513477361069E-3  -0.6355719267318E-3  -0.61629606852172E-3  -0.59730763466131E-3  -0.57860705848872E-3
+-0.56019477604117E-3  -0.54207122446238E-3  -0.52423683876497E-3  -0.50669205919079E-3  -0.48943732366139E-3
+-0.47247307152323E-3  -0.45579974462836E-3  -0.43941778245359E-3  -0.42332762868491E-3  -0.40752972626449E-3
+-0.39202451785544E-3  -0.37681244992344E-3  -0.36189396652617E-3  -0.34726951469522E-3  -0.33293954248135E-3
+-0.31890449590944E-3  -0.30516482613451E-3  -0.29172098197806E-3  -0.27857341381609E-3  -0.26572257446433E-3
+-0.25316891430202E-3  -0.24091288816095E-3  -0.22895494995228E-3  -0.21729555344612E-3  -0.20593515623797E-3
+-0.19487421345853E-3  -0.18411318335227E-3  -0.17365252504424E-3  -0.16349269575673E-3  -0.15363415780791E-3
+-0.14407737111306E-3  -0.13482279733315E-3  -0.1258709005646E-3  -0.11722214242093E-3  -0.1088769890951E-3
+-0.10083590569591E-3  -0.93099357348157E-4  -0.85667813001108E-4  -0.78541739083955E-4  -0.71721605295356E-4
+-0.65207882068843E-4  -0.59001038022916E-4  -0.53101546975722E-4  -0.47509880257601E-4  -0.42226511086741E-4
+-0.37251915015477E-4  -0.32586565073856E-4  -0.28230939106284E-4  -0.24185513693527E-4  -0.20450765585832E-4
+-0.17027175308443E-4  -0.1391522080043E-4  -0.11115383496019E-4  -0.86281454348713E-5  -0.64539869572879E-5
+-0.45933935663466E-5  -0.30468482236608E-5  -0.18148359506597E-5  -0.89784403731179E-6  -0.29635889385556E-6
\ No newline at end of file
diff --git a/examples/ttm/in.ttm b/examples/ttm/in.ttm
new file mode 100644
index 0000000000..77bc09add2
--- /dev/null
+++ b/examples/ttm/in.ttm
@@ -0,0 +1,42 @@
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax} &
+                units lattice
+create_box 	1 sim_box
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax} &
+                units lattice
+create_atoms 	1 region atom_box
+
+mass            1 55.845
+
+include		pot_iron.mod
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm 342785 1.2470e-5 0.087614 &
+                0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
diff --git a/examples/ttm/in.ttm.grid b/examples/ttm/in.ttm.grid
new file mode 100644
index 0000000000..56d7a4d1ad
--- /dev/null
+++ b/examples/ttm/in.ttm.grid
@@ -0,0 +1,42 @@
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax} &
+                units lattice
+create_box 	1 sim_box
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax} &
+                units lattice
+create_atoms 	1 region atom_box
+
+mass            1 55.845
+
+include		pot_iron.mod
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614 &
+                0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
diff --git a/examples/ttm/log.26Aug21.ttm.g++.1 b/examples/ttm/log.26Aug21.ttm.g++.1
new file mode 100644
index 0000000000..7340e095a7
--- /dev/null
+++ b/examples/ttm/log.26Aug21.ttm.g++.1
@@ -0,0 +1,118 @@
+LAMMPS (30 Jul 2021)
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+lattice         bcc 2.87
+Lattice spacing in x,y,z = 2.8700000 2.8700000 2.8700000
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 10                 units lattice
+create_box 	1 sim_box
+Created orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  1 by 1 by 1 MPI processor grid
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 10                 units lattice
+create_atoms 	1 region atom_box
+Created 16000 atoms
+  using lattice units in orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  create_atoms CPU = 0.003 seconds
+
+mass            1 55.845
+
+include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+dump            1 all custom 1000 tmp.dump.ttm id type x y z c_ke c_pe
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
+Neighbor list info ...
+  update every 5 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 6.524
+  ghost atom cutoff = 6.524
+  binsize = 3.262, bins = 18 18 18
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair eam/fs, perpetual
+      attributes: half, newton on
+      pair build: half/bin/atomonly/newton
+      stencil: half/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 13.82 | 13.82 | 13.82 Mbytes
+Step Temp TotEng f_twotemp[1] f_twotemp[2] 
+       0                    0   -68483.52254543516    371.9188105082105                    0 
+     100    17.00947824197047   -68446.51095116073    334.6305417428716   0.3760709738059772 
+     200    27.90625180507924   -68413.17749063623    301.3358408995842   0.3161167973265658 
+     300    32.19243232351598    -68383.2226191097    271.4018727219317   0.2902233631657705 
+     400     33.4532840518293   -68355.76078178188    243.9648281740988   0.2545400268100776 
+     500    35.52815331681829    -68331.6643206617    219.8831664440165   0.2389083849000776 
+     600    40.61109011282667   -68309.39522245103    197.5869310464551   0.3052890341245368 
+     700    46.19736836207273   -68290.15919155753    178.4094794163846   0.1982374463651033 
+     800    50.43097177176409   -68272.75667145227    161.0251849674132   0.1708816198953868 
+     900    52.16219449883412   -68257.88199640217    146.1880396210572   0.1034574178558495 
+    1000    53.48751887610941   -68244.41443573481    132.7439331429908  0.06426914262099545 
+Loop time of 15.1122 on 1 procs for 1000 steps with 16000 atoms
+
+Performance: 0.572 ns/day, 41.978 hours/ns, 66.172 timesteps/s
+99.9% CPU use with 1 MPI tasks x no OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 13.929     | 13.929     | 13.929     |   0.0 | 92.17
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.08636    | 0.08636    | 0.08636    |   0.0 |  0.57
+Output  | 0.029141   | 0.029141   | 0.029141   |   0.0 |  0.19
+Modify  | 1.0235     | 1.0235     | 1.0235     |   0.0 |  6.77
+Other   |            | 0.04389    |            |       |  0.29
+
+Nlocal:        16000.0 ave       16000 max       16000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost:        13449.0 ave       13449 max       13449 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs:        896000.0 ave      896000 max      896000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 896000
+Ave neighs/atom = 56.000000
+Neighbor list builds = 0
+Dangerous builds = 0
+
+write_restart   tmp.restart.ttm
+System init for write_restart ...
+Total wall time: 0:00:15
diff --git a/examples/ttm/log.26Aug21.ttm.g++.4 b/examples/ttm/log.26Aug21.ttm.g++.4
new file mode 100644
index 0000000000..1ba180ef76
--- /dev/null
+++ b/examples/ttm/log.26Aug21.ttm.g++.4
@@ -0,0 +1,118 @@
+LAMMPS (30 Jul 2021)
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+lattice         bcc 2.87
+Lattice spacing in x,y,z = 2.8700000 2.8700000 2.8700000
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 10                 units lattice
+create_box 	1 sim_box
+Created orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  1 by 2 by 2 MPI processor grid
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 10                 units lattice
+create_atoms 	1 region atom_box
+Created 16000 atoms
+  using lattice units in orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  create_atoms CPU = 0.002 seconds
+
+mass            1 55.845
+
+include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+dump            1 all custom 1000 tmp.dump.ttm id type x y z c_ke c_pe
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
+Neighbor list info ...
+  update every 5 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 6.524
+  ghost atom cutoff = 6.524
+  binsize = 3.262, bins = 18 18 18
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair eam/fs, perpetual
+      attributes: half, newton on
+      pair build: half/bin/atomonly/newton
+      stencil: half/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 6.559 | 6.559 | 6.559 Mbytes
+Step Temp TotEng f_twotemp[1] f_twotemp[2] 
+       0                    0   -68483.52254530673    371.9188105082105                    0 
+     100    16.95254977583874   -68446.65370077227    334.7807307441603   0.3600757576618061 
+     200    27.82076000591521   -68413.49962571842    301.6698518274451   0.2923012030382478 
+     300    32.28064646099917   -68383.43127112807     271.620630836186   0.2697897656149546 
+     400    33.32631162065878   -68356.76508047059    244.9939728689737   0.2059848798035755 
+     500    35.13985645761556   -68332.75838831626    220.9563145448484   0.2799090544324762 
+     600    39.58297841774112   -68311.05917212959    199.2875787815293   0.2309225167135088 
+     700    45.34109481744322   -68291.67926830769      179.95673920187   0.1434664891770075 
+     800    49.66116134168288   -68275.00925057202     163.282485803462   0.1598759550824534 
+     900    52.17137809502143   -68259.83087950756    148.1293852818856    0.118013038413826 
+    1000     54.2344556410713   -68245.61817879432    133.9139611916062   0.1315530159773972 
+Loop time of 4.97562 on 4 procs for 1000 steps with 16000 atoms
+
+Performance: 1.736 ns/day, 13.821 hours/ns, 200.980 timesteps/s
+98.4% CPU use with 4 MPI tasks x no OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 4.1408     | 4.262      | 4.4044     |   5.5 | 85.66
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.18288    | 0.3266     | 0.44977    |  20.3 |  6.56
+Output  | 0.0091008  | 0.0099765  | 0.01029    |   0.5 |  0.20
+Modify  | 0.34765    | 0.35054    | 0.35404    |   0.4 |  7.05
+Other   |            | 0.02651    |            |       |  0.53
+
+Nlocal:        4000.00 ave        4000 max        4000 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Nghost:        6329.00 ave        6329 max        6329 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Neighs:        224000.0 ave      227436 max      220450 min
+Histogram: 1 0 1 0 0 0 0 1 0 1
+
+Total # of neighbors = 896000
+Ave neighs/atom = 56.000000
+Neighbor list builds = 0
+Dangerous builds = 0
+
+write_restart   tmp.restart.ttm
+System init for write_restart ...
+Total wall time: 0:00:05
diff --git a/examples/ttm/log.26Aug21.ttm.grid.g++.1 b/examples/ttm/log.26Aug21.ttm.grid.g++.1
new file mode 100644
index 0000000000..d88bcae516
--- /dev/null
+++ b/examples/ttm/log.26Aug21.ttm.grid.g++.1
@@ -0,0 +1,118 @@
+LAMMPS (30 Jul 2021)
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+lattice         bcc 2.87
+Lattice spacing in x,y,z = 2.8700000 2.8700000 2.8700000
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 10                 units lattice
+create_box 	1 sim_box
+Created orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  1 by 1 by 1 MPI processor grid
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 10                 units lattice
+create_atoms 	1 region atom_box
+Created 16000 atoms
+  using lattice units in orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  create_atoms CPU = 0.005 seconds
+
+mass            1 55.845
+
+include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm.grid
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+dump            1 all custom 1000 tmp.dump.ttm.grid id type x y z c_ke c_pe
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
+Neighbor list info ...
+  update every 5 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 6.524
+  ghost atom cutoff = 6.524
+  binsize = 3.262, bins = 18 18 18
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair eam/fs, perpetual
+      attributes: half, newton on
+      pair build: half/bin/atomonly/newton
+      stencil: half/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 13.85 | 13.85 | 13.85 Mbytes
+Step Temp TotEng f_twotemp[1] f_twotemp[2] 
+       0                    0   -68483.52254543516    371.9188105082105                    0 
+     100    17.00947824197047   -68446.51095116073    334.6305417428716   0.3760709738059774 
+     200    27.90625180507924   -68413.17749063623    301.3358408995842   0.3161167973265658 
+     300    32.19243232351597    -68383.2226191097    271.4018727219317   0.2902233631657708 
+     400    33.45328405182931   -68355.76078178188    243.9648281740989    0.254540026810078 
+     500    35.52815331681825   -68331.66432066172    219.8831664440165   0.2389083849000778 
+     600    40.61109011282666   -68309.39522245103    197.5869310464551   0.3052890341245368 
+     700    46.19736836207277   -68290.15919155753    178.4094794163846   0.1982374463651032 
+     800     50.4309717717641   -68272.75667145227    161.0251849674133   0.1708816198953871 
+     900    52.16219449883405   -68257.88199640217    146.1880396210573   0.1034574178558499 
+    1000    53.48751887610945   -68244.41443573478    132.7439331429909  0.06426914262099563 
+Loop time of 16.6744 on 1 procs for 1000 steps with 16000 atoms
+
+Performance: 0.518 ns/day, 46.318 hours/ns, 59.972 timesteps/s
+100.0% CPU use with 1 MPI tasks x no OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 15.418     | 15.418     | 15.418     |   0.0 | 92.46
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.095105   | 0.095105   | 0.095105   |   0.0 |  0.57
+Output  | 0.02782    | 0.02782    | 0.02782    |   0.0 |  0.17
+Modify  | 1.0867     | 1.0867     | 1.0867     |   0.0 |  6.52
+Other   |            | 0.04719    |            |       |  0.28
+
+Nlocal:        16000.0 ave       16000 max       16000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost:        13449.0 ave       13449 max       13449 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs:        896000.0 ave      896000 max      896000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 896000
+Ave neighs/atom = 56.000000
+Neighbor list builds = 0
+Dangerous builds = 0
+
+write_restart   tmp.restart.ttm.grid
+System init for write_restart ...
+Total wall time: 0:00:16
diff --git a/examples/ttm/log.26Aug21.ttm.grid.g++.4 b/examples/ttm/log.26Aug21.ttm.grid.g++.4
new file mode 100644
index 0000000000..f72ad9585e
--- /dev/null
+++ b/examples/ttm/log.26Aug21.ttm.grid.g++.4
@@ -0,0 +1,118 @@
+LAMMPS (30 Jul 2021)
+units           metal
+atom_style      atomic
+boundary        p p p
+
+variable        latc  equal 2.87
+lattice         bcc ${latc}
+lattice         bcc 2.87
+Lattice spacing in x,y,z = 2.8700000 2.8700000 2.8700000
+variable 	xmax equal   10.0
+variable 	xmin equal  -10.0
+variable 	ymax equal   10.0
+variable 	ymin equal  -10.0
+variable 	zmax equal   10.0
+variable 	zmin equal  -10.0
+
+region 		sim_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		sim_box block -10 10 -10 10 -10 10                 units lattice
+create_box 	1 sim_box
+Created orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  1 by 2 by 2 MPI processor grid
+region 		atom_box block ${xmin} ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 ${xmax} ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 ${ymin} ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 ${ymax} ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 ${zmin} ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 ${zmax}                 units lattice
+region 		atom_box block -10 10 -10 10 -10 10                 units lattice
+create_atoms 	1 region atom_box
+Created 16000 atoms
+  using lattice units in orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
+  create_atoms CPU = 0.002 seconds
+
+mass            1 55.845
+
+include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
+
+neighbor        2.0 bin
+neigh_modify    every 5 delay 0 check yes
+
+fix             1 all nve
+
+fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm.grid
+
+compute         pe all pe/atom
+compute         ke all ke/atom
+
+dump            1 all custom 1000 tmp.dump.ttm.grid id type x y z c_ke c_pe
+
+timestep        0.0001
+thermo          100
+
+thermo_style    custom step temp etotal f_twotemp[1] f_twotemp[2]
+                thermo_modify format float "%20.16g"
+
+run             1000
+Neighbor list info ...
+  update every 5 steps, delay 0 steps, check yes
+  max neighbors/atom: 2000, page size: 100000
+  master list distance cutoff = 6.524
+  ghost atom cutoff = 6.524
+  binsize = 3.262, bins = 18 18 18
+  1 neighbor lists, perpetual/occasional/extra = 1 0 0
+  (1) pair eam/fs, perpetual
+      attributes: half, newton on
+      pair build: half/bin/atomonly/newton
+      stencil: half/bin/3d
+      bin: standard
+Per MPI rank memory allocation (min/avg/max) = 6.557 | 6.557 | 6.557 Mbytes
+Step Temp TotEng f_twotemp[1] f_twotemp[2] 
+       0                    0   -68483.52254530673    371.9188105082186                    0 
+     100    16.95254977583874   -68446.65370077227    334.7807307441606   0.3600757576618061 
+     200    27.82076000591522   -68413.49962571842     301.669851827445   0.2923012030382476 
+     300    32.28064646099917   -68383.43127112807    271.6206308361861   0.2697897656149546 
+     400    33.32631162065878   -68356.76508047059    244.9939728689737   0.2059848798035755 
+     500    35.13985645761555   -68332.75838831626    220.9563145448483   0.2799090544324762 
+     600    39.58297841774112   -68311.05917212959    199.2875787815293   0.2309225167135089 
+     700    45.34109481744325   -68291.67926830769    179.9567392018701   0.1434664891770076 
+     800    49.66116134168287   -68275.00925057202    163.2824858034622   0.1598759550824539 
+     900    52.17137809502142   -68259.83087950756    148.1293852818859   0.1180130384138258 
+    1000    54.23445564107136   -68245.61817879431    133.9139611916063   0.1315530159773979 
+Loop time of 4.77383 on 4 procs for 1000 steps with 16000 atoms
+
+Performance: 1.810 ns/day, 13.261 hours/ns, 209.476 timesteps/s
+98.3% CPU use with 4 MPI tasks x no OpenMP threads
+
+MPI task timing breakdown:
+Section |  min time  |  avg time  |  max time  |%varavg| %total
+---------------------------------------------------------------
+Pair    | 4.0601     | 4.1512     | 4.2622     |   4.0 | 86.96
+Neigh   | 0          | 0          | 0          |   0.0 |  0.00
+Comm    | 0.16244    | 0.27412    | 0.36544    |  15.5 |  5.74
+Output  | 0.0085038  | 0.0088961  | 0.0093065  |   0.3 |  0.19
+Modify  | 0.31302    | 0.31333    | 0.31363    |   0.0 |  6.56
+Other   |            | 0.02623    |            |       |  0.55
+
+Nlocal:        4000.00 ave        4000 max        4000 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Nghost:        6329.00 ave        6329 max        6329 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Neighs:        224000.0 ave      227436 max      220450 min
+Histogram: 1 0 1 0 0 0 0 1 0 1
+
+Total # of neighbors = 896000
+Ave neighs/atom = 56.000000
+Neighbor list builds = 0
+Dangerous builds = 0
+
+write_restart   tmp.restart.ttm.grid
+System init for write_restart ...
+Total wall time: 0:00:04
diff --git a/examples/ttm/pot_iron.mod b/examples/ttm/pot_iron.mod
new file mode 100644
index 0000000000..450cd00541
--- /dev/null
+++ b/examples/ttm/pot_iron.mod
@@ -0,0 +1,2 @@
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index edc481726b..e7f15666f6 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -77,12 +77,19 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   nxgrid = utils::inumeric(FLERR,arg[10],false,lmp);
   nygrid = utils::inumeric(FLERR,arg[11],false,lmp);
   nzgrid = utils::inumeric(FLERR,arg[12],false,lmp);
-
+  
+  tinit = 0.0;
   infile = outfile = NULL;
-
+  
   int iarg = 13;
   while (iarg < narg) {
-    if (strcmp(arg[iarg],"infile") == 0) {
+    if (strcmp(arg[iarg],"set") == 0) {
+      if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm command");
+      tinit = utils::numeric(FLERR,arg[iarg+1],false,lmp);
+      if (tinit <= 0.0) 
+        error->all(FLERR,"Fix ttm initial temperature must be > 0.0");
+      iarg += 2;
+    } else if (strcmp(arg[iarg],"infile") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm command");
       int n = strlen(arg[iarg+1]) + 1;
       infile = new char[n];
@@ -183,9 +190,13 @@ void FixTTM::post_constructor()
 
   allocate_grid();
 
-  // zero electron temperatures (default)
+  // initialize electron temperatures on grid
 
-  memset(&T_electron[0][0][0],0,ngridtotal*sizeof(double));
+  int ix,iy,iz;
+  for (iz = 0; iz < nzgrid; iz++)
+    for (iy = 0; iy < nygrid; iy++)
+      for (ix = 0; ix < nxgrid; ix++)
+        T_electron[iz][iy][ix] = tinit;
 
   // zero net_energy_transfer_all
   // in case compute_vector accesses it on timestep 0
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index 5268142232..601aae45ab 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -55,7 +55,7 @@ class FixTTM : public Fix {
   int ngridtotal;                 // total size of global grid
   int deallocate_flag;
   int outflag,outevery;
-  double shift;
+  double shift,tinit;
   double e_energy,transfer_energy;
   char *infile,*outfile;
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 06ebe418b1..31996acd37 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -65,9 +65,13 @@ void FixTTMGrid::post_constructor()
 
   allocate_grid();
 
-  // zero electron temperatures (default)
+  // initialize electron temperatures on grid
 
-  memset(&T_electron[nzlo_out][nylo_out][nxlo_out],0,ngridout*sizeof(double));
+  int ix,iy,iz;
+  for (iz = nzlo_out; iz <= nzhi_out; iz++)
+    for (iy = nylo_out; iy <= nyhi_out; iy++)
+      for (ix = nxlo_out; ix <= nxhi_out; ix++)
+        T_electron[iz][iy][ix] = tinit;
   
   // zero net_energy_transfer
   // in case compute_vector accesses it on timestep 0
diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 8c5178159d..b2d13b36c1 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -100,11 +100,18 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   nynodes = utils::inumeric(FLERR,arg[6],false,lmp);
   nznodes = utils::inumeric(FLERR,arg[7],false,lmp);
 
+  double tinit = 0.0;
   infile = outfile = NULL;
 
   int iarg = 8;
   while (iarg < narg) {
-    if (strcmp(arg[iarg],"infile") == 0) {
+    if (strcmp(arg[iarg],"set") == 0) {
+      if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
+      tinit = utils::numeric(FLERR,arg[iarg+1],false,lmp);
+      if (tinit <= 0.0) 
+        error->all(FLERR,"Fix ttm/mod initial temperature must be > 0.0");
+      iarg += 2;
+    } else if (strcmp(arg[iarg],"infile") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
       int n = strlen(arg[iarg+1]) + 1;
       infile = new char[n];
@@ -198,10 +205,16 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   atom->add_callback(Atom::GROW);
   atom->add_callback(Atom::RESTART);
 
-  // zero electron temperatures (default)
+  // initialize electron temperatures on grid
+
+  int ix,iy,iz;
+  for (ix = 0; ix < nxnodes; ix++)
+    for (iy = 0; iy < nynodes; iy++)
+      for (iz = 0; iz < nznodes; iz++)
+        T_electron[ix][iy][iz] = tinit;
+
   // if specified, read initial electron temperatures from file
 
-  memset(&T_electron[0][0][0],0,ngridtotal*sizeof(double));
   if (infile) {
     if (comm->me == 0) read_electron_temperatures(infile);
     MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);

From 62fcaedd33f15954370a8628de372a553ae33502 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 13:25:46 -0600
Subject: [PATCH 147/437] update example log files

---
 examples/ttm/log.26Aug21.ttm.g++.1      | 47 +++++++++++--------------
 examples/ttm/log.26Aug21.ttm.g++.4      | 45 +++++++++++------------
 examples/ttm/log.26Aug21.ttm.grid.g++.1 | 45 +++++++++++------------
 examples/ttm/log.26Aug21.ttm.grid.g++.4 | 47 +++++++++++--------------
 4 files changed, 82 insertions(+), 102 deletions(-)

diff --git a/examples/ttm/log.26Aug21.ttm.g++.1 b/examples/ttm/log.26Aug21.ttm.g++.1
index 7340e095a7..a0e8ca6f1f 100644
--- a/examples/ttm/log.26Aug21.ttm.g++.1
+++ b/examples/ttm/log.26Aug21.ttm.g++.1
@@ -34,7 +34,7 @@ region 		atom_box block -10 10 -10 10 -10 10                 units lattice
 create_atoms 	1 region atom_box
 Created 16000 atoms
   using lattice units in orthogonal box = (-28.700000 -28.700000 -28.700000) to (28.700000 28.700000 28.700000)
-  create_atoms CPU = 0.003 seconds
+  create_atoms CPU = 0.005 seconds
 
 mass            1 55.845
 
@@ -47,13 +47,11 @@ neigh_modify    every 5 delay 0 check yes
 
 fix             1 all nve
 
-fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm
+fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
 
 compute         pe all pe/atom
 compute         ke all ke/atom
 
-dump            1 all custom 1000 tmp.dump.ttm id type x y z c_ke c_pe
-
 timestep        0.0001
 thermo          100
 
@@ -73,33 +71,33 @@ Neighbor list info ...
       pair build: half/bin/atomonly/newton
       stencil: half/bin/3d
       bin: standard
-Per MPI rank memory allocation (min/avg/max) = 13.82 | 13.82 | 13.82 Mbytes
+Per MPI rank memory allocation (min/avg/max) = 10.97 | 10.97 | 10.97 Mbytes
 Step Temp TotEng f_twotemp[1] f_twotemp[2] 
        0                    0   -68483.52254543516    371.9188105082105                    0 
-     100    17.00947824197047   -68446.51095116073    334.6305417428716   0.3760709738059772 
-     200    27.90625180507924   -68413.17749063623    301.3358408995842   0.3161167973265658 
-     300    32.19243232351598    -68383.2226191097    271.4018727219317   0.2902233631657705 
-     400     33.4532840518293   -68355.76078178188    243.9648281740988   0.2545400268100776 
-     500    35.52815331681829    -68331.6643206617    219.8831664440165   0.2389083849000776 
-     600    40.61109011282667   -68309.39522245103    197.5869310464551   0.3052890341245368 
-     700    46.19736836207273   -68290.15919155753    178.4094794163846   0.1982374463651033 
-     800    50.43097177176409   -68272.75667145227    161.0251849674132   0.1708816198953868 
-     900    52.16219449883412   -68257.88199640217    146.1880396210572   0.1034574178558495 
-    1000    53.48751887610941   -68244.41443573481    132.7439331429908  0.06426914262099545 
-Loop time of 15.1122 on 1 procs for 1000 steps with 16000 atoms
+     100    17.01353086098387   -68446.50228930202    334.6217068813629   0.3763710887774045 
+     200    27.91331236535322   -68413.16008042906    301.3181773007303   0.3165912892484031 
+     300    32.20115656493127   -68383.19634217303    271.3756381838044   0.2901111802983097 
+     400    33.46056398887347   -68355.73057141017    243.9344715501159   0.2548133388123376 
+     500     35.5346204243821   -68331.63060947017      219.84946888619   0.2388591367999412 
+     600    40.61692458441595   -68309.36124792948    197.5527667607885   0.3056696014124333 
+     700    46.20303146200327   -68290.12727395596    178.3775768561404   0.1982123493608405 
+     800    50.43750181899325   -68272.72651051797     160.995046695269   0.1708386295858842 
+     900     52.1701171463511   -68257.85059865141    146.1567281868866   0.1032829304640773 
+    1000    53.49296457217385   -68244.38715993935    132.7166474251701  0.06428993394665879 
+Loop time of 17.1447 on 1 procs for 1000 steps with 16000 atoms
 
-Performance: 0.572 ns/day, 41.978 hours/ns, 66.172 timesteps/s
+Performance: 0.504 ns/day, 47.624 hours/ns, 58.327 timesteps/s
 99.9% CPU use with 1 MPI tasks x no OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 13.929     | 13.929     | 13.929     |   0.0 | 92.17
+Pair    | 15.811     | 15.811     | 15.811     |   0.0 | 92.22
 Neigh   | 0          | 0          | 0          |   0.0 |  0.00
-Comm    | 0.08636    | 0.08636    | 0.08636    |   0.0 |  0.57
-Output  | 0.029141   | 0.029141   | 0.029141   |   0.0 |  0.19
-Modify  | 1.0235     | 1.0235     | 1.0235     |   0.0 |  6.77
-Other   |            | 0.04389    |            |       |  0.29
+Comm    | 0.094539   | 0.094539   | 0.094539   |   0.0 |  0.55
+Output  | 0.00093974 | 0.00093974 | 0.00093974 |   0.0 |  0.01
+Modify  | 1.1898     | 1.1898     | 1.1898     |   0.0 |  6.94
+Other   |            | 0.04797    |            |       |  0.28
 
 Nlocal:        16000.0 ave       16000 max       16000 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -112,7 +110,4 @@ Total # of neighbors = 896000
 Ave neighs/atom = 56.000000
 Neighbor list builds = 0
 Dangerous builds = 0
-
-write_restart   tmp.restart.ttm
-System init for write_restart ...
-Total wall time: 0:00:15
+Total wall time: 0:00:17
diff --git a/examples/ttm/log.26Aug21.ttm.g++.4 b/examples/ttm/log.26Aug21.ttm.g++.4
index 1ba180ef76..3cc6615ed9 100644
--- a/examples/ttm/log.26Aug21.ttm.g++.4
+++ b/examples/ttm/log.26Aug21.ttm.g++.4
@@ -47,13 +47,11 @@ neigh_modify    every 5 delay 0 check yes
 
 fix             1 all nve
 
-fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm
+fix             twotemp all ttm 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
 
 compute         pe all pe/atom
 compute         ke all ke/atom
 
-dump            1 all custom 1000 tmp.dump.ttm id type x y z c_ke c_pe
-
 timestep        0.0001
 thermo          100
 
@@ -73,33 +71,33 @@ Neighbor list info ...
       pair build: half/bin/atomonly/newton
       stencil: half/bin/3d
       bin: standard
-Per MPI rank memory allocation (min/avg/max) = 6.559 | 6.559 | 6.559 Mbytes
+Per MPI rank memory allocation (min/avg/max) = 4.845 | 4.845 | 4.845 Mbytes
 Step Temp TotEng f_twotemp[1] f_twotemp[2] 
        0                    0   -68483.52254530673    371.9188105082105                    0 
-     100    16.95254977583874   -68446.65370077227    334.7807307441603   0.3600757576618061 
-     200    27.82076000591521   -68413.49962571842    301.6698518274451   0.2923012030382478 
-     300    32.28064646099917   -68383.43127112807     271.620630836186   0.2697897656149546 
-     400    33.32631162065878   -68356.76508047059    244.9939728689737   0.2059848798035755 
-     500    35.13985645761556   -68332.75838831626    220.9563145448484   0.2799090544324762 
-     600    39.58297841774112   -68311.05917212959    199.2875787815293   0.2309225167135088 
-     700    45.34109481744322   -68291.67926830769      179.95673920187   0.1434664891770075 
-     800    49.66116134168288   -68275.00925057202     163.282485803462   0.1598759550824534 
-     900    52.17137809502143   -68259.83087950756    148.1293852818856    0.118013038413826 
-    1000     54.2344556410713   -68245.61817879432    133.9139611916062   0.1315530159773972 
-Loop time of 4.97562 on 4 procs for 1000 steps with 16000 atoms
+     100    16.95536995775683   -68446.64765713879    334.7745598327934   0.3602932995006091 
+     200    27.82619298359641   -68413.48663012494    301.6568409464845   0.2922875754523596 
+     300      32.286609763559   -68383.41369945828    271.6030085280584   0.2698738824780399 
+     400    33.33119316198579   -68356.74598240001    244.9747750036312   0.2061586600914007 
+     500    35.14534756499593   -68332.73504057307    220.9328922343961   0.2800368538794571 
+     600    39.58922469808519   -68311.03191758461    199.2602622784512    0.231030319616688 
+     700    45.34652315787152   -68291.65247941406    179.9297699858465   0.1438135463248857 
+     800    49.66707856481077   -68274.98092841901    163.2540575286428   0.1600890300738259 
+     900    52.17692450487316    -68259.8031091165    148.1017576370546   0.1177316234407944 
+    1000    54.24228199265477   -68245.58589458199    133.8816957314364   0.1314999893461338 
+Loop time of 5.03135 on 4 procs for 1000 steps with 16000 atoms
 
-Performance: 1.736 ns/day, 13.821 hours/ns, 200.980 timesteps/s
-98.4% CPU use with 4 MPI tasks x no OpenMP threads
+Performance: 1.717 ns/day, 13.976 hours/ns, 198.754 timesteps/s
+98.8% CPU use with 4 MPI tasks x no OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 4.1408     | 4.262      | 4.4044     |   5.5 | 85.66
+Pair    | 4.1173     | 4.2634     | 4.3858     |   5.4 | 84.74
 Neigh   | 0          | 0          | 0          |   0.0 |  0.00
-Comm    | 0.18288    | 0.3266     | 0.44977    |  20.3 |  6.56
-Output  | 0.0091008  | 0.0099765  | 0.01029    |   0.5 |  0.20
-Modify  | 0.34765    | 0.35054    | 0.35404    |   0.4 |  7.05
-Other   |            | 0.02651    |            |       |  0.53
+Comm    | 0.2218     | 0.34547    | 0.49422    |  19.4 |  6.87
+Output  | 0.00031185 | 0.00036952 | 0.00044986 |   0.0 |  0.01
+Modify  | 0.39294    | 0.39605    | 0.39877    |   0.4 |  7.87
+Other   |            | 0.02604    |            |       |  0.52
 
 Nlocal:        4000.00 ave        4000 max        4000 min
 Histogram: 4 0 0 0 0 0 0 0 0 0
@@ -112,7 +110,4 @@ Total # of neighbors = 896000
 Ave neighs/atom = 56.000000
 Neighbor list builds = 0
 Dangerous builds = 0
-
-write_restart   tmp.restart.ttm
-System init for write_restart ...
 Total wall time: 0:00:05
diff --git a/examples/ttm/log.26Aug21.ttm.grid.g++.1 b/examples/ttm/log.26Aug21.ttm.grid.g++.1
index d88bcae516..a576583557 100644
--- a/examples/ttm/log.26Aug21.ttm.grid.g++.1
+++ b/examples/ttm/log.26Aug21.ttm.grid.g++.1
@@ -47,13 +47,11 @@ neigh_modify    every 5 delay 0 check yes
 
 fix             1 all nve
 
-fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm.grid
+fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
 
 compute         pe all pe/atom
 compute         ke all ke/atom
 
-dump            1 all custom 1000 tmp.dump.ttm.grid id type x y z c_ke c_pe
-
 timestep        0.0001
 thermo          100
 
@@ -73,33 +71,33 @@ Neighbor list info ...
       pair build: half/bin/atomonly/newton
       stencil: half/bin/3d
       bin: standard
-Per MPI rank memory allocation (min/avg/max) = 13.85 | 13.85 | 13.85 Mbytes
+Per MPI rank memory allocation (min/avg/max) = 10.99 | 10.99 | 10.99 Mbytes
 Step Temp TotEng f_twotemp[1] f_twotemp[2] 
        0                    0   -68483.52254543516    371.9188105082105                    0 
-     100    17.00947824197047   -68446.51095116073    334.6305417428716   0.3760709738059774 
-     200    27.90625180507924   -68413.17749063623    301.3358408995842   0.3161167973265658 
-     300    32.19243232351597    -68383.2226191097    271.4018727219317   0.2902233631657708 
-     400    33.45328405182931   -68355.76078178188    243.9648281740989    0.254540026810078 
-     500    35.52815331681825   -68331.66432066172    219.8831664440165   0.2389083849000778 
-     600    40.61109011282666   -68309.39522245103    197.5869310464551   0.3052890341245368 
-     700    46.19736836207277   -68290.15919155753    178.4094794163846   0.1982374463651032 
-     800     50.4309717717641   -68272.75667145227    161.0251849674133   0.1708816198953871 
-     900    52.16219449883405   -68257.88199640217    146.1880396210573   0.1034574178558499 
-    1000    53.48751887610945   -68244.41443573478    132.7439331429909  0.06426914262099563 
-Loop time of 16.6744 on 1 procs for 1000 steps with 16000 atoms
+     100    17.01353086098387   -68446.50228930202    334.6217068813629   0.3763710887774046 
+     200    27.91331236535322   -68413.16008042906    301.3181773007303   0.3165912892484031 
+     300    32.20115656493125   -68383.19634217303    271.3756381838045   0.2901111802983097 
+     400    33.46056398887347   -68355.73057141017    243.9344715501159   0.2548133388123378 
+     500     35.5346204243821   -68331.63060947017      219.84946888619   0.2388591367999414 
+     600    40.61692458441596   -68309.36124792948    197.5527667607886   0.3056696014124338 
+     700    46.20303146200326   -68290.12727395598    178.3775768561405   0.1982123493608406 
+     800     50.4375018189932   -68272.72651051797     160.995046695269   0.1708386295858845 
+     900    52.17011714635106   -68257.85059865142    146.1567281868867   0.1032829304640776 
+    1000    53.49296457217382   -68244.38715993936    132.7166474251702  0.06428993394665769 
+Loop time of 14.8767 on 1 procs for 1000 steps with 16000 atoms
 
-Performance: 0.518 ns/day, 46.318 hours/ns, 59.972 timesteps/s
+Performance: 0.581 ns/day, 41.324 hours/ns, 67.219 timesteps/s
 100.0% CPU use with 1 MPI tasks x no OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 15.418     | 15.418     | 15.418     |   0.0 | 92.46
+Pair    | 13.759     | 13.759     | 13.759     |   0.0 | 92.49
 Neigh   | 0          | 0          | 0          |   0.0 |  0.00
-Comm    | 0.095105   | 0.095105   | 0.095105   |   0.0 |  0.57
-Output  | 0.02782    | 0.02782    | 0.02782    |   0.0 |  0.17
-Modify  | 1.0867     | 1.0867     | 1.0867     |   0.0 |  6.52
-Other   |            | 0.04719    |            |       |  0.28
+Comm    | 0.087429   | 0.087429   | 0.087429   |   0.0 |  0.59
+Output  | 0.00063941 | 0.00063941 | 0.00063941 |   0.0 |  0.00
+Modify  | 0.98561    | 0.98561    | 0.98561    |   0.0 |  6.63
+Other   |            | 0.04396    |            |       |  0.30
 
 Nlocal:        16000.0 ave       16000 max       16000 min
 Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -112,7 +110,4 @@ Total # of neighbors = 896000
 Ave neighs/atom = 56.000000
 Neighbor list builds = 0
 Dangerous builds = 0
-
-write_restart   tmp.restart.ttm.grid
-System init for write_restart ...
-Total wall time: 0:00:16
+Total wall time: 0:00:14
diff --git a/examples/ttm/log.26Aug21.ttm.grid.g++.4 b/examples/ttm/log.26Aug21.ttm.grid.g++.4
index f72ad9585e..b603c66df9 100644
--- a/examples/ttm/log.26Aug21.ttm.grid.g++.4
+++ b/examples/ttm/log.26Aug21.ttm.grid.g++.4
@@ -47,13 +47,11 @@ neigh_modify    every 5 delay 0 check yes
 
 fix             1 all nve
 
-fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10                 infile grid_10x10x10 outfile 1000 tmp.grid.ttm.grid
+fix             twotemp all ttm/grid 342785 1.2470e-5 0.087614                 0.005365 29.5917 47.5679 58.4613 10 10 10 set 1800.0
 
 compute         pe all pe/atom
 compute         ke all ke/atom
 
-dump            1 all custom 1000 tmp.dump.ttm.grid id type x y z c_ke c_pe
-
 timestep        0.0001
 thermo          100
 
@@ -73,33 +71,33 @@ Neighbor list info ...
       pair build: half/bin/atomonly/newton
       stencil: half/bin/3d
       bin: standard
-Per MPI rank memory allocation (min/avg/max) = 6.557 | 6.557 | 6.557 Mbytes
+Per MPI rank memory allocation (min/avg/max) = 4.843 | 4.843 | 4.843 Mbytes
 Step Temp TotEng f_twotemp[1] f_twotemp[2] 
        0                    0   -68483.52254530673    371.9188105082186                    0 
-     100    16.95254977583874   -68446.65370077227    334.7807307441606   0.3600757576618061 
-     200    27.82076000591522   -68413.49962571842     301.669851827445   0.2923012030382476 
-     300    32.28064646099917   -68383.43127112807    271.6206308361861   0.2697897656149546 
-     400    33.32631162065878   -68356.76508047059    244.9939728689737   0.2059848798035755 
-     500    35.13985645761555   -68332.75838831626    220.9563145448483   0.2799090544324762 
-     600    39.58297841774112   -68311.05917212959    199.2875787815293   0.2309225167135089 
-     700    45.34109481744325   -68291.67926830769    179.9567392018701   0.1434664891770076 
-     800    49.66116134168287   -68275.00925057202    163.2824858034622   0.1598759550824539 
-     900    52.17137809502142   -68259.83087950756    148.1293852818859   0.1180130384138258 
-    1000    54.23445564107136   -68245.61817879431    133.9139611916063   0.1315530159773979 
-Loop time of 4.77383 on 4 procs for 1000 steps with 16000 atoms
+     100    16.95536995775684   -68446.64765713879    334.7745598327931   0.3602932995006087 
+     200    27.82619298359641   -68413.48663012494    301.6568409464847   0.2922875754523593 
+     300    32.28660976355901   -68383.41369945828    271.6030085280586     0.26987388247804 
+     400    33.33119316198579   -68356.74598240001    244.9747750036311   0.2061586600914003 
+     500    35.14534756499593   -68332.73504057307    220.9328922343961   0.2800368538794578 
+     600    39.58922469808521   -68311.03191758461    199.2602622784512   0.2310303196166884 
+     700    45.34652315787151   -68291.65247941404    179.9297699858464   0.1438135463248855 
+     800    49.66707856481075   -68274.98092841901    163.2540575286425   0.1600890300738265 
+     900    52.17692450487317    -68259.8031091165    148.1017576370548   0.1177316234407941 
+    1000    54.24228199265479   -68245.58589458198    133.8816957314364   0.1314999893461343 
+Loop time of 4.95173 on 4 procs for 1000 steps with 16000 atoms
 
-Performance: 1.810 ns/day, 13.261 hours/ns, 209.476 timesteps/s
-98.3% CPU use with 4 MPI tasks x no OpenMP threads
+Performance: 1.745 ns/day, 13.755 hours/ns, 201.949 timesteps/s
+98.2% CPU use with 4 MPI tasks x no OpenMP threads
 
 MPI task timing breakdown:
 Section |  min time  |  avg time  |  max time  |%varavg| %total
 ---------------------------------------------------------------
-Pair    | 4.0601     | 4.1512     | 4.2622     |   4.0 | 86.96
+Pair    | 4.1159     | 4.2665     | 4.4446     |   7.1 | 86.16
 Neigh   | 0          | 0          | 0          |   0.0 |  0.00
-Comm    | 0.16244    | 0.27412    | 0.36544    |  15.5 |  5.74
-Output  | 0.0085038  | 0.0088961  | 0.0093065  |   0.3 |  0.19
-Modify  | 0.31302    | 0.31333    | 0.31363    |   0.0 |  6.56
-Other   |            | 0.02623    |            |       |  0.55
+Comm    | 0.14618    | 0.32518    | 0.47663    |  25.8 |  6.57
+Output  | 0.00030633 | 0.00034695 | 0.00044693 |   0.0 |  0.01
+Modify  | 0.33258    | 0.3333     | 0.33402    |   0.1 |  6.73
+Other   |            | 0.0264     |            |       |  0.53
 
 Nlocal:        4000.00 ave        4000 max        4000 min
 Histogram: 4 0 0 0 0 0 0 0 0 0
@@ -112,7 +110,4 @@ Total # of neighbors = 896000
 Ave neighs/atom = 56.000000
 Neighbor list builds = 0
 Dangerous builds = 0
-
-write_restart   tmp.restart.ttm.grid
-System init for write_restart ...
-Total wall time: 0:00:04
+Total wall time: 0:00:05

From 49b0623d6b27923e04d22552c98566cf1f527828 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Thu, 26 Aug 2021 13:26:46 -0600
Subject: [PATCH 148/437] Fix issue with Kokkos granular and pair/only on

---
 src/GRANULAR/fix_freeze.h                     |  2 +-
 src/KOKKOS/fix_freeze_kokkos.cpp              | 49 ++-----------------
 src/KOKKOS/fix_freeze_kokkos.h                |  6 +--
 src/KOKKOS/fix_neigh_history_kokkos.cpp       | 15 +++++-
 src/KOKKOS/fix_neigh_history_kokkos.h         | 10 +++-
 src/KOKKOS/fix_nve_sphere_kokkos.cpp          |  2 +-
 src/KOKKOS/fix_nve_sphere_kokkos.h            |  2 +
 src/KOKKOS/pair_gran_hooke_history_kokkos.cpp | 12 ++++-
 src/KOKKOS/pair_gran_hooke_history_kokkos.h   |  4 +-
 9 files changed, 41 insertions(+), 61 deletions(-)

diff --git a/src/GRANULAR/fix_freeze.h b/src/GRANULAR/fix_freeze.h
index 2fc5fda71e..5846bfd769 100644
--- a/src/GRANULAR/fix_freeze.h
+++ b/src/GRANULAR/fix_freeze.h
@@ -30,7 +30,7 @@ class FixFreeze : public Fix {
   int setmask();
   void init();
   void setup(int);
-  void post_force(int);
+  virtual void post_force(int);
   void post_force_respa(int, int, int);
   double compute_vector(int);
 
diff --git a/src/KOKKOS/fix_freeze_kokkos.cpp b/src/KOKKOS/fix_freeze_kokkos.cpp
index 190a054f8b..9a486a3fcc 100644
--- a/src/KOKKOS/fix_freeze_kokkos.cpp
+++ b/src/KOKKOS/fix_freeze_kokkos.cpp
@@ -28,41 +28,16 @@ FixFreezeKokkos::FixFreezeKokkos(LAMMPS *lmp, int narg, char **arg)
   atomKK = (AtomKokkos *)atom;
   execution_space = ExecutionSpaceFromDevice::space;
 
-  datamask_read = F_MASK | MASK_MASK;
+  datamask_read = F_MASK | MASK_MASK | TORQUE_MASK;
   datamask_modify = F_MASK | TORQUE_MASK;
 }
 
 /* ---------------------------------------------------------------------- */
 
-template
-int FixFreezeKokkos::setmask()
-{
-  return FixFreeze::setmask();
-}
-
-/* ---------------------------------------------------------------------- */
-
-template
-void FixFreezeKokkos::init()
-{
-  FixFreeze::init();
-}
-
-/* ---------------------------------------------------------------------- */
-
-template
-void FixFreezeKokkos::setup(int vflag)
-{
-  FixFreeze::setup(vflag);
-}
-
-/* ---------------------------------------------------------------------- */
-
 template
 void FixFreezeKokkos::post_force(int /*vflag*/)
 {
   atomKK->sync(execution_space,datamask_read);
-  atomKK->modified(execution_space,datamask_modify);
 
   f = atomKK->k_f.view();
   torque = atomKK->k_torque.view();
@@ -80,28 +55,10 @@ void FixFreezeKokkos::post_force(int /*vflag*/)
   foriginal[0] = original.values[0];
   foriginal[1] = original.values[1];
   foriginal[2] = original.values[2];
+
+  atomKK->modified(execution_space,datamask_modify);
 }
 
-/* ---------------------------------------------------------------------- */
-
-template
-void FixFreezeKokkos::post_force_respa(int vflag, int /*ilevel*/, int /*iloop*/)
-{
-  post_force(vflag);
-}
-
-/* ----------------------------------------------------------------------
-   return components of total force on fix group before force was changed
-------------------------------------------------------------------------- */
-
-template
-double FixFreezeKokkos::compute_vector(int n)
-{
-  return FixFreeze::compute_vector(n);
-}
-
-/* ---------------------------------------------------------------------- */
-
 template
 KOKKOS_INLINE_FUNCTION
 void FixFreezeKokkos::operator()(const int i, OriginalForce &original) const {
diff --git a/src/KOKKOS/fix_freeze_kokkos.h b/src/KOKKOS/fix_freeze_kokkos.h
index dcfc14bd3d..67d4f3272c 100644
--- a/src/KOKKOS/fix_freeze_kokkos.h
+++ b/src/KOKKOS/fix_freeze_kokkos.h
@@ -31,6 +31,7 @@ namespace LAMMPS_NS {
 template
 class FixFreezeKokkos : public FixFreeze {
  public:
+  typedef DeviceType device_type;
   struct OriginalForce {
     double values[3];
 
@@ -58,12 +59,7 @@ class FixFreezeKokkos : public FixFreeze {
   };
 
   FixFreezeKokkos(class LAMMPS *, int, char **);
-  int setmask();
-  void init();
-  void setup(int);
   void post_force(int);
-  void post_force_respa(int, int, int);
-  double compute_vector(int);
 
   KOKKOS_INLINE_FUNCTION
   void operator()(const int i, OriginalForce &original) const;
diff --git a/src/KOKKOS/fix_neigh_history_kokkos.cpp b/src/KOKKOS/fix_neigh_history_kokkos.cpp
index 611a8a40ef..4837148ee0 100644
--- a/src/KOKKOS/fix_neigh_history_kokkos.cpp
+++ b/src/KOKKOS/fix_neigh_history_kokkos.cpp
@@ -87,6 +87,9 @@ void FixNeighHistoryKokkos::pre_exchange()
 {
   copymode = 1;
 
+  k_firstflag.sync();
+  k_firstvalue.sync();
+
   h_resize() = 1;
   while (h_resize() > 0) {
     FixNeighHistoryKokkosZeroPartnerCountFunctor zero(this);
@@ -168,6 +171,9 @@ void FixNeighHistoryKokkos::post_neighbor()
 {
   tag = atomKK->k_tag.view();
 
+  k_firstflag.sync();
+  k_firstvalue.sync();
+
   int inum = pair->list->inum;
   NeighListKokkos* k_list = static_cast*>(pair->list);
   d_numneigh = k_list->d_numneigh;
@@ -185,8 +191,10 @@ void FixNeighHistoryKokkos::post_neighbor()
 
   if (maxatom < nlocal || k_list->maxneighs > (int)d_firstflag.extent(1)) {
     maxatom = nall;
-    d_firstflag = Kokkos::View("neighbor_history:firstflag",maxatom,k_list->maxneighs);
-    d_firstvalue = Kokkos::View("neighbor_history:firstvalue",maxatom,k_list->maxneighs*dnum);
+    k_firstflag = DAT::tdual_int_2d("neighbor_history:firstflag",maxatom,k_list->maxneighs);
+    k_firstvalue = DAT::tdual_float_2d("neighbor_history:firstvalue",maxatom,k_list->maxneighs*dnum);
+    d_firstflag = k_firstflag.view();
+    d_firstvalue = k_firstvalue.view();
   }
 
   copymode = 1;
@@ -194,6 +202,9 @@ void FixNeighHistoryKokkos::post_neighbor()
   FixNeighHistoryKokkosPostNeighborFunctor f(this);
   Kokkos::parallel_for(inum,f);
 
+  k_firstflag.modify();
+  k_firstvalue.modify();
+
   copymode = 0;
 }
 
diff --git a/src/KOKKOS/fix_neigh_history_kokkos.h b/src/KOKKOS/fix_neigh_history_kokkos.h
index acc1e9c408..0442b46cbd 100644
--- a/src/KOKKOS/fix_neigh_history_kokkos.h
+++ b/src/KOKKOS/fix_neigh_history_kokkos.h
@@ -50,10 +50,13 @@ class FixNeighHistoryKokkos : public FixNeighHistory {
   KOKKOS_INLINE_FUNCTION
   void post_neighbor_item(const int &ii) const;
 
-  typename Kokkos::View d_firstflag;
-  typename Kokkos::View d_firstvalue;
+  typename DAT::tdual_int_2d k_firstflag;
+  typename DAT::tdual_float_2d k_firstvalue;
 
  private:
+  typename ArrayTypes::t_int_2d d_firstflag;
+  typename ArrayTypes::t_float_2d d_firstvalue;
+
   typename ArrayTypes::tdual_int_1d k_npartner;
   typename ArrayTypes::tdual_tagint_2d k_partner;
   typename ArrayTypes::tdual_float_2d k_valuepartner;
@@ -74,6 +77,7 @@ class FixNeighHistoryKokkos : public FixNeighHistory {
 
 template 
 struct FixNeighHistoryKokkosZeroPartnerCountFunctor {
+  typedef DeviceType device_type;
   FixNeighHistoryKokkos c;
   FixNeighHistoryKokkosZeroPartnerCountFunctor(FixNeighHistoryKokkos *c_ptr): c(*c_ptr) {}
   KOKKOS_INLINE_FUNCTION
@@ -84,6 +88,7 @@ struct FixNeighHistoryKokkosZeroPartnerCountFunctor {
 
 template 
 struct FixNeighHistoryKokkosPreExchangeFunctor {
+  typedef DeviceType device_type;
   FixNeighHistoryKokkos c;
   FixNeighHistoryKokkosPreExchangeFunctor(FixNeighHistoryKokkos *c_ptr): c(*c_ptr) {}
   KOKKOS_INLINE_FUNCTION
@@ -94,6 +99,7 @@ struct FixNeighHistoryKokkosPreExchangeFunctor {
 
 template 
 struct FixNeighHistoryKokkosPostNeighborFunctor {
+  typedef DeviceType device_type;
   FixNeighHistoryKokkos c;
   FixNeighHistoryKokkosPostNeighborFunctor(FixNeighHistoryKokkos *c_ptr): c(*c_ptr) {}
   KOKKOS_INLINE_FUNCTION
diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.cpp b/src/KOKKOS/fix_nve_sphere_kokkos.cpp
index 787171b6ce..1c5011c91f 100644
--- a/src/KOKKOS/fix_nve_sphere_kokkos.cpp
+++ b/src/KOKKOS/fix_nve_sphere_kokkos.cpp
@@ -31,7 +31,7 @@ FixNVESphereKokkos::FixNVESphereKokkos(LAMMPS *lmp, int narg, char *
   atomKK = (AtomKokkos *)atom;
   execution_space = ExecutionSpaceFromDevice::space;
 
-  datamask_read = F_MASK | TORQUE_MASK | RMASS_MASK | RADIUS_MASK | MASK_MASK;
+  datamask_read = X_MASK | V_MASK | OMEGA_MASK| F_MASK | TORQUE_MASK | RMASS_MASK | RADIUS_MASK | MASK_MASK;
   datamask_modify = X_MASK | V_MASK | OMEGA_MASK;
 }
 
diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.h b/src/KOKKOS/fix_nve_sphere_kokkos.h
index 888a1baa0d..f3e3df13d4 100644
--- a/src/KOKKOS/fix_nve_sphere_kokkos.h
+++ b/src/KOKKOS/fix_nve_sphere_kokkos.h
@@ -56,6 +56,7 @@ class FixNVESphereKokkos : public FixNVESphere {
 
 template 
 struct FixNVESphereKokkosInitialIntegrateFunctor {
+  typedef DeviceType device_type;
   FixNVESphereKokkos c;
   FixNVESphereKokkosInitialIntegrateFunctor(FixNVESphereKokkos *c_ptr): c(*c_ptr) { c.cleanup_copy(); }
   KOKKOS_INLINE_FUNCTION
@@ -66,6 +67,7 @@ struct FixNVESphereKokkosInitialIntegrateFunctor {
 
 template 
 struct FixNVESphereKokkosFinalIntegrateFunctor {
+  typedef DeviceType device_type;
   FixNVESphereKokkos c;
   FixNVESphereKokkosFinalIntegrateFunctor(FixNVESphereKokkos *c_ptr): c(*c_ptr) { c.cleanup_copy(); }
   KOKKOS_INLINE_FUNCTION
diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp
index fab33d0ec7..b47b5f5a47 100644
--- a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp
+++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp
@@ -165,8 +165,11 @@ void PairGranHookeHistoryKokkos::compute(int eflag_in, int vflag_in)
       d_neighbors.extent(1) != d_neighbors_touch.extent(1))
     d_neighbors_touch = typename AT::t_neighbors_2d("pair:neighbors_touch",d_neighbors.extent(0),d_neighbors.extent(1));
 
-  d_firsttouch = fix_historyKK->d_firstflag;
-  d_firstshear = fix_historyKK->d_firstvalue;
+  fix_historyKK->k_firstflag.template sync();
+  fix_historyKK->k_firstvalue.template sync();
+
+  d_firsttouch = fix_historyKK->k_firstflag.template view();
+  d_firstshear = fix_historyKK->k_firstvalue.template view();
 
   Kokkos::parallel_for(Kokkos::RangePolicy(0,inum),*this);
 
@@ -258,6 +261,11 @@ void PairGranHookeHistoryKokkos::compute(int eflag_in, int vflag_in)
     }
   }
 
+  if (eflag_atom) {
+    k_eatom.template modify();
+    k_eatom.template sync();
+  }
+
   if (vflag_global) {
     virial[0] += ev.v[0];
     virial[1] += ev.v[1];
diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.h b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
index 6b887c0df4..37fb208a70 100644
--- a/src/KOKKOS/pair_gran_hooke_history_kokkos.h
+++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.h
@@ -92,8 +92,8 @@ class PairGranHookeHistoryKokkos : public PairGranHookeHistory {
   typename AT::t_int_1d_randomread d_ilist;
   typename AT::t_int_1d_randomread d_numneigh;
 
-  typename Kokkos::View d_firsttouch;
-  typename Kokkos::View d_firstshear;
+  typename AT::t_int_2d d_firsttouch;
+  typename AT::t_float_2d d_firstshear;
 
   typename AT::t_neighbors_2d d_neighbors_touch;
   typename AT::t_int_1d d_numneigh_touch;

From ddbb8f1aa64539c70bffb99332367623a26016f0 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Thu, 26 Aug 2021 13:36:32 -0600
Subject: [PATCH 149/437] Remove unnecessary data tranfer in
 fix_nve_sphere_kokkos

---
 src/KOKKOS/fix_nve_sphere_kokkos.cpp | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/KOKKOS/fix_nve_sphere_kokkos.cpp b/src/KOKKOS/fix_nve_sphere_kokkos.cpp
index 1c5011c91f..12b170acee 100644
--- a/src/KOKKOS/fix_nve_sphere_kokkos.cpp
+++ b/src/KOKKOS/fix_nve_sphere_kokkos.cpp
@@ -31,8 +31,8 @@ FixNVESphereKokkos::FixNVESphereKokkos(LAMMPS *lmp, int narg, char *
   atomKK = (AtomKokkos *)atom;
   execution_space = ExecutionSpaceFromDevice::space;
 
-  datamask_read = X_MASK | V_MASK | OMEGA_MASK| F_MASK | TORQUE_MASK | RMASS_MASK | RADIUS_MASK | MASK_MASK;
-  datamask_modify = X_MASK | V_MASK | OMEGA_MASK;
+  datamask_read = EMPTY_MASK;
+  datamask_modify = EMPTY_MASK;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -61,8 +61,7 @@ void FixNVESphereKokkos::init()
 template
 void FixNVESphereKokkos::initial_integrate(int /*vflag*/)
 {
-  atomKK->sync(execution_space,datamask_read);
-  atomKK->modified(execution_space,datamask_modify);
+  atomKK->sync(execution_space, X_MASK | V_MASK | OMEGA_MASK| F_MASK | TORQUE_MASK | RMASS_MASK | RADIUS_MASK | MASK_MASK);
 
   x = atomKK->k_x.view();
   v = atomKK->k_v.view();
@@ -78,6 +77,8 @@ void FixNVESphereKokkos::initial_integrate(int /*vflag*/)
 
   FixNVESphereKokkosInitialIntegrateFunctor f(this);
   Kokkos::parallel_for(nlocal,f);
+
+  atomKK->modified(execution_space,  X_MASK | V_MASK | OMEGA_MASK);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -109,8 +110,7 @@ void FixNVESphereKokkos::initial_integrate_item(const int i) const
 template
 void FixNVESphereKokkos::final_integrate()
 {
-  atomKK->sync(execution_space,datamask_read);
-  atomKK->modified(execution_space,datamask_modify);
+  atomKK->sync(execution_space, V_MASK | OMEGA_MASK| F_MASK | TORQUE_MASK | RMASS_MASK | RADIUS_MASK | MASK_MASK);
 
   v = atomKK->k_v.view();
   omega = atomKK->k_omega.view();
@@ -125,6 +125,8 @@ void FixNVESphereKokkos::final_integrate()
 
   FixNVESphereKokkosFinalIntegrateFunctor f(this);
   Kokkos::parallel_for(nlocal,f);
+
+  atomKK->modified(execution_space, V_MASK | OMEGA_MASK);
 }
 
 /* ---------------------------------------------------------------------- */

From 16d73c86ba1d1345cb7f9a4f4edc67e68185a1a3 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 13:37:00 -0600
Subject: [PATCH 150/437] adjust example TTM input scripts

---
 examples/ttm/in.ttm       | 3 ++-
 examples/ttm/in.ttm.grid  | 3 ++-
 examples/ttm/pot_iron.mod | 2 --
 3 files changed, 4 insertions(+), 4 deletions(-)
 delete mode 100644 examples/ttm/pot_iron.mod

diff --git a/examples/ttm/in.ttm b/examples/ttm/in.ttm
index 77bc09add2..1b259cfc19 100644
--- a/examples/ttm/in.ttm
+++ b/examples/ttm/in.ttm
@@ -20,7 +20,8 @@ create_atoms 	1 region atom_box
 
 mass            1 55.845
 
-include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
 
 neighbor        2.0 bin
 neigh_modify    every 5 delay 0 check yes
diff --git a/examples/ttm/in.ttm.grid b/examples/ttm/in.ttm.grid
index 56d7a4d1ad..2e3c622823 100644
--- a/examples/ttm/in.ttm.grid
+++ b/examples/ttm/in.ttm.grid
@@ -20,7 +20,8 @@ create_atoms 	1 region atom_box
 
 mass            1 55.845
 
-include		pot_iron.mod
+pair_style      eam/fs
+pair_coeff      * * FeVoter-ChenRecheck.fs Fe
 
 neighbor        2.0 bin
 neigh_modify    every 5 delay 0 check yes
diff --git a/examples/ttm/pot_iron.mod b/examples/ttm/pot_iron.mod
deleted file mode 100644
index 450cd00541..0000000000
--- a/examples/ttm/pot_iron.mod
+++ /dev/null
@@ -1,2 +0,0 @@
-pair_style      eam/fs
-pair_coeff      * * FeVoter-ChenRecheck.fs Fe

From 6fea5dd316f08906816557bc62be5f14b599c6a9 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 16:16:30 -0400
Subject: [PATCH 151/437] avoid creating empty per atom position arrays for
 enforcing pbc for dumps

---
 src/dump.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/dump.cpp b/src/dump.cpp
index ae7086af44..b42797833b 100644
--- a/src/dump.cpp
+++ b/src/dump.cpp
@@ -100,7 +100,7 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : Pointers(lmp)
   maxsbuf = 0;
   sbuf = nullptr;
 
-  maxpbc = 0;
+  maxpbc = -1;
   xpbc = vpbc = nullptr;
   imagepbc = nullptr;
 

From f63d0202be6b5c3c674143e5ebf5aa2ceb3b02ba Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Thu, 26 Aug 2021 14:54:48 -0600
Subject: [PATCH 152/437] Rely on auto_sync in verlet setup

---
 src/KOKKOS/verlet_kokkos.cpp | 54 ++++++++----------------------------
 1 file changed, 11 insertions(+), 43 deletions(-)

diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp
index 909c6930cf..5e9ab757c6 100644
--- a/src/KOKKOS/verlet_kokkos.cpp
+++ b/src/KOKKOS/verlet_kokkos.cpp
@@ -92,40 +92,22 @@ void VerletKokkos::setup(int flag)
   // acquire ghosts
   // build neighbor lists
 
-  atomKK->sync(Host,ALL_MASK);
-  atomKK->modified(Host,ALL_MASK);
+  lmp->kokkos->auto_sync = 1;
 
-  atomKK->setup();
+  atom->setup();
   modify->setup_pre_exchange();
-      // debug
-  atomKK->sync(Host,ALL_MASK);
-  atomKK->modified(Host,ALL_MASK);
-  if (triclinic) domain->x2lamda(atomKK->nlocal);
+  if (triclinic) domain->x2lamda(atom->nlocal);
   domain->pbc();
-
-  atomKK->sync(Host,ALL_MASK);
-
-
   domain->reset_box();
   comm->setup();
   if (neighbor->style) neighbor->setup_bins();
-
   comm->exchange();
-
-  if (atomKK->sortfreq > 0) atomKK->sort();
-
+  if (atom->sortfreq > 0) atom->sort();
   comm->borders();
-
-  if (triclinic) domain->lamda2x(atomKK->nlocal+atomKK->nghost);
-
-  atomKK->sync(Host,ALL_MASK);
-
+  if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost);
   domain->image_check();
   domain->box_too_small_check();
   modify->setup_pre_neighbor();
-
-  atomKK->modified(Host,ALL_MASK);
-
   neighbor->build(1);
   modify->setup_post_neighbor();
   neighbor->ncalls = 0;
@@ -144,7 +126,7 @@ void VerletKokkos::setup(int flag)
   }
   else if (force->pair) force->pair->compute_dummy(eflag,vflag);
 
-  if (atomKK->molecular != Atom::ATOMIC) {
+  if (atom->molecular != Atom::ATOMIC) {
     if (force->bond) {
       atomKK->sync(force->bond->execution_space,force->bond->datamask_read);
       force->bond->compute(eflag,vflag);
@@ -200,35 +182,21 @@ void VerletKokkos::setup_minimal(int flag)
   // acquire ghosts
   // build neighbor lists
 
+  lmp->kokkos->auto_sync = 1;
+
   if (flag) {
-    atomKK->sync(Host,ALL_MASK);
-    atomKK->modified(Host,ALL_MASK);
-
     modify->setup_pre_exchange();
-      // debug
-      atomKK->sync(Host,ALL_MASK);
-      atomKK->modified(Host,ALL_MASK);
-
-    if (triclinic) domain->x2lamda(atomKK->nlocal);
+    if (triclinic) domain->x2lamda(atom->nlocal);
     domain->pbc();
-
-    atomKK->sync(Host,ALL_MASK);
-
     domain->reset_box();
     comm->setup();
     if (neighbor->style) neighbor->setup_bins();
     comm->exchange();
     comm->borders();
-    if (triclinic) domain->lamda2x(atomKK->nlocal+atomKK->nghost);
-
-    atomKK->sync(Host,ALL_MASK);
-
+    if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost);
     domain->image_check();
     domain->box_too_small_check();
     modify->setup_pre_neighbor();
-
-    atomKK->modified(Host,ALL_MASK);
-
     neighbor->build(1);
     modify->setup_post_neighbor();
     neighbor->ncalls = 0;
@@ -247,7 +215,7 @@ void VerletKokkos::setup_minimal(int flag)
   }
   else if (force->pair) force->pair->compute_dummy(eflag,vflag);
 
-  if (atomKK->molecular != Atom::ATOMIC) {
+  if (atom->molecular != Atom::ATOMIC) {
     if (force->bond) {
       atomKK->sync(force->bond->execution_space,force->bond->datamask_read);
       force->bond->compute(eflag,vflag);

From a85f125ee75717a286becd8149a9871785a2ae06 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 16:58:14 -0400
Subject: [PATCH 153/437] whitespace

---
 doc/src/fix_ttm.rst            |  4 ++--
 src/EXTRA-FIX/fix_ttm.cpp      | 18 ++++++++---------
 src/EXTRA-FIX/fix_ttm_grid.cpp | 36 +++++++++++++++++-----------------
 src/EXTRA-FIX/fix_ttm_mod.cpp  | 10 +++++-----
 src/EXTRA-FIX/fix_ttm_mod.h    |  2 +-
 src/fix.h                      |  2 +-
 src/gridcomm.cpp               | 16 +++++++--------
 7 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index 184324fa1a..8136bf5d35 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -15,7 +15,7 @@ Syntax
 
 .. parsed-literal::
 
-   fix ID group-ID ttm seed C_e rho_e kappa_e gamma_p gamma_s v_0 Nx Ny Nz keyword value ... 
+   fix ID group-ID ttm seed C_e rho_e kappa_e gamma_p gamma_s v_0 Nx Ny Nz keyword value ...
    fix ID group-ID ttm/mod seed init_file Nx Ny Nz keyword value ...
 
 * ID, group-ID are documented in :doc:`fix ` command
@@ -103,7 +103,7 @@ are given below.
 
 Heat transfer between the electronic and atomic subsystems is carried
 out via an inhomogeneous Langevin thermostat.  Only atoms in the fix
-group contribute to and are affected by this heat transfer.  
+group contribute to and are affected by this heat transfer.
 
 This thermostatting differs from the regular Langevin thermostat
 (:doc:`fix langevin `) in three important ways.  First,
diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index e7f15666f6..803246b394 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -42,7 +42,7 @@ using namespace FixConst;
 // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
 // SHIFT = 0.0 assigns atoms to lower-left grid pt
 // SHIFT = 0.5 assigns atoms to nearest grid pt
-// use SHIFT = 0.0 for now since it allows fix ave/chunk 
+// use SHIFT = 0.0 for now since it allows fix ave/chunk
 //   to spatially average consistent with the TTM grid
 
 #define OFFSET 16384
@@ -52,9 +52,9 @@ using namespace FixConst;
 
 FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   Fix(lmp, narg, arg),
-  random(nullptr), 
+  random(nullptr),
   gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), flangevin(nullptr),
-  T_electron(nullptr), T_electron_old(nullptr), 
+  T_electron(nullptr), T_electron_old(nullptr),
   net_energy_transfer(nullptr), net_energy_transfer_all(nullptr)
 {
   if (narg < 13) error->all(FLERR,"Illegal fix ttm command");
@@ -77,16 +77,16 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
   nxgrid = utils::inumeric(FLERR,arg[10],false,lmp);
   nygrid = utils::inumeric(FLERR,arg[11],false,lmp);
   nzgrid = utils::inumeric(FLERR,arg[12],false,lmp);
-  
+
   tinit = 0.0;
   infile = outfile = NULL;
-  
+
   int iarg = 13;
   while (iarg < narg) {
     if (strcmp(arg[iarg],"set") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm command");
       tinit = utils::numeric(FLERR,arg[iarg+1],false,lmp);
-      if (tinit <= 0.0) 
+      if (tinit <= 0.0)
         error->all(FLERR,"Fix ttm initial temperature must be > 0.0");
       iarg += 2;
     } else if (strcmp(arg[iarg],"infile") == 0) {
@@ -426,7 +426,7 @@ void FixTTM::end_of_step()
   // finite difference iterations to update T_electron
 
   for (int istep = 0; istep < num_inner_timesteps; istep++) {
-    
+
     for (iz = 0; iz < nzgrid; iz++)
       for (iy = 0; iy < nygrid; iy++)
         for (ix = 0; ix < nxgrid; ix++)
@@ -461,7 +461,7 @@ void FixTTM::end_of_step()
                2.0*T_electron_old[iz][iy][ix])/dy/dy +
               (T_electron_old[zright][iy][ix] + T_electron_old[zleft][iy][ix] -
                2.0*T_electron_old[iz][iy][ix])/dz/dz) -
-             
+
              (net_energy_transfer_all[iz][iy][ix])/del_vol);
         }
   }
@@ -546,7 +546,7 @@ void FixTTM::read_electron_temperatures(const char *filename)
 void FixTTM::write_electron_temperatures(const char *filename)
 {
   if (comm->me) return;
- 
+
   FILE *fp = fopen(filename,"w");
   if (!fp) error->one(FLERR,"Fix ttm could not open output file");
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 31996acd37..e7cb60731a 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -42,7 +42,7 @@ static constexpr int CHUNK = 1024;
 
 /* ---------------------------------------------------------------------- */
 
-FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) : 
+FixTTMGrid::FixTTMGrid(LAMMPS *lmp, int narg, char **arg) :
   FixTTM(lmp, narg, arg)
 {
   skin_original = neighbor->skin;
@@ -72,7 +72,7 @@ void FixTTMGrid::post_constructor()
     for (iy = nylo_out; iy <= nyhi_out; iy++)
       for (ix = nxlo_out; ix <= nxhi_out; ix++)
         T_electron[iz][iy][ix] = tinit;
-  
+
   // zero net_energy_transfer
   // in case compute_vector accesses it on timestep 0
 
@@ -131,7 +131,7 @@ void FixTTMGrid::post_force(int /*vflag*/)
 
       // flag if ix,iy,iz is not within my ghost cell range
 
-      if (ix < nxlo_out || ix > nxhi_out || 
+      if (ix < nxlo_out || ix > nxhi_out ||
           iy < nylo_out || iy > nyhi_out ||
           iz < nzlo_out || iz > nzhi_out) {
         flag = 1;
@@ -225,7 +225,7 @@ void FixTTMGrid::end_of_step()
            &T_electron[nzlo_out][nylo_out][nxlo_out],ngridout*sizeof(double));
 
     // compute new electron T profile
- 
+
     for (iz = nzlo_in; iz <= nzhi_in; iz++)
       for (iy = nylo_in; iy <= nyhi_in; iy++)
         for (ix = nxlo_in; ix <= nxhi_in; ix++) {
@@ -240,7 +240,7 @@ void FixTTMGrid::end_of_step()
                2.0*T_electron_old[iz][iy][ix])*dyinv*dyinv +
               (T_electron_old[iz-1][iy][ix] + T_electron_old[iz+1][iy][ix] -
                2.0*T_electron_old[iz][iy][ix])*dzinv*dzinv) -
-             
+
              net_energy_transfer[iz][iy][ix]/volgrid);
         }
 
@@ -289,7 +289,7 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
   }
 
   // read electron temperature values from file, one chunk at a time
- 
+
   char **values = new char*[4];
   char *buffer = new char[CHUNK*MAXLINE];
   bigint ntotal = (bigint) nxgrid * nygrid * nzgrid;
@@ -308,21 +308,21 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
     *next = '\n';
 
     if (nwords != 4) error->all(FLERR,"Incorrect format in fix ttm data file");
-    
+
     // loop over lines of grid point values
     // tokenize the line into ix,iy,iz grid index plus temperature value
     // if I own grid point, store the value
-    
+
     for (i = 0; i < nchunk; i++) {
       next = strchr(buf,'\n');
-      
+
       for (j = 0; j < nwords; j++) {
         buf += strspn(buf," \t\n\r\f");
         buf[strcspn(buf," \t\n\r\f")] = '\0';
         values[j] = buf;
         buf += strlen(buf)+1;
       }
-    
+
       ix = utils::inumeric(FLERR,values[0],false,lmp);
       iy = utils::inumeric(FLERR,values[1],false,lmp);
       iz = utils::inumeric(FLERR,values[2],false,lmp);
@@ -330,7 +330,7 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
       if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid ||
           iz < 0 || iz >= nzgrid)
         error->all(FLERR,"Fix ttm/grid invalid grid index in input");
-      
+
       if (ix >= nxlo_in && ix <= nxhi_in &&
           iy >= nylo_in && iy <= nyhi_in &&
           iz >= nzlo_in && iz <= nzhi_in) {
@@ -367,7 +367,7 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
 
   int flagall;
   MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
-  if (flagall) 
+  if (flagall)
     error->all(FLERR,"Fix ttm/grid infile did not set all temperatures");
 
   memory->destroy3d_offset(T_initial_set,nzlo_in,nylo_in,nxlo_in);
@@ -386,7 +386,7 @@ void FixTTMGrid::write_electron_temperatures(const char *filename)
   }
 
   gc->gather(GridComm::FIX,this,1,sizeof(double),1,NULL,MPI_DOUBLE);
-  
+
   if (comm->me == 0) fclose(FPout);
 }
 
@@ -424,7 +424,7 @@ void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list)
 {
   double *buf = (double *) vbuf;
   double *src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out];
-  
+
   for (int i = 0; i < nlist; i++)
     buf[i] = src[list[i]];
 }
@@ -486,13 +486,13 @@ void FixTTMGrid::allocate_grid()
   nzhi_out = MAX(nhi,nzhi_in+1);
 
   bigint totalmine;
-  totalmine = (bigint) (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * 
+  totalmine = (bigint) (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) *
     (nzhi_out-nzlo_out+1);
   if (totalmine > MAXSMALLINT)
     error->one(FLERR,"Too many owned+ghost grid points in fix ttm");
   ngridout = totalmine;
 
-  totalmine = (bigint) (nxhi_in-nxlo_in+1) * (nyhi_in-nylo_in+1) * 
+  totalmine = (bigint) (nxhi_in-nxlo_in+1) * (nyhi_in-nylo_in+1) *
     (nzhi_in-nzlo_in+1);
   ngridmine = totalmine;
 
@@ -627,7 +627,7 @@ void FixTTMGrid::pack_gather_grid(int which, void *vbuf)
 ------------------------------------------------------------------------- */
 
 void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
-                                    int xlo, int xhi, int ylo, int yhi, 
+                                    int xlo, int xhi, int ylo, int yhi,
                                     int zlo, int zhi)
 {
   int ix,iy,iz;
@@ -660,7 +660,7 @@ void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
 }
 
 /* ----------------------------------------------------------------------
-   return the energy of the electronic subsystem 
+   return the energy of the electronic subsystem
    or the net_energy transfer between the subsystems
 ------------------------------------------------------------------------- */
 
diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index b2d13b36c1..cd60faae99 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -45,7 +45,7 @@ using namespace MathConst;
 // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
 // SHIFT = 0.0 assigns atoms to lower-left grid pt
 // SHIFT = 0.5 assigns atoms to nearest grid pt
-// use SHIFT = 0.0 for now since it allows fix ave/chunk 
+// use SHIFT = 0.0 for now since it allows fix ave/chunk
 //   to spatially average consistent with the TTM grid
 
 #define OFFSET 16384
@@ -108,7 +108,7 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
     if (strcmp(arg[iarg],"set") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
       tinit = utils::numeric(FLERR,arg[iarg+1],false,lmp);
-      if (tinit <= 0.0) 
+      if (tinit <= 0.0)
         error->all(FLERR,"Fix ttm/mod initial temperature must be > 0.0");
       iarg += 2;
     } else if (strcmp(arg[iarg],"infile") == 0) {
@@ -135,7 +135,7 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
     error->all(FLERR,"Fix ttm/mod grid sizes must be > 0");
 
   // check for allowed maximum number of total grid points
-  
+
   bigint total_nnodes = (bigint) nxnodes * nynodes * nznodes;
   if (total_nnodes > MAXSMALLINT)
     error->all(FLERR,"Too many grid points in fix ttm/mod");
@@ -653,7 +653,7 @@ void FixTTMMod::read_electron_temperatures(const char *filename)
 void FixTTMMod::write_electron_temperatures(const char *filename)
 {
   if (comm->me) return;
- 
+
   FILE *fp = fopen(filename,"w");
   if (!fp) error->one(FLERR,"Fix ttm/mod could not open output file");
 
@@ -662,7 +662,7 @@ void FixTTMMod::write_electron_temperatures(const char *filename)
   for (ix = 0; ix < nxnodes; ix++)
     for (iy = 0; iy < nynodes; iy++)
       for (iz = 0; iz < nznodes; iz++) {
-        if (movsur == 1 && T_electron[ix][iy][iz] == 0.0) 
+        if (movsur == 1 && T_electron[ix][iy][iz] == 0.0)
           T_electron[ix][iy][iz] = electron_temperature_min;
         fprintf(fp,"%d %d %d %20.16g\n",ix,iy,iz,T_electron[ix][iy][iz]);
       }
diff --git a/src/EXTRA-FIX/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h
index 883b799b09..b4a09b8f38 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.h
+++ b/src/EXTRA-FIX/fix_ttm_mod.h
@@ -76,7 +76,7 @@ class FixTTMMod : public Fix {
   double gamma_p, gamma_s, v_0, v_0_sq;
   int skin_layer, surface_l, surface_r, t_surface_l, t_surface_r;
   int movsur;
-  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4, 
+  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4,
     C_limit, electronic_density;
   double el_th_diff, T_damp;
   double intensity, width, duration, surface_double;
diff --git a/src/fix.h b/src/fix.h
index cacbf04a2a..44b9978052 100644
--- a/src/fix.h
+++ b/src/fix.h
@@ -210,7 +210,7 @@ class Fix : protected Pointers {
   virtual void pack_reverse_grid(int, void *, int, int *) {};
   virtual void unpack_reverse_grid(int, void *, int, int *) {};
   virtual void pack_gather_grid(int, void *) {};
-  virtual void unpack_gather_grid(int, void *, void *, 
+  virtual void unpack_gather_grid(int, void *, void *,
                                   int, int, int, int, int, int) {};
 
   virtual double compute_scalar() { return 0.0; }
diff --git a/src/gridcomm.cpp b/src/gridcomm.cpp
index d403b706d3..1463671316 100644
--- a/src/gridcomm.cpp
+++ b/src/gridcomm.cpp
@@ -165,13 +165,13 @@ GridComm::~GridComm()
 
 void GridComm::initialize(MPI_Comm gcomm,
                           int gnx, int gny, int gnz,
-                          int ixlo, int ixhi, int iylo, int iyhi, 
+                          int ixlo, int ixhi, int iylo, int iyhi,
                           int izlo, int izhi,
-                          int oxlo, int oxhi, int oylo, int oyhi, 
+                          int oxlo, int oxhi, int oylo, int oyhi,
                           int ozlo, int ozhi,
-                          int fxlo, int fxhi, int fylo, int fyhi, 
+                          int fxlo, int fxhi, int fylo, int fyhi,
                           int fzlo, int fzhi,
-                          int pxlo, int pxhi, int pylo, int pyhi, 
+                          int pxlo, int pxhi, int pylo, int pyhi,
                           int pzlo, int pzhi)
 {
   gridcomm = gcomm;
@@ -955,7 +955,7 @@ void GridComm::forward_comm(int caller, void *ptr, int nper, int nbyte, int whic
    forward comm on regular grid of procs via list of swaps with 6 neighbor procs
 ------------------------------------------------------------------------- */
 
-template < class T > 
+template < class T >
 void GridComm::
 forward_comm_regular(T *ptr, int nper, int /*nbyte*/, int which,
                      void *buf1, void *buf2, MPI_Datatype datatype)
@@ -985,7 +985,7 @@ forward_comm_regular(T *ptr, int nper, int /*nbyte*/, int which,
    forward comm on tiled grid decomp via Send/Recv lists of each neighbor proc
 ------------------------------------------------------------------------- */
 
-template < class T > 
+template < class T >
 void GridComm::
 forward_comm_tiled(T *ptr, int nper, int nbyte, int which,
                    void *buf1, void *vbuf2, MPI_Datatype datatype)
@@ -1054,7 +1054,7 @@ void GridComm::reverse_comm(int caller, void *ptr, int nper, int nbyte, int whic
    reverse comm on regular grid of procs via list of swaps with 6 neighbor procs
 ------------------------------------------------------------------------- */
 
-template < class T > 
+template < class T >
 void GridComm::
 reverse_comm_regular(T *ptr, int nper, int /*nbyte*/, int which,
                      void *buf1, void *buf2, MPI_Datatype datatype)
@@ -1084,7 +1084,7 @@ reverse_comm_regular(T *ptr, int nper, int /*nbyte*/, int which,
    reverse comm on tiled grid decomp via Send/Recv lists of each neighbor proc
 ------------------------------------------------------------------------- */
 
-template < class T > 
+template < class T >
 void GridComm::
 reverse_comm_tiled(T *ptr, int nper, int nbyte, int which,
                    void *buf1, void *vbuf2, MPI_Datatype datatype)

From ab8c9851b233271557fe80de0272342957146f8b Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 15:20:52 -0600
Subject: [PATCH 154/437] change style to styles to remove override of
 fix->style string

---
 src/fix_property_atom.cpp | 226 +++++++++++++++++++-------------------
 src/fix_property_atom.h   |   2 +-
 2 files changed, 114 insertions(+), 114 deletions(-)

diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp
index 7df49f4bc4..1f70ed2447 100644
--- a/src/fix_property_atom.cpp
+++ b/src/fix_property_atom.cpp
@@ -31,7 +31,7 @@ enum{MOLECULE,CHARGE,RMASS,IVEC,DVEC,IARRAY,DARRAY};
 
 FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
   Fix(lmp, narg, arg),
-  nvalue(0), style(nullptr), index(nullptr), astyle(nullptr)
+  nvalue(0), styles(nullptr), index(nullptr), astyle(nullptr)
 {
   if (narg < 4) error->all(FLERR,"Illegal fix property/atom command");
 
@@ -40,7 +40,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
 
   int iarg = 3;
   nvalue = narg-iarg;
-  style = new int[nvalue];
+  styles = new int[nvalue];
   cols = new int[nvalue];
   index = new int[nvalue];
 
@@ -58,7 +58,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
                    "already has molecule attribute");
       if (molecule_flag)
         error->all(FLERR,"Fix property/atom cannot specify mol twice");
-      style[nvalue] = MOLECULE;
+      styles[nvalue] = MOLECULE;
       cols[nvalue] = 0;
       atom->molecule_flag = molecule_flag = 1;
       values_peratom++;
@@ -69,7 +69,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
         error->all(FLERR,"Fix property/atom q when atom_style already has charge attribute");
       if (q_flag)
         error->all(FLERR,"Fix property/atom cannot specify q twice");
-      style[nvalue] = CHARGE;
+      styles[nvalue] = CHARGE;
       cols[nvalue] = 0;
       atom->q_flag = q_flag = 1;
       values_peratom++;
@@ -80,7 +80,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
         error->all(FLERR,"Fix property/atom rmass when atom_style already has rmass attribute");
       if (rmass_flag)
         error->all(FLERR,"Fix property/atom cannot specify rmass twice");
-      style[nvalue] = RMASS;
+      styles[nvalue] = RMASS;
       cols[nvalue] = 0;
       atom->rmass_flag = rmass_flag = 1;
       values_peratom++;
@@ -90,7 +90,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
     // custom atom vector
 
     } else if (utils::strmatch(arg[iarg],"^i_")) {
-      style[nvalue] = IVEC;
+      styles[nvalue] = IVEC;
       int flag,ncols;
       index[nvalue] = atom->find_custom(&arg[iarg][2],flag,ncols);
       if (index[nvalue] >= 0)
@@ -102,7 +102,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
       iarg++;
 
     } else if (utils::strmatch(arg[iarg],"^d_")) {
-      style[nvalue] = DVEC;
+      styles[nvalue] = DVEC;
       int flag,ncols;
       index[nvalue] = atom->find_custom(&arg[iarg][2],flag,ncols);
       if (index[nvalue] >= 0)
@@ -129,10 +129,10 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
 
       if (arg[iarg][0] == 'i') {
         which = 0;
-        style[nvalue] = IARRAY;
+        styles[nvalue] = IARRAY;
       } else {
         which = 1;
-        style[nvalue] = DARRAY;
+        styles[nvalue] = DARRAY;
       }
       index[nvalue] = atom->add_custom(&arg[iarg][3],which,ncols);
       cols[nvalue] = ncols;
@@ -165,9 +165,9 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) :
   if (border == 0) {
     int flag = 0;
     for (int i = 0; i < nvalue; i++)
-      if (style[i] == MOLECULE
-          || style[i] == CHARGE
-          || style[i] == RMASS) flag = 1;
+      if (styles[i] == MOLECULE
+          || styles[i] == CHARGE
+          || styles[i] == RMASS) flag = 1;
     if (flag && comm->me == 0)
       error->warning(FLERR,"Fix property/atom mol or charge or rmass "
                      "w/out ghost communication");
@@ -201,30 +201,30 @@ FixPropertyAtom::~FixPropertyAtom()
   // set ptrs to a null pointer, so they no longer exist for Atom class
 
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) {
+    if (styles[nv] == MOLECULE) {
       atom->molecule_flag = 0;
       memory->destroy(atom->molecule);
       atom->molecule = nullptr;
-    } else if (style[nv] == CHARGE) {
+    } else if (styles[nv] == CHARGE) {
       atom->q_flag = 0;
       memory->destroy(atom->q);
       atom->q = nullptr;
-    } else if (style[nv] == RMASS) {
+    } else if (styles[nv] == RMASS) {
       atom->rmass_flag = 0;
       memory->destroy(atom->rmass);
       atom->rmass = nullptr;
-    } else if (style[nv] == IVEC) {
+    } else if (styles[nv] == IVEC) {
       atom->remove_custom(index[nv],0,cols[nv]);
-    } else if (style[nv] == DVEC) {
+    } else if (styles[nv] == DVEC) {
       atom->remove_custom(index[nv],1,cols[nv]);
-    } else if (style[nv] == IARRAY) {
+    } else if (styles[nv] == IARRAY) {
       atom->remove_custom(index[nv],0,cols[nv]);
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       atom->remove_custom(index[nv],1,cols[nv]);
     }
   }
 
-  delete [] style;
+  delete [] styles;
   delete [] cols;
   delete [] index;
   delete [] astyle;
@@ -291,21 +291,21 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, tagint
 
       if ((m = atom->map(itag)) >= 0) {
         for (j = 0; j < nvalue; j++) {
-          if (style[j] == MOLECULE) {
+          if (styles[j] == MOLECULE) {
             atom->molecule[m] = values.next_tagint();
-          } else if (style[j] == CHARGE) {
+          } else if (styles[j] == CHARGE) {
             atom->q[m] = values.next_double();
-          } else if (style[j] == RMASS) {
+          } else if (styles[j] == RMASS) {
             atom->rmass[m] = values.next_double();
-          } else if (style[j] == IVEC) {
+          } else if (styles[j] == IVEC) {
             atom->ivector[index[j]][m] = values.next_int();
-          } else if (style[j] == DVEC) {
+          } else if (styles[j] == DVEC) {
             atom->dvector[index[j]][m] = values.next_double();
-          } else if (style[j] == IARRAY) {
+          } else if (styles[j] == IARRAY) {
             ncol = cols[j];
             for (k = 0; k < ncol; k++)
               atom->iarray[index[j]][m][k] = values.next_int();
-          } else if (style[j] == DARRAY) {
+          } else if (styles[j] == DARRAY) {
             ncol = cols[j];
             for (k = 0; k < ncol; k++)
               atom->darray[index[j]][m][k] = values.next_double();
@@ -365,34 +365,34 @@ void FixPropertyAtom::write_data_section_pack(int /*mth*/, double **buf)
 
   int icol = 1;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) {
+    if (styles[nv] == MOLECULE) {
       tagint *molecule = atom->molecule;
       for (i = 0; i < nlocal; i++) buf[i][icol] = ubuf(molecule[i]).d;
       icol++;
-    } else if (style[nv] == CHARGE) {
+    } else if (styles[nv] == CHARGE) {
       double *q = atom->q;
       for (i = 0; i < nlocal; i++) buf[i][icol] = q[i];
       icol++;
-    } else if (style[nv] == RMASS) {
+    } else if (styles[nv] == RMASS) {
       double *rmass = atom->rmass;
       for (i = 0; i < nlocal; i++) buf[i][icol] = rmass[i];
       icol++;
-    } else if (style[nv] == IVEC) {
+    } else if (styles[nv] == IVEC) {
       int *ivec = atom->ivector[index[nv]];
       for (i = 0; i < nlocal; i++) buf[i][icol] = ubuf(ivec[i]).d;
       icol++;
-    } else if (style[nv] == DVEC) {
+    } else if (styles[nv] == DVEC) {
       double *dvec = atom->dvector[index[nv]];
       for (i = 0; i < nlocal; i++) buf[i][icol] = dvec[i];
       icol++;
-    } else if (style[nv] == IARRAY) {
+    } else if (styles[nv] == IARRAY) {
       int **iarray = atom->iarray[index[nv]];
       ncol = cols[nv];
       for (i = 0; i < nlocal; i++)
         for (k = 0; k < ncol; k++)
           buf[i][icol+k] = ubuf(iarray[i][k]).d;
       icol += ncol;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       double **darray = atom->darray[index[nv]];
       ncol = cols[nv];
       for (i = 0; i < nlocal; i++)
@@ -412,19 +412,19 @@ void FixPropertyAtom::write_data_section_pack(int /*mth*/, double **buf)
 
 void FixPropertyAtom::write_data_section_keyword(int /*mth*/, FILE *fp)
 {
-  if (nvalue == 1 && style[0] == MOLECULE) fprintf(fp,"\nMolecules\n\n");
-  else if (nvalue == 1 && style[0] == CHARGE) fprintf(fp,"\nCharges\n\n");
+  if (nvalue == 1 && styles[0] == MOLECULE) fprintf(fp,"\nMolecules\n\n");
+  else if (nvalue == 1 && styles[0] == CHARGE) fprintf(fp,"\nCharges\n\n");
   else {
     fprintf(fp,"\n%s #",id);
     // write column hint as comment
     for (int i = 0; i < nvalue; ++i) {
-      if (style[i] == MOLECULE) fputs(" mol",fp);
-      else if (style[i] == CHARGE) fputs(" q",fp);
-      else if (style[i] == RMASS) fputs(" rmass",fp);
-      else if (style[i] == IVEC) fprintf(fp," i_%s", atom->ivname[index[i]]);
-      else if (style[i] == DVEC) fprintf(fp, " d_%s", atom->dvname[index[i]]);
-      else if (style[i] == IARRAY) fprintf(fp, " i_%s", atom->ianame[index[i]]);
-      else if (style[i] == DARRAY) fprintf(fp, " d_%s", atom->daname[index[i]]);
+      if (styles[i] == MOLECULE) fputs(" mol",fp);
+      else if (styles[i] == CHARGE) fputs(" q",fp);
+      else if (styles[i] == RMASS) fputs(" rmass",fp);
+      else if (styles[i] == IVEC) fprintf(fp," i_%s", atom->ivname[index[i]]);
+      else if (styles[i] == DVEC) fprintf(fp, " d_%s", atom->dvname[index[i]]);
+      else if (styles[i] == IARRAY) fprintf(fp, " i_%s", atom->ianame[index[i]]);
+      else if (styles[i] == DARRAY) fprintf(fp, " d_%s", atom->daname[index[i]]);
     }
     fputs("\n\n",fp);
   }
@@ -446,22 +446,22 @@ void FixPropertyAtom::write_data_section(int /*mth*/, FILE *fp,
     fprintf(fp,TAGINT_FORMAT,(tagint) ubuf(buf[i][0]).i);
     icol = 1;
     for (nv = 0; nv < nvalue; nv++) {
-      if (style[nv] == MOLECULE)
+      if (styles[nv] == MOLECULE)
         fprintf(fp," " TAGINT_FORMAT,(tagint) ubuf(buf[i][icol++]).i);
-      else if (style[nv] == CHARGE)
+      else if (styles[nv] == CHARGE)
         fprintf(fp," %g",buf[i][icol++]);
-      else if (style[nv] == RMASS)
+      else if (styles[nv] == RMASS)
         fprintf(fp," %g",buf[i][icol++]);
-      else if (style[nv] == IVEC)
+      else if (styles[nv] == IVEC)
         fprintf(fp," %d",(int) ubuf(buf[i][icol++]).i);
-      else if (style[nv] == DVEC)
+      else if (styles[nv] == DVEC)
         fprintf(fp," %g",buf[i][icol++]);
-      else if (style[nv] == IARRAY) {
+      else if (styles[nv] == IARRAY) {
         ncol = cols[nv];
         for (k = 0; k < ncol; k++)
           fprintf(fp," %d",(int) ubuf(buf[i][icol+k]).i);
         icol += ncol;
-      } else if (style[nv] == DARRAY) {
+      } else if (styles[nv] == DARRAY) {
         ncol = cols[nv];
         for (k = 0; k < ncol; k++)
           fprintf(fp," %g",buf[i][icol+k]);
@@ -480,13 +480,13 @@ double FixPropertyAtom::memory_usage()
 {
   double bytes = 0.0;
   for (int m = 0; m < nvalue; m++) {
-    if (style[m] == MOLECULE) bytes = atom->nmax * sizeof(tagint);
-    else if (style[m] == CHARGE) bytes = atom->nmax * sizeof(double);
-    else if (style[m] == RMASS) bytes = atom->nmax * sizeof(double);
-    else if (style[m] == IVEC) bytes = atom->nmax * sizeof(int);
-    else if (style[m] == DVEC) bytes = atom->nmax * sizeof(double);
-    else if (style[m] == IARRAY) bytes = atom->nmax * cols[m] * sizeof(int);
-    else if (style[m] == DARRAY) bytes = atom->nmax * cols[m] * sizeof(double);
+    if (styles[m] == MOLECULE) bytes = atom->nmax * sizeof(tagint);
+    else if (styles[m] == CHARGE) bytes = atom->nmax * sizeof(double);
+    else if (styles[m] == RMASS) bytes = atom->nmax * sizeof(double);
+    else if (styles[m] == IVEC) bytes = atom->nmax * sizeof(int);
+    else if (styles[m] == DVEC) bytes = atom->nmax * sizeof(double);
+    else if (styles[m] == IARRAY) bytes = atom->nmax * cols[m] * sizeof(int);
+    else if (styles[m] == DARRAY) bytes = atom->nmax * cols[m] * sizeof(double);
   }
   return bytes;
 }
@@ -501,31 +501,31 @@ double FixPropertyAtom::memory_usage()
 void FixPropertyAtom::grow_arrays(int nmax)
 {
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) {
+    if (styles[nv] == MOLECULE) {
       memory->grow(atom->molecule,nmax,"atom:molecule");
       size_t nbytes = (nmax-nmax_old) * sizeof(tagint);
       memset(&atom->molecule[nmax_old],0,nbytes);
-    } else if (style[nv] == CHARGE) {
+    } else if (styles[nv] == CHARGE) {
       memory->grow(atom->q,nmax,"atom:q");
       size_t nbytes = (nmax-nmax_old) * sizeof(double);
       memset(&atom->q[nmax_old],0,nbytes);
-    } else if (style[nv] == RMASS) {
+    } else if (styles[nv] == RMASS) {
       memory->grow(atom->rmass,nmax,"atom:rmass");
       size_t nbytes = (nmax-nmax_old) * sizeof(double);
       memset(&atom->rmass[nmax_old],0,nbytes);
-    } else if (style[nv] == IVEC) {
+    } else if (styles[nv] == IVEC) {
       memory->grow(atom->ivector[index[nv]],nmax,"atom:ivector");
       size_t nbytes = (nmax-nmax_old) * sizeof(int);
       memset(&atom->ivector[index[nv]][nmax_old],0,nbytes);
-    } else if (style[nv] == DVEC) {
+    } else if (styles[nv] == DVEC) {
       memory->grow(atom->dvector[index[nv]],nmax,"atom:dvector");
       size_t nbytes = (nmax-nmax_old) * sizeof(double);
       memset(&atom->dvector[index[nv]][nmax_old],0,nbytes);
-    } else if (style[nv] == IARRAY) {
+    } else if (styles[nv] == IARRAY) {
       memory->grow(atom->iarray[index[nv]],nmax,cols[nv],"atom:iarray");
       size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(int);
       if (nbytes) memset(&atom->iarray[index[nv]][nmax_old][0],0,nbytes);
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       memory->grow(atom->darray[index[nv]],nmax,cols[nv],"atom:darray");
       size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(double);
       if (nbytes) memset(&atom->darray[index[nv]][nmax_old][0],0,nbytes);
@@ -544,21 +544,21 @@ void FixPropertyAtom::copy_arrays(int i, int j, int /*delflag*/)
   int k,ncol;
 
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE)
+    if (styles[nv] == MOLECULE)
       atom->molecule[j] = atom->molecule[i];
-    else if (style[nv] == CHARGE)
+    else if (styles[nv] == CHARGE)
       atom->q[j] = atom->q[i];
-    else if (style[nv] == RMASS)
+    else if (styles[nv] == RMASS)
       atom->rmass[j] = atom->rmass[i];
-    else if (style[nv] == IVEC)
+    else if (styles[nv] == IVEC)
       atom->ivector[index[nv]][j] = atom->ivector[index[nv]][i];
-    else if (style[nv] == DVEC)
+    else if (styles[nv] == DVEC)
       atom->dvector[index[nv]][j] = atom->dvector[index[nv]][i];
-    else if (style[nv] == IARRAY) {
+    else if (styles[nv] == IARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->iarray[index[nv]][j][k] = atom->iarray[index[nv]][i][k];
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->darray[index[nv]][j][k] = atom->darray[index[nv]][i][k];
@@ -576,37 +576,37 @@ int FixPropertyAtom::pack_border(int n, int *list, double *buf)
 
   int m = 0;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) {
+    if (styles[nv] == MOLECULE) {
       tagint *molecule = atom->molecule;
       for (i = 0; i < n; i++) {
         j = list[i];
         buf[m++] = ubuf(molecule[j]).d;
       }
-    } else if (style[nv] == CHARGE) {
+    } else if (styles[nv] == CHARGE) {
       double *q = atom->q;
       for (i = 0; i < n; i++) {
         j = list[i];
         buf[m++] = q[j];
       }
-    } else if (style[nv] == RMASS) {
+    } else if (styles[nv] == RMASS) {
       double *rmass = atom->rmass;
       for (i = 0; i < n; i++) {
         j = list[i];
         buf[m++] = rmass[j];
       }
-    } else if (style[nv] == IVEC) {
+    } else if (styles[nv] == IVEC) {
       int *ivector = atom->ivector[index[nv]];
       for (i = 0; i < n; i++) {
         j = list[i];
         buf[m++] = ubuf(ivector[j]).d;
       }
-    } else if (style[nv] == DVEC) {
+    } else if (styles[nv] == DVEC) {
       double *dvector = atom->dvector[index[nv]];
       for (i = 0; i < n; i++) {
         j = list[i];
         buf[m++] = dvector[j];
       }
-    } else if (style[nv] == IARRAY) {
+    } else if (styles[nv] == IARRAY) {
       int **iarray = atom->iarray[index[nv]];
       ncol = cols[nv];
       for (i = 0; i < n; i++) {
@@ -614,7 +614,7 @@ int FixPropertyAtom::pack_border(int n, int *list, double *buf)
         for (k = 0; k < ncol; k++)
           buf[m++] = ubuf(iarray[j][k]).d;
       }
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       double **darray = atom->darray[index[nv]];
       ncol = cols[nv];
       for (i = 0; i < n; i++) {
@@ -638,39 +638,39 @@ int FixPropertyAtom::unpack_border(int n, int first, double *buf)
 
   int m = 0;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) {
+    if (styles[nv] == MOLECULE) {
       tagint *molecule = atom->molecule;
       last = first + n;
       for (i = first; i < last; i++)
         molecule[i] = (tagint) ubuf(buf[m++]).i;
-    } else if (style[nv] == CHARGE) {
+    } else if (styles[nv] == CHARGE) {
       double *q = atom->q;
       last = first + n;
       for (i = first; i < last; i++)
         q[i] = buf[m++];
-    } else if (style[nv] == RMASS) {
+    } else if (styles[nv] == RMASS) {
       double *rmass = atom->rmass;
       last = first + n;
       for (i = first; i < last; i++)
         rmass[i] = buf[m++];
-    } else if (style[nv] == IVEC) {
+    } else if (styles[nv] == IVEC) {
       int *ivector = atom->ivector[index[nv]];
       last = first + n;
       for (i = first; i < last; i++)
         ivector[i] = (int) ubuf(buf[m++]).i;
-    } else if (style[nv] == DVEC) {
+    } else if (styles[nv] == DVEC) {
       double *dvector = atom->dvector[index[nv]];
       last = first + n;
       for (i = first; i < last; i++)
         dvector[i] = buf[m++];
-    } else if (style[nv] == IARRAY) {
+    } else if (styles[nv] == IARRAY) {
       int **iarray = atom->iarray[index[nv]];
       ncol = cols[nv];
       last = first + n;
       for (i = first; i < last; i++)
         for (k = 0; k < ncol; k++)
           iarray[i][k] = (int) ubuf(buf[m++]).i;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       double **darray = atom->darray[index[nv]];
       ncol = cols[nv];
       last = first + n;
@@ -693,16 +693,16 @@ int FixPropertyAtom::pack_exchange(int i, double *buf)
 
   int m = 0;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d;
-    else if (style[nv] == CHARGE) buf[m++] = atom->q[i];
-    else if (style[nv] == RMASS) buf[m++] = atom->rmass[i];
-    else if (style[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d;
-    else if (style[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i];
-    else if (style[nv] == IARRAY) {
+    if (styles[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d;
+    else if (styles[nv] == CHARGE) buf[m++] = atom->q[i];
+    else if (styles[nv] == RMASS) buf[m++] = atom->rmass[i];
+    else if (styles[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d;
+    else if (styles[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i];
+    else if (styles[nv] == IARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         buf[m++] = atom->darray[index[nv]][i][k];
@@ -722,21 +722,21 @@ int FixPropertyAtom::unpack_exchange(int nlocal, double *buf)
 
   int m = 0;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE)
+    if (styles[nv] == MOLECULE)
       atom->molecule[nlocal] = (tagint) ubuf(buf[m++]).i;
-    else if (style[nv] == CHARGE)
+    else if (styles[nv] == CHARGE)
       atom->q[nlocal] = buf[m++];
-    else if (style[nv] == RMASS)
+    else if (styles[nv] == RMASS)
       atom->rmass[nlocal] = buf[m++];
-    else if (style[nv] == IVEC)
+    else if (styles[nv] == IVEC)
       atom->ivector[index[nv]][nlocal] = (int) ubuf(buf[m++]).i;
-    else if (style[nv] == DVEC)
+    else if (styles[nv] == DVEC)
       atom->dvector[index[nv]][nlocal] = buf[m++];
-    else if (style[nv] == IARRAY) {
+    else if (styles[nv] == IARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->iarray[index[nv]][nlocal][k] = (int) ubuf(buf[m++]).i;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->darray[index[nv]][nlocal][k] = buf[m++];
@@ -760,16 +760,16 @@ int FixPropertyAtom::pack_restart(int i, double *buf)
 
   int m = 1;
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d;
-    else if (style[nv] == CHARGE) buf[m++] = atom->q[i];
-    else if (style[nv] == RMASS) buf[m++] = atom->rmass[i];
-    else if (style[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d;
-    else if (style[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i];
-    else if (style[nv] == IARRAY) {
+    if (styles[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d;
+    else if (styles[nv] == CHARGE) buf[m++] = atom->q[i];
+    else if (styles[nv] == RMASS) buf[m++] = atom->rmass[i];
+    else if (styles[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d;
+    else if (styles[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i];
+    else if (styles[nv] == IARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         buf[m++] = atom->darray[index[nv]][i][k];
@@ -796,21 +796,21 @@ void FixPropertyAtom::unpack_restart(int nlocal, int nth)
   m++;
 
   for (int nv = 0; nv < nvalue; nv++) {
-    if (style[nv] == MOLECULE)
+    if (styles[nv] == MOLECULE)
       atom->molecule[nlocal] = (tagint) ubuf(extra[nlocal][m++]).i;
-    else if (style[nv] == CHARGE)
+    else if (styles[nv] == CHARGE)
       atom->q[nlocal] = extra[nlocal][m++];
-    else if (style[nv] == RMASS)
+    else if (styles[nv] == RMASS)
       atom->rmass[nlocal] = extra[nlocal][m++];
-    else if (style[nv] == IVEC)
+    else if (styles[nv] == IVEC)
       atom->ivector[index[nv]][nlocal] = (int) ubuf(extra[nlocal][m++]).i;
-    else if (style[nv] == DVEC)
+    else if (styles[nv] == DVEC)
       atom->dvector[index[nv]][nlocal] = extra[nlocal][m++];
-    else if (style[nv] == IARRAY) {
+    else if (styles[nv] == IARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->iarray[index[nv]][nlocal][k] = (int) ubuf(extra[nlocal][m++]).i;
-    } else if (style[nv] == DARRAY) {
+    } else if (styles[nv] == DARRAY) {
       ncol = cols[nv];
       for (k = 0; k < ncol; k++)
         atom->darray[index[nv]][nlocal][k] = extra[nlocal][m++];
diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h
index 08cee7d94c..8580865e59 100644
--- a/src/fix_property_atom.h
+++ b/src/fix_property_atom.h
@@ -53,7 +53,7 @@ class FixPropertyAtom : public Fix {
  protected:
   int nvalue, border;
   int molecule_flag, q_flag, rmass_flag;    // flags for specific fields
-  int *style;                               // style of each value, see enum
+  int *styles;                              // style of each value, see enum
   int *index;                               // indices into atom custom data structs
   int *cols;                                // columns per value, for arrays
   char *astyle;                             // atom style at instantiation

From 21b017368b97f6e2c58011c9822af617aa5f8982 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 15:43:12 -0600
Subject: [PATCH 155/437] force all memory methods to return nullptr if
 requested size <= 0

---
 src/memory.h | 98 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 70 insertions(+), 28 deletions(-)

diff --git a/src/memory.h b/src/memory.h
index 5171a4a718..b3f59140ea 100644
--- a/src/memory.h
+++ b/src/memory.h
@@ -27,7 +27,7 @@ class Memory : protected Pointers {
   void sfree(void *);
   void fail(const char *);
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create/grow/destroy vecs and multidim arrays with contiguous memory blocks
    only use with primitive data types, e.g. 1d vec of ints, 2d array of doubles
    fail() prevents use with pointers,
@@ -36,12 +36,14 @@ class Memory : protected Pointers {
    for these other cases, use smalloc/srealloc/sfree directly
 ------------------------------------------------------------------------- */
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 1d array
 ------------------------------------------------------------------------- */
 
   template  TYPE *create(TYPE *&array, int n, const char *name)
   {
+    if (n <= 0) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * n;
     array = (TYPE *) smalloc(nbytes, name);
     return array;
@@ -53,12 +55,17 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    grow or shrink 1d array
 ------------------------------------------------------------------------- */
 
   template  TYPE *grow(TYPE *&array, int n, const char *name)
   {
+    if (n <= 0) {
+      destroy(array);
+      return nullptr;
+    }
+
     if (array == nullptr) return create(array, n, name);
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n;
@@ -72,7 +79,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 1d array
 ------------------------------------------------------------------------- */
 
@@ -82,13 +89,15 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 1d array with index from nlo to nhi inclusive
    cannot grow it
 ------------------------------------------------------------------------- */
 
   template  TYPE *create1d_offset(TYPE *&array, int nlo, int nhi, const char *name)
   {
+    if (nlo > nhi) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * (nhi - nlo + 1);
     array = (TYPE *) smalloc(nbytes, name);
     array -= nlo;
@@ -102,7 +111,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 1d array with index offset
 ------------------------------------------------------------------------- */
 
@@ -112,12 +121,14 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 2d array
 ------------------------------------------------------------------------- */
 
   template  TYPE **create(TYPE **&array, int n1, int n2, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
     nbytes = ((bigint) sizeof(TYPE *)) * n1;
@@ -138,13 +149,18 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    grow or shrink 1st dim of a 2d array
    last dim must stay the same
 ------------------------------------------------------------------------- */
 
   template  TYPE **grow(TYPE **&array, int n1, int n2, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0) {
+      destroy(array);
+      return nullptr;
+    }
+
     if (array == nullptr) return create(array, n1, n2, name);
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2;
@@ -167,7 +183,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 2d array
 ------------------------------------------------------------------------- */
 
@@ -179,12 +195,14 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 2d array with a ragged 2nd dimension
 ------------------------------------------------------------------------- */
 
   template  TYPE **create_ragged(TYPE **&array, int n1, int *n2, const char *name)
   {
+    if (n1 <= 0) return nullptr;
+
     bigint n2sum = 0;
     for (int i = 0; i < n1; i++) n2sum += n2[i];
 
@@ -208,7 +226,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 2d array with 2nd index from n2lo to n2hi inclusive
    cannot grow it
 ------------------------------------------------------------------------- */
@@ -216,6 +234,8 @@ class Memory : protected Pointers {
   template 
   TYPE **create2d_offset(TYPE **&array, int n1, int n2lo, int n2hi, const char *name)
   {
+    if (n1 <= 0 || n2lo > n2hi) return nullptr;
+
     int n2 = n2hi - n2lo + 1;
     create(array, n1, n2, name);
     for (int i = 0; i < n1; i++) array[i] -= n2lo;
@@ -230,7 +250,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 2d array with 2nd index offset
 ------------------------------------------------------------------------- */
 
@@ -242,12 +262,14 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 3d array
 ------------------------------------------------------------------------- */
 
   template  TYPE ***create(TYPE ***&array, int n1, int n2, int n3, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0 || n3 <= 0) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
     nbytes = ((bigint) sizeof(TYPE *)) * n1 * n2;
@@ -276,13 +298,18 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    grow or shrink 1st dim of a 3d array
    last 2 dims must stay the same
 ------------------------------------------------------------------------- */
 
   template  TYPE ***grow(TYPE ***&array, int n1, int n2, int n3, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0 || n3 <= 0) {
+      destroy(array);
+      return nullptr;
+    };
+
     if (array == nullptr) return create(array, n1, n2, n3, name);
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3;
@@ -313,7 +340,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 3d array
 ------------------------------------------------------------------------- */
 
@@ -326,7 +353,7 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 3d array with 1st index from n1lo to n1hi inclusive
    cannot grow it
 ------------------------------------------------------------------------- */
@@ -334,6 +361,8 @@ class Memory : protected Pointers {
   template 
   TYPE ***create3d_offset(TYPE ***&array, int n1lo, int n1hi, int n2, int n3, const char *name)
   {
+    if (n1lo > n1hi || n2 <= 0 || n3 <= 0) return nullptr;
+
     int n1 = n1hi - n1lo + 1;
     create(array, n1, n2, n3, name);
     array -= n1lo;
@@ -348,7 +377,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    free a 3d array with 1st index offset
 ------------------------------------------------------------------------- */
 
@@ -361,7 +390,7 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 3d array with
    1st index from n1lo to n1hi inclusive,
    2nd index from n2lo to n2hi inclusive,
@@ -373,6 +402,8 @@ class Memory : protected Pointers {
   TYPE ***create3d_offset(TYPE ***&array, int n1lo, int n1hi, int n2lo, int n2hi, int n3lo,
                           int n3hi, const char *name)
   {
+    if (n1lo > n1hi || n2lo > n2hi || n3lo > n3hi) return nullptr;
+
     int n1 = n1hi - n1lo + 1;
     int n2 = n2hi - n2lo + 1;
     int n3 = n3hi - n3lo + 1;
@@ -393,7 +424,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    free a 3d array with all 3 indices offset
 ------------------------------------------------------------------------- */
 
@@ -407,13 +438,15 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 4d array
 ------------------------------------------------------------------------- */
 
   template 
   TYPE ****create(TYPE ****&array, int n1, int n2, int n3, int n4, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3 * n4;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
     nbytes = ((bigint) sizeof(TYPE *)) * n1 * n2 * n3;
@@ -451,7 +484,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
   grow or shrink 1st dim of a 4d array
   last 3 dims must stay the same
   ------------------------------------------------------------------------- */
@@ -459,6 +492,11 @@ class Memory : protected Pointers {
   template 
   TYPE ****grow(TYPE ****&array, int n1, int n2, int n3, int n4, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) {
+      destroy(array);
+      return nullptr;
+    }
+
     if (array == nullptr) return create(array, n1, n2, n3, n4, name);
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3 * n4;
@@ -498,7 +536,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 4d array
 ------------------------------------------------------------------------- */
 
@@ -512,7 +550,7 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 4d array with indices
    2nd index from n2lo to n2hi inclusive
    3rd index from n3lo to n3hi inclusive
@@ -524,6 +562,8 @@ class Memory : protected Pointers {
   TYPE ****create4d_offset(TYPE ****&array, int n1, int n2lo, int n2hi, int n3lo, int n3hi,
                            int n4lo, int n4hi, const char *name)
   {
+    if (n1 <= 0 || n2lo > n2hi || n3lo > n3hi || n4lo > n4hi) return nullptr;
+
     int n2 = n2hi - n2lo + 1;
     int n3 = n3hi - n3lo + 1;
     int n4 = n4hi - n4lo + 1;
@@ -545,8 +585,8 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
-   free a 4d array with indices 2,3, and 4 offset
+/* ----------------------------------------------------------------------
+   free a 4d array with indices 2,3,4 offset
 ------------------------------------------------------------------------- */
 
   template 
@@ -560,13 +600,15 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    create a 5d array
 ------------------------------------------------------------------------- */
 
   template 
   TYPE *****create(TYPE *****&array, int n1, int n2, int n3, int n4, int n5, const char *name)
   {
+    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0 || n5 <= 0) return nullptr;
+
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3 * n4 * n5;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
     nbytes = ((bigint) sizeof(TYPE *)) * n1 * n2 * n3 * n4;
@@ -611,7 +653,7 @@ class Memory : protected Pointers {
     return nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    destroy a 5d array
 ------------------------------------------------------------------------- */
 
@@ -626,7 +668,7 @@ class Memory : protected Pointers {
     array = nullptr;
   }
 
-  /* ----------------------------------------------------------------------
+/* ----------------------------------------------------------------------
    memory usage of arrays, including pointers
 ------------------------------------------------------------------------- */
 

From a519dc3e9a2cd96adc87d1ee9c41f2bcbab3c836 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Thu, 26 Aug 2021 16:33:39 -0600
Subject: [PATCH 156/437] make DIELECTRIC package use of GridComm compatible
 with new version

---
 src/DIELECTRIC/msm_dielectric.cpp       | 40 +++++------
 src/DIELECTRIC/pppm_dielectric.cpp      | 20 +++---
 src/DIELECTRIC/pppm_disp_dielectric.cpp | 90 +++++++++++++------------
 3 files changed, 76 insertions(+), 74 deletions(-)

diff --git a/src/DIELECTRIC/msm_dielectric.cpp b/src/DIELECTRIC/msm_dielectric.cpp
index 2759f21248..8ee1c19ac3 100644
--- a/src/DIELECTRIC/msm_dielectric.cpp
+++ b/src/DIELECTRIC/msm_dielectric.cpp
@@ -136,8 +136,8 @@ void MSMDielectric::compute(int eflag, int vflag)
   // to fully sum contribution in their 3d grid
 
   current_level = 0;
-  gcall->reverse_comm_kspace(this,1,sizeof(double),REVERSE_RHO,
-                             gcall_buf1,gcall_buf2,MPI_DOUBLE);
+  gcall->reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_RHO,
+                      gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // forward communicate charge density values to fill ghost grid points
   // compute direct sum interaction and then restrict to coarser grid
@@ -145,8 +145,8 @@ void MSMDielectric::compute(int eflag, int vflag)
   for (int n=0; n<=levels-2; n++) {
     if (!active_flag[n]) continue;
     current_level = n;
-    gc[n]->forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO,
-                               gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+    gc[n]->forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_RHO,
+                        gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
     direct(n);
     restriction(n);
   }
@@ -158,16 +158,16 @@ void MSMDielectric::compute(int eflag, int vflag)
     if (domain->nonperiodic) {
       current_level = levels-1;
       gc[levels-1]->
-        forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO,
-                            gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+        forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_RHO,
+                     gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
       direct_top(levels-1);
       gc[levels-1]->
-        reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD,
-                            gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+        reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_AD,
+                     gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
       if (vflag_atom)
         gc[levels-1]->
-          reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                              gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+          reverse_comm(GridComm::KSPACE,this,6,sizeof(double),REVERSE_AD_PERATOM,
+                       gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
 
     } else {
       // Here using MPI_Allreduce is cheaper than using commgrid
@@ -177,8 +177,8 @@ void MSMDielectric::compute(int eflag, int vflag)
       current_level = levels-1;
       if (vflag_atom)
         gc[levels-1]->
-          reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                              gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+          reverse_comm(GridComm::KSPACE,this,6,sizeof(double),REVERSE_AD_PERATOM,
+                       gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
     }
   }
 
@@ -190,28 +190,28 @@ void MSMDielectric::compute(int eflag, int vflag)
     prolongation(n);
 
     current_level = n;
-    gc[n]->reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD,
-                               gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+    gc[n]->reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_AD,
+                        gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
 
     // extra per-atom virial communication
 
     if (vflag_atom)
-      gc[n]->reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                                 gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+      gc[n]->reverse_comm(GridComm::KSPACE,this,6,sizeof(double),
+                          REVERSE_AD_PERATOM,gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
   }
 
   // all procs communicate E-field values
   // to fill ghost cells surrounding their 3d bricks
 
   current_level = 0;
-  gcall->forward_comm_kspace(this,1,sizeof(double),FORWARD_AD,
-                             gcall_buf1,gcall_buf2,MPI_DOUBLE);
+  gcall->forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_AD,
+                      gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // extra per-atom energy/virial communication
 
   if (vflag_atom)
-    gcall->forward_comm_kspace(this,6,sizeof(double),FORWARD_AD_PERATOM,
-                               gcall_buf1,gcall_buf2,MPI_DOUBLE);
+    gcall->forward_comm(GridComm::KSPACE,this,6,sizeof(double),FORWARD_AD_PERATOM,
+                        gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // calculate the force on my particles (interpolation)
 
diff --git a/src/DIELECTRIC/pppm_dielectric.cpp b/src/DIELECTRIC/pppm_dielectric.cpp
index 88c0e4c449..f044387852 100644
--- a/src/DIELECTRIC/pppm_dielectric.cpp
+++ b/src/DIELECTRIC/pppm_dielectric.cpp
@@ -130,8 +130,8 @@ void PPPMDielectric::compute(int eflag, int vflag)
   //   to fully sum contribution in their 3d bricks
   // remap from 3d decomposition to FFT decomposition
 
-  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                          gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+  gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                   REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   brick2fft();
 
   // compute potential gradient on my FFT grid and
@@ -145,21 +145,21 @@ void PPPMDielectric::compute(int eflag, int vflag)
   // to fill ghost cells surrounding their 3d bricks
 
   if (differentiation_flag == 1)
-    gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                     FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   else
-    gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),
+                     FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
   // extra per-atom energy/virial communication
 
   if (evflag_atom) {
     if (differentiation_flag == 1 && vflag_atom)
-      gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                       FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     else if (differentiation_flag == 0)
-      gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                       FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   }
 
   // calculate the force on my particles
diff --git a/src/DIELECTRIC/pppm_disp_dielectric.cpp b/src/DIELECTRIC/pppm_disp_dielectric.cpp
index 944225dd43..8c423543c2 100644
--- a/src/DIELECTRIC/pppm_disp_dielectric.cpp
+++ b/src/DIELECTRIC/pppm_disp_dielectric.cpp
@@ -152,8 +152,8 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
 
     make_rho_c();
 
-    gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                     REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     brick2fft(nxlo_in,nylo_in,nzlo_in,nxhi_in,nyhi_in,nzhi_in,
               density_brick,density_fft,work1,remap);
@@ -167,14 +167,14 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                  virial_1,vg,vg2,
                  u_brick,v0_brick,v1_brick,v2_brick,v3_brick,v4_brick,v5_brick);
 
-      gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),FORWARD_AD,
+                       gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
       fieldforce_c_ad();
 
       if (vflag_atom)
-        gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
-                                gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+        gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                         FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     } else {
       poisson_ik(work1,work2,density_fft,fft1,fft2,
@@ -186,14 +186,14 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                  vdx_brick,vdy_brick,vdz_brick,virial_1,vg,vg2,
                  u_brick,v0_brick,v1_brick,v2_brick,v3_brick,v4_brick,v5_brick);
 
-      gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),FORWARD_IK,
+                       gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
       fieldforce_c_ik();
 
       if (evflag_atom)
-        gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
-                                gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+        gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                         FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_c_peratom();
@@ -210,8 +210,8 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
 
     make_rho_g();
 
-    gc6->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO_GEOM,
-                             gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+    gc6->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                      REVERSE_RHO_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     brick2fft(nxlo_in_6,nylo_in_6,nzlo_in_6,nxhi_in_6,nyhi_in_6,nzhi_in_6,
               density_brick_g,density_fft_g,work1_6,remap_6);
@@ -226,14 +226,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                  u_brick_g,v0_brick_g,v1_brick_g,v2_brick_g,
                  v3_brick_g,v4_brick_g,v5_brick_g);
 
-      gc6->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD_GEOM,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                        FORWARD_AD_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_g_ad();
 
       if (vflag_atom)
-        gc6->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_GEOM,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_GEOM,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     } else {
       poisson_ik(work1_6,work2_6,density_fft_g,fft1_6,fft2_6,
@@ -246,14 +247,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                  u_brick_g,v0_brick_g,v1_brick_g,v2_brick_g,
                  v3_brick_g,v4_brick_g,v5_brick_g);
 
-      gc6->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK_GEOM,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),
+                        FORWARD_IK_GEOM,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_g_ik();
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_GEOM,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_GEOM,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_g_peratom();
@@ -270,8 +272,8 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
 
     make_rho_a();
 
-    gc6->reverse_comm_kspace(this,7,sizeof(FFT_SCALAR),REVERSE_RHO_ARITH,
-                             gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+    gc6->reverse_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                      REVERSE_RHO_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     brick2fft_a();
 
@@ -300,14 +302,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                     u_brick_a4,v0_brick_a4,v1_brick_a4,v2_brick_a4,
                     v3_brick_a4,v4_brick_a4,v5_brick_a4);
 
-      gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_AD_ARITH,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                        FORWARD_AD_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_a_ad();
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,42,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_ARITH,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,42,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_ARITH,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     }  else {
       poisson_ik(work1_6,work2_6,density_fft_a3,fft1_6,fft2_6,
@@ -341,14 +344,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
                     u_brick_a4,v0_brick_a4,v1_brick_a4,v2_brick_a4,
                     v3_brick_a4,v4_brick_a4,v5_brick_a4);
 
-      gc6->forward_comm_kspace(this,21,sizeof(FFT_SCALAR),FORWARD_IK_ARITH,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,21,sizeof(FFT_SCALAR),
+                        FORWARD_IK_ARITH,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_a_ik();
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,49,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_ARITH,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,49,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_ARITH,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_a_peratom();
@@ -365,8 +369,8 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
 
     make_rho_none();
 
-    gc6->reverse_comm_kspace(this,nsplit_alloc,sizeof(FFT_SCALAR),REVERSE_RHO_NONE,
-                             gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+    gc6->reverse_comm(GridComm::KSPACE,this,nsplit_alloc,sizeof(FFT_SCALAR),
+                      REVERSE_RHO_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     brick2fft_none();
 
@@ -380,16 +384,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
         n += 2;
       }
 
-      gc6->forward_comm_kspace(this,1*nsplit_alloc,sizeof(FFT_SCALAR),
-                               FORWARD_AD_NONE,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,1*nsplit_alloc,sizeof(FFT_SCALAR),
+                        FORWARD_AD_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_none_ad();
 
       if (vflag_atom)
-        gc6->forward_comm_kspace(this,6*nsplit_alloc,sizeof(FFT_SCALAR),
-                                 FORWARD_AD_PERATOM_NONE,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,6*nsplit_alloc,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_NONE,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     } else {
       int n = 0;
@@ -402,16 +405,15 @@ void PPPMDispDielectric::compute(int eflag, int vflag)
         n += 2;
       }
 
-      gc6->forward_comm_kspace(this,3*nsplit_alloc,sizeof(FFT_SCALAR),
-                               FORWARD_IK_NONE,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,3*nsplit_alloc,sizeof(FFT_SCALAR),
+                        FORWARD_IK_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       fieldforce_none_ik();
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,7*nsplit_alloc,sizeof(FFT_SCALAR),
-                                 FORWARD_IK_PERATOM_NONE,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,7*nsplit_alloc,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_NONE,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_none_peratom();

From fc6b17b82a02ea1ea9142db5be8f7e882ad16ff5 Mon Sep 17 00:00:00 2001
From: Jacob Gissinger 
Date: Thu, 26 Aug 2021 22:28:44 -0400
Subject: [PATCH 157/437] improve whitespace handling

previously, spaces inside of custom 'rxn' functions could cause issues
---
 src/REACTION/fix_bond_react.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp
index afde115ef1..bb245f0ee3 100644
--- a/src/REACTION/fix_bond_react.cpp
+++ b/src/REACTION/fix_bond_react.cpp
@@ -2118,6 +2118,7 @@ double FixBondReact::custom_constraint(std::string varstr)
     evlstr.push_back(varstr.substr(prev3+1,pos1-(prev3+1)));
     prev3 = pos3;
     argstr = varstr.substr(pos2+1,pos3-pos2-1);
+    argstr.erase(remove_if(argstr.begin(), argstr.end(), isspace), argstr.end()); // remove whitespace
     pos2 = argstr.find(",");
     if (pos2 != std::string::npos) {
       varid = argstr.substr(0,pos2);

From bbb3f35aa36e1a0b883d422b6062cfd26f151f94 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 26 Aug 2021 22:46:08 -0400
Subject: [PATCH 158/437] "int64_t" is defined in stdint.h; must use "long" in
 OpenCL kernels instead

---
 lib/gpu/lal_lj_tip4p_long.cu | 12 ++++++++++--
 lib/gpu/lal_neighbor_gpu.cu  |  6 +++++-
 lib/gpu/lal_precision.h      |  2 +-
 src/library.cpp              |  2 +-
 src/library.h                |  2 +-
 5 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/lib/gpu/lal_lj_tip4p_long.cu b/lib/gpu/lal_lj_tip4p_long.cu
index fd254f0a03..8b52f09d68 100644
--- a/lib/gpu/lal_lj_tip4p_long.cu
+++ b/lib/gpu/lal_lj_tip4p_long.cu
@@ -20,9 +20,13 @@
 #define tagint int
 #endif
 #ifdef LAMMPS_BIGBIG
-#include "inttypes.h"
+#ifdef USE_OPENCL
+#define tagint long
+#else
+#include "stdint.h"
 #define tagint int64_t
 #endif
+#endif
 #ifdef LAMMPS_SMALLSMALL
 #define tagint int
 #endif
@@ -39,9 +43,13 @@ _texture( q_tex,int2);
 #define tagint int
 #endif
 #ifdef LAMMPS_BIGBIG
-#include "inttypes.h"
+#ifdef USE_OPENCL
+#define tagint long
+#else
+#include "stdint.h"
 #define tagint int64_t
 #endif
+#endif
 #ifdef LAMMPS_SMALLSMALL
 #define tagint int
 #endif
diff --git a/lib/gpu/lal_neighbor_gpu.cu b/lib/gpu/lal_neighbor_gpu.cu
index 6fd724b494..352f1d6138 100644
--- a/lib/gpu/lal_neighbor_gpu.cu
+++ b/lib/gpu/lal_neighbor_gpu.cu
@@ -21,9 +21,13 @@
 #define tagint int
 #endif
 #ifdef LAMMPS_BIGBIG
-#include "inttypes.h"
+#ifdef USE_OPENCL
+#define tagint long
+#else
+#include "stdint.h"
 #define tagint int64_t
 #endif
+#endif
 #ifdef LAMMPS_SMALLSMALL
 #define tagint int
 #endif
diff --git a/lib/gpu/lal_precision.h b/lib/gpu/lal_precision.h
index bb2423198f..ee1ab7b3e2 100644
--- a/lib/gpu/lal_precision.h
+++ b/lib/gpu/lal_precision.h
@@ -136,7 +136,7 @@ typedef int tagint;
 #define OCL_INT_TYPE "-DLAMMPS_SMALLBIG"
 #endif
 #ifdef LAMMPS_BIGBIG
-#include "inttypes.h"
+#include "stdint.h"
 typedef int64_t tagint;
 #define OCL_INT_TYPE "-DLAMMPS_BIGBIG"
 #endif
diff --git a/src/library.cpp b/src/library.cpp
index db609351f7..b60f8659ee 100644
--- a/src/library.cpp
+++ b/src/library.cpp
@@ -2712,7 +2712,7 @@ Below is a brief C code demonstrating accessing this collected bond information.
 
    #include 
    #include 
-   #include 
+   #include 
    #include "library.h"
 
    int main(int argc, char **argv)
diff --git a/src/library.h b/src/library.h
index 17943e3808..e55f906a11 100644
--- a/src/library.h
+++ b/src/library.h
@@ -35,7 +35,7 @@
 #endif
 
 #if defined(LAMMPS_BIGBIG) || defined(LAMMPS_SMALLBIG)
-#include  /* for int64_t */
+#include  /* for int64_t */
 #endif
 
 /** Data type constants for extracting data from atoms, computes and fixes

From a686ce33c6895a20fe471f89e179d9320ad43194 Mon Sep 17 00:00:00 2001
From: Evan Weinberg 
Date: Thu, 26 Aug 2021 22:55:07 -0400
Subject: [PATCH 159/437] Added less-parallelism-higher-perf paths to recursive
 polynomial routines. Fixed qSNAP memory coalescing issue. Various modularity
 improvements.

---
 src/KOKKOS/pair_snap_kokkos.h      |  18 +-
 src/KOKKOS/pair_snap_kokkos_impl.h | 162 ++++--
 src/KOKKOS/sna_kokkos.h            |  65 ++-
 src/KOKKOS/sna_kokkos_impl.h       | 855 ++++++++++++++++-------------
 4 files changed, 642 insertions(+), 458 deletions(-)

diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h
index d9e15afd54..bd56d87f59 100644
--- a/src/KOKKOS/pair_snap_kokkos.h
+++ b/src/KOKKOS/pair_snap_kokkos.h
@@ -44,7 +44,8 @@ struct TagPairSNAPComputeForce{};
 struct TagPairSNAPComputeNeigh{};
 struct TagPairSNAPComputeCayleyKlein{};
 struct TagPairSNAPPreUi{};
-struct TagPairSNAPComputeUi{};
+struct TagPairSNAPComputeUiSmall{}; // more parallelism, more divergence
+struct TagPairSNAPComputeUiLarge{}; // less parallelism, no divergence
 struct TagPairSNAPTransformUi{}; // re-order ulisttot from SoA to AoSoA, zero ylist
 struct TagPairSNAPComputeZi{};
 struct TagPairSNAPBeta{};
@@ -53,7 +54,9 @@ struct TagPairSNAPTransformBi{}; // re-order blist from AoSoA to AoS
 struct TagPairSNAPComputeYi{};
 struct TagPairSNAPComputeYiWithZlist{};
 template
-struct TagPairSNAPComputeFusedDeidrj{};
+struct TagPairSNAPComputeFusedDeidrjSmall{}; // more parallelism, more divergence
+template
+struct TagPairSNAPComputeFusedDeidrjLarge{}; // less parallelism, no divergence
 
 // CPU backend only
 struct TagPairSNAPComputeNeighCPU{};
@@ -143,7 +146,10 @@ public:
   void operator() (TagPairSNAPPreUi,const int iatom_mod, const int j, const int iatom_div) const;
 
   KOKKOS_INLINE_FUNCTION
-  void operator() (TagPairSNAPComputeUi,const typename Kokkos::TeamPolicy::member_type& team) const;
+  void operator() (TagPairSNAPComputeUiSmall,const typename Kokkos::TeamPolicy::member_type& team) const;
+
+  KOKKOS_INLINE_FUNCTION
+  void operator() (TagPairSNAPComputeUiLarge,const typename Kokkos::TeamPolicy::member_type& team) const;
 
   KOKKOS_INLINE_FUNCTION
   void operator() (TagPairSNAPTransformUi,const int iatom_mod, const int j, const int iatom_div) const;
@@ -168,7 +174,11 @@ public:
 
   template
   KOKKOS_INLINE_FUNCTION
-  void operator() (TagPairSNAPComputeFusedDeidrj,const typename Kokkos::TeamPolicy >::member_type& team) const;
+  void operator() (TagPairSNAPComputeFusedDeidrjSmall,const typename Kokkos::TeamPolicy >::member_type& team) const;
+
+  template
+  KOKKOS_INLINE_FUNCTION
+  void operator() (TagPairSNAPComputeFusedDeidrjLarge,const typename Kokkos::TeamPolicy >::member_type& team) const;
 
   // CPU backend only
   KOKKOS_INLINE_FUNCTION
diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h
index 30a4082711..983a85c6bd 100644
--- a/src/KOKKOS/pair_snap_kokkos_impl.h
+++ b/src/KOKKOS/pair_snap_kokkos_impl.h
@@ -341,18 +341,32 @@ void PairSNAPKokkos::compute(int eflag_in,
       // ComputeUi w/vector parallelism, shared memory, direct atomicAdd into ulisttot
       {
         // team_size_compute_ui is defined in `pair_snap_kokkos.h`
-
         // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer
         const int tile_size = vector_length * (twojmax + 1);
         const int scratch_size = scratch_size_helper(team_size_compute_ui * tile_size);
 
-        // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations)
-        const int n_teams = chunk_size_div * max_neighs * (twojmax + 1);
-        const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui;
+        if (chunk_size < 16384)
+        {
+          // Version with parallelism over j_bend
 
-        SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length);
-        policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
-        Kokkos::parallel_for("ComputeUi",policy_ui,*this);
+          // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations)
+          const int n_teams = chunk_size_div * max_neighs * (twojmax + 1);
+          const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui;
+
+          SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length);
+          policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeUiSmall",policy_ui,*this);
+        } else {
+          // Version w/out parallelism over j_bend
+
+          // total number of teams needed: (natoms / 32) * (max_neighs)
+          const int n_teams = chunk_size_div * max_neighs;
+          const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui;
+
+          SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length);
+          policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeUiLarge",policy_ui,*this);
+        }
       }
 
       //TransformUi: un-"fold" ulisttot, zero ylist
@@ -412,25 +426,51 @@ void PairSNAPKokkos::compute(int eflag_in,
         const int tile_size = vector_length * (twojmax + 1);
         const int scratch_size = scratch_size_helper(2 * team_size_compute_fused_deidrj * tile_size);
 
-        // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations)
-        const int n_teams = chunk_size_div * max_neighs * (twojmax + 1);
-        const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj;
+        if (chunk_size < 16384)
+        {
+          // Version with parallelism over j_bend
 
-        // x direction
-        SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length);
-        policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
-        Kokkos::parallel_for("ComputeFusedDeidrj<0>",policy_fused_deidrj_x,*this);
+          // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations)
+          const int n_teams = chunk_size_div * max_neighs * (twojmax + 1);
+          const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj;
 
-        // y direction
-        SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length);
-        policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
-        Kokkos::parallel_for("ComputeFusedDeidrj<1>",policy_fused_deidrj_y,*this);
+          // x direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjSmall<0>",policy_fused_deidrj_x,*this);
 
-        // z direction
-        SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length);
-        policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
-        Kokkos::parallel_for("ComputeFusedDeidrj<2>",policy_fused_deidrj_z,*this);
+          // y direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjSmall<1>",policy_fused_deidrj_y,*this);
 
+          // z direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjSmall<2>",policy_fused_deidrj_z,*this);
+        } else {
+          // Version w/out parallelism over j_bend
+
+          // total number of teams needed: (natoms / 32) * (max_neighs)
+          const int n_teams = chunk_size_div * max_neighs;
+          const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj;
+
+          // x direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjLarge<0>",policy_fused_deidrj_x,*this);
+
+          // y direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjLarge<1>",policy_fused_deidrj_y,*this);
+
+          // z direction
+          SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length);
+          policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size));
+          Kokkos::parallel_for("ComputeFusedDeidrjLarge<2>",policy_fused_deidrj_z,*this);
+
+        }
       }
 
 #endif // LMP_KOKKOS_GPU
@@ -603,13 +643,13 @@ void PairSNAPKokkos::operator() (TagPairSN
     for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
       const auto idxb = icoeff % idxb_max;
       const auto idx_chem = icoeff / idxb_max;
-      auto bveci = my_sna.blist(idxb, idx_chem, ii);
+      real_type bveci = my_sna.blist(ii, idx_chem, idxb);
       d_beta_pack(iatom_mod,icoeff,iatom_div) += d_coeffi[k]*bveci;
       k++;
       for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) {
         const auto jdxb = jcoeff % idxb_max;
         const auto jdx_chem = jcoeff / idxb_max;
-        real_type bvecj = my_sna.blist(jdxb, jdx_chem, ii);
+        real_type bvecj = my_sna.blist(ii, jdx_chem, jdxb);
         d_beta_pack(iatom_mod,icoeff,iatom_div) += d_coeffi[k]*bvecj;
         d_beta_pack(iatom_mod,jcoeff,iatom_div) += d_coeffi[k]*bveci;
         k++;
@@ -736,7 +776,7 @@ void PairSNAPKokkos::operator() (TagPairSN
 
 template
 KOKKOS_INLINE_FUNCTION
-void PairSNAPKokkos::operator() (TagPairSNAPComputeUi,const typename Kokkos::TeamPolicy::member_type& team) const {
+void PairSNAPKokkos::operator() (TagPairSNAPComputeUiSmall,const typename Kokkos::TeamPolicy::member_type& team) const {
   SNAKokkos my_sna = snaKK;
 
   // extract flattened atom_div / neighbor number / bend location
@@ -756,11 +796,37 @@ void PairSNAPKokkos::operator() (TagPairSN
     const int ninside = d_ninside(ii);
     if (jj >= ninside) return;
 
-    my_sna.compute_ui(team,iatom_mod, jbend, jj, iatom_div);
+    my_sna.compute_ui_small(team, iatom_mod, jbend, jj, iatom_div);
   });
 
 }
 
+template
+KOKKOS_INLINE_FUNCTION
+void PairSNAPKokkos::operator() (TagPairSNAPComputeUiLarge,const typename Kokkos::TeamPolicy::member_type& team) const {
+  SNAKokkos my_sna = snaKK;
+
+  // extract flattened atom_div / neighbor number / bend location
+  int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_ui;
+
+  // extract neighbor index, iatom_div
+  int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug
+  int jj = flattened_idx - iatom_div * max_neighs;
+
+  Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length),
+    [&] (const int iatom_mod) {
+    const int ii = iatom_mod + vector_length * iatom_div;
+    if (ii >= chunk_size) return;
+
+    const int ninside = d_ninside(ii);
+    if (jj >= ninside) return;
+
+    my_sna.compute_ui_large(team,iatom_mod, jj, iatom_div);
+  });
+
+}
+
+
 template
 KOKKOS_INLINE_FUNCTION
 void PairSNAPKokkos::operator() (TagPairSNAPTransformUi,const int iatom_mod, const int idxu, const int iatom_div) const {
@@ -861,9 +927,9 @@ void PairSNAPKokkos::operator() (TagPairSN
 
   for (int itriple = 0; itriple < ntriples; itriple++) {
 
-    const auto blocal = my_sna.blist_pack(iatom_mod, idxb, itriple, iatom_div);
+    const real_type blocal = my_sna.blist_pack(iatom_mod, idxb, itriple, iatom_div);
 
-    my_sna.blist(idxb, itriple, iatom) = blocal;
+    my_sna.blist(iatom, itriple, idxb) = blocal;
   }
 
 }
@@ -871,7 +937,7 @@ void PairSNAPKokkos::operator() (TagPairSN
 template
 template
 KOKKOS_INLINE_FUNCTION
-void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrj,const typename Kokkos::TeamPolicy >::member_type& team) const {
+void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjSmall,const typename Kokkos::TeamPolicy >::member_type& team) const {
   SNAKokkos my_sna = snaKK;
 
   // extract flattened atom_div / neighbor number / bend location
@@ -891,12 +957,38 @@ void PairSNAPKokkos::operator() (TagPairSN
     const int ninside = d_ninside(ii);
     if (jj >= ninside) return;
 
-    my_sna.template compute_fused_deidrj(team, iatom_mod, jbend, jj, iatom_div);
+    my_sna.template compute_fused_deidrj_small(team, iatom_mod, jbend, jj, iatom_div);
 
   });
 
 }
 
+template
+template
+KOKKOS_INLINE_FUNCTION
+void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjLarge,const typename Kokkos::TeamPolicy >::member_type& team) const {
+  SNAKokkos my_sna = snaKK;
+
+  // extract flattened atom_div / neighbor number / bend location
+  int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_fused_deidrj;
+
+  // extract neighbor index, iatom_div
+  int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug
+  int jj = flattened_idx - max_neighs * iatom_div;
+
+  Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length),
+    [&] (const int iatom_mod) {
+    const int ii = iatom_mod + vector_length * iatom_div;
+    if (ii >= chunk_size) return;
+
+    const int ninside = d_ninside(ii);
+    if (jj >= ninside) return;
+
+    my_sna.template compute_fused_deidrj_large(team, iatom_mod, jj, iatom_div);
+
+  });
+}
+
 /* ----------------------------------------------------------------------
    Begin routines that are unique to the CPU codepath. These do not take
    advantage of AoSoA data layouts, but that could be a good point of
@@ -925,13 +1017,13 @@ void PairSNAPKokkos::operator() (TagPairSN
     for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
       const auto idxb = icoeff % idxb_max;
       const auto idx_chem = icoeff / idxb_max;
-      auto bveci = my_sna.blist(idxb,idx_chem,ii);
+      real_type bveci = my_sna.blist(ii,idx_chem,idxb);
       d_beta(icoeff,ii) += d_coeffi[k]*bveci;
       k++;
       for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) {
         const auto jdxb = jcoeff % idxb_max;
         const auto jdx_chem = jcoeff / idxb_max;
-        auto bvecj = my_sna.blist(jdxb,jdx_chem,ii);
+        real_type bvecj = my_sna.blist(ii,jdx_chem,jdxb);
         d_beta(icoeff,ii) += d_coeffi[k]*bvecj;
         d_beta(jcoeff,ii) += d_coeffi[k]*bveci;
         k++;
@@ -1221,7 +1313,7 @@ void PairSNAPKokkos::operator() (TagPairSN
       for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
         const auto idxb = icoeff % idxb_max;
         const auto idx_chem = icoeff / idxb_max;
-        evdwl += d_coeffi[icoeff+1]*my_sna.blist(idxb,idx_chem,ii);
+        evdwl += d_coeffi[icoeff+1]*my_sna.blist(ii,idx_chem,idxb);
       }
 
       // quadratic contributions
@@ -1230,12 +1322,12 @@ void PairSNAPKokkos::operator() (TagPairSN
         for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
           const auto idxb = icoeff % idxb_max;
           const auto idx_chem = icoeff / idxb_max;
-          auto bveci = my_sna.blist(idxb,idx_chem,ii);
+          real_type bveci = my_sna.blist(ii,idx_chem,idxb);
           evdwl += 0.5*d_coeffi[k++]*bveci*bveci;
           for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) {
             auto jdxb = jcoeff % idxb_max;
             auto jdx_chem = jcoeff / idxb_max;
-            auto bvecj = my_sna.blist(jdxb,jdx_chem,ii);
+            auto bvecj = my_sna.blist(ii,jdx_chem,jdxb);
             evdwl += d_coeffi[k++]*bveci*bvecj;
           }
         }
diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h
index cb7b1b3cc0..47a01d5ca4 100644
--- a/src/KOKKOS/sna_kokkos.h
+++ b/src/KOKKOS/sna_kokkos.h
@@ -45,12 +45,12 @@ struct WignerWrapper {
   { ; }
 
   KOKKOS_INLINE_FUNCTION
-  complex get(const int& ma) {
+  complex get(const int& ma) const {
     return complex(buffer[offset + 2 * vector_length * ma], buffer[offset + vector_length + 2 * vector_length * ma]);
   }
 
   KOKKOS_INLINE_FUNCTION
-  void set(const int& ma, const complex& store) {
+  void set(const int& ma, const complex& store) const {
     buffer[offset + 2 * vector_length * ma] = store.re;
     buffer[offset + vector_length + 2 * vector_length * ma] = store.im;
   }
@@ -122,8 +122,14 @@ inline
   void compute_cayley_klein(const int&, const int&, const int&);
   KOKKOS_INLINE_FUNCTION
   void pre_ui(const int&, const int&, const int&, const int&); // ForceSNAP
+
+  // version of the code with parallelism over j_bend
   KOKKOS_INLINE_FUNCTION
-  void compute_ui(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); // ForceSNAP
+  void compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); // ForceSNAP
+  // version of the code without parallelism over j_bend
+  KOKKOS_INLINE_FUNCTION
+  void compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int); // ForceSNAP
+
   KOKKOS_INLINE_FUNCTION
   void compute_zi(const int&, const int&, const int&);    // ForceSNAP
   KOKKOS_INLINE_FUNCTION
@@ -135,6 +141,35 @@ inline
   KOKKOS_INLINE_FUNCTION
   void compute_bi(const int&, const int&, const int&);    // ForceSNAP
 
+  // functions for derivatives, GPU only
+  // version of the code with parallelism over j_bend
+  template
+  KOKKOS_INLINE_FUNCTION
+  void compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); //ForceSNAP
+  // version of the code without parallelism over j_bend
+  template
+  KOKKOS_INLINE_FUNCTION
+  void compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int); //ForceSNAP
+
+  // core "evaluation" functions that get plugged into "compute" functions
+  // plugged into compute_ui_small, compute_ui_large
+  KOKKOS_FORCEINLINE_FUNCTION
+  void evaluate_ui_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&, const int&,
+                        const int&, const int&, const int&);
+  // plugged into compute_zi, compute_yi
+  KOKKOS_FORCEINLINE_FUNCTION
+  complex evaluate_zi(const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&,
+                        const int&, const int&, const int&, const int&, const real_type*);
+  // plugged into compute_yi, compute_yi_with_zlist
+  KOKKOS_FORCEINLINE_FUNCTION
+  real_type evaluate_beta_scaled(const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&,
+                        const Kokkos::View &);
+  // plugged into compute_fused_deidrj_small, compute_fused_deidrj_large
+  KOKKOS_FORCEINLINE_FUNCTION
+  real_type evaluate_duidrj_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&, 
+                        const WignerWrapper&, const complex&, const complex&, const real_type&,
+                        const int&, const int&, const int&, const int&);
+
   // functions for bispectrum coefficients, CPU only
   KOKKOS_INLINE_FUNCTION
   void pre_ui_cpu(const typename Kokkos::TeamPolicy::member_type& team,const int&,const int&); // ForceSNAP
@@ -148,11 +183,6 @@ inline
     KOKKOS_INLINE_FUNCTION
   void compute_bi_cpu(const typename Kokkos::TeamPolicy::member_type& team, int);    // ForceSNAP
 
-  // functions for derivatives, GPU only
-  template
-  KOKKOS_INLINE_FUNCTION
-  void compute_fused_deidrj(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); //ForceSNAP
-
   // functions for derivatives, CPU only
   KOKKOS_INLINE_FUNCTION
   void compute_duidrj_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int); //ForceSNAP
@@ -168,23 +198,6 @@ inline
   KOKKOS_INLINE_FUNCTION
   void compute_s_dsfac(const real_type, const real_type, real_type&, real_type&); // compute_cayley_klein
 
-  static KOKKOS_FORCEINLINE_FUNCTION
-  void sincos_wrapper(double x, double* sin_, double *cos_) {
-#ifdef __SYCL_DEVICE_ONLY__
-    *sin_ = sycl::sincos(x, cos_);
-#else
-    sincos(x, sin_, cos_);
-#endif
-  }
-  static KOKKOS_FORCEINLINE_FUNCTION
-  void sincos_wrapper(float x, float* sin_, float *cos_) {
-#ifdef __SYCL_DEVICE_ONLY__
-    *sin_ = sycl::sincos(x, cos_);
-#else
-    sincosf(x, sin_, cos_);
-#endif
-  }
-
 #ifdef TIMING_INFO
   double* timers;
   timespec starttime, endtime;
@@ -207,7 +220,7 @@ inline
 
   int twojmax, diagonalstyle;
 
-  t_sna_3d_ll blist;
+  t_sna_3d blist;
   t_sna_3c_ll ulisttot;
   t_sna_3c_ll ulisttot_full; // un-folded ulisttot, cpu only
   t_sna_3c_ll zlist;
diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h
index 142b55158e..9b9e74dc2a 100644
--- a/src/KOKKOS/sna_kokkos_impl.h
+++ b/src/KOKKOS/sna_kokkos_impl.h
@@ -316,7 +316,7 @@ void SNAKokkos::grow_rij(int newnatom, int
     ulist = t_sna_3c_ll(Kokkos::NoInit("sna:ulist"),1,1,1);
     zlist = t_sna_3c_ll(Kokkos::NoInit("sna:zlist"),1,1,1);
     zlist_pack = t_sna_4c_ll(Kokkos::NoInit("sna:zlist_pack"),vector_length,idxz_max,ndoubles,natom_div);
-    blist = t_sna_3d_ll(Kokkos::NoInit("sna:blist"),idxb_max,ntriples,natom);
+    blist = t_sna_3d(Kokkos::NoInit("sna:blist"),natom,ntriples,idxb_max);
     blist_pack = t_sna_4d_ll(Kokkos::NoInit("sna:blist_pack"),vector_length,idxb_max,ntriples,natom_div);
     ylist = t_sna_3c_ll(Kokkos::NoInit("sna:ylist"),1,1,1);
     ylist_pack_re = t_sna_4d_ll(Kokkos::NoInit("sna:ylist_pack_re"),vector_length,idxu_half_max,nelements,natom_div);
@@ -337,7 +337,7 @@ void SNAKokkos::grow_rij(int newnatom, int
     ulist = t_sna_3c_ll(Kokkos::NoInit("sna:ulist"),idxu_cache_max,natom,nmax);
     zlist = t_sna_3c_ll(Kokkos::NoInit("sna:zlist"),idxz_max,ndoubles,natom);
     zlist_pack = t_sna_4c_ll(Kokkos::NoInit("sna:zlist_pack"),1,1,1,1);
-    blist = t_sna_3d_ll(Kokkos::NoInit("sna:blist"),idxb_max,ntriples,natom);
+    blist = t_sna_3d(Kokkos::NoInit("sna:blist"),natom,ntriples,idxb_max);
     blist_pack = t_sna_4d_ll(Kokkos::NoInit("sna:blist_pack"),1,1,1,1);
     ylist = t_sna_3c_ll(Kokkos::NoInit("sna:ylist"),idxu_half_max,nelements,natom);
     ylist_pack_re = t_sna_4d_ll(Kokkos::NoInit("sna:ylist_pack_re"),1,1,1,1);
@@ -365,44 +365,44 @@ KOKKOS_INLINE_FUNCTION
 void SNAKokkos::compute_cayley_klein(const int& iatom_mod, const int& jnbor, const int& iatom_div)
 {
   const int iatom = iatom_mod + vector_length * iatom_div;
-  const auto x = rij(iatom,jnbor,0);
-  const auto y = rij(iatom,jnbor,1);
-  const auto z = rij(iatom,jnbor,2);
-  const auto rsq = x * x + y * y + z * z;
-  const auto r = sqrt(rsq);
-  const auto rcut = rcutij(iatom, jnbor);
-  const auto rscale0 = rfac0 * static_cast(MY_PI) / (rcut - rmin0);
-  const auto theta0 = (r - rmin0) * rscale0;
-  real_type sn, cs;
-  sincos_wrapper(theta0, &sn, &cs);
+  const real_type x = rij(iatom,jnbor,0);
+  const real_type y = rij(iatom,jnbor,1);
+  const real_type z = rij(iatom,jnbor,2);
+  const real_type rsq = x * x + y * y + z * z;
+  const real_type r = sqrt(rsq);
+  const real_type rcut = rcutij(iatom, jnbor);
+  const real_type rscale0 = rfac0 * static_cast(MY_PI) / (rcut - rmin0);
+  const real_type theta0 = (r - rmin0) * rscale0;
+  const real_type sn = sin(theta0);
+  const real_type cs = cos(theta0);
   const real_type z0 = r * cs / sn;
   const real_type dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq;
 
-  const auto wj_local = wj(iatom, jnbor);
+  const real_type wj_local = wj(iatom, jnbor);
   real_type sfac, dsfac;
   compute_s_dsfac(r, rcut, sfac, dsfac);
   sfac *= wj_local;
   dsfac *= wj_local;
 
-  const auto rinv = static_cast(1.0) / r;
-  const auto ux = x * rinv;
-  const auto uy = y * rinv;
-  const auto uz = z * rinv;
+  const real_type rinv = static_cast(1.0) / r;
+  const real_type ux = x * rinv;
+  const real_type uy = y * rinv;
+  const real_type uz = z * rinv;
 
-  const auto r0inv = static_cast(1.0) / sqrt(r * r + z0 * z0);
+  const real_type r0inv = static_cast(1.0) / sqrt(r * r + z0 * z0);
 
   const complex a = { z0 * r0inv, -z * r0inv };
   const complex b = { r0inv * y, -r0inv * x };
 
-  const auto dr0invdr = -r0inv * r0inv * r0inv * (r + z0 * dz0dr);
+  const real_type dr0invdr = -r0inv * r0inv * r0inv * (r + z0 * dz0dr);
 
-  const auto dr0invx = dr0invdr * ux;
-  const auto dr0invy = dr0invdr * uy;
-  const auto dr0invz = dr0invdr * uz;
+  const real_type dr0invx = dr0invdr * ux;
+  const real_type dr0invy = dr0invdr * uy;
+  const real_type dr0invz = dr0invdr * uz;
 
-  const auto dz0x = dz0dr * ux;
-  const auto dz0y = dz0dr * uy;
-  const auto dz0z = dz0dr * uz;
+  const real_type dz0x = dz0dr * ux;
+  const real_type dz0y = dz0dr * uy;
+  const real_type dz0z = dz0dr * uz;
 
   const complex dax = { dz0x * r0inv + z0 * dr0invx, -z * dr0invx };
   const complex day = { dz0y * r0inv + z0 * dr0invy, -z * dr0invy };
@@ -412,9 +412,9 @@ void SNAKokkos::compute_cayley_klein(const
   const complex dby = { y * dr0invy + r0inv, -x * dr0invy };
   const complex dbz = { y * dr0invz, -x * dr0invz };
 
-  const auto dsfacux = dsfac * ux;
-  const auto dsfacuy = dsfac * uy;
-  const auto dsfacuz = dsfac * uz;
+  const real_type dsfacux = dsfac * ux;
+  const real_type dsfacuy = dsfac * uy;
+  const real_type dsfacuz = dsfac * uz;
 
   a_pack(iatom_mod,jnbor,iatom_div) = a;
   b_pack(iatom_mod,jnbor,iatom_div) = b;
@@ -479,17 +479,13 @@ void SNAKokkos::pre_ui(const int& iatom_mo
    accumulating to the total. GPU only.
 ------------------------------------------------------------------------- */
 
+// Version of the code that exposes additional parallelism by threading over `j_bend` values
+
 template
 KOKKOS_INLINE_FUNCTION
-void SNAKokkos::compute_ui(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div)
+void SNAKokkos::compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div)
 {
 
-  // utot(j,ma,mb) = 0 for all j,ma,ma
-  // utot(j,ma,ma) = 1 for all j,ma
-  // for j in neighbors of i:
-  //   compute r0 = (x,y,z,z0)
-  //   utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb
-
   // get shared memory offset
   // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer
   const int tile_size = vector_length * (twojmax + 1);
@@ -498,13 +494,12 @@ void SNAKokkos::compute_ui(const typename
   const int scratch_shift = team_rank * tile_size;
 
   // extract and wrap
-  WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
-
+  const WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
 
   // load parameters
-  const auto a = a_pack(iatom_mod, jnbor, iatom_div);
-  const auto b = b_pack(iatom_mod, jnbor, iatom_div);
-  const auto sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
+  const complex a = a_pack(iatom_mod, jnbor, iatom_div);
+  const complex b = b_pack(iatom_mod, jnbor, iatom_div);
+  const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
 
   const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor);
 
@@ -512,101 +507,146 @@ void SNAKokkos::compute_ui(const typename
   // this for loop is here for context --- we expose additional
   // parallelism over this loop instead
   //for (int j_bend = 0; j_bend <= twojmax; j_bend++) {
+  evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom_mod, j_bend, iatom_div);
+  //} // end of "reference" loop over j_bend
 
-    // level 0 is just 1.
-    ulist_wrapper.set(0, complex::one());
+}
 
-    // j from before the bend, don't store, mb == 0
-    // this is "creeping up the side"
-    for (int j = 1; j <= j_bend; j++) {
+// Version of the code that loops over all `j_bend` values which reduces integer arithmetic
+// and some amount of load imbalance, at the expense of reducing parallelism
+template
+KOKKOS_INLINE_FUNCTION
+void SNAKokkos::compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div)
+{
+  // get shared memory offset
+  // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer
+  const int tile_size = vector_length * (twojmax + 1);
 
-      constexpr int mb = 0; // intentional for readability, compiler should optimize this out
+  const int team_rank = team.team_rank();
+  const int scratch_shift = team_rank * tile_size;
 
-      complex ulist_accum = complex::zero();
+  // extract and wrap
+  const WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
 
-      int ma;
-      for (ma = 0; ma < j; ma++) {
+  // load parameters
+  const complex a = a_pack(iatom_mod, jnbor, iatom_div);
+  const complex b = b_pack(iatom_mod, jnbor, iatom_div);
+  const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
 
-        // grab the cached value
-        const complex ulist_prev = ulist_wrapper.get(ma);
+  const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor);
 
-        // ulist_accum += rootpq * a.conj() * ulist_prev;
-        real_type rootpq = rootpqarray(j - ma, j - mb);
-        ulist_accum.re += rootpq * (a.re * ulist_prev.re + a.im * ulist_prev.im);
-        ulist_accum.im += rootpq * (a.re * ulist_prev.im - a.im * ulist_prev.re);
+  // we need to "choose" when to bend
+  #ifdef LMP_KK_DEVICE_COMPILE
+  #pragma unroll
+  #endif
+  for (int j_bend = 0; j_bend <= twojmax; j_bend++) {
+    evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom_mod, j_bend, iatom_div);
+  }
+}
 
-        // store ulist_accum, we atomic accumulate values after the bend, so no atomic add here
-        ulist_wrapper.set(ma, ulist_accum);
+// Core "evaluation" kernel that gets reused in `compute_ui_small` and `compute_ui_large`
+template
+KOKKOS_FORCEINLINE_FUNCTION
+void SNAKokkos::evaluate_ui_jbend(const WignerWrapper& ulist_wrapper,
+          const complex& a, const complex& b, const real_type& sfac, const int& jelem,
+          const int& iatom_mod, const int& j_bend, const int& iatom_div)
+{
 
-        // next value
-        // ulist_accum = -rootpq * b.conj() * ulist_prev;
-        rootpq = rootpqarray(ma + 1, j - mb);
-        ulist_accum.re = -rootpq * (b.re * ulist_prev.re + b.im * ulist_prev.im);
-        ulist_accum.im = -rootpq * (b.re * ulist_prev.im - b.im * ulist_prev.re);
+  // utot(j,ma,mb) = 0 for all j,ma,ma
+  // utot(j,ma,ma) = 1 for all j,ma
+  // for j in neighbors of i:
+  //   compute r0 = (x,y,z,z0)
+  //   utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb
 
-      }
+  // level 0 is just 1.
+  ulist_wrapper.set(0, complex::one());
 
-      ulist_wrapper.set(ma, ulist_accum);
-    }
+  // j from before the bend, don't store, mb == 0
+  for (int j = 1; j <= j_bend; j++) {
 
-    // now we're after the bend, start storing but only up to the "half way point"
-    const int j_half_way = MIN(2 * j_bend, twojmax);
+    constexpr int mb = 0; // intentional for readability, compiler should optimize this out
 
-    int mb = 1;
-    int j; //= j_bend + 1; // need this value below
-    for (j = j_bend + 1; j <= j_half_way; j++) {
+    complex ulist_accum = complex::zero();
 
-      const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
+    int ma;
+    for (ma = 0; ma < j; ma++) {
 
-      complex ulist_accum = complex::zero();
+      // grab the cached value
+      const complex ulist_prev = ulist_wrapper.get(ma);
 
-      int ma;
-      for (ma = 0; ma < j; ma++) {
-
-        // grab the cached value
-        const complex ulist_prev = ulist_wrapper.get(ma);
-
-        // atomic add the previous level here
-        Kokkos::atomic_add(&(ulisttot_re_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.re * sfac);
-        Kokkos::atomic_add(&(ulisttot_im_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.im * sfac);
-
-        // ulist_accum += rootpq * b * ulist_prev;
-        real_type rootpq = rootpqarray(j - ma, mb);
-        ulist_accum.re += rootpq * (b.re * ulist_prev.re - b.im * ulist_prev.im);
-        ulist_accum.im += rootpq * (b.re * ulist_prev.im + b.im * ulist_prev.re);
-
-        // store ulist_accum
-        ulist_wrapper.set(ma, ulist_accum);
-
-        // next value
-        // ulist_accum = rootpq * a * ulist_prev;
-        rootpq = rootpqarray(ma + 1, mb);
-        ulist_accum.re = rootpq * (a.re * ulist_prev.re - a.im * ulist_prev.im);
-        ulist_accum.im = rootpq * (a.re * ulist_prev.im + a.im * ulist_prev.re);
-      }
+      // ulist_accum += rootpq * a.conj() * ulist_prev;
+      real_type rootpq = rootpqarray(j - ma, j - mb);
+      ulist_accum.re += rootpq * (a.re * ulist_prev.re + a.im * ulist_prev.im);
+      ulist_accum.im += rootpq * (a.re * ulist_prev.im - a.im * ulist_prev.re);
 
+      // store ulist_accum, we atomic accumulate values after the bend, so no atomic add here
       ulist_wrapper.set(ma, ulist_accum);
 
-      mb++;
+      // next value
+      // ulist_accum = -rootpq * b.conj() * ulist_prev;
+      rootpq = rootpqarray(ma + 1, j - mb);
+      ulist_accum.re = -rootpq * (b.re * ulist_prev.re + b.im * ulist_prev.im);
+      ulist_accum.im = -rootpq * (b.re * ulist_prev.im - b.im * ulist_prev.re);
+
     }
 
-    // atomic add the last level
+    ulist_wrapper.set(ma, ulist_accum);
+  }
+
+  // now we're after the bend, start storing but only up to the "half way point"
+  const int j_half_way = MIN(2 * j_bend, twojmax);
+
+  int mb = 1;
+  int j; //= j_bend + 1; // need this value below
+  for (j = j_bend + 1; j <= j_half_way; j++) {
+
     const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
 
-    for (int ma = 0; ma < j; ma++) {
+    complex ulist_accum = complex::zero();
+
+    int ma;
+    for (ma = 0; ma < j; ma++) {
+
+      // grab the cached value
       const complex ulist_prev = ulist_wrapper.get(ma);
 
       // atomic add the previous level here
       Kokkos::atomic_add(&(ulisttot_re_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.re * sfac);
       Kokkos::atomic_add(&(ulisttot_im_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.im * sfac);
+
+      // ulist_accum += rootpq * b * ulist_prev;
+      real_type rootpq = rootpqarray(j - ma, mb);
+      ulist_accum.re += rootpq * (b.re * ulist_prev.re - b.im * ulist_prev.im);
+      ulist_accum.im += rootpq * (b.re * ulist_prev.im + b.im * ulist_prev.re);
+
+      // store ulist_accum
+      ulist_wrapper.set(ma, ulist_accum);
+
+      // next value
+      // ulist_accum = rootpq * a * ulist_prev;
+      rootpq = rootpqarray(ma + 1, mb);
+      ulist_accum.re = rootpq * (a.re * ulist_prev.re - a.im * ulist_prev.im);
+      ulist_accum.im = rootpq * (a.re * ulist_prev.im + a.im * ulist_prev.re);
     }
 
-  //} // end of "reference" loop over j_bend
+    ulist_wrapper.set(ma, ulist_accum);
 
+    mb++;
+  }
+
+  // atomic add the last level
+  const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
+
+  for (int ma = 0; ma < j; ma++) {
+    const complex ulist_prev = ulist_wrapper.get(ma);
+
+    // atomic add the previous level here
+    Kokkos::atomic_add(&(ulisttot_re_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.re * sfac);
+    Kokkos::atomic_add(&(ulisttot_im_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.im * sfac);
+  }
 
 }
 
-
 /* ----------------------------------------------------------------------
    compute Zi by summing over products of Ui,
    AoSoA data layout to take advantage of coalescing, avoiding warp
@@ -634,47 +674,8 @@ void SNAKokkos::compute_zi(const int& iato
 
   for (int elem1 = 0; elem1 < nelements; elem1++) {
     for (int elem2 = 0; elem2 < nelements; elem2++) {
-      complex ztmp = complex::zero();
 
-      int jju1 = idxu_block[j1] + (j1+1)*mb1min;
-      int jju2 = idxu_block[j2] + (j2+1)*mb2max;
-      int icgb = mb1min*(j2+1) + mb2max;
-
-      #ifdef LMP_KK_DEVICE_COMPILE
-      #pragma unroll
-      #endif
-      for (int ib = 0; ib < nb; ib++) {
-
-        int ma1 = ma1min;
-        int ma2 = ma2max;
-        int icga = ma1min*(j2+1) + ma2max;
-
-        #ifdef LMP_KK_DEVICE_COMPILE
-        #pragma unroll
-        #endif
-        for (int ia = 0; ia < na; ia++) {
-          const auto utot1 = ulisttot_pack(iatom_mod, jju1+ma1, elem1, iatom_div);
-          const auto utot2 = ulisttot_pack(iatom_mod, jju2+ma2, elem2, iatom_div);
-          const auto cgcoeff_a = cgblock[icga];
-          const auto cgcoeff_b = cgblock[icgb];
-          ztmp.re += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.re - utot1.im * utot2.im);
-          ztmp.im += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.im + utot1.im * utot2.re);
-          ma1++;
-          ma2--;
-          icga += j2;
-        } // end loop over ia
-
-        jju1 += j1 + 1;
-        jju2 -= j2 + 1;
-        icgb += j2;
-      } // end loop over ib
-
-      if (bnorm_flag) {
-        ztmp.re /= (j + 1);
-        ztmp.im /= (j + 1);
-      }
-
-      zlist_pack(iatom_mod,jjz,idouble,iatom_div) = ztmp;
+      zlist_pack(iatom_mod,jjz,idouble,iatom_div) = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom_mod, elem1, elem2, iatom_div, cgblock);
 
       idouble++;
     }
@@ -721,8 +722,8 @@ void SNAKokkos::compute_bi(const int& iato
             const int jju_index = jju+mb*(j+1)+ma;
             const int jjz_index = jjz+mb*(j+1)+ma;
             if (2*mb == j) return; // I think we can remove this?
-            const auto utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
-            const auto zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
+            const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
+            const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
             sumzu_temp += utot.re * zloc.re + utot.im * zloc.im;
           }
         }
@@ -737,8 +738,8 @@ void SNAKokkos::compute_bi(const int& iato
             const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma;
             const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma;
 
-            const auto utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
-            const auto zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
+            const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
+            const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
             sumzu_temp += utot.re * zloc.re + utot.im * zloc.im;
 
           }
@@ -748,8 +749,8 @@ void SNAKokkos::compute_bi(const int& iato
           const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma;
           const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma;
 
-          const auto utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
-          const auto zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
+          const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div);
+          const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div);
           sumzu += static_cast(0.5) * (utot.re * zloc.re + utot.im * zloc.im);
         } // end if jeven
 
@@ -785,7 +786,6 @@ KOKKOS_INLINE_FUNCTION
 void SNAKokkos::compute_yi(int iatom_mod, int jjz, int iatom_div,
  const Kokkos::View &beta_pack)
 {
-  real_type betaj;
 
   const int j1 = idxz(jjz, 0);
   const int j2 = idxz(jjz, 1);
@@ -805,46 +805,7 @@ void SNAKokkos::compute_yi(int iatom_mod,
   for (int elem1 = 0; elem1 < nelements; elem1++) {
     for (int elem2 = 0; elem2 < nelements; elem2++) {
 
-      real_type ztmp_r = 0.0;
-      real_type ztmp_i = 0.0;
-
-      int jju1 = idxu_block[j1] + (j1 + 1) * mb1min;
-      int jju2 = idxu_block[j2] + (j2 + 1) * mb2max;
-      int icgb = mb1min * (j2 + 1) + mb2max;
-
-      #ifdef LMP_KK_DEVICE_COMPILE
-      #pragma unroll
-      #endif
-      for (int ib = 0; ib < nb; ib++) {
-
-        int ma1 = ma1min;
-        int ma2 = ma2max;
-        int icga = ma1min*(j2+1) + ma2max;
-
-        #ifdef LMP_KK_DEVICE_COMPILE
-        #pragma unroll
-        #endif
-        for (int ia = 0; ia < na; ia++) {
-          const auto utot1 = ulisttot_pack(iatom_mod,jju1+ma1,elem1,iatom_div);
-          const auto utot2 = ulisttot_pack(iatom_mod,jju2+ma2,elem2,iatom_div);
-          const auto cgcoeff_a = cgblock[icga];
-          const auto cgcoeff_b = cgblock[icgb];
-          ztmp_r += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.re - utot1.im * utot2.im);
-          ztmp_i += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.im + utot1.im * utot2.re);
-          ma1++;
-          ma2--;
-          icga += j2;
-        } // end loop over ia
-
-        jju1 += j1 + 1;
-        jju2 -= j2 + 1;
-        icgb += j2;
-      } // end loop over ib
-
-      if (bnorm_flag) {
-        ztmp_r /= (j + 1);
-        ztmp_i /= (j + 1);
-      }
+      const complex ztmp = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom_mod, elem1, elem2, iatom_div, cgblock);
 
       // apply to z(j1,j2,j,ma,mb) to unique element of y(j)
       // find right y_list[jju] and beta(iatom,jjb) entries
@@ -853,30 +814,11 @@ void SNAKokkos::compute_yi(int iatom_mod,
 
       // pick out right beta value
       for (int elem3 = 0; elem3 < nelements; elem3++) {
-        if (j >= j1) {
-          const int jjb = idxb_block(j1, j2, j);
-          const auto itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb;
-          if (j1 == j) {
-            if (j2 == j) betaj = 3 * beta_pack(iatom_mod, itriple, iatom_div);
-            else betaj = 2 * beta_pack(iatom_mod, itriple, iatom_div);
-          } else betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        } else if (j >= j2) {
-          const int jjb = idxb_block(j, j2, j1);
-          const auto itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb;
-          if (j2 == j) betaj = 2 * beta_pack(iatom_mod, itriple, iatom_div);
-          else betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        } else {
-          const int jjb = idxb_block(j2, j, j1);
-          const auto itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb;
-          betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        }
 
-        if (!bnorm_flag && j1 > j)
-          betaj *= (j1 + 1) / (j + 1.0);
+        const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom_mod, elem1, elem2, elem3, iatom_div, beta_pack);
 
-
-        Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj*ztmp_r);
-        Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj*ztmp_i);
+        Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.re);
+        Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.im);
       } // end loop over elem3
     } // end loop over elem2
   } // end loop over elem1
@@ -893,7 +835,6 @@ KOKKOS_INLINE_FUNCTION
 void SNAKokkos::compute_yi_with_zlist(int iatom_mod, int jjz, int iatom_div,
  const Kokkos::View &beta_pack)
 {
-  real_type betaj;
   const int j1 = idxz(jjz, 0);
   const int j2 = idxz(jjz, 1);
   const int j = idxz(jjz, 2);
@@ -901,49 +842,123 @@ void SNAKokkos::compute_yi_with_zlist(int
   int idouble = 0;
   for (int elem1 = 0; elem1 < nelements; elem1++) {
     for (int elem2 = 0; elem2 < nelements; elem2++) {
-      auto ztmp = zlist_pack(iatom_mod,jjz,idouble,iatom_div);
+      const complex ztmp = zlist_pack(iatom_mod,jjz,idouble,iatom_div);
       // apply to z(j1,j2,j,ma,mb) to unique element of y(j)
       // find right y_list[jju] and beta(iatom,jjb) entries
       // multiply and divide by j+1 factors
       // account for multiplicity of 1, 2, or 3
       // pick out right beta value
       for (int elem3 = 0; elem3 < nelements; elem3++) {
-        if (j >= j1) {
-          const int jjb = idxb_block(j1, j2, j);
-          const auto itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb;
-          if (j1 == j) {
-            if (j2 == j) betaj = 3 * beta_pack(iatom_mod, itriple, iatom_div);
-            else betaj = 2 * beta_pack(iatom_mod, itriple, iatom_div);
-          } else betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        } else if (j >= j2) {
-          const int jjb = idxb_block(j, j2, j1);
-          const auto itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb;
-          if (j2 == j) betaj = 2 * beta_pack(iatom_mod, itriple, iatom_div);
-          else betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        } else {
-          const int jjb = idxb_block(j2, j, j1);
-          const auto itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb;
-          betaj = beta_pack(iatom_mod, itriple, iatom_div);
-        }
-        if (!bnorm_flag && j1 > j)
-          betaj *= (j1 + 1) / (j + 1.0);
-        Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj*ztmp.re);
-        Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj*ztmp.im);
+
+        const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom_mod, elem1, elem2, elem3, iatom_div, beta_pack);
+
+        Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.re);
+        Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.im);
       } // end loop over elem3
       idouble++;
     } // end loop over elem2
   } // end loop over elem1
 }
 
+// Core "evaluation" kernel that computes a single zlist value
+// which gets used in both `compute_zi` and `compute_yi`
+template
+KOKKOS_FORCEINLINE_FUNCTION
+typename SNAKokkos::complex SNAKokkos::evaluate_zi(const int& j1, const int& j2, const int& j,
+        const int& ma1min, const int& ma2max, const int& mb1min, const int& mb2max, const int& na, const int& nb,
+        const int& iatom_mod, const int& elem1, const int& elem2, const int& iatom_div, const real_type* cgblock) {
+
+  complex ztmp = complex::zero();
+
+  int jju1 = idxu_block[j1] + (j1+1)*mb1min;
+  int jju2 = idxu_block[j2] + (j2+1)*mb2max;
+  int icgb = mb1min*(j2+1) + mb2max;
+
+  #ifdef LMP_KK_DEVICE_COMPILE
+  #pragma unroll
+  #endif
+  for (int ib = 0; ib < nb; ib++) {
+
+    int ma1 = ma1min;
+    int ma2 = ma2max;
+    int icga = ma1min*(j2+1) + ma2max;
+
+    #ifdef LMP_KK_DEVICE_COMPILE
+    #pragma unroll
+    #endif
+    for (int ia = 0; ia < na; ia++) {
+      const complex utot1 = ulisttot_pack(iatom_mod, jju1+ma1, elem1, iatom_div);
+      const complex utot2 = ulisttot_pack(iatom_mod, jju2+ma2, elem2, iatom_div);
+      const real_type cgcoeff_a = cgblock[icga];
+      const real_type cgcoeff_b = cgblock[icgb];
+      ztmp.re += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.re - utot1.im * utot2.im);
+      ztmp.im += cgcoeff_a * cgcoeff_b * (utot1.re * utot2.im + utot1.im * utot2.re);
+      ma1++;
+      ma2--;
+      icga += j2;
+    } // end loop over ia
+
+    jju1 += j1 + 1;
+    jju2 -= j2 + 1;
+    icgb += j2;
+  } // end loop over ib
+
+  if (bnorm_flag) {
+    const real_type scale = static_cast(1) / static_cast(j + 1);
+    ztmp.re *= scale;
+    ztmp.im *= scale;
+  }
+
+  return ztmp;
+}
+
+// Core "evaluation" kernel that extracts and rescales the appropriate `beta` value,
+// which gets used in both `compute_yi` and `compute_yi_from_zlist
+template
+KOKKOS_FORCEINLINE_FUNCTION
+typename SNAKokkos::real_type SNAKokkos::evaluate_beta_scaled(const int& j1, const int& j2, const int& j,
+          const int& iatom_mod, const int& elem1, const int& elem2, const int& elem3, const int& iatom_div,
+          const Kokkos::View &beta_pack) {
+
+  real_type betaj = 0;
+
+  if (j >= j1) {
+    const int jjb = idxb_block(j1, j2, j);
+    const int itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb;
+    if (j1 == j) {
+      if (j2 == j) betaj = static_cast(3) * beta_pack(iatom_mod, itriple, iatom_div);
+      else betaj = static_cast(2) * beta_pack(iatom_mod, itriple, iatom_div);
+    } else betaj = beta_pack(iatom_mod, itriple, iatom_div);
+  } else if (j >= j2) {
+    const int jjb = idxb_block(j, j2, j1);
+    const int itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb;
+    if (j2 == j) betaj = static_cast(2) * beta_pack(iatom_mod, itriple, iatom_div);
+    else betaj = beta_pack(iatom_mod, itriple, iatom_div);
+  } else {
+    const int jjb = idxb_block(j2, j, j1);
+    const int itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb;
+    betaj = beta_pack(iatom_mod, itriple, iatom_div);
+  }
+
+  if (!bnorm_flag && j1 > j) {
+    const real_type scale = static_cast(j1 + 1) / static_cast(j + 1);
+    betaj *= scale;
+  }
+
+  return betaj;
+
+}
+
 /* ----------------------------------------------------------------------
    Fused calculation of the derivative of Ui w.r.t. atom j
    and accumulation into dEidRj. GPU only.
 ------------------------------------------------------------------------- */
 
+// Version of the code that exposes additional parallelism by threading over `j_bend` values
 template
 template
 KOKKOS_INLINE_FUNCTION
-void SNAKokkos::compute_fused_deidrj(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div)
+void SNAKokkos::compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div)
 {
   // get shared memory offset
   // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer
@@ -957,157 +972,207 @@ void SNAKokkos::compute_fused_deidrj(const
   WignerWrapper dulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
 
   // load parameters
-  const auto a = a_pack(iatom_mod, jnbor, iatom_div);
-  const auto b = b_pack(iatom_mod, jnbor, iatom_div);
-  const auto da = da_pack(iatom_mod, jnbor, iatom_div, dir);
-  const auto db = db_pack(iatom_mod, jnbor, iatom_div, dir);
-  const auto sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
-  const auto dsfacu = sfac_pack(iatom_mod, jnbor, iatom_div, dir + 1); // dsfac * u
+  const complex a = a_pack(iatom_mod, jnbor, iatom_div);
+  const complex b = b_pack(iatom_mod, jnbor, iatom_div);
+  const complex da = da_pack(iatom_mod, jnbor, iatom_div, dir);
+  const complex db = db_pack(iatom_mod, jnbor, iatom_div, dir);
+  const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
+  const real_type dsfacu = sfac_pack(iatom_mod, jnbor, iatom_div, dir + 1); // dsfac * u
 
   const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor);
 
-  auto dedr_full_sum = static_cast(0.);
-
-  // we need to "choose" when to bend
-  // this for loop is here for context --- we expose additional
-  // parallelism over this loop instead
-  //for (int j_bend = 0; j_bend <= twojmax; j_bend++) {
-
-    // level 0 is just 1, 0
-    ulist_wrapper.set(0, complex::one());
-    dulist_wrapper.set(0, complex::zero());
-
-    // j from before the bend, don't store, mb == 0
-    // this is "creeping up the side"
-    for (int j = 1; j <= j_bend; j++) {
-
-      constexpr int mb = 0; // intentional for readability, compiler should optimize this out
-
-      complex ulist_accum = complex::zero();
-      complex dulist_accum = complex::zero();
-
-      int ma;
-      for (ma = 0; ma < j; ma++) {
-
-        // grab the cached value
-        const complex ulist_prev = ulist_wrapper.get(ma);
-        const complex dulist_prev = dulist_wrapper.get(ma);
-
-        // ulist_accum += rootpq * a.conj() * ulist_prev;
-        real_type rootpq = rootpqarray(j - ma, j - mb);
-        ulist_accum.re += rootpq * (a.re * ulist_prev.re + a.im * ulist_prev.im);
-        ulist_accum.im += rootpq * (a.re * ulist_prev.im - a.im * ulist_prev.re);
-
-        // product rule of above
-        dulist_accum.re += rootpq * (da.re * ulist_prev.re + da.im * ulist_prev.im + a.re * dulist_prev.re + a.im * dulist_prev.im);
-        dulist_accum.im += rootpq * (da.re * ulist_prev.im - da.im * ulist_prev.re + a.re * dulist_prev.im - a.im * dulist_prev.re);
-
-        // store ulist_accum, we atomic accumulate values after the bend, so no atomic add here
-        ulist_wrapper.set(ma, ulist_accum);
-        dulist_wrapper.set(ma, dulist_accum);
-
-        // next value
-        // ulist_accum = -rootpq * b.conj() * ulist_prev;
-        rootpq = rootpqarray(ma + 1, j - mb);
-        ulist_accum.re = -rootpq * (b.re * ulist_prev.re + b.im * ulist_prev.im);
-        ulist_accum.im = -rootpq * (b.re * ulist_prev.im - b.im * ulist_prev.re);
-
-        // product rule of above
-        dulist_accum.re = -rootpq * (db.re * ulist_prev.re + db.im * ulist_prev.im + b.re * dulist_prev.re + b.im * dulist_prev.im);
-        dulist_accum.im = -rootpq * (db.re * ulist_prev.im - db.im * ulist_prev.re + b.re * dulist_prev.im - b.im * dulist_prev.re);
-
-      }
-
-      ulist_wrapper.set(ma, ulist_accum);
-      dulist_wrapper.set(ma, dulist_accum);
-    }
-
-    // now we're after the bend, start storing but only up to the "half way point"
-    const int j_half_way = MIN(2 * j_bend, twojmax);
-
-    int mb = 1;
-    int j; //= j_bend + 1; // need this value below
-    for (j = j_bend + 1; j <= j_half_way; j++) {
-
-      const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
-
-      complex ulist_accum = complex::zero();
-      complex dulist_accum = complex::zero();
-
-      int ma;
-      for (ma = 0; ma < j; ma++) {
-
-        // grab y_local early
-        // this will never be the last element of a row, no need to rescale.
-        auto y_local = complex(ylist_pack_re(iatom_mod, jjup + ma, jelem, iatom_div), ylist_pack_im(iatom_mod, jjup+ma, jelem, iatom_div));
-
-        // grab the cached value
-        const complex ulist_prev = ulist_wrapper.get(ma);
-        const complex dulist_prev = dulist_wrapper.get(ma);
-
-        // ulist_accum += rootpq * b * ulist_prev;
-        real_type rootpq = rootpqarray(j - ma, mb);
-        ulist_accum.re += rootpq * (b.re * ulist_prev.re - b.im * ulist_prev.im);
-        ulist_accum.im += rootpq * (b.re * ulist_prev.im + b.im * ulist_prev.re);
-
-        // product rule of above
-        dulist_accum.re += rootpq * (db.re * ulist_prev.re - db.im * ulist_prev.im + b.re * dulist_prev.re - b.im * dulist_prev.im);
-        dulist_accum.im += rootpq * (db.re * ulist_prev.im + db.im * ulist_prev.re + b.re * dulist_prev.im + b.im * dulist_prev.re);
-
-        // store ulist_accum
-        ulist_wrapper.set(ma, ulist_accum);
-        dulist_wrapper.set(ma, dulist_accum);
-
-        // Directly accumulate deidrj into sum_tmp
-        const complex du_prod = (dsfacu * ulist_prev) + (sfac * dulist_prev);
-        dedr_full_sum += du_prod.re * y_local.re + du_prod.im * y_local.im;
-
-        // next value
-        // ulist_accum = rootpq * a * ulist_prev;
-        rootpq = rootpqarray(ma + 1, mb);
-        ulist_accum.re = rootpq * (a.re * ulist_prev.re - a.im * ulist_prev.im);
-        ulist_accum.im = rootpq * (a.re * ulist_prev.im + a.im * ulist_prev.re);
-
-        // product rule of above
-        dulist_accum.re = rootpq * (da.re * ulist_prev.re - da.im * ulist_prev.im + a.re * dulist_prev.re - a.im * dulist_prev.im);
-        dulist_accum.im = rootpq * (da.re * ulist_prev.im + da.im * ulist_prev.re + a.re * dulist_prev.im + a.im * dulist_prev.re);
-
-      }
-
-      ulist_wrapper.set(ma, ulist_accum);
-      dulist_wrapper.set(ma, dulist_accum);
-
-      mb++;
-    }
-
-    // accumulate the last level
-    const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
-
-    for (int ma = 0; ma < j; ma++) {
-      // grab y_local early
-      auto y_local = complex(ylist_pack_re(iatom_mod, jjup + ma, jelem, iatom_div), ylist_pack_im(iatom_mod, jjup+ma, jelem, iatom_div));
-      if (j % 2 == 1 && 2*(mb-1) == j-1) { // double check me...
-        if (ma == (mb-1)) { y_local = static_cast(0.5)*y_local; }
-        else if (ma > (mb-1)) { y_local.re = static_cast(0.); y_local.im = static_cast(0.); } // can probably avoid this outright
-        // else the ma < mb gets "double counted", cancelling the 0.5.
-      }
-
-      const complex ulist_prev = ulist_wrapper.get(ma);
-      const complex dulist_prev = dulist_wrapper.get(ma);
-
-      // Directly accumulate deidrj into sum_tmp
-      const complex du_prod = (dsfacu * ulist_prev) + (sfac * dulist_prev);
-      dedr_full_sum += du_prod.re * y_local.re + du_prod.im * y_local.im;
-
-    }
-  //} // end reference loop over j_bend
+  // compute the contribution to dedr_full_sum for one "bend" location
+  const real_type dedr_full_sum = evaluate_duidrj_jbend(ulist_wrapper, a, b, sfac, dulist_wrapper, da, db, dsfacu,
+                                                       jelem, iatom_mod, j_bend, iatom_div);
 
   // dedr gets zeroed out at the start of each iteration in compute_cayley_klein
   Kokkos::atomic_add(&(dedr(iatom_mod + vector_length * iatom_div, jnbor, dir)), static_cast(2.0) * dedr_full_sum);
 
 }
 
+// Version of the code that loops over all `j_bend` values which reduces integer arithmetic
+// and some amount of load imbalance, at the expense of reducing parallelism
+template
+template
+KOKKOS_INLINE_FUNCTION
+void SNAKokkos::compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div)
+{
+  // get shared memory offset
+  // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer
+  const int tile_size = vector_length * (twojmax + 1);
 
+  const int team_rank = team.team_rank();
+  const int scratch_shift = team_rank * tile_size;
+
+  // extract, wrap shared memory buffer
+  WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
+  WignerWrapper dulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod);
+
+  // load parameters
+  const complex a = a_pack(iatom_mod, jnbor, iatom_div);
+  const complex b = b_pack(iatom_mod, jnbor, iatom_div);
+  const complex da = da_pack(iatom_mod, jnbor, iatom_div, dir);
+  const complex db = db_pack(iatom_mod, jnbor, iatom_div, dir);
+  const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0);
+  const real_type dsfacu = sfac_pack(iatom_mod, jnbor, iatom_div, dir + 1); // dsfac * u
+
+  const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor);
+
+  // compute the contributions to dedr_full_sum for all "bend" locations
+  real_type dedr_full_sum = static_cast(0);
+  #ifdef LMP_KK_DEVICE_COMPILE
+  #pragma unroll
+  #endif
+  for (int j_bend = 0; j_bend <= twojmax; j_bend++) {
+    dedr_full_sum += evaluate_duidrj_jbend(ulist_wrapper, a, b, sfac, dulist_wrapper, da, db, dsfacu,
+                                          jelem, iatom_mod, j_bend, iatom_div);
+  }
+
+  // there's one thread per atom, neighbor pair, so no need to make this atomic
+  dedr(iatom_mod + vector_length * iatom_div, jnbor, dir) = static_cast(2.0) * dedr_full_sum;
+
+}
+
+// Core "evaluation" kernel that gets reused in `compute_fused_deidrj_small` and
+// `compute_fused_deidrj_large`
+template
+KOKKOS_FORCEINLINE_FUNCTION
+typename SNAKokkos::real_type SNAKokkos::evaluate_duidrj_jbend(const WignerWrapper& ulist_wrapper, const complex& a, const complex& b, const real_type& sfac,
+                      const WignerWrapper& dulist_wrapper, const complex& da, const complex& db, const real_type& dsfacu,
+                      const int& jelem, const int& iatom_mod, const int& j_bend, const int& iatom_div) {
+
+  real_type dedr_full_sum = static_cast(0);
+
+  // level 0 is just 1, 0
+  ulist_wrapper.set(0, complex::one());
+  dulist_wrapper.set(0, complex::zero());
+
+  // j from before the bend, don't store, mb == 0
+  // this is "creeping up the side"
+  for (int j = 1; j <= j_bend; j++) {
+
+    constexpr int mb = 0; // intentional for readability, compiler should optimize this out
+
+    complex ulist_accum = complex::zero();
+    complex dulist_accum = complex::zero();
+
+    int ma;
+    for (ma = 0; ma < j; ma++) {
+
+      // grab the cached value
+      const complex ulist_prev = ulist_wrapper.get(ma);
+      const complex dulist_prev = dulist_wrapper.get(ma);
+
+      // ulist_accum += rootpq * a.conj() * ulist_prev;
+      real_type rootpq = rootpqarray(j - ma, j - mb);
+      ulist_accum.re += rootpq * (a.re * ulist_prev.re + a.im * ulist_prev.im);
+      ulist_accum.im += rootpq * (a.re * ulist_prev.im - a.im * ulist_prev.re);
+
+      // product rule of above
+      dulist_accum.re += rootpq * (da.re * ulist_prev.re + da.im * ulist_prev.im + a.re * dulist_prev.re + a.im * dulist_prev.im);
+      dulist_accum.im += rootpq * (da.re * ulist_prev.im - da.im * ulist_prev.re + a.re * dulist_prev.im - a.im * dulist_prev.re);
+
+      // store ulist_accum, we atomic accumulate values after the bend, so no atomic add here
+      ulist_wrapper.set(ma, ulist_accum);
+      dulist_wrapper.set(ma, dulist_accum);
+
+      // next value
+      // ulist_accum = -rootpq * b.conj() * ulist_prev;
+      rootpq = rootpqarray(ma + 1, j - mb);
+      ulist_accum.re = -rootpq * (b.re * ulist_prev.re + b.im * ulist_prev.im);
+      ulist_accum.im = -rootpq * (b.re * ulist_prev.im - b.im * ulist_prev.re);
+
+      // product rule of above
+      dulist_accum.re = -rootpq * (db.re * ulist_prev.re + db.im * ulist_prev.im + b.re * dulist_prev.re + b.im * dulist_prev.im);
+      dulist_accum.im = -rootpq * (db.re * ulist_prev.im - db.im * ulist_prev.re + b.re * dulist_prev.im - b.im * dulist_prev.re);
+
+    }
+
+    ulist_wrapper.set(ma, ulist_accum);
+    dulist_wrapper.set(ma, dulist_accum);
+  }
+
+  // now we're after the bend, start storing but only up to the "half way point"
+  const int j_half_way = MIN(2 * j_bend, twojmax);
+
+  int mb = 1;
+  int j; //= j_bend + 1; // need this value below
+  for (j = j_bend + 1; j <= j_half_way; j++) {
+
+    const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
+
+    complex ulist_accum = complex::zero();
+    complex dulist_accum = complex::zero();
+
+    int ma;
+    for (ma = 0; ma < j; ma++) {
+
+      // grab y_local early
+      // this will never be the last element of a row, no need to rescale.
+      complex y_local = complex(ylist_pack_re(iatom_mod, jjup + ma, jelem, iatom_div), ylist_pack_im(iatom_mod, jjup+ma, jelem, iatom_div));
+
+      // grab the cached value
+      const complex ulist_prev = ulist_wrapper.get(ma);
+      const complex dulist_prev = dulist_wrapper.get(ma);
+
+      // ulist_accum += rootpq * b * ulist_prev;
+      real_type rootpq = rootpqarray(j - ma, mb);
+      ulist_accum.re += rootpq * (b.re * ulist_prev.re - b.im * ulist_prev.im);
+      ulist_accum.im += rootpq * (b.re * ulist_prev.im + b.im * ulist_prev.re);
+
+      // product rule of above
+      dulist_accum.re += rootpq * (db.re * ulist_prev.re - db.im * ulist_prev.im + b.re * dulist_prev.re - b.im * dulist_prev.im);
+      dulist_accum.im += rootpq * (db.re * ulist_prev.im + db.im * ulist_prev.re + b.re * dulist_prev.im + b.im * dulist_prev.re);
+
+      // store ulist_accum
+      ulist_wrapper.set(ma, ulist_accum);
+      dulist_wrapper.set(ma, dulist_accum);
+
+      // Directly accumulate deidrj into sum_tmp
+      const complex du_prod = (dsfacu * ulist_prev) + (sfac * dulist_prev);
+      dedr_full_sum += du_prod.re * y_local.re + du_prod.im * y_local.im;
+
+      // next value
+      // ulist_accum = rootpq * a * ulist_prev;
+      rootpq = rootpqarray(ma + 1, mb);
+      ulist_accum.re = rootpq * (a.re * ulist_prev.re - a.im * ulist_prev.im);
+      ulist_accum.im = rootpq * (a.re * ulist_prev.im + a.im * ulist_prev.re);
+
+      // product rule of above
+      dulist_accum.re = rootpq * (da.re * ulist_prev.re - da.im * ulist_prev.im + a.re * dulist_prev.re - a.im * dulist_prev.im);
+      dulist_accum.im = rootpq * (da.re * ulist_prev.im + da.im * ulist_prev.re + a.re * dulist_prev.im + a.im * dulist_prev.re);
+
+    }
+
+    ulist_wrapper.set(ma, ulist_accum);
+    dulist_wrapper.set(ma, dulist_accum);
+
+    mb++;
+  }
+
+  // accumulate the last level
+  const int jjup = idxu_half_block[j-1] + (mb - 1) * j;
+
+  for (int ma = 0; ma < j; ma++) {
+    // grab y_local early
+    complex y_local = complex(ylist_pack_re(iatom_mod, jjup + ma, jelem, iatom_div), ylist_pack_im(iatom_mod, jjup+ma, jelem, iatom_div));
+    if (j % 2 == 1 && 2*(mb-1) == j-1) { // double check me...
+      if (ma == (mb-1)) { y_local = static_cast(0.5)*y_local; }
+      else if (ma > (mb-1)) { y_local.re = static_cast(0.); y_local.im = static_cast(0.); } // can probably avoid this outright
+      // else the ma < mb gets "double counted", cancelling the 0.5.
+    }
+
+    const complex ulist_prev = ulist_wrapper.get(ma);
+    const complex dulist_prev = dulist_wrapper.get(ma);
+
+    // Directly accumulate deidrj into sum_tmp
+    const complex du_prod = (dsfacu * ulist_prev) + (sfac * dulist_prev);
+    dedr_full_sum += du_prod.re * y_local.re + du_prod.im * y_local.im;
+
+  }
+
+  return dedr_full_sum;
+}
 
 /* ----------------------------------------------------------------------
  * CPU routines
@@ -1238,8 +1303,9 @@ void SNAKokkos::compute_zi_cpu(const int&
       } // end loop over ib
 
       if (bnorm_flag) {
-        zlist(jjz, idouble, iatom).re /= (j+1);
-        zlist(jjz, idouble, iatom).im /= (j+1);
+        const real_type scale = static_cast(1) / static_cast(j + 1);
+        zlist(jjz, idouble, iatom).re *= scale;
+        zlist(jjz, idouble, iatom).im *= scale;
       }
       idouble++;
     } // end loop over elem2
@@ -1268,7 +1334,7 @@ void SNAKokkos::compute_bi_cpu(const typen
   int idouble = 0;
   for (int elem1 = 0; elem1 < nelements; elem1++) {
     for (int elem2 = 0; elem2 < nelements; elem2++) {
-      auto jalloy = idouble; // must be non-const to work around gcc compiler bug
+      int jalloy = idouble; // must be non-const to work around gcc compiler bug
       for (int elem3 = 0; elem3 < nelements; elem3++) {
         Kokkos::parallel_for(Kokkos::TeamThreadRange(team,idxb_max),
           [&] (const int& jjb) {
@@ -1331,7 +1397,7 @@ void SNAKokkos::compute_bi_cpu(const typen
               }
             }
 
-            blist(jjb, itriple, iatom) = sumzu;
+            blist(iatom, itriple, jjb) = sumzu;
           });
         });
           //} // end loop over j
@@ -1410,8 +1476,9 @@ void SNAKokkos::compute_yi_cpu(int iter,
       } // end loop over ib
 
       if (bnorm_flag) {
-        ztmp_i /= j + 1;
-        ztmp_r /= j + 1;
+        const real_type scale = static_cast(1) / static_cast(j + 1);
+        ztmp_i *= scale;
+        ztmp_r *= scale;
       }
 
       // apply to z(j1,j2,j,ma,mb) to unique element of y(j)
@@ -1424,24 +1491,24 @@ void SNAKokkos::compute_yi_cpu(int iter,
 
         if (j >= j1) {
           const int jjb = idxb_block(j1, j2, j);
-          const auto itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb;
+          const int itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb;
           if (j1 == j) {
             if (j2 == j) betaj = 3 * beta(itriple, iatom);
             else betaj = 2 * beta(itriple, iatom);
           } else betaj = beta(itriple, iatom);
         } else if (j >= j2) {
           const int jjb = idxb_block(j, j2, j1);
-          const auto itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb;
+          const int itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb;
           if (j2 == j) betaj = 2 * beta(itriple, iatom);
           else betaj = beta(itriple, iatom);
         } else {
           const int jjb = idxb_block(j2, j, j1);
-          const auto itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb;
+          const int itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb;
           betaj = beta(itriple, iatom);
         }
 
         if (!bnorm_flag && j1 > j)
-          betaj *= (j1 + 1) / (j + 1.0);
+          betaj *= static_cast(j1 + 1) / static_cast(j + 1);
 
         Kokkos::atomic_add(&(ylist(jju_half, elem3, iatom).re), betaj*ztmp_r);
         Kokkos::atomic_add(&(ylist(jju_half, elem3, iatom).im), betaj*ztmp_i);
@@ -1469,9 +1536,10 @@ void SNAKokkos::compute_duidrj_cpu(const t
   z = rij(iatom,jnbor,2);
   rsq = x * x + y * y + z * z;
   r = sqrt(rsq);
-  auto rscale0 = rfac0 * static_cast(MY_PI) / (rcutij(iatom,jnbor) - rmin0);
+  real_type rscale0 = rfac0 * static_cast(MY_PI) / (rcutij(iatom,jnbor) - rmin0);
   theta0 = (r - rmin0) * rscale0;
-  sincos_wrapper(theta0, &sn, &cs);
+  sn = sin(theta0);
+  cs = cos(theta0);
   z0 = r * cs / sn;
   dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq;
 
@@ -1559,7 +1627,7 @@ KOKKOS_INLINE_FUNCTION
 void SNAKokkos::add_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor,
                                           const real_type& r, const real_type& wj, const real_type& rcut, int jelem)
 {
-  const auto sfac = compute_sfac(r, rcut) * wj;
+  const real_type sfac = compute_sfac(r, rcut) * wj;
 
   Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,twojmax+1),
       [&] (const int& j) {
@@ -2168,7 +2236,7 @@ real_type SNAKokkos::compute_sfac(real_typ
     if (r <= rmin0) return one;
     else if (r > rcut) return zero;
     else {
-      auto rcutfac = static_cast(MY_PI) / (rcut - rmin0);
+      real_type rcutfac = static_cast(MY_PI) / (rcut - rmin0);
       return onehalf * (cos((r - rmin0) * rcutfac) + one);
     }
   }
@@ -2188,7 +2256,7 @@ real_type SNAKokkos::compute_dsfac(real_ty
     if (r <= rmin0) return zero;
     else if (r > rcut) return zero;
     else {
-      auto rcutfac = static_cast(MY_PI) / (rcut - rmin0);
+      real_type rcutfac = static_cast(MY_PI) / (rcut - rmin0);
       return -onehalf * sin((r - rmin0) * rcutfac) * rcutfac;
     }
   }
@@ -2206,9 +2274,10 @@ void SNAKokkos::compute_s_dsfac(const real
     if (r <= rmin0) { sfac = one; dsfac = zero; }
     else if (r > rcut) { sfac = zero; dsfac = zero; }
     else {
-      const auto rcutfac = static_cast(MY_PI) / (rcut - rmin0);
-      real_type sn, cs;
-      sincos_wrapper((r - rmin0) * rcutfac, &sn, &cs); // need to create a wrapper
+      const real_type rcutfac = static_cast(MY_PI) / (rcut - rmin0);
+      const real_type theta0 = (r - rmin0) * rcutfac;
+      const real_type sn = sin(theta0);
+      const real_type cs = cos(theta0);
       sfac = onehalf * (cs + one);
       dsfac = -onehalf * sn * rcutfac;
 

From 7ac2c0c66e865d403a029f427e69515209b6db51 Mon Sep 17 00:00:00 2001
From: Jacob Gissinger 
Date: Thu, 26 Aug 2021 23:00:15 -0400
Subject: [PATCH 160/437] refactor custom constraint

evaluates per-atom variables once, and correctly communicates values to ghosts
---
 src/REACTION/fix_bond_react.cpp | 150 +++++++++++++++++++++++++++-----
 src/REACTION/fix_bond_react.h   |  12 ++-
 2 files changed, 138 insertions(+), 24 deletions(-)

diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp
index bb245f0ee3..60d040c8c9 100644
--- a/src/REACTION/fix_bond_react.cpp
+++ b/src/REACTION/fix_bond_react.cpp
@@ -140,6 +140,7 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) :
   rxnfunclist[0] = "rxnsum";
   rxnfunclist[1] = "rxnave";
   nvvec = 0;
+  ncustomvars = 0;
   vvec = nullptr;
 
   nxspecial = nullptr;
@@ -487,6 +488,9 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) :
     if (custom_charges_fragid[i] >= 0) CustomCharges(custom_charges_fragid[i],i);
   }
 
+  // get the names of per-atom variables needed by 'rxn' functions of custom constraint
+  customvarnames();
+
   // initialize Marsaglia RNG with processor-unique seed (Arrhenius prob)
 
   rrhandom = new RanMars*[narrhenius];
@@ -1018,6 +1022,11 @@ void FixBondReact::post_integrate()
     return;
   }
 
+  // evaluate custom constraint variable values here and forward_comm
+  get_customvars();
+  commflag = 1;
+  comm->forward_comm_fix(this,ncustomvars);
+
   // run through the superimpose algorithm
   // this checks if simulation topology matches unreacted mol template
   superimpose_algorithm();
@@ -2084,6 +2093,100 @@ double FixBondReact::get_temperature(tagint **myglove, int row_offset, int col)
   return t;
 }
 
+/* ----------------------------------------------------------------------
+get per-atom variable names used by  custom constraint
+------------------------------------------------------------------------- */
+
+void FixBondReact::customvarnames()
+{
+  int pos,pos1,pos2,pos3,prev3;
+  std::string varstr,argstr,varid;
+
+  // search all constraints' varstr for special 'rxn' functions
+  //   add variable names to customvarstrs
+  //   add values to customvars
+
+  for (rxnID = 0; rxnID < nreacts; rxnID++) {
+    for (int i = 0; i < nconstraints[rxnID]; i++) {
+      if (constraints[i][rxnID].type == CUSTOM) {
+        varstr = constraints[i][rxnID].str;
+        prev3 = -1;
+        while (true) {
+          // find next reaction special function occurrence
+          pos1 = INT_MAX;
+          for (int i = 0; i < nrxnfunction; i++) {
+            pos = varstr.find(rxnfunclist[i],prev3+1);
+            if (pos == std::string::npos) continue;
+            if (pos < pos1) pos1 = pos;
+          }
+          if (pos1 == INT_MAX) break;
+
+          pos2 = varstr.find("(",pos1);
+          pos3 = varstr.find(")",pos2);
+          if (pos2 == std::string::npos || pos3 == std::string::npos)
+            error->one(FLERR,"Bond/react: Illegal rxn function syntax\n");
+          prev3 = pos3;
+          argstr = varstr.substr(pos2+1,pos3-pos2-1);
+          argstr.erase(remove_if(argstr.begin(), argstr.end(), isspace), argstr.end()); // remove whitespace
+          pos2 = argstr.find(",");
+          if (pos2 != std::string::npos) varid = argstr.substr(0,pos2);
+          else varid = argstr;
+          // check if we already know about this variable
+          int varidflag = 0;
+          for (int j = 0; j < ncustomvars; j++) {
+            if (customvarstrs[j] == varid) {
+              varidflag = 1;
+              break;
+            }
+          }
+          if (!varidflag) {
+            customvarstrs.resize(ncustomvars+1);
+            customvarstrs[ncustomvars++] = varid;
+          }
+        }
+      }
+    }
+  }
+}
+
+/* ----------------------------------------------------------------------
+evaluate per-atom variables needed for custom constraint
+------------------------------------------------------------------------- */
+
+void FixBondReact::get_customvars()
+{
+  double *tempvvec;
+  std::string varid;
+  int nall = atom->nlocal + atom->nghost;
+
+  memory->create(tempvvec,nall,"bond/react:tempvvec");
+  if (vvec == nullptr) {
+    memory->create(vvec,nall,ncustomvars,"bond/react:vvec");
+    nvvec = nall;
+  }
+  if (nvvec < nall) {
+    memory->grow(vvec,nall,ncustomvars,"bond/react:vvec");
+    nvvec = nall;
+  }
+  for (int i = 0; i < ncustomvars; i++) {
+    varid = customvarstrs[i];
+    if (varid.substr(0,2) != "v_") error->one(FLERR,"Bond/react: Reaction special function variable "
+                                     "name should begin with 'v_'");
+    varid = varid.substr(2);
+    int ivar = input->variable->find(varid.c_str());
+    if (ivar < 0)
+      error->one(FLERR,"Bond/react: Reaction special function variable "
+                                   "name does not exist");
+    if (!input->variable->atomstyle(ivar))
+      error->one(FLERR,"Bond/react: Reaction special function must "
+                                   "reference an atom-style variable");
+
+    input->variable->compute_atom(ivar,igroup,tempvvec,1,0);
+    for (int j = 0; j < nall; j++) vvec[j][i] = tempvvec[j];
+  }
+  memory->destroy(tempvvec);
+}
+
 /* ----------------------------------------------------------------------
 evaulate expression for variable constraint
 ------------------------------------------------------------------------- */
@@ -2144,25 +2247,19 @@ currently two 'rxn' functions: rxnsum and rxnave
 double FixBondReact::rxnfunction(std::string rxnfunc, std::string varid,
                                  std::string fragid)
 {
-  if (varid.substr(0,2) != "v_") error->one(FLERR,"Bond/react: Reaction special function variable "
-                                   "name should begin with 'v_'");
-  varid = varid.substr(2);
-  int ivar = input->variable->find(varid.c_str());
+  int ivar = -1;
+  for (int i = 0; i < ncustomvars; i++) {
+    if (varid == customvarstrs[i]) {
+      ivar = i;
+      break;
+    }
+  }
+  // variable name should always be found, at this point
+  // however, let's double check for completeness
   if (ivar < 0)
     error->one(FLERR,"Bond/react: Reaction special function variable "
                                  "name does not exist");
-  if (!input->variable->atomstyle(ivar))
-    error->one(FLERR,"Bond/react: Reaction special function must "
-                                 "reference an atom-style variable");
-  if (vvec == nullptr) {
-    memory->create(vvec,atom->nlocal,"bond/react:vvec");
-    nvvec = atom->nlocal;
-  }
-  if (nvvec < atom->nlocal) {
-    memory->grow(vvec,atom->nlocal,"bond/react:vvec");
-    nvvec = atom->nlocal;
-  }
-  input->variable->compute_atom(ivar,igroup,vvec,1,0);
+
   int ifrag = -1;
   if (fragid != "all") {
     ifrag = onemol->findfragment(fragid.c_str());
@@ -2177,14 +2274,14 @@ double FixBondReact::rxnfunction(std::string rxnfunc, std::string varid,
     if (fragid == "all") {
       for (int i = 0; i < onemol->natoms; i++) {
         iatom = atom->map(glove[i][1]);
-        sumvvec += vvec[iatom];
+        sumvvec += vvec[iatom][ivar];
       }
       nsum = onemol->natoms;
     } else {
       for (int i = 0; i < onemol->natoms; i++) {
         if (onemol->fragmentmask[ifrag][i]) {
           iatom = atom->map(glove[i][1]);
-          sumvvec += vvec[iatom];
+          sumvvec += vvec[iatom][ivar];
           nsum++;
         }
       }
@@ -4040,6 +4137,15 @@ int FixBondReact::pack_forward_comm(int n, int *list, double *buf,
 
   m = 0;
 
+  if (commflag == 1) {
+    for (i = 0; i < n; i++) {
+      j = list[i];
+      for (k = 0; k < ncustomvars; k++)
+        buf[m++] = vvec[j][k];
+    }
+    return m;
+  }
+
   if (commflag == 2) {
     for (i = 0; i < n; i++) {
       j = list[i];
@@ -4064,12 +4170,16 @@ int FixBondReact::pack_forward_comm(int n, int *list, double *buf,
 
 void FixBondReact::unpack_forward_comm(int n, int first, double *buf)
 {
-  int i,j,m,ns,last;
+  int i,j,k,m,ns,last;
 
   m = 0;
   last = first + n;
 
-  if (commflag == 2) {
+  if (commflag == 1) {
+    for (i = first; i < last; i++)
+      for (k = 0; k < ncustomvars; k++)
+        vvec[i][k] = buf[m++];
+  } else if (commflag == 2) {
     for (i = first; i < last; i++)
       partner[i] = (tagint) ubuf(buf[m++]).i;
   } else {
diff --git a/src/REACTION/fix_bond_react.h b/src/REACTION/fix_bond_react.h
index d2bd1be9fd..097133cb00 100644
--- a/src/REACTION/fix_bond_react.h
+++ b/src/REACTION/fix_bond_react.h
@@ -139,8 +139,6 @@ class FixBondReact : public Fix {
   int **delete_atoms;        // atoms in pre-reacted templates to delete
   int **create_atoms;        // atoms in post-reacted templates to create
   int ***chiral_atoms;    // pre-react chiral atoms. 1) flag 2) orientation 3-4) ordered atom types
-  int nvvec;
-  double *vvec;    // per-atom vector to store variable constraint atom-style variable values
 
   int **nxspecial, **onemol_nxspecial, **twomol_nxspecial;    // full number of 1-4 neighbors
   tagint **xspecial, **onemol_xspecial, **twomol_xspecial;    // full 1-4 neighbor list
@@ -178,8 +176,10 @@ class FixBondReact : public Fix {
   int check_constraints();
   void get_IDcoords(int, int, double *);
   double get_temperature(tagint **, int, int);
-  double custom_constraint(std::string);
-  double rxnfunction(std::string, std::string, std::string);
+  void customvarnames();   // get per-atom variables names used by custom constraint
+  void get_customvars();   // evaluate local values for variables names used by custom constraint
+  double custom_constraint(std::string);   // evaulate expression for custom constraint
+  double rxnfunction(std::string, std::string, std::string);   // eval rxn_sum and rxn_ave
   int get_chirality(double[12]);    // get handedness given an ordered set of coordinates
 
   void open(char *);
@@ -214,6 +214,10 @@ class FixBondReact : public Fix {
     double par[MAXCONPAR];
     std::string str;
   };
+  int ncustomvars;
+  std::vector customvarstrs;
+  int nvvec;
+  double **vvec;    // per-atom vector to store variable constraint atom-style variable values
   std::vector> constraints;
 
   // DEBUG

From cfaa3040ed7f66cd60866b94d7fc37fb1590707b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 10:02:53 -0400
Subject: [PATCH 161/437] add a comment explaining the restriction to C and H
 elements in AIREBO/REBO

---
 doc/src/pair_airebo.rst | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/doc/src/pair_airebo.rst b/doc/src/pair_airebo.rst
index 28d7811f06..b250064476 100644
--- a/doc/src/pair_airebo.rst
+++ b/doc/src/pair_airebo.rst
@@ -229,6 +229,11 @@ but you would need to create your own AIREBO or AIREBO-M potential file
 with coefficients listed in the appropriate units, if your simulation
 does not use "metal" units.
 
+The pair styles provided here **only** support potential files parameterized
+for the elements carbon and hydrogen (designated with "C" and "H" in the
+*pair_coeff* command.  Using potential files for other elements will trigger
+an error.
+
 Related commands
 """"""""""""""""
 

From 1970ede534c3a018ee40ccb6502c1a4e7122fbe3 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 10:22:10 -0400
Subject: [PATCH 162/437] Add user-settable threshold for extra parallelism

---
 src/KOKKOS/pair_snap_kokkos_impl.h | 4 ++--
 src/ML-SNAP/pair_snap.cpp          | 3 +++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h
index 983a85c6bd..e66f490f8a 100644
--- a/src/KOKKOS/pair_snap_kokkos_impl.h
+++ b/src/KOKKOS/pair_snap_kokkos_impl.h
@@ -345,7 +345,7 @@ void PairSNAPKokkos::compute(int eflag_in,
         const int tile_size = vector_length * (twojmax + 1);
         const int scratch_size = scratch_size_helper(team_size_compute_ui * tile_size);
 
-        if (chunk_size < 16384)
+        if (chunk_size < parallel_thresh)
         {
           // Version with parallelism over j_bend
 
@@ -426,7 +426,7 @@ void PairSNAPKokkos::compute(int eflag_in,
         const int tile_size = vector_length * (twojmax + 1);
         const int scratch_size = scratch_size_helper(2 * team_size_compute_fused_deidrj * tile_size);
 
-        if (chunk_size < 16384)
+        if (chunk_size < parallel_thresh)
         {
           // Version with parallelism over j_bend
 
diff --git a/src/ML-SNAP/pair_snap.cpp b/src/ML-SNAP/pair_snap.cpp
index dd023e096c..78019e7048 100644
--- a/src/ML-SNAP/pair_snap.cpp
+++ b/src/ML-SNAP/pair_snap.cpp
@@ -629,6 +629,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename)
   bnormflag = 0;
   wselfallflag = 0;
   chunksize = 4096;
+  parallel_thresh = 8192;
 
   // open SNAP parameter file on proc 0
 
@@ -696,6 +697,8 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename)
       wselfallflag = utils::inumeric(FLERR,keyval.c_str(),false,lmp);
     else if (keywd == "chunksize")
       chunksize = utils::inumeric(FLERR,keyval.c_str(),false,lmp);
+    else if (keywd == "parallelthresh")
+      parallel_thresh = utils::inumeric(FLERR,keyval.c_str(),false,lmp);
     else
       error->all(FLERR,"Unknown parameter '{}' in SNAP "
                                    "parameter file", keywd);

From ecba2d8489e9e0d90f62dd52c001996ea60f75cb Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 10:33:18 -0400
Subject: [PATCH 163/437] Update doc page

---
 doc/src/pair_snap.rst | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst
index 381250f57b..b6ba82f64b 100644
--- a/doc/src/pair_snap.rst
+++ b/doc/src/pair_snap.rst
@@ -135,7 +135,7 @@ with #) anywhere. Each non-blank non-comment line must contain one
 keyword/value pair. The required keywords are *rcutfac* and
 *twojmax*\ . Optional keywords are *rfac0*, *rmin0*,
 *switchflag*, *bzeroflag*, *quadraticflag*, *chemflag*,
-*bnormflag*, *wselfallflag*, and *chunksize*\ .
+*bnormflag*, *wselfallflag*, *chunksize*, and *parallelthresh*\ .
 
 The default values for these keywords are
 
@@ -148,6 +148,7 @@ The default values for these keywords are
 * *bnormflag* = 0
 * *wselfallflag* = 0
 * *chunksize* = 4096
+* *parallelthresh* = 8192
 
 If *quadraticflag* is set to 1, then the SNAP energy expression includes
 additional quadratic terms that have been shown to increase the overall
@@ -188,14 +189,21 @@ corresponding *K*-vector of linear coefficients for element
 which must equal the number of unique elements appearing in the LAMMPS
 pair_coeff command, to avoid ambiguity in the number of coefficients.
 
-The keyword *chunksize* is only applicable when using the
-pair style *snap* with the KOKKOS package and is ignored otherwise.
-This keyword controls
+The keywords *chunksize* and *parallelthresh* are only applicable when using the
+pair style *snap* with the KOKKOS package and are ignored otherwise.
+The *chunksize* keyword controls
 the number of atoms in each pass used to compute the bispectrum
 components and is used to avoid running out of memory. For example
 if there are 8192 atoms in the simulation and the *chunksize*
 is set to 4096, the bispectrum calculation will be broken up
 into two passes.
+The *parallelthresh* keyword controls
+a crossover threshold for performing extra parallelism. For
+small systems, exposing additional parallism can be beneficial when
+there is not enough work to fully saturate the GPU threads otherwise.
+However, the extra parallelism also leads to more thread divergence
+and can hurt performance when the system is already large enough to
+saturate the GPU threads.
 
 Detailed definitions for all the other keywords
 are given on the :doc:`compute sna/atom ` doc page.

From 27cabbf7344169d0dcfb01de4f6b9baa825ca802 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 10:38:47 -0400
Subject: [PATCH 164/437] Add missing variable

---
 src/ML-SNAP/pair_snap.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ML-SNAP/pair_snap.h b/src/ML-SNAP/pair_snap.h
index af24685ec1..9b07282462 100644
--- a/src/ML-SNAP/pair_snap.h
+++ b/src/ML-SNAP/pair_snap.h
@@ -59,7 +59,7 @@ class PairSNAP : public Pair {
   double **scale;         // for thermodynamic integration
   int twojmax, switchflag, bzeroflag, bnormflag;
   int chemflag, wselfallflag;
-  int chunksize;
+  int chunksize,parallel_thresh;
   double rfac0, rmin0, wj1, wj2;
   int rcutfacflag, twojmaxflag;    // flags for required parameters
   int beta_max;                    // length of beta

From aa9f337ef5ccb1c29636745fbe2f475495536506 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 10:47:11 -0400
Subject: [PATCH 165/437] Small tweak to docs

---
 doc/src/pair_snap.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst
index b6ba82f64b..ecfbf773c4 100644
--- a/doc/src/pair_snap.rst
+++ b/doc/src/pair_snap.rst
@@ -201,7 +201,7 @@ The *parallelthresh* keyword controls
 a crossover threshold for performing extra parallelism. For
 small systems, exposing additional parallism can be beneficial when
 there is not enough work to fully saturate the GPU threads otherwise.
-However, the extra parallelism also leads to more thread divergence
+However, the extra parallelism also leads to more divergence
 and can hurt performance when the system is already large enough to
 saturate the GPU threads.
 

From 89b4cc94984adc1154b578de08a2b90efec330d3 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 11:03:54 -0400
Subject: [PATCH 166/437] Remove comment

---
 src/KOKKOS/sna_kokkos_impl.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h
index 9b9e74dc2a..550548df55 100644
--- a/src/KOKKOS/sna_kokkos_impl.h
+++ b/src/KOKKOS/sna_kokkos_impl.h
@@ -508,8 +508,6 @@ void SNAKokkos::compute_ui_small(const typ
   // parallelism over this loop instead
   //for (int j_bend = 0; j_bend <= twojmax; j_bend++) {
   evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom_mod, j_bend, iatom_div);
-  //} // end of "reference" loop over j_bend
-
 }
 
 // Version of the code that loops over all `j_bend` values which reduces integer arithmetic

From 4089d7757d2a7f2950074d1366783acc7536799a Mon Sep 17 00:00:00 2001
From: Jacob Gissinger 
Date: Fri, 27 Aug 2021 11:24:04 -0400
Subject: [PATCH 167/437] error->one to error->all corrections

---
 src/REACTION/fix_bond_react.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp
index 60d040c8c9..192331889d 100644
--- a/src/REACTION/fix_bond_react.cpp
+++ b/src/REACTION/fix_bond_react.cpp
@@ -2124,7 +2124,7 @@ void FixBondReact::customvarnames()
           pos2 = varstr.find("(",pos1);
           pos3 = varstr.find(")",pos2);
           if (pos2 == std::string::npos || pos3 == std::string::npos)
-            error->one(FLERR,"Bond/react: Illegal rxn function syntax\n");
+            error->all(FLERR,"Bond/react: Illegal rxn function syntax\n");
           prev3 = pos3;
           argstr = varstr.substr(pos2+1,pos3-pos2-1);
           argstr.erase(remove_if(argstr.begin(), argstr.end(), isspace), argstr.end()); // remove whitespace
@@ -2170,15 +2170,15 @@ void FixBondReact::get_customvars()
   }
   for (int i = 0; i < ncustomvars; i++) {
     varid = customvarstrs[i];
-    if (varid.substr(0,2) != "v_") error->one(FLERR,"Bond/react: Reaction special function variable "
+    if (varid.substr(0,2) != "v_") error->all(FLERR,"Bond/react: Reaction special function variable "
                                      "name should begin with 'v_'");
     varid = varid.substr(2);
     int ivar = input->variable->find(varid.c_str());
     if (ivar < 0)
-      error->one(FLERR,"Bond/react: Reaction special function variable "
+      error->all(FLERR,"Bond/react: Reaction special function variable "
                                    "name does not exist");
     if (!input->variable->atomstyle(ivar))
-      error->one(FLERR,"Bond/react: Reaction special function must "
+      error->all(FLERR,"Bond/react: Reaction special function must "
                                    "reference an atom-style variable");
 
     input->variable->compute_atom(ivar,igroup,tempvvec,1,0);

From 08794848274666fd8bc26ee9921abfa2f3b8f82c Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Fri, 27 Aug 2021 09:48:35 -0600
Subject: [PATCH 168/437] sync OPENMP package with new GridComm syntax

---
 src/OPENMP/msm_cg_omp.cpp | 40 +++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/OPENMP/msm_cg_omp.cpp b/src/OPENMP/msm_cg_omp.cpp
index 6e67b3e1be..c45e75f9a5 100644
--- a/src/OPENMP/msm_cg_omp.cpp
+++ b/src/OPENMP/msm_cg_omp.cpp
@@ -166,8 +166,8 @@ void MSMCGOMP::compute(int eflag, int vflag)
   //   to fully sum contribution in their 3d grid
 
   current_level = 0;
-  gcall->reverse_comm_kspace(this,1,sizeof(double),REVERSE_RHO,
-                             gcall_buf1,gcall_buf2,MPI_DOUBLE);
+  gcall->reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_RHO,
+                      gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // forward communicate charge density values to fill ghost grid points
   // compute direct sum interaction and then restrict to coarser grid
@@ -175,8 +175,8 @@ void MSMCGOMP::compute(int eflag, int vflag)
   for (int n=0; n<=levels-2; n++) {
     if (!active_flag[n]) continue;
     current_level = n;
-    gc[n]->forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO,
-                               gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+    gc[n]->forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_RHO,
+                        gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
     direct(n);
     restriction(n);
   }
@@ -188,16 +188,16 @@ void MSMCGOMP::compute(int eflag, int vflag)
     if (domain->nonperiodic) {
       current_level = levels-1;
       gc[levels-1]->
-        forward_comm_kspace(this,1,sizeof(double),FORWARD_RHO,
-                            gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+        forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_RHO,
+                     gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
       direct_top(levels-1);
       gc[levels-1]->
-        reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD,
-                            gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+        reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_AD,
+                     gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
       if (vflag_atom)
         gc[levels-1]->
-          reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                              gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+          reverse_comm(GridComm::KSPACE,this,6,sizeof(double),REVERSE_AD_PERATOM,
+                       gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
 
     } else {
       // Here using MPI_Allreduce is cheaper than using commgrid
@@ -207,8 +207,8 @@ void MSMCGOMP::compute(int eflag, int vflag)
       current_level = levels-1;
       if (vflag_atom)
         gc[levels-1]->
-          reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                              gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
+          reverse_comm(GridComm::KSPACE,this,6,sizeof(double),REVERSE_AD_PERATOM,
+                       gc_buf1[levels-1],gc_buf2[levels-1],MPI_DOUBLE);
     }
   }
 
@@ -220,28 +220,28 @@ void MSMCGOMP::compute(int eflag, int vflag)
     prolongation(n);
 
     current_level = n;
-    gc[n]->reverse_comm_kspace(this,1,sizeof(double),REVERSE_AD,
-                               gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+    gc[n]->reverse_comm(GridComm::KSPACE,this,1,sizeof(double),REVERSE_AD,
+                        gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
 
     // extra per-atom virial communication
 
     if (vflag_atom)
-      gc[n]->reverse_comm_kspace(this,6,sizeof(double),REVERSE_AD_PERATOM,
-                                 gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
+      gc[n]->reverse_comm(GridComm::KSPACE,this,6,sizeof(double),
+                          REVERSE_AD_PERATOM,gc_buf1[n],gc_buf2[n],MPI_DOUBLE);
   }
 
   // all procs communicate E-field values
   // to fill ghost cells surrounding their 3d bricks
 
   current_level = 0;
-  gcall->forward_comm_kspace(this,1,sizeof(double),FORWARD_AD,
-                             gcall_buf1,gcall_buf2,MPI_DOUBLE);
+  gcall->forward_comm(GridComm::KSPACE,this,1,sizeof(double),FORWARD_AD,
+                      gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // extra per-atom energy/virial communication
 
   if (vflag_atom)
-    gcall->forward_comm_kspace(this,6,sizeof(double),FORWARD_AD_PERATOM,
-                               gcall_buf1,gcall_buf2,MPI_DOUBLE);
+    gcall->forward_comm(GridComm::KSPACE,this,6,sizeof(double),FORWARD_AD_PERATOM,
+                        gcall_buf1,gcall_buf2,MPI_DOUBLE);
 
   // calculate the force on my particles (interpolation)
 

From 6ab951fedce757786d8238f5b344df3f6ca082b6 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Fri, 27 Aug 2021 10:28:40 -0600
Subject: [PATCH 169/437] only change functions known to break with zero-length

---
 src/memory.h | 60 +++++++++++++++++++++++++++++++---------------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/src/memory.h b/src/memory.h
index b3f59140ea..b42f1e0866 100644
--- a/src/memory.h
+++ b/src/memory.h
@@ -42,7 +42,8 @@ class Memory : protected Pointers {
 
   template  TYPE *create(TYPE *&array, int n, const char *name)
   {
-    if (n <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n <= 0) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n;
     array = (TYPE *) smalloc(nbytes, name);
@@ -61,10 +62,11 @@ class Memory : protected Pointers {
 
   template  TYPE *grow(TYPE *&array, int n, const char *name)
   {
-    if (n <= 0) {
-      destroy(array);
-      return nullptr;
-    }
+    // POSSIBLE future change
+    //if (n <= 0) {
+    //  destroy(array);
+    //  return nullptr;
+    // }
 
     if (array == nullptr) return create(array, n, name);
 
@@ -96,7 +98,8 @@ class Memory : protected Pointers {
 
   template  TYPE *create1d_offset(TYPE *&array, int nlo, int nhi, const char *name)
   {
-    if (nlo > nhi) return nullptr;
+    // POSSIBLE future change
+    // if (nlo > nhi) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * (nhi - nlo + 1);
     array = (TYPE *) smalloc(nbytes, name);
@@ -127,7 +130,8 @@ class Memory : protected Pointers {
 
   template  TYPE **create(TYPE **&array, int n1, int n2, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
@@ -156,10 +160,11 @@ class Memory : protected Pointers {
 
   template  TYPE **grow(TYPE **&array, int n1, int n2, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0) {
-      destroy(array);
-      return nullptr;
-    }
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0) {
+    //  destroy(array);
+    //  return nullptr;
+    // }
 
     if (array == nullptr) return create(array, n1, n2, name);
 
@@ -201,7 +206,8 @@ class Memory : protected Pointers {
 
   template  TYPE **create_ragged(TYPE **&array, int n1, int *n2, const char *name)
   {
-    if (n1 <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0) return nullptr;
 
     bigint n2sum = 0;
     for (int i = 0; i < n1; i++) n2sum += n2[i];
@@ -234,7 +240,8 @@ class Memory : protected Pointers {
   template 
   TYPE **create2d_offset(TYPE **&array, int n1, int n2lo, int n2hi, const char *name)
   {
-    if (n1 <= 0 || n2lo > n2hi) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2lo > n2hi) return nullptr;
 
     int n2 = n2hi - n2lo + 1;
     create(array, n1, n2, name);
@@ -268,7 +275,8 @@ class Memory : protected Pointers {
 
   template  TYPE ***create(TYPE ***&array, int n1, int n2, int n3, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0 || n3 <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0 || n3 <= 0) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
@@ -305,10 +313,11 @@ class Memory : protected Pointers {
 
   template  TYPE ***grow(TYPE ***&array, int n1, int n2, int n3, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0 || n3 <= 0) {
-      destroy(array);
-      return nullptr;
-    };
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0 || n3 <= 0) {
+    //  destroy(array);
+    //  return nullptr;
+    //};
 
     if (array == nullptr) return create(array, n1, n2, n3, name);
 
@@ -445,7 +454,8 @@ class Memory : protected Pointers {
   template 
   TYPE ****create(TYPE ****&array, int n1, int n2, int n3, int n4, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3 * n4;
     TYPE *data = (TYPE *) smalloc(nbytes, name);
@@ -492,10 +502,11 @@ class Memory : protected Pointers {
   template 
   TYPE ****grow(TYPE ****&array, int n1, int n2, int n3, int n4, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) {
-      destroy(array);
-      return nullptr;
-    }
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0) {
+    //  destroy(array);
+    //  return nullptr;
+    // }
 
     if (array == nullptr) return create(array, n1, n2, n3, n4, name);
 
@@ -607,7 +618,8 @@ class Memory : protected Pointers {
   template 
   TYPE *****create(TYPE *****&array, int n1, int n2, int n3, int n4, int n5, const char *name)
   {
-    if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0 || n5 <= 0) return nullptr;
+    // POSSIBLE future change
+    //if (n1 <= 0 || n2 <= 0 || n3 <= 0 || n4 <= 0 || n5 <= 0) return nullptr;
 
     bigint nbytes = ((bigint) sizeof(TYPE)) * n1 * n2 * n3 * n4 * n5;
     TYPE *data = (TYPE *) smalloc(nbytes, name);

From 9658d1d9831721cd356f0aa17c13cc487a1f70d1 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Fri, 27 Aug 2021 12:34:19 -0400
Subject: [PATCH 170/437] Bump up the default chunksize in SNAP and update the
 docs

---
 doc/src/pair_snap.rst     | 13 ++++++++-----
 src/ML-SNAP/pair_snap.cpp |  2 +-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst
index ecfbf773c4..e00169b306 100644
--- a/doc/src/pair_snap.rst
+++ b/doc/src/pair_snap.rst
@@ -147,7 +147,7 @@ The default values for these keywords are
 * *chemflag* = 0
 * *bnormflag* = 0
 * *wselfallflag* = 0
-* *chunksize* = 4096
+* *chunksize* = 32768
 * *parallelthresh* = 8192
 
 If *quadraticflag* is set to 1, then the SNAP energy expression includes
@@ -189,21 +189,24 @@ corresponding *K*-vector of linear coefficients for element
 which must equal the number of unique elements appearing in the LAMMPS
 pair_coeff command, to avoid ambiguity in the number of coefficients.
 
-The keywords *chunksize* and *parallelthresh* are only applicable when using the
-pair style *snap* with the KOKKOS package and are ignored otherwise.
+The keywords *chunksize* and *parallelthresh* are only applicable when
+using the pair style *snap* with the KOKKOS package on GPUs and are
+ignored otherwise.
 The *chunksize* keyword controls
 the number of atoms in each pass used to compute the bispectrum
 components and is used to avoid running out of memory. For example
 if there are 8192 atoms in the simulation and the *chunksize*
 is set to 4096, the bispectrum calculation will be broken up
-into two passes.
+into two passes (running on a single GPU).
 The *parallelthresh* keyword controls
 a crossover threshold for performing extra parallelism. For
 small systems, exposing additional parallism can be beneficial when
 there is not enough work to fully saturate the GPU threads otherwise.
 However, the extra parallelism also leads to more divergence
 and can hurt performance when the system is already large enough to
-saturate the GPU threads.
+saturate the GPU threads. Extra parallelism will be performed if the
+*chunksize* (or total number of atoms per GPU) is smaller than
+*parallelthresh*.
 
 Detailed definitions for all the other keywords
 are given on the :doc:`compute sna/atom ` doc page.
diff --git a/src/ML-SNAP/pair_snap.cpp b/src/ML-SNAP/pair_snap.cpp
index 78019e7048..645dc7a213 100644
--- a/src/ML-SNAP/pair_snap.cpp
+++ b/src/ML-SNAP/pair_snap.cpp
@@ -628,7 +628,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename)
   chemflag = 0;
   bnormflag = 0;
   wselfallflag = 0;
-  chunksize = 4096;
+  chunksize = 32768;
   parallel_thresh = 8192;
 
   // open SNAP parameter file on proc 0

From 66da0ebada4b3fd915c6f3c777cf7931dc3255f8 Mon Sep 17 00:00:00 2001
From: Steve Plimpton 
Date: Fri, 27 Aug 2021 11:01:27 -0600
Subject: [PATCH 171/437] adjust INTEL pppm files for new GridComm interface

---
 src/INTEL/pppm_disp_intel.cpp | 83 ++++++++++++++++++-----------------
 src/INTEL/pppm_intel.cpp      | 22 +++++-----
 2 files changed, 54 insertions(+), 51 deletions(-)

diff --git a/src/INTEL/pppm_disp_intel.cpp b/src/INTEL/pppm_disp_intel.cpp
index 6b732ccfac..61c4ea3a7c 100644
--- a/src/INTEL/pppm_disp_intel.cpp
+++ b/src/INTEL/pppm_disp_intel.cpp
@@ -293,8 +293,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       make_rho_c(fix->get_single_buffers());
     }
 
-    gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
+                     gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     brick2fft(nxlo_in, nylo_in, nzlo_in, nxhi_in, nyhi_in, nzhi_in,
               density_brick, density_fft, work1,remap);
@@ -307,8 +307,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                  energy_1, greensfn, virial_1, vg,vg2, u_brick, v0_brick,
                  v1_brick, v2_brick, v3_brick, v4_brick, v5_brick);
 
-      gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),FORWARD_AD,
+                       gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_c_ad(fix->get_mixed_buffers());
@@ -319,8 +319,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (vflag_atom)
-        gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
-                                gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+        gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                         FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     } else {
       poisson_ik(work1, work2, density_fft, fft1, fft2,
@@ -332,8 +332,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                  u_brick, v0_brick, v1_brick, v2_brick, v3_brick, v4_brick,
                  v5_brick);
 
-      gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),FORWARD_IK,
+                       gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_c_ik(fix->get_mixed_buffers());
@@ -344,8 +344,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (evflag_atom)
-        gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
-                                gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+        gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                         FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     }
     if (evflag_atom) fieldforce_c_peratom();
   }
@@ -377,8 +377,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       make_rho_g(fix->get_single_buffers());
     }
 
-    gc6->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO_G,
-                             gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+    gc6->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),REVERSE_RHO_G,
+                      gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     brick2fft(nxlo_in_6, nylo_in_6, nzlo_in_6, nxhi_in_6, nyhi_in_6, nzhi_in_6,
               density_brick_g, density_fft_g, work1_6,remap_6);
@@ -392,8 +392,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                  virial_6, vg_6, vg2_6, u_brick_g, v0_brick_g, v1_brick_g,
                  v2_brick_g, v3_brick_g, v4_brick_g, v5_brick_g);
 
-      gc6->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD_G,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),FORWARD_AD_G,
+                        gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_g_ad(fix->get_mixed_buffers());
@@ -404,8 +404,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (vflag_atom)
-        gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_G,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_G,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     } else {
       poisson_ik(work1_6, work2_6, density_fft_g, fft1_6, fft2_6,
@@ -417,8 +417,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                  vdz_brick_g, virial_6, vg_6, vg2_6, u_brick_g, v0_brick_g,
                  v1_brick_g, v2_brick_g, v3_brick_g, v4_brick_g, v5_brick_g);
 
-      gc6->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK_G,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),FORWARD_IK_G,
+                        gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_g_ik(fix->get_mixed_buffers());
@@ -429,8 +429,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_G,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_G,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_g_peratom();
@@ -462,8 +462,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       make_rho_a(fix->get_single_buffers());
     }
 
-    gc->reverse_comm_kspace(this,7,sizeof(FFT_SCALAR),REVERSE_RHO_A,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),REVERSE_RHO_A,
+                     gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     brick2fft_a();
 
@@ -488,8 +488,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                     v5_brick_a2, u_brick_a4, v0_brick_a4, v1_brick_a4,
                     v2_brick_a4, v3_brick_a4, v4_brick_a4, v5_brick_a4);
 
-      gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_AD_A,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),FORWARD_AD_A,
+                        gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_a_ad(fix->get_mixed_buffers());
@@ -500,8 +500,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,42,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_A,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,42,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_A,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     }  else {
       poisson_ik(work1_6, work2_6, density_fft_a3, fft1_6, fft2_6,
@@ -531,8 +531,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
                     u_brick_a4, v0_brick_a4, v1_brick_a4, v2_brick_a4,
                     v3_brick_a4, v4_brick_a4, v5_brick_a4);
 
-      gc6->forward_comm_kspace(this,18,sizeof(FFT_SCALAR),FORWARD_IK_A,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,18,sizeof(FFT_SCALAR),FORWARD_IK_A,
+                        gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_a_ik(fix->get_mixed_buffers());
@@ -543,8 +543,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,49,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_A,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,49,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_A,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_a_peratom();
@@ -577,8 +577,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       make_rho_none(fix->get_single_buffers());
     }
 
-    gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO_NONE,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),REVERSE_RHO_NONE,
+                     gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
     brick2fft_none();
 
@@ -593,8 +593,8 @@ void PPPMDispIntel::compute(int eflag, int vflag)
         n += 2;
       }
 
-      gc6->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD_NONE,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                        FORWARD_AD_NONE,gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_none_ad(fix->get_mixed_buffers());
@@ -605,8 +605,9 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (vflag_atom)
-        gc6->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM_NONE,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                          FORWARD_AD_PERATOM_NONE,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
     } else {
       int n = 0;
@@ -622,8 +623,9 @@ void PPPMDispIntel::compute(int eflag, int vflag)
         n += 2;
       }
 
-      gc6->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK_NONE,
-                               gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+      gc6->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),
+                        FORWARD_IK_NONE,
+                        gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
 
       if (fix->precision() == FixIntel::PREC_MODE_MIXED) {
         fieldforce_none_ik(fix->get_mixed_buffers());
@@ -634,8 +636,9 @@ void PPPMDispIntel::compute(int eflag, int vflag)
       }
 
       if (evflag_atom)
-        gc6->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM_NONE,
-                                 gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
+        gc6->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                          FORWARD_IK_PERATOM_NONE,
+                          gc6_buf1,gc6_buf2,MPI_FFT_SCALAR);
     }
 
     if (evflag_atom) fieldforce_none_peratom();
diff --git a/src/INTEL/pppm_intel.cpp b/src/INTEL/pppm_intel.cpp
index 8041709ebc..53ab7c41bf 100644
--- a/src/INTEL/pppm_intel.cpp
+++ b/src/INTEL/pppm_intel.cpp
@@ -230,8 +230,8 @@ void PPPMIntel::compute_first(int eflag, int vflag)
   //   to fully sum contribution in their 3d bricks
   // remap from 3d decomposition to FFT decomposition
 
-  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                          gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+  gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
+                   gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   brick2fft();
 
   // compute potential gradient on my FFT grid and
@@ -246,21 +246,21 @@ void PPPMIntel::compute_first(int eflag, int vflag)
   // to fill ghost cells surrounding their 3d bricks
 
   if (differentiation_flag == 1)
-    gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),FORWARD_AD,
+                     gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   else
-    gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
-
+    gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),FORWARD_IK,
+                     gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+  
   // extra per-atom energy/virial communication
 
   if (evflag_atom) {
     if (differentiation_flag == 1 && vflag_atom)
-      gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                       FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     else if (differentiation_flag == 0)
-      gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                       FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   }
 }
 

From 4be33df8fb046b202292cb33a656642d2687751d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 12:25:51 -0400
Subject: [PATCH 172/437] relax force test epsilon values a little for
 cross-platform tests

---
 unittest/force-styles/tests/atomic-pair-meam.yaml               | 2 +-
 unittest/force-styles/tests/atomic-pair-meam_spline.yaml        | 2 +-
 unittest/force-styles/tests/atomic-pair-polymorphic_eam.yaml    | 2 +-
 unittest/force-styles/tests/bond-class2.yaml                    | 2 +-
 unittest/force-styles/tests/dihedral-multi_harmonic.yaml        | 2 +-
 unittest/force-styles/tests/dihedral-quadratic.yaml             | 2 +-
 unittest/force-styles/tests/dihedral-spherical.yaml             | 2 +-
 unittest/force-styles/tests/dihedral-table_cut_linear.yaml      | 2 +-
 unittest/force-styles/tests/dihedral-table_cut_spline.yaml      | 2 +-
 unittest/force-styles/tests/dihedral-table_linear.yaml          | 2 +-
 unittest/force-styles/tests/dihedral-table_spline.yaml          | 2 +-
 unittest/force-styles/tests/fix-timestep-addtorque_const.yaml   | 2 +-
 unittest/force-styles/tests/fix-timestep-momentum_chunk.yaml    | 2 +-
 unittest/force-styles/tests/fix-timestep-nph_sphere.yaml        | 2 +-
 unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml  | 2 +-
 unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml    | 2 +-
 unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml    | 2 +-
 unittest/force-styles/tests/fix-timestep-oneway.yaml            | 2 +-
 unittest/force-styles/tests/fix-timestep-rattle_bond.yaml       | 2 +-
 unittest/force-styles/tests/fix-timestep-shake_bond.yaml        | 2 +-
 .../force-styles/tests/fix-timestep-wall_harmonic_const.yaml    | 2 +-
 unittest/force-styles/tests/improper-harmonic.yaml              | 2 +-
 unittest/force-styles/tests/kspace-pppm_tip4p_ad.yaml           | 2 +-
 unittest/force-styles/tests/manybody-pair-bop.yaml              | 2 +-
 unittest/force-styles/tests/manybody-pair-bop_save.yaml         | 2 +-
 unittest/force-styles/tests/manybody-pair-edip_multi.yaml       | 2 +-
 unittest/force-styles/tests/manybody-pair-mliap_so3.yaml        | 2 +-
 unittest/force-styles/tests/manybody-pair-polymorphic_sw.yaml   | 2 +-
 .../force-styles/tests/manybody-pair-polymorphic_tersoff.yaml   | 2 +-
 unittest/force-styles/tests/mol-pair-buck_coul_long_cs.yaml     | 2 +-
 unittest/force-styles/tests/mol-pair-buck_coul_table_cs.yaml    | 2 +-
 unittest/force-styles/tests/mol-pair-buck_mdf.yaml              | 2 +-
 unittest/force-styles/tests/mol-pair-cosine_squared.yaml        | 2 +-
 unittest/force-styles/tests/mol-pair-coul_cut_soft.yaml         | 2 +-
 unittest/force-styles/tests/mol-pair-coul_diel.yaml             | 2 +-
 unittest/force-styles/tests/mol-pair-coul_shield.yaml           | 2 +-
 unittest/force-styles/tests/mol-pair-coul_slater_cut.yaml       | 2 +-
 unittest/force-styles/tests/mol-pair-hybrid-overlay.yaml        | 2 +-
 .../tests/mol-pair-lj_charmm_coul_charmm_implicit.yaml          | 2 +-
 .../force-styles/tests/mol-pair-lj_charmm_coul_long_soft.yaml   | 2 +-
 unittest/force-styles/tests/mol-pair-lj_class2_soft.yaml        | 2 +-
 unittest/force-styles/tests/mol-pair-lj_cut_coul_long_cs.yaml   | 2 +-
 unittest/force-styles/tests/mol-pair-lj_cut_coul_long_soft.yaml | 2 +-
 unittest/force-styles/tests/mol-pair-lj_cut_coul_msm.yaml       | 2 +-
 unittest/force-styles/tests/mol-pair-lj_cut_soft.yaml           | 2 +-
 .../force-styles/tests/mol-pair-lj_cut_tip4p_long_soft.yaml     | 2 +-
 unittest/force-styles/tests/mol-pair-tip4p_long.yaml            | 2 +-
 47 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/unittest/force-styles/tests/atomic-pair-meam.yaml b/unittest/force-styles/tests/atomic-pair-meam.yaml
index 6f262c032a..08193987f8 100644
--- a/unittest/force-styles/tests/atomic-pair-meam.yaml
+++ b/unittest/force-styles/tests/atomic-pair-meam.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:03 2021
-epsilon: 5e-13
+epsilon: 2.5e-12
 prerequisites: ! |
   pair meam
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/atomic-pair-meam_spline.yaml b/unittest/force-styles/tests/atomic-pair-meam_spline.yaml
index 7fd61ac2aa..9ee9ee13fb 100644
--- a/unittest/force-styles/tests/atomic-pair-meam_spline.yaml
+++ b/unittest/force-styles/tests/atomic-pair-meam_spline.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:03 2021
-epsilon: 1e-14
+epsilon: 5e-14
 prerequisites: ! |
   pair meam/spline
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/atomic-pair-polymorphic_eam.yaml b/unittest/force-styles/tests/atomic-pair-polymorphic_eam.yaml
index 6a2c16a80d..b1335906c4 100644
--- a/unittest/force-styles/tests/atomic-pair-polymorphic_eam.yaml
+++ b/unittest/force-styles/tests/atomic-pair-polymorphic_eam.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:04 2021
-epsilon: 5e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   pair polymorphic
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/bond-class2.yaml b/unittest/force-styles/tests/bond-class2.yaml
index 19647a56ed..a7c9d37cf3 100644
--- a/unittest/force-styles/tests/bond-class2.yaml
+++ b/unittest/force-styles/tests/bond-class2.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:21 2021
-epsilon: 1e-13
+epsilon: 4e-13
 prerequisites: ! |
   atom full
   bond class2
diff --git a/unittest/force-styles/tests/dihedral-multi_harmonic.yaml b/unittest/force-styles/tests/dihedral-multi_harmonic.yaml
index 1694ed2e66..71c5c1927a 100644
--- a/unittest/force-styles/tests/dihedral-multi_harmonic.yaml
+++ b/unittest/force-styles/tests/dihedral-multi_harmonic.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:35 2021
-epsilon: 2.5e-13
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   dihedral multi/harmonic
diff --git a/unittest/force-styles/tests/dihedral-quadratic.yaml b/unittest/force-styles/tests/dihedral-quadratic.yaml
index ed230b7c23..b1c59e131f 100644
--- a/unittest/force-styles/tests/dihedral-quadratic.yaml
+++ b/unittest/force-styles/tests/dihedral-quadratic.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:35 2021
-epsilon: 2.5e-13
+epsilon: 1e-12
 prerequisites: ! |
   atom full
   dihedral quadratic
diff --git a/unittest/force-styles/tests/dihedral-spherical.yaml b/unittest/force-styles/tests/dihedral-spherical.yaml
index 1811ce1069..3d0c0686da 100644
--- a/unittest/force-styles/tests/dihedral-spherical.yaml
+++ b/unittest/force-styles/tests/dihedral-spherical.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 10:57:54 2021
-epsilon: 2.5e-14
+epsilon: 5e-14
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/dihedral-table_cut_linear.yaml b/unittest/force-styles/tests/dihedral-table_cut_linear.yaml
index 7b4c429c96..fdfa9bfcb5 100644
--- a/unittest/force-styles/tests/dihedral-table_cut_linear.yaml
+++ b/unittest/force-styles/tests/dihedral-table_cut_linear.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Mar 2021
 date_generated: Tue Mar 23 08:05:02 202
-epsilon: 2e-14
+epsilon: 5e-14
 prerequisites: ! |
   atom full
   dihedral table/cut
diff --git a/unittest/force-styles/tests/dihedral-table_cut_spline.yaml b/unittest/force-styles/tests/dihedral-table_cut_spline.yaml
index 40437ebbbb..2fabbed8f9 100644
--- a/unittest/force-styles/tests/dihedral-table_cut_spline.yaml
+++ b/unittest/force-styles/tests/dihedral-table_cut_spline.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Mar 2021
 date_generated: Tue Mar 23 08:06:45 202
-epsilon: 2e-14
+epsilon: 2.5e-13
 prerequisites: ! |
   atom full
   dihedral table/cut
diff --git a/unittest/force-styles/tests/dihedral-table_linear.yaml b/unittest/force-styles/tests/dihedral-table_linear.yaml
index 7e2a7d55c1..608208e275 100644
--- a/unittest/force-styles/tests/dihedral-table_linear.yaml
+++ b/unittest/force-styles/tests/dihedral-table_linear.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Mar 2021
 date_generated: Mon Mar 22 21:19:05 202
-epsilon: 1e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   atom full
   dihedral table
diff --git a/unittest/force-styles/tests/dihedral-table_spline.yaml b/unittest/force-styles/tests/dihedral-table_spline.yaml
index 90aab98fba..17c90b86d3 100644
--- a/unittest/force-styles/tests/dihedral-table_spline.yaml
+++ b/unittest/force-styles/tests/dihedral-table_spline.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Mar 2021
 date_generated: Mon Mar 22 21:19:05 202
-epsilon: 1e-14
+epsilon: 1e-13
 prerequisites: ! |
   atom full
   dihedral table
diff --git a/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
index 011aa3af02..a1e0c30d62 100644
--- a/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
+++ b/unittest/force-styles/tests/fix-timestep-addtorque_const.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:22:56 2021
-epsilon: 1.5e-11
+epsilon: 2.5e-11
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-momentum_chunk.yaml b/unittest/force-styles/tests/fix-timestep-momentum_chunk.yaml
index 89e6518c7b..9151c9f4aa 100644
--- a/unittest/force-styles/tests/fix-timestep-momentum_chunk.yaml
+++ b/unittest/force-styles/tests/fix-timestep-momentum_chunk.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:54 2021
-epsilon: 2e-14
+epsilon: 1e-13
 prerequisites: ! |
   atom full
   fix momentum/chunk
diff --git a/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml
index 2b3a5efe74..5740f1c772 100644
--- a/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml
+++ b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:13:03 2021
-epsilon: 5e-14
+epsilon: 2e-13
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml
index e93f5187d0..e920859bf2 100644
--- a/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml
+++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:10:26 2021
-epsilon: 1e-13
+epsilon: 4e-13
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml
index 85335e2f0e..4af29dd4d2 100644
--- a/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml
+++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:07:35 2021
-epsilon: 5e-14
+epsilon: 2e-13
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
index 60d74f61de..a30917cbc6 100644
--- a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
+++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 30 Jul 2021
 date_generated: Sun Aug 22 14:15:09 2021
-epsilon: 4e-13
+epsilon: 5e-13
 skip_tests:
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/fix-timestep-oneway.yaml b/unittest/force-styles/tests/fix-timestep-oneway.yaml
index 413902e1ff..654507882e 100644
--- a/unittest/force-styles/tests/fix-timestep-oneway.yaml
+++ b/unittest/force-styles/tests/fix-timestep-oneway.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:55 2021
-epsilon: 4e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   atom full
   fix oneway
diff --git a/unittest/force-styles/tests/fix-timestep-rattle_bond.yaml b/unittest/force-styles/tests/fix-timestep-rattle_bond.yaml
index 2a4b6d9cb6..fcf9c20ab8 100644
--- a/unittest/force-styles/tests/fix-timestep-rattle_bond.yaml
+++ b/unittest/force-styles/tests/fix-timestep-rattle_bond.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:55 2021
-epsilon: 1e-10
+epsilon: 1.5e-10
 prerequisites: ! |
   atom full
   fix rattle
diff --git a/unittest/force-styles/tests/fix-timestep-shake_bond.yaml b/unittest/force-styles/tests/fix-timestep-shake_bond.yaml
index 41b3e8c1f9..3da01fa5b8 100644
--- a/unittest/force-styles/tests/fix-timestep-shake_bond.yaml
+++ b/unittest/force-styles/tests/fix-timestep-shake_bond.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:58 2021
-epsilon: 3.5e-11
+epsilon: 5e-11
 prerequisites: ! |
   atom full
   fix shake
diff --git a/unittest/force-styles/tests/fix-timestep-wall_harmonic_const.yaml b/unittest/force-styles/tests/fix-timestep-wall_harmonic_const.yaml
index 779d1b30c3..ebc6fd5bea 100644
--- a/unittest/force-styles/tests/fix-timestep-wall_harmonic_const.yaml
+++ b/unittest/force-styles/tests/fix-timestep-wall_harmonic_const.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:59 2021
-epsilon: 3e-14
+epsilon: 4e-14
 prerequisites: ! |
   atom full
   fix wall/harmonic
diff --git a/unittest/force-styles/tests/improper-harmonic.yaml b/unittest/force-styles/tests/improper-harmonic.yaml
index bd5c1bb534..fb147a2e71 100644
--- a/unittest/force-styles/tests/improper-harmonic.yaml
+++ b/unittest/force-styles/tests/improper-harmonic.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Wed Feb 24 19:35:15 202
-epsilon: 1e-11
+epsilon: 2e-11
 prerequisites: ! |
   atom full
   improper harmonic
diff --git a/unittest/force-styles/tests/kspace-pppm_tip4p_ad.yaml b/unittest/force-styles/tests/kspace-pppm_tip4p_ad.yaml
index 66404f39b5..219addb5f0 100644
--- a/unittest/force-styles/tests/kspace-pppm_tip4p_ad.yaml
+++ b/unittest/force-styles/tests/kspace-pppm_tip4p_ad.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:34 2021
-epsilon: 3e-13
+epsilon: 4e-13
 prerequisites: ! |
   atom full
   pair tip4p/long
diff --git a/unittest/force-styles/tests/manybody-pair-bop.yaml b/unittest/force-styles/tests/manybody-pair-bop.yaml
index bc5d198aaf..8260b16d21 100644
--- a/unittest/force-styles/tests/manybody-pair-bop.yaml
+++ b/unittest/force-styles/tests/manybody-pair-bop.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 8 Apr 2021
 date_generated: Wed May  5 11:50:15 2021
-epsilon: 2e-13
+epsilon: 5e-13
 prerequisites: ! |
   pair bop
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/manybody-pair-bop_save.yaml b/unittest/force-styles/tests/manybody-pair-bop_save.yaml
index 9c8ca13067..e5699cf8b8 100644
--- a/unittest/force-styles/tests/manybody-pair-bop_save.yaml
+++ b/unittest/force-styles/tests/manybody-pair-bop_save.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 8 Apr 2021
 date_generated: Wed May  5 11:50:24 2021
-epsilon: 2e-14
+epsilon: 9e-13
 prerequisites: ! |
   pair bop
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/manybody-pair-edip_multi.yaml b/unittest/force-styles/tests/manybody-pair-edip_multi.yaml
index d86aa02b3f..0f987836e1 100644
--- a/unittest/force-styles/tests/manybody-pair-edip_multi.yaml
+++ b/unittest/force-styles/tests/manybody-pair-edip_multi.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:15 2021
-epsilon: 7.5e-14
+epsilon: 1.5e-13
 prerequisites: ! |
   pair edip/multi
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/manybody-pair-mliap_so3.yaml b/unittest/force-styles/tests/manybody-pair-mliap_so3.yaml
index cee70bc484..86fc0ac545 100644
--- a/unittest/force-styles/tests/manybody-pair-mliap_so3.yaml
+++ b/unittest/force-styles/tests/manybody-pair-mliap_so3.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 27 May 2021
 date_generated: Sun Jun 13 17:44:07 2021
-epsilon: 5e-13
+epsilon: 2.5e-11
 skip_tests:
 prerequisites: ! |
   pair mliap
diff --git a/unittest/force-styles/tests/manybody-pair-polymorphic_sw.yaml b/unittest/force-styles/tests/manybody-pair-polymorphic_sw.yaml
index 7d68718aae..cccc15256b 100644
--- a/unittest/force-styles/tests/manybody-pair-polymorphic_sw.yaml
+++ b/unittest/force-styles/tests/manybody-pair-polymorphic_sw.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:17 2021
-epsilon: 1e-14
+epsilon: 1.5e-13
 prerequisites: ! |
   pair polymorphic
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/manybody-pair-polymorphic_tersoff.yaml b/unittest/force-styles/tests/manybody-pair-polymorphic_tersoff.yaml
index 735ed0eaf9..0b12fd084c 100644
--- a/unittest/force-styles/tests/manybody-pair-polymorphic_tersoff.yaml
+++ b/unittest/force-styles/tests/manybody-pair-polymorphic_tersoff.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:09:17 2021
-epsilon: 1e-14
+epsilon: 1e-13
 prerequisites: ! |
   pair polymorphic
 pre_commands: ! |
diff --git a/unittest/force-styles/tests/mol-pair-buck_coul_long_cs.yaml b/unittest/force-styles/tests/mol-pair-buck_coul_long_cs.yaml
index 4667f63a75..1cc2cc5dec 100644
--- a/unittest/force-styles/tests/mol-pair-buck_coul_long_cs.yaml
+++ b/unittest/force-styles/tests/mol-pair-buck_coul_long_cs.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:40 2021
-epsilon: 5e-14
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair buck/coul/long/cs
diff --git a/unittest/force-styles/tests/mol-pair-buck_coul_table_cs.yaml b/unittest/force-styles/tests/mol-pair-buck_coul_table_cs.yaml
index fed44214d8..25c4381ba5 100644
--- a/unittest/force-styles/tests/mol-pair-buck_coul_table_cs.yaml
+++ b/unittest/force-styles/tests/mol-pair-buck_coul_table_cs.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:41 2021
-epsilon: 5e-14
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair buck/coul/long/cs
diff --git a/unittest/force-styles/tests/mol-pair-buck_mdf.yaml b/unittest/force-styles/tests/mol-pair-buck_mdf.yaml
index 8f284c910c..7feefb9f51 100644
--- a/unittest/force-styles/tests/mol-pair-buck_mdf.yaml
+++ b/unittest/force-styles/tests/mol-pair-buck_mdf.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:41 2021
-epsilon: 5e-14
+epsilon: 1e-13
 prerequisites: ! |
   atom full
   pair buck/mdf
diff --git a/unittest/force-styles/tests/mol-pair-cosine_squared.yaml b/unittest/force-styles/tests/mol-pair-cosine_squared.yaml
index ee6faf6235..f787f65e84 100644
--- a/unittest/force-styles/tests/mol-pair-cosine_squared.yaml
+++ b/unittest/force-styles/tests/mol-pair-cosine_squared.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:42 2021
-epsilon: 5e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   atom full
   pair cosine/squared
diff --git a/unittest/force-styles/tests/mol-pair-coul_cut_soft.yaml b/unittest/force-styles/tests/mol-pair-coul_cut_soft.yaml
index 20b467b728..27a1343e67 100644
--- a/unittest/force-styles/tests/mol-pair-coul_cut_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-coul_cut_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:42 2021
-epsilon: 5e-14
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair hybrid/overlay
diff --git a/unittest/force-styles/tests/mol-pair-coul_diel.yaml b/unittest/force-styles/tests/mol-pair-coul_diel.yaml
index a417ee09bf..dfd541d659 100644
--- a/unittest/force-styles/tests/mol-pair-coul_diel.yaml
+++ b/unittest/force-styles/tests/mol-pair-coul_diel.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:42 2021
-epsilon: 1e-13
+epsilon: 2e-13
 prerequisites: ! |
   atom full
   pair coul/diel
diff --git a/unittest/force-styles/tests/mol-pair-coul_shield.yaml b/unittest/force-styles/tests/mol-pair-coul_shield.yaml
index fa64e7d0cb..5b40743ea8 100644
--- a/unittest/force-styles/tests/mol-pair-coul_shield.yaml
+++ b/unittest/force-styles/tests/mol-pair-coul_shield.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:43 2021
-epsilon: 2.5e-13
+epsilon: 2.5e-12
 prerequisites: ! |
   atom full
   pair coul/shield
diff --git a/unittest/force-styles/tests/mol-pair-coul_slater_cut.yaml b/unittest/force-styles/tests/mol-pair-coul_slater_cut.yaml
index d08bbf4c86..ea587bff0b 100644
--- a/unittest/force-styles/tests/mol-pair-coul_slater_cut.yaml
+++ b/unittest/force-styles/tests/mol-pair-coul_slater_cut.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:43 2021
-epsilon: 1e-13
+epsilon: 2e-13
 prerequisites: ! |
   atom full
   pair coul/slater/cut
diff --git a/unittest/force-styles/tests/mol-pair-hybrid-overlay.yaml b/unittest/force-styles/tests/mol-pair-hybrid-overlay.yaml
index c590c10dc7..68f23ae526 100644
--- a/unittest/force-styles/tests/mol-pair-hybrid-overlay.yaml
+++ b/unittest/force-styles/tests/mol-pair-hybrid-overlay.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 8 Apr 2021
 date_generated: Mon Apr 19 08:49:07 2021
-epsilon: 1.5e-13
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair lj/cut
diff --git a/unittest/force-styles/tests/mol-pair-lj_charmm_coul_charmm_implicit.yaml b/unittest/force-styles/tests/mol-pair-lj_charmm_coul_charmm_implicit.yaml
index d9bd7786ba..f43a232db4 100644
--- a/unittest/force-styles/tests/mol-pair-lj_charmm_coul_charmm_implicit.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_charmm_coul_charmm_implicit.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:45 2021
-epsilon: 2.5e-13
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair lj/charmm/coul/charmm/implicit
diff --git a/unittest/force-styles/tests/mol-pair-lj_charmm_coul_long_soft.yaml b/unittest/force-styles/tests/mol-pair-lj_charmm_coul_long_soft.yaml
index 0d956e0d3e..955d36491b 100644
--- a/unittest/force-styles/tests/mol-pair-lj_charmm_coul_long_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_charmm_coul_long_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:45 2021
-epsilon: 5e-13
+epsilon: 2.5e-12
 prerequisites: ! |
   atom full
   pair lj/charmm/coul/long/soft
diff --git a/unittest/force-styles/tests/mol-pair-lj_class2_soft.yaml b/unittest/force-styles/tests/mol-pair-lj_class2_soft.yaml
index 75bf587fe9..c4bd4c2890 100644
--- a/unittest/force-styles/tests/mol-pair-lj_class2_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_class2_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:47 2021
-epsilon: 5e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   atom full
   pair lj/class2/soft
diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_cs.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_cs.yaml
index 0dc745ca26..763470b674 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_cs.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_cs.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:48 2021
-epsilon: 1e-13
+epsilon: 2e-13
 prerequisites: ! |
   atom full
   pair lj/cut/coul/long/cs
diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_soft.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_soft.yaml
index acd3ea4ce0..db9f33fa87 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_coul_long_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:48 2021
-epsilon: 5e-13
+epsilon: 2.5e-12
 prerequisites: ! |
   atom full
   pair lj/cut/coul/long/soft
diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_coul_msm.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_coul_msm.yaml
index a02cad3f1b..7e0505220e 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_coul_msm.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_coul_msm.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:48 2021
-epsilon: 7e-14
+epsilon: 7.5e-14
 skip_tests: gpu
 prerequisites: ! |
   atom full
diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_soft.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_soft.yaml
index 77567c0a76..aaa232079c 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:49 2021
-epsilon: 5e-14
+epsilon: 7.5e-14
 prerequisites: ! |
   atom full
   pair lj/cut/soft
diff --git a/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long_soft.yaml b/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long_soft.yaml
index 027c91970e..e126838215 100644
--- a/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long_soft.yaml
+++ b/unittest/force-styles/tests/mol-pair-lj_cut_tip4p_long_soft.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:50 2021
-epsilon: 1e-13
+epsilon: 2.5e-13
 prerequisites: ! |
   atom full
   pair lj/cut/tip4p/long/soft
diff --git a/unittest/force-styles/tests/mol-pair-tip4p_long.yaml b/unittest/force-styles/tests/mol-pair-tip4p_long.yaml
index d09ccd2a68..fc31ce334c 100644
--- a/unittest/force-styles/tests/mol-pair-tip4p_long.yaml
+++ b/unittest/force-styles/tests/mol-pair-tip4p_long.yaml
@@ -1,7 +1,7 @@
 ---
 lammps_version: 10 Feb 2021
 date_generated: Fri Feb 26 23:08:57 2021
-epsilon: 2.5e-13
+epsilon: 5e-13
 prerequisites: ! |
   atom full
   pair tip4p/long

From a58e4fc8765afa5850e8765571e1ae8edbf6680e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 14:59:26 -0400
Subject: [PATCH 173/437] whitespace

---
 src/KOKKOS/sna_kokkos.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h
index 47a01d5ca4..0bcb07285c 100644
--- a/src/KOKKOS/sna_kokkos.h
+++ b/src/KOKKOS/sna_kokkos.h
@@ -166,7 +166,7 @@ inline
                         const Kokkos::View &);
   // plugged into compute_fused_deidrj_small, compute_fused_deidrj_large
   KOKKOS_FORCEINLINE_FUNCTION
-  real_type evaluate_duidrj_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&, 
+  real_type evaluate_duidrj_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&,
                         const WignerWrapper&, const complex&, const complex&, const real_type&,
                         const int&, const int&, const int&, const int&);
 

From 90f82a8ef191b0fef12ec39397577733d7d4604a Mon Sep 17 00:00:00 2001
From: Jacob Gissinger 
Date: Fri, 27 Aug 2021 17:03:11 -0400
Subject: [PATCH 174/437] memory leak

---
 src/REACTION/fix_bond_react.cpp | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp
index 192331889d..7b891d42fe 100644
--- a/src/REACTION/fix_bond_react.cpp
+++ b/src/REACTION/fix_bond_react.cpp
@@ -1990,7 +1990,10 @@ int FixBondReact::check_constraints()
       *ptr = satisfied[i] ? '1' : '0';
     }
     double verdict = input->variable->evaluate_boolean(evalstr);
-    if (verdict == 0.0) return 0;
+    if (verdict == 0.0) {
+      memory->destroy(satisfied);
+      return 0;
+    }
   }
 
   // let's also check chirality within 'check_constraint'
@@ -2012,7 +2015,10 @@ int FixBondReact::check_constraints()
           }
         }
       }
-      if (get_chirality(my4coords) != chiral_atoms[i][1][rxnID]) return 0;
+      if (get_chirality(my4coords) != chiral_atoms[i][1][rxnID]) {
+        memory->destroy(satisfied);
+        return 0;
+      }
     }
   }
 

From c513fc87841b493e7327a0aeb1ad8ca9e6975786 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 19:52:39 -0400
Subject: [PATCH 175/437] update pppm/gpu to use the refactored GridComm class

---
 src/GPU/pppm_gpu.cpp | 65 ++++++++++++++++++++++----------------------
 1 file changed, 33 insertions(+), 32 deletions(-)

diff --git a/src/GPU/pppm_gpu.cpp b/src/GPU/pppm_gpu.cpp
index 8e3ec2ace8..4b72613e6a 100644
--- a/src/GPU/pppm_gpu.cpp
+++ b/src/GPU/pppm_gpu.cpp
@@ -17,29 +17,30 @@
 ------------------------------------------------------------------------- */
 
 #include "pppm_gpu.h"
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "atom.h"
-#include "comm.h"
-#include "gridcomm.h"
-#include "neighbor.h"
-#include "force.h"
-#include "pair.h"
-#include "bond.h"
+
 #include "angle.h"
+#include "atom.h"
+#include "bond.h"
+#include "comm.h"
 #include "domain.h"
+#include "error.h"
 #include "fft3d_wrap.h"
-#include "remap_wrap.h"
+#include "fix.h"
+#include "force.h"
 #include "gpu_extra.h"
+#include "gridcomm.h"
 #include "math_const.h"
 #include "memory.h"
-#include "error.h"
-#include "update.h"
+#include "neighbor.h"
+#include "pair.h"
+#include "remap_wrap.h"
 #include "universe.h"
-#include "fix.h"
+#include "update.h"
+
+#include 
+#include 
+#include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
@@ -257,12 +258,12 @@ void PPPMGPU::compute(int eflag, int vflag)
   // remap from 3d decomposition to FFT decomposition
 
   if (triclinic == 0) {
-    gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO_GPU,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                     REVERSE_RHO_GPU,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     brick2fft_gpu();
   } else {
-    gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                     REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     PPPM::brick2fft();
   }
 
@@ -276,21 +277,21 @@ void PPPMGPU::compute(int eflag, int vflag)
   // to fill ghost cells surrounding their 3d bricks
 
   if (differentiation_flag == 1)
-    gc->forward_comm_kspace(this,1,sizeof(FFT_SCALAR),FORWARD_AD,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->forward_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                     FORWARD_AD,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   else
-    gc->forward_comm_kspace(this,3,sizeof(FFT_SCALAR),FORWARD_IK,
-                            gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+    gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),
+                     FORWARD_IK,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
 
   // extra per-atom energy/virial communication
 
   if (evflag_atom) {
     if (differentiation_flag == 1 && vflag_atom)
-      gc->forward_comm_kspace(this,6,sizeof(FFT_SCALAR),FORWARD_AD_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,6,sizeof(FFT_SCALAR),
+                       FORWARD_AD_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
     else if (differentiation_flag == 0)
-      gc->forward_comm_kspace(this,7,sizeof(FFT_SCALAR),FORWARD_IK_PERATOM,
-                              gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+      gc->forward_comm(GridComm::KSPACE,this,7,sizeof(FFT_SCALAR),
+                       FORWARD_IK_PERATOM,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   }
 
   poisson_time += MPI_Wtime()-t3;
@@ -833,8 +834,8 @@ void PPPMGPU::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag)
   density_brick = density_A_brick;
   density_fft = density_A_fft;
 
-  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                          gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+  gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                   REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   brick2fft();
 
   // group B
@@ -842,8 +843,8 @@ void PPPMGPU::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag)
   density_brick = density_B_brick;
   density_fft = density_B_fft;
 
-  gc->reverse_comm_kspace(this,1,sizeof(FFT_SCALAR),REVERSE_RHO,
-                          gc_buf1,gc_buf2,MPI_FFT_SCALAR);
+  gc->reverse_comm(GridComm::KSPACE,this,1,sizeof(FFT_SCALAR),
+                   REVERSE_RHO,gc_buf1,gc_buf2,MPI_FFT_SCALAR);
   brick2fft();
 
   // switch back pointers

From e93ae9ba12c66743ce5694ed72b8c87cf830dd7c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 19:56:33 -0400
Subject: [PATCH 176/437] apply clang-format

---
 src/fix.h      | 13 ++++++-------
 src/gridcomm.h | 14 +++++---------
 2 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/src/fix.h b/src/fix.h
index 44b9978052..69fff154dc 100644
--- a/src/fix.h
+++ b/src/fix.h
@@ -205,13 +205,12 @@ class Fix : protected Pointers {
   virtual int pack_reverse_comm(int, int, double *) { return 0; }
   virtual void unpack_reverse_comm(int, int *, double *) {}
 
-  virtual void pack_forward_grid(int, void *, int, int *) {};
-  virtual void unpack_forward_grid(int, void *, int, int *) {};
-  virtual void pack_reverse_grid(int, void *, int, int *) {};
-  virtual void unpack_reverse_grid(int, void *, int, int *) {};
-  virtual void pack_gather_grid(int, void *) {};
-  virtual void unpack_gather_grid(int, void *, void *,
-                                  int, int, int, int, int, int) {};
+  virtual void pack_forward_grid(int, void *, int, int *){};
+  virtual void unpack_forward_grid(int, void *, int, int *){};
+  virtual void pack_reverse_grid(int, void *, int, int *){};
+  virtual void unpack_reverse_grid(int, void *, int, int *){};
+  virtual void pack_gather_grid(int, void *){};
+  virtual void unpack_gather_grid(int, void *, void *, int, int, int, int, int, int){};
 
   virtual double compute_scalar() { return 0.0; }
   virtual double compute_vector(int) { return 0.0; }
diff --git a/src/gridcomm.h b/src/gridcomm.h
index 4b3c3de1b8..37751a88a7 100644
--- a/src/gridcomm.h
+++ b/src/gridcomm.h
@@ -20,7 +20,7 @@ namespace LAMMPS_NS {
 
 class GridComm : protected Pointers {
  public:
-  enum { KSPACE = 0, FIX = 1};     // calling classes
+  enum { KSPACE = 0, FIX = 1 };    // calling classes
 
   GridComm(class LAMMPS *, MPI_Comm, int, int, int, int, int, int, int, int, int, int, int, int,
            int, int, int);
@@ -184,14 +184,10 @@ class GridComm : protected Pointers {
   int ghost_adjacent_regular();
   int ghost_adjacent_tiled();
 
-  template 
-  void forward_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype);
-  template 
-  void forward_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype);
-  template 
-  void reverse_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype);
-  template 
-  void reverse_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype);
+  template  void forward_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype);
+  template  void forward_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype);
+  template  void reverse_comm_regular(T *, int, int, int, void *, void *, MPI_Datatype);
+  template  void reverse_comm_tiled(T *, int, int, int, void *, void *, MPI_Datatype);
 
   virtual void grow_swap();
   void grow_overlap();

From cf33f0bb9607a75aa046a0558013c77e604e881f Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 20:22:29 -0400
Subject: [PATCH 177/437] silence compiler warnings, remove dead code, and do
 some reformatting

---
 src/EXTRA-FIX/fix_ttm.cpp      | 39 +++++++++++++---------------------
 src/EXTRA-FIX/fix_ttm_grid.cpp | 32 ++++++++++++----------------
 src/EXTRA-FIX/fix_ttm_mod.cpp  |  3 ---
 src/gridcomm.cpp               |  7 +++---
 4 files changed, 32 insertions(+), 49 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 803246b394..fd36487b57 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -19,20 +19,20 @@
 
 #include "fix_ttm.h"
 
-#include 
-#include 
-#include 
 #include "atom.h"
-#include "force.h"
-#include "update.h"
-#include "domain.h"
-#include "respa.h"
 #include "comm.h"
-#include "random_mars.h"
-#include "memory.h"
+#include "domain.h"
 #include "error.h"
-
+#include "force.h"
+#include "memory.h"
+#include "random_mars.h"
+#include "respa.h"
 #include "tokenizer.h"
+#include "update.h"
+
+#include 
+#include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
@@ -45,8 +45,8 @@ using namespace FixConst;
 // use SHIFT = 0.0 for now since it allows fix ave/chunk
 //   to spatially average consistent with the TTM grid
 
-#define OFFSET 16384
-#define SHIFT 0.0
+static constexpr int OFFSET = 16384;
+static constexpr double SHIFT = 0.0;
 
 /* ---------------------------------------------------------------------- */
 
@@ -288,7 +288,6 @@ void FixTTM::post_force_setup(int /*vflag*/)
 void FixTTM::post_force(int /*vflag*/)
 {
   int ix,iy,iz;
-  double xscale,yscale,zscale;
   double gamma1,gamma2;
 
   double **x = atom->x;
@@ -357,13 +356,9 @@ void FixTTM::post_force_respa(int vflag, int ilevel, int /*iloop*/)
 void FixTTM::end_of_step()
 {
   int ix,iy,iz;
-  double xscale,yscale,zscale;
 
   double **x = atom->x;
   double **v = atom->v;
-  double *mass = atom->mass;
-  double *rmass = atom->rmass;
-  int *type = atom->type;
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
@@ -490,8 +485,7 @@ void FixTTM::read_electron_temperatures(const char *filename)
 
   std::string name = utils::get_potential_file_path(filename);
   if (name.empty())
-    error->one(FLERR,"Cannot open input file: {}",
-                                 filename);
+    error->one(FLERR,"Cannot open input file: {}",filename);
   FILE *fp = fopen(name.c_str(),"r");
 
   // read initial electron temperature values from file
@@ -511,13 +505,10 @@ void FixTTM::read_electron_temperatures(const char *filename)
 
     // check correctness of input data
 
-    if ((ix < 0) || (ix >= nxgrid)
-        || (iy < 0) || (iy >= nygrid)
-        || (iz < 0) || (iz >= nzgrid))
+    if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid))
       error->one(FLERR,"Fix ttm invalid grid index in fix ttm input");
 
-    if (T_tmp < 0.0)
-      error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
+    if (T_tmp < 0.0) error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
 
     T_electron[iz][iy][ix] = T_tmp;
     T_initial_set[iz][iy][ix] = 1;
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index e7cb60731a..2fa3c65f27 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -19,26 +19,26 @@
 
 #include "fix_ttm_grid.h"
 
-#include 
-#include 
 #include "atom.h"
-#include "force.h"
-#include "update.h"
-#include "domain.h"
 #include "comm.h"
+#include "domain.h"
+#include "error.h"
+#include "force.h"
 #include "gridcomm.h"
+#include "memory.h"
 #include "neighbor.h"
 #include "random_mars.h"
-#include "memory.h"
-#include "error.h"
+#include "update.h"
+
+#include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
 
 static constexpr int MAXLINE = 256;
 static constexpr int CHUNK = 1024;
-
-#define OFFSET 16384
+static constexpr int OFFSET = 16384;
 
 /* ---------------------------------------------------------------------- */
 
@@ -169,8 +169,6 @@ void FixTTMGrid::end_of_step()
 
   double **x = atom->x;
   double **v = atom->v;
-  double *mass = atom->mass;
-  int *type = atom->type;
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
@@ -394,7 +392,7 @@ void FixTTMGrid::write_electron_temperatures(const char *filename)
    pack own values to buf to send to another proc
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::pack_forward_grid(int flag, void *vbuf, int nlist, int *list)
+void FixTTMGrid::pack_forward_grid(int /*flag*/, void *vbuf, int nlist, int *list)
 {
   double *buf = (double *) vbuf;
   double *src = &T_electron[nzlo_out][nylo_out][nxlo_out];
@@ -407,7 +405,7 @@ void FixTTMGrid::pack_forward_grid(int flag, void *vbuf, int nlist, int *list)
    unpack another proc's own values from buf and set own ghost values
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::unpack_forward_grid(int flag, void *vbuf, int nlist, int *list)
+void FixTTMGrid::unpack_forward_grid(int /*flag*/, void *vbuf, int nlist, int *list)
 {
   double *buf = (double *) vbuf;
   double *dest = &T_electron[nzlo_out][nylo_out][nxlo_out];
@@ -420,7 +418,7 @@ void FixTTMGrid::unpack_forward_grid(int flag, void *vbuf, int nlist, int *list)
    pack ghost values into buf to send to another proc
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list)
+void FixTTMGrid::pack_reverse_grid(int /*flag*/, void *vbuf, int nlist, int *list)
 {
   double *buf = (double *) vbuf;
   double *src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out];
@@ -433,7 +431,7 @@ void FixTTMGrid::pack_reverse_grid(int flag, void *vbuf, int nlist, int *list)
    unpack another proc's ghost values from buf and add to own values
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::unpack_reverse_grid(int flag, void *vbuf, int nlist, int *list)
+void FixTTMGrid::unpack_reverse_grid(int /*flag*/, void *vbuf, int nlist, int *list)
 {
   double *buf = (double *) vbuf;
   double *dest = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out];
@@ -534,8 +532,6 @@ void FixTTMGrid::deallocate_grid()
 
 void FixTTMGrid::write_restart(FILE *fp)
 {
-  int ix,iy,iz;
-
   int rsize = nxgrid*nygrid*nzgrid + 4;
   double *rlist;
   memory->create(rlist,rsize,"ttm/grid:rlist");
@@ -608,7 +604,7 @@ void FixTTMGrid::restart(char *buf)
    used by which = 0 and 1
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::pack_gather_grid(int which, void *vbuf)
+void FixTTMGrid::pack_gather_grid(int /*which*/, void *vbuf)
 {
   int ix,iy,iz;
 
diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index cd60faae99..04bb166396 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -702,9 +702,6 @@ void FixTTMMod::end_of_step()
 {
   double **x = atom->x;
   double **v = atom->v;
-  double *mass = atom->mass;
-  double *rmass = atom->rmass;
-  int *type = atom->type;
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
diff --git a/src/gridcomm.cpp b/src/gridcomm.cpp
index 1463671316..dcf5fc6fe2 100644
--- a/src/gridcomm.cpp
+++ b/src/gridcomm.cpp
@@ -1132,8 +1132,8 @@ reverse_comm_tiled(T *ptr, int nper, int nbyte, int which,
    caller can decide whether to store chunks, output them, etc
 ------------------------------------------------------------------------- */
 
-void GridComm::gather(int caller, void *ptr, int nper, int nbyte, int which,
-                      void *buf, MPI_Datatype datatype)
+void GridComm::gather(int /*caller*/, void *ptr, int nper, int nbyte,
+                      int which, void *buf, MPI_Datatype datatype)
 {
   int me = comm->me;
   Fix *fptr = (Fix *) ptr;
@@ -1212,8 +1212,7 @@ void GridComm::gather(int caller, void *ptr, int nper, int nbyte, int which,
 void GridComm::grow_swap()
 {
   maxswap += DELTA;
-  swap = (Swap *)
-    memory->srealloc(swap,maxswap*sizeof(Swap),"GridComm:swap");
+  swap = (Swap *) memory->srealloc(swap,maxswap*sizeof(Swap),"GridComm:swap");
 }
 
 /* ----------------------------------------------------------------------

From 28b6649f0cc7bc6935bee56da6020b44e73fab21 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 20:31:58 -0400
Subject: [PATCH 178/437] whitespace

---
 src/INTEL/pppm_intel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/INTEL/pppm_intel.cpp b/src/INTEL/pppm_intel.cpp
index 53ab7c41bf..2392f84aa0 100644
--- a/src/INTEL/pppm_intel.cpp
+++ b/src/INTEL/pppm_intel.cpp
@@ -251,7 +251,7 @@ void PPPMIntel::compute_first(int eflag, int vflag)
   else
     gc->forward_comm(GridComm::KSPACE,this,3,sizeof(FFT_SCALAR),FORWARD_IK,
                      gc_buf1,gc_buf2,MPI_FFT_SCALAR);
-  
+
   // extra per-atom energy/virial communication
 
   if (evflag_atom) {

From 9c2b96286f7ab33f634b5d426a7088527dabc920 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 19:51:06 -0400
Subject: [PATCH 179/437] print GPU available info only when GPU package is
 included

---
 src/lammps.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/lammps.cpp b/src/lammps.cpp
index 5820a625d2..270b3c0584 100644
--- a/src/lammps.cpp
+++ b/src/lammps.cpp
@@ -1356,7 +1356,9 @@ void LAMMPS::print_config(FILE *fp)
 
   fmt::print(fp,"Accelerator configuration:\n\n{}\n",
              Info::get_accelerator_info());
+#if defined(LMP_GPU)
   fmt::print(fp,"GPU present: {}\n\n",Info::has_gpu_device() ? "yes" : "no");
+#endif
 
   fputs("Active compile time flags:\n\n",fp);
   if (Info::has_gzip_support()) fputs("-DLAMMPS_GZIP\n",fp);

From 59a6c08a43ea0989eb94dacd0f3e31fc0639850d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 19:38:29 -0400
Subject: [PATCH 180/437] correct spelling

---
 doc/src/pair_snap.rst | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst
index e00169b306..d78a68d9f5 100644
--- a/doc/src/pair_snap.rst
+++ b/doc/src/pair_snap.rst
@@ -191,22 +191,19 @@ pair_coeff command, to avoid ambiguity in the number of coefficients.
 
 The keywords *chunksize* and *parallelthresh* are only applicable when
 using the pair style *snap* with the KOKKOS package on GPUs and are
-ignored otherwise.
-The *chunksize* keyword controls
-the number of atoms in each pass used to compute the bispectrum
-components and is used to avoid running out of memory. For example
-if there are 8192 atoms in the simulation and the *chunksize*
-is set to 4096, the bispectrum calculation will be broken up
-into two passes (running on a single GPU).
-The *parallelthresh* keyword controls
-a crossover threshold for performing extra parallelism. For
-small systems, exposing additional parallism can be beneficial when
-there is not enough work to fully saturate the GPU threads otherwise.
-However, the extra parallelism also leads to more divergence
-and can hurt performance when the system is already large enough to
-saturate the GPU threads. Extra parallelism will be performed if the
-*chunksize* (or total number of atoms per GPU) is smaller than
-*parallelthresh*.
+ignored otherwise.  The *chunksize* keyword controls the number of atoms
+in each pass used to compute the bispectrum components and is used to
+avoid running out of memory. For example if there are 8192 atoms in the
+simulation and the *chunksize* is set to 4096, the bispectrum
+calculation will be broken up into two passes (running on a single GPU).
+The *parallelthresh* keyword controls a crossover threshold for
+performing extra parallelism. For small systems, exposing additional
+parallelism can be beneficial when there is not enough work to fully
+saturate the GPU threads otherwise.  However, the extra parallelism also
+leads to more divergence and can hurt performance when the system is
+already large enough to saturate the GPU threads. Extra parallelism will
+be performed if the *chunksize* (or total number of atoms per GPU) is
+smaller than *parallelthresh*.
 
 Detailed definitions for all the other keywords
 are given on the :doc:`compute sna/atom ` doc page.

From c779798f3f3d0729cd1a44406f1386d3e5916c71 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 19:38:48 -0400
Subject: [PATCH 181/437] properly disable clang-format processing

---
 src/KOKKOS/compute_temp_deform_kokkos.h | 2 +-
 src/KOKKOS/pppm_kokkos.cpp              | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/KOKKOS/compute_temp_deform_kokkos.h b/src/KOKKOS/compute_temp_deform_kokkos.h
index 8b53c1f633..0292c6776d 100644
--- a/src/KOKKOS/compute_temp_deform_kokkos.h
+++ b/src/KOKKOS/compute_temp_deform_kokkos.h
@@ -1,4 +1,3 @@
-// clang-format off
 /* -*- c++ -*- ----------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
@@ -20,6 +19,7 @@ ComputeStyle(temp/deform/kk/host,ComputeTempDeformKokkos);
 // clang-format on
 #else
 
+// clang-format off
 #ifndef LMP_COMPUTE_TEMP_DEFORM_KOKKOS_H
 #define LMP_COMPUTE_TEMP_DEFORM_KOKKOS_H
 
diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp
index a7f58f2525..d71d7d1bad 100644
--- a/src/KOKKOS/pppm_kokkos.cpp
+++ b/src/KOKKOS/pppm_kokkos.cpp
@@ -1,3 +1,4 @@
+// clang-format off
 /* ----------------------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories

From 6be84b72a801e6e39df4db7a52cb24b327db8c52 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 21:10:05 -0400
Subject: [PATCH 182/437] simplify and plug memory leak with file output

---
 src/EXTRA-FIX/fix_ttm.cpp      | 15 +++++--------
 src/EXTRA-FIX/fix_ttm.h        |  4 ++--
 src/EXTRA-FIX/fix_ttm_grid.cpp | 39 +++++++++++++++-------------------
 src/EXTRA-FIX/fix_ttm_grid.h   |  4 ++--
 4 files changed, 26 insertions(+), 36 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index fd36487b57..777100e039 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -463,13 +463,8 @@ void FixTTM::end_of_step()
 
   // output of grid electron temperatures to file
 
-  if (outfile && (update->ntimestep % outevery == 0)) {
-    char *newfile = new char[strlen(outfile) + 16];
-    strcpy(newfile,outfile);
-    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
-
-    write_electron_temperatures((const char *) newfile);
-  }
+  if (outfile && (update->ntimestep % outevery == 0))
+    write_electron_temperatures(fmt::format("{}.{}",outfile,update->ntimestep));
 }
 
 /* ----------------------------------------------------------------------
@@ -477,7 +472,7 @@ void FixTTM::end_of_step()
    only read by proc 0, grid values are Bcast to other procs
 ------------------------------------------------------------------------- */
 
-void FixTTM::read_electron_temperatures(const char *filename)
+void FixTTM::read_electron_temperatures(const std::string &filename)
 {
   int ***T_initial_set;
   memory->create(T_initial_set,nxgrid,nygrid,nzgrid,"ttm:T_initial_set");
@@ -534,11 +529,11 @@ void FixTTM::read_electron_temperatures(const char *filename)
    only written by proc 0
 ------------------------------------------------------------------------- */
 
-void FixTTM::write_electron_temperatures(const char *filename)
+void FixTTM::write_electron_temperatures(const std::string &filename)
 {
   if (comm->me) return;
 
-  FILE *fp = fopen(filename,"w");
+  FILE *fp = fopen(filename.c_str(),"w");
   if (!fp) error->one(FLERR,"Fix ttm could not open output file");
 
   int ix,iy,iz;
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index 601aae45ab..192cd53e9c 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -74,8 +74,8 @@ class FixTTM : public Fix {
 
   virtual void allocate_grid();
   virtual void deallocate_grid();
-  virtual void read_electron_temperatures(const char *);
-  virtual void write_electron_temperatures(const char *);
+  virtual void read_electron_temperatures(const std::string &);
+  virtual void write_electron_temperatures(const std::string &);
 };
 
 }    // namespace LAMMPS_NS
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 2fa3c65f27..f996ac5400 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -196,6 +196,8 @@ void FixTTMGrid::end_of_step()
   gc->reverse_comm(GridComm::FIX,this,1,sizeof(double),0,
                    gc_buf1,gc_buf2,MPI_DOUBLE);
 
+  // clang-format off
+
   // num_inner_timesteps = # of inner steps (thermal solves)
   // required this MD step to maintain a stable explicit solve
 
@@ -244,19 +246,15 @@ void FixTTMGrid::end_of_step()
 
     // communicate new T_electron values to ghost grid points
 
-    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
-                     gc_buf1,gc_buf2,MPI_DOUBLE);
+    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE);
   }
 
+  // clang-format on
+
   // output of grid temperatures to file
 
-  if (outfile && (update->ntimestep % outevery == 0)) {
-    char *newfile = new char[strlen(outfile) + 16];
-    strcpy(newfile,outfile);
-    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
-
-    write_electron_temperatures((const char *) newfile);
-  }
+  if (outfile && (update->ntimestep % outevery == 0))
+    write_electron_temperatures(fmt::format("{}.{}",outfile,update->ntimestep));
 }
 
 /* ----------------------------------------------------------------------
@@ -265,7 +263,7 @@ void FixTTMGrid::end_of_step()
    each proc stores values for grid points it owns
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::read_electron_temperatures(const char *filename)
+void FixTTMGrid::read_electron_temperatures(const std::string &filename)
 {
   int i,j,ix,iy,iz,nchunk,eof;
 
@@ -282,7 +280,8 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
 
   if (me == 0) {
     std::string name = utils::get_potential_file_path(filename);
-    if (name.empty()) error->one(FLERR,"Cannot open input file: {}",filename);
+    if (name.empty()) error->one(FLERR,"Cannot open input file: {}: {}",
+                                 filename, utils::getsyserror());
     fp = fopen(name.c_str(),"r");
   }
 
@@ -376,10 +375,10 @@ void FixTTMGrid::read_electron_temperatures(const char *filename)
    only written by proc 0
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::write_electron_temperatures(const char *filename)
+void FixTTMGrid::write_electron_temperatures(const std::string &filename)
 {
   if (comm->me == 0) {
-    FPout = fopen(filename,"w");
+    FPout = fopen(filename.c_str(),"w");
     if (!FPout) error->one(FLERR,"Fix ttm/grid could not open output file");
   }
 
@@ -595,8 +594,7 @@ void FixTTMGrid::restart(char *buf)
 
   // communicate new T_electron values to ghost grid points
 
-  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
-                   gc_buf1,gc_buf2,MPI_DOUBLE);
+  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE);
 }
 
 /* ----------------------------------------------------------------------
@@ -676,16 +674,13 @@ double FixTTMGrid::compute_vector(int n)
     for (iz = nzlo_in; iz <= nzhi_in; iz++)
       for (iy = nylo_in; iy <= nyhi_in; iy++)
         for (ix = nxlo_in; ix <= nxhi_in; ix++) {
-          e_energy_me +=
-            T_electron[iz][iy][ix]*electronic_specific_heat*
-            electronic_density*volgrid;
-          transfer_energy_me +=
-            net_energy_transfer[iz][iy][ix]*update->dt;
+          e_energy_me += T_electron[iz][iy][ix]*electronic_specific_heat
+            *electronic_density*volgrid;
+          transfer_energy_me += net_energy_transfer[iz][iy][ix]*update->dt;
         }
 
     MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world);
-    MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,
-                  MPI_SUM,world);
+    MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world);
     outflag = 1;
   }
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.h b/src/EXTRA-FIX/fix_ttm_grid.h
index 526306c6c7..46d5b67ec1 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.h
+++ b/src/EXTRA-FIX/fix_ttm_grid.h
@@ -61,8 +61,8 @@ class FixTTMGrid : public FixTTM {
 
   void allocate_grid();
   void deallocate_grid();
-  void read_electron_temperatures(const char *);
-  void write_electron_temperatures(const char *);
+  void read_electron_temperatures(const std::string &);
+  void write_electron_temperatures(const std::string &);
 };
 
 }    // namespace LAMMPS_NS

From 90d95466c2dd1599abf26b7f2ae2b99b14641c25 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 23:21:04 -0400
Subject: [PATCH 183/437] add UNITS: metadata

---
 examples/ttm/FeVoter-ChenRecheck.fs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/examples/ttm/FeVoter-ChenRecheck.fs b/examples/ttm/FeVoter-ChenRecheck.fs
index 1d7eb0bd3a..5623bfcec6 100644
--- a/examples/ttm/FeVoter-ChenRecheck.fs
+++ b/examples/ttm/FeVoter-ChenRecheck.fs
@@ -1,5 +1,5 @@
- My transcription of Voter Chen 
- from the potential file from Tim Germann 
+ UNITS: metal DATE: 2016-04-04
+ My transcription of Voter Chen from the potential file from Tim Germann
  4/4/2016 (Fembed, rhoatomic, phipair)
 1   Fe
 3000  2.7915816152066654e-6   10000  0.0004524   4.524
@@ -4603,4 +4603,4 @@
 -0.65207882068843E-4  -0.59001038022916E-4  -0.53101546975722E-4  -0.47509880257601E-4  -0.42226511086741E-4
 -0.37251915015477E-4  -0.32586565073856E-4  -0.28230939106284E-4  -0.24185513693527E-4  -0.20450765585832E-4
 -0.17027175308443E-4  -0.1391522080043E-4  -0.11115383496019E-4  -0.86281454348713E-5  -0.64539869572879E-5
--0.45933935663466E-5  -0.30468482236608E-5  -0.18148359506597E-5  -0.89784403731179E-6  -0.29635889385556E-6
\ No newline at end of file
+-0.45933935663466E-5  -0.30468482236608E-5  -0.18148359506597E-5  -0.89784403731179E-6  -0.29635889385556E-6

From e6a45c1fa7550fed3fe5d39764a7035a2a8c7c7e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 27 Aug 2021 23:23:12 -0400
Subject: [PATCH 184/437] refactor grid data file reader. support descriptive
 comment(s) and metadata

---
 src/EXTRA-FIX/fix_ttm.cpp      |  99 ++++++-----
 src/EXTRA-FIX/fix_ttm.h        |  21 ++-
 src/EXTRA-FIX/fix_ttm_grid.cpp | 292 ++++++++++++++++-----------------
 3 files changed, 210 insertions(+), 202 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 777100e039..5c0c7d7af7 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -27,12 +27,15 @@
 #include "memory.h"
 #include "random_mars.h"
 #include "respa.h"
+#include "text_file_reader.h"
 #include "tokenizer.h"
 #include "update.h"
+#include "fmt/chrono.h"
 
 #include 
 #include 
 #include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
@@ -91,16 +94,12 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
       iarg += 2;
     } else if (strcmp(arg[iarg],"infile") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm command");
-      int n = strlen(arg[iarg+1]) + 1;
-      infile = new char[n];
-      strcpy(infile,arg[iarg+1]);
+      infile = utils::strdup(arg[iarg+1]);
       iarg += 2;
     } else if (strcmp(arg[iarg],"outfile") == 0) {
       if (iarg+3 > narg) error->all(FLERR,"Illegal fix ttm command");
       outevery = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
-      int n = strlen(arg[iarg+2]) + 1;
-      outfile = new char[n];
-      strcpy(outfile,arg[iarg+2]);
+      outfile = utils::strdup(arg[iarg+2]);
       iarg += 3;
     } else error->all(FLERR,"Illegal fix ttm command");
   }
@@ -474,53 +473,58 @@ void FixTTM::end_of_step()
 
 void FixTTM::read_electron_temperatures(const std::string &filename)
 {
-  int ***T_initial_set;
-  memory->create(T_initial_set,nxgrid,nygrid,nzgrid,"ttm:T_initial_set");
-  memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
+  if (comm->me == 0) {
 
-  std::string name = utils::get_potential_file_path(filename);
-  if (name.empty())
-    error->one(FLERR,"Cannot open input file: {}",filename);
-  FILE *fp = fopen(name.c_str(),"r");
+    int ***T_initial_set;
+    memory->create(T_initial_set,nxgrid,nygrid,nzgrid,"ttm:T_initial_set");
+    memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
 
-  // read initial electron temperature values from file
+    // read initial electron temperature values from file
 
-  char line[MAXLINE];
-  int ix,iy,iz;
-  double T_tmp;
+    try {
+      int ix,iy,iz;
+      double T_tmp;
+      const char *line;
+      TextFileReader reader(filename, "electron temperature grid");
 
-  while (1) {
-    if (fgets(line,MAXLINE,fp) == nullptr) break;
-    ValueTokenizer values(line);
-    if (values.has_next()) ix = values.next_int();
-    if (values.has_next()) iy = values.next_int();
-    if (values.has_next()) iz = values.next_int();
-    if (values.has_next()) T_tmp  = values.next_double();
-    else error->one(FLERR,"Incorrect format in fix ttm input file");
+      while (1) {
+        line = reader.next_line();
+        if (!line) break;
 
-    // check correctness of input data
+        ValueTokenizer values(line);
+        if (values.count() != 4)
+          throw parser_error("Incorrect format in fix ttm electron grid file");
+        ix = values.next_int();
+        iy = values.next_int();
+        iz = values.next_int();
+        T_tmp  = values.next_double();
 
-    if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid))
-      error->one(FLERR,"Fix ttm invalid grid index in fix ttm input");
+        // check correctness of input data
 
-    if (T_tmp < 0.0) error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
+        if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid))
+          throw parser_error("Fix ttm invalid grid index in fix ttm input");
 
-    T_electron[iz][iy][ix] = T_tmp;
-    T_initial_set[iz][iy][ix] = 1;
+        if (T_tmp < 0.0)
+          throw parser_error("Fix ttm electron temperatures must be > 0.0");
+
+        T_electron[iz][iy][ix] = T_tmp;
+        T_initial_set[iz][iy][ix] = 1;
+      }
+    } catch (std::exception &e) {
+      error->one(FLERR, e.what());
+    }
+
+    // check completeness of input data
+
+    for (int iz = 0; iz < nzgrid; iz++)
+      for (int iy = 0; iy < nygrid; iy++)
+        for (int ix = 0; ix < nxgrid; ix++)
+          if (T_initial_set[iz][iy][ix] == 0)
+            error->all(FLERR,"Fix ttm infile did not set all temperatures");
+
+    memory->destroy(T_initial_set);
   }
 
-  fclose(fp);
-
-  // check completeness of input data
-
-  for (int iz = 0; iz < nzgrid; iz++)
-    for (int iy = 0; iy < nygrid; iy++)
-      for (int ix = 0; ix < nxgrid; ix++)
-        if (T_initial_set[iz][iy][ix] == 0)
-          error->all(FLERR,"Fix ttm infile did not set all temperatures");
-
-  memory->destroy(T_initial_set);
-
   MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);
 }
 
@@ -533,8 +537,15 @@ void FixTTM::write_electron_temperatures(const std::string &filename)
 {
   if (comm->me) return;
 
+  time_t tv = time(nullptr);
+  std::tm current_date = fmt::localtime(tv);
+
   FILE *fp = fopen(filename.c_str(),"w");
-  if (!fp) error->one(FLERR,"Fix ttm could not open output file");
+  if (!fp) error->one(FLERR,"Fix ttm could not open output file {}: {}",
+                      filename,utils::getsyserror());
+  fmt::print(fp,"# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature grid "
+             "at step {}. Created by fix {}\n",
+             current_date, update->unit_style, update->ntimestep, style);
 
   int ix,iy,iz;
 
diff --git a/src/EXTRA-FIX/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h
index 192cd53e9c..1a2e9fb24a 100644
--- a/src/EXTRA-FIX/fix_ttm.h
+++ b/src/EXTRA-FIX/fix_ttm.h
@@ -21,6 +21,7 @@ FixStyle(ttm,FixTTM);
 #define LMP_FIX_TTM_H
 
 #include "fix.h"
+#include 
 
 namespace LAMMPS_NS {
 
@@ -51,13 +52,13 @@ class FixTTM : public Fix {
  protected:
   int nlevels_respa;
   int seed;
-  int nxgrid, nygrid, nzgrid;     // size of global grid
-  int ngridtotal;                 // total size of global grid
+  int nxgrid, nygrid, nzgrid;    // size of global grid
+  int ngridtotal;                // total size of global grid
   int deallocate_flag;
-  int outflag,outevery;
-  double shift,tinit;
-  double e_energy,transfer_energy;
-  char *infile,*outfile;
+  int outflag, outevery;
+  double shift, tinit;
+  double e_energy, transfer_energy;
+  char *infile, *outfile;
 
   class RanMars *random;
   double electronic_specific_heat, electronic_density;
@@ -76,6 +77,14 @@ class FixTTM : public Fix {
   virtual void deallocate_grid();
   virtual void read_electron_temperatures(const std::string &);
   virtual void write_electron_temperatures(const std::string &);
+
+  class parser_error : public std::exception {
+    std::string message;
+
+   public:
+    parser_error(const std::string &mesg) { message = mesg; }
+    const char *what() const noexcept { return message.c_str(); }
+  };
 };
 
 }    // namespace LAMMPS_NS
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index f996ac5400..e19add47ff 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -28,10 +28,13 @@
 #include "memory.h"
 #include "neighbor.h"
 #include "random_mars.h"
+#include "tokenizer.h"
 #include "update.h"
+#include "fmt/chrono.h"
 
 #include 
 #include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
@@ -85,8 +88,7 @@ void FixTTMGrid::post_constructor()
 
   if (infile) {
     read_electron_temperatures(infile);
-    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,
-                     gc_buf1,gc_buf2,MPI_DOUBLE);
+    gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE);
   }
 }
 
@@ -254,7 +256,7 @@ void FixTTMGrid::end_of_step()
   // output of grid temperatures to file
 
   if (outfile && (update->ntimestep % outevery == 0))
-    write_electron_temperatures(fmt::format("{}.{}",outfile,update->ntimestep));
+    write_electron_temperatures(fmt::format("{}.{}", outfile, update->ntimestep));
 }
 
 /* ----------------------------------------------------------------------
@@ -265,90 +267,81 @@ void FixTTMGrid::end_of_step()
 
 void FixTTMGrid::read_electron_temperatures(const std::string &filename)
 {
-  int i,j,ix,iy,iz,nchunk,eof;
-
-  int me = comm->me;
-
   int ***T_initial_set;
-  memory->create3d_offset(T_initial_set,nzlo_in,nzhi_in,nylo_in,nyhi_in,
-                          nxlo_in,nxhi_in,"ttm/grid:T_initial_set");
-  memset(&T_initial_set[nzlo_in][nylo_in][nxlo_in],0,ngridmine*sizeof(int));
+  memory->create3d_offset(T_initial_set, nzlo_in, nzhi_in, nylo_in, nyhi_in, nxlo_in, nxhi_in,
+                          "ttm/grid:T_initial_set");
+  memset(&T_initial_set[nzlo_in][nylo_in][nxlo_in], 0, ngridmine * sizeof(int));
+
+  int i, j, ix, iy, iz, nchunk, eof;
+  FILE *fp = nullptr;
 
   // proc 0 opens file
 
-  FILE *fp = nullptr;
-
-  if (me == 0) {
-    std::string name = utils::get_potential_file_path(filename);
-    if (name.empty()) error->one(FLERR,"Cannot open input file: {}: {}",
-                                 filename, utils::getsyserror());
-    fp = fopen(name.c_str(),"r");
+  if (comm->me == 0) {
+    fp = utils::open_potential(filename, lmp, nullptr);
+    if (!fp) error->one(FLERR, "Cannot open grid file: {}: {}", filename, utils::getsyserror());
   }
 
   // read electron temperature values from file, one chunk at a time
 
-  char **values = new char*[4];
-  char *buffer = new char[CHUNK*MAXLINE];
+  char **values = new char *[4];
+  char *buffer = new char[CHUNK * MAXLINE];
   bigint ntotal = (bigint) nxgrid * nygrid * nzgrid;
   bigint nread = 0;
-  char *buf,*next;
+  char *buf, *next;
 
   while (nread < ntotal) {
-    nchunk = MIN(ntotal-nread,CHUNK);
-    eof = utils::read_lines_from_file(fp,nchunk,MAXLINE,buffer,me,world);
-    if (eof) error->all(FLERR,"Unexpected end of data file");
-
-    buf = buffer;
-    next = strchr(buf,'\n');
-    *next = '\0';
-    int nwords = utils::trim_and_count_words(buf);
-    *next = '\n';
-
-    if (nwords != 4) error->all(FLERR,"Incorrect format in fix ttm data file");
+    nchunk = MIN(ntotal - nread, CHUNK);
+    eof = utils::read_lines_from_file(fp, nchunk, MAXLINE, buffer, comm->me, world);
+    if (eof) error->all(FLERR, "Unexpected end of data file");
 
     // loop over lines of grid point values
     // tokenize the line into ix,iy,iz grid index plus temperature value
     // if I own grid point, store the value
 
+    buf = buffer;
     for (i = 0; i < nchunk; i++) {
-      next = strchr(buf,'\n');
+      next = strchr(buf, '\n');
+      *next = '\0';
 
-      for (j = 0; j < nwords; j++) {
-        buf += strspn(buf," \t\n\r\f");
-        buf[strcspn(buf," \t\n\r\f")] = '\0';
-        values[j] = buf;
-        buf += strlen(buf)+1;
+      try {
+        ValueTokenizer values(utils::trim_comment(buf));
+        if (values.count() == 0) {
+          // ignore comment only lines
+          --nread;
+        } else if (values.count() == 4) {
+
+          ix = values.next_int();
+          iy = values.next_int();
+          iz = values.next_int();
+
+          if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid || iz < 0 || iz >= nzgrid)
+            throw parser_error("Fix ttm/grid invalid grid index in input");
+
+          if (ix >= nxlo_in && ix <= nxhi_in && iy >= nylo_in && iy <= nyhi_in
+              && iz >= nzlo_in && iz <= nzhi_in) {
+            T_electron[iz][iy][ix] = values.next_double();
+            T_initial_set[iz][iy][ix] = 1;
+          }
+        } else {
+          throw parser_error("Incorrect format in fix ttm electron grid file");
+        }
+      } catch (std::exception &e) {
+        error->one(FLERR,e.what());
       }
-
-      ix = utils::inumeric(FLERR,values[0],false,lmp);
-      iy = utils::inumeric(FLERR,values[1],false,lmp);
-      iz = utils::inumeric(FLERR,values[2],false,lmp);
-
-      if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid ||
-          iz < 0 || iz >= nzgrid)
-        error->all(FLERR,"Fix ttm/grid invalid grid index in input");
-
-      if (ix >= nxlo_in && ix <= nxhi_in &&
-          iy >= nylo_in && iy <= nyhi_in &&
-          iz >= nzlo_in && iz <= nzhi_in) {
-        T_electron[iz][iy][ix] = utils::numeric(FLERR,values[3],true,lmp);
-        T_initial_set[iz][iy][ix] = 1;
-      }
-
       buf = next + 1;
     }
-
     nread += nchunk;
   }
 
   // close file
 
-  if (me == 0) fclose(fp);
+  if (comm->me == 0) fclose(fp);
 
   // clean up
 
-  delete [] values;
-  delete [] buffer;
+  delete[] values;
+  delete[] buffer;
 
   // check completeness of input data
 
@@ -357,17 +350,13 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
   for (iz = nzlo_in; iz <= nzhi_in; iz++)
     for (iy = nylo_in; iy <= nyhi_in; iy++)
       for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        if (T_initial_set[iz][iy][ix] == 0) {
-          flag = 1;
-          printf("UNSET %d %d %d\n",ix,iy,iz);
-        }
+        if (T_initial_set[iz][iy][ix] == 0) flag = 1;
 
   int flagall;
-  MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
-  if (flagall)
-    error->all(FLERR,"Fix ttm/grid infile did not set all temperatures");
+  MPI_Allreduce(&flag, &flagall, 1, MPI_INT, MPI_SUM, world);
+  if (flagall) error->all(FLERR, "Fix ttm/grid infile did not set all temperatures");
 
-  memory->destroy3d_offset(T_initial_set,nzlo_in,nylo_in,nxlo_in);
+  memory->destroy3d_offset(T_initial_set, nzlo_in, nylo_in, nxlo_in);
 }
 
 /* ----------------------------------------------------------------------
@@ -378,11 +367,19 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
 void FixTTMGrid::write_electron_temperatures(const std::string &filename)
 {
   if (comm->me == 0) {
-    FPout = fopen(filename.c_str(),"w");
-    if (!FPout) error->one(FLERR,"Fix ttm/grid could not open output file");
+    time_t tv = time(nullptr);
+    std::tm current_date = fmt::localtime(tv);
+
+    FPout = fopen(filename.c_str(), "w");
+    if (!FPout) error->one(FLERR, "Fix ttm/grid could not open output file");
+
+    fmt::print(FPout,
+               "# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature grid "
+               "at step {}. Created by fix {}\n",
+               current_date, update->unit_style, update->ntimestep, style);
   }
 
-  gc->gather(GridComm::FIX,this,1,sizeof(double),1,NULL,MPI_DOUBLE);
+  gc->gather(GridComm::FIX, this, 1, sizeof(double), 1, NULL, MPI_DOUBLE);
 
   if (comm->me == 0) fclose(FPout);
 }
@@ -396,8 +393,7 @@ void FixTTMGrid::pack_forward_grid(int /*flag*/, void *vbuf, int nlist, int *lis
   double *buf = (double *) vbuf;
   double *src = &T_electron[nzlo_out][nylo_out][nxlo_out];
 
-  for (int i = 0; i < nlist; i++)
-    buf[i] = src[list[i]];
+  for (int i = 0; i < nlist; i++) buf[i] = src[list[i]];
 }
 
 /* ----------------------------------------------------------------------
@@ -409,8 +405,7 @@ void FixTTMGrid::unpack_forward_grid(int /*flag*/, void *vbuf, int nlist, int *l
   double *buf = (double *) vbuf;
   double *dest = &T_electron[nzlo_out][nylo_out][nxlo_out];
 
-  for (int i = 0; i < nlist; i++)
-    dest[list[i]] = buf[i];
+  for (int i = 0; i < nlist; i++) dest[list[i]] = buf[i];
 }
 
 /* ----------------------------------------------------------------------
@@ -422,8 +417,7 @@ void FixTTMGrid::pack_reverse_grid(int /*flag*/, void *vbuf, int nlist, int *lis
   double *buf = (double *) vbuf;
   double *src = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out];
 
-  for (int i = 0; i < nlist; i++)
-    buf[i] = src[list[i]];
+  for (int i = 0; i < nlist; i++) buf[i] = src[list[i]];
 }
 
 /* ----------------------------------------------------------------------
@@ -435,8 +429,7 @@ void FixTTMGrid::unpack_reverse_grid(int /*flag*/, void *vbuf, int nlist, int *l
   double *buf = (double *) vbuf;
   double *dest = &net_energy_transfer[nzlo_out][nylo_out][nxlo_out];
 
-  for (int i = 0; i < nlist; i++)
-    dest[list[i]] += buf[i];
+  for (int i = 0; i < nlist; i++) dest[list[i]] += buf[i];
 }
 
 /* ----------------------------------------------------------------------
@@ -449,8 +442,8 @@ void FixTTMGrid::allocate_grid()
   // n xyz lo/hi in = lower/upper bounds of global grid this proc owns
   // indices range from 0 to N-1 inclusive in each dim
 
-  comm->partition_grid(nxgrid,nygrid,nzgrid,0.0,
-                       nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in);
+  comm->partition_grid(nxgrid, nygrid, nzgrid, 0.0, nxlo_in, nxhi_in, nylo_in, nyhi_in, nzlo_in,
+                       nzhi_in);
 
   // nlo,nhi = min/max index of global grid pt my owned atoms can be mapped to
   // finite difference stencil requires extra grid pt around my owned grid pts
@@ -460,54 +453,51 @@ void FixTTMGrid::allocate_grid()
   double *boxlo = domain->boxlo;
   double *sublo = domain->sublo;
   double *subhi = domain->subhi;
-  double dxinv = nxgrid/domain->xprd;
-  double dyinv = nxgrid/domain->yprd;
-  double dzinv = nxgrid/domain->zprd;
+  double dxinv = nxgrid / domain->xprd;
+  double dyinv = nxgrid / domain->yprd;
+  double dzinv = nxgrid / domain->zprd;
 
-  int nlo,nhi;
-  double cuthalf = 0.5*neighbor->skin;
+  int nlo, nhi;
+  double cuthalf = 0.5 * neighbor->skin;
 
-  nlo = static_cast ((sublo[0]-cuthalf-boxlo[0])*dxinv + shift) - OFFSET;
-  nhi = static_cast ((subhi[0]+cuthalf-boxlo[0])*dxinv + shift) - OFFSET;
-  nxlo_out = MIN(nlo,nxlo_in-1);
-  nxhi_out = MAX(nhi,nxhi_in+1);
+  nlo = static_cast((sublo[0] - cuthalf - boxlo[0]) * dxinv + shift) - OFFSET;
+  nhi = static_cast((subhi[0] + cuthalf - boxlo[0]) * dxinv + shift) - OFFSET;
+  nxlo_out = MIN(nlo, nxlo_in - 1);
+  nxhi_out = MAX(nhi, nxhi_in + 1);
 
-  nlo = static_cast ((sublo[1]-cuthalf-boxlo[1])*dyinv + shift) - OFFSET;
-  nhi = static_cast ((subhi[1]+cuthalf-boxlo[1])*dyinv + shift) - OFFSET;
-  nylo_out = MIN(nlo,nylo_in-1);
-  nyhi_out = MAX(nhi,nyhi_in+1);
+  nlo = static_cast((sublo[1] - cuthalf - boxlo[1]) * dyinv + shift) - OFFSET;
+  nhi = static_cast((subhi[1] + cuthalf - boxlo[1]) * dyinv + shift) - OFFSET;
+  nylo_out = MIN(nlo, nylo_in - 1);
+  nyhi_out = MAX(nhi, nyhi_in + 1);
 
-  nlo = static_cast ((sublo[2]-cuthalf-boxlo[2])*dzinv + shift) - OFFSET;
-  nhi = static_cast ((subhi[2]+cuthalf-boxlo[2])*dzinv + shift) - OFFSET;
-  nzlo_out = MIN(nlo,nzlo_in-1);
-  nzhi_out = MAX(nhi,nzhi_in+1);
+  nlo = static_cast((sublo[2] - cuthalf - boxlo[2]) * dzinv + shift) - OFFSET;
+  nhi = static_cast((subhi[2] + cuthalf - boxlo[2]) * dzinv + shift) - OFFSET;
+  nzlo_out = MIN(nlo, nzlo_in - 1);
+  nzhi_out = MAX(nhi, nzhi_in + 1);
 
   bigint totalmine;
-  totalmine = (bigint) (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) *
-    (nzhi_out-nzlo_out+1);
-  if (totalmine > MAXSMALLINT)
-    error->one(FLERR,"Too many owned+ghost grid points in fix ttm");
+  totalmine =
+      (bigint) (nxhi_out - nxlo_out + 1) * (nyhi_out - nylo_out + 1) * (nzhi_out - nzlo_out + 1);
+  if (totalmine > MAXSMALLINT) error->one(FLERR, "Too many owned+ghost grid points in fix ttm");
   ngridout = totalmine;
 
-  totalmine = (bigint) (nxhi_in-nxlo_in+1) * (nyhi_in-nylo_in+1) *
-    (nzhi_in-nzlo_in+1);
+  totalmine = (bigint) (nxhi_in - nxlo_in + 1) * (nyhi_in - nylo_in + 1) * (nzhi_in - nzlo_in + 1);
   ngridmine = totalmine;
 
-  gc = new GridComm(lmp,world,nxgrid,nygrid,nzgrid,
-                    nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in,
-                    nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out);
+  gc = new GridComm(lmp, world, nxgrid, nygrid, nzgrid, nxlo_in, nxhi_in, nylo_in, nyhi_in, nzlo_in,
+                    nzhi_in, nxlo_out, nxhi_out, nylo_out, nyhi_out, nzlo_out, nzhi_out);
 
-  gc->setup(ngc_buf1,ngc_buf2);
+  gc->setup(ngc_buf1, ngc_buf2);
 
-  memory->create(gc_buf1,ngc_buf1,"ttm/grid:gc_buf1");
-  memory->create(gc_buf2,ngc_buf2,"ttm/grid:gc_buf2");
+  memory->create(gc_buf1, ngc_buf1, "ttm/grid:gc_buf1");
+  memory->create(gc_buf2, ngc_buf2, "ttm/grid:gc_buf2");
 
-  memory->create3d_offset(T_electron_old,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm/grid:T_electron_old");
-  memory->create3d_offset(T_electron,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm/grid:T_electron");
-  memory->create3d_offset(net_energy_transfer,nzlo_out,nzhi_out,nylo_out,nyhi_out,
-                          nxlo_out,nxhi_out,"ttm/grid:net_energy_transfer");
+  memory->create3d_offset(T_electron_old, nzlo_out, nzhi_out, nylo_out, nyhi_out, nxlo_out,
+                          nxhi_out, "ttm/grid:T_electron_old");
+  memory->create3d_offset(T_electron, nzlo_out, nzhi_out, nylo_out, nyhi_out, nxlo_out, nxhi_out,
+                          "ttm/grid:T_electron");
+  memory->create3d_offset(net_energy_transfer, nzlo_out, nzhi_out, nylo_out, nyhi_out, nxlo_out,
+                          nxhi_out, "ttm/grid:net_energy_transfer");
 }
 
 /* ----------------------------------------------------------------------
@@ -520,9 +510,9 @@ void FixTTMGrid::deallocate_grid()
   memory->destroy(gc_buf1);
   memory->destroy(gc_buf2);
 
-  memory->destroy3d_offset(T_electron_old,nzlo_out,nylo_out,nxlo_out);
-  memory->destroy3d_offset(T_electron,nzlo_out,nylo_out,nxlo_out);
-  memory->destroy3d_offset(net_energy_transfer,nzlo_out,nylo_out,nxlo_out);
+  memory->destroy3d_offset(T_electron_old, nzlo_out, nylo_out, nxlo_out);
+  memory->destroy3d_offset(T_electron, nzlo_out, nylo_out, nxlo_out);
+  memory->destroy3d_offset(net_energy_transfer, nzlo_out, nylo_out, nxlo_out);
 }
 
 /* ----------------------------------------------------------------------
@@ -531,9 +521,9 @@ void FixTTMGrid::deallocate_grid()
 
 void FixTTMGrid::write_restart(FILE *fp)
 {
-  int rsize = nxgrid*nygrid*nzgrid + 4;
+  int rsize = nxgrid * nygrid * nzgrid + 4;
   double *rlist;
-  memory->create(rlist,rsize,"ttm/grid:rlist");
+  memory->create(rlist, rsize, "ttm/grid:rlist");
 
   int n = 0;
   rlist[n++] = nxgrid;
@@ -543,12 +533,12 @@ void FixTTMGrid::write_restart(FILE *fp)
 
   // gather rest of rlist on proc 0 as global grid values
 
-  gc->gather(GridComm::FIX,this,1,sizeof(double),0,&rlist[4],MPI_DOUBLE);
+  gc->gather(GridComm::FIX, this, 1, sizeof(double), 0, &rlist[4], MPI_DOUBLE);
 
   if (comm->me == 0) {
     int size = rsize * sizeof(double);
-    fwrite(&size,sizeof(int),1,fp);
-    fwrite(rlist,sizeof(double),rsize,fp);
+    fwrite(&size, sizeof(int), 1, fp);
+    fwrite(rlist, sizeof(double), rsize, fp);
   }
 
   memory->destroy(rlist);
@@ -560,26 +550,26 @@ void FixTTMGrid::write_restart(FILE *fp)
 
 void FixTTMGrid::restart(char *buf)
 {
-  int ix,iy,iz;
+  int ix, iy, iz;
 
   int n = 0;
   double *rlist = (double *) buf;
 
   // check that restart grid size is same as current grid size
 
-  int nxgrid_old = static_cast (rlist[n++]);
-  int nygrid_old = static_cast (rlist[n++]);
-  int nzgrid_old = static_cast (rlist[n++]);
+  int nxgrid_old = static_cast(rlist[n++]);
+  int nygrid_old = static_cast(rlist[n++]);
+  int nzgrid_old = static_cast(rlist[n++]);
 
   if (nxgrid_old != nxgrid || nygrid_old != nygrid || nzgrid_old != nzgrid)
-    error->all(FLERR,"Must restart fix ttm/grid with same grid size");
+    error->all(FLERR, "Must restart fix ttm/grid with same grid size");
 
   // change RN seed from initial seed, to avoid same Langevin factors
   // just increment by 1, since for RanMars that is a new RN stream
 
-  seed = static_cast (rlist[n++]) + 1;
+  seed = static_cast(rlist[n++]) + 1;
   delete random;
-  random = new RanMars(lmp,seed+comm->me);
+  random = new RanMars(lmp, seed + comm->me);
 
   // extract this proc's local grid values from global grid in rlist
 
@@ -588,13 +578,13 @@ void FixTTMGrid::restart(char *buf)
   for (iz = nzlo_in; iz <= nzhi_in; iz++)
     for (iy = nylo_in; iy <= nyhi_in; iy++)
       for (ix = nxlo_in; ix <= nxhi_in; ix++) {
-        iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
-        T_electron[iz][iy][ix] = rlist[n+iglobal];
+        iglobal = nygrid * nxgrid * iz + nxgrid * iy + ix;
+        T_electron[iz][iy][ix] = rlist[n + iglobal];
       }
 
   // communicate new T_electron values to ghost grid points
 
-  gc->forward_comm(GridComm::FIX,this,1,sizeof(double),0,gc_buf1,gc_buf2,MPI_DOUBLE);
+  gc->forward_comm(GridComm::FIX, this, 1, sizeof(double), 0, gc_buf1, gc_buf2, MPI_DOUBLE);
 }
 
 /* ----------------------------------------------------------------------
@@ -604,15 +594,14 @@ void FixTTMGrid::restart(char *buf)
 
 void FixTTMGrid::pack_gather_grid(int /*which*/, void *vbuf)
 {
-  int ix,iy,iz;
+  int ix, iy, iz;
 
   double *buf = (double *) vbuf;
 
   int m = 0;
   for (iz = nzlo_in; iz <= nzhi_in; iz++)
     for (iy = nylo_in; iy <= nyhi_in; iy++)
-      for (ix = nxlo_in; ix <= nxhi_in; ix++)
-        buf[m++] = T_electron[iz][iy][ix];
+      for (ix = nxlo_in; ix <= nxhi_in; ix++) buf[m++] = T_electron[iz][iy][ix];
 }
 
 /* ----------------------------------------------------------------------
@@ -620,11 +609,10 @@ void FixTTMGrid::pack_gather_grid(int /*which*/, void *vbuf)
    which = 1: print values from buf to FPout file
 ------------------------------------------------------------------------- */
 
-void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
-                                    int xlo, int xhi, int ylo, int yhi,
-                                    int zlo, int zhi)
+void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf, int xlo, int xhi, int ylo,
+                                    int yhi, int zlo, int zhi)
 {
-  int ix,iy,iz;
+  int ix, iy, iz;
 
   double *buf = (double *) vbuf;
   double *gbuf = (double *) vgbuf;
@@ -636,7 +624,7 @@ void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
     for (iz = zlo; iz <= zhi; iz++)
       for (iy = ylo; iy <= yhi; iy++)
         for (ix = xlo; ix <= xhi; ix++) {
-          iglobal = nygrid*nxgrid*iz + nxgrid*iy + ix;
+          iglobal = nygrid * nxgrid * iz + nxgrid * iy + ix;
           gbuf[iglobal] = buf[ilocal++];
         }
 
@@ -648,7 +636,7 @@ void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
       for (iy = ylo; iy <= yhi; iy++)
         for (ix = xlo; ix <= xhi; ix++) {
           value = buf[ilocal++];
-          fprintf(FPout,"%d %d %d %20.16g\n",ix,iy,iz,value);
+          fprintf(FPout, "%d %d %d %20.16g\n", ix, iy, iz, value);
         }
   }
 }
@@ -660,13 +648,13 @@ void FixTTMGrid::unpack_gather_grid(int which, void *vbuf, void *vgbuf,
 
 double FixTTMGrid::compute_vector(int n)
 {
-  int ix,iy,iz;
+  int ix, iy, iz;
 
   if (outflag == 0) {
-    double dx = domain->xprd/nxgrid;
-    double dy = domain->yprd/nygrid;
-    double dz = domain->zprd/nzgrid;
-    double volgrid = dx*dy*dz;
+    double dx = domain->xprd / nxgrid;
+    double dy = domain->yprd / nygrid;
+    double dz = domain->zprd / nzgrid;
+    double volgrid = dx * dy * dz;
 
     double e_energy_me = 0.0;
     double transfer_energy_me = 0.0;
@@ -674,13 +662,13 @@ double FixTTMGrid::compute_vector(int n)
     for (iz = nzlo_in; iz <= nzhi_in; iz++)
       for (iy = nylo_in; iy <= nyhi_in; iy++)
         for (ix = nxlo_in; ix <= nxhi_in; ix++) {
-          e_energy_me += T_electron[iz][iy][ix]*electronic_specific_heat
-            *electronic_density*volgrid;
-          transfer_energy_me += net_energy_transfer[iz][iy][ix]*update->dt;
+          e_energy_me +=
+              T_electron[iz][iy][ix] * electronic_specific_heat * electronic_density * volgrid;
+          transfer_energy_me += net_energy_transfer[iz][iy][ix] * update->dt;
         }
 
-    MPI_Allreduce(&e_energy_me,&e_energy,1,MPI_DOUBLE,MPI_SUM,world);
-    MPI_Allreduce(&transfer_energy_me,&transfer_energy,1,MPI_DOUBLE,MPI_SUM,world);
+    MPI_Allreduce(&e_energy_me, &e_energy, 1, MPI_DOUBLE, MPI_SUM, world);
+    MPI_Allreduce(&transfer_energy_me, &transfer_energy, 1, MPI_DOUBLE, MPI_SUM, world);
     outflag = 1;
   }
 
@@ -696,7 +684,7 @@ double FixTTMGrid::compute_vector(int n)
 double FixTTMGrid::memory_usage()
 {
   double bytes = 0.0;
-  bytes += (double)3*atom->nmax * sizeof(double);
-  bytes += (double)3*ngridout * sizeof(double);
+  bytes += (double) 3 * atom->nmax * sizeof(double);
+  bytes += (double) 3 * ngridout * sizeof(double);
   return bytes;
 }

From da1fb924bb2233ba7e373905e46954f0a7ab6d80 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sat, 28 Aug 2021 05:24:21 -0400
Subject: [PATCH 185/437] modernize code some more. avoid string pointer magic.

---
 src/EXTRA-FIX/fix_ttm.cpp      | 29 +++++++++++---------------
 src/EXTRA-FIX/fix_ttm_grid.cpp | 38 ++++++++++++----------------------
 2 files changed, 25 insertions(+), 42 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 5c0c7d7af7..2509c2b2df 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -27,7 +27,7 @@
 #include "memory.h"
 #include "random_mars.h"
 #include "respa.h"
-#include "text_file_reader.h"
+#include "potential_file_reader.h"
 #include "tokenizer.h"
 #include "update.h"
 #include "fmt/chrono.h"
@@ -389,8 +389,7 @@ void FixTTM::end_of_step()
     }
 
   outflag = 0;
-  MPI_Allreduce(&net_energy_transfer[0][0][0],
-                &net_energy_transfer_all[0][0][0],
+  MPI_Allreduce(&net_energy_transfer[0][0][0],&net_energy_transfer_all[0][0][0],
                 ngridtotal,MPI_DOUBLE,MPI_SUM,world);
 
   double dx = domain->xprd/nxgrid;
@@ -480,24 +479,20 @@ void FixTTM::read_electron_temperatures(const std::string &filename)
     memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
 
     // read initial electron temperature values from file
+    bigint nread = 0;
 
     try {
-      int ix,iy,iz;
-      double T_tmp;
-      const char *line;
-      TextFileReader reader(filename, "electron temperature grid");
+      PotentialFileReader reader(lmp, filename, "electron temperature grid");
 
-      while (1) {
-        line = reader.next_line();
-        if (!line) break;
+      while (nread < ngridtotal) {
+        // reader will skip over comment-only lines
+        auto values = reader.next_values(4);
+        ++nread;
 
-        ValueTokenizer values(line);
-        if (values.count() != 4)
-          throw parser_error("Incorrect format in fix ttm electron grid file");
-        ix = values.next_int();
-        iy = values.next_int();
-        iz = values.next_int();
-        T_tmp  = values.next_double();
+        int ix = values.next_int();
+        int iy = values.next_int();
+        int iz = values.next_int();
+        double T_tmp  = values.next_double();
 
         // check correctness of input data
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index e19add47ff..4de16164bd 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -272,11 +272,9 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
                           "ttm/grid:T_initial_set");
   memset(&T_initial_set[nzlo_in][nylo_in][nxlo_in], 0, ngridmine * sizeof(int));
 
-  int i, j, ix, iy, iz, nchunk, eof;
-  FILE *fp = nullptr;
-
   // proc 0 opens file
 
+  FILE *fp = nullptr;
   if (comm->me == 0) {
     fp = utils::open_potential(filename, lmp, nullptr);
     if (!fp) error->one(FLERR, "Cannot open grid file: {}: {}", filename, utils::getsyserror());
@@ -284,36 +282,30 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
 
   // read electron temperature values from file, one chunk at a time
 
-  char **values = new char *[4];
   char *buffer = new char[CHUNK * MAXLINE];
   bigint ntotal = (bigint) nxgrid * nygrid * nzgrid;
   bigint nread = 0;
-  char *buf, *next;
 
   while (nread < ntotal) {
-    nchunk = MIN(ntotal - nread, CHUNK);
-    eof = utils::read_lines_from_file(fp, nchunk, MAXLINE, buffer, comm->me, world);
+    int nchunk = MIN(ntotal - nread, CHUNK);
+    int eof = utils::read_lines_from_file(fp, nchunk, MAXLINE, buffer, comm->me, world);
     if (eof) error->all(FLERR, "Unexpected end of data file");
 
     // loop over lines of grid point values
     // tokenize the line into ix,iy,iz grid index plus temperature value
     // if I own grid point, store the value
 
-    buf = buffer;
-    for (i = 0; i < nchunk; i++) {
-      next = strchr(buf, '\n');
-      *next = '\0';
-
+    for (const auto &line : utils::split_lines(buffer)) {
       try {
-        ValueTokenizer values(utils::trim_comment(buf));
+        ValueTokenizer values(utils::trim_comment(line));
         if (values.count() == 0) {
-          // ignore comment only lines
-          --nread;
+          ; // ignore comment only lines
         } else if (values.count() == 4) {
+          ++nread;
 
-          ix = values.next_int();
-          iy = values.next_int();
-          iz = values.next_int();
+          int ix = values.next_int();
+          int iy = values.next_int();
+          int iz = values.next_int();
 
           if (ix < 0 || ix >= nxgrid || iy < 0 || iy >= nygrid || iz < 0 || iz >= nzgrid)
             throw parser_error("Fix ttm/grid invalid grid index in input");
@@ -329,9 +321,7 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
       } catch (std::exception &e) {
         error->one(FLERR,e.what());
       }
-      buf = next + 1;
     }
-    nread += nchunk;
   }
 
   // close file
@@ -340,16 +330,14 @@ void FixTTMGrid::read_electron_temperatures(const std::string &filename)
 
   // clean up
 
-  delete[] values;
   delete[] buffer;
 
   // check completeness of input data
 
   int flag = 0;
-
-  for (iz = nzlo_in; iz <= nzhi_in; iz++)
-    for (iy = nylo_in; iy <= nyhi_in; iy++)
-      for (ix = nxlo_in; ix <= nxhi_in; ix++)
+  for (int iz = nzlo_in; iz <= nzhi_in; iz++)
+    for (int iy = nylo_in; iy <= nyhi_in; iy++)
+      for (int ix = nxlo_in; ix <= nxhi_in; ix++)
         if (T_initial_set[iz][iy][ix] == 0) flag = 1;
 
   int flagall;

From f49b94e12662a3d6f843aa4611d59567df2ae5d9 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sat, 28 Aug 2021 07:42:55 -0400
Subject: [PATCH 186/437] update docs. mention support for comments in electron
 temperature grid files

---
 doc/src/fix_ttm.rst | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index 8136bf5d35..2ca39da011 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -184,19 +184,21 @@ subsystem.
 The *set* keyword specifies a *Tinit* temperature value to initialize
 the value stored on all grid points.
 
-The *infile* keyword specifies an input file of electronic
-temperatures for each grid point to be read in to initialize the grid.
-By default the temperatures are all zero when the grid is created.
-The input file is a text file with no header.  Each line contains four
-numeric columns: ix,iy,iz,Temperature.  The number of lines must be
-equal to the number of user-specified grid points (Nx by Ny by Nz).
-The ix,iy,iz are grid point indices ranging from 0 to nxnodes-1
-inclusive in each dimension.  The lines can appear in any order.  For
-example, the initial electronic temperatures on a 1 by 2 by 3 grid
-could be specified in the file as follows:
+The *infile* keyword specifies an input file of electronic temperatures
+for each grid point to be read in to initialize the grid.  By default
+the temperatures are all zero when the grid is created.  The input file
+is a text file which may have comments starting with the '#' character.
+Each line contains four numeric columns: ix,iy,iz,Temperature.  Empty
+or comment-only lines will be ignored. The
+number of lines must be equal to the number of user-specified grid
+points (Nx by Ny by Nz).  The ix,iy,iz are grid point indices ranging
+from 0 to nxnodes-1 inclusive in each dimension.  The lines can appear
+in any order.  For example, the initial electronic temperatures on a 1
+by 2 by 3 grid could be specified in the file as follows:
 
 .. parsed-literal::
 
+   # UNITS: metal COMMENT: initial electron temperature
    0 0 0 1.0
    0 0 1 1.0
    0 0 2 1.0
@@ -207,7 +209,9 @@ could be specified in the file as follows:
 where the electronic temperatures along the y=0 plane have been set to
 1.0, and the electronic temperatures along the y=1 plane have been set
 to 2.0.  If all the grid point values are not specified, LAMMPS will
-generate an error.
+generate an error. LAMMPS will check if a "UNITS:" tag is in the first
+line and stop with an error, if there is a mismatch with the current
+units used.
 
 ..note::
 
@@ -220,7 +224,9 @@ The *outfile* keyword has 2 values.  The first value *Nout* triggers
 output of the electronic temperatures for each grid point every Nout
 timesteps.  The second value is the filename for output which will
 be suffixed by the timestep.  The format of each output file is exactly
-the same as the input temperature file.
+the same as the input temperature file. It will contain a comment in
+the first line reporting the date the file was created, the LAMMPS
+units setting in use, grid size and the current timestep.
 
 Note that the atomic temperature for atoms in each grid cell can also
 be computed and output by the :doc:`fix ave/chunk `

From 1e37595055731e4ebc8707d678d9a51b51b37c30 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sat, 28 Aug 2021 07:43:18 -0400
Subject: [PATCH 187/437] pretty

---
 src/EXTRA-FIX/fix_ttm.cpp      | 15 +++++----------
 src/EXTRA-FIX/fix_ttm_grid.cpp |  7 +++----
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp
index 2509c2b2df..a8db3ad9de 100644
--- a/src/EXTRA-FIX/fix_ttm.cpp
+++ b/src/EXTRA-FIX/fix_ttm.cpp
@@ -33,15 +33,11 @@
 #include "fmt/chrono.h"
 
 #include 
-#include 
 #include 
-#include 
 
 using namespace LAMMPS_NS;
 using namespace FixConst;
 
-#define MAXLINE 1024
-
 // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
 // SHIFT = 0.0 assigns atoms to lower-left grid pt
 // SHIFT = 0.5 assigns atoms to nearest grid pt
@@ -235,8 +231,7 @@ void FixTTM::init()
   //   and create a new GridComm, and pass old GC data to new GC
 
   if (domain->box_change)
-    error->all(FLERR,"Cannot use fix ttm with "
-               "changing box shape, size, or sub-domains");
+    error->all(FLERR,"Cannot use fix ttm with changing box shape, size, or sub-domains");
 
   // set force prefactors
 
@@ -497,7 +492,7 @@ void FixTTM::read_electron_temperatures(const std::string &filename)
         // check correctness of input data
 
         if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid))
-          throw parser_error("Fix ttm invalid grid index in fix ttm input");
+          throw parser_error("Fix ttm invalid grid index in fix ttm grid file");
 
         if (T_tmp < 0.0)
           throw parser_error("Fix ttm electron temperatures must be > 0.0");
@@ -538,9 +533,9 @@ void FixTTM::write_electron_temperatures(const std::string &filename)
   FILE *fp = fopen(filename.c_str(),"w");
   if (!fp) error->one(FLERR,"Fix ttm could not open output file {}: {}",
                       filename,utils::getsyserror());
-  fmt::print(fp,"# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature grid "
-             "at step {}. Created by fix {}\n",
-             current_date, update->unit_style, update->ntimestep, style);
+  fmt::print(fp,"# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature "
+             "{}x{}x{} grid at step {}. Created by fix {}\n", current_date,
+             update->unit_style, nxgrid, nygrid, nzgrid, update->ntimestep, style);
 
   int ix,iy,iz;
 
diff --git a/src/EXTRA-FIX/fix_ttm_grid.cpp b/src/EXTRA-FIX/fix_ttm_grid.cpp
index 4de16164bd..3c1c1b2695 100644
--- a/src/EXTRA-FIX/fix_ttm_grid.cpp
+++ b/src/EXTRA-FIX/fix_ttm_grid.cpp
@@ -361,10 +361,9 @@ void FixTTMGrid::write_electron_temperatures(const std::string &filename)
     FPout = fopen(filename.c_str(), "w");
     if (!FPout) error->one(FLERR, "Fix ttm/grid could not open output file");
 
-    fmt::print(FPout,
-               "# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature grid "
-               "at step {}. Created by fix {}\n",
-               current_date, update->unit_style, update->ntimestep, style);
+    fmt::print(FPout,"# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature "
+               "{}x{}x{} grid at step {}. Created by fix {}\n", current_date,
+               update->unit_style, nxgrid, nygrid, nzgrid, update->ntimestep, style);
   }
 
   gc->gather(GridComm::FIX, this, 1, sizeof(double), 1, NULL, MPI_DOUBLE);

From 993826989cbad376e3879330a218cda5d1291744 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sat, 28 Aug 2021 07:44:06 -0400
Subject: [PATCH 188/437] modernize fix ttm/mod implementation and align with
 fix ttm

---
 src/EXTRA-FIX/fix_ttm_mod.cpp | 670 ++++++++++++++++------------------
 src/EXTRA-FIX/fix_ttm_mod.h   |  23 +-
 2 files changed, 337 insertions(+), 356 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 04bb166396..07f3055b37 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -30,8 +30,10 @@
 #include "memory.h"
 #include "random_mars.h"
 #include "respa.h"
+#include "potential_file_reader.h"
 #include "tokenizer.h"
 #include "update.h"
+#include "fmt/chrono.h"
 
 #include 
 #include 
@@ -40,17 +42,12 @@ using namespace LAMMPS_NS;
 using namespace FixConst;
 using namespace MathConst;
 
-#define MAXLINE 1024
-
 // OFFSET avoids outside-of-box atoms being rounded to grid pts incorrectly
 // SHIFT = 0.0 assigns atoms to lower-left grid pt
 // SHIFT = 0.5 assigns atoms to nearest grid pt
 // use SHIFT = 0.0 for now since it allows fix ave/chunk
 //   to spatially average consistent with the TTM grid
 
-#define OFFSET 16384
-#define SHIFT 0.0
-
 static const char cite_fix_ttm_mod[] =
   "fix ttm/mod command:\n\n"
   "@article{Pisarev2014,\n"
@@ -71,6 +68,8 @@ static const char cite_fix_ttm_mod[] =
   "pages = {129--139},\n"
   "year = {2013}\n"
   "}\n\n";
+static constexpr int OFFSET = 16384;
+static constexpr double SHIFT = 0.0;
 
 /* ---------------------------------------------------------------------- */
 
@@ -96,9 +95,9 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
 
   seed = utils::inumeric(FLERR,arg[3],false,lmp);
 
-  nxnodes = utils::inumeric(FLERR,arg[5],false,lmp);
-  nynodes = utils::inumeric(FLERR,arg[6],false,lmp);
-  nznodes = utils::inumeric(FLERR,arg[7],false,lmp);
+  nxgrid = utils::inumeric(FLERR,arg[5],false,lmp);
+  nygrid = utils::inumeric(FLERR,arg[6],false,lmp);
+  nzgrid = utils::inumeric(FLERR,arg[7],false,lmp);
 
   double tinit = 0.0;
   infile = outfile = NULL;
@@ -113,16 +112,12 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
       iarg += 2;
     } else if (strcmp(arg[iarg],"infile") == 0) {
       if (iarg+2 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
-      int n = strlen(arg[iarg+1]) + 1;
-      infile = new char[n];
-      strcpy(infile,arg[iarg+1]);
+      infile = utils::strdup(arg[iarg+1]);
       iarg += 2;
     } else if (strcmp(arg[iarg],"outfile") == 0) {
       if (iarg+3 > narg) error->all(FLERR,"Illegal fix ttm/mod command");
       outevery = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
-      int n = strlen(arg[iarg+2]) + 1;
-      outfile = new char[n];
-      strcpy(outfile,arg[iarg+2]);
+      outfile = utils::strdup(arg[iarg+2]);
       iarg += 3;
     } else error->all(FLERR,"Illegal fix ttm/mod command");
   }
@@ -131,15 +126,15 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
 
   if (seed <= 0)
     error->all(FLERR,"Invalid random number seed in fix ttm/mod command");
-  if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0)
+  if (nxgrid <= 0 || nygrid <= 0 || nzgrid <= 0)
     error->all(FLERR,"Fix ttm/mod grid sizes must be > 0");
 
   // check for allowed maximum number of total grid points
 
-  bigint total_nnodes = (bigint) nxnodes * nynodes * nznodes;
-  if (total_nnodes > MAXSMALLINT)
+  bigint total_ngrid = (bigint) nxgrid * nygrid * nzgrid;
+  if (total_ngrid > MAXSMALLINT)
     error->all(FLERR,"Too many grid points in fix ttm/mod");
-  ngridtotal = total_nnodes;
+  ngridtotal = total_ngrid;
 
   // t_surface is determined by electronic temperature (not constant)
 
@@ -149,7 +144,7 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   mult_factor = intensity;
   duration = 0.0;
   v_0_sq = v_0*v_0;
-  surface_double = double(t_surface_l)*(domain->xprd/nxnodes);
+  surface_double = double(t_surface_l)*(domain->xprd/nxgrid);
   if ((C_limit+esheat_0) < 0.0)
     error->all(FLERR,"Fix ttm/mod electronic_specific_heat must be >= 0.0");
   if (electronic_density <= 0.0)
@@ -172,19 +167,19 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
 
   // allocate 3d grid variables
 
-  memory->create(nsum,nxnodes,nynodes,nznodes,"ttm/mod:nsum");
-  memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm/mod:nsum_all");
-  memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq");
-  memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_mass_vsq");
-  memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq_all");
-  memory->create(sum_mass_vsq_all,nxnodes,nynodes,nznodes,
+  memory->create(nsum,nxgrid,nygrid,nzgrid,"ttm/mod:nsum");
+  memory->create(nsum_all,nxgrid,nygrid,nzgrid,"ttm/mod:nsum_all");
+  memory->create(sum_vsq,nxgrid,nygrid,nzgrid,"ttm/mod:sum_vsq");
+  memory->create(sum_mass_vsq,nxgrid,nygrid,nzgrid,"ttm/mod:sum_mass_vsq");
+  memory->create(sum_vsq_all,nxgrid,nygrid,nzgrid,"ttm/mod:sum_vsq_all");
+  memory->create(sum_mass_vsq_all,nxgrid,nygrid,nzgrid,
                  "ttm/mod:sum_mass_vsq_all");
-  memory->create(T_electron_old,nxnodes,nynodes,nznodes,"ttm/mod:T_electron_old");
-  memory->create(T_electron_first,nxnodes,nynodes,nznodes,"ttm/mod:T_electron_first");
-  memory->create(T_electron,nxnodes,nynodes,nznodes,"ttm/mod:T_electron");
-  memory->create(net_energy_transfer,nxnodes,nynodes,nznodes,
+  memory->create(T_electron_old,nxgrid,nygrid,nzgrid,"ttm/mod:T_electron_old");
+  memory->create(T_electron_first,nxgrid,nygrid,nzgrid,"ttm/mod:T_electron_first");
+  memory->create(T_electron,nxgrid,nygrid,nzgrid,"ttm/mod:T_electron");
+  memory->create(net_energy_transfer,nxgrid,nygrid,nzgrid,
                  "ttm/mod:net_energy_transfer");
-  memory->create(net_energy_transfer_all,nxnodes,nynodes,nznodes,
+  memory->create(net_energy_transfer_all,nxgrid,nygrid,nzgrid,
                  "ttm/mod:net_energy_transfer_all");
   flangevin = nullptr;
   grow_arrays(atom->nmax);
@@ -197,9 +192,9 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   // zero out the flangevin array
 
   for (int i = 0; i < atom->nmax; i++) {
-    flangevin[i][0] = 0;
-    flangevin[i][1] = 0;
-    flangevin[i][2] = 0;
+    flangevin[i][0] = 0.0;
+    flangevin[i][1] = 0.0;
+    flangevin[i][2] = 0.0;
   }
 
   atom->add_callback(Atom::GROW);
@@ -208,17 +203,14 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   // initialize electron temperatures on grid
 
   int ix,iy,iz;
-  for (ix = 0; ix < nxnodes; ix++)
-    for (iy = 0; iy < nynodes; iy++)
-      for (iz = 0; iz < nznodes; iz++)
+  for (ix = 0; ix < nxgrid; ix++)
+    for (iy = 0; iy < nygrid; iy++)
+      for (iz = 0; iz < nzgrid; iz++)
         T_electron[ix][iy][iz] = tinit;
 
   // if specified, read initial electron temperatures from file
 
-  if (infile) {
-    if (comm->me == 0) read_electron_temperatures(infile);
-    MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);
-  }
+  if (infile) read_electron_temperatures(infile);
 }
 
 /* ---------------------------------------------------------------------- */
@@ -275,10 +267,10 @@ void FixTTMMod::init()
       sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v;
   }
 
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        net_energy_transfer_all[ixnode][iynode][iznode] = 0;
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
+        net_energy_transfer_all[ix][iy][iz] = 0;
 
   if (utils::strmatch(update->integrate_style,"^respa"))
     nlevels_respa = ((Respa *) update->integrate)->nlevels;
@@ -308,9 +300,9 @@ void FixTTMMod::post_force(int /*vflag*/)
   int *mask = atom->mask;
   int nlocal = atom->nlocal;
 
-  double dx = domain->xprd/nxnodes;
-  double dy = domain->yprd/nynodes;
-  double dz = domain->zprd/nznodes;
+  double dx = domain->xprd/nxgrid;
+  double dy = domain->yprd/nygrid;
+  double dz = domain->zprd/nzgrid;
   double gamma1,gamma2;
 
   // apply damping and thermostat to all atoms in fix group
@@ -320,52 +312,52 @@ void FixTTMMod::post_force(int /*vflag*/)
       double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
       double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
       double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes + shift) - OFFSET;
-      int iynode = static_cast(yscale*nynodes + shift) - OFFSET;
-      int iznode = static_cast(zscale*nznodes + shift) - OFFSET;
-      while (ixnode > nxnodes-1) ixnode -= nxnodes;
-      while (iynode > nynodes-1) iynode -= nynodes;
-      while (iznode > nznodes-1) iznode -= nznodes;
-      while (ixnode < 0) ixnode += nxnodes;
-      while (iynode < 0) iynode += nynodes;
-      while (iznode < 0) iznode += nznodes;
+      int ix = static_cast(xscale*nxgrid + shift) - OFFSET;
+      int iy = static_cast(yscale*nygrid + shift) - OFFSET;
+      int iz = static_cast(zscale*nzgrid + shift) - OFFSET;
+      while (ix > nxgrid-1) ix -= nxgrid;
+      while (iy > nygrid-1) iy -= nygrid;
+      while (iz > nzgrid-1) iz -= nzgrid;
+      while (ix < 0) ix += nxgrid;
+      while (iy < 0) iy += nygrid;
+      while (iz < 0) iz += nzgrid;
 
-      if (T_electron[ixnode][iynode][iznode] < 0)
+      if (T_electron[ix][iy][iz] < 0)
         error->all(FLERR,"Electronic temperature dropped below zero");
 
-      double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]);
+      double tsqrt = sqrt(T_electron[ix][iy][iz]);
 
       gamma1 = gfactor1[type[i]];
       double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
       if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p;
       gamma2 = gfactor2[type[i]] * tsqrt;
-      if (ixnode >= surface_l) {
-        if (ixnode < surface_r) {
+      if (ix >= surface_l) {
+        if (ix < surface_r) {
           flangevin[i][0] = gamma1*v[i][0] + gamma2*(random->uniform()-0.5);
           flangevin[i][1] = gamma1*v[i][1] + gamma2*(random->uniform()-0.5);
           flangevin[i][2] = gamma1*v[i][2] + gamma2*(random->uniform()-0.5);
           double x_surf = dx*double(surface_l)+dx;
           double x_at = x[i][0] - domain->boxlo[0];
-          int right_xnode = ixnode + 1;
-          int right_ynode = iynode + 1;
-          int right_znode = iznode + 1;
-          if (right_xnode == nxnodes) right_xnode = 0;
-          if (right_ynode == nynodes) right_ynode = 0;
-          if (right_znode == nznodes) right_znode = 0;
-          int left_xnode = ixnode - 1;
-          int left_ynode = iynode - 1;
-          int left_znode = iznode - 1;
-          if (left_xnode == -1) left_xnode = nxnodes - 1;
-          if (left_ynode == -1) left_ynode = nynodes - 1;
-          if (left_znode == -1) left_znode = nznodes - 1;
-          double T_i = T_electron[ixnode][iynode][iznode];
-          double T_ir = T_electron[right_xnode][iynode][iznode];
-          double T_iu = T_electron[ixnode][right_ynode][iznode];
-          double T_if = T_electron[ixnode][iynode][right_znode];
-          double C_i = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity;
-          double C_ir = el_properties(T_electron[right_xnode][iynode][iznode]).el_heat_capacity;
-          double C_iu = el_properties(T_electron[ixnode][right_ynode][iznode]).el_heat_capacity;
-          double C_if = el_properties(T_electron[ixnode][iynode][right_znode]).el_heat_capacity;
+          int right_x = ix + 1;
+          int right_y = iy + 1;
+          int right_z = iz + 1;
+          if (right_x == nxgrid) right_x = 0;
+          if (right_y == nygrid) right_y = 0;
+          if (right_z == nzgrid) right_z = 0;
+          int left_x = ix - 1;
+          int left_y = iy - 1;
+          int left_z = iz - 1;
+          if (left_x == -1) left_x = nxgrid - 1;
+          if (left_y == -1) left_y = nygrid - 1;
+          if (left_z == -1) left_z = nzgrid - 1;
+          double T_i = T_electron[ix][iy][iz];
+          double T_ir = T_electron[right_x][iy][iz];
+          double T_iu = T_electron[ix][right_y][iz];
+          double T_if = T_electron[ix][iy][right_z];
+          double C_i = el_properties(T_electron[ix][iy][iz]).el_heat_capacity;
+          double C_ir = el_properties(T_electron[right_x][iy][iz]).el_heat_capacity;
+          double C_iu = el_properties(T_electron[ix][right_y][iz]).el_heat_capacity;
+          double C_if = el_properties(T_electron[ix][iy][right_z]).el_heat_capacity;
           double diff_x = (x_at - x_surf)*(x_at - x_surf);
           diff_x = pow(diff_x,0.5);
           double len_factor = diff_x/(diff_x+free_path);
@@ -387,8 +379,8 @@ void FixTTMMod::post_force(int /*vflag*/)
         }
       }
       if (movsur == 1) {
-        if (ixnode < surface_l) {
-          t_surface_l = ixnode;
+        if (ix < surface_l) {
+          t_surface_l = ix;
         }
       }
     }
@@ -443,206 +435,181 @@ void FixTTMMod::reset_dt()
    only called by proc 0
 ------------------------------------------------------------------------- */
 
-void FixTTMMod::read_parameters(const char *filename)
+void FixTTMMod::read_parameters(const std::string &filename)
 {
-  char line[MAXLINE];
-  std::string name = utils::get_potential_file_path(filename);
-  if (name.empty())
-    error->one(FLERR,"Cannot open input file: {}",
-                                 filename);
-  FILE *fpr = fopen(name.c_str(),"r");
+  try {
+    PotentialFileReader reader(lmp, filename, "ttm/mod parameter");
 
-  // C0 (metal)
+    // C0 (metal)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  esheat_0 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    esheat_0 = reader.next_values(1).next_double();
 
-  // C1 (metal*10^3)
+    // C1 (metal*10^3)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  esheat_1 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    esheat_1 = reader.next_values(1).next_double();
 
-  // C2 (metal*10^6)
+    // C2 (metal*10^6)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  esheat_2 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    esheat_2 = reader.next_values(1).next_double();
 
-  // C3 (metal*10^9)
+    // C3 (metal*10^9)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  esheat_3 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    esheat_3 = reader.next_values(1).next_double();
 
-  // C4 (metal*10^12)
+    // C4 (metal*10^12)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  esheat_4 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    esheat_4 = reader.next_values(1).next_double();
 
-  // C_limit
+    // C_limit
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  C_limit = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    C_limit = reader.next_values(1).next_double();
 
-  // Temperature damping factor
+    // Temperature damping factor
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  T_damp = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    T_damp = reader.next_values(1).next_double();
 
-  // rho_e
+    // rho_e
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  electronic_density = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    electronic_density = reader.next_values(1).next_double();
 
-  // thermal_diffusion
+    // thermal_diffusion
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  el_th_diff = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    el_th_diff = reader.next_values(1).next_double();
 
-  // gamma_p
+    // gamma_p
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  gamma_p = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    gamma_p = reader.next_values(1).next_double();
 
-  // gamma_s
+    // gamma_s
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  gamma_s = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    gamma_s = reader.next_values(1).next_double();
 
-  // v0
+    // v0
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  v_0 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    v_0 = reader.next_values(1).next_double();
 
-  // average intensity of pulse (source of energy) (metal units)
+    // average intensity of pulse (source of energy) (metal units)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  intensity = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    intensity = reader.next_values(1).next_double();
 
-  // coordinate of 1st surface in x-direction (in box units) - constant
+    // coordinate of 1st surface in x-direction (in box units) - constant
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  surface_l = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    surface_l = reader.next_values(1).next_int();
 
-  // coordinate of 2nd surface in x-direction (in box units) - constant
+    // coordinate of 2nd surface in x-direction (in box units) - constant
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  surface_r = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    surface_r = reader.next_values(1).next_int();
 
-  // skin_layer = intensity is reduced (I=I0*exp[-x/skin_layer])
+    // skin_layer = intensity is reduced (I=I0*exp[-x/skin_layer])
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  skin_layer = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    skin_layer =  reader.next_values(1).next_int();
 
-  // width of pulse (picoseconds)
+    // width of pulse (picoseconds)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  width = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    width = reader.next_values(1).next_double();
 
-  // factor of electronic pressure (PF) Pe = PF*Ce*Te
+    // factor of electronic pressure (PF) Pe = PF*Ce*Te
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  pres_factor = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    pres_factor = reader.next_values(1).next_double();
 
-  // effective free path of electrons (angstrom)
+    // effective free path of electrons (angstrom)
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  free_path = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    free_path = reader.next_values(1).next_double();
 
-  // ionic density (ions*angstrom^{-3})
+    // ionic density (ions*angstrom^{-3})
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  ionic_density = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    ionic_density = reader.next_values(1).next_double();
 
-  // if movsur = 0: surface is frozen
+    // if movsur = 0: surface is frozen
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  movsur = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
+    reader.next_line();
+    movsur = reader.next_values(1).next_int();
 
-  // electron_temperature_min
+    // electron_temperature_min
 
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
-  electron_temperature_min = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
-  fclose(fpr);
+    reader.next_line();
+    electron_temperature_min = reader.next_values(1).next_double();
+  } catch (std::exception &e) {
+    error->one(FLERR,e.what());
+  }
 }
 
 /* ----------------------------------------------------------------------
    read in initial electron temperatures from a user-specified file
-   only called by proc 0
+   only read by proc 0, grid values are Bcast to other procs
 ------------------------------------------------------------------------- */
 
-void FixTTMMod::read_electron_temperatures(const char *filename)
+void FixTTMMod::read_electron_temperatures(const std::string &filename)
 {
-  int ***T_initial_set;
-  memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm/mod:T_initial_set");
-  memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
+  if (comm->me == 0) {
 
-  std::string name = utils::get_potential_file_path(filename);
-  if (name.empty())
-    error->one(FLERR,"Cannot open input file: {}",
-                                 filename);
-  FILE *fpr = fopen(name.c_str(),"r");
+    int ***T_initial_set;
+    memory->create(T_initial_set,nxgrid,nygrid,nzgrid,"ttm/mod:T_initial_set");
+    memset(&T_initial_set[0][0][0],0,ngridtotal*sizeof(int));
 
-  // read initial electron temperature values from file
+    // read initial electron temperature values from file
+    bigint nread = 0;
 
-  char line[MAXLINE];
-  int ixnode,iynode,iznode;
-  double T_tmp;
+    try {
+      PotentialFileReader reader(lmp, filename, "electron temperature grid");
 
-  while (1) {
-    if (fgets(line,MAXLINE,fpr) == nullptr) break;
-    ValueTokenizer values(line);
-    if (values.has_next()) ixnode = values.next_int();
-    if (values.has_next()) iynode = values.next_int();
-    if (values.has_next()) iznode = values.next_int();
-    if (values.has_next()) T_tmp  = values.next_double();
-    else error->one(FLERR,"Incorrect format in fix ttm input file");
+      while (nread < ngridtotal) {
+        // reader will skip over comment-only lines
+        auto values = reader.next_values(4);
+        ++nread;
 
-    // check correctness of input data
+        int ix = values.next_int();
+        int iy = values.next_int();
+        int iz = values.next_int();
+        double T_tmp  = values.next_double();
 
-    if ((ixnode < 0) || (ixnode >= nxnodes)
-        || (iynode < 0) || (iynode >= nynodes)
-        || (iznode < 0) || (iznode >= nznodes))
-      error->one(FLERR,"Fix ttm invalide node index in fix ttm input");
+        // check correctness of input data
 
-    if (T_tmp < 0.0)
-      error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
+        if ((ix < 0) || (ix >= nxgrid) || (iy < 0) || (iy >= nygrid) || (iz < 0) || (iz >= nzgrid))
+          throw parser_error("Fix ttm invalid grid index in fix ttm/mod grid file");
 
-    T_electron[ixnode][iynode][iznode] = T_tmp;
-    T_initial_set[ixnode][iynode][iznode] = 1;
+        if (T_tmp < 0.0)
+          throw parser_error("Fix ttm electron temperatures must be > 0.0");
+
+        T_electron[iz][iy][ix] = T_tmp;
+        T_initial_set[iz][iy][ix] = 1;
+      }
+    } catch (std::exception &e) {
+      error->one(FLERR, e.what());
+    }
+
+    // check completeness of input data
+
+    for (int iz = 0; iz < nzgrid; iz++)
+      for (int iy = 0; iy < nygrid; iy++)
+        for (int ix = 0; ix < nxgrid; ix++)
+          if (T_initial_set[iz][iy][ix] == 0)
+            error->all(FLERR,"Fix ttm/mod infile did not set all temperatures");
+
+    memory->destroy(T_initial_set);
   }
 
-  fclose(fpr);
-
-  // check completeness of input data
-
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        if (T_initial_set[ixnode][iynode][iznode] == 0)
-          error->one(FLERR,"Initial temperatures not all set in fix ttm");
-
-  memory->destroy(T_initial_set);
+  MPI_Bcast(&T_electron[0][0][0],ngridtotal,MPI_DOUBLE,0,world);
 }
 
 /* ----------------------------------------------------------------------
@@ -650,18 +617,25 @@ void FixTTMMod::read_electron_temperatures(const char *filename)
    only written by proc 0
 ------------------------------------------------------------------------- */
 
-void FixTTMMod::write_electron_temperatures(const char *filename)
+void FixTTMMod::write_electron_temperatures(const std::string &filename)
 {
   if (comm->me) return;
 
-  FILE *fp = fopen(filename,"w");
-  if (!fp) error->one(FLERR,"Fix ttm/mod could not open output file");
+  time_t tv = time(nullptr);
+  std::tm current_date = fmt::localtime(tv);
+
+  FILE *fp = fopen(filename.c_str(),"w");
+  if (!fp) error->one(FLERR,"Fix ttm/mod could not open output file {}: {}",
+                      filename, utils::getsyserror());
+  fmt::print(fp,"# DATE: {:%Y-%m-%d} UNITS: {} COMMENT: Electron temperature "
+             "{}x{}x{} grid at step {}. Created by fix {}\n", current_date,
+             update->unit_style, nxgrid, nygrid, nzgrid, update->ntimestep, style);
 
   int ix,iy,iz;
 
-  for (ix = 0; ix < nxnodes; ix++)
-    for (iy = 0; iy < nynodes; iy++)
-      for (iz = 0; iz < nznodes; iz++) {
+  for (ix = 0; ix < nxgrid; ix++)
+    for (iy = 0; iy < nygrid; iy++)
+      for (iz = 0; iz < nzgrid; iz++) {
         if (movsur == 1 && T_electron[ix][iy][iz] == 0.0)
           T_electron[ix][iy][iz] = electron_temperature_min;
         fprintf(fp,"%d %d %d %20.16g\n",ix,iy,iz,T_electron[ix][iy][iz]);
@@ -706,38 +680,38 @@ void FixTTMMod::end_of_step()
   int nlocal = atom->nlocal;
 
   if (movsur == 1) {
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++) {
-          double TTT = T_electron[ixnode][iynode][iznode];
+    for (int ix = 0; ix < nxgrid; ix++)
+      for (int iy = 0; iy < nygrid; iy++)
+        for (int iz = 0; iz < nzgrid; iz++) {
+          double TTT = T_electron[ix][iy][iz];
           if (TTT > 0) {
-            if (ixnode < t_surface_l)
-              t_surface_l = ixnode;
+            if (ix < t_surface_l)
+              t_surface_l = ix;
           }
         }
   }
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        net_energy_transfer[ixnode][iynode][iznode] = 0;
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
+        net_energy_transfer[ix][iy][iz] = 0;
 
   for (int i = 0; i < nlocal; i++)
     if (mask[i] & groupbit) {
       double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
       double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
       double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
-      int ixnode = static_cast(xscale*nxnodes + shift) - OFFSET;
-      int iynode = static_cast(yscale*nynodes + shift) - OFFSET;
-      int iznode = static_cast(zscale*nznodes + shift) - OFFSET;
-      while (ixnode > nxnodes-1) ixnode -= nxnodes;
-      while (iynode > nynodes-1) iynode -= nynodes;
-      while (iznode > nznodes-1) iznode -= nznodes;
-      while (ixnode < 0) ixnode += nxnodes;
-      while (iynode < 0) iynode += nynodes;
-      while (iznode < 0) iznode += nznodes;
-      if (ixnode >= t_surface_l) {
-        if (ixnode < surface_r)
-          net_energy_transfer[ixnode][iynode][iznode] +=
+      int ix = static_cast(xscale*nxgrid + shift) - OFFSET;
+      int iy = static_cast(yscale*nygrid + shift) - OFFSET;
+      int iz = static_cast(zscale*nzgrid + shift) - OFFSET;
+      while (ix > nxgrid-1) ix -= nxgrid;
+      while (iy > nygrid-1) iy -= nygrid;
+      while (iz > nzgrid-1) iz -= nzgrid;
+      while (ix < 0) ix += nxgrid;
+      while (iy < 0) iy += nygrid;
+      while (iz < 0) iz += nzgrid;
+      if (ix >= t_surface_l) {
+        if (ix < surface_r)
+          net_energy_transfer[ix][iy][iz] +=
             (flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] +
              flangevin[i][2]*v[i][2]);
       }
@@ -747,24 +721,24 @@ void FixTTMMod::end_of_step()
                 &net_energy_transfer_all[0][0][0],
                 ngridtotal,MPI_DOUBLE,MPI_SUM,world);
 
-  double dx = domain->xprd/nxnodes;
-  double dy = domain->yprd/nynodes;
-  double dz = domain->zprd/nznodes;
+  double dx = domain->xprd/nxgrid;
+  double dy = domain->yprd/nygrid;
+  double dz = domain->zprd/nzgrid;
   double del_vol = dx*dy*dz;
   double el_specific_heat = 0.0;
   double el_thermal_conductivity = el_properties(electron_temperature_min).el_thermal_conductivity;
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
         {
-          if (el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity > el_thermal_conductivity)
-            el_thermal_conductivity = el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity;
+          if (el_properties(T_electron[ix][iy][iz]).el_thermal_conductivity > el_thermal_conductivity)
+            el_thermal_conductivity = el_properties(T_electron[ix][iy][iz]).el_thermal_conductivity;
           if (el_specific_heat > 0.0)
             {
-              if ((T_electron[ixnode][iynode][iznode] > 0.0) && (el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity < el_specific_heat))
-                el_specific_heat = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity;
+              if ((T_electron[ix][iy][iz] > 0.0) && (el_properties(T_electron[ix][iy][iz]).el_heat_capacity < el_specific_heat))
+                el_specific_heat = el_properties(T_electron[ix][iy][iz]).el_heat_capacity;
             }
-          else if (T_electron[ixnode][iynode][iznode] > 0.0) el_specific_heat = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity;
+          else if (T_electron[ix][iy][iz] > 0.0) el_specific_heat = el_properties(T_electron[ix][iy][iz]).el_heat_capacity;
         }
   // num_inner_timesteps = # of inner steps (thermal solves)
   // required this MD step to maintain a stable explicit solve
@@ -773,17 +747,17 @@ void FixTTMMod::end_of_step()
   double inner_dt = update->dt;
   double stability_criterion = 0.0;
 
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        T_electron_first[ixnode][iynode][iznode] =
-          T_electron[ixnode][iynode][iznode];
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
+        T_electron_first[ix][iy][iz] =
+          T_electron[ix][iy][iz];
   do {
-    for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-      for (int iynode = 0; iynode < nynodes; iynode++)
-        for (int iznode = 0; iznode < nznodes; iznode++)
-          T_electron[ixnode][iynode][iznode] =
-            T_electron_first[ixnode][iynode][iznode];
+    for (int ix = 0; ix < nxgrid; ix++)
+      for (int iy = 0; iy < nygrid; iy++)
+        for (int iz = 0; iz < nzgrid; iz++)
+          T_electron[ix][iy][iz] =
+            T_electron_first[ix][iy][iz];
 
     stability_criterion = 1.0 -
       2.0*inner_dt/el_specific_heat *
@@ -798,79 +772,79 @@ void FixTTMMod::end_of_step()
       error->warning(FLERR,"Too many inner timesteps in fix ttm/mod");
     for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps;
          ith_inner_timestep++) {
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++)
-            T_electron_old[ixnode][iynode][iznode] =
-              T_electron[ixnode][iynode][iznode];
+      for (int ix = 0; ix < nxgrid; ix++)
+        for (int iy = 0; iy < nygrid; iy++)
+          for (int iz = 0; iz < nzgrid; iz++)
+            T_electron_old[ix][iy][iz] =
+              T_electron[ix][iy][iz];
       // compute new electron T profile
       duration = duration + inner_dt;
-      for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-        for (int iynode = 0; iynode < nynodes; iynode++)
-          for (int iznode = 0; iznode < nznodes; iznode++) {
-            int right_xnode = ixnode + 1;
-            int right_ynode = iynode + 1;
-            int right_znode = iznode + 1;
-            if (right_xnode == nxnodes) right_xnode = 0;
-            if (right_ynode == nynodes) right_ynode = 0;
-            if (right_znode == nznodes) right_znode = 0;
-            int left_xnode = ixnode - 1;
-            int left_ynode = iynode - 1;
-            int left_znode = iznode - 1;
-            if (left_xnode == -1) left_xnode = nxnodes - 1;
-            if (left_ynode == -1) left_ynode = nynodes - 1;
-            if (left_znode == -1) left_znode = nznodes - 1;
+      for (int ix = 0; ix < nxgrid; ix++)
+        for (int iy = 0; iy < nygrid; iy++)
+          for (int iz = 0; iz < nzgrid; iz++) {
+            int right_x = ix + 1;
+            int right_y = iy + 1;
+            int right_z = iz + 1;
+            if (right_x == nxgrid) right_x = 0;
+            if (right_y == nygrid) right_y = 0;
+            if (right_z == nzgrid) right_z = 0;
+            int left_x = ix - 1;
+            int left_y = iy - 1;
+            int left_z = iz - 1;
+            if (left_x == -1) left_x = nxgrid - 1;
+            if (left_y == -1) left_y = nygrid - 1;
+            if (left_z == -1) left_z = nzgrid - 1;
             double skin_layer_d = double(skin_layer);
-            double ixnode_d = double(ixnode);
+            double ix_d = double(ix);
             double surface_d = double(t_surface_l);
             mult_factor = 0.0;
             if (duration < width) {
-              if (ixnode >= t_surface_l) mult_factor = (intensity/(dx*skin_layer_d))*exp((-1.0)*(ixnode_d - surface_d)/skin_layer_d);
+              if (ix >= t_surface_l) mult_factor = (intensity/(dx*skin_layer_d))*exp((-1.0)*(ix_d - surface_d)/skin_layer_d);
             }
-            if (ixnode < t_surface_l) net_energy_transfer_all[ixnode][iynode][iznode] = 0.0;
+            if (ix < t_surface_l) net_energy_transfer_all[ix][iy][iz] = 0.0;
             double cr_vac = 1;
-            if (T_electron_old[ixnode][iynode][iznode] == 0) cr_vac = 0;
+            if (T_electron_old[ix][iy][iz] == 0) cr_vac = 0;
             double cr_v_l_x = 1;
-            if (T_electron_old[left_xnode][iynode][iznode] == 0) cr_v_l_x = 0;
+            if (T_electron_old[left_x][iy][iz] == 0) cr_v_l_x = 0;
             double cr_v_r_x = 1;
-            if (T_electron_old[right_xnode][iynode][iznode] == 0) cr_v_r_x = 0;
+            if (T_electron_old[right_x][iy][iz] == 0) cr_v_r_x = 0;
             double cr_v_l_y = 1;
-            if (T_electron_old[ixnode][left_ynode][iznode] == 0) cr_v_l_y = 0;
+            if (T_electron_old[ix][left_y][iz] == 0) cr_v_l_y = 0;
             double cr_v_r_y = 1;
-            if (T_electron_old[ixnode][right_ynode][iznode] == 0) cr_v_r_y = 0;
+            if (T_electron_old[ix][right_y][iz] == 0) cr_v_r_y = 0;
             double cr_v_l_z = 1;
-            if (T_electron_old[ixnode][iynode][left_znode] == 0) cr_v_l_z = 0;
+            if (T_electron_old[ix][iy][left_z] == 0) cr_v_l_z = 0;
             double cr_v_r_z = 1;
-            if (T_electron_old[ixnode][iynode][right_znode] == 0) cr_v_r_z = 0;
+            if (T_electron_old[ix][iy][right_z] == 0) cr_v_r_z = 0;
             if (cr_vac != 0) {
-              T_electron[ixnode][iynode][iznode] =
-                T_electron_old[ixnode][iynode][iznode] +
-                inner_dt/el_properties(T_electron_old[ixnode][iynode][iznode]).el_heat_capacity *
-                ((cr_v_r_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[right_xnode][iynode][iznode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[right_xnode][iynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dx -
-                  cr_v_l_x*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[left_xnode][iynode][iznode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[ixnode][iynode][iznode]-T_electron_old[left_xnode][iynode][iznode])/dx)/dx +
-                 (cr_v_r_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][right_ynode][iznode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[ixnode][right_ynode][iznode]-T_electron_old[ixnode][iynode][iznode])/dy -
-                  cr_v_l_y*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][left_ynode][iznode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][left_ynode][iznode])/dy)/dy +
-                 (cr_v_r_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][right_znode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[ixnode][iynode][right_znode]-T_electron_old[ixnode][iynode][iznode])/dz -
-                  cr_v_l_z*el_properties(T_electron_old[ixnode][iynode][iznode]/2.0+T_electron_old[ixnode][iynode][left_znode]/2.0).el_thermal_conductivity*
-                  (T_electron_old[ixnode][iynode][iznode]-T_electron_old[ixnode][iynode][left_znode])/dz)/dz);
-              T_electron[ixnode][iynode][iznode]+=inner_dt/el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity*
+              T_electron[ix][iy][iz] =
+                T_electron_old[ix][iy][iz] +
+                inner_dt/el_properties(T_electron_old[ix][iy][iz]).el_heat_capacity *
+                ((cr_v_r_x*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[right_x][iy][iz]/2.0).el_thermal_conductivity*
+                  (T_electron_old[right_x][iy][iz]-T_electron_old[ix][iy][iz])/dx -
+                  cr_v_l_x*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[left_x][iy][iz]/2.0).el_thermal_conductivity*
+                  (T_electron_old[ix][iy][iz]-T_electron_old[left_x][iy][iz])/dx)/dx +
+                 (cr_v_r_y*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[ix][right_y][iz]/2.0).el_thermal_conductivity*
+                  (T_electron_old[ix][right_y][iz]-T_electron_old[ix][iy][iz])/dy -
+                  cr_v_l_y*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[ix][left_y][iz]/2.0).el_thermal_conductivity*
+                  (T_electron_old[ix][iy][iz]-T_electron_old[ix][left_y][iz])/dy)/dy +
+                 (cr_v_r_z*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[ix][iy][right_z]/2.0).el_thermal_conductivity*
+                  (T_electron_old[ix][iy][right_z]-T_electron_old[ix][iy][iz])/dz -
+                  cr_v_l_z*el_properties(T_electron_old[ix][iy][iz]/2.0+T_electron_old[ix][iy][left_z]/2.0).el_thermal_conductivity*
+                  (T_electron_old[ix][iy][iz]-T_electron_old[ix][iy][left_z])/dz)/dz);
+              T_electron[ix][iy][iz]+=inner_dt/el_properties(T_electron[ix][iy][iz]).el_heat_capacity*
                 (mult_factor -
-                 net_energy_transfer_all[ixnode][iynode][iznode]/del_vol);
+                 net_energy_transfer_all[ix][iy][iz]/del_vol);
             }
-            else T_electron[ixnode][iynode][iznode] =
-                   T_electron_old[ixnode][iynode][iznode];
-            if ((T_electron[ixnode][iynode][iznode] > 0.0) && (T_electron[ixnode][iynode][iznode] < electron_temperature_min))
-              T_electron[ixnode][iynode][iznode] = T_electron[ixnode][iynode][iznode] + 0.5*(electron_temperature_min - T_electron[ixnode][iynode][iznode]);
+            else T_electron[ix][iy][iz] =
+                   T_electron_old[ix][iy][iz];
+            if ((T_electron[ix][iy][iz] > 0.0) && (T_electron[ix][iy][iz] < electron_temperature_min))
+              T_electron[ix][iy][iz] = T_electron[ix][iy][iz] + 0.5*(electron_temperature_min - T_electron[ix][iy][iz]);
 
-            if (el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity > el_thermal_conductivity)
-              el_thermal_conductivity = el_properties(T_electron[ixnode][iynode][iznode]).el_thermal_conductivity;
-            if ((T_electron[ixnode][iynode][iznode] > 0.0) && (el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity < el_specific_heat))
-              el_specific_heat = el_properties(T_electron[ixnode][iynode][iznode]).el_heat_capacity;
+            if (el_properties(T_electron[ix][iy][iz]).el_thermal_conductivity > el_thermal_conductivity)
+              el_thermal_conductivity = el_properties(T_electron[ix][iy][iz]).el_thermal_conductivity;
+            if ((T_electron[ix][iy][iz] > 0.0) && (el_properties(T_electron[ix][iy][iz]).el_heat_capacity < el_specific_heat))
+              el_specific_heat = el_properties(T_electron[ix][iy][iz]).el_heat_capacity;
           }
     }
     stability_criterion = 1.0 -
@@ -919,17 +893,17 @@ double FixTTMMod::compute_vector(int n)
   double e_energy = 0.0;
   double transfer_energy = 0.0;
 
-  double dx = domain->xprd/nxnodes;
-  double dy = domain->yprd/nynodes;
-  double dz = domain->zprd/nznodes;
+  double dx = domain->xprd/nxgrid;
+  double dy = domain->yprd/nygrid;
+  double dz = domain->zprd/nzgrid;
   double del_vol = dx*dy*dz;
 
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++) {
-        e_energy += el_sp_heat_integral(T_electron[ixnode][iynode][iznode])*del_vol;
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++) {
+        e_energy += el_sp_heat_integral(T_electron[ix][iy][iz])*del_vol;
         transfer_energy +=
-          net_energy_transfer_all[ixnode][iynode][iznode]*update->dt;
+          net_energy_transfer_all[ix][iy][iz]*update->dt;
       }
 
   if (n == 0) return e_energy;
@@ -944,18 +918,18 @@ double FixTTMMod::compute_vector(int n)
 void FixTTMMod::write_restart(FILE *fp)
 {
   double *rlist;
-  memory->create(rlist,nxnodes*nynodes*nznodes+4,"ttm/mod:rlist");
+  memory->create(rlist,nxgrid*nygrid*nzgrid+4,"ttm/mod:rlist");
 
   int n = 0;
-  rlist[n++] = nxnodes;
-  rlist[n++] = nynodes;
-  rlist[n++] = nznodes;
+  rlist[n++] = nxgrid;
+  rlist[n++] = nygrid;
+  rlist[n++] = nzgrid;
   rlist[n++] = seed;
 
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        rlist[n++] =  T_electron[ixnode][iynode][iznode];
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
+        rlist[n++] =  T_electron[ix][iy][iz];
 
   if (comm->me == 0) {
     int size = n * sizeof(double);
@@ -977,11 +951,11 @@ void FixTTMMod::restart(char *buf)
 
   // check that restart grid size is same as current grid size
 
-  int nxnodes_old = static_cast (rlist[n++]);
-  int nynodes_old = static_cast (rlist[n++]);
-  int nznodes_old = static_cast (rlist[n++]);
+  int nxgrid_old = static_cast (rlist[n++]);
+  int nygrid_old = static_cast (rlist[n++]);
+  int nzgrid_old = static_cast (rlist[n++]);
 
-  if (nxnodes_old != nxnodes || nynodes_old != nynodes || nznodes_old != nznodes)
+  if (nxgrid_old != nxgrid || nygrid_old != nygrid || nzgrid_old != nzgrid)
     error->all(FLERR,"Must restart fix ttm with same grid size");
 
   // change RN seed from initial seed, to avoid same Langevin factors
@@ -993,10 +967,10 @@ void FixTTMMod::restart(char *buf)
 
   // restore global frid values
 
-  for (int ixnode = 0; ixnode < nxnodes; ixnode++)
-    for (int iynode = 0; iynode < nynodes; iynode++)
-      for (int iznode = 0; iznode < nznodes; iznode++)
-        T_electron[ixnode][iynode][iznode] = rlist[n++];
+  for (int ix = 0; ix < nxgrid; ix++)
+    for (int iy = 0; iy < nygrid; iy++)
+      for (int iz = 0; iz < nzgrid; iz++)
+        T_electron[ix][iy][iz] = rlist[n++];
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/EXTRA-FIX/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h
index b4a09b8f38..2b0287380f 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.h
+++ b/src/EXTRA-FIX/fix_ttm_mod.h
@@ -21,6 +21,7 @@ FixStyle(ttm/mod,FixTTMMod);
 #define LMP_FIX_TTM_MOD_H
 
 #include "fix.h"
+#include 
 
 namespace LAMMPS_NS {
 
@@ -57,14 +58,13 @@ class FixTTMMod : public Fix {
   int seed;
   int outevery;
   double shift;
-  char *infile,*outfile;
+  char *infile, *outfile;
 
   class RanMars *random;
   FILE *fp;
 
-  int nxnodes, nynodes, nznodes;
+  int nxgrid, nygrid, nzgrid;
   int ngridtotal;
-  bigint total_nnodes;
 
   int ***nsum, ***nsum_all;
   double *gfactor1, *gfactor2, *ratio, **flangevin;
@@ -76,8 +76,7 @@ class FixTTMMod : public Fix {
   double gamma_p, gamma_s, v_0, v_0_sq;
   int skin_layer, surface_l, surface_r, t_surface_l, t_surface_r;
   int movsur;
-  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4,
-    C_limit, electronic_density;
+  double esheat_0, esheat_1, esheat_2, esheat_3, esheat_4, C_limit, electronic_density;
   double el_th_diff, T_damp;
   double intensity, width, duration, surface_double;
   double mult_factor, ttm_dt;
@@ -86,9 +85,17 @@ class FixTTMMod : public Fix {
   el_heat_capacity_thermal_conductivity el_properties(double);
   double el_sp_heat_integral(double);
 
-  void read_parameters(const char *);
-  void read_electron_temperatures(const char *);
-  void write_electron_temperatures(const char *);
+  void read_parameters(const std::string &);
+  void read_electron_temperatures(const std::string &);
+  void write_electron_temperatures(const std::string &);
+
+  class parser_error : public std::exception {
+    std::string message;
+
+   public:
+    parser_error(const std::string &mesg) { message = mesg; }
+    const char *what() const noexcept { return message.c_str(); }
+  };
 };
 
 }    // namespace LAMMPS_NS

From cddac395c6d3a5b97567aaff8b464fc49dfde1fc Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sat, 28 Aug 2021 07:52:14 -0400
Subject: [PATCH 189/437] some more cleanup

---
 src/EXTRA-FIX/fix_ttm_mod.cpp | 18 ++++++------------
 src/EXTRA-FIX/fix_ttm_mod.h   |  1 -
 2 files changed, 6 insertions(+), 13 deletions(-)

diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp
index 07f3055b37..905232ff08 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.cpp
+++ b/src/EXTRA-FIX/fix_ttm_mod.cpp
@@ -68,6 +68,7 @@ static const char cite_fix_ttm_mod[] =
   "pages = {129--139},\n"
   "year = {2013}\n"
   "}\n\n";
+
 static constexpr int OFFSET = 16384;
 static constexpr double SHIFT = 0.0;
 
@@ -75,7 +76,7 @@ static constexpr double SHIFT = 0.0;
 
 FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
   Fix(lmp, narg, arg),
-  random(nullptr), fp(nullptr), nsum(nullptr), nsum_all(nullptr),
+  random(nullptr), nsum(nullptr), nsum_all(nullptr),
   gfactor1(nullptr), gfactor2(nullptr), ratio(nullptr), flangevin(nullptr),
   T_electron(nullptr), T_electron_old(nullptr), sum_vsq(nullptr), sum_mass_vsq(nullptr),
   sum_vsq_all(nullptr), sum_mass_vsq_all(nullptr), net_energy_transfer(nullptr),
@@ -217,11 +218,9 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
 
 FixTTMMod::~FixTTMMod()
 {
-  if (fp) fclose(fp);
   delete random;
-
-  delete [] gfactor1;
-  delete [] gfactor2;
+  delete[] gfactor1;
+  delete[] gfactor2;
 
   memory->destroy(nsum);
   memory->destroy(nsum_all);
@@ -855,13 +854,8 @@ void FixTTMMod::end_of_step()
 
   // output of grid electron temperatures to file
 
-  if (outfile && (update->ntimestep % outevery == 0)) {
-    char *newfile = new char[strlen(outfile) + 16];
-    strcpy(newfile,outfile);
-    sprintf(newfile,"%s.%ld",outfile,update->ntimestep);
-
-    write_electron_temperatures((const char *) newfile);
-  }
+  if (outfile && (update->ntimestep % outevery == 0))
+    write_electron_temperatures(fmt::format("{}.{}", outfile, update->ntimestep));
 }
 
 /* ----------------------------------------------------------------------
diff --git a/src/EXTRA-FIX/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h
index 2b0287380f..f26f270e7a 100644
--- a/src/EXTRA-FIX/fix_ttm_mod.h
+++ b/src/EXTRA-FIX/fix_ttm_mod.h
@@ -61,7 +61,6 @@ class FixTTMMod : public Fix {
   char *infile, *outfile;
 
   class RanMars *random;
-  FILE *fp;
 
   int nxgrid, nygrid, nzgrid;
   int ngridtotal;

From 89556f0bcb3827f3c4560c2607fc4e1a8d5a84a7 Mon Sep 17 00:00:00 2001
From: Mike Brown 
Date: Sat, 28 Aug 2021 17:01:58 -0700
Subject: [PATCH 190/437] Override any OpenCL fast math JIT settings for
 born/coul/wolf{/cs}/gpu to resolve numerical deviations seen with some OpenCL
 implementations.

---
 lib/gpu/lal_base_charge.cpp       | 16 +++++++++++-----
 lib/gpu/lal_base_charge.h         |  7 +++++--
 lib/gpu/lal_born_coul_wolf.cpp    |  2 +-
 lib/gpu/lal_born_coul_wolf_cs.cpp |  2 +-
 lib/gpu/lal_device.cpp            | 10 ++++++++++
 lib/gpu/lal_device.h              |  1 +
 6 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/lib/gpu/lal_base_charge.cpp b/lib/gpu/lal_base_charge.cpp
index 9045420425..84fbddd4e9 100644
--- a/lib/gpu/lal_base_charge.cpp
+++ b/lib/gpu/lal_base_charge.cpp
@@ -56,7 +56,7 @@ int BaseChargeT::init_atomic(const int nlocal, const int nall,
                              const int max_nbors, const int maxspecial,
                              const double cell_size, const double gpu_split,
                              FILE *_screen, const void *pair_program,
-                             const char *k_name) {
+                             const char *k_name, const int disable_fast_math) {
   screen=_screen;
 
   int gpu_nbor=0;
@@ -83,7 +83,7 @@ int BaseChargeT::init_atomic(const int nlocal, const int nall,
 
   _block_size=device->pair_block_size();
   _block_bio_size=device->block_bio_pair();
-  compile_kernels(*ucl_device,pair_program,k_name);
+  compile_kernels(*ucl_device,pair_program,k_name,disable_fast_math);
 
   if (_threads_per_atom>1 && gpu_nbor==0) {
     nbor->packing(true);
@@ -321,14 +321,20 @@ double BaseChargeT::host_memory_usage_atomic() const {
 
 template 
 void BaseChargeT::compile_kernels(UCL_Device &dev, const void *pair_str,
-                                  const char *kname) {
+                                  const char *kname,
+                                  const int disable_fast_math) {
   if (_compiled)
     return;
 
   std::string s_fast=std::string(kname)+"_fast";
   if (pair_program) delete pair_program;
   pair_program=new UCL_Program(dev);
-  std::string oclstring = device->compile_string()+" -DEVFLAG=1";
+  std::string device_compile_string;
+  if (disable_fast_math)
+    device_compile_string = device->compile_string_nofast();
+  else
+    device_compile_string = device->compile_string();
+  std::string oclstring = device_compile_string+" -DEVFLAG=1";
   pair_program->load_string(pair_str,oclstring.c_str(),nullptr,screen);
   k_pair_fast.set_function(*pair_program,s_fast.c_str());
   k_pair.set_function(*pair_program,kname);
@@ -336,7 +342,7 @@ void BaseChargeT::compile_kernels(UCL_Device &dev, const void *pair_str,
   q_tex.get_texture(*pair_program,"q_tex");
 
   #if defined(LAL_OCL_EV_JIT)
-  oclstring = device->compile_string()+" -DEVFLAG=0";
+  oclstring = device_compile_string+" -DEVFLAG=0";
   if (pair_program_noev) delete pair_program_noev;
   pair_program_noev=new UCL_Program(dev);
   pair_program_noev->load_string(pair_str,oclstring.c_str(),nullptr,screen);
diff --git a/lib/gpu/lal_base_charge.h b/lib/gpu/lal_base_charge.h
index 6b8761092a..307c5c079f 100644
--- a/lib/gpu/lal_base_charge.h
+++ b/lib/gpu/lal_base_charge.h
@@ -44,6 +44,7 @@ class BaseCharge {
     * \param cell_size cutoff + skin
     * \param gpu_split fraction of particles handled by device
     * \param k_name name for the kernel for force calculation
+    * \param disable_fast_math override any fast math opts for kernel JIT
     *
     * Returns:
     * -  0 if successful
@@ -54,7 +55,8 @@ class BaseCharge {
   int init_atomic(const int nlocal, const int nall, const int max_nbors,
                   const int maxspecial, const double cell_size,
                   const double gpu_split, FILE *screen,
-                  const void *pair_program, const char *k_name);
+                  const void *pair_program, const char *k_name,
+                  const int disable_fast_math = 0);
 
   /// Estimate the overhead for GPU context changes and CPU driver
   void estimate_gpu_overhead(const int add_kernels=0);
@@ -198,7 +200,8 @@ class BaseCharge {
   double _gpu_overhead, _driver_overhead;
   UCL_D_Vec *_nbor_data;
 
-  void compile_kernels(UCL_Device &dev, const void *pair_string, const char *k);
+  void compile_kernels(UCL_Device &dev, const void *pair_string,
+                       const char *k, const int disable_fast_math);
 
   virtual int loop(const int eflag, const int vflag) = 0;
 };
diff --git a/lib/gpu/lal_born_coul_wolf.cpp b/lib/gpu/lal_born_coul_wolf.cpp
index e6caebbab8..9aac866353 100644
--- a/lib/gpu/lal_born_coul_wolf.cpp
+++ b/lib/gpu/lal_born_coul_wolf.cpp
@@ -57,7 +57,7 @@ int BornCoulWolfT::init(const int ntypes, double **host_cutsq, double **host_rho
                         const double alf, const double e_shift, const double f_shift) {
   int success;
   success=this->init_atomic(nlocal,nall,max_nbors,maxspecial,cell_size,gpu_split,
-                            _screen,born_coul_wolf,"k_born_coul_wolf");
+                            _screen,born_coul_wolf,"k_born_coul_wolf",1);
   if (success!=0)
     return success;
 
diff --git a/lib/gpu/lal_born_coul_wolf_cs.cpp b/lib/gpu/lal_born_coul_wolf_cs.cpp
index 8deceeb1f4..abd4da439a 100644
--- a/lib/gpu/lal_born_coul_wolf_cs.cpp
+++ b/lib/gpu/lal_born_coul_wolf_cs.cpp
@@ -42,7 +42,7 @@ int BornCoulWolfCST::init(const int ntypes, double **host_cutsq, double **host_r
                         const double alf, const double e_shift, const double f_shift) {
   int success;
   success=this->init_atomic(nlocal,nall,max_nbors,maxspecial,cell_size,gpu_split,
-                            _screen,born_coul_wolf_cs,"k_born_coul_wolf_cs");
+                            _screen,born_coul_wolf_cs,"k_born_coul_wolf_cs",1);
   if (success!=0)
     return success;
 
diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp
index e2b5b9cdb5..0ff7125089 100644
--- a/lib/gpu/lal_device.cpp
+++ b/lib/gpu/lal_device.cpp
@@ -420,6 +420,16 @@ int DeviceT::set_ocl_params(std::string s_config, std::string extra_args) {
   return 0;
 }
 
+template 
+std::string DeviceT::compile_string_nofast() {
+  std::string no_fast = _ocl_compile_string;
+  size_t p = no_fast.find("-cl-fast-relaxed-math ");
+  if (p != std::string::npos) no_fast.erase(p,22);
+  p = no_fast.find("-DFAST_MATH=");
+  if (p != std::string::npos) no_fast[p + 12]='0';
+  return no_fast;
+}
+
 template 
 int DeviceT::init(Answer &ans, const bool charge,
                   const bool rot, const int nlocal,
diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h
index 1db6ae3127..933a3508b5 100644
--- a/lib/gpu/lal_device.h
+++ b/lib/gpu/lal_device.h
@@ -312,6 +312,7 @@ class Device {
   }
 
   inline std::string compile_string() { return _ocl_compile_string; }
+  std::string compile_string_nofast();
   inline std::string ocl_config_name() { return _ocl_config_name; }
 
   template 

From fb72e00081bef2f61c7cb4689829c9c12e57939f Mon Sep 17 00:00:00 2001
From: Mike Brown 
Date: Sat, 28 Aug 2021 17:18:05 -0700
Subject: [PATCH 191/437] Fix (the fix) for _MM_SCALE preprocessor defines for
 future Intel compilers.

---
 src/INTEL/intel_preprocess.h | 4 ----
 src/INTEL/intel_simd.h       | 7 +++++++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/INTEL/intel_preprocess.h b/src/INTEL/intel_preprocess.h
index 27daa5f3d2..c7bd60b00b 100644
--- a/src/INTEL/intel_preprocess.h
+++ b/src/INTEL/intel_preprocess.h
@@ -20,10 +20,6 @@
 #define USE_OMP_SIMD
 #define __INTEL_COMPILER __INTEL_LLVM_COMPILER
 #define __INTEL_COMPILER_BUILD_DATE __INTEL_LLVM_COMPILER
-#define _MM_SCALE_1 1
-#define _MM_SCALE_2 2
-#define _MM_SCALE_4 4
-#define _MM_SCALE_8 8
 #endif
 
 #ifdef __INTEL_COMPILER
diff --git a/src/INTEL/intel_simd.h b/src/INTEL/intel_simd.h
index 2affa6a394..d75b2b9175 100644
--- a/src/INTEL/intel_simd.h
+++ b/src/INTEL/intel_simd.h
@@ -35,6 +35,13 @@ authors for more details.
 
 #ifdef __AVX512F__
 
+#ifndef _MM_SCALE_1
+#define _MM_SCALE_1 1
+#define _MM_SCALE_2 2
+#define _MM_SCALE_4 4
+#define _MM_SCALE_8 8
+#endif
+
 namespace ip_simd {
 
   typedef __mmask16 SIMD_mask;

From 05eba8e48469d444e3ae55bc75739973b8da268f Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 16:33:14 -0400
Subject: [PATCH 192/437] move patch release date to august 31st

---
 doc/lammps.1  | 2 +-
 src/version.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/lammps.1 b/doc/lammps.1
index e7b9ef8e6b..b7431319ba 100644
--- a/doc/lammps.1
+++ b/doc/lammps.1
@@ -1,4 +1,4 @@
-.TH LAMMPS "27 August 2021" "2021-08-27"
+.TH LAMMPS "31 August 2021" "2021-08-31"
 .SH NAME
 .B LAMMPS
 \- Molecular Dynamics Simulator.
diff --git a/src/version.h b/src/version.h
index 7d355757eb..366b63f8ea 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "27 Aug 2021"
+#define LAMMPS_VERSION "31 Aug 2021"

From 39d8b239ff1c58394dc49d31e8f3c0c43a1baf80 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 17:56:47 -0400
Subject: [PATCH 193/437] don't report bogus timings

---
 lib/gpu/lal_base_ellipsoid.cpp | 11 +++++++----
 lib/gpu/lal_device.cpp         | 12 +++++++-----
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/lib/gpu/lal_base_ellipsoid.cpp b/lib/gpu/lal_base_ellipsoid.cpp
index 2e22b2f602..fa060bea5a 100644
--- a/lib/gpu/lal_base_ellipsoid.cpp
+++ b/lib/gpu/lal_base_ellipsoid.cpp
@@ -224,7 +224,9 @@ void BaseEllipsoidT::output_times() {
 
   #ifdef USE_OPENCL
   // Workaround for timing issue on Intel OpenCL
+  if (times[0] > 80e6) times[0]=0.0;
   if (times[3] > 80e6) times[3]=0.0;
+  if (times[6] > 80e6) times[6]=0.0;
   #endif
 
   if (device->replica_me()==0)
@@ -237,17 +239,18 @@ void BaseEllipsoidT::output_times() {
       fprintf(screen,"\n-------------------------------------");
       fprintf(screen,"--------------------------------\n");
 
-      if (device->procs_per_gpu()==1 && times[3]>0) {
-        fprintf(screen,"Data Transfer:   %.4f s.\n",times[0]/replica_size);
+      if (device->procs_per_gpu()==1 && (times[3] > 0.0)) {
+        if (times[0] > 0.0)
+          fprintf(screen,"Data Transfer:   %.4f s.\n",times[0]/replica_size);
         fprintf(screen,"Neighbor copy:   %.4f s.\n",times[1]/replica_size);
-        if (nbor->gpu_nbor()>0)
+        if (nbor->gpu_nbor() > 0.0)
           fprintf(screen,"Neighbor build:  %.4f s.\n",times[2]/replica_size);
         else
           fprintf(screen,"Neighbor unpack: %.4f s.\n",times[2]/replica_size);
         fprintf(screen,"Force calc:      %.4f s.\n",times[3]/replica_size);
         fprintf(screen,"LJ calc:         %.4f s.\n",times[4]/replica_size);
       }
-      if (times[6]>0)
+      if (times[6] > 0.0)
         fprintf(screen,"Device Overhead: %.4f s.\n",times[6]/replica_size);
       fprintf(screen,"Average split:   %.4f.\n",avg_split);
       fprintf(screen,"Lanes / atom:    %d.\n",_threads_per_atom);
diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp
index e2b5b9cdb5..50046d8bdd 100644
--- a/lib/gpu/lal_device.cpp
+++ b/lib/gpu/lal_device.cpp
@@ -777,28 +777,30 @@ void DeviceT::output_times(UCL_Timer &time_pair, Answer &ans,
 
   #ifdef USE_OPENCL
   // Workaround for timing issue on Intel OpenCL
+  if (times[0] > 80e6) times[0]=0.0;
   if (times[3] > 80e6) times[3]=0.0;
   if (times[5] > 80e6) times[5]=0.0;
   #endif
 
   if (replica_me()==0)
-    if (screen && times[6]>0.0) {
+    if (screen && (times[6] > 0.0)) {
       fprintf(screen,"\n\n-------------------------------------");
       fprintf(screen,"--------------------------------\n");
       fprintf(screen,"      Device Time Info (average): ");
       fprintf(screen,"\n-------------------------------------");
       fprintf(screen,"--------------------------------\n");
 
-      if (time_device() && times[3]>0) {
-        fprintf(screen,"Data Transfer:   %.4f s.\n",times[0]/_replica_size);
+      if (time_device() && (times[3] > 0.0)) {
+        if (times[0] > 0.0)
+          fprintf(screen,"Data Transfer:   %.4f s.\n",times[0]/_replica_size);
         fprintf(screen,"Neighbor copy:   %.4f s.\n",times[1]/_replica_size);
-        if (nbor.gpu_nbor()>0)
+        if (nbor.gpu_nbor() > 0.0)
           fprintf(screen,"Neighbor build:  %.4f s.\n",times[2]/_replica_size);
         else
           fprintf(screen,"Neighbor unpack: %.4f s.\n",times[2]/_replica_size);
         fprintf(screen,"Force calc:      %.4f s.\n",times[3]/_replica_size);
       }
-      if (times[5]>0)
+      if (times[5] > 0.0)
         fprintf(screen,"Device Overhead: %.4f s.\n",times[5]/_replica_size);
       fprintf(screen,"Average split:   %.4f.\n",avg_split);
       fprintf(screen,"Lanes / atom:    %d.\n",threads_per_atom);

From 664a07a3fe16e5bd2455bda218172f2c810bf143 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 17:57:30 -0400
Subject: [PATCH 194/437] disallow GPU neighbor list with hybrid pair styles
 (which has still problems)

---
 src/GPU/fix_gpu.cpp | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/GPU/fix_gpu.cpp b/src/GPU/fix_gpu.cpp
index 71ab3f4cb4..843bff2a35 100644
--- a/src/GPU/fix_gpu.cpp
+++ b/src/GPU/fix_gpu.cpp
@@ -13,25 +13,26 @@
 ------------------------------------------------------------------------- */
 
 #include "fix_gpu.h"
-#include 
 
 #include "atom.h"
+#include "citeme.h"
 #include "comm.h"
+#include "domain.h"
+#include "error.h"
 #include "force.h"
+#include "gpu_extra.h"
+#include "input.h"
+#include "modify.h"
+#include "neighbor.h"
 #include "pair.h"
 #include "pair_hybrid.h"
 #include "pair_hybrid_overlay.h"
 #include "respa.h"
-#include "input.h"
 #include "timer.h"
-#include "modify.h"
-#include "update.h"
-#include "domain.h"
 #include "universe.h"
-#include "gpu_extra.h"
-#include "neighbor.h"
-#include "citeme.h"
-#include "error.h"
+#include "update.h"
+
+#include 
 
 #if (LAL_USE_OMP == 1)
 #include 
@@ -275,12 +276,15 @@ void FixGPU::init()
     error->warning(FLERR,"Using package gpu without any pair style defined");
 
   // make sure fdotr virial is not accumulated multiple times
+  // also disallow GPU neighbor lists for hybrid styles
 
   if (force->pair_match("^hybrid",0) != nullptr) {
     PairHybrid *hybrid = (PairHybrid *) force->pair;
     for (int i = 0; i < hybrid->nstyles; i++)
       if (!utils::strmatch(hybrid->keywords[i],"/gpu$"))
         force->pair->no_virial_fdotr_compute = 1;
+    if (_gpu_mode != GPU_FORCE)
+      error->all(FLERR, "Must not use GPU neighbor lists with hybrid pair style");
   }
 
   // rRESPA support
@@ -295,8 +299,7 @@ void FixGPU::setup(int vflag)
 {
   if (_gpu_mode == GPU_NEIGH || _gpu_mode == GPU_HYB_NEIGH)
     if (neighbor->exclude_setting() != 0)
-      error->all(FLERR,
-                 "Cannot use neigh_modify exclude with GPU neighbor builds");
+      error->all(FLERR, "Cannot use neigh_modify exclude with GPU neighbor builds");
 
   if (utils::strmatch(update->integrate_style,"^verlet")) post_force(vflag);
   else {

From 518b2c24f295d0795fa982903db7a4725654bd5f Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 21:42:49 -0400
Subject: [PATCH 195/437] use the term 'website' consistently (and not also
 'web site')

---
 doc/src/Build_manual.rst         |  2 +-
 doc/src/Examples.rst             |  4 ++--
 doc/src/Install_windows.rst      |  2 +-
 doc/src/Packages_details.rst     | 12 ++++++------
 doc/src/Speed.rst                |  2 +-
 doc/src/Speed_gpu.rst            |  2 +-
 doc/src/Speed_kokkos.rst         |  2 +-
 doc/src/Speed_packages.rst       |  2 +-
 doc/src/fix_wall_gran_region.rst |  2 +-
 9 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst
index bd96a8dafb..18d097c255 100644
--- a/doc/src/Build_manual.rst
+++ b/doc/src/Build_manual.rst
@@ -76,7 +76,7 @@ folder.  The following ``make`` commands are available:
 
    make html          # generate HTML in html dir using Sphinx
    make pdf           # generate PDF  as Manual.pdf using Sphinx and pdflatex
-   make fetch         # fetch HTML pages and PDF files from LAMMPS web site
+   make fetch         # fetch HTML pages and PDF files from LAMMPS website
                       #  and unpack into the html_www folder and Manual_www.pdf
    make epub          # generate LAMMPS.epub in ePUB format using Sphinx
    make mobi          # generate LAMMPS.mobi in MOBI format using ebook-convert
diff --git a/doc/src/Examples.rst b/doc/src/Examples.rst
index 649be52ab7..f91ca2db11 100644
--- a/doc/src/Examples.rst
+++ b/doc/src/Examples.rst
@@ -27,7 +27,7 @@ be quickly post-processed into a movie using commands described on the
 :doc:`dump image ` doc page.
 
 Animations of many of the examples can be viewed on the Movies section
-of the `LAMMPS web site `_.
+of the `LAMMPS website `_.
 
 There are two kinds of sub-directories in the examples folder.  Lower
 case named directories contain one or a few simple, quick-to-run
@@ -169,7 +169,7 @@ Running the simulation produces the files *dump.indent* and
 *log.lammps*\ .  You can visualize the dump file of snapshots with a
 variety of third-party tools highlighted on the
 `Visualization `_ page of the LAMMPS
-web site.
+website.
 
 If you uncomment the :doc:`dump image ` line(s) in the input
 script a series of JPG images will be produced by the run (assuming
diff --git a/doc/src/Install_windows.rst b/doc/src/Install_windows.rst
index 1e5c9684ac..108c03c249 100644
--- a/doc/src/Install_windows.rst
+++ b/doc/src/Install_windows.rst
@@ -12,7 +12,7 @@ Note that each installer package has a date in its name, which
 corresponds to the LAMMPS version of the same date.  Installers for
 current and older versions of LAMMPS are available.  32-bit and 64-bit
 installers are available, and each installer contains both a serial
-and parallel executable.  The installer web site also explains how to
+and parallel executable.  The installer website also explains how to
 install the Windows MPI package (MPICH2 from Argonne National Labs),
 needed to run in parallel with MPI.
 
diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst
index b4e50fad75..85dead55a3 100644
--- a/doc/src/Packages_details.rst
+++ b/doc/src/Packages_details.rst
@@ -915,7 +915,7 @@ This package has :ref:`specific installation instructions ` on the :doc:`Bu
 * :doc:`package gpu `
 * :doc:`Commands ` pages (:doc:`pair `, :doc:`kspace `)
   for styles followed by (g)
-* `Benchmarks page `_ of web site
+* `Benchmarks page `_ of website
 
 ----------
 
@@ -1027,7 +1027,7 @@ This package has :ref:`specific installation instructions ` on the :doc:`
 * Search the :doc:`commands ` pages (:doc:`fix `, :doc:`compute `,
   :doc:`pair `, :doc:`bond, angle, dihedral, improper `, :doc:`kspace `) for styles followed by (i)
 * src/INTEL/TEST
-* `Benchmarks page `_ of web site
+* `Benchmarks page `_ of website
 
 ----------
 
@@ -1164,7 +1164,7 @@ This package has :ref:`specific installation instructions ` on the :doc:
 * Search the :doc:`commands ` pages (:doc:`fix `, :doc:`compute `,
   :doc:`pair `, :doc:`bond, angle, dihedral, improper `,
   :doc:`kspace `) for styles followed by (k)
-* `Benchmarks page `_ of web site
+* `Benchmarks page `_ of website
 
 ----------
 
@@ -1242,7 +1242,7 @@ A fix command which wraps the LATTE DFTB code, so that molecular
 dynamics can be run with LAMMPS using density-functional tight-binding
 quantum forces calculated by LATTE.
 
-More information on LATTE can be found at this web site:
+More information on LATTE can be found at this website:
 `https://github.com/lanl/LATTE `_.  A brief technical
 description is given with the :doc:`fix latte ` command.
 
@@ -2017,7 +2017,7 @@ the :doc:`Build extras ` page.
 * Search the :doc:`commands ` pages (:doc:`fix `, :doc:`compute `,
   :doc:`pair `, :doc:`bond, angle, dihedral, improper `,
   :doc:`kspace `) for styles followed by (o)
-* `Benchmarks page `_ of web site
+* `Benchmarks page `_ of website
 
 ----------
 
@@ -2051,7 +2051,7 @@ This package has :ref:`specific installation instructions ` on the :doc:`Bu
 * :doc:`OPT package `
 * :doc:`Section 2.6 -sf opt `
 * Search the :doc:`pair style ` page for styles followed by (t)
-* `Benchmarks page `_ of web site
+* `Benchmarks page `_ of website
 
 .. _PKG-ORIENT:
 
diff --git a/doc/src/Speed.rst b/doc/src/Speed.rst
index ccabc0adb6..02eae1f3fa 100644
--- a/doc/src/Speed.rst
+++ b/doc/src/Speed.rst
@@ -13,7 +13,7 @@ for certain kinds of hardware, including multi-core CPUs, GPUs, and
 Intel Xeon Phi co-processors.
 
 The `Benchmark page `_ of the LAMMPS
-web site gives performance results for the various accelerator
+website gives performance results for the various accelerator
 packages discussed on the :doc:`Speed packages ` doc
 page, for several of the standard LAMMPS benchmark problems, as a
 function of problem size and number of compute nodes, on different
diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst
index 656ce08bbc..9015bff9ef 100644
--- a/doc/src/Speed_gpu.rst
+++ b/doc/src/Speed_gpu.rst
@@ -153,7 +153,7 @@ usually resulting in inferior performance compared to using LAMMPS' native
 threading and vectorization support in the OPENMP and INTEL packages.
 
 See the `Benchmark page `_ of the
-LAMMPS web site for performance of the GPU package on various
+LAMMPS website for performance of the GPU package on various
 hardware, including the Titan HPC platform at ORNL.
 
 You should also experiment with how many MPI tasks per GPU to use to
diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst
index 400db9585c..14c2ec680e 100644
--- a/doc/src/Speed_kokkos.rst
+++ b/doc/src/Speed_kokkos.rst
@@ -407,7 +407,7 @@ Generally speaking, the following rules of thumb apply:
   by switching to single or mixed precision mode.
 
 See the `Benchmark page `_ of the
-LAMMPS web site for performance of the KOKKOS package on different
+LAMMPS website for performance of the KOKKOS package on different
 hardware.
 
 Advanced Kokkos options
diff --git a/doc/src/Speed_packages.rst b/doc/src/Speed_packages.rst
index be3f205f4b..74d470c9fd 100644
--- a/doc/src/Speed_packages.rst
+++ b/doc/src/Speed_packages.rst
@@ -144,7 +144,7 @@ sub-directories with Make.py commands and input scripts for using all
 the accelerator packages on various machines.  See the README files in
 those directories.
 
-As mentioned above, the `Benchmark page `_ of the LAMMPS web site gives
+As mentioned above, the `Benchmark page `_ of the LAMMPS website gives
 performance results for the various accelerator packages for several
 of the standard LAMMPS benchmark problems, as a function of problem
 size and number of compute nodes, on different hardware platforms.
diff --git a/doc/src/fix_wall_gran_region.rst b/doc/src/fix_wall_gran_region.rst
index 95634238aa..5a4c983554 100644
--- a/doc/src/fix_wall_gran_region.rst
+++ b/doc/src/fix_wall_gran_region.rst
@@ -66,7 +66,7 @@ non-granular particles and simpler wall geometries, respectively.
 Here are snapshots of example models using this command.  Corresponding
 input scripts can be found in examples/granregion.  Movies of these
 simulations are `here on the Movies page `_
-of the LAMMPS web site.
+of the LAMMPS website.
 
 .. |wallgran1| image:: img/gran_funnel.png
    :width: 48%

From be3348be8640aeeb42940d3149cd654cd29c5e2e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 21:42:59 -0400
Subject: [PATCH 196/437] update for clang-format

---
 doc/src/Modify_overview.rst | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/doc/src/Modify_overview.rst b/doc/src/Modify_overview.rst
index e733dc1563..0a3ff58f13 100644
--- a/doc/src/Modify_overview.rst
+++ b/doc/src/Modify_overview.rst
@@ -40,8 +40,10 @@ then your pair_foo.h file should be structured as follows:
 .. code-block:: c++
 
    #ifdef PAIR_CLASS
-   PairStyle(foo,PairFoo)
+   // clang-format off
+   PairStyle(foo,PairFoo);
    #else
+   // clanf-format on
    ...
    (class definition for PairFoo)
    ...

From afc65993d08d910585350c8cf06cafb1e7d8e90d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 21:43:13 -0400
Subject: [PATCH 197/437] clarify

---
 doc/src/Modify_contribute.rst | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst
index ff39773764..55eac60716 100644
--- a/doc/src/Modify_contribute.rst
+++ b/doc/src/Modify_contribute.rst
@@ -56,27 +56,27 @@ files to LAMMPS or as part of a :doc:`package `.  All
 packages are listed and described on the :doc:`Packages details
 ` doc page.
 
-Note that by providing us files to release, you are agreeing to make
-them open-source, i.e. we can release them under the terms of the GPL
-(version 2), used as a license for the rest of LAMMPS.  And as part of
-a LGPL (version 2.1) distribution that we make available to developers
-on request only and with files that are authorized for that kind of
-distribution removed (e.g. interface to FFTW).  See the
+Note that by providing us files to release, you agree to make them
+open-source, i.e. we can release them under the terms of the GPL
+(version 2) with the rest of LAMMPS.  And similarly as part of a LGPL
+(version 2.1) distribution of LAMMPS that we make available to
+developers on request only and with files that are not authorized for
+that kind of distribution removed (e.g. interface to FFTW).  See the
 :doc:`LAMMPS license ` page for details.
 
 .. note::
 
-   If you prefer to actively develop and support your add-on feature
-   yourself, then you may wish to make it available for download from
-   your own website, as a user package that LAMMPS users can add to
-   their copy of LAMMPS.  See the `Offsite LAMMPS packages and tools
-   `_ page of the LAMMPS web site
-   for examples of groups that do this.  We are happy to advertise your
-   package and web site from that page.  Simply email the `developers
-   `_ with info about your package
-   and we will post it there.  We recommend to name external packages
-   USER-\ so they can be easily distinguished from bundled packages
-   that do not have the USER- prefix.
+   If you prefer so, you can also develop and support your add-on
+   feature without having it included in the LAMMPS distribution, for
+   example as a download from a website of your own.  See the `Offsite
+   LAMMPS packages and tools `_
+   page of the LAMMPS website for examples of groups that do this.  We
+   are happy to advertise your package and website from that page.
+   Simply email the `developers `_
+   with info about your package and we will post it there.  We recommend
+   to name external packages USER-\ so they can be easily
+   distinguished from bundled packages that do not have the USER-
+   prefix.
 
 .. _lws: https://www.lammps.org
 

From 5257b8d28087ee7712e7a7ecf0bb32afc47cff33 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 22:00:05 -0400
Subject: [PATCH 198/437] split off the programming/submission style guide to a
 separate file

---
 doc/src/Modify.rst            |   1 +
 doc/src/Modify_contribute.rst | 214 +++++-----------------------------
 doc/src/Modify_style.rst      | 167 ++++++++++++++++++++++++++
 3 files changed, 196 insertions(+), 186 deletions(-)
 create mode 100644 doc/src/Modify_style.rst

diff --git a/doc/src/Modify.rst b/doc/src/Modify.rst
index 2a727dfd0f..3e444cc6cf 100644
--- a/doc/src/Modify.rst
+++ b/doc/src/Modify.rst
@@ -16,6 +16,7 @@ after reading :doc:`this page `.
 
    Modify_overview
    Modify_contribute
+   Modify_style
 
 .. toctree::
    :maxdepth: 1
diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst
index 55eac60716..154b2d80a8 100644
--- a/doc/src/Modify_contribute.rst
+++ b/doc/src/Modify_contribute.rst
@@ -2,8 +2,8 @@ Submitting new features for inclusion in LAMMPS
 ===============================================
 
 We encourage users to submit new features or modifications for LAMMPS to
-`the core developers `_ so they
-can be added to the LAMMPS distribution. The preferred way to manage and
+`the core developers `_ so they can
+be added to the LAMMPS distribution. The preferred way to manage and
 coordinate this is via the LAMMPS project on `GitHub
 `_.  Please see the :doc:`GitHub
 Tutorial ` for a demonstration on how to do that.  An
@@ -24,29 +24,36 @@ and submit a new issue for a planned feature, so you would not duplicate
 the work of others (and possibly get scooped by them) or have your work
 duplicated by others.
 
-For informal communication with (some of) the LAMMPS developers you may
-ask to join the `LAMMPS developers on Slack
-`_.  This slack work space is by invitation
-only. Thus for access, please send an e-mail to ``slack@lammps.org``
-explaining what part of LAMMPS you are working on.  Only discussions
-related to LAMMPS development are tolerated, so this is **NOT** for
-people that look for help with compiling, installing, or using
-LAMMPS. Please contact the
+For informal communication with the LAMMPS developers you may ask to
+join the `LAMMPS developers on Slack `_.  This
+slack work space is by invitation only. Thus for access, please send an
+e-mail to ``slack@lammps.org`` explaining what part of LAMMPS you are
+working on.  Only discussions related to LAMMPS development are
+tolerated, so this is **NOT** for people that look for help with
+compiling, installing, or using LAMMPS. Please post a message to the
 `lammps-users mailing list `_ or the
-`LAMMPS forum `_ for those purposes
-instead.
+`LAMMPS forum `_ for those purposes.
 
 How quickly your contribution will be integrated depends largely on how
 much effort it will cause to integrate and test it, how many and what
 kind of changes it requires to the core codebase, and of how much
-interest it is to the larger LAMMPS community.  Please see below for a
-checklist of typical requirements.  Once you have prepared everything,
-see the :doc:`LAMMPS GitHub Tutorial ` page for
-instructions on how to submit your changes or new files through a GitHub
-pull request.  If you prefer to submit patches or full files, you should
-first make certain, that your code works correctly with the latest
-patch-level version of LAMMPS and contains all bug fixes from it.  Then
-create a gzipped tar file of all changed or added files or a
+interest it is to the larger LAMMPS community.  Please see the section
+on :doc:`LAMMPS programming style and requirements ` for
+instructions, recommendations, and requirements.
+
+Once you have prepared everything, see the :doc:`LAMMPS GitHub Tutorial
+` page for instructions on how to submit your changes or
+new files through a GitHub pull request.  If you are unable or unwilling
+to submit via GitHub yourself, you may also submit patch files or full
+files to the LAMMPS developers and ask them to submit a pull request on
+GitHub on your behalf.  **All** changes to LAMMPS (including those from
+the LAMMPS core developers) must be submitted as GitHub pull requests
+and cannot be merged without passing the automated integration and unit
+testing as well as a code review by a LAMMPS core developer that did not
+submit it.  Thus before submitting your contribution, you should first
+make certain, that your added or modified code works correctly with the
+latest patch-level version of LAMMPS and contains all bug fixes from it.
+Then create a gzipped tar file of all changed or added files or a
 corresponding patch file using 'diff -u' or 'diff -c' and compress it
 with gzip.  Please only use gzip compression, as this works well and is
 available on all platforms.
@@ -66,7 +73,7 @@ that kind of distribution removed (e.g. interface to FFTW).  See the
 
 .. note::
 
-   If you prefer so, you can also develop and support your add-on
+   If you prefer to do so, you can also develop and support your add-on
    feature without having it included in the LAMMPS distribution, for
    example as a download from a website of your own.  See the `Offsite
    LAMMPS packages and tools `_
@@ -91,168 +98,3 @@ developers `_, since we may or
 may not want to include those changes for some reason.  An example of a
 trivial change is making a parent-class method "virtual" when you derive
 a new child class from it.
-
-Here is a checklist of steps you need to follow to submit a single file
-or package for our consideration.  Following these steps will save
-both you and us time. Please have a look at the existing files in
-packages in the src directory for examples. If you are uncertain, please ask.
-
-* All source files you provide must compile with the most current
-  version of LAMMPS with multiple configurations. In particular you
-  need to test compiling LAMMPS from scratch with -DLAMMPS_BIGBIG
-  set in addition to the default -DLAMMPS_SMALLBIG setting. Your code
-  will need to work correctly in serial and in parallel using MPI.
-
-* For consistency with the rest of LAMMPS and especially, if you want
-  your contribution(s) to be added to main LAMMPS code or one of its
-  standard packages, it needs to be written in a style compatible with
-  other LAMMPS source files. This means: 2-character indentation per
-  level, **no tabs**, no lines over 100 characters. I/O is done via
-  the C-style stdio library (mixing of stdio and iostreams is generally
-  discouraged), class header files should not import any system headers
-  outside of , STL containers should be avoided in headers,
-  system header from the C library should use the C++-style names
-  (, , or ) instead of the C-style names
-  , , or ), and forward declarations
-  used where possible or needed to avoid including headers.
-  All added code should be placed into the LAMMPS_NS namespace or a
-  sub-namespace; global or static variables should be avoided, as they
-  conflict with the modular nature of LAMMPS and the C++ class structure.
-  Header files must **not** import namespaces with *using*\ .
-  This all is so the developers can more easily understand, integrate,
-  and maintain your contribution and reduce conflicts with other parts
-  of LAMMPS.  This basically means that the code accesses data
-  structures, performs its operations, and is formatted similar to other
-  LAMMPS source files, including the use of the error class for error
-  and warning messages.
-
-* To simplify reformatting contributed code in a way that is compatible
-  with the LAMMPS formatting styles, you can use clang-format (version 8
-  or later).  The LAMMPS distribution includes a suitable ``.clang-format``
-  file which will be applied if you run ``clang-format -i some_file.cpp``
-  on your files inside the LAMMPS src tree.  Please only reformat files
-  that you have contributed.  For header files containing a
-  ``SomeStyle(keyword, ClassName)`` macros it is required to have this
-  macro embedded with a pair of ``// clang-format off``, ``// clang-format on``
-  commends and the line must be terminated with a semi-colon (;).
-  Example:
-
-  .. code-block:: c++
-
-     #ifdef COMMAND_CLASS
-     // clang-format off
-     CommandStyle(run,Run);
-     // clang-format on
-     #else
-
-     #ifndef LMP_RUN_H
-     [...]
-
-  You may also use ``// clang-format on/off`` throughout your file
-  to protect sections of the file from being reformatted.
-
-* Please review the list of :doc:`available Packages `
-  to see if your contribution could be added to be added to one of them.
-  It should fit into the general purposed of that package.  If it does not
-  fit well, it can be added to one of the EXTRA- packages or the MISC package.
-
-* If your contribution has several related features that are not covered
-  by one of the existing packages or is dependent on a library (bundled
-  or external), it is best to make it a package directory with a name
-  like FOO.  In addition to your new files, the directory should contain
-  a README text file.  The README should contain your name and contact
-  information and a brief description of what your new package does.  If
-  your files depend on other LAMMPS style files also being installed
-  (e.g. because your file is a derived class from the other LAMMPS
-  class), then an Install.sh file is also needed to check for those
-  dependencies and modifications to src/Depend.sh to trigger the checks.
-  See other README and Install.sh files in other directories as examples.
-  Similarly for CMake support changes need to be made to cmake/CMakeLists.txt,
-  the files in cmake/presets, and possibly a file to cmake/Modules/Packages/
-  added.  Please check out how this is handled for existing packages and
-  ask the LAMMPS developers if you need assistance.  Please submit a pull
-  request on GitHub or send us a tarball of this FOO directory and all
-  modified files.  Pull requests are strongly encouraged since they greatly
-  reduce the effort required to integrate a contribution and simplify the
-  process of adjusting the contributed code to cleanly fit into the
-  LAMMPS distribution.
-
-* Your new source files need to have the LAMMPS copyright, GPL notice,
-  and your name and email address at the top, like other
-  user-contributed LAMMPS source files.  They need to create a class
-  that is inside the LAMMPS namespace.  To simplify maintenance, we
-  may ask to adjust the programming style and formatting style to closer
-  match the rest of LAMMPS.  We bundle a clang-format configuration file
-  that can help with adjusting the formatting, although this is not a
-  strict requirement.
-
-* You **must** also create a **documentation** file for each new command
-  or style you are adding to LAMMPS.  For simplicity and convenience,
-  the documentation of groups of closely related commands or styles may
-  be combined into a single file.  This will be one file for a
-  single-file feature.  For a package, it might be several files.  These
-  are text files with a .rst extension using the `reStructuredText
-  `_ markup language, that are then converted to HTML and PDF
-  using the `Sphinx `_ documentation generator tool.  Running
-  Sphinx with the included configuration requires Python 3.x.
-  Configuration settings and custom extensions for this conversion are
-  included in the source distribution, and missing python packages will
-  be transparently downloaded into a virtual environment via pip. Thus,
-  if your local system is missing required packages, you need access to
-  the internet. The translation can be as simple as doing "make html
-  pdf" in the doc folder.  As appropriate, the text files can include
-  inline mathematical expression or figures (see doc/JPG for examples).
-  Additional PDF files with further details (see doc/PDF for examples)
-  may also be included.  The page should also include literature
-  citations as appropriate; see the bottom of doc/fix_nh.rst for
-  examples and the earlier part of the same file for how to format the
-  cite itself.  Citation labels must be unique across all .rst files.
-  The "Restrictions" section of the page should indicate if your
-  command is only available if LAMMPS is built with the appropriate
-  FOO package.  See other package doc files for examples of
-  how to do this.  Please run at least "make html" and "make spelling"
-  and carefully inspect and proofread the resulting HTML format doc page
-  before submitting your code.  Upon submission of a pull request,
-  checks for error free completion of the HTML and PDF build will be
-  performed and also a spell check, a check for correct anchors and
-  labels, and a check for completeness of references all styles in their
-  corresponding tables and lists is run.  In case the spell check
-  reports false positives they can be added to the file
-  doc/utils/sphinx-config/false_positives.txt
-
-* For a new package (or even a single command) you should include one or
-  more example scripts demonstrating its use.  These should run in no
-  more than a couple minutes, even on a single processor, and not require
-  large data files as input.  See directories under examples/PACKAGES for
-  examples of input scripts other users provided for their packages.
-  These example inputs are also required for validating memory accesses
-  and testing for memory leaks with valgrind
-
-* If there is a paper of yours describing your feature (either the
-  algorithm/science behind the feature itself, or its initial usage, or
-  its implementation in LAMMPS), you can add the citation to the \*.cpp
-  source file.  See src/EFF/atom_vec_electron.cpp for an example.
-  A LaTeX citation is stored in a variable at the top of the file and
-  a single line of code registering this variable is added to the
-  constructor of the class.  If there is additional functionality (which
-  may have been added later) described in a different publication,
-  additional citation descriptions may be added for as long as they
-  are only registered when the corresponding keyword activating this
-  functionality is used.  With these options it is possible to have
-  LAMMPS output a specific citation reminder whenever a user invokes
-  your feature from their input script.  Note that you should only use
-  this for the most relevant paper for a feature and a publication that
-  you or your group authored.  E.g. adding a citation in the code for
-  a paper by Nose and Hoover if you write a fix that implements their
-  integrator is not the intended usage.  That kind of citation should
-  just be included in the documentation page you provide describing
-  your contribution.  If you are not sure what the best option would
-  be, please contact the LAMMPS developers for advice.
-
-Finally, as a general rule-of-thumb, the more clear and
-self-explanatory you make your documentation and README files, and the
-easier you make it for people to get started, e.g. by providing example
-scripts, the more likely it is that users will try out your new feature.
-
-.. _rst: https://docutils.readthedocs.io/en/sphinx-docs/user/rst/quickstart.html
-.. _sphinx: https://sphinx-doc.org
diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst
new file mode 100644
index 0000000000..d2d192937c
--- /dev/null
+++ b/doc/src/Modify_style.rst
@@ -0,0 +1,167 @@
+LAMMPS programming style and requirements
+=========================================
+
+Here is a checklist of steps you need to follow to submit a single file
+or package for our consideration.  Following these steps will save
+both you and us time. Please have a look at the existing files in
+packages in the src directory for examples. If you are uncertain, please ask.
+
+* All source files you provide must compile with the most current
+  version of LAMMPS with multiple configurations. In particular you
+  need to test compiling LAMMPS from scratch with -DLAMMPS_BIGBIG
+  set in addition to the default -DLAMMPS_SMALLBIG setting. Your code
+  will need to work correctly in serial and in parallel using MPI.
+
+* For consistency with the rest of LAMMPS and especially, if you want
+  your contribution(s) to be added to main LAMMPS code or one of its
+  standard packages, it needs to be written in a style compatible with
+  other LAMMPS source files. This means: 2-character indentation per
+  level, **no tabs**, no lines over 100 characters. I/O is done via
+  the C-style stdio library (mixing of stdio and iostreams is generally
+  discouraged), class header files should not import any system headers
+  outside of , STL containers should be avoided in headers,
+  system header from the C library should use the C++-style names
+  (, , or ) instead of the C-style names
+  , , or ), and forward declarations
+  used where possible or needed to avoid including headers.
+  All added code should be placed into the LAMMPS_NS namespace or a
+  sub-namespace; global or static variables should be avoided, as they
+  conflict with the modular nature of LAMMPS and the C++ class structure.
+  Header files must **not** import namespaces with *using*\ .
+  This all is so the developers can more easily understand, integrate,
+  and maintain your contribution and reduce conflicts with other parts
+  of LAMMPS.  This basically means that the code accesses data
+  structures, performs its operations, and is formatted similar to other
+  LAMMPS source files, including the use of the error class for error
+  and warning messages.
+
+* To simplify reformatting contributed code in a way that is compatible
+  with the LAMMPS formatting styles, you can use clang-format (version 8
+  or later).  The LAMMPS distribution includes a suitable ``.clang-format``
+  file which will be applied if you run ``clang-format -i some_file.cpp``
+  on your files inside the LAMMPS src tree.  Please only reformat files
+  that you have contributed.  For header files containing a
+  ``SomeStyle(keyword, ClassName)`` macros it is required to have this
+  macro embedded with a pair of ``// clang-format off``, ``// clang-format on``
+  commends and the line must be terminated with a semi-colon (;).
+  Example:
+
+  .. code-block:: c++
+
+     #ifdef COMMAND_CLASS
+     // clang-format off
+     CommandStyle(run,Run);
+     // clang-format on
+     #else
+
+     #ifndef LMP_RUN_H
+     [...]
+
+  You may also use ``// clang-format on/off`` throughout your file
+  to protect sections of the file from being reformatted.
+
+* Please review the list of :doc:`available Packages `
+  to see if your contribution could be added to be added to one of them.
+  It should fit into the general purposed of that package.  If it does not
+  fit well, it can be added to one of the EXTRA- packages or the MISC package.
+
+* If your contribution has several related features that are not covered
+  by one of the existing packages or is dependent on a library (bundled
+  or external), it is best to make it a package directory with a name
+  like FOO.  In addition to your new files, the directory should contain
+  a README text file.  The README should contain your name and contact
+  information and a brief description of what your new package does.  If
+  your files depend on other LAMMPS style files also being installed
+  (e.g. because your file is a derived class from the other LAMMPS
+  class), then an Install.sh file is also needed to check for those
+  dependencies and modifications to src/Depend.sh to trigger the checks.
+  See other README and Install.sh files in other directories as examples.
+  Similarly for CMake support changes need to be made to cmake/CMakeLists.txt,
+  the files in cmake/presets, and possibly a file to cmake/Modules/Packages/
+  added.  Please check out how this is handled for existing packages and
+  ask the LAMMPS developers if you need assistance.  Please submit a pull
+  request on GitHub or send us a tarball of this FOO directory and all
+  modified files.  Pull requests are strongly encouraged since they greatly
+  reduce the effort required to integrate a contribution and simplify the
+  process of adjusting the contributed code to cleanly fit into the
+  LAMMPS distribution.
+
+* Your new source files need to have the LAMMPS copyright, GPL notice,
+  and your name and email address at the top, like other
+  user-contributed LAMMPS source files.  They need to create a class
+  that is inside the LAMMPS namespace.  To simplify maintenance, we
+  may ask to adjust the programming style and formatting style to closer
+  match the rest of LAMMPS.  We bundle a clang-format configuration file
+  that can help with adjusting the formatting, although this is not a
+  strict requirement.
+
+* You **must** also create a **documentation** file for each new command
+  or style you are adding to LAMMPS.  For simplicity and convenience,
+  the documentation of groups of closely related commands or styles may
+  be combined into a single file.  This will be one file for a
+  single-file feature.  For a package, it might be several files.  These
+  are text files with a .rst extension using the `reStructuredText
+  `_ markup language, that are then converted to HTML and PDF
+  using the `Sphinx `_ documentation generator tool.  Running
+  Sphinx with the included configuration requires Python 3.x.
+  Configuration settings and custom extensions for this conversion are
+  included in the source distribution, and missing python packages will
+  be transparently downloaded into a virtual environment via pip. Thus,
+  if your local system is missing required packages, you need access to
+  the internet. The translation can be as simple as doing "make html
+  pdf" in the doc folder.  As appropriate, the text files can include
+  inline mathematical expression or figures (see doc/JPG for examples).
+  Additional PDF files with further details (see doc/PDF for examples)
+  may also be included.  The page should also include literature
+  citations as appropriate; see the bottom of doc/fix_nh.rst for
+  examples and the earlier part of the same file for how to format the
+  cite itself.  Citation labels must be unique across all .rst files.
+  The "Restrictions" section of the page should indicate if your
+  command is only available if LAMMPS is built with the appropriate
+  FOO package.  See other package doc files for examples of
+  how to do this.  Please run at least "make html" and "make spelling"
+  and carefully inspect and proofread the resulting HTML format doc page
+  before submitting your code.  Upon submission of a pull request,
+  checks for error free completion of the HTML and PDF build will be
+  performed and also a spell check, a check for correct anchors and
+  labels, and a check for completeness of references all styles in their
+  corresponding tables and lists is run.  In case the spell check
+  reports false positives they can be added to the file
+  doc/utils/sphinx-config/false_positives.txt
+
+* For a new package (or even a single command) you should include one or
+  more example scripts demonstrating its use.  These should run in no
+  more than a couple minutes, even on a single processor, and not require
+  large data files as input.  See directories under examples/PACKAGES for
+  examples of input scripts other users provided for their packages.
+  These example inputs are also required for validating memory accesses
+  and testing for memory leaks with valgrind
+
+* If there is a paper of yours describing your feature (either the
+  algorithm/science behind the feature itself, or its initial usage, or
+  its implementation in LAMMPS), you can add the citation to the \*.cpp
+  source file.  See src/EFF/atom_vec_electron.cpp for an example.
+  A LaTeX citation is stored in a variable at the top of the file and
+  a single line of code registering this variable is added to the
+  constructor of the class.  If there is additional functionality (which
+  may have been added later) described in a different publication,
+  additional citation descriptions may be added for as long as they
+  are only registered when the corresponding keyword activating this
+  functionality is used.  With these options it is possible to have
+  LAMMPS output a specific citation reminder whenever a user invokes
+  your feature from their input script.  Note that you should only use
+  this for the most relevant paper for a feature and a publication that
+  you or your group authored.  E.g. adding a citation in the code for
+  a paper by Nose and Hoover if you write a fix that implements their
+  integrator is not the intended usage.  That kind of citation should
+  just be included in the documentation page you provide describing
+  your contribution.  If you are not sure what the best option would
+  be, please contact the LAMMPS developers for advice.
+
+Finally, as a general rule-of-thumb, the more clear and
+self-explanatory you make your documentation and README files, and the
+easier you make it for people to get started, e.g. by providing example
+scripts, the more likely it is that users will try out your new feature.
+
+.. _rst: https://docutils.readthedocs.io/en/sphinx-docs/user/rst/quickstart.html
+.. _sphinx: https://sphinx-doc.org

From 284ed98fb8c3979b625261ceb4443bec7ddfdd2c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Sun, 29 Aug 2021 22:08:49 -0400
Subject: [PATCH 199/437] fix spelling error and reformat paragraph

---
 doc/src/pair_snap.rst | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst
index e00169b306..1bc17fa8c8 100644
--- a/doc/src/pair_snap.rst
+++ b/doc/src/pair_snap.rst
@@ -191,22 +191,19 @@ pair_coeff command, to avoid ambiguity in the number of coefficients.
 
 The keywords *chunksize* and *parallelthresh* are only applicable when
 using the pair style *snap* with the KOKKOS package on GPUs and are
-ignored otherwise.
-The *chunksize* keyword controls
-the number of atoms in each pass used to compute the bispectrum
-components and is used to avoid running out of memory. For example
-if there are 8192 atoms in the simulation and the *chunksize*
-is set to 4096, the bispectrum calculation will be broken up
-into two passes (running on a single GPU).
-The *parallelthresh* keyword controls
-a crossover threshold for performing extra parallelism. For
-small systems, exposing additional parallism can be beneficial when
-there is not enough work to fully saturate the GPU threads otherwise.
-However, the extra parallelism also leads to more divergence
-and can hurt performance when the system is already large enough to
-saturate the GPU threads. Extra parallelism will be performed if the
-*chunksize* (or total number of atoms per GPU) is smaller than
-*parallelthresh*.
+ignored otherwise.  The *chunksize* keyword controls the number of atoms
+in each pass used to compute the bispectrum components and is used to
+avoid running out of memory.  For example if there are 8192 atoms in the
+simulation and the *chunksize* is set to 4096, the bispectrum
+calculation will be broken up into two passes (running on a single GPU).
+The *parallelthresh* keyword controls a crossover threshold for
+performing extra parallelism.  For small systems, exposing additional
+parallelism can be beneficial when there is not enough work to fully
+saturate the GPU threads otherwise.  However, the extra parallelism also
+leads to more divergence and can hurt performance when the system is
+already large enough to saturate the GPU threads.  Extra parallelism
+will be performed if the *chunksize* (or total number of atoms per GPU)
+is smaller than *parallelthresh*.
 
 Detailed definitions for all the other keywords
 are given on the :doc:`compute sna/atom ` doc page.

From 00c3c5cf06b013e4cad7eb052ab5634aa3a16e15 Mon Sep 17 00:00:00 2001
From: Stan Gerald Moore 
Date: Mon, 30 Aug 2021 12:43:07 -0600
Subject: [PATCH 200/437] Port changes from #2903 to Kokkos

---
 src/KOKKOS/fix_property_atom_kokkos.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp
index 841b791c5c..97931f5d67 100644
--- a/src/KOKKOS/fix_property_atom_kokkos.cpp
+++ b/src/KOKKOS/fix_property_atom_kokkos.cpp
@@ -45,23 +45,23 @@ FixPropertyAtomKokkos::FixPropertyAtomKokkos(LAMMPS *lmp, int narg, char **arg)
 void FixPropertyAtomKokkos::grow_arrays(int nmax)
 {
   for (int m = 0; m < nvalue; m++) {
-    if (style[m] == MOLECULE) {
+    if (styles[m] == MOLECULE) {
       memory->grow(atom->molecule,nmax,"atom:molecule");
       size_t nbytes = (nmax-nmax_old) * sizeof(tagint);
       memset(&atom->molecule[nmax_old],0,nbytes);
-    } else if (style[m] == CHARGE) {
+    } else if (styles[m] == CHARGE) {
       memory->grow(atom->q,nmax,"atom:q");
       size_t nbytes = (nmax-nmax_old) * sizeof(double);
       memset(&atom->q[nmax_old],0,nbytes);
-    } else if (style[m] == RMASS) {
+    } else if (styles[m] == RMASS) {
       memory->grow(atom->rmass,nmax,"atom:rmass");
       size_t nbytes = (nmax-nmax_old) * sizeof(double);
       memset(&atom->rmass[nmax_old],0,nbytes);
-    } else if (style[m] == INTEGER) {
+    } else if (styles[m] == INTEGER) {
       memory->grow(atom->ivector[index[m]],nmax,"atom:ivector");
       size_t nbytes = (nmax-nmax_old) * sizeof(int);
       memset(&atom->ivector[index[m]][nmax_old],0,nbytes);
-    } else if (style[m] == DOUBLE) {
+    } else if (styles[m] == DOUBLE) {
       atomKK->sync(Device,DVECTOR_MASK);
       memoryKK->grow_kokkos(atomKK->k_dvector,atomKK->dvector,atomKK->k_dvector.extent(0),nmax,
                           "atom:dvector");

From 0e639a2c5b1c165416112628beaf956f7b3cb030 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Mon, 30 Aug 2021 14:52:26 -0600
Subject: [PATCH 201/437] Add missing Kokkos sync to host

---
 src/KOKKOS/comm_kokkos.cpp       | 10 ++++++++++
 src/KOKKOS/comm_kokkos.h         |  2 ++
 src/KOKKOS/comm_tiled_kokkos.cpp |  1 +
 src/comm_brick.h                 |  2 +-
 4 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp
index 588ff94d73..888a1e105f 100644
--- a/src/KOKKOS/comm_kokkos.cpp
+++ b/src/KOKKOS/comm_kokkos.cpp
@@ -1315,3 +1315,13 @@ void CommKokkos::grow_swap(int n)
   memory->grow(maxsendlist,n,"comm:maxsendlist");
   for (int i=0;i();
+  CommBrick::forward_comm_array(nsize,array);
+}
diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h
index e252173141..aeacdb71cd 100644
--- a/src/KOKKOS/comm_kokkos.h
+++ b/src/KOKKOS/comm_kokkos.h
@@ -51,6 +51,8 @@ class CommKokkos : public CommBrick {
   void forward_comm_dump(class Dump *);    // forward comm from a Dump
   void reverse_comm_dump(class Dump *);    // reverse comm from a Dump
 
+  void forward_comm_array(int, double **);            // forward comm of array
+
   template void forward_comm_device(int dummy);
   template void reverse_comm_device();
   template void forward_comm_pair_device(Pair *pair);
diff --git a/src/KOKKOS/comm_tiled_kokkos.cpp b/src/KOKKOS/comm_tiled_kokkos.cpp
index 7c4dff4819..3409086982 100644
--- a/src/KOKKOS/comm_tiled_kokkos.cpp
+++ b/src/KOKKOS/comm_tiled_kokkos.cpp
@@ -238,6 +238,7 @@ void CommTiledKokkos::reverse_comm_dump(Dump *dump)
 
 void CommTiledKokkos::forward_comm_array(int nsize, double **array)
 {
+  k_sendlist.sync();
   CommTiled::forward_comm_array(nsize,array);
 }
 
diff --git a/src/comm_brick.h b/src/comm_brick.h
index 9ff177837d..39798e6f11 100644
--- a/src/comm_brick.h
+++ b/src/comm_brick.h
@@ -44,7 +44,7 @@ class CommBrick : public Comm {
   virtual void forward_comm_dump(class Dump *);          // forward comm from a Dump
   virtual void reverse_comm_dump(class Dump *);          // reverse comm from a Dump
 
-  void forward_comm_array(int, double **);            // forward comm of array
+  virtual void forward_comm_array(int, double **);            // forward comm of array
   int exchange_variable(int, double *, double *&);    // exchange on neigh stencil
   void *extract(const char *, int &);
   virtual double memory_usage();

From 1703cd4ca2475911664ed71d01f720a70064c7b6 Mon Sep 17 00:00:00 2001
From: Stan Moore 
Date: Mon, 30 Aug 2021 14:57:59 -0600
Subject: [PATCH 202/437] Whitespace

---
 src/comm_brick.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/comm_brick.h b/src/comm_brick.h
index 39798e6f11..dbb082a70b 100644
--- a/src/comm_brick.h
+++ b/src/comm_brick.h
@@ -44,7 +44,7 @@ class CommBrick : public Comm {
   virtual void forward_comm_dump(class Dump *);          // forward comm from a Dump
   virtual void reverse_comm_dump(class Dump *);          // reverse comm from a Dump
 
-  virtual void forward_comm_array(int, double **);            // forward comm of array
+  virtual void forward_comm_array(int, double **);    // forward comm of array
   int exchange_variable(int, double *, double *&);    // exchange on neigh stencil
   void *extract(const char *, int &);
   virtual double memory_usage();

From 5b42d5f3027faeb85a8accb44c4b9a31e9b681f5 Mon Sep 17 00:00:00 2001
From: Stan Gerald Moore 
Date: Mon, 30 Aug 2021 15:21:24 -0600
Subject: [PATCH 203/437] Fix compile issue

---
 src/KOKKOS/comm_tiled_kokkos.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/KOKKOS/comm_tiled_kokkos.cpp b/src/KOKKOS/comm_tiled_kokkos.cpp
index 3409086982..7c4dff4819 100644
--- a/src/KOKKOS/comm_tiled_kokkos.cpp
+++ b/src/KOKKOS/comm_tiled_kokkos.cpp
@@ -238,7 +238,6 @@ void CommTiledKokkos::reverse_comm_dump(Dump *dump)
 
 void CommTiledKokkos::forward_comm_array(int nsize, double **array)
 {
-  k_sendlist.sync();
   CommTiled::forward_comm_array(nsize,array);
 }
 

From 16c063cba58ef58d15c993ec113ddf88d4de70e7 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Mon, 30 Aug 2021 18:39:24 -0400
Subject: [PATCH 204/437] Fix OPENMP install script properly remove
 -DLMP_OPENMP from Makefile.packages

---
 src/OPENMP/Install.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/OPENMP/Install.sh b/src/OPENMP/Install.sh
index 1802f068e9..4b090bd6c1 100755
--- a/src/OPENMP/Install.sh
+++ b/src/OPENMP/Install.sh
@@ -53,7 +53,7 @@ action thr_data.cpp
 if (test $mode = 1) then
 
   if (test -e ../Makefile.package) then
-    sed -i -e 's/[^ \t]*OMP[^ \t]* //' ../Makefile.package
+    sed -i -e 's/[^ \t]*OPENMP[^ \t]* //' ../Makefile.package
     sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_OPENMP |' ../Makefile.package
   fi
 
@@ -72,7 +72,7 @@ if (test $mode = 1) then
 elif (test $mode = 0) then
 
   if (test -e ../Makefile.package) then
-    sed -i -e 's/[^ \t]*OMP[^ \t]* //' ../Makefile.package
+    sed -i -e 's/[^ \t]*OPENMP[^ \t]* //' ../Makefile.package
   fi
 
   # need to delete a bunch of dependency files because they

From de0aa1e97a9359bdf42ee8af8d259e30113f885c Mon Sep 17 00:00:00 2001
From: Richard Berger 
Date: Tue, 31 Aug 2021 11:22:59 -0400
Subject: [PATCH 205/437] Fixup ttm doc page

---
 doc/src/fix_ttm.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index 2ca39da011..f3275ae4ec 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -5,7 +5,7 @@ fix ttm command
 ===============
 
 fix ttm/grid command
-===============
+====================
 
 fix ttm/mod command
 ===================
@@ -45,7 +45,7 @@ Syntax
        Nz = number of thermal solve grid points in the z-direction (positive integer)
 
 * zero or more keyword/value(s) pairs may be appended
-* keyword = *set* or *infile" or *outfile"
+* keyword = *set* or *infile* or *outfile*
 
   .. parsed-literal::
 

From 191e4671b6dd8bdfea61689e54d8861ab45aadc4 Mon Sep 17 00:00:00 2001
From: Richard Berger 
Date: Tue, 31 Aug 2021 11:23:50 -0400
Subject: [PATCH 206/437] Add section about how to output YAML or JSON

---
 doc/src/Howto.rst                 |   1 +
 doc/src/Howto_structured_data.rst | 154 ++++++++++++++++++++++++++++++
 2 files changed, 155 insertions(+)
 create mode 100644 doc/src/Howto_structured_data.rst

diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst
index 8d8b7fb059..1d7d626e02 100644
--- a/doc/src/Howto.rst
+++ b/doc/src/Howto.rst
@@ -54,6 +54,7 @@ Analysis howto
    Howto_kappa
    Howto_viscosity
    Howto_diffusion
+   Howto_structured_data
 
 Force fields howto
 ==================
diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst
new file mode 100644
index 0000000000..44aed0dd67
--- /dev/null
+++ b/doc/src/Howto_structured_data.rst
@@ -0,0 +1,154 @@
+Output structured data from LAMMPS
+##################################
+
+LAMMPS can output structured data with the :doc:`print ` and :doc:`fix
+print ` command.  This gives you flexibility since you can build
+custom data formats that contain system properties, thermo data, and variables
+values. This output can be directed to the screen and/or to a file for post
+processing.
+
+Writing the current system state, thermo data, variable values
+==============================================================
+
+Use the :doc:`print ` command to output the current system state, which
+can include system properties, thermo data and variable values.
+
+YAML
+----
+
+.. code-block:: LAMMPS
+
+   print """---
+   timestep: $(step)
+   pe: $(pe)
+   ke: $(ke)""" file current_state.yaml screen no
+
+.. code-block:: yaml
+   :caption: current_state.yaml
+
+   ---
+   timestep: 250
+   pe: -4.7774327356321810711
+   ke: 2.4962152903997174569
+
+JSON
+----
+
+.. code-block:: LAMMPS
+
+   print """{
+     "timestep": $(step),
+     "pe": $(pe),
+     "ke": $(ke)
+   }""" file current_state.json screen no
+
+.. code-block:: JSON
+   :caption: current_state.json
+  
+   {
+     "timestep": 250,
+     "pe": -4.7774327356321810711,
+     "ke": 2.4962152903997174569
+   }
+
+
+Writing continuous data during a simulation
+===========================================
+
+The :doc:`fix print ` command allows you to output an arbitrary string at defined times during a simulation run.
+
+YAML
+----
+
+.. code-block:: LAMMPS
+
+   fix extra all print 50 """
+   - timestep: $(step)
+     pe: $(pe)
+     ke: $(ke)""" file output.yaml screen no
+
+.. code-block:: yaml
+   :caption: output.yaml
+
+   # Fix print output for fix extra
+   - timestep: 0
+     pe: -6.77336805325924729
+     ke: 4.4988750000000026219
+   
+   - timestep: 50
+     pe: -4.8082494418323200591
+     ke: 2.5257981827119797558
+   
+   - timestep: 100
+     pe: -4.7875608875581505686
+     ke: 2.5062598821985102582
+   
+   - timestep: 150
+     pe: -4.7471033686005483787
+     ke: 2.466095925545450207
+   
+   - timestep: 200
+     pe: -4.7509052858544134068
+     ke: 2.4701136792591693592
+   
+   - timestep: 250
+     pe: -4.7774327356321810711
+     ke: 2.4962152903997174569
+
+Post-processing of YAML files can be easily be done with Python and other
+scripting languages. In case of Python the `yaml` package allows you to load the
+data files and obtain a list of dictionaries.
+
+.. code-block:: python
+
+   import yaml
+
+   with open("output.yaml") as f:
+      data = yaml.load(f, Loader=yaml.FullLoader)
+
+   print(data)
+
+.. code-block::
+
+   [{'timestep': 0, 'pe': -6.773368053259247, 'ke': 4.498875000000003}, {'timestep': 50, 'pe': -4.80824944183232, 'ke': 2.5257981827119798}, {'timestep': 100, 'pe': -4.787560887558151, 'ke': 2.5062598821985103}, {'timestep': 150, 'pe': -4.747103368600548, 'ke': 2.46609592554545}, {'timestep': 200, 'pe': -4.750905285854413, 'ke': 2.4701136792591694}, {'timestep': 250, 'pe': -4.777432735632181, 'ke': 2.4962152903997175}]
+
+Line Delimited JSON (LD-JSON)
+-----------------------------
+
+The JSON format itself is very strict when it comes to delimiters. For continous
+output/streaming data it is beneficial use the *line delimited JSON* format.
+Each line represents one JSON object.
+
+.. code-block:: LAMMPS
+
+   fix extra all print 50 """{"timestep": $(step), "pe": $(pe), "ke": $(ke)}""" title "" file output.json screen no
+
+.. code-block:: json
+   :caption: output.json
+
+   {"timestep": 0, "pe": -6.77336805325924729, "ke": 4.4988750000000026219}
+   {"timestep": 50, "pe": -4.8082494418323200591, "ke": 2.5257981827119797558}
+   {"timestep": 100, "pe": -4.7875608875581505686, "ke": 2.5062598821985102582}
+   {"timestep": 150, "pe": -4.7471033686005483787, "ke": 2.466095925545450207}
+   {"timestep": 200, "pe": -4.7509052858544134068, "ke": 2.4701136792591693592}
+   {"timestep": 250, "pe": -4.7774327356321810711, "ke": 2.4962152903997174569}
+
+One simple way to load this data into a Python script is to use the `pandas`
+package. It can directly load these files into a data frame:
+
+.. code-block:: python
+
+   import pandas as pd
+
+   data = pd.read_json('output.json', lines=True)
+   print(data)
+
+.. code-block:: bash
+
+      timestep        pe        ke
+   0         0 -6.773368  4.498875
+   1        50 -4.808249  2.525798
+   2       100 -4.787561  2.506260
+   3       150 -4.747103  2.466096
+   4       200 -4.750905  2.470114
+   5       250 -4.777433  2.496215

From 888d6fd9b418d7f77a3e817bc0d784cf77333b8d Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 14:20:52 -0400
Subject: [PATCH 207/437] small update

---
 src/MISC/fix_srp.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/MISC/fix_srp.cpp b/src/MISC/fix_srp.cpp
index 055d3119b7..35ee162fc9 100644
--- a/src/MISC/fix_srp.cpp
+++ b/src/MISC/fix_srp.cpp
@@ -106,7 +106,7 @@ void FixSRP::init()
 
   int has_rigid = 0;
   for (int i = 0; i < modify->nfix; i++)
-    if (strncmp(modify->fix[i]->style,"rigid",5) == 0) ++has_rigid;
+    if (utils::strmatch(modify->fix[i]->style,"^rigid")) ++has_rigid;
 
   if (has_rigid > 0)
     error->all(FLERR,"Pair srp is not compatible with rigid fixes.");
@@ -242,7 +242,6 @@ void FixSRP::setup_pre_force(int /*zz*/)
   memory->destroy(xold);
   memory->destroy(tagold);
 
-  char str[128];
   int nadd_all = 0, ndel_all = 0;
   MPI_Allreduce(&ndel,&ndel_all,1,MPI_INT,MPI_SUM,world);
   MPI_Allreduce(&nadd,&nadd_all,1,MPI_INT,MPI_SUM,world);

From c66a51bca119ba60817c284390f1a95339ffc19b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 14:23:13 -0400
Subject: [PATCH 208/437] fix bug in fix adapt: reinit must be called for the
 top-level pair/bond style

---
 src/fix_adapt.cpp | 22 ++++++----------------
 1 file changed, 6 insertions(+), 16 deletions(-)

diff --git a/src/fix_adapt.cpp b/src/fix_adapt.cpp
index e5c2c3dece..5efa70859a 100644
--- a/src/fix_adapt.cpp
+++ b/src/fix_adapt.cpp
@@ -612,23 +612,13 @@ void FixAdapt::change_settings()
   // ditto for bond styles if any BOND settings were changed
   // this resets other coeffs that may depend on changed values,
   //   and also offset and tail corrections
+  // we must call force->pair->reinit() instead of the individual
+  // adapted pair styles so that also the top-level
+  // tail correction values are updated for hybrid pair styles.
+  //  same for bond styles
 
-  if (anypair) {
-    for (int m = 0; m < nadapt; m++) {
-      Adapt *ad = &adapt[m];
-      if (ad->which == PAIR) {
-        ad->pair->reinit();
-      }
-    }
-  }
-  if (anybond) {
-    for (int m = 0; m < nadapt; ++m) {
-      Adapt *ad = &adapt[m];
-      if (ad->which == BOND) {
-        ad->bond->reinit();
-      }
-    }
-  }
+  if (anypair) force->pair->reinit();
+  if (anybond) force->bond->reinit();
 
   // reset KSpace charges if charges have changed
 

From b8ed4b28b382f9b6a197d5f28ff75e22381c7704 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 14:28:09 -0400
Subject: [PATCH 209/437] add test for fix adapt with hybrid pair

---
 .../tests/fix-timestep-adapt_hybrid.yaml      | 77 +++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 unittest/force-styles/tests/fix-timestep-adapt_hybrid.yaml

diff --git a/unittest/force-styles/tests/fix-timestep-adapt_hybrid.yaml b/unittest/force-styles/tests/fix-timestep-adapt_hybrid.yaml
new file mode 100644
index 0000000000..d1d8c51ec5
--- /dev/null
+++ b/unittest/force-styles/tests/fix-timestep-adapt_hybrid.yaml
@@ -0,0 +1,77 @@
+---
+lammps_version: 10 Mar 2021
+date_generated: Thu Mar 25 14:01:17 202
+epsilon: 2e-14
+prerequisites: ! |
+  atom full
+  fix adapt
+pre_commands: ! |
+  variable epsilon equal ramp(0.01,0.03)
+post_commands: ! |
+  fix move all nve
+  pair_style hybrid lj/cut 8.0
+  pair_coeff * * lj/cut 0.02   2.5
+  fix test solute adapt 1 pair lj/cut epsilon * * v_epsilon scale no
+input_file: in.fourmol
+natoms: 29
+run_pos: ! |2
+    1 -3.2551307172152166e-01  2.4346451341937119e+00 -1.1396829659429568e-01
+    2  4.8617926885321056e-01  3.1070882859405997e+00 -1.0606347736697450e+00
+    3 -6.4277692336189840e-01  1.2540574692558419e+00 -6.5067148095539729e-01
+    4 -1.7124546848614086e+00  1.5199062846474698e+00 -1.3466731463120185e+00
+    5 -9.4318702684092770e-01  8.7036167560098177e-01  5.8107949039715845e-01
+    6  2.8417536732521353e-01  2.4411028847076369e-01 -1.2672995916002334e+00
+    7  3.3978105928826102e-01 -1.3702127966002052e-02 -2.4842417404954271e+00
+    8  1.1448702036571965e+00 -5.1199787721085332e-01 -7.6207631323785585e-01
+    9  1.4560807143664061e+00 -1.7028374483027719e-01  6.2141359752210135e-01
+   10  2.0382797810616289e+00 -1.4042635759560305e+00 -9.2654260470655225e-01
+   11  1.7519024690839582e+00 -2.0813293238835207e+00 -2.0333284515052927e+00
+   12  2.9787289051059695e+00 -5.2434906497210465e-01 -1.5904467995849627e+00
+   13  4.1953422217253049e+00 -9.4830119722648354e-01 -1.6427468797605889e+00
+   14  2.5500081793995157e+00 -4.0614435033397922e-01 -2.8121984203395161e+00
+   15  2.9657048145111777e+00  7.0300473914796602e-01 -1.1808819862439999e+00
+   16  2.6579963051616033e+00 -2.4005456919625914e+00  2.0005383723547647e-02
+   17  2.2277056239576578e+00 -2.0984522178633980e+00  1.1635464820238732e+00
+   18  2.1302246968151799e+00  2.9885050666882940e+00 -3.4237069257450177e+00
+   19  1.3456038469693135e+00  2.5038497935542385e+00 -4.4658170467307343e+00
+   20  2.9896625556783665e+00  3.9232215029072903e+00 -4.0788037150506025e+00
+   21  4.8757906644427553e+00 -4.1085999726993636e+00 -3.5248264027627227e+00
+   22  4.1728425444281765e+00 -4.2576916791274551e+00 -4.7519930504553214e+00
+   23  6.0419888290998678e+00 -3.4039201576442903e+00 -3.9699675670526715e+00
+   24  2.0885027685082749e+00  3.0623262332232590e+00  3.2053854817911325e+00
+   25  1.0405778226848383e+00  3.3092074961772369e+00  2.2889143046855063e+00
+   26  2.7667223704388135e+00  4.3243759349108064e+00  3.2424899041692892e+00
+   27 -1.9442324574216177e+00 -4.4528190486931383e+00  2.1453601072505339e+00
+   28 -3.0374110711029547e+00 -3.8950976773182124e+00  1.3869509742028494e+00
+   29 -1.0900141540951092e+00 -3.3361017662313661e+00  2.3288506481859019e+00
+run_vel: ! |2
+    1 -2.6363966609802322e-02 -2.1121682067821074e-02  3.6083903537541533e-02
+    2  1.1439082425218627e-01  9.6059686259844332e-02 -1.2808582493334400e-01
+    3  4.1111553959541365e-02  4.8218907676123458e-03 -2.0053345127339979e-02
+    4 -1.1200342113854607e-01  2.3479218026487367e-02 -7.8322526982440521e-02
+    5 -3.8701176979056742e-02 -5.4238808461352553e-02  1.3872068929223944e-01
+    6 -1.2123879257604515e-02  1.8312769875475924e-02  1.5946869603522588e-02
+    7 -2.8033909635229349e-04 -4.1270986674540478e-03 -2.1849258860351647e-02
+    8 -1.0170253112050078e-02 -1.7528863700725254e-02 -4.2491773012772370e-02
+    9  4.5241065101710616e-02  5.1469831376004180e-02  2.0995899436627763e-01
+   10  1.8368003566726739e-02  1.4179451083200369e-02  2.9470727636806446e-02
+   11 -3.2659358322720752e-02 -7.3493919093785873e-02 -1.1457396195350034e-01
+   12 -2.1332063889491135e-02 -2.8577988202947827e-02  2.3932097053094816e-02
+   13  1.2690181040869375e-01 -4.2622009579717637e-02 -3.2122980905022864e-03
+   14 -4.3986665577866770e-02  4.1189150738941797e-03 -1.2884939606320925e-01
+   15 -5.1087806082402770e-03  1.2103885273247751e-01  5.1598463273012998e-02
+   16  7.2721700595591750e-03 -5.1107380318211630e-03 -1.6206172124102816e-02
+   17 -4.5383051620802401e-03  3.8550131312268723e-03  1.5203146179855118e-02
+   18 -3.4035600174367278e-03 -1.6724199163900926e-02  5.8534078947667954e-02
+   19 -1.2309357029421318e-01 -8.2342186011711699e-02 -1.4270564232030267e-01
+   20  1.3831939524791759e-01  1.4683346823701657e-01 -8.6190510762895065e-02
+   21 -1.8190109221215101e-02 -2.0433705925500686e-02  5.9790597332019774e-02
+   22 -1.2248854674722252e-01 -3.2562959165287515e-02 -1.7942350258565937e-01
+   23  1.8820938314857302e-01  1.0738920901878871e-01 -5.3571267428950652e-02
+   24  1.3241508666550663e-02 -5.5202622564252735e-02  3.1590984003367552e-02
+   25 -1.6538995535147813e-01  2.1577200806135906e-02 -1.3992038866639564e-01
+   26  1.1598773628387443e-01  1.9315924859017630e-01  1.7906411933036825e-02
+   27  9.5161140946472839e-03 -6.0207807869183290e-02  2.1271816291477584e-02
+   28 -1.8165131190419664e-01  7.5944941014218031e-02 -1.2012012232111549e-01
+   29  1.3987378313944554e-01  1.6482908858701009e-01  3.7930623655713772e-02
+...

From 6b243845c0ad33e84adf2906242e0939eaaf4ca8 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 15:10:28 -0400
Subject: [PATCH 210/437] update HIP preset for CMake

---
 cmake/presets/hip.cmake | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/cmake/presets/hip.cmake b/cmake/presets/hip.cmake
index 44f1fc093f..64f825134c 100644
--- a/cmake/presets/hip.cmake
+++ b/cmake/presets/hip.cmake
@@ -1,12 +1,26 @@
-# preset that will enable hipcc plus gcc with support for MPI and OpenMP (on Linux boxes)
+# preset that will enable hipcc plus gcc/gfortran with support for MPI and OpenMP (on Linux boxes)
 
 set(CMAKE_CXX_COMPILER "hipcc" CACHE STRING "" FORCE)
 set(CMAKE_C_COMPILER "gcc" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_COMPILER gfortran CACHE STRING "" FORCE)
 set(CMAKE_CXX_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
-unset(HAVE_OMP_H_INCLUDE CACHE)
+set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -Wextra -g -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
 
-set(OpenMP_CXX "hipcc" CACHE STRING "" FORCE)
+set(MPI_CXX "hipcc" CACHE STRING "" FORCE)
+set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE)
+
+unset(HAVE_OMP_H_INCLUDE CACHE)
+set(OpenMP_C "gcc" CACHE STRING "" FORCE)
+set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE)
+set(OpenMP_C_LIB_NAMES "gomp" CACHE STRING "" FORCE)
 set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE)
+set(OpenMP_CXX "hipcc" CACHE STRING "" FORCE)
 set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE)
 set(OpenMP_omp_LIBRARY "libomp.so" CACHE PATH "" FORCE)

From 08eb3345afc31cd7e917f1e010f2b12ec4095e0c Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 15:10:50 -0400
Subject: [PATCH 211/437] silence some compiler warnings

---
 lib/gpu/geryon/hip_device.h  | 21 ++++++++++-----------
 lib/gpu/geryon/hip_texture.h |  2 +-
 lib/gpu/geryon/ucl_h_vec.h   |  2 +-
 lib/gpu/lal_neighbor.h       |  5 ++---
 lib/gpu/lal_pppm.h           |  2 +-
 5 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/lib/gpu/geryon/hip_device.h b/lib/gpu/geryon/hip_device.h
index bcfd880712..456a03b180 100644
--- a/lib/gpu/geryon/hip_device.h
+++ b/lib/gpu/geryon/hip_device.h
@@ -23,7 +23,7 @@ namespace ucl_hip {
 // --------------------------------------------------------------------------
 typedef hipStream_t command_queue;
 
-inline void ucl_flush(command_queue &cq) {}
+inline void ucl_flush(command_queue &) {}
 
 inline void ucl_sync(hipStream_t &stream) {
   CU_SAFE_CALL(hipStreamSynchronize(stream));
@@ -141,12 +141,12 @@ class UCL_Device {
   /// Get a string telling the type of the current device
   inline std::string device_type_name() { return device_type_name(_device); }
   /// Get a string telling the type of the device
-  inline std::string device_type_name(const int i) { return "GPU"; }
+  inline std::string device_type_name(const int) { return "GPU"; }
 
   /// Get current device type (UCL_CPU, UCL_GPU, UCL_ACCELERATOR, UCL_DEFAULT)
   inline enum UCL_DEVICE_TYPE device_type() { return device_type(_device); }
   /// Get device type (UCL_CPU, UCL_GPU, UCL_ACCELERATOR, UCL_DEFAULT)
-  inline enum UCL_DEVICE_TYPE device_type(const int i) { return UCL_GPU; }
+  inline enum UCL_DEVICE_TYPE device_type(const int) { return UCL_GPU; }
 
   /// Returns true if host memory is efficiently addressable from device
   inline bool shared_memory() { return shared_memory(_device); }
@@ -204,7 +204,7 @@ class UCL_Device {
   // Get the bytes of free memory in the current device
   inline size_t free_bytes() { return free_bytes(_device); }
   // Get the bytes of free memory
-  inline size_t free_bytes(const int i) {
+  inline size_t free_bytes(const int) {
     CUDA_INT_TYPE dfree, dtotal;
     CU_SAFE_CALL_NS(hipMemGetInfo(&dfree, &dtotal));
     return static_cast(dfree);
@@ -257,26 +257,26 @@ class UCL_Device {
   inline bool fission_equal()
     { return fission_equal(_device); }
   /// True if splitting device into equal subdevices supported
-  inline bool fission_equal(const int i)
+  inline bool fission_equal(const int)
     { return false; }
   /// True if splitting device into subdevices by specified counts supported
   inline bool fission_by_counts()
     { return fission_by_counts(_device); }
   /// True if splitting device into subdevices by specified counts supported
-  inline bool fission_by_counts(const int i)
+  inline bool fission_by_counts(const int)
     { return false; }
   /// True if splitting device into subdevices by affinity domains supported
   inline bool fission_by_affinity()
     { return fission_by_affinity(_device); }
   /// True if splitting device into subdevices by affinity domains supported
-  inline bool fission_by_affinity(const int i)
+  inline bool fission_by_affinity(const int)
     { return false; }
 
   /// Maximum number of subdevices allowed from device fission
   inline int max_sub_devices()
     { return max_sub_devices(_device); }
   /// Maximum number of subdevices allowed from device fission
-  inline int max_sub_devices(const int i)
+  inline int max_sub_devices(const int)
     { return 0; }
 
   /// True if the device supports shuffle intrinsics
@@ -290,8 +290,7 @@ class UCL_Device {
   inline void print_all(std::ostream &out);
 
   /// For compatability with OCL API
-  inline int auto_set_platform(const enum UCL_DEVICE_TYPE type=UCL_GPU,
-			       const std::string vendor="")
+  inline int auto_set_platform(const enum UCL_DEVICE_TYPE, const std::string)
     { return set_platform(0); }
 
   inline int load_module(const void* program, hipModule_t& module, std::string *log=nullptr){
@@ -404,7 +403,7 @@ UCL_Device::~UCL_Device() {
   clear();
 }
 
-int UCL_Device::set_platform(const int pid) {
+int UCL_Device::set_platform(const int) {
   clear();
   #ifdef UCL_DEBUG
   assert(pid
Date: Tue, 31 Aug 2021 16:05:11 -0400
Subject: [PATCH 212/437] whitespace

---
 doc/src/Howto_structured_data.rst | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst
index 44aed0dd67..a5d3d52431 100644
--- a/doc/src/Howto_structured_data.rst
+++ b/doc/src/Howto_structured_data.rst
@@ -44,7 +44,7 @@ JSON
 
 .. code-block:: JSON
    :caption: current_state.json
-  
+
    {
      "timestep": 250,
      "pe": -4.7774327356321810711,
@@ -74,23 +74,23 @@ YAML
    - timestep: 0
      pe: -6.77336805325924729
      ke: 4.4988750000000026219
-   
+
    - timestep: 50
      pe: -4.8082494418323200591
      ke: 2.5257981827119797558
-   
+
    - timestep: 100
      pe: -4.7875608875581505686
      ke: 2.5062598821985102582
-   
+
    - timestep: 150
      pe: -4.7471033686005483787
      ke: 2.466095925545450207
-   
+
    - timestep: 200
      pe: -4.7509052858544134068
      ke: 2.4701136792591693592
-   
+
    - timestep: 250
      pe: -4.7774327356321810711
      ke: 2.4962152903997174569

From c567f33cc142c8c6ae21c1259c2e91593a523ae6 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 16:17:03 -0400
Subject: [PATCH 213/437] apply spelling fixes and update formatting a little

---
 doc/src/Howto_structured_data.rst           |  2 +-
 doc/src/fix_ttm.rst                         | 26 ++++++++++-----------
 doc/utils/sphinx-config/false_positives.txt |  1 +
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/doc/src/Howto_structured_data.rst b/doc/src/Howto_structured_data.rst
index a5d3d52431..b7778622de 100644
--- a/doc/src/Howto_structured_data.rst
+++ b/doc/src/Howto_structured_data.rst
@@ -115,7 +115,7 @@ data files and obtain a list of dictionaries.
 Line Delimited JSON (LD-JSON)
 -----------------------------
 
-The JSON format itself is very strict when it comes to delimiters. For continous
+The JSON format itself is very strict when it comes to delimiters. For continuous
 output/streaming data it is beneficial use the *line delimited JSON* format.
 Each line represents one JSON object.
 
diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index f3275ae4ec..356d2aea36 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -85,20 +85,20 @@ Matter papers: :ref:`(Duffy) ` and :ref:`(Rutherford)
 a primary knock-on atom (PKA) was initialized with a high velocity to
 simulate a radiation event.
 
-The description in this sub-section applies to all 3 of the fixes: fix
-ttm, fix ttm/grid, and fix ttm/mod.
+The description in this sub-section applies to all 3 fix styles:
+*ttm*, *ttm/grid*, and *ttm/mod*.
 
-Fix ttm/grid distributes the regular grid across processors consistent
-with the subdomains of atoms owned by each processor, but is otherwise
-identical to fix ttm.  Note that fix ttm stores a copy of the grid on
-each processor, which is fine when the overall grid is reasonably
-small.  For very large grids you should use fix ttt/grid instead.
+Fix *ttm/grid* distributes the regular grid across processors consistent
+with the sub-domains of atoms owned by each processor, but is otherwise
+identical to fix ttm.  Note that fix *ttm* stores a copy of the grid on
+each processor, which is acceptable when the overall grid is reasonably
+small.  For larger grids you should use fix *ttm/grid* instead.
 
-Fix ttm/mod adds options to account for external heat sources (e.g. at
+Fix *ttm/mod* adds options to account for external heat sources (e.g. at
 a surface) and for specifying parameters that allow the electronic
 heat capacity to depend strongly on electronic temperature.  It is
-more expensive computationally than fix ttm because it treats the
-thermal diffusion equation as non-linear.  More details on fix ttm/mod
+more expensive computationally than fix *ttm* because it treats the
+thermal diffusion equation as non-linear.  More details on fix *ttm/mod*
 are given below.
 
 Heat transfer between the electronic and atomic subsystems is carried
@@ -169,11 +169,11 @@ ttm/mod.
   periodic boundary conditions in all dimensions.  They also require
   that the size and shape of the simulation box do not vary
   dynamically, e.g. due to use of the :doc:`fix npt ` command.
-  Likewise, the size/shape of processor subdomains cannot vary due to
+  Likewise, the size/shape of processor sub-domains cannot vary due to
   dynamic load-balancing via use of the :doc:`fix balance
   ` command.  It is possible however to load balance
   before the simulation starts using the :doc:`balance `
-  command, so that each processor has a different size subdomain.
+  command, so that each processor has a different size sub-domain.
 
 Periodic boundary conditions are also used in the heat equation solve
 for the electronic subsystem.  This varies from the approach of
@@ -238,7 +238,7 @@ by this fix.
 
 **Additional details for fix ttm/mod**
 
-Fix ttm/mod uses the heat diffusion equation with possible external
+Fix *ttm/mod* uses the heat diffusion equation with possible external
 heat sources (e.g. laser heating in ablation simulations):
 
 .. math::
diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index 7e3886e2fd..af22901dc3 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -2281,6 +2281,7 @@ normals
 Noskov
 noslip
 noticable
+Nout
 noutcol
 Noutput
 noutrow

From 000b4c5fdaba0b2e203688d1d814bbd44e4049ff Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Tue, 31 Aug 2021 16:20:21 -0400
Subject: [PATCH 214/437] integrate fix ttm/grid properly into the
 documentation

---
 doc/src/Commands_fix.rst | 1 +
 doc/src/fix.rst          | 3 ++-
 doc/src/fix_ttm.rst      | 1 +
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst
index 08857b96ec..effccd55bf 100644
--- a/doc/src/Commands_fix.rst
+++ b/doc/src/Commands_fix.rst
@@ -236,6 +236,7 @@ OPT.
    * :doc:`ti/spring `
    * :doc:`tmd `
    * :doc:`ttm `
+   * :doc:`ttm/grid `
    * :doc:`ttm/mod `
    * :doc:`tune/kspace `
    * :doc:`vector `
diff --git a/doc/src/fix.rst b/doc/src/fix.rst
index 81c0c87320..c45ae6a801 100644
--- a/doc/src/fix.rst
+++ b/doc/src/fix.rst
@@ -378,7 +378,8 @@ accelerated styles exist.
 * :doc:`thermal/conductivity ` - Muller-Plathe kinetic energy exchange for thermal conductivity calculation
 * :doc:`ti/spring ` -
 * :doc:`tmd ` - guide a group of atoms to a new configuration
-* :doc:`ttm ` - two-temperature model for electronic/atomic coupling
+* :doc:`ttm ` - two-temperature model for electronic/atomic coupling (replicated grid)
+* :doc:`ttm/grid ` - two-temperature model for electronic/atomic coupling (distributed grid)
 * :doc:`ttm/mod ` - enhanced two-temperature model with additional options
 * :doc:`tune/kspace ` - auto-tune KSpace parameters
 * :doc:`vector ` - accumulate a global vector every N timesteps
diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst
index 356d2aea36..777e7a894b 100644
--- a/doc/src/fix_ttm.rst
+++ b/doc/src/fix_ttm.rst
@@ -1,4 +1,5 @@
 .. index:: fix ttm
+.. index:: fix ttm/grid
 .. index:: fix ttm/mod
 
 fix ttm command

From 8db2d64f11ad02a29b1f7564fce4b5ba81ab0db7 Mon Sep 17 00:00:00 2001
From: Richard Berger 
Date: Tue, 31 Aug 2021 17:56:01 -0400
Subject: [PATCH 215/437] Updates to support ROCm 4.3 in GPU package

---
 cmake/Modules/Packages/GPU.cmake           | 17 +++++++++---
 cmake/presets/hip_amd.cmake                | 30 ++++++++++++++++++++++
 tools/singularity/ubuntu20.04_amd_rocm.def |  4 +--
 3 files changed, 45 insertions(+), 6 deletions(-)
 create mode 100644 cmake/presets/hip_amd.cmake

diff --git a/cmake/Modules/Packages/GPU.cmake b/cmake/Modules/Packages/GPU.cmake
index 2b6977005d..01383aae72 100644
--- a/cmake/Modules/Packages/GPU.cmake
+++ b/cmake/Modules/Packages/GPU.cmake
@@ -219,8 +219,15 @@ elseif(GPU_API STREQUAL "HIP")
           set(HIP_PATH $ENV{HIP_PATH} CACHE PATH "Path to which HIP has been installed")
       endif()
   endif()
-  set(CMAKE_MODULE_PATH "${HIP_PATH}/cmake" ${CMAKE_MODULE_PATH})
-  find_package(HIP REQUIRED)
+  if(NOT DEFINED ROCM_PATH)
+      if(NOT DEFINED ENV{ROCM_PATH})
+          set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to which ROCM has been installed")
+      else()
+          set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Path to which ROCM has been installed")
+      endif()
+  endif()
+  list(APPEND CMAKE_PREFIX_PATH ${HIP_PATH} ${ROCM_PATH})
+  find_package(hip REQUIRED)
   option(HIP_USE_DEVICE_SORT "Use GPU sorting" ON)
 
   if(NOT DEFINED HIP_PLATFORM)
@@ -322,10 +329,11 @@ elseif(GPU_API STREQUAL "HIP")
 
   set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LAMMPS_LIB_BINARY_DIR}/gpu/*_cubin.h ${LAMMPS_LIB_BINARY_DIR}/gpu/*.cu.cpp")
 
-  hip_add_library(gpu STATIC ${GPU_LIB_SOURCES})
+  add_library(gpu STATIC ${GPU_LIB_SOURCES})
   target_include_directories(gpu PRIVATE ${LAMMPS_LIB_BINARY_DIR}/gpu)
   target_compile_definitions(gpu PRIVATE -D_${GPU_PREC_SETTING} -DMPI_GERYON -DUCL_NO_EXIT)
   target_compile_definitions(gpu PRIVATE -DUSE_HIP)
+  target_link_libraries(gpu PRIVATE hip::host)
 
   if(HIP_USE_DEVICE_SORT)
     # add hipCUB
@@ -374,8 +382,9 @@ elseif(GPU_API STREQUAL "HIP")
     endif()
   endif()
 
-  hip_add_executable(hip_get_devices ${LAMMPS_LIB_SOURCE_DIR}/gpu/geryon/ucl_get_devices.cpp)
+  add_executable(hip_get_devices ${LAMMPS_LIB_SOURCE_DIR}/gpu/geryon/ucl_get_devices.cpp)
   target_compile_definitions(hip_get_devices PRIVATE -DUCL_HIP)
+  target_link_libraries(hip_get_devices hip::host)
 
   if(HIP_PLATFORM STREQUAL "nvcc")
     target_compile_definitions(gpu PRIVATE -D__HIP_PLATFORM_NVCC__)
diff --git a/cmake/presets/hip_amd.cmake b/cmake/presets/hip_amd.cmake
new file mode 100644
index 0000000000..4b8945e0c7
--- /dev/null
+++ b/cmake/presets/hip_amd.cmake
@@ -0,0 +1,30 @@
+# preset that will enable hip (clang/clang++) with support for MPI and OpenMP (on Linux boxes)
+
+# prefer flang over gfortran, if available
+find_program(CLANG_FORTRAN NAMES flang gfortran f95)
+set(ENV{OMPI_FC} ${CLANG_FORTRAN})
+
+set(CMAKE_CXX_COMPILER "hipcc" CACHE STRING "" FORCE)
+set(CMAKE_C_COMPILER "hipcc" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_COMPILER ${CLANG_FORTRAN} CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_DEBUG "-Wall -Wextra -g -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -std=f2003" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -g" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Wall -Wextra -g -O2 -DNDEBUG" CACHE STRING "" FORCE)
+set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
+
+set(MPI_CXX "hipcc" CACHE STRING "" FORCE)
+set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE)
+
+unset(HAVE_OMP_H_INCLUDE CACHE)
+set(OpenMP_C "hipcc" CACHE STRING "" FORCE)
+set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE)
+set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE)
+set(OpenMP_CXX "hipcc" CACHE STRING "" FORCE)
+set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE)
+set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE)
+set(OpenMP_omp_LIBRARY "libomp.so" CACHE PATH "" FORCE)
diff --git a/tools/singularity/ubuntu20.04_amd_rocm.def b/tools/singularity/ubuntu20.04_amd_rocm.def
index 9db8265629..d55bacec21 100644
--- a/tools/singularity/ubuntu20.04_amd_rocm.def
+++ b/tools/singularity/ubuntu20.04_amd_rocm.def
@@ -3,7 +3,7 @@ From: ubuntu:20.04
 
 %environment
     export PATH=/usr/lib/ccache:${PATH}:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin/x86_64
-    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rocm/lib:/opt/rocm-4.2.0/llvm/lib
+    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rocm/lib:/opt/rocm-4.3.0/llvm/lib
 %post
     export DEBIAN_FRONTEND=noninteractive
     apt-get update
@@ -91,7 +91,7 @@ From: ubuntu:20.04
     ###########################################################################
 
     export PATH=$PATH:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin/x86_64
-    git clone -b rocm-4.1.x https://github.com/ROCmSoftwarePlatform/hipCUB.git
+    git clone -b develop https://github.com/ROCmSoftwarePlatform/hipCUB.git
     mkdir hipCUB/build
     cd hipCUB/build
     CXX=hipcc cmake -D BUILD_TEST=off ..

From af33724a38e0f28ed8a1816eddd47ac8c53b992b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 12:15:52 -0400
Subject: [PATCH 216/437] update and reorder the description of the process for
 submitting contributions

---
 doc/src/Modify.rst            |   3 +-
 doc/src/Modify_contribute.rst | 148 ++++++++++++++++++++--------------
 2 files changed, 89 insertions(+), 62 deletions(-)

diff --git a/doc/src/Modify.rst b/doc/src/Modify.rst
index 3e444cc6cf..27f579a660 100644
--- a/doc/src/Modify.rst
+++ b/doc/src/Modify.rst
@@ -9,7 +9,8 @@ this.
 If you add a new feature to LAMMPS and think it will be of interest to
 general users, we encourage you to submit it for inclusion in LAMMPS
 as a pull request on our `GitHub site `_,
-after reading :doc:`this page `.
+after reading about :doc:`how to prepare your code for submission `
+and :doc:`the style requirements and recommendations `.
 
 .. toctree::
    :maxdepth: 1
diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst
index 154b2d80a8..6819bbcd61 100644
--- a/doc/src/Modify_contribute.rst
+++ b/doc/src/Modify_contribute.rst
@@ -1,22 +1,20 @@
 Submitting new features for inclusion in LAMMPS
 ===============================================
 
-We encourage users to submit new features or modifications for LAMMPS to
-`the core developers `_ so they can
-be added to the LAMMPS distribution. The preferred way to manage and
-coordinate this is via the LAMMPS project on `GitHub
-`_.  Please see the :doc:`GitHub
-Tutorial ` for a demonstration on how to do that.  An
-alternative is to contact the LAMMPS developers or the indicated
-developer of a package or feature directly and send in your contribution
-via e-mail, but that can add a significant delay on getting your
-contribution included, depending on how busy the respective developer
-is, how complex a task it would be to integrate that code, and how
-many - if any - changes are required before the code can be included.
+We encourage LAMMPS users to submit new features they wrote for LAMMPS
+to be included into the LAMMPS distribution and thus become easily
+accessible to all LAMMPS users.  The LAMMPS source code is managed with
+git and public development is hosted on `GitHub
+`_.  You can monitor the repository to
+be notified of releases, follow the ongoing development, and comment on
+topics of interest to you.
+
+Communication with the LAMMPS developers
+----------------------------------------
 
 For any larger modifications or programming project, you are encouraged
 to contact the LAMMPS developers ahead of time in order to discuss
-implementation strategies and coding guidelines. That will make it
+implementation strategies and coding guidelines.  That will make it
 easier to integrate your contribution and results in less work for
 everybody involved.  You are also encouraged to search through the list
 of `open issues on GitHub `_
@@ -26,43 +24,84 @@ duplicated by others.
 
 For informal communication with the LAMMPS developers you may ask to
 join the `LAMMPS developers on Slack `_.  This
-slack work space is by invitation only. Thus for access, please send an
+slack work space is by invitation only.  Thus for access, please send an
 e-mail to ``slack@lammps.org`` explaining what part of LAMMPS you are
 working on.  Only discussions related to LAMMPS development are
-tolerated, so this is **NOT** for people that look for help with
-compiling, installing, or using LAMMPS. Please post a message to the
-`lammps-users mailing list `_ or the
-`LAMMPS forum `_ for those purposes.
+tolerated in that workspace, so this is **NOT** for people that look for
+help with compiling, installing, or using LAMMPS.  Please post a message
+to the `lammps-users mailing list `_
+or the `LAMMPS forum `_ for those
+purposes.
 
-How quickly your contribution will be integrated depends largely on how
-much effort it will cause to integrate and test it, how many and what
-kind of changes it requires to the core codebase, and of how much
+Packages versus individual files
+--------------------------------
+
+The remainder of this chapter describes how to add new "style" files of
+various kinds to LAMMPS.  Packages are simply collections of one or more
+such new class files which are invoked as a new style within a LAMMPS
+input script.  In some cases also collections of supporting functions or
+classes are included as separate files in a package, especially when
+they can be shared between multiple styles. If designed correctly, these
+additions typically do not require any changes to the core code of
+LAMMPS; they are simply add-on files that are compiled with the rest of
+LAMMPS.  To make those styles work, you may need some trivial changes to
+the core code; an example of a trivial change is making a parent-class
+method "virtual" when you derive a new child class from it.
+
+If you think your new feature or package requires some non-trivial
+changes in core LAMMPS files, you should communicate with the LAMMPS
+developers `on Slack `_, `on GitHub
+`_, or `via email
+`_, since we may have
+recommendations about what changes to do where, or may not want to
+include certain changes for some reason and thus you would need to look
+for alternatives.
+
+Time and effort required
+------------------------
+
+How quickly your contribution will be integrated can vary a lot.  It
+depends largely on how much effort it will cause the LAMMPS developers
+to integrate and test it, how many and what kind of changes to the core
+code are required, how quickly you can address them and of how much
 interest it is to the larger LAMMPS community.  Please see the section
 on :doc:`LAMMPS programming style and requirements ` for
-instructions, recommendations, and requirements.
+instructions, recommendations, and formal requirements.  A small,
+modular, well written contribution may be integrated within hours, but a
+complex change that will require a redesign of some core functionality
+in LAMMPS for a clean integration can take many months until it is
+considered ready for inclusion (though this is rare).
+
+
+Submission procedure
+--------------------
+
+All changes to LAMMPS (including those from LAMMPS developers) are
+integrated via pull requests on GitHub and cannot be merged without
+passing the automated testing and an approving review by a LAMMPS core
+developer.  Thus before submitting your contribution, you should first
+make certain, that your added or modified code compiles and works
+correctly with the latest patch-level or development version of LAMMPS
+and contains all bug fixes from it.
 
 Once you have prepared everything, see the :doc:`LAMMPS GitHub Tutorial
 ` page for instructions on how to submit your changes or
-new files through a GitHub pull request.  If you are unable or unwilling
-to submit via GitHub yourself, you may also submit patch files or full
-files to the LAMMPS developers and ask them to submit a pull request on
-GitHub on your behalf.  **All** changes to LAMMPS (including those from
-the LAMMPS core developers) must be submitted as GitHub pull requests
-and cannot be merged without passing the automated integration and unit
-testing as well as a code review by a LAMMPS core developer that did not
-submit it.  Thus before submitting your contribution, you should first
-make certain, that your added or modified code works correctly with the
-latest patch-level version of LAMMPS and contains all bug fixes from it.
-Then create a gzipped tar file of all changed or added files or a
-corresponding patch file using 'diff -u' or 'diff -c' and compress it
-with gzip.  Please only use gzip compression, as this works well and is
-available on all platforms.
+new files through a GitHub pull request yourself.  If you are unable or
+unwilling to submit via GitHub yourself, you may also submit patch files
+or full files to the LAMMPS developers and ask them to submit a pull
+request on GitHub on your behalf.  Then create a gzipped tar file of
+all  changed or added files or a corresponding patch file using
+'diff -u' or 'diff -c' format and compress it with gzip.  Please only
+use gzip compression, as this works well and is available on all platforms.
 
 If the new features/files are broadly useful we may add them as core
 files to LAMMPS or as part of a :doc:`package `.  All
 packages are listed and described on the :doc:`Packages details
 ` doc page.
 
+Licensing
+---------
+
 Note that by providing us files to release, you agree to make them
 open-source, i.e. we can release them under the terms of the GPL
 (version 2) with the rest of LAMMPS.  And similarly as part of a LGPL
@@ -71,30 +110,17 @@ developers on request only and with files that are not authorized for
 that kind of distribution removed (e.g. interface to FFTW).  See the
 :doc:`LAMMPS license ` page for details.
 
-.. note::
+External contributions
+----------------------
 
-   If you prefer to do so, you can also develop and support your add-on
-   feature without having it included in the LAMMPS distribution, for
-   example as a download from a website of your own.  See the `Offsite
-   LAMMPS packages and tools `_
-   page of the LAMMPS website for examples of groups that do this.  We
-   are happy to advertise your package and website from that page.
-   Simply email the `developers `_
-   with info about your package and we will post it there.  We recommend
-   to name external packages USER-\ so they can be easily
-   distinguished from bundled packages that do not have the USER-
-   prefix.
+If you prefer to do so, you can also develop and support your add-on
+feature **without** having it included in the LAMMPS distribution, for
+example as a download from a website of your own.  See the `Offsite
+LAMMPS packages and tools `_ page
+of the LAMMPS website for examples of groups that do this.  We are happy
+to advertise your package and website from that page.  Simply email the
+`developers `_ with info about your
+package and we will post it there.  We recommend to name external
+packages USER-\ so they can be easily distinguished from bundled
+packages that do not have the USER- prefix.
 
-.. _lws: https://www.lammps.org
-
-The previous sections of this page describe how to add new "style"
-files of various kinds to LAMMPS.  Packages are simply collections of
-one or more new class files which are invoked as a new style within a
-LAMMPS input script.  If designed correctly, these additions typically
-do not require changes to the main core of LAMMPS; they are simply
-add-on files.  If you think your new feature requires non-trivial
-changes in core LAMMPS files, you should `communicate with the
-developers `_, since we may or
-may not want to include those changes for some reason.  An example of a
-trivial change is making a parent-class method "virtual" when you derive
-a new child class from it.

From e6d7a544e25f5980236931098296a19d3fc68c9b Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 14:02:35 -0400
Subject: [PATCH 217/437] remove whitespace from comma separated arguments to
 variable functions

---
 src/variable.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/variable.cpp b/src/variable.cpp
index a7b2955b33..ba34ea2a78 100644
--- a/src/variable.cpp
+++ b/src/variable.cpp
@@ -4720,7 +4720,7 @@ int Variable::parse_args(char *str, char **args)
   while (ptr && narg < MAXFUNCARG) {
     ptrnext = find_next_comma(ptr);
     if (ptrnext) *ptrnext = '\0';
-    args[narg] = utils::strdup(ptr);
+    args[narg] = utils::strdup(utils::trim(ptr));
     narg++;
     ptr = ptrnext;
     if (ptr) ptr++;

From 495f424a671a5d324e0bdbd3dd69bc82981db451 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 20:08:06 -0400
Subject: [PATCH 218/437] apply clang-format to pair_lj_cut.cpp so it can serve
 as example

---
 src/pair_lj_cut.cpp | 383 +++++++++++++++++++++-----------------------
 1 file changed, 187 insertions(+), 196 deletions(-)

diff --git a/src/pair_lj_cut.cpp b/src/pair_lj_cut.cpp
index fd85f4751b..a9d45b9007 100644
--- a/src/pair_lj_cut.cpp
+++ b/src/pair_lj_cut.cpp
@@ -1,4 +1,3 @@
-// clang-format off
 /* ----------------------------------------------------------------------
    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
    https://www.lammps.org/, Sandia National Laboratories
@@ -18,19 +17,20 @@
 
 #include "pair_lj_cut.h"
 
-#include 
-#include 
 #include "atom.h"
 #include "comm.h"
+#include "error.h"
 #include "force.h"
-#include "neighbor.h"
-#include "neigh_list.h"
-#include "neigh_request.h"
-#include "update.h"
-#include "respa.h"
 #include "math_const.h"
 #include "memory.h"
-#include "error.h"
+#include "neigh_list.h"
+#include "neigh_request.h"
+#include "neighbor.h"
+#include "respa.h"
+#include "update.h"
+
+#include 
+#include 
 
 using namespace LAMMPS_NS;
 using namespace MathConst;
@@ -68,13 +68,13 @@ PairLJCut::~PairLJCut()
 
 void PairLJCut::compute(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
-  double rsq,r2inv,r6inv,forcelj,factor_lj;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair;
+  double rsq, r2inv, r6inv, forcelj, factor_lj;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   evdwl = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   double **x = atom->x;
   double **f = atom->f;
@@ -107,32 +107,30 @@ void PairLJCut::compute(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       jtype = type[j];
 
       if (rsq < cutsq[itype][jtype]) {
-        r2inv = 1.0/rsq;
-        r6inv = r2inv*r2inv*r2inv;
-        forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-        fpair = factor_lj*forcelj*r2inv;
+        r2inv = 1.0 / rsq;
+        r6inv = r2inv * r2inv * r2inv;
+        forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+        fpair = factor_lj * forcelj * r2inv;
 
-        f[i][0] += delx*fpair;
-        f[i][1] += dely*fpair;
-        f[i][2] += delz*fpair;
+        f[i][0] += delx * fpair;
+        f[i][1] += dely * fpair;
+        f[i][2] += delz * fpair;
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fpair;
-          f[j][1] -= dely*fpair;
-          f[j][2] -= delz*fpair;
+          f[j][0] -= delx * fpair;
+          f[j][1] -= dely * fpair;
+          f[j][2] -= delz * fpair;
         }
 
         if (eflag) {
-          evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) -
-            offset[itype][jtype];
+          evdwl = r6inv * (lj3[itype][jtype] * r6inv - lj4[itype][jtype]) - offset[itype][jtype];
           evdwl *= factor_lj;
         }
 
-        if (evflag) ev_tally(i,j,nlocal,newton_pair,
-                             evdwl,0.0,fpair,delx,dely,delz);
+        if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
       }
     }
   }
@@ -144,10 +142,10 @@ void PairLJCut::compute(int eflag, int vflag)
 
 void PairLJCut::compute_inner()
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double xtmp,ytmp,ztmp,delx,dely,delz,fpair;
-  double rsq,r2inv,r6inv,forcelj,factor_lj,rsw;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double xtmp, ytmp, ztmp, delx, dely, delz, fpair;
+  double rsq, r2inv, r6inv, forcelj, factor_lj, rsw;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   double **x = atom->x;
   double **f = atom->f;
@@ -165,8 +163,8 @@ void PairLJCut::compute_inner()
   double cut_out_off = cut_respa[1];
 
   double cut_out_diff = cut_out_off - cut_out_on;
-  double cut_out_on_sq = cut_out_on*cut_out_on;
-  double cut_out_off_sq = cut_out_off*cut_out_off;
+  double cut_out_on_sq = cut_out_on * cut_out_on;
+  double cut_out_off_sq = cut_out_off * cut_out_off;
 
   // loop over neighbors of my atoms
 
@@ -187,26 +185,26 @@ void PairLJCut::compute_inner()
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
 
       if (rsq < cut_out_off_sq) {
-        r2inv = 1.0/rsq;
-        r6inv = r2inv*r2inv*r2inv;
+        r2inv = 1.0 / rsq;
+        r6inv = r2inv * r2inv * r2inv;
         jtype = type[j];
-        forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-        fpair = factor_lj*forcelj*r2inv;
+        forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+        fpair = factor_lj * forcelj * r2inv;
         if (rsq > cut_out_on_sq) {
-          rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff;
-          fpair *= 1.0 - rsw*rsw*(3.0 - 2.0*rsw);
+          rsw = (sqrt(rsq) - cut_out_on) / cut_out_diff;
+          fpair *= 1.0 - rsw * rsw * (3.0 - 2.0 * rsw);
         }
 
-        f[i][0] += delx*fpair;
-        f[i][1] += dely*fpair;
-        f[i][2] += delz*fpair;
+        f[i][0] += delx * fpair;
+        f[i][1] += dely * fpair;
+        f[i][2] += delz * fpair;
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fpair;
-          f[j][1] -= dely*fpair;
-          f[j][2] -= delz*fpair;
+          f[j][0] -= delx * fpair;
+          f[j][1] -= dely * fpair;
+          f[j][2] -= delz * fpair;
         }
       }
     }
@@ -217,10 +215,10 @@ void PairLJCut::compute_inner()
 
 void PairLJCut::compute_middle()
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double xtmp,ytmp,ztmp,delx,dely,delz,fpair;
-  double rsq,r2inv,r6inv,forcelj,factor_lj,rsw;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double xtmp, ytmp, ztmp, delx, dely, delz, fpair;
+  double rsq, r2inv, r6inv, forcelj, factor_lj, rsw;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   double **x = atom->x;
   double **f = atom->f;
@@ -241,10 +239,10 @@ void PairLJCut::compute_middle()
 
   double cut_in_diff = cut_in_on - cut_in_off;
   double cut_out_diff = cut_out_off - cut_out_on;
-  double cut_in_off_sq = cut_in_off*cut_in_off;
-  double cut_in_on_sq = cut_in_on*cut_in_on;
-  double cut_out_on_sq = cut_out_on*cut_out_on;
-  double cut_out_off_sq = cut_out_off*cut_out_off;
+  double cut_in_off_sq = cut_in_off * cut_in_off;
+  double cut_in_on_sq = cut_in_on * cut_in_on;
+  double cut_out_on_sq = cut_out_on * cut_out_on;
+  double cut_out_off_sq = cut_out_off * cut_out_off;
 
   // loop over neighbors of my atoms
 
@@ -265,30 +263,30 @@ void PairLJCut::compute_middle()
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
 
       if (rsq < cut_out_off_sq && rsq > cut_in_off_sq) {
-        r2inv = 1.0/rsq;
-        r6inv = r2inv*r2inv*r2inv;
+        r2inv = 1.0 / rsq;
+        r6inv = r2inv * r2inv * r2inv;
         jtype = type[j];
-        forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-        fpair = factor_lj*forcelj*r2inv;
+        forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+        fpair = factor_lj * forcelj * r2inv;
         if (rsq < cut_in_on_sq) {
-          rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff;
-          fpair *= rsw*rsw*(3.0 - 2.0*rsw);
+          rsw = (sqrt(rsq) - cut_in_off) / cut_in_diff;
+          fpair *= rsw * rsw * (3.0 - 2.0 * rsw);
         }
         if (rsq > cut_out_on_sq) {
-          rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff;
-          fpair *= 1.0 + rsw*rsw*(2.0*rsw - 3.0);
+          rsw = (sqrt(rsq) - cut_out_on) / cut_out_diff;
+          fpair *= 1.0 + rsw * rsw * (2.0 * rsw - 3.0);
         }
 
-        f[i][0] += delx*fpair;
-        f[i][1] += dely*fpair;
-        f[i][2] += delz*fpair;
+        f[i][0] += delx * fpair;
+        f[i][1] += dely * fpair;
+        f[i][2] += delz * fpair;
         if (newton_pair || j < nlocal) {
-          f[j][0] -= delx*fpair;
-          f[j][1] -= dely*fpair;
-          f[j][2] -= delz*fpair;
+          f[j][0] -= delx * fpair;
+          f[j][1] -= dely * fpair;
+          f[j][2] -= delz * fpair;
         }
       }
     }
@@ -299,13 +297,13 @@ void PairLJCut::compute_middle()
 
 void PairLJCut::compute_outer(int eflag, int vflag)
 {
-  int i,j,ii,jj,inum,jnum,itype,jtype;
-  double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair;
-  double rsq,r2inv,r6inv,forcelj,factor_lj,rsw;
-  int *ilist,*jlist,*numneigh,**firstneigh;
+  int i, j, ii, jj, inum, jnum, itype, jtype;
+  double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair;
+  double rsq, r2inv, r6inv, forcelj, factor_lj, rsw;
+  int *ilist, *jlist, *numneigh, **firstneigh;
 
   evdwl = 0.0;
-  ev_init(eflag,vflag);
+  ev_init(eflag, vflag);
 
   double **x = atom->x;
   double **f = atom->f;
@@ -323,8 +321,8 @@ void PairLJCut::compute_outer(int eflag, int vflag)
   double cut_in_on = cut_respa[3];
 
   double cut_in_diff = cut_in_on - cut_in_off;
-  double cut_in_off_sq = cut_in_off*cut_in_off;
-  double cut_in_on_sq = cut_in_on*cut_in_on;
+  double cut_in_off_sq = cut_in_off * cut_in_off;
+  double cut_in_on_sq = cut_in_on * cut_in_on;
 
   // loop over neighbors of my atoms
 
@@ -345,50 +343,48 @@ void PairLJCut::compute_outer(int eflag, int vflag)
       delx = xtmp - x[j][0];
       dely = ytmp - x[j][1];
       delz = ztmp - x[j][2];
-      rsq = delx*delx + dely*dely + delz*delz;
+      rsq = delx * delx + dely * dely + delz * delz;
       jtype = type[j];
 
       if (rsq < cutsq[itype][jtype]) {
         if (rsq > cut_in_off_sq) {
-          r2inv = 1.0/rsq;
-          r6inv = r2inv*r2inv*r2inv;
-          forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-          fpair = factor_lj*forcelj*r2inv;
+          r2inv = 1.0 / rsq;
+          r6inv = r2inv * r2inv * r2inv;
+          forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+          fpair = factor_lj * forcelj * r2inv;
           if (rsq < cut_in_on_sq) {
-            rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff;
-            fpair *= rsw*rsw*(3.0 - 2.0*rsw);
+            rsw = (sqrt(rsq) - cut_in_off) / cut_in_diff;
+            fpair *= rsw * rsw * (3.0 - 2.0 * rsw);
           }
 
-          f[i][0] += delx*fpair;
-          f[i][1] += dely*fpair;
-          f[i][2] += delz*fpair;
+          f[i][0] += delx * fpair;
+          f[i][1] += dely * fpair;
+          f[i][2] += delz * fpair;
           if (newton_pair || j < nlocal) {
-            f[j][0] -= delx*fpair;
-            f[j][1] -= dely*fpair;
-            f[j][2] -= delz*fpair;
+            f[j][0] -= delx * fpair;
+            f[j][1] -= dely * fpair;
+            f[j][2] -= delz * fpair;
           }
         }
 
         if (eflag) {
-          r2inv = 1.0/rsq;
-          r6inv = r2inv*r2inv*r2inv;
-          evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) -
-            offset[itype][jtype];
+          r2inv = 1.0 / rsq;
+          r6inv = r2inv * r2inv * r2inv;
+          evdwl = r6inv * (lj3[itype][jtype] * r6inv - lj4[itype][jtype]) - offset[itype][jtype];
           evdwl *= factor_lj;
         }
 
         if (vflag) {
           if (rsq <= cut_in_off_sq) {
-            r2inv = 1.0/rsq;
-            r6inv = r2inv*r2inv*r2inv;
-            forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-            fpair = factor_lj*forcelj*r2inv;
+            r2inv = 1.0 / rsq;
+            r6inv = r2inv * r2inv * r2inv;
+            forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+            fpair = factor_lj * forcelj * r2inv;
           } else if (rsq < cut_in_on_sq)
-            fpair = factor_lj*forcelj*r2inv;
+            fpair = factor_lj * forcelj * r2inv;
         }
 
-        if (evflag) ev_tally(i,j,nlocal,newton_pair,
-                             evdwl,0.0,fpair,delx,dely,delz);
+        if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, delx, dely, delz);
       }
     }
   }
@@ -401,23 +397,22 @@ void PairLJCut::compute_outer(int eflag, int vflag)
 void PairLJCut::allocate()
 {
   allocated = 1;
-  int n = atom->ntypes;
+  int n = atom->ntypes + 1;
 
-  memory->create(setflag,n+1,n+1,"pair:setflag");
-  for (int i = 1; i <= n; i++)
-    for (int j = i; j <= n; j++)
-      setflag[i][j] = 0;
+  memory->create(setflag, n, n, "pair:setflag");
+  for (int i = 1; i < n; i++)
+    for (int j = i; j < n; j++) setflag[i][j] = 0;
 
-  memory->create(cutsq,n+1,n+1,"pair:cutsq");
+  memory->create(cutsq, n, n, "pair:cutsq");
 
-  memory->create(cut,n+1,n+1,"pair:cut");
-  memory->create(epsilon,n+1,n+1,"pair:epsilon");
-  memory->create(sigma,n+1,n+1,"pair:sigma");
-  memory->create(lj1,n+1,n+1,"pair:lj1");
-  memory->create(lj2,n+1,n+1,"pair:lj2");
-  memory->create(lj3,n+1,n+1,"pair:lj3");
-  memory->create(lj4,n+1,n+1,"pair:lj4");
-  memory->create(offset,n+1,n+1,"pair:offset");
+  memory->create(cut, n, n, "pair:cut");
+  memory->create(epsilon, n, n, "pair:epsilon");
+  memory->create(sigma, n, n, "pair:sigma");
+  memory->create(lj1, n, n, "pair:lj1");
+  memory->create(lj2, n, n, "pair:lj2");
+  memory->create(lj3, n, n, "pair:lj3");
+  memory->create(lj4, n, n, "pair:lj4");
+  memory->create(offset, n, n, "pair:offset");
 }
 
 /* ----------------------------------------------------------------------
@@ -426,14 +421,14 @@ void PairLJCut::allocate()
 
 void PairLJCut::settings(int narg, char **arg)
 {
-  if (narg != 1) error->all(FLERR,"Illegal pair_style command");
+  if (narg != 1) error->all(FLERR, "Illegal pair_style command");
 
-  cut_global = utils::numeric(FLERR,arg[0],false,lmp);
+  cut_global = utils::numeric(FLERR, arg[0], false, lmp);
 
   // reset cutoffs that have been explicitly set
 
   if (allocated) {
-    int i,j;
+    int i, j;
     for (i = 1; i <= atom->ntypes; i++)
       for (j = i; j <= atom->ntypes; j++)
         if (setflag[i][j]) cut[i][j] = cut_global;
@@ -446,23 +441,22 @@ void PairLJCut::settings(int narg, char **arg)
 
 void PairLJCut::coeff(int narg, char **arg)
 {
-  if (narg < 4 || narg > 5)
-    error->all(FLERR,"Incorrect args for pair coefficients");
+  if (narg < 4 || narg > 5) error->all(FLERR, "Incorrect args for pair coefficients");
   if (!allocated) allocate();
 
-  int ilo,ihi,jlo,jhi;
-  utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
-  utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
+  int ilo, ihi, jlo, jhi;
+  utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error);
+  utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error);
 
-  double epsilon_one = utils::numeric(FLERR,arg[2],false,lmp);
-  double sigma_one = utils::numeric(FLERR,arg[3],false,lmp);
+  double epsilon_one = utils::numeric(FLERR, arg[2], false, lmp);
+  double sigma_one = utils::numeric(FLERR, arg[3], false, lmp);
 
   double cut_one = cut_global;
-  if (narg == 5) cut_one = utils::numeric(FLERR,arg[4],false,lmp);
+  if (narg == 5) cut_one = utils::numeric(FLERR, arg[4], false, lmp);
 
   int count = 0;
   for (int i = ilo; i <= ihi; i++) {
-    for (int j = MAX(jlo,i); j <= jhi; j++) {
+    for (int j = MAX(jlo, i); j <= jhi; j++) {
       epsilon[i][j] = epsilon_one;
       sigma[i][j] = sigma_one;
       cut[i][j] = cut_one;
@@ -471,7 +465,7 @@ void PairLJCut::coeff(int narg, char **arg)
     }
   }
 
-  if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
+  if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients");
 }
 
 /* ----------------------------------------------------------------------
@@ -485,12 +479,12 @@ void PairLJCut::init_style()
   int irequest;
   int respa = 0;
 
-  if (update->whichflag == 1 && utils::strmatch(update->integrate_style,"^respa")) {
+  if (update->whichflag == 1 && utils::strmatch(update->integrate_style, "^respa")) {
     if (((Respa *) update->integrate)->level_inner >= 0) respa = 1;
     if (((Respa *) update->integrate)->level_middle >= 0) respa = 2;
   }
 
-  irequest = neighbor->request(this,instance_me);
+  irequest = neighbor->request(this, instance_me);
 
   if (respa >= 1) {
     neighbor->requests[irequest]->respaouter = 1;
@@ -500,10 +494,11 @@ void PairLJCut::init_style()
 
   // set rRESPA cutoffs
 
-  if (utils::strmatch(update->integrate_style,"^respa") &&
+  if (utils::strmatch(update->integrate_style, "^respa") &&
       ((Respa *) update->integrate)->level_inner >= 0)
     cut_respa = ((Respa *) update->integrate)->cutoff;
-  else cut_respa = nullptr;
+  else
+    cut_respa = nullptr;
 }
 
 /* ----------------------------------------------------------------------
@@ -513,21 +508,21 @@ void PairLJCut::init_style()
 double PairLJCut::init_one(int i, int j)
 {
   if (setflag[i][j] == 0) {
-    epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j],
-                               sigma[i][i],sigma[j][j]);
-    sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]);
-    cut[i][j] = mix_distance(cut[i][i],cut[j][j]);
+    epsilon[i][j] = mix_energy(epsilon[i][i], epsilon[j][j], sigma[i][i], sigma[j][j]);
+    sigma[i][j] = mix_distance(sigma[i][i], sigma[j][j]);
+    cut[i][j] = mix_distance(cut[i][i], cut[j][j]);
   }
 
-  lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0);
-  lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0);
-  lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0);
-  lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0);
+  lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j], 12.0);
+  lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j], 6.0);
+  lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j], 12.0);
+  lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j], 6.0);
 
   if (offset_flag && (cut[i][j] > 0.0)) {
     double ratio = sigma[i][j] / cut[i][j];
-    offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0));
-  } else offset[i][j] = 0.0;
+    offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio, 12.0) - pow(ratio, 6.0));
+  } else
+    offset[i][j] = 0.0;
 
   lj1[j][i] = lj1[i][j];
   lj2[j][i] = lj2[i][j];
@@ -538,7 +533,7 @@ double PairLJCut::init_one(int i, int j)
   // check interior rRESPA cutoff
 
   if (cut_respa && cut[i][j] < cut_respa[3])
-    error->all(FLERR,"Pair cutoff < Respa interior cutoff");
+    error->all(FLERR, "Pair cutoff < Respa interior cutoff");
 
   // compute I,J contribution to long-range tail correction
   // count total # of atoms of type I and J via Allreduce
@@ -547,23 +542,22 @@ double PairLJCut::init_one(int i, int j)
     int *type = atom->type;
     int nlocal = atom->nlocal;
 
-    double count[2],all[2];
+    double count[2], all[2];
     count[0] = count[1] = 0.0;
     for (int k = 0; k < nlocal; k++) {
       if (type[k] == i) count[0] += 1.0;
       if (type[k] == j) count[1] += 1.0;
     }
-    MPI_Allreduce(count,all,2,MPI_DOUBLE,MPI_SUM,world);
+    MPI_Allreduce(count, all, 2, MPI_DOUBLE, MPI_SUM, world);
 
-    double sig2 = sigma[i][j]*sigma[i][j];
-    double sig6 = sig2*sig2*sig2;
-    double rc3 = cut[i][j]*cut[i][j]*cut[i][j];
-    double rc6 = rc3*rc3;
-    double rc9 = rc3*rc6;
-    etail_ij = 8.0*MY_PI*all[0]*all[1]*epsilon[i][j] *
-      sig6 * (sig6 - 3.0*rc6) / (9.0*rc9);
-    ptail_ij = 16.0*MY_PI*all[0]*all[1]*epsilon[i][j] *
-      sig6 * (2.0*sig6 - 3.0*rc6) / (9.0*rc9);
+    double sig2 = sigma[i][j] * sigma[i][j];
+    double sig6 = sig2 * sig2 * sig2;
+    double rc3 = cut[i][j] * cut[i][j] * cut[i][j];
+    double rc6 = rc3 * rc3;
+    double rc9 = rc3 * rc6;
+    double prefactor = 8.0 * MY_PI * all[0] * all[1] * epsilon[i][j] * sig6 / (9.0 * rc9);
+    etail_ij = prefactor * (sig6 - 3.0 * rc6);
+    ptail_ij = 2.0 * prefactor * (2.0 * sig6 - 3.0 * rc6);
   }
 
   return cut[i][j];
@@ -577,14 +571,14 @@ void PairLJCut::write_restart(FILE *fp)
 {
   write_restart_settings(fp);
 
-  int i,j;
+  int i, j;
   for (i = 1; i <= atom->ntypes; i++)
     for (j = i; j <= atom->ntypes; j++) {
-      fwrite(&setflag[i][j],sizeof(int),1,fp);
+      fwrite(&setflag[i][j], sizeof(int), 1, fp);
       if (setflag[i][j]) {
-        fwrite(&epsilon[i][j],sizeof(double),1,fp);
-        fwrite(&sigma[i][j],sizeof(double),1,fp);
-        fwrite(&cut[i][j],sizeof(double),1,fp);
+        fwrite(&epsilon[i][j], sizeof(double), 1, fp);
+        fwrite(&sigma[i][j], sizeof(double), 1, fp);
+        fwrite(&cut[i][j], sizeof(double), 1, fp);
       }
     }
 }
@@ -598,21 +592,21 @@ void PairLJCut::read_restart(FILE *fp)
   read_restart_settings(fp);
   allocate();
 
-  int i,j;
+  int i, j;
   int me = comm->me;
   for (i = 1; i <= atom->ntypes; i++)
     for (j = i; j <= atom->ntypes; j++) {
-      if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error);
-      MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
+      if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error);
+      MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world);
       if (setflag[i][j]) {
         if (me == 0) {
-          utils::sfread(FLERR,&epsilon[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&sigma[i][j],sizeof(double),1,fp,nullptr,error);
-          utils::sfread(FLERR,&cut[i][j],sizeof(double),1,fp,nullptr,error);
+          utils::sfread(FLERR, &epsilon[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &sigma[i][j], sizeof(double), 1, fp, nullptr, error);
+          utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error);
         }
-        MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world);
-        MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
+        MPI_Bcast(&epsilon[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&sigma[i][j], 1, MPI_DOUBLE, 0, world);
+        MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world);
       }
     }
 }
@@ -623,10 +617,10 @@ void PairLJCut::read_restart(FILE *fp)
 
 void PairLJCut::write_restart_settings(FILE *fp)
 {
-  fwrite(&cut_global,sizeof(double),1,fp);
-  fwrite(&offset_flag,sizeof(int),1,fp);
-  fwrite(&mix_flag,sizeof(int),1,fp);
-  fwrite(&tail_flag,sizeof(int),1,fp);
+  fwrite(&cut_global, sizeof(double), 1, fp);
+  fwrite(&offset_flag, sizeof(int), 1, fp);
+  fwrite(&mix_flag, sizeof(int), 1, fp);
+  fwrite(&tail_flag, sizeof(int), 1, fp);
 }
 
 /* ----------------------------------------------------------------------
@@ -637,15 +631,15 @@ void PairLJCut::read_restart_settings(FILE *fp)
 {
   int me = comm->me;
   if (me == 0) {
-    utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error);
-    utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error);
-    utils::sfread(FLERR,&tail_flag,sizeof(int),1,fp,nullptr,error);
+    utils::sfread(FLERR, &cut_global, sizeof(double), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &offset_flag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &mix_flag, sizeof(int), 1, fp, nullptr, error);
+    utils::sfread(FLERR, &tail_flag, sizeof(int), 1, fp, nullptr, error);
   }
-  MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
-  MPI_Bcast(&offset_flag,1,MPI_INT,0,world);
-  MPI_Bcast(&mix_flag,1,MPI_INT,0,world);
-  MPI_Bcast(&tail_flag,1,MPI_INT,0,world);
+  MPI_Bcast(&cut_global, 1, MPI_DOUBLE, 0, world);
+  MPI_Bcast(&offset_flag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&mix_flag, 1, MPI_INT, 0, world);
+  MPI_Bcast(&tail_flag, 1, MPI_INT, 0, world);
 }
 
 /* ----------------------------------------------------------------------
@@ -654,8 +648,7 @@ void PairLJCut::read_restart_settings(FILE *fp)
 
 void PairLJCut::write_data(FILE *fp)
 {
-  for (int i = 1; i <= atom->ntypes; i++)
-    fprintf(fp,"%d %g %g\n",i,epsilon[i][i],sigma[i][i]);
+  for (int i = 1; i <= atom->ntypes; i++) fprintf(fp, "%d %g %g\n", i, epsilon[i][i], sigma[i][i]);
 }
 
 /* ----------------------------------------------------------------------
@@ -666,25 +659,23 @@ void PairLJCut::write_data_all(FILE *fp)
 {
   for (int i = 1; i <= atom->ntypes; i++)
     for (int j = i; j <= atom->ntypes; j++)
-      fprintf(fp,"%d %d %g %g %g\n",i,j,epsilon[i][j],sigma[i][j],cut[i][j]);
+      fprintf(fp, "%d %d %g %g %g\n", i, j, epsilon[i][j], sigma[i][j], cut[i][j]);
 }
 
 /* ---------------------------------------------------------------------- */
 
 double PairLJCut::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
-                         double /*factor_coul*/, double factor_lj,
-                         double &fforce)
+                         double /*factor_coul*/, double factor_lj, double &fforce)
 {
-  double r2inv,r6inv,forcelj,philj;
+  double r2inv, r6inv, forcelj, philj;
 
-  r2inv = 1.0/rsq;
-  r6inv = r2inv*r2inv*r2inv;
-  forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
-  fforce = factor_lj*forcelj*r2inv;
+  r2inv = 1.0 / rsq;
+  r6inv = r2inv * r2inv * r2inv;
+  forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]);
+  fforce = factor_lj * forcelj * r2inv;
 
-  philj = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) -
-    offset[itype][jtype];
-  return factor_lj*philj;
+  philj = r6inv * (lj3[itype][jtype] * r6inv - lj4[itype][jtype]) - offset[itype][jtype];
+  return factor_lj * philj;
 }
 
 /* ---------------------------------------------------------------------- */
@@ -692,7 +683,7 @@ double PairLJCut::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq,
 void *PairLJCut::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, "epsilon") == 0) return (void *) epsilon;
+  if (strcmp(str, "sigma") == 0) return (void *) sigma;
   return nullptr;
 }

From c186b2429288e5832bd31b64b4db9368eeac1a5e Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 21:47:39 -0400
Subject: [PATCH 219/437] avoid segfaults due to uninitialized data

---
 src/REPLICA/neb.cpp   | 2 +-
 src/SPIN/neb_spin.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp
index a445ace756..0ed3a0b95e 100644
--- a/src/REPLICA/neb.cpp
+++ b/src/REPLICA/neb.cpp
@@ -51,7 +51,7 @@ NEB::NEB(LAMMPS *lmp) : Command(lmp), all(nullptr), rdist(nullptr) {}
 
 NEB::NEB(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in,
          int n2steps_in, int nevery_in, double *buf_init, double *buf_final)
-  : Command(lmp), all(nullptr), rdist(nullptr)
+  : Command(lmp), fp(nullptr), all(nullptr), rdist(nullptr)
 {
   double delx,dely,delz;
 
diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp
index 1b798166a1..fe24235a98 100644
--- a/src/SPIN/neb_spin.cpp
+++ b/src/SPIN/neb_spin.cpp
@@ -68,7 +68,7 @@ static const char cite_neb_spin[] =
 
 /* ---------------------------------------------------------------------- */
 
-NEBSpin::NEBSpin(LAMMPS *lmp) : Command(lmp) {
+NEBSpin::NEBSpin(LAMMPS *lmp) : Command(lmp), fp(nullptr) {
   if (lmp->citeme) lmp->citeme->add(cite_neb_spin);
 }
 

From 72d92ac9e87e332b8263d9654f390105de3560dd Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 22:03:12 -0400
Subject: [PATCH 220/437] correct and clarify Python compatibility

---
 doc/src/Packages_details.rst | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst
index 85dead55a3..5474d0fff9 100644
--- a/doc/src/Packages_details.rst
+++ b/doc/src/Packages_details.rst
@@ -2248,16 +2248,16 @@ PYTHON package
 
 A :doc:`python ` command which allow you to execute Python code
 from a LAMMPS input script.  The code can be in a separate file or
-embedded in the input script itself.  See the :doc:`Python call ` page for an overview of using Python from
-LAMMPS in this manner and all the :doc:`Python ` manual pages
-for other ways to use LAMMPS and Python together.
+embedded in the input script itself.  See the :doc:`Python call
+` page for an overview of using Python from LAMMPS in this
+manner and all the :doc:`Python ` manual pages for other
+ways to use LAMMPS and Python together.
 
 .. note::
 
-   Building with the PYTHON package assumes you have a Python
-   shared library available on your system, which needs to be a Python 2
-   version, 2.6 or later.  Python 3 is not yet supported.  See the
-   lib/python/README for more details.
+   Building with the PYTHON package assumes you have a Python development
+   environment (headers and libraries) available on your system, which needs
+   to be either Python version 2.7 or Python 3.5 and later.
 
 **Install:**
 

From ca7bab7e41157b902a81f7711edd8940b71633fe Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Wed, 1 Sep 2021 22:04:39 -0400
Subject: [PATCH 221/437] refactor style guide and integrate text from issue

---
 doc/src/Build_manual.rst                    |   2 +-
 doc/src/Modify_contribute.rst               |   2 +-
 doc/src/Modify_style.rst                    | 531 ++++++++++++++------
 doc/utils/sphinx-config/false_positives.txt |   2 +
 4 files changed, 392 insertions(+), 145 deletions(-)

diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst
index 18d097c255..d1c8910b65 100644
--- a/doc/src/Build_manual.rst
+++ b/doc/src/Build_manual.rst
@@ -75,7 +75,7 @@ folder.  The following ``make`` commands are available:
 .. code-block:: bash
 
    make html          # generate HTML in html dir using Sphinx
-   make pdf           # generate PDF  as Manual.pdf using Sphinx and pdflatex
+   make pdf           # generate PDF  as Manual.pdf using Sphinx and PDFLaTeX
    make fetch         # fetch HTML pages and PDF files from LAMMPS website
                       #  and unpack into the html_www folder and Manual_www.pdf
    make epub          # generate LAMMPS.epub in ePUB format using Sphinx
diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst
index 6819bbcd61..79eb1b5029 100644
--- a/doc/src/Modify_contribute.rst
+++ b/doc/src/Modify_contribute.rst
@@ -27,7 +27,7 @@ join the `LAMMPS developers on Slack `_.  This
 slack work space is by invitation only.  Thus for access, please send an
 e-mail to ``slack@lammps.org`` explaining what part of LAMMPS you are
 working on.  Only discussions related to LAMMPS development are
-tolerated in that workspace, so this is **NOT** for people that look for
+tolerated in that work space, so this is **NOT** for people that look for
 help with compiling, installing, or using LAMMPS.  Please post a message
 to the `lammps-users mailing list `_
 or the `LAMMPS forum `_ for those
diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst
index d2d192937c..b92f954803 100644
--- a/doc/src/Modify_style.rst
+++ b/doc/src/Modify_style.rst
@@ -1,50 +1,328 @@
-LAMMPS programming style and requirements
-=========================================
+LAMMPS programming style and requirements for contributions
+===========================================================
 
-Here is a checklist of steps you need to follow to submit a single file
-or package for our consideration.  Following these steps will save
-both you and us time. Please have a look at the existing files in
-packages in the src directory for examples. If you are uncertain, please ask.
+The following is a summary of the current requirements and
+recommendations for including contributed source code or documentation
+into the LAMMPS software distribution.
 
-* All source files you provide must compile with the most current
-  version of LAMMPS with multiple configurations. In particular you
-  need to test compiling LAMMPS from scratch with -DLAMMPS_BIGBIG
-  set in addition to the default -DLAMMPS_SMALLBIG setting. Your code
-  will need to work correctly in serial and in parallel using MPI.
+Motivation
+----------
 
-* For consistency with the rest of LAMMPS and especially, if you want
-  your contribution(s) to be added to main LAMMPS code or one of its
-  standard packages, it needs to be written in a style compatible with
-  other LAMMPS source files. This means: 2-character indentation per
-  level, **no tabs**, no lines over 100 characters. I/O is done via
-  the C-style stdio library (mixing of stdio and iostreams is generally
-  discouraged), class header files should not import any system headers
-  outside of , STL containers should be avoided in headers,
-  system header from the C library should use the C++-style names
-  (, , or ) instead of the C-style names
-  , , or ), and forward declarations
-  used where possible or needed to avoid including headers.
-  All added code should be placed into the LAMMPS_NS namespace or a
-  sub-namespace; global or static variables should be avoided, as they
-  conflict with the modular nature of LAMMPS and the C++ class structure.
-  Header files must **not** import namespaces with *using*\ .
-  This all is so the developers can more easily understand, integrate,
-  and maintain your contribution and reduce conflicts with other parts
-  of LAMMPS.  This basically means that the code accesses data
-  structures, performs its operations, and is formatted similar to other
-  LAMMPS source files, including the use of the error class for error
-  and warning messages.
+The LAMMPS developers are committed to providing a software package that
+is versatile, reliable, high-quality, efficient, portable, and easy to
+maintain and modify.  Achieving all of these goals is challenging since
+a large part of LAMMPS consists of contributed code from many different
+authors and not many of them are professionally trained programmers and
+familiar with the idiosyncrasies of maintaining a large software
+package.  In addition, changes that interfere with the parallel
+efficiency of the core code must be avoided.  As LAMMPS continues to
+grow and more features and functionality are added, it becomes a
+necessity to be more discriminating with new contributions while also
+working at the same time to improve the existing code.
 
-* To simplify reformatting contributed code in a way that is compatible
-  with the LAMMPS formatting styles, you can use clang-format (version 8
-  or later).  The LAMMPS distribution includes a suitable ``.clang-format``
-  file which will be applied if you run ``clang-format -i some_file.cpp``
-  on your files inside the LAMMPS src tree.  Please only reformat files
-  that you have contributed.  For header files containing a
-  ``SomeStyle(keyword, ClassName)`` macros it is required to have this
-  macro embedded with a pair of ``// clang-format off``, ``// clang-format on``
-  commends and the line must be terminated with a semi-colon (;).
-  Example:
+The following requirements and recommendations are provided to help
+maintaining or improving that status.  Where possible we utilize
+available continuous integration tools to search for common programming
+mistakes, portability limitations, incompatible formatting, and
+undesired side effects.  It is indicated which requirements are strict,
+and which represent a preference and thus are negotiable or optional.
+
+Please feel free to contact the LAMMPS core developers in case you need
+additional explanations or clarifications or in case you need assistance
+in realizing the (strict) requirements for your contributions.
+
+Licensing requirements (strict)
+-------------------------------
+
+Contributing authors agree when submitting a pull request that their
+contributions can be distributed under the LAMMPS license
+conditions. This is the GNU public license in version 2 (not 3 or later)
+for the publicly distributed versions, e.g. on the LAMMPS homepage or on
+GitHub.  On request we also make a version of LAMMPS available under
+LGPL 2.1 terms; this will usually be the latest available or a previous
+stable version with a few LGPL 2.1 incompatible files removed.
+
+Your new source files should have the LAMMPS copyright, GPL notice, and
+your name and email address at the top, like other user-contributed
+LAMMPS source files.
+
+Contributions may be under a different license for long as that
+license does not conflict with the aforementioned terms.  Contributions
+that use code with a conflicting license can be split into two parts:
+
+1. the core parts (i.e. parts that must be in the `src` tree) that are
+   licensed under compatible terms and bundled with the LAMMPS sources
+2. an external library that must be downloaded and compiled (either
+   separately or as part of the LAMMPS compilation)
+
+Please note, that this split licensed mode may complicate including the
+contribution in binary packages.
+
+Using Pull Requests on GitHub (preferred)
+-----------------------------------------
+
+All contributions to LAMMPS are processed as pull requests on GitHub
+(this also applies to the work of the core LAMMPS developers).  A
+:doc:`tutorial for submitting pull requests on GitHub ` is
+provided.  If this is still problematic, contributors may contact any of
+the core LAMMPS developers for help or to create a pull request on their
+behalf.  This latter way of submission may delay the integration as it
+depends on the amount of time required to prepare the pull request and
+free time available by the LAMMPS developer in question to spend on this
+task.
+
+Integration Testing (strict)
+----------------------------
+
+Contributed code, like all pull requests, must pass the automated
+tests on GitHub before it can be merged with the LAMMPS distribution.
+These tests compile LAMMPS in a variety of environments and settings and
+run the bundled unit tests.  At the discretion of the LAMMPS developer
+managing the pull request, additional tests may be activated that test
+for "side effects" on running a collection of input decks and create
+consistent results.  Also, the translation of the documentation to HTML
+and PDF is tested for.
+
+More specifically, this means that contributed source code **must**
+compile with the most current version of LAMMPS with ``-DLAMMPS_BIGBIG``
+in addition to the default setting of ``-DLAMMPS_SMALLBIG``.  The code
+needs to work correctly in both cases and also in serial and parallel
+using MPI.
+
+Some "disruptive" changes may break tests and require updates to the
+testing tools or scripts or tests themselves.  This is rare.  If in
+doubt, contact the LAMMPS developer that is assigned to the pull request
+for further details and explanations and suggestions of what needs to be
+done.
+
+Documentation (strict)
+----------------------
+
+Contributions that add new styles or commands or augment existing ones
+must include the corresponding new or modified documentation in
+`ReStructuredText format `_ (.rst files in the ``doc/src/`` folder). The
+documentation shall be written in American English and the .rst file
+must use only ASCII characters so it can be cleanly translated to PDF
+files (via `sphinx `_ and PDFLaTeX).  Special characters may be included via
+embedded math expression typeset in a LaTeX subset.
+
+.. _rst: https://docutils.readthedocs.io/en/sphinx-docs/user/rst/quickstart.html
+
+When adding new commands, they need to be integrated into the sphinx
+documentation system, and the corresponding command tables and lists
+updated. When translating the documentation into html files there should
+be no warnings. When adding a new package also some lists describing
+packages must be updated as well as a package specific description added
+and, if necessary, some package specific build instructions included.
+
+As appropriate, the text files with the documentation can include inline
+mathematical expression or figures (see ``doc/JPG`` for examples).
+Additional PDF files with further details (see ``doc/PDF`` for examples) may
+also be included.  The page should also include literature citations as
+appropriate; see the bottom of ``doc/fix_nh.rst`` for examples and the
+earlier part of the same file for how to format the cite itself.
+Citation labels must be unique across **all** .rst files.  The
+"Restrictions" section of the page should indicate if your command is
+only available if LAMMPS is built with the appropriate FOO package.  See
+other package doc files for examples of how to do this.
+
+Please run at least "make html" and "make spelling" and carefully
+inspect and proofread the resulting HTML format doc page before
+submitting your code.  Upon submission of a pull request, checks for
+error free completion of the HTML and PDF build will be performed and
+also a spell check, a check for correct anchors and labels, and a check
+for completeness of references all styles in their corresponding tables
+and lists is run.  In case the spell check reports false positives they
+can be added to the file doc/utils/sphinx-config/false_positives.txt
+
+Contributions that add or modify the library interface or "public" APIs
+from the C++ code or the Fortran module must include suitable doxygen
+comments in the source and corresponding changes to the documentation
+sources for the "Programmer Guide" guide section of the LAMMPS manual.
+
+Examples (preferred)
+--------------------
+
+In most cases, it is preferred that example scripts (simple, small, fast
+to complete on 1 CPU) are included that demonstrate the use of new or
+extended functionality. These are typically under the examples or
+examples/PACKAGES directory.  A few guidelines for such example input
+decks.
+
+- commands that generate output should be commented out (except when the
+  output is the sole purpose or the feature, e.g. for a new compute).
+
+- commands like :doc:`log `, :doc:`echo `, :doc:`package
+  `, :doc:`processors `, :doc:`suffix ` may
+  **not** be used in the input file (exception: "processors * * 1" or
+  similar is acceptable when used to avoid unwanted domain decomposition
+  of empty volumes).
+
+- outside of the log files no generated output should be included
+
+- custom thermo_style settings may not include output measuring CPU or other time
+  as that makes comparing the thermo output between different runs more complicated.
+
+- input files should be named ``in.name``, data files should be named
+  ``data.name`` and log files should be named ``log.version.name..``
+
+- the total file size of all the inputs and outputs should be small
+
+- where possible potential files from the "potentials" folder or data
+  file from other folders should be re-used through symbolic links
+
+Howto document (optional)
+-------------------------
+
+If your feature requires some more complex steps and explanations to be
+used correctly or some external or bundled tools or scripts, we
+recommend that you also contribute a :doc:`Howto document `
+providing some more background information and some tutorial material.
+This can also be used to provide more in-depth explanations for bundled
+examples.
+
+As a general rule-of-thumb, the more clear and self-explanatory you make
+your documentation, README files and examples, and the easier you make
+it for people to get started, the more likely it is that users will try
+out your new feature.
+
+Programming Style Requirements (varied)
+---------------------------------------
+
+The LAMMPS developers aim to employ a consistent programming style and
+naming conventions across the entire code base, as this helps with
+maintenance, debugging, and understanding the code, both for developers
+and users.
+
+The files `pair_lj_cut.h`, `pair_lj_cut.cpp`, `utils.h`, and `utils.cpp`
+may serve as representative examples.
+
+Command or Style names, file names, and keywords (mostly strict)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+All user-visible command or style names should be all lower case and
+should only use letters, numbers, or forward slashes.  They should be
+descriptive and initialisms should be avoided unless they are well
+established (e.g. lj for Lennard-Jones).  For a compute style
+"some/name" the source files must be called `compute_some_name.h` and
+`compute_some_name.cpp`. The "include guard" would then be
+`LMP_COMPUTE_SOME_NAME_H` and the class name `ComputeSomeName`.
+
+Whitespace and permissions (preferred)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Source files should not contain TAB characters unless required by the
+syntax (e.g. in makefiles) and no trailing whitespace.  Text files
+should be added with Unix-style line endings (LF-only). Git will
+automatically convert those in both directions when running on Windows;
+use dos2unix on Linux machines to convert files.  Text files should have
+a line ending on the last line.
+
+All files should have 0644 permissions, i.e writable to the user only
+and readable by all and no executable permissions.  Executable
+permissions (0755) should only be on shell scripts or python or similar
+scripts for interpreted script languages.
+
+Indentation and Placement of Braces (strongly preferred)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+LAMMPS uses 2 characters per indentation level and lines should be
+kept within 100 characters wide.
+
+For new files added to the "src" tree, a `clang-format
+`_ configuration file is
+provided under the name `.clang-format`.  This file is compatible with
+clang-format version 8 and later. With that file present files can be
+reformatted according to the configuration with a command like:
+`clang-format -i new-file.cpp`.  Ideally, this is done while writing the
+code or before a pull request is submitted.  Blocks of code where the
+reformatting from clang-format yields undesirable output may be
+protected with placing a pair `// clang-format off` and `// clang-format
+on` comments around that block.
+
+Programming language standards (required)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The core of LAMMPS is written in C++11 in a style that can be mostly
+described as "C with classes".  Advanced C++ features like operator
+overloading or excessive use of templates are avoided with the intent to
+keep the code readable to programmers that have limited C++ programming
+experience.  C++ constructs are acceptable when they help improving the
+readability and reliability of the code, e.g. when using the
+`std::string` class instead of manipulating pointers and calling the
+string functions of the C library.  In addition and number of convenient
+:doc:`utility functions and classes ` for recurring
+tasks are provided.
+
+Included Fortran code has to be compatible with the Fortran 2003
+standard.  Python code must be compatible with Python 3.5.  Large parts
+or LAMMPS (including the :ref:`PYTHON package `) are also
+compatible with Python 2.7.  Compatibility with Python 2.7 is
+desirable, but compatibility with Python 3.5 is **required**.
+
+Compatibility with these older programming language standards is very
+important to maintain portability, especially with HPC cluster
+environments, which tend to be running older software stacks and LAMMPS
+users may be required to use those older tools or not have the option to
+install newer compilers.
+
+Programming conventions (varied)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following is a collection of conventions that should be applied when
+writing code for LAMMPS.  Following these steps will make it much easier
+to integrate your contribution. Please have a look at the existing files
+in packages in the src directory for examples.  As a demonstration for
+how can be adapted to these conventions you may compare the REAXFF
+package with the what it looked like when it was called USER-REAXC.  If
+you are uncertain, please ask.
+
+- the order of ``#include`` statements in a file ``some_name.cpp`` that
+  implements a class ``SomeName`` defined in a header file
+  ``some_name.h`` should be as follows:
+
+  - ``#include "some_name.h"`` followed by an empty line
+
+  - LAMMPS include files e.g. ``#include "comm.h"`` or ``#include
+    "modify.h"`` in alphabetical order followed by an empty line
+
+  - system header files from the C++ or C standard library followed by
+    an empty line
+
+  - ``using namespace LAMMPS_NS`` or other namespace imports.
+
+- when including system header files from the C library use the
+    C++-style names (```` or ````) instead of the
+    C-style names (```` or ````)
+
+- I/O is done via the C-style stdio library and **not** iostreams
+  (and mixing of stdio and iostreams is generally discouraged
+
+- Output to the screen and the logfile should be using the corresponding
+  FILE pointers and only be done on MPI rank 0.  Use the :cpp:func:`utils::logmesg`
+  convenience function where possible.
+
+- header files should only include the absolute minimum number of
+  include files and **must not** contain any ``using`` statements;
+  rather the include statements should be put into the corresponding
+  implementation files
+
+- header files that define a new LAMMPS style (i.e. that have a
+  ``SomeStyle(some/name,SomeName);`` macro in them) should only use the
+  include file for the base class and otherwise use forward declarations
+  and pointers; when interfacing to a library use the PIMPL (pointer
+  to implementation) approach where you have a pointer to a struct
+  that contains all library specific data (and thus requires the library
+  header) but use a forward declaration and define the struct only in
+  the implementation file. This is a **strict** requirement since this
+  is where type clashes between packages and hard to fine bugs have
+  regularly manifested in the past.
+
+- Please use clang-format only to reformat files that you have
+  contributed.  For header files containing a ``SomeStyle(keyword,
+  ClassName)`` macros it is required to have this macro embedded with a
+  pair of ``// clang-format off``, ``// clang-format on`` commends and
+  the line must be terminated with a semi-colon (;).  Example:
 
   .. code-block:: c++
 
@@ -57,111 +335,78 @@ packages in the src directory for examples. If you are uncertain, please ask.
      #ifndef LMP_RUN_H
      [...]
 
-  You may also use ``// clang-format on/off`` throughout your file
-  to protect sections of the file from being reformatted.
+  You may also use ``// clang-format on/off`` throughout your files
+  to protect individual sections from being reformatted.
 
-* Please review the list of :doc:`available Packages `
-  to see if your contribution could be added to be added to one of them.
-  It should fit into the general purposed of that package.  If it does not
-  fit well, it can be added to one of the EXTRA- packages or the MISC package.
+- We rarely accept new styles in the core src folder.  Thus please
+  review the list of :doc:`available Packages ` to see
+  if your contribution could be added to be added to one of them.  It
+  should fit into the general purposed of that package.  If it does not
+  fit well, it may be added to one of the EXTRA- packages or the MISC
+  package.
 
-* If your contribution has several related features that are not covered
-  by one of the existing packages or is dependent on a library (bundled
-  or external), it is best to make it a package directory with a name
-  like FOO.  In addition to your new files, the directory should contain
-  a README text file.  The README should contain your name and contact
-  information and a brief description of what your new package does.  If
-  your files depend on other LAMMPS style files also being installed
-  (e.g. because your file is a derived class from the other LAMMPS
-  class), then an Install.sh file is also needed to check for those
-  dependencies and modifications to src/Depend.sh to trigger the checks.
-  See other README and Install.sh files in other directories as examples.
-  Similarly for CMake support changes need to be made to cmake/CMakeLists.txt,
-  the files in cmake/presets, and possibly a file to cmake/Modules/Packages/
-  added.  Please check out how this is handled for existing packages and
-  ask the LAMMPS developers if you need assistance.  Please submit a pull
-  request on GitHub or send us a tarball of this FOO directory and all
-  modified files.  Pull requests are strongly encouraged since they greatly
-  reduce the effort required to integrate a contribution and simplify the
-  process of adjusting the contributed code to cleanly fit into the
-  LAMMPS distribution.
 
-* Your new source files need to have the LAMMPS copyright, GPL notice,
-  and your name and email address at the top, like other
-  user-contributed LAMMPS source files.  They need to create a class
-  that is inside the LAMMPS namespace.  To simplify maintenance, we
-  may ask to adjust the programming style and formatting style to closer
-  match the rest of LAMMPS.  We bundle a clang-format configuration file
-  that can help with adjusting the formatting, although this is not a
-  strict requirement.
+Contributing a package
+----------------------
 
-* You **must** also create a **documentation** file for each new command
-  or style you are adding to LAMMPS.  For simplicity and convenience,
-  the documentation of groups of closely related commands or styles may
-  be combined into a single file.  This will be one file for a
-  single-file feature.  For a package, it might be several files.  These
-  are text files with a .rst extension using the `reStructuredText
-  `_ markup language, that are then converted to HTML and PDF
-  using the `Sphinx `_ documentation generator tool.  Running
-  Sphinx with the included configuration requires Python 3.x.
-  Configuration settings and custom extensions for this conversion are
-  included in the source distribution, and missing python packages will
-  be transparently downloaded into a virtual environment via pip. Thus,
-  if your local system is missing required packages, you need access to
-  the internet. The translation can be as simple as doing "make html
-  pdf" in the doc folder.  As appropriate, the text files can include
-  inline mathematical expression or figures (see doc/JPG for examples).
-  Additional PDF files with further details (see doc/PDF for examples)
-  may also be included.  The page should also include literature
-  citations as appropriate; see the bottom of doc/fix_nh.rst for
-  examples and the earlier part of the same file for how to format the
-  cite itself.  Citation labels must be unique across all .rst files.
-  The "Restrictions" section of the page should indicate if your
-  command is only available if LAMMPS is built with the appropriate
-  FOO package.  See other package doc files for examples of
-  how to do this.  Please run at least "make html" and "make spelling"
-  and carefully inspect and proofread the resulting HTML format doc page
-  before submitting your code.  Upon submission of a pull request,
-  checks for error free completion of the HTML and PDF build will be
-  performed and also a spell check, a check for correct anchors and
-  labels, and a check for completeness of references all styles in their
-  corresponding tables and lists is run.  In case the spell check
-  reports false positives they can be added to the file
-  doc/utils/sphinx-config/false_positives.txt
+If your contribution has several related features that are not covered
+by one of the existing packages or is dependent on a library (bundled or
+external), it is best to make it a package directory with a name like
+FOO.  In addition to your new files, the directory should contain a
+README text file.  The README should contain your name and contact
+information and a brief description of what your new package does.
 
-* For a new package (or even a single command) you should include one or
-  more example scripts demonstrating its use.  These should run in no
-  more than a couple minutes, even on a single processor, and not require
-  large data files as input.  See directories under examples/PACKAGES for
-  examples of input scripts other users provided for their packages.
-  These example inputs are also required for validating memory accesses
-  and testing for memory leaks with valgrind
 
-* If there is a paper of yours describing your feature (either the
-  algorithm/science behind the feature itself, or its initial usage, or
-  its implementation in LAMMPS), you can add the citation to the \*.cpp
-  source file.  See src/EFF/atom_vec_electron.cpp for an example.
-  A LaTeX citation is stored in a variable at the top of the file and
-  a single line of code registering this variable is added to the
-  constructor of the class.  If there is additional functionality (which
-  may have been added later) described in a different publication,
-  additional citation descriptions may be added for as long as they
-  are only registered when the corresponding keyword activating this
-  functionality is used.  With these options it is possible to have
-  LAMMPS output a specific citation reminder whenever a user invokes
-  your feature from their input script.  Note that you should only use
-  this for the most relevant paper for a feature and a publication that
-  you or your group authored.  E.g. adding a citation in the code for
-  a paper by Nose and Hoover if you write a fix that implements their
-  integrator is not the intended usage.  That kind of citation should
-  just be included in the documentation page you provide describing
-  your contribution.  If you are not sure what the best option would
-  be, please contact the LAMMPS developers for advice.
+Build system (strongly preferred)
+---------------------------------
 
-Finally, as a general rule-of-thumb, the more clear and
-self-explanatory you make your documentation and README files, and the
-easier you make it for people to get started, e.g. by providing example
-scripts, the more likely it is that users will try out your new feature.
+LAMMPS currently supports two build systems: one that is based on
+:doc:`traditional Makefiles ` and one that is based on
+:doc:`CMake `.  Thus your contribution must be compatible
+with and support both.
 
-.. _rst: https://docutils.readthedocs.io/en/sphinx-docs/user/rst/quickstart.html
-.. _sphinx: https://sphinx-doc.org
+For a single pair of header and implementation files that are an
+independent feature, it is usually only required to add them to
+`src/.gitignore``.
+
+For traditional make, if your contributed files or package depend on
+other LAMMPS style files or packages also being installed (e.g. because
+your file is a derived class from the other LAMMPS class), then an
+Install.sh file is also needed to check for those dependencies and
+modifications to src/Depend.sh to trigger the checks.  See other README
+and Install.sh files in other directories as examples.
+
+Similarly for CMake support, changes may need to be made to
+cmake/CMakeLists.txt, some of the files in cmake/presets, and possibly a
+file with specific instructions needs to be added to
+cmake/Modules/Packages/.  Please check out how this is handled for
+existing packages and ask the LAMMPS developers if you need assistance.
+
+
+Citation reminder (suggested)
+-----------------------------
+
+If there is a paper of yours describing your feature (either the
+algorithm/science behind the feature itself, or its initial usage, or
+its implementation in LAMMPS), you can add the citation to the \*.cpp
+source file.  See ``src/DIFFRACTION/compute_saed.cpp`` for an example.
+A BibTeX format citation is stored in a string variable at the top
+of the file and  a single line of code registering this variable is
+added to the constructor of the class.  When your feature is used,
+by default, LAMMPS will print the brief info and the DOI
+in the first line to the screen and the full citation to the log file.
+
+If there is additional functionality (which may have been added later)
+described in a different publication, additional citation descriptions
+may be added for as long as they are only registered when the
+corresponding keyword activating this functionality is used.  With these
+options it is possible to have LAMMPS output a specific citation
+reminder whenever a user invokes your feature from their input script.
+Please note that you should *only* use this for the *most* relevant
+paper for a feature and a publication that you or your group authored.
+E.g. adding a citation in the code for a paper by Nose and Hoover if you
+write a fix that implements their integrator is not the intended usage.
+That latter kind of citation should just be included in the
+documentation page you provide describing your contribution.  If you are
+not sure what the best option would be, please contact the LAMMPS
+developers for advice.
diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index af22901dc3..ed2bb91d46 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -1384,6 +1384,7 @@ inhomogeneities
 inhomogeneous
 init
 initialdelay
+initialisms
 initializations
 InitiatorIDs
 initio
@@ -1690,6 +1691,7 @@ Lett
 Leuven
 Leven
 Lewy
+LF
 LGPL
 lgvdw
 Liang

From bca915740536b39dc9c63a1b4b60ca25ba4bca66 Mon Sep 17 00:00:00 2001
From: Richard Berger 
Date: Thu, 2 Sep 2021 14:10:43 -0400
Subject: [PATCH 222/437] Correct fix bond/swap doc page

---
 doc/src/fix_bond_swap.rst | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst
index 58557e1c0b..0a237bbf78 100644
--- a/doc/src/fix_bond_swap.rst
+++ b/doc/src/fix_bond_swap.rst
@@ -88,18 +88,18 @@ and bond partners B2 of B1 a is performed.  For each pair of A1-A2 and
 B1-B2 bonds to be eligible for swapping, the following 4 criteria must
 be met:
 
-(1) All 4 monomers must be in the fix group.
+1. All 4 monomers must be in the fix group.
 
-(2) All 4 monomers must be owned by the processor (not ghost atoms).
-This insures that another processor does not attempt to swap bonds
-involving the same atoms on the same timestep.  Note that this also
-means that bond pairs which straddle processor boundaries are not
-eligible for swapping on this step.
+2. All 4 monomers must be owned by the processor (not ghost atoms).
+   This insures that another processor does not attempt to swap bonds
+   involving the same atoms on the same timestep.  Note that this also
+   means that bond pairs which straddle processor boundaries are not
+   eligible for swapping on this step.
 
-(3) The distances between 4 pairs of atoms -- (A1,A2), (B1,B2),
-(A1,B2), (B1,A2) -- must all be less than the specified *cutoff*\ .
+3. The distances between 4 pairs of atoms -- (A1,A2), (B1,B2), (A1,B2),
+   (B1,A2) -- must all be less than the specified *cutoff*.
 
-(4) The molecule IDs of A1 and B1 must be the same (see below).
+4. The molecule IDs of A1 and B1 must be the same (see below).
 
 If an eligible B1 partner is found, the energy change due to swapping
 the 2 bonds is computed.  This includes changes in pairwise, bond, and

From d3447008a187c8b408b607ab8ecb5ffeaf9a39ab Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 2 Sep 2021 14:24:57 -0400
Subject: [PATCH 223/437] update contribution guidelines for github

---
 .github/CONTRIBUTING.md | 58 ++++++++++++-----------------------------
 1 file changed, 17 insertions(+), 41 deletions(-)

diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 54cb975723..182dd302b6 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -5,8 +5,9 @@ Thank your for considering to contribute to the LAMMPS software project.
 The following is a set of guidelines as well as explanations of policies and work flows for contributing to the LAMMPS molecular dynamics software project. These guidelines focus on submitting issues or pull requests on the LAMMPS GitHub project.
 
 Thus please also have a look at:
-* [The Section on submitting new features for inclusion in LAMMPS of the Manual](https://lammps.sandia.gov/doc/Modify_contribute.html)
-* [The LAMMPS GitHub Tutorial in the Manual](http://lammps.sandia.gov/doc/Howto_github.html)
+* [The guide for submitting new features in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html)
+* [The guide on programming style and requirement in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html)
+* [The GitHub tutorial in the LAMMPS manual](http://lammps.sandia.gov/doc/Howto_github.html)
 
 ## Table of Contents
 
@@ -26,11 +27,11 @@ __
 
 ## I don't want to read this whole thing I just have a question!
 
-> **Note:** Please do not file an issue to ask a general question about LAMMPS, its features, how to use specific commands, or how perform simulations or analysis in LAMMPS. Instead post your question to either the ['lammps-users' mailing list](https://lammps.sandia.gov/mail.html) or the [LAMMPS Material Science Discourse forum](https://matsci.org/lammps). You do not need to be subscribed to post to the list (but a mailing list subscription avoids having your post delayed until it is approved by a mailing list moderator). Most posts to the mailing list receive a response within less than 24 hours. Before posting to the mailing list, please read the [mailing list guidelines](https://lammps.sandia.gov/guidelines.html). Following those guidelines will help greatly to get a helpful response. Always mention which LAMMPS version you are using. The LAMMPS forum was recently created as part of a larger effort to build a materials science community and have discussions not just about using LAMMPS. Thus the forum may be also used for discussions that would be off-topic for the mailing list. Those will just have to be moved to a more general category.
+> **Note:** Please do not file an issue to ask a general question about LAMMPS, its features, how to use specific commands, or how perform simulations or analysis in LAMMPS. Instead post your question to either the ['lammps-users' mailing list](https://lammps.sandia.gov/mail.html) or the [LAMMPS Material Science Discourse forum](https://matsci.org/lammps). You do not need to be subscribed to post to the list (but a mailing list subscription avoids having your post delayed until it is approved by a mailing list moderator). Most posts to the mailing list receive a response within less than 24 hours. Before posting to the mailing list, please read the [mailing list guidelines](https://lammps.sandia.gov/guidelines.html). Following those guidelines will help greatly to get a helpful response. Always mention which LAMMPS version you are using. The LAMMPS forum was recently created as part of a larger effort to build a materials science community and have discussions not just about using LAMMPS. Thus the forum may be also used for discussions that would be off-topic for the mailing list. Those will just have to be posted to a more general category.
 
 ## How Can I Contribute?
 
-There are several ways how you can actively contribute to the LAMMPS project: you can discuss compiling and using LAMMPS, and solving LAMMPS related problems with other LAMMPS users on the lammps-users mailing list, you can report bugs or suggest enhancements by creating issues on GitHub (or posting them to the lammps-users mailing list or posting in the LAMMPS Materials Science Discourse forum), and you can contribute by submitting pull requests on GitHub or e-mail your code
+There are several ways how you can actively contribute to the LAMMPS project: you can discuss compiling and using LAMMPS, and solving LAMMPS related problems with other LAMMPS users on the lammps-users mailing list or the forum, you can report bugs or suggest enhancements by creating issues on GitHub (or posting them to the lammps-users mailing list or posting in the LAMMPS Materials Science Discourse forum), and you can contribute by submitting pull requests on GitHub or e-mail your code
 to one of the [LAMMPS core developers](https://lammps.sandia.gov/authors.html). As you may see from the aforementioned developer page, the LAMMPS software package includes the efforts of a very large number of contributors beyond the principal authors and maintainers.
 
 ### Discussing How To Use LAMMPS
@@ -62,37 +63,12 @@ To be able to submit an issue on GitHub, you have to register for an account (fo
 
 ### Contributing Code
 
-We encourage users to submit new features or modifications for LAMMPS to the core developers so they can be added to the LAMMPS distribution. The preferred way to manage and coordinate this is by submitting a pull request at the LAMMPS project on GitHub. For any larger modifications or programming project, you are encouraged to contact the LAMMPS developers ahead of time, in order to discuss implementation strategies and coding guidelines, that will make it easier to integrate your contribution and result in less work for everybody involved. You are also encouraged to search through the list of open issues on GitHub and submit a new issue for a planned feature, so you would not duplicate the work of others (and possibly get scooped by them) or have your work duplicated by others.
+We encourage users to submit new features or modifications for LAMMPS. Instructions, guidelines, requirements,
+and recommendations are in the following sections of the LAMMPS manual:
+* [The guide for submitting new features in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html)
+* [The guide on programming style and requirement in the LAMMPS manual](https://lammps.sandia.gov/doc/Modify_contribute.html)
+* [The GitHub tutorial in the LAMMPS manual](http://lammps.sandia.gov/doc/Howto_github.html)
 
-How quickly your contribution will be integrated depends largely on how much effort it will cause to integrate and test it, how much it requires changes to the core code base, and of how much interest it is to the larger LAMMPS community. Please see below for a checklist of typical requirements. Once you have prepared everything, see [this tutorial](https://lammps.sandia.gov/doc/Howto_github.html)
- for instructions on how to submit your changes or new files through a GitHub pull request
-
-Here is a checklist of steps you need to follow to submit a single file or user package for our consideration. Following these steps will save both you and us time. See existing files in packages in the source directory for examples. If you are uncertain, please ask on the lammps-users mailing list.
-
-* C++ source code must be compatible with the C++-11 standard. Packages may require a later standard, if justified.
-* All source files you provide must compile with the most current version of LAMMPS with multiple configurations. In particular you need to test compiling LAMMPS from scratch with `-DLAMMPS_BIGBIG` set in addition to the default `-DLAMMPS_SMALLBIG` setting. Your code will need to work correctly in serial and in parallel using MPI.
-* For consistency with the rest of LAMMPS and especially, if you want your contribution(s) to be added to main LAMMPS code or one of its standard packages, it needs to be written in a style compatible with other LAMMPS source files. This means: 2-character indentation per level, no tabs, no trailing whitespace, no lines over 80 characters. I/O is done via the C-style stdio library, style class header files should not import any system headers, STL containers should be avoided in headers, and forward declarations used where possible or needed. All added code should be placed into the LAMMPS_NS namespace or a sub-namespace; global or static variables should be avoided, as they conflict with the modular nature of LAMMPS and the C++ class structure. There MUST NOT be any "using namespace XXX;" statements in headers. In the implementation file (.cpp) system includes should be placed in angular brackets (<>) and for c-library functions the C++ style header files should be included ( instead of , or  instead of ). This all is so the developers can more easily understand, integrate, and maintain your contribution and reduce conflicts with other parts of LAMMPS. This basically means that the code accesses data structures, performs its operations, and is formatted similar to other LAMMPS source files, including the use of the error class for error and warning messages.
-* Source, style name, and documentation file should follow the following naming convention: style names should be lowercase and words separated by a forward slash; for a new fix style 'foo/bar', the class should be named FixFooBar, the name of the source files should be 'fix_foo_bar.h' and 'fix_foo_bar.cpp' and the corresponding documentation should be in a file 'fix_foo_bar.rst'.
-* If you want your contribution to be added as a user-contributed feature, and it is a single file (actually a `.cpp` and `.h` file) it can be rapidly added to the USER-MISC directory. Include the one-line entry to add to the USER-MISC/README file in that directory, along with the 2 source files. You can do this multiple times if you wish to contribute several individual features.
-* If you want your contribution to be added as a user-contribution and it is several related features, it is probably best to make it a user package directory with a name like FOO. In addition to your new files, the directory should contain a README text file. The README should contain your name and contact information and a brief description of what your new package does. If your files depend on other LAMMPS style files also being installed (e.g. because your file is a derived class from the other LAMMPS class), then an Install.sh file is also needed to check for those dependencies. See other README and Install.sh files in other USER directories as examples. Send us a tarball of this FOO directory.
-* Your new source files need to have the LAMMPS copyright, GPL notice, and your name and email address at the top, like other user-contributed LAMMPS source files. They need to create a class that is inside the LAMMPS namespace. If the file is for one of the USER packages, including USER-MISC, then we are not as picky about the coding style (see above). I.e. the files do not need to be in the same stylistic format and syntax as other LAMMPS files, though that would be nice for developers as well as users who try to read your code.
-* You **must** also create or extend a documentation file for each new command or style you are adding to LAMMPS. For simplicity and convenience, the documentation of groups of closely related commands or styles may be combined into a single file. This will be one file for a single-file feature. For a package, it might be several files. These are files in the [reStructuredText](https://docutils.sourceforge.io/rst.html) markup language, that are then converted to HTML and PDF. The tools for this conversion are included in the source distribution, and the translation can be as simple as doing "make html pdf" in the doc folder. Thus the documentation source files must be in the same format and style as other `.rst` files in the lammps/doc/src directory for similar commands and styles; use one or more of them as a starting point. An introduction to reStructuredText can be found at [https://docutils.sourceforge.io/docs/user/rst/quickstart.html](https://docutils.sourceforge.io/docs/user/rst/quickstart.html). The text files can include mathematical expressions and symbol in ".. math::" sections or ":math:" expressions or figures (see doc/JPG for examples), or even additional PDF files with further details (see doc/PDF for examples). The doc page should also include literature citations as appropriate; see the bottom of doc/fix_nh.rst for examples and the earlier part of the same file for how to format the cite itself. The "Restrictions" section of the doc page should indicate that your command is only available if LAMMPS is built with the appropriate USER-MISC or FOO package. See other user package doc files for examples of how to do this. The prerequisite for building the HTML format files are Python 3.x and virtualenv. Please run at least `make html`, `make pdf` and `make spelling` and carefully inspect and proofread the resulting HTML format doc page as well as the output produced to the screen. Make sure that all spelling errors are fixed or the necessary false positives are added to the `doc/utils/sphinx-config/false_positives.txt` file.  For new styles, those usually also need to be added to lists on the respective overview pages. This can be checked for also with `make style_check`.
-* For a new package (or even a single command) you should include one or more example scripts demonstrating its use. These should run in no more than a couple minutes, even on a single processor, and not require large data files as input. See directories under examples/PACKAGES for examples of input scripts other users provided for their packages. These example inputs are also required for validating memory accesses and testing for memory leaks with valgrind
-* For new utility functions or class (i.e. anything that does not depend on a LAMMPS object), new unit tests should be added to the unittest tree.
-* When adding a new LAMMPS style, a .yaml file with a test configuration and reference data should be added for the styles where a suitable tester program already exists (e.g. pair styles, bond styles, etc.).
-* If there is a paper of yours describing your feature (either the algorithm/science behind the feature itself, or its initial usage, or its implementation in LAMMPS), you can add the citation to the .cpp source file. See src/EFF/atom_vec_electron.cpp for an example. A LaTeX citation is stored in a variable at the top of the file and a single line of code that references the variable is added to the constructor of the class. Whenever a user invokes your feature from their input script, this will cause LAMMPS to output the citation to a log.cite file and prompt the user to examine the file. Note that you should only use this for a paper you or your group authored. E.g. adding a cite in the code for a paper by Nose and Hoover if you write a fix that implements their integrator is not the intended usage. That kind of citation should just be in the doc page you provide.
-
-Finally, as a general rule-of-thumb, the more clear and self-explanatory you make your documentation and README files, and the easier you make it for people to get started, e.g. by providing example scripts, the more likely it is that users will try out your new feature.
-
-If the new features/files are broadly useful we may add them as core files to LAMMPS or as part of a standard package. Else we will add them as a user-contributed file or package. Examples of user packages are in src sub-directories that start with USER. The USER-MISC package is simply a collection of (mostly) unrelated single files, which is the simplest way to have your contribution quickly added to the LAMMPS distribution. You can see a list of the both standard and user packages by typing "make package" in the LAMMPS src directory.
-
-Note that by providing us files to release, you are agreeing to make them open-source, i.e. we can release them under the terms of the GPL, used as a license for the rest of LAMMPS. See Section 1.4 for details.
-
-With user packages and files, all we are really providing (aside from the fame and fortune that accompanies having your name in the source code and on the Authors page of the LAMMPS WWW site), is a means for you to distribute your work to the LAMMPS user community, and a mechanism for others to easily try out your new feature. This may help you find bugs or make contact with new collaborators. Note that you are also implicitly agreeing to support your code which means answer questions, fix bugs, and maintain it if LAMMPS changes in some way that breaks it (an unusual event).
-
-To be able to submit an issue on GitHub, you have to register for an account (for GitHub in general). If you do not want to do that, or have other reservations or difficulties to submit a pull request, you can - as an alternative - contact one or more of the core LAMMPS developers and ask if one of them would be interested in manually merging your code into LAMMPS and send them your source code. Since the effort to merge a pull request is a small fraction of the effort of integrating source code manually (which would usually be done by converting the contribution into a pull request), your chances to have your new code included quickly are the best with a pull request.
-
-If you prefer to submit patches or full files, you should first make certain, that your code works correctly with the latest patch-level version of LAMMPS and contains all bug fixes from it. Then create a gzipped tar file of all changed or added files or a corresponding patch file using 'diff -u' or 'diff -c' and compress it with gzip. Please only use gzip compression, as this works well on all platforms.
 
 ## GitHub Workflows
 
@@ -102,17 +78,17 @@ This section briefly summarizes the steps that will happen **after** you have su
 
 After submitting an issue, one or more of the LAMMPS developers will review it and categorize it by assigning labels. Confirmed bug reports will be labeled `bug`; if the bug report also contains a suggestion for how to fix it, it will be labeled `bugfix`; if the issue is a feature request, it will be labeled `enhancement`. Other labels may be attached as well, depending on which parts of the LAMMPS code are affected. If the assessment is, that the issue does not warrant any changes, the `wontfix` label will be applied and if the submission is incorrect or something that should not be submitted as an issue, the `invalid` label will be applied. In both of the last two cases, the issue will then be closed without further action.
 
-For feature requests, what happens next is that developers may comment on the viability or relevance of the request, discuss and make suggestions for how to implement it. If a LAMMPS developer or user is planning to implement the feature, the issue will be assigned to that developer. For developers, that are not yet listed as LAMMPS project collaborators, they will receive an invitation to be added to the LAMMPS project as a collaborator so they can get assigned. If the requested feature or enhancement is implemented, it will usually be submitted as a pull request, which will contain a reference to the issue number. And once the pull request is reviewed and accepted for inclusion into LAMMPS, the issue will be closed. For details on how pull requests are processed, please see below.
+For feature requests, what happens next is that developers may comment on the viability or relevance of the request, discuss and make suggestions for how to implement it. If a LAMMPS developer or user is planning to implement the feature, the issue will be assigned to that developer. For developers, that are not yet listed as LAMMPS project collaborators, they will receive an invitation to be added to the LAMMPS project as a collaborator so they can get assigned. If the requested feature or enhancement is implemented, it will be submitted as a pull request, which will contain a reference to the issue number. And once the pull request is reviewed and accepted for inclusion into LAMMPS, the issue will be closed. For details on how pull requests are processed, please see below. Feature requests may be labeled with `volunteer_needed` if none of the LAMMPS developers has the time and the required knowledge implement the feature.
 
-For bug reports, the next step is that one of the core LAMMPS developers will self-assign to the issue and try to confirm the bug. If confirmed, the `bug` label and potentially other labels are added to classify the issue and its impact to LAMMPS. Before confirming, further questions may be asked or requests for providing additional input files or details about the steps required to reproduce the issue. Any bugfix is likely to be submitted as a pull request (more about that below) and since most bugs require only local changes, the bugfix may be included in a pull request specifically set up to collect such local bugfixes or small enhancements. Once the bugfix is included in the master branch, the issue will be closed.
+For bug reports, the next step is that one of the core LAMMPS developers will self-assign to the issue and try to confirm the bug. If confirmed, the `bug` label and potentially other labels are added to classify the issue and its impact to LAMMPS. Otherwise the `unconfirmed` label will be applied and some comment about what was tried to confirm the bug added. Before confirming, further questions may be asked or requests for providing additional input files or details about the steps required to reproduce the issue. Any bugfix will be submitted as a pull request (more about that below) and since most bugs require only local changes, the bugfix may be included in a pull request specifically set up to collect such local bugfixes or small enhancements. Once the bugfix is included in the master branch, the issue will be closed.
 
 ### Pull Requests
 
-For submitting pull requests, there is a [detailed tutorial](https://lammps.sandia.gov/doc/Howto_github.html) in the LAMMPS manual. Thus only a brief breakdown of the steps is presented here. Please note, that the LAMMPS developers are still reviewing and trying to improve the process. If you are unsure about something, do not hesitate to post a question on the lammps-users mailing list or contact one fo the core LAMMPS developers.
-Immediately after the submission, the LAMMPS continuing integration server at ci.lammps.org will download your submitted branch and perform a simple compilation test, i.e. will test whether your submitted code can be compiled under various conditions. It will also do a check on whether your included documentation translates cleanly. Whether these tests are successful or fail will be recorded. If a test fails, please inspect the corresponding output on the CI server and take the necessary steps, if needed, so that the code can compile cleanly again. The test will be re-run each the pull request is updated with a push to the remote branch on GitHub.
-Next a LAMMPS core developer will self-assign and do an overall technical assessment of the submission. If you are not yet registered as a LAMMPS collaborator, you will receive an invitation for that. As part of the assessment, the pull request will be categorized with labels. There are two special labels: `needs_work` (indicates that work from the submitter of the pull request is needed) and `work_in_progress` (indicates, that the assigned LAMMPS developer will make changes, if not done by the contributor who made the submit). 
+Pull requests are the **only** way that changes get made to the LAMMPS distribution.  So also the LAMMPS core developers will submit pull requests for their own changes and discuss them on GitHub.  Thus if you submit a pull request it will be treated in a similar fashion. When you submit a pull request you may opt to submit a "Draft" pull request.  That means your changes are visible and will be subject to testing, but reviewers will not be (auto-)assigned and comments will take into account that this is not complete. On the other hand, this is a perfect way to ask the LAMMPS developers for comments on non-obvious changes and get feedback and possible suggestions for improvements or recommendations about what to avoid.
+Immediately after the submission, the LAMMPS continuing integration server at ci.lammps.org will download your submitted branch and perform a number of tests: it will tests whether it compiles cleanly under various conditions, it will also do a check on whether your included documentation translates cleanly and run some unit tests and other checks. Whether these tests are successful or fail will be recorded.  If a test fails, please inspect the corresponding output on the CI server and take the necessary steps, if needed, so that the code can compile cleanly again.  The test will be re-run each time the pull request is updated with a push to the remote branch on GitHub.  If you are unsure about what you need to change, ask a question in the discussion area of the pull request.
+Next a LAMMPS core developer will self-assign and do an overall technical assessment of the submission.  If you submitted a draft pull request, this will not happen unless you mark it "ready for review".  If you are not yet invited as a LAMMPS collaborator, and your contribution seems significant, you may also receive an invitation for collaboration on the LAMMPS repository.  As part of the assessment, the pull request will be categorized with labels. There are two special labels: `needs_work` (indicates that work from the submitter of the pull request is needed) and `work_in_progress` (indicates, that the assigned LAMMPS developer will make changes, if not done by the contributor who made the submit). 
 You may also receive comments and suggestions on the overall submission or specific details and on occasion specific requests for changes as part of the review. If permitted, also additional changes may be pushed into your pull request branch or a pull request may be filed in your LAMMPS fork on GitHub to include those changes.
 The LAMMPS developer may then decide to assign the pull request to another developer (e.g. when that developer is more knowledgeable about the submitted feature or enhancement or has written the modified code). It may also happen, that additional developers are requested to provide a review and approve the changes. For submissions, that may change the general behavior of LAMMPS, or where a possibility of unwanted side effects exists, additional tests may be requested by the assigned developer.
-If the assigned developer is satisfied and considers the submission ready for inclusion into LAMMPS, the pull request will receive approvals and be merged into the master branch by one of the core LAMMPS developers. After the pull request is merged, you may delete the feature branch used for the pull request in your personal LAMMPS fork.
-Since the learning curve for git is quite steep for efficiently managing remote repositories, local and remote branches, pull requests and more, do not hesitate to ask questions, if you are not sure about how to do certain steps that are asked of you. Even if the changes asked of you do not make sense to you, they may be important for the LAMMPS developers. Please also note, that these all are guidelines and nothing set in stone. So depending on the nature of the contribution, the workflow may be adjusted.
+If the assigned developer is satisfied and considers the submission ready for inclusion into LAMMPS, the pull request will receive approvals and be merged into the master branch by one of the core LAMMPS developers. After the pull request is merged, you may delete the feature branch used for the pull request in your personal LAMMPS fork.  The minimum requirement to merge a pull request is that all automated tests have to pass and at least one LAMMPS developer has approved integrating the submitted code. Since the approver will not be the person merging a pull request, you will have at least two LAMMPS developers that looked at your contribution.
+Since the learning curve for git is quite steep for efficiently managing remote repositories, local and remote branches, pull requests and more, do not hesitate to ask questions, if you are not sure about how to do certain steps that are asked of you. Even if the changes asked of you do not make sense to you, they may be important for the LAMMPS developers. Please also note, that these all are guidelines and nothing set in stone. So depending on the nature of the contribution, the work flow may be adjusted.
 

From 58516925271405833089caa1e81d6fff79d4d12a Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 2 Sep 2021 14:25:10 -0400
Subject: [PATCH 224/437] mention when testing may be added

---
 doc/src/Modify_style.rst | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst
index b92f954803..914c688eba 100644
--- a/doc/src/Modify_style.rst
+++ b/doc/src/Modify_style.rst
@@ -410,3 +410,17 @@ That latter kind of citation should just be included in the
 documentation page you provide describing your contribution.  If you are
 not sure what the best option would be, please contact the LAMMPS
 developers for advice.
+
+
+Testing (optional)
+------------------
+
+If your contribution contains new utility functions or a supporting class
+(i.e. anything that does not depend on a LAMMPS object), new unit tests
+should be added to a suitable folder in the ``unittest`` tree.
+When adding a new LAMMPS style computing forces or selected fixes,
+a ``.yaml`` file with a test configuration and reference data should be
+added for the styles where a suitable tester program already exists
+(e.g. pair styles, bond styles, etc.). Please see
+:ref:`this section in the manual `_ for more information on
+how to enable, run, and expand testing.

From 0d765a824e50d1ea72229846cba5f9d1b2013aa9 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 2 Sep 2021 15:03:19 -0400
Subject: [PATCH 225/437] integrate file with description of include file
 conventions

---
 doc/include-file-conventions.md | 128 --------------------------------
 doc/src/Build_development.rst   |   3 +-
 doc/src/Build_manual.rst        |   1 -
 doc/src/Modify_style.rst        |  23 ++++--
 4 files changed, 18 insertions(+), 137 deletions(-)
 delete mode 100644 doc/include-file-conventions.md

diff --git a/doc/include-file-conventions.md b/doc/include-file-conventions.md
deleted file mode 100644
index 454964f0a9..0000000000
--- a/doc/include-file-conventions.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Outline of include file conventions in LAMMPS
-
-This purpose of this document is to provide a point of reference
-for LAMMPS developers and contributors as to what include files
-and definitions to put where into LAMMPS source.
-Last change 2020-08-31
-
-## Table of Contents
-
-  * [Motivation](#motivation)
-  * [Rules](#rules)
-  * [Tools](#tools)
-  * [Legacy Code](#legacy-code)
-
-## Motivation
-
-The conventions outlined in this document are supposed to help make
-maintenance of the LAMMPS software easier.  By trying to achieve
-consistency across files contributed by different developers, it will
-become easier for the code maintainers to modify and adjust files and,
-overall, the chance for errors or portability issues will be reduced.
-The rules employed are supposed to minimize naming conflicts and
-simplify dependencies between files and thus speed up compilation. They
-may, as well, make otherwise hidden dependencies visible.
-
-## Rules
-
-Below are the various rules that are applied.  Not all are enforced
-strictly and automatically.  If there are no significant side effects,
-exceptions may be possible for cases where a full compliance to the
-rules may require a large effort compared to the benefit.
-
-### Core Files Versus Package Files
-
-All rules listed below are most strictly observed for core LAMMPS files,
-which are the files that are not part of a package, and the files of the
-packages MOLECULE, MANYBODY, KSPACE, and RIGID.  On the other end of
-the spectrum are USER packages and legacy packages that predate these
-rules and thus may not be fully compliant.  Also, new contributions
-will be checked more closely, while existing code will be incrementally
-adapted to the rules as time and required effort permits.
-
-### System Versus Local Header Files
-
-All system- or library-provided include files are included with angular
-brackets (examples: `#include ` or `#include `) while
-include files provided with LAMMPS are included with double quotes
-(examples: `#include "pointers.h"` or `#include "compute_temp.h"`).
-
-For headers declaring functions of the C-library, the corresponding
-C++ versions should be included (examples: `#include ` or
-`#include ` instead of `#include ` or
-`#include` ).
-
-### C++ Standard Compliance
-
-LAMMPS core files use standard conforming C++ compatible with the
-C++11 standard, unless explicitly noted.  Also, LAMMPS uses the C-style
-stdio library for I/O instead of iostreams.  Since using both at the
-same time can cause problems, iostreams should be avoided where possible.
-
-### Lean Header Files
-
-Header files will typically contain the definition of a (single) class.
-These header files should have as few include statements as possible.
-This is particularly important for classes that implement a "style" and
-thus use a macro of the kind `SomeStyle(some/name,SomeName)`. These will
-all be included in the auto-generated `"some_style.h"` files which
-results in a high potential for direct or indirect symbol name clashes.
-
-In the ideal case, the header would only include one file defining the
-parent class. That would typically be either `#include "pointers.h"` for
-the `Pointers` class, or a header of a class derived from it like
-`#include "pair.h"` for the `Pair` class and so on.  References to other
-classes inside the class should be make through pointers, for which forward
-declarations (inside the `LAMMPS_NS` or the new class' namespace) can
-be employed.  The full definition will then be included into the corresponding
-implementation file.  In the given example from above, the header file
-would be called `some_name.h` and the implementation `some_name.cpp` (all
-lower case with underscores, while the class itself would be in camel case
-and no underscores `SomeName`, and the style name with lower case names separated by
-a forward slash).
-
-### Implementation Files
-
-In the implementation files (typically, those would have the same base name
-as the corresponding header with a .cpp extension instead of .h) include
-statements should follow the "include what you use" principle.
-
-### Order of Include Statements
-
-Include files should be included in this order:
-* the header matching the implementation (`some_class.h` for file `some_class.cpp`)
-* mpi.h  (only if needed)
-* LAMMPS local headers (preferably in alphabetical order)
-* system and library headers (anything that is using angular brackets; preferably in alphabetical order)
-* conditional include statements (i.e. anything bracketed with ifdefs)
-
-### Special Cases and Exceptions
-
-#### pointers.h
-
-The `pointer.h` header file also includes (in this order) `lmptype.h`,
-`mpi.h`, `cstddef`, `cstdio`, `string`, `utils.h`, and `fmt/format.h`
-and through `lmptype.h` indirectly also `climits`, `cstdlib`, `cinttypes`.
-This means any header including `pointers.h` can assume that `FILE`,
-`NULL`, `INT_MAX` are defined, and the may freely use the std::string
-for arguments. Corresponding implementation files do not need to include
-those headers.
-
-## Tools
-
-The [Include What You Use tool](https://include-what-you-use.org/)
-can be used to provide supporting information about compliance with
-the rules listed here.  Through setting `-DENABLE_IWYU=on` when running
-CMake, a custom build target is added that will enable recording
-the compilation commands and then run the `iwyu_tool` using the
-recorded compilation commands information when typing `make iwyu`.
-
-## Legacy Code
-
-A lot of code predates the application of the rules in this document
-and the rules themselves are a moving target.  So there are going to be
-significant chunks of code that do not fully comply.  This applies
-for example to the REAXFF, or the ATC package.  The LAMMPS
-developers are dedicated to make an effort to improve the compliance
-and welcome volunteers wanting to help with the process.
-
diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst
index b93e2857fd..581a8dba99 100644
--- a/doc/src/Build_development.rst
+++ b/doc/src/Build_development.rst
@@ -56,8 +56,7 @@ Report missing and unneeded '#include' statements (CMake only)
 --------------------------------------------------------------
 
 The conventions for how and when to use and order include statements in
-LAMMPS are `documented in a separate file `_
-(also included in the source code distribution).  To assist with following
+LAMMPS are documented in :doc:`Modify_style`.  To assist with following
 these conventions one can use the `Include What You Use tool `_.
 This is still under development and for large and complex projects like LAMMPS
 there are some false positives, so suggested changes need to be verified manually.
diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst
index d1c8910b65..d12c6dc498 100644
--- a/doc/src/Build_manual.rst
+++ b/doc/src/Build_manual.rst
@@ -22,7 +22,6 @@ files. Here is a list with descriptions:
    .gitignore       # list of files and folders to be ignored by git
    doxygen-warn.log # logfile with warnings from running doxygen
    github-development-workflow.md   # notes on the LAMMPS development workflow
-   include-file-conventions.md      # notes on LAMMPS' include file conventions
 
 If you downloaded LAMMPS as a tarball from `the LAMMPS website `_,
 the html folder and the PDF files should be included.
diff --git a/doc/src/Modify_style.rst b/doc/src/Modify_style.rst
index 914c688eba..a373987aea 100644
--- a/doc/src/Modify_style.rst
+++ b/doc/src/Modify_style.rst
@@ -277,6 +277,14 @@ how can be adapted to these conventions you may compare the REAXFF
 package with the what it looked like when it was called USER-REAXC.  If
 you are uncertain, please ask.
 
+- system headers or from installed libraries are include with angular
+  brackets (example: ``#include ``), while local include file
+  use double quotes (example: ``#include "atom.h"``).
+
+- when including system header files from the C library use the
+    C++-style names (```` or ````) instead of the
+    C-style names (```` or ````)
+
 - the order of ``#include`` statements in a file ``some_name.cpp`` that
   implements a class ``SomeName`` defined in a header file
   ``some_name.h`` should be as follows:
@@ -291,10 +299,6 @@ you are uncertain, please ask.
 
   - ``using namespace LAMMPS_NS`` or other namespace imports.
 
-- when including system header files from the C library use the
-    C++-style names (```` or ````) instead of the
-    C-style names (```` or ````)
-
 - I/O is done via the C-style stdio library and **not** iostreams
   (and mixing of stdio and iostreams is generally discouraged
 
@@ -305,7 +309,14 @@ you are uncertain, please ask.
 - header files should only include the absolute minimum number of
   include files and **must not** contain any ``using`` statements;
   rather the include statements should be put into the corresponding
-  implementation files
+  implementation files. For implementation files, the
+  "include-what-you-use" principle should be employed.  However, when
+  including the ``pointers.h`` header (or one of the base classes
+  derived from it) certain headers will be included and thus need to be
+  specified. These are: `mpi.h`, `cstddef`, `cstdio`, `cstdlib`,
+  `string`, `utils.h`, `fmt/format.h`, `climits`, `cinttypes`. This also
+  means any header can assume that `FILE`, `NULL`, and `INT_MAX` are
+  defined.
 
 - header files that define a new LAMMPS style (i.e. that have a
   ``SomeStyle(some/name,SomeName);`` macro in them) should only use the
@@ -422,5 +433,5 @@ When adding a new LAMMPS style computing forces or selected fixes,
 a ``.yaml`` file with a test configuration and reference data should be
 added for the styles where a suitable tester program already exists
 (e.g. pair styles, bond styles, etc.). Please see
-:ref:`this section in the manual `_ for more information on
+:ref:`this section in the manual ` for more information on
 how to enable, run, and expand testing.

From 6cf2aa4fbbc22a5c4180eea538040051f8b066ff Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Thu, 2 Sep 2021 16:26:36 -0400
Subject: [PATCH 226/437] update github workflow doc

---
 doc/github-development-workflow.md | 137 +++++++++--------------------
 1 file changed, 40 insertions(+), 97 deletions(-)

diff --git a/doc/github-development-workflow.md b/doc/github-development-workflow.md
index c34a67dfcf..c0e35daf3f 100644
--- a/doc/github-development-workflow.md
+++ b/doc/github-development-workflow.md
@@ -6,7 +6,7 @@ choices the LAMMPS developers have agreed on. Git and GitHub provide the
 tools, but do not set policies, so it is up to the developers to come to
 an agreement as to how to define and interpret policies. This document
 is likely to change as our experiences and needs change and we try to
-adapt accordingly. Last change 2018-12-19.
+adapt accordingly. Last change 2021-09-02.
 
 ## Table of Contents
 
@@ -23,10 +23,10 @@ adapt accordingly. Last change 2018-12-19.
 
 In the interest of consistency, ONLY ONE of the core LAMMPS developers
 should doing the merging itself.  This is currently
-[@akohlmey](https://github.com/akohlmey) (Axel Kohlmeyer).
-If this assignment needs to be changed, it shall be done right after a
-stable release.  If the currently assigned developer cannot merge outstanding pull
-requests in a timely manner, or in other extenuating circumstances,
+[@akohlmey](https://github.com/akohlmey) (Axel Kohlmeyer).  If this
+assignment needs to be changed, it shall be done right after a stable
+release.  If the currently assigned developer cannot merge outstanding
+pull requests in a timely manner, or in other extenuating circumstances,
 other core LAMMPS developers with merge rights can merge pull requests,
 when necessary.
 
@@ -55,13 +55,14 @@ the required changes or ask the submitter of the pull request to implement
 them.  Even though, all LAMMPS developers may have write access to pull
 requests (if enabled by the submitter, which is the default), only the
 submitter or the assignee of a pull request may do so.  During this
-period the `work_in_progress` label shall be applied to the pull
+period the `work_in_progress` label may be applied to the pull
 request.  The assignee gets to decide what happens to the pull request
 next, e.g. whether it should be assigned to a different developer for
 additional checks and changes, or is recommended to be merged.  Removing
 the `work_in_progress` label and assigning the pull request to the
 developer tasked with merging signals that a pull request is ready to be
-merged.
+merged. In addition, a `ready_for_merge` label may also be assigned
+to signal urgency to merge this pull request quickly.
 
 ### Pull Request Reviews
 
@@ -97,108 +98,50 @@ rationale behind choices made.  Exceptions to this policy are technical
 discussions, that are centered on tools or policies themselves
 (git, GitHub, c++) rather than on the content of the pull request.
 
-### Checklist for Pull Requests
-
-Here are some items to check:
-  * source and text files should not have CR/LF line endings (use dos2unix to remove)
-  * every new command or style should have documentation. The names of
-  source files (c++ and manual) should follow the name of the style.
-  (example: `src/fix_nve.cpp`, `src/fix_nve.h` for `fix nve` command,
-  implementing the class `FixNVE`, documented in `doc/src/fix_nve.rst`)
-  * all new style names should be lower case, the must be no dashes,
-  blanks, or underscores separating words, only forward slashes.
-  * new style docs should be added to the "overview" files in
-  `doc/src/Commands_*.rst`, `doc/src/{fixes,computes,pairs,bonds,...}.rst`
-  * check whether manual cleanly translates with `make html` and `make pdf`
-  * if documentation is (still) provided as a .txt file, convert to .rst
-  and remove the .txt file. For files in doc/txt the conversion is automatic.
-  * remove all .txt files in `doc/txt` that are out of sync with their .rst counterparts in `doc/src`
-  * check spelling of manual with `make spelling` in doc folder
-  * check style tables and command lists with `make style_check`
-  * new source files in packages should be added to `src/.gitignore`
-  * removed or renamed files in packages should be added to `src/Purge.list`
-  * C++ source files should use C++ style include files for accessing
-  C-library APIs, e.g. `#include ` instead of `#include `.
-  And they should use angular brackets instead of double quotes. Full list:
-    * assert.h -> cassert
-    * ctype.h -> cctype
-    * errno.h -> cerrno
-    * float.h -> cfloat
-    * limits.h -> climits
-    * math.h -> cmath
-    * complex.h -> complex
-    * setjmp.h -> csetjmp
-    * signal.h -> csignal
-    * stddef.h -> cstddef
-    * stdint.h -> cstdint
-    * stdio.h -> cstdio
-    * stdlib.h -> cstdlib
-    * string.h -> cstring
-    * time.h -> ctime
-    * Do NOT replace (as they are C++-11): `inttypes.h` and `stdint.h`.
-  * Code must follow the C++-11 standard. C++98-only is no longer accepted
-  * Code should use `nullptr` instead of `NULL` where applicable.
-  in individual special purpose packages
-  * indentation is 2 spaces per level
-  * there should be NO tabs and no trailing whitespace (review the "checkstyle" test on pull requests)
-  * header files, especially of new styles, should not include any
-  other headers, except the header with the base class or cstdio.
-  Forward declarations should be used instead when possible.
-  * iostreams should be avoided. LAMMPS uses stdio from the C-library.
-  * use of STL in headers and class definitions should be avoided.
-  exception is , but it won't need to be explicitly included
-  since pointers.h already includes it. so std::string can be used directly.
-  * there MUST NOT be any "using namespace XXX;" statements in headers.
-  * static class members should be avoided at all cost.
-  * anything storing atom IDs should be using `tagint` and not `int`.
-  This can be flagged by the compiler only for pointers and only when
-  compiling LAMMPS with `-DLAMMPS_BIGBIG`.
-  * when including both `lmptype.h` (and using defines or macros from it)
-  and `mpi.h`, `lmptype.h` must be included first.
-  * see https://github.com/lammps/lammps/blob/master/doc/include-file-conventions.md
-  for general include file conventions and best practices
-  * when pair styles are added, check if settings for flags like
-  `single_enable`, `writedata`, `reinitflag`, `manybody_flag`
-  and others are correctly set and supported.
-
 ## GitHub Issues
 
 The GitHub issue tracker is the location where the LAMMPS developers
 and other contributors or LAMMPS users can report issues or bugs with
-the LAMMPS code or request new features to be added. Feature requests
-are usually indicated by a `[Feature Request]` marker in the subject.
-Issues are assigned to a person, if this person is working on this
-feature or working to resolve an issue. Issues that have nobody working
-on them at the moment, have the label `volunteer needed` attached.
+the LAMMPS code or request new features to be added. Bug reports have
+a `[Bug]` marker in the subject line; suggestions for changes or
+adding new functionality are indicated by a `[Feature Request]`
+marker in the subject. This is automatically done when using the
+corresponding template for submitting an issue.  Issues may be assigned
+to one or more developers, if they are working on this feature or
+working to resolve an issue.  Issues that have nobody working
+on them at the moment or in the near future, have the label
+`volunteer needed` attached.
 
 When an issue, say `#125` is resolved by a specific pull request,
 the comment for the pull request shall contain the text `closes #125`
 or `fixes #125`, so that the issue is automatically deleted when
-the pull request is merged.
+the pull request is merged.  The template for pull requests includes
+a header where connections between pull requests and issues can be listed
+and thus were this comment should be placed.
 
 ## Milestones and Release Planning
 
 LAMMPS uses a continuous release development model with incremental
 changes, i.e. significant effort is made - including automated pre-merge
-testing - that the code in the branch "master" does not get broken.
-More extensive testing (including regression testing) is performed after
-code is merged to the "master" branch. There are patch releases of
-LAMMPS every 1-3 weeks at a point, when the LAMMPS developers feel, that
-a sufficient amount of changes have happened, and the post-merge testing
-has been successful. These patch releases are marked with a
-`patch_` tag and the "unstable" branch follows only these
-versions (and thus is always supposed to be of production quality,
-unlike "master", which may be temporary broken, in the case of larger
-change sets or unexpected incompatibilities or side effects.
+testing - that the code in the branch "master" does not get easily
+broken.  These tests are run after every update to a pull request.  More
+extensive and time consuming tests (including regression testing) are
+performed after code is merged to the "master" branch. There are patch
+releases of LAMMPS every 3-5 weeks at a point, when the LAMMPS
+developers feel, that a sufficient amount of changes have happened, and
+the post-merge testing has been successful. These patch releases are
+marked with a `patch_` tag and the "unstable" branch
+follows only these versions (and thus is always supposed to be of
+production quality, unlike "master", which may be temporary broken, in
+the case of larger change sets or unexpected incompatibilities or side
+effects.
 
-About 3-4 times each year, there are going to be "stable" releases
-of LAMMPS.  These have seen additional, manual testing and review of
+About 1-2 times each year, there are going to be "stable" releases of
+LAMMPS.  These have seen additional, manual testing and review of
 results from testing with instrumented code and static code analysis.
-Also, in the last 2-3 patch releases before a stable release are
-"release candidate" versions which only contain bugfixes and
-documentation updates.  For release planning and the information of
-code contributors, issues and pull requests being actively worked on
-are assigned a "milestone", which corresponds to the next stable
-release or the stable release after that, with a tentative release
-date.
-
+Also, the last 1-3 patch releases before a stable release are "release
+candidate" versions which only contain bugfixes and documentation
+updates.  For release planning and the information of code contributors,
+issues and pull requests being actively worked on are assigned a
+"milestone", which corresponds to the next stable release or the stable
+release after that, with a tentative release date.

From f768b701ee76c75bbf5adf9e5ff18f3b00885662 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 3 Sep 2021 11:21:42 -0400
Subject: [PATCH 227/437] add -skiprun command line flag that sets a timeout so
 that run and minimizations loops are skipped

---
 doc/src/Commands_input.rst | 86 +++++++++++++++++++++++---------------
 doc/src/Run_options.rst    | 17 +++++++-
 src/lammps.cpp             | 49 ++++++++++------------
 src/lammps.h               | 68 +++++++++++++++---------------
 4 files changed, 126 insertions(+), 94 deletions(-)

diff --git a/doc/src/Commands_input.rst b/doc/src/Commands_input.rst
index 3313474686..595b8ffa2c 100644
--- a/doc/src/Commands_input.rst
+++ b/doc/src/Commands_input.rst
@@ -1,55 +1,75 @@
 LAMMPS input scripts
 ====================
 
-LAMMPS executes by reading commands from a input script (text file),
-one line at a time.  When the input script ends, LAMMPS exits.  Each
-command causes LAMMPS to take some action.  It may set an internal
-variable, read in a file, or run a simulation.  Most commands have
-default settings, which means you only need to use the command if you
-wish to change the default.
+LAMMPS executes calculations by reading commands from a input script (text file), one
+line at a time.  When the input script ends, LAMMPS exits.  This is different
+from programs that read and process the entire input before starting a calculation.
+
+Each command causes LAMMPS to take some immediate action without regard
+for any commands that may be processed later. Commands may set an
+internal variable, read in a file, or run a simulation.  These actions
+can be grouped into three categories:
+
+a) commands that change a global setting (examples: timestep, newton,
+   echo, log, thermo, restart),
+b) commands that add, modify, remove, or replace "styles" that are
+   executed during a "run" (examples: pair_style, fix, compute, dump,
+   thermo_style, pair_modify), and
+c) commands that execute a "run" or perform some other computation or
+   operation (examples: print, run, minimize, temper, write_dump, rerun,
+   read_data, read_restart)
+
+Commands in category a) have default settings, which means you only
+need to use the command if you wish to change the defaults.
 
 In many cases, the ordering of commands in an input script is not
-important.  However the following rules apply:
+important, but can have consequences when the global state is changed
+between commands in the c) category. The following rules apply:
 
 (1) LAMMPS does not read your entire input script and then perform a
-simulation with all the settings.  Rather, the input script is read
-one line at a time and each command takes effect when it is read.
-Thus this sequence of commands:
+    simulation with all the settings.  Rather, the input script is read
+    one line at a time and each command takes effect when it is read.
+    Thus this sequence of commands:
 
-.. code-block:: LAMMPS
+    .. code-block:: LAMMPS
 
-   timestep 0.5
-   run      100
-   run      100
+       timestep 0.5
+       run      100
+       run      100
 
-does something different than this sequence:
+    does something different than this sequence:
 
-.. code-block:: LAMMPS
+    .. code-block:: LAMMPS
 
-   run      100
-   timestep 0.5
-   run      100
+       run      100
+       timestep 0.5
+       run      100
 
-In the first case, the specified timestep (0.5 fs) is used for two
-simulations of 100 timesteps each.  In the second case, the default
-timestep (1.0 fs) is used for the first 100 step simulation and a 0.5 fs
-timestep is used for the second one.
+    In the first case, the specified timestep (0.5 fs) is used for two
+    simulations of 100 timesteps each.  In the second case, the default
+    timestep (1.0 fs) is used for the first 100 step simulation and a
+    0.5 fs timestep is used for the second one.
 
 (2) Some commands are only valid when they follow other commands.  For
-example you cannot set the temperature of a group of atoms until atoms
-have been defined and a group command is used to define which atoms
-belong to the group.
+    example you cannot set the temperature of a group of atoms until
+    atoms have been defined and a group command is used to define which
+    atoms belong to the group.
 
 (3) Sometimes command B will use values that can be set by command A.
-This means command A must precede command B in the input script if it
-is to have the desired effect.  For example, the
-:doc:`read_data ` command initializes the system by setting
-up the simulation box and assigning atoms to processors.  If default
-values are not desired, the :doc:`processors ` and
-:doc:`boundary ` commands need to be used before read_data to
-tell LAMMPS how to map processors to the simulation box.
+    This means command A must precede command B in the input script if
+    it is to have the desired effect.  For example, the :doc:`read_data
+    ` command initializes the system by setting up the
+    simulation box and assigning atoms to processors.  If default values
+    are not desired, the :doc:`processors ` and
+    :doc:`boundary ` commands need to be used before read_data
+    to tell LAMMPS how to map processors to the simulation box.
 
 Many input script errors are detected by LAMMPS and an ERROR or
 WARNING message is printed.  The :doc:`Errors ` page gives
 more information on what errors mean.  The documentation for each
 command lists restrictions on how the command can be used.
+
+You can use the :ref:`-skiprun ` command line flag
+to have LAMMPS skip the execution of any "run", "minimize", or similar
+commands to check the entire input for correct syntax to avoid crashes
+on typos or syntax errors in long runs.
diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst
index c4004c87e0..b07c9b2529 100644
--- a/doc/src/Run_options.rst
+++ b/doc/src/Run_options.rst
@@ -2,7 +2,7 @@ Command-line options
 ====================
 
 At run time, LAMMPS recognizes several optional command-line switches
-which may be used in any order.  Either the full word or a one-or-two
+which may be used in any order.  Either the full word or a one or two
 letter abbreviation can be used:
 
 * :ref:`-e or -echo `
@@ -22,6 +22,7 @@ letter abbreviation can be used:
 * :ref:`-r2data or -restart2data `
 * :ref:`-r2dump or -restart2dump `
 * :ref:`-sc or -screen `
+* :ref:`-sr or skiprun `
 * :ref:`-sf or -suffix `
 * :ref:`-v or -var `
 
@@ -532,6 +533,20 @@ partition screen files file.N.
 
 ----------
 
+.. _skiprun:
+
+**-skiprun**
+
+Insert the command :doc:`timer timerout 0 every 1 ` at the
+beginning of an input file or after a :doc:`clear ` command.
+This has the effect that the entire LAMMPS input script is processed
+without executing actual runs or minimizations (their main loops are
+skipped).  This can be helpful and convenient to test input scripts for
+long running calculations to avoid having them crash after a long time
+due to a typo or syntax error.
+
+----------
+
 .. _suffix:
 
 **-suffix style args**
diff --git a/src/lammps.cpp b/src/lammps.cpp
index 270b3c0584..e3e8f4c181 100644
--- a/src/lammps.cpp
+++ b/src/lammps.cpp
@@ -126,6 +126,8 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
   cslib = nullptr;
   cscomm = 0;
 
+  skipflag = 0;
+
   screen = nullptr;
   logfile = nullptr;
   infile = nullptr;
@@ -391,6 +393,11 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
       screenflag = iarg + 1;
       iarg += 2;
 
+    } else if (strcmp(arg[iarg],"-skiprun") == 0 ||
+               strcmp(arg[iarg],"-sr") == 0) {
+      skipflag = 1;
+      ++iarg;
+
     } else if (strcmp(arg[iarg],"-suffix") == 0 ||
                strcmp(arg[iarg],"-sf") == 0) {
       if (iarg+2 > narg)
@@ -462,9 +469,8 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
     else {
       universe->uscreen = fopen(arg[screenflag],"w");
       if (universe->uscreen == nullptr)
-        error->universe_one(FLERR,fmt::format("Cannot open universe screen "
-                                              "file {}: {}",arg[screenflag],
-                                              utils::getsyserror()));
+        error->universe_one(FLERR,fmt::format("Cannot open universe screen file {}: {}",
+                                              arg[screenflag],utils::getsyserror()));
     }
     if (logflag == 0) {
       if (helpflag == 0) {
@@ -478,9 +484,8 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
     else {
       universe->ulogfile = fopen(arg[logflag],"w");
       if (universe->ulogfile == nullptr)
-        error->universe_one(FLERR,fmt::format("Cannot open universe log "
-                                              "file {}: {}",arg[logflag],
-                                              utils::getsyserror()));
+        error->universe_one(FLERR,fmt::format("Cannot open universe log file {}: {}",
+                                              arg[logflag],utils::getsyserror()));
     }
   }
 
@@ -505,8 +510,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
       else if (strcmp(arg[inflag], "none") == 0) infile = stdin;
       else infile = fopen(arg[inflag],"r");
       if (infile == nullptr)
-        error->one(FLERR,"Cannot open input script {}: {}",
-                                     arg[inflag], utils::getsyserror());
+        error->one(FLERR,"Cannot open input script {}: {}",arg[inflag], utils::getsyserror());
     }
 
     if ((universe->me == 0) && !helpflag)
@@ -530,16 +534,14 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
           str = fmt::format("screen.{}",universe->iworld);
           screen = fopen(str.c_str(),"w");
           if (screen == nullptr)
-            error->one(FLERR,"Cannot open screen file {}: {}",
-                                         str,utils::getsyserror());
+            error->one(FLERR,"Cannot open screen file {}: {}",str,utils::getsyserror());
         } else if (strcmp(arg[screenflag],"none") == 0) {
           screen = nullptr;
         } else {
           str = fmt::format("{}.{}",arg[screenflag],universe->iworld);
           screen = fopen(str.c_str(),"w");
           if (screen == nullptr)
-            error->one(FLERR,"Cannot open screen file {}: {}",
-                                         arg[screenflag],utils::getsyserror());
+            error->one(FLERR,"Cannot open screen file {}: {}",arg[screenflag],utils::getsyserror());
         }
       } else if (strcmp(arg[partscreenflag],"none") == 0) {
         screen = nullptr;
@@ -547,8 +549,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
         str = fmt::format("{}.{}",arg[partscreenflag],universe->iworld);
         screen = fopen(str.c_str(),"w");
         if (screen == nullptr)
-          error->one(FLERR,"Cannot open screen file {}: {}",
-                                       str,utils::getsyserror());
+          error->one(FLERR,"Cannot open screen file {}: {}",str,utils::getsyserror());
       }
 
       if (partlogflag == 0) {
@@ -556,16 +557,14 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
           str = fmt::format("log.lammps.{}",universe->iworld);
           logfile = fopen(str.c_str(),"w");
           if (logfile == nullptr)
-            error->one(FLERR,"Cannot open logfile {}: {}",
-                                         str, utils::getsyserror());
+            error->one(FLERR,"Cannot open logfile {}: {}",str, utils::getsyserror());
         } else if (strcmp(arg[logflag],"none") == 0) {
           logfile = nullptr;
         } else {
           str = fmt::format("{}.{}",arg[logflag],universe->iworld);
           logfile = fopen(str.c_str(),"w");
           if (logfile == nullptr)
-            error->one(FLERR,"Cannot open logfile {}: {}",
-                                         str, utils::getsyserror());
+            error->one(FLERR,"Cannot open logfile {}: {}",str, utils::getsyserror());
         }
       } else if (strcmp(arg[partlogflag],"none") == 0) {
         logfile = nullptr;
@@ -573,15 +572,13 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
         str = fmt::format("{}.{}",arg[partlogflag],universe->iworld);
         logfile = fopen(str.c_str(),"w");
         if (logfile == nullptr)
-          error->one(FLERR,"Cannot open logfile {}: {}",
-                                       str, utils::getsyserror());
+          error->one(FLERR,"Cannot open logfile {}: {}",str, utils::getsyserror());
       }
 
       if (strcmp(arg[inflag], "none") != 0) {
         infile = fopen(arg[inflag],"r");
         if (infile == nullptr)
-          error->one(FLERR,"Cannot open input script {}: {}",
-                                       arg[inflag], utils::getsyserror());
+          error->one(FLERR,"Cannot open input script {}: {}",arg[inflag], utils::getsyserror());
       }
     }
 
@@ -615,12 +612,10 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
   int mpisize;
   MPI_Type_size(MPI_LMP_TAGINT,&mpisize);
   if (mpisize != sizeof(tagint))
-      error->all(FLERR,"MPI_LMP_TAGINT and tagint in "
-                 "lmptype.h are not compatible");
+      error->all(FLERR,"MPI_LMP_TAGINT and tagint in lmptype.h are not compatible");
   MPI_Type_size(MPI_LMP_BIGINT,&mpisize);
   if (mpisize != sizeof(bigint))
-      error->all(FLERR,"MPI_LMP_BIGINT and bigint in "
-                 "lmptype.h are not compatible");
+      error->all(FLERR,"MPI_LMP_BIGINT and bigint in lmptype.h are not compatible");
 
 #ifdef LAMMPS_SMALLBIG
   if (sizeof(smallint) != 4 || sizeof(imageint) != 4 ||
@@ -837,6 +832,8 @@ void LAMMPS::create()
 
 void LAMMPS::post_create()
 {
+  if (skipflag) input->one("timer timeout 0 every 1");
+
   // default package command triggered by "-k on"
 
   if (kokkos && kokkos->kokkos_exists) input->one("package kokkos");
diff --git a/src/lammps.h b/src/lammps.h
index 74ae47e9a2..71b731204c 100644
--- a/src/lammps.h
+++ b/src/lammps.h
@@ -22,52 +22,52 @@ namespace LAMMPS_NS {
 class LAMMPS {
  public:
   // ptrs to fundamental LAMMPS classes
-  class Memory *memory;        // memory allocation functions
-  class Error *error;          // error handling
-  class Universe *universe;    // universe of processors
-  class Input *input;          // input script processing
-                               // ptrs to top-level LAMMPS-specific classes
-  class Atom *atom;            // atom-based quantities
-  class Update *update;        // integrators/minimizers
-  class Neighbor *neighbor;    // neighbor lists
-  class Comm *comm;            // inter-processor communication
-  class Domain *domain;        // simulation box
-  class Force *force;          // inter-particle forces
-  class Modify *modify;        // fixes and computes
-  class Group *group;          // groups of atoms
-  class Output *output;        // thermo/dump/restart
-  class Timer *timer;          // CPU timing info
+  class Memory *memory;            // memory allocation functions
+  class Error *error;              // error handling
+  class Universe *universe;        // universe of processors
+  class Input *input;              // input script processing
+                                   // ptrs to top-level LAMMPS-specific classes
+  class Atom *atom;                // atom-based quantities
+  class Update *update;            // integrators/minimizers
+  class Neighbor *neighbor;        // neighbor lists
+  class Comm *comm;                // inter-processor communication
+  class Domain *domain;            // simulation box
+  class Force *force;              // inter-particle forces
+  class Modify *modify;            // fixes and computes
+  class Group *group;              // groups of atoms
+  class Output *output;            // thermo/dump/restart
+  class Timer *timer;              // CPU timing info
+                                   //
+  class KokkosLMP *kokkos;         // KOKKOS accelerator class
+  class AtomKokkos *atomKK;        // KOKKOS version of Atom class
+  class MemoryKokkos *memoryKK;    // KOKKOS version of Memory class
+  class Python *python;            // Python interface
+  class CiteMe *citeme;            // handle citation info
 
   const char *version;    // LAMMPS version string = date
   int num_ver;            // numeric version id derived from *version*
                           // that is constructed so that will be greater
                           // for newer versions in numeric or string
                           // value comparisons
-
-  MPI_Comm world;    // MPI communicator
-  FILE *infile;      // infile
-  FILE *screen;      // screen output
-  FILE *logfile;     // logfile
-
-  double initclock;    // wall clock at instantiation
+                          //
+  MPI_Comm world;         // MPI communicator
+  FILE *infile;           // infile
+  FILE *screen;           // screen output
+  FILE *logfile;          // logfile
+                          //
+  double initclock;       // wall clock at instantiation
+  int skiprunflag;        // 1 inserts timer command to skip run and minimize loops
 
   char *suffix, *suffix2, *suffixp;    // suffixes to add to input script style names
   int suffix_enable;                   // 1 if suffixes are enabled, 0 if disabled
   char *exename;                       // pointer to argv[0]
+                                       //
   char ***packargs;                    // arguments for cmdline package commands
   int num_package;                     // number of cmdline package commands
-
-  int clientserver;    // 0 = neither, 1 = client, 2 = server
-  void *cslib;         // client/server messaging via CSlib
-  MPI_Comm cscomm;     // MPI comm for client+server in mpi/one mode
-
-  class KokkosLMP *kokkos;         // KOKKOS accelerator class
-  class AtomKokkos *atomKK;        // KOKKOS version of Atom class
-  class MemoryKokkos *memoryKK;    // KOKKOS version of Memory class
-
-  class Python *python;    // Python interface
-
-  class CiteMe *citeme;    // handle citation info
+                                       //
+  int clientserver;                    // 0 = neither, 1 = client, 2 = server
+  void *cslib;                         // client/server messaging via CSlib
+  MPI_Comm cscomm;                     // MPI comm for client+server in mpi/one mode
 
   const char *match_style(const char *style, const char *name);
   static const char *installed_packages[];

From 6290054e5261057485ba8880efa31a0ec5b5deaa Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 3 Sep 2021 11:37:03 -0400
Subject: [PATCH 228/437] forgot to update lammps.cpp

---
 src/lammps.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lammps.cpp b/src/lammps.cpp
index e3e8f4c181..e0192db1d5 100644
--- a/src/lammps.cpp
+++ b/src/lammps.cpp
@@ -126,7 +126,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
   cslib = nullptr;
   cscomm = 0;
 
-  skipflag = 0;
+  skiprunflag = 0;
 
   screen = nullptr;
   logfile = nullptr;
@@ -395,7 +395,7 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) :
 
     } else if (strcmp(arg[iarg],"-skiprun") == 0 ||
                strcmp(arg[iarg],"-sr") == 0) {
-      skipflag = 1;
+      skiprunflag = 1;
       ++iarg;
 
     } else if (strcmp(arg[iarg],"-suffix") == 0 ||
@@ -832,7 +832,7 @@ void LAMMPS::create()
 
 void LAMMPS::post_create()
 {
-  if (skipflag) input->one("timer timeout 0 every 1");
+  if (skiprunflag) input->one("timer timeout 0 every 1");
 
   // default package command triggered by "-k on"
 

From a98ded7722ec31f41c2b40b5b72d8d73aee2ba13 Mon Sep 17 00:00:00 2001
From: Axel Kohlmeyer 
Date: Fri, 3 Sep 2021 16:59:41 -0400
Subject: [PATCH 229/437] adapt section about domain decomposition from paper

---
 doc/src/Developer.rst             |   1 +
 doc/src/Developer_parallel.rst    | 106 ++++++++++++++++++++++++++++++
 doc/src/img/decomp-balance.png    | Bin 0 -> 372977 bytes
 doc/src/img/decomp-processors.png | Bin 0 -> 340217 bytes
 doc/src/img/decomp-rcb.png        | Bin 0 -> 371500 bytes
 doc/src/img/decomp-regular.png    | Bin 0 -> 382687 bytes
 doc/src/img/domain-decomp.png     | Bin 0 -> 1292905 bytes
 7 files changed, 107 insertions(+)
 create mode 100644 doc/src/Developer_parallel.rst
 create mode 100644 doc/src/img/decomp-balance.png
 create mode 100644 doc/src/img/decomp-processors.png
 create mode 100644 doc/src/img/decomp-rcb.png
 create mode 100644 doc/src/img/decomp-regular.png
 create mode 100644 doc/src/img/domain-decomp.png

diff --git a/doc/src/Developer.rst b/doc/src/Developer.rst
index f54bc4152f..f68007486d 100644
--- a/doc/src/Developer.rst
+++ b/doc/src/Developer.rst
@@ -11,6 +11,7 @@ of time and requests from the LAMMPS user community.
    :maxdepth: 1
 
    Developer_org
+   Developer_parallel
    Developer_flow
    Developer_write
    Developer_notes
diff --git a/doc/src/Developer_parallel.rst b/doc/src/Developer_parallel.rst
new file mode 100644
index 0000000000..2f27b75bfc
--- /dev/null
+++ b/doc/src/Developer_parallel.rst
@@ -0,0 +1,106 @@
+Parallel algorithms
+-------------------
+
+LAMMPS is from ground up designed to be running in parallel using the
+MPI standard with distributed data via domain decomposition.  The
+parallelization has to be efficient to enable good strong scaling (=
+good speedup for the same system) and good weak scaling (= the
+computational cost of enlarging the system is linear with the system
+size).  Additional parallelization using GPUs or OpenMP can then be
+applied within the sub-domain assigned to an MPI process.
+
+
+Partitioning
+^^^^^^^^^^^^
+
+The underlying spatial decomposition strategy used by LAMMPS for
+distributed-memory parallelism is set with the :doc:`comm_style command `
+and can be either "brick" (a regular grid) or "tiled".
+
+.. _domain-decomposition:
+.. figure:: img/domain-decomp.png
+
+   LAMMPS domain decomposition
+
+   This figure shows the different kinds of domain decomposition used
+   for MPI parallelization: "brick" on the left with an orthogonal (top)
+   and a triclinic (bottom) simulation domain, and "tiled" on the right.
+   The black lines show the division into sub-domains and the contained
+   atoms are "owned" by the corresponding MPI process. The green dashed
+   lines indicate how sub-domains are extended with "ghost" atoms up
+   to the communication cutoff distance.
+
+The LAMMPS simulation box is a 3d or 2d volume, which can be orthogonal
+or triclinic in shape, as illustrated in the :ref:`domain-decomposition`
+figure for the 2d case.  Orthogonal means the box edges are aligned with
+the *x*, *y*, *z* Cartesian axes, and the box faces are thus all
+rectangular.  Triclinic allows for a more general parallelepiped shape
+in which edges are aligned with three arbitrary vectors and the box
+faces are parallelograms.  In each dimension box faces can be periodic,
+or non-periodic with fixed or shrink-wrapped boundaries.  In the fixed
+case, atoms which move outside the face are deleted; shrink-wrapped
+means the position of the box face adjusts continuously to enclose all
+the atoms.
+
+For distributed-memory MPI parallelism, the simulation box is spatially
+decomposed (partitioned) into non-overlapping sub-domains which fill the
+box. The default partitioning, "brick", is most suitable when atom
+density is roughly uniform, as shown in the left-side images of the
+:ref:`domain-decomposition` figure.  The sub-domains comprise a regular
+grid and all sub-domains are identical in size and shape.  Both the
+orthogonal and triclinic boxes can deform continuously during a
+simulation, e.g. to compress a solid or shear a liquid, in which case
+the processor sub-domains likewise deform.
+
+
+For models with non-uniform density, the number of particles per
+processor can be load-imbalanced with the default partitioning.  This
+reduces parallel efficiency, as the overall simulation rate is limited
+by the slowest processor, i.e. the one with the largest computational
+load.  For such models, LAMMPS supports multiple strategies to reduce
+the load imbalance:
+
+- The processor grid decomposition is by default based on the simulation
+  cell volume and tries to optimize the volume to surface ratio for the sub-domains.
+  This can be changed with the :doc:`processors command `.
+- The parallel planes defining the size of the sub-domains can be shifted
+  with the :doc:`balance command `. Which can be done in addition
+  to choosing a more optimal processor grid.
+- The recursive bisectioning algorithm in combination with the "tiled"
+  communication style can produce a partitioning with equal numbers of
+  particles in each sub-domain.
+
+ 
+.. |decomp1| image:: img/decomp-regular.png
+   :width: 24%
+
+.. |decomp2| image:: img/decomp-processors.png
+   :width: 24%
+
+.. |decomp3| image:: img/decomp-balance.png
+   :width: 24%
+
+.. |decomp4| image:: img/decomp-rcb.png
+   :width: 24%
+
+|decomp1|  |decomp2|  |decomp3|  |decomp4|
+
+The pictures above demonstrate the differences for a 2d system with 12 MPI ranks.
+Due to the vacuum in the system, the default decomposition is unbalanced
+with several MPI ranks without atoms (left). By forcing a 1x12x1 processor
+grid, every MPI rank does computations now, but the amount of communication
+between sub-domains is increased (center left). With a 2x6x1 processor grid and
+shifting the sub-domain divisions, the load imbalance is also reduced and
+the amount of communication required between sub-domains is less (center right).
+And using the recursive bisectioning leads to further improved decomposition (right).
+
+
+Communication
+^^^^^^^^^^^^^
+
+Neighbor lists
+^^^^^^^^^^^^^^
+
+Long-range interactions
+^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/doc/src/img/decomp-balance.png b/doc/src/img/decomp-balance.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac72c51143c41c08830a6d2d49919de782c0ced
GIT binary patch
literal 372977
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⁣*l*;^@xLy5#QtmvX51ZU&6Xy
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

n zj!r#1zDj04b(ybs!I(^A^0eVagPpn(CtR%e(sh}R_A{Jex%!JHTWto$ZlCcAGV1PU z1NgK*RcAe+pg{ae!eT;Yy*riQC**!qAjl&4?Wf-{;Cl$T^#cnDy+vuz$1`b!UAT80 zV=iUqYAxQ<-FbTY*9BpJH3{`*9{7ZSmvw;(FN#|wfu!RBq?E89!h+ub-n%88oM{C) z5@{uaUq4d%9PG=O)_5!*6hy!L08HCWq0R1?fR}5xaQ#UPMEFbfN-$xDY|+b*^T|&T zoiPHw`m!G4?m(#1Pr@!IJ?h4eVCYILcI|AFQBuW%Grd8Q03{^BTB1W|mAtzzBJ3aD z7|5Pn;*$q)zb1JOsDbC8_28G)nZP2Rs%owTBeQFel8D%n@4H!xX({QdQHGdFp5*7JE+o}4v`mWcDf%bj=`ynukw z(^pi+tI3Hm=$`tPI|_&{Mc?&wG{)AQloZUF6dyc$IuFTi3ZKyZ6uJ8>qd z-1%xftU689qL5jT*`Fb&r5nLwYJmE!!!vgQpob83*+wS{OY;z^Fgkp z5)n#tAM6;)0TnY8Q9(>Vsv+VX^=1uw<)

#-x~@5*=OJShZ07trUGr*EAZD$53=X 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%0A0OnoU0#w8w$Xy7X`& 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

sYS$En*q>xO8@{M07*naRGFb2*h!R< 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

    2ll8({Uu)K=1@oQt8)lUdCT-P=gc7as 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 R6)4D?HdJ4|O!dLze*q+fy%hie literal 0 HcmV?d00001 diff --git a/doc/src/img/decomp-processors.png b/doc/src/img/decomp-processors.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa9e98d6c821935f68ba80488f45d92b1a41712 GIT binary patch literal 340217 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%0A;-W%$K1mP8-(fTM2}0g^)UJ@hyOahjYc(Lo4Y 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℘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

    9CJK~ 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%0Drw|kWkS0k=67XSjWP^v|o#yBpuZlXm- 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 literal 0 HcmV?d00001 diff --git a/doc/src/img/decomp-rcb.png b/doc/src/img/decomp-rcb.png new file mode 100644 index 0000000000000000000000000000000000000000..03ab2a1395ea96c63ae130d738c3e67745f89bf3 GIT binary patch literal 371500 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 !n*US8SfZw+GrPhzf}#91@;RtMKw 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