xref: /petsc/src/mat/impls/dense/seq/dense.c (revision f6224b95dc512929d91558c2a1e0461ee0630d56)
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 
583*f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
584*f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
585*f6224b95SHong Zhang 
586dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
587db4efbfdSBarry Smith #endif
588db4efbfdSBarry Smith   PetscFunctionReturn(0);
589db4efbfdSBarry Smith }
590db4efbfdSBarry Smith 
591db4efbfdSBarry Smith #undef __FUNCT__
592db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
593e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
594db4efbfdSBarry Smith {
595db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
596db4efbfdSBarry Smith   PetscFunctionBegin;
597e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
598db4efbfdSBarry Smith #else
599db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
600db4efbfdSBarry Smith   PetscErrorCode ierr;
601c5df96a5SBarry Smith   PetscBLASInt   info,n;
602db4efbfdSBarry Smith 
603db4efbfdSBarry Smith   PetscFunctionBegin;
604c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
605db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
606db4efbfdSBarry Smith 
607db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6088b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
609e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
610db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
611db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
612db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
613db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
614d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6152205254eSKarl Rupp 
616*f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
617*f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
618*f6224b95SHong Zhang 
619eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
620db4efbfdSBarry Smith #endif
621db4efbfdSBarry Smith   PetscFunctionReturn(0);
622db4efbfdSBarry Smith }
623db4efbfdSBarry Smith 
624db4efbfdSBarry Smith 
625db4efbfdSBarry Smith #undef __FUNCT__
626db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
6270481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
628db4efbfdSBarry Smith {
629db4efbfdSBarry Smith   PetscErrorCode ierr;
630db4efbfdSBarry Smith   MatFactorInfo  info;
631db4efbfdSBarry Smith 
632db4efbfdSBarry Smith   PetscFunctionBegin;
633db4efbfdSBarry Smith   info.fill = 1.0;
6342205254eSKarl Rupp 
635c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
636719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
637db4efbfdSBarry Smith   PetscFunctionReturn(0);
638db4efbfdSBarry Smith }
639db4efbfdSBarry Smith 
640db4efbfdSBarry Smith #undef __FUNCT__
641db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
642e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
643db4efbfdSBarry Smith {
644db4efbfdSBarry Smith   PetscFunctionBegin;
645c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
6461bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
647719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
648db4efbfdSBarry Smith   PetscFunctionReturn(0);
649db4efbfdSBarry Smith }
650db4efbfdSBarry Smith 
651db4efbfdSBarry Smith #undef __FUNCT__
652db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
653e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
654db4efbfdSBarry Smith {
655db4efbfdSBarry Smith   PetscFunctionBegin;
656b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
657c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
658719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
659db4efbfdSBarry Smith   PetscFunctionReturn(0);
660db4efbfdSBarry Smith }
661db4efbfdSBarry Smith 
662db4efbfdSBarry Smith #undef __FUNCT__
663db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
664cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
665db4efbfdSBarry Smith {
666db4efbfdSBarry Smith   PetscErrorCode ierr;
667db4efbfdSBarry Smith 
668db4efbfdSBarry Smith   PetscFunctionBegin;
669ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
670db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
671db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
672db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
673db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
674db4efbfdSBarry Smith   } else {
675db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
676db4efbfdSBarry Smith   }
677d5f3da31SBarry Smith   (*fact)->factortype = ftype;
67800c67f3bSHong Zhang 
67900c67f3bSHong Zhang   ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr);
68000c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr);
681db4efbfdSBarry Smith   PetscFunctionReturn(0);
682db4efbfdSBarry Smith }
683db4efbfdSBarry Smith 
684289bc588SBarry Smith /* ------------------------------------------------------------------*/
6854a2ae208SSatish Balay #undef __FUNCT__
68641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
687e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
688289bc588SBarry Smith {
689c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
690d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
691d9ca1df4SBarry Smith   const PetscScalar *b;
692dfbe8321SBarry Smith   PetscErrorCode    ierr;
693d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
694c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
695289bc588SBarry Smith 
6963a40ed3dSBarry Smith   PetscFunctionBegin;
697422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
698c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
699289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
70071044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
7012dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
702289bc588SBarry Smith   }
7031ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
704d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
705b965ef7fSBarry Smith   its  = its*lits;
706e32f2f54SBarry 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);
707289bc588SBarry Smith   while (its--) {
708fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
709289bc588SBarry Smith       for (i=0; i<m; 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     }
714fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
715289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7168b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
71755a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
718289bc588SBarry Smith       }
719289bc588SBarry Smith     }
720289bc588SBarry Smith   }
721d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
7221ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7233a40ed3dSBarry Smith   PetscFunctionReturn(0);
724289bc588SBarry Smith }
725289bc588SBarry Smith 
726289bc588SBarry Smith /* -----------------------------------------------------------------*/
7274a2ae208SSatish Balay #undef __FUNCT__
7284a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
729cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
730289bc588SBarry Smith {
731c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
732d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
733d9ca1df4SBarry Smith   PetscScalar       *y;
734dfbe8321SBarry Smith   PetscErrorCode    ierr;
7350805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
736ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
7373a40ed3dSBarry Smith 
7383a40ed3dSBarry Smith   PetscFunctionBegin;
739c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
740c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
741d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
742d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7431ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7448b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
745d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7461ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
747dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
7483a40ed3dSBarry Smith   PetscFunctionReturn(0);
749289bc588SBarry Smith }
750800995b7SMatthew Knepley 
7514a2ae208SSatish Balay #undef __FUNCT__
7524a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
753cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
754289bc588SBarry Smith {
755c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
756d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
757dfbe8321SBarry Smith   PetscErrorCode    ierr;
7580805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
759d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7603a40ed3dSBarry Smith 
7613a40ed3dSBarry Smith   PetscFunctionBegin;
762c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
763c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
764d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
765d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7661ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7678b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
768d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7691ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
770dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7713a40ed3dSBarry Smith   PetscFunctionReturn(0);
772289bc588SBarry Smith }
7736ee01492SSatish Balay 
7744a2ae208SSatish Balay #undef __FUNCT__
7754a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
776cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
777289bc588SBarry Smith {
778c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
779d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
780d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
781dfbe8321SBarry Smith   PetscErrorCode    ierr;
7820805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7833a40ed3dSBarry Smith 
7843a40ed3dSBarry Smith   PetscFunctionBegin;
785c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
786c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
787d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
788600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
789d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7901ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7918b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
792d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7931ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
794dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7953a40ed3dSBarry Smith   PetscFunctionReturn(0);
796289bc588SBarry Smith }
7976ee01492SSatish Balay 
7984a2ae208SSatish Balay #undef __FUNCT__
7994a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
800e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
801289bc588SBarry Smith {
802c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
803d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
804d9ca1df4SBarry Smith   PetscScalar       *y;
805dfbe8321SBarry Smith   PetscErrorCode    ierr;
8060805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
80787828ca2SBarry Smith   PetscScalar       _DOne=1.0;
8083a40ed3dSBarry Smith 
8093a40ed3dSBarry Smith   PetscFunctionBegin;
810c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
811c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
812d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
813600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
814d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8151ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8168b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
817d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8181ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
819dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8203a40ed3dSBarry Smith   PetscFunctionReturn(0);
821289bc588SBarry Smith }
822289bc588SBarry Smith 
823289bc588SBarry Smith /* -----------------------------------------------------------------*/
8244a2ae208SSatish Balay #undef __FUNCT__
8254a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
826e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
827289bc588SBarry Smith {
828c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
82987828ca2SBarry Smith   PetscScalar    *v;
8306849ba73SBarry Smith   PetscErrorCode ierr;
83113f74950SBarry Smith   PetscInt       i;
83267e560aaSBarry Smith 
8333a40ed3dSBarry Smith   PetscFunctionBegin;
834d0f46423SBarry Smith   *ncols = A->cmap->n;
835289bc588SBarry Smith   if (cols) {
836854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
837d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
838289bc588SBarry Smith   }
839289bc588SBarry Smith   if (vals) {
840854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
841289bc588SBarry Smith     v    = mat->v + row;
842d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
843289bc588SBarry Smith   }
8443a40ed3dSBarry Smith   PetscFunctionReturn(0);
845289bc588SBarry Smith }
8466ee01492SSatish Balay 
8474a2ae208SSatish Balay #undef __FUNCT__
8484a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
849e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
850289bc588SBarry Smith {
851dfbe8321SBarry Smith   PetscErrorCode ierr;
8526e111a19SKarl Rupp 
853606d414cSSatish Balay   PetscFunctionBegin;
854606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
855606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8563a40ed3dSBarry Smith   PetscFunctionReturn(0);
857289bc588SBarry Smith }
858289bc588SBarry Smith /* ----------------------------------------------------------------*/
8594a2ae208SSatish Balay #undef __FUNCT__
8604a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
861e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
862289bc588SBarry Smith {
863c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
86413f74950SBarry Smith   PetscInt     i,j,idx=0;
865d6dfbf8fSBarry Smith 
8663a40ed3dSBarry Smith   PetscFunctionBegin;
867289bc588SBarry Smith   if (!mat->roworiented) {
868dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
869289bc588SBarry Smith       for (j=0; j<n; j++) {
870cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8712515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
872e32f2f54SBarry 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);
87358804f6dSBarry Smith #endif
874289bc588SBarry Smith         for (i=0; i<m; i++) {
875cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8762515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
877e32f2f54SBarry 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);
87858804f6dSBarry Smith #endif
879cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
880289bc588SBarry Smith         }
881289bc588SBarry Smith       }
8823a40ed3dSBarry Smith     } else {
883289bc588SBarry Smith       for (j=0; j<n; j++) {
884cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8852515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
886e32f2f54SBarry 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);
88758804f6dSBarry Smith #endif
888289bc588SBarry Smith         for (i=0; i<m; i++) {
889cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8902515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
891e32f2f54SBarry 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);
89258804f6dSBarry Smith #endif
893cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
894289bc588SBarry Smith         }
895289bc588SBarry Smith       }
896289bc588SBarry Smith     }
8973a40ed3dSBarry Smith   } else {
898dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
899e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
900cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9012515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
902e32f2f54SBarry 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);
90358804f6dSBarry Smith #endif
904e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
905cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9062515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
907e32f2f54SBarry 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);
90858804f6dSBarry Smith #endif
909cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
910e8d4e0b9SBarry Smith         }
911e8d4e0b9SBarry Smith       }
9123a40ed3dSBarry Smith     } else {
913289bc588SBarry Smith       for (i=0; i<m; i++) {
914cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9152515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
916e32f2f54SBarry 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);
91758804f6dSBarry Smith #endif
918289bc588SBarry Smith         for (j=0; j<n; j++) {
919cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9202515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
921e32f2f54SBarry 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);
92258804f6dSBarry Smith #endif
923cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
924289bc588SBarry Smith         }
925289bc588SBarry Smith       }
926289bc588SBarry Smith     }
927e8d4e0b9SBarry Smith   }
9283a40ed3dSBarry Smith   PetscFunctionReturn(0);
929289bc588SBarry Smith }
930e8d4e0b9SBarry Smith 
9314a2ae208SSatish Balay #undef __FUNCT__
9324a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
933e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
934ae80bb75SLois Curfman McInnes {
935ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
93613f74950SBarry Smith   PetscInt     i,j;
937ae80bb75SLois Curfman McInnes 
9383a40ed3dSBarry Smith   PetscFunctionBegin;
939ae80bb75SLois Curfman McInnes   /* row-oriented output */
940ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
94197e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
942e32f2f54SBarry 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);
943ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
9446f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
945e32f2f54SBarry 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);
94697e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
947ae80bb75SLois Curfman McInnes     }
948ae80bb75SLois Curfman McInnes   }
9493a40ed3dSBarry Smith   PetscFunctionReturn(0);
950ae80bb75SLois Curfman McInnes }
951ae80bb75SLois Curfman McInnes 
952289bc588SBarry Smith /* -----------------------------------------------------------------*/
953289bc588SBarry Smith 
9544a2ae208SSatish Balay #undef __FUNCT__
9555bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
956e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
957aabbc4fbSShri Abhyankar {
958aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
959aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
960aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
961aabbc4fbSShri Abhyankar   int            fd;
962aabbc4fbSShri Abhyankar   PetscMPIInt    size;
963aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
964aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
965ce94432eSBarry Smith   MPI_Comm       comm;
966aabbc4fbSShri Abhyankar 
967aabbc4fbSShri Abhyankar   PetscFunctionBegin;
968c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
969c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
970ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
971aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
972aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
973aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
974aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
975aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
976aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
977aabbc4fbSShri Abhyankar 
978aabbc4fbSShri Abhyankar   /* set global size if not set already*/
979aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
980aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
981aabbc4fbSShri Abhyankar   } else {
982aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
983aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
984aabbc4fbSShri 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);
985aabbc4fbSShri Abhyankar   }
986e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
987e6324fbbSBarry Smith   if (!a->user_alloc) {
9880298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
989e6324fbbSBarry Smith   }
990aabbc4fbSShri Abhyankar 
991aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
992aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
993aabbc4fbSShri Abhyankar     v = a->v;
994aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
995aabbc4fbSShri Abhyankar        from row major to column major */
996854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
997aabbc4fbSShri Abhyankar     /* read in nonzero values */
998aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
999aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
1000aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
1001aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
1002aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
1003aabbc4fbSShri Abhyankar       }
1004aabbc4fbSShri Abhyankar     }
1005aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
1006aabbc4fbSShri Abhyankar   } else {
1007aabbc4fbSShri Abhyankar     /* read row lengths */
1008854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
1009aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
1010aabbc4fbSShri Abhyankar 
1011aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
1012aabbc4fbSShri Abhyankar     v = a->v;
1013aabbc4fbSShri Abhyankar 
1014aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
1015854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
1016aabbc4fbSShri Abhyankar     cols = scols;
1017aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
1018854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
1019aabbc4fbSShri Abhyankar     vals = svals;
1020aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
1021aabbc4fbSShri Abhyankar 
1022aabbc4fbSShri Abhyankar     /* insert into matrix */
1023aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
1024aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
1025aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
1026aabbc4fbSShri Abhyankar     }
1027aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1028aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
1029aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
1030aabbc4fbSShri Abhyankar   }
1031aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1032aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1033aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1034aabbc4fbSShri Abhyankar }
1035aabbc4fbSShri Abhyankar 
1036aabbc4fbSShri Abhyankar #undef __FUNCT__
10374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
10386849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1039289bc588SBarry Smith {
1040932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1041dfbe8321SBarry Smith   PetscErrorCode    ierr;
104213f74950SBarry Smith   PetscInt          i,j;
10432dcb1b2aSMatthew Knepley   const char        *name;
104487828ca2SBarry Smith   PetscScalar       *v;
1045f3ef73ceSBarry Smith   PetscViewerFormat format;
10465f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1047ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
10485f481a85SSatish Balay #endif
1049932b0c3eSLois Curfman McInnes 
10503a40ed3dSBarry Smith   PetscFunctionBegin;
1051b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1052456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
10533a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1054fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1055d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1056d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
105744cd7ae7SLois Curfman McInnes       v    = a->v + i;
105877431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1059d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1060aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1061329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
106257622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1063329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
106457622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10656831982aSBarry Smith         }
106680cd9d93SLois Curfman McInnes #else
10676831982aSBarry Smith         if (*v) {
106857622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10696831982aSBarry Smith         }
107080cd9d93SLois Curfman McInnes #endif
10711b807ce4Svictorle         v += a->lda;
107280cd9d93SLois Curfman McInnes       }
1073b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
107480cd9d93SLois Curfman McInnes     }
1075d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10763a40ed3dSBarry Smith   } else {
1077d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1078aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
107947989497SBarry Smith     /* determine if matrix has all real values */
108047989497SBarry Smith     v = a->v;
1081d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1082ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
108347989497SBarry Smith     }
108447989497SBarry Smith #endif
1085fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10863a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1087d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1088d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1089fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1090ffac6cdbSBarry Smith     }
1091ffac6cdbSBarry Smith 
1092d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1093932b0c3eSLois Curfman McInnes       v = a->v + i;
1094d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1095aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
109647989497SBarry Smith         if (allreal) {
1097c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
109847989497SBarry Smith         } else {
1099c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
110047989497SBarry Smith         }
1101289bc588SBarry Smith #else
1102c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1103289bc588SBarry Smith #endif
11041b807ce4Svictorle         v += a->lda;
1105289bc588SBarry Smith       }
1106b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1107289bc588SBarry Smith     }
1108fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1109b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1110ffac6cdbSBarry Smith     }
1111d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1112da3a660dSBarry Smith   }
1113b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
11143a40ed3dSBarry Smith   PetscFunctionReturn(0);
1115289bc588SBarry Smith }
1116289bc588SBarry Smith 
11174a2ae208SSatish Balay #undef __FUNCT__
11184a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
11196849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1120932b0c3eSLois Curfman McInnes {
1121932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11226849ba73SBarry Smith   PetscErrorCode    ierr;
112313f74950SBarry Smith   int               fd;
1124d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1125f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1126f4403165SShri Abhyankar   PetscViewerFormat format;
1127932b0c3eSLois Curfman McInnes 
11283a40ed3dSBarry Smith   PetscFunctionBegin;
1129b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
113090ace30eSBarry Smith 
1131f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1132f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1133f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1134785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
11352205254eSKarl Rupp 
1136f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1137f4403165SShri Abhyankar     col_lens[1] = m;
1138f4403165SShri Abhyankar     col_lens[2] = n;
1139f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
11402205254eSKarl Rupp 
1141f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1142f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1143f4403165SShri Abhyankar 
1144f4403165SShri Abhyankar     /* write out matrix, by rows */
1145854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1146f4403165SShri Abhyankar     v    = a->v;
1147f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1148f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1149f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1150f4403165SShri Abhyankar       }
1151f4403165SShri Abhyankar     }
1152f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1153f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1154f4403165SShri Abhyankar   } else {
1155854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11562205254eSKarl Rupp 
11570700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1158932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1159932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1160932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1161932b0c3eSLois Curfman McInnes 
1162932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1163932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11646f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1165932b0c3eSLois Curfman McInnes 
1166932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1167932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1168932b0c3eSLois Curfman McInnes     ict = 0;
1169932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1170932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1171932b0c3eSLois Curfman McInnes     }
11726f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1173606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1174932b0c3eSLois Curfman McInnes 
1175932b0c3eSLois Curfman McInnes     /* store nonzero values */
1176854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1177932b0c3eSLois Curfman McInnes     ict  = 0;
1178932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1179932b0c3eSLois Curfman McInnes       v = a->v + i;
1180932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11811b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1182932b0c3eSLois Curfman McInnes       }
1183932b0c3eSLois Curfman McInnes     }
11846f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1185606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1186f4403165SShri Abhyankar   }
11873a40ed3dSBarry Smith   PetscFunctionReturn(0);
1188932b0c3eSLois Curfman McInnes }
1189932b0c3eSLois Curfman McInnes 
11909804daf3SBarry Smith #include <petscdraw.h>
11914a2ae208SSatish Balay #undef __FUNCT__
11924a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1193e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1194f1af5d2fSBarry Smith {
1195f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1196f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11976849ba73SBarry Smith   PetscErrorCode    ierr;
1198383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1199383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
120087828ca2SBarry Smith   PetscScalar       *v = a->v;
1201b0a32e0cSBarry Smith   PetscViewer       viewer;
1202b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1203f3ef73ceSBarry Smith   PetscViewerFormat format;
1204f1af5d2fSBarry Smith 
1205f1af5d2fSBarry Smith   PetscFunctionBegin;
1206f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1207b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1208b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1209f1af5d2fSBarry Smith 
1210f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1211383922c3SLisandro Dalcin 
1212fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1213383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1214f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1215f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1216383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1217f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1218f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1219f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1220329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1221b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1222329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1223b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1224f1af5d2fSBarry Smith         } else {
1225f1af5d2fSBarry Smith           continue;
1226f1af5d2fSBarry Smith         }
1227b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1228f1af5d2fSBarry Smith       }
1229f1af5d2fSBarry Smith     }
1230383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1231f1af5d2fSBarry Smith   } else {
1232f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1233f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1234b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1235b05fc000SLisandro Dalcin     PetscDraw popup;
1236b05fc000SLisandro Dalcin 
1237f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1238f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1239f1af5d2fSBarry Smith     }
1240383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1241b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
124245f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1243383922c3SLisandro Dalcin 
1244383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1245f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1246f1af5d2fSBarry Smith       x_l = j;
1247f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1248f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1249f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1250f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1251b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1252b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1253f1af5d2fSBarry Smith       }
1254f1af5d2fSBarry Smith     }
1255383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1256f1af5d2fSBarry Smith   }
1257f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1258f1af5d2fSBarry Smith }
1259f1af5d2fSBarry Smith 
12604a2ae208SSatish Balay #undef __FUNCT__
12614a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1262e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1263f1af5d2fSBarry Smith {
1264b0a32e0cSBarry Smith   PetscDraw      draw;
1265ace3abfcSBarry Smith   PetscBool      isnull;
1266329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1267dfbe8321SBarry Smith   PetscErrorCode ierr;
1268f1af5d2fSBarry Smith 
1269f1af5d2fSBarry Smith   PetscFunctionBegin;
1270b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1271b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1272abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1273f1af5d2fSBarry Smith 
1274d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1275f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1276b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1277832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1278b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12790298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1280832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1281f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1282f1af5d2fSBarry Smith }
1283f1af5d2fSBarry Smith 
12844a2ae208SSatish Balay #undef __FUNCT__
12854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1286dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1287932b0c3eSLois Curfman McInnes {
1288dfbe8321SBarry Smith   PetscErrorCode ierr;
1289ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1290932b0c3eSLois Curfman McInnes 
12913a40ed3dSBarry Smith   PetscFunctionBegin;
1292251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1293251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1294251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12950f5bd95cSBarry Smith 
1296c45a1595SBarry Smith   if (iascii) {
1297c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12980f5bd95cSBarry Smith   } else if (isbinary) {
12993a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1300f1af5d2fSBarry Smith   } else if (isdraw) {
1301f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1302932b0c3eSLois Curfman McInnes   }
13033a40ed3dSBarry Smith   PetscFunctionReturn(0);
1304932b0c3eSLois Curfman McInnes }
1305289bc588SBarry Smith 
13064a2ae208SSatish Balay #undef __FUNCT__
13074a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1308e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat)
1309289bc588SBarry Smith {
1310ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1311dfbe8321SBarry Smith   PetscErrorCode ierr;
131290f02eecSBarry Smith 
13133a40ed3dSBarry Smith   PetscFunctionBegin;
1314aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1315d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1316a5a9c739SBarry Smith #endif
131705b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1318abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
13196857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1320bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1321dbd8c25aSHong Zhang 
1322dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1323bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1324bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
13258baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
13268baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
13278baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
13288baccfbdSHong Zhang #endif
1329bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1330bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1331bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1332bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1333abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13343bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13353bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13363bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13373a40ed3dSBarry Smith   PetscFunctionReturn(0);
1338289bc588SBarry Smith }
1339289bc588SBarry Smith 
13404a2ae208SSatish Balay #undef __FUNCT__
13414a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1342e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1343289bc588SBarry Smith {
1344c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
13456849ba73SBarry Smith   PetscErrorCode ierr;
134613f74950SBarry Smith   PetscInt       k,j,m,n,M;
134787828ca2SBarry Smith   PetscScalar    *v,tmp;
134848b35521SBarry Smith 
13493a40ed3dSBarry Smith   PetscFunctionBegin;
1350d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1351e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1352e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1353e7e72b3dSBarry Smith     else {
1354d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1355289bc588SBarry Smith         for (k=0; k<j; k++) {
13561b807ce4Svictorle           tmp        = v[j + k*M];
13571b807ce4Svictorle           v[j + k*M] = v[k + j*M];
13581b807ce4Svictorle           v[k + j*M] = tmp;
1359289bc588SBarry Smith         }
1360289bc588SBarry Smith       }
1361d64ed03dSBarry Smith     }
13623a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1363d3e5ee88SLois Curfman McInnes     Mat          tmat;
1364ec8511deSBarry Smith     Mat_SeqDense *tmatd;
136587828ca2SBarry Smith     PetscScalar  *v2;
1366af36a384SStefano Zampini     PetscInt     M2;
1367ea709b57SSatish Balay 
1368fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1369ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1370d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13717adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13720298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1373fc4dec0aSBarry Smith     } else {
1374fc4dec0aSBarry Smith       tmat = *matout;
1375fc4dec0aSBarry Smith     }
1376ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1377af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1378d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1379af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1380d3e5ee88SLois Curfman McInnes     }
13816d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13826d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1383d3e5ee88SLois Curfman McInnes     *matout = tmat;
138448b35521SBarry Smith   }
13853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1386289bc588SBarry Smith }
1387289bc588SBarry Smith 
13884a2ae208SSatish Balay #undef __FUNCT__
13894a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1390e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1391289bc588SBarry Smith {
1392c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1393c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
139413f74950SBarry Smith   PetscInt     i,j;
1395a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13969ea5d5aeSSatish Balay 
13973a40ed3dSBarry Smith   PetscFunctionBegin;
1398d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1399d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1400d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
14011b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1402d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
14033a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
14041b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
14051b807ce4Svictorle     }
1406289bc588SBarry Smith   }
140777c4ece6SBarry Smith   *flg = PETSC_TRUE;
14083a40ed3dSBarry Smith   PetscFunctionReturn(0);
1409289bc588SBarry Smith }
1410289bc588SBarry Smith 
14114a2ae208SSatish Balay #undef __FUNCT__
14124a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1413e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1414289bc588SBarry Smith {
1415c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1416dfbe8321SBarry Smith   PetscErrorCode ierr;
141713f74950SBarry Smith   PetscInt       i,n,len;
141887828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
141944cd7ae7SLois Curfman McInnes 
14203a40ed3dSBarry Smith   PetscFunctionBegin;
14212dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
14227a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
14231ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1424d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1425e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
142644cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
14271b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1428289bc588SBarry Smith   }
14291ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
14303a40ed3dSBarry Smith   PetscFunctionReturn(0);
1431289bc588SBarry Smith }
1432289bc588SBarry Smith 
14334a2ae208SSatish Balay #undef __FUNCT__
14344a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1435e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1436289bc588SBarry Smith {
1437c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1438f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1439f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1440dfbe8321SBarry Smith   PetscErrorCode    ierr;
1441d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
144255659b69SBarry Smith 
14433a40ed3dSBarry Smith   PetscFunctionBegin;
144428988994SBarry Smith   if (ll) {
14457a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1446f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1447e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1448da3a660dSBarry Smith     for (i=0; i<m; i++) {
1449da3a660dSBarry Smith       x = l[i];
1450da3a660dSBarry Smith       v = mat->v + i;
1451b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1452da3a660dSBarry Smith     }
1453f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1454eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1455da3a660dSBarry Smith   }
145628988994SBarry Smith   if (rr) {
14577a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1458f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1459e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1460da3a660dSBarry Smith     for (i=0; i<n; i++) {
1461da3a660dSBarry Smith       x = r[i];
1462b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14632205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1464da3a660dSBarry Smith     }
1465f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1466eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1467da3a660dSBarry Smith   }
14683a40ed3dSBarry Smith   PetscFunctionReturn(0);
1469289bc588SBarry Smith }
1470289bc588SBarry Smith 
14714a2ae208SSatish Balay #undef __FUNCT__
14724a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1473e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1474289bc588SBarry Smith {
1475c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
147687828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1477329f5518SBarry Smith   PetscReal      sum  = 0.0;
1478d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1479efee365bSSatish Balay   PetscErrorCode ierr;
148055659b69SBarry Smith 
14813a40ed3dSBarry Smith   PetscFunctionBegin;
1482289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1483a5ce6ee0Svictorle     if (lda>m) {
1484d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1485a5ce6ee0Svictorle         v = mat->v+j*lda;
1486a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1487a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1488a5ce6ee0Svictorle         }
1489a5ce6ee0Svictorle       }
1490a5ce6ee0Svictorle     } else {
1491d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1492329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1493289bc588SBarry Smith       }
1494a5ce6ee0Svictorle     }
14958f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1496dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14973a40ed3dSBarry Smith   } else if (type == NORM_1) {
1498064f8208SBarry Smith     *nrm = 0.0;
1499d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
15001b807ce4Svictorle       v   = mat->v + j*mat->lda;
1501289bc588SBarry Smith       sum = 0.0;
1502d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
150333a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1504289bc588SBarry Smith       }
1505064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1506289bc588SBarry Smith     }
1507eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15083a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1509064f8208SBarry Smith     *nrm = 0.0;
1510d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1511289bc588SBarry Smith       v   = mat->v + j;
1512289bc588SBarry Smith       sum = 0.0;
1513d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
15141b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1515289bc588SBarry Smith       }
1516064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1517289bc588SBarry Smith     }
1518eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1519e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
15203a40ed3dSBarry Smith   PetscFunctionReturn(0);
1521289bc588SBarry Smith }
1522289bc588SBarry Smith 
15234a2ae208SSatish Balay #undef __FUNCT__
15244a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1525e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1526289bc588SBarry Smith {
1527c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
152863ba0a88SBarry Smith   PetscErrorCode ierr;
152967e560aaSBarry Smith 
15303a40ed3dSBarry Smith   PetscFunctionBegin;
1531b5a2b587SKris Buschelman   switch (op) {
1532b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
15334e0d8c25SBarry Smith     aij->roworiented = flg;
1534b5a2b587SKris Buschelman     break;
1535512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1536b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
15373971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
15384e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
153913fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1540b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1541b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
15425021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
15435021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
15445021d80fSJed Brown     break;
15455021d80fSJed Brown   case MAT_SPD:
154677e54ba9SKris Buschelman   case MAT_SYMMETRIC:
154777e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
15489a4540c5SBarry Smith   case MAT_HERMITIAN:
15499a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
15505021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
155177e54ba9SKris Buschelman     break;
1552b5a2b587SKris Buschelman   default:
1553e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
15543a40ed3dSBarry Smith   }
15553a40ed3dSBarry Smith   PetscFunctionReturn(0);
1556289bc588SBarry Smith }
1557289bc588SBarry Smith 
15584a2ae208SSatish Balay #undef __FUNCT__
15594a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1560e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15616f0a148fSBarry Smith {
1562ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15636849ba73SBarry Smith   PetscErrorCode ierr;
1564d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15653a40ed3dSBarry Smith 
15663a40ed3dSBarry Smith   PetscFunctionBegin;
1567a5ce6ee0Svictorle   if (lda>m) {
1568d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1569a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1570a5ce6ee0Svictorle     }
1571a5ce6ee0Svictorle   } else {
1572d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1573a5ce6ee0Svictorle   }
15743a40ed3dSBarry Smith   PetscFunctionReturn(0);
15756f0a148fSBarry Smith }
15766f0a148fSBarry Smith 
15774a2ae208SSatish Balay #undef __FUNCT__
15784a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1579e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15806f0a148fSBarry Smith {
158197b48c8fSBarry Smith   PetscErrorCode    ierr;
1582ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1583b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
158497b48c8fSBarry Smith   PetscScalar       *slot,*bb;
158597b48c8fSBarry Smith   const PetscScalar *xx;
158655659b69SBarry Smith 
15873a40ed3dSBarry Smith   PetscFunctionBegin;
1588b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1589b9679d65SBarry Smith   for (i=0; i<N; i++) {
1590b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1591b9679d65SBarry 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);
1592b9679d65SBarry Smith   }
1593b9679d65SBarry Smith #endif
1594b9679d65SBarry Smith 
159597b48c8fSBarry Smith   /* fix right hand side if needed */
159697b48c8fSBarry Smith   if (x && b) {
159797b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
159897b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15992205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
160097b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
160197b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
160297b48c8fSBarry Smith   }
160397b48c8fSBarry Smith 
16046f0a148fSBarry Smith   for (i=0; i<N; i++) {
16056f0a148fSBarry Smith     slot = l->v + rows[i];
1606b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
16076f0a148fSBarry Smith   }
1608f4df32b1SMatthew Knepley   if (diag != 0.0) {
1609b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
16106f0a148fSBarry Smith     for (i=0; i<N; i++) {
1611b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1612f4df32b1SMatthew Knepley       *slot = diag;
16136f0a148fSBarry Smith     }
16146f0a148fSBarry Smith   }
16153a40ed3dSBarry Smith   PetscFunctionReturn(0);
16166f0a148fSBarry Smith }
1617557bce09SLois Curfman McInnes 
16184a2ae208SSatish Balay #undef __FUNCT__
16198c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1620e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
162164e87e97SBarry Smith {
1622c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
16233a40ed3dSBarry Smith 
16243a40ed3dSBarry Smith   PetscFunctionBegin;
1625e32f2f54SBarry 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");
162664e87e97SBarry Smith   *array = mat->v;
16273a40ed3dSBarry Smith   PetscFunctionReturn(0);
162864e87e97SBarry Smith }
16290754003eSLois Curfman McInnes 
16304a2ae208SSatish Balay #undef __FUNCT__
16318c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1632e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1633ff14e315SSatish Balay {
16343a40ed3dSBarry Smith   PetscFunctionBegin;
163509b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
16363a40ed3dSBarry Smith   PetscFunctionReturn(0);
1637ff14e315SSatish Balay }
16380754003eSLois Curfman McInnes 
16394a2ae208SSatish Balay #undef __FUNCT__
16408c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1641dec5eb66SMatthew G Knepley /*@C
16428c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
164373a71a0fSBarry Smith 
164473a71a0fSBarry Smith    Not Collective
164573a71a0fSBarry Smith 
164673a71a0fSBarry Smith    Input Parameter:
1647579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
164873a71a0fSBarry Smith 
164973a71a0fSBarry Smith    Output Parameter:
165073a71a0fSBarry Smith .   array - pointer to the data
165173a71a0fSBarry Smith 
165273a71a0fSBarry Smith    Level: intermediate
165373a71a0fSBarry Smith 
16548c778c55SBarry Smith .seealso: MatDenseRestoreArray()
165573a71a0fSBarry Smith @*/
16568c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
165773a71a0fSBarry Smith {
165873a71a0fSBarry Smith   PetscErrorCode ierr;
165973a71a0fSBarry Smith 
166073a71a0fSBarry Smith   PetscFunctionBegin;
16618c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
166273a71a0fSBarry Smith   PetscFunctionReturn(0);
166373a71a0fSBarry Smith }
166473a71a0fSBarry Smith 
166573a71a0fSBarry Smith #undef __FUNCT__
16668c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1667dec5eb66SMatthew G Knepley /*@C
1668579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
166973a71a0fSBarry Smith 
167073a71a0fSBarry Smith    Not Collective
167173a71a0fSBarry Smith 
167273a71a0fSBarry Smith    Input Parameters:
1673579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
167473a71a0fSBarry Smith .  array - pointer to the data
167573a71a0fSBarry Smith 
167673a71a0fSBarry Smith    Level: intermediate
167773a71a0fSBarry Smith 
16788c778c55SBarry Smith .seealso: MatDenseGetArray()
167973a71a0fSBarry Smith @*/
16808c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
168173a71a0fSBarry Smith {
168273a71a0fSBarry Smith   PetscErrorCode ierr;
168373a71a0fSBarry Smith 
168473a71a0fSBarry Smith   PetscFunctionBegin;
16858c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
168673a71a0fSBarry Smith   PetscFunctionReturn(0);
168773a71a0fSBarry Smith }
168873a71a0fSBarry Smith 
168973a71a0fSBarry Smith #undef __FUNCT__
16904a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
169113f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16920754003eSLois Curfman McInnes {
1693c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16946849ba73SBarry Smith   PetscErrorCode ierr;
16955d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16965d0c19d7SBarry Smith   const PetscInt *irow,*icol;
169787828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16980754003eSLois Curfman McInnes   Mat            newmat;
16990754003eSLois Curfman McInnes 
17003a40ed3dSBarry Smith   PetscFunctionBegin;
170178b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
170278b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1703e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1704e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
17050754003eSLois Curfman McInnes 
1706182d2002SSatish Balay   /* Check submatrixcall */
1707182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
170813f74950SBarry Smith     PetscInt n_cols,n_rows;
1709182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
171021a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1711f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1712c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
171321a2c019SBarry Smith     }
1714182d2002SSatish Balay     newmat = *B;
1715182d2002SSatish Balay   } else {
17160754003eSLois Curfman McInnes     /* Create and fill new matrix */
1717ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1718f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
17197adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
17200298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1721182d2002SSatish Balay   }
1722182d2002SSatish Balay 
1723182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1724182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1725182d2002SSatish Balay 
1726182d2002SSatish Balay   for (i=0; i<ncols; i++) {
17276de62eeeSBarry Smith     av = v + mat->lda*icol[i];
17282205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
17290754003eSLois Curfman McInnes   }
1730182d2002SSatish Balay 
1731182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
17326d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17336d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17340754003eSLois Curfman McInnes 
17350754003eSLois Curfman McInnes   /* Free work space */
173678b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
173778b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1738182d2002SSatish Balay   *B   = newmat;
17393a40ed3dSBarry Smith   PetscFunctionReturn(0);
17400754003eSLois Curfman McInnes }
17410754003eSLois Curfman McInnes 
17424a2ae208SSatish Balay #undef __FUNCT__
17434a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1744e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1745905e6a2fSBarry Smith {
17466849ba73SBarry Smith   PetscErrorCode ierr;
174713f74950SBarry Smith   PetscInt       i;
1748905e6a2fSBarry Smith 
17493a40ed3dSBarry Smith   PetscFunctionBegin;
1750905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1751854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1752905e6a2fSBarry Smith   }
1753905e6a2fSBarry Smith 
1754905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17556a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1756905e6a2fSBarry Smith   }
17573a40ed3dSBarry Smith   PetscFunctionReturn(0);
1758905e6a2fSBarry Smith }
1759905e6a2fSBarry Smith 
17604a2ae208SSatish Balay #undef __FUNCT__
1761c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1762e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1763c0aa2d19SHong Zhang {
1764c0aa2d19SHong Zhang   PetscFunctionBegin;
1765c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1766c0aa2d19SHong Zhang }
1767c0aa2d19SHong Zhang 
1768c0aa2d19SHong Zhang #undef __FUNCT__
1769c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1770e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1771c0aa2d19SHong Zhang {
1772c0aa2d19SHong Zhang   PetscFunctionBegin;
1773c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1774c0aa2d19SHong Zhang }
1775c0aa2d19SHong Zhang 
1776c0aa2d19SHong Zhang #undef __FUNCT__
17774a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1778e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17794b0e389bSBarry Smith {
17804b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17816849ba73SBarry Smith   PetscErrorCode ierr;
1782d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17833a40ed3dSBarry Smith 
17843a40ed3dSBarry Smith   PetscFunctionBegin;
178533f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
178633f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1787cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17883a40ed3dSBarry Smith     PetscFunctionReturn(0);
17893a40ed3dSBarry Smith   }
1790e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1791a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17920dbb7854Svictorle     for (j=0; j<n; j++) {
1793a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1794a5ce6ee0Svictorle     }
1795a5ce6ee0Svictorle   } else {
1796d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1797a5ce6ee0Svictorle   }
1798273d9f13SBarry Smith   PetscFunctionReturn(0);
1799273d9f13SBarry Smith }
1800273d9f13SBarry Smith 
18014a2ae208SSatish Balay #undef __FUNCT__
18024994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1803e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1804273d9f13SBarry Smith {
1805dfbe8321SBarry Smith   PetscErrorCode ierr;
1806273d9f13SBarry Smith 
1807273d9f13SBarry Smith   PetscFunctionBegin;
1808273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
18093a40ed3dSBarry Smith   PetscFunctionReturn(0);
18104b0e389bSBarry Smith }
18114b0e389bSBarry Smith 
1812284134d9SBarry Smith #undef __FUNCT__
1813ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1814ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1815ba337c44SJed Brown {
1816ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1817ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1818ba337c44SJed Brown   PetscScalar  *aa = a->v;
1819ba337c44SJed Brown 
1820ba337c44SJed Brown   PetscFunctionBegin;
1821ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1822ba337c44SJed Brown   PetscFunctionReturn(0);
1823ba337c44SJed Brown }
1824ba337c44SJed Brown 
1825ba337c44SJed Brown #undef __FUNCT__
1826ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1827ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1828ba337c44SJed Brown {
1829ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1830ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1831ba337c44SJed Brown   PetscScalar  *aa = a->v;
1832ba337c44SJed Brown 
1833ba337c44SJed Brown   PetscFunctionBegin;
1834ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1835ba337c44SJed Brown   PetscFunctionReturn(0);
1836ba337c44SJed Brown }
1837ba337c44SJed Brown 
1838ba337c44SJed Brown #undef __FUNCT__
1839ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1840ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1841ba337c44SJed Brown {
1842ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1843ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1844ba337c44SJed Brown   PetscScalar  *aa = a->v;
1845ba337c44SJed Brown 
1846ba337c44SJed Brown   PetscFunctionBegin;
1847ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1848ba337c44SJed Brown   PetscFunctionReturn(0);
1849ba337c44SJed Brown }
1850284134d9SBarry Smith 
1851a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1852a9fe9ddaSSatish Balay #undef __FUNCT__
1853a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1854150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1855a9fe9ddaSSatish Balay {
1856a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1857a9fe9ddaSSatish Balay 
1858a9fe9ddaSSatish Balay   PetscFunctionBegin;
1859a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18603ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1861a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18623ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1863a9fe9ddaSSatish Balay   }
18643ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1865a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18663ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1867a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1868a9fe9ddaSSatish Balay }
1869a9fe9ddaSSatish Balay 
1870a9fe9ddaSSatish Balay #undef __FUNCT__
1871a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1872a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1873a9fe9ddaSSatish Balay {
1874ee16a9a1SHong Zhang   PetscErrorCode ierr;
1875d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1876ee16a9a1SHong Zhang   Mat            Cmat;
1877a9fe9ddaSSatish Balay 
1878ee16a9a1SHong Zhang   PetscFunctionBegin;
1879e32f2f54SBarry 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);
1880ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1881ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1882ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18830298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1884d73949e8SHong Zhang 
1885ee16a9a1SHong Zhang   *C = Cmat;
1886ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1887ee16a9a1SHong Zhang }
1888a9fe9ddaSSatish Balay 
188998a3b096SSatish Balay #undef __FUNCT__
1890a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1891a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1892a9fe9ddaSSatish Balay {
1893a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1894a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1895a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18960805154bSBarry Smith   PetscBLASInt   m,n,k;
1897a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1898c5df96a5SBarry Smith   PetscErrorCode ierr;
1899fd4e9aacSBarry Smith   PetscBool      flg;
1900a9fe9ddaSSatish Balay 
1901a9fe9ddaSSatish Balay   PetscFunctionBegin;
1902fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1903fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1904fd4e9aacSBarry Smith 
1905fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1906fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1907fd4e9aacSBarry Smith   if (flg) {
1908fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1909fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1910fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1911fd4e9aacSBarry Smith   }
1912fd4e9aacSBarry Smith 
1913fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1914fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1915c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1916c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1917c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
19185ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1919a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1920a9fe9ddaSSatish Balay }
1921a9fe9ddaSSatish Balay 
1922a9fe9ddaSSatish Balay #undef __FUNCT__
192375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
192475648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1925a9fe9ddaSSatish Balay {
1926a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1927a9fe9ddaSSatish Balay 
1928a9fe9ddaSSatish Balay   PetscFunctionBegin;
1929a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
19303ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
193175648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
19323ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1933a9fe9ddaSSatish Balay   }
19343ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
193575648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
19363ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1937a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1938a9fe9ddaSSatish Balay }
1939a9fe9ddaSSatish Balay 
1940a9fe9ddaSSatish Balay #undef __FUNCT__
194175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
194275648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1943a9fe9ddaSSatish Balay {
1944ee16a9a1SHong Zhang   PetscErrorCode ierr;
1945d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1946ee16a9a1SHong Zhang   Mat            Cmat;
1947a9fe9ddaSSatish Balay 
1948ee16a9a1SHong Zhang   PetscFunctionBegin;
1949e32f2f54SBarry 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);
1950ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1951ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1952ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19530298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
19542205254eSKarl Rupp 
1955ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19562205254eSKarl Rupp 
1957ee16a9a1SHong Zhang   *C = Cmat;
1958ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1959ee16a9a1SHong Zhang }
1960a9fe9ddaSSatish Balay 
1961a9fe9ddaSSatish Balay #undef __FUNCT__
196275648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
196375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1964a9fe9ddaSSatish Balay {
1965a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1966a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1967a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19680805154bSBarry Smith   PetscBLASInt   m,n,k;
1969a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1970c5df96a5SBarry Smith   PetscErrorCode ierr;
1971a9fe9ddaSSatish Balay 
1972a9fe9ddaSSatish Balay   PetscFunctionBegin;
1973c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1974c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1975c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19762fbe02b9SBarry Smith   /*
19772fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19782fbe02b9SBarry Smith   */
19795ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1980a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1981a9fe9ddaSSatish Balay }
1982985db425SBarry Smith 
1983985db425SBarry Smith #undef __FUNCT__
1984985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1985e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1986985db425SBarry Smith {
1987985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1988985db425SBarry Smith   PetscErrorCode ierr;
1989d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1990985db425SBarry Smith   PetscScalar    *x;
1991985db425SBarry Smith   MatScalar      *aa = a->v;
1992985db425SBarry Smith 
1993985db425SBarry Smith   PetscFunctionBegin;
1994e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1995985db425SBarry Smith 
1996985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1997985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1998985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1999e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2000985db425SBarry Smith   for (i=0; i<m; i++) {
2001985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2002985db425SBarry Smith     for (j=1; j<n; j++) {
2003985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2004985db425SBarry Smith     }
2005985db425SBarry Smith   }
2006985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2007985db425SBarry Smith   PetscFunctionReturn(0);
2008985db425SBarry Smith }
2009985db425SBarry Smith 
2010985db425SBarry Smith #undef __FUNCT__
2011985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
2012e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2013985db425SBarry Smith {
2014985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2015985db425SBarry Smith   PetscErrorCode ierr;
2016d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2017985db425SBarry Smith   PetscScalar    *x;
2018985db425SBarry Smith   PetscReal      atmp;
2019985db425SBarry Smith   MatScalar      *aa = a->v;
2020985db425SBarry Smith 
2021985db425SBarry Smith   PetscFunctionBegin;
2022e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2023985db425SBarry Smith 
2024985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2025985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2026985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2027e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2028985db425SBarry Smith   for (i=0; i<m; i++) {
20299189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2030985db425SBarry Smith     for (j=1; j<n; j++) {
2031985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
2032985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2033985db425SBarry Smith     }
2034985db425SBarry Smith   }
2035985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2036985db425SBarry Smith   PetscFunctionReturn(0);
2037985db425SBarry Smith }
2038985db425SBarry Smith 
2039985db425SBarry Smith #undef __FUNCT__
2040985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
2041e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2042985db425SBarry Smith {
2043985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2044985db425SBarry Smith   PetscErrorCode ierr;
2045d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2046985db425SBarry Smith   PetscScalar    *x;
2047985db425SBarry Smith   MatScalar      *aa = a->v;
2048985db425SBarry Smith 
2049985db425SBarry Smith   PetscFunctionBegin;
2050e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2051985db425SBarry Smith 
2052985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2053985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2054985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2055e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2056985db425SBarry Smith   for (i=0; i<m; i++) {
2057985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2058985db425SBarry Smith     for (j=1; j<n; j++) {
2059985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2060985db425SBarry Smith     }
2061985db425SBarry Smith   }
2062985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2063985db425SBarry Smith   PetscFunctionReturn(0);
2064985db425SBarry Smith }
2065985db425SBarry Smith 
20668d0534beSBarry Smith #undef __FUNCT__
20678d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2068e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20698d0534beSBarry Smith {
20708d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20718d0534beSBarry Smith   PetscErrorCode ierr;
20728d0534beSBarry Smith   PetscScalar    *x;
20738d0534beSBarry Smith 
20748d0534beSBarry Smith   PetscFunctionBegin;
2075e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20768d0534beSBarry Smith 
20778d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2078d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20798d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20808d0534beSBarry Smith   PetscFunctionReturn(0);
20818d0534beSBarry Smith }
20828d0534beSBarry Smith 
20830716a85fSBarry Smith 
20840716a85fSBarry Smith #undef __FUNCT__
20850716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20860716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20870716a85fSBarry Smith {
20880716a85fSBarry Smith   PetscErrorCode ierr;
20890716a85fSBarry Smith   PetscInt       i,j,m,n;
20900716a85fSBarry Smith   PetscScalar    *a;
20910716a85fSBarry Smith 
20920716a85fSBarry Smith   PetscFunctionBegin;
20930716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20940716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20958c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20960716a85fSBarry Smith   if (type == NORM_2) {
20970716a85fSBarry Smith     for (i=0; i<n; i++) {
20980716a85fSBarry Smith       for (j=0; j<m; j++) {
20990716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
21000716a85fSBarry Smith       }
21010716a85fSBarry Smith       a += m;
21020716a85fSBarry Smith     }
21030716a85fSBarry Smith   } else if (type == NORM_1) {
21040716a85fSBarry Smith     for (i=0; i<n; i++) {
21050716a85fSBarry Smith       for (j=0; j<m; j++) {
21060716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
21070716a85fSBarry Smith       }
21080716a85fSBarry Smith       a += m;
21090716a85fSBarry Smith     }
21100716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
21110716a85fSBarry Smith     for (i=0; i<n; i++) {
21120716a85fSBarry Smith       for (j=0; j<m; j++) {
21130716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
21140716a85fSBarry Smith       }
21150716a85fSBarry Smith       a += m;
21160716a85fSBarry Smith     }
2117ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
21188c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
21190716a85fSBarry Smith   if (type == NORM_2) {
21208f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
21210716a85fSBarry Smith   }
21220716a85fSBarry Smith   PetscFunctionReturn(0);
21230716a85fSBarry Smith }
21240716a85fSBarry Smith 
212573a71a0fSBarry Smith #undef __FUNCT__
212673a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
212773a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
212873a71a0fSBarry Smith {
212973a71a0fSBarry Smith   PetscErrorCode ierr;
213073a71a0fSBarry Smith   PetscScalar    *a;
213173a71a0fSBarry Smith   PetscInt       m,n,i;
213273a71a0fSBarry Smith 
213373a71a0fSBarry Smith   PetscFunctionBegin;
213473a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
21358c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
213673a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
213773a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
213873a71a0fSBarry Smith   }
21398c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
214073a71a0fSBarry Smith   PetscFunctionReturn(0);
214173a71a0fSBarry Smith }
214273a71a0fSBarry Smith 
21433b49f96aSBarry Smith #undef __FUNCT__
21443b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
21453b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
21463b49f96aSBarry Smith {
21473b49f96aSBarry Smith   PetscFunctionBegin;
21483b49f96aSBarry Smith   *missing = PETSC_FALSE;
21493b49f96aSBarry Smith   PetscFunctionReturn(0);
21503b49f96aSBarry Smith }
215173a71a0fSBarry Smith 
2152abc3b08eSStefano Zampini 
2153289bc588SBarry Smith /* -------------------------------------------------------------------*/
2154a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2155905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2156905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2157905e6a2fSBarry Smith                                         MatMult_SeqDense,
215897304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21597c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21607c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2161db4efbfdSBarry Smith                                         0,
2162db4efbfdSBarry Smith                                         0,
2163db4efbfdSBarry Smith                                         0,
2164db4efbfdSBarry Smith                                 /* 10*/ 0,
2165905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2166905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
216741f059aeSBarry Smith                                         MatSOR_SeqDense,
2168ec8511deSBarry Smith                                         MatTranspose_SeqDense,
216997304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2170905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2171905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2172905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2173905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2174c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2175c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2176905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2177905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2178d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2179db4efbfdSBarry Smith                                         0,
2180db4efbfdSBarry Smith                                         0,
2181db4efbfdSBarry Smith                                         0,
2182db4efbfdSBarry Smith                                         0,
21834994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2184273d9f13SBarry Smith                                         0,
2185905e6a2fSBarry Smith                                         0,
218673a71a0fSBarry Smith                                         0,
218773a71a0fSBarry Smith                                         0,
2188d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2189a5ae1ecdSBarry Smith                                         0,
2190a5ae1ecdSBarry Smith                                         0,
2191a5ae1ecdSBarry Smith                                         0,
2192a5ae1ecdSBarry Smith                                         0,
2193d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2194a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2195a5ae1ecdSBarry Smith                                         0,
21964b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2197a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2198d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2199a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
22007d68702bSBarry Smith                                         MatShift_Basic,
2201a5ae1ecdSBarry Smith                                         0,
22023f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
220373a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2204a5ae1ecdSBarry Smith                                         0,
2205a5ae1ecdSBarry Smith                                         0,
2206a5ae1ecdSBarry Smith                                         0,
2207a5ae1ecdSBarry Smith                                         0,
2208d519adbfSMatthew Knepley                                 /* 54*/ 0,
2209a5ae1ecdSBarry Smith                                         0,
2210a5ae1ecdSBarry Smith                                         0,
2211a5ae1ecdSBarry Smith                                         0,
2212a5ae1ecdSBarry Smith                                         0,
2213d519adbfSMatthew Knepley                                 /* 59*/ 0,
2214e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2215e03a110bSBarry Smith                                         MatView_SeqDense,
2216357abbc8SBarry Smith                                         0,
221797304618SKris Buschelman                                         0,
2218d519adbfSMatthew Knepley                                 /* 64*/ 0,
221997304618SKris Buschelman                                         0,
222097304618SKris Buschelman                                         0,
222197304618SKris Buschelman                                         0,
222297304618SKris Buschelman                                         0,
2223d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
222497304618SKris Buschelman                                         0,
222597304618SKris Buschelman                                         0,
222697304618SKris Buschelman                                         0,
222797304618SKris Buschelman                                         0,
2228d519adbfSMatthew Knepley                                 /* 74*/ 0,
222997304618SKris Buschelman                                         0,
223097304618SKris Buschelman                                         0,
223197304618SKris Buschelman                                         0,
223297304618SKris Buschelman                                         0,
2233d519adbfSMatthew Knepley                                 /* 79*/ 0,
223497304618SKris Buschelman                                         0,
223597304618SKris Buschelman                                         0,
223697304618SKris Buschelman                                         0,
22375bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2238865e5f61SKris Buschelman                                         0,
22391cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2240865e5f61SKris Buschelman                                         0,
2241865e5f61SKris Buschelman                                         0,
2242865e5f61SKris Buschelman                                         0,
2243d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2244a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2245a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2246abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2247abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2248abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
22495df89d91SHong Zhang                                         0,
22505df89d91SHong Zhang                                         0,
22515df89d91SHong Zhang                                         0,
2252284134d9SBarry Smith                                         0,
2253d519adbfSMatthew Knepley                                 /* 99*/ 0,
2254284134d9SBarry Smith                                         0,
2255284134d9SBarry Smith                                         0,
2256ba337c44SJed Brown                                         MatConjugate_SeqDense,
2257f73d5cc4SBarry Smith                                         0,
2258ba337c44SJed Brown                                 /*104*/ 0,
2259ba337c44SJed Brown                                         MatRealPart_SeqDense,
2260ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2261985db425SBarry Smith                                         0,
2262985db425SBarry Smith                                         0,
226385e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2264985db425SBarry Smith                                         0,
22658d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2266aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22673b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2268aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2269aabbc4fbSShri Abhyankar                                         0,
2270aabbc4fbSShri Abhyankar                                         0,
2271aabbc4fbSShri Abhyankar                                         0,
2272aabbc4fbSShri Abhyankar                                         0,
2273aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2274aabbc4fbSShri Abhyankar                                         0,
2275aabbc4fbSShri Abhyankar                                         0,
22760716a85fSBarry Smith                                         0,
22770716a85fSBarry Smith                                         0,
22780716a85fSBarry Smith                                 /*124*/ 0,
22795df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22805df89d91SHong Zhang                                         0,
22815df89d91SHong Zhang                                         0,
22825df89d91SHong Zhang                                         0,
22835df89d91SHong Zhang                                 /*129*/ 0,
228475648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
228575648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
228675648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22873964eb88SJed Brown                                         0,
22883964eb88SJed Brown                                 /*134*/ 0,
22893964eb88SJed Brown                                         0,
22903964eb88SJed Brown                                         0,
22913964eb88SJed Brown                                         0,
22923964eb88SJed Brown                                         0,
22933964eb88SJed Brown                                 /*139*/ 0,
2294f9426fe0SMark Adams                                         0,
22953964eb88SJed Brown                                         0
2296985db425SBarry Smith };
229790ace30eSBarry Smith 
22984a2ae208SSatish Balay #undef __FUNCT__
22994a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
23004b828684SBarry Smith /*@C
2301fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2302d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2303d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2304289bc588SBarry Smith 
2305db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2306db81eaa0SLois Curfman McInnes 
230720563c6bSBarry Smith    Input Parameters:
2308db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
23090c775827SLois Curfman McInnes .  m - number of rows
231018f449edSLois Curfman McInnes .  n - number of columns
23110298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2312dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
231320563c6bSBarry Smith 
231420563c6bSBarry Smith    Output Parameter:
231544cd7ae7SLois Curfman McInnes .  A - the matrix
231620563c6bSBarry Smith 
2317b259b22eSLois Curfman McInnes    Notes:
231818f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
231918f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
23200298fd71SBarry Smith    set data=NULL.
232118f449edSLois Curfman McInnes 
2322027ccd11SLois Curfman McInnes    Level: intermediate
2323027ccd11SLois Curfman McInnes 
2324dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2325d65003e9SLois Curfman McInnes 
232669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
232720563c6bSBarry Smith @*/
23287087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2329289bc588SBarry Smith {
2330dfbe8321SBarry Smith   PetscErrorCode ierr;
23313b2fbd54SBarry Smith 
23323a40ed3dSBarry Smith   PetscFunctionBegin;
2333f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2334f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2335273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2336273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2337273d9f13SBarry Smith   PetscFunctionReturn(0);
2338273d9f13SBarry Smith }
2339273d9f13SBarry Smith 
23404a2ae208SSatish Balay #undef __FUNCT__
2341afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2342273d9f13SBarry Smith /*@C
2343273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2344273d9f13SBarry Smith 
2345273d9f13SBarry Smith    Collective on MPI_Comm
2346273d9f13SBarry Smith 
2347273d9f13SBarry Smith    Input Parameters:
23481c4f3114SJed Brown +  B - the matrix
23490298fd71SBarry Smith -  data - the array (or NULL)
2350273d9f13SBarry Smith 
2351273d9f13SBarry Smith    Notes:
2352273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2353273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2354284134d9SBarry Smith    need not call this routine.
2355273d9f13SBarry Smith 
2356273d9f13SBarry Smith    Level: intermediate
2357273d9f13SBarry Smith 
2358273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2359273d9f13SBarry Smith 
236069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2361867c911aSBarry Smith 
2362273d9f13SBarry Smith @*/
23637087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2364273d9f13SBarry Smith {
23654ac538c5SBarry Smith   PetscErrorCode ierr;
2366a23d5eceSKris Buschelman 
2367a23d5eceSKris Buschelman   PetscFunctionBegin;
23684ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2369a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2370a23d5eceSKris Buschelman }
2371a23d5eceSKris Buschelman 
2372a23d5eceSKris Buschelman #undef __FUNCT__
2373afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23747087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2375a23d5eceSKris Buschelman {
2376273d9f13SBarry Smith   Mat_SeqDense   *b;
2377dfbe8321SBarry Smith   PetscErrorCode ierr;
2378273d9f13SBarry Smith 
2379273d9f13SBarry Smith   PetscFunctionBegin;
2380273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2381a868139aSShri Abhyankar 
238234ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
238334ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
238434ef9618SShri Abhyankar 
2385273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
238686d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
238786d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
238886d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
238986d161a7SShri Abhyankar 
23909e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23919e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2392e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23933bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23942205254eSKarl Rupp 
23959e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2396273d9f13SBarry Smith   } else { /* user-allocated storage */
23979e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2398273d9f13SBarry Smith     b->v          = data;
2399273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2400273d9f13SBarry Smith   }
24010450473dSBarry Smith   B->assembled = PETSC_TRUE;
2402273d9f13SBarry Smith   PetscFunctionReturn(0);
2403273d9f13SBarry Smith }
2404273d9f13SBarry Smith 
240565b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24061b807ce4Svictorle #undef __FUNCT__
24078baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
2408cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
24098baccfbdSHong Zhang {
2410d77f618aSHong Zhang   Mat            mat_elemental;
2411d77f618aSHong Zhang   PetscErrorCode ierr;
2412d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2413d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2414d77f618aSHong Zhang 
24158baccfbdSHong Zhang   PetscFunctionBegin;
2416d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2417d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2418d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2419d77f618aSHong Zhang   k = 0;
2420d77f618aSHong Zhang   for (j=0; j<N; j++) {
2421d77f618aSHong Zhang     cols[j] = j;
2422d77f618aSHong Zhang     for (i=0; i<M; i++) {
2423d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2424d77f618aSHong Zhang     }
2425d77f618aSHong Zhang   }
2426d77f618aSHong Zhang   for (i=0; i<M; i++) {
2427d77f618aSHong Zhang     rows[i] = i;
2428d77f618aSHong Zhang   }
2429d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2430d77f618aSHong Zhang 
2431d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2432d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2433d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2434d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2435d77f618aSHong Zhang 
2436d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2437d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2438d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2439d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2440d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2441d77f618aSHong Zhang 
2442511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
244328be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2444d77f618aSHong Zhang   } else {
2445d77f618aSHong Zhang     *newmat = mat_elemental;
2446d77f618aSHong Zhang   }
24478baccfbdSHong Zhang   PetscFunctionReturn(0);
24488baccfbdSHong Zhang }
244965b80a83SHong Zhang #endif
24508baccfbdSHong Zhang 
24518baccfbdSHong Zhang #undef __FUNCT__
24521b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
24531b807ce4Svictorle /*@C
24541b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24551b807ce4Svictorle 
24561b807ce4Svictorle   Input parameter:
24571b807ce4Svictorle + A - the matrix
24581b807ce4Svictorle - lda - the leading dimension
24591b807ce4Svictorle 
24601b807ce4Svictorle   Notes:
2461867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24621b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24631b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24641b807ce4Svictorle 
24651b807ce4Svictorle   Level: intermediate
24661b807ce4Svictorle 
24671b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24681b807ce4Svictorle 
2469284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2470867c911aSBarry Smith 
24711b807ce4Svictorle @*/
24727087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24731b807ce4Svictorle {
24741b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
247521a2c019SBarry Smith 
24761b807ce4Svictorle   PetscFunctionBegin;
2477e32f2f54SBarry 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);
24781b807ce4Svictorle   b->lda       = lda;
247921a2c019SBarry Smith   b->changelda = PETSC_FALSE;
248021a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24811b807ce4Svictorle   PetscFunctionReturn(0);
24821b807ce4Svictorle }
24831b807ce4Svictorle 
24840bad9183SKris Buschelman /*MC
2485fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24860bad9183SKris Buschelman 
24870bad9183SKris Buschelman    Options Database Keys:
24880bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24890bad9183SKris Buschelman 
24900bad9183SKris Buschelman   Level: beginner
24910bad9183SKris Buschelman 
249289665df3SBarry Smith .seealso: MatCreateSeqDense()
249389665df3SBarry Smith 
24940bad9183SKris Buschelman M*/
24950bad9183SKris Buschelman 
24964a2ae208SSatish Balay #undef __FUNCT__
24974a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24988cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2499273d9f13SBarry Smith {
2500273d9f13SBarry Smith   Mat_SeqDense   *b;
2501dfbe8321SBarry Smith   PetscErrorCode ierr;
25027c334f02SBarry Smith   PetscMPIInt    size;
2503273d9f13SBarry Smith 
2504273d9f13SBarry Smith   PetscFunctionBegin;
2505ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2506e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
250755659b69SBarry Smith 
2508b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2509549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
251044cd7ae7SLois Curfman McInnes   B->data = (void*)b;
251118f449edSLois Curfman McInnes 
251244cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2513273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2514273d9f13SBarry Smith   b->v           = 0;
251521a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
25164e220ebcSLois Curfman McInnes 
2517bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2518bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2519bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
25208baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
25218baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
25228baccfbdSHong Zhang #endif
2523bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2524bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2525bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2526bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2527abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
25283bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
25293bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
25303bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
253117667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
25323a40ed3dSBarry Smith   PetscFunctionReturn(0);
2533289bc588SBarry Smith }
2534