SUBROUTINE DATFMC(NFILE,NOPT,NM,AN,LDM) C This routine reads a first-order Markov chain model data file, C and returns the data matrix. C Inputs: C NFILE File number to read C NOPT If >0 print data matrix, otherwise not C NM Number of categories C LDM Leading dimension of A C Output: C AN(NMxNM) Data matrix PARAMETER(LD=100) IMPLICIT REAL*8 (A-H,O-Z) LOGICAL LSTOP COMMON/SCRA/A1(LD,LD),A2(LD,LD),V1(LD),V2(LD) DIMENSION AN(LDM,NM) CALL FOPEN('Data',NFILE,.FALSE.) READ(NFILE,*,END=210,ERR=220)NM1,NM2 IF((NM1.NE.NM).OR.(NM2.NE.NM))GO TO 230 READ(NFILE,*,END=210,ERR=220)((AN(I,J),J=1,NM),I=1,NM) IF(NOPT.LE.0)GO TO 60 DO 50 JBASE=1,NM,8 JTOP=JBASE+7 IF(JTOP.GT.NM)JTOP=NM WRITE(6,20)(J,J=JBASE,JTOP) 20 FORMAT(8I9) DO 30 I=1,NM 30 WRITE(6,40)I,(AN(I,J),J=JBASE,JTOP) 40 FORMAT(I3,8F9.1) 50 CONTINUE 60 CALL DSET(NM,0.0D0,V1,1) CALL DSET(NM,0.0D0,V2,1) LSTOP=.FALSE. DO 70 I=1,NM DO 70 J=1,NM V1(I)=V1(I)+AN(I,J) V2(J)=V2(J)+AN(I,J) IF(AN(I,J).GE.0.0D0)GO TO 70 WRITE(6,65)I,J 65 FORMAT(/,' NEGATIVE DATA ENTRY ROW',I3,' COLUMN',I3) LSTOP=.TRUE. 70 CONTINUE IF(LSTOP)CALL TERM WRITE(6,75)DSUM(NM,V1,1) 75 FORMAT(F10.1,' observations in sample') DO 90 I=1,NM IF(V1(I).EQ.0.0D0)WRITE(6,80)I 80 FORMAT(' +++ WARNING: ROW SUM',I3,' IS 0.0') 90 IF(V2(I).EQ.0.0D0)WRITE(6,100)I 100 FORMAT(' +++ WARNING: COLUMN SUM',I3,' IS 0.0') IF(NOPT.LT.0)RETURN WRITE(6,110)(I,V1(I),V2(I),I=1,NM) 110 FORMAT(/,' Row sums Col sums',/,(I3,2F9.1)) RETURN 210 CALL PEND('UNEXPECTED END OF FILE READING MARKOV CHAIN DATA') 220 CALL PEND('ERROR READING MARKOV CHAIN DATA') 230 CALL PEND('NUMBER CATEGORIES IN CONTROL AND DATA FILES CONFLICT') END