abaqus二次开发各向异性相场模型,求解复合材料单层板不同纤维铺层角度下的断裂
abaqus二次开发各向异性相场模型,求解复合材料单层板不同纤维铺层角度下的断裂。
最近在折腾复合材料断裂的仿真,发现相场法在处理复杂裂纹路径上真是个好帮手。不过各向异性材料的相场模型实现起来有点头秃,特别是纤维铺层角度变化时裂纹走向完全不可控。今天咱们直接上干货,聊聊怎么用Abaqus二次开发搞定这个难题。
先说个坑:Abaqus自带的相场模型只能处理各向同性材料。遇到碳纤维这种方向性极强的材料,就得自己魔改UMAT子程序了。这里的关键是要把材料方向信息揉进本构方程——比如下面这段UMAT的弹性矩阵定义就很有意思:
C11 = props(1)/(1.0 - props(2)*props(3)) C22 = props(4)/(1.0 - props(5)*props(6)) C12 = sqrt(props(1)*props(4))*props(7) C66 = props(8) DDSDDE(1,1) = (C11*cos(theta)**2 + C22*sin(theta)**2) * (1.0 - d) DDSDDE(2,2) = (C11*sin(theta)**2 + C22*cos(theta)**2) * (1.0 - d) DDSDDE(1,2) = (C12 - (C11 + C22 - 2*C66)*sin(theta)**2*cos(theta)**2) * (1.0 - d) DDSDDE(4,4) = C66 * (1.0 - d)这里的theta就是当前积分点的纤维方向角,d是相场损伤变量。注意刚度矩阵每个分量都乘以(1-d)实现损伤软化,但实际操作时要加个下限值防止数值不稳定。
abaqus二次开发各向异性相场模型,求解复合材料单层板不同纤维铺层角度下的断裂。
更刺激的是相场演化方程。各向异性断裂能Gc得用张量形式表达,比如这样定义断裂驱动力:
def calc_energy_release(phi, grad_phi): A = np.array([[1.2, 0.3], [0.3, 0.8]]) # 各向异性参数矩阵 return 0.5 * np.dot(grad_phi, np.dot(A, grad_phi)) + (phi**2)/(2*l0**2)搞定了理论框架,自动化建模才是重头戏。用Python脚本批量生成不同铺层角度的模型简直不要太爽:
for angle in [0, 15, 30, 45]: mdb.Model(name=f'Laminate_{angle}deg') part.assignOrientation( region=cellRegion, localCsys=material_csys[angle], axis='X', angle=angle) # 相场参数设置 mdb.models[f'Laminate_{angle}deg'].Field( name='InitialDamage', region=part.sets['ALL'], expression='0.02*random()')跑完仿真后发现45度铺层的裂纹路径最妖娆,会沿着纤维方向蛇形走位。相比之下0度铺层的裂纹就老实多了,基本直线传播。这验证了各向异性参数对断裂行为的控制效果。
有个小技巧:在Visualization模块里用Python后处理可以直接提取裂纹扭结角度:
session.viewports['Viewport:1'].odbDisplay.display.setValues(plotState=( CONTOURS_ON_DEF, )) session.fieldReportOptions.setValues(printTotal=False) session.fieldReportOptions.setValues(printMinMax=False) crack_data = session.xyDataListFromField( odb=odb, outputPosition=NODAL, variable=(('PHI', NODAL), ), nodeSets=("CRACK_TIP", ))最后提醒:用相场法搞复合材料记得把网格尺寸l0设置得比裂纹过程区小,不然损伤带宽度会失真。建议做网格收敛性分析,别问我怎么知道的——都是血泪教训啊!
下次试试把层间剥离也耦合进来,应该会更接近真实分层破坏。不过那可能得魔改UEL子程序了,估计又得掉几根头发...(笑)
