|
184 | 184 | { |
185 | 185 | "cell_type": "code", |
186 | 186 | "execution_count": null, |
187 | | - "id": "14", |
| 187 | + "id": "0d5ce361", |
188 | 188 | "metadata": {}, |
189 | 189 | "outputs": [], |
190 | 190 | "source": [ |
191 | 191 | "solver = PETSc.KSP().create(mesh.comm)\n", |
| 192 | + "solver.setType(\"preonly\")\n", |
| 193 | + "solver.getPC().setType(\"lu\")\n", |
| 194 | + "solver.getPC().setFactorSolverType(\"mumps\")\n", |
| 195 | + "solver.setErrorIfNotConverged(True)" |
| 196 | + ] |
| 197 | + }, |
| 198 | + { |
| 199 | + "cell_type": "code", |
| 200 | + "execution_count": null, |
| 201 | + "id": "14", |
| 202 | + "metadata": {}, |
| 203 | + "outputs": [], |
| 204 | + "source": [ |
192 | 205 | "solver.setOperators(A)\n", |
193 | 206 | "du = dolfinx.fem.Function(V)" |
194 | 207 | ] |
|
257 | 270 | "\n", |
258 | 271 | " # Compute norm of update\n", |
259 | 272 | " correction_norm = du.x.petsc_vec.norm(0)\n", |
260 | | - " print(f\"Iteration {i}: Correction norm {correction_norm}\")\n", |
| 273 | + " PETSc.Sys.Print(f\"Iteration {i}: Correction norm {correction_norm}\")\n", |
261 | 274 | " if correction_norm < 1e-10:\n", |
262 | 275 | " break\n", |
263 | 276 | " solutions[i, :] = uh.x.array[sort_order]" |
|
279 | 292 | "outputs": [], |
280 | 293 | "source": [ |
281 | 294 | "dolfinx.fem.petsc.assemble_vector(L, residual)\n", |
282 | | - "print(f\"Final residual {L.norm(0)}\")\n", |
| 295 | + "PETSc.Sys.Print(f\"Final residual {L.norm(0)}\")\n", |
283 | 296 | "A.destroy()\n", |
284 | 297 | "L.destroy()\n", |
285 | 298 | "solver.destroy()" |
|
314 | 327 | " u_ex = root(x)\n", |
315 | 328 | " L2_error = dolfinx.fem.form(ufl.inner(uh - u_ex, uh - u_ex) * ufl.dx)\n", |
316 | 329 | " global_L2 = mesh.comm.allreduce(dolfinx.fem.assemble_scalar(L2_error), op=MPI.SUM)\n", |
317 | | - " print(f\"L2-error (root {j}) {np.sqrt(global_L2)}\")\n", |
| 330 | + " PETSc.Sys.Print(f\"L2-error (root {j}) {np.sqrt(global_L2)}\")\n", |
318 | 331 | "\n", |
319 | 332 | " kwargs = {} if j == 0 else {\"label\": \"u_exact\"}\n", |
320 | 333 | " plt.plot(x_spacing, root(x_spacing.reshape(1, -1)), *args, **kwargs)\n", |
|
410 | 423 | "A = dolfinx.fem.petsc.create_matrix(jacobian)\n", |
411 | 424 | "L = dolfinx.fem.petsc.create_vector(dolfinx.fem.extract_function_spaces(residual))\n", |
412 | 425 | "solver = PETSc.KSP().create(mesh.comm)\n", |
413 | | - "solver.setOperators(A)" |
| 426 | + "solver.setOperators(A)\n", |
| 427 | + "solver.setType(\"preonly\")\n", |
| 428 | + "solver.getPC().setType(\"lu\")\n", |
| 429 | + "solver.getPC().setFactorSolverType(\"mumps\")\n", |
| 430 | + "solver.setErrorIfNotConverged(True)" |
414 | 431 | ] |
415 | 432 | }, |
416 | 433 | { |
|
461 | 478 | " dolfinx.fem.petsc.assemble_matrix(A, jacobian, bcs=[bc])\n", |
462 | 479 | " A.assemble()\n", |
463 | 480 | " dolfinx.fem.petsc.assemble_vector(L, residual)\n", |
| 481 | + "\n", |
| 482 | + " # Compute b - alpha * J(u_D-u_(i-1))\n", |
| 483 | + " dolfinx.fem.petsc.apply_lifting(\n", |
| 484 | + " L, [jacobian], [[bc]], x0=[uh.x.petsc_vec], alpha=-1.0\n", |
| 485 | + " )\n", |
464 | 486 | " L.ghostUpdate(addv=PETSc.InsertMode.ADD, mode=PETSc.ScatterMode.REVERSE)\n", |
465 | | - " L.scale(-1)\n", |
466 | 487 | "\n", |
467 | | - " # Compute b - J(u_D-u_(i-1))\n", |
468 | | - " dolfinx.fem.petsc.apply_lifting(L, [jacobian], [[bc]], x0=[uh.x.petsc_vec], alpha=1)\n", |
469 | | - " # Set du|_bc = u_{i-1}-u_D\n", |
470 | | - " dolfinx.fem.petsc.set_bc(L, [bc], uh.x.petsc_vec, 1.0)\n", |
| 488 | + " # Set du|_bc = - (u_{i-1}-u_D)\n", |
| 489 | + " dolfinx.fem.petsc.set_bc(L, [bc], uh.x.petsc_vec, -1.0)\n", |
471 | 490 | " L.ghostUpdate(addv=PETSc.InsertMode.INSERT_VALUES, mode=PETSc.ScatterMode.FORWARD)\n", |
472 | 491 | "\n", |
| 492 | + " # Compute negative residual\n", |
| 493 | + " L.scale(-1)\n", |
| 494 | + "\n", |
473 | 495 | " # Solve linear problem\n", |
474 | 496 | " solver.solve(L, du.x.petsc_vec)\n", |
475 | 497 | " du.x.scatter_forward()\n", |
|
486 | 508 | " np.sqrt(mesh.comm.allreduce(dolfinx.fem.assemble_scalar(error), op=MPI.SUM))\n", |
487 | 509 | " )\n", |
488 | 510 | " du_norm.append(correction_norm)\n", |
489 | | - "\n", |
490 | | - " print(f\"Iteration {i}: Correction norm {correction_norm}, L2 error: {L2_error[-1]}\")\n", |
| 511 | + " PETSc.Sys.Print(\n", |
| 512 | + " f\"Iteration {i}: Correction norm {correction_norm}, L2 error: {L2_error[-1]}\",\n", |
| 513 | + " flush=True,\n", |
| 514 | + " )\n", |
491 | 515 | " if correction_norm < 1e-10:\n", |
492 | 516 | " break" |
493 | 517 | ] |
|
542 | 566 | "outputs": [], |
543 | 567 | "source": [ |
544 | 568 | "error_max = domain.comm.allreduce(np.max(np.abs(uh.x.array - u_D.x.array)), op=MPI.MAX)\n", |
545 | | - "if domain.comm.rank == 0:\n", |
546 | | - " print(f\"Error_max: {error_max:.2e}\")" |
| 569 | + "PETSc.Sys.Print(f\"Error_max: {error_max:.2e}\")" |
547 | 570 | ] |
548 | 571 | }, |
549 | 572 | { |
|
0 commit comments