goodstudyzhr 2025-03-27 18:51 采纳率: 0%
浏览 68

abaqus子程序(umatj+udmgini)进行xfem裂纹模拟

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

img

img


报错信息:

img


自己编的用户损伤子程序,损伤演化在abaqus中以关键词的形式写入:

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

  • 写回答

4条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-03-27 18:51
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    根据您提供的信息和代码,可能导致裂纹每次扩展碰到网格边界发生错误的原因如下:
    1. 您的裂纹扩展算法可能没有正确处理裂纹与网格边界的交互。当裂纹扩展到网格边界时,可能会导致算法无法正常执行,从而产生错误。
    2. 您编写的用户损伤子程序中的一些逻辑可能存在问题,导致裂纹扩展时出现错误。例如,对滑移系法线方向的处理可能有误,需要仔细检查代码逻辑。 为了解决这个问题,您可以尝试以下几点:
    3. 仔细检查您的裂纹扩展算法,确保能正确处理裂纹与网格边界的交互,避免出现错误。
    4. 逐步调试您编写的用户损伤子程序,检查每个步骤的逻辑是否正确,特别是与裂纹扩展相关的部分。
    5. 如果可能的话,尝试简化问题,例如先在简单的模型中测试裂纹扩展算法和用户损伤子程序,以确定问题的根本原因。 如果您需要更详细的帮助或代码实现方面的指导,请提供更多相关信息或代码内容,这样可以更好地帮助您解决问题。
    评论

报告相同问题?

问题事件

  • 创建了问题 3月27日