File: push.f

package info (click to toggle)
nastran 0.1.95-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm, bullseye, sid
  • size: 122,540 kB
  • sloc: fortran: 284,409; sh: 771; makefile: 324
file content (145 lines) | stat: -rw-r--r-- 4,131 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
      SUBROUTINE PUSH (IN,BCD,ICOL,NCHAR,FLAG)
C
C     THIS ROUTINE IS USED TO PLACE BCD CHARACTERS OR INTEGERS FROM II
C     ARRAY INTO THE BCD STRING . IF FLAG = 1 AN INTEGER IS INPUT
C
      EXTERNAL        ORF
      LOGICAL         FIRST
      INTEGER         ORF,FLAG,BCD(1),CPERWD,IN(1),II(18),BLANK,
     1                DIGIT,NUMBS(10)
      CHARACTER       UFM*23
      COMMON /XMSSG / UFM
      COMMON /SYSTEM/ ISYS,IOUT,NOGO,IDUM(35),NBPC,NBPW,NCPW
      DATA    NUMBS / 1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9 /
      DATA    CPERWD/ 4 /, FIRST / .TRUE. /, BLANK /1H  /,
     1        MINUS / 4H-   /
C
      IF (.NOT.FIRST) GO TO 15
      FIRST = .FALSE.
C
C     REMOVE BLANKS FROM NUMBERS, AND ZERO FILL
C
      ISH   = NCPW - 1
      DO 5 I = 1,10
      ISAVE = KRSHFT(NUMBS(I),ISH)
      NUMBS(I) = KLSHFT(ISAVE,ISH)
    5 CONTINUE
      ISAVE = KRSHFT(MINUS,ISH)
      MINUS = KLSHFT(ISAVE,ISH)
      NX    = NCPW - CPERWD
      IXTRA = NX*NBPC
      IBL   = 0
      IF (NX .EQ. 0) GO TO 15
      IB1   = KRSHFT(BLANK,ISH)
      DO 10 I = 1,NX
      IBL   = ORF(IBL,KLSHFT(IB1,I-1))
   10 CONTINUE
C
   15 IF (NCHAR .LE. 0) RETURN
      IF (NCHAR+ICOL .GT. 128) GO TO 70
      NIN   = (NCHAR-1)/CPERWD + 1
      DO 20 I = 1,NIN
   20 II(I) = IN(I)
      IF (FLAG .NE. 1) GO TO 50
C
C     INTEGER HAS BEEN INPUT - 1 WORD ONLY
C
C     FIND POWER OF 10 = NUMBER OF CHARACTERS
C
      IX    = IABS(IN(1))
      DO 25 I = 1,8
      IX    = IX/10
      IF (IX .EQ. 0) GO TO 30
   25 CONTINUE
      GO TO 80
   30 IC    = I
      IF (IN(1) .LT.  0) IC = IC + 1
      IF (IC .GT. NCHAR) GO TO 80
      II(2) = BLANK
      IX    = IABS(IN(1))
      IF (IC .LE. CPERWD) GO TO 40
C
C     NUMBER TAKES TWO WORDS
C
      M     = IC - CPERWD
      II(2) = KRSHFT(BLANK,M)
      DO 35 I = 1,M
      IJ    = IX/10
      DIGIT = IABS(IX-10*IJ) + 1
      IX    = IJ
      IADD  = NUMBS(DIGIT)
      II(2) = ORF(II(2),KRSHFT(IADD,M-I))
   35 CONTINUE
C
      IC    = CPERWD
C
C     FIRST WORD SET HERE FOR BOTH CASES
C
   40 II(1) = KRSHFT(BLANK,IC)
      DO 45 I = 1,IC
      IF (I.EQ.IC .AND. IN(1).LT.0) GO TO 45
      IJ    = IX/10
      DIGIT = IABS(IX-10*IJ) + 1
      IX    = IJ
      IADD  = NUMBS(DIGIT)
      II(1) = ORF(II(1),KRSHFT(IADD,IC-I))
   45 CONTINUE
      IF (IN(1) .LT. 0) II(1) = ORF(II(1),MINUS)
C
   50 IWRD  = (ICOL-1)/CPERWD + 1
      ICL   = ICOL - (IWRD-1)*CPERWD
      LWRD  = (ICOL+NCHAR-2)/CPERWD + 1
      LCOL  = ICOL + NCHAR - (LWRD-1)*CPERWD - 1
      M1    = (ICL-1)*NBPC
      M2    = CPERWD*NBPC - M1
      M3    = M2 + (NCPW-CPERWD)*NBPC
C
C     M1 IS THE NUMBER OF BITS FOR THE  FIRST SET OF CHARACTERS
C     M2 IS THE NUMBER OF BITS FOR THE SECOND SET OF CHARACTERS
C     M3 IS THE NUMBER OF BITS FOR THE RIGHT HALF OF THE WORD
C
C     IADD IS THE CURRENT WORKING WORD, IADD1 IS THE SPILL
C
      ISAVE = KRSHFT(BCD(IWRD),M3/NBPC)
      IADD1 = KLSHFT(ISAVE,M3/NBPC)
      K = 0
      DO 60 I = IWRD,LWRD
      K = K + 1
C
C     SPLIT INPUT WORD INTO TWO SETS
C
C     MOVE LEFT HALF TO RIGHT SIDE OF IADD AND ADD IADD1
C
      ISAVE = KRSHFT(II(K),(M1+IXTRA)/NBPC)
      IADD  = ORF(KLSHFT(ISAVE,IXTRA/NBPC),IADD1)
C
C     IF THIS ISNT THE LAST WORD MOVE THE RIGHT HALF TO IADD1 AND INSERT
C
      IF (I .GE. LWRD) GO TO 60
      ISAVE = KRSHFT(II(K),IXTRA/NBPC)
      IADD1 = KLSHFT(ISAVE,M3/NBPC)
C
      BCD(I) = ORF(IADD,IBL)
C
   60 CONTINUE
C
C     LAST WORD PROCESSED HERE, REMOVE EXTRA CHARACTERS
C
      ISH   = NCPW - LCOL
      ISAVE = KRSHFT(IADD ,ISH)
      IADD  = KLSHFT(ISAVE,ISH)
      ISAVE = KLSHFT(BCD(LWRD),LCOL)
      BCD(LWRD) = ORF(IADD,KRSHFT(ISAVE,LCOL))
      RETURN
C
   70 WRITE  (IOUT,75) UFM,NCHAR,IN
   75 FORMAT (A23,' 6015. TOO MANY CHARACTERS TO BE INSERTED IN A DMAP',
     1       ' LINE', /6X,4H N = , I8 ,6X, 6HWORD =,A4)
      GO TO 90
   80 WRITE  (IOUT,85) UFM,IN
   85 FORMAT (A23,' 6016. TOO MANY DIGITS TO BE INSERTED IN DMAP.',
     1       2X,'VALUE =',I12)
C
   90 NOGO = 1
      RETURN
      END