Actual source code: ex174.cxx


  2: static char help[] = "Tests MatConvert(), MatLoad() for MATELEMENTAL interface.\n\n";
  3: /*
  4:  Example:
  5:    mpiexec -n <np> ./ex173 -fA <A_data> -fB <B_data> -orig_mat_type <type> -orig_mat_type <mat_type>
  6: */

  8: #include <petscmat.h>
  9: #include <petscmatelemental.h>

 11: int main(int argc,char **args)
 12: {
 13:   Mat            A,Ae,B,Be;
 15:   PetscViewer    view;
 16:   char           file[2][PETSC_MAX_PATH_LEN];
 17:   PetscBool      flg,flgB,isElemental,isDense,isAij,isSbaij;
 18:   PetscScalar    one = 1.0;
 19:   PetscMPIInt    rank,size;
 20:   PetscInt       M,N;

 22:   PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
 23:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 24:   MPI_Comm_size(PETSC_COMM_WORLD,&size);

 26:   /* Load PETSc matrices */
 27:   PetscOptionsGetString(NULL,NULL,"-fA",file[0],sizeof(file[0]),NULL);
 28:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&view);
 29:   MatCreate(PETSC_COMM_WORLD,&A);
 30:   MatSetOptionsPrefix(A,"orig_");
 31:   MatSetType(A,MATAIJ);
 32:   MatSetFromOptions(A);
 33:   MatLoad(A,view);
 34:   PetscViewerDestroy(&view);

 36:   PetscOptionsGetString(NULL,NULL,"-fB",file[1],sizeof(file[1]),&flgB);
 37:   if (flgB) {
 38:     PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&view);
 39:     MatCreate(PETSC_COMM_WORLD,&B);
 40:     MatSetOptionsPrefix(B,"orig_");
 41:     MatSetType(B,MATAIJ);
 42:     MatSetFromOptions(B);
 43:     MatLoad(B,view);
 44:     PetscViewerDestroy(&view);
 45:   } else {
 46:     /* Create matrix B = I */
 47:     PetscInt rstart,rend,i;
 48:     MatGetSize(A,&M,&N);
 49:     MatGetOwnershipRange(A,&rstart,&rend);

 51:     MatCreate(PETSC_COMM_WORLD,&B);
 52:     MatSetOptionsPrefix(B,"orig_");
 53:     MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N);
 54:     MatSetType(B,MATAIJ);
 55:     MatSetFromOptions(B);
 56:     MatSetUp(B);
 57:     for (i=rstart; i<rend; i++) {
 58:       MatSetValues(B,1,&i,1,&i,&one,ADD_VALUES);
 59:     }
 60:     MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);
 61:     MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);
 62:   }

 64:   PetscObjectTypeCompare((PetscObject)A,MATELEMENTAL,&isElemental);
 65:   if (isElemental) {
 66:     Ae = A;
 67:     Be = B;
 68:     isDense = isAij = isSbaij = PETSC_FALSE;
 69:   } else { /* Convert AIJ/DENSE/SBAIJ matrices into Elemental matrices */
 70:     if (size == 1) {
 71:       PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&isDense);
 72:       PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isAij);
 73:       PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSbaij);
 74:     } else {
 75:       PetscObjectTypeCompare((PetscObject)A,MATMPIDENSE,&isDense);
 76:       PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isAij);
 77:        PetscObjectTypeCompare((PetscObject)A,MATMPISBAIJ,&isSbaij);
 78:     }

 80:     if (rank == 0) {
 81:       if (isDense) {
 82:         printf(" Convert DENSE matrices A and B into Elemental matrix... \n");
 83:       } else if (isAij) {
 84:         printf(" Convert AIJ matrices A and B into Elemental matrix... \n");
 85:       } else if (isSbaij) {
 86:         printf(" Convert SBAIJ matrices A and B into Elemental matrix... \n");
 87:       } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Not supported yet");
 88:     }
 89:     MatConvert(A, MATELEMENTAL, MAT_INITIAL_MATRIX, &Ae);
 90:     MatConvert(B, MATELEMENTAL, MAT_INITIAL_MATRIX, &Be);

 92:     /* Test accuracy */
 93:     MatMultEqual(A,Ae,5,&flg);
 94:     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"A != A_elemental.");
 95:     MatMultEqual(B,Be,5,&flg);
 96:     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"B != B_elemental.");
 97:   }

 99:   if (!isElemental) {
100:     MatDestroy(&Ae);
101:     MatDestroy(&Be);

103:     /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */
104:     MatConvert(A, MATELEMENTAL, MAT_INPLACE_MATRIX, &A);
105:     //MatView(A,PETSC_VIEWER_STDOUT_WORLD);
106:   }

108:   MatDestroy(&A);
109:   MatDestroy(&B);
110:   PetscFinalize();
111:   return ierr;
112: }

114: /*TEST

116:    build:
117:       requires: elemental

119:    test:
120:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
121:       args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij
122:       output_file: output/ex174.out

124:    test:
125:       suffix: 2
126:       nsize: 8
127:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
128:       args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij
129:       output_file: output/ex174.out

131:    test:
132:       suffix: 2_dense
133:       nsize: 8
134:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
135:       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:       output_file: output/ex174_dense.out

138:    test:
139:       suffix: 2_elemental
140:       nsize: 8
141:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
142:       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 elemental
143:       output_file: output/ex174_elemental.out

145:    test:
146:       suffix: 2_sbaij
147:       nsize: 8
148:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
149:       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:       output_file: output/ex174_sbaij.out

152:    test:
153:       suffix: complex
154:       requires: complex double datafilespath !defined(PETSC_USE_64BIT_INDICES)
155:       args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905
156:       output_file: output/ex174.out

158:    test:
159:       suffix: complex_2
160:       nsize: 4
161:       requires: complex double datafilespath !defined(PETSC_USE_64BIT_INDICES)
162:       args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905
163:       output_file: output/ex174.out

165:    test:
166:       suffix: dense
167:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
168:       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

170:    test:
171:       suffix: elemental
172:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
173:       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 elemental

175:    test:
176:       suffix: sbaij
177:       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
178:       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

180: TEST*/