Modern scientific and engineering computations are based on a numerical study of applied mathematical models. Mathematical models involve linear or nonlinear equations as well as systems of ordinary differential equations (ODEs). But in the majority of cases, mathematical models consist of systems of partial differential equations (PDEs), which may be time-dependent as well as nonlinear and, moreover, they may be strongly coupled with each other. In addition, these equations are supplemented with the appropriate boundary and initial conditions. To obtain high-fidelity numerical results of practical interest, it is necessary to find solutions of boundary value problems in complicated computational domains.
The existing literature that discusses problems of scientific and engineering computations, in fact, does not reflect the up-to-date realities. Practically, we have books on numerical methods somehow adapted to the needs of the reader. They focus on scientific and engineering computations from the viewpoint of specialists in numerical methods and computational mathematics. This approach includes developing a numerical method, programming a code, performing computations, and processing numerical results; all of these steps are carried out by the readers themselves. This methodology is appropriate for solving rather simple problems and suggests the sufficient universality of the reader, which is quite rare.
Applied software must reflect the state-of-the-art in numerical methods, programming techniques, and the efficient use of computing systems. This can be achieved with a component-based software development. In this approach, after a modular analysis, a mathematical model is divided into basic computational subproblems, and then an algorithmic interface is organized between them. The solution of the subproblems is implemented using standard computational components of scientific and engineering software. Software packages and modules for pre- and post-processing of problem data may also be treated as components of the developed applied software. The above-mentioned problem-oriented computational components are oriented towards solving typical problems of computational mathematics, and they are developed by experts in numerical methods and programming techniques. The last condition ensures the quality of the developed product when we employ modern computing systems.
Applied software is developed using certain standards and agreements. It concerns, in particular, a programming language. For a long time the software for scientific and engineering computations was implemented in the programming language Fortran. The main advantage of Fortran is a large number of programs and libraries written in it, which are often freely available with a source code and documentation. Nowadays, the situation is changing in favour of other programming languages, especially in favour of C and C++. At present, new mathematical libraries and particular components are usually written in C/C++. Moreover, many well-proven applied software projects developed early in Fortran were rewritten in C/C++.
In research projects, we traditionally focus on using free and open source software (FOSS). It is especially suitable for educational process. From our point of view, the natural business model should be based on payment to an educational institution for training potential users of proprietary software, but in reality, it seems to be quite the contrary. The second requirement, in our mind, is portability, i.e. software should work on various hardware platforms and/or operating systems. In more exact terms, programming languages, available libraries, and applied software should be cross-platform.
Another important issue is related to multiprocessor computers. Applied software for multiprocessor computing systems with shared memory (multicore computers) is developed using OpenMP. For systems with distributed memory (clusters), the standard programming technique is MPI. Applied problems that are governed by PDEs can be solved on parallel computers using the library PETSc.
These key thoughts have determined the structure of this book and its general direction of designing modern applied software. We describe the basic elements of present computational technologies that use the algorithmic languages C/C++. The emphasis is on GNU compilers and libraries as well as FOSS for the solution of computational mathematics problems and visualization of the obtained data. This set of development tools in other circumstances might be slightly different, but this does not change the general orientation.
All the questions of the numerical solution of applied problems on parallel computing systems are discussed in the second volume.
The book was prepared by a team of researchers from the Center of Computational Technologies, M. K. Ammosov North-Eastern Federal University, Yakutsk, Russia, and scientists from the Nuclear Safety Institute, Russian Academy of Sciences, Moscow, Russia. We hope that this book will be useful for students and specialists who solve their engineering and scientific problems using numerical methods. We would be grateful for any any constructive comments on the book.
Petr N. Vabishchevich
Moscow and Yakutsk, March 2014.