xref: /petsc/include/petsc/private/dmlabelimpl.h (revision 856bee69f0e0908e75ff837867b1777dfb1ced96)
1 #ifndef _LABELIMPL_H
2 #define _LABELIMPL_H
3 
4 #include <petscdmlabel.h>
5 #include <petscbt.h>
6 #include <petscistypes.h>
7 #include <petsc/private/hashmapi.h>
8 #include <petsc/private/hashseti.h>
9 
10 typedef struct _p_DMLabelOps *DMLabelOps;
11 struct _p_DMLabelOps {
12   PetscErrorCode (*view)(DMLabel, PetscViewer);
13   PetscErrorCode (*setup)(DMLabel);
14   PetscErrorCode (*destroy)(DMLabel);
15   PetscErrorCode (*duplicate)(DMLabel, DMLabel *);
16   PetscErrorCode (*getstratumis)(DMLabel, PetscInt, IS *);
17 };
18 
19 /* This is an integer map, in addition it is also a container class
20    Design points:
21      - Low storage is the most important design point
22      - We want flexible insertion and deletion
23      - We can live with O(log) query, but we need O(1) iteration over strata
24 */
25 struct _p_DMLabel {
26   PETSCHEADER(struct _p_DMLabelOps);
27   PetscBool readonly;      /* Flag for labels which cannot be modified after creation */
28   PetscInt  numStrata;     /* Number of integer values */
29   PetscInt  defaultValue;  /* Background value when no value explicitly given */
30   PetscInt *stratumValues; /* Value of each stratum */
31   /* Basic IS storage */
32   PetscBool *validIS;      /* The IS is valid (no additions need to be merged in) */
33   PetscInt  *stratumSizes; /* Size of each stratum */
34   IS        *points;       /* Points for each stratum, always sorted */
35   /* Hash tables for fast search and insertion */
36   PetscHMapI  hmap; /* Hash map for fast strata search */
37   PetscHSetI *ht;   /* Hash set for fast insertion */
38   /* Index for fast search */
39   PetscInt pStart, pEnd; /* Bounds for index lookup */
40   PetscBT  bt;           /* A bit-wise index */
41   /* Propagation */
42   PetscInt *propArray; /* Array of values for propagation */
43 };
44 
45 PETSC_INTERN PetscErrorCode DMLabelLookupStratum(DMLabel, PetscInt, PetscInt *);
46 PETSC_INTERN PetscErrorCode DMLabelGetStratumSize_Private(DMLabel, PetscInt, PetscInt *);
47 PETSC_INTERN PetscErrorCode PetscSectionSymCreate_Label(PetscSectionSym);
48 PETSC_INTERN PetscErrorCode DMLabelMakeAllInvalid_Internal(DMLabel);
49 #endif
50