本帖最后由 Sppy 于 2019-4-1 16:04 编辑
Abaqus的subroutineUMAT使用Fortran编写。 我用Fortran写了一个DLL,这个DLL使用了Matlab的计算引擎,以实现混合编程,然后Abaqus的subroutineUMAT再调用这个DLL。 为啥,我不直接在subroutineUMAT里面使用接口函数来直接调用Matlab计算引擎呢?因为,Abaqus不让用户这样做。。。
Ps. 我已经在VS里面建一个项目来实现Fortran调用Matlab引擎,这个部分没有问题
但是Abaqus编译不通过 或者使用Abaqus的makelibrary命令把subroutineUMAT制作为standardU.dll,还是失败了,提示“Interface cannot appear”啥的。。。
我不太明白的地方:subroutine UMAT代码中这样做是否正确,我参考的是新浪博客的一篇文章:http://blog.sina.com.cn/s/blog_e7a006c20102xpqz.html
DLL部分代码如下 Ps. DLL代码sub_dll.for中使用的Matlab库函数libeng.lib、libmx.lib已配置好,选择64位平台;在Build动态链接库DLL过程中,将property>fortran>libraries>runtime library设置为Debug Multithreaded (/libs:static /threads /dbglibs),编译后生产Dll1.dll,用DependencyWalker打开Dll1.dll,其下面有四个分目录: LIBENG.DLL、LIBMX.DLL、KERNEL32.DLL、IMAGEHLP.DLL [Fortran] 纯文本查看 复制代码 Subroutine dll_test01(input,output)
Implicit none
!DEC$ ATTRIBUTES DLLEXPORT,ALIAS:"dll_test01"::dll_test01
C 仅做测试用, 其逻辑为 output=intput*10; 其他代码没有展示
C 使用Matlab接口完成计算
End Subroutine dll_test01
subroutine UMAT部分代码如下 [Fortran] 纯文本查看 复制代码 !DEC$OBJCOMMENTLIB:"E:\\abaqus_program\\JC_PE_04\\Dll1.lib"
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
1 RPL,DDSDDT,DRPLDE,DRPLDT,STRAN,DSTRAN,
2 TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,MATERL,NDI,NSHR,NTENS,
3 NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT,CELENT,
4 DFGRD0,DFGRD1,NOEL,NPT,KSLAY,KSPT,KSTEP,KINC)
C
INCLUDE 'ABA_PARAM.INC'
C 仅展示部分, 其他代码没有展示
Interface
Subroutine dll_test01(SYIELD,sppy)
!DEC$ATTRIBUTES DLLIMPORT,STDCALL,ALIAS:'Dll1'::dll_test01
End Subroutine dll_test01
End Interface
STATEV(14)=sppy
END
|