# Generating Geometry Sensitivities
HyperVehicle also features the generation of
geometry sensitivities via method of finite differences.
This page outlines how to use this capability.
## Nomenclature
| Symbol | Description |
| ------ | ----------- |
| $\underline{\theta}$ | The set of design parameters defining a geometry |
| $\mathcal{G}$ | The geometry mesh |
## Description of Implementation
1. A HyperVehicle parameterised geometry {py:class}`.Generator` is
defined, along with the parameters to be varied.
2. Geometry meshes for the nominal geometry $\mathcal{G}_\text{nominal}$ are generated.
3. For each parameter $\theta_i$ to be varied:
- The perturbed parameter value is defined as $ \theta_i' = \theta_i + \delta\theta_i $.
- Geometry meshes for the parameter set including $\theta_i'$ are generated, yielding $\mathcal{G}_i'$.
- The sensitivity of each vertex of $\mathcal{G}$ to the parmater perturbation
$\theta_i'$ is calculated by comparing the perturbed geometry $\mathcal{G}_i'$ to
the nominal geometry $\mathcal{G}_\text{nominal}$. That
is, $\delta \mathcal{G}_i = \mathcal{G}_i' - \mathcal{G}_\text{nominal}$.
- Finally, the sensitivity is approximated via:
$$
\frac{\partial\mathcal{G}}{\partial\theta} \approx \frac{\delta \mathcal{G}}{\delta \theta}
$$
## Working with Mutliple-Component Geometries
### Merging components with PyMesh
If you have PyMesh installed, simply pass `merge=True` when calling {py:meth}`.Vehicle.to_stl`.
This will merge all components of your Vehicle into a single file.
### Cart3D intersected Components
Cart3D is a component based solver, meaning oftentimes, many individual components are
stacked to form the final geometry. This final geometry is a single body, made up of
many combined components. This body has a different mesh to the individual component
STL meshes.
When working with multiple components, we need to map the component sensitivities onto
the final combined mesh. The utility function `append_sensitivities_to_tri` contained
within the `hypervehicle.utilities` module provides this capability. See the code below,
which first finds the sensitivity files using `glob`, then runs `append_sensitivities_to_tri`.
The Cart3D file, `Components.i.tri` will be overwritten, with the sensitivity data
appended. A CSV file called `all_components_sensitivity.csv` will also be written,
containing the sensitivity information as point data. This file is compatible with
[PySAGAS](https://github.com/kieran-mackle/pysagas).
```python
import glob
from hypervehicle.utilities import append_sensitivities_to_tri
sens_files = glob.glob("*sensitivity*")
append_sensitivities_to_tri(sens_files)
```
You can view this data of the `Components.i.tri` file in ParaView, by first converting the
file into a Tecplot format using the Cart3D utility function `trix`:
```
trix Components.i.tri -T
```
## Example
Interested in seeing this theory in application? Check out the
[parameter sensitivities](../examples/sensitivity.md) tutorial.