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
74
75
76
77#include "implicit_f.inc"
78#include "comlock.inc"
79
80
81
82#include "subvolumes.inc"
83#include "inter22.inc"
84
85
86
87 INTEGER,INTENT(IN) :: arg_SizeFIX,arg_SizeVAR ,NINTP,ICODE,IDBLE
88 INTEGER,INTENT(INOUT) :: RESULT(8)
89 INTEGER,INTENT(IN) :: arg_ListFIX(arg_SizeFIX),arg_ListVAR(arg_SizeVAR)
90 LOGICAL,INTENT(INOUT) :: bFOUND
91 INTEGER,INTENT(IN) :: ITASK
92
93 INTEGER :: SizeFIX,SizeVAR
94 INTEGER :: ListFIX(arg_SizeFIX),ListVAR(arg_SizeVAR)
95
96
97
98 INTEGER :: I,II,J,K,L,COUNT,CountVAR,CountFIX,ITYP,pCODE,lIDBLE
99 INTEGER :: LIST(32+8),SizeL
100 INTEGER :: IBIN
101 INTEGER :: LLVAR(arg_SizeVAR,arg_SizeVAR-1), SizeLLVAR
102 INTEGER :: LLFIX(arg_SizeVAR,arg_SizeFIX+1), SizeLLFIX
103 INTEGER :: SizeLLVAR_bak
104 INTEGER :: IKEEP
105 INTEGER :: TAG(12),TAG_nod(8),TAG_edg(12), Lnbit, Lcode, Ldble, NNOD, NEDG
106 INTEGER :: IDOUBLE(12),lvl
107 INTEGER :: TAG_nod_fix(8),TAG_edg_fix(12),TAG_nod_bak(8),TAG_nod_tmp(8)
108 LOGICAL :: bool,bCOMPL
109
110
111
112 IF(int22==0) RETURN
113 IF(bfound)RETURN
114
115
116
117
118
119
120
121
122
123
124 sizefix = arg_sizefix
125 sizevar = arg_sizevar
126 listfix = arg_listfix
127 listvar = arg_listvar
128
129
130
131
132
133 count = 0
134 countfix = 0
135 countvar = 0
136
137 DO i=1,sizefix
138 pcode = iabs(listfix(i))
139 ityp = getpolyhedratype(pcode)
140 countfix = countfix + c_polyh(ityp)
141 ENDDO
142
143 DO i=1,sizevar
144 pcode = listvar(i)
145 ityp = getpolyhedratype(pcode)
146 countvar = countvar + c_polyh(ityp)
147 ENDDO
148 count = countfix + countvar
149
150
151
152
153
154
155 IF(count < nintp .OR. countfix > nintp)THEN
156
157
158 RETURN
159
160
161
162 ELSEIF(countfix == nintp)THEN
163
164 sizel = sizefix
165 list(1:sizel) = (/ listfix(1:sizefix) /)
166
167 ibin = bcode(iabs(list(1)))
168 DO i=2,sizel
169 ibin = ior(ibin,bcode(iabs(list(i))))
170 ENDDO
171 IF(ibin/=icode)then;
172
173 endif
174
175 tag_edg(1:12) = 0
176 DO i=1,sizel
177 pcode = iabs(list(i))
178 ityp = getpolyhedratype(pcode)
179 nedg = c_polyh(ityp)
180 DO j=1,nedg
181 k = iabs(gcorner(j, pcode))
182 tag_edg(k) = tag_edg(k) + 1
183 ENDDO
184 ENDDO
185 lcode = 0
186 ldble = 0
187 lnbit = 0
188 DO j=1,12
189 IF(tag_edg(j)>2) RETURN
190 IF(tag_edg(j)==2) ldble = ibset(ldble,12-j)
191 IF(tag_edg(j)>=1) THEN
192 lcode = ibset(lcode,12-j)
193
194 ENDIF
195 ENDDO
196 IF(icode /= lcode) RETURN
197 IF(idble /= ldble) RETURN
198
199#include "lockon.inc"
200 result(1:sizel)=list(1:sizel)
201 bfound = .true.
202#include "lockoff.inc"
203
204
205
206 ELSE
207
208 IF(arg_sizevar==0) RETURN
209
210
211
212
213 sizellfix = sizefix + 1
214
215
216 DO ii=1,sizevar
217 ikeep = listvar(ii)
218 llfix(ii,1:sizellfix) = (/listfix(1:sizefix), ikeep /)
219
220 sizellvar = sizevar-ii
221 IF(sizellvar>=1)llvar(ii,1:sizellvar) = (/listvar(ii+1:sizevar)/)
222 ENDDO
223 DO ii=1,sizevar
224 sizellvar = sizevar-ii
225
226
227
228
229
230
231
232
233 countfix = 0
234 DO i=1,sizellfix
235 pcode = iabs(llfix(ii,i))
236 ityp = getpolyhedratype(pcode)
237 countfix = countfix + c_polyh(ityp)
238 ENDDO
239 IF(countfix > nintp)cycle
240
241 tag_nod_fix(1:8) = 0
242 DO i=1,sizellfix
243 bcompl = .false.
244 pcode = llfix(ii,i)
245 IF(pcode<0) bcompl = .true.
246 pcode = iabs(pcode)
247 ityp = getpolyhedratype(pcode)
248 nnod = n_polyh(ityp)
249 bool = .false.
250 tag_nod_bak(1:8) = tag_nod_fix(1:8)
251 IF(bcompl)THEN
252 tag_nod_tmp(1:8) = 1
253 DO j=1,nnod
254 k = gnode(j,pcode)
255 tag_nod_tmp(k) = 0
256 ENDDO
257 DO j=1,8
258 IF( tag_nod_tmp(j)==0)cycle
259 tag_nod_fix(j) = tag_nod_fix(j)+1
260 IF(tag_nod_fix(j) >= 2)GOTO 50
261 ENDDO
262 ELSE
263 DO j=1,nnod
264 k = gnode(j,pcode)
265 tag_nod_fix(k) = tag_nod_fix(k)+1
266 IF(tag_nod_fix(k) >= 2)bool=.true.
267 ENDDO
268 ENDIF
269
270 IF(bool)THEN
271
272 tag_nod_fix(1:8) = tag_nod_bak(1:8)
273
274 tag_nod_tmp(1:8) = 1
275 DO j=1,nnod
276 k = gnode(j,pcode)
277 tag_nod_tmp(k) = 0
278 ENDDO
279 DO j=1,8
280 IF( tag_nod_tmp(j)==0)cycle
281 tag_nod_fix(j) = tag_nod_fix(j)+1
282 IF(tag_nod_fix(j) >= 2)GOTO 50
283 ENDDO
284
285 llfix(ii,i) = -llfix(ii,i)
286 ENDIF
287 ENDDO
288
289 tag_edg_fix(1:12) = 0
290 DO i=1,sizellfix
291 pcode = iabs(llfix(ii,i))
292 ityp = getpolyhedratype(pcode)
293 nedg = c_polyh(ityp)
294 DO j=1,nedg
295 tag_edg_fix(iabs(gcorner(j,pcode))) = tag_edg_fix(iabs(gcorner(j,pcode)))+1
296 IF(tag_edg_fix(iabs(gcorner(j,pcode))) > 2)GOTO 50
297
298
299
300 IF(tag_edg_fix(iabs(gcorner(j,pcode)))==2 )THEN
301 IF(btest(idble,12-iabs(gcorner(j,pcode))) .EQV. (.false.))GOTO 50
302 ENDIF
303 ENDDO
304 ENDDO
305
306
307
308
309
310 i = 1
311
312 DO WHILE(i < sizellvar)
313 tag_nod(:) = tag_nod_fix
314 pcode = llvar(ii,i)
315 ityp = getpolyhedratype(pcode)
316 nnod = n_polyh(ityp)
317 DO j=1,nnod
318 k = gnode(j,pcode)
319 tag_nod(k) = tag_nod(k)+1
320 IF(tag_nod(k) >= 2)THEN
321
322
323
324 sizellvar = sizellvar - 1
325 tag_nod(k) = tag_nod(k)-1
326 l=i
327 DO WHILE(l<=sizellvar)
328 llvar(ii,l)=llvar(ii,l+1)
329 l = l + 1
330 ENDDO
331
332 GOTO 51
333 ENDIF
334 ENDDO
335 51 CONTINUE
336 i = i + 1
337 ENDDO
338
339
340 i = 1
341 DO WHILE(i < sizellvar)
342
343 tag_edg(:) = tag_edg_fix
344 pcode = llvar(ii,i)
345 ityp = getpolyhedratype(pcode)
346 nedg = c_polyh(ityp)
347 DO j=1,nedg
348 k = iabs(gcorner(j,pcode))
349 tag_edg(k) = tag_edg(k)+1
350
351 IF(tag_edg(k) > 2 .OR. (tag_edg(k)==2 .AND. .NOT.btest(idble,12-k)))THEN
352
353
354
355 sizellvar = sizellvar - 1
356 tag_edg(k) = tag_edg(k)-1
357 l = i
358 DO WHILE (l <= sizellvar)
359 llvar(ii,l)=llvar(ii,l+1)
360 l = l + 1
361 ENDDO
362
363 GOTO 52
364 ENDIF
365 ENDDO
366 52 CONTINUE
367 i = i + 1
368 ENDDO
369
370
371
372
373 CALL int22listcombi(itask,llfix(ii,1:sizellfix),sizellfix,llvar(ii,1:sizellvar),sizellvar,nintp,icode,idble,lvl+1,
374 . result, bfound)
375 50 CONTINUE
376 ENDDO
377 endif
recursive subroutine int22listcombi(itask, arg_listfix, arg_sizefix, arg_listvar, arg_sizevar, nintp, icode, idble, lvl, result, bfound)