1d24d4204SJose E. Roman static char help[] = "Test conversion of ScaLAPACK matrices.\n\n"; 2d24d4204SJose E. Roman 3d24d4204SJose E. Roman #include <petscmat.h> 4d24d4204SJose E. Roman 5d24d4204SJose E. Roman int main(int argc, char** argv) 6d24d4204SJose E. Roman { 7d24d4204SJose E. Roman Mat A,A_scalapack; 8d24d4204SJose E. Roman PetscInt i,j,M=10,N=5,nloc,mloc,nrows,ncols; 9d24d4204SJose E. Roman PetscMPIInt rank,size; 10d24d4204SJose E. Roman IS isrows,iscols; 11d24d4204SJose E. Roman const PetscInt *rows,*cols; 12d24d4204SJose E. Roman PetscScalar *v; 13d24d4204SJose E. Roman MatType type; 14d24d4204SJose E. Roman PetscBool isDense,isAIJ,flg; 15d24d4204SJose E. Roman 16*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help)); 175f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 185f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 21d24d4204SJose E. Roman 22d24d4204SJose E. Roman /* Create a matrix */ 235f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD, &A)); 24d24d4204SJose E. Roman mloc = PETSC_DECIDE; 255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSplitOwnershipEqual(PETSC_COMM_WORLD,&mloc,&M)); 26d24d4204SJose E. Roman nloc = PETSC_DECIDE; 275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSplitOwnershipEqual(PETSC_COMM_WORLD,&nloc,&N)); 285f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(A,mloc,nloc,M,N)); 295f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(A,MATDENSE)); 305f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(A)); 315f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(A)); 32d24d4204SJose E. Roman 33d24d4204SJose E. Roman /* Set local matrix entries */ 345f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetOwnershipIS(A,&isrows,&iscols)); 355f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetLocalSize(isrows,&nrows)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetIndices(isrows,&rows)); 375f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetLocalSize(iscols,&ncols)); 385f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetIndices(iscols,&cols)); 395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nrows*ncols,&v)); 40d24d4204SJose E. Roman 41d24d4204SJose E. Roman for (i=0; i<nrows; i++) { 42d24d4204SJose E. Roman for (j=0; j<ncols; j++) { 43d24d4204SJose E. Roman if (size == 1) { 44d24d4204SJose E. Roman v[i*ncols+j] = (PetscScalar)(i+j); 45d24d4204SJose E. Roman } else { 46d24d4204SJose E. Roman v[i*ncols+j] = (PetscScalar)rank+j*0.1; 47d24d4204SJose E. Roman } 48d24d4204SJose E. Roman } 49d24d4204SJose E. Roman } 505f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValues(A,nrows,rows,ncols,cols,v,INSERT_VALUES)); 515f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 53d24d4204SJose E. Roman 54d24d4204SJose E. Roman /* Test MatSetValues() by converting A to A_scalapack */ 555f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetType(A,&type)); 56d24d4204SJose E. Roman if (size == 1) { 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&isDense)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isAIJ)); 59d24d4204SJose E. Roman } else { 605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)A,MATMPIDENSE,&isDense)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isAIJ)); 62d24d4204SJose E. Roman } 63d24d4204SJose E. Roman 64d24d4204SJose E. Roman if (isDense || isAIJ) { 65d24d4204SJose E. Roman Mat Aexplicit; 665f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATSCALAPACK,MAT_INITIAL_MATRIX,&A_scalapack)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperator(A_scalapack,isAIJ?MATAIJ:MATDENSE,&Aexplicit)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(Aexplicit,A_scalapack,5,&flg)); 6928b400f6SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Aexplicit != A_scalapack."); 705f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Aexplicit)); 71d24d4204SJose E. Roman 72d24d4204SJose E. Roman /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */ 735f80ce2aSJacob Faibussowitsch CHKERRQ(MatConvert(A,MATSCALAPACK,MAT_INPLACE_MATRIX,&A)); 745f80ce2aSJacob Faibussowitsch CHKERRQ(MatMultEqual(A_scalapack,A,5,&flg)); 7528b400f6SJacob Faibussowitsch PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"A_scalapack != A."); 765f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A_scalapack)); 77d24d4204SJose E. Roman } 78d24d4204SJose E. Roman 795f80ce2aSJacob Faibussowitsch CHKERRQ(ISRestoreIndices(isrows,&rows)); 805f80ce2aSJacob Faibussowitsch CHKERRQ(ISRestoreIndices(iscols,&cols)); 815f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&isrows)); 825f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&iscols)); 835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(v)); 845f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 85*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 86*b122ec5aSJacob Faibussowitsch return 0; 87d24d4204SJose E. Roman } 88d24d4204SJose E. Roman 89d24d4204SJose E. Roman /*TEST 90d24d4204SJose E. Roman 91d24d4204SJose E. Roman build: 92d24d4204SJose E. Roman requires: scalapack 93d24d4204SJose E. Roman 94d24d4204SJose E. Roman test: 95d24d4204SJose E. Roman nsize: 6 96d24d4204SJose E. Roman 97d24d4204SJose E. Roman test: 98d24d4204SJose E. Roman suffix: 2 99d24d4204SJose E. Roman nsize: 6 100d24d4204SJose E. Roman args: -mat_type aij 101d24d4204SJose E. Roman output_file: output/ex243_1.out 102d24d4204SJose E. Roman 103d24d4204SJose E. Roman test: 104d24d4204SJose E. Roman suffix: 3 105d24d4204SJose E. Roman nsize: 6 106d24d4204SJose E. Roman args: -mat_type scalapack 107d24d4204SJose E. Roman output_file: output/ex243_1.out 108d24d4204SJose E. Roman 109d24d4204SJose E. Roman TEST*/ 110