  Many interesting phenomena are characterized by the complex interaction of
different physical processes, each often best modeled numerically via a
specific approach. In this paper, we present the design and implementation of
an object-oriented framework for performing multiphysics simulations that
allows for the monolithic coupling of different numerical schemes. In contrast,
most of the currently available simulation tools are tailored towards a
specific numerical model, so that one must resort to coupling different codes
externally based on operator splitting. The current framework has been
developed following the C++11 standard, and its main aim is to provide an
environment that affords enough flexibility for developers to implement complex
models while at the same time giving end users a maximum amount of control over
finer details of the simulation without having to write additional code. The
main challenges towards realizing these objectives are discussed in the paper,
together with the manner in which they are addressed. Along with core objects
representing the framework skeleton, we present the various polymorphic classes
that may be utilized by developers to implement new formulations, material
models and solution algorithms. The code architecture is designed to allow
achievement of the aforementioned functionalities with a minimum level of
inheritance in order to improve the learning curve for programmers who are not
acquainted with the software. Key capabilities of the framework are
demonstrated via the solution of numerical examples dealing on composite
torsion, Biot poroelasticity (featuring a combined finite element-finite volume
formulation), and brittle crack propagation using a phase-field approach.
