Writing code for scientific applications is hard; writing parallel code is even harder. The programmer can choose from several different languages and programming models depending on personal style and preference. Most of the hard parts of parallel programming, however, are independent of the language used or the programming model adopted. To a large extent, the constraints imposed by the physical problem and the numerical techniques used to solve the problem dictate the choices made for a parallel implementation.