The following template code shows how to loop all symops.
At first, nLoopInv is set using the Sg_nLoopInv macro. nLoopInv can take two values, 1 if the space group is acentric or there is an inversion operation off origin, or 2 if the space group is centric.
iModPositive(i, j) at the bottom is a very simple function which essentially returns i % j. However, if i % j is less than 0, iModPositive() will return i % j + j in order to make the result positive. In the present example iModPositive() ensures that the translation components of SMx will always be in the range [0...(STBF-1)].
This isn't too bad, is it?
#include <stdio.h>
#include <stdlib.h>
#include "sginfo.h"
static void LoopSymOps(const T_SgInfo *SgInfo)
{
int iList, f, i;
int nTrV, iTrV, nLoopInv, iLoopInv;
const int *TrV;
T_RTMx SMx;
const T_RTMx *lsmx;
nLoopInv = Sg_nLoopInv(SgInfo);
nTrV = SgInfo->LatticeInfo->nTrVector;
TrV = SgInfo->LatticeInfo->TrVector;
for (iTrV = 0; iTrV < nTrV; iTrV++, TrV += 3)
{
for (iLoopInv = 0; iLoopInv < nLoopInv; iLoopInv++)
{
if (iLoopInv == 0) f = 1;
else f = -1;
lsmx = SgInfo->ListSeitzMx;
for (iList = 0; iList < SgInfo->nList; iList++, lsmx++)
{
for (i = 0; i < 9; i++)
SMx.s.R[i] = f * lsmx->s.R[i];
for (i = 0; i < 3; i++)
SMx.s.T[i] = iModPositive(f * lsmx->s.T[i] + TrV[i], STBF);
/* use SMx at this point
*/
}
}
}
}