296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
320
321
322
323#include "implicit_f.inc"
324
325
326
327#include "com04_c.inc"
328
329
330
331 INTEGER JCLAUSE
332 LOGICAL :: IS_AVAILABLE
333 INTEGER, INTENT(IN), DIMENSION(NSUBS,2) :: ISUBSM
334
335 TYPE (SET_) :: CLAUSE
336 TYPE(SUBMODEL_DATA),INTENT(IN):: (*)
337 TYPE (SUBSET_) , DIMENSION(NSUBS) :: SUBSET
338
339
340
341 INTEGER I,IDS,LIST_SIZE,IDS_MAX,PARTM,GENE_MAX,K,S,S1,
342 . NINDX,IP,ISET
343 INTEGER START_GENE,END_GENE,INCR_GENE,SSTART,SSTOP,STACK,STACK_ONE,NB_RESULT
344
345 INTEGER, ALLOCATABLE, DIMENSION(:) :: SUBS_READ_TMP,SUBS_READ_ONE,RESULT,
346 . PART_READ_TMP,SORTED_PARTS,INDEX
347
348 INTEGER SET_USRTOS_NEAREST
350 INTEGER IWORK(70000)
351
353
354 ALLOCATE(subs_read_tmp(nsubs))
355 ALLOCATE(subs_read_one(nsubs))
356
357 ALLOCATE(part_read_tmp(npart))
358 ALLOCATE(sorted_parts(npart))
359
360 ALLOCATE(index(2*npart))
361 index = 0
362
363 IF (gene_max > 1) THEN
364 ALLOCATE(result(nsubs))
365 ENDIF
366
367 stack=0
368
369 DO k=1,gene_max
373
374
375 IF (incr_gene == 0) incr_gene = 1
376
379
380 stack_one=0
381
382 DO s=sstart, sstop
383 s1 = isubsm(s,1)
384 IF ( mod( s1-start_gene , incr_gene) == 0 ) THEN
385 stack_one = stack_one+1
386 subs_read_one(stack_one) = isubsm(s,2)
387 ENDIF
388 ENDDO
389
390 IF (stack==0) THEN
391 subs_read_tmp(1:stack_one) = subs_read_one(1:stack_one)
392 stack = stack_one
393 ELSE
394
395 CALL union_2_sorted_sets( subs_read_tmp, stack ,
396 * subs_read_one, stack_one ,
397 * result, nb_result )
398
399 subs_read_tmp(1:nb_result) = result(1:nb_result)
400 stack = nb_result
401 ENDIF
402 ENDDO
403
404
405
406
407
408 nindx = 0
409 DO i=1,stack
410 iset = subs_read_tmp(i)
411 DO ip=1,subset(iset)%NTPART
412
413 partm = subset(iset)%TPART(ip)
414
415 nindx=nindx+1
416 part_read_tmp(nindx) = partm
417 ENDDO
418 ENDDO
419
420
421
422
423
424
425 DO i=1,nindx
426 index(i) = i
427 ENDDO
428 CALL my_orders(0,iwork,part_read_tmp,index,nindx,1)
429
430 DO i=1,nindx
431 sorted_parts(i) = part_read_tmp(index(i))
432 ENDDO
433
434 list_size = 0
435 CALL remove_duplicates(sorted_parts,nindx,list_size)
436
437
438
439
440
441
442 clause%NB_PART = list_size
443 ALLOCATE(clause%PART(list_size))
444 clause%PART(1:list_size) = sorted_parts(1:list_size)
445
446 DEALLOCATE (part_read_tmp)
447 DEALLOCATE (sorted_parts)
448 IF (ALLOCATED(result)) DEALLOCATE (result)
449 DEALLOCATE (subs_read_tmp)
450 DEALLOCATE (subs_read_one)
451
integer function set_usrtos_nearest(ui, map, sz, uplow)