def weak_residual(self, x, x_test, m, e):
        """
        The weak residual
        """
        u, p, gamma = dl.split(x)
        u_test, p_test, g_test = dl.split(x_test)

        hbinv = hinv_u(self.metric, self.tg)

        res_u =  dl.Constant(2.)*(self.nu+self.nu_t(x, m))*dl.inner( self.strain(u), self.strain(u_test))*dl.dx \
               + dl.inner(dl.grad(u)*u, u_test)*dl.dx \
               - p*dl.div(u_test)*dl.dx \
               + self.Cd*(self.nu+self.nu_t(x, m))*hbinv*dl.dot(u - self.u_ff, self.tg)*dl.dot(u_test, self.tg)*self.ds_ff \
               - dl.dot( self.sigma_n(self.nu+self.nu_t(x, m), u), self.tg) * dl.dot(u_test, self.tg)*self.ds_ff \
               - dl.dot( self.sigma_n(self.nu+self.nu_t(x, m), u_test), self.tg ) * dl.dot(u - self.u_ff, self.tg)*self.ds_ff

        res_p = dl.div(u) * p_test * dl.dx

        D = self.nu_g(x, m, e)
        h_o_u = h_over_u(self.metric, u, D)
        res_g = dl.inner( D*dl.grad(gamma), dl.grad(g_test) )*dl.dx \
           + h_o_u*dl.dot(u, dl.grad(gamma))*dl.dot(u, dl.grad(g_test))*dl.dx \
           + dl.dot(u, dl.grad(gamma))*g_test*dl.dx \
           - dl.Constant(.5)*gamma*g_test*(dl.dot(u, self.e1)/(self.xfun + self._offset(m)))*dl.dx

        return res_u + res_p + res_g
    def tau(self, nu, u, metric):
        """
        Stabilization parameter
        """
        h2 = h_u2(self.metric, u, self.reg_norm * self.nu * self.nu)
        Pe = dl.Constant(.5) * h_dot_u(metric, u,
                                       self.reg_norm * self.nu * self.nu) / nu

        num = dl.Constant(1.) + dl.exp(dl.Constant(-2.) * Pe)
        den = dl.Constant(1.) - dl.exp(dl.Constant(-2.) * Pe)

        # [0.1 0.01]* [a1] = [ coth(.1) - 1./(.1) ]
        # [1.  0.2 ]  [a2]   [ -csch(.1)^2 + 1./(.1)^2]

        a1 = dl.Constant(0.333554921691650)
        a2 = dl.Constant(-0.004435991517475)

        tau_1 = (num / den - dl.Constant(1.) / Pe) * h_over_u(
            metric, u, self.reg_norm * self.nu * self.nu)
        tau_2 = (a1 + a2 * Pe) * dl.Constant(.5) * h2 / nu

        return dl.conditional(dl.ge(Pe, .1), tau_1, tau_2)