Provided by: pvm-dev_3.4.5-12.3_amd64 bug


       pvm_pack - Pack the active message buffer with arrays of prescribed data type.


            int info = pvm_packf( const char *fmt, ... )
            int info = pvm_pkbyte( char *xp, int nitem, int stride )
            int info = pvm_pkcplx( float *cp, int nitem, int stride )
            int info = pvm_pkdcplx( double *zp, int nitem, int stride )
            int info = pvm_pkdouble( double *dp, int nitem, int stride )
            int info = pvm_pkfloat( float *fp, int nitem, int stride )
            int info = pvm_pkint( int *ip, int nitem, int stride )
            int info = pvm_pkuint( unsigned int *ip, int nitem, int stride )
            int info = pvm_pkushort( unsigned short *ip, int nitem, int stride )
            int info = pvm_pkulong( unsigned long *ip, int nitem, int stride )
            int info = pvm_pklong( long *ip, int nitem, int stride )
            int info = pvm_pkshort( short *jp, int nitem, int stride )
            int info = pvm_pkstr( char *sp )

            call pvmfpack( what, xp, nitem, stride, info )


       fmt     Printf-like format expression specifying what to pack. (See discussion).

       nitem   The total number of items to be packed (not the number of bytes).

       stride  The  stride  to  be  used  when  packing the items.  For example, if stride = 2 in
               pvm_pkcplx, then every other complex number will be packed.

       xp      Pointer to the beginning of a block of bytes. Can be any data type, but must match
               the corresponding unpack data type.

       cp      Complex array at least nitem*stride items long.

       zp      Double precision complex array at least nitem*stride items long.

       dp      Double precision real array at least nitem*stride items long.

       fp      Real array at least nitem*stride items long.

       ip      Integer array at least nitem*stride items long.

       jp      Integer*2 array at least nitem*stride items long.

       sp      Pointer to a null terminated character string.

       what    Integer specifying the type of data being packed.
                    what options
                    STRING         0    REAL4          4
                    BYTE1          1    COMPLEX8       5
                    INTEGER2       2    REAL8          6
                    INTEGER4       3    COMPLEX16      7

       info    Integer  status  code  returned by the routine.  Values less than zero indicate an


       Each of the pvm_pk* routines packs an array of the given data type into  the  active  send
       buffer.   The  arguments  for  each  of the routines are a pointer to the first item to be
       packed, nitem which is the total number of items to pack from this array, and stride which
       is the stride to use when packing.

       An  exception  is pvm_pkstr() which by definition packs a NULL terminated character string
       and thus does not need nitem or stride arguments.  The Fortran routine  pvmfpack(  STRING,
       ... ) expects nitem to be the number of characters in the string and stride to be 1.

       A  null  string  ("")  can  be packed; this is just a string with no characters before the
       terminating '\0'.  However, packing a null string pointer, (char *)0, is not allowed.

       If the packing is successful, info will be 0. If some error occurs then info will be < 0.

       A single variable (not an array) can be packed by setting nitem = 1 and stride = 1.

       The routine pvm_packf() uses a printf-like format expression to specify what  and  how  to
       pack data into the send buffer.  All variables are passed as addresses if count and stride
       are specified otherwise, variables are assumed to be values.  A  BNF-like  description  of
       the format syntax is:
           format : null | init | format fmt
           init : null | '%' '+'
           fmt : '%' count stride modifiers fchar
           fchar : 'c' | 'd' | 'f' | 'x' | 's'
           count : null | [0-9]+ | '*'
           stride : null | '.' ( [0-9]+ | '*' )
           modifiers : null | modifiers mchar
           mchar : 'h' | 'l' | 'u'

         +  means initsend - must match an int (how) in the param list.
         c  pack/unpack bytes
         d  integers
         f  float
         x  complex float
         s  string

         h  short (int)
         l  long  (int, float, complex float)
         u  unsigned (int)

       Future  extensions  to  the  what  argument in pvmfpack will include 64 bit types when XDR
       encoding of these types is available.  Meanwhile users should be aware that precision  can
       be  lost  when  passing  data from a 64 bit machine like a Cray to a 32 bit machine like a
       SPARCstation. As a mnemonic the what  argument  name  includes  the  number  of  bytes  of
       precision  to  expect.  By  setting  encoding  to  PVMRAW  (see  pvmfinitsend) data can be
       transferred between two 64 bit machines with full precision even if the PVM  configuration
       is heterogeneous.

       Messages  should  be  unpacked  exactly  like  they  were packed to insure data integrity.
       Packing integers and unpacking them as floats will often fail because a type encoding will
       have  occurred  transferring the data between heterogeneous hosts. Packing 10 integers and
       100 floats then trying to unpack only 3 integers and the 100 floats will also fail.


            info = pvm_initsend( PvmDataDefault );
            info = pvm_pkstr( "initial data" );
            info = pvm_pkint( &size, 1, 1 );
            info = pvm_pkint( array, size, 1 );
            info = pvm_pkdouble( matrix, size*size, 1 );
            msgtag = 3 ;
            info = pvm_send( tid, msgtag );

           int count, *iarry;
           double darry[4];
           pvm_packf("%+ %d %*d %4lf", PvmDataRaw, count, count, iarry, darry);

            CALL PVMFPACK( INTEGER4, NSIZE, 1, 1, INFO )
            CALL PVMFPACK( STRING, 'row 5 of NXN matrix', 19, 1, INFO )
            CALL PVMFPACK( REAL8, A(5,1), NSIZE, NSIZE , INFO )


       Strings cannot be packed when using the PvmDataInPlace encoding, due to limitations in the
       implementation.  Attempting to pack a string using pvm_pkstr or pvm_packf will cause error
       code PvmNotImpl to be returned.


              Malloc has failed. Message buffer size has exceeded the available  memory  on  this

              There  is  no  active  send  buffer  to pack into.  Try calling pvm_initsend before
              packing message.

              Attempt to pack a value too large.  E.g. packing an 8-byte long with  XDR  encoding
              if the value won't fit into 4 bytes.


       pvm_initsend(3PVM), pvm_unpack(3PVM), pvm_send(3PVM), pvm_recv(3PVM), pvm_pkmesg(3PVM)

                                         30 August, 1993                               PACK(3PVM)