在Linux上从Intel Fortran调用Matlab

时间:2015-10-01 13:53:40

标签: linux matlab fortran intel-fortran

Editted:

这是基于我之前的question

有了答案,我可以编译并运行gfortran然而,我仍然无法使用ifort运行。我用来在tcsh中编译的命令是:

#include "fintrf.h"
C
#if 0
C
C     fengdemo.F
C     .F file need to be preprocessed to generate .for equivalent
C
#endif
C
C     fengdemo.f
C
C     This is a simple program that illustrates how to call the MATLAB
C     Engine functions from a FORTRAN program.
C
C Copyright 1984-2011 The MathWorks, Inc.
C======================================================================
C 

      program main

C     Declarations
      implicit none

      mwPointer engOpen, engGetVariable, mxCreateDoubleMatrix
      mwPointer mxGetPr
      mwPointer ep, T, D 
      double precision time(10), dist(10)
      integer engPutVariable, engEvalString, engClose
      integer temp, status
      mwSize i
      data time / 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 /

      mwSize M, N
      parameter(M=1) 
      parameter(N=10) 

C
      ep = engOpen('matlab ')
C
      if (ep .eq. 0) then
         write(6,*) 'Can''t start MATLAB engine'
         stop
      endif
C
      T = mxCreateDoubleMatrix(M, N, 0)
      call mxCopyReal8ToPtr(time, mxGetPr(T), N)
C
C
C     Place the variable T into the MATLAB workspace
C
      status = engPutVariable(ep, 'T', T)
C
      if (status .ne. 0) then 
         write(6,*) 'engPutVariable failed'
         stop
      endif
C
C
C     Evaluate a function of time, distance = (1/2)g.*t.^2
C     (g is the acceleration due to gravity)
C     
      if (engEvalString(ep, 'D = .5.*(-9.8).*T.^2;') .ne. 0) then
         write(6,*) 'engEvalString failed'
         stop
      endif
C
C
C     Plot the result
C
      if (engEvalString(ep, 'plot(T,D);') .ne. 0) then 
       write(6,*) 'engEvalString failed'
         stop
      endif

      if (engEvalString(ep, 'title(''Position vs. Time'')') .ne. 0) then
          write(6,*) 'engEvalString failed'
          stop
      endif

      if (engEvalString(ep, 'xlabel(''Time (seconds)'')') .ne. 0) then
          write(6,*) 'engEvalString failed'
          stop
      endif
      if (engEvalString(ep, 'ylabel(''Position (meters)'')') .ne. 0)then
          write(6,*) 'engEvalString failed'
          stop
      endif
C     
C     
C     read from console to make sure that we pause long enough to be
C     able to see the plot
C     
      print *, 'Type 0 <return> to Exit'
      print *, 'Type 1 <return> to continue'

      read(*,*) temp
C
      if (temp.eq.0) then
         print *, 'EXIT!'
         status = engClose(ep)

         if (status .ne. 0) then 
            write(6,*) 'engClose failed'
         endif

         stop
      end if
C
      if (engEvalString(ep, 'close;') .ne. 0) then
         write(6,*) 'engEvalString failed'
         stop
      endif 
C      
      D = engGetVariable(ep, 'D')
      call mxCopyPtrToReal8(mxGetPr(D), dist, N)
      print *, 'MATLAB computed the following distances:'
      print *, '  time(s)  distance(m)'
      do 10 i=1,10
         print 20, time(i), dist(i)
 20      format(' ', G10.3, G10.3)
 10   continue
C   
C     
      call mxDestroyArray(T)
      call mxDestroyArray(D)
      status = engClose(ep)
C      
      if (status .ne. 0) then 
         write(6,*) 'engClose failed'
         stop
      endif
C
      stop
      end

我是否需要更改我使用的库?到Fortran代码?或者是Matlab代码?

任何帮助都将不胜感激。

Fortran代码是:

-g

使用-tracebackforrtl: severe (174): SIGSEGV, segmentation fault occurred Image PC Routine Line Source FEngDemo 0000000000477619 Unknown Unknown Unknown FEngDemo 0000000000475EEE Unknown Unknown Unknown FEngDemo 000000000044D8F2 Unknown Unknown Unknown FEngDemo 0000000000431573 Unknown Unknown Unknown FEngDemo 00000000004041FB Unknown Unknown Unknown libpthread.so.0 0000003E1D80F790 Unknown Unknown Unknown libmx.so 00007F5F077FCED7 Unknown Unknown Unknown FEngDemo 00000000004032ED MAIN__ 46 fengdemo.F FEngDemo 0000000000403186 Unknown Unknown Unknown libc.so.6 0000003E1D01ED5D Unknown Unknown Unknown FEngDemo 0000000000403009 Unknown Unknown Unknown 标志,我在运行时得到的错误是:

Public Aone(1 To 9) As Variant
Aone = Array(0.47589, 0.23795, 0.16656, 0.16656, 0.03569, 0.04759, 0.00119, 0.00119, 0.00119)

0 个答案:

没有答案