FORTRAN调用MATLAB

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1。上面提到的无法定位程序输入点 的错误。
因为我是用的matlab自带的一个例程,出现这个错误肯定是自己系统的问题。不知道别人有没有遇到过。在这里发问,没遇到这样错误,解决的办法就是把提到的那个dll文件名前加_,如libeng.dll改为_libeng.dll,照这样按照出错提示把c:\winnt\system32中的libeng.dll、libmx.dll、libut.dll都改了一遍,再编译运行,搞定。
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)
endif
end
发现了一遍文章是介绍这方面内容的,但我按照它的例子没有编译过去
请指点一下吧
……………………………………………………………………………………
*************************************************
* *
* 一、Visual Fortran中使用Matlab引擎 *
* *
*************************************************
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)
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'')')
source:/cgi-bin/ut/topic_show.cgi?id=16634&h=1&bpg=1&age=-1
#1.安装
软件版本:
Compaq Visual Fortran(以下简称CVF)6.5
Matlab 6.1
安装路径:
if (status.ne.0) then
write(6,*)'engPutVariable failed2'
stop
endif
if (engEvalString(ep, 'syms r s;') .ne. 0) then !在这里就开始调用Symbolic Math Toolbox了
data LocalCod/2*0/ !查询到的单元内局部坐标
call InquireLocalCod(ElementCod,InquireCod,LocalCod)
write(*,*)LocalCod
end
!调用MATLAB查询局部坐标的子程序
subroutine InquireLocalCod(ElementCod,InquireCod,LocalCod)
write(6,*) 'engEvalString failed3'
stop
endif
!下面开始向Matlab中输入8节点等参单元的形函数,注意在Matlab中的“'”要表示成“''”
mmm=engEvalString(ep,'N1=sym(''(1-r)*(1-s)*(-r-s-1)/4'')')
call mxDestroyArray(LC)
status = engClose(ep) !关闭Matlab引擎
if (status .ne. 0) then
write(6,*) 'engClose failed'
stop
double precision ElementCod(16),InquireCod(2),LocalCod(2)
integer engOpen,engGetVariable,mxCreateDoubleMatrix
integer engPutVariable, engEvalString, engClose
2.将matlab的工作目录改为你的fortran源代码存放的目录
3.在matlab下运行 mex –f df60engmatopts.bat exsample.for
(假设源文件为exsample.for 其中有关于matlab引擎的操作)
(2)CVF下编译
1.新建一个项目
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'')')
2。我要做的其实是想借Matlab中的用符号运算解一个二元三次方程组来求八节点等参单元中给定点整体坐标对应的局部坐标。主要就是根据matlab中的fengdemo.f来加入自己的东西,其实也很简单,一些小的地方要注意。开始的时候老是编译不通过,一度都要放弃了,因为用到Symbolic Math Toolbox中的solve,以为不支持。偶尔看fengdemo.f的源程序,在用到engEvalString时输入到matlab中的单引号(')都是用2个单引号('')来表示的,错就在这里,统统改掉,就可以了。
& 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/ !需查询的单元内整体坐标
lib->C:\Program Files\Microsoft Visual Studio\DF98\Lib
3. 在project->setting->link->Object/library modules里添加libmx.lib libmat.
lib libeng.lib
2.在tools->directory 里设置 include 和 lib目录
记住要包括以下目录
include ->C:\Program Files\Microsoft Visual Studio\DF98\Include
include->C:\Program Files\Microsoft Visual Studio\DF98\IMSL\Include
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)')
Matlab中的计算结果: 0.99433792247939 0.92631964961160
Fortran中调用结果: 0.994337897515527 0.926319366356284
差一点,双精度的
3。我的源程序
! XSHHN 2004.6.22
program main
CVF: C:\Program Files\Microsoft Visual Studio
Matlab: D:\matlab
#2.配置mex
在matlab下运行命令mex –setup,然后按提示选择CVF编译器
#3.配置编译环境
有两种选择
(1)Matlab下编译
(假设matlab安装目录为 %matlab%)
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+*EC(13)+N6*EC(14)+N7*EC(15)+N8*EC(16)')
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
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,&
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
1.打开%matlab%\bin\win32\mexopts\df60engmatopts.bat
将13行中的 set DF_ROOT=%DF_ROOT %
改为set DF_ROOT =C:\Program Files\Microsoft Visual Studio (CVF安装目录)
相关文档
最新文档