xref: /petsc/src/mat/impls/dense/seq/dense.c (revision cf37664f2dbf3effe674ec5ac2718028c1621ae0)
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 {
104a13144ffSStefano Zampini   Mat            B = NULL;
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;
110a13144ffSStefano Zampini   PetscBool      isseqdense;
111b49cda9fSStefano Zampini 
112b49cda9fSStefano Zampini   PetscFunctionBegin;
113a13144ffSStefano Zampini   if (reuse == MAT_REUSE_MATRIX) {
114a13144ffSStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr);
115a13144ffSStefano Zampini     if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type);
116a13144ffSStefano Zampini   }
117a13144ffSStefano Zampini   if (reuse != MAT_REUSE_MATRIX) {
118b49cda9fSStefano Zampini     ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
119b49cda9fSStefano Zampini     ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
120b49cda9fSStefano Zampini     ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
121b49cda9fSStefano Zampini     ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
122b49cda9fSStefano Zampini     b    = (Mat_SeqDense*)(B->data);
123a13144ffSStefano Zampini   } else {
124a13144ffSStefano Zampini     b    = (Mat_SeqDense*)((*newmat)->data);
125a13144ffSStefano Zampini     ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
126a13144ffSStefano Zampini   }
127b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
128b49cda9fSStefano Zampini     PetscInt j;
129b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
130b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
131b49cda9fSStefano Zampini       aj++;
132b49cda9fSStefano Zampini       av++;
133b49cda9fSStefano Zampini     }
134b49cda9fSStefano Zampini     ai++;
135b49cda9fSStefano Zampini   }
136b49cda9fSStefano Zampini 
137511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
138a13144ffSStefano Zampini     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
139a13144ffSStefano Zampini     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14028be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
141b49cda9fSStefano Zampini   } else {
142a13144ffSStefano Zampini     if (B) *newmat = B;
143a13144ffSStefano Zampini     ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
144a13144ffSStefano Zampini     ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
145b49cda9fSStefano Zampini   }
146b49cda9fSStefano Zampini   PetscFunctionReturn(0);
147b49cda9fSStefano Zampini }
148b49cda9fSStefano Zampini 
149b49cda9fSStefano Zampini #undef __FUNCT__
1506a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
151cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
1526a63e612SBarry Smith {
1536a63e612SBarry Smith   Mat            B;
1546a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1556a63e612SBarry Smith   PetscErrorCode ierr;
1569399e1b8SMatthew G. Knepley   PetscInt       i, j;
1579399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
1589399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
1596a63e612SBarry Smith 
1606a63e612SBarry Smith   PetscFunctionBegin;
161ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
1626a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1636a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
1649399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
1659399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1669399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
1676a63e612SBarry Smith     aa += a->lda;
1686a63e612SBarry Smith   }
1699399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
1709399e1b8SMatthew G. Knepley   aa = a->v;
1719399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1729399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
1739399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
1749399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
1759399e1b8SMatthew G. Knepley     aa  += a->lda;
1769399e1b8SMatthew G. Knepley   }
1779399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
1786a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1796a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1806a63e612SBarry Smith 
181511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
18228be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
1836a63e612SBarry Smith   } else {
1846a63e612SBarry Smith     *newmat = B;
1856a63e612SBarry Smith   }
1866a63e612SBarry Smith   PetscFunctionReturn(0);
1876a63e612SBarry Smith }
1886a63e612SBarry Smith 
1894a2ae208SSatish Balay #undef __FUNCT__
1904a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
191e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
1921987afe7SBarry Smith {
1931987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
194f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
19513f74950SBarry Smith   PetscInt       j;
1960805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
197efee365bSSatish Balay   PetscErrorCode ierr;
1983a40ed3dSBarry Smith 
1993a40ed3dSBarry Smith   PetscFunctionBegin;
200c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
201c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
202c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
203c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
204a5ce6ee0Svictorle   if (ldax>m || lday>m) {
205d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
2068b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
207a5ce6ee0Svictorle     }
208a5ce6ee0Svictorle   } else {
2098b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
210a5ce6ee0Svictorle   }
211a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
2120450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
2133a40ed3dSBarry Smith   PetscFunctionReturn(0);
2141987afe7SBarry Smith }
2151987afe7SBarry Smith 
2164a2ae208SSatish Balay #undef __FUNCT__
2174a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
218e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
219289bc588SBarry Smith {
220d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
2213a40ed3dSBarry Smith 
2223a40ed3dSBarry Smith   PetscFunctionBegin;
2234e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
2244e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
2256de62eeeSBarry Smith   info->nz_used           = (double)N;
2266de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
2274e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
2284e220ebcSLois Curfman McInnes   info->mallocs           = 0;
2297adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
2304e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
2314e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
2324e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
2333a40ed3dSBarry Smith   PetscFunctionReturn(0);
234289bc588SBarry Smith }
235289bc588SBarry Smith 
2364a2ae208SSatish Balay #undef __FUNCT__
2374a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
238e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
23980cd9d93SLois Curfman McInnes {
240273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
241f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
242efee365bSSatish Balay   PetscErrorCode ierr;
243c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
24480cd9d93SLois Curfman McInnes 
2453a40ed3dSBarry Smith   PetscFunctionBegin;
246c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
247d0f46423SBarry Smith   if (lda>A->rmap->n) {
248c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
249d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
2508b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
251a5ce6ee0Svictorle     }
252a5ce6ee0Svictorle   } else {
253c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
2548b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
255a5ce6ee0Svictorle   }
256efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
2573a40ed3dSBarry Smith   PetscFunctionReturn(0);
25880cd9d93SLois Curfman McInnes }
25980cd9d93SLois Curfman McInnes 
2601cbb95d3SBarry Smith #undef __FUNCT__
2611cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
262e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
2631cbb95d3SBarry Smith {
2641cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
265d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
2661cbb95d3SBarry Smith   PetscScalar  *v = a->v;
2671cbb95d3SBarry Smith 
2681cbb95d3SBarry Smith   PetscFunctionBegin;
2691cbb95d3SBarry Smith   *fl = PETSC_FALSE;
270d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
2711cbb95d3SBarry Smith   N = a->lda;
2721cbb95d3SBarry Smith 
2731cbb95d3SBarry Smith   for (i=0; i<m; i++) {
2741cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
2751cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
2761cbb95d3SBarry Smith     }
2771cbb95d3SBarry Smith   }
2781cbb95d3SBarry Smith   *fl = PETSC_TRUE;
2791cbb95d3SBarry Smith   PetscFunctionReturn(0);
2801cbb95d3SBarry Smith }
2811cbb95d3SBarry Smith 
282b24902e0SBarry Smith #undef __FUNCT__
283b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
284e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
285b24902e0SBarry Smith {
286b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
287b24902e0SBarry Smith   PetscErrorCode ierr;
288b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
289b24902e0SBarry Smith 
290b24902e0SBarry Smith   PetscFunctionBegin;
291aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
292aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
2930298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
294b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
295b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
296d0f46423SBarry Smith     if (lda>A->rmap->n) {
297d0f46423SBarry Smith       m = A->rmap->n;
298d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
299b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
300b24902e0SBarry Smith       }
301b24902e0SBarry Smith     } else {
302d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
303b24902e0SBarry Smith     }
304b24902e0SBarry Smith   }
305b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
306b24902e0SBarry Smith   PetscFunctionReturn(0);
307b24902e0SBarry Smith }
308b24902e0SBarry Smith 
3094a2ae208SSatish Balay #undef __FUNCT__
3104a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
311e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
31202cad45dSBarry Smith {
3136849ba73SBarry Smith   PetscErrorCode ierr;
31402cad45dSBarry Smith 
3153a40ed3dSBarry Smith   PetscFunctionBegin;
316ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
317d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
3185c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
319719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
320b24902e0SBarry Smith   PetscFunctionReturn(0);
321b24902e0SBarry Smith }
322b24902e0SBarry Smith 
3236ee01492SSatish Balay 
324e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
325719d5645SBarry Smith 
3264a2ae208SSatish Balay #undef __FUNCT__
3274a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
328e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
329289bc588SBarry Smith {
3304482741eSBarry Smith   MatFactorInfo  info;
331a093e273SMatthew Knepley   PetscErrorCode ierr;
3323a40ed3dSBarry Smith 
3333a40ed3dSBarry Smith   PetscFunctionBegin;
334c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
335719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
3363a40ed3dSBarry Smith   PetscFunctionReturn(0);
337289bc588SBarry Smith }
3386ee01492SSatish Balay 
3390b4b3355SBarry Smith #undef __FUNCT__
3404a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
341e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
342289bc588SBarry Smith {
343c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
3446849ba73SBarry Smith   PetscErrorCode    ierr;
345f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
346f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
347c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
34867e560aaSBarry Smith 
3493a40ed3dSBarry Smith   PetscFunctionBegin;
350c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
351f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3521ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
353d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
354d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
355ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
356e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
357ae7cfcebSSatish Balay #else
3588b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
359e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
360ae7cfcebSSatish Balay #endif
361d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
362ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
363e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
364ae7cfcebSSatish Balay #else
3658b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
366e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
367ae7cfcebSSatish Balay #endif
3682205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
369f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3701ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
371dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3723a40ed3dSBarry Smith   PetscFunctionReturn(0);
373289bc588SBarry Smith }
3746ee01492SSatish Balay 
3754a2ae208SSatish Balay #undef __FUNCT__
37685e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
377e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
37885e2c93fSHong Zhang {
37985e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
38085e2c93fSHong Zhang   PetscErrorCode ierr;
38185e2c93fSHong Zhang   PetscScalar    *b,*x;
382efb80c78SLisandro Dalcin   PetscInt       n;
383783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
384bda8bf91SBarry Smith   PetscBool      flg;
38585e2c93fSHong Zhang 
38685e2c93fSHong Zhang   PetscFunctionBegin;
387c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3880298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
389ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
3900298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
391ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
392bda8bf91SBarry Smith 
3930298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
394c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
3958c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
3968c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
39785e2c93fSHong Zhang 
398f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
39985e2c93fSHong Zhang 
40085e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
40185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
40285e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
40385e2c93fSHong Zhang #else
4048b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
40585e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
40685e2c93fSHong Zhang #endif
40785e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
40885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
40985e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
41085e2c93fSHong Zhang #else
4118b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
41285e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
41385e2c93fSHong Zhang #endif
4142205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
41585e2c93fSHong Zhang 
4168c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
4178c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
41885e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
41985e2c93fSHong Zhang   PetscFunctionReturn(0);
42085e2c93fSHong Zhang }
42185e2c93fSHong Zhang 
42285e2c93fSHong Zhang #undef __FUNCT__
4234a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
424e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
425da3a660dSBarry Smith {
426c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
427dfbe8321SBarry Smith   PetscErrorCode    ierr;
428f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
429f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
430c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
43167e560aaSBarry Smith 
4323a40ed3dSBarry Smith   PetscFunctionBegin;
433c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
434f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4351ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
436d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
437752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
438da3a660dSBarry Smith   if (mat->pivots) {
439ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
440e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
441ae7cfcebSSatish Balay #else
4428b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
443e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
444ae7cfcebSSatish Balay #endif
4457a97a34bSBarry Smith   } else {
446ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
447e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
448ae7cfcebSSatish Balay #else
4498b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
450e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
451ae7cfcebSSatish Balay #endif
452da3a660dSBarry Smith   }
453f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4541ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
455dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
4563a40ed3dSBarry Smith   PetscFunctionReturn(0);
457da3a660dSBarry Smith }
4586ee01492SSatish Balay 
4594a2ae208SSatish Balay #undef __FUNCT__
4604a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
461e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
462da3a660dSBarry Smith {
463c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
464dfbe8321SBarry Smith   PetscErrorCode    ierr;
465f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
466f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
467da3a660dSBarry Smith   Vec               tmp = 0;
468c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
46967e560aaSBarry Smith 
4703a40ed3dSBarry Smith   PetscFunctionBegin;
471c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
472f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4731ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
474d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
475da3a660dSBarry Smith   if (yy == zz) {
47678b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4773bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
47878b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
479da3a660dSBarry Smith   }
480d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
481752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
482da3a660dSBarry Smith   if (mat->pivots) {
483ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
484e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
485ae7cfcebSSatish Balay #else
4868b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
487e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
488ae7cfcebSSatish Balay #endif
489a8c6a408SBarry Smith   } else {
490ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
491e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
492ae7cfcebSSatish Balay #else
4938b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
494e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
495ae7cfcebSSatish Balay #endif
496da3a660dSBarry Smith   }
4976bf464f9SBarry Smith   if (tmp) {
4986bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4996bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
5006bf464f9SBarry Smith   } else {
5016bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
5026bf464f9SBarry Smith   }
503f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5041ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
505dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
5063a40ed3dSBarry Smith   PetscFunctionReturn(0);
507da3a660dSBarry Smith }
50867e560aaSBarry Smith 
5094a2ae208SSatish Balay #undef __FUNCT__
5104a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
511e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
512da3a660dSBarry Smith {
513c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
5146849ba73SBarry Smith   PetscErrorCode    ierr;
515f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
516f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
51789ae1891SBarry Smith   Vec               tmp = NULL;
518c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
51967e560aaSBarry Smith 
5203a40ed3dSBarry Smith   PetscFunctionBegin;
521c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
522d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
523f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
5241ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
525da3a660dSBarry Smith   if (yy == zz) {
52678b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
5273bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
52878b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
529da3a660dSBarry Smith   }
530d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
531752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
532da3a660dSBarry Smith   if (mat->pivots) {
533ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
534e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
535ae7cfcebSSatish Balay #else
5368b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
537e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
538ae7cfcebSSatish Balay #endif
5393a40ed3dSBarry Smith   } else {
540ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
541e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
542ae7cfcebSSatish Balay #else
5438b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
544e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
545ae7cfcebSSatish Balay #endif
546da3a660dSBarry Smith   }
54790f02eecSBarry Smith   if (tmp) {
5482dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
5496bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
5503a40ed3dSBarry Smith   } else {
5512dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
55290f02eecSBarry Smith   }
553f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
5541ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
555dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
5563a40ed3dSBarry Smith   PetscFunctionReturn(0);
557da3a660dSBarry Smith }
558db4efbfdSBarry Smith 
559db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
560db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
561db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
562db4efbfdSBarry Smith #undef __FUNCT__
563db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
564e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
565db4efbfdSBarry Smith {
566db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
567db4efbfdSBarry Smith   PetscFunctionBegin;
568e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
569db4efbfdSBarry Smith #else
570db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
571db4efbfdSBarry Smith   PetscErrorCode ierr;
572db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
573db4efbfdSBarry Smith 
574db4efbfdSBarry Smith   PetscFunctionBegin;
575c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
576c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
577db4efbfdSBarry Smith   if (!mat->pivots) {
578854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
5793bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
580db4efbfdSBarry Smith   }
581db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5828e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5838b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
5848e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
5858e57ea43SSatish Balay 
586e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
587e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
588db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
589db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
590db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
591db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
592d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
593db4efbfdSBarry Smith 
594f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
595f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
596f6224b95SHong Zhang 
597dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
598db4efbfdSBarry Smith #endif
599db4efbfdSBarry Smith   PetscFunctionReturn(0);
600db4efbfdSBarry Smith }
601db4efbfdSBarry Smith 
602db4efbfdSBarry Smith #undef __FUNCT__
603db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
604e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
605db4efbfdSBarry Smith {
606db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
607db4efbfdSBarry Smith   PetscFunctionBegin;
608e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
609db4efbfdSBarry Smith #else
610db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
611db4efbfdSBarry Smith   PetscErrorCode ierr;
612c5df96a5SBarry Smith   PetscBLASInt   info,n;
613db4efbfdSBarry Smith 
614db4efbfdSBarry Smith   PetscFunctionBegin;
615c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
616db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
617db4efbfdSBarry Smith 
618db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
6198b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
620e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
621db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
622db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
623db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
624db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
625d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
6262205254eSKarl Rupp 
627f6224b95SHong Zhang   ierr = PetscFree(A->solvertype);CHKERRQ(ierr);
628f6224b95SHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr);
629f6224b95SHong Zhang 
630eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
631db4efbfdSBarry Smith #endif
632db4efbfdSBarry Smith   PetscFunctionReturn(0);
633db4efbfdSBarry Smith }
634db4efbfdSBarry Smith 
635db4efbfdSBarry Smith 
636db4efbfdSBarry Smith #undef __FUNCT__
637db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
6380481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
639db4efbfdSBarry Smith {
640db4efbfdSBarry Smith   PetscErrorCode ierr;
641db4efbfdSBarry Smith   MatFactorInfo  info;
642db4efbfdSBarry Smith 
643db4efbfdSBarry Smith   PetscFunctionBegin;
644db4efbfdSBarry Smith   info.fill = 1.0;
6452205254eSKarl Rupp 
646c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
647719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
648db4efbfdSBarry Smith   PetscFunctionReturn(0);
649db4efbfdSBarry Smith }
650db4efbfdSBarry Smith 
651db4efbfdSBarry Smith #undef __FUNCT__
652db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
653e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
654db4efbfdSBarry Smith {
655db4efbfdSBarry Smith   PetscFunctionBegin;
656c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
6571bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
658719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
659db4efbfdSBarry Smith   PetscFunctionReturn(0);
660db4efbfdSBarry Smith }
661db4efbfdSBarry Smith 
662db4efbfdSBarry Smith #undef __FUNCT__
663db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
664e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
665db4efbfdSBarry Smith {
666db4efbfdSBarry Smith   PetscFunctionBegin;
667b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
668c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
669719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
670db4efbfdSBarry Smith   PetscFunctionReturn(0);
671db4efbfdSBarry Smith }
672db4efbfdSBarry Smith 
673db4efbfdSBarry Smith #undef __FUNCT__
674db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
675cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
676db4efbfdSBarry Smith {
677db4efbfdSBarry Smith   PetscErrorCode ierr;
678db4efbfdSBarry Smith 
679db4efbfdSBarry Smith   PetscFunctionBegin;
680ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
681db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
682db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
683db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
684db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
685db4efbfdSBarry Smith   } else {
686db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
687db4efbfdSBarry Smith   }
688d5f3da31SBarry Smith   (*fact)->factortype = ftype;
68900c67f3bSHong Zhang 
69000c67f3bSHong Zhang   ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr);
69100c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr);
692db4efbfdSBarry Smith   PetscFunctionReturn(0);
693db4efbfdSBarry Smith }
694db4efbfdSBarry Smith 
695289bc588SBarry Smith /* ------------------------------------------------------------------*/
6964a2ae208SSatish Balay #undef __FUNCT__
69741f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
698e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
699289bc588SBarry Smith {
700c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
701d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
702d9ca1df4SBarry Smith   const PetscScalar *b;
703dfbe8321SBarry Smith   PetscErrorCode    ierr;
704d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
705c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
706289bc588SBarry Smith 
7073a40ed3dSBarry Smith   PetscFunctionBegin;
708422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
709c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
710289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
71171044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
7122dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
713289bc588SBarry Smith   }
7141ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
715d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
716b965ef7fSBarry Smith   its  = its*lits;
717e32f2f54SBarry 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);
718289bc588SBarry Smith   while (its--) {
719fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
720289bc588SBarry Smith       for (i=0; i<m; i++) {
7218b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
72255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
723289bc588SBarry Smith       }
724289bc588SBarry Smith     }
725fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
726289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
7278b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
72855a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
729289bc588SBarry Smith       }
730289bc588SBarry Smith     }
731289bc588SBarry Smith   }
732d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
7331ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
7343a40ed3dSBarry Smith   PetscFunctionReturn(0);
735289bc588SBarry Smith }
736289bc588SBarry Smith 
737289bc588SBarry Smith /* -----------------------------------------------------------------*/
7384a2ae208SSatish Balay #undef __FUNCT__
7394a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
740cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
741289bc588SBarry Smith {
742c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
743d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
744d9ca1df4SBarry Smith   PetscScalar       *y;
745dfbe8321SBarry Smith   PetscErrorCode    ierr;
7460805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
747ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
7483a40ed3dSBarry Smith 
7493a40ed3dSBarry Smith   PetscFunctionBegin;
750c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
751c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
752d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
753d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7541ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7558b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
756d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7571ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
758dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
7593a40ed3dSBarry Smith   PetscFunctionReturn(0);
760289bc588SBarry Smith }
761800995b7SMatthew Knepley 
7624a2ae208SSatish Balay #undef __FUNCT__
7634a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
764cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
765289bc588SBarry Smith {
766c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
767d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
768dfbe8321SBarry Smith   PetscErrorCode    ierr;
7690805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
770d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7713a40ed3dSBarry Smith 
7723a40ed3dSBarry Smith   PetscFunctionBegin;
773c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
774c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
775d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
776d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7771ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7788b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
779d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7801ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
781dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7823a40ed3dSBarry Smith   PetscFunctionReturn(0);
783289bc588SBarry Smith }
7846ee01492SSatish Balay 
7854a2ae208SSatish Balay #undef __FUNCT__
7864a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
787cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
788289bc588SBarry Smith {
789c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
790d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
791d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
792dfbe8321SBarry Smith   PetscErrorCode    ierr;
7930805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7943a40ed3dSBarry Smith 
7953a40ed3dSBarry Smith   PetscFunctionBegin;
796c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
797c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
798d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
799600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
800d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8011ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8028b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
803d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8041ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
805dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8063a40ed3dSBarry Smith   PetscFunctionReturn(0);
807289bc588SBarry Smith }
8086ee01492SSatish Balay 
8094a2ae208SSatish Balay #undef __FUNCT__
8104a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
811e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
812289bc588SBarry Smith {
813c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
814d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
815d9ca1df4SBarry Smith   PetscScalar       *y;
816dfbe8321SBarry Smith   PetscErrorCode    ierr;
8170805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
81887828ca2SBarry Smith   PetscScalar       _DOne=1.0;
8193a40ed3dSBarry Smith 
8203a40ed3dSBarry Smith   PetscFunctionBegin;
821c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
822c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
823d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
824600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
825d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
8261ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
8278b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
828d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
8291ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
830dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
8313a40ed3dSBarry Smith   PetscFunctionReturn(0);
832289bc588SBarry Smith }
833289bc588SBarry Smith 
834289bc588SBarry Smith /* -----------------------------------------------------------------*/
8354a2ae208SSatish Balay #undef __FUNCT__
8364a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
837e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
838289bc588SBarry Smith {
839c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
84087828ca2SBarry Smith   PetscScalar    *v;
8416849ba73SBarry Smith   PetscErrorCode ierr;
84213f74950SBarry Smith   PetscInt       i;
84367e560aaSBarry Smith 
8443a40ed3dSBarry Smith   PetscFunctionBegin;
845d0f46423SBarry Smith   *ncols = A->cmap->n;
846289bc588SBarry Smith   if (cols) {
847854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
848d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
849289bc588SBarry Smith   }
850289bc588SBarry Smith   if (vals) {
851854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
852289bc588SBarry Smith     v    = mat->v + row;
853d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
854289bc588SBarry Smith   }
8553a40ed3dSBarry Smith   PetscFunctionReturn(0);
856289bc588SBarry Smith }
8576ee01492SSatish Balay 
8584a2ae208SSatish Balay #undef __FUNCT__
8594a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
860e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
861289bc588SBarry Smith {
862dfbe8321SBarry Smith   PetscErrorCode ierr;
8636e111a19SKarl Rupp 
864606d414cSSatish Balay   PetscFunctionBegin;
865606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
866606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8673a40ed3dSBarry Smith   PetscFunctionReturn(0);
868289bc588SBarry Smith }
869289bc588SBarry Smith /* ----------------------------------------------------------------*/
8704a2ae208SSatish Balay #undef __FUNCT__
8714a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
872e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
873289bc588SBarry Smith {
874c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
87513f74950SBarry Smith   PetscInt     i,j,idx=0;
876d6dfbf8fSBarry Smith 
8773a40ed3dSBarry Smith   PetscFunctionBegin;
878289bc588SBarry Smith   if (!mat->roworiented) {
879dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
880289bc588SBarry Smith       for (j=0; j<n; j++) {
881cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8822515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
883e32f2f54SBarry 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);
88458804f6dSBarry Smith #endif
885289bc588SBarry Smith         for (i=0; i<m; i++) {
886cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8872515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
888e32f2f54SBarry 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);
88958804f6dSBarry Smith #endif
890cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
891289bc588SBarry Smith         }
892289bc588SBarry Smith       }
8933a40ed3dSBarry Smith     } else {
894289bc588SBarry Smith       for (j=0; j<n; j++) {
895cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8962515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
897e32f2f54SBarry 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);
89858804f6dSBarry Smith #endif
899289bc588SBarry Smith         for (i=0; i<m; i++) {
900cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
9012515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
902e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
90358804f6dSBarry Smith #endif
904cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
905289bc588SBarry Smith         }
906289bc588SBarry Smith       }
907289bc588SBarry Smith     }
9083a40ed3dSBarry Smith   } else {
909dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
910e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
911cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9122515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
913e32f2f54SBarry 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);
91458804f6dSBarry Smith #endif
915e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
916cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9172515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
918e32f2f54SBarry 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);
91958804f6dSBarry Smith #endif
920cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
921e8d4e0b9SBarry Smith         }
922e8d4e0b9SBarry Smith       }
9233a40ed3dSBarry Smith     } else {
924289bc588SBarry Smith       for (i=0; i<m; i++) {
925cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
9262515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
927e32f2f54SBarry 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);
92858804f6dSBarry Smith #endif
929289bc588SBarry Smith         for (j=0; j<n; j++) {
930cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
9312515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
932e32f2f54SBarry 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);
93358804f6dSBarry Smith #endif
934cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
935289bc588SBarry Smith         }
936289bc588SBarry Smith       }
937289bc588SBarry Smith     }
938e8d4e0b9SBarry Smith   }
9393a40ed3dSBarry Smith   PetscFunctionReturn(0);
940289bc588SBarry Smith }
941e8d4e0b9SBarry Smith 
9424a2ae208SSatish Balay #undef __FUNCT__
9434a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
944e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
945ae80bb75SLois Curfman McInnes {
946ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
94713f74950SBarry Smith   PetscInt     i,j;
948ae80bb75SLois Curfman McInnes 
9493a40ed3dSBarry Smith   PetscFunctionBegin;
950ae80bb75SLois Curfman McInnes   /* row-oriented output */
951ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
95297e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
953e32f2f54SBarry 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);
954ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
9556f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
956e32f2f54SBarry 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);
95797e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
958ae80bb75SLois Curfman McInnes     }
959ae80bb75SLois Curfman McInnes   }
9603a40ed3dSBarry Smith   PetscFunctionReturn(0);
961ae80bb75SLois Curfman McInnes }
962ae80bb75SLois Curfman McInnes 
963289bc588SBarry Smith /* -----------------------------------------------------------------*/
964289bc588SBarry Smith 
9654a2ae208SSatish Balay #undef __FUNCT__
9665bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
967e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
968aabbc4fbSShri Abhyankar {
969aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
970aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
971aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
972aabbc4fbSShri Abhyankar   int            fd;
973aabbc4fbSShri Abhyankar   PetscMPIInt    size;
974aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
975aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
976ce94432eSBarry Smith   MPI_Comm       comm;
977aabbc4fbSShri Abhyankar 
978aabbc4fbSShri Abhyankar   PetscFunctionBegin;
979c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
980c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
981ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
982aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
983aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
984aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
985aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
986aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
987aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
988aabbc4fbSShri Abhyankar 
989aabbc4fbSShri Abhyankar   /* set global size if not set already*/
990aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
991aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
992aabbc4fbSShri Abhyankar   } else {
993aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
994aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
995aabbc4fbSShri 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);
996aabbc4fbSShri Abhyankar   }
997e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
998e6324fbbSBarry Smith   if (!a->user_alloc) {
9990298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1000e6324fbbSBarry Smith   }
1001aabbc4fbSShri Abhyankar 
1002aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
1003aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
1004aabbc4fbSShri Abhyankar     v = a->v;
1005aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
1006aabbc4fbSShri Abhyankar        from row major to column major */
1007854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
1008aabbc4fbSShri Abhyankar     /* read in nonzero values */
1009aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
1010aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
1011aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
1012aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
1013aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
1014aabbc4fbSShri Abhyankar       }
1015aabbc4fbSShri Abhyankar     }
1016aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
1017aabbc4fbSShri Abhyankar   } else {
1018aabbc4fbSShri Abhyankar     /* read row lengths */
1019854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
1020aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
1021aabbc4fbSShri Abhyankar 
1022aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
1023aabbc4fbSShri Abhyankar     v = a->v;
1024aabbc4fbSShri Abhyankar 
1025aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
1026854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
1027aabbc4fbSShri Abhyankar     cols = scols;
1028aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
1029854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
1030aabbc4fbSShri Abhyankar     vals = svals;
1031aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
1032aabbc4fbSShri Abhyankar 
1033aabbc4fbSShri Abhyankar     /* insert into matrix */
1034aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
1035aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
1036aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
1037aabbc4fbSShri Abhyankar     }
1038aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1039aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
1040aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
1041aabbc4fbSShri Abhyankar   }
1042aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1043aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1044aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
1045aabbc4fbSShri Abhyankar }
1046aabbc4fbSShri Abhyankar 
1047aabbc4fbSShri Abhyankar #undef __FUNCT__
10484a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
10496849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
1050289bc588SBarry Smith {
1051932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
1052dfbe8321SBarry Smith   PetscErrorCode    ierr;
105313f74950SBarry Smith   PetscInt          i,j;
10542dcb1b2aSMatthew Knepley   const char        *name;
105587828ca2SBarry Smith   PetscScalar       *v;
1056f3ef73ceSBarry Smith   PetscViewerFormat format;
10575f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
1058ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
10595f481a85SSatish Balay #endif
1060932b0c3eSLois Curfman McInnes 
10613a40ed3dSBarry Smith   PetscFunctionBegin;
1062b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1063456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
10643a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1065fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1066d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1067d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
106844cd7ae7SLois Curfman McInnes       v    = a->v + i;
106977431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1070d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1071aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1072329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
107357622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1074329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
107557622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10766831982aSBarry Smith         }
107780cd9d93SLois Curfman McInnes #else
10786831982aSBarry Smith         if (*v) {
107957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10806831982aSBarry Smith         }
108180cd9d93SLois Curfman McInnes #endif
10821b807ce4Svictorle         v += a->lda;
108380cd9d93SLois Curfman McInnes       }
1084b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
108580cd9d93SLois Curfman McInnes     }
1086d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10873a40ed3dSBarry Smith   } else {
1088d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1089aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
109047989497SBarry Smith     /* determine if matrix has all real values */
109147989497SBarry Smith     v = a->v;
1092d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1093ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
109447989497SBarry Smith     }
109547989497SBarry Smith #endif
1096fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10973a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1098d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1099d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1100fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1101ffac6cdbSBarry Smith     }
1102ffac6cdbSBarry Smith 
1103d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1104932b0c3eSLois Curfman McInnes       v = a->v + i;
1105d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1106aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
110747989497SBarry Smith         if (allreal) {
1108c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
110947989497SBarry Smith         } else {
1110c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
111147989497SBarry Smith         }
1112289bc588SBarry Smith #else
1113c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1114289bc588SBarry Smith #endif
11151b807ce4Svictorle         v += a->lda;
1116289bc588SBarry Smith       }
1117b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1118289bc588SBarry Smith     }
1119fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1120b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1121ffac6cdbSBarry Smith     }
1122d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1123da3a660dSBarry Smith   }
1124b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
11253a40ed3dSBarry Smith   PetscFunctionReturn(0);
1126289bc588SBarry Smith }
1127289bc588SBarry Smith 
11284a2ae208SSatish Balay #undef __FUNCT__
11294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
11306849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1131932b0c3eSLois Curfman McInnes {
1132932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11336849ba73SBarry Smith   PetscErrorCode    ierr;
113413f74950SBarry Smith   int               fd;
1135d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1136f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1137f4403165SShri Abhyankar   PetscViewerFormat format;
1138932b0c3eSLois Curfman McInnes 
11393a40ed3dSBarry Smith   PetscFunctionBegin;
1140b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
114190ace30eSBarry Smith 
1142f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1143f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1144f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1145785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
11462205254eSKarl Rupp 
1147f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1148f4403165SShri Abhyankar     col_lens[1] = m;
1149f4403165SShri Abhyankar     col_lens[2] = n;
1150f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
11512205254eSKarl Rupp 
1152f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1153f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1154f4403165SShri Abhyankar 
1155f4403165SShri Abhyankar     /* write out matrix, by rows */
1156854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1157f4403165SShri Abhyankar     v    = a->v;
1158f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1159f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1160f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1161f4403165SShri Abhyankar       }
1162f4403165SShri Abhyankar     }
1163f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1164f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1165f4403165SShri Abhyankar   } else {
1166854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11672205254eSKarl Rupp 
11680700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1169932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1170932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1171932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1172932b0c3eSLois Curfman McInnes 
1173932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1174932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11756f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1176932b0c3eSLois Curfman McInnes 
1177932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1178932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1179932b0c3eSLois Curfman McInnes     ict = 0;
1180932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1181932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1182932b0c3eSLois Curfman McInnes     }
11836f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1184606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1185932b0c3eSLois Curfman McInnes 
1186932b0c3eSLois Curfman McInnes     /* store nonzero values */
1187854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1188932b0c3eSLois Curfman McInnes     ict  = 0;
1189932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1190932b0c3eSLois Curfman McInnes       v = a->v + i;
1191932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11921b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1193932b0c3eSLois Curfman McInnes       }
1194932b0c3eSLois Curfman McInnes     }
11956f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1196606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1197f4403165SShri Abhyankar   }
11983a40ed3dSBarry Smith   PetscFunctionReturn(0);
1199932b0c3eSLois Curfman McInnes }
1200932b0c3eSLois Curfman McInnes 
12019804daf3SBarry Smith #include <petscdraw.h>
12024a2ae208SSatish Balay #undef __FUNCT__
12034a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1204e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1205f1af5d2fSBarry Smith {
1206f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1207f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
12086849ba73SBarry Smith   PetscErrorCode    ierr;
1209383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1210383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
121187828ca2SBarry Smith   PetscScalar       *v = a->v;
1212b0a32e0cSBarry Smith   PetscViewer       viewer;
1213b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1214f3ef73ceSBarry Smith   PetscViewerFormat format;
1215f1af5d2fSBarry Smith 
1216f1af5d2fSBarry Smith   PetscFunctionBegin;
1217f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1218b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1219b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1220f1af5d2fSBarry Smith 
1221f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1222383922c3SLisandro Dalcin 
1223fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1224383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1225f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1226f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1227383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1228f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1229f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1230f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1231329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1232b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1233329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1234b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1235f1af5d2fSBarry Smith         } else {
1236f1af5d2fSBarry Smith           continue;
1237f1af5d2fSBarry Smith         }
1238b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1239f1af5d2fSBarry Smith       }
1240f1af5d2fSBarry Smith     }
1241383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1242f1af5d2fSBarry Smith   } else {
1243f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1244f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1245b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1246b05fc000SLisandro Dalcin     PetscDraw popup;
1247b05fc000SLisandro Dalcin 
1248f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1249f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1250f1af5d2fSBarry Smith     }
1251383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1252b0a32e0cSBarry Smith     ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
125345f3bb6eSLisandro Dalcin     ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);
1254383922c3SLisandro Dalcin 
1255383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1256f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1257f1af5d2fSBarry Smith       x_l = j;
1258f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1259f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1260f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1261f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1262b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1263b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1264f1af5d2fSBarry Smith       }
1265f1af5d2fSBarry Smith     }
1266383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1267f1af5d2fSBarry Smith   }
1268f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1269f1af5d2fSBarry Smith }
1270f1af5d2fSBarry Smith 
12714a2ae208SSatish Balay #undef __FUNCT__
12724a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1273e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1274f1af5d2fSBarry Smith {
1275b0a32e0cSBarry Smith   PetscDraw      draw;
1276ace3abfcSBarry Smith   PetscBool      isnull;
1277329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1278dfbe8321SBarry Smith   PetscErrorCode ierr;
1279f1af5d2fSBarry Smith 
1280f1af5d2fSBarry Smith   PetscFunctionBegin;
1281b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1282b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1283abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1284f1af5d2fSBarry Smith 
1285d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1286f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1287b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1288832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1289b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12900298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1291832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1292f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1293f1af5d2fSBarry Smith }
1294f1af5d2fSBarry Smith 
12954a2ae208SSatish Balay #undef __FUNCT__
12964a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1297dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1298932b0c3eSLois Curfman McInnes {
1299dfbe8321SBarry Smith   PetscErrorCode ierr;
1300ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1301932b0c3eSLois Curfman McInnes 
13023a40ed3dSBarry Smith   PetscFunctionBegin;
1303251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1304251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1305251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
13060f5bd95cSBarry Smith 
1307c45a1595SBarry Smith   if (iascii) {
1308c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
13090f5bd95cSBarry Smith   } else if (isbinary) {
13103a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1311f1af5d2fSBarry Smith   } else if (isdraw) {
1312f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1313932b0c3eSLois Curfman McInnes   }
13143a40ed3dSBarry Smith   PetscFunctionReturn(0);
1315932b0c3eSLois Curfman McInnes }
1316289bc588SBarry Smith 
13174a2ae208SSatish Balay #undef __FUNCT__
13184a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1319e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat)
1320289bc588SBarry Smith {
1321ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1322dfbe8321SBarry Smith   PetscErrorCode ierr;
132390f02eecSBarry Smith 
13243a40ed3dSBarry Smith   PetscFunctionBegin;
1325aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1326d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1327a5a9c739SBarry Smith #endif
132805b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1329abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
13306857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1331bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1332dbd8c25aSHong Zhang 
1333dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1334bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1335bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
13368baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
13378baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
13388baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
13398baccfbdSHong Zhang #endif
1340bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1341bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1342bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1343bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1344abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13453bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13463bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13473bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
13483a40ed3dSBarry Smith   PetscFunctionReturn(0);
1349289bc588SBarry Smith }
1350289bc588SBarry Smith 
13514a2ae208SSatish Balay #undef __FUNCT__
13524a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1353e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1354289bc588SBarry Smith {
1355c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
13566849ba73SBarry Smith   PetscErrorCode ierr;
135713f74950SBarry Smith   PetscInt       k,j,m,n,M;
135887828ca2SBarry Smith   PetscScalar    *v,tmp;
135948b35521SBarry Smith 
13603a40ed3dSBarry Smith   PetscFunctionBegin;
1361d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1362*cf37664fSBarry Smith   if (reuse == MAT_INPLACE_MATRIX) { /* in place transpose */
1363e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1364e7e72b3dSBarry Smith     else {
1365d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1366289bc588SBarry Smith         for (k=0; k<j; k++) {
13671b807ce4Svictorle           tmp        = v[j + k*M];
13681b807ce4Svictorle           v[j + k*M] = v[k + j*M];
13691b807ce4Svictorle           v[k + j*M] = tmp;
1370289bc588SBarry Smith         }
1371289bc588SBarry Smith       }
1372d64ed03dSBarry Smith     }
13733a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1374d3e5ee88SLois Curfman McInnes     Mat          tmat;
1375ec8511deSBarry Smith     Mat_SeqDense *tmatd;
137687828ca2SBarry Smith     PetscScalar  *v2;
1377af36a384SStefano Zampini     PetscInt     M2;
1378ea709b57SSatish Balay 
1379fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1380ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1381d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13827adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13830298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1384fc4dec0aSBarry Smith     } else {
1385fc4dec0aSBarry Smith       tmat = *matout;
1386fc4dec0aSBarry Smith     }
1387ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1388af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1389d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1390af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1391d3e5ee88SLois Curfman McInnes     }
13926d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13936d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1394d3e5ee88SLois Curfman McInnes     *matout = tmat;
139548b35521SBarry Smith   }
13963a40ed3dSBarry Smith   PetscFunctionReturn(0);
1397289bc588SBarry Smith }
1398289bc588SBarry Smith 
13994a2ae208SSatish Balay #undef __FUNCT__
14004a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1401e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1402289bc588SBarry Smith {
1403c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1404c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
140513f74950SBarry Smith   PetscInt     i,j;
1406a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
14079ea5d5aeSSatish Balay 
14083a40ed3dSBarry Smith   PetscFunctionBegin;
1409d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1410d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1411d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
14121b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1413d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
14143a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
14151b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
14161b807ce4Svictorle     }
1417289bc588SBarry Smith   }
141877c4ece6SBarry Smith   *flg = PETSC_TRUE;
14193a40ed3dSBarry Smith   PetscFunctionReturn(0);
1420289bc588SBarry Smith }
1421289bc588SBarry Smith 
14224a2ae208SSatish Balay #undef __FUNCT__
14234a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1424e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1425289bc588SBarry Smith {
1426c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1427dfbe8321SBarry Smith   PetscErrorCode ierr;
142813f74950SBarry Smith   PetscInt       i,n,len;
142987828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
143044cd7ae7SLois Curfman McInnes 
14313a40ed3dSBarry Smith   PetscFunctionBegin;
14322dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
14337a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
14341ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1435d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1436e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
143744cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
14381b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1439289bc588SBarry Smith   }
14401ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
14413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1442289bc588SBarry Smith }
1443289bc588SBarry Smith 
14444a2ae208SSatish Balay #undef __FUNCT__
14454a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1446e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1447289bc588SBarry Smith {
1448c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1449f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1450f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1451dfbe8321SBarry Smith   PetscErrorCode    ierr;
1452d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
145355659b69SBarry Smith 
14543a40ed3dSBarry Smith   PetscFunctionBegin;
145528988994SBarry Smith   if (ll) {
14567a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1457f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1458e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1459da3a660dSBarry Smith     for (i=0; i<m; i++) {
1460da3a660dSBarry Smith       x = l[i];
1461da3a660dSBarry Smith       v = mat->v + i;
1462b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1463da3a660dSBarry Smith     }
1464f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1465eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1466da3a660dSBarry Smith   }
146728988994SBarry Smith   if (rr) {
14687a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1469f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1470e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1471da3a660dSBarry Smith     for (i=0; i<n; i++) {
1472da3a660dSBarry Smith       x = r[i];
1473b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14742205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1475da3a660dSBarry Smith     }
1476f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1477eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1478da3a660dSBarry Smith   }
14793a40ed3dSBarry Smith   PetscFunctionReturn(0);
1480289bc588SBarry Smith }
1481289bc588SBarry Smith 
14824a2ae208SSatish Balay #undef __FUNCT__
14834a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1484e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1485289bc588SBarry Smith {
1486c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
148787828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1488329f5518SBarry Smith   PetscReal      sum  = 0.0;
1489d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1490efee365bSSatish Balay   PetscErrorCode ierr;
149155659b69SBarry Smith 
14923a40ed3dSBarry Smith   PetscFunctionBegin;
1493289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1494a5ce6ee0Svictorle     if (lda>m) {
1495d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1496a5ce6ee0Svictorle         v = mat->v+j*lda;
1497a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1498a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1499a5ce6ee0Svictorle         }
1500a5ce6ee0Svictorle       }
1501a5ce6ee0Svictorle     } else {
1502570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16)
1503570b7f6dSBarry Smith       PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n;
1504570b7f6dSBarry Smith       *nrm = BLASnrm2_(&cnt,v,&one);
1505570b7f6dSBarry Smith     }
1506570b7f6dSBarry Smith #else
1507d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1508329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1509289bc588SBarry Smith       }
1510a5ce6ee0Svictorle     }
15118f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1512570b7f6dSBarry Smith #endif
1513dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15143a40ed3dSBarry Smith   } else if (type == NORM_1) {
1515064f8208SBarry Smith     *nrm = 0.0;
1516d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
15171b807ce4Svictorle       v   = mat->v + j*mat->lda;
1518289bc588SBarry Smith       sum = 0.0;
1519d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
152033a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1521289bc588SBarry Smith       }
1522064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1523289bc588SBarry Smith     }
1524eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15253a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1526064f8208SBarry Smith     *nrm = 0.0;
1527d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1528289bc588SBarry Smith       v   = mat->v + j;
1529289bc588SBarry Smith       sum = 0.0;
1530d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
15311b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1532289bc588SBarry Smith       }
1533064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1534289bc588SBarry Smith     }
1535eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1536e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
15373a40ed3dSBarry Smith   PetscFunctionReturn(0);
1538289bc588SBarry Smith }
1539289bc588SBarry Smith 
15404a2ae208SSatish Balay #undef __FUNCT__
15414a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1542e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1543289bc588SBarry Smith {
1544c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
154563ba0a88SBarry Smith   PetscErrorCode ierr;
154667e560aaSBarry Smith 
15473a40ed3dSBarry Smith   PetscFunctionBegin;
1548b5a2b587SKris Buschelman   switch (op) {
1549b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
15504e0d8c25SBarry Smith     aij->roworiented = flg;
1551b5a2b587SKris Buschelman     break;
1552512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1553b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
15543971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
15554e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
155613fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1557b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1558b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
15595021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
15605021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
15615021d80fSJed Brown     break;
15625021d80fSJed Brown   case MAT_SPD:
156377e54ba9SKris Buschelman   case MAT_SYMMETRIC:
156477e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
15659a4540c5SBarry Smith   case MAT_HERMITIAN:
15669a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
15675021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
156877e54ba9SKris Buschelman     break;
1569b5a2b587SKris Buschelman   default:
1570e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
15713a40ed3dSBarry Smith   }
15723a40ed3dSBarry Smith   PetscFunctionReturn(0);
1573289bc588SBarry Smith }
1574289bc588SBarry Smith 
15754a2ae208SSatish Balay #undef __FUNCT__
15764a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1577e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15786f0a148fSBarry Smith {
1579ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15806849ba73SBarry Smith   PetscErrorCode ierr;
1581d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15823a40ed3dSBarry Smith 
15833a40ed3dSBarry Smith   PetscFunctionBegin;
1584a5ce6ee0Svictorle   if (lda>m) {
1585d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1586a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1587a5ce6ee0Svictorle     }
1588a5ce6ee0Svictorle   } else {
1589d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1590a5ce6ee0Svictorle   }
15913a40ed3dSBarry Smith   PetscFunctionReturn(0);
15926f0a148fSBarry Smith }
15936f0a148fSBarry Smith 
15944a2ae208SSatish Balay #undef __FUNCT__
15954a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1596e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15976f0a148fSBarry Smith {
159897b48c8fSBarry Smith   PetscErrorCode    ierr;
1599ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1600b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
160197b48c8fSBarry Smith   PetscScalar       *slot,*bb;
160297b48c8fSBarry Smith   const PetscScalar *xx;
160355659b69SBarry Smith 
16043a40ed3dSBarry Smith   PetscFunctionBegin;
1605b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1606b9679d65SBarry Smith   for (i=0; i<N; i++) {
1607b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1608b9679d65SBarry 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);
1609b9679d65SBarry Smith   }
1610b9679d65SBarry Smith #endif
1611b9679d65SBarry Smith 
161297b48c8fSBarry Smith   /* fix right hand side if needed */
161397b48c8fSBarry Smith   if (x && b) {
161497b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
161597b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
16162205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
161797b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
161897b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
161997b48c8fSBarry Smith   }
162097b48c8fSBarry Smith 
16216f0a148fSBarry Smith   for (i=0; i<N; i++) {
16226f0a148fSBarry Smith     slot = l->v + rows[i];
1623b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
16246f0a148fSBarry Smith   }
1625f4df32b1SMatthew Knepley   if (diag != 0.0) {
1626b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
16276f0a148fSBarry Smith     for (i=0; i<N; i++) {
1628b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1629f4df32b1SMatthew Knepley       *slot = diag;
16306f0a148fSBarry Smith     }
16316f0a148fSBarry Smith   }
16323a40ed3dSBarry Smith   PetscFunctionReturn(0);
16336f0a148fSBarry Smith }
1634557bce09SLois Curfman McInnes 
16354a2ae208SSatish Balay #undef __FUNCT__
16368c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1637e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
163864e87e97SBarry Smith {
1639c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
16403a40ed3dSBarry Smith 
16413a40ed3dSBarry Smith   PetscFunctionBegin;
1642e32f2f54SBarry 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");
164364e87e97SBarry Smith   *array = mat->v;
16443a40ed3dSBarry Smith   PetscFunctionReturn(0);
164564e87e97SBarry Smith }
16460754003eSLois Curfman McInnes 
16474a2ae208SSatish Balay #undef __FUNCT__
16488c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1649e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1650ff14e315SSatish Balay {
16513a40ed3dSBarry Smith   PetscFunctionBegin;
165209b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
16533a40ed3dSBarry Smith   PetscFunctionReturn(0);
1654ff14e315SSatish Balay }
16550754003eSLois Curfman McInnes 
16564a2ae208SSatish Balay #undef __FUNCT__
16578c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1658dec5eb66SMatthew G Knepley /*@C
16598c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
166073a71a0fSBarry Smith 
166173a71a0fSBarry Smith    Not Collective
166273a71a0fSBarry Smith 
166373a71a0fSBarry Smith    Input Parameter:
1664579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
166573a71a0fSBarry Smith 
166673a71a0fSBarry Smith    Output Parameter:
166773a71a0fSBarry Smith .   array - pointer to the data
166873a71a0fSBarry Smith 
166973a71a0fSBarry Smith    Level: intermediate
167073a71a0fSBarry Smith 
16718c778c55SBarry Smith .seealso: MatDenseRestoreArray()
167273a71a0fSBarry Smith @*/
16738c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
167473a71a0fSBarry Smith {
167573a71a0fSBarry Smith   PetscErrorCode ierr;
167673a71a0fSBarry Smith 
167773a71a0fSBarry Smith   PetscFunctionBegin;
16788c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
167973a71a0fSBarry Smith   PetscFunctionReturn(0);
168073a71a0fSBarry Smith }
168173a71a0fSBarry Smith 
168273a71a0fSBarry Smith #undef __FUNCT__
16838c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1684dec5eb66SMatthew G Knepley /*@C
1685579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
168673a71a0fSBarry Smith 
168773a71a0fSBarry Smith    Not Collective
168873a71a0fSBarry Smith 
168973a71a0fSBarry Smith    Input Parameters:
1690579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
169173a71a0fSBarry Smith .  array - pointer to the data
169273a71a0fSBarry Smith 
169373a71a0fSBarry Smith    Level: intermediate
169473a71a0fSBarry Smith 
16958c778c55SBarry Smith .seealso: MatDenseGetArray()
169673a71a0fSBarry Smith @*/
16978c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
169873a71a0fSBarry Smith {
169973a71a0fSBarry Smith   PetscErrorCode ierr;
170073a71a0fSBarry Smith 
170173a71a0fSBarry Smith   PetscFunctionBegin;
17028c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
170373a71a0fSBarry Smith   PetscFunctionReturn(0);
170473a71a0fSBarry Smith }
170573a71a0fSBarry Smith 
170673a71a0fSBarry Smith #undef __FUNCT__
17074a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
170813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
17090754003eSLois Curfman McInnes {
1710c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
17116849ba73SBarry Smith   PetscErrorCode ierr;
17125d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
17135d0c19d7SBarry Smith   const PetscInt *irow,*icol;
171487828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
17150754003eSLois Curfman McInnes   Mat            newmat;
17160754003eSLois Curfman McInnes 
17173a40ed3dSBarry Smith   PetscFunctionBegin;
171878b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
171978b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1720e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1721e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
17220754003eSLois Curfman McInnes 
1723182d2002SSatish Balay   /* Check submatrixcall */
1724182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
172513f74950SBarry Smith     PetscInt n_cols,n_rows;
1726182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
172721a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1728f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1729c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
173021a2c019SBarry Smith     }
1731182d2002SSatish Balay     newmat = *B;
1732182d2002SSatish Balay   } else {
17330754003eSLois Curfman McInnes     /* Create and fill new matrix */
1734ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1735f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
17367adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
17370298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1738182d2002SSatish Balay   }
1739182d2002SSatish Balay 
1740182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1741182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1742182d2002SSatish Balay 
1743182d2002SSatish Balay   for (i=0; i<ncols; i++) {
17446de62eeeSBarry Smith     av = v + mat->lda*icol[i];
17452205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
17460754003eSLois Curfman McInnes   }
1747182d2002SSatish Balay 
1748182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
17496d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17506d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17510754003eSLois Curfman McInnes 
17520754003eSLois Curfman McInnes   /* Free work space */
175378b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
175478b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1755182d2002SSatish Balay   *B   = newmat;
17563a40ed3dSBarry Smith   PetscFunctionReturn(0);
17570754003eSLois Curfman McInnes }
17580754003eSLois Curfman McInnes 
17594a2ae208SSatish Balay #undef __FUNCT__
17604a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1761e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1762905e6a2fSBarry Smith {
17636849ba73SBarry Smith   PetscErrorCode ierr;
176413f74950SBarry Smith   PetscInt       i;
1765905e6a2fSBarry Smith 
17663a40ed3dSBarry Smith   PetscFunctionBegin;
1767905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1768854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1769905e6a2fSBarry Smith   }
1770905e6a2fSBarry Smith 
1771905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17726a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1773905e6a2fSBarry Smith   }
17743a40ed3dSBarry Smith   PetscFunctionReturn(0);
1775905e6a2fSBarry Smith }
1776905e6a2fSBarry Smith 
17774a2ae208SSatish Balay #undef __FUNCT__
1778c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1779e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1780c0aa2d19SHong Zhang {
1781c0aa2d19SHong Zhang   PetscFunctionBegin;
1782c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1783c0aa2d19SHong Zhang }
1784c0aa2d19SHong Zhang 
1785c0aa2d19SHong Zhang #undef __FUNCT__
1786c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1787e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1788c0aa2d19SHong Zhang {
1789c0aa2d19SHong Zhang   PetscFunctionBegin;
1790c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1791c0aa2d19SHong Zhang }
1792c0aa2d19SHong Zhang 
1793c0aa2d19SHong Zhang #undef __FUNCT__
17944a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1795e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17964b0e389bSBarry Smith {
17974b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17986849ba73SBarry Smith   PetscErrorCode ierr;
1799d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
18003a40ed3dSBarry Smith 
18013a40ed3dSBarry Smith   PetscFunctionBegin;
180233f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
180333f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1804cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
18053a40ed3dSBarry Smith     PetscFunctionReturn(0);
18063a40ed3dSBarry Smith   }
1807e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1808a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
18090dbb7854Svictorle     for (j=0; j<n; j++) {
1810a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1811a5ce6ee0Svictorle     }
1812a5ce6ee0Svictorle   } else {
1813d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1814a5ce6ee0Svictorle   }
1815273d9f13SBarry Smith   PetscFunctionReturn(0);
1816273d9f13SBarry Smith }
1817273d9f13SBarry Smith 
18184a2ae208SSatish Balay #undef __FUNCT__
18194994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1820e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1821273d9f13SBarry Smith {
1822dfbe8321SBarry Smith   PetscErrorCode ierr;
1823273d9f13SBarry Smith 
1824273d9f13SBarry Smith   PetscFunctionBegin;
1825273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
18263a40ed3dSBarry Smith   PetscFunctionReturn(0);
18274b0e389bSBarry Smith }
18284b0e389bSBarry Smith 
1829284134d9SBarry Smith #undef __FUNCT__
1830ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1831ba337c44SJed Brown static PetscErrorCode MatConjugate_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] = PetscConj(aa[i]);
1839ba337c44SJed Brown   PetscFunctionReturn(0);
1840ba337c44SJed Brown }
1841ba337c44SJed Brown 
1842ba337c44SJed Brown #undef __FUNCT__
1843ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1844ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1845ba337c44SJed Brown {
1846ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1847ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1848ba337c44SJed Brown   PetscScalar  *aa = a->v;
1849ba337c44SJed Brown 
1850ba337c44SJed Brown   PetscFunctionBegin;
1851ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1852ba337c44SJed Brown   PetscFunctionReturn(0);
1853ba337c44SJed Brown }
1854ba337c44SJed Brown 
1855ba337c44SJed Brown #undef __FUNCT__
1856ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1857ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1858ba337c44SJed Brown {
1859ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1860ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1861ba337c44SJed Brown   PetscScalar  *aa = a->v;
1862ba337c44SJed Brown 
1863ba337c44SJed Brown   PetscFunctionBegin;
1864ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1865ba337c44SJed Brown   PetscFunctionReturn(0);
1866ba337c44SJed Brown }
1867284134d9SBarry Smith 
1868a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1869a9fe9ddaSSatish Balay #undef __FUNCT__
1870a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1871150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1872a9fe9ddaSSatish Balay {
1873a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1874a9fe9ddaSSatish Balay 
1875a9fe9ddaSSatish Balay   PetscFunctionBegin;
1876a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18773ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1878a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18793ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1880a9fe9ddaSSatish Balay   }
18813ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1882a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18833ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1884a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1885a9fe9ddaSSatish Balay }
1886a9fe9ddaSSatish Balay 
1887a9fe9ddaSSatish Balay #undef __FUNCT__
1888a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1889a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1890a9fe9ddaSSatish Balay {
1891ee16a9a1SHong Zhang   PetscErrorCode ierr;
1892d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1893ee16a9a1SHong Zhang   Mat            Cmat;
1894a9fe9ddaSSatish Balay 
1895ee16a9a1SHong Zhang   PetscFunctionBegin;
1896e32f2f54SBarry 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);
1897ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1898ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1899ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19000298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1901d73949e8SHong Zhang 
1902ee16a9a1SHong Zhang   *C = Cmat;
1903ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1904ee16a9a1SHong Zhang }
1905a9fe9ddaSSatish Balay 
190698a3b096SSatish Balay #undef __FUNCT__
1907a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1908a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1909a9fe9ddaSSatish Balay {
1910a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1911a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1912a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19130805154bSBarry Smith   PetscBLASInt   m,n,k;
1914a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1915c5df96a5SBarry Smith   PetscErrorCode ierr;
1916fd4e9aacSBarry Smith   PetscBool      flg;
1917a9fe9ddaSSatish Balay 
1918a9fe9ddaSSatish Balay   PetscFunctionBegin;
1919fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1920fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1921fd4e9aacSBarry Smith 
1922fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1923fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1924fd4e9aacSBarry Smith   if (flg) {
1925fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1926fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1927fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1928fd4e9aacSBarry Smith   }
1929fd4e9aacSBarry Smith 
1930fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1931fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1932c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1933c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1934c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
19355ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1936a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1937a9fe9ddaSSatish Balay }
1938a9fe9ddaSSatish Balay 
1939a9fe9ddaSSatish Balay #undef __FUNCT__
194075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
194175648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1942a9fe9ddaSSatish Balay {
1943a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1944a9fe9ddaSSatish Balay 
1945a9fe9ddaSSatish Balay   PetscFunctionBegin;
1946a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
19473ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
194875648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
19493ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1950a9fe9ddaSSatish Balay   }
19513ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
195275648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
19533ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1954a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1955a9fe9ddaSSatish Balay }
1956a9fe9ddaSSatish Balay 
1957a9fe9ddaSSatish Balay #undef __FUNCT__
195875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
195975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1960a9fe9ddaSSatish Balay {
1961ee16a9a1SHong Zhang   PetscErrorCode ierr;
1962d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1963ee16a9a1SHong Zhang   Mat            Cmat;
1964a9fe9ddaSSatish Balay 
1965ee16a9a1SHong Zhang   PetscFunctionBegin;
1966e32f2f54SBarry 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);
1967ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1968ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1969ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19700298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
19712205254eSKarl Rupp 
1972ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19732205254eSKarl Rupp 
1974ee16a9a1SHong Zhang   *C = Cmat;
1975ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1976ee16a9a1SHong Zhang }
1977a9fe9ddaSSatish Balay 
1978a9fe9ddaSSatish Balay #undef __FUNCT__
197975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
198075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1981a9fe9ddaSSatish Balay {
1982a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1983a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1984a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19850805154bSBarry Smith   PetscBLASInt   m,n,k;
1986a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1987c5df96a5SBarry Smith   PetscErrorCode ierr;
1988a9fe9ddaSSatish Balay 
1989a9fe9ddaSSatish Balay   PetscFunctionBegin;
1990c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1991c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1992c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19932fbe02b9SBarry Smith   /*
19942fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19952fbe02b9SBarry Smith   */
19965ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1997a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1998a9fe9ddaSSatish Balay }
1999985db425SBarry Smith 
2000985db425SBarry Smith #undef __FUNCT__
2001985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
2002e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
2003985db425SBarry Smith {
2004985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2005985db425SBarry Smith   PetscErrorCode ierr;
2006d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2007985db425SBarry Smith   PetscScalar    *x;
2008985db425SBarry Smith   MatScalar      *aa = a->v;
2009985db425SBarry Smith 
2010985db425SBarry Smith   PetscFunctionBegin;
2011e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2012985db425SBarry Smith 
2013985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2014985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2015985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2016e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2017985db425SBarry Smith   for (i=0; i<m; i++) {
2018985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2019985db425SBarry Smith     for (j=1; j<n; j++) {
2020985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2021985db425SBarry Smith     }
2022985db425SBarry Smith   }
2023985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2024985db425SBarry Smith   PetscFunctionReturn(0);
2025985db425SBarry Smith }
2026985db425SBarry Smith 
2027985db425SBarry Smith #undef __FUNCT__
2028985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
2029e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2030985db425SBarry Smith {
2031985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2032985db425SBarry Smith   PetscErrorCode ierr;
2033d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2034985db425SBarry Smith   PetscScalar    *x;
2035985db425SBarry Smith   PetscReal      atmp;
2036985db425SBarry Smith   MatScalar      *aa = a->v;
2037985db425SBarry Smith 
2038985db425SBarry Smith   PetscFunctionBegin;
2039e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2040985db425SBarry Smith 
2041985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2042985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2043985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2044e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2045985db425SBarry Smith   for (i=0; i<m; i++) {
20469189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2047985db425SBarry Smith     for (j=1; j<n; j++) {
2048985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
2049985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2050985db425SBarry Smith     }
2051985db425SBarry Smith   }
2052985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2053985db425SBarry Smith   PetscFunctionReturn(0);
2054985db425SBarry Smith }
2055985db425SBarry Smith 
2056985db425SBarry Smith #undef __FUNCT__
2057985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
2058e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2059985db425SBarry Smith {
2060985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2061985db425SBarry Smith   PetscErrorCode ierr;
2062d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2063985db425SBarry Smith   PetscScalar    *x;
2064985db425SBarry Smith   MatScalar      *aa = a->v;
2065985db425SBarry Smith 
2066985db425SBarry Smith   PetscFunctionBegin;
2067e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2068985db425SBarry Smith 
2069985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2070985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2071985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2072e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2073985db425SBarry Smith   for (i=0; i<m; i++) {
2074985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2075985db425SBarry Smith     for (j=1; j<n; j++) {
2076985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2077985db425SBarry Smith     }
2078985db425SBarry Smith   }
2079985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2080985db425SBarry Smith   PetscFunctionReturn(0);
2081985db425SBarry Smith }
2082985db425SBarry Smith 
20838d0534beSBarry Smith #undef __FUNCT__
20848d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2085e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20868d0534beSBarry Smith {
20878d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20888d0534beSBarry Smith   PetscErrorCode ierr;
20898d0534beSBarry Smith   PetscScalar    *x;
20908d0534beSBarry Smith 
20918d0534beSBarry Smith   PetscFunctionBegin;
2092e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20938d0534beSBarry Smith 
20948d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2095d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20968d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20978d0534beSBarry Smith   PetscFunctionReturn(0);
20988d0534beSBarry Smith }
20998d0534beSBarry Smith 
21000716a85fSBarry Smith 
21010716a85fSBarry Smith #undef __FUNCT__
21020716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
21030716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
21040716a85fSBarry Smith {
21050716a85fSBarry Smith   PetscErrorCode ierr;
21060716a85fSBarry Smith   PetscInt       i,j,m,n;
21070716a85fSBarry Smith   PetscScalar    *a;
21080716a85fSBarry Smith 
21090716a85fSBarry Smith   PetscFunctionBegin;
21100716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
21110716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
21128c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
21130716a85fSBarry Smith   if (type == NORM_2) {
21140716a85fSBarry Smith     for (i=0; i<n; i++) {
21150716a85fSBarry Smith       for (j=0; j<m; j++) {
21160716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
21170716a85fSBarry Smith       }
21180716a85fSBarry Smith       a += m;
21190716a85fSBarry Smith     }
21200716a85fSBarry Smith   } else if (type == NORM_1) {
21210716a85fSBarry Smith     for (i=0; i<n; i++) {
21220716a85fSBarry Smith       for (j=0; j<m; j++) {
21230716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
21240716a85fSBarry Smith       }
21250716a85fSBarry Smith       a += m;
21260716a85fSBarry Smith     }
21270716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
21280716a85fSBarry Smith     for (i=0; i<n; i++) {
21290716a85fSBarry Smith       for (j=0; j<m; j++) {
21300716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
21310716a85fSBarry Smith       }
21320716a85fSBarry Smith       a += m;
21330716a85fSBarry Smith     }
2134ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
21358c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
21360716a85fSBarry Smith   if (type == NORM_2) {
21378f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
21380716a85fSBarry Smith   }
21390716a85fSBarry Smith   PetscFunctionReturn(0);
21400716a85fSBarry Smith }
21410716a85fSBarry Smith 
214273a71a0fSBarry Smith #undef __FUNCT__
214373a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
214473a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
214573a71a0fSBarry Smith {
214673a71a0fSBarry Smith   PetscErrorCode ierr;
214773a71a0fSBarry Smith   PetscScalar    *a;
214873a71a0fSBarry Smith   PetscInt       m,n,i;
214973a71a0fSBarry Smith 
215073a71a0fSBarry Smith   PetscFunctionBegin;
215173a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
21528c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
215373a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
215473a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
215573a71a0fSBarry Smith   }
21568c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
215773a71a0fSBarry Smith   PetscFunctionReturn(0);
215873a71a0fSBarry Smith }
215973a71a0fSBarry Smith 
21603b49f96aSBarry Smith #undef __FUNCT__
21613b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
21623b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
21633b49f96aSBarry Smith {
21643b49f96aSBarry Smith   PetscFunctionBegin;
21653b49f96aSBarry Smith   *missing = PETSC_FALSE;
21663b49f96aSBarry Smith   PetscFunctionReturn(0);
21673b49f96aSBarry Smith }
216873a71a0fSBarry Smith 
2169abc3b08eSStefano Zampini 
2170289bc588SBarry Smith /* -------------------------------------------------------------------*/
2171a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2172905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2173905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2174905e6a2fSBarry Smith                                         MatMult_SeqDense,
217597304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21767c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21777c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2178db4efbfdSBarry Smith                                         0,
2179db4efbfdSBarry Smith                                         0,
2180db4efbfdSBarry Smith                                         0,
2181db4efbfdSBarry Smith                                 /* 10*/ 0,
2182905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2183905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
218441f059aeSBarry Smith                                         MatSOR_SeqDense,
2185ec8511deSBarry Smith                                         MatTranspose_SeqDense,
218697304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2187905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2188905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2189905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2190905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2191c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2192c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2193905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2194905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2195d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2196db4efbfdSBarry Smith                                         0,
2197db4efbfdSBarry Smith                                         0,
2198db4efbfdSBarry Smith                                         0,
2199db4efbfdSBarry Smith                                         0,
22004994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2201273d9f13SBarry Smith                                         0,
2202905e6a2fSBarry Smith                                         0,
220373a71a0fSBarry Smith                                         0,
220473a71a0fSBarry Smith                                         0,
2205d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2206a5ae1ecdSBarry Smith                                         0,
2207a5ae1ecdSBarry Smith                                         0,
2208a5ae1ecdSBarry Smith                                         0,
2209a5ae1ecdSBarry Smith                                         0,
2210d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2211a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2212a5ae1ecdSBarry Smith                                         0,
22134b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2214a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2215d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2216a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
22177d68702bSBarry Smith                                         MatShift_Basic,
2218a5ae1ecdSBarry Smith                                         0,
22193f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
222073a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2221a5ae1ecdSBarry Smith                                         0,
2222a5ae1ecdSBarry Smith                                         0,
2223a5ae1ecdSBarry Smith                                         0,
2224a5ae1ecdSBarry Smith                                         0,
2225d519adbfSMatthew Knepley                                 /* 54*/ 0,
2226a5ae1ecdSBarry Smith                                         0,
2227a5ae1ecdSBarry Smith                                         0,
2228a5ae1ecdSBarry Smith                                         0,
2229a5ae1ecdSBarry Smith                                         0,
2230d519adbfSMatthew Knepley                                 /* 59*/ 0,
2231e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2232e03a110bSBarry Smith                                         MatView_SeqDense,
2233357abbc8SBarry Smith                                         0,
223497304618SKris Buschelman                                         0,
2235d519adbfSMatthew Knepley                                 /* 64*/ 0,
223697304618SKris Buschelman                                         0,
223797304618SKris Buschelman                                         0,
223897304618SKris Buschelman                                         0,
223997304618SKris Buschelman                                         0,
2240d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
224197304618SKris Buschelman                                         0,
224297304618SKris Buschelman                                         0,
224397304618SKris Buschelman                                         0,
224497304618SKris Buschelman                                         0,
2245d519adbfSMatthew Knepley                                 /* 74*/ 0,
224697304618SKris Buschelman                                         0,
224797304618SKris Buschelman                                         0,
224897304618SKris Buschelman                                         0,
224997304618SKris Buschelman                                         0,
2250d519adbfSMatthew Knepley                                 /* 79*/ 0,
225197304618SKris Buschelman                                         0,
225297304618SKris Buschelman                                         0,
225397304618SKris Buschelman                                         0,
22545bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2255865e5f61SKris Buschelman                                         0,
22561cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2257865e5f61SKris Buschelman                                         0,
2258865e5f61SKris Buschelman                                         0,
2259865e5f61SKris Buschelman                                         0,
2260d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2261a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2262a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2263abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2264abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2265abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
22665df89d91SHong Zhang                                         0,
22675df89d91SHong Zhang                                         0,
22685df89d91SHong Zhang                                         0,
2269284134d9SBarry Smith                                         0,
2270d519adbfSMatthew Knepley                                 /* 99*/ 0,
2271284134d9SBarry Smith                                         0,
2272284134d9SBarry Smith                                         0,
2273ba337c44SJed Brown                                         MatConjugate_SeqDense,
2274f73d5cc4SBarry Smith                                         0,
2275ba337c44SJed Brown                                 /*104*/ 0,
2276ba337c44SJed Brown                                         MatRealPart_SeqDense,
2277ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2278985db425SBarry Smith                                         0,
2279985db425SBarry Smith                                         0,
228085e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2281985db425SBarry Smith                                         0,
22828d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2283aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22843b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2285aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2286aabbc4fbSShri Abhyankar                                         0,
2287aabbc4fbSShri Abhyankar                                         0,
2288aabbc4fbSShri Abhyankar                                         0,
2289aabbc4fbSShri Abhyankar                                         0,
2290aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2291aabbc4fbSShri Abhyankar                                         0,
2292aabbc4fbSShri Abhyankar                                         0,
22930716a85fSBarry Smith                                         0,
22940716a85fSBarry Smith                                         0,
22950716a85fSBarry Smith                                 /*124*/ 0,
22965df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22975df89d91SHong Zhang                                         0,
22985df89d91SHong Zhang                                         0,
22995df89d91SHong Zhang                                         0,
23005df89d91SHong Zhang                                 /*129*/ 0,
230175648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
230275648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
230375648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
23043964eb88SJed Brown                                         0,
23053964eb88SJed Brown                                 /*134*/ 0,
23063964eb88SJed Brown                                         0,
23073964eb88SJed Brown                                         0,
23083964eb88SJed Brown                                         0,
23093964eb88SJed Brown                                         0,
23103964eb88SJed Brown                                 /*139*/ 0,
2311f9426fe0SMark Adams                                         0,
23123964eb88SJed Brown                                         0
2313985db425SBarry Smith };
231490ace30eSBarry Smith 
23154a2ae208SSatish Balay #undef __FUNCT__
23164a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
23174b828684SBarry Smith /*@C
2318fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2319d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2320d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2321289bc588SBarry Smith 
2322db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2323db81eaa0SLois Curfman McInnes 
232420563c6bSBarry Smith    Input Parameters:
2325db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
23260c775827SLois Curfman McInnes .  m - number of rows
232718f449edSLois Curfman McInnes .  n - number of columns
23280298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2329dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
233020563c6bSBarry Smith 
233120563c6bSBarry Smith    Output Parameter:
233244cd7ae7SLois Curfman McInnes .  A - the matrix
233320563c6bSBarry Smith 
2334b259b22eSLois Curfman McInnes    Notes:
233518f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
233618f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
23370298fd71SBarry Smith    set data=NULL.
233818f449edSLois Curfman McInnes 
2339027ccd11SLois Curfman McInnes    Level: intermediate
2340027ccd11SLois Curfman McInnes 
2341dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2342d65003e9SLois Curfman McInnes 
234369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
234420563c6bSBarry Smith @*/
23457087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2346289bc588SBarry Smith {
2347dfbe8321SBarry Smith   PetscErrorCode ierr;
23483b2fbd54SBarry Smith 
23493a40ed3dSBarry Smith   PetscFunctionBegin;
2350f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2351f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2352273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2353273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2354273d9f13SBarry Smith   PetscFunctionReturn(0);
2355273d9f13SBarry Smith }
2356273d9f13SBarry Smith 
23574a2ae208SSatish Balay #undef __FUNCT__
2358afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2359273d9f13SBarry Smith /*@C
2360273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2361273d9f13SBarry Smith 
2362273d9f13SBarry Smith    Collective on MPI_Comm
2363273d9f13SBarry Smith 
2364273d9f13SBarry Smith    Input Parameters:
23651c4f3114SJed Brown +  B - the matrix
23660298fd71SBarry Smith -  data - the array (or NULL)
2367273d9f13SBarry Smith 
2368273d9f13SBarry Smith    Notes:
2369273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2370273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2371284134d9SBarry Smith    need not call this routine.
2372273d9f13SBarry Smith 
2373273d9f13SBarry Smith    Level: intermediate
2374273d9f13SBarry Smith 
2375273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2376273d9f13SBarry Smith 
237769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2378867c911aSBarry Smith 
2379273d9f13SBarry Smith @*/
23807087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2381273d9f13SBarry Smith {
23824ac538c5SBarry Smith   PetscErrorCode ierr;
2383a23d5eceSKris Buschelman 
2384a23d5eceSKris Buschelman   PetscFunctionBegin;
23854ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2386a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2387a23d5eceSKris Buschelman }
2388a23d5eceSKris Buschelman 
2389a23d5eceSKris Buschelman #undef __FUNCT__
2390afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23917087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2392a23d5eceSKris Buschelman {
2393273d9f13SBarry Smith   Mat_SeqDense   *b;
2394dfbe8321SBarry Smith   PetscErrorCode ierr;
2395273d9f13SBarry Smith 
2396273d9f13SBarry Smith   PetscFunctionBegin;
2397273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2398a868139aSShri Abhyankar 
239934ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
240034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
240134ef9618SShri Abhyankar 
2402273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
240386d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
240486d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
240586d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
240686d161a7SShri Abhyankar 
2407220afb94SBarry Smith   ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr);
24089e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
24099e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2410e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
24113bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
24122205254eSKarl Rupp 
24139e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2414273d9f13SBarry Smith   } else { /* user-allocated storage */
24159e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2416273d9f13SBarry Smith     b->v          = data;
2417273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2418273d9f13SBarry Smith   }
24190450473dSBarry Smith   B->assembled = PETSC_TRUE;
2420273d9f13SBarry Smith   PetscFunctionReturn(0);
2421273d9f13SBarry Smith }
2422273d9f13SBarry Smith 
242365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24241b807ce4Svictorle #undef __FUNCT__
24258baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
2426cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
24278baccfbdSHong Zhang {
2428d77f618aSHong Zhang   Mat            mat_elemental;
2429d77f618aSHong Zhang   PetscErrorCode ierr;
2430d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2431d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2432d77f618aSHong Zhang 
24338baccfbdSHong Zhang   PetscFunctionBegin;
2434d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2435d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2436d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2437d77f618aSHong Zhang   k = 0;
2438d77f618aSHong Zhang   for (j=0; j<N; j++) {
2439d77f618aSHong Zhang     cols[j] = j;
2440d77f618aSHong Zhang     for (i=0; i<M; i++) {
2441d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2442d77f618aSHong Zhang     }
2443d77f618aSHong Zhang   }
2444d77f618aSHong Zhang   for (i=0; i<M; i++) {
2445d77f618aSHong Zhang     rows[i] = i;
2446d77f618aSHong Zhang   }
2447d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2448d77f618aSHong Zhang 
2449d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2450d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2451d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2452d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2453d77f618aSHong Zhang 
2454d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2455d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2456d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2457d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2458d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2459d77f618aSHong Zhang 
2460511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
246128be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2462d77f618aSHong Zhang   } else {
2463d77f618aSHong Zhang     *newmat = mat_elemental;
2464d77f618aSHong Zhang   }
24658baccfbdSHong Zhang   PetscFunctionReturn(0);
24668baccfbdSHong Zhang }
246765b80a83SHong Zhang #endif
24688baccfbdSHong Zhang 
24698baccfbdSHong Zhang #undef __FUNCT__
24701b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
24711b807ce4Svictorle /*@C
24721b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24731b807ce4Svictorle 
24741b807ce4Svictorle   Input parameter:
24751b807ce4Svictorle + A - the matrix
24761b807ce4Svictorle - lda - the leading dimension
24771b807ce4Svictorle 
24781b807ce4Svictorle   Notes:
2479867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24801b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24811b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24821b807ce4Svictorle 
24831b807ce4Svictorle   Level: intermediate
24841b807ce4Svictorle 
24851b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24861b807ce4Svictorle 
2487284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2488867c911aSBarry Smith 
24891b807ce4Svictorle @*/
24907087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24911b807ce4Svictorle {
24921b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
249321a2c019SBarry Smith 
24941b807ce4Svictorle   PetscFunctionBegin;
2495e32f2f54SBarry 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);
24961b807ce4Svictorle   b->lda       = lda;
249721a2c019SBarry Smith   b->changelda = PETSC_FALSE;
249821a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24991b807ce4Svictorle   PetscFunctionReturn(0);
25001b807ce4Svictorle }
25011b807ce4Svictorle 
25020bad9183SKris Buschelman /*MC
2503fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
25040bad9183SKris Buschelman 
25050bad9183SKris Buschelman    Options Database Keys:
25060bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
25070bad9183SKris Buschelman 
25080bad9183SKris Buschelman   Level: beginner
25090bad9183SKris Buschelman 
251089665df3SBarry Smith .seealso: MatCreateSeqDense()
251189665df3SBarry Smith 
25120bad9183SKris Buschelman M*/
25130bad9183SKris Buschelman 
25144a2ae208SSatish Balay #undef __FUNCT__
25154a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
25168cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2517273d9f13SBarry Smith {
2518273d9f13SBarry Smith   Mat_SeqDense   *b;
2519dfbe8321SBarry Smith   PetscErrorCode ierr;
25207c334f02SBarry Smith   PetscMPIInt    size;
2521273d9f13SBarry Smith 
2522273d9f13SBarry Smith   PetscFunctionBegin;
2523ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2524e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
252555659b69SBarry Smith 
2526b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2527549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
252844cd7ae7SLois Curfman McInnes   B->data = (void*)b;
252918f449edSLois Curfman McInnes 
253044cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2531273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2532273d9f13SBarry Smith   b->v           = 0;
253321a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
25344e220ebcSLois Curfman McInnes 
2535bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2536bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2537bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
25388baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
25398baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
25408baccfbdSHong Zhang #endif
2541bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2542bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2543bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2544bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2545abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
25463bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
25473bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
25483bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
254917667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
25503a40ed3dSBarry Smith   PetscFunctionReturn(0);
2551289bc588SBarry Smith }
2552