We describe the general architecture along with a few implementation details. The image below provides an overview.
The code is divided into 4 layers, although in the current implementation the 2 top layers may overlap.
At the bottom is the Model Processing / Numerical Computation layer that defines methods to parse a model and extract all its components, build a computation engine that can be used by the numeric computation code. It is mostly written in C++ with some Fortran code, and includes code written specifically for this projects as well several external projects. This layer can be extracted from DEDiscover and perform all the model parsing and numeric computation. However it does not contain any method to generate plots, import data, save data and session.
The JNI layer is the glue between the Java Virtual Machine and the native code written in C++ and Fortran. It is made of two parts. The Java part defines an API to be used by the Java and Kotlin code above, and the C++ part communicates with the Model Processing layer. Most of the objects making up this layer mirror the domain objects from the Model Processing layer. Very little computation or processing is performed in the JNI.
Above the JNI is the Data Model layers which prepares the data to be utilized for computation in the layers below and to present the results to the layers above.
Finally the GUI layer at the top is responsible for communicating with a user. It uses the TornadoFX framework and most of the code is written in Kotlin.All the session information is stored in a SQLPlus database saved in the user directory. This database is created when DEDiscover is first launched and pre-populated with built-in models.