From 02bfa898eeb125ed07f4ef09f6f5926682f6840f Mon Sep 17 00:00:00 2001 From: Steve Plimpton <sjplimp@sandia.gov> Date: Wed, 5 Oct 2016 15:46:20 -0600 Subject: [PATCH] adjustments to balancing weights and factors, also XOR op for formulas, if, dump_modify thresh --- examples/balance/in.balance.bond.fast | 2 +- examples/balance/in.balance.clock.dynamic | 1 - src/balance.cpp | 7 ++++--- src/balance.h | 2 +- src/fix_balance.cpp | 20 +++++++++++++++++--- src/fix_balance.h | 1 + src/imbalance.h | 8 ++++---- src/imbalance_time.cpp | 22 ++++++++-------------- src/imbalance_time.h | 2 +- src/imbalance_var.cpp | 4 ++-- src/imbalance_var.h | 2 +- 11 files changed, 40 insertions(+), 31 deletions(-) diff --git a/examples/balance/in.balance.bond.fast b/examples/balance/in.balance.bond.fast index 184943c252..d2cecd2bfc 100644 --- a/examples/balance/in.balance.bond.fast +++ b/examples/balance/in.balance.bond.fast @@ -43,7 +43,7 @@ fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi $x 1 1 2.5 fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi $y 1 1 2.5 comm_style tiled -comm_modify cutoff 7.5 +comm_modify cutoff 10.0 # because bonds stretch a long ways fix 10 all balance 50 0.9 rcb #compute 1 all property/atom proc diff --git a/examples/balance/in.balance.clock.dynamic b/examples/balance/in.balance.clock.dynamic index eed111fdf8..a0bebd518d 100644 --- a/examples/balance/in.balance.clock.dynamic +++ b/examples/balance/in.balance.clock.dynamic @@ -52,4 +52,3 @@ fix 0 all balance 50 1.0 shift x 5 1.0 & weight neigh 0.5 weight time 0.66 weight store WEIGHT run 500 run 500 - diff --git a/src/balance.cpp b/src/balance.cpp index 70693f7488..7780b5207c 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -272,7 +272,7 @@ void Balance::command(int narg, char **arg) // imbinit = initial imbalance double maxinit; - init_imbalance(); + init_imbalance(0); set_weights(); double imbinit = imbalance_factor(maxinit); @@ -543,12 +543,13 @@ void Balance::weight_storage(char *prefix) /* ---------------------------------------------------------------------- invoke init() for each Imbalance class + flag = 0 for call from Balance, 1 for call from FixBalance ------------------------------------------------------------------------- */ -void Balance::init_imbalance() +void Balance::init_imbalance(int flag) { if (!wtflag) return; - for (int n = 0; n < nimbalance; n++) imbalances[n]->init(); + for (int n = 0; n < nimbalance; n++) imbalances[n]->init(flag); } /* ---------------------------------------------------------------------- diff --git a/src/balance.h b/src/balance.h index a9397e6e40..7ca0354023 100644 --- a/src/balance.h +++ b/src/balance.h @@ -38,7 +38,7 @@ class Balance : protected Pointers { void command(int, char **); void options(int, int, char **); void weight_storage(char *); - void init_imbalance(); + void init_imbalance(int); void set_weights(); double imbalance_factor(double &); void shift_setup(char *, int, double); diff --git a/src/fix_balance.cpp b/src/fix_balance.cpp index 59742583e4..33054e0e3b 100644 --- a/src/fix_balance.cpp +++ b/src/fix_balance.cpp @@ -26,6 +26,7 @@ #include "modify.h" #include "fix_store.h" #include "rcb.h" +#include "timer.h" #include "error.h" using namespace LAMMPS_NS; @@ -113,7 +114,8 @@ FixBalance::FixBalance(LAMMPS *lmp, int narg, char **arg) : // only force reneighboring if nevery > 0 if (nevery) force_reneighbor = 1; - + lastbalance = -1; + // compute initial outputs itercount = 0; @@ -153,7 +155,7 @@ void FixBalance::init() if (force->kspace) kspace_flag = 1; else kspace_flag = 0; - balance->init_imbalance(); + balance->init_imbalance(1); } /* ---------------------------------------------------------------------- */ @@ -170,6 +172,12 @@ void FixBalance::setup(int vflag) void FixBalance::setup_pre_exchange() { + // do not allow rebalancing twice on same timestep + // even if wanted to, can mess up elapsed time in ImbalanceTime + + if (update->ntimestep == lastbalance) return; + lastbalance = update->ntimestep; + // insure atoms are in current box & update box via shrink-wrap // has to be be done before rebalance() invokes Irregular::migrate_atoms() // since it requires atoms be inside simulation box @@ -202,6 +210,12 @@ void FixBalance::pre_exchange() if (nevery && update->ntimestep < next_reneighbor) return; + // do not allow rebalancing twice on same timestep + // even if wanted to, can mess up elapsed time in ImbalanceTime + + if (update->ntimestep == lastbalance) return; + lastbalance = update->ntimestep; + // insure atoms are in current box & update box via shrink-wrap // no exchange() since doesn't matter if atoms are assigned to correct procs @@ -284,7 +298,7 @@ void FixBalance::rebalance() if (kspace_flag) force->kspace->setup_grid(); // pending triggers pre_neighbor() to compute final imbalance factor - // can only be done after atoms migrate in caller's comm->exchange() + // can only be done after atoms migrate in comm->exchange() pending = 1; } diff --git a/src/fix_balance.h b/src/fix_balance.h index 2c08140190..71222a00a1 100644 --- a/src/fix_balance.h +++ b/src/fix_balance.h @@ -53,6 +53,7 @@ class FixBalance : public Fix { int itercount; // iteration count of last call to Balance int kspace_flag; // 1 if KSpace solver defined int pending; + bigint lastbalance; // last timestep balancing was attempted class Balance *balance; class Irregular *irregular; diff --git a/src/imbalance.h b/src/imbalance.h index 14fd1b59b2..ce7b700b9d 100644 --- a/src/imbalance.h +++ b/src/imbalance.h @@ -25,13 +25,13 @@ class Imbalance : protected Pointers { virtual ~Imbalance() {}; // parse options. return number of arguments consumed (required) - virtual int options(int narg, char **arg) = 0; + virtual int options(int, char **) = 0; // reinitialize internal data (needed for fix balance) (optional) - virtual void init() {}; + virtual void init(int) {}; // compute and apply weight factors to local atom array (required) - virtual void compute(double *weights) = 0; + virtual void compute(double *) = 0; // print information about the state of this imbalance compute (required) - virtual void info(FILE *fp) = 0; + virtual void info(FILE *) = 0; // disallow default and copy constructor, assignment operator // private: diff --git a/src/imbalance_time.cpp b/src/imbalance_time.cpp index 27a7537851..4450390e76 100644 --- a/src/imbalance_time.cpp +++ b/src/imbalance_time.cpp @@ -19,9 +19,6 @@ #include "timer.h" #include "error.h" -// DEBUG -#include "update.h" - using namespace LAMMPS_NS; #define BIG 1.0e20 @@ -41,12 +38,18 @@ int ImbalanceTime::options(int narg, char **arg) } /* ---------------------------------------------------------------------- - reset last, needed for fix balance caller + reset last and timers if necessary ------------------------------------------------------------------------- */ -void ImbalanceTime::init() +void ImbalanceTime::init(int flag) { last = 0.0; + + // flag = 1 if called from FixBalance at start of run + // init Timer, so accumulated time not carried over from previous run + // should NOT init Timer if called from Balance, it uses time from last run + + if (flag) timer->init(); } /* -------------------------------------------------------------------- */ @@ -65,15 +68,6 @@ void ImbalanceTime::compute(double *weight) cost += timer->get_wall(Timer::BOND); cost += timer->get_wall(Timer::KSPACE); - /* - printf("TIME %ld %d %g %g: %g %g %g %g\n", - update->ntimestep,atom->nlocal,last,cost, - timer->get_wall(Timer::PAIR), - timer->get_wall(Timer::NEIGH), - timer->get_wall(Timer::BOND), - timer->get_wall(Timer::KSPACE)); - */ - double maxcost; MPI_Allreduce(&cost,&maxcost,1,MPI_DOUBLE,MPI_MAX,world); if (maxcost <= 0.0) return; diff --git a/src/imbalance_time.h b/src/imbalance_time.h index 76ba9aa985..8f20cc42a4 100644 --- a/src/imbalance_time.h +++ b/src/imbalance_time.h @@ -27,7 +27,7 @@ class ImbalanceTime : public Imbalance { // parse options, return number of arguments consumed virtual int options(int, char **); // reinitialize internal data - virtual void init(); + virtual void init(int); // compute and apply weight factors to local atom array virtual void compute(double *); // print information about the state of this imbalance compute diff --git a/src/imbalance_var.cpp b/src/imbalance_var.cpp index a5fd9084e5..394a9af365 100644 --- a/src/imbalance_var.cpp +++ b/src/imbalance_var.cpp @@ -45,14 +45,14 @@ int ImbalanceVar::options(int narg, char **arg) int len = strlen(arg[0]) + 1; name = new char[len]; memcpy(name,arg[0],len); - init(); + init(0); return 1; } /* -------------------------------------------------------------------- */ -void ImbalanceVar::init() +void ImbalanceVar::init(int flag) { id = input->variable->find(name); if (id < 0) { diff --git a/src/imbalance_var.h b/src/imbalance_var.h index 16c59eb0de..d354679c78 100644 --- a/src/imbalance_var.h +++ b/src/imbalance_var.h @@ -27,7 +27,7 @@ class ImbalanceVar : public Imbalance { // parse options. return number of arguments consumed. virtual int options(int, char **); // re-initialize internal data, e.g. variable ID - virtual void init(); + virtual void init(int); // compute per-atom imbalance and apply to weight array virtual void compute(double *); // print information about the state of this imbalance compute (required) -- GitLab