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