4 PETSC_EXTERN
const char hborder[] =
"------------------------------------------------------------" 5 "------------------------------------------------------------";
7 PETSC_EXTERN PetscErrorCode SetRow(
const Mat& A,
const PetscInt& row,
const std::vector<PetscInt>& idxn)
9 PetscErrorCode ierr = 0;
11 PetscInt rstart, rend;
12 ierr = MatGetOwnershipRange(A, &rstart, &rend); CHKERRQ(ierr);
13 if(rstart <= row && row < rend)
15 std::vector<PetscInt> idxm = {row};
16 std::vector<PetscReal> v;
17 for(
const PetscInt i: idxn) v.push_back(PetscReal(i));
18 ierr = MatSetValues(A, 1, &idxm.front(), idxn.size(), &idxn.front(), &v.front(), INSERT_VALUES); CHKERRQ(ierr);
23 PETSC_EXTERN PetscErrorCode CheckRow(
const Mat& A,
const char* label,
const PetscInt& row,
const std::vector<PetscInt>& idxn,
24 const std::vector<PetscScalar>& v,
const PetscBool& CheckZeros = PETSC_FALSE)
26 PetscErrorCode ierr = 0;
29 PetscInt rstart, rend;
30 ierr = MatGetOwnershipRange(A, &rstart, &rend); CHKERRQ(ierr);
32 if(rstart <= row && row < rend)
34 if(idxn.size()!=v.size())
35 SETERRQ3(PETSC_COMM_SELF, 1,
"On matrix %s: Input size mismatch: idxn (%d) != v (%d).", label, idxn.size(), v.size());
37 std::vector<PetscInt> idxm = {row};
40 const PetscScalar *vals;
41 ierr = MatGetRow(A, row, &ncols, &cols, &vals); CHKERRQ(ierr);
44 if (
size_t(ncols) != idxn.size())
45 SETERRQ4(PETSC_COMM_SELF, 1,
"On matrix %s: Error at row %d: ncols (%d) != idxn.size (%d).", label, row, ncols, idxn.size());
48 for(PetscInt i = 0; i < ncols; ++i)
50 if(cols[i] != idxn[i])
51 SETERRQ5(PETSC_COMM_SELF, 1,
"On matrix %s: Error at row %d idx %d: cols (%d) != idxn (%d).",
52 label, row, i, cols[i], idxn[i] );
56 for(PetscInt i = 0; i < ncols; ++i)
58 if(!PetscEqualScalar(vals[i], v[i]))
59 SETERRQ5(PETSC_COMM_SELF, 1,
"On matrix %s: Error at row %d idx %d: vals (%g) != v (%g).",
60 label, row, i, vals[i], v[i] );
63 ierr = MatRestoreRow(A, row, &ncols, &cols, &vals); CHKERRQ(ierr);
68 PETSC_EXTERN PetscErrorCode CatchErrorCode(
const MPI_Comm& comm,
const PetscInt& ierr_in,
const PetscInt& ierr_exp)
70 PetscErrorCode ierr = 0;
72 if(ierr_in != ierr_exp)
74 SETERRQ2(comm, 1,
"Failed test. Expected error code %d. Got %d.", ierr_exp, ierr_in);
76 PetscPrintf(comm,
"\n Exception caught. :)\n\n");
82 PETSC_EXTERN PetscErrorCode SetSz0(
const Mat& Sz)
84 PetscErrorCode ierr = 0;
86 ierr = SetRow(Sz, 0, {0,1}); CHKERRQ(ierr);
87 ierr = SetRow(Sz, 1, {1}); CHKERRQ(ierr);
88 ierr = SetRow(Sz, 2, {2,3,4}); CHKERRQ(ierr);
89 ierr = SetRow(Sz, 3, {3}); CHKERRQ(ierr);
90 ierr = SetRow(Sz, 4, {2,4}); CHKERRQ(ierr);
91 ierr = SetRow(Sz, 5, {5,6}); CHKERRQ(ierr);
92 ierr = SetRow(Sz, 7, {7}); CHKERRQ(ierr);
97 PETSC_EXTERN PetscErrorCode SetSp0(
const Mat& Sp)
99 PetscErrorCode ierr = 0;
101 ierr = SetRow(Sp, 0, {2,3,4}); CHKERRQ(ierr);
102 ierr = SetRow(Sp, 1, {2,4}); CHKERRQ(ierr);
103 ierr = SetRow(Sp, 2, {5,6}); CHKERRQ(ierr);
104 ierr = SetRow(Sp, 3, {5}); CHKERRQ(ierr);
105 ierr = SetRow(Sp, 4, {6}); CHKERRQ(ierr);
106 ierr = SetRow(Sp, 6, {7}); CHKERRQ(ierr);
111 PETSC_EXTERN PetscErrorCode SetSz1(
const Mat& Sz)
113 PetscErrorCode ierr = 0;
115 ierr = SetRow(Sz, 0, {0,1}); CHKERRQ(ierr);
116 ierr = SetRow(Sz, 1, {1}); CHKERRQ(ierr);
117 ierr = SetRow(Sz, 3, {3}); CHKERRQ(ierr);
118 ierr = SetRow(Sz, 4, {2,4}); CHKERRQ(ierr);
119 ierr = SetRow(Sz, 5, {5,6}); CHKERRQ(ierr);
120 ierr = SetRow(Sz, 7, {7}); CHKERRQ(ierr);
125 PETSC_EXTERN PetscErrorCode SetSp1(
const Mat& Sp)
127 PetscErrorCode ierr = 0;
129 ierr = SetRow(Sp, 0, {2,3,4}); CHKERRQ(ierr);
130 ierr = SetRow(Sp, 1, {2,4}); CHKERRQ(ierr);
131 ierr = SetRow(Sp, 2, {5,6}); CHKERRQ(ierr);
132 ierr = SetRow(Sp, 4, {6}); CHKERRQ(ierr);
133 ierr = SetRow(Sp, 6, {7}); CHKERRQ(ierr);