91 & M, N, NUMPROCS, MYID, COMM,
93 & RSNDRCVSZ, CSNDRCVSZ, REGISTRE,
96 & ROWSCA, COLSCA, WRKRC, ISZWRKRC,
98 & ONENORMERR, INFNORMERR)
197 INTEGER IWRKSZ, INTSZ, ISZWRKRC
199 INTEGER NUMPROCS, MYID, COMM
201 INTEGER IRN_loc(NZ_loc)
203 COMPLEX(kind=8) A_loc(NZ_loc)
206 INTEGER RSNDRCVSZ(2*NUMPROCS)
207 INTEGER CSNDRCVSZ(2*NUMPROCS)
210 DOUBLE PRECISION ROWSCA(M)
211 DOUBLE PRECISION COLSCA(N)
212 DOUBLE PRECISION (ISZWRKRC)
213 DOUBLE PRECISION ONENORMERR,INFNORMERR
215 INTEGER IRSNDRCVNUM, ORSNDRCVNUM
216 INTEGER ICSNDRCVNUM, OCSNDRCVNUM
217 INTEGER IRSNDRCVVOL, ORSNDRCVVOL
218 INTEGER ICSNDRCVVOL, OCSNDRCVVOL
219 INTEGER INUMMYR, INUMMYC
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
238 parameter(tag_comm_col=100)
240 parameter(tag_comm_row=101)
242 parameter(tag_iters=102)
255 INTEGER ZMUMPS_CHKCONVGLO
256 INTEGER ZMUMPS_CHK1CONV
257 DOUBLE PRECISION ZMUMPS_ERRSCALOC
258 DOUBLE PRECISION ZMUMPS_ERRSCA1
260 DOUBLE PRECISION RONE, RZERO
261 PARAMETER(RONE=1.0d0,rzero=0.0d0)
264 INTEGER INTSZR, INTSZC
267 DOUBLE PRECISION ONEERRROW, ONEERRCOL, ONEERRL, ONEERRG
268 DOUBLE PRECISION INFERRROW, INFERRCOL, INFERRL, INFERRG
274 IF(maxmn < n) maxmn = n
277 IF(numprocs > 1)
THEN
281 & irn_loc, jcn_loc, nz_loc,
285 & jcn_loc, irn_loc, nz_loc,
290 & nz_loc, irn_loc, n, jcn_loc,
291 & irsndrcvnum,irsndrcvvol,
292 & orsndrcvnum,orsndrcvvol,
294 & rsndrcvsz(1), rsndrcvsz(1+numprocs), comm)
296 & nz_loc, jcn_loc, m, irn_loc,
297 & icsndrcvnum,icsndrcvvol,
298 & ocsndrcvnum,ocsndrcvvol,
300 & csndrcvsz(1), csndrcvsz(1+numprocs), comm)
302 & irn_loc, jcn_loc, nz_loc,
303 & rpartvec, cpartvec, m, n,
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
330 reszr = m + irsndrcvvol + orsndrcvvol
331 reszc = n + icsndrcvvol + ocsndrcvvol
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
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
366 & irn_loc, jcn_loc, nz_loc,
367 & rpartvec, cpartvec, m, n,
369 & iwrk(1+inummyr), inummyc,
370 & iwrk(1+inummyr+inummyc), iwrksz-inummyr-inummyc )
372 imycptr = imyrptr + inummyr
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
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
393 istatus = requests + numprocs
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),
405 & iwrk(istatus), iwrk(requests),
406 & tag_comm_row, comm)
408 & nz_loc, jcn_loc, m, irn_loc,
409 & icsndrcvnum, icsndrcvvol,
413 & ocsndrcvnum, ocsndrcvvol,
414 & iwrk(ocnghbprcs),iwrk(ocsndrcvia),iwrk(ocsndrcvja),
415 & csndrcvsz(1), csndrcvsz(1+numprocs),
417 & iwrk(istatus), iwrk(requests),
418 & tag_comm_col, comm)
422 & iwrk(imyrptr),inummyr, rone)
424 & iwrk(imycptr),inummyc, rone)
430 itdcptr = itdrptr + m
432 isrrptr = itdcptr + n
433 osrrptr = isrrptr + irsndrcvvol
435 isrcptr = osrrptr + orsndrcvvol
436 osrcptr = isrcptr + icsndrcvvol
438 IF(numprocs == 1)
THEN
439 osrcptr = osrcptr - 1
440 isrcptr = isrcptr - 1
441 osrrptr = osrrptr - 1
442 isrrptr = isrrptr - 1
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
450 DO WHILE (iter.LE.nb1+nb2+nb3)
452 IF(numprocs > 1)
THEN
454 & iwrk(imyrptr),inummyr)
456 & iwrk(imycptr),inummyc)
461 IF((iter.LE.nb1).OR.(iter > nb1+nb2))
THEN
463 IF((iter.EQ.1).OR.(oorangeind.EQ.1))
THEN
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
473 IF(wrkrc(itdcptr-1+ic)<elm)
THEN
474 wrkrc(itdcptr-1+ic)= elm
480 ELSEIF(oorangeind.EQ.0)
THEN
484 elm = abs(a_loc(nzind))*rowsca(ir)*colsca(ic)
485 IF(wrkrc(itdrptr-1+ir)<elm)
THEN
486 wrkrc(itdrptr-1+ir)= elm
488 IF(wrkrc(itdcptr-1+ic)<elm)
THEN
489 wrkrc(itdcptr-1+ic)= elm
493 IF(numprocs > 1)
THEN
496 & icsndrcvnum,iwrk(icnghbprcs),
497 & icsndrcvvol,iwrk(icsndrcvia), iwrk(icsndrcvja),
499 & ocsndrcvnum,iwrk(ocnghbprcs),
500 & ocsndrcvvol,iwrk(ocsndrcvia), iwrk(ocsndrcvja),
502 & iwrk(istatus),iwrk(requests),
506 & wrkrc(itdrptr), m, tag_iters+2+iter,
507 & irsndrcvnum,iwrk(irnghbprcs),
508 & irsndrcvvol,iwrk(irsndrcvia), iwrk(irsndrcvja),
510 & orsndrcvnum,iwrk(ornghbprcs),
511 & orsndrcvvol,iwrk(orsndrcvia), iwrk(orsndrcvja),
513 & iwrk(istatus),iwrk(requests),
515 IF((eps .GT. rzero) .OR.
517 & ((iter.EQ.nb1+nb2+nb3).AND.
518 & (nb1+nb3.GT.0)))
THEN
519 inferrrow = zmumps_errscaloc(rowsca,
521 & iwrk(imyrptr),inummyr)
523 inferrcol = zmumps_errscaloc
525 & iwrk(imycptr),inummyc)
528 IF(inferrrow > inferrl )
THEN
533 & 1, mpi_double_precision,
534 & mpi_max, comm, ierror)
535 IF(inferrg.LE.eps)
THEN
538 & iwrk(imycptr),inummyc)
541 & iwrk(imyrptr),inummyr)
542 IF(iter .LE. nb1)
THEN
552 IF((eps .GT. rzero) .OR.
554 & ((iter.EQ.nb1+nb2+nb3).AND.
555 & (nb1+nb3.GT.0)))
THEN
556 inferrrow = zmumps_errsca1(rowsca,
559 inferrcol = zmumps_errsca1(colsca,
563 IF(inferrrow > inferrl)
THEN
567 IF(inferrg.LE.eps)
THEN
570 IF(iter .LE. nb1)
THEN
582 IF((iter .EQ.1).OR.(oorangeind.EQ.1))
THEN
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
595 ELSEIF(oorangeind.EQ.0)
THEN
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
604 IF(numprocs > 1)
THEN
606 & wrkrc(itdcptr), n, tag_iters+iter,
607 & icsndrcvnum, iwrk(icnghbprcs),
608 & icsndrcvvol, iwrk(icsndrcvia), iwrk(icsndrcvja),
610 & ocsndrcvnum, iwrk(ocnghbprcs),
611 & ocsndrcvvol, iwrk(ocsndrcvia), iwrk(ocsndrcvja),
613 & iwrk(istatus), iwrk(requests),
617 & wrkrc(itdrptr), m, tag_iters+2+iter,
618 & irsndrcvnum, iwrk(irnghbprcs),
619 & irsndrcvvol, iwrk(irsndrcvia), iwrk(irsndrcvja),
621 & orsndrcvnum, iwrk(ornghbprcs),
622 & orsndrcvvol, iwrk(orsndrcvia), iwrk(orsndrcvja),
624 & iwrk(istatus), iwrk(requests),
626 IF((eps .GT. rzero) .OR.
627 & ((iter.EQ.nb1+nb2).AND.
629 oneerrrow = zmumps_errscaloc(rowsca,
631 & iwrk(imyrptr),inummyr)
633 oneerrcol = zmumps_errscaloc(colsca,
635 & iwrk(imycptr),inummyc)
638 IF(oneerrrow > oneerrl )
THEN
643 & 1, mpi_double_precision,
644 & mpi_max, comm, ierror)
645 IF(oneerrg.LE.eps)
THEN
648 & iwrk(imycptr),inummyc)
651 & iwrk(imyrptr),inummyr)
658 IF((eps .GT. rzero) .OR.
659 & ((iter.EQ.nb1+nb2).AND.
661 oneerrrow = zmumps_errsca1(rowsca,
664 oneerrcol = zmumps_errsca1(colsca,
668 IF(oneerrrow > oneerrl)
THEN
672 IF(oneerrg.LE.eps)
THEN
681 IF(numprocs > 1)
THEN
683 & iwrk(imycptr),inummyc)
685 & iwrk(imyrptr),inummyr)
696 IF(numprocs > 1)
THEN
697 CALL mpi_reduce(rowsca, wrkrc(1), m, mpi_double_precision,
710 CALL mpi_reduce(colsca, wrkrc(1+m), n, mpi_double_precision,
715 colsca(i) = wrkrc(i+m)
728 & N, NUMPROCS, MYID, COMM,
734 & SCA, WRKRC, ISZWRKRC,
735 & NB1, NB2, NB3, EPS,
736 & ONENORMERR, INFNORMERR)
827 INTEGER N, IWRKSZ, OP
828 INTEGER NUMPROCS, MYID, COMM
830 INTEGER IRN_loc(NZ_loc)
831 INTEGER JCN_loc(NZ_loc)
832 COMPLEX(kind=8) A_loc(NZ_loc)
833 INTEGER PARTVEC(N), RSNDRCVSZ(2*NUMPROCS)
836 DOUBLE PRECISION SCA(N)
838 DOUBLE PRECISION WRKRC(ISZWRKRC)
840 INTEGER IRSNDRCVNUM, ORSNDRCVNUM
841 INTEGER IRSNDRCVVOL, ORSNDRCVVOL
844 INTEGER IMYRPTR,IMYCPTR
845 INTEGER IRNGHBPRCS, IRSNDRCVIA,IRSNDRCVJA
846 INTEGER ORNGHBPRCS, ORSNDRCVIA,ORSNDRCVJA
847 INTEGER ISTATUS, REQUESTS, TMPWORK
848 INTEGER ITDRPTR, ISRRPTR, OSRRPTR
849 DOUBLE PRECISION ONENORMERR,INFNORMERR
851 INTEGER NB1, NB2, NB3
859 parameter(tag_comm_row=101)
861 parameter(tag_iters=102)
874 INTEGER ZMUMPS_CHKCONVGLOSYM
875 INTEGER ZMUMPS_CHK1CONV
876 DOUBLE PRECISION ZMUMPS_ERRSCALOC
877 DOUBLE PRECISION ZMUMPS_ERRSCA1
879 DOUBLE PRECISION RONE, RZERO
880 parameter(rone=1.0d0,rzero=0.0d0)
885 DOUBLE PRECISION ONEERRL, ONEERRG
886 DOUBLE PRECISION INFERRL, INFERRG
893 IF(numprocs > 1)
THEN
897 & irn_loc, jcn_loc, nz_loc,
902 & nz_loc, irn_loc, jcn_loc, irsndrcvnum,irsndrcvvol,
903 & orsndrcvnum, orsndrcvvol,
905 & rsndrcvsz(1), rsndrcvsz(1+numprocs), comm)
908 & irn_loc, jcn_loc, nz_loc,
913 intszr = irsndrcvnum + orsndrcvnum +
914 & irsndrcvvol + orsndrcvvol +
915 & 2*(numprocs+1) + inummyr
917 & (mpi_status_size +1) * numprocs
928 resz = n + irsndrcvvol + orsndrcvvol
929 registre(1) = irsndrcvnum
930 registre(2) = orsndrcvnum
931 registre(3) = irsndrcvvol
932 registre(4) = orsndrcvvol
933 registre(9) = inummyr
939 irsndrcvnum = registre(1)
940 orsndrcvnum = registre(2)
941 irsndrcvvol = registre(3)
942 orsndrcvvol = registre(4)
943 inummyr = registre(9)
944 IF(numprocs > 1)
THEN
950 & irn_loc, jcn_loc, nz_loc,
953 & iwrk(1+inummyr), iwrksz-inummyr)
955 imycptr = imyrptr + inummyr
961 irsndrcvia = irnghbprcs+irsndrcvnum
962 irsndrcvja = irsndrcvia + numprocs+1
963 ornghbprcs = irsndrcvja + irsndrcvvol
964 orsndrcvia = ornghbprcs + orsndrcvnum
965 orsndrcvja = orsndrcvia + numprocs + 1
967 requests = orsndrcvja + orsndrcvvol
968 istatus = requests + numprocs
970 tmpwork = istatus + mpi_status_size * numprocs
972 & nz_loc, irn_loc, jcn_loc,
973 & irsndrcvnum, irsndrcvvol,
974 & iwrk(irnghbprcs),iwrk(irsndrcvia),iwrk(irsndrcvja),
975 & orsndrcvnum, orsndrcvvol,
976 & iwrk(ornghbprcs),iwrk(orsndrcvia),iwrk(orsndrcvja),
977 & rsndrcvsz(1), rsndrcvsz(1+numprocs),
979 & iwrk(istatus), iwrk(requests),
980 & tag_comm_row, comm)
983 & iwrk(imyrptr),inummyr, rone)
988 isrrptr = itdrptr + n
989 osrrptr = isrrptr + irsndrcvvol
992 IF(numprocs == 1)
THEN
993 osrrptr = osrrptr - 1
994 isrrptr = isrrptr - 1
996 IF(irsndrcvvol == 0) isrrptr = isrrptr - 1
997 IF(orsndrcvvol == 0) osrrptr = osrrptr - 1
1001 DO WHILE(iter.LE.nb1+nb2+nb3)
1003 IF(numprocs > 1)
THEN
1005 & iwrk(imyrptr),inummyr)
1009 IF((iter.LE.nb1).OR.(iter > nb1+nb2))
THEN
1011 IF((iter.EQ.1).OR.(oorangeind.EQ.1))
THEN
1015 IF((ir.GE.1).AND.(ir.LE.n).AND.
1016 & (ic.GE.1).AND.(ic.LE.n))
THEN
1017 elm = abs(a_loc(nzind))*sca(ir)*sca(ic)
1018 IF(wrkrc(itdrptr-1+ir)<elm)
THEN
1019 wrkrc(itdrptr-1+ir)= elm
1021 IF(wrkrc(itdrptr-1+ic)<elm)
THEN
1022 wrkrc(itdrptr-1+ic)= elm
1028 ELSEIF(oorangeind.EQ.0)
THEN
1032 elm = abs(a_loc(nzind))*sca(ir)*sca(ic)
1033 IF(wrkrc(itdrptr-1+ir)<elm)
THEN
1034 wrkrc(itdrptr-1+ir)= elm
1036 IF(wrkrc(itdrptr-1+ic)<elm)
THEN
1037 wrkrc(itdrptr-1+ic)= elm
1041 IF(numprocs > 1)
THEN
1043 & wrkrc(itdrptr), n, tag_iters+2+iter,
1044 & irsndrcvnum,iwrk(irnghbprcs),
1045 & irsndrcvvol,iwrk(irsndrcvia), iwrk(irsndrcvja),
1047 & orsndrcvnum,iwrk(ornghbprcs),
1048 & orsndrcvvol,iwrk(orsndrcvia), iwrk(orsndrcvja),
1050 & iwrk(istatus),iwrk(requests),
1052 IF((eps .GT. rzero) .OR.
1054 & ((iter.EQ.nb1+nb2+nb3).AND.
1055 & (nb1+nb3.GT.0)))
THEN
1056 inferrl = zmumps_errscaloc(sca,
1057 & wrkrc(itdrptr), n,
1058 & iwrk(imyrptr),inummyr)
1060 & 1, mpi_double_precision,
1061 & mpi_max, comm, ierror)
1062 IF(inferrg.LE.eps)
THEN
1064 & iwrk(imyrptr),inummyr)
1065 IF(iter .LE. nb1)
THEN
1075 IF((eps .GT. rzero) .OR.
1077 & ((iter.EQ.nb1+nb2+nb3).AND.
1078 & (nb1+nb3.GT.0)))
THEN
1079 inferrl = zmumps_errsca1(sca,
1080 & wrkrc(itdrptr), n)
1082 IF(inferrg.LE.eps)
THEN
1084 IF(iter .LE. nb1)
THEN
1096 IF((iter.EQ.1).OR.(oorangeind.EQ.1))
THEN
1100 IF((ir.GE.1).AND.(ir.LE.n).AND.
1101 & (ic.GE.1).AND.(ic.LE.n))
THEN
1102 elm = abs(a_loc(nzind))*sca(ir)*sca(ic)
1103 wrkrc(itdrptr-1+ir) = wrkrc(itdrptr-1+ir) + elm
1105 wrkrc(itdrptr-1+ic) =
1106 & wrkrc(itdrptr-1+ic) + elm
1112 ELSEIF(oorangeind.EQ.0)
THEN
1116 elm = abs(a_loc(nzind))*sca(ir)*sca(ic)
1117 wrkrc(itdrptr-1+ir) = wrkrc(itdrptr-1+ir) + elm
1119 wrkrc(itdrptr-1+ic) = wrkrc(itdrptr-1+ic) + elm
1123 IF(numprocs > 1)
THEN
1125 & wrkrc(itdrptr), n, tag_iters+2+iter,
1126 & irsndrcvnum, iwrk(irnghbprcs),
1127 & irsndrcvvol, iwrk(irsndrcvia), iwrk(irsndrcvja),
1129 & orsndrcvnum, iwrk(ornghbprcs),
1130 & orsndrcvvol, iwrk(orsndrcvia), iwrk(orsndrcvja),
1132 & iwrk(istatus), iwrk(requests),
1134 IF((eps .GT. rzero) .OR.
1135 & ((iter.EQ.nb1+nb2).AND.
1137 oneerrl = zmumps_errscaloc
1138 & wrkrc(itdrptr), n,
1139 & iwrk(imyrptr),inummyr)
1142 & 1, mpi_double_precision,
1143 & mpi_max, comm, ierror)
1144 IF(oneerrg.LE.eps)
THEN
1146 & iwrk(imyrptr),inummyr)
1153 IF((eps .GT. rzero) .OR.
1154 & ((iter.EQ.nb1+nb2).AND.
1156 oneerrl = zmumps_errsca1(sca,
1157 & wrkrc(itdrptr), n)
1159 IF(oneerrg.LE.eps)
THEN
1167 IF(numprocs > 1)
THEN
1169 & iwrk(imyrptr),inummyr)
1175 onenormerr = oneerrg
1176 infnormerr = inferrg
1177 IF(numprocs > 1)
THEN
1178 CALL mpi_reduce(sca, wrkrc(1), n, mpi_double_precision,