Actual source code: isltog.h
petsc-3.10.5 2019-03-28
Report Typos and Errors

      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)

     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;

     19:   if (!map) {
     20:     ISGlobalToLocalMappingSetUp(mapping);
     21:     map  = (PETSCMAPTYPE(ISLocalToGlobalMapping) *)mapping->data;
     22:   }
     23:   start   = mapping->globalstart;
     24:   end     = mapping->globalend;
     25:   bs      = GTOLBS;

     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:   return(0);
     62: }

     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