ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
BI_MpathBR.c File Reference
#include "Bdef.h"
Include dependency graph for BI_MpathBR.c:

Go to the source code of this file.

Functions/Subroutines

void BI_MpathBR (BLACSCONTEXT *ctxt, BLACBUFF *bp, SDRVPTR send, int src, int npaths)

Function/Subroutine Documentation

void BI_MpathBR ( BLACSCONTEXT *  ctxt,
BLACBUFF *  bp,
SDRVPTR  send,
int  src,
int  npaths 
)

Definition at line 3 of file BI_MpathBR.c.

{
   void BI_Arecv(BLACSCONTEXT *, int, int, BLACBUFF *);
   int BI_BuffIsFree(BLACBUFF *, int);

   int pathlen;         /* the minimal length of each path */
   int mydist;          /* my distance from src */
   int faredge;         /* node at far end of path */
   int lastlong;        /* distance to node on end of last path with extra node */
   int Np, Iam, msgid, Np_1, dest;

   msgid = Mscopeid(ctxt);
   BI_Arecv(ctxt, BANYNODE, msgid, bp);
   Np = ctxt->scp->Np;
   Iam = ctxt->scp->Iam;
   Np_1 = Np - 1;
   if (npaths == FULLCON) npaths = Np_1;

   if (npaths > 0)
   {
      dest = (Iam+1) % Np;
      mydist = (Np + Iam - src) % Np;
   }
   else
   {
      dest = (Np_1+Iam) % Np;
      mydist = (Np + src - Iam) % Np;
      npaths = -npaths;
   }
/*
 * Make sure npaths is cool
 */
   if (npaths > Np_1) npaths = Np_1;

   pathlen = Np_1 / npaths;
   lastlong = (Np_1%npaths) * (pathlen+1);
   if (lastlong)
   {
      if (mydist <= lastlong) faredge = ((mydist-1)/(pathlen+1)+1)*(pathlen+1);
      else faredge = ((lastlong-1)/(pathlen+1)+1) * (pathlen+1)
                     + ((mydist-lastlong-1)/pathlen + 1) * pathlen;
   }
   else faredge = ((mydist-1)/pathlen + 1) * pathlen;

   BI_BuffIsFree(bp, 1);        /* wait for recv to complete */
   if (mydist < faredge) send(ctxt, dest, msgid, bp);
}

Here is the call graph for this function:

Here is the caller graph for this function: