parallel/getBlocksOfEntitiesPartition.c
#include <med.h>
#define MESGERR 1
#include "med_utils.h"
#include "getBlocksOfEntitiesPartition.h"
void getContinuousBlocksOfEntities(const int myrank, const int nproc, const int nentities,
                                    med_size * const start, med_size * const stride, med_size * const count, med_size * blocksize,
                                    int * const lastusedrank, med_size * const lastblocksize ) {
    int      _nusedproc      = nproc;
    int      _lastusedrank   = 0;
    med_size _blocksize      = nentities/nproc;
    
    int      _nblocks_pproc  = 0;
    
    for (; (_blocksize < 1) && ( _nusedproc > 1 ) ; ) {
      SSCRUTE("NOT USING ALL PROCESS");
      --_nusedproc;
      _blocksize = nentities/_nusedproc;
    }
    _lastusedrank   = _nusedproc-1;
    if ( myrank < _nusedproc)
      _nblocks_pproc = 1;
    else
      _blocksize = 0;
 
    *start         = myrank*_nblocks_pproc*_blocksize;
    *stride        = _blocksize;
    *count         = _nblocks_pproc;
    *lastblocksize = 0;
    if ( myrank == _lastusedrank ) {
      *blocksize = nentities+_blocksize*(1-_nusedproc);
    } else {
      *blocksize =_blocksize;
    }
    ++(*start);
    *lastusedrank=_lastusedrank;
    printf("My rank %d , start %l , stride %l , blocksize %l , count %l , lastblocksize %l\n",
           myrank,*start,*stride,*blocksize,*count,*lastblocksize);
    return;
}
void getCyclicBlocksOfEntities(const int myrank, const int nproc, const int nentities,
                               med_size * const start, med_size * const stride,  med_size * const io_count, med_size * blocksize,
                               int * const lastusedrank, med_size * const lastblocksize ) {
    int      _nusedproc      = nproc;
    int      _lastusedrank   = nproc-1;
    int      _nblocks_pproc  = *io_count;
    int      _nblocks        = _nblocks_pproc*nproc;
    med_size _blocksize      = 0;
    if (_nblocks) _blocksize=nentities/_nblocks;
    
    for (; (_blocksize < 1) && ( _nblocks_pproc > 1 ) ; ) {
      --_nblocks_pproc;
      _nblocks   = _nblocks_pproc*nproc;
      _blocksize = nentities/_nblocks;
    }
    
    if ( _blocksize == 0 ) {
      MESSAGE("Downcasting getCyclicBlocksOfEntities to getContinuousBlocksOfEntities");
      getContinuousBlocksOfEntities(myrank, nproc, nentities,
                                    start, stride, io_count, blocksize, lastusedrank, lastblocksize );
      return;
    }
    
    *blocksize     = _blocksize;
    *stride        = _blocksize*nproc;
    *start         = _blocksize*myrank;
    *io_count      = _nblocks_pproc;
    if (myrank == _lastusedrank) {
      *lastblocksize = nentities + _blocksize*(1-nproc*_nblocks_pproc);
      
      if ( _nblocks_pproc == 1 ) {*blocksize=*lastblocksize;*lastblocksize=0;}
    } else
      *lastblocksize=0;
    ++(*start);
    *lastusedrank=_lastusedrank;
    return;
}