基于Abaqus Python脚本实现Y轴最近节点筛选及T=f(Y)曲线绘制
补全Abaqus脚本以绘制T=f(Y)曲线
需求背景
已创建包含某一面所有节点的Node Set,需要检测最高温度Tmax对应的节点,定义经过该节点的局部坐标系,找出所有距离该局部Y轴最近的节点,提取其Y坐标与温度值,绘制温度随Y方向分布的曲线。
完整补全代码
from abaqus import * from abaqusConstants import * import numpy as np import matplotlib.pyplot as plt # 原有代码部分 path0='1101.odb' odb=openOdb(path=path0) nodeset='NODESET-ZCT' mySet = odb.rootAssembly.instances['PART-1-1'].nodeSets[nodeset] lastFrame = odb.steps['Step-1'].frames[-1] TEMP=lastFrame.fieldOutputs['NT11'] mySetTemp = TEMP.getSubset(region=mySet) mySetTempValues=mySetTemp.values coords=lastFrame.fieldOutputs['COORD'] mySetCoord = coords.getSubset(region=mySet) mySetCoordValues=mySetCoord.values Tmax = 0 for v in mySetTempValues: if v.data > Tmax: Tmax = v.data NodeTmax=v.nodeLabel print(NodeTmax,Tmax) COORD_node_Tmax = None for var in mySetCoordValues: if var.nodeLabel==NodeTmax: COORD_node_Tmax=var.data print(NodeTmax,Tmax,COORD_node_Tmax) CSYS_Tmax=odb.rootAssembly.DatumCsysByThreePoints(name='CSYS-Tmax', coordSysType=CARTESIAN, origin=(COORD_node_Tmax[0], 0.0, 0.0), point1=(0.0, 0.0, 0.0), point2=(COORD_node_Tmax[0],COORD_node_Tmax[1],COORD_node_Tmax[2])) # -------------------------- 补全部分开始 -------------------------- # 1. 获取局部坐标系的变换矩阵,用于全局坐标转局部坐标 csys = odb.rootAssembly.datumCsyses['CSYS-Tmax'] transform = csys.getTransformation() # 2. 遍历节点,计算每个节点到局部Y轴的距离,收集对应Y坐标和温度 node_data = [] for coord_val, temp_val in zip(mySetCoordValues, mySetTempValues): if coord_val.nodeLabel != temp_val.nodeLabel: continue # 确保坐标与温度对应同一节点 # 全局坐标转局部坐标(齐次坐标转换) global_coord = np.array(coord_val.data) local_coord = transform.dot(np.append(global_coord, 1.0))[:3] # 计算到局部Y轴的距离:sqrt(局部X² + 局部Z²) distance_to_Y_axis = np.sqrt(local_coord[0]**2 + local_coord[2]**2) node_data.append({ 'y_local': local_coord[1], 'temp': temp_val.data, 'distance': distance_to_Y_axis }) # 3. 筛选距离局部Y轴最近的节点(考虑数值精度设置容差) min_distance = min([d['distance'] for d in node_data]) tolerance = 1e-6 # 可根据模型尺寸调整 filtered_nodes = [d for d in node_data if abs(d['distance'] - min_distance) < tolerance] # 4. 按局部Y坐标排序,保证曲线绘制顺序正确 filtered_nodes.sort(key=lambda x: x['y_local']) # 5. 提取数据并绘制曲线 y_values = [d['y_local'] for d in filtered_nodes] temp_values = [d['temp'] for d in filtered_nodes] plt.figure(figsize=(8, 6)) plt.plot(y_values, temp_values, 'b-', linewidth=2, marker='o', markersize=4) plt.xlabel('局部Y坐标') plt.ylabel('温度 T') plt.title('温度沿局部Y轴分布曲线') plt.grid(True) plt.show() # 关闭odb文件释放资源 odb.close()
关键步骤说明
- 坐标转换:通过
getTransformation()获取局部坐标系的变换矩阵,将全局坐标转换为局部坐标,确保距离计算针对目标局部Y轴。 - 距离筛选:计算每个节点到局部Y轴的距离,筛选出距离最小的节点组,设置容差避免数值精度问题。
- 数据整理:将筛选后的节点按Y坐标排序,保证曲线绘制的连续性。
- 可视化:使用matplotlib绘制温度随Y坐标变化的曲线,直观展示分布规律。
内容的提问来源于stack exchange,提问作者Wahid Tarhouni
相关产品推荐
相关产品推荐

