File: typflt.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 (231 lines) | stat: -rw-r--r-- 5,795 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
      SUBROUTINE TYPFLT (X,Y,XYD,V,FIELD,OPT)
C
C
C     (X,Y) = STARTING OR ENDING POINT OF THE NUMBER TO BE TYPED (ALWAYS
C             LEFT-TO-RIGHT OR TOP-TO-BOTTOM).
C     XYD   = +/-1 IF X = STARTING OR ENDING POINT OF THE NUMBER.
C           = +/-2 IF Y = STARTING OR ENDING POINT OF THE NUMBER.
C     V     = REAL NUMBER TO BE TYPED.
C     FIELD = FIELD WIDTH OF THE NUMBER (IF POSITIVE, THE NUMBER WILL BE
C             CENTERED AT (X,Y) - IF NEGATIVE, THE NUMBER WILL BE TYPED
C             STARTING OR ENDING AT (X,Y) - IF XYD = 1 OR 2, THE NUMBER
C             WILL BE TYPED IN THE X OR Y DIRECTION).
C     OPT   = -1 TO INITIATE  THE TYPING MODE.
C           = +1 TO TERMINATE THE TYPING MODE.
C           =  0 TO TYPE THE NUMBER.
C
      INTEGER          PLOTER,DIR,EXP,D(9),C(100),ASTER,DECPNT,PLUS,
     1                 MINUS,FW,EXPFLD,TRA,XYD,FIELD,OPT
      DOUBLE PRECISION VAL,Z
      COMMON /PLTDAT/  MODEL,PLOTER,SKPPLT(18),SKPA(3),CNTX,CNTY
      DATA    ASTER ,  DECPNT,PLUS,MINUS / 41,44,39,40 /
      DATA    TENM2 ,  TEN7,TEN8  / 1.E-2, 1.E7, 1.E8  /
C
      IF (OPT .EQ. 0) GO TO 20
      CALL TIPE (0,0,0,0,0,OPT)
      GO TO 200
   20 VAL = ABS(V)
      FW  = MIN0(25,IABS(FIELD))
      IF (FW .EQ. 0) GO TO 200
      DO 21 I = 1,FW
      C(I) = 1
   21 CONTINUE
      EXP = 0
      IF (V .NE. 0.) GO TO 30
C
C     INPUT VALUE = 0.
C
      FW   = MIN0(FW,2)
      NSIG = 1
      C(2) = DECPNT
      GO TO 150
C
   30 EXPFLD = 0
      IF (V .LT. 0.) GO TO 35
C
C     SINCE -V- IS POSITIVE, THE NUMBER WILL BE UNSIGNED. IF FIELD.GT.4,
C     THE NUMBER OF SIGNIFICANT DIGITS TYPED WILL BE AT LEAST -FIELD-4-.
C     IF FIELD.LE.4, -FIELD-1-.
C
      NSIG = FW - 4
      IF (NSIG) 40,40,100
C
C     SINCE -V- IS NEGATIVE, THE NUMBER WILL BE SIGNED.  IF FIELD.GT.5,
C     THE NUMBER OF SIGNIFICANT DIGITS TYPED WILL BE AT LEAST -FIELD-5-.
C     IF FIELD.LE.5, -FIELD-2-.
C
   35 NSIG = FW - 5
      IF (NSIG) 40,40,100
C
C     THE NUMBER WILL BE TYPED WITHOUT AN EXPONENT.
C
   40 NSIG = NSIG + 3
      EXPFLD = 1
C
C     THE NUMBER MUST FIRST BE MULTIPLIED BY SOME POWER OF TEN (EXP)
C     SUCH THAT THE PRODUCT IS BETWEEN 10**7 AND 10**8 SO THAT IT
C     CAN BE EXPRESSED AS AN 8-SIGNIFICANT DIGIT INTEGER.
C
  100 Z = 10.D0**IABS(EXP)
      IF (EXP .LT. 0) A = VAL/Z
      IF (EXP .GE. 0) A = VAL*Z
      IF (A .GE. TENM2) GO TO 105
C
C     A .LT. 10**-2
C
      EXP = EXP + 10
      GO TO 100
C
  105 IF (A.GE.TEN7 .AND. A.LT.TEN8) GO TO 115
      IF (A .LT. TEN7) GO TO 110
C
C     A .GE. 10**8
C
      EXP = EXP - 10
      GO TO 100
C
C     A .GE. 10**-2  AND  .LT. 10**7
C
  110 EXP = EXP + 1
      GO TO 100
C
C     A .GE. 10**7  AND  .LT. 10**8  (SEPARATE THE 8 SIGNIFICANT DIGITS)
C
  115 NUM = A
      EXP = -EXP + 7
      DO 116 I = 1,8
      J   = NUM/10**(8-I)
      D(I)= J + 1
      NUM = NUM - J*10**(8-I)
  116 CONTINUE
      IF (EXPFLD .NE. 0) GO TO 130
      IF (EXP.GE.-4 .AND. EXP.LE.NSIG+2) GO TO 135
C
C     USE STANDARD FORMAT (-X.XXX-XX)
C
      NSIG = MIN0(NSIG,8)
      ASSIGN 120 TO TRA
      GO TO 180
  120 N = 0
      IF (V .GT. 0.) GO TO 121
      C(1) = MINUS
      N = 1
  121 C(N+1) = D(1)
      C(N+2) = DECPNT
      N = N + 2
      IF (NSIG .EQ. 1) GO TO 124
      DO 123 I = 2,NSIG
      N = N + 1
      C(N) = D(I)
  123 CONTINUE
  124 IF (EXP .GE. 0) C(N+1) = PLUS
      IF (EXP .LT. 0) C(N+1) = MINUS
      N = N + 1
      NUM = IABS(EXP)
      DO 125 I = 1,2
      J = NUM/10**(2-I)
      N = FW - (2-I)
      C(N) = J + 1
      NUM = NUM - J*10**(2-I)
  125 CONTINUE
      GO TO 150
C
C     STANDARD FORMAT CANNOT BE USED.
C
  130 IF (EXP.LT.NSIG .AND. EXP.GE.-NSIG) GO TO 136
      DO 131 I = 1,FW
      C(I) = ASTER
  131 CONTINUE
      GO TO 150
C
C     THE NUMBER CAN BE EXPRESSED WITHOUT AN EXPONENT.
C
  135 NSIG = MIN0(8,NSIG+3)
  136 ASSIGN 137 TO TRA
      GO TO 180
  137 N = 1
      IF (V .GT. 0.) GO TO 138
      C(1) = MINUS
      N = 2
  138 IF (EXP .GE. 0) GO TO 144
C
C     NEGATIVE EXPONENT
C
      J = NSIG
  141 D(J+1) = D(J)
      J = J - 1
      IF (J .NE. 0) GO TO 141
      D(1) = 1
      ASSIGN 142 TO TRA
      IF (NSIG+N .GE. FW) GO TO 180
      NSIG = NSIG + 1
  142 C(N+0) = D(1)
      C(N+1) = DECPNT
      N = N + 1 + IABS(EXP)
      DO 143 I = 2,NSIG
      C(N) = D(I)
      N = N + 1
  143 CONTINUE
      GO TO 150
C
C     POSITIVE EXPONENT.
C
  144 ASSIGN 145 TO TRA
      IF (NSIG+N .GE. FW) GO TO 180
  145 J = EXP + 1
      DO 146 I = 1,J
      C(N) = D(I)
      N = N + 1
  146 CONTINUE
      C(N) = DECPNT
      J = J + 1
      IF (J .GT. NSIG) GO TO 150
      DO 147 I = J,NSIG
      N = N + 1
      C(N) = D(I)
  147 CONTINUE
C
  150 XX = X
      YY = Y
      IF (FIELD.GT.0 .AND. NSIG.GT.1) GO TO 155
C
C     THE TYPED NUMBER IS NOT TO BE CENTERED AT (X,Y).
C
      DIR = XYD
      GO TO 160
C
C     THE TYPED NUMBER IS TO BE CENTERED AT (X,Y).
C
  155 XY = FW/2
      IF (FW/2 .EQ. (FW+1)/2) XY = XY - .5
      DIR = MAX0(1,IABS(XYD))
      IF (DIR .EQ. 1) XX = X - XY*CNTX
      IF (DIR .EQ. 2) YY = Y - XY*CNTY
C
C     TYPE THE NUMBER.
C
  160 CALL TYPE10 (XX,YY,DIR,C,FW,0)
      GO TO 200
C
C     ROUND THE NUMBER.
C
  180 IF (NSIG .EQ. 8) GO TO 190
      IF (D(NSIG+1) .LE. 5) GO TO 190
      J = NSIG
  181 D(J) = D(J) + 1
      IF (D(J) .LE. 10) GO TO 190
      D(J) = 1
      J = J - 1
      IF (J .NE. 0) GO TO 181
      IF (D(1) .NE. 1) GO TO 190
      J = NSIG - 1
  182 IF (J .EQ. 0) GO TO 183
      D(J+1) = D(J)
      J = J - 1
      GO TO 182
  183 D(1) = 2
      EXP = EXP + 1
  190 GO TO TRA, (120,137,142,145)
C
  200 RETURN
      END