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)
6
ISGlobalToLocalMappingApply(ISLocalToGlobalMapping mapping,ISGlobalToLocalMappingMode type,PetscInt n,const PetscInt idx[],PetscInt * nout,PetscInt idxout[])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;
11
12 PetscFunctionBegin;
13 PetscValidHeaderSpecific(mapping, IS_LTOGM_CLASSID, 1);
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;
21
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 }
56
57 #undef PETSCMAPTYPE
58 #undef PETSCMAPNAME
59 #undef GTOLTYPE
60 #undef GTOLNAME
61 #undef GTOLBS
62 #undef GTOL
63