# Overview of auto_diff module

The `auto_diff`

module provides Fortran derived types that support automatic
differentiation via operator overloading. Users will not generally
need to interact with this module, but it can be used within
run_star_extras to make derivatives easier to calculate (e.g. in the
implicit hooks like `other_surface`

).

Usage is by writing `use auto_diff`

at the top of a module or routine.
This imports types such as `auto_diff_real_4var_order1`

, which supports first-order derivatives
with respect to up to four independent variables.
A variable of this type could be declared via:

```
type(auto_diff_real_4var_order1) :: x
```

This variable then holds five fields: `x%val`

stores the value of `x`

.
`x%d1val1`

stores the derivative of x with respect to the first independent
variable. `x%d1val2`

is the same for the second independent variable, and so on.
All `d1val_`

fields are initialized to zero when the variable is first set.
Once an auto_diff variable is initialized, all mathematical operations can be performed
as they would be on a `real(dp)`

variable. auto_diff variables also interoperate with
`real(dp)`

and `integer`

types.
So for instance in the following `f%d1val1`

stores df/dx and `f%d1val2`

stores df/dy.:

```
x = 3d0
x%d1val1 = 1d0
y = 2d0
y%d1val2 = 1d0
f = exp(x) * y + x + 4
```

Similar types are included supporting higher-order and mixed-partial
derivatives. These derivatives are accessed via e.g. `d2val1`

(\(\partial^2 f/\partial x^2\)), `d1val1_d2val2`

(\(\partial^3 f/\partial x \partial y^2\)).

An additional special type `auto_diff_real_star_order1`

provides support
for first-order derivatives accessed using arrays.
This type contains a value (`x%val`

) and an array of first partial derivatives
with respect to at least as many variables as the solver in `MESA/star`

.
This type is meant to make it easy to write equations and then, after the fact,
change the basis of independent variables or re-index them.
The current indices are defined in `star_data/public/star_data_def.inc`

.
E.g., if `my_var`

is of type `auto_diff_real_star_order1`

,
then `my_var% d1Array(i_lnT_00)`

contains the derivative of `my_var`

with respect to `lnT`

at the same mesh point.