Merge branch 'master' into fix-property-array

This commit is contained in:
Steve Plimpton
2021-08-17 12:19:27 -06:00
23 changed files with 971 additions and 885 deletions

View File

@ -334,10 +334,11 @@ arguments of commands in LAMMPS are parsed and to make abstractions of
repetitive tasks.
The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction
for parsing references to compute or fix styles or variables. These
would start with a "c\_", "f\_", "v\_" followed by the ID or name of
than instance and may be postfixed with one or two array indices
"[<number>]" with numbers > 0.
for parsing references to compute or fix styles, variables or custom
integer or double properties handled by :doc:`fix property/atom <fix_property_atom>`.
These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2_"
followed by the ID or name of than instance and may be postfixed with
one or two array indices "[<number>]" with numbers > 0.
A typical code segment would look like this:

File diff suppressed because it is too large Load Diff

View File

@ -21,21 +21,21 @@
#include "pair_body_rounded_polygon.h"
#include <cmath>
#include <cstring>
#include "math_extra.h"
#include "atom.h"
#include "atom_vec_body.h"
#include "body_rounded_polygon.h"
#include "comm.h"
#include "force.h"
#include "fix.h"
#include "modify.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "memory.h"
#include "error.h"
#include "fix.h"
#include "force.h"
#include "math_extra.h"
#include "memory.h"
#include "modify.h"
#include "neigh_list.h"
#include "neighbor.h"
#include <cmath>
#include <cstring>
using namespace LAMMPS_NS;

View File

@ -23,22 +23,22 @@
#include "pair_body_rounded_polyhedron.h"
#include <cmath>
#include <cstring>
#include "atom.h"
#include "atom_vec_body.h"
#include "body_rounded_polyhedron.h"
#include "comm.h"
#include "force.h"
#include "fix.h"
#include "modify.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "memory.h"
#include "error.h"
#include "math_extra.h"
#include "fix.h"
#include "force.h"
#include "math_const.h"
#include "math_extra.h"
#include "memory.h"
#include "modify.h"
#include "neigh_list.h"
#include "neighbor.h"
#include <cmath>
#include <cstring>
using namespace LAMMPS_NS;
using namespace MathConst;
@ -1212,10 +1212,7 @@ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody,
contact_list[num_contacts].unique = 1;
num_contacts++;
}
} else {
}
return interact;
}

View File

@ -617,8 +617,7 @@ void PairExp6rx::coeff(int narg, char **arg)
if (strcmp(site1,"1fluid") == 0)
isite1 = oneFluidApproxParameter;
else
{
else {
int isp;
for (isp = 0; isp < nspecies; isp++)
if (strcmp(site1, &atom->dvname[isp][0]) == 0) break;
@ -631,8 +630,7 @@ void PairExp6rx::coeff(int narg, char **arg)
if (strcmp(site2,"1fluid") == 0)
isite2 = oneFluidApproxParameter;
else
{
else {
int isp;
for (isp = 0; isp < nspecies; isp++)
if (strcmp(site2, &atom->dvname[isp][0]) == 0) break;
@ -644,8 +642,7 @@ void PairExp6rx::coeff(int narg, char **arg)
}
// Set the interaction potential type to the enumerated type.
for (int iparam = 0; iparam < nparams; ++iparam)
{
for (int iparam = 0; iparam < nparams; ++iparam) {
if (strcmp( params[iparam].potential, "exp6") == 0)
params[iparam].potentialType = exp6PotentialType;
else
@ -663,7 +660,6 @@ void PairExp6rx::coeff(int narg, char **arg)
scalingFlag = EXPONENT;
exponentR = utils::numeric(FLERR,arg[6],false,lmp);
exponentEpsilon = utils::numeric(FLERR,arg[7],false,lmp);
if (narg > 9) error->all(FLERR,"Incorrect args for pair coefficients");
if (narg == 9) cut_one = utils::numeric(FLERR,arg[8],false,lmp);
} else if (strcmp(arg[5],"polynomial") == 0) {
scalingFlag = POLYNOMIAL;

View File

@ -132,6 +132,7 @@ FixGLD::FixGLD(LAMMPS *lmp, int narg, char **arg) :
error->all(FLERR, "Illegal fix gld command");
}
if (strcmp(arg[iarg+1],"no") == 0) {
zeroflag = 0;
} else if (strcmp(arg[iarg+1],"yes") == 0) {
zeroflag = 1;
} else {
@ -144,6 +145,7 @@ FixGLD::FixGLD(LAMMPS *lmp, int narg, char **arg) :
error->all(FLERR, "Illegal fix gld command");
}
if (strcmp(arg[iarg+1],"no") == 0) {
freezeflag = 0;
} else if (strcmp(arg[iarg+1],"yes") == 0) {
freezeflag = 1;
for (int i = 0; i < atom->nlocal; i++) {

View File

@ -106,6 +106,8 @@ PPPMGPU::PPPMGPU(LAMMPS *lmp) : PPPM(lmp)
PPPMGPU::~PPPMGPU()
{
PPPM_GPU_API(clear)(poisson_time);
destroy_3d_offset(density_brick_gpu,nzlo_out,nylo_out);
destroy_3d_offset(vd_brick,nzlo_out,nylo_out);
}
/* ----------------------------------------------------------------------

View File

@ -437,7 +437,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) :
// register with Atom class
history_one = nullptr;
grow_arrays(atom->nmax);
FixWallGran::grow_arrays(atom->nmax);
atom->add_callback(Atom::GROW);
atom->add_callback(Atom::RESTART);
@ -1555,8 +1555,7 @@ double FixWallGran::memory_usage()
void FixWallGran::grow_arrays(int nmax)
{
if (use_history) memory->grow(history_one,nmax,size_history,
"fix_wall_gran:history_one");
if (use_history) memory->grow(history_one,nmax,size_history,"fix_wall_gran:history_one");
if (peratom_flag) {
memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom");
}

View File

@ -62,7 +62,7 @@ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) :
ncontact = nullptr;
walls = nullptr;
history_many = nullptr;
grow_arrays(atom->nmax);
FixWallGranRegion::grow_arrays(atom->nmax);
// initialize shear history as if particle is not touching region
@ -355,8 +355,7 @@ void FixWallGranRegion::grow_arrays(int nmax)
if (use_history) {
memory->grow(ncontact,nmax,"fix_wall_gran:ncontact");
memory->grow(walls,nmax,tmax,"fix_wall_gran:walls");
memory->grow(history_many,nmax,tmax,size_history,
"fix_wall_gran:history_many");
memory->grow(history_many,nmax,tmax,size_history,"fix_wall_gran:history_many");
}
if (peratom_flag)
memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom");

View File

@ -109,7 +109,8 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp)
PairGranular::~PairGranular()
{
delete [] svector;
delete[] svector;
delete[] history_transfer_factors;
if (!fix_history) modify->delete_fix("NEIGH_HISTORY_GRANULAR_DUMMY");
else modify->delete_fix("NEIGH_HISTORY_GRANULAR");

View File

@ -91,7 +91,7 @@ PairTersoffTable::~PairTersoffTable()
memory->destroy(cutsq);
}
deallocateGrids();
deallocatePreLoops();
PairTersoffTable::deallocatePreLoops();
}
/* ---------------------------------------------------------------------- */

View File

@ -53,7 +53,7 @@ PairTersoffTableOMP::PairTersoffTableOMP(LAMMPS *lmp) :
PairTersoffTableOMP::~PairTersoffTableOMP()
{
if (allocated) {
deallocatePreLoops();
PairTersoffTableOMP::deallocatePreLoops();
}
}

View File

@ -165,7 +165,7 @@ FixQEqReaxFF::~FixQEqReaxFF()
memory->destroy(s_hist);
memory->destroy(t_hist);
deallocate_storage();
FixQEqReaxFF::deallocate_storage();
deallocate_matrix();
memory->destroy(shld);

View File

@ -1,4 +1,3 @@
// clang-format off
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
@ -24,69 +23,29 @@
#include "fix_pimd.h"
#include <cmath>
#include <cstring>
#include "universe.h"
#include "comm.h"
#include "force.h"
#include "atom.h"
#include "comm.h"
#include "domain.h"
#include "update.h"
#include "error.h"
#include "force.h"
#include "math_const.h"
#include "memory.h"
#include "error.h"
#include "universe.h"
#include "update.h"
#include <cmath>
#include <cstring>
using namespace LAMMPS_NS;
using namespace FixConst;
using namespace MathConst;
enum{PIMD,NMPIMD,CMD};
enum { PIMD, NMPIMD, CMD };
/* ---------------------------------------------------------------------- */
FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg)
{
method = PIMD;
fmass = 1.0;
nhc_temp = 298.15;
nhc_nchain = 2;
sp = 1.0;
for (int i=3; i<narg-1; i+=2)
{
if (strcmp(arg[i],"method")==0)
{
if (strcmp(arg[i+1],"pimd")==0) method=PIMD;
else if (strcmp(arg[i+1],"nmpimd")==0) method=NMPIMD;
else if (strcmp(arg[i+1],"cmd")==0) method=CMD;
else error->universe_all(FLERR,"Unknown method parameter for fix pimd");
}
else if (strcmp(arg[i],"fmass")==0)
{
fmass = atof(arg[i+1]);
if (fmass<0.0 || fmass>1.0) error->universe_all(FLERR,"Invalid fmass value for fix pimd");
}
else if (strcmp(arg[i],"sp")==0)
{
sp = atof(arg[i+1]);
if (fmass<0.0) error->universe_all(FLERR,"Invalid sp value for fix pimd");
}
else if (strcmp(arg[i],"temp")==0)
{
nhc_temp = atof(arg[i+1]);
if (nhc_temp<0.0) error->universe_all(FLERR,"Invalid temp value for fix pimd");
}
else if (strcmp(arg[i],"nhc")==0)
{
nhc_nchain = atoi(arg[i+1]);
if (nhc_nchain<2) error->universe_all(FLERR,"Invalid nhc value for fix pimd");
}
else error->universe_all(arg[i],i+1,"Unknown keyword for fix pimd");
}
/* Initiation */
max_nsend = 0;
tag_send = nullptr;
buf_send = nullptr;
@ -110,25 +69,60 @@ FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg)
nhc_eta_dotdot = nullptr;
nhc_eta_mass = nullptr;
method = PIMD;
fmass = 1.0;
nhc_temp = 298.15;
nhc_nchain = 2;
sp = 1.0;
for (int i = 3; i < narg - 1; i += 2) {
if (strcmp(arg[i], "method") == 0) {
if (strcmp(arg[i + 1], "pimd") == 0)
method = PIMD;
else if (strcmp(arg[i + 1], "nmpimd") == 0)
method = NMPIMD;
else if (strcmp(arg[i + 1], "cmd") == 0)
method = CMD;
else
error->universe_all(FLERR, "Unknown method parameter for fix pimd");
} else if (strcmp(arg[i], "fmass") == 0) {
fmass = utils::numeric(FLERR, arg[i + 1], false, lmp);
if (fmass < 0.0 || fmass > 1.0)
error->universe_all(FLERR, "Invalid fmass value for fix pimd");
} else if (strcmp(arg[i], "sp") == 0) {
sp = utils::numeric(FLERR, arg[i + 1], false, lmp);
if (fmass < 0.0) error->universe_all(FLERR, "Invalid sp value for fix pimd");
} else if (strcmp(arg[i], "temp") == 0) {
nhc_temp = utils::numeric(FLERR, arg[i + 1], false, lmp);
if (nhc_temp < 0.0) error->universe_all(FLERR, "Invalid temp value for fix pimd");
} else if (strcmp(arg[i], "nhc") == 0) {
nhc_nchain = utils::inumeric(FLERR, arg[i + 1], false, lmp);
if (nhc_nchain < 2) error->universe_all(FLERR, "Invalid nhc value for fix pimd");
} else
error->universe_all(FLERR, fmt::format("Unknown keyword {} for fix pimd", arg[i]));
}
/* Initiation */
size_peratom_cols = 12 * nhc_nchain + 3;
nhc_offset_one_1 = 3 * nhc_nchain;
nhc_offset_one_2 = 3 * nhc_nchain +3;
nhc_offset_one_2 = 3 * nhc_nchain + 3;
nhc_size_one_1 = sizeof(double) * nhc_offset_one_1;
nhc_size_one_2 = sizeof(double) * nhc_offset_one_2;
restart_peratom = 1;
peratom_flag = 1;
peratom_freq = 1;
peratom_flag = 1;
peratom_freq = 1;
global_freq = 1;
vector_flag = 1;
size_vector = 2;
extvector = 1;
extvector = 1;
comm_forward = 3;
atom->add_callback(Atom::GROW); // Call LAMMPS to allocate memory for per-atom array
atom->add_callback(Atom::RESTART); // Call LAMMPS to re-assign restart-data for per-atom array
atom->add_callback(Atom::GROW); // Call LAMMPS to allocate memory for per-atom array
atom->add_callback(Atom::RESTART); // Call LAMMPS to re-assign restart-data for per-atom array
grow_arrays(atom->nmax);
@ -138,7 +132,37 @@ FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg)
}
/* ---------------------------------------------------------------------- */
FixPIMD::~FixPIMD()
{
delete[] mass;
atom->delete_callback(id, Atom::GROW);
atom->delete_callback(id, Atom::RESTART);
memory->destroy(M_x2xp);
memory->destroy(M_xp2x);
memory->destroy(M_f2fp);
memory->destroy(M_fp2f);
memory->sfree(lam);
if (buf_beads)
for (int i = 0; i < np; i++) memory->sfree(buf_beads[i]);
delete[] buf_beads;
delete[] plan_send;
delete[] plan_recv;
delete[] mode_index;
memory->sfree(tag_send);
memory->sfree(buf_send);
memory->sfree(buf_recv);
memory->destroy(array_atom);
memory->destroy(nhc_eta);
memory->destroy(nhc_eta_dot);
memory->destroy(nhc_eta_dotdot);
memory->destroy(nhc_eta_mass);
}
/* ---------------------------------------------------------------------- */
int FixPIMD::setmask()
{
int mask = 0;
@ -153,9 +177,10 @@ int FixPIMD::setmask()
void FixPIMD::init()
{
if (atom->map_style == Atom::MAP_NONE)
error->all(FLERR,"Fix pimd requires an atom map, see atom_modify");
error->all(FLERR, "Fix pimd requires an atom map, see atom_modify");
if (universe->me==0 && screen) fprintf(screen,"Fix pimd initializing Path-Integral ...\n");
if (universe->me == 0 && universe->uscreen)
fprintf(universe->uscreen, "Fix pimd initializing Path-Integral ...\n");
// prepare the constants
@ -181,16 +206,16 @@ void FixPIMD::init()
/* The current solution, using LAMMPS internal real units */
const double Boltzmann = force->boltz;
const double Plank = force->hplanck;
const double Plank = force->hplanck;
double hbar = Plank / ( 2.0 * MY_PI );
double beta = 1.0 / (Boltzmann * nhc_temp);
double _fbond = 1.0 * np / (beta*beta*hbar*hbar) ;
double hbar = Plank / (2.0 * MY_PI);
double beta = 1.0 / (Boltzmann * nhc_temp);
double _fbond = 1.0 * np / (beta * beta * hbar * hbar);
omega_np = sqrt(np) / (hbar * beta) * sqrt(force->mvv2e);
fbond = - _fbond * force->mvv2e;
fbond = -_fbond * force->mvv2e;
if (universe->me==0)
if (universe->me == 0)
printf("Fix pimd -P/(beta^2 * hbar^2) = %20.7lE (kcal/mol/A^2)\n\n", fbond);
dtv = update->dt;
@ -198,10 +223,12 @@ void FixPIMD::init()
comm_init();
mass = new double [atom->ntypes+1];
mass = new double[atom->ntypes + 1];
if (method==CMD || method==NMPIMD) nmpimd_init();
else for (int i=1; i<=atom->ntypes; i++) mass[i] = atom->mass[i] / np * fmass;
if (method == CMD || method == NMPIMD)
nmpimd_init();
else
for (int i = 1; i <= atom->ntypes; i++) mass[i] = atom->mass[i] / np * fmass;
if (!nhc_ready) nhc_init();
}
@ -210,7 +237,8 @@ void FixPIMD::init()
void FixPIMD::setup(int vflag)
{
if (universe->me==0 && screen) fprintf(screen,"Setting up Path-Integral ...\n");
if (universe->me == 0 && universe->uscreen)
fprintf(universe->uscreen, "Setting up Path-Integral ...\n");
post_force(vflag);
}
@ -234,13 +262,13 @@ void FixPIMD::final_integrate()
void FixPIMD::post_force(int /*flag*/)
{
for (int i=0; i<atom->nlocal; i++) for(int j=0; j<3; j++) atom->f[i][j] /= np;
for (int i = 0; i < atom->nlocal; i++)
for (int j = 0; j < 3; j++) atom->f[i][j] /= np;
comm_exec(atom->x);
spring_force();
if (method==CMD || method==NMPIMD)
{
if (method == CMD || method == NMPIMD) {
/* forward comm for the force on ghost atoms */
nmpimd_fill(atom->f);
@ -262,34 +290,38 @@ void FixPIMD::post_force(int /*flag*/)
void FixPIMD::nhc_init()
{
double tau = 1.0 / omega_np;
double KT = force->boltz * nhc_temp;
double KT = force->boltz * nhc_temp;
double mass0 = KT * tau * tau;
int max = 3 * atom->nlocal;
for (int i=0; i<max; i++)
{
for (int ichain=0; ichain<nhc_nchain; ichain++)
{
nhc_eta[i][ichain] = 0.0;
nhc_eta_dot[i][ichain] = 0.0;
nhc_eta_dot[i][ichain] = 0.0;
for (int i = 0; i < max; i++) {
for (int ichain = 0; ichain < nhc_nchain; ichain++) {
nhc_eta[i][ichain] = 0.0;
nhc_eta_dot[i][ichain] = 0.0;
nhc_eta_dot[i][ichain] = 0.0;
nhc_eta_dotdot[i][ichain] = 0.0;
nhc_eta_mass[i][ichain] = mass0;
if ((method==CMD || method==NMPIMD) && universe->iworld==0) ; else nhc_eta_mass[i][ichain] *= fmass;
nhc_eta_mass[i][ichain] = mass0;
if ((method == CMD || method == NMPIMD) && universe->iworld == 0)
;
else
nhc_eta_mass[i][ichain] *= fmass;
}
nhc_eta_dot[i][nhc_nchain] = 0.0;
nhc_eta_dot[i][nhc_nchain] = 0.0;
for (int ichain=1; ichain<nhc_nchain; ichain++)
nhc_eta_dotdot[i][ichain] = (nhc_eta_mass[i][ichain-1] * nhc_eta_dot[i][ichain-1]
* nhc_eta_dot[i][ichain-1] * force->mvv2e - KT) / nhc_eta_mass[i][ichain];
for (int ichain = 1; ichain < nhc_nchain; ichain++)
nhc_eta_dotdot[i][ichain] = (nhc_eta_mass[i][ichain - 1] * nhc_eta_dot[i][ichain - 1] *
nhc_eta_dot[i][ichain - 1] * force->mvv2e -
KT) /
nhc_eta_mass[i][ichain];
}
// Zero NH acceleration for CMD
if (method==CMD && universe->iworld==0) for (int i=0; i<max; i++)
for (int ichain=0; ichain<nhc_nchain; ichain++) nhc_eta_dotdot[i][ichain] = 0.0;
if (method == CMD && universe->iworld == 0)
for (int i = 0; i < max; i++)
for (int ichain = 0; ichain < nhc_nchain; ichain++) nhc_eta_dotdot[i][ichain] = 0.0;
nhc_ready = true;
}
@ -302,8 +334,7 @@ void FixPIMD::nhc_update_x()
double **x = atom->x;
double **v = atom->v;
if (method==CMD || method==NMPIMD)
{
if (method == CMD || method == NMPIMD) {
nmpimd_fill(atom->v);
comm_exec(atom->v);
@ -313,8 +344,7 @@ void FixPIMD::nhc_update_x()
nmpimd_transform(buf_beads, v, M_xp2x[universe->iworld]);
}
for (int i=0; i<n; i++)
{
for (int i = 0; i < n; i++) {
x[i][0] += dtv * v[i][0];
x[i][1] += dtv * v[i][1];
x[i][2] += dtv * v[i][2];
@ -330,8 +360,7 @@ void FixPIMD::nhc_update_v()
double **v = atom->v;
double **f = atom->f;
for (int i=0; i<n; i++)
{
for (int i = 0; i < n; i++) {
double dtfm = dtf / mass[type[i]];
v[i][0] += dtfm * f[i][0];
v[i][1] += dtfm * f[i][1];
@ -339,25 +368,24 @@ void FixPIMD::nhc_update_v()
}
t_sys = 0.0;
if (method==CMD && universe->iworld==0) return;
if (method == CMD && universe->iworld == 0) return;
double expfac;
int nmax = 3 * atom->nlocal;
double KT = force->boltz * nhc_temp;
double kecurrent, t_current;
double dthalf = 0.5 * update->dt;
double dt4 = 0.25 * update->dt;
double dt8 = 0.125 * update->dt;
double dthalf = 0.5 * update->dt;
double dt4 = 0.25 * update->dt;
double dt8 = 0.125 * update->dt;
for (int i=0; i<nmax; i++)
{
int iatm = i/3;
int idim = i%3;
for (int i = 0; i < nmax; i++) {
int iatm = i / 3;
int idim = i % 3;
double *vv = v[iatm];
kecurrent = mass[type[iatm]] * vv[idim]* vv[idim] * force->mvv2e;
kecurrent = mass[type[iatm]] * vv[idim] * vv[idim] * force->mvv2e;
t_current = kecurrent / force->boltz;
double *eta = nhc_eta[i];
@ -366,9 +394,8 @@ void FixPIMD::nhc_update_v()
eta_dotdot[0] = (kecurrent - KT) / nhc_eta_mass[i][0];
for (int ichain=nhc_nchain-1; ichain>0; ichain--)
{
expfac = exp(-dt8 * eta_dot[ichain+1]);
for (int ichain = nhc_nchain - 1; ichain > 0; ichain--) {
expfac = exp(-dt8 * eta_dot[ichain + 1]);
eta_dot[ichain] *= expfac;
eta_dot[ichain] += eta_dotdot[ichain] * dt4;
eta_dot[ichain] *= expfac;
@ -388,19 +415,18 @@ void FixPIMD::nhc_update_v()
kecurrent = force->boltz * t_current;
eta_dotdot[0] = (kecurrent - KT) / nhc_eta_mass[i][0];
for (int ichain=0; ichain<nhc_nchain; ichain++)
eta[ichain] += dthalf * eta_dot[ichain];
for (int ichain = 0; ichain < nhc_nchain; ichain++) eta[ichain] += dthalf * eta_dot[ichain];
eta_dot[0] *= expfac;
eta_dot[0] += eta_dotdot[0] * dt4;
eta_dot[0] *= expfac;
for (int ichain=1; ichain<nhc_nchain; ichain++)
{
expfac = exp(-dt8 * eta_dot[ichain+1]);
for (int ichain = 1; ichain < nhc_nchain; ichain++) {
expfac = exp(-dt8 * eta_dot[ichain + 1]);
eta_dot[ichain] *= expfac;
eta_dotdot[ichain] = (nhc_eta_mass[i][ichain-1] * eta_dot[ichain-1] * eta_dot[ichain-1]
- KT) / nhc_eta_mass[i][ichain];
eta_dotdot[ichain] =
(nhc_eta_mass[i][ichain - 1] * eta_dot[ichain - 1] * eta_dot[ichain - 1] - KT) /
nhc_eta_mass[i][ichain];
eta_dot[ichain] += eta_dotdot[ichain] * dt4;
eta_dot[ichain] *= expfac;
}
@ -422,39 +448,36 @@ void FixPIMD::nmpimd_init()
memory->create(M_f2fp, np, np, "fix_feynman:M_f2fp");
memory->create(M_fp2f, np, np, "fix_feynman:M_fp2f");
lam = (double*) memory->smalloc(sizeof(double)*np, "FixPIMD::lam");
lam = (double *) memory->smalloc(sizeof(double) * np, "FixPIMD::lam");
// Set up eigenvalues
lam[0] = 0.0;
if (np%2==0) lam[np-1] = 4.0 * np;
if (np % 2 == 0) lam[np - 1] = 4.0 * np;
for (int i=2; i<=np/2; i++)
{
lam[2*i-3] = lam[2*i-2] = 2.0 * np * (1.0 - 1.0 *cos(2.0*MY_PI*(i-1)/np));
for (int i = 2; i <= np / 2; i++) {
lam[2 * i - 3] = lam[2 * i - 2] = 2.0 * np * (1.0 - 1.0 * cos(2.0 * MY_PI * (i - 1) / np));
}
// Set up eigenvectors for non-degenerated modes
for (int i=0; i<np; i++)
{
for (int i = 0; i < np; i++) {
M_x2xp[0][i] = 1.0 / np;
if (np%2==0) M_x2xp[np-1][i] = 1.0 / np * pow(-1.0, i);
if (np % 2 == 0) M_x2xp[np - 1][i] = 1.0 / np * pow(-1.0, i);
}
// Set up eigenvectors for degenerated modes
for (int i=0; i<(np-1)/2; i++) for(int j=0; j<np; j++)
{
M_x2xp[2*i+1][j] = sqrt(2.0) * cos ( 2.0 * MY_PI * (i+1) * j / np) / np;
M_x2xp[2*i+2][j] = - sqrt(2.0) * sin ( 2.0 * MY_PI * (i+1) * j / np) / np;
}
for (int i = 0; i < (np - 1) / 2; i++)
for (int j = 0; j < np; j++) {
M_x2xp[2 * i + 1][j] = sqrt(2.0) * cos(2.0 * MY_PI * (i + 1) * j / np) / np;
M_x2xp[2 * i + 2][j] = -sqrt(2.0) * sin(2.0 * MY_PI * (i + 1) * j / np) / np;
}
// Set up Ut
for (int i=0; i<np; i++)
for (int j=0; j<np; j++)
{
for (int i = 0; i < np; i++)
for (int j = 0; j < np; j++) {
M_xp2x[i][j] = M_x2xp[j][i] * np;
M_f2fp[i][j] = M_x2xp[i][j] * np;
M_fp2f[i][j] = M_xp2x[i][j];
@ -464,12 +487,10 @@ void FixPIMD::nmpimd_init()
int iworld = universe->iworld;
for (int i=1; i<=atom->ntypes; i++)
{
for (int i = 1; i <= atom->ntypes; i++) {
mass[i] = atom->mass[i];
if (iworld)
{
if (iworld) {
mass[i] *= lam[iworld];
mass[i] *= fmass;
}
@ -486,17 +507,17 @@ void FixPIMD::nmpimd_fill(double **ptr)
/* ---------------------------------------------------------------------- */
void FixPIMD::nmpimd_transform(double** src, double** des, double *vector)
void FixPIMD::nmpimd_transform(double **src, double **des, double *vector)
{
int n = atom->nlocal;
int m = 0;
for (int i=0; i<n; i++) for(int d=0; d<3; d++)
{
des[i][d] = 0.0;
for (int j=0; j<np; j++) { des[i][d] += (src[j][m] * vector[j]); }
m++;
}
for (int i = 0; i < n; i++)
for (int d = 0; d < 3; d++) {
des[i][d] = 0.0;
for (int j = 0; j < np; j++) { des[i][d] += (src[j][m] * vector[j]); }
m++;
}
}
/* ---------------------------------------------------------------------- */
@ -507,15 +528,14 @@ void FixPIMD::spring_force()
double **x = atom->x;
double **f = atom->f;
double* _mass = atom->mass;
int* type = atom->type;
double *_mass = atom->mass;
int *type = atom->type;
int nlocal = atom->nlocal;
double* xlast = buf_beads[x_last];
double* xnext = buf_beads[x_next];
double *xlast = buf_beads[x_last];
double *xnext = buf_beads[x_next];
for (int i=0; i<nlocal; i++)
{
for (int i = 0; i < nlocal; i++) {
double delx1 = xlast[0] - x[i][0];
double dely1 = xlast[1] - x[i][1];
double delz1 = xlast[2] - x[i][2];
@ -530,15 +550,15 @@ void FixPIMD::spring_force()
double ff = fbond * _mass[type[i]];
double dx = delx1+delx2;
double dy = dely1+dely2;
double dz = delz1+delz2;
double dx = delx1 + delx2;
double dy = dely1 + dely2;
double dz = delz1 + delz2;
f[i][0] -= (dx) * ff;
f[i][1] -= (dy) * ff;
f[i][2] -= (dz) * ff;
f[i][0] -= (dx) *ff;
f[i][1] -= (dy) *ff;
f[i][2] -= (dz) *ff;
spring_energy += (dx*dx+dy*dy+dz*dz);
spring_energy += (dx * dx + dy * dy + dz * dz);
}
}
@ -548,60 +568,59 @@ void FixPIMD::spring_force()
void FixPIMD::comm_init()
{
if (size_plan)
{
delete [] plan_send;
delete [] plan_recv;
if (size_plan) {
delete[] plan_send;
delete[] plan_recv;
}
if (method == PIMD)
{
if (method == PIMD) {
size_plan = 2;
plan_send = new int [2];
plan_recv = new int [2];
mode_index = new int [2];
plan_send = new int[2];
plan_recv = new int[2];
mode_index = new int[2];
int rank_last = universe->me - comm->nprocs;
int rank_next = universe->me + comm->nprocs;
if (rank_last<0) rank_last += universe->nprocs;
if (rank_next>=universe->nprocs) rank_next -= universe->nprocs;
if (rank_last < 0) rank_last += universe->nprocs;
if (rank_next >= universe->nprocs) rank_next -= universe->nprocs;
plan_send[0] = rank_next; plan_send[1] = rank_last;
plan_recv[0] = rank_last; plan_recv[1] = rank_next;
plan_send[0] = rank_next;
plan_send[1] = rank_last;
plan_recv[0] = rank_last;
plan_recv[1] = rank_next;
mode_index[0] = 0; mode_index[1] = 1;
x_last = 1; x_next = 0;
}
else
{
mode_index[0] = 0;
mode_index[1] = 1;
x_last = 1;
x_next = 0;
} else {
size_plan = np - 1;
plan_send = new int [size_plan];
plan_recv = new int [size_plan];
mode_index = new int [size_plan];
plan_send = new int[size_plan];
plan_recv = new int[size_plan];
mode_index = new int[size_plan];
for (int i=0; i<size_plan; i++)
{
plan_send[i] = universe->me + comm->nprocs * (i+1);
if (plan_send[i]>=universe->nprocs) plan_send[i] -= universe->nprocs;
for (int i = 0; i < size_plan; i++) {
plan_send[i] = universe->me + comm->nprocs * (i + 1);
if (plan_send[i] >= universe->nprocs) plan_send[i] -= universe->nprocs;
plan_recv[i] = universe->me - comm->nprocs * (i+1);
if (plan_recv[i]<0) plan_recv[i] += universe->nprocs;
plan_recv[i] = universe->me - comm->nprocs * (i + 1);
if (plan_recv[i] < 0) plan_recv[i] += universe->nprocs;
mode_index[i]=(universe->iworld+i+1)%(universe->nworlds);
mode_index[i] = (universe->iworld + i + 1) % (universe->nworlds);
}
x_next = (universe->iworld+1+universe->nworlds)%(universe->nworlds);
x_last = (universe->iworld-1+universe->nworlds)%(universe->nworlds);
x_next = (universe->iworld + 1 + universe->nworlds) % (universe->nworlds);
x_last = (universe->iworld - 1 + universe->nworlds) % (universe->nworlds);
}
if (buf_beads)
{
for (int i=0; i<np; i++) if (buf_beads[i]) delete [] buf_beads[i];
delete [] buf_beads;
if (buf_beads) {
for (int i = 0; i < np; i++)
if (buf_beads[i]) delete[] buf_beads[i];
delete[] buf_beads;
}
buf_beads = new double* [np];
for (int i=0; i<np; i++) buf_beads[i] = nullptr;
buf_beads = new double *[np];
for (int i = 0; i < np; i++) buf_beads[i] = nullptr;
}
/* ---------------------------------------------------------------------- */
@ -610,65 +629,63 @@ void FixPIMD::comm_exec(double **ptr)
{
int nlocal = atom->nlocal;
if (nlocal > max_nlocal)
{
max_nlocal = nlocal+200;
if (nlocal > max_nlocal) {
max_nlocal = nlocal + 200;
int size = sizeof(double) * max_nlocal * 3;
buf_recv = (double*) memory->srealloc(buf_recv, size, "FixPIMD:x_recv");
buf_recv = (double *) memory->srealloc(buf_recv, size, "FixPIMD:x_recv");
for (int i=0; i<np; i++)
buf_beads[i] = (double*) memory->srealloc(buf_beads[i], size, "FixPIMD:x_beads[i]");
for (int i = 0; i < np; i++)
buf_beads[i] = (double *) memory->srealloc(buf_beads[i], size, "FixPIMD:x_beads[i]");
}
// copy local positions
memcpy(buf_beads[universe->iworld], &(ptr[0][0]), sizeof(double)*nlocal*3);
memcpy(buf_beads[universe->iworld], &(ptr[0][0]), sizeof(double) * nlocal * 3);
// go over comm plans
for (int iplan = 0; iplan<size_plan; iplan++)
{
for (int iplan = 0; iplan < size_plan; iplan++) {
// sendrecv nlocal
int nsend;
MPI_Sendrecv( &(nlocal), 1, MPI_INT, plan_send[iplan], 0,
&(nsend), 1, MPI_INT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE);
MPI_Sendrecv(&(nlocal), 1, MPI_INT, plan_send[iplan], 0, &(nsend), 1, MPI_INT, plan_recv[iplan],
0, universe->uworld, MPI_STATUS_IGNORE);
// allocate arrays
if (nsend > max_nsend)
{
max_nsend = nsend+200;
tag_send = (tagint*) memory->srealloc(tag_send, sizeof(tagint)*max_nsend, "FixPIMD:tag_send");
buf_send = (double*) memory->srealloc(buf_send, sizeof(double)*max_nsend*3, "FixPIMD:x_send");
if (nsend > max_nsend) {
max_nsend = nsend + 200;
tag_send =
(tagint *) memory->srealloc(tag_send, sizeof(tagint) * max_nsend, "FixPIMD:tag_send");
buf_send =
(double *) memory->srealloc(buf_send, sizeof(double) * max_nsend * 3, "FixPIMD:x_send");
}
// send tags
MPI_Sendrecv( atom->tag, nlocal, MPI_LMP_TAGINT, plan_send[iplan], 0,
tag_send, nsend, MPI_LMP_TAGINT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE);
MPI_Sendrecv(atom->tag, nlocal, MPI_LMP_TAGINT, plan_send[iplan], 0, tag_send, nsend,
MPI_LMP_TAGINT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE);
// wrap positions
double *wrap_ptr = buf_send;
int ncpy = sizeof(double)*3;
int ncpy = sizeof(double) * 3;
for (int i=0; i<nsend; i++)
{
for (int i = 0; i < nsend; i++) {
int index = atom->map(tag_send[i]);
if (index<0)
{
if (index < 0) {
char error_line[256];
sprintf(error_line, "Atom " TAGINT_FORMAT " is missing at world [%d] "
"rank [%d] required by rank [%d] (" TAGINT_FORMAT ", "
TAGINT_FORMAT ", " TAGINT_FORMAT ").\n", tag_send[i],
universe->iworld, comm->me, plan_recv[iplan],
atom->tag[0], atom->tag[1], atom->tag[2]);
sprintf(error_line,
"Atom " TAGINT_FORMAT " is missing at world [%d] "
"rank [%d] required by rank [%d] (" TAGINT_FORMAT ", " TAGINT_FORMAT
", " TAGINT_FORMAT ").\n",
tag_send[i], universe->iworld, comm->me, plan_recv[iplan], atom->tag[0],
atom->tag[1], atom->tag[2]);
error->universe_one(FLERR,error_line);
error->universe_one(FLERR, error_line);
}
memcpy(wrap_ptr, ptr[index], ncpy);
@ -677,21 +694,20 @@ void FixPIMD::comm_exec(double **ptr)
// sendrecv x
MPI_Sendrecv( buf_send, nsend*3, MPI_DOUBLE, plan_recv[iplan], 0,
buf_recv, nlocal*3, MPI_DOUBLE, plan_send[iplan], 0, universe->uworld, MPI_STATUS_IGNORE);
MPI_Sendrecv(buf_send, nsend * 3, MPI_DOUBLE, plan_recv[iplan], 0, buf_recv, nlocal * 3,
MPI_DOUBLE, plan_send[iplan], 0, universe->uworld, MPI_STATUS_IGNORE);
// copy x
memcpy(buf_beads[mode_index[iplan]], buf_recv, sizeof(double)*nlocal*3);
memcpy(buf_beads[mode_index[iplan]], buf_recv, sizeof(double) * nlocal * 3);
}
}
/* ---------------------------------------------------------------------- */
int FixPIMD::pack_forward_comm(int n, int *list, double *buf,
int /*pbc_flag*/, int * /*pbc*/)
int FixPIMD::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/)
{
int i,j,m;
int i, j, m;
m = 0;
@ -709,7 +725,7 @@ int FixPIMD::pack_forward_comm(int n, int *list, double *buf,
void FixPIMD::unpack_forward_comm(int n, int first, double *buf)
{
int i,m,last;
int i, m, last;
m = 0;
last = first + n;
@ -726,47 +742,51 @@ void FixPIMD::unpack_forward_comm(int n, int first, double *buf)
double FixPIMD::memory_usage()
{
return (double)atom->nmax * size_peratom_cols * sizeof(double);
return (double) atom->nmax * size_peratom_cols * sizeof(double);
}
/* ---------------------------------------------------------------------- */
void FixPIMD::grow_arrays(int nmax)
{
if (nmax==0) return;
int count = nmax*3;
if (nmax == 0) return;
int count = nmax * 3;
memory->grow(array_atom, nmax, size_peratom_cols, "FixPIMD::array_atom");
memory->grow(nhc_eta, count, nhc_nchain, "FixPIMD::nh_eta");
memory->grow(nhc_eta_dot, count, nhc_nchain+1, "FixPIMD::nh_eta_dot");
memory->grow(nhc_eta_dotdot, count, nhc_nchain, "FixPIMD::nh_eta_dotdot");
memory->grow(nhc_eta_mass, count, nhc_nchain, "FixPIMD::nh_eta_mass");
memory->grow(nhc_eta, count, nhc_nchain, "FixPIMD::nh_eta");
memory->grow(nhc_eta_dot, count, nhc_nchain + 1, "FixPIMD::nh_eta_dot");
memory->grow(nhc_eta_dotdot, count, nhc_nchain, "FixPIMD::nh_eta_dotdot");
memory->grow(nhc_eta_mass, count, nhc_nchain, "FixPIMD::nh_eta_mass");
}
/* ---------------------------------------------------------------------- */
void FixPIMD::copy_arrays(int i, int j, int /*delflag*/)
{
int i_pos = i*3;
int j_pos = j*3;
int i_pos = i * 3;
int j_pos = j * 3;
memcpy(nhc_eta [j_pos], nhc_eta [i_pos], nhc_size_one_1);
memcpy(nhc_eta_dot [j_pos], nhc_eta_dot [i_pos], nhc_size_one_2);
memcpy(nhc_eta[j_pos], nhc_eta[i_pos], nhc_size_one_1);
memcpy(nhc_eta_dot[j_pos], nhc_eta_dot[i_pos], nhc_size_one_2);
memcpy(nhc_eta_dotdot[j_pos], nhc_eta_dotdot[i_pos], nhc_size_one_1);
memcpy(nhc_eta_mass [j_pos], nhc_eta_mass [i_pos], nhc_size_one_1);
memcpy(nhc_eta_mass[j_pos], nhc_eta_mass[i_pos], nhc_size_one_1);
}
/* ---------------------------------------------------------------------- */
int FixPIMD::pack_exchange(int i, double *buf)
{
int offset=0;
int offset = 0;
int pos = i * 3;
memcpy(buf+offset, nhc_eta[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf+offset, nhc_eta_dot[pos], nhc_size_one_2); offset += nhc_offset_one_2;
memcpy(buf+offset, nhc_eta_dotdot[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf+offset, nhc_eta_mass[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta_dot[pos], nhc_size_one_2);
offset += nhc_offset_one_2;
memcpy(buf + offset, nhc_eta_dotdot[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta_mass[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
return size_peratom_cols;
}
@ -775,13 +795,17 @@ int FixPIMD::pack_exchange(int i, double *buf)
int FixPIMD::unpack_exchange(int nlocal, double *buf)
{
int offset=0;
int pos = nlocal*3;
int offset = 0;
int pos = nlocal * 3;
memcpy(nhc_eta[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(nhc_eta_dot[pos], buf+offset, nhc_size_one_2); offset += nhc_offset_one_2;
memcpy(nhc_eta_dotdot[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(nhc_eta_mass[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(nhc_eta[pos], buf + offset, nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(nhc_eta_dot[pos], buf + offset, nhc_size_one_2);
offset += nhc_offset_one_2;
memcpy(nhc_eta_dotdot[pos], buf + offset, nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(nhc_eta_mass[pos], buf + offset, nhc_size_one_1);
offset += nhc_offset_one_1;
return size_peratom_cols;
}
@ -790,17 +814,21 @@ int FixPIMD::unpack_exchange(int nlocal, double *buf)
int FixPIMD::pack_restart(int i, double *buf)
{
int offset=0;
int offset = 0;
int pos = i * 3;
// pack buf[0] this way because other fixes unpack it
buf[offset++] = size_peratom_cols+1;
buf[offset++] = size_peratom_cols + 1;
memcpy(buf+offset, nhc_eta[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf+offset, nhc_eta_dot[pos], nhc_size_one_2); offset += nhc_offset_one_2;
memcpy(buf+offset, nhc_eta_dotdot[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf+offset, nhc_eta_mass[pos], nhc_size_one_1); offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta_dot[pos], nhc_size_one_2);
offset += nhc_offset_one_2;
memcpy(buf + offset, nhc_eta_dotdot[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
memcpy(buf + offset, nhc_eta_mass[pos], nhc_size_one_1);
offset += nhc_offset_one_1;
return size_peratom_cols+1;
return size_peratom_cols + 1;
}
/* ---------------------------------------------------------------------- */
@ -813,15 +841,19 @@ void FixPIMD::unpack_restart(int nlocal, int nth)
// 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<int> (extra[nlocal][m]);
for (int i = 0; i < nth; i++) m += static_cast<int>(extra[nlocal][m]);
m++;
int pos = nlocal * 3;
memcpy(nhc_eta[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1;
memcpy(nhc_eta_dot[pos], extra[nlocal]+m, nhc_size_one_2); m += nhc_offset_one_2;
memcpy(nhc_eta_dotdot[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1;
memcpy(nhc_eta_mass[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1;
memcpy(nhc_eta[pos], extra[nlocal] + m, nhc_size_one_1);
m += nhc_offset_one_1;
memcpy(nhc_eta_dot[pos], extra[nlocal] + m, nhc_size_one_2);
m += nhc_offset_one_2;
memcpy(nhc_eta_dotdot[pos], extra[nlocal] + m, nhc_size_one_1);
m += nhc_offset_one_1;
memcpy(nhc_eta_mass[pos], extra[nlocal] + m, nhc_size_one_1);
m += nhc_offset_one_1;
nhc_ready = true;
}
@ -830,21 +862,21 @@ void FixPIMD::unpack_restart(int nlocal, int nth)
int FixPIMD::maxsize_restart()
{
return size_peratom_cols+1;
return size_peratom_cols + 1;
}
/* ---------------------------------------------------------------------- */
int FixPIMD::size_restart(int /*nlocal*/)
{
return size_peratom_cols+1;
return size_peratom_cols + 1;
}
/* ---------------------------------------------------------------------- */
double FixPIMD::compute_vector(int n)
{
if (n==0) { return spring_energy; }
if (n==1) { return t_sys; }
if (n == 0) { return spring_energy; }
if (n == 1) { return t_sys; }
return 0.0;
}

View File

@ -27,6 +27,7 @@ namespace LAMMPS_NS {
class FixPIMD : public Fix {
public:
FixPIMD(class LAMMPS *, int, char **);
virtual ~FixPIMD();
int setmask();

View File

@ -94,7 +94,8 @@ NEB::~NEB()
{
MPI_Comm_free(&roots);
memory->destroy(all);
delete [] rdist;
delete[] rdist;
if (fp) fclose(fp);
}
/* ----------------------------------------------------------------------
@ -379,8 +380,8 @@ void NEB::readfile(char *file, int flag)
char line[MAXLINE];
double xx,yy,zz,delx,dely,delz;
if (me_universe == 0 && screen)
fprintf(screen,"Reading NEB coordinate file(s) ...\n");
if (me_universe == 0 && universe->uscreen)
fprintf(universe->uscreen,"Reading NEB coordinate file(s) ...\n");
// flag = 0, universe root reads header of file, bcast to universe
// flag = 1, each replica's root reads header of file, bcast to world
@ -534,6 +535,7 @@ void NEB::readfile(char *file, int flag)
else fclose(fp);
}
}
fp = nullptr;
}
/* ----------------------------------------------------------------------

View File

@ -78,7 +78,8 @@ NEBSpin::~NEBSpin()
{
MPI_Comm_free(&roots);
memory->destroy(all);
delete [] rdist;
delete[] rdist;
if (fp) fclose(fp);
}
/* ----------------------------------------------------------------------
@ -373,8 +374,8 @@ void NEBSpin::readfile(char *file, int flag)
double xx,yy,zz;
double musp,spx,spy,spz;
if (me_universe == 0 && screen)
fprintf(screen,"Reading NEBSpin coordinate file(s) ...\n");
if (me_universe == 0 && universe->uscreen)
fprintf(universe->uscreen,"Reading NEBSpin coordinate file(s) ...\n");
// flag = 0, universe root reads header of file, bcast to universe
// flag = 1, each replica's root reads header of file, bcast to world
@ -546,8 +547,8 @@ void NEBSpin::readfile(char *file, int flag)
// clean up
delete [] buffer;
delete [] values;
delete[] buffer;
delete[] values;
if (flag == 0) {
if (me_universe == 0) {
@ -560,6 +561,7 @@ void NEBSpin::readfile(char *file, int flag)
else fclose(fp);
}
}
fp = nullptr;
}
/* ----------------------------------------------------------------------

View File

@ -30,7 +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() > 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))
@ -46,10 +47,11 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde
name = arg;
return;
}
const int offset = (arg[1] == '_') ? 2 : 3;
std::size_t has_idx1 = arg.find('[', 2);
std::size_t has_idx1 = arg.find('[', offset);
if (has_idx1 != std::string::npos) {
name = arg.substr(2, has_idx1 - 2);
name = arg.substr(offset, has_idx1 - offset);
dim = 1;
std::size_t has_idx2 = arg.find('[', has_idx1 + 1);
@ -79,7 +81,7 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde
}
} else {
index1 = 0;
name = arg.substr(2);
name = arg.substr(offset);
}
} else {
index1 = 0;

View File

@ -29,7 +29,7 @@ enum { MASSCENTER, GEOMCENTER };
ComputeDipole::ComputeDipole(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg)
{
if (narg != 3) error->all(FLERR, "Illegal compute com command");
if ((narg < 3) || (narg > 4)) error->all(FLERR, "Illegal compute dipole command");
scalar_flag = 1;
vector_flag = 1;
@ -39,11 +39,8 @@ ComputeDipole::ComputeDipole(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, n
vector = new double[size_vector];
vector[0] = vector[1] = vector[2] = 0.0;
usecenter = MASSCENTER;
if ((narg != 3) && (narg != 4)) error->all(FLERR, "Illegal compute dipole command");
if (narg == 4) {
if (utils::strmatch(arg[3], "^geom"))
usecenter = GEOMCENTER;

View File

@ -44,7 +44,7 @@ using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
ReadRestart::ReadRestart(LAMMPS *lmp) : Command(lmp) {}
ReadRestart::ReadRestart(LAMMPS *lmp) : Command(lmp), mpiio(nullptr) {}
/* ---------------------------------------------------------------------- */
@ -110,8 +110,7 @@ void ReadRestart::command(int narg, char **arg)
}
fp = fopen(hfile.c_str(),"rb");
if (fp == nullptr)
error->one(FLERR,"Cannot open restart file {}: {}",
hfile, utils::getsyserror());
error->one(FLERR,"Cannot open restart file {}: {}", hfile, utils::getsyserror());
}
// read magic string, endian flag, format revision
@ -336,8 +335,7 @@ void ReadRestart::command(int narg, char **arg)
procfile.replace(procfile.find("%"),1,fmt::format("{}",icluster));
fp = fopen(procfile.c_str(),"rb");
if (fp == nullptr)
error->one(FLERR,"Cannot open restart file {}: {}",
procfile, utils::getsyserror());
error->one(FLERR,"Cannot open restart file {}: {}", procfile, utils::getsyserror());
}
int procsperfile;
@ -401,7 +399,7 @@ void ReadRestart::command(int narg, char **arg)
// clean-up memory
delete [] file;
delete[] file;
memory->destroy(buf);
// for multiproc or MPI-IO files:
@ -525,8 +523,9 @@ void ReadRestart::command(int narg, char **arg)
MPI_Barrier(world);
if (comm->me == 0)
utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n",
MPI_Wtime()-time1);
utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n",MPI_Wtime()-time1);
delete mpiio;
}
/* ----------------------------------------------------------------------
@ -599,7 +598,7 @@ void ReadRestart::header()
if (me == 0)
utils::logmesg(lmp," restart file = {}, LAMMPS = {}\n",
version,lmp->version);
delete [] version;
delete[] version;
// we have no forward compatibility, thus exit with error
@ -638,7 +637,7 @@ void ReadRestart::header()
} else if (flag == UNITS) {
char *style = read_string();
if (strcmp(style,update->unit_style) != 0) update->set_units(style);
delete [] style;
delete[] style;
} else if (flag == NTIMESTEP) {
update->ntimestep = read_bigint();
@ -772,9 +771,9 @@ void ReadRestart::header()
atom->create_avec(style,nargcopy,argcopy,1);
if (comm->me ==0)
utils::logmesg(lmp," restoring atom style {} from restart\n",style);
for (int i = 0; i < nargcopy; i++) delete [] argcopy[i];
delete [] argcopy;
delete [] style;
for (int i = 0; i < nargcopy; i++) delete[] argcopy[i];
delete[] argcopy;
delete[] style;
} else if (flag == NATOMS) {
atom->natoms = read_bigint();
@ -889,7 +888,7 @@ void ReadRestart::type_arrays()
double *mass = new double[atom->ntypes+1];
read_double_vec(atom->ntypes,&mass[1]);
atom->set_mass(mass);
delete [] mass;
delete[] mass;
} else error->all(FLERR,
"Invalid flag in type arrays section of restart file");
@ -910,7 +909,7 @@ void ReadRestart::force_fields()
if (flag == PAIR) {
style = read_string();
force->create_pair(style,1);
delete [] style;
delete[] style;
if (comm->me ==0)
utils::logmesg(lmp," restoring pair style {} from restart\n",
force->pair_style);
@ -926,7 +925,7 @@ void ReadRestart::force_fields()
} else if (flag == BOND) {
style = read_string();
force->create_bond(style,1);
delete [] style;
delete[] style;
if (comm->me ==0)
utils::logmesg(lmp," restoring bond style {} from restart\n",
force->bond_style);
@ -935,7 +934,7 @@ void ReadRestart::force_fields()
} else if (flag == ANGLE) {
style = read_string();
force->create_angle(style,1);
delete [] style;
delete[] style;
if (comm->me ==0)
utils::logmesg(lmp," restoring angle style {} from restart\n",
force->angle_style);
@ -944,7 +943,7 @@ void ReadRestart::force_fields()
} else if (flag == DIHEDRAL) {
style = read_string();
force->create_dihedral(style,1);
delete [] style;
delete[] style;
if (comm->me ==0)
utils::logmesg(lmp," restoring dihedral style {} from restart\n",
force->dihedral_style);
@ -953,7 +952,7 @@ void ReadRestart::force_fields()
} else if (flag == IMPROPER) {
style = read_string();
force->create_improper(style,1);
delete [] style;
delete[] style;
if (comm->me ==0)
utils::logmesg(lmp," restoring improper style {} from restart\n",
force->improper_style);
@ -1117,7 +1116,7 @@ void ReadRestart::magic_string()
MPI_Bcast(str,n,MPI_CHAR,0,world);
if (strcmp(str,MAGIC_STRING) != 0)
error->all(FLERR,"Invalid LAMMPS restart file");
delete [] str;
delete[] str;
}
/* ----------------------------------------------------------------------
@ -1164,7 +1163,7 @@ void ReadRestart::check_eof_magic()
if (strcmp(str,MAGIC_STRING) != 0)
error->all(FLERR,"Incomplete or corrupted LAMMPS restart file");
delete [] str;
delete[] str;
}
/* ----------------------------------------------------------------------

View File

@ -177,20 +177,23 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp)
char dummy[MAXDUMMY];
char *ptr = fgets(buf, size, fp);
// EOF
// EOF?
if (!ptr) return nullptr;
int n = strlen(buf);
// line is shorter than buffer, append newline if needed,
if (n < size - 2) {
// check the string being read in:
// - if string is shorter than the buffer make sure it has a final newline and return
// - if string is exactly the size of the buffer and has a final newline return
// - otherwise truncate with final newline and read into dummy buffer until EOF or newline is found
if (n < size - 1) {
if (buf[n - 1] != '\n') {
buf[n] = '\n';
buf[n + 1] = '\0';
}
return buf;
// line fits exactly. overwrite last but one character.
} else if (buf[n - 1] == '\n') {
return buf;
} else
buf[size - 2] = '\n';
@ -203,15 +206,15 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp)
n = 0;
} while (n == MAXDUMMY - 1 && ptr[MAXDUMMY - 1] != '\n');
// return first chunk
// return truncated chunk
return buf;
}
#define MAXPATHLENBUF 1024
/* like fgets() but aborts with an error or EOF is encountered */
void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp,
const char *filename, Error *error)
{
constexpr int MAXPATHLENBUF=1024;
char *rv = fgets(s, size, fp);
if (rv == nullptr) { // something went wrong
char buf[MAXPATHLENBUF];
@ -240,6 +243,7 @@ void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp
void utils::sfread(const char *srcname, int srcline, void *s, size_t size, size_t num, FILE *fp,
const char *filename, Error *error)
{
constexpr int MAXPATHLENBUF=1024;
size_t rv = fread(s, size, num, fp);
if (rv != num) { // something went wrong
char buf[MAXPATHLENBUF];
@ -1093,11 +1097,6 @@ bool utils::file_is_readable(const std::string &path)
search current directory and the LAMMPS_POTENTIALS directory if
specified
------------------------------------------------------------------------- */
#if defined(_WIN32)
#define OS_PATH_VAR_SEP ";"
#else
#define OS_PATH_VAR_SEP ":"
#endif
std::string utils::get_potential_file_path(const std::string &path)
{
@ -1111,8 +1110,11 @@ std::string utils::get_potential_file_path(const std::string &path)
const char *var = getenv("LAMMPS_POTENTIALS");
if (var != nullptr) {
Tokenizer dirs(var, OS_PATH_VAR_SEP);
#if defined(_WIN32)
Tokenizer dirs(var, ";");
#else
Tokenizer dirs(var, ":");
#endif
while (dirs.has_next()) {
auto pot = utils::path_basename(filepath);
auto dir = dirs.next();
@ -1124,7 +1126,6 @@ std::string utils::get_potential_file_path(const std::string &path)
}
return "";
}
#undef OS_PATH_VAR_SEP
/* ----------------------------------------------------------------------
read first line of potential file

View File

@ -74,7 +74,8 @@ protected:
}
};
#define MAX_BUF_SIZE 128
static constexpr int MAX_BUF_SIZE=128;
TEST_F(FileOperationsTest, safe_fgets)
{
char buf[MAX_BUF_SIZE];
@ -110,7 +111,6 @@ TEST_F(FileOperationsTest, safe_fgets)
fclose(fp);
}
#define MAX_BUF_SIZE 128
TEST_F(FileOperationsTest, fgets_trunc)
{
char buf[MAX_BUF_SIZE];
@ -119,13 +119,15 @@ TEST_F(FileOperationsTest, fgets_trunc)
FILE *fp = fopen("safe_file_read_test.txt", "rb");
ASSERT_NE(fp, nullptr);
// read line shorter than buffer
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);
// read line of exactly the buffer length
memset(buf, 0, MAX_BUF_SIZE);
ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp);
ptr = utils::fgets_trunc(buf, sizeof("two_lines\n"), fp);
ASSERT_THAT(buf, StrEq("two_lines\n"));
ASSERT_NE(ptr,nullptr);
@ -172,7 +174,6 @@ TEST_F(FileOperationsTest, fgets_trunc)
fclose(fp);
}
#define MAX_BUF_SIZE 128
TEST_F(FileOperationsTest, safe_fread)
{
char buf[MAX_BUF_SIZE];

View File

@ -169,6 +169,16 @@ TEST(ArgInfo, variable2)
ASSERT_THAT(arg.get_name(), StrEq("x"));
}
TEST(ArgInfo, variable3)
{
ArgInfo arg("v_x[11][5]");
ASSERT_EQ(arg.get_dim(), 2);
ASSERT_EQ(arg.get_type(), ArgInfo::VARIABLE);
ASSERT_EQ(arg.get_index1(), 11);
ASSERT_EQ(arg.get_index2(), 5);
ASSERT_THAT(arg.get_name(), StrEq("x"));
}
TEST(ArgInfo, dname0)
{
ArgInfo arg("d_text", ArgInfo::DNAME);
@ -179,6 +189,36 @@ TEST(ArgInfo, dname0)
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, dname1)
{
ArgInfo arg("d2_text", ArgInfo::DNAME | ArgInfo::INAME);
ASSERT_EQ(arg.get_dim(), 0);
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
ASSERT_EQ(arg.get_index1(), 0);
ASSERT_EQ(arg.get_index2(), -1);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, dname2)
{
ArgInfo arg("d2_text[11]", ArgInfo::DNAME);
ASSERT_EQ(arg.get_dim(), 1);
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
ASSERT_EQ(arg.get_index1(), 11);
ASSERT_EQ(arg.get_index2(), -1);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, dname3)
{
ArgInfo arg("d2_text[24][11]", ArgInfo::DNAME);
ASSERT_EQ(arg.get_dim(), 2);
ASSERT_EQ(arg.get_type(), ArgInfo::DNAME);
ASSERT_EQ(arg.get_index1(), 24);
ASSERT_EQ(arg.get_index2(), 11);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, iname0)
{
ArgInfo arg("i_text", ArgInfo::INAME);
@ -189,6 +229,36 @@ TEST(ArgInfo, iname0)
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, iname1)
{
ArgInfo arg("i2_text", ArgInfo::INAME);
ASSERT_EQ(arg.get_dim(), 0);
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
ASSERT_EQ(arg.get_index1(), 0);
ASSERT_EQ(arg.get_index2(), -1);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, iname2)
{
ArgInfo arg("i2_text[2]", ArgInfo::INAME | ArgInfo::DNAME);
ASSERT_EQ(arg.get_dim(), 1);
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
ASSERT_EQ(arg.get_index1(), 2);
ASSERT_EQ(arg.get_index2(), -1);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, iname3)
{
ArgInfo arg("i2_text[2][100]", ArgInfo::INAME | ArgInfo::DNAME);
ASSERT_EQ(arg.get_dim(), 2);
ASSERT_EQ(arg.get_type(), ArgInfo::INAME);
ASSERT_EQ(arg.get_index1(), 2);
ASSERT_EQ(arg.get_index2(), 100);
ASSERT_THAT(arg.get_name(), StrEq("text"));
}
TEST(ArgInfo, unsupported1)
{
ArgInfo arg("v_text[02][05]", ArgInfo::COMPUTE | ArgInfo::FIX);