Actual source code: isltog.h
petsc-3.14.6 2021-03-30
2: /*
3: This is a terrible way of doing "templates" in C.
4: */
5: #define PETSCMAP1_a(a,b) a ## b
6: #define PETSCMAP1_b(a,b) PETSCMAP1_a(a,b)
7: #define PETSCMAPNAME(a) PETSCMAP1_b(a,GTOLNAME)
8: #define PETSCMAPTYPE(a) PETSCMAP1_b(a,GTOLTYPE)
10: static PetscErrorCode PETSCMAPNAME(ISGlobalToLocalMappingApply)(ISLocalToGlobalMapping mapping,ISGlobalToLocalMappingMode type,
11: PetscInt n,const PetscInt idx[],PetscInt *nout,PetscInt idxout[])
12: {
13: PetscInt i,nf = 0,tmp,start,end,bs;
14: PETSCMAPTYPE(ISLocalToGlobalMapping) *map = (PETSCMAPTYPE(ISLocalToGlobalMapping)*)mapping->data;
15: PetscErrorCode ierr;
19: if (!map) {
20: ISGlobalToLocalMappingSetUp(mapping);
21: map = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data;
22: }
23: start = mapping->globalstart;
24: end = mapping->globalend;
25: bs = GTOLBS;
27: if (type == IS_GTOLM_MASK) {
28: if (idxout) {
29: for (i=0; i<n; i++) {
30: if (idx[i] < 0) idxout[i] = idx[i];
31: else if (idx[i] < bs*start) idxout[i] = -1;
32: else if (idx[i] > bs*(end+1)-1) idxout[i] = -1;
33: else GTOL(idx[i], idxout[i]);
34: }
35: }
36: if (nout) *nout = n;
37: } else {
38: if (idxout) {
39: for (i=0; i<n; i++) {
40: if (idx[i] < 0) continue;
41: if (idx[i] < bs*start) continue;
42: if (idx[i] > bs*(end+1)-1) continue;
43: GTOL(idx[i], tmp);
44: if (tmp < 0) continue;
45: idxout[nf++] = tmp;
46: }
47: } else {
48: for (i=0; i<n; i++) {
49: if (idx[i] < 0) continue;
50: if (idx[i] < bs*start) continue;
51: if (idx[i] > bs*(end+1)-1) continue;
52: GTOL(idx[i], tmp);
53: if (tmp < 0) continue;
54: nf++;
55: }
56: }
57: if (nout) *nout = nf;
58: }
59: return(0);
60: }
62: #undef PETSCMAP1_a
63: #undef PETSCMAP1_b
64: #undef PETSCMAPTYPE
65: #undef PETSCMAPNAME
66: #undef GTOLTYPE
67: #undef GTOLNAME
68: #undef GTOLBS
69: #undef GTOL