abaqus有关裂纹扩展的问题?
浏览:780 回答:1


模拟xfem裂纹扩展,在deepseek里面编辑了有关裂纹损伤准则的子程序,然后结合黄永刚老师的umat进行运行。上面的图是我预设裂纹一开始的图,下面的图是我运行之后产生的裂纹扩展的图。请问为什么我的裂纹每次扩展碰到我的网格边界就会出现这种报错?请问这种应该怎么解决,是不是编译的子程序(子程序在下面)出现了问题?感谢

以下是我结合deepseekb编写的用户损伤子程序
SUBROUTINE UDMGINI(FINDEX, NFINDEX, FNORMAL, NDI, NSHR, NTENS,
1 PROPS, NPROPS, STATEV, NSTATEV, STRESS, STRAIN,
2 STRAINEE, LXFEM, TIME, DTIME, TEMP, DTEMP,
3 PREDEF, DPRED, NFIELD, COORDS, NOEL, NPT,
4 LAYER, KSPT, KSTEP, KINC, KDIRCYC, KCYCLELCF,
5 TIMECYC, SSE, SPD, SCD, SVD, SMD, JMAC, JMATYP,
6 MATLAYO, LACCFLA, CELENT, DROT, ORI)
INCLUDE 'ABA_PARAM.INC'
DIMENSION FINDEX(NFINDEX), FNORMAL(NDI, NFINDEX), COORDS(*),
1 STRESS(NTENS), STRAIN(NTENS), STRAINEE(NTENS),
2 PROPS(NPROPS), STATEV(NSTATEV), PREDEF(NFIELD),
3 DPRED(NFIELD), TIME(2), JMAC(*), JMATYP(*),
4 DROT(3, 3), ORI(3, 3)
! 参数定义
INTEGER, PARAMETER :: NSLPTL = 12 ! 滑移系统总数(根据UMAT注释)
REAL*8, PARAMETER :: CRITICAL_ICSS = 0.0001D0 ! 临界累积剪切应变
! 变量声明
REAL*8 :: ICSS(NSLPTL), MAX_ICSS
INTEGER :: I, ACTIVE_SLIP
! 初始化输出参数
FINDEX(1:NFINDEX) = 0.0D0
FNORMAL(1:NDI, 1:NFINDEX) = 0.0D0
! 从STATEV中读取滑移系的累积剪切应变(SDV109-SDV120)
DO I = 1, NSLPTL
ICSS(I) = STATEV(108 + I)
END DO
! 找到最大ICSS及其对应的滑移系
MAX_ICSS = MAXVAL(ICSS)
ACTIVE_SLIP = MAXLOC(ICSS, DIM=1)
! 判断是否触发裂纹扩展
IF (MAX_ICSS >= CRITICAL_ICSS) THEN
FINDEX(1) = 1.0D0 ! 触发损伤
! 获取对应滑移面的法线方向(根据UMAT注释,法线存储在STATEV的6*NSLPTL+1之后)
! 每个滑移系法线占3个变量,例如:
! STATEV(6*NSLPTL + 3*(ACTIVE_SLIP-1) + 1 : 6*NSLPTL + 3*ACTIVE_SLIP)
! 例如:NSLPTL=12时,滑移系1的法线为STATEV(73-75),滑移系2为STATEV(76-78),以此类推
! 请根据实际UMAT代码确认索引位置
IDX_NOR = 3*NSLPTL + 3*(ACTIVE_SLIP-1) + 1
FNORMAL(1:3, 1) = STATEV(IDX_NOR : IDX_NOR+2)
! 投影到全局坐标系(假设法线已存储在全局坐标系中)
! 若法线存储为晶体坐标系,需用ROTATE矩阵转换:
! CALL MATMUL(ORI, FNORMAL(1:3,1), TEMP_NOR)
! FNORMAL(1:3,1) = TEMP_NOR
END IF
RETURN
END