10500aeceSBarry Smith #ifndef lint 2*e19c7942SLois Curfman McInnes static char vcid[] = "$Id: mmdense.c,v 1.2 1995/10/23 21:11:46 curfman Exp curfman $"; 30500aeceSBarry Smith #endif 40500aeceSBarry Smith 50500aeceSBarry Smith /* 60500aeceSBarry Smith Support for the parallel dense matrix vector multiply 70500aeceSBarry Smith */ 80500aeceSBarry Smith #include "mpidense.h" 90500aeceSBarry Smith #include "vec/vecimpl.h" 100500aeceSBarry Smith 110500aeceSBarry Smith int MatSetUpMultiply_MPIDense(Mat mat) 120500aeceSBarry Smith { 130500aeceSBarry Smith Mat_MPIDense *mdn = (Mat_MPIDense *) mat->data; 140500aeceSBarry Smith int ierr; 15*e19c7942SLois Curfman McInnes IS to, from; 160500aeceSBarry Smith Vec gvec; 170500aeceSBarry Smith 18*e19c7942SLois Curfman McInnes int mytid, low, high, lsize, i, iglobal; 19*e19c7942SLois Curfman McInnes Scalar zero = 0.0, value; 20*e19c7942SLois Curfman McInnes 210500aeceSBarry Smith /* Create local vector that is used to scatter into */ 220500aeceSBarry Smith ierr = VecCreateSeq(MPI_COMM_SELF,mdn->N,&mdn->lvec); CHKERRQ(ierr); 230500aeceSBarry Smith 24*e19c7942SLois Curfman McInnes 250500aeceSBarry Smith /* Create temporary index set for building scatter gather */ 26*e19c7942SLois Curfman McInnes ierr = ISCreateStrideSeq(MPI_COMM_SELF,mdn->N,0,1,&to); CHKERRQ(ierr); 27*e19c7942SLois Curfman McInnes ierr = ISCreateStrideSeq(MPI_COMM_SELF,mdn->N,0,1,&from); CHKERRQ(ierr); 280500aeceSBarry Smith 290500aeceSBarry Smith /* Create temporary global vector to generate scatter context */ 30*e19c7942SLois Curfman McInnes ierr = VecCreateMPI(mat->comm,PETSC_DECIDE,mdn->N,&gvec); CHKERRQ(ierr); 31*e19c7942SLois Curfman McInnes 32*e19c7942SLois Curfman McInnes MPI_Comm_rank(mat->comm,&mytid); 33*e19c7942SLois Curfman McInnes ierr = VecSet(&zero,mdn->lvec); CHKERRA(ierr); 34*e19c7942SLois Curfman McInnes ierr = VecGetOwnershipRange(gvec,&low,&high); CHKERRA(ierr); 35*e19c7942SLois Curfman McInnes ierr = VecGetLocalSize(gvec,&lsize); CHKERRA(ierr); 36*e19c7942SLois Curfman McInnes printf("[%d] low=%d, high=%d, mdn->n=%d, mdn->N=%d \n", 37*e19c7942SLois Curfman McInnes mytid, low, high,mdn->n,mdn->N); 38*e19c7942SLois Curfman McInnes for ( i=0; i<lsize; i++ ) { 39*e19c7942SLois Curfman McInnes iglobal = i + low; value = (Scalar) (i + 100*mytid); 40*e19c7942SLois Curfman McInnes printf("[%d] i=%d, ig=%d, val=%g\n",mytid,i,iglobal,value); 41*e19c7942SLois Curfman McInnes ierr = VecSetValues(gvec,1,&iglobal,&value,INSERT_VALUES); CHKERRA(ierr); 42*e19c7942SLois Curfman McInnes } 43*e19c7942SLois Curfman McInnes 440500aeceSBarry Smith 450500aeceSBarry Smith /* Generate the scatter context */ 46*e19c7942SLois Curfman McInnes ierr = VecScatterCreate(gvec,from,mdn->lvec,to,&mdn->Mvctx); CHKERRQ(ierr); 470500aeceSBarry Smith PLogObjectParent(mat,mdn->Mvctx); 480500aeceSBarry Smith PLogObjectParent(mat,mdn->lvec); 49*e19c7942SLois Curfman McInnes PLogObjectParent(mat,from); 50*e19c7942SLois Curfman McInnes PLogObjectParent(mat,to); 51*e19c7942SLois Curfman McInnes 52*e19c7942SLois Curfman McInnes ierr = VecScatterBegin(gvec,mdn->lvec,ADD_VALUES,SCATTER_ALL,mdn->Mvctx); 53*e19c7942SLois Curfman McInnes CHKERRQ(ierr); 54*e19c7942SLois Curfman McInnes ierr = VecScatterEnd(gvec,mdn->lvec,ADD_VALUES,SCATTER_ALL,mdn->Mvctx); 55*e19c7942SLois Curfman McInnes CHKERRQ(ierr); 56*e19c7942SLois Curfman McInnes 57*e19c7942SLois Curfman McInnes printf("processor %d\n", mytid); 58*e19c7942SLois Curfman McInnes ierr = VecView(mdn->lvec,STDOUT_VIEWER_SELF); CHKERRQ(ierr); 59*e19c7942SLois Curfman McInnes MPI_Barrier(MPI_COMM_WORLD); 60*e19c7942SLois Curfman McInnes PetscFinalize(); 61*e19c7942SLois Curfman McInnes exit(0); 62*e19c7942SLois Curfman McInnes 63*e19c7942SLois Curfman McInnes ierr = ISDestroy(from); CHKERRQ(ierr); 64*e19c7942SLois Curfman McInnes ierr = ISDestroy(to); CHKERRQ(ierr); 650500aeceSBarry Smith ierr = VecDestroy(gvec); 660500aeceSBarry Smith return 0; 670500aeceSBarry Smith } 680500aeceSBarry Smith 690500aeceSBarry Smith 700500aeceSBarry Smith 71