We discuss an object-oriented, component-based architecture for a parallel reservoir simulator. The architecture successfully balances the need for extensibility, maintainability, and reuse with the need for efficient computation. Parallelism is hidden from the application developer via a set of abstractions and a unifying framework that supports static and dynamic load balancing on unstructured and structured grids. We explain how the simulator architecture supports black oil and compositional models within a general formulation, and how it achieves parallel scalability for all the major components: property calculation, Jacobian construction, linear solver, well model, input/output etc. Some initial results are discussed for a selection of models ranging from standard benchmarks to large complex field cases.

Motivation

Current generation reservoir simulators typically have a lifespan of at least 10 years. As a result, many of the simulators in widespread use have their roots in petroleum engineering, software engineering and computing technologies that were originally targeted at structured grids and scalar architectures. Advances in software and hardware technologies, parallel computing, advanced gridding and modern software engineering techniques have created new opportunities. At the same time, evolving workflows involving complex geological models, large full-field simulations, near well studies, production and facilities optimization, and stochastic modeling have placed new demands on reservoir simulation technology.

Although object-oriented design has been the main staple of software development for quite some time, its application to scientific programming has been hindered somewhat by the perceived inefficiency of run-time polymorphism. However, in recent years the emergence of compilers that are in full compliance with the C++ standard has made use of generic programming techniques commercially practical. Generic programming offers the benefits of encapsulation and code reuse without the overhead of virtual function calls1,2 . Object- oriented and generic programming techniques using C++ have been shown to be useful in the development of scientific and numerical applications3,4 .

Large-scale object-oriented frameworks for scientific computing have been developed in many contexts5 , and parallelism has been addressed for example in the POOMA project6 . Object-oriented architectures for flow simulations have been developed in other industries7  and these techniques have been applied to reservoir simulators by several practitioners within academia8,9,10,11,12  and also in industry13 .

You can access this article if you purchase or spend a download.