xref: /petsc/include/petsc/private/dmplextransformimpl.h (revision 83976e123260a8645a52d1a0590f1c1083d38623) !
1 #pragma once
2 
3 #include <petsc/private/dmpleximpl.h>
4 #include <petscdmplextransform.h>
5 
6 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_SetUp;
7 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_Apply;
8 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_SetConeSizes;
9 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_SetCones;
10 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_CreateSF;
11 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_CreateLabels;
12 PETSC_EXTERN PetscLogEvent DMPLEXTRANSFORM_SetCoordinates;
13 
14 typedef struct _p_DMPlexTransformOps *DMPlexTransformOps;
15 struct _p_DMPlexTransformOps {
16   PetscErrorCode (*view)(DMPlexTransform, PetscViewer);
17   PetscErrorCode (*setfromoptions)(DMPlexTransform, PetscOptionItems);
18   PetscErrorCode (*setup)(DMPlexTransform);
19   PetscErrorCode (*destroy)(DMPlexTransform);
20   PetscErrorCode (*setdimensions)(DMPlexTransform, DM, DM);
21   PetscErrorCode (*celltransform)(DMPlexTransform, DMPolytopeType, PetscInt, PetscInt *, PetscInt *, DMPolytopeType *[], PetscInt *[], PetscInt *[], PetscInt *[]);
22   PetscErrorCode (*ordersupports)(DMPlexTransform, DM, DM);
23   PetscErrorCode (*getsubcellorientation)(DMPlexTransform, DMPolytopeType, PetscInt, PetscInt, DMPolytopeType, PetscInt, PetscInt, PetscInt *, PetscInt *);
24   PetscErrorCode (*mapcoordinates)(DMPlexTransform, DMPolytopeType, DMPolytopeType, PetscInt, PetscInt, PetscInt, PetscInt, const PetscScalar[], PetscScalar[]);
25 };
26 
27 struct _p_DMPlexTransform {
28   PETSCHEADER(struct _p_DMPlexTransformOps);
29   void *data;
30 
31   DM            dm;            /* This is the DM for which the transform has been computed */
32   DMLabel       active;        /* If not NULL, indicates points that are participating in the transform */
33   DMLabel       trType;        /* If not NULL, this holds the transformation type for each point */
34   PetscBool     setupcalled;   /* true if setup has been called */
35   PetscInt     *ctOrderOld;    /* [i] = ct: An array with original cell types in depth order */
36   PetscInt     *ctOrderInvOld; /* [ct] = i: An array with the ordinal numbers for each original cell type */
37   PetscInt     *ctStart;       /* [ct]: The number for the first cell of each polytope type in the original mesh */
38   PetscInt     *ctOrderNew;    /* [i] = ct: An array with produced cell types in depth order */
39   PetscInt     *ctOrderInvNew; /* [ct] = i: An array with the ordinal numbers for each produced cell type */
40   PetscInt     *ctStartNew;    /* [ctNew]: The number for the first cell of each polytope type in the new mesh */
41   PetscInt     *offset;        /* [ct/rt][ctNew]: The offset from ctStartNew[ctNew] in the new point numbering of a point of type ctNew produced from an old point of type ct or refine type rt */
42   PetscInt      depth;         /* The depth of the transformed mesh */
43   PetscInt     *depthStart;    /* The starting point for each depth stratum */
44   PetscInt     *depthEnd;      /* The starting point for the next depth stratum */
45   PetscInt     *trNv;          /* The number of transformed vertices in the closure of a cell of each type */
46   PetscScalar **trVerts;       /* The transformed vertex coordinates in the closure of a cell of each type */
47   PetscInt  ****trSubVerts;    /* The indices for vertices of subcell (rct, r) in a cell of each type */
48   PetscFE      *coordFE;       /* Finite element for each cell type, used for localized coordinate interpolation */
49   PetscFEGeom **refGeom;       /* Geometry of the reference cell for each cell type */
50   /* Label construction */
51   PetscBool labelMatchStrata; /* Flag to restrict labeled points to the same cell type as parents */
52   PetscInt  labelReplicaInc;  /* Multiplier to create new label values for replicas v = oldv + r * repInc */
53 };
54 
55 typedef struct {
56   PetscInt dummy;
57 } DMPlexTransform_Filter;
58 
59 typedef enum {
60   NORMAL_DEFAULT,
61   NORMAL_INPUT,
62   NORMAL_COMPUTE,
63   NORMAL_COMPUTE_BD
64 } PlexNormalAlg;
65 PETSC_EXTERN const char *const PlexNormalAlgs[];
66 
67 typedef struct {
68   /* Inputs */
69   PetscInt            dimEx;       /* The dimension of the extruded mesh */
70   PetscInt            cdim;        /* The coordinate dimension of the input mesh */
71   PetscInt            cdimEx;      /* The coordinate dimension of the extruded mesh */
72   PetscInt            layers;      /* The number of extruded layers */
73   PetscReal           thickness;   /* The total thickness of the extruded layers */
74   PetscInt            Nth;         /* The number of specified thicknesses */
75   PetscReal          *thicknesses; /* The input layer thicknesses */
76   PetscBool           useTensor;   /* Flag to create tensor cells */
77   PlexNormalAlg       normalAlg;   /* Algorithm to use for computing normal */
78   PetscReal           normal[3];   /* Surface normal from input */
79   DM                  dmNormal;    // DM for normal field
80   Vec                 vecNormal;   // Normal at each vertex
81   PetscSimplePointFn *normalFunc;  /* A function returning the normal at a given point */
82   PetscBool           symmetric;   /* Extrude layers symmetrically about the surface */
83   PetscBool           periodic;    /* Connect the extruded layer periodically to the beginning */
84   /* Calculated quantities */
85   PetscReal       *layerPos; /* The position of each layer relative to the original surface, along the local normal direction */
86   PetscInt        *Nt;       /* The array of the number of target types */
87   DMPolytopeType **target;   /* The array of target types */
88   PetscInt       **size;     /* The array of the number of each target type */
89   PetscInt       **cone;     /* The array of cones for each target cell */
90   PetscInt       **ornt;     /* The array of orientation for each target cell */
91   // Borrowed storage
92   const PetscInt *degree; // The root degree of all points in the original mesh
93 } DMPlexTransform_Extrude;
94 
95 typedef struct {
96   PetscInt         debug;     // Debugging level
97   PetscBool        useTensor; // Flag to create tensor cells
98   PetscReal        width;     // The width of a cohesive cell
99   PetscInt        *Nt;        // The array of the number of target types
100   DMPolytopeType **target;    // The array of target types
101   PetscInt       **size;      // The array of the number of each target type
102   PetscInt       **cone;      // The array of cones for each target cell
103   PetscInt       **ornt;      // The array of orientation for each target cell
104 } DMPlexTransform_Cohesive;
105 
106 typedef struct {
107   PetscInt dummy;
108 } DMPlexRefine_Regular;
109 
110 typedef struct {
111   PetscInt dummy;
112 } DMPlexRefine_ToBox;
113 
114 typedef struct {
115   PetscInt dummy;
116 } DMPlexRefine_Alfeld;
117 
118 typedef struct {
119   DMLabel      splitPoints; /* List of edges to be bisected (1) and cells to be divided (2) */
120   PetscSection secEdgeLen;  /* Section for edge length field */
121   PetscReal   *edgeLen;     /* Storage for edge length field */
122 } DMPlexRefine_SBR;
123 
124 typedef struct {
125   PetscInt dummy;
126 } DMPlexRefine_1D;
127 
128 typedef struct {
129   PetscInt         n;      /* The number of divisions to produce, so n = 1 gives 2 new cells */
130   PetscReal        r;      /* The factor increase for cell height */
131   PetscScalar     *h;      /* The computed cell heights, based on r */
132   PetscInt        *Nt;     /* The array of the number of target types */
133   DMPolytopeType **target; /* The array of target types */
134   PetscInt       **size;   /* The array of the number of each target type */
135   PetscInt       **cone;   /* The array of cones for each target cell */
136   PetscInt       **ornt;   /* The array of orientation for each target cell */
137 } DMPlexRefine_BL;
138 
139 PetscErrorCode DMPlexTransformSetDimensions_Internal(DMPlexTransform, DM, DM);
140 PetscErrorCode DMPlexTransformMapCoordinatesBarycenter_Internal(DMPlexTransform, DMPolytopeType, DMPolytopeType, PetscInt, PetscInt, PetscInt, PetscInt, const PetscScalar[], PetscScalar[]);
141 PetscErrorCode DMPlexTransformGetSubcellOrientation_Regular(DMPlexTransform, DMPolytopeType, PetscInt, PetscInt, DMPolytopeType, PetscInt, PetscInt, PetscInt *, PetscInt *);
142 PetscErrorCode DMPlexTransformCellRefine_Regular(DMPlexTransform, DMPolytopeType, PetscInt, PetscInt *, PetscInt *, DMPolytopeType *[], PetscInt *[], PetscInt *[], PetscInt *[]);
143