Accessing drude ID in a fix

Hello, I am using the user-drude package. I am writing a custom fix in which I am trying to extract the atom ID of a core atom’s drude partner. (I could also do the other way around - a drude’s core partner ID).

In fix_drude.cpp, I am seeing these lines:
FixDrude *fdptr = (FixDrude *) ptr;

tagint *drudeid = fdptr->drudeid;
int *drudetyle = fdptr->drudetype;

My question is: if I want to access these same vectors in another fix, how would I go about it? It looks like the syntax is specific to fix_drude.cpp.

Thank you,
Anne

Hello, I am using the user-drude package. I am writing a custom fix in which I am trying to extract the atom ID of a core atom’s drude partner. (I could also do the other way around - a drude’s core partner ID).

In fix_drude.cpp, I am seeing these lines:
FixDrude *fdptr = (FixDrude *) ptr;

tagint *drudeid = fdptr->drudeid;
int *drudetyle = fdptr->drudetype;

My question is: if I want to access these same vectors in another fix, how would I go about it? It looks like the syntax is specific to fix_drude.cpp.

not really. this is a bit unusual, but that is due to its use in combination with a ring communication, which requires passing a function pointer with a specific calling sequence.

in LAMMPS, there are two ways of accessing internal data of other fix instances.

  1. you can access the class member variables/pointers directly, if they are declared public
  2. you can export them cast to a void pointer through an “extract” function.

in both cases, you first need to look up a pointer to the fix and for that you need the “fix id”, i.e. the string that is the first argument to the fix command, when creating the fix. a typical piece of code looks like this:

char *fixid = arg[iarg];
int ifix = modify->find_fix(fixid);
if (ifix < 0)
error->all(FLERR,“Illegal fix id for XXX fix”);
FixMyStyle *fixptr = (FixMyStyle *) modify->fix[ifix];
tagint *taglist = fixptr->tagdata;

from there on you can access public members of the FixMyStyle class, or protected members, if you class is listed as a friend class.

for private data, you the last two lines would change to:

Fix *fixptr = modify->fix[ifix];
int dim = 0;
tagint *taglist = (tagint *)fixptr->extract(“tagdata”,dim);
if ((taglist == NULL) || (dim != 1))
error->all(FLERR,“cannot access ‘tagdata’ from fix”);

and you would have to add/extend the extract function to return a void * of the internal data.

If you search through the LAMMPS sources you will find several examples of either use.
There are advantages and disadvantages to both variants.

Axel.

I’ll just add that if you are writing a new command that needs to find and access another
fix, then your command should take the ID of that fix as an argument. There are
many examples of commands that do this, for fixes and computes. E.g. fix ave/time.

Steve