Merge lp:~morandini/dolfin/resetjacobian into lp:~fenics-core/dolfin/trunk

Proposed by Marco Morandini
Status: Merged
Merge reported by: Garth Wells
Merged at revision: not available
Proposed branch: lp:~morandini/dolfin/resetjacobian
Merge into: lp:~fenics-core/dolfin/trunk
Diff against target: 52 lines (+18/-7)
2 files modified
dolfin/fem/NonlinearVariationalSolver.cpp (+12/-7)
dolfin/fem/NonlinearVariationalSolver.h (+6/-0)
To merge this branch: bzr merge lp:~morandini/dolfin/resetjacobian
Reviewer Review Type Date Requested Status
Garth Wells Pending
Review via email: mp+96777@code.launchpad.net

Description of the change

fix NonlinearVariationalSolver reset_jacobian parameter handling

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'dolfin/fem/NonlinearVariationalSolver.cpp'
2--- dolfin/fem/NonlinearVariationalSolver.cpp 2012-03-09 14:43:29 +0000
3+++ dolfin/fem/NonlinearVariationalSolver.cpp 2012-03-09 15:18:41 +0000
4@@ -63,19 +63,24 @@
5 dolfin_assert(problem);
6 boost::shared_ptr<Function> u(problem->solution());
7
8+ const bool reset_jacobian = parameters["reset_jacobian"];
9 // Create nonlinear problem
10- NonlinearDiscreteProblem nonlinear_problem(problem,
11- reference_to_no_delete_pointer(*this));
12-
13+ if ((!nonlinear_problem.get()) || reset_jacobian) {
14+ nonlinear_problem = boost::shared_ptr<NonlinearDiscreteProblem>(new NonlinearDiscreteProblem(problem,
15+ reference_to_no_delete_pointer(*this)));
16+ }
17 // Create Newton solver and set parameters
18- NewtonSolver newton_solver(parameters["linear_solver"],
19- parameters["preconditioner"]);
20- newton_solver.parameters.update(parameters("newton_solver"));
21+ if ((!newton_solver.get()) || reset_jacobian) {
22+ // Create Newton solver and set parameters
23+ newton_solver = boost::shared_ptr<NewtonSolver>(new NewtonSolver(parameters["linear_solver"],
24+ parameters["preconditioner"]));
25+ }
26+ newton_solver->parameters.update(parameters("newton_solver"));
27
28 // Solve nonlinear problem using Newton's method
29 dolfin_assert(u->vector());
30 const std::pair<uint, bool> ret
31- = newton_solver.solve(nonlinear_problem, *u->vector());
32+ = newton_solver->solve(*nonlinear_problem, *u->vector());
33
34 end();
35
36
37=== modified file 'dolfin/fem/NonlinearVariationalSolver.h'
38--- dolfin/fem/NonlinearVariationalSolver.h 2011-10-20 13:50:55 +0000
39+++ dolfin/fem/NonlinearVariationalSolver.h 2012-03-09 15:18:41 +0000
40@@ -106,6 +106,12 @@
41 // The nonlinear problem
42 boost::shared_ptr<NonlinearVariationalProblem> problem;
43
44+ // The nonlinear discrete problem
45+ boost::shared_ptr<NonlinearDiscreteProblem> nonlinear_problem;
46+
47+ // The Newton solver
48+ boost::shared_ptr<NewtonSolver> newton_solver;
49+
50 };
51
52 }

Subscribers

People subscribed via source and target branches