While running a complex parallel program on a high-performance computing system, one often experiences several major difficulties in observing output. Usually, the simulation severely limits the interaction with the program during the execution and makes the visualization and monitoring slow and cumbersome (if at all possible), especially if it needs to be carried out on a different system (say a specialized graphics workstation for visualization).

To tackle this problem, we need to be able to "Monitor" (i.e., observe the program behaviour at specified intervals of time during its execution) and "Steer" (i.e., modify the program behaviour during its execution). Software tools which support these activities are called (computational) steering environments. These environments typically operate in three phases: instrumentation, monitoring, and steering.  Instrumentation is the phase where the application code is modified to add monitoring functionality. Monitoring phase requires the program to run with some initial input data, the output of which is observed by retrieving important data about the program's state change. Analysis of this data gives more knowledge about the program's activity. During the steering phase, the user modifies the program's behavior (by modifying the input) based on the knowledge gained during the previous phase by applying steering commands, which are injected on-line, so that the application need not be stopped and restarted.

Our steering software, the Portable Object-oriented Scientific Steering Environment (POSSE), is very general in nature and is based on a simple client/server model. It consists of a steering server on the target machine that performs steering, and a steering client that provides the user interface and control facilities remotely. The steering server is created as a separate execution thread of the application to which local monitors forward only those "registered" data that are of interest to steering activities. The steering client receives the application run-time information from the application, displays the information to the user, accepts steering commands from the user, and enacts changes that affect the application's execution. Communication between the steering client and server are done via UNIX sockets. POSSE has been completely written in C++, using several of C++'s advanced object-oriented features, making it fast and powerful, while hiding most of the complexities from the user.

POSSE is designed to be extremely lightweight, portable (runs on all Win32 and Unix platforms) and efficient. It deals with byte-ordering and byte-alignment problems internally and also provides an easy way to handle user-defined classes and data structures. It is also multi-threaded, supporting several clients simultaneously. It can also be easily incorportated into parallel simulations based on the Message Passing Interface (MPI) library. The biggest enhancement of POSSE over existing steering systems is that it is equally powerful, yet extremely easy to use, making augmentation of any existing C/C++ simulation code possible in a matter of hours. It makes extensive use of C++ classes, templates and polymorphism to keep the user Application Programming Interface (API) elegant and simple to use. The programmer need not know anything about the internals of threads, sockets or networking in order to use POSSE effectively. POSSE also allows a simulation running on any parallel or serial computer to be monitored and steered remotely from any machine on the network using a cross-platform Graphical User Interface (GUI) utility.
