97,101d96 < < The returned values r, c, and sometimes v are obtained in a single PetscMalloc(). Then in MatDestroy_MUMPS() it is < freed with PetscFree((mumps->irn); This is not ideal code, the fact that v is ONLY sometimes part of mumps->irn means < that the PetscMalloc() cannot easily be replaced with a PetscMalloc3(). < 121c116 < ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr); --- > ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 142,143c137,138 < const PetscInt *ai,*aj,*ajj,bs2 = aa->bs2; < PetscInt bs,M,nz,idx=0,rnz,i,j,k,m; --- > const PetscInt *ai,*aj,*ajj,bs=A->rmap->bs,bs2=aa->bs2,M=A->rmap->N/bs; > PetscInt nz,idx=0,rnz,i,j,k,m; 148,149d142 < ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); < M = A->rmap->N/bs; 155c148 < ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr); --- > ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 193c186 < ierr = PetscMalloc1(2*nz, &row);CHKERRQ(ierr); --- > ierr = PetscMalloc(2*nz*sizeof(PetscInt), &row);CHKERRQ(ierr); 219c212 < Mat_SeqAIJ *aa=(Mat_SeqAIJ*)A->data; --- > Mat_SeqSBAIJ *aa=(Mat_SeqSBAIJ*)A->data; 225,227c218 < /* count nz in the uppper triangular part of A */ < nz = 0; < for (i=0; i nz = M + (aa->nz-M)/2; 229d219 < 389c379 < const PetscInt bs2=mat->bs2; --- > const PetscInt bs = A->rmap->bs,bs2=mat->bs2; 391c381 < PetscInt bs,nz,i,j,k,n,jj,irow,countA,countB,idx; --- > PetscInt nz,i,j,k,n,jj,irow,countA,countB,idx; 397d386 < ierr = MatGetBlockSize(A,&bs);CHKERRQ(ierr); 556d544 < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetIcntl_C",NULL);CHKERRQ(ierr); 558,563d545 < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetCntl_C",NULL);CHKERRQ(ierr); < < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfo_C",NULL);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetInfog_C",NULL);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfo_C",NULL);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)A,"MatMumpsGetRinfog_C",NULL);CHKERRQ(ierr); 571,577c553,558 < Mat_MUMPS *mumps=(Mat_MUMPS*)A->spptr; < PetscScalar *array; < Vec b_seq; < IS is_iden,is_petsc; < PetscErrorCode ierr; < PetscInt i; < static PetscBool cite1 = PETSC_FALSE,cite2 = PETSC_FALSE; --- > Mat_MUMPS *mumps=(Mat_MUMPS*)A->spptr; > PetscScalar *array; > Vec b_seq; > IS is_iden,is_petsc; > PetscErrorCode ierr; > PetscInt i; 580,581d560 < ierr = PetscCitationsRegister("@article{MUMPS01,\n author = {P.~R. Amestoy and I.~S. Duff and J.-Y. L'Excellent and J. Koster},\n title = {A fully asynchronous multifrontal solver using distributed dynamic scheduling},\n journal = {SIAM Journal on Matrix Analysis and Applications},\n volume = {23},\n number = {1},\n pages = {15--41},\n year = {2001}\n}\n",&cite1);CHKERRQ(ierr); < ierr = PetscCitationsRegister("@article{MUMPS02,\n author = {P.~R. Amestoy and A. Guermouche and J.-Y. L'Excellent and S. Pralet},\n title = {Hybrid scheduling for the parallel solution of linear systems},\n journal = {Parallel Computing},\n volume = {32},\n number = {2},\n pages = {136--156},\n year = {2006}\n}\n",&cite2);CHKERRQ(ierr); 750,753d728 < < (F)->assembled = PETSC_TRUE; < mumps->matstruc = SAME_NONZERO_PATTERN; < mumps->CleanUpMUMPS = PETSC_TRUE; 756,758d730 < PetscInt lsol_loc; < PetscScalar *sol_loc; < 763,765c735 < < /* distributed solution; Create x_seq=sol_loc for repeated use */ < if (mumps->x_seq) { --- > if (mumps->scat_sol) { 770,772c740,756 < lsol_loc = mumps->id.INFO(23); /* length of sol_loc */ < ierr = PetscMalloc2(lsol_loc,&sol_loc,lsol_loc,&mumps->id.isol_loc);CHKERRQ(ierr); < mumps->id.lsol_loc = lsol_loc; --- > } > (F)->assembled = PETSC_TRUE; > mumps->matstruc = SAME_NONZERO_PATTERN; > mumps->CleanUpMUMPS = PETSC_TRUE; > > if (mumps->size > 1) { > /* distributed solution */ > if (!mumps->scat_sol) { > /* Create x_seq=sol_loc for repeated use */ > PetscInt lsol_loc; > PetscScalar *sol_loc; > > lsol_loc = mumps->id.INFO(23); /* length of sol_loc */ > > ierr = PetscMalloc2(lsol_loc,PetscScalar,&sol_loc,lsol_loc,PetscInt,&mumps->id.isol_loc);CHKERRQ(ierr); > > mumps->id.lsol_loc = lsol_loc; 775c759 < mumps->id.sol_loc = (mumps_complex*)sol_loc; --- > mumps->id.sol_loc = (mumps_complex*)sol_loc; 777c761 < mumps->id.sol_loc = (mumps_double_complex*)sol_loc; --- > mumps->id.sol_loc = (mumps_double_complex*)sol_loc; 780c764 < mumps->id.sol_loc = sol_loc; --- > mumps->id.sol_loc = sol_loc; 782c766,767 < ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,lsol_loc,sol_loc,&mumps->x_seq);CHKERRQ(ierr); --- > ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,1,lsol_loc,sol_loc,&mumps->x_seq);CHKERRQ(ierr); > } 937c922 < ierr = PetscMalloc1(M,&perm_in);CHKERRQ(ierr); --- > ierr = PetscMalloc(M*sizeof(PetscInt),&perm_in);CHKERRQ(ierr); 969c954,957 < ierr = MatGetVecs(A,NULL,&b);CHKERRQ(ierr); --- > ierr = VecCreate(PetscObjectComm((PetscObject)A),&b);CHKERRQ(ierr); > ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); > ierr = VecSetFromOptions(b);CHKERRQ(ierr); > 1047c1035,1038 < ierr = MatGetVecs(A,NULL,&b);CHKERRQ(ierr); --- > ierr = VecCreate(PetscObjectComm((PetscObject)A),&b);CHKERRQ(ierr); > ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); > ierr = VecSetFromOptions(b);CHKERRQ(ierr); > 1124c1115,1118 < ierr = MatGetVecs(A,NULL,&b);CHKERRQ(ierr); --- > ierr = VecCreate(PetscObjectComm((PetscObject)A),&b);CHKERRQ(ierr); > ierr = VecSetSizes(b,A->rmap->n,PETSC_DECIDE);CHKERRQ(ierr); > ierr = VecSetFromOptions(b);CHKERRQ(ierr); > 1265,1270d1258 < ierr = PetscViewerASCIIPrintf(viewer," INFOG(28) (after factorization: number of null pivots encountered): %d\n",mumps->id.INFOG(28));CHKERRQ(ierr); < ierr = PetscViewerASCIIPrintf(viewer," INFOG(29) (after factorization: effective number of entries in the factors (sum over all processors)): %d\n",mumps->id.INFOG(29));CHKERRQ(ierr); < ierr = PetscViewerASCIIPrintf(viewer," INFOG(30, 31) (after solution: size in Mbytes of memory used during solution phase): %d, %d\n",mumps->id.INFOG(30),mumps->id.INFOG(31));CHKERRQ(ierr); < ierr = PetscViewerASCIIPrintf(viewer," INFOG(32) (after analysis: type of analysis done): %d\n",mumps->id.INFOG(32));CHKERRQ(ierr); < ierr = PetscViewerASCIIPrintf(viewer," INFOG(33) (value used for ICNTL(8)): %d\n",mumps->id.INFOG(33));CHKERRQ(ierr); < ierr = PetscViewerASCIIPrintf(viewer," INFOG(34) (exponent of the determinant if determinant is requested): %d\n",mumps->id.INFOG(34));CHKERRQ(ierr); 1310,1320d1297 < #define __FUNCT__ "MatMumpsGetIcntl_MUMPS" < PetscErrorCode MatMumpsGetIcntl_MUMPS(Mat F,PetscInt icntl,PetscInt *ival) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *ival = mumps->id.ICNTL(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ 1352,1382d1328 < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetIcntl" < /*@ < MatMumpsGetIcntl - Get MUMPS parameter ICNTL() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array ICNTL() < < Output Parameter: < . ival - value of MUMPS ICNTL(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetIcntl(Mat F,PetscInt icntl,PetscInt *ival) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidLogicalCollectiveInt(F,icntl,2); < PetscValidIntPointer(ival,3); < ierr = PetscTryMethod(F,"MatMumpsGetIcntl_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < 1396,1406d1341 < #define __FUNCT__ "MatMumpsGetCntl_MUMPS" < PetscErrorCode MatMumpsGetCntl_MUMPS(Mat F,PetscInt icntl,PetscReal *val) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *val = mumps->id.CNTL(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ 1433c1368 < PetscValidLogicalCollectiveReal(F,val,3); --- > PetscValidLogicalCollectiveInt(F,val,3); 1438,1632d1372 < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetCntl" < /*@ < MatMumpsGetCntl - Get MUMPS parameter CNTL() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array CNTL() < < Output Parameter: < . val - value of MUMPS CNTL(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetCntl(Mat F,PetscInt icntl,PetscReal *val) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidLogicalCollectiveInt(F,icntl,2); < PetscValidRealPointer(val,3); < ierr = PetscTryMethod(F,"MatMumpsGetCntl_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetInfo_MUMPS" < PetscErrorCode MatMumpsGetInfo_MUMPS(Mat F,PetscInt icntl,PetscInt *info) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *info = mumps->id.INFO(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetInfog_MUMPS" < PetscErrorCode MatMumpsGetInfog_MUMPS(Mat F,PetscInt icntl,PetscInt *infog) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *infog = mumps->id.INFOG(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetRinfo_MUMPS" < PetscErrorCode MatMumpsGetRinfo_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfo) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *rinfo = mumps->id.RINFO(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetRinfog_MUMPS" < PetscErrorCode MatMumpsGetRinfog_MUMPS(Mat F,PetscInt icntl,PetscReal *rinfog) < { < Mat_MUMPS *mumps =(Mat_MUMPS*)F->spptr; < < PetscFunctionBegin; < *rinfog = mumps->id.RINFOG(icntl); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetInfo" < /*@ < MatMumpsGetInfo - Get MUMPS parameter INFO() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array INFO() < < Output Parameter: < . ival - value of MUMPS INFO(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetInfo(Mat F,PetscInt icntl,PetscInt *ival) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidIntPointer(ival,3); < ierr = PetscTryMethod(F,"MatMumpsGetInfo_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetInfog" < /*@ < MatMumpsGetInfog - Get MUMPS parameter INFOG() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array INFOG() < < Output Parameter: < . ival - value of MUMPS INFOG(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetInfog(Mat F,PetscInt icntl,PetscInt *ival) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidIntPointer(ival,3); < ierr = PetscTryMethod(F,"MatMumpsGetInfog_C",(Mat,PetscInt,PetscInt*),(F,icntl,ival));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetRinfo" < /*@ < MatMumpsGetRinfo - Get MUMPS parameter RINFO() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array RINFO() < < Output Parameter: < . val - value of MUMPS RINFO(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetRinfo(Mat F,PetscInt icntl,PetscReal *val) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidRealPointer(val,3); < ierr = PetscTryMethod(F,"MatMumpsGetRinfo_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < < #undef __FUNCT__ < #define __FUNCT__ "MatMumpsGetRinfog" < /*@ < MatMumpsGetRinfog - Get MUMPS parameter RINFOG() < < Logically Collective on Mat < < Input Parameters: < + F - the factored matrix obtained by calling MatGetFactor() from PETSc-MUMPS interface < - icntl - index of MUMPS parameter array RINFOG() < < Output Parameter: < . val - value of MUMPS RINFOG(icntl) < < Level: beginner < < References: MUMPS Users' Guide < < .seealso: MatGetFactor() < @*/ < PetscErrorCode MatMumpsGetRinfog(Mat F,PetscInt icntl,PetscReal *val) < { < PetscErrorCode ierr; < < PetscFunctionBegin; < PetscValidRealPointer(val,3); < ierr = PetscTryMethod(F,"MatMumpsGetRinfog_C",(Mat,PetscInt,PetscReal*),(F,icntl,val));CHKERRQ(ierr); < PetscFunctionReturn(0); < } < 1691c1431 < ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); --- > ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1698d1437 < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 1700,1705d1438 < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); < < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 1750c1483 < ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); --- > ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1765,1773c1498,1499 < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); < < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); --- > ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetIcntl_C",MatMumpsSetIcntl);CHKERRQ(ierr); > ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsSetCntl_C",MatMumpsSetCntl);CHKERRQ(ierr); 1811c1537 < ierr = PetscNewLog(B,&mumps);CHKERRQ(ierr); --- > ierr = PetscNewLog(B,Mat_MUMPS,&mumps);CHKERRQ(ierr); 1824d1549 < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetIcntl_C",MatMumpsGetIcntl_MUMPS);CHKERRQ(ierr); 1826,1831d1550 < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetCntl_C",MatMumpsGetCntl_MUMPS);CHKERRQ(ierr); < < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfo_C",MatMumpsGetInfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetInfog_C",MatMumpsGetInfog_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfo_C",MatMumpsGetRinfo_MUMPS);CHKERRQ(ierr); < ierr = PetscObjectComposeFunction((PetscObject)B,"MatMumpsGetRinfog_C",MatMumpsGetRinfog_MUMPS);CHKERRQ(ierr); 1842a1562 >