C
C FILE SPELIB Last Update: 1986.12.11
C ------ I.D.Brown
C
C THIS FILE CONTAINS:
C
C S SPOST(IER,ND) DERIVES ONE CORDINATE TRIPLET FOR EACH SPECIAL
C POSITION
C S REDEFI(SPS,TPS) REDEFINES INDEPENDENT VARIABLES IN SEITZ MATRIS
C (SPS/TPS) TO INCLUDE TRANSLATIONSc
C S NEWAXS(SPS,TPS) REASSIGNES AXES OF INDEPENDENT VARIABLES IN
C SEITZ MATRIX
C S TEHECU(SP,SPS) REASSIGNES DEPENDENT AXES IN SEITZ MATRIX FOR
C HIGHER SYMMETRIES
C S SHCTOR(TP,SP,TU,NLT) REDEFINES TRANSLATIONS IN SEITZ MATRIX WITH
C RESPECT TO LATTICE TRANSLATIONS
C S SPMULT CALCULATES THE MULTIPLICATION TABLE FOR SPECIAL
C POSITIONS
C S SPESOR DOES STANDARD ORDERING OF SPECIAL POSITIONS
C S SPSYM CREATES POINT GROUP SYMBOL FOR ALL SPECIAL
C POSITIONS
C F ITESTR(TA,TB,TU,NLT,SP) CHECKS ON EQUIVALENCE OF TWO TRANSLATIONS
C S RECENT(X,N) BRINGS N-VECTOR ELEMENTS INTO RANGE (.0,.99)
C S LTRANS(NLT,T,TU) ADDS CENTRING TRANSLATIONS TO ARRAY =TU=
C S XALTNO(XX,NPOS,NA1,NA2,IC,NT,ZZ) ZZ IS THE SAME AS XX TRANFORMED TO
C THE ALTERMATT POSITION
C S NALTNO(XX,NOS,NA1,NA2,IC,NT) DERIVES THE SPECIAL POSITION NUMBER
C FOR AN ATOMIC POSITION
C F IALTST(SN,TM,X) "SLAVE" TO NALTNO
C
C EXTERNALS CALLED IN THIS FILE:
C
C MATHLB: ICOMMA, ICOMVE, INTEGER, MMINM, SECOND, VMINV, VPLUSV
C SYMLIB: SYMOP, SYMULT
C
C
C****** STANDARD FORTRAN 77 CODE ONLY USED IN THIS FILE
C
C
C
C
SUBROUTINE SPOST(IER,NBUG)
C --------------------------
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, OCT/NOV 1984
C
C THIS SUBROUTINE CALCULATES THE SPECIAL POSITION TABLE STORED IN
C ISPTAB
C
C CALLS LTRANS, VPLUSV, MMINM, SYMULT, ICOMMA, SHCTOR,
C RECENT, ITESTR, INTEGER, ICOMVE, REDEFI, TEHECU,
C NEWAXS
C
C***** CALLS TIME-FUNCTION =SECOND(I)=
C
C THEORY
C ------
C
C IF THE VECTOR X REPRESENTS THE COORDINATES OF A SPECIAL POSITION
C THEN
C X = SX+T+L
C WHERE S/T IS A SYMMETRY OPERATOR AND L IS ANY UNIT LATTICE TRANSLATION
C
C HENCE
C (I-S)X = T+L
C OR X = (I-S)**(-1)*(T+L)
C
C EQUATIONS WITHOUT SOLUTIONS CORRESPOND TO GLIDES AND SCREWS
C THAT DO NOT GIVE RISE TO SPECIAL POSITIONS.
C IN MANY CASES EQUATIONS ARE INDETERMINATE BECAUSE A COLUMN 'I'
C AND ROW 'I' ARE ALL ZERO OR MATRIX S IS SINGULAR. IN THESE CASES
C THE VALUE OF X(I) IS NOT FIXED OR DEPENDENT ON X(J) BY SYMMETRY.
C
CHARACTER*8 GLAT,GCENT,GCFL
C
C SYSTEM COMMON BLOCKS
C
COMMON/FILES/NIN,NOUT,NDEBUG
COMMON/SYM/NSYM,MSYM,S(3,3,48),T(3,48),NTT,TA(3,4)
COMMON/GSYM/GLAT,GCENT
COMMON/SYMA/MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30),
+ MULTSP(30),SP(3,3,30),TP(3,30)
C
DIMENSION SD(3,3),TD(3),TU(3,14),LR(3),L2(3),LC(3),SS(3,3),
+ IPOINT(48),ROW(3),AROW(3),COL(3),ACOL(3),KZ(3),TT(3),TPP(3)
DIMENSION ISAVE(48),SPS(3,3,48),TPS(3,48),R222(3),TS(3),TSS(3)
DIMENSION SPP(3,3),KZZ(3)
C GENERAL LATTICE TRANSLATIONS
DATA TU/1.,1.,1., 1.,0.,0., 0.,1.,0., 0.,0.,1., 0.,1.,1.,
+ 1.,0.,1., 1.,1.,0., 0.,0.,0., 18*.0/
C
C TO AVOID EXESS OUTPUT, THE SWITCH FOR DEBUG-OUTPUT =NDEBUG= IS
C TEMPORARELLY REDEFINED AT THIS POINT
C
NDEB=NDEBUG
NDEBUG=NBUG
C
MSP=30
IER=0
NLT=8
C FLAGS TO FIND DEPENDANT AXIS
ICRFL1=0
ICRFL2=0
ICRFL3=0
C FLAGS TO FIND HEXAGONAL AXIS
IHEXE=0
IHEXZ=0
IHEXS=0
M3=0
C FLAGS TO FIND 11Z-SYMMETRY (AND RELATED..)
I11Z=0
I11ZS=0
I11ZC=0
C FLAGS TO FIND 222-SYMMETRY
R222(1)=0.0
R222(2)=0.0
R222(3)=0.0
I222=0
I222L=0
I222S=0
I2LIM=1
C ZERO COUNTERS
NSP=0
NSP1=0
NSP2=0
NSP3=0
NSP4=0
NSP5=0
NSP6=0
C FLAG TO FIND 1/4,1/4,3/4
I444=0
C FLAG FOR CENTRE OF SYMMETRY (ANYWHERE)
GCFL='A'
IF(GCENT.NE.'C') THEN
L=NSYM/2+1
DO 5 I=1,L
TRACE=S(1,1,I)+S(2,2,I)+S(3,3,I)
OTR=S(1,2,I)+S(1,3,I)+S(2,3,I)+S(2,1,I)+S(3,1,I)+S(3,2,I)
IF(INTEGER(TRACE,1).EQ.-30.AND.INTEGER(OTR,3).EQ.0) THEN
GCFL='C'
GOTO 10
ENDIF
5 CONTINUE
ELSE
GCFL='C'
ENDIF
C
C FIRST BRING ALL TRANSLATIONS INTO RANGE 0 TO .99 AND RESET
C SYM-OP POINTER (.NE.1 IF SYMMETRY OPERATOR ELIMINATED)
C
10 DO 170 I=1,NSYM
IPOINT(I)=1
170 I30 = 3
CALL RECENT(T(1,I),I30)
C
C PREPARE THE TRANSLATIONAL SYMMETRY MATRIX TU BY ADDING THE
C APPROPRIATE LATTICE CENTERING TRANSLATIONS
C
IF(NTT.EQ.1) GO TO 100
DO 20 II=2,NTT
20 CALL LTRANS(NLT,TA(1,II),TU)
100 IF (NDEBUG.NE.0) WRITE (NDEBUG,2100) GLAT,GCFL,NLT,((TU(I1,I2),I2
1 =1,14),I1=1,3)
2100 FORMAT (/,1X,'++DEBUG++SPOST++2100++ GLAT = ',A1,', GCFL = ',A1,
1 ', NLT =',I3,3(/,5X,14F5.2))
C
C SCAN THROUGH ALL THE SYMMETRY OPERATORS
C
DO 700 II=2,NSYM
I=II
IF(IPOINT(I).NE.1) GOTO 700
IPOINT(I)=0
C
C ELIMINATE SCREW AXIS AND GLIDE PLANES WHEN THEY CANNOT GENERATE A SPEC.POS.
C
IF(GLAT.EQ.'I'.OR.GLAT.EQ.'F'.OR.GLAT.EQ.'H') GOTO 105
IF(S(1,1,I).GT.0.01.AND.T(1,I).GT.0.01) THEN
IF(INTEGER(T(1,I),1).EQ.5.AND.
1 (GLAT.EQ.'B'.OR.GLAT.EQ.'C')) GOTO 190
GOTO 700
ENDIF
190 IF(S(2,2,I).GT.0.01.AND.T(2,I).GT.0.01) THEN
IF(INTEGER(T(2,I),1).EQ.5.AND.
1 (GLAT.EQ.'A'.OR.GLAT.EQ.'C')) GOTO 192
GOTO 700
ENDIF
192 IF(S(3,3,I).GT.0.01.AND.T(3,I).GT.0.01) THEN
IF(INTEGER(T(3,I),1).EQ.5.AND.
1 (GLAT.EQ.'B'.OR.GLAT.EQ.'A')) GOTO 105
GOTO 700
ENDIF
C
C IF SYMOP OR PRODUCT OF SYMOPS ELIMINATED, DROP IT (SEE STAT. 540)
C
105 N=II
IF(I.EQ.II) GOTO 106
IF(IPOINT(MULT(I,II)).NE.1) GOTO 500
N=MULT(I,II)
IPOINT(N)=0
106 I30 = 3
CALL MMINM(SD,S(1,1,1),S(1,1,N),I30)
C
C CHECK FOR A TWO-FOLD AXIS AND SET 222-FLAG TO CREATE THE POSITION
C AT THE INTERSECTION OF THREE TWO-FILD AXES
C
I222L=I222
IF(I222.GT.2) GOTO 107
DO 250 M1=1,3
IF(S(M1,M1,N).GT.0.01.AND.T(M1,N).GT.0.01) GOTO 107
IF(ABS(S(M1,M1,N)).LT.0.99.OR.ABS(S(M1,M1,N)).GT.1.01) GOTO 107
DO 250 M2=1,3
IF(M2.EQ.M1) GOTO 250
IF(ABS(S(M1,M2,N)).GT.0.01) GOTO 107
250 CONTINUE
TRACE=S(1,1,N)+S(2,2,N)+S(3,3,N)
IF(TRACE.GT.-.99.OR.TRACE.LT.-1.01) GOTO 107
I222=I222+1
IPOINT(N)=-1
DO 255 M1=1,3
255 IF(R222(M1).LT.0.01) R222(M1)=T(M1,N)
IF(NDEBUG.NE.0) WRITE (NDEBUG,2110) I222
2110 FORMAT(' ++DEBUG++SPOST++2110++ I222 =',I4)
C
C SKIP IF MATRIX IS NUL (PURE TRANSLATION)
C
107 DO 110 K=1,3
TS(K)=T(K,N)
110 AROW(K)=ABS(SD(K,1))+ABS(SD(K,2))+ABS(SD(K,3))
IF((AROW(1)+AROW(2)+AROW(3)).LT.0.01) GOTO 700
C
C SCAN THROUGH ALL THE LATTICE TRANSLATIONS STORED IN =TU=
C
NSP3=NSP
ICUB1=0
605 DO 600 J=1,NLT
IF(J.LT.I2LIM) GOTO 600
IF(J.GT.8.AND.GLAT.EQ.'H') GOTO 600
CALL VPLUSV(TD,TS,TU(1,J))
C
C SKIP IF MATRIX DOES NOT LEAD TO SPECIAL POSITION
C
DO 150 K=1,3
IF(TD(K).GT.1.99) GOTO 600
AROW(K)=ABS(SD(K,1))+ABS(SD(K,2))+ABS(SD(K,3))
IF(AROW(K).LT.0.01) THEN
IF(TU(K,J).GT.0.99) GOTO 600
IF(TD(K).GT.0.99) TD(K)=TD(K)-1.0
IF(TD(K).GT.0.01) GOTO 600
ENDIF
150 CONTINUE
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,2001) SECOND(3),II,I,N,J
2001 FORMAT(' ++DEBUG++SPOST++2001++(',F6.2,') SYMOP=',I3,',',I3
+ ,',',I3,', TRANSL=',I3)
WRITE(NDEBUG,2002)((SD(K,L),L=1,3),TD(K),T(K,N),AROW(K),
+ K=1,3)
2002 FORMAT(' ++DEBUG++SPOST++2002++ SD',8X,'TD',8X,'T',
+ 7X,'AROW',3(/,18X,3F5.2,3(4X,F5.2)))
ENDIF
C
C TO SOLVE THE EQUATION (SD)(X)=(TD) WE HAVE TO TEACH THE COMPUTER
C SOME ALGEBRA, BECAUSE SD MAY BE SINGULAR OR NON-QUADRATIC
C
C SET THREE LINE-MEMORIES
C
MEM=0
MEM1=0
MEM2=0
C
C INCREMENT NSP AND SET SOME STATISTICS
C
NSP=NSP+1
IF (NSP.GT.MSP) GOTO 160
ICUB=1
TRACE=0.0
DO 200 K=1,3
TP(K,NSP)=0.0
TRACE=TRACE+ABS(SD(K,K))
IF(INTEGER(SD(K,K),0).NE.1) ICUB=0
LR(K)=0
L2(K)=0
LC(K)=0
ROW(K)=0.0
COL(K)=0.0
ACOL(K)=0.0
DO 210 L=1,3
SP(K,L,NSP)=0.0
IF(ABS(SD(K,L)).GT.0.01) LR(K)=LR(K)+1
IF(ABS(SD(L,K)).GT.0.01) LC(K)=LC(K)+1
IF(ABS(SD(K,L)).GT.1.01) L2(K)=L2(K)+1
ROW(K)=ROW(K)+SD(K,L)
COL(K)=COL(K)+SD(L,K)
ACOL(K)=ACOL(K)+ABS(SD(L,K))
210 CONTINUE
200 CONTINUE
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,2020) (K,LR(K),LC(K),L2(K),ROW(K),AROW(K),
1 COL(K),ACOL(K),ICUB,K=1,3)
2020 FORMAT(' ++DEBUG++SPOST++2020 K LR LC L2 ROW AROW',
1 ' COL ACOL ICUB',3(/,21X,4I4,4F6.2,I4))
ENDIF
C
C LOOP THROUGH ALL ROWS...
C
DO 220 K=1,3
IF(ACOL(K).LT.0.01.AND.AROW(K).LT.0.01) THEN
C -- NON-FIXED AXIS
SP(K,K,NSP)=1.00
GOTO 220
ENDIF
IF(LR(K).EQ.1.AND.LC(K).EQ.1) THEN
C -- FIXED TRANSLATION
IF(TD(K).LT.0.01) GOTO 220
IF(ABS(SD(K,K)).LT.0.01) GOTO 220
TP(K,NSP)=TD(K)/SD(K,K)
GOTO 220
ENDIF
IF(L2(K).NE.0.AND.ACOL(K).LT.2.01) THEN
C -- SOMETHING LIKE 2X - Y = 0, T
SP(K,K,NSP)=1.0
DO 230 L=1,3
IF(SD(K,L).LT.-0.01) THEN
IF(L.LT.K) THEN
C -- E.G. X DEPENDENT ON Y, DROP
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2180)
2180 FORMAT(/,' ++DEBUG++SPOST++2180++ DEPENDENT AXIS,',
1 ' OPERATOR DROPPED',/)
GOTO 700
ENDIF
SP(L,K,NSP)=2.0
ENDIF
230 CONTINUE
IF(TD(K).GT.0.99) TD(K)=TD(K)-1.0
TP(K,NSP)=TD(K)/2.0
GOTO 220
ENDIF
IF(LR(K).EQ.2.AND.LC(K).EQ.2) THEN
C -- SOMETHING LIKE X - Y = 0
IF(TD(K).GT..99) TD(K)=TD(K)-1.0
IF(MEM.EQ.0) THEN
C -- NON-FIXED AXIS OR PURE TRANSLATION ??
IF(ICUB.EQ.1) GOTO 240
IF(INTEGER(ROW(K),2).EQ.INTEGER(COL(K),2)) GOTO 240
C -- PURE TRANSLATION
IF(MEM1.EQ.0) THEN
C -- SAVE LINE NUMBER FOR TRANSLATION
MEM1=K
ELSE IF(INTEGER(TD(MEM1),2).EQ.INTEGER(TD(K),2)) THEN
C -- ZERO OR 1/2 TRANSLATION FOR LINES MEM1 AND K
TP(MEM1,NSP)=0.0
TP(K,NSP)=0.0
IF(COL(K).GT.0.01) TP(K,NSP)=TD(K)
IF(COL(MEM1).GT.0.01) TP(MEM1,NSP)=TD(MEM1)
IF(I11Z.EQ.0) THEN
IF(L2(MEM1).EQ.0.AND.L2(K).EQ.0) THEN
C -- TETRAGONAL, SET 11Z-FLAG
IF(TD(K).LT.0.01) THEN
I11Z=1
I11ZS=10*MEM1+K
ENDIF
ELSE IF(INTEGER(TD(MEM1),3).EQ.INTEGER(TD(K),3).
1 AND.TD(K).GT.0.01) THEN
C -- GARBAGE
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2190)
2190 FORMAT(/,' ++DEBUG++SPOST++2190++ THIS TRANS',
1 'LATION IS NONSENSE, DROPPED',/)
GOTO 600
ELSE
C -- HEXAGONAL, E.G. 2X+Y=0
TP(MEM1,NSP)=1./3.
TP(K,NSP)=1./3.
IF(L2(MEM1).NE.0) TP(K,NSP)=2./3.
IF(L2(K).NE.0) TP(MEM1,NSP)=2./3.
IF(IHEXZ.EQ.0) THEN
IHEXZ=1
IHEXS=10*MEM1+K
ELSE IF(IHEXE.NE.0) THEN
TP(MEM1,NSP)=0.0
TP(K,NSP)=0.0
ENDIF
ENDIF
ENDIF
ELSE
C -- NON-ZERO TRANSLATION FOR LINES MEM1 AND K
K1=MEM1
KK=K
IF(ROW(MEM1).LT.1.01) THEN
MEM1=K
KK=K1
ENDIF
TP(MEM1,NSP)=(TD(MEM1)+TD(KK))/2.0
TP(KK,NSP)=(TD(MEM1)+TD(KK))/2.0
IF(COL(MEM1).LT.0.01) TP(MEM1,NSP)=(TD(MEM1)-TD(KK))
1 /2.0
IF(COL(KK).LT.0.01) TP(KK,NSP)=(TD(MEM1)-TD(KK))/2.0
IF(L2(KK).NE.0) THEN
TP(KK,NSP)=TD(MEM1)+TD(KK)
IF(TP(KK,NSP).GT.0.49.AND.TP(KK,NSP).LT.0.99)
1 TP(KK,NSP)=TP(KK,NSP)+1.0
TP(KK,NSP)=TP(KK,NSP)/3.0
TP(MEM1,NSP)=TD(MEM1)-TP(KK,NSP)
ENDIF
MEM1=K1
ENDIF
GOTO 220
C -- NON-FIXED AXIS, SAVE LINE NUMBER
240 MEM=K
SP(K,K,NSP)=1.0
ELSE IF(COL(K).GT.1.01.OR.ROW(K).GT.1.01) THEN
C -- E.G. Y = -X + T
IF(ICUB.NE.0) THEN
C -- ONLY FOR NON-CUBICS
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2250)
2250 FORMAT(/,' ++DEBUG++SPOST++2250++ DEPENDENT AXIS,',
1 ' OPERATOR DROPPED',/)
IF(I.EQ.II) GOTO 700
GOTO 540
ENDIF
I11Z=1
I11ZS=10*MEM+K
SP(K,MEM,NSP)=-1.0
TP(MEM,NSP)=TD(K)
TP(K,NSP)=ABS(TD(MEM)-TD(K))
SUMM=ROW(MEM)+ROW(K)+COL(MEM)+COL(K)
IF(SUMM.GT.7.1.AND.INTEGER(TD(MEM),3).NE.INTEGER(TD(K),
1 3)) THEN
C -- X+X .NE. X+X !!
I11Z=0
I11ZS=0
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2255)
2255 FORMAT(/,' ++DEBUG++SPOST++2255++ NO SOLUTION FOR ',
1 'THIS TRANSLATION',/)
GOTO 600
ELSE IF(INTEGER(TD(MEM),3).EQ.INTEGER(TD(K),3).AND.
1 INTEGER(TD(K),2).NE.0.AND.INTEGER(TD(K),2).NE.50)
2 THEN
I11Z=0
I11ZS=0
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2255)
GOTO 600
ENDIF
ELSE
C -- E.G. Y = X + T
I11Z=1
I11ZS=10*MEM+K
SP(K,MEM,NSP)=1.0
TP(K,NSP)=TD(K)
IF(INTEGER(TD(MEM),3).EQ.INTEGER(TD(K),3).AND.
1 INTEGER(TD(K),2).NE.0.AND.INTEGER(TD(K),2).NE.50)
2 THEN
I11Z=0
I11ZS=0
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2290)
2290 FORMAT(/,' ++DEBUG++SPOST++2290++ NO SOLUTION FOR ',
1 'THIS TRANSLATION',/)
GOTO 600
ENDIF
ENDIF
GOTO 220
ENDIF
IF(AROW(K).GT.0.01) THEN
C -- MAYBE SOMETHING LIKE X=1/3, 2X=2/3
IF(TD(K).GT.0.99) TD(K)=TD(K)-1
IF(MEM2.EQ.0) THEN
MEM2=K
ELSE IF(L2(MEM2).EQ.0) THEN
C -- SKIP OPERATOR WITH E.G. X DEPENDENT ON Y
IF(ABS(SD(MEM2,MEM2)).LT.0.01) THEN
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2170)
2170 FORMAT(/,' ++DEBUG++SPOST++2170++ DEPENDENT AXIS,',
1 ' OPERATOR DROPPED',/)
IF(I.EQ.II) GOTO 700
GOTO 540
ENDIF
ELSE IF(L2(K).EQ.0.AND.L2(MEM2).EQ.1) THEN
IF(TD(K).LT.0.01.OR.INTEGER(TD(MEM2),2).NE.INTEGER
1 (TD(K),2)) THEN
C -- AN OTHER E.G. 00Z OR GARBAGE, DROP IT
NSP=NSP-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2240)
2240 FORMAT(/,' ++DEBUG++SPOST++2240++ NON-SPECIFIC, OPE',
1 'RATOR DROPPED',/)
IF(I.EQ.II) GOTO 700
GOTO 540
ENDIF
TP(MEM2,NSP)=TD(K)
ENDIF
ENDIF
220 CONTINUE
IF(I11Z.EQ.1) THEN
C -- SET FLAG FOR TESTS IN CUBIC CASES
M1=I11ZS/10
M2=I11ZS-10*M1
MM=6-M1-M2
IF(SD(MM,MM).GT.1.99) I11ZC=MM
IF(ABS(SD(MM,MM)).LT.0.01) I11ZC=-MM
ENDIF
IF(ICUB.EQ.1) THEN
C -- CUBIC X,X,X, ONLY ZERO-SHIFTS REASONABLE
TP(1,NSP)=0.0
TP(2,NSP)=0.0
TP(3,NSP)=0.0
ELSE
C -- SHIFT TP INTO RANGE [0,.99]
I30 = 3
CALL RECENT(TP(1,NSP),I30)
ENDIF
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,2030) ((SP(K,L,NSP),L=1,3),TP(K,NSP),K=1,3)
2030 FORMAT(' ++DEBUG++SPOST++2030++ NON-SHIFTED SOLUTION FOUND',
1 3(/,18X,3F5.2,4X,F6.3))
ENDIF
NSP5=NSP-1
DETERM=0.0
C
C SHIFT TP CLOSEST TO ORIGIN
C
265 DETER2=-DETERM
DO 260 K=1,3
AROW(K)=ABS(SP(K,1,NSP))+ABS(SP(K,2,NSP))+ABS(SP(K,3,NSP))
DETERM=DETERM+AROW(K)
KZZ(K)=INTEGER(AROW(K),0)
260 IF(KZZ(K).GT.0) KZZ(K)=1
DETER2=DETER2+DETERM
CALL REDEFI(SP(1,1,NSP),TP(1,NSP))
CALL NEWAXS(SP(1,1,NSP),TP(1,NSP))
IF(NLT.LE.8) GOTO 360
IF(GLAT.EQ.'H'.AND.SP(3,3,NSP).LT.0.01) GOTO 360
CALL SHCTOR(TP(1,NSP),SP(1,1,NSP),TU,NLT)
IF(NDEBUG.NE.0) WRITE(NDEBUG,2035) ((SP(K,L,NSP),L=1,3),
1 TP(K,NSP),K=1,3)
2035 FORMAT(' ++DEBUG++SPOST++2035++ SHIFTED SPECIAL POSITION',
1 3(/,18X,3F5.2,4X,F6.3))
C
C CHECK IF IT DOES NOT OBVIOUSLY DUPLICATE A PREV. ONE
C
360 NSP1=NSP-1
DO 400 K=1,NSP1
IF(ICOMMA(SP(1,1,NSP),SP(1,1,K),3,2).EQ.0.AND.
1 ITESTR(TP(1,NSP),TP(1,K),TU,NLT,SP(1,1,K)).EQ.0) THEN
NSP=NSP1
LABL=400
IF(NDEBUG.NE.0) WRITE(NDEBUG,2300) LABL,K
GOTO 640
ENDIF
400 CONTINUE
C
C CALCULATE SYMMETRY RELATED SPECIAL POSITIONS
C
ICUB2=0
DO 440 K=1,NSYM
ISPTAB(K,NSP)=K
CALL SYMULT(SPS(1,1,K),TPS(1,K),S(1,1,K),T(1,K),
+ SP(1,1,NSP),TP(1,NSP))
I30 = 3
CALL RECENT(TPS(1,K),I30)
IF(NDEBUG.NE.0) WRITE(NDEBUG,2350) SECOND(3),K,((SPS(LL,L,K),
1 L=1,3),TPS(LL,K),LL=1,3)
2350 FORMAT(' ++DEBUG++SPOST++2350++(',F6.2,') SEITZ MATRIX NR.',I4,
1 ' OF SPECIAL POSITION',3(/,10X,3F5.2,F8.3))
IF(I11ZC.GT.0.AND.INTEGER(SPS(I11ZC,I11ZC,K),1).NE.0
1 .AND.I11ZC.NE.3) THEN
C -- DEPENDENT TWO-FOLD AXIS IN CUBIC SYSTEM
NSP=NSP1
I11ZC=0
IF(NDEBUG.NE.0) WRITE(NDEBUG,2260)
2260 FORMAT(/,' ++DEBUG++SPOST++2260++ DEPENDENT AXIS,',
1 ' OPERATOR DROPPED',/)
IF(I.EQ.II) GOTO 700
GOTO 540
ELSE IF(I11ZC.LT.0) THEN
C -- DEPENDENT TWO-FOLD AXIS IN CUBIC SYSTEM, TOO
KK=ABS(I11ZC)
IF(INTEGER(SPS(KK,KK,K),2).NE.1.AND.KK.NE.3) THEN
NSP=NSP1
I11ZC=0
IF(NDEBUG.NE.0) WRITE(NDEBUG,2260)
IF(I.EQ.II) GOTO 700
GOTO 540
ENDIF
ENDIF
DO 375 L=1,3
KZ(L)=0
DO 370 LL=1,3
370 IF(ABS(SPS(L,LL,K)).GT.0.01) KZ(L)=1
C
C IN CASE E.G. Y IS SYMMETRICALLY EQUIVALENT TO X DROP POSITION
C WITH Y UNIQUE (PROVES TO BE QUITE TRICKY...)
C
IF(L.EQ.ICRFL3.AND.ICRFL2.EQ.N) GOTO 375
IF(KZ(L).EQ.0.AND.KZZ(L).NE.0) THEN
IF(NDEBUG.NE.0) WRITE(NDEBUG,2150) L,ICRFL1,ICRFL2,
1 ICRFL3,ICUB2,SPS(1,1,1)
2150 FORMAT(/,' ++DEBUG++SPOST++2150++ L, ICRFL1,2,3,',
1 ' ICUB2: ',5I4,', SPS(1,1,1): ',F5.2,/)
IF(ICRFL2.NE.N) THEN
ICRFL2=N
IF(ICRFL1.LE.0) THEN
ICRFL1=NSP
ICRFL3=L
IF((KZZ(1)+KZZ(2)+KZZ(3)).EQ.1) THEN
DO 475 M1=1,3
IF((ABS(SPS(M1,1,K))+ABS(SPS(M1,2,K))+ABS(SPS(M1,3,
1 K))).GT.0.01) KZZ(M1)=1
475 CONTINUE
ICUB2=1
ENDIF
ELSE IF(L.LT.ICRFL3) THEN
DO 470 M1=1,3
TP(M1,ICRFL1)=TP(M1,NSP)
DO 470 M2=1,3
470 SP(M1,M2,ICRFL1)=SP(M1,M2,NSP)
NSP=NSP1
ICRFL3=L
IF(NDEBUG.NE.0) WRITE(NDEBUG,2130) ICRFL1
2130 FORMAT(/,' ++DEBUG++SPOST++2130++ SPEC.POS. NR',
1 I4,' REPLACED BY CURRENT ONE',/)
I11Z=0
IF(I222.EQ.3) NSP3=0
GOTO 500
ELSE IF(L.GT.ICRFL3) THEN
NSP=NSP1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2140) ICRFL1
2140 FORMAT(/,' ++DEBUG++SPOST++2140++ DEPENDENT AXIS,'
1 ,' CURRENT SPEC.POS. EQUIVALENT TO NR.',I4,/)
I11Z=0
IF(I222.EQ.3) NSP3=0
GOTO 500
ENDIF
ELSE
ICCH=6-ICRFL3-L
IF(ICUB2.EQ.1) THEN
ICCH=0
IF(SPS(1,1,1).GT.0.01) ICCH=4
ENDIF
IF(ICCH.LT.ICRFL3.OR.ICCH.LT.L) THEN
IF(NDEBUG.NE.0) WRITE(NDEBUG,2230)
2230 FORMAT(/,' ++DEBUG++SPOST++2230++ DEPENDENT AXIS',
1 ', OPERATOR DROPPED',/)
IF(ICRFL1.EQ.NSP) ICRFL1=0
NSP=NSP1
IF(I11Z.GT.1) THEN
I11Z=0
GOTO 600
ENDIF
I11Z=0
IF(I222.EQ.3) GOTO 505
IF(I.EQ.II) GOTO 590
GOTO 500
ENDIF
IF(ICRFL1.GE.NSP) ICRFL1=-1
ENDIF
ENDIF
375 CONTINUE
C
C CALCULATE THE SPECIAL POSITION MULTIPLICATION TABLE =ISPTAB=
C
K1=K-1
IF(K1.LE.0) GO TO 440
DO 420 M1=1,3
C -- PREVENT REDEFINING OF ORIGINS
DO 420 M2=1,3
420 SPP(M1,M2)=0.0
DO 430 L=1,K1
IF(ICOMMA(SPS(1,1,L),SPS(1,1,K),3,2).EQ.0.AND.
+ ITESTR(TPS(1,K),TPS(1,L),TU,NLT,SPP).EQ.0) THEN
ISPTAB(K,NSP)=L
GO TO 440
ENDIF
430 CONTINUE
440 CONTINUE
IF(NDEBUG.NE.0) WRITE(NDEBUG,2440) SECOND(3),NSP,
+ (ISPTAB(K,NSP),K=1,NSYM)
2440 FORMAT(/,' ++DEBUG++SPOST++2440++(',F6.2,') NSP=',I3,
+ ' ISPTAB :',/,10X,48I2)
C
C GENERATE MULTIPLICITIES OF SPECIAL POSITIONS
C
ISAVE(1)=ISPTAB(1,NSP)
L=1
DO 830 JJ=2,NSYM
DO 820 K=1,L
820 IF(ISAVE(K).EQ.ISPTAB(JJ,NSP)) GO TO 830
L=L+1
ISAVE(L)=ISPTAB(JJ,NSP)
830 CONTINUE
MULTSP(NSP)=L
IF(L.GE.NSYM) THEN
NSP=NSP1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2210)
2210 FORMAT(/,' ++DEBUG++SPOST++2210++ NSYM:L-CHECK: ABOVE',
1 ' POSITION NOT SPECIAL, OPERATOR DROPPED',/)
GOTO 550
ENDIF
IF(I11Z.EQ.1.OR.IHEXZ.EQ.1) NSP2=NSP
IF(I11Z.GT.1) THEN
IF(MULTSP(NSP2).LE.L) THEN
NSP=NSP1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2200)
2200 FORMAT(/,' ++DEBUG++SPOST++2200++ 11Z-CHECK: ABOVE ',
1 'SPECIAL POSITION DROPPED',/)
GOTO 640
ENDIF
ENDIF
IF(I222.NE.I222L) NSP4=NSP
C
C LOOP THROUGH =ISPTAB=, PICK UP NEW COORDINATES, REDEFINE
C FREE VARIABLES AND AXES WHERE POSSIBLE
C
DO 610 K=1,NSYM
IF(ISPTAB(K,NSP).LT.K) GOTO 610
ATRAC=0.0
DO 620 M=1,3
AROW(M)=ABS(SPS(M,1,K))+ABS(SPS(M,2,K))+ABS(SPS(M,3,K))
ATRAC=ATRAC+ABS(SPS(M,M,K))
620 KZ(M)=INTEGER(AROW(M),0)
IF(K.EQ.1) THEN
ATRAC2=ATRAC
ELSE IF(INTEGER(ATRAC,0).EQ.(INTEGER(ATRAC2,0)-2)) THEN
CALL TEHECU(SP(1,1,NSP),SPS(1,1,K))
CALL REDEFI(SPS(1,1,K),TPS(1,K))
CALL NEWAXS(SPS(1,1,K),TPS(1,K))
IF(NLT.EQ.8) GOTO 630
IF(GLAT.EQ.'H'.AND.SPS(3,3,K).LT.0.01) GOTO 630
CALL SHCTOR(TPS(1,K),SPS(1,1,K),TU,NLT)
ELSE
CALL REDEFI(SPS(1,1,K),TPS(1,K))
CALL NEWAXS(SPS(1,1,K),TPS(1,K))
IF(NLT.EQ.8) GOTO 630
IF(GLAT.EQ.'H'.AND.SPS(3,3,K).LT.0.01) GOTO 630
CALL SHCTOR(TPS(1,K),SPS(1,1,K),TU,NLT)
ENDIF
630 IF(NDEBUG.NE.0) WRITE(NDEBUG,2280) K,((SPS(I1,I2,K),I2=1,3),
1 TPS(I1,K),I1=1,3)
2280 FORMAT(' ++DEBUG++SPOST++2280++ REDEFINED AND SHIFTED ',
1 'TRIPPLET NR:',I4,3(/,10X,3F5.2,F8.3))
C
C REMOVE THE CURRENT SPECIAL POSITION IF IT OR ANY SYMMETRY
C DERIVATIVE OF IT DUPLICATES AN EXISTING SPECIAL POSITION
C
IF(NSP1.LE.0) GO TO 640
395 IIFL=0
DO 390 L=1,NSP1
IF(MULTSP(L).NE.MULTSP(NSP)) GOTO 390
DO 480 MM=1,2
C -- CHECK SPS...
SSIG=1.0
C -- ...AS WELL AS -SPS
IF(MM.EQ.2) SSIG=-1.0
AOTR=0.0
DO 490 M1=1,3
DO 490 M2=1,3
IF(M1.NE.M2) AOTR=AOTR+ABS(SPS(M1,M2,K))
490 SPP(M1,M2)=SPS(M1,M2,K)*SSIG
IF(ICOMMA(SPP,SP(1,1,L),3,2).EQ.0) THEN
495 IF(ITESTR(TP(1,L),TPS(1,K),TU,NLT,SPS(1,1,K)).EQ.0) THEN
NSP=NSP1
LABL=495
IF(NDEBUG.NE.0) WRITE(NDEBUG,2300) LABL,L
2300 FORMAT(/,' ++DEBUG++SPOST++',I4,'++ ABOVE POSITION',
1 ' EQUIVALENT TO NR.',I3,', DROPPED',/)
GOTO 640
ELSE IF(I11Z.EQ.1.AND.ICUB.EQ.0.AND.IIFL.NE.1) THEN
C -- E.G. (T(X),T(Y),Z): CHECK ALSO (T(Y),T(X),Z)...
C AND (0,T(Y)-T(X),Z)
M1=1
IF(KZ(1).NE.1.OR.SPS(1,1,K).GT.1.01) M1=2
M2=M1+1
IF(KZ(M2).NE.1.OR.SPS(2,2,K).GT.1.01) M2=M2+1
IF(M2.EQ.4.OR.KZ(M2).NE.1.OR.SPS(M2,M2,K).GT.1.01)
1 THEN
IIFL=1
GOTO 495
ENDIF
M=6-M1-M2
DO 570 MX=1,2
TT(M)=TPS(M,K)
TT(M1)=TPS(M2,K)
TT(M2)=TPS(M1,K)
IF(MX.EQ.2) THEN
TT(M1)=0
TT(M2)=TPS(M2,K)-TPS(M1,K)
I30 = 3
CALL RECENT(TT,I30)
ENDIF
IF(ITESTR(TP(1,L),TT,TU,NLT,SPS(1,1,K)).EQ.0) THEN
NSP=NSP1
ICRFL1=0
LABL=570
IF(NDEBUG.NE.0) WRITE(NDEBUG,2300) LABL,L
GOTO 640
ENDIF
570 CONTINUE
ENDIF
ENDIF
IF(ATRAC.LT.0.01.OR.AOTR.LT.0.01) GOTO 455
C -- NON-DIAGONAL ELEMENTS IN SPS: CHECK ALSO TRANSPOSE OF SPS
DO 450 M=1,3
DO 460 M1=1,3
TPP(M1)=TP(M1,L)
TSS(M1)=TPS(M1,K)
DO 460 M2=1,3
SS(M1,M2)=SPS(M2,M1,K)*SSIG
460 SPP(M1,M2)=SP(M1,M2,L)
IF(M.EQ.2) THEN
C -- A "CUBIC-SPECIAL"
CALL SYMULT(SPP,TPP,S(1,1,K),T(1,K),SP(1,1,L),TP(1,L))
I30 = 3
CALL RECENT(TPP,I30)
ELSE IF(INTEGER(SPS(1,1,1),0).NE.0.AND.INTEGER(SPS(1,1,K)
1 ,0).EQ.0) THEN
C -- AN OTHER "CUBIC SPECIAL"
DO 405 M1=1,3
IF(INTEGER(SPS(1,M1,K),0).EQ.0) GOTO 405
IF(INTEGER(SPS(M1,1,K),0).EQ.0) GOTO 405
IF(INTEGER(SPS(M1,M1,K),0).NE.0) GOTO 405
SS(1,1)=SS(1,M1)
SS(1,M1)=0.0
SS(M1,M1)=SS(M1,1)
SS(M1,1)=0.0
TSS(1)=0.0
TSS(M1)=0.0
GOTO 415
405 CONTINUE
GOTO 450
ELSE
GOTO 450
ENDIF
415 IF(ICOMMA(SS,SPP,3,2).EQ.0.AND.
+ ITESTR(TPP,TSS,TU,NLT,SS).EQ.0) THEN
NSP=NSP1
LABL=415
IF(NDEBUG.NE.0) WRITE(NDEBUG,2300) LABL,L
GOTO 640
ENDIF
450 CONTINUE
GOTO 480
480 CONTINUE
C
C REMOVE SITES WITH FIXED COORDINATES IF THEY HAVE THE SAME MULTIPLI-
C CITY AS SITES WITH FREE COORDINATES IN SAME DIRECTION
C
455 ATRAC1=0
DETER1=0.0
DO 380 M=1,3
ATRAC1=ATRAC1+ABS(SP(M,M,L))
TPP(M)=TPS(M,K)
AROW(M)=0.0
DO 380 MM=1,3
SPP(M,MM)=SP(M,MM,L)
DETER1=DETER1+ABS(SPP(M,MM))
AROW(M)=AROW(M)+ABS(SPP(M,MM))
380 CONTINUE
IF(INTEGER(ATRAC1,0).EQ.INTEGER(ATRAC2,0)) GOTO 390
DO 465 M=1,3
IF(ATRAC1.GT.(ATRAC2+0.1).AND.ABS(SP(M,M,L)).LT.(ABS(
1 SPS(M,M,K))-0.1)) GOTO 390
IF(ATRAC1.LT.(ATRAC2-0.1).AND.ABS(SP(M,M,L)).GT.(ABS(
1 SPS(M,M,K))+0.1)) GOTO 390
IF(ABS(SP(M,M,L)).GT.0.9.AND.ABS(SPS(M,M,K)).GT.0.9
1 .AND.INTEGER(SP(M,M,L),0).NE.INTEGER(SPS(M,M,K),0))
2 GOTO 390
DO 465 MM=1,3
IF(MM.EQ.M) GOTO 465
IF(INTEGER(SP(M,M,L),0).EQ.INTEGER(SPS(M,M,K),0).AND.
1 INTEGER(SP(MM,M,L),0).NE.INTEGER(SPS(MM,M,K),0))
2 THEN
KKK=6-MM-M
IF(ABS(SP(MM,M,L)).GT.0.9) THEN
IF(ABS(SPS(MM,MM,K)).LT.0.1) GOTO 390
IF(ABS(SPS(KKK,M,K)).GT.0.9) GOTO 390
ELSE IF(ABS(SPS(MM,M,K)).GT.0.9) THEN
IF(ABS(SP(MM,MM,K)).LT.0.1) GOTO 390
IF(ABS(SP(KKK,M,K)).GT.0.9) GOTO 390
ENDIF
ENDIF
465 CONTINUE
IF(ATRAC1.LT.(ATRAC2-0.1)) GOTO 905
CALL REDEFI(SPP,TPP)
IF(NLT.EQ.8) GOTO 385
IF(GLAT.EQ.'H'.AND.SPP(3,3).LT.0.01) GOTO 385
CALL SHCTOR(TPP,SPP,TU,NLT)
385 IF(ICOMVE(TPP,TP(1,L),3,2).EQ.0) THEN
NSP=NSP1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2120) L
2120 FORMAT(/,' ++DEBUG++SPOST++2120++ ABOVE POSITION DROPPED',
1 ' IN FIXED COORD. TEST AGAINST POS.',I3,/)
GOTO 640
ENDIF
905 DO 900 M=1,3
TPP(M)=TP(M,L)
LR(M)=0
AROW(M)=0.0
DO 900 MM=1,3
SPP(M,MM)=SPS(M,MM,K)
AROW(M)=AROW(M)+ABS(SPS(M,MM,K))
LR(M)=INTEGER(AROW(M),0)
900 CONTINUE
CALL REDEFI(SPP,TPP)
IF(NLT.EQ.8) GOTO 910
IF(GLAT.EQ.'H'.AND.SPP(3,3).LT.0.01) GOTO 910
CALL SHCTOR(TPP,SPP,TU,NLT)
910 IF(ICOMVE(TPP,TPS(1,K),3,2).EQ.0) THEN
NSP=NSP-1
NSP1=NSP1-1
NSP3=NSP3-1
IF(NSP2.GT.L) NSP2=NSP2-1
IF(NSP4.GT.L) NSP4=NSP4-1
IF(NSP5.GT.L) NSP5=NSP5-1
IF(NSP6.GT.L) NSP6=NSP6-1
IF(ICRFL1.GT.L) ICRFL1=ICRFL1-1
IF(NSP2.EQ.L) NSP2=NSP
IF(NSP4.EQ.L) NSP4=NSP
IF(NSP5.EQ.L) NSP5=NSP
IF(NSP6.EQ.L) NSP6=NSP
IF(ICRFL1.EQ.L) ICRFL1=NSP
DO 940 M1=L,NSP
DO 920 M=1,3
TP(M,M1)=TP(M,M1+1)
DO 920 MM=1,3
920 SP(M,MM,M1)=SP(M,MM,M1+1)
DO 930 M=1,NSYM
930 ISPTAB(M,M1)=ISPTAB(M,M1+1)
MULTSP(M1)=MULTSP(M1+1)
940 CONTINUE
IF(NDEBUG.NE.0) WRITE(NDEBUG,2160) L
2160 FORMAT(/,' ++DEBUG++SPOST++2160++ FIXED COORD. TEST: ',
1 'POS.',I3,' DROPPED, REST DOWN SHIFTED',/)
GOTO 395
ENDIF
390 CONTINUE
610 CONTINUE
C
C IN CASE OF TWO FOLD AXIS RUN ALSO WITH ALL THREE COORDINATES FIXED
C
640 IF(NDEBUG.NE.0) WRITE(NDEBUG,2270) I222,I222L,NSP,NSP1,NSP5,
1 NSP6,NSP2,I11Z,DETERM
2270 FORMAT(' ++DEBUG++SPOST++2270++ I222,I222L, NSP, NSP1,',
1 ' NSP5, NSP6, NSP2, I11Z, DETERM',/,22X,8I6,F6.2)
IF(I11Z.NE.0) GOTO 515
IF(INTEGER(DETERM,0).NE.1.OR.I222.GT.3) GOTO 600
IF(NSP.EQ.NSP5) THEN
I222S=0
GOTO 600
ENDIF
IF(I222S.EQ.0) THEN
DO 270 M=1,3
LC(M)=1
270 IF(ABS(SP(M,M,NSP)).LT.0.01) LC(M)=0
NSP6=NSP
I222S=1
STEPER=0.0
ENDIF
NSP=NSP+1
C
C STEP THROUGH THE ORIGINALLY FREE COORDINATE IN STEPS OF .25
C
DO 280 M=1,3
TP(M,NSP)=TP(M,NSP6)
IF(LC(M).EQ.1) TP(M,NSP)=TP(M,NSP6)+.25*STEPER
IF(TP(M,NSP).GT.0.9) THEN
NSP=NSP-1
I222S=0
GOTO 600
ENDIF
DO 290 MM=1,3
290 SP(M,MM,NSP)=SP(M,MM,NSP6)
SP(M,M,NSP)=0.0
280 CONTINUE
STEPER=STEPER+1.0
GOTO 265
C
C THREE-FOLD, FOUR-FOLD OR SIX-FOLD AXIS, THEREFORE
C RUN ALSO X=Y=0, X=Y=1/8, X=Y=1/4 ...
C IN ROMBOHEDRAL OR CUBIC CASES USE X=Y=Z
C
515 IF(I11Z.EQ.6.OR.NSP.EQ.NSP5) THEN
I11Z=0
GOTO 600
ENDIF
M1=I11ZS/10
M2=I11ZS-10*M1
M4=6-M1-M2
I11=I11Z-1
NSP=NSP+1
TP(M1,NSP)=TP(M1,NSP2)+I11*SP(M1,1,NSP2)*.125
TP(M2,NSP)=TP(M2,NSP2)+I11*SP(M2,1,NSP2)*.125
TP(M4,NSP)=TP(M4,NSP2)
DO 530 MM=1,3
DO 530 MN=1,3
530 SP(MM,MN,NSP)=SP(MM,MN,NSP2)
SP(M1,1,NSP)=0.0
SP(M2,1,NSP)=0.0
IF(ICUB.EQ.1.OR.ICUB1.EQ.1) THEN
ICUB1=1
TP(M4,NSP)=TP(M4,NSP2)+I11*SP(M4,1,NSP2)*.125
SP(M4,1,NSP)=0.0
ENDIF
I11Z=I11Z+1
I30 = 3
CALL RECENT(TP(1,NSP),I30)
GOTO 265
600 CONTINUE
I222L=I222
C
C CHECK SOME SPECIAL CASES
C
500 IF(NDEBUG.NE.0) WRITE(NDEBUG,2220) I222,I2LIM,IHEXZ,NSP3,NSP2
2220 FORMAT(/,' ++DEBUG++SPOST++2220++ FLAGS: I222,I2LIM,',
1 'IHEXZ, NSP3, NSP2',/,31X,5I6,/)
IF(NSP.EQ.NSP3) GOTO 550
IF(I222.EQ.10) GOTO 590
IF(I222.EQ.4) I222=5
IF(ATRAC2.GT.0.01.OR.I444.NE.0) GOTO 505
C
C IN VERY FEW CASES (.25,.25,.75) IS STILL NOT FOUND...
C
DO 580 M=1,3
580 IF(INTEGER(TP(M,NSP),2).NE.25.AND.INTEGER(TP(M,NSP),2)
1 .NE.75) GOTO 505
DO 585 M=1,3
585 TS(M)=2.0*TP(M,NSP)
I444=1
GOTO 605
505 IF(I222.EQ.3) THEN
C
C THREE TWO-FOLD AXES PRESENT, THEREFORE ARTIFICIALLY
C ADD POINT WITH 222-SYMMETRY (ELSE NOT FOUND E.G. IN P 222)
C
I222=4
IF(NSP.EQ.NSP3.AND.I.EQ.II) I222=10
DO 510 M1=1,3
DO 520 M2=1,3
520 SD(M1,M2)=0.0
TS(M1)=R222(M1)
510 SD(M1,M1)=2.0
GOTO 605
ENDIF
IF(IHEXZ.NE.0) THEN
C
C OPERATOR ALONG HEXAGONAL AXIS, THEREFORE INTERCHANGE X AND Y,
C THEN SET X = Y = 0
C
M1=IHEXS/10
M2=IHEXS-10*M1
M3=6-M1-M2
IF(IHEXZ.EQ.1) THEN
IHEXZ=2
DUMP1=SD(M1,M1)
SD(M1,M1)=SD(M2,M2)
SD(M2,M2)=DUMP1
DUMP1=SD(M1,M2)
SD(M1,M2)=SD(M2,M1)
SD(M2,M1)=DUMP1
GOTO 605
ELSE IF(IHEXE.EQ.0) THEN
IHEXE=1
GOTO 605
ELSE
IHEXZ=0
IHEXE=0
ENDIF
ENDIF
550 IHEXZ=0
M3=0
545 IF(I222.EQ.10) THEN
C -- A "CUBIC SPECIAL"
I222=4
I2LIM=8
DO 555 MM=1,3
555 TS(MM)=2.0*TP(MM,NSP4)
GOTO 605
ENDIF
I2LIM=1
ICUB1=0
C
C CREATE INTERSECTION OF TWO SYMOPS, USE THE MULTIPLICATION TABLE
C
540 IF(I.GT.2) THEN
I=I-1
GOTO 105
ELSE
DO 560 J=I,II
560 IF(IPOINT(MULT(II,J)).EQ.1) IPOINT(MULT(II,J))=0
ENDIF
GOTO 700
590 IPOINT(N)=-1
IF(I222.EQ.10) GOTO 545
700 CONTINUE
NSP=NSP+1
160 IF(NSP.GT.MSP) THEN
WRITE(NOUT,2010) MSP
2010 FORMAT(/,' **ERROR**SPOST**MORE THAN',I4,'SPECIAL POSITIO',
1 'NS, SEARCH ABORTED',/)
NSP=0
IER=1
GOTO 800
ENDIF
C
C FINALLY ADD THE GENERAL POSITION
C
DO 710 I=1,3
TP(I,NSP)=0.0
DO 710 J=1,3
710 SP(I,J,NSP)=0.0
DO 720 I=1,3
720 SP(I,I,NSP)=1.0
DO 730 I=1,NSYM
730 ISPTAB(I,NSP)=I
MULTSP(NSP)=NSYM
IF (GLAT.EQ.'P') GOTO 800
MUL=2
IF (GLAT.EQ.'F') MUL=4
IF (GLAT.EQ.'H') MUL=3
DO 740 I=1,NSP
740 MULTSP(I)=MULTSP(I)*MUL
C
C RESET DEBUG-SWITCH
C
800 NDEBUG=NDEB
RETURN
END
C
C
C
C
SUBROUTINE REDEFI(SPS,TPS)
C
C CALLS RECENT
C
C REDEFINES INDEPENDENT VARIABLES IN MATRIX =SPS= SO THAT THE
C ACCORDING TRANSLATIONS IN =TPS= BECOME ZERO
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, DEC. 1984
C
DIMENSION SPS(3,3),TPS(3),AROW(3)
C
DO 100 I=1,3
AROW(I)=ABS(SPS(I,1))+ABS(SPS(I,2))+ABS(SPS(I,3))
IF(AROW(I).LT.0.01) GOTO 100
K1=I-1
K2=I+1
IF(K1.LT.1) K1=3
IF(K2.GT.3) K2=1
IF(ABS(SPS(I,I)).GT.0.01.AND.(ABS(SPS(I,K1))+ABS(SPS(I,K2)))
1 .LT.0.01) THEN
TPS(K1)=TPS(K1)-SPS(K1,I)*TPS(I)/SPS(I,I)
TPS(K2)=TPS(K2)-SPS(K2,I)*TPS(I)/SPS(I,I)
TPS(I)=0.0
IF(SPS(I,I).LT.-.01) THEN
SPS(I,I)=ABS(SPS(I,I))
SPS(K1,I)=-SPS(K1,I)
SPS(K2,I)=-SPS(K2,I)
ENDIF
ENDIF
100 CONTINUE
I30 = 3
CALL RECENT(TPS,I30)
RETURN
END
C
C
C
C
SUBROUTINE NEWAXS(SPS,TPS)
C
C CALLS INTEGER
C
C REDEFINES THE AXIS FOR INDEPENDENT VARIABLES SO THAT E.G.
C
C ( 0 1 0) (TX) ( 1 0 0) ( 0)
C ( 0 0 0) (TY) BECOMES ( 0 0 0) (TY)
C (-1 0 0) (TZ) ( 0 0 1) ( 0)
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, DEC. 1984
C
DIMENSION SPS(3,3),TPS(3),NEWFL(3)
C
DO 5 I=1,3
5 NEWFL(I)=0
C
DO 10 I=1,3
XK=ABS(SPS(I,1))+ABS(SPS(I,2))+ABS(SPS(I,3))
IK=INTEGER(XK,0)
IF(IK.NE.1.OR.ABS(SPS(I,I)).GT.0.1) GOTO 10
K1=I-1
K2=I+1
IF(K1.LT.1) K1=3
IF(K2.GT.3) K2=1
IF(ABS(SPS(I,K1)).GT.0.1.AND.ABS(SPS(K2,K1)).LT.0.1) THEN
IF(NEWFL(K1).EQ.0.AND.ABS(SPS(K1,K1)).GT.0.1) GOTO 10
NEWFL(I)=1
SPS(I,I)=ABS(SPS(I,K1))
SPS(I,K1)=0.0
TPS(I)=0.0
GOTO 10
ELSE IF(ABS(SPS(I,K2)).GT.0.1.AND.ABS(SPS(K1,K2)).LT.0.1) THEN
IF(NEWFL(K2).EQ.0.AND.ABS(SPS(K2,K2)).GT.0.1) GOTO 10
NEWFL(I)=1
SPS(I,I)=ABS(SPS(I,K2))
SPS(I,K2)=0.0
TPS(I)=0.0
ENDIF
10 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE TEHECU(SP,SPS)
C
C CALLS INTEGER
C
C REDEFINES A TRANSFORMED SPECIAL POSITION MATRIX =SPS= IN CASES
C WITH TWO EQUIVALENT AXES, ON THE BASIS OF NON-ZERO DIAGONAL
C ELEMENTS IN =SP= :
C
C ( 0-1 0) (-1 0 0) ( 1 0 0)
C E.G. =SPS= : ( 1 0 0) BECOMES ( 0 1 0) IF =SP= : ( 0 1 0)
C ( 0 0 Z) ( 0 0 Z) ( 0 0 Z)
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, DEC. 1984
C
DIMENSION SP(3,3),SPS(3,3),KS(3),KP(3)
C
DO 10 I=1,3
KS(I)=INTEGER(SP(I,I),0)
10 KP(I)=INTEGER(SPS(I,I),0)
C
DO 20 I=1,3
IF(KS(I).NE.0.AND.KP(I).EQ.0) THEN
I1=I+1
DO 30 J=I1,3
IF(ABS(SPS(I,J)).GT.0.1.AND.ABS(SPS(J,I)).GT.0.1) THEN
SPS(I,I)=SPS(I,J)
SPS(I,J)=0.0
SPS(J,J)=SPS(J,I)
SPS(J,I)=0.0
ENDIF
30 CONTINUE
ENDIF
20 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE SHCTOR(TP,SP,TU,NLT)
C
C CALLS RECENT, REDEFI
C
C SHIFT A GIVEN LATTICE VECTOR TP CLOSEST TO THE ORIGIN WITH
C RESPECT TO THE LATTICE TRANSLATIONS IN TU AND NON-ZERO ELEMENTS
C IN MATRIX SP
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, OCTOBER 1984
C
DIMENSION TP(3),SP(3,3),T1(3),T2(3),TU(3,NLT)
C
DO 10 I=1,3
10 T2(I)=TP(I)
DO 20 I=9,NLT
DO 30 K=1,3
30 T1(K)=TU(K,I)+TP(K)
I30 = 3
CALL RECENT(T1,I30)
CALL REDEFI(SP,T1)
SUMP=TP(1)+TP(2)+TP(3)
SUM1=T1(1)+T1(2)+T1(3)
SUM2=T2(1)+T2(2)+T2(3)
IF(SUM1.LT.(SUMP-0.01).AND.SUM1.LT.(SUM2-0.01)) GOTO 25
IF(SUMP.LT.(SUM1-0.01).OR.SUM2.LT.(SUM1-0.01)) GOTO 20
SUMP=SUMP-TP(3)
SUM1=SUM1-T1(3)
SUM2=SUM2-T2(3)
IF(SUM1.LT.(SUMP-0.01).AND.SUM1.LT.(SUM2-0.01)) GOTO 25
IF(SUMP.LT.(SUM1-0.01).OR.SUM2.LT.(SUM1-0.01)) GOTO 20
IF(TP(1).LT.(T1(1)-0.01).OR.T2(1).LT.(T1(1)-0.01)) GOTO 20
25 DO 40 L=1,3
40 T2(L)=T1(L)
20 CONTINUE
DO 50 I=1,3
50 TP(I)=T2(I)
RETURN
END
C
C
C
C
SUBROUTINE SPMULT
C -----------------
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, NOVEMBER 1984
C
C CALLS ICOMMA, ITESTR, LTRANS, SYMULT, RECENT
C
C THIS ROUTINE CALCULATES THE MULTIPLICATION TABLE =ISPTAB=
C *** WHICH IS DEPENDENT ON THE CHOICE OF THE SPECIAL POSITION REPRESENTATIVE.
C *** =ISPTAB= THEREFORE MUST BE RECALCULATED WHENEVER ANY SPECIAL POSITION
C *** REPRESENTATIVE IS REDEFINED !!
C
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
C
C SYSTEM COMMON BLOCKS
C
COMMON/FILES/NIN,NOUT,NDEBUG
COMMON/SYM/NSYM,MSYM,S(3,3,48),T(3,48),NTT,TA(3,4)
COMMON/GSYM/GLAT,GCENT,HMSYM,HALL,GSYSP(2,30)
COMMON/SYMA/MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30),
+ MULTSP(30),SP(3,3,30),TP(3,30)
C
DIMENSION TU(3,14),SPS(3,3,48),TPS(3,48),KZ(3),ISAVE(48),SPP(3,3)
C GENERAL LATTICE TRANSLATIONS
DATA TU/1.,1.,1., 1.,0.,0., 0.,1.,0., 0.,0.,1., 0.,1.,1.,
+ 1.,0.,1., 1.,1.,0., 0.,0.,0., 18*.0/
C
C PREPARE THE TRANSLATIONAL SYMMETRY MATRIX TU BY ADDING THE
C APPROPRIATE LATTICE CENTERING TRANSLATIONS
C
NLT=8
IF(NTT.EQ.1) GOTO 10
DO 5 I=2,NTT
5 CALL LTRANS(NLT,TA(1,I),TU)
C
C SET MULTIPLICATION OF POSITION DUE TO LATTICE CENTRINGS
C
10 MUL=1
IF(GLAT.EQ.'P') GOTO 50
MUL=2
IF(GLAT.EQ.'F') MUL=4
IF(GLAT.EQ.'H') MUL=3
50 CONTINUE
C
C TO CHECK WHETHER THE GENERAL POSITION IS PRESENT, SET A FLAG
C
IGENFL=0
C
C MULTIPLY ALL SPECIAL POSITIONS...
C
DO 100 I=1,NSP
C
C ...BY ALL SYMMETRY OPERATORS
C
DO 150 J=1,NSYM
C
C SET =ISPTAB= ELEMENT
C
ISPTAB(J,I)=J
CALL SYMULT(SPS(1,1,J),TPS(1,J),S(1,1,J),T(1,J),SP(1,1,I),
1 TP(1,I))
I30 = 3
CALL RECENT(TPS(1,J),I30)
IF(J.EQ.1) GOTO 150
C
C CHECK IF A PREVIOUS MULTIPLICATION GAVE THE SAME RESULT
C
J1=J-1
DO 180 K=1,3
C -- PREVENT REDEFINING OF ORIGINS
DO 180 K1=1,3
180 SPP(K,K1)=0.0
DO 200 K=1,J1
IF(ICOMMA(SPS(1,1,K),SPS(1,1,J),3,2).EQ.0.AND.
1 ITESTR(TPS(1,J),TPS(1,K),TU,NLT,SPP).EQ.0) THEN
ISPTAB(J,I)=K
GOTO 150
ENDIF
200 CONTINUE
150 CONTINUE
C
C NOW CALCULATE THE MULTIPLICITY FOR THIS POSITION
C
ISAVE(1)=ISPTAB(1,I)
L=1
DO 250 J=2,NSYM
DO 300 K=1,L
300 IF(ISAVE(K).EQ.ISPTAB(J,I)) GOTO 250
L=L+1
ISAVE(L)=ISPTAB(J,I)
250 CONTINUE
IF(L.EQ.NSYM) IGENFL=1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2000) GLAT,MUL,NSYM,L
2000 FORMAT(/,' ++DEBUG++SPMULT++2000++ GLAT = ',A1,', MUL =',
1 I3,', NSYM =',I3,', L =',I3)
MULTSP(I)=L*MUL
100 CONTINUE
C
C ADD THE GENERAL POSITION IF IGENFL.EQ.0
C
IF(IGENFL.EQ.0) THEN
NSP=NSP+1
DO 320 I=NSP,2,-1
DO 330 J=1,3
TP(J,I)=TP(J,I-1)
DO 330 K=1,3
330 SP(J,K,I)=SP(J,K,I-1)
GSYSP(1,I)=GSYSP(1,I-1)
GSYSP(2,I)=GSYSP(2,I-1)
MULTSP(I)=MULTSP(I-1)
DO 340 J=1,NSYM
340 ISPTAB(J,I)=ISPTAB(J,I-1)
320 CONTINUE
DO 350 I=1,3
TP(I,1)=0.0
DO 360 J=1,3
360 SP(I,J,1)=0.0
350 SP(I,I,1)=1.0
MULTSP(1)=MUL*NSYM
DO 400 I=1,NSYM
400 ISPTAB(I,1)=I
ENDIF
RETURN
END
C
C
C
C
SUBROUTINE SPESOR
C -----------------
C
C SORTS THE SPECIAL POSITIONS FIRST INTERNALLY AND THEN
C ACCORDING TO THE FOLLOWING RULES:
C
C A) BY DECREASING MULTIPLICITY
C B) BY NON-FIXED PARAMETERS X,Y,Z
C C) BY MINIMUM TRANSLATION IN X,Y,Z-DIRECTION
C
C *** USES A PRELIMINARY VERSION OF =ISPTAB= TO SAVE CALCULATION TIME
C
C CALLS SYMULT, RECENT, INTEGER, ICOMMA, SHCTOR, REDEFI,
C TEHECU, NEWAXS
C
C***** CALLS TIME-FUNCTION =SECOND(I)=
C
C WRITTEN BY DANIEL ALTERMATT
C MCMASTER UNIVERSITY, OCTOBER 1984
C
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
DIMENSION TU(3,14),SPS(3,3,48),TPS(3,48),TA(3),IPT(48),ISS(48)
DIMENSION ROW(3), GTEMP(2), SS(3,3)
C
C SYSTEM COMMON BLOCKS
C
COMMON /FILES/NIN,NOUT,NDEBUG
COMMON /SYMA/ MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30),
1 MULTSP(30),SP(3,3,30),TP(3,30)
COMMON /SYM/ NSYM,MSYM,S(3,3,48),T(3,48),NTT,TNT(3,4)
COMMON /GSYM/ GLAT,GCENT,HMSYM,HALL,GSYSP(2,30)
C GENERAL LATTICE TRANSLATIONS
DATA TU/1.,1.,1., 1.,0.,0., 0.,1.,0., 0.,0.,1., 0.,1.,1.,
+ 1.,0.,1., 1.,1.,0., 0.,0.,0., 18*.0/
C
NLT=8
IF(NTT.EQ.1) GOTO 8
DO 5 I=2,NNT
5 CALL LTRANS(NLT,TNT(1,I),TU)
C
8 IF(NDEBUG.NE.0) WRITE(NDEBUG,2100) SECOND(3)
2100 FORMAT(//,' ++DEBUG++SPESOR++2100++ START AT',F8.3,/)
C
C FOR ALL SPECIAL POSITIONS DO...
C
DO 10 N=1,NSP
STIME=SECOND(3)
C
C FIRST EXPAND THE SPECIAL POSITIONS TO THEIR FULL SET
C OF SEITZ MATRICES...
C
ATRAC1=0.0
DO 20 I=1,3
TPS(I,1)=TP(I,N)
ATRAC1=ATRAC1+ABS(SP(I,I,N))
ROW(I)=ABS(SP(I,1,N))+ABS(SP(I,2,N))+ABS(SP(I,3,N))
DO 20 J=1,3
20 SPS(I,J,1)=SP(I,J,N)
IPS=1
IPT(1)=1
C
C ASSUME GIVEN POSITION TO BE LEGAL, CONVERT IT TO OUR STANDARD
C
CALL REDEFI(SPS(1,1,1),TPS(1,1))
CALL NEWAXS(SPS(1,1,1),TPS(1,1))
IF (NLT.EQ.8) GOTO 22
IF (GLAT.EQ.'H'.AND.SPS(3,3,1).LT.0.01) GOTO 22
CALL SHCTOR(TPS(1,1),SPS(1,1,1),TU,NLT)
C
C NOW EXPAND SET
C
22 DO 30 I=1,NSYM
DO 40 K=1,IPS
40 IF (ISPTAB(I,N).EQ.IPT(K)) GOTO 30
IPS=IPS+1
IPT(IPS)=ISPTAB(I,N)
KK=IPT(IPS)
CALL SYMULT(SPS(1,1,IPS),TPS(1,IPS),S(1,1,KK),T(1,KK),
1 SPS(1,1,1),TPS(1,1))
I30 = 3
CALL RECENT(TPS(1,IPS),I30)
C
C IN ORDER TO GET THE POSITION CLOSEST TO THE ORIGIN
C REDEFINE INDEPENDENT VARIABLES WHERE NECESSARY
C
ATRAC=0.0
DO 35 J=1,3
ROW(J)=ABS(SPS(J,1,IPS))+ABS(SPS(J,2,IPS))+ABS(SPS(J,3,IPS))
ATRAC=ATRAC+ABS(SPS(J,J,IPS))
35 CONTINUE
IF(INTEGER(ATRAC,0).EQ.(INTEGER(ATRAC1,0)-2)) THEN
CALL TEHECU(SPS(1,1,1),SPS(1,1,IPS))
ENDIF
CALL REDEFI(SPS(1,1,IPS),TPS(1,IPS))
IF (NLT.EQ.8) GOTO 30
IF (GLAT.EQ.'H'.AND.SPS(3,3,IPS).LT.0.01) GOTO 30
CALL SHCTOR(TPS(1,IPS),SPS(1,1,IPS),TU,NLT)
30 CONTINUE
C
C RESTORE THE COORDINATE TRIPPLE WITH...
C
ISUM=0
C
C 14) NUL-MATRIX: SMALLEST TOTAL SHIFT
C
TMSUM=0.0
DO 45 I=1,3
DO 45 II=1,3
45 TMSUM=TMSUM+ABS(SPS(I,II,1))
IF (TMSUM.GT.0.01) GOTO 60
ISUM=IPS
SUM=3.0
DO 50 I=1,IPS
ISS(I)=1
SUM1=TPS(1,I)+TPS(2,I)+TPS(3,I)
50 IF (SUM1.LT.(SUM-0.01)) SUM=SUM1
DO 55 I=1,IPS
SUM1=TPS(1,I)+TPS(2,I)+TPS(3,I)
IF (INTEGER(SUM1,2).EQ.INTEGER(SUM,2)) GOTO 55
ISUM=ISUM-1
ISS(I)=-14
55 CONTINUE
IF (ISUM.EQ.1) GOTO 200
GOTO 70
C
C 1) AT LEAST X POSITIVE WITH NO Y- OR Z-COMPONENT
C AND FEWEST NUMBER OF NON-DIAGONAL ELEMENTS
C
60 IOFF=3
DO 80 I=1,IPS
ISS(I)=1
TEST=ABS(SPS(1,2,I))+ABS(SPS(1,3,I))
IF (SPS(1,1,I).LT.-0.01.OR.TEST.GT.0.01) THEN
ISS(I)=-1
ELSE IF (SPS(1,1,I).GT.1.01) THEN
ISS(I)=-1
ELSE
NOFF=INTEGER(ABS(SPS(2,1,I))+ABS(SPS(3,1,I))+ABS(SPS(3,2,I)),0)
IF (NOFF.LT.IOFF) IOFF=NOFF
ISUM=ISUM+1
ENDIF
80 CONTINUE
DO 85 I=1,IPS
IF (ISS(I).LT.0) GOTO 85
NOFF=INTEGER(ABS(SPS(2,1,I))+ABS(SPS(3,1,I))+ABS(SPS(3,2,I)),0)
IF (SPS(2,1,I).GT.1.01) NOFF=NOFF-1
IF (NOFF.EQ.IOFF) GOTO 85
ISUM=ISUM-1
ISS(I)=-1
85 CONTINUE
IF (ISUM.EQ.1) GOTO 200
C
C 13) NOTHING LIKE X+1/2, Y+1/4, ...
C
70 ISUM1=0
DO 118 I=1,IPS
IF (ISS(I).LT.0) GOTO 118
DO 120 J=1,3
120 IF (ABS(SPS(J,J,I)).GT.0.01.AND.TPS(J,I).GT.0.01) GOTO 122
GOTO 118
122 ISUM1=ISUM1+1
ISS(I)=-13
118 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 123 I=1,IPS
123 IF(ISS(I).EQ.-13) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 2) Y .EQ. 0 OR 1
C
ISUM1=0
DO 90 I=1,IPS
IF (ISS(I).LT.0) GOTO 90
IF (SPS(2,2,I).GT.-0.01.AND.SPS(2,2,I).LT.1.01) GOTO 90
ISUM1=ISUM1+1
ISS(I)=-2
90 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 95 I=1,IPS
95 IF (ISS(I).EQ.-2) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 3) NO Z-COMPONENT IN Y
C
ISUM1=0
DO 100 I=1,IPS
IF (ISS(I).LT.0) GOTO 100
IF (SPS(2,3,I).EQ.0.0) GOTO 100
ISUM1=ISUM1+1
ISS(I)=-3
100 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 105 I=1,IPS
105 IF (ISS(I).EQ.-3) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 4) SMALLEST TRANSLATION IN X-DIRECTION
C
TMIN=1.0
ISUM1=0
DO 110 I=1,IPS
IF (ISS(I).LT.0) GOTO 110
IF (TPS(1,I).LT.TMIN) TMIN=TPS(1,I)
110 CONTINUE
TMIN=TMIN+0.01
DO 115 I=1,IPS
IF (ISS(I).LT.0) GOTO 115
IF (TPS(1,I).LT.TMIN) GOTO 115
ISS(I)=-4
ISUM1=ISUM1+1
115 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.1) GOTO 200
C
C 5) Z .EQ. 0 OR 1
C
ISUM1=0
DO 135 I=1,IPS
IF (ISS(I).LT.0) GOTO 135
IF (SPS(3,3,I).GT.-0.01.AND.SPS(3,3,I).LT.1.01) GOTO 135
ISUM1=ISUM1+1
ISS(I)=-5
135 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 140 I=1,IPS
140 IF (ISS(I).EQ.-5) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 6) IF X (SPS(1,1,I)) .EQ. 0, NO X-COMPONENT OF Y
C
ISUM1=0
DO 138 I=1,IPS
IF (ISS(I).LT.0) GOTO 138
IF (SPS(1,1,I).NE.0.0) GOTO 138
IF (SPS(2,1,I).EQ.0.0) GOTO 138
ISS(I)=-6
ISUM1=ISUM1+1
138 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 142 I=1,IPS
142 IF (ISS(I).EQ.-6) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 7) X-COMPONENT OF Y .LE. 1
C
ISUM1=0
DO 125 I=1,IPS
IF (ISS(I).LT.0) GOTO 125
IF (SPS(2,1,I).LT.1.01) GOTO 125
ISUM1=ISUM1+1
ISS(I)=-7
125 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 130 I=1,IPS
130 IF (ISS(I).EQ.-7) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 12) X-COMPONENT OF Y .GE. 0
C
ISUM1=0
DO 170 I=1,IPS
IF (ISS(I).LT.0) GOTO 170
IF (SPS(2,1,I).GT.-0.01) GOTO 170
ISUM1=ISUM1+1
ISS(I)=-12
170 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 175 I=1,IPS
175 IF(ISS(I).EQ.-12) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 8) SMALLEST TRANSLATION IN Y-DIRECTION
C
TMIN=1.0
DO 145 I=1,IPS
IF (ISS(I).LT.0) GOTO 145
IF (TPS(2,I).LT.TMIN) TMIN=TPS(2,I)
145 CONTINUE
TMIN=TMIN+0.01
ISUM1=0
DO 150 I=1,IPS
IF (ISS(I).LT.0) GOTO 150
IF (TPS(2,I).LT.TMIN) GOTO 150
ISUM1=ISUM1+1
ISS(I)=-8
150 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.1) GOTO 200
C
C 9) SMALLEST TRANSLATION IN Z-DIRECTION
C
TMIN=1.0
DO 160 I=1,IPS
IF (ISS(I).LT.0) GOTO 160
IF (TPS(3,I).LT.TMIN) TMIN=TPS(3,I)
160 CONTINUE
TMIN=TMIN+0.01
ISUM1=0
DO 165 I=1,IPS
IF (ISS(I).LT.0) GOTO 165
IF (TPS(3,I).LT.TMIN) GOTO 165
ISS(I)=-9
ISUM1=ISUM1+1
165 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.1) GOTO 200
C
C 10) IF X .EQ. 0, NO X-COMPONENT IN Z
C
ISUM1=0
DO 180 I=1,IPS
IF (ISS(I).LT.0) GOTO 180
IF (SPS(1,1,I).NE.0.0) GOTO 180
IF (SPS(3,1,I).EQ.0.0) GOTO 180
ISUM1=ISUM1+1
ISS(I)=-10
180 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 185 I=1,IPS
185 IF (ISS(I).EQ.-10) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C 11) NO NEGATIVE COMPONENTS IN Z
C
ISUM1=0
DO 187 I=1,IPS
IF (ISS(I).LT.0) GOTO 187
IF (SPS(3,1,I).GT.-0.01.AND.SPS(3,2,I).GT.-0.01) GOTO 187
ISUM1=ISUM1+1
ISS(I)=-11
187 CONTINUE
ISUM=ISUM-ISUM1
IF (ISUM.EQ.0) THEN
DO 189 I=1,IPS
189 IF (ISS(I).EQ.-11) ISS(I)=0
ISUM=ISUM1
ENDIF
IF (ISUM.EQ.1) GOTO 200
C
C SEVERAL POSITIONS ARE EQUAL
C
J=0
DO 400 I=1,IPS
IF (ISS(I).LT.0) GOTO 400
IF (J.EQ.0) THEN
J=I
GOTO 400
ENDIF
IF (ICOMMA(SPS(1,1,J),SPS(1,1,I),3,2).EQ.0) THEN
ISS(I)=-19
ISUM=ISUM-1
IF (ISUM.EQ.1) GOTO 200
ENDIF
400 CONTINUE
C
C MAY BE: X,0,X X,X,0 0,X,X ETC.
C
J=0
DO 410 I=1,IPS
IF (ISS(I).LT.0) GOTO 410
IF (J.EQ.0) THEN
J=I
GOTO 410
ENDIF
DO 420 K=1,2
DO 430 L=1,3
DO 430 M=1,3
N1=M+K
IF(N1.GT.3) N1=N1-3
SS(N1,L)=SPS(M,L,I)
430 CONTINUE
IF(ICOMMA(SPS(1,1,J),SS,3,2).EQ.0) THEN
DO 440 L=1,3
DO 440 M=1,3
IF (SPS(L,M,J).LT.(SPS(L,M,I)-0.1)) THEN
M1=M+1
IF (M.EQ.3) M1=1
IF (SPS(M,M,J).GT.0.1.AND.SPS(M1,M,J).GT.0.1) THEN
ISS(I)=-18
ISUM=ISUM-1
IF (ISUM.EQ.1) GOTO 200
GOTO 420
ELSE IF (SPS(M,M,I).GT.0.1.AND.SPS(M1,M,I).GT.0.1)
1 THEN
ISS(J)=-18
ISUM=ISUM-1
IF (ISUM.EQ.1) GOTO 200
J=I
GOTO 420
ELSE IF (SPS(M,M,J).LT.0.1.OR.SPS(M,M,I).LT.0.1) THEN
ISS(I)=-18
ISUM=ISUM-1
IF (ISUM.EQ.1) GOTO 200
ENDIF
ENDIF
440 CONTINUE
ENDIF
420 CONTINUE
410 CONTINUE
C
C ERROR IN SORTING, NON-UNIQUE RESULT
C
WRITE (NOUT,2000) ISUM
2000 FORMAT (//,1X,'*****ERROR***SPESOR** NO UNIQUE SOLUTION,',I4,
1 ' SEITZ MATRICIES LEFT',//,' *****CHOOSE YOUR OWN SOLUTION:')
DO 190 I=1,IPS
IF (ISS(I).LT.0) GOTO 190
WRITE (NOUT,2010) I,(SPS(1,K,I),K=1,3),TPS(1,I),ISS(I),
1 (SPS(2,K,I),K=1,3),TPS(2,I),IPT(I),(SPS(3,K,I),K=1,3),TPS(3,I)
2010 FORMAT (/,1X,'NUMBER:',I4,10X,3F7.4,3X,F7.4,/,1X,'P-FLAG:',I4,
1 10X,3F7.4,3X,F7.4,/,1X,'SYM-OP:',I4,10X,3F7.4,3X,F7.4)
ISS(I)=-20
190 CONTINUE
195 WRITE (NOUT,2020)
2020 FORMAT (/,1H$,'GIVE NUMBER OF MATRIX AS REPRESENTATIVE OF',
1 ' WYKOFF GROUP: ')
READ (NIN,1000,ERR=197) NSR
1000 FORMAT (I5)
IF (NSR.LT.0.OR.NSR.GT.IPS) THEN
WRITE(NOUT,2040)
2040 FORMAT(/,' ***** INPUT ERROR, TRY AGAIN *****',/)
GOTO 195
ENDIF
ISS(NSR)=0
GOTO 200
197 WRITE(NOUT,2040)
GOTO 195
C
C WE FOUND THE GROUP REPRESENTATIVE
C
200 IF (NDEBUG.NE.0) THEN
DO 205 I=1,IPS
205 WRITE (NDEBUG,2010) I,(SPS(1,K,I),K=1,3),TPS(1,I),ISS(I),
1 (SPS(2,K,I),K=1,3),TPS(2,I),IPT(I),(SPS(3,K,I),K=1,3),TPS(3,I)
STIME=SECOND(3)-STIME
WRITE (NDEBUG,2030) STIME
2030 FORMAT (/,' ++DEBUG++SPESOR++2030++ THIS SORT DONE IN ',
1 F8.3,' SECONDS ')
ENDIF
DO 210 I=1,IPS
IF (ISS(I).LT.0) GOTO 210
SSIG=1.0
TRACE=SPS(1,1,I)+SPS(2,2,I)+SPS(3,3,I)
IF(TRACE.LT.-0.01) SSIG=-1.0
DO 215 J=1,3
TP(J,N)=TPS(J,I)
DO 215 K=1,3
215 SP(J,K,N)=SPS(J,K,I)*SSIG
GOTO 10
210 CONTINUE
10 CONTINUE
C
C SORT SPECIAL POSITIONS ACCORDING TO MULTIPLICITIES, AXIS
C AND TRANSLATIONS
C
STIME=SECOND(3)
DO 250 I=2,NSP
J=I
260 J1=J-1
IF (MULTSP(J).GE.MULTSP(J1)) THEN
IF (MULTSP(J).GT.MULTSP(J1)) GOTO 300
TRACE1=ABS(SP(1,1,J))+ABS(SP(2,2,J))+ABS(SP(3,3,J))
TRACE2=ABS(SP(1,1,J1))+ABS(SP(2,2,J1))+ABS(SP(3,3,J1))
IF (TRACE1.GT.(TRACE2+0.01)) GOTO 300
IF (TRACE1.LT.(TRACE2-0.01)) GOTO 250
OTR1=ABS(SP(2,1,J))+ABS(SP(3,1,J))+ABS(SP(3,2,J))
OTR2=ABS(SP(2,1,J1))+ABS(SP(3,1,J1))+ABS(SP(3,2,J1))
IF (OTR1.GT.(OTR2+0.01)) GOTO 300
IF (OTR1.LT.(OTR2-0.01)) GOTO 250
IF (TRACE1.GT.1.01) THEN
IF (ABS(SP(3,3,J)).LT.(ABS(SP(3,3,J1))-0.01)) GOTO 300
IF (ABS(SP(3,3,J)).GT.(ABS(SP(3,3,J1))+0.01)) GOTO 250
IF (ABS(SP(2,2,J)).LT.(ABS(SP(2,2,J1))-0.01)) GOTO 300
IF (ABS(SP(2,2,J)).GT.(ABS(SP(2,2,J1))+0.01)) GOTO 250
IF (ABS(SP(1,1,J)).LT.(ABS(SP(1,1,J1))-0.01)) GOTO 300
IF (ABS(SP(1,1,J)).GT.(ABS(SP(1,1,J1))+0.01)) GOTO 250
ELSE
IF (ABS(SP(3,3,J)).GT.(ABS(SP(3,3,J1))+0.01)) GOTO 300
IF (ABS(SP(3,3,J)).LT.(ABS(SP(3,3,J1))-0.01)) GOTO 250
IF (ABS(SP(2,2,J)).GT.(ABS(SP(2,2,J1))+0.01)) GOTO 300
IF (ABS(SP(2,2,J)).LT.(ABS(SP(2,2,J1))-0.01)) GOTO 250
IF (ABS(SP(1,1,J)).GT.(ABS(SP(1,1,J1))+0.01)) GOTO 300
IF (ABS(SP(1,1,J)).LT.(ABS(SP(1,1,J1))-0.01)) GOTO 250
ENDIF
LR1=0
LR2=0
DO 290 M=1,3
IF(TP(M,J).LT.0.01) LR1=LR1+1
290 IF(TP(M,J1).LT.0.01) LR2=LR2+1
IF(LR2.GT.LR1) GOTO 300
SUM1=TP(1,J)+TP(2,J)+TP(3,J)
SUM2=TP(1,J1)+TP(2,J1)+TP(3,J1)
IF (SUM1.GT.(SUM2+0.01)) GOTO 300
SUM1=SUM1-TP(3,J)
SUM2=SUM2-TP(3,J1)
IF (SUM1.GT.(SUM2+0.01)) GOTO 300
IF (TP(1,J).GT.(TP(1,J1)+0.01)) GOTO 300
ENDIF
GOTO 250
300 DO 310 K=1,NSYM
ITEMP=ISPTAB(K,J1)
ISPTAB(K,J1)=ISPTAB(K,J)
310 ISPTAB(K,J)=ITEMP
DO 330 K=1,3
TEMP=TP(K,J1)
TP(K,J1)=TP(K,J)
TP(K,J)=TEMP
DO 320 L=1,3
TEMP=SP(K,L,J1)
SP(K,L,J1)=SP(K,L,J)
320 SP(K,L,J)=TEMP
330 CONTINUE
ITEMP=MULTSP(J1)
MULTSP(J1)=MULTSP(J)
MULTSP(J)=ITEMP
DO 335 M=1,2
GTEMP(M)=GSYSP(M,J1)
GSYSP(M,J1)=GSYSP(M,J)
335 GSYSP(M,J)=GTEMP(M)
J=J1
IF (J.LE.1) GOTO 250
GOTO 260
250 CONTINUE
C
C PRINT STATEMENTS IN CASE NDEBUG .NE. 0
C
IF (NDEBUG.EQ.0) RETURN
STIME=SECOND(3)-STIME
WRITE (NDEBUG,2200) STIME
2200 FORMAT (//,' ++DEBUG++SPESOR++2200++ SPECIAL POSITIONS',
1 ' SORTED IN ',F8.3,' SECONDS',//,1X,
2 'MULTIPLICATION TABLE =ISPTAB= AT END OF =SPESOR= :',/)
DO 360 I=1,NSP
360 WRITE (NDEBUG,2210) (ISPTAB(J,I),J=1,NSYM)
2210 FORMAT (2X,42I3,/,2X,6I3)
WRITE (NDEBUG,2220) (MULTSP(I),I=1,NSP)
2220 FORMAT (//,1X,'MULTIPLICITIES OF SPECIAL POSITIONS: ',//,
1 1X,20I4)
WRITE (NDEBUG,2230)
2230 FORMAT (//,1X,'DEFINING SEITZ MATRICES OF SPECIAL POSITIONS:',
1 //,1X,'NUMBER ROTATIVE',13X,'TRANSLATIVE PART',/)
DO 340 I=1,NSP
340 WRITE (NDEBUG,2240) I,((SP(K,L,I),L=1,3),TP(K,I),K=1,3)
2240 FORMAT (1X,I4,3X,3F7.4,3X,F7.4,/,2(8X,3F7.4,3X,F7.4,/))
WRITE (NDEBUG,2250) SECOND(3)
2250 FORMAT (//,' ++DEBUG++SPESOR++2250++ END SPESOR AT',F8.3,/)
RETURN
END
C
C
C
C
SUBROUTINE SPSYM
C ----------------
C
C WRITTEN BY D. ALTERMATT
C MCMASTER UNIVERSITY, NOVEMBER 1984
C
C CALLS INTEGER
C
C THIS SUBROUTINE DERIVES THE POINT GROUP SYMMETRY FOR ALL
C THE SPECIAL POSITONS STORED IN COMMON /SYMA/. A POINT GROUP
C SYMBOL AS IN THE INTERNATIONAL TABLES FOR CRYSTALLOGRAPHY
C IS CREATED AND STORED IN =GSYSP(2,I)=
C
C**** THE SPECIAL POSITION MULTIPLICATION TABLE =ISPTAB= MUST BE
C CALCULATED BEFORE RUNNING =SPSYM= !!
C
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
C
C SYSTEM COMMON BLOCKS
C
COMMON /FILES/ NIN,NOUT,NDEBUG
COMMON /SYM/ NSYM,MSYM,S(3,3,48)
COMMON /GSYM/ GLAT,GCENT,HMSYM,HALL,GSYSP(2,30)
COMMON /SYMA/ MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30)
C
C =GGSYM= WILL CONTAIN THE SYMMETRIES IN
C [100],[010],[001],[110],[-110],[111] AND [000]-DIRECTION
C
DIMENSION GGSYM(7)
C
C FIRST INTERPRET HALL SYMBOL TO FIND CRYSTAL SYSTEM
C NCRYSY = 0 FOR TRIC. - ORTHO.
C 1 FOR TETRAGONAL
C 2 FOR HEX. PRIMITIVE
C 3 FOR HEX. R
C 4 FOR RHOMBOHEDRAL
C 5 FOR CUBIC
C
NCRYSY=0
DO 10 I=1,24
K=ICHAR(HALL(I:I))
IF(K.LT.ICHAR('A').OR.K.GT.ICHAR('R')) GOTO 10
DO 20 J=I,24
K=ICHAR(HALL(J:J))
IF(K.LT.ICHAR('2').OR.K.GT.ICHAR('6')) GOTO 20
IF(K.EQ.ICHAR('3')) THEN
NCRYSY=2
IF(HALL(J+1:J+1).EQ.'*') NCRYSY=4
IF(GLAT.EQ.'H') NCRYSY=3
GOTO 40
ENDIF
IF(K.EQ.ICHAR('4')) NCRYSY=1
IF(K.EQ.ICHAR('6')) NCRYSY=2
IF(GLAT.EQ.'H') NCRYSY=3
IF(K.EQ.ICHAR('2').OR.K.EQ.ICHAR('4')) THEN
DO 30 L=J,24
K=ICHAR(HALL(L:L))
IF(K.EQ.ICHAR('(')) GOTO 40
IF(K.NE.ICHAR('3')) GOTO 30
NCRYSY=5
GOTO 40
30 CONTINUE
ENDIF
GOTO 40
20 CONTINUE
10 CONTINUE
IF(NDEBUG.NE.0) WRITE(NDEBUG,2030) NCRYSY
2030 FORMAT(/,' ++DEBUG++SPSYM++2030++ NCRYSY =',I3)
C
C FOR ALL SPECIAL POSITIONS DO...
C WE ASSUME THAT THE SPECIAL POSITIONS ARE SORTED, STARTING WITH
C THE GENERAL POSITION (I=1), ENDING WITH THE MOST SPECIAL POSI-
C TION (I=NSP)
C
40 DO 50 I=NSP,1,-1
DO 60 J=1,7
60 GGSYM(J)=' '
NOSYM=1
C
C SEARCH THROUGH =ISPTAB=
C
DO 100 J=2,NSYM
IF(ISPTAB(J,I).NE.1) GOTO 100
C
C POSITION HAS THE SYMMETRY OF S(J)*S(1), GET IT
C
NOSYM=0
N=MULT(1,J)
TRACE=S(1,1,N)+S(2,2,N)+S(3,3,N)
ATRACE=ABS(S(1,1,N))+ABS(S(2,2,N))+ABS(S(3,3,N))
OUTOT=S(1,2,N)+S(1,3,N)+S(2,1,N)+S(2,3,N)+S(3,1,N)+S(3,2,N)
AOUTOT=ABS(S(1,2,N))+ABS(S(1,3,N))+ABS(S(2,1,N))+ABS(S(2,3,
1 N))+ABS(S(3,1,N))+ABS(S(3,2,N))
ITRAC=INTEGER(TRACE,0)
IATRAC=INTEGER(ATRACE,0)
IOUT=INTEGER(OUTOT,0)
IAOUT=INTEGER(AOUTOT,0)
IF(IABS(ITRAC).EQ.3) THEN
C -- CENTRE OF SYMMETRY
GGSYM(7)(1:2)='-1'
GOTO 100
ELSE IF(IATRAC.EQ.3.AND.IAOUT.EQ.0) THEN
IF(ITRAC.EQ.-1) THEN
C -- TWO-FOLD AXIS PARALLEL TO X, Y OR Z
DO 110 K=1,3
110 IF(S(K,K,N).GT.0.01) GGSYM(K)(4:4)='2'
GOTO 100
ELSE
C -- MIRROR PLANE PERPENDICULAR TO X, Y OR Z
DO 120 K=1,3
120 IF(S(K,K,N).LT.-0.01) GGSYM(K)(8:8)='M'
GOTO 100
ENDIF
ELSE IF(IATRAC.EQ.3) THEN
C -- TWO-FOLD AXIS OR MIRROR PLANE IN [210], TREAT AS [110]
IF(IOUT.GT.0) THEN
DO 150 K=1,3
IF(ITRAC.LT.-0.1) GGSYM(5)(4:4)='2'
150 IF(ITRAC.GT.0.1) GGSYM(4)(8:8)='M'
ELSE
DO 160 K=1,3
IF(ITRAC.LT.-0.1) GGSYM(4)(4:4)='2'
160 IF(ITRAC.GT.0.1) GGSYM(5)(8:8)='M'
ENDIF
GOTO 100
ELSE IF(IATRAC.EQ.2) THEN
IF(ITRAC.EQ.0) THEN
C -- 3 OR 3BAR PARALLEL TO Z
IF(GGSYM(3)(2:2).NE.'6') GGSYM(3)(2:2)='3'
DO 170 K=1,3
ROW=S(K,1,N)+S(K,2,N)+S(K,3,N)
COL=S(1,K,N)+S(2,K,N)+S(3,K,N)
170 IF(INTEGER(ROW,0).EQ.-1.AND.INTEGER(COL,0).EQ.-1)
1 GGSYM(3)(1:1)='-'
GOTO 100
ELSE
C -- 6 OR 6BAR PARALLEL TO Z
GGSYM(3)(2:2)='6'
IF(ITRAC.LT.0) GGSYM(3)(1:1)='-'
GOTO 100
ENDIF
ELSE IF(IATRAC.EQ.1) THEN
IF(IABS(IOUT).EQ.IAOUT) THEN
C -- TWO-FOLD AXIS OR MIRROR PLANE PARALLEL TO A DIAGONAL
IF(IOUT.GT.0) THEN
DO 130 K=1,3
IF(S(K,K,N).LT.-0.1) GGSYM(4)(4:4)='2'
130 IF(S(K,K,N).GT.0.1) GGSYM(5)(8:8)='M'
GOTO 100
ELSE
DO 135 K=1,3
IF(S(K,K,N).LT.-0.1) GGSYM(5)(4:4)='2'
135 IF(S(K,K,N).GT.0.1) GGSYM(4)(8:8)='M'
GOTO 100
ENDIF
ELSE
C -- 4 OR 4BAR PARALLEL TO Z
DO 140 K=1,3
K1=3
IF(NCRYSY.EQ.5) K1=K
IF(S(K,K,N).LT.-0.1) GGSYM(K1)(1:2)='-4'
140 IF(S(K,K,N).GT.0.1) GGSYM(K1)(2:2)='4'
GOTO 100
ENDIF
ELSE
C -- 3 OR 3BAR PARALLEL TO BODY-DIAGONAL
GGSYM(6)(2:2)='3'
IF(IOUT.EQ.-3.OR.IOUT.EQ.1) GGSYM(6)(1:1)='-'
ENDIF
100 CONTINUE
C -- IS IT THE GENERAL POSITION ?
IF(NOSYM.EQ.1) GGSYM(7)(1:2)=' 1'
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,2000) I,(ISPTAB(J,I),J=1,NSYM)
2000 FORMAT(/,' ++DEBUG++SPSYM++2000++ SPEC.POS. NUMBER',I4,
1 ' ISPTAB:',/,1X,48I2)
WRITE(NDEBUG,2005) (GGSYM(K),K=1,7)
2005 FORMAT(' GGSYM" 100 "" 010 "" 001 "" 110 ""',
1 ' -110 "" 111 "" 000 "',/,6X,7A8)
ENDIF
C
C SO FAR, SO WELL. NOW GET RID OF EXESSIVE ELEMENTS
C
IF(GGSYM(3)(1:4).EQ.'-6 ') GGSYM(3)(8:8)=' '
ILEN=0
DO 200 K=1,5
IF(GGSYM(K)(8:8).EQ.'M') ILEN=ILEN+1
200 IF(GGSYM(K)(1:2).NE.' ') ILEN=ILEN+1
IF(NCRYSY.NE.4.AND.ILEN.GE.2) THEN
DO 210 K=1,5
210 IF(GGSYM(K)(8:8).EQ.'M') GGSYM(K)(3:4)=' '
ENDIF
C
C UPDATE =NCRYSY= IN CASE HALL-SYMBOL SHOULD BE EMPTY
C
IF(GGSYM(6).NE.' ') THEN
IF(NCRYSY.LT.4) NCRYSY=5
IF(GGSYM(2)(2:2).EQ.'4') GGSYM(3)=GGSYM(2)
GGSYM(2)=' '
IF(NCRYSY.EQ.5) THEN
IF(GGSYM(1)(2:2).EQ.'4') GGSYM(3)=GGSYM(1)
GGSYM(1)=' '
IF(GGSYM(4).NE.' ') GGSYM(5)=' '
ENDIF
ENDIF
DO 215 K=1,3
IF(GGSYM(K)(1:2).NE.' ') THEN
GGSYM(K)(4:4)=' '
IF(NCRYSY.LT.1.AND.GGSYM(K)(2:2).EQ.'4') NCRYSY=1
IF(NCRYSY.LT.2.AND.GGSYM(K)(2:2).EQ.'3') NCRYSY=2
IF(NCRYSY.LT.2.AND.GGSYM(K)(2:2).EQ.'6') NCRYSY=2
ENDIF
IF(GGSYM(K)(8:8).NE.' ') GGSYM(K)(1:1)=' '
215 CONTINUE
DO 220 K=1,6
220 IF(GGSYM(K).NE.' ') GGSYM(7)=' '
DO 230 K=1,5
230 IF(GGSYM(K)(1:4).NE.' '.AND.GGSYM(K)(8:8).EQ.'M')
1 GGSYM(K)(6:6)='/'
IF(NCRYSY.EQ.5) THEN
IF(GGSYM(1)(2:2).EQ.'4') THEN
GDUM=GGSYM(3)
GGSYM(3)=GGSYM(1)
GGSYM(1)=GGSYM(2)
GGSYM(2)=GDUM
ENDIF
IF(GGSYM(2)(2:2).EQ.'4') THEN
GDUM=GGSYM(3)
GGSYM(3)=GGSYM(2)
GGSYM(2)=GGSYM(1)
GGSYM(1)=GDUM
ENDIF
ENDIF
IF(NDEBUG.NE.0) WRITE(NDEBUG,2005) (GGSYM(K),K=1,7)
C
C ADD PERIODS, CONCATINATE, REMOVE BLANKS AND SAVE TO =GSYSP(2,I)=
C
HLINE=' '
IF(GGSYM(7).NE.' ') THEN
C -- 1 OR 1BAR ONLY
HSYM=GGSYM(7)
GOTO 310
ENDIF
IF(NCRYSY.EQ.0) THEN
C -- SYMMETRY LESS THAN TETRAGONAL
DO 300 K=1,3
300 IF(GGSYM(K).EQ.' ') GGSYM(K)(8:8)='.'
HSYM=GGSYM(1)//GGSYM(2)//GGSYM(3)//GGSYM(7)
GOTO 310
ENDIF
C -- HIGHER SYMMETRIES
DO 320 K=1,6
IF(K.EQ.2) GOTO 320
IF(GGSYM(K).EQ.' ') GGSYM(K)(8:8)='.'
320 CONTINUE
IF(NCRYSY.EQ.2.OR.NCRYSY.EQ.3) THEN
C -- TRIGONAL OR HEXAGONAL
IF(GGSYM(3)(1:2).NE.' '.AND.GGSYM(4)(6:6).EQ.'/')
1 GGSYM(4)(1:6)=' '
IF(GGSYM(3)(1:2).NE.' '.AND.GGSYM(5)(6:6).EQ.'/')
1 GGSYM(5)(1:6)=' '
IF(NCRYSY.EQ.3) THEN
IF(GGSYM(4).NE.' '.AND.GGSYM(5).EQ.' .')
1 GGSYM(5)=' '
IF(GGSYM(5).NE.' '.AND.GGSYM(4).EQ.' .')
1 GGSYM(4)=' '
IF(GGSYM(4).EQ.GGSYM(5)) GGSYM(5)=' '
ENDIF
HSYM=GGSYM(3)//GGSYM(4)//GGSYM(5)//GGSYM(7)
GOTO 310
ENDIF
IF(NCRYSY.EQ.1.OR.NCRYSY.GE.4) THEN
C -- TETRAGONAL, RHOMBOHEDRAL OR CUBIC
IF(NCRYSY.EQ.1) GGSYM(6)=' '
IF(GGSYM(4).NE.' '.AND.GGSYM(5).EQ.' .')
1 GGSYM(5)=' '
IF(GGSYM(5).NE.' '.AND.GGSYM(4).EQ.' .')
1 GGSYM(4)=' '
IF(GGSYM(3)(1:2).NE.' '.OR.NCRYSY.EQ.4) THEN
GGSYM(2)=' '
IF(GGSYM(4)(8:8).EQ.'M') GGSYM(5)=' '
IF(GGSYM(5)(8:8).EQ.'M') GGSYM(4)=' '
IF(GGSYM(4).EQ.GGSYM(5)) GGSYM(5)=' '
ENDIF
IF(GGSYM(1)(8:8).EQ.'.'.AND.GGSYM(2).NE.' ')
1 GGSYM(1)(8:8)=' '
ENDIF
IF(NCRYSY.EQ.4) THEN
C -- RHOMBOHEDRAL
IF(GGSYM(6)(1:4).NE.' '.AND.GGSYM(4)(6:6).EQ.'/')
1 GGSYM(4)(1:6)=' '
IF(GGSYM(6)(1:4).NE.' '.AND.GGSYM(5)(6:6).EQ.'/')
1 GGSYM(5)(1:6)=' '
HSYM=GGSYM(6)//GGSYM(4)//GGSYM(5)//GGSYM(7)
GOTO 310
ENDIF
IF(NCRYSY.EQ.5) THEN
C -- CUBIC
IF(GGSYM(1)(8:8).EQ.'.') GGSYM(1)(8:8)=' '
IF(GGSYM(3)(8:8).EQ.'M'.AND.GGSYM(6)(1:2).EQ.'-3')
1 GGSYM(3)(1:6)=' '
IF(GGSYM(4)(8:8).EQ.'M'.AND.GGSYM(6)(1:2).EQ.'-3')
1 GGSYM(4)(1:6)=' '
IF(GGSYM(5)(8:8).EQ.'M'.AND.GGSYM(6)(1:2).EQ.'-3')
1 GGSYM(5)(1:6)=' '
IF(GGSYM(4)(4:4).EQ.'2'.AND.GGSYM(5)(8:8).EQ.'M') THEN
GGSYM(4)=' M'
GGSYM(5)=' 2 '
ENDIF
IF(GGSYM(1)(4:4).EQ.'2') THEN
IF(GGSYM(2)(8:8).EQ.'M') THEN
GGSYM(1)=' M'
GGSYM(2)=' 2 '
ELSE IF(GGSYM(3)(8:8).EQ.'.') THEN
GGSYM(3)=' '
ELSE IF(GGSYM(3)(2:2).EQ.'4') THEN
IF(GGSYM(4)(8:8).EQ.'.'.OR.GGSYM(5)(8:8).EQ.'.')
1 GGSYM(1)=' '
IF(GGSYM(3)(8:8).EQ.'M') THEN
GGSYM(3)(6:6)=' '
GGSYM(1)=' '
ENDIF
ENDIF
ENDIF
ENDIF
HSYM=GGSYM(3)//GGSYM(1)//GGSYM(2)//GGSYM(6)//GGSYM(4)//GGSYM(5)
1 //GGSYM(7)
310 IF(NDEBUG.NE.0) WRITE(NDEBUG,2010) HSYM
2010 FORMAT(' ++2010++ HSYM: ',A80)
J=1
DO 250 K=1,48
IF(HSYM(K:K).EQ.' ') GOTO 250
HLINE(J:J)=HSYM(K:K)
J=J+1
250 CONTINUE
GSYSP(2,I)=HLINE(1:8)
IF(NDEBUG.NE.0) WRITE(NDEBUG,2020) HLINE,GSYSP(2,I)
2020 FORMAT(' ++2020++HLINE: ',A80,/,' ++2020++ GSYSP(2,I): ',A8,/)
50 CONTINUE
RETURN
END
C
C
C
C
FUNCTION ITESTR(TA,TB,TU,NLT,SP)
C ---------------
C
C WRITTEN 84.5.11 BY I.D.BROWN
C UPDATED 84.12.17 BY D.ALTERMATT
C
C CALLS ICOMVE, REDEFI
C
C EQUALS ZERO IF TA IS THE SAME AS ANY DERIVATIVE OF TB CREATED
C WHEN THE SYMMETRY TRANSLATIONS OF TU ARE APPLIED TO ROWS OF TB.
C ORIGIN OF TB IS REDEFINED WITH RESPECT TO MATRIX SP. TO PREVENT
C THIS REDEFINITION SET ALL ELEMENTS OF SP TO 0.0
C
DIMENSION TA(3),TB(3),TC(3),TU(3,NLT),SP(3,3)
ITESTR=1
DO 200 I=8,NLT
DO 100 J=1,3
100 TC(J)=TB(J)+TU(J,I)
CALL REDEFI(SP,TC)
IF(ICOMVE(TA,TC,3,2).EQ.0) THEN
ITESTR=0
RETURN
ENDIF
200 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE RECENT(X,N)
C ----------------------
C
C WRITTEN 84.3.5 BY I D BROWN
C
C BRINGS EACH ELEMENT OF X(N) INTO THE RANGE 0 TO 0.99 BY ADDING
C OR SUBTRACTING 1
C
COMMON/FILES/NIN,NOUT,NDEBUG
DIMENSION X(N)
DO 100 K=1,N
10 IF(X(K).LE.1.0.AND.X(K).GE.0.0) GOTO 50
IF(X(K).GE.1.) X(K)=X(K)-1.0
IF(X(K).LT.0.) X(K)=X(K)+1.0
GOTO 10
50 IF(X(K).GT.0.9999) X(K)=0.0
100 CONTINUE
RETURN
END
C
SUBROUTINE LTRANS(NLT,T,TU)
C -----------------
C
C WRITTEN 84.2.8 BY I D BROWN
C
C ADDS CENTERING TRANSLATIONS TO ARRAY TU
C
DIMENSION T(3),TU(3,14)
J=0
NLT=NLT+1
DO 50 I=1,3
TU(I,NLT)=T(I)
IF(T(I).LT.0.1) J=I
50 CONTINUE
IF(J.EQ.0) RETURN
C
C IF ONE COMPONENT OF T IS ZERO ADD A UNIT TRANSLATION
C
NLT=NLT+1
DO 100 I=1,3
TU(I,NLT)=T(I)
IF(I.EQ.J) TU(I,NLT)=TU(I,NLT)+1.
100 CONTINUE
RETURN
END
C
C
C
C
C
SUBROUTINE XALTNO(XX,NPOS,NALT,NALTS,ICENT,NT,ZZ)
C
C WRITTEN 85.7.26 BY I.D.BROWN
C
C CALLS symop,recent,vminv,vplusv
C
C This subroutine transforms xx to the altermatt position zz.
c If NPOS.ne.0 only special position with multiplicity.eq.npos
c will be searched, otherwise all will be searched and the correct
c value of NPOS will be returned.
C NALT is the Altermatt number found
C NALTS is the symmetry operator to transform xx to zz
C ICENT is the corresponding lattice centering operator
C NT(3) is the subsequent lattice translation needed
c
c
* *********** PROGRAMMERS NOTE *************************
* THIS ROUTINE DOES NOT APPARENTLY RECOGNISE 0,Y,Z (E.G. 0,.09,.18)
* AS X,Y,0 (POSTION 2) IN FM-3C
***********************************************************
C
implicit character*8 (g)
implicit character*80 (h)
c
c system common blocks
c
common /files/ nin,nout,ndebug,nread,nwrite,nspgp
common /sym/ nsym,msym,s(3,3,48),t(3,48),nlt,tu(3,4)
common /gsym/ glat,gcent,hmsym,hall,gsysp(2,30)
common /syma/ mult(48,48),it(3,48),nsp,msp,isptab(48,30),
1 multsp(30),sp(3,3,30),tp(3,30)
dimension xx(3),zz(3),nt(3),y(3),z(3),tx(3)
c
nalt=0
c
c check multiplicities and npos to screen possible special positons
c
do 400 j=nsp,1,-1
if(npos.eq.multsp(j).or.npos.eq.0) then
c multiplicity of special position matches
if(j.eq.1.and.npos.eq.0) then
c the atom must be on a general position
nalt=1
nalts=1
icent=1
npos=multsp(1)
do 100 k=1,3
nt(k)=2
zz(k)=xx(k)
100 continue
return
endif
c
c apply all symmetry operations and translations to xx to find a match
c for sp/tp
c
do 300 k=1,nsym
call symop(y,s(1,1,k),t(1,k),xx)
i30 = 3
call recent(y,i30)
do 250 k2=1,nlt
call vminv(z,y,tu(1,k2))
if(ialtst(sp(1,1,j),tp(1,j),z).eq.1)then
c we have a match for the coordinates
nalt=j
if(npos.eq.0) npos=multsp(j)
nalts=k
icent=k2
go to 500
endif
250 continue
300 continue
endif
400 continue
if(nalt.eq.0) return
c
c Altermatt number (nalt), symmetry operator (nalts) and the lattice
c centering translation (icent) have now been found. We now need to
c find the lattice translation and determine zz
c
500 call symop(y,s(1,1,nalts),t(1,nalts),xx)
call vplusv(z,y,tu(1,icent))
c
c z should differ from the Altermatt coordinates only by a lattice
c translation
c First we generate the coordinates in the altermatt position
call symop(zz,sp(1,1,nalt),tp(1,nalt),z)
call recent(zz,3)
c then find the lattice translation between zz and z
call vminv(tx,zz,z)
do 550 i=1,3
550 nt(i)=integer(tx(i),0)+2
return
end
C
C
C
C
SUBROUTINE NALTNO(XX,NPOS,NALT,NALTS,ICENT,NT)
C ----------------------------------------------
C
C WRITTEN BY I.D. BROWN, NOV. 22 1984
C
C CALLS SYMULT, RECENT, IALTST, INTEGER, SYMOP, VMINV
C
C THIS SUBROUTINE RETURNS IN =NALT= THE NUMBER OF THE SPECIAL POSITION
C ('ALTERMATT-NUMBER') THAT MATCHES A GIVEN COORDINATE TRIPLET =XX=
C OF MULTIPLICITY =NPOS=. IF =NPOS= IS 0, THEN ALL SPECIAL POSITIONS
C ARE TESTED. =NALTS= WILL CONTAIN THE SYMMETRY OERATOR NUMBER FOR
C THE TRANSFORMATION =SP(NALT)= TO =XX=, =ICENT= GIVES THE CENTRING
C AND =NT(3)= THE SHIFTS TO NEIGHBOUR CELLS [(2,2,2) FOR NO SHIFT]
C
C NALT=0 FOR NO MATCH
C
C**** RUN SPESOR BEFORE USING THIS SUBROUTINE.
C
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
C
C SYSTEM COMMON BLOCKS
C
COMMON /FILES/ NIN,NOUT,NDEBUG
COMMON /SYM/ NSYM,MSYM,S(3,3,48),T(3,48),NLT,TA(3,4)
COMMON /GSYM/ GLAT,GCENT,HMSYM,HALL,GSYSP(2,30)
COMMON /SYMA/ MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30),
1 MULTSP(30),SP(3,3,30),TP(3,30)
C
DIMENSION SN(3,3),X(3),Y(3),XX(3),Z(3),TX(3),NT(3),TN(3),YY(3)
C
NALT=0
C
C LOOP THROUGH ALL SPECIAL POSITIONS, STARTING AT THE MOST
C SPECIAL ONE
C
DO 400 J=NSP,1,-1
IF(NDEBUG.NE.0) WRITE(NDEBUG,2160) J,NPOS,MULTSP(J)
2160 FORMAT(/,' ++DEBUG++NALTNO++2160++ J =',I3,
1 ', NPOS(I) =',I3,', MULTSP(J) =',I3)
IF(NPOS.EQ.MULTSP(J).OR.NPOS.EQ.0) THEN
C -- MULTIPLICITIES OF ATOMIC AND SPECIAL POSITION MATCH
IF(J.EQ.1.AND.NPOS.NE.0) THEN
C -- GENERAL POSITION
NALT=J
NALTS=1
ICENT=1
DO 100 K=1,3
100 NT(K)=2
RETURN
ENDIF
C
C APPLY ALL SYMMETRY OPERATORS TO THE COORDINATES
C
DO 300 K=1,NSYM
CALL SYMULT(SN,TN,S(1,1,K),T(1,K),SP(1,1,J),TP(1,J))
I30 = 3
CALL RECENT(TN,I30)
IF(NDEBUG.NE.0) WRITE(NDEBUG,2150) J,K,NPOS,MULTSP
1 (J),((SN(J1,J2),J2=1,3),TN(J1),XX(J1),J1=1,3)
2150 FORMAT(/' ++DEBUG++NALTNO++2150++ J =',I3,
1 ',K =',I3,/,' NPOS(I) =',I3,', MULTSP(J) =',I3,
2 ', SN(3,3) , TP(3), XX(3)',3(/,30X,3F6.3
3 ,3X,F6.3,3X,F6.3))
DO 250 K2=1,NLT
CALL VMINV(Z,XX,TA(1,K2))
IF(IALTST(SN,TN,Z).EQ.1) THEN
ICENT=K2
NALT=J
NALTS=K
GOTO 500
ENDIF
250 CONTINUE
300 CONTINUE
ENDIF
400 CONTINUE
500 IF(ICENT.NE.1) CALL VMINV(Z,XX,TA(1,ICENT))
CALL SYMULT(SN,TN,S(1,1,NALTS),T(1,NALTS),SP(1,1,NALT),TP(1,NALT))
CALL VMINV(Y,Z,TN)
DO 530 I=1,3
X(I)=0.0
DO 520 J=1,3
IF(ABS(SN(J,I)).GT.0.001) THEN
X(I)=Y(J)/SN(J,I)
GOTO 530
ENDIF
520 CONTINUE
530 CONTINUE
I30 = 3
CALL RECENT(X,I30)
CALL SYMOP(YY,SN,TN,X)
CALL VMINV(TX,Z,YY)
DO 550 I=1,3
550 NT(I)=INTEGER(TX(I),0)+2
RETURN
END
C
C
C
C
FUNCTION IALTST(SN,TM,X)
C
C CALLS RECENT
C
C SLAVE OF NALTNO
C
DIMENSION SN(3,3),TM(3),X(3),Y(3),Z(3)
C
IALTST=0
DO 100 L=1,3
Y(L)=0.0
100 Z(L)=X(L)
I30 = 3
CALL RECENT(Z,I30)
DO 200 L=1,3
AROW=ABS(SN(L,1))+ABS(SN(L,2))+ABS(SN(L,3))
IF(AROW.LT.0.001.AND.ABS(Z(L)-TM(L)).GT.0.001)
1 GOTO 250
IF(ABS(SN(L,1)).GT.0.001) Y(L)=(X(L)-TM(L))/SN(L,1)
200 CONTINUE
I30 = 3
CALL RECENT(Y,I30)
DO 300 L=1,3
IF(ABS(SN(L,1)).LT.0.01) GOTO 300
K1=L-1
K2=L+1
IF(K1.LT.1) K1=3
IF(K2.GT.3) K2=1
IF(ABS(SN(K1,1)).GT.0.001.AND.ABS(Y(K1)-Y(L)).GT.0.001)
1 GOTO 250
IF(ABS(SN(K2,1)).GT.0.001.AND.ABS(Y(K2)-Y(L)).GT.0.001)
1 GOTO 250
300 CONTINUE
IALTST=1
250 CONTINUE
RETURN
END