UnitTests_Misc.cpp
1 #include <vector>
2 #include "petscmat.h"
3 
4 PETSC_EXTERN const char hborder[] = "------------------------------------------------------------"
5  "------------------------------------------------------------";
6 
7 PETSC_EXTERN PetscErrorCode SetRow(const Mat& A, const PetscInt& row, const std::vector<PetscInt>& idxn)
8 {
9  PetscErrorCode ierr = 0;
10  /* Check row ownership range */
11  PetscInt rstart, rend;
12  ierr = MatGetOwnershipRange(A, &rstart, &rend); CHKERRQ(ierr);
13  if(rstart <= row && row < rend)
14  {
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);
19  }
20  return ierr;
21 }
22 
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)
25 {
26  PetscErrorCode ierr = 0;
27 
28  /* Check row ownership range */
29  PetscInt rstart, rend;
30  ierr = MatGetOwnershipRange(A, &rstart, &rend); CHKERRQ(ierr);
31 
32  if(rstart <= row && row < rend)
33  {
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());
36 
37  std::vector<PetscInt> idxm = {row};
38  PetscInt ncols;
39  const PetscInt *cols;
40  const PetscScalar *vals;
41  ierr = MatGetRow(A, row, &ncols, &cols, &vals); CHKERRQ(ierr);
42 
43  /* Compare cols and vals with idxn and v */
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());
46 
47  /* Compare column indices */
48  for(PetscInt i = 0; i < ncols; ++i)
49  {
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] );
53  }
54 
55  /* Compare values */
56  for(PetscInt i = 0; i < ncols; ++i)
57  {
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] );
61  }
62 
63  ierr = MatRestoreRow(A, row, &ncols, &cols, &vals); CHKERRQ(ierr);
64  }
65  return ierr;
66 }
67 
68 PETSC_EXTERN PetscErrorCode CatchErrorCode(const MPI_Comm& comm, const PetscInt& ierr_in, const PetscInt& ierr_exp)
69 {
70  PetscErrorCode ierr = 0;
71 
72  if(ierr_in != ierr_exp)
73  {
74  SETERRQ2(comm, 1, "Failed test. Expected error code %d. Got %d.", ierr_exp, ierr_in);
75  } else {
76  PetscPrintf(comm, "\n Exception caught. :)\n\n");
77  }
78 
79  return ierr;
80 }
81 
82 PETSC_EXTERN PetscErrorCode SetSz0(const Mat& Sz)
83 {
84  PetscErrorCode ierr = 0;
85 
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);
93 
94  return ierr;
95 }
96 
97 PETSC_EXTERN PetscErrorCode SetSp0(const Mat& Sp)
98 {
99  PetscErrorCode ierr = 0;
100 
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);
107 
108  return ierr;
109 }
110 
111 PETSC_EXTERN PetscErrorCode SetSz1(const Mat& Sz)
112 {
113  PetscErrorCode ierr = 0;
114 
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);
121 
122  return ierr;
123 }
124 
125 PETSC_EXTERN PetscErrorCode SetSp1(const Mat& Sp)
126 {
127  PetscErrorCode ierr = 0;
128 
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);
134 
135  return ierr;
136 }
This site was generated by Sphinx using Doxygen with a customized theme from doxygen-bootstrapped.