Commit 0c53afbf authored by Steven J. Plimpton's avatar Steven J. Plimpton
Browse files

more changes to fix rigid and fix poems

parent c9d41178
Loading
Loading
Loading
Loading
+41 −62
Original line number Diff line number Diff line
@@ -267,6 +267,10 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) :

  poems = new Workspace;

  // compute per body forces and torques inside final_integrate() by default

  earlyflag = 0;

  // print statistics

  int nsum = 0;
@@ -281,10 +285,6 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) :
      fprintf(logfile,"%d clusters, %d bodies, %d joints, %d atoms\n",
              ncluster,nbody,njoint,nsum);
  }

  // compute per body forces and torques inside final_integrate() by default

  earlyflag = 0;
}

/* ----------------------------------------------------------------------
@@ -335,25 +335,6 @@ FixPOEMS::~FixPOEMS()

/* ---------------------------------------------------------------------- */

int FixPOEMS::modify_param(int narg, char **arg)
{
  if (strcmp(arg[0],"bodyforces") == 0) {
    if (narg < 2)
      error->all(FLERR,"Illegal fix_modify command");
    if (strcmp(arg[1],"early") == 0)
      earlyflag = 1;
    else if (strcmp(arg[1],"late") == 0)
      earlyflag = 0;
    else
      error->all(FLERR,"Illegal fix_modify command");
    return 2;
  }
  else
    return 0;
}

/* ---------------------------------------------------------------------- */

int FixPOEMS::setmask()
{
  int mask = 0;
@@ -374,19 +355,25 @@ void FixPOEMS::init()
  int i,ibody;

  // warn if more than one POEMS fix
  // if earlyflag, warn if any post-force fixes come after POEMS fix

  int count = 0;
  int myindex, myposition;
  for (i = 0; i < modify->nfix; i++)
    if (strcmp(modify->fix[i]->style,"poems") == 0) {
      count++;
      if (strcmp(modify->fix[i]->id,this->id) == 0) {
        myindex = i;
        myposition = count;
  for (int i = 0; i < modify->nfix; i++)
    if (strcmp(modify->fix[i]->style,"poems") == 0) count++;
  if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one fix poems");

  if (earlyflag) {
    int pflag = 0;
    for (i = 0; i < modify->nfix; i++) {
      if (strcmp(modify->fix[i]->style,"poems") == 0) pflag = 1;
      if (pflag && (modify->fmask[i] & POST_FORCE) && 
          !modify->fix[i]->rigid_flag) {
        char str[128];
        sprintf(str,"Fix %d alters forces after fix poems",modify->fix[i]->id);
        error->warning(FLERR,str);
      }
    }
  }
  if (count > 1 && myposition == 1 && comm->me == 0)
    error->warning(FLERR,"More than one fix poems");

  // error if npt,nph fix comes before rigid fix

@@ -400,29 +387,6 @@ void FixPOEMS::init()
        error->all(FLERR,"POEMS fix must come before NPT/NPH fix");
  }

  // warn if fix poems preceeds non-rigid fixes with post-force tasks
  // when computing body forces and torques in post_force() instead of final_integrate()

  if (earlyflag) {
    int has_post_force[modify->nfix - myindex];
    count = 0;
    for (i = myindex + 1; i < modify->nfix; i++)
      if ( (modify->fmask[i] & POST_FORCE) && (!modify->fix[i]->rigid_flag) )
        has_post_force[count++] = i;
    if (count) {
      FILE *p[2] = {screen, logfile};
      for (int j = 0; j < 2; j++)
        if (p[j]) {
          fprintf(p[j],"WARNING: fix %s %s",id,style);
          fprintf(p[j]," will add up forces before they are handled by:\n");
          for (int k = 0; k < count; k++) {
            Fix *fix = modify->fix[has_post_force[k]];
            fprintf(p[j],"         => fix %s %s\n",fix->id,fix->style);
          }
        }
    }
  }

  // timestep info

  dtv = update->dt;
@@ -781,6 +745,13 @@ void FixPOEMS::initial_integrate(int vflag)
  set_xv();
}

/* ---------------------------------------------------------------------- */

void FixPOEMS::post_force(int vflag)
{
  if (earlyflag) compute_forces_and_torques();
}

/* ----------------------------------------------------------------------
   compute fcm,torque on each rigid body
   only count joint atoms in 1st body
@@ -837,13 +808,6 @@ void FixPOEMS::compute_forces_and_torques()
  }
}

/* ---------------------------------------------------------------------- */

void FixPOEMS::post_force(int vflag)
{
  if (earlyflag) compute_forces_and_torques();
}

/* ----------------------------------------------------------------------
   update vcm,omega by last 1/2 step
   set v of body atoms accordingly
@@ -1678,6 +1642,21 @@ int FixPOEMS::unpack_exchange(int nlocal, double *buf)

/* ---------------------------------------------------------------------- */

int FixPOEMS::modify_param(int narg, char **arg)
{
  if (strcmp(arg[0],"bodyforces") == 0) {
    if (narg < 2) error->all(FLERR,"Illegal fix_modify command");
    if (strcmp(arg[1],"early") == 0) earlyflag = 1;
    else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
    else error->all(FLERR,"Illegal fix_modify command");
    return 2;
  }

  return 0;
}

/* ---------------------------------------------------------------------- */

void FixPOEMS::reset_dt()
{
  dtv = update->dt;
+1 −2
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ class FixPOEMS : public Fix {
 public:
  FixPOEMS(class LAMMPS *, int narg, char **arg);
  ~FixPOEMS();
  int modify_param(int, char **);
  int setmask();
  void init();
  void setup(int);
@@ -48,6 +47,7 @@ class FixPOEMS : public Fix {
  void pre_neighbor();
  int dof(int);
  void deform(int);
  int modify_param(int, char **);
  void reset_dt();

 private:
@@ -56,7 +56,6 @@ class FixPOEMS : public Fix {
  double *step_respa;
  int nlevels_respa;
  double total_ke;

  int earlyflag;    // 1 if forces and torques are computed at post_force()

  // atom assignment to rigid bodies
+12 −1
Original line number Diff line number Diff line
@@ -694,7 +694,7 @@ int FixRigid::setmask()
  int mask = 0;
  mask |= INITIAL_INTEGRATE;
  mask |= FINAL_INTEGRATE;
  if (langflag || earlyflag) mask |= POST_FORCE;
  if (langflag) mask |= POST_FORCE;
  mask |= PRE_NEIGHBOR;
  mask |= INITIAL_INTEGRATE_RESPA;
  mask |= FINAL_INTEGRATE_RESPA;
@@ -2638,6 +2638,17 @@ int FixRigid::modify_param(int narg, char **arg)
    if (strcmp(arg[1],"early") == 0) earlyflag = 1;
    else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
    else error->all(FLERR,"Illegal fix_modify command");

    // reset fix mask
    // must do here and not in init, 
    // since modify.cpp::init() uses fix masks before calling fix::init()

    for (int i = 0; i < modify->nfix; i++)
      if (strcmp(modify->fix[i]->id,id) == 0) {
        if (earlyflag) modify->fmask[i] |= POST_FORCE;
        else if (!langflag) modify->fmask[i] &= ~POST_FORCE;
        break;
      }
    return 2;
  }

+13 −1
Original line number Diff line number Diff line
@@ -540,7 +540,7 @@ int FixRigidSmall::setmask()
  int mask = 0;
  mask |= INITIAL_INTEGRATE;
  mask |= FINAL_INTEGRATE;
  if (langflag || earlyflag) mask |= POST_FORCE;
  if (langflag) mask |= POST_FORCE;
  mask |= PRE_NEIGHBOR;
  mask |= INITIAL_INTEGRATE_RESPA;
  mask |= FINAL_INTEGRATE_RESPA;
@@ -3428,6 +3428,18 @@ int FixRigidSmall::modify_param(int narg, char **arg)
    if (strcmp(arg[1],"early") == 0) earlyflag = 1;
    else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
    else error->all(FLERR,"Illegal fix_modify command");

    // reset fix mask
    // must do here and not in init, 
    // since modify.cpp::init() uses fix masks before calling fix::init()

    for (int i = 0; i < modify->nfix; i++)
      if (strcmp(modify->fix[i]->id,id) == 0) {
        if (earlyflag) modify->fmask[i] |= POST_FORCE;
        else if (!langflag) modify->fmask[i] &= ~POST_FORCE;
        break;
      }

    return 2;
  }