Kratos Structure: Kernel and applications
Kratos Multitphysics is designed as a framework for the development of multi-disciplinary finite element programs. We intend to provide a flexible and extensible code base, that can be used to implement formulations in different fields of physiscs, as well as algorithms that involve the solution of multi-physics problems. To achieve the flexibility required for this goal, Kratos is not designed as a monolithic code but as a library where users can find and combine the different tools required to solve a particular problem.
Kratos is implemented in C++ and follows an object-oriented design that will be described in detail in the following pages. It is exposed to Python through the Boost library.
Kernel and Applications
The components of Kratos Multiphysics can be broadly grouped in two categories, the Kernel and the Applications, which can be broadly seen as the numerical core and the physics, respectively. An application provides an implementation of a collection of algorithms used in the simulation of problems in a certain field, such as fluid dynamics or solid mechanics. The applications can be self-contained or intended to work with other applciations but, in general, can be seen as a toolset for the solution of a particualr physics problem. In contrast, the Kernel provides the basic infrastructure and general numeric tools, that is, the core over which the different applications are built. In providing a common infrastructure for all applications, the Kernel also allows the communication between the different applications.
The main advantage of the Kernel and Applications model is that it provides a clear separation between the numerical base of the code and the parts that are focused to the simulation of a particular class of problems, preventing conflics in the development of different applications. This allows Kratos developers to concentrate on extending a part of the code without fear of introducign errors in other areas, with the added advantage that it reduces compilation time. In addition, it adds a great deal of modularity to the code, and allows us to provide "closed package" solutions focused to a given type of models.