Actual source code: seqhashmatsetvalues.h
1: /*
2: used by SEQAIJ, BAIJ and SBAIJ to reduce code duplication
4: define TYPE to AIJ BAIJ or SBAIJ
5: TYPE_BS_ON for BAIJ and SBAIJ and bs > 1
6: TYPE_SBAIJ for SBAIJ
8: */
9: static PetscErrorCode PetscConcat(MatSetValues_Seq_Hash, TYPE_BS)(Mat A, PetscInt m, const PetscInt *rows, PetscInt n, const PetscInt *cols, const PetscScalar *values, InsertMode addv)
10: {
11: PetscConcat(Mat_Seq, TYPE) *a = (PetscConcat(Mat_Seq, TYPE) *)A->data;
12: #if defined(TYPE_BS_ON)
13: const PetscInt bs = A->rmap->bs;
14: #endif
15: const PetscBool ignorezeroentries = a->ignorezeroentries;
17: PetscFunctionBegin;
18: for (PetscInt r = 0; r < m; ++r) {
19: PetscHashIJKey key;
20: PetscBool missing;
21: PetscScalar value;
22: #if defined(TYPE_BS_ON)
23: PetscHashIJKey bkey;
24: #endif
26: key.i = rows[r];
27: #if defined(TYPE_BS_ON)
28: bkey.i = key.i / bs;
29: #endif
30: if (key.i < 0) continue;
31: for (PetscInt c = 0; c < n; ++c) {
32: key.j = cols[c];
33: #if defined(TYPE_BS_ON)
34: bkey.j = key.j / bs;
35: #if defined(TYPE_SBAIJ)
36: if (bkey.j < bkey.i) continue;
37: #else
38: if (key.j < 0) continue;
39: #endif
40: #else
41: #if defined(TYPE_SBAIJ)
42: if (key.j < key.i) continue;
43: #else
44: if (key.j < 0) continue;
45: #endif
46: #endif
47: value = values ? (a->roworiented ? values[r * n + c] : values[r + m * c]) : 0;
48: if (ignorezeroentries && value == 0.0 && key.i != key.j) continue;
49: switch (addv) {
50: case INSERT_VALUES:
51: PetscCall(PetscHMapIJVQuerySet(a->ht, key, value, &missing));
52: break;
53: case ADD_VALUES:
54: PetscCall(PetscHMapIJVQueryAdd(a->ht, key, value, &missing));
55: break;
56: default:
57: SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "InsertMode not supported");
58: }
59: if (missing) ++a->dnz[key.i];
60: #if defined(TYPE_BS_ON)
61: PetscCall(PetscHSetIJQueryAdd(a->bht, bkey, &missing));
62: if (missing) ++a->bdnz[bkey.i];
63: #endif
64: }
65: }
66: PetscFunctionReturn(PETSC_SUCCESS);
67: }