! file: mkl_df.f90
!===============================================================================
! Copyright 2006-2022 Intel Corporation.
!
! This software and the related documents are Intel copyrighted  materials,  and
! your use of  them is  governed by the  express license  under which  they were
! provided to you (License).  Unless the License provides otherwise, you may not
! use, modify, copy, publish, distribute,  disclose or transmit this software or
! the related documents without Intel's prior written permission.
!
! This software and the related documents  are provided as  is,  with no express
! or implied  warranties,  other  than those  that are  expressly stated  in the
! License.
!===============================================================================

!++
!  Fortran 90 DF interface.
!--

      MODULE MKL_DF_TYPE

!++
!  Definitions for DF functions return values (errors, warnings)
!--

!  "No error" status
      INTEGER(KIND=4) DF_STATUS_OK
      PARAMETER (DF_STATUS_OK = 0)

!  Common errors (-1..-999)
      INTEGER(KIND=4) DF_ERROR_CPU_NOT_SUPPORTED
      PARAMETER (DF_ERROR_CPU_NOT_SUPPORTED             =    -1)

!  Data fitting errors (-1000..-1999)
      INTEGER(KIND=4) DF_ERROR_NULL_TASK_DESCRIPTOR
      INTEGER(KIND=4) DF_ERROR_MEM_FAILURE
      INTEGER(KIND=4) DF_ERROR_METHOD_NOT_SUPPORTED
      INTEGER(KIND=4) DF_ERROR_COMP_TYPE_NOT_SUPPORTED
      INTEGER(KIND=4) DF_ERROR_NULL_PTR
      INTEGER(KIND=4) DF_ERROR_BAD_NX
      INTEGER(KIND=4) DF_ERROR_BAD_X
      INTEGER(KIND=4) DF_ERROR_BAD_X_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_NY
      INTEGER(KIND=4) DF_ERROR_BAD_Y
      INTEGER(KIND=4) DF_ERROR_BAD_Y_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_SPLINE_ORDER
      INTEGER(KIND=4) DF_ERROR_BAD_SPLINE_TYPE
      INTEGER(KIND=4) DF_ERROR_BAD_IC_TYPE
      INTEGER(KIND=4) DF_ERROR_BAD_IC
      INTEGER(KIND=4) DF_ERROR_BAD_BC_TYPE
      INTEGER(KIND=4) DF_ERROR_BAD_BC
      INTEGER(KIND=4) DF_ERROR_BAD_PP_COEFF
      INTEGER(KIND=4) DF_ERROR_BAD_PP_COEFF_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_PERIODIC_VAL
      INTEGER(KIND=4) DF_ERROR_BAD_DATA_ATTR
      INTEGER(KIND=4) DF_ERROR_BAD_DATA_IDX
      INTEGER(KIND=4) DF_ERROR_BAD_NSITE
      INTEGER(KIND=4) DF_ERROR_BAD_SITE
      INTEGER(KIND=4) DF_ERROR_BAD_SITE_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_NDORDER
      INTEGER(KIND=4) DF_ERROR_BAD_DORDER
      INTEGER(KIND=4) DF_ERROR_BAD_DATA_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_INTERP
      INTEGER(KIND=4) DF_ERROR_BAD_INTERP_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_CELL_IDX
      INTEGER(KIND=4) DF_ERROR_BAD_NLIM
      INTEGER(KIND=4) DF_ERROR_BAD_LLIM
      INTEGER(KIND=4) DF_ERROR_BAD_RLIM
      INTEGER(KIND=4) DF_ERROR_BAD_INTEGR
      INTEGER(KIND=4) DF_ERROR_BAD_INTEGR_HINT
      INTEGER(KIND=4) DF_ERROR_BAD_LOOKUP_INTERP_SITE
      INTEGER(KIND=4) DF_ERROR_BAD_CHECK_FLAG
      PARAMETER (DF_ERROR_NULL_TASK_DESCRIPTOR          = -1000)
      PARAMETER (DF_ERROR_MEM_FAILURE                   = -1001)
      PARAMETER (DF_ERROR_METHOD_NOT_SUPPORTED          = -1002)
      PARAMETER (DF_ERROR_COMP_TYPE_NOT_SUPPORTED       = -1003)
      PARAMETER (DF_ERROR_NULL_PTR                      = -1037)
      PARAMETER (DF_ERROR_BAD_NX                        = -1004)
      PARAMETER (DF_ERROR_BAD_X                         = -1005)
      PARAMETER (DF_ERROR_BAD_X_HINT                    = -1006)
      PARAMETER (DF_ERROR_BAD_NY                        = -1007)
      PARAMETER (DF_ERROR_BAD_Y                         = -1008)
      PARAMETER (DF_ERROR_BAD_Y_HINT                    = -1009)
      PARAMETER (DF_ERROR_BAD_SPLINE_ORDER              = -1010)
      PARAMETER (DF_ERROR_BAD_SPLINE_TYPE               = -1011)
      PARAMETER (DF_ERROR_BAD_IC_TYPE                   = -1012)
      PARAMETER (DF_ERROR_BAD_IC                        = -1013)
      PARAMETER (DF_ERROR_BAD_BC_TYPE                   = -1014)
      PARAMETER (DF_ERROR_BAD_BC                        = -1015)
      PARAMETER (DF_ERROR_BAD_PP_COEFF                  = -1016)
      PARAMETER (DF_ERROR_BAD_PP_COEFF_HINT             = -1017)
      PARAMETER (DF_ERROR_BAD_PERIODIC_VAL              = -1018)
      PARAMETER (DF_ERROR_BAD_DATA_ATTR                 = -1019)
      PARAMETER (DF_ERROR_BAD_DATA_IDX                  = -1020)
      PARAMETER (DF_ERROR_BAD_NSITE                     = -1021)
      PARAMETER (DF_ERROR_BAD_SITE                      = -1022)
      PARAMETER (DF_ERROR_BAD_SITE_HINT                 = -1023)
      PARAMETER (DF_ERROR_BAD_NDORDER                   = -1024)
      PARAMETER (DF_ERROR_BAD_DORDER                    = -1025)
      PARAMETER (DF_ERROR_BAD_DATA_HINT                 = -1026)
      PARAMETER (DF_ERROR_BAD_INTERP                    = -1027)
      PARAMETER (DF_ERROR_BAD_INTERP_HINT               = -1028)
      PARAMETER (DF_ERROR_BAD_CELL_IDX                  = -1029)
      PARAMETER (DF_ERROR_BAD_NLIM                      = -1030)
      PARAMETER (DF_ERROR_BAD_LLIM                      = -1031)
      PARAMETER (DF_ERROR_BAD_RLIM                      = -1032)
      PARAMETER (DF_ERROR_BAD_INTEGR                    = -1033)
      PARAMETER (DF_ERROR_BAD_INTEGR_HINT               = -1034)
      PARAMETER (DF_ERROR_BAD_LOOKUP_INTERP_SITE        = -1035)
      PARAMETER (DF_ERROR_BAD_CHECK_FLAG                = -1036)

!  Internal errors caused by internal routines of the functions
      INTEGER(KIND=4) VSL_DF_ERROR_INTERNAL_C1
      INTEGER(KIND=4) VSL_DF_ERROR_INTERNAL_C2
      PARAMETER (VSL_DF_ERROR_INTERNAL_C1               = -1500)
      PARAMETER (VSL_DF_ERROR_INTERNAL_C2               = -1501)

!  User-defined callback status
      INTEGER(KIND=4) DF_STATUS_EXACT_RESULT
      PARAMETER (DF_STATUS_EXACT_RESULT                 = 1000)

!++
!  MACROS USED IN DATA FITTING EDIT AND COMPUTE ROUTINES
!--

!  DF EditTask routine is way to edit input and output parameters of the task
!  Macros below define parameters available for modification
      INTEGER DF_X
      INTEGER DF_Y
      INTEGER DF_IC
      INTEGER DF_BC
      INTEGER DF_PP_SCOEFF
      INTEGER DF_NX
      INTEGER DF_XHINT
      INTEGER DF_NY
      INTEGER DF_YHINT
      INTEGER DF_SPLINE_ORDER
      INTEGER DF_SPLINE_TYPE
      INTEGER DF_IC_TYPE
      INTEGER DF_BC_TYPE
      INTEGER DF_PP_COEFF_HINT
      INTEGER DF_CHECK_FLAG
      PARAMETER (DF_X                                      =  1)
      PARAMETER (DF_Y                                      =  2)
      PARAMETER (DF_IC                                     =  3)
      PARAMETER (DF_BC                                     =  4)
      PARAMETER (DF_PP_SCOEFF                              =  5)
      PARAMETER (DF_NX                                     = 14)
      PARAMETER (DF_XHINT                                  = 15)
      PARAMETER (DF_NY                                     = 16)
      PARAMETER (DF_YHINT                                  = 17)
      PARAMETER (DF_SPLINE_ORDER                           = 18)
      PARAMETER (DF_SPLINE_TYPE                            = 19)
      PARAMETER (DF_IC_TYPE                                = 20)
      PARAMETER (DF_BC_TYPE                                = 21)
      PARAMETER (DF_PP_COEFF_HINT                          = 22)
      PARAMETER (DF_CHECK_FLAG                             = 23)

!++
!  SPLINE ORDERS SUPPORTED IN DATA FITTING ROUTINES
!--
      INTEGER(KIND=4) DF_PP_STD
      INTEGER(KIND=4) DF_PP_LINEAR
      INTEGER(KIND=4) DF_PP_QUADRATIC
      INTEGER(KIND=4) DF_PP_CUBIC
      PARAMETER (DF_PP_STD                                 =  0)
      PARAMETER (DF_PP_LINEAR                              =  2)
      PARAMETER (DF_PP_QUADRATIC                           =  3)
      PARAMETER (DF_PP_CUBIC                               =  4)

!++
!  SPLINE TYPES SUPPORTED IN DATA FITTING ROUTINES
!--

      INTEGER(KIND=4) DF_PP_DEFAULT
      INTEGER(KIND=4) DF_PP_SUBBOTIN
      INTEGER(KIND=4) DF_PP_NATURAL
      INTEGER(KIND=4) DF_PP_HERMITE
      INTEGER(KIND=4) DF_PP_BESSEL
      INTEGER(KIND=4) DF_PP_AKIMA
      INTEGER(KIND=4) DF_LOOKUP_INTERPOLANT
      INTEGER(KIND=4) DF_CR_STEPWISE_CONST_INTERPOLANT
      INTEGER(KIND=4) DF_CL_STEPWISE_CONST_INTERPOLANT
      INTEGER(KIND=4) DF_PP_HYMAN
      PARAMETER (DF_PP_DEFAULT                             =  0)
      PARAMETER (DF_PP_SUBBOTIN                            =  1)
      PARAMETER (DF_PP_NATURAL                             =  2)
      PARAMETER (DF_PP_HERMITE                             =  3)
      PARAMETER (DF_PP_BESSEL                              =  4)
      PARAMETER (DF_PP_AKIMA                               =  5)
      PARAMETER (DF_LOOKUP_INTERPOLANT                     =  6)
      PARAMETER (DF_CR_STEPWISE_CONST_INTERPOLANT          =  7)
      PARAMETER (DF_CL_STEPWISE_CONST_INTERPOLANT          =  8)
      PARAMETER (DF_PP_HYMAN                               =  9)

!++
!  TYPES OF BOUNDARY CONDITIONS USED IN SPLINE CONSTRUCTION
!--
      INTEGER DF_NO_BC
      INTEGER DF_BC_NOT_A_KNOT
      INTEGER DF_BC_FREE_END
      INTEGER DF_BC_1ST_LEFT_DER
      INTEGER DF_BC_1ST_RIGHT_DER
      INTEGER DF_BC_2ND_LEFT_DER
      INTEGER DF_BC_2ND_RIGHT_DER
      INTEGER DF_BC_PERIODIC
      INTEGER DF_BC_Q_VAL
      PARAMETER (DF_NO_BC                                 =   0)
      PARAMETER (DF_BC_NOT_A_KNOT                         =   1)
      PARAMETER (DF_BC_FREE_END                           =   2)
      PARAMETER (DF_BC_1ST_LEFT_DER                       =   4)
      PARAMETER (DF_BC_1ST_RIGHT_DER                      =   8)
      PARAMETER (DF_BC_2ND_LEFT_DER                       =  16)
      PARAMETER (DF_BC_2ND_RIGHT_DER                      =  32)
      PARAMETER (DF_BC_PERIODIC                           =  64)
      PARAMETER (DF_BC_Q_VAL                              = 128)

!++
!  TYPES OF INTERNAL CONDITIONS USED IN SPLINE CONSTRUCTION
!--
      INTEGER DF_NO_IC
      INTEGER DF_IC_1ST_DER
      INTEGER DF_IC_2ND_DER
      INTEGER DF_IC_Q_KNOT
      PARAMETER (DF_NO_IC                                  =  0)
      PARAMETER (DF_IC_1ST_DER                             =  1)
      PARAMETER (DF_IC_2ND_DER                             =  2)
      PARAMETER (DF_IC_Q_KNOT                              =  8)

!++
!  TYPES OF SUPPORTED HINTS
!--
      INTEGER(KIND=4) DF_NO_HINT
      INTEGER(KIND=4) DF_NON_UNIFORM_PARTITION
      INTEGER(KIND=4) DF_QUASI_UNIFORM_PARTITION
      INTEGER(KIND=4) DF_UNIFORM_PARTITION
      INTEGER(KIND=4) DF_MATRIX_STORAGE_ROWS
      INTEGER(KIND=4) DF_MATRIX_STORAGE_COLS
      INTEGER(KIND=4) DF_SORTED_DATA
      INTEGER(KIND=4) DF_1ST_COORDINATE
      INTEGER(KIND=4) DF_MATRIX_STORAGE_FUNCS_SITES_DERS
      INTEGER(KIND=4) DF_MATRIX_STORAGE_FUNCS_DERS_SITES
      INTEGER(KIND=4) DF_MATRIX_STORAGE_SITES_FUNCS_DERS
      INTEGER(KIND=4) DF_MATRIX_STORAGE_SITES_DERS_FUNCS
      PARAMETER (DF_NO_HINT                       = INT(Z"00000000", 4))
      PARAMETER (DF_NON_UNIFORM_PARTITION         = INT(Z"00000001", 4))
      PARAMETER (DF_QUASI_UNIFORM_PARTITION       = INT(Z"00000002", 4))
      PARAMETER (DF_UNIFORM_PARTITION             = INT(Z"00000004", 4))
      PARAMETER (DF_MATRIX_STORAGE_ROWS           = INT(Z"00000010", 4))
      PARAMETER (DF_MATRIX_STORAGE_COLS           = INT(Z"00000020", 4))
      PARAMETER (DF_SORTED_DATA                   = INT(Z"00000040", 4))
      PARAMETER (DF_1ST_COORDINATE                = INT(Z"00000080", 4))
      PARAMETER (DF_MATRIX_STORAGE_FUNCS_SITES_DERS =                   &
     &                                     DF_MATRIX_STORAGE_ROWS)
      PARAMETER (DF_MATRIX_STORAGE_FUNCS_DERS_SITES =                   &
     &                                     DF_MATRIX_STORAGE_COLS)
      PARAMETER (DF_MATRIX_STORAGE_SITES_FUNCS_DERS =                   &
     &                                      INT(Z"00000100", 4))
      PARAMETER (DF_MATRIX_STORAGE_SITES_DERS_FUNCS =                   &
     &                                      INT(Z"00000200", 4))

!++
!  TYPES OF APRIORI INFORMATION ABOUT DATA STRUCTURE
!--

      INTEGER(KIND=4) DF_NO_APRIORI_INFO
      INTEGER(KIND=4) DF_APRIORI_MOST_LIKELY_CELL
      PARAMETER (DF_NO_APRIORI_INFO               = INT(Z"00000000", 4))
      PARAMETER (DF_APRIORI_MOST_LIKELY_CELL      = INT(Z"00000001", 4))

!++
!  ESTIMATES TO BE COMUTED WITH DATA FITTING COMPUTE ROUTINE
!--

      INTEGER(KIND=4) DF_INTERP
      INTEGER(KIND=4) DF_CELL
      INTEGER(KIND=4) DF_INTERP_USER_CELL
      PARAMETER (DF_INTERP                        = INT(Z"00000001", 4))
      PARAMETER (DF_CELL                          = INT(Z"00000002", 4))
      PARAMETER (DF_INTERP_USER_CELL              = INT(Z"00000004", 4))

!++
!  METHODS TO BE USED FOR EVALUATION OF THE SPLINE RELATED ESTIMATES
!--

      INTEGER DF_METHOD_STD
      INTEGER DF_METHOD_PP
      PARAMETER (DF_METHOD_STD                            =   0)
      PARAMETER (DF_METHOD_PP                             =   1)

!++
! POSSIBLE VALUES FOR DF_CHECK_FLAG
!--

      INTEGER DF_ENABLE_CHECK_FLAG
      INTEGER DF_DISABLE_CHECK_FLAG
      PARAMETER (DF_ENABLE_CHECK_FLAG                     =   0)
      PARAMETER (DF_DISABLE_CHECK_FLAG                    =   1)

!++
!  SPLINE FORMATS SUPPORTED IN SPLINE CONSTRUCTION ROUTINE
!--

      INTEGER DF_PP_SPLINE
      PARAMETER (DF_PP_SPLINE                             =   0)

!++
! VALUES OF FLAG INDICATING WHICH, LEFT OR RIGHT, INTEGRATION LIMITS
! ARE PASSED BY INTEGRATION ROUTINE INTO SEARCH CALLBACK
!--

      INTEGER(KIND=4) DF_INTEGR_SEARCH_CB_LLIM_FLAG
      INTEGER(KIND=4) DF_INTEGR_SEARCH_CB_RLIM_FLAG
      PARAMETER (DF_INTEGR_SEARCH_CB_LLIM_FLAG    = INT(Z"00000000", 4))
      PARAMETER (DF_INTEGR_SEARCH_CB_RLIM_FLAG    = INT(Z"00000001", 4))

!++
!  TYPEDEFS
!--

      TYPE DF_TASK
         INTEGER(KIND=4) descriptor1
         INTEGER(KIND=4) descriptor2
      END TYPE DF_TASK

!++
!  DATA FITTING INTERPOLATION CALLBACK INTERNAL PARAMETERS STRUCTURE
!--

      TYPE DF_INTERP_CALLBACK_LIBRARY_PARAMS
         INTEGER(KIND=4) ::reserved1
      END TYPE DF_INTERP_CALLBACK_LIBRARY_PARAMS

!++
!  DATA FITTING INTEGRATION CALLBACK INTERNAL PARAMETERS STRUCTURE
!--

      TYPE DF_INTEGR_CALLBACK_LIBRARY_PARAMS
         INTEGER(KIND=4) ::reserved1
      END TYPE DF_INTEGR_CALLBACK_LIBRARY_PARAMS

!++
!  DATA FITTING SEARCH CALLBACK INTERNAL PARAMETERS STRUCTURE
!--

      TYPE DF_SEARCH_CALLBACK_LIBRARY_PARAMS
         INTEGER(KIND=4) ::limit_type_flag
      END TYPE DF_SEARCH_CALLBACK_LIBRARY_PARAMS

      END MODULE MKL_DF_TYPE

      MODULE MKL_DF

      USE MKL_DF_TYPE

!++
!  DF CONSTRUCTOR FUNCTION DECLARATIONS.
!--

!  NewTask1D - 1d task creation/initialization
      INTERFACE
         INTEGER FUNCTION dfsnewtask1d(task,nx,x,xhint,ny,y,yhint)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: nx
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: x
            INTEGER,INTENT(IN),OPTIONAL                   :: xhint
            INTEGER,INTENT(IN),OPTIONAL                   :: ny
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: y
            INTEGER,INTENT(IN),OPTIONAL                   :: yhint
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdnewtask1d(task,nx,x,xhint,ny,y,yhint)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: nx
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: x
            INTEGER,INTENT(IN),OPTIONAL                   :: xhint
            INTEGER,INTENT(IN),OPTIONAL                   :: ny
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: y
            INTEGER,INTENT(IN),OPTIONAL                   :: yhint
         END FUNCTION
      END INTERFACE

!++
!  DF EDITOR FUNCTION DECLARATIONS.
!--

!  Modifies a pointer to an array held in a Data Fitting task descriptor
      INTERFACE
         INTEGER FUNCTION dfseditptr(task,ptr_attr,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            REAL(KIND=4),DIMENSION(*),INTENT(IN) :: ptr
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdeditptr(task,ptr_attr,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            REAL(KIND=8),DIMENSION(*),INTENT(IN) :: ptr
         END FUNCTION
      END INTERFACE

!  Modifies a parameter value in a Data Fitting task descriptor
      INTERFACE
         INTEGER FUNCTION dfieditval(task,val_attr,val)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: val_attr
            INTEGER,INTENT(IN)                   :: val
         END FUNCTION
      END INTERFACE

!  Modifies a pointer to the memory representing a coordinate of the data
!  stored in matrix format (function or spline coefficients)
      INTERFACE
         INTEGER FUNCTION dfseditidxptr(task,ptr_attr,idx,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER,INTENT(IN)                   :: idx
            REAL(KIND=4),DIMENSION(*),INTENT(IN) :: ptr
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdeditidxptr(task,ptr_attr,idx,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER,INTENT(IN)                   :: idx
            REAL(KIND=8),DIMENSION(*),INTENT(IN) :: ptr
         END FUNCTION
      END INTERFACE

!  Modifies parameters of Piece-wise Polynomial (PP) spline
      INTERFACE
         INTEGER FUNCTION dfseditppspline1d(task,s_order,s_type,         &
     &                  bc_type,bc,ic_type,ic,scoeff,scoeffhint)
                USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: s_order
            INTEGER,INTENT(IN)                            :: s_type
            INTEGER,INTENT(IN),OPTIONAL                   :: bc_type
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: bc
            INTEGER,INTENT(IN),OPTIONAL                   :: ic_type
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: ic
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: scoeff
            INTEGER,INTENT(IN),OPTIONAL                   :: scoeffhint
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdeditppspline1d(task,s_order,s_type,         &
     &                  bc_type,bc,ic_type,ic,scoeff,scoeffhint)
                USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: s_order
            INTEGER,INTENT(IN)                            :: s_type
            INTEGER,INTENT(IN),OPTIONAL                   :: bc_type
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: bc
            INTEGER,INTENT(IN),OPTIONAL                   :: ic_type
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: ic
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: scoeff
            INTEGER,INTENT(IN),OPTIONAL                   :: scoeffhint
         END FUNCTION
      END INTERFACE

!++
!  DF TASK QUERYING FUNCTION DECLARATIONS.
!--

!  Reads a pointer to an array held in a Data Fitting task descriptor
      INTERFACE
         INTEGER FUNCTION dfsqueryptr(task,ptr_attr,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER(KIND=8),INTENT(OUT)          :: ptr
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdqueryptr(task,ptr_attr,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER(KIND=8),INTENT(OUT)          :: ptr
         END FUNCTION
      END INTERFACE

!  Reads a parameter value in a Data Fitting task descriptor
      INTERFACE
         INTEGER FUNCTION dfiqueryval(task,val_attr,val)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: val_attr
            INTEGER,INTENT(OUT)                  :: val
         END FUNCTION
      END INTERFACE

!  Reads a pointer to the memory representing a coordinate of the data
!  stored in matrix format (function or spline coefficients)
      INTERFACE
         INTEGER FUNCTION dfsqueryidxptr(task,ptr_attr,idx,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER,INTENT(IN)                   :: idx
            INTEGER(KIND=8),INTENT(OUT)          :: ptr
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdqueryidxptr(task,ptr_attr,idx,ptr)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                        :: task
            INTEGER,INTENT(IN)                   :: ptr_attr
            INTEGER,INTENT(IN)                   :: idx
            INTEGER(KIND=8),INTENT(OUT)          :: ptr
         END FUNCTION
      END INTERFACE

!++
!  DF COMPUTE FUNCTION DECLARATIONS.
!--

      INTERFACE
         INTEGER FUNCTION dfsconstruct1d(task,s_format,method)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)               :: task
            INTEGER,INTENT(IN)          :: s_format
            INTEGER,INTENT(IN)          :: method
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdconstruct1d(task,s_format,method)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)               :: task
            INTEGER,INTENT(IN)          :: s_format
            INTEGER,INTENT(IN)          :: method
         END FUNCTION
      END INTERFACE

!  Interpolate1d

      INTERFACE
         INTEGER FUNCTION dfsinterpolate1d(task, type, method, nsite,    &
     &    site, sitehint, ndorder, dorder, datahint, r, rhint, cell)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: type
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            INTEGER,INTENT(IN),OPTIONAL                   :: ndorder
            INTEGER, DIMENSION(*),INTENT(IN),OPTIONAL     :: dorder
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            REAL(KIND=4),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,DIMENSION(*),INTENT(OUT),OPTIONAL     :: cell
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdinterpolate1d(task, type, method, nsite,    &
     &    site, sitehint, ndorder, dorder, datahint, r, rhint, cell)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: type
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            INTEGER,INTENT(IN),OPTIONAL                   :: ndorder
            INTEGER, DIMENSION(*),INTENT(IN),OPTIONAL     :: dorder
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            REAL(KIND=8),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,DIMENSION(*),INTENT(OUT),OPTIONAL     :: cell
         END FUNCTION
      END INTERFACE

!  InterpolateEx1d

      INTERFACE
         INTEGER FUNCTION dfsinterpolateex1d(task, type, method, nsite,  &
     &    site, sitehint, ndorder, dorder, datahint, r, rhint, cell,     &
     &    le_cb, le_params, re_cb, re_params, i_cb, i_params, search_cb, &
     &    search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: type
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            INTEGER,INTENT(IN),OPTIONAL                   :: ndorder
            INTEGER, DIMENSION(*),INTENT(IN),OPTIONAL     :: dorder
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            REAL(KIND=4),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,DIMENSION(*),INTENT(OUT),OPTIONAL     :: cell
            INTEGER,EXTERNAL,OPTIONAL                     :: le_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: le_params
            INTEGER,EXTERNAL,OPTIONAL                     :: re_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: re_params
            INTEGER,EXTERNAL,OPTIONAL                     :: i_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: i_params
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdinterpolateex1d(task, type, method, nsite,  &
     &    site, sitehint, ndorder, dorder, datahint, r, rhint, cell,     &
     &    le_cb, le_params, re_cb, re_params, i_cb, i_params, search_cb, &
     &    search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: type
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            INTEGER,INTENT(IN),OPTIONAL                   :: ndorder
            INTEGER, DIMENSION(*),INTENT(IN),OPTIONAL     :: dorder
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            REAL(KIND=8),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,DIMENSION(*),INTENT(OUT),OPTIONAL     :: cell
            INTEGER,EXTERNAL,OPTIONAL                     :: le_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: le_params
            INTEGER,EXTERNAL,OPTIONAL                     :: re_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: re_params
            INTEGER,EXTERNAL,OPTIONAL                     :: i_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: i_params
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

!  Integrate1d

      INTERFACE
         INTEGER FUNCTION dfsintegrate1d(task, method, nlim, llim,       &
     &    llimhint, rlim, rlimhint, ldatahint, rdatahint, r, rhint)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nlim
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: llim
            INTEGER,INTENT(IN),OPTIONAL                   :: llimhint
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: rlim
            INTEGER,INTENT(IN),OPTIONAL                   :: rlimhint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: ldatahint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: rdatahint
            REAL(KIND=4),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdintegrate1d(task, method, nlim, llim,       &
     &    llimhint, rlim, rlimhint, ldatahint, rdatahint, r, rhint)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nlim
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: llim
            INTEGER,INTENT(IN),OPTIONAL                   :: llimhint
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: rlim
            INTEGER,INTENT(IN),OPTIONAL                   :: rlimhint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: ldatahint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: rdatahint
            REAL(KIND=8),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
         END FUNCTION
      END INTERFACE

!  IntegrateEx1d

      INTERFACE
         INTEGER FUNCTION dfsintegrateex1d(task, method, nlim, llim,     &
     &    llimhint, rlim, rlimhint, ldatahint, rdatahint, r, rhint,      &
     &    le_cb, le_params, re_cb, re_params, i_cb, i_params, search_cb, &
     &    search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nlim
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: llim
            INTEGER,INTENT(IN),OPTIONAL                   :: llimhint
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: rlim
            INTEGER,INTENT(IN),OPTIONAL                   :: rlimhint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: ldatahint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: rdatahint
            REAL(KIND=4),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,EXTERNAL,OPTIONAL                     :: le_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: le_params
            INTEGER,EXTERNAL,OPTIONAL                     :: re_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: re_params
            INTEGER,EXTERNAL,OPTIONAL                     :: i_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: i_params
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdintegrateex1d(task, method, nlim, llim,     &
     &    llimhint, rlim, rlimhint, ldatahint, rdatahint, r, rhint,      &
     &    le_cb, le_params, re_cb, re_params, i_cb, i_params, search_cb, &
     &    search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nlim
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: llim
            INTEGER,INTENT(IN),OPTIONAL                   :: llimhint
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: rlim
            INTEGER,INTENT(IN),OPTIONAL                   :: rlimhint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: ldatahint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: rdatahint
            REAL(KIND=8),DIMENSION(*),INTENT(OUT)         :: r
            INTEGER,INTENT(IN),OPTIONAL                   :: rhint
            INTEGER,EXTERNAL,OPTIONAL                     :: le_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: le_params
            INTEGER,EXTERNAL,OPTIONAL                     :: re_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: re_params
            INTEGER,EXTERNAL,OPTIONAL                     :: i_cb
            INTEGER,DIMENSION(*),OPTIONAL                 :: i_params
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

!  SearchCells1d

      INTERFACE
         INTEGER FUNCTION dfssearchcells1d(task, method, nsite, site,    &
     &                                     sitehint, datahint, cell)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            INTEGER,DIMENSION(*),INTENT(OUT)              :: cell
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdsearchcells1d(task, method, nsite, site,    &
     &                                     sitehint, datahint, cell)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            INTEGER,DIMENSION(*),INTENT(OUT)              :: cell
         END FUNCTION
      END INTERFACE

!  SearchCellsEx1d

      INTERFACE
         INTEGER FUNCTION dfssearchcellsex1d(task, method, nsite, site,    &
     &              sitehint, datahint, cell, search_cb, search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=4),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            REAL(KIND=4),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            INTEGER,DIMENSION(*),INTENT(OUT)              :: cell
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

      INTERFACE
         INTEGER FUNCTION dfdsearchcellsex1d(task, method, nsite, site,    &
     &              sitehint, datahint, cell, search_cb, search_params)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)                                 :: task
            INTEGER,INTENT(IN)                            :: method
            INTEGER,INTENT(IN)                            :: nsite
            REAL(KIND=8),DIMENSION(*),INTENT(IN)          :: site
            INTEGER,INTENT(IN),OPTIONAL                   :: sitehint
            REAL(KIND=8),DIMENSION(*),INTENT(IN),OPTIONAL :: datahint
            INTEGER,DIMENSION(*),INTENT(OUT)              :: cell
            INTEGER,EXTERNAL,OPTIONAL                   :: search_cb
            INTEGER,DIMENSION(*),OPTIONAL               :: search_params
         END FUNCTION
      END INTERFACE

!++
!  DF DESTRUCTOR FUNCTION DECLARATIONS.
!--

      INTERFACE
         INTEGER FUNCTION dfdeletetask(task)
               USE MKL_DF_TYPE
            TYPE(DF_TASK)   :: task
         END FUNCTION
      END INTERFACE

      END MODULE MKL_DF
