{%- if nonlinear_state_vars|length > 0 %}
    void {{class_name}}::ComputeJacobian(double {{free_variable.var_name}}, const double rCurrentGuess[{{nonlinear_state_vars|length}}], double rJacobian[{{nonlinear_state_vars|length}}][{{nonlinear_state_vars|length}}])
    {
        {{vector_decl}} rY = rGetStateVariables();
        {% for state_var in state_vars %}
        {%- if state_var.in_y_deriv and state_var.linear and state_var.in_jacobian %}double {{ state_var.var }} = {{state_var.rY_lookup}};
        // Units: {{state_var.units}}; Initial value: {{state_var.initial_value}}
        {% endif %}{%- endfor %}
        {% for state_var in nonlinear_state_vars %}
        {%- if state_var.in_jacobian %}double {{ state_var.var }} = rCurrentGuess[{{loop.index0}}];
        {% endif %}{%- endfor %}
        {% for equation in jacobian_equations %}const double {{equation.lhs}} = {{equation.rhs}};
        {% endfor %}
        {% for entry in jacobian_entries %}
        rJacobian[{{entry.i}}][{{entry.j}}] = {% if entry.i == entry.j and entry.entry != '0' %}1.0 - (mDt * ({{entry.entry}})){% endif -%}{% if entry.i == entry.j and entry.entry == '0' %}1.0{% endif -%}{% if entry.i != entry.j and entry.entry == '0' %}0.0{% endif -%}{% if entry.i != entry.j and entry.entry != '0' %}-(mDt * ({{entry.entry}})){% endif -%};
        {%- endfor %}
    }{% endif -%}