xref: /petsc/src/mat/impls/dense/seq/dense.c (revision a13144ff18571e4eba77009e67d408a0ec7ad029)
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 {
104*a13144ffSStefano 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;
110*a13144ffSStefano Zampini   PetscBool      isseqdense;
111b49cda9fSStefano Zampini 
112b49cda9fSStefano Zampini   PetscFunctionBegin;
113*a13144ffSStefano Zampini   if (reuse == MAT_REUSE_MATRIX) {
114*a13144ffSStefano Zampini     ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr);
115*a13144ffSStefano Zampini     if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type);
116*a13144ffSStefano Zampini   }
117*a13144ffSStefano 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);
123*a13144ffSStefano Zampini   } else {
124*a13144ffSStefano Zampini     b    = (Mat_SeqDense*)((*newmat)->data);
125*a13144ffSStefano Zampini     ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
126*a13144ffSStefano 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) {
138*a13144ffSStefano Zampini     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
139*a13144ffSStefano Zampini     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
14028be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
141b49cda9fSStefano Zampini   } else {
142*a13144ffSStefano Zampini     if (B) *newmat = B;
143*a13144ffSStefano Zampini     ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
144*a13144ffSStefano 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;
1362e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* 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 {
1502d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1503329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1504289bc588SBarry Smith       }
1505a5ce6ee0Svictorle     }
15068f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1507dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15083a40ed3dSBarry Smith   } else if (type == NORM_1) {
1509064f8208SBarry Smith     *nrm = 0.0;
1510d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
15111b807ce4Svictorle       v   = mat->v + j*mat->lda;
1512289bc588SBarry Smith       sum = 0.0;
1513d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
151433a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1515289bc588SBarry Smith       }
1516064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1517289bc588SBarry Smith     }
1518eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
15193a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1520064f8208SBarry Smith     *nrm = 0.0;
1521d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1522289bc588SBarry Smith       v   = mat->v + j;
1523289bc588SBarry Smith       sum = 0.0;
1524d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
15251b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1526289bc588SBarry Smith       }
1527064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1528289bc588SBarry Smith     }
1529eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1530e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
15313a40ed3dSBarry Smith   PetscFunctionReturn(0);
1532289bc588SBarry Smith }
1533289bc588SBarry Smith 
15344a2ae208SSatish Balay #undef __FUNCT__
15354a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1536e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1537289bc588SBarry Smith {
1538c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
153963ba0a88SBarry Smith   PetscErrorCode ierr;
154067e560aaSBarry Smith 
15413a40ed3dSBarry Smith   PetscFunctionBegin;
1542b5a2b587SKris Buschelman   switch (op) {
1543b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
15444e0d8c25SBarry Smith     aij->roworiented = flg;
1545b5a2b587SKris Buschelman     break;
1546512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1547b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
15483971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
15494e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
155013fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1551b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1552b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
15535021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
15545021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
15555021d80fSJed Brown     break;
15565021d80fSJed Brown   case MAT_SPD:
155777e54ba9SKris Buschelman   case MAT_SYMMETRIC:
155877e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
15599a4540c5SBarry Smith   case MAT_HERMITIAN:
15609a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
15615021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
156277e54ba9SKris Buschelman     break;
1563b5a2b587SKris Buschelman   default:
1564e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
15653a40ed3dSBarry Smith   }
15663a40ed3dSBarry Smith   PetscFunctionReturn(0);
1567289bc588SBarry Smith }
1568289bc588SBarry Smith 
15694a2ae208SSatish Balay #undef __FUNCT__
15704a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1571e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15726f0a148fSBarry Smith {
1573ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15746849ba73SBarry Smith   PetscErrorCode ierr;
1575d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15763a40ed3dSBarry Smith 
15773a40ed3dSBarry Smith   PetscFunctionBegin;
1578a5ce6ee0Svictorle   if (lda>m) {
1579d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1580a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1581a5ce6ee0Svictorle     }
1582a5ce6ee0Svictorle   } else {
1583d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1584a5ce6ee0Svictorle   }
15853a40ed3dSBarry Smith   PetscFunctionReturn(0);
15866f0a148fSBarry Smith }
15876f0a148fSBarry Smith 
15884a2ae208SSatish Balay #undef __FUNCT__
15894a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1590e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15916f0a148fSBarry Smith {
159297b48c8fSBarry Smith   PetscErrorCode    ierr;
1593ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1594b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
159597b48c8fSBarry Smith   PetscScalar       *slot,*bb;
159697b48c8fSBarry Smith   const PetscScalar *xx;
159755659b69SBarry Smith 
15983a40ed3dSBarry Smith   PetscFunctionBegin;
1599b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1600b9679d65SBarry Smith   for (i=0; i<N; i++) {
1601b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1602b9679d65SBarry 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);
1603b9679d65SBarry Smith   }
1604b9679d65SBarry Smith #endif
1605b9679d65SBarry Smith 
160697b48c8fSBarry Smith   /* fix right hand side if needed */
160797b48c8fSBarry Smith   if (x && b) {
160897b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
160997b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
16102205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
161197b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
161297b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
161397b48c8fSBarry Smith   }
161497b48c8fSBarry Smith 
16156f0a148fSBarry Smith   for (i=0; i<N; i++) {
16166f0a148fSBarry Smith     slot = l->v + rows[i];
1617b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
16186f0a148fSBarry Smith   }
1619f4df32b1SMatthew Knepley   if (diag != 0.0) {
1620b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
16216f0a148fSBarry Smith     for (i=0; i<N; i++) {
1622b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1623f4df32b1SMatthew Knepley       *slot = diag;
16246f0a148fSBarry Smith     }
16256f0a148fSBarry Smith   }
16263a40ed3dSBarry Smith   PetscFunctionReturn(0);
16276f0a148fSBarry Smith }
1628557bce09SLois Curfman McInnes 
16294a2ae208SSatish Balay #undef __FUNCT__
16308c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1631e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
163264e87e97SBarry Smith {
1633c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
16343a40ed3dSBarry Smith 
16353a40ed3dSBarry Smith   PetscFunctionBegin;
1636e32f2f54SBarry 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");
163764e87e97SBarry Smith   *array = mat->v;
16383a40ed3dSBarry Smith   PetscFunctionReturn(0);
163964e87e97SBarry Smith }
16400754003eSLois Curfman McInnes 
16414a2ae208SSatish Balay #undef __FUNCT__
16428c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1643e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1644ff14e315SSatish Balay {
16453a40ed3dSBarry Smith   PetscFunctionBegin;
164609b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
16473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1648ff14e315SSatish Balay }
16490754003eSLois Curfman McInnes 
16504a2ae208SSatish Balay #undef __FUNCT__
16518c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1652dec5eb66SMatthew G Knepley /*@C
16538c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
165473a71a0fSBarry Smith 
165573a71a0fSBarry Smith    Not Collective
165673a71a0fSBarry Smith 
165773a71a0fSBarry Smith    Input Parameter:
1658579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
165973a71a0fSBarry Smith 
166073a71a0fSBarry Smith    Output Parameter:
166173a71a0fSBarry Smith .   array - pointer to the data
166273a71a0fSBarry Smith 
166373a71a0fSBarry Smith    Level: intermediate
166473a71a0fSBarry Smith 
16658c778c55SBarry Smith .seealso: MatDenseRestoreArray()
166673a71a0fSBarry Smith @*/
16678c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
166873a71a0fSBarry Smith {
166973a71a0fSBarry Smith   PetscErrorCode ierr;
167073a71a0fSBarry Smith 
167173a71a0fSBarry Smith   PetscFunctionBegin;
16728c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
167373a71a0fSBarry Smith   PetscFunctionReturn(0);
167473a71a0fSBarry Smith }
167573a71a0fSBarry Smith 
167673a71a0fSBarry Smith #undef __FUNCT__
16778c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1678dec5eb66SMatthew G Knepley /*@C
1679579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
168073a71a0fSBarry Smith 
168173a71a0fSBarry Smith    Not Collective
168273a71a0fSBarry Smith 
168373a71a0fSBarry Smith    Input Parameters:
1684579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
168573a71a0fSBarry Smith .  array - pointer to the data
168673a71a0fSBarry Smith 
168773a71a0fSBarry Smith    Level: intermediate
168873a71a0fSBarry Smith 
16898c778c55SBarry Smith .seealso: MatDenseGetArray()
169073a71a0fSBarry Smith @*/
16918c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
169273a71a0fSBarry Smith {
169373a71a0fSBarry Smith   PetscErrorCode ierr;
169473a71a0fSBarry Smith 
169573a71a0fSBarry Smith   PetscFunctionBegin;
16968c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
169773a71a0fSBarry Smith   PetscFunctionReturn(0);
169873a71a0fSBarry Smith }
169973a71a0fSBarry Smith 
170073a71a0fSBarry Smith #undef __FUNCT__
17014a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
170213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
17030754003eSLois Curfman McInnes {
1704c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
17056849ba73SBarry Smith   PetscErrorCode ierr;
17065d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
17075d0c19d7SBarry Smith   const PetscInt *irow,*icol;
170887828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
17090754003eSLois Curfman McInnes   Mat            newmat;
17100754003eSLois Curfman McInnes 
17113a40ed3dSBarry Smith   PetscFunctionBegin;
171278b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
171378b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1714e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1715e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
17160754003eSLois Curfman McInnes 
1717182d2002SSatish Balay   /* Check submatrixcall */
1718182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
171913f74950SBarry Smith     PetscInt n_cols,n_rows;
1720182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
172121a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1722f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1723c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
172421a2c019SBarry Smith     }
1725182d2002SSatish Balay     newmat = *B;
1726182d2002SSatish Balay   } else {
17270754003eSLois Curfman McInnes     /* Create and fill new matrix */
1728ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1729f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
17307adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
17310298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1732182d2002SSatish Balay   }
1733182d2002SSatish Balay 
1734182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1735182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1736182d2002SSatish Balay 
1737182d2002SSatish Balay   for (i=0; i<ncols; i++) {
17386de62eeeSBarry Smith     av = v + mat->lda*icol[i];
17392205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
17400754003eSLois Curfman McInnes   }
1741182d2002SSatish Balay 
1742182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
17436d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17446d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
17450754003eSLois Curfman McInnes 
17460754003eSLois Curfman McInnes   /* Free work space */
174778b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
174878b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1749182d2002SSatish Balay   *B   = newmat;
17503a40ed3dSBarry Smith   PetscFunctionReturn(0);
17510754003eSLois Curfman McInnes }
17520754003eSLois Curfman McInnes 
17534a2ae208SSatish Balay #undef __FUNCT__
17544a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1755e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1756905e6a2fSBarry Smith {
17576849ba73SBarry Smith   PetscErrorCode ierr;
175813f74950SBarry Smith   PetscInt       i;
1759905e6a2fSBarry Smith 
17603a40ed3dSBarry Smith   PetscFunctionBegin;
1761905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1762854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1763905e6a2fSBarry Smith   }
1764905e6a2fSBarry Smith 
1765905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17666a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1767905e6a2fSBarry Smith   }
17683a40ed3dSBarry Smith   PetscFunctionReturn(0);
1769905e6a2fSBarry Smith }
1770905e6a2fSBarry Smith 
17714a2ae208SSatish Balay #undef __FUNCT__
1772c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1773e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1774c0aa2d19SHong Zhang {
1775c0aa2d19SHong Zhang   PetscFunctionBegin;
1776c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1777c0aa2d19SHong Zhang }
1778c0aa2d19SHong Zhang 
1779c0aa2d19SHong Zhang #undef __FUNCT__
1780c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1781e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1782c0aa2d19SHong Zhang {
1783c0aa2d19SHong Zhang   PetscFunctionBegin;
1784c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1785c0aa2d19SHong Zhang }
1786c0aa2d19SHong Zhang 
1787c0aa2d19SHong Zhang #undef __FUNCT__
17884a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1789e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17904b0e389bSBarry Smith {
17914b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17926849ba73SBarry Smith   PetscErrorCode ierr;
1793d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17943a40ed3dSBarry Smith 
17953a40ed3dSBarry Smith   PetscFunctionBegin;
179633f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
179733f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1798cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17993a40ed3dSBarry Smith     PetscFunctionReturn(0);
18003a40ed3dSBarry Smith   }
1801e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1802a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
18030dbb7854Svictorle     for (j=0; j<n; j++) {
1804a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1805a5ce6ee0Svictorle     }
1806a5ce6ee0Svictorle   } else {
1807d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1808a5ce6ee0Svictorle   }
1809273d9f13SBarry Smith   PetscFunctionReturn(0);
1810273d9f13SBarry Smith }
1811273d9f13SBarry Smith 
18124a2ae208SSatish Balay #undef __FUNCT__
18134994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1814e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1815273d9f13SBarry Smith {
1816dfbe8321SBarry Smith   PetscErrorCode ierr;
1817273d9f13SBarry Smith 
1818273d9f13SBarry Smith   PetscFunctionBegin;
1819273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
18203a40ed3dSBarry Smith   PetscFunctionReturn(0);
18214b0e389bSBarry Smith }
18224b0e389bSBarry Smith 
1823284134d9SBarry Smith #undef __FUNCT__
1824ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1825ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1826ba337c44SJed Brown {
1827ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1828ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1829ba337c44SJed Brown   PetscScalar  *aa = a->v;
1830ba337c44SJed Brown 
1831ba337c44SJed Brown   PetscFunctionBegin;
1832ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1833ba337c44SJed Brown   PetscFunctionReturn(0);
1834ba337c44SJed Brown }
1835ba337c44SJed Brown 
1836ba337c44SJed Brown #undef __FUNCT__
1837ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1838ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1839ba337c44SJed Brown {
1840ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1841ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1842ba337c44SJed Brown   PetscScalar  *aa = a->v;
1843ba337c44SJed Brown 
1844ba337c44SJed Brown   PetscFunctionBegin;
1845ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1846ba337c44SJed Brown   PetscFunctionReturn(0);
1847ba337c44SJed Brown }
1848ba337c44SJed Brown 
1849ba337c44SJed Brown #undef __FUNCT__
1850ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1851ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1852ba337c44SJed Brown {
1853ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1854ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1855ba337c44SJed Brown   PetscScalar  *aa = a->v;
1856ba337c44SJed Brown 
1857ba337c44SJed Brown   PetscFunctionBegin;
1858ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1859ba337c44SJed Brown   PetscFunctionReturn(0);
1860ba337c44SJed Brown }
1861284134d9SBarry Smith 
1862a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1863a9fe9ddaSSatish Balay #undef __FUNCT__
1864a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1865150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1866a9fe9ddaSSatish Balay {
1867a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1868a9fe9ddaSSatish Balay 
1869a9fe9ddaSSatish Balay   PetscFunctionBegin;
1870a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18713ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1872a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18733ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1874a9fe9ddaSSatish Balay   }
18753ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1876a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18773ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1878a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1879a9fe9ddaSSatish Balay }
1880a9fe9ddaSSatish Balay 
1881a9fe9ddaSSatish Balay #undef __FUNCT__
1882a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1883a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1884a9fe9ddaSSatish Balay {
1885ee16a9a1SHong Zhang   PetscErrorCode ierr;
1886d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1887ee16a9a1SHong Zhang   Mat            Cmat;
1888a9fe9ddaSSatish Balay 
1889ee16a9a1SHong Zhang   PetscFunctionBegin;
1890e32f2f54SBarry 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);
1891ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1892ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1893ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18940298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1895d73949e8SHong Zhang 
1896ee16a9a1SHong Zhang   *C = Cmat;
1897ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1898ee16a9a1SHong Zhang }
1899a9fe9ddaSSatish Balay 
190098a3b096SSatish Balay #undef __FUNCT__
1901a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1902a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1903a9fe9ddaSSatish Balay {
1904a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1905a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1906a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19070805154bSBarry Smith   PetscBLASInt   m,n,k;
1908a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1909c5df96a5SBarry Smith   PetscErrorCode ierr;
1910fd4e9aacSBarry Smith   PetscBool      flg;
1911a9fe9ddaSSatish Balay 
1912a9fe9ddaSSatish Balay   PetscFunctionBegin;
1913fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1914fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1915fd4e9aacSBarry Smith 
1916fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1917fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1918fd4e9aacSBarry Smith   if (flg) {
1919fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1920fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1921fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1922fd4e9aacSBarry Smith   }
1923fd4e9aacSBarry Smith 
1924fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1925fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1926c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1927c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1928c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
19295ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1930a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1931a9fe9ddaSSatish Balay }
1932a9fe9ddaSSatish Balay 
1933a9fe9ddaSSatish Balay #undef __FUNCT__
193475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
193575648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1936a9fe9ddaSSatish Balay {
1937a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1938a9fe9ddaSSatish Balay 
1939a9fe9ddaSSatish Balay   PetscFunctionBegin;
1940a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
19413ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
194275648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
19433ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1944a9fe9ddaSSatish Balay   }
19453ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
194675648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
19473ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1948a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1949a9fe9ddaSSatish Balay }
1950a9fe9ddaSSatish Balay 
1951a9fe9ddaSSatish Balay #undef __FUNCT__
195275648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
195375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1954a9fe9ddaSSatish Balay {
1955ee16a9a1SHong Zhang   PetscErrorCode ierr;
1956d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1957ee16a9a1SHong Zhang   Mat            Cmat;
1958a9fe9ddaSSatish Balay 
1959ee16a9a1SHong Zhang   PetscFunctionBegin;
1960e32f2f54SBarry 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);
1961ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1962ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1963ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
19640298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
19652205254eSKarl Rupp 
1966ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19672205254eSKarl Rupp 
1968ee16a9a1SHong Zhang   *C = Cmat;
1969ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1970ee16a9a1SHong Zhang }
1971a9fe9ddaSSatish Balay 
1972a9fe9ddaSSatish Balay #undef __FUNCT__
197375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
197475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1975a9fe9ddaSSatish Balay {
1976a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1977a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1978a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19790805154bSBarry Smith   PetscBLASInt   m,n,k;
1980a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1981c5df96a5SBarry Smith   PetscErrorCode ierr;
1982a9fe9ddaSSatish Balay 
1983a9fe9ddaSSatish Balay   PetscFunctionBegin;
1984c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1985c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1986c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19872fbe02b9SBarry Smith   /*
19882fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19892fbe02b9SBarry Smith   */
19905ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1991a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1992a9fe9ddaSSatish Balay }
1993985db425SBarry Smith 
1994985db425SBarry Smith #undef __FUNCT__
1995985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1996e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1997985db425SBarry Smith {
1998985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1999985db425SBarry Smith   PetscErrorCode ierr;
2000d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2001985db425SBarry Smith   PetscScalar    *x;
2002985db425SBarry Smith   MatScalar      *aa = a->v;
2003985db425SBarry Smith 
2004985db425SBarry Smith   PetscFunctionBegin;
2005e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2006985db425SBarry Smith 
2007985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2008985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2009985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2010e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2011985db425SBarry Smith   for (i=0; i<m; i++) {
2012985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2013985db425SBarry Smith     for (j=1; j<n; j++) {
2014985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2015985db425SBarry Smith     }
2016985db425SBarry Smith   }
2017985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2018985db425SBarry Smith   PetscFunctionReturn(0);
2019985db425SBarry Smith }
2020985db425SBarry Smith 
2021985db425SBarry Smith #undef __FUNCT__
2022985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
2023e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
2024985db425SBarry Smith {
2025985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2026985db425SBarry Smith   PetscErrorCode ierr;
2027d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2028985db425SBarry Smith   PetscScalar    *x;
2029985db425SBarry Smith   PetscReal      atmp;
2030985db425SBarry Smith   MatScalar      *aa = a->v;
2031985db425SBarry Smith 
2032985db425SBarry Smith   PetscFunctionBegin;
2033e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2034985db425SBarry Smith 
2035985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2036985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2037985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2038e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2039985db425SBarry Smith   for (i=0; i<m; i++) {
20409189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
2041985db425SBarry Smith     for (j=1; j<n; j++) {
2042985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
2043985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
2044985db425SBarry Smith     }
2045985db425SBarry Smith   }
2046985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2047985db425SBarry Smith   PetscFunctionReturn(0);
2048985db425SBarry Smith }
2049985db425SBarry Smith 
2050985db425SBarry Smith #undef __FUNCT__
2051985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
2052e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
2053985db425SBarry Smith {
2054985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
2055985db425SBarry Smith   PetscErrorCode ierr;
2056d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
2057985db425SBarry Smith   PetscScalar    *x;
2058985db425SBarry Smith   MatScalar      *aa = a->v;
2059985db425SBarry Smith 
2060985db425SBarry Smith   PetscFunctionBegin;
2061e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
2062985db425SBarry Smith 
2063985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
2064985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2065985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2066e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2067985db425SBarry Smith   for (i=0; i<m; i++) {
2068985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2069985db425SBarry Smith     for (j=1; j<n; j++) {
2070985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2071985db425SBarry Smith     }
2072985db425SBarry Smith   }
2073985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2074985db425SBarry Smith   PetscFunctionReturn(0);
2075985db425SBarry Smith }
2076985db425SBarry Smith 
20778d0534beSBarry Smith #undef __FUNCT__
20788d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2079e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20808d0534beSBarry Smith {
20818d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20828d0534beSBarry Smith   PetscErrorCode ierr;
20838d0534beSBarry Smith   PetscScalar    *x;
20848d0534beSBarry Smith 
20858d0534beSBarry Smith   PetscFunctionBegin;
2086e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20878d0534beSBarry Smith 
20888d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2089d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20908d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20918d0534beSBarry Smith   PetscFunctionReturn(0);
20928d0534beSBarry Smith }
20938d0534beSBarry Smith 
20940716a85fSBarry Smith 
20950716a85fSBarry Smith #undef __FUNCT__
20960716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20970716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20980716a85fSBarry Smith {
20990716a85fSBarry Smith   PetscErrorCode ierr;
21000716a85fSBarry Smith   PetscInt       i,j,m,n;
21010716a85fSBarry Smith   PetscScalar    *a;
21020716a85fSBarry Smith 
21030716a85fSBarry Smith   PetscFunctionBegin;
21040716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
21050716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
21068c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
21070716a85fSBarry Smith   if (type == NORM_2) {
21080716a85fSBarry Smith     for (i=0; i<n; i++) {
21090716a85fSBarry Smith       for (j=0; j<m; j++) {
21100716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
21110716a85fSBarry Smith       }
21120716a85fSBarry Smith       a += m;
21130716a85fSBarry Smith     }
21140716a85fSBarry Smith   } else if (type == NORM_1) {
21150716a85fSBarry Smith     for (i=0; i<n; i++) {
21160716a85fSBarry Smith       for (j=0; j<m; j++) {
21170716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
21180716a85fSBarry Smith       }
21190716a85fSBarry Smith       a += m;
21200716a85fSBarry Smith     }
21210716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
21220716a85fSBarry Smith     for (i=0; i<n; i++) {
21230716a85fSBarry Smith       for (j=0; j<m; j++) {
21240716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
21250716a85fSBarry Smith       }
21260716a85fSBarry Smith       a += m;
21270716a85fSBarry Smith     }
2128ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
21298c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
21300716a85fSBarry Smith   if (type == NORM_2) {
21318f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
21320716a85fSBarry Smith   }
21330716a85fSBarry Smith   PetscFunctionReturn(0);
21340716a85fSBarry Smith }
21350716a85fSBarry Smith 
213673a71a0fSBarry Smith #undef __FUNCT__
213773a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
213873a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
213973a71a0fSBarry Smith {
214073a71a0fSBarry Smith   PetscErrorCode ierr;
214173a71a0fSBarry Smith   PetscScalar    *a;
214273a71a0fSBarry Smith   PetscInt       m,n,i;
214373a71a0fSBarry Smith 
214473a71a0fSBarry Smith   PetscFunctionBegin;
214573a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
21468c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
214773a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
214873a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
214973a71a0fSBarry Smith   }
21508c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
215173a71a0fSBarry Smith   PetscFunctionReturn(0);
215273a71a0fSBarry Smith }
215373a71a0fSBarry Smith 
21543b49f96aSBarry Smith #undef __FUNCT__
21553b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
21563b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
21573b49f96aSBarry Smith {
21583b49f96aSBarry Smith   PetscFunctionBegin;
21593b49f96aSBarry Smith   *missing = PETSC_FALSE;
21603b49f96aSBarry Smith   PetscFunctionReturn(0);
21613b49f96aSBarry Smith }
216273a71a0fSBarry Smith 
2163abc3b08eSStefano Zampini 
2164289bc588SBarry Smith /* -------------------------------------------------------------------*/
2165a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2166905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2167905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2168905e6a2fSBarry Smith                                         MatMult_SeqDense,
216997304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21707c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21717c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2172db4efbfdSBarry Smith                                         0,
2173db4efbfdSBarry Smith                                         0,
2174db4efbfdSBarry Smith                                         0,
2175db4efbfdSBarry Smith                                 /* 10*/ 0,
2176905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2177905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
217841f059aeSBarry Smith                                         MatSOR_SeqDense,
2179ec8511deSBarry Smith                                         MatTranspose_SeqDense,
218097304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2181905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2182905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2183905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2184905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2185c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2186c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2187905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2188905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2189d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2190db4efbfdSBarry Smith                                         0,
2191db4efbfdSBarry Smith                                         0,
2192db4efbfdSBarry Smith                                         0,
2193db4efbfdSBarry Smith                                         0,
21944994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2195273d9f13SBarry Smith                                         0,
2196905e6a2fSBarry Smith                                         0,
219773a71a0fSBarry Smith                                         0,
219873a71a0fSBarry Smith                                         0,
2199d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2200a5ae1ecdSBarry Smith                                         0,
2201a5ae1ecdSBarry Smith                                         0,
2202a5ae1ecdSBarry Smith                                         0,
2203a5ae1ecdSBarry Smith                                         0,
2204d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2205a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2206a5ae1ecdSBarry Smith                                         0,
22074b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2208a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2209d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2210a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
22117d68702bSBarry Smith                                         MatShift_Basic,
2212a5ae1ecdSBarry Smith                                         0,
22133f49a652SStefano Zampini                                         MatZeroRowsColumns_SeqDense,
221473a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2215a5ae1ecdSBarry Smith                                         0,
2216a5ae1ecdSBarry Smith                                         0,
2217a5ae1ecdSBarry Smith                                         0,
2218a5ae1ecdSBarry Smith                                         0,
2219d519adbfSMatthew Knepley                                 /* 54*/ 0,
2220a5ae1ecdSBarry Smith                                         0,
2221a5ae1ecdSBarry Smith                                         0,
2222a5ae1ecdSBarry Smith                                         0,
2223a5ae1ecdSBarry Smith                                         0,
2224d519adbfSMatthew Knepley                                 /* 59*/ 0,
2225e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2226e03a110bSBarry Smith                                         MatView_SeqDense,
2227357abbc8SBarry Smith                                         0,
222897304618SKris Buschelman                                         0,
2229d519adbfSMatthew Knepley                                 /* 64*/ 0,
223097304618SKris Buschelman                                         0,
223197304618SKris Buschelman                                         0,
223297304618SKris Buschelman                                         0,
223397304618SKris Buschelman                                         0,
2234d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
223597304618SKris Buschelman                                         0,
223697304618SKris Buschelman                                         0,
223797304618SKris Buschelman                                         0,
223897304618SKris Buschelman                                         0,
2239d519adbfSMatthew Knepley                                 /* 74*/ 0,
224097304618SKris Buschelman                                         0,
224197304618SKris Buschelman                                         0,
224297304618SKris Buschelman                                         0,
224397304618SKris Buschelman                                         0,
2244d519adbfSMatthew Knepley                                 /* 79*/ 0,
224597304618SKris Buschelman                                         0,
224697304618SKris Buschelman                                         0,
224797304618SKris Buschelman                                         0,
22485bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2249865e5f61SKris Buschelman                                         0,
22501cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2251865e5f61SKris Buschelman                                         0,
2252865e5f61SKris Buschelman                                         0,
2253865e5f61SKris Buschelman                                         0,
2254d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2255a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2256a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2257abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2258abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2259abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
22605df89d91SHong Zhang                                         0,
22615df89d91SHong Zhang                                         0,
22625df89d91SHong Zhang                                         0,
2263284134d9SBarry Smith                                         0,
2264d519adbfSMatthew Knepley                                 /* 99*/ 0,
2265284134d9SBarry Smith                                         0,
2266284134d9SBarry Smith                                         0,
2267ba337c44SJed Brown                                         MatConjugate_SeqDense,
2268f73d5cc4SBarry Smith                                         0,
2269ba337c44SJed Brown                                 /*104*/ 0,
2270ba337c44SJed Brown                                         MatRealPart_SeqDense,
2271ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2272985db425SBarry Smith                                         0,
2273985db425SBarry Smith                                         0,
227485e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2275985db425SBarry Smith                                         0,
22768d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2277aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22783b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2279aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2280aabbc4fbSShri Abhyankar                                         0,
2281aabbc4fbSShri Abhyankar                                         0,
2282aabbc4fbSShri Abhyankar                                         0,
2283aabbc4fbSShri Abhyankar                                         0,
2284aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2285aabbc4fbSShri Abhyankar                                         0,
2286aabbc4fbSShri Abhyankar                                         0,
22870716a85fSBarry Smith                                         0,
22880716a85fSBarry Smith                                         0,
22890716a85fSBarry Smith                                 /*124*/ 0,
22905df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22915df89d91SHong Zhang                                         0,
22925df89d91SHong Zhang                                         0,
22935df89d91SHong Zhang                                         0,
22945df89d91SHong Zhang                                 /*129*/ 0,
229575648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
229675648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
229775648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22983964eb88SJed Brown                                         0,
22993964eb88SJed Brown                                 /*134*/ 0,
23003964eb88SJed Brown                                         0,
23013964eb88SJed Brown                                         0,
23023964eb88SJed Brown                                         0,
23033964eb88SJed Brown                                         0,
23043964eb88SJed Brown                                 /*139*/ 0,
2305f9426fe0SMark Adams                                         0,
23063964eb88SJed Brown                                         0
2307985db425SBarry Smith };
230890ace30eSBarry Smith 
23094a2ae208SSatish Balay #undef __FUNCT__
23104a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
23114b828684SBarry Smith /*@C
2312fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2313d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2314d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2315289bc588SBarry Smith 
2316db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2317db81eaa0SLois Curfman McInnes 
231820563c6bSBarry Smith    Input Parameters:
2319db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
23200c775827SLois Curfman McInnes .  m - number of rows
232118f449edSLois Curfman McInnes .  n - number of columns
23220298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2323dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
232420563c6bSBarry Smith 
232520563c6bSBarry Smith    Output Parameter:
232644cd7ae7SLois Curfman McInnes .  A - the matrix
232720563c6bSBarry Smith 
2328b259b22eSLois Curfman McInnes    Notes:
232918f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
233018f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
23310298fd71SBarry Smith    set data=NULL.
233218f449edSLois Curfman McInnes 
2333027ccd11SLois Curfman McInnes    Level: intermediate
2334027ccd11SLois Curfman McInnes 
2335dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2336d65003e9SLois Curfman McInnes 
233769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
233820563c6bSBarry Smith @*/
23397087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2340289bc588SBarry Smith {
2341dfbe8321SBarry Smith   PetscErrorCode ierr;
23423b2fbd54SBarry Smith 
23433a40ed3dSBarry Smith   PetscFunctionBegin;
2344f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2345f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2346273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2347273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2348273d9f13SBarry Smith   PetscFunctionReturn(0);
2349273d9f13SBarry Smith }
2350273d9f13SBarry Smith 
23514a2ae208SSatish Balay #undef __FUNCT__
2352afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2353273d9f13SBarry Smith /*@C
2354273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2355273d9f13SBarry Smith 
2356273d9f13SBarry Smith    Collective on MPI_Comm
2357273d9f13SBarry Smith 
2358273d9f13SBarry Smith    Input Parameters:
23591c4f3114SJed Brown +  B - the matrix
23600298fd71SBarry Smith -  data - the array (or NULL)
2361273d9f13SBarry Smith 
2362273d9f13SBarry Smith    Notes:
2363273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2364273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2365284134d9SBarry Smith    need not call this routine.
2366273d9f13SBarry Smith 
2367273d9f13SBarry Smith    Level: intermediate
2368273d9f13SBarry Smith 
2369273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2370273d9f13SBarry Smith 
237169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2372867c911aSBarry Smith 
2373273d9f13SBarry Smith @*/
23747087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2375273d9f13SBarry Smith {
23764ac538c5SBarry Smith   PetscErrorCode ierr;
2377a23d5eceSKris Buschelman 
2378a23d5eceSKris Buschelman   PetscFunctionBegin;
23794ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2380a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2381a23d5eceSKris Buschelman }
2382a23d5eceSKris Buschelman 
2383a23d5eceSKris Buschelman #undef __FUNCT__
2384afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23857087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2386a23d5eceSKris Buschelman {
2387273d9f13SBarry Smith   Mat_SeqDense   *b;
2388dfbe8321SBarry Smith   PetscErrorCode ierr;
2389273d9f13SBarry Smith 
2390273d9f13SBarry Smith   PetscFunctionBegin;
2391273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2392a868139aSShri Abhyankar 
239334ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
239434ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
239534ef9618SShri Abhyankar 
2396273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
239786d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
239886d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
239986d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
240086d161a7SShri Abhyankar 
24019e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
24029e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2403e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
24043bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
24052205254eSKarl Rupp 
24069e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2407273d9f13SBarry Smith   } else { /* user-allocated storage */
24089e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2409273d9f13SBarry Smith     b->v          = data;
2410273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2411273d9f13SBarry Smith   }
24120450473dSBarry Smith   B->assembled = PETSC_TRUE;
2413273d9f13SBarry Smith   PetscFunctionReturn(0);
2414273d9f13SBarry Smith }
2415273d9f13SBarry Smith 
241665b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24171b807ce4Svictorle #undef __FUNCT__
24188baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
2419cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
24208baccfbdSHong Zhang {
2421d77f618aSHong Zhang   Mat            mat_elemental;
2422d77f618aSHong Zhang   PetscErrorCode ierr;
2423d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2424d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2425d77f618aSHong Zhang 
24268baccfbdSHong Zhang   PetscFunctionBegin;
2427d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2428d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2429d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2430d77f618aSHong Zhang   k = 0;
2431d77f618aSHong Zhang   for (j=0; j<N; j++) {
2432d77f618aSHong Zhang     cols[j] = j;
2433d77f618aSHong Zhang     for (i=0; i<M; i++) {
2434d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2435d77f618aSHong Zhang     }
2436d77f618aSHong Zhang   }
2437d77f618aSHong Zhang   for (i=0; i<M; i++) {
2438d77f618aSHong Zhang     rows[i] = i;
2439d77f618aSHong Zhang   }
2440d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2441d77f618aSHong Zhang 
2442d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2443d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2444d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2445d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2446d77f618aSHong Zhang 
2447d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2448d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2449d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2450d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2451d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2452d77f618aSHong Zhang 
2453511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
245428be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2455d77f618aSHong Zhang   } else {
2456d77f618aSHong Zhang     *newmat = mat_elemental;
2457d77f618aSHong Zhang   }
24588baccfbdSHong Zhang   PetscFunctionReturn(0);
24598baccfbdSHong Zhang }
246065b80a83SHong Zhang #endif
24618baccfbdSHong Zhang 
24628baccfbdSHong Zhang #undef __FUNCT__
24631b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
24641b807ce4Svictorle /*@C
24651b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24661b807ce4Svictorle 
24671b807ce4Svictorle   Input parameter:
24681b807ce4Svictorle + A - the matrix
24691b807ce4Svictorle - lda - the leading dimension
24701b807ce4Svictorle 
24711b807ce4Svictorle   Notes:
2472867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24731b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24741b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24751b807ce4Svictorle 
24761b807ce4Svictorle   Level: intermediate
24771b807ce4Svictorle 
24781b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24791b807ce4Svictorle 
2480284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2481867c911aSBarry Smith 
24821b807ce4Svictorle @*/
24837087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24841b807ce4Svictorle {
24851b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
248621a2c019SBarry Smith 
24871b807ce4Svictorle   PetscFunctionBegin;
2488e32f2f54SBarry 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);
24891b807ce4Svictorle   b->lda       = lda;
249021a2c019SBarry Smith   b->changelda = PETSC_FALSE;
249121a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24921b807ce4Svictorle   PetscFunctionReturn(0);
24931b807ce4Svictorle }
24941b807ce4Svictorle 
24950bad9183SKris Buschelman /*MC
2496fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24970bad9183SKris Buschelman 
24980bad9183SKris Buschelman    Options Database Keys:
24990bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
25000bad9183SKris Buschelman 
25010bad9183SKris Buschelman   Level: beginner
25020bad9183SKris Buschelman 
250389665df3SBarry Smith .seealso: MatCreateSeqDense()
250489665df3SBarry Smith 
25050bad9183SKris Buschelman M*/
25060bad9183SKris Buschelman 
25074a2ae208SSatish Balay #undef __FUNCT__
25084a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
25098cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2510273d9f13SBarry Smith {
2511273d9f13SBarry Smith   Mat_SeqDense   *b;
2512dfbe8321SBarry Smith   PetscErrorCode ierr;
25137c334f02SBarry Smith   PetscMPIInt    size;
2514273d9f13SBarry Smith 
2515273d9f13SBarry Smith   PetscFunctionBegin;
2516ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2517e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
251855659b69SBarry Smith 
2519b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2520549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
252144cd7ae7SLois Curfman McInnes   B->data = (void*)b;
252218f449edSLois Curfman McInnes 
252344cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2524273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2525273d9f13SBarry Smith   b->v           = 0;
252621a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
25274e220ebcSLois Curfman McInnes 
2528bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2529bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2530bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
25318baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
25328baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
25338baccfbdSHong Zhang #endif
2534bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2535bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2536bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2537bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2538abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
25393bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
25403bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
25413bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
254217667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
25433a40ed3dSBarry Smith   PetscFunctionReturn(0);
2544289bc588SBarry Smith }
2545