UniaxialMaterial models are the work horses of OpenSees. Originally developed for the truss element, these models have proliferated thanks to fiber section models. However, because they are simply scalar functions, UniaxialMaterial models can be used in several other contexts.
The calling function knows the context, not the UniaxialMaterial model–it only provides an output for a given input. Accordingly, the user has to input parameters to the UniaxialMaterial models that are consistent with the context.
This post summarizes the contexts in which UniaxialMaterial models are used in OpenSees along with the interpretation of the model input and output.
A Truss element uses UniaxialMaterial models as stress-strain response. The material stress and tangent are multiplied by cross-section area to get force and stiffness. For linear-elastic response, use E and for nonlinear response use stress parameters, e.g., as shown below for HardeningMaterial.
E = 29000.0 # Or whatever Fy = 50.0 Hi = 0 Hk = 300.0 ops.uniaxialMaterial('Elastic',1,E) ops.uniaxialMaterial('Hardening',2,E,Fy,Hi,Hk)
matTag = 1A = 10.0 ops.element('truss',1,1,2,matTag,A)
Along the same lines, FiberSection objects use UniaxialMaterial models as stress-strain response. The material stress and tangent are multiplied by fiber area to get fiber force, which is summed over the section to get section stress resultants (axial force and bending moment).
E = 29000.0 # Or whatever Fy = 50.0 Hi = 0 Hk = 300.0 ops.uniaxialMaterial('Elastic',1,E) ops.uniaxialMaterial('Hardening',2,E,Fy,Hi,Hk) matTag =2 ops.section('Fiber',1) ops.patch('quadr',matTag,...)
A SectionAggregator uses UniaxialMaterial models as section force-deformation (stress resultant) response. There is no integration of the model response, i.e., no automatic multiplication by area, so the user has to input resultant quantities of section stiffness and force.
nu = 0.3 G = E/(2*(1+nu))
Tauy =Fy/3**0.5 As = 6.5 # Shear area GA = G*As Vy = Tauy*As Hi = 0 Hk = 0.01*GA # Or whatever ops.uniaxialMaterial('Elastic',3,GA) ops.uniaxialMaterial('Hardening',4,GA,Vy,Hi,Hk) matTag = 4 ops.section('Aggregator',3,'Vy',matTag,'-section',1)
A ZeroLength element uses UniaxialMaterial models as force-deformation and moment-rotation response, basically as springs. There is no integration of the model response, so the user has to input force (or moment) and stiffness.
k = 200000.0 Fy = 500 Hi = 0 Hk = 0.01*k # Or whatever ops.uniaxialMaterial('Elastic',5,k) ops.uniaxialMaterial('Hardening',6,k,Fy,Hi,Hk) matTag = 5 ops.element('zeroLength',1,1,2,'-mat',matTag,'-dir',2,...)
The zero length elements are often used as moment-rotation springs in concentrated plasticity beam elements where the interpretation is (force*length)/radian. There are also a few variants on the zero length element that use UniaxialMaterial models:
flatSliderBearing among others.
Most of the OpenSees documentation refers to UniaxialMaterial models as stress-strain relationships, but know that these models can do so much more! Also, be careful not to use some UniaxialMaterials in odd contexts, e.g., it wouldn’t make sense to use Concrete23 in a section aggregator or zero length element.