xref: /petsc/src/vec/is/utils/isltog.h (revision 1b37a2a7cc4a4fb30c3e967db1c694c0a1013f51)
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 
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