xref: /petsc/src/mat/tests/ex49.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests MatTranspose(), MatNorm(), and MatAXPY().\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
7*d71ae5a4SJacob Faibussowitsch {
8c4762a1bSJed Brown   Mat         mat, tmat = 0;
9c4762a1bSJed Brown   PetscInt    m = 4, n, i, j;
10c4762a1bSJed Brown   PetscMPIInt size, rank;
11c4762a1bSJed Brown   PetscInt    rstart, rend, rect = 0;
12c4762a1bSJed Brown   PetscBool   flg;
13c4762a1bSJed Brown   PetscScalar v;
14c4762a1bSJed Brown   PetscReal   normf, normi, norm1;
15c4762a1bSJed Brown   MatInfo     info;
16c4762a1bSJed Brown 
17327415f7SBarry Smith   PetscFunctionBeginUser;
189566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
199566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
209566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
219566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
22c4762a1bSJed Brown   n = m;
239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(NULL, NULL, "-rect1", &flg));
249371c9d4SSatish Balay   if (flg) {
259371c9d4SSatish Balay     n += 2;
269371c9d4SSatish Balay     rect = 1;
279371c9d4SSatish Balay   }
289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(NULL, NULL, "-rect2", &flg));
299371c9d4SSatish Balay   if (flg) {
309371c9d4SSatish Balay     n -= 2;
319371c9d4SSatish Balay     rect = 1;
329371c9d4SSatish Balay   }
33c4762a1bSJed Brown 
34c4762a1bSJed Brown   /* Create and assemble matrix */
359566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &mat));
369566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(mat, PETSC_DECIDE, PETSC_DECIDE, m, n));
379566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(mat));
389566063dSJacob Faibussowitsch   PetscCall(MatSetUp(mat));
399566063dSJacob Faibussowitsch   PetscCall(MatGetOwnershipRange(mat, &rstart, &rend));
40c4762a1bSJed Brown   for (i = rstart; i < rend; i++) {
41c4762a1bSJed Brown     for (j = 0; j < n; j++) {
42c4762a1bSJed Brown       v = 10 * i + j;
439566063dSJacob Faibussowitsch       PetscCall(MatSetValues(mat, 1, &i, 1, &j, &v, INSERT_VALUES));
44c4762a1bSJed Brown     }
45c4762a1bSJed Brown   }
469566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY));
479566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY));
48c4762a1bSJed Brown 
49c4762a1bSJed Brown   /* Print info about original matrix */
509566063dSJacob Faibussowitsch   PetscCall(MatGetInfo(mat, MAT_GLOBAL_SUM, &info));
51d0609cedSBarry Smith   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "original matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", (PetscInt)info.nz_used, (PetscInt)info.nz_allocated));
529566063dSJacob Faibussowitsch   PetscCall(MatNorm(mat, NORM_FROBENIUS, &normf));
539566063dSJacob Faibussowitsch   PetscCall(MatNorm(mat, NORM_1, &norm1));
549566063dSJacob Faibussowitsch   PetscCall(MatNorm(mat, NORM_INFINITY, &normi));
559566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "original: Frobenious norm = %g, one norm = %g, infinity norm = %g\n", (double)normf, (double)norm1, (double)normi));
569566063dSJacob Faibussowitsch   PetscCall(MatView(mat, PETSC_VIEWER_STDOUT_WORLD));
57c4762a1bSJed Brown 
58c4762a1bSJed Brown   /* Form matrix transpose */
599566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(NULL, NULL, "-in_place", &flg));
60c4762a1bSJed Brown   if (flg) {
619566063dSJacob Faibussowitsch     PetscCall(MatTranspose(mat, MAT_INPLACE_MATRIX, &mat)); /* in-place transpose */
629371c9d4SSatish Balay     tmat = mat;
639371c9d4SSatish Balay     mat  = 0;
64c4762a1bSJed Brown   } else { /* out-of-place transpose */
659566063dSJacob Faibussowitsch     PetscCall(MatTranspose(mat, MAT_INITIAL_MATRIX, &tmat));
66c4762a1bSJed Brown   }
67c4762a1bSJed Brown 
68c4762a1bSJed Brown   /* Print info about transpose matrix */
699566063dSJacob Faibussowitsch   PetscCall(MatGetInfo(tmat, MAT_GLOBAL_SUM, &info));
70d0609cedSBarry Smith   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "transpose matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", (PetscInt)info.nz_used, (PetscInt)info.nz_allocated));
719566063dSJacob Faibussowitsch   PetscCall(MatNorm(tmat, NORM_FROBENIUS, &normf));
729566063dSJacob Faibussowitsch   PetscCall(MatNorm(tmat, NORM_1, &norm1));
739566063dSJacob Faibussowitsch   PetscCall(MatNorm(tmat, NORM_INFINITY, &normi));
749566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "transpose: Frobenious norm = %g, one norm = %g, infinity norm = %g\n", (double)normf, (double)norm1, (double)normi));
759566063dSJacob Faibussowitsch   PetscCall(MatView(tmat, PETSC_VIEWER_STDOUT_WORLD));
76c4762a1bSJed Brown 
77c4762a1bSJed Brown   /* Test MatAXPY */
78c4762a1bSJed Brown   if (mat && !rect) {
79c4762a1bSJed Brown     PetscScalar alpha = 1.0;
809566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetScalar(NULL, NULL, "-alpha", &alpha, NULL));
819566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "matrix addition:  B = B + alpha * A\n"));
829566063dSJacob Faibussowitsch     PetscCall(MatAXPY(tmat, alpha, mat, DIFFERENT_NONZERO_PATTERN));
839566063dSJacob Faibussowitsch     PetscCall(MatView(tmat, PETSC_VIEWER_STDOUT_WORLD));
84c4762a1bSJed Brown   }
85c4762a1bSJed Brown 
86c4762a1bSJed Brown   /* Free data structures */
879566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&tmat));
889566063dSJacob Faibussowitsch   if (mat) PetscCall(MatDestroy(&mat));
89c4762a1bSJed Brown 
909566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
91b122ec5aSJacob Faibussowitsch   return 0;
92c4762a1bSJed Brown }
93c4762a1bSJed Brown 
94c4762a1bSJed Brown /*TEST
95c4762a1bSJed Brown 
96c4762a1bSJed Brown    test:
97c4762a1bSJed Brown 
98c4762a1bSJed Brown    testset:
99c4762a1bSJed Brown      args: -rect1
100c4762a1bSJed Brown      test:
101c4762a1bSJed Brown        suffix: r1
102c4762a1bSJed Brown        output_file: output/ex49_r1.out
103c4762a1bSJed Brown      test:
104c4762a1bSJed Brown        suffix: r1_inplace
105c4762a1bSJed Brown        args: -in_place
106c4762a1bSJed Brown        output_file: output/ex49_r1.out
107c4762a1bSJed Brown      test:
108c4762a1bSJed Brown        suffix: r1_par
109c4762a1bSJed Brown        nsize: 2
110c4762a1bSJed Brown        output_file: output/ex49_r1_par.out
111c4762a1bSJed Brown      test:
112c4762a1bSJed Brown        suffix: r1_par_inplace
113c4762a1bSJed Brown        args: -in_place
114c4762a1bSJed Brown        nsize: 2
115c4762a1bSJed Brown        output_file: output/ex49_r1_par.out
116c4762a1bSJed Brown 
117c4762a1bSJed Brown TEST*/
118