1c4762a1bSJed Brown static char help[] = "Tests MatTranspose(), MatNorm(), and MatAXPY().\n\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown
main(int argc,char ** argv)5d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
6d71ae5a4SJacob Faibussowitsch {
7c4762a1bSJed Brown Mat mat, tmat = 0;
8c4762a1bSJed Brown PetscInt m = 4, n, i, j;
9c4762a1bSJed Brown PetscMPIInt size, rank;
10c4762a1bSJed Brown PetscInt rstart, rend, rect = 0;
11c4762a1bSJed Brown PetscBool flg;
12c4762a1bSJed Brown PetscScalar v;
13c4762a1bSJed Brown PetscReal normf, normi, norm1;
14c4762a1bSJed Brown MatInfo info;
15c4762a1bSJed Brown
16327415f7SBarry Smith PetscFunctionBeginUser;
17*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help));
189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
199566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
209566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
21c4762a1bSJed Brown n = m;
229566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-rect1", &flg));
239371c9d4SSatish Balay if (flg) {
249371c9d4SSatish Balay n += 2;
259371c9d4SSatish Balay rect = 1;
269371c9d4SSatish Balay }
279566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-rect2", &flg));
289371c9d4SSatish Balay if (flg) {
299371c9d4SSatish Balay n -= 2;
309371c9d4SSatish Balay rect = 1;
319371c9d4SSatish Balay }
32c4762a1bSJed Brown
33c4762a1bSJed Brown /* Create and assemble matrix */
349566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &mat));
359566063dSJacob Faibussowitsch PetscCall(MatSetSizes(mat, PETSC_DECIDE, PETSC_DECIDE, m, n));
369566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(mat));
379566063dSJacob Faibussowitsch PetscCall(MatSetUp(mat));
389566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(mat, &rstart, &rend));
39c4762a1bSJed Brown for (i = rstart; i < rend; i++) {
40c4762a1bSJed Brown for (j = 0; j < n; j++) {
41c4762a1bSJed Brown v = 10 * i + j;
429566063dSJacob Faibussowitsch PetscCall(MatSetValues(mat, 1, &i, 1, &j, &v, INSERT_VALUES));
43c4762a1bSJed Brown }
44c4762a1bSJed Brown }
459566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY));
469566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY));
47c4762a1bSJed Brown
48c4762a1bSJed Brown /* Print info about original matrix */
499566063dSJacob Faibussowitsch PetscCall(MatGetInfo(mat, MAT_GLOBAL_SUM, &info));
50d0609cedSBarry Smith PetscCall(PetscPrintf(PETSC_COMM_WORLD, "original matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", (PetscInt)info.nz_used, (PetscInt)info.nz_allocated));
519566063dSJacob Faibussowitsch PetscCall(MatNorm(mat, NORM_FROBENIUS, &normf));
529566063dSJacob Faibussowitsch PetscCall(MatNorm(mat, NORM_1, &norm1));
539566063dSJacob Faibussowitsch PetscCall(MatNorm(mat, NORM_INFINITY, &normi));
542db2b1b2SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "original: Frobenius norm = %g, one norm = %g, infinity norm = %g\n", (double)normf, (double)norm1, (double)normi));
559566063dSJacob Faibussowitsch PetscCall(MatView(mat, PETSC_VIEWER_STDOUT_WORLD));
56c4762a1bSJed Brown
57c4762a1bSJed Brown /* Form matrix transpose */
589566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-in_place", &flg));
59c4762a1bSJed Brown if (flg) {
609566063dSJacob Faibussowitsch PetscCall(MatTranspose(mat, MAT_INPLACE_MATRIX, &mat)); /* in-place transpose */
619371c9d4SSatish Balay tmat = mat;
629371c9d4SSatish Balay mat = 0;
63c4762a1bSJed Brown } else { /* out-of-place transpose */
649566063dSJacob Faibussowitsch PetscCall(MatTranspose(mat, MAT_INITIAL_MATRIX, &tmat));
65c4762a1bSJed Brown }
66c4762a1bSJed Brown
67c4762a1bSJed Brown /* Print info about transpose matrix */
689566063dSJacob Faibussowitsch PetscCall(MatGetInfo(tmat, MAT_GLOBAL_SUM, &info));
69d0609cedSBarry Smith PetscCall(PetscPrintf(PETSC_COMM_WORLD, "transpose matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", (PetscInt)info.nz_used, (PetscInt)info.nz_allocated));
709566063dSJacob Faibussowitsch PetscCall(MatNorm(tmat, NORM_FROBENIUS, &normf));
719566063dSJacob Faibussowitsch PetscCall(MatNorm(tmat, NORM_1, &norm1));
729566063dSJacob Faibussowitsch PetscCall(MatNorm(tmat, NORM_INFINITY, &normi));
732db2b1b2SPierre Jolivet PetscCall(PetscPrintf(PETSC_COMM_WORLD, "transpose: Frobenius norm = %g, one norm = %g, infinity norm = %g\n", (double)normf, (double)norm1, (double)normi));
749566063dSJacob Faibussowitsch PetscCall(MatView(tmat, PETSC_VIEWER_STDOUT_WORLD));
75c4762a1bSJed Brown
76c4762a1bSJed Brown /* Test MatAXPY */
77c4762a1bSJed Brown if (mat && !rect) {
78c4762a1bSJed Brown PetscScalar alpha = 1.0;
799566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetScalar(NULL, NULL, "-alpha", &alpha, NULL));
809566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "matrix addition: B = B + alpha * A\n"));
819566063dSJacob Faibussowitsch PetscCall(MatAXPY(tmat, alpha, mat, DIFFERENT_NONZERO_PATTERN));
829566063dSJacob Faibussowitsch PetscCall(MatView(tmat, PETSC_VIEWER_STDOUT_WORLD));
83c4762a1bSJed Brown }
84c4762a1bSJed Brown
85c4762a1bSJed Brown /* Free data structures */
869566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tmat));
879566063dSJacob Faibussowitsch if (mat) PetscCall(MatDestroy(&mat));
88c4762a1bSJed Brown
899566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
90b122ec5aSJacob Faibussowitsch return 0;
91c4762a1bSJed Brown }
92c4762a1bSJed Brown
93c4762a1bSJed Brown /*TEST
94c4762a1bSJed Brown
95c4762a1bSJed Brown test:
96c4762a1bSJed Brown
97c4762a1bSJed Brown testset:
98c4762a1bSJed Brown args: -rect1
99c4762a1bSJed Brown test:
100c4762a1bSJed Brown suffix: r1
101c4762a1bSJed Brown output_file: output/ex49_r1.out
102c4762a1bSJed Brown test:
103c4762a1bSJed Brown suffix: r1_inplace
104c4762a1bSJed Brown args: -in_place
105c4762a1bSJed Brown output_file: output/ex49_r1.out
106c4762a1bSJed Brown test:
107c4762a1bSJed Brown suffix: r1_par
108c4762a1bSJed Brown nsize: 2
109c4762a1bSJed Brown output_file: output/ex49_r1_par.out
110c4762a1bSJed Brown test:
111c4762a1bSJed Brown suffix: r1_par_inplace
112c4762a1bSJed Brown args: -in_place
113c4762a1bSJed Brown nsize: 2
114c4762a1bSJed Brown output_file: output/ex49_r1_par.out
115c4762a1bSJed Brown
116c4762a1bSJed Brown TEST*/
117