C FILE GETSPEC
C =======
C
C V V AA X X
C V V A A X X
C V V AAAAAA X - VERSION
C V V A A X X
C V A A X X
C
C THIS FILE CONTAINS THE FOLLOWING ROUTINES:
C
C P GETSPEC MAIN PROGRAM, INTERACTIVELY REQUESTS SPACE GROUP
C SYMBOLS AND CALLS SUBROUTINES TO CALCULATE THE
C SYMMETRY OPERATORS AND SPECIAL POSITIONS
C S SGHALL CALCULATES SYMMETRY OPERATORS FROM HALL SYMBOL
C S SYMD DOUBLES NUMBER OF SYM.OPS. DUE TO CENTRE OF SYMMETRY
C S SYMXYZ PRINTS SYM.OPS. IN (X,Y,Z)-FORM
C S GRMULT CALCULATES THE POINT GROUP MULTIPLICATION TABLE
C S SYMOP DOES SYMMETRY TRANSFORMATIONS
C S SYMULT MULTIPLIES SYMMETRY OPERATORS
C S WSCFS CREATES AN OUTPUT FILE IN STANDARD CRYSTALLOGRAPHIC
C FILE STRUCTURE (SCFS-84)
C S INCREA PRINTS OUT SYMMETRY TABLE
C S CONXYZ CONVERTS A SEITZ-MARIX TO (X,Y,Z)-FORM
C F ICOMMA COMPARES TWO (NXN)-MATRICES
C F ICOMVE COMPARES TWO (N)-VECTORS
C F INTEGER RETURNS INTEGER VALUE FOR REAL NUMBER, CORRECT ROUND-OFF
C S MMINM DIFFERENCE OF TWO MATRICES
C S MXM PRODUCT OF TWO MATRICES
C S MXV PRODUCT OF MATRIX * VECTOR
C F SECOND SYSTEM-DEPENDENT TIME CALLS
C S VMINV DIFFERENCE OF TWO VECTORS
C S VPLUSV SUM OF TWO VECTORS
C
C
c GETSPEC calculates symmetry operators and special positions for any
c given space group from the HALL space group symbol (which can be
c obtained from the HERMANN-MAUGUIN symbol stored in the file SPGR.DAT).
c The program is described by Altermatt and Brown in Acta Cryst. (1987)
c A34, 125-130.
c
C 'GETSPEC' CALLS THE ROUTINES IN THE FILE 'GTSPLB'
C
C 'GETSPEC' OPENS THE EXISTING DATA FILE 'SPGR.DAT' IN DEFAULT DIRECTORY
C CREATES FILE 'SCFS.DAT' AND, IF SPECIFIED, FILE 'DEBUG.DAT'
C IN DEFAULT DIRECTORY
C
C 'SPGR.DAT' CONTAINS A CONCORDANCE BETWEEN HERMANN-MAUGUIN AND HALL
C SPACE GROUP SYMBOLS
C
C
PROGRAM GETSPEC
C
C ***** INTERACTIVE VAX-VERSION *****
C
C THIS PROGRAM WILL PROMPT FOR A HERMANN-MAUGUIN SYMBOL AS USED IN THE
C INORGANIC CRYSTAL STRUCTURE DATABASE, THE HALL SPACE GROUP SYMBOL AND
C THE SPACE GROUP NUMBER. ONLY ONE OF THE TWO SYMBOLS IS NEEDED AND THE
C SPACE GROUP NUMBER IS OPTIONAL. THE PROGRAM WILL THEN SEARCH THROUGH
C THE DATAFILE 'SPGR.DAT' TO GET THE EQUIVALENT OTHER SYMBOL AND SPACE
C GROUP NUMBER (IF NOT ALREADY GIVEN), CALCULATE THE SYMMETRY OPERATORS
C AND SPECIAL POSITIONS, SORT, PRINT AND STORE (ON FILE 'SCFS.DAT') ALL
C THE DATA.
C
C THE FOLLOWING ROUTINES ARE CALLED:
C
C GETSPEC: SECOND, SGHALL, GRMULT, WSCFS, CONXYZ
C SPELIB: SPOST, SPESOR, SPMULT, SPSYM
C
C
C THE FINAL ORDERING OF THE SPECIAL POSITIONS IS THAT DESCRIBED BY THE
C AUTHOR IN ACTA CRYST (1985)
C
C
C NOTES ON THE NAMES OF ARRAYS USED IN MCMASTER
C CRYSTALLOGRAHIC PROGRAMS
C
C NOTE: Matrices are given as M(row,column)
C default integer names are used
C implicit character*8 (g)
C implicit character*80 (h)
C FILES
C -----
C nin input file number
C nout output file number
C ndebug debug output file number(set to 0)
C nread input data file number
C nwrite output data file number
C nspgr input space group file
C
C SYM
C ---
C nsym number of symmetry operators stored
C msym dimension of symmetry arrays (=48)
C s(3,3,48) rotation matrix
C t(3,48) translation matrix
C nt multiplicity of lattice
C tu(3,4) translations due to lattice centrings (including (0,0,0))
C
C GSYM
C ----
C glat lattice type
C gcent A/C acentric/centric
C hmsym Hermann-Mauguin space group symbol
C hall Hall space group symbol
C gsysp(2,30) Wyckoff symbol, site symmetry
C
C SYMA
C ----
C mult(48,48) symmetry multiplication table
C it(3,48) symmetry translations in integer form (*12)
C nsp number of special positions stored
C msp dimensions of special position arrays (=30)
C isptab(48,30) equivalent symmetry operators for a given special
C position
C multsp(30) multiplicity of special postions
C sp(3,3,30) rotation matirix for special position operator
C tp(3,30) translation vector for secial position operator
C
C REFERENCE: ACTA CRYST.
C
C WRITTEN IN JUNE 1985 BY DANIEL ALTERMATT, MCMASTER UNIVERSITY, HAMILTON
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)
C
C START TIMER
C
TIME = SECOND(1)
C
C GREET USER AND SET DEFAULT VALUES IN COMMON BLOCKS
C
NIN = 5
NOUT = 6
WRITE(NOUT,2000)
2000 FORMAT('1',////,10x,' Welcome to program GETSPEC !',//,
1 10x,' We will prompt you for a Hermann-Mauguin and a Hall',/,
2 10x,' Space Group Symbol and then derive all symmetry',/,
3 10x,' operators and special positions for the given space',/,
4 10x,' group. ',//,
5 10x,' You may enter either one or both symbols. If given,',/,
6 10x,' the Hall-Symbol will be used for calculations.',///)
C-----------------
C IF YOU WOULD LIKE A DEBUG OUTPUT, YOU MAY SET 'NDEBUG = 8' AND
C REMOVE THE 'C' FROM THE FOLLOWING LINE. THIS WILL WRITE DEBUG
C STATEMENTS TO 'DEBUG.DAT'.
C ***** FOR CUBIC GROUPS THE SIZE OF 'DEBUG.DAT' MAY GET ENORMOUS.
C
NDEBUG = 0
C OPEN (8,FILE='DEBUG.DAT',STATUS='NEW')
C-----------------
NREAD = NIN
NWRITE = 9
OPEN (9,FILE='SCFS.DAT',STATUS='NEW',CARRIAGECONTROL='LIST')
NSPGR = 10
OPEN (10,FILE='SPGR.DAT',STATUS='UNKNOWN')
C
C STARTING POINT FOR RE-RUNS, GET CURRENT RUNTIME
C
10 TIME = SECOND(3)
C
NSYM = 0
MSYM = 48
NT = 1
TU(1,1) = 0.0
TU(2,1) = 0.0
TU(3,1) = 0.0
C
GLAT = ' '
GCENT = ' '
HMSYM = ' '
HALL = ' '
C
NSP = 0
MSP = 30
C
C CHECK IF 'SPGR.DAT' EXISTS IN CURRENT DIRECTORY
C
REWIND(NSPGR)
READ(NSPGR,1000,END=900) HLINE
1000 FORMAT(A80)
REWIND(NSPGR)
15 WRITE(NOUT,2010)
2010 FORMAT(/,'$ Enter Herman-Mauguin Space Group Symbol (or ): ')
READ(NIN,1000,ERR=20,END=20) HMSYM
IF (HMSYM.EQ.''.OR.HMSYM.EQ.'') GOTO 20
GOTO 30
20 HMSYM = ' '
30 WRITE(NOUT,2020)
HMS = HMSYM
2020 FORMAT(/,'$ Enter Hall Space Group Symbol (or ): ')
READ(NIN,1000,ERR=40,END=40) HALL
IF (HALL.EQ.''.OR.HALL.EQ.'') GOTO 40
GOTO 50
40 HALL = ' '
50 IF (HALL.EQ.' '.AND.HMSYM.EQ.' ') THEN
WRITE(NOUT,2030)
2030 FORMAT(//' Come on Buddy, enter at least one legal symbol',
1 ' !!!',///)
GOTO 15
ENDIF
C
C CONVERT INPUT TO CAPITAL LETTERS
C
IF (HALL.NE.' ') THEN
HMS = ' '
DO 45 I=1,15
IF (ICHAR(HALL(I:I)).LT.ICHAR('a').OR.ICHAR(HALL(I:I))
1 .GT.ICHAR('z')) GOTO 45
INP = ICHAR(HALL(I:I))-ICHAR('a')+ICHAR('A')
HALL(I:I) = CHAR(INP)
45 CONTINUE
ELSE
DO 55 I=1,24
IF (ICHAR(HMSYM(I:I)).LT.ICHAR('a').OR.ICHAR(HMSYM(I:I))
1 .GT.ICHAR('z')) GOTO 55
INP = ICHAR(HMSYM(I:I))-ICHAR('a')+ICHAR('A')
HMSYM(I:I) = CHAR(INP)
55 CONTINUE
ENDIF
WRITE(NOUT,2040)
2040 FORMAT(/,' Enter Space Group Number (as in International',
1 ' Tables',/,'$ for Crystallography) or 0 (zero): ')
READ(NIN,1010,ERR=60,END=60) NGROUP
1010 FORMAT(I5)
IF (NGROUP.LT.1.OR.NGROUP.GT.230) GOTO 60
GOTO 70
60 NGROUP = 0
C
C MAKE SURE THAT THE SYMBOLS ARE LEFT JUSTIFIED
C
70 IF (HMS .NE. ' ') THEN
DO 75 I=1,24
75 IF (HMSYM(I:I).NE.' ') GOTO 80
80 II = 24-I+1
IF (II.EQ.24) GOTO 100
HMSYM(1:II) = HMSYM(I:24)
HMSYM(II+1:24) = ' '
ELSE
DO 85 I=1,15
85 IF (HALL(I:I).NE.' ') GOTO 90
90 II = 15-I+1
IF (II.EQ.15) GOTO 100
HALL(1:II) = HALL(I:15)
HALL(II+1:15) = ' '
ENDIF
C
C READ 'HALL' AND/OR 'NGROUP' FROM 'NSPGR'
C
100 READ(NSPGR,1000,END=910) HLINE
IF (HALL.EQ.' ') THEN
IF (HMSYM(1:24).NE.HLINE(6:29)) GOTO 100
HALL(1:15) = HLINE(30:44)
ELSE
IF (HALL(1:15).NE.HLINE(30:44)) GOTO 100
HMSYM(1:24) = HLINE(6:29)
ENDIF
READ(HLINE(45:49),'(BZ,I5)') NGRP
IF (NGRP.EQ.0) GOTO 110
IF (NGROUP.NE.0.AND.NGROUP.NE.NGRP) THEN
WRITE(NOUT,2050) NGROUP,NGRP
2050 FORMAT(//,' ***** ERROR: Space Group Number given is:',i5,
1 //,13x,' Space Group Number found is:',i5,
2 //,13x,' Second number taken !!',//)
ENDIF
NGROUP = NGRP
C
C CALCULATE THE SYMMETRY OPERATORS
C
110 WRITE(NOUT,2060)
2060 FORMAT(//,' ----- Calculating the Symmetry Operators ...')
CALL SGHALL
IER = 0
CALL GRMULT(IER)
IF (IER.NE.0) GOTO 930
C
C CALCULATE AND SORT THE SPECIAL POSITIONS
C
WRITE(NOUT,2070)
2070 FORMAT(//,' ----- Calculating the Special Positions ...')
IER = 0
CALL SPOST(IER,NDEBUG)
IF (IER.NE.0) GOTO 920
WRITE(NOUT,2080)
2080 FORMAT(//,' ----- Sorting the Special Positions ...')
CALL SPESOR
CALL SPMULT
CALL SPSYM
C
C OK, ALL DONE. PRINT AND STORE RESULTS
C
CALL WSCFS
WRITE(NOUT,2100) NGROUP,HMSYM(1:15),HALL(1:15)
2100 FORMAT(20(/),' Space Group Number ',i5,/,
1 ' Hermann-Mauguin Symbol ',a15,/,
2 ' Hall Symbol ',a15,///,
3 '$ Hit to continue: ')
READ(NIN,1020,ERR=120,END=120) GDUM
1020 FORMAT(A1)
120 WRITE(NOUT,2110)
2110 FORMAT(///,' Symmetry Operators:',/)
LINC = 0
DO 130 I=1,NSYM
LINC = LINC+1
CALL CONXYZ(S(1,1,I),T(1,I),HBUF)
WRITE(NOUT,2120) I,HBUF
2120 FORMAT(1X,I5,5X,A30)
IF (LINC.EQ.20.OR.I.EQ.NSYM) THEN
WRITE(NOUT,2130)
2130 FORMAT(//,'$ Hit to continue: ')
READ(NIN,1020,ERR=140,END=140) GDUM
140 IF (I.NE.NSYM) WRITE(NOUT,2110)
LINC = 0
ENDIF
130 CONTINUE
WRITE(NOUT,2140)
2140 FORMAT(///,' Listing of Special Positions:',//,
1 ' Nr. Coordinates Multiplicity Site Symmetry',/)
LINC = 0
DO 150 I=1,NSP
LINC = LINC+1
CALL CONXYZ(SP(1,1,I),TP(1,I),HBUF)
WRITE(NOUT,2150) I,HBUF,MULTSP(I),GSYSP(2,I)
2150 FORMAT(1X,I4,3X,A21,5X,I3,11X,A8)
IF (LINC.EQ.18.OR.I.EQ.NSP) THEN
WRITE(NOUT,2130)
READ(NIN,1020,ERR=160,END=160) GDUM
160 IF (I.NE.NSP) WRITE(NOUT,2140)
LINC = 0
ENDIF
150 CONTINUE
TIME=SECOND(3)-TIME
WRITE(NOUT,2155) TIME
2155 FORMAT(//,' Elapsed CPU-Time: ',F7.2,' Seconds')
170 WRITE(NOUT,2160)
2160 FORMAT(/////,'$ Another Space Group to be done (Y/N): ')
READ(NIN,1020,ERR=180,END=180) GYN
IF (GYN.EQ.'Y'.OR.GYN.EQ.'y') GOTO 10
IF (GYN.EQ.'N'.OR.GYN.EQ.'n') GOTO 999
180 WRITE(NOUT,2170)
2170 FORMAT(//,' ****** INPUT ERROR ******* TRY AGAIN ******',//,
1 ' only YES (yes,Y,y) or NO (no,N,n) are valid')
GOTO 170
900 WRITE(NOUT,2200) NSPGR
2200 FORMAT(///,' ****** ERROR: File',i3,' empty ******',//,
1 ' ''SPGR.DAT'' must be in your current Directory !!',////)
GOTO 999
910 IF (HALL.NE.' ') THEN
IF(NGROUP.LE.1.OR.NGROUP.GT.230) NGROUP = 0
GOTO 110
ENDIF
WRITE(NOUT,2210) NSPGR
2210 FORMAT(///,' ****** ERROR: End-of-File in unit',i3,' ******')
IF (HMSYM.NE.' ') WRITE(NOUT,2220) 'Hermann-Mauguin',HMSYM
IF (HALL.NE.' ') WRITE(NOUT,2220) ' Hall',HALL
2220 FORMAT(//,2X,A15,' Symbol ',A15,' not found in ''SPGR.DAT'' ',
1 ////)
GOTO 170
920 WRITE(NOUT,2230) IER
2230 FORMAT(///,' ****** ERROR: Malfunction of Routine SPOST ******',
1 /,' Error number',i3,//,' Now you''re really',
2 ' screwed !!',//,' Try to DEBUG by yourself or call',
3 ' the author...',////)
GOTO 999
930 WRITE(NOUT,2240)
2240 FORMAT(///,' ****** ERROR: Your Space Group Symbol is probably',
1 ' incomplete',////)
GOTO 170
999 CLOSE(NSPGR)
CLOSE(NWRITE)
WRITE(NOUT,2300)
2300 FORMAT(/,' Your current Directory now contains a file SCFS.DAT',
1 /,' where above information is stored in Standard Crystal-',
2 /,' lographic File Structure (SCFS).',////)
STOP
END
C
C
C
C
SUBROUTINE SGHALL
*
*
* WRITTEN BY DAVID R. MOSSCROP (7901822)
* MAY-JUNE ; 1982.
*
* FROM AN ARTICLE AND PROGRAM: NEW SPACE GROUP NAMES.
* BY HALL 1982 REF:ACTA CRYST .A36, 517-523.
*
* CALLS SYMD, SYMXYZ
*
* THIS PROCEDURE USES THE HALL SPACE GROUP NAME TO GENERATE
* THE CORPSONDING MATRIX TRANSFORMATIONS.
C
C MODIFIED 84.2.14 BY I D BROWN TO ALLOW ORIGIN SHIFT
C UPDATED BY D. ALTERMATT
*
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
C
INTEGER OLD
INTEGER ROT(12,20)
INTEGER SMAT(16,50)
INTEGER SVEC(3)
DIMENSION ISHIFT(3),GCHR(30)
INTEGER TAB(3,9)
INTEGER VEC(3,8)
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
*
* VARIABLE DICTIONARY:
*
* GCENT IS CENTROSYMMETRIC FLAG (N OR C)
* GLAT IS LATTICE FLAG (P,R,A,B,C,I,F).
* IAXS IS CURRENT AXIS POINTER TO TAB.
* ISGN IS MATRIX SIGN FLAG.
* IROT IS CURRENT ORDER POINTER TO TAB.
* JAXS IS PREVIOUS AXIS POINTER TO TAB.
* JROT IS PREVIOUS ORDER POINTER TO TAB.
* NIN IS INPUT DEVICE NUMBER.
* NOUT IS OUTPUT DEVICE NUMBER.
* NSYM IS NUMBER OF EQUIVALENT POSITIONS.
* NGEN IS NUMBER OF GENERATED SEITZ MATRICES.
* NROT IS CURRENT ROTATION ORDER (1,2,3,4,6).
* NEW IS POSITION OF MATRIX PRODUCT.
* OLD IS MATRIX COUNT BEFORE INNER LOOP.
* ROT(12,20) IS TABLE OF ROTATION MATRICES.
* SMAT(16,50) IS SEITZ MATRIX ARRAY.
* SVEC(3) IS TEMPORARY T-VECTOR ARRAY.
* ISHIFT IS THE ORIGIN SHIFT
* TAB(3,9) POINTS TO ROT(AXIS,ORDER).
* VEC(3,8) IS THE T-VETORS FOR A,B,C,N,U,V,W,D.
*
******************************************************************
* LOADING INITIAL DATA
*
DATA ROT/
1 1,0,0,0, 0,1,0,0, 0,0,1,0,
2 1,0,0,0, 0,-1,0,0, 0,0,-1,0,
3 -1,0,0,0, 0,1,0,0, 0,0,-1,0,
4 -1,0,0,0, 0,-1,0,0, 0,0,1,0,
5 1,0,0,0, 0,0,1,0, 0,-1,-1,0,
6 -1,0,-1,0, 0,1,0,0, 1,0,0,0,
7 0,1,0,0, -1,-1,0,0, 0,0,1,0,
8 1,0,0,0, 0,0,1,0, 0,-1,0,0,
9 0,0,-1,0, 0,1,0,0, 1,0,0,0,
1 0,1,0,0, -1,0,0,0, 0,0,1,0,
2 1,0,0,0, 0,1,1,0, 0,-1,0,0,
3 0,0,-1,0, 0,1,0,0, 1,0,1,0,
4 1,1,0,0, -1,0,0,0, 0,0,1,0,
5 0,0,1,0, 1,0,0,0, 0,1,0,0,
6 -1,0,0,0, 0,0,-1,0, 0,-1,0,0,
7 0,0,-1,0, 0,-1,0,0, -1,0,0,0,
8 0,-1,0,0, -1,0,0,0, 0,0,-1,0,
9 -1,0,0,0, 0,0,1,0, 0,1,0,0,
1 0,0,1,0, 0,-1,0,0, 1,0,0,0, 0,1,0,0, 1,0,0,0, 0,0,-1,0/
*
DATA GCHR/'1','2','3','4','5','6','P','R','A','B','C','I','F',
1'N','U','V','W','D',' ','-','X','Y','Z','*','''','"','(','0','H',
2'H'/
*
DATA TAB/1,1,1,2,3,4,5,6,7,8,9,10,0,0,0,11,12,13,
1 14,14,14,15,16,17,18,19,20/
*
DATA VEC/6,0,0, 0,6,0, 0,0,6, 6,6,6,
1 3,0,0, 0,3,0, 0,0,3, 3,3,3/
*
* VARIABLE INITIALIZATION.
*
JCENT=0
GCENT=GCHR(14)
GLAT=' '
NGEN=1
NSYM=1
ISGN=12
NLT=1
*
NROT=0
LLTCODE=0
IROT=0
JROT=0
IAXS=0
JAXS=0
*
******************************************************************
* THE PROGRAM: SGHALL
*
* ARRAY INITIALIZATION.
*
*
* ZERO VECTOR ACCUMULATOR.
*
DO 1 I=1,3
SVEC(I)=0
TU(I,NLT)=0.0
1 CONTINUE
*
* SET THE (4,4) ELEMENT TO 1.0.
*
DO 2 I=1,50
SMAT(16,I)=12
SMAT(4,I)=0
SMAT(8,I)=0
SMAT(12,I)=0
2 CONTINUE
*
* SET ORIGIN SHIFT TO ZERO
*
DO 30 I=1,3
30 ISHIFT(I)=0
*
* SET IDENTITY ROTATIONS.
*
DO 3 I=1,12
SMAT(I,1)=ROT(I,1)*12
3 CONTINUE
*
* SET IDENTITY TRANSLATIONS.
*
DO 4 I=13,16
SMAT(I,1)=ROT(I-10,1)*12
4 CONTINUE
*
* CHECKING ELEMENT BY ELEMENT AND SET VARIABLES AS NEEDED.
*
DO 66 N=1,15
DO 6 M=1,29
IF (HALL(N:N).EQ.GCHR(M)) GO TO 606
6 CONTINUE
*
* ERROR CONDITION CHARACTER NOT IDENTIFIED.
*
WRITE(NOUT,1670) HALL(N:N),N
1670 FORMAT(' ++ERROR++SGHALL++1670++ ILLEGAL CHARACTER: ',A1,
1 ' IN COLUMN ',I1)
*
* SKIP INACTIVE BLANKS.
*
606 IF ((M.EQ.19).AND.(NROT.EQ.0)) GO TO 66
C
C BLANK INITIATES CONSTRUCTION OF SYMMETRY GENERATOR
C
IF ( M.EQ.19 ) GO TO 1011
C
C PARENTHESIS INITIATES READING OF ORIGIN SHIFT
C
IF(M.EQ.27) GO TO 40
*
*
* SET GCENT AND GLAT, DEPENDENT ON FIRST ELEMENT(S).
*
IF ( LLTCODE .NE. 0) GO TO 1000
*
* FIRST NEGATIVE SIGN INDICATES CENTRE.
*
IF (M .NE. 20) GO TO 1001
JCENT=1
GCENT=GCHR(11)
GO TO 66
*
* ALLOWED CHARACTERS: P,R,A,B,C,I,F TO SET LTCODE.
*
1001 IF ((M .GE. 7).AND.(M .LE.13)) GO TO 2000
WRITE(NOUT,1600) GCHR(M)
1600 FORMAT(' ++ERROR++SGHALL++1600++ UNRECOGNISED LATTICE TYPE ',
1 A1)
GO TO 150
2000 CONTINUE
LLTCODE=M-6
GLAT=GCHR(M)
*
* SPACE GROUPS WITH NAMES 'R' TYPE ARE ASSIGNED
* GLAT 'H' FOR A HEXAGONAL SETTING. THIS IS A
* LOCAL CONVENTION.
*
IF ( M .EQ. 8 ) GLAT=GCHR(30)
*
* ADD CENTERING TRANSLATIONS TO =TU=
*
IF(GLAT.EQ.'P') GOTO 660
IF(GLAT.EQ.'I') THEN
NLT=NLT+1
DO 60 I=1,3
60 TU(I,NLT)=0.5
GOTO 660
ENDIF
IF(GLAT.EQ.'A'.OR.GLAT.EQ.'F') THEN
NLT=NLT+1
TU(1,NLT)=0.0
TU(2,NLT)=0.5
TU(3,NLT)=0.5
IF(GLAT.EQ.'A') GOTO 660
ENDIF
IF(GLAT.EQ.'B'.OR.GLAT.EQ.'F') THEN
NLT=NLT+1
TU(1,NLT)=0.5
TU(2,NLT)=0.0
TU(3,NLT)=0.5
IF(GLAT.EQ.'B') GOTO 660
ENDIF
IF(GLAT.EQ.'C'.OR.GLAT.EQ.'F') THEN
NLT=NLT+1
TU(1,NLT)=0.5
TU(2,NLT)=0.5
TU(3,NLT)=0.0
GOTO 660
ENDIF
IF(GLAT.EQ.'H') THEN
NLT=NLT+1
TU(1,NLT)=0.3333333
TU(2,NLT)=0.6666667
TU(3,NLT)=0.6666667
NLT=NLT+1
TU(1,NLT)=0.6666667
TU(2,NLT)=0.3333333
TU(3,NLT)=0.3333333
ENDIF
660 IF(NDEBUG.NE.0) WRITE(NDEBUG,2020) ((TU(I1,I2),I1=1,3),I2=1,NLT)
2020 FORMAT(/,' ++DEBUG++SGHALL++2020++ TU(3,NLT)',4(/,26X,3F5.2))
GOTO 66
*
* IF CHARACTER IS A NEGATIVE SIGN, SET ISGN TO NEGATIVE,
* OTHERWISE POSITIVE. THE LATER NEGATIVE SIGNS INDICATE
* INVERSIONS.
*
1000 IF (M.NE.20) GO TO 999
ISGN=-12
GO TO 66
*
* ROTATION MUST FOLLOW LATTICE TYPE.
*
*
* IF ROTATION AXIS ALREADY SET GO TO 1003.
*
999 IF (NROT .NE. 0) GO TO 1003
IF (M .LE.6) GO TO 2011
WRITE(NOUT,2010) GCHR(M)
2010 FORMAT(' ++ERROR++SGHALL++2010++ ILLEGAL ROTATION CHARACTER '
1 ,A1)
GO TO 150
2011 CONTINUE
*
* SET ROTATION AXIS IN NROT.
*
IF ((M .EQ. 1) .AND. (ISGN .LT.0)) NSYM=NSYM*2
NROT=M
IROT=M
IF ((M.NE.1).OR.(ISGN.LT.0)) NGEN=NGEN+1
IF(NGEN.LE.MSYM) GO TO 1005
WRITE(NOUT,1501)
1501 FORMAT(' ++ERROR++SGHALL++1501++ NGEN GREATER THAN MSYM.')
NSYM=0
RETURN
*
*********** SELECT AXIS EXPLICILY **************
*
* IF CHARACTER DOES NOT SET AXIS GO TO 1005.
*
1003 IF (M .LE. 20) GO TO 1009
IAXS=M-20
GO TO 1004
*
* SET AXIS IMPLICITLY.
*
*
* IF DEFAULT AXIS NOT REQUIRED GO TO 1004.
*
1005 CONTINUE
*
* FIRST AXIS ASSUMED Z.
*
IF ((NGEN .NE.2).AND.(IROT .NE.1)) GO TO 1006
IAXS=3
GO TO 1004
*
* SECOND AXIS ASSUMED X IF NROT=2 AND PREVIOUS AXIS WAS 2 OR 4.
*
1006 IF ((NROT .NE.2) .OR. (JROT .NE.2)) GO TO 1007
IAXS=1
GO TO 1004
*
* AXIS AFTER 3,6 ASSUMED AS X-Y.
*
1007 IF (( NROT .NE.2) .OR.(JROT .NE.3)) GO TO 1008
IAXS=5
GO TO 1004
1008 IF (NROT .EQ.3) GO TO 2500
WRITE(NOUT,1639)
1639 FORMAT(' ++ERROR++SGHALL++1639++ UNABLE TO ASSIGN IMPLICIT ',
1 'AXIS.')
GO TO 150
2500 IAXS=4
*
*
* FOR NON-PRINCIPAL AXES.
*
1004 IF (IAXS .LE.3) GO TO 66
IROT=IAXS+3
IAXS=JAXS
IF((IAXS.EQ.0).AND.(IROT.EQ.7))IAXS=1
GO TO 66
*
********** SPECIFY TRANSLATION ***********
*
*
* ONLY FOR X,Y,Z DIRECTIONS.
*
1009 IF(M .GT. 6) GO TO 1010
IF (IROT .GT.M) GO TO 2510
WRITE(NOUT,1660) GCHR(M)
1660 FORMAT(' ++ERROR++SGHALL++1660++ ILLEGAL SCREW AXIS SYMBOL ',
1 A1)
GO TO 150
2510 CONTINUE
*
* CALCULATE TRANSLATIONS IN 12 THS.
*
SVEC(IAXS)=SVEC(IAXS)+M*12/NROT
*
* TEST FOR A,B,C,N,U,V,W,D.
*
1010 IF(((M.LE.8).OR.(M.GE.12)).AND.((M.LE.13).OR.(M.GE.19)))GOTO1011
IF (M .GE. 12) GO TO 1111
I=M-8
GO TO 1112
1111 I=M-10
1112 DO 7 J=1,3
SVEC(J)=SVEC(J)+VEC(J,I)
7 CONTINUE
GO TO 66
*
* CONSTRUCT GENERATOR WHEN BLANK IS REACHED.
*
1011 IF (M .NE.19) GO TO 66
*
* POINT TO ROTATION MATIX.
*
K=TAB(IAXS,IROT)
DO 8 I=1,12
SMAT(I,NGEN)=ROT(I,K)*ISGN
8 CONTINUE
DO 9 I=13,15
*
* DEPOSIT TRANSLATON BASE 12.
*
SMAT(I,NGEN)=MOD(SVEC(I-12)+120,12)
9 CONTINUE
*
* CALCULATE THE NUMBER OF EQUIVALENT POSITIONS.
*
NSYM=NSYM*NROT
IF (NROT .GT. 3) NROT=NROT/2
*
* RESET ORDER FLAGS AND AXIS FLAGS.
*
JROT=NROT
NROT=0
IROT=0
JAXS=IAXS
IAXS=0
ISGN=12
*
* ZERO VECTOR ACCUMULATOR.
*
DO 10 I=1,3
SVEC(I)=0
10 CONTINUE
*
IF(HALL(N:N+1).EQ.' ') GOTO 666
GO TO 66
C
C READ ORIGIN SHIFT
C
40 IAX=0
NN=N
41 ISIGN=1
IAX=IAX+1
IF(IAX.GT.3) GO TO 666
42 NN=NN+1
DO 45 M=1,29
45 IF(HALL(NN:NN).EQ.GCHR(M)) GO TO 47
WRITE(NOUT,1670) HALL(NN:NN),NN
GO TO 150
47 IF(M.EQ.20) THEN
ISIGN=-1
GO TO 42
ENDIF
IF(M.EQ.28) THEN
ISHIFT(IAX)=0
GO TO 41
ENDIF
IF(M.LE.6) THEN
ISHIFT(IAX)=ISIGN*M
GO TO 41
ENDIF
IF(M.EQ.29) GO TO 666
WRITE(NOUT,200) HALL(NN:NN),NN
NSYM=0
RETURN
66 CONTINUE
666 CONTINUE
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,1666) GLAT,NROT,ISHIFT
DO 667 I=1,NGEN
WRITE(NDEBUG,1667) (SMAT(J,I),J=1,16)
667 CONTINUE
1666 FORMAT(' ++DEBUG++SGHALL++1666++ LATCODE=',A1,' NROT=',I3,
1 ' ISHIFT=',3I4)
1667 FORMAT(10X,16I4)
ENDIF
*
* END OF INPUT DATA (HALL SPACE GROUP NAME) EVALUATION LOOPS.
*
* CHECK FOR ERROR CONDITION.
*
IF ((NROT .LE.0).AND.(LLTCODE .NE.0)) GO TO 151
150 CONTINUE
*
* ERROR CONDITION.
*
WRITE(NOUT,200) HALL(N:N),N,NROT,LLTCODE,GLAT,GCENT
200 FORMAT (' ++DEBUG++SGHALL++200++ ILLEGAL CONSTRUCTION AT',
1 ' CHARACTER ',A1,' IN COL.',I3,/,25X,'NROT =',I3,
1 ', LLTCODE =',I3,', GLAT = ',A1,', GCENT = ',A1,/)
NSYM=0
RETURN
151 CONTINUE
*
*
*GENERATE MATRICES BY PROGRESSIVE BINARY PRODUCTS.
*
*
*
* SKIP GENERATOR IF P1 OR -P1.
*
IF (NGEN .LE.1) GO TO 117
M=2
723 IF(M.LE.NGEN) GO TO 273
GO TO 105
*
* SAVE CURRENT MATRIX COUNT.
*
273 OLD=NGEN
N=M
724 IF(N.LE.NGEN) GO TO 274
GO TO 11
*
* POINT TO GENERATED MATRIX IN SMAT.
*
274 NEW=NGEN+1
*
DO 13 I=1,3
DO 131 J=1,13,4
131 SMAT(I+J-1,NEW)=((SMAT(I,M)*SMAT(J,N))+(SMAT(I+4,M)*SMAT(J+1,N))+
1 (SMAT(I+8,M)*SMAT(J+2,N))+(SMAT(I+12,M)*SMAT(J+3,N)))/12
SMAT(I+12,NEW)=MOD(SMAT(I+12,NEW)+120,12)
13 CONTINUE
*
* IS MATRIX UNIQUE?
*
LFLAG=1
DO 14 L=1,NGEN
DO 103 I=1,12
103 IF (SMAT(I,L).NE.SMAT(I,NEW)) GO TO 1674
IF (LLTCODE .NE. 1) GO TO 251
DO 15 II=13,16
IF (SMAT(II,L) .EQ. SMAT(II,NEW)) GO TO 15
*
* ERROR CONDITION FOUND.
*
WRITE (NOUT,300)
300 FORMAT('++SGHALL++ERROR: MATRICES RELATED BY PURE TRANSLATION.')
NSYM=0
RETURN
15 CONTINUE
*
GO TO 251
*
1674 DO 16 J=1,12
16 IF (SMAT(J,L) .NE. SMAT(J,NEW)) GO TO 20
*
* ERROR CONDITION NOT AVOIDED ( IE NOT SKIPPED OVER).
*
WRITE(NOUT,400)
400 FORMAT('++SGHALL++ERROR: SOME MATRICES RELATED BY INVERSION.')
NSYM=0
RETURN
*
20 CONTINUE
LFLAG=LFLAG+1
14 CONTINUE
251 IF (LFLAG .GT. NGEN) NGEN=NEW
N=N+1
GO TO 724
11 IF ((NGEN.EQ.OLD).AND.(NGEN.GE. NSYM)) GO TO 105
M=M+1
GO TO 723
105 CONTINUE
*
*
* SORT ON ZERO PATTERN.
*
DO 17 N=2,NGEN
DO 18 L=N,NGEN
DO 181 K=1,12
*
* EXIST ON ZERO MISMATCH.
*
181 IF((SMAT(K,N-1).EQ.0).AND.(SMAT(K,L).NE.0))GO TO 18
GO TO 1171
18 CONTINUE
GO TO 17
*
*
* EXCHANGE SORTED ELEMENTS.
*
1171 DO 19 K=1,16
I=SMAT(K,L)
SMAT(K,L)=SMAT(K,N)
SMAT(K,N)=I
19 CONTINUE
*
17 CONTINUE
117 CONTINUE
*
* ERROR CHECK OF NGEN RELATIVE TO NSYM.
*
IF (NGEN .LE. NSYM) GO TO 1013
WRITE(NOUT,500) NGEN,NSYM
500 FORMAT('++SGHALL++ERROR: ',I5,' MATRICES GENERATED,',I5,
1 ' EXPECTED')
NSYM=0
*
* THE FOLLOWING LOOPS ENTERS THE VALUES OF SMAT(16,48),
* WHICH IS THE ARRAY USED IN THIS ROUTINE TO STORE THE
* ROTATION AND TRANSLATION MATRICES, INTO TWO COMPARABLE
* ARRAYS S(3,3,48) AND T(3,48) WHICH ARE USED IN OTHER
* ROUTIES EXTERNAL TO SGHALL.
*
1013 DO 7775 M=1,48
DO 7775 J=1,3
DO 7775 I=1,3
K=4*(J-1)+I
*
* REAL DIVISION BY ZERO IS NEEDED TO CONVERT THE 12 THS
* USED IN SGHALL INTO ROTATIONS AND TRANSLATIONS
* UNDERSTANDABLE TO ROUTINE WHICH USE S(3,3,48) AND T(3,48).
* THE VALUES IN S AND T ARE NOW 1 OR DECIMAL FRACTIONS.
*
S(I,J,M)=SMAT(K,M)/12.0
T(I,M)=SMAT(I+12,M)/12.0
7775 CONTINUE
C
C ADD ORIGIN SHIFT
C
DO 7780 M=1,48
DO 7777 I=1,3
IF(S(I,I,M).LT.-0.001) THEN
T(I,M)=T(I,M)+ISHIFT(I)/6.0
IF(T(I,M).GT.0.99) T(I,M)=T(I,M)-1.0
IF(T(I,M).LT.-0.01) T(I,M)=T(I,M)+1.0
ENDIF
7777 CONTINUE
7780 CONTINUE
IF(GCENT.EQ.GCHR(11)) CALL SYMD(S,T,NSYM,MSYM)
IF(NDEBUG.NE.0) THEN
NOUT1=NOUT
NOUT=NDEBUG
CALL SYMXYZ (NSYM,S,T)
NOUT=NOUT1
ENDIF
RETURN
END
C
C
C
C
SUBROUTINE SYMD(S,T,NSYM,MSYM)
C
C *****SUBROUTINE***** SYMD
C ----
C
C WRITTEN 80.6.1 BY DOUG THIERS
C
C SUBROUTINE TO DOUBLE THE NUMBER OF SYM.OP.S FOR CENTROSYMETRIC S.G.S
C
DIMENSION S(3,3,MSYM),T(3,MSYM)
COMMON/FILES/NIN,NOUT,NDEBUG,NREAD,NWRITE,NSPGP
DO 5 I=1,NSYM
IF(NSYM+I.LE.MSYM) GOTO 10
WRITE(NOUT,100)
100 FORMAT(40H ERROR IN SUBROUTINE:SYMD.MORE SYM OP.S
1 ,40HCALCULATED THAN ALLOWED(48). )
RETURN
10 DO 15 J=1,3
DO 25 K=1,3
25 S(J,K,NSYM+I)=-S(J,K,I)
15 T(J,NSYM+I)=T(J,I)
5 CONTINUE
NSYM=2*NSYM
RETURN
C** THIS PROGRAM VALID ON FTN4 AND FTN5 **
END
C
C
C
C
SUBROUTINE SYMXYZ(NSYM,S,T)
*
* WRITTEN BY DAVID R. MOSSCROP (7901822)
* MAY-JUNE ; 1982.
C 84.6.12 D. ALTERMATT
C
* FROM AN ARTICLE AND PROGRAM: NEW SPACE GROUP NAMES.
* BY HALL 1982 REF:ACTA CRYST .A36, 517-523.
*
* CALLS INTEGER
*
* THIS SUBROUTINE PRINTS OUT THE SPACE GROUP TRANSFORMATIONS
* IN FAMILIAR X,Y,Z COORDINATES.
*
*
* TRANS IS A ONE DIMENSIONAL ARRAY OF 30 ELEMENTS
* IN TRANS ONE TRANSFORMATION IS STORED BEFORE
* BEING PRINTED OUT IN XYZ FORM.
*
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
*
INTEGER TRANS(30),INUM(7),CHR(26)
INTEGER SMAT(16,48)
INTEGER BLNK,COMA,OVER,PLUS,SUBT
DIMENSION S(3,3,NSYM), T(3,NSYM)
COMMON /FILES/ NIN,NOUT
COMMON /GSYM/ GLAT,GCENT,HMSYM,HALL
DATA BLNK,COMA,PLUS,SUBT,OVER/1H ,1H,,1H+,1H-,1H//
DATA INUM/1H1,1H2,1H3,1H5,1H3,1H4,1H6/
DATA CHR/1H1,1H2,1H3,1H4,1H5,1H6,1HP,1HR,1HA,1HB,1HC,1HI,1HF,
1 1HN,1HU,1HV,1HW,1HD,1H ,1H-,1HX,1HY,1HZ,1H*,1H',1H"/
*
* IN THIS ROUTINE NGEN IS EQUAL TO NSYM.
*
IF (NSYM .GT. 0) GO TO 1021
WRITE(NOUT,*)' NOTHING TO PRINT.'
RETURN
*
* EXTERNALLY THE ROTATIONS AND TRANSLATIONS ARE STORED AND
* MANIPULATED IN ARRAYS S(3,3,48) AND T(3,48) RESPECTIVELY.
* IN SYMXYZ ( THIS ROUTINE ) THE ARRAY SMAT(16,48) SERVES
* AS STORAGE FOR BOTH THE ROTATIONS AND TRANSLATIONS.
*
1021 DO 7775 M=1,NSYM
DO 7775 J=1,3
DO 7775 I=1,3
K=4*(J-1)+I
SMAT(K,M)=INTEGER((S(I,J,M)*12),0)
*
* MULTIPLICATION BY 12 IS NECESSARY TO CHANGE THE DECIMAL
* FRACTIONS OF S(3,3,48) AND T(3,48) INTO THE 12 THS
* WHICH THIS ROUTINE REQUIRES.
* 12 THS ARE USED BECAUSE THE TRANSLATION FRACTIONS
* (1/4, 1/3, 3/4, 1/2, 1/6, 5/6 ETC) ALL ARE NICE, IE EVEN
* MULTIPLIES OF 12.
*
SMAT(I+12,M)=INTEGER((T(I,M)*12),0)
7775 CONTINUE
*
* PRINT HALL SPACE GROUP SYMBOL.
*
WRITE(NOUT,100) HALL
100 FORMAT(' HALL SPACE GROUP SYMBOL = ',A15)
*
WRITE(NOUT,105)
105 FORMAT(' ')
WRITE(NOUT,110)
110 FORMAT(' SYMMETRY OPERATORS ')
DO 20 M=1,NSYM
*
* PRESET ARRAY TRANS TO BLANKS.
*
DO 21 I=1,30
TRANS(I)=BLNK
21 CONTINUE
N=1
*
* EXTRACT TRANSLATIONAL ELEMENTS.
*
DO 22 L=1,3
J=SMAT(L+12,M)
C
C SPECIAL POSITION WITH COORDINATE(S) '0'
C
NSUM=IABS(SMAT(4*L-3,M))+IABS(SMAT(4*L-2,M))+IABS(SMAT(4*L-1,M))
1 +IABS(J)
IF(NSUM.EQ.0) THEN
TRANS(N)=1H0
N=N+1
ENDIF
IF (J.LE.0) GO TO 1017
*
* SET THE NUMERATOR AS ONE (1).
*
IF (J.GE.8) GO TO 1014
TRANS(N)=INUM(1)
GO TO 1015
*
* SET NUMERATOR AS 2, 3 OR 5.
*
1014 TRANS(N)=INUM(J-6)
*
* INSERT SLASH INTO FRACTION.
*
1015 TRANS(N+1)=OVER
*
* POINT TO DENOMINATOR CODE.
*
I=IABS(6-J)
IF (J.NE.6) GO TO 1016
*
* SET DENOMINATOR AS TWO (2)
*
TRANS(N+2)=INUM(2)
GO TO 1020
*
* SET DENOMINTATOR AS 3, 4 OR 6
1016 TRANS(N+2)=INUM(I+3)
1020 N=N+3
1017 DO 23 K=1,3
J=L+(K-1)*4
J=SMAT(J,M)
IF (J.EQ.0) GO TO 23
IF (J.LE.0) GO TO 1018
*
* INSERT PLUS SIGN.
*
TRANS(N)=PLUS
GO TO 1019
*
* INSERT NEGATIVE SIGN.
*
1018 TRANS(N)=SUBT
*
* INSERT X, Y, OR Z.
*
1019 TRANS(N+1)=CHR(K+20)
N=N+2
23 CONTINUE
*
* SEPARATE WITH COMMA.
*
TRANS(N)=COMA
N=N+1
22 CONTINUE
*
* REMOVE THE LAST COMMA FROM THE OUTPUT.
*
TRANS(N-1)=BLNK
*
* LIST SYMMETRY AS X,Y,Z.
*
WRITE(NOUT,700)M,TRANS
700 FORMAT(3X,I3,5X,30A1)
20 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE GRMULT(IER)
C -----------------
C
C WRITTEN 84.1.13 BY I.D.BROWN
C
C CALLS MXM AND ICOMMA
C
C***** CALLS TIME-FUNCTION =SECOND(I)=
C
C THIS ROUTINE CALCULATES THE POINT GROUP MULTIPLICATION TABLE "MULT"
C FROM THE ARRAY "S" IN /SYM/
C
COMMON /FILES/ NIN,NOUT,NDEBUG
COMMON /SYM/ NSYM,MSYM,S(3,3,48)
COMMON /SYMA/ MULT(48,48),IT(3,48),NSP,MSP,ISPTAB(48,30)
C
DIMENSION SS(3,3)
C
IER=0
DO 200 I=1,NSYM
DO 150 J=1,NSYM
CALL MXM(SS,S(1,1,J),S(1,1,I),3)
DO 100 K=1,NSYM
IF(ICOMMA(S(1,1,K),SS,3,2).EQ.0) THEN
MULT(I,J)=K
GO TO 150
ENDIF
100 CONTINUE
WRITE(NOUT,1000) I,J
1000 FORMAT(' ++ERROR++GRMULT++1000++ NO MATCH FOR PRODUCT OF'
+ ,' SYMMETRY OPERATORS ',2I3)
IF(NDEBUG.NE.0) WRITE(NDEBUG,1001) SS
1001 FORMAT(' ++DEBUG++GRMULT++1001++ ',9F6.2)
IER=1
RETURN
150 CONTINUE
200 CONTINUE
IF(NDEBUG.NE.0) THEN
WRITE(NDEBUG,1200) SECOND(3)
1200 FORMAT(' ++DEBUG++GRMULT++1200++(',F6.2,') GROUP ',
+ 'MULTIPLICATION TABLE')
DO 220 I=1,NSYM
220 WRITE(NDEBUG,1201) (MULT(I,J),J=1,NSYM)
1201 FORMAT(5X,40I3,/,10X,8I3)
ENDIF
RETURN
END
C
C
C
C
SUBROUTINE SYMOP(Y,S,T,X)
C ----------------
C
C WRITTEN 84.2.8 BY I D BROWN
C
C APPLIES THE SEITZ MATRIX S:T TO X TO GIVE Y
C
DIMENSION X(3),Y(3),S(3,3),T(3)
DO 50 I=1,3
Y(I)=0.
DO 20 J=1,3
20 Y(I)=Y(I)+S(I,J)*X(J)
Y(I)=Y(I)+T(I)
50 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE SYMULT(S3,T3,S2,T2,S1,T1)
C -----------------
C
C WRITTEN 84.2.8 BY I D BROWN
C
C CALLS MXM, MXV, VPLUSV
C
C CALCULATES (S/T)3=(S/T)2*(S/T)1
C
DIMENSION S1(3,3),S2(3,3),S3(3,3),T1(3),T2(3),T3(3),T4(3)
CALL MXM(S3,S2,S1,3)
CALL MXV(T4,S2,T1)
CALL VPLUSV(T3,T4,T2)
RETURN
END
*
*
*
*
SUBROUTINE WSCFS
*
* JULY 20-24 82 BY DAVID R. MOSSCROP / 84.6.5 D. ALTERMATT
* / 86.7.11 N. HEINIG /
*
* REDUCED TO SYMMETRY INFORMATIONS FOR =GETSPEC=
*
* CALLS INTEGER, INCREA
*
* THIS SUBROUTINE PRINTS THE COMMON BLOCK CONTENTS IN STANDARD
* FORMAT, AS DESCRIBED IN " THE STANDARD CRYSTALLOGRAPHIC FILE
* STRUCTURE" BY I. D. BROWN.(ACTA CRYST (1983) A39, 216-224).
*
*
IMPLICIT CHARACTER*8 (G)
IMPLICIT CHARACTER*80 (H)
*
COMMON /FILES/ NIN,NOUT,NDEBUG,NREAD,NWRITE,NSPGP
COMMON /SYM/ NSYM,MSYM,S(3,3,48),T(3,48)
COMMON /GSYM/ GLAT,GCENT,HMSYM,HALL,GSYSP(2,30)
COMMON /SYMA/ MULT(48,48),IT(3,48),NSPE,MSPE,ISPTAB(48,30),
1 MUSP(30),SP(3,3,30),TSP(3,30)
*
* TITLE SECTION
*
WRITE(NWRITE,1000) HALL,HALL
1000 FORMAT(//,'TITLE ',/,'* Symmetry Operators and Special ',
1 'Positions for ',A15,5X,A8,/)
*
* CHECK FOR SPACE GROUP SYMBOL(S), EITHER HALL AND/OR HERMANN-MAUGUIN.
* FIRST CHECK IF BOTH ARE PRESENT.
*
IF(HALL(1:7).NE.' '.OR. HMSYM(1:7).NE.' '
* .OR. GLAT.NE.' ' .OR. GCENT.NE.' ') THEN
WRITE(NWRITE, 1040)
1040 FORMAT('SG NAME')
*
* AT LEAST ONE PRESENT
*
IF(HALL(1:8).NE.' ') WRITE(NWRITE,1060) HALL
1060 FORMAT(1X,'HALL',5X,A24)
IF(HMSYM(1:8).NE.' ') WRITE(NWRITE,1065) HMSYM
1065 FORMAT(1X,'HERM',5X,A24)
IF(GLAT.NE.' ' .OR. GCENT.NE.' ') WRITE(NWRITE,1070)GCENT,GLAT
1070 FORMAT(1X,'LATT',5X,A1,A1)
WRITE(NWRITE,1050)
1050 FORMAT('*EOS',/)
ENDIF
*
* CHECK FOR SYMMETRY OPERATORS.
*
IF(NSYM.NE.0) THEN
WRITE(NWRITE,1080)
1080 FORMAT('SYMMETRY')
CALL INCREA
*
* CHECK FOR SPECIAL POSITION OPERATORS
*
IF(NSPE.NE.0) THEN
WRITE(NWRITE,1095)(((INTEGER(SP(I,J,K),0),J=1,3),TSP(I,K),
* I=1,3), K , MUSP(K),K=1,NSPE)
1095 FORMAT((1X,'SPOS',5X,2(3I2,F10.7,4X),3I2,F10.7,I3,I2))
ENDIF
WRITE(NWRITE,1050)
ENDIF
*
* WRITE 'END' CARD
*
WRITE(NWRITE,2000)
2000 FORMAT('END',//)
RETURN
END
c
c
c
c
SUBROUTINE INCREA
C
C ****SUBROUTINE**** INCREA
C ------
C WRITTEN 86/06/05 BY NINA HEINIG
C
C WRITES OUT SYMMETRY TABLE
C
IMPLICIT CHARACTER*8 (G)
C
COMMON /SYM/ NSYM,MSYM,S(3,3,48),T(3,48),NLT,TU(3,4),GSYM
COMMON /FILES/ NIN,NOUT,NDEBUG,NREAD,NWRITE,NSPGP
COMMON /GSYM/ GLAT,GCENT
C
IF(NDEBUG .NE. 0) WRITE(NDEBUG, 2000)NSYM,NLT,TU
2000 FORMAT(' *DEBUG**INCREA*2000 NSYM,NLT,TU:',2I4,4(/,1X,3F5.0))
DO 10 K=1,NSYM
WRITE(NWRITE,1000)((INTEGER(S(I,J,K),0),J=1,3),T(I,K),I=1,3),K
1000 FORMAT(1X,'SYOP',5X,2(3I2,F10.7,4X),3I2,F10.7,I3)
10 CONTINUE
RETURN
END
c
c
c
c
subroutine conxyz(sp,tp,hbuf)
c
c written by D. Altermatt
c McMaster University, Nov. 1984
c
c calls integer
c
c for a given operator (sp/tp) this subroutine constructs the
c general representation with x,y,z as in the International
c Tables for Crystallograpy and as required by DLS
c
implicit character*80 (h)
character*8 g1(12),g2(12),g3(12),g4(12)
c
dimension sp(3,3),tp(3)
data g1/'1/8','1/4','3/8','1/2','5/8','3/4','7/8','1',4*' '/
data g2/'1/12','1/6','1/4','1/3','5/12','1/2','7/12','2/3',
1 '3/4','5/6','11/12','1'/
data g3/'9/8','5/4','11/8','3/2','13/8','7/4','15/8','2',4*' '/
data g4/'13/12','7/6','5/4','4/3','17/12','3/2','19/12','5/3',
1 '7/4','11/6','23/12','2'/
c
hline=' '
do 10 i=1,3
j=(i-1)*17+1
if((abs(sp(i,1))+abs(sp(i,2))+abs(sp(i,3))+abs(tp(i))).lt.
1 0.01) then
c -- i-th coordinate 0
hline(j:j)='0'
if(i.ne.3) hline(j+1:j+1)=','
goto 10
endif
if(integer(sp(i,1),0).eq.0) goto 20
c -- X-component
hline(j+1:j+1)='X'
if(sp(i,1).gt.1.01) hline(j:j)='2'
if(sp(i,1).lt.-0.1) hline(j:j)='-'
20 if(integer(sp(i,2),0).eq.0) goto 30
c -- Y-component
hline(j+4:j+4)='Y'
if(sp(i,2).gt.1.01) hline(j+3:j+3)='2'
if(sp(i,2).lt.-0.1) hline(j+2:j+2)='-'
if(hline(j+1:j+2).eq.'X ') hline(j+2:j+2)='+'
30 if(integer(sp(i,3),0).eq.0) goto 40
c -- Z-component
hline(j+7:j+7)='Z'
if(sp(i,3).gt.1.01) hline(j+6:j+6)='2'
if(sp(i,3).lt.-0.1) hline(j+5:j+5)='-'
if(hline(j+5:j+5).eq.' '.and.hline(j:j+4).ne.' ')
1 hline(j+5:j+5)='+'
40 if(integer(tp(i),3).eq.0) goto 50
c -- translation
if(hline(j:j+7).ne.' ') hline(j+8:j+8)='+'
if(tp(i).lt.-0.1) hline(j+8:j+8)='-'
do 45 k=1,12
xk=k
k1=k*125
k2=integer((xk*83.33),0)
if(iabs(integer(tp(i),3)).eq.k1)
1 hline(j+9:j+14)=g1(k)(1:6)
if(iabs(integer(tp(i),3)).eq.(k1+1000))
1 hline(j+9:j+14)=g3(k)(1:6)
if(iabs(integer(tp(i),3)).eq.k2)
1 hline(j+9:j+14)=g2(k)(1:6)
if(iabs(integer(tp(i),3)).eq.(k2+1000))
1 hline(j+9:j+14)=g4(k)(1:6)
45 continue
50 if(i.ne.3) hline(j+15:j+15)=','
10 continue
c
c remove blanks, store in hbuf
c
hbuf=' '
j=1
do 100 i=1,80
if(hline(i:i).eq.' ') goto 100
hbuf(j:j)=hline(i:i)
j=j+1
100 continue
return
end
C
C
C
SUBROUTINE MMINM(C,A,B,N)
C -------------------------
C
C WRITTEN 84.1.25 BY I.D.BROWN
C
C CALCULATES C(N,N)=A(N,N)-B(N,N)
C
DIMENSION A(N,N),B(N,N),C(N,N)
DO 50 I=1,N
DO 50 J=1,N
50 C(I,J)=A(I,J)-B(I,J)
RETURN
END
*
*
*
*
SUBROUTINE MXM (C,A,B,N)
*---- CALCULATES THE MATRIX PRODUCT FOR N*N MATRICES AS
* A * B = C
*
* A, B INPUT MATRICES
* C OUTPUT MATRIX
* N ORDER OF MATRICES
*
* WRITTEN BY D. ALTERMATT
*---- MCMASTER UNIVERSITY, DAWN OF ORWELL'S YEAR
DIMENSION A(N,N),B(N,N),C(N,N)
DO 10 I=1,N
DO 20 K=1,N
C(I,K)=0
DO 30 J=1,N
C(I,K)=C(I,K)+A(I,J)*B(J,K)
30 CONTINUE
20 CONTINUE
10 CONTINUE
RETURN
END
C
C
C
C
SUBROUTINE MXV(VPROD,SM,V)
C
C *****SUBROUTINE***** MXV
C ---
C
C WRITTEN 83.9.7 BY I D BROWN
C
C CALCULATES VPROD(3) = SM(3,3)*V(3)
C
DIMENSION VPROD(3),SM(3,3),V(3)
DO 50 I=1,3
VPROD(I) = 0
DO 50 J=1,3
50 VPROD(I) = VPROD(I) + SM(I,J)*V(J)
RETURN
END
*
*
*
*
*
FUNCTION ICOMMA (A,B,N,ID)
*---- COMPARES TWO N*N MATRICES, GIVES ICOMMAT=0 IF THEY
* ARE EQUIVALENT WITHIN ID DECIMAL PLACES, ELSE ICOMMAT=1
*
* CALLS INTEGER
*
* A, B MATRICES TO CHECK
* N ORDER OF MATRICES
* ID NUMBER OF DECIMAL PLACES TO CHECK
*
* WRITTEN BY D. ALTERMATT
* MODIFIED 84.5.16 BY I D BROWN
*---- MCMASTER UNIVERSITY, DAWN OF ORWELL'S YEAR
DIMENSION A(N,N),B(N,N)
ICOMMA=0
DO 10 I=1,N
DO 20 J=1,N
IF(INTEGER(A(I,J),ID).NE.INTEGER(B(I,J),ID)) THEN
ICOMMA=1
RETURN
ENDIF
20 CONTINUE
10 CONTINUE
99 RETURN
END
C
C
C
C
FUNCTION ICOMVE (X,Y,N,ID)
C --------------------------
C
C WRITTEN 84.2.7 BY I D BROWN
C
C RETURNS THE VALUE OF 0 IF X(N) AND Y(N) ARE IDENTICAL TO ID DECIMAL
C PLACES
C
DIMENSION X(N),Y(N)
ICOMVE=0
DO 100 I=1,N
100 IF(INTEGER(X(I),ID).NE.INTEGER(Y(I),ID)) ICOMVE=1
RETURN
END
C
C
C
C
FUNCTION INTEGER(X,N)
C
C *****FUNCTION***** INTEGER
C -------
C
C WRITTEN 81.1.7 BY I D BROWN
C
C RETURNS THE VALUE OF X*10**N AS THE NEAREST INTEGER
C
Y = 1
IF(N.LT.1) GO TO 20
DO 10 I=1,N
10 Y = Y*10.
20 IF(X.LT.0.) GO TO 30
INTEGER = X*Y + 0.5
RETURN
30 INTEGER = X*Y - 0.5
RETURN
C** THIS PROGRAM VALID ON FTN4 AND FTN5 **
END
C
C
C
*
function second (itype)
*
*--- system dependent runtime call function, VAX-version
*
* itype = 1 initialize system timer
* = 2 print elapsed CPU time to SYS$OUTPUT
* = 3 return elapsed CPU time
*
* written by Daniel Altermatt
*--- McMaster University, September 1984
*
external LIB$INIT_TIMER
external LIB$STAT_TIMER
external LIB$SHOW_TIMER
character*80 htime
*
second = 0.0
if (itype.ne.1) goto 10
call LIB$INIT_TIMER(it)
return
*
10 if (itype.ne.2) goto 20
icode = 2
call LIB$SHOW_TIMER(it,icode,,htime)
return
*
20 icode = 2
call LIB$STAT_TIMER(icode,itime,it)
second = itime / 100.
return
end
C
C
C
C
* function second (itype)
C
C--- system dependent runtime call function, CYBER-version
C
C itype = 1 initialize system timer
C = 2 print elapsed CPU time to SYS$OUTPUT
C = 3 return elapsed CPU time
C
C written by Daniel Altermatt
C--- McMaster University, June 1985
C
* EXTERNAL SECOND()
C
* IF (ITYPE.LE.1) THEN
* SECOND = 0.0
* ELSE IF (ITYPE.EQ.2) THEN
* WRITE(OUTPUT,1000) SECOND()
*1000 FORMAT(10X,'ELAPSED CPU-TIME SINCE START: ',F10.2,' SECONDS')
* ELSE
* SECOND = SECOND()
* ENDIF
* RETURN
* END
C
C
C
C
SUBROUTINE VMINV(Z,X,Y)
C
C *****SUBROUTINE***** VMINV
C -----
C
C WRITTEN 83.9.23 BY I D BROWN
C
C CLACULATES Z(3) = X(3)-Y(3)
C
DIMENSION X(3),Y(3),Z(3)
DO 10 I=1,3
10 Z(I) = X(I) - Y(I)
RETURN
END
C
C
C
C
SUBROUTINE VPLUSV(VPROD,V1,V2)
C
C ******SUBROUTINE****** VPLUSV
C ------
C
C WRITTEN 89.9.7 BY I D BROWN
C
C CALCULATES VPROD(3) = V1(3) + V2(3)
C
DIMENSION VPROD(3),V1(3),V2(3)
DO 50 I=1,3
50 VPROD(I) = V1(I) + V2(I)
RETURN
END