I believe your boundary conditions are applied wrongly in non-linear problem.
You can start by verifying this claim by using:
solve(L == 0, w, bcs)
which is inefficient, but shows that the problem should converge.
Why don’t you just use NonlinearVariationalProblem
instead of creating your own assembler?
See for instance:
Switching from Fenics to FenicsX for Incompressible Mixed Element Code for an example