void PETSC_STDCALL matdensegetlocalmatrix_(Mat A,Mat *B, int *__ierr ){ *__ierr = MatDenseGetLocalMatrix( (Mat)PetscToPointer((A) ),B); }
static void PETScMatvecGenColumnMajor(void *x, PRIMME_INT ldx, void *y, PRIMME_INT ldy, int blockSize, int trans, Mat matrix, MPI_Comm comm) { PetscInt m, n, mLocal, nLocal; PetscErrorCode ierr; Mat X, Y, X0, Y0; int xcompact, ycompact; if (blockSize == 1) { PETScMatvecGenNoBlock(x, ldx, y, ldy, blockSize, trans, matrix, comm); return; } assert(sizeof(PetscScalar) == sizeof(SCALAR)); ierr = MatGetSize(matrix, &m, &n); CHKERRABORT(comm, ierr); ierr = MatGetLocalSize(matrix, &mLocal, &nLocal); CHKERRABORT(comm, ierr); if (trans == 0) { ierr = MatCreateDense(comm,nLocal,PETSC_DECIDE,n,blockSize,x,&X);CHKERRABORT(comm, ierr); ierr = MatCreateDense(comm,mLocal,PETSC_DECIDE,m,blockSize,y,&Y);CHKERRABORT(comm, ierr); xcompact = nLocal == ldx; ycompact = mLocal == ldy; } else { ierr = MatCreateDense(comm,mLocal,PETSC_DECIDE,m,blockSize,x,&X);CHKERRABORT(comm, ierr); ierr = MatCreateDense(comm,nLocal,PETSC_DECIDE,n,blockSize,y,&Y);CHKERRABORT(comm, ierr); xcompact = mLocal == ldx; ycompact = nLocal == ldy; } ierr = MatDenseGetLocalMatrix(X, &X0);CHKERRABORT(comm, ierr); ierr = MatSeqDenseSetLDA(X0, (PetscInt)ldx);CHKERRABORT(comm, ierr); ierr = MatDenseGetLocalMatrix(Y, &Y0);CHKERRABORT(comm, ierr); ierr = MatSeqDenseSetLDA(Y0, (PetscInt)ldy);CHKERRABORT(comm, ierr); /* MatMatMult doesn't support X to be non-contiguous */ if (xcompact) { X0 = X; } else { ierr = MatDuplicate(X, MAT_COPY_VALUES, &X0);CHKERRABORT(comm, ierr); } if (trans == 0) { if (ycompact) { ierr = MatMatMult(matrix, X0, MAT_REUSE_MATRIX, PETSC_DEFAULT, &Y); CHKERRABORT(comm, ierr); } else { ierr = MatMatMult(matrix, X0, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &Y0); CHKERRABORT(comm, ierr); ierr = MatCopy(Y0, Y, SAME_NONZERO_PATTERN); CHKERRABORT(comm, ierr); ierr = MatDestroy(&Y0); CHKERRABORT(comm, ierr); } } else { /* A^H*X is not implemented in PETSc, do instead (A^T*X^c)^c */ ierr = MatConjugate(X0); CHKERRABORT(comm, ierr); if (ycompact) { ierr = MatTransposeMatMult(matrix, X0, MAT_REUSE_MATRIX, PETSC_DEFAULT, &Y); CHKERRABORT(comm, ierr); } else { ierr = MatTransposeMatMult(matrix, X0, MAT_INITIAL_MATRIX, PETSC_DEFAULT, &Y0); CHKERRABORT(comm, ierr); ierr = MatCopy(Y0, Y, SAME_NONZERO_PATTERN); CHKERRABORT(comm, ierr); ierr = MatDestroy(&Y0); CHKERRABORT(comm, ierr); } ierr = MatConjugate(Y); CHKERRABORT(comm, ierr); if (xcompact) { ierr = MatConjugate(X0); CHKERRABORT(comm, ierr); } } if (!xcompact) { ierr = MatDestroy(&X0);CHKERRABORT(comm, ierr); } ierr = MatDestroy(&X);CHKERRABORT(comm, ierr); ierr = MatDestroy(&Y);CHKERRABORT(comm, ierr); }