Objexx Labs
Discoveries, ideas, and musings from the Objexx development labs
A launch-party look at the inspiration, design, and rapid development of ObjexxPlot, our new technical plotting application.
OpenSceneGraph provides the integrated real-time 3D visualization for ObjexxSISAME. OpenSceneGraph (OSG) packages are readily available for modern Linux platforms but Windows binaries for recent OSG and Visual C++ releases have been scarce. OpenSceneGraph is not simple to build due to the numerous 3rd party library dependencies and build options. Recently, we took the plunge and developed a recipe and scripts for building OSG. The Windows binaries available for download on the OpenSceneGraph page.
We take a look at some features we'd like to see in multidimensional C++ array libraries to benefit technical applications and match the expressiveness and performance of Fortran's arrays.
Getting high performance out of C++ applications can be essential, particularly for scientific and engineering code. Happily, we have a lot of tools and techniques that can be brought to bear on this task.
The C++ Standard Library provides the std::map container for collections of items that need to be looked up by a "key" identifier. This is much more flexible that an array container like std::vector that can only look items up by a contiguous set of integer indexes. While std::map and std::unordered_map have some admirable complexity guarantees they have much worse performance than an array. For fast technical applications we would love to have the semantics and syntax of std::map but the performance of an array. Happily, there are a number of situations where, with a little work, we can craft such a solution.
Python has built-in support for parallel processing via the multiprocessing, subprocess, and thread packages but does not provide any tools to help use system resources effectively to run a set of jobs in parallel. That requires the ability to measure the system resource loads and start queued jobs when sufficient resources become available. It is not hard to build such a package with the right tools and some basic observations.
Qt provides a rich GUI framework with excellent support for tables but when your need a feature that isn't directly supported things can get complicated quickly. One such feature for tables is a so-called "frozen" column or row that should remain fixed like the headers when scrolling. Qt table widget and view classes do not support frozen columns or rows and implementing them can be both tricky to get right and an efficiency problem.
PySide is a Python binding for Qt. PySide is similar to the PyQt system but provides LGPL licensing and a community development model that makes it more attractive for commercial projects than PyQt. We share some insights learned when we migrated some applications from PyQt to PySide.
ObjexxSISAME uses OpenSceneGraph (OSG) for real-time 3D visualization. We integrated an OSG viewer into the Qt-based ObjexxSISAME GUI. The Qt integration "cookbook" for OSG has changed with OSG 3.0 and is still being refined. Various examples are helpful but none give the whole picture. After some effort we have this running nicely and here are notes on the approach that we found best.
We are using YAML style input files for a number of applications because they are easy to read and edit outside of a GUI. We were dismayed to find that loading times were quite slow for files of modest size when using stock YAML parsers. Here's a quick look at the cause and how we solved it.
F2PY is a solid tool for interfacing a Python front end application with a Fortran compute engine but we had to tame it for real-world use.