1*d24d4204SJose E. Roman static char help[] = "Test conversion of ScaLAPACK matrices.\n\n"; 2*d24d4204SJose E. Roman 3*d24d4204SJose E. Roman #include <petscmat.h> 4*d24d4204SJose E. Roman 5*d24d4204SJose E. Roman int main(int argc, char** argv) 6*d24d4204SJose E. Roman { 7*d24d4204SJose E. Roman Mat A,A_scalapack; 8*d24d4204SJose E. Roman PetscInt i,j,M=10,N=5,nloc,mloc,nrows,ncols; 9*d24d4204SJose E. Roman PetscErrorCode ierr; 10*d24d4204SJose E. Roman PetscMPIInt rank,size; 11*d24d4204SJose E. Roman IS isrows,iscols; 12*d24d4204SJose E. Roman const PetscInt *rows,*cols; 13*d24d4204SJose E. Roman PetscScalar *v; 14*d24d4204SJose E. Roman MatType type; 15*d24d4204SJose E. Roman PetscBool isDense,isAIJ,flg; 16*d24d4204SJose E. Roman 17*d24d4204SJose E. Roman ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 18*d24d4204SJose E. Roman ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 19*d24d4204SJose E. Roman ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 20*d24d4204SJose E. Roman ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); 21*d24d4204SJose E. Roman ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); 22*d24d4204SJose E. Roman 23*d24d4204SJose E. Roman /* Create a matrix */ 24*d24d4204SJose E. Roman ierr = MatCreate(PETSC_COMM_WORLD, &A);CHKERRQ(ierr); 25*d24d4204SJose E. Roman mloc = PETSC_DECIDE; 26*d24d4204SJose E. Roman ierr = PetscSplitOwnershipEqual(PETSC_COMM_WORLD,&mloc,&M);CHKERRQ(ierr); 27*d24d4204SJose E. Roman nloc = PETSC_DECIDE; 28*d24d4204SJose E. Roman ierr = PetscSplitOwnershipEqual(PETSC_COMM_WORLD,&nloc,&N);CHKERRQ(ierr); 29*d24d4204SJose E. Roman ierr = MatSetSizes(A,mloc,nloc,M,N);CHKERRQ(ierr); 30*d24d4204SJose E. Roman ierr = MatSetType(A,MATDENSE);CHKERRQ(ierr); 31*d24d4204SJose E. Roman ierr = MatSetFromOptions(A);CHKERRQ(ierr); 32*d24d4204SJose E. Roman ierr = MatSetUp(A);CHKERRQ(ierr); 33*d24d4204SJose E. Roman 34*d24d4204SJose E. Roman /* Set local matrix entries */ 35*d24d4204SJose E. Roman ierr = MatGetOwnershipIS(A,&isrows,&iscols);CHKERRQ(ierr); 36*d24d4204SJose E. Roman ierr = ISGetLocalSize(isrows,&nrows);CHKERRQ(ierr); 37*d24d4204SJose E. Roman ierr = ISGetIndices(isrows,&rows);CHKERRQ(ierr); 38*d24d4204SJose E. Roman ierr = ISGetLocalSize(iscols,&ncols);CHKERRQ(ierr); 39*d24d4204SJose E. Roman ierr = ISGetIndices(iscols,&cols);CHKERRQ(ierr); 40*d24d4204SJose E. Roman ierr = PetscMalloc1(nrows*ncols,&v);CHKERRQ(ierr); 41*d24d4204SJose E. Roman 42*d24d4204SJose E. Roman for (i=0; i<nrows; i++) { 43*d24d4204SJose E. Roman for (j=0; j<ncols; j++) { 44*d24d4204SJose E. Roman if (size == 1) { 45*d24d4204SJose E. Roman v[i*ncols+j] = (PetscScalar)(i+j); 46*d24d4204SJose E. Roman } else { 47*d24d4204SJose E. Roman v[i*ncols+j] = (PetscScalar)rank+j*0.1; 48*d24d4204SJose E. Roman } 49*d24d4204SJose E. Roman } 50*d24d4204SJose E. Roman } 51*d24d4204SJose E. Roman ierr = MatSetValues(A,nrows,rows,ncols,cols,v,INSERT_VALUES);CHKERRQ(ierr); 52*d24d4204SJose E. Roman ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 53*d24d4204SJose E. Roman ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 54*d24d4204SJose E. Roman 55*d24d4204SJose E. Roman /* Test MatSetValues() by converting A to A_scalapack */ 56*d24d4204SJose E. Roman ierr = MatGetType(A,&type);CHKERRQ(ierr); 57*d24d4204SJose E. Roman if (size == 1) { 58*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&isDense);CHKERRQ(ierr); 59*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isAIJ);CHKERRQ(ierr); 60*d24d4204SJose E. Roman } else { 61*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIDENSE,&isDense);CHKERRQ(ierr); 62*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isAIJ);CHKERRQ(ierr); 63*d24d4204SJose E. Roman } 64*d24d4204SJose E. Roman 65*d24d4204SJose E. Roman if (isDense || isAIJ) { 66*d24d4204SJose E. Roman Mat Aexplicit; 67*d24d4204SJose E. Roman ierr = MatConvert(A,MATSCALAPACK,MAT_INITIAL_MATRIX,&A_scalapack);CHKERRQ(ierr); 68*d24d4204SJose E. Roman ierr = MatComputeOperator(A_scalapack,isAIJ?MATAIJ:MATDENSE,&Aexplicit);CHKERRQ(ierr); 69*d24d4204SJose E. Roman ierr = MatMultEqual(Aexplicit,A_scalapack,5,&flg);CHKERRQ(ierr); 70*d24d4204SJose E. Roman if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Aexplicit != A_scalapack."); 71*d24d4204SJose E. Roman ierr = MatDestroy(&Aexplicit);CHKERRQ(ierr); 72*d24d4204SJose E. Roman 73*d24d4204SJose E. Roman /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */ 74*d24d4204SJose E. Roman ierr = MatConvert(A,MATSCALAPACK,MAT_INPLACE_MATRIX,&A);CHKERRQ(ierr); 75*d24d4204SJose E. Roman ierr = MatMultEqual(A_scalapack,A,5,&flg);CHKERRQ(ierr); 76*d24d4204SJose E. Roman if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_PLIB,"A_scalapack != A."); 77*d24d4204SJose E. Roman ierr = MatDestroy(&A_scalapack);CHKERRQ(ierr); 78*d24d4204SJose E. Roman } 79*d24d4204SJose E. Roman 80*d24d4204SJose E. Roman ierr = ISRestoreIndices(isrows,&rows);CHKERRQ(ierr); 81*d24d4204SJose E. Roman ierr = ISRestoreIndices(iscols,&cols);CHKERRQ(ierr); 82*d24d4204SJose E. Roman ierr = ISDestroy(&isrows);CHKERRQ(ierr); 83*d24d4204SJose E. Roman ierr = ISDestroy(&iscols);CHKERRQ(ierr); 84*d24d4204SJose E. Roman ierr = PetscFree(v);CHKERRQ(ierr); 85*d24d4204SJose E. Roman ierr = MatDestroy(&A);CHKERRQ(ierr); 86*d24d4204SJose E. Roman ierr = PetscFinalize(); 87*d24d4204SJose E. Roman return ierr; 88*d24d4204SJose E. Roman } 89*d24d4204SJose E. Roman 90*d24d4204SJose E. Roman 91*d24d4204SJose E. Roman /*TEST 92*d24d4204SJose E. Roman 93*d24d4204SJose E. Roman build: 94*d24d4204SJose E. Roman requires: scalapack 95*d24d4204SJose E. Roman 96*d24d4204SJose E. Roman test: 97*d24d4204SJose E. Roman nsize: 6 98*d24d4204SJose E. Roman 99*d24d4204SJose E. Roman test: 100*d24d4204SJose E. Roman suffix: 2 101*d24d4204SJose E. Roman nsize: 6 102*d24d4204SJose E. Roman args: -mat_type aij 103*d24d4204SJose E. Roman output_file: output/ex243_1.out 104*d24d4204SJose E. Roman 105*d24d4204SJose E. Roman test: 106*d24d4204SJose E. Roman suffix: 3 107*d24d4204SJose E. Roman nsize: 6 108*d24d4204SJose E. Roman args: -mat_type scalapack 109*d24d4204SJose E. Roman output_file: output/ex243_1.out 110*d24d4204SJose E. Roman 111*d24d4204SJose E. Roman TEST*/ 112