Actual source code: ex54.c
petsc-3.12.1 2019-10-22
1: /*
3: Tests MPIDENSE matrix operations MatMultTranspose() with processes with no rows or columns.
4: As the matrix is rectangular, least square solution is computed, so KSPLSQR is also tested here.
5: */
7: #include <petscksp.h>
9: PetscErrorCode fill(Mat m, Vec v)
10: {
11: PetscInt idxn[3] = {0, 1, 2};
12: PetscInt localRows = 0;
13: PetscMPIInt rank,size;
17: MPI_Comm_rank(MPI_COMM_WORLD, &rank);
18: MPI_Comm_size(MPI_COMM_WORLD, &size);
20: if (rank == 1 || rank == 2) localRows = 4;
21: if (size == 1) localRows = 8;
22: MatSetSizes(m, localRows, PETSC_DECIDE, PETSC_DECIDE, 3);
23: VecSetSizes(v, localRows, PETSC_DECIDE);
25: MatSetFromOptions(m);
26: VecSetFromOptions(v);
27: MatSetUp(m);
29: if (size == 1) {
30: PetscInt idxm1[4] = {0, 1, 2, 3};
31: PetscScalar values1[12] = {1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1};
32: PetscInt idxm2[4] = {4, 5, 6, 7};
33: PetscScalar values2[12] = {1, 2, 0, 1, 2, 1, 1, 3, 0, 1, 3, 1};
35: MatSetValues(m, 4, idxm1, 3, idxn, values1, INSERT_VALUES);
36: VecSetValue(v, 0, 1.1, INSERT_VALUES); VecSetValue(v, 1, 2.5, INSERT_VALUES);
37: VecSetValue(v, 2, 3, INSERT_VALUES); VecSetValue(v, 3, 4, INSERT_VALUES);
39: MatSetValues(m, 4, idxm2, 3, idxn, values2, INSERT_VALUES);
40: VecSetValue(v, 4, 5, INSERT_VALUES); VecSetValue(v, 5, 6, INSERT_VALUES);
41: VecSetValue(v, 6, 7, INSERT_VALUES); VecSetValue(v, 7, 8, INSERT_VALUES);
42: } else if (rank == 1) {
43: PetscInt idxm[4] = {0, 1, 2, 3};
44: PetscScalar values[12] = {1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1};
46: MatSetValues(m, 4, idxm, 3, idxn, values, INSERT_VALUES);
47: VecSetValue(v, 0, 1.1, INSERT_VALUES); VecSetValue(v, 1, 2.5, INSERT_VALUES);
48: VecSetValue(v, 2, 3, INSERT_VALUES); VecSetValue(v, 3, 4, INSERT_VALUES);
49: } else if (rank == 2) {
50: PetscInt idxm[4] = {4, 5, 6, 7};
51: PetscScalar values[12] = {1, 2, 0, 1, 2, 1, 1, 3, 0, 1, 3, 1};
53: MatSetValues(m, 4, idxm, 3, idxn, values, INSERT_VALUES);
54: VecSetValue(v, 4, 5, INSERT_VALUES); VecSetValue(v, 5, 6, INSERT_VALUES);
55: VecSetValue(v, 6, 7, INSERT_VALUES); VecSetValue(v, 7, 8, INSERT_VALUES);
56: }
57: MatAssemblyBegin(m, MAT_FINAL_ASSEMBLY);
58: MatAssemblyEnd(m, MAT_FINAL_ASSEMBLY);
59: VecAssemblyBegin(v);
60: VecAssemblyEnd(v);
61: return(0);
62: }
65: int main(int argc, char** argv)
66: {
67: Mat Q;
68: Vec v, a, se;
69: KSP QRsolver;
70: PC pc;
73: PetscInitialize(&argc, &argv, NULL, NULL);if (ierr) return ierr;
75: VecCreate(PETSC_COMM_WORLD, &v);
76: MatCreate(PETSC_COMM_WORLD, &Q);
77: MatSetType(Q, MATDENSE);
78: fill(Q, v);
80: MatCreateVecs(Q, &a, NULL);
81: KSPCreate(PETSC_COMM_WORLD, &QRsolver);
82: KSPGetPC(QRsolver, &pc);
83: PCSetType(pc, PCNONE);
84: KSPSetType(QRsolver, KSPLSQR);
85: KSPSetFromOptions(QRsolver);
86: KSPSetOperators(QRsolver, Q, Q);
87: MatViewFromOptions(Q, NULL, "-sys_view");
88: VecViewFromOptions(a, NULL, "-rhs_view");
89: KSPSolve(QRsolver, v, a);
90: KSPLSQRGetStandardErrorVec(QRsolver, &se);
91: if (se) {
92: VecViewFromOptions(se, NULL, "-se_view");
93: }
94: KSPDestroy(&QRsolver);
95: VecDestroy(&a);
96: VecDestroy(&v);
97: MatDestroy(&Q);
99: PetscFinalize();
100: return ierr;
101: }
104: /*TEST
106: test:
107: args: -ksp_monitor_true_residual -ksp_max_it 10 -sys_view -ksp_converged_reason -ksp_view -ksp_lsqr_compute_standard_error -ksp_lsqr_monitor
109: test:
110: suffix: 2
111: nsize: 4
112: args: -ksp_monitor_true_residual -ksp_max_it 10 -sys_view -ksp_converged_reason -ksp_view -ksp_lsqr_compute_standard_error -ksp_lsqr_monitor
114: test:
115: suffix: 3
116: nsize: 2
117: args: -ksp_monitor_true_residual -ksp_max_it 10 -sys_view -ksp_converged_reason -ksp_view -ksp_lsqr_monitor -ksp_convergence_test lsqr -ksp_lsqr_compute_standard_error -se_view -ksp_lsqr_exact_mat_norm 0
119: test:
120: suffix: 4
121: nsize: 2
122: args: -ksp_monitor_true_residual -ksp_max_it 10 -sys_view -ksp_converged_reason -ksp_view -ksp_lsqr_monitor -ksp_convergence_test lsqr -ksp_lsqr_compute_standard_error -se_view -ksp_lsqr_exact_mat_norm 1
125: TEST*/