程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

隨機分布單向長纖維-復合材料RVE模型-abaqus-python二次開發(下)

編輯:Python

前言

根據上篇文章存在的問題(隨機纖維生成、截面指派、切割)進行學習整理

代碼

導包與參數

from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
from math import *
import random as rd
# 纖維半徑r與基體長度深度
r = 2
w = 50
depth = 5
# 記錄纖維中心坐標的列表xy
xy = [[rd.random()*width, rd.random()*width]]
# 兩纖維間最小間距,防止距離過近導致網格過小
l_min = 2*r+r/4
# 目標纖維體積分數與當前纖維體積分數
# 目標體積分數不宜過大,理論上<0.5或<0.6基本不會出錯
vf = 0.3
vf_curr = 0
# 材料參數(模量泊松比)
E_m = 50
v_m = 0.3
E_f = 273
v_f = 0.2

創建基體並賦予截面

s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
s.rectangle(point1=(0.0, 0.0), point2=(w, w))
p = mdb.models['Model-1'].Part(name='matrix', dimensionality=THREE_D, type=DEFORMABLE_BODY)
p.BaseSolidExtrude(sketch=s, depth=depth)
del mdb.models['Model-1'].sketches['__profile__']
mdb.models['Model-1'].Material(name='Material-matrix')
mdb.models['Model-1'].materials['Material-matrix'].Elastic(table=((E_m, v_m),))
mdb.models['Model-1'].HomogeneousSolidSection(name='Section-matrix', material='Material-matrix', thickness=None)
c = p.cells
cells = c.findAt(((w, w, 0),))
region = regionToolset.Region(cells=cells)
p.SectionAssignment(region=region, sectionName='Section-matrix', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)

創建纖維

根據自身不同需求,可以修改纖維坐標生成代碼,這裡寫了一個判斷條件不是很簡單的,待優化

def judge(cir):
for curr_cir in xy:
if (cir[0]-curr_cir[0])**2+(cir[1]-curr_cir[1])**2 < l_min**2:
return False
else:
continue
return True
def add(cir):
if judge(cir):
# 如果纖維和四邊不重疊,則直接添加
if cir[0] > r+r/2 and w-cir[0] > r+r/2 and cir[1] > r+r/2 and w-cir[1] > r+r/2:
xy.append(cir)
else:
# 纖維和四邊重疊
# 其中距離4個角落太近的不要
if cir[0]**2+cir[1]**2 > 2*r**2 and cir[0]**2+(cir[1]-w)**2 > 2*r**2 and (cir[0]-w)**2+cir[1]**2 > 2*r**2 and (cir[0]-w)**2+(cir[1]-w)**2 > 2*r**2:
# 判斷落四邊上的纖維是否要周期,並添加
if cir[0] < r:
if r-cir[0] > 0.8:
if judge([cir[0]+w, cir[1]]):
xy.append(cir)
xy.append([cir[0]+w, cir[1]])
if w-cir[0] < r:
if r-(w-cir[0]) > 0.8:
if judge([cir[0]-w, cir[1]]):
xy.append(cir)
xy.append([cir[0]-w, cir[1]])
if cir[1] < r:
if r-cir[1] > 0.8:
if judge([cir[0], cir[1]+w]):
xy.append(cir)
xy.append([cir[0], cir[1]+w])
if w-cir[1] < r:
if r-(w-cir[1]) > 0.8:
if judge([cir[0], cir[1]-w]):
xy.append(cir)
xy.append([cir[0], cir[1]-w])
while vf_curr < vf:
cir = [rd.random()*w, rd.random()*w]
add(cir)
vf_curr = len(xy)*math.pi*r**2/w**2
print(vf_curr)
# 以上創建好的纖維的中心坐標都在xy列表裡了
# 在s1草圖中畫圓,拉伸成實體
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
for cir in xy:
s1.CircleByCenterPerimeter(center=(cir[0], cir[1]), point1=(cir[0]+r, cir[1]))
p = mdb.models['Model-1'].Part(name='fiber', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
p.BaseSolidExtrude(sketch=s1, depth=depth)
del mdb.models['Model-1'].sketches['__profile__']

為纖維賦予截面

mdb.models['Model-1'].Material(name='Material-fiber')
mdb.models['Model-1'].materials['Material-fiber'].Elastic(table=((E_f, v_f),))
mdb.models['Model-1'].HomogeneousSolidSection(name='Section-fiber', material='Material-fiber', thickness=None)
p = mdb.models['Model-1'].parts['fiber']
c = p.cells
for cir in xy:
cells = c.findAt(((cir[0], cir[1], 0.0),))
region = regionToolset.Region(cells=cells)
p.SectionAssignment(region=region, sectionName='Section-fiber', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)

裝配

a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts['fiber']
a.Instance(name='fiber-1', part=p, dependent=OFF)
p = mdb.models['Model-1'].parts['matrix']
a.Instance(name='matrix-1', part=p, dependent=OFF)
a.InstanceFromBooleanMerge(name='UDcomp', instances=(a.instances['fiber-1'], a.instances['matrix-1'], ), keepIntersections=ON, originalInstances=SUPPRESS, domain=GEOMETRY)

切割

該文章介紹了選取幾何元素的各種方法,這裡使用findAt()函數

p = mdb.models['Model-1'].parts['UDcomp']
f, e = p.faces, p.edges
# 通過findAt尋找畫布位置
face = f.findAt(((rd.random()*w, rd.random()*w, depth),))
edge = e.findAt(((w, rd.random()*w, depth),))
# face和edge為GeomSequence object,裡面只有一個元素分別為face object、edge object
# 可通過face[0].getCentroid()獲取面、邊的重心坐標,來觀察找到的面、邊是否符合要求
t = p.MakeSketchTransform(sketchPlane=face[0], sketchUpEdge=edge[0],
sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(w/2, w/2,
depth))
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=200, transform=t)
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
s.rectangle(point1=(-w/2, -w/2), point2=(w/2, w/2))
s.rectangle(point1=(-w/2-2*r, -w/2-2*r), point2=(w/2+2*r, w/2+2*r))
p.CutExtrude(sketchPlane=face[0], sketchUpEdge=edge[0], sketchPlaneSide=SIDE1,
sketchOrientation=RIGHT, sketch=s, flipExtrudeDirection=OFF)
del mdb.models['Model-1'].sketches['__profile__']

mesh

p = mdb.models['Model-1'].parts['UDcomp']
p.seedPart(size=1.0, deviationFactor=0.1, minSizeFactor=0.1)
c = p.cells
pickedRegions = c.getSequenceFromMask(mask=('[#ffffffff #3fffffff ]', ), )
p.setMeshControls(regions=pickedRegions, elemShape=WEDGE)
p.generateMesh()

EasyPBC

## 依然是,需要刪除多余的實例,否則報錯
a = mdb.models['Model-1'].rootAssembly
a.deleteFeatures(('fiber-1', 'matrix-1', ))
import sys
sys.path.insert(8, r'e:/CAE/abaqus_plugins/EasyPBC V.1.4')
import easypbc
easypbc.feasypbc(part='Model-1', inst='UDcomp-1', meshsens=1E-07, CPU=8,
E11=True, E22=True, E33=False, G12=True, G13=False, G23=False,
onlyPBC=False, CTE=False, intemp=0, fntemp=100)

效果


輸出的結果


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved