File: seteq.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 (407 lines) | stat: -rw-r--r-- 12,803 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
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
      SUBROUTINE SETEQ (NAME1,NAME2,PREFX,DRY2,ITEST,IMORE,LIM)
C
C     SETS THE SUBSTRUCTURE NAME2 EQUIVALENT TO THE SUBSTRUCTURE NAME1.
C     THE OUTPUT VARIABLE ITEST TAKES ON ONE OF THE FOLLOWING VALUES
C
C         4  IF NAME1 DOES NOT EXIST
C         8  IF DRY DOES NOT EQUAL ZERO AND NAME2 OR ONE OF THE NEW
C            NAMES ALREADY EXISTS
C         9  IF DRY IS EQUAL TO ZERO AND NAME2 OR ONE OF THE NEW NAMES
C            DOES NOT EXIST
C         1  OTHERWISE
C
      IMPLICIT INTEGER (A-Z)
      EXTERNAL        LSHIFT,RSHIFT,ANDF,ORF,COMPLF
      LOGICAL         DITUP,MDIUP,MORE
      DIMENSION       NAME1(2),NAME2(2),ISAVE(50),NAMNEW(2),
     1                IMORE(1),NMSBR(2)
      CHARACTER       UFM*23,UWM*25,UIM*29
      COMMON /XMSSG / UFM,UWM,UIM
      COMMON /MACHIN/ MACH,IHALF,JHALF
      COMMON /ZZZZZZ/ BUF(1)
      COMMON /SOF   / DIT,DITPBN,DITLBN,DITSIZ,DITNSB,DITBL,
     1                IO ,IODUM(7),MDI,MDIPBN,MDILBN,MDIBL,
     2                NXTDUM(15),DITUP,MDIUP
      COMMON /SYS   / BLKSIZ,DIRSIZ,SYS(3),IFRST
      COMMON /OUTPUT/ TITLE(96),SUBTIT(96)
      COMMON /SYSTEM/ NBUFF,NOUT,DUM(36),NBPC,NBPW,NCPW
      COMMON /ITEMDT/ NITEM,ITEM(7,1)
      DATA    PS, SS, IB, LL, CS, HL, BB,   IRD, IWRT,  INDSBR  /
     1        1 , 1 , 1 ,  2,  2,  2,  1,     1,    2,      15  /
      DATA    IEMPTY, MASK,   NMSBR         /
     2        4H    , 4HMASK, 4HSETE,4HQ    /
C
      CALL CHKOPN (NMSBR(1))
      IF (NITEM+IFRST-1 .GT. 50) GO TO 970
      DRY   = DRY2
      ITEST = 1
      CALL FDSUB (NAME1(1),IND1)
      IF (IND1 .EQ. -1) GO TO 900
      MASK   = ANDF(MASK,2**(NBPW-4*NBPC)-1)
      MASKSS = COMPLF(LSHIFT(1023,10))
      MASKLL = COMPLF(LSHIFT(1023,20))
      MASKBB = LSHIFT(1023,20)
C
C     IF NAME2 EXISTS - VERIFY THAT IT IS MARKED EQUIVALENT TO NAME1.
C     NAME2 MAY ALREADY EXIST FOR RUN=GO OR OPTIONS=PA
C
      CALL FDSUB (NAME2(1),IND2)
      IF (IND2 .EQ. -1) GO TO 10
      DRY = 0
C
      CALL FMDI (IND2,IMDI)
      IPS = ANDF(BUF(IMDI+PS),1023)
      IF (IPS .EQ.    0) GO TO 920
      IF (IPS .EQ. IND1) GO TO 10
      CALL FMDI (IND1,IMDI)
      IPP = ANDF(BUF(IMDI+PS),1023)
      IF (IPS .NE. IPP) GO TO 920
C
C     STEP 1.  MAKE A LIST OF ALL THE SUBSTRUCTURES CONTRIBUTING TO THE
C     SUBSTRUCTURE NAME1, AND STORE IT IN THE ARRAY IMORE
C
   10 ITOP  = 1
      IMORE(ITOP) = IND1
      IPTR  = 1
   20 CALL FMDI (IND1,IMDI)
      I     = BUF(IMDI+LL)
      INDLL = RSHIFT(ANDF(I,1073741823),20)
      INDCS = RSHIFT(ANDF(I,1048575)   ,10)
      IF (INDLL .EQ. 0) GO TO 40
      DO 30 J = 1,ITOP
      IF (IMORE(J) .EQ. INDLL) GO TO 40
   30 CONTINUE
      ITOP  = ITOP + 1
      IF (ITOP .GT. LIM) GO TO 960
      IMORE(ITOP) = INDLL
   40 IF (INDCS.EQ.0 .OR. IPTR.EQ.1) GO TO 60
      DO 50 J = 1,ITOP
      IF (IMORE(J) .EQ. INDCS) GO TO 60
   50 CONTINUE
      ITOP  = ITOP + 1
      IF (ITOP .GT. LIM) GO TO 960
      IMORE(ITOP) = INDCS
   60 IF (IPTR .EQ. ITOP) GO TO 100
      IPTR  = IPTR + 1
      IND1  = IMORE(IPTR)
      GO TO 20
C
C     STEP 2.  CREATE AN IMAGE SUBSTRUCTURE FOR EACH SUBSTRUCTURE IN THE
C     ARRAY IMORE, AND STORE ITS INDEX IN THE ARRAY IMAGE.  NOTE THAT
C     SINCE IMORE(1) CONTAINS THE INDEX OF NAME1, IMAGE(1) WILL CONTAIN
C     THE INDEX OF NAME2
C     FOR EACH NEW NAME CHECK THAT MAKING ROOM FOR THE PREFIX DOES NOT
C     TRUNCATE THE NAME
C
  100 IF (IPTR .NE. 1) GO TO 110
      CALL FDSUB (NAME2(1),I)
      GO TO 120
  110 CALL FDIT (IND1,IDIT)
      FIRST = KLSHFT(KRSHFT(PREFX,NCPW-1),NCPW-1)
      REST  = KLSHFT(KRSHFT(BUF(IDIT),NCPW-3),NCPW-4)
      NAMNEW(1) = ORF(ORF(FIRST,REST),MASK)
      FIRST = KLSHFT(KRSHFT(BUF(IDIT),NCPW-4),NCPW-1)
      REST  = KLSHFT(KRSHFT(BUF(IDIT+1),NCPW-3),NCPW-4)
      NAMNEW(2)= ORF(ORF(FIRST,REST),MASK)
      IF (KHRFN1(IEMPTY,4,BUF(IDIT+1),4) .NE. IEMPTY)
     1    WRITE (NOUT,850) UWM,NAMNEW,BUF(IDIT),BUF(IDIT+1)
      CALL FDSUB (NAMNEW(1),I)
  120 IF (DRY .NE. 0) GO TO 130
      IF (I   .NE.-1) GO TO 170
      GO TO 910
  130 IF (I .EQ. -1) GO TO 150
      IPTR = IPTR + 1
      IF (IPTR .GT. ITOP) GO TO 920
      DO 140 I = IPTR,ITOP
      IMAGE = IMORE(LIM+I)
      CALL FDIT (IMAGE,IDIT)
      BUF(IDIT  ) = IEMPTY
      BUF(IDIT+1) = IEMPTY
      DITUP = .TRUE.
  140 CONTINUE
      GO TO 920
  150 IF (IPTR .NE. 1) GO TO 160
      CALL CRSUB (NAME2(1),I)
      GO TO 170
  160 CALL CRSUB (NAMNEW(1),I)
  170 IMORE(IPTR+LIM) = I
      IF (IPTR .EQ. 1) GO TO 200
      IPTR = IPTR - 1
      IND1 = IMORE(IPTR)
      GO TO 100
C
C     STEP 3.  BUILD THE MDI OF NAME2, AND OF ALL IMAGE SUBSTRUCTURES
C
  200 IND2 = I
  210 CALL FMDI (IND1,IMDI)
      DO 220 J = 1,DIRSIZ
      ISAVE(J) = BUF(IMDI+J)
  220 CONTINUE
C
C     SET THE SS ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND1
C
      IF (DRY .EQ. 0) GO TO 230
      BUF(IMDI+SS) = ORF(ANDF(BUF(IMDI+SS),MASKSS),LSHIFT(IND2,10))
      MDIUP = .TRUE.
  230 CALL FMDI (IND2,IMDI)
      IF (DRY .EQ. 0) GO TO 420
      I = ISAVE(PS)
C
C     SET THE PS ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
      IPS = ANDF(I,1023)
      IF (IPS .EQ. 0) GO TO 240
      BUF(IMDI+PS) = IPS
      GO TO 250
  240 BUF(IMDI+PS) = IND1
C
C     SET THE SS ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
  250 ISS = RSHIFT(ANDF(I,1048575),10)
      IF (ISS .EQ. 0) GO TO 260
      BUF(IMDI+SS) = ORF(ANDF(BUF(IMDI+SS),MASKSS),LSHIFT(ISS,10))
C
C     SET THE BB ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
  260 IBS = ANDF(I,MASKBB)
      BUF(IMDI+BB) = ORF(ANDF(BUF(IMDI+BB),MASKLL),IBS)
      I = ISAVE(LL)
C
C     SET THE HL ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
      IF (IPTR .EQ. 1) GO TO 300
      IHL = ANDF(I,1023)
      IF (IHL.EQ.0) GO TO 280
      ASSIGN 270 TO IRET
      IWANT = IHL
      GO TO 320
  270 BUF(IMDI+HL) = IFND
C
C     SET THE CS ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
  280 ICS = RSHIFT(ANDF(I,1048575),10)
      IF (ICS .EQ. 0) GO TO 300
      ASSIGN 290 TO IRET
      IWANT = ICS
      GO TO 320
  290 BUF(IMDI+CS) = ORF(ANDF(BUF(IMDI+CS),MASKSS),LSHIFT(IFND,10))
C
C     SET THE LL ENTRY FOR THE SUBSTRUCTURE WITH INDEX IND2
C
  300 ILL = RSHIFT(ANDF(I,1073741823),20)
      IF (ILL .EQ. 0) GO TO 400
      ASSIGN 310 TO IRET
      IWANT = ILL
      GO TO 320
  310 BUF(IMDI+LL) = ORF(ANDF(BUF(IMDI+LL),MASKLL),LSHIFT(IFND,20))
      GO TO 400
C
C     FIND THE INDEX OF THE IMAGE SUBSTRUCTURE TO THE SUBSTRUCTURE WITH
C     INDEX IWANT.  STORE THE FOUND INDEX IN IFND
C
  320 DO 330 K = 1,ITOP
      IF (IMORE(K) .NE. IWANT) GO TO 330
      IFND = IMORE(LIM+K)
      GO TO IRET, (270,290,310)
  330 CONTINUE
      GO TO 930
C
C     SET THE POINTERS OF THE ITEMS BELONGING TO THE SUBSTRUCTURE WITH
C     INDEX IND2
C
  400 DO 410 J = IFRST,DIRSIZ
  410 BUF(IMDI+J) = 0
  420 IF (IPTR .EQ. 1) GO TO 440
C
C     IMAGE SUBSTRUCTURE - SET POINTERS TO SHARED ITEMS AND SET IB BIT
C
      DO 430 J = 1,NITEM
      IF (ITEM(4,J) .NE. 0) GO TO 430
      ITM = J + IFRST - 1
      IF (BUF(IMDI+ITM) .EQ. 0) BUF(IMDI+ITM) = ISAVE(ITM)
  430 CONTINUE
      BUF(IMDI+IB) = ORF(BUF(IMDI+IB),LSHIFT(1,30))
      GO TO 500
C
C     SECONDARY SUBSTRUCTURE - SET POINTERS TO SHARED ITEMS
C
  440 DO 450 J = 1,NITEM
      IF (ITEM(5,J) .NE. 0) GO TO 450
      ITM = J + IFRST - 1
      IF (BUF(IMDI+ITM) .EQ. 0) BUF(IMDI+ITM) = ISAVE(ITM)
  450 CONTINUE
C
C     COPY APPROPRIATE ITEMS OF NAME1 AND WRITE THEM FOR
C     NAME2 AFTER CHANGING NAME1 TO NAME2 AND INSERTING THE NEW PREFIX
C     TO THE NAMES OF ALL CONTRIBUTING SUBSTRUCTURES
C
  500 DO 700 J = 1,NITEM
      IF (ITEM(3,J) .EQ. 0) GO TO 700
      KK = J + IFRST - 1
      IF (BUF(IMDI+KK) .NE. 0) GO TO 700
      IRDBL = ANDF(ISAVE(KK),JHALF)
      IF (IRDBL.NE.0 .AND. IRDBL.NE.JHALF) GO TO 510
      BUF(IMDI+KK) = ISAVE(KK)
      GO TO 700
  510 CALL SOFIO (IRD,IRDBL,BUF(IO-2))
      CALL FDIT (IND2,IDIT)
      BUF(IO+1) = BUF(IDIT  )
      BUF(IO+2) = BUF(IDIT+1)
      CALL GETBLK (0,IWRTBL)
      IF (IWRTBL .EQ. -1) GO TO 940
      NEWBLK = IWRTBL
      NUMB = ITEM(3,J)/1000000
      MIN  = (ITEM(3,J) - NUMB*1000000)/1000
      INC  = ITEM(3,J) - NUMB*1000000 - MIN*1000
      NUMB = BUF(IO+NUMB)
      IF (NUMB.GT.1 .OR. ILL.NE.0 .OR. IPTR.NE.1) GO TO 530
C
C     BASIC SUBSTRUCTURE
C
      BUF(IO+MIN  ) = NAME2(1)
      BUF(IO+MIN+1) = NAME2(2)
      MORE = .FALSE.
      GO TO 580
C
C     NOT A BASIC SUBSTRUCTURE
C
  530 IF (NUMB .LE. (BLKSIZ-MIN+1)/INC) GO TO 540
      NUMB = NUMB - (BLKSIZ-MIN+1)/INC
      MAX  = BLKSIZ
      MORE = .TRUE.
      GO TO 550
  540 MAX  = MIN + INC*NUMB - 1
      MORE = .FALSE.
C
C     INSERT THE NEW PREFIX TO THE NAMES OF ALL CONTRIBUTING SUBSTRUC-
C     TURES
C     IF THE COMPONENT IS FOR MODAL DOF ON THE SECONDARY SUBSTRUCTURE,
C     USE THE ACTUAL NAME INSTEAD OF ADDING A PREFIX
C
  550 DO 570 K = MIN,MAX,INC
      IF (BUF(IO+K).EQ.NAME1(1) .AND. BUF(IO+K+1).EQ.NAME1(2))
     1    GO TO 560
      FIRST = KLSHFT(KRSHFT(PREFX,NCPW-1),NCPW-1)
      REST  = KLSHFT(KRSHFT(BUF(IO+K  ),NCPW-3),NCPW-4)
      FIRST2= KLSHFT(KRSHFT(BUF(IO+K  ),NCPW-4),NCPW-1)
      REST2 = KLSHFT(KRSHFT(BUF(IO+K+1),NCPW-3),NCPW-4)
      BUF(IO+K  ) = ORF(ORF(FIRST ,REST ),MASK)
      BUF(IO+K+1) = ORF(ORF(FIRST2,REST2),MASK)
      GO TO 570
C
  560 BUF(IO+K  ) = NAME2(1)
      BUF(IO+K+1) = NAME2(2)
  570 CONTINUE
C
C     WRITE OUT UPDATED DATA BLOCK
C
  580 CALL SOFIO (IWRT,IWRTBL,BUF(IO-2))
      CALL FNXT (IRDBL,INXT)
      IF (MOD(IRDBL,2) .EQ. 1) GO TO 590
      NEXT = ANDF(RSHIFT(BUF(INXT),IHALF),JHALF)
      GO TO 600
  590 NEXT = ANDF(BUF(INXT),JHALF)
  600 IF (NEXT .EQ. 0) GO TO 620
C
C     MORE BLOCKS TO COPY
C
      IRDBL = NEXT
      CALL GETBLK (IWRTBL,NEXT)
      IF (NEXT.NE.-1) GO TO 610
      CALL RETBLK (NEWBLK)
      GO TO 940
  610 IWRTBL = NEXT
      CALL SOFIO (IRD,IRDBL,BUF(IO-2))
      MIN = 1
      IF (MORE) GO TO 530
      GO TO 580
C
C     NO MORE BLOCKS TO COPY.  UPDATE MDI OF NAME2
C
  620 BUF(IMDI+KK) = ORF(LSHIFT(RSHIFT(ISAVE(KK),IHALF),IHALF),NEWBLK)
  700 CONTINUE
C
      MDIUP = .TRUE.
      IF (IPTR .EQ. ITOP) GO TO 720
      IPTR = IPTR + 1
      IND1 = IMORE(IPTR    )
      IND2 = IMORE(IPTR+LIM)
      GO TO 210
C
C     WRITE USER MESSAGES
C
  720 IF(DRY .EQ. 0) GO TO 780
      DO 730 I = 1,96
  730 SUBTIT(I) = IEMPTY
      CALL PAGE
      CALL PAGE2 (-4)
      WRITE (NOUT,800) NAME2,NAME1
      IMAGE = IMORE(LIM+1)
      CALL FMDI (IMAGE,IMDI)
      IPS = ANDF(BUF(IMDI+1),1023)
      CALL FDIT (IPS,I)
      CALL PAGE2 (-2)
      WRITE (NOUT,810) NAME2,BUF(I),BUF(I+1)
      IPTR = 2
      IF (IPTR .GT. ITOP) GO TO 990
      CALL PAGE2 (-2)
      WRITE (NOUT,820)
  740 DO 750 I = 1,16
  750 IMORE(I) = IEMPTY
      J = 1
  760 IMAGE = IMORE(IPTR+LIM)
      CALL FDIT (IMAGE,I)
      IMORE(J  ) = BUF(I  )
      IMORE(J+1) = BUF(I+1)
      IPTR = IPTR + 1
      IF (IPTR .GT. ITOP) GO TO 770
      J = J + 2
      IF (J .LT. 16) GO TO 760
  770 CALL PAGE2 (-2)
      WRITE (NOUT,830) (IMORE(J),J=1,16)
      IF (IPTR .LE. ITOP) GO TO 740
      GO TO 990
C
C     DRY RUN - PRINT MESSAGE INDICATING ONLY ADDITIONS MADE
C
  780 CALL PAGE2 (-3)
      WRITE (NOUT,840) UIM,NAME2,NAME1,NAME2
      GO TO 990
C
  800 FORMAT (32X,67HS U B S T R U C T U R E   E Q U I V A L E N C E   O
     1 P E R A T I O N ,///23X,13HSUBSTRUCTURE ,2A4,56H HAS BEEN CREATED
     2 AND MARKED EQUIVALENT TO SUBSTRUCTURE ,2A4)
  810 FORMAT (1H0,22X,28HTHE PRIMARY SUBSTRUCTURE OF ,2A4,4H IS ,2A4)
  820 FORMAT (1H0,22X, 56HTHE FOLLOWING IMAGE SUBSTRUCTURES HAVE BEEN GE
     1NERATED --)
  830 FORMAT (1H0,22X,10(2A4,2X))
  840 FORMAT (A29,' 6228, SUBSTRUCTURE ',2A4,' IS ALREADY AN EQUIVALENT'
     1,      ' SUBSTRUCTURE TO ',2A4, /36X,'ONLY ITEMS NOT PREVIOUSLY ',
     2       'EXISTING FOR ',2A4,' HAVE BEEN MADE EQUIVALENT.')
  850 FORMAT (A25,' 6236, DURING THE CREATION OF A NEW IMAGE SUBSTRUC',
     1       'TURE NAMED ',2A4,' THE LAST CHARACTER ', /5X,
     2       'OF SUBSTRUCTURE NAMED ',2A4,' WAS TRUNCATED TO MAKE ROOM',
     3       ' FOR THE PREFIX.')
C
C     ERROR CONDITIONS
C
  900 ITEST = 4
      GO TO 990
  910 ITEST = 9
      GO TO 990
  920 ITEST = 8
      GO TO 990
  930 CALL ERRMKN (INDSBR,3)
  940 WRITE  (NOUT,950) UFM
  950 FORMAT (A23,' 6223, SUBROUTINE SETEQ - THERE ARE NO MORE FREE ',
     1        'BLOCKS AVAILABLE ON THE SOF.')
      K = -37
      GO TO 980
  960 K = -8
      GO TO 980
  970 CALL ERRMKN (INDSBR,10)
  980 CALL SOFCLS
      CALL MESAGE (K,0,NMSBR)
C
  990 RETURN
      END