xref: /petsc/src/mat/tests/ex174.cxx (revision 7d5fd1e4d9337468ad3f05b65b7facdcd2dfd2a4)
1 
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 */
7 
8 #include <petscmat.h>
9 #include <petscmatelemental.h>
10 
11 int main(int argc,char **args)
12 {
13   Mat            A,Ae,B,Be;
14   PetscErrorCode ierr;
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;
21 
22   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
23   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
24   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
25 
26   /* Load PETSc matrices */
27   ierr = PetscOptionsGetString(NULL,NULL,"-fA",file[0],sizeof(file[0]),NULL);CHKERRQ(ierr);
28   ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[0],FILE_MODE_READ,&view);CHKERRQ(ierr);
29   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
30   ierr = MatSetOptionsPrefix(A,"orig_");CHKERRQ(ierr);
31   ierr = MatSetType(A,MATAIJ);CHKERRQ(ierr);
32   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
33   ierr = MatLoad(A,view);CHKERRQ(ierr);
34   ierr = PetscViewerDestroy(&view);CHKERRQ(ierr);
35 
36   PetscOptionsGetString(NULL,NULL,"-fB",file[1],sizeof(file[1]),&flgB);
37   if (flgB) {
38     ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[1],FILE_MODE_READ,&view);CHKERRQ(ierr);
39     ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
40     ierr = MatSetOptionsPrefix(B,"orig_");CHKERRQ(ierr);
41     ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr);
42     ierr = MatSetFromOptions(B);CHKERRQ(ierr);
43     ierr = MatLoad(B,view);CHKERRQ(ierr);
44     ierr = PetscViewerDestroy(&view);CHKERRQ(ierr);
45   } else {
46     /* Create matrix B = I */
47     PetscInt rstart,rend,i;
48     ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr);
49     ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr);
50 
51     ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
52     ierr = MatSetOptionsPrefix(B,"orig_");CHKERRQ(ierr);
53     ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
54     ierr = MatSetType(B,MATAIJ);CHKERRQ(ierr);
55     ierr = MatSetFromOptions(B);CHKERRQ(ierr);
56     ierr = MatSetUp(B);CHKERRQ(ierr);
57     for (i=rstart; i<rend; i++) {
58       ierr = MatSetValues(B,1,&i,1,&i,&one,ADD_VALUES);CHKERRQ(ierr);
59     }
60     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
61     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
62   }
63 
64   ierr = PetscObjectTypeCompare((PetscObject)A,MATELEMENTAL,&isElemental);CHKERRQ(ierr);
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       ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&isDense);CHKERRQ(ierr);
72       ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&isAij);CHKERRQ(ierr);
73       ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQSBAIJ,&isSbaij);CHKERRQ(ierr);
74     } else {
75       ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIDENSE,&isDense);CHKERRQ(ierr);
76       ierr = PetscObjectTypeCompare((PetscObject)A,MATMPIAIJ,&isAij);CHKERRQ(ierr);
77        ierr = PetscObjectTypeCompare((PetscObject)A,MATMPISBAIJ,&isSbaij);CHKERRQ(ierr);
78     }
79 
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     ierr = MatConvert(A, MATELEMENTAL, MAT_INITIAL_MATRIX, &Ae);CHKERRQ(ierr);
90     ierr = MatConvert(B, MATELEMENTAL, MAT_INITIAL_MATRIX, &Be);CHKERRQ(ierr);
91 
92     /* Test accuracy */
93     ierr = MatMultEqual(A,Ae,5,&flg);CHKERRQ(ierr);
94     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"A != A_elemental.");
95     ierr = MatMultEqual(B,Be,5,&flg);CHKERRQ(ierr);
96     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMETYPE,"B != B_elemental.");
97   }
98 
99   if (!isElemental) {
100     ierr = MatDestroy(&Ae);CHKERRQ(ierr);
101     ierr = MatDestroy(&Be);CHKERRQ(ierr);
102 
103     /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */
104     ierr = MatConvert(A, MATELEMENTAL, MAT_INPLACE_MATRIX, &A);CHKERRQ(ierr);
105     //ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
106   }
107 
108   ierr = MatDestroy(&A);CHKERRQ(ierr);
109   ierr = MatDestroy(&B);CHKERRQ(ierr);
110   ierr = PetscFinalize();
111   return ierr;
112 }
113 
114 /*TEST
115 
116    build:
117       requires: elemental
118 
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
123 
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
130 
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
137 
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
144 
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
151 
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
157 
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
164 
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
169 
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
174 
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
179 
180 TEST*/
181