xref: /petsc/src/vec/is/utils/isltog.h (revision 541bf97ec7d1008358b9e4ded9dccaed839654ed)
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 
28 
29   if (type == IS_GTOLM_MASK) {
30     if (idxout) {
31       for (i=0; i<n; i++) {
32         if (idx[i] < 0)                   idxout[i] = idx[i];
33         else if (idx[i] < bs*start)       idxout[i] = -1;
34         else if (idx[i] > bs*(end+1)-1)   idxout[i] = -1;
35         else                              GTOL(idx[i], idxout[i]);
36       }
37     }
38     if (nout) *nout = n;
39   } else {
40     if (idxout) {
41       for (i=0; i<n; i++) {
42         if (idx[i] < 0) continue;
43         if (idx[i] < bs*start) continue;
44         if (idx[i] > bs*(end+1)-1) continue;
45         GTOL(idx[i], tmp);
46         if (tmp < 0) continue;
47         idxout[nf++] = tmp;
48       }
49     } else {
50       for (i=0; i<n; i++) {
51         if (idx[i] < 0) continue;
52         if (idx[i] < bs*start) continue;
53         if (idx[i] > bs*(end+1)-1) continue;
54         GTOL(idx[i], tmp);
55         if (tmp < 0) continue;
56         nf++;
57       }
58     }
59     if (nout) *nout = nf;
60   }
61   PetscFunctionReturn(0);
62 }
63 
64 #undef PETSCMAP1_a
65 #undef PETSCMAP1_b
66 #undef PETSCMAPTYPE
67 #undef PETSCMAPNAME
68 #undef GTOLTYPE
69 #undef GTOLNAME
70 #undef GTOLBS
71 #undef GTOL
72