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;
14: PetscViewer view;
15: char file[2][PETSC_MAX_PATH_LEN];
16: PetscBool flg, flgB, isElemental, isDense, isAij, isSbaij;
17: PetscScalar one = 1.0;
18: PetscMPIInt rank, size;
19: PetscInt M, N;
21: PetscFunctionBeginUser;
22: PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
23: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
24: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
26: /* Load PETSc matrices */
27: PetscCall(PetscOptionsGetString(NULL, NULL, "-fA", file[0], sizeof(file[0]), NULL));
28: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[0], FILE_MODE_READ, &view));
29: PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
30: PetscCall(MatSetOptionsPrefix(A, "orig_"));
31: PetscCall(MatSetType(A, MATAIJ));
32: PetscCall(MatSetFromOptions(A));
33: PetscCall(MatLoad(A, view));
34: PetscCall(PetscViewerDestroy(&view));
36: PetscCall(PetscOptionsGetString(NULL, NULL, "-fB", file[1], sizeof(file[1]), &flgB));
37: if (flgB) {
38: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[1], FILE_MODE_READ, &view));
39: PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
40: PetscCall(MatSetOptionsPrefix(B, "orig_"));
41: PetscCall(MatSetType(B, MATAIJ));
42: PetscCall(MatSetFromOptions(B));
43: PetscCall(MatLoad(B, view));
44: PetscCall(PetscViewerDestroy(&view));
45: } else {
46: /* Create matrix B = I */
47: PetscInt rstart, rend, i;
48: PetscCall(MatGetSize(A, &M, &N));
49: PetscCall(MatGetOwnershipRange(A, &rstart, &rend));
51: PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
52: PetscCall(MatSetOptionsPrefix(B, "orig_"));
53: PetscCall(MatSetSizes(B, PETSC_DECIDE, PETSC_DECIDE, M, N));
54: PetscCall(MatSetType(B, MATAIJ));
55: PetscCall(MatSetFromOptions(B));
56: PetscCall(MatSetUp(B));
57: for (i = rstart; i < rend; i++) PetscCall(MatSetValues(B, 1, &i, 1, &i, &one, ADD_VALUES));
58: PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
59: PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
60: }
62: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATELEMENTAL, &isElemental));
63: if (isElemental) {
64: Ae = A;
65: Be = B;
66: isDense = isAij = isSbaij = PETSC_FALSE;
67: } else { /* Convert AIJ/DENSE/SBAIJ matrices into Elemental matrices */
68: if (size == 1) {
69: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATSEQDENSE, &isDense));
70: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATSEQAIJ, &isAij));
71: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATSEQSBAIJ, &isSbaij));
72: } else {
73: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATMPIDENSE, &isDense));
74: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATMPIAIJ, &isAij));
75: PetscCall(PetscObjectTypeCompare((PetscObject)A, MATMPISBAIJ, &isSbaij));
76: }
78: if (rank == 0) {
79: if (isDense) {
80: printf(" Convert DENSE matrices A and B into Elemental matrix... \n");
81: } else if (isAij) {
82: printf(" Convert AIJ matrices A and B into Elemental matrix... \n");
83: } else if (isSbaij) {
84: printf(" Convert SBAIJ matrices A and B into Elemental matrix... \n");
85: } else SETERRQ(PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Not supported yet");
86: }
87: PetscCall(MatConvert(A, MATELEMENTAL, MAT_INITIAL_MATRIX, &Ae));
88: PetscCall(MatConvert(B, MATELEMENTAL, MAT_INITIAL_MATRIX, &Be));
90: /* Test accuracy */
91: PetscCall(MatMultEqual(A, Ae, 5, &flg));
92: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMETYPE, "A != A_elemental.");
93: PetscCall(MatMultEqual(B, Be, 5, &flg));
94: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_ARG_NOTSAMETYPE, "B != B_elemental.");
95: }
97: if (!isElemental) {
98: PetscCall(MatDestroy(&Ae));
99: PetscCall(MatDestroy(&Be));
101: /* Test MAT_REUSE_MATRIX which is only supported for inplace conversion */
102: PetscCall(MatConvert(A, MATELEMENTAL, MAT_INPLACE_MATRIX, &A));
103: //PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD));
104: }
106: PetscCall(MatDestroy(&A));
107: PetscCall(MatDestroy(&B));
108: PetscCall(PetscFinalize());
109: return 0;
110: }
112: /*TEST
114: build:
115: requires: elemental
117: test:
118: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
119: args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij
120: output_file: output/ex174.out
122: test:
123: suffix: 2
124: nsize: 8
125: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
126: args: -fA ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_A_aij -fB ${DATAFILESPATH}/matrices/EigenProblems/Eigdftb/dftb_bin/graphene_xxs_B_aij
127: output_file: output/ex174.out
129: test:
130: suffix: 2_dense
131: nsize: 8
132: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
133: 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
134: output_file: output/ex174_dense.out
136: test:
137: suffix: 2_elemental
138: nsize: 8
139: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
140: 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
141: output_file: output/ex174_elemental.out
143: test:
144: suffix: 2_sbaij
145: nsize: 8
146: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
147: 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
148: output_file: output/ex174_sbaij.out
150: test:
151: suffix: complex
152: requires: complex double datafilespath !defined(PETSC_USE_64BIT_INDICES)
153: args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905
154: output_file: output/ex174.out
156: test:
157: suffix: complex_2
158: nsize: 4
159: requires: complex double datafilespath !defined(PETSC_USE_64BIT_INDICES)
160: args: -fA ${DATAFILESPATH}/matrices/nimrod/small_112905
161: output_file: output/ex174.out
163: test:
164: suffix: dense
165: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
166: 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
168: test:
169: suffix: elemental
170: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
171: 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
173: test:
174: suffix: sbaij
175: requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
176: 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
178: TEST*/