示例#1
0
static void SetProfileReferenceReflIndex(void)
{
  int         iLFc, iLFcClose, h, k, l;
  Fprec       TT, DeltaTT, CloseDelta;
  T_ListFcal  *LFc;


  iLFcClose  = -1;

  if      (ProfileReferenceRefl.Mode == PRRM_hkl)
  {
    h = ProfileReferenceRefl.h;
    k = ProfileReferenceRefl.k;
    l = ProfileReferenceRefl.l;

    if (IsSysAbsent_hkl(&SpgrInfo, h, k, l, NULL) != 0)
      progerror("ProfileReferenceRefl hkl is systematically absent");

    LFc = ListFcal;

    for (iLFc = 0; iLFc < nListFcal; iLFc++, LFc++)
    {
      if (AreSymEquivalent_hkl(&SpgrInfo, 1,
                               h, k, l,
                               LFc->h, LFc->k, LFc->l)) {
        iLFcClose = iLFc;
        break;
      }
    }
  }
  else if (ProfileReferenceRefl.Mode == PRRM_TTheta)
  {
    CloseDelta = 0.;

    LFc = ListFcal;

    for (iLFc = 0; iLFc < nListFcal; iLFc++, LFc++)
    {
                TT = TwoThetaDeg(LFc->Q);
      DeltaTT = TT - ProfileReferenceRefl.TTheta;
      DeltaTT = AppFabs(DeltaTT);

      if (CloseDelta > DeltaTT || iLFcClose < 0)
      {
          iLFcClose  = iLFc;
          CloseDelta = DeltaTT;
      }
    }
  }

  ProfileReferenceRefl.Index = iLFcClose;

  if (Debug1 && iLFcClose >= 0)
    Fprintf(stdout, "# ProfileReferenceRefl.Index -> %d %d %d  %.6g\n\n",
      ListFcal[iLFcClose].h,
      ListFcal[iLFcClose].k,
      ListFcal[iLFcClose].l,
      TwoThetaDeg(ListFcal[iLFcClose].Q));
}
示例#2
0
文件: sginfo.c 项目: alinelena/aten
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;
}
示例#3
0
文件: sginfo.c 项目: alinelena/aten
static int Try_GS_si(T_SgInfo *SgInfo)
{
  int       h, k, l, iList;
  int       Maxh, Maxk, Maxl;
  int       Minh, Mink, Minl;
  int       nTestField, *TestField;
  int       nProperty, *Property, *pp;
  int       IsFine, would_be, is;


  SgInfo->n_si_Vector = -1;

                       nTestField = 12 * 12 * 12;
  AppMalloc(TestField, nTestField);
  if (TestField == NULL) {
    SetSgError("Not enough core");
    return -1;
  }

  MarkLegalOrigins(SgInfo, TestField);

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

  nProperty =   (Maxh - Minh + 1)
              * (Maxk - Mink + 1)
              * (Maxl - Minl + 1);

  AppMalloc(Property, nProperty);
  if (Property == NULL) {
    SetSgError("Not enough core");
    AppFree(TestField, nTestField);
    return -1;
  }

  pp = Property;
  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, NULL);
    if (SgError != NULL)
    {
      AppFree(Property, nProperty);
      AppFree(TestField, nTestField);
      return -1;
    }

    if (iList == 0)
      *pp++ = Verify_si(h, k, l, TestField);
    else
      *pp++ = -1;
  }

  if (Find_si(SgInfo) >= 0)
  {
    IsFine = 1;

    pp = Property;
    for (h = Minh; IsFine && h <= Maxh; h++)
    for (k = Mink; IsFine && k <= Maxk; k++)
    for (l = Minl; IsFine && l <= Maxl; l++)
    {
      is = *pp++;

      if (is >= 0)
      {
        would_be = Is_si(SgInfo, h, k, l);
        if (is != would_be)
          IsFine = 0;
      }
    }

    if (IsFine)
    {
      AppFree(Property, nProperty);
      AppFree(TestField, nTestField);
      return 0;
    }
  }

  SetSgError("Internal Error: Can't determine s.i. vectors and moduli");

  AppFree(Property, nProperty);
  AppFree(TestField, nTestField);

  return -1;
}
示例#4
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]);
	}
}
示例#5
0
int Check_ssVM(T_SgInfo *SgInfo)
{
  int       h, k, l, iList;
  int       Maxh, Maxk, Maxl;
  int       Minh, Mink, Minl;
  int       nTestField, *TestField;
  int       nProperty, *Property, *pp;
  int       RetVal, would_be, is;


  TestField = NULL;
  Property  = NULL;
  RetVal    = -1;
                        nTestField = 12 * 12 * 12;
  nxs_malloc(TestField, nTestField);
  if (TestField == NULL) {
    SetSgError("Not enough core");
    goto CleanAndReturn;
  }

  MarkLegalOrigins(SgInfo, TestField);

  Maxh = Maxk = Maxl =  7;
  Minh = Mink = Minl = -7;

  nProperty =   (Maxh - Minh + 1)
              * (Maxk - Mink + 1)
              * (Maxl - Minl + 1);

  nxs_malloc(Property, nProperty);
  if (Property == NULL) {
    SetSgError("Not enough core");
    goto CleanAndReturn;
  }

  pp = Property;
  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, NULL);
    if (SgError != NULL)
      goto CleanAndReturn;

    if (iList == 0)
      *pp++ = Verify_ss(h, k, l, TestField);
    else
      *pp++ = -1;
  }

  pp = Property;
  for (h = Minh; h <= Maxh; h++)
  for (k = Mink; k <= Maxk; k++)
  for (l = Minl; l <= Maxl; l++)
  {
    is = *pp++;

    if (is >= 0) {
                would_be = Is_ss(SgInfo, h, k, l);
      if (is != would_be) {
        RetVal = 0;
        goto CleanAndReturn;
      }
    }
  }

  RetVal = 1;

  CleanAndReturn:

  if (Property)  free(Property);
  if (TestField) free(TestField);

  return RetVal;
}
示例#6
0
static Fprec DetFcalMaxQ(int UseRefrRefl, Fprec PeakRange)
{
  int    TT, h, k, l;
  Fprec  TTl, TTe, tanT, FWHM;
  Fprec  Q, FcalMaxQ;


  if (ProfileEnd == 0.)
  {
        TTe = TwoThetaDeg(FobsMaxQ);
    if (TTe == 0.)
      TT = 179;
    else {
          TT = (int) TTe + 1;
      if (TT > 179)
          TT = 179;
    }

    ProfileEnd = (Fprec) TT;
  }

  TTe = ProfileGenEnd = ProfileEnd;

  if (UseRefrRefl)
  {
    if      (ProfileReferenceRefl.Mode == PRRM_hkl)
    {
      h = ProfileReferenceRefl.h;
      k = ProfileReferenceRefl.k;
      l = ProfileReferenceRefl.l;

      if (IsSysAbsent_hkl(&SpgrInfo, h, k, l, NULL) != 0)
        progerror("ProfileReferenceRefl hkl is systematically absent");

      Q = Q_hkl(h, k, l, &LatConR);

      TTe = TwoThetaDeg(Q);
    }
    else if (   ProfileReferenceRefl.Mode == PRRM_TTheta
             && ProfileReferenceRefl.TTheta > 0.)
    {
          Q = SetHighQ(ProfileReferenceRefl.TTheta);
      if (Q == 0.)
        TTe = 179.;
      else
        TTe = TwoThetaDeg(Q);
    }

    if (ProfileGenEnd < TTe)
        ProfileGenEnd = TTe;

    TTe = ProfileGenEnd;
  }

  if (PeakRange > 0.)
  {
    for (TT = (int) ProfileGenEnd; TT < 179; TT++)
    {
                          tanT = AppTan(TT * .5 * PIover180);
          FWHM = CalcFWHM(tanT);
      if (FWHM >= 0.)
      {
            TTl = TT - FWHM * .5 * PeakRange;
        if (TTl <= ProfileGenEnd && TTe < (Fprec)(TT + 1))
          TTe = (Fprec)(TT + 1);
      }
    }
  }

  FcalMaxQ = Q_TTheta(TTe, LambdaLength);

  return FcalMaxQ;
}
示例#7
0
static Fprec SetHighQ(Fprec TTreference)
{
  int    iPass, InSphere, PrevInSphere, nHigherQ;
  int       h,    k,    l;
  int    Maxh, Maxk, Maxl;
  int    Minh, Mink, Minl;
  Fprec  dmin, Qref, Qmax, Q, HigherQ[2];


      Qref = Q_TTheta(TTreference, LambdaLength);
  if (Qref > 0.)
    dmin = 1. / AppSqrt(Qref);
  else
    dmin = 0.;

  CalcMaxhkl(&LatConR, &dmin, LambdaLength, &Maxh, &Maxk, &Maxl);
  Qref = 1. / Square(dmin);
  Qmax = 4. / Square(LambdaLength);

  PrevInSphere = -1;

  for (iPass = 0;; iPass++)
  {
    if      (iPass % 3 == 0 && iPass != 0)
      Maxh++;
    else if (iPass % 3 == 1)
      Maxk++;
    else if (iPass % 3 == 2)
      Maxl++;

    if (iPass == 0 || iPass % 3 != 0)
      (void) SetListMin_hkl(&SpgrInfo, 1,
                            Maxh, Maxk, Maxl, &Minh, &Mink, &Minl);

    InSphere = 0;
    nHigherQ = 0;

    for (h = Minh; h <= Maxh; h++)
    for (k = Mink; k <= Maxk; k++)
    for (l = Minl; l <= Maxl; l++)
    {
          Q = Q_hkl(h, k, l, &LatConR);
      if (Q > Qmax)
        continue;

      InSphere++;

      if (Q <= Qref)
        continue;

      if (IsSysAbsent_hkl(&SpgrInfo, h, k, l, NULL) != 0)
        continue;
      if (IsHidden_hkl(&SpgrInfo, 1,
                       Minh, Mink, Minl,
                       Maxh, Maxk, Maxl,
                          h,    k,    l) != 0)
        continue;

      if      (nHigherQ == 0)
      {
         HigherQ[0] = Q;
        nHigherQ = 1;
      }
      else if (nHigherQ == 1 || HigherQ[1] > Q)
      {
         HigherQ[1] = Q;
        nHigherQ = 2;

        if (HigherQ[1] < HigherQ[0]) {
            HigherQ[1] = HigherQ[0];
            HigherQ[0] = Q;
        }
      }
    }

    if (nHigherQ == 2)
      return HigherQ[1];

    if (InSphere == PrevInSphere)
      break;

    PrevInSphere = InSphere;
  }

  if (Debug1)
    Fprintf(stdout, "# SetHighQ(): nHigherQ = %d\n\n", nHigherQ);

  return 0.;
}
示例#8
0
static void BuildListFcal(Fprec FcalMaxQ)
{
  int              h, k, l, pass, iListFcal;
  int              Minh, Mink, Minl;
  int              Maxh, Maxk, Maxl;
  int              restriction;
  Fprec            dmin, Qmax, Q;
  Fprec            FcalAbs2;
  CmplxFprec       Fcal;
  T_ListFcal       *lfcal;


  if (FcalMaxQ > 0.)
    dmin = 1. / AppSqrt(FcalMaxQ);
  else
    dmin = 0.;

  CalcMaxhkl(&LatConR, &dmin, LambdaLength, &Maxh, &Maxk, &Maxl);
  Qmax = 1. / Square(dmin);

  (void) SetListMin_hkl(&SpgrInfo, 1, Maxh, Maxk, Maxl, &Minh, &Mink, &Minl);

  MaxFcal = 0;
  nListFcal = iListFcal = 0;

  for (pass = 0; pass < 2; pass++)
  {
    if (pass == 1 && nListFcal > 0)
      CheckMalloc(ListFcal, nListFcal);

    lfcal = ListFcal;

    for (h = Minh; h <= Maxh; h++)
    for (k = Mink; k <= Maxk; k++)
    for (l = Minl; l <= Maxl; l++)
    {
          Q = Q_hkl(h, k, l, &LatConR);
      if (Q > Qmax)
        continue;

      if (IsSysAbsent_hkl(&SpgrInfo, h, k, l, &restriction) != 0)
        continue;
      if (IsHidden_hkl(&SpgrInfo, 1,
                       Minh, Mink, Minl,
                       Maxh, Maxk, Maxl,
                          h,    k,    l) != 0)
        continue;

      if (pass == 0)
        nListFcal++;
      else
      {
        if (iListFcal >= nListFcal)
          InternalError("iListFcal >= nListFcal");

        CalcFcal(&Fcal, h, k, l);

        FcalAbs2 = Fcal.r * Fcal.r + Fcal.i * Fcal.i;
        if (MaxFcal < FcalAbs2) MaxFcal = FcalAbs2;

        lfcal->h = h;
        lfcal->k = k;
        lfcal->l = l;
        lfcal->restriction = restriction;
        lfcal->Fcal.r = Fcal.r;
        lfcal->Fcal.i = Fcal.i;
        lfcal->Q = Q;
        lfcal++;

        iListFcal++;
      }
    }
  }

  MaxFcal = AppSqrt(MaxFcal);

  if (iListFcal != nListFcal)
    InternalError("iListFcal != nListFcal");

  if (nListFcal > 1)
    qsort((void *) ListFcal, nListFcal, sizeof (*ListFcal),
          (SortFunction) ListFcalSortFunction);
}