1from mpi4py import MPI
2
3
4from dolfinx import mesh
5domain = mesh.create_unit_interval(MPI.COMM_WORLD,
6 nx = 10)
7
8from dolfinx import fem
9V = fem.functionspace(domain, ('P', 1))
10
11
12import numpy as np
13uD = fem.Function(V)
14
15def dirichlet_bc(x):
16 y = np.full(x.shape[1], 1.0)
17 y[np.isclose(x[0], 0.)] = 0.0
18 return y
19uD.interpolate(dirichlet_bc)
20
21tdim = domain.topology.dim
22fdim = tdim - 1
23domain.topology.create_connectivity(fdim, tdim)
24boundary_facets = mesh.exterior_facet_indices(domain.topology)
25boundary_dofs = fem.locate_dofs_topological(V, fdim,
26 boundary_facets)
27bc = fem.dirichletbc(uD, boundary_dofs)
28
29
30import ufl
31from dolfinx import default_scalar_type
32from dolfinx.fem.petsc import NonlinearProblem
33from dolfinx.nls.petsc import NewtonSolver
34
35
36uh = fem.Function(V)
37v = ufl.TestFunction(V)
38
39
40mu = fem.Constant(domain, default_scalar_type(5))
41
42F = ufl.dot(ufl.grad(uh), ufl.grad(v)) * ufl.dx + (mu * ufl.sinh(mu * uh)) * v * ufl.dx
43
44petsc_options = {
45 "snes_type": "newtonls",
46 "snes_linesearch_type": "none",
47 "snes_atol": 1e-6,
48 "snes_rtol": 1e-6,
49 "snes_monitor": None,
50 "ksp_error_if_not_converged": True,
51 "ksp_type": "gmres",
52 "ksp_rtol": 1e-8,
53 "ksp_monitor": None,
54}
55
56problem = NonlinearProblem(
57 F,
58 uh,
59 bcs=[bc],
60 petsc_options=petsc_options,
61 petsc_options_prefix="nonlinpoisson",
62)
63
64problem.solve()
65converged = problem.solver.getConvergedReason()
66num_iter = problem.solver.getIterationNumber()
67assert converged > 0, f"Solver did not converge, got {converged}."
68print(
69 f"Solver converged after {num_iter} iterations with converged reason {converged}."
70)