xref: /petsc/src/mat/impls/dense/mpi/mmdense.c (revision e19c7942e3adf0763d3fad0abdc837b36c770028)
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