!   -*- Mode: Fortran; -*-
!
!   (C) 2015 by Argonne National Laboratory.
!   See COPYRIGHT in top-level directory.
!

module mpi_f08_compile_constants

use,intrinsic :: iso_c_binding, only: c_int
use :: mpi_f08_types
use :: mpi_c_interface_types, only: c_Aint, c_Count, c_Offset

!====================================================================
! Make names brought in from other modules private if they should not
! be exposed in program units using this module
!====================================================================

! Make names from iso_c_binding private
private :: c_int

! Make names from mpi_c_interface_types private
private :: c_Aint
private :: c_Count
private :: c_Offset


! MPI version
integer, parameter :: MPI_VERSION                      = 3
integer, parameter :: MPI_SUBVERSION                   = 1

! Error classes
integer, parameter :: MPI_SUCCESS                      = 0
integer, parameter :: MPI_ERR_BUFFER                   = 1
integer, parameter :: MPI_ERR_COUNT                    = 2
integer, parameter :: MPI_ERR_TYPE                     = 3
integer, parameter :: MPI_ERR_TAG                      = 4
integer, parameter :: MPI_ERR_COMM                     = 5
integer, parameter :: MPI_ERR_RANK                     = 6
integer, parameter :: MPI_ERR_ROOT                     = 7
integer, parameter :: MPI_ERR_GROUP                    = 8
integer, parameter :: MPI_ERR_OP                       = 9
integer, parameter :: MPI_ERR_TOPOLOGY                 = 10
integer, parameter :: MPI_ERR_DIMS                     = 11
integer, parameter :: MPI_ERR_ARG                      = 12
integer, parameter :: MPI_ERR_UNKNOWN                  = 13
integer, parameter :: MPI_ERR_TRUNCATE                 = 14
integer, parameter :: MPI_ERR_OTHER                    = 15
integer, parameter :: MPI_ERR_INTERN                   = 16
integer, parameter :: MPI_ERR_IN_STATUS                = 17
integer, parameter :: MPI_ERR_PENDING                  = 18
integer, parameter :: MPI_ERR_REQUEST                  = 19
integer, parameter :: MPI_ERR_ACCESS                   = 20
integer, parameter :: MPI_ERR_AMODE                    = 21
integer, parameter :: MPI_ERR_BAD_FILE                 = 22
integer, parameter :: MPI_ERR_CONVERSION               = 23
integer, parameter :: MPI_ERR_DUP_DATAREP              = 24
integer, parameter :: MPI_ERR_FILE_EXISTS              = 25
integer, parameter :: MPI_ERR_FILE_IN_USE              = 26
integer, parameter :: MPI_ERR_FILE                     = 27
integer, parameter :: MPI_ERR_INFO                     = 28
integer, parameter :: MPI_ERR_INFO_KEY                 = 29
integer, parameter :: MPI_ERR_INFO_VALUE               = 30
integer, parameter :: MPI_ERR_INFO_NOKEY               = 31
integer, parameter :: MPI_ERR_IO                       = 32
integer, parameter :: MPI_ERR_NAME                     = 33
integer, parameter :: MPI_ERR_NO_MEM                   = 34
integer, parameter :: MPI_ERR_NOT_SAME                 = 35
integer, parameter :: MPI_ERR_NO_SPACE                 = 36
integer, parameter :: MPI_ERR_NO_SUCH_FILE             = 37
integer, parameter :: MPI_ERR_PORT                     = 38
integer, parameter :: MPI_ERR_QUOTA                    = 39
integer, parameter :: MPI_ERR_READ_ONLY                = 40
integer, parameter :: MPI_ERR_SERVICE                  = 41
integer, parameter :: MPI_ERR_SPAWN                    = 42
integer, parameter :: MPI_ERR_UNSUPPORTED_DATAREP      = 43
integer, parameter :: MPI_ERR_UNSUPPORTED_OPERATION    = 44
integer, parameter :: MPI_ERR_WIN                      = 45
integer, parameter :: MPI_ERR_BASE                     = 46
integer, parameter :: MPI_ERR_LOCKTYPE                 = 47
integer, parameter :: MPI_ERR_KEYVAL                   = 48
integer, parameter :: MPI_ERR_RMA_CONFLICT             = 49
integer, parameter :: MPI_ERR_RMA_SYNC                 = 50
integer, parameter :: MPI_ERR_SIZE                     = 51
integer, parameter :: MPI_ERR_DISP                     = 52
integer, parameter :: MPI_ERR_ASSERT                   = 53
integer, parameter :: MPI_ERR_RMA_RANGE                = 55
integer, parameter :: MPI_ERR_RMA_ATTACH               = 56
integer, parameter :: MPI_ERR_RMA_SHARED               = 57
integer, parameter :: MPI_ERR_RMA_FLAVOR               = 58
integer, parameter :: MPI_ERR_LASTCODE                 = 1073741823 ! 0x3fffffff

! Predefined error handlers
type(MPI_Errhandler), parameter :: MPI_ERRORS_ARE_FATAL = MPI_Errhandler(1409286144) ! 0x54000000
type(MPI_Errhandler), parameter :: MPI_ERRORS_RETURN   = MPI_Errhandler(1409286145) ! 0x54000001

! Compare operations
integer, parameter :: MPI_IDENT                        = 0
integer, parameter :: MPI_CONGRUENT                    = 1
integer, parameter :: MPI_SIMILAR                      = 2
integer, parameter :: MPI_UNEQUAL                      = 3

! Window flavors and models
integer, parameter :: MPI_WIN_FLAVOR_CREATE            = 1
integer, parameter :: MPI_WIN_FLAVOR_ALLOCATE          = 2
integer, parameter :: MPI_WIN_FLAVOR_DYNAMIC           = 3
integer, parameter :: MPI_WIN_FLAVOR_SHARED            = 4
integer, parameter :: MPI_WIN_SEPARATE                 = 1
integer, parameter :: MPI_WIN_UNIFIED                  = 2

! Collective operations
type(MPI_Op), parameter         :: MPI_MAX             = MPI_Op(1476395009) ! 0x58000001
type(MPI_Op), parameter         :: MPI_MIN             = MPI_Op(1476395010) ! 0x58000002
type(MPI_Op), parameter         :: MPI_SUM             = MPI_Op(1476395011) ! 0x58000003
type(MPI_Op), parameter         :: MPI_PROD            = MPI_Op(1476395012) ! 0x58000004
type(MPI_Op), parameter         :: MPI_LAND            = MPI_Op(1476395013) ! 0x58000005
type(MPI_Op), parameter         :: MPI_BAND            = MPI_Op(1476395014) ! 0x58000006
type(MPI_Op), parameter         :: MPI_LOR             = MPI_Op(1476395015) ! 0x58000007
type(MPI_Op), parameter         :: MPI_BOR             = MPI_Op(1476395016) ! 0x58000008
type(MPI_Op), parameter         :: MPI_LXOR            = MPI_Op(1476395017) ! 0x58000009
type(MPI_Op), parameter         :: MPI_BXOR            = MPI_Op(1476395018) ! 0x5800000a
type(MPI_Op), parameter         :: MPI_MINLOC          = MPI_Op(1476395019) ! 0x5800000b
type(MPI_Op), parameter         :: MPI_MAXLOC          = MPI_Op(1476395020) ! 0x5800000c
type(MPI_Op), parameter         :: MPI_REPLACE         = MPI_Op(1476395021) ! 0x5800000d
type(MPI_Op), parameter         :: MPI_NO_OP           = MPI_Op(1476395022) ! 0x5800000e

! Predefined comms and null handles
type(MPI_Comm), parameter       :: MPI_COMM_WORLD      = MPI_Comm(1140850688) ! 0x44000000
type(MPI_Comm), parameter       :: MPI_COMM_SELF       = MPI_Comm(1140850689) ! 0x44000001
type(MPI_Comm), parameter       :: MPI_COMM_NULL       = MPI_Comm(67108864) ! 0x04000000
type(MPI_Group), parameter      :: MPI_GROUP_EMPTY     = MPI_Group(1207959552) ! 0x48000000
type(MPI_Group), parameter      :: MPI_GROUP_NULL      = MPI_Group(134217728) ! 0x08000000
type(MPI_Win), parameter        :: MPI_WIN_NULL        = MPI_Win(536870912) ! 0x20000000
type(MPI_File), parameter       :: MPI_FILE_NULL       = MPI_File(0)
type(MPI_Op), parameter         :: MPI_OP_NULL         = MPI_Op(402653184) ! 0x18000000
type(MPI_Datatype), parameter   :: MPI_DATATYPE_NULL   = MPI_Datatype(201326592) ! 0x0c000000
type(MPI_Request), parameter    :: MPI_REQUEST_NULL    = MPI_Request(738197504) ! 0x2c000000
type(MPI_Errhandler), parameter :: MPI_ERRHANDLER_NULL = MPI_Errhandler(335544320) ! 0x14000000
type(MPI_Info), parameter       :: MPI_INFO_NULL       = MPI_Info(469762048) ! 0x1c000000
type(MPI_Info), parameter       :: MPI_INFO_ENV        = MPI_Info(1543503873) ! 0x5c000001
type(MPI_Message), parameter    :: MPI_MESSAGE_NULL    = MPI_Message(738197504) ! 0x2c000000
type(MPI_Message), parameter    :: MPI_MESSAGE_NO_PROC = MPI_Message(1811939328) ! 0x6c000000

! Attributes
integer, parameter :: MPI_TAG_UB                       = 1681915906 ! 0x64400002
integer, parameter :: MPI_HOST                         = 1681915908 ! 0x64400004
integer, parameter :: MPI_IO                           = 1681915910 ! 0x64400006
integer, parameter :: MPI_WTIME_IS_GLOBAL              = 1681915912 ! 0x64400008
integer, parameter :: MPI_UNIVERSE_SIZE                = 1681915914 ! 0x6440000a
integer, parameter :: MPI_LASTUSEDCODE                 = 1681915916 ! 0x6440000c
integer, parameter :: MPI_APPNUM                       = 1681915918 ! 0x6440000e
integer, parameter :: MPI_WIN_BASE                     = 1711276034 ! 0x66000002
integer, parameter :: MPI_WIN_SIZE                     = 1711276036 ! 0x66000004
integer, parameter :: MPI_WIN_DISP_UNIT                = 1711276038 ! 0x66000006
integer, parameter :: MPI_WIN_CREATE_FLAVOR            = 1711276040 ! 0x66000008
integer, parameter :: MPI_WIN_MODEL                    = 1711276042 ! 0x6600000a

! String sizes
integer, parameter :: MPI_MAX_ERROR_STRING             = 512
integer, parameter :: MPI_MAX_PORT_NAME                = 256
integer, parameter :: MPI_MAX_OBJECT_NAME              = 128
integer, parameter :: MPI_MAX_INFO_KEY                 = 255
integer, parameter :: MPI_MAX_INFO_VAL                 = 1024
integer, parameter :: MPI_MAX_PROCESSOR_NAME           = 128
integer, parameter :: MPI_MAX_DATAREP_STRING           = 128
integer, parameter :: MPI_MAX_LIBRARY_VERSION_STRING   = 8192

! Predefined constants
integer, parameter :: MPI_UNDEFINED                    = -32766
integer, parameter :: MPI_KEYVAL_INVALID               = 603979776 ! 0x24000000
integer, parameter :: MPI_BSEND_OVERHEAD               = 56
integer, parameter :: MPI_PROC_NULL                    = -1
integer, parameter :: MPI_ANY_SOURCE                   = -2
integer, parameter :: MPI_ANY_TAG                      = -1
integer, parameter :: MPI_ROOT                         = -3

! Topology types
integer, parameter :: MPI_GRAPH                        = 1
integer, parameter :: MPI_CART                         = 2
integer, parameter :: MPI_DIST_GRAPH                   = 3

! RMA lock types
integer, parameter :: MPI_LOCK_EXCLUSIVE               = 234
integer, parameter :: MPI_LOCK_SHARED                  = 235

! F08 specific constants
logical, parameter :: MPI_SUBARRAYS_SUPPORTED          = .true.
logical, parameter :: MPI_ASYNC_PROTECTS_NONBLOCKING   = .true.

integer, parameter :: MPI_ADDRESS_KIND                 = c_Aint
integer, parameter :: MPI_OFFSET_KIND                  = c_Offset
integer, parameter :: MPI_COUNT_KIND                   = c_Count
integer, parameter :: MPI_INTEGER_KIND                 = c_int

! Datatypes
type(MPI_Datatype), parameter   :: MPI_COMPLEX         = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_DOUBLE_COMPLEX  = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_LOGICAL         = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_REAL            = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_DOUBLE_PRECISION = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_INTEGER         = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_2INTEGER        = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_2DOUBLE_PRECISION = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_2REAL           = MPI_Datatype(MPI_DATATYPE_NULL)
type(MPI_Datatype), parameter   :: MPI_CHARACTER       = MPI_Datatype(MPI_DATATYPE_NULL)

type(MPI_Datatype), parameter   :: MPI_BYTE            = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UB              = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LB              = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_PACKED          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INTEGER1        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INTEGER2        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INTEGER4        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INTEGER8        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INTEGER16       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_REAL4           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_REAL8           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_REAL16          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_COMPLEX8        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_COMPLEX16       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_COMPLEX32       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_CHAR            = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_SIGNED_CHAR     = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UNSIGNED_CHAR   = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_WCHAR           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_SHORT           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UNSIGNED_SHORT  = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INT             = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UNSIGNED        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG            = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UNSIGNED_LONG   = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_FLOAT           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_DOUBLE          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG_DOUBLE     = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG_LONG_INT   = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UNSIGNED_LONG_LONG = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG_LONG       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_FLOAT_INT       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_DOUBLE_INT      = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG_INT        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_SHORT_INT       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_2INT            = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_LONG_DOUBLE_INT = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INT8_T          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INT16_T         = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INT32_T         = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_INT64_T         = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UINT8_T         = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UINT16_T        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UINT32_T        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_UINT64_T        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_C_BOOL          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_C_FLOAT_COMPLEX = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_C_COMPLEX       = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_C_DOUBLE_COMPLEX = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_C_LONG_DOUBLE_COMPLEX = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_AINT            = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_OFFSET          = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_COUNT           = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_CXX_BOOL        = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_CXX_FLOAT_COMPLEX = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_CXX_DOUBLE_COMPLEX = MPI_Datatype()
type(MPI_Datatype), parameter   :: MPI_CXX_LONG_DOUBLE_COMPLEX = MPI_Datatype()

! Datatype combiners
integer, parameter :: MPI_COMBINER_NAMED               = 1
integer, parameter :: MPI_COMBINER_DUP                 = 2
integer, parameter :: MPI_COMBINER_CONTIGUOUS          = 3
integer, parameter :: MPI_COMBINER_VECTOR              = 4
integer, parameter :: MPI_COMBINER_HVECTOR_INTEGER     = 5
integer, parameter :: MPI_COMBINER_HVECTOR             = 6
integer, parameter :: MPI_COMBINER_INDEXED             = 7
integer, parameter :: MPI_COMBINER_HINDEXED_INTEGER    = 8
integer, parameter :: MPI_COMBINER_HINDEXED            = 9
integer, parameter :: MPI_COMBINER_INDEXED_BLOCK       = 10
integer, parameter :: MPI_COMBINER_STRUCT_INTEGER      = 11
integer, parameter :: MPI_COMBINER_STRUCT              = 12
integer, parameter :: MPI_COMBINER_SUBARRAY            = 13
integer, parameter :: MPI_COMBINER_DARRAY              = 14
integer, parameter :: MPI_COMBINER_F90_REAL            = 15
integer, parameter :: MPI_COMBINER_F90_COMPLEX         = 16
integer, parameter :: MPI_COMBINER_F90_INTEGER         = 17
integer, parameter :: MPI_COMBINER_RESIZED             = 18
integer, parameter :: MPI_COMBINER_HINDEXED_BLOCK      = 19

integer, parameter :: MPI_TYPECLASS_REAL               = 1
integer, parameter :: MPI_TYPECLASS_INTEGER            = 2
integer, parameter :: MPI_TYPECLASS_COMPLEX            = 3

integer, parameter :: MPI_MODE_NOCHECK                 = 1024
integer, parameter :: MPI_MODE_NOSTORE                 = 2048
integer, parameter :: MPI_MODE_NOPUT                   = 4096
integer, parameter :: MPI_MODE_NOPRECEDE               = 8192
integer, parameter :: MPI_MODE_NOSUCCEED               = 16384

integer, parameter :: MPI_COMM_TYPE_SHARED             = 1

integer, parameter :: MPI_THREAD_SINGLE                = 0
integer, parameter :: MPI_THREAD_FUNNELED              = 1
integer, parameter :: MPI_THREAD_SERIALIZED            = 2
integer, parameter :: MPI_THREAD_MULTIPLE              = 3

integer, parameter :: MPI_MODE_RDONLY                  = 2
integer, parameter :: MPI_MODE_RDWR                    = 8
integer, parameter :: MPI_MODE_WRONLY                  = 4
integer, parameter :: MPI_MODE_DELETE_ON_CLOSE         = 16
integer, parameter :: MPI_MODE_UNIQUE_OPEN             = 32
integer, parameter :: MPI_MODE_CREATE                  = 1
integer, parameter :: MPI_MODE_EXCL                    = 64
integer, parameter :: MPI_MODE_APPEND                  = 128
integer, parameter :: MPI_MODE_SEQUENTIAL              = 256

integer, parameter :: MPI_SEEK_SET                     = 600
integer, parameter :: MPI_SEEK_CUR                     = 602
integer, parameter :: MPI_SEEK_END                     = 604

integer, parameter :: MPI_ORDER_C                      = 56
integer, parameter :: MPI_ORDER_FORTRAN                = 57

integer, parameter :: MPI_DISTRIBUTE_BLOCK             = 121
integer, parameter :: MPI_DISTRIBUTE_CYCLIC            = 122
integer, parameter :: MPI_DISTRIBUTE_NONE              = 123
integer, parameter :: MPI_DISTRIBUTE_DFLT_DARG         = -49767

integer(kind=MPI_OFFSET_KIND), parameter :: MPI_DISPLACEMENT_CURRENT         = -54278278
end module mpi_f08_compile_constants
