      SUBROUTINE PCARD(CARD,VAL,NVAL)
      CHARACTER*(*) CARD
      CHARACTER*1 CH
      REAL*8 VAL(0:*),TMP
      INTEGER*4 ITMP
      INTEGER NVAL,NPWR,KVAL,ICH,ICHR,NCHR,NDEC,IPWR,PWRFLG
C
C  parses a card for a leading alphabetic character and
C     NVAL numbers 
C
      PARAMETER (NPWR=6)
      LOGICAL NEG,NEWNUM
      REAL PTEN(0:NPWR)
      SAVE PTEN
      DATA PTEN/1.,10.,100.,1000.,10000.,100000.,1000000./
      NCHR=80
C      NCHR=LEN(CARD)
      NEG=.FALSE.
      NEWNUM=.TRUE.
      ITMP=0
      NDEC=-1
      IPWR=0
      PWRFLG=0
      KVAL=0
      ICHR=0
  50  IF(KVAL.LT.NVAL) THEN
          ICHR=ICHR+1
          IF(ICHR.LE.NCHR) THEN
              CH=CARD(ICHR:ICHR)
          ELSE
              CH='/'
          ENDIF
          ICH=ICHAR(CH)-ICHAR('0')
          IF(ICH.GE.0.AND.ICH.LE.9) THEN
C           character is a number
              IF(NDEC.LE.0) THEN
                  ITMP=ICH
                  NDEC=1
              ELSE IF(NDEC.EQ.NPWR) THEN
C               .. now is a good time to convert integer to real
                  IF(NEWNUM) THEN
                      TMP=ITMP
                      NEWNUM=.FALSE.
                  ELSE
                      TMP=TMP*PTEN(NDEC)+ITMP
                  ENDIF
                  ITMP=ICH
                  NDEC=1
              ELSE
                  NDEC=NDEC+1
                  ITMP=ITMP*10+ICH
              ENDIF
              IF(PWRFLG.GT.0) IPWR=IPWR-1
          ELSE IF(CH.EQ.'.') THEN
              PWRFLG=1
              IF(NDEC.LT.0) NDEC=0
          ELSE IF(CH.EQ.'-') THEN
              NEG=.TRUE.
              NDEC=0
          ELSE IF(CH.EQ.'+') THEN
              NDEC=0
          ELSE 
C           character is not a number or decimal point, +, -
              IF(NDEC.GE.0) THEN
C               save results from number decoding
                  IF(PWRFLG.LT.0) THEN
C                   integer follows 'E'
                      IF(NEG) ITMP=-ITMP
                      IPWR=IPWR+ITMP
                  ELSE 
C                   finish up number
                      IF(NEWNUM) THEN
                          TMP=ITMP
                      ELSE
                          TMP=ITMP+TMP*PTEN(NDEC)
                      ENDIF
                      IF(NEG) TMP=-TMP
                  ENDIF
                  IF(CH.EQ.'E'.OR.CH.EQ.'e'.OR.
     :                            CH.EQ.'D'.OR.CH.EQ.'d') THEN
C                  ..... look for exponent
                      PWRFLG=-1
                      NDEC=0
                  ELSE
C                   ..    fix up power of 10 in groups of NPWR
  10                  IF(IPWR.NE.0) THEN
                          IF(IPWR.LT.0) THEN
                              ITMP=-IPWR
                              IF(ITMP.GT.NPWR) ITMP=NPWR
                              TMP=TMP/PTEN(ITMP)
                              IPWR=IPWR+ITMP
                          ELSE 
                              ITMP=IPWR
                              IF(ITMP.GT.NPWR) ITMP=NPWR
                              TMP=TMP*PTEN(ITMP)
                              IPWR=IPWR-ITMP
                              IF(ABS(TMP).GT.1.E+32) IPWR=0
                          ENDIF
                          GO TO 10
                      ENDIF
                      VAL(KVAL)=TMP
                      KVAL=KVAL+1
                      PWRFLG=0
                      NDEC=-1
                      IPWR=0
                  ENDIF
                  NEG=.FALSE.
                  NEWNUM=.TRUE.
                  ITMP=0
              ENDIF
              IF(CH.EQ.',') THEN
                  IF(NDEC.EQ.-2) KVAL=KVAL+1
                  NDEC=-2
              ELSE IF(CH.EQ.'/') THEN
C               end of line character
                  KVAL=NVAL
              ENDIF
          ENDIF
          GO TO 50
      ENDIF
      RETURN
      END
