您的位置:首页 > 编程语言 > MATLAB

Visual Fortran 中使用Matlab引擎心得

2004-08-03 01:07 711 查看
source:http://www.simwe.com/cgi-bin/ut/topic_show.cgi?id=16634&h=1&bpg=1&age=-1

#1.安装
软件版本:
Compaq Visual Fortran(以下简称CVF)6.5
Matlab 6.1
安装路径:
CVF: C:/Program Files/Microsoft Visual Studio
Matlab: D:/matlab
#2.配置mex
在matlab下运行命令mex –setup,然后按提示选择CVF编译器
#3.配置编译环境
有两种选择
(1)Matlab下编译
(假设matlab安装目录为 %matlab%)
1.打开%matlab%/bin/win32/mexopts/df60engmatopts.bat
将13行中的 set DF_ROOT=%DF_ROOT %
改为set DF_ROOT =C:/Program Files/Microsoft Visual Studio (CVF安装目录)
2.将matlab的工作目录改为你的fortran源代码存放的目录
3.在matlab下运行 mex –f df60engmatopts.bat exsample.for
(假设源文件为exsample.for 其中有关于matlab引擎的操作)
(2)CVF下编译
1.新建一个项目
2.在tools->directory 里设置 include 和 lib目录
记住要包括以下目录
include ->C:/Program Files/Microsoft Visual Studio/DF98/Include
include->C:/Program Files/Microsoft Visual Studio/DF98/IMSL/Include
include->D:/MATLAB/EXTERN/INCLUDE

lib->D:/MATLAB/EXTERN/LIB/WIN32
lib->D:/MATLAB/EXTERN/LIB/WIN32/DIGITAL/DF60
lib->C:/Program Files/Microsoft Visual Studio/DF98/IMSL/Lib
lib->C:/Program Files/Microsoft Visual Studio/DF98/Lib
3. 在project->setting->link->Object/library modules里添加libmx.lib libmat.
lib libeng.lib

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

1。上面提到的无法定位程序输入点 的错误。
因为我是用的matlab自带的一个例程,出现这个错误肯定是自己系统的问题。不知道别人有没有遇到过。在这里发问,没结果呀。我就用“无法定位程序输入点”在“百度”上搜,查到一个mm在玩某个游戏的时候也遇到这样错误,解决的办法就是把提到的那个dll文件名前加_,如libeng.dll改为_libeng.dll,照这样按照出错提示把c:/winnt/system32中的libeng.dll、libmx.dll、libut.dll都改了一遍,再编译运行,搞定。
2。我要做的其实是想借Matlab中的用符号运算解一个二元三次方程组来求八节点等参单元中给定点整体坐标对应的局部坐标。主要就是根据matlab中的fengdemo.f来加入自己的东西,其实也很简单,一些小的地方要注意。开始的时候老是编译不通过,一度都要放弃了,因为用到Symbolic Math Toolbox中的solve,以为不支持。偶尔看fengdemo.f的源程序,在用到engEvalString时输入到matlab中的单引号(')都是用2个单引号('')来表示的,错就在这里,统统改掉,就可以了。
Matlab中的计算结果: 0.99433792247939 0.92631964961160
Fortran中调用结果: 0.994337897515527 0.926319366356284
差一点,双精度的
3。我的源程序
! XSHHN 2004.6.22
program main
double precision ElementCod(16),InquireCod(2),LocalCod(2)
DATA ElementCod/-6.75000E+00,-6.75000E+00,-6.2500,-6.25000E+00,&
& -6.75000E+00,-6.50000E+00,-6.25000E+00,-6.50000E+00,&
& 1.00000E+01,9.50000E+00,9.50000E+00,1.00000E+01,&
& 9.75000E+00,9.50000E+00,9.75000E+00,1.00000E+01/ !一组八节点单元节点坐标
data InquireCod/-6.3,9.55/ !需查询的单元内整体坐标
data LocalCod/2*0/ !查询到的单元内局部坐标
call InquireLocalCod(ElementCod,InquireCod,LocalCod)
write(*,*)LocalCod
end

!调用MATLAB查询局部坐标的子程序
subroutine InquireLocalCod(ElementCod,InquireCod,LocalCod)
double precision ElementCod(16),InquireCod(2),LocalCod(2)
integer engOpen,engGetVariable,mxCreateDoubleMatrix
integer engPutVariable, engEvalString, engClose
integer mxGetPr
integer ep,EC,IC,LC
integer status
write(*,*)ElementCod,InquireCod,LocalCod
ep=engOpen('matlab') !打开Matlab引擎
if (ep.eq.0) then
write(6,*)'Can''t start MATLAB engine'
stop
endif
EC=mxCreateDoubleMatrix(1,16,0) !建立mxArray
call mxCopyReal8ToPtr(ElementCod,mxGetPr(EC),16)
IC=mxCreateDoubleMatrix(1,2,0)
call mxCopyReal8ToPtr(InquireCod,mxGetPr(IC),2)
status = engPutVariable(ep,'EC',EC) !将mxArray送入Matlab
if (status.ne.0) then
write(6,*)'engPutVariable failed1'
stop
endif
status=engPutVariable(ep,'IC',IC) !将mxArray送入Matlab
if (status.ne.0) then
write(6,*)'engPutVariable failed2'
stop
endif
if (engEvalString(ep, 'syms r s;') .ne. 0) then !在这里就开始调用Symbolic Math Toolbox了
write(6,*) 'engEvalString failed3'
stop
endif
!下面开始向Matlab中输入8节点等参单元的形函数,注意在Matlab中的“'”要表示成“''”
mmm=engEvalString(ep,'N1=sym(''(1-r)*(1-s)*(-r-s-1)/4'')')
mmm=engEvalString(ep,'N2=sym(''(1+r)*(1-s)*(r-s-1)/4'')')
mmm=engEvalString(ep, 'N3=sym(''(1+r)*(1+s)*(r+s-1)/4'')')
mmm=engEvalString(ep, 'N4=sym(''(1-r)*(1+s)*(-r+s-1)/4'')')
mmm=engEvalString(ep, 'N5=sym(''(1-r^2)*(1-s)/2'')')
mmm=engEvalString(ep, 'N6=sym(''(1+r)*(1-s^2)/2'')')
mmm=engEvalString(ep, 'N7=sym(''(1-r^2)*(1+s)/2'')')
mmm=engEvalString(ep, 'N8=sym(''(1-r)*(1+s^2)/2'')')
mmm=engEvalString(ep, 'x=0')
mmm=engEvalString(ep, 'y=0')
mmm=engEvalString(ep, 'x=x+N1*EC(1)+N2*EC(2)+N3*EC(3)+N4*EC(4)')
mmm=engEvalString(ep, 'x=x+N5*EC(5)+N6*EC(6)+N7*EC(7)+N8*EC(8)')
mmm=engEvalString(ep, 'y=y+N1*EC(9)+N2*EC(10)+N3*EC(11)+N4*EC(12)')
mmm=engEvalString(ep, 'y=y+N5*EC(13)+N6*EC(14)+N7*EC(15)+N8*EC(16)')
mmm=engEvalString(ep, 'x=x-IC(1)')
mmm=engEvalString(ep, 'y=y-IC(2)')
mmm=engEvalString(ep, '[r,s]=solve(x,y)') !这里是最关键的,就是用solve解方程啊
mmm=engEvalString(ep, 'LC=[eval(r(1)) eval(s(1))]')
LC=engGetVariable(ep,'LC')
call mxCopyPtrToReal8(mxGetPr(LC), LocalCod, 2)
write(*,*)LocalCod !看看结果


call mxDestroyArray(EC) !回收内存
call mxDestroyArray(IC)
call mxDestroyArray(LC)
status = engClose(ep) !关闭Matlab引擎
if (status .ne. 0) then
write(6,*) 'engClose failed'
stop
endif
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: