45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
75
76
77
78#include "implicit_f.inc"
79
80
81
82 TYPE(SUBMODEL_DATA),INTENT(IN)::LSUBMODEL(*)
83 TYPE(MAPPING_STRUCT_) :: MAP_TABLES
84 TYPE (SET_), DIMENSION(NSETS),INTENT(INOUT) :: SET
85 INTEGER SET_LIST(NSETS)
86 TYPE (SET_) :: CLAUSE
87
88
89
90 INTEGER IGS,IGS2,ID1,ID2,IG,I,J,SET_CLAUSE_SIZE,SET_ARRAY_SIZE,NEW_SIZE,IERROR,S,T,ID
91 INTEGER SET_ID,ISET_TYPE,CLAUSES_MAX,ITMP,ICODE,NCOLLECT,SETCOL_ARRAY_SIZE
92 INTEGER OPT_D,OPT_O,OPT_G,OPT_B,OPT_A,OPT_E,OPT_I,
93 INTEGER IDEBUG
94 LOGICAL IS_AVAILABLE
95 INTEGER, DIMENSION(:),ALLOCATABLE :: SET_ARRAY,SET_CLAUSE_ARRAY,RESULT,SETCOL_ARRAY
96 INTEGER, DIMENSION(:),ALLOCATABLE :: COLLECT_LIST,IS_COLLECT
97 INTEGER CLAUSE_OPERATOR
98
99
100
101 CHARACTER MESS*40
102 CHARACTER(LEN=NCHARFIELD) :: KEYSET,SET_TYPE,KEY_TYPE
103 CHARACTER(LEN=NCHARTITLE) :: TITLE,TITLE2,SET_TITLE
104 CHARACTER(LEN=NCHARKEY) :: KEYPART,KEY
105
106 idebug=0
107
108 IF (idebug == 1)THEN
109 print*,' '
110 print*,' '
111 print*,' -----------------------------------------------'
112 print*,' SORTING SETS'
113 print*,' -----------------------------------------------'
114 print*,' '
115 ENDIF
116
117 ALLOCATE(set_array(
nsets))
118 ALLOCATE(setcol_array(
nsets))
119 ALLOCATE(set_clause_array(
nsets))
120 ALLOCATE(is_collect(
nsets))
121 ALLOCATE(result(
nsets))
122 ALLOCATE(collect_list(map_tables%NSET_COLLECT))
123
124
125
126
127
128
129
130
131 ! all secondary sets needs to be treated before
the
132
133
134
135
137 set(igs)%SET_ACTIV=-1
138 is_collect(igs)=0
139 ENDDO
140
141 IF (map_tables%NSET_COLLECT > 0)THEN
142
143 igs = map_tables%ISETCOLM(1,2)
144 is_collect(igs)=1
146
147 DO i=2,map_tables%NSET_COLLECT
148 igs = map_tables%ISETCOLM(i,2)
149 igs2 = map_tables%ISETCOLM(i-1,2)
150
151 id1 = map_tables%ISETCOLM(i,1)
152 id2 = map_tables%ISETCOLM(i-1,1)
153
154 is_collect(igs)=1
155 IF(id1 /= id2) THEN
157 ELSE
159 ENDIF
160 ENDDO
161 ENDIF
163 IF(is_collect(igs) == 0)
set(igs)%SET_ACTIV=1
164 ENDDO
165
166
168
170
171 set_array_size=0
172
174 . option_id = set_id,
175 . option_titr = set_title,
176 . keyword2 = key)
177
178
180 CALL hm_get_intv (
'iset_Type', iset_type,is_available,lsubmodel)
181
182 CALL hm_get_intv(
'clausesmax',clauses_max,is_available,lsubmodel)
183
184
185
186
187
188
189 DO j=1,clauses_max
191
200
201
202 IF(trim(keyset) == 'SET' )THEN
203
204
205
206 set_clause_size = 0
208 . map_tables%ISETM , map_tables%NSET_GENERAL,
209 . j ,opt_g ,is_available ,
210 . lsubmodel,clause,0)
211
212 IF( set_clause_size > 0 ) THEN
213
214 new_size = 0
216 * set_clause_array, set_clause_size ,
217 * result , new_size ,
219
220 set_array(1:new_size) = result(1:new_size)
221 set_array_size = new_size
222 ENDIF
223
224 ELSEIF (trim(keyset) == 'SETCOL' )THEN
226 * map_tables%ISETCOLM,map_tables%NSET_COLLECT,
227 * j,opt_g ,is_available ,
228 * lsubmodel)
229
230 IF(setcol_array_size > 0 ) THEN
231
232 new_size = 0
234 * setcol_array , setcol_array_size ,
235 * result , new_size ,
237
238 set_array(1:new_size) = result(1:new_size)
239 set_array_size = new_size
240 ENDIF
241
242
243 ENDIF
244
245
246 ENDDO
247
248
249 IF(trim(key) == 'COLLECT')THEN
250
251 IF (
set(igs)%SET_ACTIV==1 )
THEN
252
253 DO j=1,map_tables%NSET_COLLECT
254
255 id = map_tables%ISETCOLM(j,1)
256 ig = map_tables%ISETCOLM(j,2)
257
258 IF (
id > set_id)
EXIT
259
260
261 IF(
id == set_id .AND.
set(ig)%SET_ACTIV==0)
THEN
262 set_array_size = set_array_size + 1
263 set_array(set_array_size)=ig
264 ENDIF
265
266 ENDDO
267 ENDIF
268
269 ENDIF
270
271 IF (idebug == 1)THEN
272 WRITE(6,'(A,I8,A,I8,A,I8)') 'SET ',set_id,'-> ',igs,' Number of Child list : ',set_array_size
273 WRITE(6,'(A, 100I8)') 'Child List ',( set_array(t), t=1,set_array_size)
274 WRITE(6,'(A)') ' '
275 ENDIF
276
277
278 CALL set_graph_add_set ( igs, set_array, set_array_size)
279
280
281 ENDDO
282
283
284
285 CALL set_graph_sort ( set_list , ierror)
286
287 IF (ierror < 0) THEN
288 print*,'ERROR CIRCULAR DEPENDENCY ON SET ',-ierror
290 ENDIF
291
292 IF (idebug == 1)THEN
293 print*,' '
294 print*,' -----------------------------------------------'
295 WRITE(6,'(A)') 'SORTED SETS'
296 print*,set_list(1:
nsets)
297 print*,' '
298 print*,' -----------------------------------------------'
299 print*,' '
300 ENDIF
301
302 CALL set_graph_clean()
303
subroutine create_set_array(set_array, array_size, isetm, nset_general, jclause, opt_g, is_available, lsubmodel, clause, flag)
subroutine create_setcol_array(set, setcol_array, array_size, isetcolm, nset_collect, jclause, opt_g, is_available, lsubmodel)
end diagonal values have been computed in the(sparse) matrix id.SOL
subroutine hm_get_int_array_index(name, ival, index, is_available, lsubmodel)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_get_string(name, sval, size, is_available)
subroutine hm_get_string_index(name, sval, index, size, is_available)
subroutine hm_option_start(entity_type)
integer, parameter nchartitle
integer, parameter ncharkey
integer, parameter ncharfield
integer, parameter ncharline
integer, parameter set_add
add operator
type(set_), dimension(:), allocatable, target set
subroutine set_merge_simple(set_entity, nb_set_entity, clause_entity, nb_clause_entity, result, nb_result, clause_operator)