Solving PDEs in C++: Numerical Methods in a Unified Object-Oriented Approach

In this part, we use the present algorithms and their object-oriented implementation in several partial differential equations (PDEs) that arise often in practice. In particular, we consider complicated nonrectangular domains for which highly unstructured meshes are required.
The PDEs are discretized using linear finite elements in a hierarchy of adaptively refined meshes. The initial mesh is too coarse and approximates poorly both the interior and the boundary of the domain. Therefore, the initial mesh is refined successively in the interior of the domain and at its boundary, producing the required accuracy wherever needed. In this process, the number of nodes increases moderately, resulting in an efficient solution technique.
The stiffness system is solved in each particular refinement level to provide the information required for local refinement. For this purpose, the preconditioned conjugate gradient (PCG) method with the multigrid preconditioner is used. The resulting (coarse) numerical solution is then used adaptively to refine the mesh and advance to the next refinement level. The numerical solution at the final and finest mesh is accepted as the numerical solution of the original PDE.
The above algorithm is referred to as the adaptive-refinement algorithm with multigrid preconditioner. It works well for scalar diffusion problems with discontinuous and anisotropic coefficients, as illustrated in the first chapter in this part (Chapter 19). It needs some modification to work for systems of PDEs such...