  type, extends(tPetscObject) ::  tTaoTerm
  end type tTaoTerm
  TaoTerm, parameter :: PETSC_NULL_TAOTERM = tTaoTerm(0)
  TaoTerm, target :: PETSC_NULL_TAOTERM_ARRAY(1) = [tTaoTerm(0)]
  TaoTerm, pointer :: PETSC_NULL_TAOTERM_POINTER(:) => PETSC_NULL_TAOTERM_ARRAY
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERM
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERM_ARRAY
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERM_POINTER
#endif

  type eTaoTermParametersMode
    PetscEnum:: v = PETSC_FORTRAN_TYPE_INITIALIZE
  end type eTaoTermParametersMode

  TaoTermParametersMode, parameter :: PETSC_NULL_TAOTERMPARAMETERSMODE = eTaoTermParametersMode(-50)
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERMPARAMETERSMODE
#endif
    TaoTermParametersMode, parameter :: TAOTERM_PARAMETERS_OPTIONAL = eTaoTermParametersMode(0)
    TaoTermParametersMode, parameter :: TAOTERM_PARAMETERS_NONE = eTaoTermParametersMode(1)
    TaoTermParametersMode, parameter :: TAOTERM_PARAMETERS_REQUIRED = eTaoTermParametersMode(2)

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_PARAMETERS_OPTIONAL
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_PARAMETERS_NONE
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_PARAMETERS_REQUIRED
#endif

  type eTaoTermMask
    PetscEnum:: v = PETSC_FORTRAN_TYPE_INITIALIZE
  end type eTaoTermMask

  TaoTermMask, parameter :: PETSC_NULL_TAOTERMMASK = eTaoTermMask(-50)
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERMMASK
#endif
    TaoTermMask, parameter :: TAOTERM_MASK_NONE = eTaoTermMask(0)
    TaoTermMask, parameter :: TAOTERM_MASK_OBJECTIVE = eTaoTermMask(1)
    TaoTermMask, parameter :: TAOTERM_MASK_GRADIENT = eTaoTermMask(2)
    TaoTermMask, parameter :: TAOTERM_MASK_HESSIAN = eTaoTermMask(4 )

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_MASK_NONE 
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_MASK_OBJECTIVE 
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_MASK_GRADIENT 
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_MASK_HESSIAN 
#endif

  type eTaoTermDuplicateOption
    PetscEnum:: v = PETSC_FORTRAN_TYPE_INITIALIZE
  end type eTaoTermDuplicateOption

  TaoTermDuplicateOption, parameter :: PETSC_NULL_TAOTERMDUPLICATEOPTION = eTaoTermDuplicateOption(-50)
#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PETSC_NULL_TAOTERMDUPLICATEOPTION
#endif
    TaoTermDuplicateOption, parameter :: TAOTERM_DUPLICATE_SIZEONLY = eTaoTermDuplicateOption(0)
    TaoTermDuplicateOption, parameter :: TAOTERM_DUPLICATE_TYPE = eTaoTermDuplicateOption(1)

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_DUPLICATE_SIZEONLY
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERM_DUPLICATE_TYPE
#endif

  CHARACTER(LEN=*), PARAMETER :: TAOTERMCALLBACKS = 'callbacks'
  CHARACTER(LEN=*), PARAMETER :: TAOTERMSHELL = 'shell'
  CHARACTER(LEN=*), PARAMETER :: TAOTERMSUM = 'sum'
  CHARACTER(LEN=*), PARAMETER :: TAOTERMHALFL2SQUARED = 'halfl2squared'
  CHARACTER(LEN=*), PARAMETER :: TAOTERML1 = 'l1'
  CHARACTER(LEN=*), PARAMETER :: TAOTERMQUADRATIC = 'quadratic'

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERMCALLBACKS
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERMSHELL
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERMSUM
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERMHALFL2SQUARED
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERML1
!DEC$ ATTRIBUTES DLLEXPORT::TAOTERMQUADRATIC
#endif

