unit mpi;
{
 *
 * Pascal language interface for OpenMPI
 *
 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2004-2006 The University of Tennessee and The University
 *                         of Tennessee Research Foundation.  All rights
 *                         reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * Copyright (c) 2007      Daniel Mantione
 *                         All rights reserved.
 *
 * Additional copyrights may follow
 *
}

{****************************************************************************}
interface
{****************************************************************************}

uses ctypes;

{$calling cdecl}

const  mpi_library='libmpi';


  { The comment below (and the ending partner) are for building fat
     distributions on platforms that support it.  Please do not remove  }

const  {* Just in case you need it.  :-)}
       OPEN_MPI = 1;
       {* MPI version *}
       MPI_VERSION = 2;
       MPI_SUBVERSION = 0;
  
  {
   * To accomodate programs written for MPI implementations that use a
   * straight ROMIO import
  }
{
  const
     MPIO_Request = MPI_Request;     
     MPIO_Test = MPI_Test;     
     MPIO_Wait = MPI_Wait;     
}

{* Typedefs }

type {* MPI_Status }
     ompi_status_public_t = packed record
       MPI_SOURCE : cint;
       MPI_TAG : cint;
       MPI_ERROR : cint;
       _count : cint;
       _cancelled : cint;
     end;
       
     MPI_offset     = qword;
     MPI_fint       = type cint;
     MPI_comm       = type pointer;
     MPI_datatype   = type pointer;
     MPI_errhandler = type pointer;
     MPI_file       = type pointer;
     MPI_group      = type pointer;
     MPI_info       = type pointer;
     MPI_op         = type pointer;
     MPI_request    = type pointer;
     PMPI_status    = ^MPI_status;
     MPI_status     = ompi_status_public_t;
     MPI_win        = type pointer;

{ * Miscellaneous constants}
{ match any source rank  }

const MPI_ANY_SOURCE = -(1);     
      { rank of null process  }
      MPI_PROC_NULL = -(2);     
      MPI_ROOT = -(4);     
      { match any message tag  }
      MPI_ANY_TAG = -(1);     
      { max proc. name length  }
      MPI_MAX_PROCESSOR_NAME = 256;     
      { max error message length  }
      MPI_MAX_ERROR_STRING = 256;     
      { max object name length  }
      MPI_MAX_OBJECT_NAME = 64;     
      { undefined stuff  }
      MPI_UNDEFINED = -(32766);     
      { cartesian topology  }
      MPI_CART = 1;     
      { graph topology  }
      MPI_GRAPH = 2;     
      { invalid key value  }
      MPI_KEYVAL_INVALID = -(1);     

      { base reference address  }
      { was #define dname def_expr }
      MPI_BOTTOM = pointer(0);

      { in place buffer  }
      { was #define dname def_expr }
      MPI_IN_PLACE = pointer(1);


type  PPPchar=^PPchar;

const { size of bsend header + ptr  }
      MPI_BSEND_OVERHEAD = 128;     
      { max info key length  }
      MPI_MAX_INFO_KEY = 36;     
      { max info value length  }
      MPI_MAX_INFO_VAL = 256;    
      { NULL argument vector} 
      MPI_ARGV_NULL = PPchar(nil);
      { NULL argument vectors }
      MPI_ARGVS_NULL = PPPchar(nil);  
      { don't return error codes  }
      { was #define dname def_expr }
      MPI_ERRCODES_IGNORE = nil;

      { max port name length  }
      MPI_MAX_PORT_NAME = 36;     
      { max port name length  }
      MPI_MAX_NAME_LEN = MPI_MAX_PORT_NAME;     
      { C row major order  }
      MPI_ORDER_C = 0;     
      { Fortran column major order  }
      MPI_ORDER_FORTRAN = 1;     
      { block distribution  }
      MPI_DISTRIBUTE_BLOCK = 0;     
      { cyclic distribution  }
      MPI_DISTRIBUTE_CYCLIC = 1;     
      { not distributed  }
      MPI_DISTRIBUTE_NONE = 2;     
      { default distribution arg  }
      MPI_DISTRIBUTE_DFLT_DARG = -(1);     
      {
        * Since these values are arbitrary to Open MPI, we might as well make
        * them the same as ROMIO for ease of mapping.  These values taken
        * from ROMIO's mpio.h file.
      }
      { ADIO_CREATE  }
      MPI_MODE_CREATE = 1;     
      { ADIO_RDONLY  }
      MPI_MODE_RDONLY = 2;     
      { ADIO_WRONLY   }
      MPI_MODE_WRONLY = 4;     
      { ADIO_RDWR   }
      MPI_MODE_RDWR = 8;     
      { ADIO_DELETE_ON_CLOSE  }
      MPI_MODE_DELETE_ON_CLOSE = 16;     
      { ADIO_UNIQUE_OPEN  }
      MPI_MODE_UNIQUE_OPEN = 32;     
      { ADIO_EXCL  }
      MPI_MODE_EXCL = 64;     
      { ADIO_APPEND  }
      MPI_MODE_APPEND = 128;     
      { ADIO_SEQUENTIAL  }
      MPI_MODE_SEQUENTIAL = 256;     
      MPI_DISPLACEMENT_CURRENT = -(54278278);     
      MPI_SEEK_SET = 600;     
      MPI_SEEK_CUR = 602;     
      MPI_SEEK_END = 604;     
      MPI_MAX_DATAREP_STRING = 128;     

      { * MPI-2 One-Sided Communications asserts}
      MPI_MODE_NOCHECK = 1;     
      MPI_MODE_NOPRECEDE = 2;     
      MPI_MODE_NOPUT = 4;     
      MPI_MODE_NOSTORE = 8;     
      MPI_MODE_NOSUCCEED = 16;     
      MPI_LOCK_EXCLUSIVE = 1;     
      MPI_LOCK_SHARED = 2;     


type  { * Predefined attribute keyvals
        *
        * DO NOT CHANGE THE ORDER WITHOUT ALSO CHANGING THE ORDER IN
        * src/attribute/attribute_predefined.c and mpif.h.in. }
      MPI_attribute_key=(
        { MPI-1 }
        MPI_TAG_UB,
        MPI_HOST,
        MPI_IO,
        MPI_WTIME_IS_GLOBAL,
        { MPI-2 }
        MPI_APPNUM,
        MPI_LASTUSEDCODE,
        MPI_UNIVERSE_SIZE,
        MPI_WIN_BASE,
        MPI_WIN_SIZE,
        MPI_WIN_DISP_UNIT,
        { Even though these four are IMPI attributes, they need to be there
         for all MPI jobs  }
        IMPI_CLIENT_SIZE,
        IMPI_CLIENT_COLOR,
        IMPI_HOST_SIZE,
        IMPI_HOST_COLOR
      );

      { * Error classes and codes
        * Do not change the values of these without also modifying mpif.h.in.}
      MPI_RESULT=(
        MPI_ERR_SYSRESOURCE:=-2,
        MPI_SUCCESS:=0,     
        MPI_ERR_BUFFER:=1,     
        MPI_ERR_COUNT:=2,     
        MPI_ERR_TYPE:=3,     
        MPI_ERR_TAG:=4,     
        MPI_ERR_COMM:=5,     
        MPI_ERR_RANK:=6,     
        MPI_ERR_REQUEST:=7,     
        MPI_ERR_ROOT:=8,     
        MPI_ERR_GROUP:=9,     
        MPI_ERR_OP:=10,     
        MPI_ERR_TOPOLOGY:=11,     
        MPI_ERR_DIMS:=12,     
        MPI_ERR_ARG:=13,     
        MPI_ERR_UNKNOWN:=14,     
        MPI_ERR_TRUNCATE:=15,     
        MPI_ERR_OTHER:=16,     
        MPI_ERR_INTERN:=17,     
        MPI_ERR_IN_STATUS:=18,     
        MPI_ERR_PENDING:=19,     
        MPI_ERR_ACCESS:=20,     
        MPI_ERR_AMODE:=21,     
        MPI_ERR_ASSERT:=22,     
        MPI_ERR_BAD_FILE:=23,     
        MPI_ERR_BASE:=24,     
        MPI_ERR_CONVERSION:=25,     
        MPI_ERR_DISP:=26,     
        MPI_ERR_DUP_DATAREP:=27,     
        MPI_ERR_FILE_EXISTS:=28,     
        MPI_ERR_FILE_IN_USE:=29,     
        MPI_ERR_FILE:=30,     
        MPI_ERR_INFO_KEY:=31,     
        MPI_ERR_INFO_NOKEY:=32,     
        MPI_ERR_INFO_VALUE:=33,     
        MPI_ERR_INFO:=34,     
        MPI_ERR_IO:=35,     
        MPI_ERR_KEYVAL:=36,     
        MPI_ERR_LOCKTYPE:=37,     
        MPI_ERR_NAME:=38,     
        MPI_ERR_NO_MEM:=39,     
        MPI_ERR_NOT_SAME:=40,     
        MPI_ERR_NO_SPACE:=41,     
        MPI_ERR_NO_SUCH_FILE:=42,     
        MPI_ERR_PORT:=43,     
        MPI_ERR_QUOTA:=44,     
        MPI_ERR_READ_ONLY:=45,     
        MPI_ERR_RMA_CONFLICT:=46,     
        MPI_ERR_RMA_SYNC:=47,     
        MPI_ERR_SERVICE:=48,     
        MPI_ERR_SIZE:=49,     
        MPI_ERR_SPAWN:=50,     
        MPI_ERR_UNSUPPORTED_DATAREP:=51,     
        MPI_ERR_UNSUPPORTED_OPERATION:=52,     
        MPI_ERR_WIN:=53,     
        MPI_ERR_LASTCODE:=54
      );

      { * Comparison results.  Don't change the order of these, the group
        * comparison functions rely on it.
        * Do not change the order of these without also modifying mpif.h.in.}
      MPI_COMM_SIMILARITY=(
        MPI_IDENT,
        MPI_CONGRUENT,
        MPI_SIMILAR,
        MPI_UNEQUAL
      );

      { * MPI_Init_thread constants
        * Do not change the order of these without also modifying mpif.h.in. }
      MPI_THREAD_LEVEL=(     
        MPI_THREAD_SINGLE,
        MPI_THREAD_FUNNELED,
        MPI_THREAD_SERIALIZED,
        MPI_THREAD_MULTIPLE
      );

      { * Datatype combiners.
        * Do not change the order of these without also modifying mpif.h.in.}
      MPI_COMBINER=(
        MPI_COMBINER_NAMED,
        MPI_COMBINER_DUP,
        MPI_COMBINER_CONTIGUOUS,
        MPI_COMBINER_VECTOR,
        MPI_COMBINER_HVECTOR_INTEGER,
        MPI_COMBINER_HVECTOR,
        MPI_COMBINER_INDEXED,
        MPI_COMBINER_HINDEXED_INTEGER,
        MPI_COMBINER_HINDEXED,
        MPI_COMBINER_INDEXED_BLOCK,
        MPI_COMBINER_STRUCT_INTEGER,
        MPI_COMBINER_STRUCT,
        MPI_COMBINER_SUBARRAY,
        MPI_COMBINER_DARRAY,
        MPI_COMBINER_F90_REAL,
        MPI_COMBINER_F90_COMPLEX,
        MPI_COMBINER_F90_INTEGER,
        MPI_COMBINER_RESIZED
      );
      
      MPI_process_range=array[0..2] of cint;
      
     { * Callback funtions.}
     MPI_copy_function=function(var comm:MPI_Comm;
                                var keyval:MPI_attribute_key;
				extra_state:pointer;
                                attr_val_in:pointer;
                                var attr_val_out:pointer;
                                var flag:cint
			       ):MPI_result;
     MPI_delete_function=function(var oldcomm:MPI_Comm;
                                  var keyval:MPI_attribute_key;
                                  attr_val:pointer;
                                  extra_state:pointer):MPI_result;

     MPI_datarep_extent_function=function(datatype:MPI_Datatype;
                                          var file_extent:ptruint;
                                          extra_state:pointer
					 ):MPI_result;
     MPI_datarep_conversion_function=function(userbuf:pointer;
                                              datatype:MPI_datatype;
                                              count:cint;
                                              filebuf:pointer;
                                              position:MPI_offset;
                                              extra_state:pointer):MPI_result;

     MPI_comm_errhandler_fn=procedure (var comm:MPI_comm;
                                       var errorcode:MPI_result;
				       msg:array of Pchar);
				       
     MPI_file_errhandler_fn=procedure(var f:MPI_file;
                                      var errorcode:MPI_result;
				      msg:array of Pchar);
(*
     MPI_win_errhandler_fn=procedure(var MPI_Win,var cint;array of const);
*)
     MPI_handler_function=procedure(var MPI_Comm;
                                    var errorcode:MPI_result;
				    msg:array of Pchar);
     MPI_user_function=procedure(invec:pointer;
                                 inoutvec:pointer;
				 var len:cint;
				 var datatype:MPI_datatype);
     MPI_comm_copy_attr_function=function(oldcomm:MPI_comm;
                                          comm_keyval:MPI_attribute_key;
					  extra_state:pointer;
                                          attribute_val_in,
					  attribute_val_out:pointer;
					  var flag:boolean):MPI_result;
     MPI_comm_delete_attr_function=function(comm:MPI_comm;
                                            comm_keyval:MPI_attribute_key;
					    attribute_val:pointer;
					    extra_state:pointer):MPI_result;
     MPI_type_copy_attr_function=function(old_type:MPI_Datatype;
                                          type_keyval:MPI_attribute_key;
					  extra_state:pointer;
                                          attribute_val_in:pointer;
					  attribute_val_out:pointer;
					  var flag:cint):MPI_result;
     MPI_type_delete_attr_function=function(datatype:MPI_datatype;
                                            type_keyval:MPI_attribute_key;
                                            attribute_val:pointer;
					    extra_state:pointer):MPI_result;
(*
typedef int (MPI_Win_copy_attr_function)(MPI_Win, int, void *,
                                           void *, void *, int * );
typedef int (MPI_Win_delete_attr_function)(MPI_Win, int, void *, void * );
*)
     MPI_Grequest_query_function=function(extra_state:pointer;
                                          var status:MPI_status):MPI_result;

     MPI_Grequest_free_function=function(extra_state:pointer):MPI_result;
     MPI_Grequest_cancel_function=function(extra_state:pointer;
                                           complete:boolean):MPI_result;

type  { * Dummy types.}
      ompi_communicator_t=record end;
      ompi_group_t=record b: byte; end;
      ompi_request_t=record end;
      ompi_op_t=record end;
      ompi_datatype_t=record end;
      ompi_errhandler_t=record end;
      ompi_win_t=record end;
      ompi_file_t=record end;
      ompi_info_t=record end;

{ * External variables }

var ompi_mpi_comm_world : ompi_communicator_t;cvar;external;
    ompi_mpi_comm_self : ompi_communicator_t;cvar;external;
    ompi_mpi_comm_null : ompi_communicator_t;cvar;external;
    ompi_mpi_group_empty : ompi_group_t;cvar;external;
    ompi_mpi_group_null : ompi_group_t;cvar;external;
    ompi_request_null : ompi_request_t;cvar;external;
    ompi_mpi_op_null : ompi_op_t;cvar;external;
    ompi_mpi_op_max : ompi_op_t;cvar;external;
    ompi_mpi_op_min : ompi_op_t;cvar;external;
    ompi_mpi_op_sum : ompi_op_t;cvar;external;
    ompi_mpi_op_prod : ompi_op_t;cvar;external;
    ompi_mpi_op_land : ompi_op_t;cvar;external;
    ompi_mpi_op_band : ompi_op_t;cvar;external;
    ompi_mpi_op_lor : ompi_op_t;cvar;external;
    ompi_mpi_op_bor : ompi_op_t;cvar;external;
    ompi_mpi_op_lxor : ompi_op_t;cvar;external;
    ompi_mpi_op_bxor : ompi_op_t;cvar;external;
    ompi_mpi_op_maxloc : ompi_op_t;cvar;external;
    ompi_mpi_op_minloc : ompi_op_t;cvar;external;
    ompi_mpi_op_replace : ompi_op_t;cvar;external;
    ompi_mpi_char : ompi_datatype_t;cvar;external;
    ompi_mpi_byte : ompi_datatype_t;cvar;external;
    ompi_mpi_int : ompi_datatype_t;cvar;external;
    ompi_mpi_logic : ompi_datatype_t;cvar;external;
    ompi_mpi_short : ompi_datatype_t;cvar;external;
    ompi_mpi_long : ompi_datatype_t;cvar;external;
    ompi_mpi_float : ompi_datatype_t;cvar;external;
    ompi_mpi_double : ompi_datatype_t;cvar;external;
    ompi_mpi_long_double : ompi_datatype_t;cvar;external;
    ompi_mpi_cplex : ompi_datatype_t;cvar;external;
    ompi_mpi_packed : ompi_datatype_t;cvar;external;
    ompi_mpi_signed_char : ompi_datatype_t;cvar;external;
    ompi_mpi_unsigned_char : ompi_datatype_t;cvar;external;
    ompi_mpi_unsigned_short : ompi_datatype_t;cvar;external;
    ompi_mpi_unsigned : ompi_datatype_t;cvar;external;
    ompi_mpi_datatype_null : ompi_datatype_t;cvar;external;
    ompi_mpi_unsigned_long : ompi_datatype_t;cvar;external;
    ompi_mpi_ub : ompi_datatype_t;cvar;external;
    ompi_mpi_lb : ompi_datatype_t;cvar;external;
    ompi_mpi_float_int : ompi_datatype_t;cvar;external;
    ompi_mpi_double_int : ompi_datatype_t;cvar;external;
    ompi_mpi_long_int : ompi_datatype_t;cvar;external;
    ompi_mpi_2int : ompi_datatype_t;cvar;external;
    ompi_mpi_short_int : ompi_datatype_t;cvar;external;
    ompi_mpi_dblcplex : ompi_datatype_t;cvar;external;
    ompi_mpi_integer : ompi_datatype_t;cvar;external;
    ompi_mpi_real : ompi_datatype_t;cvar;external;
    ompi_mpi_dblprec : ompi_datatype_t;cvar;external;
    ompi_mpi_character : ompi_datatype_t;cvar;external;
    ompi_mpi_2real : ompi_datatype_t;cvar;external;
    ompi_mpi_2dblprec : ompi_datatype_t;cvar;external;
    ompi_mpi_2integer : ompi_datatype_t;cvar;external;
    ompi_mpi_longdbl_int : ompi_datatype_t;cvar;external;
    ompi_mpi_wchar : ompi_datatype_t;cvar;external;
    ompi_mpi_unsigned_long_long : ompi_datatype_t;cvar;external;
    ompi_mpi_cxx_cplex : ompi_datatype_t;cvar;external;
    ompi_mpi_cxx_ldblcplex : ompi_datatype_t;cvar;external;
    ompi_mpi_cxx_bool : ompi_datatype_t;cvar;external;
    ompi_mpi_2cplex : ompi_datatype_t;cvar;external;
    { other MPI2 datatypes  }
{$ifdef OMPI_HAVE_FORTRAN_INTEGER1}
    ompi_mpi_integer1 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER2}
    ompi_mpi_integer2 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER4}
    ompi_mpi_integer4 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER8}
    ompi_mpi_integer8 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER16}
    ompi_mpi_integer16 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL4}
    ompi_mpi_real4 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL8}
    ompi_mpi_real8 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL16}
    ompi_mpi_real16 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL4}
    ompi_mpi_complex8 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL8}
    ompi_mpi_complex16 : ompi_datatype_t;cvar;external;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL16}
    ompi_mpi_complex32 : ompi_datatype_t;cvar;external;
{$endif}

    ompi_mpi_errhandler_null : ompi_errhandler_t;cvar;external;
    ompi_mpi_errors_are_fatal : ompi_errhandler_t;cvar;external;
    ompi_mpi_errors_return : ompi_errhandler_t;cvar;external;
    ompi_mpi_win_null : ompi_win_t;cvar;external;
    ompi_mpi_file_null : ompi_file_t;cvar;external;
    ompi_mpi_info_null : ompi_info_t;cvar;external;
    MPI_F_STATUS_IGNORE : ^MPI_fint;cvar;external;
    MPI_F_STATUSES_IGNORE : ^MPI_fint;cvar;external;



const { * NULL handles }
      MPI_GROUP_NULL:MPI_group     = @ompi_mpi_group_null;
      MPI_COMM_NULL:MPI_comm       = @ompi_mpi_comm_null;
      MPI_REQUEST_NULL:MPI_request = @ompi_request_null;
      MPI_OP_NULL:MPI_op           = @ompi_mpi_op_null;
      MPI_ERRHANDLER_NULL:MPI_errhandler = @ompi_mpi_errhandler_null;
      MPI_INFO_NULL:MPI_info       = @ompi_mpi_info_null;
      MPI_WIN_NULL:MPI_win         = @ompi_mpi_win_null;
      MPI_FILE_NULL:MPI_file       = @ompi_mpi_file_null;

      MPI_STATUS_IGNORE=PMPI_status(nil);
      MPI_STATUSES_IGNORE=PMPI_status(nil);


{ Because the C and Fortran versions of several MPI procedures use different
  calling conventions, OpenMPI prefixes the C versions with OMPI_C_, then
  uses macro's in the mpi.h file to "rename" them so the programmer can access
  them under the name the MPI standard specifies.

  We would like to link to the C versions rather than the Fortran versions,
  because procedures that use by value parameters, are more natural for Pascal
  programmers than procedures with all reference parameters.

  In Pascal, we separate between the case insensitive symbol name that we use
  in the source code and its case sensitive mangled name under which it will
  end up in the object files. Therefore, we can simply declare a procedure
  using its MPI name and link to the C version of the procedure using a
  mangled name prefixed with OMPI_C_.}

function MPI_TYPE_NULL_DELETE_FN(datatype:MPI_Datatype;
                                 type_keyval:cint;
                                 var attribute_val_out:pointer;
                                 var extra_state:pointer
                                ):MPI_result;
         external mpi_library name 'OMPI_C_MPI_TYPE_NULL_DELETE_FN';


function MPI_TYPE_NULL_COPY_FN(datatype:MPI_Datatype;
                               type_keyval:cint;
                               var extra_state:pointer;
                               var attribute_val_in:pointer;
                               var attribute_val_out:pointer; 
                               var flag:cint
                              ):MPI_result;
         external mpi_library name 'OMPI_C_MPI_TYPE_NULL_COPY_FN';


function MPI_TYPE_DUP_FN(datatype:MPI_Datatype;
                         type_keyval:cint;
			 var extra_state:pointer;
			 var attribute_val_in:pointer;
			 var attribute_val_out:pointer; 
                         var flag:cint
			):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_TYPE_DUP_FN';
	  
	  
function MPI_COMM_NULL_DELETE_FN(comm:MPI_comm;
                                 comm_keyval:cint;
				 var attribute_val_out:pointer;
				 var extra_state:pointer
				):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_COMM_NULL_DELETE_FN';
	  
	  
function MPI_COMM_NULL_COPY_FN(comm:MPI_comm;
                               comm_keyval:cint;
	                       var extra_state:pointer;
			       var attribute_val_in:pointer;
			       var attribute_val_out:pointer; 
                               var flag:cint
			      ):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_COMM_NULL_COPY_FN';
	  
	  
function MPI_COMM_DUP_FN(comm:MPI_comm;
                         comm_keyval:cint;
			 var extra_state:pointer;
			 var attribute_val_in:pointer;
			 var attribute_val_out:pointer; 
                         var flag:cint
			):MPI_result;
         external mpi_library name 'OMPI_C_MPI_COMM_DUP_FN';
	  
	  
function MPI_NULL_DELETE_FN(comm:MPI_comm;
                            comm_keyval:cint;
			    var attribute_val_out:pointer;
			    var extra_state:pointer
			   ):MPI_result;
         external mpi_library name 'OMPI_C_MPI_NULL_DELETE_FN';


function MPI_NULL_COPY_FN(comm:MPI_comm;
                          comm_keyval:cint;
	                  var extra_state:pointer;
			  var attribute_val_in:pointer;
			  var attribute_val_out:pointer; 
                          var flag:cint
			 ):MPI_result;
         external mpi_library name 'OMPI_C_MPI_NULL_COPY_FN';


function MPI_DUP_FN(comm:MPI_comm;
                    comm_keyval:cint;
	 	    var extra_state:pointer;
	 	    var attribute_val_in:pointer;
		    var attribute_val_out:pointer; 
                    var flag:cint
		   ):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_DUP_FN';


function MPI_WIN_NULL_DELETE_FN(window:MPI_Win;
                                win_keyval:cint;
	                        var attribute_val_out:pointer;
			        var extra_state:pointer
			       ):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_WIN_NULL_DELETE_FN';


function MPI_WIN_NULL_COPY_FN(window:MPI_Win;
                                     win_keyval:cint;
				     var extra_state:pointer;
				     var attribute_val_in:pointer;
				     var attribute_val_out:pointer; 
                                     var flag:cint
				    ):MPI_result;
	 external mpi_library name 'OMPI_C_MPI_WIN_NULL_COPY_FN';

function MPI_WIN_DUP_FN(window:MPI_Win;
                        win_keyval:cint;
			var extra_state:pointer;
			var attribute_val_in:pointer;
			var attribute_val_out:pointer; 
                        var flag:cint
		       ):MPI_result;
         external mpi_library name 'OMPI_C_MPI_WIN_DUP_FN';



const { * MPI predefined handles }
      MPI_COMM_WORLD:MPI_comm=@ompi_mpi_comm_world;
      MPI_COMM_SELF:MPI_comm=@ompi_mpi_comm_self;
      MPI_GROUP_EMPTY:MPI_group=@ompi_mpi_group_empty;
      
      
      MPI_MAX:MPI_op=@ompi_mpi_op_max;
      MPI_MIN:MPI_op=@ompi_mpi_op_min;
      MPI_SUM:MPI_op=@ompi_mpi_op_sum;
      MPI_PROD:MPI_op=@ompi_mpi_op_prod;
      MPI_LAND:MPI_op=@ompi_mpi_op_land;
      MPI_BAND:MPI_op=@ompi_mpi_op_band;
      MPI_LOR:MPI_op=@ompi_mpi_op_lor;
      MPI_BOR:MPI_op=@ompi_mpi_op_bor;
      MPI_LXOR:MPI_op=@ompi_mpi_op_lxor;
      MPI_BXOR:MPI_op=@ompi_mpi_op_bxor;
      MPI_MAXLOC:MPI_op=@ompi_mpi_op_maxloc;
      MPI_MINLOC:MPI_op=@ompi_mpi_op_minloc;
      MPI_REPLACE:MPI_op=@ompi_mpi_op_replace;
      
      { C datatypes  }
      MPI_DATATYPE_NULL:MPI_datatype=@ompi_mpi_datatype_null;
      MPI_BYTE:MPI_datatype=@ompi_mpi_byte;
      MPI_PACKED:MPI_datatype=@ompi_mpi_packed;
      MPI_CHAR:MPI_datatype=@ompi_mpi_char;
      MPI_SHORT:MPI_datatype=@ompi_mpi_short;
      MPI_INT:MPI_datatype=@ompi_mpi_int;
      MPI_LONG:MPI_datatype=@ompi_mpi_long;
      MPI_FLOAT:MPI_datatype=@ompi_mpi_float;
      MPI_DOUBLE:MPI_datatype=@ompi_mpi_double;
      MPI_LONG_DOUBLE:MPI_datatype=@ompi_mpi_long_double;
      MPI_UNSIGNED_CHAR:MPI_datatype=@ompi_mpi_unsigned_char;
      MPI_SIGNED_CHAR:MPI_datatype=@ompi_mpi_signed_char;
      MPI_UNSIGNED_SHORT:MPI_datatype=@ompi_mpi_unsigned_short;
      MPI_UNSIGNED_LONG:MPI_datatype=@ompi_mpi_unsigned_long;
      MPI_UNSIGNED:MPI_datatype=@ompi_mpi_unsigned;
      MPI_FLOAT_INT:MPI_datatype=@ompi_mpi_float_int;
      MPI_DOUBLE_INT:MPI_datatype=@ompi_mpi_double_int;
      MPI_LONG_DOUBLE_INT:MPI_datatype=@ompi_mpi_longdbl_int;
      MPI_LONG_INT:MPI_datatype=@ompi_mpi_long_int;
      MPI_SHORT_INT:MPI_datatype=@ompi_mpi_short_int;
      MPI_2INT:MPI_datatype=@ompi_mpi_2int;
      MPI_UB:MPI_datatype=@ompi_mpi_ub;
      MPI_LB:MPI_datatype=@ompi_mpi_lb;
      MPI_WCHAR:MPI_datatype=@ompi_mpi_wchar;
{$ifdef HAVE_LONG_LONG}
      MPI_LONG_LONG_INT:MPI_datatype=@ompi_mpi_long_long_int;
      MPI_LONG_LONG:MPI_datatype=@ompi_mpi_long_long;
      MPI_UNSIGNED_LONG_LONG:MPI_datatype=@ompi_mpi_unsigned_long_long;
{$endif}
      { HAVE_LONG_LONG  }
      { Fortran datatype bindings  }
      MPI_CHARACTER:MPI_datatype=@ompi_mpi_character;
      MPI_LOGICAL:MPI_datatype=@ompi_mpi_logic;
      MPI_INTEGER:MPI_datatype=@ompi_mpi_integer;
{$ifdef OMPI_HAVE_FORTRAN_INTEGER1}
      MPI_INTEGER1:MPI_datatype=@ompi_mpi_integer1;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER2}
      MPI_INTEGER2:MPI_datatype=@ompi_mpi_integer2;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER4}
      MPI_INTEGER4:MPI_datatype=@ompi_mpi_integer4;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER8}
      MPI_INTEGER8:MPI_datatype=@ompi_mpi_integer8;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_INTEGER16}
      MPI_INTEGER16:MPI_datatype=@ompi_mpi_integer16;
{$endif}
      MPI_REAL:MPI_datatype=@ompi_mpi_real;
{$ifdef OMPI_HAVE_FORTRAN_REAL4}
      MPI_REAL4:MPI_datatype=@ompi_mpi_real4;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL8}
      MPI_REAL8:MPI_datatype=@ompi_mpi_real8;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL16}
      MPI_REAL16:MPI_datatype=@ompi_mpi_real16;
{$endif}
      MPI_DOUBLE_PRECISION:MPI_datatype=@ompi_mpi_dblprec;
      MPI_COMPLEX:MPI_datatype=@ompi_mpi_cplex;
{$ifdef OMPI_HAVE_FORTRAN_REAL4}
      MPI_COMPLEX8:MPI_datatype=@ompi_mpi_cplex8;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL8}
      MPI_COMPLEX16:MPI_datatype=@ompi_mpi_cplex8;
{$endif}
{$ifdef OMPI_HAVE_FORTRAN_REAL16}
      MPI_COMPLEX32:MPI_datatype=@ompi_mpi_cplex32;
{$endif}
      MPI_DOUBLE_COMPLEX:MPI_datatype=@ompi_mpi_dblcplex;
      MPI_2REAL:MPI_datatype=@ompi_mpi_2real;
      MPI_2DOUBLE_PRECISION:MPI_datatype=@ompi_mpi_2dblprec;
      MPI_2INTEGER:MPI_datatype=@ompi_mpi_2integer;
      MPI_ERRORS_ARE_FATAL:MPI_errhandler=@ompi_mpi_errors_are_fatal;
      MPI_ERRORS_RETURN:MPI_errhandler=@ompi_mpi_errors_return;

  

type  { Typeclass definition for MPI_Type_match_size  }
      MPI_TYPECLASS=(
        MPI_TYPECLASS_INTEGER:=1,
        MPI_TYPECLASS_REAL:=2,     
        MPI_TYPECLASS_COMPLEX:=3
      );
      
{ * MPI API }

function MPI_abort(comm:MPI_comm;errorcode:MPI_result):MPI_result;
	 external mpi_library name 'MPI_Abort';

function MPI_accumulate(var origin_addr:pointer;
                        origin_count:cint;
			origin_datatype:MPI_Datatype;
			target_rank:cint;
			target_disp:ptruint; 
                        target_count:cint;
			target_datatype:MPI_Datatype;
			op:MPI_Op;
			win:MPI_Win):MPI_result;
	 external mpi_library name 'MPI_Accumulate';

function MPI_add_error_class(var errorclass:cint):MPI_result;
         external mpi_library name 'MPI_Add_error_class';

function MPI_add_error_code(errorclass:cint;var errorcode:cint):MPI_result;
	 external mpi_library name 'MPI_Add_error_code';

function MPI_add_error_string(errorcode:cint; _string:pcchar):MPI_result;
         external mpi_library name 'MPI_Add_error_string';

function MPI_address(var location:pointer; var address:ptruint):MPI_result;
         external mpi_library name 'MPI_Address';

function MPI_allgather(var sendbuf:pointer;
                       sendcount:cint;
		       sendtype:MPI_datatype;
		       var recvbuf:pointer;
		       recvcount:cint; 
                       recvtype:MPI_datatype;
		       comm:MPI_comm
		      ):MPI_result;
	 external mpi_library name 'MPI_Allgather';

function MPI_allgatherv(var sendbuf:pointer;
                        sendcount:cint;
			sendtype:MPI_datatype;
			var recvbuf:pointer;
			var recvcounts:cint; 
                        var displs:cint;
			recvtype:MPI_Datatype;
			comm:MPI_comm
		       ):MPI_result;
	 external mpi_library name 'MPI_Allgatherv';

function MPI_alloc_mem(size:sizeuint;
                       info:MPI_info;
		       var baseptr:pointer
		      ):MPI_result;
         external mpi_library name 'MPI_Alloc_mem';

function MPI_allreduce(var sendbuf:pointer;
                       var recvbuf:pointer;
		       count:cint;
		       datatype:MPI_datatype;
		       op:MPI_op; 
                       comm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Allreduce';

function MPI_alltoall(var sendbuf:pointer;
                      sendcount:cint;
		      sendtype:MPI_datatype;
		      var recvbuf:pointer;
		      recvcount:cint; 
                      recvtype:MPI_datatype;
		      comm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Alltoall';

function MPI_alltoallv(var sendbuf:pointer;
                       var sendcounts:cint;
		       var sdispls:cint;
		       sendtype:MPI_Datatype;
		       var recvbuf:pointer; 
                       var recvcounts:cint;
		       var rdispls:cint;
		       recvtype:MPI_Datatype;
		       comm:MPI_comm
		      ):MPI_result;
	 external mpi_library name 'MPI_Alltoallv';

function MPI_alltoallw(var sendbuf:pointer;
                       var sendcounts:cint;
		       var sdispls:cint;
		       var sendtypes:MPI_Datatype;
		       var recvbuf:pointer; 
                       var recvcounts:cint;
		       var rdispls:cint;
		       var recvtypes:MPI_Datatype;
		       comm:MPI_comm
		      ):MPI_result;
	 external mpi_library name 'MPI_Alltoallw';

function MPI_attr_delete(comm:MPI_comm;keyval:cint):MPI_result;
         external mpi_library name 'MPI_Attr_delete';

function MPI_attr_get(comm:MPI_comm;
                      keyval:cint;
		      var attribute_val:pointer;
		      var flag:cint
		     ):MPI_result;
	 external mpi_library name 'MPI_Attr_get';

function MPI_attr_put(comm:MPI_comm;
                      keyval:cint;
		      var attribute_val:pointer
		     ):MPI_result;
	 external mpi_library name 'MPI_Attr_put';

function MPI_barrier(comm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Barrier';

function MPI_bcast(var buffer;
                   count:cint;
		   datatype:MPI_datatype;
		   root:cint;
		   comm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Bcast';

function MPI_bsend(var buf;
                   count:cint;
		   datatype:MPI_Datatype;
		   dest:cint;
		   tag:cint; 
                   comm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Bsend';

function MPI_bsend_init(var buf;
                        count:cint;
			datatype:MPI_Datatype;
			dest:cint;
			tag:cint; 
			comm:MPI_comm;
			var request:MPI_Request
		       ):MPI_result;
	 external mpi_library name 'MPI_Bsend_init';

function MPI_buffer_attach(var buffer;size:cint):MPI_result;
         external mpi_library name 'MPI_Buffer_attach';

function MPI_buffer_detach(var buffer;var size:cint):MPI_result;
         external mpi_library name 'MPI_Buffer_detach';

function MPI_cancel(var request:MPI_Request):MPI_result;
         external mpi_library name 'MPI_Cancel';

function MPI_cart_coords(comm:MPI_comm;rank:cint;
                         maxdims:cint;
			 var coords:cint
			):MPI_result;
	 external mpi_library name 'MPI_Cart_coords';

function MPI_cart_create(old_comm:MPI_comm;
                         ndims:cint;
			 var dims:cint;
			 var periods:cint;
			 reorder:cint; 
                         var comm_cart:MPI_comm
			):MPI_result;
	 external mpi_library name 'MPI_Cart_create';

function MPI_cart_get(comm:MPI_comm;
                      maxdims:cint;
		      var dims:cint;
		      var periods:cint;
		      var coords:cint
		     ):MPI_result;
	 external mpi_library name 'MPI_Cart_get';

function MPI_cart_map(comm:MPI_comm;
                      ndims:cint;
		      var dims:cint;
		      var periods:cint;
		      var newrank:cint
		     ):MPI_result;
	 external mpi_library name 'MPI_Cart_map';

function MPI_cart_rank(comm:MPI_comm;var coords:cint;var rank:cint):MPI_result;
         external mpi_library name 'MPI_Cart_rank';

function MPI_cart_shift(comm:MPI_comm;
                        direction:cint;
			disp:cint;
			var rank_source:cint;
			var rank_dest:cint
		       ):MPI_result;
	 external mpi_library name 'MPI_Cart_shift';

function MPI_cart_sub(comm:MPI_comm;
                      var remain_dims:cint;
		      var new_comm:MPI_comm
		     ):MPI_result;
	 external mpi_library name 'MPI_Cart_sub';

function MPI_cartdim_get(comm:MPI_comm;var ndims:cint):MPI_result;
         external mpi_library name 'MPI_Cartdim_get';

function MPI_close_port(port_name:Pchar):MPI_result;
         external mpi_library name 'MPI_Close_port';

function MPI_comm_accept(port_name:pcchar;
                         info:MPI_Info;
			 root:cint;
			 comm:MPI_comm;
			 var newcomm:MPI_comm
			):MPI_result;
	 external mpi_library name 'MPI_Comm_accept';

function MPI_comm_c2f(comm:MPI_comm):MPI_Fint;
         external mpi_library name 'MPI_Comm_c2f';

function MPI_comm_call_errhandler(comm:MPI_comm;errorcode:cint):MPI_result;
         external mpi_library name 'MPI_Comm_call_errhandler';

function MPI_comm_compare(comm1,comm2:MPI_comm;var result:cint):MPI_result;
         external mpi_library name 'MPI_Comm_compare';

function MPI_comm_connect(port_name:pcchar;
                          info:MPI_info;
			  root:cint;
			  comm:MPI_comm;
			  var newcomm:MPI_comm
			 ):MPI_result;
	 external mpi_library name 'MPI_Comm_connect';

function MPI_comm_create_errhandler(var _function:MPI_comm_errhandler_fn;
                                    var errhandler:MPI_Errhandler
				   ):MPI_result;
	 external mpi_library name 'MPI_Comm_create_errhandler';

function MPI_comm_create_keyval(var comm_copy_attr_fn:MPI_comm_copy_attr_function;
                                var comm_delete_attr_fn:MPI_comm_delete_attr_function;
				var comm_keyval:cint;
				var extra_state:pointer):MPI_result;
	 external mpi_library name 'MPI_Comm_create_keyval';

function MPI_comm_create(comm:MPI_comm;
                         group:MPI_group;
			 var newcomm:MPI_comm
			):MPI_result;
	 external mpi_library name 'MPI_Comm_create';

function MPI_comm_delete_attr(comm:MPI_comm;comm_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Comm_delete_attr';

function MPI_comm_disconnect(var comm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Comm_disconnect';

function MPI_comm_dup(comm:MPI_comm; var newcomm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Comm_dup';

function MPI_comm_f2c(comm:MPI_Fint):MPI_comm;
         external mpi_library name 'MPI_Comm_f2c';

function MPI_comm_free_keyval(var comm_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Comm_free_keyval';

function MPI_comm_free(var comm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Comm_free';

function MPI_comm_get_attr(comm:MPI_comm;
                           comm_keyval:MPI_attribute_key;
			   var attribute_val:pointer;
			   var flag:boolean):MPI_result;
         external mpi_library name 'MPI_Comm_get_attr';

function MPI_comm_get_errhandler(comm:MPI_comm;
                                 var erhandler:MPI_Errhandler
				):MPI_result;
	 external mpi_library name 'MPI_Comm_get_errhandler';

function MPI_comm_get_name(comm:MPI_comm;
                           comm_name:pcchar;
			   var resultlen:cint
			  ):MPI_result;
	 external mpi_library name 'MPI_Comm_get_name';

function MPI_comm_get_parent(var parent:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Comm_get_parent';

function MPI_comm_group(comm:MPI_comm;var group:MPI_group):MPI_result;
         external mpi_library name 'MPI_Comm_group';

function MPI_comm_join(fd:cint; var intercomm:MPI_comm):MPI_result;
         external mpi_library name 'MPI_Comm_join';

function MPI_comm_rank(comm:MPI_comm; var rank:cint):MPI_result;
         external mpi_library name 'MPI_Comm_rank';

function MPI_comm_remote_group(comm:MPI_comm;var group:MPI_Group):MPI_result;
         external mpi_library name 'MPI_Comm_remote_group';

function MPI_comm_remote_size(comm:MPI_comm;var size:cint):MPI_result;
         external mpi_library name 'MPI_Comm_remote_size';

function MPI_comm_set_attr(comm:MPI_comm;
                           comm_keyval:cint;
			   var attribute_val:pointer):MPI_result;
	 external mpi_library name 'MPI_Comm_set_attr';

function MPI_comm_set_errhandler(comm:MPI_comm;
                                 errhandler:MPI_errhandler
                                ):MPI_result;
         external mpi_library name 'MPI_Comm_set_errhandler';

function MPI_comm_set_name(comm:MPI_comm; comm_name:Pchar):MPI_result;
         external mpi_library name 'MPI_Comm_set_name';

function MPI_comm_size(comm:MPI_comm;var size:cint):MPI_result;
         external mpi_library name 'MPI_Comm_size';

function MPI_comm_spawn(command:Pchar;
                        argv:Ppchar;
			maxprocs:cint;
			info:MPI_Info;
			root:cint; 
                        comm:MPI_comm;
			var intercomm:MPI_comm;
			var array_of_errcodes:cint
		       ):MPI_result;
	 external mpi_library name 'MPI_Comm_spawn';

function MPI_comm_spawn_multiple(count:cint;
                                 array_of_commands:Ppchar;
				 array_of_argv:PPpchar;
				 var array_of_maxprocs:cint;
				 var array_of_info:MPI_Info; 
                                 root:cint;
				 comm:MPI_comm;
				 var intercomm:MPI_comm;
				 var array_of_errcodes:cint
				):MPI_result;
	 external mpi_library name 'MPI_Comm_spawn_multiple';

function MPI_comm_split(comm:MPI_comm;
                        color:cint;
			key:cint;
			var newcomm:MPI_comm
		       ):MPI_result;
	 external mpi_library name 'MPI_Comm_split';

function MPI_comm_test_inter(comm:MPI_comm;var flag:cint):MPI_result;
         external mpi_library name 'MPI_Comm_test_inter';

function MPI_dims_create(nnodes:cint;ndims:cint;var dims:cint):MPI_result;
         external mpi_library name 'MPI_Dims_create';

function MPI_errhandler_c2f(errhandler:MPI_Errhandler):MPI_fint;
         external mpi_library name 'MPI_Errhandler_c2f';

function MPI_errhandler_create(var _function:MPI_handler_function;
                               var errhandler:MPI_errhandler):MPI_result;
	 external mpi_library name 'MPI_Errhandler_create';

function MPI_errhandler_f2c(errhandler:MPI_fint):MPI_errhandler;
         external mpi_library name 'MPI_Errhandler_f2c';

function MPI_errhandler_free(var errhandler:MPI_errhandler):MPI_result;
         external mpi_library name 'MPI_Errhandler_free';

function MPI_errhandler_get(comm:MPI_comm;
                            var errhandler:MPI_errhandler
			   ):MPI_result;
         external mpi_library name 'MPI_Errhandler_get';

function MPI_errhandler_set(comm:MPI_comm;errhandler:MPI_errhandler):MPI_result;
         external mpi_library name 'MPI_Errhandler_set';

function MPI_error_class(errorcode:cint;var errorclass:cint):MPI_result;
         external mpi_library name 'MPI_Error_class';

function MPI_error_string(errorcode:cint;
                          _string:pcchar;
			  var resultlen:cint
			 ):MPI_result;
	 external mpi_library name 'MPI_Error_string';

function MPI_exscan(var sendbuf:pointer;
                    var recvbuf:pointer;
		    count:cint;
		    datatype:MPI_Datatype;
		    op:MPI_Op; 
                    comm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Exscan';

function MPI_file_c2f(fh:MPI_file):MPI_Fint;
         external mpi_library name 'MPI_File_c2f';

function MPI_file_f2c(fh:MPI_fint):MPI_file;
         external mpi_library name 'MPI_File_f2c';

function MPI_file_call_errhandler(fh:MPI_file;errorcode:cint):MPI_result;
         external mpi_library name 'MPI_File_call_errhandler';

function MPI_file_create_errhandler(var _function:MPI_file_errhandler_fn;
                                    var errhandler:MPI_errhandler):MPI_result;
	 external mpi_library name 'MPI_File_create_errhandler';

function MPI_file_set_errhandler(f:MPI_file;
                                 errhandler:MPI_errhandler
				):MPI_result;
         external mpi_library name 'MPI_File_set_errhandler';

function MPI_file_get_errhandler(f:MPI_file;
                                 var errhandler:MPI_errhandler
				):MPI_result;
	 external mpi_library name 'MPI_File_get_errhandler';

function MPI_file_open(comm:MPI_comm;
                       filename:pcchar;amode:cint;info:MPI_Info;
                       var fh:MPI_file
		      ):MPI_result;
	 external mpi_library name 'MPI_File_open';

function MPI_file_close(var fh:MPI_file):MPI_result;
         external mpi_library name 'MPI_File_close';

function MPI_file_delete(filename:Pchar;info:MPI_info):MPI_result;
         external mpi_library name 'MPI_File_delete';

function MPI_file_set_size(fh:MPI_file; size:MPI_offset):MPI_result;
         external mpi_library name 'MPI_File_set_size';

function MPI_file_preallocate(fh:MPI_file; size:MPI_offset):MPI_result;
         external mpi_library name 'MPI_File_preallocate';

function MPI_file_get_size(fh:MPI_file;var size:MPI_offset):MPI_result;
         external mpi_library name 'MPI_File_get_size';

function MPI_file_get_group(fh:MPI_file;var group:MPI_group):MPI_result;
         external mpi_library name 'MPI_File_get_group';

function MPI_file_get_amode(fh:MPI_file; var amode:cint):MPI_result;
         external mpi_library name 'MPI_File_get_amode';

function MPI_file_set_info(fh:MPI_file; info:MPI_info):MPI_result;
         external mpi_library name 'MPI_File_set_info';

function MPI_file_get_info(fh:MPI_file; var info_used:MPI_info):MPI_result;
         external mpi_library name 'MPI_File_get_info';

function MPI_file_set_view(fh:MPI_file;
                           disp:MPI_offset;
			   etype:MPI_datatype;
			   filetype:MPI_datatype;
			   datarep:pcchar; 
                           info:MPI_info
			  ):MPI_result;
	 external mpi_library name 'MPI_File_set_view';

function MPI_file_get_view(fh:MPI_file;
                           var disp:MPI_offset;
			   var etype:MPI_datatype;
			   var filetype:MPI_datatype;
			   datarep:Pchar
			  ):MPI_result;
	 external mpi_library name 'MPI_File_get_view';

function MPI_file_read_at(fh:MPI_file;
                          offset:MPI_offset;
			  var buf;
			  count:cint;
			  datatype:MPI_datatype; 
                          var status:MPI_status
			 ):MPI_result;
	 external mpi_library name 'MPI_File_read_at';

function MPI_file_read_at_all(fh:MPI_file;
                              offset:MPI_offset;
			      var buf;
			      count:cint;
			      datatype:MPI_datatype; 
                              var status:MPI_status
			     ):MPI_result;
	 external mpi_library name 'MPI_File_read_at_all';

function MPI_file_write_at(fh:MPI_file;
                           offset:MPI_offset;
			   var buf;
			   count:cint;
			   datatype:MPI_Datatype; 
                           var status:MPI_Status
			  ):MPI_result;
	 external mpi_library name 'MPI_File_write_at';

function MPI_file_write_at_all(fh:MPI_file;
                               offset:MPI_offset;
			       var buf;
			       count:cint;
			       datatype:MPI_datatype; 
                               var status:MPI_status
			      ):MPI_result;
	 external mpi_library name 'MPI_File_write_at_all';

function MPI_file_iread_at(fh:MPI_file;
                           offset:MPI_offset;
			   var buf;
			   count:cint;
			   datatype:MPI_datatype; 
                           var request:MPI_request
			  ):MPI_result;
	 external mpi_library name 'MPI_File_iread_at';

function MPI_file_iwrite_at(fh:MPI_file;
                            offset:MPI_offset;
			    var buf;
			    count:cint;
			    datatype:MPI_datatype; 
                            var request:MPI_request
			   ):MPI_result;
	 external mpi_library name 'MPI_File_iwrite_at';

function MPI_file_read(fh:MPI_file;
                       var buf;
		       count:cint;
		       datatype:MPI_datatype;
		       var status:MPI_status
		      ):MPI_result;
	 external mpi_library name 'MPI_File_read';

function MPI_file_read_all(fh:MPI_file;
                           var buf;
			   count:cint;
			   datatype:MPI_datatype;
			   var status:MPI_status
			  ):MPI_result;
	 external mpi_library name 'MPI_File_read_all';

function MPI_file_write(fh:MPI_file;
                        var buf;
			count:cint;
			datatype:MPI_datatype;
			var status:MPI_status
		       ):MPI_result;
         external mpi_library name 'MPI_File_write';

function MPI_file_write_all(fh:MPI_File;
                            var buf;
			    count:cint;
			    datatype:MPI_datatype;
			    var status:MPI_status
			   ):MPI_result;
	 external mpi_library name 'MPI_File_write_all';

function MPI_file_iread(fh:MPI_file;
                        var buf;
			count:cint;
			datatype:MPI_datatype;
			var request:MPI_request
		       ):MPI_result;
	 external mpi_library name 'MPI_File_iread';

function MPI_file_iwrite(fh:MPI_file;
                         var buf;
			 count:cint;
			 datatype:MPI_datatype;
			 var request:MPI_request
			):MPI_result;
	 external mpi_library name 'MPI_File_iwrite';

function MPI_file_seek(fh:MPI_file;
                       offset:MPI_offset;
		       whence:cint
		      ):MPI_result;
	 external mpi_library name 'MPI_File_seek';

function MPI_file_get_position(fh:MPI_file;
                               var offset:MPI_offset
			      ):MPI_result;
         external mpi_library name 'MPI_File_get_position';

function MPI_file_get_byte_offset(fh:MPI_file;
                                  offset:MPI_offset;
                                  var disp:MPI_offset
                                 ):MPI_result;
         external mpi_library name 'MPI_File_get_byte_offset';

function MPI_file_read_shared(fh:MPI_file;
                              var buf;
                              count:cint;
			      datatype:MPI_datatype;
			      var status:MPI_status
			     ):MPI_result;
	 external mpi_library name 'MPI_File_read_shared';

function MPI_file_write_shared(fh:MPI_file;
                               var buf;
			       count:cint;
			       datatype:MPI_datatype;
			       var status:MPI_status
			      ):MPI_result;
	 external mpi_library name 'MPI_File_write_shared';

function MPI_file_iread_shared(fh:MPI_file;
                               var buf;
			       count:cint;
			       datatype:MPI_datatype;
			       var request:MPI_request
			      ):MPI_result;
	 external mpi_library name 'MPI_File_iread_shared';

function MPI_file_iwrite_shared(fh:MPI_file;
                                var buf;
				count:cint;
				datatype:MPI_datatype;
				var request:MPI_request
			       ):MPI_result;
	 external mpi_library name 'MPI_File_iwrite_shared';

function MPI_file_read_ordered(fh:MPI_file;
                               var buf;
			       count:cint;
			       datatype:MPI_datatype;
			       var status:MPI_status
			      ):MPI_result;
	 external mpi_library name 'MPI_File_read_ordered';

function MPI_file_write_ordered(fh:MPI_file;
                                var buf;
				count:cint;
				datatype:MPI_datatype;
				var status:MPI_status
			       ):MPI_result;
	 external mpi_library name 'MPI_File_write_ordered';

function MPI_file_seek_shared(fh:MPI_file;
                              offset:MPI_offset;
			      whence:cint
			     ):MPI_result;
	 external mpi_library name 'MPI_File_seek_shared';

function MPI_file_get_position_shared(fh:MPI_file;
                                      var offset:MPI_offset
				     ):MPI_result;
         external mpi_library name 'MPI_File_get_position_shared';

function MPI_file_read_at_all_begin(fh:MPI_file;
                                    offset:MPI_offset;
				    var buf;
				    count:cint;
				    datatype:MPI_datatype
				   ):MPI_result;
         external mpi_library name 'MPI_File_read_at_all_begin';

function MPI_file_read_at_all_end(fh:MPI_file;
                                  var buf;
				  var status:MPI_status
				 ):MPI_result;
	 external mpi_library name 'MPI_File_read_at_all_end';

function MPI_file_write_at_all_begin(fh:MPI_file;
                                     offset:MPI_offset;
				     var buf;
				     count:cint;
				     datatype:MPI_datatype
				    ):MPI_result;
	 external mpi_library name 'MPI_File_write_at_all_begin';

function MPI_file_write_at_all_end(fh:MPI_file;
                                   var buf;
				   var status:MPI_status
				  ):MPI_result;
	 external mpi_library name 'MPI_File_write_at_all_end';

function MPI_file_read_all_begin(fh:MPI_file;
                                 var buf;
				 count:cint;
				 datatype:MPI_datatype
				):MPI_result;
	 external mpi_library name 'MPI_File_read_all_begin';

function MPI_file_read_all_end(fh:MPI_file;
                               var buf;
			       var status:MPI_status
			      ):MPI_result;
	 external mpi_library name 'MPI_File_read_all_end';

function MPI_file_write_all_begin(fh:MPI_File;
                                  var buf;
				  count:cint;
				  datatype:MPI_datatype
				 ):MPI_result;
	 external mpi_library name 'MPI_File_write_all_begin';

function MPI_file_write_all_end(fh:MPI_file;
                                var buf;
				var status:MPI_status
			       ):MPI_result;
	 external mpi_library name 'MPI_File_write_all_end';

function MPI_file_read_ordered_begin(fh:MPI_file;
                                     var buf;
				     count:cint;
				     datatype:MPI_datatype
				    ):MPI_result;
	 external mpi_library name 'MPI_File_read_ordered_begin';

function MPI_file_read_ordered_end(fh:MPI_file;
                                   var buf;
				   var status:MPI_status
				  ):MPI_result;
	 external mpi_library name 'MPI_File_read_ordered_end';

function MPI_file_write_ordered_begin(fh:MPI_file;
                                      var buf;
				      count:cint;
				      datatype:MPI_datatype
				     ):MPI_result;
	 external mpi_library name 'MPI_File_write_ordered_begin';

function MPI_file_write_ordered_end(fh:MPI_file;
                                    var buf;
				    var status:MPI_status
				   ):MPI_result;
	 external mpi_library name 'MPI_File_write_ordered_end';

function MPI_file_get_type_extent(fh:MPI_file;
                                  datatype:MPI_datatype;
				  var extent:ptruint
				 ):MPI_result;
	 external mpi_library name 'MPI_File_get_type_extent';

function MPI_file_set_atomicity(fh:MPI_file;flag:cint):MPI_result;
         external mpi_library name 'MPI_File_set_atomicity';

function MPI_File_get_atomicity(fh:MPI_file;var flag:cint):MPI_result;
         external mpi_library name 'MPI_File_get_atomicity';

function MPI_file_sync(fh:MPI_file):MPI_result;
         external mpi_library name 'MPI_File_sync';

{
 * file functions end
}
function MPI_finalize:MPI_result;
         external mpi_library name 'MPI_Finalize';

function MPI_finalized(var flag:boolean):MPI_result;
         external mpi_library name 'MPI_Finalized';

function MPI_free_mem(var base:pointer):MPI_result;
         external mpi_library name 'MPI_Free_mem';

function MPI_gather(var sendbuf:pointer;
                    sendcount:cint;
		    sendtype:MPI_datatype;
		    var recvbuf:pointer;
		    recvcount:cint;
                    recvtype:MPI_datatype;
		    root:cint;
		    comm:MPI_comm
		   ):MPI_result;
	 external mpi_library name 'MPI_Gather';

function MPI_gatherv(var sendbuf:pointer;
                     sendcount:cint;
		     sendtype:MPI_datatype;
		     var recvbuf:pointer;
		     var recvcounts:cint; 
                     var displs:cint;
		     recvtype:MPI_datatype;
		     root:cint;
		     comm:MPI_comm
		    ):MPI_result;
	 external mpi_library name 'MPI_Gatherv';

function MPI_get_address(var location:pointer;
                         var address:ptruint
			):MPI_result;
	 external mpi_library name 'MPI_Get_address';

function MPI_get_count(var status:MPI_status;
                       datatype:MPI_datatype;
		       var count:cint
		      ):MPI_result;
	 external mpi_library name 'MPI_Get_count';

function MPI_get_elements(var status:MPI_status;
                          datatype:MPI_datatype;
			  var count:cint
			 ):MPI_result;
	 external mpi_library name 'MPI_Get_elements';

function MPI_get(var origin_addr:pointer;
                 origin_count:cint;
		 origin_datatype:MPI_datatype;
		 target_rank:cint;
		 target_disp:ptruint; 
                 target_count:cint;
		 target_datatype:MPI_datatype;
		 win:MPI_win
		):MPI_result;
	 external mpi_library name 'MPI_Get';

function MPI_get_processor_name(name:Pchar;
                                var resultlen:cint
			       ):MPI_result;
         external mpi_library name 'MPI_Get_processor_name';

function MPI_get_version(var version:cint;
                         var subversion:cint
			):MPI_result;
         external mpi_library name 'MPI_Get_version';

function MPI_graph_create(comm_old:MPI_comm;
                          nnodes:cint;
                          var index:cint;
			  var edges:cint;
			  reorder:cint; 
                          var comm_graph:MPI_comm
			 ):MPI_result;
	 external mpi_library name 'MPI_Graph_create';

function MPI_graph_get(comm:MPI_comm;
                       maxindex:cint;
		       maxedges:cint;
		       var index:cint;
		       var edges:cint
		      ):MPI_result;
	 external mpi_library name 'MPI_Graph_get';

function MPI_graph_map(comm:MPI_comm;
                       nnodes:cint;
		       var index:cint;
		       var edges:cint;
		       var newrank:cint
		      ):MPI_result;
	 external mpi_library name 'MPI_Graph_map';

function MPI_graph_neighbors_count(comm:MPI_comm;
                                   rank:cint;
				   var nneighbors:cint):MPI_result;
	 external mpi_library name 'MPI_Graph_neighbors_count';

function MPI_graph_neighbors(comm:MPI_comm;
                             rank:cint;
			     maxneighbors:cint;
			     var neighbors:cint):MPI_result;
	 external mpi_library name 'PI_Graph_neighbors';

function MPI_graphdims_get(comm:MPI_comm;
                           var nnodes:cint;
			   var nedges:cint):MPI_result;
	 external mpi_library name 'MPI_Graphdims_get';

function MPI_grequest_complete(request:MPI_Request):MPI_result;
         external mpi_library name 'MPI_Grequest_complete';

function MPI_grequest_start(var query_fn:MPI_grequest_query_function;
                            var free_fn:MPI_grequest_free_function;
			    var cancel_fn:MPI_grequest_cancel_function;
			    var extra_state:pointer;
			    var request:MPI_Request
			   ):MPI_result;
         external mpi_library name 'MPI_Grequest_start';

function MPI_group_c2f(group:MPI_Group):MPI_fint;
         external mpi_library name 'MPI_Group_c2f';

function MPI_group_compare(group1,group2:MPI_group;
                           var result:cint
			  ):MPI_result;
         external mpi_library name 'MPI_Group_compare';

function MPI_group_difference(group1,group2:MPI_group;
                              var newgroup:MPI_group
			     ):MPI_result;
         external mpi_library name 'MPI_Group_difference';

function MPI_group_excl(group:MPI_Group;
                        n:cint;
                        var ranks:cint;
                        var newgroup:MPI_Group
                       ):MPI_result;
         external mpi_library name 'MPI_Group_excl';

function MPI_group_f2c(group:MPI_Fint):MPI_Group;
         external mpi_library name 'MPI_Group_f2c';

function MPI_group_free(var group:MPI_Group):MPI_result;
         external mpi_library name 'MPI_Group_free';

function MPI_group_incl(group:MPI_Group;
                        n:cint;
			var ranks:cint;
			var newgroup:MPI_Group
		       ):MPI_result;
	 external mpi_library name 'MPI_Group_incl';

function MPI_group_intersection(group1,group2:MPI_Group;
                                var newgroup:MPI_Group
			       ):MPI_result;
	 external mpi_library name 'MPI_Group_intersection';

function MPI_group_range_excl(group:MPI_group;
                              n:cint;
			      ranges:array of MPI_process_range;
			      var newgroup:MPI_group
			     ):MPI_result;
	 external mpi_library name 'MPI_Group_range_excl';

function MPI_group_range_incl(group:MPI_group;
                              n:cint;
			      ranges:array of MPI_process_range;
			      var newgroup:MPI_group
			     ):MPI_result;
	 external mpi_library name 'MPI_Group_range_incl';

function MPI_group_rank(group:MPI_group;
                        var rank:cint
		       ):MPI_result;
	 external mpi_library name 'MPI_Group_rank';

function MPI_group_size(group:MPI_Group;var size:cint):MPI_result;
         external mpi_library name 'MPI_Group_size';

function MPI_group_translate_ranks(group1:MPI_group;
                                   n:cint;
				   var ranks1:cint;
				   group2:MPI_group;
				   var ranks2:cint
				  ):MPI_result;
	 external mpi_library name 'MPI_Group_translate_ranks';

function MPI_group_union(group1,group2:MPI_group;
                         var newgroup:MPI_group
			):MPI_result;
	 external mpi_library name 'MPI_Group_union';

function MPI_ibsend(var buf;
                    count:cint;
		    datatype:MPI_datatype;
		    dest:cint;
		    tag:cint; 
                    comm:MPI_comm;
		    var request:MPI_request
		   ):MPI_result;
	 external mpi_library name 'MPI_Ibsend';

function MPI_info_c2f(info:MPI_Info):MPI_fint;
         external mpi_library name 'MPI_Info_c2f';

function MPI_info_create(var info:MPI_info):MPI_result;
         external mpi_library name 'MPI_Info_create';

function MPI_info_delete(info:MPI_info;key:Pchar):MPI_result;
         external mpi_library name 'MPI_Info_delete';

function MPI_info_dup(info:MPI_info;var newinfo:MPI_info):MPI_result;
         external mpi_library name 'MPI_Info_dup';

function MPI_info_f2c(info:MPI_fint):MPI_info;
         external mpi_library name 'MPI_Info_f2c';

function MPI_info_free(var info:MPI_Info):MPI_result;
         external mpi_library name 'MPI_Info_free';

function MPI_info_get(info:MPI_info;key:Pchar;
                      valuelen:cint;
		      value:Pchar;
		      var flag:cint
		     ):MPI_result;
	 external mpi_library name 'MPI_Info_get';

function MPI_info_get_nkeys(info:MPI_Info;var nkeys:cint):MPI_result;
	 external mpi_library name 'MPI_Info_get_nkeys';

function MPI_info_get_nthkey(info:MPI_Info;
                             n:cint;
			     key:Pchar):MPI_result;
	 external mpi_library name 'MPI_Info_get_nthkey';

function MPI_info_get_valuelen(info:MPI_Info;
                               key:Pchar;
			       var valuelen:cint;
                               var flag:cint):MPI_result;
         external mpi_library name 'MPI_Info_get_valuelen';

function MPI_info_set(info:MPI_Info;
                      key,value:Pchar
		     ):MPI_result;
	 external mpi_library name 'MPI_Info_set';

function MPI_init:MPI_result;

function MPI_initialized(var flag:boolean):MPI_result;
         external mpi_library name 'MPI_Initialized';


function MPI_intercomm_create(local_comm:MPI_comm;
                              local_leader:cint;
			      bridge_comm:MPI_comm;
			      remote_leader:cint;
			      tag:cint; 
                              var newintercomm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Intercomm_create';

function MPI_intercomm_merge(intercomm:MPI_comm; 
                             high:cint;
			     var newintercomm:MPI_comm
			    ):MPI_result;
	 external mpi_library name 'MPI_Intercomm_merge';

function MPI_iprobe(source:cint;
                    tag:cint;
		    comm:MPI_comm;
                    var flag:cint;
                    var status:MPI_status
                   ):MPI_result;external mpi_library name 'MPI_Iprobe';

function MPI_irecv(var buf;
                   count:cint;
		   datatype:MPI_Datatype;
		   source:cint;
		   tag:cint; 
                   comm:MPI_comm;
		   var request:MPI_request
		  ):MPI_result;
	  external mpi_library name 'MPI_Irecv';

function MPI_irsend(var buf;
                    count:cint;
		    datatype:MPI_Datatype;
		    dest:cint;
		    tag:cint; 
                    comm:MPI_comm;
		    var request:MPI_Request
		   ):MPI_result;
	 external mpi_library name 'MPI_Irsend';

function MPI_isend(var buf;
                   count:cint;
		   datatype:MPI_datatype;
		   dest:cint;
		   tag:cint; 
                   comm:MPI_comm;
		   var request:MPI_request
		  ):MPI_result;
	 external mpi_library name 'MPI_Isend';

function MPI_issend(var buf;
                    count:cint;
		    datatype:MPI_datatype;
		    dest:cint;
		    tag:cint; 
                    comm:MPI_comm;
		    var request:MPI_request
		   ):MPI_result;
	 external mpi_library name 'MPI_Issend';

function MPI_is_thread_main(var flag:boolean):MPI_result;
         external mpi_library name 'MPI_Is_thread_main';

function MPI_keyval_create(var copy_fn:MPI_copy_function;
                           var delete_fn:MPI_delete_function;
			   var keyval:MPI_attribute_key;
			   var extra_state:pointer
			  ):MPI_result;
	 external mpi_library name 'MPI_Keyval_create';

function MPI_keyval_free(var keyval:MPI_attribute_key):MPI_result;
         external mpi_library name 'MPI_Keyval_free';

function MPI_lookup_name(service_name:Pchar;
                         info:MPI_info;
			 port_name:Pchar):MPI_result;
	 external mpi_library name 'MPI_Lookup_name';

function MPI_op_c2f(op:MPI_op):MPI_fint;
         external mpi_library name 'MPI_Op_c2f';

function MPI_op_create(var _function:MPI_user_function;
                       commute:cint;
                       var op:MPI_op):MPI_result;
	 external mpi_library name 'MPI_Op_create';

function MPI_open_port(info:MPI_info;port_name:Pchar):MPI_result;
         external mpi_library name 'MPI_Open_port';

function MPI_op_f2c(op:MPI_fint):MPI_op;
         external mpi_library name 'MPI_Op_f2c';

function MPI_op_free(var op:MPI_Op):MPI_result;
         external mpi_library name 'MPI_Op_free';

function MPI_pack_external(datarep:Pchar;
                           var inbuf:pointer;
			   incount:cint;
			   datatype:MPI_datatype;
			   var outbuf:pointer; 
                           outsize:ptruint;
			   var position:ptruint
			  ):MPI_result;
	 external mpi_library name 'MPI_Pack_external';

function MPI_pack_external_size(datarep:Pchar;
                                incount:cint;
				datatype:MPI_datatype;
				var size:ptruint
			       ):MPI_result;
	 external mpi_library name 'MPI_Pack_external_size';

function MPI_pack(var inbuf;
                  incount:cint;
		  datatype:MPI_datatype;
		  var outbuf:pointer;
		  outsize:cint; 
                  var position:cint;
		  comm:MPI_comm
		 ):MPI_result;
         external mpi_library name 'MPI_Pack';

function MPI_pack_size(incount:cint;
                       datatype:MPI_datatype;
		       comm:MPI_comm;
		       var size:cint
		      ):MPI_result;
	 external mpi_library name 'MPI_Pack_size';

function MPI_pcontrol(level:cint;
                      args:array of pointer
		     ):MPI_result;
	 external mpi_library name 'MPI_Pcontrol';

function MPI_pcontrol(level:cint):MPI_result;
         external mpi_library name 'MPI_Pcontrol';

function MPI_probe(source:cint;
                   tag:cint;
		   comm:MPI_comm;
		   var status:MPI_status
		  ):MPI_result;
	 external mpi_library name 'MPI_Probe';

function MPI_publish_name(service_name:pcchar; info:MPI_Info; port_name:pcchar):MPI_result;external mpi_library name 'MPI_Publish_name';

function MPI_put(var origin_addr:pointer;
                 origin_count:cint;
		 origin_datatype:MPI_datatype;
		 target_rank:cint;
		 target_disp:ptruint; 
                 target_count:cint;
		 target_datatype:MPI_datatype;
		 win:MPI_win
		):MPI_result;external mpi_library name 'MPI_Put';

function MPI_query_thread(var provided:cint):MPI_result;external mpi_library name 'MPI_Query_thread';

function MPI_recv_init(var buf;
                       count:cint;
		       datatype:MPI_Datatype;
		       source:cint;
		       tag:cint; 
                       comm:MPI_comm;
		       var request:MPI_Request
		      ):MPI_result;
	 external mpi_library name 'MPI_Recv_init';

function MPI_recv(var buf;
                  count:cint;
		  datatype:MPI_Datatype;
		  source:cint;
		  tag:cint; 
                  comm:MPI_comm;
		  var status:MPI_status
		 ):MPI_result;
	 external mpi_library name 'MPI_Recv';

function MPI_reduce(var sendbuf:pointer;
                    var recvbuf:pointer;
		    count:cint;
		    datatype:MPI_datatype;
		    op:MPI_op; 
                    root:cint;
		    comm:MPI_comm
		   ):MPI_result;
	 external mpi_library name 'MPI_Reduce';

function MPI_reduce_scatter(var sendbuf:pointer; var recvbuf:pointer; var recvcounts:cint; datatype:MPI_Datatype; op:MPI_Op; 
             comm:MPI_comm):MPI_result;external mpi_library name 'MPI_Reduce_scatter';

function MPI_register_datarep(datarep:Pchar;
                              var read_conversion_fn:MPI_datarep_conversion_function;
			      var write_conversion_fn:MPI_datarep_conversion_function;
			      var dtype_file_extent_fn:MPI_datarep_extent_function;
			      var extra_state:pointer
			     ):MPI_result;
	 external mpi_library name 'MPI_Register_datarep';

function MPI_request_c2f(request:MPI_request):MPI_fint;
         external mpi_library name 'MPI_Request_c2f';

function MPI_request_f2c(request:MPI_fint):MPI_request;
         external mpi_library name 'MPI_Request_f2c';

function MPI_request_free(var request:MPI_request):MPI_result;
         external mpi_library name 'MPI_Request_free';

function MPI_request_get_status(request:MPI_request;
                                var flag:cint;
				var status:MPI_status):MPI_result;
	 external mpi_library name 'MPI_Request_get_status';

function MPI_rsend(var buf;
                   count:cint;
		   datatype:MPI_Datatype;
		   dest:cint;
		   tag:cint; 
                   comm:MPI_comm):MPI_result;
	 external mpi_library name 'MPI_Rsend';

function MPI_rsend_init(var buf;
                        count:cint;
			datatype:MPI_datatype;
			dest:cint;
			tag:cint; 
                        comm:MPI_comm;
			var request:MPI_request):MPI_result;
	 external mpi_library name 'MPI_Rsend_init';

function MPI_scan(var sendbuf:pointer;
                  var recvbuf:pointer;
		  count:cint;
		  datatype:MPI_datatype;op:MPI_op; 
                  comm:MPI_comm
		 ):MPI_result;
	 external mpi_library name 'MPI_Scan';

function MPI_scatter(var sendbuf:pointer;
                     sendcount:cint;
		     sendtype:MPI_Datatype;
		     var recvbuf:pointer;
		     recvcount:cint; 
                     recvtype:MPI_Datatype;
		     root:cint;
		     comm:MPI_comm
		    ):MPI_result;
	 external mpi_library name 'MPI_Scatter';

function MPI_scatterv(var sendbuf:pointer;
                      var sendcounts:cint;
		      var displs:cint;
		      sendtype:MPI_Datatype;
		      var recvbuf:pointer; 
                      recvcount:cint;
		      recvtype:MPI_Datatype;
		      root:cint;
		      comm:MPI_comm
		     ):MPI_result;
	 external mpi_library name 'MPI_Scatterv';

function MPI_send_init(var buf;
                       count:cint;
		       datatype:MPI_datatype;
		       dest:cint;
		       tag:cint; 
                       comm:MPI_comm;
		       var request:MPI_request
		      ):MPI_result;
	 external mpi_library name 'MPI_Send_init';

function MPI_send(var buf;
                  count:cint;
		  datatype:MPI_datatype;
		  dest:cint;
		  tag:cint; 
                  comm:MPI_comm
		 ):MPI_result;
	 external mpi_library name 'MPI_Send';

function MPI_sendrecv(var sendbuf:pointer;
                      sendcount:cint;
		      sendtype:MPI_datatype;
		      dest:cint;
		      sendtag:cint; 
                      var recvbuf:pointer;
		      recvcount:cint;
		      recvtype:MPI_datatype;
		      source:cint;
		      recvtag:cint; 
                      comm:MPI_comm;
		      var status:MPI_status
		     ):MPI_result;
	 external mpi_library name 'MPI_Sendrecv';

function MPI_sendrecv_replace(var buf; 
                              count:cint;
			      datatype:MPI_datatype;
			      dest:cint;
			      sendtag:cint; 
                              source:cint;
			      recvtag:cint;
			      comm:MPI_comm;
			      var status:MPI_status
			     ):MPI_result;
	 external mpi_library name 'MPI_Sendrecv_replace';

function MPI_ssend_init(var buf;
                        count:cint;
			datatype:MPI_datatype;
			dest:cint;
			tag:cint; 
                        comm:MPI_comm;
			var request:MPI_request
		       ):MPI_result;
	 external mpi_library name 'MPI_Ssend_init';

function MPI_ssend(var buf;
                   count:cint;
                   datatype:MPI_datatype;
		   dest:cint;
		   tag:cint; 
                   comm:MPI_comm
		  ):MPI_result;
	 external mpi_library name 'MPI_Ssend';

function MPI_start(var request:MPI_request):MPI_result;
         external mpi_library name 'MPI_Start';

function MPI_startall(count:cint;
                      var array_of_requests:MPI_request
		     ):MPI_result;
	 external mpi_library name 'MPI_Startall';

function MPI_status_c2f(var c_status:MPI_status;
                        var f_status:MPI_fint
		       ):MPI_result;
	 external mpi_library name 'MPI_Status_c2f';

function MPI_status_f2c(var f_status:MPI_Fint;
                        var c_status:MPI_Status
		       ):MPI_result;
	 external mpi_library name 'MPI_Status_f2c';

function MPI_status_set_cancelled(var status:MPI_status;flag:cint):MPI_result;
         external mpi_library name 'MPI_Status_set_cancelled';

function MPI_status_set_elements(var status:MPI_status;
                                 datatype:MPI_datatype;
				 count:cint):MPI_result;
	 external mpi_library name 'MPI_Status_set_elements';

function MPI_testall(count:cint;
                     array_of_requests:array of MPI_request;
                     var flag:cint;
		     array_of_statuses:array of MPI_Status
		    ):MPI_result;
	 external mpi_library name 'MPI_Testall';

function MPI_testany(count:cint;
                     array_of_requests:array of MPI_Request;
		     var index:cint;
		     var flag:cint;
		     var status:MPI_status
		    ):MPI_result;
	 external mpi_library name 'MPI_Testany';

function MPI_test(var request:MPI_request;
                  var flag:cint;
		  var status:MPI_status
		 ):MPI_result;
	 external mpi_library name 'MPI_Test';

function MPI_test_cancelled(var status:MPI_status;var flag:cint):MPI_result;
         external mpi_library name 'MPI_Test_cancelled';

function MPI_testsome(incount:cint;
                      array_of_requests:array of MPI_request;
		      var outcount:cint;
		      array_of_indices:array of cint;
		      array_of_statuses:array of MPI_status
		     ):MPI_result;external mpi_library name 'MPI_Testsome';

function MPI_topo_test(comm:MPI_comm;var status:cint):MPI_result;
         external mpi_library name 'MPI_Topo_test';

function MPI_type_c2f(datatype:MPI_datatype):MPI_fint;
         external mpi_library name 'MPI_Type_c2f';

function MPI_type_commit(var _type:MPI_Datatype):MPI_result;
         external mpi_library name 'MPI_Type_commit';

function MPI_type_contiguous(count:cint;
                             oldtype:MPI_Datatype;
			     var newtype:MPI_Datatype
			    ):MPI_result;
	 external mpi_library name 'MPI_Type_contiguous';

function MPI_type_create_darray(size:cint;
                                rank:cint;
				ndims:cint;
				gsize_array:array of cint;
				distrib_array:array of cint; 
                                darg_array:array of cint;
				psize_array:array of cint;
				order:cint;
				oldtype:MPI_Datatype;
				var newtype:MPI_Datatype
			       ):MPI_result;
	 external mpi_library name 'MPI_Type_create_darray';

function MPI_type_create_f90_complex(p,r:cint;
                                     var newtype:MPI_datatype
				    ):MPI_result;
	 external mpi_library name 'MPI_Type_create_f90_complex';

function MPI_type_create_f90_integer(r:cint;
                                     var newtype:MPI_datatype
				    ):MPI_result;
	 external mpi_library name 'MPI_Type_create_f90_integer';

function MPI_type_create_f90_real(p,r:cint;
                                  var newtype:MPI_datatype
				 ):MPI_result;
	 external mpi_library name 'MPI_Type_create_f90_real';

function MPI_type_create_hindexed(count:cint;
                                  array_of_blocklengths:array of cint;
				  array_of_displacements:array of ptruint;
				  oldtype:MPI_datatype;
				  var newtype:MPI_datatype
				 ):MPI_result;
	 external mpi_library name 'MPI_Type_create_hindexed';

function MPI_type_create_hvector(count:cint;
                                 blocklength:cint;
				 stride:ptruint;
				 oldtype:MPI_datatype;
				 var newtype:MPI_datatype
				):MPI_result;
	 external mpi_library name 'MPI_Type_create_hvector';

function MPI_type_create_keyval(var type_copy_attr_fn:MPI_type_copy_attr_function;
                                var type_delete_attr_fn:MPI_type_delete_attr_function;
				var type_keyval:cint;
				var extra_state:pointer
			       ):MPI_result;
	 external mpi_library name 'MPI_Type_create_keyval';

function MPI_type_create_indexed_block(count:cint;
                                       blocklength:cint;
				       array_of_displacements:array of cint;
				       oldtype:MPI_datatype;
				       var newtype:MPI_datatype
				      ):MPI_result;
	 external mpi_library name 'MPI_Type_create_indexed_block';

function MPI_type_create_struct(count:cint;
                                array_of_block_lengths:array of cint;
				array_of_displacements:array of ptruint;
				array_of_types:array of MPI_datatype;
				var newtype:MPI_datatype
			       ):MPI_result;
	 external mpi_library name 'MPI_Type_create_struct';

function MPI_type_create_subarray(ndims:cint;
                                  size_array:array of cint;
				  subsize_array:array of cint;
				  start_array:array of cint;
				  order:cint; 
                                  oldtype:MPI_datatype;
				  var newtype:MPI_datatype
				 ):MPI_result;
	 external mpi_library name 'MPI_Type_create_subarray';

function MPI_type_create_resized(oldtype:MPI_Datatype;
                                 lb:ptruint;
				 extent:ptruint;
				 var newtype:MPI_datatype
				):MPI_result;
	 external mpi_library name 'MPI_Type_create_resized';

function MPI_type_delete_attr(_type:MPI_datatype;type_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Type_delete_attr';

function MPI_type_dup(oldtype:MPI_datatype;
                      var newtype:MPI_Datatype
		     ):MPI_result;
	 external mpi_library name 'MPI_Type_dup';

function MPI_type_extent(_type:MPI_datatype;var extent:ptruint):MPI_result;
         external mpi_library name 'MPI_Type_extent';

function MPI_type_free(var _type:MPI_datatype):MPI_result;
         external mpi_library name 'MPI_Type_free';

function MPI_type_free_keyval(var type_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Type_free_keyval';

function MPI_type_f2c(datatype:MPI_fint):MPI_datatype;
         external mpi_library name 'MPI_Type_f2c';

function MPI_type_get_attr(datatype:MPI_datatype;type_keyval:cint;
                           var attribute_val:pointer;
			   var flag:boolean):MPI_result;
	 external mpi_library name 'MPI_Type_get_attr';

function MPI_Type_get_contents(mtype:MPI_datatype;
                               max_integers:cint;
			       max_addresses:cint;
			       max_datatypes:cint;
			       array_of_integers:array of cint; 
                               array_of_addresses:array of ptruint;
			       array_of_datatypes:array of MPI_datatype
			      ):MPI_result;
	 external mpi_library name 'MPI_Type_get_contents';

function MPI_type_get_envelope(datatype:MPI_Datatype;
                               var num_integers:cint;
			       var num_addresses:cint;
			       var num_datatypes:cint;
			       var combiner:cint
			      ):MPI_result;
	 external mpi_library name 'MPI_Type_get_envelope';

function MPI_type_get_extent(_type:MPI_Datatype;
                             var lb:ptruint;
			     var extent:ptruint
			    ):MPI_result;
	 external mpi_library name 'MPI_Type_get_extent';

function MPI_type_get_name(_type:MPI_datatype;
                           type_name:Pchar;
			   var resultlen:cint
			  ):MPI_result;
	 external mpi_library name 'MPI_Type_get_name';

function MPI_type_get_true_extent(datatype:MPI_datatype;
                                  var true_lb:ptruint; 
				  var true_extent:ptruint
				 ):MPI_result;
	 external mpi_library name 'MPI_Type_get_true_extent';

function MPI_type_hindexed(count:cint;
                           array_of_blocklengths:array of cint;
			   array_of_displacements:array of ptruint;
			   oldtype:MPI_datatype;
			   var newtype:MPI_datatype
			  ):MPI_result;
	 external mpi_library name 'MPI_Type_hindexed';

function MPI_type_hvector(count:cint;
                          blocklength:cint;
			  stride:ptruint;
			  oldtype:MPI_datatype;
			  var newtype:MPI_datatype):MPI_result;
	 external mpi_library name 'MPI_Type_hvector';

function MPI_type_indexed(count:cint;
                          array_of_blocklengths:array of cint;
			  array_of_displacements:array of cint;
			  oldtype:MPI_Datatype;
			  var newtype:MPI_Datatype
			 ):MPI_result;
	 external mpi_library name 'MPI_Type_indexed';

function MPI_type_lb(_type:MPI_Datatype;var lb:ptruint):MPI_result;
         external mpi_library name 'MPI_Type_lb';

function MPI_type_match_size(typeclass:cint;
                             size:cint;
			     var datatype:MPI_Datatype
			    ):MPI_result;
	 external mpi_library name 'MPI_Type_match_size';

function MPI_type_set_attr(datatype:MPI_Datatype;
                           type_keyval:cint;
			   var attr_val:pointer
			  ):MPI_result;
	 external mpi_library name 'MPI_Type_set_attr';

function MPI_type_set_name(datatype:MPI_Datatype;
                           type_name:pcchar):MPI_result;external mpi_library name 'MPI_Type_set_name';

function MPI_type_size(datatype:MPI_Datatype;var size:cint):MPI_result;
         external mpi_library name 'MPI_Type_size';

function MPI_type_struct(count:cint;
                         array_of_blocklengths:array of cint;
			 array_of_displacements:array of ptruint;
			 array_of_types:array of MPI_datatype;
			 var newtype:MPI_datatype
			):MPI_result;
	 external mpi_library name 'MPI_Type_struct';

function MPI_type_ub(mtype:MPI_datatype;var ub:ptruint):MPI_result;
         external mpi_library name 'MPI_Type_ub';

function MPI_type_vector(count:cint;
                         blocklength:cint;
			 stride:cint;
			 oldtype:MPI_datatype;
			 var newtype:MPI_datatype
			):MPI_result;
	 external mpi_library name 'MPI_Type_vector';

function MPI_unpack(var inbuf:pointer;
                    insize:cint;
		    var position:cint;
		    var outbuf:pointer;
		    outcount:cint; 
                    datatype:MPI_Datatype;
		    comm:MPI_comm
		   ):MPI_result;
	 external mpi_library name 'MPI_Unpack';

function MPI_unpublish_name(service_name:Pchar;
                            info:MPI_Info;
                            port_name:Pchar
                           ):MPI_result;
         external mpi_library name 'MPI_Unpublish_name';

function MPI_unpack_external(datarep:Pchar;
                             var inbuf:pointer;
                             insize:ptruint;
                             var position:ptruint;
                             var outbuf:pointer; 
                             outcount:cint;
                             datatype:MPI_datatype
                            ):MPI_result;
         external mpi_library name 'MPI_Unpack_external';

function MPI_waitall(count:cint;
                     var array_of_requests:MPI_request;
		     var array_of_statuses:MPI_status
		    ):MPI_result;
	 external mpi_library name 'MPI_Waitall';

function MPI_waitany(count:cint;
                     var array_of_requests:MPI_request;
		     var index:cint;
		     var status:MPI_status
		    ):MPI_result;
         external mpi_library name 'MPI_Waitany';

function MPI_wait(var request:MPI_request;var status:MPI_status):MPI_result;
         external mpi_library name 'MPI_Wait';

function MPI_waitsome(incount:cint;
                      var array_of_requests:MPI_request;
		      var outcount:cint;
		      var array_of_indices:cint;
		      var array_of_statuses:MPI_status
		     ):MPI_result;
	 external mpi_library name 'MPI_Waitsome';

function MPI_win_c2f(win:MPI_win):MPI_fint;
         external mpi_library name 'MPI_Win_c2f';

function MPI_win_call_errhandler(win:MPI_Win;
                                 errorcode:cint
				):MPI_result;
	 external mpi_library name 'MPI_Win_call_errhandler';

function MPI_win_complete(win:MPI_Win):MPI_result;
         external mpi_library name 'MPI_Win_complete';

function MPI_win_create(var base:pointer;
                        size:ptruint;
			disp_unit:cint;
			info:MPI_info;
			comm:MPI_comm; 
                        var win:MPI_Win
		       ):MPI_result;
	 external mpi_library name 'MPI_Win_create';

{
//function MPI_Win_create_errhandler(var _function:MPI_Win_errhandler_fn; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'MPI_Win_create_errhandler';

//function MPI_Win_create_keyval(var win_copy_attr_fn:MPI_Win_copy_attr_function; var win_delete_attr_fn:MPI_Win_delete_attr_function; var win_keyval:cint; var extra_state:pointer):MPI_result;external mpi_library name 'MPI_Win_create_keyval';
}

function MPI_win_delete_attr(win:MPI_Win;win_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Win_delete_attr';

function MPI_win_f2c(win:MPI_fint):MPI_win;
         external mpi_library name 'MPI_Win_f2c';

function MPI_win_fence(assert:cint;win:MPI_win):MPI_result;
         external mpi_library name 'MPI_Win_fence';

function MPI_win_free(var win:MPI_win):MPI_result;
         external mpi_library name 'MPI_Win_free';

function MPI_win_free_keyval(var win_keyval:cint):MPI_result;
         external mpi_library name 'MPI_Win_free_keyval';

function MPI_win_get_attr(win:MPI_win;win_keyval:cint;
                          var attribute_val:pointer;
			  var flag:cint
			 ):MPI_result;
	 external mpi_library name 'MPI_Win_get_attr';

function MPI_win_get_errhandler(win:MPI_win;
                                var errhandler:MPI_Errhandler
			       ):MPI_result;
	 external mpi_library name 'MPI_Win_get_errhandler';

function MPI_win_get_group(win:MPI_win;var group:MPI_group):MPI_result;
         external mpi_library name 'MPI_Win_get_group';

function MPI_win_get_name(win:MPI_Win;
                          win_name:Pchar;
			  var resultlen:cint):MPI_result;
	 external mpi_library name 'MPI_Win_get_name';

function MPI_win_lock(lock_type:cint;
                      rank:cint;
		      assert:cint;
		      win:MPI_Win
		     ):MPI_result;
	 external mpi_library name 'MPI_Win_lock';

function MPI_win_post(group:MPI_group;
                      assert:cint;
		      win:MPI_win
		     ):MPI_result;
	 external mpi_library name 'MPI_Win_post';

function MPI_win_set_attr(win:MPI_Win;
                          win_keyval:cint;
			  var attribute_val:pointer
			 ):MPI_result;
	 external mpi_library name 'MPI_Win_set_attr';

function MPI_win_set_errhandler(win:MPI_win;
                                errhandler:MPI_errhandler
			       ):MPI_result;
	 external mpi_library name 'MPI_Win_set_errhandler';

function MPI_win_set_name(win:MPI_win;win_name:Pchar):MPI_result;
                          external mpi_library name 'MPI_Win_set_name';

function MPI_win_start(group:MPI_group;assert:cint;win:MPI_win):MPI_result;
         external mpi_library name 'MPI_Win_start';

function MPI_win_test(win:MPI_Win;var flag:cint):MPI_result;
         external mpi_library name 'MPI_Win_test';

function MPI_win_unlock(rank:cint;win:MPI_win):MPI_result;
         external mpi_library name 'MPI_Win_unlock';

function MPI_win_wait(win:MPI_win):MPI_result;
         external mpi_library name 'MPI_Win_wait';

function MPI_wtick:double;
         external mpi_library name 'MPI_Wtick';

function MPI_wtime:double;
         external mpi_library name 'MPI_Wtime';

(*

  {
     * Profiling MPI API
      }
  function PMPI_Abort(comm:MPI_comm; errorcode:cint):MPI_result;external mpi_library name 'PMPI_Abort';

  function PMPI_Accumulate(var origin_addr:pointer; origin_count:cint; origin_datatype:MPI_Datatype; target_rank:cint; target_disp:ptruint; 
             target_count:cint; target_datatype:MPI_Datatype; op:MPI_Op; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Accumulate';

  function PMPI_Add_error_class(var errorclass:cint):MPI_result;external mpi_library name 'PMPI_Add_error_class';

  function PMPI_Add_error_code(errorclass:cint; var errorcode:cint):MPI_result;external mpi_library name 'PMPI_Add_error_code';

  function PMPI_Add_error_string(errorcode:cint; _string:pcchar):MPI_result;external mpi_library name 'PMPI_Add_error_string';

  function PMPI_Address(var location:pointer; var address:ptruint):MPI_result;external mpi_library name 'PMPI_Address';

  function PMPI_Allgather(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; recvcount:cint; 
             recvtype:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Allgather';

  function PMPI_Allgatherv(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; var recvcounts:cint; 
             var displs:cint; recvtype:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Allgatherv';

  function PMPI_Alloc_mem(size:ptruint; info:MPI_Info; var baseptr:pointer):MPI_result;external mpi_library name 'PMPI_Alloc_mem';

  function PMPI_Allreduce(var sendbuf:pointer; var recvbuf:pointer; count:cint; datatype:MPI_Datatype; op:MPI_Op; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Allreduce';

  function PMPI_Alltoall(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; recvcount:cint; 
             recvtype:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Alltoall';

  function PMPI_Alltoallv(var sendbuf:pointer; var sendcounts:cint; var sdispls:cint; sendtype:MPI_Datatype; var recvbuf:pointer; 
             var recvcounts:cint; var rdispls:cint; recvtype:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Alltoallv';

  function PMPI_Alltoallw(var sendbuf:pointer; var sendcounts:cint; var sdispls:cint; var sendtypes:MPI_Datatype; var recvbuf:pointer; 
             var recvcounts:cint; var rdispls:cint; var recvtypes:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Alltoallw';

  function PMPI_Attr_delete(comm:MPI_comm; keyval:cint):MPI_result;external mpi_library name 'PMPI_Attr_delete';

  function PMPI_Attr_get(comm:MPI_comm; keyval:cint; var attribute_val:pointer; var flag:cint):MPI_result;external mpi_library name 'PMPI_Attr_get';

  function PMPI_Attr_put(comm:MPI_comm; keyval:cint; var attribute_val:pointer):MPI_result;external mpi_library name 'PMPI_Attr_put';

  function PMPI_Barrier(comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Barrier';

  function PMPI_Bcast(var buffer:pointer; count:cint; datatype:MPI_Datatype; root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Bcast';

  function PMPI_Bsend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Bsend';

  function PMPI_Bsend_init(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Bsend_init';

  function PMPI_Buffer_attach(var buffer:pointer; size:cint):MPI_result;external mpi_library name 'PMPI_Buffer_attach';

  function PMPI_Buffer_detach(var buffer:pointer; var size:cint):MPI_result;external mpi_library name 'PMPI_Buffer_detach';

  function PMPI_Cancel(var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Cancel';

  function PMPI_Cart_coords(comm:MPI_comm; rank:cint; maxdims:cint; var coords:cint):MPI_result;external mpi_library name 'PMPI_Cart_coords';

  function PMPI_Cart_create(old_comm:MPI_comm; ndims:cint; var dims:cint; var periods:cint; reorder:cint; 
             var comm_cart:MPI_comm):MPI_result;external mpi_library name 'PMPI_Cart_create';

  function PMPI_Cart_get(comm:MPI_comm; maxdims:cint; var dims:cint; var periods:cint; var coords:cint):MPI_result;external mpi_library name 'PMPI_Cart_get';

  function PMPI_Cart_map(comm:MPI_comm; ndims:cint; var dims:cint; var periods:cint; var newrank:cint):MPI_result;external mpi_library name 'PMPI_Cart_map';

  function PMPI_Cart_rank(comm:MPI_comm; var coords:cint; var rank:cint):MPI_result;external mpi_library name 'PMPI_Cart_rank';

  function PMPI_Cart_shift(comm:MPI_comm; direction:cint; disp:cint; var rank_source:cint; var rank_dest:cint):MPI_result;external mpi_library name 'PMPI_Cart_shift';

  function PMPI_Cart_sub(comm:MPI_comm; var remain_dims:cint; var new_comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Cart_sub';

  function PMPI_Cartdim_get(comm:MPI_comm; var ndims:cint):MPI_result;external mpi_library name 'PMPI_Cartdim_get';

  function PMPI_Close_port(port_name:pcchar):MPI_result;external mpi_library name 'PMPI_Close_port';

  function PMPI_comm_accept(port_name:pcchar; info:MPI_Info; root:cint; comm:MPI_comm; var newcomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_accept';

  function PMPI_comm_c2f(comm:MPI_comm):MPI_Fint;external mpi_library name 'PMPI_comm_c2f';

  function PMPI_comm_call_errhandler(comm:MPI_comm; errorcode:cint):MPI_result;external mpi_library name 'PMPI_comm_call_errhandler';

  function PMPI_comm_compare(comm1:MPI_comm; comm2:MPI_comm; var result:cint):MPI_result;external mpi_library name 'PMPI_comm_compare';

  function PMPI_comm_connect(port_name:pcchar; info:MPI_Info; root:cint; comm:MPI_comm; var newcomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_connect';

  function PMPI_comm_create_errhandler(var _function:MPI_comm_errhandler_fn; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_comm_create_errhandler';

  function PMPI_comm_create_keyval(var comm_copy_attr_fn:MPI_comm_copy_attr_function; var comm_delete_attr_fn:MPI_comm_delete_attr_function; var comm_keyval:cint; var extra_state:pointer):MPI_result;external mpi_library name 'PMPI_comm_create_keyval'

  function PMPI_comm_create(comm:MPI_comm; group:MPI_Group; var newcomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_create';

  function PMPI_comm_delete_attr(comm:MPI_comm; comm_keyval:cint):MPI_result;external mpi_library name 'PMPI_comm_delete_attr';

  function PMPI_comm_disconnect(var comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_disconnect';

  function PMPI_comm_dup(comm:MPI_comm; var newcomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_dup';

  function PMPI_comm_f2c(comm:MPI_Fint):MPI_comm;external mpi_library name 'PMPI_comm_f2c';

  function PMPI_comm_free_keyval(var comm_keyval:cint):MPI_result;external mpi_library name 'PMPI_comm_free_keyval';

  function PMPI_comm_free(var comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_free';

  function PMPI_comm_get_attr(comm:MPI_comm; comm_keyval:cint; var attribute_val:pointer; var flag:cint):MPI_result;external mpi_library name 'PMPI_comm_get_attr';

  function PMPI_comm_get_errhandler(comm:MPI_comm; var erhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_comm_get_errhandler';

  function PMPI_comm_get_name(comm:MPI_comm; comm_name:pcchar; var resultlen:cint):MPI_result;external mpi_library name 'PMPI_comm_get_name';

  function PMPI_comm_get_parent(var parent:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_get_parent';

  function PMPI_comm_group(comm:MPI_comm; var group:MPI_Group):MPI_result;external mpi_library name 'PMPI_comm_group';

  function PMPI_comm_join(fd:cint; var intercomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_join';

  function PMPI_comm_rank(comm:MPI_comm; var rank:cint):MPI_result;external mpi_library name 'PMPI_comm_rank';

  function PMPI_comm_remote_group(comm:MPI_comm; var group:MPI_Group):MPI_result;external mpi_library name 'PMPI_comm_remote_group';

  function PMPI_comm_remote_size(comm:MPI_comm; var size:cint):MPI_result;external mpi_library name 'PMPI_comm_remote_size';

  function PMPI_comm_set_attr(comm:MPI_comm; comm_keyval:cint; var attribute_val:pointer):MPI_result;external mpi_library name 'PMPI_comm_set_attr';

  function PMPI_comm_set_errhandler(comm:MPI_comm; errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_comm_set_errhandler';

  function PMPI_comm_set_name(comm:MPI_comm; comm_name:pcchar):MPI_result;external mpi_library name 'PMPI_comm_set_name';

  function PMPI_comm_size(comm:MPI_comm; var size:cint):MPI_result;external mpi_library name 'PMPI_comm_size';

  function PMPI_comm_spawn(command:pcchar; argv:Ppcchar; maxprocs:cint; info:MPI_Info; root:cint; 
             comm:MPI_comm; var intercomm:MPI_comm; var array_of_errcodes:cint):MPI_result;external mpi_library name 'PMPI_comm_spawn';

  function PMPI_comm_spawn_multiple(count:cint; array_of_commands:Ppcchar; array_of_argv:PPpcchar; var array_of_maxprocs:cint; var array_of_info:MPI_Info; 
             root:cint; comm:MPI_comm; var intercomm:MPI_comm; var array_of_errcodes:cint):MPI_result;external mpi_library name 'PMPI_comm_spawn_multiple';

  function PMPI_comm_split(comm:MPI_comm; color:cint; key:cint; var newcomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_comm_split';

  function PMPI_comm_test_inter(comm:MPI_comm; var flag:cint):MPI_result;external mpi_library name 'PMPI_comm_test_inter';

  function PMPI_Dims_create(nnodes:cint; ndims:cint; var dims:cint):MPI_result;external mpi_library name 'PMPI_Dims_create';

  function PMPI_Errhandler_c2f(errhandler:MPI_Errhandler):MPI_Fint;external mpi_library name 'PMPI_Errhandler_c2f';

  function PMPI_Errhandler_create(var _function:MPI_Handler_function; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Errhandler_create';

  function PMPI_Errhandler_f2c(errhandler:MPI_Fint):MPI_Errhandler;external mpi_library name 'PMPI_Errhandler_f2c';

  function PMPI_Errhandler_free(var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Errhandler_free';

  function PMPI_Errhandler_get(comm:MPI_comm; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Errhandler_get';

  function PMPI_Errhandler_set(comm:MPI_comm; errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Errhandler_set';

  function PMPI_Error_class(errorcode:cint; var errorclass:cint):MPI_result;external mpi_library name 'PMPI_Error_class';

  function PMPI_Error_string(errorcode:cint; _string:pcchar; var resultlen:cint):MPI_result;external mpi_library name 'PMPI_Error_string';

  function PMPI_Exscan(var sendbuf:pointer; var recvbuf:pointer; count:cint; datatype:MPI_Datatype; op:MPI_Op; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Exscan';

  function PMPI_File_c2f(file:MPI_File):MPI_Fint;external mpi_library name 'PMPI_File_c2f';

  function PMPI_File_f2c(file:MPI_Fint):MPI_File;external mpi_library name 'PMPI_File_f2c';

  function PMPI_File_call_errhandler(fh:MPI_File; errorcode:cint):MPI_result;external mpi_library name 'PMPI_File_call_errhandler';

  function PMPI_File_create_errhandler(var _function:MPI_File_errhandler_fn; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_File_create_errhandler';

  function PMPI_File_set_errhandler(file:MPI_File; errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_File_set_errhandler';

  function PMPI_File_get_errhandler(file:MPI_File; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_File_get_errhandler';

  function PMPI_File_open(comm:MPI_comm; filename:pcchar; amode:cint; info:MPI_Info; var fh:MPI_File):MPI_result;external mpi_library name 'PMPI_File_open';

  function PMPI_File_close(var fh:MPI_File):MPI_result;external mpi_library name 'PMPI_File_close';

  function PMPI_File_delete(filename:pcchar; info:MPI_Info):MPI_result;external mpi_library name 'PMPI_File_delete';

  function PMPI_File_set_size(fh:MPI_File; size:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_set_size';

  function PMPI_File_preallocate(fh:MPI_File; size:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_preallocate';

  function PMPI_File_get_size(fh:MPI_File; var size:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_get_size';

  function PMPI_File_get_group(fh:MPI_File; var group:MPI_Group):MPI_result;external mpi_library name 'PMPI_File_get_group';

  function PMPI_File_get_amode(fh:MPI_File; var amode:cint):MPI_result;external mpi_library name 'PMPI_File_get_amode';

  function PMPI_File_set_info(fh:MPI_File; info:MPI_Info):MPI_result;external mpi_library name 'PMPI_File_set_info';

  function PMPI_File_get_info(fh:MPI_File; var info_used:MPI_Info):MPI_result;external mpi_library name 'PMPI_File_get_info';

  function PMPI_File_set_view(fh:MPI_File; disp:MPI_Offset; etype:MPI_Datatype; filetype:MPI_Datatype; datarep:pcchar; 
             info:MPI_Info):MPI_result;external mpi_library name 'PMPI_File_set_view';

  function PMPI_File_get_view(fh:MPI_File; var disp:MPI_Offset; var etype:MPI_Datatype; var filetype:MPI_Datatype; datarep:pcchar):MPI_result;external mpi_library name 'PMPI_File_get_view';

  function PMPI_File_read_at(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_at';

  function PMPI_File_read_at_all(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_at_all';

  function PMPI_File_write_at(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_at';

  function PMPI_File_write_at_all(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_at_all';

  function PMPI_File_iread_at(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iread_at';

  function PMPI_File_iwrite_at(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype; 
             var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iwrite_at';

  function PMPI_File_read(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read';

  function PMPI_File_read_all(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_all';

  function PMPI_File_write(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write';

  function PMPI_File_write_all(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_all';

  function PMPI_File_iread(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iread';

  function PMPI_File_iwrite(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iwrite';

  function PMPI_File_seek(fh:MPI_File; offset:MPI_Offset; whence:cint):MPI_result;external mpi_library name 'PMPI_File_seek';

  function PMPI_File_get_position(fh:MPI_File; var offset:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_get_position';

  function PMPI_File_get_byte_offset(fh:MPI_File; offset:MPI_Offset; var disp:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_get_byte_offset';

  function PMPI_File_read_shared(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_shared';

  function PMPI_File_write_shared(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_shared';

  function PMPI_File_iread_shared(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iread_shared';

  function PMPI_File_iwrite_shared(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_File_iwrite_shared';

  function PMPI_File_read_ordered(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_ordered';

  function PMPI_File_write_ordered(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_ordered';

  function PMPI_File_seek_shared(fh:MPI_File; offset:MPI_Offset; whence:cint):MPI_result;external mpi_library name 'PMPI_File_seek_shared';

  function PMPI_File_get_position_shared(fh:MPI_File; var offset:MPI_Offset):MPI_result;external mpi_library name 'PMPI_File_get_position_shared';

  function PMPI_File_read_at_all_begin(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_read_at_all_begin';

  function PMPI_File_read_at_all_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_at_all_end';

  function PMPI_File_write_at_all_begin(fh:MPI_File; offset:MPI_Offset; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_write_at_all_begin';

  function PMPI_File_write_at_all_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_at_all_end';

  function PMPI_File_read_all_begin(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_read_all_begin';

  function PMPI_File_read_all_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_all_end';

  function PMPI_File_write_all_begin(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_write_all_begin';

  function PMPI_File_write_all_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_all_end';

  function PMPI_File_read_ordered_begin(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_read_ordered_begin';

  function PMPI_File_read_ordered_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_read_ordered_end';

  function PMPI_File_write_ordered_begin(fh:MPI_File; var buf:pointer; count:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_File_write_ordered_begin';

  function PMPI_File_write_ordered_end(fh:MPI_File; var buf:pointer; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_File_write_ordered_end';

  function PMPI_File_get_type_extent(fh:MPI_File; datatype:MPI_Datatype; var extent:ptruint):MPI_result;external mpi_library name 'PMPI_File_get_type_extent';

  function PMPI_File_set_atomicity(fh:MPI_File; flag:cint):MPI_result;external mpi_library name 'PMPI_File_set_atomicity';

  function PMPI_File_get_atomicity(fh:MPI_File; var flag:cint):MPI_result;external mpi_library name 'PMPI_File_get_atomicity';

  function PMPI_File_sync(fh:MPI_File):MPI_result;external mpi_library name 'PMPI_File_sync';

  function PMPI_Finalize:cint;external mpi_library name 'PMPI_Finalize';

  function PMPI_Finalized(var flag:cint):MPI_result;external mpi_library name 'PMPI_Finalized';

  function PMPI_Free_mem(var base:pointer):MPI_result;external mpi_library name 'PMPI_Free_mem';

  function PMPI_Gather(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; recvcount:cint; 
             recvtype:MPI_Datatype; root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Gather';

  function PMPI_Gatherv(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; var recvcounts:cint; 
             var displs:cint; recvtype:MPI_Datatype; root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Gatherv';

  function PMPI_Get_address(var location:pointer; var address:ptruint):MPI_result;external mpi_library name 'PMPI_Get_address';

  function PMPI_Get_count(var status:MPI_Status; datatype:MPI_Datatype; var count:cint):MPI_result;external mpi_library name 'PMPI_Get_count';

  function PMPI_Get_elements(var status:MPI_Status; datatype:MPI_Datatype; var count:cint):MPI_result;external mpi_library name 'PMPI_Get_elements';

  function PMPI_Get(var origin_addr:pointer; origin_count:cint; origin_datatype:MPI_Datatype; target_rank:cint; target_disp:ptruint; 
             target_count:cint; target_datatype:MPI_Datatype; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Get';

  function PMPI_Get_processor_name(name:pcchar; var resultlen:cint):MPI_result;external mpi_library name 'PMPI_Get_processor_name';

  function PMPI_Get_version(var version:cint; var subversion:cint):MPI_result;external mpi_library name 'PMPI_Get_version';

  function PMPI_Graph_create(comm_old:MPI_comm; nnodes:cint; var index:cint; var edges:cint; reorder:cint; 
             var comm_graph:MPI_comm):MPI_result;external mpi_library name 'PMPI_Graph_create';

  function PMPI_Graph_get(comm:MPI_comm; maxindex:cint; maxedges:cint; var index:cint; var edges:cint):MPI_result;external mpi_library name 'PMPI_Graph_get';

  function PMPI_Graph_map(comm:MPI_comm; nnodes:cint; var index:cint; var edges:cint; var newrank:cint):MPI_result;external mpi_library name 'PMPI_Graph_map';

  function PMPI_Graph_neighbors_count(comm:MPI_comm; rank:cint; var nneighbors:cint):MPI_result;external mpi_library name 'PMPI_Graph_neighbors_count';

  function PMPI_Graph_neighbors(comm:MPI_comm; rank:cint; maxneighbors:cint; var neighbors:cint):MPI_result;external mpi_library name 'PMPI_Graph_neighbors';

  function PMPI_Graphdims_get(comm:MPI_comm; var nnodes:cint; var nedges:cint):MPI_result;external mpi_library name 'PMPI_Graphdims_get';

  function PMPI_Grequest_complete(request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Grequest_complete';

  function PMPI_Grequest_start(var query_fn:MPI_Grequest_query_function; var free_fn:MPI_Grequest_free_function; var cancel_fn:MPI_Grequest_cancel_function; var extra_state:pointer; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_

  function PMPI_Group_c2f(group:MPI_Group):MPI_Fint;external mpi_library name 'PMPI_Group_c2f';

  function PMPI_Group_compare(group1:MPI_Group; group2:MPI_Group; var result:cint):MPI_result;external mpi_library name 'PMPI_Group_compare';

  function PMPI_Group_difference(group1:MPI_Group; group2:MPI_Group; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_difference';

  function PMPI_Group_excl(group:MPI_Group; n:cint; var ranks:cint; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_excl';

  function PMPI_Group_f2c(group:MPI_Fint):MPI_Group;external mpi_library name 'PMPI_Group_f2c';

  function PMPI_Group_free(var group:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_free';

  function PMPI_Group_incl(group:MPI_Group; n:cint; var ranks:cint; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_incl';

  function PMPI_Group_intersection(group1:MPI_Group; group2:MPI_Group; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_intersection';

  function PMPI_Group_range_excl(group:MPI_Group; n:cint; ranges:array of array[0..2] of cint; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_range_excl';

  function PMPI_Group_range_incl(group:MPI_Group; n:cint; ranges:array of array[0..2] of cint; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_range_incl';

  function PMPI_Group_rank(group:MPI_Group; var rank:cint):MPI_result;external mpi_library name 'PMPI_Group_rank';

  function PMPI_Group_size(group:MPI_Group; var size:cint):MPI_result;external mpi_library name 'PMPI_Group_size';

  function PMPI_Group_translate_ranks(group1:MPI_Group; n:cint; var ranks1:cint; group2:MPI_Group; var ranks2:cint):MPI_result;external mpi_library name 'PMPI_Group_translate_ranks';

  function PMPI_Group_union(group1:MPI_Group; group2:MPI_Group; var newgroup:MPI_Group):MPI_result;external mpi_library name 'PMPI_Group_union';

  function PMPI_Ibsend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Ibsend';

  function PMPI_Info_c2f(info:MPI_Info):MPI_Fint;external mpi_library name 'PMPI_Info_c2f';

  function PMPI_Info_create(var info:MPI_Info):MPI_result;external mpi_library name 'PMPI_Info_create';

  function PMPI_Info_delete(info:MPI_Info; key:pcchar):MPI_result;external mpi_library name 'PMPI_Info_delete';

  function PMPI_Info_dup(info:MPI_Info; var newinfo:MPI_Info):MPI_result;external mpi_library name 'PMPI_Info_dup';

  function PMPI_Info_f2c(info:MPI_Fint):MPI_Info;external mpi_library name 'PMPI_Info_f2c';

  function PMPI_Info_free(var info:MPI_Info):MPI_result;external mpi_library name 'PMPI_Info_free';

  function PMPI_Info_get(info:MPI_Info; key:pcchar; valuelen:cint; value:pcchar; var flag:cint):MPI_result;external mpi_library name 'PMPI_Info_get';

  function PMPI_Info_get_nkeys(info:MPI_Info; var nkeys:cint):MPI_result;external mpi_library name 'PMPI_Info_get_nkeys';

  function PMPI_Info_get_nthkey(info:MPI_Info; n:cint; key:pcchar):MPI_result;external mpi_library name 'PMPI_Info_get_nthkey';

  function PMPI_Info_get_valuelen(info:MPI_Info; key:pcchar; var valuelen:cint; var flag:cint):MPI_result;external mpi_library name 'PMPI_Info_get_valuelen';

  function PMPI_Info_set(info:MPI_Info; key:pcchar; value:pcchar):MPI_result;external mpi_library name 'PMPI_Info_set';

  function PMPI_Init(var argc:cint; argv:PPpcchar):MPI_result;external mpi_library name 'PMPI_Init';

  function PMPI_Initialized(var flag:cint):MPI_result;external mpi_library name 'PMPI_Initialized';

  function PMPI_Init_thread(var argc:cint; argv:PPpcchar; required:cint; var provided:cint):MPI_result;external mpi_library name 'PMPI_Init_thread';

  function PMPI_Intercomm_create(local_comm:MPI_comm; local_leader:cint; bridge_comm:MPI_comm; remote_leader:cint; tag:cint; 
             var newintercomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Intercomm_create';

  function PMPI_Intercomm_merge(intercomm:MPI_comm; high:cint; var newintercomm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Intercomm_merge';

  function PMPI_Iprobe(source:cint; tag:cint; comm:MPI_comm; var flag:cint; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Iprobe';

  function PMPI_Irecv(var buf:pointer; count:cint; datatype:MPI_Datatype; source:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Irecv';

  function PMPI_Irsend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Irsend';

  function PMPI_Isend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Isend';

  function PMPI_Issend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Issend';

  function PMPI_Is_thread_main(var flag:cint):MPI_result;external mpi_library name 'PMPI_Is_thread_main';

  function PMPI_Keyval_create(var copy_fn:MPI_Copy_function; var delete_fn:MPI_Delete_function; var keyval:cint; var extra_state:pointer):MPI_result;external mpi_library name 'PMPI_Keyval_create';

  function PMPI_Keyval_free(var keyval:cint):MPI_result;external mpi_library name 'PMPI_Keyval_free';

  function PMPI_Lookup_name(service_name:pcchar; info:MPI_Info; port_name:pcchar):MPI_result;external mpi_library name 'PMPI_Lookup_name';

  function PMPI_Op_c2f(op:MPI_Op):MPI_Fint;external mpi_library name 'PMPI_Op_c2f';

  function PMPI_Op_create(var _function:MPI_User_function; commute:cint; var op:MPI_Op):MPI_result;external mpi_library name 'PMPI_Op_create';

  function PMPI_Open_port(info:MPI_Info; port_name:pcchar):MPI_result;external mpi_library name 'PMPI_Open_port';

  function PMPI_Op_f2c(op:MPI_Fint):MPI_Op;external mpi_library name 'PMPI_Op_f2c';

  function PMPI_Op_free(var op:MPI_Op):MPI_result;external mpi_library name 'PMPI_Op_free';

  function PMPI_Pack_external(datarep:pcchar; var inbuf:pointer; incount:cint; datatype:MPI_Datatype; var outbuf:pointer; 
             outsize:ptruint; var position:ptruint):MPI_result;external mpi_library name 'PMPI_Pack_external';

  function PMPI_Pack_external_size(datarep:pcchar; incount:cint; datatype:MPI_Datatype; var size:ptruint):MPI_result;external mpi_library name 'PMPI_Pack_external_size';

  function PMPI_Pack(var inbuf:pointer; incount:cint; datatype:MPI_Datatype; var outbuf:pointer; outsize:cint; 
             var position:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Pack';

  function PMPI_Pack_size(incount:cint; datatype:MPI_Datatype; comm:MPI_comm; var size:cint):MPI_result;external mpi_library name 'PMPI_Pack_size';

  function PMPI_Pcontrol(level:cint; args:array of const):MPI_result;external mpi_library name 'PMPI_Pcontrol';

  function PMPI_Pcontrol(level:cint):MPI_result;external mpi_library name 'PMPI_Pcontrol';

  function PMPI_Probe(source:cint; tag:cint; comm:MPI_comm; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Probe';

  function PMPI_Publish_name(service_name:pcchar; info:MPI_Info; port_name:pcchar):MPI_result;external mpi_library name 'PMPI_Publish_name';

  function PMPI_Put(var origin_addr:pointer; origin_count:cint; origin_datatype:MPI_Datatype; target_rank:cint; target_disp:ptruint; 
             target_count:cint; target_datatype:MPI_Datatype; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Put';

  function PMPI_Query_thread(var provided:cint):MPI_result;external mpi_library name 'PMPI_Query_thread';

  function PMPI_Recv_init(var buf:pointer; count:cint; datatype:MPI_Datatype; source:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Recv_init';

  function PMPI_Recv(var buf:pointer; count:cint; datatype:MPI_Datatype; source:cint; tag:cint; 
             comm:MPI_comm; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Recv';

  function PMPI_Reduce(var sendbuf:pointer; var recvbuf:pointer; count:cint; datatype:MPI_Datatype; op:MPI_Op; 
             root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Reduce';

  function PMPI_Reduce_scatter(var sendbuf:pointer; var recvbuf:pointer; var recvcounts:cint; datatype:MPI_Datatype; op:MPI_Op; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Reduce_scatter';

  function PMPI_Register_datarep(datarep:pcchar; var read_conversion_fn:MPI_Datarep_conversion_function; var write_conversion_fn:MPI_Datarep_conversion_function; var dtype_file_extent_fn:MPI_Datarep_extent_function; var extra_state:pointer):MPI_result;ext

  function PMPI_Request_c2f(request:MPI_Request):MPI_Fint;external mpi_library name 'PMPI_Request_c2f';

  function PMPI_Request_f2c(request:MPI_Fint):MPI_Request;external mpi_library name 'PMPI_Request_f2c';

  function PMPI_Request_free(var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Request_free';

  function PMPI_Request_get_status(request:MPI_Request; var flag:cint; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Request_get_status';

  function PMPI_Rsend(var ibuf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Rsend';

  function PMPI_Rsend_init(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Rsend_init';

  function PMPI_Scan(var sendbuf:pointer; var recvbuf:pointer; count:cint; datatype:MPI_Datatype; op:MPI_Op; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Scan';

  function PMPI_Scatter(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; var recvbuf:pointer; recvcount:cint; 
             recvtype:MPI_Datatype; root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Scatter';

  function PMPI_Scatterv(var sendbuf:pointer; var sendcounts:cint; var displs:cint; sendtype:MPI_Datatype; var recvbuf:pointer; 
             recvcount:cint; recvtype:MPI_Datatype; root:cint; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Scatterv';

  function PMPI_Send_init(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Send_init';

  function PMPI_Send(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Send';

  function PMPI_Sendrecv(var sendbuf:pointer; sendcount:cint; sendtype:MPI_Datatype; dest:cint; sendtag:cint; 
             var recvbuf:pointer; recvcount:cint; recvtype:MPI_Datatype; source:cint; recvtag:cint; 
             comm:MPI_comm; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Sendrecv';

  function PMPI_Sendrecv_replace(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; sendtag:cint; 
             source:cint; recvtag:cint; comm:MPI_comm; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Sendrecv_replace';

  function PMPI_Ssend_init(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm; var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Ssend_init';

  function PMPI_Ssend(var buf:pointer; count:cint; datatype:MPI_Datatype; dest:cint; tag:cint; 
             comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Ssend';

  function PMPI_Start(var request:MPI_Request):MPI_result;external mpi_library name 'PMPI_Start';

  function PMPI_Startall(count:cint; var array_of_requests:MPI_Request):MPI_result;external mpi_library name 'PMPI_Startall';

  function PMPI_Status_c2f(var c_status:MPI_Status; var f_status:MPI_Fint):MPI_result;external mpi_library name 'PMPI_Status_c2f';

  function PMPI_Status_f2c(var f_status:MPI_Fint; var c_status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Status_f2c';

  function PMPI_Status_set_cancelled(var status:MPI_Status; flag:cint):MPI_result;external mpi_library name 'PMPI_Status_set_cancelled';

  function PMPI_Status_set_elements(var status:MPI_Status; datatype:MPI_Datatype; count:cint):MPI_result;external mpi_library name 'PMPI_Status_set_elements';

  function PMPI_Testall(count:cint; array_of_requests:array of MPI_Request; var flag:cint; array_of_statuses:array of MPI_Status):MPI_result;external mpi_library name 'PMPI_Testall';

  function PMPI_Testany(count:cint; array_of_requests:array of MPI_Request; var index:cint; var flag:cint; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Testany';

  function PMPI_Test(var request:MPI_Request; var flag:cint; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Test';

  function PMPI_Test_cancelled(var status:MPI_Status; var flag:cint):MPI_result;external mpi_library name 'PMPI_Test_cancelled';

  function PMPI_Testsome(incount:cint; array_of_requests:array of MPI_Request; var outcount:cint; array_of_indices:array of cint; array_of_statuses:array of MPI_Status):MPI_result;external mpi_library name 'PMPI_Testsome';

  function PMPI_Topo_test(comm:MPI_comm; var status:cint):MPI_result;external mpi_library name 'PMPI_Topo_test';

  function PMPI_Type_c2f(datatype:MPI_Datatype):MPI_Fint;external mpi_library name 'PMPI_Type_c2f';

  function PMPI_Type_commit(var _type:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_commit';

  function PMPI_Type_contiguous(count:cint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_contiguous';

  function PMPI_Type_create_darray(size:cint; rank:cint; ndims:cint; gsize_array:array of cint; distrib_array:array of cint; 
             darg_array:array of cint; psize_array:array of cint; order:cint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_darray';

  function PMPI_Type_create_f90_complex(p:cint; r:cint; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_f90_complex';

  function PMPI_Type_create_f90_integer(r:cint; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_f90_integer';

  function PMPI_Type_create_f90_real(p:cint; r:cint; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_f90_real';

  function PMPI_Type_create_hindexed(count:cint; array_of_blocklengths:array of cint; array_of_displacements:array of ptruint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_hindexed';

  function PMPI_Type_create_hvector(count:cint; blocklength:cint; stride:ptruint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_hvector';

  function PMPI_Type_create_keyval(var type_copy_attr_fn:MPI_Type_copy_attr_function; var type_delete_attr_fn:MPI_Type_delete_attr_function; var type_keyval:cint; var extra_state:pointer):MPI_result;external mpi_library name 'PMPI_Type_create_keyval'

  function PMPI_Type_create_indexed_block(count:cint; blocklength:cint; array_of_displacements:array of cint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_indexed_block';

  function PMPI_Type_create_struct(count:cint; array_of_block_lengths:array of cint; array_of_displacements:array of ptruint; array_of_types:array of MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_struct';

  function PMPI_Type_create_subarray(ndims:cint; size_array:array of cint; subsize_array:array of cint; start_array:array of cint; order:cint; 
             oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_subarray';

  function PMPI_Type_create_resized(oldtype:MPI_Datatype; lb:ptruint; extent:ptruint; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_create_resized';

  function PMPI_Type_delete_attr(_type:MPI_Datatype; type_keyval:cint):MPI_result;external mpi_library name 'PMPI_Type_delete_attr';

  function PMPI_Type_dup(_type:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_dup';

  function PMPI_Type_extent(_type:MPI_Datatype; var extent:ptruint):MPI_result;external mpi_library name 'PMPI_Type_extent';

  function PMPI_Type_free(var _type:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_free';

  function PMPI_Type_free_keyval(var type_keyval:cint):MPI_result;external mpi_library name 'PMPI_Type_free_keyval';

  function PMPI_Type_f2c(datatype:MPI_Fint):MPI_Datatype;external mpi_library name 'PMPI_Type_f2c';

  function PMPI_Type_get_attr(_type:MPI_Datatype; type_keyval:cint; var attribute_val:pointer; var flag:cint):MPI_result;external mpi_library name 'PMPI_Type_get_attr';

  function PMPI_Type_get_contents(mtype:MPI_Datatype; max_integers:cint; max_addresses:cint; max_datatypes:cint; array_of_integers:array of cint; 
             array_of_addresses:array of ptruint; array_of_datatypes:array of MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_get_contents';

  function PMPI_Type_get_envelope(_type:MPI_Datatype; var num_integers:cint; var num_addresses:cint; var num_datatypes:cint; var combiner:cint):MPI_result;external mpi_library name 'PMPI_Type_get_envelope';

  function PMPI_Type_get_extent(_type:MPI_Datatype; var lb:ptruint; var extent:ptruint):MPI_result;external mpi_library name 'PMPI_Type_get_extent';

  function PMPI_Type_get_name(_type:MPI_Datatype; type_name:pcchar; var resultlen:cint):MPI_result;external mpi_library name 'PMPI_Type_get_name';

  function PMPI_Type_get_true_extent(datatype:MPI_Datatype; var true_lb:ptruint; var true_extent:ptruint):MPI_result;external mpi_library name 'PMPI_Type_get_true_extent';

  function PMPI_Type_hindexed(count:cint; array_of_blocklengths:array of cint; array_of_displacements:array of ptruint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_hindexed';

  function PMPI_Type_hvector(count:cint; blocklength:cint; stride:ptruint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_hvector';

  function PMPI_Type_indexed(count:cint; array_of_blocklengths:array of cint; array_of_displacements:array of cint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_indexed';

  function PMPI_Type_lb(_type:MPI_Datatype; var lb:ptruint):MPI_result;external mpi_library name 'PMPI_Type_lb';

  function PMPI_Type_match_size(typeclass:cint; size:cint; var _type:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_match_size';

  function PMPI_Type_set_attr(_type:MPI_Datatype; type_keyval:cint; var attr_val:pointer):MPI_result;external mpi_library name 'PMPI_Type_set_attr';

  function PMPI_Type_set_name(_type:MPI_Datatype; type_name:pcchar):MPI_result;external mpi_library name 'PMPI_Type_set_name';

  function PMPI_Type_size(_type:MPI_Datatype; var size:cint):MPI_result;external mpi_library name 'PMPI_Type_size';

  function PMPI_Type_struct(count:cint; array_of_blocklengths:array of cint; array_of_displacements:array of ptruint; array_of_types:array of MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_struct';

  function PMPI_Type_ub(mtype:MPI_Datatype; var ub:ptruint):MPI_result;external mpi_library name 'PMPI_Type_ub';

  function PMPI_Type_vector(count:cint; blocklength:cint; stride:cint; oldtype:MPI_Datatype; var newtype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Type_vector';

  function PMPI_Unpack(var inbuf:pointer; insize:cint; var position:cint; var outbuf:pointer; outcount:cint; 
             datatype:MPI_Datatype; comm:MPI_comm):MPI_result;external mpi_library name 'PMPI_Unpack';

  function PMPI_Unpublish_name(service_name:pcchar; info:MPI_Info; port_name:pcchar):MPI_result;external mpi_library name 'PMPI_Unpublish_name';

  function PMPI_Unpack_external(datarep:pcchar; var inbuf:pointer; insize:ptruint; var position:ptruint; var outbuf:pointer; 
             outcount:cint; datatype:MPI_Datatype):MPI_result;external mpi_library name 'PMPI_Unpack_external';

  function PMPI_Waitall(count:cint; var array_of_requests:MPI_Request; var array_of_statuses:MPI_Status):MPI_result;external mpi_library name 'PMPI_Waitall';

  function PMPI_Waitany(count:cint; var array_of_requests:MPI_Request; var index:cint; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Waitany';

  function PMPI_Wait(var request:MPI_Request; var status:MPI_Status):MPI_result;external mpi_library name 'PMPI_Wait';

  function PMPI_Waitsome(incount:cint; var array_of_requests:MPI_Request; var outcount:cint; var array_of_indices:cint; var array_of_statuses:MPI_Status):MPI_result;external mpi_library name 'PMPI_Waitsome';

  function PMPI_Win_c2f(win:MPI_Win):MPI_Fint;external mpi_library name 'PMPI_Win_c2f';

  function PMPI_Win_call_errhandler(win:MPI_Win; errorcode:cint):MPI_result;external mpi_library name 'PMPI_Win_call_errhandler';

  function PMPI_Win_complete(win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_complete';

  function PMPI_Win_create(var base:pointer; size:ptruint; disp_unit:cint; info:MPI_Info; comm:MPI_comm; 
             var win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_create';

  function PMPI_Win_create_errhandler(var _function:MPI_Win_errhandler_fn; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Win_create_errhandler';

  function PMPI_Win_create_keyval(var win_copy_attr_fn:MPI_Win_copy_attr_function; var win_delete_attr_fn:MPI_Win_delete_attr_function; var win_keyval:cint; var extra_state:pointer):MPI_result;external mpi_library name 'PMPI_Win_create_keyval';

  function PMPI_Win_delete_attr(win:MPI_Win; win_keyval:cint):MPI_result;external mpi_library name 'PMPI_Win_delete_attr';

  function PMPI_Win_f2c(win:MPI_Fint):MPI_Win;external mpi_library name 'PMPI_Win_f2c';

  function PMPI_Win_fence(assert:cint; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_fence';

  function PMPI_Win_free(var win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_free';

  function PMPI_Win_free_keyval(var win_keyval:cint):MPI_result;external mpi_library name 'PMPI_Win_free_keyval';

  function PMPI_Win_get_attr(win:MPI_Win; win_keyval:cint; var attribute_val:pointer; var flag:cint):MPI_result;external mpi_library name 'PMPI_Win_get_attr';

  function PMPI_Win_get_errhandler(win:MPI_Win; var errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Win_get_errhandler';

  function PMPI_Win_get_group(win:MPI_Win; var group:MPI_Group):MPI_result;external mpi_library name 'PMPI_Win_get_group';

  function PMPI_Win_get_name(win:MPI_Win; win_name:pcchar; var resultlen:cint):MPI_result;external mpi_library name 'PMPI_Win_get_name';

  function PMPI_Win_lock(lock_type:cint; rank:cint; assert:cint; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_lock';

  function PMPI_Win_post(group:MPI_Group; assert:cint; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_post';

  function PMPI_Win_set_attr(win:MPI_Win; win_keyval:cint; var attribute_val:pointer):MPI_result;external mpi_library name 'PMPI_Win_set_attr';

  function PMPI_Win_set_errhandler(win:MPI_Win; errhandler:MPI_Errhandler):MPI_result;external mpi_library name 'PMPI_Win_set_errhandler';

  function PMPI_Win_set_name(win:MPI_Win; win_name:pcchar):MPI_result;external mpi_library name 'PMPI_Win_set_name';

  function PMPI_Win_start(group:MPI_Group; assert:cint; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_start';

  function PMPI_Win_test(win:MPI_Win; var flag:cint):MPI_result;external mpi_library name 'PMPI_Win_test';

  function PMPI_Win_unlock(rank:cint; win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_unlock';

  function PMPI_Win_wait(win:MPI_Win):MPI_result;external mpi_library name 'PMPI_Win_wait';

  function PMPI_Wtick:double;external mpi_library name 'PMPI_Wtick';

  function PMPI_Wtime:double;external mpi_library name 'PMPI_Wtime';

*)


{****************************************************************************}
implementation
{****************************************************************************}



{Some wrappers around C functions.}

function ompi_C_MPI_init(var argc:cint;var argv:PPchar):MPI_result;
         external mpi_library name 'MPI_Init';
function ompi_C_MPI_init_thread(var argc:cint;
                                var argv:Ppchar;
                                required:MPI_thread_level;
				var provided:MPI_thread_level
			       ):MPI_result;
	 external mpi_library name 'MPI_Init_thread';

function MPI_init:MPI_result;
	 
begin
  MPI_init:=ompi_C_MPI_init(argc,argv);
end;

function MPI_init_thread(required:MPI_thread_level;
                         var provided:MPI_thread_level
			):MPI_result;
			
begin
  MPI_init_thread:=ompi_C_MPI_init_thread(argc,argv,required,provided);
end;

end.
