Exemplo n.º 1
0
static void Simple_hklList(T_SgInfo *SgInfo, int Maxh, int Maxk, int Maxl,
                           int ListSysAbsent)
{
  int        h, k, l, iList, restriction, M, n, i;
  int        Minh, Mink, Minl;
  int        uvw[3];
  int        CCMx_PL[9], deterCCMx_LP = 0, hP, kP, lP;


  if (SgInfo->LatticeInfo->Code != 'P')
  {
    deterCCMx_LP = deterRotMx(SgInfo->CCMx_LP);
                 InverseRotMx(SgInfo->CCMx_LP, CCMx_PL);

    if (deterCCMx_LP < 1)
      goto ReturnError;
  }

  SetListMin_hkl(SgInfo, Maxk, Maxl, &Minh, &Mink, &Minl);

  fprintf(stdout, ">Begin hklList\n");

  for (h = Minh; h <= Maxh; h++)
  for (k = Mink; k <= Maxk; k++)
  for (l = Minl; l <= Maxl; l++)
  {
    iList = IsSysAbsent_hkl(SgInfo, h, k, l, &restriction);
    if (SgError != NULL)
      return;

    M = BuildEq_hkl(SgInfo, NULL, h, k, l);
    if (SgError != NULL)
      return;

    if (iList == 0)
    {
      if ((iList = IsSuppressed_hkl(SgInfo, Minh, Mink, Minl,
                                                  Maxk, Maxl,
                                               h,    k,    l)) != 0)
        n = fprintf(stdout, "# %3d %3d %3d  %3d  [%d]",
                            h, k, l, M, iList);
      else
        n = fprintf(stdout, "  %3d %3d %3d  %3d",
                            h, k, l, M);

      if (restriction >= 0)
      {
        while (n < 27) { n++; putc(' ', stdout); }
        n += fprintf(stdout, " %2d/%d", restriction, STBF);
      }

      while (n < 34) { n++; putc(' ', stdout); }
      if (Is_si(SgInfo, h, k, l) == 1)
        n += fprintf(stdout, " s.i.");

      while (n < 41) { n++; putc(' ', stdout); }
      Set_uvw(SgInfo, h, k, l, uvw);
      for (i = 0; i < SgInfo->n_si_Vector; i++)
        n += fprintf(stdout, " %3d", uvw[i]);

      if (SgInfo->LatticeInfo->Code != 'P')
      {
        hP = h * CCMx_PL[0] + k * CCMx_PL[3] + l * CCMx_PL[6];
        kP = h * CCMx_PL[1] + k * CCMx_PL[4] + l * CCMx_PL[7];
        lP = h * CCMx_PL[2] + k * CCMx_PL[5] + l * CCMx_PL[8];

        if (hP % deterCCMx_LP || kP % deterCCMx_LP || lP % deterCCMx_LP)
          goto ReturnError;

        hP /= deterCCMx_LP;
        kP /= deterCCMx_LP;
        lP /= deterCCMx_LP;

        while (n < 55) { n++; putc(' ', stdout); }
          n += fprintf(stdout, " P  %3d %3d %3d",
                               hP, kP, lP);
      }

      putc('\n', stdout);
    }
    else if (ListSysAbsent)
      fprintf(stdout, "# %3d %3d %3d  %3d  (%d)\n",
                      h, k, l, M, iList);
  }

  fprintf(stdout, ">End hklList\n");

  return;

  ReturnError:

  SetSgError("Internal Error: Simple_hklList()");
  return;
}
Exemplo n.º 2
0
int Verify_sghkl(const T_SgInfo *SgInfo, int FriedelSym,
                 int Maxh, int Maxk, int Maxl)
{
    int  h, k, l;
    int  Minh, Mink, Minl;
    int  iList, iEq, HKLabsent, Restr, EpsCond, EpsLoop, nNotHidden, ErrCount;
    int  nLoopInv, iLoopInv;

    int                              nRefl, iRefl, jRefl;
    struct {
        int h, k, l, M, R, f;
    } *Refl, *Ri, *Rj;

    T_Eq_hkl  Eq_hkl[1];


    nRefl =   (2 * Maxh + 1)
              * (2 * Maxk + 1)
              * (2 * Maxl + 1);

    Refl = malloc(nRefl * sizeof (*Refl));
    if (Refl == NULL) {
        SetSgError("Internal Error: Not enough core");
        return -1;
    }

    if (SetListMin_hkl(SgInfo, FriedelSym,
                       Maxh,  Maxk,  Maxl,
                       &Minh, &Mink, &Minl) != 0)
        return -1;

    Ri = Refl;

    for (h = -Maxh; h <= Maxh; h++)
        for (k = -Maxk; k <= Maxk; k++)
            for (l = -Maxl; l <= Maxl; l++, Ri++)
            {
                Ri->h = h;
                Ri->k = k;
                Ri->l = l;

                Ri->M = Mult_hkl(SgInfo, FriedelSym, h, k, l);
                if (SgError != NULL)
                    return -1;

                Ri->f = 0;

                iList = LoopIsSysAbsent_hkl(SgInfo, h, k, l, &Ri->R);
                if (SgError != NULL)
                    return -1;

                if (iList != 0)
                    Ri->f = -1;
                else
                {
                    iList = IsHidden_hkl(SgInfo, FriedelSym,
                                         Minh, Mink, Minl,
                                         Maxh, Maxk, Maxl,
                                         h,    k,    l);
                    if (iList == 0)
                        Ri->f = 1;
                }
            }

    ErrCount = 0;

    Ri = Refl;

    for (iRefl = 0; iRefl < nRefl; iRefl++, Ri++)
    {
        if (SgInfo->nReflCond >= 0)
        {
            HKLabsent = CondIsSysAbsent_hkl(SgInfo->ReflCond, SgInfo->nReflCond,
                                            Ri->h, Ri->k, Ri->l);

            if ((Ri->f == -1) != (HKLabsent != 0)) {
                Fprintf(stdout,
                        "Error: %3d %3d %3d %s(%d) vs. %s(%d) mismatch\n",
                        Ri->h, Ri->k, Ri->l,
                        "LoopIsSysAbsent_hkl", Ri->f,
                        "CondIsSysAbsent_hkl", HKLabsent);
                ErrCount++;
            }

            if (Ri->f != -1 && SgInfo->nRestCond >= 0)
            {
                Restr = Get_hklRestriction(SgInfo->RestCond, SgInfo->nRestCond,
                                           Ri->h, Ri->k, Ri->l);
                if (Ri->R != Restr) {
                    Fprintf(stdout,
                            "Error: %3d %3d %3d %s(%d) vs. %s(%d) mismatch\n",
                            Ri->h, Ri->k, Ri->l,
                            "LoopIsSysAbsent_hkl", Ri->R,
                            "Get_hklRestriction", Restr);
                    ErrCount++;
                }
            }

            if (Ri->f != -1)
            {
                EpsLoop = Epsilon_hkl(SgInfo, Ri->h, Ri->k, Ri->l);

                EpsCond = Get_hklEpsilon(SgInfo->ReflCond, SgInfo->nReflCond,
                                         SgInfo->SysEnhanced,
                                         Ri->h, Ri->k, Ri->l);

                if (EpsLoop != EpsCond) {
                    Fprintf(stdout,
                            "Error: %3d %3d %3d %s(%d) vs. %s(%d) mismatch\n",
                            Ri->h, Ri->k, Ri->l,
                            "Epsilon_hkl", EpsLoop,
                            "Get_hklEpsilon", EpsCond);
                    ErrCount++;
                }
            }
        }

        if (Ri->f == 1)
        {
            if (Ri->h < Minh || Ri->k < Mink || Ri->l < Minl) {
                Fprintf(stdout, "Error: %3d %3d %3d not hidden\n",
                        Ri->h, Ri->k, Ri->l);
                ErrCount++;
            }
        }

        (void) BuildEq_hkl(SgInfo, FriedelSym, Eq_hkl, Ri->h, Ri->k, Ri->l);
        if (SgError != NULL)
            return -1;

        if (Ri->M != Eq_hkl->M) {
            Fprintf(stdout,
                    "Error: %3d %3d %3d Mult_hkl(%d) vs. BuildEq_hkl(%d) mismatch\n",
                    Ri->h, Ri->k, Ri->l, Ri->M, Eq_hkl->M);
            ErrCount++;
        }

        nLoopInv = (Eq_hkl->Centric == 0 ? 1 : 2);

        nNotHidden = 0;

        for (iLoopInv = 0; iLoopInv < nLoopInv; iLoopInv++)
        {
            for (iEq = 0; iEq < Eq_hkl->N; iEq++)
            {
                h = Eq_hkl->h[iEq];
                if (abs(h) > Maxh) continue;
                k = Eq_hkl->k[iEq];
                if (abs(k) > Maxk) continue;
                l = Eq_hkl->l[iEq];
                if (abs(l) > Maxl) continue;

                if (iLoopInv) {
                    h *= -1;
                    k *= -1;
                    l *= -1;
                }

                Rj = Refl;

                for (jRefl = 0; jRefl < nRefl; jRefl++, Rj++)
                    if (   h == Rj->h
                            && k == Rj->k
                            && l == Rj->l)
                        break;

                if (jRefl == nRefl) {
                    Fprintf(stdout,
                            "Error: %3d %3d %3d sym. equiv. %3d %3d %3d not found\n",
                            Ri->h, Ri->k, Ri->l, h, k, l);
                    ErrCount++;
                }
                else
                {
                    if (AreSymEquivalent_hkl(SgInfo, FriedelSym,
                                             Ri->h, Ri->k, Ri->l,
                                             Rj->h, Rj->k, Rj->l) == 0)
                    {
                        if (SgError != NULL)
                            return -1;

                        Fprintf(stdout,
                                "Error: %3d %3d %3d vs. %3d %3d %3d %s failed\n",
                                Ri->h, Ri->k, Ri->l,
                                Rj->h, Rj->k, Rj->l, "AreSymEquivalent_hkl()");
                        ErrCount++;
                    }

                    if (Ri->M != Rj->M) {
                        Fprintf(stdout,
                                "Error: %3d %3d %3d vs. %3d %3d %3d multiplicity mismatch\n",
                                Ri->h, Ri->k, Ri->l,
                                Rj->h, Rj->k, Rj->l);
                        ErrCount++;
                    }

                    if ((Ri->f == -1) != (Rj->f == -1)) {
                        Fprintf(stdout,
                                "Error: %3d %3d %3d vs. %3d %3d %3d sys. abs. mismatch\n",
                                Ri->h, Ri->k, Ri->l,
                                Rj->h, Rj->k, Rj->l);
                        ErrCount++;
                    }

                    if (iRefl != jRefl && Ri->f == 1 && Rj->f == 1) {
                        Fprintf(stdout,
                                "Error: %3d %3d %3d vs. %3d %3d %3d sym. equiv. not hidden\n",
                                Ri->h, Ri->k, Ri->l,
                                Rj->h, Rj->k, Rj->l);
                        ErrCount++;
                    }

                    if (Rj->f == 1)
                        nNotHidden++;
                }
            }
        }

        if (Ri->f != -1 && nNotHidden == 0) {
            Fprintf(stdout, "Error: %3d %3d %3d all sym. equiv. hidden\n",
                    Ri->h, Ri->k, Ri->l);
            ErrCount++;
        }
    }

    free(Refl);

    return ErrCount;
}
Exemplo n.º 3
0
int main (int argc, char *argv[]){
	if (argc != 2){
		printf("Give a parameter file.\n");
		exit(1);
	}
	int SpaceGrp;
	double LatC[6], wl, Lsd, MaxRingRad;
	char *ParamFN;
    FILE *fileParam;
    ParamFN = argv[1];
    char aline[1000];
    fileParam = fopen(ParamFN,"r");
    char *str, dummy[1000];
    int LowNr;
    while (fgets(aline,1000,fileParam)!=NULL){
        str = "SpaceGroup ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %d", dummy, &SpaceGrp);
            continue;
        }
        str = "LatticeConstant ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %lf %lf %lf %lf %lf %lf", dummy, &LatC[0],
					&LatC[1], &LatC[2], &LatC[3], &LatC[4], &LatC[5]);
            continue;
        }
        str = "LatticeParameter ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %lf %lf %lf %lf %lf %lf", dummy, &LatC[0],
					&LatC[1], &LatC[2], &LatC[3], &LatC[4], &LatC[5]);
            continue;
        }
        str = "Wavelength ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %lf", dummy, &wl);
            continue;
        }
        str = "Lsd ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %lf", dummy, &Lsd);
            continue;
        }
        str = "MaxRingRad ";
        LowNr = strncmp(aline,str,strlen(str));
        if (LowNr==0){
            sscanf(aline,"%s %lf", dummy, &MaxRingRad);
            continue;
        }
	}
	printf("%f %f %f %d %f %f %f %f %f %f\n",wl,Lsd,MaxRingRad,SpaceGrp,LatC[0],LatC[1],LatC[2],LatC[3],LatC[4],LatC[5]);
	int h, k, l, iList, restriction, M, i, j;
	int Minh, Mink, Minl;
	int CCMx_PL[9], deterCCMx_LP = 0;
	double Epsilon = 0.0001;
	int Families[50000][3];
	T_SgInfo *SgInfo;
	char SgName[200]; 
	int F_Convention='A';
	const T_TabSgName *tsgn; 
	
	printf("Generating hkl's\n");
	if((SgInfo = (T_SgInfo *)malloc(sizeof(T_SgInfo)))==NULL){
		printf("Unable to allocate SgInfo\n");
		printf("Aborting\n");
		exit(1);
	}
	SgInfo->GenOption = 0;
	SgInfo->MaxList   = 192;
	if((SgInfo->ListSeitzMx = (T_RTMx*)malloc(SgInfo->MaxList * sizeof(T_RTMx)))==NULL){
		printf("Unable to allocate (SgInfo.ListSeitzMx\n");
		printf("Aborting\n");
		exit(1);
	}
	SgInfo->ListRotMxInfo = NULL;
	InitSgInfo(SgInfo);
	sprintf(SgName,"%d",SpaceGrp);
	tsgn = FindTabSgNameEntry(SgName, F_Convention);
	if (tsgn == NULL){
		printf("Error: Unknown Space Group Symbol\n");
		printf("Aborting\n");
		exit(1);
	}
	sprintf(SgName,"%s",tsgn->HallSymbol);
	SgInfo->TabSgName = tsgn;
	if (tsgn) SgInfo->GenOption = 1;
	{
		int pos_hsym;
		pos_hsym = ParseHallSymbol(SgName, SgInfo);
		
		if (SgError != NULL) {
			printf("Error: Unknown Space Group Symbol\n");
			printf("Aborting\n");
			exit(1);
		}
	}
	if(CompleteSgInfo(SgInfo)!=0) {
		printf("Error in Complete\n");
		printf("Aborting\n");
		exit(1);
	}
	if (SgInfo->LatticeInfo->Code != 'P')
	{
		deterCCMx_LP = deterRotMx(SgInfo->CCMx_LP);
		InverseRotMx(SgInfo->CCMx_LP, CCMx_PL);
		if (deterCCMx_LP < 1) {
			printf("deterCMM failed.\n");
			return 0;
		}
	}
	int Maxh, Maxk, Maxl;
	int nrFilled=0;
	Maxh = 10;
	Maxk = 10;
	Maxl = 10;
	SetListMin_hkl(SgInfo, Maxk, Maxl, &Minh, &Mink, &Minl);
	printf("Will go from %d to %d in h; %d to %d in k; %d to %d in l.\n",Minh, Maxh, Mink, Maxk, Minl, Maxl);
	for (h = Minh; h <= Maxh; h++){
		for (k = Mink; k <= Maxk; k++){
			for (l = Minl; l <= Maxl; l++){
				if (h==0 && k==0 && l==0){
					continue;
				}
				iList = IsSysAbsent_hkl(SgInfo, h, k, l, &restriction);
				if (SgError != NULL) {
					printf("IsSysAbsent_hkl failed.\n");
					return 0;
				}
				if (iList == 0){
					if ((iList = IsSuppressed_hkl(SgInfo, Minh, Mink, Minl,
						Maxk, Maxl, h, k, l)) != 0) {/* Suppressed reflections */
					} else {
						//printf("New plane.\n");
						T_Eq_hkl Eq_hkl;
						M = BuildEq_hkl(SgInfo, &Eq_hkl, h, k, l);
						if (SgError != NULL){
							return 0;
						}
						for (i=0;i<Eq_hkl.N;i++){
							for (j=-1;j<=1;j+=2){
								//printf("%d %d %d\n",Eq_hkl.h[i]*j,Eq_hkl.k[i]*j,Eq_hkl.l[i]*j);
								Families[nrFilled][0] = Eq_hkl.h[i]*j;
								Families[nrFilled][1] = Eq_hkl.k[i]*j;
								Families[nrFilled][2] = Eq_hkl.l[i]*j;
								nrFilled++;
							}
						}
					}
				}
			}
		}
	}
	int AreDuplicates[50000];
	double **UniquePlanes;
	UniquePlanes = allocMatrix(50000,3);
	for (i=0;i<50000;i++) AreDuplicates[i] = 0;
	int nrPlanes=0;
	for (i=0;i<nrFilled-1;i++){
		if (AreDuplicates[i] == 1){
			continue;
		}
		for (j=i+1;j<nrFilled;j++){
			if (Families[i][0] == Families[j][0] && 
				Families[i][1] == Families[j][1] && 
				Families[i][2] == Families[j][2] &&
				AreDuplicates[j] == 0){
					AreDuplicates[j] = 1;
			}
		}
		UniquePlanes[nrPlanes][0] = (double)Families[i][0];
		UniquePlanes[nrPlanes][1] = (double)Families[i][1];
		UniquePlanes[nrPlanes][2] = (double)Families[i][2];
		nrPlanes++;
	}
	double **hkls;
	hkls = allocMatrix(nrPlanes,12);
	CorrectHKLsLatC(LatC,UniquePlanes,nrPlanes,hkls);
	SortFunc(nrPlanes,11,hkls,3,-1);
	double DsMin = wl/(2*sind((atand(MaxRingRad/Lsd))/2));
	for (i=0;i<nrPlanes;i++){
		if (hkls[i][3] < DsMin){
			nrPlanes = i;
			break;
		}
	}
	int RingNr = 1;
	double DsTemp = hkls[0][3];
	hkls[0][4] = 1;
	hkls[0][8] = asind(wl/(2*(hkls[0][3])));
	hkls[0][9] = hkls[0][8]*2;
	hkls[0][10] = Lsd*tand(hkls[0][9]);
	for (i=1;i<nrPlanes;i++){
		if (fabs(hkls[i][3] - DsTemp) < Epsilon){
			hkls[i][4] = RingNr;
		}else{
			DsTemp = hkls[i][3];
			RingNr++;
			hkls[i][4] = RingNr;
		}
		hkls[i][8] = asind(wl/(2*(hkls[i][3])));
		hkls[i][9] = hkls[i][8]*2;
		hkls[i][10] = Lsd*tand(hkls[i][9]);
	}
	char *fn = "hkls.csv";
	FILE *fp;
	fp = fopen(fn,"w");
	fprintf(fp,"h k l D-spacing RingNr\n");
	for (i=0;i<nrPlanes;i++){
		fprintf(fp,"%.0f %.0f %.0f %f %.0f %f %f %f %f %f %f\n",hkls[i][0],
			hkls[i][1],hkls[i][2],hkls[i][3],hkls[i][4],
			hkls[i][5],hkls[i][6],hkls[i][7],hkls[i][8],
			hkls[i][9],hkls[i][10]);
	}
}