C
C C*************************************************************
C
C
C**************************************************************
c
c Input:
c HKLIN reflection file
c
c
c Input either Fi SIGFi Di SIGD1
C or Fi+ SIGFi+ Fi- SIGFi-
c Output:
c HKLOUT reflection file
c
c Output both Fi SIGFi Di SIGD1
C and Fi+ SIGFi+ Fi- SIGFi-
c
PROGRAM MAIN
C ..
C .. Parameters ..
INTEGER MCOLS,NKEYWD,LSYM
PARAMETER (MCOLS=500,NKEYWD=200,LSYM=192)
INTEGER MSETS
PARAMETER (MSETS=MCOLS)
C ..
C .. Local Arrays ..
REAL ADATA(MCOLS),BDATA(MCOLS),RSYML(4,4,LSYM)
INTEGER LOOKUP(MCOLS),IN(3)
CHARACTER*1 CTPRGO(MCOLS),CTPRGI(MCOLS),CTUSRI(MCOLS)*1
CHARACTER*30 LSPRGI(MCOLS),CLABS(MCOLS),LSPRGO(MCOLS),
+ LSUSRI(MCOLS)*30
LOGICAL LOGMSS(MCOLS)
C ..
C .. Local Scalars ..
REAL S
INTEGER I,IC,IFAIL,IFIL1,IFLAG,IPRINT,JDO30,JDO35,JDO40,JDO60
INTEGER JDO65,JDO70,JDO80,JDO90,LUNOUT,NCOL,NF1,NLPRGI,NSPGRP
INTEGER NSYM,NSYMP,NUMDO,NUMFPM,NTOK,STARTFO,STARTFC
INTEGER STARTI,STARTPH,STARTDO
CHARACTER NAMSPG*10,PGNAM*10,TITLE*80
CHARACTER LTYPEX*1
LOGICAL ENDFIL,LTITLE
C
C----Harvesting stuff
C
INTEGER NDATASETS,ISETS(MSETS),ISET,CSETID(MCOLS),
+ CSETOUT(MCOLS),SETID,IDUMMY
REAL DATCELL(6,MSETS),DATWAVE(MSETS)
CHARACTER*64 PNAME(MSETS),XNAME(MSETS),DNAME(MSETS),
+ XNAME_OUT(MCOLS),DNAME_OUT(MCOLS)
C ..
C .. Variables for Parser ..
REAL FVALUE(NKEYWD)
INTEGER IBEG(NKEYWD),IDEC(NKEYWD),IEND(NKEYWD),ITYPE(NKEYWD)
CHARACTER KEY*4,CVALUE(NKEYWD)*4,LINE*2000,LABOUT_SAVE*2000
LOGICAL LEND
C ..
C .. External Routines ..
EXTERNAL CCPERR,CCPFYP,CCPRCS,CENTR,CENTRIC,EQUAL_MAGIC,LKYIN,
+ LROPEN,LRASSN,LRCLAB,LRREFM,LRSYMI,LRSYMM,
+ LWOPEN,LWREFL,MTZINI,PARSER,
+ LRCLID
C ..
C .. Intrinsic Functions ..
intrinsic nint
C ..
C .. Data Statements ..
DATA NLPRGI/163/
DATA LTITLE/.FALSE./
C Allow NUMFO sets of Fs
DATA NUMDO,NUMFPM/20,20/
DATA LSPRGI/'H','K','L',
+ 'F1' ,'SIGF1' ,'D1' ,'SIGD1' ,
+ 'F1(+)' ,'SIGF1(+)' ,'F1(-)' ,'SIGF1(-)' ,
+ 'F2' ,'SIGF2' ,'D2' ,'SIGD2' ,
+ 'F2(+)' ,'SIGF2(+)' ,'F2(-)' ,'SIGF2(-)' ,
+ 'F3' ,'SIGF3' ,'D3' ,'SIGD3' ,
+ 'F3(+)' ,'SIGF3(+)' ,'F3(-)' ,'SIGF3(-)' ,
+ 'F4' ,'SIGF4' ,'D4' ,'SIGD4' ,
+ 'F4(+)' ,'SIGF4(+)' ,'F4(-)' ,'SIGF4(-)' ,
+ 'F5' ,'SIGF5' ,'D5' ,'SIGD5' ,
+ 'F5(+)' ,'SIGF5(+)' ,'F5(-)' ,'SIGF5(-)' ,
+ 'F6' ,'SIGF6' ,'D6' ,'SIGD6' ,
+ 'F6(+)' ,'SIGF6(+)' ,'F6(-)' ,'SIGF6(-)' ,
+ 'F7' ,'SIGF7' ,'D7' ,'SIGD7' ,
+ 'F7(+)' ,'SIGF7(+)' ,'F7(-)' ,'SIGF7(-)' ,
+ 'F8' ,'SIGF8' ,'D8' ,'SIGD8' ,
+ 'F8(+)' ,'SIGF8(+)' ,'F8(-)' ,'SIGF8(-)' ,
+ 'F9' ,'SIGF9' ,'D9' ,'SIGD9' ,
+ 'F9(+)' ,'SIGF9(+)' ,'F9(-)' ,'SIGF9(-)' ,
+ 'F10','SIGF10','D10','SIGD10',
+ 'F10(+)','SIGF10(+)','F10(-)','SIGF10(-)',
+ 'F11','SIGF11','D11','SIGD11',
+ 'F11(+)','SIGF11(+)','F11(-)','SIGF11(-)',
+ 'F12','SIGF12','D12','SIGD12',
+ 'F12(+)','SIGF12(+)','F12(-)','SIGF12(-)',
+ 'F13','SIGF13','D13','SIGD13',
+ 'F13(+)','SIGF13(+)','F13(-)','SIGF13(-)',
+ 'F14','SIGF14','D14','SIGD14',
+ 'F14(+)','SIGF14(+)','F14(-)','SIGF14(-)',
+ 'F15','SIGF15','D15','SIGD15',
+ 'F15(+)','SIGF15(+)','F15(-)','SIGF15(-)',
+ 'F16','SIGF16','D16','SIGD16',
+ 'F16(+)','SIGF16(+)','F16(-)','SIGF16(-)',
+ 'F17','SIGF17','D17','SIGD17',
+ 'F17(+)','SIGF17(+)','F17(-)','SIGF17(-)',
+ 'F18','SIGF18','D18','SIGD18',
+ 'F18(+)','SIGF18(+)','F18(-)','SIGF18(-)',
+ 'F19','SIGF19','D19','SIGD19',
+ 'F19(+)','SIGF19(+)','F19(-)','SIGF19(-)',
+ 'F20','SIGF20','D20','SIGD20',
+ 'F20(+)','SIGF20(+)','F20(-)','SIGF20(-)',
+ 337*' '/
C
DATA CTPRGI/'H','H','H',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 337*' '/
DATA LSPRGO/'H','K','L',
+ 'F1' ,'SIGF1' ,'D1' ,'SIGD1' ,
+ 'F1(+)' ,'SIGF1(+)' ,'F1(-)' ,'SIGF1(-)' ,
+ 'F2' ,'SIGF2' ,'D2' ,'SIGD2' ,
+ 'F2(+)' ,'SIGF2(+)' ,'F2(-)' ,'SIGF2(-)' ,
+ 'F3' ,'SIGF3' ,'D3' ,'SIGD3' ,
+ 'F3(+)' ,'SIGF3(+)' ,'F3(-)' ,'SIGF3(-)' ,
+ 'F4' ,'SIGF4' ,'D4' ,'SIGD4' ,
+ 'F4(+)' ,'SIGF4(+)' ,'F4(-)' ,'SIGF4(-)' ,
+ 'F5' ,'SIGF5' ,'D5' ,'SIGD5' ,
+ 'F5(+)' ,'SIGF5(+)' ,'F5(-)' ,'SIGF5(-)' ,
+ 'F6' ,'SIGF6' ,'D6' ,'SIGD6' ,
+ 'F6(+)' ,'SIGF6(+)' ,'F6(-)' ,'SIGF6(-)' ,
+ 'F7' ,'SIGF7' ,'D7' ,'SIGD7' ,
+ 'F7(+)' ,'SIGF7(+)' ,'F7(-)' ,'SIGF7(-)' ,
+ 'F8' ,'SIGF8' ,'D8' ,'SIGD8' ,
+ 'F8(+)' ,'SIGF8(+)' ,'F8(-)' ,'SIGF8(-)' ,
+ 'F9' ,'SIGF9' ,'D9' ,'SIGD9' ,
+ 'F9(+)' ,'SIGF9(+)' ,'F9(-)' ,'SIGF9(-)' ,
+ 'F10','SIGF10','D10','SIGD10',
+ 'F10(+)','SIGF10(+)','F10(-)','SIGF10(-)',
+ 'F11','SIGF11','D11','SIGD11',
+ 'F11(+)','SIGF11(+)','F11(-)','SIGF11(-)',
+ 'F12','SIGF12','D12','SIGD12',
+ 'F12(+)','SIGF12(+)','F12(-)','SIGF12(-)',
+ 'F13','SIGF13','D13','SIGD13',
+ 'F13(+)','SIGF13(+)','F13(-)','SIGF13(-)',
+ 'F14','SIGF14','D14','SIGD14',
+ 'F14(+)','SIGF14(+)','F14(-)','SIGF14(-)',
+ 'F15','SIGF15','D15','SIGD15',
+ 'F15(+)','SIGF15(+)','F15(-)','SIGF15(-)',
+ 'F16','SIGF16','D16','SIGD16',
+ 'F16(+)','SIGF16(+)','F16(-)','SIGF16(-)',
+ 'F17','SIGF17','D17','SIGD17',
+ 'F17(+)','SIGF17(+)','F17(-)','SIGF17(-)',
+ 'F18','SIGF18','D18','SIGD18',
+ 'F18(+)','SIGF18(+)','F18(-)','SIGF18(-)',
+ 'F19','SIGF19','D19','SIGD19',
+ 'F19(+)','SIGF19(+)','F19(-)','SIGF19(-)',
+ 'F20','SIGF20','D20','SIGD20',
+ 'F20(+)','SIGF20(+)','F20(-)','SIGF20(-)',
+ 337*' '/
C
DATA CTPRGO/'H','H','H',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 'F','Q','D','Q',
+ 'G','L','G','L',
+ 337*' '/
DATA LOOKUP/-1,-1,-1,0,0,0,0,0,0,0,0,489*0/
c
C Starting indices of program label blocks
STARTDO=4
LUNOUT=6
IFIL1 = 1
CALL CCPFYP
CALL MTZINI
CALL CCPRCS(6,'MTZMADMOD','$Date: 2005/09/06 11:25:18 $')
C ...Read keyword input
20 CONTINUE
KEY = ' '
LINE = ' '
C Reset number of words on line from 20 to NKEYWD
C Need lots for LABI lines
NTOK = NKEYWD
C
C If LINE is blank the PARSE SR will read a new line
C otherwise it parses the given values of LINE
C **********************************************************
CALL PARSER(KEY,LINE,IBEG,IEND,ITYPE,FVALUE,CVALUE,IDEC,NTOK,LEND,
+ .TRUE.)
C **********************************************************
C
IF (LEND) GO TO 200
IF(KEY.EQ.'TITL') THEN
IF (NTOK.GE.2) THEN
LTITLE = .TRUE.
TITLE = LINE(IBEG(2) :IEND(NTOK))
WRITE(LUNOUT,'(10X,a,/,15X,a80,/)')
+ 'TITLE OF MTZ FILE REPLACED BY:',TITLE
ENDIF
GO TO 20
ELSE IF(KEY.EQ.'LABI') THEN
C---- LABIN i.e. set input labels
C transfers information in common blocks
C /MTZLAB/,/MTZLBC/ for use by mtzlib routines
C
C *****************************************
CALL LKYIN(IFIL1,LSPRGI,NLPRGI,NTOK,LINE,IBEG,IEND)
C *****************************************
IF (NTOK.EQ.1) CALL CCPERR(1,
+ 'No columns assigned. Nothing to do. Bye-bye!')
WRITE(LUNOUT,'(10X,I3,X,a,/,10X,a,a,/)')
+ (NTOK-1)/2, 'column labels have been assigned.',
+ 'NOTE: conversion only performed ',
+ 'for these columns!!'
GO TO 20
ELSE IF(KEY.EQ.'LABO') THEN
C---- LABO command, read output labels
C ================================
C
LABOUT_SAVE = LINE
GO TO 20
C
ELSE IF(KEY.EQ.'END') THEN
WRITE(LUNOUT,'(/)')
GO TO 200
ELSE
C A fatal error - call ccperr(1,... ) then program stops
Call ccperr(1,' Key word unrecognised')
END IF
C
C---- End of keyword input
200 CONTINUE
C
IPRINT = 2
C **********************************
CALL LROPEN(IFIL1,'HKLIN',IPRINT,IFAIL)
C **********************************
IF(IFAIL.NE.0) THEN
CALL CCPERR(1, ' No input file???????')
END IF
C
C ****************************************
CALL LRASSN(IFIL1,LSPRGI,NLPRGI,LOOKUP,CTPRGI)
C *****************************************
C
C =========================================
CALL LRCLAB(IFIL1,LSUSRI,CTUSRI,NCOL)
C =========================================
C---- Dataset stuff
C Notify available space
NDATASETS = MSETS
CALL LRIDX(IFIL1,PNAME,XNAME,DNAME,ISETS,
+ DATCELL,DATWAVE,NDATASETS)
C---- Get dataset IDs for columns.
IF (NDATASETS.GT.0) THEN
CALL LRCLID(IFIL1,CSETID,IDUMMY)
ENDIF
C
C Test correct column types.
C
Do 205 I = 1,MCOLS
IF (LOOKUP(I).NE.0) THEN
NF1 = LOOKUP(I)
IF (CTUSRI(NF1).NE.CTPRGI(I) ) THEN
WRITE (LUNOUT,FMT='(A,/I3,3x,A20,A4,A20,A4)')
+ ' ** Column type does not match assignment **',
+ I,LSPRGI(I), CTPRGI(I),LSUSRI(NF1),CTUSRI(NF1)
IF (CTUSRI(NF1).EQ.'R'.OR.CTUSRI(NF1).EQ.'I') THEN
WRITE (LUNOUT,FMT='(/,A,A,/)')
+ ' Warning: - Input column type is REAL or INTEGER',
+ '- it has been reset to program assignment.'
ELSE
CALL CCPERR(1,
+ ' Column type does not match assignment')
ENDIF
END IF
END IF
205 CONTINUE
C
C Test that SIGF present if F specified, etc, etc
C Test F present if D specified.
C
C Allow NUMFO sets of Fs
C DATA NUMDO,NUMFPM/20,20/
C Check the LABI line is sensible; ie if Fi+ assigned, so is SIGFi+, Fi- etc..
NF1 = 0
DO 30 JDO30 = STARTDO,STARTDO+(NUMDO+NUMFPM-1)*4,4
IF (LOOKUP(JDO30).EQ.0 .AND. LOOKUP(JDO30+2).EQ.0) GO to 30
C
NF1=NF1+1
C
IF (LOOKUP(JDO30).NE.0 .NEQV. LOOKUP(JDO30+1).NE.0) THEN
WRITE (LUNOUT,FMT='(/A,I2,A,I2,A/)')
+ 'Unmatched F',NF1,' or SIGF',NF1,' assigned.'
CALL CCPERR(1,' Unmatched F/SIGF pair')
ENDIF
IF (LOOKUP(JDO30+2).NE.0 .NEQV. LOOKUP(JDO30+3).NE.0) THEN
WRITE (LUNOUT,FMT='(/A,I2,A,I2,A/)')
+ 'Unmatched F or D',NF1,' or SIGF or SIGD',NF1,' assigned.'
CALL CCPERR(1,' Unmatched F/SIGF or D/SIGD pair')
ENDIF
IF (LOOKUP(JDO30+2).NE.0 .AND. LOOKUP(JDO30).EQ.0) THEN
WRITE (LUNOUT,FMT='(/A,I2,A,I2/)')
+ 'F- or D',NF1,' assigned but no corresponding F+ or F ',NF1
CALL CCPERR(1,' Unmatched F/D pair')
ENDIF
IF (LOOKUP(JDO30+2).EQ.0 .AND. LOOKUP(JDO30+4).EQ.0 .AND.
+ LOOKUP(JDO30+6).EQ.0) THEN
WRITE (LUNOUT,FMT='(/A,I2,A,I2/)')
+ 'None of D F(+) or F(-)',NF1,' assigned'
CALL CCPERR(1,' No anomalous data')
ENDIF
C To get here, must have F or F+
IF (NDATASETS.GT.0) THEN
DO 35 JDO35 = STARTDO + (NF1-1)*8, STARTDO + (NF1-1)*8 + 7
CSETOUT(JDO35)=CSETID(LOOKUP(JDO30))
35 CONTINUE
ENDIF
30 CONTINUE
C Read symmetry information.
C will return information
C
C NSYM - number of Symmetry Operations
C NSYMP Number of Primitive Operations
C NSPGRP - Space Group number (eg 23)
C NAMSPG - space group name ( eg I222)
C PGNAM - point group name ( eg PG222)
C LTYPEX - lattice type
CRSYML - symmetry matrices ( 4*4) s11 s12 s13 t1
C s21 s22 s23 t2
C s31 s32 s33 t3
C 0 0 0 1
CALL LRSYMI(IFIL1,NSYMP,LTYPEX,NSPGRP,NAMSPG,PGNAM)
CALL LRSYMM(IFIL1,NSYM,RSYML)
C sets up information to decide centric zones.
CALL CENTRIC(NSYM,RSYML,IPRINT)
C