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)); }
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; }
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; }
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]); } }
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; }
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; }
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.; }
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); }