Added option to impose fix propel/self only to specific types

This commit is contained in:
Stefan Paquay 2019-09-11 10:58:45 -04:00 committed by Pierre de Buyl
parent 768fd8f7fe
commit 60c0270375
2 changed files with 28 additions and 5 deletions

View File

@ -30,8 +30,25 @@ thermo_style custom time step pe ke etotal temp
thermo 1000 thermo 1000
run 25000 run 25000
group one type 1
group two type 2
compute ke1 one ke
compute ke2 two ke
thermo_style custom time step pe ke etotal temp c_ke1 c_ke2
fix active all propel/self velocity 1.0 fix active all propel/self velocity 1.0
# With active force there is more motion so increase bin size: # With active force there is more motion so increase bin size:
neighbor 1.0 bin neighbor 1.0 bin
run 25000 run 25000
# Only make type 1 active:
fix active all propel/self velocity 1.0 types 1
# With active force there is more motion so increase bin size:
neighbor 1.0 bin
run 25000

View File

@ -88,8 +88,10 @@ FixPropelSelf::FixPropelSelf( LAMMPS *lmp, int narg, char **argv )
// In this case we need to allocate the type list. // In this case we need to allocate the type list.
// First find the largest given type: // First find the largest given type:
int max_type_in_list = 0; int max_type_in_list = 0;
while (!isalpha(arg[iarg + n_types_filter][0])) { ++iarg;
int curr_type = force->numeric(FLERR, arg[iarg + n_types_filter]); while ( (iarg + n_types_filter < narg) &&
(!isalpha(argv[iarg + n_types_filter][0]))) {
int curr_type = force->numeric(FLERR, argv[iarg + n_types_filter]);
if (curr_type > max_type_in_list) max_type_in_list = curr_type; if (curr_type > max_type_in_list) max_type_in_list = curr_type;
++n_types_filter; ++n_types_filter;
} }
@ -110,10 +112,11 @@ FixPropelSelf::FixPropelSelf( LAMMPS *lmp, int narg, char **argv )
} }
for (int i = 0; i < n_types_filter; ++i) { for (int i = 0; i < n_types_filter; ++i) {
int curr_type = force->numeric(FLERR, arg[iarg + i]); int curr_type = force->numeric(FLERR, argv[iarg + i]);
apply_to_type[curr_type] = 1; apply_to_type[curr_type] = 1;
} }
// Done handling types argument. // Done handling types argument.
iarg += n_types_filter; // -1 because we incremented by 1 previously.
} else { } else {
char msg[2048]; char msg[2048];
sprintf(msg, "Illegal fix propel/self command: " sprintf(msg, "Illegal fix propel/self command: "
@ -158,6 +161,7 @@ void FixPropelSelf::post_force(int vflag )
case VELOCITY: case VELOCITY:
if (n_types_filter) post_force_velocity<1>(vflag); if (n_types_filter) post_force_velocity<1>(vflag);
else post_force_velocity<0>(vflag); else post_force_velocity<0>(vflag);
break;
default: default:
error->all(FLERR, "reached statement that should be unreachable"); error->all(FLERR, "reached statement that should be unreachable");
} }
@ -173,7 +177,9 @@ void FixPropelSelf::post_force_quaternion(int /* vflag */ )
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
int *type = atom->type;
int* ellipsoid = atom->ellipsoid;
AtomVecEllipsoid::Bonus *bonus = av->bonus; AtomVecEllipsoid::Bonus *bonus = av->bonus;
// Add the active force to the atom force: // Add the active force to the atom force:
for( int i = 0; i < nlocal; ++i ){ for( int i = 0; i < nlocal; ++i ){
@ -185,7 +191,6 @@ void FixPropelSelf::post_force_quaternion(int /* vflag */ )
double f_act[3] = { 0.0, 0.0, 1.0 }; double f_act[3] = { 0.0, 0.0, 1.0 };
double f_rot[3]; double f_rot[3];
int* ellipsoid = atom->ellipsoid;
double *quat = bonus[ellipsoid[i]].quat; double *quat = bonus[ellipsoid[i]].quat;
tagint *tag = atom->tag; tagint *tag = atom->tag;
@ -228,6 +233,7 @@ void FixPropelSelf::post_force_velocity(int /*vflag*/ )
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
tagint *tag = atom->tag; tagint *tag = atom->tag;
int *type = atom->type;
// Add the active force to the atom force: // Add the active force to the atom force:
for( int i = 0; i < nlocal; ++i ){ for( int i = 0; i < nlocal; ++i ){