Abaqus 脚本 python建模 -几何建模篇
本帖最后由 YangXue-Jade 于 2017-12-20 18:43 编辑继续上次内容,在详述model() 函数内容之前,必须要先导入基础ABAQUS包,其实可以看出,abaqus所用的python语句除了自己构造的那部分,很多时候都是专门定义在ABAQUS环境里面使用的:
from abaqus import *
from abaqusConstants import *
from __main__ import*
from regionToolset import *
import displayGroupMdbToolset as dgm
from part import *
from material import *
from section import *
from assembly import *
from step import *
from interaction import *
from load import *
from mesh import *
from job import *
from sketch import *
from visualization import *
from xyPlot import *
import displayGroupOdbToolset as dgo
import connectorBehavior
import time
import numpy as np
from numpy import *##有些不是必须的,只是因为本人在构造循环过程中有用到ceil这样的函数,所以才也导入了。必须的函数通过macro 完成一次任意操作,就会出现在rpt.文件里,具体方法很多前辈已经写过经验帖这里就不多说
为了涵盖尽可能多的知识面,我将实际模型简化至由一个基本装配单位(board,stud 和固定板)重复排列,各个单元之间由interaction连接的情况。具体细节不会叙述,但是知道这个前提条件会帮助大家理解。
首先针对自己创造的模型使用参数化变量,在具体函数之前,定义好所需要的变量,后面赋值时直接调用,这样可以方便日后修改,通过这样的方式模型的几何特征甚至也可以变化。
为了描述本次model()函数所需要的最基础的变量(以stud为例)有:
N = xx ##基本单位重复次数
L = xx ##基本单位长
E = xx##基本单位宽
H = xx #基本单位高
E_stud= xx ##厚度
Mesh = xx ##一般网格大小
Mesh_joint = xx ##接触点网格大小,一般接触部分网格相对较细
Densite = xx ##材料定义
E_stud = xx ##杨氏模量定义,由于实例中,材料力学性能与温度变化有关,故此在指定性能时,采用调用excel表格的方法,后面以杨氏模量为例具体叙述
Poisson = xx ##泊松比
Name = ‘Mechanical’
mdb.Model(name=Name) ## 定义模型名称
partition = mdb.Model(Name)##赋给变量方便后面反复调用
草绘建模仅给出一个例子,具体可以使用宏这个功能获得。
Stud = partition.ConstrainedSketch (name = ‘Stud’, sheetsize = 0.1)##打开草绘界面,给草绘命名
Stud.Line(point1=(,),point2 = (,))##按照坐标画直线
…
partition.Part(dimensionality=THREE_D, name='Stud', type=DEFORMABLE_BODY) ##建立名为Stud的part,3D可变形
pstud = partition.parts['Stud]']
pstud.BaseShellExtrude(depth=L, sketch=Stud) ##此part由名为Stud的草绘拉伸L(之前定义的变量)形成
其余part建立过程类似过于累赘,不在此详叙。
后面对该part赋予材料特性:
steel= partition.Material(name='Steel')##建立名为Steel的材料特性,将该材料特性调用赋给steel变量,方便后面调用
steel.Elastic(temperatureDependency=ON,table=lecture_csv_3col('data_materiaux','E_studT150','mu_ stud','T_stud')) ##此功能是通过读取表格相对应列的参数,T_stud表示不同温度下对应的材料性能。lecture_csv_3col()是一个单独读取excel的函数,在本节最后府上定义过程。
当然,不和温度相关 赋值语句:
steel.Elastic(temperatureDependency=OFF,table=((E_stud, Poisson), ))
其余材料性能参数依次替换Elastic关键词调用,具体不赘叙。
Section定义
section_stud = partition.HomogeneousShellSection(idealization=NO_IDEALIZATION,
integrationRule=SIMPSON, material='Steel', name='Stud', numIntPts=5,
poissonDefinition=DEFAULT, preIntegrate=OFF, temperature=GRADIENT,
thickness=e_stud, thicknessField='', thicknessModulus=None,
thicknessType=UNIFORM, useDensity=OFF)
##此处意思为将之前定义的Steel材料赋给Stud section,该section厚度为e_stud。
Simpson 方法和高斯正交方法区别在于是否在界面的表面设置计算点,一般来说,高斯正交法准确度更高,故此默认值设置时,对均匀界面,simpson有五个计算点,而同等精度的高斯正交只需要三个点。但需要注意的是,如果对物体表面的应力状态需要分析的情况下,必须使用simpson方法。
是否勾选using a section integrated during the analysis 取决于所需要定义的界面性能是否取决于一些在计算过程中不断变化的量,比如温度。在此例中,温度决定了材料的性能不停变化,所以preIntegrate=OFF。
接下来需要对这个section进行指定。
faces = pstud.faces.getByBoundingSphere( (0,0,0.5*L), L) ##pstud是前面定义的指向Stud这个part的变量,此时在选取section所应用面时调用,可以保证此时操作只针对于Stud这个part。GetByBoundingSphere 需要一个中心点,一个半径,这个区域内所划到的面都将被选中,赋予faces这个变量。因此,此时用半个stud长度作为半径,可以保证Stud所有面都被囊括在内。
pickedRegions =(faces, )
pstud.SectionAssignment(offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region=pickedRegions , sectionName='Stud')##将section付给选中的面。同时选中的面作为中心面(此选项对应的是e_stud 厚度的分配)
建立装配特征
本例中的装配特征征都是通过轴与轴之间的配合完成,为了避免重复性工作,轴的建立建议在part上完成,这样后面多次调用parts作为instance时,这些特征都能够跟着调用,此处以stud为例:
dat_stud_v1=pstud.DatumAxisByTwoPoint(point1=(0,-0.5*e_stud,0),point2=(0,-0.5*e_stud,L))##两点成线
如果后面,我希望将第一根stud和第二根stud的这根轴约束在一起,那么:
p = mdb.models.parts['Stud'] ##此处为调用stud part
stud=[ ]
i=0
while i<N : ##N 为重复次数
stud.append(a.Instance(name='Stud-'+str(i), part=p, dependent=ON))##产生N个stud为instance用于装配件
i=i+1
EdgeToEdge(fixedAxis= stud.datums], flip=OFF,
movableAxis=stud.datums) ##此处意思为第一个stud的v1固定,使第二根stud的v1轴与其重合。Flip是指重合的方向与默认方向是否一致
通过这个例子可以看出,对part进行特征操作,高效方便,比对instances一个一个操作要节省代码。结构更清晰。
Partition特征操作
与上述同理,一般对于重复装配零件,如果某部分需要partition开,那么对于每个instance都是要进行同样处理的,那么从一开始就对part进行partition操作,后面调用的时候也会随着part本体被调用。
Partition方法有通过面,线切割。甚至还可以通过草绘切割,不同的方法有不同的语句,在此不做细述。(后面如果有需要,可以专门出一主题讲基于mesh需要的分割方法)
特征surface或set建立:
一般情况下,对零件上某面要进行比如边界条件的设置,可能要重复选取每个面。但如果,在一开始的part中,这个面就被定义,并且命名,后面的调用将会非常快捷。比如,
我需要对N个stud的同一个面进行选取。在part中:
p = mdb.models.parts['Stud']
f = p.faces##f表示stud part里面有所面的集合
x,y,z= 0, 0.5*E, 0.5*L##此处为面中点的坐标
face_1=f.findAt(((x,y,z),)) ##face_1为stud part所有面中经过该点的面,故此已经选中了需要的那一面
p.Surface(side1Faces=face_1, name='stud_face1’)##将那面命名为stud_face1,
后面进行调用时:
for i in range (N):
a.instances['Stud-'+str(i)].surfaces['Stud_face1'] ##这样可以直接对每个instance该面进行操作
进行到这里,那么整个模型基本几何构造已经完成,界面材料定义完毕,装配也已经完成,后面需要用到的特征也在part里面定义完毕。下一节,将对网格划分,单元类型进行介绍。
附:
Lecture_csv_3col() 函数的定义
这个函数有四个输入,第一个为需要读取csv文件名,另外三个为分别需要读取的三个材料参数的在csv中的命名。
chemindircsv = chemindir ##这样设置路径后应该把csv文件放到py文件同一目录下
def lecture_csv_3col(nameFichier,namecolumn1,namecolumn2,namecolumn3) :
tab=np.genfromtxt(chemindircsv+ nameFichier +'.csv',delimiter=';',dtype=None)
a=np.shape(tab)
numl=a
numc=a
counter 1=-1
counter 2=-1
counter 3=-1
i=0
while i<numc :
if tab[(0,i)]== namecolumn1 : ##读取相对应名称列数
counter 1=i
elif tab[(0,i)]== namecolumn2 :
counter 2=i
elif tab[(0,i)]== namecolumn3 :
counter3=i
i=i+1
T=[]
for k in range (numl-1) :
triplet=(float(tab[(k+1, counter 1)]),float(tab[(k+1, counter 2)]),float(tab[(k+1, counter 3)]))
T.append(triplet)
TT=tuple(T)
return TT
本例csv中相对应的数据格式为:
E_studT150 mu_ stud T_stud
2.14E+11 0.3 20
1.54E+11 0.3 400
好。。。。。。。。。。。。。 363288403 发表于 2017-12-20 16:33
好。。。。。。。。。。。。。
欢迎大牛指点~ 楼主还在吗,请教个问题啊,edge to edge命令流 格式是什么样的,方括号中的。id是什么意思。 这个对于我这样的初学者有点帮助,顶一下 谢谢楼主的分享 厉害楼主 版主帮大忙了! 好好学习天天向上,加油 谢谢楼主分析
页:
[1]