{%- if nonlinear_state_vars|length > 0 %}
    void {{class_name}}::ComputeResidual(double {{free_variable.var_name}}, const double rCurrentGuess[{{nonlinear_state_vars|length}}], double rResidual[{{nonlinear_state_vars|length}}])
    {
        {{vector_decl}} rY = rGetStateVariables();
        {% for state_var in state_vars %}
        {%- if state_var.linear and state_var.in_residual_eqs %}double {{ state_var.var }} = {{state_var.rY_lookup}};
        // Units: {{state_var.units}}; Initial value: {{state_var.initial_value}}
        {% endif %}{%- endfor %}
        //output_nonlinear_state_assignments
        {% for state_var in nonlinear_state_vars %}
        {%- if state_var.in_residual_eqs %}double {{ state_var.var }} = rCurrentGuess[{{loop.index0}}];
        {% endif %}{%- endfor %}
        //output_equations
        {%- for deriv in y_derivative_equations %}{%- if not deriv.linear %}
        const double {{deriv.lhs}} = {{deriv.rhs}}; // {{deriv.units}}{%- endif %}
        {%- endfor %}
        {% for residual_var in residual_equations %}
        rResidual[{{ residual_var.residual_index }}] = rCurrentGuess[{{ residual_var.residual_index }}] - rY[{{ residual_var.state_var_index }}] - mDt*{{ residual_var.var }};
        {%- endfor %}
    }{% endif -%}