restore original delete_atoms implementation. new version spun off as PR #4492
This commit is contained in:
@ -35,12 +35,11 @@ Syntax
|
|||||||
*variable* args = variable-name
|
*variable* args = variable-name
|
||||||
|
|
||||||
* zero or more keyword/value pairs may be appended
|
* zero or more keyword/value pairs may be appended
|
||||||
* keyword = *compress* or *condense* or *bond* or *mol*
|
* keyword = *compress* or *bond* or *mol*
|
||||||
|
|
||||||
.. parsed-literal::
|
.. parsed-literal::
|
||||||
|
|
||||||
*compress* value = *no* or *yes*
|
*compress* value = *no* or *yes*
|
||||||
*condense* value = *no* or *yes*
|
|
||||||
*bond* value = *no* or *yes*
|
*bond* value = *no* or *yes*
|
||||||
*mol* value = *no* or *yes*
|
*mol* value = *no* or *yes*
|
||||||
|
|
||||||
@ -51,7 +50,6 @@ Examples
|
|||||||
|
|
||||||
delete_atoms group edge
|
delete_atoms group edge
|
||||||
delete_atoms region sphere compress no
|
delete_atoms region sphere compress no
|
||||||
delete_atoms region sphere condense yes
|
|
||||||
delete_atoms overlap 0.3 all all
|
delete_atoms overlap 0.3 all all
|
||||||
delete_atoms overlap 0.5 solvent colloid
|
delete_atoms overlap 0.5 solvent colloid
|
||||||
delete_atoms random fraction 0.1 yes all cube 482793 bond yes
|
delete_atoms random fraction 0.1 yes all cube 482793 bond yes
|
||||||
@ -131,31 +129,21 @@ other options listed above.
|
|||||||
|
|
||||||
Here is the meaning of the optional keywords.
|
Here is the meaning of the optional keywords.
|
||||||
|
|
||||||
If the *compress* keyword is set to *yes* (which is the default), then
|
If the *compress* keyword is set to *yes*, then after atoms are
|
||||||
after atoms are deleted, the atom IDs are re-assigned so that they run
|
deleted, then atom IDs are re-assigned so that they run from 1 to the
|
||||||
from 1 to the number of atoms in the system. Note that this is not done
|
number of atoms in the system. Note that this is not done for
|
||||||
for molecular systems (see the :doc:`atom_style <atom_style>` command),
|
molecular systems (see the :doc:`atom_style <atom_style>` command),
|
||||||
regardless of the *compress* setting, since it would corrupt the bond
|
regardless of the *compress* setting, since it would foul up the bond
|
||||||
connectivity information that has already been assigned. However, the
|
connectivity that has already been assigned. However, the
|
||||||
:doc:`reset_atoms id <reset_atoms>` command can be used after this
|
:doc:`reset_atoms id <reset_atoms>` command can be used after this
|
||||||
command to accomplish the same thing.
|
command to accomplish the same thing.
|
||||||
|
|
||||||
Note that this re-assignment of IDs is not really a compression, where
|
Note that the re-assignment of IDs is not really a compression, where
|
||||||
gaps in atom IDs are removed by decrementing atom IDs that are larger.
|
gaps in atom IDs are removed by decrementing atom IDs that are larger.
|
||||||
Instead the IDs for all atoms are erased, and new IDs are assigned so
|
Instead the IDs for all atoms are erased, and new IDs are assigned so
|
||||||
that the atoms owned by individual processors have consecutive IDs, as
|
that the atoms owned by individual processors have consecutive IDs, as
|
||||||
the :doc:`create_atoms <create_atoms>` command explains.
|
the :doc:`create_atoms <create_atoms>` command explains.
|
||||||
|
|
||||||
.. versionadded:: TBD
|
|
||||||
|
|
||||||
If the *condense* keyword set to *yes*, then after atoms are deleted,
|
|
||||||
the atom IDs are re-assigned in a way such that the order of atom-IDs is
|
|
||||||
preserved. This process is not efficient and cannot be used for very
|
|
||||||
large systems and requires local storage that scales with the number of
|
|
||||||
total atoms in the system. Also, the *compress* and the *condense*
|
|
||||||
keywords cannot be used at the same time. Whichever of the two is used
|
|
||||||
last will be applied.
|
|
||||||
|
|
||||||
A molecular system with fixed bonds, angles, dihedrals, or improper
|
A molecular system with fixed bonds, angles, dihedrals, or improper
|
||||||
interactions, is one where the topology of the interactions is
|
interactions, is one where the topology of the interactions is
|
||||||
typically defined in the data file read by the :doc:`read_data
|
typically defined in the data file read by the :doc:`read_data
|
||||||
|
|||||||
@ -35,7 +35,6 @@
|
|||||||
#include "region.h"
|
#include "region.h"
|
||||||
#include "variable.h"
|
#include "variable.h"
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -53,9 +52,9 @@ DeleteAtoms::DeleteAtoms(LAMMPS *lmp) : Command(lmp) {}
|
|||||||
void DeleteAtoms::command(int narg, char **arg)
|
void DeleteAtoms::command(int narg, char **arg)
|
||||||
{
|
{
|
||||||
if (domain->box_exist == 0)
|
if (domain->box_exist == 0)
|
||||||
error->all(FLERR, -1, "Delete_atoms command before simulation box is defined");
|
error->all(FLERR, "Delete_atoms command before simulation box is defined");
|
||||||
if (narg < 1) utils::missing_cmd_args(FLERR, "delete_atoms", error);
|
if (narg < 1) utils::missing_cmd_args(FLERR, "delete_atoms", error);
|
||||||
if (atom->tag_enable == 0) error->all(FLERR, -1, "Cannot use delete_atoms unless atoms have IDs");
|
if (atom->tag_enable == 0) error->all(FLERR, "Cannot use delete_atoms unless atoms have IDs");
|
||||||
|
|
||||||
// store state before delete
|
// store state before delete
|
||||||
|
|
||||||
@ -79,21 +78,21 @@ void DeleteAtoms::command(int narg, char **arg)
|
|||||||
delete_random(narg, arg);
|
delete_random(narg, arg);
|
||||||
// deprecated porosity option, now included in new partial option
|
// deprecated porosity option, now included in new partial option
|
||||||
else if (strcmp(arg[0], "porosity") == 0) {
|
else if (strcmp(arg[0], "porosity") == 0) {
|
||||||
error->all(FLERR, Error::ARGZERO,
|
error->all(FLERR,
|
||||||
"The delete_atoms 'porosity' keyword has been removed.\n"
|
"The delete_atoms 'porosity' keyword has been removed.\n"
|
||||||
"Please use: delete_atoms random fraction frac exact group-ID region-ID seed\n");
|
"Please use: delete_atoms random fraction frac exact group-ID region-ID seed\n");
|
||||||
} else if (strcmp(arg[0], "variable") == 0)
|
} else if (strcmp(arg[0], "variable") == 0)
|
||||||
delete_variable(narg, arg);
|
delete_variable(narg, arg);
|
||||||
else
|
else
|
||||||
error->all(FLERR, Error::ARGZERO, "Unknown delete_atoms sub-command: {}", arg[0]);
|
error->all(FLERR, "Unknown delete_atoms sub-command: {}", arg[0]);
|
||||||
|
|
||||||
if (allflag) {
|
if (allflag) {
|
||||||
int igroup = group->find("all");
|
int igroup = group->find("all");
|
||||||
if ((igroup >= 0) && modify->check_rigid_group_overlap(group->bitmask[igroup]))
|
if ((igroup >= 0) && modify->check_rigid_group_overlap(group->bitmask[igroup]))
|
||||||
if (comm->me == 0) error->warning(FLERR, "Attempting to delete atoms in rigid bodies");
|
error->warning(FLERR, "Attempting to delete atoms in rigid bodies");
|
||||||
} else {
|
} else {
|
||||||
if (modify->check_rigid_list_overlap(dlist))
|
if (modify->check_rigid_list_overlap(dlist))
|
||||||
if (comm->me == 0) error->warning(FLERR, "Attempting to delete atoms in rigid bodies");
|
error->warning(FLERR, "Attempting to delete atoms in rigid bodies");
|
||||||
}
|
}
|
||||||
|
|
||||||
// if allflag = 1, just reset atom->nlocal
|
// if allflag = 1, just reset atom->nlocal
|
||||||
@ -131,9 +130,6 @@ void DeleteAtoms::command(int narg, char **arg)
|
|||||||
// if non-molecular system and compress flag set:
|
// if non-molecular system and compress flag set:
|
||||||
// reset atom tags to be contiguous
|
// reset atom tags to be contiguous
|
||||||
// set all atom IDs to 0, call tag_extend()
|
// set all atom IDs to 0, call tag_extend()
|
||||||
// if condense flag set, collect atom IDs for all atoms in replicated global array.
|
|
||||||
// sort array according to tag value, skip over tags that are zero and determine new tag.
|
|
||||||
// build new array with tags for all local atoms.
|
|
||||||
|
|
||||||
if (compress_flag) {
|
if (compress_flag) {
|
||||||
if (atom->molecular == Atom::ATOMIC) {
|
if (atom->molecular == Atom::ATOMIC) {
|
||||||
@ -143,47 +139,6 @@ void DeleteAtoms::command(int narg, char **arg)
|
|||||||
atom->tag_extend();
|
atom->tag_extend();
|
||||||
} else if (comm->me == 0)
|
} else if (comm->me == 0)
|
||||||
error->warning(FLERR, "Ignoring 'compress yes' for molecular system");
|
error->warning(FLERR, "Ignoring 'compress yes' for molecular system");
|
||||||
} else if (condense_flag) {
|
|
||||||
if (atom->molecular == Atom::ATOMIC) {
|
|
||||||
if (atom->map_style == Atom::MAP_NONE)
|
|
||||||
error->all(FLERR, Error::NOLASTLINE, "Using 'condense yes' option requires an atom map");
|
|
||||||
if (atom->map_tag_max + 1 > MAXSMALLINT)
|
|
||||||
error->all(FLERR, Error::NOLASTLINE, "Too many atoms for using 'condense yes' option");
|
|
||||||
tagint *tag = atom->tag;
|
|
||||||
int nlocal = atom->nlocal;
|
|
||||||
int nall = nlocal + atom->nghost;
|
|
||||||
tagint maxtag = atom->map_tag_max + 1;
|
|
||||||
auto mytags = std::vector<tagint>(maxtag, 0);
|
|
||||||
auto alltags = std::vector<tagint>(maxtag, 0);
|
|
||||||
for (int i = 0; i < nlocal; i++) mytags[tag[i]] = tag[i];
|
|
||||||
MPI_Allreduce(mytags.data(), alltags.data(), maxtag, MPI_LMP_TAGINT, MPI_SUM, world);
|
|
||||||
std::sort(alltags.begin(), alltags.end());
|
|
||||||
tagint newtag = 0;
|
|
||||||
int localidx;
|
|
||||||
mytags.resize(nall);
|
|
||||||
for (int i = 0; i < nall; ++i) mytags[i] = 0;
|
|
||||||
// update atom map
|
|
||||||
atom->map_init(0);
|
|
||||||
atom->nghost = 0;
|
|
||||||
atom->map_set();
|
|
||||||
for (auto t : alltags) {
|
|
||||||
// skip over unset tags
|
|
||||||
if (!t) continue;
|
|
||||||
++newtag;
|
|
||||||
localidx = atom->map(t);
|
|
||||||
if ((localidx < 0)) continue;
|
|
||||||
mytags[localidx] = newtag;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < nall; ++i) tag[i] = mytags[i];
|
|
||||||
|
|
||||||
// recreate atom map again
|
|
||||||
atom->map_tag_max = -1;
|
|
||||||
atom->map_style_set();
|
|
||||||
atom->map_init(0);
|
|
||||||
atom->nghost = 0;
|
|
||||||
atom->map_set();
|
|
||||||
} else if (comm->me == 0)
|
|
||||||
error->warning(FLERR, "Ignoring 'condense yes' for molecular system");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset atom->natoms and also topology counts
|
// reset atom->natoms and also topology counts
|
||||||
@ -354,7 +309,7 @@ void DeleteAtoms::delete_overlap(int narg, char **arg)
|
|||||||
|
|
||||||
if (force->pair == nullptr) error->all(FLERR, "Delete_atoms requires a pair style be defined");
|
if (force->pair == nullptr) error->all(FLERR, "Delete_atoms requires a pair style be defined");
|
||||||
if (cut > neighbor->cutneighmax) error->all(FLERR, "Delete_atoms cutoff > max neighbor cutoff");
|
if (cut > neighbor->cutneighmax) error->all(FLERR, "Delete_atoms cutoff > max neighbor cutoff");
|
||||||
if ((cut > neighbor->cutneighmin) && comm->me == 0)
|
if (cut > neighbor->cutneighmin && comm->me == 0)
|
||||||
error->warning(FLERR, "Delete_atoms cutoff > minimum neighbor cutoff");
|
error->warning(FLERR, "Delete_atoms cutoff > minimum neighbor cutoff");
|
||||||
|
|
||||||
// setup domain, communication and neighboring
|
// setup domain, communication and neighboring
|
||||||
@ -925,35 +880,28 @@ void DeleteAtoms::options(int narg, char **arg)
|
|||||||
{
|
{
|
||||||
compress_flag = 1;
|
compress_flag = 1;
|
||||||
bond_flag = mol_flag = 0;
|
bond_flag = mol_flag = 0;
|
||||||
condense_flag = 0;
|
|
||||||
|
|
||||||
int iarg = 0;
|
int iarg = 0;
|
||||||
while (iarg < narg) {
|
while (iarg < narg) {
|
||||||
if (strcmp(arg[iarg], "compress") == 0) {
|
if (strcmp(arg[iarg], "compress") == 0) {
|
||||||
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms compress", error);
|
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms compress", error);
|
||||||
compress_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
compress_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
||||||
if (condense_flag && compress_flag) condense_flag = 0;
|
|
||||||
iarg += 2;
|
|
||||||
} else if (strcmp(arg[iarg], "condense") == 0) {
|
|
||||||
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms condense", error);
|
|
||||||
condense_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
|
||||||
if (compress_flag && condense_flag) compress_flag = 0;
|
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
} else if (strcmp(arg[iarg], "bond") == 0) {
|
} else if (strcmp(arg[iarg], "bond") == 0) {
|
||||||
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms bond", error);
|
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms bond", error);
|
||||||
|
if (atom->molecular == Atom::ATOMIC)
|
||||||
|
error->all(FLERR, "Cannot use delete_atoms bond yes for non-molecular systems");
|
||||||
|
if (atom->molecular == Atom::TEMPLATE)
|
||||||
|
error->all(FLERR, "Cannot use delete_atoms bond yes with atom_style template");
|
||||||
bond_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
bond_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
||||||
if (bond_flag && (atom->molecular == Atom::ATOMIC))
|
|
||||||
error->all(FLERR, iarg, "Cannot use delete_atoms bond yes for non-molecular systems");
|
|
||||||
if (bond_flag && (atom->molecular == Atom::TEMPLATE))
|
|
||||||
error->all(FLERR, iarg, "Cannot use delete_atoms bond yes with atom_style template");
|
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
} else if (strcmp(arg[iarg], "mol") == 0) {
|
} else if (strcmp(arg[iarg], "mol") == 0) {
|
||||||
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms mol", error);
|
if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "delete_atoms mol", error);
|
||||||
|
if (atom->molecule_flag == 0)
|
||||||
|
error->all(FLERR, "Delete_atoms mol yes requires atom attribute molecule");
|
||||||
mol_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
mol_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp);
|
||||||
if (mol_flag && (atom->molecule_flag == 0))
|
|
||||||
error->all(FLERR, iarg, "Delete_atoms mol yes requires atom attribute molecule");
|
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
} else
|
} else
|
||||||
error->all(FLERR, iarg, "Unknown delete_atoms option: {}", arg[iarg]);
|
error->all(FLERR, "Unknown delete_atoms option: {}", arg[iarg]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,7 @@ class DeleteAtoms : public Command {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
int *dlist;
|
int *dlist;
|
||||||
int allflag, compress_flag, condense_flag, bond_flag, mol_flag;
|
int allflag, compress_flag, bond_flag, mol_flag;
|
||||||
std::map<tagint, int> *hash;
|
std::map<tagint, int> *hash;
|
||||||
|
|
||||||
void delete_group(int, char **);
|
void delete_group(int, char **);
|
||||||
|
|||||||
Reference in New Issue
Block a user