xref: /petsc/src/mat/tests/ex244.cxx (revision d24d420451aab1d024a728b511d7b61b40627436)
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