/*@ DMLabelClearValue - Clear the value a label assigns to a point Input Parameters: + label - the DMLabel . point - the point - value - The point value Level: intermediate .seealso: DMLabelCreate(), DMLabelGetValue(), DMLabelSetValue() @*/ PetscErrorCode DMLabelClearValue(DMLabel label, PetscInt point, PetscInt value) { PetscInt v, p; PetscErrorCode ierr; PetscFunctionBegin; /* Find label value */ for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } if (v >= label->numStrata) PetscFunctionReturn(0); if (label->arrayValid[v]) { /* Check whether point exists */ ierr = PetscFindInt(point, label->stratumSizes[v], &label->points[v][0], &p);CHKERRQ(ierr); if (p >= 0) { ierr = PetscMemmove(&label->points[v][p], &label->points[v][p+1], (label->stratumSizes[v]-p-1) * sizeof(PetscInt));CHKERRQ(ierr); --label->stratumSizes[v]; if (label->bt) { if ((point < label->pStart) || (point >= label->pEnd)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Label point %D is not in [%D, %D)", point, label->pStart, label->pEnd); ierr = PetscBTClear(label->bt, point - label->pStart);CHKERRQ(ierr); } } } else { ierr = PetscHashIDelKey(label->ht[v], point);CHKERRQ(ierr); } PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscInt i,*a,*b; PetscErrorCode ierr; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscMalloc1(10,&a);CHKERRQ(ierr); ierr = PetscMalloc1(20,&b);CHKERRQ(ierr); /* Nonoverlapping regions */ for (i=0; i<20; i++) b[i] = i; ierr = PetscMemmove(a,b,10*sizeof(PetscInt));CHKERRQ(ierr); ierr = PetscIntView(10,a,NULL);CHKERRQ(ierr); ierr = PetscFree(a);CHKERRQ(ierr); /* | | | | b a b+15 b+20 a+10 a+15 */ a = b + 5; ierr = PetscMemmove(a,b,15*sizeof(PetscInt));CHKERRQ(ierr); ierr = PetscIntView(15,a,NULL);CHKERRQ(ierr); ierr = PetscFree(b);CHKERRQ(ierr); /* | | | | a b a+20 a+25 b+20 */ ierr = PetscMalloc1(25,&a);CHKERRQ(ierr); b = a + 5; for (i=0; i<20; i++) b[i] = i; ierr = PetscMemmove(a,b,20*sizeof(PetscInt));CHKERRQ(ierr); ierr = PetscIntView(20,a,NULL);CHKERRQ(ierr); ierr = PetscFree(a);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
// gridsizes is array of length nsamples, to be PetscFree'd by caller PetscErrorCode SampleGridRangeCreate(PetscMPIInt nranks,PetscInt minlocal,PetscInt maxlocal,PetscInt maxsamples,PetscInt *nsamples,PetscInt **gridsizes) { PetscErrorCode ierr; int64_t target; PetscInt gsize[100][3],n; PetscFunctionBegin; if (maxsamples < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_INCOMP,"The max number of samples must be at least 2"); // Build a list of compatible grid sizes in descending order for (target=maxlocal,n=0; target>=minlocal; n++) { ierr = FindCompatibleProblemSize(nranks,target,gsize[n]);CHKERRQ(ierr); if (SampleGridNumElements(gsize[n]) < minlocal) { if (!n) n = 1; // Keep whatever we found if it's the only one break; } target = (SampleGridNumElements(gsize[n]) - 1)/nranks; } // Filter the list by greedily removing interior sample locations whose removal would leave behind the smallest // possible ratio between successive sizes while (n > maxsamples) { PetscInt loc = -1; double ratio = 1e10; for (PetscInt i=1; i<n-1; i++) { double r = (double)SampleGridNumElements(gsize[i-1]) / SampleGridNumElements(gsize[i+1]); if (r < ratio) { loc = i; ratio = r; } } ierr = PetscMemmove(gsize[loc],gsize[loc+1],(char*)gsize[n]-(char*)gsize[loc+1]);CHKERRQ(ierr); n--; } *nsamples = n; ierr = PetscMalloc(n*sizeof gsize[0],gridsizes);CHKERRQ(ierr); ierr = PetscMemcpy(*gridsizes,gsize[0],n*sizeof gsize[0]);CHKERRQ(ierr); PetscFunctionReturn(0); }
void PETSC_STDCALL petscmemmove_(void*a,void*b,size_t *n, int *__ierr ){ *__ierr = PetscMemmove(a,b,*n); }
PetscErrorCode DMLabelSetValue(DMLabel label, PetscInt point, PetscInt value) { PetscInt v, loc; PetscErrorCode ierr; PetscFunctionBegin; /* Find, or add, label value */ for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } if (v >= label->numStrata) { PetscInt *tmpV, *tmpO, *tmpS; ierr = PetscMalloc3(label->numStrata+1,PetscInt,&tmpV,label->numStrata+2,PetscInt,&tmpO,label->numStrata+1,PetscInt,&tmpS);CHKERRQ(ierr); for (v = 0; v < label->numStrata; ++v) { tmpV[v] = label->stratumValues[v]; tmpO[v] = label->stratumOffsets[v]; tmpS[v] = label->stratumSizes[v]; } tmpV[v] = value; tmpO[v] = v == 0 ? 0 : label->stratumOffsets[v]; tmpS[v] = 0; tmpO[v+1] = tmpO[v]; ++label->numStrata; ierr = PetscFree3(label->stratumValues,label->stratumOffsets,label->stratumSizes);CHKERRQ(ierr); label->stratumValues = tmpV; label->stratumOffsets = tmpO; label->stratumSizes = tmpS; } /* Check whether point exists */ ierr = PetscFindInt(point,label->stratumSizes[v],label->points+label->stratumOffsets[v],&loc);CHKERRQ(ierr); if (loc < 0) { PetscInt off = label->stratumOffsets[v] - (loc+1); /* decode insert location */ /* Check for reallocation */ if (label->stratumSizes[v] >= label->stratumOffsets[v+1]-label->stratumOffsets[v]) { PetscInt oldSize = label->stratumOffsets[v+1]-label->stratumOffsets[v]; PetscInt newSize = PetscMax(10, 2*oldSize); /* Double the size, since 2 is the optimal base for this online algorithm */ PetscInt shift = newSize - oldSize; PetscInt allocSize = label->stratumOffsets[label->numStrata] + shift; PetscInt *newPoints; PetscInt w, q; ierr = PetscMalloc(allocSize * sizeof(PetscInt), &newPoints);CHKERRQ(ierr); for (q = 0; q < label->stratumOffsets[v]+label->stratumSizes[v]; ++q) { newPoints[q] = label->points[q]; } for (w = v+1; w < label->numStrata; ++w) { for (q = label->stratumOffsets[w]; q < label->stratumOffsets[w]+label->stratumSizes[w]; ++q) { newPoints[q+shift] = label->points[q]; } label->stratumOffsets[w] += shift; } label->stratumOffsets[label->numStrata] += shift; ierr = PetscFree(label->points);CHKERRQ(ierr); label->points = newPoints; } ierr = PetscMemmove(&label->points[off+1], &label->points[off], (label->stratumSizes[v]+(loc+1)) * sizeof(PetscInt));CHKERRQ(ierr); label->points[off] = point; ++label->stratumSizes[v]; } PetscFunctionReturn(0); }