File: sofint.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 (330 lines) | stat: -rw-r--r-- 10,926 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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
      SUBROUTINE SOFINT (IB1,IB2,NUMB,IBL1)
C
C     CALLED ONCE BY EVERY RUN USING THE SOF UTILITY SUBROUTINES.
C     SHOULD BE CALLED BEFORE ANY OF THEM IS CALLED.  IF THE SOF IS
C     NOT EMPTY, SOME SECURITY CHECKS WILL BE TAKEN CARE OF, AND THE
C     SOF COMMON BLOCKS WILL BE UPDATED AND WRITTEN OUT ON THE FIRST
C     BLOCK OF EACH OF THE SOF FILES.  IF THE SOF IS EMPTY, THE DIT
C     MDI, AND ARRAY NXT WILL BE INITIALIZED AND WRITTEN OUT ON THE
C     THIRD, FOURTH, AND SECOND BLOCKS OF THE FIRST FILE OF THE SOF,
C     AND THE SOF COMMON BLOCKS WILL BE INITIALIZED AND WRITTEN OUT
C     ON THE FIRST BLOCK OF EACH OF THE SOF FILES.
C
C     THE FIRST BLOCK OF EACH OF THE SOF FILES CONTAINS THE FOLLOWING
C     INFORMATION
C       WORD                   WORD                   WORD
C      NUMBER  CONTENTS       NUMBER  CONTENTS       NUMBER  CONTENTS
C      ------  --------       ------  --------       ------  --------
C       1- 2   PASSWORD          26   DIRSIZ            32   MDIBL
C          3   FILE NUMBER       27   SUPSIZ            33   NXTTSZ
C          4   NFILES            28   AVBLKS         34-43   NXTFSZ
C       5-14   FILNAM            29   DITSIZ            44   NXTCUR
C      15-24   FILSIZ            30   DITNSB            45   NXTRST
C         25   BLKSIZ            31   DITBL             46   HIBLK
C                                                       47   IFRST
C
C     STARTING AT LOCATION 100 THE CONTENTS OF THE ITEMDT COMMON BLOCK
C     ARE STORED
C
C
      EXTERNAL        LSHIFT,RSHIFT,ORF
      LOGICAL         FIRST
      INTEGER         FILNAM,FILSIZ,STATUS,FILE,PSSWRD,ORF,HIBLK,
     1                BUF,RSHIFT,NAME(2)
      CHARACTER       UFM*23,UWM*25,UIM*29,SFM*25,SWM*27,SIM*31
      COMMON /XMSSG / UFM,UWM,UIM,SFM,SWM,SIM
      COMMON /MACHIN/ MAC,IHALF
      COMMON /ZZZZZZ/ BUF(1)
      COMMON /SOFCOM/ NFILES,FILNAM(10),FILSIZ(10),STATUS,PSSWRD(2),
     1                FIRST
      COMMON /SYSTEM/ NBUFF,NOUT,X1(36),NBPC,NBPW,NCPW
      COMMON /SYS   / NSBUFF,X4(3),HIBLK,IFRST
      COMMON /ITEMDT/ NITEM,ITEM(7,1)
      DATA    IRD,IWRT    /1, 2  /
      DATA    IEMPTY,NAME /4H    ,4HSOFI,4HNT  /
C
      IF (NCPW .LE. 4) GO TO 5
      N = NBPW - NBPC*4
      DO 3 I = 1,10
      FILNAM(I) = LSHIFT(RSHIFT(FILNAM(I),N),N)
    3 CONTINUE
    5 IF (NFILES .LE. 0) GO TO 1000
      IF (STATUS .EQ. 0) GO TO 250
C
C     THE SOF IS NOT EMPTY.  READ THE FIRST BLOCK OF THE FIRST SOF FILE
C     AND VERIFY THE SECURITY VARIABLES.
C
      FILE = FILNAM(1)
      CALL SOFIO (IRD,1,BUF(IB1-2))
      IF ((BUF(IB1+1).NE.PSSWRD(1)) .OR. (BUF(IB1+2).NE.PSSWRD(2)))
     1     GO TO 1050
      IF (BUF(IB1+3) .NE. 1) GO TO 1060
      IF (BUF(IB1+25) .NE. NSBUFF) GO TO 1040
C
C     CHECK IF THE SPECIFIED NUMBER OF FILES AND THEIR SIZES IS ADEQUATE
C
      IF (BUF(IB1+4) .GE. NFILES) GO TO 10
      MAX = BUF(IB1+4) - 1
      GO TO 20
   10 MAX = NFILES - 1
   20 IF (MAX .LT. 1) GO TO 50
      DO 30 I = 1,MAX
      IF (BUF(IB1+14+I) .EQ. FILSIZ(I)) GO TO 30
      FILE = FILNAM(I)
      GO TO 1070
   30 CONTINUE
C
C     CHECK IF ALL SOF FILES HAVE THE CORRECT PASSWORD AND SEQUENCE
C     NUMBER
C
      MAX = MAX + 1
      IBL = 1
      DO 40 I = 2,MAX
      FILE = FILNAM(I)
      IBL  = IBL + FILSIZ(I-1)
      CALL SOFIO (IRD,IBL,BUF(IB1-2))
      IF ((BUF(IB1+1).NE.PSSWRD(1)) .OR. (BUF(IB1+2).NE.PSSWRD(2)))
     1     GO TO 1050
      IF (BUF(IB1+3) .NE. I) GO TO 1060
   40 CONTINUE
      CALL SOFIO (IRD,1,BUF(IB1-2))
      MAX = MAX - 1
   50 IF (BUF(IB1+14+MAX+1) .EQ. FILSIZ(MAX+1)) GO TO 130
      MAXNXT = 0
      IF (MAX .LT. 1) GO TO 70
      DO 60 I = 1,MAX
      MAXNXT = MAXNXT+BUF(IB1+33+I)
   60 CONTINUE
   70 LASTSZ = (FILSIZ(MAX+1)-1)/BUF(IB1+27)
      IF (FILSIZ(MAX+1)-1 .EQ. LASTSZ*BUF(IB1+27)) GO TO 80
      LASTSZ = LASTSZ + 1
   80 MAXNXT = MAXNXT + LASTSZ
      IF (BUF(IB1+33) .GT. MAXNXT) GO TO 1080
      MAXOLD = MAXNXT - LASTSZ + BUF(IB1+33+MAX+1)
      IF (BUF(IB1+33) .NE. MAXOLD) GO TO 130
      IF (BUF(IB1+14+MAX+1) .GT. FILSIZ(MAX+1)) GO TO 1080
      LSTSIZ = MOD(BUF(IB1+14+MAX+1)-2,BUF(IB1+27)) + 1
      IF (LSTSIZ .EQ. BUF(IB1+27)) GO TO 130
C
C     THE SIZE OF THE LAST SUPERBLOCK THAT WAS USED ON FILE (MAX+1)
C     SHOULD BE INCREASED.
C
      IF (FILSIZ(MAX+1)-BUF(IB1+14+MAX+1) .GE. BUF(IB1+27)-LSTSIZ)
     1    GO TO 90
      NUMB = FILSIZ(MAX+1) - BUF(IB1+14+MAX+1)
      GO TO 100
   90 NUMB = BUF(IB1+27) - LSTSIZ
  100 IBL1 = 0
      IF (MAX .LT. 1) GO TO 120
      DO 110 I = 1,MAX
      IBL1 = IBL1 + FILSIZ(I)
  110 CONTINUE
  120 IBL1 = IBL1 + BUF(IB1+14+MAX+1) + 1
      GO TO 135
  130 NUMB = 0
C
C     UPDATE THE VARIABLE WHICH INDICATES THE NUMBER OF FREE BLOCKS ON
C     THE SOF.
C
  135 IF (NFILES-BUF(IB1+4)) 140,160,170
  140 IDIFF = BUF(IB1+14+NFILES) - FILSIZ(NFILES)
      MIN   = NFILES + 1
      LAST  = BUF(IB1+4)
      DO 150 I = MIN,LAST
      IDIFF = IDIFF + BUF(IB1+14+I)
  150 CONTINUE
      GO TO 190
  160 IDIFF = BUF(IB1+14+NFILES) - FILSIZ(NFILES)
      GO TO 190
  170 IHERE1 = BUF(IB1+4)
      IDIFF  = BUF(IB1+14+IHERE1) - FILSIZ(IHERE1)
      MIN    = BUF(IB1+4) + 1
      DO 180 I = MIN,NFILES
      IDIFF = IDIFF - FILSIZ(I)
  180 CONTINUE
  190 BUF(IB1+28) = BUF(IB1+28) - IDIFF
C
C     IF NO ITEM STRUCTURE IS ON THE SOF (THE SOF WAS CREATED BEFORE
C     LEVEL 17.0) THEN USE THE LEVEL 16.0 ITEM STRUCTURE.
C
      IF (BUF(IB1+100).GT.0 .AND. BUF(IB1+100).LE.100) GO TO 198
      WRITE (NOUT,6235) UWM
      BUF(IB1+ 47) = 3
      BUF(IB1+100) = 18
      K = 100
      DO 194 I = 1,18
      DO 192 J = 1,7
  192 BUF(IB1+K+J) = ITEM(J,I)
  194 K = K + 7
      GO TO 200
C
C     CHECK IF THE DIRECTORY SIZE HAS BEEN CHANGED
C
  198 IF (NITEM .EQ. BUF(IB1+100)) GO TO 200
      WRITE (NOUT,6233) UWM
C
C     UPDATE THE COMMON BLOCKS USED BY THE SOF UTILITY SUBROUTINES.
C
  200 BUF(IB1+4) = NFILES
      DO 210 I = 1,NFILES
      BUF(IB1+4 +I) = FILNAM(I)
      BUF(IB1+14+I) = FILSIZ(I)
      BUF(IB1+33+I) = (FILSIZ(I)-1)/BUF(IB1+27)
      IF (FILSIZ(I)-1 .EQ. BUF(IB1+33+I)*BUF(IB1+27)) GO TO 210
      BUF(IB1+33+I) = BUF(IB1+33+I) + 1
  210 CONTINUE
C
C     WRITE THE UPDATED ARRAY A ON THE FIRST BLOCK OF EACH OF THE SOF
C     FILES.
C
      IBL = 1
      DO 220 I = 1,NFILES
      BUF(IB1+3) = I
      CALL SOFIO (IWRT,IBL,BUF(IB1-2))
      IBL = IBL + FILSIZ(I)
  220 CONTINUE
      GO TO 340
C
C     THE SOF IS EMPTY.  INITIALIZE THE SOF COMMON BLOCKS WHICH ARE
C     STORED IN THE ARRAY A.
C     CHECK IF THE NASTRAN BUFFER SIZE IS LARGE ENOUGH
C
  250 MIN = 100 + 7*NITEM + (NBUFF-NSBUFF)
      IF (NBUFF .LT. MIN) GO TO 1090
      LAST  = NBUFF - 4
      HIBLK = 0
      IFRST = 3
      DO 255 I = 1,LAST
  255 BUF(IB1+ I) = 0
      BUF(IB1+ 1) = PSSWRD(1)
      BUF(IB1+ 2) = PSSWRD(2)
      BUF(IB1+25) = NSBUFF
      BUF(IB1+26) = NITEM + IFRST - 1
      BUF(IB1+27) = 2*(BUF(IB1+25)-1)
      BUF(IB1+28) = -4
      DO 260 I = 1,NFILES
      BUF(IB1+28) = BUF(IB1+28) + FILSIZ(I)
  260 CONTINUE
      BUF(IB1+29) = 0
      BUF(IB1+30) = 0
      BUF(IB1+31) = 3
      BUF(IB1+32) = 4
      BUF(IB1+33) = 1
      BUF(IB1+44) = 1
      BUF(IB1+45) = 0
      BUF(IB1+46) = 4
      BUF(IB1+47) = IFRST
C
      BUF(IB1+100) = NITEM
      K = 100
      DO 280 I = 1,NITEM
      DO 270 J = 1,7
  270 BUF(IB1+K+J) = ITEM(J,I)
  280 K = K + 7
C
C     INITIALIZE THE ARRAY NXT AND WRITE IT ON THE SECOND BLOCK OF THE
C     FIRST SOF FILE.
C
      DO 300 I = 1,LAST
      BUF(IB2+I) = 0
  300 CONTINUE
      IF (BUF(IB1+27)+1 .GT. FILSIZ(1)) GO TO 302
      MAX = BUF(IB1+25) - 1
      BUF(IB2+MAX+1) = LSHIFT(BUF(IB1+27)+1,IHALF)
      BUF(IB2+1) = BUF(IB1+27) + 1
      GO TO 308
  302 IF (MOD(FILSIZ(1),2) .EQ. 1) GO TO 304
      MAX = FILSIZ(1)/2
      GO TO 306
  304 MAX = (FILSIZ(1)-1)/2
      BUF(IB2+MAX+1) = LSHIFT(FILSIZ(1),IHALF)
  306 BUF(IB2+1) = FILSIZ(1)
  308 BUF(IB2+1) = ORF(BUF(IB2+1),LSHIFT(5,IHALF))
      BUF(IB2+2) = 0
      BUF(IB2+3) = 6
      DO 310 I = 4,MAX
      BUF(IB2+I) = 2*I
      BUF(IB2+I) = ORF(BUF(IB2+I),LSHIFT(2*I-1,IHALF))
  310 CONTINUE
      CALL SOFIO (IWRT,1,BUF(IB2-2))
      CALL SOFIO (IWRT,2,BUF(IB2-2))
C
C     INITIALIZE THE DIT AND WRITE IT ON THE THIRD BLOCK OF THE FIRST
C     SOF FILE.
C
      DO 320 I = 1,LAST
      BUF(IB2+I) = IEMPTY
  320 CONTINUE
      CALL SOFIO (IWRT,3,BUF(IB2-2))
C
C     INITIALIZE THE MDI AND WRITE IT ON THE FOURTH BLOCK OF THE FIRST
C     SOF FILE.
C
      DO 330 I = 1,LAST
      BUF(IB2+I) = 0
  330 CONTINUE
      CALL SOFIO (IWRT,4,BUF(IB2-2))
      NUMB = 0
      GO TO 200
C
C     PRINT MESSAGE INDICATING THE STATUS OF THE CURRENT SOF FILES.
C
  340 WRITE (NOUT,360) SIM,NFILES
      DO 350 I = 1,NFILES
      WRITE (NOUT,370) I,FILSIZ(I)
  350 CONTINUE
      WRITE  (NOUT,380) BUF(IB1+25)
  360 FORMAT (A31,' 6201,',I3,' FILES HAVE BEEN ALLOCATED TO THE SOF ',
     1       'WHERE --')
  370 FORMAT (18H     SIZE OF FILE ,I2,3H = ,I10,7H BLOCKS)
  380 FORMAT (32H     AND WHERE A BLOCK CONTAINS ,I4,6H WORDS)
      RETURN
C
C     ERROR MESSAGES.
C
 1000 WRITE  (NOUT,1001) SFM
 1001 FORMAT (A25,' 6202.  THE REQUESTED NO. OF FILES IS NON POSITIVE.')
      CALL MESAGE (-37,0,NAME(1))
      RETURN
C
 1040 I = (NBUFF-NSBUFF) + BUF(IB1+25)
      WRITE  (NOUT,1041) UFM,I
 1041 FORMAT (A23,' 6205, SUBROUTINE SOFINT - THE BUFFER SIZE HAS BEEN',
     1       ' MODIFIED.', /30X,
     2       'THE CORRECT NASTRAN PARAMETER IS BUFFSIZE = ',I6)
      GO TO 1082
C
 1050 WRITE  (NOUT,1051) UFM,FILE
 1051 FORMAT (A23,' 6206, SUBROUTINE SOFINT - WRONG PASSWORD ON SOF ',
     1       'FILE ',A4,1H.)
      GO TO 1082
C
 1060 WRITE  (NOUT,1061) UFM,FILE
 1061 FORMAT (A23,' 6207, SUBROUTINE SOFINT - THE SOF FILE ',A4,
     1       ' IS OUT OF SEQUENCE.')
      GO TO 1082
C
 1070 WRITE  (NOUT,1071) UFM,FILE
 1071 FORMAT (A23,' 6208, SUBROUTINE SOFINT - THE SIZE OF THE SOF FILE '
     1,       A4,' HAS BEEN MODIFIED.')
      GO TO 1082
C
 1080 WRITE  (NOUT,1081) UFM,FILE
 1081 FORMAT (A23,' 6209, SUBROUTINE SOFINT - THE NEW SIZE OF FILE ',A4,
     1       ' IS TOO SMALL.')
 1082 CALL MESAGE (-61,0,0)
C
 1090 WRITE  (NOUT,1091) UFM,MIN
 1091 FORMAT (A23,' 6234, THE NASTRAN BUFFER SIZE IS TO SMALL FOR THE',
     1       ' SOF FILE.', /30X,'MINIMUM BUFFER SIZE IS ',I10)
      GO TO 1082
C
 6233 FORMAT (A25,' 6233, THE ITEM STRUCTURE HAS BEEN CHANGED FOR THE ',
     1       'SOF.', /32X,'NEW CAPABILITIES USING THESE ITEMS MAY NOT ',
     2       'BE USED WITH THIS SOF.')
C
 6235 FORMAT (A25,'6235, THE OLD SOF CONTAINS NO ITEM STRUCTURE ',
     1       'INFORMATION.', /27X,'THE LEVEL 16.0 ITEM STRUCTURE WILL ',
     2       'BE USED.')
C
      END