C***********************************************************************
C   THIS SUBROUTINE IS WRITTEN TO READ DATA AND SUPPLY IT TO A MAIN
C   PROGRAM. IT IS ASSUMED THAT THERE MAY BE ONE OR MORE SETS OF DATA IN
C   IN THE SAME FORMAT.
C   IT IS ASSUMED THE DATA CARDS OF A SET(SAMPLE) ARE ALL TOGETHER.
C  IT IS ASSUMED EACH CARD HAS SOME IDENTIFICATION FIELD,OR FIELDS,ON IT
C   WHICH UNIQUELY INDICATES THE DATA SET THE CARD BELONGS TO. IT IS
C   FURTHER ASSUMED THAT THE DATA ARE NUMERIC IN SOME FIXED FORMAT.THERE
C   MAY BE ONE OR MORE VARIABLES PER CARD.  THE SUBROUTINE WILL READ AND
C   STORE ONE COMPLETE DATA SET AT A TIME THEN RETURN IT TO THE MAIN
C   PROGRAM FOR PROCESSING. IT IS ASSUMED THAT CONTROL WILL THEN BE
C   RETURNED TO THE SUBROUTINE TO READ THE NEXT DATA SET.
C   THE IDENTIFICATION CHARACTERS ARE READ FIRST IN A1 FORMAT, THEN THE
C   DATA ARE READ. IT IS ASSUMED THAT THE ID FIELD MAY INVOLVE SEVERAL
C   FACTORS AND THAT IT MAY BE DESIRABLE TO POOL SOME DATA SETS OVER ONE
C   OR MORE OF THESE. TO ACHIEVE THIS A SPECIAL FEATURE EXITS. THE FIRST
C   CARD OF A DATA STREAM MAY BE A SPECIAL 'BLANK-OUT' CARD THAT WILL
C   CAUSE THE IGNORING OF ANY GIVEN CARD COLUMNS OF THE ID FIELD.
C   THUS ONE CAN 'ERASE' ALL OR PART OF THE ID FIELD ON
C    EACH CARD. IF THIS CARD IS LEFT OUT THE ENTIRE ID FIELD IS USED
C   FOR DETERMINING GROUP MEMBERSHIP.
C   NOTE  PROPER POOLING WILL ONLY OCCUR IF THE DATA SETS TO BE POOLED
C   ARE CONSECUTIVE IN THE DATA STREAM.
C   TO BLANK OUT CARD COLUMN 'I' OF THE ID FIELD JUST PUNCH A '1' IN
C   THAT CARD COLUMN OF THE SPECIAL ID FIELD DEFINITION CARD .
C   DATA ARE PLACED IN LABELED COMMON.  THE CALLING ARGUMENTS ARE IC,N,
C   HEAD. ON A FIRST CALL TO READ II MUST BE SET EQUAL TO ONE.  A FIRST
C   CALL BEING WHEN A BLANKOUT CARD IS (OR COULD BE) THE NEXT CARD IN
C   THE DATA STREAM.
C***********************************************************************
      SUBROUTINE READ (N)
C**********************************************************************
C     DECLARATIONS
C**********************************************************************
      INCLUDE 'PARMTR.INC'
      CHARACTER*1 KEY(4), TITLE(30), LABEL, HEAD, UL,
     1   BLANK, ERASE, BLK(30)
      LOGICAL ALLBLK
      REAL XHOLD(3)
      INTEGER STATUS, SYSIN, FILPOS
      LOGICAL GRP, POOL, PEST, SEST, DESC, DEF, CUTP, TRUNC, SK, HELP
C***********************************************************************
C     COMMON STATEMENTS
C***********************************************************************
      COMMON /HOLD/ XHOLD, ALLBLK
      COMMON /HOLDS/ TITLE, BLK
      COMMON /OPTION/ GRP, POOL, PEST, SEST, DESC, DEF, CUTP, TRUNC,
     1 HELP
      COMMON /MEASUR/ DATA(MAXOBJ,5)
      COMMON /ALPHA/ LABEL(80), HEAD(30), UL(3,25)
      COMMON /PAGE/ IPAGE
      COMMON /FILE/ SYSIN, SK, FILPOS
      COMMON /IND/ IC, II, IREP, STATUS
C***********************************************************************
C     DATA STATEMENTS
C***********************************************************************
      DATA BLANK /' '/, ERASE /'1'/
      DATA KEY /'E','N','D','.'/
C***********************************************************************
C   ON THE FIRST CALL TO READ, CONTROL COMES HERE. ON ALL SUBSEQUENT
C   CALLS TO READ, CONTROL JUMPS TO STATEMENT 40
C***********************************************************************
      IF (II.NE.1) GO TO 40
      READ (SYSIN,140) TITLE,XHOLD
      DO 10 I=1,30
   10 BLK(I)=BLANK
      DO 20 I=1,30
      IF ((TITLE(I).EQ.ERASE).OR.(TITLE(I).EQ.BLANK)) GO TO 20
      GO TO 40
   20 CONTINUE
      ALLBLK=.TRUE.
      DO 30 I=1,30
      IF (TITLE(I).NE.ERASE) GO TO 30
      ALLBLK=.FALSE.
      BLK(I)=ERASE
   30 CONTINUE
      IF (ALLBLK) GO TO 40
C***********************************************************************
C   IF THE FIRST CARD WAS AN ERASE CARD THE ALLBLK WILL BE FALSE
C   IF ALLBLK IS TRUE THEN THE FIRST CARD READ WAS A DATA CARD BUT THE
C   ID FIELD IS BLANK
C***********************************************************************
      READ (SYSIN,140) TITLE,XHOLD
   40 DO 50 J=1,3
   50 DATA(1,J)=XHOLD(J)
      N=1
      DO 60 I=1,30
      IF (BLK(I).EQ.ERASE) TITLE(I)=BLANK
   60 HEAD(I)=TITLE(I)
   70 READ (SYSIN,140,END=130) TITLE,XHOLD
C***********************************************************************
C     CHECK FOR END OF DATA SET MARKED BY END. .
C***********************************************************************
      DO 80 I=1,4
      IF (TITLE(I).NE.KEY(I)) GO TO 90
   80 CONTINUE
C***********************************************************************
C     IF AN END. CARD HAS BEEN FOUND SET IC=-2 AS A FLAG
C***********************************************************************
      IC=-2
      RETURN
C***********************************************************************
C     IF DATA SETS ARE TO BE POOLED THEN IGNORE THE HEADINGS ON THE CARD
C     QUIT ONLY AT THE END OF THE DATA SET
C***********************************************************************
   90 IF (POOL) GO TO 110
C***********************************************************************
C     COMPARE HEADER STATEMENTS.  IF IT IS A NEW DATA SET THEN RETURN.
C     OTHERWISE STORE THE DATA POINTS.
C***********************************************************************
      DO 100 I=1,30
      IF (BLK(I).EQ.ERASE) TITLE(I)=BLANK
      IF (HEAD(I).NE.TITLE(I)) RETURN
  100 CONTINUE
  110 N=N+1
      IF (N.GT.MAXOBJ) THEN
         WRITE(0,*) 'Number of objects exceeds dimensions.'
         STOP
      ENDIF
      DO 120 J=1,3
  120 DATA(N,J)=XHOLD(J)
      GO TO 70
C***********************************************************************
C     IF THE END OF THE FILE HAS BEEN REACHED THEN SET IC=-1 AS A FLAG
C***********************************************************************
  130 IC=-1
      RETURN
  140 FORMAT (30A1,3F5.0)
      END
