Update:


In the residual form case I tried:


try:
solve(F(u,u0,u,u0,W,n,myparameters) == 0, u, bcs=[bc0, bc1, bc2, bc3],solver_parameters={'pc_type': 'lu', 'pc_factor_mat_solver_package': 'mumps'} ) # 
except RuntimeError:
        pass

that works in the sense that the exception is no longer a problem. However that slight inconsistency in results is still there. Is that to be expected because of the different solvers? If that is the case, how can one minimise that difference?


Thanks, 

Fryderyk


From: firedrake-bounces@imperial.ac.uk <firedrake-bounces@imperial.ac.uk> on behalf of Fryderyk Wilczynski <scfw@leeds.ac.uk>
Sent: 02 May 2016 09:44:16
To: firedrake@imperial.ac.uk
Subject: [firedrake] Inconsistency between bilinear and residual solve
 

Hello all,


I'm solving a system of pdes that are linear in (n+1) terms (in time disretised system).

When I write the equations in Firedrake as a bilinear form and solve using:

...

solve(a == L, out_u, bcs=[bc0, bc1, bc2, bc3], solver_parameters={'pc_type': 'lu', 'pc_factor_mat_solver_package': 'mumps'}) 


I get a stable (energy dissipative) scheme, everything seems to be working fine.


If I reformulate the equations so that I am solving the residual form:

...

solve(F == 0, u, bcs=[bc0, bc1, bc2, bc3],solver_parameters={'pc_type': 'lu', 'pc_factor_mat_solver_package': 'mumps'} )


all other things remainimg equal; the scheme breaks down after a number of timesteps, and throws an exception:

Traceback (most recent call last):
  File "NSCH_residual_form.py", line 149, in <module>
    solve(F(u,u0,u,u0,W,n,myparameters) == 0, u, bcs=[bc0, bc1, bc2, bc3],solver_parameters={'pc_type': 'lu', 'pc_factor_mat_solver_package': 'mumps'} ) # 
  File "/home/cserv1_a/apps/install/firedrake/2016-03-el7/firedrake/lib/python2.7/site-packages/firedrake/solving.py", line 120, in solve
    _solve_varproblem(*args, **kwargs)
  File "/home/cserv1_a/apps/install/firedrake/2016-03-el7/firedrake/lib/python2.7/site-packages/firedrake/solving.py", line 164, in _solve_varproblem
    solver.solve()
  File "<decorator-gen-295>", line 2, in solve
  File "/home/cserv1_a/apps/install/firedrake/2016-03-el7/firedrake/lib/python2.7/site-packages/pyop2/profiling.py", line 203, in wrapper
    return f(*args, **kwargs)
  File "/home/cserv1_a/apps/install/firedrake/2016-03-el7/firedrake/lib/python2.7/site-packages/firedrake/variational_solver.py", line 190, in solve
    solving_utils.check_snes_convergence(self.snes)
  File "/home/cserv1_a/apps/install/firedrake/2016-03-el7/firedrake/lib/python2.7/site-packages/firedrake/solving_utils.py", line 62, in check_snes_convergence
    %s""" % (snes.getIterationNumber(), msg))
RuntimeError: Nonlinear solve failed to converge after 17 nonlinear iterations.
Reason:
   DIVERGED_LINE_SEARCH

Additionally, the results between the two methods are inconsistent (particularly the min, max ranges).
What can I do to fix that?

The scripts and pdf containing weak forms can be found on bitbucket:

https://bitbucket.org/fryderyk216/navierstokes/src/9f0814f99fe23fa57ead87012a554210678a7f50/Inconsistency/?at=master


Best wishes,

Fryderyk