[petsc-dev] Recent changes in DMLabel

Tobin Isaac tisaac at uchicago.edu
Thu Jul 7 11:22:33 CDT 2016


Hi Lawrence, 

Bork me, sorry about that.  Thanks for patch!  I've merged it into
next.

Cheers,
  Toby

On Thu, Jul 07, 2016 at 04:29:04PM +0100, Lawrence Mitchell wrote:
> Dear all (but mostly Toby),
> 
> some recent changes in DMLabel changed the semantics of DMLabelHasPoint.
> 
> In particular, after ad8374f (DMLabel: switch internal storage from
> array to IS), clearing a label value produces bad results.  Consider
> the following:
> 
> #include <petsc.h>
> 
> int main(int argc, char **argv)
> {
>     PetscErrorCode ierr;
>     DMLabel        label;
>     PetscInt       val;
>     PetscBool      flg;
>     PetscInitialize(&argc, &argv, NULL, NULL);
> 
>     ierr = DMLabelCreate("foo", &label);CHKERRQ(ierr);
> 
>     ierr = DMLabelCreateIndex(label, 0, 1);CHKERRQ(ierr);
>     ierr = DMLabelSetValue(label, 0, 1);CHKERRQ(ierr);
>     ierr = DMLabelHasPoint(label, 0, &flg);CHKERRQ(ierr);
>     ierr = DMLabelGetValue(label, 0, &val);CHKERRQ(ierr);
>     PetscPrintf(PETSC_COMM_WORLD, "Label has point %d, value is %d\n",
> flg, val);CHKERRQ(ierr);
> 
>     ierr = DMLabelClearValue(label, 0, 1);CHKERRQ(ierr);
>     ierr = DMLabelHasPoint(label, 0, &flg);CHKERRQ(ierr);
>     ierr = DMLabelGetValue(label, 0, &val);CHKERRQ(ierr);
>     PetscPrintf(PETSC_COMM_WORLD, "Label has point %d, value is %d\n",
> flg, val);CHKERRQ(ierr);
> 
>     PetscFinalize();
>     return 0;
> }
> 
> Before this change:
> 
> $ ./bork
> Label has point 1, value is 1
> Label has point 0, value is -1
> 
> After the change:
> 
> $ ./bork
> Label has point 1, value is 1
> Label has point 1, value is -1
> 
> So you can see that although the point has been cleared from the point
> of view of GetValue, it has not if I use HasPoint.
> 
> The problem appears to be that the invalidation of the label after
> ClearValue no longer clears the PetscBT entry that exists if an index
> has been created.
> 
> Perhaps the following patch is right?
> 
> diff --git a/src/dm/label/dmlabel.c b/src/dm/label/dmlabel.c
> index 8d170c6..2c7f7c2 100644
> --- a/src/dm/label/dmlabel.c
> +++ b/src/dm/label/dmlabel.c
> @@ -665,7 +665,13 @@ PetscErrorCode DMLabelClearValue(DMLabel label,
> PetscInt point, PetscInt value)
>      if (label->stratumValues[v] == value) break;
>    }
>    if (v >= label->numStrata) PetscFunctionReturn(0);
> -  if (label->validIS[v]) {ierr =
> DMLabelMakeInvalid_Private(label,v);CHKERRQ(ierr);}
> +  if (label->validIS[v]) {
> +    ierr = DMLabelMakeInvalid_Private(label,v);CHKERRQ(ierr);
> +  }
> +  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);
> +  }
>    ierr = PetscHashIDelKey(label->ht[v], point);CHKERRQ(ierr);
>    PetscFunctionReturn(0);
>  }
> 
> 
> Cheers,
> 
> Lawrence
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20160707/da178bf8/attachment.sig>


More information about the petsc-dev mailing list