File: dstroy.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 (307 lines) | stat: -rw-r--r-- 9,769 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
      SUBROUTINE DSTROY (NAME,ITEST,IMAGE,IMORE,LIM)
C
C     DESTROYS THE SUBSTRUCTURE NAME BY DELETING ITS DIRECTORY FROM THE
C     MDI AND ITS NAME FROM THE DIT.  NO OPERATION WILL TAKE PLACE IF
C     NAME IS AN IMAGE SUBSTRUCTURE.  IF NAME IS A SECONDARY SUBSTRUC-
C     TURE, IT IS DELETED FROM THE LIST OF SECONDARY SUBSTRUCTURES TO
C     WHICH IT BELONGS, AND ITS IMAGE CONTRIBUTING TREE IS DESTROYED.
C     IF NAME IS A PRIMARY SUBSTRUCTURE, ALL ITS SECONDARY SUBSTRUCTURES
C     ARE ALSO DESTROYED.  IN ALL CASES, ALL THE SUBSTRUCTURES DERIVED
C     FROM THE SUBSTRUCTURE BEING DESTROYED ARE ALSO DESTROYED, AND
C     CONNECTIONS WITH OTHER SUBSTRUCTURES ARE DELETED.
C
C     THE BLOCKS OCCUPIED BY THE ITEM ARE RETURNED TO THE LIST OF FREE
C     BLOCKS IF THEY BELONG TO THE SPECIFIED SUBSTRUCTURE
C
C     THE OUTPUT VARIABLE ITEST TAKES ONE OF THE FOLLOWING VALUES.
C        1  NORMAL RETURN
C        4  IF NAME DOES NOT EXIST
C        6  IF NAME IS AN IMAGE SUBSTRUCTURE
C
      EXTERNAL        LSHIFT,RSHIFT,ANDF,ORF,COMPLF
      LOGICAL         DITUP,MDIUP
      INTEGER         BUF,DIT,DITPBN,DITLBN,DITSIZ,DITNSB,DITBL,
     1                MDI,MDIPBN,MDILBN,MDIBL,BLKSIZ,DIRSIZ,PS,SS,IS,
     2                LL,CS,HL,ANDF,ORF,RSHIFT,COMPLF
      DIMENSION       NAME(2),IMAGE(1),IMORE(1),NMSBR(2)
      COMMON /ZZZZZZ/ BUF(1)
      COMMON /SOF   / DIT,DITPBN,DITLBN,DITSIZ,DITNSB,DITBL,
     1                IODUM(8),MDI,MDIPBN,MDILBN,MDIBL,
     2                NXTDUM(15),DITUP,MDIUP
      COMMON /SYS   / BLKSIZ,DIRSIZ,SYS(3),IFRST
      COMMON /ITEMDT/ NITEM,ITEM(7,1)
      DATA    PS,SS,  IS,LL,CS,HL / 1,1,1,2,2,2    /
      DATA    IEMPTY/ 4H    /
      DATA    INDSBR/ 3     /, NMSBR /4HDSTR,4HOY  /
C
      CALL CHKOPN (NMSBR(1))
      ITEST = 1
      ITOP  = 0
      IMTOP = 0
      CALL FDSUB (NAME(1),INDEX)
      IF (INDEX .EQ. -1) GO TO 1000
      MASKM = COMPLF(LSHIFT(1023,10))
      MASKL = COMPLF(LSHIFT(1023,20))
C                           1023 = 2**10 - 1
C
C     SAVE ALL CONNECTIONS WITH OTHER SUBSTRUCTURES.
C
   10 CALL FMDI (INDEX,IMDI)
   20 I     = BUF(IMDI+PS)
      INDPS = ANDF(I,1023)
      INDSS = RSHIFT(ANDF(I,1048575),10)
C                           1048575 = 2**20 - 1
      INDIS = ANDF(I,1073741824)
C                    1073741824 = 2**30
      I     = BUF(IMDI+LL)
      INDHL = ANDF(I,1023)
      INDCS = RSHIFT(ANDF(I,1048575),10)
      INDLL = RSHIFT(ANDF(I,1073741823),20)
C                           1073741823 = 2**30 - 1
      IF (INDIS .GT. 0) GO TO 1010
      IF (INDPS .EQ. 0) GO TO 60
      ASSIGN 30 TO IRET1
      GO TO 300
C
C     REMOVE INDEX FROM THE LIST OF SUBSTRUCTURES THAT ARE SECONDARY TO
C     INDPS.
C
   30 ISAVE = INDPS
   40 CALL FMDI (ISAVE,IMDI)
      ISAVE = RSHIFT(ANDF(BUF(IMDI+SS),1048575),10)
      IF (ISAVE .EQ. 0) GO TO 50
      IF (ISAVE .NE. INDEX) GO TO 40
      BUF(IMDI+SS) = ORF(ANDF(BUF(IMDI+SS),MASKM),LSHIFT(INDSS,10))
      MDIUP = .TRUE.
      IF (INDLL .EQ. 0) GO TO 120
      ILL   = INDLL
      INDLL = 0
      ISAVE = INDEX
   50 ASSIGN 120 TO IRET2
      GO TO 330
C
C     PRIMARY SUBSTRUCTURE.
C     RETURN THE BLOCKS USED BY ALL ITEMS TO THE LIST OF FREE BLOCKS.
C
   60 DO 70 J = IFRST,DIRSIZ
      IBL = ANDF(BUF(IMDI+J),65535)
C                            65535 = 2**16 - 1
      IF (IBL.GT.0 .AND. IBL.NE.65535) CALL RETBLK (IBL)
   70 CONTINUE
      IF (INDSS .EQ. 0) GO TO 130
C
C     THE PRIMARY SUBSTRUCTURE BEING DESTROYED HAS SECONDARY EQUIVALENT
C     SUBSTRUCTURES.  MUST DESTROY ALL OF THEM.
C
      ASSIGN 320 TO IRET1
      ASSIGN 90  TO IRET2
      ISV   = INDSS
   80 ISAVE = ISV
      CALL FMDI (ISAVE,IMDI)
      ISV = RSHIFT(ANDF(BUF(IMDI+SS),1048575),10)
      IIS = ANDF(BUF(IMDI+IS),1073741824)
      IF (IIS .GT. 0) GO TO 110
C
C     THE SECONDARY SUBSTRUCTURE IS NOT AN IMAGE SUBSTRUCTURE.  ADD ITS
C     INDEX TO THE LIST (IMORE) OF SUBSTRUCTURES TO BE DESTROYED LATER.
C
      ITOP = ITOP + 1
      IF (ITOP .GT. LIM) GO TO 1030
      IMORE(ITOP) = ISAVE
      GO TO 300
C
C     UPDATE THE MDI OF THE SECONDARY SUBSTRUCTURE WITH INDEX ISAVE.
C
   90 CALL FMDI (ISAVE,IMDI)
      BUF(IMDI+PS) = 0
      BUF(IMDI+LL) = ANDF(BUF(IMDI+LL),MASKL)
      DO 100 J = IFRST,DIRSIZ
      BUF(IMDI+J) = 0
  100 CONTINUE
      MDIUP = .TRUE.
  110 IF (ISV .NE. 0) GO TO 80
C
C     BACK TO THE SUBSTRUCTURE WITH INDEX  INDEX .
C     DELETE ITS DIRECTORY FROM THE MDI.
C
  120 CALL FMDI (INDEX,IMDI)
  130 DO 140 J = 1,DIRSIZ
      BUF(IMDI+J) = 0
  140 CONTINUE
      MDIUP = .TRUE.
C
C     DELETE SUBSTRUCTURE NAME FROM THE DIT.
C
      CALL FDIT (INDEX,JDIT)
      BUF(JDIT  ) = IEMPTY
      BUF(JDIT+1) = IEMPTY
      DITUP = .TRUE.
      IF (INDEX*2 .NE. DITSIZ) GO TO 150
      DITSIZ = DITSIZ - 2
  150 DITNSB = DITNSB - 1
      IF (INDCS .EQ. 0) GO TO 180
C
C     DELETE LINK THROUGH COMBINED SUBSTRUCTURES, AND REMOVE ITEMS
C     CREATED AS A RESULTS OF THE COMBINE OR REDUCE.
C     THESE ITEMS WILL BE RETURNED TO THE LIST OF FREE BLOCKS.
C
  160 IF (INDCS .EQ. INDEX) GO TO 180
      CALL FMDI (INDCS,IMDI)
      INDCS = RSHIFT(ANDF(BUF(IMDI+CS),1048575),10)
  173 BUF(IMDI+HL) = ANDF(BUF(IMDI+HL),COMPLF(1023))
      BUF(IMDI+CS) = ANDF(BUF(IMDI+CS),MASKM)
      DO 176 J = 1,NITEM
      IF (ITEM(6,J) .EQ. 0) GO TO 176
      ITM = J + IFRST - 1
      IBL = ANDF(BUF(IMDI+ITM),65535)
      IF (IBL.GT.0 .AND. IBL.NE.65535) CALL RETBLK (IBL)
      BUF(IMDI+ITM) = 0
  176 CONTINUE
      MDIUP = .TRUE.
      IF (INDCS .EQ. 0) GO TO 1020
      GO TO 160
  180 IF (INDLL .EQ. 0) GO TO 190
C
C     SUBSTRUCTURE WAS THE RESULT OF COMBINING LOWER LEVEL SUBSTRUCTURES
C     TOGETHER.  UPDATE THE MDI ACCORDINGLY.
C
      CALL FMDI (INDLL,IMDI)
      INDCS = RSHIFT(ANDF(BUF(IMDI+CS),1048575),10)
      INDEX = INDLL
      INDLL = 0
      IF (INDCS .EQ. 0) INDCS = INDEX
      GO TO 173
  190 IF (INDHL .EQ. 0) GO TO 220
C
C     A HIGHER LEVEL SUBSTRUCTURE WAS DERIVED FROM THE ONE BEING
C     DESTROYED. DESTROY THE HIGHER LEVEL SUBSTRUCTURE.
C
      INDEX = INDHL
      CALL FMDI (INDEX,IMDI)
      BUF(IMDI+LL) = ANDF(BUF(IMDI+LL),MASKL)
      MDIUP = .TRUE.
      GO TO 20
  220 IF (ITOP .EQ. 0) RETURN
C
C     MORE SUBSTRUCTURES TO DESTROY.
C
      INDEX = IMORE(ITOP)
      ITOP  = ITOP - 1
      GO TO 10
C
C     INTERNAL SUBROUTINE.
C     RETURN TO THE LIST OF FREE BLOCKS THE BLOCKS USED BY A
C     SECONDARY SUBSTRUCTURE.
C     THESE BLOCKS INCLUDE THE FOLLOWING ITEMS
C
C     ITEMS COPIED DURING A EQUIV OPERATION
C     SOLUTION ITEMS
C     ITEMS PRODUCED BY A COMBINE OR REDUCE OPERATION
C
  300 DO 310 J = 1,NITEM
      IF (ITEM(5,J) .EQ. 0) GO TO 310
      ITM = J + IFRST - 1
      IBL = ANDF(BUF(IMDI+ITM),65535)
      IF (IBL.GT.0 .AND. IBL.NE.65535) CALL RETBLK (IBL)
      BUF(IMDI+ITM) = 0
  310 CONTINUE
      GO TO IRET1, (30,320)
C
C     INTERNAL SUBROUTINE.
C     BUILD A LIST IMAGE OF ALL THE IMAGE SUBSTRUCTURES CONTRIBUTING TO
C     THE SECONDARY SUBSTRUCTURE WITH INDEX ISAVE, AND DELETE EACH IMAGE
C     SUBSTRUCTURE FROM THE LIST OF SECONDARY SUBSTRUCTURES TO WHICH IT
C     BELONGS.
C
  320 CALL FMDI (ISAVE,IMDI)
      ILL = RSHIFT(ANDF(BUF(IMDI+LL),1073741823),20)
      IF (ILL .EQ. 0) GO TO IRET2, (90,120)
  330 IMTOP = 1
      IMAGE(IMTOP) = ILL
      ICOUNT = 1
      IHERE  = IMAGE(ICOUNT)
  350 CALL FMDI (IHERE,IMDI)
      I   = BUF(IMDI+PS)
      IPS = ANDF(I,1023)
      ISS = RSHIFT(ANDF(I,1048575),10)
      IIS = ANDF(I,1073741824)
      I   = BUF(IMDI+LL)
      ILL = RSHIFT(ANDF(I,1073741823),20)
      ICS = RSHIFT(ANDF(I,1048575),10)
      IF (IIS .EQ. 0) GO TO 1010
C
C     DELETE THE SUBSTRUCTURE WITH INDEX IHERE FROM THE MDI AND THE DIT.
C     RETURN THE BLOCKS USED BY THE IMAGE SUBSTRUCTURE TO THE LIST OF
C     FREE BLOCKS.  THIS INCLUDES THE FOLLOWING ITEMS
C
C     ITEMS COPIED DURING A EQUIV OPERATION
C     SOLUTION ITEMS
C
      DO 355 J = 1,NITEM
      IF (ITEM(4,J) .EQ. 0) GO TO 355
      ITM = J + IFRST - 1
      IBL = ANDF(BUF(IMDI+ITM),65535)
      IF (IBL.GT.0 .AND. IBL.NE.65535) CALL RETBLK (IBL)
      BUF(IMDI+ITM) = 0
  355 CONTINUE
      DO 360 J = 1,DIRSIZ
      BUF(IMDI+J) = 0
  360 CONTINUE
      MDIUP = .TRUE.
      CALL FDIT (IHERE,IDIT)
      BUF(IDIT  ) = IEMPTY
      BUF(IDIT+1) = IEMPTY
      DITUP = .TRUE.
      IF (IHERE*2 .NE. DITSIZ) GO TO 370
      DITSIZ = DITSIZ - 2
  370 DITNSB = DITNSB - 1
C
C     DELETE POINTERS TO IHERE.
C
      ICHECK = IPS
  380 CALL FMDI (ICHECK,IMDI)
      ICHECK = RSHIFT(ANDF(BUF(IMDI+SS),1048575),10)
      IF (ICHECK .EQ. 0) GO TO 390
      IF (ICHECK .NE. IHERE) GO TO 380
      BUF(IMDI+SS) = ORF(ANDF(BUF(IMDI+SS),MASKM),LSHIFT(ISS,10))
      MDIUP = .TRUE.
C
C     ARE THERE MORE SUBSTRUCTURES TO ADD TO THE LIST IMAGE
C
  390 IF (ILL .EQ. 0) GO TO 410
      DO 400 J = 1,IMTOP
      IF (IMAGE(J) .EQ. ILL) GO TO 410
  400 CONTINUE
      IMTOP = IMTOP + 1
      IMAGE(IMTOP) = ILL
  410 IF (ICS .EQ. 0) GO TO 430
      DO 420 J = 1,IMTOP
      IF (IMAGE(J) .EQ. ICS) GO TO 430
  420 CONTINUE
      IMTOP = IMTOP + 1
      IF (IMTOP .GT. LIM) GO TO 1030
      IMAGE(IMTOP) = ICS
C
C     ARE THERE MORE SUBSTRUCTURES ON THE LIST IMAGE
C
  430 IF (ICOUNT .EQ. IMTOP) GO TO IRET2, (90,120)
      ICOUNT = ICOUNT + 1
      IHERE  = IMAGE(ICOUNT)
      GO TO 350
C
C     NAME DOES NOT EXIST.
C
 1000 ITEST = 4
      RETURN
C
C     NAME IS AN IMAGE SUBSTRUCTURE.
C
 1010 ITEST = 6
      RETURN
C
C     ERROR MESSAGES.
C
 1020 CALL ERRMKN (INDSBR,8)
 1030 CALL MESAGE (-8,0,NMSBR)
      RETURN
      END