xref: /petsc/src/vec/is/utils/isltog.h (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1 
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)
9 
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;
16 
17   PetscFunctionBegin;
18   PetscValidHeaderSpecific(mapping,IS_LTOGM_CLASSID,1);
19   if (!map) {
20     ierr = ISGlobalToLocalMappingSetUp(mapping);CHKERRQ(ierr);
21     map  = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data;
22   }
23   start = mapping->globalstart;
24   end   = mapping->globalend;
25   bs    = GTOLBS;
26 
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   PetscFunctionReturn(0);
60 }
61 
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
70