SUBROUTINE MEXFUNCTION(NLHS, PLHS, NRHS, PRHS) IMPLICIT NONE INTEGER, PARAMETER :: PTR=4 INTEGER, PARAMETER :: DP = SELECTED_REAL_KIND(12) INTEGER(PTR) :: PLHS(*), PRHS(*) INTEGER :: NLHS, NRHS INTEGER(PTR) :: MXCREATEFULL, MXGETPR INTEGER :: MXGETM, MXGETN integer M(2), N(2) REAL(DP), ALLOCATABLE, DIMENSION(:) :: A, B REAL(DP) :: C IF (NRHS .NE. 2) THEN CALL MEXERRMSGTXT('TIMES requires two input arguments') ELSEIF (NLHS .GT. 1) THEN CALL MEXERRMSGTXT('TIMES requires one output argument') END IF M(1) = MXGETM(PRHS(1)) N(1) = MXGETN(PRHS(1)) M(2) = MXGETM(PRHS(2)) N(2) = MXGETN(PRHS(2)) IF (N(1) .NE. M(2)) THEN CALL MEXERRMSGTXT('INPUT DIMENSION MISMATCH') END IF IF (M(1) .NE. 1) THEN CALL MEXERRMSGTXT('FIRST ARGUMENT IS NOT A ROW VECTOR') END IF IF (N(2) .NE. 1) THEN CALL MEXERRMSGTXT('SECOND ARGUMENT IS NOT A COLUMN VECTOR') END IF ALLOCATE( A(N(1)), B(N(1)) ) call mxcopyptrtoreal8(mxgetpr(prhs(1)),A,N(1)) call mxcopyptrtoreal8(mxgetpr(prhs(2)),B,N(1)) plhs(1) = mxcreatefull(1,1,0) ! CALL COMPUTATIONAL ROUTINE: CALL VVMULT(A,B,C) CALL MXCOPYreal8TOPTR(C,mxgetpr(plhs(1)),1) CONTAINS ! =============================================================================== ! HERE I AM DECLARING THE INPUT ARGS TO VVMULT USING DEFERRED SHAPES (I.E. A(:)) ! THIS MEANS THAT I HAVE TO PROVIDE AN INTERFACE TO THE CALLING ROUTINE ! EITHER BY MEANS OF AN INTERFACE BLOCK IN MEXFUNCTION OR BY 'CONTAINING' ! VVMULT WITHIN MEXFUNCTION ! =============================================================================== SUBROUTINE VVMULT(A,B,C) USE NUMERICAL_LIBRARIES IMPLICIT NONE REAL(DP), INTENT(IN) :: A(:), B(:) REAL(DP), INTENT(OUT) :: C C = DDOT(SIZE(A),A,1,B,1) END SUBROUTINE VVMULT END SUBROUTINE MEXFUNCTION