PROGRAM PARS C C Program created from matthews_coef.f C this is a template for the parser routines C IMPLICIT NONE C .. C .. Parameters .. INTEGER NPARM PARAMETER(NPARM=200) C .. Local Scalars .. INTEGER NMOL, NUMSGP, NSYM, NSYMP, HOWMANY, I REAL WEIGHT LOGICAL DEBUG, FLAG CHARACTER PGNAME*10, SPGNAM*10, LONGLINE*100, CWORK*4 C .. C .. Local Arrays .. REAL CELL(6), RSYM(4,4,192) INTEGER ARRAYMISB(100) C---- things for parser C CHARACTER KEY*4,LINE*600,CVALUE(NPARM)*4 REAL FVALUE(NPARM) LOGICAL LEND INTEGER NTOK,IBEG(NPARM),IEND(NPARM),ITYPE(NPARM), + IDEC(NPARM) C .. C .. External Routines .. EXTERNAL CCPERR, CCPFYP, CCPRCS, PARSER C .. C .. Initialisations NMOL = 1 NSYM = 0 CELL(1) = 0.0 CELL(2) = 0.0 CELL(3) = 0.0 CELL(4) = 90.0 CELL(5) = 90.0 CELL(6) = 90.0 WEIGHT = 0.0 DEBUG = .FALSE. HOWMANY = 0 FLAG = .FALSE. C CALL CCPFYP CALL CCPRCS(6,'PARS','$Date: 1996/10/09 10:47:26 $') C ...Read keyword input 10 CONTINUE KEY = ' ' LINE = ' ' NTOK = NPARM C C ********************************************************** CALL PARSER(KEY,LINE,IBEG,IEND,ITYPE,FVALUE,CVALUE,IDEC,NTOK,LEND, + .TRUE.) C ********************************************************** C IF (LEND) GO TO 200 C Check to see if END keyword is declared IF(KEY.EQ.'END') THEN GO TO 200 C Check to see if a keyword is declared eg debug? ELSEIF(KEY.EQ.'DEBU') THEN DEBUG = .TRUE. C Parse a real e.g. Molecular weight ELSEIF(KEY.EQ.'MOLW') THEN IF (NTOK.GE.2) CALL GTPREA(2,WEIGHT,NTOK,ITYPE,FVALUE) C Parse an integer eg Number of Molecules per asymmetric unit ELSEIF(KEY.EQ.'NMOL') THEN IF (NTOK.GE.2) CALL GTPINT(2,NMOL,NTOK,ITYPE,FVALUE) C C Parse a number n of integers eg batches to miss ELSEIF(KEY.EQ.'MISB') THEN DO I = 2,NTOK IF (ITYPE(I).NE.2) GOTO 10 HOWMANY = HOWMANY + 1 CALL GTPINT(I,ARRAYMISB(I),NTOK,ITYPE,FVALUE) ENDDO C C Parse the cell ELSEIF(KEY.EQ.'CELL') THEN CALL RDCELL(2,ITYPE,FVALUE,NTOK,CELL) C C Parse the Symm ELSEIF(KEY.EQ.'SYMM') THEN CALL RDSYMM(2,LINE,IBEG,IEND,ITYPE,FVALUE,NTOK, + SPGNAM, NUMSGP, PGNAME, NSYM, NSYMP, RSYM) C Get a complicated line to parse later if need ELSEIF(KEY.EQ.'BLUR') THEN LONGLINE = LINE(IBEG(2):IEND(NTOK)) C C Some more complex sitiuations: C C Parse a SUBKEY - flag becomes true if subkey matched C DOIT = the key C FAST = subkey ELSEIF(KEY.EQ.'DOIT') THEN CWORK = LINE(IBEG(2):IBEG(2)+3) IF (CWORK.EQ.'FAST') THEN FLAG = .TRUE. ENDIF ELSE WRITE(6,'(/,A,A4)') ' Unrecognised keyword ',KEY ENDIF GOTO 10 200 CONTINUE C C---- End of input keywords C at this point you can check to see if all the required C keywords have been called with correct values e.g. C IF (CELL(1) .EQ. 0.0) + CALL CCPERR(1,' *** The CELL keyword has not been given ***') IF (NSYM .EQ. 0) + CALL CCPERR(1,' *** The SYMM keyword has not been given ***') IF (WEIGHT .EQ. 0.0) CALL CCPERR(1, + ' *** The MOLWEIGHT keyword has not been given ***') C C---- If everything OK start to calculate! C the main body of your program would be here C CALL CCPERR(0,'Normal Termination') END