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