add support to fix adapt for angle coeffs

This commit is contained in:
Steve Plimpton
2022-04-21 17:00:11 -06:00
parent aebbd04297
commit 3f3c481554
14 changed files with 202 additions and 57 deletions

View File

@ -14,7 +14,7 @@ Syntax
* adapt = style name of this fix command * adapt = style name of this fix command
* N = adapt simulation settings every this many timesteps * N = adapt simulation settings every this many timesteps
* one or more attribute/arg pairs may be appended * one or more attribute/arg pairs may be appended
* attribute = *pair* or *bond* or *kspace* or *atom* * attribute = *pair* or *bond* or *angle* or *kspace* or *atom*
.. parsed-literal:: .. parsed-literal::
@ -28,11 +28,16 @@ Syntax
bparam = parameter to adapt over time bparam = parameter to adapt over time
I = type bond to set parameter for I = type bond to set parameter for
v_name = variable with name that calculates value of bparam v_name = variable with name that calculates value of bparam
*angle* args = astyle aparam I v_name
astyle = angle style name, e.g. harmonic
aparam = parameter to adapt over time
I = type angle to set parameter for
v_name = variable with name that calculates value of aparam
*kspace* arg = v_name *kspace* arg = v_name
v_name = variable with name that calculates scale factor on K-space terms v_name = variable with name that calculates scale factor on K-space terms
*atom* args = aparam v_name *atom* args = atomparam v_name
aparam = parameter to adapt over time atomparam = parameter to adapt over time
v_name = variable with name that calculates value of aparam v_name = variable with name that calculates value of atomparam
* zero or more keyword/value pairs may be appended * zero or more keyword/value pairs may be appended
* keyword = *scale* or *reset* or *mass* * keyword = *scale* or *reset* or *mass*
@ -283,30 +288,60 @@ operates. The only difference is that now a bond coefficient for a
given bond type is adapted. given bond type is adapted.
A wild-card asterisk can be used in place of or in conjunction with A wild-card asterisk can be used in place of or in conjunction with
the bond type argument to set the coefficients for multiple bond types. the bond type argument to set the coefficients for multiple bond
This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N = the number of types. This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N =
atom types, then an asterisk with no numeric values means all types the number of bond types, then an asterisk with no numeric values
from 1 to N. A leading asterisk means all types from 1 to n (inclusive). means all types from 1 to N. A leading asterisk means all types from
A trailing asterisk means all types from n to N (inclusive). A middle 1 to n (inclusive). A trailing asterisk means all types from n to N
asterisk means all types from m to n (inclusive). (inclusive). A middle asterisk means all types from m to n
(inclusive).
Currently *bond* does not support bond_style hybrid nor bond_style Currently *bond* does not support bond_style hybrid nor bond_style
hybrid/overlay as bond styles. The only bonds that currently are hybrid/overlay as bond styles. The only bonds that currently are
working with fix_adapt are working with fix_adapt are
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`class2 <bond_class2>` | r0 | type bonds | | :doc:`class2 <bond_class2>` | r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`fene <bond_fene>` | k, r0 | type bonds | | :doc:`fene <bond_fene>` | k, r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`gromos <bond_gromos>` | k, r0 | type bonds | | :doc:`fene/nm <bond_fene_nm>` | k, r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`harmonic <bond_harmonic>` | k,r0 | type bonds | | :doc:`gromos <bond_gromos>` | k, r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`morse <bond_morse>` | r0 | type bonds | | :doc:`harmonic <bond_harmonic>` | k,r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`nonlinear <bond_nonlinear>` | r0 | type bonds | | :doc:`morse <bond_morse>` | r0 | type bonds |
+------------------------------------+-------+------------+ +------------------------------------+-------+-----------------+
| :doc:`nonlinear <bond_nonlinear>` | epsilon,r0 | type bonds |
+------------------------------------+-------+-----------------+
----------
The *angle* keyword uses the specified variable to change the value of
an angle coefficient over time, very similar to how the *pair* keyword
operates. The only difference is that now an angle coefficient for a
given angle type is adapted.
A wild-card asterisk can be used in place of or in conjunction with
the angle type argument to set the coefficients for multiple angle
types. This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N =
the number of angle types, then an asterisk with no numeric values
means all types from 1 to N. A leading asterisk means all types from
1 to n (inclusive). A trailing asterisk means all types from n to N
(inclusive). A middle asterisk means all types from m to n
(inclusive).
Currently *angle* does not support angle_style hybrid nor angle_style
hybrid/overlay as angle styles. The only angles that currently are
working with fix_adapt are
+------------------------------------+-------+-----------------+
| :doc:`harmonic <angle_harmonic>` | k,theta0 | type angles |
+------------------------------------+-------+-----------------+
Note that internally, theta0 is stored in radians, so the variable
this fix uses to reset theta0 needs to generate values in radians.
---------- ----------

View File

@ -273,7 +273,7 @@ double BondFENENM::single(int type, double rsq, int /*i*/, int /*j*/, double &ff
void *BondFENENM::extract(const char *str, int &dim) void *BondFENENM::extract(const char *str, int &dim)
{ {
dim = 1; dim = 1;
if (strcmp(str, "kappa") == 0) return (void *) k; if (strcmp(str, "k") == 0) return (void *) k;
if (strcmp(str, "r0") == 0) return (void *) r0; if (strcmp(str, "r0") == 0) return (void *) r0;
return nullptr; return nullptr;
} }

View File

@ -34,9 +34,7 @@ using namespace MathConst;
BondGaussian::BondGaussian(LAMMPS *lmp) : BondGaussian::BondGaussian(LAMMPS *lmp) :
Bond(lmp), nterms(nullptr), bond_temperature(nullptr), alpha(nullptr), width(nullptr), Bond(lmp), nterms(nullptr), bond_temperature(nullptr), alpha(nullptr), width(nullptr),
r0(nullptr) r0(nullptr)
{ {}
reinitflag = 1;
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */

View File

@ -264,3 +264,15 @@ double AngleHarmonic::single(int type, int i1, int i2, int i3)
double tk = k[type] * dtheta; double tk = k[type] * dtheta;
return tk * dtheta; return tk * dtheta;
} }
/* ----------------------------------------------------------------------
return ptr to internal members upon request
------------------------------------------------------------------------ */
void *AngleHarmonic::extract(const char *str, int &dim)
{
dim = 1;
if (strcmp(str, "k") == 0) return (void *) k;
if (strcmp(str, "theta0") == 0) return (void *) theta0;
return nullptr;
}

View File

@ -35,6 +35,7 @@ class AngleHarmonic : public Angle {
void read_restart(FILE *) override; void read_restart(FILE *) override;
void write_data(FILE *) override; void write_data(FILE *) override;
double single(int, int, int, int) override; double single(int, int, int, int) override;
void *extract(const char *, int &) override;
protected: protected:
double *k, *theta0; double *k, *theta0;

View File

@ -265,7 +265,7 @@ double BondFENE::single(int type, double rsq, int /*i*/, int /*j*/, double &ffor
void *BondFENE::extract(const char *str, int &dim) void *BondFENE::extract(const char *str, int &dim)
{ {
dim = 1; dim = 1;
if (strcmp(str, "kappa") == 0) return (void *) k; if (strcmp(str, "k") == 0) return (void *) k;
if (strcmp(str, "r0") == 0) return (void *) r0; if (strcmp(str, "r0") == 0) return (void *) r0;
return nullptr; return nullptr;
} }

View File

@ -30,10 +30,7 @@ using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
BondGromos::BondGromos(LAMMPS *_lmp) : Bond(_lmp) BondGromos::BondGromos(LAMMPS *_lmp) : Bond(_lmp) {}
{
reinitflag = 1;
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -200,7 +197,7 @@ double BondGromos::single(int type, double rsq, int /*i*/, int /*j*/, double &ff
void *BondGromos::extract(const char *str, int &dim) void *BondGromos::extract(const char *str, int &dim)
{ {
dim = 1; dim = 1;
if (strcmp(str, "kappa") == 0) return (void *) k; if (strcmp(str, "k") == 0) return (void *) k;
if (strcmp(str, "r0") == 0) return (void *) r0; if (strcmp(str, "r0") == 0) return (void *) r0;
return nullptr; return nullptr;
} }

View File

@ -27,10 +27,7 @@ using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
BondHarmonic::BondHarmonic(LAMMPS *_lmp) : Bond(_lmp) BondHarmonic::BondHarmonic(LAMMPS *_lmp) : Bond(_lmp) {}
{
reinitflag = 1;
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -201,12 +198,13 @@ double BondHarmonic::single(int type, double rsq, int /*i*/, int /*j*/, double &
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
Return ptr to internal members upon request. return ptr to internal members upon request
------------------------------------------------------------------------ */ ------------------------------------------------------------------------ */
void *BondHarmonic::extract(const char *str, int &dim) void *BondHarmonic::extract(const char *str, int &dim)
{ {
dim = 1; dim = 1;
if (strcmp(str, "kappa") == 0) return (void *) k; if (strcmp(str, "k") == 0) return (void *) k;
if (strcmp(str, "r0") == 0) return (void *) r0; if (strcmp(str, "r0") == 0) return (void *) r0;
return nullptr; return nullptr;
} }

View File

@ -353,3 +353,15 @@ double Angle::memory_usage()
bytes += (double) comm->nthreads * maxcvatom * 9 * sizeof(double); bytes += (double) comm->nthreads * maxcvatom * 9 * sizeof(double);
return bytes; return bytes;
} }
/* -----------------------------------------------------------------------
reset all type-based angle params via init()
-------------------------------------------------------------------------- */
void Angle::reinit()
{
if (!reinitflag)
error->all(FLERR, "Fix adapt interface to this angle style not supported");
init();
}

View File

@ -36,6 +36,9 @@ class Angle : protected Pointers {
// CENTROID_AVAIL = different and implemented // CENTROID_AVAIL = different and implemented
// CENTROID_NOTAVAIL = different, not yet implemented // CENTROID_NOTAVAIL = different, not yet implemented
int reinitflag; // 0 if not compatible with fix adapt
// extract() method may still need to be added
// KOKKOS host/device flag and data masks // KOKKOS host/device flag and data masks
ExecutionSpace execution_space; ExecutionSpace execution_space;
@ -57,6 +60,8 @@ class Angle : protected Pointers {
virtual void write_data(FILE *) {} virtual void write_data(FILE *) {}
virtual double single(int, int, int, int) = 0; virtual double single(int, int, int, int) = 0;
virtual double memory_usage(); virtual double memory_usage();
virtual void *extract(const char *, int &) { return nullptr; }
void reinit();
protected: protected:
int suffix_flag; // suffix compatibility flag int suffix_flag; // suffix compatibility flag

View File

@ -43,6 +43,7 @@ Bond::Bond(LAMMPS *_lmp) : Pointers(_lmp)
energy = 0.0; energy = 0.0;
virial[0] = virial[1] = virial[2] = virial[3] = virial[4] = virial[5] = 0.0; virial[0] = virial[1] = virial[2] = virial[3] = virial[4] = virial[5] = 0.0;
writedata = 1; writedata = 1;
reinitflag = 1;
comm_forward = comm_reverse = comm_reverse_off = 0; comm_forward = comm_reverse = comm_reverse_off = 0;
@ -336,11 +337,13 @@ double Bond::memory_usage()
} }
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
Reset all type-based bond params via init. reset all type-based bond params via init()
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
void Bond::reinit() void Bond::reinit()
{ {
if (!reinitflag) error->all(FLERR, "Fix adapt interface to this bond style not supported"); if (!reinitflag)
error->all(FLERR, "Fix adapt interface to this bond style not supported");
init(); init();
} }

View File

@ -37,7 +37,8 @@ class Bond : protected Pointers {
int comm_reverse; // size of reverse communication (0 if none) int comm_reverse; // size of reverse communication (0 if none)
int comm_reverse_off; // size of reverse comm even if newton off int comm_reverse_off; // size of reverse comm even if newton off
int reinitflag; // 1 if compatible with fix adapt and alike int reinitflag; // 0 if not compatible with fix adapt
// extract() method may still need to be added
// KOKKOS host/device flag and data masks // KOKKOS host/device flag and data masks
@ -61,7 +62,8 @@ class Bond : protected Pointers {
virtual double single(int, double, int, int, double &) = 0; virtual double single(int, double, int, int, double &) = 0;
virtual double memory_usage(); virtual double memory_usage();
virtual void *extract(const char *, int &) { return nullptr; } virtual void *extract(const char *, int &) { return nullptr; }
virtual void reinit(); void reinit();
virtual int pack_forward_comm(int, int *, double *, int, int *) {return 0;} virtual int pack_forward_comm(int, int *, double *, int, int *) {return 0;}
virtual void unpack_forward_comm(int, int, double *) {} virtual void unpack_forward_comm(int, int, double *) {}
virtual int pack_reverse_comm(int, int, double *) {return 0;} virtual int pack_reverse_comm(int, int, double *) {return 0;}

View File

@ -14,6 +14,7 @@
#include "fix_adapt.h" #include "fix_adapt.h"
#include "angle.h"
#include "atom.h" #include "atom.h"
#include "bond.h" #include "bond.h"
#include "domain.h" #include "domain.h"
@ -38,7 +39,7 @@ using namespace LAMMPS_NS;
using namespace FixConst; using namespace FixConst;
using namespace MathConst; using namespace MathConst;
enum{PAIR,KSPACE,ATOM,BOND}; enum{PAIR,KSPACE,ATOM,BOND,ANGLE};
enum{DIAMETER,CHARGE}; enum{DIAMETER,CHARGE};
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -75,6 +76,10 @@ nadapt(0), id_fix_diam(nullptr), id_fix_chg(nullptr), adapt(nullptr)
if (iarg+5 > narg) error->all(FLERR,"Illegal fix adapt command"); if (iarg+5 > narg) error->all(FLERR,"Illegal fix adapt command");
nadapt++; nadapt++;
iarg += 5; iarg += 5;
} else if (strcmp(arg[iarg],"angle") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal fix adapt command");
nadapt++;
iarg += 5;
} else break; } else break;
} }
@ -119,6 +124,20 @@ nadapt(0), id_fix_diam(nullptr), id_fix_chg(nullptr), adapt(nullptr)
nadapt++; nadapt++;
iarg += 5; iarg += 5;
} else if (strcmp(arg[iarg],"angle") == 0) {
if (iarg+5 > narg) error->all(FLERR, "Illegal fix adapt command");
adapt[nadapt].which = ANGLE;
adapt[nadapt].angle = nullptr;
adapt[nadapt].astyle = utils::strdup(arg[iarg+1]);
adapt[nadapt].aparam = utils::strdup(arg[iarg+2]);
utils::bounds(FLERR,arg[iarg+3],1,atom->nangletypes,
adapt[nadapt].ilo,adapt[nadapt].ihi,error);
if (utils::strmatch(arg[iarg+4],"^v_")) {
adapt[nadapt].var = utils::strdup(arg[iarg+4]+2);
} else error->all(FLERR,"Illegal fix adapt command");
nadapt++;
iarg += 5;
} else if (strcmp(arg[iarg],"kspace") == 0) { } else if (strcmp(arg[iarg],"kspace") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix adapt command"); if (iarg+2 > narg) error->all(FLERR,"Illegal fix adapt command");
adapt[nadapt].which = KSPACE; adapt[nadapt].which = KSPACE;
@ -133,12 +152,12 @@ nadapt(0), id_fix_diam(nullptr), id_fix_chg(nullptr), adapt(nullptr)
adapt[nadapt].which = ATOM; adapt[nadapt].which = ATOM;
if (strcmp(arg[iarg+1],"diameter") == 0 || if (strcmp(arg[iarg+1],"diameter") == 0 ||
strcmp(arg[iarg+1],"diameter/disc") == 0) { strcmp(arg[iarg+1],"diameter/disc") == 0) {
adapt[nadapt].aparam = DIAMETER; adapt[nadapt].atomparam = DIAMETER;
diamflag = 1; diamflag = 1;
discflag = 0; discflag = 0;
if (strcmp(arg[iarg+1],"diameter/disc") == 0) discflag = 1; if (strcmp(arg[iarg+1],"diameter/disc") == 0) discflag = 1;
} else if (strcmp(arg[iarg+1],"charge") == 0) { } else if (strcmp(arg[iarg+1],"charge") == 0) {
adapt[nadapt].aparam = CHARGE; adapt[nadapt].atomparam = CHARGE;
chgflag = 1; chgflag = 1;
} else error->all(FLERR,"Illegal fix adapt command"); } else error->all(FLERR,"Illegal fix adapt command");
if (utils::strmatch(arg[iarg+2],"^v_")) { if (utils::strmatch(arg[iarg+2],"^v_")) {
@ -191,6 +210,13 @@ nadapt(0), id_fix_diam(nullptr), id_fix_chg(nullptr), adapt(nullptr)
for (int m = 0; m < nadapt; ++m) for (int m = 0; m < nadapt; ++m)
if (adapt[m].which == BOND) if (adapt[m].which == BOND)
memory->create(adapt[m].vector_orig,n+1,"adapt:vector_orig"); memory->create(adapt[m].vector_orig,n+1,"adapt:vector_orig");
// allocate angle style arrays:
n = atom->nbondtypes;
for (int m = 0; m < nadapt; ++m)
if (adapt[m].which == ANGLE)
memory->create(adapt[m].vector_orig,n+1,"adapt:vector_orig");
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -207,6 +233,10 @@ FixAdapt::~FixAdapt()
delete [] adapt[m].bstyle; delete [] adapt[m].bstyle;
delete [] adapt[m].bparam; delete [] adapt[m].bparam;
memory->destroy(adapt[m].vector_orig); memory->destroy(adapt[m].vector_orig);
} else if (adapt[m].which == ANGLE) {
delete [] adapt[m].astyle;
delete [] adapt[m].aparam;
memory->destroy(adapt[m].vector_orig);
} }
} }
delete [] adapt; delete [] adapt;
@ -357,6 +387,7 @@ void FixAdapt::init()
} }
delete [] pstyle; delete [] pstyle;
} else if (ad->which == BOND) { } else if (ad->which == BOND) {
ad->bond = nullptr; ad->bond = nullptr;
anybond = 1; anybond = 1;
@ -383,13 +414,39 @@ void FixAdapt::init()
delete [] bstyle; delete [] bstyle;
} else if (ad->which == ANGLE) {
ad->angle = nullptr;
anyangle = 1;
char *astyle = utils::strdup(ad->astyle);
if (lmp->suffix_enable)
ad->angle = force->angle_match(fmt::format("{}/{}",astyle,lmp->suffix));
if (ad->angle == nullptr) ad->angle = force->angle_match(astyle);
if (ad->angle == nullptr )
error->all(FLERR,"Fix adapt angle style does not exist");
void *ptr = ad->angle->extract(ad->aparam,ad->bdim);
if (ptr == nullptr)
error->all(FLERR,"Fix adapt angle style param not supported");
// for angle styles, use a vector
if (ad->adim == 1) ad->vector = (double *) ptr;
if (utils::strmatch(force->angle_style,"^hybrid"))
error->all(FLERR,"Fix adapt does not support angle_style hybrid");
delete [] astyle;
} else if (ad->which == KSPACE) { } else if (ad->which == KSPACE) {
if (force->kspace == nullptr) if (force->kspace == nullptr)
error->all(FLERR,"Fix adapt kspace style does not exist"); error->all(FLERR,"Fix adapt kspace style does not exist");
kspace_scale = (double *) force->kspace->extract("scale"); kspace_scale = (double *) force->kspace->extract("scale");
} else if (ad->which == ATOM) { } else if (ad->which == ATOM) {
if (ad->aparam == DIAMETER) { if (ad->atomparam == DIAMETER) {
if (!atom->radius_flag) if (!atom->radius_flag)
error->all(FLERR,"Fix adapt requires atom attribute diameter"); error->all(FLERR,"Fix adapt requires atom attribute diameter");
if (!atom->rmass_flag) if (!atom->rmass_flag)
@ -398,7 +455,7 @@ void FixAdapt::init()
error->all(FLERR,"Fix adapt requires 2d simulation"); error->all(FLERR,"Fix adapt requires 2d simulation");
if (!restart_reset) previous_diam_scale = 1.0; if (!restart_reset) previous_diam_scale = 1.0;
} }
if (ad->aparam == CHARGE) { if (ad->atomparam == CHARGE) {
if (!atom->q_flag) if (!atom->q_flag)
error->all(FLERR,"Fix adapt requires atom attribute charge"); error->all(FLERR,"Fix adapt requires atom attribute charge");
if (!restart_reset) previous_chg_scale = 1.0; if (!restart_reset) previous_chg_scale = 1.0;
@ -408,7 +465,7 @@ void FixAdapt::init()
if (restart_reset) restart_reset = 0; if (restart_reset) restart_reset = 0;
// make copy of original pair/bond array values // make copy of original pair/bond/angle array values
for (int m = 0; m < nadapt; m++) { for (int m = 0; m < nadapt; m++) {
Adapt *ad = &adapt[m]; Adapt *ad = &adapt[m];
@ -422,6 +479,10 @@ void FixAdapt::init()
} else if (ad->which == BOND && ad->bdim == 1) { } else if (ad->which == BOND && ad->bdim == 1) {
for (i = ad->ilo; i <= ad->ihi; ++i ) for (i = ad->ilo; i <= ad->ihi; ++i )
ad->vector_orig[i] = ad->vector[i]; ad->vector_orig[i] = ad->vector[i];
} else if (ad->which == ANGLE && ad->adim == 1) {
for (i = ad->ilo; i <= ad->ihi; ++i )
ad->vector_orig[i] = ad->vector[i];
} }
} }
@ -483,7 +544,7 @@ void FixAdapt::post_run()
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
change pair,kspace,atom parameters based on variable evaluation change pair,bond,angle,kspace,atom parameters based on variable evaluation
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void FixAdapt::change_settings() void FixAdapt::change_settings()
@ -527,6 +588,18 @@ void FixAdapt::change_settings()
ad->vector[i] = value; ad->vector[i] = value;
} }
// set angle type array values:
} else if (ad->which == ANGLE) {
if (ad->adim == 1) {
if (scaleflag)
for (i = ad->ilo; i <= ad->ihi; ++i )
ad->vector[i] = value*ad->vector_orig[i];
else
for (i = ad->ilo; i <= ad->ihi; ++i )
ad->vector[i] = value;
}
// set kspace scale factor // set kspace scale factor
} else if (ad->which == KSPACE) { } else if (ad->which == KSPACE) {
@ -540,7 +613,7 @@ void FixAdapt::change_settings()
// also reset rmass to new value assuming density remains constant // also reset rmass to new value assuming density remains constant
// for scaleflag, previous_diam_scale is the scale factor on previous step // for scaleflag, previous_diam_scale is the scale factor on previous step
if (ad->aparam == DIAMETER) { if (ad->atomparam == DIAMETER) {
double scale; double scale;
double *radius = atom->radius; double *radius = atom->radius;
double *rmass = atom->rmass; double *rmass = atom->rmass;
@ -567,7 +640,7 @@ void FixAdapt::change_settings()
// reset charge to new value, for both owned and ghost atoms // reset charge to new value, for both owned and ghost atoms
// for scaleflag, previous_chg_scale is the scale factor on previous step // for scaleflag, previous_chg_scale is the scale factor on previous step
} else if (ad->aparam == CHARGE) { } else if (ad->atomparam == CHARGE) {
double scale; double scale;
double *q = atom->q; double *q = atom->q;
int *mask = atom->mask; int *mask = atom->mask;
@ -591,7 +664,7 @@ void FixAdapt::change_settings()
modify->addstep_compute(update->ntimestep + nevery); modify->addstep_compute(update->ntimestep + nevery);
// re-initialize pair styles if any PAIR settings were changed // re-initialize pair styles if any PAIR settings were changed
// ditto for bond styles if any BOND settings were changed // ditto for bond/angle styles if any BOND/ANGLE settings were changed
// this resets other coeffs that may depend on changed values, // this resets other coeffs that may depend on changed values,
// and also offset and tail corrections // and also offset and tail corrections
// we must call force->pair->reinit() instead of the individual // we must call force->pair->reinit() instead of the individual
@ -601,6 +674,7 @@ void FixAdapt::change_settings()
if (anypair) force->pair->reinit(); if (anypair) force->pair->reinit();
if (anybond) force->bond->reinit(); if (anybond) force->bond->reinit();
if (anyangle) force->angle->reinit();
// reset KSpace charges if charges have changed // reset KSpace charges if charges have changed
@ -624,7 +698,13 @@ void FixAdapt::restore_settings()
} }
} else if (ad->which == BOND) { } else if (ad->which == BOND) {
if (ad->pdim == 1) { if (ad->bdim == 1) {
for (int i = ad->ilo; i <= ad->ihi; i++)
ad->vector[i] = ad->vector_orig[i];
}
} else if (ad->which == ANGLE) {
if (ad->adim == 1) {
for (int i = ad->ilo; i <= ad->ihi; i++) for (int i = ad->ilo; i <= ad->ihi; i++)
ad->vector[i] = ad->vector_orig[i]; ad->vector[i] = ad->vector_orig[i];
} }

View File

@ -45,7 +45,7 @@ class FixAdapt : public Fix {
private: private:
int nadapt, resetflag, scaleflag, massflag; int nadapt, resetflag, scaleflag, massflag;
int anypair, anybond; int anypair, anybond, anyangle;
int nlevels_respa; int nlevels_respa;
char *id_fix_diam, *id_fix_chg; char *id_fix_diam, *id_fix_chg;
class FixStore *fix_diam, *fix_chg; class FixStore *fix_diam, *fix_chg;
@ -57,14 +57,16 @@ class FixAdapt : public Fix {
char *var; char *var;
char *pstyle, *pparam; char *pstyle, *pparam;
char *bstyle, *bparam; char *bstyle, *bparam;
char *astyle, *aparam;
int ilo, ihi, jlo, jhi; int ilo, ihi, jlo, jhi;
int pdim, bdim; int pdim, bdim, adim;
double *scalar, scalar_orig; double *scalar, scalar_orig;
double *vector, *vector_orig; double *vector, *vector_orig;
double **array, **array_orig; double **array, **array_orig;
int aparam; int atomparam;
class Pair *pair; class Pair *pair;
class Bond *bond; class Bond *bond;
class Angle *angle;
}; };
Adapt *adapt; Adapt *adapt;