static int DoMulSMxLTr(T_SgOps *SgOps, int iLSMx, int iLLTr, int OldOnly) { const T_RTMx *LSMxi; const T_LTr *LLTri; int NewLTr[3]; const int iLLTr0 = iLLTr; LSMxi = &SgOps->SMx[iLSMx]; for (; iLSMx < SgOps->nSMx; iLSMx++, LSMxi++) { LLTri = &SgOps->LTr[iLLTr0]; for (iLLTr = iLLTr0; iLLTr < (OldOnly ? SgOps->nLSL : SgOps->nLTr); iLLTr++, LLTri++) { RotMx_t_Vector(NewLTr, LSMxi->s.R, LLTri->v, 0); if (AddSgLTr(SgOps, NewLTr) < 0) return -1; } } return 0; }
static int AddLtrDueToInvT(T_SgOps *SgOps, const T_RTMx *LSMx) { int NewLTr[3], i; RotMx_t_Vector(NewLTr, LSMx->s.R, SgOps->InvT, 0); for (i = 0; i < 3; i++) NewLTr[i] += 2 * LSMx->s.T[i] - SgOps->InvT[i]; return AddSgLTr(SgOps, NewLTr); }
int SetSeitzMxInfo(const T_RTMx *SMx, T_SMxI *SI) { int Mul, Mx[9], wl[3], Rank, i; if (SI->Order == 0) { if (SetRotMxInfo(SMx->s.R, SI) == 0) return 0; } else ResetSeitzMxInfo(SI, 1); Mul = MakeCumRMx(SMx->s.R, SI->Order, Mx); RotMx_t_Vector(SI->wg, Mx, SMx->s.T, 0); for (i = 0; i < 3; i++) { if (SI->wg[i] % Mul) goto ReturnError; SI->wg[i] /= Mul; } for (i = 0; i < 3; i++) wl[i] = -(SMx->s.T[i] - SI->wg[i]) * (CTBF / STBF); SetRminusI(SMx->s.R, Mx, 0); Rank = iReducedRowEchelon(Mx, 3, 3, wl, 1); for (i = 2; i >= Rank; i--) if (iModPositive(wl[i], STBF) != 0) goto ReturnError; if (Rank == 1) { for (i = 0; i < 3; i++) { if (Mx[i] != 0) break; SI->Tr[i] = 0; } if (i < 3) { SI->Tr[i] = wl[0]; if (SI->Tr[i] % Mx[i]) goto ReturnError; SI->Tr[i] /= Mx[i]; i++; } for (; i < 3; i++) SI->Tr[i] = 0; } else if (Rank == 2) { if (RRE2Tr(Mx, wl, SI->Tr) != 0) goto ReturnError; } else if (Rank == 3) { for (i = 0; i < 3; i++) { SI->Tr[i] = wl[i]; if (SI->Tr[i] % Mx[4 * i]) goto ReturnError; SI->Tr[i] /= Mx[4 * i]; } } return SI->Order; ReturnError: ResetSeitzMxInfo(SI, 1); return 0; }
static void RRE1BVAB(const int *Mx, const int *BVC, int *BVA, int *BVB, const int *Mbv) { int iPerm, mPerm, Det, MinDet, f, i; const int rPerm[3][3] = {{ 0, 1, 2}, { 2, 0, 1}, { 1, 2, 0}}; #define pMx(ir) Mx[rPerm[iPerm][ir]] #define pBVA(ir) BVA[rPerm[iPerm][ir]] #define pBVB(ir) BVB[rPerm[iPerm][ir]] #define pBVC(ir) BVC[rPerm[iPerm][ir]] for (iPerm = 0;;) { if (pMx(0) == 0) { if (pMx(1) == 0) { f = 1; if (pBVC(2) < 0) f = -1; pBVA(0) = f; pBVB(0) = 0; pBVA(1) = 0; pBVB(1) = 1; pBVA(2) = 0; pBVB(2) = 0; return; } else if (pMx(2) != 0) { f = 1; if (pMx(2) * pBVC(2) + pMx(1) * pBVC(1) < 0) f = -1; pBVA(0) = f; pBVB(0) = 0; pBVA(1) = 0; pBVB(1) = pMx(2); pBVA(2) = 0; pBVB(2) = -pMx(1); return; } iPerm = 1; } else if (pMx(1) == 0) iPerm = 2; else if (pMx(2) == 0) iPerm = 1; else break; } MinDet = 0; mPerm = 0; for (iPerm = 0; iPerm < 3; iPerm++) { if (Mbv == NULL) { Det = pBVC(0) * pMx(0) * pMx(1) + pBVC(1) * pMx(1) * pMx(1) + pBVC(2) * pMx(1) * pMx(2); } else { pBVA(0) = pMx(1); pBVA(1) = -pMx(0); pBVA(2) = 0; RotMx_t_Vector(BVB, Mbv, BVA, 0); Det = BVC[0] * (BVA[1] * BVB[2] - BVA[2] * BVB[1]) - BVC[1] * (BVA[0] * BVB[2] - BVA[2] * BVB[0]) + BVC[2] * (BVA[0] * BVB[1] - BVA[1] * BVB[0]); } if ((abs(MinDet) > abs(Det) || MinDet == 0) && Det != 0) { MinDet = Det; mPerm = iPerm; } } iPerm = mPerm; pBVA(0) = pMx(1); pBVA(1) = -pMx(0); pBVA(2) = 0; if (Mbv == NULL) { pBVB(0) = 0; pBVB(1) = pMx(2); pBVB(2) = -pMx(1); } else RotMx_t_Vector(BVB, Mbv, BVA, 0); if (MinDet < 0) for (i = 0; i < 3; i++) BVA[i] *= -1; #undef pMx #undef pBVA #undef pBVB #undef pBVC return; }
static void MarkLegalOrigins(const T_SgInfo *SgInfo, int *TestField) { int O[3], V[3], mx, my, mz, i; int IsFine, iList, iLoopInv, nLoopInv; int BufMx[9]; const T_RTMx *lsmx; int nTrV, iTrV; const int *TrV; nLoopInv = Sg_nLoopInv(SgInfo); nTrV = SgInfo->LatticeInfo->nTrVector; for (O[0] = 0; O[0] < 12; O[0]++) for (O[1] = 0; O[1] < 12; O[1]++) for (O[2] = 0; O[2] < 12; O[2]++) { IsFine = 1; for (iList = 0; IsFine && iList < SgInfo->nList; iList++) { lsmx = &SgInfo->ListSeitzMx[iList]; for (iLoopInv = 0; IsFine && iLoopInv < nLoopInv; iLoopInv++) { if (iLoopInv == 0) for (i = 0; i < 9; i++) { if (i % 4) BufMx[i] = lsmx->s.R[i]; else BufMx[i] = lsmx->s.R[i] - 1; } else for (i = 0; i < 9; i++) { if (i % 4) BufMx[i] = -lsmx->s.R[i]; else BufMx[i] = -lsmx->s.R[i] - 1; } RotMx_t_Vector(V, BufMx, O, 12); TrV = SgInfo->LatticeInfo->TrVector; for (iTrV = 0; iTrV < nTrV; iTrV++) { mx = (V[0] * (STBF / 12) + *TrV++) % STBF; my = (V[1] * (STBF / 12) + *TrV++) % STBF; mz = (V[2] * (STBF / 12) + *TrV++) % STBF; if (mx == 0 && my == 0 && mz == 0) break; } if (iTrV == nTrV) IsFine = 0; } } *TestField++ = IsFine; #if DEBUG_MarkLegalOrigins if (IsFine != 0) Fprintf(stdout, " %2d %2d %2d\n", O[0], O[1], O[2]); #endif } }