static char help[] = "Tests MatTranspose(), MatNorm(), MatAXPY() and MatAYPX().\n\n"; #include static PetscErrorCode TransposeAXPY(Mat C,PetscScalar alpha,Mat mat,PetscErrorCode (*f)(Mat,Mat*)) { Mat D,E,F,G; MatType mtype; PetscFunctionBegin; CHKERRQ(MatGetType(mat,&mtype)); if (f == MatCreateTranspose) { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"\nMatAXPY: (C^T)^T = (C^T)^T + alpha * A, C=A, SAME_NONZERO_PATTERN\n")); } else { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"\nMatAXPY: (C^H)^H = (C^H)^H + alpha * A, C=A, SAME_NONZERO_PATTERN\n")); } CHKERRQ(MatDuplicate(mat,MAT_COPY_VALUES,&C)); CHKERRQ(f(C,&D)); CHKERRQ(f(D,&E)); CHKERRQ(MatAXPY(E,alpha,mat,SAME_NONZERO_PATTERN)); CHKERRQ(MatConvert(E,mtype,MAT_INPLACE_MATRIX,&E)); CHKERRQ(MatView(E,PETSC_VIEWER_STDOUT_WORLD)); CHKERRQ(MatDestroy(&E)); CHKERRQ(MatDestroy(&D)); CHKERRQ(MatDestroy(&C)); if (f == MatCreateTranspose) { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatAXPY: C = C + alpha * (A^T)^T, C=A, SAME_NONZERO_PATTERN\n")); } else { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatAXPY: C = C + alpha * (A^H)^H, C=A, SAME_NONZERO_PATTERN\n")); } if (f == MatCreateTranspose) { CHKERRQ(MatTranspose(mat,MAT_INITIAL_MATRIX,&D)); } else { CHKERRQ(MatHermitianTranspose(mat,MAT_INITIAL_MATRIX,&D)); } CHKERRQ(f(D,&E)); CHKERRQ(MatDuplicate(mat,MAT_COPY_VALUES,&C)); CHKERRQ(MatAXPY(C,alpha,E,SAME_NONZERO_PATTERN)); CHKERRQ(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); CHKERRQ(MatDestroy(&E)); CHKERRQ(MatDestroy(&D)); CHKERRQ(MatDestroy(&C)); if (f == MatCreateTranspose) { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatAXPY: (C^T)^T = (C^T)^T + alpha * (A^T)^T, C=A, SAME_NONZERO_PATTERN\n")); } else { CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatAXPY: (C^H)^H = (C^H)^H + alpha * (A^H)^H, C=A, SAME_NONZERO_PATTERN\n")); } CHKERRQ(MatDuplicate(mat,MAT_COPY_VALUES,&C)); CHKERRQ(f(C,&D)); CHKERRQ(f(D,&E)); CHKERRQ(f(mat,&F)); CHKERRQ(f(F,&G)); CHKERRQ(MatAXPY(E,alpha,G,SAME_NONZERO_PATTERN)); CHKERRQ(MatConvert(E,mtype,MAT_INPLACE_MATRIX,&E)); CHKERRQ(MatView(E,PETSC_VIEWER_STDOUT_WORLD)); CHKERRQ(MatDestroy(&G)); CHKERRQ(MatDestroy(&F)); CHKERRQ(MatDestroy(&E)); CHKERRQ(MatDestroy(&D)); CHKERRQ(MatDestroy(&C)); /* Call f on a matrix that does not implement the transposition */ CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatAXPY: Now without the transposition operation\n")); CHKERRQ(MatConvert(mat,MATSHELL,MAT_INITIAL_MATRIX,&C)); CHKERRQ(f(C,&D)); CHKERRQ(f(D,&E)); /* XXX cannot use MAT_INPLACE_MATRIX, it leaks mat */ CHKERRQ(MatConvert(E,mtype,MAT_INITIAL_MATRIX,&F)); CHKERRQ(MatAXPY(F,alpha,mat,SAME_NONZERO_PATTERN)); CHKERRQ(MatView(F,PETSC_VIEWER_STDOUT_WORLD)); CHKERRQ(MatDestroy(&F)); CHKERRQ(MatDestroy(&E)); CHKERRQ(MatDestroy(&D)); CHKERRQ(MatDestroy(&C)); PetscFunctionReturn(0); } int main(int argc,char **argv) { Mat mat,tmat = 0; PetscInt m = 7,n,i,j,rstart,rend,rect = 0; PetscErrorCode ierr; PetscMPIInt size,rank; PetscBool flg; PetscScalar v, alpha; PetscReal normf,normi,norm1; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; CHKERRQ(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON)); CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); n = m; CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rectA",&flg)); if (flg) {n += 2; rect = 1;} CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rectB",&flg)); if (flg) {n -= 2; rect = 1;} /* ------- Assemble matrix --------- */ CHKERRQ(MatCreate(PETSC_COMM_WORLD,&mat)); CHKERRQ(MatSetSizes(mat,PETSC_DECIDE,PETSC_DECIDE,m,n)); CHKERRQ(MatSetFromOptions(mat)); CHKERRQ(MatSetUp(mat)); CHKERRQ(MatGetOwnershipRange(mat,&rstart,&rend)); for (i=rstart; i