int MakeCumRMx(const int *R, int Order, int *CumRMx) { int MxA[9], MxB[9]; int *RR, *RRR, *Swp, iO, i; if (Order < 0) { Order *= -1; if (Order % 2) Order *= 2; } InitRotMx(CumRMx, 1); if (Order > 1) { RR = (int *) R; RRR = MxA; for (iO = 1;;) { for (i = 0; i < 9; i++) CumRMx[i] += RR[i]; if (++iO == Order) break; RotMxMultiply(RRR, R, RR); if (RR == R) RR = MxB; Swp = RR; RR = RRR; RRR = Swp; } } return Order; }
static void PutSchakal(const T_SgInfo *SgInfo, FILE *fpout) { int iList, nMx, i; int nTrV, iTrV; const int *TrV; T_RTMx SMx; const T_RTMx *lsmx; const char *xyz; if (Sg_nLoopInv(SgInfo) == 2) fprintf(fpout, "DU -x,-y,-z\n"); nTrV = SgInfo->LatticeInfo->nTrVector; TrV = SgInfo->LatticeInfo->TrVector; if (nTrV > 1) { fprintf(fpout, "DU"); InitRotMx(SMx.s.R, 1); TrV += 3; for (iTrV = 1; iTrV < nTrV; iTrV++, TrV += 3) { for (i = 0; i < 3; i++) SMx.s.T[i] = TrV[i]; xyz = RTMx2XYZ(&SMx, 1, STBF, 0, 0, 1, ",", NULL, 0); if (xyz) { if (iTrV > 1) fprintf(fpout, " ;"); fprintf(fpout, " %s", xyz); } else { putc('\n', fpout); goto ReturnError; } } putc('\n', fpout); } nMx = 0; lsmx = &SgInfo->ListSeitzMx[1]; for (iList = 1; iList < SgInfo->nList; iList++, lsmx++) { xyz = RTMx2XYZ(lsmx, 1, STBF, 0, 0, 1, ",", NULL, 0); if (xyz) { if (nMx % 4 == 0) { if (nMx) putc('\n', fpout); fprintf(fpout, "SY %s", xyz); } else fprintf(fpout, " ; %s", xyz); } else { putc('\n', fpout); goto ReturnError; } nMx++; } if (nMx) putc('\n', fpout); putc('\n', fpout); return; ReturnError: SetSgError("Internal Error: PutSchakal()"); return; }