# Automatic recognize the bilinear form and the linear form

Can ngsolve automatically recognize the linear form & bilinear form from a given weak form Instead of compute them manually?

(I mean the following fenicsx codes can automatically recognize the linear form & bilinear form.

``````u, v = ufl.TrialFunction(V), ufl.TestFunction(V)
F = u * v * ufl.dx + dt * ufl.dot(ufl.grad(u), ufl.grad(v)) * ufl.dx - (u_n + dt * f) * v * ufl.dx
a = fem.form(ufl.lhs(F))
L = fem.form(ufl.rhs(F))
``````

Here are suggestions for ufl-like rhs/lhs functions:
all trial-functions are found with equ.GetProxies().
For the lhs, we take the directional derivatives with respect to proxies, into the direction of proxies. Since `grad(u).Diff(grad(u), grad(u))` returns `grad(u)`, as well as `grad(u).Diff(u,u)` returns the same, we take only the derivatives with proxies having a named derivative (a hack, for the moment).
For the rhs, we replace all trial-functions by zero.

``````from ngsolve import *
mesh = Mesh(unit_square.GenerateMesh(maxh=0.2))

fes = H1(mesh, order=1)
u,v = fes.TnT()

def lhs(equ):
return sum(equ.Diff(proxy,proxy) for proxy in equ.GetProxies(trial=True) if proxy.derivname!='')

def rhs(equ):
repl = dict((proxy, CF((0,)*proxy.dim).Reshape(proxy.shape)) for proxy in equ.GetProxies(trial=True))
return equ.Replace(repl)

dt = 0.1
u_n = GridFunction(fes)
f = x*y
F = u * v * dx + dt * InnerProduct(grad(u), grad(v)) * dx - (u_n + dt * f) * v * dx
a = lhs(F)
print ("lhs = ", a)
L = rhs(F)
print ("rhs =", L)`````````