# DMPlexExtrude
Extrude a volumetric mesh from the input surface mesh 
## Synopsis
```
#include "petscdmplex.h"   
PetscErrorCode DMPlexExtrude(DM dm, PetscInt layers, PetscReal thickness, PetscBool tensor, PetscBool symmetric, const PetscReal normal[], const PetscReal thicknesses[], DM *edm)
```

## Input Parameters

- ***dm          -*** The surface mesh
- ***layers      -*** The number of extruded layers
- ***thickness   -*** The total thickness of the extruded layers, or PETSC_DETERMINE
- ***tensor      -*** Flag to create tensor produt cells
- ***symmetric   -*** Flag to extrude symmetrically about the surface
- ***normal      -*** Surface normal vector, or NULL
- ***thicknesses -*** Thickness of each layer, or NULL



## Output Parameter

- ***edm -*** The volumetric mesh



## Notes
Extrusion is implemented as a DMPlexTransform, so that new mesh points are produced from old mesh points. In the exmaple below,
we begin with an edge (v0, v3). It is extruded for two layers. The original vertex v0 produces two edges, e1 and e2, and three vertices,
v0, v2, and v2. Similarly, vertex v3 produces e3, e4, v3, v4, and v5. The original edge produces itself, e5 and e6, as well as face1 and
face2. The new mesh points are given the same labels as the original points which produced them. Thus, if v0 had a label value 1, then so
would v1, v2, e1 and e2.

```none
v2----- e6    -----v5
```
```none
|                  |
```
```none
e2     face2       e4
```
```none
|                  |
```
```none
v1----- e5    -----v4
```
```none
|                  |
```
```none
e1     face1       e3
```
```none
|                  |
```
```none
v0--- original ----v3
```


## Options Database

- ***-dm_plex_transform_extrude_thickness <t>           -*** The total thickness of extruded layers
- ***-dm_plex_transform_extrude_use_tensor <bool>       -*** Use tensor cells when extruding
- ***-dm_plex_transform_extrude_symmetric <bool>        -*** Extrude layers symmetrically about the surface
- ***-dm_plex_transform_extrude_normal <n0,...,nd>      -*** Specify the extrusion direction
- ***-dm_plex_transform_extrude_thicknesses <t0,...,tl> -*** Specify thickness of each layer





## See Also
 `DMExtrude()`, `DMPlexTransform`, `DMPlexTransformExtrudeSetThickness()`, `DMPlexTransformExtrudeSetTensor()`

## Level
intermediate

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/dm/impls/plex/plexextrude.c.html#DMPlexExtrude">src/dm/impls/plex/plexextrude.c</A>


---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/dm/impls/plex/plexextrude.c)


[Index of all DMPlex routines](index.md)  
[Table of Contents for all manual pages](/docs/manualpages/index.md)  
[Index of all manual pages](/docs/manualpages/singleindex.md)  
