# TSROSW
ODE solver using Rosenbrock-W schemes These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly
nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part
of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`.




## Notes
This method currently only works with autonomous ODE and DAE.

Consider trying `TSARKIMEX` if the stiff part is strongly nonlinear.

Since this uses a single linear solve per time-step if you wish to lag the jacobian or preconditioner computation you must use also -snes_lag_jacobian_persists true or -snes_lag_jacobian_preconditioner true


## Developer Notes
Rosenbrock-W methods are typically specified for autonomous ODE

```none
udot = f(u)
```

by the stage equations

```none
k_i = h f(u_0 + sum_j alpha_ij k_j) + h J sum_j gamma_ij k_j
```

and step completion formula

```none
u_1 = u_0 + sum_j b_j k_j
```

with step size h and coefficients alpha_ij, gamma_ij, and b_i. Implementing the method in this form would require f(u)
and the Jacobian J to be available, in addition to the shifted matrix I - h gamma_ii J. Following Hairer and Wanner,
we define new variables for the stage equations

```none
y_i = gamma_ij k_j
```

The k_j can be recovered because Gamma is invertible. Let C be the lower triangular part of Gamma^{-1} and define

```none
A = Alpha Gamma^{-1}, bt^T = b^T Gamma^{-1}
```

to rewrite the method as

```none
[M/(h gamma_ii) - J] y_i = f(u_0 + sum_j a_ij y_j) + M sum_j (c_ij/h) y_j
```
```none
u_1 = u_0 + sum_j bt_j y_j
```

where we have introduced the mass matrix M. Continue by defining

```none
ydot_i = 1/(h gamma_ii) y_i - sum_j (c_ij/h) y_j
```

or, more compactly in tensor notation

```none
Ydot = 1/h (Gamma^{-1} \otimes I) Y .
```

Note that Gamma^{-1} is lower triangular. With this definition of Ydot in terms of known quantities and the current
stage y_i, the stage equations reduce to performing one Newton step (typically with a lagged Jacobian) on the
equation

```none
g(u_0 + sum_j a_ij y_j + y_i, ydot_i) = 0
```

with initial guess y_i = 0.


## See Also
 [](chapter_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSRosWSetType()`, `TSRosWRegister()`, `TSROSWTHETA1`, `TSROSWTHETA2`, `TSROSW2M`, `TSROSW2P`, `TSROSWRA3PW`, `TSROSWRA34PW2`, `TSROSWRODAS3`,
`TSROSWSANDU3`, `TSROSWASSP3P3S1C`, `TSROSWLASSP3P4S2C`, `TSROSWLLSSP3P4S2C`, `TSROSWGRK4T`, `TSROSWSHAMP4`, `TSROSWVELDD4`, `TSROSW4L`, `TSType`

## Level
beginner

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/impls/rosw/rosw.c.html#TSROSW">src/ts/impls/rosw/rosw.c</A>

## Examples
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex36.c.html">src/ts/tutorials/ex36.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex36A.c.html">src/ts/tutorials/ex36A.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex36SE.c.html">src/ts/tutorials/ex36SE.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex40.c.html">src/ts/tutorials/ex40.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex41.c.html">src/ts/tutorials/ex41.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex51.c.html">src/ts/tutorials/ex51.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ts/tutorials/ex8.c.html">src/ts/tutorials/ex8.c.html</A><BR>


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


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