一、ANSYS中梁单元默认单元坐标系的规定
在ANSYS中建模或者从其他地方导入模型时,梁的单元坐标轴 是通过方向节点 控制的。但是,一般情况下都省略了该点,所以单元坐标系是默认生成的。因此,要转化梁单元的单元坐标系,就要知道ANSYS中默认梁单元坐标系的方向。以Beam188单元为例,下图为帮助文档中有关其单元坐标系方向规定的描述。
图1 BEAM188单元坐标系的规定
图1中的描述,可以概括为以下三点:
(1)可以在创建梁单元时就建立其单元坐标系z轴的方向控制节点k(少数情况下);
(2)如果未定义方向控制节点k(大多数的情况下),则默认的单元坐标系y轴与整体坐标系下的X-Y平面平行;
(3)在第(2)条的基础上,特殊的,当单元坐标系的x轴与整体坐标系的Z轴平行时,默认单元坐标系y轴与整体坐标系下的Y轴平行。
根据以上描述,就可以判断出空间任一位置梁单元的默认单元坐标系了!!!
二、基于Python编写梁单元坐标系转化的代码
知道了默认单元坐标系的规定方法,就可以通过Python编写转换代码了。这里就废话不多说,直接上代码!!!
#ANSYS中梁单元坐标轴的转化代码
import numpy as np #加载numpy库,以np调用
import math #加载math库
#(1)确定梁单元坐标轴x的单位向量
Beam_NodeI_X,Beam_NodeI_Y,Beam_NodeI_Z=1,1,1 #梁单元起点i的x,y,z坐标
Beam_NodeJ_X,Beam_NodeJ_Y,Beam_NodeJ_Z=0,1,0 #梁单元终点j的x,y,z坐标
Beam_Local_x_Vector=np.array([(Beam_NodeJ_X-Beam_NodeI_X),(Beam_NodeJ_Y-Beam_NodeI_Y),(Beam_NodeJ_Z-Beam_NodeI_Z)]) #梁单元坐标轴x的向量
Norm_Beam_Local_x_Vector=Beam_Local_x_Vector/float(np.linalg.norm(Beam_Local_x_Vector)) #梁单元坐标轴x的归一化向量
#(2)判断梁单元默认单元坐标轴y和z的单位向量
Global_Z=np.array([0,0,1]) #规定整体Z轴的单位向量
if Norm_Beam_Local_x_Vector.dot(Global_Z)/(np.sqrt(Norm_Beam_Local_x_Vector.dot(Norm_Beam_Local_x_Vector))*np.sqrt(Global_Z.dot(Global_Z)))==1 or Norm_Beam_Local_x_Vector.dot(Global_Z)/(np.sqrt(Norm_Beam_Local_x_Vector.dot(Norm_Beam_Local_x_Vector))*np.sqrt(Global_Z.dot(Global_Z)))==-1:
Beam_Local_y_Vector=np.array([0,1,0])
Beam_Local_z_Vector=np.cross(Norm_Beam_Local_x_Vector,Beam_Local_y_Vector)
else:
Beam_Local_y_Vector=np.cross(Global_Z,Norm_Beam_Local_x_Vector)
Beam_Local_z_Vector=np.cross(Norm_Beam_Local_x_Vector, Beam_Local_y_Vector)
#(3)根据旋转轴、所选旋转的向量、旋转角度,计算得到旋转后的方向向量
Rotate_Aixal=Norm_Beam_Local_x_Vector #旋转轴即为梁单元坐标轴x
Vector_Origin=Beam_Local_z_Vector #所要旋转的向量即为梁单元坐标轴z
Rotate_Angle=90 #输入要旋转的角度(单位:度)
Rotate_Angle_r=math.radians(Rotate_Angle) #转化角度为弧度(单位:弧度)
Vector_Target=Vector_Origin*math.cos(Rotate_Angle_r)+np.cross(Rotate_Aixal,Vector_Origin)*math.sin(Rotate_Angle_r)+Rotate_Aixal*(np.dot(Rotate_Aixal,Vector_Origin))*(1-math.cos(Rotate_Angle_r)) #计算得到旋转后的新z轴
Beam_Local_z_Vector_New_x,Beam_Local_z_Vector_New_y,Beam_Local_z_Vector_New_z=Vector_Target[0]+Beam_NodeI_X , Vector_Target[1]+Beam_NodeI_Y , Vector_Target[2]+Beam_NodeI_Z #计算旋转后梁方向控制点k的坐标
print(Beam_Local_z_Vector_New_x,",",Beam_Local_z_Vector_New_y,",",Beam_Local_z_Vector_New_z)
代码语言和逻辑很简单,并无难点,但要注意一下梁单元坐标轴y和z的默认方向。
三、使用方法
下面,以空间一根T型截面梁为例。首先,在ANSYS中创建梁单元,以下为有限元模型的APDL代码。
finish
/clear
/prep7
!单元及材料属性
ET,1,beam188
sectype,1,beam,t,,0
secoffset,cent
secdata,0.5,0.4,0.080,0.060,0,0,0,0,0,0,0,0
mp,ex,1,2.1e5
mp,dens,1,7850e-12
mp,prxy,1,0.3
!通过关键点创建梁线段
K,1,1,1,1
K,2,0,1,0
L,1,2
!划分网格,此处划分10份
LSEL,all
LATT,1,,1,,
lesize,all,,,10
lmesh,all
allsel,all
此处梁单元是基于线模型通过网格划分生成的,所以每个单元都有各自的, 节点,但其单元坐标轴 的方向是一致的,都是由keypoint 1 点指向keypoint 2 点。因此,将k1点坐标和k2点坐标带入Python代码中,即图2所示的位置,可计算得到单元坐标轴 的方向向量。
注意:如果是直接通过节点创建的梁单元,则直接将 节点和 节点的(x ,y, z)坐标输入Python代码中即可。
图2 将梁的起点、终点坐标输入到Python代码
如图3,输入单元坐标轴 需要旋转的角度。注意:此处旋转角度的正负,按照右手定则确定,即大拇指指向单元坐标轴 的正方向,当大拇指指向自己时,逆时针旋转为正,顺时针旋转为负。
图3 输入单元坐标系z轴要转动的角度
运行Python程序,即可得到梁单元旋转后的方向控制点k的坐标:
1.0 , 1.7071067811865475 , 1.0
将上述坐标复制到下述APDL代码中,在ANSYS中运行,即可得到旋转之后的梁单元模型。
allsel,all
n,100,1.0 , 1.7071067811865475 , 1.0
emodif,all,-3,100 !3代表梁单元第三个节点,即控制节点k
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删