1 2 /* 3 This is a terrible way of doing "templates" in C. 4 */ 5 #define PETSCMAPNAME(a) PetscConcat(a, GTOLNAME) 6 #define PETSCMAPTYPE(a) PetscConcat(a, GTOLTYPE) 7 8 static PetscErrorCode PETSCMAPNAME(ISGlobalToLocalMappingApply)(ISLocalToGlobalMapping mapping, ISGlobalToLocalMappingMode type, PetscInt n, const PetscInt idx[], PetscInt *nout, PetscInt idxout[]) 9 { 10 PetscInt i, nf = 0, tmp, start, end, bs; 11 PETSCMAPTYPE(ISLocalToGlobalMapping) *map = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data; 12 13 PetscFunctionBegin; 14 PetscValidHeaderSpecific(mapping, IS_LTOGM_CLASSID, 1); 15 if (!map) { 16 PetscCall(ISGlobalToLocalMappingSetUp(mapping)); 17 map = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data; 18 } 19 start = mapping->globalstart; 20 end = mapping->globalend; 21 bs = GTOLBS; 22 23 if (type == IS_GTOLM_MASK) { 24 if (idxout) { 25 for (i = 0; i < n; i++) { 26 if (idx[i] < 0) idxout[i] = idx[i]; 27 else if (idx[i] < bs * start) idxout[i] = -1; 28 else if (idx[i] > bs * (end + 1) - 1) idxout[i] = -1; 29 else GTOL(idx[i], idxout[i]); 30 } 31 } 32 if (nout) *nout = n; 33 } else { 34 if (idxout) { 35 for (i = 0; i < n; i++) { 36 if (idx[i] < 0) continue; 37 if (idx[i] < bs * start) continue; 38 if (idx[i] > bs * (end + 1) - 1) continue; 39 GTOL(idx[i], tmp); 40 if (tmp < 0) continue; 41 idxout[nf++] = tmp; 42 } 43 } else { 44 for (i = 0; i < n; i++) { 45 if (idx[i] < 0) continue; 46 if (idx[i] < bs * start) continue; 47 if (idx[i] > bs * (end + 1) - 1) continue; 48 GTOL(idx[i], tmp); 49 if (tmp < 0) continue; 50 nf++; 51 } 52 } 53 if (nout) *nout = nf; 54 } 55 PetscFunctionReturn(PETSC_SUCCESS); 56 } 57 58 #undef PETSCMAPTYPE 59 #undef PETSCMAPNAME 60 #undef GTOLTYPE 61 #undef GTOLNAME 62 #undef GTOLBS 63 #undef GTOL 64