Restarting limit_damping, other minor simplifications/cleanups

This commit is contained in:
jtclemm
2022-11-16 16:36:22 -07:00
parent 5f0fff58ac
commit f51ab2c440
15 changed files with 72 additions and 93 deletions

View File

@ -44,7 +44,7 @@ change_box all boundary p p f
pair_style granular pair_style granular
pair_coeff 1 * hertz/material 1e5 0.2 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji pair_coeff 1 * hertz/material 1e5 0.2 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji
pair_coeff 2 2 jkr 1e5 0.1 0.3 50 tangential mindlin NULL 1.0 0.5 rolling sds 1e3 1e3 0.1 twisting marshall damping tsuji pair_coeff 2 2 jkr 1e5 0.1 0.3 50 tangential mindlin NULL 1.0 0.5 rolling sds 1e3 1e3 0.1 twisting marshall
variable theta equal 0 variable theta equal 0

View File

@ -67,11 +67,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) :
model = new GranularModel(lmp); model = new GranularModel(lmp);
model->contact_type = WALL; model->contact_type = WALL;
if (strcmp(arg[3],"granular") == 0) classic_flag = 0;
else classic_flag = 1;
limit_damping = 0;
heat_flag = 0; heat_flag = 0;
int Twall_defined = 0; int classic_flag = 1;
if (strcmp(arg[3],"granular") == 0) classic_flag = 0;
// wall/particle coefficients // wall/particle coefficients
@ -117,10 +115,9 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) :
} }
} }
// Define default damping model if unspecified, takes no args // Define default damping submodel if unspecified, takes no args
if (!model->damping_model) if (!model->damping_model)
model->construct_submodel("viscoelastic", DAMPING); model->construct_submodel("viscoelastic", DAMPING);
model->init(); model->init();
size_history = model->size_history; size_history = model->size_history;
@ -177,6 +174,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) :
wiggle = 0; wiggle = 0;
wshear = 0; wshear = 0;
peratom_flag = 0; peratom_flag = 0;
int Twall_defined = 0;
while (iarg < narg) { while (iarg < narg) {
if (strcmp(arg[iarg],"wiggle") == 0) { if (strcmp(arg[iarg],"wiggle") == 0) {
@ -216,7 +214,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) :
} }
if (heat_flag != Twall_defined) if (heat_flag != Twall_defined)
error->all(FLERR, "To model conduction, must define both heat model and wall temperature"); error->all(FLERR, "Must define wall temperature with heat model");
if (wallstyle == NOSTYLE) if (wallstyle == NOSTYLE)
error->all(FLERR,"No wall style defined"); error->all(FLERR,"No wall style defined");
@ -376,6 +374,7 @@ void FixWallGran::post_force(int /*vflag*/)
history_update = 1; history_update = 1;
if (update->setupflag) history_update = 0; if (update->setupflag) history_update = 0;
model->history_update = history_update;
// if just reneighbored: // if just reneighbored:
// update rigid body masses for owned atoms if using FixRigid // update rigid body masses for owned atoms if using FixRigid
@ -407,10 +406,10 @@ void FixWallGran::post_force(int /*vflag*/)
if (wiggle) { if (wiggle) {
double arg = omega * (update->ntimestep - time_origin) * dt; double arg = omega * (update->ntimestep - time_origin) * dt;
if (wallstyle == axis) { if (wallstyle == axis) {
wlo = lo + amplitude - amplitude*cos(arg); wlo = lo + amplitude - amplitude * cos(arg);
whi = hi + amplitude - amplitude*cos(arg); whi = hi + amplitude - amplitude * cos(arg);
} }
vwall[axis] = amplitude*omega*sin(arg); vwall[axis] = amplitude * omega * sin(arg);
} else if (wshear) vwall[axis] = vshear; } else if (wshear) vwall[axis] = vshear;
// loop over all my atoms // loop over all my atoms
@ -473,19 +472,19 @@ void FixWallGran::post_force(int /*vflag*/)
if (del1 < del2) dz = del1; if (del1 < del2) dz = del1;
else dz = -del2; else dz = -del2;
} else if (wallstyle == ZCYLINDER) { } else if (wallstyle == ZCYLINDER) {
delxy = sqrt(x[i][0]*x[i][0] + x[i][1]*x[i][1]); delxy = sqrt(x[i][0] * x[i][0] + x[i][1] * x[i][1]);
delr = cylradius - delxy; delr = cylradius - delxy;
if (delr > radius[i]) { if (delr > radius[i]) {
dz = cylradius; dz = cylradius;
rwall = 0.0; rwall = 0.0;
} else { } else {
dx = -delr/delxy * x[i][0]; dx = -delr / delxy * x[i][0];
dy = -delr/delxy * x[i][1]; dy = -delr / delxy * x[i][1];
// rwall = -2r_c if inside cylinder, 2r_c outside // rwall = -2r_c if inside cylinder, 2r_c outside
rwall = (delxy < cylradius) ? -2*cylradius : 2*cylradius; rwall = (delxy < cylradius) ? -2 * cylradius : 2 * cylradius;
if (wshear && axis != 2) { if (wshear && axis != 2) {
vwall[0] += vshear * x[i][1]/delxy; vwall[0] += vshear * x[i][1] / delxy;
vwall[1] += -vshear * x[i][0]/delxy; vwall[1] += -vshear * x[i][0] / delxy;
vwall[2] = 0.0; vwall[2] = 0.0;
} }
} }
@ -521,7 +520,6 @@ void FixWallGran::post_force(int /*vflag*/)
model->meff = meff; model->meff = meff;
model->vi = v[i]; model->vi = v[i];
model->omegai = omega[i]; model->omegai = omega[i];
model->history_update = history_update;
if (use_history) model->history = history_one[i]; if (use_history) model->history = history_one[i];
if (heat_flag) model->Ti = temperature[i]; if (heat_flag) model->Ti = temperature[i];

View File

@ -53,7 +53,7 @@ class FixWallGran : public Fix {
protected: protected:
int wallstyle, wiggle, wshear, axis; int wallstyle, wiggle, wshear, axis;
int classic_flag, nlevels_respa; int nlevels_respa;
bigint time_origin; bigint time_origin;
// for granular model choices // for granular model choices
@ -69,7 +69,6 @@ class FixWallGran : public Fix {
int history_update; // flag for whether shear history is updated int history_update; // flag for whether shear history is updated
int size_history; // # of shear history values per contact int size_history; // # of shear history values per contact
int heat_flag; int heat_flag;
int limit_damping;
int tvar; int tvar;
char *tstr; char *tstr;

View File

@ -135,6 +135,7 @@ void FixWallGranRegion::post_force(int /*vflag*/)
history_update = 1; history_update = 1;
if (update->setupflag) history_update = 0; if (update->setupflag) history_update = 0;
model->history_update = history_update;
// if just reneighbored: // if just reneighbored:
// update rigid body masses for owned atoms if using FixRigid // update rigid body masses for owned atoms if using FixRigid
@ -262,7 +263,6 @@ void FixWallGranRegion::post_force(int /*vflag*/)
model->meff = meff; model->meff = meff;
model->vi = v[i]; model->vi = v[i];
model->omegai = omega[i]; model->omegai = omega[i];
model->history_update = history_update;
if (use_history) model->history = history_many[i][c2r[ic]]; if (use_history) model->history = history_many[i][c2r[ic]];
if (heat_flag) model->Ti = temperature[i]; if (heat_flag) model->Ti = temperature[i];

View File

@ -29,8 +29,8 @@ class GranSubMod : protected Pointers {
double *coeffs; double *coeffs;
void read_restart(); void read_restart();
virtual void mix_coeffs(double*, double*); virtual void mix_coeffs(double*, double*);
virtual void coeffs_to_local() = 0; virtual void coeffs_to_local() {};
virtual void init() = 0; // called after all submodel coeffs defined virtual void init() {}; // called after all submodels + coeffs defined
void allocate_coeffs(); void allocate_coeffs();
std::string name; std::string name;

View File

@ -108,7 +108,7 @@ void GranSubModDampingTsuji::init()
{ {
double tmp = gm->normal_model->damp; double tmp = gm->normal_model->damp;
damp = 1.2728 - 4.2783 * tmp + 11.087 * square(tmp); damp = 1.2728 - 4.2783 * tmp + 11.087 * square(tmp);
damp += -22.348 * cube(tmp)+ 27.467 * powint(tmp, 4); damp += -22.348 * cube(tmp) + 27.467 * powint(tmp, 4);
damp += -18.022 * powint(tmp, 5) + 4.8218 * powint(tmp,6); damp += -18.022 * powint(tmp, 5) + 4.8218 * powint(tmp,6);
} }

View File

@ -48,8 +48,6 @@ class GranSubModDamping : public GranSubMod {
public: public:
GranSubModDamping(class GranularModel *, class LAMMPS *); GranSubModDamping(class GranularModel *, class LAMMPS *);
~GranSubModDamping() {}; ~GranSubModDamping() {};
virtual void coeffs_to_local() {};
virtual void mix_coeffs(double*, double*) {};
virtual void init(); virtual void init();
virtual double calculate_forces() = 0; virtual double calculate_forces() = 0;
double damp_prefactor; // Used by tangential models double damp_prefactor; // Used by tangential models

View File

@ -35,8 +35,6 @@ class GranSubModHeat : public GranSubMod {
public: public:
GranSubModHeat(class GranularModel *, class LAMMPS *); GranSubModHeat(class GranularModel *, class LAMMPS *);
~GranSubModHeat() {}; ~GranSubModHeat() {};
virtual void coeffs_to_local() {};
virtual void init() {};
virtual double calculate_heat() = 0; virtual double calculate_heat() = 0;
}; };

View File

@ -51,8 +51,6 @@ class GranSubModNormal : public GranSubMod {
public: public:
GranSubModNormal(class GranularModel *, class LAMMPS *); GranSubModNormal(class GranularModel *, class LAMMPS *);
~GranSubModNormal() {}; ~GranSubModNormal() {};
virtual void coeffs_to_local() {};
virtual void init() {};
virtual bool touch(); virtual bool touch();
virtual double pulloff_distance(double, double); virtual double pulloff_distance(double, double);
virtual double calculate_area(); virtual double calculate_area();
@ -60,7 +58,7 @@ class GranSubModNormal : public GranSubMod {
virtual void set_fncrit(); virtual void set_fncrit();
double damp; // argument historically needed by damping double damp; // argument historically needed by damping
double Emod, poiss; double Emod, poiss;
double Fncrit, knfac; double Fncrit;
int material_properties, cohesive_flag; int material_properties, cohesive_flag;
}; };

View File

@ -35,8 +35,6 @@ class GranSubModRolling : public GranSubMod {
public: public:
GranSubModRolling(class GranularModel *, class LAMMPS *); GranSubModRolling(class GranularModel *, class LAMMPS *);
~GranSubModRolling() {}; ~GranSubModRolling() {};
virtual void coeffs_to_local() {};
virtual void init() {};
virtual void calculate_forces() = 0; virtual void calculate_forces() = 0;
}; };

View File

@ -63,8 +63,6 @@ class GranSubModTangential : public GranSubMod {
public: public:
GranSubModTangential(class GranularModel *, class LAMMPS *); GranSubModTangential(class GranularModel *, class LAMMPS *);
virtual ~GranSubModTangential() {}; virtual ~GranSubModTangential() {};
virtual void coeffs_to_local() {};
virtual void init() {};
virtual void calculate_forces() = 0; virtual void calculate_forces() = 0;
double k, damp, mu; // Used by Marshall twisting model double k, damp, mu; // Used by Marshall twisting model
}; };
@ -105,8 +103,6 @@ class GranSubModTangentialLinearHistoryClassic : public GranSubModTangentialLine
public: public:
GranSubModTangentialLinearHistoryClassic(class GranularModel *, class LAMMPS *); GranSubModTangentialLinearHistoryClassic(class GranularModel *, class LAMMPS *);
void calculate_forces(); void calculate_forces();
protected:
double xt;
}; };
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */

View File

@ -39,8 +39,6 @@ class GranSubModTwisting : public GranSubMod {
public: public:
GranSubModTwisting(class GranularModel *, class LAMMPS *); GranSubModTwisting(class GranularModel *, class LAMMPS *);
virtual ~GranSubModTwisting() {}; virtual ~GranSubModTwisting() {};
virtual void coeffs_to_local() {};
virtual void init() {};
virtual void calculate_forces() = 0; virtual void calculate_forces() = 0;
}; };
@ -57,8 +55,8 @@ class GranSubModTwistingNone : public GranSubModTwisting {
class GranSubModTwistingMarshall : public GranSubModTwisting { class GranSubModTwistingMarshall : public GranSubModTwisting {
public: public:
GranSubModTwistingMarshall(class GranularModel *, class LAMMPS *); GranSubModTwistingMarshall(class GranularModel *, class LAMMPS *);
void init() override;
void calculate_forces(); void calculate_forces();
void init();
protected: protected:
double k_tang, mu_tang; double k_tang, mu_tang;
}; };

View File

@ -148,12 +148,13 @@ void GranularModel::construct_submodel(std::string model_name, SubmodelType mode
sub_models[model_type]->name.assign(model_name); sub_models[model_type]->name.assign(model_name);
sub_models[model_type]->allocate_coeffs(); sub_models[model_type]->allocate_coeffs();
if (model_type == NORMAL) normal_model = dynamic_cast<GranSubModNormal *> (sub_models[NORMAL]); // Assign specific submodel pointer
if (model_type == DAMPING) damping_model = dynamic_cast<GranSubModDamping *> (sub_models[DAMPING]); if (model_type == NORMAL) normal_model = dynamic_cast<GranSubModNormal *> (sub_models[model_type]);
if (model_type == TANGENTIAL) tangential_model = dynamic_cast<GranSubModTangential *> (sub_models[TANGENTIAL]); if (model_type == DAMPING) damping_model = dynamic_cast<GranSubModDamping *> (sub_models[model_type]);
if (model_type == ROLLING) rolling_model = dynamic_cast<GranSubModRolling *> (sub_models[ROLLING]); if (model_type == TANGENTIAL) tangential_model = dynamic_cast<GranSubModTangential *> (sub_models[model_type]);
if (model_type == TWISTING) twisting_model = dynamic_cast<GranSubModTwisting *> (sub_models[TWISTING]); if (model_type == ROLLING) rolling_model = dynamic_cast<GranSubModRolling *> (sub_models[model_type]);
if (model_type == HEAT) heat_model = dynamic_cast<GranSubModHeat *> (sub_models[HEAT]); if (model_type == TWISTING) twisting_model = dynamic_cast<GranSubModTwisting *> (sub_models[model_type]);
if (model_type == HEAT) heat_model = dynamic_cast<GranSubModHeat *> (sub_models[model_type]);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -248,7 +249,8 @@ void GranularModel::init()
beyond_contact = 1; beyond_contact = 1;
size_history += sub_models[i]->size_history; size_history += sub_models[i]->size_history;
if (!sub_models[i]->allow_cohesion && normal_model->cohesive_flag) if (!sub_models[i]->allow_cohesion && normal_model->cohesive_flag)
error->all(FLERR,"Cannot use {} model with a cohesive normal model, {}", sub_models[i]->name, normal_model->name); error->all(FLERR,"Cannot use {} model with a cohesive normal model, {}",
sub_models[i]->name, normal_model->name);
if (sub_models[i]->area_flag) area_flag = 1; if (sub_models[i]->area_flag) area_flag = 1;
} }
@ -260,14 +262,14 @@ void GranularModel::init()
int j; int j;
for (int i = 0; i < size_history; i++) { for (int i = 0; i < size_history; i++) {
// Find which model owns this history value // Find which submodel owns this history value
size_cumulative = 0; size_cumulative = 0;
for (j = 0; j < NSUBMODELS; j++) { for (j = 0; j < NSUBMODELS; j++) {
if ((size_cumulative + sub_models[j]->size_history) > i) break; if ((size_cumulative + sub_models[j]->size_history) > i) break;
size_cumulative += sub_models[j]->size_history; size_cumulative += sub_models[j]->size_history;
} }
// Check if model has nondefault transfers, if so copy its array // Check if submodel has nondefault transfers, if so copy its array
transfer_history_factor[i] = -1; transfer_history_factor[i] = -1;
if (j != NSUBMODELS) { if (j != NSUBMODELS) {
if (sub_models[j]->nondefault_history_transfer) { if (sub_models[j]->nondefault_history_transfer) {
@ -284,8 +286,7 @@ void GranularModel::init()
int GranularModel::mix_coeffs(GranularModel *g1, GranularModel *g2) int GranularModel::mix_coeffs(GranularModel *g1, GranularModel *g2)
{ {
int i; for (int i = 0; i < NSUBMODELS; i++) {
for (i = 0; i < NSUBMODELS; i++) {
if (g1->sub_models[i]->name != g2->sub_models[i]->name) return i; if (g1->sub_models[i]->name != g2->sub_models[i]->name) return i;
construct_submodel(g1->sub_models[i]->name, (SubmodelType) i); construct_submodel(g1->sub_models[i]->name, (SubmodelType) i);
@ -311,6 +312,8 @@ void GranularModel::write_restart(FILE *fp)
fwrite(&num_coeffs, sizeof(int), 1, fp); fwrite(&num_coeffs, sizeof(int), 1, fp);
fwrite(sub_models[i]->coeffs, sizeof(double), num_coeffs, fp); fwrite(sub_models[i]->coeffs, sizeof(double), num_coeffs, fp);
} }
fwrite(&limit_damping, sizeof(int), 1, fp);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -328,22 +331,23 @@ void GranularModel::read_restart(FILE *fp)
if (comm->me == 0) if (comm->me == 0)
utils::sfread(FLERR, const_cast<char*>(model_name.data()), sizeof(char),num_char, fp, nullptr, error); utils::sfread(FLERR, const_cast<char*>(model_name.data()), sizeof(char),num_char, fp, nullptr, error);
MPI_Bcast(const_cast<char*>(model_name.data()), num_char, MPI_CHAR, 0, world); MPI_Bcast(const_cast<char*>(model_name.data()), num_char, MPI_CHAR, 0, world);
construct_submodel(model_name, (SubmodelType) i); construct_submodel(model_name, (SubmodelType) i);
if (comm->me == 0) { if (comm->me == 0)
utils::sfread(FLERR, &num_coeff, sizeof(int), 1, fp, nullptr, error); utils::sfread(FLERR, &num_coeff, sizeof(int), 1, fp, nullptr, error);
if (num_coeff != sub_models[i]->num_coeffs)
error->one(FLERR, "Invalid granular model written to restart file");
}
MPI_Bcast(&num_coeff, 1, MPI_INT, 0, world); MPI_Bcast(&num_coeff, 1, MPI_INT, 0, world);
if (num_coeff != sub_models[i]->num_coeffs)
error->all(FLERR, "Invalid granular model written to restart file");
if (comm->me == 0) { if (comm->me == 0)
utils::sfread(FLERR, sub_models[i]->coeffs, sizeof(double), num_coeff, fp, nullptr, error); utils::sfread(FLERR, sub_models[i]->coeffs, sizeof(double), num_coeff, fp, nullptr, error);
}
MPI_Bcast(sub_models[i]->coeffs, num_coeff, MPI_DOUBLE, 0, world); MPI_Bcast(sub_models[i]->coeffs, num_coeff, MPI_DOUBLE, 0, world);
sub_models[i]->coeffs_to_local(); sub_models[i]->coeffs_to_local();
} }
if (comm->me == 0)
utils::sfread(FLERR, &limit_damping, sizeof(int), 1, fp, nullptr, error);
MPI_Bcast(&limit_damping, 1, MPI_INT, 0, world);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -393,7 +397,7 @@ void GranularModel::calculate_forces()
sub3(vi, vj, vr); sub3(vi, vj, vr);
// normal component // normal component
vnnr = dot3(vr, nx); //v_R . n vnnr = dot3(vr, nx);
scale3(vnnr, nx, vn); scale3(vnnr, nx, vn);
// tangential component // tangential component
@ -433,7 +437,7 @@ void GranularModel::calculate_forces()
if (contact_type == PAIR) { if (contact_type == PAIR) {
copy3(torquesi, torquesj); copy3(torquesi, torquesj);
// Classic pair styles wouldn't scale, but classic option is only used by walls // Classic pair styles don't scale, but classic option is currently only used by walls
dist_to_contact = radi - 0.5 * delta; dist_to_contact = radi - 0.5 * delta;
scale3(dist_to_contact, torquesi); scale3(dist_to_contact, torquesi);
dist_to_contact = radj - 0.5 * delta; dist_to_contact = radj - 0.5 * delta;

View File

@ -68,7 +68,7 @@ class GranularModel : protected Pointers {
GranSubModRolling *rolling_model; GranSubModRolling *rolling_model;
GranSubModTwisting *twisting_model; GranSubModTwisting *twisting_model;
GranSubModHeat *heat_model; GranSubModHeat *heat_model;
GranSubMod *sub_models[NSUBMODELS]; // Need to resize if we add more model flavors GranSubMod *sub_models[NSUBMODELS];
// Extra options // Extra options
int beyond_contact, limit_damping, history_update; int beyond_contact, limit_damping, history_update;
@ -94,9 +94,9 @@ class GranularModel : protected Pointers {
bool touch; bool touch;
protected: protected:
int rolling_defined, twisting_defined, heat_defined; // Used to quickly skip undefined submodels int rolling_defined, twisting_defined, heat_defined; // Flag optional submodels
int classic_model; int classic_model; // Flag original pair/gran calculations
int area_flag; int area_flag; // Flag whether area is needed
int nclass; int nclass;

View File

@ -57,8 +57,6 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp)
svector = new double[single_extra]; svector = new double[single_extra];
neighprev = 0; neighprev = 0;
nmodels = 0;
maxmodels = 0;
nmax = 0; nmax = 0;
mass_rigid = nullptr; mass_rigid = nullptr;
@ -302,6 +300,7 @@ void PairGranular::allocate()
maxmodels = n * n + 1; // should never need any more space maxmodels = n * n + 1; // should never need any more space
models_list = (GranularModel **) memory->smalloc(maxmodels * sizeof(GranularModel *), "pair:models_list"); models_list = (GranularModel **) memory->smalloc(maxmodels * sizeof(GranularModel *), "pair:models_list");
for (int i = 0; i < maxmodels; i++) models_list[i] = nullptr; for (int i = 0; i < maxmodels; i++) models_list[i] = nullptr;
nmodels = 0;
onerad_dynamic = new double[n+1]; onerad_dynamic = new double[n+1];
onerad_frozen = new double[n+1]; onerad_frozen = new double[n+1];
@ -339,7 +338,6 @@ void PairGranular::coeff(int narg, char **arg)
utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error); utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error); utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
// Construct new model // Construct new model
models_list[nmodels] = new GranularModel(lmp); models_list[nmodels] = new GranularModel(lmp);
class GranularModel* model = models_list[nmodels]; class GranularModel* model = models_list[nmodels];
@ -374,9 +372,10 @@ void PairGranular::coeff(int narg, char **arg)
} else error->all(FLERR, "Illegal pair_coeff command {}", arg[iarg]); } else error->all(FLERR, "Illegal pair_coeff command {}", arg[iarg]);
} }
// Define default damping model if unspecified, has no coeffs // Define default damping submodel if unspecified, has no coeffs
if (!model->damping_model) if (!model->damping_model)
model->construct_submodel("viscoelastic", DAMPING); model->construct_submodel("viscoelastic", DAMPING);
model->init();
int count = 0; int count = 0;
for (int i = ilo; i <= ihi; i++) { for (int i = ilo; i <= ihi; i++) {
@ -388,7 +387,7 @@ void PairGranular::coeff(int narg, char **arg)
} }
} }
// If there are > ntype^2 models, delete unused ones // If there are > ntype^2 models, delete unused models
if (nmodels == maxmodels) prune_models(); if (nmodels == maxmodels) prune_models();
if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
@ -419,7 +418,6 @@ void PairGranular::init_style()
int size_max[NSUBMODELS] = {0}; int size_max[NSUBMODELS] = {0};
for (int n = 0; n < nmodels; n++) { for (int n = 0; n < nmodels; n++) {
model = models_list[n]; model = models_list[n];
model->init();
if (model->beyond_contact) { if (model->beyond_contact) {
beyond_contact = 1; beyond_contact = 1;
@ -559,7 +557,6 @@ double PairGranular::init_one(int i, int j)
model1->sub_models[error_code]->name, model1->sub_models[error_code]->name,
model2->sub_models[error_code]->name); model2->sub_models[error_code]->name);
// Initialize new model, init_one() occurs after init_style
model->init(); model->init();
for (int k = 0; k < NSUBMODELS; k++) for (int k = 0; k < NSUBMODELS; k++)
@ -657,8 +654,10 @@ void PairGranular::read_restart(FILE *fp)
MPI_Bcast(&nmodels,1,MPI_INT,0,world); MPI_Bcast(&nmodels,1,MPI_INT,0,world);
for (i = 0; i < nmodels; i++) { for (i = 0; i < nmodels; i++) {
delete models_list[i];
models_list[i] = new GranularModel(lmp); models_list[i] = new GranularModel(lmp);
models_list[i]->read_restart(fp); models_list[i]->read_restart(fp);
models_list[i]->init();
} }
for (i = 1; i <= atom->ntypes; i++) { for (i = 1; i <= atom->ntypes; i++) {
@ -690,28 +689,22 @@ double PairGranular::single(int i, int j, int itype, int jtype,
double rsq, double /* factor_coul */, double rsq, double /* factor_coul */,
double factor_lj, double &fforce) double factor_lj, double &fforce)
{ {
if (factor_lj == 0) { if (factor_lj == 0) {
fforce = 0.0; fforce = 0.0;
for (int m = 0; m < single_extra; m++) svector[m] = 0.0; for (int m = 0; m < single_extra; m++) svector[m] = 0.0;
return 0.0; return 0.0;
} }
int jnum;
int *jlist;
double *history,*allhistory;
int nall = atom->nlocal + atom->nghost; int nall = atom->nlocal + atom->nghost;
if ((i >= nall) || (j >= nall)) if ((i >= nall) || (j >= nall))
error->all(FLERR,"Not enough atoms for pair granular single function"); error->all(FLERR,"Not enough atoms for pair granular single function");
int touchflag;
double **x = atom->x;
double *radius = atom->radius;
class GranularModel* model = models_list[types_indices[itype][jtype]]; class GranularModel* model = models_list[types_indices[itype][jtype]];
// Reset model and copy initial geometric data // Reset model and copy initial geometric data
double **x = atom->x;
double *radius = atom->radius;
model->xi = x[i]; model->xi = x[i];
model->xj = x[j]; model->xj = x[j];
model->radi = radius[i]; model->radi = radius[i];
@ -719,8 +712,9 @@ double PairGranular::single(int i, int j, int itype, int jtype,
model->history_update = 0; // Don't update history model->history_update = 0; // Don't update history
// If history is needed // If history is needed
jnum = list->numneigh[i]; double *history,*allhistory;
jlist = list->firstneigh[i]; int jnum = list->numneigh[i];
int *jlist = list->firstneigh[i];
if (use_history) { if (use_history) {
if ((fix_history == nullptr) || (fix_history->firstvalue == nullptr)) if ((fix_history == nullptr) || (fix_history->firstvalue == nullptr))
error->one(FLERR,"Pair granular single computation needs history"); error->one(FLERR,"Pair granular single computation needs history");
@ -730,11 +724,11 @@ double PairGranular::single(int i, int j, int itype, int jtype,
if (neighprev >= jnum) neighprev = 0; if (neighprev >= jnum) neighprev = 0;
if (jlist[neighprev] == j) break; if (jlist[neighprev] == j) break;
} }
history = &allhistory[size_history*neighprev]; history = &allhistory[size_history * neighprev];
model->touch = fix_history->firstflag[i][neighprev]; model->touch = fix_history->firstflag[i][neighprev];
} }
touchflag = model->check_contact(); int touchflag = model->check_contact();
if (!touchflag) { if (!touchflag) {
fforce = 0.0; fforce = 0.0;
@ -745,17 +739,16 @@ double PairGranular::single(int i, int j, int itype, int jtype,
// meff = effective mass of pair of particles // meff = effective mass of pair of particles
// if I or J part of rigid body, use body mass // if I or J part of rigid body, use body mass
// if I or J is frozen, meff is other particle // if I or J is frozen, meff is other particle
double mi, mj, meff;
double *rmass = atom->rmass; double *rmass = atom->rmass;
int *mask = atom->mask; int *mask = atom->mask;
mi = rmass[i]; double mi = rmass[i];
mj = rmass[j]; double mj = rmass[j];
if (fix_rigid) { if (fix_rigid) {
if (mass_rigid[i] > 0.0) mi = mass_rigid[i]; if (mass_rigid[i] > 0.0) mi = mass_rigid[i];
if (mass_rigid[j] > 0.0) mj = mass_rigid[j]; if (mass_rigid[j] > 0.0) mj = mass_rigid[j];
} }
meff = mi * mj / (mi + mj); double meff = mi * mj / (mi + mj);
if (mask[i] & freeze_group_bit) meff = mj; if (mask[i] & freeze_group_bit) meff = mj;
if (mask[j] & freeze_group_bit) meff = mi; if (mask[j] & freeze_group_bit) meff = mi;
@ -770,11 +763,10 @@ double PairGranular::single(int i, int j, int itype, int jtype,
model->omegaj = omega[j]; model->omegaj = omega[j];
model->history = history; model->history = history;
double *forces, *torquesi, *torquesj;
model->calculate_forces(); model->calculate_forces();
forces = model->forces; double *forces = model->forces;
torquesi = model->torquesi; double *torquesi = model->torquesi;
torquesj = model->torquesj; double *torquesj = model->torquesj;
// apply forces & torques // apply forces & torques
fforce = MathExtra::len3(forces); fforce = MathExtra::len3(forces);
@ -843,7 +835,7 @@ void PairGranular::transfer_history(double* source, double* target, int itype, i
class GranularModel* model = models_list[types_indices[itype][jtype]]; class GranularModel* model = models_list[types_indices[itype][jtype]];
if (model->nondefault_history_transfer) { if (model->nondefault_history_transfer) {
for (int i = 0; i < size_history; i++) { for (int i = 0; i < size_history; i++) {
target[i] = model->transfer_history_factor[i] * source [i]; target[i] = model->transfer_history_factor[i] * source[i];
} }
} else { } else {
for (int i = 0; i < size_history; i++) { for (int i = 0; i < size_history; i++) {