Python与土木工程:修改ANSYS梁单元坐标轴的Python脚本

一、ANSYS中梁单元默认单元坐标系的规定

       在ANSYS中建模或者从其他地方导入模型时,梁的单元坐标轴 z 是通过方向节点 x 控制的。但是,一般情况下都省略了该点,所以单元坐标系是默认生成的。因此,要转化梁单元的单元坐标系,就要知道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

     此处梁单元是基于线模型通过网格划分生成的,所以每个单元都有各自的ij 节点,但其单元坐标轴 x 的方向是一致的,都是由keypoint 1 点指向keypoint 2 点。因此,将k1点坐标和k2点坐标带入Python代码中,即图2所示的位置,可计算得到单元坐标轴 x 的方向向量。

    注意:如果是直接通过节点创建的梁单元,则直接将 i 节点和 j 节点的(x ,y, z)坐标输入Python代码中即可。


   图2 将梁的起点、终点坐标输入到Python代码
 

    如图3,输入单元坐标轴 z 需要旋转的角度。注意:此处旋转角度的正负,按照右手定则确定,即大拇指指向单元坐标轴  的正方向,当大拇指指向自己时,逆时针旋转为正,顺时针旋转为负。


   图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


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空