when using "write_data" with "noinit" and "pair ij" generate missing pair coeffs by calling Pair::init_one()
This commit is contained in:
@ -42,11 +42,7 @@ enum{ELLIPSOID,LINE,TRIANGLE,BODY}; // also in AtomVecHybrid
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
WriteData::WriteData(LAMMPS *lmp) : Command(lmp)
|
||||
{
|
||||
MPI_Comm_rank(world,&me);
|
||||
MPI_Comm_size(world,&nprocs);
|
||||
}
|
||||
WriteData::WriteData(LAMMPS *lmp) : Command(lmp) {}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
called as write_data command in input script
|
||||
@ -74,12 +70,12 @@ void WriteData::command(int narg, char **arg)
|
||||
fixflag = 1;
|
||||
triclinic_general = 0;
|
||||
lmapflag = 1;
|
||||
noinitflag = 0;
|
||||
|
||||
// store current (default) setting since we may change it
|
||||
|
||||
int domain_triclinic_general = domain->triclinic_general;
|
||||
int types_style = atom->types_style;
|
||||
int noinit = 0;
|
||||
|
||||
int iarg = 1;
|
||||
while (iarg < narg) {
|
||||
@ -90,7 +86,7 @@ void WriteData::command(int narg, char **arg)
|
||||
else error->all(FLERR,"Unknown write_data pair option: {}", arg[iarg+1]);
|
||||
iarg += 2;
|
||||
} else if (strcmp(arg[iarg],"noinit") == 0) {
|
||||
noinit = 1;
|
||||
noinitflag = 1;
|
||||
iarg++;
|
||||
} else if (strcmp(arg[iarg],"nocoeff") == 0) {
|
||||
coeffflag = 0;
|
||||
@ -130,7 +126,7 @@ void WriteData::command(int narg, char **arg)
|
||||
// pair->init() can fail due to various unset values:
|
||||
// e.g. pair hybrid coeffs, dpd ghost-atom velocity setting
|
||||
|
||||
if (noinit == 0) {
|
||||
if (noinitflag == 0) {
|
||||
if (comm->me == 0) utils::logmesg(lmp,"System init for write_data ...\n");
|
||||
lmp->init();
|
||||
|
||||
@ -206,7 +202,7 @@ void WriteData::write(const std::string &file)
|
||||
|
||||
// open data file
|
||||
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
fp = fopen(file.c_str(),"w");
|
||||
if (fp == nullptr)
|
||||
error->one(FLERR,"Cannot open data file {}: {}", file, utils::getsyserror());
|
||||
@ -215,7 +211,7 @@ void WriteData::write(const std::string &file)
|
||||
// proc 0 writes header, ntype-length arrays, force fields
|
||||
// label map must come before coeffs
|
||||
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
header();
|
||||
if (lmapflag && atom->labelmapflag) atom->lmap->write_data(fp);
|
||||
type_arrays();
|
||||
@ -234,7 +230,7 @@ void WriteData::write(const std::string &file)
|
||||
if (atom->tag_enable) {
|
||||
if (natoms) velocities();
|
||||
} else {
|
||||
if (me == 0)
|
||||
if (comm->me == 0)
|
||||
error->warning(FLERR, "Not writing Velocities section of data file without atom IDs");
|
||||
}
|
||||
|
||||
@ -269,7 +265,7 @@ void WriteData::write(const std::string &file)
|
||||
|
||||
// close data file
|
||||
|
||||
if (me == 0) fclose(fp);
|
||||
if (comm->me == 0) fclose(fp);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -370,6 +366,15 @@ void WriteData::force_fields()
|
||||
fmt::print(fp,"\nPair Coeffs # {}\n\n", force->pair_style);
|
||||
force->pair->write_data(fp);
|
||||
} else if (pairflag == IJ) {
|
||||
// try computing mixed pair coeffs in case we skipped lmp->init()
|
||||
// this block of code is currently only accessed from LAMMPS-GUI's restart inspector
|
||||
if (force->pair->allocated && noinitflag) {
|
||||
if (comm->me == 0) error->warning(FLERR,"Computing missing pair coeffs from mixing");
|
||||
for (int i=1; i < atom->ntypes; ++i)
|
||||
for (int j=i; j <=atom->ntypes; ++j)
|
||||
if (!force->pair->setflag[i][j])
|
||||
force->pair->init_one(i, j);
|
||||
}
|
||||
fmt::print(fp,"\nPairIJ Coeffs # {}\n\n", force->pair_style);
|
||||
force->pair->write_data_all(fp);
|
||||
}
|
||||
@ -407,7 +412,7 @@ void WriteData::atoms()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
double **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my atom data into buf
|
||||
@ -420,12 +425,12 @@ void WriteData::atoms()
|
||||
|
||||
int tmp,recvrow;
|
||||
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fmt::print(fp,"\nAtoms # {}\n\n",atom->atom_style);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_DOUBLE,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -460,7 +465,7 @@ void WriteData::velocities()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
double **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my velocity data into buf
|
||||
@ -473,12 +478,12 @@ void WriteData::velocities()
|
||||
|
||||
int tmp,recvrow;
|
||||
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fputs("\nVelocities\n\n",fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_DOUBLE,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -513,7 +518,7 @@ void WriteData::bonds()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
tagint **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my bond data into buf
|
||||
@ -527,12 +532,12 @@ void WriteData::bonds()
|
||||
int tmp,recvrow;
|
||||
|
||||
int index = 1;
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fputs("\nBonds\n\n",fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_LMP_TAGINT,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -568,7 +573,7 @@ void WriteData::angles()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
tagint **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my angle data into buf
|
||||
@ -582,12 +587,12 @@ void WriteData::angles()
|
||||
int tmp,recvrow;
|
||||
|
||||
int index = 1;
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fputs("\nAngles\n\n",fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_LMP_TAGINT,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -623,7 +628,7 @@ void WriteData::dihedrals()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
tagint **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my dihedral data into buf
|
||||
@ -637,12 +642,12 @@ void WriteData::dihedrals()
|
||||
int tmp,recvrow;
|
||||
|
||||
int index = 1;
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fputs("\nDihedrals\n\n",fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_LMP_TAGINT,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -678,7 +683,7 @@ void WriteData::impropers()
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
tagint **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my improper data into buf
|
||||
@ -692,12 +697,12 @@ void WriteData::impropers()
|
||||
int tmp,recvrow;
|
||||
|
||||
int index = 1;
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
fputs("\nImpropers\n\n",fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_LMP_TAGINT,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -733,7 +738,7 @@ void WriteData::bonus(int flag)
|
||||
MPI_Allreduce(&nvalues,&maxvalues,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
double *buf = nullptr;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxvalues),"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxvalues),"write_data:buf");
|
||||
else memory->create(buf,MAX(1,nvalues),"write_data:buf");
|
||||
|
||||
// pack my bonus data into buf
|
||||
@ -746,7 +751,7 @@ void WriteData::bonus(int flag)
|
||||
|
||||
int tmp;
|
||||
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
@ -755,7 +760,7 @@ void WriteData::bonus(int flag)
|
||||
if (flag == TRIANGLE) fputs("\nTriangles\n\n",fp);
|
||||
if (flag == BODY) fputs("\nBodies\n\n",fp);
|
||||
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(buf,maxvalues,MPI_DOUBLE,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
@ -789,7 +794,7 @@ void WriteData::fix(Fix *ifix, int mth)
|
||||
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
|
||||
|
||||
double **buf;
|
||||
if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
if (comm->me == 0) memory->create(buf,MAX(1,maxrow),ncol,"write_data:buf");
|
||||
else memory->create(buf,MAX(1,sendrow),ncol,"write_data:buf");
|
||||
|
||||
// pack my fix data into buf
|
||||
@ -803,12 +808,12 @@ void WriteData::fix(Fix *ifix, int mth)
|
||||
int tmp,recvrow;
|
||||
|
||||
int index = 1;
|
||||
if (me == 0) {
|
||||
if (comm->me == 0) {
|
||||
MPI_Status status;
|
||||
MPI_Request request;
|
||||
|
||||
ifix->write_data_section_keyword(mth,fp);
|
||||
for (int iproc = 0; iproc < nprocs; iproc++) {
|
||||
for (int iproc = 0; iproc < comm->nprocs; iproc++) {
|
||||
if (iproc) {
|
||||
MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_DOUBLE,iproc,0,world,&request);
|
||||
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
|
||||
|
||||
@ -31,12 +31,12 @@ class WriteData : public Command {
|
||||
void write(const std::string &);
|
||||
|
||||
private:
|
||||
int me, nprocs;
|
||||
int pairflag;
|
||||
int coeffflag;
|
||||
int fixflag;
|
||||
int triclinic_general;
|
||||
int lmapflag;
|
||||
int noinitflag;
|
||||
FILE *fp;
|
||||
bigint nbonds_local, nbonds;
|
||||
bigint nangles_local, nangles;
|
||||
|
||||
Reference in New Issue
Block a user