自由体截取是一种力学分析工具,用于研究结构特定截面(如框架梁或三维连续体构件)所受的力与弯矩状态。
在结构力学课程中,通常教授通过平衡方程解析求解自由体截取的方法,针对超静定结构等特殊情形还需结合运动学条件进行补充求解。然而,对于普遍工况而言,采用数值计算方法更具工程适用性。
在Abaqus中,我们可以在ODB内显示自由体截面,包括力。
在运行模型之前,我们需要在字段输出变量NFORC 。这些是节点的力,将在后处理阶段使用。
NFORC变量是由实体单元(例如C3D8,CPS4,CPE4…)所需的,但是,如果我们的模型是由梁单元制成的,则必须要求在场输出中提供可变的SF (截面力和弯曲矩)。
为了在我们的模型中显示自由削减,我们需要像往常一样解决该工作。然后,在可视化模块中,单击视图剪切管理器以选择切割平面,如下图所示。
在图像中,我们选择了X平面作为切割平面。然后,要在切口上显示自由力量,
必须启用。这样,我们将在模型的切割上看到两个箭头:一个代表力(红色),另一个代表弯矩(蓝色)。
显示自由力量和时刻的格式可以在以下方式中自定义:
Free Body Cut Manager > Options
一些最内置的选项是:
显示组件而不是结果。
编辑每个组件的颜色。
自定义向量标签以更好地可视化。
默认情况下,全球坐标系(CSYS-Global)默认情况下,在视图切割中显示的力和力矩的组成部分。但是,如果我们希望这种分解遵循任何其他CSY,则可以创建一个新的CSY,并在以下方式中选择它:
Free Body Cut Manager > Options
实际上,通过Python脚本,我们可以为轴向和剪切力以及弯曲生成自由体力图。
从自由削减中提取数据的关键功能是:
session.XYDataFromFreeBody
以下是示例脚本:
To run this script from Abaqus/CAE go to:
File > Run Script: Select this file
"""
from abaqus import *
from abaqusConstants import *
from caeModules import *
import numpy as np
# Read odb from the current viewport
myview = session.viewports[session.currentViewportName]
odb = session.odbs[myview.odbDisplay.name]
# Keep undeformed view
(CONTOURS_ON_UNDEF, )) =
# Enable Free body cut using X-plane, with rotation using the global CSYS
('X-Plane', ), viewCut=ON) =
ROTATE, rotationAxis=AXIS_3, showFreeBodyCut=True) =
# Specify the CSYS used to extract data: global CSYS (XYZ)
CSYS, csysName='(Global)') =
# Iterate and extract results
n_cuts = 25
angles = np.linspace(1., 89., n_cuts)
forces = []
forces_glob = []
for angle in angles:
# Make free body cut
angle) =
# Extract XYDataObjects from Free body cut
dataList = session.XYDataFromFreeBody(odb, force=True, moment=True, resultant=False, comp1=True, comp2=True, comp3=True)
fx = zip(*session.xyDataObjects['X-Plane force component 1'].data)[-1][-1]
fy = zip(*session.xyDataObjects['X-Plane force component 2'].data)[-1][-1]
mz = zip(*session.xyDataObjects['X-Plane moment component 3'].data)[-1][-1]
# Forces in global axis (XYZ)
fy, mz))
# Forces in cylindrical axis
axial_force = fx * np.cos(angle * np.pi/180.) + fy * np.sin(angle * np.pi/180.)
shear_force = fx * np.sin(angle * np.pi/180.) - fy * np.cos(angle * np.pi/180.)
shear_force, mz))
# Delete ALL xyDataObjects
# for k in session.xyDataObjects.keys():
# del session.xyDataObjects[k]
# delete XYDataObjects created
for d in dataList:
del session.xyDataObjects[d.name]
# Save results from freebody cuts
# Cartesian CSYS
fy, mz = zip(*forces_glob)
'Force_X', data=zip(angles, fx), =
axis1QuantityType=visualization.QuantityType(type=ANGLE),
axis2QuantityType=visualization.QuantityType(type=FORCE))
'Force_Y', data=zip(angles, fy), =
axis1QuantityType=visualization.QuantityType(type=ANGLE),
axis2QuantityType=visualization.QuantityType(type=FORCE))
# Cylindrical CSYS
shear, mz = zip(*forces)
'Force_N', data=zip(angles, axial), =
axis1QuantityType=visualization.QuantityType(type=ANGLE),
axis2QuantityType=visualization.QuantityType(type=FORCE))
'Force_Q', data=zip(angles, shear), =
axis1QuantityType=visualization.QuantityType(type=ANGLE),
axis2QuantityType=visualization.QuantityType(type=FORCE))
'Moment_Z', data=zip(angles, mz), =
axis1QuantityType=visualization.QuantityType(type=ANGLE),
axis2QuantityType=visualization.QuantityType(type=MOMENT))
########################################################################
# Show curves in new viewport
# Delete previous xyPlot if it exists
try:
del session.xyPlots['Force Profiles']
except KeyError:
pass
# Create new xyPlot
xyp = session.XYPlot('Force Profiles')
False) =
True, color='#2B2B2B') =
chartName = xyp.charts.keys()[0]
chart = xyp.charts[chartName]
'#3E3E3E') =
# Create curves
curve_N = session.Curve(xyData=session.xyDataObjects['Force_N'])
SOLID, thickness=0.8, color='#000000') =
False) =
curve_Q = session.Curve(xyData=session.xyDataObjects['Force_Q'])
SOLID, thickness=0.8, color='#FF0000') =
False) =
curve_mz = session.Curve(xyData=session.xyDataObjects['Moment_Z'])
DASHED, thickness=0.8, color='#00CCFF') =
False) =
# Add curves to chart (xyPlot)
(curve_N, curve_Q, curve_mz, ), ) =
# Arrange new viewport at the right half of the screen
newview = session.Viewport(name='New Viewport', origin=(20., 15.), width=428., height=188.)
newview.makeCurrent()
xyp) =
w = session.drawingArea.width
h = session.drawingArea.height
y0 = session.drawingArea.origin
(x0 + w/2., y0), width=w/2., height=h) =