basic support for auxiliary label maps

can be created with labelmap via mapID keyword
referenced like mymapID::C
where C is an atom type, for example
This commit is contained in:
Jacob Gissinger
2021-01-29 22:38:33 -05:00
parent 8e255f619b
commit f6fe554b47
3 changed files with 45 additions and 6 deletions

View File

@ -204,6 +204,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
// type labels // type labels
nlmap = 0;
lmaps = nullptr; lmaps = nullptr;
// custom atom arrays // custom atom arrays
@ -1990,7 +1991,7 @@ void Atom::add_molecule_atom(Molecule *onemol, int iatom,
allocate space for type label map allocate space for type label map
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void Atom::add_label_map(std::string mapID) int Atom::add_label_map(std::string mapID)
{ {
labelmapflag = 1; labelmapflag = 1;
lmaps = (LabelMap **) lmaps = (LabelMap **)
@ -2005,6 +2006,7 @@ void Atom::add_label_map(std::string mapID)
lmaps[nlmap]->nimpropertypes = nimpropertypes; lmaps[nlmap]->nimpropertypes = nimpropertypes;
lmaps[nlmap]->allocate_type_labels(); lmaps[nlmap]->allocate_type_labels();
nlmap++; nlmap++;
return nlmap - 1;
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -2014,13 +2016,33 @@ void Atom::add_label_map(std::string mapID)
int Atom::find_label(std::string label, int mode) int Atom::find_label(std::string label, int mode)
{ {
// find label map ... in progress int ilmap = 0;
int ilmap;
ilmap = 0; // check for auxiliary map prefix
int pos = label.find("::");
if (pos != std::string::npos) {
ilmap = find_labelmap(label.substr(0,pos));
if (ilmap == -1) return -1;
label = label.substr(pos+2);
}
return lmaps[ilmap]->find(label,mode); return lmaps[ilmap]->find(label,mode);
} }
/* ----------------------------------------------------------------------
find first label map in set with ID
return -1 if does not exist
------------------------------------------------------------------------- */
int Atom::find_labelmap(std::string id)
{
int ilmap;
for (ilmap = 0; ilmap < nlmap; ilmap++)
if (id == lmaps[ilmap]->id) return ilmap;
return -1;
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
reorder owned atoms so those in firstgroup appear first reorder owned atoms so those in firstgroup appear first
called by comm->exchange() if atom_modify first group is set called by comm->exchange() if atom_modify first group is set

View File

@ -329,8 +329,9 @@ class Atom : protected Pointers {
int find_molecule(char *); int find_molecule(char *);
void add_molecule_atom(class Molecule *, int, int, tagint); void add_molecule_atom(class Molecule *, int, int, tagint);
void add_label_map(std::string mapID = ""); int add_label_map(std::string mapID = "");
int find_label(std::string, int); int find_label(std::string, int);
int find_labelmap(std::string);
void first_reorder(); void first_reorder();
virtual void sort(); virtual void sort();

View File

@ -1592,10 +1592,26 @@ void Input::kspace_style()
void Input::labelmap() void Input::labelmap()
{ {
if (narg < 2 || (narg % 2 == 0)) error->all(FLERR,"Illegal labelmap command");
if (domain->box_exist == 0) if (domain->box_exist == 0)
error->all(FLERR,"Labelmap command before simulation box is defined"); error->all(FLERR,"Labelmap command before simulation box is defined");
if (!atom->labelmapflag) atom->add_label_map(); if (!atom->labelmapflag) atom->add_label_map();
atom->lmaps[0]->modify_lmap(narg,arg);
int ilmap = 0;
std::string mapid;
for (int i = 1; i < narg; i++) {
if (strcmp(arg[i],"mapID") == 0) {
mapid = arg[i+1];
ilmap = atom->find_labelmap(mapid);
if (ilmap == -1) ilmap = atom->add_label_map(mapid);
if (narg > i+2) error->all(FLERR,"Illegal labelmap command");
narg = i - 2;
break;
}
i++;
}
atom->lmaps[ilmap]->modify_lmap(narg,arg);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */