1*d24d4204SJose E. Roman 2*d24d4204SJose E. Roman static char help[] = "Tests MatConvert(), MatLoad() for MATSCALAPACK interface.\n\n"; 3*d24d4204SJose E. Roman /* 4*d24d4204SJose E. Roman Example: 5*d24d4204SJose E. Roman mpiexec -n <np> ./ex244 -fA <A_data> -fB <B_data> -orig_mat_type <type> -orig_mat_type <mat_type> 6*d24d4204SJose E. Roman */ 7*d24d4204SJose E. Roman 8*d24d4204SJose E. Roman #include <petscmat.h> 9*d24d4204SJose E. Roman 10*d24d4204SJose E. Roman int main(int argc,char **args) 11*d24d4204SJose E. Roman { 12*d24d4204SJose E. Roman Mat A,Ae,B,Be; 13*d24d4204SJose E. Roman PetscErrorCode ierr; 14*d24d4204SJose E. Roman PetscViewer view; 15*d24d4204SJose E. Roman char file[2][PETSC_MAX_PATH_LEN]; 16*d24d4204SJose E. Roman PetscBool flg,flgB,isScaLAPACK,isDense,isAij,isSbaij; 17*d24d4204SJose E. Roman PetscScalar one = 1.0; 18*d24d4204SJose E. Roman PetscMPIInt rank,size; 19*d24d4204SJose E. Roman PetscInt M,N; 20*d24d4204SJose E. Roman 21*d24d4204SJose E. Roman ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 22*d24d4204SJose E. Roman ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 23*d24d4204SJose E. Roman ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 24*d24d4204SJose E. Roman 25*d24d4204SJose E. Roman /* Load PETSc matrices */ 26*d24d4204SJose E. Roman ierr = PetscOptionsGetString(NULL,NULL,"-fA",file[0],PETSC_MAX_PATH_LEN,NULL);CHKERRQ(ierr); 27*d24d4204SJose E. Roman ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&view);CHKERRQ(ierr); 28*d24d4204SJose E. Roman ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 29*d24d4204SJose E. Roman ierr = MatSetOptionsPrefix(A,"orig_");CHKERRQ(ierr); 30*d24d4204SJose E. Roman ierr = MatSetType(A,MATAIJ);CHKERRQ(ierr); 31*d24d4204SJose E. Roman ierr = MatSetFromOptions(A);CHKERRQ(ierr); 32*d24d4204SJose E. Roman ierr = MatLoad(A,view);CHKERRQ(ierr); 33*d24d4204SJose E. Roman ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 34*d24d4204SJose E. Roman 35*d24d4204SJose E. Roman PetscOptionsGetString(NULL,NULL,"-fB",file[1],PETSC_MAX_PATH_LEN,&flgB); 36*d24d4204SJose E. Roman if (flgB) { 37*d24d4204SJose E. Roman ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&view);CHKERRQ(ierr); 38*d24d4204SJose E. Roman ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); 39*d24d4204SJose E. Roman ierr = MatSetOptionsPrefix(B,"orig_");CHKERRQ(ierr); 40*d24d4204SJose E. Roman ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr); 41*d24d4204SJose E. Roman ierr = MatSetFromOptions(B);CHKERRQ(ierr); 42*d24d4204SJose E. Roman ierr = MatLoad(B,view);CHKERRQ(ierr); 43*d24d4204SJose E. Roman ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 44*d24d4204SJose E. Roman } else { 45*d24d4204SJose E. Roman /* Create matrix B = I */ 46*d24d4204SJose E. Roman PetscInt rstart,rend,i; 47*d24d4204SJose E. Roman ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 48*d24d4204SJose E. Roman ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 49*d24d4204SJose E. Roman 50*d24d4204SJose E. Roman ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr); 51*d24d4204SJose E. Roman ierr = MatSetOptionsPrefix(B,"orig_");CHKERRQ(ierr); 52*d24d4204SJose E. Roman ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 53*d24d4204SJose E. Roman ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr); 54*d24d4204SJose E. Roman ierr = MatSetFromOptions(B);CHKERRQ(ierr); 55*d24d4204SJose E. Roman ierr = MatSetUp(B);CHKERRQ(ierr); 56*d24d4204SJose E. Roman for (i=rstart; i<rend; i++) { 57*d24d4204SJose E. Roman ierr = MatSetValues(B,1,&i,1,&i,&one,ADD_VALUES);CHKERRQ(ierr); 58*d24d4204SJose E. Roman } 59*d24d4204SJose E. Roman ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 60*d24d4204SJose E. Roman ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 61*d24d4204SJose E. Roman } 62*d24d4204SJose E. Roman 63*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSCALAPACK,&isScaLAPACK);CHKERRQ(ierr); 64*d24d4204SJose E. Roman if (isScaLAPACK) { 65*d24d4204SJose E. Roman Ae = A; 66*d24d4204SJose E. Roman Be = B; 67*d24d4204SJose E. Roman isDense = isAij = isSbaij = PETSC_FALSE; 68*d24d4204SJose E. Roman } else { /* Convert AIJ/DENSE/SBAIJ matrices into ScaLAPACK matrices */ 69*d24d4204SJose E. Roman if (size == 1) { 70*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&isDense);CHKERRQ(ierr); 71*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isAij);CHKERRQ(ierr); 72*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSbaij);CHKERRQ(ierr); 73*d24d4204SJose E. Roman } else { 74*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIDENSE,&isDense);CHKERRQ(ierr); 75*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isAij);CHKERRQ(ierr); 76*d24d4204SJose E. Roman ierr = PetscObjectTypeCompare((PetscObject)A,MATMPISBAIJ,&isSbaij);CHKERRQ(ierr); 77*d24d4204SJose E. Roman } 78*d24d4204SJose E. Roman 79*d24d4204SJose E. Roman if (!rank) { 80*d24d4204SJose E. Roman if (isDense) { 81*d24d4204SJose E. Roman printf(" Convert DENSE matrices A and B into ScaLAPACK matrix... \n"); 82*d24d4204SJose E. Roman } else if (isAij) { 83*d24d4204SJose E. Roman printf(" Convert AIJ matrices A and B into ScaLAPACK matrix... \n"); 84*d24d4204SJose E. Roman } else if (isSbaij) { 85*d24d4204SJose E. Roman printf(" Convert SBAIJ matrices A and B into ScaLAPACK matrix... \n"); 86*d24d4204SJose E. Roman } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Not supported yet"); 87*d24d4204SJose E. Roman } 88*d24d4204SJose E. Roman ierr = MatConvert(A, MATSCALAPACK, MAT_INITIAL_MATRIX, &Ae);CHKERRQ(ierr); 89*d24d4204SJose E. Roman ierr = MatConvert(B, MATSCALAPACK, MAT_INITIAL_MATRIX, &Be);CHKERRQ(ierr); 90*d24d4204SJose E. Roman 91*d24d4204SJose E. Roman /* Test accuracy */ 92*d24d4204SJose E. Roman ierr = MatMultEqual(A,Ae,5,&flg);CHKERRQ(ierr); 93*d24d4204SJose E. Roman if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"A != A_scalapack."); 94*d24d4204SJose E. Roman ierr = MatMultEqual(B,Be,5,&flg);CHKERRQ(ierr); 95*d24d4204SJose E. Roman if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"B != B_scalapack."); 96*d24d4204SJose E. Roman } 97*d24d4204SJose E. Roman 98*d24d4204SJose E. Roman if (!isScaLAPACK) { 99*d24d4204SJose E. Roman ierr = MatDestroy(&Ae);CHKERRQ(ierr); 100*d24d4204SJose E. Roman ierr = MatDestroy(&Be);CHKERRQ(ierr); 101*d24d4204SJose E. Roman 102*d24d4204SJose E. Roman /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */ 103*d24d4204SJose E. Roman ierr = MatConvert(A, MATSCALAPACK, MAT_INPLACE_MATRIX, &A);CHKERRQ(ierr); 104*d24d4204SJose E. Roman //ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 105*d24d4204SJose E. Roman } 106*d24d4204SJose E. Roman 107*d24d4204SJose E. Roman ierr = MatDestroy(&A);CHKERRQ(ierr); 108*d24d4204SJose E. Roman ierr = MatDestroy(&B);CHKERRQ(ierr); 109*d24d4204SJose E. Roman ierr = PetscFinalize(); 110*d24d4204SJose E. Roman return ierr; 111*d24d4204SJose E. Roman } 112*d24d4204SJose E. Roman 113*d24d4204SJose E. Roman 114*d24d4204SJose E. Roman /*TEST 115*d24d4204SJose E. Roman 116*d24d4204SJose E. Roman build: 117*d24d4204SJose E. Roman requires: scalapack 118*d24d4204SJose E. Roman 119*d24d4204SJose E. Roman test: 120*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 121*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij 122*d24d4204SJose E. Roman output_file: output/ex244.out 123*d24d4204SJose E. Roman 124*d24d4204SJose E. Roman test: 125*d24d4204SJose E. Roman suffix: 2 126*d24d4204SJose E. Roman nsize: 8 127*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 128*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij 129*d24d4204SJose E. Roman output_file: output/ex244.out 130*d24d4204SJose E. Roman 131*d24d4204SJose E. Roman test: 132*d24d4204SJose E. Roman suffix: 2_dense 133*d24d4204SJose E. Roman nsize: 8 134*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 135*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij -orig_mat_type dense 136*d24d4204SJose E. Roman output_file: output/ex244_dense.out 137*d24d4204SJose E. Roman 138*d24d4204SJose E. Roman test: 139*d24d4204SJose E. Roman suffix: 2_scalapack 140*d24d4204SJose E. Roman nsize: 8 141*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 142*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij -orig_mat_type scalapack 143*d24d4204SJose E. Roman output_file: output/ex244_scalapack.out 144*d24d4204SJose E. Roman 145*d24d4204SJose E. Roman test: 146*d24d4204SJose E. Roman suffix: 2_sbaij 147*d24d4204SJose E. Roman nsize: 8 148*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 149*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B -orig_mat_type sbaij 150*d24d4204SJose E. Roman output_file: output/ex244_sbaij.out 151*d24d4204SJose E. Roman 152*d24d4204SJose E. Roman test: 153*d24d4204SJose E. Roman suffix: complex 154*d24d4204SJose E. Roman requires: complex double datafilespath !define(PETSC_USE_64BIT_INDICES) 155*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905 156*d24d4204SJose E. Roman output_file: output/ex244.out 157*d24d4204SJose E. Roman 158*d24d4204SJose E. Roman test: 159*d24d4204SJose E. Roman suffix: complex_2 160*d24d4204SJose E. Roman nsize: 4 161*d24d4204SJose E. Roman requires: complex double datafilespath !define(PETSC_USE_64BIT_INDICES) 162*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905 163*d24d4204SJose E. Roman output_file: output/ex244.out 164*d24d4204SJose E. Roman 165*d24d4204SJose E. Roman test: 166*d24d4204SJose E. Roman suffix: dense 167*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 168*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij -orig_mat_type dense 169*d24d4204SJose E. Roman 170*d24d4204SJose E. Roman test: 171*d24d4204SJose E. Roman suffix: scalapack 172*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 173*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij -orig_mat_type scalapack 174*d24d4204SJose E. Roman 175*d24d4204SJose E. Roman test: 176*d24d4204SJose E. Roman suffix: sbaij 177*d24d4204SJose E. Roman requires: datafilespath !complex double !define(PETSC_USE_64BIT_INDICES) 178*d24d4204SJose E. Roman args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B -orig_mat_type sbaij 179*d24d4204SJose E. Roman 180*d24d4204SJose E. Roman TEST*/ 181