Kratos Multiphysics (A.K.A Kratos) is a framework for building parallel multi-disciplinary simulation software. Modularity, extensibility and HPC are the main objectives. Kratos has BSD license and is written in C++ with extensive Python interface.
There are six element classes that consider geometrically nonlinear behaviour by adopting the Updated Lagrange (UL) Formulation:
UPwUpdatedLagrangianElement
UPwUpdatedLagrangianAxisymmetricElement
UPwUpdatedLagrangianFICElement
UPwUpdatedLagrangianAxisymmetricFICElement
UpdatedLagrangianUPwDiffOrderElement
UpdatedLagrangianUPwDiffOrderAxisymmetricElement
Due to how the element classes are related through inheritance, certain parts of the code have been duplicated with only minor modifications. These duplications and differences are detailed below.
UPwUpdatedLagrangianElement
This class derives from class UPwSmallStrainElement and it overrides the following relevant member functions:
CalculateAll: differences with respect to the base class implementation include:
The base class implementation calls CalculatePermeabilityUpdateFactor (implemented by the base class itself), whereas the derived class doesn’t call this member at all. This might be a discrepancy that needs to be fixed. We need to investigate that first.
When the stiffness matrix is calculated, the UL element (i.e. this class) also considers a “geometric stiffness” contribution (by calling member CalculateAndAddGeometricStiffnessMatrix of class UPwSmallStrainElement), whereas the base class doesn’t.
CalculateOnIntegrationPoints(const Variable<double>&, …): provides a dedicated implementation when the given variable equals REFERENCE_DEFORMATION_GRADIENT_DETERMINANT. Possibly, this code is used for postprocessing purposes only.
CalculateOnIntegrationPoints(const Variable<Matrix>&, …): provides dedicated implementations when the given variable equals either REFERENCE_DEFORMATION_GRADIENT or GREEN_LAGRANGE_STRAIN_TENSOR. Again, possibly this code is used for postprocessing purposes only.
UPwUpdatedLagrangianAxisymmetricElement
This class derives from UPwUpdatedLagrangianElement (see the previous section). It appears this class only overrides member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).
UPwUpdatedLagrangianFICElement
This class derives from class UPwSmallStrainFICElement and it is not related to class UPwUpdatedLagrangianElement. It overrides the following relevant member functions:
CalculateAll: like for class UPwUpdatedLagrangianElement, when the stiffness matrix is calculated, the UL element (i.e. this class) also considers a “geometric stiffness” contribution (by calling member CalculateAndAddGeometricStiffnessMatrix of class UPwSmallStrainElement), whereas the base class doesn’t.
CalculateOnIntegrationPoints(const Variable<double>&, …): the implementation appeared to be identical to the one of class UPwUpdatedLagrangianElement.
CalculateOnIntegrationPoints(const Variable<Matrix>&, …): the implementation appeared to be identical to the one of class UPwUpdatedLagrangianElement.
UPwUpdatedLagrangianAxisymmetricFICElement
This class derives from class UPwUpdatedLagrangianFICElement (see the previous section). As for class UPwUpdatedLagrangianAxisymmetricElement, this class appears to only override member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).
UpdatedLagrangianUPwDiffOrderElement
This class derives from class SmallStrainUPwDiffOrderElement and it overrides the following relevant member functions:
CalculateAll: differences with respect to the base class implementation include:
The base class implementation calls CalculatePermeabilityUpdateFactor (implemented by the base class itself), whereas the derived class doesn’t call this member at all. This might be a discrepancy that needs to be fixed. We need to investigate that first.
When the stiffness matrix is calculated, the UL element (i.e. this class) also considers a “geometric stiffness” contribution when requested (by calling member CalculateAndAddGeometricStiffnessMatrix), whereas the base class doesn’t.
CalculateOnIntegrationPoints(const Variable<double>&, …): the implementation appeared to be identical to the one of class UPwUpdatedLagrangianElement.
The resizing of the output vector is based on the size of constitutive law vector (why??) rather than the number of integration points. [Or are these numbers somehow related and do they have identical values??]
The code related to the case where the given variable equals REFERENCE_DEFORMATION_GRADIENT appears to be nearly identical to the one of class UPwUpdatedLagrangianElement, the difference being that the model dimension is not a template parameter, but taken from the element’s geometry.
Variable GREEN_LAGRANGE_STRAIN_TENSOR is simply not considered here.
CalculateOnIntegrationPoints(const Variable<Vector>&, …): provides a dedicated implementation when the given variable equals GREEN_LAGRANGE_STRAIN_VECTOR.
UpdatedLagrangianUPwDiffOrderAxisymmetricElement
This class derives from class UpdatedLagrangianUPwDiffOrderElement (see the previous section). As for class UPwUpdatedLagrangianAxisymmetricElement, this class appears to only override member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).
Geometrically nonlinear behaviour
There are six element classes that consider geometrically nonlinear behaviour by adopting the Updated Lagrange (UL) Formulation:
UPwUpdatedLagrangianElement
UPwUpdatedLagrangianAxisymmetricElement
UPwUpdatedLagrangianFICElement
UPwUpdatedLagrangianAxisymmetricFICElement
UpdatedLagrangianUPwDiffOrderElement
UpdatedLagrangianUPwDiffOrderAxisymmetricElement
Due to how the element classes are related through inheritance, certain parts of the code have been duplicated with only minor modifications. These duplications and differences are detailed below.
UPwUpdatedLagrangianElement
This class derives from class
UPwSmallStrainElement
and it overrides the following relevant member functions:CalculateAll
: differences with respect to the base class implementation include:CalculatePermeabilityUpdateFactor
(implemented by the base class itself), whereas the derived class doesn’t call this member at all. This might be a discrepancy that needs to be fixed. We need to investigate that first.CalculateAndAddGeometricStiffnessMatrix
of classUPwSmallStrainElement
), whereas the base class doesn’t.CalculateOnIntegrationPoints(const Variable<double>&, …)
: provides a dedicated implementation when the given variable equalsREFERENCE_DEFORMATION_GRADIENT_DETERMINANT
. Possibly, this code is used for postprocessing purposes only.CalculateOnIntegrationPoints(const Variable<Matrix>&, …)
: provides dedicated implementations when the given variable equals eitherREFERENCE_DEFORMATION_GRADIENT
orGREEN_LAGRANGE_STRAIN_TENSOR
. Again, possibly this code is used for postprocessing purposes only.UPwUpdatedLagrangianAxisymmetricElement
This class derives from
UPwUpdatedLagrangianElement
(see the previous section). It appears this class only overrides member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).UPwUpdatedLagrangianFICElement
This class derives from class
UPwSmallStrainFICElement
and it is not related to classUPwUpdatedLagrangianElement
. It overrides the following relevant member functions:CalculateAll
: like for classUPwUpdatedLagrangianElement
, when the stiffness matrix is calculated, the UL element (i.e. this class) also considers a “geometric stiffness” contribution (by calling memberCalculateAndAddGeometricStiffnessMatrix
of classUPwSmallStrainElement
), whereas the base class doesn’t.CalculateOnIntegrationPoints(const Variable<double>&, …)
: the implementation appeared to be identical to the one of classUPwUpdatedLagrangianElement
.CalculateOnIntegrationPoints(const Variable<Matrix>&, …)
: the implementation appeared to be identical to the one of classUPwUpdatedLagrangianElement
.UPwUpdatedLagrangianAxisymmetricFICElement
This class derives from class
UPwUpdatedLagrangianFICElement
(see the previous section). As for classUPwUpdatedLagrangianAxisymmetricElement
, this class appears to only override member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).UpdatedLagrangianUPwDiffOrderElement
This class derives from class
SmallStrainUPwDiffOrderElement
and it overrides the following relevant member functions:CalculateAll
: differences with respect to the base class implementation include:CalculatePermeabilityUpdateFactor
(implemented by the base class itself), whereas the derived class doesn’t call this member at all. This might be a discrepancy that needs to be fixed. We need to investigate that first.CalculateAndAddGeometricStiffnessMatrix
), whereas the base class doesn’t.CalculateOnIntegrationPoints(const Variable<double>&, …)
: the implementation appeared to be identical to the one of classUPwUpdatedLagrangianElement
.CalculateOnIntegrationPoints(const Variable<Matrix>&, …)
:REFERENCE_DEFORMATION_GRADIENT
appears to be nearly identical to the one of classUPwUpdatedLagrangianElement
, the difference being that the model dimension is not a template parameter, but taken from the element’s geometry.GREEN_LAGRANGE_STRAIN_TENSOR
is simply not considered here.CalculateOnIntegrationPoints(const Variable<Vector>&, …)
: provides a dedicated implementation when the given variable equalsGREEN_LAGRANGE_STRAIN_VECTOR
.UpdatedLagrangianUPwDiffOrderAxisymmetricElement
This class derives from class
UpdatedLagrangianUPwDiffOrderElement
(see the previous section). As for classUPwUpdatedLagrangianAxisymmetricElement
, this class appears to only override member functions that need different behaviour to account for the axisymmetric stress state. In other words, when it comes to geometrically nonlinear behaviour, it exhibits the exact same behaviour as its base class (and no code was duplicated to achieve that).