Matlab Bindings
The main binding to the Libisis framework which has been implemented is matlab. Each type defined in the framework has a module which contains type-specific methods for getting objects and variables from the matlab front-end and sending objects and variables back to the matlab front-end. These methods are called using two interfaces which are defined in a module IXMm_classname.
- IXBgetFromBinding
- IXBsendToBinding
This module is always defined in the file bindings/matlab/IXMclassname_m.f90. As a rule this module always contains the line use IXMclassname (it is however included automatically and does not need to be explicitly specified in the code)
The interfaces and methods of the IXMm_classname module are generated automatically using the preprocessor, in the following example for the IXTtestclass object in the IXMtestclass_m.f90 file. These are the only statements required to define the IXMm_testclass module.
module IXMm_testclass #define IXD_TYPE testclass #include "bindings_header.f90" contains #define IXD_TYPE testclass #include "bindings_base.f90" end module IXMm_testclass
If a class method implemented in the fortran framework is to be called from the matlab front-end various steps need to be followed.
define an appropriate binding subroutine in IXMclassname_m.f90
functions which are called from matlab are defined in the same file but outside of the IXMm_classname module. They are all prefixed with IXB. all the standard functions which are called such as IXBdisplay_classname, IXBcheck_classname are auto-generated using the preprocessor, so do not need any extra implementation.
#define IXD_TYPE testclass #include "bindings_extra.f90"
only functions which are extra to the standard module subroutines which you need to call from matlab have to have a binding subroutine defined.
subroutine IXBplus_Testclass(nlhs, plhs, nrhs, prhs, status) use IXMm_testclass use IXMmatlab_interface implicit none integer :: nlhs, nrhs integer(cpointer_t) :: plhs(nlhs), prhs(nrhs) type (IXTtestclass) :: wres, w1, w2 type(IXTstatus) :: status ! read in two structures which will be added together ! wres has been created empty with type statement call IXBgetFromBinding(prhs(2),' ', 1, 0, w1, status) call IXBgetFromBinding(prhs(3),' ', 1, 0, w2, status) ! check read went OK - report errors and return if not if (status == IXCseverity_error) return ! do adding operation call IXFplus_testclass(wres, w1, w2, status) ! wres has now been filled and needs to be entered into the matlab memory if (status == IXCseverity_error) then plhs(1)=ixDuplicateArray(prhs(1)) else call IXBsendToBinding(plhs(1), prhs(1), ' ', 1, 0, wres, status) endif end subroutine