I am trying something simpler. I added a function in the f90 file that call the relevant function in order to remove the issue of having optional arguments. Hence, I wrote:
FUNCTION DKL_4_SIMPLE(NVAR,DDES,DELAYS,HISTORY,TSPAN) RESULT (SOL) ! Both BETA and HISTORY are user supplied vectors. ! .. Function Return Value .. ! TYPE (DDE_SOL), TARGET :: SOL DOUBLE PRECISION :: SOL_d TYPE (DDE_SOL), TARGET :: SOL ! .. ! .. Array Arguments .. DOUBLE PRECISION, DIMENSION(2) :: TSPAN INTEGER, DIMENSION(2) :: NVAR DOUBLE PRECISION, DIMENSION(NVAR(1)) :: DELAYS DOUBLE PRECISION, DIMENSION(NVAR(2)) :: HISTORY INTERFACE SUBROUTINE DDES(T,Y,Z,DY) DOUBLE PRECISION :: T DOUBLE PRECISION, DIMENSION(:) :: Y,DY DOUBLE PRECISION, DIMENSION(:,:) :: Z INTENT(IN):: T,Y,Z INTENT(OUT) :: DY END SUBROUTINE DDES END INTERFACE ! ! PRINT *, '--> ENTRY dans DDE_SIMPLE' ! PRINT *, 'NVAR = ',NVAR(1) ! SOL = DKL_4(NVAR,DDES,DELAYS,HISTORY,TSPAN) SOL_d = 1.2D0 PRINT *, 'NVAR = ', NVAR(1),NVAR(2) PRINT *, 'TSPAN = ', TSPAN PRINT *, 'DELAYS = ', DELAYS PRINT *, 'HISTORY = ', HISTORY SOL = DKL_4(NVAR,DDES,DELAYS,HISTORY,TSPAN) PRINT *, 'DDE_SIMPLE done!' PRINT *, SOL%T RETURN END FUNCTION DKL_4_SIMPLE In passing, I check the values contained in OPTS and in SOL. I realised I have an issue with specifying the structure. For example, I wrap the type TYPE, PUBLIC :: DDE_OPTS LOGICAL, DIMENSION (:), POINTER :: ISTERMINAL INTEGER, DIMENSION (:), POINTER :: DIRECTION DOUBLE PRECISION :: HINIT, HMAX DOUBLE PRECISION, DIMENSION (:), POINTER :: ABSERR, RELERR, JUMPS LOGICAL :: NEUTRAL, TRACK_DISCONTINUITIES, INTERPOLATION INTEGER :: TRACKING_LEVEL, MAX_EVENTS, MAX_STEPS, MOVING_AVERAGE DOUBLE PRECISION, DIMENSION (:), POINTER :: THIT_EXACTLY END TYPE DDE_OPTS with type DDE_OPTS ISTERMINAL::Ptr{Bool}# = true DIRECTION::Ptr{Cint}# = C_NULL HINIT::Cdouble# = 0. HMAX::Cdouble# = 0. ABSERR::Cdouble # = C_NULL RELERR::Ptr{Cint}# = C_NULL JUMPS::Ptr{Cint}# = C_NULL NEUTRAL::Bool# = true TRACK_DISCONTINUITIES::Bool# = true INTERPOLATION::Bool# = true TRACKING_LEVEL::Cint# = 0 MAX_EVENTS::Cint# = 0 MAX_STEPS::Cint# = 0 MOVING_AVERAGE::Cint THIT_EXACTLY::Ptr{Cdouble}# = C_NULL end However when calling the library, I check with a PRINT internal values of OPT does not correspond to what is seen by my julia code. Is my julia type not good enough?