/*$Id: sbaijov.c,v 1.65 2001/08/06 21:15:42 bsmith Exp $*/ /* Routines to compute overlapping regions of a parallel MPI matrix. Used for finding submatrices that were shared across processors. */ #include "src/mat/impls/sbaij/mpi/mpisbaij.h" #include "petscbt.h" static int MatIncreaseOverlap_MPISBAIJ_Once(Mat,int,IS *); static int MatIncreaseOverlap_MPISBAIJ_Local(Mat,int,char **,int*,int**); static int MatIncreaseOverlap_MPISBAIJ_Receive(Mat,int,int **,int**,int*); /* this function is sasme as MatCompressIndicesGeneral_MPIBAIJ -- should be removed! */ #undef __FUNCT__ #define __FUNCT__ "MatCompressIndicesGeneral_MPISBAIJ" static int MatCompressIndicesGeneral_MPISBAIJ(Mat C,int imax,const IS is_in[],IS is_out[]) { Mat_MPISBAIJ *baij = (Mat_MPISBAIJ*)C->data; int ierr,isz,bs = baij->bs,n,i,j,*idx,ival; #if defined (PETSC_USE_CTABLE) PetscTable gid1_lid1; int tt, gid1, *nidx; PetscTablePosition tpos; #else int Nbs,*nidx; PetscBT table; #endif PetscFunctionBegin; /* printf(" ...MatCompressIndicesGeneral_MPISBAIJ is called ...\n"); */ #if defined (PETSC_USE_CTABLE) ierr = PetscTableCreate(baij->mbs,&gid1_lid1);CHKERRQ(ierr); #else Nbs = baij->Nbs; ierr = PetscMalloc((Nbs+1)*sizeof(int),&nidx);CHKERRQ(ierr); ierr = PetscBTCreate(Nbs,table);CHKERRQ(ierr); #endif for (i=0; iNbs) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"index greater than mat-dim"); if(!PetscBTLookupSet(table,ival)) { nidx[isz++] = ival;} #endif } ierr = ISRestoreIndices(is_in[i],&idx);CHKERRQ(ierr); #if defined (PETSC_USE_CTABLE) ierr = PetscMalloc((isz+1)*sizeof(int),&nidx);CHKERRQ(ierr); ierr = PetscTableGetHeadPosition(gid1_lid1,&tpos);CHKERRQ(ierr); j = 0; while (tpos) { ierr = PetscTableGetNext(gid1_lid1,&tpos,&gid1,&tt);CHKERRQ(ierr); if (tt-- > isz) { SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"index greater than array-dim"); } nidx[tt] = gid1 - 1; j++; } if (j != isz) { SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"table error: jj != isz"); } ierr = ISCreateGeneral(PETSC_COMM_SELF,isz,nidx,(is_out+i));CHKERRQ(ierr); ierr = PetscFree(nidx);CHKERRQ(ierr); #else ierr = ISCreateGeneral(PETSC_COMM_SELF,isz,nidx,(is_out+i));CHKERRQ(ierr); #endif } #if defined (PETSC_USE_CTABLE) ierr = PetscTableDelete(gid1_lid1);CHKERRQ(ierr); #else ierr = PetscBTDestroy(table);CHKERRQ(ierr); ierr = PetscFree(nidx);CHKERRQ(ierr); #endif PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatCompressIndicesSorted_MPISBAIJ" static int MatCompressIndicesSorted_MPISBAIJ(Mat C,int imax,const IS is_in[],IS is_out[]) { Mat_MPISBAIJ *baij = (Mat_MPISBAIJ*)C->data; int ierr,bs=baij->bs,i,j,k,val,n,*idx,*nidx,*idx_local; PetscTruth flg; #if defined (PETSC_USE_CTABLE) int maxsz; #else int Nbs=baij->Nbs; #endif PetscFunctionBegin; printf(" ... MatCompressIndicesSorted_MPISBAIJ is called ...\n"); for (i=0; i maxsz) maxsz = n; } ierr = PetscMalloc((maxsz+1)*sizeof(int),&nidx);CHKERRQ(ierr); #else ierr = PetscMalloc((Nbs+1)*sizeof(int),&nidx);CHKERRQ(ierr); #endif /* Now check if the indices are in block order */ for (i=0; idata; int ierr,bs = baij->bs,n,i,j,k,*idx,*nidx; #if defined (PETSC_USE_CTABLE) int maxsz; #else int Nbs = baij->Nbs; #endif PetscFunctionBegin; /* printf(" ... MatExpandIndices_MPISBAIJ is called ...\n"); */ #if defined (PETSC_USE_CTABLE) /* Now check max size */ for (i=0,maxsz=0; i maxsz) maxsz = n*bs; } ierr = PetscMalloc((maxsz+1)*sizeof(int),&nidx);CHKERRQ(ierr); #else ierr = PetscMalloc((Nbs*bs+1)*sizeof(int),&nidx);CHKERRQ(ierr); #endif for (i=0; idata; int **idx,*n,len,*idx_i; int size,rank,Mbs,i,j,k,ierr,**rbuf,nrqs,msz,*outdat,*indat; int *onodes1,*olengths1,tag1,tag2,*onodes2,*olengths2,flag,proc_id; MPI_Comm comm; MPI_Request *s_waits1,*s_waits2,r_req; MPI_Status *s_status,r_status; PetscFunctionBegin; comm = C->comm; size = c->size; rank = c->rank; Mbs = c->Mbs; /* 1. Send is[] to all other processors */ /*--------------------------------------*/ /* This processor sends its is[] to all other processors in the format: outdat[0] = is_max, no of is in this processor outdat[1] = n[0], size of is[0] ... outdat[is_max] = n[is_max-1], size of is[is_max-1] outdat[is_max + 1] = data(is[0]) ... outdat[is_max + i] = data(is[i]) ... */ ierr = PetscObjectGetNewTag((PetscObject)C,&tag1);CHKERRQ(ierr); ierr = PetscObjectGetNewTag((PetscObject)C,&tag2);CHKERRQ(ierr); printf(" [%d] tags: %d, %d\n",rank,tag1,tag2); len = (is_max+1)*sizeof(int*)+ (is_max)*sizeof(int); ierr = PetscMalloc(len,&idx);CHKERRQ(ierr); n = (int*)(idx + is_max); /* Allocate Memory for outgoing messages */ len = 1 + is_max; for (i=0; iA, B = c->B; Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Mat_SeqBAIJ *b = (Mat_SeqBAIJ*)B->data; int row,mbs, *nidx,*nidx_i,col,isz,isz0,*ai,*aj,bs,*bi,*bj,*garray,rstart,l; int a_start,a_end,b_start,b_end; PetscBT table; PetscBT table0; mbs = a->mbs; bs = a->bs; ai = a->i; aj = a->j; bi = b->i; bj = b->j; garray = c->garray; rstart = c->rstart; ierr = PetscBTCreate(Mbs,table);CHKERRQ(ierr); ierr = PetscMalloc(is_max*Mbs*sizeof(int),&nidx);CHKERRQ(ierr); ierr = PetscBTCreate(Mbs,table0);CHKERRQ(ierr); for (i=0; i= Mbs) SETERRQ3(PETSC_ERR_ARG_OUTOFRANGE,"[%d] index col %d >= Mbs %d",rank,col,Mbs); if(!PetscBTLookupSet(table,col)) { nidx_i[isz++] = col;} } k = 0; /* set table0 for lookup */ ierr = PetscBTMemzero(mbs,table0);CHKERRQ(ierr); for (l=k; l= isz0) break; /* for (row=0; rowdata; Mat A = c->A,B = c->B; Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Mat_SeqBAIJ *b = (Mat_SeqBAIJ*)B->data; int start,end,val,max,rstart,cstart,*ai,*aj; int *bi,*bj,*garray,i,j,k,row,*data_i,isz_i; PetscBT table_i; PetscFunctionBegin; rstart = c->rstart; cstart = c->cstart; ai = a->i; aj = a->j; bi = b->i; bj = b->j; garray = c->garray; for (i=0; idata; Mat A = c->A,B = c->B; Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Mat_SeqBAIJ *b = (Mat_SeqBAIJ*)B->data; int rstart,cstart,*ai,*aj,*bi,*bj,*garray,i,j,k; int row,total_sz,ct,ct1,ct2,ct3,mem_estimate,oct2,l,start,end; int val,max1,max2,rank,Mbs,no_malloc =0,*tmp,new_estimate,ctr; int *rbuf_i,kmax,rbuf_0,ierr; PetscBT xtable; PetscFunctionBegin; rank = c->rank; Mbs = c->Mbs; rstart = c->rstart; cstart = c->cstart; ai = a->i; aj = a->j; bi = b->i; bj = b->j; garray = c->garray; for (i=0,ct=0,total_sz=0; iMbs) max1 = ct*(a->nz +b->nz)/c->Mbs; else max1 = 1; mem_estimate = 3*((total_sz > max1 ? total_sz : max1)+1); ierr = PetscMalloc(mem_estimate*sizeof(int),&xdata[0]);CHKERRQ(ierr); ++no_malloc; ierr = PetscBTCreate(Mbs,xtable);CHKERRQ(ierr); ierr = PetscMemzero(isz1,nrqr*sizeof(int));CHKERRQ(ierr); ct3 = 0; for (i=0; i