1 #ifndef lint 2 static char vcid[] = "$Id: mmdense.c,v 1.2 1995/10/23 21:11:46 curfman Exp curfman $"; 3 #endif 4 5 /* 6 Support for the parallel dense matrix vector multiply 7 */ 8 #include "mpidense.h" 9 #include "vec/vecimpl.h" 10 11 int MatSetUpMultiply_MPIDense(Mat mat) 12 { 13 Mat_MPIDense *mdn = (Mat_MPIDense *) mat->data; 14 int ierr; 15 IS to, from; 16 Vec gvec; 17 18 int mytid, low, high, lsize, i, iglobal; 19 Scalar zero = 0.0, value; 20 21 /* Create local vector that is used to scatter into */ 22 ierr = VecCreateSeq(MPI_COMM_SELF,mdn->N,&mdn->lvec); CHKERRQ(ierr); 23 24 25 /* Create temporary index set for building scatter gather */ 26 ierr = ISCreateStrideSeq(MPI_COMM_SELF,mdn->N,0,1,&to); CHKERRQ(ierr); 27 ierr = ISCreateStrideSeq(MPI_COMM_SELF,mdn->N,0,1,&from); CHKERRQ(ierr); 28 29 /* Create temporary global vector to generate scatter context */ 30 ierr = VecCreateMPI(mat->comm,PETSC_DECIDE,mdn->N,&gvec); CHKERRQ(ierr); 31 32 MPI_Comm_rank(mat->comm,&mytid); 33 ierr = VecSet(&zero,mdn->lvec); CHKERRA(ierr); 34 ierr = VecGetOwnershipRange(gvec,&low,&high); CHKERRA(ierr); 35 ierr = VecGetLocalSize(gvec,&lsize); CHKERRA(ierr); 36 printf("[%d] low=%d, high=%d, mdn->n=%d, mdn->N=%d \n", 37 mytid, low, high,mdn->n,mdn->N); 38 for ( i=0; i<lsize; i++ ) { 39 iglobal = i + low; value = (Scalar) (i + 100*mytid); 40 printf("[%d] i=%d, ig=%d, val=%g\n",mytid,i,iglobal,value); 41 ierr = VecSetValues(gvec,1,&iglobal,&value,INSERT_VALUES); CHKERRA(ierr); 42 } 43 44 45 /* Generate the scatter context */ 46 ierr = VecScatterCreate(gvec,from,mdn->lvec,to,&mdn->Mvctx); CHKERRQ(ierr); 47 PLogObjectParent(mat,mdn->Mvctx); 48 PLogObjectParent(mat,mdn->lvec); 49 PLogObjectParent(mat,from); 50 PLogObjectParent(mat,to); 51 52 ierr = VecScatterBegin(gvec,mdn->lvec,ADD_VALUES,SCATTER_ALL,mdn->Mvctx); 53 CHKERRQ(ierr); 54 ierr = VecScatterEnd(gvec,mdn->lvec,ADD_VALUES,SCATTER_ALL,mdn->Mvctx); 55 CHKERRQ(ierr); 56 57 printf("processor %d\n", mytid); 58 ierr = VecView(mdn->lvec,STDOUT_VIEWER_SELF); CHKERRQ(ierr); 59 MPI_Barrier(MPI_COMM_WORLD); 60 PetscFinalize(); 61 exit(0); 62 63 ierr = ISDestroy(from); CHKERRQ(ierr); 64 ierr = ISDestroy(to); CHKERRQ(ierr); 65 ierr = VecDestroy(gvec); 66 return 0; 67 } 68 69 70 71