//----------------------------------------------------------------------------- void dolfin::solve(const Equation& equation, Function& u, std::vector<const BoundaryCondition*> bcs, const Form& J, Parameters parameters) { // Check that the problem is linear if (equation.is_linear()) dolfin_error("solve.cpp", "solve nonlinear variational problem", "Variational problem is linear"); // Solve nonlinear problem NonlinearVariationalProblem problem(*equation.lhs(), u, bcs, J); NonlinearVariationalSolver solver(problem); solver.parameters.update(parameters); solver.solve(); }
//----------------------------------------------------------------------------- void dolfin::solve(const Equation& equation, Function& u, std::vector<const DirichletBC*> bcs, const double tol, GoalFunctional& M) { // Solve linear problem if (equation.is_linear()) { LinearVariationalProblem problem(*equation.lhs(), *equation.rhs(), u, bcs); AdaptiveLinearVariationalSolver solver(problem, M); solver.solve(tol); } else { // Raise error if the problem is nonlinear (for now) dolfin_error("solve.cpp", "solve nonlinear variational problem adaptively", "Nonlinear adaptive solve not implemented without Jacobian"); } }
//----------------------------------------------------------------------------- void dolfin::solve(const Equation& equation, Function& u, std::vector<const DirichletBC*> bcs, const Form& J, const double tol, GoalFunctional& M) { // Raise error if problem is linear if (equation.is_linear()) dolfin_error("solve.cpp", "solve nonlinear variational problem adaptively", "Variational problem is linear"); // Define nonlinear problem NonlinearVariationalProblem problem(*equation.lhs(), u, bcs, J); // Solve nonlinear problem adaptively AdaptiveNonlinearVariationalSolver solver(problem, M); solver.solve(tol); }
//----------------------------------------------------------------------------- void dolfin::solve(const Equation& equation, Function& u, std::vector<const BoundaryCondition*> bcs, Parameters parameters) { // Solve linear problem if (equation.is_linear()) { LinearVariationalProblem problem(*equation.lhs(), *equation.rhs(), u, bcs); LinearVariationalSolver solver(problem); solver.parameters.update(parameters); solver.solve(); } // Solve nonlinear problem else { NonlinearVariationalProblem problem(*equation.lhs(), u, bcs); NonlinearVariationalSolver solver(problem); solver.parameters.update(parameters); solver.solve(); } }