9. Summary and conclusions
The aim of the CPPPO library is to provide a set of routines for efficient parallel data filtering and processing. These operations are meant to be performed ‘‘on the fly’’ during expensive numerical simulations running on large distributed memory clusters. In order to perform data filtering from parallel simulations on clusters, a novel approach to filtering named ‘‘divergent’’ was adopted. The divergent approach showed a linear increase of parallel efficiency with the number of cores, and a major reduction of computational time with respect to the standard convergent approach was demonstrated. Overall, the parallel scalability analysis of CPPPO showed promising results, demonstrating the computational efficiency of our library. Furthermore, the CPU time required by CPPPO was shown to be a small fraction (i.e., less than 2%) of the time required by a typical simulation in the field of dense fluid–particle systems. As recently shown in literature [17], more insight into the governing flow physics of dense particle beds can be gained from the analysis of individual-particle DNS data. We have demonstrated that the filter size should be considered when evaluating such individual-particle data, e.g., (average) fluid quantities experienced by the particles. In addition, the ability to perform variance calculations in CPPPO allows one to extract additional markers that can be helpful to correlate DNS data, and hence establish new closure models. What remains to be done is to develop relevant transport equations for predicting these markers in coarse-grained simulations. Then, we expect that a new generation of closure models, established with the help of tools like CPPPO, will help to refine our predictions for relevant fluid–particle systems in engineering simulations. CPPPO allows a high flexibility in the filtering operations due to the easy customization of the filtering kernel. This can be achieved either by (i) including an arbitrary number of weights (which can be defined at runtime), or (ii) by implementing the desired kernel function (which requires some coding in C++, and recompilation of CPPPO).