42 & KEEP199, INODE, CB_STATE, IXXD,
43 & STEP, DAD, PROCNODE_STEPS,
44 & RCURRENT, PAMASTER, PTRAST,
45 & IS_PAMASTER, IS_PTRAST )
47 INTEGER,
INTENT(in) :: KEEP28, N, SLAVEF, MYID, INODE, CB_STATE
48 INTEGER,
INTENT(in) :: KEEP199
49 INTEGER,
INTENT(in) :: IXXD(2)
50 INTEGER,
INTENT(in) :: DAD(KEEP28)
51 INTEGER,
INTENT(in) :: STEP(N)
52 INTEGER,
INTENT(in) :: PROCNODE_STEPS(KEEP28)
53 LOGICAL,
INTENT(out) :: IS_PAMASTER, IS_PTRAST
54 INTEGER(8),
INTENT(in) :: PAMASTER(KEEP28), PTRAST(KEEP28)
55 INTEGER(8),
INTENT(in) :: RCURRENT
56 LOGICAL :: DAD_TYPE2_NOT_ON_MYID
57 INTEGER :: NODETYPE, DADTYPE
58 include
'mumps_headers.h'
60 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
63 IF (cb_state .EQ. s_free)
THEN
68 dad_type2_not_on_myid = .false.
69 IF (dad(step(inode)) .NE. 0)
THEN
73 IF (dadtype .EQ. 2 .AND.
75 & procnode_steps(step(dad(step(inode)))),
78 dad_type2_not_on_myid = .true.
83 ELSE IF (nodetype.EQ.1
84 & .AND. mumps_procnode(procnode_steps(step(inode)),
86 & .AND. dad_type2_not_on_myid)
137 & SIZER_NEEDED, SKIP_TOP_STACK,
140 & IW, LIW, IWPOSCB, IWPOS,
141 & A, LA, LRLU, IPTRLU, LRLUS,
142 & STEP, PTRAST, PAMASTER,
143 & PROCNODE_STEPS, DAD, IFLAG, IERROR)
147 INTEGER,
INTENT(in) :: STRATEGY
148 INTEGER(8),
INTENT(in) :: SIZER_NEEDED
149 LOGICAL,
INTENT(in) :: SKIP_TOP_STACK
150 INTEGER,
INTENT(in) :: N, SLAVEF, KEEP(500)
151 INTEGER,
INTENT(in) :: MYID
152 INTEGER(8),
INTENT(inout) :: KEEP8(150)
153 INTEGER :: IWPOS, IWPOSCB, LIW
154 INTEGER,
INTENT(inout) :: IW( LIW )
155 INTEGER(8) :: LA, LRLU, IPTRLU, LRLUS
156 COMPLEX,
INTENT(in) :: A( LA )
157 INTEGER,
INTENT(in) :: STEP(N)
158 INTEGER(8),
INTENT(inout) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
159 INTEGER,
INTENT(in) :: PROCNODE_STEPS(KEEP(28)), DAD(KEEP(28))
160 INTEGER,
INTENT(inout) :: IFLAG, IERROR
161 include
'mumps_headers.h'
162 INTEGER :: ICURRENT, INODE, TYPEINODE, CB_STATE
163 INTEGER(8) :: RCURRENT, RCURRENT_SIZE, SIZEHOLE
164 INTEGER(8) :: KEEP8TMPCOPY
165 LOGICAL :: MOVE2DYNAMIC
167 INTEGER(8) :: TMP_ADDRESS, ITMP8
169 COMPLEX,
DIMENSION(:),
POINTER :: DYNAMIC_CB
170 LOGICAL :: IS_PAMASTER, IS_PTRAST
175 LOGICAL :: IFLAG_M13_OCCURED, IFLAG_M19_OCCURED
176 INTEGER(8) :: MIN_SIZE_M13, MIN_SIZE_M19
177 INTEGER,
EXTERNAL :: MUMPS_TYPENODE
178 IF ( strategy .EQ. 0 )
THEN
179 IF (lrlus.LT.sizer_needed)
THEN
185 iflag_m13_occured = .false.
186 min_size_m13 = huge(min_size_m13)
187 iflag_m19_occured = .false.
188 min_size_m19 = huge(min_size_m19)
190 icurrent = iwposcb + 1
191 rcurrent = iptrlu + 1
192 IF (strategy.EQ.1 .AND. sizer_needed.LE.lrlus)
GOTO 500
193 IF (( keep8(73) + sizer_needed-lrlus).GT.
197 & (keep8(73) + sizer_needed-lrlus-keep8(75), ierror)
200 DO WHILE (icurrent .NE. liw-keep(ixsz)+1)
201 inode = iw(icurrent+xxn)
202 cb_state = iw(icurrent+xxs)
205 & keep(199), inode, cb_state,
206 & iw(icurrent+xxd:icurrent+xxd+1),
207 & step, dad, procnode_steps,
208 & rcurrent, pamaster, ptrast,
209 & is_pamaster, is_ptrast )
210 IF ( cb_state .NE. s_free .AND.
212 typeinode = mumps_typenode(procnode_steps(step(inode)),
214 IF (strategy .EQ. -1)
THEN
215 move2dynamic = .false.
216 move2dynamic = move2dynamic .OR.
217 & cb_state .EQ. s_nolcbcontig
218 & cb_state .EQ. s_nolcbnocontig .OR.
219 & cb_state .EQ. s_nolcleaned .OR.
220 & cb_state .EQ. s_all .OR.
221 & cb_state .EQ. s_active
222 ELSE IF (strategy .EQ. 2 .OR. strategy .EQ. 3)
THEN
223 move2dynamic = .true.
224 move2dynamic = move2dynamic .AND. (typeinode.NE.3)
225 ELSE IF (strategy .EQ. 1)
THEN
226 move2dynamic = .false.
227 IF (lrlus.GT.sizer_needed)
GOTO 500
228 IF (typeinode.EQ.3)
GOTO 100
229 move2dynamic = move2dynamic.OR..true.
231 WRITE(*,*)
"Internal error in CMUMPS_DM_CBSTATIC2DYNAMIC",
235 move2dynamic = move2dynamic .AND. (rcurrent_size .NE. 0_8)
236 move2dynamic = move2dynamic .AND.
237 & .NOT. ((icurrent.EQ.iwposcb + 1).AND.(skip_top_stack))
238 IF (strategy .NE. 3)
THEN
239 IF ( keep(405) .EQ. 1 )
THEN
241 keep8tmpcopy = keep8(73)
244 keep8tmpcopy = keep8(73)
246 IF ( rcurrent_size + keep8tmpcopy .GT. keep8(75) )
THEN
247 iflag_m19_occured= .true.
248 min_size_m19 =
min( min_size_m19,
249 & rcurrent_size+keep8(73)-keep8(75) )
250 move2dynamic = .false.
253 IF ( move2dynamic )
THEN
254#if defined(MUMPS_ALLOC_FROM_C)
255 CALL mumps_malloc_c( tmp_address,
256 & rcurrent_size * keep(35) )
257 IF (tmp_address .EQ. 0_8)
THEN
263 ALLOCATE(dynamic_cb(rcurrent_size), stat=allocok)
265 IF (allocok .GT. 0)
THEN
266 IF ( (strategy .NE. 1).OR.
267 & (sizer_needed-lrlus).GE.rcurrent_size)
THEN
272 iflag_m13_occured = .true.
273 min_size_m13 =
min(min_size_m13, rcurrent_size)
277 IF (keep(216).NE.3)
THEN
279 & liw-icurrent+1, sizehole, keep(ixsz))
282#if defined(MUMPS_ALLOC_FROM_C)
286 CALL mumps_addr_c(dynamic_cb(1), tmp_address)
289 ptrast(step(inode)) = tmp_address
290 ELSE IF (is_pamaster)
THEN
291 pamaster(step(inode)) = tmp_address
294 &
"Internal error 3 in CMUMPS_DM_CBSTATIC2DYNAMIC",
295 & rcurrent, ptrast(step(inode)), pamaster(step(inode))
298 itmp8 = (rcurrent_size-sizehole)
299 lrlus = lrlus + itmp8
300 IF (keep(405).EQ.1)
THEN
301 IF (sizehole .NE. 0_8)
THEN
303 keep8(69) = keep8(69) + sizehole
304 keep8tmpcopy = keep8(69)
307 keep8(68) =
max( keep8(68), keep8tmpcopy )
311 keep8(69) = keep8(69) + sizehole
312 keep8(68) =
max( keep8(68), keep8(69) )
316 & step, procnode_steps, keep(199))
318 & la - lrlus, 0_8, -(rcurrent_size-sizehole),
319 & keep, keep8, lrlus)
320 IF (icurrent .EQ. iwposcb+1)
THEN
321 iptrlu = iptrlu + rcurrent_size
322 lrlu = lrlu + rcurrent_size
325 IF (strategy .NE. 3)
THEN
327 & rcurrent_size, keep(405).EQ.1, keep8,
328 & iflag, ierror, .false., .false.)
329 IF (iflag.LT.0)
GOTO 500
338 DO i8=1_8, rcurrent_size
339 dynamic_cb(i8) = a(rcurrent+i8-1_8)
345 rcurrent = rcurrent + rcurrent_size
346 icurrent = icurrent + iw(icurrent+xxi)
348 IF (lrlus.LT.sizer_needed)
THEN
349 IF (iflag_m19_occured)
THEN
352 ELSE IF (iflag_m13_occured)
THEN
364 & KEEP, KEEP8, IW, LIW, IWPOSCB, IWPOS,
365 & STEP, PTRAST, PAMASTER,
366 & PROCNODE_STEPS, DAD, ATOMIC_UPDATES )
367 INTEGER,
INTENT(in) :: N, SLAVEF, KEEP(500)
369INTEGER(8),
INTENT(inout) :: KEEP8(150)
370 INTEGER :: IWPOS, IWPOSCB, LIW
371 INTEGER,
INTENT(inout) :: IW( LIW )
372 INTEGER,
INTENT(in) :: STEP(N)
373 INTEGER(8),
INTENT(in) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
374 INTEGER,
INTENT(in) :: PROCNODE_STEPS(KEEP(28)), DAD(KEEP(28))
375 LOGICAL,
INTENT(in) :: ATOMIC_UPDATES
376 include
'mumps_headers.h'
377 INTEGER :: ICURRENT, INODE
379 INTEGER(8) :: DYN_SIZE, TMP_ADDRESS
380 INTEGER(8),
PARAMETER :: RDUMMY = -987654
381 logical :: is_pamaster, is_ptrast
382 COMPLEX,
DIMENSION(:),
POINTER :: TMP_PTR
383 icurrent = iwposcb + 1
384 IF (keep8(73) .NE. 0_8)
THEN
385 DO WHILE (icurrent .LT. liw-keep(ixsz)+1)
386 inode = iw(icurrent+xxn)
387 cb_state = iw(icurrent+xxs)
388 IF (cb_state.NE.s_free)
THEN
390 IF (dyn_size .GT. 0_8)
THEN
392 & keep(199), inode, cb_state, iw(icurrent+xxd),
393 & step, dad, procnode_steps,
394 & rdummy, pamaster, ptrast,
395 & is_pamaster, is_ptrast )
396 IF (is_pamaster)
THEN
397 tmp_address = pamaster(step(inode))
398 ELSE IF (is_ptrast)
THEN
399 tmp_address = ptrast(step(inode))
401 WRITE(*,*)
"Internal error 1 in CMUMPS_DM_FREEALLDYNAMICCB"
402 & , is_ptrast, is_pamaster
407 & atomic_updates, keep8 )
411 icurrent = icurrent + iw(icurrent+xxi)
454 & KEEP, KEEP8, IW, LIW, IWPOSCB, IWPOS,
455 & STEP, PTRAST, PAMASTER,
456 & PROCNODE_STEPS, DAD, ATOMIC_UPDATES )
459 INTEGER,
INTENT(in) :: N, SLAVEF, KEEP(500)
460 INTEGER,
INTENT(in) :: MYID
461 INTEGER(8),
INTENT(inout) :: KEEP8(150)
462 INTEGER :: IWPOS, IWPOSCB, LIW
463 INTEGER,
INTENT(inout) :: IW( LIW )
464 INTEGER,
INTENT(in) :: STEP(N)
465 INTEGER(8),
INTENT(in) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
466 INTEGER,
INTENT(in) :: PROCNODE_STEPS(KEEP(28)), DAD(KEEP(28))
467 LOGICAL,
INTENT(in) :: ATOMIC_UPDATES
468 CALL CMUMPS_DM_FREEALLDYNAMICCB( MYID, N, SLAVEF,
469 & KEEP, KEEP8, IW, LIW, IWPOSCB, IWPOS,
470 & step, ptrast, pamaster,
471 & procnode_steps, dad, atomic_updates )
476 & SIZER_NEEDED, SKIP_TOP_STACK,
479 & IW, LIW, IWPOSCB, IWPOS,
480 & A, LA, LRLU, IPTRLU, LRLUS,
481 & STEP, PTRAST, PAMASTER,
482 & PROCNODE_STEPS, DAD, IFLAG, IERROR)
485 INTEGER,
INTENT(in) :: STRATEGY
486 INTEGER(8),
INTENT(in) :: SIZER_NEEDED
487 LOGICAL,
INTENT(in) :: SKIP_TOP_STACK
488 INTEGER,
INTENT(in) :: N, SLAVEF, KEEP(500)
489 INTEGER,
INTENT(in) :: MYID
490 INTEGER(8),
INTENT(inout) :: KEEP8(150)
491 INTEGER :: IWPOS, IWPOSCB, LIW
492 INTEGER,
INTENT(inout) :: IW( LIW )
493 INTEGER(8) :: LA, LRLU, , LRLUS
494 COMPLEX,
INTENT(in) :: A( LA )
495 INTEGER,
INTENT(in) :: STEP(N)
496 INTEGER(8),
INTENT(inout) :: PTRAST(KEEP(28))
497INTEGER,
INTENT(in) :: PROCNODE_STEPS(KEEP(28)), DAD(KEEP(28))
498 INTEGER,
INTENT(inout) :: , IERROR
499 CALL CMUMPS_DM_CBSTATIC2DYNAMIC( STRATEGY,
500 & sizer_needed, skip_top_stack,
503 & iw, liw, iwposcb, iwpos,
504 & a, la, lrlu, iptrlu, lrlus,
505 & step, ptrast, pamaster,
506 & procnode_steps, dad, iflag, ierror)
subroutine cmumps_dm_cbstatic2dynamic_i(strategy, sizer_needed, skip_top_stack, myid, n, slavef, keep, keep8, iw, liw, iwposcb, iwpos, a, la, lrlu, iptrlu, lrlus, step, ptrast, pamaster, procnode_steps, dad, iflag, ierror)