LIBPF is different from other process flowsheet simulation tools in scope, size, workflow, object orientation and modeling technology.
In practice 80% of processes can be modeled with sufficient accuracy using just 20% of the features of any general-purpose tool.
In other words, 80% of the value can be obtained with 20% of the effort. For this reason in the development of LIBPF easy-to-implement, high-return modeling features have been given higher priority, resulting in a simple design but sufficient for most practical applications.
The LIBPF Software Development Kit (SDK) aims at providing models with a small footprint, capable of running on a variety of hardware and software architectures, from the industrial PC to the client/server corporate environment and from Windows to OSX and Linux clients. The typical size of the compiled and statically linked calculation kernel is between 2 and 6 MB.
The way to use LIBPF as a modeling tool is based on the distinction of library developers, model developers and model users:
The library developers take care of maintaining and developing the Software Development Kit (SDK);
The model developers writes some additional C++ code and link it to the LIBPF SDK library, generating applications;
The applications are deployed to the model users who do not need any programming skills to use the models.
The model user receives the model as a black-box executable with no access to the underlying equations and assumptions; she can play around with model inputs and configuration options but no change in the structure is possible. This is an advantage in cases where the model contains process know-how which is not desirable to disclose to the model users.
In C++ there is more than just the character string, floating point and integer numbers types found in other languages: C++ is an object-oriented language and allows the programmer to define object types (classes).
Programming with LIBPF is simple for process engineers since all concepts used in process modeling have already been translated into C++ classes: values with units of measurement, components, phases, reactions, material streams, unit operations, multistage unit operations ans so on. Furthermore, even the flowsheets created by the model developer are new object types.
Defining flowsheets as objects allows one to separate structure and configuration (unique for a given flowsheet type) from the operating conditions, which can differ for each instance. This separation makes model reuse easier and encourages an orderly workflow.
LIBPF is based on an hybrid sequential/simultaneous solution, where not all variables are exposed as unknowns, obtaining a less-sparse, but smaller-sized non-linear system of equations when compared to fully open equation tools.
LIBPF can exploit modern multi-core CPUs (Central Processing Units) thanks to a unique flowsheet sequencing scheme that exploits the intrinsic parallelism or the problem.
LIBPF is designed around a quantity type which extends the familiar double precision C++ floating point type with run-time analytical derivative and unit of measurement checking: run-time analytical derivatives provide transparently reconfigurable handling of sparse systems, without with zero-effort handling of conditionals and discontinuous changes; unit of measurement checking traps dimensional errors increasing the guarantees on the quality of both user-written and library code.