xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 00c67f3b09c0bcda06af5ed306d845d9138e5003)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/
7c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
10b2573a8aSBarry Smith 
116a63e612SBarry Smith #undef __FUNCT__
123f49a652SStefano Zampini #define __FUNCT__ "MatZeroRowsColumns_SeqDense"
133f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
143f49a652SStefano Zampini {
153f49a652SStefano Zampini   PetscErrorCode    ierr;
163f49a652SStefano Zampini   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
173f49a652SStefano Zampini   PetscInt          m  = l->lda, n = A->cmap->n,r = A->rmap->n, i,j;
183f49a652SStefano Zampini   PetscScalar       *slot,*bb;
193f49a652SStefano Zampini   const PetscScalar *xx;
203f49a652SStefano Zampini 
213f49a652SStefano Zampini   PetscFunctionBegin;
223f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG)
233f49a652SStefano Zampini   for (i=0; i<N; i++) {
243f49a652SStefano Zampini     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
253f49a652SStefano Zampini     if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n);
263f49a652SStefano Zampini     if (rows[i] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %D requested to be zeroed greater than or equal number of cols %D",rows[i],A->cmap->n);
273f49a652SStefano Zampini   }
283f49a652SStefano Zampini #endif
293f49a652SStefano Zampini 
303f49a652SStefano Zampini   /* fix right hand side if needed */
313f49a652SStefano Zampini   if (x && b) {
323f49a652SStefano Zampini     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
333f49a652SStefano Zampini     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
343f49a652SStefano Zampini     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
353f49a652SStefano Zampini     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
363f49a652SStefano Zampini     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
373f49a652SStefano Zampini   }
383f49a652SStefano Zampini 
393f49a652SStefano Zampini   for (i=0; i<N; i++) {
403f49a652SStefano Zampini     slot = l->v + rows[i]*m;
413f49a652SStefano Zampini     ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr);
423f49a652SStefano Zampini   }
433f49a652SStefano Zampini   for (i=0; i<N; i++) {
443f49a652SStefano Zampini     slot = l->v + rows[i];
453f49a652SStefano Zampini     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
463f49a652SStefano Zampini   }
473f49a652SStefano Zampini   if (diag != 0.0) {
483f49a652SStefano Zampini     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
493f49a652SStefano Zampini     for (i=0; i<N; i++) {
503f49a652SStefano Zampini       slot  = l->v + (m+1)*rows[i];
513f49a652SStefano Zampini       *slot = diag;
523f49a652SStefano Zampini     }
533f49a652SStefano Zampini   }
543f49a652SStefano Zampini   PetscFunctionReturn(0);
553f49a652SStefano Zampini }
563f49a652SStefano Zampini 
573f49a652SStefano Zampini #undef __FUNCT__
58abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense"
59abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C)
60abc3b08eSStefano Zampini {
61abc3b08eSStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)(C->data);
62abc3b08eSStefano Zampini   PetscErrorCode ierr;
63abc3b08eSStefano Zampini 
64abc3b08eSStefano Zampini   PetscFunctionBegin;
65abc3b08eSStefano Zampini   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr);
66abc3b08eSStefano Zampini   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr);
67abc3b08eSStefano Zampini   PetscFunctionReturn(0);
68abc3b08eSStefano Zampini }
69abc3b08eSStefano Zampini 
70abc3b08eSStefano Zampini #undef __FUNCT__
71abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense"
72abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C)
73abc3b08eSStefano Zampini {
74abc3b08eSStefano Zampini   Mat_SeqDense   *c;
75abc3b08eSStefano Zampini   PetscErrorCode ierr;
76abc3b08eSStefano Zampini 
77abc3b08eSStefano Zampini   PetscFunctionBegin;
78abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr);
79abc3b08eSStefano Zampini   c = (Mat_SeqDense*)((*C)->data);
80abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr);
81abc3b08eSStefano Zampini   PetscFunctionReturn(0);
82abc3b08eSStefano Zampini }
83abc3b08eSStefano Zampini 
84abc3b08eSStefano Zampini #undef __FUNCT__
85abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense"
86150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C)
87abc3b08eSStefano Zampini {
88abc3b08eSStefano Zampini   PetscErrorCode ierr;
89abc3b08eSStefano Zampini 
90abc3b08eSStefano Zampini   PetscFunctionBegin;
91abc3b08eSStefano Zampini   if (reuse == MAT_INITIAL_MATRIX) {
92abc3b08eSStefano Zampini     ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr);
93abc3b08eSStefano Zampini   }
94abc3b08eSStefano Zampini   ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
95abc3b08eSStefano Zampini   ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr);
96abc3b08eSStefano Zampini   ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
97abc3b08eSStefano Zampini   PetscFunctionReturn(0);
98abc3b08eSStefano Zampini }
99abc3b08eSStefano Zampini 
100abc3b08eSStefano Zampini #undef __FUNCT__
101b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense"
102cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
103b49cda9fSStefano Zampini {
104b49cda9fSStefano Zampini   Mat            B;
105b49cda9fSStefano Zampini   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
106b49cda9fSStefano Zampini   Mat_SeqDense   *b;
107b49cda9fSStefano Zampini   PetscErrorCode ierr;
108b49cda9fSStefano Zampini   PetscInt       *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
109b49cda9fSStefano Zampini   MatScalar      *av=a->a;
110b49cda9fSStefano Zampini 
111b49cda9fSStefano Zampini   PetscFunctionBegin;
112b49cda9fSStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
113b49cda9fSStefano Zampini   ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
114b49cda9fSStefano Zampini   ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
115b49cda9fSStefano Zampini   ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
116b49cda9fSStefano Zampini 
117b49cda9fSStefano Zampini   b  = (Mat_SeqDense*)(B->data);
118b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
119b49cda9fSStefano Zampini     PetscInt j;
120b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
121b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
122b49cda9fSStefano Zampini       aj++;
123b49cda9fSStefano Zampini       av++;
124b49cda9fSStefano Zampini     }
125b49cda9fSStefano Zampini     ai++;
126b49cda9fSStefano Zampini   }
127b49cda9fSStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
128b49cda9fSStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
129b49cda9fSStefano Zampini 
130511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
13128be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
132b49cda9fSStefano Zampini   } else {
133b49cda9fSStefano Zampini     *newmat = B;
134b49cda9fSStefano Zampini   }
135b49cda9fSStefano Zampini   PetscFunctionReturn(0);
136b49cda9fSStefano Zampini }
137b49cda9fSStefano Zampini 
138b49cda9fSStefano Zampini #undef __FUNCT__
1396a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
140cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
1416a63e612SBarry Smith {
1426a63e612SBarry Smith   Mat            B;
1436a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1446a63e612SBarry Smith   PetscErrorCode ierr;
1459399e1b8SMatthew G. Knepley   PetscInt       i, j;
1469399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
1479399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
1486a63e612SBarry Smith 
1496a63e612SBarry Smith   PetscFunctionBegin;
150ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
1516a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1526a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
1539399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
1549399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1559399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
1566a63e612SBarry Smith     aa += a->lda;
1576a63e612SBarry Smith   }
1589399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
1599399e1b8SMatthew G. Knepley   aa = a->v;
1609399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1619399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
1629399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
1639399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
1649399e1b8SMatthew G. Knepley     aa  += a->lda;
1659399e1b8SMatthew G. Knepley   }
1669399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
1676a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1686a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1696a63e612SBarry Smith 
170511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
17128be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
1726a63e612SBarry Smith   } else {
1736a63e612SBarry Smith     *newmat = B;
1746a63e612SBarry Smith   }
1756a63e612SBarry Smith   PetscFunctionReturn(0);
1766a63e612SBarry Smith }
1776a63e612SBarry Smith 
1784a2ae208SSatish Balay #undef __FUNCT__
1794a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
180e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
1811987afe7SBarry Smith {
1821987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
183f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
18413f74950SBarry Smith   PetscInt       j;
1850805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
186efee365bSSatish Balay   PetscErrorCode ierr;
1873a40ed3dSBarry Smith 
1883a40ed3dSBarry Smith   PetscFunctionBegin;
189c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
190c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
191c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
192c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
193a5ce6ee0Svictorle   if (ldax>m || lday>m) {
194d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
1958b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
196a5ce6ee0Svictorle     }
197a5ce6ee0Svictorle   } else {
1988b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
199a5ce6ee0Svictorle   }
200a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
2010450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
2023a40ed3dSBarry Smith   PetscFunctionReturn(0);
2031987afe7SBarry Smith }
2041987afe7SBarry Smith 
2054a2ae208SSatish Balay #undef __FUNCT__
2064a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
207e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
208289bc588SBarry Smith {
209d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
2103a40ed3dSBarry Smith 
2113a40ed3dSBarry Smith   PetscFunctionBegin;
2124e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
2134e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
2146de62eeeSBarry Smith   info->nz_used           = (double)N;
2156de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
2164e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
2174e220ebcSLois Curfman McInnes   info->mallocs           = 0;
2187adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
2194e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
2204e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
2214e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
2223a40ed3dSBarry Smith   PetscFunctionReturn(0);
223289bc588SBarry Smith }
224289bc588SBarry Smith 
2254a2ae208SSatish Balay #undef __FUNCT__
2264a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
227e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
22880cd9d93SLois Curfman McInnes {
229273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
230f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
231efee365bSSatish Balay   PetscErrorCode ierr;
232c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
23380cd9d93SLois Curfman McInnes 
2343a40ed3dSBarry Smith   PetscFunctionBegin;
235c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
236d0f46423SBarry Smith   if (lda>A->rmap->n) {
237c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
238d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
2398b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
240a5ce6ee0Svictorle     }
241a5ce6ee0Svictorle   } else {
242c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
2438b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
244a5ce6ee0Svictorle   }
245efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
2463a40ed3dSBarry Smith   PetscFunctionReturn(0);
24780cd9d93SLois Curfman McInnes }
24880cd9d93SLois Curfman McInnes 
2491cbb95d3SBarry Smith #undef __FUNCT__
2501cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
251e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
2521cbb95d3SBarry Smith {
2531cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
254d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
2551cbb95d3SBarry Smith   PetscScalar  *v = a->v;
2561cbb95d3SBarry Smith 
2571cbb95d3SBarry Smith   PetscFunctionBegin;
2581cbb95d3SBarry Smith   *fl = PETSC_FALSE;
259d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
2601cbb95d3SBarry Smith   N = a->lda;
2611cbb95d3SBarry Smith 
2621cbb95d3SBarry Smith   for (i=0; i<m; i++) {
2631cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
2641cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
2651cbb95d3SBarry Smith     }
2661cbb95d3SBarry Smith   }
2671cbb95d3SBarry Smith   *fl = PETSC_TRUE;
2681cbb95d3SBarry Smith   PetscFunctionReturn(0);
2691cbb95d3SBarry Smith }
2701cbb95d3SBarry Smith 
271b24902e0SBarry Smith #undef __FUNCT__
272b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
273e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
274b24902e0SBarry Smith {
275b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
276b24902e0SBarry Smith   PetscErrorCode ierr;
277b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
278b24902e0SBarry Smith 
279b24902e0SBarry Smith   PetscFunctionBegin;
280aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
281aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
2820298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
283b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
284b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
285d0f46423SBarry Smith     if (lda>A->rmap->n) {
286d0f46423SBarry Smith       m = A->rmap->n;
287d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
288b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
289b24902e0SBarry Smith       }
290b24902e0SBarry Smith     } else {
291d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
292b24902e0SBarry Smith     }
293b24902e0SBarry Smith   }
294b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
295b24902e0SBarry Smith   PetscFunctionReturn(0);
296b24902e0SBarry Smith }
297b24902e0SBarry Smith 
2984a2ae208SSatish Balay #undef __FUNCT__
2994a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
300e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
30102cad45dSBarry Smith {
3026849ba73SBarry Smith   PetscErrorCode ierr;
30302cad45dSBarry Smith 
3043a40ed3dSBarry Smith   PetscFunctionBegin;
305ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
306d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
3075c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
308719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
309b24902e0SBarry Smith   PetscFunctionReturn(0);
310b24902e0SBarry Smith }
311b24902e0SBarry Smith 
3126ee01492SSatish Balay 
313e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
314719d5645SBarry Smith 
3154a2ae208SSatish Balay #undef __FUNCT__
3164a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
317e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
318289bc588SBarry Smith {
3194482741eSBarry Smith   MatFactorInfo  info;
320a093e273SMatthew Knepley   PetscErrorCode ierr;
3213a40ed3dSBarry Smith 
3223a40ed3dSBarry Smith   PetscFunctionBegin;
323c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
324719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
3253a40ed3dSBarry Smith   PetscFunctionReturn(0);
326289bc588SBarry Smith }
3276ee01492SSatish Balay 
3280b4b3355SBarry Smith #undef __FUNCT__
3294a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
330e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
331289bc588SBarry Smith {
332c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
3336849ba73SBarry Smith   PetscErrorCode    ierr;
334f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
335f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
336c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
33767e560aaSBarry Smith 
3383a40ed3dSBarry Smith   PetscFunctionBegin;
339c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
340f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3411ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
342d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
343d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
344ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
345e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
346ae7cfcebSSatish Balay #else
3478b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
348e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
349ae7cfcebSSatish Balay #endif
350d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
351ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
352e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
353ae7cfcebSSatish Balay #else
3548b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
355e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
356ae7cfcebSSatish Balay #endif
3572205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
358f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3591ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
360dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3613a40ed3dSBarry Smith   PetscFunctionReturn(0);
362289bc588SBarry Smith }
3636ee01492SSatish Balay 
3644a2ae208SSatish Balay #undef __FUNCT__
36585e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
366e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
36785e2c93fSHong Zhang {
36885e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
36985e2c93fSHong Zhang   PetscErrorCode ierr;
37085e2c93fSHong Zhang   PetscScalar    *b,*x;
371efb80c78SLisandro Dalcin   PetscInt       n;
372783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
373bda8bf91SBarry Smith   PetscBool      flg;
37485e2c93fSHong Zhang 
37585e2c93fSHong Zhang   PetscFunctionBegin;
376c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3770298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
378ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
3790298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
380ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
381bda8bf91SBarry Smith 
3820298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
383c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
3848c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
3858c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
38685e2c93fSHong Zhang 
387f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
38885e2c93fSHong Zhang 
38985e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
39085e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
39185e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
39285e2c93fSHong Zhang #else
3938b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
39485e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
39585e2c93fSHong Zhang #endif
39685e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
39785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
39885e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
39985e2c93fSHong Zhang #else
4008b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
40185e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
40285e2c93fSHong Zhang #endif
4032205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
40485e2c93fSHong Zhang 
4058c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
4068c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
40785e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
40885e2c93fSHong Zhang   PetscFunctionReturn(0);
40985e2c93fSHong Zhang }
41085e2c93fSHong Zhang 
41185e2c93fSHong Zhang #undef __FUNCT__
4124a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
413e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
414da3a660dSBarry Smith {
415c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
416dfbe8321SBarry Smith   PetscErrorCode    ierr;
417f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
418f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
419c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
42067e560aaSBarry Smith 
4213a40ed3dSBarry Smith   PetscFunctionBegin;
422c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
423f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4241ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
425d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
426752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
427da3a660dSBarry Smith   if (mat->pivots) {
428ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
429e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
430ae7cfcebSSatish Balay #else
4318b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
432e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
433ae7cfcebSSatish Balay #endif
4347a97a34bSBarry Smith   } else {
435ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
436e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
437ae7cfcebSSatish Balay #else
4388b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
439e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
440ae7cfcebSSatish Balay #endif
441da3a660dSBarry Smith   }
442f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4431ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
444dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
4453a40ed3dSBarry Smith   PetscFunctionReturn(0);
446da3a660dSBarry Smith }
4476ee01492SSatish Balay 
4484a2ae208SSatish Balay #undef __FUNCT__
4494a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
450e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
451da3a660dSBarry Smith {
452c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
453dfbe8321SBarry Smith   PetscErrorCode    ierr;
454f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
455f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
456da3a660dSBarry Smith   Vec               tmp = 0;
457c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
45867e560aaSBarry Smith 
4593a40ed3dSBarry Smith   PetscFunctionBegin;
460c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
461f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4621ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
463d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
464da3a660dSBarry Smith   if (yy == zz) {
46578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4663bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
46778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
468da3a660dSBarry Smith   }
469d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
470752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
471da3a660dSBarry Smith   if (mat->pivots) {
472ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
473e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
474ae7cfcebSSatish Balay #else
4758b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
476e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
477ae7cfcebSSatish Balay #endif
478a8c6a408SBarry Smith   } else {
479ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
480e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
481ae7cfcebSSatish Balay #else
4828b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
483e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
484ae7cfcebSSatish Balay #endif
485da3a660dSBarry Smith   }
4866bf464f9SBarry Smith   if (tmp) {
4876bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4886bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4896bf464f9SBarry Smith   } else {
4906bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
4916bf464f9SBarry Smith   }
492f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4931ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
494dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4953a40ed3dSBarry Smith   PetscFunctionReturn(0);
496da3a660dSBarry Smith }
49767e560aaSBarry Smith 
4984a2ae208SSatish Balay #undef __FUNCT__
4994a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
500e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
501da3a660dSBarry Smith {
502c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
5036849ba73SBarry Smith   PetscErrorCode    ierr;
504f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
505f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
50689ae1891SBarry Smith   Vec               tmp = NULL;
507c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
50867e560aaSBarry Smith 
5093a40ed3dSBarry Smith   PetscFunctionBegin;
510c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
511d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
512f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
5131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
514da3a660dSBarry Smith   if (yy == zz) {
51578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
5163bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
51778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
518da3a660dSBarry Smith   }
519d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
520752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
521da3a660dSBarry Smith   if (mat->pivots) {
522ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
523e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
524ae7cfcebSSatish Balay #else
5258b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
526e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
527ae7cfcebSSatish Balay #endif
5283a40ed3dSBarry Smith   } else {
529ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
530e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
531ae7cfcebSSatish Balay #else
5328b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
533e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
534ae7cfcebSSatish Balay #endif
535da3a660dSBarry Smith   }
53690f02eecSBarry Smith   if (tmp) {
5372dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
5386bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
5393a40ed3dSBarry Smith   } else {
5402dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
54190f02eecSBarry Smith   }
542f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5431ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
544dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
5453a40ed3dSBarry Smith   PetscFunctionReturn(0);
546da3a660dSBarry Smith }
547db4efbfdSBarry Smith 
548db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
549db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
550db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
551db4efbfdSBarry Smith #undef __FUNCT__
552db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
553e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
554db4efbfdSBarry Smith {
555db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
556db4efbfdSBarry Smith   PetscFunctionBegin;
557e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
558db4efbfdSBarry Smith #else
559db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
560db4efbfdSBarry Smith   PetscErrorCode ierr;
561db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
562db4efbfdSBarry Smith 
563db4efbfdSBarry Smith   PetscFunctionBegin;
564c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
565c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
566db4efbfdSBarry Smith   if (!mat->pivots) {
567854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
5683bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
569db4efbfdSBarry Smith   }
570db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5718e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5728b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
5738e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
5748e57ea43SSatish Balay 
575e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
576e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
577db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
578db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
579db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
580db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
581d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
582db4efbfdSBarry Smith 
583dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
584db4efbfdSBarry Smith #endif
585db4efbfdSBarry Smith   PetscFunctionReturn(0);
586db4efbfdSBarry Smith }
587db4efbfdSBarry Smith 
588db4efbfdSBarry Smith #undef __FUNCT__
589db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
590e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
591db4efbfdSBarry Smith {
592db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
593db4efbfdSBarry Smith   PetscFunctionBegin;
594e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
595db4efbfdSBarry Smith #else
596db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
597db4efbfdSBarry Smith   PetscErrorCode ierr;
598c5df96a5SBarry Smith   PetscBLASInt   info,n;
599db4efbfdSBarry Smith 
600db4efbfdSBarry Smith   PetscFunctionBegin;
601c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
602db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
603db4efbfdSBarry Smith 
604db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6058b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
606e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
607db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
608db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
609db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
610db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
611d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6122205254eSKarl Rupp 
613eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
614db4efbfdSBarry Smith #endif
615db4efbfdSBarry Smith   PetscFunctionReturn(0);
616db4efbfdSBarry Smith }
617db4efbfdSBarry Smith 
618db4efbfdSBarry Smith 
619db4efbfdSBarry Smith #undef __FUNCT__
620db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
6210481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
622db4efbfdSBarry Smith {
623db4efbfdSBarry Smith   PetscErrorCode ierr;
624db4efbfdSBarry Smith   MatFactorInfo  info;
625db4efbfdSBarry Smith 
626db4efbfdSBarry Smith   PetscFunctionBegin;
627db4efbfdSBarry Smith   info.fill = 1.0;
6282205254eSKarl Rupp 
629c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
630719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
631db4efbfdSBarry Smith   PetscFunctionReturn(0);
632db4efbfdSBarry Smith }
633db4efbfdSBarry Smith 
634db4efbfdSBarry Smith #undef __FUNCT__
635db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
636e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
637db4efbfdSBarry Smith {
638db4efbfdSBarry Smith   PetscFunctionBegin;
639c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
6401bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
641719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
642db4efbfdSBarry Smith   PetscFunctionReturn(0);
643db4efbfdSBarry Smith }
644db4efbfdSBarry Smith 
645db4efbfdSBarry Smith #undef __FUNCT__
646db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
647e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
648db4efbfdSBarry Smith {
649db4efbfdSBarry Smith   PetscFunctionBegin;
650b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
651c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
652719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
653db4efbfdSBarry Smith   PetscFunctionReturn(0);
654db4efbfdSBarry Smith }
655db4efbfdSBarry Smith 
656db4efbfdSBarry Smith #undef __FUNCT__
657db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
658cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
659db4efbfdSBarry Smith {
660db4efbfdSBarry Smith   PetscErrorCode ierr;
661db4efbfdSBarry Smith 
662db4efbfdSBarry Smith   PetscFunctionBegin;
663ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
664db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
665db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
666db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
667db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
668db4efbfdSBarry Smith   } else {
669db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
670db4efbfdSBarry Smith   }
671d5f3da31SBarry Smith   (*fact)->factortype = ftype;
672*00c67f3bSHong Zhang 
673*00c67f3bSHong Zhang   ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr);
674*00c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr);
675db4efbfdSBarry Smith   PetscFunctionReturn(0);
676db4efbfdSBarry Smith }
677db4efbfdSBarry Smith 
678289bc588SBarry Smith /* ------------------------------------------------------------------*/
6794a2ae208SSatish Balay #undef __FUNCT__
68041f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
681e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
682289bc588SBarry Smith {
683c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
684d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
685d9ca1df4SBarry Smith   const PetscScalar *b;
686dfbe8321SBarry Smith   PetscErrorCode    ierr;
687d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
688c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
689289bc588SBarry Smith 
6903a40ed3dSBarry Smith   PetscFunctionBegin;
691422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
692c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
693289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
69471044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6952dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
696289bc588SBarry Smith   }
6971ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
698d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
699b965ef7fSBarry Smith   its  = its*lits;
700e32f2f54SBarry Smith   if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
701289bc588SBarry Smith   while (its--) {
702fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
703289bc588SBarry Smith       for (i=0; i<m; i++) {
7048b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
70555a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
706289bc588SBarry Smith       }
707289bc588SBarry Smith     }
708fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
709289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7108b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
71155a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
712289bc588SBarry Smith       }
713289bc588SBarry Smith     }
714289bc588SBarry Smith   }
715d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
7161ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7173a40ed3dSBarry Smith   PetscFunctionReturn(0);
718289bc588SBarry Smith }
719289bc588SBarry Smith 
720289bc588SBarry Smith /* -----------------------------------------------------------------*/
7214a2ae208SSatish Balay #undef __FUNCT__
7224a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
723cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
724289bc588SBarry Smith {
725c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
726d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
727d9ca1df4SBarry Smith   PetscScalar       *y;
728dfbe8321SBarry Smith   PetscErrorCode    ierr;
7290805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
730ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
7313a40ed3dSBarry Smith 
7323a40ed3dSBarry Smith   PetscFunctionBegin;
733c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
734c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
735d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
736d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7371ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7388b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
739d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7401ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
741dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
7423a40ed3dSBarry Smith   PetscFunctionReturn(0);
743289bc588SBarry Smith }
744800995b7SMatthew Knepley 
7454a2ae208SSatish Balay #undef __FUNCT__
7464a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
747cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
748289bc588SBarry Smith {
749c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
750d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
751dfbe8321SBarry Smith   PetscErrorCode    ierr;
7520805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
753d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7543a40ed3dSBarry Smith 
7553a40ed3dSBarry Smith   PetscFunctionBegin;
756c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
757c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
758d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
759d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7601ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7618b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
762d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
764dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7653a40ed3dSBarry Smith   PetscFunctionReturn(0);
766289bc588SBarry Smith }
7676ee01492SSatish Balay 
7684a2ae208SSatish Balay #undef __FUNCT__
7694a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
770cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
771289bc588SBarry Smith {
772c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
773d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
774d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
775dfbe8321SBarry Smith   PetscErrorCode    ierr;
7760805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7773a40ed3dSBarry Smith 
7783a40ed3dSBarry Smith   PetscFunctionBegin;
779c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
780c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
781d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
782600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
783d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7841ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7858b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
786d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7871ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
788dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7893a40ed3dSBarry Smith   PetscFunctionReturn(0);
790289bc588SBarry Smith }
7916ee01492SSatish Balay 
7924a2ae208SSatish Balay #undef __FUNCT__
7934a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
794e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
795289bc588SBarry Smith {
796c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
797d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
798d9ca1df4SBarry Smith   PetscScalar       *y;
799dfbe8321SBarry Smith   PetscErrorCode    ierr;
8000805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
80187828ca2SBarry Smith   PetscScalar       _DOne=1.0;
8023a40ed3dSBarry Smith 
8033a40ed3dSBarry Smith   PetscFunctionBegin;
804c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
805c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
806d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
807600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
808d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8091ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8108b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
811d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8121ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
813dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8143a40ed3dSBarry Smith   PetscFunctionReturn(0);
815289bc588SBarry Smith }
816289bc588SBarry Smith 
817289bc588SBarry Smith /* -----------------------------------------------------------------*/
8184a2ae208SSatish Balay #undef __FUNCT__
8194a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
820e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
821289bc588SBarry Smith {
822c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
82387828ca2SBarry Smith   PetscScalar    *v;
8246849ba73SBarry Smith   PetscErrorCode ierr;
82513f74950SBarry Smith   PetscInt       i;
82667e560aaSBarry Smith 
8273a40ed3dSBarry Smith   PetscFunctionBegin;
828d0f46423SBarry Smith   *ncols = A->cmap->n;
829289bc588SBarry Smith   if (cols) {
830854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
831d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
832289bc588SBarry Smith   }
833289bc588SBarry Smith   if (vals) {
834854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
835289bc588SBarry Smith     v    = mat->v + row;
836d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
837289bc588SBarry Smith   }
8383a40ed3dSBarry Smith   PetscFunctionReturn(0);
839289bc588SBarry Smith }
8406ee01492SSatish Balay 
8414a2ae208SSatish Balay #undef __FUNCT__
8424a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
843e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
844289bc588SBarry Smith {
845dfbe8321SBarry Smith   PetscErrorCode ierr;
8466e111a19SKarl Rupp 
847606d414cSSatish Balay   PetscFunctionBegin;
848606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
849606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8503a40ed3dSBarry Smith   PetscFunctionReturn(0);
851289bc588SBarry Smith }
852289bc588SBarry Smith /* ----------------------------------------------------------------*/
8534a2ae208SSatish Balay #undef __FUNCT__
8544a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
855e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
856289bc588SBarry Smith {
857c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
85813f74950SBarry Smith   PetscInt     i,j,idx=0;
859d6dfbf8fSBarry Smith 
8603a40ed3dSBarry Smith   PetscFunctionBegin;
861289bc588SBarry Smith   if (!mat->roworiented) {
862dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
863289bc588SBarry Smith       for (j=0; j<n; j++) {
864cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8652515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
866e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
86758804f6dSBarry Smith #endif
868289bc588SBarry Smith         for (i=0; i<m; i++) {
869cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8702515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
871e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
87258804f6dSBarry Smith #endif
873cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
874289bc588SBarry Smith         }
875289bc588SBarry Smith       }
8763a40ed3dSBarry Smith     } else {
877289bc588SBarry Smith       for (j=0; j<n; j++) {
878cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8792515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
880e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
88158804f6dSBarry Smith #endif
882289bc588SBarry Smith         for (i=0; i<m; i++) {
883cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8842515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
885e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
88658804f6dSBarry Smith #endif
887cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
888289bc588SBarry Smith         }
889289bc588SBarry Smith       }
890289bc588SBarry Smith     }
8913a40ed3dSBarry Smith   } else {
892dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
893e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
894cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8952515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
896e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
89758804f6dSBarry Smith #endif
898e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
899cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9002515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
901e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
90258804f6dSBarry Smith #endif
903cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
904e8d4e0b9SBarry Smith         }
905e8d4e0b9SBarry Smith       }
9063a40ed3dSBarry Smith     } else {
907289bc588SBarry Smith       for (i=0; i<m; i++) {
908cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9092515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
910e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
91158804f6dSBarry Smith #endif
912289bc588SBarry Smith         for (j=0; j<n; j++) {
913cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9142515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
915e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
91658804f6dSBarry Smith #endif
917cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
918289bc588SBarry Smith         }
919289bc588SBarry Smith       }
920289bc588SBarry Smith     }
921e8d4e0b9SBarry Smith   }
9223a40ed3dSBarry Smith   PetscFunctionReturn(0);
923289bc588SBarry Smith }
924e8d4e0b9SBarry Smith 
9254a2ae208SSatish Balay #undef __FUNCT__
9264a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
927e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
928ae80bb75SLois Curfman McInnes {
929ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
93013f74950SBarry Smith   PetscInt     i,j;
931ae80bb75SLois Curfman McInnes 
9323a40ed3dSBarry Smith   PetscFunctionBegin;
933ae80bb75SLois Curfman McInnes   /* row-oriented output */
934ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
93597e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
936e32f2f54SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
937ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
9386f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
939e32f2f54SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
94097e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
941ae80bb75SLois Curfman McInnes     }
942ae80bb75SLois Curfman McInnes   }
9433a40ed3dSBarry Smith   PetscFunctionReturn(0);
944ae80bb75SLois Curfman McInnes }
945ae80bb75SLois Curfman McInnes 
946289bc588SBarry Smith /* -----------------------------------------------------------------*/
947289bc588SBarry Smith 
9484a2ae208SSatish Balay #undef __FUNCT__
9495bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
950e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
951aabbc4fbSShri Abhyankar {
952aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
953aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
954aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
955aabbc4fbSShri Abhyankar   int            fd;
956aabbc4fbSShri Abhyankar   PetscMPIInt    size;
957aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
958aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
959ce94432eSBarry Smith   MPI_Comm       comm;
960aabbc4fbSShri Abhyankar 
961aabbc4fbSShri Abhyankar   PetscFunctionBegin;
962c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
963c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
964ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
965aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
966aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
967aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
968aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
969aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
970aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
971aabbc4fbSShri Abhyankar 
972aabbc4fbSShri Abhyankar   /* set global size if not set already*/
973aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
974aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
975aabbc4fbSShri Abhyankar   } else {
976aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
977aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
978aabbc4fbSShri Abhyankar     if (M != grows ||  N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols);
979aabbc4fbSShri Abhyankar   }
980e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
981e6324fbbSBarry Smith   if (!a->user_alloc) {
9820298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
983e6324fbbSBarry Smith   }
984aabbc4fbSShri Abhyankar 
985aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
986aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
987aabbc4fbSShri Abhyankar     v = a->v;
988aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
989aabbc4fbSShri Abhyankar        from row major to column major */
990854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
991aabbc4fbSShri Abhyankar     /* read in nonzero values */
992aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
993aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
994aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
995aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
996aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
997aabbc4fbSShri Abhyankar       }
998aabbc4fbSShri Abhyankar     }
999aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
1000aabbc4fbSShri Abhyankar   } else {
1001aabbc4fbSShri Abhyankar     /* read row lengths */
1002854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
1003aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
1004aabbc4fbSShri Abhyankar 
1005aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
1006aabbc4fbSShri Abhyankar     v = a->v;
1007aabbc4fbSShri Abhyankar 
1008aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
1009854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
1010aabbc4fbSShri Abhyankar     cols = scols;
1011aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
1012854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
1013aabbc4fbSShri Abhyankar     vals = svals;
1014aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
1015aabbc4fbSShri Abhyankar 
1016aabbc4fbSShri Abhyankar     /* insert into matrix */
1017aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
1018aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
1019aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
1020aabbc4fbSShri Abhyankar     }
1021aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1022aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
1023aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
1024aabbc4fbSShri Abhyankar   }
1025aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1026aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1027aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1028aabbc4fbSShri Abhyankar }
1029aabbc4fbSShri Abhyankar 
1030aabbc4fbSShri Abhyankar #undef __FUNCT__
10314a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
10326849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1033289bc588SBarry Smith {
1034932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1035dfbe8321SBarry Smith   PetscErrorCode    ierr;
103613f74950SBarry Smith   PetscInt          i,j;
10372dcb1b2aSMatthew Knepley   const char        *name;
103887828ca2SBarry Smith   PetscScalar       *v;
1039f3ef73ceSBarry Smith   PetscViewerFormat format;
10405f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1041ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
10425f481a85SSatish Balay #endif
1043932b0c3eSLois Curfman McInnes 
10443a40ed3dSBarry Smith   PetscFunctionBegin;
1045b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1046456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
10473a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1048fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1049d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1050d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
105144cd7ae7SLois Curfman McInnes       v    = a->v + i;
105277431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1053d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1054aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1055329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
105657622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1057329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
105857622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10596831982aSBarry Smith         }
106080cd9d93SLois Curfman McInnes #else
10616831982aSBarry Smith         if (*v) {
106257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10636831982aSBarry Smith         }
106480cd9d93SLois Curfman McInnes #endif
10651b807ce4Svictorle         v += a->lda;
106680cd9d93SLois Curfman McInnes       }
1067b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
106880cd9d93SLois Curfman McInnes     }
1069d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10703a40ed3dSBarry Smith   } else {
1071d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1072aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
107347989497SBarry Smith     /* determine if matrix has all real values */
107447989497SBarry Smith     v = a->v;
1075d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1076ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
107747989497SBarry Smith     }
107847989497SBarry Smith #endif
1079fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10803a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1081d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1082d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1083fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1084ffac6cdbSBarry Smith     }
1085ffac6cdbSBarry Smith 
1086d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1087932b0c3eSLois Curfman McInnes       v = a->v + i;
1088d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1089aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
109047989497SBarry Smith         if (allreal) {
1091c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
109247989497SBarry Smith         } else {
1093c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
109447989497SBarry Smith         }
1095289bc588SBarry Smith #else
1096c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1097289bc588SBarry Smith #endif
10981b807ce4Svictorle         v += a->lda;
1099289bc588SBarry Smith       }
1100b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1101289bc588SBarry Smith     }
1102fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1103b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1104ffac6cdbSBarry Smith     }
1105d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1106da3a660dSBarry Smith   }
1107b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
11083a40ed3dSBarry Smith   PetscFunctionReturn(0);
1109289bc588SBarry Smith }
1110289bc588SBarry Smith 
11114a2ae208SSatish Balay #undef __FUNCT__
11124a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
11136849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1114932b0c3eSLois Curfman McInnes {
1115932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11166849ba73SBarry Smith   PetscErrorCode    ierr;
111713f74950SBarry Smith   int               fd;
1118d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1119f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1120f4403165SShri Abhyankar   PetscViewerFormat format;
1121932b0c3eSLois Curfman McInnes 
11223a40ed3dSBarry Smith   PetscFunctionBegin;
1123b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
112490ace30eSBarry Smith 
1125f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1126f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1127f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1128785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
11292205254eSKarl Rupp 
1130f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1131f4403165SShri Abhyankar     col_lens[1] = m;
1132f4403165SShri Abhyankar     col_lens[2] = n;
1133f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
11342205254eSKarl Rupp 
1135f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1136f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1137f4403165SShri Abhyankar 
1138f4403165SShri Abhyankar     /* write out matrix, by rows */
1139854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1140f4403165SShri Abhyankar     v    = a->v;
1141f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1142f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1143f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1144f4403165SShri Abhyankar       }
1145f4403165SShri Abhyankar     }
1146f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1147f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1148f4403165SShri Abhyankar   } else {
1149854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11502205254eSKarl Rupp 
11510700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1152932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1153932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1154932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1155932b0c3eSLois Curfman McInnes 
1156932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1157932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11586f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1159932b0c3eSLois Curfman McInnes 
1160932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1161932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1162932b0c3eSLois Curfman McInnes     ict = 0;
1163932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1164932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1165932b0c3eSLois Curfman McInnes     }
11666f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1167606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1168932b0c3eSLois Curfman McInnes 
1169932b0c3eSLois Curfman McInnes     /* store nonzero values */
1170854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1171932b0c3eSLois Curfman McInnes     ict  = 0;
1172932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1173932b0c3eSLois Curfman McInnes       v = a->v + i;
1174932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11751b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1176932b0c3eSLois Curfman McInnes       }
1177932b0c3eSLois Curfman McInnes     }
11786f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1179606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1180f4403165SShri Abhyankar   }
11813a40ed3dSBarry Smith   PetscFunctionReturn(0);
1182932b0c3eSLois Curfman McInnes }
1183932b0c3eSLois Curfman McInnes 
11849804daf3SBarry Smith #include <petscdraw.h>
11854a2ae208SSatish Balay #undef __FUNCT__
11864a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1187e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1188f1af5d2fSBarry Smith {
1189f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1190f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11916849ba73SBarry Smith   PetscErrorCode    ierr;
1192383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1193383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
119487828ca2SBarry Smith   PetscScalar       *v = a->v;
1195b0a32e0cSBarry Smith   PetscViewer       viewer;
1196b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1197f3ef73ceSBarry Smith   PetscViewerFormat format;
1198f1af5d2fSBarry Smith 
1199f1af5d2fSBarry Smith   PetscFunctionBegin;
1200f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1201b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1202b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1203f1af5d2fSBarry Smith 
1204f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1205383922c3SLisandro Dalcin 
1206fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1207383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1208f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1209f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1210383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1211f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1212f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1213f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1214329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1215b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1216329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1217b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1218f1af5d2fSBarry Smith         } else {
1219f1af5d2fSBarry Smith           continue;
1220f1af5d2fSBarry Smith         }
1221b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1222f1af5d2fSBarry Smith       }
1223f1af5d2fSBarry Smith     }
1224383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1225f1af5d2fSBarry Smith   } else {
1226f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1227f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1228b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1229b05fc000SLisandro Dalcin     PetscDraw popup;
1230b05fc000SLisandro Dalcin 
1231f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1232f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1233f1af5d2fSBarry Smith     }
1234383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1235b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
123645f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1237383922c3SLisandro Dalcin 
1238383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1239f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1240f1af5d2fSBarry Smith       x_l = j;
1241f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1242f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1243f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1244f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1245b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1246b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1247f1af5d2fSBarry Smith       }
1248f1af5d2fSBarry Smith     }
1249383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1250f1af5d2fSBarry Smith   }
1251f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1252f1af5d2fSBarry Smith }
1253f1af5d2fSBarry Smith 
12544a2ae208SSatish Balay #undef __FUNCT__
12554a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1256e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1257f1af5d2fSBarry Smith {
1258b0a32e0cSBarry Smith   PetscDraw      draw;
1259ace3abfcSBarry Smith   PetscBool      isnull;
1260329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1261dfbe8321SBarry Smith   PetscErrorCode ierr;
1262f1af5d2fSBarry Smith 
1263f1af5d2fSBarry Smith   PetscFunctionBegin;
1264b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1265b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1266abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1267f1af5d2fSBarry Smith 
1268d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1269f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1270b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1271832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1272b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12730298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1274832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1275f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1276f1af5d2fSBarry Smith }
1277f1af5d2fSBarry Smith 
12784a2ae208SSatish Balay #undef __FUNCT__
12794a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1280dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1281932b0c3eSLois Curfman McInnes {
1282dfbe8321SBarry Smith   PetscErrorCode ierr;
1283ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1284932b0c3eSLois Curfman McInnes 
12853a40ed3dSBarry Smith   PetscFunctionBegin;
1286251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1287251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1288251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12890f5bd95cSBarry Smith 
1290c45a1595SBarry Smith   if (iascii) {
1291c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12920f5bd95cSBarry Smith   } else if (isbinary) {
12933a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1294f1af5d2fSBarry Smith   } else if (isdraw) {
1295f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1296932b0c3eSLois Curfman McInnes   }
12973a40ed3dSBarry Smith   PetscFunctionReturn(0);
1298932b0c3eSLois Curfman McInnes }
1299289bc588SBarry Smith 
13004a2ae208SSatish Balay #undef __FUNCT__
13014a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1302e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat)
1303289bc588SBarry Smith {
1304ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1305dfbe8321SBarry Smith   PetscErrorCode ierr;
130690f02eecSBarry Smith 
13073a40ed3dSBarry Smith   PetscFunctionBegin;
1308aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1309d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1310a5a9c739SBarry Smith #endif
131105b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1312abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
13136857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1314bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1315dbd8c25aSHong Zhang 
1316dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1317bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1318bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
13198baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
13208baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
13218baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
13228baccfbdSHong Zhang #endif
1323bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1324bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1325bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1326bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1327abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13283bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13293bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13303bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13313a40ed3dSBarry Smith   PetscFunctionReturn(0);
1332289bc588SBarry Smith }
1333289bc588SBarry Smith 
13344a2ae208SSatish Balay #undef __FUNCT__
13354a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1336e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1337289bc588SBarry Smith {
1338c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
13396849ba73SBarry Smith   PetscErrorCode ierr;
134013f74950SBarry Smith   PetscInt       k,j,m,n,M;
134187828ca2SBarry Smith   PetscScalar    *v,tmp;
134248b35521SBarry Smith 
13433a40ed3dSBarry Smith   PetscFunctionBegin;
1344d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1345e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1346e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1347e7e72b3dSBarry Smith     else {
1348d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1349289bc588SBarry Smith         for (k=0; k<j; k++) {
13501b807ce4Svictorle           tmp        = v[j + k*M];
13511b807ce4Svictorle           v[j + k*M] = v[k + j*M];
13521b807ce4Svictorle           v[k + j*M] = tmp;
1353289bc588SBarry Smith         }
1354289bc588SBarry Smith       }
1355d64ed03dSBarry Smith     }
13563a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1357d3e5ee88SLois Curfman McInnes     Mat          tmat;
1358ec8511deSBarry Smith     Mat_SeqDense *tmatd;
135987828ca2SBarry Smith     PetscScalar  *v2;
1360af36a384SStefano Zampini     PetscInt     M2;
1361ea709b57SSatish Balay 
1362fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1363ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1364d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13657adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13660298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1367fc4dec0aSBarry Smith     } else {
1368fc4dec0aSBarry Smith       tmat = *matout;
1369fc4dec0aSBarry Smith     }
1370ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1371af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1372d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1373af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1374d3e5ee88SLois Curfman McInnes     }
13756d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13766d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1377d3e5ee88SLois Curfman McInnes     *matout = tmat;
137848b35521SBarry Smith   }
13793a40ed3dSBarry Smith   PetscFunctionReturn(0);
1380289bc588SBarry Smith }
1381289bc588SBarry Smith 
13824a2ae208SSatish Balay #undef __FUNCT__
13834a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1384e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1385289bc588SBarry Smith {
1386c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1387c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
138813f74950SBarry Smith   PetscInt     i,j;
1389a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13909ea5d5aeSSatish Balay 
13913a40ed3dSBarry Smith   PetscFunctionBegin;
1392d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1393d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1394d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
13951b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1396d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
13973a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
13981b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
13991b807ce4Svictorle     }
1400289bc588SBarry Smith   }
140177c4ece6SBarry Smith   *flg = PETSC_TRUE;
14023a40ed3dSBarry Smith   PetscFunctionReturn(0);
1403289bc588SBarry Smith }
1404289bc588SBarry Smith 
14054a2ae208SSatish Balay #undef __FUNCT__
14064a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1407e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1408289bc588SBarry Smith {
1409c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1410dfbe8321SBarry Smith   PetscErrorCode ierr;
141113f74950SBarry Smith   PetscInt       i,n,len;
141287828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
141344cd7ae7SLois Curfman McInnes 
14143a40ed3dSBarry Smith   PetscFunctionBegin;
14152dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
14167a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
14171ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1418d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1419e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
142044cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
14211b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1422289bc588SBarry Smith   }
14231ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
14243a40ed3dSBarry Smith   PetscFunctionReturn(0);
1425289bc588SBarry Smith }
1426289bc588SBarry Smith 
14274a2ae208SSatish Balay #undef __FUNCT__
14284a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1429e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1430289bc588SBarry Smith {
1431c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1432f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1433f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1434dfbe8321SBarry Smith   PetscErrorCode    ierr;
1435d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
143655659b69SBarry Smith 
14373a40ed3dSBarry Smith   PetscFunctionBegin;
143828988994SBarry Smith   if (ll) {
14397a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1440f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1441e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1442da3a660dSBarry Smith     for (i=0; i<m; i++) {
1443da3a660dSBarry Smith       x = l[i];
1444da3a660dSBarry Smith       v = mat->v + i;
1445b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1446da3a660dSBarry Smith     }
1447f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1448eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1449da3a660dSBarry Smith   }
145028988994SBarry Smith   if (rr) {
14517a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1452f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1453e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1454da3a660dSBarry Smith     for (i=0; i<n; i++) {
1455da3a660dSBarry Smith       x = r[i];
1456b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14572205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1458da3a660dSBarry Smith     }
1459f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1460eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1461da3a660dSBarry Smith   }
14623a40ed3dSBarry Smith   PetscFunctionReturn(0);
1463289bc588SBarry Smith }
1464289bc588SBarry Smith 
14654a2ae208SSatish Balay #undef __FUNCT__
14664a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1467e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1468289bc588SBarry Smith {
1469c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
147087828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1471329f5518SBarry Smith   PetscReal      sum  = 0.0;
1472d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1473efee365bSSatish Balay   PetscErrorCode ierr;
147455659b69SBarry Smith 
14753a40ed3dSBarry Smith   PetscFunctionBegin;
1476289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1477a5ce6ee0Svictorle     if (lda>m) {
1478d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1479a5ce6ee0Svictorle         v = mat->v+j*lda;
1480a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1481a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1482a5ce6ee0Svictorle         }
1483a5ce6ee0Svictorle       }
1484a5ce6ee0Svictorle     } else {
1485d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1486329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1487289bc588SBarry Smith       }
1488a5ce6ee0Svictorle     }
14898f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1490dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14913a40ed3dSBarry Smith   } else if (type == NORM_1) {
1492064f8208SBarry Smith     *nrm = 0.0;
1493d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
14941b807ce4Svictorle       v   = mat->v + j*mat->lda;
1495289bc588SBarry Smith       sum = 0.0;
1496d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
149733a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1498289bc588SBarry Smith       }
1499064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1500289bc588SBarry Smith     }
1501eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15023a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1503064f8208SBarry Smith     *nrm = 0.0;
1504d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1505289bc588SBarry Smith       v   = mat->v + j;
1506289bc588SBarry Smith       sum = 0.0;
1507d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
15081b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1509289bc588SBarry Smith       }
1510064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1511289bc588SBarry Smith     }
1512eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1513e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
15143a40ed3dSBarry Smith   PetscFunctionReturn(0);
1515289bc588SBarry Smith }
1516289bc588SBarry Smith 
15174a2ae208SSatish Balay #undef __FUNCT__
15184a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1519e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1520289bc588SBarry Smith {
1521c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
152263ba0a88SBarry Smith   PetscErrorCode ierr;
152367e560aaSBarry Smith 
15243a40ed3dSBarry Smith   PetscFunctionBegin;
1525b5a2b587SKris Buschelman   switch (op) {
1526b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
15274e0d8c25SBarry Smith     aij->roworiented = flg;
1528b5a2b587SKris Buschelman     break;
1529512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1530b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
15313971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
15324e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
153313fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1534b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1535b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
15365021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
15375021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
15385021d80fSJed Brown     break;
15395021d80fSJed Brown   case MAT_SPD:
154077e54ba9SKris Buschelman   case MAT_SYMMETRIC:
154177e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
15429a4540c5SBarry Smith   case MAT_HERMITIAN:
15439a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
15445021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
154577e54ba9SKris Buschelman     break;
1546b5a2b587SKris Buschelman   default:
1547e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
15483a40ed3dSBarry Smith   }
15493a40ed3dSBarry Smith   PetscFunctionReturn(0);
1550289bc588SBarry Smith }
1551289bc588SBarry Smith 
15524a2ae208SSatish Balay #undef __FUNCT__
15534a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1554e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15556f0a148fSBarry Smith {
1556ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15576849ba73SBarry Smith   PetscErrorCode ierr;
1558d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15593a40ed3dSBarry Smith 
15603a40ed3dSBarry Smith   PetscFunctionBegin;
1561a5ce6ee0Svictorle   if (lda>m) {
1562d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1563a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1564a5ce6ee0Svictorle     }
1565a5ce6ee0Svictorle   } else {
1566d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1567a5ce6ee0Svictorle   }
15683a40ed3dSBarry Smith   PetscFunctionReturn(0);
15696f0a148fSBarry Smith }
15706f0a148fSBarry Smith 
15714a2ae208SSatish Balay #undef __FUNCT__
15724a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1573e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15746f0a148fSBarry Smith {
157597b48c8fSBarry Smith   PetscErrorCode    ierr;
1576ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1577b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
157897b48c8fSBarry Smith   PetscScalar       *slot,*bb;
157997b48c8fSBarry Smith   const PetscScalar *xx;
158055659b69SBarry Smith 
15813a40ed3dSBarry Smith   PetscFunctionBegin;
1582b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1583b9679d65SBarry Smith   for (i=0; i<N; i++) {
1584b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1585b9679d65SBarry Smith     if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n);
1586b9679d65SBarry Smith   }
1587b9679d65SBarry Smith #endif
1588b9679d65SBarry Smith 
158997b48c8fSBarry Smith   /* fix right hand side if needed */
159097b48c8fSBarry Smith   if (x && b) {
159197b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
159297b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15932205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
159497b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
159597b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
159697b48c8fSBarry Smith   }
159797b48c8fSBarry Smith 
15986f0a148fSBarry Smith   for (i=0; i<N; i++) {
15996f0a148fSBarry Smith     slot = l->v + rows[i];
1600b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
16016f0a148fSBarry Smith   }
1602f4df32b1SMatthew Knepley   if (diag != 0.0) {
1603b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
16046f0a148fSBarry Smith     for (i=0; i<N; i++) {
1605b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1606f4df32b1SMatthew Knepley       *slot = diag;
16076f0a148fSBarry Smith     }
16086f0a148fSBarry Smith   }
16093a40ed3dSBarry Smith   PetscFunctionReturn(0);
16106f0a148fSBarry Smith }
1611557bce09SLois Curfman McInnes 
16124a2ae208SSatish Balay #undef __FUNCT__
16138c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1614e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
161564e87e97SBarry Smith {
1616c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
16173a40ed3dSBarry Smith 
16183a40ed3dSBarry Smith   PetscFunctionBegin;
1619e32f2f54SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
162064e87e97SBarry Smith   *array = mat->v;
16213a40ed3dSBarry Smith   PetscFunctionReturn(0);
162264e87e97SBarry Smith }
16230754003eSLois Curfman McInnes 
16244a2ae208SSatish Balay #undef __FUNCT__
16258c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1626e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1627ff14e315SSatish Balay {
16283a40ed3dSBarry Smith   PetscFunctionBegin;
162909b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
16303a40ed3dSBarry Smith   PetscFunctionReturn(0);
1631ff14e315SSatish Balay }
16320754003eSLois Curfman McInnes 
16334a2ae208SSatish Balay #undef __FUNCT__
16348c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1635dec5eb66SMatthew G Knepley /*@C
16368c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
163773a71a0fSBarry Smith 
163873a71a0fSBarry Smith    Not Collective
163973a71a0fSBarry Smith 
164073a71a0fSBarry Smith    Input Parameter:
1641579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
164273a71a0fSBarry Smith 
164373a71a0fSBarry Smith    Output Parameter:
164473a71a0fSBarry Smith .   array - pointer to the data
164573a71a0fSBarry Smith 
164673a71a0fSBarry Smith    Level: intermediate
164773a71a0fSBarry Smith 
16488c778c55SBarry Smith .seealso: MatDenseRestoreArray()
164973a71a0fSBarry Smith @*/
16508c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
165173a71a0fSBarry Smith {
165273a71a0fSBarry Smith   PetscErrorCode ierr;
165373a71a0fSBarry Smith 
165473a71a0fSBarry Smith   PetscFunctionBegin;
16558c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
165673a71a0fSBarry Smith   PetscFunctionReturn(0);
165773a71a0fSBarry Smith }
165873a71a0fSBarry Smith 
165973a71a0fSBarry Smith #undef __FUNCT__
16608c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1661dec5eb66SMatthew G Knepley /*@C
1662579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
166373a71a0fSBarry Smith 
166473a71a0fSBarry Smith    Not Collective
166573a71a0fSBarry Smith 
166673a71a0fSBarry Smith    Input Parameters:
1667579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
166873a71a0fSBarry Smith .  array - pointer to the data
166973a71a0fSBarry Smith 
167073a71a0fSBarry Smith    Level: intermediate
167173a71a0fSBarry Smith 
16728c778c55SBarry Smith .seealso: MatDenseGetArray()
167373a71a0fSBarry Smith @*/
16748c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
167573a71a0fSBarry Smith {
167673a71a0fSBarry Smith   PetscErrorCode ierr;
167773a71a0fSBarry Smith 
167873a71a0fSBarry Smith   PetscFunctionBegin;
16798c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
168073a71a0fSBarry Smith   PetscFunctionReturn(0);
168173a71a0fSBarry Smith }
168273a71a0fSBarry Smith 
168373a71a0fSBarry Smith #undef __FUNCT__
16844a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
168513f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16860754003eSLois Curfman McInnes {
1687c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16886849ba73SBarry Smith   PetscErrorCode ierr;
16895d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16905d0c19d7SBarry Smith   const PetscInt *irow,*icol;
169187828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16920754003eSLois Curfman McInnes   Mat            newmat;
16930754003eSLois Curfman McInnes 
16943a40ed3dSBarry Smith   PetscFunctionBegin;
169578b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
169678b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1697e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1698e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
16990754003eSLois Curfman McInnes 
1700182d2002SSatish Balay   /* Check submatrixcall */
1701182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
170213f74950SBarry Smith     PetscInt n_cols,n_rows;
1703182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
170421a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1705f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1706c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
170721a2c019SBarry Smith     }
1708182d2002SSatish Balay     newmat = *B;
1709182d2002SSatish Balay   } else {
17100754003eSLois Curfman McInnes     /* Create and fill new matrix */
1711ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1712f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
17137adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
17140298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1715182d2002SSatish Balay   }
1716182d2002SSatish Balay 
1717182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1718182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1719182d2002SSatish Balay 
1720182d2002SSatish Balay   for (i=0; i<ncols; i++) {
17216de62eeeSBarry Smith     av = v + mat->lda*icol[i];
17222205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
17230754003eSLois Curfman McInnes   }
1724182d2002SSatish Balay 
1725182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
17266d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17276d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17280754003eSLois Curfman McInnes 
17290754003eSLois Curfman McInnes   /* Free work space */
173078b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
173178b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1732182d2002SSatish Balay   *B   = newmat;
17333a40ed3dSBarry Smith   PetscFunctionReturn(0);
17340754003eSLois Curfman McInnes }
17350754003eSLois Curfman McInnes 
17364a2ae208SSatish Balay #undef __FUNCT__
17374a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1738e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1739905e6a2fSBarry Smith {
17406849ba73SBarry Smith   PetscErrorCode ierr;
174113f74950SBarry Smith   PetscInt       i;
1742905e6a2fSBarry Smith 
17433a40ed3dSBarry Smith   PetscFunctionBegin;
1744905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1745854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1746905e6a2fSBarry Smith   }
1747905e6a2fSBarry Smith 
1748905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17496a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1750905e6a2fSBarry Smith   }
17513a40ed3dSBarry Smith   PetscFunctionReturn(0);
1752905e6a2fSBarry Smith }
1753905e6a2fSBarry Smith 
17544a2ae208SSatish Balay #undef __FUNCT__
1755c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1756e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1757c0aa2d19SHong Zhang {
1758c0aa2d19SHong Zhang   PetscFunctionBegin;
1759c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1760c0aa2d19SHong Zhang }
1761c0aa2d19SHong Zhang 
1762c0aa2d19SHong Zhang #undef __FUNCT__
1763c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1764e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1765c0aa2d19SHong Zhang {
1766c0aa2d19SHong Zhang   PetscFunctionBegin;
1767c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1768c0aa2d19SHong Zhang }
1769c0aa2d19SHong Zhang 
1770c0aa2d19SHong Zhang #undef __FUNCT__
17714a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1772e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17734b0e389bSBarry Smith {
17744b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17756849ba73SBarry Smith   PetscErrorCode ierr;
1776d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17773a40ed3dSBarry Smith 
17783a40ed3dSBarry Smith   PetscFunctionBegin;
177933f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
178033f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1781cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17823a40ed3dSBarry Smith     PetscFunctionReturn(0);
17833a40ed3dSBarry Smith   }
1784e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1785a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17860dbb7854Svictorle     for (j=0; j<n; j++) {
1787a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1788a5ce6ee0Svictorle     }
1789a5ce6ee0Svictorle   } else {
1790d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1791a5ce6ee0Svictorle   }
1792273d9f13SBarry Smith   PetscFunctionReturn(0);
1793273d9f13SBarry Smith }
1794273d9f13SBarry Smith 
17954a2ae208SSatish Balay #undef __FUNCT__
17964994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1797e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1798273d9f13SBarry Smith {
1799dfbe8321SBarry Smith   PetscErrorCode ierr;
1800273d9f13SBarry Smith 
1801273d9f13SBarry Smith   PetscFunctionBegin;
1802273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
18033a40ed3dSBarry Smith   PetscFunctionReturn(0);
18044b0e389bSBarry Smith }
18054b0e389bSBarry Smith 
1806284134d9SBarry Smith #undef __FUNCT__
1807ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1808ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1809ba337c44SJed Brown {
1810ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1811ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1812ba337c44SJed Brown   PetscScalar  *aa = a->v;
1813ba337c44SJed Brown 
1814ba337c44SJed Brown   PetscFunctionBegin;
1815ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1816ba337c44SJed Brown   PetscFunctionReturn(0);
1817ba337c44SJed Brown }
1818ba337c44SJed Brown 
1819ba337c44SJed Brown #undef __FUNCT__
1820ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1821ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1822ba337c44SJed Brown {
1823ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1824ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1825ba337c44SJed Brown   PetscScalar  *aa = a->v;
1826ba337c44SJed Brown 
1827ba337c44SJed Brown   PetscFunctionBegin;
1828ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1829ba337c44SJed Brown   PetscFunctionReturn(0);
1830ba337c44SJed Brown }
1831ba337c44SJed Brown 
1832ba337c44SJed Brown #undef __FUNCT__
1833ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1834ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1835ba337c44SJed Brown {
1836ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1837ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1838ba337c44SJed Brown   PetscScalar  *aa = a->v;
1839ba337c44SJed Brown 
1840ba337c44SJed Brown   PetscFunctionBegin;
1841ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1842ba337c44SJed Brown   PetscFunctionReturn(0);
1843ba337c44SJed Brown }
1844284134d9SBarry Smith 
1845a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1846a9fe9ddaSSatish Balay #undef __FUNCT__
1847a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1848150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1849a9fe9ddaSSatish Balay {
1850a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1851a9fe9ddaSSatish Balay 
1852a9fe9ddaSSatish Balay   PetscFunctionBegin;
1853a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18543ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1855a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18563ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1857a9fe9ddaSSatish Balay   }
18583ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1859a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18603ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1861a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1862a9fe9ddaSSatish Balay }
1863a9fe9ddaSSatish Balay 
1864a9fe9ddaSSatish Balay #undef __FUNCT__
1865a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1866a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1867a9fe9ddaSSatish Balay {
1868ee16a9a1SHong Zhang   PetscErrorCode ierr;
1869d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1870ee16a9a1SHong Zhang   Mat            Cmat;
1871a9fe9ddaSSatish Balay 
1872ee16a9a1SHong Zhang   PetscFunctionBegin;
1873e32f2f54SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1874ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1875ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1876ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18770298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1878d73949e8SHong Zhang 
1879ee16a9a1SHong Zhang   *C = Cmat;
1880ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1881ee16a9a1SHong Zhang }
1882a9fe9ddaSSatish Balay 
188398a3b096SSatish Balay #undef __FUNCT__
1884a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1885a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1886a9fe9ddaSSatish Balay {
1887a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1888a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1889a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18900805154bSBarry Smith   PetscBLASInt   m,n,k;
1891a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1892c5df96a5SBarry Smith   PetscErrorCode ierr;
1893fd4e9aacSBarry Smith   PetscBool      flg;
1894a9fe9ddaSSatish Balay 
1895a9fe9ddaSSatish Balay   PetscFunctionBegin;
1896fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1897fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1898fd4e9aacSBarry Smith 
1899fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1900fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1901fd4e9aacSBarry Smith   if (flg) {
1902fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1903fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1904fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1905fd4e9aacSBarry Smith   }
1906fd4e9aacSBarry Smith 
1907fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1908fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1909c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1910c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1911c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
19125ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1913a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1914a9fe9ddaSSatish Balay }
1915a9fe9ddaSSatish Balay 
1916a9fe9ddaSSatish Balay #undef __FUNCT__
191775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
191875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1919a9fe9ddaSSatish Balay {
1920a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1921a9fe9ddaSSatish Balay 
1922a9fe9ddaSSatish Balay   PetscFunctionBegin;
1923a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
19243ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
192575648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
19263ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1927a9fe9ddaSSatish Balay   }
19283ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
192975648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
19303ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1931a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1932a9fe9ddaSSatish Balay }
1933a9fe9ddaSSatish Balay 
1934a9fe9ddaSSatish Balay #undef __FUNCT__
193575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
193675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1937a9fe9ddaSSatish Balay {
1938ee16a9a1SHong Zhang   PetscErrorCode ierr;
1939d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1940ee16a9a1SHong Zhang   Mat            Cmat;
1941a9fe9ddaSSatish Balay 
1942ee16a9a1SHong Zhang   PetscFunctionBegin;
1943e32f2f54SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1944ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1945ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1946ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19470298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
19482205254eSKarl Rupp 
1949ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19502205254eSKarl Rupp 
1951ee16a9a1SHong Zhang   *C = Cmat;
1952ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1953ee16a9a1SHong Zhang }
1954a9fe9ddaSSatish Balay 
1955a9fe9ddaSSatish Balay #undef __FUNCT__
195675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
195775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1958a9fe9ddaSSatish Balay {
1959a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1960a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1961a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19620805154bSBarry Smith   PetscBLASInt   m,n,k;
1963a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1964c5df96a5SBarry Smith   PetscErrorCode ierr;
1965a9fe9ddaSSatish Balay 
1966a9fe9ddaSSatish Balay   PetscFunctionBegin;
1967c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1968c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1969c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19702fbe02b9SBarry Smith   /*
19712fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19722fbe02b9SBarry Smith   */
19735ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1974a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1975a9fe9ddaSSatish Balay }
1976985db425SBarry Smith 
1977985db425SBarry Smith #undef __FUNCT__
1978985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1979e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1980985db425SBarry Smith {
1981985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1982985db425SBarry Smith   PetscErrorCode ierr;
1983d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1984985db425SBarry Smith   PetscScalar    *x;
1985985db425SBarry Smith   MatScalar      *aa = a->v;
1986985db425SBarry Smith 
1987985db425SBarry Smith   PetscFunctionBegin;
1988e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1989985db425SBarry Smith 
1990985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1991985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1992985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1993e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1994985db425SBarry Smith   for (i=0; i<m; i++) {
1995985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1996985db425SBarry Smith     for (j=1; j<n; j++) {
1997985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1998985db425SBarry Smith     }
1999985db425SBarry Smith   }
2000985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2001985db425SBarry Smith   PetscFunctionReturn(0);
2002985db425SBarry Smith }
2003985db425SBarry Smith 
2004985db425SBarry Smith #undef __FUNCT__
2005985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
2006e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2007985db425SBarry Smith {
2008985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2009985db425SBarry Smith   PetscErrorCode ierr;
2010d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2011985db425SBarry Smith   PetscScalar    *x;
2012985db425SBarry Smith   PetscReal      atmp;
2013985db425SBarry Smith   MatScalar      *aa = a->v;
2014985db425SBarry Smith 
2015985db425SBarry Smith   PetscFunctionBegin;
2016e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2017985db425SBarry Smith 
2018985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2019985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2020985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2021e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2022985db425SBarry Smith   for (i=0; i<m; i++) {
20239189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2024985db425SBarry Smith     for (j=1; j<n; j++) {
2025985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
2026985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2027985db425SBarry Smith     }
2028985db425SBarry Smith   }
2029985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2030985db425SBarry Smith   PetscFunctionReturn(0);
2031985db425SBarry Smith }
2032985db425SBarry Smith 
2033985db425SBarry Smith #undef __FUNCT__
2034985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
2035e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2036985db425SBarry Smith {
2037985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2038985db425SBarry Smith   PetscErrorCode ierr;
2039d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2040985db425SBarry Smith   PetscScalar    *x;
2041985db425SBarry Smith   MatScalar      *aa = a->v;
2042985db425SBarry Smith 
2043985db425SBarry Smith   PetscFunctionBegin;
2044e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2045985db425SBarry Smith 
2046985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2047985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2048985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2049e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2050985db425SBarry Smith   for (i=0; i<m; i++) {
2051985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2052985db425SBarry Smith     for (j=1; j<n; j++) {
2053985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2054985db425SBarry Smith     }
2055985db425SBarry Smith   }
2056985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2057985db425SBarry Smith   PetscFunctionReturn(0);
2058985db425SBarry Smith }
2059985db425SBarry Smith 
20608d0534beSBarry Smith #undef __FUNCT__
20618d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2062e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20638d0534beSBarry Smith {
20648d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20658d0534beSBarry Smith   PetscErrorCode ierr;
20668d0534beSBarry Smith   PetscScalar    *x;
20678d0534beSBarry Smith 
20688d0534beSBarry Smith   PetscFunctionBegin;
2069e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20708d0534beSBarry Smith 
20718d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2072d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20738d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20748d0534beSBarry Smith   PetscFunctionReturn(0);
20758d0534beSBarry Smith }
20768d0534beSBarry Smith 
20770716a85fSBarry Smith 
20780716a85fSBarry Smith #undef __FUNCT__
20790716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20800716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20810716a85fSBarry Smith {
20820716a85fSBarry Smith   PetscErrorCode ierr;
20830716a85fSBarry Smith   PetscInt       i,j,m,n;
20840716a85fSBarry Smith   PetscScalar    *a;
20850716a85fSBarry Smith 
20860716a85fSBarry Smith   PetscFunctionBegin;
20870716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20880716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20898c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20900716a85fSBarry Smith   if (type == NORM_2) {
20910716a85fSBarry Smith     for (i=0; i<n; i++) {
20920716a85fSBarry Smith       for (j=0; j<m; j++) {
20930716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
20940716a85fSBarry Smith       }
20950716a85fSBarry Smith       a += m;
20960716a85fSBarry Smith     }
20970716a85fSBarry Smith   } else if (type == NORM_1) {
20980716a85fSBarry Smith     for (i=0; i<n; i++) {
20990716a85fSBarry Smith       for (j=0; j<m; j++) {
21000716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
21010716a85fSBarry Smith       }
21020716a85fSBarry Smith       a += m;
21030716a85fSBarry Smith     }
21040716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
21050716a85fSBarry Smith     for (i=0; i<n; i++) {
21060716a85fSBarry Smith       for (j=0; j<m; j++) {
21070716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
21080716a85fSBarry Smith       }
21090716a85fSBarry Smith       a += m;
21100716a85fSBarry Smith     }
2111ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
21128c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
21130716a85fSBarry Smith   if (type == NORM_2) {
21148f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
21150716a85fSBarry Smith   }
21160716a85fSBarry Smith   PetscFunctionReturn(0);
21170716a85fSBarry Smith }
21180716a85fSBarry Smith 
211973a71a0fSBarry Smith #undef __FUNCT__
212073a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
212173a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
212273a71a0fSBarry Smith {
212373a71a0fSBarry Smith   PetscErrorCode ierr;
212473a71a0fSBarry Smith   PetscScalar    *a;
212573a71a0fSBarry Smith   PetscInt       m,n,i;
212673a71a0fSBarry Smith 
212773a71a0fSBarry Smith   PetscFunctionBegin;
212873a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
21298c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
213073a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
213173a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
213273a71a0fSBarry Smith   }
21338c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
213473a71a0fSBarry Smith   PetscFunctionReturn(0);
213573a71a0fSBarry Smith }
213673a71a0fSBarry Smith 
21373b49f96aSBarry Smith #undef __FUNCT__
21383b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
21393b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
21403b49f96aSBarry Smith {
21413b49f96aSBarry Smith   PetscFunctionBegin;
21423b49f96aSBarry Smith   *missing = PETSC_FALSE;
21433b49f96aSBarry Smith   PetscFunctionReturn(0);
21443b49f96aSBarry Smith }
214573a71a0fSBarry Smith 
2146abc3b08eSStefano Zampini 
2147289bc588SBarry Smith /* -------------------------------------------------------------------*/
2148a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2149905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2150905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2151905e6a2fSBarry Smith                                         MatMult_SeqDense,
215297304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21537c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21547c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2155db4efbfdSBarry Smith                                         0,
2156db4efbfdSBarry Smith                                         0,
2157db4efbfdSBarry Smith                                         0,
2158db4efbfdSBarry Smith                                 /* 10*/ 0,
2159905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2160905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
216141f059aeSBarry Smith                                         MatSOR_SeqDense,
2162ec8511deSBarry Smith                                         MatTranspose_SeqDense,
216397304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2164905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2165905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2166905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2167905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2168c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2169c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2170905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2171905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2172d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2173db4efbfdSBarry Smith                                         0,
2174db4efbfdSBarry Smith                                         0,
2175db4efbfdSBarry Smith                                         0,
2176db4efbfdSBarry Smith                                         0,
21774994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2178273d9f13SBarry Smith                                         0,
2179905e6a2fSBarry Smith                                         0,
218073a71a0fSBarry Smith                                         0,
218173a71a0fSBarry Smith                                         0,
2182d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2183a5ae1ecdSBarry Smith                                         0,
2184a5ae1ecdSBarry Smith                                         0,
2185a5ae1ecdSBarry Smith                                         0,
2186a5ae1ecdSBarry Smith                                         0,
2187d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2188a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2189a5ae1ecdSBarry Smith                                         0,
21904b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2191a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2192d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2193a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
21947d68702bSBarry Smith                                         MatShift_Basic,
2195a5ae1ecdSBarry Smith                                         0,
21963f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
219773a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2198a5ae1ecdSBarry Smith                                         0,
2199a5ae1ecdSBarry Smith                                         0,
2200a5ae1ecdSBarry Smith                                         0,
2201a5ae1ecdSBarry Smith                                         0,
2202d519adbfSMatthew Knepley                                 /* 54*/ 0,
2203a5ae1ecdSBarry Smith                                         0,
2204a5ae1ecdSBarry Smith                                         0,
2205a5ae1ecdSBarry Smith                                         0,
2206a5ae1ecdSBarry Smith                                         0,
2207d519adbfSMatthew Knepley                                 /* 59*/ 0,
2208e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2209e03a110bSBarry Smith                                         MatView_SeqDense,
2210357abbc8SBarry Smith                                         0,
221197304618SKris Buschelman                                         0,
2212d519adbfSMatthew Knepley                                 /* 64*/ 0,
221397304618SKris Buschelman                                         0,
221497304618SKris Buschelman                                         0,
221597304618SKris Buschelman                                         0,
221697304618SKris Buschelman                                         0,
2217d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
221897304618SKris Buschelman                                         0,
221997304618SKris Buschelman                                         0,
222097304618SKris Buschelman                                         0,
222197304618SKris Buschelman                                         0,
2222d519adbfSMatthew Knepley                                 /* 74*/ 0,
222397304618SKris Buschelman                                         0,
222497304618SKris Buschelman                                         0,
222597304618SKris Buschelman                                         0,
222697304618SKris Buschelman                                         0,
2227d519adbfSMatthew Knepley                                 /* 79*/ 0,
222897304618SKris Buschelman                                         0,
222997304618SKris Buschelman                                         0,
223097304618SKris Buschelman                                         0,
22315bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2232865e5f61SKris Buschelman                                         0,
22331cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2234865e5f61SKris Buschelman                                         0,
2235865e5f61SKris Buschelman                                         0,
2236865e5f61SKris Buschelman                                         0,
2237d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2238a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2239a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2240abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2241abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2242abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
22435df89d91SHong Zhang                                         0,
22445df89d91SHong Zhang                                         0,
22455df89d91SHong Zhang                                         0,
2246284134d9SBarry Smith                                         0,
2247d519adbfSMatthew Knepley                                 /* 99*/ 0,
2248284134d9SBarry Smith                                         0,
2249284134d9SBarry Smith                                         0,
2250ba337c44SJed Brown                                         MatConjugate_SeqDense,
2251f73d5cc4SBarry Smith                                         0,
2252ba337c44SJed Brown                                 /*104*/ 0,
2253ba337c44SJed Brown                                         MatRealPart_SeqDense,
2254ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2255985db425SBarry Smith                                         0,
2256985db425SBarry Smith                                         0,
225785e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2258985db425SBarry Smith                                         0,
22598d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2260aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22613b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2262aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2263aabbc4fbSShri Abhyankar                                         0,
2264aabbc4fbSShri Abhyankar                                         0,
2265aabbc4fbSShri Abhyankar                                         0,
2266aabbc4fbSShri Abhyankar                                         0,
2267aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2268aabbc4fbSShri Abhyankar                                         0,
2269aabbc4fbSShri Abhyankar                                         0,
22700716a85fSBarry Smith                                         0,
22710716a85fSBarry Smith                                         0,
22720716a85fSBarry Smith                                 /*124*/ 0,
22735df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22745df89d91SHong Zhang                                         0,
22755df89d91SHong Zhang                                         0,
22765df89d91SHong Zhang                                         0,
22775df89d91SHong Zhang                                 /*129*/ 0,
227875648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
227975648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
228075648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22813964eb88SJed Brown                                         0,
22823964eb88SJed Brown                                 /*134*/ 0,
22833964eb88SJed Brown                                         0,
22843964eb88SJed Brown                                         0,
22853964eb88SJed Brown                                         0,
22863964eb88SJed Brown                                         0,
22873964eb88SJed Brown                                 /*139*/ 0,
2288f9426fe0SMark Adams                                         0,
22893964eb88SJed Brown                                         0
2290985db425SBarry Smith };
229190ace30eSBarry Smith 
22924a2ae208SSatish Balay #undef __FUNCT__
22934a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
22944b828684SBarry Smith /*@C
2295fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2296d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2297d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2298289bc588SBarry Smith 
2299db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2300db81eaa0SLois Curfman McInnes 
230120563c6bSBarry Smith    Input Parameters:
2302db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
23030c775827SLois Curfman McInnes .  m - number of rows
230418f449edSLois Curfman McInnes .  n - number of columns
23050298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2306dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
230720563c6bSBarry Smith 
230820563c6bSBarry Smith    Output Parameter:
230944cd7ae7SLois Curfman McInnes .  A - the matrix
231020563c6bSBarry Smith 
2311b259b22eSLois Curfman McInnes    Notes:
231218f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
231318f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
23140298fd71SBarry Smith    set data=NULL.
231518f449edSLois Curfman McInnes 
2316027ccd11SLois Curfman McInnes    Level: intermediate
2317027ccd11SLois Curfman McInnes 
2318dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2319d65003e9SLois Curfman McInnes 
232069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
232120563c6bSBarry Smith @*/
23227087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2323289bc588SBarry Smith {
2324dfbe8321SBarry Smith   PetscErrorCode ierr;
23253b2fbd54SBarry Smith 
23263a40ed3dSBarry Smith   PetscFunctionBegin;
2327f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2328f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2329273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2330273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2331273d9f13SBarry Smith   PetscFunctionReturn(0);
2332273d9f13SBarry Smith }
2333273d9f13SBarry Smith 
23344a2ae208SSatish Balay #undef __FUNCT__
2335afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2336273d9f13SBarry Smith /*@C
2337273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2338273d9f13SBarry Smith 
2339273d9f13SBarry Smith    Collective on MPI_Comm
2340273d9f13SBarry Smith 
2341273d9f13SBarry Smith    Input Parameters:
23421c4f3114SJed Brown +  B - the matrix
23430298fd71SBarry Smith -  data - the array (or NULL)
2344273d9f13SBarry Smith 
2345273d9f13SBarry Smith    Notes:
2346273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2347273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2348284134d9SBarry Smith    need not call this routine.
2349273d9f13SBarry Smith 
2350273d9f13SBarry Smith    Level: intermediate
2351273d9f13SBarry Smith 
2352273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2353273d9f13SBarry Smith 
235469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2355867c911aSBarry Smith 
2356273d9f13SBarry Smith @*/
23577087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2358273d9f13SBarry Smith {
23594ac538c5SBarry Smith   PetscErrorCode ierr;
2360a23d5eceSKris Buschelman 
2361a23d5eceSKris Buschelman   PetscFunctionBegin;
23624ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2363a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2364a23d5eceSKris Buschelman }
2365a23d5eceSKris Buschelman 
2366a23d5eceSKris Buschelman #undef __FUNCT__
2367afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23687087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2369a23d5eceSKris Buschelman {
2370273d9f13SBarry Smith   Mat_SeqDense   *b;
2371dfbe8321SBarry Smith   PetscErrorCode ierr;
2372273d9f13SBarry Smith 
2373273d9f13SBarry Smith   PetscFunctionBegin;
2374273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2375a868139aSShri Abhyankar 
237634ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
237734ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
237834ef9618SShri Abhyankar 
2379273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
238086d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
238186d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
238286d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
238386d161a7SShri Abhyankar 
23849e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23859e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2386e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23873bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23882205254eSKarl Rupp 
23899e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2390273d9f13SBarry Smith   } else { /* user-allocated storage */
23919e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2392273d9f13SBarry Smith     b->v          = data;
2393273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2394273d9f13SBarry Smith   }
23950450473dSBarry Smith   B->assembled = PETSC_TRUE;
2396273d9f13SBarry Smith   PetscFunctionReturn(0);
2397273d9f13SBarry Smith }
2398273d9f13SBarry Smith 
239965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24001b807ce4Svictorle #undef __FUNCT__
24018baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
2402cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
24038baccfbdSHong Zhang {
2404d77f618aSHong Zhang   Mat            mat_elemental;
2405d77f618aSHong Zhang   PetscErrorCode ierr;
2406d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2407d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2408d77f618aSHong Zhang 
24098baccfbdSHong Zhang   PetscFunctionBegin;
2410d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2411d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2412d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2413d77f618aSHong Zhang   k = 0;
2414d77f618aSHong Zhang   for (j=0; j<N; j++) {
2415d77f618aSHong Zhang     cols[j] = j;
2416d77f618aSHong Zhang     for (i=0; i<M; i++) {
2417d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2418d77f618aSHong Zhang     }
2419d77f618aSHong Zhang   }
2420d77f618aSHong Zhang   for (i=0; i<M; i++) {
2421d77f618aSHong Zhang     rows[i] = i;
2422d77f618aSHong Zhang   }
2423d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2424d77f618aSHong Zhang 
2425d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2426d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2427d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2428d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2429d77f618aSHong Zhang 
2430d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2431d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2432d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2433d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2434d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2435d77f618aSHong Zhang 
2436511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
243728be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2438d77f618aSHong Zhang   } else {
2439d77f618aSHong Zhang     *newmat = mat_elemental;
2440d77f618aSHong Zhang   }
24418baccfbdSHong Zhang   PetscFunctionReturn(0);
24428baccfbdSHong Zhang }
244365b80a83SHong Zhang #endif
24448baccfbdSHong Zhang 
24458baccfbdSHong Zhang #undef __FUNCT__
24461b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
24471b807ce4Svictorle /*@C
24481b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24491b807ce4Svictorle 
24501b807ce4Svictorle   Input parameter:
24511b807ce4Svictorle + A - the matrix
24521b807ce4Svictorle - lda - the leading dimension
24531b807ce4Svictorle 
24541b807ce4Svictorle   Notes:
2455867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24561b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24571b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24581b807ce4Svictorle 
24591b807ce4Svictorle   Level: intermediate
24601b807ce4Svictorle 
24611b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24621b807ce4Svictorle 
2463284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2464867c911aSBarry Smith 
24651b807ce4Svictorle @*/
24667087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24671b807ce4Svictorle {
24681b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
246921a2c019SBarry Smith 
24701b807ce4Svictorle   PetscFunctionBegin;
2471e32f2f54SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
24721b807ce4Svictorle   b->lda       = lda;
247321a2c019SBarry Smith   b->changelda = PETSC_FALSE;
247421a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24751b807ce4Svictorle   PetscFunctionReturn(0);
24761b807ce4Svictorle }
24771b807ce4Svictorle 
24780bad9183SKris Buschelman /*MC
2479fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24800bad9183SKris Buschelman 
24810bad9183SKris Buschelman    Options Database Keys:
24820bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24830bad9183SKris Buschelman 
24840bad9183SKris Buschelman   Level: beginner
24850bad9183SKris Buschelman 
248689665df3SBarry Smith .seealso: MatCreateSeqDense()
248789665df3SBarry Smith 
24880bad9183SKris Buschelman M*/
24890bad9183SKris Buschelman 
24904a2ae208SSatish Balay #undef __FUNCT__
24914a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24928cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2493273d9f13SBarry Smith {
2494273d9f13SBarry Smith   Mat_SeqDense   *b;
2495dfbe8321SBarry Smith   PetscErrorCode ierr;
24967c334f02SBarry Smith   PetscMPIInt    size;
2497273d9f13SBarry Smith 
2498273d9f13SBarry Smith   PetscFunctionBegin;
2499ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2500e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
250155659b69SBarry Smith 
2502b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2503549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
250444cd7ae7SLois Curfman McInnes   B->data = (void*)b;
250518f449edSLois Curfman McInnes 
250644cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2507273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2508273d9f13SBarry Smith   b->v           = 0;
250921a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
25104e220ebcSLois Curfman McInnes 
2511bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2512bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2513bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
25148baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
25158baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
25168baccfbdSHong Zhang #endif
2517bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2518bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2519bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2520bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2521abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
25223bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
25233bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
25243bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
252517667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
25263a40ed3dSBarry Smith   PetscFunctionReturn(0);
2527289bc588SBarry Smith }
2528