J'ai essaye d'utiliser ce code disponible sur un site pour voir si il est possible d’appeler un code matlab a partir d'un Fortran; mais j'ai eu ces erreurs. Voila le code :
#include "fintrf.h"
C
#if 0
C
C test.F
C .F file need to be preprocessed to generate .for equivalent
C
#endif
C
C test.F
C
C This is a simple program modified from a sample code that
C illustrates how to call the MATLAB Engine functions.
C
C NASA Ames Research Center
C======================================================================
C 2015/7/7
program main
USE mpi
C Declarations
implicit none
C#USE mpi
C-----------------------------------------------------------------------
C (pointer) Replace integer by integer*8 on 64-bit platforms
C
25 mwpointer engOpen, engGetVariable, mxCreateDoubleMatrix
26 mwpointer mxGetPr
27 mwpointer ep, DPtr, sPtr
C----------------------------------------------------------------------
C
C Other variable declarations here
31 integer, parameter :: n=3, M=12
32 double precision D(n,n), Darray(n,n,M), s
33 integer engPutVariable, engEvalString, engClose
34 integer i,k, temp, status
35 integer :: ierror, size, rank, MPI_COMM_WORLD
C
C MPI initilization
38 call MPI_INIT(ierror)
39 call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
40 call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
ep = engOpen('matlab ')
C
43 if (ep .eq. 0) then
44 write(6,*) 'Can''t start MATLAB engine'
45 stop
46 endif
C
C Define the pointer of a Matlab scalar
sPtr = mxCreateDoubleMatrix(1, 1, 0)
C Obtain the value of k from a routine (here it is just random generator k = IRAND(rank)
C Copy Fortran value k to Matlab array mxGetPr(sPtr)
call mxCopyReal8ToPtr(dble(k), mxGetPr(sPtr), 1)
55 status = engPutVariable(ep, 's', sPtr)
56 if (status .ne. 0) write(*,*)"FAIL!!! engPutVariable s"
C
C Compute via matlab function : sampleFn
if (engEvalString(ep, 'D = sampleFn(s);') .ne. 0) then
60 write(6,*) 'engEvalString failed'
61 stop
62 endif
C
C Bring pointer back to Fortran
DPtr = engGetVariable(ep, "D")
call mxCopyPtrToReal8(mxGetPr(DPtr), D, n*n)
C The MPI master can gather all D's to Darray
C via MPI_Send/Recv or MPI_Gather or MPI_Reduce
C Darray(:,:,k) <= D(:,:)
C
72 print *, 'Print results created by Matlab :'
73 do i=1,n
74 write(*,*) D(:,i)
75 enddo
76 write(*,*) " "
C
C
79 call mxDestroyArray(sPtr)
80 call mxDestroyArray(DPtr)
81 status = engClose(ep)
C
83 if (status .ne. 0) then
84 write(6,*) 'engClose failed'
85 stop
86 endif
87 call MPI_Finalize(ierror)
C
89 stop
90 end
et voila les erreurs que j'ai recu
Error using mex
test.obj : error LNK2019: symbole externe non résolu MPI_INIT référencé dans la fonction MAIN__
test.obj : error LNK2019: symbole externe non résolu MPI_COMM_SIZE référencé dans la fonction MAIN__
test.obj : error LNK2019: symbole externe non résolu MPI_COMM_RANK référencé dans la fonction MAIN__
test.obj : error LNK2019: symbole externe non résolu MPI_FINALIZE référencé dans la fonction MAIN__
test.exe : fatal error LNK1120: 4 externes non résolus
on dirait plus un problème de lien avec MPI qu'un problème de Matlab. Est-ce que tu compiles bien avec mpifort/mpif90 ou son équivalent windows ? Peut-être faudra-t-il inclure le header correspondant. Si tu veux juste faire le lien, tu peux peut-être aussi virer les routines MPI ?
Edit: j'ai vu le use MPI
- Edité par Nozio 8 mai 2018 à 20:52:39
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...
Fortran et Matlab
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Avez-vous entendu parler de Julia ? Laissez-vous tenter ...