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