Actual source code: isltog.h
1: /*
2: This is a terrible way of doing "templates" in C.
3: */
4: #define PETSCMAPNAME(a) PetscConcat(a, GTOLNAME)
5: #define PETSCMAPTYPE(a) PetscConcat(a, GTOLTYPE)
7: static PetscErrorCode PETSCMAPNAME(ISGlobalToLocalMappingApply)(ISLocalToGlobalMapping mapping, ISGlobalToLocalMappingMode type, PetscInt n, const PetscInt idx[], PetscInt *nout, PetscInt idxout[])
8: {
9: PetscInt i, nf = 0, tmp, start, end, bs;
10: PETSCMAPTYPE(ISLocalToGlobalMapping) *map = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data;
12: PetscFunctionBegin;
14: if (!map) {
15: PetscCall(ISGlobalToLocalMappingSetUp(mapping));
16: map = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data;
17: }
18: start = mapping->globalstart;
19: end = mapping->globalend;
20: bs = GTOLBS;
22: if (type == IS_GTOLM_MASK) {
23: if (idxout) {
24: for (i = 0; i < n; i++) {
25: if (idx[i] < 0) idxout[i] = idx[i];
26: else if (idx[i] < bs * start) idxout[i] = -1;
27: else if (idx[i] > bs * (end + 1) - 1) idxout[i] = -1;
28: else GTOL(idx[i], idxout[i]);
29: }
30: }
31: if (nout) *nout = n;
32: } else {
33: if (idxout) {
34: for (i = 0; i < n; i++) {
35: if (idx[i] < 0) continue;
36: if (idx[i] < bs * start) continue;
37: if (idx[i] > bs * (end + 1) - 1) continue;
38: GTOL(idx[i], tmp);
39: if (tmp < 0) continue;
40: idxout[nf++] = tmp;
41: }
42: } else {
43: for (i = 0; i < n; i++) {
44: if (idx[i] < 0) continue;
45: if (idx[i] < bs * start) continue;
46: if (idx[i] > bs * (end + 1) - 1) continue;
47: GTOL(idx[i], tmp);
48: if (tmp < 0) continue;
49: nf++;
50: }
51: }
52: if (nout) *nout = nf;
53: }
54: PetscFunctionReturn(PETSC_SUCCESS);
55: }
57: #undef PETSCMAPTYPE
58: #undef PETSCMAPNAME
59: #undef GTOLTYPE
60: #undef GTOLNAME
61: #undef GTOLBS
62: #undef GTOL