xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 89ae18915aa5bb3755bc46ef2d36a12ae49d3dd6)
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;
506*89ae1891SBarry Smith   Vec               tmp = NULL;
507c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
50867e560aaSBarry Smith 
5093a40ed3dSBarry Smith   PetscFunctionBegin;
510c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
511d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
512f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
5131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
514da3a660dSBarry Smith   if (yy == zz) {
51578b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
5163bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
51778b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
518da3a660dSBarry Smith   }
519d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
520752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
521da3a660dSBarry Smith   if (mat->pivots) {
522ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
523e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
524ae7cfcebSSatish Balay #else
5258b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
526e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
527ae7cfcebSSatish Balay #endif
5283a40ed3dSBarry Smith   } else {
529ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
530e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
531ae7cfcebSSatish Balay #else
5328b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
533e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
534ae7cfcebSSatish Balay #endif
535da3a660dSBarry Smith   }
53690f02eecSBarry Smith   if (tmp) {
5372dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
5386bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
5393a40ed3dSBarry Smith   } else {
5402dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
54190f02eecSBarry Smith   }
542f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5431ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
544dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
5453a40ed3dSBarry Smith   PetscFunctionReturn(0);
546da3a660dSBarry Smith }
547db4efbfdSBarry Smith 
548db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
549db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
550db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
551db4efbfdSBarry Smith #undef __FUNCT__
552db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
553e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
554db4efbfdSBarry Smith {
555db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
556db4efbfdSBarry Smith   PetscFunctionBegin;
557e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
558db4efbfdSBarry Smith #else
559db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
560db4efbfdSBarry Smith   PetscErrorCode ierr;
561db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
562db4efbfdSBarry Smith 
563db4efbfdSBarry Smith   PetscFunctionBegin;
564c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
565c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
566db4efbfdSBarry Smith   if (!mat->pivots) {
567854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
5683bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
569db4efbfdSBarry Smith   }
570db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5718e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5728b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
5738e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
5748e57ea43SSatish Balay 
575e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
576e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
577db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
578db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
579db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
580db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
581d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
582db4efbfdSBarry Smith 
583dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
584db4efbfdSBarry Smith #endif
585db4efbfdSBarry Smith   PetscFunctionReturn(0);
586db4efbfdSBarry Smith }
587db4efbfdSBarry Smith 
588db4efbfdSBarry Smith #undef __FUNCT__
589db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
590e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
591db4efbfdSBarry Smith {
592db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
593db4efbfdSBarry Smith   PetscFunctionBegin;
594e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
595db4efbfdSBarry Smith #else
596db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
597db4efbfdSBarry Smith   PetscErrorCode ierr;
598c5df96a5SBarry Smith   PetscBLASInt   info,n;
599db4efbfdSBarry Smith 
600db4efbfdSBarry Smith   PetscFunctionBegin;
601c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
602db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
603db4efbfdSBarry Smith 
604db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6058b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
606e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
607db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
608db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
609db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
610db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
611d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6122205254eSKarl Rupp 
613eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
614db4efbfdSBarry Smith #endif
615db4efbfdSBarry Smith   PetscFunctionReturn(0);
616db4efbfdSBarry Smith }
617db4efbfdSBarry Smith 
618db4efbfdSBarry Smith 
619db4efbfdSBarry Smith #undef __FUNCT__
620db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
6210481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
622db4efbfdSBarry Smith {
623db4efbfdSBarry Smith   PetscErrorCode ierr;
624db4efbfdSBarry Smith   MatFactorInfo  info;
625db4efbfdSBarry Smith 
626db4efbfdSBarry Smith   PetscFunctionBegin;
627db4efbfdSBarry Smith   info.fill = 1.0;
6282205254eSKarl Rupp 
629c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
630719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
631db4efbfdSBarry Smith   PetscFunctionReturn(0);
632db4efbfdSBarry Smith }
633db4efbfdSBarry Smith 
634db4efbfdSBarry Smith #undef __FUNCT__
635db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
636e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
637db4efbfdSBarry Smith {
638db4efbfdSBarry Smith   PetscFunctionBegin;
639c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
6401bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
641719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
642db4efbfdSBarry Smith   PetscFunctionReturn(0);
643db4efbfdSBarry Smith }
644db4efbfdSBarry Smith 
645db4efbfdSBarry Smith #undef __FUNCT__
646db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
647e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
648db4efbfdSBarry Smith {
649db4efbfdSBarry Smith   PetscFunctionBegin;
650b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
651c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
652719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
653db4efbfdSBarry Smith   PetscFunctionReturn(0);
654db4efbfdSBarry Smith }
655db4efbfdSBarry Smith 
656db4efbfdSBarry Smith #undef __FUNCT__
657db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
658cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
659db4efbfdSBarry Smith {
660db4efbfdSBarry Smith   PetscErrorCode ierr;
661db4efbfdSBarry Smith 
662db4efbfdSBarry Smith   PetscFunctionBegin;
663ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
664db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
665db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
666db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
667db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
668db4efbfdSBarry Smith   } else {
669db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
670db4efbfdSBarry Smith   }
671d5f3da31SBarry Smith   (*fact)->factortype = ftype;
672db4efbfdSBarry Smith   PetscFunctionReturn(0);
673db4efbfdSBarry Smith }
674db4efbfdSBarry Smith 
675289bc588SBarry Smith /* ------------------------------------------------------------------*/
6764a2ae208SSatish Balay #undef __FUNCT__
67741f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
678e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
679289bc588SBarry Smith {
680c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
681d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
682d9ca1df4SBarry Smith   const PetscScalar *b;
683dfbe8321SBarry Smith   PetscErrorCode    ierr;
684d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
685c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
686289bc588SBarry Smith 
6873a40ed3dSBarry Smith   PetscFunctionBegin;
688422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
689c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
690289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
69171044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6922dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
693289bc588SBarry Smith   }
6941ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
695d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
696b965ef7fSBarry Smith   its  = its*lits;
697e32f2f54SBarry 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);
698289bc588SBarry Smith   while (its--) {
699fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
700289bc588SBarry Smith       for (i=0; i<m; i++) {
7018b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
70255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
703289bc588SBarry Smith       }
704289bc588SBarry Smith     }
705fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
706289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7078b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
70855a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
709289bc588SBarry Smith       }
710289bc588SBarry Smith     }
711289bc588SBarry Smith   }
712d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
7131ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7143a40ed3dSBarry Smith   PetscFunctionReturn(0);
715289bc588SBarry Smith }
716289bc588SBarry Smith 
717289bc588SBarry Smith /* -----------------------------------------------------------------*/
7184a2ae208SSatish Balay #undef __FUNCT__
7194a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
720cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
721289bc588SBarry Smith {
722c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
723d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
724d9ca1df4SBarry Smith   PetscScalar       *y;
725dfbe8321SBarry Smith   PetscErrorCode    ierr;
7260805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
727ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
7283a40ed3dSBarry Smith 
7293a40ed3dSBarry Smith   PetscFunctionBegin;
730c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
731c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
732d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
733d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7341ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7358b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
736d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7371ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
738dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
7393a40ed3dSBarry Smith   PetscFunctionReturn(0);
740289bc588SBarry Smith }
741800995b7SMatthew Knepley 
7424a2ae208SSatish Balay #undef __FUNCT__
7434a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
744cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
745289bc588SBarry Smith {
746c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
747d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
748dfbe8321SBarry Smith   PetscErrorCode    ierr;
7490805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
750d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7513a40ed3dSBarry Smith 
7523a40ed3dSBarry Smith   PetscFunctionBegin;
753c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
754c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
755d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
756d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7571ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7588b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
759d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7601ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
761dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7623a40ed3dSBarry Smith   PetscFunctionReturn(0);
763289bc588SBarry Smith }
7646ee01492SSatish Balay 
7654a2ae208SSatish Balay #undef __FUNCT__
7664a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
767cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
768289bc588SBarry Smith {
769c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
770d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
771d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
772dfbe8321SBarry Smith   PetscErrorCode    ierr;
7730805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7743a40ed3dSBarry Smith 
7753a40ed3dSBarry Smith   PetscFunctionBegin;
776c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
777c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
778d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
779600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
780d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7811ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7828b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
783d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7841ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
785dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7863a40ed3dSBarry Smith   PetscFunctionReturn(0);
787289bc588SBarry Smith }
7886ee01492SSatish Balay 
7894a2ae208SSatish Balay #undef __FUNCT__
7904a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
791e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
792289bc588SBarry Smith {
793c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
794d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
795d9ca1df4SBarry Smith   PetscScalar       *y;
796dfbe8321SBarry Smith   PetscErrorCode    ierr;
7970805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
79887828ca2SBarry Smith   PetscScalar       _DOne=1.0;
7993a40ed3dSBarry Smith 
8003a40ed3dSBarry Smith   PetscFunctionBegin;
801c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
802c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
803d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
804600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
805d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8061ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8078b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
808d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8091ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
810dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8113a40ed3dSBarry Smith   PetscFunctionReturn(0);
812289bc588SBarry Smith }
813289bc588SBarry Smith 
814289bc588SBarry Smith /* -----------------------------------------------------------------*/
8154a2ae208SSatish Balay #undef __FUNCT__
8164a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
817e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
818289bc588SBarry Smith {
819c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
82087828ca2SBarry Smith   PetscScalar    *v;
8216849ba73SBarry Smith   PetscErrorCode ierr;
82213f74950SBarry Smith   PetscInt       i;
82367e560aaSBarry Smith 
8243a40ed3dSBarry Smith   PetscFunctionBegin;
825d0f46423SBarry Smith   *ncols = A->cmap->n;
826289bc588SBarry Smith   if (cols) {
827854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
828d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
829289bc588SBarry Smith   }
830289bc588SBarry Smith   if (vals) {
831854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
832289bc588SBarry Smith     v    = mat->v + row;
833d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
834289bc588SBarry Smith   }
8353a40ed3dSBarry Smith   PetscFunctionReturn(0);
836289bc588SBarry Smith }
8376ee01492SSatish Balay 
8384a2ae208SSatish Balay #undef __FUNCT__
8394a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
840e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
841289bc588SBarry Smith {
842dfbe8321SBarry Smith   PetscErrorCode ierr;
8436e111a19SKarl Rupp 
844606d414cSSatish Balay   PetscFunctionBegin;
845606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
846606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8473a40ed3dSBarry Smith   PetscFunctionReturn(0);
848289bc588SBarry Smith }
849289bc588SBarry Smith /* ----------------------------------------------------------------*/
8504a2ae208SSatish Balay #undef __FUNCT__
8514a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
852e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
853289bc588SBarry Smith {
854c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
85513f74950SBarry Smith   PetscInt     i,j,idx=0;
856d6dfbf8fSBarry Smith 
8573a40ed3dSBarry Smith   PetscFunctionBegin;
858289bc588SBarry Smith   if (!mat->roworiented) {
859dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
860289bc588SBarry Smith       for (j=0; j<n; j++) {
861cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8622515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
863e32f2f54SBarry 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);
86458804f6dSBarry Smith #endif
865289bc588SBarry Smith         for (i=0; i<m; i++) {
866cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8672515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
868e32f2f54SBarry 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);
86958804f6dSBarry Smith #endif
870cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
871289bc588SBarry Smith         }
872289bc588SBarry Smith       }
8733a40ed3dSBarry Smith     } else {
874289bc588SBarry Smith       for (j=0; j<n; j++) {
875cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8762515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
877e32f2f54SBarry 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);
87858804f6dSBarry Smith #endif
879289bc588SBarry Smith         for (i=0; i<m; i++) {
880cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8812515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
882e32f2f54SBarry 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);
88358804f6dSBarry Smith #endif
884cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
885289bc588SBarry Smith         }
886289bc588SBarry Smith       }
887289bc588SBarry Smith     }
8883a40ed3dSBarry Smith   } else {
889dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
890e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
891cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8922515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
893e32f2f54SBarry 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);
89458804f6dSBarry Smith #endif
895e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
896cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8972515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
898e32f2f54SBarry 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);
89958804f6dSBarry Smith #endif
900cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
901e8d4e0b9SBarry Smith         }
902e8d4e0b9SBarry Smith       }
9033a40ed3dSBarry Smith     } else {
904289bc588SBarry Smith       for (i=0; i<m; i++) {
905cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9062515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
907e32f2f54SBarry 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);
90858804f6dSBarry Smith #endif
909289bc588SBarry Smith         for (j=0; j<n; j++) {
910cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9112515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
912e32f2f54SBarry 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);
91358804f6dSBarry Smith #endif
914cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
915289bc588SBarry Smith         }
916289bc588SBarry Smith       }
917289bc588SBarry Smith     }
918e8d4e0b9SBarry Smith   }
9193a40ed3dSBarry Smith   PetscFunctionReturn(0);
920289bc588SBarry Smith }
921e8d4e0b9SBarry Smith 
9224a2ae208SSatish Balay #undef __FUNCT__
9234a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
924e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
925ae80bb75SLois Curfman McInnes {
926ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
92713f74950SBarry Smith   PetscInt     i,j;
928ae80bb75SLois Curfman McInnes 
9293a40ed3dSBarry Smith   PetscFunctionBegin;
930ae80bb75SLois Curfman McInnes   /* row-oriented output */
931ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
93297e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
933e32f2f54SBarry 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);
934ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
9356f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
936e32f2f54SBarry 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);
93797e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
938ae80bb75SLois Curfman McInnes     }
939ae80bb75SLois Curfman McInnes   }
9403a40ed3dSBarry Smith   PetscFunctionReturn(0);
941ae80bb75SLois Curfman McInnes }
942ae80bb75SLois Curfman McInnes 
943289bc588SBarry Smith /* -----------------------------------------------------------------*/
944289bc588SBarry Smith 
9454a2ae208SSatish Balay #undef __FUNCT__
9465bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
947e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
948aabbc4fbSShri Abhyankar {
949aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
950aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
951aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
952aabbc4fbSShri Abhyankar   int            fd;
953aabbc4fbSShri Abhyankar   PetscMPIInt    size;
954aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
955aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
956ce94432eSBarry Smith   MPI_Comm       comm;
957aabbc4fbSShri Abhyankar 
958aabbc4fbSShri Abhyankar   PetscFunctionBegin;
959c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
960c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
961ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
962aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
963aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
964aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
965aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
966aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
967aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
968aabbc4fbSShri Abhyankar 
969aabbc4fbSShri Abhyankar   /* set global size if not set already*/
970aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
971aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
972aabbc4fbSShri Abhyankar   } else {
973aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
974aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
975aabbc4fbSShri 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);
976aabbc4fbSShri Abhyankar   }
977e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
978e6324fbbSBarry Smith   if (!a->user_alloc) {
9790298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
980e6324fbbSBarry Smith   }
981aabbc4fbSShri Abhyankar 
982aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
983aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
984aabbc4fbSShri Abhyankar     v = a->v;
985aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
986aabbc4fbSShri Abhyankar        from row major to column major */
987854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
988aabbc4fbSShri Abhyankar     /* read in nonzero values */
989aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
990aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
991aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
992aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
993aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
994aabbc4fbSShri Abhyankar       }
995aabbc4fbSShri Abhyankar     }
996aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
997aabbc4fbSShri Abhyankar   } else {
998aabbc4fbSShri Abhyankar     /* read row lengths */
999854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
1000aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
1001aabbc4fbSShri Abhyankar 
1002aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
1003aabbc4fbSShri Abhyankar     v = a->v;
1004aabbc4fbSShri Abhyankar 
1005aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
1006854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
1007aabbc4fbSShri Abhyankar     cols = scols;
1008aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
1009854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
1010aabbc4fbSShri Abhyankar     vals = svals;
1011aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
1012aabbc4fbSShri Abhyankar 
1013aabbc4fbSShri Abhyankar     /* insert into matrix */
1014aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
1015aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
1016aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
1017aabbc4fbSShri Abhyankar     }
1018aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1019aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
1020aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
1021aabbc4fbSShri Abhyankar   }
1022aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1023aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1024aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1025aabbc4fbSShri Abhyankar }
1026aabbc4fbSShri Abhyankar 
1027aabbc4fbSShri Abhyankar #undef __FUNCT__
10284a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
10296849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1030289bc588SBarry Smith {
1031932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1032dfbe8321SBarry Smith   PetscErrorCode    ierr;
103313f74950SBarry Smith   PetscInt          i,j;
10342dcb1b2aSMatthew Knepley   const char        *name;
103587828ca2SBarry Smith   PetscScalar       *v;
1036f3ef73ceSBarry Smith   PetscViewerFormat format;
10375f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1038ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
10395f481a85SSatish Balay #endif
1040932b0c3eSLois Curfman McInnes 
10413a40ed3dSBarry Smith   PetscFunctionBegin;
1042b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1043456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
10443a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1045fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1046d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1047d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
104844cd7ae7SLois Curfman McInnes       v    = a->v + i;
104977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1050d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1051aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1052329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
105357622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1054329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
105557622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10566831982aSBarry Smith         }
105780cd9d93SLois Curfman McInnes #else
10586831982aSBarry Smith         if (*v) {
105957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10606831982aSBarry Smith         }
106180cd9d93SLois Curfman McInnes #endif
10621b807ce4Svictorle         v += a->lda;
106380cd9d93SLois Curfman McInnes       }
1064b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
106580cd9d93SLois Curfman McInnes     }
1066d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10673a40ed3dSBarry Smith   } else {
1068d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1069aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
107047989497SBarry Smith     /* determine if matrix has all real values */
107147989497SBarry Smith     v = a->v;
1072d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1073ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
107447989497SBarry Smith     }
107547989497SBarry Smith #endif
1076fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10773a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1078d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1079d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1080fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1081ffac6cdbSBarry Smith     }
1082ffac6cdbSBarry Smith 
1083d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1084932b0c3eSLois Curfman McInnes       v = a->v + i;
1085d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1086aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
108747989497SBarry Smith         if (allreal) {
1088c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
108947989497SBarry Smith         } else {
1090c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
109147989497SBarry Smith         }
1092289bc588SBarry Smith #else
1093c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1094289bc588SBarry Smith #endif
10951b807ce4Svictorle         v += a->lda;
1096289bc588SBarry Smith       }
1097b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1098289bc588SBarry Smith     }
1099fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1100b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1101ffac6cdbSBarry Smith     }
1102d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1103da3a660dSBarry Smith   }
1104b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
11053a40ed3dSBarry Smith   PetscFunctionReturn(0);
1106289bc588SBarry Smith }
1107289bc588SBarry Smith 
11084a2ae208SSatish Balay #undef __FUNCT__
11094a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
11106849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1111932b0c3eSLois Curfman McInnes {
1112932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11136849ba73SBarry Smith   PetscErrorCode    ierr;
111413f74950SBarry Smith   int               fd;
1115d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1116f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1117f4403165SShri Abhyankar   PetscViewerFormat format;
1118932b0c3eSLois Curfman McInnes 
11193a40ed3dSBarry Smith   PetscFunctionBegin;
1120b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
112190ace30eSBarry Smith 
1122f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1123f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1124f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1125785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
11262205254eSKarl Rupp 
1127f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1128f4403165SShri Abhyankar     col_lens[1] = m;
1129f4403165SShri Abhyankar     col_lens[2] = n;
1130f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
11312205254eSKarl Rupp 
1132f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1133f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1134f4403165SShri Abhyankar 
1135f4403165SShri Abhyankar     /* write out matrix, by rows */
1136854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1137f4403165SShri Abhyankar     v    = a->v;
1138f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1139f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1140f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1141f4403165SShri Abhyankar       }
1142f4403165SShri Abhyankar     }
1143f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1144f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1145f4403165SShri Abhyankar   } else {
1146854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11472205254eSKarl Rupp 
11480700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1149932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1150932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1151932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1152932b0c3eSLois Curfman McInnes 
1153932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1154932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11556f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1156932b0c3eSLois Curfman McInnes 
1157932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1158932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1159932b0c3eSLois Curfman McInnes     ict = 0;
1160932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1161932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1162932b0c3eSLois Curfman McInnes     }
11636f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1164606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1165932b0c3eSLois Curfman McInnes 
1166932b0c3eSLois Curfman McInnes     /* store nonzero values */
1167854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1168932b0c3eSLois Curfman McInnes     ict  = 0;
1169932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1170932b0c3eSLois Curfman McInnes       v = a->v + i;
1171932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11721b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1173932b0c3eSLois Curfman McInnes       }
1174932b0c3eSLois Curfman McInnes     }
11756f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1176606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1177f4403165SShri Abhyankar   }
11783a40ed3dSBarry Smith   PetscFunctionReturn(0);
1179932b0c3eSLois Curfman McInnes }
1180932b0c3eSLois Curfman McInnes 
11819804daf3SBarry Smith #include <petscdraw.h>
11824a2ae208SSatish Balay #undef __FUNCT__
11834a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1184e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1185f1af5d2fSBarry Smith {
1186f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1187f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11886849ba73SBarry Smith   PetscErrorCode    ierr;
1189383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1190383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
119187828ca2SBarry Smith   PetscScalar       *v = a->v;
1192b0a32e0cSBarry Smith   PetscViewer       viewer;
1193b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1194f3ef73ceSBarry Smith   PetscViewerFormat format;
1195f1af5d2fSBarry Smith 
1196f1af5d2fSBarry Smith   PetscFunctionBegin;
1197f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1198b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1199b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1200f1af5d2fSBarry Smith 
1201f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1202383922c3SLisandro Dalcin 
1203fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1204383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1205f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1206f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1207383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1208f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1209f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1210f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1211329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1212b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1213329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1214b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1215f1af5d2fSBarry Smith         } else {
1216f1af5d2fSBarry Smith           continue;
1217f1af5d2fSBarry Smith         }
1218b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1219f1af5d2fSBarry Smith       }
1220f1af5d2fSBarry Smith     }
1221383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1222f1af5d2fSBarry Smith   } else {
1223f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1224f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1225b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1226b05fc000SLisandro Dalcin     PetscDraw popup;
1227b05fc000SLisandro Dalcin 
1228f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1229f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1230f1af5d2fSBarry Smith     }
1231383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1232b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
123345f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1234383922c3SLisandro Dalcin 
1235383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1236f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1237f1af5d2fSBarry Smith       x_l = j;
1238f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1239f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1240f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1241f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1242b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1243b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1244f1af5d2fSBarry Smith       }
1245f1af5d2fSBarry Smith     }
1246383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1247f1af5d2fSBarry Smith   }
1248f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1249f1af5d2fSBarry Smith }
1250f1af5d2fSBarry Smith 
12514a2ae208SSatish Balay #undef __FUNCT__
12524a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1253e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1254f1af5d2fSBarry Smith {
1255b0a32e0cSBarry Smith   PetscDraw      draw;
1256ace3abfcSBarry Smith   PetscBool      isnull;
1257329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1258dfbe8321SBarry Smith   PetscErrorCode ierr;
1259f1af5d2fSBarry Smith 
1260f1af5d2fSBarry Smith   PetscFunctionBegin;
1261b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1262b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1263abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1264f1af5d2fSBarry Smith 
1265d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1266f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1267b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1268832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1269b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12700298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1271832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1272f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1273f1af5d2fSBarry Smith }
1274f1af5d2fSBarry Smith 
12754a2ae208SSatish Balay #undef __FUNCT__
12764a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1277dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1278932b0c3eSLois Curfman McInnes {
1279dfbe8321SBarry Smith   PetscErrorCode ierr;
1280ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1281932b0c3eSLois Curfman McInnes 
12823a40ed3dSBarry Smith   PetscFunctionBegin;
1283251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1284251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1285251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12860f5bd95cSBarry Smith 
1287c45a1595SBarry Smith   if (iascii) {
1288c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12890f5bd95cSBarry Smith   } else if (isbinary) {
12903a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1291f1af5d2fSBarry Smith   } else if (isdraw) {
1292f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1293932b0c3eSLois Curfman McInnes   }
12943a40ed3dSBarry Smith   PetscFunctionReturn(0);
1295932b0c3eSLois Curfman McInnes }
1296289bc588SBarry Smith 
12974a2ae208SSatish Balay #undef __FUNCT__
12984a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1299e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat)
1300289bc588SBarry Smith {
1301ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1302dfbe8321SBarry Smith   PetscErrorCode ierr;
130390f02eecSBarry Smith 
13043a40ed3dSBarry Smith   PetscFunctionBegin;
1305aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1306d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1307a5a9c739SBarry Smith #endif
130805b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1309abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
13106857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1311bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1312dbd8c25aSHong Zhang 
1313dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1314bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1315bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
13168baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
13178baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
13188baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
13198baccfbdSHong Zhang #endif
1320bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1321bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1322bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1323bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1324abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13253bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13263bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13273bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13283a40ed3dSBarry Smith   PetscFunctionReturn(0);
1329289bc588SBarry Smith }
1330289bc588SBarry Smith 
13314a2ae208SSatish Balay #undef __FUNCT__
13324a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1333e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1334289bc588SBarry Smith {
1335c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
13366849ba73SBarry Smith   PetscErrorCode ierr;
133713f74950SBarry Smith   PetscInt       k,j,m,n,M;
133887828ca2SBarry Smith   PetscScalar    *v,tmp;
133948b35521SBarry Smith 
13403a40ed3dSBarry Smith   PetscFunctionBegin;
1341d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1342e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1343e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1344e7e72b3dSBarry Smith     else {
1345d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1346289bc588SBarry Smith         for (k=0; k<j; k++) {
13471b807ce4Svictorle           tmp        = v[j + k*M];
13481b807ce4Svictorle           v[j + k*M] = v[k + j*M];
13491b807ce4Svictorle           v[k + j*M] = tmp;
1350289bc588SBarry Smith         }
1351289bc588SBarry Smith       }
1352d64ed03dSBarry Smith     }
13533a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1354d3e5ee88SLois Curfman McInnes     Mat          tmat;
1355ec8511deSBarry Smith     Mat_SeqDense *tmatd;
135687828ca2SBarry Smith     PetscScalar  *v2;
1357af36a384SStefano Zampini     PetscInt     M2;
1358ea709b57SSatish Balay 
1359fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1360ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1361d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13627adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13630298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1364fc4dec0aSBarry Smith     } else {
1365fc4dec0aSBarry Smith       tmat = *matout;
1366fc4dec0aSBarry Smith     }
1367ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1368af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1369d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1370af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1371d3e5ee88SLois Curfman McInnes     }
13726d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13736d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1374d3e5ee88SLois Curfman McInnes     *matout = tmat;
137548b35521SBarry Smith   }
13763a40ed3dSBarry Smith   PetscFunctionReturn(0);
1377289bc588SBarry Smith }
1378289bc588SBarry Smith 
13794a2ae208SSatish Balay #undef __FUNCT__
13804a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1381e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1382289bc588SBarry Smith {
1383c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1384c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
138513f74950SBarry Smith   PetscInt     i,j;
1386a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13879ea5d5aeSSatish Balay 
13883a40ed3dSBarry Smith   PetscFunctionBegin;
1389d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1390d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1391d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
13921b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1393d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
13943a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
13951b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
13961b807ce4Svictorle     }
1397289bc588SBarry Smith   }
139877c4ece6SBarry Smith   *flg = PETSC_TRUE;
13993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1400289bc588SBarry Smith }
1401289bc588SBarry Smith 
14024a2ae208SSatish Balay #undef __FUNCT__
14034a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1404e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1405289bc588SBarry Smith {
1406c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1407dfbe8321SBarry Smith   PetscErrorCode ierr;
140813f74950SBarry Smith   PetscInt       i,n,len;
140987828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
141044cd7ae7SLois Curfman McInnes 
14113a40ed3dSBarry Smith   PetscFunctionBegin;
14122dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
14137a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
14141ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1415d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1416e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
141744cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
14181b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1419289bc588SBarry Smith   }
14201ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
14213a40ed3dSBarry Smith   PetscFunctionReturn(0);
1422289bc588SBarry Smith }
1423289bc588SBarry Smith 
14244a2ae208SSatish Balay #undef __FUNCT__
14254a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1426e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1427289bc588SBarry Smith {
1428c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1429f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1430f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1431dfbe8321SBarry Smith   PetscErrorCode    ierr;
1432d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
143355659b69SBarry Smith 
14343a40ed3dSBarry Smith   PetscFunctionBegin;
143528988994SBarry Smith   if (ll) {
14367a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1437f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1438e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1439da3a660dSBarry Smith     for (i=0; i<m; i++) {
1440da3a660dSBarry Smith       x = l[i];
1441da3a660dSBarry Smith       v = mat->v + i;
1442b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1443da3a660dSBarry Smith     }
1444f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1445eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1446da3a660dSBarry Smith   }
144728988994SBarry Smith   if (rr) {
14487a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1449f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1450e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1451da3a660dSBarry Smith     for (i=0; i<n; i++) {
1452da3a660dSBarry Smith       x = r[i];
1453b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14542205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1455da3a660dSBarry Smith     }
1456f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1457eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1458da3a660dSBarry Smith   }
14593a40ed3dSBarry Smith   PetscFunctionReturn(0);
1460289bc588SBarry Smith }
1461289bc588SBarry Smith 
14624a2ae208SSatish Balay #undef __FUNCT__
14634a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1464e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1465289bc588SBarry Smith {
1466c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
146787828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1468329f5518SBarry Smith   PetscReal      sum  = 0.0;
1469d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1470efee365bSSatish Balay   PetscErrorCode ierr;
147155659b69SBarry Smith 
14723a40ed3dSBarry Smith   PetscFunctionBegin;
1473289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1474a5ce6ee0Svictorle     if (lda>m) {
1475d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1476a5ce6ee0Svictorle         v = mat->v+j*lda;
1477a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1478a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1479a5ce6ee0Svictorle         }
1480a5ce6ee0Svictorle       }
1481a5ce6ee0Svictorle     } else {
1482d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1483329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1484289bc588SBarry Smith       }
1485a5ce6ee0Svictorle     }
14868f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1487dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14883a40ed3dSBarry Smith   } else if (type == NORM_1) {
1489064f8208SBarry Smith     *nrm = 0.0;
1490d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
14911b807ce4Svictorle       v   = mat->v + j*mat->lda;
1492289bc588SBarry Smith       sum = 0.0;
1493d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
149433a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1495289bc588SBarry Smith       }
1496064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1497289bc588SBarry Smith     }
1498eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14993a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1500064f8208SBarry Smith     *nrm = 0.0;
1501d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1502289bc588SBarry Smith       v   = mat->v + j;
1503289bc588SBarry Smith       sum = 0.0;
1504d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
15051b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1506289bc588SBarry Smith       }
1507064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1508289bc588SBarry Smith     }
1509eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1510e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
15113a40ed3dSBarry Smith   PetscFunctionReturn(0);
1512289bc588SBarry Smith }
1513289bc588SBarry Smith 
15144a2ae208SSatish Balay #undef __FUNCT__
15154a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1516e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1517289bc588SBarry Smith {
1518c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
151963ba0a88SBarry Smith   PetscErrorCode ierr;
152067e560aaSBarry Smith 
15213a40ed3dSBarry Smith   PetscFunctionBegin;
1522b5a2b587SKris Buschelman   switch (op) {
1523b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
15244e0d8c25SBarry Smith     aij->roworiented = flg;
1525b5a2b587SKris Buschelman     break;
1526512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1527b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
15283971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
15294e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
153013fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1531b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1532b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
15335021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
15345021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
15355021d80fSJed Brown     break;
15365021d80fSJed Brown   case MAT_SPD:
153777e54ba9SKris Buschelman   case MAT_SYMMETRIC:
153877e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
15399a4540c5SBarry Smith   case MAT_HERMITIAN:
15409a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
15415021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
154277e54ba9SKris Buschelman     break;
1543b5a2b587SKris Buschelman   default:
1544e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
15453a40ed3dSBarry Smith   }
15463a40ed3dSBarry Smith   PetscFunctionReturn(0);
1547289bc588SBarry Smith }
1548289bc588SBarry Smith 
15494a2ae208SSatish Balay #undef __FUNCT__
15504a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1551e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15526f0a148fSBarry Smith {
1553ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15546849ba73SBarry Smith   PetscErrorCode ierr;
1555d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15563a40ed3dSBarry Smith 
15573a40ed3dSBarry Smith   PetscFunctionBegin;
1558a5ce6ee0Svictorle   if (lda>m) {
1559d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1560a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1561a5ce6ee0Svictorle     }
1562a5ce6ee0Svictorle   } else {
1563d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1564a5ce6ee0Svictorle   }
15653a40ed3dSBarry Smith   PetscFunctionReturn(0);
15666f0a148fSBarry Smith }
15676f0a148fSBarry Smith 
15684a2ae208SSatish Balay #undef __FUNCT__
15694a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1570e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15716f0a148fSBarry Smith {
157297b48c8fSBarry Smith   PetscErrorCode    ierr;
1573ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1574b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
157597b48c8fSBarry Smith   PetscScalar       *slot,*bb;
157697b48c8fSBarry Smith   const PetscScalar *xx;
157755659b69SBarry Smith 
15783a40ed3dSBarry Smith   PetscFunctionBegin;
1579b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1580b9679d65SBarry Smith   for (i=0; i<N; i++) {
1581b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1582b9679d65SBarry 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);
1583b9679d65SBarry Smith   }
1584b9679d65SBarry Smith #endif
1585b9679d65SBarry Smith 
158697b48c8fSBarry Smith   /* fix right hand side if needed */
158797b48c8fSBarry Smith   if (x && b) {
158897b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
158997b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15902205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
159197b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
159297b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
159397b48c8fSBarry Smith   }
159497b48c8fSBarry Smith 
15956f0a148fSBarry Smith   for (i=0; i<N; i++) {
15966f0a148fSBarry Smith     slot = l->v + rows[i];
1597b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
15986f0a148fSBarry Smith   }
1599f4df32b1SMatthew Knepley   if (diag != 0.0) {
1600b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
16016f0a148fSBarry Smith     for (i=0; i<N; i++) {
1602b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1603f4df32b1SMatthew Knepley       *slot = diag;
16046f0a148fSBarry Smith     }
16056f0a148fSBarry Smith   }
16063a40ed3dSBarry Smith   PetscFunctionReturn(0);
16076f0a148fSBarry Smith }
1608557bce09SLois Curfman McInnes 
16094a2ae208SSatish Balay #undef __FUNCT__
16108c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1611e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
161264e87e97SBarry Smith {
1613c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
16143a40ed3dSBarry Smith 
16153a40ed3dSBarry Smith   PetscFunctionBegin;
1616e32f2f54SBarry 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");
161764e87e97SBarry Smith   *array = mat->v;
16183a40ed3dSBarry Smith   PetscFunctionReturn(0);
161964e87e97SBarry Smith }
16200754003eSLois Curfman McInnes 
16214a2ae208SSatish Balay #undef __FUNCT__
16228c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1623e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1624ff14e315SSatish Balay {
16253a40ed3dSBarry Smith   PetscFunctionBegin;
162609b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
16273a40ed3dSBarry Smith   PetscFunctionReturn(0);
1628ff14e315SSatish Balay }
16290754003eSLois Curfman McInnes 
16304a2ae208SSatish Balay #undef __FUNCT__
16318c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1632dec5eb66SMatthew G Knepley /*@C
16338c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
163473a71a0fSBarry Smith 
163573a71a0fSBarry Smith    Not Collective
163673a71a0fSBarry Smith 
163773a71a0fSBarry Smith    Input Parameter:
1638579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
163973a71a0fSBarry Smith 
164073a71a0fSBarry Smith    Output Parameter:
164173a71a0fSBarry Smith .   array - pointer to the data
164273a71a0fSBarry Smith 
164373a71a0fSBarry Smith    Level: intermediate
164473a71a0fSBarry Smith 
16458c778c55SBarry Smith .seealso: MatDenseRestoreArray()
164673a71a0fSBarry Smith @*/
16478c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
164873a71a0fSBarry Smith {
164973a71a0fSBarry Smith   PetscErrorCode ierr;
165073a71a0fSBarry Smith 
165173a71a0fSBarry Smith   PetscFunctionBegin;
16528c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
165373a71a0fSBarry Smith   PetscFunctionReturn(0);
165473a71a0fSBarry Smith }
165573a71a0fSBarry Smith 
165673a71a0fSBarry Smith #undef __FUNCT__
16578c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1658dec5eb66SMatthew G Knepley /*@C
1659579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
166073a71a0fSBarry Smith 
166173a71a0fSBarry Smith    Not Collective
166273a71a0fSBarry Smith 
166373a71a0fSBarry Smith    Input Parameters:
1664579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
166573a71a0fSBarry Smith .  array - pointer to the data
166673a71a0fSBarry Smith 
166773a71a0fSBarry Smith    Level: intermediate
166873a71a0fSBarry Smith 
16698c778c55SBarry Smith .seealso: MatDenseGetArray()
167073a71a0fSBarry Smith @*/
16718c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
167273a71a0fSBarry Smith {
167373a71a0fSBarry Smith   PetscErrorCode ierr;
167473a71a0fSBarry Smith 
167573a71a0fSBarry Smith   PetscFunctionBegin;
16768c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
167773a71a0fSBarry Smith   PetscFunctionReturn(0);
167873a71a0fSBarry Smith }
167973a71a0fSBarry Smith 
168073a71a0fSBarry Smith #undef __FUNCT__
16814a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
168213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16830754003eSLois Curfman McInnes {
1684c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16856849ba73SBarry Smith   PetscErrorCode ierr;
16865d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16875d0c19d7SBarry Smith   const PetscInt *irow,*icol;
168887828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16890754003eSLois Curfman McInnes   Mat            newmat;
16900754003eSLois Curfman McInnes 
16913a40ed3dSBarry Smith   PetscFunctionBegin;
169278b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
169378b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1694e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1695e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
16960754003eSLois Curfman McInnes 
1697182d2002SSatish Balay   /* Check submatrixcall */
1698182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
169913f74950SBarry Smith     PetscInt n_cols,n_rows;
1700182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
170121a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1702f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1703c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
170421a2c019SBarry Smith     }
1705182d2002SSatish Balay     newmat = *B;
1706182d2002SSatish Balay   } else {
17070754003eSLois Curfman McInnes     /* Create and fill new matrix */
1708ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1709f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
17107adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
17110298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1712182d2002SSatish Balay   }
1713182d2002SSatish Balay 
1714182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1715182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1716182d2002SSatish Balay 
1717182d2002SSatish Balay   for (i=0; i<ncols; i++) {
17186de62eeeSBarry Smith     av = v + mat->lda*icol[i];
17192205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
17200754003eSLois Curfman McInnes   }
1721182d2002SSatish Balay 
1722182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
17236d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17246d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17250754003eSLois Curfman McInnes 
17260754003eSLois Curfman McInnes   /* Free work space */
172778b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
172878b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1729182d2002SSatish Balay   *B   = newmat;
17303a40ed3dSBarry Smith   PetscFunctionReturn(0);
17310754003eSLois Curfman McInnes }
17320754003eSLois Curfman McInnes 
17334a2ae208SSatish Balay #undef __FUNCT__
17344a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1735e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1736905e6a2fSBarry Smith {
17376849ba73SBarry Smith   PetscErrorCode ierr;
173813f74950SBarry Smith   PetscInt       i;
1739905e6a2fSBarry Smith 
17403a40ed3dSBarry Smith   PetscFunctionBegin;
1741905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1742854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1743905e6a2fSBarry Smith   }
1744905e6a2fSBarry Smith 
1745905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17466a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1747905e6a2fSBarry Smith   }
17483a40ed3dSBarry Smith   PetscFunctionReturn(0);
1749905e6a2fSBarry Smith }
1750905e6a2fSBarry Smith 
17514a2ae208SSatish Balay #undef __FUNCT__
1752c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1753e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1754c0aa2d19SHong Zhang {
1755c0aa2d19SHong Zhang   PetscFunctionBegin;
1756c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1757c0aa2d19SHong Zhang }
1758c0aa2d19SHong Zhang 
1759c0aa2d19SHong Zhang #undef __FUNCT__
1760c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1761e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1762c0aa2d19SHong Zhang {
1763c0aa2d19SHong Zhang   PetscFunctionBegin;
1764c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1765c0aa2d19SHong Zhang }
1766c0aa2d19SHong Zhang 
1767c0aa2d19SHong Zhang #undef __FUNCT__
17684a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1769e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17704b0e389bSBarry Smith {
17714b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17726849ba73SBarry Smith   PetscErrorCode ierr;
1773d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17743a40ed3dSBarry Smith 
17753a40ed3dSBarry Smith   PetscFunctionBegin;
177633f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
177733f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1778cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17793a40ed3dSBarry Smith     PetscFunctionReturn(0);
17803a40ed3dSBarry Smith   }
1781e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1782a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17830dbb7854Svictorle     for (j=0; j<n; j++) {
1784a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1785a5ce6ee0Svictorle     }
1786a5ce6ee0Svictorle   } else {
1787d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1788a5ce6ee0Svictorle   }
1789273d9f13SBarry Smith   PetscFunctionReturn(0);
1790273d9f13SBarry Smith }
1791273d9f13SBarry Smith 
17924a2ae208SSatish Balay #undef __FUNCT__
17934994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1794e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1795273d9f13SBarry Smith {
1796dfbe8321SBarry Smith   PetscErrorCode ierr;
1797273d9f13SBarry Smith 
1798273d9f13SBarry Smith   PetscFunctionBegin;
1799273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
18003a40ed3dSBarry Smith   PetscFunctionReturn(0);
18014b0e389bSBarry Smith }
18024b0e389bSBarry Smith 
1803284134d9SBarry Smith #undef __FUNCT__
1804ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1805ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1806ba337c44SJed Brown {
1807ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1808ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1809ba337c44SJed Brown   PetscScalar  *aa = a->v;
1810ba337c44SJed Brown 
1811ba337c44SJed Brown   PetscFunctionBegin;
1812ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1813ba337c44SJed Brown   PetscFunctionReturn(0);
1814ba337c44SJed Brown }
1815ba337c44SJed Brown 
1816ba337c44SJed Brown #undef __FUNCT__
1817ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1818ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1819ba337c44SJed Brown {
1820ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1821ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1822ba337c44SJed Brown   PetscScalar  *aa = a->v;
1823ba337c44SJed Brown 
1824ba337c44SJed Brown   PetscFunctionBegin;
1825ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1826ba337c44SJed Brown   PetscFunctionReturn(0);
1827ba337c44SJed Brown }
1828ba337c44SJed Brown 
1829ba337c44SJed Brown #undef __FUNCT__
1830ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1831ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1832ba337c44SJed Brown {
1833ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1834ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1835ba337c44SJed Brown   PetscScalar  *aa = a->v;
1836ba337c44SJed Brown 
1837ba337c44SJed Brown   PetscFunctionBegin;
1838ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1839ba337c44SJed Brown   PetscFunctionReturn(0);
1840ba337c44SJed Brown }
1841284134d9SBarry Smith 
1842a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1843a9fe9ddaSSatish Balay #undef __FUNCT__
1844a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1845150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1846a9fe9ddaSSatish Balay {
1847a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1848a9fe9ddaSSatish Balay 
1849a9fe9ddaSSatish Balay   PetscFunctionBegin;
1850a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18513ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1852a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18533ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1854a9fe9ddaSSatish Balay   }
18553ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1856a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18573ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1858a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1859a9fe9ddaSSatish Balay }
1860a9fe9ddaSSatish Balay 
1861a9fe9ddaSSatish Balay #undef __FUNCT__
1862a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1863a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1864a9fe9ddaSSatish Balay {
1865ee16a9a1SHong Zhang   PetscErrorCode ierr;
1866d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1867ee16a9a1SHong Zhang   Mat            Cmat;
1868a9fe9ddaSSatish Balay 
1869ee16a9a1SHong Zhang   PetscFunctionBegin;
1870e32f2f54SBarry 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);
1871ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1872ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1873ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18740298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1875d73949e8SHong Zhang 
1876ee16a9a1SHong Zhang   *C = Cmat;
1877ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1878ee16a9a1SHong Zhang }
1879a9fe9ddaSSatish Balay 
188098a3b096SSatish Balay #undef __FUNCT__
1881a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1882a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1883a9fe9ddaSSatish Balay {
1884a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1885a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1886a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18870805154bSBarry Smith   PetscBLASInt   m,n,k;
1888a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1889c5df96a5SBarry Smith   PetscErrorCode ierr;
1890fd4e9aacSBarry Smith   PetscBool      flg;
1891a9fe9ddaSSatish Balay 
1892a9fe9ddaSSatish Balay   PetscFunctionBegin;
1893fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1894fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1895fd4e9aacSBarry Smith 
1896fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1897fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1898fd4e9aacSBarry Smith   if (flg) {
1899fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1900fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1901fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1902fd4e9aacSBarry Smith   }
1903fd4e9aacSBarry Smith 
1904fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1905fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1906c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1907c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1908c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
19095ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1910a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1911a9fe9ddaSSatish Balay }
1912a9fe9ddaSSatish Balay 
1913a9fe9ddaSSatish Balay #undef __FUNCT__
191475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
191575648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1916a9fe9ddaSSatish Balay {
1917a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1918a9fe9ddaSSatish Balay 
1919a9fe9ddaSSatish Balay   PetscFunctionBegin;
1920a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
19213ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
192275648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
19233ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1924a9fe9ddaSSatish Balay   }
19253ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
192675648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
19273ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1928a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1929a9fe9ddaSSatish Balay }
1930a9fe9ddaSSatish Balay 
1931a9fe9ddaSSatish Balay #undef __FUNCT__
193275648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
193375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1934a9fe9ddaSSatish Balay {
1935ee16a9a1SHong Zhang   PetscErrorCode ierr;
1936d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1937ee16a9a1SHong Zhang   Mat            Cmat;
1938a9fe9ddaSSatish Balay 
1939ee16a9a1SHong Zhang   PetscFunctionBegin;
1940e32f2f54SBarry 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);
1941ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1942ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1943ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19440298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
19452205254eSKarl Rupp 
1946ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19472205254eSKarl Rupp 
1948ee16a9a1SHong Zhang   *C = Cmat;
1949ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1950ee16a9a1SHong Zhang }
1951a9fe9ddaSSatish Balay 
1952a9fe9ddaSSatish Balay #undef __FUNCT__
195375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
195475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1955a9fe9ddaSSatish Balay {
1956a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1957a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1958a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19590805154bSBarry Smith   PetscBLASInt   m,n,k;
1960a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1961c5df96a5SBarry Smith   PetscErrorCode ierr;
1962a9fe9ddaSSatish Balay 
1963a9fe9ddaSSatish Balay   PetscFunctionBegin;
1964c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1965c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1966c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19672fbe02b9SBarry Smith   /*
19682fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19692fbe02b9SBarry Smith   */
19705ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1971a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1972a9fe9ddaSSatish Balay }
1973985db425SBarry Smith 
1974985db425SBarry Smith #undef __FUNCT__
1975985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1976e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1977985db425SBarry Smith {
1978985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1979985db425SBarry Smith   PetscErrorCode ierr;
1980d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1981985db425SBarry Smith   PetscScalar    *x;
1982985db425SBarry Smith   MatScalar      *aa = a->v;
1983985db425SBarry Smith 
1984985db425SBarry Smith   PetscFunctionBegin;
1985e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1986985db425SBarry Smith 
1987985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1988985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1989985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1990e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1991985db425SBarry Smith   for (i=0; i<m; i++) {
1992985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1993985db425SBarry Smith     for (j=1; j<n; j++) {
1994985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1995985db425SBarry Smith     }
1996985db425SBarry Smith   }
1997985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1998985db425SBarry Smith   PetscFunctionReturn(0);
1999985db425SBarry Smith }
2000985db425SBarry Smith 
2001985db425SBarry Smith #undef __FUNCT__
2002985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
2003e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2004985db425SBarry Smith {
2005985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2006985db425SBarry Smith   PetscErrorCode ierr;
2007d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2008985db425SBarry Smith   PetscScalar    *x;
2009985db425SBarry Smith   PetscReal      atmp;
2010985db425SBarry Smith   MatScalar      *aa = a->v;
2011985db425SBarry Smith 
2012985db425SBarry Smith   PetscFunctionBegin;
2013e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2014985db425SBarry Smith 
2015985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2016985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2017985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2018e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2019985db425SBarry Smith   for (i=0; i<m; i++) {
20209189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2021985db425SBarry Smith     for (j=1; j<n; j++) {
2022985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
2023985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2024985db425SBarry Smith     }
2025985db425SBarry Smith   }
2026985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2027985db425SBarry Smith   PetscFunctionReturn(0);
2028985db425SBarry Smith }
2029985db425SBarry Smith 
2030985db425SBarry Smith #undef __FUNCT__
2031985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
2032e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2033985db425SBarry Smith {
2034985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2035985db425SBarry Smith   PetscErrorCode ierr;
2036d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2037985db425SBarry Smith   PetscScalar    *x;
2038985db425SBarry Smith   MatScalar      *aa = a->v;
2039985db425SBarry Smith 
2040985db425SBarry Smith   PetscFunctionBegin;
2041e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2042985db425SBarry Smith 
2043985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2044985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2045985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2046e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2047985db425SBarry Smith   for (i=0; i<m; i++) {
2048985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2049985db425SBarry Smith     for (j=1; j<n; j++) {
2050985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2051985db425SBarry Smith     }
2052985db425SBarry Smith   }
2053985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2054985db425SBarry Smith   PetscFunctionReturn(0);
2055985db425SBarry Smith }
2056985db425SBarry Smith 
20578d0534beSBarry Smith #undef __FUNCT__
20588d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2059e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20608d0534beSBarry Smith {
20618d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20628d0534beSBarry Smith   PetscErrorCode ierr;
20638d0534beSBarry Smith   PetscScalar    *x;
20648d0534beSBarry Smith 
20658d0534beSBarry Smith   PetscFunctionBegin;
2066e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20678d0534beSBarry Smith 
20688d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2069d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20708d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20718d0534beSBarry Smith   PetscFunctionReturn(0);
20728d0534beSBarry Smith }
20738d0534beSBarry Smith 
20740716a85fSBarry Smith 
20750716a85fSBarry Smith #undef __FUNCT__
20760716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20770716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20780716a85fSBarry Smith {
20790716a85fSBarry Smith   PetscErrorCode ierr;
20800716a85fSBarry Smith   PetscInt       i,j,m,n;
20810716a85fSBarry Smith   PetscScalar    *a;
20820716a85fSBarry Smith 
20830716a85fSBarry Smith   PetscFunctionBegin;
20840716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20850716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20868c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20870716a85fSBarry Smith   if (type == NORM_2) {
20880716a85fSBarry Smith     for (i=0; i<n; i++) {
20890716a85fSBarry Smith       for (j=0; j<m; j++) {
20900716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
20910716a85fSBarry Smith       }
20920716a85fSBarry Smith       a += m;
20930716a85fSBarry Smith     }
20940716a85fSBarry Smith   } else if (type == NORM_1) {
20950716a85fSBarry Smith     for (i=0; i<n; i++) {
20960716a85fSBarry Smith       for (j=0; j<m; j++) {
20970716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
20980716a85fSBarry Smith       }
20990716a85fSBarry Smith       a += m;
21000716a85fSBarry Smith     }
21010716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
21020716a85fSBarry Smith     for (i=0; i<n; i++) {
21030716a85fSBarry Smith       for (j=0; j<m; j++) {
21040716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
21050716a85fSBarry Smith       }
21060716a85fSBarry Smith       a += m;
21070716a85fSBarry Smith     }
2108ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
21098c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
21100716a85fSBarry Smith   if (type == NORM_2) {
21118f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
21120716a85fSBarry Smith   }
21130716a85fSBarry Smith   PetscFunctionReturn(0);
21140716a85fSBarry Smith }
21150716a85fSBarry Smith 
211673a71a0fSBarry Smith #undef __FUNCT__
211773a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
211873a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
211973a71a0fSBarry Smith {
212073a71a0fSBarry Smith   PetscErrorCode ierr;
212173a71a0fSBarry Smith   PetscScalar    *a;
212273a71a0fSBarry Smith   PetscInt       m,n,i;
212373a71a0fSBarry Smith 
212473a71a0fSBarry Smith   PetscFunctionBegin;
212573a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
21268c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
212773a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
212873a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
212973a71a0fSBarry Smith   }
21308c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
213173a71a0fSBarry Smith   PetscFunctionReturn(0);
213273a71a0fSBarry Smith }
213373a71a0fSBarry Smith 
21343b49f96aSBarry Smith #undef __FUNCT__
21353b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
21363b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
21373b49f96aSBarry Smith {
21383b49f96aSBarry Smith   PetscFunctionBegin;
21393b49f96aSBarry Smith   *missing = PETSC_FALSE;
21403b49f96aSBarry Smith   PetscFunctionReturn(0);
21413b49f96aSBarry Smith }
214273a71a0fSBarry Smith 
2143abc3b08eSStefano Zampini 
2144289bc588SBarry Smith /* -------------------------------------------------------------------*/
2145a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2146905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2147905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2148905e6a2fSBarry Smith                                         MatMult_SeqDense,
214997304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21507c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21517c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2152db4efbfdSBarry Smith                                         0,
2153db4efbfdSBarry Smith                                         0,
2154db4efbfdSBarry Smith                                         0,
2155db4efbfdSBarry Smith                                 /* 10*/ 0,
2156905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2157905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
215841f059aeSBarry Smith                                         MatSOR_SeqDense,
2159ec8511deSBarry Smith                                         MatTranspose_SeqDense,
216097304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2161905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2162905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2163905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2164905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2165c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2166c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2167905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2168905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2169d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2170db4efbfdSBarry Smith                                         0,
2171db4efbfdSBarry Smith                                         0,
2172db4efbfdSBarry Smith                                         0,
2173db4efbfdSBarry Smith                                         0,
21744994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2175273d9f13SBarry Smith                                         0,
2176905e6a2fSBarry Smith                                         0,
217773a71a0fSBarry Smith                                         0,
217873a71a0fSBarry Smith                                         0,
2179d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2180a5ae1ecdSBarry Smith                                         0,
2181a5ae1ecdSBarry Smith                                         0,
2182a5ae1ecdSBarry Smith                                         0,
2183a5ae1ecdSBarry Smith                                         0,
2184d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2185a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2186a5ae1ecdSBarry Smith                                         0,
21874b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2188a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2189d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2190a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
21917d68702bSBarry Smith                                         MatShift_Basic,
2192a5ae1ecdSBarry Smith                                         0,
21933f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
219473a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2195a5ae1ecdSBarry Smith                                         0,
2196a5ae1ecdSBarry Smith                                         0,
2197a5ae1ecdSBarry Smith                                         0,
2198a5ae1ecdSBarry Smith                                         0,
2199d519adbfSMatthew Knepley                                 /* 54*/ 0,
2200a5ae1ecdSBarry Smith                                         0,
2201a5ae1ecdSBarry Smith                                         0,
2202a5ae1ecdSBarry Smith                                         0,
2203a5ae1ecdSBarry Smith                                         0,
2204d519adbfSMatthew Knepley                                 /* 59*/ 0,
2205e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2206e03a110bSBarry Smith                                         MatView_SeqDense,
2207357abbc8SBarry Smith                                         0,
220897304618SKris Buschelman                                         0,
2209d519adbfSMatthew Knepley                                 /* 64*/ 0,
221097304618SKris Buschelman                                         0,
221197304618SKris Buschelman                                         0,
221297304618SKris Buschelman                                         0,
221397304618SKris Buschelman                                         0,
2214d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
221597304618SKris Buschelman                                         0,
221697304618SKris Buschelman                                         0,
221797304618SKris Buschelman                                         0,
221897304618SKris Buschelman                                         0,
2219d519adbfSMatthew Knepley                                 /* 74*/ 0,
222097304618SKris Buschelman                                         0,
222197304618SKris Buschelman                                         0,
222297304618SKris Buschelman                                         0,
222397304618SKris Buschelman                                         0,
2224d519adbfSMatthew Knepley                                 /* 79*/ 0,
222597304618SKris Buschelman                                         0,
222697304618SKris Buschelman                                         0,
222797304618SKris Buschelman                                         0,
22285bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2229865e5f61SKris Buschelman                                         0,
22301cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2231865e5f61SKris Buschelman                                         0,
2232865e5f61SKris Buschelman                                         0,
2233865e5f61SKris Buschelman                                         0,
2234d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2235a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2236a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2237abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2238abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2239abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
22405df89d91SHong Zhang                                         0,
22415df89d91SHong Zhang                                         0,
22425df89d91SHong Zhang                                         0,
2243284134d9SBarry Smith                                         0,
2244d519adbfSMatthew Knepley                                 /* 99*/ 0,
2245284134d9SBarry Smith                                         0,
2246284134d9SBarry Smith                                         0,
2247ba337c44SJed Brown                                         MatConjugate_SeqDense,
2248f73d5cc4SBarry Smith                                         0,
2249ba337c44SJed Brown                                 /*104*/ 0,
2250ba337c44SJed Brown                                         MatRealPart_SeqDense,
2251ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2252985db425SBarry Smith                                         0,
2253985db425SBarry Smith                                         0,
225485e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2255985db425SBarry Smith                                         0,
22568d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2257aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22583b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2259aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2260aabbc4fbSShri Abhyankar                                         0,
2261aabbc4fbSShri Abhyankar                                         0,
2262aabbc4fbSShri Abhyankar                                         0,
2263aabbc4fbSShri Abhyankar                                         0,
2264aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2265aabbc4fbSShri Abhyankar                                         0,
2266aabbc4fbSShri Abhyankar                                         0,
22670716a85fSBarry Smith                                         0,
22680716a85fSBarry Smith                                         0,
22690716a85fSBarry Smith                                 /*124*/ 0,
22705df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22715df89d91SHong Zhang                                         0,
22725df89d91SHong Zhang                                         0,
22735df89d91SHong Zhang                                         0,
22745df89d91SHong Zhang                                 /*129*/ 0,
227575648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
227675648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
227775648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22783964eb88SJed Brown                                         0,
22793964eb88SJed Brown                                 /*134*/ 0,
22803964eb88SJed Brown                                         0,
22813964eb88SJed Brown                                         0,
22823964eb88SJed Brown                                         0,
22833964eb88SJed Brown                                         0,
22843964eb88SJed Brown                                 /*139*/ 0,
2285f9426fe0SMark Adams                                         0,
22863964eb88SJed Brown                                         0
2287985db425SBarry Smith };
228890ace30eSBarry Smith 
22894a2ae208SSatish Balay #undef __FUNCT__
22904a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
22914b828684SBarry Smith /*@C
2292fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2293d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2294d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2295289bc588SBarry Smith 
2296db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2297db81eaa0SLois Curfman McInnes 
229820563c6bSBarry Smith    Input Parameters:
2299db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
23000c775827SLois Curfman McInnes .  m - number of rows
230118f449edSLois Curfman McInnes .  n - number of columns
23020298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2303dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
230420563c6bSBarry Smith 
230520563c6bSBarry Smith    Output Parameter:
230644cd7ae7SLois Curfman McInnes .  A - the matrix
230720563c6bSBarry Smith 
2308b259b22eSLois Curfman McInnes    Notes:
230918f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
231018f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
23110298fd71SBarry Smith    set data=NULL.
231218f449edSLois Curfman McInnes 
2313027ccd11SLois Curfman McInnes    Level: intermediate
2314027ccd11SLois Curfman McInnes 
2315dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2316d65003e9SLois Curfman McInnes 
231769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
231820563c6bSBarry Smith @*/
23197087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2320289bc588SBarry Smith {
2321dfbe8321SBarry Smith   PetscErrorCode ierr;
23223b2fbd54SBarry Smith 
23233a40ed3dSBarry Smith   PetscFunctionBegin;
2324f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2325f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2326273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2327273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2328273d9f13SBarry Smith   PetscFunctionReturn(0);
2329273d9f13SBarry Smith }
2330273d9f13SBarry Smith 
23314a2ae208SSatish Balay #undef __FUNCT__
2332afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2333273d9f13SBarry Smith /*@C
2334273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2335273d9f13SBarry Smith 
2336273d9f13SBarry Smith    Collective on MPI_Comm
2337273d9f13SBarry Smith 
2338273d9f13SBarry Smith    Input Parameters:
23391c4f3114SJed Brown +  B - the matrix
23400298fd71SBarry Smith -  data - the array (or NULL)
2341273d9f13SBarry Smith 
2342273d9f13SBarry Smith    Notes:
2343273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2344273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2345284134d9SBarry Smith    need not call this routine.
2346273d9f13SBarry Smith 
2347273d9f13SBarry Smith    Level: intermediate
2348273d9f13SBarry Smith 
2349273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2350273d9f13SBarry Smith 
235169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2352867c911aSBarry Smith 
2353273d9f13SBarry Smith @*/
23547087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2355273d9f13SBarry Smith {
23564ac538c5SBarry Smith   PetscErrorCode ierr;
2357a23d5eceSKris Buschelman 
2358a23d5eceSKris Buschelman   PetscFunctionBegin;
23594ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2360a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2361a23d5eceSKris Buschelman }
2362a23d5eceSKris Buschelman 
2363a23d5eceSKris Buschelman #undef __FUNCT__
2364afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23657087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2366a23d5eceSKris Buschelman {
2367273d9f13SBarry Smith   Mat_SeqDense   *b;
2368dfbe8321SBarry Smith   PetscErrorCode ierr;
2369273d9f13SBarry Smith 
2370273d9f13SBarry Smith   PetscFunctionBegin;
2371273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2372a868139aSShri Abhyankar 
237334ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
237434ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
237534ef9618SShri Abhyankar 
2376273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
237786d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
237886d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
237986d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
238086d161a7SShri Abhyankar 
23819e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23829e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2383e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23843bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23852205254eSKarl Rupp 
23869e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2387273d9f13SBarry Smith   } else { /* user-allocated storage */
23889e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2389273d9f13SBarry Smith     b->v          = data;
2390273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2391273d9f13SBarry Smith   }
23920450473dSBarry Smith   B->assembled = PETSC_TRUE;
2393273d9f13SBarry Smith   PetscFunctionReturn(0);
2394273d9f13SBarry Smith }
2395273d9f13SBarry Smith 
239665b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23971b807ce4Svictorle #undef __FUNCT__
23988baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
2399cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
24008baccfbdSHong Zhang {
2401d77f618aSHong Zhang   Mat            mat_elemental;
2402d77f618aSHong Zhang   PetscErrorCode ierr;
2403d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2404d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2405d77f618aSHong Zhang 
24068baccfbdSHong Zhang   PetscFunctionBegin;
2407d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2408d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2409d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2410d77f618aSHong Zhang   k = 0;
2411d77f618aSHong Zhang   for (j=0; j<N; j++) {
2412d77f618aSHong Zhang     cols[j] = j;
2413d77f618aSHong Zhang     for (i=0; i<M; i++) {
2414d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2415d77f618aSHong Zhang     }
2416d77f618aSHong Zhang   }
2417d77f618aSHong Zhang   for (i=0; i<M; i++) {
2418d77f618aSHong Zhang     rows[i] = i;
2419d77f618aSHong Zhang   }
2420d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2421d77f618aSHong Zhang 
2422d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2423d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2424d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2425d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2426d77f618aSHong Zhang 
2427d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2428d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2429d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2430d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2431d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2432d77f618aSHong Zhang 
2433511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
243428be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2435d77f618aSHong Zhang   } else {
2436d77f618aSHong Zhang     *newmat = mat_elemental;
2437d77f618aSHong Zhang   }
24388baccfbdSHong Zhang   PetscFunctionReturn(0);
24398baccfbdSHong Zhang }
244065b80a83SHong Zhang #endif
24418baccfbdSHong Zhang 
24428baccfbdSHong Zhang #undef __FUNCT__
24431b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
24441b807ce4Svictorle /*@C
24451b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24461b807ce4Svictorle 
24471b807ce4Svictorle   Input parameter:
24481b807ce4Svictorle + A - the matrix
24491b807ce4Svictorle - lda - the leading dimension
24501b807ce4Svictorle 
24511b807ce4Svictorle   Notes:
2452867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24531b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24541b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24551b807ce4Svictorle 
24561b807ce4Svictorle   Level: intermediate
24571b807ce4Svictorle 
24581b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24591b807ce4Svictorle 
2460284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2461867c911aSBarry Smith 
24621b807ce4Svictorle @*/
24637087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24641b807ce4Svictorle {
24651b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
246621a2c019SBarry Smith 
24671b807ce4Svictorle   PetscFunctionBegin;
2468e32f2f54SBarry 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);
24691b807ce4Svictorle   b->lda       = lda;
247021a2c019SBarry Smith   b->changelda = PETSC_FALSE;
247121a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24721b807ce4Svictorle   PetscFunctionReturn(0);
24731b807ce4Svictorle }
24741b807ce4Svictorle 
24750bad9183SKris Buschelman /*MC
2476fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24770bad9183SKris Buschelman 
24780bad9183SKris Buschelman    Options Database Keys:
24790bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24800bad9183SKris Buschelman 
24810bad9183SKris Buschelman   Level: beginner
24820bad9183SKris Buschelman 
248389665df3SBarry Smith .seealso: MatCreateSeqDense()
248489665df3SBarry Smith 
24850bad9183SKris Buschelman M*/
24860bad9183SKris Buschelman 
24874a2ae208SSatish Balay #undef __FUNCT__
24884a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24898cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2490273d9f13SBarry Smith {
2491273d9f13SBarry Smith   Mat_SeqDense   *b;
2492dfbe8321SBarry Smith   PetscErrorCode ierr;
24937c334f02SBarry Smith   PetscMPIInt    size;
2494273d9f13SBarry Smith 
2495273d9f13SBarry Smith   PetscFunctionBegin;
2496ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2497e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
249855659b69SBarry Smith 
2499b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2500549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
250144cd7ae7SLois Curfman McInnes   B->data = (void*)b;
250218f449edSLois Curfman McInnes 
250344cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2504273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2505273d9f13SBarry Smith   b->v           = 0;
250621a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
25074e220ebcSLois Curfman McInnes 
2508bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2509bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2510bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
25118baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
25128baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
25138baccfbdSHong Zhang #endif
2514bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2515bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2516bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2517bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2518abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
25193bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
25203bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
25213bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
252217667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
25233a40ed3dSBarry Smith   PetscFunctionReturn(0);
2524289bc588SBarry Smith }
2525