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 IMPLICIT NONE
195 include 'mpif.h'
196 INTEGER(8) NZ_loc
197 INTEGER IWRKSZ, INTSZ, ISZWRKRC
198 INTEGER M, N, OP
199 INTEGER NUMPROCS, MYID, COMM
200 INTEGER RESZ
201 INTEGER IRN_loc(NZ_loc)
202 INTEGER JCN_loc(NZ_loc)
203 COMPLEX(kind=8) A_loc(NZ_loc)
204 INTEGER RPARTVEC(M)
205 INTEGER CPARTVEC(N)
206 INTEGER RSNDRCVSZ(2*NUMPROCS)
207 INTEGER CSNDRCVSZ(2*NUMPROCS)
208 INTEGER REGISTRE(12)
209 INTEGER IWRK(IWRKSZ)
210 DOUBLE PRECISION ROWSCA(M)
211 DOUBLE PRECISION COLSCA(N)
212 DOUBLE PRECISION WRKRC(ISZWRKRC)
213 DOUBLE PRECISION ONENORMERR,INFNORMERR
214
215 INTEGER IRSNDRCVNUM, ORSNDRCVNUM
216 INTEGER ICSNDRCVNUM, OCSNDRCVNUM
217 INTEGER IRSNDRCVVOL, ORSNDRCVVOL
218 INTEGER ICSNDRCVVOL, OCSNDRCVVOL
219 INTEGER INUMMYR, INUMMYC
220
221 INTEGER IMYRPTR,IMYCPTR
222 INTEGER IRNGHBPRCS, IRSNDRCVIA,IRSNDRCVJA
223 INTEGER ORNGHBPRCS, ORSNDRCVIA,ORSNDRCVJA
224 INTEGER ICNGHBPRCS, ICSNDRCVIA,ICSNDRCVJA
225 INTEGER OCNGHBPRCS, OCSNDRCVIA,OCSNDRCVJA
226 INTEGER ISTATUS, REQUESTS, TMPWORK
227 INTEGER ITDRPTR, ITDCPTR, ISRRPTR
228 INTEGER OSRRPTR, ISRCPTR, OSRCPTR
229
230 INTEGER NB1, NB2, NB3
231 DOUBLE PRECISION EPS
232
233 INTEGER ITER, IR, IC
234 INTEGER(8) :: NZIND
235 DOUBLE PRECISION ELM
236
237 INTEGER TAG_COMM_COL
238 parameter(tag_comm_col=100)
239 INTEGER TAG_COMM_ROW
240 parameter(tag_comm_row=101)
241 INTEGER TAG_ITERS
242 parameter(tag_iters=102)
243
255 INTEGER ZMUMPS_CHKCONVGLO
256 INTEGER ZMUMPS_CHK1CONV
257 DOUBLE PRECISION ZMUMPS_ERRSCALOC
258 DOUBLE PRECISION ZMUMPS_ERRSCA1
259 INTRINSIC abs
260 DOUBLE PRECISION RONE, RZERO
261 parameter(rone=1.0d0,rzero=0.0d0)
262
263 INTEGER RESZR, RESZC
264 INTEGER INTSZR, INTSZC
265 INTEGER MAXMN
266 INTEGER I, IERROR
267 DOUBLE PRECISION ONEERRROW, ONEERRCOL, ONEERRL, ONEERRG
268 DOUBLE PRECISION INFERRROW, INFERRCOL, INFERRL, INFERRG
269 INTEGER OORANGEIND
270 inferrg = -rone
271 oneerrg = -rone
272 oorangeind = 0
273 maxmn = m
274 IF(maxmn < n) maxmn = n
275
276 IF(op == 1) THEN
277 IF(numprocs > 1) THEN
278
279
281 & irn_loc, jcn_loc, nz_loc,
282 & rpartvec, m, n,
283 & iwrk, iwrksz)
285 & jcn_loc, irn_loc, nz_loc,
286 & cpartvec, n, m,
287 & iwrk, iwrksz)
288
290 & nz_loc, irn_loc, n, jcn_loc,
291 & irsndrcvnum,irsndrcvvol,
292 & orsndrcvnum,orsndrcvvol,
293 & iwrk,iwrksz,
294 & rsndrcvsz(1), rsndrcvsz(1+numprocs), comm)
296 & nz_loc, jcn_loc, m, irn_loc,
297 & icsndrcvnum,icsndrcvvol,
298 & ocsndrcvnum,ocsndrcvvol,
299 & iwrk,iwrksz,
300 & csndrcvsz(1), csndrcvsz(1+numprocs), comm)
302 & irn_loc, jcn_loc, nz_loc,
303 & rpartvec, cpartvec, m, n,
304 & inummyr,
305 & inummyc,
306 & iwrk, iwrksz)
307 intszr = irsndrcvnum + orsndrcvnum +
308 & irsndrcvvol + orsndrcvvol +
309 & 2*(numprocs+1) + inummyr
310 intszc = icsndrcvnum + ocsndrcvnum +
311 & icsndrcvvol + ocsndrcvvol +
312 & 2*(numprocs+1) + inummyc
313 intsz = intszr + intszc + maxmn +
314 & (mpi_status_size +1) * numprocs
315 ELSE
316
317 irsndrcvnum = 0
318 orsndrcvnum = 0
319 irsndrcvvol = 0
320 orsndrcvvol = 0
321 inummyr = 0
322 icsndrcvnum = 0
323 ocsndrcvnum = 0
324 icsndrcvvol = 0
325 ocsndrcvvol = 0
326 inummyc = 0
327 intsz = 0
328 ENDIF
329
330 reszr = m + irsndrcvvol + orsndrcvvol
331 reszc = n + icsndrcvvol + ocsndrcvvol
332 resz = reszr + reszc
333
334
335 registre(1) = irsndrcvnum
336 registre(2) = orsndrcvnum
337 registre(3) = irsndrcvvol
338 registre(4) = orsndrcvvol
339 registre(5) = icsndrcvnum
340 registre(6) = ocsndrcvnum
341 registre(7) = icsndrcvvol
342 registre(8) = ocsndrcvvol
343 registre(9) = inummyr
344 registre(10) = inummyc
345 registre(11) = intsz
346 registre(12) = resz
347 ELSE
348
349
350 irsndrcvnum = registre(1)
351 orsndrcvnum = registre(2)
352 irsndrcvvol = registre(3)
353 orsndrcvvol = registre(4)
354 icsndrcvnum = registre(5)
355 ocsndrcvnum = registre(6)
356 icsndrcvvol = registre(7)
357 ocsndrcvvol = registre(8)
358 inummyr = registre(9)
359 inummyc = registre(10)
360 IF(numprocs > 1) THEN
361
362
363
364
366 & irn_loc, jcn_loc, nz_loc,
367 & rpartvec, cpartvec, m, n,
368 & iwrk(1), inummyr,
369 & iwrk(1+inummyr), inummyc,
370 & iwrk(1+inummyr+inummyc), iwrksz-inummyr-inummyc )
371 imyrptr = 1
372 imycptr = imyrptr + inummyr
373
374
375
376
377 irnghbprcs = imycptr+ inummyc
378 irsndrcvia = irnghbprcs+irsndrcvnum
379 irsndrcvja = irsndrcvia + numprocs+1
380 ornghbprcs = irsndrcvja + irsndrcvvol
381 orsndrcvia = ornghbprcs + orsndrcvnum
382 orsndrcvja = orsndrcvia + numprocs + 1
383
384 icnghbprcs = orsndrcvja + orsndrcvvol
385 icsndrcvia = icnghbprcs + icsndrcvnum
386 icsndrcvja = icsndrcvia + numprocs+1
387 ocnghbprcs = icsndrcvja + icsndrcvvol
388 ocsndrcvia = ocnghbprcs + ocsndrcvnum
389 ocsndrcvja = ocsndrcvia + numprocs + 1
390
391
392 requests = ocsndrcvja + ocsndrcvvol
393 istatus = requests + numprocs
394
395
396 tmpwork = istatus + mpi_status_size * numprocs
398 & nz_loc, irn_loc,n, jcn_loc,
399 & irsndrcvnum, irsndrcvvol,
400 & iwrk(irnghbprcs),iwrk(irsndrcvia),iwrk(irsndrcvja),
401 & orsndrcvnum, orsndrcvvol,
402 & iwrk(ornghbprcs),iwrk(orsndrcvia),iwrk(orsndrcvja),
403 & rsndrcvsz(1), rsndrcvsz(1+numprocs),
404 & iwrk(tmpwork),
405 & iwrk(istatus), iwrk(requests),
406 & tag_comm_row, comm)
408 & nz_loc, jcn_loc, m, irn_loc,
409 & icsndrcvnum, icsndrcvvol,
410 & iwrk(icnghbprcs),
411 & iwrk(icsndrcvia),
412 & iwrk(icsndrcvja),
413 & ocsndrcvnum, ocsndrcvvol,
414 & iwrk(ocnghbprcs),iwrk(ocsndrcvia),iwrk(ocsndrcvja),
415 & csndrcvsz(1), csndrcvsz(1+numprocs),
416 & iwrk(tmpwork),
417 & iwrk(istatus), iwrk(requests),
418 & tag_comm_col, comm)
422 & iwrk(imyrptr),inummyr, rone)
424 & iwrk(imycptr),inummyc, rone)
425 ELSE
428 ENDIF
429 itdrptr = 1
430 itdcptr = itdrptr + m
431
432 isrrptr = itdcptr + n
433 osrrptr = isrrptr + irsndrcvvol
434
435 isrcptr = osrrptr + orsndrcvvol
436 osrcptr = isrcptr + icsndrcvvol
437
438 IF(numprocs == 1)THEN
439 osrcptr = osrcptr - 1
440 isrcptr = isrcptr - 1
441 osrrptr = osrrptr - 1
442 isrrptr = isrrptr - 1
443 ELSE
444 IF(irsndrcvvol == 0) isrrptr = isrrptr - 1
445 IF(orsndrcvvol == 0) osrrptr = osrrptr - 1
446 IF(icsndrcvvol == 0) isrcptr = isrcptr - 1
447 IF(ocsndrcvvol == 0) osrcptr = osrcptr - 1
448 ENDIF
449 iter = 1
450 DO WHILE (iter.LE.nb1+nb2+nb3)
451
452 IF(numprocs > 1) THEN
454 & iwrk(imyrptr),inummyr)
456 & iwrk(imycptr),inummyc)
457 ELSE
460 ENDIF
461 IF((iter.LE.nb1).OR.(iter > nb1+nb2)) THEN
462
463 IF((iter.EQ.1).OR.(oorangeind.EQ.1)) THEN
464 DO nzind=1_8,nz_loc
465 ir = irn_loc(nzind)
466 ic = jcn_loc(nzind)
467 IF((ir.GE.1).AND.(ir.LE.m).AND.
468 & (ic.GE.1).AND.(ic.LE.n)) THEN
469 elm = abs(a_loc(nzind))*rowsca(ir)*colsca(ic)
470 IF(wrkrc(itdrptr-1+ir)<elm) THEN
471 wrkrc(itdrptr-1+ir)= elm
472 ENDIF
473 IF(wrkrc(itdcptr-1+ic)<elm) THEN
474 wrkrc(itdcptr-1+ic)= elm
475 ENDIF
476 ELSE
477 oorangeind = 1
478 ENDIF
479 ENDDO
480 ELSEIF(oorangeind.EQ.0) THEN
481 DO nzind=1,nz_loc
482 ir = irn_loc(nzind)
483 ic = jcn_loc(nzind)
484 elm = abs(a_loc(nzind))*rowsca(ir)*colsca(ic)
485 IF(wrkrc(itdrptr-1+ir)<elm) THEN
486 wrkrc(itdrptr-1+ir)= elm
487 ENDIF
488 IF(wrkrc(itdcptr-1+ic)<elm) THEN
489 wrkrc(itdcptr-1+ic)= elm
490 ENDIF
491 ENDDO
492 ENDIF
493 IF(numprocs > 1) THEN
495 & wrkrc(itdcptr), n, tag_iters+iter,
496 & icsndrcvnum,iwrk(icnghbprcs),
497 & icsndrcvvol,iwrk(icsndrcvia), iwrk(icsndrcvja),
498 & wrkrc(isrcptr),
499 & ocsndrcvnum,iwrk(ocnghbprcs),
500 & ocsndrcvvol,iwrk(ocsndrcvia), iwrk(ocsndrcvja),
501 & wrkrc( osrcptr),
502 & iwrk(istatus),iwrk(requests),
503 & comm)
504
506 & wrkrc(itdrptr), m, tag_iters+2+iter,
507 & irsndrcvnum,iwrk(irnghbprcs),
508 & irsndrcvvol,iwrk(irsndrcvia), iwrk(irsndrcvja),
509 & wrkrc(isrrptr),
510 & orsndrcvnum,iwrk(ornghbprcs),
511 & orsndrcvvol,iwrk(orsndrcvia), iwrk(orsndrcvja),
512 & wrkrc( osrrptr),
513 & iwrk(istatus),iwrk(requests),
514 & comm)
515 IF((eps .GT. rzero) .OR.
516 & (iter.EQ.nb1).OR.
517 & ((iter.EQ.nb1+nb2+nb3).AND.
518 & (nb1+nb3.GT.0))) THEN
520 & wrkrc(itdrptr), m,
521 & iwrk(imyrptr),inummyr)
522
524 & wrkrc(itdcptr), n,
525 & iwrk(imycptr),inummyc)
526
527 inferrl = inferrcol
528 IF(inferrrow > inferrl ) THEN
529 inferrl = inferrrow
530 ENDIF
531
533 & 1, mpi_double_precision,
534 & mpi_max, comm, ierror)
535 IF(inferrg.LE.eps) THEN
537 & wrkrc(itdcptr),n,
538 & iwrk(imycptr),inummyc)
540 & wrkrc(itdrptr),m,
541 & iwrk(imyrptr),inummyr)
542 IF(iter .LE. nb1) THEN
543 iter = nb1+1
544 cycle
545 ELSE
546 EXIT
547 ENDIF
548 ENDIF
549 ENDIF
550 ELSE
551
552 IF((eps .GT. rzero) .OR.
553 & (iter.EQ.nb1).OR.
554 & ((iter.EQ.nb1+nb2+nb3).AND.
555 & (nb1+nb3.GT.0))) THEN
557 & wrkrc(itdrptr), m)
558
560 & wrkrc(itdcptr), n)
561
562 inferrl = inferrcol
563 IF(inferrrow > inferrl) THEN
564 inferrl = inferrrow
565 ENDIF
566 inferrg = inferrl
567 IF(inferrg.LE.eps) THEN
570 IF(iter .LE. nb1) THEN
571 iter = nb1+1
572 cycle
573 ELSE
574 EXIT
575 ENDIF
576 ENDIF
577 ENDIF
578 ENDIF
579 ELSE
580
581
582 IF((iter .EQ.1).OR.(oorangeind.EQ.1))THEN
583 DO nzind=1_8,nz_loc
584 ir = irn_loc(nzind)
585 ic = jcn_loc(nzind)
586 IF((ir.GE.1).AND.(ir.LE.m).AND.
587 & (ic.GE.1).AND.(ic.LE.n)) THEN
588 elm = abs(a_loc(nzind))*rowsca(ir)*colsca(ic)
589 wrkrc(itdrptr-1+ir) = wrkrc(itdrptr-1+ir) + elm
590 wrkrc(itdcptr-1+ic) = wrkrc(itdcptr-1+ic) + elm
591 ELSE
592 oorangeind = 1
593 ENDIF
594 ENDDO
595 ELSEIF(oorangeind.EQ.0) THEN
596 DO nzind=1,nz_loc
597 ir = irn_loc(nzind)
598 ic = jcn_loc(nzind)
599 elm = abs(a_loc(nzind))*rowsca(ir)*colsca(ic)
600 wrkrc(itdrptr-1+ir) = wrkrc(itdrptr-1+ir) + elm
601 wrkrc(itdcptr-1+ic) = wrkrc(itdcptr-1+ic) + elm
602 ENDDO
603 ENDIF
604 IF(numprocs > 1) THEN
606 & wrkrc(itdcptr), n, tag_iters+iter,
607 & icsndrcvnum, iwrk(icnghbprcs),
608 & icsndrcvvol, iwrk(icsndrcvia), iwrk(icsndrcvja),
609 & wrkrc(isrcptr),
610 & ocsndrcvnum, iwrk(ocnghbprcs),
611 & ocsndrcvvol, iwrk(ocsndrcvia), iwrk(ocsndrcvja),
612 & wrkrc( osrcptr),
613 & iwrk(istatus), iwrk(requests),
614 & comm)
615
617 & wrkrc(itdrptr), m, tag_iters+2+iter,
618 & irsndrcvnum, iwrk(irnghbprcs),
619 & irsndrcvvol, iwrk(irsndrcvia), iwrk(irsndrcvja),
620 & wrkrc(isrrptr),
621 & orsndrcvnum, iwrk(ornghbprcs),
622 & orsndrcvvol, iwrk(orsndrcvia), iwrk(orsndrcvja),
623 & wrkrc( osrrptr),
624 & iwrk(istatus), iwrk(requests),
625 & comm)
626 IF((eps .GT. rzero) .OR.
627 & ((iter.EQ.nb1+nb2).AND.
628 & (nb2.GT.0))) THEN
630 & wrkrc(itdrptr), m,
631 & iwrk(imyrptr),inummyr)
632
634 & wrkrc(itdcptr), n,
635 & iwrk(imycptr),inummyc)
636
637 oneerrl = oneerrcol
638 IF(oneerrrow > oneerrl ) THEN
639 oneerrl = oneerrrow
640 ENDIF
641
643 & 1, mpi_double_precision,
644 & mpi_max, comm, ierror)
645 IF(oneerrg.LE.eps) THEN
647 & wrkrc(itdcptr),n,
648 & iwrk(imycptr),inummyc)
650 & wrkrc(itdrptr),m,
651 & iwrk(imyrptr),inummyr)
652 iter = nb1+nb2+1
653 cycle
654 ENDIF
655 ENDIF
656 ELSE
657
658 IF((eps .GT. rzero) .OR.
659 & ((iter.EQ.nb1+nb2).AND.
660 & (nb2.GT.0))) THEN
662 & wrkrc(itdrptr), m)
663
665 & wrkrc(itdcptr), n)
666
667 oneerrl = oneerrcol
668 IF(oneerrrow > oneerrl) THEN
669 oneerrl = oneerrrow
670 ENDIF
671 oneerrg = oneerrl
672 IF(oneerrg.LE.eps) THEN
675 iter = nb1+nb2+1
676 cycle
677 ENDIF
678 ENDIF
679 ENDIF
680 ENDIF
681 IF(numprocs > 1) THEN
683 & iwrk(imycptr),inummyc)
685 & iwrk(imyrptr),inummyr)
686
687 ELSE
688
691 ENDIF
692 iter = iter + 1
693 ENDDO
694 onenormerr = oneerrg
695 infnormerr = inferrg
696 IF(numprocs > 1) THEN
697 CALL mpi_reduce(rowsca, wrkrc(1), m, mpi_double_precision,
698 & mpi_max, 0,
699 & comm, ierror)
700 IF(myid.EQ.0) THEN
701 DO i=1, m
702 rowsca(i) = wrkrc(i)
703 ENDDO
704 ENDIF
705
706
707
708
709
710 CALL mpi_reduce(colsca, wrkrc(1+m), n, mpi_double_precision,
711 & mpi_max, 0,
712 & comm, ierror)
713 If(myid.EQ.0) THEN
714 DO i=1, n
715 colsca(i) = wrkrc(i+m)
716 ENDDO
717 ENDIF
718 ENDIF
719 ENDIF
720 RETURN
subroutine zmumps_fillmyrowcolindices(myid, numprocs, comm, irn_loc, jcn_loc, nz_loc, rowpartvec, colpartvec, m, n, myrowindices, inummyr, mycolindices, inummyc, iwrk, iwsz)
subroutine zmumps_numvolsndrcv(myid, numprocs, isz, ipartvec, nz_loc, indx, osz, oindx, isndrcvnum, isndrcvvol, osndrcvnum, osndrcvvol, iwrk, iwrksz, sndsz, rcvsz, comm)
integer function zmumps_chkconvglo(dr, m, indxr, indxrsz, dc, n, indxc, indxcsz, eps, comm)
subroutine zmumps_createpartvec(myid, numprocs, comm, irn_loc, jcn_loc, nz_loc, ipartvec, isz, osz, iwrk, iwsz)
subroutine zmumps_setupcomms(myid, numprocs, isz, ipartvec, nz_loc, indx, osz, oindx, isndrcvnum, isndvol, inghbprcs, isndrcvia, isndrcvja, osndrcvnum, osndvol, onghbprcs, osndrcvia, osndrcvja, sndsz, rcvsz, iwrk, istatus, requests, itagcomm, comm)
subroutine zmumps_findnummyrowcol(myid, numprocs, comm, irn_loc, jcn_loc, nz_loc, rowpartvec, colpartvec, m, n, inummyr, inummyc, iwrk, iwsz)