# Using a free surface in a model with a crust *This section was contributed by William Durkin*. This cookbook is a modification of the previous example that explores changes in the way topography develops when a highly viscous crust is added. In this cookbook, we use a material model in which the material changes from low viscosity mantle to high viscosity crust at $z = z_j = \texttt{jump height}$, i.e., the piecewise viscosity function is defined as ```{math} \begin{aligned} \eta(z) = \left\{ \begin{matrix} \eta_U & \text{for}\ z > z_j, \\ \eta_L & \text{for}\ z \le z_j. \end{matrix} \right. \end{aligned} ``` where $\eta_U$ and $\eta_L$ are the viscosities of the upper and lower layers, respectively. This viscosity model can be implemented by creating a plugin that is a small modification of the `simpler` material model (from which it is otherwise simply copied). We call this material model "SimplerWithCrust." In particular, what is necessary is an evaluation function that looks like this: ``` c++ template void SimplerWithCrust:: evaluate(const typename Interface::MaterialModelInputs &in, typename Interface::MaterialModelOutputs &out ) const { for (unsigned int i=0; ijump_height) out.viscosities[i] = eta_U; else out.viscosities[i] = eta_L; out.densities[i] = reference_density * (1.0 - thermal_expansion_coefficient * (in.temperature[i] - reference_temperature)); out.thermal_expansion_coefficients[i] = thermal_expansion_coefficient; out.specific_heat[i] = reference_specific_heat; out.thermal_conductivities[i] = thermal_conductivity; out.compressibilities[i] = 0.0; out.entropy_derivative_pressure[i] = 0.0; out.entropy_derivative_temperature[i] = 0.0; for (unsigned int c=0; c Adding a viscous crust to a model with surface topography. The thermal anomaly spreads horizontally as it collides with the highly viscous crust (left, white solid line). The addition of a crustal layer both dampens and delays the appearance of the topographic maximum and minimum (right). ```