diff --git a/src/FLD/pair_brownian.cpp b/src/FLD/pair_brownian.cpp index b4966dca52..1ff6dc2308 100755 --- a/src/FLD/pair_brownian.cpp +++ b/src/FLD/pair_brownian.cpp @@ -115,8 +115,8 @@ void PairBrownian::compute(int eflag, int vflag) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -503,7 +503,7 @@ void PairBrownian::init_style() flagdeform = 1; else if (strstr(modify->fix[i]->style,"wall") != NULL){ flagwall = 1; // Walls exist - if (((FixWall *) modify->fix[i])->varflag ) { + if (((FixWall *) modify->fix[i])->xflag ) { flagwall = 2; // Moving walls exist wallfix = (FixWall *) modify->fix[i]; } @@ -523,10 +523,10 @@ void PairBrownian::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); // Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/FLD/pair_brownian_poly.cpp b/src/FLD/pair_brownian_poly.cpp index 379f2a7ce9..444ccd7442 100644 --- a/src/FLD/pair_brownian_poly.cpp +++ b/src/FLD/pair_brownian_poly.cpp @@ -101,8 +101,8 @@ void PairBrownianPoly::compute(int eflag, int vflag) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -363,10 +363,10 @@ void PairBrownianPoly::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); // Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/FLD/pair_lubricate.cpp b/src/FLD/pair_lubricate.cpp index 570f6b4eed..0c473e470c 100755 --- a/src/FLD/pair_lubricate.cpp +++ b/src/FLD/pair_lubricate.cpp @@ -181,8 +181,8 @@ void PairLubricate::compute(int eflag, int vflag) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -597,7 +597,7 @@ void PairLubricate::init_style() } if (strstr(modify->fix[i]->style,"wall") != NULL){ flagwall = 1; // Walls exist - if (((FixWall *) modify->fix[i])->varflag ) { + if (((FixWall *) modify->fix[i])->xflag ) { flagwall = 2; // Moving walls exist wallfix = (FixWall *) modify->fix[i]; } @@ -619,10 +619,10 @@ void PairLubricate::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); //Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/FLD/pair_lubricateU.cpp b/src/FLD/pair_lubricateU.cpp index 67c1aeac8b..eb3772451a 100644 --- a/src/FLD/pair_lubricateU.cpp +++ b/src/FLD/pair_lubricateU.cpp @@ -627,8 +627,8 @@ void PairLubricateU::compute_Fh(double **x) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -866,8 +866,8 @@ void PairLubricateU::compute_RU() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -1143,8 +1143,8 @@ void PairLubricateU::compute_RU(double **x) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -1879,7 +1879,7 @@ void PairLubricateU::init_style() flagdeform = 1; else if (strstr(modify->fix[i]->style,"wall") != NULL){ flagwall = 1; // Walls exist - if (((FixWall *) modify->fix[i])->varflag ) { + if (((FixWall *) modify->fix[i])->xflag ) { flagwall = 2; // Moving walls exist wallfix = (FixWall *) modify->fix[i]; } @@ -1899,10 +1899,10 @@ void PairLubricateU::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); //Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/FLD/pair_lubricateU_poly.cpp b/src/FLD/pair_lubricateU_poly.cpp index 19b4ae818c..2a451b3652 100644 --- a/src/FLD/pair_lubricateU_poly.cpp +++ b/src/FLD/pair_lubricateU_poly.cpp @@ -379,8 +379,8 @@ void PairLubricateUPoly::compute_Fh(double **x) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -660,8 +660,8 @@ void PairLubricateUPoly::compute_RU(double **x) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -1212,7 +1212,7 @@ void PairLubricateUPoly::init_style() flagdeform = 1; else if (strstr(modify->fix[i]->style,"wall") != NULL){ flagwall = 1; // Walls exist - if (((FixWall *) modify->fix[i])->varflag ) { + if (((FixWall *) modify->fix[i])->xflag ) { flagwall = 2; // Moving walls exist wallfix = (FixWall *) modify->fix[i]; } @@ -1233,10 +1233,10 @@ void PairLubricateUPoly::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); //Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/FLD/pair_lubricate_poly.cpp b/src/FLD/pair_lubricate_poly.cpp index 47909db667..f2aad523e0 100644 --- a/src/FLD/pair_lubricate_poly.cpp +++ b/src/FLD/pair_lubricate_poly.cpp @@ -165,8 +165,8 @@ void PairLubricatePoly::compute(int eflag, int vflag) for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; if (side == 0) walllo[dim] = wallcoord; @@ -492,7 +492,7 @@ void PairLubricatePoly::init_style() } if (strstr(modify->fix[i]->style,"wall") != NULL){ flagwall = 1; // Walls exist - if (((FixWall *) modify->fix[i])->varflag ) { + if (((FixWall *) modify->fix[i])->xflag ) { flagwall = 2; // Moving walls exist wallfix = (FixWall *) modify->fix[i]; } @@ -511,10 +511,10 @@ void PairLubricatePoly::init_style() for (int m = 0; m < wallfix->nwall; m++){ int dim = wallfix->wallwhich[m] / 2; int side = wallfix->wallwhich[m] % 2; - if (wallfix->wallstyle[m] == VARIABLE){ - wallfix->varindex[m] = input->variable->find(wallfix->varstr[m]); + if (wallfix->xstyle[m] == VARIABLE){ + wallfix->xindex[m] = input->variable->find(wallfix->xstr[m]); //Since fix->wall->init happens after pair->init_style - wallcoord = input->variable->compute_equal(wallfix->varindex[m]); + wallcoord = input->variable->compute_equal(wallfix->xindex[m]); } else wallcoord = wallfix->coord0[m]; diff --git a/src/fix_wall.cpp b/src/fix_wall.cpp index 4181c2c897..70fcbbea2c 100644 --- a/src/fix_wall.cpp +++ b/src/fix_wall.cpp @@ -49,6 +49,8 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : fldflag = 0; int pbcflag = 0; + for (int i = 0; i < 6; i++) xstr[i] = estr[i] = sstr[i] = NULL; + int iarg = 3; while (iarg < narg) { if ((strcmp(arg[iarg],"xlo") == 0) || (strcmp(arg[iarg],"xhi") == 0) || @@ -70,23 +72,41 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : wallwhich[nwall] = newwall; if (strcmp(arg[iarg+1],"EDGE") == 0) { - wallstyle[nwall] = EDGE; + xstyle[nwall] = EDGE; int dim = wallwhich[nwall] / 2; int side = wallwhich[nwall] % 2; if (side == 0) coord0[nwall] = domain->boxlo[dim]; else coord0[nwall] = domain->boxhi[dim]; } else if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) { - wallstyle[nwall] = VARIABLE; + xstyle[nwall] = VARIABLE; int n = strlen(&arg[iarg+1][2]) + 1; - varstr[nwall] = new char[n]; - strcpy(varstr[nwall],&arg[iarg+1][2]); + xstr[nwall] = new char[n]; + strcpy(xstr[nwall],&arg[iarg+1][2]); } else { - wallstyle[nwall] = CONSTANT; + xstyle[nwall] = CONSTANT; coord0[nwall] = atof(arg[iarg+1]); } - epsilon[nwall] = atof(arg[iarg+2]); - sigma[nwall] = atof(arg[iarg+3]); + if (strstr(arg[iarg+2],"v_") == arg[iarg+2]) { + int n = strlen(&arg[iarg+2][2]) + 1; + estr[nwall] = new char[n]; + strcpy(estr[nwall],&arg[iarg+2][2]); + estyle[nwall] = VARIABLE; + } else { + epsilon[nwall] = atof(arg[iarg+2]); + estyle[nwall] = CONSTANT; + } + + if (strstr(arg[iarg+3],"v_") == arg[iarg+3]) { + int n = strlen(&arg[iarg+3][2]) + 1; + sstr[nwall] = new char[n]; + strcpy(sstr[nwall],&arg[iarg+3][2]); + sstyle[nwall] = VARIABLE; + } else { + sigma[nwall] = atof(arg[iarg+3]); + sstyle[nwall] = CONSTANT; + } + cutoff[nwall] = atof(arg[iarg+4]); nwall++; iarg += 5; @@ -136,11 +156,11 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : } } - // scale factors for CONSTANT and VARIABLE walls + // scale factors for wall position for CONSTANT and VARIABLE walls int flag = 0; for (int m = 0; m < nwall; m++) - if (wallstyle[m] != EDGE) flag = 1; + if (xstyle[m] != EDGE) flag = 1; if (flag) { if (scaleflag && domain->lattice == NULL) @@ -154,18 +174,24 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : else xscale = yscale = zscale = 1.0; for (int m = 0; m < nwall; m++) { - if (wallstyle[m] != CONSTANT) continue; + if (xstyle[m] != CONSTANT) continue; if (wallwhich[m] < YLO) coord0[m] *= xscale; else if (wallwhich[m] < ZLO) coord0[m] *= yscale; else coord0[m] *= zscale; } } - // set varflag if any wall positions are variable + // set xflag if any wall positions are variable + // set vflag if any wall positions are variable + // set wstyle to VARIABLE if either epsilon or sigma is a variable - varflag = 0; - for (int m = 0; m < nwall; m++) - if (wallstyle[m] == VARIABLE) varflag = 1; + vflag = xflag = 0; + for (int m = 0; m < nwall; m++) { + if (xstyle[m] == VARIABLE) xflag = 1; + if (xflag || estyle[m] == VARIABLE || sstyle[m] == VARIABLE) vflag = 1; + if (estyle[m] == VARIABLE || sstyle[m] == VARIABLE) wstyle[m] = VARIABLE; + else wstyle[m] = CONSTANT; + } eflag = 0; for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; @@ -175,8 +201,11 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : FixWall::~FixWall() { - for (int m = 0; m < nwall; m++) - if (wallstyle[m] == VARIABLE) delete [] varstr[m]; + for (int m = 0; m < nwall; m++) { + delete [] xstr[m]; + delete [] estr[m]; + delete [] sstr[m]; + } } /* ---------------------------------------------------------------------- */ @@ -203,12 +232,27 @@ void FixWall::init() dt = update->dt; for (int m = 0; m < nwall; m++) { - if (wallstyle[m] != VARIABLE) continue; - varindex[m] = input->variable->find(varstr[m]); - if (varindex[m] < 0) - error->all(FLERR,"Variable name for fix wall does not exist"); - if (!input->variable->equalstyle(varindex[m])) - error->all(FLERR,"Variable for fix wall is invalid style"); + if (xstyle[m] == VARIABLE) { + xindex[m] = input->variable->find(xstr[m]); + if (xindex[m] < 0) + error->all(FLERR,"Variable name for fix wall does not exist"); + if (!input->variable->equalstyle(xindex[m])) + error->all(FLERR,"Variable for fix wall is invalid style"); + } + if (estyle[m] == VARIABLE) { + eindex[m] = input->variable->find(estr[m]); + if (eindex[m] < 0) + error->all(FLERR,"Variable name for fix wall does not exist"); + if (!input->variable->equalstyle(eindex[m])) + error->all(FLERR,"Variable for fix wall is invalid style"); + } + if (sstyle[m] == VARIABLE) { + sindex[m] = input->variable->find(sstr[m]); + if (sindex[m] < 0) + error->all(FLERR,"Variable name for fix wall does not exist"); + if (!input->variable->equalstyle(sindex[m])) + error->all(FLERR,"Variable for fix wall is invalid style"); + } } // setup coefficients @@ -256,23 +300,31 @@ void FixWall::post_force(int vflag) for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; // coord = current position of wall - // evaluate variable if necessary, wrap with clear/add + // evaluate variables if necessary, wrap with clear/add + // for epsilon/sigma variables need to re-invoke precompute() - if (varflag) modify->clearstep_compute(); + if (vflag) modify->clearstep_compute(); double coord; for (int m = 0; m < nwall; m++) { - if (wallstyle[m] == VARIABLE) { - coord = input->variable->compute_equal(varindex[m]); + if (xstyle[m] == VARIABLE) { + coord = input->variable->compute_equal(xindex[m]); if (wallwhich[m] < YLO) coord *= xscale; else if (wallwhich[m] < ZLO) coord *= yscale; else coord *= zscale; } else coord = coord0[m]; + if (wstyle[m] == VARIABLE) { + if (estyle[m] == VARIABLE) + epsilon[m] = input->variable->compute_equal(eindex[m]); + if (sstyle[m] == VARIABLE) + sigma[m] = input->variable->compute_equal(sindex[m]); + precompute(m); + } wall_particle(m,wallwhich[m],coord); } - if (varflag) modify->addstep_compute(update->ntimestep + 1); + if (vflag) modify->addstep_compute(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall.h b/src/fix_wall.h index 84f824b6e8..eee3cf6025 100644 --- a/src/fix_wall.h +++ b/src/fix_wall.h @@ -20,6 +20,14 @@ namespace LAMMPS_NS { class FixWall : public Fix { public: + int nwall; + int wallwhich[6]; + double coord0[6]; + int xflag; // 1 if any wall position is a variable + int xstyle[6]; + int xindex[6]; + char *xstr[6]; + FixWall(class LAMMPS *, int, char **); virtual ~FixWall(); int setmask(); @@ -36,20 +44,15 @@ class FixWall : public Fix { virtual void precompute(int) = 0; virtual void wall_particle(int, int, double) = 0; - int nwall; - int wallwhich[6]; - double coord0[6]; - int varflag; - int wallstyle[6]; - int varindex[6]; - char *varstr[6]; - - protected: double epsilon[6],sigma[6],cutoff[6]; double ewall[7],ewall_all[7]; double xscale,yscale,zscale; - int eflag; + int estyle[6],sstyle[6],wstyle[6]; + int eindex[6],sindex[6]; + char *estr[6],*sstr[6]; + int vflag; // 1 if any wall position,epsilon,sigma is a var + int eflag; // per-wall flag for energy summation int nlevels_respa; double dt; int fldflag;