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