我需要将Abaqus模拟输出保存到外部文件。为此,我尝试使用子例程,但我发现它没有显示任何内容。我使用此代码进行了一些测试:
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,
2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME,
3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,
4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,JSTEP,KINC)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CMNAME
DIMENSION STRESS(NTENS),STATEV(NSTATV),
1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),
2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),
3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3),
4 JSTEP(4)
C user coding to define DDSDDE, STRESS, STATEV, SSE, SPD, SCD
C and, if necessary, RPL, DDSDDT, DRPLDE, DRPLDT, PNEWDT
C
OPEN (UNIT=1, FILE='D:\Temp\workspace\fortan\data_fortran.dat',
1 STATUS='UNKNOWN', ACCESS='DIRECT',FORM='FORMATTED')
WRITE (1,*) 'WRITE TEST'
CLOSE (1)
RETURN
END
-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-
SUBROUTINE UGENS(DDNDDE,FORCE,STATEV,SSE,SPD,PNEWDT,STRAN,
1 DSTRAN,TSS,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CENAME,NDI,
2 NSHR,NSECV,NSTATV,PROPS,JPROPS,NPROPS,NJPROP,COORDS,CELENT,
3 THICK,DFGRD,CURV,BASIS,NOEL,NPT,KSTEP,KINC,NIT,LINPER)
C
INCLUDE 'ABA_PARAM.INC'
C
CHARACTER*80 CENAME
DIMENSION DDNDDE(NSECV,NSECV),FORCE(NSECV),STATEV(NSTATV),
1 STRAN(NSECV),DSTRAN(NSECV),TSS(2),TIME(2),PREDEF(*),
2 DPRED(*),PROPS(*),JPROPS(*),COORDS(3),DFGRD(3,3),
3 CURV(2,2),BASIS(3,3)
C
logical, save :: isFileOpen = .FALSE.
C
CALL GETVRM('TEMP',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,MATLAYO,
1LACCFLA)
C IS THE FILE OPEN?
if (.not. isFileOpen) then
OPEN (UNIT=1, FILE='D:\Temp\workspace\fortan\data.txt',
1 STATUS='NEW')
C CHANGE FILE FLAG
isFileOpen = .TRUE.
end if
write (1,*) 'WRITE TRY'
RETURN
END
模拟运行没有任何错误,但是无论结果如何(它不会打印文本),它都不会写入文件。
我认为这可能是链接错误,但一切似乎都还不错:
我正在使用:
和所有
abaqus verify -user_std
abaqus info=system
abaqus verify -all
让我通过。
我真的不知道哪里可能是错误。有人知道吗?
答案 0 :(得分:1)
我会尝试写一个已经可用的频道。例如在UMAT中,Write(6,)将高斯点信息打印到.dat文件,而write(7,)打印到.msg文件。这样的过程在调试时似乎是一个好方法。如果仅在每个收敛增量的末尾需要信息,则可能希望通过公共块将信息传递给uexternal例程,并在该例程中循环GP。 更好的方法是创建SDV,并通过UI在odb上对其进行检查。在这种情况下,您需要在输入文件中声明要传递给odb的多少个sdv。