Esempio n. 1
0
File: sggen.c Progetto: rwgk/sglite
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;
}
Esempio n. 2
0
File: sggen.c Progetto: rwgk/sglite
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
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;
}
Esempio n. 5
0
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
  }
}